{"version":3,"sources":["vendor/ember-cli/vendor-prefix.js","vendor/loader/loader.js","vendor/jquery/jquery.js","license.js","loader.js","@ember/-internals/bootstrap/index.js","@ember/-internals/browser-environment/index.js","@ember/-internals/container/index.js","@ember/-internals/environment/index.js","@ember/-internals/error-handling/index.js","@ember/-internals/glimmer/index.js","@ember/-internals/meta/index.js","@ember/-internals/meta/lib/meta.js","@ember/-internals/metal/index.js","@ember/-internals/overrides/index.js","@ember/-internals/owner/index.js","@ember/-internals/routing/index.js","@ember/-internals/runtime/index.js","@ember/-internals/runtime/lib/ext/rsvp.js","@ember/-internals/runtime/lib/mixins/-proxy.js","@ember/-internals/runtime/lib/mixins/action_handler.js","@ember/-internals/runtime/lib/mixins/comparable.js","@ember/-internals/runtime/lib/mixins/container_proxy.js","@ember/-internals/runtime/lib/mixins/registry_proxy.js","@ember/-internals/runtime/lib/mixins/target_action_support.js","@ember/-internals/string/index.js","@ember/-internals/utility-types/index.js","@ember/-internals/utils/index.js","@ember/-internals/views/index.js","@ember/-internals/views/lib/compat/attrs.js","@ember/-internals/views/lib/compat/fallback-view-registry.js","@ember/-internals/views/lib/component_lookup.js","@ember/-internals/views/lib/mixins/action_support.js","@ember/-internals/views/lib/mixins/child_views_support.js","@ember/-internals/views/lib/mixins/class_names_support.js","@ember/-internals/views/lib/mixins/view_state_support.js","@ember/-internals/views/lib/mixins/view_support.js","@ember/-internals/views/lib/system/action_manager.js","@ember/-internals/views/lib/system/event_dispatcher.js","@ember/-internals/views/lib/system/utils.js","@ember/-internals/views/lib/views/core_view.js","@ember/-internals/views/lib/views/states.js","@ember/application/index.js","@ember/application/instance.js","@ember/application/lib/lazy_load.js","@ember/application/namespace.js","@ember/array/-internals.js","@ember/array/index.js","@ember/array/lib/make-array.js","@ember/array/mutable.js","@ember/array/proxy.js","@ember/canary-features/index.js","@ember/component/helper.js","@ember/component/index.js","@ember/component/template-only.js","@ember/controller/index.js","@ember/debug/container-debug-adapter.js","@ember/debug/data-adapter.js","@ember/debug/index.js","@ember/debug/lib/capture-render-tree.js","@ember/debug/lib/deprecate.js","@ember/debug/lib/handlers.js","@ember/debug/lib/inspect.js","@ember/debug/lib/testing.js","@ember/debug/lib/warn.js","@ember/deprecated-features/index.js","@ember/destroyable/index.js","@ember/engine/index.js","@ember/engine/instance.js","@ember/engine/lib/engine-parent.js","@ember/enumerable/index.js","@ember/enumerable/mutable.js","@ember/error/index.js","@ember/helper/index.js","@ember/instrumentation/index.js","@ember/modifier/index.js","@ember/object/-internals.js","@ember/object/compat.js","@ember/object/computed.js","@ember/object/core.js","@ember/object/evented.js","@ember/object/events.js","@ember/object/index.js","@ember/object/internals.js","@ember/object/lib/computed/computed_macros.js","@ember/object/lib/computed/reduce_computed_macros.js","@ember/object/mixin.js","@ember/object/observable.js","@ember/object/observers.js","@ember/object/promise-proxy-mixin.js","@ember/object/proxy.js","@ember/owner/index.js","@ember/polyfills/index.js","@ember/polyfills/lib/assign.js","@ember/renderer/index.js","@ember/routing/-internals.js","@ember/routing/auto-location.js","@ember/routing/hash-location.js","@ember/routing/history-location.js","@ember/routing/index.js","@ember/routing/lib/cache.js","@ember/routing/lib/controller_for.js","@ember/routing/lib/dsl.js","@ember/routing/lib/engines.js","@ember/routing/lib/generate_controller.js","@ember/routing/lib/location-utils.js","@ember/routing/lib/query_params.js","@ember/routing/lib/route-info.js","@ember/routing/lib/router_state.js","@ember/routing/lib/routing-service.js","@ember/routing/lib/utils.js","@ember/routing/location.js","@ember/routing/none-location.js","@ember/routing/route-info.js","@ember/routing/route.js","@ember/routing/router-service.js","@ember/routing/router.js","@ember/routing/transition.js","@ember/runloop/index.js","@ember/service/index.js","@ember/string/index.js","@ember/string/lib/string_registry.js","@ember/template-compilation/index.js","@ember/template-factory/index.js","@ember/template/index.js","@ember/test/adapter.js","@ember/test/index.js","@ember/utils/index.js","@ember/utils/lib/compare.js","@ember/utils/lib/is-equal.js","@ember/utils/lib/is_blank.js","@ember/utils/lib/is_empty.js","@ember/utils/lib/is_none.js","@ember/utils/lib/is_present.js","@ember/utils/lib/type-of.js","@ember/version/index.js","@glimmer/destroyable.js","@glimmer/encoder.js","@glimmer/env.js","@glimmer/global-context.js","@glimmer/low-level.js","@glimmer/manager.js","@glimmer/node.js","@glimmer/opcode-compiler.js","@glimmer/owner.js","@glimmer/program.js","@glimmer/reference.js","@glimmer/runtime.js","@glimmer/tracking/index.js","@glimmer/tracking/primitives/cache.js","@glimmer/util.js","@glimmer/validator.js","@glimmer/vm.js","@glimmer/wire-format.js","@simple-dom/document.js","backburner.js","dag-map.js","ember-babel.js","ember-testing/index.js","ember-testing/lib/adapters/adapter.js","ember-testing/lib/adapters/qunit.js","ember-testing/lib/ext/application.js","ember-testing/lib/ext/rsvp.js","ember-testing/lib/helpers.js","ember-testing/lib/helpers/and_then.js","ember-testing/lib/helpers/current_path.js","ember-testing/lib/helpers/current_route_name.js","ember-testing/lib/helpers/current_url.js","ember-testing/lib/helpers/pause_test.js","ember-testing/lib/helpers/visit.js","ember-testing/lib/helpers/wait.js","ember-testing/lib/initializers.js","ember-testing/lib/setup_for_testing.js","ember-testing/lib/test.js","ember-testing/lib/test/adapter.js","ember-testing/lib/test/helpers.js","ember-testing/lib/test/on_inject_helpers.js","ember-testing/lib/test/pending_requests.js","ember-testing/lib/test/promise.js","ember-testing/lib/test/run.js","ember-testing/lib/test/waiters.js","ember/index.js","ember/version.js","route-recognizer.js","router_js.js","rsvp.js","vendor/shims/jquery.js","vendor/ember-fetch.js","vendor/ember-prism.js","vendor/prismjs/prism.js","vendor/prismjs/components/prism-css.js","vendor/prismjs/components/prism-scss.js","vendor/prismjs/components/prism-javascript.js","vendor/prismjs/components/prism-markup.js","vendor/prismjs/plugins/line-numbers/prism-line-numbers.js","vendor/prismjs/plugins/line-highlight/prism-line-highlight.js","vendor/prismjs/plugins/toolbar/prism-toolbar.js","vendor/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.js","vendor/prismjs/plugins/show-language/prism-show-language.js","vendor/prismjs/plugins/normalize-whitespace/prism-normalize-whitespace.js","vendor/base64.js","webpack://io/webpack/universalModuleDefinition","webpack://io/webpack/bootstrap","webpack://io/./node_modules/component-emitter/index.js","webpack://io/./node_modules/engine.io-parser/lib/index.js","webpack://io/./node_modules/engine.io-client/lib/globalThis.browser.js","webpack://io/./node_modules/engine.io-client/lib/transport.js","webpack://io/./node_modules/parseqs/index.js","webpack://io/./node_modules/socket.io-parser/dist/index.js","webpack://io/./node_modules/parseuri/index.js","webpack://io/./build/manager.js","webpack://io/./node_modules/engine.io-client/lib/transports/index.js","webpack://io/./node_modules/engine.io-client/lib/xmlhttprequest.js","webpack://io/./node_modules/engine.io-client/lib/transports/polling.js","webpack://io/./node_modules/engine.io-parser/lib/commons.js","webpack://io/./node_modules/yeast/index.js","webpack://io/./node_modules/engine.io-client/lib/util.js","webpack://io/./build/socket.js","webpack://io/./node_modules/socket.io-parser/dist/is-binary.js","webpack://io/./build/on.js","webpack://io/./build/index.js","webpack://io/./build/url.js","webpack://io/./node_modules/engine.io-client/lib/index.js","webpack://io/./node_modules/engine.io-client/lib/socket.js","webpack://io/./node_modules/has-cors/index.js","webpack://io/./node_modules/engine.io-client/lib/transports/polling-xhr.js","webpack://io/./node_modules/engine.io-parser/lib/encodePacket.browser.js","webpack://io/./node_modules/engine.io-parser/lib/decodePacket.browser.js","webpack://io/./node_modules/engine.io-parser/node_modules/base64-arraybuffer/lib/base64-arraybuffer.js","webpack://io/./node_modules/engine.io-client/lib/transports/polling-jsonp.js","webpack://io/./node_modules/engine.io-client/lib/transports/websocket.js","webpack://io/./node_modules/engine.io-client/lib/transports/websocket-constructor.browser.js","webpack://io/./node_modules/socket.io-parser/dist/binary.js","webpack://io/./node_modules/backo2/index.js","../../src/utils/isBrowser.js","../../src/utils/debounce.js","../../src/utils/isFunction.js","../../src/utils/getStyleComputedProperty.js","../../src/utils/getParentNode.js","../../src/utils/getScrollParent.js","../../src/utils/getReferenceNode.js","../../src/utils/isIE.js","../../src/utils/getOffsetParent.js","../../src/utils/isOffsetContainer.js","../../src/utils/getRoot.js","../../src/utils/findCommonOffsetParent.js","../../src/utils/getScroll.js","../../src/utils/includeScroll.js","../../src/utils/getBordersSize.js","../../src/utils/getWindowSizes.js","../../src/utils/getClientRect.js","../../src/utils/getBoundingClientRect.js","../../src/utils/getOffsetRectRelativeToArbitraryNode.js","../../src/utils/getViewportOffsetRectRelativeToArtbitraryNode.js","../../src/utils/isFixed.js","../../src/utils/getFixedPositionOffsetParent.js","../../src/utils/getBoundaries.js","../../src/utils/computeAutoPlacement.js","../../src/utils/getReferenceOffsets.js","../../src/utils/getOuterSizes.js","../../src/utils/getOppositePlacement.js","../../src/utils/getPopperOffsets.js","../../src/utils/find.js","../../src/utils/findIndex.js","../../src/utils/runModifiers.js","../../src/methods/update.js","../../src/utils/isModifierEnabled.js","../../src/utils/getSupportedPropertyName.js","../../src/methods/destroy.js","../../src/utils/getWindow.js","../../src/utils/setupEventListeners.js","../../src/methods/enableEventListeners.js","../../src/utils/removeEventListeners.js","../../src/methods/disableEventListeners.js","../../src/utils/isNumeric.js","../../src/utils/setStyles.js","../../src/utils/setAttributes.js","../../src/modifiers/applyStyle.js","../../src/utils/getRoundedOffsets.js","../../src/modifiers/computeStyle.js","../../src/utils/isModifierRequired.js","../../src/modifiers/arrow.js","../../src/utils/getOppositeVariation.js","../../src/methods/placements.js","../../src/utils/clockwise.js","../../src/modifiers/flip.js","../../src/modifiers/keepTogether.js","../../src/modifiers/offset.js","../../src/modifiers/preventOverflow.js","../../src/modifiers/shift.js","../../src/modifiers/hide.js","../../src/modifiers/inner.js","../../src/modifiers/index.js","../../src/methods/defaults.js","../../src/index.js","../../src/utils/getStyleComputedProperty.js","../../src/utils/getParentNode.js","../../src/utils/getScrollParent.js","../../src/utils/getReferenceNode.js","../../src/utils/isBrowser.js","../../src/utils/isIE.js","../../src/utils/getOffsetParent.js","../../src/utils/isOffsetContainer.js","../../src/utils/getRoot.js","../../src/utils/findCommonOffsetParent.js","../../src/utils/getScroll.js","../../src/utils/includeScroll.js","../../src/utils/getBordersSize.js","../../src/utils/getWindowSizes.js","../../src/utils/getClientRect.js","../../src/utils/getBoundingClientRect.js","../../src/utils/getOffsetRectRelativeToArbitraryNode.js","../../src/utils/getViewportOffsetRectRelativeToArtbitraryNode.js","../../src/utils/isFixed.js","../../src/utils/getFixedPositionOffsetParent.js","../../src/utils/getBoundaries.js","../../src/utils/computeAutoPlacement.js","../../src/utils/debounce.js","../../src/utils/find.js","../../src/utils/findIndex.js","../../src/utils/getOffsetRect.js","../../src/utils/getOuterSizes.js","../../src/utils/getOppositePlacement.js","../../src/utils/getPopperOffsets.js","../../src/utils/getReferenceOffsets.js","../../src/utils/getSupportedPropertyName.js","../../src/utils/isFunction.js","../../src/utils/isModifierEnabled.js","../../src/utils/isModifierRequired.js","../../src/utils/isNumeric.js","../../src/utils/getWindow.js","../../src/utils/removeEventListeners.js","../../src/utils/runModifiers.js","../../src/utils/setAttributes.js","../../src/utils/setStyles.js","../../src/utils/setupEventListeners.js","../../src/utils/index.js","../../js/src/util.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/carousel.js","../../js/src/collapse.js","../../js/src/dropdown.js","../../js/src/modal.js","../../js/src/tools/sanitizer.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","node_modules/alertifyjs/build/alertify.min.js","node_modules/jszip/dist/jszip.min.js","../src/FileSaver.js","node_modules/exceljs/dist/exceljs.min.js","node_modules/sortablejs/Sortable.min.js","node_modules/metismenu/dist/metisMenu.min.js","node_modules/perfect-scrollbar/dist/perfect-scrollbar.min.js","node_modules/slick-carousel/slick/slick.min.js","node_modules/jquery-circle-progress/dist/circle-progress.min.js","node_modules/intro.js/minified/intro.min.js","node_modules/sweetalert2/dist/sweetalert2.min.js","node_modules/jquery.fancytree/dist/jquery.fancytree-all-deps.min.js","node_modules/jquery.fancytree/dist/modules/jquery.fancytree.filter.js","node_modules/jquery.fancytree/dist/modules/jquery.fancytree.table.js","node_modules/jquery.fancytree/dist/modules/jquery.fancytree.grid.js","node_modules/jquery.fancytree/dist/modules/jquery.fancytree.glyph.js","node_modules/jquery.fancytree/dist/modules/jquery.fancytree.edit.js","node_modules/jquery.fancytree/dist/modules/jquery.fancytree.childcounter.js","node_modules/jquery.fancytree/dist/modules/jquery.fancytree.columnview.js","node_modules/clipboard/dist/clipboard.min.js","node_modules/@chenfengyuan/datepicker/dist/datepicker.min.js","node_modules/@chenfengyuan/datepicker/i18n/datepicker.it-IT.js","node_modules/jquery-validation/dist/jquery.validate.min.js","node_modules/smartwizard/dist/js/jquery.smartWizard.min.js","node_modules/bootstrap-multiselect/dist/js/bootstrap-multiselect.js","node_modules/select2/dist/js/select2.min.js","node_modules/nouislider/dist/nouislider.min.js","node_modules/wnumb/wNumb.min.js","node_modules/autosize/dist/autosize.min.js","node_modules/apexcharts/dist/apexcharts.min.js","node_modules/chart.js/dist/chart.umd.js","node_modules/jquery-sparkline/jquery.sparkline.min.js","node_modules/block-ui/jquery.blockUI.js","node_modules/bootstrap4-toggle/js/bootstrap4-toggle.min.js","node_modules/crypto-js/crypto-js.js","webpack://ClassicEditor/webpack/universalModuleDefinition","webpack://ClassicEditor/./node_modules/color-convert/conversions.js","webpack://ClassicEditor/./node_modules/color-convert/index.js","webpack://ClassicEditor/./node_modules/color-convert/route.js","webpack://ClassicEditor/./node_modules/color-name/index.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-block-quote/theme/blockquote.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-clipboard/theme/clipboard.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-code-block/theme/codeblock.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-editor-classic/theme/classiceditor.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/theme/placeholder.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/theme/renderer.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-find-and-replace/theme/findandreplace.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-find-and-replace/theme/findandreplaceform.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-font/theme/fontcolor.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-font/theme/fontsize.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-heading/theme/heading.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-horizontal-line/theme/horizontalline.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/theme/image.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/theme/imagecaption.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/theme/imageinsert.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/theme/imageinsertformrowview.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/theme/imageresize.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/theme/imagestyle.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/theme/imageuploadicon.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/theme/imageuploadloader.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/theme/imageuploadprogress.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/theme/textalternativeform.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/theme/link.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/theme/linkactions.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/theme/linkform.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/theme/linkimage.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/theme/collapsible.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/theme/list.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/theme/listproperties.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/theme/liststyles.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaembed.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaembedediting.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaform.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-mention/theme/mention.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-mention/theme/mentionui.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-page-break/theme/pagebreak.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-restricted-editing/theme/restrictedediting.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-source-editing/theme/sourceediting.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-special-characters/theme/charactergrid.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-special-characters/theme/characterinfo.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-special-characters/theme/specialcharacters.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/colorinput.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/form.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/formrow.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/inserttable.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/table.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/tablecellproperties.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/tablecolumnresize.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/tableediting.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/tableform.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/tableselection.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/button/button.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/button/switchbutton.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/colorgrid/colorgrid.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/colorpicker/colorpicker.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/dropdown.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/listdropdown.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/splitbutton.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/toolbardropdown.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/editorui/editorui.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/formheader/formheader.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/icon/icon.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/input/input.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/label/label.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/labeledfield/labeledfieldview.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/list/list.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/balloonpanel.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/balloonrotator.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/fakepanel.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/stickypanel.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/responsive-form/responsiveform.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/toolbar/blocktoolbar.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/toolbar/toolbar.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/tooltip/tooltip.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/globals/globals.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-widget/theme/widget.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-widget/theme/widgetresize.css","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-widget/theme/widgettypearound.css","webpack://ClassicEditor/./src/plugins/Fullscreen/fullscreen.css","webpack://ClassicEditor/./src/plugins/placeholder/theme/placeholder.css","webpack://ClassicEditor/./node_modules/css-loader/dist/runtime/api.js","webpack://ClassicEditor/./node_modules/css-loader/dist/runtime/cssWithMappingToString.js","webpack://ClassicEditor/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://ClassicEditor/webpack/bootstrap","webpack://ClassicEditor/webpack/runtime/compat get default export","webpack://ClassicEditor/webpack/runtime/define property getters","webpack://ClassicEditor/webpack/runtime/global","webpack://ClassicEditor/webpack/runtime/hasOwnProperty shorthand","webpack://ClassicEditor/webpack/runtime/nonce","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/env.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/fastdiff.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/diff.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/spy.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/eventinfo.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/uid.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/priorities.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/inserttopriorityarray.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/ckeditorerror.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/version.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/emittermixin.js","webpack://ClassicEditor/./node_modules/lodash-es/isObject.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/observablemixin.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/elementreplacer.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/count.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/comparearrays.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/isiterable.js","webpack://ClassicEditor/./node_modules/lodash-es/_freeGlobal.js","webpack://ClassicEditor/./node_modules/lodash-es/_root.js","webpack://ClassicEditor/./node_modules/lodash-es/_Symbol.js","webpack://ClassicEditor/./node_modules/lodash-es/_getRawTag.js","webpack://ClassicEditor/./node_modules/lodash-es/_objectToString.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseGetTag.js","webpack://ClassicEditor/./node_modules/lodash-es/isArray.js","webpack://ClassicEditor/./node_modules/lodash-es/isObjectLike.js","webpack://ClassicEditor/./node_modules/lodash-es/isString.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/createelement.js","webpack://ClassicEditor/./node_modules/lodash-es/_overArg.js","webpack://ClassicEditor/./node_modules/lodash-es/_getPrototype.js","webpack://ClassicEditor/./node_modules/lodash-es/isPlainObject.js","webpack://ClassicEditor/./node_modules/lodash-es/_listCacheClear.js","webpack://ClassicEditor/./node_modules/lodash-es/eq.js","webpack://ClassicEditor/./node_modules/lodash-es/_assocIndexOf.js","webpack://ClassicEditor/./node_modules/lodash-es/_listCacheDelete.js","webpack://ClassicEditor/./node_modules/lodash-es/_listCacheGet.js","webpack://ClassicEditor/./node_modules/lodash-es/_listCacheHas.js","webpack://ClassicEditor/./node_modules/lodash-es/_listCacheSet.js","webpack://ClassicEditor/./node_modules/lodash-es/_ListCache.js","webpack://ClassicEditor/./node_modules/lodash-es/_stackClear.js","webpack://ClassicEditor/./node_modules/lodash-es/_stackDelete.js","webpack://ClassicEditor/./node_modules/lodash-es/_stackGet.js","webpack://ClassicEditor/./node_modules/lodash-es/_stackHas.js","webpack://ClassicEditor/./node_modules/lodash-es/isFunction.js","webpack://ClassicEditor/./node_modules/lodash-es/_coreJsData.js","webpack://ClassicEditor/./node_modules/lodash-es/_isMasked.js","webpack://ClassicEditor/./node_modules/lodash-es/_toSource.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseIsNative.js","webpack://ClassicEditor/./node_modules/lodash-es/_getValue.js","webpack://ClassicEditor/./node_modules/lodash-es/_getNative.js","webpack://ClassicEditor/./node_modules/lodash-es/_Map.js","webpack://ClassicEditor/./node_modules/lodash-es/_nativeCreate.js","webpack://ClassicEditor/./node_modules/lodash-es/_hashClear.js","webpack://ClassicEditor/./node_modules/lodash-es/_hashDelete.js","webpack://ClassicEditor/./node_modules/lodash-es/_hashGet.js","webpack://ClassicEditor/./node_modules/lodash-es/_hashHas.js","webpack://ClassicEditor/./node_modules/lodash-es/_hashSet.js","webpack://ClassicEditor/./node_modules/lodash-es/_Hash.js","webpack://ClassicEditor/./node_modules/lodash-es/_mapCacheClear.js","webpack://ClassicEditor/./node_modules/lodash-es/_isKeyable.js","webpack://ClassicEditor/./node_modules/lodash-es/_getMapData.js","webpack://ClassicEditor/./node_modules/lodash-es/_mapCacheDelete.js","webpack://ClassicEditor/./node_modules/lodash-es/_mapCacheGet.js","webpack://ClassicEditor/./node_modules/lodash-es/_mapCacheHas.js","webpack://ClassicEditor/./node_modules/lodash-es/_mapCacheSet.js","webpack://ClassicEditor/./node_modules/lodash-es/_MapCache.js","webpack://ClassicEditor/./node_modules/lodash-es/_stackSet.js","webpack://ClassicEditor/./node_modules/lodash-es/_Stack.js","webpack://ClassicEditor/./node_modules/lodash-es/_arrayEach.js","webpack://ClassicEditor/./node_modules/lodash-es/_defineProperty.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseAssignValue.js","webpack://ClassicEditor/./node_modules/lodash-es/_assignValue.js","webpack://ClassicEditor/./node_modules/lodash-es/_copyObject.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseTimes.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseIsArguments.js","webpack://ClassicEditor/./node_modules/lodash-es/isArguments.js","webpack://ClassicEditor/./node_modules/lodash-es/stubFalse.js","webpack://ClassicEditor/./node_modules/lodash-es/isBuffer.js","webpack://ClassicEditor/./node_modules/lodash-es/_isIndex.js","webpack://ClassicEditor/./node_modules/lodash-es/isLength.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseIsTypedArray.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseUnary.js","webpack://ClassicEditor/./node_modules/lodash-es/_nodeUtil.js","webpack://ClassicEditor/./node_modules/lodash-es/isTypedArray.js","webpack://ClassicEditor/./node_modules/lodash-es/_arrayLikeKeys.js","webpack://ClassicEditor/./node_modules/lodash-es/_isPrototype.js","webpack://ClassicEditor/./node_modules/lodash-es/_nativeKeys.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseKeys.js","webpack://ClassicEditor/./node_modules/lodash-es/isArrayLike.js","webpack://ClassicEditor/./node_modules/lodash-es/keys.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseAssign.js","webpack://ClassicEditor/./node_modules/lodash-es/_nativeKeysIn.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseKeysIn.js","webpack://ClassicEditor/./node_modules/lodash-es/keysIn.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseAssignIn.js","webpack://ClassicEditor/./node_modules/lodash-es/_cloneBuffer.js","webpack://ClassicEditor/./node_modules/lodash-es/_copyArray.js","webpack://ClassicEditor/./node_modules/lodash-es/_arrayFilter.js","webpack://ClassicEditor/./node_modules/lodash-es/stubArray.js","webpack://ClassicEditor/./node_modules/lodash-es/_getSymbols.js","webpack://ClassicEditor/./node_modules/lodash-es/_copySymbols.js","webpack://ClassicEditor/./node_modules/lodash-es/_arrayPush.js","webpack://ClassicEditor/./node_modules/lodash-es/_getSymbolsIn.js","webpack://ClassicEditor/./node_modules/lodash-es/_copySymbolsIn.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseGetAllKeys.js","webpack://ClassicEditor/./node_modules/lodash-es/_getAllKeys.js","webpack://ClassicEditor/./node_modules/lodash-es/_getAllKeysIn.js","webpack://ClassicEditor/./node_modules/lodash-es/_DataView.js","webpack://ClassicEditor/./node_modules/lodash-es/_Promise.js","webpack://ClassicEditor/./node_modules/lodash-es/_Set.js","webpack://ClassicEditor/./node_modules/lodash-es/_WeakMap.js","webpack://ClassicEditor/./node_modules/lodash-es/_getTag.js","webpack://ClassicEditor/./node_modules/lodash-es/_initCloneArray.js","webpack://ClassicEditor/./node_modules/lodash-es/_Uint8Array.js","webpack://ClassicEditor/./node_modules/lodash-es/_cloneArrayBuffer.js","webpack://ClassicEditor/./node_modules/lodash-es/_cloneDataView.js","webpack://ClassicEditor/./node_modules/lodash-es/_cloneRegExp.js","webpack://ClassicEditor/./node_modules/lodash-es/_cloneSymbol.js","webpack://ClassicEditor/./node_modules/lodash-es/_cloneTypedArray.js","webpack://ClassicEditor/./node_modules/lodash-es/_initCloneByTag.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseCreate.js","webpack://ClassicEditor/./node_modules/lodash-es/_initCloneObject.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseIsMap.js","webpack://ClassicEditor/./node_modules/lodash-es/isMap.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseIsSet.js","webpack://ClassicEditor/./node_modules/lodash-es/isSet.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseClone.js","webpack://ClassicEditor/./node_modules/lodash-es/cloneDeepWith.js","webpack://ClassicEditor/./node_modules/lodash-es/isElement.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/config.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/isnode.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/iswindow.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/emittermixin.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/global.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/getancestors.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/istext.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/isrange.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/getborderwidths.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/rect.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/resizeobserver.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/setdatainelement.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/tounit.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/indexof.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/insertat.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/iscomment.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/isvisible.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/position.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/getpositionedancestor.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/remove.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/scroll.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/keyboard.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/toarray.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/translation-service.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/language.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/locale.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/collection.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/first.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/focustracker.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/keystrokehandler.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/tomap.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/objecttomap.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/delay.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/unicode.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/src/plugin.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/viewcollection.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/template.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/globals/globals.css?9ffd","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/view.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/icon/icon.css?d134","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/icon/iconview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/button/button.css?e9d2","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/button/buttonview.js","webpack://ClassicEditor/./src/plugins/Fullscreen/fullscreen.css?0d78","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/bindings/clickoutsidehandler.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/bindings/csstransitiondisablermixin.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/bindings/submithandler.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/bindings/addkeyboardhandlingforgrid.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/editorui/bodycollection.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/button/switchbutton.css?aaf0","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/button/switchbuttonview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/utils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/colortileview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/icons/color-tile-check.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/colorgrid/colorgrid.css?2704","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/colorgridview.js","webpack://ClassicEditor/./node_modules/color-parse/index.mjs","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/colorpicker/utils.js","webpack://ClassicEditor/./node_modules/lodash-es/now.js","webpack://ClassicEditor/./node_modules/lodash-es/_trimmedEndIndex.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseTrim.js","webpack://ClassicEditor/./node_modules/lodash-es/isSymbol.js","webpack://ClassicEditor/./node_modules/lodash-es/toNumber.js","webpack://ClassicEditor/./node_modules/lodash-es/debounce.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/label/label.css?8d4e","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/label/labelview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/labeledfield/labeledfieldview.css?2832","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/labeledfield/labeledfieldview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/input/input.css?edfa","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/input/inputview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/inputtext/inputtextview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/inputnumber/inputnumberview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/dropdown/dropdownpanelview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/dropdown.css?1880","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/dropdown/dropdownview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/icons/dropdown-arrow.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/dropdownbuttonview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/focuscycler.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarseparatorview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarlinebreakview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/toolbar/normalizetoolbarconfig.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/src/command.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/src/multicommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/src/plugincollection.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/src/context.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/src/contextplugin.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/theme/placeholder.css?b8f9","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/placeholder.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/typecheckable.js","webpack://ClassicEditor/./node_modules/lodash-es/clone.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/node.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/text.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/textproxy.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/matcher.js","webpack://ClassicEditor/./node_modules/lodash-es/_isKey.js","webpack://ClassicEditor/./node_modules/lodash-es/memoize.js","webpack://ClassicEditor/./node_modules/lodash-es/_memoizeCapped.js","webpack://ClassicEditor/./node_modules/lodash-es/_stringToPath.js","webpack://ClassicEditor/./node_modules/lodash-es/_arrayMap.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseToString.js","webpack://ClassicEditor/./node_modules/lodash-es/toString.js","webpack://ClassicEditor/./node_modules/lodash-es/_castPath.js","webpack://ClassicEditor/./node_modules/lodash-es/last.js","webpack://ClassicEditor/./node_modules/lodash-es/_toKey.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseGet.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseSlice.js","webpack://ClassicEditor/./node_modules/lodash-es/_parent.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseUnset.js","webpack://ClassicEditor/./node_modules/lodash-es/unset.js","webpack://ClassicEditor/./node_modules/lodash-es/get.js","webpack://ClassicEditor/./node_modules/lodash-es/_assignMergeValue.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseFor.js","webpack://ClassicEditor/./node_modules/lodash-es/_createBaseFor.js","webpack://ClassicEditor/./node_modules/lodash-es/isArrayLikeObject.js","webpack://ClassicEditor/./node_modules/lodash-es/_safeGet.js","webpack://ClassicEditor/./node_modules/lodash-es/toPlainObject.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseMergeDeep.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseMerge.js","webpack://ClassicEditor/./node_modules/lodash-es/identity.js","webpack://ClassicEditor/./node_modules/lodash-es/_apply.js","webpack://ClassicEditor/./node_modules/lodash-es/_overRest.js","webpack://ClassicEditor/./node_modules/lodash-es/constant.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseSetToString.js","webpack://ClassicEditor/./node_modules/lodash-es/_shortOut.js","webpack://ClassicEditor/./node_modules/lodash-es/_setToString.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseRest.js","webpack://ClassicEditor/./node_modules/lodash-es/_isIterateeCall.js","webpack://ClassicEditor/./node_modules/lodash-es/_createAssigner.js","webpack://ClassicEditor/./node_modules/lodash-es/merge.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseSet.js","webpack://ClassicEditor/./node_modules/lodash-es/set.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/stylesmap.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/element.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/containerelement.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/editableelement.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/rooteditableelement.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/treewalker.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/position.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/range.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/selection.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/documentselection.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/observer/bubblingeventinfo.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/observer/bubblingemittermixin.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/document.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/attributeelement.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/emptyelement.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/uielement.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/rawelement.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/documentfragment.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/downcastwriter.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/filler.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/theme/renderer.css?d589","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/renderer.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/domconverter.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/isvalidattributename.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/observer/observer.js","webpack://ClassicEditor/./node_modules/lodash-es/assignIn.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/observer/domeventdata.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/observer/domeventobserver.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/observer/keyobserver.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/observer/fakeselectionobserver.js","webpack://ClassicEditor/./node_modules/lodash-es/_setCacheAdd.js","webpack://ClassicEditor/./node_modules/lodash-es/_setCacheHas.js","webpack://ClassicEditor/./node_modules/lodash-es/_SetCache.js","webpack://ClassicEditor/./node_modules/lodash-es/_arraySome.js","webpack://ClassicEditor/./node_modules/lodash-es/_cacheHas.js","webpack://ClassicEditor/./node_modules/lodash-es/_equalArrays.js","webpack://ClassicEditor/./node_modules/lodash-es/_mapToArray.js","webpack://ClassicEditor/./node_modules/lodash-es/_setToArray.js","webpack://ClassicEditor/./node_modules/lodash-es/_equalByTag.js","webpack://ClassicEditor/./node_modules/lodash-es/_equalObjects.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseIsEqualDeep.js","webpack://ClassicEditor/./node_modules/lodash-es/_baseIsEqual.js","webpack://ClassicEditor/./node_modules/lodash-es/isEqualWith.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/observer/mutationobserver.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/observer/focusobserver.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/observer/selectionobserver.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/observer/compositionobserver.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/datatransfer.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/observer/inputobserver.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/observer/arrowkeysobserver.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/observer/tabobserver.js","webpack://ClassicEditor/./node_modules/lodash-es/cloneDeep.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/view.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/typecheckable.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/node.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/nodelist.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/splicearray.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/text.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/textproxy.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/element.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/treewalker.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/position.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/range.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/conversion/mapper.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/conversion/modelconsumable.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/conversion/downcastdispatcher.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/selection.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/liverange.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/documentselection.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/conversion/conversionhelpers.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/conversion/downcasthelpers.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/utils/autoparagraphing.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/conversion/upcasthelpers.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/utils/selection-post-fixer.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/controller/editingcontroller.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/conversion/viewconsumable.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/schema.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/conversion/upcastdispatcher.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/dataprocessor/basichtmlwriter.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/dataprocessor/htmldataprocessor.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/controller/datacontroller.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/conversion/conversion.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/operation/operation.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/operation/utils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/operation/moveoperation.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/operation/insertoperation.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/operation/splitoperation.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/operation/mergeoperation.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/operation/markeroperation.js","webpack://ClassicEditor/./node_modules/lodash-es/isEqual.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/operation/attributeoperation.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/operation/nooperation.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/operation/renameoperation.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/operation/rootattributeoperation.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/operation/rootoperation.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/operation/operationfactory.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/operation/transform.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/liveposition.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/batch.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/differ.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/history.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/rootelement.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/document.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/markercollection.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/operation/detachoperation.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/documentfragment.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/writer.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/utils/deletecontent.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/utils/getselectedcontent.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/utils/insertcontent.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/utils/findoptimalinsertionrange.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/utils/insertobject.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/utils/modifyselection.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/model/model.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/observer/clickobserver.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/observer/mouseobserver.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/upcastwriter.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/styles/utils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/styles/background.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/styles/border.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/styles/margin.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-engine/src/view/styles/padding.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/src/commandcollection.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/src/editingkeystrokehandler.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/src/editor/editor.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/src/editor/utils/dataapimixin.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/src/editor/utils/elementapimixin.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/src/pendingactions.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/cancel.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/src/index.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/bold.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/caption.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/check.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/cog.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/eraser.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/image.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/low-vision.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/importexport.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/paragraph.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/plus.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/text.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/align-bottom.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/align-middle.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/align-top.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/align-left.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/align-center.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/align-right.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/align-justify.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/object-inline-left.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/object-center.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/object-inline-right.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/object-full-width.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/object-inline.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/object-left.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/object-right.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/object-size-full.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/object-size-large.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/object-size-small.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/object-size-medium.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/pencil.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/pilcrow.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/quote.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/theme/icons/three-vertical-dots.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/toolbar/toolbar.css?0211","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/bindings/preventdefault.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/list/list.css?cbd7","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/list/listview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/list/listitemview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/list/listseparatorview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/splitbutton.css?0497","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/splitbuttonview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/toolbardropdown.css?347c","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/listdropdown.css?1a4d","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/dropdown/utils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/labeledfield/utils.js","webpack://ClassicEditor/./node_modules/vanilla-colorful/lib/utils/math.js","webpack://ClassicEditor/./node_modules/vanilla-colorful/lib/utils/convert.js","webpack://ClassicEditor/./node_modules/vanilla-colorful/lib/utils/compare.js","webpack://ClassicEditor/./node_modules/vanilla-colorful/lib/utils/dom.js","webpack://ClassicEditor/./node_modules/vanilla-colorful/lib/components/slider.js","webpack://ClassicEditor/./node_modules/vanilla-colorful/lib/components/hue.js","webpack://ClassicEditor/./node_modules/vanilla-colorful/lib/components/saturation.js","webpack://ClassicEditor/./node_modules/vanilla-colorful/lib/styles/color-picker.js","webpack://ClassicEditor/./node_modules/vanilla-colorful/lib/components/color-picker.js","webpack://ClassicEditor/./node_modules/vanilla-colorful/lib/styles/hue.js","webpack://ClassicEditor/./node_modules/vanilla-colorful/lib/styles/saturation.js","webpack://ClassicEditor/./node_modules/vanilla-colorful/lib/entrypoints/hex.js","webpack://ClassicEditor/./node_modules/vanilla-colorful/hex-color-picker.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/colorpicker/colorpicker.css?53be","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/colorpicker/colorpickerview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/componentfactory.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/balloonpanel.css?7831","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/panel/balloon/balloonpanelview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/tooltip/tooltip.css?a08c","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/tooltipmanager.js","webpack://ClassicEditor/./node_modules/lodash-es/throttle.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/editorui/poweredby.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/verifylicense.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/icons/project-logo.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/findclosestscrollableancestor.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/editorui/editorui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/editorui/editorui.css?2a16","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/editorui/editoruiview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/editorui/boxed/boxededitoruiview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/editableui/editableuiview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/editableui/inline/inlineeditableuiview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/formheader/formheader.css?0cda","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/formheader/formheaderview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/notification/notification.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/model.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/icons/previous-arrow.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/balloonrotator.css?1baf","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/fakepanel.css?17b0","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/panel/balloon/contextualballoon.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/icons/next-arrow.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/stickypanel.css?009d","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/panel/sticky/stickypanelview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/toolbar/balloon/balloontoolbar.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/toolbar/blocktoolbar.css?45fd","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/toolbar/block/blockbuttonview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/toolbar/block/blocktoolbar.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/icons/color-palette.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/src/index.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-editor-classic/src/classiceditorui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-editor-classic/theme/classiceditor.css?97f1","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-editor-classic/src/classiceditoruiview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-watchdog/src/watchdog.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-watchdog/src/utils/getsubnodes.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-watchdog/src/utils/areconnectedthroughproperties.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-watchdog/src/editorwatchdog.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-watchdog/src/contextwatchdog.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-editor-classic/src/classiceditor.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-utils/src/dom/getdatafromelement.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-core/src/editor/utils/attachtoform.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-alignment/src/utils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-alignment/src/alignmentcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-alignment/src/alignmentediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-alignment/src/alignmentui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-clipboard/src/clipboardobserver.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-clipboard/src/utils/viewtoplaintext.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-clipboard/src/clipboardpipeline.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-clipboard/src/utils/normalizeclipboarddata.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-clipboard/src/utils/plaintexttohtml.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-typing/src/utils/changebuffer.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-typing/src/inserttextcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-typing/src/inserttextobserver.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-typing/src/input.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-typing/src/deletecommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-typing/src/deleteobserver.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-typing/src/delete.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-typing/src/typing.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-typing/src/utils/getlasttextline.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-typing/src/textwatcher.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-typing/src/twostepcaretmovement.js","webpack://ClassicEditor/./node_modules/lodash-es/escapeRegExp.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-typing/src/texttransformation.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-typing/src/utils/findattributerange.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-enter/src/utils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-enter/src/entercommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-enter/src/enterobserver.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-enter/src/enter.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-enter/src/shiftentercommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-enter/src/shiftenter.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-widget/src/highlightstack.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-widget/theme/icons/drag-handle.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-widget/src/utils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-widget/src/widgettypearound/utils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-widget/theme/widgettypearound.css?abb1","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-widget/src/widgettypearound/widgettypearound.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-widget/theme/icons/return-arrow.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-widget/src/verticalnavigation.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-widget/theme/widget.css?47b7","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-widget/src/widget.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-widget/src/widgettoolbarrepository.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-widget/src/widgetresize/resizerstate.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-widget/src/widgetresize/sizeview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-widget/src/widgetresize/resizer.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-widget/theme/widgetresize.css?24e6","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-widget/src/widgetresize.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-clipboard/theme/clipboard.css?0a95","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-clipboard/src/dragdrop.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-clipboard/src/pasteplaintext.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-clipboard/src/clipboard.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-clipboard/src/lineview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-undo/src/basecommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-undo/src/undocommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-undo/src/redocommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-undo/src/undoediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-undo/theme/icons/undo.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-undo/theme/icons/redo.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-undo/src/undoui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-undo/src/undo.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/image/utils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imageutils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/autoimage.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-autoformat/src/blockautoformatediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-autoformat/src/inlineautoformatediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-autoformat/src/autoformat.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-block-quote/src/blockquotecommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-block-quote/theme/blockquote.css?66ed","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-basic-styles/src/attributecommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-cloud-services/src/token/token.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-cloud-services/src/uploadgateway/fileuploader.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-cloud-services/src/uploadgateway/uploadgateway.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-cloud-services/src/cloudservicescore.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-code-block/src/utils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-code-block/src/codeblockcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-code-block/src/indentcodeblockcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-code-block/src/outdentcodeblockcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-code-block/src/converters.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-code-block/src/codeblockediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-code-block/theme/codeblock.css?ff4a","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-code-block/src/codeblockui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-code-block/theme/icons/codeblock.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-select-all/src/selectallcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-select-all/src/selectallediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-select-all/src/selectallui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-select-all/theme/icons/select-all.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-select-all/src/selectall.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-ui/theme/components/responsive-form/responsiveform.css?7101","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-find-and-replace/theme/findandreplaceform.css?50d4","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-find-and-replace/src/ui/findandreplaceformview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-find-and-replace/src/findandreplaceui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-find-and-replace/theme/icons/find-replace.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-find-and-replace/src/findcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-find-and-replace/src/replacecommandbase.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-find-and-replace/src/replacecommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-find-and-replace/src/replaceallcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-find-and-replace/src/findnextcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-find-and-replace/src/findpreviouscommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-find-and-replace/src/findandreplacestate.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-find-and-replace/src/findandreplaceutils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-find-and-replace/theme/findandreplace.css?9ce3","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-find-and-replace/src/findandreplaceediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-font/src/fontcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-font/src/documentcolorcollection.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-font/theme/fontcolor.css?361f","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-font/src/ui/colortableview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-font/src/utils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-font/src/fontcolor/fontcolorcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-font/src/fontcolor/fontcolorediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-font/src/ui/colorui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-font/src/fontcolor/fontcolorui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-font/theme/icons/font-color.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-font/src/fontsize/fontsizecommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-font/src/fontsize/utils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-font/src/fontsize/fontsizeediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-font/theme/fontsize.css?31d2","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-font/src/fontsize/fontsizeui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-font/theme/icons/font-size.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-paragraph/src/paragraphcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-paragraph/src/insertparagraphcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-paragraph/src/paragraph.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-heading/src/headingcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-heading/src/headingediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-heading/theme/heading.css?2b0a","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-heading/src/headingui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-heading/src/utils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-horizontal-line/src/horizontallinecommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-horizontal-line/theme/horizontalline.css?3559","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-horizontal-line/src/horizontallineediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-horizontal-line/src/horizontallineui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-horizontal-line/theme/icons/horizontalline.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imagetextalternative/imagetextalternativecommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imagetextalternative/imagetextalternativeediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/theme/textalternativeform.css?66f4","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imagetextalternative/ui/textalternativeformview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/image/ui/utils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imagetextalternative/imagetextalternativeui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imagetextalternative.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/image/converters.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/image/imageloadobserver.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/image/insertimagecommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/image/replaceimagesourcecommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/image/imageediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/image/imagetypecommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/image/imageblockediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/theme/image.css?5c96","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imageblock.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/image/imageinlineediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imageinline.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imagecaption/toggleimagecaptioncommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imagecaption/imagecaptionutils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imagecaption/imagecaptionediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imagecaption/imagecaptionui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/theme/imagecaption.css?5152","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-upload/src/filereader.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-upload/src/filerepository.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-upload/src/ui/filedialogbuttonview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imageupload/utils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imageupload/imageuploadui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/theme/imageuploadprogress.css?72d0","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/theme/imageuploadicon.css?b791","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/theme/imageuploadloader.css?3f3f","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imageupload/imageuploadprogress.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imageupload/uploadimagecommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imageupload/imageuploadediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imageupload.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/theme/imageinsertformrowview.css?bfb2","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imageinsert/ui/imageinsertformrowview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/theme/imageinsert.css?2fb5","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imageinsert/ui/imageinsertpanelview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imageinsert/utils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imageinsert/imageinsertui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imageinsertviaurl.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imageresize/resizeimagecommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imageresize/imageresizeediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imageresize/imageresizebuttons.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imageresize/imageresizehandles.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/theme/imageresize.css?a8fb","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imagestyle/imagestylecommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imagestyle/utils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imagestyle/converters.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imagestyle/imagestyleediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/theme/imagestyle.css?a152","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imagestyle/imagestyleui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-indent/src/indentediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-indent/theme/icons/indent.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-indent/theme/icons/outdent.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-indent/src/indentui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-indent/src/indentblockcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-indent/src/indentcommandbehavior/indentusingoffset.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-indent/src/indentcommandbehavior/indentusingclasses.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-indent/src/indentblock.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/italic.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/src/utils/automaticdecorators.js","webpack://ClassicEditor/./node_modules/lodash-es/_castSlice.js","webpack://ClassicEditor/./node_modules/lodash-es/_hasUnicode.js","webpack://ClassicEditor/./node_modules/lodash-es/_asciiToArray.js","webpack://ClassicEditor/./node_modules/lodash-es/_unicodeToArray.js","webpack://ClassicEditor/./node_modules/lodash-es/_stringToArray.js","webpack://ClassicEditor/./node_modules/lodash-es/upperFirst.js","webpack://ClassicEditor/./node_modules/lodash-es/_createCaseFirst.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/src/utils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/src/linkcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/src/unlinkcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/src/utils/manualdecorator.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/theme/link.css?4da5","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/src/linkediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-typing/src/utils/inlinehighlight.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/theme/linkform.css?837e","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/src/ui/linkformview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/theme/linkactions.css?b997","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/src/ui/linkactionsview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/theme/icons/unlink.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/theme/icons/link.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/src/linkui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/src/autolink.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/src/linkimageediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/src/linkimageui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/theme/linkimage.css?843b","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/src/list/listcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/src/list/indentcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/src/list/utils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/src/list/listutils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/src/list/converters.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/theme/list.css?ef70","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/src/list/listediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/theme/icons/numberedlist.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/theme/icons/bulletedlist.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/src/list/listui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/src/listproperties/liststylecommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/src/listproperties/listreversedcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/src/listproperties/liststartcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/src/listproperties/listpropertiesediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/theme/collapsible.css?ab49","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/src/listproperties/ui/collapsibleview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/theme/listproperties.css?c6ab","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/src/listproperties/ui/listpropertiesview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/theme/liststyles.css?4c65","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/src/listproperties/listpropertiesui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/theme/icons/liststyledisc.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/theme/icons/liststylecircle.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/theme/icons/liststylesquare.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/theme/icons/liststyledecimal.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/theme/icons/liststyledecimalleadingzero.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/theme/icons/liststylelowerroman.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/theme/icons/liststyleupperroman.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/theme/icons/liststylelowerlatin.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/theme/icons/liststyleupperlatin.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-media-embed/src/converters.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-media-embed/src/utils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-media-embed/src/mediaembedcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-media-embed/src/mediaregistry.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-media-embed/theme/icons/media-placeholder.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaembedediting.css?816e","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-media-embed/src/mediaembedediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-media-embed/src/automediaembed.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaform.css?e368","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-media-embed/src/ui/mediaformview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-media-embed/src/mediaembedui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-media-embed/theme/icons/media.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaembed.css?b12c","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-mention/src/mentioncommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-mention/src/mentionediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-mention/theme/mentionui.css?c111","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-mention/src/ui/mentionsview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-mention/src/ui/domwrapperview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-mention/src/ui/mentionlistitemview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-mention/src/mentionui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-mention/theme/mention.css?d8de","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-page-break/src/pagebreakcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-page-break/theme/pagebreak.css?7ae9","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-page-break/src/pagebreakediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-page-break/src/pagebreakui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-page-break/theme/icons/pagebreak.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/list.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/image.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-paste-from-office/src/normalizers/mswordnormalizer.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/br.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-paste-from-office/src/normalizers/googledocsnormalizer.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/removeboldwrapper.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-paste-from-office/src/normalizers/googlesheetsnormalizer.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/removegooglesheetstag.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/removexmlns.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/removeinvalidtablewidth.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/removestyleblock.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/space.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/parse.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-remove-format/theme/icons/remove-format.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-remove-format/src/removeformatui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-remove-format/src/removeformatcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-remove-format/src/removeformatediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-source-editing/src/utils/formathtml.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-source-editing/theme/sourceediting.css?8d2b","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-source-editing/src/sourceediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-special-characters/src/ui/specialcharactersnavigationview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-special-characters/theme/charactergrid.css?0a9b","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-special-characters/src/ui/charactergridview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-special-characters/theme/characterinfo.css?a125","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-special-characters/src/ui/characterinfoview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-special-characters/src/ui/specialcharactersview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-special-characters/theme/specialcharacters.css?1939","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-special-characters/src/specialcharacters.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-special-characters/src/specialcharactersarrows.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-special-characters/src/specialcharacterscurrency.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-special-characters/src/specialcharactersmathematical.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-special-characters/src/specialcharacterslatin.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-special-characters/src/specialcharacterstext.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-restricted-editing/src/restrictededitingexceptioncommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-restricted-editing/src/standardeditingmodeediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-restricted-editing/src/standardeditingmodeui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-restricted-editing/theme/icons/contentunlock.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-restricted-editing/theme/restrictedediting.css?c607","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/converters/tableproperties.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/utils/common.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/converters/upcasttable.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablewalker.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/converters/downcast.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/commands/inserttablecommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/commands/insertrowcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/commands/insertcolumncommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/commands/splitcellcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/utils/structure.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/commands/mergecellcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/commands/removerowcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/commands/removecolumncommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/commands/setheaderrowcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/commands/setheadercolumncommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tableutils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/commands/mergecellscommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/commands/selectrowcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/commands/selectcolumncommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/converters/table-layout-post-fixer.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/converters/table-cell-paragraph-post-fixer.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/converters/table-cell-refresh-handler.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/tableediting.css?183a","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tableediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/converters/table-headings-refresh-handler.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/inserttable.css?8f02","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/ui/inserttableview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tableui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/icons/table.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/icons/table-column.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/icons/table-row.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/icons/table-merge-cell.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/tableselection.css?52d0","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tableselection.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tableclipboard.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablekeyboard.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablemouse/mouseeventsobserver.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablemouse.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/table.css?7a76","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/colorinput.css?a66f","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/ui/colorinputview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/utils/ui/table-properties.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/formrow.css?e9c9","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/ui/formrowview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/form.css?9b02","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/tableform.css?4fab","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/tablecellproperties.css?861e","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/ui/tablecellpropertiesview.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/utils/ui/widget.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/utils/ui/contextualballoon.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/utils/table-properties.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/tablecellpropertiesui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/icons/table-cell-properties.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellpropertycommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablecellwidth/commands/tablecellwidthcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablecellwidth/tablecellwidthediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellpaddingcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellheightcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellbackgroundcolorcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellverticalalignmentcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellhorizontalalignmentcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellborderstylecommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellbordercolorcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellborderwidthcommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/tablecellpropertiesediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablecolumnresize/constants.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablecolumnresize/utils.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablecolumnresize/tablewidthscommand.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablecolumnresize/tablecolumnresizeediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablecolumnresize/converters.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/theme/tablecolumnresize.css?9b35","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineediting.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/underline.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineui.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-word-count/src/utils.js","webpack://ClassicEditor/./src/plugins/placeholder/placeholdercommand.js","webpack://ClassicEditor/./src/plugins/placeholder/theme/placeholder.css?8114","webpack://ClassicEditor/./src/plugins/placeholder/placeholderediting.js","webpack://ClassicEditor/./src/plugins/placeholder/placeholderui.js","webpack://ClassicEditor/./src/ckeditor.js","webpack://ClassicEditor/./src/plugins/Fullscreen/fullscreen.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-alignment/src/alignment.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-block-quote/src/blockquote.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-basic-styles/src/bold.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-cloud-services/src/cloudservices.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-code-block/src/codeblock.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-essentials/src/essentials.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-find-and-replace/src/findandreplace.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-font/src/fontcolor.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-font/src/fontsize.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-heading/src/heading.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-horizontal-line/src/horizontalline.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/image.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imagecaption.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imageinsert.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imageresize.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imagestyle.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-image/src/imagetoolbar.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-indent/src/indent.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-basic-styles/src/italic.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/src/link.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-link/src/linkimage.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/src/list.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-list/src/listproperties.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-media-embed/src/mediaembed.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-mention/src/mention.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-page-break/src/pagebreak.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-paste-from-office/src/pastefromoffice.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-remove-format/src/removeformat.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-source-editing/theme/icons/source-editing.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-special-characters/theme/icons/specialcharacters.svg","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-special-characters/src/specialcharactersessentials.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-restricted-editing/src/standardeditingmode.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/table.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tablecolumnresize.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-table/src/tabletoolbar.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-basic-styles/src/underline.js","webpack://ClassicEditor/./node_modules/@ckeditor/ckeditor5-word-count/src/wordcount.js","webpack://ClassicEditor/./src/plugins/placeholder/placeholder.js","node_modules/dompurify/dist/purify.min.js","node_modules/flatpickr/dist/flatpickr.min.js","addon-tree-output/@bagaar/ember-permissions/helpers/can-access-route.js","addon-tree-output/@bagaar/ember-permissions/helpers/has-permissions.js","addon-tree-output/@bagaar/ember-permissions/services/permissions.js","addon-tree-output/@ember-data/adapter/-private.js","addon-tree-output/@ember-data/adapter/error.js","addon-tree-output/@ember-data/adapter/index.js","addon-tree-output/@ember-data/adapter/json-api.js","addon-tree-output/@ember-data/adapter/rest.js","addon-tree-output/@ember-data/canary-features/default-features.js","addon-tree-output/@ember-data/canary-features/index.js","addon-tree-output/@ember-data/debug/index.js","addon-tree-output/@ember-data/debug/setup.js","addon-tree-output/@ember-data/model/-private.js","addon-tree-output/@ember-data/model/index.js","addon-tree-output/@ember-data/private-build-infra/available-packages.js","addon-tree-output/@ember-data/private-build-infra/current-deprecations.js","addon-tree-output/@ember-data/private-build-infra/debugging.js","addon-tree-output/@ember-data/private-build-infra/deprecations.js","addon-tree-output/@ember-data/private-build-infra/index.js","addon-tree-output/@ember-data/record-data/-private.js","addon-tree-output/@ember-data/serializer/-private.js","addon-tree-output/@ember-data/serializer/embedded-records-mixin-d75385ff.js","addon-tree-output/@ember-data/serializer/index.js","addon-tree-output/@ember-data/serializer/json-api.js","addon-tree-output/@ember-data/serializer/json.js","addon-tree-output/@ember-data/serializer/rest.js","addon-tree-output/@ember-data/serializer/transform.js","addon-tree-output/@ember-data/store/-private.js","addon-tree-output/@ember-data/store/index.js","addon-tree-output/@ember-data/tracking/-private.js","addon-tree-output/@ember-data/tracking/index.js","addon-tree-output/@ember/render-modifiers/modifiers/did-insert.js","addon-tree-output/@ember/render-modifiers/modifiers/did-update.js","addon-tree-output/@ember/render-modifiers/modifiers/will-destroy.js","addon-tree-output/@ember/string/cache.js","addon-tree-output/@ember/string/index.js","addon-tree-output/@ember/test-waiters/build-waiter.js","addon-tree-output/@ember/test-waiters/index.js","addon-tree-output/@ember/test-waiters/token.js","addon-tree-output/@ember/test-waiters/types/index.js","addon-tree-output/@ember/test-waiters/wait-for-promise.js","addon-tree-output/@ember/test-waiters/wait-for.js","addon-tree-output/@ember/test-waiters/waiter-manager.js","addon-tree-output/@embroider/macros/es-compat.js","addon-tree-output/@embroider/macros/runtime.js","addon-tree-output/@embroider/util/ember-private-api.js","addon-tree-output/@embroider/util/index.js","addon-tree-output/@embroider/util/services/ensure-registered.js","addon-tree-output/@glimmer/component/-private/base-component-manager.js","addon-tree-output/@glimmer/component/-private/component.js","addon-tree-output/@glimmer/component/-private/destroyables.js","addon-tree-output/@glimmer/component/-private/ember-component-manager.js","addon-tree-output/@glimmer/component/-private/owner.js","addon-tree-output/@glimmer/component/index.js","addon-tree-output/ember-cached-decorator-polyfill/index.js","addon-tree-output/ember-cli-app-version/initializer-factory.js","addon-tree-output/ember-cli-app-version/utils/regexp.js","addon-tree-output/ember-code-snippet/-private/extension.js","addon-tree-output/ember-code-snippet/-private/get-snippet.js","addon-tree-output/ember-code-snippet/-private/language.js","addon-tree-output/ember-code-snippet/-private/unindent.js","addon-tree-output/ember-code-snippet/helpers/get-code-snippet.js","addon-tree-output/ember-code-snippet/index.js","addon-tree-output/ember-code-snippet/snippets.js","addon-tree-output/ember-concurrency/-private/async-arrow-runtime.js","addon-tree-output/ember-concurrency/-private/cancelable-promise-helpers.js","addon-tree-output/ember-concurrency/-private/ember-environment.js","addon-tree-output/ember-concurrency/-private/external/environment.js","addon-tree-output/ember-concurrency/-private/external/generator-state.js","addon-tree-output/ember-concurrency/-private/external/scheduler/policies/bounded-policy.js","addon-tree-output/ember-concurrency/-private/external/scheduler/policies/drop-policy.js","addon-tree-output/ember-concurrency/-private/external/scheduler/policies/enqueued-policy.js","addon-tree-output/ember-concurrency/-private/external/scheduler/policies/execution-states.js","addon-tree-output/ember-concurrency/-private/external/scheduler/policies/keep-latest-policy.js","addon-tree-output/ember-concurrency/-private/external/scheduler/policies/restartable-policy.js","addon-tree-output/ember-concurrency/-private/external/scheduler/policies/unbounded-policy.js","addon-tree-output/ember-concurrency/-private/external/scheduler/refresh.js","addon-tree-output/ember-concurrency/-private/external/scheduler/scheduler.js","addon-tree-output/ember-concurrency/-private/external/scheduler/state-tracker/null-state-tracker.js","addon-tree-output/ember-concurrency/-private/external/scheduler/state-tracker/null-state.js","addon-tree-output/ember-concurrency/-private/external/scheduler/state-tracker/state-tracker.js","addon-tree-output/ember-concurrency/-private/external/scheduler/state-tracker/state.js","addon-tree-output/ember-concurrency/-private/external/task-decorators.js","addon-tree-output/ember-concurrency/-private/external/task-factory.js","addon-tree-output/ember-concurrency/-private/external/task-instance/base.js","addon-tree-output/ember-concurrency/-private/external/task-instance/cancelation.js","addon-tree-output/ember-concurrency/-private/external/task-instance/completion-states.js","addon-tree-output/ember-concurrency/-private/external/task-instance/executor.js","addon-tree-output/ember-concurrency/-private/external/task-instance/initial-state.js","addon-tree-output/ember-concurrency/-private/external/task/default-state.js","addon-tree-output/ember-concurrency/-private/external/task/task-group.js","addon-tree-output/ember-concurrency/-private/external/task/task.js","addon-tree-output/ember-concurrency/-private/external/task/taskable.js","addon-tree-output/ember-concurrency/-private/external/yieldables.js","addon-tree-output/ember-concurrency/-private/helpers.js","addon-tree-output/ember-concurrency/-private/scheduler/ember-scheduler.js","addon-tree-output/ember-concurrency/-private/task-decorators.js","addon-tree-output/ember-concurrency/-private/task-factory.js","addon-tree-output/ember-concurrency/-private/task-group.js","addon-tree-output/ember-concurrency/-private/task-instance.js","addon-tree-output/ember-concurrency/-private/task-properties.js","addon-tree-output/ember-concurrency/-private/task-public-api.js","addon-tree-output/ember-concurrency/-private/task.js","addon-tree-output/ember-concurrency/-private/taskable-mixin.js","addon-tree-output/ember-concurrency/-private/tracked-state.js","addon-tree-output/ember-concurrency/-private/utils.js","addon-tree-output/ember-concurrency/-private/wait-for.js","addon-tree-output/ember-concurrency/-task-instance.js","addon-tree-output/ember-concurrency/-task-property.js","addon-tree-output/ember-concurrency/helpers/cancel-all.js","addon-tree-output/ember-concurrency/helpers/perform.js","addon-tree-output/ember-concurrency/helpers/task.js","addon-tree-output/ember-concurrency/index.js","addon-tree-output/ember-cookies/services/cookies.js","addon-tree-output/ember-cookies/utils/serialize-cookie.js","addon-tree-output/ember-data/-private.js","addon-tree-output/ember-data/adapter.js","addon-tree-output/ember-data/adapters/errors.js","addon-tree-output/ember-data/adapters/json-api.js","addon-tree-output/ember-data/adapters/rest.js","addon-tree-output/ember-data/attr.js","addon-tree-output/ember-data/index.js","addon-tree-output/ember-data/model.js","addon-tree-output/ember-data/relationships.js","addon-tree-output/ember-data/serializer.js","addon-tree-output/ember-data/serializers/embedded-records-mixin.js","addon-tree-output/ember-data/serializers/json-api.js","addon-tree-output/ember-data/serializers/json.js","addon-tree-output/ember-data/serializers/rest.js","addon-tree-output/ember-data/setup-container.js","addon-tree-output/ember-data/store.js","addon-tree-output/ember-data/transform.js","addon-tree-output/ember-data/version.js","addon-tree-output/ember-event-helpers/helpers/prevent-default.js","addon-tree-output/ember-event-helpers/helpers/stop-propagation.js","addon-tree-output/ember-fetch/errors.js","addon-tree-output/ember-fetch/types.js","addon-tree-output/ember-fetch/utils/determine-body-promise.js","addon-tree-output/ember-fetch/utils/mung-options-for-fetch.js","addon-tree-output/ember-fetch/utils/serialize-query-params.js","addon-tree-output/ember-inflector/index.js","addon-tree-output/ember-inflector/lib/helpers/pluralize.js","addon-tree-output/ember-inflector/lib/helpers/singularize.js","addon-tree-output/ember-inflector/lib/system.js","addon-tree-output/ember-inflector/lib/system/inflections.js","addon-tree-output/ember-inflector/lib/system/inflector.js","addon-tree-output/ember-inflector/lib/system/string.js","addon-tree-output/ember-inflector/lib/utils/make-helper.js","addon-tree-output/ember-load-initializers/index.js","addon-tree-output/ember-page-title/helpers/page-title.js","addon-tree-output/ember-page-title/services/page-title-list.js","addon-tree-output/ember-page-title/services/page-title.js","addon-tree-output/ember-prism/components/code-block.js","addon-tree-output/ember-prism/components/code-inline.js","addon-tree-output/ember-prism/index.js","addon-tree-output/ember-resolver/features.js","addon-tree-output/ember-resolver/index.js","addon-tree-output/ember-resolver/resolver.js","addon-tree-output/ember-resolver/resolvers/classic/container-debug-adapter.js","addon-tree-output/ember-resolver/resolvers/classic/index.js","addon-tree-output/ember-resolver/utils/class-factory.js","addon-tree-output/ember-simple-auth/-internals/routing.js","addon-tree-output/ember-simple-auth/authenticators/base.js","addon-tree-output/ember-simple-auth/authenticators/devise.js","addon-tree-output/ember-simple-auth/authenticators/oauth2-implicit-grant.js","addon-tree-output/ember-simple-auth/authenticators/oauth2-password-grant.js","addon-tree-output/ember-simple-auth/authenticators/test.js","addon-tree-output/ember-simple-auth/authenticators/torii.js","addon-tree-output/ember-simple-auth/configuration.js","addon-tree-output/ember-simple-auth/initializers/setup-session-restoration.js","addon-tree-output/ember-simple-auth/initializers/setup-session.js","addon-tree-output/ember-simple-auth/internal-session.js","addon-tree-output/ember-simple-auth/mixins/application-route-mixin.js","addon-tree-output/ember-simple-auth/mixins/authenticated-route-mixin.js","addon-tree-output/ember-simple-auth/mixins/data-adapter-mixin.js","addon-tree-output/ember-simple-auth/mixins/oauth2-implicit-grant-callback-route-mixin.js","addon-tree-output/ember-simple-auth/mixins/unauthenticated-route-mixin.js","addon-tree-output/ember-simple-auth/services/session.js","addon-tree-output/ember-simple-auth/session-stores/adaptive.js","addon-tree-output/ember-simple-auth/session-stores/base.js","addon-tree-output/ember-simple-auth/session-stores/cookie.js","addon-tree-output/ember-simple-auth/session-stores/ephemeral.js","addon-tree-output/ember-simple-auth/session-stores/local-storage.js","addon-tree-output/ember-simple-auth/session-stores/session-storage.js","addon-tree-output/ember-simple-auth/use-session-setup-method.js","addon-tree-output/ember-simple-auth/utils/assign.js","addon-tree-output/ember-simple-auth/utils/inject.js","addon-tree-output/ember-simple-auth/utils/is-fastboot.js","addon-tree-output/ember-simple-auth/utils/location.js","addon-tree-output/ember-simple-auth/utils/objects-are-equal.js","addon-tree-output/ember-test-waiters/index.js","addon-tree-output/ember-tracked-storage-polyfill/index.js","addon-tree-output/ember-truth-helpers/helpers/and.js","addon-tree-output/ember-truth-helpers/helpers/eq.js","addon-tree-output/ember-truth-helpers/helpers/equal.js","addon-tree-output/ember-truth-helpers/helpers/gt.js","addon-tree-output/ember-truth-helpers/helpers/gte.js","addon-tree-output/ember-truth-helpers/helpers/is-array.js","addon-tree-output/ember-truth-helpers/helpers/is-empty.js","addon-tree-output/ember-truth-helpers/helpers/is-equal.js","addon-tree-output/ember-truth-helpers/helpers/lt.js","addon-tree-output/ember-truth-helpers/helpers/lte.js","addon-tree-output/ember-truth-helpers/helpers/not-eq.js","addon-tree-output/ember-truth-helpers/helpers/not-equal.js","addon-tree-output/ember-truth-helpers/helpers/not.js","addon-tree-output/ember-truth-helpers/helpers/or.js","addon-tree-output/ember-truth-helpers/helpers/xor.js","addon-tree-output/ember-truth-helpers/utils/truth-convert.js","addon-tree-output/ember-uuid/index.js","addon-tree-output/ember-uuid/utils/browser-rng.js","addon-tree-output/ember-uuid/utils/uuid-generator.js","addon-tree-output/ember-websockets/helpers.js","addon-tree-output/ember-websockets/helpers/socketio-proxy.js","addon-tree-output/ember-websockets/helpers/websocket-proxy.js","addon-tree-output/ember-websockets/services/socket-io.js","addon-tree-output/ember-websockets/services/websockets.js","addon-tree-output/tracked-built-ins/-private/array.js","addon-tree-output/tracked-built-ins/-private/decorator.js","addon-tree-output/tracked-built-ins/-private/map.js","addon-tree-output/tracked-built-ins/-private/object.js","addon-tree-output/tracked-built-ins/-private/set.js","addon-tree-output/tracked-built-ins/index.js","vendor/ember-cli/vendor-suffix.js"],"sourcesContent":["window.EmberENV = (function(EmberENV, extra) {\n  for (var key in extra) {\n    EmberENV[key] = extra[key];\n  }\n\n  return EmberENV;\n})(window.EmberENV || {}, {\"EXTEND_PROTOTYPES\":false,\"FEATURES\":{},\"_APPLICATION_TEMPLATE_WRAPPER\":false,\"_DEFAULT_ASYNC_OBSERVERS\":true,\"_JQUERY_INTEGRATION\":false,\"_TEMPLATE_ONLY_GLIMMER_COMPONENTS\":true});\n\n// used to determine if the application should be booted immediately when `app-name.js` is evaluated\n// when `runningTests` the `app-name.js` file will **not** import the applications `app/app.js` and\n// call `Application.create(...)` on it. Additionally, applications can opt-out of this behavior by\n// setting `autoRun` to `false` in their `ember-cli-build.js`\n//\n// The default `test-support.js` file will set this to `true` when it runs (so that Application.create()\n// is not ran when running tests).\nvar runningTests = false;\n\n\n","var loader, define, requireModule, require, requirejs;\n\n(function (global) {\n  'use strict';\n\n  function dict() {\n    var obj = Object.create(null);\n    obj['__'] = undefined;\n    delete obj['__'];\n    return obj;\n  }\n\n  // Save off the original values of these globals, so we can restore them if someone asks us to\n  var oldGlobals = {\n    loader: loader,\n    define: define,\n    requireModule: requireModule,\n    require: require,\n    requirejs: requirejs\n  };\n\n  requirejs = require = requireModule = function (id) {\n    var pending = [];\n    var mod = findModule(id, '(require)', pending);\n\n    for (var i = pending.length - 1; i >= 0; i--) {\n      pending[i].exports();\n    }\n\n    return mod.module.exports;\n  };\n\n  loader = {\n    noConflict: function (aliases) {\n      var oldName, newName;\n\n      for (oldName in aliases) {\n        if (aliases.hasOwnProperty(oldName)) {\n          if (oldGlobals.hasOwnProperty(oldName)) {\n            newName = aliases[oldName];\n\n            global[newName] = global[oldName];\n            global[oldName] = oldGlobals[oldName];\n          }\n        }\n      }\n    },\n    // Option to enable or disable the generation of default exports\n    makeDefaultExport: true\n  };\n\n  var registry = dict();\n  var seen = dict();\n\n  var uuid = 0;\n\n  function unsupportedModule(length) {\n    throw new Error('an unsupported module was defined, expected `define(id, deps, module)` instead got: `' + length + '` arguments to define`');\n  }\n\n  var defaultDeps = ['require', 'exports', 'module'];\n\n  function Module(id, deps, callback, alias) {\n    this.uuid = uuid++;\n    this.id = id;\n    this.deps = !deps.length && callback.length ? defaultDeps : deps;\n    this.module = { exports: {} };\n    this.callback = callback;\n    this.hasExportsAsDep = false;\n    this.isAlias = alias;\n    this.reified = new Array(deps.length);\n\n    /*\n       Each module normally passes through these states, in order:\n         new       : initial state\n         pending   : this module is scheduled to be executed\n         reifying  : this module's dependencies are being executed\n         reified   : this module's dependencies finished executing successfully\n         errored   : this module's dependencies failed to execute\n         finalized : this module executed successfully\n     */\n    this.state = 'new';\n  }\n\n  Module.prototype.makeDefaultExport = function () {\n    var exports = this.module.exports;\n    if (exports !== null && (typeof exports === 'object' || typeof exports === 'function') && exports['default'] === undefined && Object.isExtensible(exports)) {\n      exports['default'] = exports;\n    }\n  };\n\n  Module.prototype.exports = function () {\n    // if finalized, there is no work to do. If reifying, there is a\n    // circular dependency so we must return our (partial) exports.\n    if (this.state === 'finalized' || this.state === 'reifying') {\n      return this.module.exports;\n    }\n\n\n    if (loader.wrapModules) {\n      this.callback = loader.wrapModules(this.id, this.callback);\n    }\n\n    this.reify();\n\n    var result = this.callback.apply(this, this.reified);\n    this.reified.length = 0;\n    this.state = 'finalized';\n\n    if (!(this.hasExportsAsDep && result === undefined)) {\n      this.module.exports = result;\n    }\n    if (loader.makeDefaultExport) {\n      this.makeDefaultExport();\n    }\n    return this.module.exports;\n  };\n\n  Module.prototype.unsee = function () {\n    this.state = 'new';\n    this.module = { exports: {} };\n  };\n\n  Module.prototype.reify = function () {\n    if (this.state === 'reified') {\n      return;\n    }\n    this.state = 'reifying';\n    try {\n      this.reified = this._reify();\n      this.state = 'reified';\n    } finally {\n      if (this.state === 'reifying') {\n        this.state = 'errored';\n      }\n    }\n  };\n\n  Module.prototype._reify = function () {\n    var reified = this.reified.slice();\n    for (var i = 0; i < reified.length; i++) {\n      var mod = reified[i];\n      reified[i] = mod.exports ? mod.exports : mod.module.exports();\n    }\n    return reified;\n  };\n\n  Module.prototype.findDeps = function (pending) {\n    if (this.state !== 'new') {\n      return;\n    }\n\n    this.state = 'pending';\n\n    var deps = this.deps;\n\n    for (var i = 0; i < deps.length; i++) {\n      var dep = deps[i];\n      var entry = this.reified[i] = { exports: undefined, module: undefined };\n      if (dep === 'exports') {\n        this.hasExportsAsDep = true;\n        entry.exports = this.module.exports;\n      } else if (dep === 'require') {\n        entry.exports = this.makeRequire();\n      } else if (dep === 'module') {\n        entry.exports = this.module;\n      } else {\n        entry.module = findModule(resolve(dep, this.id), this.id, pending);\n      }\n    }\n  };\n\n  Module.prototype.makeRequire = function () {\n    var id = this.id;\n    var r = function (dep) {\n      return require(resolve(dep, id));\n    };\n    r['default'] = r;\n    r.moduleId = id;\n    r.has = function (dep) {\n      return has(resolve(dep, id));\n    };\n    return r;\n  };\n\n  define = function (id, deps, callback) {\n    var module = registry[id];\n\n    // If a module for this id has already been defined and is in any state\n    // other than `new` (meaning it has been or is currently being required),\n    // then we return early to avoid redefinition.\n    if (module && module.state !== 'new') {\n      return;\n    }\n\n    if (arguments.length < 2) {\n      unsupportedModule(arguments.length);\n    }\n\n    if (!Array.isArray(deps)) {\n      callback = deps;\n      deps = [];\n    }\n\n    if (callback instanceof Alias) {\n      registry[id] = new Module(callback.id, deps, callback, true);\n    } else {\n      registry[id] = new Module(id, deps, callback, false);\n    }\n  };\n\n  define.exports = function (name, defaultExport) {\n    var module = registry[name];\n\n    // If a module for this name has already been defined and is in any state\n    // other than `new` (meaning it has been or is currently being required),\n    // then we return early to avoid redefinition.\n    if (module && module.state !== 'new') {\n      return;\n    }\n\n    module = new Module(name, [], noop, null);\n    module.module.exports = defaultExport;\n    module.state = 'finalized';\n    registry[name] = module;\n\n    return module;\n  };\n\n  function noop() {}\n  // we don't support all of AMD\n  // define.amd = {};\n\n  function Alias(id) {\n    this.id = id;\n  }\n\n  define.alias = function (id, target) {\n    if (arguments.length === 2) {\n      return define(target, new Alias(id));\n    }\n\n    return new Alias(id);\n  };\n\n  function missingModule(id, referrer) {\n    throw new Error('Could not find module `' + id + '` imported from `' + referrer + '`');\n  }\n\n  function findModule(id, referrer, pending) {\n    var mod = registry[id] || registry[id + '/index'];\n\n    while (mod && mod.isAlias) {\n      mod = registry[mod.id] || registry[mod.id + '/index'];\n    }\n\n    if (!mod) {\n      missingModule(id, referrer);\n    }\n\n    if (pending && mod.state !== 'pending' && mod.state !== 'finalized') {\n      mod.findDeps(pending);\n      pending.push(mod);\n    }\n    return mod;\n  }\n\n  function resolve(child, id) {\n    if (child.charAt(0) !== '.') {\n      return child;\n    }\n\n\n    var parts = child.split('/');\n    var nameParts = id.split('/');\n    var parentBase = nameParts.slice(0, -1);\n\n    for (var i = 0, l = parts.length; i < l; i++) {\n      var part = parts[i];\n\n      if (part === '..') {\n        if (parentBase.length === 0) {\n          throw new Error('Cannot access parent module of root');\n        }\n        parentBase.pop();\n      } else if (part === '.') {\n        continue;\n      } else {\n        parentBase.push(part);\n      }\n    }\n\n    return parentBase.join('/');\n  }\n\n  function has(id) {\n    return !!(registry[id] || registry[id + '/index']);\n  }\n\n  requirejs.entries = requirejs._eak_seen = registry;\n  requirejs.has = has;\n  requirejs.unsee = function (id) {\n    findModule(id, '(unsee)', false).unsee();\n  };\n\n  requirejs.clear = function () {\n    requirejs.entries = requirejs._eak_seen = registry = dict();\n    seen = dict();\n  };\n\n  // This code primes the JS engine for good performance by warming the\n  // JIT compiler for these functions.\n  define('foo', function () {});\n  define('foo/bar', [], function () {});\n  define('foo/asdf', ['module', 'exports', 'require'], function (module, exports, require) {\n    if (require.has('foo/bar')) {\n      require('foo/bar');\n    }\n  });\n  define('foo/baz', [], define.alias('foo'));\n  define('foo/quz', define.alias('foo'));\n  define.alias('foo', 'foo/qux');\n  define('foo/bar', ['foo', './quz', './baz', './asdf', './bar', '../foo'], function () {});\n  define('foo/main', ['foo/bar'], function () {});\n  define.exports('foo/exports', {});\n\n  require('foo/exports');\n  require('foo/main');\n  require.unsee('foo/bar');\n\n  requirejs.clear();\n\n  if (typeof exports === 'object' && typeof module === 'object' && module.exports) {\n    module.exports = { require: require, define: define };\n  }\n})(this);","/*!\n * jQuery JavaScript Library v3.7.1\n * https://jquery.com/\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2023-08-28T13:37Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket trac-14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n\t\t// Support: Chrome <=57, Firefox <=52\n\t\t// In some browsers, typeof returns \"function\" for HTML <object> elements\n\t\t// (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n\t\t// We don't want to classify *any* DOM node as a function.\n\t\t// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5\n\t\t// Plus for old WebKit, typeof returns \"function\" for HTML collections\n\t\t// (e.g., `typeof document.getElementsByTagName(\"div\") === \"function\"`). (gh-4756)\n\t\treturn typeof obj === \"function\" && typeof obj.nodeType !== \"number\" &&\n\t\t\ttypeof obj.item !== \"function\";\n\t};\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar version = \"3.7.1\",\n\n\trhtmlSuffix = /HTML$/i,\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\n\t// Retrieve the text value of an array of DOM nodes\n\ttext: function( elem ) {\n\t\tvar node,\n\t\t\tret = \"\",\n\t\t\ti = 0,\n\t\t\tnodeType = elem.nodeType;\n\n\t\tif ( !nodeType ) {\n\n\t\t\t// If no nodeType, this is expected to be an array\n\t\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t\t// Do not traverse comment nodes\n\t\t\t\tret += jQuery.text( node );\n\t\t\t}\n\t\t}\n\t\tif ( nodeType === 1 || nodeType === 11 ) {\n\t\t\treturn elem.textContent;\n\t\t}\n\t\tif ( nodeType === 9 ) {\n\t\t\treturn elem.documentElement.textContent;\n\t\t}\n\t\tif ( nodeType === 3 || nodeType === 4 ) {\n\t\t\treturn elem.nodeValue;\n\t\t}\n\n\t\t// Do not include comment or processing instruction nodes\n\n\t\treturn ret;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\tisXMLDoc: function( elem ) {\n\t\tvar namespace = elem && elem.namespaceURI,\n\t\t\tdocElem = elem && ( elem.ownerDocument || elem ).documentElement;\n\n\t\t// Assume HTML when documentElement doesn't yet exist, such as inside\n\t\t// document fragments.\n\t\treturn !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n\tfunction( _i, name ) {\n\t\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n\t} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\n\n\nfunction nodeName( elem, name ) {\n\n\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n}\nvar pop = arr.pop;\n\n\nvar sort = arr.sort;\n\n\nvar splice = arr.splice;\n\n\nvar whitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\";\n\n\nvar rtrimCSS = new RegExp(\n\t\"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\",\n\t\"g\"\n);\n\n\n\n\n// Note: an element does not contain itself\njQuery.contains = function( a, b ) {\n\tvar bup = b && b.parentNode;\n\n\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\n\t\t// Support: IE 9 - 11+\n\t\t// IE doesn't have `contains` on SVG.\n\t\ta.contains ?\n\t\t\ta.contains( bup ) :\n\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t) );\n};\n\n\n\n\n// CSS string/identifier serialization\n// https://drafts.csswg.org/cssom/#common-serializing-idioms\nvar rcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\x80-\\uFFFF\\w-]/g;\n\nfunction fcssescape( ch, asCodePoint ) {\n\tif ( asCodePoint ) {\n\n\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\tif ( ch === \"\\0\" ) {\n\t\t\treturn \"\\uFFFD\";\n\t\t}\n\n\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\treturn ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t}\n\n\t// Other potentially-special ASCII characters get backslash-escaped\n\treturn \"\\\\\" + ch;\n}\n\njQuery.escapeSelector = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\n\n\n\nvar preferredDoc = document,\n\tpushNative = push;\n\n( function() {\n\nvar i,\n\tExpr,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\tpush = pushNative,\n\n\t// Local document vars\n\tdocument,\n\tdocumentElement,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\tmatches,\n\n\t// Instance-specific data\n\texpando = jQuery.expando,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|\" +\n\t\t\"loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trleadingCombinator = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" +\n\t\twhitespace + \"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\tID: new RegExp( \"^#(\" + identifier + \")\" ),\n\t\tCLASS: new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\tTAG: new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\tATTR: new RegExp( \"^\" + attributes ),\n\t\tPSEUDO: new RegExp( \"^\" + pseudos ),\n\t\tCHILD: new RegExp(\n\t\t\t\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\tbool: new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\tneedsContext: new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// https://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\tif ( nonHex ) {\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\treturn nonHex;\n\t\t}\n\n\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t// Support: IE <=11+\n\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t// surrogate pair\n\t\treturn high < 0 ?\n\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// Used for iframes; see `setDocument`.\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE/Edge.\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && nodeName( elem, \"fieldset\" );\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android <=4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = {\n\t\tapply: function( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t},\n\t\tcall: function( target ) {\n\t\t\tpushNative.apply( target, slice.call( arguments, 1 ) );\n\t\t}\n\t};\n}\n\nfunction find( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE 9 only\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE 9 only\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tfind.contains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( !nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when\n\t\t\t\t\t// strict-comparing two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( newContext != context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = jQuery.escapeSelector( nid );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrimCSS, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties\n\t\t// (see https://github.com/jquery/sizzle/issues/157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by jQuery selector module\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\treturn nodeName( elem, \"input\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\treturn ( nodeName( elem, \"input\" ) || nodeName( elem, \"button\" ) ) &&\n\t\t\telem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11+\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a jQuery selector context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [node] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nfunction setDocument( node ) {\n\tvar subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocumentElement = document.documentElement;\n\tdocumentIsHTML = !jQuery.isXMLDoc( document );\n\n\t// Support: iOS 7 only, IE 9 - 11+\n\t// Older browsers didn't support unprefixed `matches`.\n\tmatches = documentElement.matches ||\n\t\tdocumentElement.webkitMatchesSelector ||\n\t\tdocumentElement.msMatchesSelector;\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors\n\t// (see trac-13936).\n\t// Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`,\n\t// all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well.\n\tif ( documentElement.msMatchesSelector &&\n\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tpreferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t\tsubWindow.addEventListener( \"unload\", unloadHandler );\n\t}\n\n\t// Support: IE <10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocumentElement.appendChild( el ).id = jQuery.expando;\n\t\treturn !document.getElementsByName ||\n\t\t\t!document.getElementsByName( jQuery.expando ).length;\n\t} );\n\n\t// Support: IE 9 only\n\t// Check to see if it's possible to do matchesSelector\n\t// on a disconnected node.\n\tsupport.disconnectedMatch = assert( function( el ) {\n\t\treturn matches.call( el, \"*\" );\n\t} );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// IE/Edge don't support the :scope pseudo-class.\n\tsupport.scope = assert( function() {\n\t\treturn document.querySelectorAll( \":scope\" );\n\t} );\n\n\t// Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only\n\t// Make sure the `:has()` argument is parsed unforgivingly.\n\t// We include `*` in the test to detect buggy implementations that are\n\t// _selectively_ forgiving (specifically when the list includes at least\n\t// one valid selector).\n\t// Note that we treat complete lack of support for `:has()` as if it were\n\t// spec-compliant support, which is fine because use of `:has()` in such\n\t// environments will fail in the qSA path and fall back to jQuery traversal\n\t// anyway.\n\tsupport.cssHas = assert( function() {\n\t\ttry {\n\t\t\tdocument.querySelector( \":has(*,:jqfake)\" );\n\t\t\treturn false;\n\t\t} catch ( e ) {\n\t\t\treturn true;\n\t\t}\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter.ID = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find.ID = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter.ID =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find.ID = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find.TAG = function( tag, context ) {\n\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t// DocumentFragment nodes don't have gEBTN\n\t\t} else {\n\t\t\treturn context.querySelectorAll( tag );\n\t\t}\n\t};\n\n\t// Class\n\tExpr.find.CLASS = function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\trbuggyQSA = [];\n\n\t// Build QSA regex\n\t// Regex strategy adopted from Diego Perini\n\tassert( function( el ) {\n\n\t\tvar input;\n\n\t\tdocumentElement.appendChild( el ).innerHTML =\n\t\t\t\"<a id='\" + expando + \"' href='' disabled='disabled'></a>\" +\n\t\t\t\"<select id='\" + expando + \"-\\r\\\\' disabled='disabled'>\" +\n\t\t\t\"<option selected=''></option></select>\";\n\n\t\t// Support: iOS <=7 - 8 only\n\t\t// Boolean attributes and \"value\" are not treated correctly in some XML documents\n\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t}\n\n\t\t// Support: iOS <=7 - 8 only\n\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\trbuggyQSA.push( \"~=\" );\n\t\t}\n\n\t\t// Support: iOS 8 only\n\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t}\n\n\t\t// Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+\n\t\t// In some of the document kinds, these selectors wouldn't work natively.\n\t\t// This is probably OK but for backwards compatibility we want to maintain\n\t\t// handling them through jQuery traversal in jQuery 3.x.\n\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\trbuggyQSA.push( \":checked\" );\n\t\t}\n\n\t\t// Support: Windows 8 Native Apps\n\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\tinput = document.createElement( \"input\" );\n\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t// Support: IE 9 - 11+\n\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t// Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+\n\t\t// In some of the document kinds, these selectors wouldn't work natively.\n\t\t// This is probably OK but for backwards compatibility we want to maintain\n\t\t// handling them through jQuery traversal in jQuery 3.x.\n\t\tdocumentElement.appendChild( el ).disabled = true;\n\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t}\n\n\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t// Adding a temporary attribute to the document before the selection works\n\t\t// around the issue.\n\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\tinput = document.createElement( \"input\" );\n\t\tinput.setAttribute( \"name\", \"\" );\n\t\tel.appendChild( input );\n\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t}\n\t} );\n\n\tif ( !support.cssHas ) {\n\n\t\t// Support: Chrome 105 - 110+, Safari 15.4 - 16.3+\n\t\t// Our regular `try-catch` mechanism fails to detect natively-unsupported\n\t\t// pseudo-classes inside `:has()` (such as `:has(:contains(\"Foo\"))`)\n\t\t// in browsers that parse the `:has()` argument as a forgiving selector list.\n\t\t// https://drafts.csswg.org/selectors/#relational now requires the argument\n\t\t// to be parsed unforgivingly, but browsers have not yet fully adjusted.\n\t\trbuggyQSA.push( \":has\" );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = function( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a === document || a.ownerDocument == preferredDoc &&\n\t\t\t\tfind.contains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b === document || b.ownerDocument == preferredDoc &&\n\t\t\t\tfind.contains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t};\n\n\treturn document;\n}\n\nfind.matches = function( expr, elements ) {\n\treturn find( expr, null, null, elements );\n};\n\nfind.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn find( expr, document, null, [ elem ] ).length > 0;\n};\n\nfind.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn jQuery.contains( context, elem );\n};\n\n\nfind.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (see trac-13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\tif ( val !== undefined ) {\n\t\treturn val;\n\t}\n\n\treturn elem.getAttribute( name );\n};\n\nfind.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\njQuery.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\t//\n\t// Support: Android <=4.0+\n\t// Testing for detecting duplicates is unpredictable so instead assume we can't\n\t// depend on duplicate detection in all browsers without a stable sort.\n\thasDuplicate = !support.sortStable;\n\tsortInput = !support.sortStable && slice.call( results, 0 );\n\tsort.call( results, sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tsplice.call( results, duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\njQuery.fn.uniqueSort = function() {\n\treturn this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) );\n};\n\nExpr = jQuery.expr = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\tATTR: function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || \"\" )\n\t\t\t\t.replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\tCHILD: function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tfind.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" )\n\t\t\t\t);\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tfind.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\tPSEUDO: function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr.CHILD.test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\tTAG: function( nodeNameSelector ) {\n\t\t\tvar expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn nodeName( elem, expectedNodeName );\n\t\t\t\t};\n\t\t},\n\n\t\tCLASS: function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace + \")\" + className +\n\t\t\t\t\t\"(\" + whitespace + \"|$)\" ) ) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\tATTR: function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = find.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\tif ( operator === \"=\" ) {\n\t\t\t\t\treturn result === check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"!=\" ) {\n\t\t\t\t\treturn result !== check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"^=\" ) {\n\t\t\t\t\treturn check && result.indexOf( check ) === 0;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"*=\" ) {\n\t\t\t\t\treturn check && result.indexOf( check ) > -1;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"$=\" ) {\n\t\t\t\t\treturn check && result.slice( -check.length ) === check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"~=\" ) {\n\t\t\t\t\treturn ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" )\n\t\t\t\t\t\t.indexOf( check ) > -1;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"|=\" ) {\n\t\t\t\t\treturn result === check || result.slice( 0, check.length + 1 ) === check + \"-\";\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t};\n\t\t},\n\n\t\tCHILD: function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnodeName( node, name ) :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || ( parent[ expando ] = {} );\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\t\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnodeName( node, name ) :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\t\t\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\tPSEUDO: function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// https://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tfind.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as jQuery does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\tnot: markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrimCSS, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element\n\t\t\t\t\t// (see https://github.com/jquery/sizzle/issues/299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\thas: markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn find( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\tcontains: markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// https://www.w3.org/TR/selectors/#lang-pseudo\n\t\tlang: markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tfind.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\ttarget: function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\troot: function( elem ) {\n\t\t\treturn elem === documentElement;\n\t\t},\n\n\t\tfocus: function( elem ) {\n\t\t\treturn elem === safeActiveElement() &&\n\t\t\t\tdocument.hasFocus() &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\tenabled: createDisabledPseudo( false ),\n\t\tdisabled: createDisabledPseudo( true ),\n\n\t\tchecked: function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\treturn ( nodeName( elem, \"input\" ) && !!elem.checked ) ||\n\t\t\t\t( nodeName( elem, \"option\" ) && !!elem.selected );\n\t\t},\n\n\t\tselected: function( elem ) {\n\n\t\t\t// Support: IE <=11+\n\t\t\t// Accessing the selectedIndex property\n\t\t\t// forces the browser to treat the default option as\n\t\t\t// selected when in an optgroup.\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\tempty: function( elem ) {\n\n\t\t\t// https://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\tparent: function( elem ) {\n\t\t\treturn !Expr.pseudos.empty( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\theader: function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\tinput: function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\tbutton: function( elem ) {\n\t\t\treturn nodeName( elem, \"input\" ) && elem.type === \"button\" ||\n\t\t\t\tnodeName( elem, \"button\" );\n\t\t},\n\n\t\ttext: function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn nodeName( elem, \"input\" ) && elem.type === \"text\" &&\n\n\t\t\t\t// Support: IE <10 only\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear\n\t\t\t\t// with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\tfirst: createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\tlast: createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\teq: createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\teven: createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\todd: createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\tlt: createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i;\n\n\t\t\tif ( argument < 0 ) {\n\t\t\t\ti = argument + length;\n\t\t\t} else if ( argument > length ) {\n\t\t\t\ti = length;\n\t\t\t} else {\n\t\t\t\ti = argument;\n\t\t\t}\n\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\tgt: createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos.nth = Expr.pseudos.eq;\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rleadingCombinator.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrimCSS, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\tif ( parseOnly ) {\n\t\treturn soFar.length;\n\t}\n\n\treturn soFar ?\n\t\tfind.error( selector ) :\n\n\t\t// Cache the tokens\n\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\tif ( skip && nodeName( elem, skip ) ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = outerCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\touterCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tfind( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem, matcherOut,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed ||\n\t\t\t\tmultipleContexts( selector || \"*\",\n\t\t\t\t\tcontext.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems;\n\n\t\tif ( matcher ) {\n\n\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter\n\t\t\t// or preexisting results,\n\t\t\tmatcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t[] :\n\n\t\t\t\t// ...otherwise use results directly\n\t\t\t\tresults;\n\n\t\t\t// Find primary matches\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t} else {\n\t\t\tmatcherOut = matcherIn;\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tvar ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element\n\t\t\t// (see https://github.com/jquery/sizzle/issues/299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 )\n\t\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrimCSS, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find.TAG( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: iOS <=7 - 9 only\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching\n\t\t\t// elements by id. (see trac-14142)\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tjQuery.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\nfunction compile( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n}\n\n/**\n * A low-level selection function that works with jQuery's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with jQuery selector compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find.ID(\n\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\tcontext\n\t\t\t) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr.needsContext.test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) &&\n\t\t\t\t\t\ttestContext( context.parentNode ) || context\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n}\n\n// One-time assignments\n\n// Support: Android <=4.0 - 4.1+\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Android <=4.0 - 4.1+\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\njQuery.find = find;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.unique = jQuery.uniqueSort;\n\n// These have always been private, but they used to be documented as part of\n// Sizzle so let's maintain them for now for backwards compatibility purposes.\nfind.compile = compile;\nfind.select = select;\nfind.setDocument = setDocument;\nfind.tokenize = tokenize;\n\nfind.escape = jQuery.escapeSelector;\nfind.getText = jQuery.text;\nfind.isXML = jQuery.isXMLDoc;\nfind.selectors = jQuery.expr;\nfind.support = jQuery.support;\nfind.uniqueSort = jQuery.uniqueSort;\n\n\t/* eslint-enable */\n\n} )();\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521)\n\t// Strict HTML recognition (trac-11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to jQuery#find\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// <object> elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.error );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the error, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getErrorHook ) {\n\t\t\t\t\t\t\t\t\tprocess.error = jQuery.Deferred.getErrorHook();\n\n\t\t\t\t\t\t\t\t// The deprecated alias of the above. While the name suggests\n\t\t\t\t\t\t\t\t// returning the stack, not an error instance, jQuery just passes\n\t\t\t\t\t\t\t\t// it directly to `console.warn` so both will work; an instance\n\t\t\t\t\t\t\t\t// just better cooperates with source maps.\n\t\t\t\t\t\t\t\t} else if ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.error = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the primary Deferred\n\t\t\tprimary = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tprimary.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( primary.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn primary.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );\n\t\t}\n\n\t\treturn primary.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\n// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error\n// captured before the async barrier to get the original error cause\n// which may otherwise be hidden.\njQuery.Deferred.exceptionHook = function( error, asyncError ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message,\n\t\t\terror.stack, asyncError );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See trac-6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\t\tvalue :\n\t\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (trac-9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see trac-8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (trac-14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (trac-11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (trac-14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces <option> tags with their contents when inserted outside of\n\t// the select element.\n\tdiv.innerHTML = \"<option></option>\";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (trac-13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"<select multiple='multiple'>\", \"</select>\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (trac-15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (trac-12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar rtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (trac-13208)\n\t\t\t\t// Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (trac-13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", true );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, isSetup ) {\n\n\t// Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !isSetup ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\tif ( !saved ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tdataPriv.set( this, type, false );\n\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering\n\t\t\t\t// the native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, jQuery.event.trigger(\n\t\t\t\t\tsaved[ 0 ],\n\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\tthis\n\t\t\t\t) );\n\n\t\t\t\t// Abort handling of the native event by all jQuery handlers while allowing\n\t\t\t\t// native handlers on the same element to run. On target, this is achieved\n\t\t\t\t// by stopping immediate propagation just on the jQuery event. However,\n\t\t\t\t// the native event is re-wrapped by a jQuery one on each level of the\n\t\t\t\t// propagation so the only way to stop it for jQuery is to stop it for\n\t\t\t\t// everyone via native `stopPropagation()`. This is not a problem for\n\t\t\t\t// focus/blur which don't bubble, but it does also stop click on checkboxes\n\t\t\t\t// and radios. We accept this limitation.\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tevent.isImmediatePropagationStopped = returnTrue;\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (trac-504, trac-13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\twhich: true\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\n\tfunction focusMappedHandler( nativeEvent ) {\n\t\tif ( document.documentMode ) {\n\n\t\t\t// Support: IE 11+\n\t\t\t// Attach a single focusin/focusout handler on the document while someone wants\n\t\t\t// focus/blur. This is because the former are synchronous in IE while the latter\n\t\t\t// are async. In other browsers, all those handlers are invoked synchronously.\n\n\t\t\t// `handle` from private data would already wrap the event, but we need\n\t\t\t// to change the `type` here.\n\t\t\tvar handle = dataPriv.get( this, \"handle\" ),\n\t\t\t\tevent = jQuery.event.fix( nativeEvent );\n\t\t\tevent.type = nativeEvent.type === \"focusin\" ? \"focus\" : \"blur\";\n\t\t\tevent.isSimulated = true;\n\n\t\t\t// First, handle focusin/focusout\n\t\t\thandle( nativeEvent );\n\n\t\t\t// ...then, handle focus/blur\n\t\t\t//\n\t\t\t// focus/blur don't bubble while focusin/focusout do; simulate the former by only\n\t\t\t// invoking the handler at the lower level.\n\t\t\tif ( event.target === event.currentTarget ) {\n\n\t\t\t\t// The setup part calls `leverageNative`, which, in turn, calls\n\t\t\t\t// `jQuery.event.add`, so event handle will already have been set\n\t\t\t\t// by this point.\n\t\t\t\thandle( event );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// For non-IE browsers, attach a single capturing handler on the document\n\t\t\t// while someone wants focusin/focusout.\n\t\t\tjQuery.event.simulate( delegateType, nativeEvent.target,\n\t\t\t\tjQuery.event.fix( nativeEvent ) );\n\t\t}\n\t}\n\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\tvar attaches;\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, true );\n\n\t\t\tif ( document.documentMode ) {\n\n\t\t\t\t// Support: IE 9 - 11+\n\t\t\t\t// We use the same native handler for focusin & focus (and focusout & blur)\n\t\t\t\t// so we need to coordinate setup & teardown parts between those events.\n\t\t\t\t// Use `delegateType` as the key as `type` is already used by `leverageNative`.\n\t\t\t\tattaches = dataPriv.get( this, delegateType );\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tthis.addEventListener( delegateType, focusMappedHandler );\n\t\t\t\t}\n\t\t\t\tdataPriv.set( this, delegateType, ( attaches || 0 ) + 1 );\n\t\t\t} else {\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tvar attaches;\n\n\t\t\tif ( document.documentMode ) {\n\t\t\t\tattaches = dataPriv.get( this, delegateType ) - 1;\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tthis.removeEventListener( delegateType, focusMappedHandler );\n\t\t\t\t\tdataPriv.remove( this, delegateType );\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.set( this, delegateType, attaches );\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Return false to indicate standard teardown should be applied\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\t// Suppress native focus or blur if we're currently inside\n\t\t// a leveraged native-event stack\n\t\t_default: function( event ) {\n\t\t\treturn dataPriv.get( event.target, type );\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n\n\t// Support: Firefox <=44\n\t// Firefox doesn't have focus(in | out) events\n\t// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n\t//\n\t// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n\t// focus(in | out) events fire after focus & blur events,\n\t// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n\t// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\n\t//\n\t// Support: IE 9 - 11+\n\t// To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch,\n\t// attach a single handler for both events in IE.\n\tjQuery.event.special[ delegateType ] = {\n\t\tsetup: function() {\n\n\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\tdataHolder = document.documentMode ? this : doc,\n\t\t\t\tattaches = dataPriv.get( dataHolder, delegateType );\n\n\t\t\t// Support: IE 9 - 11+\n\t\t\t// We use the same native handler for focusin & focus (and focusout & blur)\n\t\t\t// so we need to coordinate setup & teardown parts between those events.\n\t\t\t// Use `delegateType` as the key as `type` is already used by `leverageNative`.\n\t\t\tif ( !attaches ) {\n\t\t\t\tif ( document.documentMode ) {\n\t\t\t\t\tthis.addEventListener( delegateType, focusMappedHandler );\n\t\t\t\t} else {\n\t\t\t\t\tdoc.addEventListener( type, focusMappedHandler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t\tdataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 );\n\t\t},\n\t\tteardown: function() {\n\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\tdataHolder = document.documentMode ? this : doc,\n\t\t\t\tattaches = dataPriv.get( dataHolder, delegateType ) - 1;\n\n\t\t\tif ( !attaches ) {\n\t\t\t\tif ( document.documentMode ) {\n\t\t\t\t\tthis.removeEventListener( delegateType, focusMappedHandler );\n\t\t\t\t} else {\n\t\t\t\t\tdoc.removeEventListener( type, focusMappedHandler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( dataHolder, delegateType );\n\t\t\t} else {\n\t\t\t\tdataPriv.set( dataHolder, delegateType, attaches );\n\t\t\t}\n\t\t}\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\n\trcleanScript = /^\\s*<!\\[CDATA\\[|\\]\\]>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (trac-8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Re-enable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase()  !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Unwrap a CDATA section containing script contents. This shouldn't be\n\t\t\t\t\t\t\t// needed as in XML documents they're already not visible when\n\t\t\t\t\t\t\t// inspecting element contents and in HTML documents they have no\n\t\t\t\t\t\t\t// meaning but we're preserving that logic for backwards compatibility.\n\t\t\t\t\t\t\t// This will be removed completely in 4.0. See gh-4904.\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew jQuery#find here for performance reasons:\n\t\t\t// https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar rcustomProp = /^--/;\n\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (trac-8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\t//\n\t\t// Support: Firefox 70+\n\t\t// Only Firefox includes border widths\n\t\t// in computed dimensions. (gh-4529)\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px;border-collapse:separate\";\n\t\t\t\ttr.style.cssText = \"box-sizing:content-box;border:1px solid\";\n\n\t\t\t\t// Support: Chrome 86+\n\t\t\t\t// Height set through cssText does not get applied.\n\t\t\t\t// Computed height then comes back as 0.\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\t// Support: Android 8 Chrome 86+\n\t\t\t\t// In our bodyBackground.html iframe,\n\t\t\t\t// display for all div elements is set to \"inline\",\n\t\t\t\t// which causes a problem only in Android 8 Chrome 86.\n\t\t\t\t// Ensuring the div is `display: block`\n\t\t\t\t// gets around this issue.\n\t\t\t\ttrChild.style.display = \"block\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderTopWidth, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\t\tisCustomProp = rcustomProp.test( name ),\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t//   .css('filter') (IE 9 only, trac-12537)\n\t//   .css('--customProperty) (gh-3144)\n\tif ( computed ) {\n\n\t\t// Support: IE <=9 - 11+\n\t\t// IE only supports `\"float\"` in `getPropertyValue`; in computed styles\n\t\t// it's only available as `\"cssFloat\"`. We no longer modify properties\n\t\t// sent to `.css()` apart from camelCasing, so we need to check both.\n\t\t// Normally, this would create difference in behavior: if\n\t\t// `getPropertyValue` returns an empty string, the value returned\n\t\t// by `.css()` would be `undefined`. This is usually the case for\n\t\t// disconnected elements. However, in IE even disconnected elements\n\t\t// with no styles return `\"none\"` for `getPropertyValue( \"float\" )`\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( isCustomProp && ret ) {\n\n\t\t\t// Support: Firefox 105+, Chrome <=105+\n\t\t\t// Spec requires trimming whitespace for custom properties (gh-4926).\n\t\t\t// Firefox only trims leading whitespace. Chrome just collapses\n\t\t\t// both leading & trailing whitespace to a single space.\n\t\t\t//\n\t\t\t// Fall back to `undefined` if empty string returned.\n\t\t\t// This collapses a missing definition with property defined\n\t\t\t// and set to an empty string but there's no standard API\n\t\t\t// allowing us to differentiate them without a performance penalty\n\t\t\t// and returning `undefined` aligns with older jQuery.\n\t\t\t//\n\t\t\t// rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED\n\t\t\t// as whitespace while CSS does not, but this is not a problem\n\t\t\t// because CSS preprocessing replaces them with U+000A LINE FEED\n\t\t\t// (which *is* CSS whitespace)\n\t\t\t// https://www.w3.org/TR/css-syntax-3/#input-preprocessing\n\t\t\tret = ret.replace( rtrimCSS, \"$1\" ) || undefined;\n\t\t}\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0,\n\t\tmarginDelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\t// Count margin delta separately to only add it after scroll gutter adjustment.\n\t\t// This is needed to make negative margins work with `outerHeight( true )` (gh-3982).\n\t\tif ( box === \"margin\" ) {\n\t\t\tmarginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta + marginDelta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\tanimationIterationCount: true,\n\t\taspectRatio: true,\n\t\tborderImageSlice: true,\n\t\tcolumnCount: true,\n\t\tflexGrow: true,\n\t\tflexShrink: true,\n\t\tfontWeight: true,\n\t\tgridArea: true,\n\t\tgridColumn: true,\n\t\tgridColumnEnd: true,\n\t\tgridColumnStart: true,\n\t\tgridRow: true,\n\t\tgridRowEnd: true,\n\t\tgridRowStart: true,\n\t\tlineHeight: true,\n\t\topacity: true,\n\t\torder: true,\n\t\torphans: true,\n\t\tscale: true,\n\t\twidows: true,\n\t\tzIndex: true,\n\t\tzoom: true,\n\n\t\t// SVG-related\n\t\tfillOpacity: true,\n\t\tfloodOpacity: true,\n\t\tstopOpacity: true,\n\t\tstrokeMiterlimit: true,\n\t\tstrokeOpacity: true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (trac-7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug trac-9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (trac-7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t} ) :\n\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\n\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// Use proper attribute retrieval (trac-12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + className + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += className + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + className + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + className + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar classNames, className, i, self,\n\t\t\ttype = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\treturn this.each( function() {\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\tself = jQuery( this );\n\n\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (trac-14686, trac-14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (trac-2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, parserErrorElem;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {}\n\n\tparserErrorElem = xml && xml.getElementsByTagName( \"parsererror\" )[ 0 ];\n\tif ( !xml || parserErrorElem ) {\n\t\tjQuery.error( \"Invalid XML: \" + (\n\t\t\tparserErrorElem ?\n\t\t\t\tjQuery.map( parserErrorElem.childNodes, function( el ) {\n\t\t\t\t\treturn el.textContent;\n\t\t\t\t} ).join( \"\\n\" ) :\n\t\t\t\tdata\n\t\t) );\n\t}\n\treturn xml;\n};\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (trac-9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || Object.create( null ) )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (trac-6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} ).filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} ).map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// trac-7653, trac-8125, trac-8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\noriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes trac-9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (trac-10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket trac-12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// trac-9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script but not if jsonp\n\t\t\tif ( !isSuccess &&\n\t\t\t\tjQuery.inArray( \"script\", s.dataTypes ) > -1 &&\n\t\t\t\tjQuery.inArray( \"json\", s.dataTypes ) < 0 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (trac-11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// trac-1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see trac-8605, trac-14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\"  ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// trac-14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce.guid++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( _i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( {\n\t\tpadding: \"inner\" + name,\n\t\tcontent: type,\n\t\t\"\": \"outer\" + name\n\t}, function( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( _i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this\n\t\t\t.on( \"mouseenter\", fnOver )\n\t\t\t.on( \"mouseleave\", fnOut || fnOver );\n\t}\n} );\n\njQuery.each(\n\t( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( _i, name ) {\n\n\t\t// Handle event binding\n\t\tjQuery.fn[ name ] = function( data, fn ) {\n\t\t\treturn arguments.length > 0 ?\n\t\t\t\tthis.on( name, null, data, fn ) :\n\t\t\t\tthis.trigger( name );\n\t\t};\n\t}\n);\n\n\n\n\n// Support: Android <=4.0 only\n// Make sure we trim BOM and NBSP\n// Require that the \"whitespace run\" starts from a non-whitespace\n// to avoid O(N^2) behavior when the engine would try matching \"\\s+$\" at each space position.\nvar rtrim = /^[\\s\\uFEFF\\xA0]+|([^\\s\\uFEFF\\xA0])[\\s\\uFEFF\\xA0]+$/g;\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\njQuery.trim = function( text ) {\n\treturn text == null ?\n\t\t\"\" :\n\t\t( text + \"\" ).replace( rtrim, \"$1\" );\n};\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (trac-13566)\nif ( typeof noGlobal === \"undefined\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n","/*!\n * @overview  Ember - JavaScript Application Framework\n * @copyright Copyright 2011 Tilde Inc. and contributors\n *            Portions Copyright 2006-2011 Strobe Inc.\n *            Portions Copyright 2008-2011 Apple Inc. All rights reserved.\n * @license   Licensed under MIT license\n *            See https://raw.github.com/emberjs/ember.js/master/LICENSE\n * @version   4.11.0\n */","/* eslint-disable no-var */\n/* globals global globalThis self */\n/* eslint-disable-next-line no-unused-vars */\nvar define, require;\n(function () {\n  var globalObj = typeof globalThis !== 'undefined' ? globalThis : typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : null;\n  if (globalObj === null) {\n    throw new Error('unable to locate global object');\n  }\n  if (typeof globalObj.define === 'function' && typeof globalObj.require === 'function') {\n    define = globalObj.define;\n    require = globalObj.require;\n    return;\n  }\n  var registry = Object.create(null);\n  var seen = Object.create(null);\n  function missingModule(name, referrerName) {\n    if (referrerName) {\n      throw new Error('Could not find module ' + name + ' required by: ' + referrerName);\n    } else {\n      throw new Error('Could not find module ' + name);\n    }\n  }\n  function internalRequire(_name, referrerName) {\n    var name = _name;\n    var mod = registry[name];\n    if (!mod) {\n      name = name + '/index';\n      mod = registry[name];\n    }\n    var exports = seen[name];\n    if (exports !== undefined) {\n      return exports;\n    }\n    exports = seen[name] = {};\n    if (!mod) {\n      missingModule(_name, referrerName);\n    }\n    var deps = mod.deps;\n    var callback = mod.callback;\n    var reified = new Array(deps.length);\n    for (var i = 0; i < deps.length; i++) {\n      if (deps[i] === 'exports') {\n        reified[i] = exports;\n      } else if (deps[i] === 'require') {\n        reified[i] = require;\n      } else {\n        reified[i] = require(deps[i], name);\n      }\n    }\n    callback.apply(this, reified);\n    return exports;\n  }\n  require = function (name) {\n    return internalRequire(name, null);\n  };\n  define = function (name, deps, callback) {\n    registry[name] = {\n      deps: deps,\n      callback: callback\n    };\n  };\n\n  // setup `require` module\n  require['default'] = require;\n  require.has = function registryHas(moduleName) {\n    return Boolean(registry[moduleName]) || Boolean(registry[moduleName + '/index']);\n  };\n  require._eak_seen = require.entries = registry;\n})();","define(\"@ember/-internals/bootstrap/index\", [\"require\"], function (_require) {\n  \"use strict\";\n\n  (function bootstrap() {\n    // Bootstrap Node module\n    if (typeof module === 'object' && typeof module.require === 'function') {\n      module.exports = (0, _require.default)(\"ember\").default;\n    }\n  })();\n});","define(\"@ember/-internals/browser-environment/index\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.window = _exports.userAgent = _exports.location = _exports.isFirefox = _exports.isChrome = _exports.history = _exports.hasDOM = void 0;\n  // check if window exists and actually is the global\n  var hasDom = typeof self === 'object' && self !== null && self.Object === Object && typeof Window !== 'undefined' && self.constructor === Window && typeof document === 'object' && document !== null && self.document === document && typeof location === 'object' && location !== null && self.location === location && typeof history === 'object' && history !== null && self.history === history && typeof navigator === 'object' && navigator !== null && self.navigator === navigator && typeof navigator.userAgent === 'string';\n  _exports.hasDOM = hasDom;\n  var window = hasDom ? self : null;\n  _exports.window = window;\n  var location$1 = hasDom ? self.location : null;\n  _exports.location = location$1;\n  var history$1 = hasDom ? self.history : null;\n  _exports.history = history$1;\n  var userAgent = hasDom ? self.navigator.userAgent : 'Lynx (textmode)';\n  _exports.userAgent = userAgent;\n  var isChrome = hasDom ? typeof chrome === 'object' && !(typeof opera === 'object') : false;\n  _exports.isChrome = isChrome;\n  var isFirefox = hasDom ? /Firefox|FxiOS/.test(userAgent) : false;\n  _exports.isFirefox = isFirefox;\n});","define(\"@ember/-internals/container/index\", [\"exports\", \"@ember/-internals/owner\", \"@ember/-internals/utils\", \"@ember/debug\"], function (_exports, _owner, _utils, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.Registry = _exports.INIT_FACTORY = _exports.Container = void 0;\n  _exports.getFactoryFor = getFactoryFor;\n  _exports.privatize = privatize;\n  _exports.setFactoryFor = setFactoryFor;\n  var leakTracking;\n  var containers;\n  if (true /* DEBUG */) {\n    // requires v8\n    // chrome --js-flags=\"--allow-natives-syntax --expose-gc\"\n    // node --allow-natives-syntax --expose-gc\n    try {\n      if (typeof gc === 'function') {\n        leakTracking = (() => {\n          // avoid syntax errors when --allow-natives-syntax not present\n          var GetWeakSetValues = new Function('weakSet', 'return %GetWeakSetValues(weakSet, 0)');\n          containers = new WeakSet();\n          return {\n            hasContainers() {\n              // @ts-expect-error We just checked if it is definied\n              gc();\n              return GetWeakSetValues(containers).length > 0;\n            },\n            reset() {\n              var values = GetWeakSetValues(containers);\n              for (var i = 0; i < values.length; i++) {\n                containers.delete(values[i]);\n              }\n            }\n          };\n        })();\n      }\n    } catch (e) {\n      // ignore\n    }\n  }\n  /**\n   A container used to instantiate and cache objects.\n  \n   Every `Container` must be associated with a `Registry`, which is referenced\n   to determine the factory and options that should be used to instantiate\n   objects.\n  \n   The public API for `Container` is still in flux and should not be considered\n   stable.\n  \n   @private\n   @class Container\n   */\n  class Container {\n    constructor(registry, options) {\n      if (options === void 0) {\n        options = {};\n      }\n      this.registry = registry;\n      this.owner = options.owner || null;\n      this.cache = (0, _utils.dictionary)(options.cache || null);\n      this.factoryManagerCache = (0, _utils.dictionary)(options.factoryManagerCache || null);\n      this.isDestroyed = false;\n      this.isDestroying = false;\n      if (true /* DEBUG */) {\n        this.validationCache = (0, _utils.dictionary)(options.validationCache || null);\n        if (containers !== undefined) {\n          containers.add(this);\n        }\n      }\n    }\n    /**\n     @private\n     @property registry\n     @type Registry\n     @since 1.11.0\n     */\n    /**\n     @private\n     @property cache\n     @type InheritingDict\n     */\n    /**\n     @private\n     @property validationCache\n     @type InheritingDict\n     */\n    /**\n     Given a fullName return a corresponding instance.\n      The default behavior is for lookup to return a singleton instance.\n     The singleton is scoped to the container, allowing multiple containers\n     to all have their own locally scoped singletons.\n      ```javascript\n     let registry = new Registry();\n     let container = registry.container();\n      registry.register('api:twitter', Twitter);\n      let twitter = container.lookup('api:twitter');\n      twitter instanceof Twitter; // => true\n      // by default the container will return singletons\n     let twitter2 = container.lookup('api:twitter');\n     twitter2 instanceof Twitter; // => true\n      twitter === twitter2; //=> true\n     ```\n      If singletons are not wanted, an optional flag can be provided at lookup.\n      ```javascript\n     let registry = new Registry();\n     let container = registry.container();\n      registry.register('api:twitter', Twitter);\n      let twitter = container.lookup('api:twitter', { singleton: false });\n     let twitter2 = container.lookup('api:twitter', { singleton: false });\n      twitter === twitter2; //=> false\n     ```\n      @private\n     @method lookup\n     @param {String} fullName\n     @param {RegisterOptions} [options]\n     @return {any}\n     */\n    lookup(fullName, options) {\n      if (this.isDestroyed) {\n        throw new Error(`Cannot call \\`.lookup\\` after the owner has been destroyed`);\n      }\n      (true && !(this.registry.isValidFullName(fullName)) && (0, _debug.assert)('fullName must be a proper full name', this.registry.isValidFullName(fullName)));\n      return lookup(this, this.registry.normalize(fullName), options);\n    }\n    /**\n     A depth first traversal, destroying the container, its descendant containers and all\n     their managed objects.\n      @private\n     @method destroy\n     */\n    destroy() {\n      this.isDestroying = true;\n      destroyDestroyables(this);\n    }\n    finalizeDestroy() {\n      resetCache(this);\n      this.isDestroyed = true;\n    }\n    /**\n     Clear either the entire cache or just the cache for a particular key.\n        @private\n     @method reset\n     @param {String} fullName optional key to reset; if missing, resets everything\n    */\n    reset(fullName) {\n      if (this.isDestroyed) return;\n      if (fullName === undefined) {\n        destroyDestroyables(this);\n        resetCache(this);\n      } else {\n        resetMember(this, this.registry.normalize(fullName));\n      }\n    }\n    /**\n     Returns an object that can be used to provide an owner to a\n     manually created instance.\n      @private\n     @method ownerInjection\n     @returns { Object }\n    */\n    ownerInjection() {\n      var injection = {};\n      (0, _owner.setOwner)(injection, this.owner);\n      return injection;\n    }\n    /**\n     Given a fullName, return the corresponding factory. The consumer of the factory\n     is responsible for the destruction of any factory instances, as there is no\n     way for the container to ensure instances are destroyed when it itself is\n     destroyed.\n      @public\n     @method factoryFor\n     @param {String} fullName\n     @return {any}\n     */\n    factoryFor(fullName) {\n      if (this.isDestroyed) {\n        throw new Error(`Cannot call \\`.factoryFor\\` after the owner has been destroyed`);\n      }\n      var normalizedName = this.registry.normalize(fullName);\n      (true && !(this.registry.isValidFullName(normalizedName)) && (0, _debug.assert)('fullName must be a proper full name', this.registry.isValidFullName(normalizedName)));\n      return factoryFor(this, normalizedName, fullName);\n    }\n  }\n  _exports.Container = Container;\n  if (true /* DEBUG */) {\n    Container._leakTracking = leakTracking;\n  }\n  /*\n   * Wrap a factory manager in a proxy which will not permit properties to be\n   * set on the manager.\n   */\n  function wrapManagerInDeprecationProxy(manager) {\n    var validator = {\n      set(_obj, prop) {\n        throw new Error(`You attempted to set \"${String(prop)}\" on a factory manager created by container#factoryFor. A factory manager is a read-only construct.`);\n      }\n    };\n    // Note:\n    // We have to proxy access to the manager here so that private property\n    // access doesn't cause the above errors to occur.\n    var m = manager;\n    var proxiedManager = {\n      class: m.class,\n      create(props) {\n        return m.create(props);\n      }\n    };\n    return new Proxy(proxiedManager, validator);\n  }\n  function isSingleton(container, fullName) {\n    return container.registry.getOption(fullName, 'singleton') !== false;\n  }\n  function isInstantiatable(container, fullName) {\n    return container.registry.getOption(fullName, 'instantiate') !== false;\n  }\n  function lookup(container, fullName, options) {\n    if (options === void 0) {\n      options = {};\n    }\n    var normalizedName = fullName;\n    if (options.singleton === true || options.singleton === undefined && isSingleton(container, fullName)) {\n      var cached = container.cache[normalizedName];\n      if (cached !== undefined) {\n        return cached;\n      }\n    }\n    return instantiateFactory(container, normalizedName, fullName, options);\n  }\n  function factoryFor(container, normalizedName, fullName) {\n    var cached = container.factoryManagerCache[normalizedName];\n    if (cached !== undefined) {\n      return cached;\n    }\n    var factory = container.registry.resolve(normalizedName);\n    if (factory === undefined) {\n      return;\n    }\n    if (true /* DEBUG */ && factory && typeof factory._onLookup === 'function') {\n      factory._onLookup(fullName);\n    }\n    var manager = new InternalFactoryManager(container, factory, fullName, normalizedName);\n    if (true /* DEBUG */) {\n      manager = wrapManagerInDeprecationProxy(manager);\n    }\n    container.factoryManagerCache[normalizedName] = manager;\n    return manager;\n  }\n  function isSingletonClass(container, fullName, _ref) {\n    var {\n      instantiate,\n      singleton\n    } = _ref;\n    return singleton !== false && !instantiate && isSingleton(container, fullName) && !isInstantiatable(container, fullName);\n  }\n  function isSingletonInstance(container, fullName, _ref2) {\n    var {\n      instantiate,\n      singleton\n    } = _ref2;\n    return singleton !== false && instantiate !== false && (singleton === true || isSingleton(container, fullName)) && isInstantiatable(container, fullName);\n  }\n  function isFactoryClass(container, fullname, _ref3) {\n    var {\n      instantiate,\n      singleton\n    } = _ref3;\n    return instantiate === false && (singleton === false || !isSingleton(container, fullname)) && !isInstantiatable(container, fullname);\n  }\n  function isFactoryInstance(container, fullName, _ref4) {\n    var {\n      instantiate,\n      singleton\n    } = _ref4;\n    return instantiate !== false && (singleton === false || !isSingleton(container, fullName)) && isInstantiatable(container, fullName);\n  }\n  function instantiateFactory(container, normalizedName, fullName, options) {\n    var factoryManager = factoryFor(container, normalizedName, fullName);\n    if (factoryManager === undefined) {\n      return;\n    }\n    // SomeClass { singleton: true, instantiate: true } | { singleton: true } | { instantiate: true } | {}\n    // By default majority of objects fall into this case\n    if (isSingletonInstance(container, fullName, options)) {\n      var instance = container.cache[normalizedName] = factoryManager.create();\n      // if this lookup happened _during_ destruction (emits a deprecation, but\n      // is still possible) ensure that it gets destroyed\n      if (container.isDestroying) {\n        if (typeof instance.destroy === 'function') {\n          instance.destroy();\n        }\n      }\n      return instance;\n    }\n    // SomeClass { singleton: false, instantiate: true }\n    if (isFactoryInstance(container, fullName, options)) {\n      return factoryManager.create();\n    }\n    // SomeClass { singleton: true, instantiate: false } | { instantiate: false } | { singleton: false, instantiation: false }\n    if (isSingletonClass(container, fullName, options) || isFactoryClass(container, fullName, options)) {\n      return factoryManager.class;\n    }\n    throw new Error('Could not create factory');\n  }\n  function destroyDestroyables(container) {\n    var cache = container.cache;\n    var keys = Object.keys(cache);\n    for (var key of keys) {\n      var value = cache[key];\n      (true && !(value) && (0, _debug.assert)('has cached value', value));\n      if (value.destroy) {\n        value.destroy();\n      }\n    }\n  }\n  function resetCache(container) {\n    container.cache = (0, _utils.dictionary)(null);\n    container.factoryManagerCache = (0, _utils.dictionary)(null);\n  }\n  function resetMember(container, fullName) {\n    var member = container.cache[fullName];\n    delete container.factoryManagerCache[fullName];\n    if (member) {\n      delete container.cache[fullName];\n      if (member.destroy) {\n        member.destroy();\n      }\n    }\n  }\n  var INIT_FACTORY = Symbol('INIT_FACTORY');\n  _exports.INIT_FACTORY = INIT_FACTORY;\n  function getFactoryFor(obj) {\n    // SAFETY: since we know `obj` is an `object`, we also know we can safely ask\n    // whether a key is set on it.\n    return obj[INIT_FACTORY];\n  }\n  function setFactoryFor(obj, factory) {\n    // SAFETY: since we know `obj` is an `object`, we also know we can safely set\n    // a key it safely at this location. (The only way this could be blocked is if\n    // someone has gone out of their way to use `Object.defineProperty()` with our\n    // internal-only symbol and made it `writable: false`.)\n    obj[INIT_FACTORY] = factory;\n  }\n  class InternalFactoryManager {\n    constructor(container, factory, fullName, normalizedName) {\n      this.container = container;\n      this.owner = container.owner;\n      this.class = factory;\n      this.fullName = fullName;\n      this.normalizedName = normalizedName;\n      this.madeToString = undefined;\n      this.injections = undefined;\n    }\n    toString() {\n      if (this.madeToString === undefined) {\n        this.madeToString = this.container.registry.makeToString(this.class, this.fullName);\n      }\n      return this.madeToString;\n    }\n    create(options) {\n      var {\n        container\n      } = this;\n      if (container.isDestroyed) {\n        throw new Error(`Cannot create new instances after the owner has been destroyed (you attempted to create ${this.fullName})`);\n      }\n      var props = options ? Object.assign({}, options) : {};\n      (0, _owner.setOwner)(props, container.owner);\n      setFactoryFor(props, this);\n      if (true /* DEBUG */) {\n        var lazyInjections;\n        var validationCache = this.container.validationCache;\n        // Ensure that all lazy injections are valid at instantiation time\n        if (!validationCache[this.fullName] && this.class && typeof this.class._lazyInjections === 'function') {\n          lazyInjections = this.class._lazyInjections();\n          lazyInjections = this.container.registry.normalizeInjectionsHash(lazyInjections);\n          this.container.registry.validateInjections(lazyInjections);\n        }\n        validationCache[this.fullName] = true;\n        (true && !(typeof this.class.create === 'function') && (0, _debug.assert)(`Failed to create an instance of '${this.normalizedName}'. Most likely an improperly defined class or an invalid module export.`, typeof this.class.create === 'function'));\n      }\n      return this.class.create(props);\n    }\n  }\n  var VALID_FULL_NAME_REGEXP = /^[^:]+:[^:]+$/;\n  /**\n   A registry used to store factory and option information keyed\n   by type.\n  \n   A `Registry` stores the factory and option information needed by a\n   `Container` to instantiate and cache objects.\n  \n   The API for `Registry` is still in flux and should not be considered stable.\n  \n   @private\n   @class Registry\n   @since 1.11.0\n  */\n  class Registry {\n    constructor(options) {\n      if (options === void 0) {\n        options = {};\n      }\n      this.fallback = options.fallback || null;\n      this.resolver = options.resolver || null;\n      this.registrations = (0, _utils.dictionary)(options.registrations || null);\n      this._normalizeCache = (0, _utils.dictionary)(null);\n      this._resolveCache = (0, _utils.dictionary)(null);\n      this._failSet = new Set();\n      this._options = (0, _utils.dictionary)(null);\n      this._typeOptions = (0, _utils.dictionary)(null);\n    }\n    /**\n     A backup registry for resolving registrations when no matches can be found.\n        @private\n     @property fallback\n     @type Registry\n     */\n    /**\n     An object that has a `resolve` method that resolves a name.\n        @private\n     @property resolver\n     @type Resolver\n     */\n    /**\n     @private\n     @property registrations\n     @type InheritingDict\n     */\n    /**\n     @private\n        @property _normalizeCache\n     @type InheritingDict\n     */\n    /**\n     @private\n        @property _resolveCache\n     @type InheritingDict\n     */\n    /**\n     @private\n        @property _options\n     @type InheritingDict\n     */\n    /**\n     @private\n        @property _typeOptions\n     @type InheritingDict\n     */\n    /**\n     Creates a container based on this registry.\n        @private\n     @method container\n     @param {Object} options\n     @return {Container} created container\n     */\n    container(options) {\n      return new Container(this, options);\n    }\n    register(fullName, factory, options) {\n      if (options === void 0) {\n        options = {};\n      }\n      (true && !(this.isValidFullName(fullName)) && (0, _debug.assert)('fullName must be a proper full name', this.isValidFullName(fullName)));\n      (true && !(factory !== undefined) && (0, _debug.assert)(`Attempting to register an unknown factory: '${fullName}'`, factory !== undefined));\n      var normalizedName = this.normalize(fullName);\n      (true && !(!this._resolveCache[normalizedName]) && (0, _debug.assert)(`Cannot re-register: '${fullName}', as it has already been resolved.`, !this._resolveCache[normalizedName]));\n      this._failSet.delete(normalizedName);\n      this.registrations[normalizedName] = factory;\n      this._options[normalizedName] = options;\n    }\n    /**\n     Unregister a fullName\n        ```javascript\n     let registry = new Registry();\n     registry.register('model:user', User);\n        registry.resolve('model:user').create() instanceof User //=> true\n        registry.unregister('model:user')\n     registry.resolve('model:user') === undefined //=> true\n     ```\n        @private\n     @method unregister\n     @param {String} fullName\n     */\n    unregister(fullName) {\n      (true && !(this.isValidFullName(fullName)) && (0, _debug.assert)('fullName must be a proper full name', this.isValidFullName(fullName)));\n      var normalizedName = this.normalize(fullName);\n      delete this.registrations[normalizedName];\n      delete this._resolveCache[normalizedName];\n      delete this._options[normalizedName];\n      this._failSet.delete(normalizedName);\n    }\n    /**\n     Given a fullName return the corresponding factory.\n        By default `resolve` will retrieve the factory from\n     the registry.\n        ```javascript\n     let registry = new Registry();\n     registry.register('api:twitter', Twitter);\n        registry.resolve('api:twitter') // => Twitter\n     ```\n        Optionally the registry can be provided with a custom resolver.\n     If provided, `resolve` will first provide the custom resolver\n     the opportunity to resolve the fullName, otherwise it will fallback\n     to the registry.\n        ```javascript\n     let registry = new Registry();\n     registry.resolver = function(fullName) {\n        // lookup via the module system of choice\n      };\n        // the twitter factory is added to the module system\n     registry.resolve('api:twitter') // => Twitter\n     ```\n        @private\n     @method resolve\n     @param {String} fullName\n     @return {Function} fullName's factory\n     */\n    resolve(fullName) {\n      var factory = resolve(this, this.normalize(fullName));\n      if (factory === undefined && this.fallback !== null) {\n        factory = this.fallback.resolve(fullName);\n      }\n      return factory;\n    }\n    /**\n     A hook that can be used to describe how the resolver will\n     attempt to find the factory.\n        For example, the default Ember `.describe` returns the full\n     class name (including namespace) where Ember's resolver expects\n     to find the `fullName`.\n        @private\n     @method describe\n     @param {String} fullName\n     @return {string} described fullName\n     */\n    describe(fullName) {\n      if (this.resolver !== null && this.resolver.lookupDescription) {\n        return this.resolver.lookupDescription(fullName);\n      } else if (this.fallback !== null) {\n        return this.fallback.describe(fullName);\n      } else {\n        return fullName;\n      }\n    }\n    /**\n     A hook to enable custom fullName normalization behavior\n        @private\n     @method normalizeFullName\n     @param {String} fullName\n     @return {string} normalized fullName\n     */\n    normalizeFullName(fullName) {\n      if (this.resolver !== null && this.resolver.normalize) {\n        return this.resolver.normalize(fullName);\n      } else if (this.fallback !== null) {\n        return this.fallback.normalizeFullName(fullName);\n      } else {\n        return fullName;\n      }\n    }\n    /**\n     Normalize a fullName based on the application's conventions\n        @private\n     @method normalize\n     @param {String} fullName\n     @return {string} normalized fullName\n     */\n    normalize(fullName) {\n      return this._normalizeCache[fullName] || (this._normalizeCache[fullName] = this.normalizeFullName(fullName));\n    }\n    /**\n     @method makeToString\n        @private\n     @param {any} factory\n     @param {string} fullName\n     @return {function} toString function\n     */\n    makeToString(factory, fullName) {\n      var _a;\n      if (this.resolver !== null && this.resolver.makeToString) {\n        return this.resolver.makeToString(factory, fullName);\n      } else if (this.fallback !== null) {\n        return this.fallback.makeToString(factory, fullName);\n      } else {\n        return typeof factory === 'string' ? factory : (_a = factory.name) !== null && _a !== void 0 ? _a : '(unknown class)';\n      }\n    }\n    /**\n     Given a fullName check if the container is aware of its factory\n     or singleton instance.\n        @private\n     @method has\n     @param {String} fullName\n     @param {Object} [options]\n     @param {String} [options.source] the fullname of the request source (used for local lookups)\n     @return {Boolean}\n     */\n    has(fullName) {\n      if (!this.isValidFullName(fullName)) {\n        return false;\n      }\n      return has(this, this.normalize(fullName));\n    }\n    /**\n     Allow registering options for all factories of a type.\n        ```javascript\n     let registry = new Registry();\n     let container = registry.container();\n        // if all of type `connection` must not be singletons\n     registry.optionsForType('connection', { singleton: false });\n        registry.register('connection:twitter', TwitterConnection);\n     registry.register('connection:facebook', FacebookConnection);\n        let twitter = container.lookup('connection:twitter');\n     let twitter2 = container.lookup('connection:twitter');\n        twitter === twitter2; // => false\n        let facebook = container.lookup('connection:facebook');\n     let facebook2 = container.lookup('connection:facebook');\n        facebook === facebook2; // => false\n     ```\n        @private\n     @method optionsForType\n     @param {String} type\n     @param {Object} options\n     */\n    optionsForType(type, options) {\n      this._typeOptions[type] = options;\n    }\n    getOptionsForType(type) {\n      var optionsForType = this._typeOptions[type];\n      if (optionsForType === undefined && this.fallback !== null) {\n        optionsForType = this.fallback.getOptionsForType(type);\n      }\n      return optionsForType;\n    }\n    /**\n     @private\n     @method options\n     @param {String} fullName\n     @param {Object} options\n     */\n    options(fullName, options) {\n      var normalizedName = this.normalize(fullName);\n      this._options[normalizedName] = options;\n    }\n    getOptions(fullName) {\n      var normalizedName = this.normalize(fullName);\n      var options = this._options[normalizedName];\n      if (options === undefined && this.fallback !== null) {\n        options = this.fallback.getOptions(fullName);\n      }\n      return options;\n    }\n    getOption(fullName, optionName) {\n      var options = this._options[fullName];\n      if (options !== undefined && options[optionName] !== undefined) {\n        return options[optionName];\n      }\n      var type = fullName.split(':')[0];\n      (true && !(type) && (0, _debug.assert)('has type', type)); // split always will have at least one value\n      options = this._typeOptions[type];\n      if (options && options[optionName] !== undefined) {\n        return options[optionName];\n      } else if (this.fallback !== null) {\n        return this.fallback.getOption(fullName, optionName);\n      }\n      return undefined;\n    }\n    /**\n     This is deprecated in favor of explicit injection of dependencies.\n        Reference: https://deprecations.emberjs.com/v3.x#toc_implicit-injections\n     ```\n        @private\n     @method injection\n     @param {String} fullName\n     @param {String} property\n     @deprecated\n     */\n    injection(fullName, property) {\n      (true && !(false) && (0, _debug.deprecate)(`As of Ember 4.0.0, owner.inject no longer injects values into resolved instances, and calling the method has been deprecated. Since this method no longer does anything, it is fully safe to remove this injection. As an alternative to this API, you can refactor to explicitly inject \\`${property}\\` on \\`${fullName}\\`, or look it up directly using the \\`getOwner\\` API.`, false, {\n        id: 'remove-owner-inject',\n        until: '5.0.0',\n        url: 'https://deprecations.emberjs.com/v4.x#toc_implicit-injections',\n        for: 'ember-source',\n        since: {\n          available: '4.0.0',\n          enabled: '4.0.0'\n        }\n      }));\n    }\n    /**\n     @private\n     @method knownForType\n     @param {String} type the type to iterate over\n    */\n    knownForType(type) {\n      var localKnown = (0, _utils.dictionary)(null);\n      var registeredNames = Object.keys(this.registrations);\n      for (var fullName of registeredNames) {\n        var itemType = fullName.split(':')[0];\n        if (itemType === type) {\n          localKnown[fullName] = true;\n        }\n      }\n      var fallbackKnown, resolverKnown;\n      if (this.fallback !== null) {\n        fallbackKnown = this.fallback.knownForType(type);\n      }\n      if (this.resolver !== null && this.resolver.knownForType) {\n        resolverKnown = this.resolver.knownForType(type);\n      }\n      return Object.assign({}, fallbackKnown, localKnown, resolverKnown);\n    }\n    isValidFullName(fullName) {\n      return VALID_FULL_NAME_REGEXP.test(fullName);\n    }\n  }\n  _exports.Registry = Registry;\n  if (true /* DEBUG */) {\n    var proto = Registry.prototype;\n    proto.normalizeInjectionsHash = function (hash) {\n      var injections = [];\n      for (var key in hash) {\n        if (Object.prototype.hasOwnProperty.call(hash, key)) {\n          var value = hash[key];\n          (true && !(value) && (0, _debug.assert)('has value', value));\n          var {\n            specifier\n          } = value;\n          (true && !(this.isValidFullName(specifier)) && (0, _debug.assert)(`Expected a proper full name, given '${specifier}'`, this.isValidFullName(specifier)));\n          injections.push({\n            property: key,\n            specifier\n          });\n        }\n      }\n      return injections;\n    };\n    proto.validateInjections = function (injections) {\n      if (!injections) {\n        return;\n      }\n      for (var injection of injections) {\n        var {\n          specifier\n        } = injection;\n        (true && !(this.has(specifier)) && (0, _debug.assert)(`Attempting to inject an unknown injection: '${specifier}'`, this.has(specifier)));\n      }\n    };\n  }\n  function resolve(registry, _normalizedName) {\n    var normalizedName = _normalizedName;\n    var cached = registry._resolveCache[normalizedName];\n    if (cached !== undefined) {\n      return cached;\n    }\n    if (registry._failSet.has(normalizedName)) {\n      return;\n    }\n    var resolved;\n    if (registry.resolver) {\n      resolved = registry.resolver.resolve(normalizedName);\n    }\n    if (resolved === undefined) {\n      resolved = registry.registrations[normalizedName];\n    }\n    if (resolved === undefined) {\n      registry._failSet.add(normalizedName);\n    } else {\n      registry._resolveCache[normalizedName] = resolved;\n    }\n    return resolved;\n  }\n  function has(registry, fullName) {\n    return registry.resolve(fullName) !== undefined;\n  }\n  var privateNames = (0, _utils.dictionary)(null);\n  var privateSuffix = `${Math.random()}${Date.now()}`.replace('.', '');\n  function privatize(_ref5) {\n    var [fullName] = _ref5;\n    (true && !(arguments.length === 1 && fullName) && (0, _debug.assert)('has a single string argument', arguments.length === 1 && fullName));\n    var name = privateNames[fullName];\n    if (name) {\n      return name;\n    }\n    var [type, rawName] = fullName.split(':');\n    return privateNames[fullName] = (0, _utils.intern)(`${type}:${rawName}-${privateSuffix}`);\n  }\n\n  /*\n  Public API for the container is still in flux.\n  The public API, specified on the application namespace should be considered the stable API.\n  // @module container\n    @private\n  */\n});","define(\"@ember/-internals/environment/index\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.context = _exports.ENV = void 0;\n  _exports.getENV = getENV;\n  _exports.getLookup = getLookup;\n  _exports.global = void 0;\n  _exports.setLookup = setLookup;\n  // from lodash to catch fake globals\n  function checkGlobal(value) {\n    return value && value.Object === Object ? value : undefined;\n  }\n  // element ids can ruin global miss checks\n  function checkElementIdShadowing(value) {\n    return value && value.nodeType === undefined ? value : undefined;\n  }\n  // export real global\n  var global$1 = checkGlobal(checkElementIdShadowing(typeof global === 'object' && global)) || checkGlobal(typeof self === 'object' && self) || checkGlobal(typeof window === 'object' && window) || typeof mainContext !== 'undefined' && mainContext ||\n  // set before strict mode in Ember loader/wrapper\n  new Function('return this')(); // eval outside of strict mode\n\n  // legacy imports/exports/lookup stuff (should we keep this??)\n  _exports.global = global$1;\n  var context = function (global, Ember) {\n    return Ember === undefined ? {\n      imports: global,\n      exports: global,\n      lookup: global\n    } : {\n      // import jQuery\n      imports: Ember.imports || global,\n      // export Ember\n      exports: Ember.exports || global,\n      // search for Namespaces\n      lookup: Ember.lookup || global\n    };\n  }(global$1, global$1.Ember);\n  _exports.context = context;\n  function getLookup() {\n    return context.lookup;\n  }\n  function setLookup(value) {\n    context.lookup = value;\n  }\n\n  /**\n    The hash of environment variables used to control various configuration\n    settings. To specify your own or override default settings, add the\n    desired properties to a global hash named `EmberENV` (or `ENV` for\n    backwards compatibility with earlier versions of Ember). The `EmberENV`\n    hash must be created before loading Ember.\n  \n    @class EmberENV\n    @type Object\n    @public\n  */\n  var ENV = {\n    ENABLE_OPTIONAL_FEATURES: false,\n    /**\n      Determines whether Ember should add to `Array`\n      native object prototypes, a few extra methods in order to provide a more\n      friendly API.\n         We generally recommend leaving this option set to true however, if you need\n      to turn it off, you can add the configuration property\n      `EXTEND_PROTOTYPES` to `EmberENV` and set it to `false`.\n         Note, when disabled (the default configuration for Ember Addons), you will\n      instead have to access all methods and functions from the Ember\n      namespace.\n         @property EXTEND_PROTOTYPES\n      @type Boolean\n      @default true\n      @for EmberENV\n      @public\n    */\n    EXTEND_PROTOTYPES: {\n      Array: true\n    },\n    /**\n      The `LOG_STACKTRACE_ON_DEPRECATION` property, when true, tells Ember to log\n      a full stack trace during deprecation warnings.\n         @property LOG_STACKTRACE_ON_DEPRECATION\n      @type Boolean\n      @default true\n      @for EmberENV\n      @public\n    */\n    LOG_STACKTRACE_ON_DEPRECATION: true,\n    /**\n      The `LOG_VERSION` property, when true, tells Ember to log versions of all\n      dependent libraries in use.\n         @property LOG_VERSION\n      @type Boolean\n      @default true\n      @for EmberENV\n      @public\n    */\n    LOG_VERSION: true,\n    RAISE_ON_DEPRECATION: false,\n    STRUCTURED_PROFILE: false,\n    /**\n      Whether to insert a `<div class=\"ember-view\" />` wrapper around the\n      application template. See RFC #280.\n         This is not intended to be set directly, as the implementation may change in\n      the future. Use `@ember/optional-features` instead.\n         @property _APPLICATION_TEMPLATE_WRAPPER\n      @for EmberENV\n      @type Boolean\n      @default true\n      @private\n    */\n    _APPLICATION_TEMPLATE_WRAPPER: true,\n    /**\n      Whether to use Glimmer Component semantics (as opposed to the classic \"Curly\"\n      components semantics) for template-only components. See RFC #278.\n         This is not intended to be set directly, as the implementation may change in\n      the future. Use `@ember/optional-features` instead.\n         @property _TEMPLATE_ONLY_GLIMMER_COMPONENTS\n      @for EmberENV\n      @type Boolean\n      @default false\n      @private\n    */\n    _TEMPLATE_ONLY_GLIMMER_COMPONENTS: false,\n    /**\n      Whether to perform extra bookkeeping needed to make the `captureRenderTree`\n      API work.\n         This has to be set before the ember JavaScript code is evaluated. This is\n      usually done by setting `window.EmberENV = { _DEBUG_RENDER_TREE: true };`\n      before the \"vendor\" `<script>` tag in `index.html`.\n         Setting the flag after Ember is already loaded will not work correctly. It\n      may appear to work somewhat, but fundamentally broken.\n         This is not intended to be set directly. Ember Inspector will enable the\n      flag on behalf of the user as needed.\n         This flag is always on in development mode.\n         The flag is off by default in production mode, due to the cost associated\n      with the the bookkeeping work.\n         The expected flow is that Ember Inspector will ask the user to refresh the\n      page after enabling the feature. It could also offer a feature where the\n      user add some domains to the \"always on\" list. In either case, Ember\n      Inspector will inject the code on the page to set the flag if needed.\n         @property _DEBUG_RENDER_TREE\n      @for EmberENV\n      @type Boolean\n      @default false\n      @private\n    */\n    _DEBUG_RENDER_TREE: true /* DEBUG */,\n    /**\n      Whether the app defaults to using async observers.\n         This is not intended to be set directly, as the implementation may change in\n      the future. Use `@ember/optional-features` instead.\n         @property _DEFAULT_ASYNC_OBSERVERS\n      @for EmberENV\n      @type Boolean\n      @default false\n      @private\n    */\n    _DEFAULT_ASYNC_OBSERVERS: false,\n    /**\n      Controls the maximum number of scheduled rerenders without \"settling\". In general,\n      applications should not need to modify this environment variable, but please\n      open an issue so that we can determine if a better default value is needed.\n         @property _RERENDER_LOOP_LIMIT\n      @for EmberENV\n      @type number\n      @default 1000\n      @private\n     */\n    _RERENDER_LOOP_LIMIT: 1000,\n    EMBER_LOAD_HOOKS: {},\n    FEATURES: {}\n  };\n  _exports.ENV = ENV;\n  (EmberENV => {\n    if (typeof EmberENV !== 'object' || EmberENV === null) return;\n    for (var flag in EmberENV) {\n      if (!Object.prototype.hasOwnProperty.call(EmberENV, flag) || flag === 'EXTEND_PROTOTYPES' || flag === 'EMBER_LOAD_HOOKS') continue;\n      var defaultValue = ENV[flag];\n      if (defaultValue === true) {\n        ENV[flag] = EmberENV[flag] !== false;\n      } else if (defaultValue === false) {\n        ENV[flag] = EmberENV[flag] === true;\n      }\n    }\n    var {\n      EXTEND_PROTOTYPES\n    } = EmberENV;\n    if (EXTEND_PROTOTYPES !== undefined) {\n      if (typeof EXTEND_PROTOTYPES === 'object' && EXTEND_PROTOTYPES !== null) {\n        ENV.EXTEND_PROTOTYPES.Array = EXTEND_PROTOTYPES.Array !== false;\n      } else {\n        ENV.EXTEND_PROTOTYPES.Array = EXTEND_PROTOTYPES !== false;\n      }\n    }\n    // TODO this does not seem to be used by anything,\n    //      can we remove it? do we need to deprecate it?\n    var {\n      EMBER_LOAD_HOOKS\n    } = EmberENV;\n    if (typeof EMBER_LOAD_HOOKS === 'object' && EMBER_LOAD_HOOKS !== null) {\n      for (var hookName in EMBER_LOAD_HOOKS) {\n        if (!Object.prototype.hasOwnProperty.call(EMBER_LOAD_HOOKS, hookName)) continue;\n        var hooks = EMBER_LOAD_HOOKS[hookName];\n        if (Array.isArray(hooks)) {\n          ENV.EMBER_LOAD_HOOKS[hookName] = hooks.filter(hook => typeof hook === 'function');\n        }\n      }\n    }\n    var {\n      FEATURES\n    } = EmberENV;\n    if (typeof FEATURES === 'object' && FEATURES !== null) {\n      for (var feature in FEATURES) {\n        if (!Object.prototype.hasOwnProperty.call(FEATURES, feature)) continue;\n        ENV.FEATURES[feature] = FEATURES[feature] === true;\n      }\n    }\n    if (true /* DEBUG */) {\n      ENV._DEBUG_RENDER_TREE = true;\n    }\n  })(global$1.EmberENV);\n  function getENV() {\n    return ENV;\n  }\n});","define(\"@ember/-internals/error-handling/index\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.getDispatchOverride = getDispatchOverride;\n  _exports.getOnerror = getOnerror;\n  _exports.onErrorTarget = void 0;\n  _exports.setDispatchOverride = setDispatchOverride;\n  _exports.setOnerror = setOnerror;\n  var onerror;\n  var onErrorTarget = {\n    get onerror() {\n      return onerror;\n    }\n  };\n  // Ember.onerror getter\n  _exports.onErrorTarget = onErrorTarget;\n  function getOnerror() {\n    return onerror;\n  }\n  // Ember.onerror setter\n  function setOnerror(handler) {\n    onerror = handler;\n  }\n  var dispatchOverride = null;\n  // allows testing adapter to override dispatch\n  function getDispatchOverride() {\n    return dispatchOverride;\n  }\n  function setDispatchOverride(handler) {\n    dispatchOverride = handler;\n  }\n});","define(\"@ember/-internals/glimmer/index\", [\"exports\", \"@glimmer/opcode-compiler\", \"@ember/-internals/owner\", \"@ember/-internals/utils\", \"@ember/debug\", \"@glimmer/manager\", \"@glimmer/reference\", \"@glimmer/validator\", \"@ember/-internals/metal\", \"@ember/object\", \"@ember/-internals/browser-environment\", \"@ember/-internals/views\", \"@ember/engine\", \"@ember/engine/instance\", \"@ember/instrumentation\", \"@ember/service\", \"@ember/-internals/string\", \"@glimmer/destroyable\", \"@ember/runloop\", \"@glimmer/util\", \"@glimmer/runtime\", \"@ember/-internals/runtime\", \"@ember/object/-internals\", \"@ember/-internals/environment\", \"@ember/-internals/container\", \"@glimmer/node\", \"@ember/array/-internals\", \"@ember/-internals/glimmer\", \"@ember/array\", \"@glimmer/global-context\", \"@ember/routing/-internals\", \"@glimmer/program\", \"rsvp\"], function (_exports, _opcodeCompiler, _owner2, _utils, _debug, _manager2, _reference, _validator, _metal, _object, _browserEnvironment, _views, _engine, _instance, _instrumentation, _service, _string, _destroyable, _runloop, _util, _runtime, _runtime2, _internals, _environment2, _container, _node, _internals2, _glimmer, _array, _globalContext, _internals3, _program, _rsvp) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.Component = void 0;\n  Object.defineProperty(_exports, \"DOMChanges\", {\n    enumerable: true,\n    get: function () {\n      return _runtime.DOMChanges;\n    }\n  });\n  Object.defineProperty(_exports, \"DOMTreeConstruction\", {\n    enumerable: true,\n    get: function () {\n      return _runtime.DOMTreeConstruction;\n    }\n  });\n  _exports.LinkTo = _exports.Input = _exports.Helper = void 0;\n  Object.defineProperty(_exports, \"NodeDOMTreeConstruction\", {\n    enumerable: true,\n    get: function () {\n      return _node.NodeDOMTreeConstruction;\n    }\n  });\n  _exports.Textarea = _exports.SafeString = _exports.RootTemplate = _exports.Renderer = _exports.OutletView = void 0;\n  _exports._resetRenderers = _resetRenderers;\n  _exports.componentCapabilities = void 0;\n  _exports.escapeExpression = escapeExpression;\n  _exports.getTemplate = getTemplate;\n  _exports.getTemplates = getTemplates;\n  _exports.hasTemplate = hasTemplate;\n  _exports.helper = helper;\n  _exports.htmlSafe = htmlSafe;\n  _exports.isHTMLSafe = isHTMLSafe$1;\n  Object.defineProperty(_exports, \"isSerializationFirstNode\", {\n    enumerable: true,\n    get: function () {\n      return _runtime.isSerializationFirstNode;\n    }\n  });\n  _exports.modifierCapabilities = void 0;\n  _exports.renderSettled = renderSettled;\n  _exports.setComponentManager = setComponentManager$1;\n  _exports.setTemplate = setTemplate;\n  _exports.setTemplates = setTemplates;\n  _exports.setupApplicationRegistry = setupApplicationRegistry;\n  _exports.setupEngineRegistry = setupEngineRegistry;\n  Object.defineProperty(_exports, \"template\", {\n    enumerable: true,\n    get: function () {\n      return _opcodeCompiler.templateFactory;\n    }\n  });\n  Object.defineProperty(_exports, \"templateCacheCounters\", {\n    enumerable: true,\n    get: function () {\n      return _opcodeCompiler.templateCacheCounters;\n    }\n  });\n  var RootTemplate = (0, _opcodeCompiler.templateFactory)({\n    \"id\": \"9BtKrod8\",\n    \"block\": \"[[[46,[30,0],null,null,null]],[],false,[\\\"component\\\"]]\",\n    \"moduleName\": \"packages/@ember/-internals/glimmer/lib/templates/root.hbs\",\n    \"isStrictMode\": false\n  });\n  _exports.RootTemplate = RootTemplate;\n  var InputTemplate = (0, _opcodeCompiler.templateFactory)({\n    \"id\": \"OGSIkgXP\",\n    \"block\": \"[[[11,\\\"input\\\"],[16,1,[30,0,[\\\"id\\\"]]],[16,0,[30,0,[\\\"class\\\"]]],[17,1],[16,4,[30,0,[\\\"type\\\"]]],[16,\\\"checked\\\",[30,0,[\\\"checked\\\"]]],[16,2,[30,0,[\\\"value\\\"]]],[4,[38,0],[\\\"change\\\",[30,0,[\\\"change\\\"]]],null],[4,[38,0],[\\\"input\\\",[30,0,[\\\"input\\\"]]],null],[4,[38,0],[\\\"keyup\\\",[30,0,[\\\"keyUp\\\"]]],null],[4,[38,0],[\\\"paste\\\",[30,0,[\\\"valueDidChange\\\"]]],null],[4,[38,0],[\\\"cut\\\",[30,0,[\\\"valueDidChange\\\"]]],null],[12],[13]],[\\\"&attrs\\\"],false,[\\\"on\\\"]]\",\n    \"moduleName\": \"packages/@ember/-internals/glimmer/lib/templates/input.hbs\",\n    \"isStrictMode\": false\n  });\n  function NOOP() {}\n  class InternalComponent {\n    // Override this\n    static toString() {\n      return 'internal component';\n    }\n    constructor(owner, args, caller) {\n      this.owner = owner;\n      this.args = args;\n      this.caller = caller;\n      (0, _owner2.setOwner)(this, owner);\n    }\n    /**\n     * The default HTML id attribute. We don't really _need_ one, this is just\n     * added for compatibility as it's hard to tell if people rely on it being\n     * present, and it doens't really hurt.\n     *\n     * However, don't rely on this internally, like passing it to `getElementId`.\n     * This can be (and often is) overriden by passing an `id` attribute on the\n     * invocation, which shadows this default id via `...attributes`.\n     */\n    get id() {\n      return (0, _utils.guidFor)(this);\n    }\n    /**\n     * The default HTML class attribute. Similar to the above, we don't _need_\n     * them, they are just added for compatibility as it's similarly hard to tell\n     * if people rely on it in their CSS etc, and it doens't really hurt.\n     */\n    get class() {\n      return 'ember-view';\n    }\n    validateArguments() {\n      for (var name of Object.keys(this.args.named)) {\n        if (!this.isSupportedArgument(name)) {\n          this.onUnsupportedArgument(name);\n        }\n      }\n    }\n    named(name) {\n      var ref = this.args.named[name];\n      return ref ? (0, _reference.valueForRef)(ref) : undefined;\n    }\n    positional(index) {\n      var ref = this.args.positional[index];\n      return ref ? (0, _reference.valueForRef)(ref) : undefined;\n    }\n    listenerFor(name) {\n      var listener = this.named(name);\n      if (listener) {\n        (true && !(typeof listener === 'function') && (0, _debug.assert)(`The \\`@${name}\\` argument to the <${this.constructor}> component must be a function`, typeof listener === 'function'));\n        return listener;\n      } else {\n        return NOOP;\n      }\n    }\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    isSupportedArgument(_name) {\n      return false;\n    }\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    onUnsupportedArgument(_name) {}\n    toString() {\n      return `<${this.constructor}:${(0, _utils.guidFor)(this)}>`;\n    }\n  }\n  var OPAQUE_CONSTRUCTOR_MAP = new WeakMap();\n  function opaquify(constructor, template) {\n    var _opaque = {\n      // Factory interface\n      create() {\n        throw (0, _debug.assert)('Use constructor instead of create');\n      },\n      toString() {\n        return constructor.toString();\n      }\n    };\n    var opaque = _opaque;\n    OPAQUE_CONSTRUCTOR_MAP.set(opaque, constructor);\n    (0, _manager2.setInternalComponentManager)(INTERNAL_COMPONENT_MANAGER, opaque);\n    (0, _manager2.setComponentTemplate)(template, opaque);\n    return opaque;\n  }\n  function deopaquify(opaque) {\n    var constructor = OPAQUE_CONSTRUCTOR_MAP.get(opaque);\n    (true && !(constructor) && (0, _debug.assert)(`[BUG] Invalid internal component constructor: ${opaque}`, constructor));\n    return constructor;\n  }\n  var CAPABILITIES = {\n    dynamicLayout: false,\n    dynamicTag: false,\n    prepareArgs: false,\n    createArgs: true,\n    attributeHook: false,\n    elementHook: false,\n    createCaller: true,\n    dynamicScope: false,\n    updateHook: false,\n    createInstance: true,\n    wrapped: false,\n    willDestroy: false,\n    hasSubOwner: false\n  };\n  class InternalManager {\n    getCapabilities() {\n      return CAPABILITIES;\n    }\n    create(owner, definition, args, _env, _dynamicScope, caller) {\n      (true && !((0, _reference.isConstRef)(caller)) && (0, _debug.assert)('caller must be const', (0, _reference.isConstRef)(caller)));\n      var ComponentClass = deopaquify(definition);\n      var instance = new ComponentClass(owner, args.capture(), (0, _reference.valueForRef)(caller));\n      (0, _validator.untrack)(instance['validateArguments'].bind(instance));\n      return instance;\n    }\n    didCreate() {}\n    didUpdate() {}\n    didRenderLayout() {}\n    didUpdateLayout() {}\n    getDebugName(definition) {\n      return definition.toString();\n    }\n    getSelf(instance) {\n      return (0, _reference.createConstRef)(instance, 'this');\n    }\n    getDestroyable(instance) {\n      return instance;\n    }\n  }\n  var INTERNAL_COMPONENT_MANAGER = new InternalManager();\n  var __decorate = undefined && undefined.__decorate || function (decorators, target, key, desc) {\n    var c = arguments.length,\n      r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n      d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) {\n      if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    }\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n  };\n  var UNINITIALIZED = Object.freeze({});\n  function elementForEvent(event) {\n    (true && !(event.target instanceof HTMLInputElement || event.target instanceof HTMLTextAreaElement) && (0, _debug.assert)('[BUG] event target must be an <input> or <textarea> element', event.target instanceof HTMLInputElement || event.target instanceof HTMLTextAreaElement));\n    return event.target;\n  }\n  function valueForEvent(event) {\n    return elementForEvent(event).value;\n  }\n  function devirtualize(callback) {\n    return event => callback(valueForEvent(event), event);\n  }\n  function valueFrom(reference) {\n    if (reference === undefined) {\n      return new LocalValue(undefined);\n    } else if ((0, _reference.isConstRef)(reference)) {\n      return new LocalValue((0, _reference.valueForRef)(reference));\n    } else if ((0, _reference.isUpdatableRef)(reference)) {\n      return new UpstreamValue(reference);\n    } else {\n      return new ForkedValue(reference);\n    }\n  }\n  class LocalValue {\n    constructor(value) {\n      this.value = value;\n    }\n    get() {\n      return this.value;\n    }\n    set(value) {\n      this.value = value;\n    }\n  }\n  __decorate([_metal.tracked], LocalValue.prototype, \"value\", void 0);\n  class UpstreamValue {\n    constructor(reference) {\n      this.reference = reference;\n    }\n    get() {\n      return (0, _reference.valueForRef)(this.reference);\n    }\n    set(value) {\n      (0, _reference.updateRef)(this.reference, value);\n    }\n  }\n  class ForkedValue {\n    constructor(reference) {\n      this.lastUpstreamValue = UNINITIALIZED;\n      this.upstream = new UpstreamValue(reference);\n    }\n    get() {\n      var upstreamValue = this.upstream.get();\n      if (upstreamValue !== this.lastUpstreamValue) {\n        this.lastUpstreamValue = upstreamValue;\n        this.local = new LocalValue(upstreamValue);\n      }\n      (true && !(this.local) && (0, _debug.assert)('[BUG] this.local must have been initialized at this point', this.local));\n      return this.local.get();\n    }\n    set(value) {\n      (true && !(this.local) && (0, _debug.assert)('[BUG] this.local must have been initialized at this point', this.local));\n      this.local.set(value);\n    }\n  }\n  class AbstractInput extends InternalComponent {\n    constructor() {\n      super(...arguments);\n      this._value = valueFrom(this.args.named['value']);\n    }\n    validateArguments() {\n      (true && !(this.args.positional.length === 0) && (0, _debug.assert)(`The ${this.constructor} component does not take any positional arguments`, this.args.positional.length === 0));\n      super.validateArguments();\n    }\n    get value() {\n      return this._value.get();\n    }\n    set value(value) {\n      this._value.set(value);\n    }\n    valueDidChange(event) {\n      this.value = valueForEvent(event);\n    }\n    /**\n     * The `change` and `input` actions need to be overridden in the `Input`\n     * subclass. Unfortunately, some ember-source builds currently uses babel\n     * loose mode to transpile its classes. Having the `@action` decorator on the\n     * super class creates a getter on the prototype, and when the subclass\n     * overrides the method, the loose mode transpilation would emit something\n     * like `Subclass.prototype['change'] = function change() { ... }`, which\n     * fails because `prototype['change']` is getter-only/readonly. The correct\n     * solution is to use `Object.defineProperty(prototype, 'change', ...)` but\n     * that requires disabling loose mode. For now, the workaround is to add the\n     * decorator only on the subclass. This is more of a configuration issue on\n     * our own builds and doesn't really affect apps.\n     */\n    /* @action */\n    change(event) {\n      this.valueDidChange(event);\n    }\n    /* @action */\n    input(event) {\n      this.valueDidChange(event);\n    }\n    keyUp(event) {\n      switch (event.key) {\n        case 'Enter':\n          this.listenerFor('enter')(event);\n          this.listenerFor('insert-newline')(event);\n          break;\n        case 'Escape':\n          this.listenerFor('escape-press')(event);\n          break;\n      }\n    }\n    listenerFor(name) {\n      var listener = super.listenerFor(name);\n      if (this.isVirtualEventListener(name, listener)) {\n        return devirtualize(listener);\n      } else {\n        return listener;\n      }\n    }\n    isVirtualEventListener(name, _listener) {\n      var virtualEvents = ['enter', 'insert-newline', 'escape-press'];\n      return virtualEvents.indexOf(name) !== -1;\n    }\n  }\n  __decorate([_object.action], AbstractInput.prototype, \"valueDidChange\", null);\n  __decorate([_object.action], AbstractInput.prototype, \"keyUp\", null);\n  var __decorate$1 = undefined && undefined.__decorate || function (decorators, target, key, desc) {\n    var c = arguments.length,\n      r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n      d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) {\n      if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    }\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n  };\n  var isValidInputType;\n  if (_browserEnvironment.hasDOM) {\n    var INPUT_TYPES = Object.create(null);\n    var INPUT_ELEMENT = document.createElement('input');\n    INPUT_TYPES[''] = false;\n    INPUT_TYPES['text'] = true;\n    INPUT_TYPES['checkbox'] = true;\n    isValidInputType = type => {\n      var isValid = INPUT_TYPES[type];\n      if (isValid === undefined) {\n        try {\n          INPUT_ELEMENT.type = type;\n          isValid = INPUT_ELEMENT.type === type;\n        } catch (e) {\n          isValid = false;\n        } finally {\n          INPUT_ELEMENT.type = 'text';\n        }\n        INPUT_TYPES[type] = isValid;\n      }\n      return isValid;\n    };\n  } else {\n    isValidInputType = type => type !== '';\n  }\n  /**\n    See [Ember.Templates.components.Input](/ember/release/classes/Ember.Templates.components/methods/Input?anchor=Input).\n  \n    @method input\n    @for Ember.Templates.helpers\n    @param {Hash} options\n    @public\n    */\n  /**\n    An opaque interface which can be imported and used in strict-mode\n    templates to call <Input>.\n  \n    See [Ember.Templates.components.Input](/ember/release/classes/Ember.Templates.components/methods/Input?anchor=Input).\n  \n    @for @ember/component\n    @method Input\n    @see {Ember.Templates.components.Input}\n    @public\n  **/\n  /**\n    The `Input` component lets you create an HTML `<input>` element.\n  \n    ```handlebars\n    <Input @value=\"987\" />\n    ```\n  \n    creates an `<input>` element with `type=\"text\"` and value set to 987.\n  \n    ### Text field\n  \n    If no `type` argument is specified, a default of type 'text' is used.\n  \n    ```handlebars\n    Search:\n    <Input @value={{this.searchWord}} />\n    ```\n  \n    In this example, the initial value in the `<input>` will be set to the value of\n    `this.searchWord`. If the user changes the text, the value of `this.searchWord` will also be\n    updated.\n  \n    ### Actions\n  \n    The `Input` component takes a number of arguments with callbacks that are invoked in response to\n    user events.\n  \n    * `enter`\n    * `insert-newline`\n    * `escape-press`\n    * `focus-in`\n    * `focus-out`\n    * `key-down`\n    * `key-press`\n    * `key-up`\n  \n    These callbacks are passed to `Input` like this:\n  \n    ```handlebars\n    <Input @value={{this.searchWord}} @enter={{this.query}} />\n    ```\n  \n    Starting with Ember Octane, we recommend using the `{{on}}` modifier to call actions\n    on specific events, such as the input event.\n  \n    ```handlebars\n    <label for=\"input-name\">Name:</label>\n    <Input\n      @id=\"input-name\"\n      @value={{this.name}}\n      {{on \"input\" this.validateName}}\n    />\n    ```\n  \n    The event name (e.g. `focusout`, `input`, `keydown`) always follows the casing\n    that the HTML standard uses.\n  \n    ### `<input>` HTML Attributes to Avoid\n  \n    In most cases, if you want to pass an attribute to the underlying HTML `<input>` element, you\n    can pass the attribute directly, just like any other Ember component.\n  \n    ```handlebars\n    <Input @type=\"text\" size=\"10\" />\n    ```\n  \n    In this example, the `size` attribute will be applied to the underlying `<input>` element in the\n    outputted HTML.\n  \n    However, there are a few attributes where you **must** use the `@` version.\n  \n    * `@type`: This argument is used to control which Ember component is used under the hood\n    * `@value`: The `@value` argument installs a two-way binding onto the element. If you wanted a\n      one-way binding, use `<input>` with the `value` property and the `input` event instead.\n    * `@checked` (for checkboxes): like `@value`, the `@checked` argument installs a two-way binding\n      onto the element. If you wanted a one-way binding, use `<input type=\"checkbox\">` with\n      `checked` and the `input` event instead.\n  \n    ### Checkbox\n  \n    To create an `<input type=\"checkbox\">`:\n  \n    ```handlebars\n    Emberize Everything:\n    <Input @type=\"checkbox\" @checked={{this.isEmberized}} name=\"isEmberized\" />\n    ```\n  \n    This will bind the checked state of this checkbox to the value of `isEmberized` -- if either one\n    changes, it will be reflected in the other.\n  \n    @method Input\n    @for Ember.Templates.components\n    @param {Hash} options\n    @public\n  */\n  class Input extends AbstractInput {\n    constructor() {\n      super(...arguments);\n      this._checked = valueFrom(this.args.named['checked']);\n    }\n    static toString() {\n      return 'Input';\n    }\n    /**\n     * The HTML class attribute.\n     */\n    get class() {\n      if (this.isCheckbox) {\n        return 'ember-checkbox ember-view';\n      } else {\n        return 'ember-text-field ember-view';\n      }\n    }\n    /**\n     * The HTML type attribute.\n     */\n    get type() {\n      var type = this.named('type');\n      if (type === null || type === undefined) {\n        return 'text';\n      }\n      (true && !(typeof type === 'string') && (0, _debug.assert)('The `@type` argument to the <Input> component must be a string', typeof type === 'string'));\n      return isValidInputType(type) ? type : 'text';\n    }\n    get isCheckbox() {\n      return this.named('type') === 'checkbox';\n    }\n    get checked() {\n      if (this.isCheckbox) {\n        (true && (0, _debug.warn)('`<Input @type=\"checkbox\" />` reflects its checked state via the `@checked` argument. ' + 'You wrote `<Input @type=\"checkbox\" @value={{...}} />` which is likely not what you intended. ' + 'Did you mean `<Input @type=\"checkbox\" @checked={{...}} />`?', (0, _validator.untrack)(() => this.args.named['checked'] !== undefined || this.args.named['value'] === undefined || typeof (0, _reference.valueForRef)(this.args.named['value']) === 'string'), {\n          id: 'ember.built-in-components.input-checkbox-value'\n        }));\n        return this._checked.get();\n      } else {\n        return undefined;\n      }\n    }\n    set checked(checked) {\n      (true && (0, _debug.warn)('`<Input @type=\"checkbox\" />` reflects its checked state via the `@checked` argument. ' + 'You wrote `<Input @type=\"checkbox\" @value={{...}} />` which is likely not what you intended. ' + 'Did you mean `<Input @type=\"checkbox\" @checked={{...}} />`?', (0, _validator.untrack)(() => this.args.named['checked'] !== undefined || this.args.named['value'] === undefined || typeof (0, _reference.valueForRef)(this.args.named['value']) === 'string'), {\n        id: 'ember.built-in-components.input-checkbox-value'\n      }));\n      this._checked.set(checked);\n    }\n    change(event) {\n      if (this.isCheckbox) {\n        this.checkedDidChange(event);\n      } else {\n        super.change(event);\n      }\n    }\n    input(event) {\n      if (!this.isCheckbox) {\n        super.input(event);\n      }\n    }\n    checkedDidChange(event) {\n      var element = event.target;\n      (true && !(element instanceof HTMLInputElement) && (0, _debug.assert)('[BUG] element must be an <input>', element instanceof HTMLInputElement));\n      this.checked = element.checked;\n    }\n    isSupportedArgument(name) {\n      var supportedArguments = ['type', 'value', 'checked', 'enter', 'insert-newline', 'escape-press'];\n      return supportedArguments.indexOf(name) !== -1 || super.isSupportedArgument(name);\n    }\n  }\n  __decorate$1([_object.action], Input.prototype, \"change\", null);\n  __decorate$1([_object.action], Input.prototype, \"input\", null);\n  __decorate$1([_object.action], Input.prototype, \"checkedDidChange\", null);\n  var Input$1 = opaquify(Input, InputTemplate);\n  _exports.Input = Input$1;\n  var LinkToTemplate = (0, _opcodeCompiler.templateFactory)({\n    \"id\": \"CVwkBtGh\",\n    \"block\": \"[[[11,3],[16,1,[30,0,[\\\"id\\\"]]],[16,0,[30,0,[\\\"class\\\"]]],[16,\\\"role\\\",[30,0,[\\\"role\\\"]]],[16,\\\"title\\\",[30,0,[\\\"title\\\"]]],[16,\\\"rel\\\",[30,0,[\\\"rel\\\"]]],[16,\\\"tabindex\\\",[30,0,[\\\"tabindex\\\"]]],[16,\\\"target\\\",[30,0,[\\\"target\\\"]]],[17,1],[16,6,[30,0,[\\\"href\\\"]]],[4,[38,0],[\\\"click\\\",[30,0,[\\\"click\\\"]]],null],[12],[18,2,null],[13]],[\\\"&attrs\\\",\\\"&default\\\"],false,[\\\"on\\\",\\\"yield\\\"]]\",\n    \"moduleName\": \"packages/@ember/-internals/glimmer/lib/templates/link-to.hbs\",\n    \"isStrictMode\": false\n  });\n  var __decorate$2 = undefined && undefined.__decorate || function (decorators, target, key, desc) {\n    var c = arguments.length,\n      r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n      d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) {\n      if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    }\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n  };\n  var EMPTY_ARRAY$1 = [];\n  var EMPTY_QUERY_PARAMS = {};\n  (0, _debug.debugFreeze)(EMPTY_ARRAY$1);\n  (0, _debug.debugFreeze)(EMPTY_QUERY_PARAMS);\n  function isMissing(value) {\n    return value === null || value === undefined;\n  }\n  function isPresent(value) {\n    return !isMissing(value);\n  }\n  function isQueryParams(value) {\n    return typeof value === 'object' && value !== null && value['isQueryParams'] === true;\n  }\n  /**\n    The `LinkTo` component renders a link to the supplied `routeName` passing an optionally\n    supplied model to the route as its `model` context of the route. The block for `LinkTo`\n    becomes the contents of the rendered element:\n  \n    ```handlebars\n    <LinkTo @route='photoGallery'>\n      Great Hamster Photos\n    </LinkTo>\n    ```\n  \n    This will result in:\n  \n    ```html\n    <a href=\"/hamster-photos\">\n      Great Hamster Photos\n    </a>\n    ```\n  \n    ### Disabling the `LinkTo` component\n  \n    The `LinkTo` component can be disabled by using the `disabled` argument. A disabled link\n    doesn't result in a transition when activated, and adds the `disabled` class to the `<a>`\n    element.\n  \n    (The class name to apply to the element can be overridden by using the `disabledClass`\n    argument)\n  \n    ```handlebars\n    <LinkTo @route='photoGallery' @disabled={{true}}>\n      Great Hamster Photos\n    </LinkTo>\n    ```\n  \n    ### Handling `href`\n  \n    `<LinkTo>` will use your application's Router to fill the element's `href` property with a URL\n    that matches the path to the supplied `routeName`.\n  \n    ### Handling current route\n  \n    The `LinkTo` component will apply a CSS class name of 'active' when the application's current\n    route matches the supplied routeName. For example, if the application's current route is\n    'photoGallery.recent', then the following invocation of `LinkTo`:\n  \n    ```handlebars\n    <LinkTo @route='photoGallery.recent'>\n      Great Hamster Photos\n    </LinkTo>\n    ```\n  \n    will result in\n  \n    ```html\n    <a href=\"/hamster-photos/this-week\" class=\"active\">\n      Great Hamster Photos\n    </a>\n    ```\n  \n    The CSS class used for active classes can be customized by passing an `activeClass` argument:\n  \n    ```handlebars\n    <LinkTo @route='photoGallery.recent' @activeClass=\"current-url\">\n      Great Hamster Photos\n    </LinkTo>\n    ```\n  \n    ```html\n    <a href=\"/hamster-photos/this-week\" class=\"current-url\">\n      Great Hamster Photos\n    </a>\n    ```\n  \n    ### Keeping a link active for other routes\n  \n    If you need a link to be 'active' even when it doesn't match the current route, you can use the\n    `current-when` argument.\n  \n    ```handlebars\n    <LinkTo @route='photoGallery' @current-when='photos'>\n      Photo Gallery\n    </LinkTo>\n    ```\n  \n    This may be helpful for keeping links active for:\n  \n    * non-nested routes that are logically related\n    * some secondary menu approaches\n    * 'top navigation' with 'sub navigation' scenarios\n  \n    A link will be active if `current-when` is `true` or the current\n    route is the route this link would transition to.\n  \n    To match multiple routes 'space-separate' the routes:\n  \n    ```handlebars\n    <LinkTo @route='gallery' @current-when='photos drawings paintings'>\n      Art Gallery\n    </LinkTo>\n    ```\n  \n    ### Supplying a model\n  \n    An optional `model` argument can be used for routes whose\n    paths contain dynamic segments. This argument will become\n    the model context of the linked route:\n  \n    ```javascript\n    Router.map(function() {\n      this.route(\"photoGallery\", {path: \"hamster-photos/:photo_id\"});\n    });\n    ```\n  \n    ```handlebars\n    <LinkTo @route='photoGallery' @model={{this.aPhoto}}>\n      {{aPhoto.title}}\n    </LinkTo>\n    ```\n  \n    ```html\n    <a href=\"/hamster-photos/42\">\n      Tomster\n    </a>\n    ```\n  \n    ### Supplying multiple models\n  \n    For deep-linking to route paths that contain multiple\n    dynamic segments, the `models` argument can be used.\n  \n    As the router transitions through the route path, each\n    supplied model argument will become the context for the\n    route with the dynamic segments:\n  \n    ```javascript\n    Router.map(function() {\n      this.route(\"photoGallery\", { path: \"hamster-photos/:photo_id\" }, function() {\n        this.route(\"comment\", {path: \"comments/:comment_id\"});\n      });\n    });\n    ```\n  \n    This argument will become the model context of the linked route:\n  \n    ```handlebars\n    <LinkTo @route='photoGallery.comment' @models={{array this.aPhoto this.comment}}>\n      {{comment.body}}\n    </LinkTo>\n    ```\n  \n    ```html\n    <a href=\"/hamster-photos/42/comments/718\">\n      A+++ would snuggle again.\n    </a>\n    ```\n  \n    ### Supplying an explicit dynamic segment value\n  \n    If you don't have a model object available to pass to `LinkTo`,\n    an optional string or integer argument can be passed for routes whose\n    paths contain dynamic segments. This argument will become the value\n    of the dynamic segment:\n  \n    ```javascript\n    Router.map(function() {\n      this.route(\"photoGallery\", { path: \"hamster-photos/:photo_id\" });\n    });\n    ```\n  \n    ```handlebars\n    <LinkTo @route='photoGallery' @model={{aPhotoId}}>\n      {{this.aPhoto.title}}\n    </LinkTo>\n    ```\n  \n    ```html\n    <a href=\"/hamster-photos/42\">\n      Tomster\n    </a>\n    ```\n  \n    When transitioning into the linked route, the `model` hook will\n    be triggered with parameters including this passed identifier.\n  \n    ### Supplying query parameters\n  \n    If you need to add optional key-value pairs that appear to the right of the ? in a URL,\n    you can use the `query` argument.\n  \n    ```handlebars\n    <LinkTo @route='photoGallery' @query={{hash page=1 per_page=20}}>\n      Great Hamster Photos\n    </LinkTo>\n    ```\n  \n    This will result in:\n  \n    ```html\n    <a href=\"/hamster-photos?page=1&per_page=20\">\n      Great Hamster Photos\n    </a>\n    ```\n  \n    @for Ember.Templates.components\n    @method LinkTo\n    @public\n  */\n  /**\n    @module @ember/routing\n  */\n  /**\n    See [Ember.Templates.components.LinkTo](/ember/release/classes/Ember.Templates.components/methods/input?anchor=LinkTo).\n  \n    @for Ember.Templates.helpers\n    @method link-to\n    @see {Ember.Templates.components.LinkTo}\n    @public\n  **/\n  /**\n    An opaque interface which can be imported and used in strict-mode\n    templates to call <LinkTo>.\n  \n    See [Ember.Templates.components.LinkTo](/ember/release/classes/Ember.Templates.components/methods/input?anchor=LinkTo).\n  \n    @for @ember/routing\n    @method LinkTo\n    @see {Ember.Templates.components.LinkTo}\n    @public\n  **/\n  class LinkTo extends InternalComponent {\n    constructor() {\n      super(...arguments);\n      // GH #17963\n      this.currentRouteCache = (0, _validator.createCache)(() => {\n        (0, _validator.consumeTag)((0, _validator.tagFor)(this.routing, 'currentState'));\n        return (0, _validator.untrack)(() => this.routing.currentRouteName);\n      });\n    }\n    static toString() {\n      return 'LinkTo';\n    }\n    validateArguments() {\n      (true && !(!this.isEngine || this.engineMountPoint !== undefined) && (0, _debug.assert)('You attempted to use the <LinkTo> component within a routeless engine, this is not supported. ' + 'If you are using the ember-engines addon, use the <LinkToExternal> component instead. ' + 'See https://ember-engines.com/docs/links for more info.', !this.isEngine || this.engineMountPoint !== undefined));\n      (true && !('route' in this.args.named || 'model' in this.args.named || 'models' in this.args.named || 'query' in this.args.named) && (0, _debug.assert)('You must provide at least one of the `@route`, `@model`, `@models` or `@query` arguments to `<LinkTo>`.', 'route' in this.args.named || 'model' in this.args.named || 'models' in this.args.named || 'query' in this.args.named));\n      (true && !(!('model' in this.args.named && 'models' in this.args.named)) && (0, _debug.assert)('You cannot provide both the `@model` and `@models` arguments to the <LinkTo> component.', !('model' in this.args.named && 'models' in this.args.named)));\n      super.validateArguments();\n    }\n    get class() {\n      var classes = 'ember-view';\n      if (this.isActive) {\n        classes += this.classFor('active');\n        if (this.willBeActive === false) {\n          classes += ' ember-transitioning-out';\n        }\n      } else if (this.willBeActive) {\n        classes += ' ember-transitioning-in';\n      }\n      if (this.isLoading) {\n        classes += this.classFor('loading');\n      }\n      if (this.isDisabled) {\n        classes += this.classFor('disabled');\n      }\n      return classes;\n    }\n    get href() {\n      if (this.isLoading) {\n        return '#';\n      }\n      var {\n        routing,\n        route,\n        models,\n        query\n      } = this;\n      (true && !(isPresent(route)) && (0, _debug.assert)('[BUG] route can only be missing if isLoading is true', isPresent(route))); // consume the current router state so we invalidate when QP changes\n      // TODO: can we narrow this down to QP changes only?\n      (0, _validator.consumeTag)((0, _validator.tagFor)(routing, 'currentState'));\n      if (true /* DEBUG */) {\n        try {\n          return routing.generateURL(route, models, query);\n        } catch (e) {\n          var details = e instanceof Error ? e.message : (0, _debug.inspect)(e);\n          var message = `While generating link to route \"${route}\": ${details}`;\n          if (e instanceof Error) {\n            e.message = message;\n            throw e;\n          } else {\n            throw message;\n          }\n        }\n      } else {\n        return routing.generateURL(route, models, query);\n      }\n    }\n    click(event) {\n      if (!(0, _views.isSimpleClick)(event)) {\n        return;\n      }\n      var element = event.currentTarget;\n      (true && !(element instanceof HTMLAnchorElement) && (0, _debug.assert)('[BUG] must be an <a> element', element instanceof HTMLAnchorElement));\n      var isSelf = element.target === '' || element.target === '_self';\n      if (isSelf) {\n        this.preventDefault(event);\n      } else {\n        return;\n      }\n      if (this.isDisabled) {\n        return;\n      }\n      if (this.isLoading) {\n        (true && (0, _debug.warn)('This link is in an inactive loading state because at least one of its models ' + 'currently has a null/undefined value, or the provided route name is invalid.', false, {\n          id: 'ember-glimmer.link-to.inactive-loading-state'\n        }));\n        return;\n      }\n      var {\n        routing,\n        route,\n        models,\n        query,\n        replace\n      } = this;\n      var payload = {\n        routeName: route,\n        queryParams: query,\n        transition: undefined\n      };\n      (0, _instrumentation.flaggedInstrument)('interaction.link-to', payload, () => {\n        (true && !(isPresent(route)) && (0, _debug.assert)('[BUG] route can only be missing if isLoading is true', isPresent(route)));\n        payload.transition = routing.transitionTo(route, models, query, replace);\n      });\n    }\n    get route() {\n      if ('route' in this.args.named) {\n        var route = this.named('route');\n        (true && !(isMissing(route) || typeof route === 'string') && (0, _debug.assert)('The `@route` argument to the <LinkTo> component must be a string', isMissing(route) || typeof route === 'string'));\n        return route && this.namespaceRoute(route);\n      } else {\n        return this.currentRoute;\n      }\n    }\n    get currentRoute() {\n      return (0, _validator.getValue)(this.currentRouteCache);\n    }\n    // TODO: not sure why generateURL takes {}[] instead of unknown[]\n    get models() {\n      if ('models' in this.args.named) {\n        var models = this.named('models');\n        (true && !(Array.isArray(models)) && (0, _debug.assert)('The `@models` argument to the <LinkTo> component must be an array.', Array.isArray(models)));\n        return models;\n      } else if ('model' in this.args.named) {\n        return [this.named('model')];\n      } else {\n        return EMPTY_ARRAY$1;\n      }\n    }\n    get query() {\n      if ('query' in this.args.named) {\n        var query = this.named('query');\n        (true && !(query !== null && typeof query === 'object') && (0, _debug.assert)('The `@query` argument to the <LinkTo> component must be an object.', query !== null && typeof query === 'object'));\n        return Object.assign({}, query);\n      } else {\n        return EMPTY_QUERY_PARAMS;\n      }\n    }\n    get replace() {\n      return this.named('replace') === true;\n    }\n    get isActive() {\n      return this.isActiveForState(this.routing.currentState);\n    }\n    get willBeActive() {\n      var current = this.routing.currentState;\n      var target = this.routing.targetState;\n      if (current === target) {\n        return null;\n      } else {\n        return this.isActiveForState(target);\n      }\n    }\n    get isLoading() {\n      return isMissing(this.route) || this.models.some(model => isMissing(model));\n    }\n    get isDisabled() {\n      return Boolean(this.named('disabled'));\n    }\n    get isEngine() {\n      var owner = this.owner;\n      return owner instanceof _instance.default && (0, _engine.getEngineParent)(owner) !== undefined;\n    }\n    get engineMountPoint() {\n      var owner = this.owner;\n      return owner instanceof _instance.default ? owner.mountPoint : undefined;\n    }\n    classFor(state) {\n      var className = this.named(`${state}Class`);\n      (true && !(isMissing(className) || typeof className === 'string' || typeof className === 'boolean') && (0, _debug.assert)(`The \\`@${state}Class\\` argument to the <LinkTo> component must be a string or boolean`, isMissing(className) || typeof className === 'string' || typeof className === 'boolean'));\n      if (className === true || isMissing(className)) {\n        return ` ${state}`;\n      } else if (className) {\n        return ` ${className}`;\n      } else {\n        return '';\n      }\n    }\n    namespaceRoute(route) {\n      var {\n        engineMountPoint\n      } = this;\n      if (engineMountPoint === undefined) {\n        return route;\n      } else if (route === 'application') {\n        return engineMountPoint;\n      } else {\n        return `${engineMountPoint}.${route}`;\n      }\n    }\n    isActiveForState(state) {\n      if (!isPresent(state)) {\n        return false;\n      }\n      if (this.isLoading) {\n        return false;\n      }\n      var currentWhen = this.named('current-when');\n      if (typeof currentWhen === 'boolean') {\n        return currentWhen;\n      } else if (typeof currentWhen === 'string') {\n        var {\n          models,\n          routing\n        } = this;\n        return currentWhen.split(' ').some(route => routing.isActiveForRoute(models, undefined, this.namespaceRoute(route), state));\n      } else {\n        var {\n          route,\n          models: _models,\n          query,\n          routing: _routing\n        } = this;\n        (true && !(isPresent(route)) && (0, _debug.assert)('[BUG] route can only be missing if isLoading is true', isPresent(route)));\n        return _routing.isActiveForRoute(_models, query, route, state);\n      }\n    }\n    preventDefault(event) {\n      event.preventDefault();\n    }\n    isSupportedArgument(name) {\n      var supportedArguments = ['route', 'model', 'models', 'query', 'replace', 'disabled', 'current-when', 'activeClass', 'loadingClass', 'disabledClass'];\n      return supportedArguments.indexOf(name) !== -1 || super.isSupportedArgument(name);\n    }\n  }\n  __decorate$2([(0, _service.service)('-routing')], LinkTo.prototype, \"routing\", void 0);\n  __decorate$2([_object.action], LinkTo.prototype, \"click\", null);\n  var {\n    prototype\n  } = LinkTo;\n  var descriptorFor = (target, property) => {\n    if (target) {\n      return Object.getOwnPropertyDescriptor(target, property) || descriptorFor(Object.getPrototypeOf(target), property);\n    } else {\n      return null;\n    }\n  };\n  // @href\n  {\n    var superOnUnsupportedArgument = prototype['onUnsupportedArgument'];\n    Object.defineProperty(prototype, 'onUnsupportedArgument', {\n      configurable: true,\n      enumerable: false,\n      value: function onUnsupportedArgument(name) {\n        if (name === 'href') {\n          (true && !(false) && (0, _debug.assert)(`Passing the \\`@href\\` argument to <LinkTo> is not supported.`));\n        } else {\n          superOnUnsupportedArgument.call(this, name);\n        }\n      }\n    });\n  }\n  // QP\n  {\n    var superModelsDescriptor = descriptorFor(prototype, 'models');\n    (true && !(superModelsDescriptor && typeof superModelsDescriptor.get === 'function') && (0, _debug.assert)(`[BUG] expecting models to be a getter on <LinkTo>`, superModelsDescriptor && typeof superModelsDescriptor.get === 'function'));\n    var superModelsGetter = superModelsDescriptor.get;\n    Object.defineProperty(prototype, 'models', {\n      configurable: true,\n      enumerable: false,\n      get: function models() {\n        var models = superModelsGetter.call(this);\n        if (models.length > 0 && !('query' in this.args.named)) {\n          if (isQueryParams(models[models.length - 1])) {\n            models = models.slice(0, -1);\n          }\n        }\n        return models;\n      }\n    });\n    var superQueryDescriptor = descriptorFor(prototype, 'query');\n    (true && !(superQueryDescriptor && typeof superQueryDescriptor.get === 'function') && (0, _debug.assert)(`[BUG] expecting query to be a getter on <LinkTo>`, superQueryDescriptor && typeof superQueryDescriptor.get === 'function'));\n    var superQueryGetter = superQueryDescriptor.get;\n    Object.defineProperty(prototype, 'query', {\n      configurable: true,\n      enumerable: false,\n      get: function query() {\n        var _a;\n        if ('query' in this.args.named) {\n          var qp = superQueryGetter.call(this);\n          if (isQueryParams(qp)) {\n            return (_a = qp.values) !== null && _a !== void 0 ? _a : EMPTY_QUERY_PARAMS;\n          } else {\n            return qp;\n          }\n        } else {\n          var models = superModelsGetter.call(this);\n          if (models.length > 0) {\n            var _qp = models[models.length - 1];\n            if (isQueryParams(_qp) && _qp.values !== null) {\n              return _qp.values;\n            }\n          }\n          return EMPTY_QUERY_PARAMS;\n        }\n      }\n    });\n  }\n  // Positional Arguments\n  {\n    var _superOnUnsupportedArgument = prototype['onUnsupportedArgument'];\n    Object.defineProperty(prototype, 'onUnsupportedArgument', {\n      configurable: true,\n      enumerable: false,\n      value: function onUnsupportedArgument(name) {\n        if (name !== 'params') {\n          _superOnUnsupportedArgument.call(this, name);\n        }\n      }\n    });\n  }\n  var LinkTo$1 = opaquify(LinkTo, LinkToTemplate);\n  _exports.LinkTo = LinkTo$1;\n  var TextareaTemplate = (0, _opcodeCompiler.templateFactory)({\n    \"id\": \"OpzctQXz\",\n    \"block\": \"[[[11,\\\"textarea\\\"],[16,1,[30,0,[\\\"id\\\"]]],[16,0,[30,0,[\\\"class\\\"]]],[17,1],[16,2,[30,0,[\\\"value\\\"]]],[4,[38,0],[\\\"change\\\",[30,0,[\\\"change\\\"]]],null],[4,[38,0],[\\\"input\\\",[30,0,[\\\"input\\\"]]],null],[4,[38,0],[\\\"keyup\\\",[30,0,[\\\"keyUp\\\"]]],null],[4,[38,0],[\\\"paste\\\",[30,0,[\\\"valueDidChange\\\"]]],null],[4,[38,0],[\\\"cut\\\",[30,0,[\\\"valueDidChange\\\"]]],null],[12],[13]],[\\\"&attrs\\\"],false,[\\\"on\\\"]]\",\n    \"moduleName\": \"packages/@ember/-internals/glimmer/lib/templates/textarea.hbs\",\n    \"isStrictMode\": false\n  });\n  var __decorate$3 = undefined && undefined.__decorate || function (decorators, target, key, desc) {\n    var c = arguments.length,\n      r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n      d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) {\n      if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    }\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n  };\n  /**\n    The `Textarea` component inserts a new instance of `<textarea>` tag into the template.\n  \n    The `@value` argument provides the content of the `<textarea>`.\n  \n    This template:\n  \n    ```handlebars\n    <Textarea @value=\"A bunch of text\" />\n    ```\n  \n    Would result in the following HTML:\n  \n    ```html\n    <textarea class=\"ember-text-area\">\n      A bunch of text\n    </textarea>\n    ```\n  \n    The `@value` argument is two-way bound. If the user types text into the textarea, the `@value`\n    argument is updated. If the `@value` argument is updated, the text in the textarea is updated.\n  \n    In the following example, the `writtenWords` property on the component will be updated as the user\n    types 'Lots of text' into the text area of their browser's window.\n  \n    ```app/components/word-editor.js\n    import Component from '@glimmer/component';\n    import { tracked } from '@glimmer/tracking';\n  \n    export default class WordEditorComponent extends Component {\n      @tracked writtenWords = \"Lots of text that IS bound\";\n    }\n    ```\n  \n    ```handlebars\n    <Textarea @value={{writtenWords}} />\n    ```\n  \n    Would result in the following HTML:\n  \n    ```html\n    <textarea class=\"ember-text-area\">\n      Lots of text that IS bound\n    </textarea>\n    ```\n  \n    If you wanted a one way binding, you could use the `<textarea>` element directly, and use the\n    `value` DOM property and the `input` event.\n  \n    ### Actions\n  \n    The `Textarea` component takes a number of arguments with callbacks that are invoked in\n    response to user events.\n  \n    * `enter`\n    * `insert-newline`\n    * `escape-press`\n    * `focus-in`\n    * `focus-out`\n    * `key-press`\n  \n    These callbacks are passed to `Textarea` like this:\n  \n    ```handlebars\n    <Textarea @value={{this.searchWord}} @enter={{this.query}} />\n    ```\n  \n    ## Classic Invocation Syntax\n  \n    The `Textarea` component can also be invoked using curly braces, just like any other Ember\n    component.\n  \n    For example, this is an invocation using angle-bracket notation:\n  \n    ```handlebars\n    <Textarea @value={{this.searchWord}} @enter={{this.query}} />\n    ```\n  \n    You could accomplish the same thing using classic invocation:\n  \n    ```handlebars\n    {{textarea value=this.searchWord enter=this.query}}\n    ```\n  \n    The main difference is that angle-bracket invocation supports any HTML attribute using HTML\n    attribute syntax, because attributes and arguments have different syntax when using angle-bracket\n    invocation. Curly brace invocation, on the other hand, only has a single syntax for arguments,\n    and components must manually map attributes onto component arguments.\n  \n    When using classic invocation with `{{textarea}}`, only the following attributes are mapped onto\n    arguments:\n  \n    * rows\n    * cols\n    * name\n    * selectionEnd\n    * selectionStart\n    * autocomplete\n    * wrap\n    * lang\n    * dir\n    * value\n  \n    ## Classic `layout` and `layoutName` properties\n  \n    Because HTML `textarea` elements do not contain inner HTML the `layout` and\n    `layoutName` properties will not be applied.\n  \n    @method Textarea\n    @for Ember.Templates.components\n    @public\n  */\n  /**\n    See Ember.Templates.components.Textarea.\n  \n    @method textarea\n    @for Ember.Templates.helpers\n    @see {Ember.Templates.components.Textarea}\n    @public\n  */\n  /**\n    An opaque interface which can be imported and used in strict-mode\n    templates to call <Textarea>.\n  \n    See [Ember.Templates.components.Textarea](/ember/release/classes/Ember.Templates.components/methods/Textarea?anchor=Input).\n  \n    @for @ember/component\n    @method Textarea\n    @see {Ember.Templates.components.Textarea}\n    @public\n  **/\n  class Textarea extends AbstractInput {\n    static toString() {\n      return 'Textarea';\n    }\n    get class() {\n      return 'ember-text-area ember-view';\n    }\n    // See abstract-input.ts for why these are needed\n    change(event) {\n      super.change(event);\n    }\n    input(event) {\n      super.input(event);\n    }\n    isSupportedArgument(name) {\n      var supportedArguments = ['type', 'value', 'enter', 'insert-newline', 'escape-press'];\n      return supportedArguments.indexOf(name) !== -1 || super.isSupportedArgument(name);\n    }\n  }\n  __decorate$3([_object.action], Textarea.prototype, \"change\", null);\n  __decorate$3([_object.action], Textarea.prototype, \"input\", null);\n  var Textarea$1 = opaquify(Textarea, TextareaTemplate);\n  _exports.Textarea = Textarea$1;\n  function isTemplateFactory(template) {\n    return typeof template === 'function';\n  }\n  function referenceForParts(rootRef, parts) {\n    var isAttrs = parts[0] === 'attrs';\n    // TODO deprecate this\n    if (isAttrs) {\n      parts.shift();\n      if (parts.length === 1) {\n        return (0, _reference.childRefFor)(rootRef, parts[0]);\n      }\n    }\n    return (0, _reference.childRefFromParts)(rootRef, parts);\n  }\n  function parseAttributeBinding(microsyntax) {\n    var colonIndex = microsyntax.indexOf(':');\n    if (colonIndex === -1) {\n      (true && !(microsyntax !== 'class') && (0, _debug.assert)('You cannot use class as an attributeBinding, use classNameBindings instead.', microsyntax !== 'class'));\n      return [microsyntax, microsyntax, true];\n    } else {\n      var prop = microsyntax.substring(0, colonIndex);\n      var attribute = microsyntax.substring(colonIndex + 1);\n      (true && !(attribute !== 'class') && (0, _debug.assert)('You cannot use class as an attributeBinding, use classNameBindings instead.', attribute !== 'class'));\n      return [prop, attribute, false];\n    }\n  }\n  function installAttributeBinding(component, rootRef, parsed, operations) {\n    var [prop, attribute, isSimple] = parsed;\n    if (attribute === 'id') {\n      var elementId = (0, _metal.get)(component, prop);\n      if (elementId === undefined || elementId === null) {\n        elementId = component.elementId;\n      }\n      var elementIdRef = (0, _reference.createPrimitiveRef)(elementId);\n      operations.setAttribute('id', elementIdRef, true, null);\n      return;\n    }\n    var isPath = prop.indexOf('.') > -1;\n    var reference = isPath ? referenceForParts(rootRef, prop.split('.')) : (0, _reference.childRefFor)(rootRef, prop);\n    (true && !(!(isSimple && isPath)) && (0, _debug.assert)(`Illegal attributeBinding: '${prop}' is not a valid attribute name.`, !(isSimple && isPath)));\n    operations.setAttribute(attribute, reference, false, null);\n  }\n  function createClassNameBindingRef(rootRef, microsyntax, operations) {\n    var parts = microsyntax.split(':');\n    var [prop, truthy, falsy] = parts;\n    // NOTE: This could be an empty string\n    (true && !(prop !== undefined) && (0, _debug.assert)('has prop', prop !== undefined)); // Will always have at least one part\n    var isStatic = prop === '';\n    if (isStatic) {\n      operations.setAttribute('class', (0, _reference.createPrimitiveRef)(truthy), true, null);\n    } else {\n      var isPath = prop.indexOf('.') > -1;\n      var _parts = isPath ? prop.split('.') : [];\n      var value = isPath ? referenceForParts(rootRef, _parts) : (0, _reference.childRefFor)(rootRef, prop);\n      var ref;\n      if (truthy === undefined) {\n        ref = createSimpleClassNameBindingRef(value, isPath ? _parts[_parts.length - 1] : prop);\n      } else {\n        ref = createColonClassNameBindingRef(value, truthy, falsy);\n      }\n      operations.setAttribute('class', ref, false, null);\n    }\n  }\n  function createSimpleClassNameBindingRef(inner, path) {\n    var dasherizedPath;\n    return (0, _reference.createComputeRef)(() => {\n      var value = (0, _reference.valueForRef)(inner);\n      if (value === true) {\n        (true && !(path !== undefined) && (0, _debug.assert)('You must pass a path when binding a to a class name using classNameBindings', path !== undefined));\n        return dasherizedPath || (dasherizedPath = (0, _string.dasherize)(path));\n      } else if (value || value === 0) {\n        return String(value);\n      } else {\n        return null;\n      }\n    });\n  }\n  function createColonClassNameBindingRef(inner, truthy, falsy) {\n    return (0, _reference.createComputeRef)(() => {\n      return (0, _reference.valueForRef)(inner) ? truthy : falsy;\n    });\n  }\n  function NOOP$1() {}\n  /**\n    @module ember\n  */\n  /**\n    Represents the internal state of the component.\n  \n    @class ComponentStateBucket\n    @private\n  */\n  class ComponentStateBucket {\n    constructor(component, args, argsTag, finalizer, hasWrappedElement, isInteractive) {\n      this.component = component;\n      this.args = args;\n      this.argsTag = argsTag;\n      this.finalizer = finalizer;\n      this.hasWrappedElement = hasWrappedElement;\n      this.isInteractive = isInteractive;\n      this.classRef = null;\n      this.classRef = null;\n      this.argsRevision = args === null ? 0 : (0, _validator.valueForTag)(argsTag);\n      this.rootRef = (0, _reference.createConstRef)(component, 'this');\n      (0, _destroyable.registerDestructor)(this, () => this.willDestroy(), true);\n      (0, _destroyable.registerDestructor)(this, () => this.component.destroy());\n    }\n    willDestroy() {\n      var {\n        component,\n        isInteractive\n      } = this;\n      if (isInteractive) {\n        (0, _validator.beginUntrackFrame)();\n        component.trigger('willDestroyElement');\n        component.trigger('willClearRender');\n        (0, _validator.endUntrackFrame)();\n        var element = (0, _views.getViewElement)(component);\n        if (element) {\n          (0, _views.clearElementView)(element);\n          (0, _views.clearViewElement)(component);\n        }\n      }\n      component.renderer.unregister(component);\n    }\n    finalize() {\n      var {\n        finalizer\n      } = this;\n      finalizer();\n      this.finalizer = NOOP$1;\n    }\n  }\n  function internalHelper(helper) {\n    return (0, _manager2.setInternalHelperManager)(helper, {});\n  }\n\n  /**\n  @module ember\n  */\n  var ACTIONS = new _util._WeakSet();\n  /**\n    The `{{action}}` helper provides a way to pass triggers for behavior (usually\n    just a function) between components, and into components from controllers.\n  \n    ### Passing functions with the action helper\n  \n    There are three contexts an action helper can be used in. The first two\n    contexts to discuss are attribute context, and Handlebars value context.\n  \n    ```handlebars\n    {{! An example of attribute context }}\n    <div onclick={{action \"save\"}}></div>\n    {{! Examples of Handlebars value context }}\n    {{input on-input=(action \"save\")}}\n    {{yield (action \"refreshData\") andAnotherParam}}\n    ```\n  \n    In these contexts,\n    the helper is called a \"closure action\" helper. Its behavior is simple:\n    If passed a function name, read that function off the `actions` property\n    of the current context. Once that function is read, or immediately if a function was\n    passed, create a closure over that function and any arguments.\n    The resulting value of an action helper used this way is simply a function.\n  \n    For example, in the attribute context:\n  \n    ```handlebars\n    {{! An example of attribute context }}\n    <div onclick={{action \"save\"}}></div>\n    ```\n  \n    The resulting template render logic would be:\n  \n    ```js\n    var div = document.createElement('div');\n    var actionFunction = (function(context){\n      return function() {\n        return context.actions.save.apply(context, arguments);\n      };\n    })(context);\n    div.onclick = actionFunction;\n    ```\n  \n    Thus when the div is clicked, the action on that context is called.\n    Because the `actionFunction` is just a function, closure actions can be\n    passed between components and still execute in the correct context.\n  \n    Here is an example action handler on a component:\n  \n    ```app/components/my-component.js\n    import Component from '@glimmer/component';\n    import { action } from '@ember/object';\n  \n    export default class extends Component {\n      @action\n      save() {\n        this.model.save();\n      }\n    }\n    ```\n  \n    Actions are always looked up on the `actions` property of the current context.\n    This avoids collisions in the naming of common actions, such as `destroy`.\n    Two options can be passed to the `action` helper when it is used in this way.\n  \n    * `target=someProperty` will look to `someProperty` instead of the current\n      context for the `actions` hash. This can be useful when targeting a\n      service for actions.\n    * `value=\"target.value\"` will read the path `target.value` off the first\n      argument to the action when it is called and rewrite the first argument\n      to be that value. This is useful when attaching actions to event listeners.\n  \n    ### Invoking an action\n  \n    Closure actions curry both their scope and any arguments. When invoked, any\n    additional arguments are added to the already curried list.\n    Actions are presented in JavaScript as callbacks, and are\n    invoked like any other JavaScript function.\n  \n    For example\n  \n    ```app/components/update-name.js\n    import Component from '@glimmer/component';\n    import { action } from '@ember/object';\n  \n    export default class extends Component {\n      @action\n      setName(model, name) {\n        model.set('name', name);\n      }\n    }\n    ```\n  \n    ```app/components/update-name.hbs\n    {{input on-input=(action (action 'setName' @model) value=\"target.value\")}}\n    ```\n  \n    The first argument (`@model`) was curried over, and the run-time argument (`event`)\n    becomes a second argument. Action calls can be nested this way because each simply\n    returns a function. Any function can be passed to the `{{action}}` helper, including\n    other actions.\n  \n    Actions invoked with `sendAction` have the same currying behavior as demonstrated\n    with `on-input` above. For example:\n  \n    ```app/components/my-input.js\n    import Component from '@glimmer/component';\n    import { action } from '@ember/object';\n  \n    export default class extends Component {\n      @action\n      setName(model, name) {\n        model.set('name', name);\n      }\n    }\n    ```\n  \n    ```handlebars\n    <MyInput @submit={{action 'setName' @model}} />\n    ```\n  \n    or\n  \n    ```handlebars\n    {{my-input submit=(action 'setName' @model)}}\n    ```\n  \n    ```app/components/my-component.js\n    import Component from '@ember/component';\n  \n    export default Component.extend({\n      click() {\n        // Note that model is not passed, it was curried in the template\n        this.submit('bob');\n      }\n    });\n    ```\n  \n    ### Attaching actions to DOM elements\n  \n    The third context of the `{{action}}` helper can be called \"element space\".\n    For example:\n  \n    ```handlebars\n    {{! An example of element space }}\n    <div {{action \"save\"}}></div>\n    ```\n  \n    Used this way, the `{{action}}` helper provides a useful shortcut for\n    registering an HTML element in a template for a single DOM event and\n    forwarding that interaction to the template's context (controller or component).\n    If the context of a template is a controller, actions used this way will\n    bubble to routes when the controller does not implement the specified action.\n    Once an action hits a route, it will bubble through the route hierarchy.\n  \n    ### Event Propagation\n  \n    `{{action}}` helpers called in element space can control event bubbling. Note\n    that the closure style actions cannot.\n  \n    Events triggered through the action helper will automatically have\n    `.preventDefault()` called on them. You do not need to do so in your event\n    handlers. If you need to allow event propagation (to handle file inputs for\n    example) you can supply the `preventDefault=false` option to the `{{action}}` helper:\n  \n    ```handlebars\n    <div {{action \"sayHello\" preventDefault=false}}>\n      <input type=\"file\" />\n      <input type=\"checkbox\" />\n    </div>\n    ```\n  \n    To disable bubbling, pass `bubbles=false` to the helper:\n  \n    ```handlebars\n    <button {{action 'edit' post bubbles=false}}>Edit</button>\n    ```\n  \n    To disable bubbling with closure style actions you must create your own\n    wrapper helper that makes use of `event.stopPropagation()`:\n  \n    ```handlebars\n    <div onclick={{disable-bubbling (action \"sayHello\")}}>Hello</div>\n    ```\n  \n    ```app/helpers/disable-bubbling.js\n    import { helper } from '@ember/component/helper';\n  \n    export function disableBubbling([action]) {\n      return function(event) {\n        event.stopPropagation();\n        return action(event);\n      };\n    }\n    export default helper(disableBubbling);\n    ```\n  \n    If you need the default handler to trigger you should either register your\n    own event handler, or use event methods on your view class. See\n    [\"Responding to Browser Events\"](/ember/release/classes/Component)\n    in the documentation for `Component` for more information.\n  \n    ### Specifying DOM event type\n  \n    `{{action}}` helpers called in element space can specify an event type.\n    By default the `{{action}}` helper registers for DOM `click` events. You can\n    supply an `on` option to the helper to specify a different DOM event name:\n  \n    ```handlebars\n    <div {{action \"anActionName\" on=\"doubleClick\"}}>\n      click me\n    </div>\n    ```\n  \n    See [\"Event Names\"](/ember/release/classes/Component) for a list of\n    acceptable DOM event names.\n  \n    ### Specifying whitelisted modifier keys\n  \n    `{{action}}` helpers called in element space can specify modifier keys.\n    By default the `{{action}}` helper will ignore click events with pressed modifier\n    keys. You can supply an `allowedKeys` option to specify which keys should not be ignored.\n  \n    ```handlebars\n    <div {{action \"anActionName\" allowedKeys=\"alt\"}}>\n      click me\n    </div>\n    ```\n  \n    This way the action will fire when clicking with the alt key pressed down.\n    Alternatively, supply \"any\" to the `allowedKeys` option to accept any combination of modifier keys.\n  \n    ```handlebars\n    <div {{action \"anActionName\" allowedKeys=\"any\"}}>\n      click me with any key pressed\n    </div>\n    ```\n  \n    ### Specifying a Target\n  \n    A `target` option can be provided to the helper to change\n    which object will receive the method call. This option must be a path\n    to an object, accessible in the current context:\n  \n    ```app/templates/application.hbs\n    <div {{action \"anActionName\" target=someService}}>\n      click me\n    </div>\n    ```\n  \n    ```app/controllers/application.js\n    import Controller from '@ember/controller';\n    import { service } from '@ember/service';\n  \n    export default class extends Controller {\n      @service someService;\n    }\n    ```\n  \n    @method action\n    @for Ember.Templates.helpers\n    @public\n  */\n  var action$1 = internalHelper(args => {\n    var {\n      named,\n      positional\n    } = args;\n    // The first two argument slots are reserved.\n    // pos[0] is the context (or `this`)\n    // pos[1] is the action name or function\n    // Anything else is an action argument.\n    var [context, action$$1, ...restArgs] = positional;\n    (true && !(context && action$$1) && (0, _debug.assert)('hash position arguments', context && action$$1));\n    var debugKey = action$$1.debugLabel;\n    var target = 'target' in named ? named['target'] : context;\n    var processArgs = makeArgsProcessor('value' in named && named['value'] || false, restArgs);\n    var fn$$1;\n    if ((0, _reference.isInvokableRef)(action$$1)) {\n      fn$$1 = makeClosureAction(action$$1, action$$1, invokeRef, processArgs, debugKey);\n    } else {\n      fn$$1 = makeDynamicClosureAction((0, _reference.valueForRef)(context), target, action$$1, processArgs, debugKey);\n    }\n    ACTIONS.add(fn$$1);\n    return (0, _reference.createUnboundRef)(fn$$1, '(result of an `action` helper)');\n  });\n  function NOOP$2(args) {\n    return args;\n  }\n  function makeArgsProcessor(valuePathRef, actionArgsRef) {\n    var mergeArgs;\n    if (actionArgsRef.length > 0) {\n      mergeArgs = args => {\n        return actionArgsRef.map(_reference.valueForRef).concat(args);\n      };\n    }\n    var readValue;\n    if (valuePathRef) {\n      readValue = args => {\n        var valuePath = (0, _reference.valueForRef)(valuePathRef);\n        if (valuePath && args.length > 0) {\n          args[0] = (0, _metal.get)(args[0], valuePath);\n        }\n        return args;\n      };\n    }\n    if (mergeArgs && readValue) {\n      return args => {\n        return readValue(mergeArgs(args));\n      };\n    } else {\n      return mergeArgs || readValue || NOOP$2;\n    }\n  }\n  function makeDynamicClosureAction(context, targetRef, actionRef, processArgs, debugKey) {\n    // We don't allow undefined/null values, so this creates a throw-away action to trigger the assertions\n    if (true /* DEBUG */) {\n      makeClosureAction(context, (0, _reference.valueForRef)(targetRef), (0, _reference.valueForRef)(actionRef), processArgs, debugKey);\n    }\n    return function () {\n      return makeClosureAction(context, (0, _reference.valueForRef)(targetRef), (0, _reference.valueForRef)(actionRef), processArgs, debugKey)(...arguments);\n    };\n  }\n  function makeClosureAction(context, target, action$$1, processArgs, debugKey) {\n    var self;\n    var fn$$1;\n    (true && !(action$$1 !== undefined && action$$1 !== null) && (0, _debug.assert)(`Action passed is null or undefined in (action) from ${target}.`, action$$1 !== undefined && action$$1 !== null));\n    if (typeof action$$1 === 'string') {\n      self = target;\n      fn$$1 = target.actions && target.actions[action$$1];\n      (true && !(Boolean(fn$$1)) && (0, _debug.assert)(`An action named '${action$$1}' was not found in ${target}`, Boolean(fn$$1)));\n    } else if (typeof action$$1 === 'function') {\n      self = context;\n      fn$$1 = action$$1;\n    } else {\n      (true && !(false) && (0, _debug.assert)(`An action could not be made for \\`${debugKey || action$$1}\\` in ${target}. Please confirm that you are using either a quoted action name (i.e. \\`(action '${debugKey || 'myAction'}')\\`) or a function available in ${target}.`, false));\n    }\n    return function () {\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n      var payload = {\n        target: self,\n        args,\n        label: '@glimmer/closure-action'\n      };\n      return (0, _instrumentation.flaggedInstrument)('interaction.ember-action', payload, () => {\n        return (0, _runloop.join)(self, fn$$1, ...processArgs(args));\n      });\n    };\n  }\n  // The code above:\n  // 1. Finds an action function, usually on the `actions` hash\n  // 2. Calls it with the target as the correct `this` context\n  // Previously, `UPDATE_REFERENCED_VALUE` was a method on the reference itself,\n  // so this made a bit more sense. Now, it isn't, and so we need to create a\n  // function that can have `this` bound to it when called. This allows us to use\n  // the same codepath to call `updateRef` on the reference.\n  function invokeRef(value) {\n    (0, _reference.updateRef)(this, value);\n  }\n\n  // ComponentArgs takes EvaluatedNamedArgs and converts them into the\n  // inputs needed by CurlyComponents (attrs and props, with mutable\n  // cells, etc).\n  function processComponentArgs(namedArgs) {\n    var attrs = Object.create(null);\n    var props = Object.create(null);\n    props[ARGS] = namedArgs;\n    for (var name in namedArgs) {\n      var ref = namedArgs[name];\n      (true && !(ref) && (0, _debug.assert)('expected ref', ref));\n      var value = (0, _reference.valueForRef)(ref);\n      var isAction = typeof value === 'function' && ACTIONS.has(value);\n      if ((0, _reference.isUpdatableRef)(ref) && !isAction) {\n        attrs[name] = new MutableCell(ref, value);\n      } else {\n        attrs[name] = value;\n      }\n      props[name] = value;\n    }\n    props.attrs = attrs;\n    return props;\n  }\n  var REF = Symbol('REF');\n  class MutableCell {\n    constructor(ref, value) {\n      this[_views.MUTABLE_CELL] = true;\n      this[REF] = ref;\n      this.value = value;\n    }\n    update(val) {\n      (0, _reference.updateRef)(this[REF], val);\n    }\n  }\n  var __rest = undefined && undefined.__rest || function (s, e) {\n    var t = {};\n    for (var p in s) {\n      if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n    }\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n      if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n    }\n    return t;\n  };\n  var ARGS = (0, _utils.enumerableSymbol)('ARGS');\n  var HAS_BLOCK = (0, _utils.enumerableSymbol)('HAS_BLOCK');\n  var DIRTY_TAG = Symbol('DIRTY_TAG');\n  var IS_DISPATCHING_ATTRS = Symbol('IS_DISPATCHING_ATTRS');\n  var BOUNDS = Symbol('BOUNDS');\n  var EMBER_VIEW_REF = (0, _reference.createPrimitiveRef)('ember-view');\n  function aliasIdToElementId(args, props) {\n    if (args.named.has('id')) {\n      (true && !(!args.named.has('elementId')) && (0, _debug.assert)(`You cannot invoke a component with both 'id' and 'elementId' at the same time.`, !args.named.has('elementId')));\n      props.elementId = props.id;\n    }\n  }\n  // We must traverse the attributeBindings in reverse keeping track of\n  // what has already been applied. This is essentially refining the concatenated\n  // properties applying right to left.\n  function applyAttributeBindings(attributeBindings, component, rootRef, operations) {\n    var seen = [];\n    var i = attributeBindings.length - 1;\n    while (i !== -1) {\n      var binding = attributeBindings[i];\n      (true && !(binding) && (0, _debug.assert)('has binding', binding));\n      var parsed = parseAttributeBinding(binding);\n      var attribute = parsed[1];\n      if (seen.indexOf(attribute) === -1) {\n        seen.push(attribute);\n        installAttributeBinding(component, rootRef, parsed, operations);\n      }\n      i--;\n    }\n    if (seen.indexOf('id') === -1) {\n      var id = component.elementId ? component.elementId : (0, _utils.guidFor)(component);\n      operations.setAttribute('id', (0, _reference.createPrimitiveRef)(id), false, null);\n    }\n  }\n  var EMPTY_POSITIONAL_ARGS = [];\n  (0, _debug.debugFreeze)(EMPTY_POSITIONAL_ARGS);\n  class CurlyComponentManager {\n    templateFor(component) {\n      var {\n        layout,\n        layoutName\n      } = component;\n      var owner = (0, _owner2.getOwner)(component);\n      (true && !(owner) && (0, _debug.assert)('Component is unexpectedly missing an owner', owner));\n      var factory;\n      if (layout === undefined) {\n        if (layoutName !== undefined) {\n          var _factory = owner.lookup(`template:${layoutName}`);\n          (true && !(_factory !== undefined) && (0, _debug.assert)(`Layout \\`${layoutName}\\` not found!`, _factory !== undefined));\n          factory = _factory;\n        } else {\n          return null;\n        }\n      } else if (isTemplateFactory(layout)) {\n        factory = layout;\n      } else {\n        // no layout was found, use the default layout\n        return null;\n      }\n      return (0, _util.unwrapTemplate)(factory(owner)).asWrappedLayout();\n    }\n    getDynamicLayout(bucket) {\n      return this.templateFor(bucket.component);\n    }\n    getTagName(state) {\n      var {\n        component,\n        hasWrappedElement\n      } = state;\n      if (!hasWrappedElement) {\n        return null;\n      }\n      return component && component.tagName || 'div';\n    }\n    getCapabilities() {\n      return CURLY_CAPABILITIES;\n    }\n    prepareArgs(ComponentClass, args) {\n      var _a;\n      if (args.named.has('__ARGS__')) {\n        (true && !(args.positional.length === 0) && (0, _debug.assert)('[BUG] cannot pass both __ARGS__ and positional arguments', args.positional.length === 0));\n        var _b = args.named.capture(),\n          {\n            __ARGS__\n          } = _b,\n          rest = __rest(_b, [\"__ARGS__\"]);\n        (true && !(__ARGS__) && (0, _debug.assert)('[BUG] unexpectedly missing __ARGS__ after check', __ARGS__)); // does this need to be untracked?\n        var __args__ = (0, _reference.valueForRef)(__ARGS__);\n        var prepared = {\n          positional: __args__.positional,\n          named: Object.assign(Object.assign({}, rest), __args__.named)\n        };\n        return prepared;\n      }\n      var {\n        positionalParams\n      } = (_a = ComponentClass.class) !== null && _a !== void 0 ? _a : ComponentClass;\n      // early exits\n      if (positionalParams === undefined || positionalParams === null || args.positional.length === 0) {\n        return null;\n      }\n      var named;\n      if (typeof positionalParams === 'string') {\n        (true && !(!args.named.has(positionalParams)) && (0, _debug.assert)(`You cannot specify positional parameters and the hash argument \\`${positionalParams}\\`.`, !args.named.has(positionalParams)));\n        var captured = args.positional.capture();\n        named = {\n          [positionalParams]: (0, _reference.createComputeRef)(() => (0, _runtime.reifyPositional)(captured))\n        };\n        Object.assign(named, args.named.capture());\n      } else if (Array.isArray(positionalParams) && positionalParams.length > 0) {\n        var count = Math.min(positionalParams.length, args.positional.length);\n        named = {};\n        Object.assign(named, args.named.capture());\n        for (var i = 0; i < count; i++) {\n          var name = positionalParams[i];\n          (true && !(name) && (0, _debug.assert)('Expected at least one positional param', name));\n          (true && !(!args.named.has(name)) && (0, _debug.assert)(`You cannot specify both a positional param (at position ${i}) and the hash argument \\`${name}\\`.`, !args.named.has(name)));\n          named[name] = args.positional.at(i);\n        }\n      } else {\n        return null;\n      }\n      return {\n        positional: _util.EMPTY_ARRAY,\n        named\n      };\n    }\n    /*\n     * This hook is responsible for actually instantiating the component instance.\n     * It also is where we perform additional bookkeeping to support legacy\n     * features like exposed by view mixins like ChildViewSupport, ActionSupport,\n     * etc.\n     */\n    create(owner, ComponentClass, args, _ref, dynamicScope, callerSelfRef, hasBlock) {\n      var {\n        isInteractive\n      } = _ref;\n      // Get the nearest concrete component instance from the scope. \"Virtual\"\n      // components will be skipped.\n      var parentView = dynamicScope.view;\n      // Capture the arguments, which tells Glimmer to give us our own, stable\n      // copy of the Arguments object that is safe to hold on to between renders.\n      var capturedArgs = args.named.capture();\n      (0, _validator.beginTrackFrame)();\n      var props = processComponentArgs(capturedArgs);\n      var argsTag = (0, _validator.endTrackFrame)();\n      // Alias `id` argument to `elementId` property on the component instance.\n      aliasIdToElementId(args, props);\n      // Set component instance's parentView property to point to nearest concrete\n      // component.\n      props.parentView = parentView;\n      // Set whether this component was invoked with a block\n      // (`{{#my-component}}{{/my-component}}`) or without one\n      // (`{{my-component}}`).\n      props[HAS_BLOCK] = hasBlock;\n      // Save the current `this` context of the template as the component's\n      // `_target`, so bubbled actions are routed to the right place.\n      props._target = (0, _reference.valueForRef)(callerSelfRef);\n      (0, _owner2.setOwner)(props, owner);\n      // caller:\n      // <FaIcon @name=\"bug\" />\n      //\n      // callee:\n      // <i class=\"fa-{{@name}}\"></i>\n      // Now that we've built up all of the properties to set on the component instance,\n      // actually create it.\n      (0, _validator.beginUntrackFrame)();\n      var component = ComponentClass.create(props);\n      var finalizer = (0, _instrumentation._instrumentStart)('render.component', initialRenderInstrumentDetails, component);\n      // We become the new parentView for downstream components, so save our\n      // component off on the dynamic scope.\n      dynamicScope.view = component;\n      // Unless we're the root component, we need to add ourselves to our parent\n      // component's childViews array.\n      if (parentView !== null && parentView !== undefined) {\n        (0, _views.addChildView)(parentView, component);\n      }\n      component.trigger('didReceiveAttrs');\n      var hasWrappedElement = component.tagName !== '';\n      // We usually do this in the `didCreateElement`, but that hook doesn't fire for tagless components\n      if (!hasWrappedElement) {\n        if (isInteractive) {\n          component.trigger('willRender');\n        }\n        component._transitionTo('hasElement');\n        if (isInteractive) {\n          component.trigger('willInsertElement');\n        }\n      }\n      // Track additional lifecycle metadata about this component in a state bucket.\n      // Essentially we're saving off all the state we'll need in the future.\n      var bucket = new ComponentStateBucket(component, capturedArgs, argsTag, finalizer, hasWrappedElement, isInteractive);\n      if (args.named.has('class')) {\n        bucket.classRef = args.named.get('class');\n      }\n      if (true /* DEBUG */) {\n        processComponentInitializationAssertions(component, props);\n      }\n      if (isInteractive && hasWrappedElement) {\n        component.trigger('willRender');\n      }\n      (0, _validator.endUntrackFrame)();\n      // consume every argument so we always run again\n      (0, _validator.consumeTag)(bucket.argsTag);\n      (0, _validator.consumeTag)(component[DIRTY_TAG]);\n      return bucket;\n    }\n    getDebugName(definition) {\n      var _a;\n      return definition.fullName || definition.normalizedName || ((_a = definition.class) === null || _a === void 0 ? void 0 : _a.name) || definition.name;\n    }\n    getSelf(_ref2) {\n      var {\n        rootRef\n      } = _ref2;\n      return rootRef;\n    }\n    didCreateElement(_ref3, element, operations) {\n      var {\n        component,\n        classRef,\n        isInteractive,\n        rootRef\n      } = _ref3;\n      (0, _views.setViewElement)(component, element);\n      (0, _views.setElementView)(element, component);\n      var {\n        attributeBindings,\n        classNames,\n        classNameBindings\n      } = component;\n      if (attributeBindings && attributeBindings.length) {\n        applyAttributeBindings(attributeBindings, component, rootRef, operations);\n      } else {\n        var id = component.elementId ? component.elementId : (0, _utils.guidFor)(component);\n        operations.setAttribute('id', (0, _reference.createPrimitiveRef)(id), false, null);\n      }\n      if (classRef) {\n        var ref = createSimpleClassNameBindingRef(classRef);\n        operations.setAttribute('class', ref, false, null);\n      }\n      if (classNames && classNames.length) {\n        classNames.forEach(name => {\n          operations.setAttribute('class', (0, _reference.createPrimitiveRef)(name), false, null);\n        });\n      }\n      if (classNameBindings && classNameBindings.length) {\n        classNameBindings.forEach(binding => {\n          createClassNameBindingRef(rootRef, binding, operations);\n        });\n      }\n      operations.setAttribute('class', EMBER_VIEW_REF, false, null);\n      if ('ariaRole' in component) {\n        operations.setAttribute('role', (0, _reference.childRefFor)(rootRef, 'ariaRole'), false, null);\n      }\n      component._transitionTo('hasElement');\n      if (isInteractive) {\n        (0, _validator.beginUntrackFrame)();\n        component.trigger('willInsertElement');\n        (0, _validator.endUntrackFrame)();\n      }\n    }\n    didRenderLayout(bucket, bounds) {\n      bucket.component[BOUNDS] = bounds;\n      bucket.finalize();\n    }\n    didCreate(_ref4) {\n      var {\n        component,\n        isInteractive\n      } = _ref4;\n      if (isInteractive) {\n        component._transitionTo('inDOM');\n        component.trigger('didInsertElement');\n        component.trigger('didRender');\n      }\n    }\n    update(bucket) {\n      var {\n        component,\n        args,\n        argsTag,\n        argsRevision,\n        isInteractive\n      } = bucket;\n      bucket.finalizer = (0, _instrumentation._instrumentStart)('render.component', rerenderInstrumentDetails, component);\n      (0, _validator.beginUntrackFrame)();\n      if (args !== null && !(0, _validator.validateTag)(argsTag, argsRevision)) {\n        (0, _validator.beginTrackFrame)();\n        var props = processComponentArgs(args);\n        argsTag = bucket.argsTag = (0, _validator.endTrackFrame)();\n        bucket.argsRevision = (0, _validator.valueForTag)(argsTag);\n        component[IS_DISPATCHING_ATTRS] = true;\n        component.setProperties(props);\n        component[IS_DISPATCHING_ATTRS] = false;\n        component.trigger('didUpdateAttrs');\n        component.trigger('didReceiveAttrs');\n      }\n      if (isInteractive) {\n        component.trigger('willUpdate');\n        component.trigger('willRender');\n      }\n      (0, _validator.endUntrackFrame)();\n      (0, _validator.consumeTag)(argsTag);\n      (0, _validator.consumeTag)(component[DIRTY_TAG]);\n    }\n    didUpdateLayout(bucket) {\n      bucket.finalize();\n    }\n    didUpdate(_ref5) {\n      var {\n        component,\n        isInteractive\n      } = _ref5;\n      if (isInteractive) {\n        component.trigger('didUpdate');\n        component.trigger('didRender');\n      }\n    }\n    getDestroyable(bucket) {\n      return bucket;\n    }\n  }\n  function processComponentInitializationAssertions(component, props) {\n    (true && !((() => {\n      var {\n        classNameBindings\n      } = component;\n      for (var i = 0; i < classNameBindings.length; i++) {\n        var binding = classNameBindings[i];\n        if (typeof binding !== 'string' || binding.length === 0) {\n          return false;\n        }\n      }\n      return true;\n    })()) && (0, _debug.assert)(`classNameBindings must be non-empty strings: ${component}`, (() => {\n      var {\n        classNameBindings\n      } = component;\n      for (var i = 0; i < classNameBindings.length; i++) {\n        var binding = classNameBindings[i];\n        if (typeof binding !== 'string' || binding.length === 0) {\n          return false;\n        }\n      }\n      return true;\n    })()));\n    (true && !((() => {\n      var {\n        classNameBindings\n      } = component;\n      for (var binding of classNameBindings) {\n        if (binding.split(' ').length > 1) {\n          return false;\n        }\n      }\n      return true;\n    })()) && (0, _debug.assert)(`classNameBindings must not have spaces in them: ${component}`, (() => {\n      var {\n        classNameBindings\n      } = component;\n      for (var binding of classNameBindings) {\n        if (binding.split(' ').length > 1) {\n          return false;\n        }\n      }\n      return true;\n    })()));\n    (true && !(component.tagName !== '' || !component.classNameBindings || component.classNameBindings.length === 0) && (0, _debug.assert)(`You cannot use \\`classNameBindings\\` on a tag-less component: ${component}`, component.tagName !== '' || !component.classNameBindings || component.classNameBindings.length === 0));\n    (true && !(component.tagName !== '' || props.id === component.elementId || !component.elementId && component.elementId !== '') && (0, _debug.assert)(`You cannot use \\`elementId\\` on a tag-less component: ${component}`, component.tagName !== '' || props.id === component.elementId || !component.elementId && component.elementId !== ''));\n    (true && !(component.tagName !== '' || !component.attributeBindings || component.attributeBindings.length === 0) && (0, _debug.assert)(`You cannot use \\`attributeBindings\\` on a tag-less component: ${component}`, component.tagName !== '' || !component.attributeBindings || component.attributeBindings.length === 0));\n  }\n  function initialRenderInstrumentDetails(component) {\n    return component.instrumentDetails({\n      initialRender: true\n    });\n  }\n  function rerenderInstrumentDetails(component) {\n    return component.instrumentDetails({\n      initialRender: false\n    });\n  }\n  var CURLY_CAPABILITIES = {\n    dynamicLayout: true,\n    dynamicTag: true,\n    prepareArgs: true,\n    createArgs: true,\n    attributeHook: true,\n    elementHook: true,\n    createCaller: true,\n    dynamicScope: true,\n    updateHook: true,\n    createInstance: true,\n    wrapped: true,\n    willDestroy: true,\n    hasSubOwner: false\n  };\n  var CURLY_COMPONENT_MANAGER = new CurlyComponentManager();\n  function isCurlyManager(manager) {\n    return manager === CURLY_COMPONENT_MANAGER;\n  }\n\n  // Keep track of which component classes have already been processed for lazy event setup.\n  var lazyEventsProcessed = new WeakMap();\n  class Component extends _views.CoreView.extend(_views.ChildViewsSupport, _views.ViewStateSupport, _views.ClassNamesSupport, _runtime2.TargetActionSupport, _views.ActionSupport, _views.ViewMixin, {\n    // These need to be overridable via extend/create but should still\n    // have a default. Defining them here is the best way to achieve that.\n    didReceiveAttrs() {},\n    didRender() {},\n    didUpdate() {},\n    didUpdateAttrs() {},\n    willRender() {},\n    willUpdate() {}\n  }) {\n    constructor() {\n      super(...arguments);\n      this.isComponent = true;\n    }\n    init(properties) {\n      super.init(properties);\n      // Handle methods from ViewMixin.\n      // The native class inheritance will not work for mixins. To work around this,\n      // we copy the existing rerender method provided by the mixin and swap in the\n      // new rerender method from our class.\n      this._superRerender = this.rerender;\n      this.rerender = this._rerender;\n      this[IS_DISPATCHING_ATTRS] = false;\n      this[DIRTY_TAG] = (0, _validator.createTag)();\n      this[BOUNDS] = null;\n      var eventDispatcher = this._dispatcher;\n      if (eventDispatcher) {\n        var lazyEventsProcessedForComponentClass = lazyEventsProcessed.get(eventDispatcher);\n        if (!lazyEventsProcessedForComponentClass) {\n          lazyEventsProcessedForComponentClass = new WeakSet();\n          lazyEventsProcessed.set(eventDispatcher, lazyEventsProcessedForComponentClass);\n        }\n        var proto = Object.getPrototypeOf(this);\n        if (!lazyEventsProcessedForComponentClass.has(proto)) {\n          var lazyEvents = eventDispatcher.lazyEvents;\n          lazyEvents.forEach((mappedEventName, event) => {\n            if (mappedEventName !== null && typeof this[mappedEventName] === 'function') {\n              eventDispatcher.setupHandlerForBrowserEvent(event);\n            }\n          });\n          lazyEventsProcessedForComponentClass.add(proto);\n        }\n      }\n      if (true /* DEBUG */ && eventDispatcher && this.renderer._isInteractive && this.tagName === '') {\n        var eventNames = [];\n        var events = eventDispatcher.finalEventNameMapping;\n        for (var key in events) {\n          var methodName = events[key];\n          if (methodName && typeof this[methodName] === 'function') {\n            eventNames.push(methodName);\n          }\n        }\n        // If in a tagless component, assert that no event handlers are defined\n        (true && !(!eventNames.length) && (0, _debug.assert)(`You can not define \\`${eventNames}\\` function(s) to handle DOM event in the \\`${this}\\` tagless component since it doesn't have any DOM element.`, !eventNames.length));\n      }\n    }\n    get _dispatcher() {\n      if (this.__dispatcher === undefined) {\n        var owner = (0, _owner2.getOwner)(this);\n        (true && !(owner) && (0, _debug.assert)('Component is unexpectedly missing an owner', owner));\n        if (owner.lookup('-environment:main').isInteractive) {\n          var dispatcher = owner.lookup('event_dispatcher:main');\n          (true && !(dispatcher instanceof _views.EventDispatcher) && (0, _debug.assert)('Expected dispatcher to be an EventDispatcher', dispatcher instanceof _views.EventDispatcher));\n          this.__dispatcher = dispatcher;\n        } else {\n          // In FastBoot we have no EventDispatcher. Set to null to not try again to look it up.\n          this.__dispatcher = null;\n        }\n      }\n      return this.__dispatcher;\n    }\n    on(name, target, method) {\n      var _a;\n      (_a = this._dispatcher) === null || _a === void 0 ? void 0 : _a.setupHandlerForEmberEvent(name);\n      // The `on` method here comes from the Evented mixin. Since this mixin\n      // is applied to the parent of this class, however, we are still able\n      // to use `super`.\n      return super.on(name, target, method);\n    }\n    // Changed to `rerender` on init\n    _rerender() {\n      (0, _validator.dirtyTag)(this[DIRTY_TAG]);\n      this._superRerender();\n    }\n    [_metal.PROPERTY_DID_CHANGE](key, value) {\n      if (this[IS_DISPATCHING_ATTRS]) {\n        return;\n      }\n      var args = this[ARGS];\n      var reference = args !== undefined ? args[key] : undefined;\n      if (reference !== undefined && (0, _reference.isUpdatableRef)(reference)) {\n        (0, _reference.updateRef)(reference, arguments.length === 2 ? value : (0, _metal.get)(this, key));\n      }\n    }\n    getAttr(key) {\n      // TODO Intimate API should be deprecated\n      return this.get(key);\n    }\n    /**\n      Normally, Ember's component model is \"write-only\". The component takes a\n      bunch of attributes that it got passed in, and uses them to render its\n      template.\n         One nice thing about this model is that if you try to set a value to the\n      same thing as last time, Ember (through HTMLBars) will avoid doing any\n      work on the DOM.\n         This is not just a performance optimization. If an attribute has not\n      changed, it is important not to clobber the element's \"hidden state\".\n      For example, if you set an input's `value` to the same value as before,\n      it will clobber selection state and cursor position. In other words,\n      setting an attribute is not **always** idempotent.\n         This method provides a way to read an element's attribute and also\n      update the last value Ember knows about at the same time. This makes\n      setting an attribute idempotent.\n         In particular, what this means is that if you get an `<input>` element's\n      `value` attribute and then re-render the template with the same value,\n      it will avoid clobbering the cursor and selection position.\n      Since most attribute sets are idempotent in the browser, you typically\n      can get away with reading attributes using jQuery, but the most reliable\n      way to do so is through this method.\n      @method readDOMAttr\n         @param {String} name the name of the attribute\n      @return String\n      @public\n      */\n    readDOMAttr(name) {\n      // TODO revisit this\n      var _element = (0, _views.getViewElement)(this);\n      (true && !(_element !== null) && (0, _debug.assert)(`Cannot call \\`readDOMAttr\\` on ${this} which does not have an element`, _element !== null));\n      var element = _element;\n      var isSVG = element.namespaceURI === \"http://www.w3.org/2000/svg\" /* Namespace.SVG */;\n      var {\n        type,\n        normalized\n      } = (0, _runtime.normalizeProperty)(element, name);\n      if (isSVG || type === 'attr') {\n        return element.getAttribute(normalized);\n      }\n      return element[normalized];\n    }\n    static toString() {\n      return '@ember/component';\n    }\n  }\n  _exports.Component = Component;\n  Component.isComponentFactory = true;\n  // We continue to use reopenClass here so that positionalParams can be overridden with reopenClass in subclasses.\n  Component.reopenClass({\n    /**\n     Enables components to take a list of parameters as arguments.\n      For example, a component that takes two parameters with the names\n      `name` and `age`:\n         ```app/components/my-component.js\n      import Component from '@ember/component';\n         let MyComponent = Component.extend();\n         MyComponent.reopenClass({\n        positionalParams: ['name', 'age']\n      });\n         export default MyComponent;\n      ```\n         It can then be invoked like this:\n         ```hbs\n      {{my-component \"John\" 38}}\n      ```\n         The parameters can be referred to just like named parameters:\n         ```hbs\n      Name: {{name}}, Age: {{age}}.\n      ```\n         Using a string instead of an array allows for an arbitrary number of\n      parameters:\n         ```app/components/my-component.js\n      import Component from '@ember/component';\n         let MyComponent = Component.extend();\n         MyComponent.reopenClass({\n        positionalParams: 'names'\n      });\n         export default MyComponent;\n      ```\n         It can then be invoked like this:\n         ```hbs\n      {{my-component \"John\" \"Michael\" \"Scott\"}}\n      ```\n      The parameters can then be referred to by enumerating over the list:\n         ```hbs\n      {{#each names as |name|}}{{name}}{{/each}}\n      ```\n         @static\n      @public\n      @property positionalParams\n      @since 1.13.0\n      */\n    positionalParams: []\n  });\n  (0, _manager2.setInternalComponentManager)(CURLY_COMPONENT_MANAGER, Component);\n\n  /**\n  @module @ember/component\n  */\n  var _a;\n  var RECOMPUTE_TAG = Symbol('RECOMPUTE_TAG');\n  var IS_CLASSIC_HELPER = Symbol('IS_CLASSIC_HELPER');\n  /**\n    In many cases it is not necessary to use the full `Helper` class.\n    The `helper` method create pure-function helpers without instances.\n    For example:\n  \n    ```app/helpers/format-currency.js\n    import { helper } from '@ember/component/helper';\n  \n    export default helper(function([cents], {currency}) {\n      return `${currency}${cents * 0.01}`;\n    });\n    ```\n  \n    @static\n    @param {Function} helper The helper function\n    @method helper\n    @for @ember/component/helper\n    @public\n    @since 1.13.0\n  */\n  function helper(helperFn) {\n    return new Wrapper(helperFn);\n  }\n  class Helper extends _internals.FrameworkObject {\n    init(properties) {\n      super.init(properties);\n      this[RECOMPUTE_TAG] = (0, _validator.createTag)();\n      (true && !(this.compute) && (0, _debug.assert)('expected compute to be defined', this.compute));\n    }\n    /**\n      On a class-based helper, it may be useful to force a recomputation of that\n      helpers value. This is akin to `rerender` on a component.\n         For example, this component will rerender when the `currentUser` on a\n      session service changes:\n         ```app/helpers/current-user-email.js\n      import Helper from '@ember/component/helper'\n      import { service } from '@ember/service'\n      import { observer } from '@ember/object'\n         export default Helper.extend({\n        session: service(),\n           onNewUser: observer('session.currentUser', function() {\n          this.recompute();\n        }),\n           compute() {\n          return this.get('session.currentUser.email');\n        }\n      });\n      ```\n         @method recompute\n      @public\n      @since 1.13.0\n    */\n    recompute() {\n      (0, _runloop.join)(() => (0, _validator.dirtyTag)(this[RECOMPUTE_TAG]));\n    }\n  }\n  _exports.Helper = Helper;\n  _a = IS_CLASSIC_HELPER;\n  Helper.isHelperFactory = true;\n  Helper[_a] = true;\n  // `packages/ember/index.js` was setting `Helper.helper`. This seems like\n  // a bad idea and probably not something we want. We've moved that definition\n  // here, but it should definitely be reviewed and probably removed.\n  /** @deprecated */\n  Helper.helper = helper;\n  function isClassicHelper(obj) {\n    return obj[IS_CLASSIC_HELPER] === true;\n  }\n  class ClassicHelperManager {\n    constructor(owner) {\n      this.capabilities = (0, _manager2.helperCapabilities)('3.23', {\n        hasValue: true,\n        hasDestroyable: true\n      });\n      var ownerInjection = {};\n      (0, _owner2.setOwner)(ownerInjection, owner);\n      this.ownerInjection = ownerInjection;\n    }\n    createHelper(definition, args) {\n      var instance = isFactoryManager(definition) ? definition.create() : definition.create(this.ownerInjection);\n      (true && !(function (instance) {\n        if (instance !== null && typeof instance === 'object') {\n          var cast = instance;\n          return typeof cast.compute === 'function' && typeof cast.destroy === 'function';\n        }\n        return false;\n      }(instance)) && (0, _debug.assert)('expected HelperInstance', function (instance) {\n        if (instance !== null && typeof instance === 'object') {\n          var cast = instance;\n          return typeof cast.compute === 'function' && typeof cast.destroy === 'function';\n        }\n        return false;\n      }(instance)));\n      return {\n        instance,\n        args\n      };\n    }\n    getDestroyable(_ref6) {\n      var {\n        instance\n      } = _ref6;\n      return instance;\n    }\n    getValue(_ref7) {\n      var {\n        instance,\n        args\n      } = _ref7;\n      var {\n        positional,\n        named\n      } = args;\n      var ret = instance.compute(positional, named);\n      (0, _validator.consumeTag)(instance[RECOMPUTE_TAG]);\n      return ret;\n    }\n    getDebugName(definition) {\n      return (0, _utils.getDebugName)((definition.class || definition)['prototype']);\n    }\n  }\n  function isFactoryManager(obj) {\n    return obj != null && 'class' in obj;\n  }\n  (0, _manager2.setHelperManager)(owner => {\n    return new ClassicHelperManager(owner);\n  }, Helper);\n  var CLASSIC_HELPER_MANAGER = (0, _manager2.getInternalHelperManager)(Helper);\n  ///////////\n  class Wrapper {\n    constructor(compute) {\n      this.compute = compute;\n      this.isHelperFactory = true;\n    }\n    create() {\n      // needs new instance or will leak containers\n      return {\n        compute: this.compute\n      };\n    }\n  }\n  class SimpleClassicHelperManager {\n    constructor() {\n      this.capabilities = (0, _manager2.helperCapabilities)('3.23', {\n        hasValue: true\n      });\n    }\n    createHelper(definition, args) {\n      var {\n        compute\n      } = definition;\n      return () => compute.call(null, args.positional, args.named);\n    }\n    getValue(fn$$1) {\n      return fn$$1();\n    }\n    getDebugName(definition) {\n      return (0, _utils.getDebugName)(definition.compute);\n    }\n  }\n  var SIMPLE_CLASSIC_HELPER_MANAGER = new SimpleClassicHelperManager();\n  (0, _manager2.setHelperManager)(() => SIMPLE_CLASSIC_HELPER_MANAGER, Wrapper.prototype);\n\n  /**\n  @module @ember/template\n  */\n  /**\n    A wrapper around a string that has been marked as safe (\"trusted\"). **When\n    rendered in HTML, Ember will not perform any escaping.**\n  \n    Note:\n  \n    1. This does not *make* the string safe; it means that some code in your\n       application has *marked* it as safe using the `htmlSafe()` function.\n  \n    2. The only public API for getting a `SafeString` is calling `htmlSafe()`. It\n       is *not* user-constructible.\n  \n    If a string contains user inputs or other untrusted data, you must sanitize\n    the string before using the `htmlSafe` method. Otherwise your code is\n    vulnerable to [Cross-Site Scripting][xss]. There are many open source\n    sanitization libraries to choose from, both for front end and server-side\n    sanitization.\n  \n    [xss]: https://owasp.org/www-community/attacks/DOM_Based_XSS\n  \n    ```javascript\n    import { htmlSafe } from '@ember/template';\n  \n    let someTrustedOrSanitizedString = \"<div>Hello!</div>\"\n  \n    htmlSafe(someTrustedorSanitizedString);\n    ```\n  \n    @for @ember/template\n    @class SafeString\n    @since 4.12.0\n    @public\n   */\n  class SafeString {\n    constructor(string) {\n      this.__string = string;\n    }\n    /**\n      Get the string back to use as a string.\n         @public\n      @method toString\n      @returns {String} The string marked as trusted\n     */\n    toString() {\n      return `${this.__string}`;\n    }\n    /**\n      Get the wrapped string as HTML to use without escaping.\n         @public\n      @method toHTML\n      @returns {String} the trusted string, without any escaping applied\n     */\n    toHTML() {\n      return this.toString();\n    }\n  }\n  _exports.SafeString = SafeString;\n  var escape = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#x27;',\n    '`': '&#x60;',\n    '=': '&#x3D;'\n  };\n  var possible = /[&<>\"'`=]/;\n  var badChars = /[&<>\"'`=]/g;\n  function escapeChar(chr) {\n    return escape[chr];\n  }\n  function escapeExpression(string) {\n    var s;\n    if (typeof string !== 'string') {\n      // don't escape SafeStrings, since they're already safe\n      if (isHTMLSafe$1(string)) {\n        return string.toHTML();\n      } else if (string === null || string === undefined) {\n        return '';\n      } else if (!string) {\n        return String(string);\n      }\n      // Force a string conversion as this will be done by the append regardless and\n      // the regex test will do this transparently behind the scenes, causing issues if\n      // an object's to string has escaped characters in it.\n      s = String(string);\n    } else {\n      s = string;\n    }\n    if (!possible.test(s)) {\n      return s;\n    }\n    // SAFETY: this is technically a lie, but it's a true lie as long as the\n    // invariant it depends on is upheld: `escapeChar` will always return a string\n    // as long as its input is one of the characters in `escape`, and it will only\n    // be called if it matches one of the characters in the `badChar` regex, which\n    // is hand-maintained to match the set escaped. (It would be nice if TS could\n    // \"see\" into the regex to see how this works, but that'd be quite a lot of\n    // extra fanciness.)\n    return s.replace(badChars, escapeChar);\n  }\n  /**\n    Use this method to indicate that a string should be rendered as HTML\n    when the string is used in a template. To say this another way,\n    strings marked with `htmlSafe` will not be HTML escaped.\n  \n    A word of warning -   The `htmlSafe` method does not make the string safe;\n    it only tells the framework to treat the string as if it is safe to render\n    as HTML. If a string contains user inputs or other untrusted\n    data, you must sanitize the string before using the `htmlSafe` method.\n    Otherwise your code is vulnerable to\n    [Cross-Site Scripting](https://owasp.org/www-community/attacks/DOM_Based_XSS).\n    There are many open source sanitization libraries to choose from,\n    both for front end and server-side sanitization.\n  \n    ```javascript\n    import { htmlSafe } from '@ember/template';\n  \n    const someTrustedOrSanitizedString = \"<div>Hello!</div>\"\n  \n    htmlSafe(someTrustedorSanitizedString)\n    ```\n  \n    @method htmlSafe\n    @for @ember/template\n    @param str {String} The string to treat as trusted.\n    @static\n    @return {SafeString} A string that will not be HTML escaped by Handlebars.\n    @public\n  */\n  function htmlSafe(str) {\n    if (str === null || str === undefined) {\n      str = '';\n    } else if (typeof str !== 'string') {\n      str = String(str);\n    }\n    return new SafeString(str);\n  }\n  /**\n    Detects if a string was decorated using `htmlSafe`.\n  \n    ```javascript\n    import { htmlSafe, isHTMLSafe } from '@ember/template';\n  \n    let plainString = 'plain string';\n    let safeString = htmlSafe('<div>someValue</div>');\n  \n    isHTMLSafe(plainString); // false\n    isHTMLSafe(safeString);  // true\n    ```\n  \n    @method isHTMLSafe\n    @for @ember/template\n    @static\n    @return {Boolean} `true` if the string was decorated with `htmlSafe`, `false` otherwise.\n    @public\n  */\n  function isHTMLSafe$1(str) {\n    return str !== null && typeof str === 'object' && 'toHTML' in str && typeof str.toHTML === 'function';\n  }\n  function instrumentationPayload(def) {\n    return {\n      object: `${def.name}:${def.outlet}`\n    };\n  }\n  var CAPABILITIES$1 = {\n    dynamicLayout: false,\n    dynamicTag: false,\n    prepareArgs: false,\n    createArgs: false,\n    attributeHook: false,\n    elementHook: false,\n    createCaller: false,\n    dynamicScope: true,\n    updateHook: false,\n    createInstance: true,\n    wrapped: false,\n    willDestroy: false,\n    hasSubOwner: false\n  };\n  class OutletComponentManager {\n    create(_owner, definition, _args, env, dynamicScope) {\n      var parentStateRef = dynamicScope.get('outletState');\n      var currentStateRef = definition.ref;\n      dynamicScope.set('outletState', currentStateRef);\n      var state = {\n        self: (0, _reference.createConstRef)(definition.controller, 'this'),\n        finalize: (0, _instrumentation._instrumentStart)('render.outlet', instrumentationPayload, definition)\n      };\n      if (env.debugRenderTree !== undefined) {\n        state.outlet = {\n          name: definition.outlet\n        };\n        var parentState = (0, _reference.valueForRef)(parentStateRef);\n        var parentOwner = parentState && parentState.render && parentState.render.owner;\n        var currentOwner = (0, _reference.valueForRef)(currentStateRef).render.owner;\n        if (parentOwner && parentOwner !== currentOwner) {\n          (true && !(currentOwner instanceof _instance.default) && (0, _debug.assert)('Expected currentOwner to be an EngineInstance', currentOwner instanceof _instance.default));\n          var mountPoint = currentOwner.mountPoint;\n          state.engine = currentOwner;\n          if (mountPoint) {\n            state.engineBucket = {\n              mountPoint\n            };\n          }\n        }\n      }\n      return state;\n    }\n    getDebugName(_ref8) {\n      var {\n        name\n      } = _ref8;\n      return name;\n    }\n    getDebugCustomRenderTree(definition, state, args) {\n      var nodes = [];\n      if (state.outlet) {\n        nodes.push({\n          bucket: state.outlet,\n          type: 'outlet',\n          name: state.outlet.name,\n          args: _runtime.EMPTY_ARGS,\n          instance: undefined,\n          template: undefined\n        });\n      }\n      if (state.engineBucket) {\n        nodes.push({\n          bucket: state.engineBucket,\n          type: 'engine',\n          name: state.engineBucket.mountPoint,\n          args: _runtime.EMPTY_ARGS,\n          instance: state.engine,\n          template: undefined\n        });\n      }\n      nodes.push({\n        bucket: state,\n        type: 'route-template',\n        name: definition.name,\n        args: args,\n        instance: definition.controller,\n        template: (0, _util.unwrapTemplate)(definition.template).moduleName\n      });\n      return nodes;\n    }\n    getCapabilities() {\n      return CAPABILITIES$1;\n    }\n    getSelf(_ref9) {\n      var {\n        self\n      } = _ref9;\n      return self;\n    }\n    didCreate() {}\n    didUpdate() {}\n    didRenderLayout(state) {\n      state.finalize();\n    }\n    didUpdateLayout() {}\n    getDestroyable() {\n      return null;\n    }\n  }\n  var OUTLET_MANAGER = new OutletComponentManager();\n  class OutletComponentDefinition {\n    constructor(state, manager) {\n      if (manager === void 0) {\n        manager = OUTLET_MANAGER;\n      }\n      this.state = state;\n      this.manager = manager;\n      // handle is not used by this custom definition\n      this.handle = -1;\n      var capabilities = manager.getCapabilities();\n      this.capabilities = (0, _manager2.capabilityFlagsFrom)(capabilities);\n      this.compilable = capabilities.wrapped ? (0, _util.unwrapTemplate)(state.template).asWrappedLayout() : (0, _util.unwrapTemplate)(state.template).asLayout();\n      this.resolvedName = state.name;\n    }\n  }\n  function createRootOutlet(outletView) {\n    if (_environment2.ENV._APPLICATION_TEMPLATE_WRAPPER) {\n      var WRAPPED_CAPABILITIES = Object.assign({}, CAPABILITIES$1, {\n        dynamicTag: true,\n        elementHook: true,\n        wrapped: true\n      });\n      var WrappedOutletComponentManager = class extends OutletComponentManager {\n        getTagName() {\n          return 'div';\n        }\n        getCapabilities() {\n          return WRAPPED_CAPABILITIES;\n        }\n        didCreateElement(component, element) {\n          // to add GUID id and class\n          element.setAttribute('class', 'ember-view');\n          element.setAttribute('id', (0, _utils.guidFor)(component));\n        }\n      };\n      var WRAPPED_OUTLET_MANAGER = new WrappedOutletComponentManager();\n      return new OutletComponentDefinition(outletView.state, WRAPPED_OUTLET_MANAGER);\n    } else {\n      return new OutletComponentDefinition(outletView.state);\n    }\n  }\n  class RootComponentManager extends CurlyComponentManager {\n    constructor(component) {\n      super();\n      this.component = component;\n    }\n    create(_owner, _state, _args, _ref10, dynamicScope) {\n      var {\n        isInteractive\n      } = _ref10;\n      var component = this.component;\n      var finalizer = (0, _instrumentation._instrumentStart)('render.component', initialRenderInstrumentDetails, component);\n      dynamicScope.view = component;\n      var hasWrappedElement = component.tagName !== '';\n      // We usually do this in the `didCreateElement`, but that hook doesn't fire for tagless components\n      if (!hasWrappedElement) {\n        if (isInteractive) {\n          component.trigger('willRender');\n        }\n        component._transitionTo('hasElement');\n        if (isInteractive) {\n          component.trigger('willInsertElement');\n        }\n      }\n      if (true /* DEBUG */) {\n        processComponentInitializationAssertions(component, {});\n      }\n      var bucket = new ComponentStateBucket(component, null, _validator.CONSTANT_TAG, finalizer, hasWrappedElement, isInteractive);\n      (0, _validator.consumeTag)(component[DIRTY_TAG]);\n      return bucket;\n    }\n  }\n  // ROOT is the top-level template it has nothing but one yield.\n  // it is supposed to have a dummy element\n  var ROOT_CAPABILITIES = {\n    dynamicLayout: true,\n    dynamicTag: true,\n    prepareArgs: false,\n    createArgs: false,\n    attributeHook: true,\n    elementHook: true,\n    createCaller: true,\n    dynamicScope: true,\n    updateHook: true,\n    createInstance: true,\n    wrapped: true,\n    willDestroy: false,\n    hasSubOwner: false\n  };\n  class RootComponentDefinition {\n    constructor(component) {\n      // handle is not used by this custom definition\n      this.handle = -1;\n      this.resolvedName = '-top-level';\n      this.capabilities = (0, _manager2.capabilityFlagsFrom)(ROOT_CAPABILITIES);\n      this.compilable = null;\n      this.manager = new RootComponentManager(component);\n      var factory = (0, _container.getFactoryFor)(component);\n      (true && !(factory !== undefined) && (0, _debug.assert)('missing factory for component', factory !== undefined));\n      this.state = factory;\n    }\n  }\n\n  /**\n  @module ember\n  */\n  /**\n    The `{{#each}}` helper loops over elements in a collection. It is an extension\n    of the base Handlebars `{{#each}}` helper.\n  \n    The default behavior of `{{#each}}` is to yield its inner block once for every\n    item in an array passing the item as the first block parameter.\n  \n    Assuming the `@developers` argument contains this array:\n  \n    ```javascript\n    [{ name: 'Yehuda' },{ name: 'Tom' }, { name: 'Paul' }];\n    ```\n  \n    ```handlebars\n    <ul>\n      {{#each @developers as |person|}}\n        <li>Hello, {{person.name}}!</li>\n      {{/each}}\n    </ul>\n    ```\n  \n    The same rules apply to arrays of primitives.\n  \n    ```javascript\n    ['Yehuda', 'Tom', 'Paul']\n    ```\n  \n    ```handlebars\n    <ul>\n      {{#each @developerNames as |name|}}\n        <li>Hello, {{name}}!</li>\n      {{/each}}\n    </ul>\n    ```\n  \n    During iteration, the index of each item in the array is provided as a second block\n    parameter.\n  \n    ```handlebars\n    <ul>\n      {{#each @developers as |person index|}}\n        <li>Hello, {{person.name}}! You're number {{index}} in line</li>\n      {{/each}}\n    </ul>\n    ```\n  \n    ### Specifying Keys\n  \n    In order to improve rendering speed, Ember will try to reuse the DOM elements\n    where possible. Specifically, if the same item is present in the array both\n    before and after the change, its DOM output will be reused.\n  \n    The `key` option is used to tell Ember how to determine if the items in the\n    array being iterated over with `{{#each}}` has changed between renders. By\n    default the item's object identity is used.\n  \n    This is usually sufficient, so in most cases, the `key` option is simply not\n    needed. However, in some rare cases, the objects' identities may change even\n    though they represent the same underlying data.\n  \n    For example:\n  \n    ```javascript\n    people.map(person => {\n      return { ...person, type: 'developer' };\n    });\n    ```\n  \n    In this case, each time the `people` array is `map`-ed over, it will produce\n    an new array with completely different objects between renders. In these cases,\n    you can help Ember determine how these objects related to each other with the\n    `key` option:\n  \n    ```handlebars\n    <ul>\n      {{#each @developers key=\"name\" as |person|}}\n        <li>Hello, {{person.name}}!</li>\n      {{/each}}\n    </ul>\n    ```\n  \n    By doing so, Ember will use the value of the property specified (`person.name`\n    in the example) to find a \"match\" from the previous render. That is, if Ember\n    has previously seen an object from the `@developers` array with a matching\n    name, its DOM elements will be re-used.\n  \n    There are two special values for `key`:\n  \n      * `@index` - The index of the item in the array.\n      * `@identity` - The item in the array itself.\n  \n    ### {{else}} condition\n  \n    `{{#each}}` can have a matching `{{else}}`. The contents of this block will render\n    if the collection is empty.\n  \n    ```handlebars\n    <ul>\n      {{#each @developers as |person|}}\n        <li>{{person.name}} is available!</li>\n      {{else}}\n        <li>Sorry, nobody is available for this task.</li>\n      {{/each}}\n    </ul>\n    ```\n  \n    @method each\n    @for Ember.Templates.helpers\n    @public\n   */\n  /**\n    The `{{each-in}}` helper loops over properties on an object.\n  \n    For example, given this component definition:\n  \n    ```app/components/developer-details.js\n    import Component from '@glimmer/component';\n    import { tracked } from '@glimmer/tracking';\n  \n    export default class extends Component {\n      @tracked developer = {\n        \"name\": \"Shelly Sails\",\n        \"age\": 42\n      };\n    }\n    ```\n  \n    This template would display all properties on the `developer`\n    object in a list:\n  \n    ```app/components/developer-details.hbs\n    <ul>\n      {{#each-in this.developer as |key value|}}\n        <li>{{key}}: {{value}}</li>\n      {{/each-in}}\n    </ul>\n    ```\n  \n    Outputting their name and age:\n  \n    ```html\n    <ul>\n      <li>name: Shelly Sails</li>\n      <li>age: 42</li>\n    </ul>\n    ```\n  \n    @method each-in\n    @for Ember.Templates.helpers\n    @public\n    @since 2.1.0\n  */\n  class EachInWrapper {\n    constructor(inner) {\n      this.inner = inner;\n    }\n  }\n  var eachIn = internalHelper(_ref11 => {\n    var {\n      positional\n    } = _ref11;\n    var inner = positional[0];\n    (true && !(inner) && (0, _debug.assert)('expected at least one positional arg', inner));\n    return (0, _reference.createComputeRef)(() => {\n      var iterable = (0, _reference.valueForRef)(inner);\n      (0, _validator.consumeTag)((0, _metal.tagForObject)(iterable));\n      if ((0, _utils.isProxy)(iterable)) {\n        // this is because the each-in doesn't actually get(proxy, 'key') but bypasses it\n        // and the proxy's tag is lazy updated on access\n        iterable = (0, _runtime2._contentFor)(iterable);\n      }\n      return new EachInWrapper(iterable);\n    });\n  });\n  function toIterator(iterable) {\n    if (iterable instanceof EachInWrapper) {\n      return toEachInIterator(iterable.inner);\n    } else {\n      return toEachIterator(iterable);\n    }\n  }\n  function toEachInIterator(iterable) {\n    if (!isIndexable(iterable)) {\n      return null;\n    }\n    if (Array.isArray(iterable) || (0, _internals2.isEmberArray)(iterable)) {\n      return ObjectIterator.fromIndexable(iterable);\n    } else if (isNativeIterable(iterable)) {\n      return MapLikeNativeIterator.from(iterable);\n    } else if (hasForEach(iterable)) {\n      return ObjectIterator.fromForEachable(iterable);\n    } else {\n      return ObjectIterator.fromIndexable(iterable);\n    }\n  }\n  function toEachIterator(iterable) {\n    if (!(0, _utils.isObject)(iterable)) {\n      return null;\n    }\n    if (Array.isArray(iterable)) {\n      return ArrayIterator.from(iterable);\n    } else if ((0, _internals2.isEmberArray)(iterable)) {\n      return EmberArrayIterator.from(iterable);\n    } else if (isNativeIterable(iterable)) {\n      return ArrayLikeNativeIterator.from(iterable);\n    } else if (hasForEach(iterable)) {\n      return ArrayIterator.fromForEachable(iterable);\n    } else {\n      return null;\n    }\n  }\n  class BoundedIterator {\n    constructor(length) {\n      this.length = length;\n      this.position = 0;\n    }\n    isEmpty() {\n      return false;\n    }\n    memoFor(position) {\n      return position;\n    }\n    next() {\n      var {\n        length,\n        position\n      } = this;\n      if (position >= length) {\n        return null;\n      }\n      var value = this.valueFor(position);\n      var memo = this.memoFor(position);\n      this.position++;\n      return {\n        value,\n        memo\n      };\n    }\n  }\n  class ArrayIterator extends BoundedIterator {\n    static from(iterable) {\n      return iterable.length > 0 ? new this(iterable) : null;\n    }\n    static fromForEachable(object) {\n      var array$$1 = [];\n      object.forEach(item => array$$1.push(item));\n      return this.from(array$$1);\n    }\n    constructor(array$$1) {\n      super(array$$1.length);\n      this.array = array$$1;\n    }\n    valueFor(position) {\n      return this.array[position];\n    }\n  }\n  class EmberArrayIterator extends BoundedIterator {\n    static from(iterable) {\n      return iterable.length > 0 ? new this(iterable) : null;\n    }\n    constructor(array$$1) {\n      super(array$$1.length);\n      this.array = array$$1;\n    }\n    valueFor(position) {\n      return (0, _metal.objectAt)(this.array, position);\n    }\n  }\n  class ObjectIterator extends BoundedIterator {\n    static fromIndexable(obj) {\n      var keys = Object.keys(obj);\n      if (keys.length === 0) {\n        return null;\n      } else {\n        var values = [];\n        for (var key of keys) {\n          var value = void 0;\n          value = obj[key];\n          // Add the tag of the returned value if it is an array, since arrays\n          // should always cause updates if they are consumed and then changed\n          if ((0, _validator.isTracking)()) {\n            (0, _validator.consumeTag)((0, _validator.tagFor)(obj, key));\n            if (Array.isArray(value)) {\n              (0, _validator.consumeTag)((0, _validator.tagFor)(value, '[]'));\n            }\n          }\n          values.push(value);\n        }\n        return new this(keys, values);\n      }\n    }\n    static fromForEachable(obj) {\n      var keys = [];\n      var values = [];\n      var length = 0;\n      var isMapLike = false;\n      // Not using an arrow function here so we can get an accurate `arguments`\n      obj.forEach(function (value, key) {\n        isMapLike = isMapLike || arguments.length >= 2;\n        if (isMapLike) {\n          keys.push(key);\n        }\n        values.push(value);\n        length++;\n      });\n      if (length === 0) {\n        return null;\n      } else if (isMapLike) {\n        return new this(keys, values);\n      } else {\n        return new ArrayIterator(values);\n      }\n    }\n    constructor(keys, values) {\n      super(values.length);\n      this.keys = keys;\n      this.values = values;\n    }\n    valueFor(position) {\n      return this.values[position];\n    }\n    memoFor(position) {\n      return this.keys[position];\n    }\n  }\n  class NativeIterator {\n    static from(iterable) {\n      var iterator = iterable[Symbol.iterator]();\n      var result = iterator.next();\n      var {\n        done\n      } = result;\n      if (done) {\n        return null;\n      } else {\n        return new this(iterator, result);\n      }\n    }\n    constructor(iterable, result) {\n      this.iterable = iterable;\n      this.result = result;\n      this.position = 0;\n    }\n    isEmpty() {\n      return false;\n    }\n    next() {\n      var {\n        iterable,\n        result,\n        position\n      } = this;\n      if (result.done) {\n        return null;\n      }\n      var value = this.valueFor(result, position);\n      var memo = this.memoFor(result, position);\n      this.position++;\n      this.result = iterable.next();\n      return {\n        value,\n        memo\n      };\n    }\n  }\n  class ArrayLikeNativeIterator extends NativeIterator {\n    valueFor(result) {\n      return result.value;\n    }\n    memoFor(_result, position) {\n      return position;\n    }\n  }\n  class MapLikeNativeIterator extends NativeIterator {\n    valueFor(result) {\n      return result.value[1];\n    }\n    memoFor(result) {\n      return result.value[0];\n    }\n  }\n  function hasForEach(value) {\n    return value != null && typeof value['forEach'] === 'function';\n  }\n  function isNativeIterable(value) {\n    return value != null && typeof value[Symbol.iterator] === 'function';\n  }\n  function isIndexable(value) {\n    return value !== null && (typeof value === 'object' || typeof value === 'function');\n  }\n  function toBool(predicate) {\n    if ((0, _utils.isProxy)(predicate)) {\n      (0, _validator.consumeTag)((0, _metal.tagForProperty)(predicate, 'content'));\n      return Boolean((0, _metal.get)(predicate, 'isTruthy'));\n    } else if ((0, _array.isArray)(predicate)) {\n      (0, _validator.consumeTag)((0, _metal.tagForProperty)(predicate, '[]'));\n      return predicate.length !== 0;\n    } else if ((0, _glimmer.isHTMLSafe)(predicate)) {\n      return Boolean(predicate.toString());\n    } else {\n      return Boolean(predicate);\n    }\n  }\n\n  ///////////\n  // Setup global context\n  (0, _globalContext.default)({\n    FEATURES: {\n      DEFAULT_HELPER_MANAGER: true\n    },\n    scheduleRevalidate() {\n      _runloop._backburner.ensureInstance();\n    },\n    toBool,\n    toIterator,\n    getProp: _metal._getProp,\n    setProp: _metal._setProp,\n    getPath: _metal.get,\n    setPath: _metal.set,\n    scheduleDestroy(destroyable, destructor) {\n      (0, _runloop.schedule)('actions', null, destructor, destroyable);\n    },\n    scheduleDestroyed(finalizeDestructor) {\n      (0, _runloop.schedule)('destroy', null, finalizeDestructor);\n    },\n    warnIfStyleNotTrusted(value) {\n      (true && (0, _debug.warn)((0, _views.constructStyleDeprecationMessage)(String(value)), (() => {\n        if (value === null || value === undefined || isHTMLSafe$1(value)) {\n          return true;\n        }\n        return false;\n      })(), {\n        id: 'ember-htmlbars.style-xss-warning'\n      }));\n    },\n    assert(test, msg, options) {\n      var _a;\n      if (true /* DEBUG */) {\n        var id = options === null || options === void 0 ? void 0 : options.id;\n        var override = VM_ASSERTION_OVERRIDES.filter(o => o.id === id)[0];\n        (true && !(test) && (0, _debug.assert)((_a = override === null || override === void 0 ? void 0 : override.message) !== null && _a !== void 0 ? _a : msg, test));\n      }\n    },\n    deprecate(msg, test, options) {\n      var _a;\n      if (true /* DEBUG */) {\n        var {\n          id\n        } = options;\n        if (id === 'argument-less-helper-paren-less-invocation') {\n          throw new Error(`A resolved helper cannot be passed as a named argument as the syntax is ` + `ambiguously a pass-by-reference or invocation. Use the ` + `\\`{{helper 'foo-helper}}\\` helper to pass by reference or explicitly ` + `invoke the helper with parens: \\`{{(fooHelper)}}\\`.`);\n        }\n        var override = VM_DEPRECATION_OVERRIDES.filter(o => o.id === id)[0];\n        if (!override) throw new Error(`deprecation override for ${id} not found`);\n        // allow deprecations to be disabled in the VM_DEPRECATION_OVERRIDES array below\n        if (!override.disabled) {\n          (true && !(Boolean(test)) && (0, _debug.deprecate)((_a = override.message) !== null && _a !== void 0 ? _a : msg, Boolean(test), override));\n        }\n      }\n    }\n  });\n  if (true /* DEBUG */) {\n    _validator.setTrackingTransactionEnv === null || _validator.setTrackingTransactionEnv === void 0 ? void 0 : (0, _validator.setTrackingTransactionEnv)({\n      debugMessage(obj, keyName) {\n        var dirtyString = keyName ? `\\`${keyName}\\` on \\`${_utils.getDebugName === null || _utils.getDebugName === void 0 ? void 0 : (0, _utils.getDebugName)(obj)}\\`` : `\\`${_utils.getDebugName === null || _utils.getDebugName === void 0 ? void 0 : (0, _utils.getDebugName)(obj)}\\``;\n        return `You attempted to update ${dirtyString}, but it had already been used previously in the same computation.  Attempting to update a value after using it in a computation can cause logical errors, infinite revalidation bugs, and performance issues, and is not supported.`;\n      }\n    });\n  }\n  ///////////\n  // VM Assertion/Deprecation overrides\n  var VM_DEPRECATION_OVERRIDES = [{\n    id: 'setting-on-hash',\n    until: '4.4.0',\n    for: 'ember-source',\n    since: {\n      available: '3.28.0',\n      enabled: '3.28.0'\n    }\n  }];\n  var VM_ASSERTION_OVERRIDES = [];\n  ///////////\n  // Define environment delegate\n  class EmberEnvironmentDelegate {\n    constructor(owner, isInteractive) {\n      this.owner = owner;\n      this.isInteractive = isInteractive;\n      this.enableDebugTooling = _environment2.ENV._DEBUG_RENDER_TREE;\n    }\n    onTransactionCommit() {}\n  }\n\n  /**\n  @module ember\n  */\n  var disallowDynamicResolution = internalHelper(_ref12 => {\n    var {\n      positional,\n      named\n    } = _ref12;\n    var nameOrValueRef = positional[0];\n    (true && !(positional.length === 1 && nameOrValueRef) && (0, _debug.assert)(`[BUG] wrong number of positional arguments, expecting 1, got ${positional.length}`, positional.length === 1 && nameOrValueRef));\n    var typeRef = named['type'];\n    var locRef = named['loc'];\n    var originalRef = named['original'];\n    (true && !(typeRef) && (0, _debug.assert)(`[BUG] expecting \\`type\\` named argument`, typeRef));\n    (true && !(locRef) && (0, _debug.assert)(`[BUG] expecting \\`loc\\` named argument`, locRef));\n    (true && !(originalRef) && (0, _debug.assert)(`[BUG] expecting \\`original\\` named argument`, originalRef)); // Bug: why do these fail?\n    // assert('[BUG] expecting a string literal for the `type` argument', isConstRef(typeRef));\n    // assert('[BUG] expecting a string literal for the `loc` argument', isConstRef(locRef));\n    // assert('[BUG] expecting a string literal for the `original` argument', isConstRef(originalRef));\n    var type = (0, _reference.valueForRef)(typeRef);\n    var loc = (0, _reference.valueForRef)(locRef);\n    var original = (0, _reference.valueForRef)(originalRef);\n    (true && !(typeof type === 'string') && (0, _debug.assert)('[BUG] expecting a string literal for the `type` argument', typeof type === 'string'));\n    (true && !(typeof loc === 'string') && (0, _debug.assert)('[BUG] expecting a string literal for the `loc` argument', typeof loc === 'string'));\n    (true && !(typeof original === 'string') && (0, _debug.assert)('[BUG] expecting a string literal for the `original` argument', typeof original === 'string'));\n    return (0, _reference.createComputeRef)(() => {\n      var nameOrValue = (0, _reference.valueForRef)(nameOrValueRef);\n      (true && !(typeof nameOrValue !== 'string') && (0, _debug.assert)(`Passing a dynamic string to the \\`(${type})\\` keyword is disallowed. ` + `(You specified \\`(${type} ${original})\\` and \\`${original}\\` evaluated into \"${nameOrValue}\".) ` + `This ensures we can statically analyze the template and determine which ${type}s are used. ` + `If the ${type} name is always the same, use a string literal instead, i.e. \\`(${type} \"${nameOrValue}\")\\`. ` + `Otherwise, import the ${type}s into JavaScript and pass them directly. ` + 'See https://github.com/emberjs/rfcs/blob/master/text/0496-handlebars-strict-mode.md#4-no-dynamic-resolution for details. ' + loc, typeof nameOrValue !== 'string'));\n      return nameOrValue;\n    });\n  });\n  var helper$1;\n  if (true /* DEBUG */) {\n    helper$1 = args => {\n      var inner = args.positional[0];\n      (true && !(inner) && (0, _debug.assert)('expected at least one positional arg', inner));\n      return (0, _reference.createComputeRef)(() => {\n        var value = (0, _reference.valueForRef)(inner);\n        (true && !(value !== null && value !== undefined) && (0, _debug.assert)('You cannot pass a null or undefined destination element to in-element', value !== null && value !== undefined));\n        return value;\n      });\n    };\n  } else {\n    helper$1 = args => {\n      var arg = args.positional[0];\n      (true && !(arg) && (0, _debug.assert)('expected at least one positional arg', arg));\n      return arg;\n    };\n  }\n  var inElementNullCheckHelper = internalHelper(helper$1);\n  var normalizeClassHelper = internalHelper(_ref13 => {\n    var {\n      positional\n    } = _ref13;\n    return (0, _reference.createComputeRef)(() => {\n      var classNameArg = positional[0];\n      var valueArg = positional[1];\n      (true && !(classNameArg && valueArg) && (0, _debug.assert)('expected at least two positional args', classNameArg && valueArg));\n      var classNameParts = (0, _reference.valueForRef)(classNameArg).split('.');\n      var className = classNameParts[classNameParts.length - 1];\n      (true && !(className) && (0, _debug.assert)('has className', className)); // Always at least one split result\n      var value = (0, _reference.valueForRef)(valueArg);\n      if (value === true) {\n        return (0, _string.dasherize)(className);\n      } else if (!value && value !== 0) {\n        return '';\n      } else {\n        return String(value);\n      }\n    });\n  });\n  var resolve = internalHelper((_ref14, owner) => {\n    var {\n      positional\n    } = _ref14;\n    var _a;\n    // why is this allowed to be undefined in the first place?\n    (true && !(owner) && (0, _debug.assert)('[BUG] missing owner', owner));\n    (true && !(positional.length === 1) && (0, _debug.assert)(`[BUG] wrong number of positional arguments, expecting 1, got ${positional.length}`, positional.length === 1));\n    var fullNameRef = positional[0];\n    (true && !(fullNameRef && (0, _reference.isConstRef)(fullNameRef)) && (0, _debug.assert)('[BUG] expecting a string literal as argument', fullNameRef && (0, _reference.isConstRef)(fullNameRef)));\n    var fullName = (0, _reference.valueForRef)(fullNameRef);\n    (true && !(typeof fullName === 'string') && (0, _debug.assert)('[BUG] expecting a string literal as argument', typeof fullName === 'string'));\n    (true && !((s => s.split(':').length === 2)(fullName)) && (0, _debug.assert)('[BUG] expecting a valid full name', (s => s.split(':').length === 2)(fullName)));\n    if (true /* DEBUG */) {\n      var [type, name] = fullName.split(':');\n      (true && !(owner.hasRegistration(fullName)) && (0, _debug.assert)(`Attempted to invoke \\`(-resolve \"${fullName}\")\\`, but ${name} was not a valid ${type} name.`, owner.hasRegistration(fullName)));\n    }\n    return (0, _reference.createConstRef)((_a = owner.factoryFor(fullName)) === null || _a === void 0 ? void 0 : _a.class, `(-resolve \"${fullName}\")`);\n  });\n\n  /**\n  @module ember\n  */\n  /**\n    This reference is used to get the `[]` tag of iterables, so we can trigger\n    updates to `{{each}}` when it changes. It is put into place by a template\n    transform at build time, similar to the (-each-in) helper\n  */\n  var trackArray = internalHelper(_ref15 => {\n    var {\n      positional\n    } = _ref15;\n    var inner = positional[0];\n    (true && !(inner) && (0, _debug.assert)('expected at least one positional arg', inner));\n    return (0, _reference.createComputeRef)(() => {\n      var iterable = (0, _reference.valueForRef)(inner);\n      if ((0, _utils.isObject)(iterable)) {\n        (0, _validator.consumeTag)((0, _metal.tagForProperty)(iterable, '[]'));\n      }\n      return iterable;\n    });\n  });\n\n  /**\n  @module ember\n  */\n  /**\n    The `mut` helper lets you __clearly specify__ that a child `Component` can update the\n    (mutable) value passed to it, which will __change the value of the parent component__.\n  \n    To specify that a parameter is mutable, when invoking the child `Component`:\n  \n    ```handlebars\n    <MyChild @childClickCount={{fn (mut totalClicks)}} />\n    ```\n  \n     or\n  \n    ```handlebars\n    {{my-child childClickCount=(mut totalClicks)}}\n    ```\n  \n    The child `Component` can then modify the parent's value just by modifying its own\n    property:\n  \n    ```javascript\n    // my-child.js\n    export default Component.extend({\n      click() {\n        this.incrementProperty('childClickCount');\n      }\n    });\n    ```\n  \n    Note that for curly components (`{{my-component}}`) the bindings are already mutable,\n    making the `mut` unnecessary.\n  \n    Additionally, the `mut` helper can be combined with the `fn` helper to\n    mutate a value. For example:\n  \n    ```handlebars\n    <MyChild @childClickCount={{this.totalClicks}} @click-count-change={{fn (mut totalClicks))}} />\n    ```\n  \n    or\n  \n    ```handlebars\n    {{my-child childClickCount=totalClicks click-count-change=(fn (mut totalClicks))}}\n    ```\n  \n    The child `Component` would invoke the function with the new click value:\n  \n    ```javascript\n    // my-child.js\n    export default Component.extend({\n      click() {\n        this.get('click-count-change')(this.get('childClickCount') + 1);\n      }\n    });\n    ```\n  \n    The `mut` helper changes the `totalClicks` value to what was provided as the `fn` argument.\n  \n    The `mut` helper, when used with `fn`, will return a function that\n    sets the value passed to `mut` to its first argument. As an example, we can create a\n    button that increments a value passing the value directly to the `fn`:\n  \n    ```handlebars\n    {{! inc helper is not provided by Ember }}\n    <button onclick={{fn (mut count) (inc count)}}>\n      Increment count\n    </button>\n    ```\n  \n    @method mut\n    @param {Object} [attr] the \"two-way\" attribute that can be modified.\n    @for Ember.Templates.helpers\n    @public\n  */\n  var mut = internalHelper(_ref16 => {\n    var {\n      positional\n    } = _ref16;\n    var ref = positional[0];\n    (true && !(ref) && (0, _debug.assert)('expected at least one positional arg', ref)); // TODO: Improve this error message. This covers at least two distinct\n    // cases:\n    //\n    // 1. (mut \"not a path\") – passing a literal, result from a helper\n    //    invocation, etc\n    //\n    // 2. (mut receivedValue) – passing a value received from the caller\n    //    that was originally derived from a literal, result from a helper\n    //    invocation, etc\n    //\n    // This message is alright for the first case, but could be quite\n    // confusing for the second case.\n    (true && !((0, _reference.isUpdatableRef)(ref)) && (0, _debug.assert)('You can only pass a path to mut', (0, _reference.isUpdatableRef)(ref)));\n    return (0, _reference.createInvokableRef)(ref);\n  });\n\n  /**\n    The `readonly` helper let's you specify that a binding is one-way only,\n    instead of two-way.\n    When you pass a `readonly` binding from an outer context (e.g. parent component),\n    to to an inner context (e.g. child component), you are saying that changing that\n    property in the inner context does not change the value in the outer context.\n  \n    To specify that a binding is read-only, when invoking the child `Component`:\n  \n    ```app/components/my-parent.js\n    export default Component.extend({\n      totalClicks: 3\n    });\n    ```\n  \n    ```app/templates/components/my-parent.hbs\n    {{log totalClicks}} // -> 3\n    <MyChild @childClickCount={{readonly totalClicks}} />\n    ```\n    ```\n    {{my-child childClickCount=(readonly totalClicks)}}\n    ```\n  \n    Now, when you update `childClickCount`:\n  \n    ```app/components/my-child.js\n    export default Component.extend({\n      click() {\n        this.incrementProperty('childClickCount');\n      }\n    });\n    ```\n  \n    The value updates in the child component, but not the parent component:\n  \n    ```app/templates/components/my-child.hbs\n    {{log childClickCount}} //-> 4\n    ```\n  \n    ```app/templates/components/my-parent.hbs\n    {{log totalClicks}} //-> 3\n    <MyChild @childClickCount={{readonly totalClicks}} />\n    ```\n    or\n    ```app/templates/components/my-parent.hbs\n    {{log totalClicks}} //-> 3\n    {{my-child childClickCount=(readonly totalClicks)}}\n    ```\n  \n    ### Objects and Arrays\n  \n    When passing a property that is a complex object (e.g. object, array) instead of a primitive object (e.g. number, string),\n    only the reference to the object is protected using the readonly helper.\n    This means that you can change properties of the object both on the parent component, as well as the child component.\n    The `readonly` binding behaves similar to the `const` keyword in JavaScript.\n  \n    Let's look at an example:\n  \n    First let's set up the parent component:\n  \n    ```app/components/my-parent.js\n    import Component from '@ember/component';\n  \n    export default Component.extend({\n      clicks: null,\n  \n      init() {\n        this._super(...arguments);\n        this.set('clicks', { total: 3 });\n      }\n    });\n    ```\n  \n    ```app/templates/components/my-parent.hbs\n    {{log clicks.total}} //-> 3\n    <MyChild @childClicks={{readonly clicks}} />\n    ```\n    ```app/templates/components/my-parent.hbs\n    {{log clicks.total}} //-> 3\n    {{my-child childClicks=(readonly clicks)}}\n    ```\n  \n    Now, if you update the `total` property of `childClicks`:\n  \n    ```app/components/my-child.js\n    import Component from '@ember/component';\n  \n    export default Component.extend({\n      click() {\n        this.get('clicks').incrementProperty('total');\n      }\n    });\n    ```\n  \n    You will see the following happen:\n  \n    ```app/templates/components/my-parent.hbs\n    {{log clicks.total}} //-> 4\n    <MyChild @childClicks={{readonly clicks}} />\n    ```\n    or\n    ```app/templates/components/my-parent.hbs\n    {{log clicks.total}} //-> 4\n    {{my-child childClicks=(readonly clicks)}}\n    ```\n  \n    ```app/templates/components/my-child.hbs\n    {{log childClicks.total}} //-> 4\n    ```\n  \n    @method readonly\n    @param {Object} [attr] the read-only attribute.\n    @for Ember.Templates.helpers\n    @private\n  */\n  var readonly = internalHelper(_ref17 => {\n    var {\n      positional\n    } = _ref17;\n    var firstArg = positional[0];\n    (true && !(firstArg) && (0, _debug.assert)('has first arg', firstArg));\n    return (0, _reference.createReadOnlyRef)(firstArg);\n  });\n\n  /**\n  @module ember\n  */\n  /**\n    The `{{unbound}}` helper disconnects the one-way binding of a property,\n    essentially freezing its value at the moment of rendering. For example,\n    in this example the display of the variable `name` will not change even\n    if it is set with a new value:\n  \n    ```handlebars\n    {{unbound this.name}}\n    ```\n  \n    Like any helper, the `unbound` helper can accept a nested helper expression.\n    This allows for custom helpers to be rendered unbound:\n  \n    ```handlebars\n    {{unbound (some-custom-helper)}}\n    {{unbound (capitalize this.name)}}\n    {{! You can use any helper, including unbound, in a nested expression }}\n    {{capitalize (unbound this.name)}}\n    ```\n  \n    The `unbound` helper only accepts a single argument, and it return an\n    unbound value.\n  \n    @method unbound\n    @for Ember.Templates.helpers\n    @public\n  */\n  var unbound = internalHelper(_ref18 => {\n    var {\n      positional,\n      named\n    } = _ref18;\n    (true && !(positional.length === 1 && Object.keys(named).length === 0) && (0, _debug.assert)('unbound helper cannot be called with multiple params or hash params', positional.length === 1 && Object.keys(named).length === 0));\n    return (0, _reference.createUnboundRef)((0, _reference.valueForRef)(positional[0]), '(result of an `unbound` helper)');\n  });\n\n  /**\n  @module ember\n  */\n  var uniqueId = internalHelper(() => {\n    return (0, _reference.createConstRef)(uniqueId$1(), 'unique-id');\n  });\n  // From https://gist.github.com/selfish/fef2c0ba6cdfe07af76e64cecd74888b\n  //\n  // This code should be reasonably fast, and provide a unique value every time\n  // it's called, which is what we need here. It produces a string formatted as a\n  // standard UUID, which avoids accidentally turning Ember-specific\n  // implementation details into an intimate API. It also ensures that the UUID\n  // always starts with a letter, to avoid creating invalid IDs with a numeric\n  // digit at the start.\n  function uniqueId$1() {\n    // @ts-expect-error this one-liner abuses weird JavaScript semantics that\n    // TypeScript (legitimately) doesn't like, but they're nonetheless valid and\n    // specced.\n    return ([3e7] + -1e3 + -4e3 + -2e3 + -1e11).replace(/[0-3]/g, a => (a * 4 ^ Math.random() * 16 >> (a & 2)).toString(16));\n  }\n  var MODIFIERS = ['alt', 'shift', 'meta', 'ctrl'];\n  var POINTER_EVENT_TYPE_REGEX = /^click|mouse|touch/;\n  function isAllowedEvent(event, allowedKeys) {\n    if (allowedKeys === null || allowedKeys === undefined) {\n      if (POINTER_EVENT_TYPE_REGEX.test(event.type)) {\n        return (0, _views.isSimpleClick)(event);\n      } else {\n        allowedKeys = '';\n      }\n    }\n    if (allowedKeys.indexOf('any') >= 0) {\n      return true;\n    }\n    for (var i = 0; i < MODIFIERS.length; i++) {\n      if (event[MODIFIERS[i] + 'Key'] && allowedKeys.indexOf(MODIFIERS[i]) === -1) {\n        return false;\n      }\n    }\n    return true;\n  }\n  var ActionHelper = {\n    // registeredActions is re-exported for compatibility with older plugins\n    // that were using this undocumented API.\n    registeredActions: _views.ActionManager.registeredActions,\n    registerAction(actionState) {\n      var {\n        actionId\n      } = actionState;\n      _views.ActionManager.registeredActions[actionId] = actionState;\n      return actionId;\n    },\n    unregisterAction(actionState) {\n      var {\n        actionId\n      } = actionState;\n      delete _views.ActionManager.registeredActions[actionId];\n    }\n  };\n  class ActionState {\n    constructor(element, owner, actionId, actionArgs, namedArgs, positionalArgs) {\n      this.tag = (0, _validator.createUpdatableTag)();\n      this.element = element;\n      this.owner = owner;\n      this.actionId = actionId;\n      this.actionArgs = actionArgs;\n      this.namedArgs = namedArgs;\n      this.positional = positionalArgs;\n      this.eventName = this.getEventName();\n      (0, _destroyable.registerDestructor)(this, () => ActionHelper.unregisterAction(this));\n    }\n    getEventName() {\n      var {\n        on: on$$1\n      } = this.namedArgs;\n      return on$$1 !== undefined ? (0, _reference.valueForRef)(on$$1) : 'click';\n    }\n    getActionArgs() {\n      var result = new Array(this.actionArgs.length);\n      for (var i = 0; i < this.actionArgs.length; i++) {\n        result[i] = (0, _reference.valueForRef)(this.actionArgs[i]);\n      }\n      return result;\n    }\n    getTarget() {\n      var {\n        implicitTarget,\n        namedArgs\n      } = this;\n      var {\n        target\n      } = namedArgs;\n      return target !== undefined ? (0, _reference.valueForRef)(target) : (0, _reference.valueForRef)(implicitTarget);\n    }\n    handler(event) {\n      var {\n        actionName,\n        namedArgs\n      } = this;\n      var {\n        bubbles,\n        preventDefault,\n        allowedKeys\n      } = namedArgs;\n      var bubblesVal = bubbles !== undefined ? (0, _reference.valueForRef)(bubbles) : undefined;\n      var preventDefaultVal = preventDefault !== undefined ? (0, _reference.valueForRef)(preventDefault) : undefined;\n      var allowedKeysVal = allowedKeys !== undefined ? (0, _reference.valueForRef)(allowedKeys) : undefined;\n      var target = this.getTarget();\n      var shouldBubble = bubblesVal !== false;\n      if (!isAllowedEvent(event, allowedKeysVal)) {\n        return true;\n      }\n      if (preventDefaultVal !== false) {\n        event.preventDefault();\n      }\n      if (!shouldBubble) {\n        event.stopPropagation();\n      }\n      (0, _runloop.join)(() => {\n        var args = this.getActionArgs();\n        var payload = {\n          args,\n          target,\n          name: null\n        };\n        if ((0, _reference.isInvokableRef)(actionName)) {\n          (0, _instrumentation.flaggedInstrument)('interaction.ember-action', payload, () => {\n            (0, _reference.updateRef)(actionName, args[0]);\n          });\n          return;\n        }\n        if (typeof actionName === 'function') {\n          (0, _instrumentation.flaggedInstrument)('interaction.ember-action', payload, () => {\n            actionName.apply(target, args);\n          });\n          return;\n        }\n        payload.name = actionName;\n        if (target.send) {\n          (0, _instrumentation.flaggedInstrument)('interaction.ember-action', payload, () => {\n            target.send.apply(target, [actionName, ...args]);\n          });\n        } else {\n          (true && !(typeof target[actionName] === 'function') && (0, _debug.assert)(`The action '${actionName}' did not exist on ${target}`, typeof target[actionName] === 'function'));\n          (0, _instrumentation.flaggedInstrument)('interaction.ember-action', payload, () => {\n            target[actionName].apply(target, args);\n          });\n        }\n      });\n      return shouldBubble;\n    }\n  }\n  class ActionModifierManager {\n    create(owner, element, _state, _ref19) {\n      var {\n        named,\n        positional\n      } = _ref19;\n      var actionArgs = [];\n      // The first two arguments are (1) `this` and (2) the action name.\n      // Everything else is a param.\n      for (var i = 2; i < positional.length; i++) {\n        actionArgs.push(positional[i]);\n      }\n      var actionId = (0, _utils.uuid)();\n      return new ActionState(element, owner, actionId, actionArgs, named, positional);\n    }\n    getDebugName() {\n      return 'action';\n    }\n    install(actionState) {\n      var {\n        element,\n        actionId,\n        positional\n      } = actionState;\n      var actionName;\n      var actionNameRef;\n      var implicitTarget;\n      if (positional.length > 1) {\n        implicitTarget = positional[0];\n        actionNameRef = positional[1];\n        if ((0, _reference.isInvokableRef)(actionNameRef)) {\n          actionName = actionNameRef;\n        } else {\n          actionName = (0, _reference.valueForRef)(actionNameRef);\n          if (true /* DEBUG */) {\n            var actionPath = actionNameRef.debugLabel;\n            var actionPathParts = actionPath.split('.');\n            var actionLabel = actionPathParts[actionPathParts.length - 1];\n            (true && !(typeof actionName === 'string' || typeof actionName === 'function') && (0, _debug.assert)('You specified a quoteless path, `' + actionPath + '`, to the ' + '{{action}} helper which did not resolve to an action name (a ' + 'string). Perhaps you meant to use a quoted actionName? (e.g. ' + '{{action \"' + actionLabel + '\"}}).', typeof actionName === 'string' || typeof actionName === 'function'));\n          }\n        }\n      }\n      actionState.actionName = actionName;\n      actionState.implicitTarget = implicitTarget;\n      this.ensureEventSetup(actionState);\n      ActionHelper.registerAction(actionState);\n      element.setAttribute('data-ember-action', '');\n      element.setAttribute(`data-ember-action-${actionId}`, String(actionId));\n    }\n    update(actionState) {\n      var {\n        positional\n      } = actionState;\n      var actionNameRef = positional[1];\n      (true && !(actionNameRef) && (0, _debug.assert)('Expected at least one positional arg', actionNameRef));\n      if (!(0, _reference.isInvokableRef)(actionNameRef)) {\n        actionState.actionName = (0, _reference.valueForRef)(actionNameRef);\n      }\n      var newEventName = actionState.getEventName();\n      if (newEventName !== actionState.eventName) {\n        this.ensureEventSetup(actionState);\n        actionState.eventName = actionState.getEventName();\n      }\n    }\n    ensureEventSetup(actionState) {\n      var dispatcher = actionState.owner.lookup('event_dispatcher:main');\n      (true && !(dispatcher instanceof _views.EventDispatcher) && (0, _debug.assert)('Expected dispatcher to be an EventDispatcher', dispatcher instanceof _views.EventDispatcher));\n      dispatcher === null || dispatcher === void 0 ? void 0 : dispatcher.setupHandlerForEmberEvent(actionState.eventName);\n    }\n    getTag(actionState) {\n      return actionState.tag;\n    }\n    getDestroyable(actionState) {\n      return actionState;\n    }\n  }\n  var ACTION_MODIFIER_MANAGER = new ActionModifierManager();\n  var actionModifier = (0, _manager2.setInternalModifierManager)(ACTION_MODIFIER_MANAGER, {});\n  var CAPABILITIES$2 = {\n    dynamicLayout: true,\n    dynamicTag: false,\n    prepareArgs: false,\n    createArgs: true,\n    attributeHook: false,\n    elementHook: false,\n    createCaller: true,\n    dynamicScope: true,\n    updateHook: true,\n    createInstance: true,\n    wrapped: false,\n    willDestroy: false,\n    hasSubOwner: true\n  };\n  class MountManager {\n    getDynamicLayout(state) {\n      var templateFactory$$1 = state.engine.lookup('template:application');\n      return (0, _util.unwrapTemplate)(templateFactory$$1(state.engine)).asLayout();\n    }\n    getCapabilities() {\n      return CAPABILITIES$2;\n    }\n    getOwner(state) {\n      return state.engine;\n    }\n    create(owner, _ref20, args, env) {\n      var {\n        name\n      } = _ref20;\n      // TODO\n      // mount is a runtime helper, this shouldn't use dynamic layout\n      // we should resolve the engine app template in the helper\n      // it also should use the owner that looked up the mount helper.\n      (true && !(owner instanceof _instance.default) && (0, _debug.assert)('Expected owner to be an EngineInstance', owner instanceof _instance.default));\n      var engine = owner.buildChildEngineInstance(name);\n      engine.boot();\n      var applicationFactory = engine.factoryFor(`controller:application`);\n      var controllerFactory = applicationFactory || (0, _internals3.generateControllerFactory)(engine, 'application');\n      var controller;\n      var self;\n      var bucket;\n      var modelRef;\n      if (args.named.has('model')) {\n        modelRef = args.named.get('model');\n      }\n      if (modelRef === undefined) {\n        controller = controllerFactory.create();\n        self = (0, _reference.createConstRef)(controller, 'this');\n        bucket = {\n          engine,\n          controller,\n          self,\n          modelRef\n        };\n      } else {\n        var model = (0, _reference.valueForRef)(modelRef);\n        controller = controllerFactory.create({\n          model\n        });\n        self = (0, _reference.createConstRef)(controller, 'this');\n        bucket = {\n          engine,\n          controller,\n          self,\n          modelRef\n        };\n      }\n      if (env.debugRenderTree) {\n        (0, _destroyable.associateDestroyableChild)(engine, controller);\n      }\n      return bucket;\n    }\n    getDebugName(_ref21) {\n      var {\n        name\n      } = _ref21;\n      return name;\n    }\n    getDebugCustomRenderTree(definition, state, args, templateModuleName) {\n      return [{\n        bucket: state.engine,\n        instance: state.engine,\n        type: 'engine',\n        name: definition.name,\n        args\n      }, {\n        bucket: state.controller,\n        instance: state.controller,\n        type: 'route-template',\n        name: 'application',\n        args,\n        template: templateModuleName\n      }];\n    }\n    getSelf(_ref22) {\n      var {\n        self\n      } = _ref22;\n      return self;\n    }\n    getDestroyable(bucket) {\n      return bucket.engine;\n    }\n    didCreate() {}\n    didUpdate() {}\n    didRenderLayout() {}\n    didUpdateLayout() {}\n    update(bucket) {\n      var {\n        controller,\n        modelRef\n      } = bucket;\n      if (modelRef !== undefined) {\n        controller.set('model', (0, _reference.valueForRef)(modelRef));\n      }\n    }\n  }\n  var MOUNT_MANAGER = new MountManager();\n  class MountDefinition {\n    constructor(resolvedName) {\n      this.resolvedName = resolvedName;\n      // handle is not used by this custom definition\n      this.handle = -1;\n      this.manager = MOUNT_MANAGER;\n      this.compilable = null;\n      this.capabilities = (0, _manager2.capabilityFlagsFrom)(CAPABILITIES$2);\n      this.state = {\n        name: resolvedName\n      };\n    }\n  }\n\n  /**\n    The `{{mount}}` helper lets you embed a routeless engine in a template.\n    Mounting an engine will cause an instance to be booted and its `application`\n    template to be rendered.\n  \n    For example, the following template mounts the `ember-chat` engine:\n  \n    ```handlebars\n    {{! application.hbs }}\n    {{mount \"ember-chat\"}}\n    ```\n  \n    Additionally, you can also pass in a `model` argument that will be\n    set as the engines model. This can be an existing object:\n  \n    ```\n    <div>\n      {{mount 'admin' model=userSettings}}\n    </div>\n    ```\n  \n    Or an inline `hash`, and you can even pass components:\n  \n    ```\n    <div>\n      <h1>Application template!</h1>\n      {{mount 'admin' model=(hash\n          title='Secret Admin'\n          signInButton=(component 'sign-in-button')\n      )}}\n    </div>\n    ```\n  \n    @method mount\n    @param {String} name Name of the engine to mount.\n    @param {Object} [model] Object that will be set as\n                            the model of the engine.\n    @for Ember.Templates.helpers\n    @public\n  */\n  var mountHelper = internalHelper((args, owner) => {\n    (true && !(owner) && (0, _debug.assert)('{{mount}} must be used within a component that has an owner', owner));\n    var nameRef = args.positional[0];\n    var captured;\n    (true && !(args.positional.length === 1) && (0, _debug.assert)('You can only pass a single positional argument to the {{mount}} helper, e.g. {{mount \"chat-engine\"}}.', args.positional.length === 1));\n    if (true /* DEBUG */ && args.named) {\n      var keys = Object.keys(args.named);\n      var extra = keys.filter(k => k !== 'model');\n      (true && !(extra.length === 0) && (0, _debug.assert)('You can only pass a `model` argument to the {{mount}} helper, ' + 'e.g. {{mount \"profile-engine\" model=this.profile}}. ' + `You passed ${extra.join(',')}.`, extra.length === 0));\n    }\n    captured = (0, _runtime.createCapturedArgs)(args.named, _runtime.EMPTY_POSITIONAL);\n    var lastName, lastDef;\n    return (0, _reference.createComputeRef)(() => {\n      var name = (0, _reference.valueForRef)(nameRef);\n      if (typeof name === 'string') {\n        if (lastName === name) {\n          return lastDef;\n        }\n        (true && !(owner.hasRegistration(`engine:${name}`)) && (0, _debug.assert)(`You used \\`{{mount '${name}'}}\\`, but the engine '${name}' can not be found.`, owner.hasRegistration(`engine:${name}`)));\n        lastName = name;\n        lastDef = (0, _runtime.curry)(0 /* CurriedType.Component */, new MountDefinition(name), owner, captured, true);\n        return lastDef;\n      } else {\n        (true && !(name === null || name === undefined) && (0, _debug.assert)(`Invalid engine name '${name}' specified, engine name must be either a string, null or undefined.`, name === null || name === undefined));\n        lastDef = null;\n        lastName = null;\n        return null;\n      }\n    });\n  });\n\n  /**\n    The `{{outlet}}` helper lets you specify where a child route will render in\n    your template. An important use of the `{{outlet}}` helper is in your\n    application's `application.hbs` file:\n  \n    ```app/templates/application.hbs\n    <MyHeader />\n  \n    <div class=\"my-dynamic-content\">\n      <!-- this content will change based on the current route, which depends on the current URL -->\n      {{outlet}}\n    </div>\n  \n    <MyFooter />\n    ```\n  \n    See the [routing guide](https://guides.emberjs.com/release/routing/rendering-a-template/) for more\n    information on how your `route` interacts with the `{{outlet}}` helper.\n    Note: Your content __will not render__ if there isn't an `{{outlet}}` for it.\n  \n    @method outlet\n    @for Ember.Templates.helpers\n    @public\n  */\n  var outletHelper = internalHelper((_args, owner, scope) => {\n    (true && !(owner) && (0, _debug.assert)('Expected owner to be present, {{outlet}} requires an owner', owner));\n    (true && !(scope) && (0, _debug.assert)('Expected dynamic scope to be present. You may have attempted to use the {{outlet}} keyword dynamically. This keyword cannot be used dynamically.', scope));\n    var outletRef = (0, _reference.createComputeRef)(() => {\n      var state = (0, _reference.valueForRef)(scope.get('outletState'));\n      var outlets = state !== undefined ? state.outlets : undefined;\n      return outlets !== undefined ? outlets['main'] : undefined;\n    });\n    var lastState = null;\n    var definition = null;\n    return (0, _reference.createComputeRef)(() => {\n      var _a, _b;\n      var outletState = (0, _reference.valueForRef)(outletRef);\n      var state = stateFor(outletRef, outletState);\n      if (!validate(state, lastState)) {\n        lastState = state;\n        if (state !== null) {\n          var named = (0, _util.dict)();\n          // Create a ref for the model\n          var modelRef = (0, _reference.childRefFromParts)(outletRef, ['render', 'model']);\n          // Store the value of the model\n          var model = (0, _reference.valueForRef)(modelRef);\n          // Create a compute ref which we pass in as the `{{@model}}` reference\n          // for the outlet. This ref will update and return the value of the\n          // model _until_ the outlet itself changes. Once the outlet changes,\n          // dynamic scope also changes, and so the original model ref would not\n          // provide the correct updated value. So we stop updating and return\n          // the _last_ model value for that outlet.\n          named['model'] = (0, _reference.createComputeRef)(() => {\n            if (lastState === state) {\n              model = (0, _reference.valueForRef)(modelRef);\n            }\n            return model;\n          });\n          if (true /* DEBUG */) {\n            named['model'] = (0, _reference.createDebugAliasRef)('@model', named['model']);\n          }\n          var args = (0, _runtime.createCapturedArgs)(named, _runtime.EMPTY_POSITIONAL);\n          definition = (0, _runtime.curry)(0 /* CurriedType.Component */, new OutletComponentDefinition(state), (_b = (_a = outletState === null || outletState === void 0 ? void 0 : outletState.render) === null || _a === void 0 ? void 0 : _a.owner) !== null && _b !== void 0 ? _b : owner, args, true);\n        } else {\n          definition = null;\n        }\n      }\n      return definition;\n    });\n  });\n  function stateFor(ref, outlet) {\n    if (outlet === undefined) return null;\n    var render = outlet.render;\n    if (render === undefined) return null;\n    var template = render.template;\n    if (template === undefined) return null;\n    // this guard can be removed once @ember/test-helpers@1.6.0 has \"aged out\"\n    // and is no longer considered supported\n    if (isTemplateFactory(template)) {\n      template = template(render.owner);\n    }\n    return {\n      ref,\n      name: render.name,\n      outlet: render.outlet,\n      template,\n      controller: render.controller,\n      model: render.model\n    };\n  }\n  function validate(state, lastState) {\n    if (state === null) {\n      return lastState === null;\n    }\n    if (lastState === null) {\n      return false;\n    }\n    return state.template === lastState.template && state.controller === lastState.controller;\n  }\n  function instrumentationPayload$1(name) {\n    return {\n      object: `component:${name}`\n    };\n  }\n  function componentFor(name, owner) {\n    var fullName = `component:${name}`;\n    return owner.factoryFor(fullName) || null;\n  }\n  function layoutFor(name, owner, options) {\n    var templateFullName = `template:components/${name}`;\n    return owner.lookup(templateFullName, options) || null;\n  }\n  function lookupComponentPair(owner, name, options) {\n    var component = componentFor(name, owner);\n    if ((0, _owner2.isFactory)(component) && component.class) {\n      var _layout = (0, _manager2.getComponentTemplate)(component.class);\n      if (_layout !== undefined) {\n        return {\n          component,\n          layout: _layout\n        };\n      }\n    }\n    var layout = layoutFor(name, owner, options);\n    if (component === null && layout === null) {\n      return null;\n    } else {\n      return {\n        component,\n        layout\n      };\n    }\n  }\n  var BUILTIN_KEYWORD_HELPERS = {\n    action: action$1,\n    mut,\n    readonly,\n    unbound,\n    '-hash': _runtime.hash,\n    '-each-in': eachIn,\n    '-normalize-class': normalizeClassHelper,\n    '-resolve': resolve,\n    '-track-array': trackArray,\n    '-mount': mountHelper,\n    '-outlet': outletHelper,\n    '-in-el-null': inElementNullCheckHelper\n  };\n  var BUILTIN_HELPERS = Object.assign(Object.assign({}, BUILTIN_KEYWORD_HELPERS), {\n    array: _runtime.array,\n    concat: _runtime.concat,\n    fn: _runtime.fn,\n    get: _runtime.get,\n    hash: _runtime.hash,\n    'unique-id': uniqueId\n  });\n  if (true /* DEBUG */) {\n    BUILTIN_HELPERS['-disallow-dynamic-resolution'] = disallowDynamicResolution;\n  } else {\n    // Bug: this may be a quirk of our test setup?\n    // In prod builds, this is a no-op helper and is unused in practice. We shouldn't need\n    // to add it at all, but the current test build doesn't produce a \"prod compiler\", so\n    // we ended up running the debug-build for the template compliler in prod tests. Once\n    // that is fixed, this can be removed. For now, this allows the test to work and does\n    // not really harm anything, since it's just a no-op pass-through helper and the bytes\n    // has to be included anyway. In the future, perhaps we can avoid the latter by using\n    // `import(...)`?\n    BUILTIN_HELPERS['-disallow-dynamic-resolution'] = disallowDynamicResolution;\n  }\n  var BUILTIN_KEYWORD_MODIFIERS = {\n    action: actionModifier\n  };\n  var BUILTIN_MODIFIERS = Object.assign(Object.assign({}, BUILTIN_KEYWORD_MODIFIERS), {\n    on: _runtime.on\n  });\n  var CLASSIC_HELPER_MANAGER_ASSOCIATED = new _util._WeakSet();\n  class ResolverImpl {\n    constructor() {\n      this.componentDefinitionCache = new Map();\n    }\n    lookupPartial() {\n      return null;\n    }\n    lookupHelper(name, owner) {\n      (true && !(!(BUILTIN_HELPERS[name] && owner.hasRegistration(`helper:${name}`))) && (0, _debug.assert)(`You attempted to overwrite the built-in helper \"${name}\" which is not allowed. Please rename the helper.`, !(BUILTIN_HELPERS[name] && owner.hasRegistration(`helper:${name}`))));\n      var helper$$1 = BUILTIN_HELPERS[name];\n      if (helper$$1 !== undefined) {\n        return helper$$1;\n      }\n      var factory = owner.factoryFor(`helper:${name}`);\n      if (factory === undefined) {\n        return null;\n      }\n      var definition = factory.class;\n      if (definition === undefined) {\n        return null;\n      }\n      if (typeof definition === 'function' && isClassicHelper(definition)) {\n        // For classic class based helpers, we need to pass the factoryFor result itself rather\n        // than the raw value (`factoryFor(...).class`). This is because injections are already\n        // bound in the factoryFor result, including type-based injections\n        if (true /* DEBUG */) {\n          // In DEBUG we need to only set the associated value once, otherwise\n          // we'll trigger an assertion\n          if (!CLASSIC_HELPER_MANAGER_ASSOCIATED.has(factory)) {\n            CLASSIC_HELPER_MANAGER_ASSOCIATED.add(factory);\n            (0, _manager2.setInternalHelperManager)(CLASSIC_HELPER_MANAGER, factory);\n          }\n        } else {\n          (0, _manager2.setInternalHelperManager)(CLASSIC_HELPER_MANAGER, factory);\n        }\n        return factory;\n      }\n      return definition;\n    }\n    lookupBuiltInHelper(name) {\n      var _a;\n      return (_a = BUILTIN_KEYWORD_HELPERS[name]) !== null && _a !== void 0 ? _a : null;\n    }\n    lookupModifier(name, owner) {\n      var builtin = BUILTIN_MODIFIERS[name];\n      if (builtin !== undefined) {\n        return builtin;\n      }\n      var modifier = owner.factoryFor(`modifier:${name}`);\n      if (modifier === undefined) {\n        return null;\n      }\n      return modifier.class || null;\n    }\n    lookupBuiltInModifier(name) {\n      var _a;\n      return (_a = BUILTIN_KEYWORD_MODIFIERS[name]) !== null && _a !== void 0 ? _a : null;\n    }\n    lookupComponent(name, owner) {\n      var pair = lookupComponentPair(owner, name);\n      if (pair === null) {\n        (true && !(name !== 'text-area') && (0, _debug.assert)('Could not find component `<TextArea />` (did you mean `<Textarea />`?)', name !== 'text-area'));\n        return null;\n      }\n      var template = null;\n      var key;\n      if (pair.component === null) {\n        key = template = pair.layout(owner);\n      } else {\n        key = pair.component;\n      }\n      var cachedComponentDefinition = this.componentDefinitionCache.get(key);\n      if (cachedComponentDefinition !== undefined) {\n        return cachedComponentDefinition;\n      }\n      if (template === null && pair.layout !== null) {\n        template = pair.layout(owner);\n      }\n      var finalizer = (0, _instrumentation._instrumentStart)('render.getComponentDefinition', instrumentationPayload$1, name);\n      var definition = null;\n      if (pair.component === null) {\n        if (_environment2.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS) {\n          definition = {\n            state: (0, _runtime.templateOnlyComponent)(undefined, name),\n            manager: _runtime.TEMPLATE_ONLY_COMPONENT_MANAGER,\n            template\n          };\n        } else {\n          var factory = owner.factoryFor((0, _container.privatize)`component:-default`);\n          var manager = (0, _manager2.getInternalComponentManager)(factory.class);\n          definition = {\n            state: factory,\n            manager,\n            template\n          };\n        }\n      } else {\n        var _factory2 = pair.component;\n        (true && !(_factory2.class !== undefined) && (0, _debug.assert)(`missing component class ${name}`, _factory2.class !== undefined));\n        var ComponentClass = _factory2.class;\n        var _manager = (0, _manager2.getInternalComponentManager)(ComponentClass);\n        definition = {\n          state: isCurlyManager(_manager) ? _factory2 : ComponentClass,\n          manager: _manager,\n          template\n        };\n      }\n      finalizer();\n      this.componentDefinitionCache.set(key, definition);\n      (true && !(!(definition === null && name === 'text-area')) && (0, _debug.assert)('Could not find component `<TextArea />` (did you mean `<Textarea />`?)', !(definition === null && name === 'text-area')));\n      return definition;\n    }\n  }\n\n  // We use the `InternalOwner` notion here because we actually need all of its\n  var TOP_LEVEL_NAME = '-top-level';\n  var TOP_LEVEL_OUTLET = 'main';\n  class OutletView {\n    static extend(injections) {\n      return class extends OutletView {\n        static create(options) {\n          if (options) {\n            return super.create(Object.assign({}, injections, options));\n          } else {\n            return super.create(injections);\n          }\n        }\n      };\n    }\n    static reopenClass(injections) {\n      Object.assign(this, injections);\n    }\n    static create(options) {\n      var {\n        environment: _environment,\n        application: namespace,\n        template: templateFactory$$1\n      } = options;\n      var owner = (0, _owner2.getOwner)(options);\n      (true && !(owner) && (0, _debug.assert)('OutletView is unexpectedly missing an owner', owner));\n      var template = templateFactory$$1(owner);\n      return new OutletView(_environment, owner, template, namespace);\n    }\n    constructor(_environment, owner, template, namespace) {\n      this._environment = _environment;\n      this.owner = owner;\n      this.template = template;\n      this.namespace = namespace;\n      var outletStateTag = (0, _validator.createTag)();\n      var outletState = {\n        outlets: {\n          main: undefined\n        },\n        render: {\n          owner: owner,\n          into: undefined,\n          outlet: TOP_LEVEL_OUTLET,\n          name: TOP_LEVEL_NAME,\n          controller: undefined,\n          model: undefined,\n          template\n        }\n      };\n      var ref = this.ref = (0, _reference.createComputeRef)(() => {\n        (0, _validator.consumeTag)(outletStateTag);\n        return outletState;\n      }, state => {\n        (0, _validator.dirtyTag)(outletStateTag);\n        outletState.outlets['main'] = state;\n      });\n      this.state = {\n        ref,\n        name: TOP_LEVEL_NAME,\n        outlet: TOP_LEVEL_OUTLET,\n        template,\n        controller: undefined,\n        model: undefined\n      };\n    }\n    appendTo(selector) {\n      var target;\n      if (this._environment.hasDOM) {\n        target = typeof selector === 'string' ? document.querySelector(selector) : selector;\n      } else {\n        target = selector;\n      }\n      var renderer = this.owner.lookup('renderer:-dom');\n      // SAFETY: It's not clear that this cast is safe.\n      // The types for appendOutletView may be incorrect or this is a potential bug.\n      (0, _runloop.schedule)('render', renderer, 'appendOutletView', this, target);\n    }\n    rerender() {\n      /**/\n    }\n    setOutletState(state) {\n      (0, _reference.updateRef)(this.ref, state);\n    }\n    destroy() {\n      /**/\n    }\n  }\n  _exports.OutletView = OutletView;\n  class DynamicScope {\n    constructor(view, outletState) {\n      this.view = view;\n      this.outletState = outletState;\n    }\n    child() {\n      return new DynamicScope(this.view, this.outletState);\n    }\n    get(key) {\n      (true && !(key === 'outletState') && (0, _debug.assert)(`Using \\`-get-dynamic-scope\\` is only supported for \\`outletState\\` (you used \\`${key}\\`).`, key === 'outletState'));\n      return this.outletState;\n    }\n    set(key, value) {\n      (true && !(key === 'outletState') && (0, _debug.assert)(`Using \\`-with-dynamic-scope\\` is only supported for \\`outletState\\` (you used \\`${key}\\`).`, key === 'outletState'));\n      this.outletState = value;\n      return value;\n    }\n  }\n  var NO_OP = () => {};\n  // This wrapper logic prevents us from rerendering in case of a hard failure\n  // during render. This prevents infinite revalidation type loops from occuring,\n  // and ensures that errors are not swallowed by subsequent follow on failures.\n  function errorLoopTransaction(fn$$1) {\n    if (true /* DEBUG */) {\n      return () => {\n        var didError = true;\n        try {\n          fn$$1();\n          didError = false;\n        } finally {\n          if (didError) {\n            // Noop the function so that we won't keep calling it and causing\n            // infinite looping failures;\n            fn$$1 = () => {\n              // eslint-disable-next-line no-console\n              console.warn('Attempted to rerender, but the Ember application has had an unrecoverable error occur during render. You should reload the application after fixing the cause of the error.');\n            };\n          }\n        }\n      };\n    } else {\n      return fn$$1;\n    }\n  }\n  class RootState {\n    constructor(root, runtime, context, owner, template, self, parentElement, dynamicScope, builder) {\n      this.root = root;\n      this.runtime = runtime;\n      (true && !(template !== undefined) && (0, _debug.assert)(`You cannot render \\`${(0, _reference.valueForRef)(self)}\\` without a template.`, template !== undefined));\n      this.id = root instanceof OutletView ? (0, _utils.guidFor)(root) : (0, _views.getViewId)(root);\n      this.result = undefined;\n      this.destroyed = false;\n      this.render = errorLoopTransaction(() => {\n        var layout = (0, _util.unwrapTemplate)(template).asLayout();\n        var iterator = (0, _runtime.renderMain)(runtime, context, owner, self, builder(runtime.env, {\n          element: parentElement,\n          nextSibling: null\n        }), layout, dynamicScope);\n        var result = this.result = iterator.sync();\n        // override .render function after initial render\n        this.render = errorLoopTransaction(() => result.rerender({\n          alwaysRevalidate: false\n        }));\n      });\n    }\n    isFor(possibleRoot) {\n      return this.root === possibleRoot;\n    }\n    destroy() {\n      var {\n        result,\n        runtime: {\n          env\n        }\n      } = this;\n      this.destroyed = true;\n      this.runtime = undefined;\n      this.root = null;\n      this.result = undefined;\n      this.render = undefined;\n      if (result !== undefined) {\n        /*\n         Handles these scenarios:\n                * When roots are removed during standard rendering process, a transaction exists already\n           `.begin()` / `.commit()` are not needed.\n         * When roots are being destroyed manually (`component.append(); component.destroy() case), no\n           transaction exists already.\n         * When roots are being destroyed during `Renderer#destroy`, no transaction exists\n                */\n        (0, _runtime.inTransaction)(env, () => (0, _destroyable.destroy)(result));\n      }\n    }\n  }\n  var renderers = [];\n  function _resetRenderers() {\n    renderers.length = 0;\n  }\n  function register(renderer) {\n    (true && !(renderers.indexOf(renderer) === -1) && (0, _debug.assert)('Cannot register the same renderer twice', renderers.indexOf(renderer) === -1));\n    renderers.push(renderer);\n  }\n  function deregister(renderer) {\n    var index = renderers.indexOf(renderer);\n    (true && !(index !== -1) && (0, _debug.assert)('Cannot deregister unknown unregistered renderer', index !== -1));\n    renderers.splice(index, 1);\n  }\n  function loopBegin() {\n    for (var renderer of renderers) {\n      renderer._scheduleRevalidate();\n    }\n  }\n  var renderSettledDeferred = null;\n  /*\n    Returns a promise which will resolve when rendering has settled. Settled in\n    this context is defined as when all of the tags in use are \"current\" (e.g.\n    `renderers.every(r => r._isValid())`). When this is checked at the _end_ of\n    the run loop, this essentially guarantees that all rendering is completed.\n  \n    @method renderSettled\n    @returns {Promise<void>} a promise which fulfills when rendering has settled\n  */\n  function renderSettled() {\n    if (renderSettledDeferred === null) {\n      renderSettledDeferred = _rsvp.default.defer();\n      // if there is no current runloop, the promise created above will not have\n      // a chance to resolve (because its resolved in backburner's \"end\" event)\n      if (!(0, _runloop._getCurrentRunLoop)()) {\n        // ensure a runloop has been kicked off\n        _runloop._backburner.schedule('actions', null, NO_OP);\n      }\n    }\n    return renderSettledDeferred.promise;\n  }\n  function resolveRenderPromise() {\n    if (renderSettledDeferred !== null) {\n      var _resolve = renderSettledDeferred.resolve;\n      renderSettledDeferred = null;\n      _runloop._backburner.join(null, _resolve);\n    }\n  }\n  var loops = 0;\n  function loopEnd() {\n    for (var renderer of renderers) {\n      if (!renderer._isValid()) {\n        if (loops > _environment2.ENV._RERENDER_LOOP_LIMIT) {\n          loops = 0;\n          // TODO: do something better\n          renderer.destroy();\n          throw new Error('infinite rendering invalidation detected');\n        }\n        loops++;\n        return _runloop._backburner.join(null, NO_OP);\n      }\n    }\n    loops = 0;\n    resolveRenderPromise();\n  }\n  _runloop._backburner.on('begin', loopBegin);\n  _runloop._backburner.on('end', loopEnd);\n  class Renderer {\n    static create(props) {\n      var {\n        _viewRegistry\n      } = props;\n      var owner = (0, _owner2.getOwner)(props);\n      (true && !(owner) && (0, _debug.assert)('Renderer is unexpectedly missing an owner', owner));\n      var document = owner.lookup('service:-document');\n      var env = owner.lookup('-environment:main');\n      var rootTemplate = owner.lookup((0, _container.privatize)`template:-root`);\n      var builder = owner.lookup('service:-dom-builder');\n      return new this(owner, document, env, rootTemplate, _viewRegistry, builder);\n    }\n    constructor(owner, document, env, rootTemplate, viewRegistry, builder) {\n      if (builder === void 0) {\n        builder = _runtime.clientBuilder;\n      }\n      this._inRenderTransaction = false;\n      this._lastRevision = -1;\n      this._destroyed = false;\n      this._owner = owner;\n      this._rootTemplate = rootTemplate(owner);\n      this._viewRegistry = viewRegistry || owner.lookup('-view-registry:main');\n      this._roots = [];\n      this._removedRoots = [];\n      this._builder = builder;\n      this._isInteractive = env.isInteractive;\n      // resolver is exposed for tests\n      var resolver = this._runtimeResolver = new ResolverImpl();\n      var sharedArtifacts = (0, _program.artifacts)();\n      this._context = (0, _opcodeCompiler.programCompilationContext)(sharedArtifacts, resolver);\n      var runtimeEnvironmentDelegate = new EmberEnvironmentDelegate(owner, env.isInteractive);\n      this._runtime = (0, _runtime.runtimeContext)({\n        appendOperations: env.hasDOM ? new _runtime.DOMTreeConstruction(document) : new _node.NodeDOMTreeConstruction(document),\n        updateOperations: new _runtime.DOMChanges(document)\n      }, runtimeEnvironmentDelegate, sharedArtifacts, resolver);\n    }\n    get debugRenderTree() {\n      var {\n        debugRenderTree\n      } = this._runtime.env;\n      (true && !(debugRenderTree) && (0, _debug.assert)('Attempted to access the DebugRenderTree, but it did not exist. Is the Ember Inspector open?', debugRenderTree));\n      return debugRenderTree;\n    }\n    // renderer HOOKS\n    appendOutletView(view, target) {\n      var definition = createRootOutlet(view);\n      this._appendDefinition(view, (0, _runtime.curry)(0 /* CurriedType.Component */, definition, view.owner, null, true), target);\n    }\n    appendTo(view, target) {\n      var definition = new RootComponentDefinition(view);\n      this._appendDefinition(view, (0, _runtime.curry)(0 /* CurriedType.Component */, definition, this._owner, null, true), target);\n    }\n    _appendDefinition(root, definition, target) {\n      var self = (0, _reference.createConstRef)(definition, 'this');\n      var dynamicScope = new DynamicScope(null, _reference.UNDEFINED_REFERENCE);\n      var rootState = new RootState(root, this._runtime, this._context, this._owner, this._rootTemplate, self, target, dynamicScope, this._builder);\n      this._renderRoot(rootState);\n    }\n    rerender() {\n      this._scheduleRevalidate();\n    }\n    register(view) {\n      var id = (0, _views.getViewId)(view);\n      (true && !(!this._viewRegistry[id]) && (0, _debug.assert)('Attempted to register a view with an id already in use: ' + id, !this._viewRegistry[id]));\n      this._viewRegistry[id] = view;\n    }\n    unregister(view) {\n      delete this._viewRegistry[(0, _views.getViewId)(view)];\n    }\n    remove(view) {\n      view._transitionTo('destroying');\n      this.cleanupRootFor(view);\n      if (this._isInteractive) {\n        view.trigger('didDestroyElement');\n      }\n    }\n    cleanupRootFor(view) {\n      // no need to cleanup roots if we have already been destroyed\n      if (this._destroyed) {\n        return;\n      }\n      var roots = this._roots;\n      // traverse in reverse so we can remove items\n      // without mucking up the index\n      var i = this._roots.length;\n      while (i--) {\n        var root = roots[i];\n        (true && !(root) && (0, _debug.assert)('has root', root));\n        if (root.isFor(view)) {\n          root.destroy();\n          roots.splice(i, 1);\n        }\n      }\n    }\n    destroy() {\n      if (this._destroyed) {\n        return;\n      }\n      this._destroyed = true;\n      this._clearAllRoots();\n    }\n    getElement(view) {\n      if (this._isInteractive) {\n        return (0, _views.getViewElement)(view);\n      } else {\n        throw new Error('Accessing `this.element` is not allowed in non-interactive environments (such as FastBoot).');\n      }\n    }\n    getBounds(view) {\n      var bounds = view[BOUNDS];\n      (true && !(bounds) && (0, _debug.assert)('object passed to getBounds must have the BOUNDS symbol as a property', bounds));\n      var parentElement = bounds.parentElement();\n      var firstNode = bounds.firstNode();\n      var lastNode = bounds.lastNode();\n      return {\n        parentElement,\n        firstNode,\n        lastNode\n      };\n    }\n    createElement(tagName) {\n      return this._runtime.env.getAppendOperations().createElement(tagName);\n    }\n    _renderRoot(root) {\n      var {\n        _roots: roots\n      } = this;\n      roots.push(root);\n      if (roots.length === 1) {\n        register(this);\n      }\n      this._renderRootsTransaction();\n    }\n    _renderRoots() {\n      var {\n        _roots: roots,\n        _runtime: runtime,\n        _removedRoots: removedRoots\n      } = this;\n      var initialRootsLength;\n      do {\n        initialRootsLength = roots.length;\n        (0, _runtime.inTransaction)(runtime.env, () => {\n          // ensure that for the first iteration of the loop\n          // each root is processed\n          for (var i = 0; i < roots.length; i++) {\n            var root = roots[i];\n            (true && !(root) && (0, _debug.assert)('has root', root));\n            if (root.destroyed) {\n              // add to the list of roots to be removed\n              // they will be removed from `this._roots` later\n              removedRoots.push(root);\n              // skip over roots that have been marked as destroyed\n              continue;\n            }\n            // when processing non-initial reflush loops,\n            // do not process more roots than needed\n            if (i >= initialRootsLength) {\n              continue;\n            }\n            root.render();\n          }\n          this._lastRevision = (0, _validator.valueForTag)(_validator.CURRENT_TAG);\n        });\n      } while (roots.length > initialRootsLength);\n      // remove any roots that were destroyed during this transaction\n      while (removedRoots.length) {\n        var root = removedRoots.pop();\n        var rootIndex = roots.indexOf(root);\n        roots.splice(rootIndex, 1);\n      }\n      if (this._roots.length === 0) {\n        deregister(this);\n      }\n    }\n    _renderRootsTransaction() {\n      if (this._inRenderTransaction) {\n        // currently rendering roots, a new root was added and will\n        // be processed by the existing _renderRoots invocation\n        return;\n      }\n      // used to prevent calling _renderRoots again (see above)\n      // while we are actively rendering roots\n      this._inRenderTransaction = true;\n      var completedWithoutError = false;\n      try {\n        this._renderRoots();\n        completedWithoutError = true;\n      } finally {\n        if (!completedWithoutError) {\n          this._lastRevision = (0, _validator.valueForTag)(_validator.CURRENT_TAG);\n        }\n        this._inRenderTransaction = false;\n      }\n    }\n    _clearAllRoots() {\n      var roots = this._roots;\n      for (var root of roots) {\n        root.destroy();\n      }\n      this._removedRoots.length = 0;\n      this._roots = [];\n      // if roots were present before destroying\n      // deregister this renderer instance\n      if (roots.length) {\n        deregister(this);\n      }\n    }\n    _scheduleRevalidate() {\n      _runloop._backburner.scheduleOnce('render', this, this._revalidate);\n    }\n    _isValid() {\n      return this._destroyed || this._roots.length === 0 || (0, _validator.validateTag)(_validator.CURRENT_TAG, this._lastRevision);\n    }\n    _revalidate() {\n      if (this._isValid()) {\n        return;\n      }\n      this._renderRootsTransaction();\n    }\n  }\n  _exports.Renderer = Renderer;\n  var TEMPLATES = {};\n  function setTemplates(templates) {\n    TEMPLATES = templates;\n  }\n  function getTemplates() {\n    return TEMPLATES;\n  }\n  function getTemplate(name) {\n    if (Object.prototype.hasOwnProperty.call(TEMPLATES, name)) {\n      return TEMPLATES[name];\n    }\n  }\n  function hasTemplate(name) {\n    return Object.prototype.hasOwnProperty.call(TEMPLATES, name);\n  }\n  function setTemplate(name, template) {\n    return TEMPLATES[name] = template;\n  }\n  var OutletTemplate = (0, _opcodeCompiler.templateFactory)({\n    \"id\": \"3jT+eJpe\",\n    \"block\": \"[[[46,[28,[37,1],null,null],null,null,null]],[],false,[\\\"component\\\",\\\"-outlet\\\"]]\",\n    \"moduleName\": \"packages/@ember/-internals/glimmer/lib/templates/outlet.hbs\",\n    \"isStrictMode\": false\n  });\n  function setupApplicationRegistry(registry) {\n    // because we are using injections we can't use instantiate false\n    // we need to use bind() to copy the function so factory for\n    // association won't leak\n    registry.register('service:-dom-builder', {\n      // Additionally, we *must* constrain this to require `props` on create, else\n      // we *know* it cannot have an owner.\n      create(props) {\n        var owner = (0, _owner2.getOwner)(props);\n        (true && !(owner) && (0, _debug.assert)('DomBuilderService is unexpectedly missing an owner', owner));\n        var env = owner.lookup('-environment:main');\n        switch (env._renderMode) {\n          case 'serialize':\n            return _node.serializeBuilder.bind(null);\n          case 'rehydrate':\n            return _runtime.rehydrationBuilder.bind(null);\n          default:\n            return _runtime.clientBuilder.bind(null);\n        }\n      }\n    });\n    registry.register((0, _container.privatize)`template:-root`, RootTemplate);\n    registry.register('renderer:-dom', Renderer);\n  }\n  function setupEngineRegistry(registry) {\n    registry.optionsForType('template', {\n      instantiate: false\n    });\n    registry.register('view:-outlet', OutletView);\n    registry.register('template:-outlet', OutletTemplate);\n    registry.optionsForType('helper', {\n      instantiate: false\n    });\n    registry.register('component:input', Input$1);\n    registry.register('component:link-to', LinkTo$1);\n    registry.register('component:textarea', Textarea$1);\n    if (!_environment2.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS) {\n      registry.register((0, _container.privatize)`component:-default`, Component);\n    }\n  }\n\n  /**\n     Associate a class with a component manager (an object that is responsible for\n     coordinating the lifecycle events that occurs when invoking, rendering and\n     re-rendering a component).\n  \n     @method setComponentManager\n     @param {Function} factory a function to create the owner for an object\n     @param {Object} obj the object to associate with the componetn manager\n     @return {Object} the same object passed in\n     @public\n    */\n  function setComponentManager$1(manager, obj) {\n    return (0, _manager2.setComponentManager)(manager, obj);\n  }\n  var componentCapabilities$1 = _manager2.componentCapabilities;\n  _exports.componentCapabilities = componentCapabilities$1;\n  var modifierCapabilities$1 = _manager2.modifierCapabilities;\n\n  /**\n    [Glimmer](https://github.com/tildeio/glimmer) is a templating engine used by Ember.js that is compatible with a subset of the [Handlebars](http://handlebarsjs.com/) syntax.\n  \n    ### Showing a property\n  \n    Templates manage the flow of an application's UI, and display state (through\n    the DOM) to a user. For example, given a component with the property \"name\",\n    that component's template can use the name in several ways:\n  \n    ```app/components/person-profile.js\n    import Component from '@ember/component';\n  \n    export default Component.extend({\n      name: 'Jill'\n    });\n    ```\n  \n    ```app/components/person-profile.hbs\n    {{this.name}}\n    <div>{{this.name}}</div>\n    <span data-name={{this.name}}></span>\n    ```\n  \n    Any time the \"name\" property on the component changes, the DOM will be\n    updated.\n  \n    Properties can be chained as well:\n  \n    ```handlebars\n    {{@aUserModel.name}}\n    <div>{{@listOfUsers.firstObject.name}}</div>\n    ```\n  \n    ### Using Ember helpers\n  \n    When content is passed in mustaches `{{}}`, Ember will first try to find a helper\n    or component with that name. For example, the `if` helper:\n  \n    ```app/components/person-profile.hbs\n    {{if this.name \"I have a name\" \"I have no name\"}}\n    <span data-has-name={{if this.name true}}></span>\n    ```\n  \n    The returned value is placed where the `{{}}` is called. The above style is\n    called \"inline\". A second style of helper usage is called \"block\". For example:\n  \n    ```handlebars\n    {{#if this.name}}\n      I have a name\n    {{else}}\n      I have no name\n    {{/if}}\n    ```\n  \n    The block form of helpers allows you to control how the UI is created based\n    on the values of properties.\n    A third form of helper is called \"nested\". For example here the concat\n    helper will add \" Doe\" to a displayed name if the person has no last name:\n  \n    ```handlebars\n    <span data-name={{concat this.firstName (\n      if this.lastName (concat \" \" this.lastName) \"Doe\"\n    )}}></span>\n    ```\n  \n    Ember's built-in helpers are described under the [Ember.Templates.helpers](/ember/release/classes/Ember.Templates.helpers)\n    namespace. Documentation on creating custom helpers can be found under\n    [helper](/ember/release/functions/@ember%2Fcomponent%2Fhelper/helper) (or\n    under [Helper](/ember/release/classes/Helper) if a helper requires access to\n    dependency injection).\n  \n    ### Invoking a Component\n  \n    Ember components represent state to the UI of an application. Further\n    reading on components can be found under [Component](/ember/release/classes/Component).\n  \n    @module @ember/component\n    @main @ember/component\n    @public\n   */\n  _exports.modifierCapabilities = modifierCapabilities$1;\n});","define(\"@ember/-internals/meta/index\", [\"exports\", \"@ember/-internals/meta/lib/meta\"], function (_exports, _meta) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"Meta\", {\n    enumerable: true,\n    get: function () {\n      return _meta.Meta;\n    }\n  });\n  Object.defineProperty(_exports, \"UNDEFINED\", {\n    enumerable: true,\n    get: function () {\n      return _meta.UNDEFINED;\n    }\n  });\n  Object.defineProperty(_exports, \"counters\", {\n    enumerable: true,\n    get: function () {\n      return _meta.counters;\n    }\n  });\n  Object.defineProperty(_exports, \"meta\", {\n    enumerable: true,\n    get: function () {\n      return _meta.meta;\n    }\n  });\n  Object.defineProperty(_exports, \"peekMeta\", {\n    enumerable: true,\n    get: function () {\n      return _meta.peekMeta;\n    }\n  });\n  Object.defineProperty(_exports, \"setMeta\", {\n    enumerable: true,\n    get: function () {\n      return _meta.setMeta;\n    }\n  });\n});","define(\"@ember/-internals/meta/lib/meta\", [\"exports\", \"@ember/-internals/utils\", \"@ember/debug\", \"@glimmer/destroyable\"], function (_exports, _utils, _debug, _destroyable) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.meta = _exports.counters = _exports.UNDEFINED = _exports.Meta = void 0;\n  _exports.peekMeta = peekMeta;\n  _exports.setMeta = setMeta;\n  var objectPrototype = Object.prototype;\n  var counters;\n  _exports.counters = counters;\n  if (true /* DEBUG */) {\n    _exports.counters = counters = {\n      peekCalls: 0,\n      peekPrototypeWalks: 0,\n      setCalls: 0,\n      deleteCalls: 0,\n      metaCalls: 0,\n      metaInstantiated: 0,\n      matchingListenersCalls: 0,\n      observerEventsCalls: 0,\n      addToListenersCalls: 0,\n      removeFromListenersCalls: 0,\n      removeAllListenersCalls: 0,\n      listenersInherited: 0,\n      listenersFlattened: 0,\n      parentListenersUsed: 0,\n      flattenedListenersCalls: 0,\n      reopensAfterFlatten: 0,\n      readableLazyChainsCalls: 0,\n      writableLazyChainsCalls: 0\n    };\n  }\n  /**\n  @module ember\n  */\n  var UNDEFINED = (0, _utils.symbol)('undefined');\n  _exports.UNDEFINED = UNDEFINED;\n  var currentListenerVersion = 1;\n  class Meta {\n    // DEBUG\n    /** @internal */\n    constructor(obj) {\n      /** @internal */\n      this._listenersVersion = 1;\n      /** @internal */\n      this._inheritedEnd = -1;\n      /** @internal */\n      this._flattenedVersion = 0;\n      if (true /* DEBUG */) {\n        counters.metaInstantiated++;\n      }\n      this._parent = undefined;\n      this._descriptors = undefined;\n      this._mixins = undefined;\n      this._lazyChains = undefined;\n      this._values = undefined;\n      this._revisions = undefined;\n      // initial value for all flags right now is false\n      // see FLAGS const for detailed list of flags used\n      this._isInit = false;\n      // used only internally\n      this.source = obj;\n      this.proto = obj.constructor === undefined ? undefined : obj.constructor.prototype;\n      this._listeners = undefined;\n    }\n    /** @internal */\n    get parent() {\n      var parent = this._parent;\n      if (parent === undefined) {\n        var proto = getPrototypeOf(this.source);\n        this._parent = parent = proto === null || proto === objectPrototype ? null : meta(proto);\n      }\n      return parent;\n    }\n    setInitializing() {\n      this._isInit = true;\n    }\n    /** @internal */\n    unsetInitializing() {\n      this._isInit = false;\n    }\n    /** @internal */\n    isInitializing() {\n      return this._isInit;\n    }\n    /** @internal */\n    isPrototypeMeta(obj) {\n      return this.proto === this.source && this.source === obj;\n    }\n    /** @internal */\n    _getOrCreateOwnMap(key) {\n      return this[key] || (this[key] = Object.create(null));\n    }\n    /** @internal */\n    _getOrCreateOwnSet(key) {\n      return this[key] || (this[key] = new Set());\n    }\n    /** @internal */\n    _findInheritedMap(key, subkey) {\n      var pointer = this;\n      while (pointer !== null) {\n        var map = pointer[key];\n        if (map !== undefined) {\n          var value = map.get(subkey);\n          if (value !== undefined) {\n            return value;\n          }\n        }\n        pointer = pointer.parent;\n      }\n    }\n    /** @internal */\n    _hasInInheritedSet(key, value) {\n      var pointer = this;\n      while (pointer !== null) {\n        var set = pointer[key];\n        if (set !== undefined && set.has(value)) {\n          return true;\n        }\n        pointer = pointer.parent;\n      }\n      return false;\n    }\n    /** @internal */\n    valueFor(key) {\n      var values = this._values;\n      return values !== undefined ? values[key] : undefined;\n    }\n    /** @internal */\n    setValueFor(key, value) {\n      var values = this._getOrCreateOwnMap('_values');\n      values[key] = value;\n    }\n    /** @internal */\n    revisionFor(key) {\n      var revisions = this._revisions;\n      return revisions !== undefined ? revisions[key] : undefined;\n    }\n    /** @internal */\n    setRevisionFor(key, revision) {\n      var revisions = this._getOrCreateOwnMap('_revisions');\n      revisions[key] = revision;\n    }\n    /** @internal */\n    writableLazyChainsFor(key) {\n      if (true /* DEBUG */) {\n        counters.writableLazyChainsCalls++;\n      }\n      var lazyChains = this._getOrCreateOwnMap('_lazyChains');\n      var chains = lazyChains[key];\n      if (chains === undefined) {\n        chains = lazyChains[key] = [];\n      }\n      return chains;\n    }\n    /** @internal */\n    readableLazyChainsFor(key) {\n      if (true /* DEBUG */) {\n        counters.readableLazyChainsCalls++;\n      }\n      var lazyChains = this._lazyChains;\n      if (lazyChains !== undefined) {\n        return lazyChains[key];\n      }\n      return undefined;\n    }\n    /** @internal */\n    addMixin(mixin) {\n      (true && !(!(0, _destroyable.isDestroyed)(this.source)) && (0, _debug.assert)((0, _destroyable.isDestroyed)(this.source) ? `Cannot add mixins of \\`${(0, _utils.toString)(mixin)}\\` on \\`${(0, _utils.toString)(this.source)}\\` call addMixin after it has been destroyed.` : '', !(0, _destroyable.isDestroyed)(this.source)));\n      var set = this._getOrCreateOwnSet('_mixins');\n      set.add(mixin);\n    }\n    /** @internal */\n    hasMixin(mixin) {\n      return this._hasInInheritedSet('_mixins', mixin);\n    }\n    /** @internal */\n    forEachMixins(fn) {\n      var pointer = this;\n      var seen;\n      while (pointer !== null) {\n        var set = pointer._mixins;\n        if (set !== undefined) {\n          seen = seen === undefined ? new Set() : seen;\n          // TODO cleanup typing here\n          set.forEach(mixin => {\n            if (!seen.has(mixin)) {\n              seen.add(mixin);\n              fn(mixin);\n            }\n          });\n        }\n        pointer = pointer.parent;\n      }\n    }\n    /** @internal */\n    writeDescriptors(subkey, value) {\n      (true && !(!(0, _destroyable.isDestroyed)(this.source)) && (0, _debug.assert)((0, _destroyable.isDestroyed)(this.source) ? `Cannot update descriptors for \\`${subkey}\\` on \\`${(0, _utils.toString)(this.source)}\\` after it has been destroyed.` : '', !(0, _destroyable.isDestroyed)(this.source)));\n      var map = this._descriptors || (this._descriptors = new Map());\n      map.set(subkey, value);\n    }\n    /** @internal */\n    peekDescriptors(subkey) {\n      var possibleDesc = this._findInheritedMap('_descriptors', subkey);\n      return possibleDesc === UNDEFINED ? undefined : possibleDesc;\n    }\n    /** @internal */\n    removeDescriptors(subkey) {\n      this.writeDescriptors(subkey, UNDEFINED);\n    }\n    /** @internal */\n    forEachDescriptors(fn) {\n      var pointer = this;\n      var seen;\n      while (pointer !== null) {\n        var map = pointer._descriptors;\n        if (map !== undefined) {\n          seen = seen === undefined ? new Set() : seen;\n          map.forEach((value, key) => {\n            if (!seen.has(key)) {\n              seen.add(key);\n              if (value !== UNDEFINED) {\n                fn(key, value);\n              }\n            }\n          });\n        }\n        pointer = pointer.parent;\n      }\n    }\n    /** @internal */\n    addToListeners(eventName, target, method, once, sync) {\n      if (true /* DEBUG */) {\n        counters.addToListenersCalls++;\n      }\n      this.pushListener(eventName, target, method, once ? 1 /* ListenerKind.ONCE */ : 0 /* ListenerKind.ADD */, sync);\n    }\n    /** @internal */\n    removeFromListeners(eventName, target, method) {\n      if (true /* DEBUG */) {\n        counters.removeFromListenersCalls++;\n      }\n      this.pushListener(eventName, target, method, 2 /* ListenerKind.REMOVE */);\n    }\n\n    pushListener(event, target, method, kind, sync) {\n      if (sync === void 0) {\n        sync = false;\n      }\n      var listeners = this.writableListeners();\n      var i = indexOfListener(listeners, event, target, method);\n      // remove if found listener was inherited\n      if (i !== -1 && i < this._inheritedEnd) {\n        listeners.splice(i, 1);\n        this._inheritedEnd--;\n        i = -1;\n      }\n      // if not found, push. Note that we must always push if a listener is not\n      // found, even in the case of a function listener remove, because we may be\n      // attempting to add or remove listeners _before_ flattening has occurred.\n      if (i === -1) {\n        (true && !(!(this.isPrototypeMeta(this.source) && typeof method === 'function')) && (0, _debug.assert)('You cannot add function listeners to prototypes. Convert the listener to a string listener, or add it to the instance instead.', !(this.isPrototypeMeta(this.source) && typeof method === 'function')));\n        (true && !(!(!this.isPrototypeMeta(this.source) && typeof method === 'function' && kind === 2 /* ListenerKind.REMOVE */)) && (0, _debug.assert)('You attempted to remove a function listener which did not exist on the instance, which means you may have attempted to remove it before it was added.', !(!this.isPrototypeMeta(this.source) && typeof method === 'function' && kind === 2)));\n        listeners.push({\n          event,\n          target,\n          method,\n          kind,\n          sync\n        });\n      } else {\n        var listener = listeners[i];\n        (true && !(listener) && (0, _debug.assert)('has listener', listener)); // If the listener is our own listener and we are trying to remove it, we\n        // want to splice it out entirely so we don't hold onto a reference.\n        if (kind === 2 /* ListenerKind.REMOVE */ && listener.kind !== 2 /* ListenerKind.REMOVE */) {\n          listeners.splice(i, 1);\n        } else {\n          (true && !(!(listener.kind === 0 /* ListenerKind.ADD */ && kind === 0 /* ListenerKind.ADD */ && listener.sync !== sync)) && (0, _debug.assert)(`You attempted to add an observer for the same method on '${event.split(':')[0]}' twice to ${target} as both sync and async. Observers must be either sync or async, they cannot be both. This is likely a mistake, you should either remove the code that added the observer a second time, or update it to always be sync or async. The method was ${String(method)}.`, !(listener.kind === 0 && kind === 0 && listener.sync !== sync))); // update own listener\n          listener.kind = kind;\n          listener.sync = sync;\n        }\n      }\n    }\n    writableListeners() {\n      // Check if we need to invalidate and reflatten. We need to do this if we\n      // have already flattened (flattened version is the current version) and\n      // we are either writing to a prototype meta OR we have never inherited, and\n      // may have cached the parent's listeners.\n      if (this._flattenedVersion === currentListenerVersion && (this.source === this.proto || this._inheritedEnd === -1)) {\n        if (true /* DEBUG */) {\n          counters.reopensAfterFlatten++;\n        }\n        currentListenerVersion++;\n      }\n      // Inherited end has not been set, then we have never created our own\n      // listeners, but may have cached the parent's\n      if (this._inheritedEnd === -1) {\n        this._inheritedEnd = 0;\n        this._listeners = [];\n      }\n      return this._listeners;\n    }\n    /**\n      Flattening is based on a global revision counter. If the revision has\n      bumped it means that somewhere in a class inheritance chain something has\n      changed, so we need to reflatten everything. This can only happen if:\n         1. A meta has been flattened (listener has been called)\n      2. The meta is a prototype meta with children who have inherited its\n         listeners\n      3. A new listener is subsequently added to the meta (e.g. via `.reopen()`)\n         This is a very rare occurrence, so while the counter is global it shouldn't\n      be updated very often in practice.\n    */\n    flattenedListeners() {\n      if (true /* DEBUG */) {\n        counters.flattenedListenersCalls++;\n      }\n      if (this._flattenedVersion < currentListenerVersion) {\n        if (true /* DEBUG */) {\n          counters.listenersFlattened++;\n        }\n        var parent = this.parent;\n        if (parent !== null) {\n          // compute\n          var parentListeners = parent.flattenedListeners();\n          if (parentListeners !== undefined) {\n            if (this._listeners === undefined) {\n              // If this instance doesn't have any of its own listeners (writableListeners\n              // has never been called) then we don't need to do any flattening, return\n              // the parent's listeners instead.\n              if (true /* DEBUG */) {\n                counters.parentListenersUsed++;\n              }\n              this._listeners = parentListeners;\n            } else {\n              var listeners = this._listeners;\n              if (this._inheritedEnd > 0) {\n                listeners.splice(0, this._inheritedEnd);\n                this._inheritedEnd = 0;\n              }\n              for (var listener of parentListeners) {\n                var index = indexOfListener(listeners, listener.event, listener.target, listener.method);\n                if (index === -1) {\n                  if (true /* DEBUG */) {\n                    counters.listenersInherited++;\n                  }\n                  listeners.unshift(listener);\n                  this._inheritedEnd++;\n                }\n              }\n            }\n          }\n        }\n        this._flattenedVersion = currentListenerVersion;\n      }\n      return this._listeners;\n    }\n    /** @internal */\n    matchingListeners(eventName) {\n      var listeners = this.flattenedListeners();\n      var result;\n      if (true /* DEBUG */) {\n        counters.matchingListenersCalls++;\n      }\n      if (listeners !== undefined) {\n        for (var listener of listeners) {\n          // REMOVE listeners are placeholders that tell us not to\n          // inherit, so they never match. Only ADD and ONCE can match.\n          if (listener.event === eventName && (listener.kind === 0 /* ListenerKind.ADD */ || listener.kind === 1 /* ListenerKind.ONCE */)) {\n            if (result === undefined) {\n              // we create this array only after we've found a listener that\n              // matches to avoid allocations when no matches are found.\n              result = [];\n            }\n            result.push(listener.target, listener.method, listener.kind === 1 /* ListenerKind.ONCE */);\n          }\n        }\n      }\n\n      return result;\n    }\n    /** @internal */\n    observerEvents() {\n      var listeners = this.flattenedListeners();\n      var result;\n      if (true /* DEBUG */) {\n        counters.observerEventsCalls++;\n      }\n      if (listeners !== undefined) {\n        for (var listener of listeners) {\n          // REMOVE listeners are placeholders that tell us not to\n          // inherit, so they never match. Only ADD and ONCE can match.\n          if ((listener.kind === 0 /* ListenerKind.ADD */ || listener.kind === 1 /* ListenerKind.ONCE */) && listener.event.indexOf(':change') !== -1) {\n            if (result === undefined) {\n              // we create this array only after we've found a listener that\n              // matches to avoid allocations when no matches are found.\n              result = [];\n            }\n            result.push(listener);\n          }\n        }\n      }\n      return result;\n    }\n  }\n  _exports.Meta = Meta;\n  var getPrototypeOf = Object.getPrototypeOf;\n  var metaStore = new WeakMap();\n  function setMeta(obj, meta) {\n    (true && !(obj !== null) && (0, _debug.assert)('Cannot call `setMeta` on null', obj !== null));\n    (true && !(obj !== undefined) && (0, _debug.assert)('Cannot call `setMeta` on undefined', obj !== undefined));\n    (true && !(typeof obj === 'object' || typeof obj === 'function') && (0, _debug.assert)(`Cannot call \\`setMeta\\` on ${typeof obj}`, typeof obj === 'object' || typeof obj === 'function'));\n    if (true /* DEBUG */) {\n      counters.setCalls++;\n    }\n    metaStore.set(obj, meta);\n  }\n  function peekMeta(obj) {\n    (true && !(obj !== null) && (0, _debug.assert)('Cannot call `peekMeta` on null', obj !== null));\n    (true && !(obj !== undefined) && (0, _debug.assert)('Cannot call `peekMeta` on undefined', obj !== undefined));\n    (true && !(typeof obj === 'object' || typeof obj === 'function') && (0, _debug.assert)(`Cannot call \\`peekMeta\\` on ${typeof obj}`, typeof obj === 'object' || typeof obj === 'function'));\n    if (true /* DEBUG */) {\n      counters.peekCalls++;\n    }\n    var meta = metaStore.get(obj);\n    if (meta !== undefined) {\n      return meta;\n    }\n    var pointer = getPrototypeOf(obj);\n    while (pointer !== null) {\n      if (true /* DEBUG */) {\n        counters.peekPrototypeWalks++;\n      }\n      meta = metaStore.get(pointer);\n      if (meta !== undefined) {\n        if (meta.proto !== pointer) {\n          // The meta was a prototype meta which was not marked as initializing.\n          // This can happen when a prototype chain was created manually via\n          // Object.create() and the source object does not have a constructor.\n          meta.proto = pointer;\n        }\n        return meta;\n      }\n      pointer = getPrototypeOf(pointer);\n    }\n    return null;\n  }\n  /**\n    Retrieves the meta hash for an object. If `writable` is true ensures the\n    hash is writable for this object as well.\n  \n    The meta object contains information about computed property descriptors as\n    well as any watched properties and other information. You generally will\n    not access this information directly but instead work with higher level\n    methods that manipulate this hash indirectly.\n  \n    @method meta\n    @for Ember\n    @private\n  \n    @param {Object} obj The object to retrieve meta for\n    @param {Boolean} [writable=true] Pass `false` if you do not intend to modify\n      the meta hash, allowing the method to avoid making an unnecessary copy.\n    @return {Object} the meta hash for an object\n  */\n  var meta = function meta(obj) {\n    (true && !(obj !== null) && (0, _debug.assert)('Cannot call `meta` on null', obj !== null));\n    (true && !(obj !== undefined) && (0, _debug.assert)('Cannot call `meta` on undefined', obj !== undefined));\n    (true && !(typeof obj === 'object' || typeof obj === 'function') && (0, _debug.assert)(`Cannot call \\`meta\\` on ${typeof obj}`, typeof obj === 'object' || typeof obj === 'function'));\n    if (true /* DEBUG */) {\n      counters.metaCalls++;\n    }\n    var maybeMeta = peekMeta(obj);\n    // remove this code, in-favor of explicit parent\n    if (maybeMeta !== null && maybeMeta.source === obj) {\n      return maybeMeta;\n    }\n    var newMeta = new Meta(obj);\n    setMeta(obj, newMeta);\n    return newMeta;\n  };\n  _exports.meta = meta;\n  if (true /* DEBUG */) {\n    meta._counters = counters;\n  }\n  function indexOfListener(listeners, event, target, method) {\n    for (var i = listeners.length - 1; i >= 0; i--) {\n      var listener = listeners[i];\n      (true && !(listener) && (0, _debug.assert)('has listener', listener));\n      if (listener.event === event && listener.target === target && listener.method === method) {\n        return i;\n      }\n    }\n    return -1;\n  }\n});","define(\"@ember/-internals/metal/index\", [\"exports\", \"@ember/-internals/meta\", \"@ember/-internals/utils\", \"@ember/debug\", \"@ember/-internals/environment\", \"@ember/runloop\", \"@glimmer/destroyable\", \"@glimmer/validator\", \"@glimmer/manager\", \"@glimmer/util\", \"@ember/array/-internals\", \"ember/version\", \"@ember/-internals/owner\"], function (_exports, _meta2, _utils, _debug, _environment, _runloop, _destroyable, _validator, _manager, _util, _internals, _version, _owner) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.TrackedDescriptor = _exports.SYNC_OBSERVERS = _exports.PROXY_CONTENT = _exports.PROPERTY_DID_CHANGE = _exports.NAMESPACES_BY_ID = _exports.NAMESPACES = _exports.Libraries = _exports.DEBUG_INJECTION_FUNCTIONS = _exports.ComputedProperty = _exports.ComputedDescriptor = _exports.ASYNC_OBSERVERS = void 0;\n  _exports._getPath = _getPath;\n  _exports._getProp = _getProp;\n  _exports._setProp = _setProp;\n  _exports.activateObserver = activateObserver;\n  _exports.addArrayObserver = addArrayObserver;\n  _exports.addListener = addListener;\n  _exports.addNamespace = addNamespace;\n  _exports.addObserver = addObserver;\n  _exports.alias = alias;\n  _exports.arrayContentDidChange = arrayContentDidChange;\n  _exports.arrayContentWillChange = arrayContentWillChange;\n  _exports.autoComputed = autoComputed;\n  _exports.beginPropertyChanges = beginPropertyChanges;\n  _exports.cached = void 0;\n  _exports.changeProperties = changeProperties;\n  _exports.computed = computed;\n  Object.defineProperty(_exports, \"createCache\", {\n    enumerable: true,\n    get: function () {\n      return _validator.createCache;\n    }\n  });\n  _exports.defineDecorator = defineDecorator;\n  _exports.defineProperty = defineProperty;\n  _exports.defineValue = defineValue;\n  _exports.deprecateProperty = deprecateProperty;\n  _exports.descriptorForDecorator = descriptorForDecorator;\n  _exports.descriptorForProperty = descriptorForProperty;\n  _exports.eachProxyArrayDidChange = eachProxyArrayDidChange;\n  _exports.eachProxyArrayWillChange = eachProxyArrayWillChange;\n  _exports.endPropertyChanges = endPropertyChanges;\n  _exports.expandProperties = expandProperties;\n  _exports.findNamespace = findNamespace;\n  _exports.findNamespaces = findNamespaces;\n  _exports.flushAsyncObservers = flushAsyncObservers;\n  _exports.get = get;\n  _exports.getCachedValueFor = getCachedValueFor;\n  _exports.getProperties = getProperties;\n  Object.defineProperty(_exports, \"getValue\", {\n    enumerable: true,\n    get: function () {\n      return _validator.getValue;\n    }\n  });\n  _exports.hasListeners = hasListeners;\n  _exports.hasUnknownProperty = hasUnknownProperty;\n  _exports.inject = inject;\n  _exports.isClassicDecorator = isClassicDecorator;\n  _exports.isComputed = isComputed;\n  Object.defineProperty(_exports, \"isConst\", {\n    enumerable: true,\n    get: function () {\n      return _validator.isConst;\n    }\n  });\n  _exports.isElementDescriptor = isElementDescriptor;\n  _exports.isNamespaceSearchDisabled = isSearchDisabled;\n  _exports.libraries = void 0;\n  _exports.makeComputedDecorator = makeComputedDecorator;\n  _exports.markObjectAsDirty = markObjectAsDirty;\n  _exports.nativeDescDecorator = nativeDescDecorator;\n  _exports.notifyPropertyChange = notifyPropertyChange;\n  _exports.objectAt = objectAt;\n  _exports.on = on;\n  _exports.processAllNamespaces = processAllNamespaces;\n  _exports.processNamespace = processNamespace;\n  _exports.removeArrayObserver = removeArrayObserver;\n  _exports.removeListener = removeListener;\n  _exports.removeNamespace = removeNamespace;\n  _exports.removeObserver = removeObserver;\n  _exports.replace = replace;\n  _exports.replaceInNativeArray = replaceInNativeArray;\n  _exports.revalidateObservers = revalidateObservers;\n  _exports.sendEvent = sendEvent;\n  _exports.set = set;\n  _exports.setClassicDecorator = setClassicDecorator;\n  _exports.setNamespaceSearchDisabled = setSearchDisabled;\n  _exports.setProperties = setProperties;\n  _exports.setUnprocessedMixins = setUnprocessedMixins;\n  _exports.tagForObject = tagForObject;\n  _exports.tagForProperty = tagForProperty;\n  _exports.tracked = tracked;\n  _exports.trySet = trySet;\n  /*\n    The event system uses a series of nested hashes to store listeners on an\n    object. When a listener is registered, or when an event arrives, these\n    hashes are consulted to determine which target and action pair to invoke.\n  \n    The hashes are stored in the object's meta hash, and look like this:\n  \n        // Object's meta hash\n        {\n          listeners: {       // variable name: `listenerSet`\n            \"foo:change\": [ // variable name: `actions`\n              target, method, once\n            ]\n          }\n        }\n  \n  */\n  /**\n    Add an event listener\n  \n    @method addListener\n    @static\n    @for @ember/object/events\n    @param obj\n    @param {String} eventName\n    @param {Object|Function} target A target object or a function\n    @param {Function|String} method A function or the name of a function to be called on `target`\n    @param {Boolean} once A flag whether a function should only be called once\n    @public\n  */\n  function addListener(obj, eventName, target, method, once, sync) {\n    if (sync === void 0) {\n      sync = true;\n    }\n    (true && !(Boolean(obj) && Boolean(eventName)) && (0, _debug.assert)('You must pass at least an object and event name to addListener', Boolean(obj) && Boolean(eventName)));\n    if (!method && 'function' === typeof target) {\n      method = target;\n      target = null;\n    }\n    (0, _meta2.meta)(obj).addToListeners(eventName, target, method, once === true, sync);\n  }\n  /**\n    Remove an event listener\n  \n    Arguments should match those passed to `addListener`.\n  \n    @method removeListener\n    @static\n    @for @ember/object/events\n    @param obj\n    @param {String} eventName\n    @param {Object|Function} target A target object or a function\n    @param {Function|String} method A function or the name of a function to be called on `target`\n    @public\n  */\n  function removeListener(obj, eventName, targetOrFunction, functionOrName) {\n    (true && !(Boolean(obj) && Boolean(eventName) && (typeof targetOrFunction === 'function' || typeof targetOrFunction === 'object' && Boolean(functionOrName))) && (0, _debug.assert)('You must pass at least an object, event name, and method or target and method/method name to removeListener', Boolean(obj) && Boolean(eventName) && (typeof targetOrFunction === 'function' || typeof targetOrFunction === 'object' && Boolean(functionOrName))));\n    var target, method;\n    if (typeof targetOrFunction === 'object') {\n      target = targetOrFunction;\n      method = functionOrName;\n    } else {\n      target = null;\n      method = targetOrFunction;\n    }\n    var m = (0, _meta2.meta)(obj);\n    m.removeFromListeners(eventName, target, method);\n  }\n  /**\n    Send an event. The execution of suspended listeners\n    is skipped, and once listeners are removed. A listener without\n    a target is executed on the passed object. If an array of actions\n    is not passed, the actions stored on the passed object are invoked.\n  \n    @method sendEvent\n    @static\n    @for @ember/object/events\n    @param obj\n    @param {String} eventName\n    @param {Array} params Optional parameters for each listener.\n    @return {Boolean} if the event was delivered to one or more actions\n    @public\n  */\n  function sendEvent(obj, eventName, params, actions, _meta) {\n    if (actions === undefined) {\n      var meta$$1 = _meta === undefined ? (0, _meta2.peekMeta)(obj) : _meta;\n      actions = meta$$1 !== null ? meta$$1.matchingListeners(eventName) : undefined;\n    }\n    if (actions === undefined || actions.length === 0) {\n      return false;\n    }\n    for (var i = actions.length - 3; i >= 0; i -= 3) {\n      // looping in reverse for once listeners\n      var target = actions[i];\n      var method = actions[i + 1];\n      var once = actions[i + 2];\n      if (!method) {\n        continue;\n      }\n      if (once) {\n        removeListener(obj, eventName, target, method);\n      }\n      if (!target) {\n        target = obj;\n      }\n      var type = typeof method;\n      if (type === 'string' || type === 'symbol') {\n        method = target[method];\n      }\n      method.apply(target, params);\n    }\n    return true;\n  }\n  /**\n    @public\n    @method hasListeners\n    @static\n    @for @ember/object/events\n    @param obj\n    @param {String} eventName\n    @return {Boolean} if `obj` has listeners for event `eventName`\n  */\n  function hasListeners(obj, eventName) {\n    var meta$$1 = (0, _meta2.peekMeta)(obj);\n    if (meta$$1 === null) {\n      return false;\n    }\n    var matched = meta$$1.matchingListeners(eventName);\n    return matched !== undefined && matched.length > 0;\n  }\n  /**\n    Define a property as a function that should be executed when\n    a specified event or events are triggered.\n  \n    ``` javascript\n    import EmberObject from '@ember/object';\n    import { on } from '@ember/object/evented';\n    import { sendEvent } from '@ember/object/events';\n  \n    let Job = EmberObject.extend({\n      logCompleted: on('completed', function() {\n        console.log('Job completed!');\n      })\n    });\n  \n    let job = Job.create();\n  \n    sendEvent(job, 'completed'); // Logs 'Job completed!'\n   ```\n  \n    @method on\n    @static\n    @for @ember/object/evented\n    @param {String} eventNames*\n    @param {Function} func\n    @return {Function} the listener function, passed as last argument to on(...)\n    @public\n  */\n  function on() {\n    for (var _len = arguments.length, args = new Array(_len), _key2 = 0; _key2 < _len; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n    var func = args.pop();\n    var events = args;\n    (true && !(typeof func === 'function') && (0, _debug.assert)('on expects function as last argument', typeof func === 'function'));\n    (true && !(events.length > 0 && events.every(p => typeof p === 'string' && p.length > 0)) && (0, _debug.assert)('on called without valid event names', events.length > 0 && events.every(p => typeof p === 'string' && p.length > 0)));\n    (0, _utils.setListeners)(func, events);\n    return func;\n  }\n  var AFTER_OBSERVERS = ':change';\n  function changeEvent(keyName) {\n    return keyName + AFTER_OBSERVERS;\n  }\n  var SYNC_DEFAULT = !_environment.ENV._DEFAULT_ASYNC_OBSERVERS;\n  var SYNC_OBSERVERS = new Map();\n  _exports.SYNC_OBSERVERS = SYNC_OBSERVERS;\n  var ASYNC_OBSERVERS = new Map();\n  /**\n  @module @ember/object\n  */\n  /**\n    @method addObserver\n    @static\n    @for @ember/object/observers\n    @param obj\n    @param {String} path\n    @param {Object|Function} target\n    @param {Function|String} [method]\n    @public\n  */\n  _exports.ASYNC_OBSERVERS = ASYNC_OBSERVERS;\n  function addObserver(obj, path, target, method, sync) {\n    if (sync === void 0) {\n      sync = SYNC_DEFAULT;\n    }\n    var eventName = changeEvent(path);\n    addListener(obj, eventName, target, method, false, sync);\n    var meta$$1 = (0, _meta2.peekMeta)(obj);\n    if (meta$$1 === null || !(meta$$1.isPrototypeMeta(obj) || meta$$1.isInitializing())) {\n      activateObserver(obj, eventName, sync);\n    }\n  }\n  /**\n    @method removeObserver\n    @static\n    @for @ember/object/observers\n    @param obj\n    @param {String} path\n    @param {Object|Function} target\n    @param {Function|String} [method]\n    @public\n  */\n  function removeObserver(obj, path, target, method, sync) {\n    if (sync === void 0) {\n      sync = SYNC_DEFAULT;\n    }\n    var eventName = changeEvent(path);\n    var meta$$1 = (0, _meta2.peekMeta)(obj);\n    if (meta$$1 === null || !(meta$$1.isPrototypeMeta(obj) || meta$$1.isInitializing())) {\n      deactivateObserver(obj, eventName, sync);\n    }\n    removeListener(obj, eventName, target, method);\n  }\n  function getOrCreateActiveObserversFor(target, sync) {\n    var observerMap = sync === true ? SYNC_OBSERVERS : ASYNC_OBSERVERS;\n    if (!observerMap.has(target)) {\n      observerMap.set(target, new Map());\n      (0, _destroyable.registerDestructor)(target, () => destroyObservers(target), true);\n    }\n    return observerMap.get(target);\n  }\n  function activateObserver(target, eventName, sync) {\n    if (sync === void 0) {\n      sync = false;\n    }\n    var activeObservers = getOrCreateActiveObserversFor(target, sync);\n    if (activeObservers.has(eventName)) {\n      activeObservers.get(eventName).count++;\n    } else {\n      var path = eventName.substring(0, eventName.lastIndexOf(':'));\n      var tag = getChainTagsForKey(target, path, (0, _validator.tagMetaFor)(target), (0, _meta2.peekMeta)(target));\n      activeObservers.set(eventName, {\n        count: 1,\n        path,\n        tag,\n        lastRevision: (0, _validator.valueForTag)(tag),\n        suspended: false\n      });\n    }\n  }\n  var DEACTIVATE_SUSPENDED = false;\n  var SCHEDULED_DEACTIVATE = [];\n  function deactivateObserver(target, eventName, sync) {\n    if (sync === void 0) {\n      sync = false;\n    }\n    if (DEACTIVATE_SUSPENDED === true) {\n      SCHEDULED_DEACTIVATE.push([target, eventName, sync]);\n      return;\n    }\n    var observerMap = sync === true ? SYNC_OBSERVERS : ASYNC_OBSERVERS;\n    var activeObservers = observerMap.get(target);\n    if (activeObservers !== undefined) {\n      var observer = activeObservers.get(eventName);\n      observer.count--;\n      if (observer.count === 0) {\n        activeObservers.delete(eventName);\n        if (activeObservers.size === 0) {\n          observerMap.delete(target);\n        }\n      }\n    }\n  }\n  function suspendedObserverDeactivation() {\n    DEACTIVATE_SUSPENDED = true;\n  }\n  function resumeObserverDeactivation() {\n    DEACTIVATE_SUSPENDED = false;\n    for (var [target, eventName, sync] of SCHEDULED_DEACTIVATE) {\n      deactivateObserver(target, eventName, sync);\n    }\n    SCHEDULED_DEACTIVATE = [];\n  }\n  /**\n   * Primarily used for cases where we are redefining a class, e.g. mixins/reopen\n   * being applied later. Revalidates all the observers, resetting their tags.\n   *\n   * @private\n   * @param target\n   */\n  function revalidateObservers(target) {\n    if (ASYNC_OBSERVERS.has(target)) {\n      ASYNC_OBSERVERS.get(target).forEach(observer => {\n        observer.tag = getChainTagsForKey(target, observer.path, (0, _validator.tagMetaFor)(target), (0, _meta2.peekMeta)(target));\n        observer.lastRevision = (0, _validator.valueForTag)(observer.tag);\n      });\n    }\n    if (SYNC_OBSERVERS.has(target)) {\n      SYNC_OBSERVERS.get(target).forEach(observer => {\n        observer.tag = getChainTagsForKey(target, observer.path, (0, _validator.tagMetaFor)(target), (0, _meta2.peekMeta)(target));\n        observer.lastRevision = (0, _validator.valueForTag)(observer.tag);\n      });\n    }\n  }\n  var lastKnownRevision = 0;\n  function flushAsyncObservers(shouldSchedule) {\n    if (shouldSchedule === void 0) {\n      shouldSchedule = true;\n    }\n    var currentRevision = (0, _validator.valueForTag)(_validator.CURRENT_TAG);\n    if (lastKnownRevision === currentRevision) {\n      return;\n    }\n    lastKnownRevision = currentRevision;\n    ASYNC_OBSERVERS.forEach((activeObservers, target) => {\n      var meta$$1 = (0, _meta2.peekMeta)(target);\n      activeObservers.forEach((observer, eventName) => {\n        if (!(0, _validator.validateTag)(observer.tag, observer.lastRevision)) {\n          var sendObserver = () => {\n            try {\n              sendEvent(target, eventName, [target, observer.path], undefined, meta$$1);\n            } finally {\n              observer.tag = getChainTagsForKey(target, observer.path, (0, _validator.tagMetaFor)(target), (0, _meta2.peekMeta)(target));\n              observer.lastRevision = (0, _validator.valueForTag)(observer.tag);\n            }\n          };\n          if (shouldSchedule) {\n            (0, _runloop.schedule)('actions', sendObserver);\n          } else {\n            sendObserver();\n          }\n        }\n      });\n    });\n  }\n  function flushSyncObservers() {\n    // When flushing synchronous observers, we know that something has changed (we\n    // only do this during a notifyPropertyChange), so there's no reason to check\n    // a global revision.\n    SYNC_OBSERVERS.forEach((activeObservers, target) => {\n      var meta$$1 = (0, _meta2.peekMeta)(target);\n      activeObservers.forEach((observer, eventName) => {\n        if (!observer.suspended && !(0, _validator.validateTag)(observer.tag, observer.lastRevision)) {\n          try {\n            observer.suspended = true;\n            sendEvent(target, eventName, [target, observer.path], undefined, meta$$1);\n          } finally {\n            observer.tag = getChainTagsForKey(target, observer.path, (0, _validator.tagMetaFor)(target), (0, _meta2.peekMeta)(target));\n            observer.lastRevision = (0, _validator.valueForTag)(observer.tag);\n            observer.suspended = false;\n          }\n        }\n      });\n    });\n  }\n  function setObserverSuspended(target, property, suspended) {\n    var activeObservers = SYNC_OBSERVERS.get(target);\n    if (!activeObservers) {\n      return;\n    }\n    var observer = activeObservers.get(changeEvent(property));\n    if (observer) {\n      observer.suspended = suspended;\n    }\n  }\n  function destroyObservers(target) {\n    if (SYNC_OBSERVERS.size > 0) SYNC_OBSERVERS.delete(target);\n    if (ASYNC_OBSERVERS.size > 0) ASYNC_OBSERVERS.delete(target);\n  }\n\n  // This is exported for `@tracked`, but should otherwise be avoided. Use `tagForObject`.\n  var SELF_TAG = (0, _utils.symbol)('SELF_TAG');\n  function tagForProperty(obj, propertyKey, addMandatorySetter, meta$$1) {\n    if (addMandatorySetter === void 0) {\n      addMandatorySetter = false;\n    }\n    var customTagFor = (0, _manager.getCustomTagFor)(obj);\n    if (customTagFor !== undefined) {\n      return customTagFor(obj, propertyKey, addMandatorySetter);\n    }\n    var tag = (0, _validator.tagFor)(obj, propertyKey, meta$$1);\n    if (true /* DEBUG */ && addMandatorySetter) {\n      (0, _utils.setupMandatorySetter)(tag, obj, propertyKey);\n    }\n    return tag;\n  }\n  function tagForObject(obj) {\n    if ((0, _utils.isObject)(obj)) {\n      if (true /* DEBUG */) {\n        (true && !(!(0, _destroyable.isDestroyed)(obj)) && (0, _debug.assert)((0, _destroyable.isDestroyed)(obj) ? `Cannot create a new tag for \\`${(0, _utils.toString)(obj)}\\` after it has been destroyed.` : '', !(0, _destroyable.isDestroyed)(obj)));\n      }\n      return (0, _validator.tagFor)(obj, SELF_TAG);\n    }\n    return _validator.CONSTANT_TAG;\n  }\n  function markObjectAsDirty(obj, propertyKey) {\n    (0, _validator.dirtyTagFor)(obj, propertyKey);\n    (0, _validator.dirtyTagFor)(obj, SELF_TAG);\n  }\n\n  /**\n   @module ember\n   @private\n   */\n  var PROPERTY_DID_CHANGE = Symbol('PROPERTY_DID_CHANGE');\n  _exports.PROPERTY_DID_CHANGE = PROPERTY_DID_CHANGE;\n  function hasPropertyDidChange(obj) {\n    return obj != null && typeof obj === 'object' && typeof obj[PROPERTY_DID_CHANGE] === 'function';\n  }\n  var deferred = 0;\n  /**\n    This function is called just after an object property has changed.\n    It will notify any observers and clear caches among other things.\n  \n    Normally you will not need to call this method directly but if for some\n    reason you can't directly watch a property you can invoke this method\n    manually.\n  \n    @method notifyPropertyChange\n    @for @ember/object\n    @param {Object} obj The object with the property that will change\n    @param {String} keyName The property key (or path) that will change.\n    @param {Meta} [_meta] The objects meta.\n    @param {unknown} [value] The new value to set for the property\n    @return {void}\n    @since 3.1.0\n    @public\n  */\n  function notifyPropertyChange(obj, keyName, _meta, value) {\n    var meta$$1 = _meta === undefined ? (0, _meta2.peekMeta)(obj) : _meta;\n    if (meta$$1 !== null && (meta$$1.isInitializing() || meta$$1.isPrototypeMeta(obj))) {\n      return;\n    }\n    markObjectAsDirty(obj, keyName);\n    if (deferred <= 0) {\n      flushSyncObservers();\n    }\n    if (PROPERTY_DID_CHANGE in obj) {\n      // It's redundant to do this here, but we don't want to check above so we can avoid an extra function call in prod.\n      (true && !(hasPropertyDidChange(obj)) && (0, _debug.assert)('property did change hook is invalid', hasPropertyDidChange(obj))); // we need to check the arguments length here; there's a check in Component's `PROPERTY_DID_CHANGE`\n      // that checks its arguments length, so we have to explicitly not call this with `value`\n      // if it is not passed to `notifyPropertyChange`\n      if (arguments.length === 4) {\n        obj[PROPERTY_DID_CHANGE](keyName, value);\n      } else {\n        obj[PROPERTY_DID_CHANGE](keyName);\n      }\n    }\n  }\n  /**\n    @method beginPropertyChanges\n    @chainable\n    @private\n  */\n  function beginPropertyChanges() {\n    deferred++;\n    suspendedObserverDeactivation();\n  }\n  /**\n    @method endPropertyChanges\n    @private\n  */\n  function endPropertyChanges() {\n    deferred--;\n    if (deferred <= 0) {\n      flushSyncObservers();\n      resumeObserverDeactivation();\n    }\n  }\n  /**\n    Make a series of property changes together in an\n    exception-safe way.\n  \n    ```javascript\n    Ember.changeProperties(function() {\n      obj1.set('foo', mayBlowUpWhenSet);\n      obj2.set('bar', baz);\n    });\n    ```\n  \n    @method changeProperties\n    @param {Function} callback\n    @private\n  */\n  function changeProperties(callback) {\n    beginPropertyChanges();\n    try {\n      callback();\n    } finally {\n      endPropertyChanges();\n    }\n  }\n  function arrayContentWillChange(array, startIdx, removeAmt, addAmt) {\n    // if no args are passed assume everything changes\n    if (startIdx === undefined) {\n      startIdx = 0;\n      removeAmt = addAmt = -1;\n    } else {\n      if (removeAmt === undefined) {\n        removeAmt = -1;\n      }\n      if (addAmt === undefined) {\n        addAmt = -1;\n      }\n    }\n    sendEvent(array, '@array:before', [array, startIdx, removeAmt, addAmt]);\n    return array;\n  }\n  function arrayContentDidChange(array, startIdx, removeAmt, addAmt, notify) {\n    if (notify === void 0) {\n      notify = true;\n    }\n    // if no args are passed assume everything changes\n    if (startIdx === undefined) {\n      startIdx = 0;\n      removeAmt = addAmt = -1;\n    } else {\n      if (removeAmt === undefined) {\n        removeAmt = -1;\n      }\n      if (addAmt === undefined) {\n        addAmt = -1;\n      }\n    }\n    var meta$$1 = (0, _meta2.peekMeta)(array);\n    if (notify) {\n      if (addAmt < 0 || removeAmt < 0 || addAmt - removeAmt !== 0) {\n        notifyPropertyChange(array, 'length', meta$$1);\n      }\n      notifyPropertyChange(array, '[]', meta$$1);\n    }\n    sendEvent(array, '@array:change', [array, startIdx, removeAmt, addAmt]);\n    if (meta$$1 !== null) {\n      var length = array.length;\n      var addedAmount = addAmt === -1 ? 0 : addAmt;\n      var removedAmount = removeAmt === -1 ? 0 : removeAmt;\n      var delta = addedAmount - removedAmount;\n      var previousLength = length - delta;\n      var normalStartIdx = startIdx < 0 ? previousLength + startIdx : startIdx;\n      if (meta$$1.revisionFor('firstObject') !== undefined && normalStartIdx === 0) {\n        notifyPropertyChange(array, 'firstObject', meta$$1);\n      }\n      if (meta$$1.revisionFor('lastObject') !== undefined) {\n        var previousLastIndex = previousLength - 1;\n        var lastAffectedIndex = normalStartIdx + removedAmount;\n        if (previousLastIndex < lastAffectedIndex) {\n          notifyPropertyChange(array, 'lastObject', meta$$1);\n        }\n      }\n    }\n    return array;\n  }\n  var EMPTY_ARRAY = Object.freeze([]);\n  function objectAt(array, index) {\n    if (Array.isArray(array)) {\n      return array[index];\n    } else {\n      return array.objectAt(index);\n    }\n  }\n  // Ideally, we'd use MutableArray.detect but for unknown reasons this causes\n  // the node tests to fail strangely.\n  function isMutableArray(obj) {\n    return obj != null && typeof obj.replace === 'function';\n  }\n  function replace(array, start, deleteCount, items) {\n    if (items === void 0) {\n      items = EMPTY_ARRAY;\n    }\n    if (isMutableArray(array)) {\n      array.replace(start, deleteCount, items);\n    } else {\n      (true && !(Array.isArray(array)) && (0, _debug.assert)('Can only replace content of a native array or MutableArray', Array.isArray(array)));\n      replaceInNativeArray(array, start, deleteCount, items);\n    }\n  }\n  var CHUNK_SIZE = 60000;\n  // To avoid overflowing the stack, we splice up to CHUNK_SIZE items at a time.\n  // See https://code.google.com/p/chromium/issues/detail?id=56588 for more details.\n  function replaceInNativeArray(array, start, deleteCount, items) {\n    arrayContentWillChange(array, start, deleteCount, items.length);\n    if (items.length <= CHUNK_SIZE) {\n      array.splice(start, deleteCount, ...items);\n    } else {\n      array.splice(start, deleteCount);\n      for (var i = 0; i < items.length; i += CHUNK_SIZE) {\n        var chunk = items.slice(i, i + CHUNK_SIZE);\n        array.splice(start + i, 0, ...chunk);\n      }\n    }\n    arrayContentDidChange(array, start, deleteCount, items.length);\n  }\n  function arrayObserversHelper(obj, target, opts, operation) {\n    var _a;\n    var {\n      willChange,\n      didChange\n    } = opts;\n    operation(obj, '@array:before', target, willChange);\n    operation(obj, '@array:change', target, didChange);\n    /*\n     * Array proxies have a `_revalidate` method which must be called to set\n     * up their internal array observation systems.\n     */\n    (_a = obj._revalidate) === null || _a === void 0 ? void 0 : _a.call(obj);\n    return obj;\n  }\n  function addArrayObserver(array, target, opts) {\n    return arrayObserversHelper(array, target, opts, addListener);\n  }\n  function removeArrayObserver(array, target, opts) {\n    return arrayObserversHelper(array, target, opts, removeListener);\n  }\n  var CHAIN_PASS_THROUGH = new _util._WeakSet();\n  function finishLazyChains(meta$$1, key, value) {\n    var lazyTags = meta$$1.readableLazyChainsFor(key);\n    if (lazyTags === undefined) {\n      return;\n    }\n    if ((0, _utils.isObject)(value)) {\n      for (var [tag, deps] of lazyTags) {\n        (0, _validator.updateTag)(tag, getChainTagsForKey(value, deps, (0, _validator.tagMetaFor)(value), (0, _meta2.peekMeta)(value)));\n      }\n    }\n    lazyTags.length = 0;\n  }\n  function getChainTagsForKeys(obj, keys, tagMeta, meta$$1) {\n    var tags = [];\n    for (var key of keys) {\n      getChainTags(tags, obj, key, tagMeta, meta$$1);\n    }\n    return (0, _validator.combine)(tags);\n  }\n  function getChainTagsForKey(obj, key, tagMeta, meta$$1) {\n    return (0, _validator.combine)(getChainTags([], obj, key, tagMeta, meta$$1));\n  }\n  function getChainTags(chainTags, obj, path, tagMeta, meta$$1) {\n    var current = obj;\n    var currentTagMeta = tagMeta;\n    var currentMeta = meta$$1;\n    var pathLength = path.length;\n    var segmentEnd = -1;\n    // prevent closures\n    var segment, descriptor;\n    // eslint-disable-next-line no-constant-condition\n    while (true) {\n      var lastSegmentEnd = segmentEnd + 1;\n      segmentEnd = path.indexOf('.', lastSegmentEnd);\n      if (segmentEnd === -1) {\n        segmentEnd = pathLength;\n      }\n      segment = path.slice(lastSegmentEnd, segmentEnd);\n      // If the segment is an @each, we can process it and then break\n      if (segment === '@each' && segmentEnd !== pathLength) {\n        lastSegmentEnd = segmentEnd + 1;\n        segmentEnd = path.indexOf('.', lastSegmentEnd);\n        var arrLength = current.length;\n        if (typeof arrLength !== 'number' ||\n        // TODO: should the second test be `isEmberArray` instead?\n        !(Array.isArray(current) || 'objectAt' in current)) {\n          // If the current object isn't an array, there's nothing else to do,\n          // we don't watch individual properties. Break out of the loop.\n          break;\n        } else if (arrLength === 0) {\n          // Fast path for empty arrays\n          chainTags.push(tagForProperty(current, '[]'));\n          break;\n        }\n        if (segmentEnd === -1) {\n          segment = path.slice(lastSegmentEnd);\n        } else {\n          // Deprecated, remove once we turn the deprecation into an assertion\n          segment = path.slice(lastSegmentEnd, segmentEnd);\n        }\n        // Push the tags for each item's property\n        for (var i = 0; i < arrLength; i++) {\n          var item = objectAt(current, i);\n          if (item) {\n            (true && !(typeof item === 'object') && (0, _debug.assert)(`When using @each to observe the array \\`${current.toString()}\\`, the items in the array must be objects`, typeof item === 'object'));\n            chainTags.push(tagForProperty(item, segment, true));\n            currentMeta = (0, _meta2.peekMeta)(item);\n            descriptor = currentMeta !== null ? currentMeta.peekDescriptors(segment) : undefined;\n            // If the key is an alias, we need to bootstrap it\n            if (descriptor !== undefined && typeof descriptor.altKey === 'string') {\n              item[segment];\n            }\n          }\n        }\n        // Push the tag for the array length itself\n        chainTags.push(tagForProperty(current, '[]', true, currentTagMeta));\n        break;\n      }\n      var propertyTag = tagForProperty(current, segment, true, currentTagMeta);\n      descriptor = currentMeta !== null ? currentMeta.peekDescriptors(segment) : undefined;\n      chainTags.push(propertyTag);\n      // If we're at the end of the path, processing the last segment, and it's\n      // not an alias, we should _not_ get the last value, since we already have\n      // its tag. There's no reason to access it and do more work.\n      if (segmentEnd === pathLength) {\n        // If the key was an alias, we should always get the next value in order to\n        // bootstrap the alias. This is because aliases, unlike other CPs, should\n        // always be in sync with the aliased value.\n        if (CHAIN_PASS_THROUGH.has(descriptor)) {\n          current[segment];\n        }\n        break;\n      }\n      if (descriptor === undefined) {\n        // If the descriptor is undefined, then its a normal property, so we should\n        // lookup the value to chain off of like normal.\n        if (!(segment in current) && typeof current.unknownProperty === 'function') {\n          current = current.unknownProperty(segment);\n        } else {\n          current = current[segment];\n        }\n      } else if (CHAIN_PASS_THROUGH.has(descriptor)) {\n        current = current[segment];\n      } else {\n        // If the descriptor is defined, then its a normal CP (not an alias, which\n        // would have been handled earlier). We get the last revision to check if\n        // the CP is still valid, and if so we use the cached value. If not, then\n        // we create a lazy chain lookup, and the next time the CP is calculated,\n        // it will update that lazy chain.\n        var instanceMeta = currentMeta.source === current ? currentMeta : (0, _meta2.meta)(current);\n        var lastRevision = instanceMeta.revisionFor(segment);\n        if (lastRevision !== undefined && (0, _validator.validateTag)(propertyTag, lastRevision)) {\n          current = instanceMeta.valueFor(segment);\n        } else {\n          // use metaFor here to ensure we have the meta for the instance\n          var lazyChains = instanceMeta.writableLazyChainsFor(segment);\n          var rest = path.substring(segmentEnd + 1);\n          var placeholderTag = (0, _validator.createUpdatableTag)();\n          lazyChains.push([placeholderTag, rest]);\n          chainTags.push(placeholderTag);\n          break;\n        }\n      }\n      if (!(0, _utils.isObject)(current)) {\n        // we've hit the end of the chain for now, break out\n        break;\n      }\n      currentTagMeta = (0, _validator.tagMetaFor)(current);\n      currentMeta = (0, _meta2.peekMeta)(current);\n    }\n    return chainTags;\n  }\n  function isElementDescriptor(args) {\n    var [maybeTarget, maybeKey, maybeDesc] = args;\n    return (\n      // Ensure we have the right number of args\n      args.length === 3 && (\n      // Make sure the target is a class or object (prototype)\n      typeof maybeTarget === 'function' || typeof maybeTarget === 'object' && maybeTarget !== null) &&\n      // Make sure the key is a string\n      typeof maybeKey === 'string' && (\n      // Make sure the descriptor is the right shape\n      typeof maybeDesc === 'object' && maybeDesc !== null || maybeDesc === undefined)\n    );\n  }\n  function nativeDescDecorator(propertyDesc) {\n    var decorator = function () {\n      return propertyDesc;\n    };\n    setClassicDecorator(decorator);\n    return decorator;\n  }\n  /**\n    Objects of this type can implement an interface to respond to requests to\n    get and set. The default implementation handles simple properties.\n  \n    @class Descriptor\n    @private\n  */\n  class ComputedDescriptor {\n    constructor() {\n      this.enumerable = true;\n      this.configurable = true;\n      this._dependentKeys = undefined;\n      this._meta = undefined;\n    }\n    setup(_obj, keyName, _propertyDesc, meta$$1) {\n      meta$$1.writeDescriptors(keyName, this);\n    }\n    teardown(_obj, keyName, meta$$1) {\n      meta$$1.removeDescriptors(keyName);\n    }\n  }\n  _exports.ComputedDescriptor = ComputedDescriptor;\n  var COMPUTED_GETTERS;\n  if (true /* DEBUG */) {\n    COMPUTED_GETTERS = new _util._WeakSet();\n  }\n  function DESCRIPTOR_GETTER_FUNCTION(name, descriptor) {\n    function getter() {\n      return descriptor.get(this, name);\n    }\n    if (true /* DEBUG */) {\n      COMPUTED_GETTERS.add(getter);\n    }\n    return getter;\n  }\n  function DESCRIPTOR_SETTER_FUNCTION(name, descriptor) {\n    var set = function CPSETTER_FUNCTION(value) {\n      return descriptor.set(this, name, value);\n    };\n    COMPUTED_SETTERS.add(set);\n    return set;\n  }\n  var COMPUTED_SETTERS = new _util._WeakSet();\n  function makeComputedDecorator(desc, DecoratorClass) {\n    var decorator = function COMPUTED_DECORATOR(target, key, propertyDesc, maybeMeta, isClassicDecorator) {\n      (true && !(isClassicDecorator || !propertyDesc || !propertyDesc.get || !COMPUTED_GETTERS.has(propertyDesc.get)) && (0, _debug.assert)(`Only one computed property decorator can be applied to a class field or accessor, but '${key}' was decorated twice. You may have added the decorator to both a getter and setter, which is unnecessary.`, isClassicDecorator || !propertyDesc || !propertyDesc.get || !COMPUTED_GETTERS.has(propertyDesc.get)));\n      var meta$$1 = arguments.length === 3 ? (0, _meta2.meta)(target) : maybeMeta;\n      desc.setup(target, key, propertyDesc, meta$$1);\n      var computedDesc = {\n        enumerable: desc.enumerable,\n        configurable: desc.configurable,\n        get: DESCRIPTOR_GETTER_FUNCTION(key, desc),\n        set: DESCRIPTOR_SETTER_FUNCTION(key, desc)\n      };\n      return computedDesc;\n    };\n    setClassicDecorator(decorator, desc);\n    Object.setPrototypeOf(decorator, DecoratorClass.prototype);\n    return decorator;\n  }\n  /////////////\n  var DECORATOR_DESCRIPTOR_MAP = new WeakMap();\n  /**\n    Returns the CP descriptor associated with `obj` and `keyName`, if any.\n  \n    @method descriptorForProperty\n    @param {Object} obj the object to check\n    @param {String} keyName the key to check\n    @return {Descriptor}\n    @private\n  */\n  function descriptorForProperty(obj, keyName, _meta) {\n    (true && !(obj !== null) && (0, _debug.assert)('Cannot call `descriptorForProperty` on null', obj !== null));\n    (true && !(obj !== undefined) && (0, _debug.assert)('Cannot call `descriptorForProperty` on undefined', obj !== undefined));\n    (true && !(typeof obj === 'object' || typeof obj === 'function') && (0, _debug.assert)(`Cannot call \\`descriptorForProperty\\` on ${typeof obj}`, typeof obj === 'object' || typeof obj === 'function'));\n    var meta$$1 = _meta === undefined ? (0, _meta2.peekMeta)(obj) : _meta;\n    if (meta$$1 !== null) {\n      return meta$$1.peekDescriptors(keyName);\n    }\n  }\n  function descriptorForDecorator(dec) {\n    return DECORATOR_DESCRIPTOR_MAP.get(dec);\n  }\n  /**\n    Check whether a value is a decorator\n  \n    @method isClassicDecorator\n    @param {any} possibleDesc the value to check\n    @return {boolean}\n    @private\n  */\n  function isClassicDecorator(dec) {\n    return typeof dec === 'function' && DECORATOR_DESCRIPTOR_MAP.has(dec);\n  }\n  /**\n    Set a value as a decorator\n  \n    @method setClassicDecorator\n    @param {function} decorator the value to mark as a decorator\n    @private\n  */\n  function setClassicDecorator(dec, value) {\n    if (value === void 0) {\n      value = true;\n    }\n    DECORATOR_DESCRIPTOR_MAP.set(dec, value);\n  }\n\n  /**\n  @module @ember/object\n  */\n  var END_WITH_EACH_REGEX = /\\.@each$/;\n  /**\n    Expands `pattern`, invoking `callback` for each expansion.\n  \n    The only pattern supported is brace-expansion, anything else will be passed\n    once to `callback` directly.\n  \n    Example\n  \n    ```js\n    import { expandProperties } from '@ember/object/computed';\n  \n    function echo(arg){ console.log(arg); }\n  \n    expandProperties('foo.bar', echo);              //=> 'foo.bar'\n    expandProperties('{foo,bar}', echo);            //=> 'foo', 'bar'\n    expandProperties('foo.{bar,baz}', echo);        //=> 'foo.bar', 'foo.baz'\n    expandProperties('{foo,bar}.baz', echo);        //=> 'foo.baz', 'bar.baz'\n    expandProperties('foo.{bar,baz}.[]', echo)      //=> 'foo.bar.[]', 'foo.baz.[]'\n    expandProperties('{foo,bar}.{spam,eggs}', echo) //=> 'foo.spam', 'foo.eggs', 'bar.spam', 'bar.eggs'\n    expandProperties('{foo}.bar.{baz}')             //=> 'foo.bar.baz'\n    ```\n  \n    @method expandProperties\n    @static\n    @for @ember/object/computed\n    @public\n    @param {String} pattern The property pattern to expand.\n    @param {Function} callback The callback to invoke.  It is invoked once per\n    expansion, and is passed the expansion.\n  */\n  function expandProperties(pattern, callback) {\n    (true && !(typeof pattern === 'string') && (0, _debug.assert)(`A computed property key must be a string, you passed ${typeof pattern} ${pattern}`, typeof pattern === 'string'));\n    (true && !(pattern.indexOf(' ') === -1) && (0, _debug.assert)('Brace expanded properties cannot contain spaces, e.g. \"user.{firstName, lastName}\" should be \"user.{firstName,lastName}\"', pattern.indexOf(' ') === -1)); // regex to look for double open, double close, or unclosed braces\n    (true && !(pattern.match(/\\{[^}{]*\\{|\\}[^}{]*\\}|\\{[^}]*$/g) === null) && (0, _debug.assert)(`Brace expanded properties have to be balanced and cannot be nested, pattern: ${pattern}`, pattern.match(/\\{[^}{]*\\{|\\}[^}{]*\\}|\\{[^}]*$/g) === null));\n    var start = pattern.indexOf('{');\n    if (start < 0) {\n      callback(pattern.replace(END_WITH_EACH_REGEX, '.[]'));\n    } else {\n      dive('', pattern, start, callback);\n    }\n  }\n  function dive(prefix, pattern, start, callback) {\n    var end = pattern.indexOf('}'),\n      i = 0,\n      newStart,\n      arrayLength;\n    var tempArr = pattern.substring(start + 1, end).split(',');\n    var after = pattern.substring(end + 1);\n    prefix = prefix + pattern.substring(0, start);\n    arrayLength = tempArr.length;\n    while (i < arrayLength) {\n      newStart = after.indexOf('{');\n      if (newStart < 0) {\n        callback((prefix + tempArr[i++] + after).replace(END_WITH_EACH_REGEX, '.[]'));\n      } else {\n        dive(prefix + tempArr[i++], after, newStart, callback);\n      }\n    }\n  }\n\n  /**\n  @module @ember/object\n  */\n  var DEEP_EACH_REGEX = /\\.@each\\.[^.]+\\./;\n  function noop() {}\n  /**\n    `@computed` is a decorator that turns a JavaScript getter and setter into a\n    computed property, which is a _cached, trackable value_. By default the getter\n    will only be called once and the result will be cached. You can specify\n    various properties that your computed property depends on. This will force the\n    cached result to be cleared if the dependencies are modified, and lazily recomputed the next time something asks for it.\n  \n    In the following example we decorate a getter - `fullName` -  by calling\n    `computed` with the property dependencies (`firstName` and `lastName`) as\n    arguments. The `fullName` getter will be called once (regardless of how many\n    times it is accessed) as long as its dependencies do not change. Once\n    `firstName` or `lastName` are updated any future calls to `fullName` will\n    incorporate the new values, and any watchers of the value such as templates\n    will be updated:\n  \n    ```javascript\n    import { computed, set } from '@ember/object';\n  \n    class Person {\n      constructor(firstName, lastName) {\n        set(this, 'firstName', firstName);\n        set(this, 'lastName', lastName);\n      }\n  \n      @computed('firstName', 'lastName')\n      get fullName() {\n        return `${this.firstName} ${this.lastName}`;\n      }\n    });\n  \n    let tom = new Person('Tom', 'Dale');\n  \n    tom.fullName; // 'Tom Dale'\n    ```\n  \n    You can also provide a setter, which will be used when updating the computed\n    property. Ember's `set` function must be used to update the property\n    since it will also notify observers of the property:\n  \n    ```javascript\n    import { computed, set } from '@ember/object';\n  \n    class Person {\n      constructor(firstName, lastName) {\n        set(this, 'firstName', firstName);\n        set(this, 'lastName', lastName);\n      }\n  \n      @computed('firstName', 'lastName')\n      get fullName() {\n        return `${this.firstName} ${this.lastName}`;\n      }\n  \n      set fullName(value) {\n        let [firstName, lastName] = value.split(' ');\n  \n        set(this, 'firstName', firstName);\n        set(this, 'lastName', lastName);\n      }\n    });\n  \n    let person = new Person();\n  \n    set(person, 'fullName', 'Peter Wagenet');\n    person.firstName; // 'Peter'\n    person.lastName;  // 'Wagenet'\n    ```\n  \n    You can also pass a getter function or object with `get` and `set` functions\n    as the last argument to the computed decorator. This allows you to define\n    computed property _macros_:\n  \n    ```js\n    import { computed } from '@ember/object';\n  \n    function join(...keys) {\n      return computed(...keys, function() {\n        return keys.map(key => this[key]).join(' ');\n      });\n    }\n  \n    class Person {\n      @join('firstName', 'lastName')\n      fullName;\n    }\n    ```\n  \n    Note that when defined this way, getters and setters receive the _key_ of the\n    property they are decorating as the first argument. Setters receive the value\n    they are setting to as the second argument instead. Additionally, setters must\n    _return_ the value that should be cached:\n  \n    ```javascript\n    import { computed, set } from '@ember/object';\n  \n    function fullNameMacro(firstNameKey, lastNameKey) {\n      return computed(firstNameKey, lastNameKey, {\n        get() {\n          return `${this[firstNameKey]} ${this[lastNameKey]}`;\n        }\n  \n        set(key, value) {\n          let [firstName, lastName] = value.split(' ');\n  \n          set(this, firstNameKey, firstName);\n          set(this, lastNameKey, lastName);\n  \n          return value;\n        }\n      });\n    }\n  \n    class Person {\n      constructor(firstName, lastName) {\n        set(this, 'firstName', firstName);\n        set(this, 'lastName', lastName);\n      }\n  \n      @fullNameMacro('firstName', 'lastName') fullName;\n    });\n  \n    let person = new Person();\n  \n    set(person, 'fullName', 'Peter Wagenet');\n    person.firstName; // 'Peter'\n    person.lastName;  // 'Wagenet'\n    ```\n  \n    Computed properties can also be used in classic classes. To do this, we\n    provide the getter and setter as the last argument like we would for a macro,\n    and we assign it to a property on the class definition. This is an _anonymous_\n    computed macro:\n  \n    ```javascript\n    import EmberObject, { computed, set } from '@ember/object';\n  \n    let Person = EmberObject.extend({\n      // these will be supplied by `create`\n      firstName: null,\n      lastName: null,\n  \n      fullName: computed('firstName', 'lastName', {\n        get() {\n          return `${this.firstName} ${this.lastName}`;\n        }\n  \n        set(key, value) {\n          let [firstName, lastName] = value.split(' ');\n  \n          set(this, 'firstName', firstName);\n          set(this, 'lastName', lastName);\n  \n          return value;\n        }\n      })\n    });\n  \n    let tom = Person.create({\n      firstName: 'Tom',\n      lastName: 'Dale'\n    });\n  \n    tom.get('fullName') // 'Tom Dale'\n    ```\n  \n    You can overwrite computed property without setters with a normal property (no\n    longer computed) that won't change if dependencies change. You can also mark\n    computed property as `.readOnly()` and block all attempts to set it.\n  \n    ```javascript\n    import { computed, set } from '@ember/object';\n  \n    class Person {\n      constructor(firstName, lastName) {\n        set(this, 'firstName', firstName);\n        set(this, 'lastName', lastName);\n      }\n  \n      @computed('firstName', 'lastName').readOnly()\n      get fullName() {\n        return `${this.firstName} ${this.lastName}`;\n      }\n    });\n  \n    let person = new Person();\n    person.set('fullName', 'Peter Wagenet'); // Uncaught Error: Cannot set read-only property \"fullName\" on object: <(...):emberXXX>\n    ```\n  \n    Additional resources:\n    - [Decorators RFC](https://github.com/emberjs/rfcs/blob/master/text/0408-decorators.md)\n    - [New CP syntax RFC](https://github.com/emberjs/rfcs/blob/master/text/0011-improved-cp-syntax.md)\n    - [New computed syntax explained in \"Ember 1.12 released\" ](https://emberjs.com/blog/2015/05/13/ember-1-12-released.html#toc_new-computed-syntax)\n  \n    @class ComputedProperty\n    @public\n  */\n  class ComputedProperty extends ComputedDescriptor {\n    constructor(args) {\n      super();\n      this._readOnly = false;\n      this._hasConfig = false;\n      this._getter = undefined;\n      this._setter = undefined;\n      var maybeConfig = args[args.length - 1];\n      if (typeof maybeConfig === 'function' || maybeConfig !== null && typeof maybeConfig === 'object') {\n        this._hasConfig = true;\n        var config = args.pop();\n        if (typeof config === 'function') {\n          (true && !(!isClassicDecorator(config)) && (0, _debug.assert)(`You attempted to pass a computed property instance to computed(). Computed property instances are decorator functions, and cannot be passed to computed() because they cannot be turned into decorators twice`, !isClassicDecorator(config)));\n          this._getter = config;\n        } else {\n          var objectConfig = config;\n          (true && !(typeof objectConfig === 'object' && !Array.isArray(objectConfig)) && (0, _debug.assert)('computed expects a function or an object as last argument.', typeof objectConfig === 'object' && !Array.isArray(objectConfig)));\n          (true && !(Object.keys(objectConfig).every(key => key === 'get' || key === 'set')) && (0, _debug.assert)('Config object passed to computed can only contain `get` and `set` keys.', Object.keys(objectConfig).every(key => key === 'get' || key === 'set')));\n          (true && !(Boolean(objectConfig.get) || Boolean(objectConfig.set)) && (0, _debug.assert)('Computed properties must receive a getter or a setter, you passed none.', Boolean(objectConfig.get) || Boolean(objectConfig.set)));\n          this._getter = objectConfig.get || noop;\n          this._setter = objectConfig.set;\n        }\n      }\n      if (args.length > 0) {\n        this._property(...args);\n      }\n    }\n    setup(obj, keyName, propertyDesc, meta$$1) {\n      super.setup(obj, keyName, propertyDesc, meta$$1);\n      (true && !(!(propertyDesc && typeof propertyDesc.value === 'function')) && (0, _debug.assert)(`@computed can only be used on accessors or fields, attempted to use it with ${keyName} but that was a method. Try converting it to a getter (e.g. \\`get ${keyName}() {}\\`)`, !(propertyDesc && typeof propertyDesc.value === 'function')));\n      (true && !(!propertyDesc || !propertyDesc.initializer) && (0, _debug.assert)(`@computed can only be used on empty fields. ${keyName} has an initial value (e.g. \\`${keyName} = someValue\\`)`, !propertyDesc || !propertyDesc.initializer));\n      (true && !(!(this._hasConfig && propertyDesc && (typeof propertyDesc.get === 'function' || typeof propertyDesc.set === 'function'))) && (0, _debug.assert)(`Attempted to apply a computed property that already has a getter/setter to a ${keyName}, but it is a method or an accessor. If you passed @computed a function or getter/setter (e.g. \\`@computed({ get() { ... } })\\`), then it must be applied to a field`, !(this._hasConfig && propertyDesc && (typeof propertyDesc.get === 'function' || typeof propertyDesc.set === 'function'))));\n      if (this._hasConfig === false) {\n        (true && !(propertyDesc && (typeof propertyDesc.get === 'function' || typeof propertyDesc.set === 'function')) && (0, _debug.assert)(`Attempted to use @computed on ${keyName}, but it did not have a getter or a setter. You must either pass a get a function or getter/setter to @computed directly (e.g. \\`@computed({ get() { ... } })\\`) or apply @computed directly to a getter/setter`, propertyDesc && (typeof propertyDesc.get === 'function' || typeof propertyDesc.set === 'function')));\n        var {\n          get: _get2,\n          set: _set2\n        } = propertyDesc;\n        if (_get2 !== undefined) {\n          this._getter = _get2;\n        }\n        if (_set2 !== undefined) {\n          this._setter = function setterWrapper(_key, value) {\n            var ret = _set2.call(this, value);\n            if (_get2 !== undefined) {\n              return typeof ret === 'undefined' ? _get2.call(this) : ret;\n            }\n            return ret;\n          };\n        }\n      }\n    }\n    _property() {\n      var args = [];\n      function addArg(property) {\n        (true && !(DEEP_EACH_REGEX.test(property) === false) && (0, _debug.assert)(`Dependent keys containing @each only work one level deep. ` + `You used the key \"${property}\" which is invalid. ` + `Please create an intermediary computed property or ` + `switch to using tracked properties.`, DEEP_EACH_REGEX.test(property) === false));\n        args.push(property);\n      }\n      for (var _len2 = arguments.length, passedArgs = new Array(_len2), _key3 = 0; _key3 < _len2; _key3++) {\n        passedArgs[_key3] = arguments[_key3];\n      }\n      for (var arg of passedArgs) {\n        expandProperties(arg, addArg);\n      }\n      this._dependentKeys = args;\n    }\n    get(obj, keyName) {\n      var meta$$1 = (0, _meta2.meta)(obj);\n      var tagMeta = (0, _validator.tagMetaFor)(obj);\n      var propertyTag = (0, _validator.tagFor)(obj, keyName, tagMeta);\n      var ret;\n      var revision = meta$$1.revisionFor(keyName);\n      if (revision !== undefined && (0, _validator.validateTag)(propertyTag, revision)) {\n        ret = meta$$1.valueFor(keyName);\n      } else {\n        // For backwards compatibility, we only throw if the CP has any dependencies. CPs without dependencies\n        // should be allowed, even after the object has been destroyed, which is why we check _dependentKeys.\n        (true && !(this._dependentKeys === undefined || !(0, _destroyable.isDestroyed)(obj)) && (0, _debug.assert)(`Attempted to access the computed ${obj}.${keyName} on a destroyed object, which is not allowed`, this._dependentKeys === undefined || !(0, _destroyable.isDestroyed)(obj)));\n        var {\n          _getter,\n          _dependentKeys\n        } = this;\n        // Create a tracker that absorbs any trackable actions inside the CP\n        (0, _validator.untrack)(() => {\n          ret = _getter.call(obj, keyName);\n        });\n        if (_dependentKeys !== undefined) {\n          (0, _validator.updateTag)(propertyTag, getChainTagsForKeys(obj, _dependentKeys, tagMeta, meta$$1));\n          if (true /* DEBUG */) {\n            _validator.ALLOW_CYCLES.set(propertyTag, true);\n          }\n        }\n        meta$$1.setValueFor(keyName, ret);\n        meta$$1.setRevisionFor(keyName, (0, _validator.valueForTag)(propertyTag));\n        finishLazyChains(meta$$1, keyName, ret);\n      }\n      (0, _validator.consumeTag)(propertyTag);\n      // Add the tag of the returned value if it is an array, since arrays\n      // should always cause updates if they are consumed and then changed\n      if (Array.isArray(ret)) {\n        (0, _validator.consumeTag)((0, _validator.tagFor)(ret, '[]'));\n      }\n      return ret;\n    }\n    set(obj, keyName, value) {\n      if (this._readOnly) {\n        this._throwReadOnlyError(obj, keyName);\n      }\n      (true && !(this._setter !== undefined) && (0, _debug.assert)(`Cannot override the computed property \\`${keyName}\\` on ${(0, _utils.toString)(obj)}.`, this._setter !== undefined));\n      var meta$$1 = (0, _meta2.meta)(obj);\n      // ensure two way binding works when the component has defined a computed\n      // property with both a setter and dependent keys, in that scenario without\n      // the sync observer added below the caller's value will never be updated\n      //\n      // See GH#18147 / GH#19028 for details.\n      if (\n      // ensure that we only run this once, while the component is being instantiated\n      meta$$1.isInitializing() && this._dependentKeys !== undefined && this._dependentKeys.length > 0 && typeof obj[PROPERTY_DID_CHANGE] === 'function' && obj.isComponent) {\n        // It's redundant to do this here, but we don't want to check above so we can avoid an extra function call in prod.\n        (true && !(hasPropertyDidChange(obj)) && (0, _debug.assert)('property did change hook is invalid', hasPropertyDidChange(obj)));\n        addObserver(obj, keyName, () => {\n          obj[PROPERTY_DID_CHANGE](keyName);\n        }, undefined, true);\n      }\n      var ret;\n      try {\n        beginPropertyChanges();\n        ret = this._set(obj, keyName, value, meta$$1);\n        finishLazyChains(meta$$1, keyName, ret);\n        var tagMeta = (0, _validator.tagMetaFor)(obj);\n        var propertyTag = (0, _validator.tagFor)(obj, keyName, tagMeta);\n        var {\n          _dependentKeys\n        } = this;\n        if (_dependentKeys !== undefined) {\n          (0, _validator.updateTag)(propertyTag, getChainTagsForKeys(obj, _dependentKeys, tagMeta, meta$$1));\n          if (true /* DEBUG */) {\n            _validator.ALLOW_CYCLES.set(propertyTag, true);\n          }\n        }\n        meta$$1.setRevisionFor(keyName, (0, _validator.valueForTag)(propertyTag));\n      } finally {\n        endPropertyChanges();\n      }\n      return ret;\n    }\n    _throwReadOnlyError(obj, keyName) {\n      throw new Error(`Cannot set read-only property \"${keyName}\" on object: ${(0, _debug.inspect)(obj)}`);\n    }\n    _set(obj, keyName, value, meta$$1) {\n      var hadCachedValue = meta$$1.revisionFor(keyName) !== undefined;\n      var cachedValue = meta$$1.valueFor(keyName);\n      var ret;\n      var {\n        _setter\n      } = this;\n      setObserverSuspended(obj, keyName, true);\n      try {\n        ret = _setter.call(obj, keyName, value, cachedValue);\n      } finally {\n        setObserverSuspended(obj, keyName, false);\n      }\n      // allows setter to return the same value that is cached already\n      if (hadCachedValue && cachedValue === ret) {\n        return ret;\n      }\n      meta$$1.setValueFor(keyName, ret);\n      notifyPropertyChange(obj, keyName, meta$$1, value);\n      return ret;\n    }\n    /* called before property is overridden */\n    teardown(obj, keyName, meta$$1) {\n      if (meta$$1.revisionFor(keyName) !== undefined) {\n        meta$$1.setRevisionFor(keyName, undefined);\n        meta$$1.setValueFor(keyName, undefined);\n      }\n      super.teardown(obj, keyName, meta$$1);\n    }\n  }\n  _exports.ComputedProperty = ComputedProperty;\n  class AutoComputedProperty extends ComputedProperty {\n    get(obj, keyName) {\n      var meta$$1 = (0, _meta2.meta)(obj);\n      var tagMeta = (0, _validator.tagMetaFor)(obj);\n      var propertyTag = (0, _validator.tagFor)(obj, keyName, tagMeta);\n      var ret;\n      var revision = meta$$1.revisionFor(keyName);\n      if (revision !== undefined && (0, _validator.validateTag)(propertyTag, revision)) {\n        ret = meta$$1.valueFor(keyName);\n      } else {\n        (true && !(!(0, _destroyable.isDestroyed)(obj)) && (0, _debug.assert)(`Attempted to access the computed ${obj}.${keyName} on a destroyed object, which is not allowed`, !(0, _destroyable.isDestroyed)(obj)));\n        var {\n          _getter\n        } = this;\n        // Create a tracker that absorbs any trackable actions inside the CP\n        var tag = (0, _validator.track)(() => {\n          ret = _getter.call(obj, keyName);\n        });\n        (0, _validator.updateTag)(propertyTag, tag);\n        meta$$1.setValueFor(keyName, ret);\n        meta$$1.setRevisionFor(keyName, (0, _validator.valueForTag)(propertyTag));\n        finishLazyChains(meta$$1, keyName, ret);\n      }\n      (0, _validator.consumeTag)(propertyTag);\n      // Add the tag of the returned value if it is an array, since arrays\n      // should always cause updates if they are consumed and then changed\n      if (Array.isArray(ret)) {\n        (0, _validator.consumeTag)((0, _validator.tagFor)(ret, '[]', tagMeta));\n      }\n      return ret;\n    }\n  }\n  // TODO: This class can be svelted once `meta` has been deprecated\n  class ComputedDecoratorImpl extends Function {\n    /**\n      Call on a computed property to set it into read-only mode. When in this\n      mode the computed property will throw an error when set.\n         Example:\n         ```javascript\n      import { computed, set } from '@ember/object';\n         class Person {\n        @computed().readOnly()\n        get guid() {\n          return 'guid-guid-guid';\n        }\n      }\n         let person = new Person();\n      set(person, 'guid', 'new-guid'); // will throw an exception\n      ```\n         Classic Class Example:\n         ```javascript\n      import EmberObject, { computed } from '@ember/object';\n         let Person = EmberObject.extend({\n        guid: computed(function() {\n          return 'guid-guid-guid';\n        }).readOnly()\n      });\n         let person = Person.create();\n      person.set('guid', 'new-guid'); // will throw an exception\n      ```\n         @method readOnly\n      @return {ComputedProperty} this\n      @chainable\n      @public\n    */\n    readOnly() {\n      var desc = descriptorForDecorator(this);\n      (true && !(!(desc._setter && desc._setter !== desc._getter)) && (0, _debug.assert)('Computed properties that define a setter using the new syntax cannot be read-only', !(desc._setter && desc._setter !== desc._getter)));\n      desc._readOnly = true;\n      return this;\n    }\n    /**\n      In some cases, you may want to annotate computed properties with additional\n      metadata about how they function or what values they operate on. For example,\n      computed property functions may close over variables that are then no longer\n      available for introspection. You can pass a hash of these values to a\n      computed property.\n         Example:\n         ```javascript\n      import { computed } from '@ember/object';\n      import Person from 'my-app/utils/person';\n         class Store {\n        @computed().meta({ type: Person })\n        get person() {\n          let personId = this.personId;\n          return Person.create({ id: personId });\n        }\n      }\n      ```\n         Classic Class Example:\n         ```javascript\n      import { computed } from '@ember/object';\n      import Person from 'my-app/utils/person';\n         const Store = EmberObject.extend({\n        person: computed(function() {\n          let personId = this.get('personId');\n          return Person.create({ id: personId });\n        }).meta({ type: Person })\n      });\n      ```\n         The hash that you pass to the `meta()` function will be saved on the\n      computed property descriptor under the `_meta` key. Ember runtime\n      exposes a public API for retrieving these values from classes,\n      via the `metaForProperty()` function.\n         @method meta\n      @param {Object} meta\n      @chainable\n      @public\n    */\n    meta(meta$$1) {\n      var prop = descriptorForDecorator(this);\n      if (arguments.length === 0) {\n        return prop._meta || {};\n      } else {\n        prop._meta = meta$$1;\n        return this;\n      }\n    }\n    // TODO: Remove this when we can provide alternatives in the ecosystem to\n    // addons such as ember-macro-helpers that use it.\n    /** @internal */\n    get _getter() {\n      return descriptorForDecorator(this)._getter;\n    }\n    // TODO: Refactor this, this is an internal API only\n    /** @internal */\n    set enumerable(value) {\n      descriptorForDecorator(this).enumerable = value;\n    }\n  }\n  function computed() {\n    for (var _len3 = arguments.length, args = new Array(_len3), _key4 = 0; _key4 < _len3; _key4++) {\n      args[_key4] = arguments[_key4];\n    }\n    (true && !(!(isElementDescriptor(args.slice(0, 3)) && args.length === 5 && args[4] === true)) && (0, _debug.assert)(`@computed can only be used directly as a native decorator. If you're using tracked in classic classes, add parenthesis to call it like a function: computed()`, !(isElementDescriptor(args.slice(0, 3)) && args.length === 5 && args[4] === true)));\n    if (isElementDescriptor(args)) {\n      // SAFETY: We passed in the impl for this class\n      var decorator = makeComputedDecorator(new ComputedProperty([]), ComputedDecoratorImpl);\n      return decorator(args[0], args[1], args[2]);\n    }\n    // SAFETY: We passed in the impl for this class\n    return makeComputedDecorator(new ComputedProperty(args), ComputedDecoratorImpl);\n  }\n  function autoComputed() {\n    for (var _len4 = arguments.length, config = new Array(_len4), _key5 = 0; _key5 < _len4; _key5++) {\n      config[_key5] = arguments[_key5];\n    }\n    // SAFETY: We passed in the impl for this class\n    return makeComputedDecorator(new AutoComputedProperty(config), ComputedDecoratorImpl);\n  }\n  /**\n    Allows checking if a given property on an object is a computed property. For the most part,\n    this doesn't matter (you would normally just access the property directly and use its value),\n    but for some tooling specific scenarios (e.g. the ember-inspector) it is important to\n    differentiate if a property is a computed property or a \"normal\" property.\n  \n    This will work on either a class's prototype or an instance itself.\n  \n    @static\n    @method isComputed\n    @for @ember/debug\n    @private\n   */\n  function isComputed(obj, key) {\n    return Boolean(descriptorForProperty(obj, key));\n  }\n  function getCachedValueFor(obj, key) {\n    var meta$$1 = (0, _meta2.peekMeta)(obj);\n    if (meta$$1) {\n      return meta$$1.valueFor(key);\n    } else {\n      return undefined;\n    }\n  }\n\n  /**\n  @module @ember/object\n  */\n  /**\n    NOTE: This is a low-level method used by other parts of the API. You almost\n    never want to call this method directly. Instead you should use\n    `mixin()` to define new properties.\n  \n    Defines a property on an object. This method works much like the ES5\n    `Object.defineProperty()` method except that it can also accept computed\n    properties and other special descriptors.\n  \n    Normally this method takes only three parameters. However if you pass an\n    instance of `Descriptor` as the third param then you can pass an\n    optional value as the fourth parameter. This is often more efficient than\n    creating new descriptor hashes for each property.\n  \n    ## Examples\n  \n    ```javascript\n    import { defineProperty, computed } from '@ember/object';\n  \n    // ES5 compatible mode\n    defineProperty(contact, 'firstName', {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: 'Charles'\n    });\n  \n    // define a simple property\n    defineProperty(contact, 'lastName', undefined, 'Jolley');\n  \n    // define a computed property\n    defineProperty(contact, 'fullName', computed('firstName', 'lastName', function() {\n      return this.firstName+' '+this.lastName;\n    }));\n    ```\n  \n    @public\n    @method defineProperty\n    @static\n    @for @ember/object\n    @param {Object} obj the object to define this property on. This may be a prototype.\n    @param {String} keyName the name of the property\n    @param {Descriptor} [desc] an instance of `Descriptor` (typically a\n      computed property) or an ES5 descriptor.\n      You must provide this or `data` but not both.\n    @param {*} [data] something other than a descriptor, that will\n      become the explicit value of this property.\n  */\n  function defineProperty(obj, keyName, desc, data, _meta) {\n    var meta$$1 = _meta === undefined ? (0, _meta2.meta)(obj) : _meta;\n    var previousDesc = descriptorForProperty(obj, keyName, meta$$1);\n    var wasDescriptor = previousDesc !== undefined;\n    if (wasDescriptor) {\n      previousDesc.teardown(obj, keyName, meta$$1);\n    }\n    if (isClassicDecorator(desc)) {\n      defineDecorator(obj, keyName, desc, meta$$1);\n    } else if (desc === null || desc === undefined) {\n      defineValue(obj, keyName, data, wasDescriptor, true);\n    } else {\n      // fallback to ES5\n      Object.defineProperty(obj, keyName, desc);\n    }\n    // if key is being watched, override chains that\n    // were initialized with the prototype\n    if (!meta$$1.isPrototypeMeta(obj)) {\n      revalidateObservers(obj);\n    }\n  }\n  function defineDecorator(obj, keyName, desc, meta$$1) {\n    var propertyDesc;\n    if (true /* DEBUG */) {\n      propertyDesc = desc(obj, keyName, undefined, meta$$1, true);\n    } else {\n      propertyDesc = desc(obj, keyName, undefined, meta$$1);\n    }\n    Object.defineProperty(obj, keyName, propertyDesc);\n    // pass the decorator function forward for backwards compat\n    return desc;\n  }\n  function defineValue(obj, keyName, value, wasDescriptor, enumerable) {\n    if (enumerable === void 0) {\n      enumerable = true;\n    }\n    if (wasDescriptor === true || enumerable === false) {\n      Object.defineProperty(obj, keyName, {\n        configurable: true,\n        enumerable,\n        writable: true,\n        value\n      });\n    } else {\n      if (true /* DEBUG */) {\n        (0, _utils.setWithMandatorySetter)(obj, keyName, value);\n      } else {\n        obj[keyName] = value;\n      }\n    }\n    return value;\n  }\n  var firstDotIndexCache = new _utils.Cache(1000, key => key.indexOf('.'));\n  function isPath(path) {\n    return typeof path === 'string' && firstDotIndexCache.get(path) !== -1;\n  }\n  var PROXY_CONTENT = (0, _utils.symbol)('PROXY_CONTENT');\n  _exports.PROXY_CONTENT = PROXY_CONTENT;\n  var getPossibleMandatoryProxyValue;\n  if (true /* DEBUG */) {\n    getPossibleMandatoryProxyValue = function getPossibleMandatoryProxyValue(obj, keyName) {\n      var content = obj[PROXY_CONTENT];\n      if (content === undefined) {\n        return obj[keyName];\n      } else {\n        /* global Reflect */\n        return Reflect.get(content, keyName, obj);\n      }\n    };\n  }\n  function hasUnknownProperty(val) {\n    return typeof val === 'object' && val !== null && typeof val.unknownProperty === 'function';\n  }\n  function get(obj, keyName) {\n    (true && !(arguments.length === 2) && (0, _debug.assert)(`Get must be called with two arguments; an object and a property key`, arguments.length === 2));\n    (true && !(obj !== undefined && obj !== null) && (0, _debug.assert)(`Cannot call get with '${keyName}' on an undefined object.`, obj !== undefined && obj !== null));\n    (true && !(typeof keyName === 'string' || typeof keyName === 'number' && !isNaN(keyName)) && (0, _debug.assert)(`The key provided to get must be a string or number, you passed ${keyName}`, typeof keyName === 'string' || typeof keyName === 'number' && !isNaN(keyName)));\n    (true && !(typeof keyName !== 'string' || keyName.lastIndexOf('this.', 0) !== 0) && (0, _debug.assert)(`'this' in paths is not supported`, typeof keyName !== 'string' || keyName.lastIndexOf('this.', 0) !== 0));\n    return isPath(keyName) ? _getPath(obj, keyName) : _getProp(obj, keyName);\n  }\n  function _getProp(obj, keyName) {\n    if (obj == null) {\n      return;\n    }\n    var value;\n    if (typeof obj === 'object' || typeof obj === 'function') {\n      if (true /* DEBUG */) {\n        value = getPossibleMandatoryProxyValue(obj, keyName);\n      } else {\n        value = obj[keyName];\n      }\n      if (value === undefined && typeof obj === 'object' && !(keyName in obj) && hasUnknownProperty(obj)) {\n        value = obj.unknownProperty(keyName);\n      }\n      if ((0, _validator.isTracking)()) {\n        (0, _validator.consumeTag)((0, _validator.tagFor)(obj, keyName));\n        if (Array.isArray(value) || (0, _internals.isEmberArray)(value)) {\n          // Add the tag of the returned value if it is an array, since arrays\n          // should always cause updates if they are consumed and then changed\n          (0, _validator.consumeTag)((0, _validator.tagFor)(value, '[]'));\n        }\n      }\n    } else {\n      // SAFETY: It should be ok to access properties on any non-nullish value\n      value = obj[keyName];\n    }\n    return value;\n  }\n  function _getPath(obj, path, forSet) {\n    var parts = typeof path === 'string' ? path.split('.') : path;\n    for (var part of parts) {\n      if (obj === undefined || obj === null || obj.isDestroyed) {\n        return undefined;\n      }\n      if (forSet && (part === '__proto__' || part === 'constructor')) {\n        return;\n      }\n      obj = _getProp(obj, part);\n    }\n    return obj;\n  }\n  // Warm it up\n  _getProp('foo', 'a');\n  _getProp('foo', 1);\n  _getProp({}, 'a');\n  _getProp({}, 1);\n  _getProp({\n    unknownProperty() {}\n  }, 'a');\n  _getProp({\n    unknownProperty() {}\n  }, 1);\n  get({}, 'foo');\n  get({}, 'foo.bar');\n  var fakeProxy = {};\n  (0, _utils.setProxy)(fakeProxy);\n  (0, _validator.track)(() => _getProp({}, 'a'));\n  (0, _validator.track)(() => _getProp({}, 1));\n  (0, _validator.track)(() => _getProp({\n    a: []\n  }, 'a'));\n  (0, _validator.track)(() => _getProp({\n    a: fakeProxy\n  }, 'a'));\n\n  /**\n   @module @ember/object\n  */\n  /**\n    Sets the value of a property on an object, respecting computed properties\n    and notifying observers and other listeners of the change.\n    If the specified property is not defined on the object and the object\n    implements the `setUnknownProperty` method, then instead of setting the\n    value of the property on the object, its `setUnknownProperty` handler\n    will be invoked with the two parameters `keyName` and `value`.\n  \n    ```javascript\n    import { set } from '@ember/object';\n    set(obj, \"name\", value);\n    ```\n  \n    @method set\n    @static\n    @for @ember/object\n    @param {Object} obj The object to modify.\n    @param {String} keyName The property key to set\n    @param {Object} value The value to set\n    @return {Object} the passed value.\n    @public\n  */\n  function set(obj, keyName, value, tolerant) {\n    (true && !(arguments.length === 3 || arguments.length === 4) && (0, _debug.assert)(`Set must be called with three or four arguments; an object, a property key, a value and tolerant true/false`, arguments.length === 3 || arguments.length === 4));\n    (true && !(obj && typeof obj === 'object' || typeof obj === 'function') && (0, _debug.assert)(`Cannot call set with '${keyName}' on an undefined object.`, obj && typeof obj === 'object' || typeof obj === 'function'));\n    (true && !(typeof keyName === 'string' || typeof keyName === 'number' && !isNaN(keyName)) && (0, _debug.assert)(`The key provided to set must be a string or number, you passed ${keyName}`, typeof keyName === 'string' || typeof keyName === 'number' && !isNaN(keyName)));\n    (true && !(typeof keyName !== 'string' || keyName.lastIndexOf('this.', 0) !== 0) && (0, _debug.assert)(`'this' in paths is not supported`, typeof keyName !== 'string' || keyName.lastIndexOf('this.', 0) !== 0));\n    if (obj.isDestroyed) {\n      (true && !(tolerant) && (0, _debug.assert)(`calling set on destroyed object: ${(0, _utils.toString)(obj)}.${keyName} = ${(0, _utils.toString)(value)}`, tolerant));\n      return value;\n    }\n    return isPath(keyName) ? _setPath(obj, keyName, value, tolerant) : _setProp(obj, keyName, value);\n  }\n  function _setProp(obj, keyName, value) {\n    var descriptor = (0, _utils.lookupDescriptor)(obj, keyName);\n    if (descriptor !== null && COMPUTED_SETTERS.has(descriptor.set)) {\n      obj[keyName] = value;\n      return value;\n    }\n    var currentValue;\n    if (true /* DEBUG */) {\n      currentValue = getPossibleMandatoryProxyValue(obj, keyName);\n    } else {\n      currentValue = obj[keyName];\n    }\n    if (currentValue === undefined && 'object' === typeof obj && !(keyName in obj) && typeof obj.setUnknownProperty === 'function') {\n      /* unknown property */\n      obj.setUnknownProperty(keyName, value);\n    } else {\n      if (true /* DEBUG */) {\n        (0, _utils.setWithMandatorySetter)(obj, keyName, value);\n      } else {\n        obj[keyName] = value;\n      }\n      if (currentValue !== value) {\n        notifyPropertyChange(obj, keyName);\n      }\n    }\n    return value;\n  }\n  function _setPath(root, path, value, tolerant) {\n    var parts = path.split('.');\n    var keyName = parts.pop();\n    (true && !(keyName.trim().length > 0) && (0, _debug.assert)('Property set failed: You passed an empty path', keyName.trim().length > 0));\n    var newRoot = _getPath(root, parts, true);\n    if (newRoot !== null && newRoot !== undefined) {\n      return set(newRoot, keyName, value);\n    } else if (!tolerant) {\n      throw new Error(`Property set failed: object in path \"${parts.join('.')}\" could not be found.`);\n    }\n  }\n  /**\n    Error-tolerant form of `set`. Will not blow up if any part of the\n    chain is `undefined`, `null`, or destroyed.\n  \n    This is primarily used when syncing bindings, which may try to update after\n    an object has been destroyed.\n  \n    ```javascript\n    import { trySet } from '@ember/object';\n  \n    let obj = { name: \"Zoey\" };\n    trySet(obj, \"contacts.twitter\", \"@emberjs\");\n    ```\n  \n    @method trySet\n    @static\n    @for @ember/object\n    @param {Object} root The object to modify.\n    @param {String} path The property path to set\n    @param {Object} value The value to set\n    @public\n  */\n  function trySet(root, path, value) {\n    return set(root, path, value, true);\n  }\n  function alias(altKey) {\n    (true && !(!isElementDescriptor(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @alias as a decorator directly, but it requires a `altKey` parameter', !isElementDescriptor(Array.prototype.slice.call(arguments)))); // SAFETY: We passed in the impl for this class\n    return makeComputedDecorator(new AliasedProperty(altKey), AliasDecoratorImpl);\n  }\n  // TODO: This class can be svelted once `meta` has been deprecated\n  class AliasDecoratorImpl extends Function {\n    readOnly() {\n      descriptorForDecorator(this).readOnly();\n      return this;\n    }\n    oneWay() {\n      descriptorForDecorator(this).oneWay();\n      return this;\n    }\n    meta(meta$$1) {\n      var prop = descriptorForDecorator(this);\n      if (arguments.length === 0) {\n        return prop._meta || {};\n      } else {\n        prop._meta = meta$$1;\n      }\n    }\n  }\n  class AliasedProperty extends ComputedDescriptor {\n    constructor(altKey) {\n      super();\n      this.altKey = altKey;\n    }\n    setup(obj, keyName, propertyDesc, meta$$1) {\n      (true && !(this.altKey !== keyName) && (0, _debug.assert)(`Setting alias '${keyName}' on self`, this.altKey !== keyName));\n      super.setup(obj, keyName, propertyDesc, meta$$1);\n      CHAIN_PASS_THROUGH.add(this);\n    }\n    get(obj, keyName) {\n      var ret;\n      var meta$$1 = (0, _meta2.meta)(obj);\n      var tagMeta = (0, _validator.tagMetaFor)(obj);\n      var propertyTag = (0, _validator.tagFor)(obj, keyName, tagMeta);\n      // We don't use the tag since CPs are not automatic, we just want to avoid\n      // anything tracking while we get the altKey\n      (0, _validator.untrack)(() => {\n        ret = get(obj, this.altKey);\n      });\n      var lastRevision = meta$$1.revisionFor(keyName);\n      if (lastRevision === undefined || !(0, _validator.validateTag)(propertyTag, lastRevision)) {\n        (0, _validator.updateTag)(propertyTag, getChainTagsForKey(obj, this.altKey, tagMeta, meta$$1));\n        meta$$1.setRevisionFor(keyName, (0, _validator.valueForTag)(propertyTag));\n        finishLazyChains(meta$$1, keyName, ret);\n      }\n      (0, _validator.consumeTag)(propertyTag);\n      return ret;\n    }\n    set(obj, _keyName, value) {\n      return set(obj, this.altKey, value);\n    }\n    readOnly() {\n      this.set = AliasedProperty_readOnlySet;\n    }\n    oneWay() {\n      this.set = AliasedProperty_oneWaySet;\n    }\n  }\n  function AliasedProperty_readOnlySet(obj, keyName) {\n    throw new Error(`Cannot set read-only property '${keyName}' on object: ${(0, _debug.inspect)(obj)}`);\n  }\n  function AliasedProperty_oneWaySet(obj, keyName, value) {\n    defineProperty(obj, keyName, null);\n    return set(obj, keyName, value);\n  }\n\n  /**\n  @module ember\n  */\n  /**\n    Used internally to allow changing properties in a backwards compatible way, and print a helpful\n    deprecation warning.\n  \n    @method deprecateProperty\n    @param {Object} object The object to add the deprecated property to.\n    @param {String} deprecatedKey The property to add (and print deprecation warnings upon accessing).\n    @param {String} newKey The property that will be aliased.\n    @private\n    @since 1.7.0\n  */\n  function deprecateProperty(object, deprecatedKey, newKey, options) {\n    function _deprecate() {\n      (true && !(false) && (0, _debug.deprecate)(`Usage of \\`${deprecatedKey}\\` is deprecated, use \\`${newKey}\\` instead.`, false, options));\n    }\n    Object.defineProperty(object, deprecatedKey, {\n      configurable: true,\n      enumerable: false,\n      set(value) {\n        _deprecate();\n        set(this, newKey, value);\n      },\n      get() {\n        _deprecate();\n        return get(this, newKey);\n      }\n    });\n  }\n  var EACH_PROXIES = new WeakMap();\n  function eachProxyArrayWillChange(array, idx, removedCnt, addedCnt) {\n    var eachProxy = EACH_PROXIES.get(array);\n    if (eachProxy !== undefined) {\n      eachProxy.arrayWillChange(array, idx, removedCnt, addedCnt);\n    }\n  }\n  function eachProxyArrayDidChange(array, idx, removedCnt, addedCnt) {\n    var eachProxy = EACH_PROXIES.get(array);\n    if (eachProxy !== undefined) {\n      eachProxy.arrayDidChange(array, idx, removedCnt, addedCnt);\n    }\n  }\n\n  /**\n   @module ember\n  */\n  /**\n    Helper class that allows you to register your library with Ember.\n  \n    Singleton created at `Ember.libraries`.\n  \n    @class Libraries\n    @constructor\n    @private\n  */\n  class Libraries {\n    constructor() {\n      this._registry = [];\n      this._coreLibIndex = 0;\n    }\n    _getLibraryByName(name) {\n      var libs = this._registry;\n      for (var lib of libs) {\n        if (lib.name === name) {\n          return lib;\n        }\n      }\n      return undefined;\n    }\n    register(name, version, isCoreLibrary) {\n      var index = this._registry.length;\n      if (!this._getLibraryByName(name)) {\n        if (isCoreLibrary) {\n          index = this._coreLibIndex++;\n        }\n        this._registry.splice(index, 0, {\n          name,\n          version\n        });\n      } else {\n        (true && (0, _debug.warn)(`Library \"${name}\" is already registered with Ember.`, false, {\n          id: 'ember-metal.libraries-register'\n        }));\n      }\n    }\n    registerCoreLibrary(name, version) {\n      this.register(name, version, true);\n    }\n    deRegister(name) {\n      var lib = this._getLibraryByName(name);\n      var index;\n      if (lib) {\n        index = this._registry.indexOf(lib);\n        this._registry.splice(index, 1);\n      }\n    }\n  }\n  _exports.Libraries = Libraries;\n  if (true /* DEBUG */) {\n    Libraries.prototype.logVersions = function () {\n      var libs = this._registry;\n      var nameLengths = libs.map(item => get(item, 'name.length'));\n      (true && !(nameLengths instanceof Array && nameLengths.every(n => typeof n === 'number')) && (0, _debug.assert)('nameLengths is number array', nameLengths instanceof Array && nameLengths.every(n => typeof n === 'number')));\n      var maxNameLength = Math.max.apply(null, nameLengths);\n      (0, _debug.debug)('-------------------------------');\n      for (var lib of libs) {\n        var spaces = new Array(maxNameLength - lib.name.length + 1).join(' ');\n        (0, _debug.debug)([lib.name, spaces, ' : ', lib.version].join(''));\n      }\n      (0, _debug.debug)('-------------------------------');\n    };\n  }\n  var LIBRARIES = new Libraries();\n  _exports.libraries = LIBRARIES;\n  LIBRARIES.registerCoreLibrary('Ember', _version.default);\n  function getProperties(obj, keys) {\n    var ret = {};\n    var propertyNames;\n    var i = 1;\n    if (arguments.length === 2 && Array.isArray(keys)) {\n      i = 0;\n      propertyNames = arguments[1];\n    } else {\n      propertyNames = Array.from(arguments);\n    }\n    for (; i < propertyNames.length; i++) {\n      ret[propertyNames[i]] = get(obj, propertyNames[i]);\n    }\n    return ret;\n  }\n\n  /**\n   @module @ember/object\n  */\n  /**\n    Set a list of properties on an object. These properties are set inside\n    a single `beginPropertyChanges` and `endPropertyChanges` batch, so\n    observers will be buffered.\n  \n    ```javascript\n    import EmberObject from '@ember/object';\n    let anObject = EmberObject.create();\n  \n    anObject.setProperties({\n      firstName: 'Stanley',\n      lastName: 'Stuart',\n      age: 21\n    });\n    ```\n  \n    @method setProperties\n    @static\n    @for @ember/object\n    @param obj\n    @param {Object} properties\n    @return properties\n    @public\n  */\n  function setProperties(obj, properties) {\n    if (properties === null || typeof properties !== 'object') {\n      return properties;\n    }\n    changeProperties(() => {\n      var props = Object.keys(properties);\n      for (var propertyName of props) {\n        set(obj, propertyName, properties[propertyName]);\n      }\n    });\n    return properties;\n  }\n  var DEBUG_INJECTION_FUNCTIONS;\n  _exports.DEBUG_INJECTION_FUNCTIONS = DEBUG_INJECTION_FUNCTIONS;\n  if (true /* DEBUG */) {\n    _exports.DEBUG_INJECTION_FUNCTIONS = DEBUG_INJECTION_FUNCTIONS = new WeakMap();\n  }\n  function inject(type) {\n    (true && !(typeof type === 'string') && (0, _debug.assert)('a string type must be provided to inject', typeof type === 'string'));\n    var elementDescriptor;\n    var name;\n    for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key6 = 1; _key6 < _len5; _key6++) {\n      args[_key6 - 1] = arguments[_key6];\n    }\n    if (isElementDescriptor(args)) {\n      elementDescriptor = args;\n    } else if (typeof args[0] === 'string') {\n      name = args[0];\n    }\n    var getInjection = function (propertyName) {\n      var owner = (0, _owner.getOwner)(this) || this.container; // fallback to `container` for backwards compat\n      (true && !(Boolean(owner)) && (0, _debug.assert)(`Attempting to lookup an injected property on an object without a container, ensure that the object was instantiated via a container.`, Boolean(owner)));\n      return owner.lookup(`${type}:${name || propertyName}`);\n    };\n    if (true /* DEBUG */) {\n      DEBUG_INJECTION_FUNCTIONS.set(getInjection, {\n        type,\n        name\n      });\n    }\n    var decorator = computed({\n      get: getInjection,\n      set(keyName, value) {\n        defineProperty(this, keyName, null, value);\n      }\n    });\n    if (elementDescriptor) {\n      return decorator(elementDescriptor[0], elementDescriptor[1], elementDescriptor[2]);\n    } else {\n      return decorator;\n    }\n  }\n  function tracked() {\n    for (var _len6 = arguments.length, args = new Array(_len6), _key7 = 0; _key7 < _len6; _key7++) {\n      args[_key7] = arguments[_key7];\n    }\n    (true && !(!(isElementDescriptor(args.slice(0, 3)) && args.length === 5 && args[4] === true)) && (0, _debug.assert)(`@tracked can only be used directly as a native decorator. If you're using tracked in classic classes, add parenthesis to call it like a function: tracked()`, !(isElementDescriptor(args.slice(0, 3)) && args.length === 5 && args[4] === true)));\n    if (!isElementDescriptor(args)) {\n      var propertyDesc = args[0];\n      (true && !(args.length === 0 || typeof propertyDesc === 'object' && propertyDesc !== null) && (0, _debug.assert)(`tracked() may only receive an options object containing 'value' or 'initializer', received ${propertyDesc}`, args.length === 0 || typeof propertyDesc === 'object' && propertyDesc !== null));\n      if (true /* DEBUG */ && propertyDesc) {\n        var keys = Object.keys(propertyDesc);\n        (true && !(keys.length <= 1 && (keys[0] === undefined || keys[0] === 'value' || keys[0] === 'initializer')) && (0, _debug.assert)(`The options object passed to tracked() may only contain a 'value' or 'initializer' property, not both. Received: [${keys}]`, keys.length <= 1 && (keys[0] === undefined || keys[0] === 'value' || keys[0] === 'initializer')));\n        (true && !(!('initializer' in propertyDesc) || typeof propertyDesc.initializer === 'function') && (0, _debug.assert)(`The initializer passed to tracked must be a function. Received ${propertyDesc.initializer}`, !('initializer' in propertyDesc) || typeof propertyDesc.initializer === 'function'));\n      }\n      var initializer = propertyDesc ? propertyDesc.initializer : undefined;\n      var value = propertyDesc ? propertyDesc.value : undefined;\n      var decorator = function (target, key, _desc, _meta, isClassicDecorator$$1) {\n        (true && !(isClassicDecorator$$1) && (0, _debug.assert)(`You attempted to set a default value for ${key} with the @tracked({ value: 'default' }) syntax. You can only use this syntax with classic classes. For native classes, you can use class initializers: @tracked field = 'default';`, isClassicDecorator$$1));\n        var fieldDesc = {\n          initializer: initializer || (() => value)\n        };\n        return descriptorForField([target, key, fieldDesc]);\n      };\n      setClassicDecorator(decorator);\n      return decorator;\n    }\n    return descriptorForField(args);\n  }\n  if (true /* DEBUG */) {\n    // Normally this isn't a classic decorator, but we want to throw a helpful\n    // error in development so we need it to treat it like one\n    setClassicDecorator(tracked);\n  }\n  function descriptorForField(_ref) {\n    var [target, key, desc] = _ref;\n    (true && !(!desc || !desc.value && !desc.get && !desc.set) && (0, _debug.assert)(`You attempted to use @tracked on ${key}, but that element is not a class field. @tracked is only usable on class fields. Native getters and setters will autotrack add any tracked fields they encounter, so there is no need mark getters and setters with @tracked.`, !desc || !desc.value && !desc.get && !desc.set));\n    var {\n      getter,\n      setter\n    } = (0, _validator.trackedData)(key, desc ? desc.initializer : undefined);\n    function get() {\n      var value = getter(this);\n      // Add the tag of the returned value if it is an array, since arrays\n      // should always cause updates if they are consumed and then changed\n      if (Array.isArray(value) || (0, _internals.isEmberArray)(value)) {\n        (0, _validator.consumeTag)((0, _validator.tagFor)(value, '[]'));\n      }\n      return value;\n    }\n    function set(newValue) {\n      setter(this, newValue);\n      (0, _validator.dirtyTagFor)(this, SELF_TAG);\n    }\n    var newDesc = {\n      enumerable: true,\n      configurable: true,\n      isTracked: true,\n      get,\n      set\n    };\n    COMPUTED_SETTERS.add(set);\n    (0, _meta2.meta)(target).writeDescriptors(key, new TrackedDescriptor(get, set));\n    return newDesc;\n  }\n  class TrackedDescriptor {\n    constructor(_get, _set) {\n      this._get = _get;\n      this._set = _set;\n      CHAIN_PASS_THROUGH.add(this);\n    }\n    get(obj) {\n      return this._get.call(obj);\n    }\n    set(obj, _key, value) {\n      this._set.call(obj, value);\n    }\n  }\n\n  // NOTE: copied from: https://github.com/glimmerjs/glimmer.js/pull/358\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  _exports.TrackedDescriptor = TrackedDescriptor;\n  var cached = function () {\n    for (var _len7 = arguments.length, args = new Array(_len7), _key8 = 0; _key8 < _len7; _key8++) {\n      args[_key8] = arguments[_key8];\n    }\n    var [target, key, descriptor] = args;\n    // Error on `@cached()`, `@cached(...args)`, and `@cached propName = value;`\n    if (true /* DEBUG */ && target === undefined) throwCachedExtraneousParens();\n    if (true /* DEBUG */ && (typeof target !== 'object' || typeof key !== 'string' || typeof descriptor !== 'object' || args.length !== 3)) {\n      throwCachedInvalidArgsError(args);\n    }\n    if (true /* DEBUG */ && (!('get' in descriptor) || typeof descriptor.get !== 'function')) {\n      throwCachedGetterOnlyError(key);\n    }\n    var caches = new WeakMap();\n    var getter = descriptor.get;\n    descriptor.get = function () {\n      if (!caches.has(this)) {\n        caches.set(this, (0, _validator.createCache)(getter.bind(this)));\n      }\n      return (0, _validator.getValue)(caches.get(this));\n    };\n  };\n  _exports.cached = cached;\n  function throwCachedExtraneousParens() {\n    throw new Error('You attempted to use @cached(), which is not necessary nor supported. Remove the parentheses and you will be good to go!');\n  }\n  function throwCachedGetterOnlyError(key) {\n    throw new Error(`The @cached decorator must be applied to getters. '${key}' is not a getter.`);\n  }\n  function throwCachedInvalidArgsError(args) {\n    if (args === void 0) {\n      args = [];\n    }\n    throw new Error(`You attempted to use @cached on with ${args.length > 1 ? 'arguments' : 'an argument'} ( @cached(${args.map(d => `'${d}'`).join(', ')}), which is not supported. Dependencies are automatically tracked, so you can just use ${'`@cached`'}`);\n  }\n\n  /**\n    Ember uses caching based on trackable values to avoid updating large portions\n    of the application. This caching is exposed via a cache primitive that can be\n    used to cache a specific computation, so that it will not update and will\n    return the cached value until a tracked value used in its computation has\n    updated.\n  \n    @module @glimmer/tracking/primitives/cache\n    @public\n  */\n  /**\n    Receives a function, and returns a wrapped version of it that memoizes based on\n    _autotracking_. The function will only rerun whenever any tracked values used\n    within it have changed. Otherwise, it will return the previous value.\n  \n    ```js\n    import { tracked } from '@glimmer/tracking';\n    import { createCache, getValue } from '@glimmer/tracking/primitives/cache';\n  \n    class State {\n      @tracked value;\n    }\n  \n    let state = new State();\n    let computeCount = 0;\n  \n    let counter = createCache(() => {\n      // consume the state. Now, `counter` will\n      // only rerun if `state.value` changes.\n      state.value;\n  \n      return ++computeCount;\n    });\n  \n    getValue(counter); // 1\n  \n    // returns the same value because no tracked state has changed\n    getValue(counter); // 1\n  \n    state.value = 'foo';\n  \n    // reruns because a tracked value used in the function has changed,\n    // incermenting the counter\n    getValue(counter); // 2\n    ```\n  \n    @method createCache\n    @static\n    @for @glimmer/tracking/primitives/cache\n    @public\n  */\n  /**\n    Gets the value of a cache created with `createCache`.\n  \n    ```js\n    import { tracked } from '@glimmer/tracking';\n    import { createCache, getValue } from '@glimmer/tracking/primitives/cache';\n  \n    let computeCount = 0;\n  \n    let counter = createCache(() => {\n      return ++computeCount;\n    });\n  \n    getValue(counter); // 1\n    ```\n  \n    @method getValue\n    @static\n    @for @glimmer/tracking/primitives/cache\n    @public\n  */\n  /**\n    Can be used to check if a memoized function is _constant_. If no tracked state\n    was used while running a memoized function, it will never rerun, because nothing\n    can invalidate its result. `isConst` can be used to determine if a memoized\n    function is constant or not, in order to optimize code surrounding that\n    function.\n  \n    ```js\n    import { tracked } from '@glimmer/tracking';\n    import { createCache, getValue, isConst } from '@glimmer/tracking/primitives/cache';\n  \n    class State {\n      @tracked value;\n    }\n  \n    let state = new State();\n    let computeCount = 0;\n  \n    let counter = createCache(() => {\n      // consume the state\n      state.value;\n  \n      return computeCount++;\n    });\n  \n    let constCounter = createCache(() => {\n      return computeCount++;\n    });\n  \n    getValue(counter);\n    getValue(constCounter);\n  \n    isConst(counter); // false\n    isConst(constCounter); // true\n    ```\n  \n    If called on a cache that hasn't been accessed yet, it will throw an\n    error. This is because there's no way to know if the function will be constant\n    or not yet, and so this helps prevent missing an optimization opportunity on\n    accident.\n  \n    @method isConst\n    @static\n    @for @glimmer/tracking/primitives/cache\n    @public\n  */\n\n  var hasOwnProperty = Object.prototype.hasOwnProperty;\n  var searchDisabled = false;\n  var flags = {\n    _set: 0,\n    _unprocessedNamespaces: false,\n    get unprocessedNamespaces() {\n      return this._unprocessedNamespaces;\n    },\n    set unprocessedNamespaces(v) {\n      this._set++;\n      this._unprocessedNamespaces = v;\n    }\n  };\n  var unprocessedMixins = false;\n  var NAMESPACES = [];\n  _exports.NAMESPACES = NAMESPACES;\n  var NAMESPACES_BY_ID = Object.create(null);\n  _exports.NAMESPACES_BY_ID = NAMESPACES_BY_ID;\n  function addNamespace(namespace) {\n    flags.unprocessedNamespaces = true;\n    NAMESPACES.push(namespace);\n  }\n  function removeNamespace(namespace) {\n    var name = (0, _utils.getName)(namespace);\n    delete NAMESPACES_BY_ID[name];\n    NAMESPACES.splice(NAMESPACES.indexOf(namespace), 1);\n    if (name in _environment.context.lookup && namespace === _environment.context.lookup[name]) {\n      _environment.context.lookup[name] = undefined;\n    }\n  }\n  function findNamespaces() {\n    if (!flags.unprocessedNamespaces) {\n      return;\n    }\n    var lookup = _environment.context.lookup;\n    var keys = Object.keys(lookup);\n    for (var key of keys) {\n      // Only process entities that start with uppercase A-Z\n      if (!isUppercase(key.charCodeAt(0))) {\n        continue;\n      }\n      var obj = tryIsNamespace(lookup, key);\n      if (obj) {\n        (0, _utils.setName)(obj, key);\n      }\n    }\n  }\n  function findNamespace(name) {\n    if (!searchDisabled) {\n      processAllNamespaces();\n    }\n    return NAMESPACES_BY_ID[name];\n  }\n  function processNamespace(namespace) {\n    _processNamespace([namespace.toString()], namespace, new Set());\n  }\n  function processAllNamespaces() {\n    var unprocessedNamespaces = flags.unprocessedNamespaces;\n    if (unprocessedNamespaces) {\n      findNamespaces();\n      flags.unprocessedNamespaces = false;\n    }\n    if (unprocessedNamespaces || unprocessedMixins) {\n      var namespaces = NAMESPACES;\n      for (var namespace of namespaces) {\n        processNamespace(namespace);\n      }\n      unprocessedMixins = false;\n    }\n  }\n  function isSearchDisabled() {\n    return searchDisabled;\n  }\n  function setSearchDisabled(flag) {\n    searchDisabled = Boolean(flag);\n  }\n  function setUnprocessedMixins() {\n    unprocessedMixins = true;\n  }\n  function _processNamespace(paths, root, seen) {\n    var idx = paths.length;\n    var id = paths.join('.');\n    NAMESPACES_BY_ID[id] = root;\n    (0, _utils.setName)(root, id);\n    // Loop over all of the keys in the namespace, looking for classes\n    for (var key in root) {\n      if (!hasOwnProperty.call(root, key)) {\n        continue;\n      }\n      var obj = root[key];\n      // If we are processing the `Ember` namespace, for example, the\n      // `paths` will start with `[\"Ember\"]`. Every iteration through\n      // the loop will update the **second** element of this list with\n      // the key, so processing `Ember.View` will make the Array\n      // `['Ember', 'View']`.\n      paths[idx] = key;\n      // If we have found an unprocessed class\n      if (obj && (0, _utils.getName)(obj) === void 0) {\n        // Replace the class' `toString` with the dot-separated path\n        (0, _utils.setName)(obj, paths.join('.'));\n        // Support nested namespaces\n      } else if (obj && isNamespace(obj)) {\n        // Skip aliased namespaces\n        if (seen.has(obj)) {\n          continue;\n        }\n        seen.add(obj);\n        // Process the child namespace\n        _processNamespace(paths, obj, seen);\n      }\n    }\n    paths.length = idx; // cut out last item\n  }\n\n  function isNamespace(obj) {\n    return obj != null && typeof obj === 'object' && obj.isNamespace;\n  }\n  function isUppercase(code) {\n    return code >= 65 && code <= 90 // A\n    ; // Z\n  }\n\n  function tryIsNamespace(lookup, prop) {\n    try {\n      var obj = lookup[prop];\n      return (obj !== null && typeof obj === 'object' || typeof obj === 'function') && obj.isNamespace && obj;\n    } catch (e) {\n      // continue\n    }\n  }\n});","define(\"@ember/-internals/overrides/index\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.onEmberGlobalAccess = void 0;\n  var onEmberGlobalAccess;\n  _exports.onEmberGlobalAccess = onEmberGlobalAccess;\n});","define(\"@ember/-internals/owner/index\", [\"exports\", \"@glimmer/owner\"], function (_exports, _owner) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.getOwner = getOwner;\n  _exports.isFactory = isFactory;\n  _exports.setOwner = setOwner;\n  /**\n    @private\n    @method isFactory\n    @param {Object} obj\n    @return {Boolean}\n    @static\n   */\n  function isFactory(obj) {\n    return obj != null && typeof obj.create === 'function';\n  }\n  // NOTE: For docs, see the definition at the public API site in `@ember/owner`;\n  // we document it there for the sake of public API docs and for TS consumption,\n  // while having the richer `InternalOwner` representation for Ember itself.\n  function getOwner(object) {\n    return (0, _owner.getOwner)(object);\n  }\n  /**\n    `setOwner` forces a new owner on a given object instance. This is primarily\n    useful in some testing cases.\n  \n    @method setOwner\n    @static\n    @for @ember/owner\n    @param {Object} object An object instance.\n    @param {Owner} object The new owner object of the object instance.\n    @since 2.3.0\n    @public\n  */\n  function setOwner(object, owner) {\n    (0, _owner.setOwner)(object, owner);\n  }\n});","define(\"@ember/-internals/routing/index\", [\"exports\", \"@ember/routing/-internals\"], function (_exports, _internals) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"RouterDSL\", {\n    enumerable: true,\n    get: function () {\n      return _internals.DSL;\n    }\n  });\n  Object.defineProperty(_exports, \"controllerFor\", {\n    enumerable: true,\n    get: function () {\n      return _internals.controllerFor;\n    }\n  });\n  Object.defineProperty(_exports, \"generateController\", {\n    enumerable: true,\n    get: function () {\n      return _internals.generateController;\n    }\n  });\n  Object.defineProperty(_exports, \"generateControllerFactory\", {\n    enumerable: true,\n    get: function () {\n      return _internals.generateControllerFactory;\n    }\n  });\n});","define(\"@ember/-internals/runtime/index\", [\"exports\", \"@ember/-internals/runtime/lib/mixins/registry_proxy\", \"@ember/-internals/runtime/lib/mixins/container_proxy\", \"@ember/-internals/runtime/lib/mixins/comparable\", \"@ember/array\", \"@ember/-internals/runtime/lib/mixins/action_handler\", \"@ember/-internals/runtime/lib/mixins/-proxy\", \"@ember/enumerable/mutable\", \"@ember/-internals/runtime/lib/mixins/target_action_support\", \"@ember/-internals/runtime/lib/ext/rsvp\"], function (_exports, _registry_proxy, _container_proxy, _comparable, _array, _action_handler, _proxy, _mutable, _target_action_support, _rsvp) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"ActionHandler\", {\n    enumerable: true,\n    get: function () {\n      return _action_handler.default;\n    }\n  });\n  Object.defineProperty(_exports, \"Comparable\", {\n    enumerable: true,\n    get: function () {\n      return _comparable.default;\n    }\n  });\n  Object.defineProperty(_exports, \"ContainerProxyMixin\", {\n    enumerable: true,\n    get: function () {\n      return _container_proxy.default;\n    }\n  });\n  Object.defineProperty(_exports, \"MutableEnumerable\", {\n    enumerable: true,\n    get: function () {\n      return _mutable.default;\n    }\n  });\n  Object.defineProperty(_exports, \"NativeArray\", {\n    enumerable: true,\n    get: function () {\n      return _array.NativeArray;\n    }\n  });\n  Object.defineProperty(_exports, \"RSVP\", {\n    enumerable: true,\n    get: function () {\n      return _rsvp.default;\n    }\n  });\n  Object.defineProperty(_exports, \"RegistryProxyMixin\", {\n    enumerable: true,\n    get: function () {\n      return _registry_proxy.default;\n    }\n  });\n  Object.defineProperty(_exports, \"TargetActionSupport\", {\n    enumerable: true,\n    get: function () {\n      return _target_action_support.default;\n    }\n  });\n  Object.defineProperty(_exports, \"_ProxyMixin\", {\n    enumerable: true,\n    get: function () {\n      return _proxy.default;\n    }\n  });\n  Object.defineProperty(_exports, \"_contentFor\", {\n    enumerable: true,\n    get: function () {\n      return _proxy.contentFor;\n    }\n  });\n  Object.defineProperty(_exports, \"onerrorDefault\", {\n    enumerable: true,\n    get: function () {\n      return _rsvp.onerrorDefault;\n    }\n  });\n});","define(\"@ember/-internals/runtime/lib/ext/rsvp\", [\"exports\", \"rsvp\", \"@ember/runloop\", \"@ember/-internals/error-handling\", \"@ember/debug\"], function (_exports, RSVP, _runloop, _errorHandling, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.onerrorDefault = onerrorDefault;\n  RSVP.configure('async', (callback, promise) => {\n    _runloop._backburner.schedule('actions', null, callback, promise);\n  });\n  RSVP.configure('after', cb => {\n    _runloop._backburner.schedule(_runloop._rsvpErrorQueue, null, cb);\n  });\n  RSVP.on('error', onerrorDefault);\n  function onerrorDefault(reason) {\n    var error = errorFor(reason);\n    if (error) {\n      var overrideDispatch = (0, _errorHandling.getDispatchOverride)();\n      if (overrideDispatch) {\n        overrideDispatch(error);\n      } else {\n        throw error;\n      }\n    }\n  }\n  function errorFor(reason) {\n    if (!reason) return;\n    var withErrorThrown = reason;\n    if (withErrorThrown.errorThrown) {\n      return unwrapErrorThrown(withErrorThrown);\n    }\n    var withName = reason;\n    if (withName.name === 'UnrecognizedURLError') {\n      (true && !(false) && (0, _debug.assert)(`The URL '${withName.message}' did not match any routes in your application`, false)); // @ts-expect-error We'll hit this if the assert is stripped\n      return;\n    }\n    if (reason.name === 'TransitionAborted') {\n      return;\n    }\n    return reason;\n  }\n  function unwrapErrorThrown(reason) {\n    var error = reason.errorThrown;\n    if (typeof error === 'string') {\n      error = new Error(error);\n    }\n    Object.defineProperty(error, '__reason_with_error_thrown__', {\n      value: reason,\n      enumerable: false\n    });\n    return error;\n  }\n  var _default = RSVP;\n  _exports.default = _default;\n});","define(\"@ember/-internals/runtime/lib/mixins/-proxy\", [\"exports\", \"@ember/-internals/meta\", \"@ember/object/mixin\", \"@ember/-internals/metal\", \"@ember/-internals/utils\", \"@ember/debug\", \"@glimmer/manager\", \"@glimmer/validator\"], function (_exports, _meta, _mixin, _metal, _utils, _debug, _manager, _validator) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.contentFor = contentFor;\n  _exports.default = void 0;\n  /**\n  @module ember\n  */\n\n  function contentFor(proxy) {\n    var content = (0, _metal.get)(proxy, 'content');\n    // SAFETY: Ideally we'd assert instead of casting, but @glimmer/validator doesn't give us\n    // sufficient public types for this. Previously this code was .js and worked correctly so\n    // hopefully this is sufficiently reliable.\n    (0, _validator.updateTag)((0, _metal.tagForObject)(proxy), (0, _metal.tagForObject)(content));\n    return content;\n  }\n  function customTagForProxy(proxy, key, addMandatorySetter) {\n    (true && !((0, _utils.isProxy)(proxy)) && (0, _debug.assert)('Expected a proxy', (0, _utils.isProxy)(proxy)));\n    var meta = (0, _validator.tagMetaFor)(proxy);\n    var tag = (0, _validator.tagFor)(proxy, key, meta);\n    if (true /* DEBUG */) {\n      // TODO: Replace this with something more first class for tracking tags in DEBUG\n      // SAFETY: This is not an officially supported property but setting shouldn't cause issues.\n      tag._propertyKey = key;\n    }\n    if (key in proxy) {\n      if (true /* DEBUG */ && addMandatorySetter) {\n        (true && !(_utils.setupMandatorySetter) && (0, _debug.assert)('[BUG] setupMandatorySetter should be set when debugging', setupMandatorySetter));\n        (0, _utils.setupMandatorySetter)(tag, proxy, key);\n      }\n      return tag;\n    } else {\n      var tags = [tag, (0, _validator.tagFor)(proxy, 'content', meta)];\n      var content = contentFor(proxy);\n      if ((0, _utils.isObject)(content)) {\n        tags.push((0, _metal.tagForProperty)(content, key, addMandatorySetter));\n      }\n      return (0, _validator.combine)(tags);\n    }\n  }\n  var ProxyMixin = _mixin.default.create({\n    /**\n      The object whose properties will be forwarded.\n         @property content\n      @type {unknown}\n      @default null\n      @public\n    */\n    content: null,\n    init() {\n      this._super(...arguments);\n      (0, _utils.setProxy)(this);\n      (0, _metal.tagForObject)(this);\n      (0, _manager.setCustomTagFor)(this, customTagForProxy);\n    },\n    willDestroy() {\n      this.set('content', null);\n      this._super(...arguments);\n    },\n    isTruthy: (0, _metal.computed)('content', function () {\n      return Boolean((0, _metal.get)(this, 'content'));\n    }),\n    unknownProperty(key) {\n      var content = contentFor(this);\n      if (content) {\n        return (0, _metal.get)(content, key);\n      }\n    },\n    setUnknownProperty(key, value) {\n      var m = (0, _meta.meta)(this);\n      if (m.isInitializing() || m.isPrototypeMeta(this)) {\n        // if marked as prototype or object is initializing then just\n        // defineProperty rather than delegate\n        (0, _metal.defineProperty)(this, key, null, value);\n        return value;\n      }\n      var content = contentFor(this);\n      (true && !(content) && (0, _debug.assert)(`Cannot delegate set('${key}', ${value}) to the 'content' property of object proxy ${this}: its 'content' is undefined.`, content)); // SAFETY: We don't actually guarantee that this is an object, so this isn't necessarily safe :(\n      return (0, _metal.set)(content, key, value);\n    }\n  });\n  var _default = ProxyMixin;\n  _exports.default = _default;\n});","define(\"@ember/-internals/runtime/lib/mixins/action_handler\", [\"exports\", \"@ember/object/mixin\", \"@ember/-internals/metal\", \"@ember/debug\"], function (_exports, _mixin, _metal, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n  @module ember\n  */\n\n  var ActionHandler = _mixin.default.create({\n    mergedProperties: ['actions'],\n    /**\n      The collection of functions, keyed by name, available on this\n      `ActionHandler` as action targets.\n         These functions will be invoked when a matching `{{action}}` is triggered\n      from within a template and the application's current route is this route.\n         Actions can also be invoked from other parts of your application\n      via `ActionHandler#send`.\n         The `actions` hash will inherit action handlers from\n      the `actions` hash defined on extended parent classes\n      or mixins rather than just replace the entire hash, e.g.:\n         ```app/mixins/can-display-banner.js\n      import Mixin from '@ember/object/mixin';\n         export default Mixin.create({\n        actions: {\n          displayBanner(msg) {\n            // ...\n          }\n        }\n      });\n      ```\n         ```app/routes/welcome.js\n      import Route from '@ember/routing/route';\n      import CanDisplayBanner from '../mixins/can-display-banner';\n         export default Route.extend(CanDisplayBanner, {\n        actions: {\n          playMusic() {\n            // ...\n          }\n        }\n      });\n         // `WelcomeRoute`, when active, will be able to respond\n      // to both actions, since the actions hash is merged rather\n      // then replaced when extending mixins / parent classes.\n      this.send('displayBanner');\n      this.send('playMusic');\n      ```\n         Within a Controller, Route or Component's action handler,\n      the value of the `this` context is the Controller, Route or\n      Component object:\n         ```app/routes/song.js\n      import Route from '@ember/routing/route';\n         export default Route.extend({\n        actions: {\n          myAction() {\n            this.controllerFor(\"song\");\n            this.transitionTo(\"other.route\");\n            ...\n          }\n        }\n      });\n      ```\n         It is also possible to call `this._super(...arguments)` from within an\n      action handler if it overrides a handler defined on a parent\n      class or mixin:\n         Take for example the following routes:\n         ```app/mixins/debug-route.js\n      import Mixin from '@ember/object/mixin';\n         export default Mixin.create({\n        actions: {\n          debugRouteInformation() {\n            console.debug(\"It's a-me, console.debug!\");\n          }\n        }\n      });\n      ```\n         ```app/routes/annoying-debug.js\n      import Route from '@ember/routing/route';\n      import DebugRoute from '../mixins/debug-route';\n         export default Route.extend(DebugRoute, {\n        actions: {\n          debugRouteInformation() {\n            // also call the debugRouteInformation of mixed in DebugRoute\n            this._super(...arguments);\n               // show additional annoyance\n            window.alert(...);\n          }\n        }\n      });\n      ```\n         ## Bubbling\n         By default, an action will stop bubbling once a handler defined\n      on the `actions` hash handles it. To continue bubbling the action,\n      you must return `true` from the handler:\n         ```app/router.js\n      Router.map(function() {\n        this.route(\"album\", function() {\n          this.route(\"song\");\n        });\n      });\n      ```\n         ```app/routes/album.js\n      import Route from '@ember/routing/route';\n         export default Route.extend({\n        actions: {\n          startPlaying: function() {\n          }\n        }\n      });\n      ```\n         ```app/routes/album-song.js\n      import Route from '@ember/routing/route';\n         export default Route.extend({\n        actions: {\n          startPlaying() {\n            // ...\n               if (actionShouldAlsoBeTriggeredOnParentRoute) {\n              return true;\n            }\n          }\n        }\n      });\n      ```\n         @property actions\n      @type Object\n      @default null\n      @public\n    */\n    /**\n      Triggers a named action on the `ActionHandler`. Any parameters\n      supplied after the `actionName` string will be passed as arguments\n      to the action target function.\n         If the `ActionHandler` has its `target` property set, actions may\n      bubble to the `target`. Bubbling happens when an `actionName` can\n      not be found in the `ActionHandler`'s `actions` hash or if the\n      action target function returns `true`.\n         Example\n         ```app/routes/welcome.js\n      import Route from '@ember/routing/route';\n         export default Route.extend({\n        actions: {\n          playTheme() {\n            this.send('playMusic', 'theme.mp3');\n          },\n          playMusic(track) {\n            // ...\n          }\n        }\n      });\n      ```\n         @method send\n      @param {String} actionName The action to trigger\n      @param {*} context a context to send with the action\n      @public\n    */\n    send(actionName) {\n      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        args[_key - 1] = arguments[_key];\n      }\n      (true && !(!this.isDestroying && !this.isDestroyed) && (0, _debug.assert)(`Attempted to call .send() with the action '${actionName}' on the destroyed object '${this}'.`, !this.isDestroying && !this.isDestroyed));\n      if (this.actions && this.actions[actionName]) {\n        var shouldBubble = this.actions[actionName].apply(this, args) === true;\n        if (!shouldBubble) {\n          return;\n        }\n      }\n      var target = (0, _metal.get)(this, 'target');\n      if (target) {\n        (true && !(typeof target.send === 'function') && (0, _debug.assert)(`The \\`target\\` for ${this} (${target}) does not have a \\`send\\` method`, typeof target.send === 'function'));\n        target.send(...arguments);\n      }\n    }\n  });\n  var _default = ActionHandler;\n  _exports.default = _default;\n});","define(\"@ember/-internals/runtime/lib/mixins/comparable\", [\"exports\", \"@ember/object/mixin\"], function (_exports, _mixin) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var Comparable = _mixin.default.create({\n    /**\n      __Required.__ You must implement this method to apply this mixin.\n         Override to return the result of the comparison of the two parameters. The\n      compare method should return:\n         - `-1` if `a < b`\n      - `0` if `a == b`\n      - `1` if `a > b`\n         Default implementation raises an exception.\n         @method compare\n      @param a {Object} the first object to compare\n      @param b {Object} the second object to compare\n      @return {Number} the result of the comparison\n      @private\n    */\n    compare: null\n  });\n  var _default = Comparable;\n  _exports.default = _default;\n});","define(\"@ember/-internals/runtime/lib/mixins/container_proxy\", [\"exports\", \"@ember/runloop\", \"@ember/object/mixin\"], function (_exports, _runloop, _mixin) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var ContainerProxyMixin = _mixin.default.create({\n    /**\n     The container stores state.\n        @private\n     @property {Ember.Container} __container__\n     */\n    __container__: null,\n    ownerInjection() {\n      return this.__container__.ownerInjection();\n    },\n    lookup(fullName, options) {\n      return this.__container__.lookup(fullName, options);\n    },\n    destroy() {\n      var container = this.__container__;\n      if (container) {\n        (0, _runloop.join)(() => {\n          container.destroy();\n          (0, _runloop.schedule)('destroy', container, 'finalizeDestroy');\n        });\n      }\n      this._super();\n    },\n    factoryFor(fullName) {\n      return this.__container__.factoryFor(fullName);\n    }\n  });\n  var _default = ContainerProxyMixin;\n  _exports.default = _default;\n});","define(\"@ember/-internals/runtime/lib/mixins/registry_proxy\", [\"exports\", \"@ember/debug\", \"@ember/object/mixin\"], function (_exports, _debug, _mixin) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n  @module ember\n  */\n\n  var RegistryProxyMixin = _mixin.default.create({\n    __registry__: null,\n    resolveRegistration(fullName) {\n      (true && !(this.__registry__.isValidFullName(fullName)) && (0, _debug.assert)('fullName must be a proper full name', this.__registry__.isValidFullName(fullName)));\n      return this.__registry__.resolve(fullName);\n    },\n    register: registryAlias('register'),\n    unregister: registryAlias('unregister'),\n    hasRegistration: registryAlias('has'),\n    registeredOption: registryAlias('getOption'),\n    registerOptions: registryAlias('options'),\n    registeredOptions: registryAlias('getOptions'),\n    registerOptionsForType: registryAlias('optionsForType'),\n    registeredOptionsForType: registryAlias('getOptionsForType'),\n    /**\n      Define a dependency injection onto a specific factory or all factories\n      of a type.\n         When Ember instantiates a controller, view, or other framework component\n      it can attach a dependency to that component. This is often used to\n      provide services to a set of framework components.\n         An example of providing a session object to all controllers:\n         ```javascript\n      import { alias } from '@ember/object/computed';\n      import Application from '@ember/application';\n      import Controller from '@ember/controller';\n      import EmberObject from '@ember/object';\n         let App = Application.create();\n      let Session = EmberObject.extend({ isAuthenticated: false });\n         // A factory must be registered before it can be injected\n      App.register('session:main', Session);\n         // Inject 'session:main' onto all factories of the type 'controller'\n      // with the name 'session'\n      App.inject('controller', 'session', 'session:main');\n         App.IndexController = Controller.extend({\n        isLoggedIn: alias('session.isAuthenticated')\n      });\n      ```\n         Injections can also be performed on specific factories.\n         ```javascript\n      App.inject(<full_name or type>, <property name>, <full_name>)\n      App.inject('route', 'source', 'source:main')\n      App.inject('route:application', 'email', 'model:email')\n      ```\n         It is important to note that injections can only be performed on\n      classes that are instantiated by Ember itself. Instantiating a class\n      directly (via `create` or `new`) bypasses the dependency injection\n      system.\n         @public\n      @method inject\n      @param  factoryNameOrType {String}\n      @param  property {String}\n      @param  injectionName {String}\n      @deprecated\n    **/\n    inject: registryAlias('injection')\n  });\n  function registryAlias(name) {\n    return function () {\n      // We need this cast because `Parameters` is deferred so that it is not\n      // possible for TS to see it will always produce the right type. However,\n      // since `AnyFn` has a rest type, it is allowed. See discussion on [this\n      // issue](https://github.com/microsoft/TypeScript/issues/47615).\n      return this.__registry__[name](...arguments);\n    };\n  }\n  var _default = RegistryProxyMixin;\n  _exports.default = _default;\n});","define(\"@ember/-internals/runtime/lib/mixins/target_action_support\", [\"exports\", \"@ember/-internals/environment\", \"@ember/-internals/metal\", \"@ember/object/mixin\", \"@ember/debug\"], function (_exports, _environment, _metal, _mixin, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n  @module ember\n  */\n\n  var TargetActionSupport = _mixin.default.create({\n    target: null,\n    action: null,\n    actionContext: null,\n    actionContextObject: (0, _metal.computed)('actionContext', function () {\n      var actionContext = (0, _metal.get)(this, 'actionContext');\n      if (typeof actionContext === 'string') {\n        var value = (0, _metal.get)(this, actionContext);\n        if (value === undefined) {\n          value = (0, _metal.get)(_environment.context.lookup, actionContext);\n        }\n        return value;\n      } else {\n        return actionContext;\n      }\n    }),\n    /**\n    Send an `action` with an `actionContext` to a `target`. The action, actionContext\n    and target will be retrieved from properties of the object. For example:\n       ```javascript\n    import { alias } from '@ember/object/computed';\n       App.SaveButtonView = Ember.View.extend(Ember.TargetActionSupport, {\n      target: alias('controller'),\n      action: 'save',\n      actionContext: alias('context'),\n      click() {\n        this.triggerAction(); // Sends the `save` action, along with the current context\n                              // to the current controller\n      }\n    });\n    ```\n       The `target`, `action`, and `actionContext` can be provided as properties of\n    an optional object argument to `triggerAction` as well.\n       ```javascript\n    App.SaveButtonView = Ember.View.extend(Ember.TargetActionSupport, {\n      click() {\n        this.triggerAction({\n          action: 'save',\n          target: this.get('controller'),\n          actionContext: this.get('context')\n        }); // Sends the `save` action, along with the current context\n            // to the current controller\n      }\n    });\n    ```\n       The `actionContext` defaults to the object you are mixing `TargetActionSupport` into.\n    But `target` and `action` must be specified either as properties or with the argument\n    to `triggerAction`, or a combination:\n       ```javascript\n    import { alias } from '@ember/object/computed';\n       App.SaveButtonView = Ember.View.extend(Ember.TargetActionSupport, {\n      target: alias('controller'),\n      click() {\n        this.triggerAction({\n          action: 'save'\n        }); // Sends the `save` action, along with a reference to `this`,\n            // to the current controller\n      }\n    });\n    ```\n       @method triggerAction\n    @param opts {Object} (optional, with the optional keys action, target and/or actionContext)\n    @return {Boolean} true if the action was sent successfully and did not return false\n    @private\n    */\n    triggerAction(opts) {\n      if (opts === void 0) {\n        opts = {};\n      }\n      var {\n        action,\n        target,\n        actionContext\n      } = opts;\n      action = action || (0, _metal.get)(this, 'action');\n      target = target || getTarget(this);\n      if (actionContext === undefined) {\n        actionContext = (0, _metal.get)(this, 'actionContextObject') || this;\n      }\n      var context = Array.isArray(actionContext) ? actionContext : [actionContext];\n      if (target && action) {\n        var ret;\n        if (isSendable(target)) {\n          ret = target.send(action, ...context);\n        } else {\n          (true && !(typeof target[action] === 'function') && (0, _debug.assert)(`The action '${action}' did not exist on ${target}`, typeof target[action] === 'function'));\n          ret = target[action](...context);\n        }\n        if (ret !== false) {\n          return true;\n        }\n      }\n      return false;\n    }\n  });\n  function isSendable(obj) {\n    return obj != null && typeof obj === 'object' && typeof obj.send === 'function';\n  }\n  function getTarget(instance) {\n    var target = (0, _metal.get)(instance, 'target');\n    if (target) {\n      if (typeof target === 'string') {\n        var value = (0, _metal.get)(instance, target);\n        if (value === undefined) {\n          value = (0, _metal.get)(_environment.context.lookup, target);\n        }\n        return value;\n      } else {\n        return target;\n      }\n    }\n    if (instance._target) {\n      return instance._target;\n    }\n    return null;\n  }\n  if (true /* DEBUG */) {\n    Object.seal(TargetActionSupport);\n  }\n  var _default = TargetActionSupport;\n  _exports.default = _default;\n});","define(\"@ember/-internals/string/index\", [\"exports\", \"@ember/-internals/utils\"], function (_exports, _utils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.classify = classify;\n  _exports.dasherize = dasherize;\n  /*\n    This module exists to separate the @ember/string methods used\n    internally in ember-source, from those public methods that are\n    now deprecated and to be removed.\n  */\n\n  var STRING_DASHERIZE_REGEXP = /[ _]/g;\n  var STRING_DASHERIZE_CACHE = new _utils.Cache(1000, key => decamelize(key).replace(STRING_DASHERIZE_REGEXP, '-'));\n  var STRING_CLASSIFY_REGEXP_1 = /^(-|_)+(.)?/;\n  var STRING_CLASSIFY_REGEXP_2 = /(.)(-|_|\\.|\\s)+(.)?/g;\n  var STRING_CLASSIFY_REGEXP_3 = /(^|\\/|\\.)([a-z])/g;\n  var CLASSIFY_CACHE = new _utils.Cache(1000, str => {\n    var replace1 = (_match, _separator, chr) => chr ? `_${chr.toUpperCase()}` : '';\n    var replace2 = (_match, initialChar, _separator, chr) => initialChar + (chr ? chr.toUpperCase() : '');\n    var parts = str.split('/');\n    for (var i = 0; i < parts.length; i++) {\n      parts[i] = parts[i].replace(STRING_CLASSIFY_REGEXP_1, replace1).replace(STRING_CLASSIFY_REGEXP_2, replace2);\n    }\n    return parts.join('/').replace(STRING_CLASSIFY_REGEXP_3, (match /*, separator, chr */) => match.toUpperCase());\n  });\n  var STRING_DECAMELIZE_REGEXP = /([a-z\\d])([A-Z])/g;\n  var DECAMELIZE_CACHE = new _utils.Cache(1000, str => str.replace(STRING_DECAMELIZE_REGEXP, '$1_$2').toLowerCase());\n  /**\n   Defines string helper methods used internally in ember-source.\n  \n   @class String\n   @private\n   */\n  /**\n   Replaces underscores, spaces, or camelCase with dashes.\n  \n   ```javascript\n   import { dasherize } from '@ember/-internals/string';\n  \n   dasherize('innerHTML');                // 'inner-html'\n   dasherize('action_name');              // 'action-name'\n   dasherize('css-class-name');           // 'css-class-name'\n   dasherize('my favorite items');        // 'my-favorite-items'\n   dasherize('privateDocs/ownerInvoice';  // 'private-docs/owner-invoice'\n   ```\n  \n   @method dasherize\n   @param {String} str The string to dasherize.\n   @return {String} the dasherized string.\n   @private\n   */\n  function dasherize(str) {\n    return STRING_DASHERIZE_CACHE.get(str);\n  }\n  /**\n   Returns the UpperCamelCase form of a string.\n  \n   ```javascript\n   import { classify } from '@ember/string';\n  \n   classify('innerHTML');                   // 'InnerHTML'\n   classify('action_name');                 // 'ActionName'\n   classify('css-class-name');              // 'CssClassName'\n   classify('my favorite items');           // 'MyFavoriteItems'\n   classify('private-docs/owner-invoice');  // 'PrivateDocs/OwnerInvoice'\n   ```\n  \n   @method classify\n   @param {String} str the string to classify\n   @return {String} the classified string\n   @private\n   */\n  function classify(str) {\n    return CLASSIFY_CACHE.get(str);\n  }\n  /**\n   Converts a camelized string into all lower case separated by underscores.\n  \n   ```javascript\n   decamelize('innerHTML');          // 'inner_html'\n   decamelize('action_name');        // 'action_name'\n   decamelize('css-class-name');     // 'css-class-name'\n   decamelize('my favorite items');  // 'my favorite items'\n   ```\n   */\n  function decamelize(str) {\n    return DECAMELIZE_CACHE.get(str);\n  }\n});","define(\"@ember/-internals/utility-types/index\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});","define(\"@ember/-internals/utils/index\", [\"exports\", \"@glimmer/util\", \"@ember/debug\"], function (_exports, _util, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.ROOT = _exports.GUID_KEY = _exports.Cache = void 0;\n  _exports.canInvoke = canInvoke;\n  _exports.checkHasSuper = void 0;\n  _exports.dictionary = makeDictionary;\n  _exports.enumerableSymbol = enumerableSymbol;\n  _exports.generateGuid = generateGuid;\n  _exports.getDebugName = void 0;\n  _exports.getName = getName;\n  _exports.guidFor = guidFor;\n  _exports.intern = intern;\n  _exports.isInternalSymbol = isInternalSymbol;\n  _exports.isObject = isObject;\n  _exports.isProxy = isProxy;\n  _exports.lookupDescriptor = lookupDescriptor;\n  _exports.observerListenerMetaFor = observerListenerMetaFor;\n  _exports.setListeners = setListeners;\n  _exports.setName = setName;\n  _exports.setObservers = setObservers;\n  _exports.setProxy = setProxy;\n  _exports.teardownMandatorySetter = _exports.symbol = _exports.setupMandatorySetter = _exports.setWithMandatorySetter = void 0;\n  _exports.toString = toString;\n  _exports.uuid = uuid;\n  _exports.wrap = wrap;\n  /**\n    Strongly hint runtimes to intern the provided string.\n  \n    When do I need to use this function?\n  \n    For the most part, never. Pre-mature optimization is bad, and often the\n    runtime does exactly what you need it to, and more often the trade-off isn't\n    worth it.\n  \n    Why?\n  \n    Runtimes store strings in at least 2 different representations:\n    Ropes and Symbols (interned strings). The Rope provides a memory efficient\n    data-structure for strings created from concatenation or some other string\n    manipulation like splitting.\n  \n    Unfortunately checking equality of different ropes can be quite costly as\n    runtimes must resort to clever string comparison algorithms. These\n    algorithms typically cost in proportion to the length of the string.\n    Luckily, this is where the Symbols (interned strings) shine. As Symbols are\n    unique by their string content, equality checks can be done by pointer\n    comparison.\n  \n    How do I know if my string is a rope or symbol?\n  \n    Typically (warning general sweeping statement, but truthy in runtimes at\n    present) static strings created as part of the JS source are interned.\n    Strings often used for comparisons can be interned at runtime if some\n    criteria are met.  One of these criteria can be the size of the entire rope.\n    For example, in chrome 38 a rope longer then 12 characters will not\n    intern, nor will segments of that rope.\n  \n    Some numbers: http://jsperf.com/eval-vs-keys/8\n  \n    Known Trick™\n  \n    @private\n    @return {String} interned version of the provided string\n  */\n  function intern(str) {\n    var obj = Object.create(null);\n    obj[str] = 1;\n    for (var key in obj) {\n      if (key === str) {\n        return key;\n      }\n    }\n    return str;\n  }\n\n  /**\n    Returns whether Type(value) is Object.\n  \n    Useful for checking whether a value is a valid WeakMap key.\n  \n    Refs: https://tc39.github.io/ecma262/#sec-typeof-operator-runtime-semantics-evaluation\n          https://tc39.github.io/ecma262/#sec-weakmap.prototype.set\n  \n    @private\n    @function isObject\n  */\n  function isObject(value) {\n    return value !== null && (typeof value === 'object' || typeof value === 'function');\n  }\n\n  /**\n   @module @ember/object\n  */\n  /**\n   @private\n   @return {Number} the uuid\n   */\n  var _uuid = 0;\n  /**\n   Generates a universally unique identifier. This method\n   is used internally by Ember for assisting with\n   the generation of GUID's and other unique identifiers.\n  \n   @public\n   @return {Number} [description]\n   */\n  function uuid() {\n    return ++_uuid;\n  }\n  /**\n   Prefix used for guids through out Ember.\n   @private\n   @property GUID_PREFIX\n   @for Ember\n   @type String\n   @final\n   */\n  var GUID_PREFIX = 'ember';\n  // Used for guid generation...\n  var OBJECT_GUIDS = new WeakMap();\n  var NON_OBJECT_GUIDS = new Map();\n  /**\n    A unique key used to assign guids and other private metadata to objects.\n    If you inspect an object in your browser debugger you will often see these.\n    They can be safely ignored.\n  \n    On browsers that support it, these properties are added with enumeration\n    disabled so they won't show up when you iterate over your properties.\n  \n    @private\n    @property GUID_KEY\n    @for Ember\n    @type String\n    @final\n  */\n  var GUID_KEY = intern(`__ember${Date.now()}`);\n  /**\n    Generates a new guid, optionally saving the guid to the object that you\n    pass in. You will rarely need to use this method. Instead you should\n    call `guidFor(obj)`, which return an existing guid if available.\n  \n    @private\n    @method generateGuid\n    @static\n    @for @ember/object/internals\n    @param {Object} [obj] Object the guid will be used for. If passed in, the guid will\n      be saved on the object and reused whenever you pass the same object\n      again.\n  \n      If no object is passed, just generate a new guid.\n    @param {String} [prefix] Prefix to place in front of the guid. Useful when you want to\n      separate the guid into separate namespaces.\n    @return {String} the guid\n  */\n  _exports.GUID_KEY = GUID_KEY;\n  function generateGuid(obj, prefix) {\n    if (prefix === void 0) {\n      prefix = GUID_PREFIX;\n    }\n    var guid = prefix + uuid().toString();\n    if (isObject(obj)) {\n      OBJECT_GUIDS.set(obj, guid);\n    }\n    return guid;\n  }\n  /**\n    Returns a unique id for the object. If the object does not yet have a guid,\n    one will be assigned to it. You can call this on any object,\n    `EmberObject`-based or not.\n  \n    You can also use this method on DOM Element objects.\n  \n    @public\n    @static\n    @method guidFor\n    @for @ember/object/internals\n    @param {Object} obj any object, string, number, Element, or primitive\n    @return {String} the unique guid for this instance.\n  */\n  function guidFor(value) {\n    var guid;\n    if (isObject(value)) {\n      guid = OBJECT_GUIDS.get(value);\n      if (guid === undefined) {\n        guid = `${GUID_PREFIX}${uuid()}`;\n        OBJECT_GUIDS.set(value, guid);\n      }\n    } else {\n      guid = NON_OBJECT_GUIDS.get(value);\n      if (guid === undefined) {\n        var type = typeof value;\n        if (type === 'string') {\n          guid = `st${uuid()}`;\n        } else if (type === 'number') {\n          guid = `nu${uuid()}`;\n        } else if (type === 'symbol') {\n          guid = `sy${uuid()}`;\n        } else {\n          guid = `(${value})`;\n        }\n        NON_OBJECT_GUIDS.set(value, guid);\n      }\n    }\n    return guid;\n  }\n  var GENERATED_SYMBOLS = [];\n  function isInternalSymbol(possibleSymbol) {\n    return GENERATED_SYMBOLS.indexOf(possibleSymbol) !== -1;\n  }\n  // Some legacy symbols still need to be enumerable for a variety of reasons.\n  // This code exists for that, and as a fallback in IE11. In general, prefer\n  // `symbol` below when creating a new symbol.\n  function enumerableSymbol(debugName) {\n    // TODO: Investigate using platform symbols, but we do not\n    // want to require non-enumerability for this API, which\n    // would introduce a large cost.\n    var id = GUID_KEY + Math.floor(Math.random() * Date.now()).toString();\n    var symbol = intern(`__${debugName}${id}__`);\n    if (true /* DEBUG */) {\n      GENERATED_SYMBOLS.push(symbol);\n    }\n    return symbol;\n  }\n  var symbol = Symbol;\n\n  // the delete is meant to hint at runtimes that this object should remain in\n  // dictionary mode. This is clearly a runtime specific hack, but currently it\n  // appears worthwhile in some usecases. Please note, these deletes do increase\n  // the cost of creation dramatically over a plain Object.create. And as this\n  // only makes sense for long-lived dictionaries that aren't instantiated often.\n  _exports.symbol = symbol;\n  function makeDictionary(parent) {\n    var dict = Object.create(parent);\n    dict['_dict'] = null;\n    delete dict['_dict'];\n    return dict;\n  }\n  var getDebugName;\n  if (true /* DEBUG */) {\n    var getFunctionName = fn => {\n      var functionName = fn.name;\n      if (functionName === undefined) {\n        var match = Function.prototype.toString.call(fn).match(/function (\\w+)\\s*\\(/);\n        functionName = match && match[1] || '';\n      }\n      return functionName.replace(/^bound /, '');\n    };\n    var getObjectName = obj => {\n      var name;\n      var className;\n      if (obj.constructor && obj.constructor !== Object) {\n        className = getFunctionName(obj.constructor);\n      }\n      if ('toString' in obj && obj.toString !== Object.prototype.toString && obj.toString !== Function.prototype.toString) {\n        name = obj.toString();\n      }\n      // If the class has a decent looking name, and the `toString` is one of the\n      // default Ember toStrings, replace the constructor portion of the toString\n      // with the class name. We check the length of the class name to prevent doing\n      // this when the value is minified.\n      if (name && name.match(/<.*:ember\\d+>/) && className && className[0] !== '_' && className.length > 2 && className !== 'Class') {\n        return name.replace(/<.*:/, `<${className}:`);\n      }\n      return name || className;\n    };\n    var getPrimitiveName = value => {\n      return String(value);\n    };\n    getDebugName = value => {\n      if (typeof value === 'function') {\n        return getFunctionName(value) || `(unknown function)`;\n      } else if (typeof value === 'object' && value !== null) {\n        return getObjectName(value) || `(unknown object)`;\n      } else {\n        return getPrimitiveName(value);\n      }\n    };\n  }\n  var getDebugName$1 = getDebugName;\n  _exports.getDebugName = getDebugName$1;\n  var HAS_SUPER_PATTERN = /\\.(_super|call\\(this|apply\\(this)/;\n  var fnToString = Function.prototype.toString;\n  var checkHasSuper = (() => {\n    var sourceAvailable = fnToString.call(function () {\n      return this;\n    }).indexOf('return this') > -1;\n    if (sourceAvailable) {\n      return function checkHasSuper(func) {\n        return HAS_SUPER_PATTERN.test(fnToString.call(func));\n      };\n    }\n    return function checkHasSuper() {\n      return true;\n    };\n  })();\n  _exports.checkHasSuper = checkHasSuper;\n  var HAS_SUPER_MAP = new WeakMap();\n  var ROOT = Object.freeze(function () {});\n  _exports.ROOT = ROOT;\n  HAS_SUPER_MAP.set(ROOT, false);\n  function hasSuper(func) {\n    var hasSuper = HAS_SUPER_MAP.get(func);\n    if (hasSuper === undefined) {\n      hasSuper = checkHasSuper(func);\n      HAS_SUPER_MAP.set(func, hasSuper);\n    }\n    return hasSuper;\n  }\n  class ObserverListenerMeta {\n    constructor() {\n      this.listeners = undefined;\n      this.observers = undefined;\n    }\n  }\n  var OBSERVERS_LISTENERS_MAP = new WeakMap();\n  function createObserverListenerMetaFor(fn) {\n    var meta = OBSERVERS_LISTENERS_MAP.get(fn);\n    if (meta === undefined) {\n      meta = new ObserverListenerMeta();\n      OBSERVERS_LISTENERS_MAP.set(fn, meta);\n    }\n    return meta;\n  }\n  function observerListenerMetaFor(fn) {\n    return OBSERVERS_LISTENERS_MAP.get(fn);\n  }\n  function setObservers(func, observers) {\n    var meta = createObserverListenerMetaFor(func);\n    meta.observers = observers;\n  }\n  function setListeners(func, listeners) {\n    var meta = createObserverListenerMetaFor(func);\n    meta.listeners = listeners;\n  }\n  var IS_WRAPPED_FUNCTION_SET = new _util._WeakSet();\n  /**\n    Wraps the passed function so that `this._super` will point to the superFunc\n    when the function is invoked. This is the primitive we use to implement\n    calls to super.\n  \n    @private\n    @method wrap\n    @for Ember\n    @param {Function} func The function to call\n    @param {Function} superFunc The super function.\n    @return {Function} wrapped function.\n  */\n  function wrap(func, superFunc) {\n    if (!hasSuper(func)) {\n      return func;\n    }\n    // ensure an unwrapped super that calls _super is wrapped with a terminal _super\n    if (!IS_WRAPPED_FUNCTION_SET.has(superFunc) && hasSuper(superFunc)) {\n      return _wrap(func, _wrap(superFunc, ROOT));\n    }\n    return _wrap(func, superFunc);\n  }\n  function _wrap(func, superFunc) {\n    function superWrapper() {\n      var orig = this._super;\n      this._super = superFunc;\n      var ret = func.apply(this, arguments);\n      this._super = orig;\n      return ret;\n    }\n    IS_WRAPPED_FUNCTION_SET.add(superWrapper);\n    var meta = OBSERVERS_LISTENERS_MAP.get(func);\n    if (meta !== undefined) {\n      OBSERVERS_LISTENERS_MAP.set(superWrapper, meta);\n    }\n    return superWrapper;\n  }\n  function lookupDescriptor(obj, keyName) {\n    var current = obj;\n    do {\n      var descriptor = Object.getOwnPropertyDescriptor(current, keyName);\n      if (descriptor !== undefined) {\n        return descriptor;\n      }\n      current = Object.getPrototypeOf(current);\n    } while (current !== null);\n    return null;\n  }\n\n  /**\n    Checks to see if the `methodName` exists on the `obj`.\n  \n    ```javascript\n    let foo = { bar: function() { return 'bar'; }, baz: null };\n  \n    Ember.canInvoke(foo, 'bar'); // true\n    Ember.canInvoke(foo, 'baz'); // false\n    Ember.canInvoke(foo, 'bat'); // false\n    ```\n  \n    @method canInvoke\n    @for Ember\n    @param {Object} obj The object to check for the method\n    @param {String} methodName The method name to check for\n    @return {Boolean}\n    @private\n  */\n  function canInvoke(obj, methodName) {\n    return obj != null && typeof obj[methodName] === 'function';\n  }\n  /**\n    @module @ember/utils\n  */\n\n  var NAMES = new WeakMap();\n  function setName(obj, name) {\n    if (isObject(obj)) NAMES.set(obj, name);\n  }\n  function getName(obj) {\n    return NAMES.get(obj);\n  }\n  var objectToString = Object.prototype.toString;\n  function isNone(obj) {\n    return obj === null || obj === undefined;\n  }\n  /*\n   A `toString` util function that supports objects without a `toString`\n   method, e.g. an object created with `Object.create(null)`.\n  */\n  function toString(obj) {\n    if (typeof obj === 'string') {\n      return obj;\n    }\n    if (null === obj) return 'null';\n    if (undefined === obj) return 'undefined';\n    if (Array.isArray(obj)) {\n      // Reimplement Array.prototype.join according to spec (22.1.3.13)\n      // Changing ToString(element) with this safe version of ToString.\n      var r = '';\n      for (var k = 0; k < obj.length; k++) {\n        if (k > 0) {\n          r += ',';\n        }\n        if (!isNone(obj[k])) {\n          r += toString(obj[k]);\n        }\n      }\n      return r;\n    }\n    if (typeof obj.toString === 'function') {\n      return obj.toString();\n    }\n    return objectToString.call(obj);\n  }\n  var PROXIES = new _util._WeakSet();\n  function isProxy(value) {\n    if (isObject(value)) {\n      return PROXIES.has(value);\n    }\n    return false;\n  }\n  function setProxy(object) {\n    if (isObject(object)) {\n      PROXIES.add(object);\n    }\n  }\n  class Cache {\n    constructor(limit, func, store) {\n      if (store === void 0) {\n        store = new Map();\n      }\n      this.limit = limit;\n      this.func = func;\n      this.store = store;\n      this.size = 0;\n      this.misses = 0;\n      this.hits = 0;\n    }\n    get(key) {\n      if (this.store.has(key)) {\n        this.hits++;\n        // SAFETY: we know the value is present because `.has(key)` was `true`.\n        return this.store.get(key);\n      } else {\n        this.misses++;\n        return this.set(key, this.func(key));\n      }\n    }\n    set(key, value) {\n      if (this.limit > this.size) {\n        this.size++;\n        this.store.set(key, value);\n      }\n      return value;\n    }\n    purge() {\n      this.store.clear();\n      this.size = 0;\n      this.hits = 0;\n      this.misses = 0;\n    }\n  }\n  _exports.Cache = Cache;\n  var setupMandatorySetter;\n  _exports.setupMandatorySetter = setupMandatorySetter;\n  var teardownMandatorySetter;\n  _exports.teardownMandatorySetter = teardownMandatorySetter;\n  var setWithMandatorySetter;\n  _exports.setWithMandatorySetter = setWithMandatorySetter;\n  function isElementKey(key) {\n    return typeof key === 'number' ? isPositiveInt(key) : isStringInt(key);\n  }\n  function isStringInt(str) {\n    var num = parseInt(str, 10);\n    return isPositiveInt(num) && str === String(num);\n  }\n  function isPositiveInt(num) {\n    return num >= 0 && num % 1 === 0;\n  }\n  if (true /* DEBUG */) {\n    var SEEN_TAGS = new _util._WeakSet();\n    var MANDATORY_SETTERS = new WeakMap();\n    var _propertyIsEnumerable = function (obj, key) {\n      return Object.prototype.propertyIsEnumerable.call(obj, key);\n    };\n    _exports.setupMandatorySetter = setupMandatorySetter = function (tag, obj, keyName) {\n      if (SEEN_TAGS.has(tag)) {\n        return;\n      }\n      SEEN_TAGS.add(tag);\n      if (Array.isArray(obj) && isElementKey(keyName)) {\n        return;\n      }\n      var desc = lookupDescriptor(obj, keyName) || {};\n      if (desc.get || desc.set) {\n        // if it has a getter or setter, we can't install the mandatory setter.\n        // native setters are allowed, we have to assume that they will resolve\n        // to tracked properties.\n        return;\n      }\n      if (desc && (!desc.configurable || !desc.writable)) {\n        // if it isn't writable anyways, so we shouldn't provide the setter.\n        // if it isn't configurable, we can't overwrite it anyways.\n        return;\n      }\n      var setters = MANDATORY_SETTERS.get(obj);\n      if (setters === undefined) {\n        setters = {};\n        MANDATORY_SETTERS.set(obj, setters);\n      }\n      desc.hadOwnProperty = Object.hasOwnProperty.call(obj, keyName);\n      setters[keyName] = desc;\n      Object.defineProperty(obj, keyName, {\n        configurable: true,\n        enumerable: _propertyIsEnumerable(obj, keyName),\n        get() {\n          if (desc.get) {\n            return desc.get.call(this);\n          } else {\n            return desc.value;\n          }\n        },\n        set(value) {\n          (true && !(false) && (0, _debug.assert)(`You attempted to update ${this}.${String(keyName)} to \"${String(value)}\", but it is being tracked by a tracking context, such as a template, computed property, or observer. In order to make sure the context updates properly, you must invalidate the property when updating it. You can mark the property as \\`@tracked\\`, or use \\`@ember/object#set\\` to do this.`));\n        }\n      });\n    };\n    _exports.teardownMandatorySetter = teardownMandatorySetter = function (obj, keyName) {\n      var setters = MANDATORY_SETTERS.get(obj);\n      if (setters !== undefined && setters[keyName] !== undefined) {\n        Object.defineProperty(obj, keyName, setters[keyName]);\n        delete setters[keyName];\n      }\n    };\n    _exports.setWithMandatorySetter = setWithMandatorySetter = function (obj, keyName, value) {\n      var setters = MANDATORY_SETTERS.get(obj);\n      if (setters !== undefined && setters[keyName] !== undefined) {\n        var setter = setters[keyName];\n        if (setter.set) {\n          setter.set.call(obj, value);\n        } else {\n          setter.value = value;\n          // If the object didn't have own property before, it would have changed\n          // the enumerability after setting the value the first time.\n          if (!setter.hadOwnProperty) {\n            var desc = lookupDescriptor(obj, keyName);\n            desc.enumerable = true;\n            Object.defineProperty(obj, keyName, desc);\n          }\n        }\n      } else {\n        obj[keyName] = value;\n      }\n    };\n  }\n\n  /*\n   This package will be eagerly parsed and should have no dependencies on external\n   packages.\n  \n   It is intended to be used to share utility methods that will be needed\n   by every Ember application (and is **not** a dumping ground of useful utilities).\n  \n   Utility methods that are needed in < 80% of cases should be placed\n   elsewhere (so they can be lazily evaluated / parsed).\n  */\n});","define(\"@ember/-internals/views/index\", [\"exports\", \"@ember/-internals/views/lib/system/utils\", \"@ember/-internals/views/lib/system/event_dispatcher\", \"@ember/-internals/views/lib/component_lookup\", \"@ember/-internals/views/lib/views/core_view\", \"@ember/-internals/views/lib/mixins/class_names_support\", \"@ember/-internals/views/lib/mixins/child_views_support\", \"@ember/-internals/views/lib/mixins/view_state_support\", \"@ember/-internals/views/lib/mixins/view_support\", \"@ember/-internals/views/lib/mixins/action_support\", \"@ember/-internals/views/lib/compat/attrs\", \"@ember/-internals/views/lib/system/action_manager\"], function (_exports, _utils, _event_dispatcher, _component_lookup, _core_view, _class_names_support, _child_views_support, _view_state_support, _view_support, _action_support, _attrs, _action_manager) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"ActionManager\", {\n    enumerable: true,\n    get: function () {\n      return _action_manager.default;\n    }\n  });\n  Object.defineProperty(_exports, \"ActionSupport\", {\n    enumerable: true,\n    get: function () {\n      return _action_support.default;\n    }\n  });\n  Object.defineProperty(_exports, \"ChildViewsSupport\", {\n    enumerable: true,\n    get: function () {\n      return _child_views_support.default;\n    }\n  });\n  Object.defineProperty(_exports, \"ClassNamesSupport\", {\n    enumerable: true,\n    get: function () {\n      return _class_names_support.default;\n    }\n  });\n  Object.defineProperty(_exports, \"ComponentLookup\", {\n    enumerable: true,\n    get: function () {\n      return _component_lookup.default;\n    }\n  });\n  Object.defineProperty(_exports, \"CoreView\", {\n    enumerable: true,\n    get: function () {\n      return _core_view.default;\n    }\n  });\n  Object.defineProperty(_exports, \"EventDispatcher\", {\n    enumerable: true,\n    get: function () {\n      return _event_dispatcher.default;\n    }\n  });\n  Object.defineProperty(_exports, \"MUTABLE_CELL\", {\n    enumerable: true,\n    get: function () {\n      return _attrs.MUTABLE_CELL;\n    }\n  });\n  Object.defineProperty(_exports, \"ViewMixin\", {\n    enumerable: true,\n    get: function () {\n      return _view_support.default;\n    }\n  });\n  Object.defineProperty(_exports, \"ViewStateSupport\", {\n    enumerable: true,\n    get: function () {\n      return _view_state_support.default;\n    }\n  });\n  Object.defineProperty(_exports, \"addChildView\", {\n    enumerable: true,\n    get: function () {\n      return _utils.addChildView;\n    }\n  });\n  Object.defineProperty(_exports, \"clearElementView\", {\n    enumerable: true,\n    get: function () {\n      return _utils.clearElementView;\n    }\n  });\n  Object.defineProperty(_exports, \"clearViewElement\", {\n    enumerable: true,\n    get: function () {\n      return _utils.clearViewElement;\n    }\n  });\n  Object.defineProperty(_exports, \"constructStyleDeprecationMessage\", {\n    enumerable: true,\n    get: function () {\n      return _utils.constructStyleDeprecationMessage;\n    }\n  });\n  Object.defineProperty(_exports, \"getChildViews\", {\n    enumerable: true,\n    get: function () {\n      return _utils.getChildViews;\n    }\n  });\n  Object.defineProperty(_exports, \"getElementView\", {\n    enumerable: true,\n    get: function () {\n      return _utils.getElementView;\n    }\n  });\n  Object.defineProperty(_exports, \"getRootViews\", {\n    enumerable: true,\n    get: function () {\n      return _utils.getRootViews;\n    }\n  });\n  Object.defineProperty(_exports, \"getViewBoundingClientRect\", {\n    enumerable: true,\n    get: function () {\n      return _utils.getViewBoundingClientRect;\n    }\n  });\n  Object.defineProperty(_exports, \"getViewBounds\", {\n    enumerable: true,\n    get: function () {\n      return _utils.getViewBounds;\n    }\n  });\n  Object.defineProperty(_exports, \"getViewClientRects\", {\n    enumerable: true,\n    get: function () {\n      return _utils.getViewClientRects;\n    }\n  });\n  Object.defineProperty(_exports, \"getViewElement\", {\n    enumerable: true,\n    get: function () {\n      return _utils.getViewElement;\n    }\n  });\n  Object.defineProperty(_exports, \"getViewId\", {\n    enumerable: true,\n    get: function () {\n      return _utils.getViewId;\n    }\n  });\n  Object.defineProperty(_exports, \"isSimpleClick\", {\n    enumerable: true,\n    get: function () {\n      return _utils.isSimpleClick;\n    }\n  });\n  Object.defineProperty(_exports, \"setElementView\", {\n    enumerable: true,\n    get: function () {\n      return _utils.setElementView;\n    }\n  });\n  Object.defineProperty(_exports, \"setViewElement\", {\n    enumerable: true,\n    get: function () {\n      return _utils.setViewElement;\n    }\n  });\n});","define(\"@ember/-internals/views/lib/compat/attrs\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.MUTABLE_CELL = void 0;\n  var MUTABLE_CELL = Symbol('MUTABLE_CELL');\n  _exports.MUTABLE_CELL = MUTABLE_CELL;\n});","define(\"@ember/-internals/views/lib/compat/fallback-view-registry\", [\"exports\", \"@ember/-internals/utils\"], function (_exports, _utils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = (0, _utils.dictionary)(null);\n  _exports.default = _default;\n});","define(\"@ember/-internals/views/lib/component_lookup\", [\"exports\", \"@ember/object\"], function (_exports, _object) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = _object.default.extend({\n    componentFor(name, owner) {\n      var fullName = `component:${name}`;\n      return owner.factoryFor(fullName);\n    },\n    layoutFor(name, owner, options) {\n      var templateFullName = `template:components/${name}`;\n      return owner.lookup(templateFullName, options);\n    }\n  });\n  _exports.default = _default;\n});","define(\"@ember/-internals/views/lib/mixins/action_support\", [\"exports\", \"@ember/-internals/metal\", \"@ember/object/mixin\", \"@ember/debug\"], function (_exports, _metal, _mixin, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n   @module ember\n  */\n\n  var ActionSupport = _mixin.default.create({\n    send(actionName) {\n      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        args[_key - 1] = arguments[_key];\n      }\n      (true && !(!this.isDestroying && !this.isDestroyed) && (0, _debug.assert)(`Attempted to call .send() with the action '${actionName}' on the destroyed object '${this}'.`, !this.isDestroying && !this.isDestroyed));\n      var action = this.actions && this.actions[actionName];\n      if (action) {\n        var shouldBubble = action.apply(this, args) === true;\n        if (!shouldBubble) {\n          return;\n        }\n      }\n      var target = (0, _metal.get)(this, 'target');\n      if (target) {\n        (true && !(typeof target.send === 'function') && (0, _debug.assert)(`The \\`target\\` for ${this} (${target}) does not have a \\`send\\` method`, typeof target.send === 'function'));\n        target.send(...arguments);\n      } else {\n        (true && !(action) && (0, _debug.assert)(`${(0, _debug.inspect)(this)} had no action handler for: ${actionName}`, action));\n      }\n    }\n  });\n  var _default = ActionSupport;\n  _exports.default = _default;\n});","define(\"@ember/-internals/views/lib/mixins/child_views_support\", [\"exports\", \"@ember/-internals/metal\", \"@ember/object/mixin\", \"@ember/-internals/views/lib/system/utils\"], function (_exports, _metal, _mixin, _utils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var ChildViewsSupport = _mixin.default.create({\n    /**\n      Array of child views. You should never edit this array directly.\n         @property childViews\n      @type Array\n      @default []\n      @private\n    */\n    childViews: (0, _metal.nativeDescDecorator)({\n      configurable: false,\n      enumerable: false,\n      get() {\n        return (0, _utils.getChildViews)(this);\n      }\n    }),\n    appendChild(view) {\n      (0, _utils.addChildView)(this, view);\n    }\n  });\n  var _default = ChildViewsSupport;\n  _exports.default = _default;\n});","define(\"@ember/-internals/views/lib/mixins/class_names_support\", [\"exports\", \"@ember/-internals/metal\", \"@ember/object/mixin\", \"@ember/debug\"], function (_exports, _metal, _mixin, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n  @module ember\n  */\n\n  var EMPTY_ARRAY = Object.freeze([]);\n  var ClassNamesSupport = _mixin.default.create({\n    concatenatedProperties: ['classNames', 'classNameBindings'],\n    init() {\n      this._super(...arguments);\n      (true && !((0, _metal.descriptorForProperty)(this, 'classNameBindings') === undefined && Array.isArray(this.classNameBindings)) && (0, _debug.assert)(`Only arrays are allowed for 'classNameBindings'`, (0, _metal.descriptorForProperty)(this, 'classNameBindings') === undefined && Array.isArray(this.classNameBindings)));\n      (true && !((0, _metal.descriptorForProperty)(this, 'classNames') === undefined && Array.isArray(this.classNames)) && (0, _debug.assert)(`Only arrays of static class strings are allowed for 'classNames'. For dynamic classes, use 'classNameBindings'.`, (0, _metal.descriptorForProperty)(this, 'classNames') === undefined && Array.isArray(this.classNames)));\n    },\n    /**\n      Standard CSS class names to apply to the view's outer element. This\n      property automatically inherits any class names defined by the view's\n      superclasses as well.\n         @property classNames\n      @type Array\n      @default ['ember-view']\n      @public\n    */\n    classNames: EMPTY_ARRAY,\n    /**\n      A list of properties of the view to apply as class names. If the property\n      is a string value, the value of that string will be applied as a class\n      name.\n         ```javascript\n      // Applies the 'high' class to the view element\n      import Component from '@ember/component';\n      Component.extend({\n        classNameBindings: ['priority'],\n        priority: 'high'\n      });\n      ```\n         If the value of the property is a Boolean, the name of that property is\n      added as a dasherized class name.\n         ```javascript\n      // Applies the 'is-urgent' class to the view element\n      import Component from '@ember/component';\n      Component.extend({\n        classNameBindings: ['isUrgent'],\n        isUrgent: true\n      });\n      ```\n         If you would prefer to use a custom value instead of the dasherized\n      property name, you can pass a binding like this:\n         ```javascript\n      // Applies the 'urgent' class to the view element\n      import Component from '@ember/component';\n      Component.extend({\n        classNameBindings: ['isUrgent:urgent'],\n        isUrgent: true\n      });\n      ```\n         If you would like to specify a class that should only be added when the\n      property is false, you can declare a binding like this:\n         ```javascript\n      // Applies the 'disabled' class to the view element\n      import Component from '@ember/component';\n      Component.extend({\n        classNameBindings: ['isEnabled::disabled'],\n        isEnabled: false\n      });\n      ```\n         This list of properties is inherited from the component's superclasses as well.\n         @property classNameBindings\n      @type Array\n      @default []\n      @public\n    */\n    classNameBindings: EMPTY_ARRAY\n  });\n  var _default = ClassNamesSupport;\n  _exports.default = _default;\n});","define(\"@ember/-internals/views/lib/mixins/view_state_support\", [\"exports\", \"@ember/object/mixin\"], function (_exports, _mixin) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n  @module ember\n  */\n\n  var ViewStateSupport = _mixin.default.create({\n    _transitionTo(state) {\n      var priorState = this._currentState;\n      var currentState = this._currentState = this._states[state];\n      this._state = state;\n      if (priorState && priorState.exit) {\n        priorState.exit(this);\n      }\n      if (currentState.enter) {\n        currentState.enter(this);\n      }\n    }\n  });\n  var _default = ViewStateSupport;\n  _exports.default = _default;\n});","define(\"@ember/-internals/views/lib/mixins/view_support\", [\"exports\", \"@ember/-internals/utils\", \"@ember/-internals/metal\", \"@ember/object/mixin\", \"@ember/debug\", \"@ember/-internals/browser-environment\", \"@ember/-internals/views/lib/system/utils\"], function (_exports, _utils, _metal, _mixin, _debug, _browserEnvironment, _utils2) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  function K() {\n    return this;\n  }\n  var ViewMixin = _mixin.default.create({\n    /**\n     A list of properties of the view to apply as attributes. If the property\n     is a string value, the value of that string will be applied as the value\n     for an attribute of the property's name.\n        The following example creates a tag like `<div priority=\"high\" />`.\n        ```app/components/my-component.js\n     import Component from '@ember/component';\n        export default Component.extend({\n        attributeBindings: ['priority'],\n        priority: 'high'\n      });\n     ```\n        If the value of the property is a Boolean, the attribute is treated as\n     an HTML Boolean attribute. It will be present if the property is `true`\n     and omitted if the property is `false`.\n        The following example creates markup like `<div visible />`.\n        ```app/components/my-component.js\n     import Component from '@ember/component';\n        export default Component.extend({\n        attributeBindings: ['visible'],\n        visible: true\n      });\n     ```\n        If you would prefer to use a custom value instead of the property name,\n     you can create the same markup as the last example with a binding like\n     this:\n        ```app/components/my-component.js\n     import Component from '@ember/component';\n        export default Component.extend({\n        attributeBindings: ['isVisible:visible'],\n        isVisible: true\n      });\n     ```\n        This list of attributes is inherited from the component's superclasses,\n     as well.\n        @property attributeBindings\n     @type Array\n     @default []\n     @public\n     */\n    concatenatedProperties: ['attributeBindings'],\n    // ..........................................................\n    // TEMPLATE SUPPORT\n    //\n    /**\n     Return the nearest ancestor that is an instance of the provided\n     class or mixin.\n        @method nearestOfType\n     @param {Class,Mixin} klass Subclass of Ember.View (or Ember.View itself),\n     or an instance of Mixin.\n     @return Ember.View\n     @deprecated use `yield` and contextual components for composition instead.\n     @private\n     */\n    nearestOfType(klass) {\n      var view = this.parentView;\n      var isOfType = klass instanceof _mixin.default ? view => klass.detect(view) : view => klass.detect(view.constructor);\n      while (view) {\n        if (isOfType(view)) {\n          return view;\n        }\n        view = view.parentView;\n      }\n      return;\n    },\n    /**\n     Return the nearest ancestor that has a given property.\n        @method nearestWithProperty\n     @param {String} property A property name\n     @return Ember.View\n     @deprecated use `yield` and contextual components for composition instead.\n     @private\n     */\n    nearestWithProperty(property) {\n      var view = this.parentView;\n      while (view) {\n        if (property in view) {\n          return view;\n        }\n        view = view.parentView;\n      }\n    },\n    /**\n     Renders the view again. This will work regardless of whether the\n     view is already in the DOM or not. If the view is in the DOM, the\n     rendering process will be deferred to give bindings a chance\n     to synchronize.\n        If children were added during the rendering process using `appendChild`,\n     `rerender` will remove them, because they will be added again\n     if needed by the next `render`.\n        In general, if the display of your view changes, you should modify\n     the DOM element directly instead of manually calling `rerender`, which can\n     be slow.\n        @method rerender\n     @public\n     */\n    rerender() {\n      return this._currentState.rerender(this);\n    },\n    // ..........................................................\n    // ELEMENT SUPPORT\n    //\n    /**\n     Returns the current DOM element for the view.\n         @property element\n      @type DOMElement\n      @public\n    */\n    element: (0, _metal.nativeDescDecorator)({\n      configurable: false,\n      enumerable: false,\n      get() {\n        return this.renderer.getElement(this);\n      }\n    }),\n    /**\n     Appends the view's element to the specified parent element.\n        Note that this method just schedules the view to be appended; the DOM\n     element will not be appended to the given element until all bindings have\n     finished synchronizing.\n        This is not typically a function that you will need to call directly when\n     building your application. If you do need to use `appendTo`, be sure that\n     the target element you are providing is associated with an `Application`\n     and does not have an ancestor element that is associated with an Ember view.\n        @method appendTo\n     @param {String|DOMElement} A selector, element, HTML string\n     @return {Ember.View} receiver\n     @private\n     */\n    appendTo(selector) {\n      var target;\n      if (_browserEnvironment.hasDOM) {\n        (true && !(typeof selector === 'string' || selector instanceof Element) && (0, _debug.assert)(`Expected a selector or instance of Element`, typeof selector === 'string' || selector instanceof Element));\n        target = typeof selector === 'string' ? document.querySelector(selector) : selector;\n        (true && !(target) && (0, _debug.assert)(`You tried to append to (${selector}) but that isn't in the DOM`, target));\n        (true && !(!(0, _utils2.matches)(target, '.ember-view')) && (0, _debug.assert)('You cannot append to an existing Ember.View.', !(0, _utils2.matches)(target, '.ember-view')));\n        (true && !((() => {\n          var node = target.parentNode;\n          while (node instanceof Element) {\n            if ((0, _utils2.matches)(node, '.ember-view')) {\n              return false;\n            }\n            node = node.parentNode;\n          }\n          return true;\n        })()) && (0, _debug.assert)('You cannot append to an existing Ember.View.', (() => {\n          var node = target.parentNode;\n          while (node instanceof Element) {\n            if ((0, _utils2.matches)(node, '.ember-view')) {\n              return false;\n            }\n            node = node.parentNode;\n          }\n          return true;\n        })()));\n      } else {\n        target = selector;\n        (true && !(typeof target !== 'string') && (0, _debug.assert)(`You tried to append to a selector string (${selector}) in an environment without a DOM`, typeof target !== 'string'));\n        (true && !(typeof target.appendChild === 'function') && (0, _debug.assert)(`You tried to append to a non-Element (${selector}) in an environment without a DOM`, typeof target.appendChild === 'function'));\n      }\n      // SAFETY: SimpleElement is supposed to be a subset of Element so this _should_ be safe.\n      // However, the types are more specific in some places which necessitates the `as`.\n      this.renderer.appendTo(this, target);\n      return this;\n    },\n    /**\n     Appends the view's element to the document body. If the view does\n     not have an HTML representation yet\n     the element will be generated automatically.\n        If your application uses the `rootElement` property, you must append\n     the view within that element. Rendering views outside of the `rootElement`\n     is not supported.\n        Note that this method just schedules the view to be appended; the DOM\n     element will not be appended to the document body until all bindings have\n     finished synchronizing.\n        @method append\n     @return {Ember.View} receiver\n     @private\n     */\n    append() {\n      return this.appendTo(document.body);\n    },\n    /**\n     The HTML `id` of the view's element in the DOM. You can provide this\n     value yourself but it must be unique (just as in HTML):\n        ```handlebars\n     {{my-component elementId=\"a-really-cool-id\"}}\n     ```\n        If not manually set a default value will be provided by the framework.\n        Once rendered an element's `elementId` is considered immutable and you\n     should never change it. If you need to compute a dynamic value for the\n     `elementId`, you should do this when the component or element is being\n     instantiated:\n        ```app/components/my-component.js\n     import Component from '@ember/component';\n        export default Component.extend({\n        init() {\n          this._super(...arguments);\n          let index = this.get('index');\n          this.set('elementId', 'component-id' + index);\n        }\n      });\n     ```\n        @property elementId\n     @type String\n     @public\n     */\n    elementId: null,\n    /**\n     Called when a view is going to insert an element into the DOM.\n        @event willInsertElement\n     @public\n     */\n    willInsertElement: K,\n    /**\n     Called when the element of the view has been inserted into the DOM.\n     Override this function to do any set up that requires an element\n     in the document body.\n        When a view has children, didInsertElement will be called on the\n     child view(s) first and on itself afterwards.\n        @event didInsertElement\n     @public\n     */\n    didInsertElement: K,\n    /**\n     Called when the view is about to rerender, but before anything has\n     been torn down. This is a good opportunity to tear down any manual\n     observers you have installed based on the DOM state\n        @event willClearRender\n     @public\n     */\n    willClearRender: K,\n    /**\n     You must call `destroy` on a view to destroy the view (and all of its\n     child views). This will remove the view from any parent node, then make\n     sure that the DOM element managed by the view can be released by the\n     memory manager.\n        @method destroy\n     @private\n     */\n    destroy() {\n      this._super(...arguments);\n      this._currentState.destroy(this);\n    },\n    /**\n     Called when the element of the view is going to be destroyed. Override\n     this function to do any teardown that requires an element, like removing\n     event listeners.\n        Please note: any property changes made during this event will have no\n     effect on object observers.\n        @event willDestroyElement\n     @public\n     */\n    willDestroyElement: K,\n    /**\n     Called after the element of the view is destroyed.\n        @event willDestroyElement\n     @public\n     */\n    didDestroyElement: K,\n    /**\n     Called when the parentView property has changed.\n        @event parentViewDidChange\n     @private\n     */\n    parentViewDidChange: K,\n    // ..........................................................\n    // STANDARD RENDER PROPERTIES\n    //\n    /**\n     Tag name for the view's outer element. The tag name is only used when an\n     element is first created. If you change the `tagName` for an element, you\n     must destroy and recreate the view element.\n        By default, the render buffer will use a `<div>` tag for views.\n        If the tagName is `''`, the view will be tagless, with no outer element.\n     Component properties that depend on the presence of an outer element, such\n     as `classNameBindings` and `attributeBindings`, do not work with tagless\n     components. Tagless components cannot implement methods to handle events,\n     and their `element` property has a `null` value.\n        @property tagName\n     @type String\n     @default null\n     @public\n     */\n    // We leave this null by default so we can tell the difference between\n    // the default case and a user-specified tag.\n    tagName: null,\n    // .......................................................\n    // CORE DISPLAY METHODS\n    //\n    /**\n     Setup a view, but do not finish waking it up.\n        * configure `childViews`\n     * register the view with the global views hash, which is used for event\n     dispatch\n        @method init\n     @private\n     */\n    init() {\n      this._super(...arguments);\n      (true && !((0, _metal.descriptorForProperty)(this, 'elementId') === undefined) && (0, _debug.assert)(`You cannot use a computed property for the component's \\`elementId\\` (${this}).`, (0, _metal.descriptorForProperty)(this, 'elementId') === undefined));\n      (true && !((0, _metal.descriptorForProperty)(this, 'tagName') === undefined) && (0, _debug.assert)(`You cannot use a computed property for the component's \\`tagName\\` (${this}).`, (0, _metal.descriptorForProperty)(this, 'tagName') === undefined));\n      if (!this.elementId && this.tagName !== '') {\n        this.elementId = (0, _utils.guidFor)(this);\n      }\n      (true && !(!this.render) && (0, _debug.assert)('Using a custom `.render` function is no longer supported.', !this.render));\n    },\n    // .......................................................\n    // EVENT HANDLING\n    //\n    /**\n     Handle events from `EventDispatcher`\n        @method handleEvent\n     @param eventName {String}\n     @param evt {Event}\n     @private\n     */\n    handleEvent(eventName, evt) {\n      return this._currentState.handleEvent(this, eventName, evt);\n    }\n  });\n  var _default = ViewMixin;\n  _exports.default = _default;\n});","define(\"@ember/-internals/views/lib/system/action_manager\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = ActionManager;\n  /**\n  @module ember\n  */\n  function ActionManager() {}\n  /**\n    Global action id hash.\n  \n    @private\n    @property registeredActions\n    @type Object\n  */\n  ActionManager.registeredActions = {};\n});","define(\"@ember/-internals/views/lib/system/event_dispatcher\", [\"exports\", \"@ember/-internals/owner\", \"@ember/debug\", \"@ember/-internals/metal\", \"@ember/object\", \"@ember/-internals/views\", \"@ember/-internals/views/lib/system/action_manager\"], function (_exports, _owner, _debug, _metal, _object, _views, _action_manager) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n  @module ember\n  */\n  var ROOT_ELEMENT_CLASS = 'ember-application';\n  var ROOT_ELEMENT_SELECTOR = `.${ROOT_ELEMENT_CLASS}`;\n  /**\n    `Ember.EventDispatcher` handles delegating browser events to their\n    corresponding `Ember.Views.` For example, when you click on a view,\n    `Ember.EventDispatcher` ensures that that view's `mouseDown` method gets\n    called.\n  \n    @class EventDispatcher\n    @namespace Ember\n    @private\n    @extends EmberObject\n  */\n  class EventDispatcher extends _object.default {\n    constructor() {\n      super(...arguments);\n      /**\n        The set of events names (and associated handler function names) to be setup\n        and dispatched by the `EventDispatcher`. Modifications to this list can be done\n        at setup time, generally via the `Application.customEvents` hash.\n               To add new events to be listened to:\n               ```javascript\n        import Application from '@ember/application';\n               let App = Application.create({\n          customEvents: {\n            paste: 'paste'\n          }\n        });\n        ```\n               To prevent default events from being listened to:\n               ```javascript\n        import Application from '@ember/application';\n               let App = Application.create({\n          customEvents: {\n            mouseenter: null,\n            mouseleave: null\n          }\n        });\n        ```\n        @property events\n        @type Object\n        @private\n      */\n      this.events = {\n        touchstart: 'touchStart',\n        touchmove: 'touchMove',\n        touchend: 'touchEnd',\n        touchcancel: 'touchCancel',\n        keydown: 'keyDown',\n        keyup: 'keyUp',\n        keypress: 'keyPress',\n        mousedown: 'mouseDown',\n        mouseup: 'mouseUp',\n        contextmenu: 'contextMenu',\n        click: 'click',\n        dblclick: 'doubleClick',\n        focusin: 'focusIn',\n        focusout: 'focusOut',\n        submit: 'submit',\n        input: 'input',\n        change: 'change',\n        dragstart: 'dragStart',\n        drag: 'drag',\n        dragenter: 'dragEnter',\n        dragleave: 'dragLeave',\n        dragover: 'dragOver',\n        drop: 'drop',\n        dragend: 'dragEnd'\n      };\n      /**\n        The root DOM element to which event listeners should be attached. Event\n        listeners will be attached to the document unless this is overridden.\n               Can be specified as a DOMElement or a selector string.\n               The default body is a string since this may be evaluated before document.body\n        exists in the DOM.\n               @private\n        @property rootElement\n        @type DOMElement\n        @default 'body'\n      */\n      this.rootElement = 'body';\n      this._eventHandlers = Object.create(null);\n      this._didSetup = false;\n      this.finalEventNameMapping = null;\n      this._sanitizedRootElement = null;\n      this.lazyEvents = new Map();\n      this._reverseEventNameMapping = null;\n    }\n    /**\n      Sets up event listeners for standard browser events.\n         This will be called after the browser sends a `DOMContentReady` event. By\n      default, it will set up all of the listeners on the document body. If you\n      would like to register the listeners on a different element, set the event\n      dispatcher's `root` property.\n         @private\n      @method setup\n      @param addedEvents {Object}\n    */\n    setup(addedEvents, _rootElement) {\n      var _a;\n      (true && !((() => {\n        var owner = (0, _owner.getOwner)(this);\n        (true && !(owner) && (0, _debug.assert)('[BUG] Missing owner', owner)); // SAFETY: This is not guaranteed to be safe, but this is what we expect to be returned.\n        var environment = owner.lookup('-environment:main');\n        return environment.isInteractive;\n      })()) && (0, _debug.assert)('EventDispatcher should never be setup in fastboot mode. Please report this as an Ember bug.', (() => {\n        var owner = (0, _owner.getOwner)(this);\n        (true && !(owner) && (0, _debug.assert)('[BUG] Missing owner', owner));\n        var environment = owner.lookup('-environment:main');\n        return environment.isInteractive;\n      })()));\n      var events = this.finalEventNameMapping = Object.assign(Object.assign({}, (0, _metal.get)(this, 'events')), addedEvents);\n      this._reverseEventNameMapping = Object.keys(events).reduce((result, key) => {\n        var eventName = events[key];\n        return eventName ? Object.assign(Object.assign({}, result), {\n          [eventName]: key\n        }) : result;\n      }, {});\n      var lazyEvents = this.lazyEvents;\n      if (_rootElement !== undefined && _rootElement !== null) {\n        (0, _metal.set)(this, 'rootElement', _rootElement);\n      }\n      var specifiedRootElement = (0, _metal.get)(this, 'rootElement');\n      var rootElement = typeof specifiedRootElement !== 'string' ? specifiedRootElement : document.querySelector(specifiedRootElement);\n      (true && !(rootElement) && (0, _debug.assert)(`Could not find rootElement (${specifiedRootElement})`, rootElement));\n      (true && !(!rootElement.classList.contains(ROOT_ELEMENT_CLASS)) && (0, _debug.assert)(`You cannot use the same root element (${specifiedRootElement}) multiple times in an Ember.Application`, !rootElement.classList.contains(ROOT_ELEMENT_CLASS)));\n      (true && !((() => {\n        var target = rootElement.parentNode;\n        while (target instanceof Element) {\n          if (target.classList.contains(ROOT_ELEMENT_CLASS)) {\n            return false;\n          }\n          target = target.parentNode;\n        }\n        return true;\n      })()) && (0, _debug.assert)('You cannot make a new Ember.Application using a root element that is a descendent of an existing Ember.Application', (() => {\n        var target = rootElement.parentNode;\n        while (target instanceof Element) {\n          if (target.classList.contains(ROOT_ELEMENT_CLASS)) {\n            return false;\n          }\n          target = target.parentNode;\n        }\n        return true;\n      })()));\n      (true && !(!rootElement.querySelector(ROOT_ELEMENT_SELECTOR)) && (0, _debug.assert)('You cannot make a new Ember.Application using a root element that is an ancestor of an existing Ember.Application', !rootElement.querySelector(ROOT_ELEMENT_SELECTOR)));\n      rootElement.classList.add(ROOT_ELEMENT_CLASS);\n      (true && !(rootElement.classList.contains(ROOT_ELEMENT_CLASS)) && (0, _debug.assert)(`Unable to add '${ROOT_ELEMENT_CLASS}' class to root element (${(0, _metal.get)(this, 'rootElement') || rootElement.tagName}). Make sure you set rootElement to the body or an element in the body.`, rootElement.classList.contains(ROOT_ELEMENT_CLASS))); // save off the final sanitized root element (for usage in setupHandler)\n      this._sanitizedRootElement = rootElement;\n      // setup event listeners for the non-lazily setup events\n      for (var event in events) {\n        if (Object.prototype.hasOwnProperty.call(events, event)) {\n          lazyEvents.set(event, (_a = events[event]) !== null && _a !== void 0 ? _a : null);\n        }\n      }\n      this._didSetup = true;\n    }\n    /**\n      Setup event listeners for the given browser event name\n         @private\n      @method setupHandlerForBrowserEvent\n      @param event the name of the event in the browser\n    */\n    setupHandlerForBrowserEvent(event) {\n      var _a;\n      (true && !(this.finalEventNameMapping) && (0, _debug.assert)('[BUG] Expected finalEventNameMapping to be set', this.finalEventNameMapping));\n      (true && !(this._sanitizedRootElement) && (0, _debug.assert)('[BUG] Expected _santizedRootElement to be set', this._sanitizedRootElement));\n      this.setupHandler(this._sanitizedRootElement, event, (_a = this.finalEventNameMapping[event]) !== null && _a !== void 0 ? _a : null);\n    }\n    /**\n      Setup event listeners for the given Ember event name (camel case)\n         @private\n      @method setupHandlerForEmberEvent\n      @param eventName\n    */\n    setupHandlerForEmberEvent(eventName) {\n      var _a;\n      (true && !(this._sanitizedRootElement) && (0, _debug.assert)('[BUG] Expected _sanitizedRootElement to be set', this._sanitizedRootElement));\n      var event = (_a = this._reverseEventNameMapping) === null || _a === void 0 ? void 0 : _a[eventName];\n      if (event) {\n        this.setupHandler(this._sanitizedRootElement, event, eventName);\n      }\n    }\n    /**\n      Registers an event listener on the rootElement. If the given event is\n      triggered, the provided event handler will be triggered on the target view.\n         If the target view does not implement the event handler, or if the handler\n      returns `false`, the parent view will be called. The event will continue to\n      bubble to each successive parent view until it reaches the top.\n         @private\n      @method setupHandler\n      @param {Element} rootElement\n      @param {String} event the name of the event in the browser\n      @param {String} eventName the name of the method to call on the view\n    */\n    setupHandler(rootElement, event, eventName) {\n      if (eventName === null || !this.lazyEvents.has(event)) {\n        return; // nothing to do\n      }\n\n      var viewHandler = (target, event) => {\n        // SAFETY: SimpleElement is supposed to be a subset of Element so this _should_ be safe.\n        // However, the types are more specific in some places which necessitates the `as`.\n        var view = (0, _views.getElementView)(target);\n        var result = true;\n        if (view) {\n          // SAFETY: As currently written, this is not safe. Though it seems to always be true.\n          result = view.handleEvent(eventName, event);\n        }\n        return result;\n      };\n      var actionHandler = (target, event) => {\n        var actionId = target.getAttribute('data-ember-action');\n        var actions;\n        // In Glimmer2 this attribute is set to an empty string and an additional\n        // attribute it set for each action on a given element. In this case, the\n        // attributes need to be read so that a proper set of action handlers can\n        // be coalesced.\n        if (actionId === '') {\n          actions = [];\n          for (var attr of target.attributes) {\n            var attrName = attr.name;\n            if (attrName.indexOf('data-ember-action-') === 0) {\n              var action = _action_manager.default.registeredActions[attr.value];\n              (true && !(action) && (0, _debug.assert)('[BUG] Missing action', action));\n              actions.push(action);\n            }\n          }\n        } else if (actionId) {\n          // FIXME: This branch is never called in tests. Improve tests or remove\n          var actionState = _action_manager.default.registeredActions[actionId];\n          if (actionState) {\n            actions = [actionState];\n          }\n        }\n        // We have to check for actions here since in some cases, jQuery will trigger\n        // an event on `removeChild` (i.e. focusout) after we've already torn down the\n        // action handlers for the view.\n        if (!actions) {\n          // FIXME: This branch is never called in tests. Improve tests or remove\n          return;\n        }\n        var result = true;\n        for (var index = 0; index < actions.length; index++) {\n          var _action = actions[index];\n          if (_action && _action.eventName === eventName) {\n            // return false if any of the action handlers returns false\n            result = _action.handler(event) && result;\n          }\n        }\n        return result;\n      };\n      var handleEvent = this._eventHandlers[event] = event => {\n        var target = event.target;\n        (true && !(target instanceof Element) && (0, _debug.assert)(`[BUG] Received event without an Element target: ${event.type}, ${target}`, target instanceof Element));\n        do {\n          // SAFETY: SimpleElement is supposed to be a subset of Element so this _should_ be safe.\n          // However, the types are more specific in some places which necessitates the `as`.\n          if ((0, _views.getElementView)(target)) {\n            if (viewHandler(target, event) === false) {\n              event.preventDefault();\n              event.stopPropagation();\n              break;\n            } else if (event.cancelBubble === true) {\n              break;\n            }\n          } else if (typeof target.hasAttribute === 'function' && target.hasAttribute('data-ember-action')) {\n            if (actionHandler(target, event) === false) {\n              break;\n            }\n          }\n          target = target.parentNode;\n        } while (target instanceof Element);\n      };\n      rootElement.addEventListener(event, handleEvent);\n      this.lazyEvents.delete(event);\n    }\n    destroy() {\n      if (this._didSetup === false) {\n        return;\n      }\n      var rootElement = this._sanitizedRootElement;\n      if (!rootElement) {\n        return;\n      }\n      for (var event in this._eventHandlers) {\n        rootElement.removeEventListener(event, this._eventHandlers[event]);\n      }\n      rootElement.classList.remove(ROOT_ELEMENT_CLASS);\n      return this._super(...arguments);\n    }\n    toString() {\n      return '(EventDispatcher)';\n    }\n  }\n  _exports.default = EventDispatcher;\n});","define(\"@ember/-internals/views/lib/system/utils\", [\"exports\", \"@ember/-internals/owner\", \"@ember/-internals/utils\", \"@ember/debug\"], function (_exports, _owner, _utils, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.addChildView = addChildView;\n  _exports.clearElementView = clearElementView;\n  _exports.clearViewElement = clearViewElement;\n  _exports.collectChildViews = collectChildViews;\n  _exports.constructStyleDeprecationMessage = constructStyleDeprecationMessage;\n  _exports.contains = contains;\n  _exports.elMatches = void 0;\n  _exports.getChildViews = getChildViews;\n  _exports.getElementView = getElementView;\n  _exports.getRootViews = getRootViews;\n  _exports.getViewBoundingClientRect = getViewBoundingClientRect;\n  _exports.getViewBounds = getViewBounds;\n  _exports.getViewClientRects = getViewClientRects;\n  _exports.getViewElement = getViewElement;\n  _exports.getViewId = getViewId;\n  _exports.getViewRange = getViewRange;\n  _exports.initChildViews = initChildViews;\n  _exports.isSimpleClick = isSimpleClick;\n  _exports.matches = matches;\n  _exports.setElementView = setElementView;\n  _exports.setViewElement = setViewElement;\n  /**\n  @module ember\n  */\n  function isSimpleClick(event) {\n    if (!(event instanceof MouseEvent)) {\n      return false;\n    }\n    var modifier = event.shiftKey || event.metaKey || event.altKey || event.ctrlKey;\n    var secondaryClick = event.which > 1; // IE9 may return undefined\n    return !modifier && !secondaryClick;\n  }\n  function constructStyleDeprecationMessage(affectedStyle) {\n    return '' + 'Binding style attributes may introduce cross-site scripting vulnerabilities; ' + 'please ensure that values being bound are properly escaped. For more information, ' + 'including how to disable this warning, see ' + 'https://deprecations.emberjs.com/v1.x/#toc_binding-style-attributes. ' + 'Style affected: \"' + affectedStyle + '\"';\n  }\n  /**\n    @private\n    @method getRootViews\n    @param {Object} owner\n  */\n  function getRootViews(owner) {\n    var registry = owner.lookup('-view-registry:main');\n    var rootViews = [];\n    Object.keys(registry).forEach(id => {\n      var view = registry[id];\n      (true && !(view) && (0, _debug.assert)('expected view', view));\n      if (view.parentView === null) {\n        rootViews.push(view);\n      }\n    });\n    return rootViews;\n  }\n  /**\n    @private\n    @method getViewId\n    @param {Ember.View} view\n   */\n  function getViewId(view) {\n    if (view.tagName !== '' && view.elementId) {\n      return view.elementId;\n    } else {\n      return (0, _utils.guidFor)(view);\n    }\n  }\n  var ELEMENT_VIEW = new WeakMap();\n  var VIEW_ELEMENT = new WeakMap();\n  function getElementView(element) {\n    return ELEMENT_VIEW.get(element) || null;\n  }\n  /**\n    @private\n    @method getViewElement\n    @param {Ember.View} view\n   */\n  function getViewElement(view) {\n    return VIEW_ELEMENT.get(view) || null;\n  }\n  function setElementView(element, view) {\n    ELEMENT_VIEW.set(element, view);\n  }\n  function setViewElement(view, element) {\n    VIEW_ELEMENT.set(view, element);\n  }\n  // These are not needed for GC, but for correctness. We want to be able to\n  // null-out these links while the objects are still live. Specifically, in\n  // this case, we want to prevent access to the element (and vice verse) during\n  // destruction.\n  function clearElementView(element) {\n    ELEMENT_VIEW.delete(element);\n  }\n  function clearViewElement(view) {\n    VIEW_ELEMENT.delete(view);\n  }\n  var CHILD_VIEW_IDS = new WeakMap();\n  /**\n    @private\n    @method getChildViews\n    @param {Ember.View} view\n  */\n  function getChildViews(view) {\n    var owner = (0, _owner.getOwner)(view);\n    (true && !(owner) && (0, _debug.assert)('View is unexpectedly missing an owner', owner));\n    var registry = owner.lookup('-view-registry:main');\n    return collectChildViews(view, registry);\n  }\n  function initChildViews(view) {\n    var childViews = new Set();\n    CHILD_VIEW_IDS.set(view, childViews);\n    return childViews;\n  }\n  function addChildView(parent, child) {\n    var childViews = CHILD_VIEW_IDS.get(parent);\n    if (childViews === undefined) {\n      childViews = initChildViews(parent);\n    }\n    childViews.add(getViewId(child));\n  }\n  function collectChildViews(view, registry) {\n    var views = [];\n    var childViews = CHILD_VIEW_IDS.get(view);\n    if (childViews !== undefined) {\n      childViews.forEach(id => {\n        var view = registry[id];\n        if (view && !view.isDestroying && !view.isDestroyed) {\n          views.push(view);\n        }\n      });\n    }\n    return views;\n  }\n  /**\n    @private\n    @method getViewBounds\n    @param {Ember.View} view\n  */\n  function getViewBounds(view) {\n    return view.renderer.getBounds(view);\n  }\n  /**\n    @private\n    @method getViewRange\n    @param {Ember.View} view\n  */\n  function getViewRange(view) {\n    var bounds = getViewBounds(view);\n    var range = document.createRange();\n    range.setStartBefore(bounds.firstNode);\n    range.setEndAfter(bounds.lastNode);\n    return range;\n  }\n  /**\n    `getViewClientRects` provides information about the position of the border\n    box edges of a view relative to the viewport.\n  \n    It is only intended to be used by development tools like the Ember Inspector\n    and may not work on older browsers.\n  \n    @private\n    @method getViewClientRects\n    @param {Ember.View} view\n  */\n  function getViewClientRects(view) {\n    var range = getViewRange(view);\n    return range.getClientRects();\n  }\n  /**\n    `getViewBoundingClientRect` provides information about the position of the\n    bounding border box edges of a view relative to the viewport.\n  \n    It is only intended to be used by development tools like the Ember Inspector\n    and may not work on older browsers.\n  \n    @private\n    @method getViewBoundingClientRect\n    @param {Ember.View} view\n  */\n  function getViewBoundingClientRect(view) {\n    var range = getViewRange(view);\n    return range.getBoundingClientRect();\n  }\n  /**\n    Determines if the element matches the specified selector.\n  \n    @private\n    @method matches\n    @param {DOMElement} el\n    @param {String} selector\n  */\n  var elMatches = typeof Element !== 'undefined' ? Element.prototype.matches : undefined;\n  _exports.elMatches = elMatches;\n  function matches(el, selector) {\n    (true && !(elMatches !== undefined) && (0, _debug.assert)('cannot call `matches` in fastboot mode', elMatches !== undefined));\n    return elMatches.call(el, selector);\n  }\n  function contains(a, b) {\n    if (a.contains !== undefined) {\n      return a.contains(b);\n    }\n    var current = b.parentNode;\n    while (current && (current = current.parentNode)) {\n      if (current === a) {\n        return true;\n      }\n    }\n    return false;\n  }\n});","define(\"@ember/-internals/views/lib/views/core_view\", [\"exports\", \"@ember/-internals/metal\", \"@ember/-internals/runtime\", \"@ember/object/evented\", \"@ember/object/-internals\", \"@ember/-internals/views/lib/views/states\"], function (_exports, _metal, _runtime, _evented, _internals, _states) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var __decorate = void 0 && (void 0).__decorate || function (decorators, target, key, desc) {\n    var c = arguments.length,\n      r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n      d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) {\n      if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    }\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n  };\n  class CoreView extends _internals.FrameworkObject.extend(_evented.default, _runtime.ActionHandler) {\n    constructor() {\n      super(...arguments);\n      this.isView = true;\n    }\n    init(properties) {\n      var _a;\n      super.init(properties);\n      // Handle methods from Evented\n      // The native class inheritance will not work for mixins. To work around this,\n      // we copy the existing trigger and has methods provided by the mixin and swap in the\n      // new ones from our class.\n      this._superTrigger = this.trigger;\n      this.trigger = this._trigger;\n      this._superHas = this.has;\n      this.has = this._has;\n      (_a = this.parentView) !== null && _a !== void 0 ? _a : this.parentView = null;\n      this._state = 'preRender';\n      this._currentState = this._states.preRender;\n    }\n    instrumentDetails(hash) {\n      hash['object'] = this.toString();\n      hash['containerKey'] = this._debugContainerKey;\n      hash['view'] = this;\n      return hash;\n    }\n    /**\n      Override the default event firing from `Evented` to\n      also call methods with the given name.\n         @method trigger\n      @param name {String}\n      @private\n    */\n    // Changed to `trigger` on init\n    _trigger(name) {\n      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        args[_key - 1] = arguments[_key];\n      }\n      this._superTrigger(name, ...args);\n      var method = this[name];\n      if (typeof method === 'function') {\n        return method.apply(this, args);\n      }\n    }\n    // Changed to `has` on init\n    _has(name) {\n      return typeof this[name] === 'function' || this._superHas(name);\n    }\n  }\n  CoreView.isViewFactory = true;\n  __decorate([(0, _metal.inject)('renderer', '-dom')], CoreView.prototype, \"renderer\", void 0);\n  // Declare on the prototype to have a single shared value.\n  CoreView.prototype._states = _states.default;\n  var _default = CoreView;\n  _exports.default = _default;\n});","define(\"@ember/-internals/views/lib/views/states\", [\"exports\", \"@ember/-internals/utils\", \"@ember/debug\", \"@ember/instrumentation\", \"@ember/runloop\"], function (_exports, _utils, _debug, _instrumentation, _runloop) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var DEFAULT = Object.freeze({\n    // appendChild is only legal while rendering the buffer.\n    appendChild() {\n      throw new Error(\"You can't use appendChild outside of the rendering process\");\n    },\n    // Handle events from `Ember.EventDispatcher`\n    handleEvent() {\n      return true; // continue event propagation\n    },\n\n    rerender() {},\n    destroy() {}\n  });\n  var PRE_RENDER = Object.freeze(Object.assign({}, DEFAULT));\n  var HAS_ELEMENT = Object.freeze(Object.assign(Object.assign({}, DEFAULT), {\n    rerender(view) {\n      view.renderer.rerender();\n    },\n    destroy(view) {\n      view.renderer.remove(view);\n    },\n    // Handle events from `Ember.EventDispatcher`\n    handleEvent(view, eventName, event) {\n      if (view.has(eventName)) {\n        // Handler should be able to re-dispatch events, so we don't\n        // preventDefault or stopPropagation.\n        return (0, _instrumentation.flaggedInstrument)(`interaction.${eventName}`, {\n          event,\n          view\n        }, () => {\n          return (0, _runloop.join)(view, view.trigger, eventName, event);\n        });\n      } else {\n        return true; // continue event propagation\n      }\n    }\n  }));\n\n  var IN_DOM = Object.freeze(Object.assign(Object.assign({}, HAS_ELEMENT), {\n    enter(view) {\n      // Register the view for event handling. This hash is used by\n      // Ember.EventDispatcher to dispatch incoming events.\n      view.renderer.register(view);\n      if (true /* DEBUG */) {\n        var elementId = view.elementId;\n        (true && !(_utils.teardownMandatorySetter) && (0, _debug.assert)('[BUG] Expected teardownMandatorySetter to be set in DEBUG mode', teardownMandatorySetter));\n        (0, _utils.teardownMandatorySetter)(view, 'elementId');\n        Object.defineProperty(view, 'elementId', {\n          configurable: true,\n          enumerable: true,\n          get() {\n            return elementId;\n          },\n          set(value) {\n            if (value !== elementId) {\n              throw new Error(\"Changing a view's elementId after creation is not allowed\");\n            }\n          }\n        });\n      }\n    }\n  }));\n  var DESTROYING = Object.freeze(Object.assign(Object.assign({}, DEFAULT), {\n    appendChild() {\n      throw new Error(\"You can't call appendChild on a view being destroyed\");\n    },\n    rerender() {\n      throw new Error(\"You can't call rerender on a view being destroyed\");\n    }\n  }));\n  /*\n    Describe how the specified actions should behave in the various\n    states that a view can exist in. Possible states:\n  \n    * preRender: when a view is first instantiated, and after its\n      element was destroyed, it is in the preRender state\n    * hasElement: the DOM representation of the view is created,\n      and is ready to be inserted\n    * inDOM: once a view has been inserted into the DOM it is in\n      the inDOM state. A view spends the vast majority of its\n      existence in this state.\n    * destroyed: once a view has been destroyed (using the destroy\n      method), it is in this state. No further actions can be invoked\n      on a destroyed view.\n  */\n  var states = Object.freeze({\n    preRender: PRE_RENDER,\n    inDOM: IN_DOM,\n    hasElement: HAS_ELEMENT,\n    destroying: DESTROYING\n  });\n  var _default = states;\n  _exports.default = _default;\n});","define(\"@ember/application/index\", [\"exports\", \"@ember/owner\", \"@ember/-internals/utils\", \"@ember/-internals/environment\", \"@ember/-internals/browser-environment\", \"@ember/debug\", \"@ember/runloop\", \"@ember/-internals/metal\", \"@ember/application/lib/lazy_load\", \"@ember/-internals/runtime\", \"@ember/-internals/views\", \"@ember/routing/route\", \"@ember/routing/router\", \"@ember/routing/auto-location\", \"@ember/routing/hash-location\", \"@ember/routing/history-location\", \"@ember/routing/none-location\", \"@ember/routing/-internals\", \"@ember/application/instance\", \"@ember/engine\", \"@ember/-internals/container\", \"@ember/-internals/glimmer\", \"@ember/routing/router-service\"], function (_exports, _owner, _utils, _environment, _browserEnvironment, _debug, _runloop, _metal, _lazy_load, _runtime, _views, _route, _router, _autoLocation, _hashLocation, _historyLocation, _noneLocation, _internals, _instance, _engine, _container, _glimmer, _routerService) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"_loaded\", {\n    enumerable: true,\n    get: function () {\n      return _lazy_load._loaded;\n    }\n  });\n  _exports.getOwner = _exports.default = void 0;\n  Object.defineProperty(_exports, \"onLoad\", {\n    enumerable: true,\n    get: function () {\n      return _lazy_load.onLoad;\n    }\n  });\n  Object.defineProperty(_exports, \"runLoadHooks\", {\n    enumerable: true,\n    get: function () {\n      return _lazy_load.runLoadHooks;\n    }\n  });\n  _exports.setOwner = void 0;\n  /**\n  @module @ember/application\n  */\n\n  /**\n   * @deprecated Use `import { getOwner } from '@ember/owner';` instead.\n   */\n  var getOwner = _owner.getOwner;\n  /**\n   * @deprecated Use `import { setOwner } from '@ember/owner';` instead.\n   */\n  _exports.getOwner = getOwner;\n  var setOwner = _owner.setOwner;\n  /**\n    An instance of `Application` is the starting point for every Ember\n    application. It instantiates, initializes and coordinates the\n    objects that make up your app.\n  \n    Each Ember app has one and only one `Application` object. Although\n    Ember CLI creates this object implicitly, the `Application` class\n    is defined in the `app/app.js`. You can define a `ready` method on the\n    `Application` class, which will be run by Ember when the application is\n    initialized.\n  \n    ```app/app.js\n    export default class App extends Application {\n      ready() {\n        // your code here\n      }\n    }\n    ```\n  \n    Because `Application` ultimately inherits from `Ember.Namespace`, any classes\n    you create will have useful string representations when calling `toString()`.\n    See the `Ember.Namespace` documentation for more information.\n  \n    While you can think of your `Application` as a container that holds the\n    other classes in your application, there are several other responsibilities\n    going on under-the-hood that you may want to understand. It is also important\n    to understand that an `Application` is different from an `ApplicationInstance`.\n    Refer to the Guides to understand the difference between these.\n  \n    ### Event Delegation\n  \n    Ember uses a technique called _event delegation_. This allows the framework\n    to set up a global, shared event listener instead of requiring each view to\n    do it manually. For example, instead of each view registering its own\n    `mousedown` listener on its associated element, Ember sets up a `mousedown`\n    listener on the `body`.\n  \n    If a `mousedown` event occurs, Ember will look at the target of the event and\n    start walking up the DOM node tree, finding corresponding views and invoking\n    their `mouseDown` method as it goes.\n  \n    `Application` has a number of default events that it listens for, as\n    well as a mapping from lowercase events to camel-cased view method names. For\n    example, the `keypress` event causes the `keyPress` method on the view to be\n    called, the `dblclick` event causes `doubleClick` to be called, and so on.\n  \n    If there is a bubbling browser event that Ember does not listen for by\n    default, you can specify custom events and their corresponding view method\n    names by setting the application's `customEvents` property:\n  \n    ```app/app.js\n    import Application from '@ember/application';\n  \n    export default class App extends Application {\n      customEvents = {\n        // add support for the paste event\n        paste: 'paste'\n      }\n    }\n    ```\n  \n    To prevent Ember from setting up a listener for a default event,\n    specify the event name with a `null` value in the `customEvents`\n    property:\n  \n    ```app/app.js\n    import Application from '@ember/application';\n  \n    export default class App extends Application {\n      customEvents = {\n        // prevent listeners for mouseenter/mouseleave events\n        mouseenter: null,\n        mouseleave: null\n      }\n    }\n    ```\n  \n    By default, the application sets up these event listeners on the document\n    body. However, in cases where you are embedding an Ember application inside\n    an existing page, you may want it to set up the listeners on an element\n    inside the body.\n  \n    For example, if only events inside a DOM element with the ID of `ember-app`\n    should be delegated, set your application's `rootElement` property:\n  \n    ```app/app.js\n    import Application from '@ember/application';\n  \n    export default class App extends Application {\n      rootElement = '#ember-app'\n    }\n    ```\n  \n    The `rootElement` can be either a DOM element or a CSS selector\n    string. Note that *views appended to the DOM outside the root element will\n    not receive events.* If you specify a custom root element, make sure you only\n    append views inside it!\n  \n    To learn more about the events Ember components use, see\n  \n    [components/handling-events](https://guides.emberjs.com/release/components/handling-events/#toc_event-names).\n  \n    ### Initializers\n  \n    To add behavior to the Application's boot process, you can define initializers in\n    the `app/initializers` directory, or with `ember generate initializer` using Ember CLI.\n    These files should export a named `initialize` function which will receive the created `application`\n    object as its first argument.\n  \n    ```javascript\n    export function initialize(application) {\n      // application.inject('route', 'foo', 'service:foo');\n    }\n    ```\n  \n    Application initializers can be used for a variety of reasons including:\n  \n    - setting up external libraries\n    - injecting dependencies\n    - setting up event listeners in embedded apps\n    - deferring the boot process using the `deferReadiness` and `advanceReadiness` APIs.\n  \n    ### Routing\n  \n    In addition to creating your application's router, `Application` is\n    also responsible for telling the router when to start routing. Transitions\n    between routes can be logged with the `LOG_TRANSITIONS` flag, and more\n    detailed intra-transition logging can be logged with\n    the `LOG_TRANSITIONS_INTERNAL` flag:\n  \n    ```javascript\n    import Application from '@ember/application';\n  \n    let App = Application.create({\n      LOG_TRANSITIONS: true, // basic logging of successful transitions\n      LOG_TRANSITIONS_INTERNAL: true // detailed logging of all routing steps\n    });\n    ```\n  \n    By default, the router will begin trying to translate the current URL into\n    application state once the browser emits the `DOMContentReady` event. If you\n    need to defer routing, you can call the application's `deferReadiness()`\n    method. Once routing can begin, call the `advanceReadiness()` method.\n  \n    If there is any setup required before routing begins, you can implement a\n    `ready()` method on your app that will be invoked immediately before routing\n    begins.\n  \n    @class Application\n    @extends Engine\n    @public\n  */\n  _exports.setOwner = setOwner;\n  class Application extends _engine.default {\n    constructor() {\n      super(...arguments);\n      this._bootPromise = null;\n      this._bootResolver = null;\n    }\n    /**\n      This creates a registry with the default Ember naming conventions.\n         It also configures the registry:\n         * registered views are created every time they are looked up (they are\n        not singletons)\n      * registered templates are not factories; the registered value is\n        returned directly.\n      * the router receives the application as its `namespace` property\n      * all controllers receive the router as their `target` and `controllers`\n        properties\n      * all controllers receive the application as their `namespace` property\n      * the application view receives the application controller as its\n        `controller` property\n      * the application view receives the application template as its\n        `defaultTemplate` property\n         @method buildRegistry\n      @static\n      @param {Application} namespace the application for which to\n        build the registry\n      @return {Ember.Registry} the built registry\n      @private\n    */\n    static buildRegistry(namespace) {\n      var registry = super.buildRegistry(namespace);\n      commonSetupRegistry(registry);\n      (0, _glimmer.setupApplicationRegistry)(registry);\n      return registry;\n    }\n    init(properties) {\n      var _a, _b, _c, _d, _e, _f, _g, _h;\n      super.init(properties);\n      (_a = this.rootElement) !== null && _a !== void 0 ? _a : this.rootElement = 'body';\n      (_b = this._document) !== null && _b !== void 0 ? _b : this._document = null;\n      (_c = this.eventDispatcher) !== null && _c !== void 0 ? _c : this.eventDispatcher = null;\n      (_d = this.customEvents) !== null && _d !== void 0 ? _d : this.customEvents = null;\n      (_e = this.autoboot) !== null && _e !== void 0 ? _e : this.autoboot = true;\n      (_f = this._document) !== null && _f !== void 0 ? _f : this._document = _browserEnvironment.hasDOM ? window.document : null;\n      (_g = this._globalsMode) !== null && _g !== void 0 ? _g : this._globalsMode = true;\n      if (true /* DEBUG */) {\n        if (_environment.ENV.LOG_VERSION) {\n          // we only need to see this once per Application#init\n          _environment.ENV.LOG_VERSION = false;\n          (_h = _metal.libraries.logVersions) === null || _h === void 0 ? void 0 : _h.call(_metal.libraries);\n        }\n      }\n      // Start off the number of deferrals at 1. This will be decremented by\n      // the Application's own `boot` method.\n      this._readinessDeferrals = 1;\n      this._booted = false;\n      this._applicationInstances = new Set();\n      this.autoboot = this._globalsMode = Boolean(this.autoboot);\n      if (this._globalsMode) {\n        this._prepareForGlobalsMode();\n      }\n      if (this.autoboot) {\n        this.waitForDOMReady();\n      }\n    }\n    /**\n      Create an ApplicationInstance for this application.\n         @public\n      @method buildInstance\n      @return {ApplicationInstance} the application instance\n    */\n    buildInstance(options) {\n      if (options === void 0) {\n        options = {};\n      }\n      (true && !(!this.isDestroyed) && (0, _debug.assert)('You cannot build new instances of this application since it has already been destroyed', !this.isDestroyed));\n      (true && !(!this.isDestroying) && (0, _debug.assert)('You cannot build new instances of this application since it is being destroyed', !this.isDestroying));\n      return _instance.default.create(Object.assign(Object.assign({}, options), {\n        base: this,\n        application: this\n      }));\n    }\n    /**\n      Start tracking an ApplicationInstance for this application.\n      Used when the ApplicationInstance is created.\n         @private\n      @method _watchInstance\n    */\n    _watchInstance(instance) {\n      this._applicationInstances.add(instance);\n    }\n    /**\n      Stop tracking an ApplicationInstance for this application.\n      Used when the ApplicationInstance is about to be destroyed.\n         @private\n      @method _unwatchInstance\n    */\n    _unwatchInstance(instance) {\n      return this._applicationInstances.delete(instance);\n    }\n    /**\n      Enable the legacy globals mode by allowing this application to act\n      as a global namespace. See the docs on the `_globalsMode` property\n      for details.\n         Most of these features are already deprecated in 1.x, so we can\n      stop using them internally and try to remove them.\n         @private\n      @method _prepareForGlobalsMode\n    */\n    _prepareForGlobalsMode() {\n      // Create subclass of Router for this Application instance.\n      // This is to ensure that someone reopening `App.Router` does not\n      // tamper with the default `Router`.\n      this.Router = (this.Router || _router.default).extend();\n      this._buildDeprecatedInstance();\n    }\n    /*\n      Build the deprecated instance for legacy globals mode support.\n      Called when creating and resetting the application.\n         This is orthogonal to autoboot: the deprecated instance needs to\n      be created at Application construction (not boot) time to expose\n      App.__container__. If autoboot sees that this instance exists,\n      it will continue booting it to avoid doing unncessary work (as\n      opposed to building a new instance at boot time), but they are\n      otherwise unrelated.\n         @private\n      @method _buildDeprecatedInstance\n    */\n    _buildDeprecatedInstance() {\n      // Build a default instance\n      var instance = this.buildInstance();\n      // Legacy support for App.__container__ and other global methods\n      // on App that rely on a single, default instance.\n      this.__deprecatedInstance__ = instance;\n      this.__container__ = instance.__container__;\n    }\n    /**\n      Automatically kick-off the boot process for the application once the\n      DOM has become ready.\n         The initialization itself is scheduled on the actions queue which\n      ensures that code-loading finishes before booting.\n         If you are asynchronously loading code, you should call `deferReadiness()`\n      to defer booting, and then call `advanceReadiness()` once all of your code\n      has finished loading.\n         @private\n      @method waitForDOMReady\n    */\n    waitForDOMReady() {\n      var document = this._document;\n      // SAFETY: Casting as Document should be safe since we're just reading a property.\n      // If it's not actually a Document then it will evaluate false which is fine for our\n      // purposes.\n      if (document === null || document.readyState !== 'loading') {\n        (0, _runloop.schedule)('actions', this, this.domReady);\n      } else {\n        // Ideally we'd just check `document instanceof Document` but currently some tests pass a fake document.\n        (true && !(function (d) {\n          return typeof d.removeEventListener === 'function';\n        }(document)) && (0, _debug.assert)('[BUG] Called waitForDOMReady with an invalid document', function (d) {\n          return typeof d.removeEventListener === 'function';\n        }(document)));\n        var callback = () => {\n          document.removeEventListener('DOMContentLoaded', callback);\n          (0, _runloop.run)(this, this.domReady);\n        };\n        document.addEventListener('DOMContentLoaded', callback);\n      }\n    }\n    /**\n      This is the autoboot flow:\n         1. Boot the app by calling `this.boot()`\n      2. Create an instance (or use the `__deprecatedInstance__` in globals mode)\n      3. Boot the instance by calling `instance.boot()`\n      4. Invoke the `App.ready()` callback\n      5. Kick-off routing on the instance\n         Ideally, this is all we would need to do:\n         ```javascript\n      _autoBoot() {\n        this.boot().then(() => {\n          let instance = (this._globalsMode) ? this.__deprecatedInstance__ : this.buildInstance();\n          return instance.boot();\n        }).then((instance) => {\n          App.ready();\n          instance.startRouting();\n        });\n      }\n      ```\n         Unfortunately, we cannot actually write this because we need to participate\n      in the \"synchronous\" boot process. While the code above would work fine on\n      the initial boot (i.e. DOM ready), when `App.reset()` is called, we need to\n      boot a new instance synchronously (see the documentation on `_bootSync()`\n      for details).\n         Because of this restriction, the actual logic of this method is located\n      inside `didBecomeReady()`.\n         @private\n      @method domReady\n    */\n    domReady() {\n      if (this.isDestroying || this.isDestroyed) {\n        return;\n      }\n      this._bootSync();\n      // Continues to `didBecomeReady`\n    }\n    /**\n      Use this to defer readiness until some condition is true.\n         Example:\n         ```javascript\n      import Application from '@ember/application';\n         let App = Application.create();\n         App.deferReadiness();\n         fetch('/auth-token')\n      .then(response => response.json())\n      .then(data => {\n        App.token = data.token;\n        App.advanceReadiness();\n      });\n      ```\n         This allows you to perform asynchronous setup logic and defer\n      booting your application until the setup has finished.\n         However, if the setup requires a loading UI, it might be better\n      to use the router for this purpose.\n         @method deferReadiness\n      @public\n    */\n    deferReadiness() {\n      (true && !(this instanceof Application) && (0, _debug.assert)('You must call deferReadiness on an instance of Application', this instanceof Application));\n      (true && !(!this.isDestroyed) && (0, _debug.assert)('You cannot defer readiness since application has already destroyed', !this.isDestroyed));\n      (true && !(!this.isDestroying) && (0, _debug.assert)('You cannot defer readiness since the application is being destroyed', !this.isDestroying));\n      (true && !(this._readinessDeferrals > 0) && (0, _debug.assert)('You cannot defer readiness since the `ready()` hook has already been called', this._readinessDeferrals > 0));\n      this._readinessDeferrals++;\n    }\n    /**\n      Call `advanceReadiness` after any asynchronous setup logic has completed.\n      Each call to `deferReadiness` must be matched by a call to `advanceReadiness`\n      or the application will never become ready and routing will not begin.\n         @method advanceReadiness\n      @see {Application#deferReadiness}\n      @public\n    */\n    advanceReadiness() {\n      (true && !(this instanceof Application) && (0, _debug.assert)('You must call advanceReadiness on an instance of Application', this instanceof Application));\n      (true && !(!this.isDestroyed) && (0, _debug.assert)('You cannot advance readiness since application has already destroyed', !this.isDestroyed));\n      (true && !(!this.isDestroying) && (0, _debug.assert)('You cannot advance readiness since the application is being destroyed', !this.isDestroying));\n      (true && !(this._readinessDeferrals > 0) && (0, _debug.assert)('You cannot advance readiness since the `ready()` hook has already been called', this._readinessDeferrals > 0));\n      this._readinessDeferrals--;\n      if (this._readinessDeferrals === 0) {\n        (0, _runloop.once)(this, this.didBecomeReady);\n      }\n    }\n    /**\n      Initialize the application and return a promise that resolves with the `Application`\n      object when the boot process is complete.\n         Run any application initializers and run the application load hook. These hooks may\n      choose to defer readiness. For example, an authentication hook might want to defer\n      readiness until the auth token has been retrieved.\n         By default, this method is called automatically on \"DOM ready\"; however, if autoboot\n      is disabled, this is automatically called when the first application instance is\n      created via `visit`.\n         @public\n      @method boot\n      @return {Promise<Application,Error>}\n    */\n    boot() {\n      (true && !(!this.isDestroyed) && (0, _debug.assert)('You cannot boot this application since it has already been destroyed', !this.isDestroyed));\n      (true && !(!this.isDestroying) && (0, _debug.assert)('You cannot boot this application since it is being destroyed', !this.isDestroying));\n      if (this._bootPromise) {\n        return this._bootPromise;\n      }\n      try {\n        this._bootSync();\n      } catch (_) {\n        // Ignore the error: in the asynchronous boot path, the error is already reflected\n        // in the promise rejection\n      }\n      (true && !(this._bootPromise) && (0, _debug.assert)('has boot promise', this._bootPromise));\n      return this._bootPromise;\n    }\n    /**\n      Unfortunately, a lot of existing code assumes the booting process is\n      \"synchronous\". Specifically, a lot of tests assumes the last call to\n      `app.advanceReadiness()` or `app.reset()` will result in the app being\n      fully-booted when the current runloop completes.\n         We would like new code (like the `visit` API) to stop making this assumption,\n      so we created the asynchronous version above that returns a promise. But until\n      we have migrated all the code, we would have to expose this method for use\n      *internally* in places where we need to boot an app \"synchronously\".\n         @private\n    */\n    _bootSync() {\n      if (this._booted || this.isDestroying || this.isDestroyed) {\n        return;\n      }\n      // Even though this returns synchronously, we still need to make sure the\n      // boot promise exists for book-keeping purposes: if anything went wrong in\n      // the boot process, we need to store the error as a rejection on the boot\n      // promise so that a future caller of `boot()` can tell what failed.\n      var defer = this._bootResolver = _runtime.RSVP.defer();\n      this._bootPromise = defer.promise;\n      try {\n        this.runInitializers();\n        (0, _lazy_load.runLoadHooks)('application', this);\n        this.advanceReadiness();\n        // Continues to `didBecomeReady`\n      } catch (error) {\n        // For the asynchronous boot path\n        defer.reject(error);\n        // For the synchronous boot path\n        throw error;\n      }\n    }\n    /**\n      Reset the application. This is typically used only in tests. It cleans up\n      the application in the following order:\n         1. Deactivate existing routes\n      2. Destroy all objects in the container\n      3. Create a new application container\n      4. Re-route to the existing url\n         Typical Example:\n         ```javascript\n      import Application from '@ember/application';\n      let App;\n         run(function() {\n        App = Application.create();\n      });\n         module('acceptance test', {\n        setup: function() {\n          App.reset();\n        }\n      });\n         test('first test', function() {\n        // App is freshly reset\n      });\n         test('second test', function() {\n        // App is again freshly reset\n      });\n      ```\n         Advanced Example:\n         Occasionally you may want to prevent the app from initializing during\n      setup. This could enable extra configuration, or enable asserting prior\n      to the app becoming ready.\n         ```javascript\n      import Application from '@ember/application';\n      let App;\n         run(function() {\n        App = Application.create();\n      });\n         module('acceptance test', {\n        setup: function() {\n          run(function() {\n            App.reset();\n            App.deferReadiness();\n          });\n        }\n      });\n         test('first test', function() {\n        ok(true, 'something before app is initialized');\n           run(function() {\n          App.advanceReadiness();\n        });\n           ok(true, 'something after app is initialized');\n      });\n      ```\n         @method reset\n      @public\n    */\n    reset() {\n      (true && !(!this.isDestroyed) && (0, _debug.assert)('You cannot reset this application since it has already been destroyed', !this.isDestroyed));\n      (true && !(!this.isDestroying) && (0, _debug.assert)('You cannot reset this application since it is being destroyed', !this.isDestroying));\n      (true && !(this._globalsMode && this.autoboot) && (0, _debug.assert)(`Calling reset() on instances of \\`Application\\` is not\n            supported when globals mode is disabled; call \\`visit()\\` to\n            create new \\`ApplicationInstance\\`s and dispose them\n            via their \\`destroy()\\` method instead.`, this._globalsMode && this.autoboot));\n      var instance = this.__deprecatedInstance__;\n      this._readinessDeferrals = 1;\n      this._bootPromise = null;\n      this._bootResolver = null;\n      this._booted = false;\n      function handleReset() {\n        (true && !(instance) && (0, _debug.assert)('expected instance', instance));\n        (0, _runloop.run)(instance, 'destroy');\n        this._buildDeprecatedInstance();\n        (0, _runloop.schedule)('actions', this, '_bootSync');\n      }\n      (0, _runloop.join)(this, handleReset);\n    }\n    /**\n      @private\n      @method didBecomeReady\n    */\n    didBecomeReady() {\n      if (this.isDestroying || this.isDestroyed) {\n        return;\n      }\n      (true && !(this._bootResolver) && (0, _debug.assert)('expected _bootResolver', this._bootResolver));\n      try {\n        // TODO: Is this still needed for _globalsMode = false?\n        // See documentation on `_autoboot()` for details\n        if (this.autoboot) {\n          var instance;\n          if (this._globalsMode) {\n            // If we already have the __deprecatedInstance__ lying around, boot it to\n            // avoid unnecessary work\n            instance = this.__deprecatedInstance__;\n            (true && !(instance) && (0, _debug.assert)('expected instance', instance));\n          } else {\n            // Otherwise, build an instance and boot it. This is currently unreachable,\n            // because we forced _globalsMode to === autoboot; but having this branch\n            // allows us to locally toggle that flag for weeding out legacy globals mode\n            // dependencies independently\n            instance = this.buildInstance();\n          }\n          instance._bootSync();\n          // TODO: App.ready() is not called when autoboot is disabled, is this correct?\n          this.ready();\n          instance.startRouting();\n        }\n        // For the asynchronous boot path\n        this._bootResolver.resolve(this);\n        // For the synchronous boot path\n        this._booted = true;\n      } catch (error) {\n        // For the asynchronous boot path\n        this._bootResolver.reject(error);\n        // For the synchronous boot path\n        throw error;\n      }\n    }\n    /**\n      Called when the Application has become ready, immediately before routing\n      begins. The call will be delayed until the DOM has become ready.\n         @event ready\n      @public\n    */\n    ready() {\n      return this;\n    }\n    // This method must be moved to the application instance object\n    willDestroy() {\n      super.willDestroy();\n      if (_lazy_load._loaded['application'] === this) {\n        _lazy_load._loaded['application'] = undefined;\n      }\n      if (this._applicationInstances.size) {\n        this._applicationInstances.forEach(i => i.destroy());\n        this._applicationInstances.clear();\n      }\n    }\n    /**\n      Boot a new instance of `ApplicationInstance` for the current\n      application and navigate it to the given `url`. Returns a `Promise` that\n      resolves with the instance when the initial routing and rendering is\n      complete, or rejects with any error that occurred during the boot process.\n         When `autoboot` is disabled, calling `visit` would first cause the\n      application to boot, which runs the application initializers.\n         This method also takes a hash of boot-time configuration options for\n      customizing the instance's behavior. See the documentation on\n      `ApplicationInstance.BootOptions` for details.\n         `ApplicationInstance.BootOptions` is an interface class that exists\n      purely to document the available options; you do not need to construct it\n      manually. Simply pass a regular JavaScript object containing of the\n      desired options:\n         ```javascript\n      MyApp.visit(\"/\", { location: \"none\", rootElement: \"#container\" });\n      ```\n         ### Supported Scenarios\n         While the `BootOptions` class exposes a large number of knobs, not all\n      combinations of them are valid; certain incompatible combinations might\n      result in unexpected behavior.\n         For example, booting the instance in the full browser environment\n      while specifying a foreign `document` object (e.g. `{ isBrowser: true,\n      document: iframe.contentDocument }`) does not work correctly today,\n      largely due to Ember's jQuery dependency.\n         Currently, there are three officially supported scenarios/configurations.\n      Usages outside of these scenarios are not guaranteed to work, but please\n      feel free to file bug reports documenting your experience and any issues\n      you encountered to help expand support.\n         #### Browser Applications (Manual Boot)\n         The setup is largely similar to how Ember works out-of-the-box. Normally,\n      Ember will boot a default instance for your Application on \"DOM ready\".\n      However, you can customize this behavior by disabling `autoboot`.\n         For example, this allows you to render a miniture demo of your application\n      into a specific area on your marketing website:\n         ```javascript\n      import MyApp from 'my-app';\n         $(function() {\n        let App = MyApp.create({ autoboot: false });\n           let options = {\n          // Override the router's location adapter to prevent it from updating\n          // the URL in the address bar\n          location: 'none',\n             // Override the default `rootElement` on the app to render into a\n          // specific `div` on the page\n          rootElement: '#demo'\n        };\n           // Start the app at the special demo URL\n        App.visit('/demo', options);\n      });\n      ```\n         Or perhaps you might want to boot two instances of your app on the same\n      page for a split-screen multiplayer experience:\n         ```javascript\n      import MyApp from 'my-app';\n         $(function() {\n        let App = MyApp.create({ autoboot: false });\n           let sessionId = MyApp.generateSessionID();\n           let player1 = App.visit(`/matches/join?name=Player+1&session=${sessionId}`, { rootElement: '#left', location: 'none' });\n        let player2 = App.visit(`/matches/join?name=Player+2&session=${sessionId}`, { rootElement: '#right', location: 'none' });\n           Promise.all([player1, player2]).then(() => {\n          // Both apps have completed the initial render\n          $('#loading').fadeOut();\n        });\n      });\n      ```\n         Do note that each app instance maintains their own registry/container, so\n      they will run in complete isolation by default.\n         #### Server-Side Rendering (also known as FastBoot)\n         This setup allows you to run your Ember app in a server environment using\n      Node.js and render its content into static HTML for SEO purposes.\n         ```javascript\n      const HTMLSerializer = new SimpleDOM.HTMLSerializer(SimpleDOM.voidMap);\n         function renderURL(url) {\n        let dom = new SimpleDOM.Document();\n        let rootElement = dom.body;\n        let options = { isBrowser: false, document: dom, rootElement: rootElement };\n           return MyApp.visit(options).then(instance => {\n          try {\n            return HTMLSerializer.serialize(rootElement.firstChild);\n          } finally {\n            instance.destroy();\n          }\n        });\n      }\n      ```\n         In this scenario, because Ember does not have access to a global `document`\n      object in the Node.js environment, you must provide one explicitly. In practice,\n      in the non-browser environment, the stand-in `document` object only needs to\n      implement a limited subset of the full DOM API. The `SimpleDOM` library is known\n      to work.\n         Since there is no DOM access in the non-browser environment, you must also\n      specify a DOM `Element` object in the same `document` for the `rootElement` option\n      (as opposed to a selector string like `\"body\"`).\n         See the documentation on the `isBrowser`, `document` and `rootElement` properties\n      on `ApplicationInstance.BootOptions` for details.\n         #### Server-Side Resource Discovery\n         This setup allows you to run the routing layer of your Ember app in a server\n      environment using Node.js and completely disable rendering. This allows you\n      to simulate and discover the resources (i.e. AJAX requests) needed to fulfill\n      a given request and eagerly \"push\" these resources to the client.\n         ```app/initializers/network-service.js\n      import BrowserNetworkService from 'app/services/network/browser';\n      import NodeNetworkService from 'app/services/network/node';\n         // Inject a (hypothetical) service for abstracting all AJAX calls and use\n      // the appropriate implementation on the client/server. This also allows the\n      // server to log all the AJAX calls made during a particular request and use\n      // that for resource-discovery purpose.\n         export function initialize(application) {\n        if (window) { // browser\n          application.register('service:network', BrowserNetworkService);\n        } else { // node\n          application.register('service:network', NodeNetworkService);\n        }\n      };\n         export default {\n        name: 'network-service',\n        initialize: initialize\n      };\n      ```\n         ```app/routes/post.js\n      import Route from '@ember/routing/route';\n      import { service } from '@ember/service';\n         // An example of how the (hypothetical) service is used in routes.\n         export default class IndexRoute extends Route {\n        @service network;\n           model(params) {\n          return this.network.fetch(`/api/posts/${params.post_id}.json`);\n        }\n           afterModel(post) {\n          if (post.isExternalContent) {\n            return this.network.fetch(`/api/external/?url=${post.externalURL}`);\n          } else {\n            return post;\n          }\n        }\n      }\n      ```\n         ```javascript\n      // Finally, put all the pieces together\n         function discoverResourcesFor(url) {\n        return MyApp.visit(url, { isBrowser: false, shouldRender: false }).then(instance => {\n          let networkService = instance.lookup('service:network');\n          return networkService.requests; // => { \"/api/posts/123.json\": \"...\" }\n        });\n      }\n      ```\n         @public\n      @method visit\n      @param url {String} The initial URL to navigate to\n      @param options {ApplicationInstance.BootOptions}\n      @return {Promise<ApplicationInstance, Error>}\n    */\n    visit(url, options) {\n      (true && !(!this.isDestroyed) && (0, _debug.assert)('You cannot visit this application since it has already been destroyed', !this.isDestroyed));\n      (true && !(!this.isDestroying) && (0, _debug.assert)('You cannot visit this application since it is being destroyed', !this.isDestroying));\n      return this.boot().then(() => {\n        var instance = this.buildInstance();\n        return instance.boot(options).then(() => instance.visit(url)).catch(error => {\n          (0, _runloop.run)(instance, 'destroy');\n          throw error;\n        });\n      });\n    }\n  }\n  _exports.default = Application;\n  Application.initializer = (0, _engine.buildInitializerMethod)('initializers', 'initializer');\n  Application.instanceInitializer = (0, _engine.buildInitializerMethod)('instanceInitializers', 'instance initializer');\n  function commonSetupRegistry(registry) {\n    registry.register('router:main', _router.default);\n    registry.register('-view-registry:main', {\n      create() {\n        return (0, _utils.dictionary)(null);\n      }\n    });\n    registry.register('route:basic', _route.default);\n    registry.register('event_dispatcher:main', _views.EventDispatcher);\n    registry.register('location:auto', _autoLocation.default);\n    registry.register('location:hash', _hashLocation.default);\n    registry.register('location:history', _historyLocation.default);\n    registry.register('location:none', _noneLocation.default);\n    registry.register((0, _container.privatize)`-bucket-cache:main`, {\n      create() {\n        return new _internals.BucketCache();\n      }\n    });\n    registry.register('service:router', _routerService.default);\n  }\n});","define(\"@ember/application/instance\", [\"exports\", \"@ember/object\", \"@ember/-internals/browser-environment\", \"@ember/engine/instance\", \"@ember/-internals/glimmer\", \"@ember/debug\", \"@ember/routing/router\", \"@ember/-internals/views\"], function (_exports, _object, environment, _instance, _glimmer, _debug, _router, _views) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n  @module @ember/application\n  */\n\n  /**\n    The `ApplicationInstance` encapsulates all of the stateful aspects of a\n    running `Application`.\n  \n    At a high-level, we break application boot into two distinct phases:\n  \n    * Definition time, where all of the classes, templates, and other\n      dependencies are loaded (typically in the browser).\n    * Run time, where we begin executing the application once everything\n      has loaded.\n  \n    Definition time can be expensive and only needs to happen once since it is\n    an idempotent operation. For example, between test runs and FastBoot\n    requests, the application stays the same. It is only the state that we want\n    to reset.\n  \n    That state is what the `ApplicationInstance` manages: it is responsible for\n    creating the container that contains all application state, and disposing of\n    it once the particular test run or FastBoot request has finished.\n  \n    @public\n    @class ApplicationInstance\n    @extends EngineInstance\n  */\n  class ApplicationInstance extends _instance.default {\n    constructor() {\n      super(...arguments);\n      /**\n        The root DOM element of the Application as an element or a\n        CSS selector.\n               @private\n        @property {String|DOMElement} rootElement\n      */\n      this.rootElement = null;\n    }\n    init(properties) {\n      super.init(properties);\n      this.application._watchInstance(this);\n      // Register this instance in the per-instance registry.\n      //\n      // Why do we need to register the instance in the first place?\n      // Because we need a good way for the root route (a.k.a ApplicationRoute)\n      // to notify us when it has created the root-most view. That view is then\n      // appended to the rootElement, in the case of apps, to the fixture harness\n      // in tests, or rendered to a string in the case of FastBoot.\n      this.register('-application-instance:main', this, {\n        instantiate: false\n      });\n    }\n    /**\n      Overrides the base `EngineInstance._bootSync` method with concerns relevant\n      to booting application (instead of engine) instances.\n         This method should only contain synchronous boot concerns. Asynchronous\n      boot concerns should eventually be moved to the `boot` method, which\n      returns a promise.\n         Until all boot code has been made asynchronous, we need to continue to\n      expose this method for use *internally* in places where we need to boot an\n      instance synchronously.\n         @private\n    */\n    _bootSync(options) {\n      if (this._booted) {\n        return this;\n      }\n      options = new _BootOptions(options);\n      this.setupRegistry(options);\n      if (options.rootElement) {\n        this.rootElement = options.rootElement;\n      } else {\n        this.rootElement = this.application.rootElement;\n      }\n      if (options.location) {\n        (0, _object.set)(this.router, 'location', options.location);\n      }\n      this.application.runInstanceInitializers(this);\n      if (options.isInteractive) {\n        this.setupEventDispatcher();\n      }\n      this._booted = true;\n      return this;\n    }\n    setupRegistry(options) {\n      this.constructor.setupRegistry(this.__registry__, options);\n    }\n    get router() {\n      if (!this._router) {\n        var router = this.lookup('router:main');\n        (true && !(router instanceof _router.default) && (0, _debug.assert)('expected an instance of Router', router instanceof _router.default));\n        this._router = router;\n      }\n      return this._router;\n    }\n    /**\n      This hook is called by the root-most Route (a.k.a. the ApplicationRoute)\n      when it has finished creating the root View. By default, we simply take the\n      view and append it to the `rootElement` specified on the Application.\n         In cases like FastBoot and testing, we can override this hook and implement\n      custom behavior, such as serializing to a string and sending over an HTTP\n      socket rather than appending to DOM.\n         @param view {Ember.View} the root-most view\n      @deprecated\n      @private\n    */\n    didCreateRootView(view) {\n      view.appendTo(this.rootElement);\n    }\n    /**\n      Tells the router to start routing. The router will ask the location for the\n      current URL of the page to determine the initial URL to start routing to.\n      To start the app at a specific URL, call `handleURL` instead.\n         @private\n    */\n    startRouting() {\n      this.router.startRouting();\n    }\n    /**\n      Sets up the router, initializing the child router and configuring the\n      location before routing begins.\n         Because setup should only occur once, multiple calls to `setupRouter`\n      beyond the first call have no effect.\n         This is commonly used in order to confirm things that rely on the router\n      are functioning properly from tests that are primarily rendering related.\n         For example, from within [ember-qunit](https://github.com/emberjs/ember-qunit)'s\n      `setupRenderingTest` calling `this.owner.setupRouter()` would allow that\n      rendering test to confirm that any `<LinkTo></LinkTo>`'s that are rendered\n      have the correct URL.\n         @public\n    */\n    setupRouter() {\n      this.router.setupRouter();\n    }\n    /**\n      Directs the router to route to a particular URL. This is useful in tests,\n      for example, to tell the app to start at a particular URL.\n         @param url {String} the URL the router should route to\n      @private\n    */\n    handleURL(url) {\n      this.setupRouter();\n      return this.router.handleURL(url);\n    }\n    /**\n      @private\n    */\n    setupEventDispatcher() {\n      var dispatcher = this.lookup('event_dispatcher:main');\n      (true && !(dispatcher instanceof _views.EventDispatcher) && (0, _debug.assert)('expected EventDispatcher', dispatcher instanceof _views.EventDispatcher));\n      var applicationCustomEvents = (0, _object.get)(this.application, 'customEvents');\n      var instanceCustomEvents = (0, _object.get)(this, 'customEvents');\n      var customEvents = Object.assign({}, applicationCustomEvents, instanceCustomEvents);\n      (true && !(this.rootElement === null || typeof this.rootElement === 'string' || this.rootElement instanceof Element) && (0, _debug.assert)('[BUG] Tried to set up dispatcher with an invalid root element', this.rootElement === null || typeof this.rootElement === 'string' || this.rootElement instanceof Element));\n      dispatcher.setup(customEvents, this.rootElement);\n      return dispatcher;\n    }\n    /**\n      Returns the current URL of the app instance. This is useful when your\n      app does not update the browsers URL bar (i.e. it uses the `'none'`\n      location adapter).\n         @public\n      @return {String} the current URL\n    */\n    getURL() {\n      return this.router.url;\n    }\n    // `instance.visit(url)` should eventually replace `instance.handleURL()`;\n    // the test helpers can probably be switched to use this implementation too\n    /**\n      Navigate the instance to a particular URL. This is useful in tests, for\n      example, or to tell the app to start at a particular URL. This method\n      returns a promise that resolves with the app instance when the transition\n      is complete, or rejects if the transition was aborted due to an error.\n         @public\n      @param url {String} the destination URL\n      @return {Promise<ApplicationInstance>}\n    */\n    visit(url) {\n      this.setupRouter();\n      var bootOptions = this.__container__.lookup('-environment:main');\n      var router = this.router;\n      var handleTransitionResolve = () => {\n        if (!bootOptions.options.shouldRender) {\n          // No rendering is needed, and routing has completed, simply return.\n          return this;\n        } else {\n          // Ensure that the visit promise resolves when all rendering has completed\n          return (0, _glimmer.renderSettled)().then(() => this);\n        }\n      };\n      var handleTransitionReject = error => {\n        if (error.error) {\n          throw error.error;\n        } else if (error.name === 'TransitionAborted' && router._routerMicrolib.activeTransition) {\n          return router._routerMicrolib.activeTransition.then(handleTransitionResolve, handleTransitionReject);\n        } else if (error.name === 'TransitionAborted') {\n          throw new Error(error.message);\n        } else {\n          throw error;\n        }\n      };\n      var location = (0, _object.get)(router, 'location');\n      (true && !(typeof location !== 'string') && (0, _debug.assert)('location has been initialized', typeof location !== 'string')); // Keeps the location adapter's internal URL in-sync\n      location.setURL(url);\n      // getURL returns the set url with the rootURL stripped off\n      return router.handleURL(location.getURL()).then(handleTransitionResolve, handleTransitionReject);\n    }\n    willDestroy() {\n      super.willDestroy();\n      this.application._unwatchInstance(this);\n    }\n    /**\n     @private\n     @method setupRegistry\n     @param {Registry} registry\n     @param {BootOptions} options\n    */\n    static setupRegistry(registry, options) {\n      if (options === void 0) {\n        options = {};\n      }\n      var coptions = options instanceof _BootOptions ? options : new _BootOptions(options);\n      registry.register('-environment:main', coptions.toEnvironment(), {\n        instantiate: false\n      });\n      registry.register('service:-document', coptions.document, {\n        instantiate: false\n      });\n      super.setupRegistry(registry, coptions);\n    }\n  }\n  /**\n    A list of boot-time configuration options for customizing the behavior of\n    an `ApplicationInstance`.\n  \n    This is an interface class that exists purely to document the available\n    options; you do not need to construct it manually. Simply pass a regular\n    JavaScript object containing the desired options into methods that require\n    one of these options object:\n  \n    ```javascript\n    MyApp.visit(\"/\", { location: \"none\", rootElement: \"#container\" });\n    ```\n  \n    Not all combinations of the supported options are valid. See the documentation\n    on `Application#visit` for the supported configurations.\n  \n    Internal, experimental or otherwise unstable flags are marked as private.\n  \n    @class BootOptions\n    @namespace ApplicationInstance\n    @public\n  */\n  class _BootOptions {\n    constructor(options) {\n      if (options === void 0) {\n        options = {};\n      }\n      /**\n        If present, overrides the router's `location` property with this\n        value. This is useful for environments where trying to modify the\n        URL would be inappropriate.\n               @property location\n        @type string\n        @default null\n        @public\n      */\n      this.location = null;\n      this.isInteractive = Boolean(environment.hasDOM); // This default is overridable below\n      this._renderMode = options._renderMode;\n      if (options.isBrowser !== undefined) {\n        this.isBrowser = Boolean(options.isBrowser);\n      } else {\n        this.isBrowser = Boolean(environment.hasDOM);\n      }\n      if (!this.isBrowser) {\n        this.isInteractive = false;\n        this.location = 'none';\n      }\n      if (options.shouldRender !== undefined) {\n        this.shouldRender = Boolean(options.shouldRender);\n      } else {\n        this.shouldRender = true;\n      }\n      if (!this.shouldRender) {\n        this.isInteractive = false;\n      }\n      if (options.document) {\n        this.document = options.document;\n      } else {\n        this.document = typeof document !== 'undefined' ? document : null;\n      }\n      if (options.rootElement) {\n        this.rootElement = options.rootElement;\n      }\n      // Set these options last to give the user a chance to override the\n      // defaults from the \"combo\" options like `isBrowser` (although in\n      // practice, the resulting combination is probably invalid)\n      if (options.location !== undefined) {\n        this.location = options.location;\n      }\n      if (options.isInteractive !== undefined) {\n        this.isInteractive = Boolean(options.isInteractive);\n      }\n    }\n    toEnvironment() {\n      // Do we really want to assign all of this!?\n      return Object.assign(Object.assign({}, environment), {\n        // For compatibility with existing code\n        hasDOM: this.isBrowser,\n        isInteractive: this.isInteractive,\n        _renderMode: this._renderMode,\n        options: this\n      });\n    }\n  }\n  var _default = ApplicationInstance;\n  _exports.default = _default;\n});","define(\"@ember/application/lib/lazy_load\", [\"exports\", \"@ember/-internals/environment\", \"@ember/-internals/browser-environment\"], function (_exports, _environment, _browserEnvironment) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports._loaded = void 0;\n  _exports.onLoad = onLoad;\n  _exports.runLoadHooks = runLoadHooks;\n  /*globals CustomEvent */\n\n  /**\n    @module @ember/application\n  */\n  var loadHooks = _environment.ENV.EMBER_LOAD_HOOKS || {};\n  var loaded = {};\n  var _loaded = loaded;\n  /**\n    Detects when a specific package of Ember (e.g. 'Application')\n    has fully loaded and is available for extension.\n  \n    The provided `callback` will be called with the `name` passed\n    resolved from a string into the object:\n  \n    ``` javascript\n    import { onLoad } from '@ember/application';\n  \n    onLoad('Ember.Application' function(hbars) {\n      hbars.registerHelper(...);\n    });\n    ```\n  \n    @method onLoad\n    @static\n    @for @ember/application\n    @param name {String} name of hook\n    @param callback {Function} callback to be called\n    @private\n  */\n  _exports._loaded = _loaded;\n  function onLoad(name, callback) {\n    var _a;\n    var object = loaded[name];\n    var hooks = (_a = loadHooks[name]) !== null && _a !== void 0 ? _a : loadHooks[name] = [];\n    hooks.push(callback);\n    if (object) {\n      callback(object);\n    }\n  }\n  /**\n    Called when an Ember.js package (e.g Application) has finished\n    loading. Triggers any callbacks registered for this event.\n  \n    @method runLoadHooks\n    @static\n    @for @ember/application\n    @param name {String} name of hook\n    @param object {Object} object to pass to callbacks\n    @private\n  */\n  function runLoadHooks(name, object) {\n    var _a;\n    loaded[name] = object;\n    if (_browserEnvironment.window && typeof CustomEvent === 'function') {\n      var event = new CustomEvent(name, {\n        detail: object\n      });\n      _browserEnvironment.window.dispatchEvent(event);\n    }\n    (_a = loadHooks[name]) === null || _a === void 0 ? void 0 : _a.forEach(callback => callback(object));\n  }\n});","define(\"@ember/application/namespace\", [\"exports\", \"@ember/-internals/metal\", \"@ember/object\", \"@ember/-internals/utils\", \"@ember/debug\"], function (_exports, _metal, _object, _utils, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n  @module @ember/application/namespace\n  */\n  // Preloaded into namespaces\n\n  /**\n    A Namespace is an object usually used to contain other objects or methods\n    such as an application or framework. Create a namespace anytime you want\n    to define one of these new containers.\n  \n    # Example Usage\n  \n    ```javascript\n    MyFramework = Ember.Namespace.create({\n      VERSION: '1.0.0'\n    });\n    ```\n  \n    @class Namespace\n    @extends EmberObject\n    @public\n  */\n  class Namespace extends _object.default {\n    init(properties) {\n      super.init(properties);\n      (0, _metal.addNamespace)(this);\n    }\n    toString() {\n      var existing_name = (0, _object.get)(this, 'name') || (0, _object.get)(this, 'modulePrefix');\n      if (existing_name) {\n        (true && !(typeof existing_name === 'string') && (0, _debug.assert)(\"name wasn't a string\", typeof existing_name === 'string'));\n        return existing_name;\n      }\n      (0, _metal.findNamespaces)();\n      var name = (0, _utils.getName)(this);\n      if (name === undefined) {\n        name = (0, _utils.guidFor)(this);\n        (0, _utils.setName)(this, name);\n      }\n      return name;\n    }\n    nameClasses() {\n      (0, _metal.processNamespace)(this);\n    }\n    destroy() {\n      (0, _metal.removeNamespace)(this);\n      return super.destroy();\n    }\n  }\n  Namespace.NAMESPACES = _metal.NAMESPACES;\n  Namespace.NAMESPACES_BY_ID = _metal.NAMESPACES_BY_ID;\n  Namespace.processAll = _metal.processAllNamespaces;\n  Namespace.byName = _metal.findNamespace;\n  // Declare on the prototype to have a single shared value.\n  Namespace.prototype.isNamespace = true;\n  var _default = Namespace;\n  _exports.default = _default;\n});","define(\"@ember/array/-internals\", [\"exports\", \"@glimmer/util\"], function (_exports, _util) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.isEmberArray = isEmberArray;\n  _exports.setEmberArray = setEmberArray;\n  var EMBER_ARRAYS = new _util._WeakSet();\n  function setEmberArray(obj) {\n    EMBER_ARRAYS.add(obj);\n  }\n  function isEmberArray(obj) {\n    return EMBER_ARRAYS.has(obj);\n  }\n});","define(\"@ember/array/index\", [\"exports\", \"@ember/-internals/metal\", \"@ember/object\", \"@ember/object/mixin\", \"@ember/debug\", \"@ember/enumerable\", \"@ember/enumerable/mutable\", \"@ember/utils\", \"@ember/-internals/environment\", \"@ember/object/observable\", \"@ember/array/-internals\", \"@ember/array/lib/make-array\"], function (_exports, _metal, _object, _mixin, _debug, _enumerable, _mutable, _utils, _environment, _observable, _internals, _makeArray) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = _exports.NativeArray = _exports.MutableArray = _exports.A = void 0;\n  _exports.isArray = isArray;\n  Object.defineProperty(_exports, \"makeArray\", {\n    enumerable: true,\n    get: function () {\n      return _makeArray.default;\n    }\n  });\n  _exports.removeAt = removeAt;\n  _exports.uniqBy = uniqBy;\n  /**\n  @module @ember/array\n  */\n\n  var EMPTY_ARRAY = Object.freeze([]);\n  var identityFunction = item => item;\n  function uniqBy(array, keyOrFunc) {\n    if (keyOrFunc === void 0) {\n      keyOrFunc = identityFunction;\n    }\n    (true && !(isArray(array)) && (0, _debug.assert)(`first argument passed to \\`uniqBy\\` should be array`, isArray(array)));\n    var ret = A();\n    var seen = new Set();\n    var getter = typeof keyOrFunc === 'function' ? keyOrFunc : item => (0, _object.get)(item, keyOrFunc);\n    array.forEach(item => {\n      var val = getter(item);\n      if (!seen.has(val)) {\n        seen.add(val);\n        ret.push(item);\n      }\n    });\n    return ret;\n  }\n  function iter() {\n    for (var _len = arguments.length, args = new Array(_len), _key2 = 0; _key2 < _len; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n    var valueProvided = args.length === 2;\n    var [key, value] = args;\n    return valueProvided ? item => value === (0, _object.get)(item, key) : item => Boolean((0, _object.get)(item, key));\n  }\n  function findIndex(array, predicate, startAt) {\n    var len = array.length;\n    for (var index = startAt; index < len; index++) {\n      // SAFETY: Because we're checking the index this value should always be set.\n      var item = (0, _metal.objectAt)(array, index);\n      if (predicate(item, index, array)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n  function find(array, callback, target) {\n    if (target === void 0) {\n      target = null;\n    }\n    var predicate = callback.bind(target);\n    var index = findIndex(array, predicate, 0);\n    return index === -1 ? undefined : (0, _metal.objectAt)(array, index);\n  }\n  function any(array, callback, target) {\n    if (target === void 0) {\n      target = null;\n    }\n    var predicate = callback.bind(target);\n    return findIndex(array, predicate, 0) !== -1;\n  }\n  function every(array, callback, target) {\n    if (target === void 0) {\n      target = null;\n    }\n    var cb = callback.bind(target);\n    var predicate = (item, index, array) => !cb(item, index, array);\n    return findIndex(array, predicate, 0) === -1;\n  }\n  function indexOf(array, val, startAt, withNaNCheck) {\n    if (startAt === void 0) {\n      startAt = 0;\n    }\n    var len = array.length;\n    if (startAt < 0) {\n      startAt += len;\n    }\n    // SameValueZero comparison (NaN !== NaN)\n    var predicate = withNaNCheck && val !== val ? item => item !== item : item => item === val;\n    return findIndex(array, predicate, startAt);\n  }\n  function removeAt(array, index, len) {\n    (true && !(index > -1 && index < array.length) && (0, _debug.assert)(`\\`removeAt\\` index provided is out of range`, index > -1 && index < array.length));\n    (0, _metal.replace)(array, index, len !== null && len !== void 0 ? len : 1, EMPTY_ARRAY);\n    return array;\n  }\n  function insertAt(array, index, item) {\n    (true && !(index > -1 && index <= array.length) && (0, _debug.assert)(`\\`insertAt\\` index provided is out of range`, index > -1 && index <= array.length));\n    (0, _metal.replace)(array, index, 0, [item]);\n    return item;\n  }\n  /**\n    Returns true if the passed object is an array or Array-like.\n  \n    Objects are considered Array-like if any of the following are true:\n  \n      - the object is a native Array\n      - the object has an objectAt property\n      - the object is an Object, and has a length property\n  \n    Unlike `typeOf` this method returns true even if the passed object is\n    not formally an array but appears to be array-like (i.e. implements `Array`)\n  \n    ```javascript\n    import { isArray } from '@ember/array';\n    import ArrayProxy from '@ember/array/proxy';\n  \n    isArray();                                      // false\n    isArray([]);                                    // true\n    isArray(ArrayProxy.create({ content: [] }));    // true\n    ```\n  \n    @method isArray\n    @static\n    @for @ember/array\n    @param {Object} obj The object to test\n    @return {Boolean} true if the passed object is an array or Array-like\n    @public\n  */\n  function isArray(obj) {\n    if (true /* DEBUG */ && typeof obj === 'object' && obj !== null) {\n      // SAFETY: Property read checks are safe if it's an object\n      var possibleProxyContent = obj[_metal.PROXY_CONTENT];\n      if (possibleProxyContent !== undefined) {\n        obj = possibleProxyContent;\n      }\n    }\n    // SAFETY: Property read checks are safe if it's an object\n    if (!obj || obj.setInterval) {\n      return false;\n    }\n    if (Array.isArray(obj) || EmberArray.detect(obj)) {\n      return true;\n    }\n    var type = (0, _utils.typeOf)(obj);\n    if ('array' === type) {\n      return true;\n    }\n    // SAFETY: Property read checks are safe if it's an object\n    var length = obj.length;\n    if (typeof length === 'number' && length === length && 'object' === type) {\n      return true;\n    }\n    return false;\n  }\n  /*\n    This allows us to define computed properties that are not enumerable.\n    The primary reason this is important is that when `NativeArray` is\n    applied to `Array.prototype` we need to ensure that we do not add _any_\n    new enumerable properties.\n  */\n  function nonEnumerableComputed(callback) {\n    var property = (0, _metal.computed)(callback);\n    property.enumerable = false;\n    return property;\n  }\n  function mapBy(key) {\n    return this.map(next => (0, _object.get)(next, key));\n  }\n  var EmberArray = _mixin.default.create(_enumerable.default, {\n    init() {\n      this._super(...arguments);\n      (0, _internals.setEmberArray)(this);\n    },\n    objectsAt(indexes) {\n      return indexes.map(idx => (0, _metal.objectAt)(this, idx));\n    },\n    '[]': nonEnumerableComputed({\n      get() {\n        return this;\n      },\n      set(_key, value) {\n        this.replace(0, this.length, value);\n        return this;\n      }\n    }),\n    firstObject: nonEnumerableComputed(function () {\n      return (0, _metal.objectAt)(this, 0);\n    }).readOnly(),\n    lastObject: nonEnumerableComputed(function () {\n      return (0, _metal.objectAt)(this, this.length - 1);\n    }).readOnly(),\n    // Add any extra methods to EmberArray that are native to the built-in Array.\n    slice(beginIndex, endIndex) {\n      if (beginIndex === void 0) {\n        beginIndex = 0;\n      }\n      var ret = A();\n      var length = this.length;\n      if (beginIndex < 0) {\n        beginIndex = length + beginIndex;\n      }\n      var validatedEndIndex;\n      if (endIndex === undefined || endIndex > length) {\n        validatedEndIndex = length;\n      } else if (endIndex < 0) {\n        validatedEndIndex = length + endIndex;\n      } else {\n        validatedEndIndex = endIndex;\n      }\n      while (beginIndex < validatedEndIndex) {\n        ret[ret.length] = (0, _metal.objectAt)(this, beginIndex++);\n      }\n      return ret;\n    },\n    indexOf(object, startAt) {\n      return indexOf(this, object, startAt, false);\n    },\n    lastIndexOf(object, startAt) {\n      var len = this.length;\n      if (startAt === undefined || startAt >= len) {\n        startAt = len - 1;\n      }\n      if (startAt < 0) {\n        startAt += len;\n      }\n      for (var idx = startAt; idx >= 0; idx--) {\n        if ((0, _metal.objectAt)(this, idx) === object) {\n          return idx;\n        }\n      }\n      return -1;\n    },\n    forEach(callback, target) {\n      if (target === void 0) {\n        target = null;\n      }\n      (true && !(typeof callback === 'function') && (0, _debug.assert)('`forEach` expects a function as first argument.', typeof callback === 'function'));\n      var length = this.length;\n      for (var index = 0; index < length; index++) {\n        var item = this.objectAt(index);\n        callback.call(target, item, index, this);\n      }\n      return this;\n    },\n    getEach: mapBy,\n    setEach(key, value) {\n      return this.forEach(item => (0, _object.set)(item, key, value));\n    },\n    map(callback, target) {\n      if (target === void 0) {\n        target = null;\n      }\n      (true && !(typeof callback === 'function') && (0, _debug.assert)('`map` expects a function as first argument.', typeof callback === 'function'));\n      var ret = A();\n      this.forEach((x, idx, i) => ret[idx] = callback.call(target, x, idx, i));\n      return ret;\n    },\n    mapBy,\n    filter(callback, target) {\n      if (target === void 0) {\n        target = null;\n      }\n      (true && !(typeof callback === 'function') && (0, _debug.assert)('`filter` expects a function as first argument.', typeof callback === 'function'));\n      var ret = A();\n      this.forEach((x, idx, i) => {\n        if (callback.call(target, x, idx, i)) {\n          ret.push(x);\n        }\n      });\n      return ret;\n    },\n    reject(callback, target) {\n      if (target === void 0) {\n        target = null;\n      }\n      (true && !(typeof callback === 'function') && (0, _debug.assert)('`reject` expects a function as first argument.', typeof callback === 'function'));\n      return this.filter(function () {\n        // @ts-expect-error TS doesn't like us using arguments like this\n        return !callback.apply(target, arguments);\n      });\n    },\n    filterBy() {\n      // @ts-expect-error TS doesn't like the ...arguments spread here.\n      return this.filter(iter(...arguments));\n    },\n    rejectBy() {\n      // @ts-expect-error TS doesn't like the ...arguments spread here.\n      return this.reject(iter(...arguments));\n    },\n    find(callback, target) {\n      if (target === void 0) {\n        target = null;\n      }\n      (true && !(typeof callback === 'function') && (0, _debug.assert)('`find` expects a function as first argument.', typeof callback === 'function'));\n      return find(this, callback, target);\n    },\n    findBy() {\n      // @ts-expect-error TS doesn't like the ...arguments spread here.\n      var callback = iter(...arguments);\n      return find(this, callback);\n    },\n    every(callback, target) {\n      if (target === void 0) {\n        target = null;\n      }\n      (true && !(typeof callback === 'function') && (0, _debug.assert)('`every` expects a function as first argument.', typeof callback === 'function'));\n      return every(this, callback, target);\n    },\n    isEvery() {\n      // @ts-expect-error TS doesn't like the ...arguments spread here.\n      var callback = iter(...arguments);\n      return every(this, callback);\n    },\n    any(callback, target) {\n      if (target === void 0) {\n        target = null;\n      }\n      (true && !(typeof callback === 'function') && (0, _debug.assert)('`any` expects a function as first argument.', typeof callback === 'function'));\n      return any(this, callback, target);\n    },\n    isAny() {\n      // @ts-expect-error TS doesn't like us using arguments like this\n      var callback = iter(...arguments);\n      return any(this, callback);\n    },\n    // FIXME: When called without initialValue, behavior does not match native behavior\n    reduce(callback, initialValue) {\n      (true && !(typeof callback === 'function') && (0, _debug.assert)('`reduce` expects a function as first argument.', typeof callback === 'function'));\n      var ret = initialValue;\n      this.forEach(function (item, i) {\n        ret = callback(ret, item, i, this);\n      }, this);\n      return ret;\n    },\n    invoke(methodName) {\n      for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key3 = 1; _key3 < _len2; _key3++) {\n        args[_key3 - 1] = arguments[_key3];\n      }\n      var ret = A();\n      // SAFETY: This is not entirely safe and the code will not work with Ember proxies\n      this.forEach(item => {\n        var _a, _b;\n        return ret.push((_b = (_a = item)[methodName]) === null || _b === void 0 ? void 0 : _b.call(_a, ...args));\n      });\n      return ret;\n    },\n    toArray() {\n      return this.map(item => item);\n    },\n    compact() {\n      return this.filter(value => value != null);\n    },\n    includes(object, startAt) {\n      return indexOf(this, object, startAt, true) !== -1;\n    },\n    sortBy() {\n      var sortKeys = arguments;\n      return this.toArray().sort((a, b) => {\n        for (var i = 0; i < sortKeys.length; i++) {\n          var key = sortKeys[i];\n          var propA = (0, _object.get)(a, key);\n          var propB = (0, _object.get)(b, key);\n          // return 1 or -1 else continue to the next sortKey\n          var compareValue = (0, _utils.compare)(propA, propB);\n          if (compareValue) {\n            return compareValue;\n          }\n        }\n        return 0;\n      });\n    },\n    uniq() {\n      return uniqBy(this);\n    },\n    uniqBy(key) {\n      return uniqBy(this, key);\n    },\n    without(value) {\n      if (!this.includes(value)) {\n        return this; // nothing to do\n      }\n      // SameValueZero comparison (NaN !== NaN)\n      var predicate = value === value ? item => item !== value : item => item === item;\n      return this.filter(predicate);\n    }\n  });\n  var MutableArray = _mixin.default.create(EmberArray, _mutable.default, {\n    clear() {\n      var len = this.length;\n      if (len === 0) {\n        return this;\n      }\n      this.replace(0, len, EMPTY_ARRAY);\n      return this;\n    },\n    insertAt(idx, object) {\n      insertAt(this, idx, object);\n      return this;\n    },\n    removeAt(start, len) {\n      return removeAt(this, start, len);\n    },\n    pushObject(obj) {\n      return insertAt(this, this.length, obj);\n    },\n    pushObjects(objects) {\n      this.replace(this.length, 0, objects);\n      return this;\n    },\n    popObject() {\n      var len = this.length;\n      if (len === 0) {\n        return null;\n      }\n      var ret = (0, _metal.objectAt)(this, len - 1);\n      this.removeAt(len - 1, 1);\n      return ret;\n    },\n    shiftObject() {\n      if (this.length === 0) {\n        return null;\n      }\n      var ret = (0, _metal.objectAt)(this, 0);\n      this.removeAt(0);\n      return ret;\n    },\n    unshiftObject(obj) {\n      return insertAt(this, 0, obj);\n    },\n    unshiftObjects(objects) {\n      this.replace(0, 0, objects);\n      return this;\n    },\n    reverseObjects() {\n      var len = this.length;\n      if (len === 0) {\n        return this;\n      }\n      var objects = this.toArray().reverse();\n      this.replace(0, len, objects);\n      return this;\n    },\n    setObjects(objects) {\n      if (objects.length === 0) {\n        return this.clear();\n      }\n      var len = this.length;\n      this.replace(0, len, objects);\n      return this;\n    },\n    removeObject(obj) {\n      var loc = this.length || 0;\n      while (--loc >= 0) {\n        var curObject = (0, _metal.objectAt)(this, loc);\n        if (curObject === obj) {\n          this.removeAt(loc);\n        }\n      }\n      return this;\n    },\n    removeObjects(objects) {\n      (0, _metal.beginPropertyChanges)();\n      for (var i = objects.length - 1; i >= 0; i--) {\n        // SAFETY: Due to the loop structure we know this will always exist.\n        this.removeObject(objects[i]);\n      }\n      (0, _metal.endPropertyChanges)();\n      return this;\n    },\n    addObject(obj) {\n      var included = this.includes(obj);\n      if (!included) {\n        this.pushObject(obj);\n      }\n      return this;\n    },\n    addObjects(objects) {\n      (0, _metal.beginPropertyChanges)();\n      objects.forEach(obj => this.addObject(obj));\n      (0, _metal.endPropertyChanges)();\n      return this;\n    }\n  });\n  _exports.MutableArray = MutableArray;\n  var NativeArray = _mixin.default.create(MutableArray, _observable.default, {\n    objectAt(idx) {\n      return this[idx];\n    },\n    // primitive for array support.\n    replace(start, deleteCount, items) {\n      if (items === void 0) {\n        items = EMPTY_ARRAY;\n      }\n      (true && !(Array.isArray(items)) && (0, _debug.assert)('The third argument to replace needs to be an array.', Array.isArray(items)));\n      (0, _metal.replaceInNativeArray)(this, start, deleteCount, items);\n      return this;\n    }\n  });\n  // Remove any methods implemented natively so we don't override them\n  _exports.NativeArray = NativeArray;\n  var ignore = ['length'];\n  NativeArray.keys().forEach(methodName => {\n    // SAFETY: It's safe to read unknown properties from an object\n    if (Array.prototype[methodName]) {\n      ignore.push(methodName);\n    }\n  });\n  _exports.NativeArray = NativeArray = NativeArray.without(...ignore);\n  var A;\n  _exports.A = A;\n  if (_environment.ENV.EXTEND_PROTOTYPES.Array) {\n    NativeArray.apply(Array.prototype, true);\n    _exports.A = A = function (arr) {\n      (true && !(!(this instanceof A)) && (0, _debug.assert)('You cannot create an Ember Array with `new A()`, please update to calling A as a function: `A()`', !(this instanceof A))); // SAFTEY: Since we are extending prototypes all true native arrays are Ember NativeArrays\n      return arr || [];\n    };\n  } else {\n    _exports.A = A = function (arr) {\n      (true && !(!(this instanceof A)) && (0, _debug.assert)('You cannot create an Ember Array with `new A()`, please update to calling A as a function: `A()`', !(this instanceof A)));\n      if ((0, _internals.isEmberArray)(arr)) {\n        // SAFETY: If it's a true native array and it is also an EmberArray then it should be an Ember NativeArray\n        return arr;\n      } else {\n        // SAFETY: This will return an NativeArray but TS can't infer that.\n        return NativeArray.apply(arr !== null && arr !== void 0 ? arr : []);\n      }\n    };\n  }\n  var _default = EmberArray;\n  _exports.default = _default;\n});","define(\"@ember/array/lib/make-array\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var {\n    isArray\n  } = Array;\n  function makeArray(obj) {\n    if (obj === null || obj === undefined) {\n      return [];\n    }\n    return isArray(obj) ? obj : [obj];\n  }\n  var _default = makeArray;\n  _exports.default = _default;\n});","define(\"@ember/array/mutable\", [\"exports\", \"@ember/array\"], function (_exports, _array) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _array.MutableArray;\n    }\n  });\n});","define(\"@ember/array/proxy\", [\"exports\", \"@ember/-internals/metal\", \"@ember/object\", \"@ember/-internals/utils\", \"@ember/array\", \"@ember/array/mutable\", \"@ember/debug\", \"@glimmer/manager\", \"@glimmer/validator\"], function (_exports, _metal, _object, _utils, _array, _mutable, _debug, _manager, _validator) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n  @module @ember/array/proxy\n  */\n\n  function isMutable(obj) {\n    return Array.isArray(obj) || typeof obj.replace === 'function';\n  }\n  var ARRAY_OBSERVER_MAPPING = {\n    willChange: '_arrangedContentArrayWillChange',\n    didChange: '_arrangedContentArrayDidChange'\n  };\n  function customTagForArrayProxy(proxy, key) {\n    (true && !(proxy instanceof ArrayProxy) && (0, _debug.assert)('[BUG] Expected a proxy', proxy instanceof ArrayProxy));\n    if (key === '[]') {\n      proxy._revalidate();\n      return proxy._arrTag;\n    } else if (key === 'length') {\n      proxy._revalidate();\n      return proxy._lengthTag;\n    }\n    return (0, _validator.tagFor)(proxy, key);\n  }\n  class ArrayProxy extends _object.default {\n    constructor() {\n      super(...arguments);\n      /*\n        `this._objectsDirtyIndex` determines which indexes in the `this._objects`\n        cache are dirty.\n               If `this._objectsDirtyIndex === -1` then no indexes are dirty.\n        Otherwise, an index `i` is dirty if `i >= this._objectsDirtyIndex`.\n               Calling `objectAt` with a dirty index will cause the `this._objects`\n        cache to be recomputed.\n      */\n      /** @internal */\n      this._objectsDirtyIndex = 0;\n      /** @internal */\n      this._objects = null;\n      /** @internal */\n      this._lengthDirty = true;\n      /** @internal */\n      this._length = 0;\n      /** @internal */\n      this._arrangedContent = null;\n      /** @internal */\n      this._arrangedContentIsUpdating = false;\n      /** @internal */\n      this._arrangedContentTag = null;\n      /** @internal */\n      this._arrangedContentRevision = null;\n      /** @internal */\n      this._lengthTag = null;\n      /** @internal */\n      this._arrTag = null;\n    }\n    init(props) {\n      super.init(props);\n      (0, _manager.setCustomTagFor)(this, customTagForArrayProxy);\n    }\n    [_metal.PROPERTY_DID_CHANGE]() {\n      this._revalidate();\n    }\n    willDestroy() {\n      this._removeArrangedContentArrayObserver();\n    }\n    objectAtContent(idx) {\n      var arrangedContent = (0, _object.get)(this, 'arrangedContent');\n      (true && !(arrangedContent) && (0, _debug.assert)('[BUG] Called objectAtContent without content', arrangedContent));\n      return (0, _metal.objectAt)(arrangedContent, idx);\n    }\n    // See additional docs for `replace` from `MutableArray`:\n    // https://api.emberjs.com/ember/release/classes/MutableArray/methods/replace?anchor=replace\n    replace(idx, amt, objects) {\n      (true && !((0, _object.get)(this, 'arrangedContent') === (0, _object.get)(this, 'content')) && (0, _debug.assert)('Mutating an arranged ArrayProxy is not allowed', (0, _object.get)(this, 'arrangedContent') === (0, _object.get)(this, 'content')));\n      this.replaceContent(idx, amt, objects);\n    }\n    replaceContent(idx, amt, objects) {\n      var content = (0, _object.get)(this, 'content');\n      (true && !(content) && (0, _debug.assert)('[BUG] Called replaceContent without content', content));\n      (true && !(isMutable(content)) && (0, _debug.assert)('Mutating a non-mutable array is not allowed', isMutable(content)));\n      (0, _metal.replace)(content, idx, amt, objects);\n    }\n    // Overriding objectAt is not supported.\n    objectAt(idx) {\n      this._revalidate();\n      if (this._objects === null) {\n        this._objects = [];\n      }\n      if (this._objectsDirtyIndex !== -1 && idx >= this._objectsDirtyIndex) {\n        var arrangedContent = (0, _object.get)(this, 'arrangedContent');\n        if (arrangedContent) {\n          var length = this._objects.length = (0, _object.get)(arrangedContent, 'length');\n          for (var i = this._objectsDirtyIndex; i < length; i++) {\n            // SAFETY: This is expected to only ever return an instance of T. In other words, there should\n            // be no gaps in the array. Unfortunately, we can't actually assert for it since T could include\n            // any types, including null or undefined.\n            this._objects[i] = this.objectAtContent(i);\n          }\n        } else {\n          this._objects.length = 0;\n        }\n        this._objectsDirtyIndex = -1;\n      }\n      return this._objects[idx];\n    }\n    // Overriding length is not supported.\n    get length() {\n      this._revalidate();\n      if (this._lengthDirty) {\n        var arrangedContent = (0, _object.get)(this, 'arrangedContent');\n        this._length = arrangedContent ? (0, _object.get)(arrangedContent, 'length') : 0;\n        this._lengthDirty = false;\n      }\n      (true && !(this._lengthTag) && (0, _debug.assert)('[BUG] _lengthTag is not set', this._lengthTag));\n      (0, _validator.consumeTag)(this._lengthTag);\n      return this._length;\n    }\n    set length(value) {\n      var length = this.length;\n      var removedCount = length - value;\n      var added;\n      if (removedCount === 0) {\n        return;\n      } else if (removedCount < 0) {\n        added = new Array(-removedCount);\n        removedCount = 0;\n      }\n      var content = (0, _object.get)(this, 'content');\n      if (content) {\n        (true && !(isMutable(content)) && (0, _debug.assert)('Mutating a non-mutable array is not allowed', isMutable(content)));\n        (0, _metal.replace)(content, value, removedCount, added);\n        this._invalidate();\n      }\n    }\n    _updateArrangedContentArray(arrangedContent) {\n      var oldLength = this._objects === null ? 0 : this._objects.length;\n      var newLength = arrangedContent ? (0, _object.get)(arrangedContent, 'length') : 0;\n      this._removeArrangedContentArrayObserver();\n      (0, _metal.arrayContentWillChange)(this, 0, oldLength, newLength);\n      this._invalidate();\n      (0, _metal.arrayContentDidChange)(this, 0, oldLength, newLength, false);\n      this._addArrangedContentArrayObserver(arrangedContent);\n    }\n    _addArrangedContentArrayObserver(arrangedContent) {\n      if (arrangedContent && !arrangedContent.isDestroyed) {\n        // @ts-expect-error This check is still good for ensuring correctness\n        (true && !(arrangedContent !== this) && (0, _debug.assert)(\"Can't set ArrayProxy's content to itself\", arrangedContent !== this));\n        (true && !(function (arr) {\n          return Array.isArray(arr) || _array.default.detect(arr);\n        }(arrangedContent)) && (0, _debug.assert)(`ArrayProxy expects a native Array, EmberArray, or ArrayProxy, but you passed ${typeof arrangedContent}`, function (arr) {\n          return Array.isArray(arr) || _array.default.detect(arr);\n        }(arrangedContent)));\n        (true && !(!arrangedContent.isDestroyed) && (0, _debug.assert)('ArrayProxy expected its contents to not be destroyed', !arrangedContent.isDestroyed));\n        (0, _metal.addArrayObserver)(arrangedContent, this, ARRAY_OBSERVER_MAPPING);\n        this._arrangedContent = arrangedContent;\n      }\n    }\n    _removeArrangedContentArrayObserver() {\n      if (this._arrangedContent) {\n        (0, _metal.removeArrayObserver)(this._arrangedContent, this, ARRAY_OBSERVER_MAPPING);\n      }\n    }\n    _arrangedContentArrayWillChange() {}\n    _arrangedContentArrayDidChange(_proxy, idx, removedCnt, addedCnt) {\n      (0, _metal.arrayContentWillChange)(this, idx, removedCnt, addedCnt);\n      var dirtyIndex = idx;\n      if (dirtyIndex < 0) {\n        var length = (0, _object.get)(this._arrangedContent, 'length');\n        dirtyIndex += length + removedCnt - addedCnt;\n      }\n      if (this._objectsDirtyIndex === -1 || this._objectsDirtyIndex > dirtyIndex) {\n        this._objectsDirtyIndex = dirtyIndex;\n      }\n      this._lengthDirty = true;\n      (0, _metal.arrayContentDidChange)(this, idx, removedCnt, addedCnt, false);\n    }\n    _invalidate() {\n      this._objectsDirtyIndex = 0;\n      this._lengthDirty = true;\n    }\n    _revalidate() {\n      if (this._arrangedContentIsUpdating === true) return;\n      if (this._arrangedContentTag === null || !(0, _validator.validateTag)(this._arrangedContentTag, this._arrangedContentRevision)) {\n        var arrangedContent = this.get('arrangedContent');\n        if (this._arrangedContentTag === null) {\n          // This is the first time the proxy has been setup, only add the observer\n          // don't trigger any events\n          this._addArrangedContentArrayObserver(arrangedContent);\n        } else {\n          this._arrangedContentIsUpdating = true;\n          this._updateArrangedContentArray(arrangedContent);\n          this._arrangedContentIsUpdating = false;\n        }\n        var arrangedContentTag = this._arrangedContentTag = (0, _validator.tagFor)(this, 'arrangedContent');\n        this._arrangedContentRevision = (0, _validator.valueForTag)(this._arrangedContentTag);\n        if ((0, _utils.isObject)(arrangedContent)) {\n          this._lengthTag = (0, _validator.combine)([arrangedContentTag, (0, _metal.tagForProperty)(arrangedContent, 'length')]);\n          this._arrTag = (0, _validator.combine)([arrangedContentTag, (0, _metal.tagForProperty)(arrangedContent, '[]')]);\n        } else {\n          this._lengthTag = this._arrTag = arrangedContentTag;\n        }\n      }\n    }\n  }\n  ArrayProxy.reopen(_mutable.default, {\n    arrangedContent: (0, _metal.alias)('content')\n  });\n  var _default = ArrayProxy;\n  _exports.default = _default;\n});","define(\"@ember/canary-features/index\", [\"exports\", \"@ember/-internals/environment\"], function (_exports, _environment) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.FEATURES = _exports.DEFAULT_FEATURES = void 0;\n  _exports.isEnabled = isEnabled;\n  /**\n    Set `EmberENV.FEATURES` in your application's `config/environment.js` file\n    to enable canary features in your application.\n  \n    See the [feature flag guide](https://guides.emberjs.com/release/configuring-ember/feature-flags/)\n    for more details.\n  \n    @module @ember/canary-features\n    @public\n  */\n  var DEFAULT_FEATURES = {\n    // FLAG_NAME: true/false\n  };\n  /**\n    The hash of enabled Canary features. Add to this, any canary features\n    before creating your application.\n  \n    @class FEATURES\n    @static\n    @since 1.1.0\n    @public\n  */\n  _exports.DEFAULT_FEATURES = DEFAULT_FEATURES;\n  var FEATURES = Object.assign(DEFAULT_FEATURES, _environment.ENV.FEATURES);\n  /**\n    Determine whether the specified `feature` is enabled. Used by Ember's\n    build tools to exclude experimental features from beta/stable builds.\n  \n    You can define the following configuration options:\n  \n    * `EmberENV.ENABLE_OPTIONAL_FEATURES` - enable any features that have not been explicitly\n      enabled/disabled.\n  \n    @method isEnabled\n    @param {String} feature The feature to check\n    @return {Boolean}\n    @since 1.1.0\n    @public\n  */\n  _exports.FEATURES = FEATURES;\n  function isEnabled(feature) {\n    var value = FEATURES[feature];\n    if (value === true || value === false) {\n      return value;\n    } else if (_environment.ENV.ENABLE_OPTIONAL_FEATURES) {\n      return true;\n    } else {\n      return false;\n    }\n  }\n  // Uncomment the below when features are present:\n  // function featureValue(value: null | boolean) {\n  //   if (ENV.ENABLE_OPTIONAL_FEATURES && value === null) {\n  //     return true;\n  //   }\n  //   return value;\n  // }\n  // export const FLAG_NAME = featureValue(FEATURES.FLAG_NAME);\n});","define(\"@ember/component/helper\", [\"exports\", \"@ember/-internals/glimmer\"], function (_exports, _glimmer) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _glimmer.Helper;\n    }\n  });\n  Object.defineProperty(_exports, \"helper\", {\n    enumerable: true,\n    get: function () {\n      return _glimmer.helper;\n    }\n  });\n});","define(\"@ember/component/index\", [\"exports\", \"@glimmer/manager\", \"@ember/-internals/glimmer\"], function (_exports, _manager, _glimmer) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"Input\", {\n    enumerable: true,\n    get: function () {\n      return _glimmer.Input;\n    }\n  });\n  Object.defineProperty(_exports, \"Textarea\", {\n    enumerable: true,\n    get: function () {\n      return _glimmer.Textarea;\n    }\n  });\n  Object.defineProperty(_exports, \"capabilities\", {\n    enumerable: true,\n    get: function () {\n      return _glimmer.componentCapabilities;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _glimmer.Component;\n    }\n  });\n  Object.defineProperty(_exports, \"getComponentTemplate\", {\n    enumerable: true,\n    get: function () {\n      return _manager.getComponentTemplate;\n    }\n  });\n  Object.defineProperty(_exports, \"setComponentManager\", {\n    enumerable: true,\n    get: function () {\n      return _glimmer.setComponentManager;\n    }\n  });\n  Object.defineProperty(_exports, \"setComponentTemplate\", {\n    enumerable: true,\n    get: function () {\n      return _manager.setComponentTemplate;\n    }\n  });\n});","define(\"@ember/component/template-only\", [\"exports\", \"@glimmer/runtime\"], function (_exports, _runtime) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _runtime.templateOnlyComponent;\n    }\n  });\n});","define(\"@ember/controller/index\", [\"exports\", \"@ember/-internals/owner\", \"@ember/object\", \"@ember/object/-internals\", \"@ember/-internals/metal\", \"@ember/object/mixin\", \"@ember/routing/-internals\", \"@ember/-internals/runtime\", \"@ember/-internals/utils\"], function (_exports, _owner, _object, _internals, _metal, _mixin, _internals2, _runtime, _utils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = _exports.ControllerMixin = void 0;\n  _exports.inject = inject;\n  // This is imported from -internals to avoid circularity\n\n  var MODEL = (0, _utils.symbol)('MODEL');\n  var ControllerMixin = _mixin.default.create(_runtime.ActionHandler, {\n    /* ducktype as a controller */\n    isController: true,\n    concatenatedProperties: ['queryParams'],\n    target: null,\n    store: null,\n    init() {\n      this._super(...arguments);\n      var owner = (0, _owner.getOwner)(this);\n      if (owner) {\n        this.namespace = owner.lookup('application:main');\n        this.target = owner.lookup('router:main');\n      }\n    },\n    model: (0, _object.computed)({\n      get() {\n        return this[MODEL];\n      },\n      set(_key, value) {\n        return this[MODEL] = value;\n      }\n    }),\n    queryParams: null,\n    /**\n     This property is updated to various different callback functions depending on\n     the current \"state\" of the backing route. It is used by\n     `Controller.prototype._qpChanged`.\n        The methods backing each state can be found in the `Route.prototype._qp` computed\n     property return value (the `.states` property). The current values are listed here for\n     the sanity of future travelers:\n        * `inactive` - This state is used when this controller instance is not part of the active\n       route hierarchy. Set in `Route.prototype._reset` (a `router.js` microlib hook) and\n       `Route.prototype.actions.finalizeQueryParamChange`.\n     * `active` - This state is used when this controller instance is part of the active\n       route hierarchy. Set in `Route.prototype.actions.finalizeQueryParamChange`.\n     * `allowOverrides` - This state is used in `Route.prototype.setup` (`route.js` microlib hook).\n         @method _qpDelegate\n      @private\n    */\n    _qpDelegate: null,\n    /**\n     During `Route#setup` observers are created to invoke this method\n     when any of the query params declared in `Controller#queryParams` property\n     are changed.\n        When invoked this method uses the currently active query param update delegate\n     (see `Controller.prototype._qpDelegate` for details) and invokes it with\n     the QP key/value being changed.\n         @method _qpChanged\n      @private\n    */\n    _qpChanged(controller, _prop) {\n      var dotIndex = _prop.indexOf('.[]');\n      var prop = dotIndex === -1 ? _prop : _prop.slice(0, dotIndex);\n      var delegate = controller._qpDelegate;\n      var value = (0, _object.get)(controller, prop);\n      delegate(prop, value);\n    },\n    transitionToRoute() {\n      var _a;\n      (0, _internals2.deprecateTransitionMethods)('controller', 'transitionToRoute');\n      // target may be either another controller or a router\n      var target = (0, _object.get)(this, 'target');\n      // SAFETY: We can't actually assert that this is a full Controller or Router since some tests\n      // mock out an object that only has the single method. Since this is deprecated, I think it's\n      // ok to be a little less than proper here.\n      var method = (_a = target.transitionToRoute) !== null && _a !== void 0 ? _a : target.transitionTo;\n      for (var _len = arguments.length, args = new Array(_len), _key2 = 0; _key2 < _len; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n      return method.apply(target, (0, _internals2.prefixRouteNameArg)(this, args));\n    },\n    replaceRoute() {\n      var _a;\n      (0, _internals2.deprecateTransitionMethods)('controller', 'replaceRoute');\n      // target may be either another controller or a router\n      var target = (0, _object.get)(this, 'target');\n      // SAFETY: We can't actually assert that this is a full Controller or Router since some tests\n      // mock out an object that only has the single method. Since this is deprecated, I think it's\n      // ok to be a little less than proper here.\n      var method = (_a = target.replaceRoute) !== null && _a !== void 0 ? _a : target.replaceWith;\n      for (var _len2 = arguments.length, args = new Array(_len2), _key3 = 0; _key3 < _len2; _key3++) {\n        args[_key3] = arguments[_key3];\n      }\n      return method.apply(target, (0, _internals2.prefixRouteNameArg)(this, args));\n    }\n  });\n  _exports.ControllerMixin = ControllerMixin;\n  class Controller extends _internals.FrameworkObject.extend(ControllerMixin) {}\n  _exports.default = Controller;\n  function inject() {\n    for (var _len3 = arguments.length, args = new Array(_len3), _key4 = 0; _key4 < _len3; _key4++) {\n      args[_key4] = arguments[_key4];\n    }\n    return (0, _metal.inject)('controller', ...args);\n  }\n});","define(\"@ember/debug/container-debug-adapter\", [\"exports\", \"@ember/-internals/string\", \"@ember/object\", \"@ember/utils\", \"@ember/-internals/owner\", \"@ember/application/namespace\"], function (_exports, _string, _object, _utils, _owner, _namespace) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n  @module @ember/debug/container-debug-adapter\n  */\n  /**\n    The `ContainerDebugAdapter` helps the container and resolver interface\n    with tools that debug Ember such as the\n    [Ember Inspector](https://github.com/emberjs/ember-inspector)\n    for Chrome and Firefox.\n  \n    This class can be extended by a custom resolver implementer\n    to override some of the methods with library-specific code.\n  \n    The methods likely to be overridden are:\n  \n    * `canCatalogEntriesByType`\n    * `catalogEntriesByType`\n  \n    The adapter will need to be registered\n    in the application's container as `container-debug-adapter:main`.\n  \n    Example:\n  \n    ```javascript\n    Application.initializer({\n      name: \"containerDebugAdapter\",\n  \n      initialize(application) {\n        application.register('container-debug-adapter:main', require('app/container-debug-adapter'));\n      }\n    });\n    ```\n  \n    @class ContainerDebugAdapter\n    @extends EmberObject\n    @since 1.5.0\n    @public\n  */\n  class ContainerDebugAdapter extends _object.default {\n    constructor(owner) {\n      super(owner);\n      this.resolver = (0, _owner.getOwner)(this).lookup('resolver-for-debugging:main');\n    }\n    /**\n      Returns true if it is possible to catalog a list of available\n      classes in the resolver for a given type.\n         @method canCatalogEntriesByType\n      @param {String} type The type. e.g. \"model\", \"controller\", \"route\".\n      @return {boolean} whether a list is available for this type.\n      @public\n    */\n    canCatalogEntriesByType(type) {\n      if (type === 'model' || type === 'template') {\n        return false;\n      }\n      return true;\n    }\n    /**\n      Returns the available classes a given type.\n         @method catalogEntriesByType\n      @param {String} type The type. e.g. \"model\", \"controller\", \"route\".\n      @return {Array} An array of strings.\n      @public\n    */\n    catalogEntriesByType(type) {\n      var namespaces = _namespace.default.NAMESPACES;\n      var types = [];\n      var typeSuffixRegex = new RegExp(`${(0, _string.classify)(type)}$`);\n      namespaces.forEach(namespace => {\n        for (var key in namespace) {\n          if (!Object.prototype.hasOwnProperty.call(namespace, key)) {\n            continue;\n          }\n          if (typeSuffixRegex.test(key)) {\n            var klass = namespace[key];\n            if ((0, _utils.typeOf)(klass) === 'class') {\n              types.push((0, _string.dasherize)(key.replace(typeSuffixRegex, '')));\n            }\n          }\n        }\n      });\n      return types;\n    }\n  }\n  _exports.default = ContainerDebugAdapter;\n});","define(\"@ember/debug/data-adapter\", [\"exports\", \"@ember/-internals/owner\", \"@ember/runloop\", \"@ember/object\", \"@ember/-internals/string\", \"@ember/application/namespace\", \"@ember/array\", \"@glimmer/validator\", \"@ember/debug\"], function (_exports, _owner, _runloop, _object, _string, _namespace, _array, _validator, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  function iterate(arr, fn) {\n    if (Symbol.iterator in arr) {\n      for (var item of arr) {\n        fn(item);\n      }\n    } else {\n      // SAFETY: this cast required to work this way to interop between TS 4.8\n      // and 4.9. When we drop support for 4.8, it will narrow correctly via the\n      // use of the `in` operator above. (Preferably we will solve this by just\n      // switching to require `Symbol.iterator` instead.)\n      (0, _debug.assert)('', typeof arr.forEach === 'function');\n      arr.forEach(fn);\n    }\n  }\n  class RecordsWatcher {\n    getCacheForItem(record) {\n      var recordCache = this.recordCaches.get(record);\n      if (!recordCache) {\n        var hasBeenAdded = false;\n        recordCache = (0, _validator.createCache)(() => {\n          if (!hasBeenAdded) {\n            this.added.push(this.wrapRecord(record));\n            hasBeenAdded = true;\n          } else {\n            this.updated.push(this.wrapRecord(record));\n          }\n        });\n        this.recordCaches.set(record, recordCache);\n      }\n      return recordCache;\n    }\n    constructor(records, recordsAdded, recordsUpdated, recordsRemoved, wrapRecord, release) {\n      this.wrapRecord = wrapRecord;\n      this.release = release;\n      this.recordCaches = new Map();\n      this.added = [];\n      this.updated = [];\n      this.removed = [];\n      this.recordArrayCache = (0, _validator.createCache)(() => {\n        var seen = new Set();\n        // Track `[]` for legacy support\n        (0, _validator.consumeTag)((0, _validator.tagFor)(records, '[]'));\n        iterate(records, record => {\n          (0, _validator.getValue)(this.getCacheForItem(record));\n          seen.add(record);\n        });\n        // Untrack this operation because these records are being removed, they\n        // should not be polled again in the future\n        (0, _validator.untrack)(() => {\n          this.recordCaches.forEach((_cache, record) => {\n            if (!seen.has(record)) {\n              this.removed.push(wrapRecord(record));\n              this.recordCaches.delete(record);\n            }\n          });\n        });\n        if (this.added.length > 0) {\n          recordsAdded(this.added);\n          this.added = [];\n        }\n        if (this.updated.length > 0) {\n          recordsUpdated(this.updated);\n          this.updated = [];\n        }\n        if (this.removed.length > 0) {\n          recordsRemoved(this.removed);\n          this.removed = [];\n        }\n      });\n    }\n    revalidate() {\n      (0, _validator.getValue)(this.recordArrayCache);\n    }\n  }\n  class TypeWatcher {\n    constructor(records, onChange, release) {\n      this.release = release;\n      var hasBeenAccessed = false;\n      this.cache = (0, _validator.createCache)(() => {\n        // Empty iteration, we're doing this just\n        // to track changes to the records array\n        iterate(records, () => {});\n        // Also track `[]` for legacy support\n        (0, _validator.consumeTag)((0, _validator.tagFor)(records, '[]'));\n        if (hasBeenAccessed === true) {\n          (0, _runloop.next)(onChange);\n        } else {\n          hasBeenAccessed = true;\n        }\n      });\n      this.release = release;\n    }\n    revalidate() {\n      (0, _validator.getValue)(this.cache);\n    }\n  }\n  /**\n    The `DataAdapter` helps a data persistence library\n    interface with tools that debug Ember such\n    as the [Ember Inspector](https://github.com/emberjs/ember-inspector)\n    for Chrome and Firefox.\n  \n    This class will be extended by a persistence library\n    which will override some of the methods with\n    library-specific code.\n  \n    The methods likely to be overridden are:\n  \n    * `getFilters`\n    * `detect`\n    * `columnsForType`\n    * `getRecords`\n    * `getRecordColumnValues`\n    * `getRecordKeywords`\n    * `getRecordFilterValues`\n    * `getRecordColor`\n  \n    The adapter will need to be registered\n    in the application's container as `dataAdapter:main`.\n  \n    Example:\n  \n    ```javascript\n    Application.initializer({\n      name: \"data-adapter\",\n  \n      initialize: function(application) {\n        application.register('data-adapter:main', DS.DataAdapter);\n      }\n    });\n    ```\n  \n    @class DataAdapter\n    @extends EmberObject\n    @public\n  */\n  class DataAdapter extends _object.default {\n    constructor(owner) {\n      super(owner);\n      this.releaseMethods = (0, _array.A)();\n      this.recordsWatchers = new Map();\n      this.typeWatchers = new Map();\n      this.flushWatchers = null;\n      /**\n        The container-debug-adapter which is used\n        to list all models.\n               @property containerDebugAdapter\n        @default undefined\n        @since 1.5.0\n        @public\n      **/\n      /**\n        The number of attributes to send\n        as columns. (Enough to make the record\n        identifiable).\n               @private\n        @property attributeLimit\n        @default 3\n        @since 1.3.0\n      */\n      this.attributeLimit = 3;\n      /**\n         Ember Data > v1.0.0-beta.18\n         requires string model names to be passed\n         around instead of the actual factories.\n                This is a stamp for the Ember Inspector\n         to differentiate between the versions\n         to be able to support older versions too.\n                @public\n         @property acceptsModelName\n       */\n      this.acceptsModelName = true;\n      this.containerDebugAdapter = (0, _owner.getOwner)(this).lookup('container-debug-adapter:main');\n    }\n    /**\n       Map from records arrays to RecordsWatcher instances\n          @private\n       @property recordsWatchers\n       @since 3.26.0\n     */\n    /**\n      Map from records arrays to TypeWatcher instances\n         @private\n      @property typeWatchers\n      @since 3.26.0\n     */\n    /**\n      Callback that is currently scheduled on backburner end to flush and check\n      all active watchers.\n         @private\n      @property flushWatchers\n      @since 3.26.0\n        */\n    /**\n      Stores all methods that clear observers.\n      These methods will be called on destruction.\n         @private\n      @property releaseMethods\n      @since 1.3.0\n    */\n    /**\n      Specifies how records can be filtered.\n      Records returned will need to have a `filterValues`\n      property with a key for every name in the returned array.\n         @public\n      @method getFilters\n      @return {Array} List of objects defining filters.\n       The object should have a `name` and `desc` property.\n    */\n    getFilters() {\n      return (0, _array.A)();\n    }\n    /**\n      Fetch the model types and observe them for changes.\n         @public\n      @method watchModelTypes\n         @param {Function} typesAdded Callback to call to add types.\n      Takes an array of objects containing wrapped types (returned from `wrapModelType`).\n         @param {Function} typesUpdated Callback to call when a type has changed.\n      Takes an array of objects containing wrapped types.\n         @return {Function} Method to call to remove all observers\n    */\n    watchModelTypes(typesAdded, typesUpdated) {\n      var modelTypes = this.getModelTypes();\n      var releaseMethods = (0, _array.A)();\n      var typesToSend;\n      typesToSend = modelTypes.map(type => {\n        var klass = type.klass;\n        var wrapped = this.wrapModelType(klass, type.name);\n        releaseMethods.push(this.observeModelType(type.name, typesUpdated));\n        return wrapped;\n      });\n      typesAdded(typesToSend);\n      var release = () => {\n        releaseMethods.forEach(fn => fn());\n        this.releaseMethods.removeObject(release);\n      };\n      this.releaseMethods.pushObject(release);\n      return release;\n    }\n    _nameToClass(type) {\n      if (typeof type === 'string') {\n        var owner = (0, _owner.getOwner)(this);\n        var Factory = owner.factoryFor(`model:${type}`);\n        type = Factory && Factory.class;\n      }\n      return type;\n    }\n    /**\n      Fetch the records of a given type and observe them for changes.\n         @public\n      @method watchRecords\n         @param {String} modelName The model name.\n         @param {Function} recordsAdded Callback to call to add records.\n      Takes an array of objects containing wrapped records.\n      The object should have the following properties:\n        columnValues: {Object} The key and value of a table cell.\n        object: {Object} The actual record object.\n         @param {Function} recordsUpdated Callback to call when a record has changed.\n      Takes an array of objects containing wrapped records.\n         @param {Function} recordsRemoved Callback to call when a record has removed.\n      Takes an array of objects containing wrapped records.\n         @return {Function} Method to call to remove all observers.\n    */\n    watchRecords(modelName, recordsAdded, recordsUpdated, recordsRemoved) {\n      var klass = this._nameToClass(modelName);\n      var records = this.getRecords(klass, modelName);\n      var {\n        recordsWatchers\n      } = this;\n      var recordsWatcher = recordsWatchers.get(records);\n      if (!recordsWatcher) {\n        recordsWatcher = new RecordsWatcher(records, recordsAdded, recordsUpdated, recordsRemoved, record => this.wrapRecord(record), () => {\n          recordsWatchers.delete(records);\n          this.updateFlushWatchers();\n        });\n        recordsWatchers.set(records, recordsWatcher);\n        this.updateFlushWatchers();\n        recordsWatcher.revalidate();\n      }\n      return recordsWatcher.release;\n    }\n    updateFlushWatchers() {\n      if (this.flushWatchers === null) {\n        if (this.typeWatchers.size > 0 || this.recordsWatchers.size > 0) {\n          this.flushWatchers = () => {\n            this.typeWatchers.forEach(watcher => watcher.revalidate());\n            this.recordsWatchers.forEach(watcher => watcher.revalidate());\n          };\n          _runloop._backburner.on('end', this.flushWatchers);\n        }\n      } else if (this.typeWatchers.size === 0 && this.recordsWatchers.size === 0) {\n        _runloop._backburner.off('end', this.flushWatchers);\n        this.flushWatchers = null;\n      }\n    }\n    /**\n      Clear all observers before destruction\n      @private\n      @method willDestroy\n    */\n    willDestroy() {\n      this._super(...arguments);\n      this.typeWatchers.forEach(watcher => watcher.release());\n      this.recordsWatchers.forEach(watcher => watcher.release());\n      this.releaseMethods.forEach(fn => fn());\n      if (this.flushWatchers) {\n        _runloop._backburner.off('end', this.flushWatchers);\n      }\n    }\n    /**\n      Detect whether a class is a model.\n         Test that against the model class\n      of your persistence library.\n         @public\n      @method detect\n      @return boolean Whether the class is a model class or not.\n    */\n    detect(_klass) {\n      return false;\n    }\n    /**\n      Get the columns for a given model type.\n         @public\n      @method columnsForType\n      @return {Array} An array of columns of the following format:\n       name: {String} The name of the column.\n       desc: {String} Humanized description (what would show in a table column name).\n    */\n    columnsForType(_klass) {\n      return (0, _array.A)();\n    }\n    /**\n      Adds observers to a model type class.\n         @private\n      @method observeModelType\n      @param {String} modelName The model type name.\n      @param {Function} typesUpdated Called when a type is modified.\n      @return {Function} The function to call to remove observers.\n    */\n    observeModelType(modelName, typesUpdated) {\n      var klass = this._nameToClass(modelName);\n      var records = this.getRecords(klass, modelName);\n      var onChange = () => {\n        typesUpdated([this.wrapModelType(klass, modelName)]);\n      };\n      var {\n        typeWatchers\n      } = this;\n      var typeWatcher = typeWatchers.get(records);\n      if (!typeWatcher) {\n        typeWatcher = new TypeWatcher(records, onChange, () => {\n          typeWatchers.delete(records);\n          this.updateFlushWatchers();\n        });\n        typeWatchers.set(records, typeWatcher);\n        this.updateFlushWatchers();\n        typeWatcher.revalidate();\n      }\n      return typeWatcher.release;\n    }\n    /**\n      Wraps a given model type and observes changes to it.\n         @private\n      @method wrapModelType\n      @param {Class} klass A model class.\n      @param {String} modelName Name of the class.\n      @return {Object} The wrapped type has the following format:\n        name: {String} The name of the type.\n        count: {Integer} The number of records available.\n        columns: {Columns} An array of columns to describe the record.\n        object: {Class} The actual Model type class.\n    */\n    wrapModelType(klass, name) {\n      var records = this.getRecords(klass, name);\n      return {\n        name,\n        count: (0, _object.get)(records, 'length'),\n        columns: this.columnsForType(klass),\n        object: klass\n      };\n    }\n    /**\n      Fetches all models defined in the application.\n         @private\n      @method getModelTypes\n      @return {Array} Array of model types.\n    */\n    getModelTypes() {\n      var containerDebugAdapter = this.containerDebugAdapter;\n      var stringTypes = containerDebugAdapter.canCatalogEntriesByType('model') ? containerDebugAdapter.catalogEntriesByType('model') : this._getObjectsOnNamespaces();\n      // New adapters return strings instead of classes.\n      var klassTypes = stringTypes.map(name => {\n        return {\n          klass: this._nameToClass(name),\n          name\n        };\n      });\n      return klassTypes.filter(type => this.detect(type.klass));\n    }\n    /**\n      Loops over all namespaces and all objects\n      attached to them.\n         @private\n      @method _getObjectsOnNamespaces\n      @return {Array} Array of model type strings.\n    */\n    _getObjectsOnNamespaces() {\n      var namespaces = _namespace.default.NAMESPACES;\n      var types = [];\n      namespaces.forEach(namespace => {\n        for (var key in namespace) {\n          if (!Object.prototype.hasOwnProperty.call(namespace, key)) {\n            continue;\n          }\n          // Even though we will filter again in `getModelTypes`,\n          // we should not call `lookupFactory` on non-models\n          if (!this.detect(namespace[key])) {\n            continue;\n          }\n          var name = (0, _string.dasherize)(key);\n          types.push(name);\n        }\n      });\n      return types;\n    }\n    /**\n      Fetches all loaded records for a given type.\n         @public\n      @method getRecords\n      @return {Array} An array of records.\n       This array will be observed for changes,\n       so it should update when new records are added/removed.\n    */\n    getRecords(_klass, _name) {\n      return (0, _array.A)();\n    }\n    /**\n      Wraps a record and observers changes to it.\n         @private\n      @method wrapRecord\n      @param {Object} record The record instance.\n      @return {Object} The wrapped record. Format:\n      columnValues: {Array}\n      searchKeywords: {Array}\n    */\n    wrapRecord(record) {\n      return {\n        object: record,\n        columnValues: this.getRecordColumnValues(record),\n        searchKeywords: this.getRecordKeywords(record),\n        filterValues: this.getRecordFilterValues(record),\n        color: this.getRecordColor(record)\n      };\n    }\n    /**\n      Gets the values for each column.\n         @public\n      @method getRecordColumnValues\n      @return {Object} Keys should match column names defined\n      by the model type.\n    */\n    getRecordColumnValues(_record) {\n      return {};\n    }\n    /**\n      Returns keywords to match when searching records.\n         @public\n      @method getRecordKeywords\n      @return {Array} Relevant keywords for search.\n    */\n    getRecordKeywords(_record) {\n      return (0, _array.A)();\n    }\n    /**\n      Returns the values of filters defined by `getFilters`.\n         @public\n      @method getRecordFilterValues\n      @param {Object} record The record instance.\n      @return {Object} The filter values.\n    */\n    getRecordFilterValues(_record) {\n      return {};\n    }\n    /**\n      Each record can have a color that represents its state.\n         @public\n      @method getRecordColor\n      @param {Object} record The record instance\n      @return {String} The records color.\n        Possible options: black, red, blue, green.\n    */\n    getRecordColor(_record) {\n      return null;\n    }\n  }\n  _exports.default = DataAdapter;\n});","define(\"@ember/debug/index\", [\"exports\", \"@ember/-internals/browser-environment\", \"@ember/debug/lib/deprecate\", \"@ember/debug/lib/testing\", \"@ember/debug/lib/warn\", \"@ember/debug/lib/inspect\", \"@ember/debug/lib/capture-render-tree\"], function (_exports, _browserEnvironment, _deprecate2, _testing, _warn2, _inspect, _captureRenderTree) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.assert = _exports._warnIfUsingStrippedFeatureFlags = void 0;\n  Object.defineProperty(_exports, \"captureRenderTree\", {\n    enumerable: true,\n    get: function () {\n      return _captureRenderTree.default;\n    }\n  });\n  _exports.info = _exports.getDebugFunction = _exports.deprecateFunc = _exports.deprecate = _exports.debugSeal = _exports.debugFreeze = _exports.debug = void 0;\n  Object.defineProperty(_exports, \"inspect\", {\n    enumerable: true,\n    get: function () {\n      return _inspect.default;\n    }\n  });\n  Object.defineProperty(_exports, \"isTesting\", {\n    enumerable: true,\n    get: function () {\n      return _testing.isTesting;\n    }\n  });\n  Object.defineProperty(_exports, \"registerDeprecationHandler\", {\n    enumerable: true,\n    get: function () {\n      return _deprecate2.registerHandler;\n    }\n  });\n  Object.defineProperty(_exports, \"registerWarnHandler\", {\n    enumerable: true,\n    get: function () {\n      return _warn2.registerHandler;\n    }\n  });\n  _exports.setDebugFunction = _exports.runInDebug = void 0;\n  Object.defineProperty(_exports, \"setTesting\", {\n    enumerable: true,\n    get: function () {\n      return _testing.setTesting;\n    }\n  });\n  _exports.warn = void 0;\n  // These are the default production build versions:\n  var noop = () => {};\n  var assert = noop;\n  _exports.assert = assert;\n  var info = noop;\n  _exports.info = info;\n  var warn = noop;\n  _exports.warn = warn;\n  var debug = noop;\n  _exports.debug = debug;\n  var deprecate = noop;\n  _exports.deprecate = deprecate;\n  var debugSeal = noop;\n  _exports.debugSeal = debugSeal;\n  var debugFreeze = noop;\n  _exports.debugFreeze = debugFreeze;\n  var runInDebug = noop;\n  _exports.runInDebug = runInDebug;\n  var setDebugFunction = noop;\n  _exports.setDebugFunction = setDebugFunction;\n  var getDebugFunction = noop;\n  _exports.getDebugFunction = getDebugFunction;\n  var deprecateFunc = function () {\n    return arguments[arguments.length - 1];\n  };\n  _exports.deprecateFunc = deprecateFunc;\n  if (true /* DEBUG */) {\n    _exports.setDebugFunction = setDebugFunction = function (type, callback) {\n      switch (type) {\n        case 'assert':\n          return _exports.assert = assert = callback;\n        case 'info':\n          return _exports.info = info = callback;\n        case 'warn':\n          return _exports.warn = warn = callback;\n        case 'debug':\n          return _exports.debug = debug = callback;\n        case 'deprecate':\n          return _exports.deprecate = deprecate = callback;\n        case 'debugSeal':\n          return _exports.debugSeal = debugSeal = callback;\n        case 'debugFreeze':\n          return _exports.debugFreeze = debugFreeze = callback;\n        case 'runInDebug':\n          return _exports.runInDebug = runInDebug = callback;\n        case 'deprecateFunc':\n          return _exports.deprecateFunc = deprecateFunc = callback;\n      }\n    };\n    _exports.getDebugFunction = getDebugFunction = function (type) {\n      switch (type) {\n        case 'assert':\n          return assert;\n        case 'info':\n          return info;\n        case 'warn':\n          return warn;\n        case 'debug':\n          return debug;\n        case 'deprecate':\n          return deprecate;\n        case 'debugSeal':\n          return debugSeal;\n        case 'debugFreeze':\n          return debugFreeze;\n        case 'runInDebug':\n          return runInDebug;\n        case 'deprecateFunc':\n          return deprecateFunc;\n      }\n    };\n  }\n  /**\n  @module @ember/debug\n  */\n  if (true /* DEBUG */) {\n    /**\n      Verify that a certain expectation is met, or throw a exception otherwise.\n         This is useful for communicating assumptions in the code to other human\n      readers as well as catching bugs that accidentally violates these\n      expectations.\n         Assertions are removed from production builds, so they can be freely added\n      for documentation and debugging purposes without worries of incuring any\n      performance penalty. However, because of that, they should not be used for\n      checks that could reasonably fail during normal usage. Furthermore, care\n      should be taken to avoid accidentally relying on side-effects produced from\n      evaluating the condition itself, since the code will not run in production.\n         ```javascript\n      import { assert } from '@ember/debug';\n         // Test for truthiness\n      assert('Must pass a string', typeof str === 'string');\n         // Fail unconditionally\n      assert('This code path should never be run');\n      ```\n         @method assert\n      @static\n      @for @ember/debug\n      @param {String} description Describes the expectation. This will become the\n        text of the Error thrown if the assertion fails.\n      @param {any} condition Must be truthy for the assertion to pass. If\n        falsy, an exception will be thrown.\n      @public\n      @since 1.0.0\n    */\n    setDebugFunction('assert', function assert(desc, test) {\n      if (!test) {\n        throw new Error(`Assertion Failed: ${desc}`);\n      }\n    });\n    /**\n      Display a debug notice.\n         Calls to this function are not invoked in production builds.\n         ```javascript\n      import { debug } from '@ember/debug';\n         debug('I\\'m a debug notice!');\n      ```\n         @method debug\n      @for @ember/debug\n      @static\n      @param {String} message A debug message to display.\n      @public\n    */\n    setDebugFunction('debug', function debug(message) {\n      console.debug(`DEBUG: ${message}`); /* eslint-disable-line no-console */\n    });\n    /**\n      Display an info notice.\n         Calls to this function are removed from production builds, so they can be\n      freely added for documentation and debugging purposes without worries of\n      incuring any performance penalty.\n         @method info\n      @private\n    */\n    setDebugFunction('info', function info() {\n      console.info(...arguments); /* eslint-disable-line no-console */\n    });\n    /**\n     @module @ember/debug\n     @public\n    */\n    /**\n      Alias an old, deprecated method with its new counterpart.\n         Display a deprecation warning with the provided message and a stack trace\n      (Chrome and Firefox only) when the assigned method is called.\n         Calls to this function are removed from production builds, so they can be\n      freely added for documentation and debugging purposes without worries of\n      incuring any performance penalty.\n         ```javascript\n      import { deprecateFunc } from '@ember/debug';\n         Ember.oldMethod = deprecateFunc('Please use the new, updated method', options, Ember.newMethod);\n      ```\n         @method deprecateFunc\n      @static\n      @for @ember/debug\n      @param {String} message A description of the deprecation.\n      @param {Object} [options] The options object for `deprecate`.\n      @param {Function} func The new function called to replace its deprecated counterpart.\n      @return {Function} A new function that wraps the original function with a deprecation warning\n      @private\n    */\n    setDebugFunction('deprecateFunc', function deprecateFunc() {\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n      if (args.length === 3) {\n        var [message, options, func] = args;\n        return function () {\n          deprecate(message, false, options);\n          for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n            args[_key2] = arguments[_key2];\n          }\n          return func.apply(this, args);\n        };\n      } else {\n        var [_message, _func] = args;\n        return function () {\n          deprecate(_message);\n          return _func.apply(this, arguments);\n        };\n      }\n    });\n    /**\n     @module @ember/debug\n     @public\n    */\n    /**\n      Run a function meant for debugging.\n         Calls to this function are removed from production builds, so they can be\n      freely added for documentation and debugging purposes without worries of\n      incuring any performance penalty.\n         ```javascript\n      import Component from '@ember/component';\n      import { runInDebug } from '@ember/debug';\n         runInDebug(() => {\n        Component.reopen({\n          didInsertElement() {\n            console.log(\"I'm happy\");\n          }\n        });\n      });\n      ```\n         @method runInDebug\n      @for @ember/debug\n      @static\n      @param {Function} func The function to be executed.\n      @since 1.5.0\n      @public\n    */\n    setDebugFunction('runInDebug', function runInDebug(func) {\n      func();\n    });\n    setDebugFunction('debugSeal', function debugSeal(obj) {\n      Object.seal(obj);\n    });\n    setDebugFunction('debugFreeze', function debugFreeze(obj) {\n      // re-freezing an already frozen object introduces a significant\n      // performance penalty on Chrome (tested through 59).\n      //\n      // See: https://bugs.chromium.org/p/v8/issues/detail?id=6450\n      if (!Object.isFrozen(obj)) {\n        Object.freeze(obj);\n      }\n    });\n    setDebugFunction('deprecate', _deprecate2.default);\n    setDebugFunction('warn', _warn2.default);\n  }\n  var _warnIfUsingStrippedFeatureFlags;\n  _exports._warnIfUsingStrippedFeatureFlags = _warnIfUsingStrippedFeatureFlags;\n  if (true /* DEBUG */ && !(0, _testing.isTesting)()) {\n    if (typeof window !== 'undefined' && (_browserEnvironment.isFirefox || _browserEnvironment.isChrome) && window.addEventListener) {\n      window.addEventListener('load', () => {\n        if (document.documentElement && document.documentElement.dataset && !document.documentElement.dataset['emberExtension']) {\n          var downloadURL;\n          if (_browserEnvironment.isChrome) {\n            downloadURL = 'https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi';\n          } else if (_browserEnvironment.isFirefox) {\n            downloadURL = 'https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/';\n          }\n          debug(`For more advanced debugging, install the Ember Inspector from ${downloadURL}`);\n        }\n      }, false);\n    }\n  }\n});","define(\"@ember/debug/lib/capture-render-tree\", [\"exports\", \"@glimmer/util\"], function (_exports, _util) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = captureRenderTree;\n  /**\n    @module @ember/debug\n  */\n  /**\n    Ember Inspector calls this function to capture the current render tree.\n  \n    In production mode, this requires turning on `ENV._DEBUG_RENDER_TREE`\n    before loading Ember.\n  \n    @private\n    @static\n    @method captureRenderTree\n    @for @ember/debug\n    @param app {ApplicationInstance} An `ApplicationInstance`.\n    @since 3.14.0\n  */\n  function captureRenderTree(app) {\n    // SAFETY: Ideally we'd assert here but that causes awkward circular requires since this is also in @ember/debug.\n    // This is only for debug stuff so not very risky.\n    var renderer = (0, _util.expect)(app.lookup('renderer:-dom'), `BUG: owner is missing renderer`);\n    return renderer.debugRenderTree.capture();\n  }\n});","define(\"@ember/debug/lib/deprecate\", [\"exports\", \"@ember/-internals/environment\", \"@ember/debug/index\", \"@ember/debug/lib/handlers\"], function (_exports, _environment, _index, _handlers) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.registerHandler = _exports.missingOptionsIdDeprecation = _exports.missingOptionsDeprecation = _exports.missingOptionDeprecation = _exports.default = void 0;\n  /**\n   @module @ember/debug\n   @public\n  */\n  /**\n    Allows for runtime registration of handler functions that override the default deprecation behavior.\n    Deprecations are invoked by calls to [@ember/debug/deprecate](/ember/release/classes/@ember%2Fdebug/methods/deprecate?anchor=deprecate).\n    The following example demonstrates its usage by registering a handler that throws an error if the\n    message contains the word \"should\", otherwise defers to the default handler.\n  \n    ```javascript\n    import { registerDeprecationHandler } from '@ember/debug';\n  \n    registerDeprecationHandler((message, options, next) => {\n      if (message.indexOf('should') !== -1) {\n        throw new Error(`Deprecation message with should: ${message}`);\n      } else {\n        // defer to whatever handler was registered before this one\n        next(message, options);\n      }\n    });\n    ```\n  \n    The handler function takes the following arguments:\n  \n    <ul>\n      <li> <code>message</code> - The message received from the deprecation call.</li>\n      <li> <code>options</code> - An object passed in with the deprecation call containing additional information including:</li>\n        <ul>\n          <li> <code>id</code> - An id of the deprecation in the form of <code>package-name.specific-deprecation</code>.</li>\n          <li> <code>until</code> - The Ember version number the feature and deprecation will be removed in.</li>\n        </ul>\n      <li> <code>next</code> - A function that calls into the previously registered handler.</li>\n    </ul>\n  \n    @public\n    @static\n    @method registerDeprecationHandler\n    @for @ember/debug\n    @param handler {Function} A function to handle deprecation calls.\n    @since 2.1.0\n  */\n  var registerHandler = () => {};\n  _exports.registerHandler = registerHandler;\n  var missingOptionsDeprecation;\n  _exports.missingOptionsDeprecation = missingOptionsDeprecation;\n  var missingOptionsIdDeprecation;\n  _exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation;\n  var missingOptionDeprecation = () => '';\n  _exports.missingOptionDeprecation = missingOptionDeprecation;\n  var deprecate = () => {};\n  if (true /* DEBUG */) {\n    _exports.registerHandler = registerHandler = function registerHandler(handler) {\n      (0, _handlers.registerHandler)('deprecate', handler);\n    };\n    var formatMessage = function formatMessage(_message, options) {\n      var message = _message;\n      if (options === null || options === void 0 ? void 0 : options.id) {\n        message = message + ` [deprecation id: ${options.id}]`;\n      }\n      if (options === null || options === void 0 ? void 0 : options.until) {\n        message = message + ` This will be removed in ${options.for} ${options.until}.`;\n      }\n      if (options === null || options === void 0 ? void 0 : options.url) {\n        message += ` See ${options.url} for more details.`;\n      }\n      return message;\n    };\n    registerHandler(function logDeprecationToConsole(message, options) {\n      var updatedMessage = formatMessage(message, options);\n      console.warn(`DEPRECATION: ${updatedMessage}`); // eslint-disable-line no-console\n    });\n\n    var captureErrorForStack;\n    if (new Error().stack) {\n      captureErrorForStack = () => new Error();\n    } else {\n      captureErrorForStack = () => {\n        try {\n          __fail__.fail();\n        } catch (e) {\n          return e;\n        }\n      };\n    }\n    registerHandler(function logDeprecationStackTrace(message, options, next) {\n      if (_environment.ENV.LOG_STACKTRACE_ON_DEPRECATION) {\n        var stackStr = '';\n        var error = captureErrorForStack();\n        var stack;\n        if (error instanceof Error) {\n          if (error.stack) {\n            if (error['arguments']) {\n              // Chrome\n              stack = error.stack.replace(/^\\s+at\\s+/gm, '').replace(/^([^(]+?)([\\n$])/gm, '{anonymous}($1)$2').replace(/^Object.<anonymous>\\s*\\(([^)]+)\\)/gm, '{anonymous}($1)').split('\\n');\n              stack.shift();\n            } else {\n              // Firefox\n              stack = error.stack.replace(/(?:\\n@:0)?\\s+$/m, '').replace(/^\\(/gm, '{anonymous}(').split('\\n');\n            }\n            stackStr = `\\n    ${stack.slice(2).join('\\n    ')}`;\n          }\n        }\n        var updatedMessage = formatMessage(message, options);\n        console.warn(`DEPRECATION: ${updatedMessage}${stackStr}`); // eslint-disable-line no-console\n      } else {\n        next(message, options);\n      }\n    });\n    registerHandler(function raiseOnDeprecation(message, options, next) {\n      if (_environment.ENV.RAISE_ON_DEPRECATION) {\n        var updatedMessage = formatMessage(message);\n        throw new Error(updatedMessage);\n      } else {\n        next(message, options);\n      }\n    });\n    _exports.missingOptionsDeprecation = missingOptionsDeprecation = 'When calling `deprecate` you ' + 'must provide an `options` hash as the third parameter.  ' + '`options` should include `id` and `until` properties.';\n    _exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation = 'When calling `deprecate` you must provide `id` in options.';\n    _exports.missingOptionDeprecation = missingOptionDeprecation = (id, missingOption) => {\n      return `When calling \\`deprecate\\` you must provide \\`${missingOption}\\` in options. Missing options.${missingOption} in \"${id}\" deprecation`;\n    };\n    /**\n     @module @ember/debug\n     @public\n     */\n    /**\n      Display a deprecation warning with the provided message and a stack trace\n      (Chrome and Firefox only).\n         Ember itself leverages [Semantic Versioning](https://semver.org) to aid\n      projects in keeping up with changes to the framework. Before any\n      functionality or API is removed, it first flows linearly through a\n      deprecation staging process. The staging process currently contains two\n      stages: available and enabled.\n         Deprecations are initially released into the 'available' stage.\n      Deprecations will stay in this stage until the replacement API has been\n      marked as a recommended practice via the RFC process and the addon\n      ecosystem has generally adopted the change.\n         Once a deprecation meets the above criteria, it will move into the\n      'enabled' stage where it will remain until the functionality or API is\n      eventually removed.\n         For application and addon developers, \"available\" deprecations are not\n      urgent and \"enabled\" deprecations require action.\n         * In a production build, this method is defined as an empty function (NOP).\n      Uses of this method in Ember itself are stripped from the ember.prod.js build.\n         ```javascript\n      import { deprecate } from '@ember/debug';\n         deprecate(\n        'Use of `assign` has been deprecated. Please use `Object.assign` or the spread operator instead.',\n        false,\n        {\n          id: 'ember-polyfills.deprecate-assign',\n          until: '5.0.0',\n          url: 'https://deprecations.emberjs.com/v4.x/#toc_ember-polyfills-deprecate-assign',\n          for: 'ember-source',\n          since: {\n            available: '4.0.0',\n            enabled: '4.0.0',\n          },\n        }\n      );\n      ```\n         @method deprecate\n      @for @ember/debug\n      @param {String} message A description of the deprecation.\n      @param {Boolean} test A boolean. If falsy, the deprecation will be displayed.\n      @param {Object} options\n      @param {String} options.id A unique id for this deprecation. The id can be\n        used by Ember debugging tools to change the behavior (raise, log or silence)\n        for that specific deprecation. The id should be namespaced by dots, e.g.\n        \"view.helper.select\".\n      @param {string} options.until The version of Ember when this deprecation\n        warning will be removed.\n      @param {String} options.for A namespace for the deprecation, usually the package name\n      @param {Object} options.since Describes when the deprecation became available and enabled.\n      @param {String} [options.url] An optional url to the transition guide on the\n            emberjs.com website.\n      @static\n      @public\n      @since 1.0.0\n    */\n    deprecate = function deprecate(message, test, options) {\n      (0, _index.assert)(missingOptionsDeprecation, Boolean(options && (options.id || options.until)));\n      (0, _index.assert)(missingOptionsIdDeprecation, Boolean(options.id));\n      (0, _index.assert)(missingOptionDeprecation(options.id, 'until'), Boolean(options.until));\n      (0, _index.assert)(missingOptionDeprecation(options.id, 'for'), Boolean(options.for));\n      (0, _index.assert)(missingOptionDeprecation(options.id, 'since'), Boolean(options.since));\n      (0, _handlers.invoke)('deprecate', message, test, options);\n    };\n  }\n  var _default = deprecate;\n  _exports.default = _default;\n});","define(\"@ember/debug/lib/handlers\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.registerHandler = _exports.invoke = _exports.HANDLERS = void 0;\n  var HANDLERS = {};\n  _exports.HANDLERS = HANDLERS;\n  var registerHandler = function registerHandler(_type, _callback) {};\n  _exports.registerHandler = registerHandler;\n  var invoke = () => {};\n  _exports.invoke = invoke;\n  if (true /* DEBUG */) {\n    _exports.registerHandler = registerHandler = function registerHandler(type, callback) {\n      var nextHandler = HANDLERS[type] || (() => {});\n      HANDLERS[type] = (message, options) => {\n        callback(message, options, nextHandler);\n      };\n    };\n    _exports.invoke = invoke = function invoke(type, message, test, options) {\n      if (test) {\n        return;\n      }\n      var handlerForType = HANDLERS[type];\n      if (handlerForType) {\n        handlerForType(message, options);\n      }\n    };\n  }\n});","define(\"@ember/debug/lib/inspect\", [\"exports\", \"@glimmer/util\", \"@ember/debug\"], function (_exports, _util, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = inspect;\n  var {\n    toString: objectToString\n  } = Object.prototype;\n  var {\n    toString: functionToString\n  } = Function.prototype;\n  var {\n    isArray\n  } = Array;\n  var {\n    keys: objectKeys\n  } = Object;\n  var {\n    stringify\n  } = JSON;\n  var LIST_LIMIT = 100;\n  var DEPTH_LIMIT = 4;\n  var SAFE_KEY = /^[\\w$]+$/;\n  /**\n   @module @ember/debug\n  */\n  /**\n    Convenience method to inspect an object. This method will attempt to\n    convert the object into a useful string description.\n  \n    It is a pretty simple implementation. If you want something more robust,\n    use something like JSDump: https://github.com/NV/jsDump\n  \n    @method inspect\n    @static\n    @param {Object} obj The object you want to inspect.\n    @return {String} A description of the object\n    @since 1.4.0\n    @private\n  */\n  function inspect(obj) {\n    // detect Node util.inspect call inspect(depth: number, opts: object)\n    if (typeof obj === 'number' && arguments.length === 2) {\n      return this;\n    }\n    return inspectValue(obj, 0);\n  }\n  function inspectValue(value, depth, seen) {\n    var valueIsArray = false;\n    switch (typeof value) {\n      case 'undefined':\n        return 'undefined';\n      case 'object':\n        if (value === null) return 'null';\n        if (isArray(value)) {\n          valueIsArray = true;\n          break;\n        }\n        // is toString Object.prototype.toString or undefined then traverse\n        if (value.toString === objectToString || value.toString === undefined) {\n          break;\n        }\n        // custom toString\n        return value.toString();\n      case 'function':\n        return value.toString === functionToString ? value.name ? `[Function:${value.name}]` : `[Function]` : value.toString();\n      case 'string':\n        return stringify(value);\n      case 'symbol':\n      case 'boolean':\n      case 'number':\n      default:\n        return value.toString();\n    }\n    if (seen === undefined) {\n      seen = new _util._WeakSet();\n    } else {\n      if (seen.has(value)) return `[Circular]`;\n    }\n    seen.add(value);\n    return valueIsArray ? inspectArray(value, depth + 1, seen) : inspectObject(value, depth + 1, seen);\n  }\n  function inspectKey(key) {\n    return SAFE_KEY.test(key) ? key : stringify(key);\n  }\n  function inspectObject(obj, depth, seen) {\n    if (depth > DEPTH_LIMIT) {\n      return '[Object]';\n    }\n    var s = '{';\n    var keys = objectKeys(obj);\n    for (var i = 0; i < keys.length; i++) {\n      s += i === 0 ? ' ' : ', ';\n      if (i >= LIST_LIMIT) {\n        s += `... ${keys.length - LIST_LIMIT} more keys`;\n        break;\n      }\n      var key = keys[i];\n      (true && !(key) && (0, _debug.assert)('has key', key)); // Looping over array\n      s += `${inspectKey(String(key))}: ${inspectValue(obj[key], depth, seen)}`;\n    }\n    s += ' }';\n    return s;\n  }\n  function inspectArray(arr, depth, seen) {\n    if (depth > DEPTH_LIMIT) {\n      return '[Array]';\n    }\n    var s = '[';\n    for (var i = 0; i < arr.length; i++) {\n      s += i === 0 ? ' ' : ', ';\n      if (i >= LIST_LIMIT) {\n        s += `... ${arr.length - LIST_LIMIT} more items`;\n        break;\n      }\n      s += inspectValue(arr[i], depth, seen);\n    }\n    s += ' ]';\n    return s;\n  }\n});","define(\"@ember/debug/lib/testing\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.isTesting = isTesting;\n  _exports.setTesting = setTesting;\n  var testing = false;\n  function isTesting() {\n    return testing;\n  }\n  function setTesting(value) {\n    testing = Boolean(value);\n  }\n});","define(\"@ember/debug/lib/warn\", [\"exports\", \"@ember/debug/index\", \"@ember/debug/lib/handlers\"], function (_exports, _index, _handlers) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.registerHandler = _exports.missingOptionsIdDeprecation = _exports.missingOptionsDeprecation = _exports.default = void 0;\n  var registerHandler = () => {};\n  _exports.registerHandler = registerHandler;\n  var warn = () => {};\n  var missingOptionsDeprecation;\n  _exports.missingOptionsDeprecation = missingOptionsDeprecation;\n  var missingOptionsIdDeprecation;\n  /**\n  @module @ember/debug\n  */\n  _exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation;\n  if (true /* DEBUG */) {\n    /**\n      Allows for runtime registration of handler functions that override the default warning behavior.\n      Warnings are invoked by calls made to [@ember/debug/warn](/ember/release/classes/@ember%2Fdebug/methods/warn?anchor=warn).\n      The following example demonstrates its usage by registering a handler that does nothing overriding Ember's\n      default warning behavior.\n         ```javascript\n      import { registerWarnHandler } from '@ember/debug';\n         // next is not called, so no warnings get the default behavior\n      registerWarnHandler(() => {});\n      ```\n         The handler function takes the following arguments:\n         <ul>\n        <li> <code>message</code> - The message received from the warn call. </li>\n        <li> <code>options</code> - An object passed in with the warn call containing additional information including:</li>\n          <ul>\n            <li> <code>id</code> - An id of the warning in the form of <code>package-name.specific-warning</code>.</li>\n          </ul>\n        <li> <code>next</code> - A function that calls into the previously registered handler.</li>\n      </ul>\n         @public\n      @static\n      @method registerWarnHandler\n      @for @ember/debug\n      @param handler {Function} A function to handle warnings.\n      @since 2.1.0\n    */\n    _exports.registerHandler = registerHandler = function registerHandler(handler) {\n      (0, _handlers.registerHandler)('warn', handler);\n    };\n    registerHandler(function logWarning(message) {\n      /* eslint-disable no-console */\n      console.warn(`WARNING: ${message}`);\n      /* eslint-enable no-console */\n    });\n\n    _exports.missingOptionsDeprecation = missingOptionsDeprecation = 'When calling `warn` you ' + 'must provide an `options` hash as the third parameter.  ' + '`options` should include an `id` property.';\n    _exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation = 'When calling `warn` you must provide `id` in options.';\n    /**\n      Display a warning with the provided message.\n         * In a production build, this method is defined as an empty function (NOP).\n      Uses of this method in Ember itself are stripped from the ember.prod.js build.\n         ```javascript\n      import { warn } from '@ember/debug';\n      import tomsterCount from './tomster-counter'; // a module in my project\n         // Log a warning if we have more than 3 tomsters\n      warn('Too many tomsters!', tomsterCount <= 3, {\n        id: 'ember-debug.too-many-tomsters'\n      });\n      ```\n         @method warn\n      @for @ember/debug\n      @static\n      @param {String} message A warning to display.\n      @param {Boolean} test An optional boolean. If falsy, the warning\n        will be displayed.\n      @param {Object} options An object that can be used to pass a unique\n        `id` for this warning.  The `id` can be used by Ember debugging tools\n        to change the behavior (raise, log, or silence) for that specific warning.\n        The `id` should be namespaced by dots, e.g. \"ember-debug.feature-flag-with-features-stripped\"\n      @public\n      @since 1.0.0\n    */\n    warn = function warn(message, test, options) {\n      if (arguments.length === 2 && typeof test === 'object') {\n        options = test;\n        test = false;\n      }\n      (0, _index.assert)(missingOptionsDeprecation, Boolean(options));\n      (0, _index.assert)(missingOptionsIdDeprecation, Boolean(options && options.id));\n      (0, _handlers.invoke)('warn', message, test, options);\n    };\n  }\n  var _default = warn;\n  _exports.default = _default;\n});","define(\"@ember/deprecated-features/index\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.ASSIGN = void 0;\n  /* eslint-disable no-implicit-coercion */\n  // These versions should be the version that the deprecation was _introduced_,\n  // not the version that the feature will be removed.\n  var ASSIGN = !!'4.0.0-beta.1';\n  _exports.ASSIGN = ASSIGN;\n});","define(\"@ember/destroyable/index\", [\"exports\", \"@glimmer/destroyable\"], function (_exports, _destroyable) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"assertDestroyablesDestroyed\", {\n    enumerable: true,\n    get: function () {\n      return _destroyable.assertDestroyablesDestroyed;\n    }\n  });\n  Object.defineProperty(_exports, \"associateDestroyableChild\", {\n    enumerable: true,\n    get: function () {\n      return _destroyable.associateDestroyableChild;\n    }\n  });\n  Object.defineProperty(_exports, \"destroy\", {\n    enumerable: true,\n    get: function () {\n      return _destroyable.destroy;\n    }\n  });\n  Object.defineProperty(_exports, \"enableDestroyableTracking\", {\n    enumerable: true,\n    get: function () {\n      return _destroyable.enableDestroyableTracking;\n    }\n  });\n  Object.defineProperty(_exports, \"isDestroyed\", {\n    enumerable: true,\n    get: function () {\n      return _destroyable.isDestroyed;\n    }\n  });\n  Object.defineProperty(_exports, \"isDestroying\", {\n    enumerable: true,\n    get: function () {\n      return _destroyable.isDestroying;\n    }\n  });\n  _exports.registerDestructor = registerDestructor;\n  _exports.unregisterDestructor = unregisterDestructor;\n  /**\n    Ember manages the lifecycles and lifetimes of many built in constructs, such\n    as components, and does so in a hierarchical way - when a parent component is\n    destroyed, all of its children are destroyed as well.\n  \n    This destroyables API exposes the basic building blocks for destruction:\n  \n    * registering a function to be ran when an object is destroyed\n    * checking if an object is in a destroying state\n    * associate an object as a child of another so that the child object will be destroyed\n      when the associated parent object is destroyed.\n  \n    @module @ember/destroyable\n    @public\n  */\n  /**\n    This function is used to associate a destroyable object with a parent. When the parent\n    is destroyed, all registered children will also be destroyed.\n  \n    ```js\n    class CustomSelect extends Component {\n      constructor(...args) {\n        super(...args);\n  \n        // obj is now a child of the component. When the component is destroyed,\n        // obj will also be destroyed, and have all of its destructors triggered.\n        this.obj = associateDestroyableChild(this, {});\n      }\n    }\n    ```\n  \n    Returns the associated child for convenience.\n  \n    @method associateDestroyableChild\n    @for @ember/destroyable\n    @param {Object|Function} parent the destroyable to entangle the child destroyables lifetime with\n    @param {Object|Function} child the destroyable to be entangled with the parents lifetime\n    @returns {Object|Function} the child argument\n    @static\n    @public\n  */\n  /**\n   Receives a destroyable, and returns true if the destroyable has begun destroying. Otherwise returns\n   false.\n  \n    ```js\n    let obj = {};\n    isDestroying(obj); // false\n    destroy(obj);\n    isDestroying(obj); // true\n    // ...sometime later, after scheduled destruction\n    isDestroyed(obj); // true\n    isDestroying(obj); // true\n    ```\n  \n    @method isDestroying\n    @for @ember/destroyable\n    @param {Object|Function} destroyable the object to check\n    @returns {Boolean}\n    @static\n    @public\n  */\n  /**\n    Receives a destroyable, and returns true if the destroyable has finished destroying. Otherwise\n    returns false.\n  \n    ```js\n    let obj = {};\n  \n    isDestroyed(obj); // false\n    destroy(obj);\n  \n    // ...sometime later, after scheduled destruction\n  \n    isDestroyed(obj); // true\n    ```\n  \n    @method isDestroyed\n    @for @ember/destroyable\n    @param {Object|Function} destroyable the object to check\n    @returns {Boolean}\n    @static\n    @public\n  */\n  /**\n    Initiates the destruction of a destroyable object. It runs all associated destructors, and then\n    destroys all children recursively.\n  \n    ```js\n    let obj = {};\n  \n    registerDestructor(obj, () => console.log('destroyed!'));\n  \n    destroy(obj); // this will schedule the destructor to be called\n  \n    // ...some time later, during scheduled destruction\n  \n    // destroyed!\n    ```\n  \n    Destruction via `destroy()` follows these steps:\n  \n    1, Mark the destroyable such that `isDestroying(destroyable)` returns `true`\n    2, Call `destroy()` on each of the destroyable's associated children\n    3, Schedule calling the destroyable's destructors\n    4, Schedule setting destroyable such that `isDestroyed(destroyable)` returns `true`\n  \n    This results in the entire tree of destroyables being first marked as destroying,\n    then having all of their destructors called, and finally all being marked as isDestroyed.\n    There won't be any in between states where some items are marked as `isDestroying` while\n    destroying, while others are not.\n  \n    @method destroy\n    @for @ember/destroyable\n    @param {Object|Function} destroyable the object to destroy\n    @static\n    @public\n  */\n  /**\n    This function asserts that all objects which have associated destructors or associated children\n    have been destroyed at the time it is called. It is meant to be a low level hook that testing\n    frameworks can use to hook into and validate that all destroyables have in fact been destroyed.\n  \n    This function requires that `enableDestroyableTracking` was called previously, and is only\n    available in non-production builds.\n  \n    @method assertDestroyablesDestroyed\n    @for @ember/destroyable\n    @static\n    @public\n  */\n  /**\n    This function instructs the destroyable system to keep track of all destroyables (their\n    children, destructors, etc). This enables a future usage of `assertDestroyablesDestroyed`\n    to be used to ensure that all destroyable tasks (registered destructors and associated children)\n    have completed when `assertDestroyablesDestroyed` is called.\n  \n    @method enableDestroyableTracking\n    @for @ember/destroyable\n    @static\n    @public\n  */\n  /**\n    Receives a destroyable object and a destructor function, and associates the\n    function with it. When the destroyable is destroyed with destroy, or when its\n    parent is destroyed, the destructor function will be called.\n  \n    ```js\n    import Component from '@glimmer/component';\n    import { registerDestructor } from '@ember/destroyable';\n  \n    class Modal extends Component {\n      @service resize;\n  \n      constructor(...args) {\n        super(...args);\n  \n        this.resize.register(this, this.layout);\n  \n        registerDestructor(this, () => this.resize.unregister(this));\n      }\n    }\n    ```\n  \n    Multiple destructors can be associated with a given destroyable, and they can be\n    associated over time, allowing libraries to dynamically add destructors as needed.\n    `registerDestructor` also returns the associated destructor function, for convenience.\n  \n    The destructor function is passed a single argument, which is the destroyable itself.\n    This allows the function to be reused multiple times for many destroyables, rather\n    than creating a closure function per destroyable.\n  \n    ```js\n    import Component from '@glimmer/component';\n    import { registerDestructor } from '@ember/destroyable';\n  \n    function unregisterResize(instance) {\n      instance.resize.unregister(instance);\n    }\n  \n    class Modal extends Component {\n      @service resize;\n  \n      constructor(...args) {\n        super(...args);\n  \n        this.resize.register(this, this.layout);\n  \n        registerDestructor(this, unregisterResize);\n      }\n    }\n    ```\n  \n    @method registerDestructor\n    @for @ember/destroyable\n    @param {Object|Function} destroyable the destroyable to register the destructor function with\n    @param {Function} destructor the destructor to run when the destroyable object is destroyed\n    @static\n    @public\n  */\n  function registerDestructor(destroyable, destructor) {\n    return (0, _destroyable.registerDestructor)(destroyable, destructor);\n  }\n  /**\n    Receives a destroyable and a destructor function, and de-associates the destructor\n    from the destroyable.\n  \n    ```js\n    import Component from '@glimmer/component';\n    import { registerDestructor, unregisterDestructor } from '@ember/destroyable';\n  \n    class Modal extends Component {\n      @service modals;\n  \n      constructor(...args) {\n        super(...args);\n  \n        this.modals.add(this);\n  \n        this.modalDestructor = registerDestructor(this, () => this.modals.remove(this));\n      }\n  \n      @action pinModal() {\n        unregisterDestructor(this, this.modalDestructor);\n      }\n    }\n    ```\n  \n    @method unregisterDestructor\n    @for @ember/destroyable\n    @param {Object|Function} destroyable the destroyable to unregister the destructor function from\n    @param {Function} destructor the destructor to remove from the destroyable\n    @static\n    @public\n  */\n  function unregisterDestructor(destroyable, destructor) {\n    return (0, _destroyable.unregisterDestructor)(destroyable, destructor);\n  }\n});","define(\"@ember/engine/index\", [\"exports\", \"@ember/engine/lib/engine-parent\", \"@ember/-internals/utils\", \"@ember/controller\", \"@ember/application/namespace\", \"@ember/-internals/container\", \"dag-map\", \"@ember/debug\", \"@ember/debug/container-debug-adapter\", \"@ember/object\", \"@ember/engine/instance\", \"@ember/routing/-internals\", \"@ember/-internals/views\", \"@ember/-internals/glimmer\", \"@ember/-internals/runtime\"], function (_exports, _engineParent, _utils, _controller, _namespace, _container, _dagMap, _debug, _containerDebugAdapter, _object, _instance, _internals, _views, _glimmer, _runtime) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.buildInitializerMethod = buildInitializerMethod;\n  _exports.default = void 0;\n  Object.defineProperty(_exports, \"getEngineParent\", {\n    enumerable: true,\n    get: function () {\n      return _engineParent.getEngineParent;\n    }\n  });\n  Object.defineProperty(_exports, \"setEngineParent\", {\n    enumerable: true,\n    get: function () {\n      return _engineParent.setEngineParent;\n    }\n  });\n  function props(obj) {\n    var properties = [];\n    for (var key in obj) {\n      properties.push(key);\n    }\n    return properties;\n  }\n  class Engine extends _namespace.default.extend(_runtime.RegistryProxyMixin) {\n    constructor() {\n      super(...arguments);\n      /**\n        A private flag indicating whether an engine's initializers have run yet.\n               @private\n        @property _initializersRan\n      */\n      this._initializersRan = false;\n    }\n    /**\n      This creates a registry with the default Ember naming conventions.\n         It also configures the registry:\n         * registered views are created every time they are looked up (they are\n        not singletons)\n      * registered templates are not factories; the registered value is\n        returned directly.\n      * the router receives the application as its `namespace` property\n      * all controllers receive the router as their `target` and `controllers`\n        properties\n      * all controllers receive the application as their `namespace` property\n      * the application view receives the application controller as its\n        `controller` property\n      * the application view receives the application template as its\n        `defaultTemplate` property\n         @method buildRegistry\n      @static\n      @param {Application} namespace the application for which to\n        build the registry\n      @return {Ember.Registry} the built registry\n      @private\n    */\n    static buildRegistry(namespace) {\n      var registry = new _container.Registry({\n        resolver: resolverFor(namespace)\n      });\n      registry.set = _object.set;\n      registry.register('application:main', namespace, {\n        instantiate: false\n      });\n      commonSetupRegistry(registry);\n      (0, _glimmer.setupEngineRegistry)(registry);\n      return registry;\n    }\n    init(properties) {\n      super.init(properties);\n      this.buildRegistry();\n    }\n    /**\n      Ensure that initializers are run once, and only once, per engine.\n         @private\n      @method ensureInitializers\n    */\n    ensureInitializers() {\n      if (!this._initializersRan) {\n        this.runInitializers();\n        this._initializersRan = true;\n      }\n    }\n    /**\n      Create an EngineInstance for this engine.\n         @public\n      @method buildInstance\n      @return {EngineInstance} the engine instance\n    */\n    buildInstance(options) {\n      if (options === void 0) {\n        options = {};\n      }\n      this.ensureInitializers();\n      return _instance.default.create(Object.assign(Object.assign({}, options), {\n        base: this\n      }));\n    }\n    /**\n      Build and configure the registry for the current engine.\n         @private\n      @method buildRegistry\n      @return {Ember.Registry} the configured registry\n    */\n    buildRegistry() {\n      var registry = this.__registry__ = this.constructor.buildRegistry(this);\n      return registry;\n    }\n    /**\n      @private\n      @method initializer\n    */\n    initializer(initializer) {\n      this.constructor.initializer(initializer);\n    }\n    /**\n      @private\n      @method instanceInitializer\n    */\n    instanceInitializer(initializer) {\n      this.constructor.instanceInitializer(initializer);\n    }\n    /**\n      @private\n      @method runInitializers\n    */\n    runInitializers() {\n      this._runInitializer('initializers', (name, initializer) => {\n        (true && !(initializer) && (0, _debug.assert)(`No application initializer named '${name}'`, initializer));\n        initializer.initialize(this);\n      });\n    }\n    /**\n      @private\n      @since 1.12.0\n      @method runInstanceInitializers\n    */\n    runInstanceInitializers(instance) {\n      this._runInitializer('instanceInitializers', (name, initializer) => {\n        (true && !(initializer) && (0, _debug.assert)(`No instance initializer named '${name}'`, initializer));\n        initializer.initialize(instance);\n      });\n    }\n    _runInitializer(bucketName, cb) {\n      var initializersByName = (0, _object.get)(this.constructor, bucketName);\n      var initializers = props(initializersByName);\n      var graph = new _dagMap.default();\n      var initializer;\n      for (var name of initializers) {\n        initializer = initializersByName[name];\n        (true && !(initializer) && (0, _debug.assert)(`missing ${bucketName}: ${name}`, initializer));\n        graph.add(initializer.name, initializer, initializer.before, initializer.after);\n      }\n      graph.topsort(cb);\n    }\n  }\n  Engine.initializers = Object.create(null);\n  Engine.instanceInitializers = Object.create(null);\n  /**\n    The goal of initializers should be to register dependencies and injections.\n    This phase runs once. Because these initializers may load code, they are\n    allowed to defer application readiness and advance it. If you need to access\n    the container or store you should use an InstanceInitializer that will be run\n    after all initializers and therefore after all code is loaded and the app is\n    ready.\n  \n    Initializer receives an object which has the following attributes:\n    `name`, `before`, `after`, `initialize`. The only required attribute is\n    `initialize`, all others are optional.\n  \n    * `name` allows you to specify under which name the initializer is registered.\n    This must be a unique name, as trying to register two initializers with the\n    same name will result in an error.\n  \n    ```app/initializer/named-initializer.js\n    import { debug } from '@ember/debug';\n  \n    export function initialize() {\n      debug('Running namedInitializer!');\n    }\n  \n    export default {\n      name: 'named-initializer',\n      initialize\n    };\n    ```\n  \n    * `before` and `after` are used to ensure that this initializer is ran prior\n    or after the one identified by the value. This value can be a single string\n    or an array of strings, referencing the `name` of other initializers.\n  \n    An example of ordering initializers, we create an initializer named `first`:\n  \n    ```app/initializer/first.js\n    import { debug } from '@ember/debug';\n  \n    export function initialize() {\n      debug('First initializer!');\n    }\n  \n    export default {\n      name: 'first',\n      initialize\n    };\n    ```\n  \n    ```bash\n    // DEBUG: First initializer!\n    ```\n  \n    We add another initializer named `second`, specifying that it should run\n    after the initializer named `first`:\n  \n    ```app/initializer/second.js\n    import { debug } from '@ember/debug';\n  \n    export function initialize() {\n      debug('Second initializer!');\n    }\n  \n    export default {\n      name: 'second',\n      after: 'first',\n      initialize\n    };\n    ```\n  \n    ```\n    // DEBUG: First initializer!\n    // DEBUG: Second initializer!\n    ```\n  \n    Afterwards we add a further initializer named `pre`, this time specifying\n    that it should run before the initializer named `first`:\n  \n    ```app/initializer/pre.js\n    import { debug } from '@ember/debug';\n  \n    export function initialize() {\n      debug('Pre initializer!');\n    }\n  \n    export default {\n      name: 'pre',\n      before: 'first',\n      initialize\n    };\n    ```\n  \n    ```bash\n    // DEBUG: Pre initializer!\n    // DEBUG: First initializer!\n    // DEBUG: Second initializer!\n    ```\n  \n    Finally we add an initializer named `post`, specifying it should run after\n    both the `first` and the `second` initializers:\n  \n    ```app/initializer/post.js\n    import { debug } from '@ember/debug';\n  \n    export function initialize() {\n      debug('Post initializer!');\n    }\n  \n    export default {\n      name: 'post',\n      after: ['first', 'second'],\n      initialize\n    };\n    ```\n  \n    ```bash\n    // DEBUG: Pre initializer!\n    // DEBUG: First initializer!\n    // DEBUG: Second initializer!\n    // DEBUG: Post initializer!\n    ```\n  \n    * `initialize` is a callback function that receives one argument,\n      `application`, on which you can operate.\n  \n    Example of using `application` to register an adapter:\n  \n    ```app/initializer/api-adapter.js\n    import ApiAdapter from '../utils/api-adapter';\n  \n    export function initialize(application) {\n      application.register('api-adapter:main', ApiAdapter);\n    }\n  \n    export default {\n      name: 'post',\n      after: ['first', 'second'],\n      initialize\n    };\n    ```\n  \n    @method initializer\n    @param initializer {Object}\n    @public\n  */\n  Engine.initializer = buildInitializerMethod('initializers', 'initializer');\n  /**\n    Instance initializers run after all initializers have run. Because\n    instance initializers run after the app is fully set up. We have access\n    to the store, container, and other items. However, these initializers run\n    after code has loaded and are not allowed to defer readiness.\n  \n    Instance initializer receives an object which has the following attributes:\n    `name`, `before`, `after`, `initialize`. The only required attribute is\n    `initialize`, all others are optional.\n  \n    * `name` allows you to specify under which name the instanceInitializer is\n    registered. This must be a unique name, as trying to register two\n    instanceInitializer with the same name will result in an error.\n  \n    ```app/initializer/named-instance-initializer.js\n    import { debug } from '@ember/debug';\n  \n    export function initialize() {\n      debug('Running named-instance-initializer!');\n    }\n  \n    export default {\n      name: 'named-instance-initializer',\n      initialize\n    };\n    ```\n  \n    * `before` and `after` are used to ensure that this initializer is ran prior\n    or after the one identified by the value. This value can be a single string\n    or an array of strings, referencing the `name` of other initializers.\n  \n    * See Application.initializer for discussion on the usage of before\n    and after.\n  \n    Example instanceInitializer to preload data into the store.\n  \n    ```app/initializer/preload-data.js\n  \n    export function initialize(application) {\n        var userConfig, userConfigEncoded, store;\n        // We have a HTML escaped JSON representation of the user's basic\n        // configuration generated server side and stored in the DOM of the main\n        // index.html file. This allows the app to have access to a set of data\n        // without making any additional remote calls. Good for basic data that is\n        // needed for immediate rendering of the page. Keep in mind, this data,\n        // like all local models and data can be manipulated by the user, so it\n        // should not be relied upon for security or authorization.\n  \n        // Grab the encoded data from the meta tag\n        userConfigEncoded = document.querySelector('head meta[name=app-user-config]').attr('content');\n  \n        // Unescape the text, then parse the resulting JSON into a real object\n        userConfig = JSON.parse(unescape(userConfigEncoded));\n  \n        // Lookup the store\n        store = application.lookup('service:store');\n  \n        // Push the encoded JSON into the store\n        store.pushPayload(userConfig);\n    }\n  \n    export default {\n      name: 'named-instance-initializer',\n      initialize\n    };\n    ```\n  \n    @method instanceInitializer\n    @param instanceInitializer\n    @public\n  */\n  Engine.instanceInitializer = buildInitializerMethod('instanceInitializers', 'instance initializer');\n  /**\n    This function defines the default lookup rules for container lookups:\n  \n    * templates are looked up on `Ember.TEMPLATES`\n    * other names are looked up on the application after classifying the name.\n      For example, `controller:post` looks up `App.PostController` by default.\n    * if the default lookup fails, look for registered classes on the container\n  \n    This allows the application to register default injections in the container\n    that could be overridden by the normal naming convention.\n  \n    @private\n    @method resolverFor\n    @param {Ember.Enginer} namespace the namespace to look for classes\n    @return {*} the resolved value for a given lookup\n  */\n  function resolverFor(namespace) {\n    var ResolverClass = namespace.Resolver;\n    var props = {\n      namespace\n    };\n    return ResolverClass.create(props);\n  }\n  /** @internal */\n  function buildInitializerMethod(bucketName, humanName) {\n    return function (initializer) {\n      // If this is the first initializer being added to a subclass, we are going to reopen the class\n      // to make sure we have a new `initializers` object, which extends from the parent class' using\n      // prototypal inheritance. Without this, attempting to add initializers to the subclass would\n      // pollute the parent class as well as other subclasses.\n      // SAFETY: The superclass may be an Engine, we don't call unless we confirmed it was ok.\n      var superclass = this.superclass;\n      if (superclass[bucketName] !== undefined && superclass[bucketName] === this[bucketName]) {\n        var attrs = {\n          [bucketName]: Object.create(this[bucketName])\n        };\n        this.reopenClass(attrs);\n      }\n      (true && !(!this[bucketName][initializer.name]) && (0, _debug.assert)(`The ${humanName} '${initializer.name}' has already been registered`, !this[bucketName][initializer.name]));\n      (true && !((0, _utils.canInvoke)(initializer, 'initialize')) && (0, _debug.assert)(`An ${humanName} cannot be registered without an initialize function`, (0, _utils.canInvoke)(initializer, 'initialize')));\n      (true && !(initializer.name !== undefined) && (0, _debug.assert)(`An ${humanName} cannot be registered without a name property`, initializer.name !== undefined));\n      var initializers = this[bucketName];\n      initializers[initializer.name] = initializer;\n    };\n  }\n  function commonSetupRegistry(registry) {\n    registry.optionsForType('component', {\n      singleton: false\n    });\n    registry.optionsForType('view', {\n      singleton: false\n    });\n    registry.register('controller:basic', _controller.default, {\n      instantiate: false\n    });\n    // Register the routing service...\n    registry.register('service:-routing', _internals.RoutingService);\n    // DEBUGGING\n    registry.register('resolver-for-debugging:main', registry.resolver, {\n      instantiate: false\n    });\n    registry.register('container-debug-adapter:main', _containerDebugAdapter.default);\n    registry.register('component-lookup:main', _views.ComponentLookup);\n  }\n  var _default = Engine;\n  _exports.default = _default;\n});","define(\"@ember/engine/instance\", [\"exports\", \"@ember/object\", \"@ember/-internals/runtime\", \"@ember/debug\", \"@ember/-internals/container\", \"@ember/-internals/utils\", \"@ember/engine/lib/engine-parent\", \"@ember/-internals/owner\", \"@ember/engine\"], function (_exports, _object, _runtime, _debug, _container, _utils, _engineParent, _owner, _engine) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n  @module @ember/engine\n  */\n\n  var CEngine = _engine.default;\n  class EngineInstance extends _object.default.extend(_runtime.RegistryProxyMixin, _runtime.ContainerProxyMixin) {\n    constructor() {\n      super(...arguments);\n      this._booted = false;\n      this._bootPromise = null;\n    }\n    /**\n     @private\n     @method setupRegistry\n     @param {Registry} registry\n     @param {BootOptions} options\n     */\n    // This is effectively an \"abstract\" method: it defines the contract a\n    // subclass (e.g. `ApplicationInstance`) must follow to implement this\n    // behavior, but an `EngineInstance` has no behavior of its own here.\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    static setupRegistry(_registry, _options) {}\n    init(properties) {\n      var _a;\n      super.init(properties);\n      // Ensure the guid gets setup for this instance\n      (0, _utils.guidFor)(this);\n      (_a = this.base) !== null && _a !== void 0 ? _a : this.base = this.application;\n      // Create a per-instance registry that will use the application's registry\n      // as a fallback for resolving registrations.\n      var registry = this.__registry__ = new _container.Registry({\n        fallback: this.base.__registry__\n      });\n      // Create a per-instance container from the instance's registry\n      this.__container__ = registry.container({\n        owner: this\n      });\n      this._booted = false;\n    }\n    /**\n      Initialize the `EngineInstance` and return a promise that resolves\n      with the instance itself when the boot process is complete.\n         The primary task here is to run any registered instance initializers.\n         See the documentation on `BootOptions` for the options it takes.\n         @public\n      @method boot\n      @param options {Object}\n      @return {Promise<EngineInstance,Error>}\n    */\n    boot(options) {\n      if (this._bootPromise) {\n        return this._bootPromise;\n      }\n      this._bootPromise = new _runtime.RSVP.Promise(resolve => {\n        resolve(this._bootSync(options));\n      });\n      return this._bootPromise;\n    }\n    /**\n      Unfortunately, a lot of existing code assumes booting an instance is\n      synchronous – specifically, a lot of tests assume the last call to\n      `app.advanceReadiness()` or `app.reset()` will result in a new instance\n      being fully-booted when the current runloop completes.\n         We would like new code (like the `visit` API) to stop making this\n      assumption, so we created the asynchronous version above that returns a\n      promise. But until we have migrated all the code, we would have to expose\n      this method for use *internally* in places where we need to boot an instance\n      synchronously.\n         @private\n    */\n    _bootSync(options) {\n      if (this._booted) {\n        return this;\n      }\n      (true && !((0, _engineParent.getEngineParent)(this)) && (0, _debug.assert)(\"An engine instance's parent must be set via `setEngineParent(engine, parent)` prior to calling `engine.boot()`.\", (0, _engineParent.getEngineParent)(this)));\n      this.cloneParentDependencies();\n      this.setupRegistry(options);\n      this.base.runInstanceInitializers(this);\n      this._booted = true;\n      return this;\n    }\n    setupRegistry(options) {\n      if (options === void 0) {\n        options = this.__container__.lookup('-environment:main');\n      }\n      this.constructor.setupRegistry(this.__registry__, options);\n    }\n    /**\n     Unregister a factory.\n        Overrides `RegistryProxy#unregister` in order to clear any cached instances\n     of the unregistered factory.\n        @public\n     @method unregister\n     @param {String} fullName\n     */\n    unregister(fullName) {\n      this.__container__.reset(fullName);\n      // We overwrote this method from RegistryProxyMixin.\n      this.__registry__.unregister(fullName);\n    }\n    /**\n      Build a new `EngineInstance` that's a child of this instance.\n         Engines must be registered by name with their parent engine\n      (or application).\n         @private\n      @method buildChildEngineInstance\n      @param name {String} the registered name of the engine.\n      @param options {Object} options provided to the engine instance.\n      @return {EngineInstance,Error}\n    */\n    buildChildEngineInstance(name, options) {\n      if (options === void 0) {\n        options = {};\n      }\n      var Engine = this.lookup(`engine:${name}`);\n      if (!Engine) {\n        throw new Error(`You attempted to mount the engine '${name}', but it is not registered with its parent.`);\n      }\n      (true && !(Engine instanceof CEngine) && (0, _debug.assert)('expected an Engine', Engine instanceof CEngine));\n      var engineInstance = Engine.buildInstance(options);\n      (0, _engineParent.setEngineParent)(engineInstance, this);\n      return engineInstance;\n    }\n    /**\n      Clone dependencies shared between an engine instance and its parent.\n         @private\n      @method cloneParentDependencies\n    */\n    cloneParentDependencies() {\n      var parent = (0, _engineParent.getEngineParent)(this);\n      (true && !(parent) && (0, _debug.assert)('expected parent', parent));\n      var registrations = ['route:basic', 'service:-routing'];\n      registrations.forEach(key => {\n        var registration = parent.resolveRegistration(key);\n        (true && !((0, _owner.isFactory)(registration)) && (0, _debug.assert)('expected registration to be a factory', (0, _owner.isFactory)(registration)));\n        this.register(key, registration);\n      });\n      var env = parent.lookup('-environment:main');\n      this.register('-environment:main', env, {\n        instantiate: false\n      });\n      // The type annotation forces TS to (a) validate that these match and (b)\n      // *notice* that they match, e.g. below on the `singletons.push()`.\n      var singletons = ['router:main', (0, _container.privatize)`-bucket-cache:main`, '-view-registry:main', `renderer:-dom`, 'service:-document'];\n      if (env['isInteractive']) {\n        singletons.push('event_dispatcher:main');\n      }\n      singletons.forEach(key => {\n        // SAFETY: We already expect this to be a singleton\n        var singleton = parent.lookup(key);\n        this.register(key, singleton, {\n          instantiate: false\n        });\n      });\n    }\n  }\n  var _default = EngineInstance;\n  _exports.default = _default;\n});","define(\"@ember/engine/lib/engine-parent\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.ENGINE_PARENT = void 0;\n  _exports.getEngineParent = getEngineParent;\n  _exports.setEngineParent = setEngineParent;\n  var ENGINE_PARENT = Symbol('ENGINE_PARENT');\n  /**\n    `getEngineParent` retrieves an engine instance's parent instance.\n  \n    @method getEngineParent\n    @param {EngineInstance} engine An engine instance.\n    @return {EngineInstance} The parent engine instance.\n    @for @ember/engine\n    @static\n    @private\n  */\n  _exports.ENGINE_PARENT = ENGINE_PARENT;\n  function getEngineParent(engine) {\n    return engine[ENGINE_PARENT];\n  }\n  /**\n    `setEngineParent` sets an engine instance's parent instance.\n  \n    @method setEngineParent\n    @param {EngineInstance} engine An engine instance.\n    @param {EngineInstance} parent The parent engine instance.\n    @private\n  */\n  function setEngineParent(engine, parent) {\n    engine[ENGINE_PARENT] = parent;\n  }\n});","define(\"@ember/enumerable/index\", [\"exports\", \"@ember/object/mixin\"], function (_exports, _mixin) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var Enumerable = _mixin.default.create();\n  var _default = Enumerable;\n  _exports.default = _default;\n});","define(\"@ember/enumerable/mutable\", [\"exports\", \"@ember/enumerable\", \"@ember/object/mixin\"], function (_exports, _enumerable, _mixin) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var MutableEnumerable = _mixin.default.create(_enumerable.default);\n  var _default = MutableEnumerable;\n  _exports.default = _default;\n});","define(\"@ember/error/index\", [\"exports\", \"@ember/debug\"], function (_exports, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n    The JavaScript Error object used by Ember.assert.\n  \n    @class Error\n    @namespace Ember\n    @extends Error\n    @constructor\n    @public\n    @deprecated\n  */\n  var EmberError;\n  if (true /* DEBUG */) {\n    // eslint-disable-next-line no-inner-declarations\n    function EmberDebugConstructor(message) {\n      (true && !(false) && (0, _debug.deprecate)('The @ember/error package merely re-exported the native Error and is deprecated. Please use a native Error directly instead.', false, {\n        id: 'deprecate-ember-error',\n        until: '5.0.0',\n        url: 'https://deprecations.emberjs.com/v4.x/#toc_deprecate-ember-error',\n        for: 'ember-source',\n        since: {\n          available: '4.10.0',\n          enabled: '4.10.0'\n        }\n      }));\n      return new Error(message);\n    }\n    EmberDebugConstructor.prototype = Error.prototype;\n    // SAFETY: We need this cast since our EmberDebugConstructor doesn't define a type for `new` even though it will work with `new`.\n    EmberError = EmberDebugConstructor;\n  } else {\n    EmberError = Error;\n  }\n  var _default = EmberError;\n  _exports.default = _default;\n});","define(\"@ember/helper/index\", [\"exports\", \"@glimmer/manager\", \"@glimmer/runtime\"], function (_exports, _manager, _runtime) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"array\", {\n    enumerable: true,\n    get: function () {\n      return _runtime.array;\n    }\n  });\n  Object.defineProperty(_exports, \"capabilities\", {\n    enumerable: true,\n    get: function () {\n      return _manager.helperCapabilities;\n    }\n  });\n  Object.defineProperty(_exports, \"concat\", {\n    enumerable: true,\n    get: function () {\n      return _runtime.concat;\n    }\n  });\n  Object.defineProperty(_exports, \"fn\", {\n    enumerable: true,\n    get: function () {\n      return _runtime.fn;\n    }\n  });\n  Object.defineProperty(_exports, \"get\", {\n    enumerable: true,\n    get: function () {\n      return _runtime.get;\n    }\n  });\n  Object.defineProperty(_exports, \"hash\", {\n    enumerable: true,\n    get: function () {\n      return _runtime.hash;\n    }\n  });\n  Object.defineProperty(_exports, \"invokeHelper\", {\n    enumerable: true,\n    get: function () {\n      return _runtime.invokeHelper;\n    }\n  });\n  Object.defineProperty(_exports, \"setHelperManager\", {\n    enumerable: true,\n    get: function () {\n      return _manager.setHelperManager;\n    }\n  });\n});","define(\"@ember/instrumentation/index\", [\"exports\", \"@ember/-internals/environment\", \"@ember/debug\"], function (_exports, _environment, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports._instrumentStart = _instrumentStart;\n  _exports.flaggedInstrument = flaggedInstrument;\n  _exports.instrument = instrument;\n  _exports.reset = reset;\n  _exports.subscribe = subscribe;\n  _exports.subscribers = void 0;\n  _exports.unsubscribe = unsubscribe;\n  /* eslint no-console:off */\n  /* global console */\n\n  /**\n  @module @ember/instrumentation\n  @private\n  */\n  /**\n    The purpose of the Ember Instrumentation module is\n    to provide efficient, general-purpose instrumentation\n    for Ember.\n  \n    Subscribe to a listener by using `subscribe`:\n  \n    ```javascript\n    import { subscribe } from '@ember/instrumentation';\n  \n    subscribe(\"render\", {\n      before(name, timestamp, payload) {\n  \n      },\n  \n      after(name, timestamp, payload) {\n  \n      }\n    });\n    ```\n  \n    If you return a value from the `before` callback, that same\n    value will be passed as a fourth parameter to the `after`\n    callback.\n  \n    Instrument a block of code by using `instrument`:\n  \n    ```javascript\n    import { instrument } from '@ember/instrumentation';\n  \n    instrument(\"render.handlebars\", payload, function() {\n      // rendering logic\n    }, binding);\n    ```\n  \n    Event names passed to `instrument` are namespaced\n    by periods, from more general to more specific. Subscribers\n    can listen for events by whatever level of granularity they\n    are interested in.\n  \n    In the above example, the event is `render.handlebars`,\n    and the subscriber listened for all events beginning with\n    `render`. It would receive callbacks for events named\n    `render`, `render.handlebars`, `render.container`, or\n    even `render.handlebars.layout`.\n  \n    @class Instrumentation\n    @static\n    @private\n  */\n  var subscribers = [];\n  _exports.subscribers = subscribers;\n  var cache = {};\n  function populateListeners(name) {\n    var listeners = [];\n    for (var subscriber of subscribers) {\n      if (subscriber.regex.test(name)) {\n        listeners.push(subscriber.object);\n      }\n    }\n    cache[name] = listeners;\n    return listeners;\n  }\n  var time = (() => {\n    var perf = 'undefined' !== typeof window ? window.performance || {} : {};\n    var fn = perf.now || perf.mozNow || perf.webkitNow || perf.msNow || perf.oNow;\n    return fn ? fn.bind(perf) : Date.now;\n  })();\n  function isCallback(value) {\n    return typeof value === 'function';\n  }\n  function instrument(name, p1, p2, p3) {\n    var _payload;\n    var callback;\n    var binding;\n    if (arguments.length <= 3 && isCallback(p1)) {\n      callback = p1;\n      binding = p2;\n    } else {\n      _payload = p1;\n      callback = p2;\n      binding = p3;\n    }\n    // fast path\n    if (subscribers.length === 0) {\n      return callback.call(binding);\n    }\n    // avoid allocating the payload in fast path\n    var payload = _payload || {};\n    var finalizer = _instrumentStart(name, () => payload);\n    if (finalizer === NOOP) {\n      return callback.call(binding);\n    } else {\n      return withFinalizer(callback, finalizer, payload, binding);\n    }\n  }\n  function flaggedInstrument(_name, _payload, callback) {\n    return callback();\n  }\n  function withFinalizer(callback, finalizer, payload, binding) {\n    try {\n      return callback.call(binding);\n    } catch (e) {\n      payload.exception = e;\n      throw e;\n    } finally {\n      finalizer();\n    }\n  }\n  function NOOP() {}\n  function _instrumentStart(name, payloadFunc, payloadArg) {\n    if (subscribers.length === 0) {\n      return NOOP;\n    }\n    var listeners = cache[name];\n    if (!listeners) {\n      listeners = populateListeners(name);\n    }\n    if (listeners.length === 0) {\n      return NOOP;\n    }\n    var payload = payloadFunc(payloadArg);\n    var STRUCTURED_PROFILE = _environment.ENV.STRUCTURED_PROFILE;\n    var timeName;\n    if (STRUCTURED_PROFILE) {\n      timeName = `${name}: ${payload.object}`;\n      console.time(timeName);\n    }\n    var beforeValues = [];\n    var timestamp = time();\n    for (var listener of listeners) {\n      beforeValues.push(listener.before(name, timestamp, payload));\n    }\n    var constListeners = listeners;\n    return function _instrumentEnd() {\n      var timestamp = time();\n      for (var i = 0; i < constListeners.length; i++) {\n        var _listener = constListeners[i];\n        (true && !(_listener) && (0, _debug.assert)('has listener', _listener)); // Iterating over values\n        if (typeof _listener.after === 'function') {\n          _listener.after(name, timestamp, payload, beforeValues[i]);\n        }\n      }\n      if (STRUCTURED_PROFILE) {\n        console.timeEnd(timeName);\n      }\n    };\n  }\n  /**\n    Subscribes to a particular event or instrumented block of code.\n  \n    @method subscribe\n    @for @ember/instrumentation\n    @static\n  \n    @param {String} [pattern] Namespaced event name.\n    @param {Object} [object] Before and After hooks.\n  \n    @return {Subscriber}\n    @private\n  */\n  function subscribe(pattern, object) {\n    var paths = pattern.split('.');\n    var regexes = [];\n    for (var path of paths) {\n      if (path === '*') {\n        regexes.push('[^\\\\.]*');\n      } else {\n        regexes.push(path);\n      }\n    }\n    var regex = regexes.join('\\\\.');\n    regex = `${regex}(\\\\..*)?`;\n    var subscriber = {\n      pattern,\n      regex: new RegExp(`^${regex}$`),\n      object\n    };\n    subscribers.push(subscriber);\n    cache = {};\n    return subscriber;\n  }\n  /**\n    Unsubscribes from a particular event or instrumented block of code.\n  \n    @method unsubscribe\n    @for @ember/instrumentation\n    @static\n  \n    @param {Object} [subscriber]\n    @private\n  */\n  function unsubscribe(subscriber) {\n    var index = 0;\n    for (var i = 0; i < subscribers.length; i++) {\n      if (subscribers[i] === subscriber) {\n        index = i;\n      }\n    }\n    subscribers.splice(index, 1);\n    cache = {};\n  }\n  /**\n    Resets `Instrumentation` by flushing list of subscribers.\n  \n    @method reset\n    @for @ember/instrumentation\n    @static\n    @private\n  */\n  function reset() {\n    subscribers.length = 0;\n    cache = {};\n  }\n});","define(\"@ember/modifier/index\", [\"exports\", \"@glimmer/manager\", \"@ember/-internals/glimmer\", \"@glimmer/runtime\"], function (_exports, _manager, _glimmer, _runtime) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"capabilities\", {\n    enumerable: true,\n    get: function () {\n      return _glimmer.modifierCapabilities;\n    }\n  });\n  Object.defineProperty(_exports, \"on\", {\n    enumerable: true,\n    get: function () {\n      return _runtime.on;\n    }\n  });\n  Object.defineProperty(_exports, \"setModifierManager\", {\n    enumerable: true,\n    get: function () {\n      return _manager.setModifierManager;\n    }\n  });\n});","define(\"@ember/object/-internals\", [\"exports\", \"@ember/-internals/metal\", \"@ember/-internals/utils\", \"@ember/debug\", \"@ember/object\"], function (_exports, _metal, _utils, _debug, _object) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.FrameworkObject = void 0;\n  Object.defineProperty(_exports, \"cacheFor\", {\n    enumerable: true,\n    get: function () {\n      return _metal.getCachedValueFor;\n    }\n  });\n  Object.defineProperty(_exports, \"guidFor\", {\n    enumerable: true,\n    get: function () {\n      return _utils.guidFor;\n    }\n  });\n  var _a;\n  var FrameworkObject = class FrameworkObject extends _object.default {};\n  _exports.FrameworkObject = FrameworkObject;\n  if (true /* DEBUG */) {\n    var INIT_WAS_CALLED = Symbol('INIT_WAS_CALLED');\n    var ASSERT_INIT_WAS_CALLED = (0, _utils.symbol)('ASSERT_INIT_WAS_CALLED');\n    _exports.FrameworkObject = FrameworkObject = class DebugFrameworkObject extends _object.default {\n      constructor() {\n        super(...arguments);\n        this[_a] = false;\n      }\n      init(properties) {\n        super.init(properties);\n        this[INIT_WAS_CALLED] = true;\n      }\n      [(_a = INIT_WAS_CALLED, ASSERT_INIT_WAS_CALLED)]() {\n        (true && !(this[INIT_WAS_CALLED]) && (0, _debug.assert)(`You must call \\`super.init(...arguments);\\` or \\`this._super(...arguments)\\` when overriding \\`init\\` on a framework object. Please update ${this} to call \\`super.init(...arguments);\\` from \\`init\\` when using native classes or \\`this._super(...arguments)\\` when using \\`EmberObject.extend()\\`.`, this[INIT_WAS_CALLED]));\n      }\n    };\n    (0, _metal.addListener)(FrameworkObject.prototype, 'init', null, ASSERT_INIT_WAS_CALLED);\n  }\n});","define(\"@ember/object/compat\", [\"exports\", \"@ember/-internals/metal\", \"@ember/debug\", \"@glimmer/validator\"], function (_exports, _metal, _debug, _validator) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.dependentKeyCompat = dependentKeyCompat;\n  var wrapGetterSetter = function (target, key, desc) {\n    var {\n      get: originalGet\n    } = desc;\n    (true && !((0, _metal.descriptorForProperty)(target, key) === undefined) && (0, _debug.assert)('You attempted to use @dependentKeyCompat on a property that already has been decorated with either @computed or @tracked. @dependentKeyCompat is only necessary for native getters that are not decorated with @computed.', (0, _metal.descriptorForProperty)(target, key) === undefined));\n    if (originalGet !== undefined) {\n      desc.get = function () {\n        var propertyTag = (0, _validator.tagFor)(this, key);\n        var ret;\n        var tag = (0, _validator.track)(() => {\n          ret = originalGet.call(this);\n        });\n        (0, _validator.updateTag)(propertyTag, tag);\n        (0, _validator.consumeTag)(tag);\n        return ret;\n      };\n    }\n    return desc;\n  };\n  function dependentKeyCompat() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n    if ((0, _metal.isElementDescriptor)(args)) {\n      var [target, key, desc] = args;\n      (true && !(desc != null && (typeof desc.get === 'function' || typeof desc.set === 'function')) && (0, _debug.assert)('The @dependentKeyCompat decorator must be applied to getters/setters when used in native classes', desc != null && (typeof desc.get === 'function' || typeof desc.set === 'function')));\n      return wrapGetterSetter(target, key, desc);\n    } else {\n      var _desc2 = args[0];\n      (true && !((value => {\n        if (value && typeof value === 'object') {\n          var cast = value;\n          return (cast.configurable === undefined || cast.configurable === false || cast.configurable === true) && (cast.enumerable === undefined || cast.enumerable === false || cast.enumerable === true) && (cast.writable === undefined || cast.writable === false || cast.writable === true) && (cast.get === undefined || typeof cast.get === 'function') && (cast.set === undefined || typeof cast.set === 'function');\n        }\n        return false;\n      })(_desc2)) && (0, _debug.assert)('expected valid PropertyDescriptor', (value => {\n        if (value && typeof value === 'object') {\n          var cast = value;\n          return (cast.configurable === undefined || cast.configurable === false || cast.configurable === true) && (cast.enumerable === undefined || cast.enumerable === false || cast.enumerable === true) && (cast.writable === undefined || cast.writable === false || cast.writable === true) && (cast.get === undefined || typeof cast.get === 'function') && (cast.set === undefined || typeof cast.set === 'function');\n        }\n        return false;\n      })(_desc2)));\n      var decorator = function (target, key, _desc, _meta, isClassicDecorator) {\n        (true && !(isClassicDecorator) && (0, _debug.assert)('The @dependentKeyCompat decorator may only be passed a method when used in classic classes. You should decorate getters/setters directly in native classes', isClassicDecorator));\n        (true && !(typeof _desc2.get === 'function' || typeof _desc2.set === 'function') && (0, _debug.assert)('The dependentKeyCompat() decorator must be passed a getter or setter when used in classic classes', typeof _desc2.get === 'function' || typeof _desc2.set === 'function'));\n        return wrapGetterSetter(target, key, _desc2);\n      };\n      (0, _metal.setClassicDecorator)(decorator);\n      return decorator;\n    }\n  }\n  (0, _metal.setClassicDecorator)(dependentKeyCompat);\n});","define(\"@ember/object/computed\", [\"exports\", \"@ember/-internals/metal\", \"@ember/object/lib/computed/computed_macros\", \"@ember/object/lib/computed/reduce_computed_macros\"], function (_exports, _metal, _computed_macros, _reduce_computed_macros) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"alias\", {\n    enumerable: true,\n    get: function () {\n      return _metal.alias;\n    }\n  });\n  Object.defineProperty(_exports, \"and\", {\n    enumerable: true,\n    get: function () {\n      return _computed_macros.and;\n    }\n  });\n  Object.defineProperty(_exports, \"bool\", {\n    enumerable: true,\n    get: function () {\n      return _computed_macros.bool;\n    }\n  });\n  Object.defineProperty(_exports, \"collect\", {\n    enumerable: true,\n    get: function () {\n      return _reduce_computed_macros.collect;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _metal.ComputedProperty;\n    }\n  });\n  Object.defineProperty(_exports, \"deprecatingAlias\", {\n    enumerable: true,\n    get: function () {\n      return _computed_macros.deprecatingAlias;\n    }\n  });\n  Object.defineProperty(_exports, \"empty\", {\n    enumerable: true,\n    get: function () {\n      return _computed_macros.empty;\n    }\n  });\n  Object.defineProperty(_exports, \"equal\", {\n    enumerable: true,\n    get: function () {\n      return _computed_macros.equal;\n    }\n  });\n  Object.defineProperty(_exports, \"expandProperties\", {\n    enumerable: true,\n    get: function () {\n      return _metal.expandProperties;\n    }\n  });\n  Object.defineProperty(_exports, \"filter\", {\n    enumerable: true,\n    get: function () {\n      return _reduce_computed_macros.filter;\n    }\n  });\n  Object.defineProperty(_exports, \"filterBy\", {\n    enumerable: true,\n    get: function () {\n      return _reduce_computed_macros.filterBy;\n    }\n  });\n  Object.defineProperty(_exports, \"gt\", {\n    enumerable: true,\n    get: function () {\n      return _computed_macros.gt;\n    }\n  });\n  Object.defineProperty(_exports, \"gte\", {\n    enumerable: true,\n    get: function () {\n      return _computed_macros.gte;\n    }\n  });\n  Object.defineProperty(_exports, \"intersect\", {\n    enumerable: true,\n    get: function () {\n      return _reduce_computed_macros.intersect;\n    }\n  });\n  Object.defineProperty(_exports, \"lt\", {\n    enumerable: true,\n    get: function () {\n      return _computed_macros.lt;\n    }\n  });\n  Object.defineProperty(_exports, \"lte\", {\n    enumerable: true,\n    get: function () {\n      return _computed_macros.lte;\n    }\n  });\n  Object.defineProperty(_exports, \"map\", {\n    enumerable: true,\n    get: function () {\n      return _reduce_computed_macros.map;\n    }\n  });\n  Object.defineProperty(_exports, \"mapBy\", {\n    enumerable: true,\n    get: function () {\n      return _reduce_computed_macros.mapBy;\n    }\n  });\n  Object.defineProperty(_exports, \"match\", {\n    enumerable: true,\n    get: function () {\n      return _computed_macros.match;\n    }\n  });\n  Object.defineProperty(_exports, \"max\", {\n    enumerable: true,\n    get: function () {\n      return _reduce_computed_macros.max;\n    }\n  });\n  Object.defineProperty(_exports, \"min\", {\n    enumerable: true,\n    get: function () {\n      return _reduce_computed_macros.min;\n    }\n  });\n  Object.defineProperty(_exports, \"none\", {\n    enumerable: true,\n    get: function () {\n      return _computed_macros.none;\n    }\n  });\n  Object.defineProperty(_exports, \"not\", {\n    enumerable: true,\n    get: function () {\n      return _computed_macros.not;\n    }\n  });\n  Object.defineProperty(_exports, \"notEmpty\", {\n    enumerable: true,\n    get: function () {\n      return _computed_macros.notEmpty;\n    }\n  });\n  Object.defineProperty(_exports, \"oneWay\", {\n    enumerable: true,\n    get: function () {\n      return _computed_macros.oneWay;\n    }\n  });\n  Object.defineProperty(_exports, \"or\", {\n    enumerable: true,\n    get: function () {\n      return _computed_macros.or;\n    }\n  });\n  Object.defineProperty(_exports, \"readOnly\", {\n    enumerable: true,\n    get: function () {\n      return _computed_macros.readOnly;\n    }\n  });\n  Object.defineProperty(_exports, \"reads\", {\n    enumerable: true,\n    get: function () {\n      return _computed_macros.oneWay;\n    }\n  });\n  Object.defineProperty(_exports, \"setDiff\", {\n    enumerable: true,\n    get: function () {\n      return _reduce_computed_macros.setDiff;\n    }\n  });\n  Object.defineProperty(_exports, \"sort\", {\n    enumerable: true,\n    get: function () {\n      return _reduce_computed_macros.sort;\n    }\n  });\n  Object.defineProperty(_exports, \"sum\", {\n    enumerable: true,\n    get: function () {\n      return _reduce_computed_macros.sum;\n    }\n  });\n  Object.defineProperty(_exports, \"union\", {\n    enumerable: true,\n    get: function () {\n      return _reduce_computed_macros.union;\n    }\n  });\n  Object.defineProperty(_exports, \"uniq\", {\n    enumerable: true,\n    get: function () {\n      return _reduce_computed_macros.uniq;\n    }\n  });\n  Object.defineProperty(_exports, \"uniqBy\", {\n    enumerable: true,\n    get: function () {\n      return _reduce_computed_macros.uniqBy;\n    }\n  });\n});","define(\"@ember/object/core\", [\"exports\", \"@ember/-internals/container\", \"@ember/-internals/owner\", \"@ember/-internals/utils\", \"@ember/-internals/meta\", \"@ember/-internals/metal\", \"@ember/object/mixin\", \"@ember/-internals/runtime\", \"@ember/array\", \"@ember/debug\", \"@glimmer/util\", \"@glimmer/destroyable\", \"@glimmer/owner\"], function (_exports, _container, _owner, _utils, _meta2, _metal, _mixin, _runtime, _array, _debug, _util, _destroyable, _owner2) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n    @module @ember/object/core\n  */\n\n  function hasSetUnknownProperty(val) {\n    return typeof val === 'object' && val !== null && typeof val.setUnknownProperty === 'function';\n  }\n  function hasToStringExtension(val) {\n    return typeof val === 'object' && val !== null && typeof val.toStringExtension === 'function';\n  }\n  var reopen = _mixin.default.prototype.reopen;\n  var wasApplied = new _util._WeakSet();\n  var prototypeMixinMap = new WeakMap();\n  var initCalled = true /* DEBUG */ ? new _util._WeakSet() : undefined; // only used in debug builds to enable the proxy trap\n  var destroyCalled = new Set();\n  function ensureDestroyCalled(instance) {\n    if (!destroyCalled.has(instance)) {\n      instance.destroy();\n    }\n  }\n  function initialize(obj, properties) {\n    var m = (0, _meta2.meta)(obj);\n    if (properties !== undefined) {\n      (true && !(typeof properties === 'object' && properties !== null) && (0, _debug.assert)('EmberObject.create only accepts objects.', typeof properties === 'object' && properties !== null));\n      (true && !(!(properties instanceof _mixin.default)) && (0, _debug.assert)('EmberObject.create no longer supports mixing in other ' + 'definitions, use .extend & .create separately instead.', !(properties instanceof _mixin.default)));\n      var concatenatedProperties = obj.concatenatedProperties;\n      var mergedProperties = obj.mergedProperties;\n      var keyNames = Object.keys(properties);\n      for (var keyName of keyNames) {\n        var value = properties[keyName];\n        (true && !(!(0, _metal.isClassicDecorator)(value)) && (0, _debug.assert)('EmberObject.create no longer supports defining computed ' + 'properties. Define computed properties using extend() or reopen() ' + 'before calling create().', !(0, _metal.isClassicDecorator)(value)));\n        (true && !(!(typeof value === 'function' && value.toString().indexOf('._super') !== -1)) && (0, _debug.assert)('EmberObject.create no longer supports defining methods that call _super.', !(typeof value === 'function' && value.toString().indexOf('._super') !== -1)));\n        (true && !(!(keyName === 'actions' && _runtime.ActionHandler.detect(obj))) && (0, _debug.assert)('`actions` must be provided at extend time, not at create time, ' + 'when Ember.ActionHandler is used (i.e. views, controllers & routes).', !(keyName === 'actions' && _runtime.ActionHandler.detect(obj))));\n        var possibleDesc = (0, _metal.descriptorForProperty)(obj, keyName, m);\n        var isDescriptor = possibleDesc !== undefined;\n        if (!isDescriptor) {\n          if (concatenatedProperties !== undefined && concatenatedProperties.length > 0 && concatenatedProperties.includes(keyName)) {\n            var baseValue = obj[keyName];\n            if (baseValue) {\n              value = (0, _array.makeArray)(baseValue).concat(value);\n            } else {\n              value = (0, _array.makeArray)(value);\n            }\n          }\n          if (mergedProperties !== undefined && mergedProperties.length > 0 && mergedProperties.includes(keyName)) {\n            var _baseValue = obj[keyName];\n            value = Object.assign({}, _baseValue, value);\n          }\n        }\n        if (isDescriptor) {\n          possibleDesc.set(obj, keyName, value);\n        } else if (hasSetUnknownProperty(obj) && !(keyName in obj)) {\n          obj.setUnknownProperty(keyName, value);\n        } else {\n          if (true /* DEBUG */) {\n            (0, _metal.defineProperty)(obj, keyName, null, value, m); // setup mandatory setter\n          } else {\n            obj[keyName] = value;\n          }\n        }\n      }\n    }\n    // using DEBUG here to avoid the extraneous variable when not needed\n    if (true /* DEBUG */) {\n      initCalled.add(obj);\n    }\n    obj.init(properties);\n    m.unsetInitializing();\n    var observerEvents = m.observerEvents();\n    if (observerEvents !== undefined) {\n      for (var i = 0; i < observerEvents.length; i++) {\n        (0, _metal.activateObserver)(obj, observerEvents[i].event, observerEvents[i].sync);\n      }\n    }\n    (0, _metal.sendEvent)(obj, 'init', undefined, undefined, m);\n  }\n  class CoreObject {\n    constructor(owner) {\n      this[_owner2.OWNER] = owner;\n      // prepare prototype...\n      this.constructor.proto();\n      var self;\n      if (true /* DEBUG */ && (0, _metal.hasUnknownProperty)(this)) {\n        var messageFor = (obj, property) => {\n          return `You attempted to access the \\`${String(property)}\\` property (of ${obj}).\\n` + `Since Ember 3.1, this is usually fine as you no longer need to use \\`.get()\\`\\n` + `to access computed properties. However, in this case, the object in question\\n` + `is a special kind of Ember object (a proxy). Therefore, it is still necessary\\n` + `to use \\`.get('${String(property)}')\\` in this case.\\n\\n` + `If you encountered this error because of third-party code that you don't control,\\n` + `there is more information at https://github.com/emberjs/ember.js/issues/16148, and\\n` + `you can help us improve this error message by telling us more about what happened in\\n` + `this situation.`;\n        };\n        /* globals Proxy Reflect */\n        self = new Proxy(this, {\n          get(target, property, receiver) {\n            if (property === _metal.PROXY_CONTENT) {\n              return target;\n            } else if (\n            // init called will be set on the proxy, not the target, so get with the receiver\n            !initCalled.has(receiver) || typeof property === 'symbol' || (0, _utils.isInternalSymbol)(property) || property === 'toJSON' || property === 'toString' || property === 'toStringExtension' || property === 'didDefineProperty' || property === 'willWatchProperty' || property === 'didUnwatchProperty' || property === 'didAddListener' || property === 'didRemoveListener' || property === 'isDescriptor' || property === '_onLookup' || property in target) {\n              return Reflect.get(target, property, receiver);\n            }\n            var value = target.unknownProperty.call(receiver, property);\n            if (typeof value !== 'function') {\n              (true && !(value === undefined || value === null) && (0, _debug.assert)(messageFor(receiver, property), value === undefined || value === null));\n            }\n          }\n        });\n      } else {\n        self = this;\n      }\n      var destroyable = self;\n      (0, _destroyable.registerDestructor)(self, ensureDestroyCalled, true);\n      (0, _destroyable.registerDestructor)(self, () => destroyable.willDestroy());\n      // disable chains\n      var m = (0, _meta2.meta)(self);\n      m.setInitializing();\n      // only return when in debug builds and `self` is the proxy created above\n      if (true /* DEBUG */ && self !== this) {\n        return self;\n      }\n    }\n    reopen() {\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n      (0, _mixin.applyMixin)(this, args);\n      return this;\n    }\n    /**\n      An overridable method called when objects are instantiated. By default,\n      does nothing unless it is overridden during class definition.\n         Example:\n         ```javascript\n      import EmberObject from '@ember/object';\n         const Person = EmberObject.extend({\n        init() {\n          alert(`Name is ${this.get('name')}`);\n        }\n      });\n         let steve = Person.create({\n        name: 'Steve'\n      });\n         // alerts 'Name is Steve'.\n      ```\n         NOTE: If you do override `init` for a framework class like `Component`\n      from `@ember/component`, be sure to call `this._super(...arguments)`\n      in your `init` declaration!\n      If you don't, Ember may not have an opportunity to\n      do important setup work, and you'll see strange behavior in your\n      application.\n         @method init\n      @public\n    */\n    init(_properties) {}\n    /**\n      Defines the properties that will be concatenated from the superclass\n      (instead of overridden).\n         By default, when you extend an Ember class a property defined in\n      the subclass overrides a property with the same name that is defined\n      in the superclass. However, there are some cases where it is preferable\n      to build up a property's value by combining the superclass' property\n      value with the subclass' value. An example of this in use within Ember\n      is the `classNames` property of `Component` from `@ember/component`.\n         Here is some sample code showing the difference between a concatenated\n      property and a normal one:\n         ```javascript\n      import EmberObject from '@ember/object';\n         const Bar = EmberObject.extend({\n        // Configure which properties to concatenate\n        concatenatedProperties: ['concatenatedProperty'],\n           someNonConcatenatedProperty: ['bar'],\n        concatenatedProperty: ['bar']\n      });\n         const FooBar = Bar.extend({\n        someNonConcatenatedProperty: ['foo'],\n        concatenatedProperty: ['foo']\n      });\n         let fooBar = FooBar.create();\n      fooBar.get('someNonConcatenatedProperty'); // ['foo']\n      fooBar.get('concatenatedProperty'); // ['bar', 'foo']\n      ```\n         This behavior extends to object creation as well. Continuing the\n      above example:\n         ```javascript\n      let fooBar = FooBar.create({\n        someNonConcatenatedProperty: ['baz'],\n        concatenatedProperty: ['baz']\n      })\n      fooBar.get('someNonConcatenatedProperty'); // ['baz']\n      fooBar.get('concatenatedProperty'); // ['bar', 'foo', 'baz']\n      ```\n         Adding a single property that is not an array will just add it in the array:\n         ```javascript\n      let fooBar = FooBar.create({\n        concatenatedProperty: 'baz'\n      })\n      view.get('concatenatedProperty'); // ['bar', 'foo', 'baz']\n      ```\n         Using the `concatenatedProperties` property, we can tell Ember to mix the\n      content of the properties.\n         In `Component` the `classNames`, `classNameBindings` and\n      `attributeBindings` properties are concatenated.\n         This feature is available for you to use throughout the Ember object model,\n      although typical app developers are likely to use it infrequently. Since\n      it changes expectations about behavior of properties, you should properly\n      document its usage in each individual concatenated property (to not\n      mislead your users to think they can override the property in a subclass).\n         @property concatenatedProperties\n      @type Array\n      @default null\n      @public\n    */\n    /**\n      Defines the properties that will be merged from the superclass\n      (instead of overridden).\n         By default, when you extend an Ember class a property defined in\n      the subclass overrides a property with the same name that is defined\n      in the superclass. However, there are some cases where it is preferable\n      to build up a property's value by merging the superclass property value\n      with the subclass property's value. An example of this in use within Ember\n      is the `queryParams` property of routes.\n         Here is some sample code showing the difference between a merged\n      property and a normal one:\n         ```javascript\n      import EmberObject from '@ember/object';\n         const Bar = EmberObject.extend({\n        // Configure which properties are to be merged\n        mergedProperties: ['mergedProperty'],\n           someNonMergedProperty: {\n          nonMerged: 'superclass value of nonMerged'\n        },\n        mergedProperty: {\n          page: { replace: false },\n          limit: { replace: true }\n        }\n      });\n         const FooBar = Bar.extend({\n        someNonMergedProperty: {\n          completelyNonMerged: 'subclass value of nonMerged'\n        },\n        mergedProperty: {\n          limit: { replace: false }\n        }\n      });\n         let fooBar = FooBar.create();\n         fooBar.get('someNonMergedProperty');\n      // => { completelyNonMerged: 'subclass value of nonMerged' }\n      //\n      // Note the entire object, including the nonMerged property of\n      // the superclass object, has been replaced\n         fooBar.get('mergedProperty');\n      // => {\n      //   page: {replace: false},\n      //   limit: {replace: false}\n      // }\n      //\n      // Note the page remains from the superclass, and the\n      // `limit` property's value of `false` has been merged from\n      // the subclass.\n      ```\n         This behavior is not available during object `create` calls. It is only\n      available at `extend` time.\n         In `Route` the `queryParams` property is merged.\n         This feature is available for you to use throughout the Ember object model,\n      although typical app developers are likely to use it infrequently. Since\n      it changes expectations about behavior of properties, you should properly\n      document its usage in each individual merged property (to not\n      mislead your users to think they can override the property in a subclass).\n         @property mergedProperties\n      @type Array\n      @default null\n      @public\n    */\n    /**\n      Destroyed object property flag.\n         if this property is `true` the observers and bindings were already\n      removed by the effect of calling the `destroy()` method.\n         @property isDestroyed\n      @default false\n      @public\n    */\n    get isDestroyed() {\n      return (0, _destroyable.isDestroyed)(this);\n    }\n    set isDestroyed(_value) {\n      (true && !(false) && (0, _debug.assert)(`You cannot set \\`${this}.isDestroyed\\` directly, please use \\`.destroy()\\`.`, false));\n    }\n    /**\n      Destruction scheduled flag. The `destroy()` method has been called.\n         The object stays intact until the end of the run loop at which point\n      the `isDestroyed` flag is set.\n         @property isDestroying\n      @default false\n      @public\n    */\n    get isDestroying() {\n      return (0, _destroyable.isDestroying)(this);\n    }\n    set isDestroying(_value) {\n      (true && !(false) && (0, _debug.assert)(`You cannot set \\`${this}.isDestroying\\` directly, please use \\`.destroy()\\`.`, false));\n    }\n    /**\n      Destroys an object by setting the `isDestroyed` flag and removing its\n      metadata, which effectively destroys observers and bindings.\n         If you try to set a property on a destroyed object, an exception will be\n      raised.\n         Note that destruction is scheduled for the end of the run loop and does not\n      happen immediately.  It will set an isDestroying flag immediately.\n         @method destroy\n      @return {EmberObject} receiver\n      @public\n    */\n    destroy() {\n      // Used to ensure that manually calling `.destroy()` does not immediately call destroy again\n      destroyCalled.add(this);\n      try {\n        (0, _destroyable.destroy)(this);\n      } finally {\n        destroyCalled.delete(this);\n      }\n      return this;\n    }\n    /**\n      Override to implement teardown.\n         @method willDestroy\n      @public\n    */\n    willDestroy() {}\n    /**\n      Returns a string representation which attempts to provide more information\n      than Javascript's `toString` typically does, in a generic way for all Ember\n      objects.\n         ```javascript\n      import EmberObject from '@ember/object';\n         const Person = EmberObject.extend();\n      person = Person.create();\n      person.toString(); //=> \"<Person:ember1024>\"\n      ```\n         If the object's class is not defined on an Ember namespace, it will\n      indicate it is a subclass of the registered superclass:\n         ```javascript\n      const Student = Person.extend();\n      let student = Student.create();\n      student.toString(); //=> \"<(subclass of Person):ember1025>\"\n      ```\n         If the method `toStringExtension` is defined, its return value will be\n      included in the output.\n         ```javascript\n      const Teacher = Person.extend({\n        toStringExtension() {\n          return this.get('fullName');\n        }\n      });\n      teacher = Teacher.create();\n      teacher.toString(); //=> \"<Teacher:ember1026:Tom Dale>\"\n      ```\n         @method toString\n      @return {String} string representation\n      @public\n    */\n    toString() {\n      var extension = hasToStringExtension(this) ? `:${this.toStringExtension()}` : '';\n      return `<${(0, _container.getFactoryFor)(this) || '(unknown)'}:${(0, _utils.guidFor)(this)}${extension}>`;\n    }\n    static extend() {\n      var Class = class extends this {};\n      for (var _len2 = arguments.length, mixins = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        mixins[_key2] = arguments[_key2];\n      }\n      reopen.apply(Class.PrototypeMixin, mixins);\n      return Class;\n    }\n    static create() {\n      for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n        args[_key3] = arguments[_key3];\n      }\n      var props = args[0];\n      var instance;\n      if (props !== undefined) {\n        instance = new this((0, _owner.getOwner)(props));\n        // TODO(SAFETY): at present, we cannot actually rely on this being set,\n        // because a number of acceptance tests are (incorrectly? Unclear!)\n        // relying on the ability to run through this path with `factory` being\n        // `undefined`. It's *possible* that actually means that the type for\n        // `setFactoryFor()` should allow `undefined`, but we typed it the other\n        // way for good reason! Accordingly, this *casts* `factory`, and the\n        // commented-out `assert()` is here in the hope that we can enable it\n        // after addressing tests *or* updating the call signature here.\n        var factory = (0, _container.getFactoryFor)(props);\n        // assert(`missing factory when creating object ${instance}`, factory !== undefined);\n        (0, _container.setFactoryFor)(instance, factory);\n      } else {\n        instance = new this();\n      }\n      if (args.length <= 1) {\n        initialize(instance, props);\n      } else {\n        initialize(instance, flattenProps.apply(this, args));\n      }\n      return instance;\n    }\n    /**\n      Augments a constructor's prototype with additional\n      properties and functions:\n         ```javascript\n      import EmberObject from '@ember/object';\n         const MyObject = EmberObject.extend({\n        name: 'an object'\n      });\n         o = MyObject.create();\n      o.get('name'); // 'an object'\n         MyObject.reopen({\n        say(msg) {\n          console.log(msg);\n        }\n      });\n         o2 = MyObject.create();\n      o2.say('hello'); // logs \"hello\"\n         o.say('goodbye'); // logs \"goodbye\"\n      ```\n         To add functions and properties to the constructor itself,\n      see `reopenClass`\n         @method reopen\n      @for @ember/object\n      @static\n      @public\n    */\n    static reopen() {\n      this.willReopen();\n      for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n        args[_key4] = arguments[_key4];\n      }\n      reopen.apply(this.PrototypeMixin, args);\n      return this;\n    }\n    static willReopen() {\n      var p = this.prototype;\n      if (wasApplied.has(p)) {\n        wasApplied.delete(p);\n        // If the base mixin already exists and was applied, create a new mixin to\n        // make sure that it gets properly applied. Reusing the same mixin after\n        // the first `proto` call will cause it to get skipped.\n        if (prototypeMixinMap.has(this)) {\n          prototypeMixinMap.set(this, _mixin.default.create(this.PrototypeMixin));\n        }\n      }\n    }\n    /**\n      Augments a constructor's own properties and functions:\n         ```javascript\n      import EmberObject from '@ember/object';\n         const MyObject = EmberObject.extend({\n        name: 'an object'\n      });\n         MyObject.reopenClass({\n        canBuild: false\n      });\n         MyObject.canBuild; // false\n      o = MyObject.create();\n      ```\n         In other words, this creates static properties and functions for the class.\n      These are only available on the class and not on any instance of that class.\n         ```javascript\n      import EmberObject from '@ember/object';\n         const Person = EmberObject.extend({\n        name: '',\n        sayHello() {\n          alert(`Hello. My name is ${this.get('name')}`);\n        }\n      });\n         Person.reopenClass({\n        species: 'Homo sapiens',\n           createPerson(name) {\n          return Person.create({ name });\n        }\n      });\n         let tom = Person.create({\n        name: 'Tom Dale'\n      });\n      let yehuda = Person.createPerson('Yehuda Katz');\n         tom.sayHello(); // \"Hello. My name is Tom Dale\"\n      yehuda.sayHello(); // \"Hello. My name is Yehuda Katz\"\n      alert(Person.species); // \"Homo sapiens\"\n      ```\n         Note that `species` and `createPerson` are *not* valid on the `tom` and `yehuda`\n      variables. They are only valid on `Person`.\n         To add functions and properties to instances of\n      a constructor by extending the constructor's prototype\n      see `reopen`\n         @method reopenClass\n      @for @ember/object\n      @static\n      @public\n    */\n    static reopenClass() {\n      for (var _len5 = arguments.length, mixins = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n        mixins[_key5] = arguments[_key5];\n      }\n      (0, _mixin.applyMixin)(this, mixins);\n      return this;\n    }\n    static detect(obj) {\n      if ('function' !== typeof obj) {\n        return false;\n      }\n      while (obj) {\n        if (obj === this) {\n          return true;\n        }\n        obj = obj.superclass;\n      }\n      return false;\n    }\n    static detectInstance(obj) {\n      return obj instanceof this;\n    }\n    /**\n      In some cases, you may want to annotate computed properties with additional\n      metadata about how they function or what values they operate on. For\n      example, computed property functions may close over variables that are then\n      no longer available for introspection.\n         You can pass a hash of these values to a computed property like this:\n         ```javascript\n      import { computed } from '@ember/object';\n         person: computed(function() {\n        let personId = this.get('personId');\n        return Person.create({ id: personId });\n      }).meta({ type: Person })\n      ```\n         Once you've done this, you can retrieve the values saved to the computed\n      property from your class like this:\n         ```javascript\n      MyClass.metaForProperty('person');\n      ```\n         This will return the original hash that was passed to `meta()`.\n         @static\n      @method metaForProperty\n      @param key {String} property name\n      @private\n    */\n    static metaForProperty(key) {\n      var proto = this.proto(); // ensure prototype is initialized\n      var possibleDesc = (0, _metal.descriptorForProperty)(proto, key);\n      (true && !(possibleDesc !== undefined) && (0, _debug.assert)(`metaForProperty() could not find a computed property with key '${key}'.`, possibleDesc !== undefined));\n      return possibleDesc._meta || {};\n    }\n    /**\n      Iterate over each computed property for the class, passing its name\n      and any associated metadata (see `metaForProperty`) to the callback.\n         @static\n      @method eachComputedProperty\n      @param {Function} callback\n      @param {Object} binding\n      @private\n    */\n    static eachComputedProperty(callback, binding) {\n      if (binding === void 0) {\n        binding = this;\n      }\n      this.proto(); // ensure prototype is initialized\n      var empty = {};\n      (0, _meta2.meta)(this.prototype).forEachDescriptors((name, descriptor) => {\n        if (descriptor.enumerable) {\n          var _meta = descriptor._meta || empty;\n          callback.call(binding, name, _meta);\n        }\n      });\n    }\n    static get PrototypeMixin() {\n      var prototypeMixin = prototypeMixinMap.get(this);\n      if (prototypeMixin === undefined) {\n        prototypeMixin = _mixin.default.create();\n        prototypeMixin.ownerConstructor = this;\n        prototypeMixinMap.set(this, prototypeMixin);\n      }\n      return prototypeMixin;\n    }\n    static get superclass() {\n      var c = Object.getPrototypeOf(this);\n      return c !== Function.prototype ? c : undefined;\n    }\n    static proto() {\n      var p = this.prototype;\n      if (!wasApplied.has(p)) {\n        wasApplied.add(p);\n        var parent = this.superclass;\n        if (parent) {\n          parent.proto();\n        }\n        // If the prototype mixin exists, apply it. In the case of native classes,\n        // it will not exist (unless the class has been reopened).\n        if (prototypeMixinMap.has(this)) {\n          this.PrototypeMixin.apply(p);\n        }\n      }\n      return p;\n    }\n    static toString() {\n      return `<${(0, _container.getFactoryFor)(this) || '(unknown)'}:constructor>`;\n    }\n  }\n  CoreObject.isClass = true;\n  CoreObject.isMethod = false;\n  function flattenProps() {\n    var initProperties = {};\n    for (var _len6 = arguments.length, props = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n      props[_key6] = arguments[_key6];\n    }\n    for (var properties of props) {\n      (true && !(!(properties instanceof _mixin.default)) && (0, _debug.assert)('EmberObject.create no longer supports mixing in other ' + 'definitions, use .extend & .create separately instead.', !(properties instanceof _mixin.default)));\n      var keyNames = Object.keys(properties);\n      for (var j = 0, k = keyNames.length; j < k; j++) {\n        var keyName = keyNames[j];\n        var value = properties[keyName];\n        initProperties[keyName] = value;\n      }\n    }\n    return initProperties;\n  }\n  if (true /* DEBUG */) {\n    /**\n      Provides lookup-time type validation for injected properties.\n         @private\n      @method _onLookup\n    */\n    CoreObject._onLookup = function injectedPropertyAssertion(debugContainerKey) {\n      var [type] = debugContainerKey.split(':');\n      var proto = this.proto();\n      for (var key in proto) {\n        var desc = (0, _metal.descriptorForProperty)(proto, key);\n        if (desc && _metal.DEBUG_INJECTION_FUNCTIONS.has(desc._getter)) {\n          (true && !(type === 'controller' || _metal.DEBUG_INJECTION_FUNCTIONS.get(desc._getter).type !== 'controller') && (0, _debug.assert)(`Defining \\`${key}\\` as an injected controller property on a non-controller (\\`${debugContainerKey}\\`) is not allowed.`, type === 'controller' || _metal.DEBUG_INJECTION_FUNCTIONS.get(desc._getter).type !== 'controller'));\n        }\n      }\n    };\n    /**\n      Returns a hash of property names and container names that injected\n      properties will lookup on the container lazily.\n         @method _lazyInjections\n      @return {Object} Hash of all lazy injected property keys to container names\n      @private\n    */\n    CoreObject._lazyInjections = function () {\n      var injections = {};\n      var proto = this.proto();\n      var key;\n      var desc;\n      for (key in proto) {\n        desc = (0, _metal.descriptorForProperty)(proto, key);\n        if (desc && _metal.DEBUG_INJECTION_FUNCTIONS.has(desc._getter)) {\n          var {\n            namespace,\n            source,\n            type,\n            name\n          } = _metal.DEBUG_INJECTION_FUNCTIONS.get(desc._getter);\n          injections[key] = {\n            namespace,\n            source,\n            specifier: `${type}:${name || key}`\n          };\n        }\n      }\n      return injections;\n    };\n  }\n  var _default = CoreObject;\n  _exports.default = _default;\n});","define(\"@ember/object/evented\", [\"exports\", \"@ember/-internals/metal\", \"@ember/object/mixin\"], function (_exports, _metal, _mixin) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  Object.defineProperty(_exports, \"on\", {\n    enumerable: true,\n    get: function () {\n      return _metal.on;\n    }\n  });\n  var Evented = _mixin.default.create({\n    on(name, target, method) {\n      (0, _metal.addListener)(this, name, target, method);\n      return this;\n    },\n    one(name, target, method) {\n      (0, _metal.addListener)(this, name, target, method, true);\n      return this;\n    },\n    trigger(name) {\n      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        args[_key - 1] = arguments[_key];\n      }\n      (0, _metal.sendEvent)(this, name, args);\n    },\n    off(name, target, method) {\n      (0, _metal.removeListener)(this, name, target, method);\n      return this;\n    },\n    has(name) {\n      return (0, _metal.hasListeners)(this, name);\n    }\n  });\n  var _default = Evented;\n  _exports.default = _default;\n});","define(\"@ember/object/events\", [\"exports\", \"@ember/-internals/metal\"], function (_exports, _metal) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"addListener\", {\n    enumerable: true,\n    get: function () {\n      return _metal.addListener;\n    }\n  });\n  Object.defineProperty(_exports, \"removeListener\", {\n    enumerable: true,\n    get: function () {\n      return _metal.removeListener;\n    }\n  });\n  Object.defineProperty(_exports, \"sendEvent\", {\n    enumerable: true,\n    get: function () {\n      return _metal.sendEvent;\n    }\n  });\n});","define(\"@ember/object/index\", [\"exports\", \"@ember/debug\", \"@ember/-internals/environment\", \"@ember/-internals/metal\", \"@ember/-internals/container\", \"@ember/-internals/utils\", \"@ember/object/core\", \"@ember/object/observable\"], function (_exports, _debug, _environment, _metal, _container, _utils, _core, _observable) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.action = action;\n  Object.defineProperty(_exports, \"computed\", {\n    enumerable: true,\n    get: function () {\n      return _metal.computed;\n    }\n  });\n  _exports.default = void 0;\n  Object.defineProperty(_exports, \"defineProperty\", {\n    enumerable: true,\n    get: function () {\n      return _metal.defineProperty;\n    }\n  });\n  Object.defineProperty(_exports, \"get\", {\n    enumerable: true,\n    get: function () {\n      return _metal.get;\n    }\n  });\n  Object.defineProperty(_exports, \"getProperties\", {\n    enumerable: true,\n    get: function () {\n      return _metal.getProperties;\n    }\n  });\n  Object.defineProperty(_exports, \"notifyPropertyChange\", {\n    enumerable: true,\n    get: function () {\n      return _metal.notifyPropertyChange;\n    }\n  });\n  _exports.observer = observer;\n  Object.defineProperty(_exports, \"set\", {\n    enumerable: true,\n    get: function () {\n      return _metal.set;\n    }\n  });\n  Object.defineProperty(_exports, \"setProperties\", {\n    enumerable: true,\n    get: function () {\n      return _metal.setProperties;\n    }\n  });\n  Object.defineProperty(_exports, \"trySet\", {\n    enumerable: true,\n    get: function () {\n      return _metal.trySet;\n    }\n  });\n  class EmberObject extends _core.default.extend(_observable.default) {\n    get _debugContainerKey() {\n      var factory = (0, _container.getFactoryFor)(this);\n      return factory !== undefined && factory.fullName;\n    }\n  }\n  var _default = EmberObject;\n  /**\n    Decorator that turns the target function into an Action which can be accessed\n    directly by reference.\n  \n    ```js\n    import Component from '@ember/component';\n    import { action, set } from '@ember/object';\n  \n    export default class Tooltip extends Component {\n      @action\n      toggleShowing() {\n        set(this, 'isShowing', !this.isShowing);\n      }\n    }\n    ```\n    ```hbs\n    <!-- template.hbs -->\n    <button {{action this.toggleShowing}}>Show tooltip</button>\n  \n    {{#if isShowing}}\n      <div class=\"tooltip\">\n        I'm a tooltip!\n      </div>\n    {{/if}}\n    ```\n  \n    Decorated actions also interop with the string style template actions:\n  \n    ```hbs\n    <!-- template.hbs -->\n    <button {{action \"toggleShowing\"}}>Show tooltip</button>\n  \n    {{#if isShowing}}\n      <div class=\"tooltip\">\n        I'm a tooltip!\n      </div>\n    {{/if}}\n    ```\n  \n    It also binds the function directly to the instance, so it can be used in any\n    context and will correctly refer to the class it came from:\n  \n    ```hbs\n    <!-- template.hbs -->\n    <button\n      {{did-insert this.toggleShowing}}\n      {{on \"click\" this.toggleShowing}}\n    >\n      Show tooltip\n    </button>\n  \n    {{#if isShowing}}\n      <div class=\"tooltip\">\n        I'm a tooltip!\n      </div>\n    {{/if}}\n    ```\n  \n    This can also be used in JavaScript code directly:\n  \n    ```js\n    import Component from '@ember/component';\n    import { action, set } from '@ember/object';\n  \n    export default class Tooltip extends Component {\n      constructor() {\n        super(...arguments);\n  \n        // this.toggleShowing is still bound correctly when added to\n        // the event listener\n        document.addEventListener('click', this.toggleShowing);\n      }\n  \n      @action\n      toggleShowing() {\n        set(this, 'isShowing', !this.isShowing);\n      }\n    }\n    ```\n  \n    This is considered best practice, since it means that methods will be bound\n    correctly no matter where they are used. By contrast, the `{{action}}` helper\n    and modifier can also be used to bind context, but it will be required for\n    every usage of the method:\n  \n    ```hbs\n    <!-- template.hbs -->\n    <button\n      {{did-insert (action this.toggleShowing)}}\n      {{on \"click\" (action this.toggleShowing)}}\n    >\n      Show tooltip\n    </button>\n  \n    {{#if isShowing}}\n      <div class=\"tooltip\">\n        I'm a tooltip!\n      </div>\n    {{/if}}\n    ```\n  \n    They also do not have equivalents in JavaScript directly, so they cannot be\n    used for other situations where binding would be useful.\n  \n    @public\n    @method action\n    @for @ember/object\n    @static\n    @param {Function|undefined} callback The function to turn into an action,\n                                         when used in classic classes\n    @return {PropertyDecorator} property decorator instance\n  */\n  _exports.default = _default;\n  var BINDINGS_MAP = new WeakMap();\n  function hasProto(obj) {\n    return obj != null && obj.constructor !== undefined && typeof obj.constructor.proto === 'function';\n  }\n  function setupAction(target, key, actionFn) {\n    if (hasProto(target)) {\n      target.constructor.proto();\n    }\n    if (!Object.prototype.hasOwnProperty.call(target, 'actions')) {\n      var parentActions = target.actions;\n      // we need to assign because of the way mixins copy actions down when inheriting\n      target.actions = parentActions ? Object.assign({}, parentActions) : {};\n    }\n    (true && !(target.actions != null) && (0, _debug.assert)(\"[BUG] Somehow the target doesn't have actions!\", target.actions != null));\n    target.actions[key] = actionFn;\n    return {\n      get() {\n        var bindings = BINDINGS_MAP.get(this);\n        if (bindings === undefined) {\n          bindings = new Map();\n          BINDINGS_MAP.set(this, bindings);\n        }\n        var fn = bindings.get(actionFn);\n        if (fn === undefined) {\n          fn = actionFn.bind(this);\n          bindings.set(actionFn, fn);\n        }\n        return fn;\n      }\n    };\n  }\n  function action() {\n    var actionFn;\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n    if (!(0, _metal.isElementDescriptor)(args)) {\n      actionFn = args[0];\n      var decorator = function (target, key, _desc, _meta, isClassicDecorator) {\n        (true && !(isClassicDecorator) && (0, _debug.assert)('The @action decorator may only be passed a method when used in classic classes. You should decorate methods directly in native classes', isClassicDecorator));\n        (true && !(typeof actionFn === 'function') && (0, _debug.assert)('The action() decorator must be passed a method when used in classic classes', typeof actionFn === 'function'));\n        return setupAction(target, key, actionFn);\n      };\n      (0, _metal.setClassicDecorator)(decorator);\n      return decorator;\n    }\n    var [target, key, desc] = args;\n    actionFn = desc === null || desc === void 0 ? void 0 : desc.value;\n    (true && !(typeof actionFn === 'function') && (0, _debug.assert)('The @action decorator must be applied to methods when used in native classes', typeof actionFn === 'function')); // SAFETY: TS types are weird with decorators. This should work.\n    return setupAction(target, key, actionFn);\n  }\n  // SAFETY: TS types are weird with decorators. This should work.\n  (0, _metal.setClassicDecorator)(action);\n  /**\n    Specify a method that observes property changes.\n  \n    ```javascript\n    import EmberObject from '@ember/object';\n    import { observer } from '@ember/object';\n  \n    export default EmberObject.extend({\n      valueObserver: observer('value', function() {\n        // Executes whenever the \"value\" property changes\n      })\n    });\n    ```\n  \n    Also available as `Function.prototype.observes` if prototype extensions are\n    enabled.\n  \n    @method observer\n    @for @ember/object\n    @param {String} propertyNames*\n    @param {Function} func\n    @return func\n    @public\n    @static\n  */\n  function observer() {\n    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n    var funcOrDef = args.pop();\n    (true && !(typeof funcOrDef === 'function' || typeof funcOrDef === 'object' && funcOrDef !== null) && (0, _debug.assert)('observer must be provided a function or an observer definition', typeof funcOrDef === 'function' || typeof funcOrDef === 'object' && funcOrDef !== null));\n    var func;\n    var dependentKeys;\n    var sync;\n    if (typeof funcOrDef === 'function') {\n      func = funcOrDef;\n      dependentKeys = args;\n      sync = !_environment.ENV._DEFAULT_ASYNC_OBSERVERS;\n    } else {\n      func = funcOrDef.fn;\n      dependentKeys = funcOrDef.dependentKeys;\n      sync = funcOrDef.sync;\n    }\n    (true && !(typeof func === 'function') && (0, _debug.assert)('observer called without a function', typeof func === 'function'));\n    (true && !(Array.isArray(dependentKeys) && dependentKeys.length > 0 && dependentKeys.every(p => typeof p === 'string' && Boolean(p.length))) && (0, _debug.assert)('observer called without valid path', Array.isArray(dependentKeys) && dependentKeys.length > 0 && dependentKeys.every(p => typeof p === 'string' && Boolean(p.length))));\n    (true && !(typeof sync === 'boolean') && (0, _debug.assert)('observer called without sync', typeof sync === 'boolean'));\n    var paths = [];\n    for (var dependentKey of dependentKeys) {\n      (0, _metal.expandProperties)(dependentKey, path => paths.push(path));\n    }\n    (0, _utils.setObservers)(func, {\n      paths,\n      sync\n    });\n    return func;\n  }\n});","define(\"@ember/object/internals\", [\"exports\", \"@ember/object/-internals\"], function (_exports, _internals) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"cacheFor\", {\n    enumerable: true,\n    get: function () {\n      return _internals.cacheFor;\n    }\n  });\n  Object.defineProperty(_exports, \"guidFor\", {\n    enumerable: true,\n    get: function () {\n      return _internals.guidFor;\n    }\n  });\n});","define(\"@ember/object/lib/computed/computed_macros\", [\"exports\", \"@ember/-internals/metal\", \"@ember/object\", \"@ember/debug\", \"@ember/utils\"], function (_exports, _metal, _object, _debug, _utils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.and = void 0;\n  _exports.bool = bool;\n  _exports.deprecatingAlias = deprecatingAlias;\n  _exports.empty = empty;\n  _exports.equal = equal;\n  _exports.gt = gt;\n  _exports.gte = gte;\n  _exports.lt = lt;\n  _exports.lte = lte;\n  _exports.match = match;\n  _exports.none = none;\n  _exports.not = not;\n  _exports.notEmpty = notEmpty;\n  _exports.oneWay = oneWay;\n  _exports.or = void 0;\n  _exports.readOnly = readOnly;\n  /**\n  @module @ember/object\n  */\n  function expandPropertiesToArray(predicateName, properties) {\n    var expandedProperties = [];\n    function extractProperty(entry) {\n      expandedProperties.push(entry);\n    }\n    for (var property of properties) {\n      (true && !(property.indexOf(' ') < 0) && (0, _debug.assert)(`Dependent keys passed to \\`${predicateName}\\` computed macro can't have spaces.`, property.indexOf(' ') < 0));\n      (0, _metal.expandProperties)(property, extractProperty);\n    }\n    return expandedProperties;\n  }\n  function generateComputedWithPredicate(name, predicate) {\n    return function (dependentKey) {\n      for (var _len = arguments.length, additionalDependentKeys = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        additionalDependentKeys[_key - 1] = arguments[_key];\n      }\n      var properties = [dependentKey, ...additionalDependentKeys];\n      (true && !(!(0, _metal.isElementDescriptor)(properties)) && (0, _debug.assert)(`You attempted to use @${name} as a decorator directly, but it requires at least one dependent key parameter`, !(0, _metal.isElementDescriptor)(properties)));\n      var dependentKeys = expandPropertiesToArray(name, properties);\n      var computedFunc = (0, _metal.computed)(...dependentKeys, function () {\n        var lastIdx = dependentKeys.length - 1;\n        for (var i = 0; i < lastIdx; i++) {\n          // SAFETY: `i` is derived from the length of `dependentKeys`\n          var value = (0, _object.get)(this, dependentKeys[i]);\n          if (!predicate(value)) {\n            return value;\n          }\n        }\n        // SAFETY: `lastIdx` is derived from the length of `dependentKeys`\n        return (0, _object.get)(this, dependentKeys[lastIdx]);\n      });\n      return computedFunc;\n    };\n  }\n  /**\n    A computed property macro that returns true if the value of the dependent\n    property is null, an empty string, empty array, or empty function.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { empty } from '@ember/object/computed';\n  \n    class ToDoList {\n      constructor(todos) {\n        set(this, 'todos', todos);\n      }\n  \n      @empty('todos') isDone;\n    }\n  \n    let todoList = new ToDoList(\n      ['Unit Test', 'Documentation', 'Release']\n    );\n  \n    todoList.isDone; // false\n    set(todoList, 'todos', []);\n    todoList.isDone; // true\n    ```\n  \n    @since 1.6.0\n    @method empty\n    @static\n    @for @ember/object/computed\n    @param {String} dependentKey\n    @return {ComputedProperty} computed property which returns true if the value\n    of the dependent property is null, an empty string, empty array, or empty\n    function and false if the underlying value is not empty.\n  \n    @public\n  */\n  function empty(dependentKey) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @empty as a decorator directly, but it requires a `dependentKey` parameter', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    return (0, _metal.computed)(`${dependentKey}.length`, function () {\n      return (0, _utils.isEmpty)((0, _object.get)(this, dependentKey));\n    });\n  }\n  /**\n    A computed property that returns true if the value of the dependent property\n    is NOT null, an empty string, empty array, or empty function.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { notEmpty } from '@ember/object/computed';\n  \n    class Hamster {\n      constructor(backpack) {\n        set(this, 'backpack', backpack);\n      }\n  \n      @notEmpty('backpack') hasStuff\n    }\n  \n    let hamster = new Hamster(\n      ['Food', 'Sleeping Bag', 'Tent']\n    );\n  \n    hamster.hasStuff; // true\n    set(hamster, 'backpack', []);\n    hamster.hasStuff; // false\n    ```\n  \n    @method notEmpty\n    @static\n    @for @ember/object/computed\n    @param {String} dependentKey\n    @return {ComputedProperty} computed property which returns true if original\n    value for property is not empty.\n    @public\n  */\n  function notEmpty(dependentKey) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @notEmpty as a decorator directly, but it requires a `dependentKey` parameter', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    return (0, _metal.computed)(`${dependentKey}.length`, function () {\n      return !(0, _utils.isEmpty)((0, _object.get)(this, dependentKey));\n    });\n  }\n  /**\n    A computed property that returns true if the value of the dependent property\n    is null or undefined. This avoids errors from JSLint complaining about use of\n    ==, which can be technically confusing.\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { none } from '@ember/object/computed';\n  \n    class Hamster {\n      @none('food') isHungry;\n    }\n  \n    let hamster = new Hamster();\n  \n    hamster.isHungry; // true\n  \n    set(hamster, 'food', 'Banana');\n    hamster.isHungry; // false\n  \n    set(hamster, 'food', null);\n    hamster.isHungry; // true\n    ```\n  \n    @method none\n    @static\n    @for @ember/object/computed\n    @param {String} dependentKey\n    @return {ComputedProperty} computed property which returns true if original\n    value for property is null or undefined.\n    @public\n  */\n  function none(dependentKey) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @none as a decorator directly, but it requires a `dependentKey` parameter', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    return (0, _metal.computed)(dependentKey, function () {\n      return (0, _utils.isNone)((0, _object.get)(this, dependentKey));\n    });\n  }\n  /**\n    A computed property that returns the inverse boolean value of the original\n    value for the dependent property.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { not } from '@ember/object/computed';\n  \n    class User {\n      loggedIn = false;\n  \n      @not('loggedIn') isAnonymous;\n    }\n  \n    let user = new User();\n  \n    user.isAnonymous; // true\n    set(user, 'loggedIn', true);\n    user.isAnonymous; // false\n    ```\n  \n    @method not\n    @static\n    @for @ember/object/computed\n    @param {String} dependentKey\n    @return {ComputedProperty} computed property which returns inverse of the\n    original value for property\n    @public\n  */\n  function not(dependentKey) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @not as a decorator directly, but it requires a `dependentKey` parameter', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    return (0, _metal.computed)(dependentKey, function () {\n      return !(0, _object.get)(this, dependentKey);\n    });\n  }\n  /**\n    A computed property that converts the provided dependent property into a\n    boolean value.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { bool } from '@ember/object/computed';\n  \n  \n    class Hamster {\n      @bool('numBananas') hasBananas\n    }\n  \n    let hamster = new Hamster();\n  \n    hamster.hasBananas; // false\n  \n    set(hamster, 'numBananas', 0);\n    hamster.hasBananas; // false\n  \n    set(hamster, 'numBananas', 1);\n    hamster.hasBananas; // true\n  \n    set(hamster, 'numBananas', null);\n    hamster.hasBananas; // false\n    ```\n  \n    @method bool\n    @static\n    @for @ember/object/computed\n    @param {String} dependentKey\n    @return {ComputedProperty} computed property which converts to boolean the\n    original value for property\n    @public\n  */\n  function bool(dependentKey) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @bool as a decorator directly, but it requires a `dependentKey` parameter', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    return (0, _metal.computed)(dependentKey, function () {\n      return Boolean((0, _object.get)(this, dependentKey));\n    });\n  }\n  /**\n    A computed property which matches the original value for the dependent\n    property against a given RegExp, returning `true` if the value matches the\n    RegExp and `false` if it does not.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { match } from '@ember/object/computed';\n  \n    class User {\n      @match('email', /^.+@.+\\..+$/) hasValidEmail;\n    }\n  \n    let user = new User();\n  \n    user.hasValidEmail; // false\n  \n    set(user, 'email', '');\n    user.hasValidEmail; // false\n  \n    set(user, 'email', 'ember_hamster@example.com');\n    user.hasValidEmail; // true\n    ```\n  \n    @method match\n    @static\n    @for @ember/object/computed\n    @param {String} dependentKey\n    @param {RegExp} regexp\n    @return {ComputedProperty} computed property which match the original value\n    for property against a given RegExp\n    @public\n  */\n  function match(dependentKey, regexp) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @match as a decorator directly, but it requires `dependentKey` and `regexp` parameters', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    return (0, _metal.computed)(dependentKey, function () {\n      var value = (0, _object.get)(this, dependentKey);\n      return regexp.test(value);\n    });\n  }\n  /**\n    A computed property that returns true if the provided dependent property is\n    equal to the given value.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { equal } from '@ember/object/computed';\n  \n    class Hamster {\n      @equal('percentCarrotsEaten', 100) satisfied;\n    }\n  \n    let hamster = new Hamster();\n  \n    hamster.satisfied; // false\n  \n    set(hamster, 'percentCarrotsEaten', 100);\n    hamster.satisfied; // true\n  \n    set(hamster, 'percentCarrotsEaten', 50);\n    hamster.satisfied; // false\n    ```\n  \n    @method equal\n    @static\n    @for @ember/object/computed\n    @param {String} dependentKey\n    @param {String|Number|Object} value\n    @return {ComputedProperty} computed property which returns true if the\n    original value for property is equal to the given value.\n    @public\n  */\n  function equal(dependentKey, value) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @equal as a decorator directly, but it requires `dependentKey` and `value` parameter', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    return (0, _metal.computed)(dependentKey, function () {\n      return (0, _object.get)(this, dependentKey) === value;\n    });\n  }\n  /**\n    A computed property that returns true if the provided dependent property is\n    greater than the provided value.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { gt } from '@ember/object/computed';\n  \n    class Hamster {\n      @gt('numBananas', 10) hasTooManyBananas;\n    }\n  \n    let hamster = new Hamster();\n  \n    hamster.hasTooManyBananas; // false\n  \n    set(hamster, 'numBananas', 3);\n    hamster.hasTooManyBananas; // false\n  \n    set(hamster, 'numBananas', 11);\n    hamster.hasTooManyBananas; // true\n    ```\n  \n    @method gt\n    @static\n    @for @ember/object/computed\n    @param {String} dependentKey\n    @param {Number} value\n    @return {ComputedProperty} computed property which returns true if the\n    original value for property is greater than given value.\n    @public\n  */\n  function gt(dependentKey, value) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @gt as a decorator directly, but it requires `dependentKey` and `value` parameters', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    return (0, _metal.computed)(dependentKey, function () {\n      return (0, _object.get)(this, dependentKey) > value;\n    });\n  }\n  /**\n    A computed property that returns true if the provided dependent property is\n    greater than or equal to the provided value.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { gte } from '@ember/object/computed';\n  \n    class Hamster {\n      @gte('numBananas', 10) hasTooManyBananas;\n    }\n  \n    let hamster = new Hamster();\n  \n    hamster.hasTooManyBananas; // false\n  \n    set(hamster, 'numBananas', 3);\n    hamster.hasTooManyBananas; // false\n  \n    set(hamster, 'numBananas', 10);\n    hamster.hasTooManyBananas; // true\n    ```\n  \n    @method gte\n    @static\n    @for @ember/object/computed\n    @param {String} dependentKey\n    @param {Number} value\n    @return {ComputedProperty} computed property which returns true if the\n    original value for property is greater or equal then given value.\n    @public\n  */\n  function gte(dependentKey, value) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @gte as a decorator directly, but it requires `dependentKey` and `value` parameters', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    return (0, _metal.computed)(dependentKey, function () {\n      return (0, _object.get)(this, dependentKey) >= value;\n    });\n  }\n  /**\n    A computed property that returns true if the provided dependent property is\n    less than the provided value.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { lt } from '@ember/object/computed';\n  \n    class Hamster {\n      @lt('numBananas', 3) needsMoreBananas;\n    }\n  \n    let hamster = new Hamster();\n  \n    hamster.needsMoreBananas; // true\n  \n    set(hamster, 'numBananas', 3);\n    hamster.needsMoreBananas; // false\n  \n    set(hamster, 'numBananas', 2);\n    hamster.needsMoreBananas; // true\n    ```\n  \n    @method lt\n    @static\n    @for @ember/object/computed\n    @param {String} dependentKey\n    @param {Number} value\n    @return {ComputedProperty} computed property which returns true if the\n    original value for property is less then given value.\n    @public\n  */\n  function lt(dependentKey, value) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @lt as a decorator directly, but it requires `dependentKey` and `value` parameters', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    return (0, _metal.computed)(dependentKey, function () {\n      return (0, _object.get)(this, dependentKey) < value;\n    });\n  }\n  /**\n    A computed property that returns true if the provided dependent property is\n    less than or equal to the provided value.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { lte } from '@ember/object/computed';\n  \n    class Hamster {\n      @lte('numBananas', 3) needsMoreBananas;\n    }\n  \n    let hamster = new Hamster();\n  \n    hamster.needsMoreBananas; // true\n  \n    set(hamster, 'numBananas', 5);\n    hamster.needsMoreBananas; // false\n  \n    set(hamster, 'numBananas', 3);\n    hamster.needsMoreBananas; // true\n    ```\n  \n    @method lte\n    @static\n    @for @ember/object/computed\n    @param {String} dependentKey\n    @param {Number} value\n    @return {ComputedProperty} computed property which returns true if the\n    original value for property is less or equal than given value.\n    @public\n  */\n  function lte(dependentKey, value) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @lte as a decorator directly, but it requires `dependentKey` and `value` parameters', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    return (0, _metal.computed)(dependentKey, function () {\n      return (0, _object.get)(this, dependentKey) <= value;\n    });\n  }\n  /**\n    A computed property that performs a logical `and` on the original values for\n    the provided dependent properties.\n  \n    You may pass in more than two properties and even use property brace\n    expansion.  The computed property will return the first falsy value or last\n    truthy value just like JavaScript's `&&` operator.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { and } from '@ember/object/computed';\n  \n    class Hamster {\n      @and('hasTent', 'hasBackpack') readyForCamp;\n      @and('hasWalkingStick', 'hasBackpack') readyForHike;\n    }\n  \n    let tomster = new Hamster();\n  \n    tomster.readyForCamp; // false\n  \n    set(tomster, 'hasTent', true);\n    tomster.readyForCamp; // false\n  \n    set(tomster, 'hasBackpack', true);\n    tomster.readyForCamp; // true\n  \n    set(tomster, 'hasBackpack', 'Yes');\n    tomster.readyForCamp; // 'Yes'\n  \n    set(tomster, 'hasWalkingStick', null);\n    tomster.readyForHike; // null\n    ```\n  \n    @method and\n    @static\n    @for @ember/object/computed\n    @param {String} dependentKey*\n    @return {ComputedProperty} computed property which performs a logical `and` on\n    the values of all the original values for properties.\n    @public\n  */\n  var and = generateComputedWithPredicate('and', value => value);\n  /**\n    A computed property which performs a logical `or` on the original values for\n    the provided dependent properties.\n  \n    You may pass in more than two properties and even use property brace\n    expansion.  The computed property will return the first truthy value or last\n    falsy value just like JavaScript's `||` operator.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { or } from '@ember/object/computed';\n  \n    class Hamster {\n      @or('hasJacket', 'hasUmbrella') readyForRain;\n      @or('hasSunscreen', 'hasUmbrella') readyForBeach;\n    }\n  \n    let tomster = new Hamster();\n  \n    tomster.readyForRain; // undefined\n  \n    set(tomster, 'hasUmbrella', true);\n    tomster.readyForRain; // true\n  \n    set(tomster, 'hasJacket', 'Yes');\n    tomster.readyForRain; // 'Yes'\n  \n    set(tomster, 'hasSunscreen', 'Check');\n    tomster.readyForBeach; // 'Check'\n    ```\n  \n    @method or\n    @static\n    @for @ember/object/computed\n    @param {String} dependentKey*\n    @return {ComputedProperty} computed property which performs a logical `or` on\n    the values of all the original values for properties.\n    @public\n  */\n  _exports.and = and;\n  var or = generateComputedWithPredicate('or', value => !value);\n  /**\n    Creates a new property that is an alias for another property on an object.\n    Calls to `get` or `set` this property behave as though they were called on the\n    original property.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { alias } from '@ember/object/computed';\n  \n    class Person {\n      name = 'Alex Matchneer';\n  \n      @alias('name') nomen;\n    }\n  \n    let alex = new Person();\n  \n    alex.nomen; // 'Alex Matchneer'\n    alex.name;  // 'Alex Matchneer'\n  \n    set(alex, 'nomen', '@machty');\n    alex.name;  // '@machty'\n    ```\n  \n    @method alias\n    @static\n    @for @ember/object/computed\n    @param {String} dependentKey\n    @return {ComputedProperty} computed property which creates an alias to the\n    original value for property.\n    @public\n  */\n  /**\n    Where the `alias` computed macro aliases `get` and `set`, and allows for\n    bidirectional data flow, the `oneWay` computed macro only provides an aliased\n    `get`. The `set` will not mutate the upstream property, rather causes the\n    current property to become the value set. This causes the downstream property\n    to permanently diverge from the upstream property.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { oneWay }from '@ember/object/computed';\n  \n    class User {\n      constructor(firstName, lastName) {\n        set(this, 'firstName', firstName);\n        set(this, 'lastName', lastName);\n      }\n  \n      @oneWay('firstName') nickName;\n    }\n  \n    let teddy = new User('Teddy', 'Zeenny');\n  \n    teddy.nickName; // 'Teddy'\n  \n    set(teddy, 'nickName', 'TeddyBear');\n    teddy.firstName; // 'Teddy'\n    teddy.nickName; // 'TeddyBear'\n    ```\n  \n    @method oneWay\n    @static\n    @for @ember/object/computed\n    @param {String} dependentKey\n    @return {ComputedProperty} computed property which creates a one way computed\n    property to the original value for property.\n    @public\n  */\n  _exports.or = or;\n  function oneWay(dependentKey) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @oneWay as a decorator directly, but it requires a `dependentKey` parameter', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    return (0, _metal.alias)(dependentKey).oneWay();\n  }\n  /**\n    This is a more semantically meaningful alias of the `oneWay` computed macro,\n    whose name is somewhat ambiguous as to which direction the data flows.\n  \n    @method reads\n    @static\n    @for @ember/object/computed\n    @param {String} dependentKey\n    @return {ComputedProperty} computed property which creates a one way computed\n      property to the original value for property.\n    @public\n   */\n  /**\n    Where `oneWay` computed macro provides oneWay bindings, the `readOnly`\n    computed macro provides a readOnly one way binding. Very often when using\n    the `oneWay` macro one does not also want changes to propagate back up, as\n    they will replace the value.\n  \n    This prevents the reverse flow, and also throws an exception when it occurs.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { readOnly } from '@ember/object/computed';\n  \n    class User {\n      constructor(firstName, lastName) {\n        set(this, 'firstName', firstName);\n        set(this, 'lastName', lastName);\n      }\n  \n      @readOnly('firstName') nickName;\n    });\n  \n    let teddy = new User('Teddy', 'Zeenny');\n  \n    teddy.nickName; // 'Teddy'\n  \n    set(teddy, 'nickName', 'TeddyBear'); // throws Exception\n    // throw new EmberError('Cannot Set: nickName on: <User:ember27288>' );`\n  \n    teddy.firstName; // 'Teddy'\n    ```\n  \n    @method readOnly\n    @static\n    @for @ember/object/computed\n    @param {String} dependentKey\n    @return {ComputedProperty} computed property which creates a one way computed\n    property to the original value for property.\n    @since 1.5.0\n    @public\n  */\n  function readOnly(dependentKey) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @readOnly as a decorator directly, but it requires a `dependentKey` parameter', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    return (0, _metal.alias)(dependentKey).readOnly();\n  }\n  /**\n    Creates a new property that is an alias for another property on an object.\n    Calls to `get` or `set` this property behave as though they were called on the\n    original property, but also print a deprecation warning.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { deprecatingAlias } from '@ember/object/computed';\n  \n    class Hamster {\n      @deprecatingAlias('cavendishCount', {\n        id: 'hamster.deprecate-banana',\n        until: '3.0.0'\n      })\n      bananaCount;\n    }\n  \n    let hamster = new Hamster();\n  \n    set(hamster, 'bananaCount', 5); // Prints a deprecation warning.\n    hamster.cavendishCount; // 5\n    ```\n  \n    @method deprecatingAlias\n    @static\n    @for @ember/object/computed\n    @param {String} dependentKey\n    @param {Object} options Options for `deprecate`.\n    @return {ComputedProperty} computed property which creates an alias with a\n    deprecation to the original value for property.\n    @since 1.7.0\n    @public\n  */\n  function deprecatingAlias(dependentKey, options) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @deprecatingAlias as a decorator directly, but it requires `dependentKey` and `options` parameters', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    return (0, _metal.computed)(dependentKey, {\n      get(key) {\n        (true && !(false) && (0, _debug.deprecate)(`Usage of \\`${key}\\` is deprecated, use \\`${dependentKey}\\` instead.`, false, options));\n        return (0, _object.get)(this, dependentKey);\n      },\n      set(key, value) {\n        (true && !(false) && (0, _debug.deprecate)(`Usage of \\`${key}\\` is deprecated, use \\`${dependentKey}\\` instead.`, false, options));\n        (0, _object.set)(this, dependentKey, value);\n        return value;\n      }\n    });\n  }\n});","define(\"@ember/object/lib/computed/reduce_computed_macros\", [\"exports\", \"@ember/debug\", \"@ember/-internals/metal\", \"@ember/object\", \"@ember/utils\", \"@ember/array\"], function (_exports, _debug, _metal, _object, _utils, _array) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.collect = collect;\n  _exports.filter = filter;\n  _exports.filterBy = filterBy;\n  _exports.intersect = intersect;\n  _exports.map = map;\n  _exports.mapBy = mapBy;\n  _exports.max = max;\n  _exports.min = min;\n  _exports.setDiff = setDiff;\n  _exports.sort = sort;\n  _exports.sum = sum;\n  _exports.union = void 0;\n  _exports.uniq = uniq;\n  _exports.uniqBy = uniqBy;\n  /**\n  @module @ember/object\n  */\n\n  function isNativeOrEmberArray(obj) {\n    return Array.isArray(obj) || _array.default.detect(obj);\n  }\n  function reduceMacro(dependentKey, callback, initialValue, name) {\n    (true && !(!/[[\\]{}]/g.test(dependentKey)) && (0, _debug.assert)(`Dependent key passed to \\`${name}\\` computed macro shouldn't contain brace expanding pattern.`, !/[[\\]{}]/g.test(dependentKey)));\n    return (0, _object.computed)(`${dependentKey}.[]`, function () {\n      var arr = (0, _object.get)(this, dependentKey);\n      if (arr === null || typeof arr !== 'object') {\n        return initialValue;\n      }\n      return arr.reduce(callback, initialValue, this);\n    }).readOnly();\n  }\n  function arrayMacro(dependentKey, additionalDependentKeys, callback) {\n    // This is a bit ugly\n    var propertyName;\n    if (/@each/.test(dependentKey)) {\n      propertyName = dependentKey.replace(/\\.@each.*$/, '');\n    } else {\n      propertyName = dependentKey;\n      dependentKey += '.[]';\n    }\n    return (0, _object.computed)(dependentKey, ...additionalDependentKeys, function () {\n      var value = (0, _object.get)(this, propertyName);\n      if (isNativeOrEmberArray(value)) {\n        return (0, _array.A)(callback.call(this, value));\n      } else {\n        return (0, _array.A)();\n      }\n    }).readOnly();\n  }\n  function multiArrayMacro(_dependentKeys, callback, name) {\n    (true && !(_dependentKeys.every(dependentKey => !/[[\\]{}]/g.test(dependentKey))) && (0, _debug.assert)(`Dependent keys passed to \\`${name}\\` computed macro shouldn't contain brace expanding pattern.`, _dependentKeys.every(dependentKey => !/[[\\]{}]/g.test(dependentKey))));\n    var dependentKeys = _dependentKeys.map(key => `${key}.[]`);\n    return (0, _object.computed)(...dependentKeys, function () {\n      return (0, _array.A)(callback.call(this, _dependentKeys));\n    }).readOnly();\n  }\n  /**\n    A computed property that returns the sum of the values in the dependent array.\n  \n    Example:\n  \n    ```javascript\n    import { sum } from '@ember/object/computed';\n  \n    class Invoice {\n      lineItems = [1.00, 2.50, 9.99];\n  \n      @sum('lineItems') total;\n    }\n  \n    let invoice = new Invoice();\n  \n    invoice.total; // 13.49\n    ```\n  \n    @method sum\n    @for @ember/object/computed\n    @static\n    @param {String} dependentKey\n    @return {ComputedProperty} computes the sum of all values in the\n    dependentKey's array\n    @since 1.4.0\n    @public\n  */\n  function sum(dependentKey) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @sum as a decorator directly, but it requires a `dependentKey` parameter', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    return reduceMacro(dependentKey, (sum, item) => sum + item, 0, 'sum');\n  }\n  /**\n    A computed property that calculates the maximum value in the dependent array.\n    This will return `-Infinity` when the dependent array is empty.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { mapBy, max } from '@ember/object/computed';\n  \n    class Person {\n      children = [];\n  \n      @mapBy('children', 'age') childAges;\n      @max('childAges') maxChildAge;\n    }\n  \n    let lordByron = new Person();\n  \n    lordByron.maxChildAge; // -Infinity\n  \n    set(lordByron, 'children', [\n      {\n        name: 'Augusta Ada Byron',\n        age: 7\n      }\n    ]);\n    lordByron.maxChildAge; // 7\n  \n    set(lordByron, 'children', [\n      ...lordByron.children,\n      {\n        name: 'Allegra Byron',\n        age: 5\n      }, {\n        name: 'Elizabeth Medora Leigh',\n        age: 8\n      }\n    ]);\n    lordByron.maxChildAge; // 8\n    ```\n  \n    If the types of the arguments are not numbers, they will be converted to\n    numbers and the type of the return value will always be `Number`. For example,\n    the max of a list of Date objects will be the highest timestamp as a `Number`.\n    This behavior is consistent with `Math.max`.\n  \n    @method max\n    @for @ember/object/computed\n    @static\n    @param {String} dependentKey\n    @return {ComputedProperty} computes the largest value in the dependentKey's\n    array\n    @public\n  */\n  function max(dependentKey) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @max as a decorator directly, but it requires a `dependentKey` parameter', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    return reduceMacro(dependentKey, (max, item) => Math.max(max, item), -Infinity, 'max');\n  }\n  /**\n    A computed property that calculates the minimum value in the dependent array.\n    This will return `Infinity` when the dependent array is empty.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { mapBy, min } from '@ember/object/computed';\n  \n    class Person {\n      children = [];\n  \n      @mapBy('children', 'age') childAges;\n      @min('childAges') minChildAge;\n    }\n  \n    let lordByron = Person.create({ children: [] });\n  \n    lordByron.minChildAge; // Infinity\n  \n    set(lordByron, 'children', [\n      {\n        name: 'Augusta Ada Byron',\n        age: 7\n      }\n    ]);\n    lordByron.minChildAge; // 7\n  \n    set(lordByron, 'children', [\n      ...lordByron.children,\n      {\n        name: 'Allegra Byron',\n        age: 5\n      }, {\n        name: 'Elizabeth Medora Leigh',\n        age: 8\n      }\n    ]);\n    lordByron.minChildAge; // 5\n    ```\n  \n    If the types of the arguments are not numbers, they will be converted to\n    numbers and the type of the return value will always be `Number`. For example,\n    the min of a list of Date objects will be the lowest timestamp as a `Number`.\n    This behavior is consistent with `Math.min`.\n  \n    @method min\n    @for @ember/object/computed\n    @static\n    @param {String} dependentKey\n    @return {ComputedProperty} computes the smallest value in the dependentKey's array\n    @public\n  */\n  function min(dependentKey) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @min as a decorator directly, but it requires a `dependentKey` parameter', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    return reduceMacro(dependentKey, (min, item) => Math.min(min, item), Infinity, 'min');\n  }\n  function map(dependentKey, additionalDependentKeysOrCallback, callback) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @map as a decorator directly, but it requires atleast `dependentKey` and `callback` parameters', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    (true && !(typeof callback === 'function' || callback === undefined && typeof additionalDependentKeysOrCallback === 'function') && (0, _debug.assert)('The final parameter provided to map must be a callback function', typeof callback === 'function' || callback === undefined && typeof additionalDependentKeysOrCallback === 'function'));\n    (true && !(Array.isArray(additionalDependentKeysOrCallback) || typeof additionalDependentKeysOrCallback === 'function') && (0, _debug.assert)('The second parameter provided to map must either be the callback or an array of additional dependent keys', Array.isArray(additionalDependentKeysOrCallback) || typeof additionalDependentKeysOrCallback === 'function'));\n    var additionalDependentKeys;\n    if (typeof additionalDependentKeysOrCallback === 'function') {\n      callback = additionalDependentKeysOrCallback;\n      additionalDependentKeys = [];\n    } else {\n      additionalDependentKeys = additionalDependentKeysOrCallback;\n    }\n    var cCallback = callback;\n    (true && !(cCallback) && (0, _debug.assert)('[BUG] Missing callback', cCallback));\n    return arrayMacro(dependentKey, additionalDependentKeys, function (value) {\n      // This is so dumb...\n      return Array.isArray(value) ? value.map(cCallback, this) : value.map(cCallback, this);\n    });\n  }\n  /**\n    Returns an array mapped to the specified key.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { mapBy } from '@ember/object/computed';\n  \n    class Person {\n      children = [];\n  \n      @mapBy('children', 'age') childAges;\n    }\n  \n    let lordByron = new Person();\n  \n    lordByron.childAges; // []\n  \n    set(lordByron, 'children', [\n      {\n        name: 'Augusta Ada Byron',\n        age: 7\n      }\n    ]);\n    lordByron.childAges; // [7]\n  \n    set(lordByron, 'children', [\n      ...lordByron.children,\n      {\n        name: 'Allegra Byron',\n        age: 5\n      }, {\n        name: 'Elizabeth Medora Leigh',\n        age: 8\n      }\n    ]);\n    lordByron.childAges; // [7, 5, 8]\n    ```\n  \n    @method mapBy\n    @for @ember/object/computed\n    @static\n    @param {String} dependentKey\n    @param {String} propertyKey\n    @return {ComputedProperty} an array mapped to the specified key\n    @public\n  */\n  function mapBy(dependentKey, propertyKey) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @mapBy as a decorator directly, but it requires `dependentKey` and `propertyKey` parameters', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    (true && !(typeof propertyKey === 'string') && (0, _debug.assert)('`mapBy` computed macro expects a property string for its second argument, ' + 'perhaps you meant to use \"map\"', typeof propertyKey === 'string'));\n    (true && !(!/[[\\]{}]/g.test(dependentKey)) && (0, _debug.assert)(`Dependent key passed to \\`mapBy\\` computed macro shouldn't contain brace expanding pattern.`, !/[[\\]{}]/g.test(dependentKey)));\n    return map(`${dependentKey}.@each.${propertyKey}`, item => (0, _object.get)(item, propertyKey));\n  }\n  function filter(dependentKey, additionalDependentKeysOrCallback, callback) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @filter as a decorator directly, but it requires atleast `dependentKey` and `callback` parameters', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    (true && !(typeof callback === 'function' || callback === undefined && typeof additionalDependentKeysOrCallback === 'function') && (0, _debug.assert)('The final parameter provided to filter must be a callback function', typeof callback === 'function' || callback === undefined && typeof additionalDependentKeysOrCallback === 'function'));\n    (true && !(Array.isArray(additionalDependentKeysOrCallback) || typeof additionalDependentKeysOrCallback === 'function') && (0, _debug.assert)('The second parameter provided to filter must either be the callback or an array of additional dependent keys', Array.isArray(additionalDependentKeysOrCallback) || typeof additionalDependentKeysOrCallback === 'function'));\n    var additionalDependentKeys;\n    if (typeof additionalDependentKeysOrCallback === 'function') {\n      callback = additionalDependentKeysOrCallback;\n      additionalDependentKeys = [];\n    } else {\n      additionalDependentKeys = additionalDependentKeysOrCallback;\n    }\n    var cCallback = callback;\n    return arrayMacro(dependentKey, additionalDependentKeys, function (value) {\n      // This is a really silly way to keep TS happy\n      return Array.isArray(value) ? value.filter(cCallback, this) : value.filter(cCallback, this);\n    });\n  }\n  /**\n    Filters the array by the property and value.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { filterBy } from '@ember/object/computed';\n  \n    class Hamster {\n      constructor(chores) {\n        set(this, 'chores', chores);\n      }\n  \n      @filterBy('chores', 'done', false) remainingChores;\n    }\n  \n    let hamster = new Hamster([\n      { name: 'cook', done: true },\n      { name: 'clean', done: true },\n      { name: 'write more unit tests', done: false }\n    ]);\n  \n    hamster.remainingChores; // [{ name: 'write more unit tests', done: false }]\n    ```\n  \n    @method filterBy\n    @for @ember/object/computed\n    @static\n    @param {String} dependentKey\n    @param {String} propertyKey\n    @param {*} value\n    @return {ComputedProperty} the filtered array\n    @public\n  */\n  function filterBy(dependentKey, propertyKey, value) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @filterBy as a decorator directly, but it requires atleast `dependentKey` and `propertyKey` parameters', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    (true && !(!/[[\\]{}]/g.test(dependentKey)) && (0, _debug.assert)(`Dependent key passed to \\`filterBy\\` computed macro shouldn't contain brace expanding pattern.`, !/[[\\]{}]/g.test(dependentKey)));\n    var callback;\n    if (arguments.length === 2) {\n      callback = item => (0, _object.get)(item, propertyKey);\n    } else {\n      callback = item => (0, _object.get)(item, propertyKey) === value;\n    }\n    return filter(`${dependentKey}.@each.${propertyKey}`, callback);\n  }\n  /**\n    A computed property which returns a new array with all the unique elements\n    from one or more dependent arrays.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { uniq } from '@ember/object/computed';\n  \n    class Hamster {\n      constructor(fruits) {\n        set(this, 'fruits', fruits);\n      }\n  \n      @uniq('fruits') uniqueFruits;\n    }\n  \n    let hamster = new Hamster([\n      'banana',\n      'grape',\n      'kale',\n      'banana'\n    ]);\n  \n    hamster.uniqueFruits; // ['banana', 'grape', 'kale']\n    ```\n  \n    @method uniq\n    @for @ember/object/computed\n    @static\n    @param {String} propertyKey*\n    @return {ComputedProperty} computes a new array with all the\n    unique elements from the dependent array\n    @public\n  */\n  function uniq(dependentKey) {\n    for (var _len = arguments.length, additionalDependentKeys = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      additionalDependentKeys[_key - 1] = arguments[_key];\n    }\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @uniq/@union as a decorator directly, but it requires atleast one dependent key parameter', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    var args = [dependentKey, ...additionalDependentKeys];\n    return multiArrayMacro(args, function (dependentKeys) {\n      var uniq = (0, _array.A)();\n      var seen = new Set();\n      dependentKeys.forEach(dependentKey => {\n        var value = (0, _object.get)(this, dependentKey);\n        if (isNativeOrEmberArray(value)) {\n          value.forEach(item => {\n            if (!seen.has(item)) {\n              seen.add(item);\n              uniq.push(item);\n            }\n          });\n        }\n      });\n      return uniq;\n    }, 'uniq');\n  }\n  /**\n    A computed property which returns a new array with all the unique elements\n    from an array, with uniqueness determined by specific key.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { uniqBy } from '@ember/object/computed';\n  \n    class Hamster {\n      constructor(fruits) {\n        set(this, 'fruits', fruits);\n      }\n  \n      @uniqBy('fruits', 'id') uniqueFruits;\n    }\n  \n    let hamster = new Hamster([\n      { id: 1, 'banana' },\n      { id: 2, 'grape' },\n      { id: 3, 'peach' },\n      { id: 1, 'banana' }\n    ]);\n  \n    hamster.uniqueFruits; // [ { id: 1, 'banana' }, { id: 2, 'grape' }, { id: 3, 'peach' }]\n    ```\n  \n    @method uniqBy\n    @for @ember/object/computed\n    @static\n    @param {String} dependentKey\n    @param {String} propertyKey\n    @return {ComputedProperty} computes a new array with all the\n    unique elements from the dependent array\n    @public\n  */\n  function uniqBy(dependentKey, propertyKey) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @uniqBy as a decorator directly, but it requires `dependentKey` and `propertyKey` parameters', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    (true && !(!/[[\\]{}]/g.test(dependentKey)) && (0, _debug.assert)(`Dependent key passed to \\`uniqBy\\` computed macro shouldn't contain brace expanding pattern.`, !/[[\\]{}]/g.test(dependentKey)));\n    return (0, _object.computed)(`${dependentKey}.[]`, function () {\n      var list = (0, _object.get)(this, dependentKey);\n      return isNativeOrEmberArray(list) ? (0, _array.uniqBy)(list, propertyKey) : (0, _array.A)();\n    }).readOnly();\n  }\n  /**\n    A computed property which returns a new array with all the unique elements\n    from one or more dependent arrays.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { union } from '@ember/object/computed';\n  \n    class Hamster {\n      constructor(fruits, vegetables) {\n        set(this, 'fruits', fruits);\n        set(this, 'vegetables', vegetables);\n      }\n  \n      @union('fruits', 'vegetables') uniqueFruits;\n    });\n  \n    let hamster = new, Hamster(\n      [\n        'banana',\n        'grape',\n        'kale',\n        'banana',\n        'tomato'\n      ],\n      [\n        'tomato',\n        'carrot',\n        'lettuce'\n      ]\n    );\n  \n    hamster.uniqueFruits; // ['banana', 'grape', 'kale', 'tomato', 'carrot', 'lettuce']\n    ```\n  \n    @method union\n    @for @ember/object/computed\n    @static\n    @param {String} propertyKey*\n    @return {ComputedProperty} computes a new array with all the unique elements\n    from one or more dependent arrays.\n    @public\n  */\n  var union = uniq;\n  /**\n    A computed property which returns a new array with all the elements\n    two or more dependent arrays have in common.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { intersect } from '@ember/object/computed';\n  \n    class FriendGroups {\n      constructor(adaFriends, charlesFriends) {\n        set(this, 'adaFriends', adaFriends);\n        set(this, 'charlesFriends', charlesFriends);\n      }\n  \n      @intersect('adaFriends', 'charlesFriends') friendsInCommon;\n    }\n  \n    let groups = new FriendGroups(\n      ['Charles Babbage', 'John Hobhouse', 'William King', 'Mary Somerville'],\n      ['William King', 'Mary Somerville', 'Ada Lovelace', 'George Peacock']\n    );\n  \n    groups.friendsInCommon; // ['William King', 'Mary Somerville']\n    ```\n  \n    @method intersect\n    @for @ember/object/computed\n    @static\n    @param {String} propertyKey*\n    @return {ComputedProperty} computes a new array with all the duplicated\n    elements from the dependent arrays\n    @public\n  */\n  _exports.union = union;\n  function intersect(dependentKey) {\n    for (var _len2 = arguments.length, additionalDependentKeys = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n      additionalDependentKeys[_key2 - 1] = arguments[_key2];\n    }\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @intersect as a decorator directly, but it requires atleast one dependent key parameter', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    var args = [dependentKey, ...additionalDependentKeys];\n    return multiArrayMacro(args, function (dependentKeys) {\n      var arrays = dependentKeys.map(dependentKey => {\n        var array = (0, _object.get)(this, dependentKey);\n        return Array.isArray(array) ? array : [];\n      });\n      var firstArray = arrays.pop();\n      (true && !(firstArray) && (0, _debug.assert)('Attempted to apply multiArrayMacro for intersect without any dependentKeys', firstArray));\n      var results = firstArray.filter(candidate => {\n        for (var array of arrays) {\n          var found = false;\n          for (var item of array) {\n            if (item === candidate) {\n              found = true;\n              break;\n            }\n          }\n          if (found === false) {\n            return false;\n          }\n        }\n        return true;\n      });\n      return (0, _array.A)(results);\n    }, 'intersect');\n  }\n  /**\n    A computed property which returns a new array with all the properties from the\n    first dependent array that are not in the second dependent array.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { setDiff } from '@ember/object/computed';\n  \n    class Hamster {\n      constructor(likes, fruits) {\n        set(this, 'likes', likes);\n        set(this, 'fruits', fruits);\n      }\n  \n      @setDiff('likes', 'fruits') wants;\n    }\n  \n    let hamster = new Hamster(\n      [\n        'banana',\n        'grape',\n        'kale'\n      ],\n      [\n        'grape',\n        'kale',\n      ]\n    );\n  \n    hamster.wants; // ['banana']\n    ```\n  \n    @method setDiff\n    @for @ember/object/computed\n    @static\n    @param {String} setAProperty\n    @param {String} setBProperty\n    @return {ComputedProperty} computes a new array with all the items from the\n    first dependent array that are not in the second dependent array\n    @public\n  */\n  function setDiff(setAProperty, setBProperty) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @setDiff as a decorator directly, but it requires atleast one dependent key parameter', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    (true && !(arguments.length === 2) && (0, _debug.assert)('`setDiff` computed macro requires exactly two dependent arrays.', arguments.length === 2));\n    (true && !(!/[[\\]{}]/g.test(setAProperty) && !/[[\\]{}]/g.test(setBProperty)) && (0, _debug.assert)(`Dependent keys passed to \\`setDiff\\` computed macro shouldn't contain brace expanding pattern.`, !/[[\\]{}]/g.test(setAProperty) && !/[[\\]{}]/g.test(setBProperty)));\n    return (0, _object.computed)(`${setAProperty}.[]`, `${setBProperty}.[]`, function () {\n      var setA = (0, _object.get)(this, setAProperty);\n      var setB = (0, _object.get)(this, setBProperty);\n      if (!isNativeOrEmberArray(setA)) {\n        return (0, _array.A)();\n      }\n      if (!isNativeOrEmberArray(setB)) {\n        return setA;\n      }\n      return setA.filter(x => setB.indexOf(x) === -1);\n    }).readOnly();\n  }\n  /**\n    A computed property that returns the array of values for the provided\n    dependent properties.\n  \n    Example:\n  \n    ```javascript\n    import { set } from '@ember/object';\n    import { collect } from '@ember/object/computed';\n  \n    class Hamster {\n      @collect('hat', 'shirt') clothes;\n    }\n  \n    let hamster = new Hamster();\n  \n    hamster.clothes; // [null, null]\n  \n    set(hamster, 'hat', 'Camp Hat');\n    set(hamster, 'shirt', 'Camp Shirt');\n    hamster.clothes; // ['Camp Hat', 'Camp Shirt']\n    ```\n  \n    @method collect\n    @for @ember/object/computed\n    @static\n    @param {String} dependentKey*\n    @return {ComputedProperty} computed property which maps values of all passed\n    in properties to an array.\n    @public\n  */\n  function collect(dependentKey) {\n    for (var _len3 = arguments.length, additionalDependentKeys = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n      additionalDependentKeys[_key3 - 1] = arguments[_key3];\n    }\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @collect as a decorator directly, but it requires atleast one dependent key parameter', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    var dependentKeys = [dependentKey, ...additionalDependentKeys];\n    return multiArrayMacro(dependentKeys, function () {\n      var res = dependentKeys.map(key => {\n        var val = (0, _object.get)(this, key);\n        return val === undefined ? null : val;\n      });\n      return (0, _array.A)(res);\n    }, 'collect');\n  }\n  function sort(itemsKey, additionalDependentKeysOrDefinition, sortDefinition) {\n    (true && !(!(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))) && (0, _debug.assert)('You attempted to use @sort as a decorator directly, but it requires atleast an `itemsKey` parameter', !(0, _metal.isElementDescriptor)(Array.prototype.slice.call(arguments))));\n    if (true /* DEBUG */) {\n      var argumentsValid = false;\n      if (arguments.length === 2) {\n        argumentsValid = typeof itemsKey === 'string' && (typeof additionalDependentKeysOrDefinition === 'string' || typeof additionalDependentKeysOrDefinition === 'function');\n      }\n      if (arguments.length === 3) {\n        argumentsValid = typeof itemsKey === 'string' && Array.isArray(additionalDependentKeysOrDefinition) && typeof sortDefinition === 'function';\n      }\n      (true && !(argumentsValid) && (0, _debug.assert)('The `sort` computed macro can either be used with an array of sort properties or with a sort function. If used with an array of sort properties, it must receive exactly two arguments: the key of the array to sort, and the key of the array of sort properties. If used with a sort function, it may receive up to three arguments: the key of the array to sort, an optional additional array of dependent keys for the computed property, and the sort function.', argumentsValid));\n    }\n    var additionalDependentKeys;\n    var sortDefinitionOrString;\n    if (Array.isArray(additionalDependentKeysOrDefinition)) {\n      additionalDependentKeys = additionalDependentKeysOrDefinition;\n      sortDefinitionOrString = sortDefinition;\n    } else {\n      additionalDependentKeys = [];\n      sortDefinitionOrString = additionalDependentKeysOrDefinition;\n    }\n    if (typeof sortDefinitionOrString === 'function') {\n      return customSort(itemsKey, additionalDependentKeys, sortDefinitionOrString);\n    } else {\n      return propertySort(itemsKey, sortDefinitionOrString);\n    }\n  }\n  function customSort(itemsKey, additionalDependentKeys, comparator) {\n    return arrayMacro(itemsKey, additionalDependentKeys, function (value) {\n      return value.slice().sort((x, y) => comparator.call(this, x, y));\n    });\n  }\n  // This one needs to dynamically set up and tear down observers on the itemsKey\n  // depending on the sortProperties\n  function propertySort(itemsKey, sortPropertiesKey) {\n    var cp = (0, _metal.autoComputed)(function (key) {\n      var sortProperties = (0, _object.get)(this, sortPropertiesKey);\n      (true && !(function (arr) {\n        return isNativeOrEmberArray(arr) && arr.every(s => typeof s === 'string');\n      }(sortProperties)) && (0, _debug.assert)(`The sort definition for '${key}' on ${this} must be a function or an array of strings`, function (arr) {\n        return isNativeOrEmberArray(arr) && arr.every(s => typeof s === 'string');\n      }(sortProperties)));\n      var itemsKeyIsAtThis = itemsKey === '@this';\n      var normalizedSortProperties = normalizeSortProperties(sortProperties);\n      var items = itemsKeyIsAtThis ? this : (0, _object.get)(this, itemsKey);\n      if (!isNativeOrEmberArray(items)) {\n        return (0, _array.A)();\n      }\n      if (normalizedSortProperties.length === 0) {\n        return (0, _array.A)(items.slice());\n      } else {\n        return sortByNormalizedSortProperties(items, normalizedSortProperties);\n      }\n    }).readOnly();\n    return cp;\n  }\n  function normalizeSortProperties(sortProperties) {\n    var callback = p => {\n      var [prop, direction] = p.split(':');\n      direction = direction || 'asc';\n      // SAFETY: There will always be at least one value returned by split\n      return [prop, direction];\n    };\n    // This nonsense is necessary since technically the two map implementations diverge.\n    return Array.isArray(sortProperties) ? sortProperties.map(callback) : sortProperties.map(callback);\n  }\n  function sortByNormalizedSortProperties(items, normalizedSortProperties) {\n    return (0, _array.A)(items.slice().sort((itemA, itemB) => {\n      for (var [prop, direction] of normalizedSortProperties) {\n        var result = (0, _utils.compare)((0, _object.get)(itemA, prop), (0, _object.get)(itemB, prop));\n        if (result !== 0) {\n          return direction === 'desc' ? -1 * result : result;\n        }\n      }\n      return 0;\n    }));\n  }\n});","define(\"@ember/object/mixin\", [\"exports\", \"@ember/-internals/container\", \"@ember/-internals/meta\", \"@ember/-internals/utils\", \"@ember/debug\", \"@glimmer/util\", \"@ember/-internals/metal\", \"@ember/object/events\"], function (_exports, _container, _meta, _utils, _debug, _util, _metal, _events) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.applyMixin = applyMixin;\n  _exports.default = void 0;\n  _exports.mixin = mixin;\n  /**\n  @module @ember/object/mixin\n  */\n\n  var a_concat = Array.prototype.concat;\n  var {\n    isArray\n  } = Array;\n  function extractAccessors(properties) {\n    if (properties !== undefined) {\n      for (var key of Object.keys(properties)) {\n        var desc = Object.getOwnPropertyDescriptor(properties, key);\n        if (desc.get !== undefined || desc.set !== undefined) {\n          Object.defineProperty(properties, key, {\n            value: (0, _metal.nativeDescDecorator)(desc)\n          });\n        }\n      }\n    }\n    return properties;\n  }\n  function concatenatedMixinProperties(concatProp, props, values, base) {\n    // reset before adding each new mixin to pickup concats from previous\n    var concats = values[concatProp] || base[concatProp];\n    if (props[concatProp]) {\n      concats = concats ? a_concat.call(concats, props[concatProp]) : props[concatProp];\n    }\n    return concats;\n  }\n  function giveDecoratorSuper(key, decorator, property, descs) {\n    if (property === true) {\n      return decorator;\n    }\n    var originalGetter = property._getter;\n    if (originalGetter === undefined) {\n      return decorator;\n    }\n    var superDesc = descs[key];\n    // Check to see if the super property is a decorator first, if so load its descriptor\n    var superProperty = typeof superDesc === 'function' ? (0, _metal.descriptorForDecorator)(superDesc) : superDesc;\n    if (superProperty === undefined || superProperty === true) {\n      return decorator;\n    }\n    var superGetter = superProperty._getter;\n    if (superGetter === undefined) {\n      return decorator;\n    }\n    var get = (0, _utils.wrap)(originalGetter, superGetter);\n    var set;\n    var originalSetter = property._setter;\n    var superSetter = superProperty._setter;\n    if (superSetter !== undefined) {\n      if (originalSetter !== undefined) {\n        set = (0, _utils.wrap)(originalSetter, superSetter);\n      } else {\n        // If the super property has a setter, we default to using it no matter what.\n        // This is clearly very broken and weird, but it's what was here so we have\n        // to keep it until the next major at least.\n        //\n        // TODO: Add a deprecation here.\n        set = superSetter;\n      }\n    } else {\n      set = originalSetter;\n    }\n    // only create a new CP if we must\n    if (get !== originalGetter || set !== originalSetter) {\n      // Since multiple mixins may inherit from the same parent, we need\n      // to clone the computed property so that other mixins do not receive\n      // the wrapped version.\n      var dependentKeys = property._dependentKeys || [];\n      var newProperty = new _metal.ComputedProperty([...dependentKeys, {\n        get,\n        set\n      }]);\n      newProperty._readOnly = property._readOnly;\n      newProperty._meta = property._meta;\n      newProperty.enumerable = property.enumerable;\n      // SAFETY: We passed in the impl for this class\n      return (0, _metal.makeComputedDecorator)(newProperty, _metal.ComputedProperty);\n    }\n    return decorator;\n  }\n  function giveMethodSuper(key, method, values, descs) {\n    // Methods overwrite computed properties, and do not call super to them.\n    if (descs[key] !== undefined) {\n      return method;\n    }\n    // Find the original method in a parent mixin\n    var superMethod = values[key];\n    // Only wrap the new method if the original method was a function\n    if (typeof superMethod === 'function') {\n      return (0, _utils.wrap)(method, superMethod);\n    }\n    return method;\n  }\n  function simpleMakeArray(value) {\n    if (!value) {\n      return [];\n    } else if (!Array.isArray(value)) {\n      return [value];\n    } else {\n      return value;\n    }\n  }\n  function applyConcatenatedProperties(key, value, values) {\n    var baseValue = values[key];\n    var ret = simpleMakeArray(baseValue).concat(simpleMakeArray(value));\n    if (true /* DEBUG */) {\n      // it is possible to use concatenatedProperties with strings (which cannot be frozen)\n      // only freeze objects...\n      if (typeof ret === 'object' && ret !== null) {\n        // prevent mutating `concatenatedProperties` array after it is applied\n        Object.freeze(ret);\n      }\n    }\n    return ret;\n  }\n  function applyMergedProperties(key, value, values) {\n    var baseValue = values[key];\n    (true && !(!isArray(value)) && (0, _debug.assert)(`You passed in \\`${JSON.stringify(value)}\\` as the value for \\`${key}\\` but \\`${key}\\` cannot be an Array`, !isArray(value)));\n    if (!baseValue) {\n      return value;\n    }\n    var newBase = Object.assign({}, baseValue);\n    var hasFunction = false;\n    var props = Object.keys(value);\n    for (var prop of props) {\n      var propValue = value[prop];\n      if (typeof propValue === 'function') {\n        hasFunction = true;\n        newBase[prop] = giveMethodSuper(prop, propValue, baseValue, {});\n      } else {\n        newBase[prop] = propValue;\n      }\n    }\n    if (hasFunction) {\n      newBase._super = _utils.ROOT;\n    }\n    return newBase;\n  }\n  function mergeMixins(mixins, meta, descs, values, base, keys, keysWithSuper) {\n    var currentMixin;\n    for (var i = 0; i < mixins.length; i++) {\n      currentMixin = mixins[i];\n      (true && !(typeof currentMixin === 'object' && currentMixin !== null && Object.prototype.toString.call(currentMixin) !== '[object Array]') && (0, _debug.assert)(`Expected hash or Mixin instance, got ${Object.prototype.toString.call(currentMixin)}`, typeof currentMixin === 'object' && currentMixin !== null && Object.prototype.toString.call(currentMixin) !== '[object Array]'));\n      if (MIXINS.has(currentMixin)) {\n        if (meta.hasMixin(currentMixin)) {\n          continue;\n        }\n        meta.addMixin(currentMixin);\n        var {\n          properties,\n          mixins: _mixins\n        } = currentMixin;\n        if (properties !== undefined) {\n          mergeProps(meta, properties, descs, values, base, keys, keysWithSuper);\n        } else if (_mixins !== undefined) {\n          mergeMixins(_mixins, meta, descs, values, base, keys, keysWithSuper);\n          if (currentMixin instanceof Mixin && currentMixin._without !== undefined) {\n            currentMixin._without.forEach(keyName => {\n              // deleting the key means we won't process the value\n              var index = keys.indexOf(keyName);\n              if (index !== -1) {\n                keys.splice(index, 1);\n              }\n            });\n          }\n        }\n      } else {\n        mergeProps(meta, currentMixin, descs, values, base, keys, keysWithSuper);\n      }\n    }\n  }\n  function mergeProps(meta, props, descs, values, base, keys, keysWithSuper) {\n    var concats = concatenatedMixinProperties('concatenatedProperties', props, values, base);\n    var mergings = concatenatedMixinProperties('mergedProperties', props, values, base);\n    var propKeys = Object.keys(props);\n    for (var key of propKeys) {\n      var value = props[key];\n      if (value === undefined) continue;\n      if (keys.indexOf(key) === -1) {\n        keys.push(key);\n        var desc = meta.peekDescriptors(key);\n        if (desc === undefined) {\n          // The superclass did not have a CP, which means it may have\n          // observers or listeners on that property.\n          var prev = values[key] = base[key];\n          if (typeof prev === 'function') {\n            updateObserversAndListeners(base, key, prev, false);\n          }\n        } else {\n          descs[key] = desc;\n          // The super desc will be overwritten on descs, so save off the fact that\n          // there was a super so we know to Object.defineProperty when writing\n          // the value\n          keysWithSuper.push(key);\n          desc.teardown(base, key, meta);\n        }\n      }\n      var isFunction = typeof value === 'function';\n      if (isFunction) {\n        var _desc = (0, _metal.descriptorForDecorator)(value);\n        if (_desc !== undefined) {\n          // Wrap descriptor function to implement _super() if needed\n          descs[key] = giveDecoratorSuper(key, value, _desc, descs);\n          values[key] = undefined;\n          continue;\n        }\n      }\n      if (concats && concats.indexOf(key) >= 0 || key === 'concatenatedProperties' || key === 'mergedProperties') {\n        value = applyConcatenatedProperties(key, value, values);\n      } else if (mergings && mergings.indexOf(key) > -1) {\n        value = applyMergedProperties(key, value, values);\n      } else if (isFunction) {\n        value = giveMethodSuper(key, value, values, descs);\n      }\n      values[key] = value;\n      descs[key] = undefined;\n    }\n  }\n  function updateObserversAndListeners(obj, key, fn, add) {\n    var meta = (0, _utils.observerListenerMetaFor)(fn);\n    if (meta === undefined) return;\n    var {\n      observers,\n      listeners\n    } = meta;\n    if (observers !== undefined) {\n      var updateObserver = add ? _metal.addObserver : _metal.removeObserver;\n      for (var path of observers.paths) {\n        updateObserver(obj, path, null, key, observers.sync);\n      }\n    }\n    if (listeners !== undefined) {\n      var updateListener = add ? _events.addListener : _events.removeListener;\n      for (var listener of listeners) {\n        updateListener(obj, listener, null, key);\n      }\n    }\n  }\n  function applyMixin(obj, mixins, _hideKeys) {\n    if (_hideKeys === void 0) {\n      _hideKeys = false;\n    }\n    var descs = Object.create(null);\n    var values = Object.create(null);\n    var meta = (0, _meta.meta)(obj);\n    var keys = [];\n    var keysWithSuper = [];\n    obj._super = _utils.ROOT;\n    // Go through all mixins and hashes passed in, and:\n    //\n    // * Handle concatenated properties\n    // * Handle merged properties\n    // * Set up _super wrapping if necessary\n    // * Set up computed property descriptors\n    // * Copying `toString` in broken browsers\n    mergeMixins(mixins, meta, descs, values, obj, keys, keysWithSuper);\n    for (var key of keys) {\n      var value = values[key];\n      var desc = descs[key];\n      if (value !== undefined) {\n        if (typeof value === 'function') {\n          updateObserversAndListeners(obj, key, value, true);\n        }\n        (0, _metal.defineValue)(obj, key, value, keysWithSuper.indexOf(key) !== -1, !_hideKeys);\n      } else if (desc !== undefined) {\n        (0, _metal.defineDecorator)(obj, key, desc, meta);\n      }\n    }\n    if (!meta.isPrototypeMeta(obj)) {\n      (0, _metal.revalidateObservers)(obj);\n    }\n    return obj;\n  }\n  /**\n    @method mixin\n    @param obj\n    @param mixins*\n    @return obj\n    @private\n  */\n  function mixin(obj) {\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n    applyMixin(obj, args);\n    return obj;\n  }\n  var MIXINS = new _util._WeakSet();\n  /**\n    The `Mixin` class allows you to create mixins, whose properties can be\n    added to other classes. For instance,\n  \n    ```javascript\n    import Mixin from '@ember/object/mixin';\n  \n    const EditableMixin = Mixin.create({\n      edit() {\n        console.log('starting to edit');\n        this.set('isEditing', true);\n      },\n      isEditing: false\n    });\n    ```\n  \n    ```javascript\n    import EmberObject from '@ember/object';\n    import EditableMixin from '../mixins/editable';\n  \n    // Mix mixins into classes by passing them as the first arguments to\n    // `.extend.`\n    const Comment = EmberObject.extend(EditableMixin, {\n      post: null\n    });\n  \n    let comment = Comment.create({\n      post: somePost\n    });\n  \n    comment.edit(); // outputs 'starting to edit'\n    ```\n  \n    Note that Mixins are created with `Mixin.create`, not\n    `Mixin.extend`.\n  \n    Note that mixins extend a constructor's prototype so arrays and object literals\n    defined as properties will be shared amongst objects that implement the mixin.\n    If you want to define a property in a mixin that is not shared, you can define\n    it either as a computed property or have it be created on initialization of the object.\n  \n    ```javascript\n    // filters array will be shared amongst any object implementing mixin\n    import Mixin from '@ember/object/mixin';\n    import { A } from '@ember/array';\n  \n    const FilterableMixin = Mixin.create({\n      filters: A()\n    });\n    ```\n  \n    ```javascript\n    import Mixin from '@ember/object/mixin';\n    import { A } from '@ember/array';\n    import { computed } from '@ember/object';\n  \n    // filters will be a separate array for every object implementing the mixin\n    const FilterableMixin = Mixin.create({\n      filters: computed(function() {\n        return A();\n      })\n    });\n    ```\n  \n    ```javascript\n    import Mixin from '@ember/object/mixin';\n    import { A } from '@ember/array';\n  \n    // filters will be created as a separate array during the object's initialization\n    const Filterable = Mixin.create({\n      filters: null,\n  \n      init() {\n        this._super(...arguments);\n        this.set(\"filters\", A());\n      }\n    });\n    ```\n  \n    @class Mixin\n    @public\n  */\n  class Mixin {\n    /** @internal */\n    constructor(mixins, properties) {\n      MIXINS.add(this);\n      this.properties = extractAccessors(properties);\n      this.mixins = buildMixinsArray(mixins);\n      this.ownerConstructor = undefined;\n      this._without = undefined;\n      if (true /* DEBUG */) {\n        // Eagerly add INIT_FACTORY to avoid issues in DEBUG as a result of Object.seal(mixin)\n        this[_container.INIT_FACTORY] = null;\n        /*\n          In debug builds, we seal mixins to help avoid performance pitfalls.\n                 In IE11 there is a quirk that prevents sealed objects from being added\n          to a WeakMap. Unfortunately, the mixin system currently relies on\n          weak maps in `guidFor`, so we need to prime the guid cache weak map.\n        */\n        (0, _utils.guidFor)(this);\n        if (Mixin._disableDebugSeal !== true) {\n          Object.seal(this);\n        }\n      }\n    }\n    /**\n      @method create\n      @for @ember/object/mixin\n      @static\n      @param arguments*\n      @public\n    */\n    static create() {\n      (0, _metal.setUnprocessedMixins)();\n      var M = this;\n      for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n      return new M(args, undefined);\n    }\n    // returns the mixins currently applied to the specified object\n    // TODO: Make `mixin`\n    /** @internal */\n    static mixins(obj) {\n      var meta = (0, _meta.peekMeta)(obj);\n      var ret = [];\n      if (meta === null) {\n        return ret;\n      }\n      meta.forEachMixins(currentMixin => {\n        // skip primitive mixins since these are always anonymous\n        if (!currentMixin.properties) {\n          ret.push(currentMixin);\n        }\n      });\n      return ret;\n    }\n    /**\n      @method reopen\n      @param arguments*\n      @private\n      @internal\n    */\n    reopen() {\n      for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n        args[_key3] = arguments[_key3];\n      }\n      if (args.length === 0) {\n        return;\n      }\n      if (this.properties) {\n        var currentMixin = new Mixin(undefined, this.properties);\n        this.properties = undefined;\n        this.mixins = [currentMixin];\n      } else if (!this.mixins) {\n        this.mixins = [];\n      }\n      this.mixins = this.mixins.concat(buildMixinsArray(args));\n      return this;\n    }\n    /**\n      @method apply\n      @param obj\n      @return applied object\n      @private\n      @internal\n    */\n    apply(obj, _hideKeys) {\n      if (_hideKeys === void 0) {\n        _hideKeys = false;\n      }\n      // Ember.NativeArray is a normal Ember.Mixin that we mix into `Array.prototype` when prototype extensions are enabled\n      // mutating a native object prototype like this should _not_ result in enumerable properties being added (or we have significant\n      // issues with things like deep equality checks from test frameworks, or things like jQuery.extend(true, [], [])).\n      //\n      // _hideKeys disables enumerablity when applying the mixin. This is a hack, and we should stop mutating the array prototype by default 😫\n      return applyMixin(obj, [this], _hideKeys);\n    }\n    /** @internal */\n    applyPartial(obj) {\n      return applyMixin(obj, [this]);\n    }\n    /**\n      @method detect\n      @param obj\n      @return {Boolean}\n      @private\n      @internal\n    */\n    detect(obj) {\n      if (typeof obj !== 'object' || obj === null) {\n        return false;\n      }\n      if (MIXINS.has(obj)) {\n        return _detect(obj, this);\n      }\n      var meta = (0, _meta.peekMeta)(obj);\n      if (meta === null) {\n        return false;\n      }\n      return meta.hasMixin(this);\n    }\n    /** @internal */\n    without() {\n      var ret = new Mixin([this]);\n      for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n        args[_key4] = arguments[_key4];\n      }\n      ret._without = args;\n      return ret;\n    }\n    /** @internal */\n    keys() {\n      var keys = _keys(this);\n      (true && !(keys) && (0, _debug.assert)('[BUG] Missing keys for mixin!', keys));\n      return keys;\n    }\n    /** @internal */\n    toString() {\n      return '(unknown mixin)';\n    }\n  }\n  _exports.default = Mixin;\n  if (true /* DEBUG */) {\n    Object.defineProperty(Mixin, '_disableDebugSeal', {\n      configurable: true,\n      enumerable: false,\n      writable: true,\n      value: false\n    });\n  }\n  function buildMixinsArray(mixins) {\n    var length = mixins && mixins.length || 0;\n    var m = undefined;\n    if (length > 0) {\n      m = new Array(length);\n      for (var i = 0; i < length; i++) {\n        var x = mixins[i];\n        (true && !(typeof x === 'object' && x !== null && Object.prototype.toString.call(x) !== '[object Array]') && (0, _debug.assert)(`Expected hash or Mixin instance, got ${Object.prototype.toString.call(x)}`, typeof x === 'object' && x !== null && Object.prototype.toString.call(x) !== '[object Array]'));\n        if (MIXINS.has(x)) {\n          m[i] = x;\n        } else {\n          m[i] = new Mixin(undefined, x);\n        }\n      }\n    }\n    return m;\n  }\n  if (true /* DEBUG */) {\n    Object.seal(Mixin.prototype);\n  }\n  function _detect(curMixin, targetMixin, seen) {\n    if (seen === void 0) {\n      seen = new Set();\n    }\n    if (seen.has(curMixin)) {\n      return false;\n    }\n    seen.add(curMixin);\n    if (curMixin === targetMixin) {\n      return true;\n    }\n    var mixins = curMixin.mixins;\n    if (mixins) {\n      return mixins.some(mixin => _detect(mixin, targetMixin, seen));\n    }\n    return false;\n  }\n  function _keys(mixin, ret, seen) {\n    if (ret === void 0) {\n      ret = new Set();\n    }\n    if (seen === void 0) {\n      seen = new Set();\n    }\n    if (seen.has(mixin)) {\n      return;\n    }\n    seen.add(mixin);\n    if (mixin.properties) {\n      var props = Object.keys(mixin.properties);\n      for (var prop of props) {\n        ret.add(prop);\n      }\n    } else if (mixin.mixins) {\n      mixin.mixins.forEach(x => _keys(x, ret, seen));\n    }\n    return ret;\n  }\n});","define(\"@ember/object/observable\", [\"exports\", \"@ember/-internals/meta\", \"@ember/-internals/metal\", \"@ember/object\", \"@ember/object/mixin\", \"@ember/debug\"], function (_exports, _meta, _metal, _object, _mixin, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n  @module @ember/object/observable\n  */\n\n  var Observable = _mixin.default.create({\n    get(keyName) {\n      return (0, _object.get)(this, keyName);\n    },\n    getProperties() {\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n      return (0, _object.getProperties)(this, ...args);\n    },\n    set(keyName, value) {\n      return (0, _object.set)(this, keyName, value);\n    },\n    setProperties(hash) {\n      return (0, _object.setProperties)(this, hash);\n    },\n    /**\n      Begins a grouping of property changes.\n         You can use this method to group property changes so that notifications\n      will not be sent until the changes are finished. If you plan to make a\n      large number of changes to an object at one time, you should call this\n      method at the beginning of the changes to begin deferring change\n      notifications. When you are done making changes, call\n      `endPropertyChanges()` to deliver the deferred change notifications and end\n      deferring.\n         @method beginPropertyChanges\n      @return {Observable}\n      @private\n    */\n    beginPropertyChanges() {\n      (0, _metal.beginPropertyChanges)();\n      return this;\n    },\n    /**\n      Ends a grouping of property changes.\n         You can use this method to group property changes so that notifications\n      will not be sent until the changes are finished. If you plan to make a\n      large number of changes to an object at one time, you should call\n      `beginPropertyChanges()` at the beginning of the changes to defer change\n      notifications. When you are done making changes, call this method to\n      deliver the deferred change notifications and end deferring.\n         @method endPropertyChanges\n      @return {Observable}\n      @private\n    */\n    endPropertyChanges() {\n      (0, _metal.endPropertyChanges)();\n      return this;\n    },\n    notifyPropertyChange(keyName) {\n      (0, _metal.notifyPropertyChange)(this, keyName);\n      return this;\n    },\n    addObserver(key, target, method, sync) {\n      (0, _metal.addObserver)(this, key, target, method, sync);\n      return this;\n    },\n    removeObserver(key, target, method, sync) {\n      (0, _metal.removeObserver)(this, key, target, method, sync);\n      return this;\n    },\n    /**\n      Returns `true` if the object currently has observers registered for a\n      particular key. You can use this method to potentially defer performing\n      an expensive action until someone begins observing a particular property\n      on the object.\n         @method hasObserverFor\n      @param {String} key Key to check\n      @return {Boolean}\n      @private\n    */\n    hasObserverFor(key) {\n      return (0, _metal.hasListeners)(this, `${key}:change`);\n    },\n    incrementProperty(keyName, increment) {\n      if (increment === void 0) {\n        increment = 1;\n      }\n      (true && !(!isNaN(parseFloat(String(increment))) && isFinite(increment)) && (0, _debug.assert)('Must pass a numeric value to incrementProperty', !isNaN(parseFloat(String(increment))) && isFinite(increment)));\n      return (0, _object.set)(this, keyName, (parseFloat((0, _object.get)(this, keyName)) || 0) + increment);\n    },\n    decrementProperty(keyName, decrement) {\n      if (decrement === void 0) {\n        decrement = 1;\n      }\n      (true && !((typeof decrement === 'number' || !isNaN(parseFloat(decrement))) && isFinite(decrement)) && (0, _debug.assert)('Must pass a numeric value to decrementProperty', (typeof decrement === 'number' || !isNaN(parseFloat(decrement))) && isFinite(decrement)));\n      return (0, _object.set)(this, keyName, ((0, _object.get)(this, keyName) || 0) - decrement);\n    },\n    toggleProperty(keyName) {\n      return (0, _object.set)(this, keyName, !(0, _object.get)(this, keyName));\n    },\n    cacheFor(keyName) {\n      var meta = (0, _meta.peekMeta)(this);\n      if (meta !== null) {\n        return meta.valueFor(keyName);\n      }\n    }\n  });\n  var _default = Observable;\n  _exports.default = _default;\n});","define(\"@ember/object/observers\", [\"exports\", \"@ember/-internals/metal\"], function (_exports, _metal) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"addObserver\", {\n    enumerable: true,\n    get: function () {\n      return _metal.addObserver;\n    }\n  });\n  Object.defineProperty(_exports, \"removeObserver\", {\n    enumerable: true,\n    get: function () {\n      return _metal.removeObserver;\n    }\n  });\n});","define(\"@ember/object/promise-proxy-mixin\", [\"exports\", \"@ember/object\", \"@ember/object/mixin\"], function (_exports, _object, _mixin) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n    @module @ember/object/promise-proxy-mixin\n  */\n  function tap(proxy, promise) {\n    (0, _object.setProperties)(proxy, {\n      isFulfilled: false,\n      isRejected: false\n    });\n    return promise.then(value => {\n      if (!proxy.isDestroyed && !proxy.isDestroying) {\n        (0, _object.setProperties)(proxy, {\n          content: value,\n          isFulfilled: true\n        });\n      }\n      return value;\n    }, reason => {\n      if (!proxy.isDestroyed && !proxy.isDestroying) {\n        (0, _object.setProperties)(proxy, {\n          reason,\n          isRejected: true\n        });\n      }\n      throw reason;\n    }, 'Ember: PromiseProxy');\n  }\n  var PromiseProxyMixin = _mixin.default.create({\n    reason: null,\n    isPending: (0, _object.computed)('isSettled', function () {\n      return !(0, _object.get)(this, 'isSettled');\n    }).readOnly(),\n    isSettled: (0, _object.computed)('isRejected', 'isFulfilled', function () {\n      return (0, _object.get)(this, 'isRejected') || (0, _object.get)(this, 'isFulfilled');\n    }).readOnly(),\n    isRejected: false,\n    isFulfilled: false,\n    promise: (0, _object.computed)({\n      get() {\n        throw new Error(\"PromiseProxy's promise must be set\");\n      },\n      set(_key, promise) {\n        return tap(this, promise);\n      }\n    }),\n    then: promiseAlias('then'),\n    catch: promiseAlias('catch'),\n    finally: promiseAlias('finally')\n  });\n  function promiseAlias(name) {\n    return function () {\n      var promise = (0, _object.get)(this, 'promise');\n      // We need this cast because `Parameters` is deferred so that it is not\n      // possible for TS to see it will always produce the right type. However,\n      // since `AnyFn` has a rest type, it is allowed. See discussion on [this\n      // issue](https://github.com/microsoft/TypeScript/issues/47615).\n      return promise[name](...arguments);\n    };\n  }\n  var _default = PromiseProxyMixin;\n  _exports.default = _default;\n});","define(\"@ember/object/proxy\", [\"exports\", \"@ember/object/-internals\", \"@ember/-internals/runtime\"], function (_exports, _internals, _runtime) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n  @module @ember/object/proxy\n  */\n\n  class ObjectProxy extends _internals.FrameworkObject {}\n  ObjectProxy.PrototypeMixin.reopen(_runtime._ProxyMixin);\n  var _default = ObjectProxy;\n  _exports.default = _default;\n});","define(\"@ember/owner/index\", [\"exports\", \"@ember/-internals/owner\"], function (_exports, _owner) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.getOwner = void 0;\n  Object.defineProperty(_exports, \"setOwner\", {\n    enumerable: true,\n    get: function () {\n      return _owner.setOwner;\n    }\n  });\n  /**\n    Ember’s dependency injection system is built on the idea of an \"owner\": an\n    object responsible for managing items which can be registered and looked up\n    with the system.\n  \n    This module does not provide any concrete instances of owners. Instead, it\n    defines the core type, `Owner`, which specifies the public API contract for an\n    owner. The primary concrete implementations of `Owner` are `EngineInstance`,\n    from `@ember/engine/instance`, and its `ApplicationInstance` subclass, from\n    `@ember/application/instance`.\n  \n    Along with `Owner` itself, this module provides a number of supporting types\n    related to Ember's DI system:\n  \n    - `Factory`, Ember's primary interface for something which can create class\n      instances registered with the DI system.\n  \n    - `FactoryManager`, an interface for inspecting a `Factory`'s class.\n  \n    - `Resolver`, an interface defining the contract for the object responsible\n      for mapping string names to the corresponding classes. For example, when you\n      write `@service('session')`, a resolver is responsible to map that back to\n      the `Session` service class in your codebase. Normally, this is handled for\n      you automatically with `ember-resolver`, which is the main implementor of\n      this interface.\n  \n    For more details on each, see their per-item docs.\n  \n    @module @ember/owner\n    @public\n  */\n  // We need to provide a narrower public interface to `getOwner` so that we only\n  // expose the `Owner` type, *not* our richer `InternalOwner` type and its\n  // various bits of private API.\n\n  // NOTE: this documentation appears here instead of at the definition site so\n  // it can appear correctly in both API docs and for TS, while providing a richer\n  // internal representation for Ember's own usage.\n  /**\n    Framework objects in an Ember application (components, services, routes, etc.)\n    are created via a factory and dependency injection system. Each of these\n    objects is the responsibility of an \"owner\", which handled its\n    instantiation and manages its lifetime.\n  \n    `getOwner` fetches the owner object responsible for an instance. This can\n    be used to lookup or resolve other class instances, or register new factories\n    into the owner.\n  \n    For example, this component dynamically looks up a service based on the\n    `audioType` passed as an argument:\n  \n    ```app/components/play-audio.js\n    import Component from '@glimmer/component';\n    import { action } from '@ember/object';\n    import { getOwner } from '@ember/application';\n  \n    // Usage:\n    //\n    //   <PlayAudio @audioType={{@model.audioType}} @audioFile={{@model.file}}/>\n    //\n    export default class extends Component {\n      get audioService() {\n        return getOwner(this)?.lookup(`service:${this.args.audioType}`);\n      }\n  \n      @action\n      onPlay() {\n        this.audioService?.play(this.args.audioFile);\n      }\n    }\n    ```\n  \n    @method getOwner\n    @static\n    @for @ember/owner\n    @param {Object} object An object with an owner.\n    @return {Object} An owner object.\n    @since 2.3.0\n    @public\n  */\n  // SAFETY: the cast here is necessary, instead of using an assignment, because\n  // TS (not incorrectly! Nothing expressly relates them) does not see that the\n  // `InternalOwner` and `Owner` do actually have identical constraints on their\n  // relations to the `DIRegistry`.\n  var getOwner = _owner.getOwner;\n  _exports.getOwner = getOwner;\n});","define(\"@ember/polyfills/index\", [\"exports\", \"@ember/polyfills/lib/assign\"], function (_exports, _assign) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"assign\", {\n    enumerable: true,\n    get: function () {\n      return _assign.assign;\n    }\n  });\n  _exports.hasPropertyAccessors = void 0;\n  var hasPropertyAccessors = true;\n  _exports.hasPropertyAccessors = hasPropertyAccessors;\n});","define(\"@ember/polyfills/lib/assign\", [\"exports\", \"@ember/debug\"], function (_exports, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.assign = assign;\n  /**\n    Copy properties from a source object to a target object. Source arguments remain unchanged.\n  \n    ```javascript\n    import { assign } from '@ember/polyfills';\n  \n    var a = { first: 'Yehuda' };\n    var b = { last: 'Katz' };\n    var c = { company: 'Other Company' };\n    var d = { company: 'Tilde Inc.' };\n    assign(a, b, c, d); // a === { first: 'Yehuda', last: 'Katz', company: 'Tilde Inc.' };\n    ```\n  \n    @method assign\n    @for @ember/polyfills\n    @param {Object} target The object to assign into\n    @param {Object} ...args The objects to copy properties from\n    @return {Object}\n    @public\n    @static\n  */\n  function assign(target) {\n    (true && !(false) && (0, _debug.deprecate)('Use of `assign` has been deprecated. Please use `Object.assign` or the spread operator instead.', false, {\n      id: 'ember-polyfills.deprecate-assign',\n      until: '5.0.0',\n      url: 'https://deprecations.emberjs.com/v4.x/#toc_ember-polyfills-deprecate-assign',\n      for: 'ember-source',\n      since: {\n        available: '4.0.0',\n        enabled: '4.0.0'\n      }\n    }));\n    for (var _len = arguments.length, rest = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      rest[_key - 1] = arguments[_key];\n    }\n    return Object.assign(target, ...rest);\n  }\n});","define(\"@ember/renderer/index\", [\"exports\", \"@ember/-internals/glimmer\"], function (_exports, _glimmer) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"renderSettled\", {\n    enumerable: true,\n    get: function () {\n      return _glimmer.renderSettled;\n    }\n  });\n});","define(\"@ember/routing/-internals\", [\"exports\", \"@ember/routing/lib/router_state\", \"@ember/routing/lib/routing-service\", \"@ember/routing/lib/utils\", \"@ember/routing/lib/generate_controller\", \"@ember/routing/lib/cache\", \"@ember/routing/lib/dsl\", \"@ember/routing/lib/controller_for\"], function (_exports, _router_state, _routingService, _utils, _generate_controller, _cache, _dsl, _controller_for) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"BucketCache\", {\n    enumerable: true,\n    get: function () {\n      return _cache.default;\n    }\n  });\n  Object.defineProperty(_exports, \"DSL\", {\n    enumerable: true,\n    get: function () {\n      return _dsl.default;\n    }\n  });\n  Object.defineProperty(_exports, \"RouterState\", {\n    enumerable: true,\n    get: function () {\n      return _router_state.default;\n    }\n  });\n  Object.defineProperty(_exports, \"RoutingService\", {\n    enumerable: true,\n    get: function () {\n      return _routingService.default;\n    }\n  });\n  Object.defineProperty(_exports, \"controllerFor\", {\n    enumerable: true,\n    get: function () {\n      return _controller_for.default;\n    }\n  });\n  Object.defineProperty(_exports, \"deprecateTransitionMethods\", {\n    enumerable: true,\n    get: function () {\n      return _utils.deprecateTransitionMethods;\n    }\n  });\n  Object.defineProperty(_exports, \"generateController\", {\n    enumerable: true,\n    get: function () {\n      return _generate_controller.default;\n    }\n  });\n  Object.defineProperty(_exports, \"generateControllerFactory\", {\n    enumerable: true,\n    get: function () {\n      return _generate_controller.generateControllerFactory;\n    }\n  });\n  Object.defineProperty(_exports, \"prefixRouteNameArg\", {\n    enumerable: true,\n    get: function () {\n      return _utils.prefixRouteNameArg;\n    }\n  });\n});","define(\"@ember/routing/auto-location\", [\"exports\", \"@ember/-internals/browser-environment\", \"@ember/-internals/owner\", \"@ember/object\", \"@ember/debug\", \"@ember/routing/lib/location-utils\"], function (_exports, _browserEnvironment, _owner, _object, _debug, _locationUtils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.getHashPath = getHashPath;\n  _exports.getHistoryPath = getHistoryPath;\n  /**\n  @module @ember/routing/auto-location\n  */\n  /**\n    AutoLocation will select the best location option based off browser\n    support with the priority order: history, hash, none.\n  \n    Clean pushState paths accessed by hashchange-only browsers will be redirected\n    to the hash-equivalent and vice versa so future transitions are consistent.\n  \n    Keep in mind that since some of your users will use `HistoryLocation`, your\n    server must serve the Ember app at all the routes you define.\n  \n    Browsers that support the `history` API will use `HistoryLocation`, those that\n    do not, but still support the `hashchange` event will use `HashLocation`, and\n    in the rare case neither is supported will use `NoneLocation`.\n  \n    Example:\n  \n    ```app/router.js\n    Router.map(function() {\n      this.route('posts', function() {\n        this.route('new');\n      });\n    });\n  \n    Router.reopen({\n      location: 'auto'\n    });\n    ```\n  \n    This will result in a posts.new url of `/posts/new` for modern browsers that\n    support the `history` api or `/#/posts/new` for older ones, like Internet\n    Explorer 9 and below.\n  \n    When a user visits a link to your application, they will be automatically\n    upgraded or downgraded to the appropriate `Location` class, with the URL\n    transformed accordingly, if needed.\n  \n    Keep in mind that since some of your users will use `HistoryLocation`, your\n    server must serve the Ember app at all the routes you define.\n  \n    @class AutoLocation\n    @static\n    @protected\n  */\n  class AutoLocation extends _object.default {\n    constructor() {\n      super(...arguments);\n      this.implementation = 'auto';\n    }\n    /**\n     Called by the router to instruct the location to do any feature detection\n     necessary. In the case of AutoLocation, we detect whether to use history\n     or hash concrete implementations.\n        @private\n    */\n    detect() {\n      var rootURL = this.rootURL;\n      (true && !(rootURL.charAt(rootURL.length - 1) === '/') && (0, _debug.assert)('rootURL must end with a trailing forward slash e.g. \"/app/\"', rootURL.charAt(rootURL.length - 1) === '/'));\n      var implementation = detectImplementation({\n        location: this.location,\n        history: this.history,\n        userAgent: this.userAgent,\n        rootURL,\n        documentMode: this.documentMode,\n        global: this.global\n      });\n      if (implementation === false) {\n        (0, _object.set)(this, 'cancelRouterSetup', true);\n        implementation = 'none';\n      }\n      var owner = (0, _owner.getOwner)(this);\n      (true && !(owner) && (0, _debug.assert)('AutoLocation is unexpectedly missing an owner', owner));\n      var concrete = owner.lookup(`location:${implementation}`);\n      (true && !(concrete !== undefined) && (0, _debug.assert)(`Could not find location '${implementation}'.`, concrete !== undefined));\n      (0, _object.set)(concrete, 'rootURL', rootURL);\n      (0, _object.set)(this, 'concreteImplementation', concrete);\n    }\n    willDestroy() {\n      var {\n        concreteImplementation\n      } = this;\n      if (concreteImplementation) {\n        concreteImplementation.destroy();\n      }\n    }\n  }\n  _exports.default = AutoLocation;\n  AutoLocation.reopen({\n    rootURL: '/',\n    initState: delegateToConcreteImplementation('initState'),\n    getURL: delegateToConcreteImplementation('getURL'),\n    setURL: delegateToConcreteImplementation('setURL'),\n    replaceURL: delegateToConcreteImplementation('replaceURL'),\n    onUpdateURL: delegateToConcreteImplementation('onUpdateURL'),\n    formatURL: delegateToConcreteImplementation('formatURL'),\n    location: _browserEnvironment.location,\n    history: _browserEnvironment.history,\n    global: _browserEnvironment.window,\n    userAgent: _browserEnvironment.userAgent,\n    cancelRouterSetup: false\n  });\n  function delegateToConcreteImplementation(methodName) {\n    return function () {\n      var _a;\n      var {\n        concreteImplementation\n      } = this;\n      (true && !(concreteImplementation) && (0, _debug.assert)(\"AutoLocation's detect() method should be called before calling any other hooks.\", concreteImplementation)); // We need this cast because `Parameters` is deferred so that it is not\n      // possible for TS to see it will always produce the right type. However,\n      // since `AnyFn` has a rest type, it is allowed. See discussion on [this\n      // issue](https://github.com/microsoft/TypeScript/issues/47615).\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n      return (_a = concreteImplementation[methodName]) === null || _a === void 0 ? void 0 : _a.call(concreteImplementation, ...args);\n    };\n  }\n  function detectImplementation(options) {\n    var {\n      location,\n      userAgent,\n      history,\n      documentMode,\n      global,\n      rootURL\n    } = options;\n    var implementation = 'none';\n    var cancelRouterSetup = false;\n    var currentPath = (0, _locationUtils.getFullPath)(location);\n    if ((0, _locationUtils.supportsHistory)(userAgent, history)) {\n      var historyPath = getHistoryPath(rootURL, location);\n      // If the browser supports history and we have a history path, we can use\n      // the history location with no redirects.\n      if (currentPath === historyPath) {\n        implementation = 'history';\n      } else if (currentPath.substring(0, 2) === '/#') {\n        history.replaceState({\n          path: historyPath\n        }, '', historyPath);\n        implementation = 'history';\n      } else {\n        cancelRouterSetup = true;\n        (0, _locationUtils.replacePath)(location, historyPath);\n      }\n    } else if ((0, _locationUtils.supportsHashChange)(documentMode, global)) {\n      var hashPath = getHashPath(rootURL, location);\n      // Be sure we're using a hashed path, otherwise let's switch over it to so\n      // we start off clean and consistent. We'll count an index path with no\n      // hash as \"good enough\" as well.\n      if (currentPath === hashPath || currentPath === '/' && hashPath === '/#/') {\n        implementation = 'hash';\n      } else {\n        // Our URL isn't in the expected hash-supported format, so we want to\n        // cancel the router setup and replace the URL to start off clean\n        cancelRouterSetup = true;\n        (0, _locationUtils.replacePath)(location, hashPath);\n      }\n    }\n    if (cancelRouterSetup) {\n      return false;\n    }\n    return implementation;\n  }\n  /**\n    @private\n  \n    Returns the current path as it should appear for HistoryLocation supported\n    browsers. This may very well differ from the real current path (e.g. if it\n    starts off as a hashed URL)\n  */\n  function getHistoryPath(rootURL, location) {\n    var path = (0, _locationUtils.getPath)(location);\n    var hash = (0, _locationUtils.getHash)(location);\n    var query = (0, _locationUtils.getQuery)(location);\n    var rootURLIndex = path.indexOf(rootURL);\n    var routeHash;\n    var hashParts;\n    (true && !(rootURLIndex === 0) && (0, _debug.assert)(`Path ${path} does not start with the provided rootURL ${rootURL}`, rootURLIndex === 0)); // By convention, Ember.js routes using HashLocation are required to start\n    // with `#/`. Anything else should NOT be considered a route and should\n    // be passed straight through, without transformation.\n    if (hash.substring(0, 2) === '#/') {\n      // There could be extra hash segments after the route\n      hashParts = hash.substring(1).split('#');\n      // The first one is always the route url\n      routeHash = hashParts.shift();\n      // If the path already has a trailing slash, remove the one\n      // from the hashed route so we don't double up.\n      if (path.charAt(path.length - 1) === '/') {\n        routeHash = routeHash.substring(1);\n      }\n      // This is the \"expected\" final order\n      path += routeHash + query;\n      if (hashParts.length) {\n        path += `#${hashParts.join('#')}`;\n      }\n    } else {\n      path += query + hash;\n    }\n    return path;\n  }\n  /**\n    @private\n  \n    Returns the current path as it should appear for HashLocation supported\n    browsers. This may very well differ from the real current path.\n  \n    @method _getHashPath\n  */\n  function getHashPath(rootURL, location) {\n    var path = rootURL;\n    var historyPath = getHistoryPath(rootURL, location);\n    var routePath = historyPath.substring(rootURL.length);\n    if (routePath !== '') {\n      if (routePath[0] !== '/') {\n        routePath = `/${routePath}`;\n      }\n      path += `#${routePath}`;\n    }\n    return path;\n  }\n});","define(\"@ember/routing/hash-location\", [\"exports\", \"@ember/object\", \"@ember/runloop\", \"@ember/routing/lib/location-utils\"], function (_exports, _object, _runloop, _locationUtils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n  @module @ember/routing/hash-location\n  */\n  /**\n    `HashLocation` implements the location API using the browser's\n    hash. At present, it relies on a `hashchange` event existing in the\n    browser.\n  \n    Using `HashLocation` results in URLs with a `#` (hash sign) separating the\n    server side URL portion of the URL from the portion that is used by Ember.\n  \n    Example:\n  \n    ```app/router.js\n    Router.map(function() {\n      this.route('posts', function() {\n        this.route('new');\n      });\n    });\n  \n    Router.reopen({\n      location: 'hash'\n    });\n    ```\n  \n    This will result in a posts.new url of `/#/posts/new`.\n  \n    @class HashLocation\n    @extends EmberObject\n    @protected\n  */\n  class HashLocation extends _object.default {\n    constructor() {\n      super(...arguments);\n      this.implementation = 'hash';\n      this.lastSetURL = null;\n    }\n    init() {\n      (0, _object.set)(this, 'location', this._location || window.location);\n      this._hashchangeHandler = undefined;\n    }\n    /**\n      @private\n         Returns normalized location.hash\n         @since 1.5.1\n      @method getHash\n    */\n    getHash() {\n      return (0, _locationUtils.getHash)(this.location);\n    }\n    /**\n      Returns the normalized URL, constructed from `location.hash`.\n         e.g. `#/foo` => `/foo` as well as `#/foo#bar` => `/foo#bar`.\n         By convention, hashed paths must begin with a forward slash, otherwise they\n      are not treated as a path so we can distinguish intent.\n         @private\n      @method getURL\n    */\n    getURL() {\n      var originalPath = this.getHash().substring(1);\n      var outPath = originalPath;\n      if (outPath[0] !== '/') {\n        outPath = '/';\n        // Only add the # if the path isn't empty.\n        // We do NOT want `/#` since the ampersand\n        // is only included (conventionally) when\n        // the location.hash has a value\n        if (originalPath) {\n          outPath += `#${originalPath}`;\n        }\n      }\n      return outPath;\n    }\n    /**\n      Set the `location.hash` and remembers what was set. This prevents\n      `onUpdateURL` callbacks from triggering when the hash was set by\n      `HashLocation`.\n         @private\n      @method setURL\n      @param path {String}\n    */\n    setURL(path) {\n      this.location.hash = path;\n      (0, _object.set)(this, 'lastSetURL', path);\n    }\n    /**\n      Uses location.replace to update the url without a page reload\n      or history modification.\n         @private\n      @method replaceURL\n      @param path {String}\n    */\n    replaceURL(path) {\n      this.location.replace(`#${path}`);\n      (0, _object.set)(this, 'lastSetURL', path);\n    }\n    /**\n      Register a callback to be invoked when the hash changes. These\n      callbacks will execute when the user presses the back or forward\n      button, but not after `setURL` is invoked.\n         @private\n      @method onUpdateURL\n      @param callback {Function}\n    */\n    onUpdateURL(callback) {\n      this._removeEventListener();\n      this._hashchangeHandler = (0, _runloop.bind)(this, function (_event) {\n        var path = this.getURL();\n        if (this.lastSetURL === path) {\n          return;\n        }\n        (0, _object.set)(this, 'lastSetURL', null);\n        callback(path);\n      });\n      window.addEventListener('hashchange', this._hashchangeHandler);\n    }\n    /**\n      Given a URL, formats it to be placed into the page as part\n      of an element's `href` attribute.\n         This is used, for example, when using the {{action}} helper\n      to generate a URL based on an event.\n         @private\n      @method formatURL\n      @param url {String}\n    */\n    formatURL(url) {\n      return `#${url}`;\n    }\n    /**\n      Cleans up the HashLocation event listener.\n         @private\n      @method willDestroy\n    */\n    willDestroy() {\n      this._removeEventListener();\n    }\n    _removeEventListener() {\n      if (this._hashchangeHandler) {\n        window.removeEventListener('hashchange', this._hashchangeHandler);\n      }\n    }\n  }\n  _exports.default = HashLocation;\n});","define(\"@ember/routing/history-location\", [\"exports\", \"@ember/object\", \"@ember/routing/lib/location-utils\"], function (_exports, _object, _locationUtils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n  @module @ember/routing/history-location\n  */\n  var popstateFired = false;\n  function _uuid() {\n    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n      var r, v;\n      r = Math.random() * 16 | 0;\n      v = c === 'x' ? r : r & 3 | 8;\n      return v.toString(16);\n    });\n  }\n  /**\n    HistoryLocation implements the location API using the browser's\n    history.pushState API.\n  \n    Using `HistoryLocation` results in URLs that are indistinguishable from a\n    standard URL. This relies upon the browser's `history` API.\n  \n    Example:\n  \n    ```app/router.js\n    Router.map(function() {\n      this.route('posts', function() {\n        this.route('new');\n      });\n    });\n  \n    Router.reopen({\n      location: 'history'\n    });\n    ```\n  \n    This will result in a posts.new url of `/posts/new`.\n  \n    Keep in mind that your server must serve the Ember app at all the routes you\n    define.\n  \n    Using `HistoryLocation` will also result in location states being recorded by\n    the browser `history` API with the following schema:\n  \n    ```\n    window.history.state -> { path: '/', uuid: '3552e730-b4a6-46bd-b8bf-d8c3c1a97e0a' }\n    ```\n  \n    This allows each in-app location state to be tracked uniquely across history\n    state changes via the `uuid` field.\n  \n    @class HistoryLocation\n    @extends EmberObject\n    @protected\n  */\n  class HistoryLocation extends _object.default {\n    constructor() {\n      super(...arguments);\n      this.implementation = 'history';\n      /**\n        Will be pre-pended to path upon state change\n               @property rootURL\n        @default '/'\n        @private\n      */\n      this.rootURL = '/';\n    }\n    /**\n      @private\n         Returns normalized location.hash\n         @method getHash\n    */\n    getHash() {\n      return (0, _locationUtils.getHash)(this.location);\n    }\n    init() {\n      var _a;\n      this._super(...arguments);\n      var base = document.querySelector('base');\n      var baseURL = '';\n      if (base !== null && base.hasAttribute('href')) {\n        baseURL = (_a = base.getAttribute('href')) !== null && _a !== void 0 ? _a : '';\n      }\n      (0, _object.set)(this, 'baseURL', baseURL);\n      (0, _object.set)(this, 'location', this.location || window.location);\n      this._popstateHandler = undefined;\n    }\n    /**\n      Used to set state on first call to setURL\n         @private\n      @method initState\n    */\n    initState() {\n      var history = this.history || window.history;\n      (0, _object.set)(this, 'history', history);\n      var {\n        state\n      } = history;\n      var path = this.formatURL(this.getURL());\n      if (state && state.path === path) {\n        // preserve existing state\n        // used for webkit workaround, since there will be no initial popstate event\n        this._previousURL = this.getURL();\n      } else {\n        this.replaceState(path);\n      }\n    }\n    /**\n      Returns the current `location.pathname` without `rootURL` or `baseURL`\n         @private\n      @method getURL\n      @return url {String}\n    */\n    getURL() {\n      var {\n        location,\n        rootURL,\n        baseURL\n      } = this;\n      var path = location.pathname;\n      // remove trailing slashes if they exists\n      rootURL = rootURL.replace(/\\/$/, '');\n      baseURL = baseURL.replace(/\\/$/, '');\n      // remove baseURL and rootURL from start of path\n      var url = path.replace(new RegExp(`^${baseURL}(?=/|$)`), '').replace(new RegExp(`^${rootURL}(?=/|$)`), '').replace(/\\/\\//g, '/'); // remove extra slashes\n      var search = location.search || '';\n      url += search + this.getHash();\n      return url;\n    }\n    /**\n      Uses `history.pushState` to update the url without a page reload.\n         @private\n      @method setURL\n      @param path {String}\n    */\n    setURL(path) {\n      var {\n        state\n      } = this.history;\n      path = this.formatURL(path);\n      if (!state || state.path !== path) {\n        this.pushState(path);\n      }\n    }\n    /**\n      Uses `history.replaceState` to update the url without a page reload\n      or history modification.\n         @private\n      @method replaceURL\n      @param path {String}\n    */\n    replaceURL(path) {\n      var {\n        state\n      } = this.history;\n      path = this.formatURL(path);\n      if (!state || state.path !== path) {\n        this.replaceState(path);\n      }\n    }\n    /**\n     Pushes a new state.\n        @private\n     @method pushState\n     @param path {String}\n    */\n    pushState(path) {\n      var state = {\n        path,\n        uuid: _uuid()\n      };\n      this.history.pushState(state, null, path);\n      // used for webkit workaround\n      this._previousURL = this.getURL();\n    }\n    /**\n     Replaces the current state.\n        @private\n     @method replaceState\n     @param path {String}\n    */\n    replaceState(path) {\n      var state = {\n        path,\n        uuid: _uuid()\n      };\n      this.history.replaceState(state, null, path);\n      // used for webkit workaround\n      this._previousURL = this.getURL();\n    }\n    /**\n      Register a callback to be invoked whenever the browser\n      history changes, including using forward and back buttons.\n         @private\n      @method onUpdateURL\n      @param callback {Function}\n    */\n    onUpdateURL(callback) {\n      this._removeEventListener();\n      this._popstateHandler = () => {\n        // Ignore initial page load popstate event in Chrome\n        if (!popstateFired) {\n          popstateFired = true;\n          if (this.getURL() === this._previousURL) {\n            return;\n          }\n        }\n        callback(this.getURL());\n      };\n      window.addEventListener('popstate', this._popstateHandler);\n    }\n    /**\n      Used when using `{{action}}` helper.  The url is always appended to the rootURL.\n         @private\n      @method formatURL\n      @param url {String}\n      @return formatted url {String}\n    */\n    formatURL(url) {\n      var {\n        rootURL,\n        baseURL\n      } = this;\n      if (url !== '') {\n        // remove trailing slashes if they exists\n        rootURL = rootURL.replace(/\\/$/, '');\n        baseURL = baseURL.replace(/\\/$/, '');\n      } else if (baseURL[0] === '/' && rootURL[0] === '/') {\n        // if baseURL and rootURL both start with a slash\n        // ... remove trailing slash from baseURL if it exists\n        baseURL = baseURL.replace(/\\/$/, '');\n      }\n      return baseURL + rootURL + url;\n    }\n    /**\n      Cleans up the HistoryLocation event listener.\n         @private\n      @method willDestroy\n    */\n    willDestroy() {\n      this._removeEventListener();\n    }\n    _removeEventListener() {\n      if (this._popstateHandler) {\n        window.removeEventListener('popstate', this._popstateHandler);\n      }\n    }\n  }\n  _exports.default = HistoryLocation;\n});","define(\"@ember/routing/index\", [\"exports\", \"@ember/-internals/glimmer\"], function (_exports, _glimmer) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"LinkTo\", {\n    enumerable: true,\n    get: function () {\n      return _glimmer.LinkTo;\n    }\n  });\n});","define(\"@ember/routing/lib/cache\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n    A two-tiered cache with support for fallback values when doing lookups.\n    Uses \"buckets\" and then \"keys\" to cache values.\n  \n    @private\n    @class BucketCache\n  */\n  class BucketCache {\n    constructor() {\n      this.cache = new Map();\n    }\n    has(bucketKey) {\n      return this.cache.has(bucketKey);\n    }\n    stash(bucketKey, key, value) {\n      var bucket = this.cache.get(bucketKey);\n      if (bucket === undefined) {\n        bucket = new Map();\n        this.cache.set(bucketKey, bucket);\n      }\n      bucket.set(key, value);\n    }\n    lookup(bucketKey, prop, defaultValue) {\n      if (!this.has(bucketKey)) {\n        return defaultValue;\n      }\n      var bucket = this.cache.get(bucketKey);\n      if (bucket.has(prop)) {\n        return bucket.get(prop);\n      } else {\n        return defaultValue;\n      }\n    }\n  }\n  _exports.default = BucketCache;\n});","define(\"@ember/routing/lib/controller_for\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = controllerFor;\n  /**\n    @module ember/routing\n  */\n  /**\n    Finds a controller instance.\n  \n    @for Ember\n    @method controllerFor\n    @private\n  */\n  function controllerFor(container, controllerName, lookupOptions) {\n    return container.lookup(`controller:${controllerName}`, lookupOptions);\n  }\n});","define(\"@ember/routing/lib/dsl\", [\"exports\", \"@ember/debug\"], function (_exports, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var uuid = 0;\n  function isCallback(value) {\n    return typeof value === 'function';\n  }\n  function isOptions(value) {\n    return value !== null && typeof value === 'object';\n  }\n  class DSLImpl {\n    constructor(name, options) {\n      if (name === void 0) {\n        name = null;\n      }\n      this.explicitIndex = false;\n      this.parent = name;\n      this.enableLoadingSubstates = Boolean(options && options.enableLoadingSubstates);\n      this.matches = [];\n      this.options = options;\n    }\n    route(name, _options, _callback) {\n      var options;\n      var callback = null;\n      var dummyErrorRoute = `/_unused_dummy_error_path_route_${name}/:error`;\n      if (isCallback(_options)) {\n        (true && !(arguments.length === 2) && (0, _debug.assert)('Unexpected arguments', arguments.length === 2));\n        options = {};\n        callback = _options;\n      } else if (isCallback(_callback)) {\n        (true && !(arguments.length === 3) && (0, _debug.assert)('Unexpected arguments', arguments.length === 3));\n        (true && !(isOptions(_options)) && (0, _debug.assert)('Unexpected arguments', isOptions(_options)));\n        options = _options;\n        callback = _callback;\n      } else {\n        options = _options || {};\n      }\n      (true && !((() => {\n        if (options.overrideNameAssertion === true) {\n          return true;\n        }\n        return ['basic', 'application'].indexOf(name) === -1;\n      })()) && (0, _debug.assert)(`'${name}' cannot be used as a route name.`, (() => {\n        if (options.overrideNameAssertion === true) {\n          return true;\n        }\n        return ['basic', 'application'].indexOf(name) === -1;\n      })()));\n      (true && !(name.indexOf(':') === -1) && (0, _debug.assert)(`'${name}' is not a valid route name. It cannot contain a ':'. You may want to use the 'path' option instead.`, name.indexOf(':') === -1));\n      if (this.enableLoadingSubstates) {\n        createRoute(this, `${name}_loading`, {\n          resetNamespace: options.resetNamespace\n        });\n        createRoute(this, `${name}_error`, {\n          resetNamespace: options.resetNamespace,\n          path: dummyErrorRoute\n        });\n      }\n      if (callback) {\n        var fullName = getFullName(this, name, options.resetNamespace);\n        var dsl = new DSLImpl(fullName, this.options);\n        createRoute(dsl, 'loading');\n        createRoute(dsl, 'error', {\n          path: dummyErrorRoute\n        });\n        callback.call(dsl);\n        createRoute(this, name, options, dsl.generate());\n      } else {\n        createRoute(this, name, options);\n      }\n    }\n    push(url, name, callback, serialize) {\n      var parts = name.split('.');\n      if (this.options.engineInfo) {\n        var localFullName = name.slice(this.options.engineInfo.fullName.length + 1);\n        var routeInfo = Object.assign({\n          localFullName\n        }, this.options.engineInfo);\n        if (serialize) {\n          routeInfo.serializeMethod = serialize;\n        }\n        this.options.addRouteForEngine(name, routeInfo);\n      } else if (serialize) {\n        throw new Error(`Defining a route serializer on route '${name}' outside an Engine is not allowed.`);\n      }\n      if (url === '' || url === '/' || parts[parts.length - 1] === 'index') {\n        this.explicitIndex = true;\n      }\n      this.matches.push(url, name, callback);\n    }\n    generate() {\n      var dslMatches = this.matches;\n      if (!this.explicitIndex) {\n        this.route('index', {\n          path: '/'\n        });\n      }\n      return match => {\n        for (var i = 0; i < dslMatches.length; i += 3) {\n          match(dslMatches[i]).to(dslMatches[i + 1], dslMatches[i + 2]);\n        }\n      };\n    }\n    mount(_name, options) {\n      if (options === void 0) {\n        options = {};\n      }\n      var engineRouteMap = this.options.resolveRouteMap(_name);\n      var name = _name;\n      if (options.as) {\n        name = options.as;\n      }\n      var fullName = getFullName(this, name, options.resetNamespace);\n      var engineInfo = {\n        name: _name,\n        instanceId: uuid++,\n        mountPoint: fullName,\n        fullName\n      };\n      var path = options.path;\n      if (typeof path !== 'string') {\n        path = `/${name}`;\n      }\n      var callback;\n      var dummyErrorRoute = `/_unused_dummy_error_path_route_${name}/:error`;\n      if (engineRouteMap) {\n        var shouldResetEngineInfo = false;\n        var oldEngineInfo = this.options.engineInfo;\n        if (oldEngineInfo) {\n          shouldResetEngineInfo = true;\n          this.options.engineInfo = engineInfo;\n        }\n        var optionsForChild = Object.assign({\n          engineInfo\n        }, this.options);\n        var childDSL = new DSLImpl(fullName, optionsForChild);\n        createRoute(childDSL, 'loading');\n        createRoute(childDSL, 'error', {\n          path: dummyErrorRoute\n        });\n        engineRouteMap.class.call(childDSL);\n        callback = childDSL.generate();\n        if (shouldResetEngineInfo) {\n          this.options.engineInfo = oldEngineInfo;\n        }\n      }\n      var localFullName = 'application';\n      var routeInfo = Object.assign({\n        localFullName\n      }, engineInfo);\n      if (this.enableLoadingSubstates) {\n        // These values are important to register the loading routes under their\n        // proper names for the Router and within the Engine's registry.\n        var substateName = `${name}_loading`;\n        var _localFullName = `application_loading`;\n        var _routeInfo = Object.assign({\n          localFullName: _localFullName\n        }, engineInfo);\n        createRoute(this, substateName, {\n          resetNamespace: options.resetNamespace\n        });\n        this.options.addRouteForEngine(substateName, _routeInfo);\n        substateName = `${name}_error`;\n        _localFullName = `application_error`;\n        _routeInfo = Object.assign({\n          localFullName: _localFullName\n        }, engineInfo);\n        createRoute(this, substateName, {\n          resetNamespace: options.resetNamespace,\n          path: dummyErrorRoute\n        });\n        this.options.addRouteForEngine(substateName, _routeInfo);\n      }\n      this.options.addRouteForEngine(fullName, routeInfo);\n      this.push(path, fullName, callback);\n    }\n  }\n  _exports.default = DSLImpl;\n  function canNest(dsl) {\n    return dsl.parent !== 'application';\n  }\n  function getFullName(dsl, name, resetNamespace) {\n    if (canNest(dsl) && resetNamespace !== true) {\n      return `${dsl.parent}.${name}`;\n    } else {\n      return name;\n    }\n  }\n  function createRoute(dsl, name, options, callback) {\n    if (options === void 0) {\n      options = {};\n    }\n    var fullName = getFullName(dsl, name, options.resetNamespace);\n    if (typeof options.path !== 'string') {\n      options.path = `/${name}`;\n    }\n    dsl.push(options.path, fullName, callback, options.serialize);\n  }\n});","define(\"@ember/routing/lib/engines\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});","define(\"@ember/routing/lib/generate_controller\", [\"exports\", \"@ember/-internals/metal\", \"@ember/controller\", \"@ember/debug\"], function (_exports, _metal, _controller, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = generateController;\n  _exports.generateControllerFactory = generateControllerFactory;\n  /**\n   @module ember/routing\n  */\n  /**\n    Generates a controller factory\n  \n    @for Ember\n    @method generateControllerFactory\n    @private\n  */\n  function generateControllerFactory(owner, controllerName) {\n    var factoryManager = owner.factoryFor('controller:basic');\n    (true && !(factoryManager !== undefined) && (0, _debug.assert)('[BUG] unexpectedly missing a factoryManager for `controller:basic`', factoryManager !== undefined)); // SAFETY: This is *not* safe, and the cast should be removed in favor of the\n    // `assert()` below after altering *tests*. It is left in this state for the\n    // moment in the interest of keeping type-only changes separate from changes\n    // to the runtime behavior of the system, even for tests.\n    var Factory = factoryManager.class;\n    // assert(\n    //   '[BUG] factory for `controller:main` is unexpectedly not a Controller',\n    //   ((factory): factory is typeof Controller => factory === Controller)(Factory)\n    // );\n    Factory = Factory.extend({\n      toString() {\n        return `(generated ${controllerName} controller)`;\n      }\n    });\n    var fullName = `controller:${controllerName}`;\n    owner.register(fullName, Factory);\n    return owner.factoryFor(fullName);\n  }\n  /**\n    Generates and instantiates a controller extending from `controller:basic`\n    if present, or `Controller` if not.\n  \n    @for Ember\n    @method generateController\n    @private\n    @since 1.3.0\n  */\n  function generateController(owner, controllerName) {\n    generateControllerFactory(owner, controllerName);\n    var fullName = `controller:${controllerName}`;\n    var instance = owner.lookup(fullName);\n    (true && !(instance instanceof _controller.default) && (0, _debug.assert)('Expected an instance of controller', instance instanceof _controller.default));\n    if (true /* DEBUG */) {\n      if ((0, _metal.get)(instance, 'namespace.LOG_ACTIVE_GENERATION')) {\n        (0, _debug.info)(`generated -> ${fullName}`, {\n          fullName\n        });\n      }\n    }\n    return instance;\n  }\n});","define(\"@ember/routing/lib/location-utils\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.getFullPath = getFullPath;\n  _exports.getHash = getHash;\n  _exports.getOrigin = getOrigin;\n  _exports.getPath = getPath;\n  _exports.getQuery = getQuery;\n  _exports.replacePath = replacePath;\n  _exports.supportsHashChange = supportsHashChange;\n  _exports.supportsHistory = supportsHistory;\n  /**\n    @private\n  \n    Returns the current `location.pathname`, normalized for IE inconsistencies.\n  */\n  function getPath(location) {\n    var pathname = location.pathname;\n    // Various versions of IE/Opera don't always return a leading slash\n    if (pathname[0] !== '/') {\n      pathname = `/${pathname}`;\n    }\n    return pathname;\n  }\n  /**\n    @private\n  \n    Returns the current `location.search`.\n  */\n  function getQuery(location) {\n    return location.search;\n  }\n  /**\n    @private\n  \n    Returns the hash or empty string\n  */\n  function getHash(location) {\n    if (location.hash !== undefined) {\n      return location.hash.substring(0);\n    }\n    return '';\n  }\n  function getFullPath(location) {\n    return getPath(location) + getQuery(location) + getHash(location);\n  }\n  function getOrigin(location) {\n    var origin = location.origin;\n    // Older browsers, especially IE, don't have origin\n    if (!origin) {\n      origin = `${location.protocol}//${location.hostname}`;\n      if (location.port) {\n        origin += `:${location.port}`;\n      }\n    }\n    return origin;\n  }\n  /*\n    `documentMode` only exist in Internet Explorer, and it's tested because IE8 running in\n    IE7 compatibility mode claims to support `onhashchange` but actually does not.\n  \n    `global` is an object that may have an `onhashchange` property.\n  \n    @private\n    @function supportsHashChange\n  */\n  function supportsHashChange(documentMode, global) {\n    return Boolean(global && 'onhashchange' in global && (documentMode === undefined || documentMode > 7));\n  }\n  /*\n    `userAgent` is a user agent string. We use user agent testing here, because\n    the stock Android browser is known to have buggy versions of the History API,\n    in some Android versions.\n  \n    @private\n    @function supportsHistory\n  */\n  function supportsHistory(userAgent, history) {\n    // Boosted from Modernizr: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js\n    // The stock browser on Android 2.2 & 2.3, and 4.0.x returns positive on history support\n    // Unfortunately support is really buggy and there is no clean way to detect\n    // these bugs, so we fall back to a user agent sniff :(\n    // We only want Android 2 and 4.0, stock browser, and not Chrome which identifies\n    // itself as 'Mobile Safari' as well, nor Windows Phone.\n    if ((userAgent.indexOf('Android 2.') !== -1 || userAgent.indexOf('Android 4.0') !== -1) && userAgent.indexOf('Mobile Safari') !== -1 && userAgent.indexOf('Chrome') === -1 && userAgent.indexOf('Windows Phone') === -1) {\n      return false;\n    }\n    return Boolean(history && 'pushState' in history);\n  }\n  /**\n    Replaces the current location, making sure we explicitly include the origin\n    to prevent redirecting to a different origin.\n  \n    @private\n  */\n  function replacePath(location, path) {\n    location.replace(getOrigin(location) + path);\n  }\n});","define(\"@ember/routing/lib/query_params\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class QueryParams {\n    constructor(values) {\n      if (values === void 0) {\n        values = null;\n      }\n      this.isQueryParams = true;\n      this.values = values;\n    }\n  }\n  _exports.default = QueryParams;\n});","define(\"@ember/routing/lib/route-info\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});","define(\"@ember/routing/lib/router_state\", [\"exports\", \"@ember/routing/lib/utils\"], function (_exports, _utils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class RouterState {\n    constructor(emberRouter, router, routerJsState) {\n      this.emberRouter = emberRouter;\n      this.router = router;\n      this.routerJsState = routerJsState;\n    }\n    isActiveIntent(routeName, models, queryParams) {\n      var state = this.routerJsState;\n      if (!this.router.isActiveIntent(routeName, models, undefined, state)) {\n        return false;\n      }\n      if (queryParams !== undefined && Object.keys(queryParams).length > 0) {\n        var visibleQueryParams = Object.assign({}, queryParams);\n        this.emberRouter._prepareQueryParams(routeName, models, visibleQueryParams);\n        return (0, _utils.shallowEqual)(visibleQueryParams, state.queryParams);\n      }\n      return true;\n    }\n  }\n  _exports.default = RouterState;\n});","define(\"@ember/routing/lib/routing-service\", [\"exports\", \"@ember/-internals/owner\", \"@ember/debug\", \"@ember/object/computed\", \"@ember/service\", \"@ember/routing/router\", \"@ember/routing/router-service\"], function (_exports, _owner, _debug, _computed, _service, _router2, _routerService) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n  @module ember\n  */\n\n  /**\n    The Routing service is used by LinkTo, and provides facilities for\n    the component/view layer to interact with the router.\n  \n    This is a private service for internal usage only. For public usage,\n    refer to the `Router` service.\n  \n    @private\n    @class RoutingService\n  */\n  class RoutingService extends _service.default {\n    get router() {\n      var router = this[_routerService.ROUTER];\n      if (router !== undefined) {\n        return router;\n      }\n      var owner = (0, _owner.getOwner)(this);\n      (true && !(owner) && (0, _debug.assert)('RoutingService is unexpectedly missing an owner', owner));\n      var _router = owner.lookup('router:main');\n      (true && !(_router instanceof _router2.default) && (0, _debug.assert)('ROUTING SERVICE BUG: Expected router to be an instance of EmberRouter', _router instanceof _router2.default));\n      _router.setupRouter();\n      return this[_routerService.ROUTER] = _router;\n    }\n    hasRoute(routeName) {\n      return this.router.hasRoute(routeName);\n    }\n    transitionTo(routeName, models, queryParams, shouldReplace) {\n      var transition = this.router._doTransition(routeName, models, queryParams);\n      if (shouldReplace) {\n        transition.method('replace');\n      }\n      return transition;\n    }\n    normalizeQueryParams(routeName, models, queryParams) {\n      this.router._prepareQueryParams(routeName, models, queryParams);\n    }\n    _generateURL(routeName, models, queryParams) {\n      var visibleQueryParams = {};\n      if (queryParams) {\n        Object.assign(visibleQueryParams, queryParams);\n        this.normalizeQueryParams(routeName, models, visibleQueryParams);\n      }\n      return this.router.generate(routeName, ...models, {\n        queryParams: visibleQueryParams\n      });\n    }\n    generateURL(routeName, models, queryParams) {\n      if (this.router._initialTransitionStarted) {\n        return this._generateURL(routeName, models, queryParams);\n      } else {\n        // Swallow error when transition has not started.\n        // When rendering in tests without visit(), we cannot infer the route context which <LinkTo/> needs be aware of\n        try {\n          return this._generateURL(routeName, models, queryParams);\n        } catch (_e) {\n          return;\n        }\n      }\n    }\n    isActiveForRoute(contexts, queryParams, routeName, routerState) {\n      var handlers = this.router._routerMicrolib.recognizer.handlersFor(routeName);\n      var leafName = handlers[handlers.length - 1].handler;\n      var maximumContexts = numberOfContextsAcceptedByHandler(routeName, handlers);\n      // NOTE: any ugliness in the calculation of activeness is largely\n      // due to the fact that we support automatic normalizing of\n      // `resource` -> `resource.index`, even though there might be\n      // dynamic segments / query params defined on `resource.index`\n      // which complicates (and makes somewhat ambiguous) the calculation\n      // of activeness for links that link to `resource` instead of\n      // directly to `resource.index`.\n      // if we don't have enough contexts revert back to full route name\n      // this is because the leaf route will use one of the contexts\n      if (contexts.length > maximumContexts) {\n        routeName = leafName;\n      }\n      return routerState.isActiveIntent(routeName, contexts, queryParams);\n    }\n  }\n  _exports.default = RoutingService;\n  RoutingService.reopen({\n    targetState: (0, _computed.readOnly)('router.targetState'),\n    currentState: (0, _computed.readOnly)('router.currentState'),\n    currentRouteName: (0, _computed.readOnly)('router.currentRouteName'),\n    currentPath: (0, _computed.readOnly)('router.currentPath')\n  });\n  function numberOfContextsAcceptedByHandler(handlerName, handlerInfos) {\n    var req = 0;\n    for (var i = 0; i < handlerInfos.length; i++) {\n      req += handlerInfos[i].names.length;\n      if (handlerInfos[i].handler === handlerName) {\n        break;\n      }\n    }\n    return req;\n  }\n});","define(\"@ember/routing/lib/utils\", [\"exports\", \"@ember/-internals/metal\", \"@ember/-internals/owner\", \"@ember/debug\", \"@ember/engine/instance\", \"router_js\"], function (_exports, _metal, _owner, _debug, _instance, _router_js) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.calculateCacheKey = calculateCacheKey;\n  _exports.deprecateTransitionMethods = deprecateTransitionMethods;\n  _exports.extractRouteArgs = extractRouteArgs;\n  _exports.getActiveTargetName = getActiveTargetName;\n  _exports.normalizeControllerQueryParams = normalizeControllerQueryParams;\n  _exports.prefixRouteNameArg = prefixRouteNameArg;\n  _exports.resemblesURL = resemblesURL;\n  _exports.shallowEqual = shallowEqual;\n  _exports.stashParamNames = stashParamNames;\n  var ALL_PERIODS_REGEX = /\\./g;\n  function extractRouteArgs(args) {\n    // SAFETY: This should just be the same thing\n    args = args.slice();\n    var possibleOptions = args[args.length - 1];\n    var queryParams;\n    if (isRouteOptions(possibleOptions)) {\n      args.pop(); // Remove options\n      queryParams = possibleOptions.queryParams;\n    } else {\n      queryParams = {};\n    }\n    var routeName;\n    if (typeof args[0] === 'string') {\n      routeName = args.shift();\n      // We just checked this!\n      (true && !(typeof routeName === 'string') && (0, _debug.assert)('routeName is a string', typeof routeName === 'string'));\n    }\n    // SAFTEY: We removed the name and options if they existed, only models left.\n    var models = args;\n    return {\n      routeName,\n      models,\n      queryParams\n    };\n  }\n  function getActiveTargetName(router) {\n    var routeInfos = router.activeTransition ? router.activeTransition[_router_js.STATE_SYMBOL].routeInfos : router.state.routeInfos;\n    var lastRouteInfo = routeInfos[routeInfos.length - 1];\n    (true && !(lastRouteInfo) && (0, _debug.assert)('has last route info', lastRouteInfo));\n    return lastRouteInfo.name;\n  }\n  function stashParamNames(router, routeInfos) {\n    if (routeInfos['_namesStashed']) {\n      return;\n    }\n    // This helper exists because router.js/route-recognizer.js awkwardly\n    // keeps separate a routeInfo's list of parameter names depending\n    // on whether a URL transition or named transition is happening.\n    // Hopefully we can remove this in the future.\n    var routeInfo = routeInfos[routeInfos.length - 1];\n    (true && !(routeInfo) && (0, _debug.assert)('has route info', routeInfo));\n    var targetRouteName = routeInfo.name;\n    var recogHandlers = router._routerMicrolib.recognizer.handlersFor(targetRouteName);\n    var dynamicParent;\n    for (var i = 0; i < routeInfos.length; ++i) {\n      var _routeInfo = routeInfos[i];\n      (true && !(_routeInfo) && (0, _debug.assert)('has route info', _routeInfo));\n      var names = recogHandlers[i].names;\n      if (names.length) {\n        dynamicParent = _routeInfo;\n      }\n      _routeInfo['_names'] = names;\n      var route = _routeInfo.route;\n      // SAFETY: This cast should be idential. I don't understand why it is needed.\n      route._stashNames(_routeInfo, dynamicParent);\n    }\n    routeInfos['_namesStashed'] = true;\n  }\n  function _calculateCacheValuePrefix(prefix, part) {\n    // calculates the dot separated sections from prefix that are also\n    // at the start of part - which gives us the route name\n    // given : prefix = site.article.comments, part = site.article.id\n    //      - returns: site.article (use get(values[site.article], 'id') to get the dynamic part - used below)\n    // given : prefix = site.article, part = site.article.id\n    //      - returns: site.article. (use get(values[site.article], 'id') to get the dynamic part - used below)\n    var prefixParts = prefix.split('.');\n    var currPrefix = '';\n    for (var i = 0; i < prefixParts.length; i++) {\n      var currPart = prefixParts.slice(0, i + 1).join('.');\n      if (part.indexOf(currPart) !== 0) {\n        break;\n      }\n      currPrefix = currPart;\n    }\n    return currPrefix;\n  }\n  /*\n    Stolen from Controller\n  */\n  function calculateCacheKey(prefix, parts, values) {\n    if (parts === void 0) {\n      parts = [];\n    }\n    var suffixes = '';\n    for (var part of parts) {\n      var cacheValuePrefix = _calculateCacheValuePrefix(prefix, part);\n      var value = void 0;\n      if (values) {\n        if (cacheValuePrefix && cacheValuePrefix in values) {\n          var partRemovedPrefix = part.indexOf(cacheValuePrefix) === 0 ? part.substring(cacheValuePrefix.length + 1) : part;\n          value = (0, _metal.get)(values[cacheValuePrefix], partRemovedPrefix);\n        } else {\n          value = (0, _metal.get)(values, part);\n        }\n      }\n      suffixes += `::${part}:${value}`;\n    }\n    return prefix + suffixes.replace(ALL_PERIODS_REGEX, '-');\n  }\n  /*\n    Controller-defined query parameters can come in three shapes:\n  \n    Array\n      queryParams: ['foo', 'bar']\n    Array of simple objects where value is an alias\n      queryParams: [\n        {\n          'foo': 'rename_foo_to_this'\n        },\n        {\n          'bar': 'call_bar_this_instead'\n        }\n      ]\n    Array of fully defined objects\n      queryParams: [\n        {\n          'foo': {\n            as: 'rename_foo_to_this'\n          },\n        }\n        {\n          'bar': {\n            as: 'call_bar_this_instead',\n            scope: 'controller'\n          }\n        }\n      ]\n  \n    This helper normalizes all three possible styles into the\n    'Array of fully defined objects' style.\n  */\n  function normalizeControllerQueryParams(queryParams) {\n    var qpMap = {};\n    for (var queryParam of queryParams) {\n      accumulateQueryParamDescriptors(queryParam, qpMap);\n    }\n    return qpMap;\n  }\n  function accumulateQueryParamDescriptors(_desc, accum) {\n    var desc = typeof _desc === 'string' ? {\n      [_desc]: {\n        as: null\n      }\n    } : _desc;\n    for (var key in desc) {\n      if (!Object.prototype.hasOwnProperty.call(desc, key)) {\n        return;\n      }\n      var _singleDesc = desc[key];\n      var singleDesc = typeof _singleDesc === 'string' ? {\n        as: _singleDesc\n      } : _singleDesc;\n      var partialVal = accum[key] || {\n        as: null,\n        scope: 'model'\n      };\n      var val = Object.assign(Object.assign({}, partialVal), singleDesc);\n      accum[key] = val;\n    }\n  }\n  /*\n    Check if a routeName resembles a url instead\n  \n    @private\n  */\n  function resemblesURL(str) {\n    return typeof str === 'string' && (str === '' || str[0] === '/');\n  }\n  /*\n    Returns an arguments array where the route name arg is prefixed based on the mount point\n  \n    @private\n  */\n  function prefixRouteNameArg(route, args) {\n    var routeName;\n    var owner = (0, _owner.getOwner)(route);\n    (true && !(owner instanceof _instance.default) && (0, _debug.assert)('Expected route to have EngineInstance as owner', owner instanceof _instance.default));\n    var prefix = owner.mountPoint;\n    // only alter the routeName if it's actually referencing a route.\n    if (owner.routable && typeof args[0] === 'string') {\n      routeName = args[0];\n      if (resemblesURL(routeName)) {\n        throw new Error('Programmatic transitions by URL cannot be used within an Engine. Please use the route name instead.');\n      } else {\n        routeName = `${prefix}.${routeName}`;\n        args[0] = routeName;\n      }\n    }\n    return args;\n  }\n  function shallowEqual(a, b) {\n    var aCount = 0;\n    var bCount = 0;\n    for (var kA in a) {\n      if (Object.prototype.hasOwnProperty.call(a, kA)) {\n        if (a[kA] !== b[kA]) {\n          return false;\n        }\n        aCount++;\n      }\n    }\n    for (var kB in b) {\n      if (Object.prototype.hasOwnProperty.call(b, kB)) {\n        bCount++;\n      }\n    }\n    return aCount === bCount;\n  }\n  function deprecateTransitionMethods(frameworkClass, methodName) {\n    (true && !(false) && (0, _debug.deprecate)(`Calling ${methodName} on a ${frameworkClass} is deprecated. Use the RouterService instead.`, false, {\n      id: 'routing.transition-methods',\n      for: 'ember-source',\n      since: {\n        available: '3.26.0',\n        enabled: '3.26.0'\n      },\n      until: '5.0.0',\n      url: 'https://deprecations.emberjs.com/v3.x/#toc_routing-transition-methods'\n    }));\n  }\n  function isRouteOptions(value) {\n    if (value && typeof value === 'object') {\n      var qps = value.queryParams;\n      if (qps && typeof qps === 'object') {\n        return Object.keys(qps).every(k => typeof k === 'string');\n      }\n    }\n    return false;\n  }\n});","define(\"@ember/routing/location\", [\"exports\", \"@ember/debug\"], function (_exports, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n  @module @ember/routing/location\n  */\n  /**\n    Location returns an instance of the correct implementation of\n    the `location` API.\n  \n    ## Implementations\n  \n    You can pass an implementation name (`hash`, `history`, `none`, `auto`) to force a\n    particular implementation to be used in your application.\n  \n    See [HashLocation](/ember/release/classes/HashLocation).\n    See [HistoryLocation](/ember/release/classes/HistoryLocation).\n    See [NoneLocation](/ember/release/classes/NoneLocation).\n    See [AutoLocation](/ember/release/classes/AutoLocation).\n  \n    ## Location API\n  \n    Each location implementation must provide the following methods:\n  \n    * implementation: returns the string name used to reference the implementation.\n    * getURL: returns the current URL.\n    * setURL(path): sets the current URL.\n    * replaceURL(path): replace the current URL (optional).\n    * onUpdateURL(callback): triggers the callback when the URL changes.\n    * formatURL(url): formats `url` to be placed into `href` attribute.\n    * detect() (optional): instructs the location to do any feature detection\n        necessary. If the location needs to redirect to a different URL, it\n        can cancel routing by setting the `cancelRouterSetup` property on itself\n        to `false`.\n  \n    Calling setURL or replaceURL will not trigger onUpdateURL callbacks.\n  \n    ## Custom implementation\n  \n    Ember scans `app/locations/*` for extending the Location API.\n  \n    Example:\n  \n    ```javascript\n    import HistoryLocation from '@ember/routing/history-location';\n  \n    export default class MyHistory {\n      implementation = 'my-custom-history';\n  \n      constructor() {\n        this._history = HistoryLocation.create(...arguments);\n      }\n  \n      create() {\n        return new this(...arguments);\n      }\n  \n      pushState(path) {\n         this._history.pushState(path);\n      }\n    }\n    ```\n  \n    @class Location\n    @private\n  */\n  var _default = {\n    /**\n     This is deprecated in favor of using the container to lookup the location\n     implementation as desired.\n        For example:\n        ```javascript\n     // Given a location registered as follows:\n     container.register('location:history-test', HistoryTestLocation);\n        // You could create a new instance via:\n     container.lookup('location:history-test');\n     ```\n         @method create\n      @param {Object} options\n      @return {Object} an instance of an implementation of the `location` API\n      @deprecated Use the container to lookup the location implementation that you\n      need.\n      @private\n    */\n    create(options) {\n      var implementation = options === null || options === void 0 ? void 0 : options.implementation;\n      (true && !(implementation) && (0, _debug.assert)(\"Location.create: you must specify a 'implementation' option\", implementation));\n      var implementationClass = this.implementations[implementation];\n      (true && !(implementationClass) && (0, _debug.assert)(`Location.create: ${implementation} is not a valid implementation`, implementationClass));\n      (true && !(false) && (0, _debug.deprecate)(\"Calling `create` on Location class is deprecated. Instead, use `container.lookup('location:my-location')` to lookup the location you need.\", false, {\n        id: 'deprecate-auto-location',\n        until: '5.0.0',\n        url: 'https://emberjs.com/deprecations/v4.x#toc_deprecate-auto-location',\n        for: 'ember-source',\n        since: {\n          available: '4.1.0',\n          enabled: '4.1.0'\n        }\n      }));\n      return implementationClass.create(...arguments);\n    },\n    implementations: {}\n  };\n  _exports.default = _default;\n});","define(\"@ember/routing/none-location\", [\"exports\", \"@ember/object\", \"@ember/debug\"], function (_exports, _object, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n  @module @ember/routing/none-location\n  */\n  /**\n    NoneLocation does not interact with the browser. It is useful for\n    testing, or when you need to manage state with your Router, but temporarily\n    don't want it to muck with the URL (for example when you embed your\n    application in a larger page).\n  \n    Using `NoneLocation` causes Ember to not store the applications URL state\n    in the actual URL. This is generally used for testing purposes, and is one\n    of the changes made when calling `App.setupForTesting()`.\n  \n    @class NoneLocation\n    @extends EmberObject\n    @protected\n  */\n  class NoneLocation extends _object.default {\n    constructor() {\n      super(...arguments);\n      this.implementation = 'none';\n    }\n    initState() {\n      this._super(...arguments);\n      var {\n        rootURL\n      } = this;\n      // This assert doesn't have anything to do with state initialization,\n      // but we're hijacking this method since it's called after the route has\n      // set the rootURL property on its Location instance.\n      (true && !(rootURL.charAt(rootURL.length - 1) === '/') && (0, _debug.assert)('rootURL must end with a trailing forward slash e.g. \"/app/\"', rootURL.charAt(rootURL.length - 1) === '/'));\n    }\n    /**\n      Returns the current path without `rootURL`.\n         @private\n      @method getURL\n      @return {String} path\n    */\n    getURL() {\n      var {\n        path,\n        rootURL\n      } = this;\n      // remove trailing slashes if they exists\n      rootURL = rootURL.replace(/\\/$/, '');\n      // remove rootURL from url\n      return path.replace(new RegExp(`^${rootURL}(?=/|$)`), '');\n    }\n    /**\n      Set the path and remembers what was set. Using this method\n      to change the path will not invoke the `updateURL` callback.\n         @private\n      @method setURL\n      @param path {String}\n    */\n    setURL(path) {\n      (0, _object.set)(this, 'path', path);\n    }\n    /**\n      Register a callback to be invoked when the path changes. These\n      callbacks will execute when the user presses the back or forward\n      button, but not after `setURL` is invoked.\n         @private\n      @method onUpdateURL\n      @param callback {Function}\n    */\n    onUpdateURL(callback) {\n      this.updateCallback = callback;\n    }\n    /**\n      Sets the path and calls the `updateURL` callback.\n         @private\n      @method handleURL\n      @param url {String}\n    */\n    handleURL(url) {\n      (0, _object.set)(this, 'path', url);\n      this.updateCallback(url);\n    }\n    /**\n      Given a URL, formats it to be placed into the page as part\n      of an element's `href` attribute.\n         This is used, for example, when using the {{action}} helper\n      to generate a URL based on an event.\n         @private\n      @method formatURL\n      @param url {String}\n      @return {String} url\n    */\n    formatURL(url) {\n      var {\n        rootURL\n      } = this;\n      if (url !== '') {\n        // remove trailing slashes if they exists\n        rootURL = rootURL.replace(/\\/$/, '');\n      }\n      return rootURL + url;\n    }\n  }\n  _exports.default = NoneLocation;\n  NoneLocation.reopen({\n    path: '',\n    rootURL: '/'\n  });\n});","define(\"@ember/routing/route-info\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});","define(\"@ember/routing/route\", [\"exports\", \"@ember/-internals/container\", \"@ember/-internals/metal\", \"@ember/-internals/owner\", \"@ember/routing/-internals\", \"@ember/object\", \"@ember/object/evented\", \"@ember/array\", \"@ember/-internals/runtime\", \"@ember/utils\", \"@ember/-internals/utils\", \"@ember/controller\", \"@ember/debug\", \"@ember/engine/instance\", \"@ember/object/compat\", \"@ember/runloop\", \"router_js\", \"@ember/routing/router\", \"@ember/routing/lib/utils\"], function (_exports, _container, _metal, _owner, _internals, _object, _evented, _array, _runtime, _utils, _utils2, _controller2, _debug, _instance, _compat, _runloop, _router_js, _router, _utils3) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.defaultSerialize = _exports.default = _exports.ROUTE_CONNECTIONS = void 0;\n  _exports.getFullQueryParams = getFullQueryParams;\n  _exports.hasDefaultSerialize = hasDefaultSerialize;\n  var __decorate = void 0 && (void 0).__decorate || function (decorators, target, key, desc) {\n    var c = arguments.length,\n      r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n      d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) {\n      if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    }\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n  };\n  var ROUTE_CONNECTIONS = new WeakMap();\n  _exports.ROUTE_CONNECTIONS = ROUTE_CONNECTIONS;\n  var RENDER = Symbol('render');\n  class Route extends _object.default.extend(_runtime.ActionHandler, _evented.default) {\n    constructor(owner) {\n      super(owner);\n      this.context = {};\n      if (owner) {\n        var router = owner.lookup('router:main');\n        var bucketCache = owner.lookup((0, _container.privatize)`-bucket-cache:main`);\n        (true && !(router instanceof _router.default && bucketCache instanceof _internals.BucketCache) && (0, _debug.assert)('ROUTER BUG: Expected route injections to be defined on the route. This is an internal bug, please open an issue on Github if you see this message!', router instanceof _router.default && bucketCache instanceof _internals.BucketCache));\n        this._router = router;\n        this._bucketCache = bucketCache;\n        this._topLevelViewTemplate = owner.lookup('template:-outlet');\n        this._environment = owner.lookup('-environment:main');\n      }\n    }\n    /**\n      A hook you can implement to convert the route's model into parameters\n      for the URL.\n         ```app/router.js\n      // ...\n         Router.map(function() {\n        this.route('post', { path: '/posts/:post_id' });\n      });\n         ```\n         ```app/routes/post.js\n      import Route from '@ember/routing/route';\n         export default class PostRoute extends Route {\n        model({ post_id }) {\n          // the server returns `{ id: 12 }`\n          return fetch(`/posts/${post_id}`;\n        }\n           serialize(model) {\n          // this will make the URL `/posts/12`\n          return { post_id: model.id };\n        }\n      }\n      ```\n         The default `serialize` method will insert the model's `id` into the\n      route's dynamic segment (in this case, `:post_id`) if the segment contains '_id'.\n      If the route has multiple dynamic segments or does not contain '_id', `serialize`\n      will return `getProperties(model, params)`\n         This method is called when `transitionTo` is called with a context\n      in order to populate the URL.\n         @method serialize\n      @param {Object} model the routes model\n      @param {Array} params an Array of parameter names for the current\n        route (in the example, `['post_id']`.\n      @return {Object} the serialized parameters\n      @since 1.0.0\n      @public\n    */\n    serialize(model, params) {\n      if (params.length < 1 || !model) {\n        return;\n      }\n      var object = {};\n      if (params.length === 1) {\n        var [name] = params;\n        (true && !(name) && (0, _debug.assert)('has name', name));\n        if (typeof model === 'object' && name in model) {\n          object[name] = (0, _object.get)(model, name);\n        } else if (/_id$/.test(name)) {\n          object[name] = (0, _object.get)(model, 'id');\n        } else if ((0, _utils2.isProxy)(model)) {\n          object[name] = (0, _object.get)(model, name);\n        }\n      } else {\n        object = (0, _object.getProperties)(model, params);\n      }\n      return object;\n    }\n    /**\n      Sets the name for this route, including a fully resolved name for routes\n      inside engines.\n         @private\n      @method _setRouteName\n      @param {String} name\n    */\n    _setRouteName(name) {\n      this.routeName = name;\n      var owner = (0, _owner.getOwner)(this);\n      (true && !(owner instanceof _instance.default) && (0, _debug.assert)('Expected route to have EngineInstance as owner', owner instanceof _instance.default));\n      this.fullRouteName = getEngineRouteName(owner, name);\n    }\n    /**\n      @private\n         @method _stashNames\n    */\n    _stashNames(routeInfo, dynamicParent) {\n      if (this._names) {\n        return;\n      }\n      var names = this._names = routeInfo['_names'];\n      if (!names.length) {\n        routeInfo = dynamicParent;\n        names = routeInfo && routeInfo['_names'] || [];\n      }\n      // SAFETY: Since `_qp` is protected we can't infer the type\n      var qps = (0, _object.get)(this, '_qp').qps;\n      var namePaths = new Array(names.length);\n      for (var a = 0; a < names.length; ++a) {\n        namePaths[a] = `${routeInfo.name}.${names[a]}`;\n      }\n      for (var qp of qps) {\n        if (qp.scope === 'model') {\n          qp.parts = namePaths;\n        }\n      }\n    }\n    /**\n      @private\n         @property _activeQPChanged\n    */\n    _activeQPChanged(qp, value) {\n      this._router._activeQPChanged(qp.scopedPropertyName, value);\n    }\n    /**\n      @private\n      @method _updatingQPChanged\n    */\n    _updatingQPChanged(qp) {\n      this._router._updatingQPChanged(qp.urlKey);\n    }\n    /**\n      Returns a hash containing the parameters of an ancestor route.\n         You may notice that `this.paramsFor` sometimes works when referring to a\n      child route, but this behavior should not be relied upon as only ancestor\n      routes are certain to be loaded in time.\n         Example\n         ```app/router.js\n      // ...\n         Router.map(function() {\n        this.route('member', { path: ':name' }, function() {\n          this.route('interest', { path: ':interest' });\n        });\n      });\n      ```\n         ```app/routes/member.js\n      import Route from '@ember/routing/route';\n         export default class MemberRoute extends Route {\n        queryParams = {\n          memberQp: { refreshModel: true }\n        }\n      }\n      ```\n         ```app/routes/member/interest.js\n      import Route from '@ember/routing/route';\n         export default class MemberInterestRoute extends Route {\n        queryParams = {\n          interestQp: { refreshModel: true }\n        }\n           model() {\n          return this.paramsFor('member');\n        }\n      }\n      ```\n         If we visit `/turing/maths?memberQp=member&interestQp=interest` the model for\n      the `member.interest` route is a hash with:\n         * `name`: `turing`\n      * `memberQp`: `member`\n         @method paramsFor\n      @param {String} name\n      @return {Object} hash containing the parameters of the route `name`\n      @since 1.4.0\n      @public\n    */\n    paramsFor(name) {\n      var owner = (0, _owner.getOwner)(this);\n      (true && !(owner) && (0, _debug.assert)('Route is unexpectedly missing an owner', owner));\n      var route = owner.lookup(`route:${name}`);\n      if (route === undefined) {\n        return {};\n      }\n      var transition = this._router._routerMicrolib.activeTransition;\n      var state = transition ? transition[_router_js.STATE_SYMBOL] : this._router._routerMicrolib.state;\n      var fullName = route.fullRouteName;\n      var params = Object.assign({}, state.params[fullName]);\n      var queryParams = getQueryParamsFor(route, state);\n      return Object.entries(queryParams).reduce((params, _ref) => {\n        var [key, value] = _ref;\n        (true && !(!params[key]) && (0, _debug.assert)(`The route '${this.routeName}' has both a dynamic segment and query param with name '${key}'. Please rename one to avoid collisions.`, !params[key]));\n        params[key] = value;\n        return params;\n      }, params);\n    }\n    /**\n      Serializes the query parameter key\n         @method serializeQueryParamKey\n      @param {String} controllerPropertyName\n      @private\n    */\n    serializeQueryParamKey(controllerPropertyName) {\n      return controllerPropertyName;\n    }\n    /**\n      Serializes value of the query parameter based on defaultValueType\n         @method serializeQueryParam\n      @param {Object} value\n      @param {String} urlKey\n      @param {String} defaultValueType\n      @private\n    */\n    serializeQueryParam(value, _urlKey, defaultValueType) {\n      // urlKey isn't used here, but anyone overriding\n      // can use it to provide serialization specific\n      // to a certain query param.\n      return this._router._serializeQueryParam(value, defaultValueType);\n    }\n    /**\n      Deserializes value of the query parameter based on defaultValueType\n         @method deserializeQueryParam\n      @param {Object} value\n      @param {String} urlKey\n      @param {String} defaultValueType\n      @private\n    */\n    deserializeQueryParam(value, _urlKey, defaultValueType) {\n      // urlKey isn't used here, but anyone overriding\n      // can use it to provide deserialization specific\n      // to a certain query param.\n      return this._router._deserializeQueryParam(value, defaultValueType);\n    }\n    /**\n      @private\n         @property _optionsForQueryParam\n    */\n    _optionsForQueryParam(qp) {\n      var queryParams = (0, _object.get)(this, 'queryParams');\n      return (0, _object.get)(queryParams, qp.urlKey) || (0, _object.get)(queryParams, qp.prop) || queryParams[qp.urlKey] || queryParams[qp.prop] || {};\n    }\n    /**\n      A hook you can use to reset controller values either when the model\n      changes or the route is exiting.\n         ```app/routes/articles.js\n      import Route from '@ember/routing/route';\n         export default class ArticlesRoute extends Route {\n        resetController(controller, isExiting, transition) {\n          if (isExiting && transition.targetName !== 'error') {\n            controller.set('page', 1);\n          }\n        }\n      }\n      ```\n         @method resetController\n      @param {Controller} controller instance\n      @param {Boolean} isExiting\n      @param {Object} transition\n      @since 1.7.0\n      @public\n    */\n    resetController(_controller, _isExiting, _transition) {\n      return this;\n    }\n    /**\n      @private\n         @method exit\n    */\n    exit(transition) {\n      this.deactivate(transition);\n      this.trigger('deactivate', transition);\n      this.teardownViews();\n    }\n    /**\n      @private\n         @method _internalReset\n      @since 3.6.0\n    */\n    _internalReset(isExiting, transition) {\n      var controller = this.controller;\n      // SAFETY: Since `_qp` is protected we can't infer the type\n      controller['_qpDelegate'] = (0, _object.get)(this, '_qp').states.inactive;\n      this.resetController(controller, isExiting, transition);\n    }\n    /**\n      @private\n         @method enter\n    */\n    enter(transition) {\n      ROUTE_CONNECTIONS.set(this, []);\n      this.activate(transition);\n      this.trigger('activate', transition);\n    }\n    /**\n      This event is triggered when the router enters the route. It is\n      not executed when the model for the route changes.\n         ```app/routes/application.js\n      import { on } from '@ember/object/evented';\n      import Route from '@ember/routing/route';\n         export default Route.extend({\n        collectAnalytics: on('activate', function(){\n          collectAnalytics();\n        })\n      });\n      ```\n         @event activate\n      @since 1.9.0\n      @public\n    */\n    /**\n      This event is triggered when the router completely exits this\n      route. It is not executed when the model for the route changes.\n         ```app/routes/index.js\n      import { on } from '@ember/object/evented';\n      import Route from '@ember/routing/route';\n         export default Route.extend({\n        trackPageLeaveAnalytics: on('deactivate', function(){\n          trackPageLeaveAnalytics();\n        })\n      });\n      ```\n         @event deactivate\n      @since 1.9.0\n      @public\n    */\n    /**\n      This hook is executed when the router completely exits this route. It is\n      not executed when the model for the route changes.\n         @method deactivate\n      @param {Transition} transition\n      @since 1.0.0\n      @public\n    */\n    deactivate(_transition) {}\n    /**\n      This hook is executed when the router enters the route. It is not executed\n      when the model for the route changes.\n         @method activate\n      @param {Transition} transition\n      @since 1.0.0\n      @public\n    */\n    activate(_transition) {}\n    /**\n      Transition the application into another route. The route may\n      be either a single route or route path:\n         ```javascript\n      this.transitionTo('blogPosts');\n      this.transitionTo('blogPosts.recentEntries');\n      ```\n         Optionally supply a model for the route in question. The model\n      will be serialized into the URL using the `serialize` hook of\n      the route:\n         ```javascript\n      this.transitionTo('blogPost', aPost);\n      ```\n         If a literal is passed (such as a number or a string), it will\n      be treated as an identifier instead. In this case, the `model`\n      hook of the route will be triggered:\n         ```javascript\n      this.transitionTo('blogPost', 1);\n      ```\n         Multiple models will be applied last to first recursively up the\n      route tree.\n         ```app/routes.js\n      // ...\n         Router.map(function() {\n        this.route('blogPost', { path:':blogPostId' }, function() {\n          this.route('blogComment', { path: ':blogCommentId' });\n        });\n      });\n         export default Router;\n      ```\n         ```javascript\n      this.transitionTo('blogComment', aPost, aComment);\n      this.transitionTo('blogComment', 1, 13);\n      ```\n         It is also possible to pass a URL (a string that starts with a\n      `/`).\n         ```javascript\n      this.transitionTo('/');\n      this.transitionTo('/blog/post/1/comment/13');\n      this.transitionTo('/blog/posts?sort=title');\n      ```\n         An options hash with a `queryParams` property may be provided as\n      the final argument to add query parameters to the destination URL.\n         ```javascript\n      this.transitionTo('blogPost', 1, {\n        queryParams: { showComments: 'true' }\n      });\n         // if you just want to transition the query parameters without changing the route\n      this.transitionTo({ queryParams: { sort: 'date' } });\n      ```\n         See also [replaceWith](#method_replaceWith).\n         Simple Transition Example\n         ```app/routes.js\n      // ...\n         Router.map(function() {\n        this.route('index');\n        this.route('secret');\n        this.route('fourOhFour', { path: '*:' });\n      });\n         export default Router;\n      ```\n         ```app/routes/index.js\n      import Route from '@ember/routing/route';\n      import { action } from '@ember/object';\n         export default class IndexRoute extends Route {\n        @action\n        moveToSecret(context) {\n          if (authorized()) {\n            this.transitionTo('secret', context);\n          } else {\n            this.transitionTo('fourOhFour');\n          }\n        }\n      }\n      ```\n         Transition to a nested route\n         ```app/router.js\n      // ...\n         Router.map(function() {\n        this.route('articles', { path: '/articles' }, function() {\n          this.route('new');\n        });\n      });\n         export default Router;\n      ```\n         ```app/routes/index.js\n      import Route from '@ember/routing/route';\n      import { action } from '@ember/object';\n         export default class IndexRoute extends Route {\n        @action\n        transitionToNewArticle() {\n          this.transitionTo('articles.new');\n        }\n      }\n      ```\n         Multiple Models Example\n         ```app/router.js\n      // ...\n         Router.map(function() {\n        this.route('index');\n           this.route('breakfast', { path: ':breakfastId' }, function() {\n          this.route('cereal', { path: ':cerealId' });\n        });\n      });\n         export default Router;\n      ```\n         ```app/routes/index.js\n      import Route from '@ember/routing/route';\n      import { action } from '@ember/object';\n         export default class IndexRoute extends Route {\n        @action\n        moveToChocolateCereal() {\n          let cereal = { cerealId: 'ChocolateYumminess' };\n          let breakfast = { breakfastId: 'CerealAndMilk' };\n             this.transitionTo('breakfast.cereal', breakfast, cereal);\n        }\n      }\n      ```\n         Nested Route with Query String Example\n         ```app/routes.js\n      // ...\n         Router.map(function() {\n        this.route('fruits', function() {\n          this.route('apples');\n        });\n      });\n         export default Router;\n      ```\n         ```app/routes/index.js\n      import Route from '@ember/routing/route';\n         export default class IndexRoute extends Route {\n        @action\n        transitionToApples() {\n          this.transitionTo('fruits.apples', { queryParams: { color: 'red' } });\n        }\n      }\n      ```\n         @method transitionTo\n      @param {String} [name] the name of the route or a URL.\n      @param {...Object} [models] the model(s) or identifier(s) to be used while\n        transitioning to the route.\n      @param {Object} [options] optional hash with a queryParams property\n        containing a mapping of query parameters. May be supplied as the only\n        parameter to trigger a query-parameter-only transition.\n      @return {Transition} the transition object associated with this\n        attempted transition\n      @since 1.0.0\n      @deprecated Use transitionTo from the Router service instead.\n      @public\n    */\n    transitionTo() {\n      (0, _utils3.deprecateTransitionMethods)('route', 'transitionTo');\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n      return this._router.transitionTo(...(0, _utils3.prefixRouteNameArg)(this, args));\n    }\n    /**\n      Perform a synchronous transition into another route without attempting\n      to resolve promises, update the URL, or abort any currently active\n      asynchronous transitions (i.e. regular transitions caused by\n      `transitionTo` or URL changes).\n         This method is handy for performing intermediate transitions on the\n      way to a final destination route, and is called internally by the\n      default implementations of the `error` and `loading` handlers.\n         @method intermediateTransitionTo\n      @param {String} name the name of the route\n      @param {...Object} models the model(s) to be used while transitioning\n      to the route.\n      @since 1.2.0\n      @public\n     */\n    intermediateTransitionTo() {\n      for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n      var [name, ...preparedArgs] = (0, _utils3.prefixRouteNameArg)(this, args);\n      this._router.intermediateTransitionTo(name, ...preparedArgs);\n    }\n    /**\n      Refresh the model on this route and any child routes, firing the\n      `beforeModel`, `model`, and `afterModel` hooks in a similar fashion\n      to how routes are entered when transitioning in from other route.\n      The current route params (e.g. `article_id`) will be passed in\n      to the respective model hooks, and if a different model is returned,\n      `setupController` and associated route hooks will re-fire as well.\n         An example usage of this method is re-querying the server for the\n      latest information using the same parameters as when the route\n      was first entered.\n         Note that this will cause `model` hooks to fire even on routes\n      that were provided a model object when the route was initially\n      entered.\n         @method refresh\n      @return {Transition} the transition object associated with this\n        attempted transition\n      @since 1.4.0\n      @public\n     */\n    refresh() {\n      return this._router._routerMicrolib.refresh(this);\n    }\n    /**\n      Transition into another route while replacing the current URL, if possible.\n      This will replace the current history entry instead of adding a new one.\n      Beside that, it is identical to `transitionTo` in all other respects. See\n      'transitionTo' for additional information regarding multiple models.\n         Example\n         ```app/router.js\n      // ...\n         Router.map(function() {\n        this.route('index');\n        this.route('secret');\n      });\n         export default Router;\n      ```\n         ```app/routes/secret.js\n      import Route from '@ember/routing/route';\n         export default class SecretRoute Route {\n        afterModel() {\n          if (!authorized()){\n            this.replaceWith('index');\n          }\n        }\n      }\n      ```\n         @method replaceWith\n      @param {String} name the name of the route or a URL\n      @param {...Object} models the model(s) or identifier(s) to be used while\n        transitioning to the route.\n      @param {Object} [options] optional hash with a queryParams property\n        containing a mapping of query parameters\n      @return {Transition} the transition object associated with this\n        attempted transition\n      @since 1.0.0\n      @deprecated Use replaceWith from the Router service instead.\n      @public\n    */\n    replaceWith() {\n      (0, _utils3.deprecateTransitionMethods)('route', 'replaceWith');\n      for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n        args[_key3] = arguments[_key3];\n      }\n      return this._router.replaceWith(...(0, _utils3.prefixRouteNameArg)(this, args));\n    }\n    /**\n      This hook is the entry point for router.js\n         @private\n      @method setup\n    */\n    setup(context, transition) {\n      var controllerName = this.controllerName || this.routeName;\n      var definedController = this.controllerFor(controllerName, true);\n      var controller = definedController !== null && definedController !== void 0 ? definedController : this.generateController(controllerName);\n      // SAFETY: Since `_qp` is protected we can't infer the type\n      var queryParams = (0, _object.get)(this, '_qp');\n      // Assign the route's controller so that it can more easily be\n      // referenced in action handlers. Side effects. Side effects everywhere.\n      if (!this.controller) {\n        var propNames = queryParams.propertyNames;\n        addQueryParamsObservers(controller, propNames);\n        this.controller = controller;\n      }\n      var states = queryParams.states;\n      controller._qpDelegate = states.allowOverrides;\n      if (transition) {\n        // Update the model dep values used to calculate cache keys.\n        (0, _utils3.stashParamNames)(this._router, transition[_router_js.STATE_SYMBOL].routeInfos);\n        var cache = this._bucketCache;\n        var params = transition[_router_js.PARAMS_SYMBOL];\n        var allParams = queryParams.propertyNames;\n        allParams.forEach(prop => {\n          var aQp = queryParams.map[prop];\n          (true && !(aQp) && (0, _debug.assert)('expected aQp', aQp));\n          aQp.values = params;\n          var cacheKey = (0, _utils3.calculateCacheKey)(aQp.route.fullRouteName, aQp.parts, aQp.values);\n          var value = cache.lookup(cacheKey, prop, aQp.undecoratedDefaultValue);\n          (0, _object.set)(controller, prop, value);\n        });\n        var qpValues = getQueryParamsFor(this, transition[_router_js.STATE_SYMBOL]);\n        (0, _object.setProperties)(controller, qpValues);\n      }\n      this.setupController(controller, context, transition);\n      if (this._environment.options.shouldRender) {\n        this[RENDER]();\n      }\n      // Setup can cause changes to QPs which need to be propogated immediately in\n      // some situations. Eventually, we should work on making these async somehow.\n      (0, _metal.flushAsyncObservers)(false);\n    }\n    /*\n      Called when a query parameter for this route changes, regardless of whether the route\n      is currently part of the active route hierarchy. This will update the query parameter's\n      value in the cache so if this route becomes active, the cache value has been updated.\n    */\n    _qpChanged(prop, value, qp) {\n      if (!qp) {\n        return;\n      }\n      // Update model-dep cache\n      var cache = this._bucketCache;\n      var cacheKey = (0, _utils3.calculateCacheKey)(qp.route.fullRouteName, qp.parts, qp.values);\n      cache.stash(cacheKey, prop, value);\n    }\n    beforeModel(_transition) {}\n    afterModel(_resolvedModel, _transition) {}\n    /**\n      A hook you can implement to optionally redirect to another route.\n         Calling `this.transitionTo` from inside of the `redirect` hook will\n      abort the current transition (into the route that has implemented `redirect`).\n         `redirect` and `afterModel` behave very similarly and are\n      called almost at the same time, but they have an important\n      distinction when calling `this.transitionTo` to a child route\n      of the current route. From `afterModel`, this new transition\n      invalidates the current transition, causing `beforeModel`,\n      `model`, and `afterModel` hooks to be called again. But the\n      same transition started from `redirect` does _not_ invalidate\n      the current transition. In other words, by the time the `redirect`\n      hook has been called, both the resolved model and the attempted\n      entry into this route are considered fully validated.\n         @method redirect\n      @param {Object} model the model for this route\n      @param {Transition} transition the transition object associated with the current transition\n      @since 1.0.0\n      @public\n    */\n    redirect(_model, _transition) {}\n    /**\n      Called when the context is changed by router.js.\n         @private\n      @method contextDidChange\n    */\n    contextDidChange() {\n      this.currentModel = this.context;\n    }\n    /**\n      A hook you can implement to convert the URL into the model for\n      this route.\n         ```app/router.js\n      // ...\n         Router.map(function() {\n        this.route('post', { path: '/posts/:post_id' });\n      });\n         export default Router;\n      ```\n         The model for the `post` route is `store.findRecord('post', params.post_id)`.\n         By default, if your route has a dynamic segment ending in `_id`:\n         * The model class is determined from the segment (`post_id`'s\n        class is `App.Post`)\n      * The find method is called on the model class with the value of\n        the dynamic segment.\n         Note that for routes with dynamic segments, this hook is not always\n      executed. If the route is entered through a transition (e.g. when\n      using the `link-to` Handlebars helper or the `transitionTo` method\n      of routes), and a model context is already provided this hook\n      is not called.\n         A model context does not include a primitive string or number,\n      which does cause the model hook to be called.\n         Routes without dynamic segments will always execute the model hook.\n         ```javascript\n      // no dynamic segment, model hook always called\n      this.transitionTo('posts');\n         // model passed in, so model hook not called\n      thePost = store.findRecord('post', 1);\n      this.transitionTo('post', thePost);\n         // integer passed in, model hook is called\n      this.transitionTo('post', 1);\n         // model id passed in, model hook is called\n      // useful for forcing the hook to execute\n      thePost = store.findRecord('post', 1);\n      this.transitionTo('post', thePost.id);\n      ```\n         This hook follows the asynchronous/promise semantics\n      described in the documentation for `beforeModel`. In particular,\n      if a promise returned from `model` fails, the error will be\n      handled by the `error` hook on `Route`.\n         Example\n         ```app/routes/post.js\n      import Route from '@ember/routing/route';\n         export default class PostRoute extends Route {\n        model(params) {\n          return this.store.findRecord('post', params.post_id);\n        }\n      }\n      ```\n         @method model\n      @param {Object} params the parameters extracted from the URL\n      @param {Transition} transition\n      @return {any | Promise<any>} the model for this route. If\n        a promise is returned, the transition will pause until\n        the promise resolves, and the resolved value of the promise\n        will be used as the model for this route.\n      @since 1.0.0\n      @public\n    */\n    model(params, transition) {\n      var name, sawParams, value;\n      // SAFETY: Since `_qp` is protected we can't infer the type\n      var queryParams = (0, _object.get)(this, '_qp').map;\n      for (var prop in params) {\n        if (prop === 'queryParams' || queryParams && prop in queryParams) {\n          continue;\n        }\n        var match = prop.match(/^(.*)_id$/);\n        if (match !== null) {\n          name = match[1];\n          value = params[prop];\n        }\n        sawParams = true;\n      }\n      if (!name) {\n        if (sawParams) {\n          // SAFETY: This should be equivalent\n          return Object.assign({}, params);\n        } else {\n          if (transition.resolveIndex < 1) {\n            return;\n          }\n          // SAFETY: This should be correct, but TS is unable to infer this.\n          return transition[_router_js.STATE_SYMBOL].routeInfos[transition.resolveIndex - 1].context;\n        }\n      }\n      return this.findModel(name, value);\n    }\n    /**\n      @private\n      @method deserialize\n      @param {Object} params the parameters extracted from the URL\n      @param {Transition} transition\n      @return {any | Promise<any>} the model for this route.\n         Router.js hook.\n     */\n    deserialize(_params, transition) {\n      return this.model(this._paramsFor(this.routeName, _params), transition);\n    }\n    /**\n         @method findModel\n      @param {String} type the model type\n      @param {Object} value the value passed to find\n      @private\n    */\n    findModel() {\n      return (0, _object.get)(this, 'store').find(...arguments);\n    }\n    /**\n      A hook you can use to setup the controller for the current route.\n         This method is called with the controller for the current route and the\n      model supplied by the `model` hook.\n         By default, the `setupController` hook sets the `model` property of\n      the controller to the specified `model` when it is not `undefined`.\n         If you implement the `setupController` hook in your Route, it will\n      prevent this default behavior. If you want to preserve that behavior\n      when implementing your `setupController` function, make sure to call\n      `super`:\n         ```app/routes/photos.js\n      import Route from '@ember/routing/route';\n         export default class PhotosRoute extends Route {\n        model() {\n          return this.store.findAll('photo');\n        }\n           setupController(controller, model) {\n          super.setupController(controller, model);\n             this.controllerFor('application').set('showingPhotos', true);\n        }\n      }\n      ```\n         The provided controller will be one resolved based on the name\n      of this route.\n         If no explicit controller is defined, Ember will automatically create one.\n         As an example, consider the router:\n         ```app/router.js\n      // ...\n         Router.map(function() {\n        this.route('post', { path: '/posts/:post_id' });\n      });\n         export default Router;\n      ```\n         If you have defined a file for the post controller,\n      the framework will use it.\n      If it is not defined, a basic `Controller` instance would be used.\n         @example Behavior of a basic Controller\n         ```app/routes/post.js\n      import Route from '@ember/routing/route';\n         export default class PostRoute extends Route {\n        setupController(controller, model) {\n          controller.set('model', model);\n        }\n      });\n      ```\n         @method setupController\n      @param {Controller} controller instance\n      @param {Object} model\n      @param {Transition} [transition]\n      @since 1.0.0\n      @public\n    */\n    setupController(controller, context, _transition) {\n      if (controller && context !== undefined) {\n        (0, _object.set)(controller, 'model', context);\n      }\n    }\n    controllerFor(name, _skipAssert) {\n      if (_skipAssert === void 0) {\n        _skipAssert = false;\n      }\n      var owner = (0, _owner.getOwner)(this);\n      (true && !(owner) && (0, _debug.assert)('Route is unexpectedly missing an owner', owner));\n      var route = owner.lookup(`route:${name}`);\n      if (route && route.controllerName) {\n        name = route.controllerName;\n      }\n      var controller = owner.lookup(`controller:${name}`);\n      // NOTE: We're specifically checking that skipAssert is true, because according\n      //   to the old API the second parameter was model. We do not want people who\n      //   passed a model to skip the assertion.\n      (true && !(controller !== undefined || _skipAssert === true) && (0, _debug.assert)(`The controller named '${name}' could not be found. Make sure that this route exists and has already been entered at least once. If you are accessing a controller not associated with a route, make sure the controller class is explicitly defined.`, controller !== undefined || _skipAssert === true));\n      (true && !(controller === undefined || controller instanceof _controller2.default) && (0, _debug.assert)(`Expected controller:${name} to be an instance of Controller`, controller === undefined || controller instanceof _controller2.default));\n      return controller;\n    }\n    /**\n      Generates a controller for a route.\n         Example\n         ```app/routes/post.js\n      import Route from '@ember/routing/route';\n         export default class Post extends Route {\n        setupController(controller, post) {\n          super.setupController(controller, post);\n             this.generateController('posts');\n        }\n      }\n      ```\n         @method generateController\n      @param {String} name the name of the controller\n      @private\n    */\n    generateController(name) {\n      var owner = (0, _owner.getOwner)(this);\n      (true && !(owner) && (0, _debug.assert)('Route is unexpectedly missing an owner', owner));\n      return (0, _internals.generateController)(owner, name);\n    }\n    /**\n      Returns the resolved model of a parent (or any ancestor) route\n      in a route hierarchy.  During a transition, all routes\n      must resolve a model object, and if a route\n      needs access to a parent route's model in order to\n      resolve a model (or just reuse the model from a parent),\n      it can call `this.modelFor(theNameOfParentRoute)` to\n      retrieve it. If the ancestor route's model was a promise,\n      its resolved result is returned.\n         Example\n         ```app/router.js\n      // ...\n         Router.map(function() {\n        this.route('post', { path: '/posts/:post_id' }, function() {\n          this.route('comments');\n        });\n      });\n         export default Router;\n      ```\n         ```app/routes/post/comments.js\n      import Route from '@ember/routing/route';\n         export default class PostCommentsRoute extends Route {\n        model() {\n          let post = this.modelFor('post');\n             return post.comments;\n        }\n      }\n      ```\n         @method modelFor\n      @param {String} name the name of the route\n      @return {Object} the model object\n      @since 1.0.0\n      @public\n    */\n    modelFor(_name) {\n      var name;\n      var owner = (0, _owner.getOwner)(this);\n      (true && !(owner instanceof _instance.default) && (0, _debug.assert)('Expected router owner to be an EngineInstance', owner instanceof _instance.default));\n      var transition = this._router && this._router._routerMicrolib ? this._router._routerMicrolib.activeTransition : undefined;\n      // Only change the route name when there is an active transition.\n      // Otherwise, use the passed in route name.\n      if (owner.routable && transition !== undefined) {\n        name = getEngineRouteName(owner, _name);\n      } else {\n        name = _name;\n      }\n      var route = owner.lookup(`route:${name}`);\n      // If we are mid-transition, we want to try and look up\n      // resolved parent contexts on the current transitionEvent.\n      if (transition !== undefined && transition !== null) {\n        var modelLookupName = route && route.routeName || name;\n        if (Object.prototype.hasOwnProperty.call(transition.resolvedModels, modelLookupName)) {\n          return transition.resolvedModels[modelLookupName];\n        }\n      }\n      return route === null || route === void 0 ? void 0 : route.currentModel;\n    }\n    /**\n      `this[RENDER]` is used to render a template into a region of another template\n      (indicated by an `{{outlet}}`).\n         @method this[RENDER]\n      @param {String} name the name of the template to render\n      @param {Object} [options] the options\n      @param {String} [options.into] the template to render into,\n                      referenced by name. Defaults to the parent template\n      @param {String} [options.outlet] the outlet inside `options.into` to render into.\n                      Defaults to 'main'\n      @param {String|Object} [options.controller] the controller to use for this template,\n                      referenced by name or as a controller instance. Defaults to the Route's paired controller\n      @param {Object} [options.model] the model object to set on `options.controller`.\n                      Defaults to the return value of the Route's model hook\n      @private\n     */\n    [RENDER](name, options) {\n      var renderOptions = buildRenderOptions(this, name, options);\n      ROUTE_CONNECTIONS.get(this).push(renderOptions);\n      (0, _runloop.once)(this._router, '_setOutlets');\n    }\n    willDestroy() {\n      this.teardownViews();\n    }\n    /**\n      @private\n         @method teardownViews\n    */\n    teardownViews() {\n      var connections = ROUTE_CONNECTIONS.get(this);\n      if (connections !== undefined && connections.length > 0) {\n        ROUTE_CONNECTIONS.set(this, []);\n        (0, _runloop.once)(this._router, '_setOutlets');\n      }\n    }\n    buildRouteInfoMetadata() {}\n    _paramsFor(routeName, params) {\n      var transition = this._router._routerMicrolib.activeTransition;\n      if (transition !== undefined) {\n        return this.paramsFor(routeName);\n      }\n      return params;\n    }\n    /**\n      Store property provides a hook for data persistence libraries to inject themselves.\n         By default, this store property provides the exact same functionality previously\n      in the model hook.\n         Currently, the required interface is:\n         `store.find(modelName, findArguments)`\n         @property store\n      @type {Object}\n      @private\n    */\n    get store() {\n      var owner = (0, _owner.getOwner)(this);\n      (true && !(owner) && (0, _debug.assert)('Route is unexpectedly missing an owner', owner));\n      var routeName = this.routeName;\n      return {\n        find(name, value) {\n          var modelClass = owner.factoryFor(`model:${name}`);\n          (true && !(Boolean(modelClass)) && (0, _debug.assert)(`You used the dynamic segment \\`${name}_id\\` in your route ` + `\\`${routeName}\\` for which Ember requires you provide a ` + `data-loading implementation. Commonly, that is done by ` + `adding a model hook implementation on the route ` + `(\\`model({${name}_id}) {\\`) or by injecting an implemention of ` + `a data store: \\`@service store;\\`.`, Boolean(modelClass)));\n          if (!modelClass) {\n            return;\n          }\n          modelClass = modelClass.class;\n          (true && !(typeof modelClass.find === 'function') && (0, _debug.assert)(`You used the dynamic segment \\`${name}_id\\` in your route ` + `\\`${routeName}\\` for which Ember requires you provide a ` + `data-loading implementation. Commonly, that is done by ` + `adding a model hook implementation on the route ` + `(\\`model({${name}_id}) {\\`) or by injecting an implemention of ` + `a data store: \\`@service store;\\`.\\n\\n` + `Rarely, applications may attempt to use a legacy behavior where ` + `the model class (in this case \\`${name}\\`) is resolved and the ` + `\\`find\\` method on that class is invoked to load data. In this ` + `application, a model of \\`${name}\\` was found but it did not ` + `provide a \\`find\\` method. You should not add a \\`find\\` ` + `method to your model. Instead, please implement an appropriate ` + `\\`model\\` hook on the \\`${routeName}\\` route.`, typeof modelClass.find === 'function'));\n          return modelClass.find(value);\n        }\n      };\n    }\n    set store(value) {\n      (0, _metal.defineProperty)(this, 'store', null, value);\n    }\n    /**\n      @private\n      @property _qp\n      */\n    get _qp() {\n      var combinedQueryParameterConfiguration = {};\n      var controllerName = this.controllerName || this.routeName;\n      var owner = (0, _owner.getOwner)(this);\n      (true && !(owner) && (0, _debug.assert)('Route is unexpectedly missing an owner', owner));\n      var controller = owner.lookup(`controller:${controllerName}`);\n      var queryParameterConfiguraton = (0, _object.get)(this, 'queryParams');\n      var hasRouterDefinedQueryParams = Object.keys(queryParameterConfiguraton).length > 0;\n      if (controller) {\n        (true && !(controller instanceof _controller2.default) && (0, _debug.assert)('Expected an instance of controller', controller instanceof _controller2.default)); // the developer has authored a controller class in their application for\n        // this route find its query params and normalize their object shape them\n        // merge in the query params for the route. As a mergedProperty,\n        // Route#queryParams is always at least `{}`\n        var controllerDefinedQueryParameterConfiguration = (0, _object.get)(controller, 'queryParams') || [];\n        var normalizedControllerQueryParameterConfiguration = (0, _utils3.normalizeControllerQueryParams)(controllerDefinedQueryParameterConfiguration);\n        combinedQueryParameterConfiguration = mergeEachQueryParams(normalizedControllerQueryParameterConfiguration, queryParameterConfiguraton);\n      } else if (hasRouterDefinedQueryParams) {\n        // the developer has not defined a controller but *has* supplied route query params.\n        // Generate a class for them so we can later insert default values\n        controller = (0, _internals.generateController)(owner, controllerName);\n        combinedQueryParameterConfiguration = queryParameterConfiguraton;\n      }\n      var qps = [];\n      var map = {};\n      var propertyNames = [];\n      for (var propName in combinedQueryParameterConfiguration) {\n        if (!Object.prototype.hasOwnProperty.call(combinedQueryParameterConfiguration, propName)) {\n          continue;\n        }\n        // to support the dubious feature of using unknownProperty\n        // on queryParams configuration\n        if (propName === 'unknownProperty' || propName === '_super') {\n          // possible todo: issue deprecation warning?\n          continue;\n        }\n        var desc = combinedQueryParameterConfiguration[propName];\n        (true && !(desc) && (0, _debug.assert)(`[BUG] missing query parameter configuration for ${propName}`, desc));\n        var scope = desc.scope || 'model';\n        var parts = undefined;\n        if (scope === 'controller') {\n          parts = [];\n        }\n        var urlKey = desc.as || this.serializeQueryParamKey(propName);\n        var defaultValue = (0, _object.get)(controller, propName);\n        defaultValue = copyDefaultValue(defaultValue);\n        var type = desc.type || (0, _utils.typeOf)(defaultValue);\n        var defaultValueSerialized = this.serializeQueryParam(defaultValue, urlKey, type);\n        var scopedPropertyName = `${controllerName}:${propName}`;\n        var qp = {\n          undecoratedDefaultValue: (0, _object.get)(controller, propName),\n          defaultValue,\n          serializedDefaultValue: defaultValueSerialized,\n          serializedValue: defaultValueSerialized,\n          type,\n          urlKey,\n          prop: propName,\n          scopedPropertyName,\n          controllerName,\n          route: this,\n          parts,\n          values: null,\n          scope\n        };\n        map[propName] = map[urlKey] = map[scopedPropertyName] = qp;\n        qps.push(qp);\n        propertyNames.push(propName);\n      }\n      return {\n        qps,\n        map,\n        propertyNames,\n        states: {\n          /*\n            Called when a query parameter changes in the URL, this route cares\n            about that query parameter, but the route is not currently\n            in the active route hierarchy.\n          */\n          inactive: (prop, value) => {\n            var qp = map[prop];\n            (true && !(qp) && (0, _debug.assert)('expected inactive callback to only be called for registered qps', qp));\n            this._qpChanged(prop, value, qp);\n          },\n          /*\n            Called when a query parameter changes in the URL, this route cares\n            about that query parameter, and the route is currently\n            in the active route hierarchy.\n          */\n          active: (prop, value) => {\n            var qp = map[prop];\n            (true && !(qp) && (0, _debug.assert)('expected active callback to only be called for registered qps', qp));\n            this._qpChanged(prop, value, qp);\n            return this._activeQPChanged(qp, value);\n          },\n          /*\n            Called when a value of a query parameter this route handles changes in a controller\n            and the route is currently in the active route hierarchy.\n          */\n          allowOverrides: (prop, value) => {\n            var qp = map[prop];\n            (true && !(qp) && (0, _debug.assert)('expected allowOverrides callback to only be called for registered qps', qp));\n            this._qpChanged(prop, value, qp);\n            return this._updatingQPChanged(qp);\n          }\n        }\n      };\n    }\n  }\n  Route.isRouteFactory = true;\n  __decorate([_object.computed], Route.prototype, \"store\", null);\n  __decorate([_object.computed], Route.prototype, \"_qp\", null);\n  function parentRoute(route) {\n    var routeInfo = routeInfoFor(route, route._router._routerMicrolib.state.routeInfos, -1);\n    return routeInfo && routeInfo.route;\n  }\n  function routeInfoFor(route, routeInfos, offset) {\n    if (offset === void 0) {\n      offset = 0;\n    }\n    if (!routeInfos) {\n      return;\n    }\n    var current;\n    for (var i = 0; i < routeInfos.length; i++) {\n      var routeInfo = routeInfos[i];\n      (true && !(routeInfo) && (0, _debug.assert)('has current routeInfo', routeInfo));\n      current = routeInfo.route;\n      if (current === route) {\n        return routeInfos[i + offset];\n      }\n    }\n    return;\n  }\n  function buildRenderOptions(route, nameOrOptions, options) {\n    var isDefaultRender = !nameOrOptions && !options;\n    var _name;\n    if (!isDefaultRender) {\n      if (typeof nameOrOptions === 'object' && !options) {\n        _name = route.templateName || route.routeName;\n        options = nameOrOptions;\n      } else {\n        (true && !(!(0, _utils.isEmpty)(nameOrOptions)) && (0, _debug.assert)('The name in the given arguments is undefined or empty string', !(0, _utils.isEmpty)(nameOrOptions)));\n        _name = nameOrOptions;\n      }\n    }\n    (true && !(isDefaultRender || !(options && 'outlet' in options && options.outlet === undefined)) && (0, _debug.assert)('You passed undefined as the outlet name.', isDefaultRender || !(options && 'outlet' in options && options.outlet === undefined)));\n    var owner = (0, _owner.getOwner)(route);\n    (true && !(owner) && (0, _debug.assert)('Route is unexpectedly missing an owner', owner));\n    var name, templateName, into, outlet, model;\n    var controller;\n    if (options) {\n      into = options.into && options.into.replace(/\\//g, '.');\n      outlet = options.outlet;\n      controller = options.controller;\n      model = options.model;\n    }\n    outlet = outlet || 'main';\n    if (isDefaultRender) {\n      name = route.routeName;\n      templateName = route.templateName || name;\n    } else {\n      name = _name.replace(/\\//g, '.');\n      templateName = name;\n    }\n    if (controller === undefined) {\n      if (isDefaultRender) {\n        controller = route.controllerName || owner.lookup(`controller:${name}`);\n      } else {\n        controller = owner.lookup(`controller:${name}`) || route.controllerName || route.routeName;\n      }\n    }\n    if (typeof controller === 'string') {\n      var controllerName = controller;\n      controller = owner.lookup(`controller:${controllerName}`);\n      (true && !(isDefaultRender || controller !== undefined) && (0, _debug.assert)(`You passed \\`controller: '${controllerName}'\\` into the \\`render\\` method, but no such controller could be found.`, isDefaultRender || controller !== undefined));\n    }\n    (true && !(controller instanceof _controller2.default) && (0, _debug.assert)('Expected an instance of controller', controller instanceof _controller2.default));\n    if (model === undefined) {\n      model = route.currentModel;\n    } else {\n      controller.set('model', model);\n    }\n    var template = owner.lookup(`template:${templateName}`);\n    (true && !(isDefaultRender || template !== undefined) && (0, _debug.assert)(`Could not find \"${templateName}\" template, view, or component.`, isDefaultRender || template !== undefined));\n    var parent;\n    if (into && (parent = parentRoute(route)) && into === parent.routeName) {\n      into = undefined;\n    }\n    var renderOptions = {\n      owner,\n      into,\n      outlet,\n      name,\n      controller,\n      model,\n      template: template !== undefined ? template(owner) : route._topLevelViewTemplate(owner)\n    };\n    if (true /* DEBUG */) {\n      var LOG_VIEW_LOOKUPS = (0, _object.get)(route._router, 'namespace.LOG_VIEW_LOOKUPS');\n      if (LOG_VIEW_LOOKUPS && !template) {\n        (0, _debug.info)(`Could not find \"${name}\" template. Nothing will be rendered`, {\n          fullName: `template:${name}`\n        });\n      }\n    }\n    return renderOptions;\n  }\n  function getFullQueryParams(router, state) {\n    if (state.fullQueryParams) {\n      return state.fullQueryParams;\n    }\n    var haveAllRouteInfosResolved = state.routeInfos.every(routeInfo => routeInfo.route);\n    var fullQueryParamsState = Object.assign({}, state.queryParams);\n    router._deserializeQueryParams(state.routeInfos, fullQueryParamsState);\n    // only cache query params state if all routeinfos have resolved; it's possible\n    // for lazy routes to not have resolved when `getFullQueryParams` is called, so\n    // we wait until all routes have resolved prior to caching query params state\n    if (haveAllRouteInfosResolved) {\n      state.fullQueryParams = fullQueryParamsState;\n    }\n    return fullQueryParamsState;\n  }\n  function getQueryParamsFor(route, state) {\n    state.queryParamsFor = state.queryParamsFor || {};\n    var name = route.fullRouteName;\n    var existing = state.queryParamsFor[name];\n    if (existing) {\n      return existing;\n    }\n    var fullQueryParams = getFullQueryParams(route._router, state);\n    var params = state.queryParamsFor[name] = {};\n    // Copy over all the query params for this route/controller into params hash.\n    // SAFETY: Since `_qp` is protected we can't infer the type\n    var qps = (0, _object.get)(route, '_qp').qps;\n    for (var qp of qps) {\n      // Put deserialized qp on params hash.\n      var qpValueWasPassedIn = (qp.prop in fullQueryParams);\n      params[qp.prop] = qpValueWasPassedIn ? fullQueryParams[qp.prop] : copyDefaultValue(qp.defaultValue);\n    }\n    return params;\n  }\n  // FIXME: This should probably actually return a `NativeArray` if the passed in value is an Array.\n  function copyDefaultValue(value) {\n    if (Array.isArray(value)) {\n      // SAFETY: We lost the type data about the array if we don't cast.\n      return (0, _array.A)(value.slice());\n    }\n    return value;\n  }\n  /*\n    Merges all query parameters from a controller with those from\n    a route, returning a new object and avoiding any mutations to\n    the existing objects.\n  */\n  function mergeEachQueryParams(controllerQP, routeQP) {\n    var qps = {};\n    var keysAlreadyMergedOrSkippable = {\n      defaultValue: true,\n      type: true,\n      scope: true,\n      as: true\n    };\n    // first loop over all controller qps, merging them with any matching route qps\n    // into a new empty object to avoid mutating.\n    for (var cqpName in controllerQP) {\n      if (!Object.prototype.hasOwnProperty.call(controllerQP, cqpName)) {\n        continue;\n      }\n      qps[cqpName] = Object.assign(Object.assign({}, controllerQP[cqpName]), routeQP[cqpName]);\n      // allows us to skip this QP when we check route QPs.\n      keysAlreadyMergedOrSkippable[cqpName] = true;\n    }\n    // loop over all route qps, skipping those that were merged in the first pass\n    // because they also appear in controller qps\n    for (var rqpName in routeQP) {\n      if (!Object.prototype.hasOwnProperty.call(routeQP, rqpName) || keysAlreadyMergedOrSkippable[rqpName]) {\n        continue;\n      }\n      qps[rqpName] = Object.assign(Object.assign({}, routeQP[rqpName]), controllerQP[rqpName]);\n    }\n    return qps;\n  }\n  function addQueryParamsObservers(controller, propNames) {\n    propNames.forEach(prop => {\n      if ((0, _metal.descriptorForProperty)(controller, prop) === undefined) {\n        var desc = (0, _utils2.lookupDescriptor)(controller, prop);\n        if (desc !== null && (typeof desc.get === 'function' || typeof desc.set === 'function')) {\n          (0, _metal.defineProperty)(controller, prop, (0, _compat.dependentKeyCompat)({\n            get: desc.get,\n            set: desc.set\n          }));\n        }\n      }\n      (0, _metal.addObserver)(controller, `${prop}.[]`, controller, controller._qpChanged, false);\n    });\n  }\n  function getEngineRouteName(engine, routeName) {\n    if (engine.routable) {\n      var prefix = engine.mountPoint;\n      if (routeName === 'application') {\n        return prefix;\n      } else {\n        return `${prefix}.${routeName}`;\n      }\n    }\n    return routeName;\n  }\n  var defaultSerialize = Route.prototype.serialize;\n  _exports.defaultSerialize = defaultSerialize;\n  function hasDefaultSerialize(route) {\n    return route.serialize === defaultSerialize;\n  }\n  // Set these here so they can be overridden with extend\n  Route.reopen({\n    mergedProperties: ['queryParams'],\n    queryParams: {},\n    templateName: null,\n    controllerName: null,\n    send() {\n      for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n        args[_key4] = arguments[_key4];\n      }\n      (true && !(!this.isDestroying && !this.isDestroyed) && (0, _debug.assert)(`Attempted to call .send() with the action '${args[0]}' on the destroyed route '${this.routeName}'.`, !this.isDestroying && !this.isDestroyed));\n      if (this._router && this._router._routerMicrolib || !(0, _debug.isTesting)()) {\n        this._router.send(...args);\n      } else {\n        var name = args.shift();\n        var action = this.actions[name];\n        if (action) {\n          return action.apply(this, args);\n        }\n      }\n    },\n    /**\n      The controller associated with this route.\n         Example\n         ```app/routes/form.js\n      import Route from '@ember/routing/route';\n      import { action } from '@ember/object';\n         export default class FormRoute extends Route {\n        @action\n        willTransition(transition) {\n          if (this.controller.get('userHasEnteredData') &&\n              !confirm('Are you sure you want to abandon progress?')) {\n            transition.abort();\n          } else {\n            // Bubble the `willTransition` action so that\n            // parent routes can decide whether or not to abort.\n            return true;\n          }\n        }\n      }\n      ```\n         @property controller\n      @type Controller\n      @since 1.6.0\n      @public\n    */\n    actions: {\n      /**\n      This action is called when one or more query params have changed. Bubbles.\n           @method queryParamsDidChange\n      @param changed {Object} Keys are names of query params that have changed.\n      @param totalPresent {Object} Keys are names of query params that are currently set.\n      @param removed {Object} Keys are names of query params that have been removed.\n      @returns {boolean}\n      @private\n      */\n      queryParamsDidChange(changed, _totalPresent, removed) {\n        // SAFETY: Since `_qp` is protected we can't infer the type\n        var qpMap = (0, _object.get)(this, '_qp').map;\n        var totalChanged = Object.keys(changed).concat(Object.keys(removed));\n        for (var change of totalChanged) {\n          var qp = qpMap[change];\n          if (qp) {\n            var options = this._optionsForQueryParam(qp);\n            (true && !(options && typeof options === 'object') && (0, _debug.assert)('options exists', options && typeof options === 'object'));\n            if ((0, _object.get)(options, 'refreshModel') && this._router.currentState) {\n              this.refresh();\n              break;\n            }\n          }\n        }\n        return true;\n      },\n      finalizeQueryParamChange(params, finalParams, transition) {\n        if (this.fullRouteName !== 'application') {\n          return true;\n        }\n        // Transition object is absent for intermediate transitions.\n        if (!transition) {\n          return;\n        }\n        var routeInfos = transition[_router_js.STATE_SYMBOL].routeInfos;\n        var router = this._router;\n        var qpMeta = router._queryParamsFor(routeInfos);\n        var changes = router._qpUpdates;\n        var qpUpdated = false;\n        var replaceUrl;\n        (0, _utils3.stashParamNames)(router, routeInfos);\n        for (var qp of qpMeta.qps) {\n          var route = qp.route;\n          var controller = route.controller;\n          var presentKey = qp.urlKey in params && qp.urlKey;\n          // Do a reverse lookup to see if the changed query\n          // param URL key corresponds to a QP property on\n          // this controller.\n          var value = void 0;\n          var svalue = void 0;\n          if (changes.has(qp.urlKey)) {\n            // Value updated in/before setupController\n            value = (0, _object.get)(controller, qp.prop);\n            svalue = route.serializeQueryParam(value, qp.urlKey, qp.type);\n          } else {\n            if (presentKey) {\n              svalue = params[presentKey];\n              if (svalue !== undefined) {\n                value = route.deserializeQueryParam(svalue, qp.urlKey, qp.type);\n              }\n            } else {\n              // No QP provided; use default value.\n              svalue = qp.serializedDefaultValue;\n              value = copyDefaultValue(qp.defaultValue);\n            }\n          }\n          // SAFETY: Since `_qp` is protected we can't infer the type\n          controller._qpDelegate = (0, _object.get)(route, '_qp').states.inactive;\n          var thisQueryParamChanged = svalue !== qp.serializedValue;\n          if (thisQueryParamChanged) {\n            if (transition.queryParamsOnly && replaceUrl !== false) {\n              var options = route._optionsForQueryParam(qp);\n              var replaceConfigValue = (0, _object.get)(options, 'replace');\n              if (replaceConfigValue) {\n                replaceUrl = true;\n              } else if (replaceConfigValue === false) {\n                // Explicit pushState wins over any other replaceStates.\n                replaceUrl = false;\n              }\n            }\n            (0, _object.set)(controller, qp.prop, value);\n            qpUpdated = true;\n          }\n          // Stash current serialized value of controller.\n          qp.serializedValue = svalue;\n          var thisQueryParamHasDefaultValue = qp.serializedDefaultValue === svalue;\n          if (!thisQueryParamHasDefaultValue) {\n            finalParams.push({\n              value: svalue,\n              visible: true,\n              key: presentKey || qp.urlKey\n            });\n          }\n        }\n        // Some QPs have been updated, and those changes need to be propogated\n        // immediately. Eventually, we should work on making this async somehow.\n        if (qpUpdated === true) {\n          (0, _metal.flushAsyncObservers)(false);\n        }\n        if (replaceUrl) {\n          transition.method('replace');\n        }\n        qpMeta.qps.forEach(qp => {\n          // SAFETY: Since `_qp` is protected we can't infer the type\n          var routeQpMeta = (0, _object.get)(qp.route, '_qp');\n          var finalizedController = qp.route.controller;\n          finalizedController['_qpDelegate'] = (0, _object.get)(routeQpMeta, 'states.active');\n        });\n        router._qpUpdates.clear();\n        return;\n      }\n    }\n  });\n  var _default = Route;\n  _exports.default = _default;\n});","define(\"@ember/routing/router-service\", [\"exports\", \"@ember/-internals/owner\", \"@ember/object/evented\", \"@ember/debug\", \"@ember/object/computed\", \"@ember/service\", \"@glimmer/validator\", \"@ember/routing/router\", \"@ember/routing/lib/utils\"], function (_exports, _owner, _evented, _debug, _computed, _service, _validator, _router2, _utils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = _exports.ROUTER = void 0;\n  var __decorate = void 0 && (void 0).__decorate || function (decorators, target, key, desc) {\n    var c = arguments.length,\n      r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n      d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) {\n      if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    }\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n  };\n  /**\n   * @module @ember/routing/router-service\n   */\n\n  var ROUTER = Symbol('ROUTER');\n  _exports.ROUTER = ROUTER;\n  function cleanURL(url, rootURL) {\n    if (rootURL === '/') {\n      return url;\n    }\n    return url.substring(rootURL.length);\n  }\n  class RouterService extends _service.default.extend(_evented.default) {\n    get _router() {\n      var router = this[ROUTER];\n      if (router !== undefined) {\n        return router;\n      }\n      var owner = (0, _owner.getOwner)(this);\n      (true && !(owner) && (0, _debug.assert)('RouterService is unexpectedly missing an owner', owner));\n      var _router = owner.lookup('router:main');\n      (true && !(_router instanceof _router2.default) && (0, _debug.assert)('ROUTER SERVICE BUG: Expected router to be an instance of EmberRouter', _router instanceof _router2.default));\n      return this[ROUTER] = _router;\n    }\n    willDestroy() {\n      super.willDestroy();\n      this[ROUTER] = undefined;\n    }\n    /**\n       Transition the application into another route. The route may\n       be either a single route or route path:\n          Calling `transitionTo` from the Router service will cause default query parameter values to be included in the URL.\n       This behavior is different from calling `transitionTo` on a route or `transitionToRoute` on a controller.\n       See the [Router Service RFC](https://github.com/emberjs/rfcs/blob/master/text/0095-router-service.md#query-parameter-semantics) for more info.\n          In the following example we use the Router service to navigate to a route with a\n       specific model from a Component in the first action, and in the second we trigger\n       a query-params only transition.\n          ```app/components/example.js\n       import Component from '@glimmer/component';\n       import { action } from '@ember/object';\n       import { service } from '@ember/service';\n          export default class extends Component {\n         @service router;\n            @action\n         goToComments(post) {\n           this.router.transitionTo('comments', post);\n         }\n            @action\n         fetchMoreComments(latestComment) {\n           this.router.transitionTo({\n             queryParams: { commentsAfter: latestComment }\n           });\n         }\n       }\n       ```\n          @method transitionTo\n       @param {String} [routeNameOrUrl] the name of the route or a URL\n       @param {...Object} [models] the model(s) or identifier(s) to be used while\n         transitioning to the route.\n       @param {Object} [options] optional hash with a queryParams property\n         containing a mapping of query parameters. May be supplied as the only\n        parameter to trigger a query-parameter-only transition.\n       @return {Transition} the transition object associated with this\n         attempted transition\n       @public\n     */\n    transitionTo() {\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n      if ((0, _utils.resemblesURL)(args[0])) {\n        // NOTE: this `args[0] as string` cast is safe and TS correctly infers it\n        // in 3.6+, so it can be removed when TS is upgraded.\n        return this._router._doURLTransition('transitionTo', args[0]);\n      }\n      var {\n        routeName,\n        models,\n        queryParams\n      } = (0, _utils.extractRouteArgs)(args);\n      var transition = this._router._doTransition(routeName, models, queryParams, true);\n      return transition;\n    }\n    /**\n       Similar to `transitionTo`, but instead of adding the destination to the browser's URL history,\n       it replaces the entry for the current route.\n       When the user clicks the \"back\" button in the browser, there will be fewer steps.\n       This is most commonly used to manage redirects in a way that does not cause confusing additions\n       to the user's browsing history.\n          Calling `replaceWith` from the Router service will cause default query parameter values to be included in the URL.\n       This behavior is different from calling `replaceWith` on a route.\n       See the [Router Service RFC](https://github.com/emberjs/rfcs/blob/master/text/0095-router-service.md#query-parameter-semantics) for more info.\n          Usage example:\n          ```app/routes/application.js\n       import Route from '@ember/routing/route';\n          export default class extends Route {\n         beforeModel() {\n           if (!authorized()){\n             this.replaceWith('unauthorized');\n           }\n         }\n       });\n       ```\n          @method replaceWith\n       @param {String} routeNameOrUrl the name of the route or a URL of the desired destination\n       @param {...Object} models the model(s) or identifier(s) to be used while\n         transitioning to the route i.e. an object of params to pass to the destination route\n       @param {Object} [options] optional hash with a queryParams property\n         containing a mapping of query parameters\n       @return {Transition} the transition object associated with this\n         attempted transition\n       @public\n     */\n    replaceWith() {\n      return this.transitionTo(...arguments).method('replace');\n    }\n    /**\n      Generate a URL based on the supplied route name and optionally a model. The\n      URL is returned as a string that can be used for any purpose.\n         In this example, the URL for the `author.books` route for a given author\n      is copied to the clipboard.\n         ```app/templates/application.hbs\n      <CopyLink @author={{hash id=\"tomster\" name=\"Tomster\"}} />\n      ```\n         ```app/components/copy-link.js\n      import Component from '@glimmer/component';\n      import { service } from '@ember/service';\n      import { action } from '@ember/object';\n         export default class CopyLinkComponent extends Component {\n        @service router;\n        @service clipboard;\n           @action\n        copyBooksURL() {\n          if (this.author) {\n            const url = this.router.urlFor('author.books', this.args.author);\n            this.clipboard.set(url);\n            // Clipboard now has /author/tomster/books\n          }\n        }\n      }\n      ```\n         Just like with `transitionTo` and `replaceWith`, `urlFor` can also handle\n      query parameters.\n         ```app/templates/application.hbs\n      <CopyLink @author={{hash id=\"tomster\" name=\"Tomster\"}} />\n      ```\n         ```app/components/copy-link.js\n      import Component from '@glimmer/component';\n      import { service } from '@ember/service';\n      import { action } from '@ember/object';\n         export default class CopyLinkComponent extends Component {\n        @service router;\n        @service clipboard;\n           @action\n        copyOnlyEmberBooksURL() {\n          if (this.author) {\n            const url = this.router.urlFor('author.books', this.author, {\n              queryParams: { filter: 'emberjs' }\n            });\n            this.clipboard.set(url);\n            // Clipboard now has /author/tomster/books?filter=emberjs\n          }\n        }\n      }\n      ```\n          @method urlFor\n       @param {String} routeName the name of the route\n       @param {...Object} models the model(s) for the route.\n       @param {Object} [options] optional hash with a queryParams property\n         containing a mapping of query parameters\n       @return {String} the string representing the generated URL\n       @public\n     */\n    urlFor(routeName) {\n      this._router.setupRouter();\n      for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n        args[_key2 - 1] = arguments[_key2];\n      }\n      return this._router.generate(routeName, ...args);\n    }\n    /**\n       Returns `true` if `routeName/models/queryParams` is the active route, where `models` and `queryParams` are optional.\n       See [model](api/ember/release/classes/Route/methods/model?anchor=model) and\n       [queryParams](/api/ember/3.7/classes/Route/properties/queryParams?anchor=queryParams) for more information about these arguments.\n          In the following example, `isActive` will return `true` if the current route is `/posts`.\n          ```app/components/posts.js\n       import Component from '@glimmer/component';\n       import { service } from '@ember/service';\n          export default class extends Component {\n         @service router;\n            displayComments() {\n           return this.router.isActive('posts');\n         }\n       });\n       ```\n          The next example includes a dynamic segment, and will return `true` if the current route is `/posts/1`,\n       assuming the post has an id of 1:\n          ```app/components/posts.js\n       import Component from '@glimmer/component';\n       import { service } from '@ember/service';\n          export default class extends Component {\n         @service router;\n            displayComments(post) {\n           return this.router.isActive('posts', post.id);\n         }\n       });\n       ```\n          Where `post.id` is the id of a specific post, which is represented in the route as /posts/[post.id].\n       If `post.id` is equal to 1, then isActive will return true if the current route is /posts/1, and false if the route is anything else.\n          @method isActive\n       @param {String} routeName the name of the route\n       @param {...Object} models the model(s) or identifier(s) to be used when determining the active route.\n       @param {Object} [options] optional hash with a queryParams property\n         containing a mapping of query parameters\n       @return {boolean} true if the provided routeName/models/queryParams are active\n       @public\n     */\n    isActive() {\n      for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n        args[_key3] = arguments[_key3];\n      }\n      var {\n        routeName,\n        models,\n        queryParams\n      } = (0, _utils.extractRouteArgs)(args);\n      var routerMicrolib = this._router._routerMicrolib;\n      // When using isActive() in a getter, we want to entagle with the auto-tracking system\n      // for example,\n      // in\n      // get isBarActive() {\n      //   return isActive('foo.bar');\n      // }\n      //\n      // you'd expect isBarActive to be dirtied when the route changes.\n      //\n      // https://github.com/emberjs/ember.js/issues/19004\n      (0, _validator.consumeTag)((0, _validator.tagFor)(this._router, 'currentURL'));\n      // UNSAFE: casting `routeName as string` here encodes the existing\n      // assumption but may be wrong: `extractRouteArgs` correctly returns it as\n      // `string | undefined`. There may be bugs if `isActiveIntent` does\n      // not correctly account for `undefined` values for `routeName`. Spoilers:\n      // it *does not* account for this being `undefined`.\n      if (!routerMicrolib.isActiveIntent(routeName, models)) {\n        return false;\n      }\n      var hasQueryParams = Object.keys(queryParams).length > 0;\n      if (hasQueryParams) {\n        // UNSAFE: casting `routeName as string` here encodes the existing\n        // assumption but may be wrong: `extractRouteArgs` correctly returns it\n        // as `string | undefined`. There may be bugs if `_prepareQueryParams`\n        // does not correctly account for `undefined` values for `routeName`.\n        //  Spoilers: under the hood this currently uses router.js APIs which\n        // *do not* account for this being `undefined`.\n        var targetRouteName = routeName;\n        queryParams = Object.assign({}, queryParams);\n        this._router._prepareQueryParams(targetRouteName, models, queryParams, true /* fromRouterService */);\n        var currentQueryParams = Object.assign({}, routerMicrolib.state.queryParams);\n        this._router._prepareQueryParams(targetRouteName, models, currentQueryParams, true /* fromRouterService */);\n        return (0, _utils.shallowEqual)(queryParams, currentQueryParams);\n      }\n      return true;\n    }\n    /**\n       Takes a string URL and returns a `RouteInfo` for the leafmost route represented\n       by the URL. Returns `null` if the URL is not recognized. This method expects to\n       receive the actual URL as seen by the browser including the app's `rootURL`.\n          See [RouteInfo](/ember/release/classes/RouteInfo) for more info.\n          In the following example `recognize` is used to verify if a path belongs to our\n       application before transitioning to it.\n          ```\n       import Component from '@ember/component';\n       import { service } from '@ember/service';\n          export default class extends Component {\n         @service router;\n         path = '/';\n            click() {\n           if (this.router.recognize(this.path)) {\n             this.router.transitionTo(this.path);\n           }\n         }\n       }\n       ```\n           @method recognize\n        @param {String} url\n        @return {RouteInfo | null}\n        @public\n      */\n    recognize(url) {\n      (true && !(url.indexOf(this.rootURL) === 0) && (0, _debug.assert)(`You must pass a url that begins with the application's rootURL \"${this.rootURL}\"`, url.indexOf(this.rootURL) === 0));\n      this._router.setupRouter();\n      var internalURL = cleanURL(url, this.rootURL);\n      return this._router._routerMicrolib.recognize(internalURL);\n    }\n    /**\n      Takes a string URL and returns a promise that resolves to a\n      `RouteInfoWithAttributes` for the leafmost route represented by the URL.\n      The promise rejects if the URL is not recognized or an unhandled exception\n      is encountered. This method expects to receive the actual URL as seen by\n      the browser including the app's `rootURL`.\n           @method recognizeAndLoad\n        @param {String} url\n        @return {RouteInfo}\n        @public\n     */\n    recognizeAndLoad(url) {\n      (true && !(url.indexOf(this.rootURL) === 0) && (0, _debug.assert)(`You must pass a url that begins with the application's rootURL \"${this.rootURL}\"`, url.indexOf(this.rootURL) === 0));\n      this._router.setupRouter();\n      var internalURL = cleanURL(url, this.rootURL);\n      return this._router._routerMicrolib.recognizeAndLoad(internalURL);\n    }\n    /**\n      You can register a listener for events emitted by this service with `.on()`:\n         ```app/routes/contact-form.js\n      import Route from '@ember/routing';\n      import { service } from '@ember/service';\n         export default class extends Route {\n        @service router;\n           activate() {\n          this.router.on('routeWillChange', (transition) => {\n            if (!transition.to.find(route => route.name === this.routeName)) {\n              alert(\"Please save or cancel your changes.\");\n              transition.abort();\n            }\n          })\n        }\n      }\n      ```\n         @method on\n      @param {String} eventName\n      @param {Function} callback\n      @public\n    */\n    /**\n      You can unregister a listener for events emitted by this service with `.off()`:\n         ```app/routes/contact-form.js\n      import Route from '@ember/routing';\n      import { service } from '@ember/service';\n         export default class ContactFormRoute extends Route {\n        @service router;\n           callback = (transition) => {\n          if (!transition.to.find(route => route.name === this.routeName)) {\n            alert('Please save or cancel your changes.');\n            transition.abort();\n          }\n        };\n           activate() {\n          this.router.on('routeWillChange', this.callback);\n        }\n           deactivate() {\n          this.router.off('routeWillChange', this.callback);\n        }\n      }\n      ```\n         @method off\n      @param {String} eventName\n      @param {Function} callback\n      @public\n    */\n    /**\n      The `routeWillChange` event is fired at the beginning of any\n      attempted transition with a `Transition` object as the sole\n      argument. This action can be used for aborting, redirecting,\n      or decorating the transition from the currently active routes.\n         A good example is preventing navigation when a form is\n      half-filled out:\n         ```app/routes/contact-form.js\n      import Route from '@ember/routing';\n      import { service } from '@ember/service';\n         export default class extends Route {\n        @service router;\n           activate() {\n          this.router.on('routeWillChange', (transition) => {\n            if (!transition.to.find(route => route.name === this.routeName)) {\n              alert(\"Please save or cancel your changes.\");\n              transition.abort();\n            }\n          })\n        }\n      }\n      ```\n         The `routeWillChange` event fires whenever a new route is chosen as the desired target of a transition. This includes `transitionTo`, `replaceWith`, all redirection for any reason including error handling, and abort. Aborting implies changing the desired target back to where you already were. Once a transition has completed, `routeDidChange` fires.\n         @event routeWillChange\n      @param {Transition} transition\n      @public\n    */\n    /**\n      The `routeDidChange` event only fires once a transition has settled.\n      This includes aborts and error substates. Like the `routeWillChange` event\n      it receives a Transition as the sole argument.\n         A good example is sending some analytics when the route has transitioned:\n         ```app/routes/contact-form.js\n      import Route from '@ember/routing';\n      import { service } from '@ember/service';\n         export default class extends Route {\n        @service router;\n           activate() {\n          this.router.on('routeDidChange', (transition) => {\n            ga.send('pageView', {\n              current: transition.to.name,\n              from: transition.from.name\n            });\n          })\n        }\n      }\n      ```\n         `routeDidChange` will be called after any `Route`'s\n      [didTransition](/ember/release/classes/Route/events/didTransition?anchor=didTransition)\n      action has been fired.\n      The updates of properties\n      [currentURL](/ember/release/classes/RouterService/properties/currentURL?anchor=currentURL),\n      [currentRouteName](/ember/release/classes/RouterService/properties/currentURL?anchor=currentRouteName)\n      and\n      [currentRoute](/ember/release/classes/RouterService/properties/currentURL?anchor=currentRoute)\n      are completed at the time `routeDidChange` is called.\n         @event routeDidChange\n      @param {Transition} transition\n      @public\n    */\n    /**\n     * Refreshes all currently active routes, doing a full transition.\n     * If a route name is provided and refers to a currently active route,\n     * it will refresh only that route and its descendents.\n     * Returns a promise that will be resolved once the refresh is complete.\n     * All resetController, beforeModel, model, afterModel, redirect, and setupController\n     * hooks will be called again. You will get new data from the model hook.\n     *\n     * @method refresh\n     * @param {String} [routeName] the route to refresh (along with all child routes)\n     * @return Transition\n     * @public\n     */\n    refresh(pivotRouteName) {\n      if (!pivotRouteName) {\n        return this._router._routerMicrolib.refresh();\n      }\n      (true && !(this._router.hasRoute(pivotRouteName)) && (0, _debug.assert)(`The route \"${pivotRouteName}\" was not found`, this._router.hasRoute(pivotRouteName)));\n      (true && !(this.isActive(pivotRouteName)) && (0, _debug.assert)(`The route \"${pivotRouteName}\" is currently not active`, this.isActive(pivotRouteName)));\n      var owner = (0, _owner.getOwner)(this);\n      (true && !(owner) && (0, _debug.assert)('RouterService is unexpectedly missing an owner', owner));\n      var pivotRoute = owner.lookup(`route:${pivotRouteName}`);\n      // R could be instantiated with a different sub-type\n      // @ts-ignore\n      return this._router._routerMicrolib.refresh(pivotRoute);\n    }\n  }\n  _exports.default = RouterService;\n  __decorate([(0, _computed.readOnly)('_router.currentRouteName')], RouterService.prototype, \"currentRouteName\", void 0);\n  __decorate([(0, _computed.readOnly)('_router.currentURL')], RouterService.prototype, \"currentURL\", void 0);\n  __decorate([(0, _computed.readOnly)('_router.location')], RouterService.prototype, \"location\", void 0);\n  __decorate([(0, _computed.readOnly)('_router.rootURL')], RouterService.prototype, \"rootURL\", void 0);\n  __decorate([(0, _computed.readOnly)('_router.currentRoute')], RouterService.prototype, \"currentRoute\", void 0);\n});","define(\"@ember/routing/router\", [\"exports\", \"@ember/-internals/container\", \"@ember/object\", \"@ember/owner\", \"@ember/routing/-internals\", \"@ember/routing/lib/utils\", \"@ember/routing/location\", \"@ember/array\", \"@ember/utils\", \"@ember/object/evented\", \"@ember/debug\", \"@ember/runloop\", \"@ember/routing/route\", \"router_js\", \"@ember/engine/instance\"], function (_exports, _container, _object, _owner, _internals, _utils, _location, _array, _utils2, _evented, _debug, _runloop, _route, _router_js, _instance) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.triggerEvent = triggerEvent;\n  /**\n  @module @ember/routing/router\n  */\n  function defaultDidTransition(infos) {\n    updatePaths(this);\n    this._cancelSlowTransitionTimer();\n    this.notifyPropertyChange('url');\n    this.set('currentState', this.targetState);\n    if (true /* DEBUG */) {\n      // @ts-expect-error namespace isn't public\n      if (this.namespace.LOG_TRANSITIONS) {\n        // eslint-disable-next-line no-console\n        console.log(`Transitioned into '${EmberRouter._routePath(infos)}'`);\n      }\n    }\n  }\n  function defaultWillTransition(oldInfos, newInfos) {\n    if (true /* DEBUG */) {\n      // @ts-expect-error namespace isn't public\n      if (this.namespace.LOG_TRANSITIONS) {\n        // eslint-disable-next-line no-console\n        console.log(`Preparing to transition from '${EmberRouter._routePath(oldInfos)}' to '${EmberRouter._routePath(newInfos)}'`);\n      }\n    }\n  }\n  var freezeRouteInfo;\n  if (true /* DEBUG */) {\n    freezeRouteInfo = transition => {\n      if (transition.from !== null && !Object.isFrozen(transition.from)) {\n        Object.freeze(transition.from);\n      }\n      if (transition.to !== null && !Object.isFrozen(transition.to)) {\n        Object.freeze(transition.to);\n      }\n    };\n  }\n  function K() {\n    return this;\n  }\n  var {\n    slice\n  } = Array.prototype;\n  /**\n    The `EmberRouter` class manages the application state and URLs. Refer to\n    the [routing guide](https://guides.emberjs.com/release/routing/) for documentation.\n  \n    @class EmberRouter\n    @extends EmberObject\n    @uses Evented\n    @public\n  */\n  class EmberRouter extends _object.default.extend(_evented.default) {\n    /**\n      The `Router.map` function allows you to define mappings from URLs to routes\n      in your application. These mappings are defined within the\n      supplied callback function using `this.route`.\n         The first parameter is the name of the route which is used by default as the\n      path name as well.\n         The second parameter is the optional options hash. Available options are:\n           * `path`: allows you to provide your own path as well as mark dynamic\n          segments.\n        * `resetNamespace`: false by default; when nesting routes, ember will\n          combine the route names to form the fully-qualified route name, which is\n          used with `{{link-to}}` or manually transitioning to routes. Setting\n          `resetNamespace: true` will cause the route not to inherit from its\n          parent route's names. This is handy for preventing extremely long route names.\n          Keep in mind that the actual URL path behavior is still retained.\n         The third parameter is a function, which can be used to nest routes.\n      Nested routes, by default, will have the parent route tree's route name and\n      path prepended to it's own.\n         ```app/router.js\n      Router.map(function(){\n        this.route('post', { path: '/post/:post_id' }, function() {\n          this.route('edit');\n          this.route('comments', { resetNamespace: true }, function() {\n            this.route('new');\n          });\n        });\n      });\n      ```\n         @method map\n      @param callback\n      @public\n    */\n    static map(callback) {\n      if (!this.dslCallbacks) {\n        this.dslCallbacks = [];\n        // FIXME: Can we remove this?\n        this.reopenClass({\n          dslCallbacks: this.dslCallbacks\n        });\n      }\n      this.dslCallbacks.push(callback);\n      return this;\n    }\n    static _routePath(routeInfos) {\n      var path = [];\n      // We have to handle coalescing resource names that\n      // are prefixed with their parent's names, e.g.\n      // ['foo', 'foo.bar.baz'] => 'foo.bar.baz', not 'foo.foo.bar.baz'\n      function intersectionMatches(a1, a2) {\n        for (var i = 0; i < a1.length; ++i) {\n          if (a1[i] !== a2[i]) {\n            return false;\n          }\n        }\n        return true;\n      }\n      var name, nameParts, oldNameParts;\n      for (var i = 1; i < routeInfos.length; i++) {\n        var routeInfo = routeInfos[i];\n        (true && !(routeInfo) && (0, _debug.assert)('has routeInfo', routeInfo));\n        name = routeInfo.name;\n        nameParts = name.split('.');\n        oldNameParts = slice.call(path);\n        while (oldNameParts.length) {\n          if (intersectionMatches(oldNameParts, nameParts)) {\n            break;\n          }\n          oldNameParts.shift();\n        }\n        path.push(...nameParts.slice(oldNameParts.length));\n      }\n      return path.join('.');\n    }\n    // Note that owner is actually required in this scenario, but since it is strictly\n    // optional in other contexts trying to make it required here confuses TS.\n    constructor(owner) {\n      super(owner);\n      this._didSetupRouter = false;\n      this._initialTransitionStarted = false;\n      this.currentURL = null;\n      this.currentRouteName = null;\n      this.currentPath = null;\n      this.currentRoute = null;\n      this._qpCache = Object.create(null);\n      // Set of QueryParam['urlKey']\n      this._qpUpdates = new Set();\n      this._queuedQPChanges = {};\n      this._toplevelView = null;\n      this._handledErrors = new Set();\n      this._engineInstances = Object.create(null);\n      this._engineInfoByRoute = Object.create(null);\n      this._slowTransitionTimer = null;\n      this.currentState = null;\n      this.targetState = null;\n      (true && !(owner) && (0, _debug.assert)('BUG: Missing owner', owner));\n      this._resetQueuedQueryParameterChanges();\n      this.namespace = owner.lookup('application:main');\n      var bucketCache = owner.lookup((0, _container.privatize)`-bucket-cache:main`);\n      (true && !(bucketCache instanceof _internals.BucketCache) && (0, _debug.assert)('BUG: BucketCache should always be present', bucketCache instanceof _internals.BucketCache));\n      this._bucketCache = bucketCache;\n      var routerService = owner.lookup('service:router');\n      (true && !(routerService !== undefined) && (0, _debug.assert)('BUG: RouterService should always be present', routerService !== undefined));\n      this._routerService = routerService;\n    }\n    _initRouterJs() {\n      var location = (0, _object.get)(this, 'location');\n      var router = this;\n      var owner = (0, _owner.getOwner)(this);\n      (true && !(owner) && (0, _debug.assert)('Router is unexpectedly missing an owner', owner));\n      var seen = Object.create(null);\n      class PrivateRouter extends _router_js.default {\n        getRoute(name) {\n          var routeName = name;\n          var routeOwner = owner;\n          var engineInfo = router._engineInfoByRoute[routeName];\n          if (engineInfo) {\n            var engineInstance = router._getEngineInstance(engineInfo);\n            routeOwner = engineInstance;\n            routeName = engineInfo.localFullName;\n          }\n          var fullRouteName = `route:${routeName}`;\n          (true && !(routeOwner) && (0, _debug.assert)('Route is unexpectedly missing an owner', routeOwner));\n          var route = routeOwner.lookup(fullRouteName);\n          if (seen[name]) {\n            (true && !(route) && (0, _debug.assert)('seen routes should exist', route));\n            return route;\n          }\n          seen[name] = true;\n          if (!route) {\n            // SAFETY: this is configured in `commonSetupRegistry` in the\n            // `@ember/application/lib` package.\n            var DefaultRoute = routeOwner.factoryFor('route:basic').class;\n            routeOwner.register(fullRouteName, DefaultRoute.extend());\n            route = routeOwner.lookup(fullRouteName);\n            if (true /* DEBUG */) {\n              if (router.namespace.LOG_ACTIVE_GENERATION) {\n                (0, _debug.info)(`generated -> ${fullRouteName}`, {\n                  fullName: fullRouteName\n                });\n              }\n            }\n          }\n          route._setRouteName(routeName);\n          if (engineInfo && !(0, _route.hasDefaultSerialize)(route)) {\n            throw new Error('Defining a custom serialize method on an Engine route is not supported.');\n          }\n          return route;\n        }\n        getSerializer(name) {\n          var engineInfo = router._engineInfoByRoute[name];\n          // If this is not an Engine route, we fall back to the handler for serialization\n          if (!engineInfo) {\n            return;\n          }\n          return engineInfo.serializeMethod || _route.defaultSerialize;\n        }\n        updateURL(path) {\n          (0, _runloop.once)(() => {\n            location.setURL(path);\n            (0, _object.set)(router, 'currentURL', path);\n          });\n        }\n        // TODO: merge into routeDidChange\n        didTransition(infos) {\n          (true && !(router.didTransition === defaultDidTransition) && (0, _debug.assert)('You attempted to override the \"didTransition\" method which has been deprecated. Please inject the router service and listen to the \"routeDidChange\" event.', router.didTransition === defaultDidTransition));\n          router.didTransition(infos);\n        }\n        // TODO: merge into routeWillChange\n        willTransition(oldInfos, newInfos) {\n          (true && !(router.willTransition === defaultWillTransition) && (0, _debug.assert)('You attempted to override the \"willTransition\" method which has been deprecated. Please inject the router service and listen to the \"routeWillChange\" event.', router.willTransition === defaultWillTransition));\n          router.willTransition(oldInfos, newInfos);\n        }\n        triggerEvent(routeInfos, ignoreFailure, name, args) {\n          return triggerEvent.bind(router)(routeInfos, ignoreFailure, name, args);\n        }\n        routeWillChange(transition) {\n          router.trigger('routeWillChange', transition);\n          if (true /* DEBUG */) {\n            freezeRouteInfo(transition);\n          }\n          router._routerService.trigger('routeWillChange', transition);\n          // in case of intermediate transition we update the current route\n          // to make router.currentRoute.name consistent with router.currentRouteName\n          // see https://github.com/emberjs/ember.js/issues/19449\n          if (transition.isIntermediate) {\n            router.set('currentRoute', transition.to);\n          }\n        }\n        routeDidChange(transition) {\n          router.set('currentRoute', transition.to);\n          (0, _runloop.once)(() => {\n            router.trigger('routeDidChange', transition);\n            if (true /* DEBUG */) {\n              freezeRouteInfo(transition);\n            }\n            router._routerService.trigger('routeDidChange', transition);\n          });\n        }\n        transitionDidError(error, transition) {\n          if (error.wasAborted || transition.isAborted) {\n            // If the error was a transition erorr or the transition aborted\n            // log the abort.\n            return (0, _router_js.logAbort)(transition);\n          } else {\n            // Otherwise trigger the \"error\" event to attempt an intermediate\n            // transition into an error substate\n            transition.trigger(false, 'error', error.error, transition, error.route);\n            if (router._isErrorHandled(error.error)) {\n              // If we handled the error with a substate just roll the state back on\n              // the transition and send the \"routeDidChange\" event for landing on\n              // the error substate and return the error.\n              transition.rollback();\n              this.routeDidChange(transition);\n              return error.error;\n            } else {\n              // If it was not handled, abort the transition completely and return\n              // the error.\n              transition.abort();\n              return error.error;\n            }\n          }\n        }\n        replaceURL(url) {\n          if (location.replaceURL) {\n            var doReplaceURL = () => {\n              location.replaceURL(url);\n              (0, _object.set)(router, 'currentURL', url);\n            };\n            (0, _runloop.once)(doReplaceURL);\n          } else {\n            this.updateURL(url);\n          }\n        }\n      }\n      var routerMicrolib = this._routerMicrolib = new PrivateRouter();\n      var dslCallbacks = this.constructor.dslCallbacks || [K];\n      var dsl = this._buildDSL();\n      dsl.route('application', {\n        path: '/',\n        resetNamespace: true,\n        overrideNameAssertion: true\n      }, function () {\n        for (var i = 0; i < dslCallbacks.length; i++) {\n          dslCallbacks[i].call(this);\n        }\n      });\n      if (true /* DEBUG */) {\n        if (this.namespace.LOG_TRANSITIONS_INTERNAL) {\n          routerMicrolib.log = console.log.bind(console); // eslint-disable-line no-console\n        }\n      }\n\n      routerMicrolib.map(dsl.generate());\n    }\n    _buildDSL() {\n      var enableLoadingSubstates = this._hasModuleBasedResolver();\n      var router = this;\n      var owner = (0, _owner.getOwner)(this);\n      (true && !(owner) && (0, _debug.assert)('Router is unexpectedly missing an owner', owner));\n      var options = {\n        enableLoadingSubstates,\n        resolveRouteMap(name) {\n          return owner.factoryFor(`route-map:${name}`);\n        },\n        addRouteForEngine(name, engineInfo) {\n          if (!router._engineInfoByRoute[name]) {\n            router._engineInfoByRoute[name] = engineInfo;\n          }\n        }\n      };\n      return new _internals.DSL(null, options);\n    }\n    /*\n      Resets all pending query parameter changes.\n      Called after transitioning to a new route\n      based on query parameter changes.\n    */\n    _resetQueuedQueryParameterChanges() {\n      this._queuedQPChanges = {};\n    }\n    _hasModuleBasedResolver() {\n      var owner = (0, _owner.getOwner)(this);\n      (true && !(owner) && (0, _debug.assert)('Router is unexpectedly missing an owner', owner));\n      var resolver = (0, _object.get)(owner, 'application.__registry__.resolver.moduleBasedResolver');\n      return Boolean(resolver);\n    }\n    /**\n      Initializes the current router instance and sets up the change handling\n      event listeners used by the instances `location` implementation.\n         A property named `initialURL` will be used to determine the initial URL.\n      If no value is found `/` will be used.\n         @method startRouting\n      @private\n    */\n    startRouting() {\n      if (this.setupRouter()) {\n        var initialURL = (0, _object.get)(this, 'initialURL');\n        if (initialURL === undefined) {\n          initialURL = (0, _object.get)(this, 'location').getURL();\n        }\n        var initialTransition = this.handleURL(initialURL);\n        if (initialTransition && initialTransition.error) {\n          throw initialTransition.error;\n        }\n      }\n    }\n    setupRouter() {\n      if (this._didSetupRouter) {\n        return false;\n      }\n      this._didSetupRouter = true;\n      this._setupLocation();\n      var location = (0, _object.get)(this, 'location');\n      // Allow the Location class to cancel the router setup while it refreshes\n      // the page\n      if ((0, _object.get)(location, 'cancelRouterSetup')) {\n        return false;\n      }\n      this._initRouterJs();\n      location.onUpdateURL(url => {\n        this.handleURL(url);\n      });\n      return true;\n    }\n    _setOutlets() {\n      // This is triggered async during Route#willDestroy.\n      // If the router is also being destroyed we do not want to\n      // to create another this._toplevelView (and leak the renderer)\n      if (this.isDestroying || this.isDestroyed) {\n        return;\n      }\n      var routeInfos = this._routerMicrolib.currentRouteInfos;\n      if (!routeInfos) {\n        return;\n      }\n      var defaultParentState;\n      var liveRoutes = null;\n      for (var routeInfo of routeInfos) {\n        var route = routeInfo.route;\n        var connections = _route.ROUTE_CONNECTIONS.get(route);\n        var ownState = void 0;\n        if (connections.length === 0) {\n          ownState = representEmptyRoute(liveRoutes, defaultParentState, route);\n        } else {\n          for (var j = 0; j < connections.length; j++) {\n            var appended = appendLiveRoute(liveRoutes, defaultParentState, connections[j]);\n            liveRoutes = appended.liveRoutes;\n            var {\n              name,\n              outlet\n            } = appended.ownState.render;\n            if (name === route.routeName || outlet === 'main') {\n              ownState = appended.ownState;\n            }\n          }\n        }\n        defaultParentState = ownState;\n      }\n      // when a transitionTo happens after the validation phase\n      // during the initial transition _setOutlets is called\n      // when no routes are active. However, it will get called\n      // again with the correct values during the next turn of\n      // the runloop\n      if (!liveRoutes) {\n        return;\n      }\n      if (!this._toplevelView) {\n        var owner = (0, _owner.getOwner)(this);\n        (true && !(owner) && (0, _debug.assert)('Router is unexpectedly missing an owner', owner)); // SAFETY: we don't presently have any type registries internally to make\n        // this safe, so in each of these cases we assume that nothing *else* is\n        // registered at this `FullName`, and simply check to make sure that\n        // *something* is.\n        var OutletView = owner.factoryFor('view:-outlet');\n        (true && !(OutletView !== undefined) && (0, _debug.assert)('[BUG] unexpectedly missing `view:-outlet`', OutletView !== undefined));\n        var application = owner.lookup('application:main');\n        (true && !(application !== undefined) && (0, _debug.assert)('[BUG] unexpectedly missing `application:-main`', application !== undefined));\n        var environment = owner.lookup('-environment:main');\n        (true && !(environment !== undefined) && (0, _debug.assert)('[BUG] unexpectedly missing `-environment:main`', environment !== undefined));\n        var template = owner.lookup('template:-outlet');\n        (true && !(template !== undefined) && (0, _debug.assert)('[BUG] unexpectedly missing `template:-outlet`', template !== undefined));\n        this._toplevelView = OutletView.create({\n          environment,\n          template,\n          application\n        });\n        this._toplevelView.setOutletState(liveRoutes);\n        // TODO(SAFETY): At least one test runs without this set correctly. At a\n        // later time, update the test to configure this correctly. The test ID:\n        // `Router Service - non application test:  RouterService#transitionTo with basic route`\n        var instance = owner.lookup('-application-instance:main');\n        // let instance = owner.lookup('-application-instance:main') as ApplicationInstance | undefined;\n        // assert('[BUG] unexpectedly missing `-application-instance:main`', instance !== undefined);\n        if (instance) {\n          // SAFETY: LOL. This is calling a deprecated API with a type that we\n          // cannot actually confirm at a type level *is* a `ViewMixin`. Seems:\n          // not great on multiple fronts!\n          instance.didCreateRootView(this._toplevelView);\n        }\n      } else {\n        this._toplevelView.setOutletState(liveRoutes);\n      }\n    }\n    handleURL(url) {\n      // Until we have an ember-idiomatic way of accessing #hashes, we need to\n      // remove it because router.js doesn't know how to handle it.\n      var _url = url.split(/#(.+)?/)[0];\n      return this._doURLTransition('handleURL', _url);\n    }\n    _doURLTransition(routerJsMethod, url) {\n      this._initialTransitionStarted = true;\n      var transition = this._routerMicrolib[routerJsMethod](url || '/');\n      didBeginTransition(transition, this);\n      return transition;\n    }\n    /**\n      Transition the application into another route. The route may\n      be either a single route or route path:\n         @method transitionTo\n      @param {String} [name] the name of the route or a URL\n      @param {...Object} models the model(s) or identifier(s) to be used while\n        transitioning to the route.\n      @param {Object} [options] optional hash with a queryParams property\n        containing a mapping of query parameters\n      @return {Transition} the transition object associated with this\n        attempted transition\n      @public\n    */\n    transitionTo() {\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n      if ((0, _utils.resemblesURL)(args[0])) {\n        (true && !(!this.isDestroying && !this.isDestroyed) && (0, _debug.assert)(`A transition was attempted from '${this.currentRouteName}' to '${args[0]}' but the application instance has already been destroyed.`, !this.isDestroying && !this.isDestroyed));\n        return this._doURLTransition('transitionTo', args[0]);\n      }\n      var {\n        routeName,\n        models,\n        queryParams\n      } = (0, _utils.extractRouteArgs)(args);\n      (true && !(!this.isDestroying && !this.isDestroyed) && (0, _debug.assert)(`A transition was attempted from '${this.currentRouteName}' to '${routeName}' but the application instance has already been destroyed.`, !this.isDestroying && !this.isDestroyed));\n      return this._doTransition(routeName, models, queryParams);\n    }\n    intermediateTransitionTo(name) {\n      for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n        args[_key2 - 1] = arguments[_key2];\n      }\n      this._routerMicrolib.intermediateTransitionTo(name, ...args);\n      updatePaths(this);\n      if (true /* DEBUG */) {\n        var infos = this._routerMicrolib.currentRouteInfos;\n        if (this.namespace.LOG_TRANSITIONS) {\n          (true && !(infos) && (0, _debug.assert)('expected infos to be set', infos)); // eslint-disable-next-line no-console\n          console.log(`Intermediate-transitioned into '${EmberRouter._routePath(infos)}'`);\n        }\n      }\n    }\n    /**\n      Similar to `transitionTo`, but instead of adding the destination to the browser's URL history,\n      it replaces the entry for the current route.\n      When the user clicks the \"back\" button in the browser, there will be fewer steps.\n      This is most commonly used to manage redirects in a way that does not cause confusing additions\n      to the user's browsing history.\n         @method replaceWith\n      @param {String} [name] the name of the route or a URL\n      @param {...Object} models the model(s) or identifier(s) to be used while\n        transitioning to the route.\n      @param {Object} [options] optional hash with a queryParams property\n        containing a mapping of query parameters\n      @return {Transition} the transition object associated with this\n        attempted transition\n      @public\n    */\n    replaceWith() {\n      return this.transitionTo(...arguments).method('replace');\n    }\n    generate(name) {\n      for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n        args[_key3 - 1] = arguments[_key3];\n      }\n      var url = this._routerMicrolib.generate(name, ...args);\n      (true && !(typeof this.location !== 'string') && (0, _debug.assert)('expected non-string location', typeof this.location !== 'string'));\n      return this.location.formatURL(url);\n    }\n    /**\n      Determines if the supplied route is currently active.\n         @method isActive\n      @param routeName\n      @return {Boolean}\n      @private\n    */\n    isActive(routeName) {\n      return this._routerMicrolib.isActive(routeName);\n    }\n    /**\n      An alternative form of `isActive` that doesn't require\n      manual concatenation of the arguments into a single\n      array.\n         @method isActiveIntent\n      @param routeName\n      @param models\n      @param queryParams\n      @return {Boolean}\n      @private\n      @since 1.7.0\n    */\n    isActiveIntent(routeName, models, queryParams) {\n      return this.currentState.isActiveIntent(routeName, models, queryParams);\n    }\n    send(name) {\n      for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {\n        args[_key4 - 1] = arguments[_key4];\n      }\n      /*name, context*/\n      this._routerMicrolib.trigger(name, ...args);\n    }\n    /**\n      Does this router instance have the given route.\n         @method hasRoute\n      @return {Boolean}\n      @private\n    */\n    hasRoute(route) {\n      return this._routerMicrolib.hasRoute(route);\n    }\n    /**\n      Resets the state of the router by clearing the current route\n      handlers and deactivating them.\n         @private\n      @method reset\n     */\n    reset() {\n      this._didSetupRouter = false;\n      this._initialTransitionStarted = false;\n      if (this._routerMicrolib) {\n        this._routerMicrolib.reset();\n      }\n    }\n    willDestroy() {\n      if (this._toplevelView) {\n        this._toplevelView.destroy();\n        this._toplevelView = null;\n      }\n      super.willDestroy();\n      this.reset();\n      var instances = this._engineInstances;\n      for (var name in instances) {\n        var instanceMap = instances[name];\n        (true && !(instanceMap) && (0, _debug.assert)('has instanceMap', instanceMap));\n        for (var id in instanceMap) {\n          var instance = instanceMap[id];\n          (true && !(instance) && (0, _debug.assert)('has instance', instance));\n          (0, _runloop.run)(instance, 'destroy');\n        }\n      }\n    }\n    /*\n      Called when an active route's query parameter has changed.\n      These changes are batched into a runloop run and trigger\n      a single transition.\n    */\n    _activeQPChanged(queryParameterName, newValue) {\n      this._queuedQPChanges[queryParameterName] = newValue;\n      (0, _runloop.once)(this, this._fireQueryParamTransition);\n    }\n    // The queryParameterName is QueryParam['urlKey']\n    _updatingQPChanged(queryParameterName) {\n      this._qpUpdates.add(queryParameterName);\n    }\n    /*\n      Triggers a transition to a route based on query parameter changes.\n      This is called once per runloop, to batch changes.\n         e.g.\n         if these methods are called in succession:\n      this._activeQPChanged('foo', '10');\n        // results in _queuedQPChanges = { foo: '10' }\n      this._activeQPChanged('bar', false);\n        // results in _queuedQPChanges = { foo: '10', bar: false }\n         _queuedQPChanges will represent both of these changes\n      and the transition using `transitionTo` will be triggered\n      once.\n    */\n    _fireQueryParamTransition() {\n      this.transitionTo({\n        queryParams: this._queuedQPChanges\n      });\n      this._resetQueuedQueryParameterChanges();\n    }\n    _setupLocation() {\n      var location = this.location;\n      var rootURL = this.rootURL;\n      var owner = (0, _owner.getOwner)(this);\n      (true && !(owner) && (0, _debug.assert)('Router is unexpectedly missing an owner', owner));\n      if ('string' === typeof location) {\n        var resolvedLocation = owner.lookup(`location:${location}`);\n        if (location === 'auto') {\n          (true && !(false) && (0, _debug.deprecate)(\"Router location 'auto' is deprecated. Most users will want to set `locationType` to 'history' in config/environment.js for no change in behavior. See deprecation docs for details.\", false, {\n            id: 'deprecate-auto-location',\n            until: '5.0.0',\n            url: 'https://emberjs.com/deprecations/v4.x#toc_deprecate-auto-location',\n            for: 'ember-source',\n            since: {\n              available: '4.1.0',\n              enabled: '4.1.0'\n            }\n          }));\n        }\n        if (resolvedLocation !== undefined) {\n          location = (0, _object.set)(this, 'location', resolvedLocation);\n        } else {\n          // Allow for deprecated registration of custom location API's\n          var options = {\n            implementation: location\n          };\n          location = (0, _object.set)(this, 'location', _location.default.create(options));\n        }\n      }\n      if (location !== null && typeof location === 'object') {\n        if (rootURL) {\n          (0, _object.set)(location, 'rootURL', rootURL);\n        }\n        // Allow the location to do any feature detection, such as AutoLocation\n        // detecting history support. This gives it a chance to set its\n        // `cancelRouterSetup` property which aborts routing.\n        if (typeof location.detect === 'function') {\n          if (this.location !== 'auto') {\n            (true && !(false) && (0, _debug.deprecate)('The `detect` method on the Location object is deprecated. If you need detection you can run your detection code in app.js, before setting the location type.', false, {\n              id: 'deprecate-auto-location',\n              until: '5.0.0',\n              url: 'https://emberjs.com/deprecations/v4.x#toc_deprecate-auto-location',\n              for: 'ember-source',\n              since: {\n                available: '4.1.0',\n                enabled: '4.1.0'\n              }\n            }));\n          }\n          location.detect();\n        }\n        // ensure that initState is called AFTER the rootURL is set on\n        // the location instance\n        if (typeof location.initState === 'function') {\n          location.initState();\n        }\n      }\n    }\n    /**\n      Serializes the given query params according to their QP meta information.\n         @private\n      @method _serializeQueryParams\n      @param {Arrray<RouteInfo>} routeInfos\n      @param {Object} queryParams\n      @return {Void}\n    */\n    _serializeQueryParams(routeInfos, queryParams) {\n      forEachQueryParam(this, routeInfos, queryParams, (key, value, qp) => {\n        if (qp) {\n          delete queryParams[key];\n          queryParams[qp.urlKey] = qp.route.serializeQueryParam(value, qp.urlKey, qp.type);\n        } else if (value === undefined) {\n          return; // We don't serialize undefined values\n        } else {\n          queryParams[key] = this._serializeQueryParam(value, (0, _utils2.typeOf)(value));\n        }\n      });\n    }\n    /**\n      Serializes the value of a query parameter based on a type\n         @private\n      @method _serializeQueryParam\n      @param {Object} value\n      @param {String} type\n    */\n    _serializeQueryParam(value, type) {\n      if (value === null || value === undefined) {\n        return value;\n      } else if (type === 'array') {\n        return JSON.stringify(value);\n      }\n      return `${value}`;\n    }\n    /**\n      Deserializes the given query params according to their QP meta information.\n         @private\n      @method _deserializeQueryParams\n      @param {Array<RouteInfo>} routeInfos\n      @param {Object} queryParams\n      @return {Void}\n    */\n    _deserializeQueryParams(routeInfos, queryParams) {\n      forEachQueryParam(this, routeInfos, queryParams, (key, value, qp) => {\n        // If we don't have QP meta info for a given key, then we do nothing\n        // because all values will be treated as strings\n        if (qp) {\n          delete queryParams[key];\n          queryParams[qp.prop] = qp.route.deserializeQueryParam(value, qp.urlKey, qp.type);\n        }\n      });\n    }\n    /**\n      Deserializes the value of a query parameter based on a default type\n         @private\n      @method _deserializeQueryParam\n      @param {Object} value\n      @param {String} defaultType\n    */\n    _deserializeQueryParam(value, defaultType) {\n      if (value === null || value === undefined) {\n        return value;\n      } else if (defaultType === 'boolean') {\n        return value === 'true';\n      } else if (defaultType === 'number') {\n        return Number(value).valueOf();\n      } else if (defaultType === 'array') {\n        return (0, _array.A)(JSON.parse(value));\n      }\n      return value;\n    }\n    /**\n      Removes (prunes) any query params with default values from the given QP\n      object. Default values are determined from the QP meta information per key.\n         @private\n      @method _pruneDefaultQueryParamValues\n      @param {Array<RouteInfo>} routeInfos\n      @param {Object} queryParams\n      @return {Void}\n    */\n    _pruneDefaultQueryParamValues(routeInfos, queryParams) {\n      var qps = this._queryParamsFor(routeInfos);\n      for (var key in queryParams) {\n        var qp = qps.map[key];\n        if (qp && qp.serializedDefaultValue === queryParams[key]) {\n          delete queryParams[key];\n        }\n      }\n    }\n    _doTransition(_targetRouteName, models, _queryParams, _fromRouterService) {\n      var targetRouteName = _targetRouteName || (0, _utils.getActiveTargetName)(this._routerMicrolib);\n      (true && !(Boolean(targetRouteName) && this._routerMicrolib.hasRoute(targetRouteName)) && (0, _debug.assert)(`The route ${targetRouteName} was not found`, Boolean(targetRouteName) && this._routerMicrolib.hasRoute(targetRouteName)));\n      this._initialTransitionStarted = true;\n      var queryParams = {};\n      this._processActiveTransitionQueryParams(targetRouteName, models, queryParams, _queryParams);\n      Object.assign(queryParams, _queryParams);\n      this._prepareQueryParams(targetRouteName, models, queryParams, Boolean(_fromRouterService));\n      var transition = this._routerMicrolib.transitionTo(targetRouteName, ...models, {\n        queryParams\n      });\n      didBeginTransition(transition, this);\n      return transition;\n    }\n    _processActiveTransitionQueryParams(targetRouteName, models, queryParams, _queryParams) {\n      // merge in any queryParams from the active transition which could include\n      // queryParams from the url on initial load.\n      if (!this._routerMicrolib.activeTransition) {\n        return;\n      }\n      var unchangedQPs = {};\n      var qpUpdates = this._qpUpdates;\n      var params = (0, _route.getFullQueryParams)(this, this._routerMicrolib.activeTransition[_router_js.STATE_SYMBOL]);\n      for (var key in params) {\n        if (!qpUpdates.has(key)) {\n          unchangedQPs[key] = params[key];\n        }\n      }\n      // We need to fully scope queryParams so that we can create one object\n      // that represents both passed-in queryParams and ones that aren't changed\n      // from the active transition.\n      this._fullyScopeQueryParams(targetRouteName, models, _queryParams);\n      this._fullyScopeQueryParams(targetRouteName, models, unchangedQPs);\n      Object.assign(queryParams, unchangedQPs);\n    }\n    /**\n      Prepares the query params for a URL or Transition. Restores any undefined QP\n      keys/values, serializes all values, and then prunes any default values.\n         @private\n      @method _prepareQueryParams\n      @param {String} targetRouteName\n      @param {Array<Object>} models\n      @param {Object} queryParams\n      @param {boolean} keepDefaultQueryParamValues\n      @return {Void}\n    */\n    _prepareQueryParams(targetRouteName, models, queryParams, _fromRouterService) {\n      var state = calculatePostTransitionState(this, targetRouteName, models);\n      this._hydrateUnsuppliedQueryParams(state, queryParams, Boolean(_fromRouterService));\n      this._serializeQueryParams(state.routeInfos, queryParams);\n      if (!_fromRouterService) {\n        this._pruneDefaultQueryParamValues(state.routeInfos, queryParams);\n      }\n    }\n    /**\n      Returns the meta information for the query params of a given route. This\n      will be overridden to allow support for lazy routes.\n         @private\n      @method _getQPMeta\n      @param {RouteInfo} routeInfo\n      @return {Object}\n    */\n    _getQPMeta(routeInfo) {\n      var route = routeInfo.route;\n      return route && (0, _object.get)(route, '_qp');\n    }\n    /**\n      Returns a merged query params meta object for a given set of routeInfos.\n      Useful for knowing what query params are available for a given route hierarchy.\n         @private\n      @method _queryParamsFor\n      @param {Array<RouteInfo>} routeInfos\n      @return {Object}\n     */\n    _queryParamsFor(routeInfos) {\n      var routeInfoLength = routeInfos.length;\n      var leafRouteName = routeInfos[routeInfoLength - 1].name;\n      var cached = this._qpCache[leafRouteName];\n      if (cached !== undefined) {\n        return cached;\n      }\n      var shouldCache = true;\n      var map = {};\n      var qps = [];\n      var qpsByUrlKey = true /* DEBUG */ ? {} : null;\n      var qpMeta;\n      var urlKey;\n      var qpOther;\n      for (var routeInfo of routeInfos) {\n        qpMeta = this._getQPMeta(routeInfo);\n        if (!qpMeta) {\n          shouldCache = false;\n          continue;\n        }\n        // Loop over each QP to make sure we don't have any collisions by urlKey\n        for (var qp of qpMeta.qps) {\n          if (true /* DEBUG */) {\n            urlKey = qp.urlKey;\n            qpOther = qpsByUrlKey[urlKey];\n            if (qpOther && qpOther.controllerName !== qp.controllerName) {\n              (true && !(false) && (0, _debug.assert)(`You're not allowed to have more than one controller property map to the same query param key, but both \\`${qpOther.scopedPropertyName}\\` and \\`${qp.scopedPropertyName}\\` map to \\`${urlKey}\\`. You can fix this by mapping one of the controller properties to a different query param key via the \\`as\\` config option, e.g. \\`${qpOther.prop}: { as: 'other-${qpOther.prop}' }\\``, false));\n            }\n            qpsByUrlKey[urlKey] = qp;\n          }\n          qps.push(qp);\n        }\n        Object.assign(map, qpMeta.map);\n      }\n      var finalQPMeta = {\n        qps,\n        map\n      };\n      if (shouldCache) {\n        this._qpCache[leafRouteName] = finalQPMeta;\n      }\n      return finalQPMeta;\n    }\n    /**\n      Maps all query param keys to their fully scoped property name of the form\n      `controllerName:propName`.\n         @private\n      @method _fullyScopeQueryParams\n      @param {String} leafRouteName\n      @param {Array<Object>} contexts\n      @param {Object} queryParams\n      @return {Void}\n    */\n    _fullyScopeQueryParams(leafRouteName, contexts, queryParams) {\n      var state = calculatePostTransitionState(this, leafRouteName, contexts);\n      var routeInfos = state.routeInfos;\n      var qpMeta;\n      for (var routeInfo of routeInfos) {\n        qpMeta = this._getQPMeta(routeInfo);\n        if (!qpMeta) {\n          continue;\n        }\n        for (var qp of qpMeta.qps) {\n          var presentProp = qp.prop in queryParams && qp.prop || qp.scopedPropertyName in queryParams && qp.scopedPropertyName || qp.urlKey in queryParams && qp.urlKey;\n          if (presentProp) {\n            if (presentProp !== qp.scopedPropertyName) {\n              queryParams[qp.scopedPropertyName] = queryParams[presentProp];\n              delete queryParams[presentProp];\n            }\n          }\n        }\n      }\n    }\n    /**\n      Hydrates (adds/restores) any query params that have pre-existing values into\n      the given queryParams hash. This is what allows query params to be \"sticky\"\n      and restore their last known values for their scope.\n         @private\n      @method _hydrateUnsuppliedQueryParams\n      @param {TransitionState} state\n      @param {Object} queryParams\n      @return {Void}\n    */\n    _hydrateUnsuppliedQueryParams(state, queryParams, _fromRouterService) {\n      var routeInfos = state.routeInfos;\n      var appCache = this._bucketCache;\n      var qpMeta;\n      var qp;\n      var presentProp;\n      for (var routeInfo of routeInfos) {\n        qpMeta = this._getQPMeta(routeInfo);\n        if (!qpMeta) {\n          continue;\n        }\n        // Needs to stay for index loop to avoid throwIfClosureRequired\n        for (var j = 0, qpLen = qpMeta.qps.length; j < qpLen; ++j) {\n          qp = qpMeta.qps[j];\n          (true && !(qp) && (0, _debug.assert)('expected qp', qp));\n          presentProp = qp.prop in queryParams && qp.prop || qp.scopedPropertyName in queryParams && qp.scopedPropertyName || qp.urlKey in queryParams && qp.urlKey;\n          (true && !(function () {\n            if (qp.urlKey === presentProp || qp.scopedPropertyName === presentProp) {\n              return true;\n            }\n            if (_fromRouterService && presentProp !== false && qp.urlKey !== qp.prop) {\n              // assumptions (mainly from current transitionTo_test):\n              // - this is only supposed to be run when there is an alias to a query param and the alias is used to set the param\n              // - when there is no alias: qp.urlKey == qp.prop\n              return false;\n            }\n            return true;\n          }()) && (0, _debug.assert)(`You passed the \\`${presentProp}\\` query parameter during a transition into ${qp.route.routeName}, please update to ${qp.urlKey}`, function () {\n            if (qp.urlKey === presentProp || qp.scopedPropertyName === presentProp) {\n              return true;\n            }\n            if (_fromRouterService && presentProp !== false && qp.urlKey !== qp.prop) {\n              return false;\n            }\n            return true;\n          }()));\n          if (presentProp) {\n            if (presentProp !== qp.scopedPropertyName) {\n              queryParams[qp.scopedPropertyName] = queryParams[presentProp];\n              delete queryParams[presentProp];\n            }\n          } else {\n            var cacheKey = (0, _utils.calculateCacheKey)(qp.route.fullRouteName, qp.parts, state.params);\n            (true && !(appCache) && (0, _debug.assert)('ROUTER BUG: expected appCache to be defined. This is an internal bug, please open an issue on Github if you see this message!', appCache));\n            queryParams[qp.scopedPropertyName] = appCache.lookup(cacheKey, qp.prop, qp.defaultValue);\n          }\n        }\n      }\n    }\n    _scheduleLoadingEvent(transition, originRoute) {\n      this._cancelSlowTransitionTimer();\n      this._slowTransitionTimer = (0, _runloop.scheduleOnce)('routerTransitions', this, this._handleSlowTransition, transition, originRoute);\n    }\n    _handleSlowTransition(transition, originRoute) {\n      if (!this._routerMicrolib.activeTransition) {\n        // Don't fire an event if we've since moved on from\n        // the transition that put us in a loading state.\n        return;\n      }\n      var targetState = new _internals.RouterState(this, this._routerMicrolib, this._routerMicrolib.activeTransition[_router_js.STATE_SYMBOL]);\n      this.set('targetState', targetState);\n      transition.trigger(true, 'loading', transition, originRoute);\n    }\n    _cancelSlowTransitionTimer() {\n      if (this._slowTransitionTimer) {\n        (0, _runloop.cancel)(this._slowTransitionTimer);\n      }\n      this._slowTransitionTimer = null;\n    }\n    // These three helper functions are used to ensure errors aren't\n    // re-raised if they're handled in a route's error action.\n    _markErrorAsHandled(error) {\n      this._handledErrors.add(error);\n    }\n    _isErrorHandled(error) {\n      return this._handledErrors.has(error);\n    }\n    _clearHandledError(error) {\n      this._handledErrors.delete(error);\n    }\n    _getEngineInstance(_ref) {\n      var {\n        name,\n        instanceId,\n        mountPoint\n      } = _ref;\n      var engineInstances = this._engineInstances;\n      var namedInstances = engineInstances[name];\n      if (!namedInstances) {\n        namedInstances = Object.create(null);\n        engineInstances[name] = namedInstances;\n      }\n      // We just set these!\n      (true && !(namedInstances) && (0, _debug.assert)('has namedInstances', namedInstances));\n      var engineInstance = namedInstances[instanceId];\n      if (!engineInstance) {\n        var owner = (0, _owner.getOwner)(this);\n        (true && !(owner instanceof _instance.default) && (0, _debug.assert)('Expected router to have EngineInstance as owner', owner instanceof _instance.default));\n        (true && !(owner.hasRegistration(`engine:${name}`)) && (0, _debug.assert)(`You attempted to mount the engine '${name}' in your router map, but the engine can not be found.`, owner.hasRegistration(`engine:${name}`)));\n        engineInstance = owner.buildChildEngineInstance(name, {\n          routable: true,\n          mountPoint\n        });\n        engineInstance.boot();\n        namedInstances[instanceId] = engineInstance;\n      }\n      return engineInstance;\n    }\n  }\n  /*\n    Helper function for iterating over routes in a set of routeInfos that are\n    at or above the given origin route. Example: if `originRoute` === 'foo.bar'\n    and the routeInfos given were for 'foo.bar.baz', then the given callback\n    will be invoked with the routes for 'foo.bar', 'foo', and 'application'\n    individually.\n  \n    If the callback returns anything other than `true`, then iteration will stop.\n  \n    @private\n    @param {Route} originRoute\n    @param {Array<RouteInfo>} routeInfos\n    @param {Function} callback\n    @return {Void}\n   */\n  function forEachRouteAbove(routeInfos, callback) {\n    for (var i = routeInfos.length - 1; i >= 0; --i) {\n      var routeInfo = routeInfos[i];\n      (true && !(routeInfo) && (0, _debug.assert)('has routeInfo', routeInfo));\n      var route = routeInfo.route;\n      // routeInfo.handler being `undefined` generally means either:\n      //\n      // 1. an error occurred during creation of the route in question\n      // 2. the route is across an async boundary (e.g. within an engine)\n      //\n      // In both of these cases, we cannot invoke the callback on that specific\n      // route, because it just doesn't exist...\n      if (route === undefined) {\n        continue;\n      }\n      if (callback(route, routeInfo) !== true) {\n        return;\n      }\n    }\n  }\n  // These get invoked when an action bubbles above ApplicationRoute\n  // and are not meant to be overridable.\n  var defaultActionHandlers = {\n    willResolveModel(_routeInfos, transition, originRoute) {\n      this._scheduleLoadingEvent(transition, originRoute);\n    },\n    // Attempt to find an appropriate error route or substate to enter.\n    error(routeInfos, error, transition) {\n      var router = this;\n      var routeInfoWithError = routeInfos[routeInfos.length - 1];\n      forEachRouteAbove(routeInfos, (route, routeInfo) => {\n        // We don't check the leaf most routeInfo since that would\n        // technically be below where we're at in the route hierarchy.\n        if (routeInfo !== routeInfoWithError) {\n          // Check for the existence of an 'error' route.\n          var errorRouteName = findRouteStateName(route, 'error');\n          if (errorRouteName) {\n            router._markErrorAsHandled(error);\n            router.intermediateTransitionTo(errorRouteName, error);\n            return false;\n          }\n        }\n        // Check for an 'error' substate route\n        var errorSubstateName = findRouteSubstateName(route, 'error');\n        if (errorSubstateName) {\n          router._markErrorAsHandled(error);\n          router.intermediateTransitionTo(errorSubstateName, error);\n          return false;\n        }\n        return true;\n      });\n      logError(error, `Error while processing route: ${transition.targetName}`);\n    },\n    // Attempt to find an appropriate loading route or substate to enter.\n    loading(routeInfos, transition) {\n      var router = this;\n      var routeInfoWithSlowLoading = routeInfos[routeInfos.length - 1];\n      forEachRouteAbove(routeInfos, (route, routeInfo) => {\n        // We don't check the leaf most routeInfos since that would\n        // technically be below where we're at in the route hierarchy.\n        if (routeInfo !== routeInfoWithSlowLoading) {\n          // Check for the existence of a 'loading' route.\n          var loadingRouteName = findRouteStateName(route, 'loading');\n          if (loadingRouteName) {\n            router.intermediateTransitionTo(loadingRouteName);\n            return false;\n          }\n        }\n        // Check for loading substate\n        var loadingSubstateName = findRouteSubstateName(route, 'loading');\n        if (loadingSubstateName) {\n          router.intermediateTransitionTo(loadingSubstateName);\n          return false;\n        }\n        // Don't bubble above pivot route.\n        return transition.pivotHandler !== route;\n      });\n    }\n  };\n  function logError(_error, initialMessage) {\n    var errorArgs = [];\n    var error;\n    if (_error && typeof _error === 'object' && typeof _error.errorThrown === 'object') {\n      error = _error.errorThrown;\n    } else {\n      error = _error;\n    }\n    if (initialMessage) {\n      errorArgs.push(initialMessage);\n    }\n    if (error) {\n      if (error.message) {\n        errorArgs.push(error.message);\n      }\n      if (error.stack) {\n        errorArgs.push(error.stack);\n      }\n      if (typeof error === 'string') {\n        errorArgs.push(error);\n      }\n    }\n    console.error(...errorArgs); //eslint-disable-line no-console\n  }\n  /**\n    Finds the name of the substate route if it exists for the given route. A\n    substate route is of the form `route_state`, such as `foo_loading`.\n  \n    @private\n    @param {Route} route\n    @param {String} state\n    @return {String}\n  */\n  function findRouteSubstateName(route, state) {\n    var owner = (0, _owner.getOwner)(route);\n    (true && !(owner) && (0, _debug.assert)('Route is unexpectedly missing an owner', owner));\n    var {\n      routeName,\n      fullRouteName,\n      _router: router\n    } = route;\n    var substateName = `${routeName}_${state}`;\n    var substateNameFull = `${fullRouteName}_${state}`;\n    return routeHasBeenDefined(owner, router, substateName, substateNameFull) ? substateNameFull : '';\n  }\n  /**\n    Finds the name of the state route if it exists for the given route. A state\n    route is of the form `route.state`, such as `foo.loading`. Properly Handles\n    `application` named routes.\n  \n    @private\n    @param {Route} route\n    @param {String} state\n    @return {String}\n  */\n  function findRouteStateName(route, state) {\n    var owner = (0, _owner.getOwner)(route);\n    (true && !(owner) && (0, _debug.assert)('Route is unexpectedly missing an owner', owner));\n    var {\n      routeName,\n      fullRouteName,\n      _router: router\n    } = route;\n    var stateName = routeName === 'application' ? state : `${routeName}.${state}`;\n    var stateNameFull = fullRouteName === 'application' ? state : `${fullRouteName}.${state}`;\n    return routeHasBeenDefined(owner, router, stateName, stateNameFull) ? stateNameFull : '';\n  }\n  /**\n    Determines whether or not a route has been defined by checking that the route\n    is in the Router's map and the owner has a registration for that route.\n  \n    @private\n    @param {Owner} owner\n    @param {Router} router\n    @param {String} localName\n    @param {String} fullName\n    @return {Boolean}\n  */\n  function routeHasBeenDefined(owner, router, localName, fullName) {\n    var routerHasRoute = router.hasRoute(fullName);\n    var ownerHasRoute = owner.factoryFor(`template:${localName}`) || owner.factoryFor(`route:${localName}`);\n    return routerHasRoute && ownerHasRoute;\n  }\n  function triggerEvent(routeInfos, ignoreFailure, name, args) {\n    if (!routeInfos) {\n      if (ignoreFailure) {\n        return;\n      }\n      // TODO: update?\n      throw new Error(`Can't trigger action '${name}' because your app hasn't finished transitioning into its first route. To trigger an action on destination routes during a transition, you can call \\`.send()\\` on the \\`Transition\\` object passed to the \\`model/beforeModel/afterModel\\` hooks.`);\n    }\n    var eventWasHandled = false;\n    var routeInfo, handler, actionHandler;\n    for (var i = routeInfos.length - 1; i >= 0; i--) {\n      routeInfo = routeInfos[i];\n      (true && !(routeInfo) && (0, _debug.assert)('[BUG] Missing routeInfo', routeInfo));\n      handler = routeInfo.route;\n      actionHandler = handler && handler.actions && handler.actions[name];\n      if (actionHandler) {\n        if (actionHandler.apply(handler, args) === true) {\n          eventWasHandled = true;\n        } else {\n          // Should only hit here if a non-bubbling error action is triggered on a route.\n          if (name === 'error') {\n            (true && !(handler) && (0, _debug.assert)('[BUG] Missing handler', handler));\n            handler._router._markErrorAsHandled(args[0]);\n          }\n          return;\n        }\n      }\n    }\n    var defaultHandler = defaultActionHandlers[name];\n    if (defaultHandler) {\n      defaultHandler.call(this, routeInfos, ...args);\n      return;\n    }\n    if (!eventWasHandled && !ignoreFailure) {\n      throw new Error(`Nothing handled the action '${name}'. If you did handle the action, this error can be caused by returning true from an action handler in a controller, causing the action to bubble.`);\n    }\n  }\n  function calculatePostTransitionState(emberRouter, leafRouteName, contexts) {\n    var state = emberRouter._routerMicrolib.applyIntent(leafRouteName, contexts);\n    var {\n      routeInfos,\n      params\n    } = state;\n    for (var routeInfo of routeInfos) {\n      // If the routeInfo is not resolved, we serialize the context into params\n      if (!routeInfo.isResolved) {\n        params[routeInfo.name] = routeInfo.serialize(routeInfo.context);\n      } else {\n        params[routeInfo.name] = routeInfo.params;\n      }\n    }\n    return state;\n  }\n  function updatePaths(router) {\n    var infos = router._routerMicrolib.currentRouteInfos;\n    if (infos.length === 0) {\n      return;\n    }\n    var path = EmberRouter._routePath(infos);\n    var info = infos[infos.length - 1];\n    (true && !(info) && (0, _debug.assert)('expected info', info));\n    var currentRouteName = info.name;\n    var location = router.location;\n    (true && !(typeof location !== 'string') && (0, _debug.assert)('expected location to not be a string', typeof location !== 'string'));\n    var currentURL = location.getURL();\n    (0, _object.set)(router, 'currentPath', path);\n    (0, _object.set)(router, 'currentRouteName', currentRouteName);\n    (0, _object.set)(router, 'currentURL', currentURL);\n  }\n  function didBeginTransition(transition, router) {\n    var routerState = new _internals.RouterState(router, router._routerMicrolib, transition[_router_js.STATE_SYMBOL]);\n    if (!router.currentState) {\n      router.set('currentState', routerState);\n    }\n    router.set('targetState', routerState);\n    transition.promise = transition.catch(error => {\n      if (router._isErrorHandled(error)) {\n        router._clearHandledError(error);\n      } else {\n        throw error;\n      }\n    }, 'Transition Error');\n  }\n  function forEachQueryParam(router, routeInfos, queryParams, callback) {\n    var qpCache = router._queryParamsFor(routeInfos);\n    for (var key in queryParams) {\n      if (!Object.prototype.hasOwnProperty.call(queryParams, key)) {\n        continue;\n      }\n      var value = queryParams[key];\n      var qp = qpCache.map[key];\n      callback(key, value, qp);\n    }\n  }\n  function findLiveRoute(liveRoutes, name) {\n    if (!liveRoutes) {\n      return;\n    }\n    var stack = [liveRoutes];\n    while (stack.length > 0) {\n      var test = stack.shift();\n      if (test.render.name === name) {\n        return test;\n      }\n      var outlets = test.outlets;\n      for (var outletName in outlets) {\n        stack.push(outlets[outletName]);\n      }\n    }\n    return;\n  }\n  function appendLiveRoute(liveRoutes, defaultParentState, renderOptions) {\n    var ownState = {\n      render: renderOptions,\n      outlets: Object.create(null),\n      wasUsed: false\n    };\n    var target;\n    if (renderOptions.into) {\n      target = findLiveRoute(liveRoutes, renderOptions.into);\n    } else {\n      target = defaultParentState;\n    }\n    if (target) {\n      (0, _object.set)(target.outlets, renderOptions.outlet, ownState);\n    } else {\n      liveRoutes = ownState;\n    }\n    return {\n      liveRoutes,\n      ownState\n    };\n  }\n  function representEmptyRoute(liveRoutes, defaultParentState, _ref2) {\n    var {\n      routeName\n    } = _ref2;\n    // the route didn't render anything\n    var alreadyAppended = findLiveRoute(liveRoutes, routeName);\n    if (alreadyAppended) {\n      // But some other route has already rendered our default\n      // template, so that becomes the default target for any\n      // children we may have.\n      return alreadyAppended;\n    } else {\n      // Create an entry to represent our default template name,\n      // just so other routes can target it and inherit its place\n      // in the outlet hierarchy.\n      defaultParentState.outlets['main'] = {\n        render: {\n          name: routeName,\n          outlet: 'main'\n        },\n        outlets: {}\n      };\n      return defaultParentState;\n    }\n  }\n  EmberRouter.reopen({\n    didTransition: defaultDidTransition,\n    willTransition: defaultWillTransition,\n    rootURL: '/',\n    location: 'hash',\n    // FIXME: Does this need to be overrideable via extend?\n    url: (0, _object.computed)(function () {\n      var location = (0, _object.get)(this, 'location');\n      if (typeof location === 'string') {\n        return undefined;\n      }\n      return location.getURL();\n    })\n  });\n  var _default = EmberRouter;\n  _exports.default = _default;\n});","define(\"@ember/routing/transition\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});","define(\"@ember/runloop/index\", [\"exports\", \"@ember/debug\", \"@ember/-internals/error-handling\", \"@ember/-internals/metal\", \"backburner\"], function (_exports, _debug, _errorHandling, _metal, _backburner2) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports._backburner = void 0;\n  _exports._cancelTimers = _cancelTimers;\n  _exports._getCurrentRunLoop = _getCurrentRunLoop;\n  _exports._hasScheduledTimers = _hasScheduledTimers;\n  _exports._rsvpErrorQueue = _exports._queues = void 0;\n  _exports.begin = begin;\n  _exports.bind = bind;\n  _exports.cancel = cancel;\n  _exports.debounce = debounce;\n  _exports.end = end;\n  _exports.join = join;\n  _exports.later = later;\n  _exports.next = next;\n  _exports.once = once;\n  _exports.run = run;\n  _exports.schedule = schedule;\n  _exports.scheduleOnce = scheduleOnce;\n  _exports.throttle = throttle;\n  var currentRunLoop = null;\n  function _getCurrentRunLoop() {\n    return currentRunLoop;\n  }\n  function onBegin(current) {\n    currentRunLoop = current;\n  }\n  function onEnd(_current, next) {\n    currentRunLoop = next;\n    (0, _metal.flushAsyncObservers)();\n  }\n  function flush(queueName, next) {\n    if (queueName === 'render' || queueName === _rsvpErrorQueue) {\n      (0, _metal.flushAsyncObservers)();\n    }\n    next();\n  }\n  var _rsvpErrorQueue = `${Math.random()}${Date.now()}`.replace('.', '');\n  /**\n    Array of named queues. This array determines the order in which queues\n    are flushed at the end of the RunLoop. You can define your own queues by\n    simply adding the queue name to this array. Normally you should not need\n    to inspect or modify this property.\n  \n    @property queues\n    @type Array\n    @default ['actions', 'destroy']\n    @private\n  */\n  _exports._rsvpErrorQueue = _rsvpErrorQueue;\n  var _queues = ['actions',\n  // used in router transitions to prevent unnecessary loading state entry\n  // if all context promises resolve on the 'actions' queue first\n  'routerTransitions', 'render', 'afterRender', 'destroy',\n  // used to re-throw unhandled RSVP rejection errors specifically in this\n  // position to avoid breaking anything rendered in the other sections\n  _rsvpErrorQueue];\n  _exports._queues = _queues;\n  var _backburner = new _backburner2.default(_queues, {\n    defaultQueue: 'actions',\n    onBegin,\n    onEnd,\n    onErrorTarget: _errorHandling.onErrorTarget,\n    onErrorMethod: 'onerror',\n    flush\n  });\n  _exports._backburner = _backburner;\n  function run() {\n    // @ts-expect-error TS doesn't like our spread args\n    return _backburner.run(...arguments);\n  }\n  function join(methodOrTarget, methodOrArg) {\n    for (var _len = arguments.length, additionalArgs = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n      additionalArgs[_key - 2] = arguments[_key];\n    }\n    return _backburner.join(methodOrTarget, methodOrArg, ...additionalArgs);\n  }\n  function bind() {\n    for (var _len2 = arguments.length, curried = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      curried[_key2] = arguments[_key2];\n    }\n    (true && !(function (methodOrTarget, methodOrArg) {\n      // Applies the same logic as backburner parseArgs for detecting if a method\n      // is actually being passed.\n      var length = arguments.length;\n      if (length === 0) {\n        return false;\n      } else if (length === 1) {\n        return typeof methodOrTarget === 'function';\n      } else {\n        return typeof methodOrArg === 'function' ||\n        // second argument is a function\n        methodOrTarget !== null && typeof methodOrArg === 'string' && methodOrArg in methodOrTarget ||\n        // second argument is the name of a method in first argument\n        typeof methodOrTarget === 'function' //first argument is a function\n        ;\n      }\n      // @ts-expect-error TS doesn't like our spread args\n    }(...curried)) && (0, _debug.assert)('could not find a suitable method to bind', function (methodOrTarget, methodOrArg) {\n      var length = arguments.length;\n      if (length === 0) {\n        return false;\n      } else if (length === 1) {\n        return typeof methodOrTarget === 'function';\n      } else {\n        return typeof methodOrArg === 'function' || methodOrTarget !== null && typeof methodOrArg === 'string' && methodOrArg in methodOrTarget || typeof methodOrTarget === 'function';\n      }\n    }(...curried))); // @ts-expect-error TS doesn't like our spread args\n    return function () {\n      for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n        args[_key3] = arguments[_key3];\n      }\n      return join(...curried.concat(args));\n    };\n  }\n  /**\n    Begins a new RunLoop. Any deferred actions invoked after the begin will\n    be buffered until you invoke a matching call to `end()`. This is\n    a lower-level way to use a RunLoop instead of using `run()`.\n  \n    ```javascript\n    import { begin, end } from '@ember/runloop';\n  \n    begin();\n    // code to be executed within a RunLoop\n    end();\n    ```\n  \n    @method begin\n    @static\n    @for @ember/runloop\n    @return {void}\n    @public\n  */\n  function begin() {\n    _backburner.begin();\n  }\n  /**\n    Ends a RunLoop. This must be called sometime after you call\n    `begin()` to flush any deferred actions. This is a lower-level way\n    to use a RunLoop instead of using `run()`.\n  \n    ```javascript\n    import { begin, end } from '@ember/runloop';\n  \n    begin();\n    // code to be executed within a RunLoop\n    end();\n    ```\n  \n    @method end\n    @static\n    @for @ember/runloop\n    @return {void}\n    @public\n  */\n  function end() {\n    _backburner.end();\n  }\n  function schedule() {\n    // @ts-expect-error TS doesn't like the rest args here\n    return _backburner.schedule(...arguments);\n  }\n  // Used by global test teardown\n  function _hasScheduledTimers() {\n    return _backburner.hasTimers();\n  }\n  // Used by global test teardown\n  function _cancelTimers() {\n    _backburner.cancelTimers();\n  }\n  function later() {\n    return _backburner.later(...arguments);\n  }\n  function once() {\n    for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n      args[_key4] = arguments[_key4];\n    }\n    // @ts-expect-error TS doesn't like the rest args here\n    return _backburner.scheduleOnce('actions', ...args);\n  }\n  function scheduleOnce() {\n    // @ts-expect-error TS doesn't like the rest args here\n    return _backburner.scheduleOnce(...arguments);\n  }\n  function next() {\n    for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n      args[_key5] = arguments[_key5];\n    }\n    return _backburner.later(...args, 1);\n  }\n  /**\n    Cancels a scheduled item. Must be a value returned by `later()`,\n    `once()`, `scheduleOnce()`, `next()`, `debounce()`, or\n    `throttle()`.\n  \n    ```javascript\n    import {\n      next,\n      cancel,\n      later,\n      scheduleOnce,\n      once,\n      throttle,\n      debounce\n    } from '@ember/runloop';\n  \n    let runNext = next(myContext, function() {\n      // will not be executed\n    });\n  \n    cancel(runNext);\n  \n    let runLater = later(myContext, function() {\n      // will not be executed\n    }, 500);\n  \n    cancel(runLater);\n  \n    let runScheduleOnce = scheduleOnce('afterRender', myContext, function() {\n      // will not be executed\n    });\n  \n    cancel(runScheduleOnce);\n  \n    let runOnce = once(myContext, function() {\n      // will not be executed\n    });\n  \n    cancel(runOnce);\n  \n    let throttle = throttle(myContext, function() {\n      // will not be executed\n    }, 1, false);\n  \n    cancel(throttle);\n  \n    let debounce = debounce(myContext, function() {\n      // will not be executed\n    }, 1);\n  \n    cancel(debounce);\n  \n    let debounceImmediate = debounce(myContext, function() {\n      // will be executed since we passed in true (immediate)\n    }, 100, true);\n  \n    // the 100ms delay until this method can be called again will be canceled\n    cancel(debounceImmediate);\n    ```\n  \n    @method cancel\n    @static\n    @for @ember/runloop\n    @param {Object} timer Timer object to cancel\n    @return {Boolean} true if canceled or false/undefined if it wasn't found\n    @public\n  */\n  function cancel(timer) {\n    return _backburner.cancel(timer);\n  }\n  function debounce() {\n    // @ts-expect-error TS doesn't like the rest args here\n    return _backburner.debounce(...arguments);\n  }\n  function throttle() {\n    // @ts-expect-error TS doesn't like the rest args here\n    return _backburner.throttle(...arguments);\n  }\n});","define(\"@ember/service/index\", [\"exports\", \"@ember/object/-internals\", \"@ember/-internals/metal\"], function (_exports, _internals, _metal) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.inject = inject;\n  _exports.service = service;\n  function inject() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n    return (0, _metal.inject)('service', ...args);\n  }\n  function service() {\n    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n    return (0, _metal.inject)('service', ...args);\n  }\n  /**\n    @class Service\n    @extends EmberObject\n    @since 1.10.0\n    @public\n  */\n  class Service extends _internals.FrameworkObject {}\n  _exports.default = Service;\n  Service.isServiceFactory = true;\n});","define(\"@ember/string/index\", [\"exports\", \"@ember/string/lib/string_registry\", \"@ember/-internals/utils\", \"@ember/debug\", \"@ember/-internals/glimmer\"], function (_exports, _string_registry, _utils, _debug, _glimmer) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"_getStrings\", {\n    enumerable: true,\n    get: function () {\n      return _string_registry.getStrings;\n    }\n  });\n  Object.defineProperty(_exports, \"_setStrings\", {\n    enumerable: true,\n    get: function () {\n      return _string_registry.setStrings;\n    }\n  });\n  _exports.camelize = camelize;\n  _exports.capitalize = capitalize;\n  _exports.classify = classify;\n  _exports.dasherize = dasherize;\n  _exports.decamelize = decamelize;\n  _exports.htmlSafe = htmlSafe;\n  _exports.isHTMLSafe = isHTMLSafe;\n  _exports.underscore = underscore;\n  _exports.w = w;\n  /**\n  @module @ember/string\n  */\n\n  var STRING_DASHERIZE_REGEXP = /[ _]/g;\n  var STRING_DASHERIZE_CACHE = new _utils.Cache(1000, key => decamelize(key).replace(STRING_DASHERIZE_REGEXP, '-'));\n  var STRING_CAMELIZE_REGEXP_1 = /(-|_|\\.|\\s)+(.)?/g;\n  var STRING_CAMELIZE_REGEXP_2 = /(^|\\/)([A-Z])/g;\n  var CAMELIZE_CACHE = new _utils.Cache(1000, key => key.replace(STRING_CAMELIZE_REGEXP_1, (_match, _separator, chr) => chr ? chr.toUpperCase() : '').replace(STRING_CAMELIZE_REGEXP_2, (match /*, separator, chr */) => match.toLowerCase()));\n  var STRING_CLASSIFY_REGEXP_1 = /^(-|_)+(.)?/;\n  var STRING_CLASSIFY_REGEXP_2 = /(.)(-|_|\\.|\\s)+(.)?/g;\n  var STRING_CLASSIFY_REGEXP_3 = /(^|\\/|\\.)([a-z])/g;\n  var CLASSIFY_CACHE = new _utils.Cache(1000, str => {\n    var replace1 = (_match, _separator, chr) => chr ? `_${chr.toUpperCase()}` : '';\n    var replace2 = (_match, initialChar, _separator, chr) => initialChar + (chr ? chr.toUpperCase() : '');\n    var parts = str.split('/');\n    for (var i = 0; i < parts.length; i++) {\n      parts[i] = parts[i].replace(STRING_CLASSIFY_REGEXP_1, replace1).replace(STRING_CLASSIFY_REGEXP_2, replace2);\n    }\n    return parts.join('/').replace(STRING_CLASSIFY_REGEXP_3, (match /*, separator, chr */) => match.toUpperCase());\n  });\n  var STRING_UNDERSCORE_REGEXP_1 = /([a-z\\d])([A-Z]+)/g;\n  var STRING_UNDERSCORE_REGEXP_2 = /-|\\s+/g;\n  var UNDERSCORE_CACHE = new _utils.Cache(1000, str => str.replace(STRING_UNDERSCORE_REGEXP_1, '$1_$2').replace(STRING_UNDERSCORE_REGEXP_2, '_').toLowerCase());\n  var STRING_CAPITALIZE_REGEXP = /(^|\\/)([a-z\\u00C0-\\u024F])/g;\n  var CAPITALIZE_CACHE = new _utils.Cache(1000, str => str.replace(STRING_CAPITALIZE_REGEXP, (match /*, separator, chr */) => match.toUpperCase()));\n  var STRING_DECAMELIZE_REGEXP = /([a-z\\d])([A-Z])/g;\n  var DECAMELIZE_CACHE = new _utils.Cache(1000, str => str.replace(STRING_DECAMELIZE_REGEXP, '$1_$2').toLowerCase());\n  /**\n    Defines string helper methods including string formatting and localization.\n  \n    @class String\n    @public\n    @deprecated Add the package `@ember/string` to your project to use in place of this module.\n  */\n  /**\n    Splits a string into separate units separated by spaces, eliminating any\n    empty strings in the process.\n  \n    ```javascript\n    import { w } from '@ember/string';\n  \n    w(\"alpha beta gamma\").forEach(function(key) {\n      console.log(key);\n    });\n  \n    // > alpha\n    // > beta\n    // > gamma\n    ```\n  \n    @method w\n    @param {String} str The string to split\n    @return {Array} array containing the split strings\n    @public\n    @deprecated Add `@ember/string` to your package.json\n  */\n  function w(str) {\n    deprecateImportFromInternalString();\n    return str.split(/\\s+/);\n  }\n  /**\n    Converts a camelized string into all lower case separated by underscores.\n  \n    ```javascript\n    import { decamelize } from '@ember/string';\n  \n    decamelize('innerHTML');          // 'inner_html'\n    decamelize('action_name');        // 'action_name'\n    decamelize('css-class-name');     // 'css-class-name'\n    decamelize('my favorite items');  // 'my favorite items'\n    ```\n  \n    @method decamelize\n    @param {String} str The string to decamelize.\n    @return {String} the decamelized string.\n    @public\n    @deprecated Add `@ember/string` to your package.json\n  */\n  function decamelize(str) {\n    deprecateImportFromInternalString();\n    return DECAMELIZE_CACHE.get(str);\n  }\n  /**\n    Replaces underscores, spaces, or camelCase with dashes.\n  \n    ```javascript\n    import { dasherize } from '@ember/string';\n  \n    dasherize('innerHTML');                // 'inner-html'\n    dasherize('action_name');              // 'action-name'\n    dasherize('css-class-name');           // 'css-class-name'\n    dasherize('my favorite items');        // 'my-favorite-items'\n    dasherize('privateDocs/ownerInvoice';  // 'private-docs/owner-invoice'\n    ```\n  \n    @method dasherize\n    @param {String} str The string to dasherize.\n    @return {String} the dasherized string.\n    @public\n    @deprecated Add `@ember/string` to your package.json\n  */\n  function dasherize(str) {\n    deprecateImportFromInternalString();\n    return STRING_DASHERIZE_CACHE.get(str);\n  }\n  /**\n    Returns the lowerCamelCase form of a string.\n  \n    ```javascript\n    import { camelize } from '@ember/string';\n  \n    camelize('innerHTML');                   // 'innerHTML'\n    camelize('action_name');                 // 'actionName'\n    camelize('css-class-name');              // 'cssClassName'\n    camelize('my favorite items');           // 'myFavoriteItems'\n    camelize('My Favorite Items');           // 'myFavoriteItems'\n    camelize('private-docs/owner-invoice');  // 'privateDocs/ownerInvoice'\n    ```\n  \n    @method camelize\n    @param {String} str The string to camelize.\n    @return {String} the camelized string.\n    @public\n    @deprecated Add `@ember/string` to your package.json\n  */\n  function camelize(str) {\n    deprecateImportFromInternalString();\n    return CAMELIZE_CACHE.get(str);\n  }\n  /**\n    Returns the UpperCamelCase form of a string.\n  \n    ```javascript\n    import { classify } from '@ember/string';\n  \n    classify('innerHTML');                   // 'InnerHTML'\n    classify('action_name');                 // 'ActionName'\n    classify('css-class-name');              // 'CssClassName'\n    classify('my favorite items');           // 'MyFavoriteItems'\n    classify('private-docs/owner-invoice');  // 'PrivateDocs/OwnerInvoice'\n    ```\n  \n    @method classify\n    @param {String} str the string to classify\n    @return {String} the classified string\n    @public\n    @deprecated Add `@ember/string` to your package.json\n  */\n  function classify(str) {\n    deprecateImportFromInternalString();\n    return CLASSIFY_CACHE.get(str);\n  }\n  /**\n    More general than decamelize. Returns the lower\\_case\\_and\\_underscored\n    form of a string.\n  \n    ```javascript\n    import { underscore } from '@ember/string';\n  \n    underscore('innerHTML');                 // 'inner_html'\n    underscore('action_name');               // 'action_name'\n    underscore('css-class-name');            // 'css_class_name'\n    underscore('my favorite items');         // 'my_favorite_items'\n    underscore('privateDocs/ownerInvoice');  // 'private_docs/owner_invoice'\n    ```\n  \n    @method underscore\n    @param {String} str The string to underscore.\n    @return {String} the underscored string.\n    @public\n    @deprecated Add `@ember/string` to your package.json\n  */\n  function underscore(str) {\n    deprecateImportFromInternalString();\n    return UNDERSCORE_CACHE.get(str);\n  }\n  /**\n    Returns the Capitalized form of a string\n  \n    ```javascript\n    import { capitalize } from '@ember/string';\n  \n    capitalize('innerHTML')                 // 'InnerHTML'\n    capitalize('action_name')               // 'Action_name'\n    capitalize('css-class-name')            // 'Css-class-name'\n    capitalize('my favorite items')         // 'My favorite items'\n    capitalize('privateDocs/ownerInvoice'); // 'PrivateDocs/ownerInvoice'\n    ```\n  \n    @method capitalize\n    @param {String} str The string to capitalize.\n    @return {String} The capitalized string.\n    @public\n    @deprecated Add `@ember/string` to your package.json\n  */\n  function capitalize(str) {\n    deprecateImportFromInternalString();\n    return CAPITALIZE_CACHE.get(str);\n  }\n  function deprecateImportFromInternalString() {\n    (true && !(false) && (0, _debug.deprecate)('Importing from `@ember/string` without having the `@ember/string` package in your project is deprecated. Please add `@ember/string` to your `package.json', false, {\n      id: 'ember-string.add-package',\n      for: 'ember-source',\n      since: {\n        available: '4.10',\n        enabled: '4.10'\n      },\n      until: '5.0.0',\n      url: 'https://deprecations.emberjs.com/v4.x/#toc_ember-string-add-package'\n    }));\n  }\n  function deprecateImportFromString(name, message) {\n    if (message === void 0) {\n      message = `Importing ${name} from '@ember/string' is deprecated. Please import ${name} from '@ember/template' instead.`;\n    }\n    (true && !(false) && (0, _debug.deprecate)(message, false, {\n      id: 'ember-string.htmlsafe-ishtmlsafe',\n      for: 'ember-source',\n      since: {\n        available: '4.10',\n        enabled: '4.10'\n      },\n      until: '5.0.0',\n      url: 'https://deprecations.emberjs.com/v3.x/#toc_ember-string-htmlsafe-ishtmlsafe'\n    }));\n  }\n  function htmlSafe(str) {\n    deprecateImportFromString('htmlSafe');\n    return (0, _glimmer.htmlSafe)(str);\n  }\n  function isHTMLSafe(str) {\n    deprecateImportFromString('isHTMLSafe');\n    return (0, _glimmer.isHTMLSafe)(str);\n  }\n});","define(\"@ember/string/lib/string_registry\", [\"exports\", \"@ember/debug\"], function (_exports, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.getStrings = getStrings;\n  _exports.setStrings = setStrings;\n  // STATE within a module is frowned upon, this exists\n  // to support Ember.STRINGS but shield ember internals from this legacy global\n  // API.\n  var STRINGS = {};\n  function setStrings(strings) {\n    deprecateEmberStrings();\n    STRINGS = strings;\n  }\n  function getStrings() {\n    deprecateEmberStrings();\n    return STRINGS;\n  }\n  function deprecateEmberStrings() {\n    (true && !(false) && (0, _debug.deprecate)('Ember.STRINGS is deprecated. It is no longer used by Ember.', false, {\n      id: 'ember-strings',\n      for: 'ember-source',\n      since: {\n        available: '4.10',\n        enabled: '4.10.'\n      },\n      until: '5.0.0'\n    }));\n  }\n});","define(\"@ember/template-compilation/index\", [\"exports\", \"ember-template-compiler\"], function (_exports, _emberTemplateCompiler) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"compileTemplate\", {\n    enumerable: true,\n    get: function () {\n      return _emberTemplateCompiler.compile;\n    }\n  });\n  _exports.precompileTemplate = void 0;\n  var precompileTemplate;\n  _exports.precompileTemplate = precompileTemplate;\n  if (true /* DEBUG */) {\n    _exports.precompileTemplate = precompileTemplate = () => {\n      throw new Error('Attempted to call `precompileTemplate` at runtime, but this API is meant to be used at compile time. You should use `compileTemplate` instead.');\n    };\n  }\n});","define(\"@ember/template-factory/index\", [\"exports\", \"@glimmer/opcode-compiler\"], function (_exports, _opcodeCompiler) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"createTemplateFactory\", {\n    enumerable: true,\n    get: function () {\n      return _opcodeCompiler.templateFactory;\n    }\n  });\n});","define(\"@ember/template/index\", [\"exports\", \"@ember/-internals/glimmer\"], function (_exports, _glimmer) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"htmlSafe\", {\n    enumerable: true,\n    get: function () {\n      return _glimmer.htmlSafe;\n    }\n  });\n  Object.defineProperty(_exports, \"isHTMLSafe\", {\n    enumerable: true,\n    get: function () {\n      return _glimmer.isHTMLSafe;\n    }\n  });\n});","define(\"@ember/test/adapter\", [\"exports\", \"ember-testing\"], function (_exports, _emberTesting) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = _emberTesting.Adapter;\n  _exports.default = _default;\n});","define(\"@ember/test/index\", [\"exports\", \"require\"], function (_exports, _require) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.unregisterWaiter = _exports.unregisterHelper = _exports.registerWaiter = _exports.registerHelper = _exports.registerAsyncHelper = void 0;\n  var registerAsyncHelper;\n  _exports.registerAsyncHelper = registerAsyncHelper;\n  var registerHelper;\n  _exports.registerHelper = registerHelper;\n  var registerWaiter;\n  _exports.registerWaiter = registerWaiter;\n  var unregisterHelper;\n  _exports.unregisterHelper = unregisterHelper;\n  var unregisterWaiter;\n  _exports.unregisterWaiter = unregisterWaiter;\n  if ((0, _require.has)('ember-testing')) {\n    var {\n      Test\n    } = (0, _require.default)(\"ember-testing\");\n    _exports.registerAsyncHelper = registerAsyncHelper = Test.registerAsyncHelper;\n    _exports.registerHelper = registerHelper = Test.registerHelper;\n    _exports.registerWaiter = registerWaiter = Test.registerWaiter;\n    _exports.unregisterHelper = unregisterHelper = Test.unregisterHelper;\n    _exports.unregisterWaiter = unregisterWaiter = Test.unregisterWaiter;\n  } else {\n    var testingNotAvailableMessage = () => {\n      throw new Error('Attempted to use test utilities, but `ember-testing` was not included');\n    };\n    _exports.registerAsyncHelper = registerAsyncHelper = testingNotAvailableMessage;\n    _exports.registerHelper = registerHelper = testingNotAvailableMessage;\n    _exports.registerWaiter = registerWaiter = testingNotAvailableMessage;\n    _exports.unregisterHelper = unregisterHelper = testingNotAvailableMessage;\n    _exports.unregisterWaiter = unregisterWaiter = testingNotAvailableMessage;\n  }\n});","define(\"@ember/utils/index\", [\"exports\", \"@ember/utils/lib/is_none\", \"@ember/utils/lib/is_blank\", \"@ember/utils/lib/is_empty\", \"@ember/utils/lib/is_present\", \"@ember/utils/lib/is-equal\", \"@ember/utils/lib/type-of\", \"@ember/utils/lib/compare\"], function (_exports, _is_none, _is_blank, _is_empty, _is_present, _isEqual, _typeOf, _compare) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"compare\", {\n    enumerable: true,\n    get: function () {\n      return _compare.default;\n    }\n  });\n  Object.defineProperty(_exports, \"isBlank\", {\n    enumerable: true,\n    get: function () {\n      return _is_blank.default;\n    }\n  });\n  Object.defineProperty(_exports, \"isEmpty\", {\n    enumerable: true,\n    get: function () {\n      return _is_empty.default;\n    }\n  });\n  Object.defineProperty(_exports, \"isEqual\", {\n    enumerable: true,\n    get: function () {\n      return _isEqual.default;\n    }\n  });\n  Object.defineProperty(_exports, \"isNone\", {\n    enumerable: true,\n    get: function () {\n      return _is_none.default;\n    }\n  });\n  Object.defineProperty(_exports, \"isPresent\", {\n    enumerable: true,\n    get: function () {\n      return _is_present.default;\n    }\n  });\n  Object.defineProperty(_exports, \"typeOf\", {\n    enumerable: true,\n    get: function () {\n      return _typeOf.default;\n    }\n  });\n});","define(\"@ember/utils/lib/compare\", [\"exports\", \"@ember/utils/lib/type-of\", \"@ember/-internals/runtime\", \"@ember/debug\"], function (_exports, _typeOf, _runtime, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = compare;\n  var TYPE_ORDER = {\n    undefined: 0,\n    null: 1,\n    boolean: 2,\n    number: 3,\n    string: 4,\n    array: 5,\n    object: 6,\n    instance: 7,\n    function: 8,\n    class: 9,\n    date: 10,\n    regexp: 11,\n    filelist: 12,\n    error: 13\n  };\n  //\n  // the spaceship operator\n  //\n  //                      `. ___\n  //                     __,' __`.                _..----....____\n  //         __...--.'``;.   ,.   ;``--..__     .'    ,-._    _.-'\n  //   _..-''-------'   `'   `'   `'     O ``-''._   (,;') _,'\n  // ,'________________                          \\`-._`-','\n  //  `._              ```````````------...___   '-.._'-:\n  //     ```--.._      ,.                     ````--...__\\-.\n  //             `.--. `-` \"INFINITY IS LESS     ____    |  |`\n  //               `. `.   THAN BEYOND\"        ,'`````.  ;  ;`\n  //                 `._`.        __________   `.      \\'__/`\n  //                    `-:._____/______/___/____`.     \\  `\n  //                                |       `._    `.    \\\n  //                                `._________`-.   `.   `.___\n  //                                              SSt  `------'`\n  function spaceship(a, b) {\n    // SAFETY: `Math.sign` always returns `-1` for negative, `0` for zero, and `1`\n    // for positive numbers. (The extra precision is useful for the way we use\n    // this in the context of `compare`.)\n    return Math.sign(a - b);\n  }\n  /**\n   @module @ember/utils\n  */\n  /**\n   Compares two javascript values and returns:\n  \n    - -1 if the first is smaller than the second,\n    - 0 if both are equal,\n    - 1 if the first is greater than the second.\n  \n    ```javascript\n    import { compare } from '@ember/utils';\n  \n    compare('hello', 'hello');  // 0\n    compare('abc', 'dfg');      // -1\n    compare(2, 1);              // 1\n    ```\n  \n   If the types of the two objects are different precedence occurs in the\n   following order, with types earlier in the list considered `<` types\n   later in the list:\n  \n    - undefined\n    - null\n    - boolean\n    - number\n    - string\n    - array\n    - object\n    - instance\n    - function\n    - class\n    - date\n  \n    ```javascript\n    import { compare } from '@ember/utils';\n  \n    compare('hello', 50);       // 1\n    compare(50, 'hello');       // -1\n    ```\n  \n   @method compare\n   @for @ember/utils\n   @static\n   @param {Object} v First value to compare\n   @param {Object} w Second value to compare\n   @return {Number} -1 if v < w, 0 if v = w and 1 if v > w.\n   @public\n  */\n  function compare(v, w) {\n    if (v === w) {\n      return 0;\n    }\n    var type1 = (0, _typeOf.default)(v);\n    var type2 = (0, _typeOf.default)(w);\n    if (type1 === 'instance' && isComparable(v) && v.constructor.compare) {\n      return v.constructor.compare(v, w);\n    }\n    if (type2 === 'instance' && isComparable(w) && w.constructor.compare) {\n      // SAFETY: Multiplying by a negative just changes the sign\n      return w.constructor.compare(w, v) * -1;\n    }\n    var res = spaceship(TYPE_ORDER[type1], TYPE_ORDER[type2]);\n    if (res !== 0) {\n      return res;\n    }\n    // types are equal - so we have to check values now\n    switch (type1) {\n      case 'boolean':\n        (true && !(typeof v === 'boolean' && typeof w === 'boolean') && (0, _debug.assert)('both are boolean', typeof v === 'boolean' && typeof w === 'boolean'));\n        return spaceship(Number(v), Number(w));\n      case 'number':\n        (true && !(typeof v === 'number' && typeof w === 'number') && (0, _debug.assert)('both are numbers', typeof v === 'number' && typeof w === 'number'));\n        return spaceship(v, w);\n      case 'string':\n        (true && !(typeof v === 'string' && typeof w === 'string') && (0, _debug.assert)('both are strings', typeof v === 'string' && typeof w === 'string'));\n        return spaceship(v.localeCompare(w), 0);\n      case 'array':\n        {\n          (true && !(Array.isArray(v) && Array.isArray(w)) && (0, _debug.assert)('both are arrays', Array.isArray(v) && Array.isArray(w)));\n          var vLen = v.length;\n          var wLen = w.length;\n          var len = Math.min(vLen, wLen);\n          for (var i = 0; i < len; i++) {\n            var r = compare(v[i], w[i]);\n            if (r !== 0) {\n              return r;\n            }\n          }\n          // all elements are equal now\n          // shorter array should be ordered first\n          return spaceship(vLen, wLen);\n        }\n      case 'instance':\n        if (isComparable(v) && v.compare) {\n          return v.compare(v, w);\n        }\n        return 0;\n      case 'date':\n        (true && !(v instanceof Date && w instanceof Date) && (0, _debug.assert)('both are dates', v instanceof Date && w instanceof Date));\n        return spaceship(v.getTime(), w.getTime());\n      default:\n        return 0;\n    }\n  }\n  function isComparable(value) {\n    return _runtime.Comparable.detect(value);\n  }\n});","define(\"@ember/utils/lib/is-equal\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = isEqual;\n  /**\n   @module @ember/utils\n  */\n  /**\n    Compares two objects, returning true if they are equal.\n  \n    ```javascript\n    import { isEqual } from '@ember/utils';\n  \n    isEqual('hello', 'hello');                   // true\n    isEqual(1, 2);                               // false\n    ```\n  \n    `isEqual` is a more specific comparison than a triple equal comparison.\n    It will call the `isEqual` instance method on the objects being\n    compared, allowing finer control over when objects should be considered\n    equal to each other.\n  \n    ```javascript\n    import { isEqual } from '@ember/utils';\n    import EmberObject from '@ember/object';\n  \n    let Person = EmberObject.extend({\n      isEqual(other) { return this.ssn == other.ssn; }\n    });\n  \n    let personA = Person.create({name: 'Muhammad Ali', ssn: '123-45-6789'});\n    let personB = Person.create({name: 'Cassius Clay', ssn: '123-45-6789'});\n  \n    isEqual(personA, personB); // true\n    ```\n  \n    Due to the expense of array comparisons, collections will never be equal to\n    each other even if each of their items are equal to each other.\n  \n    ```javascript\n    import { isEqual } from '@ember/utils';\n  \n    isEqual([4, 2], [4, 2]);                     // false\n    ```\n  \n    @method isEqual\n    @for @ember/utils\n    @static\n    @param {Object} a first object to compare\n    @param {Object} b second object to compare\n    @return {Boolean}\n    @public\n  */\n  function isEqual(a, b) {\n    if (a && typeof a.isEqual === 'function') {\n      return a.isEqual(b);\n    }\n    if (a instanceof Date && b instanceof Date) {\n      return a.getTime() === b.getTime();\n    }\n    return a === b;\n  }\n});","define(\"@ember/utils/lib/is_blank\", [\"exports\", \"@ember/utils/lib/is_empty\"], function (_exports, _is_empty) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = isBlank;\n  /**\n   @module @ember/utils\n  */\n  /**\n    A value is blank if it is empty or a whitespace string.\n  \n    ```javascript\n    import { isBlank } from '@ember/utils';\n  \n    isBlank(null);            // true\n    isBlank(undefined);       // true\n    isBlank('');              // true\n    isBlank([]);              // true\n    isBlank('\\n\\t');          // true\n    isBlank('  ');            // true\n    isBlank({});              // false\n    isBlank('\\n\\t Hello');    // false\n    isBlank('Hello world');   // false\n    isBlank([1,2,3]);         // false\n    ```\n  \n    @method isBlank\n    @static\n    @for @ember/utils\n    @param {Object} obj Value to test\n    @return {Boolean}\n    @since 1.5.0\n    @public\n  */\n  function isBlank(obj) {\n    return (0, _is_empty.default)(obj) || typeof obj === 'string' && /\\S/.test(obj) === false;\n  }\n});","define(\"@ember/utils/lib/is_empty\", [\"exports\", \"@ember/object\", \"@ember/-internals/metal\"], function (_exports, _object, _metal) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = isEmpty;\n  /**\n   @module @ember/utils\n  */\n  /**\n    Verifies that a value is `null` or `undefined`, an empty string, or an empty\n    array.\n  \n    Constrains the rules on `isNone` by returning true for empty strings and\n    empty arrays.\n  \n    If the value is an object with a `size` property of type number, it is used\n    to check emptiness.\n  \n    ```javascript\n    isEmpty(null);             // true\n    isEmpty(undefined);        // true\n    isEmpty('');               // true\n    isEmpty([]);               // true\n    isEmpty({ size: 0});       // true\n    isEmpty({});               // false\n    isEmpty('Adam Hawkins');   // false\n    isEmpty([0,1,2]);          // false\n    isEmpty('\\n\\t');           // false\n    isEmpty('  ');             // false\n    isEmpty({ size: 1 })       // false\n    isEmpty({ size: () => 0 }) // false\n    ```\n  \n    @method isEmpty\n    @static\n    @for @ember/utils\n    @param {Object} obj Value to test\n    @return {Boolean}\n    @public\n  */\n  function isEmpty(obj) {\n    if (obj === null || obj === undefined) {\n      return true;\n    }\n    if (!(0, _metal.hasUnknownProperty)(obj) && typeof obj.size === 'number') {\n      return !obj.size;\n    }\n    if (typeof obj === 'object') {\n      var size = (0, _object.get)(obj, 'size');\n      if (typeof size === 'number') {\n        return !size;\n      }\n      var length = (0, _object.get)(obj, 'length');\n      if (typeof length === 'number') {\n        return !length;\n      }\n    }\n    if (typeof obj.length === 'number' && typeof obj !== 'function') {\n      return !obj.length;\n    }\n    return false;\n  }\n});","define(\"@ember/utils/lib/is_none\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = isNone;\n  /**\n   @module @ember/utils\n  */\n  /**\n    Returns true if the passed value is null or undefined. This avoids errors\n    from JSLint complaining about use of ==, which can be technically\n    confusing.\n  \n    ```javascript\n    isNone(null);          // true\n    isNone(undefined);     // true\n    isNone('');            // false\n    isNone([]);            // false\n    isNone(function() {}); // false\n    ```\n  \n    @method isNone\n    @static\n    @for @ember/utils\n    @param {Object} obj Value to test\n    @return {Boolean}\n    @public\n  */\n  function isNone(obj) {\n    return obj === null || obj === undefined;\n  }\n});","define(\"@ember/utils/lib/is_present\", [\"exports\", \"@ember/utils/lib/is_blank\"], function (_exports, _is_blank) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = isPresent;\n  /**\n   @module @ember/utils\n  */\n  /**\n    A value is present if it not `isBlank`.\n  \n    ```javascript\n    isPresent(null);            // false\n    isPresent(undefined);       // false\n    isPresent('');              // false\n    isPresent('  ');            // false\n    isPresent('\\n\\t');          // false\n    isPresent([]);              // false\n    isPresent({ length: 0 });   // false\n    isPresent(false);           // true\n    isPresent(true);            // true\n    isPresent('string');        // true\n    isPresent(0);               // true\n    isPresent(function() {});   // true\n    isPresent({});              // true\n    isPresent('\\n\\t Hello');    // true\n    isPresent([1, 2, 3]);       // true\n    ```\n  \n    @method isPresent\n    @static\n    @for @ember/utils\n    @param {Object} obj Value to test\n    @return {Boolean}\n    @since 1.8.0\n    @public\n  */\n  function isPresent(obj) {\n    return !(0, _is_blank.default)(obj);\n  }\n});","define(\"@ember/utils/lib/type-of\", [\"exports\", \"@ember/object/core\"], function (_exports, _core) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = typeOf;\n  // ........................................\n  // TYPING & ARRAY MESSAGING\n  //\n  var TYPE_MAP = {\n    '[object Boolean]': 'boolean',\n    '[object Number]': 'number',\n    '[object String]': 'string',\n    '[object Function]': 'function',\n    '[object AsyncFunction]': 'function',\n    '[object Array]': 'array',\n    '[object Date]': 'date',\n    '[object RegExp]': 'regexp',\n    '[object Object]': 'object',\n    '[object FileList]': 'filelist'\n  };\n  var {\n    toString\n  } = Object.prototype;\n  /**\n   @module @ember/utils\n  */\n  /**\n    Returns a consistent type for the passed object.\n  \n    Use this instead of the built-in `typeof` to get the type of an item.\n    It will return the same result across all browsers and includes a bit\n    more detail. Here is what will be returned:\n  \n        | Return Value  | Meaning                                              |\n        |---------------|------------------------------------------------------|\n        | 'string'      | String primitive or String object.                   |\n        | 'number'      | Number primitive or Number object.                   |\n        | 'boolean'     | Boolean primitive or Boolean object.                 |\n        | 'null'        | Null value                                           |\n        | 'undefined'   | Undefined value                                      |\n        | 'function'    | A function                                           |\n        | 'array'       | An instance of Array                                 |\n        | 'regexp'      | An instance of RegExp                                |\n        | 'date'        | An instance of Date                                  |\n        | 'filelist'    | An instance of FileList                              |\n        | 'class'       | An Ember class (created using EmberObject.extend())  |\n        | 'instance'    | An Ember object instance                             |\n        | 'error'       | An instance of the Error object                      |\n        | 'object'      | A JavaScript object not inheriting from EmberObject  |\n  \n    Examples:\n  \n    ```javascript\n    import { A } from '@ember/array';\n    import { typeOf } from '@ember/utils';\n    import EmberObject from '@ember/object';\n  \n    typeOf();                       // 'undefined'\n    typeOf(null);                   // 'null'\n    typeOf(undefined);              // 'undefined'\n    typeOf('michael');              // 'string'\n    typeOf(new String('michael'));  // 'string'\n    typeOf(101);                    // 'number'\n    typeOf(new Number(101));        // 'number'\n    typeOf(true);                   // 'boolean'\n    typeOf(new Boolean(true));      // 'boolean'\n    typeOf(A);                      // 'function'\n    typeOf(A());                    // 'array'\n    typeOf([1, 2, 90]);             // 'array'\n    typeOf(/abc/);                  // 'regexp'\n    typeOf(new Date());             // 'date'\n    typeOf(event.target.files);     // 'filelist'\n    typeOf(EmberObject.extend());   // 'class'\n    typeOf(EmberObject.create());   // 'instance'\n    typeOf(new Error('teamocil'));  // 'error'\n  \n    // 'normal' JavaScript object\n    typeOf({ a: 'b' });             // 'object'\n    ```\n  \n    @method typeOf\n    @for @ember/utils\n    @param item the item to check\n    @return {String} the type\n    @public\n    @static\n  */\n  function typeOf(item) {\n    if (item === null) {\n      return 'null';\n    }\n    if (item === undefined) {\n      return 'undefined';\n    }\n    var ret = TYPE_MAP[toString.call(item)] || 'object';\n    if (ret === 'function') {\n      if (_core.default.detect(item)) {\n        ret = 'class';\n      }\n    } else if (ret === 'object') {\n      if (item instanceof Error) {\n        ret = 'error';\n      } else if (item instanceof _core.default) {\n        ret = 'instance';\n      } else if (item instanceof Date) {\n        ret = 'date';\n      }\n    }\n    return ret;\n  }\n});","define(\"@ember/version/index\", [\"exports\", \"ember/version\"], function (_exports, _version) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"VERSION\", {\n    enumerable: true,\n    get: function () {\n      return _version.default;\n    }\n  });\n});","define(\"@glimmer/destroyable\", [\"exports\", \"@glimmer/util\", \"@glimmer/global-context\"], function (_exports, _util, _globalContext) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports._hasDestroyableChildren = _hasDestroyableChildren;\n  _exports.assertDestroyablesDestroyed = void 0;\n  _exports.associateDestroyableChild = associateDestroyableChild;\n  _exports.destroy = destroy;\n  _exports.destroyChildren = destroyChildren;\n  _exports.enableDestroyableTracking = void 0;\n  _exports.isDestroyed = isDestroyed;\n  _exports.isDestroying = isDestroying;\n  _exports.registerDestructor = registerDestructor;\n  _exports.unregisterDestructor = unregisterDestructor;\n  var DESTROYABLE_META = new WeakMap();\n  function push(collection, newItem) {\n    if (collection === null) {\n      return newItem;\n    } else if (Array.isArray(collection)) {\n      collection.push(newItem);\n      return collection;\n    } else {\n      return [collection, newItem];\n    }\n  }\n  function iterate(collection, fn) {\n    if (Array.isArray(collection)) {\n      for (var i = 0; i < collection.length; i++) {\n        fn(collection[i]);\n      }\n    } else if (collection !== null) {\n      fn(collection);\n    }\n  }\n  function remove(collection, item, message) {\n    if (true /* DEBUG */) {\n      var collectionIsItem = collection === item;\n      var collectionContainsItem = Array.isArray(collection) && collection.indexOf(item) !== -1;\n      if (!collectionIsItem && !collectionContainsItem) {\n        throw new Error(String(message));\n      }\n    }\n    if (Array.isArray(collection) && collection.length > 1) {\n      var index = collection.indexOf(item);\n      collection.splice(index, 1);\n      return collection;\n    } else {\n      return null;\n    }\n  }\n  function getDestroyableMeta(destroyable) {\n    var meta = DESTROYABLE_META.get(destroyable);\n    if (meta === undefined) {\n      meta = {\n        parents: null,\n        children: null,\n        eagerDestructors: null,\n        destructors: null,\n        state: 0\n        /* Live */\n      };\n\n      if (true /* DEBUG */) {\n        meta.source = destroyable;\n      }\n      DESTROYABLE_META.set(destroyable, meta);\n    }\n    return meta;\n  }\n  function associateDestroyableChild(parent, child) {\n    if (true /* DEBUG */ && isDestroying(parent)) {\n      throw new Error('Attempted to associate a destroyable child with an object that is already destroying or destroyed');\n    }\n    var parentMeta = getDestroyableMeta(parent);\n    var childMeta = getDestroyableMeta(child);\n    parentMeta.children = push(parentMeta.children, child);\n    childMeta.parents = push(childMeta.parents, parent);\n    return child;\n  }\n  function registerDestructor(destroyable, destructor, eager) {\n    if (eager === void 0) {\n      eager = false;\n    }\n    if (true /* DEBUG */ && isDestroying(destroyable)) {\n      throw new Error('Attempted to register a destructor with an object that is already destroying or destroyed');\n    }\n    var meta = getDestroyableMeta(destroyable);\n    var destructorsKey = eager === true ? 'eagerDestructors' : 'destructors';\n    meta[destructorsKey] = push(meta[destructorsKey], destructor);\n    return destructor;\n  }\n  function unregisterDestructor(destroyable, destructor, eager) {\n    if (eager === void 0) {\n      eager = false;\n    }\n    if (true /* DEBUG */ && isDestroying(destroyable)) {\n      throw new Error('Attempted to unregister a destructor with an object that is already destroying or destroyed');\n    }\n    var meta = getDestroyableMeta(destroyable);\n    var destructorsKey = eager === true ? 'eagerDestructors' : 'destructors';\n    meta[destructorsKey] = remove(meta[destructorsKey], destructor, true /* DEBUG */ && 'attempted to remove a destructor that was not registered with the destroyable');\n  } ////////////\n\n  function destroy(destroyable) {\n    var meta = getDestroyableMeta(destroyable);\n    if (meta.state >= 1\n    /* Destroying */) return;\n    var {\n      parents,\n      children,\n      eagerDestructors,\n      destructors\n    } = meta;\n    meta.state = 1\n    /* Destroying */;\n\n    iterate(children, destroy);\n    iterate(eagerDestructors, destructor => destructor(destroyable));\n    iterate(destructors, destructor => (0, _globalContext.scheduleDestroy)(destroyable, destructor));\n    (0, _globalContext.scheduleDestroyed)(() => {\n      iterate(parents, parent => removeChildFromParent(destroyable, parent));\n      meta.state = 2\n      /* Destroyed */;\n    });\n  }\n\n  function removeChildFromParent(child, parent) {\n    var parentMeta = getDestroyableMeta(parent);\n    if (parentMeta.state === 0\n    /* Live */) {\n      parentMeta.children = remove(parentMeta.children, child, true /* DEBUG */ && \"attempted to remove child from parent, but the parent's children did not contain the child. This is likely a bug with destructors.\");\n    }\n  }\n  function destroyChildren(destroyable) {\n    var {\n      children\n    } = getDestroyableMeta(destroyable);\n    iterate(children, destroy);\n  }\n  function _hasDestroyableChildren(destroyable) {\n    var meta = DESTROYABLE_META.get(destroyable);\n    return meta === undefined ? false : meta.children !== null;\n  }\n  function isDestroying(destroyable) {\n    var meta = DESTROYABLE_META.get(destroyable);\n    return meta === undefined ? false : meta.state >= 1\n    /* Destroying */;\n  }\n\n  function isDestroyed(destroyable) {\n    var meta = DESTROYABLE_META.get(destroyable);\n    return meta === undefined ? false : meta.state >= 2\n    /* Destroyed */;\n  } ////////////\n\n  var enableDestroyableTracking;\n  _exports.enableDestroyableTracking = enableDestroyableTracking;\n  var assertDestroyablesDestroyed;\n  _exports.assertDestroyablesDestroyed = assertDestroyablesDestroyed;\n  if (true /* DEBUG */) {\n    var isTesting = false;\n    _exports.enableDestroyableTracking = enableDestroyableTracking = () => {\n      if (isTesting) {\n        // Reset destroyable meta just in case, before throwing the error\n        DESTROYABLE_META = new WeakMap();\n        throw new Error('Attempted to start destroyable testing, but you did not end the previous destroyable test. Did you forget to call `assertDestroyablesDestroyed()`');\n      }\n      isTesting = true;\n      DESTROYABLE_META = new Map();\n    };\n    _exports.assertDestroyablesDestroyed = assertDestroyablesDestroyed = () => {\n      if (!isTesting) {\n        throw new Error('Attempted to assert destroyables destroyed, but you did not start a destroyable test. Did you forget to call `enableDestroyableTracking()`');\n      }\n      isTesting = false;\n      var map = DESTROYABLE_META;\n      DESTROYABLE_META = new WeakMap();\n      var undestroyed = [];\n      map.forEach(meta => {\n        if (meta.state !== 2\n        /* Destroyed */) {\n          undestroyed.push(meta.source);\n        }\n      });\n      if (undestroyed.length > 0) {\n        var objectsToString = undestroyed.map(_util.debugToString).join('\\n    ');\n        var error = new Error(`Some destroyables were not destroyed during this test:\\n    ${objectsToString}`);\n        error.destroyables = undestroyed;\n        throw error;\n      }\n    };\n  }\n});","define(\"@glimmer/encoder\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.InstructionEncoderImpl = void 0;\n  class InstructionEncoderImpl {\n    constructor(buffer) {\n      this.buffer = buffer;\n      this.size = 0;\n    }\n    encode(type, machine) {\n      if (type > 255\n      /* TYPE_SIZE */) {\n        throw new Error(`Opcode type over 8-bits. Got ${type}.`);\n      }\n      var first = type | machine | arguments.length - 2 << 8\n      /* ARG_SHIFT */;\n\n      this.buffer.push(first);\n      for (var i = 2; i < arguments.length; i++) {\n        var op = arguments[i];\n        if (true /* DEBUG */ && typeof op === 'number' && op > 2147483647\n        /* MAX_SIZE */) {\n          throw new Error(`Operand over 32-bits. Got ${op}.`);\n        }\n        this.buffer.push(op);\n      }\n      this.size = this.buffer.length;\n    }\n    patch(position, target) {\n      if (this.buffer[position + 1] === -1) {\n        this.buffer[position + 1] = target;\n      } else {\n        throw new Error('Trying to patch operand in populated slot instead of a reserved slot.');\n      }\n    }\n  }\n  _exports.InstructionEncoderImpl = InstructionEncoderImpl;\n});","define(\"@glimmer/env\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.DEBUG = _exports.CI = void 0;\n  var DEBUG = false;\n  _exports.DEBUG = DEBUG;\n  var CI = false;\n  _exports.CI = CI;\n});","define(\"@glimmer/global-context\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.warnIfStyleNotTrusted = _exports.toIterator = _exports.toBool = _exports.testOverrideGlobalContext = _exports.setProp = _exports.setPath = _exports.scheduleRevalidate = _exports.scheduleDestroyed = _exports.scheduleDestroy = _exports.getProp = _exports.getPath = _exports.deprecate = _exports.default = _exports.assertGlobalContextWasSet = _exports.assert = _exports.FEATURE_DEFAULT_HELPER_MANAGER = void 0;\n  /**\n   * This package contains global context functions for Glimmer. These functions\n   * are set by the embedding environment and must be set before initial render.\n   *\n   * These functions should meet the following criteria:\n   *\n   * - Must be provided by the embedder, due to having framework specific\n   *   behaviors (e.g. interop with classic Ember behaviors that should not be\n   *   upstreamed) or to being out of scope for the VM (e.g. scheduling a\n   *   revalidation)\n   * - Never differ between render roots\n   * - Never change over time\n   *\n   */\n\n  var FEATURE_DEFAULT_HELPER_MANAGER = true; //////////\n\n  /**\n   * Schedules a VM revalidation.\n   *\n   * Note: this has a default value so that tags can warm themselves when first loaded.\n   */\n  _exports.FEATURE_DEFAULT_HELPER_MANAGER = FEATURE_DEFAULT_HELPER_MANAGER;\n  var scheduleRevalidate = () => {};\n  /**\n   * Schedules a destructor to run\n   *\n   * @param destroyable The destroyable being destroyed\n   * @param destructor The destructor being scheduled\n   */\n  _exports.scheduleRevalidate = scheduleRevalidate;\n  var scheduleDestroy;\n  /**\n   * Finalizes destruction\n   *\n   * @param finalizer finalizer function\n   */\n  _exports.scheduleDestroy = scheduleDestroy;\n  var scheduleDestroyed;\n  /**\n   * Hook to provide iterators for `{{each}}` loops\n   *\n   * @param value The value to create an iterator for\n   */\n  _exports.scheduleDestroyed = scheduleDestroyed;\n  var toIterator;\n  /**\n   * Hook to specify truthiness within Glimmer templates\n   *\n   * @param value The value to convert to a boolean\n   */\n  _exports.toIterator = toIterator;\n  var toBool;\n  /**\n   * Hook for specifying how Glimmer should access properties in cases where it\n   * needs to. For instance, accessing an object's values in templates.\n   *\n   * @param obj The object provided to get a value from\n   * @param path The path to get the value from\n   */\n  _exports.toBool = toBool;\n  var getProp;\n  /**\n   * Hook for specifying how Glimmer should update props in cases where it needs\n   * to. For instance, when updating a template reference (e.g. 2-way-binding)\n   *\n   * @param obj The object provided to get a value from\n   * @param prop The prop to set the value at\n   * @param value The value to set the value to\n   */\n  _exports.getProp = getProp;\n  var setProp;\n  /**\n   * Hook for specifying how Glimmer should access paths in cases where it needs\n   * to. For instance, the `key` value of `{{each}}` loops.\n   *\n   * @param obj The object provided to get a value from\n   * @param path The path to get the value from\n   */\n  _exports.setProp = setProp;\n  var getPath;\n  /**\n   * Hook for specifying how Glimmer should update paths in cases where it needs\n   * to. For instance, when updating a template reference (e.g. 2-way-binding)\n   *\n   * @param obj The object provided to get a value from\n   * @param path The path to get the value from\n   */\n  _exports.getPath = getPath;\n  var setPath;\n  /**\n   * Hook to warn if a style binding string or value was not marked as trusted\n   * (e.g. HTMLSafe)\n   */\n  _exports.setPath = setPath;\n  var warnIfStyleNotTrusted;\n  /**\n   * Hook to customize assertion messages in the VM. Usages can be stripped out\n   * by using the @glimmer/vm-babel-plugins package.\n   */\n  _exports.warnIfStyleNotTrusted = warnIfStyleNotTrusted;\n  var assert;\n  /**\n   * Hook to customize deprecation messages in the VM. Usages can be stripped out\n   * by using the @glimmer/vm-babel-plugins package.\n   */\n  _exports.assert = assert;\n  var deprecate;\n  _exports.deprecate = deprecate;\n  var globalContextWasSet = false;\n  function setGlobalContext(context) {\n    var _a;\n    if (true /* DEBUG */) {\n      if (globalContextWasSet) {\n        throw new Error('Attempted to set the global context twice. This should only be set once.');\n      }\n      globalContextWasSet = true;\n    }\n    _exports.scheduleRevalidate = scheduleRevalidate = context.scheduleRevalidate;\n    _exports.scheduleDestroy = scheduleDestroy = context.scheduleDestroy;\n    _exports.scheduleDestroyed = scheduleDestroyed = context.scheduleDestroyed;\n    _exports.toIterator = toIterator = context.toIterator;\n    _exports.toBool = toBool = context.toBool;\n    _exports.getProp = getProp = context.getProp;\n    _exports.setProp = setProp = context.setProp;\n    _exports.getPath = getPath = context.getPath;\n    _exports.setPath = setPath = context.setPath;\n    _exports.warnIfStyleNotTrusted = warnIfStyleNotTrusted = context.warnIfStyleNotTrusted;\n    _exports.assert = assert = context.assert;\n    _exports.deprecate = deprecate = context.deprecate;\n    if (typeof ((_a = context.FEATURES) === null || _a === void 0 ? void 0 : _a.DEFAULT_HELPER_MANAGER) === 'boolean') {\n      _exports.FEATURE_DEFAULT_HELPER_MANAGER = FEATURE_DEFAULT_HELPER_MANAGER = context.FEATURES.DEFAULT_HELPER_MANAGER;\n    }\n  }\n  var assertGlobalContextWasSet;\n  _exports.assertGlobalContextWasSet = assertGlobalContextWasSet;\n  var testOverrideGlobalContext;\n  _exports.testOverrideGlobalContext = testOverrideGlobalContext;\n  if (true /* DEBUG */) {\n    _exports.assertGlobalContextWasSet = assertGlobalContextWasSet = () => {\n      if (globalContextWasSet === false) {\n        throw new Error('The global context for Glimmer VM was not set. You must set these global context functions to let Glimmer VM know how to accomplish certain operations. You can do this by importing `setGlobalContext` from `@glimmer/global-context`');\n      }\n    };\n    _exports.testOverrideGlobalContext = testOverrideGlobalContext = context => {\n      var originalGlobalContext = globalContextWasSet ? {\n        scheduleRevalidate,\n        scheduleDestroy,\n        scheduleDestroyed,\n        toIterator,\n        toBool,\n        getProp,\n        setProp,\n        getPath,\n        setPath,\n        warnIfStyleNotTrusted,\n        assert,\n        deprecate\n      } : null;\n      if (context === null) {\n        globalContextWasSet = false;\n      } else {\n        globalContextWasSet = true;\n      } // We use `undefined as any` here to unset the values when resetting the\n      // context at the end of a test.\n\n      _exports.scheduleRevalidate = scheduleRevalidate = (context === null || context === void 0 ? void 0 : context.scheduleRevalidate) || undefined;\n      _exports.scheduleDestroy = scheduleDestroy = (context === null || context === void 0 ? void 0 : context.scheduleDestroy) || undefined;\n      _exports.scheduleDestroyed = scheduleDestroyed = (context === null || context === void 0 ? void 0 : context.scheduleDestroyed) || undefined;\n      _exports.toIterator = toIterator = (context === null || context === void 0 ? void 0 : context.toIterator) || undefined;\n      _exports.toBool = toBool = (context === null || context === void 0 ? void 0 : context.toBool) || undefined;\n      _exports.getProp = getProp = (context === null || context === void 0 ? void 0 : context.getProp) || undefined;\n      _exports.setProp = setProp = (context === null || context === void 0 ? void 0 : context.setProp) || undefined;\n      _exports.getPath = getPath = (context === null || context === void 0 ? void 0 : context.getPath) || undefined;\n      _exports.setPath = setPath = (context === null || context === void 0 ? void 0 : context.setPath) || undefined;\n      _exports.warnIfStyleNotTrusted = warnIfStyleNotTrusted = (context === null || context === void 0 ? void 0 : context.warnIfStyleNotTrusted) || undefined;\n      _exports.assert = assert = (context === null || context === void 0 ? void 0 : context.assert) || undefined;\n      _exports.deprecate = deprecate = (context === null || context === void 0 ? void 0 : context.deprecate) || undefined;\n      return originalGlobalContext;\n    };\n  }\n  var _default = setGlobalContext;\n  _exports.default = _default;\n});","define(\"@glimmer/low-level\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.Storage = _exports.Stack = void 0;\n  class Storage {\n    constructor() {\n      this.array = [];\n      this.next = 0;\n    }\n    add(element) {\n      var {\n        next: slot,\n        array\n      } = this;\n      if (slot === array.length) {\n        this.next++;\n      } else {\n        var prev = array[slot];\n        this.next = prev;\n      }\n      this.array[slot] = element;\n      return slot;\n    }\n    deref(pointer) {\n      return this.array[pointer];\n    }\n    drop(pointer) {\n      this.array[pointer] = this.next;\n      this.next = pointer;\n    }\n  }\n  _exports.Storage = Storage;\n  class Stack {\n    constructor(vec) {\n      if (vec === void 0) {\n        vec = [];\n      }\n      this.vec = vec;\n    }\n    clone() {\n      return new Stack(this.vec.slice());\n    }\n    sliceFrom(start) {\n      return new Stack(this.vec.slice(start));\n    }\n    slice(start, end) {\n      return new Stack(this.vec.slice(start, end));\n    }\n    copy(from, to) {\n      this.vec[to] = this.vec[from];\n    } // TODO: how to model u64 argument?\n\n    writeRaw(pos, value) {\n      // TODO: Grow?\n      this.vec[pos] = value;\n    } // TODO: partially decoded enum?\n\n    getRaw(pos) {\n      return this.vec[pos];\n    }\n    reset() {\n      this.vec.length = 0;\n    }\n    len() {\n      return this.vec.length;\n    }\n  }\n  _exports.Stack = Stack;\n});","define(\"@glimmer/manager\", [\"exports\", \"@glimmer/util\", \"@glimmer/reference\", \"@glimmer/validator\", \"@glimmer/destroyable\", \"@glimmer/global-context\"], function (_exports, _util, _reference, _validator, _destroyable, _globalContext) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.CustomModifierManager = _exports.CustomHelperManager = _exports.CustomComponentManager = void 0;\n  _exports.capabilityFlagsFrom = capabilityFlagsFrom;\n  _exports.componentCapabilities = componentCapabilities;\n  _exports.getComponentTemplate = getComponentTemplate;\n  _exports.getCustomTagFor = getCustomTagFor;\n  _exports.getInternalComponentManager = getInternalComponentManager;\n  _exports.getInternalHelperManager = getInternalHelperManager;\n  _exports.getInternalModifierManager = getInternalModifierManager;\n  _exports.hasCapability = hasCapability;\n  _exports.hasDestroyable = hasDestroyable;\n  _exports.hasInternalComponentManager = hasInternalComponentManager;\n  _exports.hasInternalHelperManager = hasInternalHelperManager;\n  _exports.hasInternalModifierManager = hasInternalModifierManager;\n  _exports.hasValue = hasValue;\n  _exports.helperCapabilities = helperCapabilities;\n  _exports.managerHasCapability = managerHasCapability;\n  _exports.modifierCapabilities = modifierCapabilities;\n  _exports.setComponentManager = setComponentManager;\n  _exports.setComponentTemplate = setComponentTemplate;\n  _exports.setCustomTagFor = setCustomTagFor;\n  _exports.setHelperManager = setHelperManager;\n  _exports.setInternalComponentManager = setInternalComponentManager;\n  _exports.setInternalHelperManager = setInternalHelperManager;\n  _exports.setInternalModifierManager = setInternalModifierManager;\n  _exports.setModifierManager = setModifierManager;\n  var FROM_CAPABILITIES = true /* DEBUG */ ? new _util._WeakSet() : undefined;\n  function buildCapabilities(capabilities) {\n    if (true /* DEBUG */) {\n      FROM_CAPABILITIES.add(capabilities);\n      Object.freeze(capabilities);\n    }\n    return capabilities;\n  }\n  /**\n   * Converts a ComponentCapabilities object into a 32-bit integer representation.\n   */\n\n  function capabilityFlagsFrom(capabilities) {\n    return 0 | (capabilities.dynamicLayout ? 1\n    /* DynamicLayout */ : 0) | (capabilities.dynamicTag ? 2\n    /* DynamicTag */ : 0) | (capabilities.prepareArgs ? 4\n    /* PrepareArgs */ : 0) | (capabilities.createArgs ? 8\n    /* CreateArgs */ : 0) | (capabilities.attributeHook ? 16\n    /* AttributeHook */ : 0) | (capabilities.elementHook ? 32\n    /* ElementHook */ : 0) | (capabilities.dynamicScope ? 64\n    /* DynamicScope */ : 0) | (capabilities.createCaller ? 128\n    /* CreateCaller */ : 0) | (capabilities.updateHook ? 256\n    /* UpdateHook */ : 0) | (capabilities.createInstance ? 512\n    /* CreateInstance */ : 0) | (capabilities.wrapped ? 1024\n    /* Wrapped */ : 0) | (capabilities.willDestroy ? 2048\n    /* WillDestroy */ : 0) | (capabilities.hasSubOwner ? 4096\n    /* HasSubOwner */ : 0);\n  }\n  function managerHasCapability(_manager, capabilities, capability) {\n    return !!(capabilities & capability);\n  }\n  function hasCapability(capabilities, capability) {\n    return !!(capabilities & capability);\n  }\n  var CUSTOM_TAG_FOR = new WeakMap();\n  function getCustomTagFor(obj) {\n    return CUSTOM_TAG_FOR.get(obj);\n  }\n  function setCustomTagFor(obj, customTagFn) {\n    CUSTOM_TAG_FOR.set(obj, customTagFn);\n  }\n  function convertToInt(prop) {\n    if (typeof prop === 'symbol') return null;\n    var num = Number(prop);\n    if (isNaN(num)) return null;\n    return num % 1 === 0 ? num : null;\n  }\n  function tagForNamedArg(namedArgs, key) {\n    return (0, _validator.track)(() => {\n      if (key in namedArgs) {\n        (0, _reference.valueForRef)(namedArgs[key]);\n      }\n    });\n  }\n  function tagForPositionalArg(positionalArgs, key) {\n    return (0, _validator.track)(() => {\n      if (key === '[]') {\n        // consume all of the tags in the positional array\n        positionalArgs.forEach(_reference.valueForRef);\n      }\n      var parsed = convertToInt(key);\n      if (parsed !== null && parsed < positionalArgs.length) {\n        // consume the tag of the referenced index\n        (0, _reference.valueForRef)(positionalArgs[parsed]);\n      }\n    });\n  }\n  var argsProxyFor;\n  class NamedArgsProxy {\n    constructor(named) {\n      this.named = named;\n    }\n    get(_target, prop) {\n      var ref = this.named[prop];\n      if (ref !== undefined) {\n        return (0, _reference.valueForRef)(ref);\n      }\n    }\n    has(_target, prop) {\n      return prop in this.named;\n    }\n    ownKeys() {\n      return Object.keys(this.named);\n    }\n    isExtensible() {\n      return false;\n    }\n    getOwnPropertyDescriptor(_target, prop) {\n      if (true /* DEBUG */ && !(prop in this.named)) {\n        throw new Error(`args proxies do not have real property descriptors, so you should never need to call getOwnPropertyDescriptor yourself. This code exists for enumerability, such as in for-in loops and Object.keys(). Attempted to get the descriptor for \\`${String(prop)}\\``);\n      }\n      return {\n        enumerable: true,\n        configurable: true\n      };\n    }\n  }\n  class PositionalArgsProxy {\n    constructor(positional) {\n      this.positional = positional;\n    }\n    get(target, prop) {\n      var {\n        positional\n      } = this;\n      if (prop === 'length') {\n        return positional.length;\n      }\n      var parsed = convertToInt(prop);\n      if (parsed !== null && parsed < positional.length) {\n        return (0, _reference.valueForRef)(positional[parsed]);\n      }\n      return target[prop];\n    }\n    isExtensible() {\n      return false;\n    }\n    has(_target, prop) {\n      var parsed = convertToInt(prop);\n      return parsed !== null && parsed < this.positional.length;\n    }\n  }\n  if (_util.HAS_NATIVE_PROXY) {\n    argsProxyFor = (capturedArgs, type) => {\n      var {\n        named,\n        positional\n      } = capturedArgs;\n      var getNamedTag = (_obj, key) => tagForNamedArg(named, key);\n      var getPositionalTag = (_obj, key) => tagForPositionalArg(positional, key);\n      var namedHandler = new NamedArgsProxy(named);\n      var positionalHandler = new PositionalArgsProxy(positional);\n      var namedTarget = Object.create(null);\n      var positionalTarget = [];\n      if (true /* DEBUG */) {\n        var setHandler = function (_target, prop) {\n          throw new Error(`You attempted to set ${String(prop)} on the arguments of a component, helper, or modifier. Arguments are immutable and cannot be updated directly; they always represent the values that are passed down. If you want to set default values, you should use a getter and local tracked state instead.`);\n        };\n        var forInDebugHandler = () => {\n          throw new Error(`Object.keys() was called on the positional arguments array for a ${type}, which is not supported. This function is a low-level function that should not need to be called for positional argument arrays. You may be attempting to iterate over the array using for...in instead of for...of.`);\n        };\n        namedHandler.set = setHandler;\n        positionalHandler.set = setHandler;\n        positionalHandler.ownKeys = forInDebugHandler;\n      }\n      var namedProxy = new Proxy(namedTarget, namedHandler);\n      var positionalProxy = new Proxy(positionalTarget, positionalHandler);\n      setCustomTagFor(namedProxy, getNamedTag);\n      setCustomTagFor(positionalProxy, getPositionalTag);\n      return {\n        named: namedProxy,\n        positional: positionalProxy\n      };\n    };\n  } else {\n    argsProxyFor = (capturedArgs, _type) => {\n      var {\n        named,\n        positional\n      } = capturedArgs;\n      var getNamedTag = (_obj, key) => tagForNamedArg(named, key);\n      var getPositionalTag = (_obj, key) => tagForPositionalArg(positional, key);\n      var namedProxy = {};\n      var positionalProxy = [];\n      setCustomTagFor(namedProxy, getNamedTag);\n      setCustomTagFor(positionalProxy, getPositionalTag);\n      Object.keys(named).forEach(name => {\n        Object.defineProperty(namedProxy, name, {\n          enumerable: true,\n          configurable: true,\n          get() {\n            return (0, _reference.valueForRef)(named[name]);\n          }\n        });\n      });\n      positional.forEach((ref, index) => {\n        Object.defineProperty(positionalProxy, index, {\n          enumerable: true,\n          configurable: true,\n          get() {\n            return (0, _reference.valueForRef)(ref);\n          }\n        });\n      });\n      if (true /* DEBUG */) {\n        // Prevent mutations in development mode. This will not prevent the\n        // proxy from updating, but will prevent assigning new values or pushing\n        // for instance.\n        Object.freeze(namedProxy);\n        Object.freeze(positionalProxy);\n      }\n      return {\n        named: namedProxy,\n        positional: positionalProxy\n      };\n    };\n  }\n  function helperCapabilities(managerAPI, options) {\n    if (options === void 0) {\n      options = {};\n    }\n    if (true /* DEBUG */ && managerAPI !== '3.23') {\n      throw new Error('Invalid helper manager compatibility specified');\n    }\n    if (true /* DEBUG */ && (!(options.hasValue || options.hasScheduledEffect) || options.hasValue && options.hasScheduledEffect)) {\n      throw new Error('You must pass either the `hasValue` OR the `hasScheduledEffect` capability when defining a helper manager. Passing neither, or both, is not permitted.');\n    }\n    if (true /* DEBUG */ && options.hasScheduledEffect) {\n      throw new Error('The `hasScheduledEffect` capability has not yet been implemented for helper managers. Please pass `hasValue` instead');\n    }\n    return buildCapabilities({\n      hasValue: Boolean(options.hasValue),\n      hasDestroyable: Boolean(options.hasDestroyable),\n      hasScheduledEffect: Boolean(options.hasScheduledEffect)\n    });\n  } ////////////\n\n  function hasValue(manager) {\n    return manager.capabilities.hasValue;\n  }\n  function hasDestroyable(manager) {\n    return manager.capabilities.hasDestroyable;\n  } ////////////\n\n  class CustomHelperManager {\n    constructor(factory) {\n      this.factory = factory;\n      this.helperManagerDelegates = new WeakMap();\n      this.undefinedDelegate = null;\n    }\n    getDelegateForOwner(owner) {\n      var delegate = this.helperManagerDelegates.get(owner);\n      if (delegate === undefined) {\n        var {\n          factory\n        } = this;\n        delegate = factory(owner);\n        if (true /* DEBUG */ && !FROM_CAPABILITIES.has(delegate.capabilities)) {\n          // TODO: This error message should make sense in both Ember and Glimmer https://github.com/glimmerjs/glimmer-vm/issues/1200\n          throw new Error(`Custom helper managers must have a \\`capabilities\\` property that is the result of calling the \\`capabilities('3.23')\\` (imported via \\`import { capabilities } from '@ember/helper';\\`). Received: \\`${JSON.stringify(delegate.capabilities)}\\` for: \\`${delegate}\\``);\n        }\n        this.helperManagerDelegates.set(owner, delegate);\n      }\n      return delegate;\n    }\n    getDelegateFor(owner) {\n      if (owner === undefined) {\n        var {\n          undefinedDelegate\n        } = this;\n        if (undefinedDelegate === null) {\n          var {\n            factory\n          } = this;\n          this.undefinedDelegate = undefinedDelegate = factory(undefined);\n        }\n        return undefinedDelegate;\n      } else {\n        return this.getDelegateForOwner(owner);\n      }\n    }\n    getHelper(definition) {\n      return (capturedArgs, owner) => {\n        var _a, _b;\n        var manager = this.getDelegateFor(owner);\n        var args = argsProxyFor(capturedArgs, 'helper');\n        var bucket = manager.createHelper(definition, args);\n        if (hasValue(manager)) {\n          var cache = (0, _reference.createComputeRef)(() => manager.getValue(bucket), null, true /* DEBUG */ && manager.getDebugName && manager.getDebugName(definition));\n          if (hasDestroyable(manager)) {\n            (0, _destroyable.associateDestroyableChild)(cache, manager.getDestroyable(bucket));\n          }\n          return cache;\n        } else if (hasDestroyable(manager)) {\n          var ref = (0, _reference.createConstRef)(undefined, true /* DEBUG */ && ((_b = (_a = manager.getDebugName) === null || _a === void 0 ? void 0 : _a.call(manager, definition)) !== null && _b !== void 0 ? _b : 'unknown helper'));\n          (0, _destroyable.associateDestroyableChild)(ref, manager.getDestroyable(bucket));\n          return ref;\n        } else {\n          return _reference.UNDEFINED_REFERENCE;\n        }\n      };\n    }\n  }\n  _exports.CustomHelperManager = CustomHelperManager;\n  class FunctionHelperManager {\n    constructor() {\n      this.capabilities = buildCapabilities({\n        hasValue: true,\n        hasDestroyable: false,\n        hasScheduledEffect: false\n      });\n    }\n    createHelper(fn, args) {\n      return {\n        fn,\n        args\n      };\n    }\n    getValue(_ref) {\n      var {\n        fn,\n        args\n      } = _ref;\n      if (Object.keys(args.named).length > 0) {\n        var argsForFn = [...args.positional, args.named];\n        return fn(...argsForFn);\n      }\n      return fn(...args.positional);\n    }\n    getDebugName(fn) {\n      if (fn.name) {\n        return `(helper function ${fn.name})`;\n      }\n      return '(anonymous helper function)';\n    }\n  }\n  var COMPONENT_MANAGERS = new WeakMap();\n  var MODIFIER_MANAGERS = new WeakMap();\n  var HELPER_MANAGERS = new WeakMap(); ///////////\n\n  var getPrototypeOf = Object.getPrototypeOf;\n  function setManager(map, manager, obj) {\n    if (true /* DEBUG */ && (typeof obj !== 'object' || obj === null) && typeof obj !== 'function') {\n      throw new Error(`Attempted to set a manager on a non-object value. Managers can only be associated with objects or functions. Value was ${(0, _util.debugToString)(obj)}`);\n    }\n    if (true /* DEBUG */ && map.has(obj)) {\n      throw new Error(`Attempted to set the same type of manager multiple times on a value. You can only associate one manager of each type with a given value. Value was ${(0, _util.debugToString)(obj)}`);\n    }\n    map.set(obj, manager);\n    return obj;\n  }\n  function getManager(map, obj) {\n    var pointer = obj;\n    while (pointer !== undefined && pointer !== null) {\n      var manager = map.get(pointer);\n      if (manager !== undefined) {\n        return manager;\n      }\n      pointer = getPrototypeOf(pointer);\n    }\n    return undefined;\n  } ///////////\n\n  function setInternalModifierManager(manager, definition) {\n    return setManager(MODIFIER_MANAGERS, manager, definition);\n  }\n  function getInternalModifierManager(definition, isOptional) {\n    if (true /* DEBUG */ && typeof definition !== 'function' && (typeof definition !== 'object' || definition === null)) {\n      throw new Error(`Attempted to use a value as a modifier, but it was not an object or function. Modifier definitions must be objects or functions with an associated modifier manager. The value was: ${definition}`);\n    }\n    var manager = getManager(MODIFIER_MANAGERS, definition);\n    if (manager === undefined) {\n      if (isOptional === true) {\n        return null;\n      } else if (true /* DEBUG */) {\n        throw new Error(`Attempted to load a modifier, but there wasn't a modifier manager associated with the definition. The definition was: ${(0, _util.debugToString)(definition)}`);\n      }\n    }\n    return manager;\n  }\n  function setInternalHelperManager(manager, definition) {\n    return setManager(HELPER_MANAGERS, manager, definition);\n  }\n  var DEFAULT_MANAGER = new CustomHelperManager(() => new FunctionHelperManager());\n  function getInternalHelperManager(definition, isOptional) {\n    if (true /* DEBUG */ && typeof definition !== 'function' && (typeof definition !== 'object' || definition === null)) {\n      throw new Error(`Attempted to use a value as a helper, but it was not an object or function. Helper definitions must be objects or functions with an associated helper manager. The value was: ${definition}`);\n    }\n    var manager = getManager(HELPER_MANAGERS, definition);\n    if (_globalContext.FEATURE_DEFAULT_HELPER_MANAGER) {\n      // Functions are special-cased because functions are defined\n      // as the \"default\" helper, per: https://github.com/emberjs/rfcs/pull/756\n      if (manager === undefined && typeof definition === 'function') {\n        manager = DEFAULT_MANAGER;\n      }\n    }\n    if (manager) {\n      return manager;\n    } else if (isOptional === true) {\n      return null;\n    } else if (true /* DEBUG */) {\n      throw new Error(`Attempted to load a helper, but there wasn't a helper manager associated with the definition. The definition was: ${(0, _util.debugToString)(definition)}`);\n    }\n    return null;\n  }\n  function setInternalComponentManager(factory, obj) {\n    return setManager(COMPONENT_MANAGERS, factory, obj);\n  }\n  function getInternalComponentManager(definition, isOptional) {\n    if (true /* DEBUG */ && typeof definition !== 'function' && (typeof definition !== 'object' || definition === null)) {\n      throw new Error(`Attempted to use a value as a component, but it was not an object or function. Component definitions must be objects or functions with an associated component manager. The value was: ${definition}`);\n    }\n    var manager = getManager(COMPONENT_MANAGERS, definition);\n    if (manager === undefined) {\n      if (isOptional === true) {\n        return null;\n      } else if (true /* DEBUG */) {\n        throw new Error(`Attempted to load a component, but there wasn't a component manager associated with the definition. The definition was: ${(0, _util.debugToString)(definition)}`);\n      }\n    }\n    return manager;\n  } ///////////\n\n  function hasInternalComponentManager(definition) {\n    return hasDefaultComponentManager(definition) || getManager(COMPONENT_MANAGERS, definition) !== undefined;\n  }\n  function hasInternalHelperManager(definition) {\n    return hasDefaultHelperManager(definition) || getManager(HELPER_MANAGERS, definition) !== undefined;\n  }\n  function hasInternalModifierManager(definition) {\n    return hasDefaultModifierManager(definition) || getManager(MODIFIER_MANAGERS, definition) !== undefined;\n  }\n  function hasDefaultComponentManager(_definition) {\n    return false;\n  }\n  function hasDefaultHelperManager(definition) {\n    if (_globalContext.FEATURE_DEFAULT_HELPER_MANAGER) {\n      return typeof definition === 'function';\n    }\n    return false;\n  }\n  function hasDefaultModifierManager(_definition) {\n    return false;\n  }\n  var CAPABILITIES = {\n    dynamicLayout: false,\n    dynamicTag: false,\n    prepareArgs: false,\n    createArgs: true,\n    attributeHook: false,\n    elementHook: false,\n    createCaller: false,\n    dynamicScope: true,\n    updateHook: true,\n    createInstance: true,\n    wrapped: false,\n    willDestroy: false,\n    hasSubOwner: false\n  };\n  function componentCapabilities(managerAPI, options) {\n    if (options === void 0) {\n      options = {};\n    }\n    if (true /* DEBUG */ && managerAPI !== '3.13') {\n      throw new Error('Invalid component manager compatibility specified');\n    }\n    var updateHook = Boolean(options.updateHook);\n    return buildCapabilities({\n      asyncLifeCycleCallbacks: Boolean(options.asyncLifecycleCallbacks),\n      destructor: Boolean(options.destructor),\n      updateHook\n    });\n  }\n  function hasAsyncLifeCycleCallbacks(delegate) {\n    return delegate.capabilities.asyncLifeCycleCallbacks;\n  }\n  function hasUpdateHook(delegate) {\n    return delegate.capabilities.updateHook;\n  }\n  function hasAsyncUpdateHook(delegate) {\n    return hasAsyncLifeCycleCallbacks(delegate) && hasUpdateHook(delegate);\n  }\n  function hasDestructors(delegate) {\n    return delegate.capabilities.destructor;\n  }\n  /**\n    The CustomComponentManager allows addons to provide custom component\n    implementations that integrate seamlessly into Ember. This is accomplished\n    through a delegate, registered with the custom component manager, which\n    implements a set of hooks that determine component behavior.\n  \n    To create a custom component manager, instantiate a new CustomComponentManager\n    class and pass the delegate as the first argument:\n  \n    ```js\n    let manager = new CustomComponentManager({\n      // ...delegate implementation...\n    });\n    ```\n  \n    ## Delegate Hooks\n  \n    Throughout the lifecycle of a component, the component manager will invoke\n    delegate hooks that are responsible for surfacing those lifecycle changes to\n    the end developer.\n  \n    * `create()` - invoked when a new instance of a component should be created\n    * `update()` - invoked when the arguments passed to a component change\n    * `getContext()` - returns the object that should be\n  */\n\n  class CustomComponentManager {\n    constructor(factory) {\n      this.factory = factory;\n      this.componentManagerDelegates = new WeakMap();\n    }\n    getDelegateFor(owner) {\n      var {\n        componentManagerDelegates\n      } = this;\n      var delegate = componentManagerDelegates.get(owner);\n      if (delegate === undefined) {\n        var {\n          factory\n        } = this;\n        delegate = factory(owner);\n        if (true /* DEBUG */ && !FROM_CAPABILITIES.has(delegate.capabilities)) {\n          // TODO: This error message should make sense in both Ember and Glimmer https://github.com/glimmerjs/glimmer-vm/issues/1200\n          throw new Error(`Custom component managers must have a \\`capabilities\\` property that is the result of calling the \\`capabilities('3.13')\\` (imported via \\`import { capabilities } from '@ember/component';\\`). Received: \\`${JSON.stringify(delegate.capabilities)}\\` for: \\`${delegate}\\``);\n        }\n        componentManagerDelegates.set(owner, delegate);\n      }\n      return delegate;\n    }\n    create(owner, definition, vmArgs) {\n      var delegate = this.getDelegateFor(owner);\n      var args = argsProxyFor(vmArgs.capture(), 'component');\n      var component = delegate.createComponent(definition, args);\n      return new CustomComponentState(component, delegate, args);\n    }\n    getDebugName(definition) {\n      return typeof definition === 'function' ? definition.name : definition.toString();\n    }\n    update(bucket) {\n      var {\n        delegate\n      } = bucket;\n      if (hasUpdateHook(delegate)) {\n        var {\n          component,\n          args\n        } = bucket;\n        delegate.updateComponent(component, args);\n      }\n    }\n    didCreate(_ref2) {\n      var {\n        component,\n        delegate\n      } = _ref2;\n      if (hasAsyncLifeCycleCallbacks(delegate)) {\n        delegate.didCreateComponent(component);\n      }\n    }\n    didUpdate(_ref3) {\n      var {\n        component,\n        delegate\n      } = _ref3;\n      if (hasAsyncUpdateHook(delegate)) {\n        delegate.didUpdateComponent(component);\n      }\n    }\n    didRenderLayout() {}\n    didUpdateLayout() {}\n    getSelf(_ref4) {\n      var {\n        component,\n        delegate\n      } = _ref4;\n      return (0, _reference.createConstRef)(delegate.getContext(component), 'this');\n    }\n    getDestroyable(bucket) {\n      var {\n        delegate\n      } = bucket;\n      if (hasDestructors(delegate)) {\n        var {\n          component\n        } = bucket;\n        (0, _destroyable.registerDestructor)(bucket, () => delegate.destroyComponent(component));\n        return bucket;\n      }\n      return null;\n    }\n    getCapabilities() {\n      return CAPABILITIES;\n    }\n  }\n  /**\n   * Stores internal state about a component instance after it's been created.\n   */\n  _exports.CustomComponentManager = CustomComponentManager;\n  class CustomComponentState {\n    constructor(component, delegate, args) {\n      this.component = component;\n      this.delegate = delegate;\n      this.args = args;\n    }\n  }\n  function modifierCapabilities(managerAPI, optionalFeatures) {\n    if (optionalFeatures === void 0) {\n      optionalFeatures = {};\n    }\n    if (true /* DEBUG */ && managerAPI !== '3.22') {\n      throw new Error('Invalid modifier manager compatibility specified');\n    }\n    return buildCapabilities({\n      disableAutoTracking: Boolean(optionalFeatures.disableAutoTracking)\n    });\n  }\n  /**\n    The CustomModifierManager allows addons to provide custom modifier\n    implementations that integrate seamlessly into Ember. This is accomplished\n    through a delegate, registered with the custom modifier manager, which\n    implements a set of hooks that determine modifier behavior.\n    To create a custom modifier manager, instantiate a new CustomModifierManager\n    class and pass the delegate as the first argument:\n  \n    ```js\n    let manager = new CustomModifierManager({\n      // ...delegate implementation...\n    });\n    ```\n  \n    ## Delegate Hooks\n  \n    Throughout the lifecycle of a modifier, the modifier manager will invoke\n    delegate hooks that are responsible for surfacing those lifecycle changes to\n    the end developer.\n    * `createModifier()` - invoked when a new instance of a modifier should be created\n    * `installModifier()` - invoked when the modifier is installed on the element\n    * `updateModifier()` - invoked when the arguments passed to a modifier change\n    * `destroyModifier()` - invoked when the modifier is about to be destroyed\n  */\n\n  class CustomModifierManager {\n    constructor(factory) {\n      this.factory = factory;\n      this.componentManagerDelegates = new WeakMap();\n    }\n    getDelegateFor(owner) {\n      var {\n        componentManagerDelegates\n      } = this;\n      var delegate = componentManagerDelegates.get(owner);\n      if (delegate === undefined) {\n        var {\n          factory\n        } = this;\n        delegate = factory(owner);\n        if (true /* DEBUG */ && !FROM_CAPABILITIES.has(delegate.capabilities)) {\n          // TODO: This error message should make sense in both Ember and Glimmer https://github.com/glimmerjs/glimmer-vm/issues/1200\n          throw new Error(`Custom modifier managers must have a \\`capabilities\\` property that is the result of calling the \\`capabilities('3.22')\\` (imported via \\`import { capabilities } from '@ember/modifier';\\`). Received: \\`${JSON.stringify(delegate.capabilities)}\\` for: \\`${delegate}\\``);\n        }\n        componentManagerDelegates.set(owner, delegate);\n      }\n      return delegate;\n    }\n    create(owner, element, definition, capturedArgs) {\n      var delegate = this.getDelegateFor(owner);\n      var args = argsProxyFor(capturedArgs, 'modifier');\n      var instance = delegate.createModifier(definition, args);\n      var tag = (0, _validator.createUpdatableTag)();\n      var state;\n      state = {\n        tag,\n        element,\n        delegate,\n        args,\n        modifier: instance\n      };\n      if (true /* DEBUG */) {\n        state.debugName = typeof definition === 'function' ? definition.name : definition.toString();\n      }\n      (0, _destroyable.registerDestructor)(state, () => delegate.destroyModifier(instance, args));\n      return state;\n    }\n    getDebugName(_ref5) {\n      var {\n        debugName\n      } = _ref5;\n      return debugName;\n    }\n    getTag(_ref6) {\n      var {\n        tag\n      } = _ref6;\n      return tag;\n    }\n    install(_ref7) {\n      var {\n        element,\n        args,\n        modifier,\n        delegate\n      } = _ref7;\n      var {\n        capabilities\n      } = delegate;\n      if (capabilities.disableAutoTracking === true) {\n        (0, _validator.untrack)(() => delegate.installModifier(modifier, element, args));\n      } else {\n        delegate.installModifier(modifier, element, args);\n      }\n    }\n    update(_ref8) {\n      var {\n        args,\n        modifier,\n        delegate\n      } = _ref8;\n      var {\n        capabilities\n      } = delegate;\n      if (capabilities.disableAutoTracking === true) {\n        (0, _validator.untrack)(() => delegate.updateModifier(modifier, args));\n      } else {\n        delegate.updateModifier(modifier, args);\n      }\n    }\n    getDestroyable(state) {\n      return state;\n    }\n  }\n  _exports.CustomModifierManager = CustomModifierManager;\n  function setComponentManager(factory, obj) {\n    return setInternalComponentManager(new CustomComponentManager(factory), obj);\n  }\n  function setModifierManager(factory, obj) {\n    return setInternalModifierManager(new CustomModifierManager(factory), obj);\n  }\n  function setHelperManager(factory, obj) {\n    return setInternalHelperManager(new CustomHelperManager(factory), obj);\n  }\n  var TEMPLATES = new WeakMap();\n  var getPrototypeOf$1 = Object.getPrototypeOf;\n  function setComponentTemplate(factory, obj) {\n    if (true /* DEBUG */ && !(obj !== null && (typeof obj === 'object' || typeof obj === 'function'))) {\n      throw new Error(`Cannot call \\`setComponentTemplate\\` on \\`${(0, _util.debugToString)(obj)}\\``);\n    }\n    if (true /* DEBUG */ && TEMPLATES.has(obj)) {\n      throw new Error(`Cannot call \\`setComponentTemplate\\` multiple times on the same class (\\`${(0, _util.debugToString)(obj)}\\`)`);\n    }\n    TEMPLATES.set(obj, factory);\n    return obj;\n  }\n  function getComponentTemplate(obj) {\n    var pointer = obj;\n    while (pointer !== null) {\n      var template = TEMPLATES.get(pointer);\n      if (template !== undefined) {\n        return template;\n      }\n      pointer = getPrototypeOf$1(pointer);\n    }\n    return undefined;\n  }\n});","define(\"@glimmer/node\", [\"exports\", \"@glimmer/runtime\", \"@simple-dom/document\"], function (_exports, _runtime, _document) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.NodeDOMTreeConstruction = void 0;\n  _exports.serializeBuilder = serializeBuilder;\n  class NodeDOMTreeConstruction extends _runtime.DOMTreeConstruction {\n    constructor(doc) {\n      super(doc || (0, _document.default)());\n    } // override to prevent usage of `this.document` until after the constructor\n\n    setupUselessElement() {}\n    insertHTMLBefore(parent, reference, html) {\n      var raw = this.document.createRawHTMLSection(html);\n      parent.insertBefore(raw, reference);\n      return new _runtime.ConcreteBounds(parent, raw, raw);\n    } // override to avoid SVG detection/work when in node (this is not needed in SSR)\n\n    createElement(tag) {\n      return this.document.createElement(tag);\n    } // override to avoid namespace shenanigans when in node (this is not needed in SSR)\n\n    setAttribute(element, name, value) {\n      element.setAttribute(name, value);\n    }\n  }\n  _exports.NodeDOMTreeConstruction = NodeDOMTreeConstruction;\n  var TEXT_NODE = 3;\n  var NEEDS_EXTRA_CLOSE = new WeakMap();\n  function currentNode(cursor) {\n    var {\n      element,\n      nextSibling\n    } = cursor;\n    if (nextSibling === null) {\n      return element.lastChild;\n    } else {\n      return nextSibling.previousSibling;\n    }\n  }\n  class SerializeBuilder extends _runtime.NewElementBuilder {\n    constructor() {\n      super(...arguments);\n      this.serializeBlockDepth = 0;\n    }\n    __openBlock() {\n      var {\n        tagName\n      } = this.element;\n      if (tagName !== 'TITLE' && tagName !== 'SCRIPT' && tagName !== 'STYLE') {\n        var depth = this.serializeBlockDepth++;\n        this.__appendComment(`%+b:${depth}%`);\n      }\n      super.__openBlock();\n    }\n    __closeBlock() {\n      var {\n        tagName\n      } = this.element;\n      super.__closeBlock();\n      if (tagName !== 'TITLE' && tagName !== 'SCRIPT' && tagName !== 'STYLE') {\n        var depth = --this.serializeBlockDepth;\n        this.__appendComment(`%-b:${depth}%`);\n      }\n    }\n    __appendHTML(html) {\n      var {\n        tagName\n      } = this.element;\n      if (tagName === 'TITLE' || tagName === 'SCRIPT' || tagName === 'STYLE') {\n        return super.__appendHTML(html);\n      } // Do we need to run the html tokenizer here?\n\n      var first = this.__appendComment('%glmr%');\n      if (tagName === 'TABLE') {\n        var openIndex = html.indexOf('<');\n        if (openIndex > -1) {\n          var tr = html.slice(openIndex + 1, openIndex + 3);\n          if (tr === 'tr') {\n            html = `<tbody>${html}</tbody>`;\n          }\n        }\n      }\n      if (html === '') {\n        this.__appendComment('% %');\n      } else {\n        super.__appendHTML(html);\n      }\n      var last = this.__appendComment('%glmr%');\n      return new _runtime.ConcreteBounds(this.element, first, last);\n    }\n    __appendText(string) {\n      var {\n        tagName\n      } = this.element;\n      var current = currentNode(this);\n      if (tagName === 'TITLE' || tagName === 'SCRIPT' || tagName === 'STYLE') {\n        return super.__appendText(string);\n      } else if (string === '') {\n        return this.__appendComment('% %');\n      } else if (current && current.nodeType === TEXT_NODE) {\n        this.__appendComment('%|%');\n      }\n      return super.__appendText(string);\n    }\n    closeElement() {\n      if (NEEDS_EXTRA_CLOSE.has(this.element)) {\n        NEEDS_EXTRA_CLOSE.delete(this.element);\n        super.closeElement();\n      }\n      return super.closeElement();\n    }\n    openElement(tag) {\n      if (tag === 'tr') {\n        if (this.element.tagName !== 'TBODY' && this.element.tagName !== 'THEAD' && this.element.tagName !== 'TFOOT') {\n          this.openElement('tbody'); // This prevents the closeBlock comment from being re-parented\n          // under the auto inserted tbody. Rehydration builder needs to\n          // account for the insertion since it is injected here and not\n          // really in the template.\n\n          NEEDS_EXTRA_CLOSE.set(this.constructing, true);\n          this.flushElement(null);\n        }\n      }\n      return super.openElement(tag);\n    }\n    pushRemoteElement(element, cursorId, insertBefore) {\n      if (insertBefore === void 0) {\n        insertBefore = null;\n      }\n      var {\n        dom\n      } = this;\n      var script = dom.createElement('script');\n      script.setAttribute('glmr', cursorId);\n      dom.insertBefore(element, script, insertBefore);\n      return super.pushRemoteElement(element, cursorId, insertBefore);\n    }\n  }\n  function serializeBuilder(env, cursor) {\n    return SerializeBuilder.forInitialRender(env, cursor);\n  }\n});","define(\"@glimmer/opcode-compiler\", [\"exports\", \"@glimmer/util\", \"@glimmer/vm\", \"@glimmer/global-context\", \"@glimmer/manager\", \"@glimmer/encoder\"], function (_exports, _util, _vm, _globalContext, _manager, _encoder) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.WrappedBuilder = _exports.StdLib = _exports.MINIMAL_CAPABILITIES = _exports.EMPTY_BLOCKS = _exports.DEFAULT_CAPABILITIES = _exports.CompileTimeCompilationContextImpl = void 0;\n  _exports.compilable = compilable;\n  _exports.compileStatements = compileStatements;\n  _exports.compileStd = compileStd;\n  _exports.debugCompiler = void 0;\n  _exports.invokeStaticBlock = InvokeStaticBlock;\n  _exports.invokeStaticBlockWithStack = InvokeStaticBlockWithStack;\n  _exports.meta = meta;\n  _exports.programCompilationContext = programCompilationContext;\n  _exports.templateCacheCounters = void 0;\n  _exports.templateCompilationContext = templateCompilationContext;\n  _exports.templateFactory = templateFactory;\n  class NamedBlocksImpl {\n    constructor(blocks) {\n      this.blocks = blocks;\n      this.names = blocks ? Object.keys(blocks) : [];\n    }\n    get(name) {\n      if (!this.blocks) return null;\n      return this.blocks[name] || null;\n    }\n    has(name) {\n      var {\n        blocks\n      } = this;\n      return blocks !== null && name in blocks;\n    }\n    with(name, block) {\n      var {\n        blocks\n      } = this;\n      if (blocks) {\n        return new NamedBlocksImpl((0, _util.assign)({}, blocks, {\n          [name]: block\n        }));\n      } else {\n        return new NamedBlocksImpl({\n          [name]: block\n        });\n      }\n    }\n    get hasAny() {\n      return this.blocks !== null;\n    }\n  }\n  var EMPTY_BLOCKS = new NamedBlocksImpl(null);\n  _exports.EMPTY_BLOCKS = EMPTY_BLOCKS;\n  function namedBlocks(blocks) {\n    if (blocks === null) {\n      return EMPTY_BLOCKS;\n    }\n    var out = (0, _util.dict)();\n    var [keys, values] = blocks;\n    for (var i = 0; i < keys.length; i++) {\n      out[keys[i]] = values[i];\n    }\n    return new NamedBlocksImpl(out);\n  }\n  function labelOperand(value) {\n    return {\n      type: 1\n      /* Label */,\n\n      value\n    };\n  }\n  function evalSymbolsOperand() {\n    return {\n      type: 3\n      /* EvalSymbols */,\n\n      value: undefined\n    };\n  }\n  function isStrictMode() {\n    return {\n      type: 2\n      /* IsStrictMode */,\n\n      value: undefined\n    };\n  }\n  function blockOperand(value) {\n    return {\n      type: 4\n      /* Block */,\n\n      value\n    };\n  }\n  function stdlibOperand(value) {\n    return {\n      type: 5\n      /* StdLib */,\n\n      value\n    };\n  }\n  function nonSmallIntOperand(value) {\n    return {\n      type: 6\n      /* NonSmallInt */,\n\n      value\n    };\n  }\n  function symbolTableOperand(value) {\n    return {\n      type: 7\n      /* SymbolTable */,\n\n      value\n    };\n  }\n  function layoutOperand(value) {\n    return {\n      type: 8\n      /* Layout */,\n\n      value\n    };\n  }\n  function isGetLikeTuple(opcode) {\n    return Array.isArray(opcode) && opcode.length === 2;\n  }\n  function makeResolutionTypeVerifier(typeToVerify) {\n    return opcode => {\n      if (!isGetLikeTuple(opcode)) return false;\n      var type = opcode[0];\n      return type === 31\n      /* GetStrictFree */ || type === 32\n      /* GetTemplateSymbol */ || type === typeToVerify;\n    };\n  }\n  var isGetFreeComponent = makeResolutionTypeVerifier(39\n  /* GetFreeAsComponentHead */);\n\n  var isGetFreeModifier = makeResolutionTypeVerifier(38\n  /* GetFreeAsModifierHead */);\n\n  var isGetFreeHelper = makeResolutionTypeVerifier(37\n  /* GetFreeAsHelperHead */);\n\n  var isGetFreeComponentOrHelper = makeResolutionTypeVerifier(35\n  /* GetFreeAsComponentOrHelperHead */);\n\n  var isGetFreeOptionalComponentOrHelper = makeResolutionTypeVerifier(34\n  /* GetFreeAsComponentOrHelperHeadOrThisFallback */);\n\n  function assertResolverInvariants(meta) {\n    if (true /* DEBUG */) {\n      if (!meta.upvars) {\n        throw new Error('Attempted to resolve a component, helper, or modifier, but no free vars were found');\n      }\n      if (!meta.owner) {\n        throw new Error('Attempted to resolve a component, helper, or modifier, but no owner was associated with the template it was being resolved from');\n      }\n    }\n    return meta;\n  }\n  /**\n   * <Foo/>\n   * <Foo></Foo>\n   * <Foo @arg={{true}} />\n   */\n\n  function resolveComponent(resolver, constants, meta, _ref) {\n    var [, expr, then] = _ref;\n    var type = expr[0];\n    if (true /* DEBUG */ && expr[0] === 31\n    /* GetStrictFree */) {\n      throw new Error(`Attempted to resolve a component in a strict mode template, but that value was not in scope: ${meta.upvars[expr[1]]}`);\n    }\n    if (type === 32\n    /* GetTemplateSymbol */) {\n      var {\n        scopeValues,\n        owner\n      } = meta;\n      var definition = scopeValues[expr[1]];\n      then(constants.component(definition, owner));\n    } else {\n      var {\n        upvars,\n        owner: _owner\n      } = assertResolverInvariants(meta);\n      var name = upvars[expr[1]];\n      var _definition = resolver.lookupComponent(name, _owner);\n      if (true /* DEBUG */ && (typeof _definition !== 'object' || _definition === null)) {\n        throw new Error(`Attempted to resolve \\`${name}\\`, which was expected to be a component, but nothing was found.`);\n      }\n      then(constants.resolvedComponent(_definition, name));\n    }\n  }\n  /**\n   * (helper)\n   * (helper arg)\n   */\n\n  function resolveHelper(resolver, constants, meta, _ref2) {\n    var [, expr, then] = _ref2;\n    var type = expr[0];\n    if (type === 32\n    /* GetTemplateSymbol */) {\n      var {\n        scopeValues\n      } = meta;\n      var definition = scopeValues[expr[1]];\n      then(constants.helper(definition));\n    } else if (type === 31\n    /* GetStrictFree */) {\n      then(lookupBuiltInHelper(expr, resolver, meta, constants, 'helper'));\n    } else {\n      var {\n        upvars,\n        owner\n      } = assertResolverInvariants(meta);\n      var name = upvars[expr[1]];\n      var helper = resolver.lookupHelper(name, owner);\n      if (true /* DEBUG */ && helper === null) {\n        throw new Error(`Attempted to resolve \\`${name}\\`, which was expected to be a helper, but nothing was found.`);\n      }\n      then(constants.helper(helper, name));\n    }\n  }\n  /**\n   * <div {{modifier}}/>\n   * <div {{modifier arg}}/>\n   * <Foo {{modifier}}/>\n   */\n\n  function resolveModifier(resolver, constants, meta, _ref3) {\n    var [, expr, then] = _ref3;\n    var type = expr[0];\n    if (type === 32\n    /* GetTemplateSymbol */) {\n      var {\n        scopeValues\n      } = meta;\n      var definition = scopeValues[expr[1]];\n      then(constants.modifier(definition));\n    } else if (type === 31\n    /* GetStrictFree */) {\n      var {\n        upvars\n      } = assertResolverInvariants(meta);\n      var name = upvars[expr[1]];\n      var modifier = resolver.lookupBuiltInModifier(name);\n      if (true /* DEBUG */ && modifier === null) {\n        throw new Error(`Attempted to resolve a modifier in a strict mode template, but it was not in scope: ${name}`);\n      }\n      then(constants.modifier(modifier, name));\n    } else {\n      var {\n        upvars: _upvars,\n        owner\n      } = assertResolverInvariants(meta);\n      var _name2 = _upvars[expr[1]];\n      var _modifier = resolver.lookupModifier(_name2, owner);\n      if (true /* DEBUG */ && _modifier === null) {\n        throw new Error(`Attempted to resolve \\`${_name2}\\`, which was expected to be a modifier, but nothing was found.`);\n      }\n      then(constants.modifier(_modifier, _name2));\n    }\n  }\n  /**\n   * {{component-or-helper arg}}\n   */\n\n  function resolveComponentOrHelper(resolver, constants, meta, _ref4) {\n    var [, expr, {\n      ifComponent,\n      ifHelper\n    }] = _ref4;\n    var type = expr[0];\n    if (type === 32\n    /* GetTemplateSymbol */) {\n      var {\n        scopeValues,\n        owner\n      } = meta;\n      var definition = scopeValues[expr[1]];\n      var component = constants.component(definition, owner, true);\n      if (component !== null) {\n        ifComponent(component);\n        return;\n      }\n      var helper = constants.helper(definition, null, true);\n      if (true /* DEBUG */ && helper === null) {\n        throw new Error(`Attempted to use a value as either a component or helper, but it did not have a component manager or helper manager associated with it. The value was: ${(0, _util.debugToString)(definition)}`);\n      }\n      ifHelper(helper);\n    } else if (type === 31\n    /* GetStrictFree */) {\n      ifHelper(lookupBuiltInHelper(expr, resolver, meta, constants, 'component or helper'));\n    } else {\n      var {\n        upvars,\n        owner: _owner2\n      } = assertResolverInvariants(meta);\n      var name = upvars[expr[1]];\n      var _definition2 = resolver.lookupComponent(name, _owner2);\n      if (_definition2 !== null) {\n        ifComponent(constants.resolvedComponent(_definition2, name));\n      } else {\n        var _helper = resolver.lookupHelper(name, _owner2);\n        if (true /* DEBUG */ && _helper === null) {\n          throw new Error(`Attempted to resolve \\`${name}\\`, which was expected to be a component or helper, but nothing was found.`);\n        }\n        ifHelper(constants.helper(_helper, name));\n      }\n    }\n  }\n  /**\n   * <Foo @arg={{helper}}>\n   */\n\n  function resolveOptionalHelper(resolver, constants, meta, _ref5) {\n    var [, expr, {\n      ifHelper\n    }] = _ref5;\n    var {\n      upvars,\n      owner\n    } = assertResolverInvariants(meta);\n    var name = upvars[expr[1]];\n    var helper = resolver.lookupHelper(name, owner);\n    if (helper) {\n      ifHelper(constants.helper(helper, name), name, meta.moduleName);\n    }\n  }\n  /**\n   * {{maybeHelperOrComponent}}\n   */\n\n  function resolveOptionalComponentOrHelper(resolver, constants, meta, _ref6) {\n    var [, expr, {\n      ifComponent,\n      ifHelper,\n      ifValue\n    }] = _ref6;\n    var type = expr[0];\n    if (type === 32\n    /* GetTemplateSymbol */) {\n      var {\n        scopeValues,\n        owner\n      } = meta;\n      var definition = scopeValues[expr[1]];\n      if (typeof definition !== 'function' && (typeof definition !== 'object' || definition === null)) {\n        // The value is not an object, so it can't be a component or helper.\n        ifValue(constants.value(definition));\n        return;\n      }\n      var component = constants.component(definition, owner, true);\n      if (component !== null) {\n        ifComponent(component);\n        return;\n      }\n      var helper = constants.helper(definition, null, true);\n      if (helper !== null) {\n        ifHelper(helper);\n        return;\n      }\n      ifValue(constants.value(definition));\n    } else if (type === 31\n    /* GetStrictFree */) {\n      ifHelper(lookupBuiltInHelper(expr, resolver, meta, constants, 'value'));\n    } else {\n      var {\n        upvars,\n        owner: _owner3\n      } = assertResolverInvariants(meta);\n      var name = upvars[expr[1]];\n      var _definition3 = resolver.lookupComponent(name, _owner3);\n      if (_definition3 !== null) {\n        ifComponent(constants.resolvedComponent(_definition3, name));\n        return;\n      }\n      var _helper2 = resolver.lookupHelper(name, _owner3);\n      if (_helper2 !== null) {\n        ifHelper(constants.helper(_helper2, name));\n      }\n    }\n  }\n  function lookupBuiltInHelper(expr, resolver, meta, constants, type) {\n    var {\n      upvars\n    } = assertResolverInvariants(meta);\n    var name = upvars[expr[1]];\n    var helper = resolver.lookupBuiltInHelper(name);\n    if (true /* DEBUG */ && helper === null) {\n      // Keyword helper did not exist, which means that we're attempting to use a\n      // value of some kind that is not in scope\n      throw new Error(`Attempted to resolve a ${type} in a strict mode template, but that value was not in scope: ${meta.upvars[expr[1]]}`);\n    }\n    return constants.helper(helper, name);\n  }\n  class Compilers {\n    constructor() {\n      this.names = {};\n      this.funcs = [];\n    }\n    add(name, func) {\n      this.names[name] = this.funcs.push(func) - 1;\n    }\n    compile(op, sexp) {\n      var name = sexp[0];\n      var index = this.names[name];\n      var func = this.funcs[index];\n      func(op, sexp);\n    }\n  }\n  var EXPRESSIONS = new Compilers();\n  EXPRESSIONS.add(29\n  /* Concat */, (op, _ref7) => {\n    var [, parts] = _ref7;\n    for (var part of parts) {\n      expr(op, part);\n    }\n    op(27\n    /* Concat */, parts.length);\n  });\n  EXPRESSIONS.add(28\n  /* Call */, (op, _ref8) => {\n    var [, expression, positional, named] = _ref8;\n    if (isGetFreeHelper(expression)) {\n      op(1005\n      /* ResolveHelper */, expression, handle => {\n        Call(op, handle, positional, named);\n      });\n    } else {\n      expr(op, expression);\n      CallDynamic(op, positional, named);\n    }\n  });\n  EXPRESSIONS.add(50\n  /* Curry */, (op, _ref9) => {\n    var [, expr$$1, type, positional, named] = _ref9;\n    Curry(op, type, expr$$1, positional, named);\n  });\n  EXPRESSIONS.add(30\n  /* GetSymbol */, (op, _ref10) => {\n    var [, sym, path] = _ref10;\n    op(21\n    /* GetVariable */, sym);\n    withPath(op, path);\n  });\n  EXPRESSIONS.add(32\n  /* GetTemplateSymbol */, (op, _ref11) => {\n    var [, sym, path] = _ref11;\n    op(1011\n    /* ResolveTemplateLocal */, sym, handle => {\n      op(29\n      /* ConstantReference */, handle);\n      withPath(op, path);\n    });\n  });\n  EXPRESSIONS.add(31\n  /* GetStrictFree */, (op, _ref12) => {\n    var [, sym, _path] = _ref12;\n    op(1009\n    /* ResolveFree */, sym, _handle => {// TODO: Implement in strict mode\n    });\n  });\n  EXPRESSIONS.add(34\n  /* GetFreeAsComponentOrHelperHeadOrThisFallback */, () => {\n    // TODO: The logic for this opcode currently exists in STATEMENTS.Append, since\n    // we want different wrapping logic depending on if we are invoking a component,\n    // helper, or {{this}} fallback. Eventually we fix the opcodes so that we can\n    // traverse the subexpression tree like normal in this location.\n    throw new Error('unimplemented opcode');\n  });\n  EXPRESSIONS.add(36\n  /* GetFreeAsHelperHeadOrThisFallback */, (op, expr$$1) => {\n    // <div id={{baz}}>\n    op(1010\n    /* ResolveLocal */, expr$$1[1], _name => {\n      op(1006\n      /* ResolveOptionalHelper */, expr$$1, {\n        ifHelper: handle => {\n          Call(op, handle, null, null);\n        }\n      });\n    });\n  });\n  EXPRESSIONS.add(99\n  /* GetFreeAsDeprecatedHelperHeadOrThisFallback */, (op, expr$$1) => {\n    // <Foo @bar={{baz}}>\n    op(1010\n    /* ResolveLocal */, expr$$1[1], _name => {\n      op(1006\n      /* ResolveOptionalHelper */, expr$$1, {\n        ifHelper: (handle, name, moduleName) => {\n          (true && (0, _globalContext.assert)(expr$$1[2] && expr$$1[2].length === 1, '[BUG] Missing argument name'));\n          var arg = expr$$1[2][0];\n          (true && !(false) && (0, _globalContext.deprecate)(`The \\`${name}\\` helper was used in the \\`${moduleName}\\` template as \\`${arg}={{${name}}}\\`. ` + `This is ambigious between wanting the \\`${arg}\\` argument to be the \\`${name}\\` helper itself, ` + `or the result of invoking the \\`${name}\\` helper (current behavior). ` + `This implicit invocation behavior has been deprecated.\\n\\n` + `Instead, please explicitly invoke the helper with parenthesis, i.e. \\`${arg}={{(${name})}}\\`.\\n\\n` + `Note: the parenthesis are only required in this exact scenario where an ambiguity is present – where ` + `\\`${name}\\` referes to a global helper (as opposed to a local variable), AND ` + `the \\`${name}\\` helper invocation does not take any arguments, AND ` + `this occurs in a named argument position of a component invocation.\\n\\n` + `We expect this combination to be quite rare, as most helpers require at least one argument. ` + `There is no need to refactor helper invocations in cases where this deprecation was not triggered.`, false, {\n            id: 'argument-less-helper-paren-less-invocation'\n          }));\n          Call(op, handle, null, null);\n        }\n      });\n    });\n  });\n  function withPath(op, path) {\n    if (path === undefined || path.length === 0) return;\n    for (var i = 0; i < path.length; i++) {\n      op(22\n      /* GetProperty */, path[i]);\n    }\n  }\n  EXPRESSIONS.add(27\n  /* Undefined */, op => PushPrimitiveReference(op, undefined));\n  EXPRESSIONS.add(48\n  /* HasBlock */, (op, _ref13) => {\n    var [, block] = _ref13;\n    expr(op, block);\n    op(25\n    /* HasBlock */);\n  });\n\n  EXPRESSIONS.add(49\n  /* HasBlockParams */, (op, _ref14) => {\n    var [, block] = _ref14;\n    expr(op, block);\n    op(24\n    /* SpreadBlock */);\n\n    op(61\n    /* CompileBlock */);\n\n    op(26\n    /* HasBlockParams */);\n  });\n\n  EXPRESSIONS.add(52\n  /* IfInline */, (op, _ref15) => {\n    var [, condition, truthy, falsy] = _ref15;\n    // Push in reverse order\n    expr(op, falsy);\n    expr(op, truthy);\n    expr(op, condition);\n    op(109\n    /* IfInline */);\n  });\n\n  EXPRESSIONS.add(51\n  /* Not */, (op, _ref16) => {\n    var [, value] = _ref16;\n    expr(op, value);\n    op(110\n    /* Not */);\n  });\n\n  EXPRESSIONS.add(53\n  /* GetDynamicVar */, (op, _ref17) => {\n    var [, expression] = _ref17;\n    expr(op, expression);\n    op(111\n    /* GetDynamicVar */);\n  });\n\n  EXPRESSIONS.add(54\n  /* Log */, (op, _ref18) => {\n    var [, positional] = _ref18;\n    op(0\n    /* PushFrame */);\n\n    SimpleArgs(op, positional, null, false);\n    op(112\n    /* Log */);\n\n    op(1\n    /* PopFrame */);\n\n    op(36\n    /* Fetch */, _vm.$v0);\n  });\n  function expr(op, expression) {\n    if (Array.isArray(expression)) {\n      EXPRESSIONS.compile(op, expression);\n    } else {\n      PushPrimitive(op, expression);\n      op(31\n      /* PrimitiveReference */);\n    }\n  }\n\n  /**\n   * Compile arguments, pushing an Arguments object onto the stack.\n   *\n   * @param args.params\n   * @param args.hash\n   * @param args.blocks\n   * @param args.atNames\n   */\n\n  function CompileArgs(op, positional, named, blocks, atNames) {\n    var blockNames = blocks.names;\n    for (var i = 0; i < blockNames.length; i++) {\n      PushYieldableBlock(op, blocks.get(blockNames[i]));\n    }\n    var count = CompilePositional(op, positional);\n    var flags = count << 4;\n    if (atNames) flags |= 0b1000;\n    if (blocks) {\n      flags |= 0b111;\n    }\n    var names = _util.EMPTY_ARRAY;\n    if (named) {\n      names = named[0];\n      var val = named[1];\n      for (var _i = 0; _i < val.length; _i++) {\n        expr(op, val[_i]);\n      }\n    }\n    op(82\n    /* PushArgs */, names, blockNames, flags);\n  }\n  function SimpleArgs(op, positional, named, atNames) {\n    if (positional === null && named === null) {\n      op(83\n      /* PushEmptyArgs */);\n\n      return;\n    }\n    var count = CompilePositional(op, positional);\n    var flags = count << 4;\n    if (atNames) flags |= 0b1000;\n    var names = _util.EMPTY_STRING_ARRAY;\n    if (named) {\n      names = named[0];\n      var val = named[1];\n      for (var i = 0; i < val.length; i++) {\n        expr(op, val[i]);\n      }\n    }\n    op(82\n    /* PushArgs */, names, _util.EMPTY_STRING_ARRAY, flags);\n  }\n  /**\n   * Compile an optional list of positional arguments, which pushes each argument\n   * onto the stack and returns the number of parameters compiled\n   *\n   * @param positional an optional list of positional arguments\n   */\n\n  function CompilePositional(op, positional) {\n    if (positional === null) return 0;\n    for (var i = 0; i < positional.length; i++) {\n      expr(op, positional[i]);\n    }\n    return positional.length;\n  }\n  function meta(layout) {\n    var _a, _b;\n    var [, symbols,, upvars] = layout.block;\n    return {\n      evalSymbols: evalSymbols(layout),\n      upvars: upvars,\n      scopeValues: (_b = (_a = layout.scope) === null || _a === void 0 ? void 0 : _a.call(layout)) !== null && _b !== void 0 ? _b : null,\n      isStrictMode: layout.isStrictMode,\n      moduleName: layout.moduleName,\n      owner: layout.owner,\n      size: symbols.length\n    };\n  }\n  function evalSymbols(layout) {\n    var {\n      block\n    } = layout;\n    var [, symbols, hasEval] = block;\n    return hasEval ? symbols : null;\n  }\n\n  /**\n   * Push a reference onto the stack corresponding to a statically known primitive\n   * @param value A JavaScript primitive (undefined, null, boolean, number or string)\n   */\n\n  function PushPrimitiveReference(op, value) {\n    PushPrimitive(op, value);\n    op(31\n    /* PrimitiveReference */);\n  }\n  /**\n   * Push an encoded representation of a JavaScript primitive on the stack\n   *\n   * @param value A JavaScript primitive (undefined, null, boolean, number or string)\n   */\n\n  function PushPrimitive(op, primitive) {\n    var p = primitive;\n    if (typeof p === 'number') {\n      p = (0, _util.isSmallInt)(p) ? (0, _util.encodeImmediate)(p) : nonSmallIntOperand(p);\n    }\n    op(30\n    /* Primitive */, p);\n  }\n  /**\n   * Invoke a foreign function (a \"helper\") based on a statically known handle\n   *\n   * @param op The op creation function\n   * @param handle A handle\n   * @param positional An optional list of expressions to compile\n   * @param named An optional list of named arguments (name + expression) to compile\n   */\n\n  function Call(op, handle, positional, named) {\n    op(0\n    /* PushFrame */);\n\n    SimpleArgs(op, positional, named, false);\n    op(16\n    /* Helper */, handle);\n    op(1\n    /* PopFrame */);\n\n    op(36\n    /* Fetch */, _vm.$v0);\n  }\n  /**\n   * Invoke a foreign function (a \"helper\") based on a dynamically loaded definition\n   *\n   * @param op The op creation function\n   * @param positional An optional list of expressions to compile\n   * @param named An optional list of named arguments (name + expression) to compile\n   */\n\n  function CallDynamic(op, positional, named, append) {\n    op(0\n    /* PushFrame */);\n\n    SimpleArgs(op, positional, named, false);\n    op(33\n    /* Dup */, _vm.$fp, 1);\n    op(107\n    /* DynamicHelper */);\n\n    if (append) {\n      op(36\n      /* Fetch */, _vm.$v0);\n      append();\n      op(1\n      /* PopFrame */);\n\n      op(34\n      /* Pop */, 1);\n    } else {\n      op(1\n      /* PopFrame */);\n\n      op(34\n      /* Pop */, 1);\n      op(36\n      /* Fetch */, _vm.$v0);\n    }\n  }\n  /**\n   * Evaluate statements in the context of new dynamic scope entries. Move entries from the\n   * stack into named entries in the dynamic scope, then evaluate the statements, then pop\n   * the dynamic scope\n   *\n   * @param names a list of dynamic scope names\n   * @param block a function that returns a list of statements to evaluate\n   */\n\n  function DynamicScope(op, names, block) {\n    op(59\n    /* PushDynamicScope */);\n\n    op(58\n    /* BindDynamicScope */, names);\n    block();\n    op(60\n    /* PopDynamicScope */);\n  }\n\n  function Curry(op, type, definition, positional, named) {\n    op(0\n    /* PushFrame */);\n\n    SimpleArgs(op, positional, named, false);\n    op(86\n    /* CaptureArgs */);\n\n    expr(op, definition);\n    op(77\n    /* Curry */, type, isStrictMode());\n    op(1\n    /* PopFrame */);\n\n    op(36\n    /* Fetch */, _vm.$v0);\n  }\n\n  /**\n   * Yield to a block located at a particular symbol location.\n   *\n   * @param to the symbol containing the block to yield to\n   * @param params optional block parameters to yield to the block\n   */\n\n  function YieldBlock(op, to, positional) {\n    SimpleArgs(op, positional, null, true);\n    op(23\n    /* GetBlock */, to);\n    op(24\n    /* SpreadBlock */);\n\n    op(61\n    /* CompileBlock */);\n\n    op(64\n    /* InvokeYield */);\n\n    op(40\n    /* PopScope */);\n\n    op(1\n    /* PopFrame */);\n  }\n  /**\n   * Push an (optional) yieldable block onto the stack. The yieldable block must be known\n   * statically at compile time.\n   *\n   * @param block An optional Compilable block\n   */\n\n  function PushYieldableBlock(op, block) {\n    PushSymbolTable(op, block && block[1]);\n    op(62\n    /* PushBlockScope */);\n\n    PushCompilable(op, block);\n  }\n  /**\n   * Invoke a block that is known statically at compile time.\n   *\n   * @param block a Compilable block\n   */\n\n  function InvokeStaticBlock(op, block) {\n    op(0\n    /* PushFrame */);\n\n    PushCompilable(op, block);\n    op(61\n    /* CompileBlock */);\n\n    op(2\n    /* InvokeVirtual */);\n\n    op(1\n    /* PopFrame */);\n  }\n  /**\n   * Invoke a static block, preserving some number of stack entries for use in\n   * updating.\n   *\n   * @param block A compilable block\n   * @param callerCount A number of stack entries to preserve\n   */\n\n  function InvokeStaticBlockWithStack(op, block, callerCount) {\n    var parameters = block[1];\n    var calleeCount = parameters.length;\n    var count = Math.min(callerCount, calleeCount);\n    if (count === 0) {\n      InvokeStaticBlock(op, block);\n      return;\n    }\n    op(0\n    /* PushFrame */);\n\n    if (count) {\n      op(39\n      /* ChildScope */);\n\n      for (var i = 0; i < count; i++) {\n        op(33\n        /* Dup */, _vm.$fp, callerCount - i);\n        op(19\n        /* SetVariable */, parameters[i]);\n      }\n    }\n    PushCompilable(op, block);\n    op(61\n    /* CompileBlock */);\n\n    op(2\n    /* InvokeVirtual */);\n\n    if (count) {\n      op(40\n      /* PopScope */);\n    }\n\n    op(1\n    /* PopFrame */);\n  }\n\n  function PushSymbolTable(op, parameters) {\n    if (parameters !== null) {\n      op(63\n      /* PushSymbolTable */, symbolTableOperand({\n        parameters\n      }));\n    } else {\n      PushPrimitive(op, null);\n    }\n  }\n  function PushCompilable(op, _block) {\n    if (_block === null) {\n      PushPrimitive(op, null);\n    } else {\n      op(28\n      /* Constant */, blockOperand(_block));\n    }\n  }\n  function SwitchCases(op, bootstrap, callback) {\n    // Setup the switch DSL\n    var clauses = [];\n    var count = 0;\n    function when(match, callback) {\n      clauses.push({\n        match,\n        callback,\n        label: `CLAUSE${count++}`\n      });\n    } // Call the callback\n\n    callback(when); // Emit the opcodes for the switch\n\n    op(69\n    /* Enter */, 1);\n    bootstrap();\n    op(1001\n    /* StartLabels */); // First, emit the jump opcodes. We don't need a jump for the last\n    // opcode, since it bleeds directly into its clause.\n\n    for (var clause of clauses.slice(0, -1)) {\n      op(67\n      /* JumpEq */, labelOperand(clause.label), clause.match);\n    } // Enumerate the clauses in reverse order. Earlier matches will\n    // require fewer checks.\n\n    for (var i = clauses.length - 1; i >= 0; i--) {\n      var _clause = clauses[i];\n      op(1000\n      /* Label */, _clause.label);\n      op(34\n      /* Pop */, 1);\n      _clause.callback(); // The first match is special: it is placed directly before the END\n      // label, so no additional jump is needed at the end of it.\n\n      if (i !== 0) {\n        op(4\n        /* Jump */, labelOperand('END'));\n      }\n    }\n    op(1000\n    /* Label */, 'END');\n    op(1002\n    /* StopLabels */);\n\n    op(70\n    /* Exit */);\n  }\n  /**\n   * A convenience for pushing some arguments on the stack and\n   * running some code if the code needs to be re-executed during\n   * updating execution if some of the arguments have changed.\n   *\n   * # Initial Execution\n   *\n   * The `args` function should push zero or more arguments onto\n   * the stack and return the number of arguments pushed.\n   *\n   * The `body` function provides the instructions to execute both\n   * during initial execution and during updating execution.\n   *\n   * Internally, this function starts by pushing a new frame, so\n   * that the body can return and sets the return point ($ra) to\n   * the ENDINITIAL label.\n   *\n   * It then executes the `args` function, which adds instructions\n   * responsible for pushing the arguments for the block to the\n   * stack. These arguments will be restored to the stack before\n   * updating execution.\n   *\n   * Next, it adds the Enter opcode, which marks the current position\n   * in the DOM, and remembers the current $pc (the next instruction)\n   * as the first instruction to execute during updating execution.\n   *\n   * Next, it runs `body`, which adds the opcodes that should\n   * execute both during initial execution and during updating execution.\n   * If the `body` wishes to finish early, it should Jump to the\n   * `FINALLY` label.\n   *\n   * Next, it adds the FINALLY label, followed by:\n   *\n   * - the Exit opcode, which finalizes the marked DOM started by the\n   *   Enter opcode.\n   * - the Return opcode, which returns to the current return point\n   *   ($ra).\n   *\n   * Finally, it adds the ENDINITIAL label followed by the PopFrame\n   * instruction, which restores $fp, $sp and $ra.\n   *\n   * # Updating Execution\n   *\n   * Updating execution for this `replayable` occurs if the `body` added an\n   * assertion, via one of the `JumpIf`, `JumpUnless` or `AssertSame` opcodes.\n   *\n   * If, during updating executon, the assertion fails, the initial VM is\n   * restored, and the stored arguments are pushed onto the stack. The DOM\n   * between the starting and ending markers is cleared, and the VM's cursor\n   * is set to the area just cleared.\n   *\n   * The return point ($ra) is set to -1, the exit instruction.\n   *\n   * Finally, the $pc is set to to the instruction saved off by the\n   * Enter opcode during initial execution, and execution proceeds as\n   * usual.\n   *\n   * The only difference is that when a `Return` instruction is\n   * encountered, the program jumps to -1 rather than the END label,\n   * and the PopFrame opcode is not needed.\n   */\n\n  function Replayable(op, args, body) {\n    // Start a new label frame, to give END and RETURN\n    // a unique meaning.\n    op(1001\n    /* StartLabels */);\n\n    op(0\n    /* PushFrame */); // If the body invokes a block, its return will return to\n    // END. Otherwise, the return in RETURN will return to END.\n\n    op(6\n    /* ReturnTo */, labelOperand('ENDINITIAL')); // Push the arguments onto the stack. The args() function\n    // tells us how many stack elements to retain for re-execution\n    // when updating.\n\n    var count = args(); // Start a new updating closure, remembering `count` elements\n    // from the stack. Everything after this point, and before END,\n    // will execute both initially and to update the block.\n    //\n    // The enter and exit opcodes also track the area of the DOM\n    // associated with this block. If an assertion inside the block\n    // fails (for example, the test value changes from true to false\n    // in an #if), the DOM is cleared and the program is re-executed,\n    // restoring `count` elements to the stack and executing the\n    // instructions between the enter and exit.\n\n    op(69\n    /* Enter */, count); // Evaluate the body of the block. The body of the block may\n    // return, which will jump execution to END during initial\n    // execution, and exit the updating routine.\n\n    body(); // All execution paths in the body should run the FINALLY once\n    // they are done. It is executed both during initial execution\n    // and during updating execution.\n\n    op(1000\n    /* Label */, 'FINALLY'); // Finalize the DOM.\n\n    op(70\n    /* Exit */); // In initial execution, this is a noop: it returns to the\n    // immediately following opcode. In updating execution, this\n    // exits the updating routine.\n\n    op(5\n    /* Return */); // Cleanup code for the block. Runs on initial execution\n    // but not on updating.\n\n    op(1000\n    /* Label */, 'ENDINITIAL');\n    op(1\n    /* PopFrame */);\n\n    op(1002\n    /* StopLabels */);\n  }\n  /**\n   * A specialized version of the `replayable` convenience that allows the\n   * caller to provide different code based upon whether the item at\n   * the top of the stack is true or false.\n   *\n   * As in `replayable`, the `ifTrue` and `ifFalse` code can invoke `return`.\n   *\n   * During the initial execution, a `return` will continue execution\n   * in the cleanup code, which finalizes the current DOM block and pops\n   * the current frame.\n   *\n   * During the updating execution, a `return` will exit the updating\n   * routine, as it can reuse the DOM block and is always only a single\n   * frame deep.\n   */\n\n  function ReplayableIf(op, args, ifTrue, ifFalse) {\n    return Replayable(op, args, () => {\n      // If the conditional is false, jump to the ELSE label.\n      op(66\n      /* JumpUnless */, labelOperand('ELSE')); // Otherwise, execute the code associated with the true branch.\n\n      ifTrue(); // We're done, so return. In the initial execution, this runs\n      // the cleanup code. In the updating VM, it exits the updating\n      // routine.\n\n      op(4\n      /* Jump */, labelOperand('FINALLY'));\n      op(1000\n      /* Label */, 'ELSE'); // If the conditional is false, and code associatied ith the\n      // false branch was provided, execute it. If there was no code\n      // associated with the false branch, jumping to the else statement\n      // has no other behavior.\n\n      if (ifFalse !== undefined) {\n        ifFalse();\n      }\n    });\n  }\n  var ATTRS_BLOCK = '&attrs';\n  function InvokeComponent(op, component, _elementBlock, positional, named, _blocks) {\n    var {\n      compilable,\n      capabilities,\n      handle\n    } = component;\n    var elementBlock = _elementBlock ? [_elementBlock, []] : null;\n    var blocks = Array.isArray(_blocks) || _blocks === null ? namedBlocks(_blocks) : _blocks;\n    if (compilable) {\n      op(78\n      /* PushComponentDefinition */, handle);\n      InvokeStaticComponent(op, {\n        capabilities: capabilities,\n        layout: compilable,\n        elementBlock,\n        positional,\n        named,\n        blocks\n      });\n    } else {\n      op(78\n      /* PushComponentDefinition */, handle);\n      InvokeNonStaticComponent(op, {\n        capabilities: capabilities,\n        elementBlock,\n        positional,\n        named,\n        atNames: true,\n        blocks\n      });\n    }\n  }\n  function InvokeDynamicComponent(op, definition, _elementBlock, positional, named, _blocks, atNames, curried) {\n    var elementBlock = _elementBlock ? [_elementBlock, []] : null;\n    var blocks = Array.isArray(_blocks) || _blocks === null ? namedBlocks(_blocks) : _blocks;\n    Replayable(op, () => {\n      expr(op, definition);\n      op(33\n      /* Dup */, _vm.$sp, 0);\n      return 2;\n    }, () => {\n      op(66\n      /* JumpUnless */, labelOperand('ELSE'));\n      if (curried) {\n        op(81\n        /* ResolveCurriedComponent */);\n      } else {\n        op(80\n        /* ResolveDynamicComponent */, isStrictMode());\n      }\n      op(79\n      /* PushDynamicComponentInstance */);\n\n      InvokeNonStaticComponent(op, {\n        capabilities: true,\n        elementBlock,\n        positional,\n        named,\n        atNames,\n        blocks\n      });\n      op(1000\n      /* Label */, 'ELSE');\n    });\n  }\n  function InvokeStaticComponent(op, _ref19) {\n    var {\n      capabilities,\n      layout,\n      elementBlock,\n      positional,\n      named,\n      blocks\n    } = _ref19;\n    var {\n      symbolTable\n    } = layout;\n    var bailOut = symbolTable.hasEval || (0, _manager.hasCapability)(capabilities, 4\n    /* PrepareArgs */);\n\n    if (bailOut) {\n      InvokeNonStaticComponent(op, {\n        capabilities,\n        elementBlock,\n        positional,\n        named,\n        atNames: true,\n        blocks,\n        layout\n      });\n      return;\n    }\n    op(36\n    /* Fetch */, _vm.$s0);\n    op(33\n    /* Dup */, _vm.$sp, 1);\n    op(35\n    /* Load */, _vm.$s0);\n    op(0\n    /* PushFrame */); // Setup arguments\n\n    var {\n      symbols\n    } = symbolTable; // As we push values onto the stack, we store the symbols associated  with them\n    // so that we can set them on the scope later on with SetVariable and SetBlock\n\n    var blockSymbols = [];\n    var argSymbols = [];\n    var argNames = []; // First we push the blocks onto the stack\n\n    var blockNames = blocks.names; // Starting with the attrs block, if it exists and is referenced in the component\n\n    if (elementBlock !== null) {\n      var symbol = symbols.indexOf(ATTRS_BLOCK);\n      if (symbol !== -1) {\n        PushYieldableBlock(op, elementBlock);\n        blockSymbols.push(symbol);\n      }\n    } // Followed by the other blocks, if they exist and are referenced in the component.\n    // Also store the index of the associated symbol.\n\n    for (var i = 0; i < blockNames.length; i++) {\n      var name = blockNames[i];\n      var _symbol = symbols.indexOf(`&${name}`);\n      if (_symbol !== -1) {\n        PushYieldableBlock(op, blocks.get(name));\n        blockSymbols.push(_symbol);\n      }\n    } // Next up we have arguments. If the component has the `createArgs` capability,\n    // then it wants access to the arguments in JavaScript. We can't know whether\n    // or not an argument is used, so we have to give access to all of them.\n\n    if ((0, _manager.hasCapability)(capabilities, 8\n    /* CreateArgs */)) {\n      // First we push positional arguments\n      var count = CompilePositional(op, positional); // setup the flags with the count of positionals, and to indicate that atNames\n      // are used\n\n      var flags = count << 4;\n      flags |= 0b1000;\n      var names = _util.EMPTY_STRING_ARRAY; // Next, if named args exist, push them all. If they have an associated symbol\n      // in the invoked component (e.g. they are used within its template), we push\n      // that symbol. If not, we still push the expression as it may be used, and\n      // we store the symbol as -1 (this is used later).\n\n      if (named !== null) {\n        names = named[0];\n        var val = named[1];\n        for (var _i2 = 0; _i2 < val.length; _i2++) {\n          var _symbol2 = symbols.indexOf(names[_i2]);\n          expr(op, val[_i2]);\n          argSymbols.push(_symbol2);\n        }\n      } // Finally, push the VM arguments themselves. These args won't need access\n      // to blocks (they aren't accessible from userland anyways), so we push an\n      // empty array instead of the actual block names.\n\n      op(82\n      /* PushArgs */, names, _util.EMPTY_STRING_ARRAY, flags); // And push an extra pop operation to remove the args before we begin setting\n      // variables on the local context\n\n      argSymbols.push(-1);\n    } else if (named !== null) {\n      // If the component does not have the `createArgs` capability, then the only\n      // expressions we need to push onto the stack are those that are actually\n      // referenced in the template of the invoked component (e.g. have symbols).\n      var _names = named[0];\n      var _val = named[1];\n      for (var _i3 = 0; _i3 < _val.length; _i3++) {\n        var _name3 = _names[_i3];\n        var _symbol3 = symbols.indexOf(_name3);\n        if (_symbol3 !== -1) {\n          expr(op, _val[_i3]);\n          argSymbols.push(_symbol3);\n          argNames.push(_name3);\n        }\n      }\n    }\n    op(97\n    /* BeginComponentTransaction */, _vm.$s0);\n    if ((0, _manager.hasCapability)(capabilities, 64\n    /* DynamicScope */)) {\n      op(59\n      /* PushDynamicScope */);\n    }\n\n    if ((0, _manager.hasCapability)(capabilities, 512\n    /* CreateInstance */)) {\n      op(87\n      /* CreateComponent */, blocks.has('default') | 0, _vm.$s0);\n    }\n    op(88\n    /* RegisterComponentDestructor */, _vm.$s0);\n    if ((0, _manager.hasCapability)(capabilities, 8\n    /* CreateArgs */)) {\n      op(90\n      /* GetComponentSelf */, _vm.$s0);\n    } else {\n      op(90\n      /* GetComponentSelf */, _vm.$s0, argNames);\n    } // Setup the new root scope for the component\n\n    op(37\n    /* RootScope */, symbols.length + 1, Object.keys(blocks).length > 0 ? 1 : 0); // Pop the self reference off the stack and set it to the symbol for `this`\n    // in the new scope. This is why all subsequent symbols are increased by one.\n\n    op(19\n    /* SetVariable */, 0); // Going in reverse, now we pop the args/blocks off the stack, starting with\n    // arguments, and assign them to their symbols in the new scope.\n\n    for (var _i4 = argSymbols.length - 1; _i4 >= 0; _i4--) {\n      var _symbol4 = argSymbols[_i4];\n      if (_symbol4 === -1) {\n        // The expression was not bound to a local symbol, it was only pushed to be\n        // used with VM args in the javascript side\n        op(34\n        /* Pop */, 1);\n      } else {\n        op(19\n        /* SetVariable */, _symbol4 + 1);\n      }\n    } // if any positional params exist, pop them off the stack as well\n\n    if (positional !== null) {\n      op(34\n      /* Pop */, positional.length);\n    } // Finish up by popping off and assigning blocks\n\n    for (var _i5 = blockSymbols.length - 1; _i5 >= 0; _i5--) {\n      var _symbol5 = blockSymbols[_i5];\n      op(20\n      /* SetBlock */, _symbol5 + 1);\n    }\n    op(28\n    /* Constant */, layoutOperand(layout));\n    op(61\n    /* CompileBlock */);\n\n    op(2\n    /* InvokeVirtual */);\n\n    op(100\n    /* DidRenderLayout */, _vm.$s0);\n    op(1\n    /* PopFrame */);\n\n    op(40\n    /* PopScope */);\n\n    if ((0, _manager.hasCapability)(capabilities, 64\n    /* DynamicScope */)) {\n      op(60\n      /* PopDynamicScope */);\n    }\n\n    op(98\n    /* CommitComponentTransaction */);\n\n    op(35\n    /* Load */, _vm.$s0);\n  }\n  function InvokeNonStaticComponent(op, _ref20) {\n    var {\n      capabilities,\n      elementBlock,\n      positional,\n      named,\n      atNames,\n      blocks: namedBlocks$$1,\n      layout\n    } = _ref20;\n    var bindableBlocks = !!namedBlocks$$1;\n    var bindableAtNames = capabilities === true || (0, _manager.hasCapability)(capabilities, 4\n    /* PrepareArgs */) || !!(named && named[0].length !== 0);\n    var blocks = namedBlocks$$1.with('attrs', elementBlock);\n    op(36\n    /* Fetch */, _vm.$s0);\n    op(33\n    /* Dup */, _vm.$sp, 1);\n    op(35\n    /* Load */, _vm.$s0);\n    op(0\n    /* PushFrame */);\n\n    CompileArgs(op, positional, named, blocks, atNames);\n    op(85\n    /* PrepareArgs */, _vm.$s0);\n    invokePreparedComponent(op, blocks.has('default'), bindableBlocks, bindableAtNames, () => {\n      if (layout) {\n        op(63\n        /* PushSymbolTable */, symbolTableOperand(layout.symbolTable));\n        op(28\n        /* Constant */, layoutOperand(layout));\n        op(61\n        /* CompileBlock */);\n      } else {\n        op(92\n        /* GetComponentLayout */, _vm.$s0);\n      }\n      op(95\n      /* PopulateLayout */, _vm.$s0);\n    });\n    op(35\n    /* Load */, _vm.$s0);\n  }\n  function WrappedComponent(op, layout, attrsBlockNumber) {\n    op(1001\n    /* StartLabels */);\n\n    WithSavedRegister(op, _vm.$s1, () => {\n      op(91\n      /* GetComponentTagName */, _vm.$s0);\n      op(31\n      /* PrimitiveReference */);\n\n      op(33\n      /* Dup */, _vm.$sp, 0);\n    });\n    op(66\n    /* JumpUnless */, labelOperand('BODY'));\n    op(36\n    /* Fetch */, _vm.$s1);\n    op(89\n    /* PutComponentOperations */);\n\n    op(49\n    /* OpenDynamicElement */);\n\n    op(99\n    /* DidCreateElement */, _vm.$s0);\n    YieldBlock(op, attrsBlockNumber, null);\n    op(54\n    /* FlushElement */);\n\n    op(1000\n    /* Label */, 'BODY');\n    InvokeStaticBlock(op, [layout.block[0], []]);\n    op(36\n    /* Fetch */, _vm.$s1);\n    op(66\n    /* JumpUnless */, labelOperand('END'));\n    op(55\n    /* CloseElement */);\n\n    op(1000\n    /* Label */, 'END');\n    op(35\n    /* Load */, _vm.$s1);\n    op(1002\n    /* StopLabels */);\n  }\n\n  function invokePreparedComponent(op, hasBlock, bindableBlocks, bindableAtNames, populateLayout) {\n    if (populateLayout === void 0) {\n      populateLayout = null;\n    }\n    op(97\n    /* BeginComponentTransaction */, _vm.$s0);\n    op(59\n    /* PushDynamicScope */);\n\n    op(87\n    /* CreateComponent */, hasBlock | 0, _vm.$s0); // this has to run after createComponent to allow\n    // for late-bound layouts, but a caller is free\n    // to populate the layout earlier if it wants to\n    // and do nothing here.\n\n    if (populateLayout) {\n      populateLayout();\n    }\n    op(88\n    /* RegisterComponentDestructor */, _vm.$s0);\n    op(90\n    /* GetComponentSelf */, _vm.$s0);\n    op(38\n    /* VirtualRootScope */, _vm.$s0);\n    op(19\n    /* SetVariable */, 0);\n    op(94\n    /* SetupForEval */, _vm.$s0);\n    if (bindableAtNames) op(17\n    /* SetNamedVariables */, _vm.$s0);\n    if (bindableBlocks) op(18\n    /* SetBlocks */, _vm.$s0);\n    op(34\n    /* Pop */, 1);\n    op(96\n    /* InvokeComponentLayout */, _vm.$s0);\n    op(100\n    /* DidRenderLayout */, _vm.$s0);\n    op(1\n    /* PopFrame */);\n\n    op(40\n    /* PopScope */);\n\n    op(60\n    /* PopDynamicScope */);\n\n    op(98\n    /* CommitComponentTransaction */);\n  }\n\n  function InvokeBareComponent(op) {\n    op(36\n    /* Fetch */, _vm.$s0);\n    op(33\n    /* Dup */, _vm.$sp, 1);\n    op(35\n    /* Load */, _vm.$s0);\n    op(0\n    /* PushFrame */);\n\n    op(83\n    /* PushEmptyArgs */);\n\n    op(85\n    /* PrepareArgs */, _vm.$s0);\n    invokePreparedComponent(op, false, false, true, () => {\n      op(92\n      /* GetComponentLayout */, _vm.$s0);\n      op(95\n      /* PopulateLayout */, _vm.$s0);\n    });\n    op(35\n    /* Load */, _vm.$s0);\n  }\n  function WithSavedRegister(op, register, block) {\n    op(36\n    /* Fetch */, register);\n    block();\n    op(35\n    /* Load */, register);\n  }\n  class StdLib {\n    constructor(main, trustingGuardedAppend, cautiousGuardedAppend, trustingNonDynamicAppend, cautiousNonDynamicAppend) {\n      this.main = main;\n      this.trustingGuardedAppend = trustingGuardedAppend;\n      this.cautiousGuardedAppend = cautiousGuardedAppend;\n      this.trustingNonDynamicAppend = trustingNonDynamicAppend;\n      this.cautiousNonDynamicAppend = cautiousNonDynamicAppend;\n    }\n    get 'trusting-append'() {\n      return this.trustingGuardedAppend;\n    }\n    get 'cautious-append'() {\n      return this.cautiousGuardedAppend;\n    }\n    get 'trusting-non-dynamic-append'() {\n      return this.trustingNonDynamicAppend;\n    }\n    get 'cautious-non-dynamic-append'() {\n      return this.cautiousNonDynamicAppend;\n    }\n    getAppend(trusting) {\n      return trusting ? this.trustingGuardedAppend : this.cautiousGuardedAppend;\n    }\n  }\n  _exports.StdLib = StdLib;\n  function programCompilationContext(artifacts, resolver) {\n    return new CompileTimeCompilationContextImpl(artifacts, resolver);\n  }\n  function templateCompilationContext(program, meta) {\n    var encoder = new EncoderImpl(program.heap, meta, program.stdlib);\n    return {\n      program,\n      encoder,\n      meta\n    };\n  }\n  var debugCompiler;\n  _exports.debugCompiler = debugCompiler;\n  var STATEMENTS = new Compilers();\n  var INFLATE_ATTR_TABLE = ['class', 'id', 'value', 'name', 'type', 'style', 'href'];\n  var INFLATE_TAG_TABLE = ['div', 'span', 'p', 'a'];\n  function inflateTagName(tagName) {\n    return typeof tagName === 'string' ? tagName : INFLATE_TAG_TABLE[tagName];\n  }\n  function inflateAttrName(attrName) {\n    return typeof attrName === 'string' ? attrName : INFLATE_ATTR_TABLE[attrName];\n  }\n  STATEMENTS.add(3\n  /* Comment */, (op, sexp) => op(42\n  /* Comment */, sexp[1]));\n  STATEMENTS.add(13\n  /* CloseElement */, op => op(55\n  /* CloseElement */));\n\n  STATEMENTS.add(12\n  /* FlushElement */, op => op(54\n  /* FlushElement */));\n\n  STATEMENTS.add(4\n  /* Modifier */, (op, _ref21) => {\n    var [, expression, positional, named] = _ref21;\n    if (isGetFreeModifier(expression)) {\n      op(1003\n      /* ResolveModifier */, expression, handle => {\n        op(0\n        /* PushFrame */);\n\n        SimpleArgs(op, positional, named, false);\n        op(57\n        /* Modifier */, handle);\n        op(1\n        /* PopFrame */);\n      });\n    } else {\n      expr(op, expression);\n      op(0\n      /* PushFrame */);\n\n      SimpleArgs(op, positional, named, false);\n      op(33\n      /* Dup */, _vm.$fp, 1);\n      op(108\n      /* DynamicModifier */);\n\n      op(1\n      /* PopFrame */);\n    }\n  });\n\n  STATEMENTS.add(14\n  /* StaticAttr */, (op, _ref22) => {\n    var [, name, value, namespace] = _ref22;\n    op(51\n    /* StaticAttr */, inflateAttrName(name), value, namespace !== null && namespace !== void 0 ? namespace : null);\n  });\n  STATEMENTS.add(24\n  /* StaticComponentAttr */, (op, _ref23) => {\n    var [, name, value, namespace] = _ref23;\n    op(105\n    /* StaticComponentAttr */, inflateAttrName(name), value, namespace !== null && namespace !== void 0 ? namespace : null);\n  });\n  STATEMENTS.add(15\n  /* DynamicAttr */, (op, _ref24) => {\n    var [, name, value, namespace] = _ref24;\n    expr(op, value);\n    op(52\n    /* DynamicAttr */, inflateAttrName(name), false, namespace !== null && namespace !== void 0 ? namespace : null);\n  });\n  STATEMENTS.add(22\n  /* TrustingDynamicAttr */, (op, _ref25) => {\n    var [, name, value, namespace] = _ref25;\n    expr(op, value);\n    op(52\n    /* DynamicAttr */, inflateAttrName(name), true, namespace !== null && namespace !== void 0 ? namespace : null);\n  });\n  STATEMENTS.add(16\n  /* ComponentAttr */, (op, _ref26) => {\n    var [, name, value, namespace] = _ref26;\n    expr(op, value);\n    op(53\n    /* ComponentAttr */, inflateAttrName(name), false, namespace !== null && namespace !== void 0 ? namespace : null);\n  });\n  STATEMENTS.add(23\n  /* TrustingComponentAttr */, (op, _ref27) => {\n    var [, name, value, namespace] = _ref27;\n    expr(op, value);\n    op(53\n    /* ComponentAttr */, inflateAttrName(name), true, namespace !== null && namespace !== void 0 ? namespace : null);\n  });\n  STATEMENTS.add(10\n  /* OpenElement */, (op, _ref28) => {\n    var [, tag] = _ref28;\n    op(48\n    /* OpenElement */, inflateTagName(tag));\n  });\n  STATEMENTS.add(11\n  /* OpenElementWithSplat */, (op, _ref29) => {\n    var [, tag] = _ref29;\n    op(89\n    /* PutComponentOperations */);\n\n    op(48\n    /* OpenElement */, inflateTagName(tag));\n  });\n  STATEMENTS.add(8\n  /* Component */, (op, _ref30) => {\n    var [, expr$$1, elementBlock, named, blocks] = _ref30;\n    if (isGetFreeComponent(expr$$1)) {\n      op(1004\n      /* ResolveComponent */, expr$$1, component => {\n        InvokeComponent(op, component, elementBlock, null, named, blocks);\n      });\n    } else {\n      // otherwise, the component name was an expression, so resolve the expression\n      // and invoke it as a dynamic component\n      InvokeDynamicComponent(op, expr$$1, elementBlock, null, named, blocks, true, true);\n    }\n  });\n  STATEMENTS.add(18\n  /* Yield */, (op, _ref31) => {\n    var [, to, params] = _ref31;\n    return YieldBlock(op, to, params);\n  });\n  STATEMENTS.add(17\n  /* AttrSplat */, (op, _ref32) => {\n    var [, to] = _ref32;\n    return YieldBlock(op, to, null);\n  });\n  STATEMENTS.add(26\n  /* Debugger */, (op, _ref33) => {\n    var [, evalInfo] = _ref33;\n    return op(103\n    /* Debugger */, evalSymbolsOperand(), evalInfo);\n  });\n  STATEMENTS.add(1\n  /* Append */, (op, _ref34) => {\n    var [, value] = _ref34;\n    // Special case for static values\n    if (!Array.isArray(value)) {\n      op(41\n      /* Text */, value === null || value === undefined ? '' : String(value));\n    } else if (isGetFreeOptionalComponentOrHelper(value)) {\n      op(1008\n      /* ResolveOptionalComponentOrHelper */, value, {\n        ifComponent(component) {\n          InvokeComponent(op, component, null, null, null, null);\n        },\n        ifHelper(handle) {\n          op(0\n          /* PushFrame */);\n\n          Call(op, handle, null, null);\n          op(3\n          /* InvokeStatic */, stdlibOperand('cautious-non-dynamic-append'));\n          op(1\n          /* PopFrame */);\n        },\n\n        ifValue(handle) {\n          op(0\n          /* PushFrame */);\n\n          op(29\n          /* ConstantReference */, handle);\n          op(3\n          /* InvokeStatic */, stdlibOperand('cautious-non-dynamic-append'));\n          op(1\n          /* PopFrame */);\n        }\n      });\n    } else if (value[0] === 28\n    /* Call */) {\n      var [, expression, positional, named] = value;\n      if (isGetFreeComponentOrHelper(expression)) {\n        op(1007\n        /* ResolveComponentOrHelper */, expression, {\n          ifComponent(component) {\n            InvokeComponent(op, component, null, positional, hashToArgs(named), null);\n          },\n          ifHelper(handle) {\n            op(0\n            /* PushFrame */);\n\n            Call(op, handle, positional, named);\n            op(3\n            /* InvokeStatic */, stdlibOperand('cautious-non-dynamic-append'));\n            op(1\n            /* PopFrame */);\n          }\n        });\n      } else {\n        SwitchCases(op, () => {\n          expr(op, expression);\n          op(106\n          /* DynamicContentType */);\n        }, when => {\n          when(0\n          /* Component */, () => {\n            op(81\n            /* ResolveCurriedComponent */);\n\n            op(79\n            /* PushDynamicComponentInstance */);\n\n            InvokeNonStaticComponent(op, {\n              capabilities: true,\n              elementBlock: null,\n              positional,\n              named,\n              atNames: false,\n              blocks: namedBlocks(null)\n            });\n          });\n          when(1\n          /* Helper */, () => {\n            CallDynamic(op, positional, named, () => {\n              op(3\n              /* InvokeStatic */, stdlibOperand('cautious-non-dynamic-append'));\n            });\n          });\n        });\n      }\n    } else {\n      op(0\n      /* PushFrame */);\n\n      expr(op, value);\n      op(3\n      /* InvokeStatic */, stdlibOperand('cautious-append'));\n      op(1\n      /* PopFrame */);\n    }\n  });\n\n  STATEMENTS.add(2\n  /* TrustingAppend */, (op, _ref35) => {\n    var [, value] = _ref35;\n    if (!Array.isArray(value)) {\n      op(41\n      /* Text */, value === null || value === undefined ? '' : String(value));\n    } else {\n      op(0\n      /* PushFrame */);\n\n      expr(op, value);\n      op(3\n      /* InvokeStatic */, stdlibOperand('trusting-append'));\n      op(1\n      /* PopFrame */);\n    }\n  });\n\n  STATEMENTS.add(6\n  /* Block */, (op, _ref36) => {\n    var [, expr$$1, positional, named, blocks] = _ref36;\n    if (isGetFreeComponent(expr$$1)) {\n      op(1004\n      /* ResolveComponent */, expr$$1, component => {\n        InvokeComponent(op, component, null, positional, hashToArgs(named), blocks);\n      });\n    } else {\n      InvokeDynamicComponent(op, expr$$1, null, positional, named, blocks, false, false);\n    }\n  });\n  STATEMENTS.add(40\n  /* InElement */, (op, _ref37) => {\n    var [, block, guid, destination, insertBefore] = _ref37;\n    ReplayableIf(op, () => {\n      expr(op, guid);\n      if (insertBefore === undefined) {\n        PushPrimitiveReference(op, undefined);\n      } else {\n        expr(op, insertBefore);\n      }\n      expr(op, destination);\n      op(33\n      /* Dup */, _vm.$sp, 0);\n      return 4;\n    }, () => {\n      op(50\n      /* PushRemoteElement */);\n\n      InvokeStaticBlock(op, block);\n      op(56\n      /* PopRemoteElement */);\n    });\n  });\n\n  STATEMENTS.add(41\n  /* If */, (op, _ref38) => {\n    var [, condition, block, inverse] = _ref38;\n    return ReplayableIf(op, () => {\n      expr(op, condition);\n      op(71\n      /* ToBoolean */);\n\n      return 1;\n    }, () => {\n      InvokeStaticBlock(op, block);\n    }, inverse ? () => {\n      InvokeStaticBlock(op, inverse);\n    } : undefined);\n  });\n  STATEMENTS.add(42\n  /* Each */, (op, _ref39) => {\n    var [, value, key, block, inverse] = _ref39;\n    return Replayable(op, () => {\n      if (key) {\n        expr(op, key);\n      } else {\n        PushPrimitiveReference(op, null);\n      }\n      expr(op, value);\n      return 2;\n    }, () => {\n      op(72\n      /* EnterList */, labelOperand('BODY'), labelOperand('ELSE'));\n      op(0\n      /* PushFrame */);\n\n      op(33\n      /* Dup */, _vm.$fp, 1);\n      op(6\n      /* ReturnTo */, labelOperand('ITER'));\n      op(1000\n      /* Label */, 'ITER');\n      op(74\n      /* Iterate */, labelOperand('BREAK'));\n      op(1000\n      /* Label */, 'BODY');\n      InvokeStaticBlockWithStack(op, block, 2);\n      op(34\n      /* Pop */, 2);\n      op(4\n      /* Jump */, labelOperand('FINALLY'));\n      op(1000\n      /* Label */, 'BREAK');\n      op(1\n      /* PopFrame */);\n\n      op(73\n      /* ExitList */);\n\n      op(4\n      /* Jump */, labelOperand('FINALLY'));\n      op(1000\n      /* Label */, 'ELSE');\n      if (inverse) {\n        InvokeStaticBlock(op, inverse);\n      }\n    });\n  });\n  STATEMENTS.add(43\n  /* With */, (op, _ref40) => {\n    var [, value, block, inverse] = _ref40;\n    ReplayableIf(op, () => {\n      expr(op, value);\n      op(33\n      /* Dup */, _vm.$sp, 0);\n      op(71\n      /* ToBoolean */);\n\n      return 2;\n    }, () => {\n      InvokeStaticBlockWithStack(op, block, 1);\n    }, () => {\n      if (inverse) {\n        InvokeStaticBlock(op, inverse);\n      }\n    });\n  });\n  STATEMENTS.add(44\n  /* Let */, (op, _ref41) => {\n    var [, positional, block] = _ref41;\n    var count = CompilePositional(op, positional);\n    InvokeStaticBlockWithStack(op, block, count);\n  });\n  STATEMENTS.add(45\n  /* WithDynamicVars */, (op, _ref42) => {\n    var [, named, block] = _ref42;\n    if (named) {\n      var [names, expressions] = named;\n      CompilePositional(op, expressions);\n      DynamicScope(op, names, () => {\n        InvokeStaticBlock(op, block);\n      });\n    } else {\n      InvokeStaticBlock(op, block);\n    }\n  });\n  STATEMENTS.add(46\n  /* InvokeComponent */, (op, _ref43) => {\n    var [, expr$$1, positional, named, blocks] = _ref43;\n    if (isGetFreeComponent(expr$$1)) {\n      op(1004\n      /* ResolveComponent */, expr$$1, component => {\n        InvokeComponent(op, component, null, positional, hashToArgs(named), blocks);\n      });\n    } else {\n      InvokeDynamicComponent(op, expr$$1, null, positional, named, blocks, false, false);\n    }\n  });\n  function hashToArgs(hash) {\n    if (hash === null) return null;\n    var names = hash[0].map(key => `@${key}`);\n    return [names, hash[1]];\n  }\n  var PLACEHOLDER_HANDLE = -1;\n  class CompilableTemplateImpl {\n    constructor(statements, meta$$1,\n    // Part of CompilableTemplate\n    symbolTable,\n    // Used for debugging\n    moduleName) {\n      if (moduleName === void 0) {\n        moduleName = 'plain block';\n      }\n      this.statements = statements;\n      this.meta = meta$$1;\n      this.symbolTable = symbolTable;\n      this.moduleName = moduleName;\n      this.compiled = null;\n    } // Part of CompilableTemplate\n\n    compile(context) {\n      return maybeCompile(this, context);\n    }\n  }\n  function compilable(layout, moduleName) {\n    var [statements, symbols, hasEval] = layout.block;\n    return new CompilableTemplateImpl(statements, meta(layout), {\n      symbols,\n      hasEval\n    }, moduleName);\n  }\n  function maybeCompile(compilable, context) {\n    if (compilable.compiled !== null) return compilable.compiled;\n    compilable.compiled = PLACEHOLDER_HANDLE;\n    var {\n      statements,\n      meta: meta$$1\n    } = compilable;\n    var result = compileStatements(statements, meta$$1, context);\n    compilable.compiled = result;\n    return result;\n  }\n  function compileStatements(statements, meta$$1, syntaxContext) {\n    var sCompiler = STATEMENTS;\n    var context = templateCompilationContext(syntaxContext, meta$$1);\n    var {\n      encoder,\n      program: {\n        constants,\n        resolver\n      }\n    } = context;\n    function pushOp() {\n      for (var _len = arguments.length, op = new Array(_len), _key = 0; _key < _len; _key++) {\n        op[_key] = arguments[_key];\n      }\n      encodeOp(encoder, constants, resolver, meta$$1, op);\n    }\n    for (var i = 0; i < statements.length; i++) {\n      sCompiler.compile(pushOp, statements[i]);\n    }\n    var handle = context.encoder.commit(meta$$1.size);\n    return handle;\n  }\n  function compilableBlock(block, containing) {\n    return new CompilableTemplateImpl(block[0], containing, {\n      parameters: block[1] || _util.EMPTY_ARRAY\n    });\n  }\n  class Labels {\n    constructor() {\n      this.labels = (0, _util.dict)();\n      this.targets = [];\n    }\n    label(name, index) {\n      this.labels[name] = index;\n    }\n    target(at, target) {\n      this.targets.push({\n        at,\n        target\n      });\n    }\n    patch(heap) {\n      var {\n        targets,\n        labels\n      } = this;\n      for (var i = 0; i < targets.length; i++) {\n        var {\n          at,\n          target\n        } = targets[i];\n        var address = labels[target] - at;\n        heap.setbyaddr(at, address);\n      }\n    }\n  }\n  function encodeOp(encoder, constants, resolver, meta, op) {\n    if (isBuilderOpcode(op[0])) {\n      var [type, ...operands] = op;\n      encoder.push(constants, type, ...operands);\n    } else {\n      switch (op[0]) {\n        case 1000\n        /* Label */:\n          return encoder.label(op[1]);\n        case 1001\n        /* StartLabels */:\n          return encoder.startLabels();\n        case 1002\n        /* StopLabels */:\n          return encoder.stopLabels();\n        case 1004\n        /* ResolveComponent */:\n          return resolveComponent(resolver, constants, meta, op);\n        case 1003\n        /* ResolveModifier */:\n          return resolveModifier(resolver, constants, meta, op);\n        case 1005\n        /* ResolveHelper */:\n          return resolveHelper(resolver, constants, meta, op);\n        case 1007\n        /* ResolveComponentOrHelper */:\n          return resolveComponentOrHelper(resolver, constants, meta, op);\n        case 1006\n        /* ResolveOptionalHelper */:\n          return resolveOptionalHelper(resolver, constants, meta, op);\n        case 1008\n        /* ResolveOptionalComponentOrHelper */:\n          return resolveOptionalComponentOrHelper(resolver, constants, meta, op);\n        case 1010\n        /* ResolveLocal */:\n          var freeVar = op[1];\n          var name = meta.upvars[freeVar];\n          var andThen = op[2];\n          andThen(name, meta.moduleName);\n          break;\n        case 1011\n        /* ResolveTemplateLocal */:\n          var [, valueIndex, then] = op;\n          var value = meta.scopeValues[valueIndex];\n          then(constants.value(value));\n          break;\n        case 1009\n        /* ResolveFree */:\n          if (true /* DEBUG */) {\n            var [, upvarIndex] = op;\n            var freeName = meta.upvars[upvarIndex];\n            throw new Error(`Attempted to resolve a value in a strict mode template, but that value was not in scope: ${freeName}`);\n          }\n          break;\n        default:\n          throw new Error(`Unexpected high level opcode ${op[0]}`);\n      }\n    }\n  }\n  class EncoderImpl {\n    constructor(heap, meta, stdlib) {\n      this.heap = heap;\n      this.meta = meta;\n      this.stdlib = stdlib;\n      this.labelsStack = new _util.Stack();\n      this.encoder = new _encoder.InstructionEncoderImpl([]);\n      this.errors = [];\n      this.handle = heap.malloc();\n    }\n    error(error) {\n      this.encoder.encode(30\n      /* Primitive */, 0);\n      this.errors.push(error);\n    }\n    commit(size) {\n      var handle = this.handle;\n      this.heap.push(5\n      /* Return */ | 1024\n      /* MACHINE_MASK */);\n\n      this.heap.finishMalloc(handle, size);\n      if (this.errors.length) {\n        return {\n          errors: this.errors,\n          handle\n        };\n      } else {\n        return handle;\n      }\n    }\n    push(constants, type) {\n      var {\n        heap\n      } = this;\n      if (true /* DEBUG */ && type > 255\n      /* TYPE_SIZE */) {\n        throw new Error(`Opcode type over 8-bits. Got ${type}.`);\n      }\n      var machine = (0, _vm.isMachineOp)(type) ? 1024\n      /* MACHINE_MASK */ : 0;\n      var first = type | machine | (arguments.length <= 2 ? 0 : arguments.length - 2) << 8\n      /* ARG_SHIFT */;\n\n      heap.push(first);\n      for (var i = 0; i < (arguments.length <= 2 ? 0 : arguments.length - 2); i++) {\n        var op = i + 2 < 2 || arguments.length <= i + 2 ? undefined : arguments[i + 2];\n        heap.push(this.operand(constants, op));\n      }\n    }\n    operand(constants, operand) {\n      if (typeof operand === 'number') {\n        return operand;\n      }\n      if (typeof operand === 'object' && operand !== null) {\n        if (Array.isArray(operand)) {\n          return (0, _util.encodeHandle)(constants.array(operand));\n        } else {\n          switch (operand.type) {\n            case 1\n            /* Label */:\n              this.currentLabels.target(this.heap.offset, operand.value);\n              return -1;\n            case 2\n            /* IsStrictMode */:\n              return (0, _util.encodeHandle)(constants.value(this.meta.isStrictMode));\n            case 3\n            /* EvalSymbols */:\n              return (0, _util.encodeHandle)(constants.array(this.meta.evalSymbols || _util.EMPTY_STRING_ARRAY));\n            case 4\n            /* Block */:\n              return (0, _util.encodeHandle)(constants.value(compilableBlock(operand.value, this.meta)));\n            case 5\n            /* StdLib */:\n              return this.stdlib[operand.value];\n            case 6\n            /* NonSmallInt */:\n\n            case 7\n            /* SymbolTable */:\n\n            case 8\n            /* Layout */:\n              return constants.value(operand.value);\n          }\n        }\n      }\n      return (0, _util.encodeHandle)(constants.value(operand));\n    }\n    get currentLabels() {\n      return this.labelsStack.current;\n    }\n    label(name) {\n      this.currentLabels.label(name, this.heap.offset + 1);\n    }\n    startLabels() {\n      this.labelsStack.push(new Labels());\n    }\n    stopLabels() {\n      var label = this.labelsStack.pop();\n      label.patch(this.heap);\n    }\n  }\n  function isBuilderOpcode(op) {\n    return op < 1000\n    /* Start */;\n  }\n\n  function main(op) {\n    op(75\n    /* Main */, _vm.$s0);\n    invokePreparedComponent(op, false, false, true);\n  }\n  /**\n   * Append content to the DOM. This standard function triages content and does the\n   * right thing based upon whether it's a string, safe string, component, fragment\n   * or node.\n   *\n   * @param trusting whether to interpolate a string as raw HTML (corresponds to\n   * triple curlies)\n   */\n\n  function StdAppend(op, trusting, nonDynamicAppend) {\n    SwitchCases(op, () => op(76\n    /* ContentType */), when => {\n      when(2\n      /* String */, () => {\n        if (trusting) {\n          op(68\n          /* AssertSame */);\n\n          op(43\n          /* AppendHTML */);\n        } else {\n          op(47\n          /* AppendText */);\n        }\n      });\n\n      if (typeof nonDynamicAppend === 'number') {\n        when(0\n        /* Component */, () => {\n          op(81\n          /* ResolveCurriedComponent */);\n\n          op(79\n          /* PushDynamicComponentInstance */);\n\n          InvokeBareComponent(op);\n        });\n        when(1\n        /* Helper */, () => {\n          CallDynamic(op, null, null, () => {\n            op(3\n            /* InvokeStatic */, nonDynamicAppend);\n          });\n        });\n      } else {\n        // when non-dynamic, we can no longer call the value (potentially because we've already called it)\n        // this prevents infinite loops. We instead coerce the value, whatever it is, into the DOM.\n        when(0\n        /* Component */, () => {\n          op(47\n          /* AppendText */);\n        });\n\n        when(1\n        /* Helper */, () => {\n          op(47\n          /* AppendText */);\n        });\n      }\n\n      when(4\n      /* SafeString */, () => {\n        op(68\n        /* AssertSame */);\n\n        op(44\n        /* AppendSafeHTML */);\n      });\n\n      when(5\n      /* Fragment */, () => {\n        op(68\n        /* AssertSame */);\n\n        op(45\n        /* AppendDocumentFragment */);\n      });\n\n      when(6\n      /* Node */, () => {\n        op(68\n        /* AssertSame */);\n\n        op(46\n        /* AppendNode */);\n      });\n    });\n  }\n\n  function compileStd(context) {\n    var mainHandle = build(context, op => main(op));\n    var trustingGuardedNonDynamicAppend = build(context, op => StdAppend(op, true, null));\n    var cautiousGuardedNonDynamicAppend = build(context, op => StdAppend(op, false, null));\n    var trustingGuardedDynamicAppend = build(context, op => StdAppend(op, true, trustingGuardedNonDynamicAppend));\n    var cautiousGuardedDynamicAppend = build(context, op => StdAppend(op, false, cautiousGuardedNonDynamicAppend));\n    return new StdLib(mainHandle, trustingGuardedDynamicAppend, cautiousGuardedDynamicAppend, trustingGuardedNonDynamicAppend, cautiousGuardedNonDynamicAppend);\n  }\n  var STDLIB_META = {\n    evalSymbols: null,\n    upvars: null,\n    moduleName: 'stdlib',\n    // TODO: ??\n    scopeValues: null,\n    isStrictMode: true,\n    owner: null,\n    size: 0\n  };\n  function build(program, callback) {\n    var {\n      constants,\n      heap,\n      resolver\n    } = program;\n    var encoder = new EncoderImpl(heap, STDLIB_META);\n    function pushOp() {\n      for (var _len2 = arguments.length, op = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        op[_key2] = arguments[_key2];\n      }\n      encodeOp(encoder, constants, resolver, STDLIB_META, op);\n    }\n    callback(pushOp);\n    var result = encoder.commit(0);\n    if (typeof result !== 'number') {\n      // This shouldn't be possible\n      throw new Error(`Unexpected errors compiling std`);\n    } else {\n      return result;\n    }\n  }\n  class CompileTimeCompilationContextImpl {\n    constructor(_ref44, resolver) {\n      var {\n        constants,\n        heap\n      } = _ref44;\n      this.resolver = resolver;\n      this.constants = constants;\n      this.heap = heap;\n      this.stdlib = compileStd(this);\n    }\n  }\n  _exports.CompileTimeCompilationContextImpl = CompileTimeCompilationContextImpl;\n  var DEFAULT_CAPABILITIES = {\n    dynamicLayout: true,\n    dynamicTag: true,\n    prepareArgs: true,\n    createArgs: true,\n    attributeHook: false,\n    elementHook: false,\n    dynamicScope: true,\n    createCaller: false,\n    updateHook: true,\n    createInstance: true,\n    wrapped: false,\n    willDestroy: false,\n    hasSubOwner: false\n  };\n  _exports.DEFAULT_CAPABILITIES = DEFAULT_CAPABILITIES;\n  var MINIMAL_CAPABILITIES = {\n    dynamicLayout: false,\n    dynamicTag: false,\n    prepareArgs: false,\n    createArgs: false,\n    attributeHook: false,\n    elementHook: false,\n    dynamicScope: false,\n    createCaller: false,\n    updateHook: false,\n    createInstance: false,\n    wrapped: false,\n    willDestroy: false,\n    hasSubOwner: false\n  };\n  _exports.MINIMAL_CAPABILITIES = MINIMAL_CAPABILITIES;\n  class WrappedBuilder {\n    constructor(layout, moduleName) {\n      this.layout = layout;\n      this.moduleName = moduleName;\n      this.compiled = null;\n      var {\n        block\n      } = layout;\n      var [, symbols, hasEval] = block;\n      symbols = symbols.slice(); // ensure ATTRS_BLOCK is always included (only once) in the list of symbols\n\n      var attrsBlockIndex = symbols.indexOf(ATTRS_BLOCK);\n      if (attrsBlockIndex === -1) {\n        this.attrsBlockNumber = symbols.push(ATTRS_BLOCK);\n      } else {\n        this.attrsBlockNumber = attrsBlockIndex + 1;\n      }\n      this.symbolTable = {\n        hasEval,\n        symbols\n      };\n    }\n    compile(syntax) {\n      if (this.compiled !== null) return this.compiled;\n      var m = meta(this.layout);\n      var context = templateCompilationContext(syntax, m);\n      var {\n        encoder,\n        program: {\n          constants,\n          resolver\n        }\n      } = context;\n      function pushOp() {\n        for (var _len3 = arguments.length, op = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n          op[_key3] = arguments[_key3];\n        }\n        encodeOp(encoder, constants, resolver, m, op);\n      }\n      WrappedComponent(pushOp, this.layout, this.attrsBlockNumber);\n      var handle = context.encoder.commit(m.size);\n      if (typeof handle !== 'number') {\n        return handle;\n      }\n      this.compiled = handle;\n      return handle;\n    }\n  }\n  _exports.WrappedBuilder = WrappedBuilder;\n  var clientId = 0;\n  var templateCacheCounters = {\n    cacheHit: 0,\n    cacheMiss: 0\n  };\n  /**\n   * Wraps a template js in a template module to change it into a factory\n   * that handles lazy parsing the template and to create per env singletons\n   * of the template.\n   */\n  _exports.templateCacheCounters = templateCacheCounters;\n  function templateFactory(_ref45) {\n    var {\n      id: templateId,\n      moduleName,\n      block,\n      scope,\n      isStrictMode\n    } = _ref45;\n    // TODO(template-refactors): This should be removed in the near future, as it\n    // appears that id is unused. It is currently kept for backwards compat reasons.\n    var id = templateId || `client-${clientId++}`; // TODO: This caches JSON serialized output once in case a template is\n    // compiled by multiple owners, but we haven't verified if this is actually\n    // helpful. We should benchmark this in the future.\n\n    var parsedBlock;\n    var ownerlessTemplate = null;\n    var templateCache = new WeakMap();\n    var factory = owner => {\n      if (parsedBlock === undefined) {\n        parsedBlock = JSON.parse(block);\n      }\n      if (owner === undefined) {\n        if (ownerlessTemplate === null) {\n          templateCacheCounters.cacheMiss++;\n          ownerlessTemplate = new TemplateImpl({\n            id,\n            block: parsedBlock,\n            moduleName,\n            owner: null,\n            scope,\n            isStrictMode\n          });\n        } else {\n          templateCacheCounters.cacheHit++;\n        }\n        return ownerlessTemplate;\n      }\n      var result = templateCache.get(owner);\n      if (result === undefined) {\n        templateCacheCounters.cacheMiss++;\n        result = new TemplateImpl({\n          id,\n          block: parsedBlock,\n          moduleName,\n          owner,\n          scope,\n          isStrictMode\n        });\n        templateCache.set(owner, result);\n      } else {\n        templateCacheCounters.cacheHit++;\n      }\n      return result;\n    };\n    factory.__id = id;\n    factory.__meta = {\n      moduleName\n    };\n    return factory;\n  }\n  class TemplateImpl {\n    constructor(parsedLayout) {\n      this.parsedLayout = parsedLayout;\n      this.result = 'ok';\n      this.layout = null;\n      this.wrappedLayout = null;\n    }\n    get moduleName() {\n      return this.parsedLayout.moduleName;\n    }\n    get id() {\n      return this.parsedLayout.id;\n    } // TODO(template-refactors): This should be removed in the near future, it is\n    // only being exposed for backwards compatibility\n\n    get referrer() {\n      return {\n        moduleName: this.parsedLayout.moduleName,\n        owner: this.parsedLayout.owner\n      };\n    }\n    asLayout() {\n      if (this.layout) return this.layout;\n      return this.layout = compilable((0, _util.assign)({}, this.parsedLayout), this.moduleName);\n    }\n    asWrappedLayout() {\n      if (this.wrappedLayout) return this.wrappedLayout;\n      return this.wrappedLayout = new WrappedBuilder((0, _util.assign)({}, this.parsedLayout), this.moduleName);\n    }\n  }\n});","define(\"@glimmer/owner\", [\"exports\", \"@glimmer/util\"], function (_exports, _util) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.OWNER = void 0;\n  _exports.getOwner = getOwner;\n  _exports.setOwner = setOwner;\n  var OWNER = (0, _util.symbol)('OWNER');\n  /**\n    Framework objects in a Glimmer application may receive an owner object.\n    Glimmer is unopinionated about this owner, but will forward it through its\n    internal resolution system, and through its managers if it is provided.\n  */\n  _exports.OWNER = OWNER;\n  function getOwner(object) {\n    return object[OWNER];\n  }\n  /**\n    `setOwner` set's an object's owner\n  */\n\n  function setOwner(object, owner) {\n    object[OWNER] = owner;\n  }\n});","define(\"@glimmer/program\", [\"exports\", \"@glimmer/util\", \"@glimmer/manager\", \"@glimmer/opcode-compiler\"], function (_exports, _util, _manager, _opcodeCompiler) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.RuntimeProgramImpl = _exports.RuntimeOpImpl = _exports.RuntimeHeapImpl = _exports.RuntimeConstantsImpl = _exports.HeapImpl = _exports.ConstantsImpl = _exports.CompileTimeConstantImpl = void 0;\n  _exports.artifacts = artifacts;\n  _exports.hydrateHeap = hydrateHeap;\n  /**\n   * Default component template, which is a plain yield\n   */\n  var DEFAULT_TEMPLATE_BLOCK = [[[18\n  /* Yield */, 1, null]], ['&default'], false, []];\n  var DEFAULT_TEMPLATE = {\n    // random uuid\n    id: '1b32f5c2-7623-43d6-a0ad-9672898920a1',\n    moduleName: '__default__.hbs',\n    block: JSON.stringify(DEFAULT_TEMPLATE_BLOCK),\n    scope: null,\n    isStrictMode: true\n  };\n  var WELL_KNOWN_EMPTY_ARRAY = Object.freeze([]);\n  var STARTER_CONSTANTS = (0, _util.constants)(WELL_KNOWN_EMPTY_ARRAY);\n  var WELL_KNOWN_EMPTY_ARRAY_POSITION = STARTER_CONSTANTS.indexOf(WELL_KNOWN_EMPTY_ARRAY);\n  class CompileTimeConstantImpl {\n    constructor() {\n      // `0` means NULL\n      this.values = STARTER_CONSTANTS.slice();\n      this.indexMap = new Map(this.values.map((value, index) => [value, index]));\n    }\n    value(value) {\n      var indexMap = this.indexMap;\n      var index = indexMap.get(value);\n      if (index === undefined) {\n        index = this.values.push(value) - 1;\n        indexMap.set(value, index);\n      }\n      return index;\n    }\n    array(values) {\n      if (values.length === 0) {\n        return WELL_KNOWN_EMPTY_ARRAY_POSITION;\n      }\n      var handles = new Array(values.length);\n      for (var i = 0; i < values.length; i++) {\n        handles[i] = this.value(values[i]);\n      }\n      return this.value(handles);\n    }\n    toPool() {\n      return this.values;\n    }\n  }\n  _exports.CompileTimeConstantImpl = CompileTimeConstantImpl;\n  class RuntimeConstantsImpl {\n    constructor(pool) {\n      this.values = pool;\n    }\n    getValue(handle) {\n      return this.values[handle];\n    }\n    getArray(value) {\n      var handles = this.getValue(value);\n      var reified = new Array(handles.length);\n      for (var i = 0; i < handles.length; i++) {\n        var n = handles[i];\n        reified[i] = this.getValue(n);\n      }\n      return reified;\n    }\n  }\n  _exports.RuntimeConstantsImpl = RuntimeConstantsImpl;\n  class ConstantsImpl extends CompileTimeConstantImpl {\n    constructor() {\n      super(...arguments);\n      this.reifiedArrs = {\n        [WELL_KNOWN_EMPTY_ARRAY_POSITION]: WELL_KNOWN_EMPTY_ARRAY\n      };\n      this.defaultTemplate = (0, _opcodeCompiler.templateFactory)(DEFAULT_TEMPLATE)(); // Used for tests and debugging purposes, and to be able to analyze large apps\n      // This is why it's enabled even in production\n\n      this.helperDefinitionCount = 0;\n      this.modifierDefinitionCount = 0;\n      this.componentDefinitionCount = 0;\n      this.helperDefinitionCache = new WeakMap();\n      this.modifierDefinitionCache = new WeakMap();\n      this.componentDefinitionCache = new WeakMap();\n    }\n    helper(definitionState,\n    // TODO: Add a way to expose resolved name for debugging\n    _resolvedName, isOptional) {\n      if (_resolvedName === void 0) {\n        _resolvedName = null;\n      }\n      var handle = this.helperDefinitionCache.get(definitionState);\n      if (handle === undefined) {\n        var managerOrHelper = (0, _manager.getInternalHelperManager)(definitionState, isOptional);\n        if (managerOrHelper === null) {\n          this.helperDefinitionCache.set(definitionState, null);\n          return null;\n        }\n        var helper = typeof managerOrHelper === 'function' ? managerOrHelper : managerOrHelper.getHelper(definitionState);\n        handle = this.value(helper);\n        this.helperDefinitionCache.set(definitionState, handle);\n        this.helperDefinitionCount++;\n      }\n      return handle;\n    }\n    modifier(definitionState, resolvedName, isOptional) {\n      if (resolvedName === void 0) {\n        resolvedName = null;\n      }\n      var handle = this.modifierDefinitionCache.get(definitionState);\n      if (handle === undefined) {\n        var manager = (0, _manager.getInternalModifierManager)(definitionState, isOptional);\n        if (manager === null) {\n          this.modifierDefinitionCache.set(definitionState, null);\n          return null;\n        }\n        var definition = {\n          resolvedName,\n          manager,\n          state: definitionState\n        };\n        handle = this.value(definition);\n        this.modifierDefinitionCache.set(definitionState, handle);\n        this.modifierDefinitionCount++;\n      }\n      return handle;\n    }\n    component(definitionState, owner, isOptional) {\n      var _a;\n      var definition = this.componentDefinitionCache.get(definitionState);\n      if (definition === undefined) {\n        var manager = (0, _manager.getInternalComponentManager)(definitionState, isOptional);\n        if (manager === null) {\n          this.componentDefinitionCache.set(definitionState, null);\n          return null;\n        }\n        var capabilities = (0, _manager.capabilityFlagsFrom)(manager.getCapabilities(definitionState));\n        var templateFactory$$1 = (0, _manager.getComponentTemplate)(definitionState);\n        var compilable = null;\n        var template;\n        if (!(0, _manager.managerHasCapability)(manager, capabilities, 1\n        /* DynamicLayout */)) {\n          template = (_a = templateFactory$$1 === null || templateFactory$$1 === void 0 ? void 0 : templateFactory$$1(owner)) !== null && _a !== void 0 ? _a : this.defaultTemplate;\n        } else {\n          template = templateFactory$$1 === null || templateFactory$$1 === void 0 ? void 0 : templateFactory$$1(owner);\n        }\n        if (template !== undefined) {\n          template = (0, _util.unwrapTemplate)(template);\n          compilable = (0, _manager.managerHasCapability)(manager, capabilities, 1024\n          /* Wrapped */) ? template.asWrappedLayout() : template.asLayout();\n        }\n        definition = {\n          resolvedName: null,\n          handle: -1,\n          manager,\n          capabilities,\n          state: definitionState,\n          compilable\n        };\n        definition.handle = this.value(definition);\n        this.componentDefinitionCache.set(definitionState, definition);\n        this.componentDefinitionCount++;\n      }\n      return definition;\n    }\n    resolvedComponent(resolvedDefinition, resolvedName) {\n      var definition = this.componentDefinitionCache.get(resolvedDefinition);\n      if (definition === undefined) {\n        var {\n          manager,\n          state,\n          template\n        } = resolvedDefinition;\n        var capabilities = (0, _manager.capabilityFlagsFrom)(manager.getCapabilities(resolvedDefinition));\n        var compilable = null;\n        if (!(0, _manager.managerHasCapability)(manager, capabilities, 1\n        /* DynamicLayout */)) {\n          template = template !== null && template !== void 0 ? template : this.defaultTemplate;\n        }\n        if (template !== null) {\n          template = (0, _util.unwrapTemplate)(template);\n          compilable = (0, _manager.managerHasCapability)(manager, capabilities, 1024\n          /* Wrapped */) ? template.asWrappedLayout() : template.asLayout();\n        }\n        definition = {\n          resolvedName,\n          handle: -1,\n          manager,\n          capabilities,\n          state,\n          compilable\n        };\n        definition.handle = this.value(definition);\n        this.componentDefinitionCache.set(resolvedDefinition, definition);\n        this.componentDefinitionCount++;\n      }\n      return definition;\n    }\n    getValue(index) {\n      return this.values[index];\n    }\n    getArray(index) {\n      var reifiedArrs = this.reifiedArrs;\n      var reified = reifiedArrs[index];\n      if (reified === undefined) {\n        var names = this.getValue(index);\n        reified = new Array(names.length);\n        for (var i = 0; i < names.length; i++) {\n          reified[i] = this.getValue(names[i]);\n        }\n        reifiedArrs[index] = reified;\n      }\n      return reified;\n    }\n  }\n  _exports.ConstantsImpl = ConstantsImpl;\n  class RuntimeOpImpl {\n    constructor(heap) {\n      this.heap = heap;\n      this.offset = 0;\n    }\n    get size() {\n      var rawType = this.heap.getbyaddr(this.offset);\n      return ((rawType & 768\n      /* OPERAND_LEN_MASK */) >> 8\n      /* ARG_SHIFT */) + 1;\n    }\n    get isMachine() {\n      var rawType = this.heap.getbyaddr(this.offset);\n      return rawType & 1024\n      /* MACHINE_MASK */ ? 1 : 0;\n    }\n    get type() {\n      return this.heap.getbyaddr(this.offset) & 255\n      /* TYPE_MASK */;\n    }\n\n    get op1() {\n      return this.heap.getbyaddr(this.offset + 1);\n    }\n    get op2() {\n      return this.heap.getbyaddr(this.offset + 2);\n    }\n    get op3() {\n      return this.heap.getbyaddr(this.offset + 3);\n    }\n  }\n  _exports.RuntimeOpImpl = RuntimeOpImpl;\n  var PAGE_SIZE = 0x100000;\n  class RuntimeHeapImpl {\n    constructor(serializedHeap) {\n      var {\n        buffer,\n        table\n      } = serializedHeap;\n      this.heap = new Int32Array(buffer);\n      this.table = table;\n    } // It is illegal to close over this address, as compaction\n    // may move it. However, it is legal to use this address\n    // multiple times between compactions.\n\n    getaddr(handle) {\n      return this.table[handle];\n    }\n    getbyaddr(address) {\n      return this.heap[address];\n    }\n    sizeof(handle) {\n      return sizeof(this.table, handle);\n    }\n  }\n  _exports.RuntimeHeapImpl = RuntimeHeapImpl;\n  function hydrateHeap(serializedHeap) {\n    return new RuntimeHeapImpl(serializedHeap);\n  }\n  /**\n   * The Heap is responsible for dynamically allocating\n   * memory in which we read/write the VM's instructions\n   * from/to. When we malloc we pass out a VMHandle, which\n   * is used as an indirect way of accessing the memory during\n   * execution of the VM. Internally we track the different\n   * regions of the memory in an int array known as the table.\n   *\n   * The table 32-bit aligned and has the following layout:\n   *\n   * | ... | hp (u32) |       info (u32)   | size (u32) |\n   * | ... |  Handle  | Scope Size | State | Size       |\n   * | ... | 32bits   | 30bits     | 2bits | 32bit      |\n   *\n   * With this information we effectively have the ability to\n   * control when we want to free memory. That being said you\n   * can not free during execution as raw address are only\n   * valid during the execution. This means you cannot close\n   * over them as you will have a bad memory access exception.\n   */\n\n  class HeapImpl {\n    constructor() {\n      this.offset = 0;\n      this.handle = 0;\n      this.heap = new Int32Array(PAGE_SIZE);\n      this.handleTable = [];\n      this.handleState = [];\n    }\n    push(item) {\n      this.sizeCheck();\n      this.heap[this.offset++] = item;\n    }\n    sizeCheck() {\n      var {\n        heap\n      } = this;\n      if (this.offset === this.heap.length) {\n        var newHeap = new Int32Array(heap.length + PAGE_SIZE);\n        newHeap.set(heap, 0);\n        this.heap = newHeap;\n      }\n    }\n    getbyaddr(address) {\n      return this.heap[address];\n    }\n    setbyaddr(address, value) {\n      this.heap[address] = value;\n    }\n    malloc() {\n      // push offset, info, size\n      this.handleTable.push(this.offset);\n      return this.handleTable.length - 1;\n    }\n    finishMalloc(handle) {}\n    size() {\n      return this.offset;\n    } // It is illegal to close over this address, as compaction\n    // may move it. However, it is legal to use this address\n    // multiple times between compactions.\n\n    getaddr(handle) {\n      return this.handleTable[handle];\n    }\n    sizeof(handle) {\n      return sizeof(this.handleTable, handle);\n    }\n    free(handle) {\n      this.handleState[handle] = 1\n      /* Freed */;\n    }\n    /**\n     * The heap uses the [Mark-Compact Algorithm](https://en.wikipedia.org/wiki/Mark-compact_algorithm) to shift\n     * reachable memory to the bottom of the heap and freeable\n     * memory to the top of the heap. When we have shifted all\n     * the reachable memory to the top of the heap, we move the\n     * offset to the next free position.\n     */\n\n    compact() {\n      var compactedSize = 0;\n      var {\n        handleTable,\n        handleState,\n        heap\n      } = this;\n      for (var i = 0; i < length; i++) {\n        var offset = handleTable[i];\n        var size = handleTable[i + 1] - offset;\n        var state = handleState[i];\n        if (state === 2\n        /* Purged */) {\n          continue;\n        } else if (state === 1\n        /* Freed */) {\n          // transition to \"already freed\" aka \"purged\"\n          // a good improvement would be to reuse\n          // these slots\n          handleState[i] = 2\n          /* Purged */;\n\n          compactedSize += size;\n        } else if (state === 0\n        /* Allocated */) {\n          for (var j = offset; j <= i + size; j++) {\n            heap[j - compactedSize] = heap[j];\n          }\n          handleTable[i] = offset - compactedSize;\n        } else if (state === 3\n        /* Pointer */) {\n          handleTable[i] = offset - compactedSize;\n        }\n      }\n      this.offset = this.offset - compactedSize;\n    }\n    capture(offset) {\n      if (offset === void 0) {\n        offset = this.offset;\n      }\n      // Only called in eager mode\n      var buffer = slice(this.heap, 0, offset).buffer;\n      return {\n        handle: this.handle,\n        table: this.handleTable,\n        buffer: buffer\n      };\n    }\n  }\n  _exports.HeapImpl = HeapImpl;\n  class RuntimeProgramImpl {\n    constructor(constants$$1, heap) {\n      this.constants = constants$$1;\n      this.heap = heap;\n      this._opcode = new RuntimeOpImpl(this.heap);\n    }\n    opcode(offset) {\n      this._opcode.offset = offset;\n      return this._opcode;\n    }\n  }\n  _exports.RuntimeProgramImpl = RuntimeProgramImpl;\n  function slice(arr, start, end) {\n    if (arr.slice !== undefined) {\n      return arr.slice(start, end);\n    }\n    var ret = new Int32Array(end);\n    for (; start < end; start++) {\n      ret[start] = arr[start];\n    }\n    return ret;\n  }\n  function sizeof(table, handle) {\n    {\n      return -1;\n    }\n  }\n  function artifacts() {\n    return {\n      constants: new ConstantsImpl(),\n      heap: new HeapImpl()\n    };\n  }\n});","define(\"@glimmer/reference\", [\"exports\", \"@glimmer/global-context\", \"@glimmer/util\", \"@glimmer/validator\"], function (_exports, _globalContext, _util, _validator) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.UNDEFINED_REFERENCE = _exports.TRUE_REFERENCE = _exports.REFERENCE = _exports.NULL_REFERENCE = _exports.FALSE_REFERENCE = void 0;\n  _exports.childRefFor = childRefFor;\n  _exports.childRefFromParts = childRefFromParts;\n  _exports.createComputeRef = createComputeRef;\n  _exports.createConstRef = createConstRef;\n  _exports.createDebugAliasRef = void 0;\n  _exports.createInvokableRef = createInvokableRef;\n  _exports.createIteratorItemRef = createIteratorItemRef;\n  _exports.createIteratorRef = createIteratorRef;\n  _exports.createPrimitiveRef = createPrimitiveRef;\n  _exports.createReadOnlyRef = createReadOnlyRef;\n  _exports.createUnboundRef = createUnboundRef;\n  _exports.isConstRef = isConstRef;\n  _exports.isInvokableRef = isInvokableRef;\n  _exports.isUpdatableRef = isUpdatableRef;\n  _exports.updateRef = updateRef;\n  _exports.valueForRef = valueForRef;\n  var REFERENCE = (0, _util.symbol)('REFERENCE');\n  _exports.REFERENCE = REFERENCE;\n  class ReferenceImpl {\n    constructor(type) {\n      this.tag = null;\n      this.lastRevision = _validator.INITIAL;\n      this.children = null;\n      this.compute = null;\n      this.update = null;\n      this[REFERENCE] = type;\n    }\n  }\n  function createPrimitiveRef(value) {\n    var ref = new ReferenceImpl(2\n    /* Unbound */);\n\n    ref.tag = _validator.CONSTANT_TAG;\n    ref.lastValue = value;\n    if (true /* DEBUG */) {\n      ref.debugLabel = String(value);\n    }\n    return ref;\n  }\n  var UNDEFINED_REFERENCE = createPrimitiveRef(undefined);\n  _exports.UNDEFINED_REFERENCE = UNDEFINED_REFERENCE;\n  var NULL_REFERENCE = createPrimitiveRef(null);\n  _exports.NULL_REFERENCE = NULL_REFERENCE;\n  var TRUE_REFERENCE = createPrimitiveRef(true);\n  _exports.TRUE_REFERENCE = TRUE_REFERENCE;\n  var FALSE_REFERENCE = createPrimitiveRef(false);\n  _exports.FALSE_REFERENCE = FALSE_REFERENCE;\n  function createConstRef(value, debugLabel) {\n    var ref = new ReferenceImpl(0\n    /* Constant */);\n\n    ref.lastValue = value;\n    ref.tag = _validator.CONSTANT_TAG;\n    if (true /* DEBUG */) {\n      ref.debugLabel = debugLabel;\n    }\n    return ref;\n  }\n  function createUnboundRef(value, debugLabel) {\n    var ref = new ReferenceImpl(2\n    /* Unbound */);\n\n    ref.lastValue = value;\n    ref.tag = _validator.CONSTANT_TAG;\n    if (true /* DEBUG */) {\n      ref.debugLabel = debugLabel;\n    }\n    return ref;\n  }\n  function createComputeRef(compute, update, debugLabel) {\n    if (update === void 0) {\n      update = null;\n    }\n    if (debugLabel === void 0) {\n      debugLabel = 'unknown';\n    }\n    var ref = new ReferenceImpl(1\n    /* Compute */);\n\n    ref.compute = compute;\n    ref.update = update;\n    if (true /* DEBUG */) {\n      ref.debugLabel = `(result of a \\`${debugLabel}\\` helper)`;\n    }\n    return ref;\n  }\n  function createReadOnlyRef(ref) {\n    if (!isUpdatableRef(ref)) return ref;\n    return createComputeRef(() => valueForRef(ref), null, ref.debugLabel);\n  }\n  function isInvokableRef(ref) {\n    return ref[REFERENCE] === 3\n    /* Invokable */;\n  }\n\n  function createInvokableRef(inner) {\n    var ref = createComputeRef(() => valueForRef(inner), value => updateRef(inner, value));\n    ref.debugLabel = inner.debugLabel;\n    ref[REFERENCE] = 3\n    /* Invokable */;\n\n    return ref;\n  }\n  function isConstRef(_ref) {\n    var ref = _ref;\n    return ref.tag === _validator.CONSTANT_TAG;\n  }\n  function isUpdatableRef(_ref) {\n    var ref = _ref;\n    return ref.update !== null;\n  }\n  function valueForRef(_ref) {\n    var ref = _ref;\n    var {\n      tag\n    } = ref;\n    if (tag === _validator.CONSTANT_TAG) {\n      return ref.lastValue;\n    }\n    var {\n      lastRevision\n    } = ref;\n    var lastValue;\n    if (tag === null || !(0, _validator.validateTag)(tag, lastRevision)) {\n      var {\n        compute\n      } = ref;\n      tag = ref.tag = (0, _validator.track)(() => {\n        lastValue = ref.lastValue = compute();\n      }, true /* DEBUG */ && ref.debugLabel);\n      ref.lastRevision = (0, _validator.valueForTag)(tag);\n    } else {\n      lastValue = ref.lastValue;\n    }\n    (0, _validator.consumeTag)(tag);\n    return lastValue;\n  }\n  function updateRef(_ref, value) {\n    var ref = _ref;\n    var update = ref.update;\n    update(value);\n  }\n  function childRefFor(_parentRef, path) {\n    var parentRef = _parentRef;\n    var type = parentRef[REFERENCE];\n    var children = parentRef.children;\n    var child;\n    if (children === null) {\n      children = parentRef.children = new Map();\n    } else {\n      child = children.get(path);\n      if (child !== undefined) {\n        return child;\n      }\n    }\n    if (type === 2\n    /* Unbound */) {\n      var parent = valueForRef(parentRef);\n      if ((0, _util.isDict)(parent)) {\n        child = createUnboundRef(parent[path], true /* DEBUG */ && `${parentRef.debugLabel}.${path}`);\n      } else {\n        child = UNDEFINED_REFERENCE;\n      }\n    } else {\n      child = createComputeRef(() => {\n        var parent = valueForRef(parentRef);\n        if ((0, _util.isDict)(parent)) {\n          return (0, _globalContext.getProp)(parent, path);\n        }\n      }, val => {\n        var parent = valueForRef(parentRef);\n        if ((0, _util.isDict)(parent)) {\n          return (0, _globalContext.setProp)(parent, path, val);\n        }\n      });\n      if (true /* DEBUG */) {\n        child.debugLabel = `${parentRef.debugLabel}.${path}`;\n      }\n    }\n    children.set(path, child);\n    return child;\n  }\n  function childRefFromParts(root, parts) {\n    var reference = root;\n    for (var i = 0; i < parts.length; i++) {\n      reference = childRefFor(reference, parts[i]);\n    }\n    return reference;\n  }\n  var createDebugAliasRef;\n  _exports.createDebugAliasRef = createDebugAliasRef;\n  if (true /* DEBUG */) {\n    _exports.createDebugAliasRef = createDebugAliasRef = (debugLabel, inner) => {\n      var update = isUpdatableRef(inner) ? value => updateRef(inner, value) : null;\n      var ref = createComputeRef(() => valueForRef(inner), update);\n      ref[REFERENCE] = inner[REFERENCE];\n      ref.debugLabel = debugLabel;\n      return ref;\n    };\n  }\n  var NULL_IDENTITY = {};\n  var KEY = (_, index) => index;\n  var INDEX = (_, index) => String(index);\n  var IDENTITY = item => {\n    if (item === null) {\n      // Returning null as an identity will cause failures since the iterator\n      // can't tell that it's actually supposed to be null\n      return NULL_IDENTITY;\n    }\n    return item;\n  };\n  function keyForPath(path) {\n    if (true /* DEBUG */ && path[0] === '@') {\n      throw new Error(`invalid keypath: '${path}', valid keys: @index, @identity, or a path`);\n    }\n    return uniqueKeyFor(item => (0, _globalContext.getPath)(item, path));\n  }\n  function makeKeyFor(key) {\n    switch (key) {\n      case '@key':\n        return uniqueKeyFor(KEY);\n      case '@index':\n        return uniqueKeyFor(INDEX);\n      case '@identity':\n        return uniqueKeyFor(IDENTITY);\n      default:\n        return keyForPath(key);\n    }\n  }\n  class WeakMapWithPrimitives {\n    get weakMap() {\n      if (this._weakMap === undefined) {\n        this._weakMap = new WeakMap();\n      }\n      return this._weakMap;\n    }\n    get primitiveMap() {\n      if (this._primitiveMap === undefined) {\n        this._primitiveMap = new Map();\n      }\n      return this._primitiveMap;\n    }\n    set(key, value) {\n      if ((0, _util.isObject)(key)) {\n        this.weakMap.set(key, value);\n      } else {\n        this.primitiveMap.set(key, value);\n      }\n    }\n    get(key) {\n      if ((0, _util.isObject)(key)) {\n        return this.weakMap.get(key);\n      } else {\n        return this.primitiveMap.get(key);\n      }\n    }\n  }\n  var IDENTITIES = new WeakMapWithPrimitives();\n  function identityForNthOccurence(value, count) {\n    var identities = IDENTITIES.get(value);\n    if (identities === undefined) {\n      identities = [];\n      IDENTITIES.set(value, identities);\n    }\n    var identity = identities[count];\n    if (identity === undefined) {\n      identity = {\n        value,\n        count\n      };\n      identities[count] = identity;\n    }\n    return identity;\n  }\n  /**\n   * When iterating over a list, it's possible that an item with the same unique\n   * key could be encountered twice:\n   *\n   * ```js\n   * let arr = ['same', 'different', 'same', 'same'];\n   * ```\n   *\n   * In general, we want to treat these items as _unique within the list_. To do\n   * this, we track the occurences of every item as we iterate the list, and when\n   * an item occurs more than once, we generate a new unique key just for that\n   * item, and that occurence within the list. The next time we iterate the list,\n   * and encounter an item for the nth time, we can get the _same_ key, and let\n   * Glimmer know that it should reuse the DOM for the previous nth occurence.\n   */\n\n  function uniqueKeyFor(keyFor) {\n    var seen = new WeakMapWithPrimitives();\n    return (value, memo) => {\n      var key = keyFor(value, memo);\n      var count = seen.get(key) || 0;\n      seen.set(key, count + 1);\n      if (count === 0) {\n        return key;\n      }\n      return identityForNthOccurence(key, count);\n    };\n  }\n  function createIteratorRef(listRef, key) {\n    return createComputeRef(() => {\n      var iterable = valueForRef(listRef);\n      var keyFor = makeKeyFor(key);\n      if (Array.isArray(iterable)) {\n        return new ArrayIterator(iterable, keyFor);\n      }\n      var maybeIterator = (0, _globalContext.toIterator)(iterable);\n      if (maybeIterator === null) {\n        return new ArrayIterator(_util.EMPTY_ARRAY, () => null);\n      }\n      return new IteratorWrapper(maybeIterator, keyFor);\n    });\n  }\n  function createIteratorItemRef(_value) {\n    var value = _value;\n    var tag = (0, _validator.createTag)();\n    return createComputeRef(() => {\n      (0, _validator.consumeTag)(tag);\n      return value;\n    }, newValue => {\n      if (value !== newValue) {\n        value = newValue;\n        (0, _validator.dirtyTag)(tag);\n      }\n    });\n  }\n  class IteratorWrapper {\n    constructor(inner, keyFor) {\n      this.inner = inner;\n      this.keyFor = keyFor;\n    }\n    isEmpty() {\n      return this.inner.isEmpty();\n    }\n    next() {\n      var nextValue = this.inner.next();\n      if (nextValue !== null) {\n        nextValue.key = this.keyFor(nextValue.value, nextValue.memo);\n      }\n      return nextValue;\n    }\n  }\n  class ArrayIterator {\n    constructor(iterator, keyFor) {\n      this.iterator = iterator;\n      this.keyFor = keyFor;\n      this.pos = 0;\n      if (iterator.length === 0) {\n        this.current = {\n          kind: 'empty'\n        };\n      } else {\n        this.current = {\n          kind: 'first',\n          value: iterator[this.pos]\n        };\n      }\n    }\n    isEmpty() {\n      return this.current.kind === 'empty';\n    }\n    next() {\n      var value;\n      var current = this.current;\n      if (current.kind === 'first') {\n        this.current = {\n          kind: 'progress'\n        };\n        value = current.value;\n      } else if (this.pos >= this.iterator.length - 1) {\n        return null;\n      } else {\n        value = this.iterator[++this.pos];\n      }\n      var {\n        keyFor\n      } = this;\n      var key = keyFor(value, this.pos);\n      var memo = this.pos;\n      return {\n        key,\n        value,\n        memo\n      };\n    }\n  }\n});","define(\"@glimmer/runtime\", [\"exports\", \"@glimmer/util\", \"@glimmer/reference\", \"@glimmer/global-context\", \"@glimmer/destroyable\", \"@glimmer/vm\", \"@glimmer/validator\", \"@glimmer/manager\", \"@glimmer/program\", \"@glimmer/owner\", \"@glimmer/runtime\"], function (_exports, _util, _reference, _globalContext, _destroyable2, _vm2, _validator, _manager5, _program, _owner2, _runtime) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.array = _exports.UpdatingVM = _exports.UpdatableBlockImpl = _exports.TemplateOnlyComponentManager = _exports.TemplateOnlyComponent = _exports.TEMPLATE_ONLY_COMPONENT_MANAGER = _exports.SimpleDynamicAttribute = _exports.SERIALIZATION_FIRST_NODE_STRING = _exports.RemoteLiveBlock = _exports.RehydrateBuilder = _exports.PartialScopeImpl = _exports.NewElementBuilder = _exports.LowLevelVM = _exports.IDOMChanges = _exports.EnvironmentImpl = _exports.EMPTY_POSITIONAL = _exports.EMPTY_NAMED = _exports.EMPTY_ARGS = _exports.DynamicScopeImpl = _exports.DynamicAttribute = _exports.DOMTreeConstruction = _exports.DOMChanges = _exports.CursorImpl = _exports.CurriedValue = _exports.ConcreteBounds = void 0;\n  _exports.clear = clear;\n  _exports.clientBuilder = clientBuilder;\n  _exports.concat = void 0;\n  _exports.createCapturedArgs = createCapturedArgs;\n  _exports.curry = curry;\n  Object.defineProperty(_exports, \"destroy\", {\n    enumerable: true,\n    get: function () {\n      return _destroyable2.destroy;\n    }\n  });\n  _exports.dynamicAttribute = dynamicAttribute;\n  _exports.hash = _exports.get = _exports.fn = void 0;\n  _exports.inTransaction = inTransaction;\n  _exports.invokeHelper = invokeHelper;\n  Object.defineProperty(_exports, \"isDestroyed\", {\n    enumerable: true,\n    get: function () {\n      return _destroyable2.isDestroyed;\n    }\n  });\n  Object.defineProperty(_exports, \"isDestroying\", {\n    enumerable: true,\n    get: function () {\n      return _destroyable2.isDestroying;\n    }\n  });\n  _exports.isSerializationFirstNode = isSerializationFirstNode;\n  _exports.isWhitespace = isWhitespace;\n  _exports.normalizeProperty = normalizeProperty;\n  _exports.on = void 0;\n  Object.defineProperty(_exports, \"registerDestructor\", {\n    enumerable: true,\n    get: function () {\n      return _destroyable2.registerDestructor;\n    }\n  });\n  _exports.rehydrationBuilder = rehydrationBuilder;\n  _exports.reifyArgs = reifyArgs;\n  _exports.reifyNamed = reifyNamed$1;\n  _exports.reifyPositional = reifyPositional$1;\n  _exports.renderComponent = renderComponent;\n  _exports.renderMain = renderMain;\n  _exports.renderSync = renderSync;\n  _exports.resetDebuggerCallback = resetDebuggerCallback;\n  _exports.runtimeContext = runtimeContext;\n  _exports.setDebuggerCallback = setDebuggerCallback;\n  _exports.templateOnlyComponent = templateOnlyComponent;\n  class DynamicScopeImpl {\n    constructor(bucket) {\n      if (bucket) {\n        this.bucket = (0, _util.assign)({}, bucket);\n      } else {\n        this.bucket = {};\n      }\n    }\n    get(key) {\n      return this.bucket[key];\n    }\n    set(key, reference) {\n      return this.bucket[key] = reference;\n    }\n    child() {\n      return new DynamicScopeImpl(this.bucket);\n    }\n  }\n  _exports.DynamicScopeImpl = DynamicScopeImpl;\n  class PartialScopeImpl {\n    constructor(\n    // the 0th slot is `self`\n    slots, owner, callerScope,\n    // named arguments and blocks passed to a layout that uses eval\n    evalScope,\n    // locals in scope when the partial was invoked\n    partialMap) {\n      this.slots = slots;\n      this.owner = owner;\n      this.callerScope = callerScope;\n      this.evalScope = evalScope;\n      this.partialMap = partialMap;\n    }\n    static root(self, size, owner) {\n      if (size === void 0) {\n        size = 0;\n      }\n      var refs = new Array(size + 1);\n      for (var i = 0; i <= size; i++) {\n        refs[i] = _reference.UNDEFINED_REFERENCE;\n      }\n      return new PartialScopeImpl(refs, owner, null, null, null).init({\n        self\n      });\n    }\n    static sized(size, owner) {\n      if (size === void 0) {\n        size = 0;\n      }\n      var refs = new Array(size + 1);\n      for (var i = 0; i <= size; i++) {\n        refs[i] = _reference.UNDEFINED_REFERENCE;\n      }\n      return new PartialScopeImpl(refs, owner, null, null, null);\n    }\n    init(_ref) {\n      var {\n        self\n      } = _ref;\n      this.slots[0] = self;\n      return this;\n    }\n    getSelf() {\n      return this.get(0);\n    }\n    getSymbol(symbol$$1) {\n      return this.get(symbol$$1);\n    }\n    getBlock(symbol$$1) {\n      var block = this.get(symbol$$1);\n      return block === _reference.UNDEFINED_REFERENCE ? null : block;\n    }\n    getEvalScope() {\n      return this.evalScope;\n    }\n    getPartialMap() {\n      return this.partialMap;\n    }\n    bind(symbol$$1, value) {\n      this.set(symbol$$1, value);\n    }\n    bindSelf(self) {\n      this.set(0, self);\n    }\n    bindSymbol(symbol$$1, value) {\n      this.set(symbol$$1, value);\n    }\n    bindBlock(symbol$$1, value) {\n      this.set(symbol$$1, value);\n    }\n    bindEvalScope(map) {\n      this.evalScope = map;\n    }\n    bindPartialMap(map) {\n      this.partialMap = map;\n    }\n    bindCallerScope(scope) {\n      this.callerScope = scope;\n    }\n    getCallerScope() {\n      return this.callerScope;\n    }\n    child() {\n      return new PartialScopeImpl(this.slots.slice(), this.owner, this.callerScope, this.evalScope, this.partialMap);\n    }\n    get(index) {\n      if (index >= this.slots.length) {\n        throw new RangeError(`BUG: cannot get $${index} from scope; length=${this.slots.length}`);\n      }\n      return this.slots[index];\n    }\n    set(index, value) {\n      if (index >= this.slots.length) {\n        throw new RangeError(`BUG: cannot get $${index} from scope; length=${this.slots.length}`);\n      }\n      this.slots[index] = value;\n    }\n  }\n\n  // the VM in other classes, but are not intended to be a part of\n  // Glimmer's API.\n  _exports.PartialScopeImpl = PartialScopeImpl;\n  var INNER_VM = (0, _util.symbol)('INNER_VM');\n  var DESTROYABLE_STACK = (0, _util.symbol)('DESTROYABLE_STACK');\n  var STACKS = (0, _util.symbol)('STACKS');\n  var REGISTERS = (0, _util.symbol)('REGISTERS');\n  var HEAP = (0, _util.symbol)('HEAP');\n  var CONSTANTS = (0, _util.symbol)('CONSTANTS');\n  var ARGS = (0, _util.symbol)('ARGS');\n  var PC = (0, _util.symbol)('PC');\n  class CursorImpl {\n    constructor(element, nextSibling) {\n      this.element = element;\n      this.nextSibling = nextSibling;\n    }\n  }\n  _exports.CursorImpl = CursorImpl;\n  class ConcreteBounds {\n    constructor(parentNode, first, last) {\n      this.parentNode = parentNode;\n      this.first = first;\n      this.last = last;\n    }\n    parentElement() {\n      return this.parentNode;\n    }\n    firstNode() {\n      return this.first;\n    }\n    lastNode() {\n      return this.last;\n    }\n  }\n  _exports.ConcreteBounds = ConcreteBounds;\n  class SingleNodeBounds {\n    constructor(parentNode, node) {\n      this.parentNode = parentNode;\n      this.node = node;\n    }\n    parentElement() {\n      return this.parentNode;\n    }\n    firstNode() {\n      return this.node;\n    }\n    lastNode() {\n      return this.node;\n    }\n  }\n  function move(bounds, reference) {\n    var parent = bounds.parentElement();\n    var first = bounds.firstNode();\n    var last = bounds.lastNode();\n    var current = first;\n    while (true) {\n      var next = current.nextSibling;\n      parent.insertBefore(current, reference);\n      if (current === last) {\n        return next;\n      }\n      current = next;\n    }\n  }\n  function clear(bounds) {\n    var parent = bounds.parentElement();\n    var first = bounds.firstNode();\n    var last = bounds.lastNode();\n    var current = first;\n    while (true) {\n      var next = current.nextSibling;\n      parent.removeChild(current);\n      if (current === last) {\n        return next;\n      }\n      current = next;\n    }\n  }\n  function normalizeStringValue(value) {\n    if (isEmpty(value)) {\n      return '';\n    }\n    return String(value);\n  }\n  function shouldCoerce(value) {\n    return isString(value) || isEmpty(value) || typeof value === 'boolean' || typeof value === 'number';\n  }\n  function isEmpty(value) {\n    return value === null || value === undefined || typeof value.toString !== 'function';\n  }\n  function isSafeString(value) {\n    return typeof value === 'object' && value !== null && typeof value.toHTML === 'function';\n  }\n  function isNode(value) {\n    return typeof value === 'object' && value !== null && typeof value.nodeType === 'number';\n  }\n  function isFragment(value) {\n    return isNode(value) && value.nodeType === 11;\n  }\n  function isString(value) {\n    return typeof value === 'string';\n  }\n\n  /*\n   * @method normalizeProperty\n   * @param element {HTMLElement}\n   * @param slotName {String}\n   * @returns {Object} { name, type }\n   */\n  function normalizeProperty(element, slotName) {\n    var type, normalized;\n    if (slotName in element) {\n      normalized = slotName;\n      type = 'prop';\n    } else {\n      var lower = slotName.toLowerCase();\n      if (lower in element) {\n        type = 'prop';\n        normalized = lower;\n      } else {\n        type = 'attr';\n        normalized = slotName;\n      }\n    }\n    if (type === 'prop' && (normalized.toLowerCase() === 'style' || preferAttr(element.tagName, normalized))) {\n      type = 'attr';\n    }\n    return {\n      normalized,\n      type\n    };\n  }\n  // * browser bug\n  // * strange spec outlier\n\n  var ATTR_OVERRIDES = {\n    INPUT: {\n      form: true,\n      // Chrome 46.0.2464.0: 'autocorrect' in document.createElement('input') === false\n      // Safari 8.0.7: 'autocorrect' in document.createElement('input') === false\n      // Mobile Safari (iOS 8.4 simulator): 'autocorrect' in document.createElement('input') === true\n      autocorrect: true,\n      // Chrome 54.0.2840.98: 'list' in document.createElement('input') === true\n      // Safari 9.1.3: 'list' in document.createElement('input') === false\n      list: true\n    },\n    // element.form is actually a legitimate readOnly property, that is to be\n    // mutated, but must be mutated by setAttribute...\n    SELECT: {\n      form: true\n    },\n    OPTION: {\n      form: true\n    },\n    TEXTAREA: {\n      form: true\n    },\n    LABEL: {\n      form: true\n    },\n    FIELDSET: {\n      form: true\n    },\n    LEGEND: {\n      form: true\n    },\n    OBJECT: {\n      form: true\n    },\n    OUTPUT: {\n      form: true\n    },\n    BUTTON: {\n      form: true\n    }\n  };\n  function preferAttr(tagName, propName) {\n    var tag = ATTR_OVERRIDES[tagName.toUpperCase()];\n    return tag && tag[propName.toLowerCase()] || false;\n  }\n  var badProtocols = ['javascript:', 'vbscript:'];\n  var badTags = ['A', 'BODY', 'LINK', 'IMG', 'IFRAME', 'BASE', 'FORM'];\n  var badTagsForDataURI = ['EMBED'];\n  var badAttributes = ['href', 'src', 'background', 'action'];\n  var badAttributesForDataURI = ['src'];\n  function has(array, item) {\n    return array.indexOf(item) !== -1;\n  }\n  function checkURI(tagName, attribute) {\n    return (tagName === null || has(badTags, tagName)) && has(badAttributes, attribute);\n  }\n  function checkDataURI(tagName, attribute) {\n    if (tagName === null) return false;\n    return has(badTagsForDataURI, tagName) && has(badAttributesForDataURI, attribute);\n  }\n  function requiresSanitization(tagName, attribute) {\n    return checkURI(tagName, attribute) || checkDataURI(tagName, attribute);\n  }\n  var protocolForUrl;\n  if (typeof URL === 'object' && URL !== null &&\n  // this is super annoying, TS thinks that URL **must** be a function so `URL.parse` check\n  // thinks it is `never` without this `as unknown as any`\n  typeof URL.parse === 'function') {\n    // In Ember-land the `fastboot` package sets the `URL` global to `require('url')`\n    // ultimately, this should be changed (so that we can either rely on the natural `URL` global\n    // that exists) but for now we have to detect the specific `FastBoot` case first\n    //\n    // a future version of `fastboot` will detect if this legacy URL setup is required (by\n    // inspecting Ember version) and if new enough, it will avoid shadowing the `URL` global\n    // constructor with `require('url')`.\n    var nodeURL = URL;\n    protocolForUrl = url => {\n      var protocol = null;\n      if (typeof url === 'string') {\n        protocol = nodeURL.parse(url).protocol;\n      }\n      return protocol === null ? ':' : protocol;\n    };\n  } else if (typeof URL === 'function') {\n    protocolForUrl = _url => {\n      try {\n        var url = new URL(_url);\n        return url.protocol;\n      } catch (error) {\n        // any non-fully qualified url string will trigger an error (because there is no\n        // baseURI that we can provide; in that case we **know** that the protocol is\n        // \"safe\" because it isn't specifically one of the `badProtocols` listed above\n        // (and those protocols can never be the default baseURI)\n        return ':';\n      }\n    };\n  } else {\n    // fallback for IE11 support\n    var parsingNode = document.createElement('a');\n    protocolForUrl = url => {\n      parsingNode.href = url;\n      return parsingNode.protocol;\n    };\n  }\n  function sanitizeAttributeValue(element, attribute, value) {\n    var tagName = null;\n    if (value === null || value === undefined) {\n      return value;\n    }\n    if (isSafeString(value)) {\n      return value.toHTML();\n    }\n    if (!element) {\n      tagName = null;\n    } else {\n      tagName = element.tagName.toUpperCase();\n    }\n    var str = normalizeStringValue(value);\n    if (checkURI(tagName, attribute)) {\n      var protocol = protocolForUrl(str);\n      if (has(badProtocols, protocol)) {\n        return `unsafe:${str}`;\n      }\n    }\n    if (checkDataURI(tagName, attribute)) {\n      return `unsafe:${str}`;\n    }\n    return str;\n  }\n  function dynamicAttribute(element, attr, namespace, isTrusting) {\n    if (isTrusting === void 0) {\n      isTrusting = false;\n    }\n    var {\n      tagName,\n      namespaceURI\n    } = element;\n    var attribute = {\n      element,\n      name: attr,\n      namespace\n    };\n    if (true /* DEBUG */ && attr === 'style' && !isTrusting) {\n      return new DebugStyleAttributeManager(attribute);\n    }\n    if (namespaceURI === \"http://www.w3.org/2000/svg\"\n    /* SVG */) {\n      return buildDynamicAttribute(tagName, attr, attribute);\n    }\n    var {\n      type,\n      normalized\n    } = normalizeProperty(element, attr);\n    if (type === 'attr') {\n      return buildDynamicAttribute(tagName, normalized, attribute);\n    } else {\n      return buildDynamicProperty(tagName, normalized, attribute);\n    }\n  }\n  function buildDynamicAttribute(tagName, name, attribute) {\n    if (requiresSanitization(tagName, name)) {\n      return new SafeDynamicAttribute(attribute);\n    } else {\n      return new SimpleDynamicAttribute(attribute);\n    }\n  }\n  function buildDynamicProperty(tagName, name, attribute) {\n    if (requiresSanitization(tagName, name)) {\n      return new SafeDynamicProperty(name, attribute);\n    }\n    if (isUserInputValue(tagName, name)) {\n      return new InputValueDynamicAttribute(name, attribute);\n    }\n    if (isOptionSelected(tagName, name)) {\n      return new OptionSelectedDynamicAttribute(name, attribute);\n    }\n    return new DefaultDynamicProperty(name, attribute);\n  }\n  class DynamicAttribute {\n    constructor(attribute) {\n      this.attribute = attribute;\n    }\n  }\n  _exports.DynamicAttribute = DynamicAttribute;\n  class SimpleDynamicAttribute extends DynamicAttribute {\n    set(dom, value, _env) {\n      var normalizedValue = normalizeValue(value);\n      if (normalizedValue !== null) {\n        var {\n          name,\n          namespace\n        } = this.attribute;\n        dom.__setAttribute(name, normalizedValue, namespace);\n      }\n    }\n    update(value, _env) {\n      var normalizedValue = normalizeValue(value);\n      var {\n        element,\n        name\n      } = this.attribute;\n      if (normalizedValue === null) {\n        element.removeAttribute(name);\n      } else {\n        element.setAttribute(name, normalizedValue);\n      }\n    }\n  }\n  _exports.SimpleDynamicAttribute = SimpleDynamicAttribute;\n  class DefaultDynamicProperty extends DynamicAttribute {\n    constructor(normalizedName, attribute) {\n      super(attribute);\n      this.normalizedName = normalizedName;\n    }\n    set(dom, value, _env) {\n      if (value !== null && value !== undefined) {\n        this.value = value;\n        dom.__setProperty(this.normalizedName, value);\n      }\n    }\n    update(value, _env) {\n      var {\n        element\n      } = this.attribute;\n      if (this.value !== value) {\n        element[this.normalizedName] = this.value = value;\n        if (value === null || value === undefined) {\n          this.removeAttribute();\n        }\n      }\n    }\n    removeAttribute() {\n      // TODO this sucks but to preserve properties first and to meet current\n      // semantics we must do this.\n      var {\n        element,\n        namespace\n      } = this.attribute;\n      if (namespace) {\n        element.removeAttributeNS(namespace, this.normalizedName);\n      } else {\n        element.removeAttribute(this.normalizedName);\n      }\n    }\n  }\n  class SafeDynamicProperty extends DefaultDynamicProperty {\n    set(dom, value, env) {\n      var {\n        element,\n        name\n      } = this.attribute;\n      var sanitized = sanitizeAttributeValue(element, name, value);\n      super.set(dom, sanitized, env);\n    }\n    update(value, env) {\n      var {\n        element,\n        name\n      } = this.attribute;\n      var sanitized = sanitizeAttributeValue(element, name, value);\n      super.update(sanitized, env);\n    }\n  }\n  class SafeDynamicAttribute extends SimpleDynamicAttribute {\n    set(dom, value, env) {\n      var {\n        element,\n        name\n      } = this.attribute;\n      var sanitized = sanitizeAttributeValue(element, name, value);\n      super.set(dom, sanitized, env);\n    }\n    update(value, env) {\n      var {\n        element,\n        name\n      } = this.attribute;\n      var sanitized = sanitizeAttributeValue(element, name, value);\n      super.update(sanitized, env);\n    }\n  }\n  class InputValueDynamicAttribute extends DefaultDynamicProperty {\n    set(dom, value) {\n      dom.__setProperty('value', normalizeStringValue(value));\n    }\n    update(value) {\n      var input = this.attribute.element;\n      var currentValue = input.value;\n      var normalizedValue = normalizeStringValue(value);\n      if (currentValue !== normalizedValue) {\n        input.value = normalizedValue;\n      }\n    }\n  }\n  class OptionSelectedDynamicAttribute extends DefaultDynamicProperty {\n    set(dom, value) {\n      if (value !== null && value !== undefined && value !== false) {\n        dom.__setProperty('selected', true);\n      }\n    }\n    update(value) {\n      var option = this.attribute.element;\n      if (value) {\n        option.selected = true;\n      } else {\n        option.selected = false;\n      }\n    }\n  }\n  function isOptionSelected(tagName, attribute) {\n    return tagName === 'OPTION' && attribute === 'selected';\n  }\n  function isUserInputValue(tagName, attribute) {\n    return (tagName === 'INPUT' || tagName === 'TEXTAREA') && attribute === 'value';\n  }\n  function normalizeValue(value) {\n    if (value === false || value === undefined || value === null || typeof value.toString === 'undefined') {\n      return null;\n    }\n    if (value === true) {\n      return '';\n    } // onclick function etc in SSR\n\n    if (typeof value === 'function') {\n      return null;\n    }\n    return String(value);\n  }\n  var DebugStyleAttributeManager;\n  if (true /* DEBUG */) {\n    DebugStyleAttributeManager = class extends SimpleDynamicAttribute {\n      set(dom, value, env) {\n        (0, _globalContext.warnIfStyleNotTrusted)(value);\n        super.set(dom, value, env);\n      }\n      update(value, env) {\n        (0, _globalContext.warnIfStyleNotTrusted)(value);\n        super.update(value, env);\n      }\n    };\n  }\n  var _a;\n  class First {\n    constructor(node) {\n      this.node = node;\n    }\n    firstNode() {\n      return this.node;\n    }\n  }\n  class Last {\n    constructor(node) {\n      this.node = node;\n    }\n    lastNode() {\n      return this.node;\n    }\n  }\n  var CURSOR_STACK = (0, _util.symbol)('CURSOR_STACK');\n  class NewElementBuilder {\n    constructor(env, parentNode, nextSibling) {\n      this.constructing = null;\n      this.operations = null;\n      this[_a] = new _util.Stack();\n      this.modifierStack = new _util.Stack();\n      this.blockStack = new _util.Stack();\n      this.pushElement(parentNode, nextSibling);\n      this.env = env;\n      this.dom = env.getAppendOperations();\n      this.updateOperations = env.getDOM();\n    }\n    static forInitialRender(env, cursor) {\n      return new this(env, cursor.element, cursor.nextSibling).initialize();\n    }\n    static resume(env, block) {\n      var parentNode = block.parentElement();\n      var nextSibling = block.reset(env);\n      var stack = new this(env, parentNode, nextSibling).initialize();\n      stack.pushLiveBlock(block);\n      return stack;\n    }\n    initialize() {\n      this.pushSimpleBlock();\n      return this;\n    }\n    debugBlocks() {\n      return this.blockStack.toArray();\n    }\n    get element() {\n      return this[CURSOR_STACK].current.element;\n    }\n    get nextSibling() {\n      return this[CURSOR_STACK].current.nextSibling;\n    }\n    get hasBlocks() {\n      return this.blockStack.size > 0;\n    }\n    block() {\n      return this.blockStack.current;\n    }\n    popElement() {\n      this[CURSOR_STACK].pop();\n      this[CURSOR_STACK].current;\n    }\n    pushSimpleBlock() {\n      return this.pushLiveBlock(new SimpleLiveBlock(this.element));\n    }\n    pushUpdatableBlock() {\n      return this.pushLiveBlock(new UpdatableBlockImpl(this.element));\n    }\n    pushBlockList(list) {\n      return this.pushLiveBlock(new LiveBlockList(this.element, list));\n    }\n    pushLiveBlock(block, isRemote) {\n      if (isRemote === void 0) {\n        isRemote = false;\n      }\n      var current = this.blockStack.current;\n      if (current !== null) {\n        if (!isRemote) {\n          current.didAppendBounds(block);\n        }\n      }\n      this.__openBlock();\n      this.blockStack.push(block);\n      return block;\n    }\n    popBlock() {\n      this.block().finalize(this);\n      this.__closeBlock();\n      return this.blockStack.pop();\n    }\n    __openBlock() {}\n    __closeBlock() {} // todo return seems unused\n\n    openElement(tag) {\n      var element = this.__openElement(tag);\n      this.constructing = element;\n      return element;\n    }\n    __openElement(tag) {\n      return this.dom.createElement(tag, this.element);\n    }\n    flushElement(modifiers) {\n      var parent = this.element;\n      var element = this.constructing;\n      this.__flushElement(parent, element);\n      this.constructing = null;\n      this.operations = null;\n      this.pushModifiers(modifiers);\n      this.pushElement(element, null);\n      this.didOpenElement(element);\n    }\n    __flushElement(parent, constructing) {\n      this.dom.insertBefore(parent, constructing, this.nextSibling);\n    }\n    closeElement() {\n      this.willCloseElement();\n      this.popElement();\n      return this.popModifiers();\n    }\n    pushRemoteElement(element, guid, insertBefore) {\n      return this.__pushRemoteElement(element, guid, insertBefore);\n    }\n    __pushRemoteElement(element, _guid, insertBefore) {\n      this.pushElement(element, insertBefore);\n      if (insertBefore === undefined) {\n        while (element.lastChild) {\n          element.removeChild(element.lastChild);\n        }\n      }\n      var block = new RemoteLiveBlock(element);\n      return this.pushLiveBlock(block, true);\n    }\n    popRemoteElement() {\n      this.popBlock();\n      this.popElement();\n    }\n    pushElement(element, nextSibling) {\n      if (nextSibling === void 0) {\n        nextSibling = null;\n      }\n      this[CURSOR_STACK].push(new CursorImpl(element, nextSibling));\n    }\n    pushModifiers(modifiers) {\n      this.modifierStack.push(modifiers);\n    }\n    popModifiers() {\n      return this.modifierStack.pop();\n    }\n    didAppendBounds(bounds) {\n      this.block().didAppendBounds(bounds);\n      return bounds;\n    }\n    didAppendNode(node) {\n      this.block().didAppendNode(node);\n      return node;\n    }\n    didOpenElement(element) {\n      this.block().openElement(element);\n      return element;\n    }\n    willCloseElement() {\n      this.block().closeElement();\n    }\n    appendText(string) {\n      return this.didAppendNode(this.__appendText(string));\n    }\n    __appendText(text) {\n      var {\n        dom,\n        element,\n        nextSibling\n      } = this;\n      var node = dom.createTextNode(text);\n      dom.insertBefore(element, node, nextSibling);\n      return node;\n    }\n    __appendNode(node) {\n      this.dom.insertBefore(this.element, node, this.nextSibling);\n      return node;\n    }\n    __appendFragment(fragment) {\n      var first = fragment.firstChild;\n      if (first) {\n        var ret = new ConcreteBounds(this.element, first, fragment.lastChild);\n        this.dom.insertBefore(this.element, fragment, this.nextSibling);\n        return ret;\n      } else {\n        return new SingleNodeBounds(this.element, this.__appendComment(''));\n      }\n    }\n    __appendHTML(html) {\n      return this.dom.insertHTMLBefore(this.element, this.nextSibling, html);\n    }\n    appendDynamicHTML(value) {\n      var bounds = this.trustedContent(value);\n      this.didAppendBounds(bounds);\n    }\n    appendDynamicText(value) {\n      var node = this.untrustedContent(value);\n      this.didAppendNode(node);\n      return node;\n    }\n    appendDynamicFragment(value) {\n      var bounds = this.__appendFragment(value);\n      this.didAppendBounds(bounds);\n    }\n    appendDynamicNode(value) {\n      var node = this.__appendNode(value);\n      var bounds = new SingleNodeBounds(this.element, node);\n      this.didAppendBounds(bounds);\n    }\n    trustedContent(value) {\n      return this.__appendHTML(value);\n    }\n    untrustedContent(value) {\n      return this.__appendText(value);\n    }\n    appendComment(string) {\n      return this.didAppendNode(this.__appendComment(string));\n    }\n    __appendComment(string) {\n      var {\n        dom,\n        element,\n        nextSibling\n      } = this;\n      var node = dom.createComment(string);\n      dom.insertBefore(element, node, nextSibling);\n      return node;\n    }\n    __setAttribute(name, value, namespace) {\n      this.dom.setAttribute(this.constructing, name, value, namespace);\n    }\n    __setProperty(name, value) {\n      this.constructing[name] = value;\n    }\n    setStaticAttribute(name, value, namespace) {\n      this.__setAttribute(name, value, namespace);\n    }\n    setDynamicAttribute(name, value, trusting, namespace) {\n      var element = this.constructing;\n      var attribute = dynamicAttribute(element, name, namespace, trusting);\n      attribute.set(this, value, this.env);\n      return attribute;\n    }\n  }\n  _exports.NewElementBuilder = NewElementBuilder;\n  _a = CURSOR_STACK;\n  class SimpleLiveBlock {\n    constructor(parent) {\n      this.parent = parent;\n      this.first = null;\n      this.last = null;\n      this.nesting = 0;\n    }\n    parentElement() {\n      return this.parent;\n    }\n    firstNode() {\n      var first = this.first;\n      return first.firstNode();\n    }\n    lastNode() {\n      var last = this.last;\n      return last.lastNode();\n    }\n    openElement(element) {\n      this.didAppendNode(element);\n      this.nesting++;\n    }\n    closeElement() {\n      this.nesting--;\n    }\n    didAppendNode(node) {\n      if (this.nesting !== 0) return;\n      if (!this.first) {\n        this.first = new First(node);\n      }\n      this.last = new Last(node);\n    }\n    didAppendBounds(bounds) {\n      if (this.nesting !== 0) return;\n      if (!this.first) {\n        this.first = bounds;\n      }\n      this.last = bounds;\n    }\n    finalize(stack) {\n      if (this.first === null) {\n        stack.appendComment('');\n      }\n    }\n  }\n  class RemoteLiveBlock extends SimpleLiveBlock {\n    constructor(parent) {\n      super(parent);\n      (0, _destroyable2.registerDestructor)(this, () => {\n        // In general, you only need to clear the root of a hierarchy, and should never\n        // need to clear any child nodes. This is an important constraint that gives us\n        // a strong guarantee that clearing a subtree is a single DOM operation.\n        //\n        // Because remote blocks are not normally physically nested inside of the tree\n        // that they are logically nested inside, we manually clear remote blocks when\n        // a logical parent is cleared.\n        //\n        // HOWEVER, it is currently possible for a remote block to be physically nested\n        // inside of the block it is logically contained inside of. This happens when\n        // the remote block is appended to the end of the application's entire element.\n        //\n        // The problem with that scenario is that Glimmer believes that it owns more of\n        // the DOM than it actually does. The code is attempting to write past the end\n        // of the Glimmer-managed root, but Glimmer isn't aware of that.\n        //\n        // The correct solution to that problem is for Glimmer to be aware of the end\n        // of the bounds that it owns, and once we make that change, this check could\n        // be removed.\n        //\n        // For now, a more targeted fix is to check whether the node was already removed\n        // and avoid clearing the node if it was. In most cases this shouldn't happen,\n        // so this might hide bugs where the code clears nested nodes unnecessarily,\n        // so we should eventually try to do the correct fix.\n        if (this.parentElement() === this.firstNode().parentNode) {\n          clear(this);\n        }\n      });\n    }\n  }\n  _exports.RemoteLiveBlock = RemoteLiveBlock;\n  class UpdatableBlockImpl extends SimpleLiveBlock {\n    reset() {\n      (0, _destroyable2.destroy)(this);\n      var nextSibling = clear(this);\n      this.first = null;\n      this.last = null;\n      this.nesting = 0;\n      return nextSibling;\n    }\n  } // FIXME: All the noops in here indicate a modelling problem\n  _exports.UpdatableBlockImpl = UpdatableBlockImpl;\n  class LiveBlockList {\n    constructor(parent, boundList) {\n      this.parent = parent;\n      this.boundList = boundList;\n      this.parent = parent;\n      this.boundList = boundList;\n    }\n    parentElement() {\n      return this.parent;\n    }\n    firstNode() {\n      var head = this.boundList[0];\n      return head.firstNode();\n    }\n    lastNode() {\n      var boundList = this.boundList;\n      var tail = boundList[boundList.length - 1];\n      return tail.lastNode();\n    }\n    openElement(_element) {}\n    closeElement() {}\n    didAppendNode(_node) {}\n    didAppendBounds(_bounds) {}\n    finalize(_stack) {}\n  }\n  function clientBuilder(env, cursor) {\n    return NewElementBuilder.forInitialRender(env, cursor);\n  }\n  class AppendOpcodes {\n    constructor() {\n      this.evaluateOpcode = (0, _util.fillNulls)(104\n      /* Size */).slice();\n    }\n    add(name, evaluate, kind) {\n      if (kind === void 0) {\n        kind = 'syscall';\n      }\n      this.evaluateOpcode[name] = {\n        syscall: kind !== 'machine',\n        evaluate\n      };\n    }\n    debugBefore(vm, opcode) {\n      var params = undefined;\n      var opName = undefined;\n      var sp;\n      return {\n        sp: sp,\n        pc: vm.fetchValue(_vm2.$pc),\n        name: opName,\n        params,\n        type: opcode.type,\n        isMachine: opcode.isMachine,\n        size: opcode.size,\n        state: undefined\n      };\n    }\n    debugAfter(vm, pre) {}\n    evaluate(vm, opcode, type) {\n      var operation = this.evaluateOpcode[type];\n      if (operation.syscall) {\n        operation.evaluate(vm, opcode);\n      } else {\n        operation.evaluate(vm[INNER_VM], opcode);\n      }\n    }\n  }\n  var APPEND_OPCODES = new AppendOpcodes();\n  function createConcatRef(partsRefs) {\n    return (0, _reference.createComputeRef)(() => {\n      var parts = new Array();\n      for (var i = 0; i < partsRefs.length; i++) {\n        var value = (0, _reference.valueForRef)(partsRefs[i]);\n        if (value !== null && value !== undefined) {\n          parts[i] = castToString(value);\n        }\n      }\n      if (parts.length > 0) {\n        return parts.join('');\n      }\n      return null;\n    });\n  }\n  function castToString(value) {\n    if (typeof value.toString !== 'function') {\n      return '';\n    }\n    return String(value);\n  }\n  var TYPE = (0, _util.symbol)('TYPE');\n  var INNER = (0, _util.symbol)('INNER');\n  var OWNER = (0, _util.symbol)('OWNER');\n  var ARGS$1 = (0, _util.symbol)('ARGS');\n  var RESOLVED = (0, _util.symbol)('RESOLVED');\n  var CURRIED_VALUES = new _util._WeakSet();\n  function isCurriedValue(value) {\n    return CURRIED_VALUES.has(value);\n  }\n  function isCurriedType(value, type) {\n    return isCurriedValue(value) && value[TYPE] === type;\n  }\n  class CurriedValue {\n    /** @internal */\n    constructor(type, inner, owner, args, resolved) {\n      if (resolved === void 0) {\n        resolved = false;\n      }\n      CURRIED_VALUES.add(this);\n      this[TYPE] = type;\n      this[INNER] = inner;\n      this[OWNER] = owner;\n      this[ARGS$1] = args;\n      this[RESOLVED] = resolved;\n    }\n  }\n  _exports.CurriedValue = CurriedValue;\n  function resolveCurriedValue(curriedValue) {\n    var currentWrapper = curriedValue;\n    var positional;\n    var named;\n    var definition, owner, resolved;\n    while (true) {\n      var {\n        [ARGS$1]: curriedArgs,\n        [INNER]: inner\n      } = currentWrapper;\n      if (curriedArgs !== null) {\n        var {\n          named: curriedNamed,\n          positional: curriedPositional\n        } = curriedArgs;\n        if (curriedPositional.length > 0) {\n          positional = positional === undefined ? curriedPositional : curriedPositional.concat(positional);\n        }\n        if (named === undefined) {\n          named = [];\n        }\n        named.unshift(curriedNamed);\n      }\n      if (!isCurriedValue(inner)) {\n        // Save off the owner that this helper was curried with. Later on,\n        // we'll fetch the value of this register and set it as the owner on the\n        // new root scope.\n        definition = inner;\n        owner = currentWrapper[OWNER];\n        resolved = currentWrapper[RESOLVED];\n        break;\n      }\n      currentWrapper = inner;\n    }\n    return {\n      definition,\n      owner,\n      resolved,\n      positional,\n      named\n    };\n  }\n  function curry(type, spec, owner, args, resolved) {\n    if (resolved === void 0) {\n      resolved = false;\n    }\n    return new CurriedValue(type, spec, owner, args, resolved);\n  }\n  function createCurryRef(type, inner, owner, args, resolver, isStrict) {\n    var lastValue, curriedDefinition;\n    return (0, _reference.createComputeRef)(() => {\n      var value = (0, _reference.valueForRef)(inner);\n      if (value === lastValue) {\n        return curriedDefinition;\n      }\n      if (isCurriedType(value, type)) {\n        curriedDefinition = args ? curry(type, value, owner, args) : args;\n      } else if (type === 0\n      /* Component */ && typeof value === 'string' && value) {\n        // Only components should enter this path, as helpers and modifiers do not\n        // support string based resolution\n        if (true /* DEBUG */) {\n          if (isStrict) {\n            throw new Error(`Attempted to resolve a dynamic component with a string definition, \\`${value}\\` in a strict mode template. In strict mode, using strings to resolve component definitions is prohibited. You can instead import the component definition and use it directly.`);\n          }\n          var resolvedDefinition = resolver.lookupComponent(value, owner);\n          if (!resolvedDefinition) {\n            throw new Error(`Attempted to resolve \\`${value}\\`, which was expected to be a component, but nothing was found.`);\n          }\n        }\n        curriedDefinition = curry(type, value, owner, args);\n      } else if ((0, _util.isObject)(value)) {\n        curriedDefinition = curry(type, value, owner, args);\n      } else {\n        curriedDefinition = null;\n      }\n      lastValue = value;\n      return curriedDefinition;\n    });\n  }\n\n  /*\n    The calling convention is:\n  \n    * 0-N block arguments at the bottom\n    * 0-N positional arguments next (left-to-right)\n    * 0-N named arguments next\n  */\n\n  class VMArgumentsImpl {\n    constructor() {\n      this.stack = null;\n      this.positional = new PositionalArgumentsImpl();\n      this.named = new NamedArgumentsImpl();\n      this.blocks = new BlockArgumentsImpl();\n    }\n    empty(stack) {\n      var base = stack[REGISTERS][_vm2.$sp] + 1;\n      this.named.empty(stack, base);\n      this.positional.empty(stack, base);\n      this.blocks.empty(stack, base);\n      return this;\n    }\n    setup(stack, names, blockNames, positionalCount, atNames) {\n      this.stack = stack;\n      /*\n             | ... | blocks      | positional  | named |\n             | ... | b0    b1    | p0 p1 p2 p3 | n0 n1 |\n       index | ... | 4/5/6 7/8/9 | 10 11 12 13 | 14 15 |\n                     ^             ^             ^  ^\n                   bbase         pbase       nbase  sp\n      */\n\n      var named = this.named;\n      var namedCount = names.length;\n      var namedBase = stack[REGISTERS][_vm2.$sp] - namedCount + 1;\n      named.setup(stack, namedBase, namedCount, names, atNames);\n      var positional = this.positional;\n      var positionalBase = namedBase - positionalCount;\n      positional.setup(stack, positionalBase, positionalCount);\n      var blocks = this.blocks;\n      var blocksCount = blockNames.length;\n      var blocksBase = positionalBase - blocksCount * 3;\n      blocks.setup(stack, blocksBase, blocksCount, blockNames);\n    }\n    get base() {\n      return this.blocks.base;\n    }\n    get length() {\n      return this.positional.length + this.named.length + this.blocks.length * 3;\n    }\n    at(pos) {\n      return this.positional.at(pos);\n    }\n    realloc(offset) {\n      var {\n        stack\n      } = this;\n      if (offset > 0 && stack !== null) {\n        var {\n          positional,\n          named\n        } = this;\n        var newBase = positional.base + offset;\n        var length = positional.length + named.length;\n        for (var i = length - 1; i >= 0; i--) {\n          stack.copy(i + positional.base, i + newBase);\n        }\n        positional.base += offset;\n        named.base += offset;\n        stack[REGISTERS][_vm2.$sp] += offset;\n      }\n    }\n    capture() {\n      var positional = this.positional.length === 0 ? EMPTY_POSITIONAL : this.positional.capture();\n      var named = this.named.length === 0 ? EMPTY_NAMED : this.named.capture();\n      return {\n        named,\n        positional\n      };\n    }\n    clear() {\n      var {\n        stack,\n        length\n      } = this;\n      if (length > 0 && stack !== null) stack.pop(length);\n    }\n  }\n  var EMPTY_REFERENCES = (0, _util.emptyArray)();\n  class PositionalArgumentsImpl {\n    constructor() {\n      this.base = 0;\n      this.length = 0;\n      this.stack = null;\n      this._references = null;\n    }\n    empty(stack, base) {\n      this.stack = stack;\n      this.base = base;\n      this.length = 0;\n      this._references = EMPTY_REFERENCES;\n    }\n    setup(stack, base, length) {\n      this.stack = stack;\n      this.base = base;\n      this.length = length;\n      if (length === 0) {\n        this._references = EMPTY_REFERENCES;\n      } else {\n        this._references = null;\n      }\n    }\n    at(position) {\n      var {\n        base,\n        length,\n        stack\n      } = this;\n      if (position < 0 || position >= length) {\n        return _reference.UNDEFINED_REFERENCE;\n      }\n      return stack.get(position, base);\n    }\n    capture() {\n      return this.references;\n    }\n    prepend(other) {\n      var additions = other.length;\n      if (additions > 0) {\n        var {\n          base,\n          length,\n          stack\n        } = this;\n        this.base = base = base - additions;\n        this.length = length + additions;\n        for (var i = 0; i < additions; i++) {\n          stack.set(other[i], i, base);\n        }\n        this._references = null;\n      }\n    }\n    get references() {\n      var references = this._references;\n      if (!references) {\n        var {\n          stack,\n          base,\n          length\n        } = this;\n        references = this._references = stack.slice(base, base + length);\n      }\n      return references;\n    }\n  }\n  class NamedArgumentsImpl {\n    constructor() {\n      this.base = 0;\n      this.length = 0;\n      this._references = null;\n      this._names = _util.EMPTY_STRING_ARRAY;\n      this._atNames = _util.EMPTY_STRING_ARRAY;\n    }\n    empty(stack, base) {\n      this.stack = stack;\n      this.base = base;\n      this.length = 0;\n      this._references = EMPTY_REFERENCES;\n      this._names = _util.EMPTY_STRING_ARRAY;\n      this._atNames = _util.EMPTY_STRING_ARRAY;\n    }\n    setup(stack, base, length, names, atNames) {\n      this.stack = stack;\n      this.base = base;\n      this.length = length;\n      if (length === 0) {\n        this._references = EMPTY_REFERENCES;\n        this._names = _util.EMPTY_STRING_ARRAY;\n        this._atNames = _util.EMPTY_STRING_ARRAY;\n      } else {\n        this._references = null;\n        if (atNames) {\n          this._names = null;\n          this._atNames = names;\n        } else {\n          this._names = names;\n          this._atNames = null;\n        }\n      }\n    }\n    get names() {\n      var names = this._names;\n      if (!names) {\n        names = this._names = this._atNames.map(this.toSyntheticName);\n      }\n      return names;\n    }\n    get atNames() {\n      var atNames = this._atNames;\n      if (!atNames) {\n        atNames = this._atNames = this._names.map(this.toAtName);\n      }\n      return atNames;\n    }\n    has(name) {\n      return this.names.indexOf(name) !== -1;\n    }\n    get(name, atNames) {\n      if (atNames === void 0) {\n        atNames = false;\n      }\n      var {\n        base,\n        stack\n      } = this;\n      var names = atNames ? this.atNames : this.names;\n      var idx = names.indexOf(name);\n      if (idx === -1) {\n        return _reference.UNDEFINED_REFERENCE;\n      }\n      var ref = stack.get(idx, base);\n      if (true /* DEBUG */) {\n        return (0, _reference.createDebugAliasRef)(atNames ? name : `@${name}`, ref);\n      } else {\n        return ref;\n      }\n    }\n    capture() {\n      var {\n        names,\n        references\n      } = this;\n      var map = (0, _util.dict)();\n      for (var i = 0; i < names.length; i++) {\n        var name = names[i];\n        if (true /* DEBUG */) {\n          map[name] = (0, _reference.createDebugAliasRef)(`@${name}`, references[i]);\n        } else {\n          map[name] = references[i];\n        }\n      }\n      return map;\n    }\n    merge(other) {\n      var keys = Object.keys(other);\n      if (keys.length > 0) {\n        var {\n          names,\n          length,\n          stack\n        } = this;\n        var newNames = names.slice();\n        for (var i = 0; i < keys.length; i++) {\n          var name = keys[i];\n          var idx = newNames.indexOf(name);\n          if (idx === -1) {\n            length = newNames.push(name);\n            stack.push(other[name]);\n          }\n        }\n        this.length = length;\n        this._references = null;\n        this._names = newNames;\n        this._atNames = null;\n      }\n    }\n    get references() {\n      var references = this._references;\n      if (!references) {\n        var {\n          base,\n          length,\n          stack\n        } = this;\n        references = this._references = stack.slice(base, base + length);\n      }\n      return references;\n    }\n    toSyntheticName(name) {\n      return name.slice(1);\n    }\n    toAtName(name) {\n      return `@${name}`;\n    }\n  }\n  function toSymbolName(name) {\n    return `&${name}`;\n  }\n  var EMPTY_BLOCK_VALUES = (0, _util.emptyArray)();\n  class BlockArgumentsImpl {\n    constructor() {\n      this.internalValues = null;\n      this._symbolNames = null;\n      this.internalTag = null;\n      this.names = _util.EMPTY_STRING_ARRAY;\n      this.length = 0;\n      this.base = 0;\n    }\n    empty(stack, base) {\n      this.stack = stack;\n      this.names = _util.EMPTY_STRING_ARRAY;\n      this.base = base;\n      this.length = 0;\n      this._symbolNames = null;\n      this.internalTag = _validator.CONSTANT_TAG;\n      this.internalValues = EMPTY_BLOCK_VALUES;\n    }\n    setup(stack, base, length, names) {\n      this.stack = stack;\n      this.names = names;\n      this.base = base;\n      this.length = length;\n      this._symbolNames = null;\n      if (length === 0) {\n        this.internalTag = _validator.CONSTANT_TAG;\n        this.internalValues = EMPTY_BLOCK_VALUES;\n      } else {\n        this.internalTag = null;\n        this.internalValues = null;\n      }\n    }\n    get values() {\n      var values = this.internalValues;\n      if (!values) {\n        var {\n          base,\n          length,\n          stack\n        } = this;\n        values = this.internalValues = stack.slice(base, base + length * 3);\n      }\n      return values;\n    }\n    has(name) {\n      return this.names.indexOf(name) !== -1;\n    }\n    get(name) {\n      var idx = this.names.indexOf(name);\n      if (idx === -1) {\n        return null;\n      }\n      var {\n        base,\n        stack\n      } = this;\n      var table = stack.get(idx * 3, base);\n      var scope = stack.get(idx * 3 + 1, base);\n      var handle = stack.get(idx * 3 + 2, base);\n      return handle === null ? null : [handle, scope, table];\n    }\n    capture() {\n      return new CapturedBlockArgumentsImpl(this.names, this.values);\n    }\n    get symbolNames() {\n      var symbolNames = this._symbolNames;\n      if (symbolNames === null) {\n        symbolNames = this._symbolNames = this.names.map(toSymbolName);\n      }\n      return symbolNames;\n    }\n  }\n  class CapturedBlockArgumentsImpl {\n    constructor(names, values) {\n      this.names = names;\n      this.values = values;\n      this.length = names.length;\n    }\n    has(name) {\n      return this.names.indexOf(name) !== -1;\n    }\n    get(name) {\n      var idx = this.names.indexOf(name);\n      if (idx === -1) return null;\n      return [this.values[idx * 3 + 2], this.values[idx * 3 + 1], this.values[idx * 3]];\n    }\n  }\n  function createCapturedArgs(named, positional) {\n    return {\n      named,\n      positional\n    };\n  }\n  function reifyNamed$1(named) {\n    var reified = (0, _util.dict)();\n    for (var key in named) {\n      reified[key] = (0, _reference.valueForRef)(named[key]);\n    }\n    return reified;\n  }\n  function reifyPositional$1(positional) {\n    return positional.map(_reference.valueForRef);\n  }\n  function reifyArgs(args) {\n    return {\n      named: reifyNamed$1(args.named),\n      positional: reifyPositional$1(args.positional)\n    };\n  }\n  var EMPTY_NAMED = Object.freeze(Object.create(null));\n  _exports.EMPTY_NAMED = EMPTY_NAMED;\n  var EMPTY_POSITIONAL = EMPTY_REFERENCES;\n  _exports.EMPTY_POSITIONAL = EMPTY_POSITIONAL;\n  var EMPTY_ARGS = createCapturedArgs(EMPTY_NAMED, EMPTY_POSITIONAL);\n  _exports.EMPTY_ARGS = EMPTY_ARGS;\n  APPEND_OPCODES.add(77\n  /* Curry */, (vm, _ref2) => {\n    var {\n      op1: type,\n      op2: _isStrict\n    } = _ref2;\n    var stack = vm.stack;\n    var definition = stack.pop();\n    var capturedArgs = stack.pop();\n    var owner = vm.getOwner();\n    var resolver = vm.runtime.resolver;\n    var isStrict = false;\n    if (true /* DEBUG */) {\n      // strict check only happens in DEBUG builds, no reason to load it otherwise\n      isStrict = vm[CONSTANTS].getValue((0, _util.decodeHandle)(_isStrict));\n    }\n    vm.loadValue(_vm2.$v0, createCurryRef(type, definition, owner, capturedArgs, resolver, isStrict));\n  });\n  APPEND_OPCODES.add(107\n  /* DynamicHelper */, vm => {\n    var stack = vm.stack;\n    var ref = stack.pop();\n    var args = stack.pop().capture();\n    var helperRef;\n    var initialOwner = vm.getOwner();\n    var helperInstanceRef = (0, _reference.createComputeRef)(() => {\n      if (helperRef !== undefined) {\n        (0, _destroyable2.destroy)(helperRef);\n      }\n      var definition = (0, _reference.valueForRef)(ref);\n      if (isCurriedType(definition, 1\n      /* Helper */)) {\n        var {\n          definition: resolvedDef,\n          owner,\n          positional,\n          named\n        } = resolveCurriedValue(definition);\n        var _helper = resolveHelper(vm[CONSTANTS], resolvedDef, ref);\n        if (named !== undefined) {\n          args.named = (0, _util.assign)({}, ...named, args.named);\n        }\n        if (positional !== undefined) {\n          args.positional = positional.concat(args.positional);\n        }\n        helperRef = _helper(args, owner);\n        (0, _destroyable2.associateDestroyableChild)(helperInstanceRef, helperRef);\n      } else if ((0, _util.isObject)(definition)) {\n        var _helper2 = resolveHelper(vm[CONSTANTS], definition, ref);\n        helperRef = _helper2(args, initialOwner);\n        if ((0, _destroyable2._hasDestroyableChildren)(helperRef)) {\n          (0, _destroyable2.associateDestroyableChild)(helperInstanceRef, helperRef);\n        }\n      } else {\n        helperRef = _reference.UNDEFINED_REFERENCE;\n      }\n    });\n    var helperValueRef = (0, _reference.createComputeRef)(() => {\n      (0, _reference.valueForRef)(helperInstanceRef);\n      return (0, _reference.valueForRef)(helperRef);\n    });\n    vm.associateDestroyable(helperInstanceRef);\n    vm.loadValue(_vm2.$v0, helperValueRef);\n  });\n  function resolveHelper(constants, definition, ref) {\n    var handle = constants.helper(definition, null, true);\n    if (true /* DEBUG */ && handle === null) {\n      throw new Error(`Expected a dynamic helper definition, but received an object or function that did not have a helper manager associated with it. The dynamic invocation was \\`{{${ref.debugLabel}}}\\` or \\`(${ref.debugLabel})\\`, and the incorrect definition is the value at the path \\`${ref.debugLabel}\\`, which was: ${(0, _util.debugToString)(definition)}`);\n    }\n    return constants.getValue(handle);\n  }\n  APPEND_OPCODES.add(16\n  /* Helper */, (vm, _ref3) => {\n    var {\n      op1: handle\n    } = _ref3;\n    var stack = vm.stack;\n    var helper = vm[CONSTANTS].getValue(handle);\n    var args = stack.pop();\n    var value = helper(args.capture(), vm.getOwner(), vm.dynamicScope());\n    if ((0, _destroyable2._hasDestroyableChildren)(value)) {\n      vm.associateDestroyable(value);\n    }\n    vm.loadValue(_vm2.$v0, value);\n  });\n  APPEND_OPCODES.add(21\n  /* GetVariable */, (vm, _ref4) => {\n    var {\n      op1: symbol$$1\n    } = _ref4;\n    var expr = vm.referenceForSymbol(symbol$$1);\n    vm.stack.push(expr);\n  });\n  APPEND_OPCODES.add(19\n  /* SetVariable */, (vm, _ref5) => {\n    var {\n      op1: symbol$$1\n    } = _ref5;\n    var expr = vm.stack.pop();\n    vm.scope().bindSymbol(symbol$$1, expr);\n  });\n  APPEND_OPCODES.add(20\n  /* SetBlock */, (vm, _ref6) => {\n    var {\n      op1: symbol$$1\n    } = _ref6;\n    var handle = vm.stack.pop();\n    var scope = vm.stack.pop();\n    var table = vm.stack.pop();\n    vm.scope().bindBlock(symbol$$1, [handle, scope, table]);\n  });\n  APPEND_OPCODES.add(102\n  /* ResolveMaybeLocal */, (vm, _ref7) => {\n    var {\n      op1: _name\n    } = _ref7;\n    var name = vm[CONSTANTS].getValue(_name);\n    var locals = vm.scope().getPartialMap();\n    var ref = locals[name];\n    if (ref === undefined) {\n      ref = (0, _reference.childRefFor)(vm.getSelf(), name);\n    }\n    vm.stack.push(ref);\n  });\n  APPEND_OPCODES.add(37\n  /* RootScope */, (vm, _ref8) => {\n    var {\n      op1: symbols\n    } = _ref8;\n    vm.pushRootScope(symbols, vm.getOwner());\n  });\n  APPEND_OPCODES.add(22\n  /* GetProperty */, (vm, _ref9) => {\n    var {\n      op1: _key\n    } = _ref9;\n    var key = vm[CONSTANTS].getValue(_key);\n    var expr = vm.stack.pop();\n    vm.stack.push((0, _reference.childRefFor)(expr, key));\n  });\n  APPEND_OPCODES.add(23\n  /* GetBlock */, (vm, _ref10) => {\n    var {\n      op1: _block\n    } = _ref10;\n    var {\n      stack\n    } = vm;\n    var block = vm.scope().getBlock(_block);\n    stack.push(block);\n  });\n  APPEND_OPCODES.add(24\n  /* SpreadBlock */, vm => {\n    var {\n      stack\n    } = vm;\n    var block = stack.pop();\n    if (block && !isUndefinedReference(block)) {\n      var [handleOrCompilable, scope, table] = block;\n      stack.push(table);\n      stack.push(scope);\n      stack.push(handleOrCompilable);\n    } else {\n      stack.push(null);\n      stack.push(null);\n      stack.push(null);\n    }\n  });\n  function isUndefinedReference(input) {\n    return input === _reference.UNDEFINED_REFERENCE;\n  }\n  APPEND_OPCODES.add(25\n  /* HasBlock */, vm => {\n    var {\n      stack\n    } = vm;\n    var block = stack.pop();\n    if (block && !isUndefinedReference(block)) {\n      stack.push(_reference.TRUE_REFERENCE);\n    } else {\n      stack.push(_reference.FALSE_REFERENCE);\n    }\n  });\n  APPEND_OPCODES.add(26\n  /* HasBlockParams */, vm => {\n    // FIXME(mmun): should only need to push the symbol table\n    var block = vm.stack.pop();\n    var scope = vm.stack.pop();\n    var table = vm.stack.pop();\n    var hasBlockParams = table && table.parameters.length;\n    vm.stack.push(hasBlockParams ? _reference.TRUE_REFERENCE : _reference.FALSE_REFERENCE);\n  });\n  APPEND_OPCODES.add(27\n  /* Concat */, (vm, _ref11) => {\n    var {\n      op1: count\n    } = _ref11;\n    var out = new Array(count);\n    for (var i = count; i > 0; i--) {\n      var offset = i - 1;\n      out[offset] = vm.stack.pop();\n    }\n    vm.stack.push(createConcatRef(out));\n  });\n  APPEND_OPCODES.add(109\n  /* IfInline */, vm => {\n    var condition = vm.stack.pop();\n    var truthy = vm.stack.pop();\n    var falsy = vm.stack.pop();\n    vm.stack.push((0, _reference.createComputeRef)(() => {\n      if ((0, _globalContext.toBool)((0, _reference.valueForRef)(condition)) === true) {\n        return (0, _reference.valueForRef)(truthy);\n      } else {\n        return (0, _reference.valueForRef)(falsy);\n      }\n    }));\n  });\n  APPEND_OPCODES.add(110\n  /* Not */, vm => {\n    var ref = vm.stack.pop();\n    vm.stack.push((0, _reference.createComputeRef)(() => {\n      return !(0, _globalContext.toBool)((0, _reference.valueForRef)(ref));\n    }));\n  });\n  APPEND_OPCODES.add(111\n  /* GetDynamicVar */, vm => {\n    var scope = vm.dynamicScope();\n    var stack = vm.stack;\n    var nameRef = stack.pop();\n    stack.push((0, _reference.createComputeRef)(() => {\n      var name = String((0, _reference.valueForRef)(nameRef));\n      return (0, _reference.valueForRef)(scope.get(name));\n    }));\n  });\n  APPEND_OPCODES.add(112\n  /* Log */, vm => {\n    var {\n      positional\n    } = vm.stack.pop().capture();\n    vm.loadValue(_vm2.$v0, (0, _reference.createComputeRef)(() => {\n      // eslint-disable-next-line no-console\n      console.log(...reifyPositional$1(positional));\n    }));\n  });\n  function resolveComponent(resolver, constants, name, owner) {\n    var definition = resolver.lookupComponent(name, owner);\n    if (true /* DEBUG */ && !definition) {\n      throw new Error(`Attempted to resolve \\`${name}\\`, which was expected to be a component, but nothing was found.`);\n    }\n    return constants.resolvedComponent(definition, name);\n  }\n\n  /** @internal */\n  function hasCustomDebugRenderTreeLifecycle(manager) {\n    return 'getDebugCustomRenderTree' in manager;\n  }\n  function createClassListRef(list) {\n    return (0, _reference.createComputeRef)(() => {\n      var ret = [];\n      for (var i = 0; i < list.length; i++) {\n        var ref = list[i];\n        var value = normalizeStringValue(typeof ref === 'string' ? ref : (0, _reference.valueForRef)(list[i]));\n        if (value) ret.push(value);\n      }\n      return ret.length === 0 ? null : ret.join(' ');\n    });\n  }\n  APPEND_OPCODES.add(39\n  /* ChildScope */, vm => vm.pushChildScope());\n  APPEND_OPCODES.add(40\n  /* PopScope */, vm => vm.popScope());\n  APPEND_OPCODES.add(59\n  /* PushDynamicScope */, vm => vm.pushDynamicScope());\n  APPEND_OPCODES.add(60\n  /* PopDynamicScope */, vm => vm.popDynamicScope());\n  APPEND_OPCODES.add(28\n  /* Constant */, (vm, _ref12) => {\n    var {\n      op1: other\n    } = _ref12;\n    vm.stack.push(vm[CONSTANTS].getValue((0, _util.decodeHandle)(other)));\n  });\n  APPEND_OPCODES.add(29\n  /* ConstantReference */, (vm, _ref13) => {\n    var {\n      op1: other\n    } = _ref13;\n    vm.stack.push((0, _reference.createConstRef)(vm[CONSTANTS].getValue((0, _util.decodeHandle)(other)), false));\n  });\n  APPEND_OPCODES.add(30\n  /* Primitive */, (vm, _ref14) => {\n    var {\n      op1: primitive\n    } = _ref14;\n    var stack = vm.stack;\n    if ((0, _util.isHandle)(primitive)) {\n      // it is a handle which does not already exist on the stack\n      var value = vm[CONSTANTS].getValue((0, _util.decodeHandle)(primitive));\n      stack.push(value);\n    } else {\n      // is already an encoded immediate or primitive handle\n      stack.push((0, _util.decodeImmediate)(primitive));\n    }\n  });\n  APPEND_OPCODES.add(31\n  /* PrimitiveReference */, vm => {\n    var stack = vm.stack;\n    var value = stack.pop();\n    var ref;\n    if (value === undefined) {\n      ref = _reference.UNDEFINED_REFERENCE;\n    } else if (value === null) {\n      ref = _reference.NULL_REFERENCE;\n    } else if (value === true) {\n      ref = _reference.TRUE_REFERENCE;\n    } else if (value === false) {\n      ref = _reference.FALSE_REFERENCE;\n    } else {\n      ref = (0, _reference.createPrimitiveRef)(value);\n    }\n    stack.push(ref);\n  });\n  APPEND_OPCODES.add(33\n  /* Dup */, (vm, _ref15) => {\n    var {\n      op1: register,\n      op2: offset\n    } = _ref15;\n    var position = vm.fetchValue(register) - offset;\n    vm.stack.dup(position);\n  });\n  APPEND_OPCODES.add(34\n  /* Pop */, (vm, _ref16) => {\n    var {\n      op1: count\n    } = _ref16;\n    vm.stack.pop(count);\n  });\n  APPEND_OPCODES.add(35\n  /* Load */, (vm, _ref17) => {\n    var {\n      op1: register\n    } = _ref17;\n    vm.load(register);\n  });\n  APPEND_OPCODES.add(36\n  /* Fetch */, (vm, _ref18) => {\n    var {\n      op1: register\n    } = _ref18;\n    vm.fetch(register);\n  });\n  APPEND_OPCODES.add(58\n  /* BindDynamicScope */, (vm, _ref19) => {\n    var {\n      op1: _names\n    } = _ref19;\n    var names = vm[CONSTANTS].getArray(_names);\n    vm.bindDynamicScope(names);\n  });\n  APPEND_OPCODES.add(69\n  /* Enter */, (vm, _ref20) => {\n    var {\n      op1: args\n    } = _ref20;\n    vm.enter(args);\n  });\n  APPEND_OPCODES.add(70\n  /* Exit */, vm => {\n    vm.exit();\n  });\n  APPEND_OPCODES.add(63\n  /* PushSymbolTable */, (vm, _ref21) => {\n    var {\n      op1: _table\n    } = _ref21;\n    var stack = vm.stack;\n    stack.push(vm[CONSTANTS].getValue(_table));\n  });\n  APPEND_OPCODES.add(62\n  /* PushBlockScope */, vm => {\n    var stack = vm.stack;\n    stack.push(vm.scope());\n  });\n  APPEND_OPCODES.add(61\n  /* CompileBlock */, vm => {\n    var stack = vm.stack;\n    var block = stack.pop();\n    if (block) {\n      stack.push(vm.compile(block));\n    } else {\n      stack.push(null);\n    }\n  });\n  APPEND_OPCODES.add(64\n  /* InvokeYield */, vm => {\n    var {\n      stack\n    } = vm;\n    var handle = stack.pop();\n    var scope = stack.pop();\n    var table = stack.pop();\n    var args = stack.pop();\n    if (table === null) {\n      // To balance the pop{Frame,Scope}\n      vm.pushFrame();\n      vm.pushScope(scope !== null && scope !== void 0 ? scope : vm.scope());\n      return;\n    }\n    var invokingScope = scope; // If necessary, create a child scope\n\n    {\n      var locals = table.parameters;\n      var localsCount = locals.length;\n      if (localsCount > 0) {\n        invokingScope = invokingScope.child();\n        for (var i = 0; i < localsCount; i++) {\n          invokingScope.bindSymbol(locals[i], args.at(i));\n        }\n      }\n    }\n    vm.pushFrame();\n    vm.pushScope(invokingScope);\n    vm.call(handle);\n  });\n  APPEND_OPCODES.add(65\n  /* JumpIf */, (vm, _ref22) => {\n    var {\n      op1: target\n    } = _ref22;\n    var reference = vm.stack.pop();\n    var value = Boolean((0, _reference.valueForRef)(reference));\n    if ((0, _reference.isConstRef)(reference)) {\n      if (value === true) {\n        vm.goto(target);\n      }\n    } else {\n      if (value === true) {\n        vm.goto(target);\n      }\n      vm.updateWith(new Assert(reference));\n    }\n  });\n  APPEND_OPCODES.add(66\n  /* JumpUnless */, (vm, _ref23) => {\n    var {\n      op1: target\n    } = _ref23;\n    var reference = vm.stack.pop();\n    var value = Boolean((0, _reference.valueForRef)(reference));\n    if ((0, _reference.isConstRef)(reference)) {\n      if (value === false) {\n        vm.goto(target);\n      }\n    } else {\n      if (value === false) {\n        vm.goto(target);\n      }\n      vm.updateWith(new Assert(reference));\n    }\n  });\n  APPEND_OPCODES.add(67\n  /* JumpEq */, (vm, _ref24) => {\n    var {\n      op1: target,\n      op2: comparison\n    } = _ref24;\n    var other = vm.stack.peek();\n    if (other === comparison) {\n      vm.goto(target);\n    }\n  });\n  APPEND_OPCODES.add(68\n  /* AssertSame */, vm => {\n    var reference = vm.stack.peek();\n    if ((0, _reference.isConstRef)(reference) === false) {\n      vm.updateWith(new Assert(reference));\n    }\n  });\n  APPEND_OPCODES.add(71\n  /* ToBoolean */, vm => {\n    var {\n      stack\n    } = vm;\n    var valueRef = stack.pop();\n    stack.push((0, _reference.createComputeRef)(() => (0, _globalContext.toBool)((0, _reference.valueForRef)(valueRef))));\n  });\n  class Assert {\n    constructor(ref) {\n      this.ref = ref;\n      this.last = (0, _reference.valueForRef)(ref);\n    }\n    evaluate(vm) {\n      var {\n        last,\n        ref\n      } = this;\n      var current = (0, _reference.valueForRef)(ref);\n      if (last !== current) {\n        vm.throw();\n      }\n    }\n  }\n  class AssertFilter {\n    constructor(ref, filter) {\n      this.ref = ref;\n      this.filter = filter;\n      this.last = filter((0, _reference.valueForRef)(ref));\n    }\n    evaluate(vm) {\n      var {\n        last,\n        ref,\n        filter\n      } = this;\n      var current = filter((0, _reference.valueForRef)(ref));\n      if (last !== current) {\n        vm.throw();\n      }\n    }\n  }\n  class JumpIfNotModifiedOpcode {\n    constructor() {\n      this.tag = _validator.CONSTANT_TAG;\n      this.lastRevision = _validator.INITIAL;\n    }\n    finalize(tag, target) {\n      this.target = target;\n      this.didModify(tag);\n    }\n    evaluate(vm) {\n      var {\n        tag,\n        target,\n        lastRevision\n      } = this;\n      if (!vm.alwaysRevalidate && (0, _validator.validateTag)(tag, lastRevision)) {\n        (0, _validator.consumeTag)(tag);\n        vm.goto(target);\n      }\n    }\n    didModify(tag) {\n      this.tag = tag;\n      this.lastRevision = (0, _validator.valueForTag)(this.tag);\n      (0, _validator.consumeTag)(tag);\n    }\n  }\n  class BeginTrackFrameOpcode {\n    constructor(debugLabel) {\n      this.debugLabel = debugLabel;\n    }\n    evaluate() {\n      (0, _validator.beginTrackFrame)(this.debugLabel);\n    }\n  }\n  class EndTrackFrameOpcode {\n    constructor(target) {\n      this.target = target;\n    }\n    evaluate() {\n      var tag = (0, _validator.endTrackFrame)();\n      this.target.didModify(tag);\n    }\n  }\n  APPEND_OPCODES.add(41\n  /* Text */, (vm, _ref25) => {\n    var {\n      op1: text\n    } = _ref25;\n    vm.elements().appendText(vm[CONSTANTS].getValue(text));\n  });\n  APPEND_OPCODES.add(42\n  /* Comment */, (vm, _ref26) => {\n    var {\n      op1: text\n    } = _ref26;\n    vm.elements().appendComment(vm[CONSTANTS].getValue(text));\n  });\n  APPEND_OPCODES.add(48\n  /* OpenElement */, (vm, _ref27) => {\n    var {\n      op1: tag\n    } = _ref27;\n    vm.elements().openElement(vm[CONSTANTS].getValue(tag));\n  });\n  APPEND_OPCODES.add(49\n  /* OpenDynamicElement */, vm => {\n    var tagName = (0, _reference.valueForRef)(vm.stack.pop());\n    vm.elements().openElement(tagName);\n  });\n  APPEND_OPCODES.add(50\n  /* PushRemoteElement */, vm => {\n    var elementRef = vm.stack.pop();\n    var insertBeforeRef = vm.stack.pop();\n    var guidRef = vm.stack.pop();\n    var element = (0, _reference.valueForRef)(elementRef);\n    var insertBefore = (0, _reference.valueForRef)(insertBeforeRef);\n    var guid = (0, _reference.valueForRef)(guidRef);\n    if (!(0, _reference.isConstRef)(elementRef)) {\n      vm.updateWith(new Assert(elementRef));\n    }\n    if (insertBefore !== undefined && !(0, _reference.isConstRef)(insertBeforeRef)) {\n      vm.updateWith(new Assert(insertBeforeRef));\n    }\n    var block = vm.elements().pushRemoteElement(element, guid, insertBefore);\n    if (block) vm.associateDestroyable(block);\n  });\n  APPEND_OPCODES.add(56\n  /* PopRemoteElement */, vm => {\n    vm.elements().popRemoteElement();\n  });\n  APPEND_OPCODES.add(54\n  /* FlushElement */, vm => {\n    var operations = vm.fetchValue(_vm2.$t0);\n    var modifiers = null;\n    if (operations) {\n      modifiers = operations.flush(vm);\n      vm.loadValue(_vm2.$t0, null);\n    }\n    vm.elements().flushElement(modifiers);\n  });\n  APPEND_OPCODES.add(55\n  /* CloseElement */, vm => {\n    var modifiers = vm.elements().closeElement();\n    if (modifiers) {\n      modifiers.forEach(modifier => {\n        vm.env.scheduleInstallModifier(modifier);\n        var {\n          manager,\n          state\n        } = modifier;\n        var d = manager.getDestroyable(state);\n        if (d) {\n          vm.associateDestroyable(d);\n        }\n      });\n    }\n  });\n  APPEND_OPCODES.add(57\n  /* Modifier */, (vm, _ref28) => {\n    var {\n      op1: handle\n    } = _ref28;\n    if (vm.env.isInteractive === false) {\n      return;\n    }\n    var owner = vm.getOwner();\n    var args = vm.stack.pop();\n    var definition = vm[CONSTANTS].getValue(handle);\n    var {\n      manager\n    } = definition;\n    var {\n      constructing\n    } = vm.elements();\n    var state = manager.create(owner, constructing, definition.state, args.capture());\n    var instance = {\n      manager,\n      state,\n      definition\n    };\n    var operations = vm.fetchValue(_vm2.$t0);\n    operations.addModifier(instance);\n    var tag = manager.getTag(state);\n    if (tag !== null) {\n      (0, _validator.consumeTag)(tag);\n      return vm.updateWith(new UpdateModifierOpcode(tag, instance));\n    }\n  });\n  APPEND_OPCODES.add(108\n  /* DynamicModifier */, vm => {\n    if (vm.env.isInteractive === false) {\n      return;\n    }\n    var {\n      stack,\n      [CONSTANTS]: constants\n    } = vm;\n    var ref = stack.pop();\n    var args = stack.pop().capture();\n    var {\n      constructing\n    } = vm.elements();\n    var initialOwner = vm.getOwner();\n    var instanceRef = (0, _reference.createComputeRef)(() => {\n      var value = (0, _reference.valueForRef)(ref);\n      var owner;\n      if (!(0, _util.isObject)(value)) {\n        return;\n      }\n      var hostDefinition;\n      if (isCurriedType(value, 2\n      /* Modifier */)) {\n        var {\n          definition: resolvedDefinition,\n          owner: curriedOwner,\n          positional,\n          named\n        } = resolveCurriedValue(value);\n        hostDefinition = resolvedDefinition;\n        owner = curriedOwner;\n        if (positional !== undefined) {\n          args.positional = positional.concat(args.positional);\n        }\n        if (named !== undefined) {\n          args.named = (0, _util.assign)({}, ...named, args.named);\n        }\n      } else {\n        hostDefinition = value;\n        owner = initialOwner;\n      }\n      var handle = constants.modifier(hostDefinition, null, true);\n      if (true /* DEBUG */ && handle === null) {\n        throw new Error(`Expected a dynamic modifier definition, but received an object or function that did not have a modifier manager associated with it. The dynamic invocation was \\`{{${ref.debugLabel}}}\\`, and the incorrect definition is the value at the path \\`${ref.debugLabel}\\`, which was: ${(0, _util.debugToString)(hostDefinition)}`);\n      }\n      var definition = constants.getValue(handle);\n      var {\n        manager\n      } = definition;\n      var state = manager.create(owner, constructing, definition.state, args);\n      return {\n        manager,\n        state,\n        definition\n      };\n    });\n    var instance = (0, _reference.valueForRef)(instanceRef);\n    var tag = null;\n    if (instance !== undefined) {\n      var operations = vm.fetchValue(_vm2.$t0);\n      operations.addModifier(instance);\n      tag = instance.manager.getTag(instance.state);\n      if (tag !== null) {\n        (0, _validator.consumeTag)(tag);\n      }\n    }\n    if (!(0, _reference.isConstRef)(ref) || tag) {\n      return vm.updateWith(new UpdateDynamicModifierOpcode(tag, instance, instanceRef));\n    }\n  });\n  class UpdateModifierOpcode {\n    constructor(tag, modifier) {\n      this.tag = tag;\n      this.modifier = modifier;\n      this.lastUpdated = (0, _validator.valueForTag)(tag);\n    }\n    evaluate(vm) {\n      var {\n        modifier,\n        tag,\n        lastUpdated\n      } = this;\n      (0, _validator.consumeTag)(tag);\n      if (!(0, _validator.validateTag)(tag, lastUpdated)) {\n        vm.env.scheduleUpdateModifier(modifier);\n        this.lastUpdated = (0, _validator.valueForTag)(tag);\n      }\n    }\n  }\n  class UpdateDynamicModifierOpcode {\n    constructor(tag, instance, instanceRef) {\n      this.tag = tag;\n      this.instance = instance;\n      this.instanceRef = instanceRef;\n      this.lastUpdated = (0, _validator.valueForTag)(tag !== null && tag !== void 0 ? tag : _validator.CURRENT_TAG);\n    }\n    evaluate(vm) {\n      var {\n        tag,\n        lastUpdated,\n        instance,\n        instanceRef\n      } = this;\n      var newInstance = (0, _reference.valueForRef)(instanceRef);\n      if (newInstance !== instance) {\n        if (instance !== undefined) {\n          var destroyable = instance.manager.getDestroyable(instance.state);\n          if (destroyable !== null) {\n            (0, _destroyable2.destroy)(destroyable);\n          }\n        }\n        if (newInstance !== undefined) {\n          var {\n            manager,\n            state\n          } = newInstance;\n          var _destroyable = manager.getDestroyable(state);\n          if (_destroyable !== null) {\n            (0, _destroyable2.associateDestroyableChild)(this, _destroyable);\n          }\n          tag = manager.getTag(state);\n          if (tag !== null) {\n            this.lastUpdated = (0, _validator.valueForTag)(tag);\n          }\n          this.tag = tag;\n          vm.env.scheduleInstallModifier(newInstance);\n        }\n        this.instance = newInstance;\n      } else if (tag !== null && !(0, _validator.validateTag)(tag, lastUpdated)) {\n        vm.env.scheduleUpdateModifier(instance);\n        this.lastUpdated = (0, _validator.valueForTag)(tag);\n      }\n      if (tag !== null) {\n        (0, _validator.consumeTag)(tag);\n      }\n    }\n  }\n  APPEND_OPCODES.add(51\n  /* StaticAttr */, (vm, _ref29) => {\n    var {\n      op1: _name,\n      op2: _value,\n      op3: _namespace\n    } = _ref29;\n    var name = vm[CONSTANTS].getValue(_name);\n    var value = vm[CONSTANTS].getValue(_value);\n    var namespace = _namespace ? vm[CONSTANTS].getValue(_namespace) : null;\n    vm.elements().setStaticAttribute(name, value, namespace);\n  });\n  APPEND_OPCODES.add(52\n  /* DynamicAttr */, (vm, _ref30) => {\n    var {\n      op1: _name,\n      op2: _trusting,\n      op3: _namespace\n    } = _ref30;\n    var name = vm[CONSTANTS].getValue(_name);\n    var trusting = vm[CONSTANTS].getValue(_trusting);\n    var reference = vm.stack.pop();\n    var value = (0, _reference.valueForRef)(reference);\n    var namespace = _namespace ? vm[CONSTANTS].getValue(_namespace) : null;\n    var attribute = vm.elements().setDynamicAttribute(name, value, trusting, namespace);\n    if (!(0, _reference.isConstRef)(reference)) {\n      vm.updateWith(new UpdateDynamicAttributeOpcode(reference, attribute, vm.env));\n    }\n  });\n  class UpdateDynamicAttributeOpcode {\n    constructor(reference, attribute, env) {\n      var initialized = false;\n      this.updateRef = (0, _reference.createComputeRef)(() => {\n        var value = (0, _reference.valueForRef)(reference);\n        if (initialized === true) {\n          attribute.update(value, env);\n        } else {\n          initialized = true;\n        }\n      });\n      (0, _reference.valueForRef)(this.updateRef);\n    }\n    evaluate() {\n      (0, _reference.valueForRef)(this.updateRef);\n    }\n  }\n  APPEND_OPCODES.add(78\n  /* PushComponentDefinition */, (vm, _ref31) => {\n    var {\n      op1: handle\n    } = _ref31;\n    var definition = vm[CONSTANTS].getValue(handle);\n    var {\n      manager,\n      capabilities\n    } = definition;\n    var instance = {\n      definition,\n      manager,\n      capabilities,\n      state: null,\n      handle: null,\n      table: null,\n      lookup: null\n    };\n    vm.stack.push(instance);\n  });\n  APPEND_OPCODES.add(80\n  /* ResolveDynamicComponent */, (vm, _ref32) => {\n    var {\n      op1: _isStrict\n    } = _ref32;\n    var stack = vm.stack;\n    var component = (0, _reference.valueForRef)(stack.pop());\n    var constants = vm[CONSTANTS];\n    var owner = vm.getOwner();\n    var isStrict = constants.getValue(_isStrict);\n    vm.loadValue(_vm2.$t1, null); // Clear the temp register\n\n    var definition;\n    if (typeof component === 'string') {\n      if (true /* DEBUG */ && isStrict) {\n        throw new Error(`Attempted to resolve a dynamic component with a string definition, \\`${component}\\` in a strict mode template. In strict mode, using strings to resolve component definitions is prohibited. You can instead import the component definition and use it directly.`);\n      }\n      var resolvedDefinition = resolveComponent(vm.runtime.resolver, constants, component, owner);\n      definition = resolvedDefinition;\n    } else if (isCurriedValue(component)) {\n      definition = component;\n    } else {\n      definition = constants.component(component, owner);\n    }\n    stack.push(definition);\n  });\n  APPEND_OPCODES.add(81\n  /* ResolveCurriedComponent */, vm => {\n    var stack = vm.stack;\n    var ref = stack.pop();\n    var value = (0, _reference.valueForRef)(ref);\n    var constants = vm[CONSTANTS];\n    var definition;\n    if (true /* DEBUG */ && !(typeof value === 'function' || typeof value === 'object' && value !== null)) {\n      throw new Error(`Expected a component definition, but received ${value}. You may have accidentally done <${ref.debugLabel}>, where \"${ref.debugLabel}\" was a string instead of a curried component definition. You must either use the component definition directly, or use the {{component}} helper to create a curried component definition when invoking dynamically.`);\n    }\n    if (isCurriedValue(value)) {\n      definition = value;\n    } else {\n      definition = constants.component(value, vm.getOwner(), true);\n      if (true /* DEBUG */ && definition === null) {\n        throw new Error(`Expected a dynamic component definition, but received an object or function that did not have a component manager associated with it. The dynamic invocation was \\`<${ref.debugLabel}>\\` or \\`{{${ref.debugLabel}}}\\`, and the incorrect definition is the value at the path \\`${ref.debugLabel}\\`, which was: ${(0, _util.debugToString)(value)}`);\n      }\n    }\n    stack.push(definition);\n  });\n  APPEND_OPCODES.add(79\n  /* PushDynamicComponentInstance */, vm => {\n    var {\n      stack\n    } = vm;\n    var definition = stack.pop();\n    var capabilities, manager;\n    if (isCurriedValue(definition)) {\n      manager = capabilities = null;\n    } else {\n      manager = definition.manager;\n      capabilities = definition.capabilities;\n    }\n    stack.push({\n      definition,\n      capabilities,\n      manager,\n      state: null,\n      handle: null,\n      table: null\n    });\n  });\n  APPEND_OPCODES.add(82\n  /* PushArgs */, (vm, _ref33) => {\n    var {\n      op1: _names,\n      op2: _blockNames,\n      op3: flags\n    } = _ref33;\n    var stack = vm.stack;\n    var names = vm[CONSTANTS].getArray(_names);\n    var positionalCount = flags >> 4;\n    var atNames = flags & 0b1000;\n    var blockNames = flags & 0b0111 ? vm[CONSTANTS].getArray(_blockNames) : _util.EMPTY_STRING_ARRAY;\n    vm[ARGS].setup(stack, names, blockNames, positionalCount, !!atNames);\n    stack.push(vm[ARGS]);\n  });\n  APPEND_OPCODES.add(83\n  /* PushEmptyArgs */, vm => {\n    var {\n      stack\n    } = vm;\n    stack.push(vm[ARGS].empty(stack));\n  });\n  APPEND_OPCODES.add(86\n  /* CaptureArgs */, vm => {\n    var stack = vm.stack;\n    var args = stack.pop();\n    var capturedArgs = args.capture();\n    stack.push(capturedArgs);\n  });\n  APPEND_OPCODES.add(85\n  /* PrepareArgs */, (vm, _ref34) => {\n    var {\n      op1: _state\n    } = _ref34;\n    var stack = vm.stack;\n    var instance = vm.fetchValue(_state);\n    var args = stack.pop();\n    var {\n      definition\n    } = instance;\n    if (isCurriedType(definition, 0\n    /* Component */)) {\n      var constants = vm[CONSTANTS];\n      var {\n        definition: resolvedDefinition,\n        owner,\n        resolved,\n        positional,\n        named\n      } = resolveCurriedValue(definition);\n      if (resolved === true) {\n        definition = resolvedDefinition;\n      } else if (typeof resolvedDefinition === 'string') {\n        var resolvedValue = vm.runtime.resolver.lookupComponent(resolvedDefinition, owner);\n        definition = constants.resolvedComponent(resolvedValue, resolvedDefinition);\n      } else {\n        definition = constants.component(resolvedDefinition, owner);\n      }\n      if (named !== undefined) {\n        args.named.merge((0, _util.assign)({}, ...named));\n      }\n      if (positional !== undefined) {\n        args.realloc(positional.length);\n        args.positional.prepend(positional);\n      }\n      var {\n        manager: _manager\n      } = definition;\n      instance.definition = definition;\n      instance.manager = _manager;\n      instance.capabilities = definition.capabilities; // Save off the owner that this component was curried with. Later on,\n      // we'll fetch the value of this register and set it as the owner on the\n      // new root scope.\n\n      vm.loadValue(_vm2.$t1, owner);\n    }\n    var {\n      manager,\n      state\n    } = definition;\n    var capabilities = instance.capabilities;\n    if (!(0, _manager5.managerHasCapability)(manager, capabilities, 4\n    /* PrepareArgs */)) {\n      stack.push(args);\n      return;\n    }\n    var blocks = args.blocks.values;\n    var blockNames = args.blocks.names;\n    var preparedArgs = manager.prepareArgs(state, args);\n    if (preparedArgs) {\n      args.clear();\n      for (var i = 0; i < blocks.length; i++) {\n        stack.push(blocks[i]);\n      }\n      var {\n        positional: _positional,\n        named: _named\n      } = preparedArgs;\n      var positionalCount = _positional.length;\n      for (var _i = 0; _i < positionalCount; _i++) {\n        stack.push(_positional[_i]);\n      }\n      var names = Object.keys(_named);\n      for (var _i2 = 0; _i2 < names.length; _i2++) {\n        stack.push(_named[names[_i2]]);\n      }\n      args.setup(stack, names, blockNames, positionalCount, false);\n    }\n    stack.push(args);\n  });\n  APPEND_OPCODES.add(87\n  /* CreateComponent */, (vm, _ref35) => {\n    var {\n      op1: flags,\n      op2: _state\n    } = _ref35;\n    var instance = vm.fetchValue(_state);\n    var {\n      definition,\n      manager,\n      capabilities\n    } = instance;\n    if (!(0, _manager5.managerHasCapability)(manager, capabilities, 512\n    /* CreateInstance */)) {\n      // TODO: Closure and Main components are always invoked dynamically, so this\n      // opcode may run even if this capability is not enabled. In the future we\n      // should handle this in a better way.\n      return;\n    }\n    var dynamicScope = null;\n    if ((0, _manager5.managerHasCapability)(manager, capabilities, 64\n    /* DynamicScope */)) {\n      dynamicScope = vm.dynamicScope();\n    }\n    var hasDefaultBlock = flags & 1;\n    var args = null;\n    if ((0, _manager5.managerHasCapability)(manager, capabilities, 8\n    /* CreateArgs */)) {\n      args = vm.stack.peek();\n    }\n    var self = null;\n    if ((0, _manager5.managerHasCapability)(manager, capabilities, 128\n    /* CreateCaller */)) {\n      self = vm.getSelf();\n    }\n    var state = manager.create(vm.getOwner(), definition.state, args, vm.env, dynamicScope, self, !!hasDefaultBlock); // We want to reuse the `state` POJO here, because we know that the opcodes\n    // only transition at exactly one place.\n\n    instance.state = state;\n    if ((0, _manager5.managerHasCapability)(manager, capabilities, 256\n    /* UpdateHook */)) {\n      vm.updateWith(new UpdateComponentOpcode(state, manager, dynamicScope));\n    }\n  });\n  APPEND_OPCODES.add(88\n  /* RegisterComponentDestructor */, (vm, _ref36) => {\n    var {\n      op1: _state\n    } = _ref36;\n    var {\n      manager,\n      state,\n      capabilities\n    } = vm.fetchValue(_state);\n    var d = manager.getDestroyable(state);\n    if (true /* DEBUG */ && !(0, _manager5.managerHasCapability)(manager, capabilities, 2048\n    /* WillDestroy */) && d !== null && typeof 'willDestroy' in d) {\n      throw new Error('BUG: Destructor has willDestroy, but the willDestroy capability was not enabled for this component. Pre-destruction hooks must be explicitly opted into');\n    }\n    if (d) vm.associateDestroyable(d);\n  });\n  APPEND_OPCODES.add(97\n  /* BeginComponentTransaction */, (vm, _ref37) => {\n    var {\n      op1: _state\n    } = _ref37;\n    var _a;\n    var name;\n    if (true /* DEBUG */) {\n      var {\n        definition,\n        manager\n      } = vm.fetchValue(_state);\n      name = (_a = definition.resolvedName) !== null && _a !== void 0 ? _a : manager.getDebugName(definition.state);\n    }\n    vm.beginCacheGroup(name);\n    vm.elements().pushSimpleBlock();\n  });\n  APPEND_OPCODES.add(89\n  /* PutComponentOperations */, vm => {\n    vm.loadValue(_vm2.$t0, new ComponentElementOperations());\n  });\n  APPEND_OPCODES.add(53\n  /* ComponentAttr */, (vm, _ref38) => {\n    var {\n      op1: _name,\n      op2: _trusting,\n      op3: _namespace\n    } = _ref38;\n    var name = vm[CONSTANTS].getValue(_name);\n    var trusting = vm[CONSTANTS].getValue(_trusting);\n    var reference = vm.stack.pop();\n    var namespace = _namespace ? vm[CONSTANTS].getValue(_namespace) : null;\n    vm.fetchValue(_vm2.$t0).setAttribute(name, reference, trusting, namespace);\n  });\n  APPEND_OPCODES.add(105\n  /* StaticComponentAttr */, (vm, _ref39) => {\n    var {\n      op1: _name,\n      op2: _value,\n      op3: _namespace\n    } = _ref39;\n    var name = vm[CONSTANTS].getValue(_name);\n    var value = vm[CONSTANTS].getValue(_value);\n    var namespace = _namespace ? vm[CONSTANTS].getValue(_namespace) : null;\n    vm.fetchValue(_vm2.$t0).setStaticAttribute(name, value, namespace);\n  });\n  class ComponentElementOperations {\n    constructor() {\n      this.attributes = (0, _util.dict)();\n      this.classes = [];\n      this.modifiers = [];\n    }\n    setAttribute(name, value, trusting, namespace) {\n      var deferred = {\n        value,\n        namespace,\n        trusting\n      };\n      if (name === 'class') {\n        this.classes.push(value);\n      }\n      this.attributes[name] = deferred;\n    }\n    setStaticAttribute(name, value, namespace) {\n      var deferred = {\n        value,\n        namespace\n      };\n      if (name === 'class') {\n        this.classes.push(value);\n      }\n      this.attributes[name] = deferred;\n    }\n    addModifier(modifier) {\n      this.modifiers.push(modifier);\n    }\n    flush(vm) {\n      var type;\n      var attributes = this.attributes;\n      for (var name in this.attributes) {\n        if (name === 'type') {\n          type = attributes[name];\n          continue;\n        }\n        var attr = this.attributes[name];\n        if (name === 'class') {\n          setDeferredAttr(vm, 'class', mergeClasses(this.classes), attr.namespace, attr.trusting);\n        } else {\n          setDeferredAttr(vm, name, attr.value, attr.namespace, attr.trusting);\n        }\n      }\n      if (type !== undefined) {\n        setDeferredAttr(vm, 'type', type.value, type.namespace, type.trusting);\n      }\n      return this.modifiers;\n    }\n  }\n  function mergeClasses(classes) {\n    if (classes.length === 0) {\n      return '';\n    }\n    if (classes.length === 1) {\n      return classes[0];\n    }\n    if (allStringClasses(classes)) {\n      return classes.join(' ');\n    }\n    return createClassListRef(classes);\n  }\n  function allStringClasses(classes) {\n    for (var i = 0; i < classes.length; i++) {\n      if (typeof classes[i] !== 'string') {\n        return false;\n      }\n    }\n    return true;\n  }\n  function setDeferredAttr(vm, name, value, namespace, trusting) {\n    if (trusting === void 0) {\n      trusting = false;\n    }\n    if (typeof value === 'string') {\n      vm.elements().setStaticAttribute(name, value, namespace);\n    } else {\n      var attribute = vm.elements().setDynamicAttribute(name, (0, _reference.valueForRef)(value), trusting, namespace);\n      if (!(0, _reference.isConstRef)(value)) {\n        vm.updateWith(new UpdateDynamicAttributeOpcode(value, attribute, vm.env));\n      }\n    }\n  }\n  APPEND_OPCODES.add(99\n  /* DidCreateElement */, (vm, _ref40) => {\n    var {\n      op1: _state\n    } = _ref40;\n    var {\n      definition,\n      state\n    } = vm.fetchValue(_state);\n    var {\n      manager\n    } = definition;\n    var operations = vm.fetchValue(_vm2.$t0);\n    manager.didCreateElement(state, vm.elements().constructing, operations);\n  });\n  APPEND_OPCODES.add(90\n  /* GetComponentSelf */, (vm, _ref41) => {\n    var {\n      op1: _state,\n      op2: _names\n    } = _ref41;\n    var _a;\n    var instance = vm.fetchValue(_state);\n    var {\n      definition,\n      state\n    } = instance;\n    var {\n      manager\n    } = definition;\n    var selfRef = manager.getSelf(state);\n    if (vm.env.debugRenderTree !== undefined) {\n      var _instance = vm.fetchValue(_state);\n      var {\n        definition: _definition,\n        manager: _manager2\n      } = _instance;\n      var args;\n      if (vm.stack.peek() === vm[ARGS]) {\n        args = vm[ARGS].capture();\n      } else {\n        var names = vm[CONSTANTS].getArray(_names);\n        vm[ARGS].setup(vm.stack, names, [], 0, true);\n        args = vm[ARGS].capture();\n      }\n      var moduleName;\n      var compilable = _definition.compilable;\n      if (compilable === null) {\n        compilable = _manager2.getDynamicLayout(state, vm.runtime.resolver);\n        if (compilable !== null) {\n          moduleName = compilable.moduleName;\n        } else {\n          moduleName = '__default__.hbs';\n        }\n      } else {\n        moduleName = compilable.moduleName;\n      } // For tearing down the debugRenderTree\n\n      vm.associateDestroyable(_instance);\n      if (hasCustomDebugRenderTreeLifecycle(_manager2)) {\n        var nodes = _manager2.getDebugCustomRenderTree(_instance.definition.state, _instance.state, args, moduleName);\n        nodes.forEach(node => {\n          var {\n            bucket\n          } = node;\n          vm.env.debugRenderTree.create(bucket, node);\n          (0, _destroyable2.registerDestructor)(_instance, () => {\n            var _a;\n            (_a = vm.env.debugRenderTree) === null || _a === void 0 ? void 0 : _a.willDestroy(bucket);\n          });\n          vm.updateWith(new DebugRenderTreeUpdateOpcode(bucket));\n        });\n      } else {\n        var name = (_a = _definition.resolvedName) !== null && _a !== void 0 ? _a : _manager2.getDebugName(_definition.state);\n        vm.env.debugRenderTree.create(_instance, {\n          type: 'component',\n          name,\n          args,\n          template: moduleName,\n          instance: (0, _reference.valueForRef)(selfRef)\n        });\n        vm.associateDestroyable(_instance);\n        (0, _destroyable2.registerDestructor)(_instance, () => {\n          var _a;\n          (_a = vm.env.debugRenderTree) === null || _a === void 0 ? void 0 : _a.willDestroy(_instance);\n        });\n        vm.updateWith(new DebugRenderTreeUpdateOpcode(_instance));\n      }\n    }\n    vm.stack.push(selfRef);\n  });\n  APPEND_OPCODES.add(91\n  /* GetComponentTagName */, (vm, _ref42) => {\n    var {\n      op1: _state\n    } = _ref42;\n    var {\n      definition,\n      state\n    } = vm.fetchValue(_state);\n    var {\n      manager\n    } = definition;\n    var tagName = manager.getTagName(state); // User provided value from JS, so we don't bother to encode\n\n    vm.stack.push(tagName);\n  }); // Dynamic Invocation Only\n\n  APPEND_OPCODES.add(92\n  /* GetComponentLayout */, (vm, _ref43) => {\n    var {\n      op1: _state\n    } = _ref43;\n    var instance = vm.fetchValue(_state);\n    var {\n      manager,\n      definition\n    } = instance;\n    var {\n      stack\n    } = vm;\n    var {\n      compilable\n    } = definition;\n    if (compilable === null) {\n      var {\n        capabilities\n      } = instance;\n      compilable = manager.getDynamicLayout(instance.state, vm.runtime.resolver);\n      if (compilable === null) {\n        if ((0, _manager5.managerHasCapability)(manager, capabilities, 1024\n        /* Wrapped */)) {\n          compilable = (0, _util.unwrapTemplate)(vm[CONSTANTS].defaultTemplate).asWrappedLayout();\n        } else {\n          compilable = (0, _util.unwrapTemplate)(vm[CONSTANTS].defaultTemplate).asLayout();\n        }\n      }\n    }\n    var handle = compilable.compile(vm.context);\n    stack.push(compilable.symbolTable);\n    stack.push(handle);\n  });\n  APPEND_OPCODES.add(75\n  /* Main */, (vm, _ref44) => {\n    var {\n      op1: register\n    } = _ref44;\n    var definition = vm.stack.pop();\n    var invocation = vm.stack.pop();\n    var {\n      manager,\n      capabilities\n    } = definition;\n    var state = {\n      definition,\n      manager,\n      capabilities,\n      state: null,\n      handle: invocation.handle,\n      table: invocation.symbolTable,\n      lookup: null\n    };\n    vm.loadValue(register, state);\n  });\n  APPEND_OPCODES.add(95\n  /* PopulateLayout */, (vm, _ref45) => {\n    var {\n      op1: _state\n    } = _ref45;\n    var {\n      stack\n    } = vm; // In DEBUG handles could be ErrHandle objects\n\n    var handle = stack.pop();\n    var table = stack.pop();\n    var state = vm.fetchValue(_state);\n    state.handle = handle;\n    state.table = table;\n  });\n  APPEND_OPCODES.add(38\n  /* VirtualRootScope */, (vm, _ref46) => {\n    var {\n      op1: _state\n    } = _ref46;\n    var {\n      table,\n      manager,\n      capabilities,\n      state\n    } = vm.fetchValue(_state);\n    var owner;\n    if ((0, _manager5.managerHasCapability)(manager, capabilities, 4096\n    /* HasSubOwner */)) {\n      owner = manager.getOwner(state);\n      vm.loadValue(_vm2.$t1, null); // Clear the temp register\n    } else {\n      // Check the temp register to see if an owner was resolved from currying\n      owner = vm.fetchValue(_vm2.$t1);\n      if (owner === null) {\n        // If an owner wasn't found, default to using the current owner. This\n        // will happen for normal dynamic component invocation,\n        // e.g. <SomeClassicEmberComponent/>\n        owner = vm.getOwner();\n      } else {\n        // Else the owner was found, so clear the temp register. This will happen\n        // if we are loading a curried component, e.g. <@someCurriedComponent/>\n        vm.loadValue(_vm2.$t1, null);\n      }\n    }\n    vm.pushRootScope(table.symbols.length + 1, owner);\n  });\n  APPEND_OPCODES.add(94\n  /* SetupForEval */, (vm, _ref47) => {\n    var {\n      op1: _state\n    } = _ref47;\n    var state = vm.fetchValue(_state);\n    if (state.table.hasEval) {\n      var lookup = state.lookup = (0, _util.dict)();\n      vm.scope().bindEvalScope(lookup);\n    }\n  });\n  APPEND_OPCODES.add(17\n  /* SetNamedVariables */, (vm, _ref48) => {\n    var {\n      op1: _state\n    } = _ref48;\n    var state = vm.fetchValue(_state);\n    var scope = vm.scope();\n    var args = vm.stack.peek();\n    var callerNames = args.named.atNames;\n    for (var i = callerNames.length - 1; i >= 0; i--) {\n      var atName = callerNames[i];\n      var symbol$$1 = state.table.symbols.indexOf(callerNames[i]);\n      var value = args.named.get(atName, true);\n      if (symbol$$1 !== -1) scope.bindSymbol(symbol$$1 + 1, value);\n      if (state.lookup) state.lookup[atName] = value;\n    }\n  });\n  function bindBlock(symbolName, blockName, state, blocks, vm) {\n    var symbol$$1 = state.table.symbols.indexOf(symbolName);\n    var block = blocks.get(blockName);\n    if (symbol$$1 !== -1) vm.scope().bindBlock(symbol$$1 + 1, block);\n    if (state.lookup) state.lookup[symbolName] = block;\n  }\n  APPEND_OPCODES.add(18\n  /* SetBlocks */, (vm, _ref49) => {\n    var {\n      op1: _state\n    } = _ref49;\n    var state = vm.fetchValue(_state);\n    var {\n      blocks\n    } = vm.stack.peek();\n    for (var i = 0; i < blocks.names.length; i++) {\n      bindBlock(blocks.symbolNames[i], blocks.names[i], state, blocks, vm);\n    }\n  }); // Dynamic Invocation Only\n\n  APPEND_OPCODES.add(96\n  /* InvokeComponentLayout */, (vm, _ref50) => {\n    var {\n      op1: _state\n    } = _ref50;\n    var state = vm.fetchValue(_state);\n    vm.call(state.handle);\n  });\n  APPEND_OPCODES.add(100\n  /* DidRenderLayout */, (vm, _ref51) => {\n    var {\n      op1: _state\n    } = _ref51;\n    var instance = vm.fetchValue(_state);\n    var {\n      manager,\n      state,\n      capabilities\n    } = instance;\n    var bounds = vm.elements().popBlock();\n    if (vm.env.debugRenderTree !== undefined) {\n      if (hasCustomDebugRenderTreeLifecycle(manager)) {\n        var nodes = manager.getDebugCustomRenderTree(instance.definition.state, state, EMPTY_ARGS);\n        nodes.reverse().forEach(node => {\n          var {\n            bucket\n          } = node;\n          vm.env.debugRenderTree.didRender(bucket, bounds);\n          vm.updateWith(new DebugRenderTreeDidRenderOpcode(bucket, bounds));\n        });\n      } else {\n        vm.env.debugRenderTree.didRender(instance, bounds);\n        vm.updateWith(new DebugRenderTreeDidRenderOpcode(instance, bounds));\n      }\n    }\n    if ((0, _manager5.managerHasCapability)(manager, capabilities, 512\n    /* CreateInstance */)) {\n      var mgr = manager;\n      mgr.didRenderLayout(state, bounds);\n      vm.env.didCreate(instance);\n      vm.updateWith(new DidUpdateLayoutOpcode(instance, bounds));\n    }\n  });\n  APPEND_OPCODES.add(98\n  /* CommitComponentTransaction */, vm => {\n    vm.commitCacheGroup();\n  });\n  class UpdateComponentOpcode {\n    constructor(component, manager, dynamicScope) {\n      this.component = component;\n      this.manager = manager;\n      this.dynamicScope = dynamicScope;\n    }\n    evaluate(_vm) {\n      var {\n        component,\n        manager,\n        dynamicScope\n      } = this;\n      manager.update(component, dynamicScope);\n    }\n  }\n  class DidUpdateLayoutOpcode {\n    constructor(component, bounds) {\n      this.component = component;\n      this.bounds = bounds;\n    }\n    evaluate(vm) {\n      var {\n        component,\n        bounds\n      } = this;\n      var {\n        manager,\n        state\n      } = component;\n      manager.didUpdateLayout(state, bounds);\n      vm.env.didUpdate(component);\n    }\n  }\n  class DebugRenderTreeUpdateOpcode {\n    constructor(bucket) {\n      this.bucket = bucket;\n    }\n    evaluate(vm) {\n      var _a;\n      (_a = vm.env.debugRenderTree) === null || _a === void 0 ? void 0 : _a.update(this.bucket);\n    }\n  }\n  class DebugRenderTreeDidRenderOpcode {\n    constructor(bucket, bounds) {\n      this.bucket = bucket;\n      this.bounds = bounds;\n    }\n    evaluate(vm) {\n      var _a;\n      (_a = vm.env.debugRenderTree) === null || _a === void 0 ? void 0 : _a.didRender(this.bucket, this.bounds);\n    }\n  }\n  class DynamicTextContent {\n    constructor(node, reference, lastValue) {\n      this.node = node;\n      this.reference = reference;\n      this.lastValue = lastValue;\n    }\n    evaluate() {\n      var value = (0, _reference.valueForRef)(this.reference);\n      var {\n        lastValue\n      } = this;\n      if (value === lastValue) return;\n      var normalized;\n      if (isEmpty(value)) {\n        normalized = '';\n      } else if (isString(value)) {\n        normalized = value;\n      } else {\n        normalized = String(value);\n      }\n      if (normalized !== lastValue) {\n        var textNode = this.node;\n        textNode.nodeValue = this.lastValue = normalized;\n      }\n    }\n  }\n  function toContentType(value) {\n    if (shouldCoerce(value)) {\n      return 2\n      /* String */;\n    } else if (isCurriedType(value, 0\n    /* Component */) || (0, _manager5.hasInternalComponentManager)(value)) {\n      return 0\n      /* Component */;\n    } else if (isCurriedType(value, 1\n    /* Helper */) || (0, _manager5.hasInternalHelperManager)(value)) {\n      return 1\n      /* Helper */;\n    } else if (isSafeString(value)) {\n      return 4\n      /* SafeString */;\n    } else if (isFragment(value)) {\n      return 5\n      /* Fragment */;\n    } else if (isNode(value)) {\n      return 6\n      /* Node */;\n    } else {\n      return 2\n      /* String */;\n    }\n  }\n\n  function toDynamicContentType(value) {\n    if (!(0, _util.isObject)(value)) {\n      return 2\n      /* String */;\n    }\n\n    if (isCurriedType(value, 0\n    /* Component */) || (0, _manager5.hasInternalComponentManager)(value)) {\n      return 0\n      /* Component */;\n    } else {\n      if (true /* DEBUG */ && !isCurriedType(value, 1\n      /* Helper */) && !(0, _manager5.hasInternalHelperManager)(value)) {\n        throw new Error(`Attempted use a dynamic value as a component or helper, but that value did not have an associated component or helper manager. The value was: ${value}`);\n      }\n      return 1\n      /* Helper */;\n    }\n  }\n\n  APPEND_OPCODES.add(76\n  /* ContentType */, vm => {\n    var reference = vm.stack.peek();\n    vm.stack.push(toContentType((0, _reference.valueForRef)(reference)));\n    if (!(0, _reference.isConstRef)(reference)) {\n      vm.updateWith(new AssertFilter(reference, toContentType));\n    }\n  });\n  APPEND_OPCODES.add(106\n  /* DynamicContentType */, vm => {\n    var reference = vm.stack.peek();\n    vm.stack.push(toDynamicContentType((0, _reference.valueForRef)(reference)));\n    if (!(0, _reference.isConstRef)(reference)) {\n      vm.updateWith(new AssertFilter(reference, toDynamicContentType));\n    }\n  });\n  APPEND_OPCODES.add(43\n  /* AppendHTML */, vm => {\n    var reference = vm.stack.pop();\n    var rawValue = (0, _reference.valueForRef)(reference);\n    var value = isEmpty(rawValue) ? '' : String(rawValue);\n    vm.elements().appendDynamicHTML(value);\n  });\n  APPEND_OPCODES.add(44\n  /* AppendSafeHTML */, vm => {\n    var reference = vm.stack.pop();\n    var rawValue = (0, _reference.valueForRef)(reference).toHTML();\n    var value = isEmpty(rawValue) ? '' : rawValue;\n    vm.elements().appendDynamicHTML(value);\n  });\n  APPEND_OPCODES.add(47\n  /* AppendText */, vm => {\n    var reference = vm.stack.pop();\n    var rawValue = (0, _reference.valueForRef)(reference);\n    var value = isEmpty(rawValue) ? '' : String(rawValue);\n    var node = vm.elements().appendDynamicText(value);\n    if (!(0, _reference.isConstRef)(reference)) {\n      vm.updateWith(new DynamicTextContent(node, reference, value));\n    }\n  });\n  APPEND_OPCODES.add(45\n  /* AppendDocumentFragment */, vm => {\n    var reference = vm.stack.pop();\n    var value = (0, _reference.valueForRef)(reference);\n    vm.elements().appendDynamicFragment(value);\n  });\n  APPEND_OPCODES.add(46\n  /* AppendNode */, vm => {\n    var reference = vm.stack.pop();\n    var value = (0, _reference.valueForRef)(reference);\n    vm.elements().appendDynamicNode(value);\n  });\n  function debugCallback(context, get) {\n    // eslint-disable-next-line no-console\n    console.info('Use `context`, and `get(<path>)` to debug this template.'); // for example...\n    // eslint-disable-next-line no-unused-expressions\n\n    context === get('this'); // eslint-disable-next-line no-debugger\n\n    debugger;\n  }\n  var callback = debugCallback; // For testing purposes\n\n  function setDebuggerCallback(cb) {\n    callback = cb;\n  }\n  function resetDebuggerCallback() {\n    callback = debugCallback;\n  }\n  class ScopeInspector {\n    constructor(scope, symbols, evalInfo) {\n      this.scope = scope;\n      this.locals = (0, _util.dict)();\n      for (var i = 0; i < evalInfo.length; i++) {\n        var slot = evalInfo[i];\n        var name = symbols[slot - 1];\n        var ref = scope.getSymbol(slot);\n        this.locals[name] = ref;\n      }\n    }\n    get(path) {\n      var {\n        scope,\n        locals\n      } = this;\n      var parts = path.split('.');\n      var [head, ...tail] = path.split('.');\n      var evalScope = scope.getEvalScope();\n      var ref;\n      if (head === 'this') {\n        ref = scope.getSelf();\n      } else if (locals[head]) {\n        ref = locals[head];\n      } else if (head.indexOf('@') === 0 && evalScope[head]) {\n        ref = evalScope[head];\n      } else {\n        ref = this.scope.getSelf();\n        tail = parts;\n      }\n      return tail.reduce((r, part) => (0, _reference.childRefFor)(r, part), ref);\n    }\n  }\n  APPEND_OPCODES.add(103\n  /* Debugger */, (vm, _ref52) => {\n    var {\n      op1: _symbols,\n      op2: _evalInfo\n    } = _ref52;\n    var symbols = vm[CONSTANTS].getArray(_symbols);\n    var evalInfo = vm[CONSTANTS].getArray((0, _util.decodeHandle)(_evalInfo));\n    var inspector = new ScopeInspector(vm.scope(), symbols, evalInfo);\n    callback((0, _reference.valueForRef)(vm.getSelf()), path => (0, _reference.valueForRef)(inspector.get(path)));\n  });\n  APPEND_OPCODES.add(72\n  /* EnterList */, (vm, _ref53) => {\n    var {\n      op1: relativeStart,\n      op2: elseTarget\n    } = _ref53;\n    var stack = vm.stack;\n    var listRef = stack.pop();\n    var keyRef = stack.pop();\n    var keyValue = (0, _reference.valueForRef)(keyRef);\n    var key = keyValue === null ? '@identity' : String(keyValue);\n    var iteratorRef = (0, _reference.createIteratorRef)(listRef, key);\n    var iterator = (0, _reference.valueForRef)(iteratorRef);\n    vm.updateWith(new AssertFilter(iteratorRef, iterator => iterator.isEmpty()));\n    if (iterator.isEmpty() === true) {\n      // TODO: Fix this offset, should be accurate\n      vm.goto(elseTarget + 1);\n    } else {\n      vm.enterList(iteratorRef, relativeStart);\n      vm.stack.push(iterator);\n    }\n  });\n  APPEND_OPCODES.add(73\n  /* ExitList */, vm => {\n    vm.exitList();\n  });\n  APPEND_OPCODES.add(74\n  /* Iterate */, (vm, _ref54) => {\n    var {\n      op1: breaks\n    } = _ref54;\n    var stack = vm.stack;\n    var iterator = stack.peek();\n    var item = iterator.next();\n    if (item !== null) {\n      vm.registerItem(vm.enterItem(item));\n    } else {\n      vm.goto(breaks);\n    }\n  });\n  var CAPABILITIES = {\n    dynamicLayout: false,\n    dynamicTag: false,\n    prepareArgs: false,\n    createArgs: false,\n    attributeHook: false,\n    elementHook: false,\n    createCaller: false,\n    dynamicScope: false,\n    updateHook: false,\n    createInstance: false,\n    wrapped: false,\n    willDestroy: false,\n    hasSubOwner: false\n  };\n  class TemplateOnlyComponentManager {\n    getCapabilities() {\n      return CAPABILITIES;\n    }\n    getDebugName(_ref55) {\n      var {\n        name\n      } = _ref55;\n      return name;\n    }\n    getSelf() {\n      return _reference.NULL_REFERENCE;\n    }\n    getDestroyable() {\n      return null;\n    }\n  }\n  _exports.TemplateOnlyComponentManager = TemplateOnlyComponentManager;\n  var TEMPLATE_ONLY_COMPONENT_MANAGER = new TemplateOnlyComponentManager(); // This is only exported for types, don't use this class directly\n  _exports.TEMPLATE_ONLY_COMPONENT_MANAGER = TEMPLATE_ONLY_COMPONENT_MANAGER;\n  class TemplateOnlyComponentDefinition {\n    constructor(moduleName, name) {\n      if (moduleName === void 0) {\n        moduleName = '@glimmer/component/template-only';\n      }\n      if (name === void 0) {\n        name = '(unknown template-only component)';\n      }\n      this.moduleName = moduleName;\n      this.name = name;\n    }\n    toString() {\n      return this.moduleName;\n    }\n  }\n  _exports.TemplateOnlyComponent = TemplateOnlyComponentDefinition;\n  (0, _manager5.setInternalComponentManager)(TEMPLATE_ONLY_COMPONENT_MANAGER, TemplateOnlyComponentDefinition.prototype);\n  /**\n    This utility function is used to declare a given component has no backing class. When the rendering engine detects this it\n    is able to perform a number of optimizations. Templates that are associated with `templateOnly()` will be rendered _as is_\n    without adding a wrapping `<div>` (or any of the other element customization behaviors of [@ember/component](/ember/release/classes/Component)).\n    Specifically, this means that the template will be rendered as \"outer HTML\".\n  \n    In general, this method will be used by build time tooling and would not be directly written in an application. However,\n    at times it may be useful to use directly to leverage the \"outer HTML\" semantics mentioned above. For example, if an addon would like\n    to use these semantics for its templates but cannot be certain it will only be consumed by applications that have enabled the\n    `template-only-glimmer-components` optional feature.\n  \n    @example\n  \n    ```js\n    import { templateOnlyComponent } from '@glimmer/runtime';\n  \n    export default templateOnlyComponent();\n    ```\n  \n    @public\n    @method templateOnly\n    @param {String} moduleName the module name that the template only component represents, this will be used for debugging purposes\n    @category EMBER_GLIMMER_SET_COMPONENT_TEMPLATE\n  */\n\n  function templateOnlyComponent(moduleName, name) {\n    return new TemplateOnlyComponentDefinition(moduleName, name);\n  }\n\n  // http://www.w3.org/TR/html/syntax.html#html-integration-point\n  var SVG_INTEGRATION_POINTS = {\n    foreignObject: 1,\n    desc: 1,\n    title: 1\n  }; // http://www.w3.org/TR/html/syntax.html#adjust-svg-attributes\n  // TODO: Adjust SVG attributes\n  // http://www.w3.org/TR/html/syntax.html#parsing-main-inforeign\n  // TODO: Adjust SVG elements\n  // http://www.w3.org/TR/html/syntax.html#parsing-main-inforeign\n\n  var BLACKLIST_TABLE = Object.create(null);\n  class DOMOperations {\n    constructor(document) {\n      this.document = document;\n      this.setupUselessElement();\n    } // split into separate method so that NodeDOMTreeConstruction\n    // can override it.\n\n    setupUselessElement() {\n      this.uselessElement = this.document.createElement('div');\n    }\n    createElement(tag, context) {\n      var isElementInSVGNamespace, isHTMLIntegrationPoint;\n      if (context) {\n        isElementInSVGNamespace = context.namespaceURI === \"http://www.w3.org/2000/svg\"\n        /* SVG */ || tag === 'svg';\n        isHTMLIntegrationPoint = !!SVG_INTEGRATION_POINTS[context.tagName];\n      } else {\n        isElementInSVGNamespace = tag === 'svg';\n        isHTMLIntegrationPoint = false;\n      }\n      if (isElementInSVGNamespace && !isHTMLIntegrationPoint) {\n        // FIXME: This does not properly handle <font> with color, face, or\n        // size attributes, which is also disallowed by the spec. We should fix\n        // this.\n        if (BLACKLIST_TABLE[tag]) {\n          throw new Error(`Cannot create a ${tag} inside an SVG context`);\n        }\n        return this.document.createElementNS(\"http://www.w3.org/2000/svg\"\n        /* SVG */, tag);\n      } else {\n        return this.document.createElement(tag);\n      }\n    }\n    insertBefore(parent, node, reference) {\n      parent.insertBefore(node, reference);\n    }\n    insertHTMLBefore(parent, nextSibling, html) {\n      if (html === '') {\n        var comment = this.createComment('');\n        parent.insertBefore(comment, nextSibling);\n        return new ConcreteBounds(parent, comment, comment);\n      }\n      var prev = nextSibling ? nextSibling.previousSibling : parent.lastChild;\n      var last;\n      if (nextSibling === null) {\n        parent.insertAdjacentHTML(\"beforeend\"\n        /* beforeend */, html);\n        last = parent.lastChild;\n      } else if (nextSibling instanceof HTMLElement) {\n        nextSibling.insertAdjacentHTML('beforebegin', html);\n        last = nextSibling.previousSibling;\n      } else {\n        // Non-element nodes do not support insertAdjacentHTML, so add an\n        // element and call it on that element. Then remove the element.\n        //\n        // This also protects Edge, IE and Firefox w/o the inspector open\n        // from merging adjacent text nodes. See ./compat/text-node-merging-fix.ts\n        var {\n          uselessElement\n        } = this;\n        parent.insertBefore(uselessElement, nextSibling);\n        uselessElement.insertAdjacentHTML(\"beforebegin\"\n        /* beforebegin */, html);\n        last = uselessElement.previousSibling;\n        parent.removeChild(uselessElement);\n      }\n      var first = prev ? prev.nextSibling : parent.firstChild;\n      return new ConcreteBounds(parent, first, last);\n    }\n    createTextNode(text) {\n      return this.document.createTextNode(text);\n    }\n    createComment(data) {\n      return this.document.createComment(data);\n    }\n  }\n  function moveNodesBefore(source, target, nextSibling) {\n    var first = source.firstChild;\n    var last = first;\n    var current = first;\n    while (current) {\n      var next = current.nextSibling;\n      target.insertBefore(current, nextSibling);\n      last = current;\n      current = next;\n    }\n    return new ConcreteBounds(target, first, last);\n  }\n  var SVG_NAMESPACE = \"http://www.w3.org/2000/svg\"\n  /* SVG */; // Patch:    insertAdjacentHTML on SVG Fix\n  // Browsers: Safari, IE, Edge, Firefox ~33-34\n  // Reason:   insertAdjacentHTML does not exist on SVG elements in Safari. It is\n  //           present but throws an exception on IE and Edge. Old versions of\n  //           Firefox create nodes in the incorrect namespace.\n  // Fix:      Since IE and Edge silently fail to create SVG nodes using\n  //           innerHTML, and because Firefox may create nodes in the incorrect\n  //           namespace using innerHTML on SVG elements, an HTML-string wrapping\n  //           approach is used. A pre/post SVG tag is added to the string, then\n  //           that whole string is added to a div. The created nodes are plucked\n  //           out and applied to the target location on DOM.\n\n  function applySVGInnerHTMLFix(document, DOMClass, svgNamespace) {\n    if (!document) return DOMClass;\n    if (!shouldApplyFix(document, svgNamespace)) {\n      return DOMClass;\n    }\n    var div = document.createElement('div');\n    return class DOMChangesWithSVGInnerHTMLFix extends DOMClass {\n      insertHTMLBefore(parent, nextSibling, html) {\n        if (html === '') {\n          return super.insertHTMLBefore(parent, nextSibling, html);\n        }\n        if (parent.namespaceURI !== svgNamespace) {\n          return super.insertHTMLBefore(parent, nextSibling, html);\n        }\n        return fixSVG(parent, div, html, nextSibling);\n      }\n    };\n  }\n  function fixSVG(parent, div, html, reference) {\n    var source; // This is important, because descendants of the <foreignObject> integration\n    // point are parsed in the HTML namespace\n\n    if (parent.tagName.toUpperCase() === 'FOREIGNOBJECT') {\n      // IE, Edge: also do not correctly support using `innerHTML` on SVG\n      // namespaced elements. So here a wrapper is used.\n      var wrappedHtml = '<svg><foreignObject>' + html + '</foreignObject></svg>';\n      (0, _util.clearElement)(div);\n      div.insertAdjacentHTML(\"afterbegin\"\n      /* afterbegin */, wrappedHtml);\n      source = div.firstChild.firstChild;\n    } else {\n      // IE, Edge: also do not correctly support using `innerHTML` on SVG\n      // namespaced elements. So here a wrapper is used.\n      var _wrappedHtml = '<svg>' + html + '</svg>';\n      (0, _util.clearElement)(div);\n      div.insertAdjacentHTML(\"afterbegin\"\n      /* afterbegin */, _wrappedHtml);\n      source = div.firstChild;\n    }\n    return moveNodesBefore(source, parent, reference);\n  }\n  function shouldApplyFix(document, svgNamespace) {\n    var svg = document.createElementNS(svgNamespace, 'svg');\n    try {\n      svg.insertAdjacentHTML(\"beforeend\"\n      /* beforeend */, '<circle></circle>');\n    } catch (e) {// IE, Edge: Will throw, insertAdjacentHTML is unsupported on SVG\n      // Safari: Will throw, insertAdjacentHTML is not present on SVG\n    } finally {\n      // FF: Old versions will create a node in the wrong namespace\n      if (svg.childNodes.length === 1 && svg.firstChild.namespaceURI === SVG_NAMESPACE) {\n        // The test worked as expected, no fix required\n        return false;\n      }\n      return true;\n    }\n  }\n\n  // Patch:    Adjacent text node merging fix\n  // Browsers: IE, Edge, Firefox w/o inspector open\n  // Reason:   These browsers will merge adjacent text nodes. For example given\n  //           <div>Hello</div> with div.insertAdjacentHTML(' world') browsers\n  //           with proper behavior will populate div.childNodes with two items.\n  //           These browsers will populate it with one merged node instead.\n  // Fix:      Add these nodes to a wrapper element, then iterate the childNodes\n  //           of that wrapper and move the nodes to their target location. Note\n  //           that potential SVG bugs will have been handled before this fix.\n  //           Note that this fix must only apply to the previous text node, as\n  //           the base implementation of `insertHTMLBefore` already handles\n  //           following text nodes correctly.\n  function applyTextNodeMergingFix(document, DOMClass) {\n    if (!document) return DOMClass;\n    if (!shouldApplyFix$1(document)) {\n      return DOMClass;\n    }\n    return class DOMChangesWithTextNodeMergingFix extends DOMClass {\n      constructor(document) {\n        super(document);\n        this.uselessComment = document.createComment('');\n      }\n      insertHTMLBefore(parent, nextSibling, html) {\n        if (html === '') {\n          return super.insertHTMLBefore(parent, nextSibling, html);\n        }\n        var didSetUselessComment = false;\n        var nextPrevious = nextSibling ? nextSibling.previousSibling : parent.lastChild;\n        if (nextPrevious && nextPrevious instanceof Text) {\n          didSetUselessComment = true;\n          parent.insertBefore(this.uselessComment, nextSibling);\n        }\n        var bounds = super.insertHTMLBefore(parent, nextSibling, html);\n        if (didSetUselessComment) {\n          parent.removeChild(this.uselessComment);\n        }\n        return bounds;\n      }\n    };\n  }\n  function shouldApplyFix$1(document) {\n    var mergingTextDiv = document.createElement('div');\n    mergingTextDiv.appendChild(document.createTextNode('first'));\n    mergingTextDiv.insertAdjacentHTML(\"beforeend\"\n    /* beforeend */, 'second');\n    if (mergingTextDiv.childNodes.length === 2) {\n      // It worked as expected, no fix required\n      return false;\n    }\n    return true;\n  }\n  ['b', 'big', 'blockquote', 'body', 'br', 'center', 'code', 'dd', 'div', 'dl', 'dt', 'em', 'embed', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'hr', 'i', 'img', 'li', 'listing', 'main', 'meta', 'nobr', 'ol', 'p', 'pre', 'ruby', 's', 'small', 'span', 'strong', 'strike', 'sub', 'sup', 'table', 'tt', 'u', 'ul', 'var'].forEach(tag => BLACKLIST_TABLE[tag] = 1);\n  var WHITESPACE = /[\\t-\\r \\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000\\uFEFF]/;\n  var doc = typeof document === 'undefined' ? null : document;\n  function isWhitespace(string) {\n    return WHITESPACE.test(string);\n  }\n  var DOM;\n  (function (DOM) {\n    class TreeConstruction extends DOMOperations {\n      createElementNS(namespace, tag) {\n        return this.document.createElementNS(namespace, tag);\n      }\n      setAttribute(element, name, value, namespace) {\n        if (namespace === void 0) {\n          namespace = null;\n        }\n        if (namespace) {\n          element.setAttributeNS(namespace, name, value);\n        } else {\n          element.setAttribute(name, value);\n        }\n      }\n    }\n    DOM.TreeConstruction = TreeConstruction;\n    var appliedTreeConstruction = TreeConstruction;\n    appliedTreeConstruction = applyTextNodeMergingFix(doc, appliedTreeConstruction);\n    appliedTreeConstruction = applySVGInnerHTMLFix(doc, appliedTreeConstruction, \"http://www.w3.org/2000/svg\"\n    /* SVG */);\n\n    DOM.DOMTreeConstruction = appliedTreeConstruction;\n  })(DOM || (DOM = {}));\n  class DOMChangesImpl extends DOMOperations {\n    constructor(document) {\n      super(document);\n      this.document = document;\n      this.namespace = null;\n    }\n    setAttribute(element, name, value) {\n      element.setAttribute(name, value);\n    }\n    removeAttribute(element, name) {\n      element.removeAttribute(name);\n    }\n    insertAfter(element, node, reference) {\n      this.insertBefore(element, node, reference.nextSibling);\n    }\n  }\n  _exports.IDOMChanges = DOMChangesImpl;\n  var helper = DOMChangesImpl;\n  helper = applyTextNodeMergingFix(doc, helper);\n  helper = applySVGInnerHTMLFix(doc, helper, \"http://www.w3.org/2000/svg\"\n  /* SVG */);\n\n  var helper$1 = helper;\n  _exports.DOMChanges = helper$1;\n  var DOMTreeConstruction = DOM.DOMTreeConstruction;\n  _exports.DOMTreeConstruction = DOMTreeConstruction;\n  var GUID = 0;\n  class Ref {\n    constructor(value) {\n      this.id = GUID++;\n      this.value = value;\n    }\n    get() {\n      return this.value;\n    }\n    release() {\n      if (true /* DEBUG */ && this.value === null) {\n        throw new Error('BUG: double release?');\n      }\n      this.value = null;\n    }\n    toString() {\n      var label = `Ref ${this.id}`;\n      if (this.value === null) {\n        return `${label} (released)`;\n      } else {\n        try {\n          return `${label}: ${this.value}`;\n        } catch (_a) {\n          return label;\n        }\n      }\n    }\n  }\n  class DebugRenderTreeImpl {\n    constructor() {\n      this.stack = new _util.Stack();\n      this.refs = new WeakMap();\n      this.roots = new Set();\n      this.nodes = new WeakMap();\n    }\n    begin() {\n      this.reset();\n    }\n    create(state, node) {\n      var internalNode = (0, _util.assign)({}, node, {\n        bounds: null,\n        refs: new Set()\n      });\n      this.nodes.set(state, internalNode);\n      this.appendChild(internalNode, state);\n      this.enter(state);\n    }\n    update(state) {\n      this.enter(state);\n    }\n    didRender(state, bounds) {\n      if (true /* DEBUG */ && this.stack.current !== state) {\n        throw new Error(`BUG: expecting ${this.stack.current}, got ${state}`);\n      }\n      this.nodeFor(state).bounds = bounds;\n      this.exit();\n    }\n    willDestroy(state) {\n      this.refs.get(state).release();\n    }\n    commit() {\n      this.reset();\n    }\n    capture() {\n      return this.captureRefs(this.roots);\n    }\n    reset() {\n      if (this.stack.size !== 0) {\n        // We probably encountered an error during the rendering loop. This will\n        // likely trigger undefined behavior and memory leaks as the error left\n        // things in an inconsistent state. It is recommended that the user\n        // refresh the page.\n        // TODO: We could warn here? But this happens all the time in our tests?\n        // Clean up the root reference to prevent errors from happening if we\n        // attempt to capture the render tree (Ember Inspector may do this)\n        var root = this.stack.toArray()[0];\n        var ref = this.refs.get(root);\n        if (ref !== undefined) {\n          this.roots.delete(ref);\n        }\n        while (!this.stack.isEmpty()) {\n          this.stack.pop();\n        }\n      }\n    }\n    enter(state) {\n      this.stack.push(state);\n    }\n    exit() {\n      if (true /* DEBUG */ && this.stack.size === 0) {\n        throw new Error('BUG: unbalanced pop');\n      }\n      this.stack.pop();\n    }\n    nodeFor(state) {\n      return this.nodes.get(state);\n    }\n    appendChild(node, state) {\n      if (true /* DEBUG */ && this.refs.has(state)) {\n        throw new Error('BUG: child already appended');\n      }\n      var parent = this.stack.current;\n      var ref = new Ref(state);\n      this.refs.set(state, ref);\n      if (parent) {\n        var parentNode = this.nodeFor(parent);\n        parentNode.refs.add(ref);\n        node.parent = parentNode;\n      } else {\n        this.roots.add(ref);\n      }\n    }\n    captureRefs(refs) {\n      var captured = [];\n      refs.forEach(ref => {\n        var state = ref.get();\n        if (state) {\n          captured.push(this.captureNode(`render-node:${ref.id}`, state));\n        } else {\n          refs.delete(ref);\n        }\n      });\n      return captured;\n    }\n    captureNode(id, state) {\n      var node = this.nodeFor(state);\n      var {\n        type,\n        name,\n        args,\n        instance,\n        refs\n      } = node;\n      var template = this.captureTemplate(node);\n      var bounds = this.captureBounds(node);\n      var children = this.captureRefs(refs);\n      return {\n        id,\n        type,\n        name,\n        args: reifyArgs(args),\n        instance,\n        template,\n        bounds,\n        children\n      };\n    }\n    captureTemplate(_ref56) {\n      var {\n        template\n      } = _ref56;\n      return template || null;\n    }\n    captureBounds(node) {\n      var bounds = node.bounds;\n      var parentElement = bounds.parentElement();\n      var firstNode = bounds.firstNode();\n      var lastNode = bounds.lastNode();\n      return {\n        parentElement,\n        firstNode,\n        lastNode\n      };\n    }\n  }\n  var _a$1;\n  var TRANSACTION = (0, _util.symbol)('TRANSACTION');\n  class TransactionImpl {\n    constructor() {\n      this.scheduledInstallModifiers = [];\n      this.scheduledUpdateModifiers = [];\n      this.createdComponents = [];\n      this.updatedComponents = [];\n    }\n    didCreate(component) {\n      this.createdComponents.push(component);\n    }\n    didUpdate(component) {\n      this.updatedComponents.push(component);\n    }\n    scheduleInstallModifier(modifier) {\n      this.scheduledInstallModifiers.push(modifier);\n    }\n    scheduleUpdateModifier(modifier) {\n      this.scheduledUpdateModifiers.push(modifier);\n    }\n    commit() {\n      var {\n        createdComponents,\n        updatedComponents\n      } = this;\n      for (var i = 0; i < createdComponents.length; i++) {\n        var {\n          manager: _manager3,\n          state: _state2\n        } = createdComponents[i];\n        _manager3.didCreate(_state2);\n      }\n      for (var _i3 = 0; _i3 < updatedComponents.length; _i3++) {\n        var {\n          manager: _manager4,\n          state: _state3\n        } = updatedComponents[_i3];\n        _manager4.didUpdate(_state3);\n      }\n      var {\n        scheduledInstallModifiers,\n        scheduledUpdateModifiers\n      } = this; // Prevent a transpilation issue we guard against in Ember, the\n      // throw-if-closure-required issue\n\n      var manager, state;\n      for (var _i4 = 0; _i4 < scheduledInstallModifiers.length; _i4++) {\n        var modifier = scheduledInstallModifiers[_i4];\n        manager = modifier.manager;\n        state = modifier.state;\n        var modifierTag = manager.getTag(state);\n        if (modifierTag !== null) {\n          var tag = (0, _validator.track)(\n          // eslint-disable-next-line no-loop-func\n          () => manager.install(state), true /* DEBUG */ && `- While rendering:\\n  (instance of a \\`${modifier.definition.resolvedName || manager.getDebugName(modifier.definition.state)}\\` modifier)`);\n          (0, _validator.updateTag)(modifierTag, tag);\n        } else {\n          manager.install(state);\n        }\n      }\n      for (var _i5 = 0; _i5 < scheduledUpdateModifiers.length; _i5++) {\n        var _modifier = scheduledUpdateModifiers[_i5];\n        manager = _modifier.manager;\n        state = _modifier.state;\n        var _modifierTag = manager.getTag(state);\n        if (_modifierTag !== null) {\n          var _tag = (0, _validator.track)(\n          // eslint-disable-next-line no-loop-func\n          () => manager.update(state), true /* DEBUG */ && `- While rendering:\\n  (instance of a \\`${_modifier.definition.resolvedName || manager.getDebugName(_modifier.definition.state)}\\` modifier)`);\n          (0, _validator.updateTag)(_modifierTag, _tag);\n        } else {\n          manager.update(state);\n        }\n      }\n    }\n  }\n  class EnvironmentImpl {\n    constructor(options, delegate) {\n      this.delegate = delegate;\n      this[_a$1] = null; // Delegate methods and values\n\n      this.isInteractive = this.delegate.isInteractive;\n      this.debugRenderTree = this.delegate.enableDebugTooling ? new DebugRenderTreeImpl() : undefined;\n      if (options.appendOperations) {\n        this.appendOperations = options.appendOperations;\n        this.updateOperations = options.updateOperations;\n      } else if (options.document) {\n        this.appendOperations = new DOMTreeConstruction(options.document);\n        this.updateOperations = new DOMChangesImpl(options.document);\n      } else if (true /* DEBUG */) {\n        throw new Error('you must pass document or appendOperations to a new runtime');\n      }\n    }\n    getAppendOperations() {\n      return this.appendOperations;\n    }\n    getDOM() {\n      return this.updateOperations;\n    }\n    begin() {\n      var _b;\n      (_b = this.debugRenderTree) === null || _b === void 0 ? void 0 : _b.begin();\n      this[TRANSACTION] = new TransactionImpl();\n    }\n    get transaction() {\n      return this[TRANSACTION];\n    }\n    didCreate(component) {\n      this.transaction.didCreate(component);\n    }\n    didUpdate(component) {\n      this.transaction.didUpdate(component);\n    }\n    scheduleInstallModifier(modifier) {\n      if (this.isInteractive) {\n        this.transaction.scheduleInstallModifier(modifier);\n      }\n    }\n    scheduleUpdateModifier(modifier) {\n      if (this.isInteractive) {\n        this.transaction.scheduleUpdateModifier(modifier);\n      }\n    }\n    commit() {\n      var _b;\n      var transaction = this.transaction;\n      this[TRANSACTION] = null;\n      transaction.commit();\n      (_b = this.debugRenderTree) === null || _b === void 0 ? void 0 : _b.commit();\n      this.delegate.onTransactionCommit();\n    }\n  }\n  _exports.EnvironmentImpl = EnvironmentImpl;\n  _a$1 = TRANSACTION;\n  function runtimeContext(options, delegate, artifacts, resolver) {\n    return {\n      env: new EnvironmentImpl(options, delegate),\n      program: new _program.RuntimeProgramImpl(artifacts.constants, artifacts.heap),\n      resolver: resolver\n    };\n  }\n  function inTransaction(env, cb) {\n    if (!env[TRANSACTION]) {\n      env.begin();\n      try {\n        cb();\n      } finally {\n        env.commit();\n      }\n    } else {\n      cb();\n    }\n  }\n  function initializeRegistersWithSP(sp) {\n    return [0, -1, sp, 0];\n  }\n  class LowLevelVM {\n    constructor(stack, heap, program, externs, registers) {\n      this.stack = stack;\n      this.heap = heap;\n      this.program = program;\n      this.externs = externs;\n      this.registers = registers;\n      this.currentOpSize = 0;\n    }\n    fetchRegister(register) {\n      return this.registers[register];\n    }\n    loadRegister(register, value) {\n      this.registers[register] = value;\n    }\n    setPc(pc) {\n      this.registers[_vm2.$pc] = pc;\n    } // Start a new frame and save $ra and $fp on the stack\n\n    pushFrame() {\n      this.stack.push(this.registers[_vm2.$ra]);\n      this.stack.push(this.registers[_vm2.$fp]);\n      this.registers[_vm2.$fp] = this.registers[_vm2.$sp] - 1;\n    } // Restore $ra, $sp and $fp\n\n    popFrame() {\n      this.registers[_vm2.$sp] = this.registers[_vm2.$fp] - 1;\n      this.registers[_vm2.$ra] = this.stack.get(0);\n      this.registers[_vm2.$fp] = this.stack.get(1);\n    }\n    pushSmallFrame() {\n      this.stack.push(this.registers[_vm2.$ra]);\n    }\n    popSmallFrame() {\n      this.registers[_vm2.$ra] = this.stack.pop();\n    } // Jump to an address in `program`\n\n    goto(offset) {\n      this.setPc(this.target(offset));\n    }\n    target(offset) {\n      return this.registers[_vm2.$pc] + offset - this.currentOpSize;\n    } // Save $pc into $ra, then jump to a new address in `program` (jal in MIPS)\n\n    call(handle) {\n      this.registers[_vm2.$ra] = this.registers[_vm2.$pc];\n      this.setPc(this.heap.getaddr(handle));\n    } // Put a specific `program` address in $ra\n\n    returnTo(offset) {\n      this.registers[_vm2.$ra] = this.target(offset);\n    } // Return to the `program` address stored in $ra\n\n    return() {\n      this.setPc(this.registers[_vm2.$ra]);\n    }\n    nextStatement() {\n      var {\n        registers,\n        program\n      } = this;\n      var pc = registers[_vm2.$pc];\n      if (pc === -1) {\n        return null;\n      } // We have to save off the current operations size so that\n      // when we do a jump we can calculate the correct offset\n      // to where we are going. We can't simply ask for the size\n      // in a jump because we have have already incremented the\n      // program counter to the next instruction prior to executing.\n\n      var opcode = program.opcode(pc);\n      var operationSize = this.currentOpSize = opcode.size;\n      this.registers[_vm2.$pc] += operationSize;\n      return opcode;\n    }\n    evaluateOuter(opcode, vm) {\n      {\n        this.evaluateInner(opcode, vm);\n      }\n    }\n    evaluateInner(opcode, vm) {\n      if (opcode.isMachine) {\n        this.evaluateMachine(opcode);\n      } else {\n        this.evaluateSyscall(opcode, vm);\n      }\n    }\n    evaluateMachine(opcode) {\n      switch (opcode.type) {\n        case 0\n        /* PushFrame */:\n          return this.pushFrame();\n        case 1\n        /* PopFrame */:\n          return this.popFrame();\n        case 3\n        /* InvokeStatic */:\n          return this.call(opcode.op1);\n        case 2\n        /* InvokeVirtual */:\n          return this.call(this.stack.pop());\n        case 4\n        /* Jump */:\n          return this.goto(opcode.op1);\n        case 5\n        /* Return */:\n          return this.return();\n        case 6\n        /* ReturnTo */:\n          return this.returnTo(opcode.op1);\n      }\n    }\n    evaluateSyscall(opcode, vm) {\n      APPEND_OPCODES.evaluate(vm, opcode, opcode.type);\n    }\n  }\n  class UpdatingVMImpl {\n    constructor(env, _ref57) {\n      var {\n        alwaysRevalidate = false\n      } = _ref57;\n      this.frameStack = new _util.Stack();\n      this.env = env;\n      this.dom = env.getDOM();\n      this.alwaysRevalidate = alwaysRevalidate;\n    }\n    execute(opcodes, handler) {\n      if (true /* DEBUG */) {\n        var hasErrored = true;\n        try {\n          (0, _validator.runInTrackingTransaction)(() => this._execute(opcodes, handler), '- While rendering:'); // using a boolean here to avoid breaking ergonomics of \"pause on uncaught exceptions\"\n          // which would happen with a `catch` + `throw`\n\n          hasErrored = false;\n        } finally {\n          if (hasErrored) {\n            // eslint-disable-next-line no-console\n            console.error(`\\n\\nError occurred:\\n\\n${(0, _validator.resetTracking)()}\\n\\n`);\n          }\n        }\n      } else {\n        this._execute(opcodes, handler);\n      }\n    }\n    _execute(opcodes, handler) {\n      var {\n        frameStack\n      } = this;\n      this.try(opcodes, handler);\n      while (true) {\n        if (frameStack.isEmpty()) break;\n        var opcode = this.frame.nextStatement();\n        if (opcode === undefined) {\n          frameStack.pop();\n          continue;\n        }\n        opcode.evaluate(this);\n      }\n    }\n    get frame() {\n      return this.frameStack.current;\n    }\n    goto(index) {\n      this.frame.goto(index);\n    }\n    try(ops, handler) {\n      this.frameStack.push(new UpdatingVMFrame(ops, handler));\n    }\n    throw() {\n      this.frame.handleException();\n      this.frameStack.pop();\n    }\n  }\n  _exports.UpdatingVM = UpdatingVMImpl;\n  class ResumableVMStateImpl {\n    constructor(state, resumeCallback) {\n      this.state = state;\n      this.resumeCallback = resumeCallback;\n    }\n    resume(runtime, builder) {\n      return this.resumeCallback(runtime, this.state, builder);\n    }\n  }\n  class BlockOpcode {\n    constructor(state, runtime, bounds, children) {\n      this.state = state;\n      this.runtime = runtime;\n      this.children = children;\n      this.bounds = bounds;\n    }\n    parentElement() {\n      return this.bounds.parentElement();\n    }\n    firstNode() {\n      return this.bounds.firstNode();\n    }\n    lastNode() {\n      return this.bounds.lastNode();\n    }\n    evaluate(vm) {\n      vm.try(this.children, null);\n    }\n  }\n  class TryOpcode extends BlockOpcode {\n    constructor() {\n      super(...arguments);\n      this.type = 'try';\n    }\n    evaluate(vm) {\n      vm.try(this.children, this);\n    }\n    handleException() {\n      var {\n        state,\n        bounds,\n        runtime\n      } = this;\n      (0, _destroyable2.destroyChildren)(this);\n      var elementStack = NewElementBuilder.resume(runtime.env, bounds);\n      var vm = state.resume(runtime, elementStack);\n      var updating = [];\n      var children = this.children = [];\n      var result = vm.execute(vm => {\n        vm.pushUpdating(updating);\n        vm.updateWith(this);\n        vm.pushUpdating(children);\n      });\n      (0, _destroyable2.associateDestroyableChild)(this, result.drop);\n    }\n  }\n  class ListItemOpcode extends TryOpcode {\n    constructor(state, runtime, bounds, key, memo, value) {\n      super(state, runtime, bounds, []);\n      this.key = key;\n      this.memo = memo;\n      this.value = value;\n      this.retained = false;\n      this.index = -1;\n    }\n    updateReferences(item) {\n      this.retained = true;\n      (0, _reference.updateRef)(this.value, item.value);\n      (0, _reference.updateRef)(this.memo, item.memo);\n    }\n    shouldRemove() {\n      return !this.retained;\n    }\n    reset() {\n      this.retained = false;\n    }\n  }\n  class ListBlockOpcode extends BlockOpcode {\n    constructor(state, runtime, bounds, children, iterableRef) {\n      super(state, runtime, bounds, children);\n      this.iterableRef = iterableRef;\n      this.type = 'list-block';\n      this.opcodeMap = new Map();\n      this.marker = null;\n      this.lastIterator = (0, _reference.valueForRef)(iterableRef);\n    }\n    initializeChild(opcode) {\n      opcode.index = this.children.length - 1;\n      this.opcodeMap.set(opcode.key, opcode);\n    }\n    evaluate(vm) {\n      var iterator = (0, _reference.valueForRef)(this.iterableRef);\n      if (this.lastIterator !== iterator) {\n        var {\n          bounds\n        } = this;\n        var {\n          dom\n        } = vm;\n        var marker = this.marker = dom.createComment('');\n        dom.insertAfter(bounds.parentElement(), marker, bounds.lastNode());\n        this.sync(iterator);\n        this.parentElement().removeChild(marker);\n        this.marker = null;\n        this.lastIterator = iterator;\n      } // Run now-updated updating opcodes\n\n      super.evaluate(vm);\n    }\n    sync(iterator) {\n      var {\n        opcodeMap: itemMap,\n        children\n      } = this;\n      var currentOpcodeIndex = 0;\n      var seenIndex = 0;\n      this.children = this.bounds.boundList = [];\n      while (true) {\n        var item = iterator.next();\n        if (item === null) break;\n        var opcode = children[currentOpcodeIndex];\n        var {\n          key\n        } = item; // Items that have already been found and moved will already be retained,\n        // we can continue until we find the next unretained item\n\n        while (opcode !== undefined && opcode.retained === true) {\n          opcode = children[++currentOpcodeIndex];\n        }\n        if (opcode !== undefined && opcode.key === key) {\n          this.retainItem(opcode, item);\n          currentOpcodeIndex++;\n        } else if (itemMap.has(key)) {\n          var itemOpcode = itemMap.get(key); // The item opcode was seen already, so we should move it.\n\n          if (itemOpcode.index < seenIndex) {\n            this.moveItem(itemOpcode, item, opcode);\n          } else {\n            // Update the seen index, we are going to be moving this item around\n            // so any other items that come before it will likely need to move as\n            // well.\n            seenIndex = itemOpcode.index;\n            var seenUnretained = false; // iterate through all of the opcodes between the current position and\n            // the position of the item's opcode, and determine if they are all\n            // retained.\n\n            for (var i = currentOpcodeIndex + 1; i < seenIndex; i++) {\n              if (children[i].retained === false) {\n                seenUnretained = true;\n                break;\n              }\n            } // If we have seen only retained opcodes between this and the matching\n            // opcode, it means that all the opcodes in between have been moved\n            // already, and we can safely retain this item's opcode.\n\n            if (seenUnretained === false) {\n              this.retainItem(itemOpcode, item);\n              currentOpcodeIndex = seenIndex + 1;\n            } else {\n              this.moveItem(itemOpcode, item, opcode);\n              currentOpcodeIndex++;\n            }\n          }\n        } else {\n          this.insertItem(item, opcode);\n        }\n      }\n      for (var _i6 = 0; _i6 < children.length; _i6++) {\n        var _opcode = children[_i6];\n        if (_opcode.retained === false) {\n          this.deleteItem(_opcode);\n        } else {\n          _opcode.reset();\n        }\n      }\n    }\n    retainItem(opcode, item) {\n      var {\n        children\n      } = this;\n      (0, _reference.updateRef)(opcode.memo, item.memo);\n      (0, _reference.updateRef)(opcode.value, item.value);\n      opcode.retained = true;\n      opcode.index = children.length;\n      children.push(opcode);\n    }\n    insertItem(item, before) {\n      var {\n        opcodeMap,\n        bounds,\n        state,\n        runtime,\n        children\n      } = this;\n      var {\n        key\n      } = item;\n      var nextSibling = before === undefined ? this.marker : before.firstNode();\n      var elementStack = NewElementBuilder.forInitialRender(runtime.env, {\n        element: bounds.parentElement(),\n        nextSibling\n      });\n      var vm = state.resume(runtime, elementStack);\n      vm.execute(vm => {\n        vm.pushUpdating();\n        var opcode = vm.enterItem(item);\n        opcode.index = children.length;\n        children.push(opcode);\n        opcodeMap.set(key, opcode);\n        (0, _destroyable2.associateDestroyableChild)(this, opcode);\n      });\n    }\n    moveItem(opcode, item, before) {\n      var {\n        children\n      } = this;\n      (0, _reference.updateRef)(opcode.memo, item.memo);\n      (0, _reference.updateRef)(opcode.value, item.value);\n      opcode.retained = true;\n      var currentSibling, nextSibling;\n      if (before === undefined) {\n        move(opcode, this.marker);\n      } else {\n        currentSibling = opcode.lastNode().nextSibling;\n        nextSibling = before.firstNode(); // Items are moved throughout the algorithm, so there are cases where the\n        // the items already happen to be siblings (e.g. an item in between was\n        // moved before this move happened). Check to see if they are siblings\n        // first before doing the move.\n\n        if (currentSibling !== nextSibling) {\n          move(opcode, nextSibling);\n        }\n      }\n      opcode.index = children.length;\n      children.push(opcode);\n    }\n    deleteItem(opcode) {\n      (0, _destroyable2.destroy)(opcode);\n      clear(opcode);\n      this.opcodeMap.delete(opcode.key);\n    }\n  }\n  class UpdatingVMFrame {\n    constructor(ops, exceptionHandler) {\n      this.ops = ops;\n      this.exceptionHandler = exceptionHandler;\n      this.current = 0;\n    }\n    goto(index) {\n      this.current = index;\n    }\n    nextStatement() {\n      return this.ops[this.current++];\n    }\n    handleException() {\n      if (this.exceptionHandler) {\n        this.exceptionHandler.handleException();\n      }\n    }\n  }\n  class RenderResultImpl {\n    constructor(env, updating, bounds, drop) {\n      this.env = env;\n      this.updating = updating;\n      this.bounds = bounds;\n      this.drop = drop;\n      (0, _destroyable2.associateDestroyableChild)(this, drop);\n      (0, _destroyable2.registerDestructor)(this, () => clear(this.bounds));\n    }\n    rerender(_temp) {\n      var {\n        alwaysRevalidate = false\n      } = _temp === void 0 ? {\n        alwaysRevalidate: false\n      } : _temp;\n      var {\n        env,\n        updating\n      } = this;\n      var vm = new UpdatingVMImpl(env, {\n        alwaysRevalidate\n      });\n      vm.execute(updating, this);\n    }\n    parentElement() {\n      return this.bounds.parentElement();\n    }\n    firstNode() {\n      return this.bounds.firstNode();\n    }\n    lastNode() {\n      return this.bounds.lastNode();\n    }\n    handleException() {\n      throw 'this should never happen';\n    }\n  }\n  class EvaluationStackImpl {\n    // fp -> sp\n    constructor(stack, registers) {\n      if (stack === void 0) {\n        stack = [];\n      }\n      this.stack = stack;\n      this[REGISTERS] = registers;\n    }\n    static restore(snapshot) {\n      return new this(snapshot.slice(), initializeRegistersWithSP(snapshot.length - 1));\n    }\n    push(value) {\n      this.stack[++this[REGISTERS][_vm2.$sp]] = value;\n    }\n    dup(position) {\n      if (position === void 0) {\n        position = this[REGISTERS][_vm2.$sp];\n      }\n      this.stack[++this[REGISTERS][_vm2.$sp]] = this.stack[position];\n    }\n    copy(from, to) {\n      this.stack[to] = this.stack[from];\n    }\n    pop(n) {\n      if (n === void 0) {\n        n = 1;\n      }\n      var top = this.stack[this[REGISTERS][_vm2.$sp]];\n      this[REGISTERS][_vm2.$sp] -= n;\n      return top;\n    }\n    peek(offset) {\n      if (offset === void 0) {\n        offset = 0;\n      }\n      return this.stack[this[REGISTERS][_vm2.$sp] - offset];\n    }\n    get(offset, base) {\n      if (base === void 0) {\n        base = this[REGISTERS][_vm2.$fp];\n      }\n      return this.stack[base + offset];\n    }\n    set(value, offset, base) {\n      if (base === void 0) {\n        base = this[REGISTERS][_vm2.$fp];\n      }\n      this.stack[base + offset] = value;\n    }\n    slice(start, end) {\n      return this.stack.slice(start, end);\n    }\n    capture(items) {\n      var end = this[REGISTERS][_vm2.$sp] + 1;\n      var start = end - items;\n      return this.stack.slice(start, end);\n    }\n    reset() {\n      this.stack.length = 0;\n    }\n    toArray() {\n      return this.stack.slice(this[REGISTERS][_vm2.$fp], this[REGISTERS][_vm2.$sp] + 1);\n    }\n  }\n  var _a$2, _b;\n  class Stacks {\n    constructor() {\n      this.scope = new _util.Stack();\n      this.dynamicScope = new _util.Stack();\n      this.updating = new _util.Stack();\n      this.cache = new _util.Stack();\n      this.list = new _util.Stack();\n    }\n  }\n  class VM {\n    /**\n     * End of migrated.\n     */\n    constructor(runtime, _ref58, elementStack, context) {\n      var {\n        pc,\n        scope,\n        dynamicScope,\n        stack\n      } = _ref58;\n      this.runtime = runtime;\n      this.elementStack = elementStack;\n      this.context = context;\n      this[_a$2] = new Stacks();\n      this[_b] = new _util.Stack();\n      this.s0 = null;\n      this.s1 = null;\n      this.t0 = null;\n      this.t1 = null;\n      this.v0 = null;\n      this.resume = initVM(this.context);\n      if (true /* DEBUG */) {\n        (0, _globalContext.assertGlobalContextWasSet)();\n      }\n      var evalStack = EvaluationStackImpl.restore(stack);\n      evalStack[REGISTERS][_vm2.$pc] = pc;\n      evalStack[REGISTERS][_vm2.$sp] = stack.length - 1;\n      evalStack[REGISTERS][_vm2.$fp] = -1;\n      this[HEAP] = this.program.heap;\n      this[CONSTANTS] = this.program.constants;\n      this.elementStack = elementStack;\n      this[STACKS].scope.push(scope);\n      this[STACKS].dynamicScope.push(dynamicScope);\n      this[ARGS] = new VMArgumentsImpl();\n      this[INNER_VM] = new LowLevelVM(evalStack, this[HEAP], runtime.program, {\n        debugBefore: opcode => {\n          return APPEND_OPCODES.debugBefore(this, opcode);\n        },\n        debugAfter: state => {\n          APPEND_OPCODES.debugAfter(this, state);\n        }\n      }, evalStack[REGISTERS]);\n      this.destructor = {};\n      this[DESTROYABLE_STACK].push(this.destructor);\n    }\n    get stack() {\n      return this[INNER_VM].stack;\n    }\n    /* Registers */\n\n    get pc() {\n      return this[INNER_VM].fetchRegister(_vm2.$pc);\n    } // Fetch a value from a register onto the stack\n\n    fetch(register) {\n      var value = this.fetchValue(register);\n      this.stack.push(value);\n    } // Load a value from the stack into a register\n\n    load(register) {\n      var value = this.stack.pop();\n      this.loadValue(register, value);\n    }\n    fetchValue(register) {\n      if ((0, _vm2.isLowLevelRegister)(register)) {\n        return this[INNER_VM].fetchRegister(register);\n      }\n      switch (register) {\n        case _vm2.$s0:\n          return this.s0;\n        case _vm2.$s1:\n          return this.s1;\n        case _vm2.$t0:\n          return this.t0;\n        case _vm2.$t1:\n          return this.t1;\n        case _vm2.$v0:\n          return this.v0;\n      }\n    } // Load a value into a register\n\n    loadValue(register, value) {\n      if ((0, _vm2.isLowLevelRegister)(register)) {\n        this[INNER_VM].loadRegister(register, value);\n      }\n      switch (register) {\n        case _vm2.$s0:\n          this.s0 = value;\n          break;\n        case _vm2.$s1:\n          this.s1 = value;\n          break;\n        case _vm2.$t0:\n          this.t0 = value;\n          break;\n        case _vm2.$t1:\n          this.t1 = value;\n          break;\n        case _vm2.$v0:\n          this.v0 = value;\n          break;\n      }\n    }\n    /**\n     * Migrated to Inner\n     */\n    // Start a new frame and save $ra and $fp on the stack\n\n    pushFrame() {\n      this[INNER_VM].pushFrame();\n    } // Restore $ra, $sp and $fp\n\n    popFrame() {\n      this[INNER_VM].popFrame();\n    } // Jump to an address in `program`\n\n    goto(offset) {\n      this[INNER_VM].goto(offset);\n    } // Save $pc into $ra, then jump to a new address in `program` (jal in MIPS)\n\n    call(handle) {\n      this[INNER_VM].call(handle);\n    } // Put a specific `program` address in $ra\n\n    returnTo(offset) {\n      this[INNER_VM].returnTo(offset);\n    } // Return to the `program` address stored in $ra\n\n    return() {\n      this[INNER_VM].return();\n    }\n    static initial(runtime, context, _ref59) {\n      var {\n        handle,\n        self,\n        dynamicScope,\n        treeBuilder,\n        numSymbols,\n        owner\n      } = _ref59;\n      var scope = PartialScopeImpl.root(self, numSymbols, owner);\n      var state = vmState(runtime.program.heap.getaddr(handle), scope, dynamicScope);\n      var vm = initVM(context)(runtime, state, treeBuilder);\n      vm.pushUpdating();\n      return vm;\n    }\n    static empty(runtime, _ref60, context) {\n      var {\n        handle,\n        treeBuilder,\n        dynamicScope,\n        owner\n      } = _ref60;\n      var vm = initVM(context)(runtime, vmState(runtime.program.heap.getaddr(handle), PartialScopeImpl.root(_reference.UNDEFINED_REFERENCE, 0, owner), dynamicScope), treeBuilder);\n      vm.pushUpdating();\n      return vm;\n    }\n    compile(block) {\n      var handle = (0, _util.unwrapHandle)(block.compile(this.context));\n      return handle;\n    }\n    get program() {\n      return this.runtime.program;\n    }\n    get env() {\n      return this.runtime.env;\n    }\n    captureState(args, pc) {\n      if (pc === void 0) {\n        pc = this[INNER_VM].fetchRegister(_vm2.$pc);\n      }\n      return {\n        pc,\n        scope: this.scope(),\n        dynamicScope: this.dynamicScope(),\n        stack: this.stack.capture(args)\n      };\n    }\n    capture(args, pc) {\n      if (pc === void 0) {\n        pc = this[INNER_VM].fetchRegister(_vm2.$pc);\n      }\n      return new ResumableVMStateImpl(this.captureState(args, pc), this.resume);\n    }\n    beginCacheGroup(name) {\n      var opcodes = this.updating();\n      var guard = new JumpIfNotModifiedOpcode();\n      opcodes.push(guard);\n      opcodes.push(new BeginTrackFrameOpcode(name));\n      this[STACKS].cache.push(guard);\n      (0, _validator.beginTrackFrame)(name);\n    }\n    commitCacheGroup() {\n      var opcodes = this.updating();\n      var guard = this[STACKS].cache.pop();\n      var tag = (0, _validator.endTrackFrame)();\n      opcodes.push(new EndTrackFrameOpcode(guard));\n      guard.finalize(tag, opcodes.length);\n    }\n    enter(args) {\n      var updating = [];\n      var state = this.capture(args);\n      var block = this.elements().pushUpdatableBlock();\n      var tryOpcode = new TryOpcode(state, this.runtime, block, updating);\n      this.didEnter(tryOpcode);\n    }\n    enterItem(_ref61) {\n      var {\n        key,\n        value,\n        memo\n      } = _ref61;\n      var {\n        stack\n      } = this;\n      var valueRef = (0, _reference.createIteratorItemRef)(value);\n      var memoRef = (0, _reference.createIteratorItemRef)(memo);\n      stack.push(valueRef);\n      stack.push(memoRef);\n      var state = this.capture(2);\n      var block = this.elements().pushUpdatableBlock();\n      var opcode = new ListItemOpcode(state, this.runtime, block, key, memoRef, valueRef);\n      this.didEnter(opcode);\n      return opcode;\n    }\n    registerItem(opcode) {\n      this.listBlock().initializeChild(opcode);\n    }\n    enterList(iterableRef, offset) {\n      var updating = [];\n      var addr = this[INNER_VM].target(offset);\n      var state = this.capture(0, addr);\n      var list = this.elements().pushBlockList(updating);\n      var opcode = new ListBlockOpcode(state, this.runtime, list, updating, iterableRef);\n      this[STACKS].list.push(opcode);\n      this.didEnter(opcode);\n    }\n    didEnter(opcode) {\n      this.associateDestroyable(opcode);\n      this[DESTROYABLE_STACK].push(opcode);\n      this.updateWith(opcode);\n      this.pushUpdating(opcode.children);\n    }\n    exit() {\n      this[DESTROYABLE_STACK].pop();\n      this.elements().popBlock();\n      this.popUpdating();\n    }\n    exitList() {\n      this.exit();\n      this[STACKS].list.pop();\n    }\n    pushUpdating(list) {\n      if (list === void 0) {\n        list = [];\n      }\n      this[STACKS].updating.push(list);\n    }\n    popUpdating() {\n      return this[STACKS].updating.pop();\n    }\n    updateWith(opcode) {\n      this.updating().push(opcode);\n    }\n    listBlock() {\n      return this[STACKS].list.current;\n    }\n    associateDestroyable(child) {\n      var parent = this[DESTROYABLE_STACK].current;\n      (0, _destroyable2.associateDestroyableChild)(parent, child);\n    }\n    tryUpdating() {\n      return this[STACKS].updating.current;\n    }\n    updating() {\n      return this[STACKS].updating.current;\n    }\n    elements() {\n      return this.elementStack;\n    }\n    scope() {\n      return this[STACKS].scope.current;\n    }\n    dynamicScope() {\n      return this[STACKS].dynamicScope.current;\n    }\n    pushChildScope() {\n      this[STACKS].scope.push(this.scope().child());\n    }\n    pushDynamicScope() {\n      var child = this.dynamicScope().child();\n      this[STACKS].dynamicScope.push(child);\n      return child;\n    }\n    pushRootScope(size, owner) {\n      var scope = PartialScopeImpl.sized(size, owner);\n      this[STACKS].scope.push(scope);\n      return scope;\n    }\n    pushScope(scope) {\n      this[STACKS].scope.push(scope);\n    }\n    popScope() {\n      this[STACKS].scope.pop();\n    }\n    popDynamicScope() {\n      this[STACKS].dynamicScope.pop();\n    } /// SCOPE HELPERS\n\n    getOwner() {\n      return this.scope().owner;\n    }\n    getSelf() {\n      return this.scope().getSelf();\n    }\n    referenceForSymbol(symbol$$1) {\n      return this.scope().getSymbol(symbol$$1);\n    } /// EXECUTION\n\n    execute(initialize) {\n      if (true /* DEBUG */) {\n        var hasErrored = true;\n        try {\n          var value = this._execute(initialize); // using a boolean here to avoid breaking ergonomics of \"pause on uncaught exceptions\"\n          // which would happen with a `catch` + `throw`\n\n          hasErrored = false;\n          return value;\n        } finally {\n          if (hasErrored) {\n            // If any existing blocks are open, due to an error or something like\n            // that, we need to close them all and clean things up properly.\n            var elements = this.elements();\n            while (elements.hasBlocks) {\n              elements.popBlock();\n            } // eslint-disable-next-line no-console\n\n            console.error(`\\n\\nError occurred:\\n\\n${(0, _validator.resetTracking)()}\\n\\n`);\n          }\n        }\n      } else {\n        return this._execute(initialize);\n      }\n    }\n    _execute(initialize) {\n      if (initialize) initialize(this);\n      var result;\n      while (true) {\n        result = this.next();\n        if (result.done) break;\n      }\n      return result.value;\n    }\n    next() {\n      var {\n        env,\n        elementStack\n      } = this;\n      var opcode = this[INNER_VM].nextStatement();\n      var result;\n      if (opcode !== null) {\n        this[INNER_VM].evaluateOuter(opcode, this);\n        result = {\n          done: false,\n          value: null\n        };\n      } else {\n        // Unload the stack\n        this.stack.reset();\n        result = {\n          done: true,\n          value: new RenderResultImpl(env, this.popUpdating(), elementStack.popBlock(), this.destructor)\n        };\n      }\n      return result;\n    }\n    bindDynamicScope(names) {\n      var scope = this.dynamicScope();\n      for (var i = names.length - 1; i >= 0; i--) {\n        var name = names[i];\n        scope.set(name, this.stack.pop());\n      }\n    }\n  }\n  _exports.LowLevelVM = VM;\n  _a$2 = STACKS, _b = DESTROYABLE_STACK;\n  function vmState(pc, scope, dynamicScope) {\n    return {\n      pc,\n      scope,\n      dynamicScope,\n      stack: []\n    };\n  }\n  function initVM(context) {\n    return (runtime, state, builder) => new VM(runtime, state, builder, context);\n  }\n  class TemplateIteratorImpl {\n    constructor(vm) {\n      this.vm = vm;\n    }\n    next() {\n      return this.vm.next();\n    }\n    sync() {\n      if (true /* DEBUG */) {\n        return (0, _validator.runInTrackingTransaction)(() => this.vm.execute(), '- While rendering:');\n      } else {\n        return this.vm.execute();\n      }\n    }\n  }\n  function renderSync(env, iterator) {\n    var result;\n    inTransaction(env, () => result = iterator.sync());\n    return result;\n  }\n  function renderMain(runtime, context, owner, self, treeBuilder, layout, dynamicScope) {\n    if (dynamicScope === void 0) {\n      dynamicScope = new DynamicScopeImpl();\n    }\n    var handle = (0, _util.unwrapHandle)(layout.compile(context));\n    var numSymbols = layout.symbolTable.symbols.length;\n    var vm = VM.initial(runtime, context, {\n      self,\n      dynamicScope,\n      treeBuilder,\n      handle,\n      numSymbols,\n      owner\n    });\n    return new TemplateIteratorImpl(vm);\n  }\n  function renderInvocation(vm, context, owner, definition, args) {\n    // Get a list of tuples of argument names and references, like\n    // [['title', reference], ['name', reference]]\n    var argList = Object.keys(args).map(key => [key, args[key]]);\n    var blockNames = ['main', 'else', 'attrs']; // Prefix argument names with `@` symbol\n\n    var argNames = argList.map(_ref62 => {\n      var [name] = _ref62;\n      return `@${name}`;\n    });\n    var reified = vm[CONSTANTS].component(definition, owner);\n    vm.pushFrame(); // Push blocks on to the stack, three stack values per block\n\n    for (var i = 0; i < 3 * blockNames.length; i++) {\n      vm.stack.push(null);\n    }\n    vm.stack.push(null); // For each argument, push its backing reference on to the stack\n\n    argList.forEach(_ref63 => {\n      var [, reference] = _ref63;\n      vm.stack.push(reference);\n    }); // Configure VM based on blocks and args just pushed on to the stack.\n\n    vm[ARGS].setup(vm.stack, argNames, blockNames, 0, true);\n    var compilable = reified.compilable;\n    var layoutHandle = (0, _util.unwrapHandle)(compilable.compile(context));\n    var invocation = {\n      handle: layoutHandle,\n      symbolTable: compilable.symbolTable\n    }; // Needed for the Op.Main opcode: arguments, component invocation object, and\n    // component definition.\n\n    vm.stack.push(vm[ARGS]);\n    vm.stack.push(invocation);\n    vm.stack.push(reified);\n    return new TemplateIteratorImpl(vm);\n  }\n  function renderComponent(runtime, treeBuilder, context, owner, definition, args, dynamicScope) {\n    if (args === void 0) {\n      args = {};\n    }\n    if (dynamicScope === void 0) {\n      dynamicScope = new DynamicScopeImpl();\n    }\n    var vm = VM.empty(runtime, {\n      treeBuilder,\n      handle: context.stdlib.main,\n      dynamicScope,\n      owner\n    }, context);\n    return renderInvocation(vm, context, owner, definition, recordToReference(args));\n  }\n  function recordToReference(record) {\n    var root = (0, _reference.createConstRef)(record, 'args');\n    return Object.keys(record).reduce((acc, key) => {\n      acc[key] = (0, _reference.childRefFor)(root, key);\n      return acc;\n    }, {});\n  }\n  var SERIALIZATION_FIRST_NODE_STRING = '%+b:0%';\n  _exports.SERIALIZATION_FIRST_NODE_STRING = SERIALIZATION_FIRST_NODE_STRING;\n  function isSerializationFirstNode(node) {\n    return node.nodeValue === SERIALIZATION_FIRST_NODE_STRING;\n  }\n  class RehydratingCursor extends CursorImpl {\n    constructor(element, nextSibling, startingBlockDepth) {\n      super(element, nextSibling);\n      this.startingBlockDepth = startingBlockDepth;\n      this.candidate = null;\n      this.injectedOmittedNode = false;\n      this.openBlockDepth = startingBlockDepth - 1;\n    }\n  }\n  class RehydrateBuilder extends NewElementBuilder {\n    constructor(env, parentNode, nextSibling) {\n      super(env, parentNode, nextSibling);\n      this.unmatchedAttributes = null;\n      this.blockDepth = 0;\n      if (nextSibling) throw new Error('Rehydration with nextSibling not supported');\n      var node = this.currentCursor.element.firstChild;\n      while (node !== null) {\n        if (isOpenBlock(node)) {\n          break;\n        }\n        node = node.nextSibling;\n      }\n      this.candidate = node;\n      var startingBlockOffset = getBlockDepth(node);\n      if (startingBlockOffset !== 0) {\n        // We are rehydrating from a partial tree and not the root component\n        // We need to add an extra block before the first block to rehydrate correctly\n        // The extra block is needed since the renderComponent API creates a synthetic component invocation which generates the extra block\n        var newBlockDepth = startingBlockOffset - 1;\n        var newCandidate = this.dom.createComment(`%+b:${newBlockDepth}%`);\n        node.parentNode.insertBefore(newCandidate, this.candidate);\n        var closingNode = node.nextSibling;\n        while (closingNode !== null) {\n          if (isCloseBlock(closingNode) && getBlockDepth(closingNode) === startingBlockOffset) {\n            break;\n          }\n          closingNode = closingNode.nextSibling;\n        }\n        var newClosingBlock = this.dom.createComment(`%-b:${newBlockDepth}%`);\n        node.parentNode.insertBefore(newClosingBlock, closingNode.nextSibling);\n        this.candidate = newCandidate;\n        this.startingBlockOffset = newBlockDepth;\n      } else {\n        this.startingBlockOffset = 0;\n      }\n    }\n    get currentCursor() {\n      return this[CURSOR_STACK].current;\n    }\n    get candidate() {\n      if (this.currentCursor) {\n        return this.currentCursor.candidate;\n      }\n      return null;\n    }\n    set candidate(node) {\n      var currentCursor = this.currentCursor;\n      currentCursor.candidate = node;\n    }\n    disableRehydration(nextSibling) {\n      var currentCursor = this.currentCursor; // rehydration will be disabled until we either:\n      // * hit popElement (and return to using the parent elements cursor)\n      // * hit closeBlock and the next sibling is a close block comment\n      //   matching the expected openBlockDepth\n\n      currentCursor.candidate = null;\n      currentCursor.nextSibling = nextSibling;\n    }\n    enableRehydration(candidate) {\n      var currentCursor = this.currentCursor;\n      currentCursor.candidate = candidate;\n      currentCursor.nextSibling = null;\n    }\n    pushElement(element, nextSibling) {\n      if (nextSibling === void 0) {\n        nextSibling = null;\n      }\n      var cursor = new RehydratingCursor(element, nextSibling, this.blockDepth || 0);\n      /**\n       * <div>   <---------------  currentCursor.element\n       *   <!--%+b:1%--> <-------  would have been removed during openBlock\n       *   <div> <---------------  currentCursor.candidate -> cursor.element\n       *     <!--%+b:2%--> <-----  currentCursor.candidate.firstChild -> cursor.candidate\n       *     Foo\n       *     <!--%-b:2%-->\n       *   </div>\n       *   <!--%-b:1%-->  <------  becomes currentCursor.candidate\n       */\n\n      if (this.candidate !== null) {\n        cursor.candidate = element.firstChild;\n        this.candidate = element.nextSibling;\n      }\n      this[CURSOR_STACK].push(cursor);\n    } // clears until the end of the current container\n    // either the current open block or higher\n\n    clearMismatch(candidate) {\n      var current = candidate;\n      var currentCursor = this.currentCursor;\n      if (currentCursor !== null) {\n        var openBlockDepth = currentCursor.openBlockDepth;\n        if (openBlockDepth >= currentCursor.startingBlockDepth) {\n          while (current) {\n            if (isCloseBlock(current)) {\n              var closeBlockDepth = getBlockDepthWithOffset(current, this.startingBlockOffset);\n              if (openBlockDepth >= closeBlockDepth) {\n                break;\n              }\n            }\n            current = this.remove(current);\n          }\n        } else {\n          while (current !== null) {\n            current = this.remove(current);\n          }\n        } // current cursor parentNode should be openCandidate if element\n        // or openCandidate.parentNode if comment\n\n        this.disableRehydration(current);\n      }\n    }\n    __openBlock() {\n      var {\n        currentCursor\n      } = this;\n      if (currentCursor === null) return;\n      var blockDepth = this.blockDepth;\n      this.blockDepth++;\n      var {\n        candidate\n      } = currentCursor;\n      if (candidate === null) return;\n      var {\n        tagName\n      } = currentCursor.element;\n      if (isOpenBlock(candidate) && getBlockDepthWithOffset(candidate, this.startingBlockOffset) === blockDepth) {\n        this.candidate = this.remove(candidate);\n        currentCursor.openBlockDepth = blockDepth;\n      } else if (tagName !== 'TITLE' && tagName !== 'SCRIPT' && tagName !== 'STYLE') {\n        this.clearMismatch(candidate);\n      }\n    }\n    __closeBlock() {\n      var {\n        currentCursor\n      } = this;\n      if (currentCursor === null) return; // openBlock is the last rehydrated open block\n\n      var openBlockDepth = currentCursor.openBlockDepth; // this currently is the expected next open block depth\n\n      this.blockDepth--;\n      var {\n        candidate\n      } = currentCursor;\n      var isRehydrating = false;\n      if (candidate !== null) {\n        isRehydrating = true; //assert(\n        //  openBlockDepth === this.blockDepth,\n        //  'when rehydrating, openBlockDepth should match this.blockDepth here'\n        //);\n\n        if (isCloseBlock(candidate) && getBlockDepthWithOffset(candidate, this.startingBlockOffset) === openBlockDepth) {\n          var nextSibling = this.remove(candidate);\n          this.candidate = nextSibling;\n          currentCursor.openBlockDepth--;\n        } else {\n          // close the block and clear mismatch in parent container\n          // we will be either at the end of the element\n          // or at the end of our containing block\n          this.clearMismatch(candidate);\n          isRehydrating = false;\n        }\n      }\n      if (isRehydrating === false) {\n        // check if nextSibling matches our expected close block\n        // if so, we remove the close block comment and\n        // restore rehydration after clearMismatch disabled\n        var _nextSibling = currentCursor.nextSibling;\n        if (_nextSibling !== null && isCloseBlock(_nextSibling) && getBlockDepthWithOffset(_nextSibling, this.startingBlockOffset) === this.blockDepth) {\n          // restore rehydration state\n          var _candidate2 = this.remove(_nextSibling);\n          this.enableRehydration(_candidate2);\n          currentCursor.openBlockDepth--;\n        }\n      }\n    }\n    __appendNode(node) {\n      var {\n        candidate\n      } = this; // This code path is only used when inserting precisely one node. It needs more\n      // comparison logic, but we can probably lean on the cases where this code path\n      // is actually used.\n\n      if (candidate) {\n        return candidate;\n      } else {\n        return super.__appendNode(node);\n      }\n    }\n    __appendHTML(html) {\n      var candidateBounds = this.markerBounds();\n      if (candidateBounds) {\n        var first = candidateBounds.firstNode();\n        var last = candidateBounds.lastNode();\n        var newBounds = new ConcreteBounds(this.element, first.nextSibling, last.previousSibling);\n        var possibleEmptyMarker = this.remove(first);\n        this.remove(last);\n        if (possibleEmptyMarker !== null && isEmpty$1(possibleEmptyMarker)) {\n          this.candidate = this.remove(possibleEmptyMarker);\n          if (this.candidate !== null) {\n            this.clearMismatch(this.candidate);\n          }\n        }\n        return newBounds;\n      } else {\n        return super.__appendHTML(html);\n      }\n    }\n    remove(node) {\n      var element = node.parentNode;\n      var next = node.nextSibling;\n      element.removeChild(node);\n      return next;\n    }\n    markerBounds() {\n      var _candidate = this.candidate;\n      if (_candidate && isMarker(_candidate)) {\n        var first = _candidate;\n        var last = first.nextSibling;\n        while (last && !isMarker(last)) {\n          last = last.nextSibling;\n        }\n        return new ConcreteBounds(this.element, first, last);\n      } else {\n        return null;\n      }\n    }\n    __appendText(string) {\n      var {\n        candidate\n      } = this;\n      if (candidate) {\n        if (isTextNode(candidate)) {\n          if (candidate.nodeValue !== string) {\n            candidate.nodeValue = string;\n          }\n          this.candidate = candidate.nextSibling;\n          return candidate;\n        } else if (isSeparator(candidate)) {\n          this.candidate = this.remove(candidate);\n          return this.__appendText(string);\n        } else if (isEmpty$1(candidate) && string === '') {\n          this.candidate = this.remove(candidate);\n          return this.__appendText(string);\n        } else {\n          this.clearMismatch(candidate);\n          return super.__appendText(string);\n        }\n      } else {\n        return super.__appendText(string);\n      }\n    }\n    __appendComment(string) {\n      var _candidate = this.candidate;\n      if (_candidate && isComment(_candidate)) {\n        if (_candidate.nodeValue !== string) {\n          _candidate.nodeValue = string;\n        }\n        this.candidate = _candidate.nextSibling;\n        return _candidate;\n      } else if (_candidate) {\n        this.clearMismatch(_candidate);\n      }\n      return super.__appendComment(string);\n    }\n    __openElement(tag) {\n      var _candidate = this.candidate;\n      if (_candidate && isElement(_candidate) && isSameNodeType(_candidate, tag)) {\n        this.unmatchedAttributes = [].slice.call(_candidate.attributes);\n        return _candidate;\n      } else if (_candidate) {\n        if (isElement(_candidate) && _candidate.tagName === 'TBODY') {\n          this.pushElement(_candidate, null);\n          this.currentCursor.injectedOmittedNode = true;\n          return this.__openElement(tag);\n        }\n        this.clearMismatch(_candidate);\n      }\n      return super.__openElement(tag);\n    }\n    __setAttribute(name, value, namespace) {\n      var unmatched = this.unmatchedAttributes;\n      if (unmatched) {\n        var attr = findByName(unmatched, name);\n        if (attr) {\n          if (attr.value !== value) {\n            attr.value = value;\n          }\n          unmatched.splice(unmatched.indexOf(attr), 1);\n          return;\n        }\n      }\n      return super.__setAttribute(name, value, namespace);\n    }\n    __setProperty(name, value) {\n      var unmatched = this.unmatchedAttributes;\n      if (unmatched) {\n        var attr = findByName(unmatched, name);\n        if (attr) {\n          if (attr.value !== value) {\n            attr.value = value;\n          }\n          unmatched.splice(unmatched.indexOf(attr), 1);\n          return;\n        }\n      }\n      return super.__setProperty(name, value);\n    }\n    __flushElement(parent, constructing) {\n      var {\n        unmatchedAttributes: unmatched\n      } = this;\n      if (unmatched) {\n        for (var i = 0; i < unmatched.length; i++) {\n          this.constructing.removeAttribute(unmatched[i].name);\n        }\n        this.unmatchedAttributes = null;\n      } else {\n        super.__flushElement(parent, constructing);\n      }\n    }\n    willCloseElement() {\n      var {\n        candidate,\n        currentCursor\n      } = this;\n      if (candidate !== null) {\n        this.clearMismatch(candidate);\n      }\n      if (currentCursor && currentCursor.injectedOmittedNode) {\n        this.popElement();\n      }\n      super.willCloseElement();\n    }\n    getMarker(element, guid) {\n      var marker = element.querySelector(`script[glmr=\"${guid}\"]`);\n      if (marker) {\n        return marker;\n      }\n      return null;\n    }\n    __pushRemoteElement(element, cursorId, insertBefore) {\n      var marker = this.getMarker(element, cursorId);\n      if (insertBefore === undefined) {\n        while (element.firstChild !== null && element.firstChild !== marker) {\n          this.remove(element.firstChild);\n        }\n        insertBefore = null;\n      }\n      var cursor = new RehydratingCursor(element, null, this.blockDepth);\n      this[CURSOR_STACK].push(cursor);\n      if (marker === null) {\n        this.disableRehydration(insertBefore);\n      } else {\n        this.candidate = this.remove(marker);\n      }\n      var block = new RemoteLiveBlock(element);\n      return this.pushLiveBlock(block, true);\n    }\n    didAppendBounds(bounds) {\n      super.didAppendBounds(bounds);\n      if (this.candidate) {\n        var last = bounds.lastNode();\n        this.candidate = last && last.nextSibling;\n      }\n      return bounds;\n    }\n  }\n  _exports.RehydrateBuilder = RehydrateBuilder;\n  function isTextNode(node) {\n    return node.nodeType === 3;\n  }\n  function isComment(node) {\n    return node.nodeType === 8;\n  }\n  function isOpenBlock(node) {\n    return node.nodeType === 8\n    /* COMMENT_NODE */ && node.nodeValue.lastIndexOf('%+b:', 0) === 0;\n  }\n  function isCloseBlock(node) {\n    return node.nodeType === 8\n    /* COMMENT_NODE */ && node.nodeValue.lastIndexOf('%-b:', 0) === 0;\n  }\n  function getBlockDepth(node) {\n    return parseInt(node.nodeValue.slice(4), 10);\n  }\n  function getBlockDepthWithOffset(node, offset) {\n    return getBlockDepth(node) - offset;\n  }\n  function isElement(node) {\n    return node.nodeType === 1;\n  }\n  function isMarker(node) {\n    return node.nodeType === 8 && node.nodeValue === '%glmr%';\n  }\n  function isSeparator(node) {\n    return node.nodeType === 8 && node.nodeValue === '%|%';\n  }\n  function isEmpty$1(node) {\n    return node.nodeType === 8 && node.nodeValue === '% %';\n  }\n  function isSameNodeType(candidate, tag) {\n    if (candidate.namespaceURI === \"http://www.w3.org/2000/svg\"\n    /* SVG */) {\n      return candidate.tagName === tag;\n    }\n    return candidate.tagName === tag.toUpperCase();\n  }\n  function findByName(array, name) {\n    for (var i = 0; i < array.length; i++) {\n      var attr = array[i];\n      if (attr.name === name) return attr;\n    }\n    return undefined;\n  }\n  function rehydrationBuilder(env, cursor) {\n    return RehydrateBuilder.forInitialRender(env, cursor);\n  }\n  var ARGS_CACHES = true /* DEBUG */ ? new WeakMap() : undefined;\n  function getArgs(proxy) {\n    return (0, _validator.getValue)(true /* DEBUG */ ? ARGS_CACHES.get(proxy) : proxy.argsCache);\n  }\n  class SimpleArgsProxy {\n    constructor(context, computeArgs) {\n      if (computeArgs === void 0) {\n        computeArgs = () => EMPTY_ARGS;\n      }\n      var argsCache = (0, _validator.createCache)(() => computeArgs(context));\n      if (true /* DEBUG */) {\n        ARGS_CACHES.set(this, argsCache);\n        Object.freeze(this);\n      } else {\n        this.argsCache = argsCache;\n      }\n    }\n    get named() {\n      return getArgs(this).named || EMPTY_NAMED;\n    }\n    get positional() {\n      return getArgs(this).positional || EMPTY_POSITIONAL;\n    }\n  } ////////////\n\n  function invokeHelper(context, definition, computeArgs) {\n    if (true /* DEBUG */ && (typeof context !== 'object' || context === null)) {\n      throw new Error(`Expected a context object to be passed as the first parameter to invokeHelper, got ${context}`);\n    }\n    var owner = (0, _owner2.getOwner)(context);\n    var internalManager = (0, _manager5.getInternalHelperManager)(definition); // TODO: figure out why assert isn't using the TS assert thing\n\n    if (true /* DEBUG */ && !internalManager) {\n      throw new Error(`Expected a helper definition to be passed as the second parameter to invokeHelper, but no helper manager was found. The definition value that was passed was \\`${(0, _util.debugToString)(definition)}\\`. Did you use setHelperManager to associate a helper manager with this value?`);\n    }\n    if (true /* DEBUG */ && typeof internalManager === 'function') {\n      throw new Error('Found a helper manager, but it was an internal built-in helper manager. `invokeHelper` does not support internal helpers yet.');\n    }\n    var manager = internalManager.getDelegateFor(owner);\n    var args = new SimpleArgsProxy(context, computeArgs);\n    var bucket = manager.createHelper(definition, args);\n    var cache;\n    if ((0, _manager5.hasValue)(manager)) {\n      cache = (0, _validator.createCache)(() => {\n        if (true /* DEBUG */ && ((0, _destroyable2.isDestroying)(cache) || (0, _destroyable2.isDestroyed)(cache))) {\n          throw new Error(`You attempted to get the value of a helper after the helper was destroyed, which is not allowed`);\n        }\n        return manager.getValue(bucket);\n      });\n      (0, _destroyable2.associateDestroyableChild)(context, cache);\n    } else {\n      throw new Error('TODO: unreachable, to be implemented with hasScheduledEffect');\n    }\n    if ((0, _manager5.hasDestroyable)(manager)) {\n      var destroyable = manager.getDestroyable(bucket);\n      (0, _destroyable2.associateDestroyableChild)(cache, destroyable);\n    }\n    return cache;\n  }\n  function internalHelper(helper) {\n    return (0, _manager5.setInternalHelperManager)(helper, {});\n  }\n  var context = (0, _util.buildUntouchableThis)('`fn` helper');\n  /**\n    The `fn` helper allows you to ensure a function that you are passing off\n    to another component, helper, or modifier has access to arguments that are\n    available in the template.\n  \n    For example, if you have an `each` helper looping over a number of items, you\n    may need to pass a function that expects to receive the item as an argument\n    to a component invoked within the loop. Here's how you could use the `fn`\n    helper to pass both the function and its arguments together:\n  \n      ```app/templates/components/items-listing.hbs\n    {{#each @items as |item|}}\n      <DisplayItem @item=item @select={{fn this.handleSelected item}} />\n    {{/each}}\n    ```\n  \n    ```app/components/items-list.js\n    import Component from '@glimmer/component';\n    import { action } from '@ember/object';\n  \n    export default class ItemsList extends Component {\n      handleSelected = (item) => {\n        // ...snip...\n      }\n    }\n    ```\n  \n    In this case the `display-item` component will receive a normal function\n    that it can invoke. When it invokes the function, the `handleSelected`\n    function will receive the `item` and any arguments passed, thanks to the\n    `fn` helper.\n  \n    Let's take look at what that means in a couple circumstances:\n  \n    - When invoked as `this.args.select()` the `handleSelected` function will\n      receive the `item` from the loop as its first and only argument.\n    - When invoked as `this.args.select('foo')` the `handleSelected` function\n      will receive the `item` from the loop as its first argument and the\n      string `'foo'` as its second argument.\n  \n    In the example above, we used an arrow function to ensure that\n    `handleSelected` is properly bound to the `items-list`, but let's explore what\n    happens if we left out the arrow function:\n  \n    ```app/components/items-list.js\n    import Component from '@glimmer/component';\n  \n    export default class ItemsList extends Component {\n      handleSelected(item) {\n        // ...snip...\n      }\n    }\n    ```\n  \n    In this example, when `handleSelected` is invoked inside the `display-item`\n    component, it will **not** have access to the component instance. In other\n    words, it will have no `this` context, so please make sure your functions\n    are bound (via an arrow function or other means) before passing into `fn`!\n  \n    See also [partial application](https://en.wikipedia.org/wiki/Partial_application).\n  \n    @method fn\n    @public\n  */\n\n  var fn = internalHelper(_ref64 => {\n    var {\n      positional\n    } = _ref64;\n    var callbackRef = positional[0];\n    if (true /* DEBUG */) assertCallbackIsFn(callbackRef);\n    return (0, _reference.createComputeRef)(() => {\n      return function () {\n        var [fn, ...args] = (0, _runtime.reifyPositional)(positional);\n        if (true /* DEBUG */) assertCallbackIsFn(callbackRef);\n        for (var _len = arguments.length, invocationArgs = new Array(_len), _key2 = 0; _key2 < _len; _key2++) {\n          invocationArgs[_key2] = arguments[_key2];\n        }\n        if ((0, _reference.isInvokableRef)(callbackRef)) {\n          var value = args.length > 0 ? args[0] : invocationArgs[0];\n          return (0, _reference.updateRef)(callbackRef, value);\n        } else {\n          return fn.call(context, ...args, ...invocationArgs);\n        }\n      };\n    }, null, 'fn');\n  });\n  _exports.fn = fn;\n  function assertCallbackIsFn(callbackRef) {\n    if (!(callbackRef && ((0, _reference.isInvokableRef)(callbackRef) || typeof (0, _reference.valueForRef)(callbackRef) === 'function'))) {\n      throw new Error(`You must pass a function as the \\`fn\\` helper's first argument, you passed ${callbackRef ? (0, _reference.valueForRef)(callbackRef) : callbackRef}. While rendering:\\n\\n${callbackRef === null || callbackRef === void 0 ? void 0 : callbackRef.debugLabel}`);\n    }\n  }\n  var wrapHashProxy;\n  if (true /* DEBUG */) {\n    wrapHashProxy = hash => {\n      return new Proxy(hash, {\n        set(target, key, value) {\n          (true && !(false) && (0, _globalContext.deprecate)(`You set the '${String(key)}' property on a {{hash}} object. Setting properties on objects generated by {{hash}} is deprecated. Please update to use an object created with a tracked property or getter, or with a custom helper.`, false, {\n            id: 'setting-on-hash'\n          }));\n          target[key] = value;\n          return true;\n        }\n      });\n    };\n  }\n  /**\n     Use the `{{hash}}` helper to create a hash to pass as an option to your\n     components. This is specially useful for contextual components where you can\n     just yield a hash:\n  \n     ```handlebars\n     {{yield (hash\n        name='Sarah'\n        title=office\n     )}}\n     ```\n  \n     Would result in an object such as:\n  \n     ```js\n     { name: 'Sarah', title: this.get('office') }\n     ```\n  \n     Where the `title` is bound to updates of the `office` property.\n  \n     Note that the hash is an empty object with no prototype chain, therefore\n     common methods like `toString` are not available in the resulting hash.\n     If you need to use such a method, you can use the `call` or `apply`\n     approach:\n  \n     ```js\n     function toString(obj) {\n       return Object.prototype.toString.apply(obj);\n     }\n     ```\n  \n     @method hash\n     @param {Object} options\n     @return {Object} Hash\n     @public\n   */\n\n  var hash = internalHelper(_ref65 => {\n    var {\n      named\n    } = _ref65;\n    var ref = (0, _reference.createComputeRef)(() => {\n      var hash = (0, _runtime.reifyNamed)(named);\n      if (true /* DEBUG */ && _util.HAS_NATIVE_PROXY) {\n        hash = wrapHashProxy(hash);\n      }\n      return hash;\n    }, null, 'hash'); // Setup the children so that templates can bypass getting the value of\n    // the reference and treat children lazily\n\n    var children = new Map();\n    for (var name in named) {\n      children.set(name, named[name]);\n    }\n    ref.children = children;\n    return ref;\n  });\n\n  /**\n     Use the `{{array}}` helper to create an array to pass as an option to your\n     components.\n  \n     ```handlebars\n     <MyComponent @people={{array\n       'Tom Dale'\n       'Yehuda Katz'\n       this.myOtherPerson}}\n     />\n     ```\n      or\n     ```handlebars\n     {{my-component people=(array\n       'Tom Dale'\n       'Yehuda Katz'\n       this.myOtherPerson)\n     }}\n     ```\n  \n     Would result in an object such as:\n  \n     ```js\n     ['Tom Dale', 'Yehuda Katz', this.get('myOtherPerson')]\n     ```\n  \n     Where the 3rd item in the array is bound to updates of the `myOtherPerson` property.\n  \n     @method array\n     @param {Array} options\n     @return {Array} Array\n     @public\n   */\n  _exports.hash = hash;\n  var array = internalHelper(_ref66 => {\n    var {\n      positional\n    } = _ref66;\n    return (0, _reference.createComputeRef)(() => (0, _runtime.reifyPositional)(positional), null, 'array');\n  });\n\n  /**\n    Dynamically look up a property on an object. The second argument to `{{get}}`\n    should have a string value, although it can be bound.\n  \n    For example, these two usages are equivalent:\n  \n    ```app/components/developer-detail.js\n    import Component from '@glimmer/component';\n    import { tracked } from '@glimmer/tracking';\n  \n    export default class extends Component {\n      @tracked developer = {\n        name: \"Sandi Metz\",\n        language: \"Ruby\"\n      }\n    }\n    ```\n  \n    ```handlebars\n    {{this.developer.name}}\n    {{get this.developer \"name\"}}\n    ```\n  \n    If there were several facts about a person, the `{{get}}` helper can dynamically\n    pick one:\n  \n    ```app/templates/application.hbs\n    <DeveloperDetail @factName=\"language\" />\n    ```\n  \n    ```handlebars\n    {{get this.developer @factName}}\n    ```\n  \n    For a more complex example, this template would allow the user to switch\n    between showing the user's height and weight with a click:\n  \n    ```app/components/developer-detail.js\n    import Component from '@glimmer/component';\n    import { tracked } from '@glimmer/tracking';\n  \n    export default class extends Component {\n      @tracked developer = {\n        name: \"Sandi Metz\",\n        language: \"Ruby\"\n      }\n  \n      @tracked currentFact = 'name'\n  \n      showFact = (fact) => {\n        this.currentFact = fact;\n      }\n    }\n    ```\n  \n    ```app/components/developer-detail.js\n    {{get this.developer this.currentFact}}\n  \n    <button {{on 'click' (fn this.showFact \"name\")}}>Show name</button>\n    <button {{on 'click' (fn this.showFact \"language\")}}>Show language</button>\n    ```\n  \n    The `{{get}}` helper can also respect mutable values itself. For example:\n  \n    ```app/components/developer-detail.js\n    <Input @value={{mut (get this.person this.currentFact)}} />\n  \n    <button {{on 'click' (fn this.showFact \"name\")}}>Show name</button>\n    <button {{on 'click' (fn this.showFact \"language\")}}>Show language</button>\n    ```\n  \n    Would allow the user to swap what fact is being displayed, and also edit\n    that fact via a two-way mutable binding.\n  \n    @public\n    @method get\n   */\n  _exports.array = array;\n  var get = internalHelper(_ref67 => {\n    var {\n      positional\n    } = _ref67;\n    var _a, _b;\n    var sourceRef = (_a = positional[0]) !== null && _a !== void 0 ? _a : _reference.UNDEFINED_REFERENCE;\n    var pathRef = (_b = positional[1]) !== null && _b !== void 0 ? _b : _reference.UNDEFINED_REFERENCE;\n    return (0, _reference.createComputeRef)(() => {\n      var source = (0, _reference.valueForRef)(sourceRef);\n      if ((0, _util.isDict)(source)) {\n        return (0, _globalContext.getPath)(source, String((0, _reference.valueForRef)(pathRef)));\n      }\n    }, value => {\n      var source = (0, _reference.valueForRef)(sourceRef);\n      if ((0, _util.isDict)(source)) {\n        return (0, _globalContext.setPath)(source, String((0, _reference.valueForRef)(pathRef)), value);\n      }\n    }, 'get');\n  });\n  _exports.get = get;\n  var isEmpty$2 = value => {\n    return value === null || value === undefined || typeof value.toString !== 'function';\n  };\n  var normalizeTextValue = value => {\n    if (isEmpty$2(value)) {\n      return '';\n    }\n    return String(value);\n  };\n  /**\n    Concatenates the given arguments into a string.\n  \n    Example:\n  \n    ```handlebars\n    {{some-component name=(concat firstName \" \" lastName)}}\n  \n    {{! would pass name=\"<first name value> <last name value>\" to the component}}\n    ```\n  \n    or for angle bracket invocation, you actually don't need concat at all.\n  \n    ```handlebars\n    <SomeComponent @name=\"{{firstName}} {{lastName}}\" />\n    ```\n  \n    @public\n    @method concat\n  */\n\n  var concat = internalHelper(_ref68 => {\n    var {\n      positional\n    } = _ref68;\n    return (0, _reference.createComputeRef)(() => (0, _runtime.reifyPositional)(positional).map(normalizeTextValue).join(''), null, 'concat');\n  });\n  _exports.concat = concat;\n  var untouchableContext = (0, _util.buildUntouchableThis)('`on` modifier');\n  /*\n    Internet Explorer 11 does not support `once` and also does not support\n    passing `eventOptions`. In some situations it then throws a weird script\n    error, like:\n  \n    ```\n    Could not complete the operation due to error 80020101\n    ```\n  \n    This flag determines, whether `{ once: true }` and thus also event options in\n    general are supported.\n  */\n\n  var SUPPORTS_EVENT_OPTIONS = (() => {\n    try {\n      var div = document.createElement('div');\n      var counter = 0;\n      div.addEventListener('click', () => counter++, {\n        once: true\n      });\n      var event;\n      if (typeof Event === 'function') {\n        event = new Event('click');\n      } else {\n        event = document.createEvent('Event');\n        event.initEvent('click', true, true);\n      }\n      div.dispatchEvent(event);\n      div.dispatchEvent(event);\n      return counter === 1;\n    } catch (error) {\n      return false;\n    }\n  })();\n  class OnModifierState {\n    constructor(element, args) {\n      this.tag = (0, _validator.createUpdatableTag)();\n      this.shouldUpdate = true;\n      this.element = element;\n      this.args = args;\n    }\n    updateFromArgs() {\n      var {\n        args\n      } = this;\n      var {\n        once,\n        passive,\n        capture\n      } = (0, _runtime.reifyNamed)(args.named);\n      if (once !== this.once) {\n        this.once = once;\n        this.shouldUpdate = true;\n      }\n      if (passive !== this.passive) {\n        this.passive = passive;\n        this.shouldUpdate = true;\n      }\n      if (capture !== this.capture) {\n        this.capture = capture;\n        this.shouldUpdate = true;\n      }\n      var options;\n      if (once || passive || capture) {\n        options = this.options = {\n          once,\n          passive,\n          capture\n        };\n      } else {\n        this.options = undefined;\n      }\n      if (true /* DEBUG */ && (args.positional[0] === undefined || typeof (0, _reference.valueForRef)(args.positional[0]) !== 'string')) {\n        throw new Error('You must pass a valid DOM event name as the first argument to the `on` modifier');\n      }\n      var eventName = (0, _reference.valueForRef)(args.positional[0]);\n      if (eventName !== this.eventName) {\n        this.eventName = eventName;\n        this.shouldUpdate = true;\n      }\n      var userProvidedCallbackReference = args.positional[1];\n      if (true /* DEBUG */) {\n        if (args.positional[1] === undefined) {\n          throw new Error(`You must pass a function as the second argument to the \\`on\\` modifier.`);\n        }\n        var value = (0, _reference.valueForRef)(userProvidedCallbackReference);\n        if (typeof value !== 'function') {\n          throw new Error(`You must pass a function as the second argument to the \\`on\\` modifier; you passed ${value === null ? 'null' : typeof value}. While rendering:\\n\\n${userProvidedCallbackReference.debugLabel}`);\n        }\n      }\n      var userProvidedCallback = (0, _reference.valueForRef)(userProvidedCallbackReference);\n      if (userProvidedCallback !== this.userProvidedCallback) {\n        this.userProvidedCallback = userProvidedCallback;\n        this.shouldUpdate = true;\n      }\n      if (true /* DEBUG */ && args.positional.length !== 2) {\n        throw new Error(`You can only pass two positional arguments (event name and callback) to the \\`on\\` modifier, but you provided ${args.positional.length}. Consider using the \\`fn\\` helper to provide additional arguments to the \\`on\\` callback.`);\n      }\n      var needsCustomCallback = SUPPORTS_EVENT_OPTIONS === false && once || /* needs manual once implementation */\n      true /* DEBUG */ && passive;\n      /* needs passive enforcement */\n\n      if (this.shouldUpdate) {\n        if (needsCustomCallback) {\n          var _callback = this.callback = function (event) {\n            if (true /* DEBUG */ && passive) {\n              event.preventDefault = () => {\n                throw new Error(`You marked this listener as 'passive', meaning that you must not call 'event.preventDefault()': \\n\\n${userProvidedCallback}`);\n              };\n            }\n            if (!SUPPORTS_EVENT_OPTIONS && once) {\n              removeEventListener(this, eventName, _callback, options);\n            }\n            return userProvidedCallback.call(untouchableContext, event);\n          };\n        } else if (true /* DEBUG */) {\n          // prevent the callback from being bound to the element\n          this.callback = userProvidedCallback.bind(untouchableContext);\n        } else {\n          this.callback = userProvidedCallback;\n        }\n      }\n    }\n  }\n  var adds = 0;\n  var removes = 0;\n  function removeEventListener(element, eventName, callback, options) {\n    removes++;\n    if (SUPPORTS_EVENT_OPTIONS) {\n      // when options are supported, use them across the board\n      element.removeEventListener(eventName, callback, options);\n    } else if (options !== undefined && options.capture) {\n      // used only in the following case:\n      //\n      // `{ once: true | false, passive: true | false, capture: true }\n      //\n      // `once` is handled via a custom callback that removes after first\n      // invocation so we only care about capture here as a boolean\n      element.removeEventListener(eventName, callback, true);\n    } else {\n      // used only in the following cases:\n      //\n      // * where there is no options\n      // * `{ once: true | false, passive: true | false, capture: false }\n      element.removeEventListener(eventName, callback);\n    }\n  }\n  function addEventListener(element, eventName, callback, options) {\n    adds++;\n    if (SUPPORTS_EVENT_OPTIONS) {\n      // when options are supported, use them across the board\n      element.addEventListener(eventName, callback, options);\n    } else if (options !== undefined && options.capture) {\n      // used only in the following case:\n      //\n      // `{ once: true | false, passive: true | false, capture: true }\n      //\n      // `once` is handled via a custom callback that removes after first\n      // invocation so we only care about capture here as a boolean\n      element.addEventListener(eventName, callback, true);\n    } else {\n      // used only in the following cases:\n      //\n      // * where there is no options\n      // * `{ once: true | false, passive: true | false, capture: false }\n      element.addEventListener(eventName, callback);\n    }\n  }\n  /**\n    The `{{on}}` modifier lets you easily add event listeners (it uses\n    [EventTarget.addEventListener](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener)\n    internally).\n  \n    For example, if you'd like to run a function on your component when a `<button>`\n    in the components template is clicked you might do something like:\n  \n    ```app/components/like-post.hbs\n    <button {{on 'click' this.saveLike}}>Like this post!</button>\n    ```\n  \n    ```app/components/like-post.js\n    import Component from '@glimmer/component';\n    import { action } from '@ember/object';\n  \n    export default class LikePostComponent extends Component {\n      saveLike = () => {\n        // someone likes your post!\n        // better send a request off to your server...\n      }\n    }\n    ```\n  \n    ### Arguments\n  \n    `{{on}}` accepts two positional arguments, and a few named arguments.\n  \n    The positional arguments are:\n  \n    - `event` -- the name to use when calling `addEventListener`\n    - `callback` -- the function to be passed to `addEventListener`\n  \n    The named arguments are:\n  \n    - capture -- a `true` value indicates that events of this type will be dispatched\n      to the registered listener before being dispatched to any EventTarget beneath it\n      in the DOM tree.\n    - once -- indicates that the listener should be invoked at most once after being\n      added. If true, the listener would be automatically removed when invoked.\n    - passive -- if `true`, indicates that the function specified by listener will never\n      call preventDefault(). If a passive listener does call preventDefault(), the user\n      agent will do nothing other than generate a console warning. See\n      [Improving scrolling performance with passive listeners](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Improving_scrolling_performance_with_passive_listeners)\n      to learn more.\n  \n    The callback function passed to `{{on}}` will receive any arguments that are passed\n    to the event handler. Most commonly this would be the `event` itself.\n  \n    If you would like to pass additional arguments to the function you should use\n    the `{{fn}}` helper.\n  \n    For example, in our example case above if you'd like to pass in the post that\n    was being liked when the button is clicked you could do something like:\n  \n    ```app/components/like-post.hbs\n    <button {{on 'click' (fn this.saveLike @post)}}>Like this post!</button>\n    ```\n  \n    In this case, the `saveLike` function will receive two arguments: the click event\n    and the value of `@post`.\n  \n    ### Function Context\n  \n    In the example above, we used an arrow function to ensure that `likePost` is\n    properly bound to the `items-list`, but let's explore what happens if we\n    left out the arrow function:\n  \n    ```app/components/like-post.js\n    import Component from '@glimmer/component';\n  \n    export default class LikePostComponent extends Component {\n      saveLike() {\n        // ...snip...\n      }\n    }\n    ```\n  \n    In this example, when the button is clicked `saveLike` will be invoked,\n    it will **not** have access to the component instance. In other\n    words, it will have no `this` context, so please make sure your functions\n    are bound (via an arrow function or other means) before passing into `on`!\n  \n    @method on\n    @public\n  */\n\n  class OnModifierManager {\n    constructor() {\n      this.SUPPORTS_EVENT_OPTIONS = SUPPORTS_EVENT_OPTIONS;\n    }\n    getDebugName() {\n      return 'on';\n    }\n    get counters() {\n      return {\n        adds,\n        removes\n      };\n    }\n    create(_owner, element, _state, args) {\n      return new OnModifierState(element, args);\n    }\n    getTag(state) {\n      if (state === null) {\n        return null;\n      }\n      return state.tag;\n    }\n    install(state) {\n      if (state === null) {\n        return;\n      }\n      state.updateFromArgs();\n      var {\n        element,\n        eventName,\n        callback,\n        options\n      } = state;\n      addEventListener(element, eventName, callback, options);\n      (0, _destroyable2.registerDestructor)(state, () => removeEventListener(element, eventName, callback, options));\n      state.shouldUpdate = false;\n    }\n    update(state) {\n      if (state === null) {\n        return;\n      } // stash prior state for el.removeEventListener\n\n      var {\n        element,\n        eventName,\n        callback,\n        options\n      } = state;\n      state.updateFromArgs();\n      if (!state.shouldUpdate) {\n        return;\n      } // use prior state values for removal\n\n      removeEventListener(element, eventName, callback, options); // read updated values from the state object\n\n      addEventListener(state.element, state.eventName, state.callback, state.options);\n      state.shouldUpdate = false;\n    }\n    getDestroyable(state) {\n      return state;\n    }\n  }\n  var on = (0, _manager5.setInternalModifierManager)(new OnModifierManager(), {});\n  _exports.on = on;\n});","define(\"@glimmer/tracking/index\", [\"exports\", \"@ember/-internals/metal\"], function (_exports, _metal) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"cached\", {\n    enumerable: true,\n    get: function () {\n      return _metal.cached;\n    }\n  });\n  Object.defineProperty(_exports, \"tracked\", {\n    enumerable: true,\n    get: function () {\n      return _metal.tracked;\n    }\n  });\n});","define(\"@glimmer/tracking/primitives/cache\", [\"exports\", \"@ember/-internals/metal\"], function (_exports, _metal) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"createCache\", {\n    enumerable: true,\n    get: function () {\n      return _metal.createCache;\n    }\n  });\n  Object.defineProperty(_exports, \"getValue\", {\n    enumerable: true,\n    get: function () {\n      return _metal.getValue;\n    }\n  });\n  Object.defineProperty(_exports, \"isConst\", {\n    enumerable: true,\n    get: function () {\n      return _metal.isConst;\n    }\n  });\n});","define(\"@glimmer/util\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports._WeakSet = _exports.Stack = _exports.SERIALIZATION_FIRST_NODE_STRING = _exports.LOGGER = _exports.LOCAL_LOGGER = _exports.HAS_NATIVE_SYMBOL = _exports.HAS_NATIVE_PROXY = _exports.EMPTY_STRING_ARRAY = _exports.EMPTY_NUMBER_ARRAY = _exports.EMPTY_ARRAY = void 0;\n  _exports.assert = debugAssert$$1;\n  _exports.assertNever = assertNever;\n  _exports.assertPresent = assertPresent;\n  _exports.beginTestSteps = _exports.assign = void 0;\n  _exports.buildUntouchableThis = buildUntouchableThis;\n  _exports.castToBrowser = castToBrowser;\n  _exports.castToSimple = castToSimple;\n  _exports.checkNode = checkNode;\n  _exports.clearElement = clearElement;\n  _exports.constants = constants;\n  _exports.debugToString = void 0;\n  _exports.decodeHandle = decodeHandle;\n  _exports.decodeImmediate = decodeImmediate;\n  _exports.decodeNegative = decodeNegative;\n  _exports.decodePositive = decodePositive;\n  _exports.deprecate = deprecate$$1;\n  _exports.dict = dict;\n  _exports.emptyArray = emptyArray;\n  _exports.encodeHandle = encodeHandle;\n  _exports.encodeImmediate = encodeImmediate;\n  _exports.encodeNegative = encodeNegative;\n  _exports.encodePositive = encodePositive;\n  _exports.endTestSteps = void 0;\n  _exports.enumerableSymbol = enumerableSymbol;\n  _exports.exhausted = exhausted;\n  _exports.expect = expect;\n  _exports.extractHandle = extractHandle;\n  _exports.fillNulls = fillNulls;\n  _exports.ifPresent = ifPresent;\n  _exports.intern = intern;\n  _exports.isDict = isDict;\n  _exports.isEmptyArray = isEmptyArray;\n  _exports.isErrHandle = isErrHandle;\n  _exports.isHandle = isHandle;\n  _exports.isNonPrimitiveHandle = isNonPrimitiveHandle;\n  _exports.isObject = isObject;\n  _exports.isOkHandle = isOkHandle;\n  _exports.isPresent = isPresent;\n  _exports.isSerializationFirstNode = isSerializationFirstNode;\n  _exports.isSmallInt = isSmallInt;\n  _exports.keys = keys;\n  _exports.logStep = void 0;\n  _exports.mapPresent = mapPresent;\n  _exports.strip = strip;\n  _exports.symbol = void 0;\n  _exports.toPresentOption = toPresentOption;\n  _exports.tuple = void 0;\n  _exports.unreachable = unreachable;\n  _exports.unwrap = unwrap;\n  _exports.unwrapHandle = unwrapHandle;\n  _exports.unwrapTemplate = unwrapTemplate;\n  _exports.values = values;\n  _exports.verifySteps = void 0;\n  var EMPTY_ARRAY = Object.freeze([]);\n  _exports.EMPTY_ARRAY = EMPTY_ARRAY;\n  function emptyArray() {\n    return EMPTY_ARRAY;\n  }\n  var EMPTY_STRING_ARRAY = emptyArray();\n  _exports.EMPTY_STRING_ARRAY = EMPTY_STRING_ARRAY;\n  var EMPTY_NUMBER_ARRAY = emptyArray();\n  /**\n   * This function returns `true` if the input array is the special empty array sentinel,\n   * which is sometimes used for optimizations.\n   */\n  _exports.EMPTY_NUMBER_ARRAY = EMPTY_NUMBER_ARRAY;\n  function isEmptyArray(input) {\n    return input === EMPTY_ARRAY;\n  }\n\n  // import Logger from './logger';\n\n  function debugAssert$$1(test, msg) {\n    // if (!alreadyWarned) {\n    //   alreadyWarned = true;\n    //   Logger.warn(\"Don't leave debug assertions on in public builds\");\n    // }\n    if (!test) {\n      throw new Error(msg || 'assertion failure');\n    }\n  }\n  function deprecate$$1(desc) {\n    LOCAL_LOGGER.warn(`DEPRECATION: ${desc}`);\n  }\n  function dict() {\n    return Object.create(null);\n  }\n  function isDict(u) {\n    return u !== null && u !== undefined;\n  }\n  function isObject(u) {\n    return typeof u === 'function' || typeof u === 'object' && u !== null;\n  }\n  class StackImpl {\n    constructor(values) {\n      if (values === void 0) {\n        values = [];\n      }\n      this.current = null;\n      this.stack = values;\n    }\n    get size() {\n      return this.stack.length;\n    }\n    push(item) {\n      this.current = item;\n      this.stack.push(item);\n    }\n    pop() {\n      var item = this.stack.pop();\n      var len = this.stack.length;\n      this.current = len === 0 ? null : this.stack[len - 1];\n      return item === undefined ? null : item;\n    }\n    nth(from) {\n      var len = this.stack.length;\n      return len < from ? null : this.stack[len - from];\n    }\n    isEmpty() {\n      return this.stack.length === 0;\n    }\n    toArray() {\n      return this.stack;\n    }\n  }\n  _exports.Stack = StackImpl;\n  function clearElement(parent) {\n    var current = parent.firstChild;\n    while (current) {\n      var next = current.nextSibling;\n      parent.removeChild(current);\n      current = next;\n    }\n  }\n  var SERIALIZATION_FIRST_NODE_STRING = '%+b:0%';\n  _exports.SERIALIZATION_FIRST_NODE_STRING = SERIALIZATION_FIRST_NODE_STRING;\n  function isSerializationFirstNode(node) {\n    return node.nodeValue === SERIALIZATION_FIRST_NODE_STRING;\n  }\n  var assign = Object.assign;\n  _exports.assign = assign;\n  function fillNulls(count) {\n    var arr = new Array(count);\n    for (var i = 0; i < count; i++) {\n      arr[i] = null;\n    }\n    return arr;\n  }\n  function values(obj) {\n    var vals = [];\n    for (var key in obj) {\n      vals.push(obj[key]);\n    }\n    return vals;\n  }\n\n  /**\n    Strongly hint runtimes to intern the provided string.\n  \n    When do I need to use this function?\n  \n    For the most part, never. Pre-mature optimization is bad, and often the\n    runtime does exactly what you need it to, and more often the trade-off isn't\n    worth it.\n  \n    Why?\n  \n    Runtimes store strings in at least 2 different representations:\n    Ropes and Symbols (interned strings). The Rope provides a memory efficient\n    data-structure for strings created from concatenation or some other string\n    manipulation like splitting.\n  \n    Unfortunately checking equality of different ropes can be quite costly as\n    runtimes must resort to clever string comparison algorithms. These\n    algorithms typically cost in proportion to the length of the string.\n    Luckily, this is where the Symbols (interned strings) shine. As Symbols are\n    unique by their string content, equality checks can be done by pointer\n    comparison.\n  \n    How do I know if my string is a rope or symbol?\n  \n    Typically (warning general sweeping statement, but truthy in runtimes at\n    present) static strings created as part of the JS source are interned.\n    Strings often used for comparisons can be interned at runtime if some\n    criteria are met.  One of these criteria can be the size of the entire rope.\n    For example, in chrome 38 a rope longer then 12 characters will not\n    intern, nor will segments of that rope.\n  \n    Some numbers: http://jsperf.com/eval-vs-keys/8\n  \n    Known Trick™\n  \n    @private\n    @return {String} interned version of the provided string\n  */\n  function intern(str) {\n    var obj = {};\n    obj[str] = 1;\n    for (var key in obj) {\n      if (key === str) {\n        return key;\n      }\n    }\n    return str;\n  }\n  var HAS_NATIVE_PROXY = typeof Proxy === 'function';\n  _exports.HAS_NATIVE_PROXY = HAS_NATIVE_PROXY;\n  var HAS_NATIVE_SYMBOL = function () {\n    if (typeof Symbol !== 'function') {\n      return false;\n    } // eslint-disable-next-line symbol-description\n\n    return typeof Symbol() === 'symbol';\n  }();\n  _exports.HAS_NATIVE_SYMBOL = HAS_NATIVE_SYMBOL;\n  function keys(obj) {\n    return Object.keys(obj);\n  }\n  function unwrap(val) {\n    if (val === null || val === undefined) throw new Error(`Expected value to be present`);\n    return val;\n  }\n  function expect(val, message) {\n    if (val === null || val === undefined) throw new Error(message);\n    return val;\n  }\n  function unreachable(message) {\n    if (message === void 0) {\n      message = 'unreachable';\n    }\n    return new Error(message);\n  }\n  function exhausted(value) {\n    throw new Error(`Exhausted ${value}`);\n  }\n  var tuple = function () {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n    return args;\n  };\n  _exports.tuple = tuple;\n  function enumerableSymbol(key) {\n    return intern(`__${key}${Math.floor(Math.random() * Date.now())}__`);\n  }\n  var symbol = HAS_NATIVE_SYMBOL ? Symbol : enumerableSymbol;\n  _exports.symbol = symbol;\n  function strip(strings) {\n    var out = '';\n    for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n      args[_key2 - 1] = arguments[_key2];\n    }\n    for (var i = 0; i < strings.length; i++) {\n      var string = strings[i];\n      var dynamic = args[i] !== undefined ? String(args[i]) : '';\n      out += `${string}${dynamic}`;\n    }\n    var lines = out.split('\\n');\n    while (lines.length && lines[0].match(/^\\s*$/)) {\n      lines.shift();\n    }\n    while (lines.length && lines[lines.length - 1].match(/^\\s*$/)) {\n      lines.pop();\n    }\n    var min = Infinity;\n    for (var line of lines) {\n      var leading = line.match(/^\\s*/)[0].length;\n      min = Math.min(min, leading);\n    }\n    var stripped = [];\n    for (var _line of lines) {\n      stripped.push(_line.slice(min));\n    }\n    return stripped.join('\\n');\n  }\n  function isHandle(value) {\n    return value >= 0;\n  }\n  function isNonPrimitiveHandle(value) {\n    return value > 3\n    /* ENCODED_UNDEFINED_HANDLE */;\n  }\n\n  function constants() {\n    for (var _len3 = arguments.length, values = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n      values[_key3] = arguments[_key3];\n    }\n    return [false, true, null, undefined, ...values];\n  }\n  function isSmallInt(value) {\n    return value % 1 === 0 && value <= 536870911\n    /* MAX_INT */ && value >= -536870912\n    /* MIN_INT */;\n  }\n\n  function encodeNegative(num) {\n    return num & -536870913\n    /* SIGN_BIT */;\n  }\n\n  function decodeNegative(num) {\n    return num | ~-536870913\n    /* SIGN_BIT */;\n  }\n\n  function encodePositive(num) {\n    return ~num;\n  }\n  function decodePositive(num) {\n    return ~num;\n  }\n  function encodeHandle(num) {\n    return num;\n  }\n  function decodeHandle(num) {\n    return num;\n  }\n  function encodeImmediate(num) {\n    num |= 0;\n    return num < 0 ? encodeNegative(num) : encodePositive(num);\n  }\n  function decodeImmediate(num) {\n    num |= 0;\n    return num > -536870913\n    /* SIGN_BIT */ ? decodePositive(num) : decodeNegative(num);\n  } // Warm\n  [1, -1].forEach(x => decodeImmediate(encodeImmediate(x)));\n  function unwrapHandle(handle) {\n    if (typeof handle === 'number') {\n      return handle;\n    } else {\n      var error = handle.errors[0];\n      throw new Error(`Compile Error: ${error.problem} @ ${error.span.start}..${error.span.end}`);\n    }\n  }\n  function unwrapTemplate(template) {\n    if (template.result === 'error') {\n      throw new Error(`Compile Error: ${template.problem} @ ${template.span.start}..${template.span.end}`);\n    }\n    return template;\n  }\n  function extractHandle(handle) {\n    if (typeof handle === 'number') {\n      return handle;\n    } else {\n      return handle.handle;\n    }\n  }\n  function isOkHandle(handle) {\n    return typeof handle === 'number';\n  }\n  function isErrHandle(handle) {\n    return typeof handle === 'number';\n  }\n  var weakSet = typeof WeakSet === 'function' ? WeakSet : class WeakSetPolyFill {\n    constructor() {\n      this._map = new WeakMap();\n    }\n    add(val) {\n      this._map.set(val, true);\n      return this;\n    }\n    delete(val) {\n      return this._map.delete(val);\n    }\n    has(val) {\n      return this._map.has(val);\n    }\n  };\n  _exports._WeakSet = weakSet;\n  function castToSimple(node) {\n    if (isDocument(node)) {\n      return node;\n    } else if (isElement(node)) {\n      return node;\n    } else {\n      return node;\n    }\n  }\n  function castToBrowser(node, sugaryCheck) {\n    if (node === null || node === undefined) {\n      return null;\n    }\n    if (typeof document === undefined) {\n      throw new Error('Attempted to cast to a browser node in a non-browser context');\n    }\n    if (isDocument(node)) {\n      return node;\n    }\n    if (node.ownerDocument !== document) {\n      throw new Error('Attempted to cast to a browser node with a node that was not created from this document');\n    }\n    return checkNode(node, sugaryCheck);\n  }\n  function checkError(from, check) {\n    return new Error(`cannot cast a ${from} into ${check}`);\n  }\n  function isDocument(node) {\n    return node.nodeType === 9\n    /* DOCUMENT_NODE */;\n  }\n\n  function isElement(node) {\n    return node.nodeType === 1\n    /* ELEMENT_NODE */;\n  }\n\n  function checkNode(node, check) {\n    var isMatch = false;\n    if (node !== null) {\n      if (typeof check === 'string') {\n        isMatch = stringCheckNode(node, check);\n      } else if (Array.isArray(check)) {\n        isMatch = check.some(c => stringCheckNode(node, c));\n      } else {\n        throw unreachable();\n      }\n    }\n    if (isMatch) {\n      return node;\n    } else {\n      throw checkError(`SimpleElement(${node})`, check);\n    }\n  }\n  function stringCheckNode(node, check) {\n    switch (check) {\n      case 'NODE':\n        return true;\n      case 'HTML':\n        return node instanceof HTMLElement;\n      case 'SVG':\n        return node instanceof SVGElement;\n      case 'ELEMENT':\n        return node instanceof Element;\n      default:\n        if (check.toUpperCase() === check) {\n          throw new Error(`BUG: this code is missing handling for a generic node type`);\n        }\n        return node instanceof Element && node.tagName.toLowerCase() === check;\n    }\n  }\n  function isPresent(list) {\n    return list.length > 0;\n  }\n  function ifPresent(list, ifPresent, otherwise) {\n    if (isPresent(list)) {\n      return ifPresent(list);\n    } else {\n      return otherwise();\n    }\n  }\n  function toPresentOption(list) {\n    if (isPresent(list)) {\n      return list;\n    } else {\n      return null;\n    }\n  }\n  function assertPresent(list, message) {\n    if (message === void 0) {\n      message = `unexpected empty list`;\n    }\n    if (!isPresent(list)) {\n      throw new Error(message);\n    }\n  }\n  function mapPresent(list, callback) {\n    if (list === null) {\n      return null;\n    }\n    var out = [];\n    for (var item of list) {\n      out.push(callback(item));\n    }\n    return out;\n  }\n  function buildUntouchableThis(source) {\n    var context = null;\n    if (true /* DEBUG */ && HAS_NATIVE_PROXY) {\n      var assertOnProperty = property => {\n        throw new Error(`You accessed \\`this.${String(property)}\\` from a function passed to the ${source}, but the function itself was not bound to a valid \\`this\\` context. Consider updating to use a bound function (for instance, use an arrow function, \\`() => {}\\`).`);\n      };\n      context = new Proxy({}, {\n        get(_target, property) {\n          assertOnProperty(property);\n        },\n        set(_target, property) {\n          assertOnProperty(property);\n          return false;\n        },\n        has(_target, property) {\n          assertOnProperty(property);\n          return false;\n        }\n      });\n    }\n    return context;\n  }\n  var debugToString;\n  if (true /* DEBUG */) {\n    var getFunctionName = fn => {\n      var functionName = fn.name;\n      if (functionName === undefined) {\n        var match = Function.prototype.toString.call(fn).match(/function (\\w+)\\s*\\(/);\n        functionName = match && match[1] || '';\n      }\n      return functionName.replace(/^bound /, '');\n    };\n    var getObjectName = obj => {\n      var name;\n      var className;\n      if (obj.constructor && typeof obj.constructor === 'function') {\n        className = getFunctionName(obj.constructor);\n      }\n      if ('toString' in obj && obj.toString !== Object.prototype.toString && obj.toString !== Function.prototype.toString) {\n        name = obj.toString();\n      } // If the class has a decent looking name, and the `toString` is one of the\n      // default Ember toStrings, replace the constructor portion of the toString\n      // with the class name. We check the length of the class name to prevent doing\n      // this when the value is minified.\n\n      if (name && name.match(/<.*:ember\\d+>/) && className && className[0] !== '_' && className.length > 2 && className !== 'Class') {\n        return name.replace(/<.*:/, `<${className}:`);\n      }\n      return name || className;\n    };\n    var getPrimitiveName = value => {\n      return String(value);\n    };\n    debugToString = value => {\n      if (typeof value === 'function') {\n        return getFunctionName(value) || `(unknown function)`;\n      } else if (typeof value === 'object' && value !== null) {\n        return getObjectName(value) || `(unknown object)`;\n      } else {\n        return getPrimitiveName(value);\n      }\n    };\n  }\n  var debugToString$1 = debugToString;\n  _exports.debugToString = debugToString$1;\n  var beginTestSteps;\n  _exports.beginTestSteps = beginTestSteps;\n  var endTestSteps;\n  _exports.endTestSteps = endTestSteps;\n  var verifySteps;\n  _exports.verifySteps = verifySteps;\n  var logStep;\n\n  /**\n   * This constant exists to make it easier to differentiate normal logs from\n   * errant console.logs. LOCAL_LOGGER should only be used inside a\n   * LOCAL_SHOULD_LOG check.\n   *\n   * It does not alleviate the need to check LOCAL_SHOULD_LOG, which is used\n   * for stripping.\n   */\n  _exports.logStep = logStep;\n  var LOCAL_LOGGER = console;\n  /**\n   * This constant exists to make it easier to differentiate normal logs from\n   * errant console.logs. LOGGER can be used outside of LOCAL_SHOULD_LOG checks,\n   * and is meant to be used in the rare situation where a console.* call is\n   * actually appropriate.\n   */\n  _exports.LOCAL_LOGGER = LOCAL_LOGGER;\n  var LOGGER = console;\n  _exports.LOGGER = LOGGER;\n  function assertNever(value, desc) {\n    if (desc === void 0) {\n      desc = 'unexpected unreachable branch';\n    }\n    LOGGER.log('unreachable', value);\n    LOGGER.log(`${desc} :: ${JSON.stringify(value)} (${value})`);\n    throw new Error(`code reached unreachable`);\n  }\n});","define(\"@glimmer/validator\", [\"exports\", \"@glimmer/global-context\"], function (_exports, _globalContext) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.VolatileTag = _exports.VOLATILE_TAG = _exports.VOLATILE = _exports.INITIAL = _exports.CurrentTag = _exports.CURRENT_TAG = _exports.CONSTANT_TAG = _exports.CONSTANT = _exports.COMPUTE = _exports.ALLOW_CYCLES = void 0;\n  _exports.beginTrackFrame = beginTrackFrame;\n  _exports.beginTrackingTransaction = void 0;\n  _exports.beginUntrackFrame = beginUntrackFrame;\n  _exports.bump = bump;\n  _exports.combine = void 0;\n  _exports.consumeTag = consumeTag;\n  _exports.createCache = createCache;\n  _exports.createTag = createTag;\n  _exports.createUpdatableTag = createUpdatableTag;\n  _exports.dirtyTag = void 0;\n  _exports.dirtyTagFor = dirtyTagFor;\n  _exports.endTrackFrame = endTrackFrame;\n  _exports.endTrackingTransaction = void 0;\n  _exports.endUntrackFrame = endUntrackFrame;\n  _exports.getValue = getValue;\n  _exports.isConst = isConst;\n  _exports.isConstTag = isConstTag;\n  _exports.isTracking = isTracking;\n  _exports.logTrackingStack = void 0;\n  _exports.resetTracking = resetTracking;\n  _exports.setTrackingTransactionEnv = _exports.runInTrackingTransaction = void 0;\n  _exports.tagFor = tagFor;\n  _exports.tagMetaFor = tagMetaFor;\n  _exports.track = track;\n  _exports.trackedData = trackedData;\n  _exports.untrack = untrack;\n  _exports.updateTag = void 0;\n  _exports.validateTag = validateTag;\n  _exports.valueForTag = valueForTag;\n  // eslint-disable-next-line @typescript-eslint/ban-types\n  function indexable(input) {\n    return input;\n  } // This is a duplicate utility from @glimmer/util because `@glimmer/validator`\n  // should not depend on any other @glimmer packages, in order to avoid pulling\n  // in types and prevent regressions in `@glimmer/tracking` (which has public types).\n\n  var symbol = typeof Symbol !== 'undefined' ? Symbol :\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  key => `__${key}${Math.floor(Math.random() * Date.now())}__`; // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n  var symbolFor = typeof Symbol !== 'undefined' ? Symbol.for : key => `__GLIMMER_VALIDATOR_SYMBOL_FOR_${key}`;\n  function getGlobal() {\n    // eslint-disable-next-line node/no-unsupported-features/es-builtins\n    if (typeof globalThis !== 'undefined') return indexable(globalThis);\n    if (typeof self !== 'undefined') return indexable(self);\n    if (typeof window !== 'undefined') return indexable(window);\n    if (typeof global !== 'undefined') return indexable(global);\n    throw new Error('unable to locate global object');\n  }\n  function unwrap(val) {\n    if (val === null || val === undefined) throw new Error(`Expected value to be present`);\n    return val;\n  }\n  var beginTrackingTransaction;\n  _exports.beginTrackingTransaction = beginTrackingTransaction;\n  var endTrackingTransaction;\n  _exports.endTrackingTransaction = endTrackingTransaction;\n  var runInTrackingTransaction;\n  _exports.runInTrackingTransaction = runInTrackingTransaction;\n  var resetTrackingTransaction;\n  var setTrackingTransactionEnv;\n  _exports.setTrackingTransactionEnv = setTrackingTransactionEnv;\n  var assertTagNotConsumed;\n  var markTagAsConsumed;\n  var logTrackingStack;\n  _exports.logTrackingStack = logTrackingStack;\n  if (true /* DEBUG */) {\n    var CONSUMED_TAGS = null;\n    var TRANSACTION_STACK = []; /////////\n\n    var TRANSACTION_ENV = {\n      debugMessage(obj, keyName) {\n        var objName;\n        if (typeof obj === 'function') {\n          objName = obj.name;\n        } else if (typeof obj === 'object' && obj !== null) {\n          var className = obj.constructor && obj.constructor.name || '(unknown class)';\n          objName = `(an instance of ${className})`;\n        } else if (obj === undefined) {\n          objName = '(an unknown tag)';\n        } else {\n          objName = String(obj);\n        }\n        var dirtyString = keyName ? `\\`${keyName}\\` on \\`${objName}\\`` : `\\`${objName}\\``;\n        return `You attempted to update ${dirtyString}, but it had already been used previously in the same computation.  Attempting to update a value after using it in a computation can cause logical errors, infinite revalidation bugs, and performance issues, and is not supported.`;\n      }\n    };\n    _exports.setTrackingTransactionEnv = setTrackingTransactionEnv = env => Object.assign(TRANSACTION_ENV, env);\n    _exports.beginTrackingTransaction = beginTrackingTransaction = _debugLabel => {\n      CONSUMED_TAGS = CONSUMED_TAGS || new WeakMap();\n      var debugLabel = _debugLabel || undefined;\n      var parent = TRANSACTION_STACK[TRANSACTION_STACK.length - 1] || null;\n      TRANSACTION_STACK.push({\n        parent,\n        debugLabel\n      });\n    };\n    _exports.endTrackingTransaction = endTrackingTransaction = () => {\n      if (TRANSACTION_STACK.length === 0) {\n        throw new Error('attempted to close a tracking transaction, but one was not open');\n      }\n      TRANSACTION_STACK.pop();\n      if (TRANSACTION_STACK.length === 0) {\n        CONSUMED_TAGS = null;\n      }\n    };\n    resetTrackingTransaction = () => {\n      var stack = '';\n      if (TRANSACTION_STACK.length > 0) {\n        stack = logTrackingStack(TRANSACTION_STACK[TRANSACTION_STACK.length - 1]);\n      }\n      TRANSACTION_STACK = [];\n      CONSUMED_TAGS = null;\n      return stack;\n    };\n    /**\n     * Creates a global autotracking transaction. This will prevent any backflow\n     * in any `track` calls within the transaction, even if they are not\n     * externally consumed.\n     *\n     * `runInAutotrackingTransaction` can be called within itself, and it will add\n     * onto the existing transaction if one exists.\n     *\n     * TODO: Only throw an error if the `track` is consumed.\n     */\n\n    _exports.runInTrackingTransaction = runInTrackingTransaction = (fn, debugLabel) => {\n      beginTrackingTransaction(debugLabel);\n      var didError = true;\n      try {\n        var value = fn();\n        didError = false;\n        return value;\n      } finally {\n        if (didError !== true) {\n          endTrackingTransaction();\n        }\n      }\n    };\n    var nthIndex = function (str, pattern, n, startingPos) {\n      if (startingPos === void 0) {\n        startingPos = -1;\n      }\n      var i = startingPos;\n      while (n-- > 0 && i++ < str.length) {\n        i = str.indexOf(pattern, i);\n        if (i < 0) break;\n      }\n      return i;\n    };\n    var makeTrackingErrorMessage = (transaction, obj, keyName) => {\n      var message = [TRANSACTION_ENV.debugMessage(obj, keyName && String(keyName))];\n      message.push(`\\`${String(keyName)}\\` was first used:`);\n      message.push(logTrackingStack(transaction));\n      message.push(`Stack trace for the update:`);\n      return message.join('\\n\\n');\n    };\n    _exports.logTrackingStack = logTrackingStack = transaction => {\n      var trackingStack = [];\n      var current = transaction || TRANSACTION_STACK[TRANSACTION_STACK.length - 1];\n      if (current === undefined) return '';\n      while (current) {\n        if (current.debugLabel) {\n          trackingStack.unshift(current.debugLabel);\n        }\n        current = current.parent;\n      } // TODO: Use String.prototype.repeat here once we can drop support for IE11\n\n      return trackingStack.map((label, index) => Array(2 * index + 1).join(' ') + label).join('\\n');\n    };\n    markTagAsConsumed = _tag => {\n      if (!CONSUMED_TAGS || CONSUMED_TAGS.has(_tag)) return;\n      CONSUMED_TAGS.set(_tag, TRANSACTION_STACK[TRANSACTION_STACK.length - 1]); // We need to mark the tag and all of its subtags as consumed, so we need to\n      // cast it and access its internals. In the future this shouldn't be necessary,\n      // this is only for computed properties.\n\n      var tag = _tag;\n      if (tag.subtag) {\n        markTagAsConsumed(tag.subtag);\n      }\n      if (tag.subtags) {\n        tag.subtags.forEach(tag => markTagAsConsumed(tag));\n      }\n    };\n    assertTagNotConsumed = (tag, obj, keyName) => {\n      if (CONSUMED_TAGS === null) return;\n      var transaction = CONSUMED_TAGS.get(tag);\n      if (!transaction) return; // This hack makes the assertion message nicer, we can cut off the first\n      // few lines of the stack trace and let users know where the actual error\n      // occurred.\n\n      try {\n        (true && (0, _globalContext.assert)(false, makeTrackingErrorMessage(transaction, obj, keyName)));\n      } catch (e) {\n        if (e.stack) {\n          var updateStackBegin = e.stack.indexOf('Stack trace for the update:');\n          if (updateStackBegin !== -1) {\n            var start = nthIndex(e.stack, '\\n', 1, updateStackBegin);\n            var end = nthIndex(e.stack, '\\n', 4, updateStackBegin);\n            e.stack = e.stack.substr(0, start) + e.stack.substr(end);\n          }\n        }\n        throw e;\n      }\n    };\n  }\n  var CONSTANT = 0;\n  _exports.CONSTANT = CONSTANT;\n  var INITIAL = 1;\n  _exports.INITIAL = INITIAL;\n  var VOLATILE = NaN;\n  _exports.VOLATILE = VOLATILE;\n  var $REVISION = INITIAL;\n  function bump() {\n    $REVISION++;\n  } //////////\n\n  var COMPUTE = symbol('TAG_COMPUTE'); //////////\n\n  /**\n   * `value` receives a tag and returns an opaque Revision based on that tag. This\n   * snapshot can then later be passed to `validate` with the same tag to\n   * determine if the tag has changed at all since the time that `value` was\n   * called.\n   *\n   * @param tag\n   */\n  _exports.COMPUTE = COMPUTE;\n  function valueForTag(tag) {\n    return tag[COMPUTE]();\n  }\n  /**\n   * `validate` receives a tag and a snapshot from a previous call to `value` with\n   * the same tag, and determines if the tag is still valid compared to the\n   * snapshot. If the tag's state has changed at all since then, `validate` will\n   * return false, otherwise it will return true. This is used to determine if a\n   * calculation related to the tags should be rerun.\n   *\n   * @param tag\n   * @param snapshot\n   */\n\n  function validateTag(tag, snapshot) {\n    return snapshot >= tag[COMPUTE]();\n  }\n  var TYPE = symbol('TAG_TYPE'); // this is basically a const\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n\n  var ALLOW_CYCLES;\n  _exports.ALLOW_CYCLES = ALLOW_CYCLES;\n  if (true /* DEBUG */) {\n    _exports.ALLOW_CYCLES = ALLOW_CYCLES = new WeakMap();\n  }\n  function allowsCycles(tag) {\n    if (ALLOW_CYCLES === undefined) {\n      return true;\n    } else {\n      return ALLOW_CYCLES.has(tag);\n    }\n  }\n  class MonomorphicTagImpl {\n    constructor(type) {\n      this.revision = INITIAL;\n      this.lastChecked = INITIAL;\n      this.lastValue = INITIAL;\n      this.isUpdating = false;\n      this.subtag = null;\n      this.subtagBufferCache = null;\n      this[TYPE] = type;\n    }\n    static combine(tags) {\n      switch (tags.length) {\n        case 0:\n          return CONSTANT_TAG;\n        case 1:\n          return tags[0];\n        default:\n          var tag = new MonomorphicTagImpl(2\n          /* Combinator */);\n\n          tag.subtag = tags;\n          return tag;\n      }\n    }\n    [COMPUTE]() {\n      var {\n        lastChecked\n      } = this;\n      if (this.isUpdating === true) {\n        if (true /* DEBUG */ && !allowsCycles(this)) {\n          throw new Error('Cycles in tags are not allowed');\n        }\n        this.lastChecked = ++$REVISION;\n      } else if (lastChecked !== $REVISION) {\n        this.isUpdating = true;\n        this.lastChecked = $REVISION;\n        try {\n          var {\n            subtag,\n            revision\n          } = this;\n          if (subtag !== null) {\n            if (Array.isArray(subtag)) {\n              for (var i = 0; i < subtag.length; i++) {\n                var value = subtag[i][COMPUTE]();\n                revision = Math.max(value, revision);\n              }\n            } else {\n              var subtagValue = subtag[COMPUTE]();\n              if (subtagValue === this.subtagBufferCache) {\n                revision = Math.max(revision, this.lastValue);\n              } else {\n                // Clear the temporary buffer cache\n                this.subtagBufferCache = null;\n                revision = Math.max(revision, subtagValue);\n              }\n            }\n          }\n          this.lastValue = revision;\n        } finally {\n          this.isUpdating = false;\n        }\n      }\n      return this.lastValue;\n    }\n    static updateTag(_tag, _subtag) {\n      if (true /* DEBUG */ && _tag[TYPE] !== 1\n      /* Updatable */) {\n        throw new Error('Attempted to update a tag that was not updatable');\n      } // TODO: TS 3.7 should allow us to do this via assertion\n\n      var tag = _tag;\n      var subtag = _subtag;\n      if (subtag === CONSTANT_TAG) {\n        tag.subtag = null;\n      } else {\n        // There are two different possibilities when updating a subtag:\n        //\n        // 1. subtag[COMPUTE]() <= tag[COMPUTE]();\n        // 2. subtag[COMPUTE]() > tag[COMPUTE]();\n        //\n        // The first possibility is completely fine within our caching model, but\n        // the second possibility presents a problem. If the parent tag has\n        // already been read, then it's value is cached and will not update to\n        // reflect the subtag's greater value. Next time the cache is busted, the\n        // subtag's value _will_ be read, and it's value will be _greater_ than\n        // the saved snapshot of the parent, causing the resulting calculation to\n        // be rerun erroneously.\n        //\n        // In order to prevent this, when we first update to a new subtag we store\n        // its computed value, and then check against that computed value on\n        // subsequent updates. If its value hasn't changed, then we return the\n        // parent's previous value. Once the subtag changes for the first time,\n        // we clear the cache and everything is finally in sync with the parent.\n        tag.subtagBufferCache = subtag[COMPUTE]();\n        tag.subtag = subtag;\n      }\n    }\n    static dirtyTag(tag, disableConsumptionAssertion) {\n      if (true /* DEBUG */ && !(tag[TYPE] === 1\n      /* Updatable */ || tag[TYPE] === 0\n      /* Dirtyable */)) {\n        throw new Error('Attempted to dirty a tag that was not dirtyable');\n      }\n      if (true /* DEBUG */ && disableConsumptionAssertion !== true) {\n        // Usually by this point, we've already asserted with better error information,\n        // but this is our last line of defense.\n        unwrap(assertTagNotConsumed)(tag);\n      }\n      tag.revision = ++$REVISION;\n      (0, _globalContext.scheduleRevalidate)();\n    }\n  }\n  var DIRTY_TAG = MonomorphicTagImpl.dirtyTag;\n  _exports.dirtyTag = DIRTY_TAG;\n  var UPDATE_TAG = MonomorphicTagImpl.updateTag; //////////\n  _exports.updateTag = UPDATE_TAG;\n  function createTag() {\n    return new MonomorphicTagImpl(0\n    /* Dirtyable */);\n  }\n\n  function createUpdatableTag() {\n    return new MonomorphicTagImpl(1\n    /* Updatable */);\n  } //////////\n\n  var CONSTANT_TAG = new MonomorphicTagImpl(3\n  /* Constant */);\n  _exports.CONSTANT_TAG = CONSTANT_TAG;\n  function isConstTag(tag) {\n    return tag === CONSTANT_TAG;\n  } //////////\n\n  class VolatileTag {\n    [COMPUTE]() {\n      return VOLATILE;\n    }\n  }\n  _exports.VolatileTag = VolatileTag;\n  var VOLATILE_TAG = new VolatileTag(); //////////\n  _exports.VOLATILE_TAG = VOLATILE_TAG;\n  class CurrentTag {\n    [COMPUTE]() {\n      return $REVISION;\n    }\n  }\n  _exports.CurrentTag = CurrentTag;\n  var CURRENT_TAG = new CurrentTag(); //////////\n  _exports.CURRENT_TAG = CURRENT_TAG;\n  var combine = MonomorphicTagImpl.combine; // Warm\n  _exports.combine = combine;\n  var tag1 = createUpdatableTag();\n  var tag2 = createUpdatableTag();\n  var tag3 = createUpdatableTag();\n  valueForTag(tag1);\n  DIRTY_TAG(tag1);\n  valueForTag(tag1);\n  UPDATE_TAG(tag1, combine([tag2, tag3]));\n  valueForTag(tag1);\n  DIRTY_TAG(tag2);\n  valueForTag(tag1);\n  DIRTY_TAG(tag3);\n  valueForTag(tag1);\n  UPDATE_TAG(tag1, tag3);\n  valueForTag(tag1);\n  DIRTY_TAG(tag3);\n  valueForTag(tag1);\n  function isObjectLike(u) {\n    return typeof u === 'object' && u !== null || typeof u === 'function';\n  }\n  var TRACKED_TAGS = new WeakMap();\n  function dirtyTagFor(obj, key, meta) {\n    if (true /* DEBUG */ && !isObjectLike(obj)) {\n      throw new Error(`BUG: Can't update a tag for a primitive`);\n    }\n    var tags = meta === undefined ? TRACKED_TAGS.get(obj) : meta; // No tags have been setup for this object yet, return\n\n    if (tags === undefined) return; // Dirty the tag for the specific property if it exists\n\n    var propertyTag = tags.get(key);\n    if (propertyTag !== undefined) {\n      if (true /* DEBUG */) {\n        unwrap(assertTagNotConsumed)(propertyTag, obj, key);\n      }\n      DIRTY_TAG(propertyTag, true);\n    }\n  }\n  function tagMetaFor(obj) {\n    var tags = TRACKED_TAGS.get(obj);\n    if (tags === undefined) {\n      tags = new Map();\n      TRACKED_TAGS.set(obj, tags);\n    }\n    return tags;\n  }\n  function tagFor(obj, key, meta) {\n    var tags = meta === undefined ? tagMetaFor(obj) : meta;\n    var tag = tags.get(key);\n    if (tag === undefined) {\n      tag = createUpdatableTag();\n      tags.set(key, tag);\n    }\n    return tag;\n  }\n\n  /**\n   * An object that that tracks @tracked properties that were consumed.\n   */\n\n  class Tracker {\n    constructor() {\n      this.tags = new Set();\n      this.last = null;\n    }\n    add(tag) {\n      if (tag === CONSTANT_TAG) return;\n      this.tags.add(tag);\n      if (true /* DEBUG */) {\n        unwrap(markTagAsConsumed)(tag);\n      }\n      this.last = tag;\n    }\n    combine() {\n      var {\n        tags\n      } = this;\n      if (tags.size === 0) {\n        return CONSTANT_TAG;\n      } else if (tags.size === 1) {\n        return this.last;\n      } else {\n        var tagsArr = [];\n        tags.forEach(tag => tagsArr.push(tag));\n        return combine(tagsArr);\n      }\n    }\n  }\n  /**\n   * Whenever a tracked computed property is entered, the current tracker is\n   * saved off and a new tracker is replaced.\n   *\n   * Any tracked properties consumed are added to the current tracker.\n   *\n   * When a tracked computed property is exited, the tracker's tags are\n   * combined and added to the parent tracker.\n   *\n   * The consequence is that each tracked computed property has a tag\n   * that corresponds to the tracked properties consumed inside of\n   * itself, including child tracked computed properties.\n   */\n\n  var CURRENT_TRACKER = null;\n  var OPEN_TRACK_FRAMES = [];\n  function beginTrackFrame(debuggingContext) {\n    OPEN_TRACK_FRAMES.push(CURRENT_TRACKER);\n    CURRENT_TRACKER = new Tracker();\n    if (true /* DEBUG */) {\n      unwrap(beginTrackingTransaction)(debuggingContext);\n    }\n  }\n  function endTrackFrame() {\n    var current = CURRENT_TRACKER;\n    if (true /* DEBUG */) {\n      if (OPEN_TRACK_FRAMES.length === 0) {\n        throw new Error('attempted to close a tracking frame, but one was not open');\n      }\n      unwrap(endTrackingTransaction)();\n    }\n    CURRENT_TRACKER = OPEN_TRACK_FRAMES.pop() || null;\n    return unwrap(current).combine();\n  }\n  function beginUntrackFrame() {\n    OPEN_TRACK_FRAMES.push(CURRENT_TRACKER);\n    CURRENT_TRACKER = null;\n  }\n  function endUntrackFrame() {\n    if (true /* DEBUG */ && OPEN_TRACK_FRAMES.length === 0) {\n      throw new Error('attempted to close a tracking frame, but one was not open');\n    }\n    CURRENT_TRACKER = OPEN_TRACK_FRAMES.pop() || null;\n  } // This function is only for handling errors and resetting to a valid state\n\n  function resetTracking() {\n    while (OPEN_TRACK_FRAMES.length > 0) {\n      OPEN_TRACK_FRAMES.pop();\n    }\n    CURRENT_TRACKER = null;\n    if (true /* DEBUG */) {\n      return unwrap(resetTrackingTransaction)();\n    }\n  }\n  function isTracking() {\n    return CURRENT_TRACKER !== null;\n  }\n  function consumeTag(tag) {\n    if (CURRENT_TRACKER !== null) {\n      CURRENT_TRACKER.add(tag);\n    }\n  } //////////\n  var FN = symbol('FN');\n  var LAST_VALUE = symbol('LAST_VALUE');\n  var TAG = symbol('TAG');\n  var SNAPSHOT = symbol('SNAPSHOT');\n  var DEBUG_LABEL = symbol('DEBUG_LABEL');\n  function createCache(fn, debuggingLabel) {\n    if (true /* DEBUG */ && !(typeof fn === 'function')) {\n      throw new Error(`createCache() must be passed a function as its first parameter. Called with: ${String(fn)}`);\n    }\n    var cache = {\n      [FN]: fn,\n      [LAST_VALUE]: undefined,\n      [TAG]: undefined,\n      [SNAPSHOT]: -1\n    };\n    if (true /* DEBUG */) {\n      cache[DEBUG_LABEL] = debuggingLabel;\n    }\n    return cache;\n  }\n  function getValue(cache) {\n    assertCache(cache, 'getValue');\n    var fn = cache[FN];\n    var tag = cache[TAG];\n    var snapshot = cache[SNAPSHOT];\n    if (tag === undefined || !validateTag(tag, snapshot)) {\n      beginTrackFrame();\n      try {\n        cache[LAST_VALUE] = fn();\n      } finally {\n        tag = endTrackFrame();\n        cache[TAG] = tag;\n        cache[SNAPSHOT] = valueForTag(tag);\n        consumeTag(tag);\n      }\n    } else {\n      consumeTag(tag);\n    }\n    return cache[LAST_VALUE];\n  }\n  function isConst(cache) {\n    assertCache(cache, 'isConst');\n    var tag = cache[TAG];\n    assertTag(tag, cache);\n    return isConstTag(tag);\n  }\n  function assertCache(value, fnName) {\n    if (true /* DEBUG */ && !(typeof value === 'object' && value !== null && FN in value)) {\n      throw new Error(`${fnName}() can only be used on an instance of a cache created with createCache(). Called with: ${String(value)}`);\n    }\n  } // replace this with `expect` when we can\n\n  function assertTag(tag, cache) {\n    if (true /* DEBUG */ && tag === undefined) {\n      throw new Error(`isConst() can only be used on a cache once getValue() has been called at least once. Called with cache function:\\n\\n${String(cache[FN])}`);\n    }\n  } //////////\n  // Legacy tracking APIs\n  // track() shouldn't be necessary at all in the VM once the autotracking\n  // refactors are merged, and we should generally be moving away from it. It may\n  // be necessary in Ember for a while longer, but I think we'll be able to drop\n  // it in favor of cache sooner rather than later.\n\n  function track(callback, debugLabel) {\n    beginTrackFrame(debugLabel);\n    var tag;\n    try {\n      callback();\n    } finally {\n      tag = endTrackFrame();\n    }\n    return tag;\n  } // untrack() is currently mainly used to handle places that were previously not\n  // tracked, and that tracking now would cause backtracking rerender assertions.\n  // I think once we move everyone forward onto modern APIs, we'll probably be\n  // able to remove it, but I'm not sure yet.\n\n  function untrack(callback) {\n    beginUntrackFrame();\n    try {\n      return callback();\n    } finally {\n      endUntrackFrame();\n    }\n  }\n  function trackedData(key, initializer) {\n    var values = new WeakMap();\n    var hasInitializer = typeof initializer === 'function';\n    function getter(self) {\n      consumeTag(tagFor(self, key));\n      var value; // If the field has never been initialized, we should initialize it\n\n      if (hasInitializer && !values.has(self)) {\n        value = initializer.call(self);\n        values.set(self, value);\n      } else {\n        value = values.get(self);\n      }\n      return value;\n    }\n    function setter(self, value) {\n      dirtyTagFor(self, key);\n      values.set(self, value);\n    }\n    return {\n      getter,\n      setter\n    };\n  }\n  var GLIMMER_VALIDATOR_REGISTRATION = symbolFor('GLIMMER_VALIDATOR_REGISTRATION');\n  var globalObj = getGlobal();\n  if (globalObj[GLIMMER_VALIDATOR_REGISTRATION] === true) {\n    throw new Error('The `@glimmer/validator` library has been included twice in this application. It could be different versions of the package, or the same version included twice by mistake. `@glimmer/validator` depends on having a single copy of the package in use at any time in an application, even if they are the same version. You must dedupe your build to remove the duplicate packages in order to prevent this error.');\n  }\n  globalObj[GLIMMER_VALIDATOR_REGISTRATION] = true;\n});","define(\"@glimmer/vm\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.TemporaryRegister = _exports.SavedRegister = _exports.$v0 = _exports.$t1 = _exports.$t0 = _exports.$sp = _exports.$s1 = _exports.$s0 = _exports.$ra = _exports.$pc = _exports.$fp = void 0;\n  _exports.isLowLevelRegister = isLowLevelRegister;\n  _exports.isMachineOp = isMachineOp;\n  _exports.isOp = isOp;\n  /* This file is generated by build/debug.js */\n  function isMachineOp(value) {\n    return value >= 0 && value <= 15;\n  }\n  function isOp(value) {\n    return value >= 16;\n  }\n\n  /**\n   * Registers\n   *\n   * For the most part, these follows MIPS naming conventions, however the\n   * register numbers are different.\n   */\n  // $0 or $pc (program counter): pointer into `program` for the next insturction; -1 means exit\n  var $pc = 0; // $1 or $ra (return address): pointer into `program` for the return\n  _exports.$pc = $pc;\n  var $ra = 1; // $2 or $fp (frame pointer): pointer into the `evalStack` for the base of the stack\n  _exports.$ra = $ra;\n  var $fp = 2; // $3 or $sp (stack pointer): pointer into the `evalStack` for the top of the stack\n  _exports.$fp = $fp;\n  var $sp = 3; // $4-$5 or $s0-$s1 (saved): callee saved general-purpose registers\n  _exports.$sp = $sp;\n  var $s0 = 4;\n  _exports.$s0 = $s0;\n  var $s1 = 5; // $6-$7 or $t0-$t1 (temporaries): caller saved general-purpose registers\n  _exports.$s1 = $s1;\n  var $t0 = 6;\n  _exports.$t0 = $t0;\n  var $t1 = 7; // $8 or $v0 (return value)\n  _exports.$t1 = $t1;\n  var $v0 = 8;\n  _exports.$v0 = $v0;\n  function isLowLevelRegister(register) {\n    return register <= $sp;\n  }\n  var SavedRegister;\n  _exports.SavedRegister = SavedRegister;\n  (function (SavedRegister) {\n    SavedRegister[SavedRegister[\"s0\"] = 4] = \"s0\";\n    SavedRegister[SavedRegister[\"s1\"] = 5] = \"s1\";\n  })(SavedRegister || (_exports.SavedRegister = SavedRegister = {}));\n  var TemporaryRegister;\n  _exports.TemporaryRegister = TemporaryRegister;\n  (function (TemporaryRegister) {\n    TemporaryRegister[TemporaryRegister[\"t0\"] = 6] = \"t0\";\n    TemporaryRegister[TemporaryRegister[\"t1\"] = 7] = \"t1\";\n  })(TemporaryRegister || (_exports.TemporaryRegister = TemporaryRegister = {}));\n});","define(\"@glimmer/wire-format\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.getStringFromValue = getStringFromValue;\n  _exports.is = is;\n  _exports.isArgument = isArgument;\n  _exports.isAttribute = isAttribute;\n  _exports.isGet = _exports.isFlushElement = void 0;\n  _exports.isHelper = isHelper;\n  _exports.isStringLiteral = isStringLiteral;\n  function is(variant) {\n    return function (value) {\n      return Array.isArray(value) && value[0] === variant;\n    };\n  } // Statements\n\n  var isFlushElement = is(12\n  /* FlushElement */);\n  _exports.isFlushElement = isFlushElement;\n  function isAttribute(val) {\n    return val[0] === 14\n    /* StaticAttr */ || val[0] === 15\n    /* DynamicAttr */ || val[0] === 22\n    /* TrustingDynamicAttr */ || val[0] === 16\n    /* ComponentAttr */ || val[0] === 24\n    /* StaticComponentAttr */ || val[0] === 23\n    /* TrustingComponentAttr */ || val[0] === 17\n    /* AttrSplat */ || val[0] === 4\n    /* Modifier */;\n  }\n\n  function isStringLiteral(expr) {\n    return typeof expr === 'string';\n  }\n  function getStringFromValue(expr) {\n    return expr;\n  }\n  function isArgument(val) {\n    return val[0] === 21\n    /* StaticArg */ || val[0] === 20\n    /* DynamicArg */;\n  }\n\n  function isHelper(expr) {\n    return Array.isArray(expr) && expr[0] === 28\n    /* Call */;\n  } // Expressions\n\n  var isGet = is(30\n  /* GetSymbol */);\n  _exports.isGet = isGet;\n});","define(\"@simple-dom/document\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var EMPTY_ATTRS = [];\n  function indexOfAttribute(attributes, namespaceURI, localName) {\n    for (var i = 0; i < attributes.length; i++) {\n      var attr = attributes[i];\n      if (attr.namespaceURI === namespaceURI && attr.localName === localName) {\n        return i;\n      }\n    }\n    return -1;\n  }\n  function adjustAttrName(namespaceURI, localName) {\n    return namespaceURI === \"http://www.w3.org/1999/xhtml\" /* HTML */ ? localName.toLowerCase() : localName;\n  }\n  function getAttribute(attributes, namespaceURI, localName) {\n    var index = indexOfAttribute(attributes, namespaceURI, localName);\n    return index === -1 ? null : attributes[index].value;\n  }\n  function removeAttribute(attributes, namespaceURI, localName) {\n    var index = indexOfAttribute(attributes, namespaceURI, localName);\n    if (index !== -1) {\n      attributes.splice(index, 1);\n    }\n  }\n  // https://dom.spec.whatwg.org/#dom-element-setattributens\n  function setAttribute(element, namespaceURI, prefix, localName, value) {\n    if (typeof value !== 'string') {\n      value = '' + value;\n    }\n    var {\n      attributes\n    } = element;\n    if (attributes === EMPTY_ATTRS) {\n      attributes = element.attributes = [];\n    } else {\n      var index = indexOfAttribute(attributes, namespaceURI, localName);\n      if (index !== -1) {\n        attributes[index].value = value;\n        return;\n      }\n    }\n    attributes.push({\n      localName,\n      name: prefix === null ? localName : prefix + ':' + localName,\n      namespaceURI,\n      prefix,\n      specified: true,\n      value\n    });\n  }\n  class ChildNodes {\n    constructor(node) {\n      this.node = node;\n      this.stale = true;\n      this._length = 0;\n    }\n    get length() {\n      if (this.stale) {\n        this.stale = false;\n        var len = 0;\n        var child = this.node.firstChild;\n        for (; child !== null; len++) {\n          this[len] = child;\n          child = child.nextSibling;\n        }\n        var oldLen = this._length;\n        this._length = len;\n        for (; len < oldLen; len++) {\n          delete this[len];\n        }\n      }\n      return this._length;\n    }\n    item(index) {\n      return index < this.length ? this[index] : null;\n    }\n  }\n  function cloneNode(node, deep) {\n    var clone = nodeFrom(node);\n    if (deep) {\n      var child = node.firstChild;\n      var nextChild = child;\n      while (child !== null) {\n        nextChild = child.nextSibling;\n        clone.appendChild(child.cloneNode(true));\n        child = nextChild;\n      }\n    }\n    return clone;\n  }\n  function nodeFrom(node) {\n    var namespaceURI;\n    if (node.nodeType === 1 /* ELEMENT_NODE */) {\n      namespaceURI = node.namespaceURI;\n    }\n    var clone = new SimpleNodeImpl(node.ownerDocument, node.nodeType, node.nodeName, node.nodeValue, namespaceURI);\n    if (node.nodeType === 1 /* ELEMENT_NODE */) {\n      clone.attributes = copyAttrs(node.attributes);\n    }\n    return clone;\n  }\n  function copyAttrs(attrs) {\n    if (attrs === EMPTY_ATTRS) {\n      return EMPTY_ATTRS;\n    }\n    var copy = [];\n    for (var i = 0; i < attrs.length; i++) {\n      var attr = attrs[i];\n      copy.push({\n        localName: attr.localName,\n        name: attr.name,\n        namespaceURI: attr.namespaceURI,\n        prefix: attr.prefix,\n        specified: true,\n        value: attr.value\n      });\n    }\n    return copy;\n  }\n  function insertBefore(parentNode, newChild, refChild) {\n    invalidate(parentNode);\n    insertBetween(parentNode, newChild, refChild === null ? parentNode.lastChild : refChild.previousSibling, refChild);\n  }\n  function removeChild(parentNode, oldChild) {\n    invalidate(parentNode);\n    removeBetween(parentNode, oldChild, oldChild.previousSibling, oldChild.nextSibling);\n  }\n  function invalidate(parentNode) {\n    var childNodes = parentNode._childNodes;\n    if (childNodes !== undefined) {\n      childNodes.stale = true;\n    }\n  }\n  function insertBetween(parentNode, newChild, previousSibling, nextSibling) {\n    if (newChild.nodeType === 11 /* DOCUMENT_FRAGMENT_NODE */) {\n      insertFragment(newChild, parentNode, previousSibling, nextSibling);\n      return;\n    }\n    if (newChild.parentNode !== null) {\n      removeChild(newChild.parentNode, newChild);\n    }\n    newChild.parentNode = parentNode;\n    newChild.previousSibling = previousSibling;\n    newChild.nextSibling = nextSibling;\n    if (previousSibling === null) {\n      parentNode.firstChild = newChild;\n    } else {\n      previousSibling.nextSibling = newChild;\n    }\n    if (nextSibling === null) {\n      parentNode.lastChild = newChild;\n    } else {\n      nextSibling.previousSibling = newChild;\n    }\n  }\n  function removeBetween(parentNode, oldChild, previousSibling, nextSibling) {\n    oldChild.parentNode = null;\n    oldChild.previousSibling = null;\n    oldChild.nextSibling = null;\n    if (previousSibling === null) {\n      parentNode.firstChild = nextSibling;\n    } else {\n      previousSibling.nextSibling = nextSibling;\n    }\n    if (nextSibling === null) {\n      parentNode.lastChild = previousSibling;\n    } else {\n      nextSibling.previousSibling = previousSibling;\n    }\n  }\n  function insertFragment(fragment, parentNode, previousSibling, nextSibling) {\n    var firstChild = fragment.firstChild;\n    if (firstChild === null) {\n      return;\n    }\n    fragment.firstChild = null;\n    fragment.lastChild = null;\n    var lastChild = firstChild;\n    var newChild = firstChild;\n    firstChild.previousSibling = previousSibling;\n    if (previousSibling === null) {\n      parentNode.firstChild = firstChild;\n    } else {\n      previousSibling.nextSibling = firstChild;\n    }\n    while (newChild !== null) {\n      newChild.parentNode = parentNode;\n      lastChild = newChild;\n      newChild = newChild.nextSibling;\n    }\n    lastChild.nextSibling = nextSibling;\n    if (nextSibling === null) {\n      parentNode.lastChild = lastChild;\n    } else {\n      nextSibling.previousSibling = lastChild;\n    }\n  }\n  function parseQualifiedName(qualifiedName) {\n    var localName = qualifiedName;\n    var prefix = null;\n    var i = qualifiedName.indexOf(':');\n    if (i !== -1) {\n      prefix = qualifiedName.slice(0, i);\n      localName = qualifiedName.slice(i + 1);\n    }\n    return [prefix, localName];\n  }\n  class SimpleNodeImpl {\n    constructor(ownerDocument, nodeType, nodeName, nodeValue, namespaceURI) {\n      this.ownerDocument = ownerDocument;\n      this.nodeType = nodeType;\n      this.nodeName = nodeName;\n      this.nodeValue = nodeValue;\n      this.namespaceURI = namespaceURI;\n      this.parentNode = null;\n      this.previousSibling = null;\n      this.nextSibling = null;\n      this.firstChild = null;\n      this.lastChild = null;\n      this.attributes = EMPTY_ATTRS;\n      /**\n       * @internal\n       */\n      this._childNodes = undefined;\n    }\n    get tagName() {\n      return this.nodeName;\n    }\n    get childNodes() {\n      var children = this._childNodes;\n      if (children === undefined) {\n        children = this._childNodes = new ChildNodes(this);\n      }\n      return children;\n    }\n    cloneNode(deep) {\n      return cloneNode(this, deep === true);\n    }\n    appendChild(newChild) {\n      insertBefore(this, newChild, null);\n      return newChild;\n    }\n    insertBefore(newChild, refChild) {\n      insertBefore(this, newChild, refChild);\n      return newChild;\n    }\n    removeChild(oldChild) {\n      removeChild(this, oldChild);\n      return oldChild;\n    }\n    insertAdjacentHTML(position, html) {\n      var raw = new SimpleNodeImpl(this.ownerDocument, -1 /* RAW_NODE */, '#raw', html, void 0);\n      var parentNode;\n      var nextSibling;\n      switch (position) {\n        case 'beforebegin':\n          parentNode = this.parentNode;\n          nextSibling = this;\n          break;\n        case 'afterbegin':\n          parentNode = this;\n          nextSibling = this.firstChild;\n          break;\n        case 'beforeend':\n          parentNode = this;\n          nextSibling = null;\n          break;\n        case 'afterend':\n          parentNode = this.parentNode;\n          nextSibling = this.nextSibling;\n          break;\n        default:\n          throw new Error('invalid position');\n      }\n      if (parentNode === null) {\n        throw new Error(`${position} requires a parentNode`);\n      }\n      insertBefore(parentNode, raw, nextSibling);\n    }\n    getAttribute(name) {\n      var localName = adjustAttrName(this.namespaceURI, name);\n      return getAttribute(this.attributes, null, localName);\n    }\n    getAttributeNS(namespaceURI, localName) {\n      return getAttribute(this.attributes, namespaceURI, localName);\n    }\n    setAttribute(name, value) {\n      var localName = adjustAttrName(this.namespaceURI, name);\n      setAttribute(this, null, null, localName, value);\n    }\n    setAttributeNS(namespaceURI, qualifiedName, value) {\n      var [prefix, localName] = parseQualifiedName(qualifiedName);\n      setAttribute(this, namespaceURI, prefix, localName, value);\n    }\n    removeAttribute(name) {\n      var localName = adjustAttrName(this.namespaceURI, name);\n      removeAttribute(this.attributes, null, localName);\n    }\n    removeAttributeNS(namespaceURI, localName) {\n      removeAttribute(this.attributes, namespaceURI, localName);\n    }\n    get doctype() {\n      return this.firstChild;\n    }\n    get documentElement() {\n      return this.lastChild;\n    }\n    get head() {\n      return this.documentElement.firstChild;\n    }\n    get body() {\n      return this.documentElement.lastChild;\n    }\n    createElement(name) {\n      return new SimpleNodeImpl(this, 1 /* ELEMENT_NODE */, name.toUpperCase(), null, \"http://www.w3.org/1999/xhtml\" /* HTML */);\n    }\n\n    createElementNS(namespace, qualifiedName) {\n      // Node name is case-preserving in XML contexts, but returns canonical uppercase form in HTML contexts\n      // https://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#ID-104682815\n      var nodeName = namespace === \"http://www.w3.org/1999/xhtml\" /* HTML */ ? qualifiedName.toUpperCase() : qualifiedName;\n      // we don't care to parse the qualified name because we only support HTML documents\n      // which don't support prefixed elements\n      return new SimpleNodeImpl(this, 1 /* ELEMENT_NODE */, nodeName, null, namespace);\n    }\n    createTextNode(text) {\n      return new SimpleNodeImpl(this, 3 /* TEXT_NODE */, '#text', text, void 0);\n    }\n    createComment(text) {\n      return new SimpleNodeImpl(this, 8 /* COMMENT_NODE */, '#comment', text, void 0);\n    }\n    /**\n     * Backwards compat\n     * @deprecated\n     */\n    createRawHTMLSection(text) {\n      return new SimpleNodeImpl(this, -1 /* RAW_NODE */, '#raw', text, void 0);\n    }\n    createDocumentFragment() {\n      return new SimpleNodeImpl(this, 11 /* DOCUMENT_FRAGMENT_NODE */, '#document-fragment', null, void 0);\n    }\n  }\n  function createHTMLDocument() {\n    // dom.d.ts types ownerDocument as Document but for a document ownerDocument is null\n    var document = new SimpleNodeImpl(null, 9 /* DOCUMENT_NODE */, '#document', null, \"http://www.w3.org/1999/xhtml\" /* HTML */);\n    var doctype = new SimpleNodeImpl(document, 10 /* DOCUMENT_TYPE_NODE */, 'html', null, \"http://www.w3.org/1999/xhtml\" /* HTML */);\n    var html = new SimpleNodeImpl(document, 1 /* ELEMENT_NODE */, 'HTML', null, \"http://www.w3.org/1999/xhtml\" /* HTML */);\n    var head = new SimpleNodeImpl(document, 1 /* ELEMENT_NODE */, 'HEAD', null, \"http://www.w3.org/1999/xhtml\" /* HTML */);\n    var body = new SimpleNodeImpl(document, 1 /* ELEMENT_NODE */, 'BODY', null, \"http://www.w3.org/1999/xhtml\" /* HTML */);\n    html.appendChild(head);\n    html.appendChild(body);\n    document.appendChild(doctype);\n    document.appendChild(html);\n    return document;\n  }\n  var _default = createHTMLDocument;\n  _exports.default = _default;\n});","define(\"backburner\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.buildPlatform = buildPlatform;\n  _exports.default = void 0;\n  var SET_TIMEOUT = setTimeout;\n  var NOOP = () => {};\n  function buildNext(flush) {\n    // Using \"promises first\" here to:\n    //\n    // 1) Ensure more consistent experience on browsers that\n    //    have differently queued microtasks (separate queues for\n    //    MutationObserver vs Promises).\n    // 2) Ensure better debugging experiences (it shows up in Chrome\n    //    call stack as \"Promise.then (async)\") which is more consistent\n    //    with user expectations\n    //\n    // When Promise is unavailable use MutationObserver (mostly so that we\n    // still get microtasks on IE11), and when neither MutationObserver and\n    // Promise are present use a plain old setTimeout.\n    if (typeof Promise === 'function') {\n      var autorunPromise = Promise.resolve();\n      return () => autorunPromise.then(flush);\n    } else if (typeof MutationObserver === 'function') {\n      var iterations = 0;\n      var observer = new MutationObserver(flush);\n      var node = document.createTextNode('');\n      observer.observe(node, {\n        characterData: true\n      });\n      return () => {\n        iterations = ++iterations % 2;\n        node.data = '' + iterations;\n        return iterations;\n      };\n    } else {\n      return () => SET_TIMEOUT(flush, 0);\n    }\n  }\n  function buildPlatform(flush) {\n    var clearNext = NOOP;\n    return {\n      setTimeout(fn, ms) {\n        return setTimeout(fn, ms);\n      },\n      clearTimeout(timerId) {\n        return clearTimeout(timerId);\n      },\n      now() {\n        return Date.now();\n      },\n      next: buildNext(flush),\n      clearNext\n    };\n  }\n  var NUMBER = /\\d+/;\n  var TIMERS_OFFSET = 6;\n  function isCoercableNumber(suspect) {\n    var type = typeof suspect;\n    return type === 'number' && suspect === suspect || type === 'string' && NUMBER.test(suspect);\n  }\n  function getOnError(options) {\n    return options.onError || options.onErrorTarget && options.onErrorTarget[options.onErrorMethod];\n  }\n  function findItem(target, method, collection) {\n    var index = -1;\n    for (var i = 0, l = collection.length; i < l; i += 4) {\n      if (collection[i] === target && collection[i + 1] === method) {\n        index = i;\n        break;\n      }\n    }\n    return index;\n  }\n  function findTimerItem(target, method, collection) {\n    var index = -1;\n    for (var i = 2, l = collection.length; i < l; i += 6) {\n      if (collection[i] === target && collection[i + 1] === method) {\n        index = i - 2;\n        break;\n      }\n    }\n    return index;\n  }\n  function getQueueItems(items, queueItemLength, queueItemPositionOffset) {\n    if (queueItemPositionOffset === void 0) {\n      queueItemPositionOffset = 0;\n    }\n    var queueItems = [];\n    for (var i = 0; i < items.length; i += queueItemLength) {\n      var maybeError = items[i + 3 /* stack */ + queueItemPositionOffset];\n      var queueItem = {\n        target: items[i + 0 /* target */ + queueItemPositionOffset],\n        method: items[i + 1 /* method */ + queueItemPositionOffset],\n        args: items[i + 2 /* args */ + queueItemPositionOffset],\n        stack: maybeError !== undefined && 'stack' in maybeError ? maybeError.stack : ''\n      };\n      queueItems.push(queueItem);\n    }\n    return queueItems;\n  }\n  function binarySearch(time, timers) {\n    var start = 0;\n    var end = timers.length - TIMERS_OFFSET;\n    var middle;\n    var l;\n    while (start < end) {\n      // since timers is an array of pairs 'l' will always\n      // be an integer\n      l = (end - start) / TIMERS_OFFSET;\n      // compensate for the index in case even number\n      // of pairs inside timers\n      middle = start + l - l % TIMERS_OFFSET;\n      if (time >= timers[middle]) {\n        start = middle + TIMERS_OFFSET;\n      } else {\n        end = middle;\n      }\n    }\n    return time >= timers[start] ? start + TIMERS_OFFSET : start;\n  }\n  var QUEUE_ITEM_LENGTH = 4;\n  class Queue {\n    constructor(name, options, globalOptions) {\n      if (options === void 0) {\n        options = {};\n      }\n      if (globalOptions === void 0) {\n        globalOptions = {};\n      }\n      this._queueBeingFlushed = [];\n      this.targetQueues = new Map();\n      this.index = 0;\n      this._queue = [];\n      this.name = name;\n      this.options = options;\n      this.globalOptions = globalOptions;\n    }\n    stackFor(index) {\n      if (index < this._queue.length) {\n        var entry = this._queue[index * 3 + QUEUE_ITEM_LENGTH];\n        if (entry) {\n          return entry.stack;\n        } else {\n          return null;\n        }\n      }\n    }\n    flush(sync) {\n      var {\n        before,\n        after\n      } = this.options;\n      var target;\n      var method;\n      var args;\n      var errorRecordedForStack;\n      this.targetQueues.clear();\n      if (this._queueBeingFlushed.length === 0) {\n        this._queueBeingFlushed = this._queue;\n        this._queue = [];\n      }\n      if (before !== undefined) {\n        before();\n      }\n      var invoke;\n      var queueItems = this._queueBeingFlushed;\n      if (queueItems.length > 0) {\n        var onError = getOnError(this.globalOptions);\n        invoke = onError ? this.invokeWithOnError : this.invoke;\n        for (var i = this.index; i < queueItems.length; i += QUEUE_ITEM_LENGTH) {\n          this.index += QUEUE_ITEM_LENGTH;\n          method = queueItems[i + 1];\n          // method could have been nullified / canceled during flush\n          if (method !== null) {\n            //\n            //    ** Attention intrepid developer **\n            //\n            //    To find out the stack of this task when it was scheduled onto\n            //    the run loop, add the following to your app.js:\n            //\n            //    Ember.run.backburner.DEBUG = true; // NOTE: This slows your app, don't leave it on in production.\n            //\n            //    Once that is in place, when you are at a breakpoint and navigate\n            //    here in the stack explorer, you can look at `errorRecordedForStack.stack`,\n            //    which will be the captured stack when this job was scheduled.\n            //\n            //    One possible long-term solution is the following Chrome issue:\n            //       https://bugs.chromium.org/p/chromium/issues/detail?id=332624\n            //\n            target = queueItems[i];\n            args = queueItems[i + 2];\n            errorRecordedForStack = queueItems[i + 3]; // Debugging assistance\n            invoke(target, method, args, onError, errorRecordedForStack);\n          }\n          if (this.index !== this._queueBeingFlushed.length && this.globalOptions.mustYield && this.globalOptions.mustYield()) {\n            return 1 /* Pause */;\n          }\n        }\n      }\n\n      if (after !== undefined) {\n        after();\n      }\n      this._queueBeingFlushed.length = 0;\n      this.index = 0;\n      if (sync !== false && this._queue.length > 0) {\n        // check if new items have been added\n        this.flush(true);\n      }\n    }\n    hasWork() {\n      return this._queueBeingFlushed.length > 0 || this._queue.length > 0;\n    }\n    cancel(_ref) {\n      var {\n        target,\n        method\n      } = _ref;\n      var queue = this._queue;\n      var targetQueueMap = this.targetQueues.get(target);\n      if (targetQueueMap !== undefined) {\n        targetQueueMap.delete(method);\n      }\n      var index = findItem(target, method, queue);\n      if (index > -1) {\n        queue.splice(index, QUEUE_ITEM_LENGTH);\n        return true;\n      }\n      // if not found in current queue\n      // could be in the queue that is being flushed\n      queue = this._queueBeingFlushed;\n      index = findItem(target, method, queue);\n      if (index > -1) {\n        queue[index + 1] = null;\n        return true;\n      }\n      return false;\n    }\n    push(target, method, args, stack) {\n      this._queue.push(target, method, args, stack);\n      return {\n        queue: this,\n        target,\n        method\n      };\n    }\n    pushUnique(target, method, args, stack) {\n      var localQueueMap = this.targetQueues.get(target);\n      if (localQueueMap === undefined) {\n        localQueueMap = new Map();\n        this.targetQueues.set(target, localQueueMap);\n      }\n      var index = localQueueMap.get(method);\n      if (index === undefined) {\n        var queueIndex = this._queue.push(target, method, args, stack) - QUEUE_ITEM_LENGTH;\n        localQueueMap.set(method, queueIndex);\n      } else {\n        var queue = this._queue;\n        queue[index + 2] = args; // replace args\n        queue[index + 3] = stack; // replace stack\n      }\n\n      return {\n        queue: this,\n        target,\n        method\n      };\n    }\n    _getDebugInfo(debugEnabled) {\n      if (debugEnabled) {\n        var debugInfo = getQueueItems(this._queue, QUEUE_ITEM_LENGTH);\n        return debugInfo;\n      }\n      return undefined;\n    }\n    invoke(target, method, args /*, onError, errorRecordedForStack */) {\n      if (args === undefined) {\n        method.call(target);\n      } else {\n        method.apply(target, args);\n      }\n    }\n    invokeWithOnError(target, method, args, onError, errorRecordedForStack) {\n      try {\n        if (args === undefined) {\n          method.call(target);\n        } else {\n          method.apply(target, args);\n        }\n      } catch (error) {\n        onError(error, errorRecordedForStack);\n      }\n    }\n  }\n  class DeferredActionQueues {\n    constructor(queueNames, options) {\n      if (queueNames === void 0) {\n        queueNames = [];\n      }\n      this.queues = {};\n      this.queueNameIndex = 0;\n      this.queueNames = queueNames;\n      queueNames.reduce(function (queues, queueName) {\n        queues[queueName] = new Queue(queueName, options[queueName], options);\n        return queues;\n      }, this.queues);\n    }\n    /**\n     * @method schedule\n     * @param {String} queueName\n     * @param {Any} target\n     * @param {Any} method\n     * @param {Any} args\n     * @param {Boolean} onceFlag\n     * @param {Any} stack\n     * @return queue\n     */\n    schedule(queueName, target, method, args, onceFlag, stack) {\n      var queues = this.queues;\n      var queue = queues[queueName];\n      if (queue === undefined) {\n        throw new Error(`You attempted to schedule an action in a queue (${queueName}) that doesn\\'t exist`);\n      }\n      if (method === undefined || method === null) {\n        throw new Error(`You attempted to schedule an action in a queue (${queueName}) for a method that doesn\\'t exist`);\n      }\n      this.queueNameIndex = 0;\n      if (onceFlag) {\n        return queue.pushUnique(target, method, args, stack);\n      } else {\n        return queue.push(target, method, args, stack);\n      }\n    }\n    /**\n     * DeferredActionQueues.flush() calls Queue.flush()\n     *\n     * @method flush\n     * @param {Boolean} fromAutorun\n     */\n    flush(fromAutorun) {\n      if (fromAutorun === void 0) {\n        fromAutorun = false;\n      }\n      var queue;\n      var queueName;\n      var numberOfQueues = this.queueNames.length;\n      while (this.queueNameIndex < numberOfQueues) {\n        queueName = this.queueNames[this.queueNameIndex];\n        queue = this.queues[queueName];\n        if (queue.hasWork() === false) {\n          this.queueNameIndex++;\n          if (fromAutorun && this.queueNameIndex < numberOfQueues) {\n            return 1 /* Pause */;\n          }\n        } else {\n          if (queue.flush(false /* async */) === 1 /* Pause */) {\n            return 1 /* Pause */;\n          }\n        }\n      }\n    }\n    /**\n     * Returns debug information for the current queues.\n     *\n     * @method _getDebugInfo\n     * @param {Boolean} debugEnabled\n     * @returns {IDebugInfo | undefined}\n     */\n    _getDebugInfo(debugEnabled) {\n      if (debugEnabled) {\n        var debugInfo = {};\n        var queue;\n        var queueName;\n        var numberOfQueues = this.queueNames.length;\n        var i = 0;\n        while (i < numberOfQueues) {\n          queueName = this.queueNames[i];\n          queue = this.queues[queueName];\n          debugInfo[queueName] = queue._getDebugInfo(debugEnabled);\n          i++;\n        }\n        return debugInfo;\n      }\n      return;\n    }\n  }\n  function iteratorDrain(fn) {\n    var iterator = fn();\n    var result = iterator.next();\n    while (result.done === false) {\n      result.value();\n      result = iterator.next();\n    }\n  }\n  var noop = function () {};\n  var DISABLE_SCHEDULE = Object.freeze([]);\n  function parseArgs() {\n    var length = arguments.length;\n    var args;\n    var method;\n    var target;\n    if (length === 0) ;else if (length === 1) {\n      target = null;\n      method = arguments[0];\n    } else {\n      var argsIndex = 2;\n      var methodOrTarget = arguments[0];\n      var methodOrArgs = arguments[1];\n      var type = typeof methodOrArgs;\n      if (type === 'function') {\n        target = methodOrTarget;\n        method = methodOrArgs;\n      } else if (methodOrTarget !== null && type === 'string' && methodOrArgs in methodOrTarget) {\n        target = methodOrTarget;\n        method = target[methodOrArgs];\n      } else if (typeof methodOrTarget === 'function') {\n        argsIndex = 1;\n        target = null;\n        method = methodOrTarget;\n      }\n      if (length > argsIndex) {\n        var len = length - argsIndex;\n        args = new Array(len);\n        for (var i = 0; i < len; i++) {\n          args[i] = arguments[i + argsIndex];\n        }\n      }\n    }\n    return [target, method, args];\n  }\n  function parseTimerArgs() {\n    var [target, method, args] = parseArgs(...arguments);\n    var wait = 0;\n    var length = args !== undefined ? args.length : 0;\n    if (length > 0) {\n      var last = args[length - 1];\n      if (isCoercableNumber(last)) {\n        wait = parseInt(args.pop(), 10);\n      }\n    }\n    return [target, method, args, wait];\n  }\n  function parseDebounceArgs() {\n    var target;\n    var method;\n    var isImmediate;\n    var args;\n    var wait;\n    if (arguments.length === 2) {\n      method = arguments[0];\n      wait = arguments[1];\n      target = null;\n    } else {\n      [target, method, args] = parseArgs(...arguments);\n      if (args === undefined) {\n        wait = 0;\n      } else {\n        wait = args.pop();\n        if (!isCoercableNumber(wait)) {\n          isImmediate = wait === true;\n          wait = args.pop();\n        }\n      }\n    }\n    wait = parseInt(wait, 10);\n    return [target, method, args, wait, isImmediate];\n  }\n  var UUID = 0;\n  var beginCount = 0;\n  var endCount = 0;\n  var beginEventCount = 0;\n  var endEventCount = 0;\n  var runCount = 0;\n  var joinCount = 0;\n  var deferCount = 0;\n  var scheduleCount = 0;\n  var scheduleIterableCount = 0;\n  var deferOnceCount = 0;\n  var scheduleOnceCount = 0;\n  var setTimeoutCount = 0;\n  var laterCount = 0;\n  var throttleCount = 0;\n  var debounceCount = 0;\n  var cancelTimersCount = 0;\n  var cancelCount = 0;\n  var autorunsCreatedCount = 0;\n  var autorunsCompletedCount = 0;\n  var deferredActionQueuesCreatedCount = 0;\n  var nestedDeferredActionQueuesCreated = 0;\n  class Backburner {\n    constructor(queueNames, options) {\n      this.DEBUG = false;\n      this.currentInstance = null;\n      this.instanceStack = [];\n      this._eventCallbacks = {\n        end: [],\n        begin: []\n      };\n      this._timerTimeoutId = null;\n      this._timers = [];\n      this._autorun = false;\n      this._autorunStack = null;\n      this.queueNames = queueNames;\n      this.options = options || {};\n      if (typeof this.options.defaultQueue === 'string') {\n        this._defaultQueue = this.options.defaultQueue;\n      } else {\n        this._defaultQueue = this.queueNames[0];\n      }\n      this._onBegin = this.options.onBegin || noop;\n      this._onEnd = this.options.onEnd || noop;\n      this._boundRunExpiredTimers = this._runExpiredTimers.bind(this);\n      this._boundAutorunEnd = () => {\n        autorunsCompletedCount++;\n        // if the autorun was already flushed, do nothing\n        if (this._autorun === false) {\n          return;\n        }\n        this._autorun = false;\n        this._autorunStack = null;\n        this._end(true /* fromAutorun */);\n      };\n\n      var builder = this.options._buildPlatform || buildPlatform;\n      this._platform = builder(this._boundAutorunEnd);\n    }\n    get counters() {\n      return {\n        begin: beginCount,\n        end: endCount,\n        events: {\n          begin: beginEventCount,\n          end: endEventCount\n        },\n        autoruns: {\n          created: autorunsCreatedCount,\n          completed: autorunsCompletedCount\n        },\n        run: runCount,\n        join: joinCount,\n        defer: deferCount,\n        schedule: scheduleCount,\n        scheduleIterable: scheduleIterableCount,\n        deferOnce: deferOnceCount,\n        scheduleOnce: scheduleOnceCount,\n        setTimeout: setTimeoutCount,\n        later: laterCount,\n        throttle: throttleCount,\n        debounce: debounceCount,\n        cancelTimers: cancelTimersCount,\n        cancel: cancelCount,\n        loops: {\n          total: deferredActionQueuesCreatedCount,\n          nested: nestedDeferredActionQueuesCreated\n        }\n      };\n    }\n    get defaultQueue() {\n      return this._defaultQueue;\n    }\n    /*\n      @method begin\n      @return instantiated class DeferredActionQueues\n    */\n    begin() {\n      beginCount++;\n      var options = this.options;\n      var previousInstance = this.currentInstance;\n      var current;\n      if (this._autorun !== false) {\n        current = previousInstance;\n        this._cancelAutorun();\n      } else {\n        if (previousInstance !== null) {\n          nestedDeferredActionQueuesCreated++;\n          this.instanceStack.push(previousInstance);\n        }\n        deferredActionQueuesCreatedCount++;\n        current = this.currentInstance = new DeferredActionQueues(this.queueNames, options);\n        beginEventCount++;\n        this._trigger('begin', current, previousInstance);\n      }\n      this._onBegin(current, previousInstance);\n      return current;\n    }\n    end() {\n      endCount++;\n      this._end(false);\n    }\n    on(eventName, callback) {\n      if (typeof callback !== 'function') {\n        throw new TypeError(`Callback must be a function`);\n      }\n      var callbacks = this._eventCallbacks[eventName];\n      if (callbacks !== undefined) {\n        callbacks.push(callback);\n      } else {\n        throw new TypeError(`Cannot on() event ${eventName} because it does not exist`);\n      }\n    }\n    off(eventName, callback) {\n      var callbacks = this._eventCallbacks[eventName];\n      if (!eventName || callbacks === undefined) {\n        throw new TypeError(`Cannot off() event ${eventName} because it does not exist`);\n      }\n      var callbackFound = false;\n      if (callback) {\n        for (var i = 0; i < callbacks.length; i++) {\n          if (callbacks[i] === callback) {\n            callbackFound = true;\n            callbacks.splice(i, 1);\n            i--;\n          }\n        }\n      }\n      if (!callbackFound) {\n        throw new TypeError(`Cannot off() callback that does not exist`);\n      }\n    }\n    run() {\n      runCount++;\n      var [target, method, args] = parseArgs(...arguments);\n      return this._run(target, method, args);\n    }\n    join() {\n      joinCount++;\n      var [target, method, args] = parseArgs(...arguments);\n      return this._join(target, method, args);\n    }\n    /**\n     * @deprecated please use schedule instead.\n     */\n    defer(queueName, target, method) {\n      deferCount++;\n      for (var _len = arguments.length, args = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {\n        args[_key - 3] = arguments[_key];\n      }\n      return this.schedule(queueName, target, method, ...args);\n    }\n    schedule(queueName) {\n      scheduleCount++;\n      for (var _len2 = arguments.length, _args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n        _args[_key2 - 1] = arguments[_key2];\n      }\n      var [target, method, args] = parseArgs(..._args);\n      var stack = this.DEBUG ? new Error() : undefined;\n      return this._ensureInstance().schedule(queueName, target, method, args, false, stack);\n    }\n    /*\n      Defer the passed iterable of functions to run inside the specified queue.\n         @method scheduleIterable\n      @param {String} queueName\n      @param {Iterable} an iterable of functions to execute\n      @return method result\n    */\n    scheduleIterable(queueName, iterable) {\n      scheduleIterableCount++;\n      var stack = this.DEBUG ? new Error() : undefined;\n      return this._ensureInstance().schedule(queueName, null, iteratorDrain, [iterable], false, stack);\n    }\n    /**\n     * @deprecated please use scheduleOnce instead.\n     */\n    deferOnce(queueName, target, method) {\n      deferOnceCount++;\n      for (var _len3 = arguments.length, args = new Array(_len3 > 3 ? _len3 - 3 : 0), _key3 = 3; _key3 < _len3; _key3++) {\n        args[_key3 - 3] = arguments[_key3];\n      }\n      return this.scheduleOnce(queueName, target, method, ...args);\n    }\n    scheduleOnce(queueName) {\n      scheduleOnceCount++;\n      for (var _len4 = arguments.length, _args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {\n        _args[_key4 - 1] = arguments[_key4];\n      }\n      var [target, method, args] = parseArgs(..._args);\n      var stack = this.DEBUG ? new Error() : undefined;\n      return this._ensureInstance().schedule(queueName, target, method, args, true, stack);\n    }\n    setTimeout() {\n      setTimeoutCount++;\n      return this.later(...arguments);\n    }\n    later() {\n      laterCount++;\n      var [target, method, args, wait] = parseTimerArgs(...arguments);\n      return this._later(target, method, args, wait);\n    }\n    throttle() {\n      throttleCount++;\n      var [target, method, args, wait, isImmediate = true] = parseDebounceArgs(...arguments);\n      var index = findTimerItem(target, method, this._timers);\n      var timerId;\n      if (index === -1) {\n        timerId = this._later(target, method, isImmediate ? DISABLE_SCHEDULE : args, wait);\n        if (isImmediate) {\n          this._join(target, method, args);\n        }\n      } else {\n        timerId = this._timers[index + 1];\n        var argIndex = index + 4;\n        if (this._timers[argIndex] !== DISABLE_SCHEDULE) {\n          this._timers[argIndex] = args;\n        }\n      }\n      return timerId;\n    }\n    debounce() {\n      debounceCount++;\n      var [target, method, args, wait, isImmediate = false] = parseDebounceArgs(...arguments);\n      var _timers = this._timers;\n      var index = findTimerItem(target, method, _timers);\n      var timerId;\n      if (index === -1) {\n        timerId = this._later(target, method, isImmediate ? DISABLE_SCHEDULE : args, wait);\n        if (isImmediate) {\n          this._join(target, method, args);\n        }\n      } else {\n        var executeAt = this._platform.now() + wait;\n        var argIndex = index + 4;\n        if (_timers[argIndex] === DISABLE_SCHEDULE) {\n          args = DISABLE_SCHEDULE;\n        }\n        timerId = _timers[index + 1];\n        var i = binarySearch(executeAt, _timers);\n        if (index + TIMERS_OFFSET === i) {\n          _timers[index] = executeAt;\n          _timers[argIndex] = args;\n        } else {\n          var stack = this._timers[index + 5];\n          this._timers.splice(i, 0, executeAt, timerId, target, method, args, stack);\n          this._timers.splice(index, TIMERS_OFFSET);\n        }\n        if (index === 0) {\n          this._reinstallTimerTimeout();\n        }\n      }\n      return timerId;\n    }\n    cancelTimers() {\n      cancelTimersCount++;\n      this._clearTimerTimeout();\n      this._timers = [];\n      this._cancelAutorun();\n    }\n    hasTimers() {\n      return this._timers.length > 0 || this._autorun;\n    }\n    cancel(timer) {\n      cancelCount++;\n      if (timer === null || timer === undefined) {\n        return false;\n      }\n      var timerType = typeof timer;\n      if (timerType === 'number') {\n        // we're cancelling a setTimeout or throttle or debounce\n        return this._cancelLaterTimer(timer);\n      } else if (timerType === 'object' && timer.queue && timer.method) {\n        // we're cancelling a deferOnce\n        return timer.queue.cancel(timer);\n      }\n      return false;\n    }\n    ensureInstance() {\n      this._ensureInstance();\n    }\n    /**\n     * Returns debug information related to the current instance of Backburner\n     *\n     * @method getDebugInfo\n     * @returns {Object | undefined} Will return and Object containing debug information if\n     * the DEBUG flag is set to true on the current instance of Backburner, else undefined.\n     */\n    getDebugInfo() {\n      if (this.DEBUG) {\n        return {\n          autorun: this._autorunStack,\n          counters: this.counters,\n          timers: getQueueItems(this._timers, TIMERS_OFFSET, 2),\n          instanceStack: [this.currentInstance, ...this.instanceStack].map(deferredActionQueue => deferredActionQueue && deferredActionQueue._getDebugInfo(this.DEBUG))\n        };\n      }\n      return undefined;\n    }\n    _end(fromAutorun) {\n      var currentInstance = this.currentInstance;\n      var nextInstance = null;\n      if (currentInstance === null) {\n        throw new Error(`end called without begin`);\n      }\n      // Prevent double-finally bug in Safari 6.0.2 and iOS 6\n      // This bug appears to be resolved in Safari 6.0.5 and iOS 7\n      var finallyAlreadyCalled = false;\n      var result;\n      try {\n        result = currentInstance.flush(fromAutorun);\n      } finally {\n        if (!finallyAlreadyCalled) {\n          finallyAlreadyCalled = true;\n          if (result === 1 /* Pause */) {\n            var plannedNextQueue = this.queueNames[currentInstance.queueNameIndex];\n            this._scheduleAutorun(plannedNextQueue);\n          } else {\n            this.currentInstance = null;\n            if (this.instanceStack.length > 0) {\n              nextInstance = this.instanceStack.pop();\n              this.currentInstance = nextInstance;\n            }\n            this._trigger('end', currentInstance, nextInstance);\n            this._onEnd(currentInstance, nextInstance);\n          }\n        }\n      }\n    }\n    _join(target, method, args) {\n      if (this.currentInstance === null) {\n        return this._run(target, method, args);\n      }\n      if (target === undefined && args === undefined) {\n        return method();\n      } else {\n        return method.apply(target, args);\n      }\n    }\n    _run(target, method, args) {\n      var onError = getOnError(this.options);\n      this.begin();\n      if (onError) {\n        try {\n          return method.apply(target, args);\n        } catch (error) {\n          onError(error);\n        } finally {\n          this.end();\n        }\n      } else {\n        try {\n          return method.apply(target, args);\n        } finally {\n          this.end();\n        }\n      }\n    }\n    _cancelAutorun() {\n      if (this._autorun) {\n        this._platform.clearNext();\n        this._autorun = false;\n        this._autorunStack = null;\n      }\n    }\n    _later(target, method, args, wait) {\n      var stack = this.DEBUG ? new Error() : undefined;\n      var executeAt = this._platform.now() + wait;\n      var id = UUID++;\n      if (this._timers.length === 0) {\n        this._timers.push(executeAt, id, target, method, args, stack);\n        this._installTimerTimeout();\n      } else {\n        // find position to insert\n        var i = binarySearch(executeAt, this._timers);\n        this._timers.splice(i, 0, executeAt, id, target, method, args, stack);\n        // always reinstall since it could be out of sync\n        this._reinstallTimerTimeout();\n      }\n      return id;\n    }\n    _cancelLaterTimer(timer) {\n      for (var i = 1; i < this._timers.length; i += TIMERS_OFFSET) {\n        if (this._timers[i] === timer) {\n          this._timers.splice(i - 1, TIMERS_OFFSET);\n          if (i === 1) {\n            this._reinstallTimerTimeout();\n          }\n          return true;\n        }\n      }\n      return false;\n    }\n    /**\n     Trigger an event. Supports up to two arguments. Designed around\n     triggering transition events from one run loop instance to the\n     next, which requires an argument for the  instance and then\n     an argument for the next instance.\n        @private\n     @method _trigger\n     @param {String} eventName\n     @param {any} arg1\n     @param {any} arg2\n     */\n    _trigger(eventName, arg1, arg2) {\n      var callbacks = this._eventCallbacks[eventName];\n      if (callbacks !== undefined) {\n        for (var i = 0; i < callbacks.length; i++) {\n          callbacks[i](arg1, arg2);\n        }\n      }\n    }\n    _runExpiredTimers() {\n      this._timerTimeoutId = null;\n      if (this._timers.length > 0) {\n        this.begin();\n        this._scheduleExpiredTimers();\n        this.end();\n      }\n    }\n    _scheduleExpiredTimers() {\n      var timers = this._timers;\n      var i = 0;\n      var l = timers.length;\n      var defaultQueue = this._defaultQueue;\n      var n = this._platform.now();\n      for (; i < l; i += TIMERS_OFFSET) {\n        var executeAt = timers[i];\n        if (executeAt > n) {\n          break;\n        }\n        var args = timers[i + 4];\n        if (args !== DISABLE_SCHEDULE) {\n          var target = timers[i + 2];\n          var method = timers[i + 3];\n          var stack = timers[i + 5];\n          this.currentInstance.schedule(defaultQueue, target, method, args, false, stack);\n        }\n      }\n      timers.splice(0, i);\n      this._installTimerTimeout();\n    }\n    _reinstallTimerTimeout() {\n      this._clearTimerTimeout();\n      this._installTimerTimeout();\n    }\n    _clearTimerTimeout() {\n      if (this._timerTimeoutId === null) {\n        return;\n      }\n      this._platform.clearTimeout(this._timerTimeoutId);\n      this._timerTimeoutId = null;\n    }\n    _installTimerTimeout() {\n      if (this._timers.length === 0) {\n        return;\n      }\n      var minExpiresAt = this._timers[0];\n      var n = this._platform.now();\n      var wait = Math.max(0, minExpiresAt - n);\n      this._timerTimeoutId = this._platform.setTimeout(this._boundRunExpiredTimers, wait);\n    }\n    _ensureInstance() {\n      var currentInstance = this.currentInstance;\n      if (currentInstance === null) {\n        this._autorunStack = this.DEBUG ? new Error() : undefined;\n        currentInstance = this.begin();\n        this._scheduleAutorun(this.queueNames[0]);\n      }\n      return currentInstance;\n    }\n    _scheduleAutorun(plannedNextQueue) {\n      autorunsCreatedCount++;\n      var next = this._platform.next;\n      var flush = this.options.flush;\n      if (flush) {\n        flush(plannedNextQueue, next);\n      } else {\n        next();\n      }\n      this._autorun = true;\n    }\n  }\n  Backburner.Queue = Queue;\n  Backburner.buildPlatform = buildPlatform;\n  Backburner.buildNext = buildNext;\n  var _default = Backburner;\n  _exports.default = _default;\n});","define(\"dag-map\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n   * A topologically ordered map of key/value pairs with a simple API for adding constraints.\n   *\n   * Edges can forward reference keys that have not been added yet (the forward reference will\n   * map the key to undefined).\n   */\n  var DAG = function () {\n    function DAG() {\n      this._vertices = new Vertices();\n    }\n    /**\n     * Adds a key/value pair with dependencies on other key/value pairs.\n     *\n     * @public\n     * @param key    The key of the vertex to be added.\n     * @param value  The value of that vertex.\n     * @param before A key or array of keys of the vertices that must\n     *               be visited before this vertex.\n     * @param after  An string or array of strings with the keys of the\n     *               vertices that must be after this vertex is visited.\n     */\n    DAG.prototype.add = function (key, value, before, after) {\n      if (!key) throw new Error('argument `key` is required');\n      var vertices = this._vertices;\n      var v = vertices.add(key);\n      v.val = value;\n      if (before) {\n        if (typeof before === \"string\") {\n          vertices.addEdge(v, vertices.add(before));\n        } else {\n          for (var i = 0; i < before.length; i++) {\n            vertices.addEdge(v, vertices.add(before[i]));\n          }\n        }\n      }\n      if (after) {\n        if (typeof after === \"string\") {\n          vertices.addEdge(vertices.add(after), v);\n        } else {\n          for (var i = 0; i < after.length; i++) {\n            vertices.addEdge(vertices.add(after[i]), v);\n          }\n        }\n      }\n    };\n    /**\n     * @deprecated please use add.\n     */\n    DAG.prototype.addEdges = function (key, value, before, after) {\n      this.add(key, value, before, after);\n    };\n    /**\n     * Visits key/value pairs in topological order.\n     *\n     * @public\n     * @param callback The function to be invoked with each key/value.\n     */\n    DAG.prototype.each = function (callback) {\n      this._vertices.walk(callback);\n    };\n    /**\n     * @deprecated please use each.\n     */\n    DAG.prototype.topsort = function (callback) {\n      this.each(callback);\n    };\n    return DAG;\n  }();\n  var _default = DAG;\n  /** @private */\n  _exports.default = _default;\n  var Vertices = function () {\n    function Vertices() {\n      this.length = 0;\n      this.stack = new IntStack();\n      this.path = new IntStack();\n      this.result = new IntStack();\n    }\n    Vertices.prototype.add = function (key) {\n      if (!key) throw new Error(\"missing key\");\n      var l = this.length | 0;\n      var vertex;\n      for (var i = 0; i < l; i++) {\n        vertex = this[i];\n        if (vertex.key === key) return vertex;\n      }\n      this.length = l + 1;\n      return this[l] = {\n        idx: l,\n        key: key,\n        val: undefined,\n        out: false,\n        flag: false,\n        length: 0\n      };\n    };\n    Vertices.prototype.addEdge = function (v, w) {\n      this.check(v, w.key);\n      var l = w.length | 0;\n      for (var i = 0; i < l; i++) {\n        if (w[i] === v.idx) return;\n      }\n      w.length = l + 1;\n      w[l] = v.idx;\n      v.out = true;\n    };\n    Vertices.prototype.walk = function (cb) {\n      this.reset();\n      for (var i = 0; i < this.length; i++) {\n        var vertex = this[i];\n        if (vertex.out) continue;\n        this.visit(vertex, \"\");\n      }\n      this.each(this.result, cb);\n    };\n    Vertices.prototype.check = function (v, w) {\n      if (v.key === w) {\n        throw new Error(\"cycle detected: \" + w + \" <- \" + w);\n      }\n      // quick check\n      if (v.length === 0) return;\n      // shallow check\n      for (var i = 0; i < v.length; i++) {\n        var key = this[v[i]].key;\n        if (key === w) {\n          throw new Error(\"cycle detected: \" + w + \" <- \" + v.key + \" <- \" + w);\n        }\n      }\n      // deep check\n      this.reset();\n      this.visit(v, w);\n      if (this.path.length > 0) {\n        var msg_1 = \"cycle detected: \" + w;\n        this.each(this.path, function (key) {\n          msg_1 += \" <- \" + key;\n        });\n        throw new Error(msg_1);\n      }\n    };\n    Vertices.prototype.reset = function () {\n      this.stack.length = 0;\n      this.path.length = 0;\n      this.result.length = 0;\n      for (var i = 0, l = this.length; i < l; i++) {\n        this[i].flag = false;\n      }\n    };\n    Vertices.prototype.visit = function (start, search) {\n      var _a = this,\n        stack = _a.stack,\n        path = _a.path,\n        result = _a.result;\n      stack.push(start.idx);\n      while (stack.length) {\n        var index = stack.pop() | 0;\n        if (index >= 0) {\n          // enter\n          var vertex = this[index];\n          if (vertex.flag) continue;\n          vertex.flag = true;\n          path.push(index);\n          if (search === vertex.key) break;\n          // push exit\n          stack.push(~index);\n          this.pushIncoming(vertex);\n        } else {\n          // exit\n          path.pop();\n          result.push(~index);\n        }\n      }\n    };\n    Vertices.prototype.pushIncoming = function (incomming) {\n      var stack = this.stack;\n      for (var i = incomming.length - 1; i >= 0; i--) {\n        var index = incomming[i];\n        if (!this[index].flag) {\n          stack.push(index);\n        }\n      }\n    };\n    Vertices.prototype.each = function (indices, cb) {\n      for (var i = 0, l = indices.length; i < l; i++) {\n        var vertex = this[indices[i]];\n        cb(vertex.key, vertex.val);\n      }\n    };\n    return Vertices;\n  }();\n  /** @private */\n  var IntStack = function () {\n    function IntStack() {\n      this.length = 0;\n    }\n    IntStack.prototype.push = function (n) {\n      this[this.length++] = n | 0;\n    };\n    IntStack.prototype.pop = function () {\n      return this[--this.length] | 0;\n    };\n    return IntStack;\n  }();\n});","define(\"ember-babel\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.assertThisInitialized = assertThisInitialized;\n  _exports.classCallCheck = classCallCheck;\n  _exports.createClass = createClass;\n  _exports.createForOfIteratorHelperLoose = createForOfIteratorHelperLoose;\n  _exports.createSuper = createSuper;\n  _exports.inheritsLoose = inheritsLoose;\n  _exports.objectDestructuringEmpty = objectDestructuringEmpty;\n  _exports.possibleConstructorReturn = possibleConstructorReturn;\n  _exports.taggedTemplateLiteralLoose = taggedTemplateLiteralLoose;\n  _exports.wrapNativeSuper = wrapNativeSuper;\n  /* globals Reflect */\n\n  var setPrototypeOf = Object.setPrototypeOf;\n  var getPrototypeOf = Object.getPrototypeOf;\n  var hasReflectConstruct = typeof Reflect === 'object' && typeof Reflect.construct === 'function';\n  var nativeWrapperCache = new Map();\n\n  // Super minimal version of Babel's wrapNativeSuper. We only use this for\n  // extending Function, for ComputedDecoratorImpl and AliasDecoratorImpl. We know\n  // we will never directly create an instance of these classes so no need to\n  // include `construct` code or other helpers.\n  function wrapNativeSuper(Class) {\n    if (nativeWrapperCache.has(Class)) {\n      return nativeWrapperCache.get(Class);\n    }\n    function Wrapper() {}\n    Wrapper.prototype = Object.create(Class.prototype, {\n      constructor: {\n        value: Wrapper,\n        enumerable: false,\n        writable: true,\n        configurable: true\n      }\n    });\n    nativeWrapperCache.set(Class, Wrapper);\n    return setPrototypeOf(Wrapper, Class);\n  }\n  function classCallCheck(instance, Constructor) {\n    if (true /* DEBUG */) {\n      if (!(instance instanceof Constructor)) {\n        throw new TypeError('Cannot call a class as a function');\n      }\n    }\n  }\n\n  /*\n    Overrides default `inheritsLoose` to _also_ call `Object.setPrototypeOf`.\n    This is needed so that we can use `loose` option with the\n    `@babel/plugin-transform-classes` (because we want simple assignment to the\n    prototype wherever possible) but also keep our constructor based prototypal\n    inheritance working properly\n  */\n  function inheritsLoose(subClass, superClass) {\n    if (true /* DEBUG */) {\n      if (typeof superClass !== 'function' && superClass !== null) {\n        throw new TypeError('Super expression must either be null or a function');\n      }\n    }\n    subClass.prototype = Object.create(superClass === null ? null : superClass.prototype, {\n      constructor: {\n        value: subClass,\n        writable: true,\n        configurable: true\n      }\n    });\n    if (superClass !== null) {\n      setPrototypeOf(subClass, superClass);\n    }\n  }\n  function taggedTemplateLiteralLoose(strings, raw) {\n    if (!raw) {\n      raw = strings.slice(0);\n    }\n    strings.raw = raw;\n    return strings;\n  }\n  function _defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if ('value' in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  /*\n    Differs from default implementation by avoiding boolean coercion of\n    `protoProps` and `staticProps`.\n  */\n  function createClass(Constructor, protoProps, staticProps) {\n    if (protoProps !== null && protoProps !== undefined) {\n      _defineProperties(Constructor.prototype, protoProps);\n    }\n    if (staticProps !== null && staticProps !== undefined) {\n      _defineProperties(Constructor, staticProps);\n    }\n    return Constructor;\n  }\n  function assertThisInitialized(self) {\n    if (true /* DEBUG */ && self === void 0) {\n      throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n    }\n    return self;\n  }\n\n  /*\n    Adds `DEBUG` guard to error being thrown, and avoids boolean coercion of `call`.\n  */\n  function possibleConstructorReturn(self, call) {\n    if (typeof call === 'object' && call !== null || typeof call === 'function') {\n      return call;\n    }\n    return assertThisInitialized(self);\n  }\n  function objectDestructuringEmpty(obj) {\n    if (true /* DEBUG */ && (obj === null || obj === undefined)) {\n      throw new TypeError('Cannot destructure undefined');\n    }\n  }\n\n  /*\n    Differs from default implementation by checking for _any_ `Reflect.construct`\n    (the default implementation tries to ensure that `Reflect.construct` is truly\n    the native one).\n  \n    Original source: https://github.com/babel/babel/blob/v7.9.2/packages/babel-helpers/src/helpers.js#L738-L757\n  */\n  function createSuper(Derived) {\n    return function () {\n      var Super = getPrototypeOf(Derived);\n      var result;\n      if (hasReflectConstruct) {\n        // NOTE: This doesn't work if this.__proto__.constructor has been modified.\n        var NewTarget = getPrototypeOf(this).constructor;\n        result = Reflect.construct(Super, arguments, NewTarget);\n      } else {\n        result = Super.apply(this, arguments);\n      }\n      return possibleConstructorReturn(this, result);\n    };\n  }\n\n  /*\n    Does not differ from default implementation.\n  */\n  function arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    var arr2 = new Array(len);\n    for (var i = 0; i < len; i++) {\n      arr2[i] = arr[i];\n    }\n    return arr2;\n  }\n\n  /*\n    Does not differ from default implementation.\n  */\n  function unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === 'string') return arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === 'Object' && o.constructor) n = o.constructor.name;\n    if (n === 'Map' || n === 'Set') return Array.from(n);\n    if (n === 'Arguments' || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n  }\n\n  /*\n    Does not differ from default implementation.\n  */\n  function createForOfIteratorHelperLoose(o) {\n    var i = 0;\n    if (typeof Symbol === 'undefined' || o[Symbol.iterator] == null) {\n      // Fallback for engines without symbol support\n      if (Array.isArray(o) || (o = unsupportedIterableToArray(o))) return function () {\n        if (i >= o.length) return {\n          done: true\n        };\n        return {\n          done: false,\n          value: o[i++]\n        };\n      };\n      throw new TypeError('Invalid attempt to iterate non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.');\n    }\n    i = o[Symbol.iterator]();\n    return i.next.bind(i);\n  }\n});","define(\"ember-testing/index\", [\"exports\", \"ember-testing/lib/test\", \"ember-testing/lib/adapters/adapter\", \"ember-testing/lib/setup_for_testing\", \"ember-testing/lib/adapters/qunit\", \"ember-testing/lib/ext/application\", \"ember-testing/lib/ext/rsvp\", \"ember-testing/lib/helpers\", \"ember-testing/lib/initializers\"], function (_exports, _test, _adapter, _setup_for_testing, _qunit, _application, _rsvp, _helpers, _initializers) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"Adapter\", {\n    enumerable: true,\n    get: function () {\n      return _adapter.default;\n    }\n  });\n  Object.defineProperty(_exports, \"QUnitAdapter\", {\n    enumerable: true,\n    get: function () {\n      return _qunit.default;\n    }\n  });\n  Object.defineProperty(_exports, \"Test\", {\n    enumerable: true,\n    get: function () {\n      return _test.default;\n    }\n  });\n  Object.defineProperty(_exports, \"setupForTesting\", {\n    enumerable: true,\n    get: function () {\n      return _setup_for_testing.default;\n    }\n  });\n});","define(\"ember-testing/lib/adapters/adapter\", [\"exports\", \"@ember/object\"], function (_exports, _object) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var Adapter = _object.default.extend({\n    /**\n      This callback will be called whenever an async operation is about to start.\n         Override this to call your framework's methods that handle async\n      operations.\n         @public\n      @method asyncStart\n    */\n    asyncStart() {},\n    /**\n      This callback will be called whenever an async operation has completed.\n         @public\n      @method asyncEnd\n    */\n    asyncEnd() {},\n    /**\n      Override this method with your testing framework's false assertion.\n      This function is called whenever an exception occurs causing the testing\n      promise to fail.\n         QUnit example:\n         ```javascript\n        exception: function(error) {\n          ok(false, error);\n        };\n      ```\n         @public\n      @method exception\n      @param {String} error The exception to be raised.\n    */\n    exception(error) {\n      throw error;\n    }\n  });\n  var _default = Adapter;\n  _exports.default = _default;\n});","define(\"ember-testing/lib/adapters/qunit\", [\"exports\", \"@ember/debug\", \"ember-testing/lib/adapters/adapter\"], function (_exports, _debug, _adapter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /* globals QUnit */\n\n  function isVeryOldQunit(obj) {\n    return obj != null && typeof obj.stop === 'function';\n  }\n  var QUnitAdapter = _adapter.default.extend({\n    init() {\n      this.doneCallbacks = [];\n    },\n    asyncStart() {\n      if (isVeryOldQunit(QUnit)) {\n        // very old QUnit version\n        // eslint-disable-next-line qunit/no-qunit-stop\n        QUnit.stop();\n      } else {\n        this.doneCallbacks.push(QUnit.config.current ? QUnit.config.current.assert.async() : null);\n      }\n    },\n    asyncEnd() {\n      // checking for QUnit.stop here (even though we _need_ QUnit.start) because\n      // QUnit.start() still exists in QUnit 2.x (it just throws an error when calling\n      // inside a test context)\n      if (isVeryOldQunit(QUnit)) {\n        QUnit.start();\n      } else {\n        var done = this.doneCallbacks.pop();\n        // This can be null if asyncStart() was called outside of a test\n        if (done) {\n          done();\n        }\n      }\n    },\n    exception(error) {\n      QUnit.config.current.assert.ok(false, (0, _debug.inspect)(error));\n    }\n  });\n  var _default = QUnitAdapter;\n  _exports.default = _default;\n});","define(\"ember-testing/lib/ext/application\", [\"@ember/application\", \"ember-testing/lib/setup_for_testing\", \"ember-testing/lib/test/helpers\", \"ember-testing/lib/test/promise\", \"ember-testing/lib/test/run\", \"ember-testing/lib/test/on_inject_helpers\", \"ember-testing/lib/test/adapter\", \"@ember/debug\"], function (_application, _setup_for_testing, _helpers, _promise, _run, _on_inject_helpers, _adapter, _debug) {\n  \"use strict\";\n\n  _application.default.reopen({\n    /**\n     This property contains the testing helpers for the current application. These\n     are created once you call `injectTestHelpers` on your `Application`\n     instance. The included helpers are also available on the `window` object by\n     default, but can be used from this object on the individual application also.\n         @property testHelpers\n      @type {Object}\n      @default {}\n      @public\n    */\n    testHelpers: {},\n    /**\n     This property will contain the original methods that were registered\n     on the `helperContainer` before `injectTestHelpers` is called.\n        When `removeTestHelpers` is called, these methods are restored to the\n     `helperContainer`.\n         @property originalMethods\n      @type {Object}\n      @default {}\n      @private\n      @since 1.3.0\n    */\n    originalMethods: {},\n    /**\n    This property indicates whether or not this application is currently in\n    testing mode. This is set when `setupForTesting` is called on the current\n    application.\n       @property testing\n    @type {Boolean}\n    @default false\n    @since 1.3.0\n    @public\n    */\n    testing: false,\n    /**\n      This hook defers the readiness of the application, so that you can start\n      the app when your tests are ready to run. It also sets the router's\n      location to 'none', so that the window's location will not be modified\n      (preventing both accidental leaking of state between tests and interference\n      with your testing framework). `setupForTesting` should only be called after\n      setting a custom `router` class (for example `App.Router = Router.extend(`).\n         Example:\n         ```\n      App.setupForTesting();\n      ```\n         @method setupForTesting\n      @public\n    */\n    setupForTesting() {\n      (0, _setup_for_testing.default)();\n      this.testing = true;\n      this.resolveRegistration('router:main').reopen({\n        location: 'none'\n      });\n    },\n    /**\n      This will be used as the container to inject the test helpers into. By\n      default the helpers are injected into `window`.\n         @property helperContainer\n      @type {Object} The object to be used for test helpers.\n      @default window\n      @since 1.2.0\n      @private\n    */\n    helperContainer: null,\n    /**\n      This injects the test helpers into the `helperContainer` object. If an object is provided\n      it will be used as the helperContainer. If `helperContainer` is not set it will default\n      to `window`. If a function of the same name has already been defined it will be cached\n      (so that it can be reset if the helper is removed with `unregisterHelper` or\n      `removeTestHelpers`).\n         Any callbacks registered with `onInjectHelpers` will be called once the\n      helpers have been injected.\n         Example:\n      ```\n      App.injectTestHelpers();\n      ```\n         @method injectTestHelpers\n      @public\n    */\n    injectTestHelpers(helperContainer) {\n      if (helperContainer) {\n        this.helperContainer = helperContainer;\n      } else {\n        this.helperContainer = window;\n      }\n      this.reopen({\n        willDestroy() {\n          this._super(...arguments);\n          this.removeTestHelpers();\n        }\n      });\n      this.testHelpers = {};\n      for (var name in _helpers.helpers) {\n        // SAFETY: It is safe to access a property on an object\n        this.originalMethods[name] = this.helperContainer[name];\n        // SAFETY: It is not quite as safe to do this, but it _seems_ to be ok.\n        this.testHelpers[name] = this.helperContainer[name] = helper(this, name);\n        // SAFETY: We checked that it exists\n        protoWrap(_promise.default.prototype, name, helper(this, name), _helpers.helpers[name].meta.wait);\n      }\n      (0, _on_inject_helpers.invokeInjectHelpersCallbacks)(this);\n    },\n    /**\n      This removes all helpers that have been registered, and resets and functions\n      that were overridden by the helpers.\n         Example:\n         ```javascript\n      App.removeTestHelpers();\n      ```\n         @public\n      @method removeTestHelpers\n    */\n    removeTestHelpers() {\n      if (!this.helperContainer) {\n        return;\n      }\n      for (var name in _helpers.helpers) {\n        this.helperContainer[name] = this.originalMethods[name];\n        // SAFETY: This is a weird thing, but it's not technically unsafe here.\n        delete _promise.default.prototype[name];\n        delete this.testHelpers[name];\n        delete this.originalMethods[name];\n      }\n    }\n  });\n  // This method is no longer needed\n  // But still here for backwards compatibility\n  // of helper chaining\n  function protoWrap(proto, name, callback, isAsync) {\n    // SAFETY: This isn't entirely safe, but it _seems_ to be ok.\n    proto[name] = function () {\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n      if (isAsync) {\n        return callback.apply(this, args);\n      } else {\n        // SAFETY: This is not actually safe.\n        return this.then(function () {\n          return callback.apply(this, args);\n        });\n      }\n    };\n  }\n  function helper(app, name) {\n    var helper = _helpers.helpers[name];\n    (true && !(helper) && (0, _debug.assert)(`[BUG] Missing helper: ${name}`, helper));\n    var fn = helper.method;\n    var meta = helper.meta;\n    if (!meta.wait) {\n      return function () {\n        for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n          args[_key2] = arguments[_key2];\n        }\n        return fn.apply(app, [app, ...args]);\n      };\n    }\n    return function () {\n      for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n        args[_key3] = arguments[_key3];\n      }\n      var lastPromise = (0, _run.default)(() => (0, _promise.resolve)((0, _promise.getLastPromise)()));\n      // wait for last helper's promise to resolve and then\n      // execute. To be safe, we need to tell the adapter we're going\n      // asynchronous here, because fn may not be invoked before we\n      // return.\n      (0, _adapter.asyncStart)();\n      return lastPromise.then(() => fn.apply(app, [app, ...args])).finally(_adapter.asyncEnd);\n    };\n  }\n});","define(\"ember-testing/lib/ext/rsvp\", [\"exports\", \"@ember/-internals/runtime\", \"@ember/runloop\", \"@ember/debug\", \"ember-testing/lib/test/adapter\"], function (_exports, _runtime, _runloop, _debug, _adapter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _runtime.RSVP.configure('async', function (callback, promise) {\n    // if schedule will cause autorun, we need to inform adapter\n    if ((0, _debug.isTesting)() && !_runloop._backburner.currentInstance) {\n      (0, _adapter.asyncStart)();\n      _runloop._backburner.schedule('actions', () => {\n        (0, _adapter.asyncEnd)();\n        callback(promise);\n      });\n    } else {\n      _runloop._backburner.schedule('actions', () => callback(promise));\n    }\n  });\n  var _default = _runtime.RSVP;\n  _exports.default = _default;\n});","define(\"ember-testing/lib/helpers\", [\"ember-testing/lib/test/helpers\", \"ember-testing/lib/helpers/and_then\", \"ember-testing/lib/helpers/current_path\", \"ember-testing/lib/helpers/current_route_name\", \"ember-testing/lib/helpers/current_url\", \"ember-testing/lib/helpers/pause_test\", \"ember-testing/lib/helpers/visit\", \"ember-testing/lib/helpers/wait\"], function (_helpers, _and_then, _current_path, _current_route_name, _current_url, _pause_test, _visit, _wait) {\n  \"use strict\";\n\n  (0, _helpers.registerAsyncHelper)('visit', _visit.default);\n  (0, _helpers.registerAsyncHelper)('wait', _wait.default);\n  (0, _helpers.registerAsyncHelper)('andThen', _and_then.default);\n  (0, _helpers.registerAsyncHelper)('pauseTest', _pause_test.pauseTest);\n  (0, _helpers.registerHelper)('currentRouteName', _current_route_name.default);\n  (0, _helpers.registerHelper)('currentPath', _current_path.default);\n  (0, _helpers.registerHelper)('currentURL', _current_url.default);\n  (0, _helpers.registerHelper)('resumeTest', _pause_test.resumeTest);\n});","define(\"ember-testing/lib/helpers/and_then\", [\"exports\", \"@ember/debug\"], function (_exports, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = andThen;\n  function andThen(app, callback) {\n    var wait = app.testHelpers['wait'];\n    (true && !(wait) && (0, _debug.assert)('[BUG] Missing wait helper', wait));\n    return wait(callback(app));\n  }\n});","define(\"ember-testing/lib/helpers/current_path\", [\"exports\", \"@ember/object\", \"@ember/routing/-internals\", \"@ember/debug\"], function (_exports, _object, _internals, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = currentPath;\n  /**\n  @module ember\n  */\n\n  /**\n    Returns the current path.\n  \n  Example:\n  \n  ```javascript\n  function validateURL() {\n    equal(currentPath(), 'some.path.index', \"correct path was transitioned into.\");\n  }\n  \n  click('#some-link-id').then(validateURL);\n  ```\n  \n  @method currentPath\n  @return {Object} The currently active path.\n  @since 1.5.0\n  @public\n  */\n  function currentPath(app) {\n    (true && !(app.__container__) && (0, _debug.assert)('[BUG] app.__container__ is not set', app.__container__));\n    var routingService = app.__container__.lookup('service:-routing');\n    (true && !(routingService instanceof _internals.RoutingService) && (0, _debug.assert)('[BUG] service:-routing is not a RoutingService', routingService instanceof _internals.RoutingService));\n    return (0, _object.get)(routingService, 'currentPath');\n  }\n});","define(\"ember-testing/lib/helpers/current_route_name\", [\"exports\", \"@ember/object\", \"@ember/routing/-internals\", \"@ember/debug\"], function (_exports, _object, _internals, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = currentRouteName;\n  /**\n  @module ember\n  */\n\n  /**\n    Returns the currently active route name.\n  \n  Example:\n  \n  ```javascript\n  function validateRouteName() {\n    equal(currentRouteName(), 'some.path', \"correct route was transitioned into.\");\n  }\n  visit('/some/path').then(validateRouteName)\n  ```\n  \n  @method currentRouteName\n  @return {Object} The name of the currently active route.\n  @since 1.5.0\n  @public\n  */\n  function currentRouteName(app) {\n    (true && !(app.__container__) && (0, _debug.assert)('[BUG] app.__container__ is not set', app.__container__));\n    var routingService = app.__container__.lookup('service:-routing');\n    (true && !(routingService instanceof _internals.RoutingService) && (0, _debug.assert)('[BUG] service:-routing is not a RoutingService', routingService instanceof _internals.RoutingService));\n    return (0, _object.get)(routingService, 'currentRouteName');\n  }\n});","define(\"ember-testing/lib/helpers/current_url\", [\"exports\", \"@ember/object\", \"@ember/debug\", \"@ember/routing/router\"], function (_exports, _object, _debug, _router) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = currentURL;\n  /**\n  @module ember\n  */\n\n  /**\n    Returns the current URL.\n  \n  Example:\n  \n  ```javascript\n  function validateURL() {\n    equal(currentURL(), '/some/path', \"correct URL was transitioned into.\");\n  }\n  \n  click('#some-link-id').then(validateURL);\n  ```\n  \n  @method currentURL\n  @return {Object} The currently active URL.\n  @since 1.5.0\n  @public\n  */\n  function currentURL(app) {\n    (true && !(app.__container__) && (0, _debug.assert)('[BUG] app.__container__ is not set', app.__container__));\n    var router = app.__container__.lookup('router:main');\n    (true && !(router instanceof _router.default) && (0, _debug.assert)('[BUG] router:main is not a Router', router instanceof _router.default));\n    var location = (0, _object.get)(router, 'location');\n    (true && !(typeof location !== 'string') && (0, _debug.assert)('[BUG] location is still a string', typeof location !== 'string'));\n    return location.getURL();\n  }\n});","define(\"ember-testing/lib/helpers/pause_test\", [\"exports\", \"@ember/-internals/runtime\", \"@ember/debug\"], function (_exports, _runtime, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.pauseTest = pauseTest;\n  _exports.resumeTest = resumeTest;\n  /**\n  @module ember\n  */\n\n  var resume;\n  /**\n   Resumes a test paused by `pauseTest`.\n  \n   @method resumeTest\n   @return {void}\n   @public\n  */\n  function resumeTest() {\n    (true && !(resume) && (0, _debug.assert)('Testing has not been paused. There is nothing to resume.', resume));\n    resume();\n    resume = undefined;\n  }\n  /**\n   Pauses the current test - this is useful for debugging while testing or for test-driving.\n   It allows you to inspect the state of your application at any point.\n   Example (The test will pause before clicking the button):\n  \n   ```javascript\n   visit('/')\n   return pauseTest();\n   click('.btn');\n   ```\n  \n   You may want to turn off the timeout before pausing.\n  \n   qunit (timeout available to use as of 2.4.0):\n  \n   ```\n   visit('/');\n   assert.timeout(0);\n   return pauseTest();\n   click('.btn');\n   ```\n  \n   mocha (timeout happens automatically as of ember-mocha v0.14.0):\n  \n   ```\n   visit('/');\n   this.timeout(0);\n   return pauseTest();\n   click('.btn');\n   ```\n  \n  \n   @since 1.9.0\n   @method pauseTest\n   @return {Object} A promise that will never resolve\n   @public\n  */\n  function pauseTest() {\n    (0, _debug.info)('Testing paused. Use `resumeTest()` to continue.');\n    return new _runtime.RSVP.Promise(resolve => {\n      resume = resolve;\n    }, 'TestAdapter paused promise');\n  }\n});","define(\"ember-testing/lib/helpers/visit\", [\"exports\", \"@ember/debug\", \"@ember/routing/router\", \"@ember/runloop\"], function (_exports, _debug, _router, _runloop) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = visit;\n  /**\n    Loads a route, sets up any controllers, and renders any templates associated\n    with the route as though a real user had triggered the route change while\n    using your app.\n  \n    Example:\n  \n    ```javascript\n    visit('posts/index').then(function() {\n      // assert something\n    });\n    ```\n  \n    @method visit\n    @param {String} url the name of the route\n    @return {RSVP.Promise<undefined>}\n    @public\n  */\n  function visit(app, url) {\n    (true && !(app.__container__) && (0, _debug.assert)('[BUG] Missing container', app.__container__));\n    var router = app.__container__.lookup('router:main');\n    (true && !(router instanceof _router.default) && (0, _debug.assert)('[BUG] router:main is not a Router', router instanceof _router.default));\n    var shouldHandleURL = false;\n    app.boot().then(() => {\n      (true && !(typeof router.location !== 'string') && (0, _debug.assert)('[BUG] router.location is still a string', typeof router.location !== 'string'));\n      router.location.setURL(url);\n      if (shouldHandleURL) {\n        (true && !(app.__deprecatedInstance__) && (0, _debug.assert)(\"[BUG] __deprecatedInstance__ isn't set\", app.__deprecatedInstance__));\n        (0, _runloop.run)(app.__deprecatedInstance__, 'handleURL', url);\n      }\n    });\n    if (app._readinessDeferrals > 0) {\n      // SAFETY: This should be safe, though it is odd.\n      router.initialURL = url;\n      (0, _runloop.run)(app, 'advanceReadiness');\n      delete router.initialURL;\n    } else {\n      shouldHandleURL = true;\n    }\n    var wait = app.testHelpers['wait'];\n    (true && !(wait) && (0, _debug.assert)('[BUG] missing wait helper', wait));\n    return wait();\n  }\n});","define(\"ember-testing/lib/helpers/wait\", [\"exports\", \"ember-testing/lib/test/waiters\", \"@ember/-internals/runtime\", \"@ember/runloop\", \"ember-testing/lib/test/pending_requests\", \"@ember/debug\", \"@ember/routing/router\"], function (_exports, _waiters, _runtime, _runloop, _pending_requests, _debug, _router) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = wait;\n  /**\n  @module ember\n  */\n\n  /**\n    Causes the run loop to process any pending events. This is used to ensure that\n    any async operations from other helpers (or your assertions) have been processed.\n  \n    This is most often used as the return value for the helper functions (see 'click',\n    'fillIn','visit',etc). However, there is a method to register a test helper which\n    utilizes this method without the need to actually call `wait()` in your helpers.\n  \n    The `wait` helper is built into `registerAsyncHelper` by default. You will not need\n    to `return app.testHelpers.wait();` - the wait behavior is provided for you.\n  \n    Example:\n  \n    ```javascript\n    import { registerAsyncHelper } from '@ember/test';\n  \n    registerAsyncHelper('loginUser', function(app, username, password) {\n      visit('secured/path/here')\n        .fillIn('#username', username)\n        .fillIn('#password', password)\n        .click('.submit');\n    });\n    ```\n  \n    @method wait\n    @param {Object} value The value to be returned.\n    @return {RSVP.Promise<any>} Promise that resolves to the passed value.\n    @public\n    @since 1.0.0\n  */\n  function wait(app, value) {\n    return new _runtime.RSVP.Promise(function (resolve) {\n      (true && !(app.__container__) && (0, _debug.assert)('[BUG] Missing container', app.__container__));\n      var router = app.__container__.lookup('router:main');\n      (true && !(router instanceof _router.default) && (0, _debug.assert)('[BUG] Expected router:main to be a subclass of Ember Router', router instanceof _router.default)); // Every 10ms, poll for the async thing to have finished\n      var watcher = setInterval(() => {\n        // 1. If the router is loading, keep polling\n        var routerIsLoading = router._routerMicrolib && Boolean(router._routerMicrolib.activeTransition);\n        if (routerIsLoading) {\n          return;\n        }\n        // 2. If there are pending Ajax requests, keep polling\n        if ((0, _pending_requests.pendingRequests)()) {\n          return;\n        }\n        // 3. If there are scheduled timers or we are inside of a run loop, keep polling\n        if ((0, _runloop._hasScheduledTimers)() || (0, _runloop._getCurrentRunLoop)()) {\n          return;\n        }\n        if ((0, _waiters.checkWaiters)()) {\n          return;\n        }\n        // Stop polling\n        clearInterval(watcher);\n        // Synchronously resolve the promise\n        (0, _runloop.run)(null, resolve, value);\n      }, 10);\n    });\n  }\n});","define(\"ember-testing/lib/initializers\", [\"@ember/application\"], function (_application) {\n  \"use strict\";\n\n  var name = 'deferReadiness in `testing` mode';\n  (0, _application.onLoad)('Ember.Application', function (ApplicationClass) {\n    if (!ApplicationClass.initializers[name]) {\n      ApplicationClass.initializer({\n        name: name,\n        initialize(application) {\n          if (application.testing) {\n            application.deferReadiness();\n          }\n        }\n      });\n    }\n  });\n});","define(\"ember-testing/lib/setup_for_testing\", [\"exports\", \"@ember/debug\", \"ember-testing/lib/test/adapter\", \"ember-testing/lib/adapters/adapter\", \"ember-testing/lib/adapters/qunit\"], function (_exports, _debug, _adapter, _adapter2, _qunit) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = setupForTesting;\n  /* global self */\n\n  /**\n    Sets Ember up for testing. This is useful to perform\n    basic setup steps in order to unit test.\n  \n    Use `App.setupForTesting` to perform integration tests (full\n    application testing).\n  \n    @method setupForTesting\n    @namespace Ember\n    @since 1.5.0\n    @private\n  */\n  function setupForTesting() {\n    (0, _debug.setTesting)(true);\n    var adapter = (0, _adapter.getAdapter)();\n    // if adapter is not manually set default to QUnit\n    if (!adapter) {\n      (0, _adapter.setAdapter)(typeof self.QUnit === 'undefined' ? _adapter2.default.create() : _qunit.default.create());\n    }\n  }\n});","define(\"ember-testing/lib/test\", [\"exports\", \"ember-testing/lib/test/helpers\", \"ember-testing/lib/test/on_inject_helpers\", \"ember-testing/lib/test/promise\", \"ember-testing/lib/test/waiters\", \"ember-testing/lib/test/adapter\"], function (_exports, _helpers, _on_inject_helpers, _promise, _waiters, _adapter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n    @module ember\n  */\n\n  /**\n    This is a container for an assortment of testing related functionality:\n  \n    * Choose your default test adapter (for your framework of choice).\n    * Register/Unregister additional test helpers.\n    * Setup callbacks to be fired when the test helpers are injected into\n      your application.\n  \n    @class Test\n    @namespace Ember\n    @public\n  */\n  var Test = {\n    /**\n      Hash containing all known test helpers.\n         @property _helpers\n      @private\n      @since 1.7.0\n    */\n    _helpers: _helpers.helpers,\n    registerHelper: _helpers.registerHelper,\n    registerAsyncHelper: _helpers.registerAsyncHelper,\n    unregisterHelper: _helpers.unregisterHelper,\n    onInjectHelpers: _on_inject_helpers.onInjectHelpers,\n    Promise: _promise.default,\n    promise: _promise.promise,\n    resolve: _promise.resolve,\n    registerWaiter: _waiters.registerWaiter,\n    unregisterWaiter: _waiters.unregisterWaiter,\n    checkWaiters: _waiters.checkWaiters\n  };\n  /**\n   Used to allow ember-testing to communicate with a specific testing\n   framework.\n  \n   You can manually set it before calling `App.setupForTesting()`.\n  \n   Example:\n  \n   ```javascript\n   Ember.Test.adapter = MyCustomAdapter.create()\n   ```\n  \n   If you do not set it, ember-testing will default to `Ember.Test.QUnitAdapter`.\n  \n   @public\n   @for Ember.Test\n   @property adapter\n   @type {Class} The adapter to be used.\n   @default Ember.Test.QUnitAdapter\n  */\n  Object.defineProperty(Test, 'adapter', {\n    get: _adapter.getAdapter,\n    set: _adapter.setAdapter\n  });\n  var _default = Test;\n  _exports.default = _default;\n});","define(\"ember-testing/lib/test/adapter\", [\"exports\", \"@ember/-internals/error-handling\"], function (_exports, _errorHandling) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.asyncEnd = asyncEnd;\n  _exports.asyncStart = asyncStart;\n  _exports.getAdapter = getAdapter;\n  _exports.setAdapter = setAdapter;\n  var adapter;\n  function getAdapter() {\n    return adapter;\n  }\n  function setAdapter(value) {\n    adapter = value;\n    if (value && typeof value.exception === 'function') {\n      (0, _errorHandling.setDispatchOverride)(adapterDispatch);\n    } else {\n      (0, _errorHandling.setDispatchOverride)(null);\n    }\n  }\n  function asyncStart() {\n    if (adapter) {\n      adapter.asyncStart();\n    }\n  }\n  function asyncEnd() {\n    if (adapter) {\n      adapter.asyncEnd();\n    }\n  }\n  function adapterDispatch(error) {\n    adapter.exception(error);\n    // @ts-expect-error Normally unreachable\n    console.error(error.stack); // eslint-disable-line no-console\n  }\n});","define(\"ember-testing/lib/test/helpers\", [\"exports\", \"ember-testing/lib/test/promise\"], function (_exports, _promise) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.helpers = void 0;\n  _exports.registerAsyncHelper = registerAsyncHelper;\n  _exports.registerHelper = registerHelper;\n  _exports.unregisterHelper = unregisterHelper;\n  var helpers = {};\n  /**\n   @module @ember/test\n  */\n  /**\n    `registerHelper` is used to register a test helper that will be injected\n    when `App.injectTestHelpers` is called.\n  \n    The helper method will always be called with the current Application as\n    the first parameter.\n  \n    For example:\n  \n    ```javascript\n    import { registerHelper } from '@ember/test';\n    import { run } from '@ember/runloop';\n  \n    registerHelper('boot', function(app) {\n      run(app, app.advanceReadiness);\n    });\n    ```\n  \n    This helper can later be called without arguments because it will be\n    called with `app` as the first parameter.\n  \n    ```javascript\n    import Application from '@ember/application';\n  \n    App = Application.create();\n    App.injectTestHelpers();\n    boot();\n    ```\n  \n    @public\n    @for @ember/test\n    @static\n    @method registerHelper\n    @param {String} name The name of the helper method to add.\n    @param {Function} helperMethod\n    @param options {Object}\n  */\n  _exports.helpers = helpers;\n  function registerHelper(name, helperMethod) {\n    helpers[name] = {\n      method: helperMethod,\n      meta: {\n        wait: false\n      }\n    };\n  }\n  /**\n    `registerAsyncHelper` is used to register an async test helper that will be injected\n    when `App.injectTestHelpers` is called.\n  \n    The helper method will always be called with the current Application as\n    the first parameter.\n  \n    For example:\n  \n    ```javascript\n    import { registerAsyncHelper } from '@ember/test';\n    import { run } from '@ember/runloop';\n  \n    registerAsyncHelper('boot', function(app) {\n      run(app, app.advanceReadiness);\n    });\n    ```\n  \n    The advantage of an async helper is that it will not run\n    until the last async helper has completed.  All async helpers\n    after it will wait for it complete before running.\n  \n  \n    For example:\n  \n    ```javascript\n    import { registerAsyncHelper } from '@ember/test';\n  \n    registerAsyncHelper('deletePost', function(app, postId) {\n      click('.delete-' + postId);\n    });\n  \n    // ... in your test\n    visit('/post/2');\n    deletePost(2);\n    visit('/post/3');\n    deletePost(3);\n    ```\n  \n    @public\n    @for @ember/test\n    @method registerAsyncHelper\n    @param {String} name The name of the helper method to add.\n    @param {Function} helperMethod\n    @since 1.2.0\n  */\n  function registerAsyncHelper(name, helperMethod) {\n    helpers[name] = {\n      method: helperMethod,\n      meta: {\n        wait: true\n      }\n    };\n  }\n  /**\n    Remove a previously added helper method.\n  \n    Example:\n  \n    ```javascript\n    import { unregisterHelper } from '@ember/test';\n  \n    unregisterHelper('wait');\n    ```\n  \n    @public\n    @method unregisterHelper\n    @static\n    @for @ember/test\n    @param {String} name The helper to remove.\n  */\n  function unregisterHelper(name) {\n    delete helpers[name];\n    // SAFETY: This isn't necessarily a safe thing to do, but in terms of the immediate types here\n    // it won't error.\n    delete _promise.default.prototype[name];\n  }\n});","define(\"ember-testing/lib/test/on_inject_helpers\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.callbacks = void 0;\n  _exports.invokeInjectHelpersCallbacks = invokeInjectHelpersCallbacks;\n  _exports.onInjectHelpers = onInjectHelpers;\n  var callbacks = [];\n  /**\n    Used to register callbacks to be fired whenever `App.injectTestHelpers`\n    is called.\n  \n    The callback will receive the current application as an argument.\n  \n    Example:\n  \n    ```javascript\n    import $ from 'jquery';\n  \n    Ember.Test.onInjectHelpers(function() {\n      $(document).ajaxSend(function() {\n        Test.pendingRequests++;\n      });\n  \n      $(document).ajaxComplete(function() {\n        Test.pendingRequests--;\n      });\n    });\n    ```\n  \n    @public\n    @for Ember.Test\n    @method onInjectHelpers\n    @param {Function} callback The function to be called.\n  */\n  _exports.callbacks = callbacks;\n  function onInjectHelpers(callback) {\n    callbacks.push(callback);\n  }\n  function invokeInjectHelpersCallbacks(app) {\n    for (var callback of callbacks) {\n      callback(app);\n    }\n  }\n});","define(\"ember-testing/lib/test/pending_requests\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.clearPendingRequests = clearPendingRequests;\n  _exports.decrementPendingRequests = decrementPendingRequests;\n  _exports.incrementPendingRequests = incrementPendingRequests;\n  _exports.pendingRequests = pendingRequests;\n  var requests = [];\n  function pendingRequests() {\n    return requests.length;\n  }\n  function clearPendingRequests() {\n    requests.length = 0;\n  }\n  function incrementPendingRequests(_, xhr) {\n    requests.push(xhr);\n  }\n  function decrementPendingRequests(_, xhr) {\n    setTimeout(function () {\n      for (var i = 0; i < requests.length; i++) {\n        if (xhr === requests[i]) {\n          requests.splice(i, 1);\n          break;\n        }\n      }\n    }, 0);\n  }\n});","define(\"ember-testing/lib/test/promise\", [\"exports\", \"@ember/-internals/runtime\", \"ember-testing/lib/test/run\"], function (_exports, _runtime, _run) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.getLastPromise = getLastPromise;\n  _exports.promise = promise;\n  _exports.resolve = resolve;\n  var lastPromise = null;\n  class TestPromise extends _runtime.RSVP.Promise {\n    constructor(executor, label) {\n      super(executor, label);\n      lastPromise = this;\n    }\n    then(onFulfilled, onRejected, label) {\n      var normalizedOnFulfilled = typeof onFulfilled === 'function' ? result => isolate(onFulfilled, result) : undefined;\n      return super.then(normalizedOnFulfilled, onRejected, label);\n    }\n  }\n  /**\n    This returns a thenable tailored for testing.  It catches failed\n    `onSuccess` callbacks and invokes the `Ember.Test.adapter.exception`\n    callback in the last chained then.\n  \n    This method should be returned by async helpers such as `wait`.\n  \n    @public\n    @for Ember.Test\n    @method promise\n    @param {Function} resolver The function used to resolve the promise.\n    @param {String} label An optional string for identifying the promise.\n  */\n  _exports.default = TestPromise;\n  function promise(resolver, label) {\n    var fullLabel = `Ember.Test.promise: ${label || '<Unknown Promise>'}`;\n    return new TestPromise(resolver, fullLabel);\n  }\n  /**\n    Replacement for `Ember.RSVP.resolve`\n    The only difference is this uses\n    an instance of `Ember.Test.Promise`\n  \n    @public\n    @for Ember.Test\n    @method resolve\n    @param {Mixed} The value to resolve\n    @since 1.2.0\n  */\n  function resolve(result, label) {\n    return TestPromise.resolve(result, label);\n  }\n  function getLastPromise() {\n    return lastPromise;\n  }\n  // This method isolates nested async methods\n  // so that they don't conflict with other last promises.\n  //\n  // 1. Set `Ember.Test.lastPromise` to null\n  // 2. Invoke method\n  // 3. Return the last promise created during method\n  function isolate(onFulfilled, result) {\n    // Reset lastPromise for nested helpers\n    lastPromise = null;\n    var value = onFulfilled(result);\n    var promise = lastPromise;\n    lastPromise = null;\n    // If the method returned a promise\n    // return that promise. If not,\n    // return the last async helper's promise\n    if (value && value instanceof TestPromise || !promise) {\n      return value;\n    } else {\n      return (0, _run.default)(() => resolve(promise).then(() => value));\n    }\n  }\n});","define(\"ember-testing/lib/test/run\", [\"exports\", \"@ember/runloop\"], function (_exports, _runloop) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = run;\n  function run(fn) {\n    if (!(0, _runloop._getCurrentRunLoop)()) {\n      return (0, _runloop.run)(fn);\n    } else {\n      return fn();\n    }\n  }\n});","define(\"ember-testing/lib/test/waiters\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.checkWaiters = checkWaiters;\n  _exports.registerWaiter = registerWaiter;\n  _exports.unregisterWaiter = unregisterWaiter;\n  /**\n   @module @ember/test\n  */\n  var contexts = [];\n  var callbacks = [];\n  function registerWaiter() {\n    var checkedCallback;\n    var checkedContext;\n    if (arguments.length === 1) {\n      checkedContext = null;\n      checkedCallback = arguments.length <= 0 ? undefined : arguments[0];\n    } else {\n      checkedContext = arguments.length <= 0 ? undefined : arguments[0];\n      checkedCallback = arguments.length <= 1 ? undefined : arguments[1];\n    }\n    if (indexOf(checkedContext, checkedCallback) > -1) {\n      return;\n    }\n    contexts.push(checkedContext);\n    callbacks.push(checkedCallback);\n  }\n  /**\n     `unregisterWaiter` is used to unregister a callback that was\n     registered with `registerWaiter`.\n  \n     @public\n     @for @ember/test\n     @static\n     @method unregisterWaiter\n     @param {Object} context (optional)\n     @param {Function} callback\n     @since 1.2.0\n  */\n  function unregisterWaiter(context, callback) {\n    if (!callbacks.length) {\n      return;\n    }\n    if (arguments.length === 1) {\n      callback = context;\n      context = null;\n    }\n    var i = indexOf(context, callback);\n    if (i === -1) {\n      return;\n    }\n    contexts.splice(i, 1);\n    callbacks.splice(i, 1);\n  }\n  /**\n    Iterates through each registered test waiter, and invokes\n    its callback. If any waiter returns false, this method will return\n    true indicating that the waiters have not settled yet.\n  \n    This is generally used internally from the acceptance/integration test\n    infrastructure.\n  \n    @public\n    @for @ember/test\n    @static\n    @method checkWaiters\n  */\n  function checkWaiters() {\n    if (!callbacks.length) {\n      return false;\n    }\n    for (var i = 0; i < callbacks.length; i++) {\n      var context = contexts[i];\n      var callback = callbacks[i];\n      // SAFETY: The loop ensures that this exists\n      if (!callback.call(context)) {\n        return true;\n      }\n    }\n    return false;\n  }\n  function indexOf(context, callback) {\n    for (var i = 0; i < callbacks.length; i++) {\n      if (callbacks[i] === callback && contexts[i] === context) {\n        return i;\n      }\n    }\n    return -1;\n  }\n});","define(\"ember/index\", [\"exports\", \"require\", \"@ember/-internals/environment\", \"@ember/-internals/utils\", \"@ember/-internals/container\", \"@ember/instrumentation\", \"@ember/-internals/meta\", \"@ember/-internals/metal\", \"@ember/canary-features\", \"@ember/debug\", \"backburner\", \"@ember/controller\", \"@ember/string\", \"@ember/service\", \"@ember/object\", \"@ember/object/-internals\", \"@ember/object/compat\", \"@ember/object/computed\", \"@ember/object/events\", \"@ember/-internals/runtime\", \"@ember/-internals/glimmer\", \"ember/version\", \"@ember/-internals/views\", \"@ember/debug/container-debug-adapter\", \"@ember/debug/data-adapter\", \"@ember/error\", \"@ember/runloop\", \"@ember/-internals/error-handling\", \"@ember/array\", \"@ember/array/mutable\", \"@ember/array/proxy\", \"@ember/application\", \"@ember/application/instance\", \"@ember/application/namespace\", \"@ember/component\", \"@ember/component/helper\", \"@ember/engine\", \"@ember/engine/instance\", \"@ember/enumerable\", \"@ember/enumerable/mutable\", \"@ember/object/core\", \"@ember/object/evented\", \"@ember/object/mixin\", \"@ember/object/observable\", \"@ember/object/observers\", \"@ember/object/proxy\", \"@ember/object/promise-proxy-mixin\", \"@ember/polyfills\", \"@ember/routing/auto-location\", \"@ember/routing/hash-location\", \"@ember/routing/history-location\", \"@ember/routing/none-location\", \"@ember/routing/location\", \"@ember/routing/route\", \"@ember/routing/router\", \"@ember/routing/-internals\", \"@ember/utils\", \"@glimmer/runtime\", \"@glimmer/manager\", \"@ember/destroyable\"], function (_exports, _require, _environment, utils, _container, instrumentation, _meta, metal, _canaryFeatures, EmberDebug, _backburner, _controller, _string, _service, _object, _internals, _compat, _computed, _events, _runtime, _glimmer, _version, views, _containerDebugAdapter, _dataAdapter, _error, _runloop, _errorHandling, _array, _mutable, _proxy, _application, _instance, _namespace, _component, _helper, _engine, _instance2, _enumerable, _mutable2, _core, _evented, _mixin, _observable, _observers, _proxy2, _promiseProxyMixin, _polyfills, _autoLocation, _hashLocation, _historyLocation, _noneLocation, _location, _route, _router, _internals2, _utils2, glimmerRuntime, _manager, _destroyable) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n  @module ember\n  */\n\n  /**\n    Namespace for injection helper methods.\n  \n    @class inject\n    @namespace Ember\n    @static\n    @public\n  */\n  function inject() {\n    (true && !(false) && (0, EmberDebug.assert)(`Injected properties must be created through helpers, see '${Object.keys(inject).map(k => `'inject.${k}'`).join(' or ')}'`));\n  }\n  // ****@ember/controller****\n  inject.controller = _controller.inject;\n  // ****@ember/service****\n  inject.service = _service.service;\n  var PartialEmber = {\n    isNamespace: true,\n    toString() {\n      return 'Ember';\n    },\n    // ****@ember/-internals/container****\n    Container: _container.Container,\n    Registry: _container.Registry,\n    // ****@ember/-internals/glimmer****\n    // Partially re-exported from @glimmer/manager\n    _setComponentManager: _glimmer.setComponentManager,\n    _componentManagerCapabilities: _glimmer.componentCapabilities,\n    _modifierManagerCapabilities: _glimmer.modifierCapabilities,\n    // ****@ember/-internals/meta****\n    meta: _meta.meta,\n    // ****@ember/-internals/metal****\n    _createCache: metal.createCache,\n    _cacheGetValue: metal.getValue,\n    _cacheIsConst: metal.isConst,\n    _descriptor: metal.nativeDescDecorator,\n    _getPath: metal._getPath,\n    _setClassicDecorator: metal.setClassicDecorator,\n    _tracked: metal.tracked,\n    beginPropertyChanges: metal.beginPropertyChanges,\n    changeProperties: metal.changeProperties,\n    endPropertyChanges: metal.endPropertyChanges,\n    hasListeners: metal.hasListeners,\n    libraries: metal.libraries,\n    // ****@ember/-internals/runtime****\n    _ContainerProxyMixin: _runtime.ContainerProxyMixin,\n    _ProxyMixin: _runtime._ProxyMixin,\n    _RegistryProxyMixin: _runtime.RegistryProxyMixin,\n    ActionHandler: _runtime.ActionHandler,\n    Comparable: _runtime.Comparable,\n    RSVP: _runtime.RSVP,\n    // ****@ember/-internals/view****\n    ComponentLookup: views.ComponentLookup,\n    EventDispatcher: views.EventDispatcher,\n    // ****@ember/-internals/utils****\n    _Cache: utils.Cache,\n    GUID_KEY: utils.GUID_KEY,\n    canInvoke: utils.canInvoke,\n    generateGuid: utils.generateGuid,\n    guidFor: utils.guidFor,\n    uuid: utils.uuid,\n    wrap: utils.wrap,\n    // ****@ember/application****\n    getOwner: _application.getOwner,\n    onLoad: _application.onLoad,\n    runLoadHooks: _application.runLoadHooks,\n    setOwner: _application.setOwner,\n    Application: _application.default,\n    // ****@ember/application/instance****\n    ApplicationInstance: _instance.default,\n    // ****@ember/application/namespace****\n    Namespace: _namespace.default,\n    // ****@ember/array****\n    A: _array.A,\n    Array: _array.default,\n    NativeArray: _array.NativeArray,\n    isArray: _array.isArray,\n    makeArray: _array.makeArray,\n    // ****@ember/array/mutable****\n    MutableArray: _mutable.default,\n    // ****@ember/array/proxy****\n    ArrayProxy: _proxy.default,\n    // ****@ember/canary-features****\n    FEATURES: Object.assign({\n      isEnabled: _canaryFeatures.isEnabled\n    }, _canaryFeatures.FEATURES),\n    // ****@ember/component****\n    _Input: _component.Input,\n    Component: _component.default,\n    // ****@ember/component/helper****\n    Helper: _helper.default,\n    // ****@ember/controller****\n    Controller: _controller.default,\n    ControllerMixin: _controller.ControllerMixin,\n    // ****@ember/debug****\n    _captureRenderTree: EmberDebug.captureRenderTree,\n    assert: EmberDebug.assert,\n    warn: EmberDebug.warn,\n    debug: EmberDebug.debug,\n    deprecate: EmberDebug.deprecate,\n    deprecateFunc: EmberDebug.deprecateFunc,\n    runInDebug: EmberDebug.runInDebug,\n    inspect: EmberDebug.inspect,\n    Debug: {\n      registerDeprecationHandler: EmberDebug.registerDeprecationHandler,\n      registerWarnHandler: EmberDebug.registerWarnHandler,\n      // ****@ember/-internals/metal****\n      isComputed: metal.isComputed\n    },\n    // ****@ember/debug/container-debug-adapter****\n    ContainerDebugAdapter: _containerDebugAdapter.default,\n    // ****@ember/debug/data-adapter****\n    DataAdapter: _dataAdapter.default,\n    // ****@ember/destroyable****\n    _assertDestroyablesDestroyed: _destroyable.assertDestroyablesDestroyed,\n    _associateDestroyableChild: _destroyable.associateDestroyableChild,\n    _enableDestroyableTracking: _destroyable.enableDestroyableTracking,\n    _isDestroying: _destroyable.isDestroying,\n    _isDestroyed: _destroyable.isDestroyed,\n    _registerDestructor: _destroyable.registerDestructor,\n    _unregisterDestructor: _destroyable.unregisterDestructor,\n    destroy: _destroyable.destroy,\n    // ****@ember/engine****\n    Engine: _engine.default,\n    // ****@ember/engine/instance****\n    EngineInstance: _instance2.default,\n    // ****@ember/enumerable****\n    Enumerable: _enumerable.default,\n    // ****@ember/enumerable/mutable****\n    MutableEnumerable: _mutable2.default,\n    // ****@ember/error****\n    Error: _error.default,\n    // ****@ember/instrumentation****\n    instrument: instrumentation.instrument,\n    subscribe: instrumentation.subscribe,\n    Instrumentation: {\n      instrument: instrumentation.instrument,\n      subscribe: instrumentation.subscribe,\n      unsubscribe: instrumentation.unsubscribe,\n      reset: instrumentation.reset\n    },\n    // ****@ember/object****\n    Object: _object.default,\n    _action: _object.action,\n    computed: _object.computed,\n    defineProperty: _object.defineProperty,\n    get: _object.get,\n    getProperties: _object.getProperties,\n    notifyPropertyChange: _object.notifyPropertyChange,\n    observer: _object.observer,\n    set: _object.set,\n    trySet: _object.trySet,\n    setProperties: _object.setProperties,\n    // ****@ember/object/-internals****\n    cacheFor: _internals.cacheFor,\n    // ****@ember/object/compat****\n    _dependentKeyCompat: _compat.dependentKeyCompat,\n    // ****@ember/object/computed****\n    ComputedProperty: _computed.default,\n    expandProperties: _computed.expandProperties,\n    // ****@ember/object/core****\n    CoreObject: _core.default,\n    // ****@ember/object/evented****\n    Evented: _evented.default,\n    on: _evented.on,\n    // ****@ember/object/events****\n    addListener: _events.addListener,\n    removeListener: _events.removeListener,\n    sendEvent: _events.sendEvent,\n    // ****@ember/object/mixin****\n    Mixin: _mixin.default,\n    mixin: _mixin.mixin,\n    // ****@ember/object/observable****\n    Observable: _observable.default,\n    // ****@ember/object/observers****\n    addObserver: _observers.addObserver,\n    removeObserver: _observers.removeObserver,\n    // ****@ember/object/promise-proxy-mixin****\n    PromiseProxyMixin: _promiseProxyMixin.default,\n    // ****@ember/object/proxy****\n    ObjectProxy: _proxy2.default,\n    // ****@ember/polyfills****\n    assign: _polyfills.assign,\n    // ****@ember/routing/-internals****\n    RouterDSL: _internals2.DSL,\n    controllerFor: _internals2.controllerFor,\n    generateController: _internals2.generateController,\n    generateControllerFactory: _internals2.generateControllerFactory,\n    // ****@ember/routing/auto-location****\n    AutoLocation: _autoLocation.default,\n    // ****@ember/routing/hash-location****\n    HashLocation: _hashLocation.default,\n    // ****@ember/routing/history-location****\n    HistoryLocation: _historyLocation.default,\n    // ****@ember/routing/location****\n    Location: _location.default,\n    // ****@ember/routing/none-location****\n    NoneLocation: _noneLocation.default,\n    // ****@ember/routing/route****\n    Route: _route.default,\n    // ****@ember/routing/router****\n    Router: _router.default,\n    // ****@ember/runloop****\n    run: _runloop.run,\n    // ****@ember/service****\n    Service: _service.default,\n    // ****@ember/string****\n    String: {\n      camelize: _string.camelize,\n      capitalize: _string.capitalize,\n      classify: _string.classify,\n      decamelize: _string.decamelize,\n      dasherize: _string.dasherize,\n      underscore: _string.underscore,\n      w: _string.w\n    },\n    // ****@ember/utils****\n    compare: _utils2.compare,\n    isBlank: _utils2.isBlank,\n    isEmpty: _utils2.isEmpty,\n    isEqual: _utils2.isEqual,\n    isNone: _utils2.isNone,\n    isPresent: _utils2.isPresent,\n    typeOf: _utils2.typeOf,\n    // ****@ember/version****\n    /**\n      The semantic version\n         @property VERSION\n      @type String\n      @public\n    */\n    VERSION: _version.default,\n    ViewUtils: {\n      // ****@ember/-internals/views****\n      getChildViews: views.getChildViews,\n      getElementView: views.getElementView,\n      getRootViews: views.getRootViews,\n      getViewBounds: views.getViewBounds,\n      getViewBoundingClientRect: views.getViewBoundingClientRect,\n      getViewClientRects: views.getViewClientRects,\n      getViewElement: views.getViewElement,\n      isSimpleClick: views.isSimpleClick,\n      // ****@ember/-internals/glimmer****\n      isSerializationFirstNode: _glimmer.isSerializationFirstNode\n    },\n    // ****@glimmer/manager****\n    _getComponentTemplate: _manager.getComponentTemplate,\n    _helperManagerCapabilities: _manager.helperCapabilities,\n    _setComponentTemplate: _manager.setComponentTemplate,\n    _setHelperManager: _manager.setHelperManager,\n    _setModifierManager: _manager.setModifierManager,\n    // ****@glimmer/runtime****\n    _templateOnlyComponent: glimmerRuntime.templateOnlyComponent,\n    _invokeHelper: glimmerRuntime.invokeHelper,\n    _hash: glimmerRuntime.hash,\n    _array: glimmerRuntime.array,\n    _concat: glimmerRuntime.concat,\n    _get: glimmerRuntime.get,\n    _on: glimmerRuntime.on,\n    _fn: glimmerRuntime.fn,\n    // Backburner\n    _Backburner: _backburner.default,\n    // ****@ember/controller, @ember/service****\n    inject,\n    // Non-imported\n    platform: {\n      defineProperty: true,\n      hasPropertyAccessors: true\n    },\n    __loader: {\n      require: _require.default,\n      define,\n      // @ts-expect-error These properties don't appear as being defined\n      registry: typeof requirejs !== 'undefined' ? requirejs.entries : _require.default.entries\n    }\n  };\n  var Ember = PartialEmber;\n  Object.defineProperty(Ember, 'ENV', {\n    get: _environment.getENV,\n    enumerable: false\n  });\n  Object.defineProperty(Ember, 'lookup', {\n    get: _environment.getLookup,\n    set: _environment.setLookup,\n    enumerable: false\n  });\n  Object.defineProperty(Ember, 'onerror', {\n    get: _errorHandling.getOnerror,\n    set: _errorHandling.setOnerror,\n    enumerable: false\n  });\n  Object.defineProperty(Ember, 'testing', {\n    get: EmberDebug.isTesting,\n    set: EmberDebug.setTesting,\n    enumerable: false\n  });\n  Object.defineProperty(Ember, 'STRINGS', {\n    configurable: false,\n    get: _string._getStrings,\n    set: _string._setStrings\n  });\n  Object.defineProperty(Ember, 'BOOTED', {\n    configurable: false,\n    enumerable: false,\n    get: metal.isNamespaceSearchDisabled,\n    set: metal.setNamespaceSearchDisabled\n  });\n  Object.defineProperty(Ember, 'TEMPLATES', {\n    get: _glimmer.getTemplates,\n    set: _glimmer.setTemplates,\n    configurable: false,\n    enumerable: false\n  });\n  function deprecateStringUseOnEmberModule() {\n    (true && !(false) && (0, EmberDebug.deprecate)('Using `Ember.String` is deprecated. Please import methods directly from `@ember/string`.', false, {\n      id: 'ember-string.from-ember-module',\n      for: 'ember-source',\n      since: {\n        available: '4.10',\n        enabled: '4.10.'\n      },\n      until: '5.0.0',\n      url: 'https://deprecations.emberjs.com/v4.x/#toc_ember-string-from-ember-module'\n    }));\n  }\n  Object.defineProperty(Ember, 'String', {\n    enumerable: true,\n    configurable: true,\n    get() {\n      deprecateStringUseOnEmberModule();\n      return {\n        camelize: _string.camelize,\n        capitalize: _string.capitalize,\n        classify: _string.classify,\n        dasherize: _string.dasherize,\n        decamelize: _string.decamelize,\n        underscore: _string.underscore,\n        w: _string.w,\n        htmlSafe: _glimmer.htmlSafe,\n        isHTMLSafe: _glimmer.isHTMLSafe\n      };\n    }\n  });\n  Object.defineProperty(Ember, 'TEMPLATES', {\n    get: _glimmer.getTemplates,\n    set: _glimmer.setTemplates,\n    configurable: false,\n    enumerable: false\n  });\n  // ****@ember/debug****\n  Object.defineProperty(Ember, 'testing', {\n    get: EmberDebug.isTesting,\n    set: EmberDebug.setTesting,\n    enumerable: false\n  });\n  (0, _application.runLoadHooks)('Ember.Application', _application.default);\n  var EmberHandlebars = {\n    template: _glimmer.template,\n    Utils: {\n      escapeExpression: _glimmer.escapeExpression\n    }\n  };\n  var EmberHTMLBars = {\n    template: _glimmer.template\n  };\n  function defineEmberTemplateCompilerLazyLoad(key) {\n    Object.defineProperty(Ember, key, {\n      configurable: true,\n      enumerable: true,\n      get() {\n        if ((0, _require.has)('ember-template-compiler')) {\n          var templateCompiler = (0, _require.default)(\"ember-template-compiler\");\n          EmberHTMLBars.precompile = EmberHandlebars.precompile = templateCompiler.precompile;\n          EmberHTMLBars.compile = EmberHandlebars.compile = templateCompiler.compile;\n          Object.defineProperty(Ember, 'HTMLBars', {\n            configurable: true,\n            writable: true,\n            enumerable: true,\n            value: EmberHTMLBars\n          });\n          Object.defineProperty(Ember, 'Handlebars', {\n            configurable: true,\n            writable: true,\n            enumerable: true,\n            value: EmberHandlebars\n          });\n        }\n        return key === 'Handlebars' ? EmberHandlebars : EmberHTMLBars;\n      }\n    });\n  }\n  defineEmberTemplateCompilerLazyLoad('HTMLBars');\n  defineEmberTemplateCompilerLazyLoad('Handlebars');\n  // do this to ensure that Ember.Test is defined properly on the global\n  // if it is present.\n  function defineEmberTestingLazyLoad(key) {\n    Object.defineProperty(Ember, key, {\n      configurable: true,\n      enumerable: true,\n      get() {\n        if ((0, _require.has)('ember-testing')) {\n          var testing = (0, _require.default)(\"ember-testing\");\n          var {\n            Test,\n            Adapter,\n            QUnitAdapter,\n            setupForTesting\n          } = testing;\n          // @ts-expect-error We should not do this\n          Test.Adapter = Adapter;\n          // @ts-expect-error We should not do this\n          Test.QUnitAdapter = QUnitAdapter;\n          Object.defineProperty(Ember, 'Test', {\n            configurable: true,\n            writable: true,\n            enumerable: true,\n            value: Test\n          });\n          Object.defineProperty(Ember, 'setupForTesting', {\n            configurable: true,\n            writable: true,\n            enumerable: true,\n            value: setupForTesting\n          });\n          return key === 'Test' ? Test : setupForTesting;\n        }\n        return undefined;\n      }\n    });\n  }\n  defineEmberTestingLazyLoad('Test');\n  defineEmberTestingLazyLoad('setupForTesting');\n  // @ts-expect-error Per types, runLoadHooks requires a second parameter. Should we loosen types?\n  (0, _application.runLoadHooks)('Ember');\n  var _default = Ember;\n  _exports.default = _default;\n});","define(\"ember/version\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = \"4.11.0\";\n  _exports.default = _default;\n});","define(\"route-recognizer\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var createObject = Object.create;\n  function createMap() {\n    var map = createObject(null);\n    map[\"__\"] = undefined;\n    delete map[\"__\"];\n    return map;\n  }\n  var Target = function Target(path, matcher, delegate) {\n    this.path = path;\n    this.matcher = matcher;\n    this.delegate = delegate;\n  };\n  Target.prototype.to = function to(target, callback) {\n    var delegate = this.delegate;\n    if (delegate && delegate.willAddRoute) {\n      target = delegate.willAddRoute(this.matcher.target, target);\n    }\n    this.matcher.add(this.path, target);\n    if (callback) {\n      if (callback.length === 0) {\n        throw new Error(\"You must have an argument in the function passed to `to`\");\n      }\n      this.matcher.addChild(this.path, target, callback, this.delegate);\n    }\n  };\n  var Matcher = function Matcher(target) {\n    this.routes = createMap();\n    this.children = createMap();\n    this.target = target;\n  };\n  Matcher.prototype.add = function add(path, target) {\n    this.routes[path] = target;\n  };\n  Matcher.prototype.addChild = function addChild(path, target, callback, delegate) {\n    var matcher = new Matcher(target);\n    this.children[path] = matcher;\n    var match = generateMatch(path, matcher, delegate);\n    if (delegate && delegate.contextEntered) {\n      delegate.contextEntered(target, match);\n    }\n    callback(match);\n  };\n  function generateMatch(startingPath, matcher, delegate) {\n    function match(path, callback) {\n      var fullPath = startingPath + path;\n      if (callback) {\n        callback(generateMatch(fullPath, matcher, delegate));\n      } else {\n        return new Target(fullPath, matcher, delegate);\n      }\n    }\n    return match;\n  }\n  function addRoute(routeArray, path, handler) {\n    var len = 0;\n    for (var i = 0; i < routeArray.length; i++) {\n      len += routeArray[i].path.length;\n    }\n    path = path.substr(len);\n    var route = {\n      path: path,\n      handler: handler\n    };\n    routeArray.push(route);\n  }\n  function eachRoute(baseRoute, matcher, callback, binding) {\n    var routes = matcher.routes;\n    var paths = Object.keys(routes);\n    for (var i = 0; i < paths.length; i++) {\n      var path = paths[i];\n      var routeArray = baseRoute.slice();\n      addRoute(routeArray, path, routes[path]);\n      var nested = matcher.children[path];\n      if (nested) {\n        eachRoute(routeArray, nested, callback, binding);\n      } else {\n        callback.call(binding, routeArray);\n      }\n    }\n  }\n  var map = function (callback, addRouteCallback) {\n    var matcher = new Matcher();\n    callback(generateMatch(\"\", matcher, this.delegate));\n    eachRoute([], matcher, function (routes) {\n      if (addRouteCallback) {\n        addRouteCallback(this, routes);\n      } else {\n        this.add(routes);\n      }\n    }, this);\n  };\n\n  // Normalizes percent-encoded values in `path` to upper-case and decodes percent-encoded\n  // values that are not reserved (i.e., unicode characters, emoji, etc). The reserved\n  // chars are \"/\" and \"%\".\n  // Safe to call multiple times on the same path.\n  // Normalizes percent-encoded values in `path` to upper-case and decodes percent-encoded\n  function normalizePath(path) {\n    return path.split(\"/\").map(normalizeSegment).join(\"/\");\n  }\n  // We want to ensure the characters \"%\" and \"/\" remain in percent-encoded\n  // form when normalizing paths, so replace them with their encoded form after\n  // decoding the rest of the path\n  var SEGMENT_RESERVED_CHARS = /%|\\//g;\n  function normalizeSegment(segment) {\n    if (segment.length < 3 || segment.indexOf(\"%\") === -1) {\n      return segment;\n    }\n    return decodeURIComponent(segment).replace(SEGMENT_RESERVED_CHARS, encodeURIComponent);\n  }\n  // We do not want to encode these characters when generating dynamic path segments\n  // See https://tools.ietf.org/html/rfc3986#section-3.3\n  // sub-delims: \"!\", \"$\", \"&\", \"'\", \"(\", \")\", \"*\", \"+\", \",\", \";\", \"=\"\n  // others allowed by RFC 3986: \":\", \"@\"\n  //\n  // First encode the entire path segment, then decode any of the encoded special chars.\n  //\n  // The chars \"!\", \"'\", \"(\", \")\", \"*\" do not get changed by `encodeURIComponent`,\n  // so the possible encoded chars are:\n  // ['%24', '%26', '%2B', '%2C', '%3B', '%3D', '%3A', '%40'].\n  var PATH_SEGMENT_ENCODINGS = /%(?:2(?:4|6|B|C)|3(?:B|D|A)|40)/g;\n  function encodePathSegment(str) {\n    return encodeURIComponent(str).replace(PATH_SEGMENT_ENCODINGS, decodeURIComponent);\n  }\n  var escapeRegex = /(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\)/g;\n  var isArray = Array.isArray;\n  var hasOwnProperty = Object.prototype.hasOwnProperty;\n  function getParam(params, key) {\n    if (typeof params !== \"object\" || params === null) {\n      throw new Error(\"You must pass an object as the second argument to `generate`.\");\n    }\n    if (!hasOwnProperty.call(params, key)) {\n      throw new Error(\"You must provide param `\" + key + \"` to `generate`.\");\n    }\n    var value = params[key];\n    var str = typeof value === \"string\" ? value : \"\" + value;\n    if (str.length === 0) {\n      throw new Error(\"You must provide a param `\" + key + \"`.\");\n    }\n    return str;\n  }\n  var eachChar = [];\n  eachChar[0 /* Static */] = function (segment, currentState) {\n    var state = currentState;\n    var value = segment.value;\n    for (var i = 0; i < value.length; i++) {\n      var ch = value.charCodeAt(i);\n      state = state.put(ch, false, false);\n    }\n    return state;\n  };\n  eachChar[1 /* Dynamic */] = function (_, currentState) {\n    return currentState.put(47 /* SLASH */, true, true);\n  };\n  eachChar[2 /* Star */] = function (_, currentState) {\n    return currentState.put(-1 /* ANY */, false, true);\n  };\n  eachChar[4 /* Epsilon */] = function (_, currentState) {\n    return currentState;\n  };\n  var regex = [];\n  regex[0 /* Static */] = function (segment) {\n    return segment.value.replace(escapeRegex, \"\\\\$1\");\n  };\n  regex[1 /* Dynamic */] = function () {\n    return \"([^/]+)\";\n  };\n  regex[2 /* Star */] = function () {\n    return \"(.+)\";\n  };\n  regex[4 /* Epsilon */] = function () {\n    return \"\";\n  };\n  var generate = [];\n  generate[0 /* Static */] = function (segment) {\n    return segment.value;\n  };\n  generate[1 /* Dynamic */] = function (segment, params) {\n    var value = getParam(params, segment.value);\n    if (RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS) {\n      return encodePathSegment(value);\n    } else {\n      return value;\n    }\n  };\n  generate[2 /* Star */] = function (segment, params) {\n    return getParam(params, segment.value);\n  };\n  generate[4 /* Epsilon */] = function () {\n    return \"\";\n  };\n  var EmptyObject = Object.freeze({});\n  var EmptyArray = Object.freeze([]);\n  // The `names` will be populated with the paramter name for each dynamic/star\n  // segment. `shouldDecodes` will be populated with a boolean for each dyanamic/star\n  // segment, indicating whether it should be decoded during recognition.\n  function parse(segments, route, types) {\n    // normalize route as not starting with a \"/\". Recognition will\n    // also normalize.\n    if (route.length > 0 && route.charCodeAt(0) === 47 /* SLASH */) {\n      route = route.substr(1);\n    }\n    var parts = route.split(\"/\");\n    var names = undefined;\n    var shouldDecodes = undefined;\n    for (var i = 0; i < parts.length; i++) {\n      var part = parts[i];\n      var flags = 0;\n      var type = 0;\n      if (part === \"\") {\n        type = 4 /* Epsilon */;\n      } else if (part.charCodeAt(0) === 58 /* COLON */) {\n        type = 1 /* Dynamic */;\n      } else if (part.charCodeAt(0) === 42 /* STAR */) {\n        type = 2 /* Star */;\n      } else {\n        type = 0 /* Static */;\n      }\n\n      flags = 2 << type;\n      if (flags & 12 /* Named */) {\n        part = part.slice(1);\n        names = names || [];\n        names.push(part);\n        shouldDecodes = shouldDecodes || [];\n        shouldDecodes.push((flags & 4 /* Decoded */) !== 0);\n      }\n      if (flags & 14 /* Counted */) {\n        types[type]++;\n      }\n      segments.push({\n        type: type,\n        value: normalizeSegment(part)\n      });\n    }\n    return {\n      names: names || EmptyArray,\n      shouldDecodes: shouldDecodes || EmptyArray\n    };\n  }\n  function isEqualCharSpec(spec, char, negate) {\n    return spec.char === char && spec.negate === negate;\n  }\n  // A State has a character specification and (`charSpec`) and a list of possible\n  // subsequent states (`nextStates`).\n  //\n  // If a State is an accepting state, it will also have several additional\n  // properties:\n  //\n  // * `regex`: A regular expression that is used to extract parameters from paths\n  //   that reached this accepting state.\n  // * `handlers`: Information on how to convert the list of captures into calls\n  //   to registered handlers with the specified parameters\n  // * `types`: How many static, dynamic or star segments in this route. Used to\n  //   decide which route to use if multiple registered routes match a path.\n  //\n  // Currently, State is implemented naively by looping over `nextStates` and\n  // comparing a character specification against a character. A more efficient\n  // implementation would use a hash of keys pointing at one or more next states.\n  var State = function State(states, id, char, negate, repeat) {\n    this.states = states;\n    this.id = id;\n    this.char = char;\n    this.negate = negate;\n    this.nextStates = repeat ? id : null;\n    this.pattern = \"\";\n    this._regex = undefined;\n    this.handlers = undefined;\n    this.types = undefined;\n  };\n  State.prototype.regex = function regex$1() {\n    if (!this._regex) {\n      this._regex = new RegExp(this.pattern);\n    }\n    return this._regex;\n  };\n  State.prototype.get = function get(char, negate) {\n    var this$1 = this;\n    var nextStates = this.nextStates;\n    if (nextStates === null) {\n      return;\n    }\n    if (isArray(nextStates)) {\n      for (var i = 0; i < nextStates.length; i++) {\n        var child = this$1.states[nextStates[i]];\n        if (isEqualCharSpec(child, char, negate)) {\n          return child;\n        }\n      }\n    } else {\n      var child$1 = this.states[nextStates];\n      if (isEqualCharSpec(child$1, char, negate)) {\n        return child$1;\n      }\n    }\n  };\n  State.prototype.put = function put(char, negate, repeat) {\n    var state;\n    // If the character specification already exists in a child of the current\n    // state, just return that state.\n    if (state = this.get(char, negate)) {\n      return state;\n    }\n    // Make a new state for the character spec\n    var states = this.states;\n    state = new State(states, states.length, char, negate, repeat);\n    states[states.length] = state;\n    // Insert the new state as a child of the current state\n    if (this.nextStates == null) {\n      this.nextStates = state.id;\n    } else if (isArray(this.nextStates)) {\n      this.nextStates.push(state.id);\n    } else {\n      this.nextStates = [this.nextStates, state.id];\n    }\n    // Return the new state\n    return state;\n  };\n  // Find a list of child states matching the next character\n  State.prototype.match = function match(ch) {\n    var this$1 = this;\n    var nextStates = this.nextStates;\n    if (!nextStates) {\n      return [];\n    }\n    var returned = [];\n    if (isArray(nextStates)) {\n      for (var i = 0; i < nextStates.length; i++) {\n        var child = this$1.states[nextStates[i]];\n        if (isMatch(child, ch)) {\n          returned.push(child);\n        }\n      }\n    } else {\n      var child$1 = this.states[nextStates];\n      if (isMatch(child$1, ch)) {\n        returned.push(child$1);\n      }\n    }\n    return returned;\n  };\n  function isMatch(spec, char) {\n    return spec.negate ? spec.char !== char && spec.char !== -1 /* ANY */ : spec.char === char || spec.char === -1 /* ANY */;\n  }\n  // This is a somewhat naive strategy, but should work in a lot of cases\n  // A better strategy would properly resolve /posts/:id/new and /posts/edit/:id.\n  //\n  // This strategy generally prefers more static and less dynamic matching.\n  // Specifically, it\n  //\n  //  * prefers fewer stars to more, then\n  //  * prefers using stars for less of the match to more, then\n  //  * prefers fewer dynamic segments to more, then\n  //  * prefers more static segments to more\n  function sortSolutions(states) {\n    return states.sort(function (a, b) {\n      var ref = a.types || [0, 0, 0];\n      var astatics = ref[0];\n      var adynamics = ref[1];\n      var astars = ref[2];\n      var ref$1 = b.types || [0, 0, 0];\n      var bstatics = ref$1[0];\n      var bdynamics = ref$1[1];\n      var bstars = ref$1[2];\n      if (astars !== bstars) {\n        return astars - bstars;\n      }\n      if (astars) {\n        if (astatics !== bstatics) {\n          return bstatics - astatics;\n        }\n        if (adynamics !== bdynamics) {\n          return bdynamics - adynamics;\n        }\n      }\n      if (adynamics !== bdynamics) {\n        return adynamics - bdynamics;\n      }\n      if (astatics !== bstatics) {\n        return bstatics - astatics;\n      }\n      return 0;\n    });\n  }\n  function recognizeChar(states, ch) {\n    var nextStates = [];\n    for (var i = 0, l = states.length; i < l; i++) {\n      var state = states[i];\n      nextStates = nextStates.concat(state.match(ch));\n    }\n    return nextStates;\n  }\n  var RecognizeResults = function RecognizeResults(queryParams) {\n    this.length = 0;\n    this.queryParams = queryParams || {};\n  };\n  RecognizeResults.prototype.splice = Array.prototype.splice;\n  RecognizeResults.prototype.slice = Array.prototype.slice;\n  RecognizeResults.prototype.push = Array.prototype.push;\n  function findHandler(state, originalPath, queryParams) {\n    var handlers = state.handlers;\n    var regex = state.regex();\n    if (!regex || !handlers) {\n      throw new Error(\"state not initialized\");\n    }\n    var captures = originalPath.match(regex);\n    var currentCapture = 1;\n    var result = new RecognizeResults(queryParams);\n    result.length = handlers.length;\n    for (var i = 0; i < handlers.length; i++) {\n      var handler = handlers[i];\n      var names = handler.names;\n      var shouldDecodes = handler.shouldDecodes;\n      var params = EmptyObject;\n      var isDynamic = false;\n      if (names !== EmptyArray && shouldDecodes !== EmptyArray) {\n        for (var j = 0; j < names.length; j++) {\n          isDynamic = true;\n          var name = names[j];\n          var capture = captures && captures[currentCapture++];\n          if (params === EmptyObject) {\n            params = {};\n          }\n          if (RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS && shouldDecodes[j]) {\n            params[name] = capture && decodeURIComponent(capture);\n          } else {\n            params[name] = capture;\n          }\n        }\n      }\n      result[i] = {\n        handler: handler.handler,\n        params: params,\n        isDynamic: isDynamic\n      };\n    }\n    return result;\n  }\n  function decodeQueryParamPart(part) {\n    // http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1\n    part = part.replace(/\\+/gm, \"%20\");\n    var result;\n    try {\n      result = decodeURIComponent(part);\n    } catch (error) {\n      result = \"\";\n    }\n    return result;\n  }\n  var RouteRecognizer = function RouteRecognizer() {\n    this.names = createMap();\n    var states = [];\n    var state = new State(states, 0, -1 /* ANY */, true, false);\n    states[0] = state;\n    this.states = states;\n    this.rootState = state;\n  };\n  RouteRecognizer.prototype.add = function add(routes, options) {\n    var currentState = this.rootState;\n    var pattern = \"^\";\n    var types = [0, 0, 0];\n    var handlers = new Array(routes.length);\n    var allSegments = [];\n    var isEmpty = true;\n    var j = 0;\n    for (var i = 0; i < routes.length; i++) {\n      var route = routes[i];\n      var ref = parse(allSegments, route.path, types);\n      var names = ref.names;\n      var shouldDecodes = ref.shouldDecodes;\n      // preserve j so it points to the start of newly added segments\n      for (; j < allSegments.length; j++) {\n        var segment = allSegments[j];\n        if (segment.type === 4 /* Epsilon */) {\n          continue;\n        }\n        isEmpty = false;\n        // Add a \"/\" for the new segment\n        currentState = currentState.put(47 /* SLASH */, false, false);\n        pattern += \"/\";\n        // Add a representation of the segment to the NFA and regex\n        currentState = eachChar[segment.type](segment, currentState);\n        pattern += regex[segment.type](segment);\n      }\n      handlers[i] = {\n        handler: route.handler,\n        names: names,\n        shouldDecodes: shouldDecodes\n      };\n    }\n    if (isEmpty) {\n      currentState = currentState.put(47 /* SLASH */, false, false);\n      pattern += \"/\";\n    }\n    currentState.handlers = handlers;\n    currentState.pattern = pattern + \"$\";\n    currentState.types = types;\n    var name;\n    if (typeof options === \"object\" && options !== null && options.as) {\n      name = options.as;\n    }\n    if (name) {\n      // if (this.names[name]) {\n      //   throw new Error(\"You may not add a duplicate route named `\" + name + \"`.\");\n      // }\n      this.names[name] = {\n        segments: allSegments,\n        handlers: handlers\n      };\n    }\n  };\n  RouteRecognizer.prototype.handlersFor = function handlersFor(name) {\n    var route = this.names[name];\n    if (!route) {\n      throw new Error(\"There is no route named \" + name);\n    }\n    var result = new Array(route.handlers.length);\n    for (var i = 0; i < route.handlers.length; i++) {\n      var handler = route.handlers[i];\n      result[i] = handler;\n    }\n    return result;\n  };\n  RouteRecognizer.prototype.hasRoute = function hasRoute(name) {\n    return !!this.names[name];\n  };\n  RouteRecognizer.prototype.generate = function generate$1(name, params) {\n    var route = this.names[name];\n    var output = \"\";\n    if (!route) {\n      throw new Error(\"There is no route named \" + name);\n    }\n    var segments = route.segments;\n    for (var i = 0; i < segments.length; i++) {\n      var segment = segments[i];\n      if (segment.type === 4 /* Epsilon */) {\n        continue;\n      }\n      output += \"/\";\n      output += generate[segment.type](segment, params);\n    }\n    if (output.charAt(0) !== \"/\") {\n      output = \"/\" + output;\n    }\n    if (params && params.queryParams) {\n      output += this.generateQueryString(params.queryParams);\n    }\n    return output;\n  };\n  RouteRecognizer.prototype.generateQueryString = function generateQueryString(params) {\n    var pairs = [];\n    var keys = Object.keys(params);\n    keys.sort();\n    for (var i = 0; i < keys.length; i++) {\n      var key = keys[i];\n      var value = params[key];\n      if (value == null) {\n        continue;\n      }\n      var pair = encodeURIComponent(key);\n      if (isArray(value)) {\n        for (var j = 0; j < value.length; j++) {\n          var arrayPair = key + \"[]\" + \"=\" + encodeURIComponent(value[j]);\n          pairs.push(arrayPair);\n        }\n      } else {\n        pair += \"=\" + encodeURIComponent(value);\n        pairs.push(pair);\n      }\n    }\n    if (pairs.length === 0) {\n      return \"\";\n    }\n    return \"?\" + pairs.join(\"&\");\n  };\n  RouteRecognizer.prototype.parseQueryString = function parseQueryString(queryString) {\n    var pairs = queryString.split(\"&\");\n    var queryParams = {};\n    for (var i = 0; i < pairs.length; i++) {\n      var pair = pairs[i].split(\"=\"),\n        key = decodeQueryParamPart(pair[0]),\n        keyLength = key.length,\n        isArray = false,\n        value = void 0;\n      if (pair.length === 1) {\n        value = \"true\";\n      } else {\n        // Handle arrays\n        if (keyLength > 2 && key.slice(keyLength - 2) === \"[]\") {\n          isArray = true;\n          key = key.slice(0, keyLength - 2);\n          if (!queryParams[key]) {\n            queryParams[key] = [];\n          }\n        }\n        value = pair[1] ? decodeQueryParamPart(pair[1]) : \"\";\n      }\n      if (isArray) {\n        queryParams[key].push(value);\n      } else {\n        queryParams[key] = value;\n      }\n    }\n    return queryParams;\n  };\n  RouteRecognizer.prototype.recognize = function recognize(path) {\n    var results;\n    var states = [this.rootState];\n    var queryParams = {};\n    var isSlashDropped = false;\n    var hashStart = path.indexOf(\"#\");\n    if (hashStart !== -1) {\n      path = path.substr(0, hashStart);\n    }\n    var queryStart = path.indexOf(\"?\");\n    if (queryStart !== -1) {\n      var queryString = path.substr(queryStart + 1, path.length);\n      path = path.substr(0, queryStart);\n      queryParams = this.parseQueryString(queryString);\n    }\n    if (path.charAt(0) !== \"/\") {\n      path = \"/\" + path;\n    }\n    var originalPath = path;\n    if (RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS) {\n      path = normalizePath(path);\n    } else {\n      path = decodeURI(path);\n      originalPath = decodeURI(originalPath);\n    }\n    var pathLen = path.length;\n    if (pathLen > 1 && path.charAt(pathLen - 1) === \"/\") {\n      path = path.substr(0, pathLen - 1);\n      originalPath = originalPath.substr(0, originalPath.length - 1);\n      isSlashDropped = true;\n    }\n    for (var i = 0; i < path.length; i++) {\n      states = recognizeChar(states, path.charCodeAt(i));\n      if (!states.length) {\n        break;\n      }\n    }\n    var solutions = [];\n    for (var i$1 = 0; i$1 < states.length; i$1++) {\n      if (states[i$1].handlers) {\n        solutions.push(states[i$1]);\n      }\n    }\n    states = sortSolutions(solutions);\n    var state = solutions[0];\n    if (state && state.handlers) {\n      // if a trailing slash was dropped and a star segment is the last segment\n      // specified, put the trailing slash back\n      if (isSlashDropped && state.pattern && state.pattern.slice(-5) === \"(.+)$\") {\n        originalPath = originalPath + \"/\";\n      }\n      results = findHandler(state, originalPath, queryParams);\n    }\n    return results;\n  };\n  RouteRecognizer.VERSION = \"0.3.4\";\n  // Set to false to opt-out of encoding and decoding path segments.\n  // See https://github.com/tildeio/route-recognizer/pull/55\n  RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS = true;\n  RouteRecognizer.Normalizer = {\n    normalizeSegment: normalizeSegment,\n    normalizePath: normalizePath,\n    encodePathSegment: encodePathSegment\n  };\n  RouteRecognizer.prototype.map = map;\n  var _default = RouteRecognizer;\n  _exports.default = _default;\n});","define(\"router_js\", [\"exports\", \"rsvp\", \"route-recognizer\"], function (_exports, _rsvp, _routeRecognizer) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = _exports.TransitionState = _exports.TransitionError = _exports.STATE_SYMBOL = _exports.QUERY_PARAMS_SYMBOL = _exports.PARAMS_SYMBOL = _exports.InternalTransition = _exports.InternalRouteInfo = void 0;\n  _exports.logAbort = logAbort;\n  function buildTransitionAborted() {\n    var error = new Error('TransitionAborted');\n    error.name = 'TransitionAborted';\n    error.code = 'TRANSITION_ABORTED';\n    return error;\n  }\n  function isTransitionAborted(maybeError) {\n    return typeof maybeError === 'object' && maybeError !== null && maybeError.code === 'TRANSITION_ABORTED';\n  }\n  function isAbortable(maybeAbortable) {\n    return typeof maybeAbortable === 'object' && maybeAbortable !== null && typeof maybeAbortable.isAborted === 'boolean';\n  }\n  function throwIfAborted(maybe) {\n    if (isAbortable(maybe) && maybe.isAborted) {\n      throw buildTransitionAborted();\n    }\n  }\n  var slice = Array.prototype.slice;\n  var hasOwnProperty = Object.prototype.hasOwnProperty;\n  /**\n    Determines if an object is Promise by checking if it is \"thenable\".\n  **/\n  function isPromise(p) {\n    return p !== null && typeof p === 'object' && typeof p.then === 'function';\n  }\n  function merge(hash, other) {\n    for (var prop in other) {\n      if (hasOwnProperty.call(other, prop)) {\n        hash[prop] = other[prop];\n      }\n    }\n  }\n  /**\n    @private\n  \n    Extracts query params from the end of an array\n  **/\n  function extractQueryParams(array) {\n    var len = array && array.length,\n      head,\n      queryParams;\n    if (len && len > 0) {\n      var obj = array[len - 1];\n      if (isQueryParamsContainer(obj)) {\n        queryParams = obj.queryParams;\n        head = slice.call(array, 0, len - 1);\n        return [head, queryParams];\n      }\n    }\n    // SAFETY: We confirmed that the last item isn't a QP container\n    return [array, null];\n  }\n  // TODO: Actually check that Dict is QueryParams\n  function isQueryParamsContainer(obj) {\n    if (obj && typeof obj === 'object') {\n      var cast = obj;\n      return 'queryParams' in cast && Object.keys(cast.queryParams).every(k => typeof k === 'string');\n    }\n    return false;\n  }\n  /**\n    @private\n  \n    Coerces query param properties and array elements into strings.\n  **/\n  function coerceQueryParamsToString(queryParams) {\n    for (var key in queryParams) {\n      var val = queryParams[key];\n      if (typeof val === 'number') {\n        queryParams[key] = '' + val;\n      } else if (Array.isArray(val)) {\n        for (var i = 0, l = val.length; i < l; i++) {\n          val[i] = '' + val[i];\n        }\n      }\n    }\n  }\n  /**\n    @private\n   */\n  function log(router) {\n    if (!router.log) {\n      return;\n    }\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n    if (args.length === 2) {\n      var [sequence, msg] = args;\n      router.log('Transition #' + sequence + ': ' + msg);\n    } else {\n      var [_msg] = args;\n      router.log(_msg);\n    }\n  }\n  function isParam(object) {\n    return typeof object === 'string' || object instanceof String || typeof object === 'number' || object instanceof Number;\n  }\n  function forEach(array, callback) {\n    for (var i = 0, l = array.length; i < l && callback(array[i]) !== false; i++) {\n      // empty intentionally\n    }\n  }\n  function getChangelist(oldObject, newObject) {\n    var key;\n    var results = {\n      all: {},\n      changed: {},\n      removed: {}\n    };\n    merge(results.all, newObject);\n    var didChange = false;\n    coerceQueryParamsToString(oldObject);\n    coerceQueryParamsToString(newObject);\n    // Calculate removals\n    for (key in oldObject) {\n      if (hasOwnProperty.call(oldObject, key)) {\n        if (!hasOwnProperty.call(newObject, key)) {\n          didChange = true;\n          results.removed[key] = oldObject[key];\n        }\n      }\n    }\n    // Calculate changes\n    for (key in newObject) {\n      if (hasOwnProperty.call(newObject, key)) {\n        var oldElement = oldObject[key];\n        var newElement = newObject[key];\n        if (isArray(oldElement) && isArray(newElement)) {\n          if (oldElement.length !== newElement.length) {\n            results.changed[key] = newObject[key];\n            didChange = true;\n          } else {\n            for (var i = 0, l = oldElement.length; i < l; i++) {\n              if (oldElement[i] !== newElement[i]) {\n                results.changed[key] = newObject[key];\n                didChange = true;\n              }\n            }\n          }\n        } else if (oldObject[key] !== newObject[key]) {\n          results.changed[key] = newObject[key];\n          didChange = true;\n        }\n      }\n    }\n    return didChange ? results : undefined;\n  }\n  function isArray(obj) {\n    return Array.isArray(obj);\n  }\n  function promiseLabel(label) {\n    return 'Router: ' + label;\n  }\n  var STATE_SYMBOL = `__STATE__-2619860001345920-3322w3`;\n  _exports.STATE_SYMBOL = STATE_SYMBOL;\n  var PARAMS_SYMBOL = `__PARAMS__-261986232992830203-23323`;\n  _exports.PARAMS_SYMBOL = PARAMS_SYMBOL;\n  var QUERY_PARAMS_SYMBOL = `__QPS__-2619863929824844-32323`;\n  /**\n    A Transition is a thenable (a promise-like object) that represents\n    an attempt to transition to another route. It can be aborted, either\n    explicitly via `abort` or by attempting another transition while a\n    previous one is still underway. An aborted transition can also\n    be `retry()`d later.\n  \n    @class Transition\n    @constructor\n    @param {Object} router\n    @param {Object} intent\n    @param {Object} state\n    @param {Object} error\n    @private\n   */\n  _exports.QUERY_PARAMS_SYMBOL = QUERY_PARAMS_SYMBOL;\n  class Transition {\n    constructor(router, intent, state, error, previousTransition) {\n      if (error === void 0) {\n        error = undefined;\n      }\n      if (previousTransition === void 0) {\n        previousTransition = undefined;\n      }\n      this.from = null;\n      this.to = undefined;\n      this.isAborted = false;\n      this.isActive = true;\n      this.urlMethod = 'update';\n      this.resolveIndex = 0;\n      this.queryParamsOnly = false;\n      this.isTransition = true;\n      this.isCausedByAbortingTransition = false;\n      this.isCausedByInitialTransition = false;\n      this.isCausedByAbortingReplaceTransition = false;\n      this._visibleQueryParams = {};\n      this.isIntermediate = false;\n      this[STATE_SYMBOL] = state || router.state;\n      this.intent = intent;\n      this.router = router;\n      this.data = intent && intent.data || {};\n      this.resolvedModels = {};\n      this[QUERY_PARAMS_SYMBOL] = {};\n      this.promise = undefined;\n      this.error = undefined;\n      this[PARAMS_SYMBOL] = {};\n      this.routeInfos = [];\n      this.targetName = undefined;\n      this.pivotHandler = undefined;\n      this.sequence = -1;\n      if (true /* DEBUG */) {\n        var _error = new Error(`Transition creation stack`);\n        this.debugCreationStack = () => _error.stack;\n        // not aborted yet, will be replaced when `this.isAborted` is set\n        this.debugAbortStack = () => undefined;\n        this.debugPreviousTransition = previousTransition;\n      }\n      if (error) {\n        this.promise = _rsvp.Promise.reject(error);\n        this.error = error;\n        return;\n      }\n      // if you're doing multiple redirects, need the new transition to know if it\n      // is actually part of the first transition or not. Any further redirects\n      // in the initial transition also need to know if they are part of the\n      // initial transition\n      this.isCausedByAbortingTransition = !!previousTransition;\n      this.isCausedByInitialTransition = !!previousTransition && (previousTransition.isCausedByInitialTransition || previousTransition.sequence === 0);\n      // Every transition in the chain is a replace\n      this.isCausedByAbortingReplaceTransition = !!previousTransition && previousTransition.urlMethod === 'replace' && (!previousTransition.isCausedByAbortingTransition || previousTransition.isCausedByAbortingReplaceTransition);\n      if (state) {\n        this[PARAMS_SYMBOL] = state.params;\n        this[QUERY_PARAMS_SYMBOL] = state.queryParams;\n        this.routeInfos = state.routeInfos;\n        var len = state.routeInfos.length;\n        if (len) {\n          this.targetName = state.routeInfos[len - 1].name;\n        }\n        for (var i = 0; i < len; ++i) {\n          var handlerInfo = state.routeInfos[i];\n          // TODO: this all seems hacky\n          if (!handlerInfo.isResolved) {\n            break;\n          }\n          this.pivotHandler = handlerInfo.route;\n        }\n        this.sequence = router.currentSequence++;\n        this.promise = state.resolve(this).catch(result => {\n          var error = this.router.transitionDidError(result, this);\n          throw error;\n        }, promiseLabel('Handle Abort'));\n      } else {\n        this.promise = _rsvp.Promise.resolve(this[STATE_SYMBOL]);\n        this[PARAMS_SYMBOL] = {};\n      }\n    }\n    /**\n      The Transition's internal promise. Calling `.then` on this property\n      is that same as calling `.then` on the Transition object itself, but\n      this property is exposed for when you want to pass around a\n      Transition's promise, but not the Transition object itself, since\n      Transition object can be externally `abort`ed, while the promise\n      cannot.\n         @property promise\n      @type {Object}\n      @public\n     */\n    /**\n      Custom state can be stored on a Transition's `data` object.\n      This can be useful for decorating a Transition within an earlier\n      hook and shared with a later hook. Properties set on `data` will\n      be copied to new transitions generated by calling `retry` on this\n      transition.\n         @property data\n      @type {Object}\n      @public\n     */\n    /**\n      A standard promise hook that resolves if the transition\n      succeeds and rejects if it fails/redirects/aborts.\n         Forwards to the internal `promise` property which you can\n      use in situations where you want to pass around a thenable,\n      but not the Transition itself.\n         @method then\n      @param {Function} onFulfilled\n      @param {Function} onRejected\n      @param {String} label optional string for labeling the promise.\n      Useful for tooling.\n      @return {Promise}\n      @public\n     */\n    then(onFulfilled, onRejected, label) {\n      return this.promise.then(onFulfilled, onRejected, label);\n    }\n    /**\n         Forwards to the internal `promise` property which you can\n      use in situations where you want to pass around a thennable,\n      but not the Transition itself.\n         @method catch\n      @param {Function} onRejection\n      @param {String} label optional string for labeling the promise.\n      Useful for tooling.\n      @return {Promise}\n      @public\n     */\n    catch(onRejection, label) {\n      return this.promise.catch(onRejection, label);\n    }\n    /**\n         Forwards to the internal `promise` property which you can\n      use in situations where you want to pass around a thenable,\n      but not the Transition itself.\n         @method finally\n      @param {Function} callback\n      @param {String} label optional string for labeling the promise.\n      Useful for tooling.\n      @return {Promise}\n      @public\n     */\n    finally(callback, label) {\n      return this.promise.finally(callback, label);\n    }\n    /**\n      Aborts the Transition. Note you can also implicitly abort a transition\n      by initiating another transition while a previous one is underway.\n         @method abort\n      @return {Transition} this transition\n      @public\n     */\n    abort() {\n      this.rollback();\n      var transition = new Transition(this.router, undefined, undefined, undefined);\n      transition.to = this.from;\n      transition.from = this.from;\n      transition.isAborted = true;\n      this.router.routeWillChange(transition);\n      this.router.routeDidChange(transition);\n      return this;\n    }\n    rollback() {\n      if (!this.isAborted) {\n        log(this.router, this.sequence, this.targetName + ': transition was aborted');\n        if (true /* DEBUG */) {\n          var error = new Error(`Transition aborted stack`);\n          this.debugAbortStack = () => error.stack;\n        }\n        if (this.intent !== undefined && this.intent !== null) {\n          this.intent.preTransitionState = this.router.state;\n        }\n        this.isAborted = true;\n        this.isActive = false;\n        this.router.activeTransition = undefined;\n      }\n    }\n    redirect(newTransition) {\n      this.rollback();\n      this.router.routeWillChange(newTransition);\n    }\n    /**\n         Retries a previously-aborted transition (making sure to abort the\n      transition if it's still active). Returns a new transition that\n      represents the new attempt to transition.\n         @method retry\n      @return {Transition} new transition\n      @public\n     */\n    retry() {\n      // TODO: add tests for merged state retry()s\n      this.abort();\n      var newTransition = this.router.transitionByIntent(this.intent, false);\n      // inheriting a `null` urlMethod is not valid\n      // the urlMethod is only set to `null` when\n      // the transition is initiated *after* the url\n      // has been updated (i.e. `router.handleURL`)\n      //\n      // in that scenario, the url method cannot be\n      // inherited for a new transition because then\n      // the url would not update even though it should\n      if (this.urlMethod !== null) {\n        newTransition.method(this.urlMethod);\n      }\n      return newTransition;\n    }\n    /**\n         Sets the URL-changing method to be employed at the end of a\n      successful transition. By default, a new Transition will just\n      use `updateURL`, but passing 'replace' to this method will\n      cause the URL to update using 'replaceWith' instead. Omitting\n      a parameter will disable the URL change, allowing for transitions\n      that don't update the URL at completion (this is also used for\n      handleURL, since the URL has already changed before the\n      transition took place).\n         @method method\n      @param {String} method the type of URL-changing method to use\n        at the end of a transition. Accepted values are 'replace',\n        falsy values, or any other non-falsy value (which is\n        interpreted as an updateURL transition).\n         @return {Transition} this transition\n      @public\n     */\n    method(method) {\n      this.urlMethod = method;\n      return this;\n    }\n    // Alias 'trigger' as 'send'\n    send(ignoreFailure, _name, err, transition, handler) {\n      if (ignoreFailure === void 0) {\n        ignoreFailure = false;\n      }\n      this.trigger(ignoreFailure, _name, err, transition, handler);\n    }\n    /**\n         Fires an event on the current list of resolved/resolving\n      handlers within this transition. Useful for firing events\n      on route hierarchies that haven't fully been entered yet.\n         Note: This method is also aliased as `send`\n         @method trigger\n      @param {Boolean} [ignoreFailure=false] a boolean specifying whether unhandled events throw an error\n      @param {String} name the name of the event to fire\n      @public\n     */\n    trigger(ignoreFailure, name) {\n      if (ignoreFailure === void 0) {\n        ignoreFailure = false;\n      }\n      // TODO: Deprecate the current signature\n      if (typeof ignoreFailure === 'string') {\n        name = ignoreFailure;\n        ignoreFailure = false;\n      }\n      for (var _len2 = arguments.length, args = new Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {\n        args[_key2 - 2] = arguments[_key2];\n      }\n      this.router.triggerEvent(this[STATE_SYMBOL].routeInfos.slice(0, this.resolveIndex + 1), ignoreFailure, name, args);\n    }\n    /**\n      Transitions are aborted and their promises rejected\n      when redirects occur; this method returns a promise\n      that will follow any redirects that occur and fulfill\n      with the value fulfilled by any redirecting transitions\n      that occur.\n         @method followRedirects\n      @return {Promise} a promise that fulfills with the same\n        value that the final redirecting transition fulfills with\n      @public\n     */\n    followRedirects() {\n      var router = this.router;\n      return this.promise.catch(function (reason) {\n        if (router.activeTransition) {\n          return router.activeTransition.followRedirects();\n        }\n        return _rsvp.Promise.reject(reason);\n      });\n    }\n    toString() {\n      return 'Transition (sequence ' + this.sequence + ')';\n    }\n    /**\n      @private\n     */\n    log(message) {\n      log(this.router, this.sequence, message);\n    }\n  }\n  /**\n    @private\n  \n    Logs and returns an instance of TransitionAborted.\n   */\n  _exports.InternalTransition = Transition;\n  function logAbort(transition) {\n    log(transition.router, transition.sequence, 'detected abort.');\n    return buildTransitionAborted();\n  }\n  function isTransition(obj) {\n    return typeof obj === 'object' && obj instanceof Transition && obj.isTransition;\n  }\n  function prepareResult(obj) {\n    if (isTransition(obj)) {\n      return null;\n    }\n    return obj;\n  }\n  var ROUTE_INFOS = new WeakMap();\n  function toReadOnlyRouteInfo(routeInfos, queryParams, includeAttributes) {\n    if (queryParams === void 0) {\n      queryParams = {};\n    }\n    if (includeAttributes === void 0) {\n      includeAttributes = false;\n    }\n    return routeInfos.map((info, i) => {\n      var {\n        name,\n        params,\n        paramNames,\n        context,\n        route\n      } = info;\n      // SAFETY: This should be safe since it is just for use as a key\n      var key = info;\n      if (ROUTE_INFOS.has(key) && includeAttributes) {\n        var _routeInfo = ROUTE_INFOS.get(key);\n        _routeInfo = attachMetadata(route, _routeInfo);\n        var routeInfoWithAttribute = createRouteInfoWithAttributes(_routeInfo, context);\n        ROUTE_INFOS.set(key, routeInfoWithAttribute);\n        return routeInfoWithAttribute;\n      }\n      var routeInfo = {\n        find(predicate, thisArg) {\n          var publicInfo;\n          var arr = [];\n          if (predicate.length === 3) {\n            arr = routeInfos.map(\n            // SAFETY: This should be safe since it is just for use as a key\n            info => ROUTE_INFOS.get(info));\n          }\n          for (var _i = 0; routeInfos.length > _i; _i++) {\n            // SAFETY: This should be safe since it is just for use as a key\n            publicInfo = ROUTE_INFOS.get(routeInfos[_i]);\n            if (predicate.call(thisArg, publicInfo, _i, arr)) {\n              return publicInfo;\n            }\n          }\n          return undefined;\n        },\n        get name() {\n          return name;\n        },\n        get paramNames() {\n          return paramNames;\n        },\n        get metadata() {\n          return buildRouteInfoMetadata(info.route);\n        },\n        get parent() {\n          var parent = routeInfos[i - 1];\n          if (parent === undefined) {\n            return null;\n          }\n          // SAFETY: This should be safe since it is just for use as a key\n          return ROUTE_INFOS.get(parent);\n        },\n        get child() {\n          var child = routeInfos[i + 1];\n          if (child === undefined) {\n            return null;\n          }\n          // SAFETY: This should be safe since it is just for use as a key\n          return ROUTE_INFOS.get(child);\n        },\n        get localName() {\n          var parts = this.name.split('.');\n          return parts[parts.length - 1];\n        },\n        get params() {\n          return params;\n        },\n        get queryParams() {\n          return queryParams;\n        }\n      };\n      if (includeAttributes) {\n        routeInfo = createRouteInfoWithAttributes(routeInfo, context);\n      }\n      // SAFETY: This should be safe since it is just for use as a key\n      ROUTE_INFOS.set(info, routeInfo);\n      return routeInfo;\n    });\n  }\n  function createRouteInfoWithAttributes(routeInfo, context) {\n    var attributes = {\n      get attributes() {\n        return context;\n      }\n    };\n    if (!Object.isExtensible(routeInfo) || routeInfo.hasOwnProperty('attributes')) {\n      return Object.freeze(Object.assign({}, routeInfo, attributes));\n    }\n    return Object.assign(routeInfo, attributes);\n  }\n  function buildRouteInfoMetadata(route) {\n    if (route !== undefined && route !== null && route.buildRouteInfoMetadata !== undefined) {\n      return route.buildRouteInfoMetadata();\n    }\n    return null;\n  }\n  function attachMetadata(route, routeInfo) {\n    var metadata = {\n      get metadata() {\n        return buildRouteInfoMetadata(route);\n      }\n    };\n    if (!Object.isExtensible(routeInfo) || routeInfo.hasOwnProperty('metadata')) {\n      return Object.freeze(Object.assign({}, routeInfo, metadata));\n    }\n    return Object.assign(routeInfo, metadata);\n  }\n  class InternalRouteInfo {\n    constructor(router, name, paramNames, route) {\n      this._routePromise = undefined;\n      this._route = null;\n      this.params = {};\n      this.isResolved = false;\n      this.name = name;\n      this.paramNames = paramNames;\n      this.router = router;\n      if (route) {\n        this._processRoute(route);\n      }\n    }\n    getModel(_transition) {\n      return _rsvp.Promise.resolve(this.context);\n    }\n    serialize(_context) {\n      return this.params || {};\n    }\n    resolve(transition) {\n      return _rsvp.Promise.resolve(this.routePromise).then(route => {\n        throwIfAborted(transition);\n        return route;\n      }).then(() => this.runBeforeModelHook(transition)).then(() => throwIfAborted(transition)).then(() => this.getModel(transition)).then(resolvedModel => {\n        throwIfAborted(transition);\n        return resolvedModel;\n      }).then(resolvedModel => this.runAfterModelHook(transition, resolvedModel)).then(resolvedModel => this.becomeResolved(transition, resolvedModel));\n    }\n    becomeResolved(transition, resolvedContext) {\n      var params = this.serialize(resolvedContext);\n      if (transition) {\n        this.stashResolvedModel(transition, resolvedContext);\n        transition[PARAMS_SYMBOL] = transition[PARAMS_SYMBOL] || {};\n        transition[PARAMS_SYMBOL][this.name] = params;\n      }\n      var context;\n      var contextsMatch = resolvedContext === this.context;\n      if ('context' in this || !contextsMatch) {\n        context = resolvedContext;\n      }\n      // SAFETY: Since this is just for lookup, it should be safe\n      var cached = ROUTE_INFOS.get(this);\n      var resolved = new ResolvedRouteInfo(this.router, this.name, this.paramNames, params, this.route, context);\n      if (cached !== undefined) {\n        // SAFETY: This is potentially a bit risker, but for what we're doing, it should be ok.\n        ROUTE_INFOS.set(resolved, cached);\n      }\n      return resolved;\n    }\n    shouldSupersede(routeInfo) {\n      // Prefer this newer routeInfo over `other` if:\n      // 1) The other one doesn't exist\n      // 2) The names don't match\n      // 3) This route has a context that doesn't match\n      //    the other one (or the other one doesn't have one).\n      // 4) This route has parameters that don't match the other.\n      if (!routeInfo) {\n        return true;\n      }\n      var contextsMatch = routeInfo.context === this.context;\n      return routeInfo.name !== this.name || 'context' in this && !contextsMatch || this.hasOwnProperty('params') && !paramsMatch(this.params, routeInfo.params);\n    }\n    get route() {\n      // _route could be set to either a route object or undefined, so we\n      // compare against null to know when it's been set\n      if (this._route !== null) {\n        return this._route;\n      }\n      return this.fetchRoute();\n    }\n    set route(route) {\n      this._route = route;\n    }\n    get routePromise() {\n      if (this._routePromise) {\n        return this._routePromise;\n      }\n      this.fetchRoute();\n      return this._routePromise;\n    }\n    set routePromise(routePromise) {\n      this._routePromise = routePromise;\n    }\n    log(transition, message) {\n      if (transition.log) {\n        transition.log(this.name + ': ' + message);\n      }\n    }\n    updateRoute(route) {\n      route._internalName = this.name;\n      return this.route = route;\n    }\n    runBeforeModelHook(transition) {\n      if (transition.trigger) {\n        transition.trigger(true, 'willResolveModel', transition, this.route);\n      }\n      var result;\n      if (this.route) {\n        if (this.route.beforeModel !== undefined) {\n          result = this.route.beforeModel(transition);\n        }\n      }\n      if (isTransition(result)) {\n        result = null;\n      }\n      return _rsvp.Promise.resolve(result);\n    }\n    runAfterModelHook(transition, resolvedModel) {\n      // Stash the resolved model on the payload.\n      // This makes it possible for users to swap out\n      // the resolved model in afterModel.\n      var name = this.name;\n      this.stashResolvedModel(transition, resolvedModel);\n      var result;\n      if (this.route !== undefined) {\n        if (this.route.afterModel !== undefined) {\n          result = this.route.afterModel(resolvedModel, transition);\n        }\n      }\n      result = prepareResult(result);\n      return _rsvp.Promise.resolve(result).then(() => {\n        // Ignore the fulfilled value returned from afterModel.\n        // Return the value stashed in resolvedModels, which\n        // might have been swapped out in afterModel.\n        // SAFTEY: We expect this to be of type T, though typing it as such is challenging.\n        return transition.resolvedModels[name];\n      });\n    }\n    stashResolvedModel(transition, resolvedModel) {\n      transition.resolvedModels = transition.resolvedModels || {};\n      // SAFETY: It's unfortunate that we have to do this cast. It should be safe though.\n      transition.resolvedModels[this.name] = resolvedModel;\n    }\n    fetchRoute() {\n      var route = this.router.getRoute(this.name);\n      return this._processRoute(route);\n    }\n    _processRoute(route) {\n      // Setup a routePromise so that we can wait for asynchronously loaded routes\n      this.routePromise = _rsvp.Promise.resolve(route);\n      // Wait until the 'route' property has been updated when chaining to a route\n      // that is a promise\n      if (isPromise(route)) {\n        this.routePromise = this.routePromise.then(r => {\n          return this.updateRoute(r);\n        });\n        // set to undefined to avoid recursive loop in the route getter\n        return this.route = undefined;\n      } else if (route) {\n        return this.updateRoute(route);\n      }\n      return undefined;\n    }\n  }\n  _exports.InternalRouteInfo = InternalRouteInfo;\n  class ResolvedRouteInfo extends InternalRouteInfo {\n    constructor(router, name, paramNames, params, route, context) {\n      super(router, name, paramNames, route);\n      this.params = params;\n      this.isResolved = true;\n      this.context = context;\n    }\n    resolve(transition) {\n      // A ResolvedRouteInfo just resolved with itself.\n      if (transition && transition.resolvedModels) {\n        transition.resolvedModels[this.name] = this.context;\n      }\n      return _rsvp.Promise.resolve(this);\n    }\n  }\n  class UnresolvedRouteInfoByParam extends InternalRouteInfo {\n    constructor(router, name, paramNames, params, route) {\n      super(router, name, paramNames, route);\n      this.params = {};\n      if (params) {\n        this.params = params;\n      }\n    }\n    getModel(transition) {\n      var fullParams = this.params;\n      if (transition && transition[QUERY_PARAMS_SYMBOL]) {\n        fullParams = {};\n        merge(fullParams, this.params);\n        fullParams.queryParams = transition[QUERY_PARAMS_SYMBOL];\n      }\n      var route = this.route;\n      var result;\n      // FIXME: Review these casts\n      if (route.deserialize) {\n        result = route.deserialize(fullParams, transition);\n      } else if (route.model) {\n        result = route.model(fullParams, transition);\n      }\n      if (result && isTransition(result)) {\n        result = undefined;\n      }\n      return _rsvp.Promise.resolve(result);\n    }\n  }\n  class UnresolvedRouteInfoByObject extends InternalRouteInfo {\n    constructor(router, name, paramNames, context) {\n      super(router, name, paramNames);\n      this.context = context;\n      this.serializer = this.router.getSerializer(name);\n    }\n    getModel(transition) {\n      if (this.router.log !== undefined) {\n        this.router.log(this.name + ': resolving provided model');\n      }\n      return super.getModel(transition);\n    }\n    /**\n      @private\n         Serializes a route using its custom `serialize` method or\n      by a default that looks up the expected property name from\n      the dynamic segment.\n         @param {Object} model the model to be serialized for this route\n    */\n    serialize(model) {\n      var {\n        paramNames,\n        context\n      } = this;\n      if (!model) {\n        // SAFETY: By the time we serialize, we expect to be resolved.\n        // This may not be an entirely safe assumption though no tests fail.\n        model = context;\n      }\n      var object = {};\n      if (isParam(model)) {\n        object[paramNames[0]] = model;\n        return object;\n      }\n      // Use custom serialize if it exists.\n      if (this.serializer) {\n        // invoke this.serializer unbound (getSerializer returns a stateless function)\n        return this.serializer.call(null, model, paramNames);\n      } else if (this.route !== undefined) {\n        if (this.route.serialize) {\n          return this.route.serialize(model, paramNames);\n        }\n      }\n      if (paramNames.length !== 1) {\n        return;\n      }\n      var name = paramNames[0];\n      if (/_id$/.test(name)) {\n        // SAFETY: Model is supposed to extend IModel already\n        object[name] = model.id;\n      } else {\n        object[name] = model;\n      }\n      return object;\n    }\n  }\n  function paramsMatch(a, b) {\n    if (a === b) {\n      // Both are identical, may both be undefined\n      return true;\n    }\n    if (!a || !b) {\n      // Only one is undefined, already checked they aren't identical\n      return false;\n    }\n    // Note: this assumes that both params have the same\n    // number of keys, but since we're comparing the\n    // same routes, they should.\n    for (var k in a) {\n      if (a.hasOwnProperty(k) && a[k] !== b[k]) {\n        return false;\n      }\n    }\n    return true;\n  }\n  class TransitionIntent {\n    constructor(router, data) {\n      if (data === void 0) {\n        data = {};\n      }\n      this.router = router;\n      this.data = data;\n    }\n  }\n  function handleError(currentState, transition, error) {\n    // This is the only possible\n    // reject value of TransitionState#resolve\n    var routeInfos = currentState.routeInfos;\n    var errorHandlerIndex = transition.resolveIndex >= routeInfos.length ? routeInfos.length - 1 : transition.resolveIndex;\n    var wasAborted = transition.isAborted;\n    throw new TransitionError(error, currentState.routeInfos[errorHandlerIndex].route, wasAborted, currentState);\n  }\n  function resolveOneRouteInfo(currentState, transition) {\n    if (transition.resolveIndex === currentState.routeInfos.length) {\n      // This is is the only possible\n      // fulfill value of TransitionState#resolve\n      return;\n    }\n    var routeInfo = currentState.routeInfos[transition.resolveIndex];\n    var callback = proceed.bind(null, currentState, transition);\n    return routeInfo.resolve(transition).then(callback, null, currentState.promiseLabel('Proceed'));\n  }\n  function proceed(currentState, transition, resolvedRouteInfo) {\n    var wasAlreadyResolved = currentState.routeInfos[transition.resolveIndex].isResolved;\n    // Swap the previously unresolved routeInfo with\n    // the resolved routeInfo\n    currentState.routeInfos[transition.resolveIndex++] = resolvedRouteInfo;\n    if (!wasAlreadyResolved) {\n      // Call the redirect hook. The reason we call it here\n      // vs. afterModel is so that redirects into child\n      // routes don't re-run the model hooks for this\n      // already-resolved route.\n      var {\n        route\n      } = resolvedRouteInfo;\n      if (route !== undefined) {\n        if (route.redirect) {\n          route.redirect(resolvedRouteInfo.context, transition);\n        }\n      }\n    }\n    // Proceed after ensuring that the redirect hook\n    // didn't abort this transition by transitioning elsewhere.\n    throwIfAborted(transition);\n    return resolveOneRouteInfo(currentState, transition);\n  }\n  class TransitionState {\n    constructor() {\n      this.routeInfos = [];\n      this.queryParams = {};\n      this.params = {};\n    }\n    promiseLabel(label) {\n      var targetName = '';\n      forEach(this.routeInfos, function (routeInfo) {\n        if (targetName !== '') {\n          targetName += '.';\n        }\n        targetName += routeInfo.name;\n        return true;\n      });\n      return promiseLabel(\"'\" + targetName + \"': \" + label);\n    }\n    resolve(transition) {\n      // First, calculate params for this state. This is useful\n      // information to provide to the various route hooks.\n      var params = this.params;\n      forEach(this.routeInfos, routeInfo => {\n        params[routeInfo.name] = routeInfo.params || {};\n        return true;\n      });\n      transition.resolveIndex = 0;\n      var callback = resolveOneRouteInfo.bind(null, this, transition);\n      var errorHandler = handleError.bind(null, this, transition);\n      // The prelude RSVP.resolve() async moves us into the promise land.\n      return _rsvp.Promise.resolve(null, this.promiseLabel('Start transition')).then(callback, null, this.promiseLabel('Resolve route')).catch(errorHandler, this.promiseLabel('Handle error')).then(() => this);\n    }\n  }\n  _exports.TransitionState = TransitionState;\n  class TransitionError {\n    constructor(error, route, wasAborted, state) {\n      this.error = error;\n      this.route = route;\n      this.wasAborted = wasAborted;\n      this.state = state;\n    }\n  }\n  _exports.TransitionError = TransitionError;\n  class NamedTransitionIntent extends TransitionIntent {\n    constructor(router, name, pivotHandler, contexts, queryParams, data) {\n      if (contexts === void 0) {\n        contexts = [];\n      }\n      if (queryParams === void 0) {\n        queryParams = {};\n      }\n      super(router, data);\n      this.preTransitionState = undefined;\n      this.name = name;\n      this.pivotHandler = pivotHandler;\n      this.contexts = contexts;\n      this.queryParams = queryParams;\n    }\n    applyToState(oldState, isIntermediate) {\n      var handlers = this.router.recognizer.handlersFor(this.name);\n      var targetRouteName = handlers[handlers.length - 1].handler;\n      return this.applyToHandlers(oldState, handlers, targetRouteName, isIntermediate, false);\n    }\n    applyToHandlers(oldState, parsedHandlers, targetRouteName, isIntermediate, checkingIfActive) {\n      var i, len;\n      var newState = new TransitionState();\n      var objects = this.contexts.slice(0);\n      var invalidateIndex = parsedHandlers.length;\n      // Pivot handlers are provided for refresh transitions\n      if (this.pivotHandler) {\n        for (i = 0, len = parsedHandlers.length; i < len; ++i) {\n          if (parsedHandlers[i].handler === this.pivotHandler._internalName) {\n            invalidateIndex = i;\n            break;\n          }\n        }\n      }\n      for (i = parsedHandlers.length - 1; i >= 0; --i) {\n        var result = parsedHandlers[i];\n        var name = result.handler;\n        var oldHandlerInfo = oldState.routeInfos[i];\n        var newHandlerInfo = null;\n        if (result.names.length > 0) {\n          if (i >= invalidateIndex) {\n            newHandlerInfo = this.createParamHandlerInfo(name, result.names, objects, oldHandlerInfo);\n          } else {\n            newHandlerInfo = this.getHandlerInfoForDynamicSegment(name, result.names, objects, oldHandlerInfo, targetRouteName, i);\n          }\n        } else {\n          // This route has no dynamic segment.\n          // Therefore treat as a param-based handlerInfo\n          // with empty params. This will cause the `model`\n          // hook to be called with empty params, which is desirable.\n          newHandlerInfo = this.createParamHandlerInfo(name, result.names, objects, oldHandlerInfo);\n        }\n        if (checkingIfActive) {\n          // If we're performing an isActive check, we want to\n          // serialize URL params with the provided context, but\n          // ignore mismatches between old and new context.\n          newHandlerInfo = newHandlerInfo.becomeResolved(null,\n          // SAFETY: This seems to imply that it would be resolved, but it's unclear if that's actually the case.\n          newHandlerInfo.context);\n          var oldContext = oldHandlerInfo && oldHandlerInfo.context;\n          if (result.names.length > 0 && oldHandlerInfo.context !== undefined && newHandlerInfo.context === oldContext) {\n            // If contexts match in isActive test, assume params also match.\n            // This allows for flexibility in not requiring that every last\n            // handler provide a `serialize` method\n            newHandlerInfo.params = oldHandlerInfo && oldHandlerInfo.params;\n          }\n          newHandlerInfo.context = oldContext;\n        }\n        var handlerToUse = oldHandlerInfo;\n        if (i >= invalidateIndex || newHandlerInfo.shouldSupersede(oldHandlerInfo)) {\n          invalidateIndex = Math.min(i, invalidateIndex);\n          handlerToUse = newHandlerInfo;\n        }\n        if (isIntermediate && !checkingIfActive) {\n          handlerToUse = handlerToUse.becomeResolved(null,\n          // SAFETY: This seems to imply that it would be resolved, but it's unclear if that's actually the case.\n          handlerToUse.context);\n        }\n        newState.routeInfos.unshift(handlerToUse);\n      }\n      if (objects.length > 0) {\n        throw new Error('More context objects were passed than there are dynamic segments for the route: ' + targetRouteName);\n      }\n      if (!isIntermediate) {\n        this.invalidateChildren(newState.routeInfos, invalidateIndex);\n      }\n      merge(newState.queryParams, this.queryParams || {});\n      if (isIntermediate && oldState.queryParams) {\n        merge(newState.queryParams, oldState.queryParams);\n      }\n      return newState;\n    }\n    invalidateChildren(handlerInfos, invalidateIndex) {\n      for (var i = invalidateIndex, l = handlerInfos.length; i < l; ++i) {\n        var handlerInfo = handlerInfos[i];\n        if (handlerInfo.isResolved) {\n          var {\n            name,\n            params,\n            route,\n            paramNames\n          } = handlerInfos[i];\n          handlerInfos[i] = new UnresolvedRouteInfoByParam(this.router, name, paramNames, params, route);\n        }\n      }\n    }\n    getHandlerInfoForDynamicSegment(name, names, objects, oldHandlerInfo, _targetRouteName, i) {\n      var objectToUse;\n      if (objects.length > 0) {\n        // Use the objects provided for this transition.\n        objectToUse = objects[objects.length - 1];\n        if (isParam(objectToUse)) {\n          return this.createParamHandlerInfo(name, names, objects, oldHandlerInfo);\n        } else {\n          objects.pop();\n        }\n      } else if (oldHandlerInfo && oldHandlerInfo.name === name) {\n        // Reuse the matching oldHandlerInfo\n        return oldHandlerInfo;\n      } else {\n        if (this.preTransitionState) {\n          var preTransitionHandlerInfo = this.preTransitionState.routeInfos[i];\n          objectToUse = preTransitionHandlerInfo === null || preTransitionHandlerInfo === void 0 ? void 0 : preTransitionHandlerInfo.context;\n        } else {\n          // Ideally we should throw this error to provide maximal\n          // information to the user that not enough context objects\n          // were provided, but this proves too cumbersome in Ember\n          // in cases where inner template helpers are evaluated\n          // before parent helpers un-render, in which cases this\n          // error somewhat prematurely fires.\n          //throw new Error(\"Not enough context objects were provided to complete a transition to \" + targetRouteName + \". Specifically, the \" + name + \" route needs an object that can be serialized into its dynamic URL segments [\" + names.join(', ') + \"]\");\n          return oldHandlerInfo;\n        }\n      }\n      return new UnresolvedRouteInfoByObject(this.router, name, names, objectToUse);\n    }\n    createParamHandlerInfo(name, names, objects, oldHandlerInfo) {\n      var params = {};\n      // Soak up all the provided string/numbers\n      var numNames = names.length;\n      var missingParams = [];\n      while (numNames--) {\n        // Only use old params if the names match with the new handler\n        var oldParams = oldHandlerInfo && name === oldHandlerInfo.name && oldHandlerInfo.params || {};\n        var peek = objects[objects.length - 1];\n        var paramName = names[numNames];\n        if (isParam(peek)) {\n          params[paramName] = '' + objects.pop();\n        } else {\n          // If we're here, this means only some of the params\n          // were string/number params, so try and use a param\n          // value from a previous handler.\n          if (oldParams.hasOwnProperty(paramName)) {\n            params[paramName] = oldParams[paramName];\n          } else {\n            missingParams.push(paramName);\n          }\n        }\n      }\n      if (missingParams.length > 0) {\n        throw new Error(`You didn't provide enough string/numeric parameters to satisfy all of the dynamic segments for route ${name}.` + ` Missing params: ${missingParams}`);\n      }\n      return new UnresolvedRouteInfoByParam(this.router, name, names, params);\n    }\n  }\n  var UnrecognizedURLError = function () {\n    UnrecognizedURLError.prototype = Object.create(Error.prototype);\n    UnrecognizedURLError.prototype.constructor = UnrecognizedURLError;\n    function UnrecognizedURLError(message) {\n      var error = Error.call(this, message);\n      this.name = 'UnrecognizedURLError';\n      this.message = message || 'UnrecognizedURL';\n      if (Error.captureStackTrace) {\n        Error.captureStackTrace(this, UnrecognizedURLError);\n      } else {\n        this.stack = error.stack;\n      }\n    }\n    return UnrecognizedURLError;\n  }();\n  class URLTransitionIntent extends TransitionIntent {\n    constructor(router, url, data) {\n      super(router, data);\n      this.url = url;\n      this.preTransitionState = undefined;\n    }\n    applyToState(oldState) {\n      var newState = new TransitionState();\n      var results = this.router.recognizer.recognize(this.url),\n        i,\n        len;\n      if (!results) {\n        throw new UnrecognizedURLError(this.url);\n      }\n      var statesDiffer = false;\n      var _url = this.url;\n      // Checks if a handler is accessible by URL. If it is not, an error is thrown.\n      // For the case where the handler is loaded asynchronously, the error will be\n      // thrown once it is loaded.\n      function checkHandlerAccessibility(handler) {\n        if (handler && handler.inaccessibleByURL) {\n          throw new UnrecognizedURLError(_url);\n        }\n        return handler;\n      }\n      for (i = 0, len = results.length; i < len; ++i) {\n        var result = results[i];\n        var name = result.handler;\n        var paramNames = [];\n        if (this.router.recognizer.hasRoute(name)) {\n          paramNames = this.router.recognizer.handlersFor(name)[i].names;\n        }\n        var newRouteInfo = new UnresolvedRouteInfoByParam(this.router, name, paramNames, result.params);\n        var route = newRouteInfo.route;\n        if (route) {\n          checkHandlerAccessibility(route);\n        } else {\n          // If the handler is being loaded asynchronously, check if we can\n          // access it after it has resolved\n          newRouteInfo.routePromise = newRouteInfo.routePromise.then(checkHandlerAccessibility);\n        }\n        var oldRouteInfo = oldState.routeInfos[i];\n        if (statesDiffer || newRouteInfo.shouldSupersede(oldRouteInfo)) {\n          statesDiffer = true;\n          newState.routeInfos[i] = newRouteInfo;\n        } else {\n          newState.routeInfos[i] = oldRouteInfo;\n        }\n      }\n      merge(newState.queryParams, results.queryParams);\n      return newState;\n    }\n  }\n  class Router {\n    constructor(logger) {\n      this._lastQueryParams = {};\n      this.state = undefined;\n      this.oldState = undefined;\n      this.activeTransition = undefined;\n      this.currentRouteInfos = undefined;\n      this._changedQueryParams = undefined;\n      this.currentSequence = 0;\n      this.log = logger;\n      this.recognizer = new _routeRecognizer.default();\n      this.reset();\n    }\n    /**\n      The main entry point into the router. The API is essentially\n      the same as the `map` method in `route-recognizer`.\n         This method extracts the String handler at the last `.to()`\n      call and uses it as the name of the whole route.\n         @param {Function} callback\n    */\n    map(callback) {\n      this.recognizer.map(callback, function (recognizer, routes) {\n        for (var i = routes.length - 1, _proceed = true; i >= 0 && _proceed; --i) {\n          var route = routes[i];\n          var handler = route.handler;\n          recognizer.add(routes, {\n            as: handler\n          });\n          _proceed = route.path === '/' || route.path === '' || handler.slice(-6) === '.index';\n        }\n      });\n    }\n    hasRoute(route) {\n      return this.recognizer.hasRoute(route);\n    }\n    queryParamsTransition(changelist, wasTransitioning, oldState, newState) {\n      this.fireQueryParamDidChange(newState, changelist);\n      if (!wasTransitioning && this.activeTransition) {\n        // One of the routes in queryParamsDidChange\n        // caused a transition. Just return that transition.\n        return this.activeTransition;\n      } else {\n        // Running queryParamsDidChange didn't change anything.\n        // Just update query params and be on our way.\n        // We have to return a noop transition that will\n        // perform a URL update at the end. This gives\n        // the user the ability to set the url update\n        // method (default is replaceState).\n        var newTransition = new Transition(this, undefined, undefined);\n        newTransition.queryParamsOnly = true;\n        oldState.queryParams = this.finalizeQueryParamChange(newState.routeInfos, newState.queryParams, newTransition);\n        newTransition[QUERY_PARAMS_SYMBOL] = newState.queryParams;\n        this.toReadOnlyInfos(newTransition, newState);\n        this.routeWillChange(newTransition);\n        newTransition.promise = newTransition.promise.then(result => {\n          if (!newTransition.isAborted) {\n            this._updateURL(newTransition, oldState);\n            this.didTransition(this.currentRouteInfos);\n            this.toInfos(newTransition, newState.routeInfos, true);\n            this.routeDidChange(newTransition);\n          }\n          return result;\n        }, null, promiseLabel('Transition complete'));\n        return newTransition;\n      }\n    }\n    transitionByIntent(intent, isIntermediate) {\n      try {\n        return this.getTransitionByIntent(intent, isIntermediate);\n      } catch (e) {\n        return new Transition(this, intent, undefined, e, undefined);\n      }\n    }\n    recognize(url) {\n      var intent = new URLTransitionIntent(this, url);\n      var newState = this.generateNewState(intent);\n      if (newState === null) {\n        return newState;\n      }\n      var readonlyInfos = toReadOnlyRouteInfo(newState.routeInfos, newState.queryParams);\n      return readonlyInfos[readonlyInfos.length - 1];\n    }\n    recognizeAndLoad(url) {\n      var intent = new URLTransitionIntent(this, url);\n      var newState = this.generateNewState(intent);\n      if (newState === null) {\n        return _rsvp.Promise.reject(`URL ${url} was not recognized`);\n      }\n      var newTransition = new Transition(this, intent, newState, undefined);\n      return newTransition.then(() => {\n        var routeInfosWithAttributes = toReadOnlyRouteInfo(newState.routeInfos, newTransition[QUERY_PARAMS_SYMBOL], true);\n        return routeInfosWithAttributes[routeInfosWithAttributes.length - 1];\n      });\n    }\n    generateNewState(intent) {\n      try {\n        return intent.applyToState(this.state, false);\n      } catch (e) {\n        return null;\n      }\n    }\n    getTransitionByIntent(intent, isIntermediate) {\n      var wasTransitioning = !!this.activeTransition;\n      var oldState = wasTransitioning ? this.activeTransition[STATE_SYMBOL] : this.state;\n      var newTransition;\n      var newState = intent.applyToState(oldState, isIntermediate);\n      var queryParamChangelist = getChangelist(oldState.queryParams, newState.queryParams);\n      if (routeInfosEqual(newState.routeInfos, oldState.routeInfos)) {\n        // This is a no-op transition. See if query params changed.\n        if (queryParamChangelist) {\n          var _newTransition = this.queryParamsTransition(queryParamChangelist, wasTransitioning, oldState, newState);\n          _newTransition.queryParamsOnly = true;\n          // SAFETY: The returned OpaqueTransition should actually be this.\n          return _newTransition;\n        }\n        // No-op. No need to create a new transition.\n        return this.activeTransition || new Transition(this, undefined, undefined);\n      }\n      if (isIntermediate) {\n        var transition = new Transition(this, undefined, newState);\n        transition.isIntermediate = true;\n        this.toReadOnlyInfos(transition, newState);\n        this.setupContexts(newState, transition);\n        this.routeWillChange(transition);\n        return this.activeTransition;\n      }\n      // Create a new transition to the destination route.\n      newTransition = new Transition(this, intent, newState, undefined, this.activeTransition);\n      // transition is to same route with same params, only query params differ.\n      // not caught above probably because refresh() has been used\n      if (routeInfosSameExceptQueryParams(newState.routeInfos, oldState.routeInfos)) {\n        newTransition.queryParamsOnly = true;\n      }\n      this.toReadOnlyInfos(newTransition, newState);\n      // Abort and usurp any previously active transition.\n      if (this.activeTransition) {\n        this.activeTransition.redirect(newTransition);\n      }\n      this.activeTransition = newTransition;\n      // Transition promises by default resolve with resolved state.\n      // For our purposes, swap out the promise to resolve\n      // after the transition has been finalized.\n      newTransition.promise = newTransition.promise.then(result => {\n        return this.finalizeTransition(newTransition, result);\n      }, null, promiseLabel('Settle transition promise when transition is finalized'));\n      if (!wasTransitioning) {\n        this.notifyExistingHandlers(newState, newTransition);\n      }\n      this.fireQueryParamDidChange(newState, queryParamChangelist);\n      return newTransition;\n    }\n    /**\n    @private\n       Begins and returns a Transition based on the provided\n    arguments. Accepts arguments in the form of both URL\n    transitions and named transitions.\n       @param {Router} router\n    @param {Array[Object]} args arguments passed to transitionTo,\n      replaceWith, or handleURL\n    */\n    doTransition(name, modelsArray, isIntermediate) {\n      if (modelsArray === void 0) {\n        modelsArray = [];\n      }\n      if (isIntermediate === void 0) {\n        isIntermediate = false;\n      }\n      var lastArg = modelsArray[modelsArray.length - 1];\n      var queryParams = {};\n      if (lastArg && Object.prototype.hasOwnProperty.call(lastArg, 'queryParams')) {\n        // We just checked this.\n        // TODO: Use an assertion?\n        queryParams = modelsArray.pop().queryParams;\n      }\n      var intent;\n      if (name === undefined) {\n        log(this, 'Updating query params');\n        // A query param update is really just a transition\n        // into the route you're already on.\n        var {\n          routeInfos\n        } = this.state;\n        intent = new NamedTransitionIntent(this, routeInfos[routeInfos.length - 1].name, undefined, [], queryParams);\n      } else if (name.charAt(0) === '/') {\n        log(this, 'Attempting URL transition to ' + name);\n        intent = new URLTransitionIntent(this, name);\n      } else {\n        log(this, 'Attempting transition to ' + name);\n        intent = new NamedTransitionIntent(this, name, undefined,\n        // SAFETY: We know this to be the case since we removed the last item if it was QPs\n        modelsArray, queryParams);\n      }\n      return this.transitionByIntent(intent, isIntermediate);\n    }\n    /**\n    @private\n       Updates the URL (if necessary) and calls `setupContexts`\n    to update the router's array of `currentRouteInfos`.\n    */\n    finalizeTransition(transition, newState) {\n      try {\n        log(transition.router, transition.sequence, 'Resolved all models on destination route; finalizing transition.');\n        var routeInfos = newState.routeInfos;\n        // Run all the necessary enter/setup/exit hooks\n        this.setupContexts(newState, transition);\n        // Check if a redirect occurred in enter/setup\n        if (transition.isAborted) {\n          // TODO: cleaner way? distinguish b/w targetRouteInfos?\n          this.state.routeInfos = this.currentRouteInfos;\n          return _rsvp.Promise.reject(logAbort(transition));\n        }\n        this._updateURL(transition, newState);\n        transition.isActive = false;\n        this.activeTransition = undefined;\n        this.triggerEvent(this.currentRouteInfos, true, 'didTransition', []);\n        this.didTransition(this.currentRouteInfos);\n        this.toInfos(transition, newState.routeInfos, true);\n        this.routeDidChange(transition);\n        log(this, transition.sequence, 'TRANSITION COMPLETE.');\n        // Resolve with the final route.\n        return routeInfos[routeInfos.length - 1].route;\n      } catch (e) {\n        if (!isTransitionAborted(e)) {\n          var infos = transition[STATE_SYMBOL].routeInfos;\n          transition.trigger(true, 'error', e, transition, infos[infos.length - 1].route);\n          transition.abort();\n        }\n        throw e;\n      }\n    }\n    /**\n    @private\n       Takes an Array of `RouteInfo`s, figures out which ones are\n    exiting, entering, or changing contexts, and calls the\n    proper route hooks.\n       For example, consider the following tree of routes. Each route is\n    followed by the URL segment it handles.\n       ```\n    |~index (\"/\")\n    | |~posts (\"/posts\")\n    | | |-showPost (\"/:id\")\n    | | |-newPost (\"/new\")\n    | | |-editPost (\"/edit\")\n    | |~about (\"/about/:id\")\n    ```\n       Consider the following transitions:\n       1. A URL transition to `/posts/1`.\n       1. Triggers the `*model` callbacks on the\n          `index`, `posts`, and `showPost` routes\n       2. Triggers the `enter` callback on the same\n       3. Triggers the `setup` callback on the same\n    2. A direct transition to `newPost`\n       1. Triggers the `exit` callback on `showPost`\n       2. Triggers the `enter` callback on `newPost`\n       3. Triggers the `setup` callback on `newPost`\n    3. A direct transition to `about` with a specified\n       context object\n       1. Triggers the `exit` callback on `newPost`\n          and `posts`\n       2. Triggers the `serialize` callback on `about`\n       3. Triggers the `enter` callback on `about`\n       4. Triggers the `setup` callback on `about`\n       @param {Router} transition\n    @param {TransitionState} newState\n    */\n    setupContexts(newState, transition) {\n      var partition = this.partitionRoutes(this.state, newState);\n      var i, l, route;\n      for (i = 0, l = partition.exited.length; i < l; i++) {\n        route = partition.exited[i].route;\n        delete route.context;\n        if (route !== undefined) {\n          if (route._internalReset !== undefined) {\n            route._internalReset(true, transition);\n          }\n          if (route.exit !== undefined) {\n            route.exit(transition);\n          }\n        }\n      }\n      var oldState = this.oldState = this.state;\n      this.state = newState;\n      var currentRouteInfos = this.currentRouteInfos = partition.unchanged.slice();\n      try {\n        for (i = 0, l = partition.reset.length; i < l; i++) {\n          route = partition.reset[i].route;\n          if (route !== undefined) {\n            if (route._internalReset !== undefined) {\n              route._internalReset(false, transition);\n            }\n          }\n        }\n        for (i = 0, l = partition.updatedContext.length; i < l; i++) {\n          this.routeEnteredOrUpdated(currentRouteInfos, partition.updatedContext[i], false, transition);\n        }\n        for (i = 0, l = partition.entered.length; i < l; i++) {\n          this.routeEnteredOrUpdated(currentRouteInfos, partition.entered[i], true, transition);\n        }\n      } catch (e) {\n        this.state = oldState;\n        this.currentRouteInfos = oldState.routeInfos;\n        throw e;\n      }\n      this.state.queryParams = this.finalizeQueryParamChange(currentRouteInfos, newState.queryParams, transition);\n    }\n    /**\n    @private\n       Fires queryParamsDidChange event\n    */\n    fireQueryParamDidChange(newState, queryParamChangelist) {\n      // If queryParams changed trigger event\n      if (queryParamChangelist) {\n        // This is a little hacky but we need some way of storing\n        // changed query params given that no activeTransition\n        // is guaranteed to have occurred.\n        this._changedQueryParams = queryParamChangelist.all;\n        this.triggerEvent(newState.routeInfos, true, 'queryParamsDidChange', [queryParamChangelist.changed, queryParamChangelist.all, queryParamChangelist.removed]);\n        this._changedQueryParams = undefined;\n      }\n    }\n    /**\n    @private\n       Helper method used by setupContexts. Handles errors or redirects\n    that may happen in enter/setup.\n    */\n    routeEnteredOrUpdated(currentRouteInfos, routeInfo, enter, transition) {\n      var route = routeInfo.route,\n        context = routeInfo.context;\n      function _routeEnteredOrUpdated(route) {\n        if (enter) {\n          if (route.enter !== undefined) {\n            route.enter(transition);\n          }\n        }\n        throwIfAborted(transition);\n        route.context = context;\n        if (route.contextDidChange !== undefined) {\n          route.contextDidChange();\n        }\n        if (route.setup !== undefined) {\n          route.setup(context, transition);\n        }\n        throwIfAborted(transition);\n        currentRouteInfos.push(routeInfo);\n        return route;\n      }\n      // If the route doesn't exist, it means we haven't resolved the route promise yet\n      if (route === undefined) {\n        routeInfo.routePromise = routeInfo.routePromise.then(_routeEnteredOrUpdated);\n      } else {\n        _routeEnteredOrUpdated(route);\n      }\n      return true;\n    }\n    /**\n    @private\n       This function is called when transitioning from one URL to\n    another to determine which routes are no longer active,\n    which routes are newly active, and which routes remain\n    active but have their context changed.\n       Take a list of old routes and new routes and partition\n    them into four buckets:\n       * unchanged: the route was active in both the old and\n      new URL, and its context remains the same\n    * updated context: the route was active in both the\n      old and new URL, but its context changed. The route's\n      `setup` method, if any, will be called with the new\n      context.\n    * exited: the route was active in the old URL, but is\n      no longer active.\n    * entered: the route was not active in the old URL, but\n      is now active.\n       The PartitionedRoutes structure has four fields:\n       * `updatedContext`: a list of `RouteInfo` objects that\n      represent routes that remain active but have a changed\n      context\n    * `entered`: a list of `RouteInfo` objects that represent\n      routes that are newly active\n    * `exited`: a list of `RouteInfo` objects that are no\n      longer active.\n    * `unchanged`: a list of `RouteInfo` objects that remain active.\n       @param {Array[InternalRouteInfo]} oldRoutes a list of the route\n      information for the previous URL (or `[]` if this is the\n      first handled transition)\n    @param {Array[InternalRouteInfo]} newRoutes a list of the route\n      information for the new URL\n       @return {Partition}\n    */\n    partitionRoutes(oldState, newState) {\n      var oldRouteInfos = oldState.routeInfos;\n      var newRouteInfos = newState.routeInfos;\n      var routes = {\n        updatedContext: [],\n        exited: [],\n        entered: [],\n        unchanged: [],\n        reset: []\n      };\n      var routeChanged,\n        contextChanged = false,\n        i,\n        l;\n      for (i = 0, l = newRouteInfos.length; i < l; i++) {\n        var oldRouteInfo = oldRouteInfos[i],\n          newRouteInfo = newRouteInfos[i];\n        if (!oldRouteInfo || oldRouteInfo.route !== newRouteInfo.route) {\n          routeChanged = true;\n        }\n        if (routeChanged) {\n          routes.entered.push(newRouteInfo);\n          if (oldRouteInfo) {\n            routes.exited.unshift(oldRouteInfo);\n          }\n        } else if (contextChanged || oldRouteInfo.context !== newRouteInfo.context) {\n          contextChanged = true;\n          routes.updatedContext.push(newRouteInfo);\n        } else {\n          routes.unchanged.push(oldRouteInfo);\n        }\n      }\n      for (i = newRouteInfos.length, l = oldRouteInfos.length; i < l; i++) {\n        routes.exited.unshift(oldRouteInfos[i]);\n      }\n      routes.reset = routes.updatedContext.slice();\n      routes.reset.reverse();\n      return routes;\n    }\n    _updateURL(transition, state) {\n      var urlMethod = transition.urlMethod;\n      if (!urlMethod) {\n        return;\n      }\n      var {\n        routeInfos\n      } = state;\n      var {\n        name: routeName\n      } = routeInfos[routeInfos.length - 1];\n      var params = {};\n      for (var i = routeInfos.length - 1; i >= 0; --i) {\n        var routeInfo = routeInfos[i];\n        merge(params, routeInfo.params);\n        if (routeInfo.route.inaccessibleByURL) {\n          urlMethod = null;\n        }\n      }\n      if (urlMethod) {\n        params.queryParams = transition._visibleQueryParams || state.queryParams;\n        var url = this.recognizer.generate(routeName, params);\n        // transitions during the initial transition must always use replaceURL.\n        // When the app boots, you are at a url, e.g. /foo. If some route\n        // redirects to bar as part of the initial transition, you don't want to\n        // add a history entry for /foo. If you do, pressing back will immediately\n        // hit the redirect again and take you back to /bar, thus killing the back\n        // button\n        var initial = transition.isCausedByInitialTransition;\n        // say you are at / and you click a link to route /foo. In /foo's\n        // route, the transition is aborted using replaceWith('/bar').\n        // Because the current url is still /, the history entry for / is\n        // removed from the history. Clicking back will take you to the page\n        // you were on before /, which is often not even the app, thus killing\n        // the back button. That's why updateURL is always correct for an\n        // aborting transition that's not the initial transition\n        var replaceAndNotAborting = urlMethod === 'replace' && !transition.isCausedByAbortingTransition;\n        // because calling refresh causes an aborted transition, this needs to be\n        // special cased - if the initial transition is a replace transition, the\n        // urlMethod should be honored here.\n        var isQueryParamsRefreshTransition = transition.queryParamsOnly && urlMethod === 'replace';\n        // say you are at / and you a `replaceWith(/foo)` is called. Then, that\n        // transition is aborted with `replaceWith(/bar)`. At the end, we should\n        // end up with /bar replacing /. We are replacing the replace. We only\n        // will replace the initial route if all subsequent aborts are also\n        // replaces. However, there is some ambiguity around the correct behavior\n        // here.\n        var replacingReplace = urlMethod === 'replace' && transition.isCausedByAbortingReplaceTransition;\n        if (initial || replaceAndNotAborting || isQueryParamsRefreshTransition || replacingReplace) {\n          this.replaceURL(url);\n        } else {\n          this.updateURL(url);\n        }\n      }\n    }\n    finalizeQueryParamChange(resolvedHandlers, newQueryParams, transition) {\n      // We fire a finalizeQueryParamChange event which\n      // gives the new route hierarchy a chance to tell\n      // us which query params it's consuming and what\n      // their final values are. If a query param is\n      // no longer consumed in the final route hierarchy,\n      // its serialized segment will be removed\n      // from the URL.\n      for (var k in newQueryParams) {\n        if (newQueryParams.hasOwnProperty(k) && newQueryParams[k] === null) {\n          delete newQueryParams[k];\n        }\n      }\n      var finalQueryParamsArray = [];\n      this.triggerEvent(resolvedHandlers, true, 'finalizeQueryParamChange', [newQueryParams, finalQueryParamsArray, transition]);\n      if (transition) {\n        transition._visibleQueryParams = {};\n      }\n      var finalQueryParams = {};\n      for (var i = 0, len = finalQueryParamsArray.length; i < len; ++i) {\n        var qp = finalQueryParamsArray[i];\n        finalQueryParams[qp.key] = qp.value;\n        if (transition && qp.visible !== false) {\n          transition._visibleQueryParams[qp.key] = qp.value;\n        }\n      }\n      return finalQueryParams;\n    }\n    toReadOnlyInfos(newTransition, newState) {\n      var oldRouteInfos = this.state.routeInfos;\n      this.fromInfos(newTransition, oldRouteInfos);\n      this.toInfos(newTransition, newState.routeInfos);\n      this._lastQueryParams = newState.queryParams;\n    }\n    fromInfos(newTransition, oldRouteInfos) {\n      if (newTransition !== undefined && oldRouteInfos.length > 0) {\n        var fromInfos = toReadOnlyRouteInfo(oldRouteInfos, Object.assign({}, this._lastQueryParams), true);\n        newTransition.from = fromInfos[fromInfos.length - 1] || null;\n      }\n    }\n    toInfos(newTransition, newRouteInfos, includeAttributes) {\n      if (includeAttributes === void 0) {\n        includeAttributes = false;\n      }\n      if (newTransition !== undefined && newRouteInfos.length > 0) {\n        var toInfos = toReadOnlyRouteInfo(newRouteInfos, Object.assign({}, newTransition[QUERY_PARAMS_SYMBOL]), includeAttributes);\n        newTransition.to = toInfos[toInfos.length - 1] || null;\n      }\n    }\n    notifyExistingHandlers(newState, newTransition) {\n      var oldRouteInfos = this.state.routeInfos,\n        i,\n        oldRouteInfoLen,\n        oldHandler,\n        newRouteInfo;\n      oldRouteInfoLen = oldRouteInfos.length;\n      for (i = 0; i < oldRouteInfoLen; i++) {\n        oldHandler = oldRouteInfos[i];\n        newRouteInfo = newState.routeInfos[i];\n        if (!newRouteInfo || oldHandler.name !== newRouteInfo.name) {\n          break;\n        }\n        if (!newRouteInfo.isResolved) {}\n      }\n      this.triggerEvent(oldRouteInfos, true, 'willTransition', [newTransition]);\n      this.routeWillChange(newTransition);\n      this.willTransition(oldRouteInfos, newState.routeInfos, newTransition);\n    }\n    /**\n      Clears the current and target route routes and triggers exit\n      on each of them starting at the leaf and traversing up through\n      its ancestors.\n    */\n    reset() {\n      if (this.state) {\n        forEach(this.state.routeInfos.slice().reverse(), function (routeInfo) {\n          var route = routeInfo.route;\n          if (route !== undefined) {\n            if (route.exit !== undefined) {\n              route.exit();\n            }\n          }\n          return true;\n        });\n      }\n      this.oldState = undefined;\n      this.state = new TransitionState();\n      this.currentRouteInfos = undefined;\n    }\n    /**\n      let handler = routeInfo.handler;\n      The entry point for handling a change to the URL (usually\n      via the back and forward button).\n         Returns an Array of handlers and the parameters associated\n      with those parameters.\n         @param {String} url a URL to process\n         @return {Array} an Array of `[handler, parameter]` tuples\n    */\n    handleURL(url) {\n      // Perform a URL-based transition, but don't change\n      // the URL afterward, since it already happened.\n      if (url.charAt(0) !== '/') {\n        url = '/' + url;\n      }\n      return this.doTransition(url).method(null);\n    }\n    /**\n      Transition into the specified named route.\n         If necessary, trigger the exit callback on any routes\n      that are no longer represented by the target route.\n         @param {String} name the name of the route\n    */\n    transitionTo(name) {\n      for (var _len3 = arguments.length, contexts = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n        contexts[_key3 - 1] = arguments[_key3];\n      }\n      if (typeof name === 'object') {\n        contexts.push(name);\n        return this.doTransition(undefined, contexts, false);\n      }\n      return this.doTransition(name, contexts);\n    }\n    intermediateTransitionTo(name) {\n      for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {\n        args[_key4 - 1] = arguments[_key4];\n      }\n      return this.doTransition(name, args, true);\n    }\n    refresh(pivotRoute) {\n      var previousTransition = this.activeTransition;\n      var state = previousTransition ? previousTransition[STATE_SYMBOL] : this.state;\n      var routeInfos = state.routeInfos;\n      if (pivotRoute === undefined) {\n        pivotRoute = routeInfos[0].route;\n      }\n      log(this, 'Starting a refresh transition');\n      var name = routeInfos[routeInfos.length - 1].name;\n      var intent = new NamedTransitionIntent(this, name, pivotRoute, [], this._changedQueryParams || state.queryParams);\n      var newTransition = this.transitionByIntent(intent, false);\n      // if the previous transition is a replace transition, that needs to be preserved\n      if (previousTransition && previousTransition.urlMethod === 'replace') {\n        newTransition.method(previousTransition.urlMethod);\n      }\n      return newTransition;\n    }\n    /**\n      Identical to `transitionTo` except that the current URL will be replaced\n      if possible.\n         This method is intended primarily for use with `replaceState`.\n         @param {String} name the name of the route\n    */\n    replaceWith(name) {\n      return this.doTransition(name).method('replace');\n    }\n    /**\n      Take a named route and context objects and generate a\n      URL.\n         @param {String} name the name of the route to generate\n        a URL for\n      @param {...Object} objects a list of objects to serialize\n         @return {String} a URL\n    */\n    generate(routeName) {\n      for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) {\n        args[_key5 - 1] = arguments[_key5];\n      }\n      var partitionedArgs = extractQueryParams(args),\n        suppliedParams = partitionedArgs[0],\n        queryParams = partitionedArgs[1];\n      // Construct a TransitionIntent with the provided params\n      // and apply it to the present state of the router.\n      var intent = new NamedTransitionIntent(this, routeName, undefined, suppliedParams);\n      var state = intent.applyToState(this.state, false);\n      var params = {};\n      for (var i = 0, len = state.routeInfos.length; i < len; ++i) {\n        var routeInfo = state.routeInfos[i];\n        var routeParams = routeInfo.serialize();\n        merge(params, routeParams);\n      }\n      params.queryParams = queryParams;\n      return this.recognizer.generate(routeName, params);\n    }\n    applyIntent(routeName, contexts) {\n      var intent = new NamedTransitionIntent(this, routeName, undefined, contexts);\n      var state = this.activeTransition && this.activeTransition[STATE_SYMBOL] || this.state;\n      return intent.applyToState(state, false);\n    }\n    isActiveIntent(routeName, contexts, queryParams, _state) {\n      var state = _state || this.state,\n        targetRouteInfos = state.routeInfos,\n        routeInfo,\n        len;\n      if (!targetRouteInfos.length) {\n        return false;\n      }\n      var targetHandler = targetRouteInfos[targetRouteInfos.length - 1].name;\n      var recognizerHandlers = this.recognizer.handlersFor(targetHandler);\n      var index = 0;\n      for (len = recognizerHandlers.length; index < len; ++index) {\n        routeInfo = targetRouteInfos[index];\n        if (routeInfo.name === routeName) {\n          break;\n        }\n      }\n      if (index === recognizerHandlers.length) {\n        // The provided route name isn't even in the route hierarchy.\n        return false;\n      }\n      var testState = new TransitionState();\n      testState.routeInfos = targetRouteInfos.slice(0, index + 1);\n      recognizerHandlers = recognizerHandlers.slice(0, index + 1);\n      var intent = new NamedTransitionIntent(this, targetHandler, undefined, contexts);\n      var newState = intent.applyToHandlers(testState, recognizerHandlers, targetHandler, true, true);\n      var routesEqual = routeInfosEqual(newState.routeInfos, testState.routeInfos);\n      if (!queryParams || !routesEqual) {\n        return routesEqual;\n      }\n      // Get a hash of QPs that will still be active on new route\n      var activeQPsOnNewHandler = {};\n      merge(activeQPsOnNewHandler, queryParams);\n      var activeQueryParams = state.queryParams;\n      for (var key in activeQueryParams) {\n        if (activeQueryParams.hasOwnProperty(key) && activeQPsOnNewHandler.hasOwnProperty(key)) {\n          activeQPsOnNewHandler[key] = activeQueryParams[key];\n        }\n      }\n      return routesEqual && !getChangelist(activeQPsOnNewHandler, queryParams);\n    }\n    isActive(routeName) {\n      for (var _len6 = arguments.length, args = new Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) {\n        args[_key6 - 1] = arguments[_key6];\n      }\n      var [contexts, queryParams] = extractQueryParams(args);\n      return this.isActiveIntent(routeName, contexts, queryParams);\n    }\n    trigger(name) {\n      for (var _len7 = arguments.length, args = new Array(_len7 > 1 ? _len7 - 1 : 0), _key7 = 1; _key7 < _len7; _key7++) {\n        args[_key7 - 1] = arguments[_key7];\n      }\n      this.triggerEvent(this.currentRouteInfos, false, name, args);\n    }\n  }\n  function routeInfosEqual(routeInfos, otherRouteInfos) {\n    if (routeInfos.length !== otherRouteInfos.length) {\n      return false;\n    }\n    for (var i = 0, len = routeInfos.length; i < len; ++i) {\n      // SAFETY: Just casting for comparison\n      if (routeInfos[i] !== otherRouteInfos[i]) {\n        return false;\n      }\n    }\n    return true;\n  }\n  function routeInfosSameExceptQueryParams(routeInfos, otherRouteInfos) {\n    if (routeInfos.length !== otherRouteInfos.length) {\n      return false;\n    }\n    for (var i = 0, len = routeInfos.length; i < len; ++i) {\n      if (routeInfos[i].name !== otherRouteInfos[i].name) {\n        return false;\n      }\n      if (!paramsEqual(routeInfos[i].params, otherRouteInfos[i].params)) {\n        return false;\n      }\n    }\n    return true;\n  }\n  function paramsEqual(params, otherParams) {\n    if (params === otherParams) {\n      // Both identical or both undefined\n      return true;\n    }\n    if (!params || !otherParams) {\n      // One is falsy but other is not\n      return false;\n    }\n    var keys = Object.keys(params);\n    var otherKeys = Object.keys(otherParams);\n    if (keys.length !== otherKeys.length) {\n      return false;\n    }\n    for (var i = 0, len = keys.length; i < len; ++i) {\n      var key = keys[i];\n      if (params[key] !== otherParams[key]) {\n        return false;\n      }\n    }\n    return true;\n  }\n  var _default = Router;\n  _exports.default = _default;\n});","define(\"rsvp\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.Promise = _exports.EventTarget = void 0;\n  _exports.all = all$1;\n  _exports.allSettled = allSettled;\n  _exports.asap = asap;\n  _exports.cast = _exports.async = void 0;\n  _exports.configure = configure;\n  _exports.default = void 0;\n  _exports.defer = defer;\n  _exports.denodeify = denodeify;\n  _exports.filter = filter;\n  _exports.hash = hash;\n  _exports.hashSettled = hashSettled;\n  _exports.map = map;\n  _exports.off = off;\n  _exports.on = on;\n  _exports.race = race$1;\n  _exports.reject = reject$2;\n  _exports.resolve = resolve$2;\n  _exports.rethrow = rethrow;\n  function callbacksFor(object) {\n    var callbacks = object._promiseCallbacks;\n    if (!callbacks) {\n      callbacks = object._promiseCallbacks = {};\n    }\n    return callbacks;\n  }\n\n  /**\n    @class EventTarget\n    @for rsvp\n    @public\n  */\n  var EventTarget = {\n    /**\n      `EventTarget.mixin` extends an object with EventTarget methods. For\n      Example:\n       ```javascript\n      import EventTarget from 'rsvp';\n       let object = {};\n       EventTarget.mixin(object);\n       object.on('finished', function(event) {\n        // handle event\n      });\n       object.trigger('finished', { detail: value });\n      ```\n       `EventTarget.mixin` also works with prototypes:\n       ```javascript\n      import EventTarget from 'rsvp';\n       let Person = function() {};\n      EventTarget.mixin(Person.prototype);\n       let yehuda = new Person();\n      let tom = new Person();\n       yehuda.on('poke', function(event) {\n        console.log('Yehuda says OW');\n      });\n       tom.on('poke', function(event) {\n        console.log('Tom says OW');\n      });\n       yehuda.trigger('poke');\n      tom.trigger('poke');\n      ```\n       @method mixin\n      @for rsvp\n      @private\n      @param {Object} object object to extend with EventTarget methods\n    */\n    mixin(object) {\n      object.on = this.on;\n      object.off = this.off;\n      object.trigger = this.trigger;\n      object._promiseCallbacks = undefined;\n      return object;\n    },\n    /**\n      Registers a callback to be executed when `eventName` is triggered\n       ```javascript\n      object.on('event', function(eventInfo){\n        // handle the event\n      });\n       object.trigger('event');\n      ```\n       @method on\n      @for EventTarget\n      @private\n      @param {String} eventName name of the event to listen for\n      @param {Function} callback function to be called when the event is triggered.\n    */\n    on(eventName, callback) {\n      if (typeof callback !== 'function') {\n        throw new TypeError('Callback must be a function');\n      }\n      var allCallbacks = callbacksFor(this);\n      var callbacks = allCallbacks[eventName];\n      if (!callbacks) {\n        callbacks = allCallbacks[eventName] = [];\n      }\n      if (callbacks.indexOf(callback) === -1) {\n        callbacks.push(callback);\n      }\n    },\n    /**\n      You can use `off` to stop firing a particular callback for an event:\n       ```javascript\n      function doStuff() { // do stuff! }\n      object.on('stuff', doStuff);\n       object.trigger('stuff'); // doStuff will be called\n       // Unregister ONLY the doStuff callback\n      object.off('stuff', doStuff);\n      object.trigger('stuff'); // doStuff will NOT be called\n      ```\n       If you don't pass a `callback` argument to `off`, ALL callbacks for the\n      event will not be executed when the event fires. For example:\n       ```javascript\n      let callback1 = function(){};\n      let callback2 = function(){};\n       object.on('stuff', callback1);\n      object.on('stuff', callback2);\n       object.trigger('stuff'); // callback1 and callback2 will be executed.\n       object.off('stuff');\n      object.trigger('stuff'); // callback1 and callback2 will not be executed!\n      ```\n       @method off\n      @for rsvp\n      @private\n      @param {String} eventName event to stop listening to\n      @param {Function} [callback] optional argument. If given, only the function\n      given will be removed from the event's callback queue. If no `callback`\n      argument is given, all callbacks will be removed from the event's callback\n      queue.\n    */\n    off(eventName, callback) {\n      var allCallbacks = callbacksFor(this);\n      if (!callback) {\n        allCallbacks[eventName] = [];\n        return;\n      }\n      var callbacks = allCallbacks[eventName];\n      var index = callbacks.indexOf(callback);\n      if (index !== -1) {\n        callbacks.splice(index, 1);\n      }\n    },\n    /**\n      Use `trigger` to fire custom events. For example:\n       ```javascript\n      object.on('foo', function(){\n        console.log('foo event happened!');\n      });\n      object.trigger('foo');\n      // 'foo event happened!' logged to the console\n      ```\n       You can also pass a value as a second argument to `trigger` that will be\n      passed as an argument to all event listeners for the event:\n       ```javascript\n      object.on('foo', function(value){\n        console.log(value.name);\n      });\n       object.trigger('foo', { name: 'bar' });\n      // 'bar' logged to the console\n      ```\n       @method trigger\n      @for rsvp\n      @private\n      @param {String} eventName name of the event to be triggered\n      @param {*} [options] optional value to be passed to any event handlers for\n      the given `eventName`\n    */\n    trigger(eventName, options, label) {\n      var allCallbacks = callbacksFor(this);\n      var callbacks = allCallbacks[eventName];\n      if (callbacks) {\n        // Don't cache the callbacks.length since it may grow\n        var callback;\n        for (var i = 0; i < callbacks.length; i++) {\n          callback = callbacks[i];\n          callback(options, label);\n        }\n      }\n    }\n  };\n  _exports.EventTarget = EventTarget;\n  var config = {\n    instrument: false\n  };\n  EventTarget['mixin'](config);\n  function configure(name, value) {\n    if (arguments.length === 2) {\n      config[name] = value;\n    } else {\n      return config[name];\n    }\n  }\n  var queue = [];\n  function scheduleFlush() {\n    setTimeout(() => {\n      for (var i = 0; i < queue.length; i++) {\n        var entry = queue[i];\n        var payload = entry.payload;\n        payload.guid = payload.key + payload.id;\n        payload.childGuid = payload.key + payload.childId;\n        if (payload.error) {\n          payload.stack = payload.error.stack;\n        }\n        config['trigger'](entry.name, entry.payload);\n      }\n      queue.length = 0;\n    }, 50);\n  }\n  function instrument(eventName, promise, child) {\n    if (1 === queue.push({\n      name: eventName,\n      payload: {\n        key: promise._guidKey,\n        id: promise._id,\n        eventName: eventName,\n        detail: promise._result,\n        childId: child && child._id,\n        label: promise._label,\n        timeStamp: Date.now(),\n        error: config[\"instrument-with-stack\"] ? new Error(promise._label) : null\n      }\n    })) {\n      scheduleFlush();\n    }\n  }\n\n  /**\n    `Promise.resolve` returns a promise that will become resolved with the\n    passed `value`. It is shorthand for the following:\n  \n    ```javascript\n    import Promise from 'rsvp';\n  \n    let promise = new Promise(function(resolve, reject){\n      resolve(1);\n    });\n  \n    promise.then(function(value){\n      // value === 1\n    });\n    ```\n  \n    Instead of writing the above, your code now simply becomes the following:\n  \n    ```javascript\n    import Promise from 'rsvp';\n  \n    let promise = RSVP.Promise.resolve(1);\n  \n    promise.then(function(value){\n      // value === 1\n    });\n    ```\n  \n    @method resolve\n    @for Promise\n    @static\n    @param {*} object value that the returned promise will be resolved with\n    @param {String} [label] optional string for identifying the returned promise.\n    Useful for tooling.\n    @return {Promise} a promise that will become fulfilled with the given\n    `value`\n  */\n  function resolve$$1(object, label) {\n    /*jshint validthis:true */\n    var Constructor = this;\n    if (object && typeof object === 'object' && object.constructor === Constructor) {\n      return object;\n    }\n    var promise = new Constructor(noop, label);\n    resolve$1(promise, object);\n    return promise;\n  }\n  function withOwnPromise() {\n    return new TypeError('A promises callback cannot return that same promise.');\n  }\n  function objectOrFunction(x) {\n    var type = typeof x;\n    return x !== null && (type === 'object' || type === 'function');\n  }\n  function noop() {}\n  var PENDING = void 0;\n  var FULFILLED = 1;\n  var REJECTED = 2;\n  function tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {\n    try {\n      then$$1.call(value, fulfillmentHandler, rejectionHandler);\n    } catch (e) {\n      return e;\n    }\n  }\n  function handleForeignThenable(promise, thenable, then$$1) {\n    config.async(promise => {\n      var sealed = false;\n      var error = tryThen(then$$1, thenable, value => {\n        if (sealed) {\n          return;\n        }\n        sealed = true;\n        if (thenable === value) {\n          fulfill(promise, value);\n        } else {\n          resolve$1(promise, value);\n        }\n      }, reason => {\n        if (sealed) {\n          return;\n        }\n        sealed = true;\n        reject(promise, reason);\n      }, 'Settle: ' + (promise._label || ' unknown promise'));\n      if (!sealed && error) {\n        sealed = true;\n        reject(promise, error);\n      }\n    }, promise);\n  }\n  function handleOwnThenable(promise, thenable) {\n    if (thenable._state === FULFILLED) {\n      fulfill(promise, thenable._result);\n    } else if (thenable._state === REJECTED) {\n      thenable._onError = null;\n      reject(promise, thenable._result);\n    } else {\n      subscribe(thenable, undefined, value => {\n        if (thenable === value) {\n          fulfill(promise, value);\n        } else {\n          resolve$1(promise, value);\n        }\n      }, reason => reject(promise, reason));\n    }\n  }\n  function handleMaybeThenable(promise, maybeThenable, then$$1) {\n    var isOwnThenable = maybeThenable.constructor === promise.constructor && then$$1 === then && promise.constructor.resolve === resolve$$1;\n    if (isOwnThenable) {\n      handleOwnThenable(promise, maybeThenable);\n    } else if (typeof then$$1 === 'function') {\n      handleForeignThenable(promise, maybeThenable, then$$1);\n    } else {\n      fulfill(promise, maybeThenable);\n    }\n  }\n  function resolve$1(promise, value) {\n    if (promise === value) {\n      fulfill(promise, value);\n    } else if (objectOrFunction(value)) {\n      var then$$1;\n      try {\n        then$$1 = value.then;\n      } catch (error) {\n        reject(promise, error);\n        return;\n      }\n      handleMaybeThenable(promise, value, then$$1);\n    } else {\n      fulfill(promise, value);\n    }\n  }\n  function publishRejection(promise) {\n    if (promise._onError) {\n      promise._onError(promise._result);\n    }\n    publish(promise);\n  }\n  function fulfill(promise, value) {\n    if (promise._state !== PENDING) {\n      return;\n    }\n    promise._result = value;\n    promise._state = FULFILLED;\n    if (promise._subscribers.length === 0) {\n      if (config.instrument) {\n        instrument('fulfilled', promise);\n      }\n    } else {\n      config.async(publish, promise);\n    }\n  }\n  function reject(promise, reason) {\n    if (promise._state !== PENDING) {\n      return;\n    }\n    promise._state = REJECTED;\n    promise._result = reason;\n    config.async(publishRejection, promise);\n  }\n  function subscribe(parent, child, onFulfillment, onRejection) {\n    var subscribers = parent._subscribers;\n    var length = subscribers.length;\n    parent._onError = null;\n    subscribers[length] = child;\n    subscribers[length + FULFILLED] = onFulfillment;\n    subscribers[length + REJECTED] = onRejection;\n    if (length === 0 && parent._state) {\n      config.async(publish, parent);\n    }\n  }\n  function publish(promise) {\n    var subscribers = promise._subscribers;\n    var settled = promise._state;\n    if (config.instrument) {\n      instrument(settled === FULFILLED ? 'fulfilled' : 'rejected', promise);\n    }\n    if (subscribers.length === 0) {\n      return;\n    }\n    var child,\n      callback,\n      result = promise._result;\n    for (var i = 0; i < subscribers.length; i += 3) {\n      child = subscribers[i];\n      callback = subscribers[i + settled];\n      if (child) {\n        invokeCallback(settled, child, callback, result);\n      } else {\n        callback(result);\n      }\n    }\n    promise._subscribers.length = 0;\n  }\n  function invokeCallback(state, promise, callback, result) {\n    var hasCallback = typeof callback === 'function';\n    var value,\n      succeeded = true,\n      error;\n    if (hasCallback) {\n      try {\n        value = callback(result);\n      } catch (e) {\n        succeeded = false;\n        error = e;\n      }\n    } else {\n      value = result;\n    }\n    if (promise._state !== PENDING) {\n      // noop\n    } else if (value === promise) {\n      reject(promise, withOwnPromise());\n    } else if (succeeded === false) {\n      reject(promise, error);\n    } else if (hasCallback) {\n      resolve$1(promise, value);\n    } else if (state === FULFILLED) {\n      fulfill(promise, value);\n    } else if (state === REJECTED) {\n      reject(promise, value);\n    }\n  }\n  function initializePromise(promise, resolver) {\n    var resolved = false;\n    try {\n      resolver(value => {\n        if (resolved) {\n          return;\n        }\n        resolved = true;\n        resolve$1(promise, value);\n      }, reason => {\n        if (resolved) {\n          return;\n        }\n        resolved = true;\n        reject(promise, reason);\n      });\n    } catch (e) {\n      reject(promise, e);\n    }\n  }\n  function then(onFulfillment, onRejection, label) {\n    var parent = this;\n    var state = parent._state;\n    if (state === FULFILLED && !onFulfillment || state === REJECTED && !onRejection) {\n      config.instrument && instrument('chained', parent, parent);\n      return parent;\n    }\n    parent._onError = null;\n    var child = new parent.constructor(noop, label);\n    var result = parent._result;\n    config.instrument && instrument('chained', parent, child);\n    if (state === PENDING) {\n      subscribe(parent, child, onFulfillment, onRejection);\n    } else {\n      var callback = state === FULFILLED ? onFulfillment : onRejection;\n      config.async(() => invokeCallback(state, child, callback, result));\n    }\n    return child;\n  }\n  class Enumerator {\n    constructor(Constructor, input, abortOnReject, label) {\n      this._instanceConstructor = Constructor;\n      this.promise = new Constructor(noop, label);\n      this._abortOnReject = abortOnReject;\n      this._isUsingOwnPromise = Constructor === Promise;\n      this._isUsingOwnResolve = Constructor.resolve === resolve$$1;\n      this._init(...arguments);\n    }\n    _init(Constructor, input) {\n      var len = input.length || 0;\n      this.length = len;\n      this._remaining = len;\n      this._result = new Array(len);\n      this._enumerate(input);\n    }\n    _enumerate(input) {\n      var length = this.length;\n      var promise = this.promise;\n      for (var i = 0; promise._state === PENDING && i < length; i++) {\n        this._eachEntry(input[i], i, true);\n      }\n      this._checkFullfillment();\n    }\n    _checkFullfillment() {\n      if (this._remaining === 0) {\n        var result = this._result;\n        fulfill(this.promise, result);\n        this._result = null;\n      }\n    }\n    _settleMaybeThenable(entry, i, firstPass) {\n      var c = this._instanceConstructor;\n      if (this._isUsingOwnResolve) {\n        var then$$1,\n          error,\n          succeeded = true;\n        try {\n          then$$1 = entry.then;\n        } catch (e) {\n          succeeded = false;\n          error = e;\n        }\n        if (then$$1 === then && entry._state !== PENDING) {\n          entry._onError = null;\n          this._settledAt(entry._state, i, entry._result, firstPass);\n        } else if (typeof then$$1 !== 'function') {\n          this._settledAt(FULFILLED, i, entry, firstPass);\n        } else if (this._isUsingOwnPromise) {\n          var promise = new c(noop);\n          if (succeeded === false) {\n            reject(promise, error);\n          } else {\n            handleMaybeThenable(promise, entry, then$$1);\n            this._willSettleAt(promise, i, firstPass);\n          }\n        } else {\n          this._willSettleAt(new c(resolve => resolve(entry)), i, firstPass);\n        }\n      } else {\n        this._willSettleAt(c.resolve(entry), i, firstPass);\n      }\n    }\n    _eachEntry(entry, i, firstPass) {\n      if (entry !== null && typeof entry === 'object') {\n        this._settleMaybeThenable(entry, i, firstPass);\n      } else {\n        this._setResultAt(FULFILLED, i, entry, firstPass);\n      }\n    }\n    _settledAt(state, i, value, firstPass) {\n      var promise = this.promise;\n      if (promise._state === PENDING) {\n        if (this._abortOnReject && state === REJECTED) {\n          reject(promise, value);\n        } else {\n          this._setResultAt(state, i, value, firstPass);\n          this._checkFullfillment();\n        }\n      }\n    }\n    _setResultAt(state, i, value, firstPass) {\n      this._remaining--;\n      this._result[i] = value;\n    }\n    _willSettleAt(promise, i, firstPass) {\n      subscribe(promise, undefined, value => this._settledAt(FULFILLED, i, value, firstPass), reason => this._settledAt(REJECTED, i, reason, firstPass));\n    }\n  }\n  function setSettledResult(state, i, value) {\n    this._remaining--;\n    if (state === FULFILLED) {\n      this._result[i] = {\n        state: 'fulfilled',\n        value: value\n      };\n    } else {\n      this._result[i] = {\n        state: 'rejected',\n        reason: value\n      };\n    }\n  }\n\n  /**\n    `Promise.all` accepts an array of promises, and returns a new promise which\n    is fulfilled with an array of fulfillment values for the passed promises, or\n    rejected with the reason of the first passed promise to be rejected. It casts all\n    elements of the passed iterable to promises as it runs this algorithm.\n  \n    Example:\n  \n    ```javascript\n    import Promise, { resolve } from 'rsvp';\n  \n    let promise1 = resolve(1);\n    let promise2 = resolve(2);\n    let promise3 = resolve(3);\n    let promises = [ promise1, promise2, promise3 ];\n  \n    Promise.all(promises).then(function(array){\n      // The array here would be [ 1, 2, 3 ];\n    });\n    ```\n  \n    If any of the `promises` given to `RSVP.all` are rejected, the first promise\n    that is rejected will be given as an argument to the returned promises's\n    rejection handler. For example:\n  \n    Example:\n  \n    ```javascript\n    import Promise, { resolve, reject } from 'rsvp';\n  \n    let promise1 = resolve(1);\n    let promise2 = reject(new Error(\"2\"));\n    let promise3 = reject(new Error(\"3\"));\n    let promises = [ promise1, promise2, promise3 ];\n  \n    Promise.all(promises).then(function(array){\n      // Code here never runs because there are rejected promises!\n    }, function(error) {\n      // error.message === \"2\"\n    });\n    ```\n  \n    @method all\n    @for Promise\n    @param {Array} entries array of promises\n    @param {String} [label] optional string for labeling the promise.\n    Useful for tooling.\n    @return {Promise} promise that is fulfilled when all `promises` have been\n    fulfilled, or rejected if any of them become rejected.\n    @static\n  */\n  function all(entries, label) {\n    if (!Array.isArray(entries)) {\n      return this.reject(new TypeError(\"Promise.all must be called with an array\"), label);\n    }\n    return new Enumerator(this, entries, true /* abort on reject */, label).promise;\n  }\n\n  /**\n    `Promise.race` returns a new promise which is settled in the same way as the\n    first passed promise to settle.\n  \n    Example:\n  \n    ```javascript\n    import Promise from 'rsvp';\n  \n    let promise1 = new Promise(function(resolve, reject){\n      setTimeout(function(){\n        resolve('promise 1');\n      }, 200);\n    });\n  \n    let promise2 = new Promise(function(resolve, reject){\n      setTimeout(function(){\n        resolve('promise 2');\n      }, 100);\n    });\n  \n    Promise.race([promise1, promise2]).then(function(result){\n      // result === 'promise 2' because it was resolved before promise1\n      // was resolved.\n    });\n    ```\n  \n    `Promise.race` is deterministic in that only the state of the first\n    settled promise matters. For example, even if other promises given to the\n    `promises` array argument are resolved, but the first settled promise has\n    become rejected before the other promises became fulfilled, the returned\n    promise will become rejected:\n  \n    ```javascript\n    import Promise from 'rsvp';\n  \n    let promise1 = new Promise(function(resolve, reject){\n      setTimeout(function(){\n        resolve('promise 1');\n      }, 200);\n    });\n  \n    let promise2 = new Promise(function(resolve, reject){\n      setTimeout(function(){\n        reject(new Error('promise 2'));\n      }, 100);\n    });\n  \n    Promise.race([promise1, promise2]).then(function(result){\n      // Code here never runs\n    }, function(reason){\n      // reason.message === 'promise 2' because promise 2 became rejected before\n      // promise 1 became fulfilled\n    });\n    ```\n  \n    An example real-world use case is implementing timeouts:\n  \n    ```javascript\n    import Promise from 'rsvp';\n  \n    Promise.race([ajax('foo.json'), timeout(5000)])\n    ```\n  \n    @method race\n    @for Promise\n    @static\n    @param {Array} entries array of promises to observe\n    @param {String} [label] optional string for describing the promise returned.\n    Useful for tooling.\n    @return {Promise} a promise which settles in the same way as the first passed\n    promise to settle.\n  */\n  function race(entries, label) {\n    /*jshint validthis:true */\n    var Constructor = this;\n    var promise = new Constructor(noop, label);\n    if (!Array.isArray(entries)) {\n      reject(promise, new TypeError('Promise.race must be called with an array'));\n      return promise;\n    }\n    for (var i = 0; promise._state === PENDING && i < entries.length; i++) {\n      subscribe(Constructor.resolve(entries[i]), undefined, value => resolve$1(promise, value), reason => reject(promise, reason));\n    }\n    return promise;\n  }\n\n  /**\n    `Promise.reject` returns a promise rejected with the passed `reason`.\n    It is shorthand for the following:\n  \n    ```javascript\n    import Promise from 'rsvp';\n  \n    let promise = new Promise(function(resolve, reject){\n      reject(new Error('WHOOPS'));\n    });\n  \n    promise.then(function(value){\n      // Code here doesn't run because the promise is rejected!\n    }, function(reason){\n      // reason.message === 'WHOOPS'\n    });\n    ```\n  \n    Instead of writing the above, your code now simply becomes the following:\n  \n    ```javascript\n    import Promise from 'rsvp';\n  \n    let promise = Promise.reject(new Error('WHOOPS'));\n  \n    promise.then(function(value){\n      // Code here doesn't run because the promise is rejected!\n    }, function(reason){\n      // reason.message === 'WHOOPS'\n    });\n    ```\n  \n    @method reject\n    @for Promise\n    @static\n    @param {*} reason value that the returned promise will be rejected with.\n    @param {String} [label] optional string for identifying the returned promise.\n    Useful for tooling.\n    @return {Promise} a promise rejected with the given `reason`.\n  */\n  function reject$1(reason, label) {\n    /*jshint validthis:true */\n    var Constructor = this;\n    var promise = new Constructor(noop, label);\n    reject(promise, reason);\n    return promise;\n  }\n  var guidKey = 'rsvp_' + Date.now() + '-';\n  var counter = 0;\n  function needsResolver() {\n    throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n  }\n  function needsNew() {\n    throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n  }\n\n  /**\n    Promise objects represent the eventual result of an asynchronous operation. The\n    primary way of interacting with a promise is through its `then` method, which\n    registers callbacks to receive either a promise’s eventual value or the reason\n    why the promise cannot be fulfilled.\n  \n    Terminology\n    -----------\n  \n    - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n    - `thenable` is an object or function that defines a `then` method.\n    - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n    - `exception` is a value that is thrown using the throw statement.\n    - `reason` is a value that indicates why a promise was rejected.\n    - `settled` the final resting state of a promise, fulfilled or rejected.\n  \n    A promise can be in one of three states: pending, fulfilled, or rejected.\n  \n    Promises that are fulfilled have a fulfillment value and are in the fulfilled\n    state.  Promises that are rejected have a rejection reason and are in the\n    rejected state.  A fulfillment value is never a thenable.\n  \n    Promises can also be said to *resolve* a value.  If this value is also a\n    promise, then the original promise's settled state will match the value's\n    settled state.  So a promise that *resolves* a promise that rejects will\n    itself reject, and a promise that *resolves* a promise that fulfills will\n    itself fulfill.\n  \n  \n    Basic Usage:\n    ------------\n  \n    ```js\n    let promise = new Promise(function(resolve, reject) {\n      // on success\n      resolve(value);\n  \n      // on failure\n      reject(reason);\n    });\n  \n    promise.then(function(value) {\n      // on fulfillment\n    }, function(reason) {\n      // on rejection\n    });\n    ```\n  \n    Advanced Usage:\n    ---------------\n  \n    Promises shine when abstracting away asynchronous interactions such as\n    `XMLHttpRequest`s.\n  \n    ```js\n    function getJSON(url) {\n      return new Promise(function(resolve, reject){\n        let xhr = new XMLHttpRequest();\n  \n        xhr.open('GET', url);\n        xhr.onreadystatechange = handler;\n        xhr.responseType = 'json';\n        xhr.setRequestHeader('Accept', 'application/json');\n        xhr.send();\n  \n        function handler() {\n          if (this.readyState === this.DONE) {\n            if (this.status === 200) {\n              resolve(this.response);\n            } else {\n              reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n            }\n          }\n        };\n      });\n    }\n  \n    getJSON('/posts.json').then(function(json) {\n      // on fulfillment\n    }, function(reason) {\n      // on rejection\n    });\n    ```\n  \n    Unlike callbacks, promises are great composable primitives.\n  \n    ```js\n    Promise.all([\n      getJSON('/posts'),\n      getJSON('/comments')\n    ]).then(function(values){\n      values[0] // => postsJSON\n      values[1] // => commentsJSON\n  \n      return values;\n    });\n    ```\n  \n    @class Promise\n    @public\n    @param {function} resolver\n    @param {String} [label] optional string for labeling the promise.\n    Useful for tooling.\n    @constructor\n  */\n  class Promise {\n    constructor(resolver, label) {\n      this._id = counter++;\n      this._label = label;\n      this._state = undefined;\n      this._result = undefined;\n      this._subscribers = [];\n      config.instrument && instrument('created', this);\n      if (noop !== resolver) {\n        typeof resolver !== 'function' && needsResolver();\n        this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n      }\n    }\n    _onError(reason) {\n      config.after(() => {\n        if (this._onError) {\n          config.trigger('error', reason, this._label);\n        }\n      });\n    }\n\n    /**\n      `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n      as the catch block of a try/catch statement.\n    \n      ```js\n      function findAuthor(){\n        throw new Error('couldn\\'t find that author');\n      }\n    \n      // synchronous\n      try {\n        findAuthor();\n      } catch(reason) {\n        // something went wrong\n      }\n    \n      // async with promises\n      findAuthor().catch(function(reason){\n        // something went wrong\n      });\n      ```\n    \n      @method catch\n      @param {Function} onRejection\n      @param {String} [label] optional string for labeling the promise.\n      Useful for tooling.\n      @return {Promise}\n    */\n    catch(onRejection, label) {\n      return this.then(undefined, onRejection, label);\n    }\n\n    /**\n      `finally` will be invoked regardless of the promise's fate just as native\n      try/catch/finally behaves\n    \n      Synchronous example:\n    \n      ```js\n      findAuthor() {\n        if (Math.random() > 0.5) {\n          throw new Error();\n        }\n        return new Author();\n      }\n    \n      try {\n        return findAuthor(); // succeed or fail\n      } catch(error) {\n        return findOtherAuthor();\n      } finally {\n        // always runs\n        // doesn't affect the return value\n      }\n      ```\n    \n      Asynchronous example:\n    \n      ```js\n      findAuthor().catch(function(reason){\n        return findOtherAuthor();\n      }).finally(function(){\n        // author was either found, or not\n      });\n      ```\n    \n      @method finally\n      @param {Function} callback\n      @param {String} [label] optional string for labeling the promise.\n      Useful for tooling.\n      @return {Promise}\n    */\n    finally(callback, label) {\n      var promise = this;\n      var constructor = promise.constructor;\n      if (typeof callback === 'function') {\n        return promise.then(value => constructor.resolve(callback()).then(() => value), reason => constructor.resolve(callback()).then(() => {\n          throw reason;\n        }));\n      }\n      return promise.then(callback, callback);\n    }\n  }\n  _exports.Promise = Promise;\n  Promise.cast = resolve$$1; // deprecated\n  Promise.all = all;\n  Promise.race = race;\n  Promise.resolve = resolve$$1;\n  Promise.reject = reject$1;\n  Promise.prototype._guidKey = guidKey;\n\n  /**\n    The primary way of interacting with a promise is through its `then` method,\n    which registers callbacks to receive either a promise's eventual value or the\n    reason why the promise cannot be fulfilled.\n  \n    ```js\n    findUser().then(function(user){\n      // user is available\n    }, function(reason){\n      // user is unavailable, and you are given the reason why\n    });\n    ```\n  \n    Chaining\n    --------\n  \n    The return value of `then` is itself a promise.  This second, 'downstream'\n    promise is resolved with the return value of the first promise's fulfillment\n    or rejection handler, or rejected if the handler throws an exception.\n  \n    ```js\n    findUser().then(function (user) {\n      return user.name;\n    }, function (reason) {\n      return 'default name';\n    }).then(function (userName) {\n      // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n      // will be `'default name'`\n    });\n  \n    findUser().then(function (user) {\n      throw new Error('Found user, but still unhappy');\n    }, function (reason) {\n      throw new Error('`findUser` rejected and we\\'re unhappy');\n    }).then(function (value) {\n      // never reached\n    }, function (reason) {\n      // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n      // If `findUser` rejected, `reason` will be '`findUser` rejected and we\\'re unhappy'.\n    });\n    ```\n    If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n  \n    ```js\n    findUser().then(function (user) {\n      throw new PedagogicalException('Upstream error');\n    }).then(function (value) {\n      // never reached\n    }).then(function (value) {\n      // never reached\n    }, function (reason) {\n      // The `PedgagocialException` is propagated all the way down to here\n    });\n    ```\n  \n    Assimilation\n    ------------\n  \n    Sometimes the value you want to propagate to a downstream promise can only be\n    retrieved asynchronously. This can be achieved by returning a promise in the\n    fulfillment or rejection handler. The downstream promise will then be pending\n    until the returned promise is settled. This is called *assimilation*.\n  \n    ```js\n    findUser().then(function (user) {\n      return findCommentsByAuthor(user);\n    }).then(function (comments) {\n      // The user's comments are now available\n    });\n    ```\n  \n    If the assimliated promise rejects, then the downstream promise will also reject.\n  \n    ```js\n    findUser().then(function (user) {\n      return findCommentsByAuthor(user);\n    }).then(function (comments) {\n      // If `findCommentsByAuthor` fulfills, we'll have the value here\n    }, function (reason) {\n      // If `findCommentsByAuthor` rejects, we'll have the reason here\n    });\n    ```\n  \n    Simple Example\n    --------------\n  \n    Synchronous Example\n  \n    ```javascript\n    let result;\n  \n    try {\n      result = findResult();\n      // success\n    } catch(reason) {\n      // failure\n    }\n    ```\n  \n    Errback Example\n  \n    ```js\n    findResult(function(result, err){\n      if (err) {\n        // failure\n      } else {\n        // success\n      }\n    });\n    ```\n  \n    Promise Example;\n  \n    ```javascript\n    findResult().then(function(result){\n      // success\n    }, function(reason){\n      // failure\n    });\n    ```\n  \n    Advanced Example\n    --------------\n  \n    Synchronous Example\n  \n    ```javascript\n    let author, books;\n  \n    try {\n      author = findAuthor();\n      books  = findBooksByAuthor(author);\n      // success\n    } catch(reason) {\n      // failure\n    }\n    ```\n  \n    Errback Example\n  \n    ```js\n  \n    function foundBooks(books) {\n  \n    }\n  \n    function failure(reason) {\n  \n    }\n  \n    findAuthor(function(author, err){\n      if (err) {\n        failure(err);\n        // failure\n      } else {\n        try {\n          findBoooksByAuthor(author, function(books, err) {\n            if (err) {\n              failure(err);\n            } else {\n              try {\n                foundBooks(books);\n              } catch(reason) {\n                failure(reason);\n              }\n            }\n          });\n        } catch(error) {\n          failure(err);\n        }\n        // success\n      }\n    });\n    ```\n  \n    Promise Example;\n  \n    ```javascript\n    findAuthor().\n      then(findBooksByAuthor).\n      then(function(books){\n        // found books\n    }).catch(function(reason){\n      // something went wrong\n    });\n    ```\n  \n    @method then\n    @param {Function} onFulfillment\n    @param {Function} onRejection\n    @param {String} [label] optional string for labeling the promise.\n    Useful for tooling.\n    @return {Promise}\n  */\n  Promise.prototype.then = then;\n  function makeObject(_, argumentNames) {\n    var obj = {};\n    var length = _.length;\n    var args = new Array(length);\n    for (var x = 0; x < length; x++) {\n      args[x] = _[x];\n    }\n    for (var i = 0; i < argumentNames.length; i++) {\n      var name = argumentNames[i];\n      obj[name] = args[i + 1];\n    }\n    return obj;\n  }\n  function arrayResult(_) {\n    var length = _.length;\n    var args = new Array(length - 1);\n    for (var i = 1; i < length; i++) {\n      args[i - 1] = _[i];\n    }\n    return args;\n  }\n  function wrapThenable(then, promise) {\n    return {\n      then(onFulFillment, onRejection) {\n        return then.call(promise, onFulFillment, onRejection);\n      }\n    };\n  }\n\n  /**\n    `denodeify` takes a 'node-style' function and returns a function that\n    will return an `Promise`. You can use `denodeify` in Node.js or the\n    browser when you'd prefer to use promises over using callbacks. For example,\n    `denodeify` transforms the following:\n  \n    ```javascript\n    let fs = require('fs');\n  \n    fs.readFile('myfile.txt', function(err, data){\n      if (err) return handleError(err);\n      handleData(data);\n    });\n    ```\n  \n    into:\n  \n    ```javascript\n    let fs = require('fs');\n    let readFile = denodeify(fs.readFile);\n  \n    readFile('myfile.txt').then(handleData, handleError);\n    ```\n  \n    If the node function has multiple success parameters, then `denodeify`\n    just returns the first one:\n  \n    ```javascript\n    let request = denodeify(require('request'));\n  \n    request('http://example.com').then(function(res) {\n      // ...\n    });\n    ```\n  \n    However, if you need all success parameters, setting `denodeify`'s\n    second parameter to `true` causes it to return all success parameters\n    as an array:\n  \n    ```javascript\n    let request = denodeify(require('request'), true);\n  \n    request('http://example.com').then(function(result) {\n      // result[0] -> res\n      // result[1] -> body\n    });\n    ```\n  \n    Or if you pass it an array with names it returns the parameters as a hash:\n  \n    ```javascript\n    let request = denodeify(require('request'), ['res', 'body']);\n  \n    request('http://example.com').then(function(result) {\n      // result.res\n      // result.body\n    });\n    ```\n  \n    Sometimes you need to retain the `this`:\n  \n    ```javascript\n    let app = require('express')();\n    let render = denodeify(app.render.bind(app));\n    ```\n  \n    The denodified function inherits from the original function. It works in all\n    environments, except IE 10 and below. Consequently all properties of the original\n    function are available to you. However, any properties you change on the\n    denodeified function won't be changed on the original function. Example:\n  \n    ```javascript\n    let request = denodeify(require('request')),\n        cookieJar = request.jar(); // <- Inheritance is used here\n  \n    request('http://example.com', {jar: cookieJar}).then(function(res) {\n      // cookieJar.cookies holds now the cookies returned by example.com\n    });\n    ```\n  \n    Using `denodeify` makes it easier to compose asynchronous operations instead\n    of using callbacks. For example, instead of:\n  \n    ```javascript\n    let fs = require('fs');\n  \n    fs.readFile('myfile.txt', function(err, data){\n      if (err) { ... } // Handle error\n      fs.writeFile('myfile2.txt', data, function(err){\n        if (err) { ... } // Handle error\n        console.log('done')\n      });\n    });\n    ```\n  \n    you can chain the operations together using `then` from the returned promise:\n  \n    ```javascript\n    let fs = require('fs');\n    let readFile = denodeify(fs.readFile);\n    let writeFile = denodeify(fs.writeFile);\n  \n    readFile('myfile.txt').then(function(data){\n      return writeFile('myfile2.txt', data);\n    }).then(function(){\n      console.log('done')\n    }).catch(function(error){\n      // Handle error\n    });\n    ```\n  \n    @method denodeify\n    @public\n    @static\n    @for rsvp\n    @param {Function} nodeFunc a 'node-style' function that takes a callback as\n    its last argument. The callback expects an error to be passed as its first\n    argument (if an error occurred, otherwise null), and the value from the\n    operation as its second argument ('function(err, value){ }').\n    @param {Boolean|Array} [options] An optional paramter that if set\n    to `true` causes the promise to fulfill with the callback's success arguments\n    as an array. This is useful if the node function has multiple success\n    paramters. If you set this paramter to an array with names, the promise will\n    fulfill with a hash with these names as keys and the success parameters as\n    values.\n    @return {Function} a function that wraps `nodeFunc` to return a `Promise`\n  */\n  function denodeify(nodeFunc, options) {\n    var fn = function () {\n      var l = arguments.length;\n      var args = new Array(l + 1);\n      var promiseInput = false;\n      for (var i = 0; i < l; ++i) {\n        var arg = arguments[i];\n\n        // TODO: this code really needs to be cleaned up\n        if (!promiseInput) {\n          if (arg !== null && typeof arg === 'object') {\n            if (arg.constructor === Promise) {\n              promiseInput = true;\n            } else {\n              try {\n                promiseInput = arg.then;\n              } catch (error) {\n                var p = new Promise(noop);\n                reject(p, error);\n                return p;\n              }\n            }\n          } else {\n            promiseInput = false;\n          }\n          if (promiseInput && promiseInput !== true) {\n            arg = wrapThenable(promiseInput, arg);\n          }\n        }\n        args[i] = arg;\n      }\n      var promise = new Promise(noop);\n      args[l] = function (err, val) {\n        if (err) {\n          reject(promise, err);\n        } else if (options === undefined) {\n          resolve$1(promise, val);\n        } else if (options === true) {\n          resolve$1(promise, arrayResult(arguments));\n        } else if (Array.isArray(options)) {\n          resolve$1(promise, makeObject(arguments, options));\n        } else {\n          resolve$1(promise, val);\n        }\n      };\n      if (promiseInput) {\n        return handlePromiseInput(promise, args, nodeFunc, this);\n      } else {\n        return handleValueInput(promise, args, nodeFunc, this);\n      }\n    };\n    fn.__proto__ = nodeFunc;\n    return fn;\n  }\n  function handleValueInput(promise, args, nodeFunc, self) {\n    try {\n      nodeFunc.apply(self, args);\n    } catch (error) {\n      reject(promise, error);\n    }\n    return promise;\n  }\n  function handlePromiseInput(promise, args, nodeFunc, self) {\n    return Promise.all(args).then(args => handleValueInput(promise, args, nodeFunc, self));\n  }\n\n  /**\n    This is a convenient alias for `Promise.all`.\n  \n    @method all\n    @public\n    @static\n    @for rsvp\n    @param {Array} array Array of promises.\n    @param {String} [label] An optional label. This is useful\n    for tooling.\n  */\n  function all$1(array, label) {\n    return Promise.all(array, label);\n  }\n\n  /**\n  @module rsvp\n  @public\n  **/\n\n  class AllSettled extends Enumerator {\n    constructor(Constructor, entries, label) {\n      super(Constructor, entries, false /* don't abort on reject */, label);\n    }\n  }\n  AllSettled.prototype._setResultAt = setSettledResult;\n\n  /**\n  `RSVP.allSettled` is similar to `RSVP.all`, but instead of implementing\n  a fail-fast method, it waits until all the promises have returned and\n  shows you all the results. This is useful if you want to handle multiple\n  promises' failure states together as a set.\n   Returns a promise that is fulfilled when all the given promises have been\n  settled. The return promise is fulfilled with an array of the states of\n  the promises passed into the `promises` array argument.\n   Each state object will either indicate fulfillment or rejection, and\n  provide the corresponding value or reason. The states will take one of\n  the following formats:\n   ```javascript\n  { state: 'fulfilled', value: value }\n    or\n  { state: 'rejected', reason: reason }\n  ```\n   Example:\n   ```javascript\n  let promise1 = RSVP.Promise.resolve(1);\n  let promise2 = RSVP.Promise.reject(new Error('2'));\n  let promise3 = RSVP.Promise.reject(new Error('3'));\n  let promises = [ promise1, promise2, promise3 ];\n   RSVP.allSettled(promises).then(function(array){\n    // array == [\n    //   { state: 'fulfilled', value: 1 },\n    //   { state: 'rejected', reason: Error },\n    //   { state: 'rejected', reason: Error }\n    // ]\n    // Note that for the second item, reason.message will be '2', and for the\n    // third item, reason.message will be '3'.\n  }, function(error) {\n    // Not run. (This block would only be called if allSettled had failed,\n    // for instance if passed an incorrect argument type.)\n  });\n  ```\n   @method allSettled\n  @public\n  @static\n  @for rsvp\n  @param {Array} entries\n  @param {String} [label] - optional string that describes the promise.\n  Useful for tooling.\n  @return {Promise} promise that is fulfilled with an array of the settled\n  states of the constituent promises.\n  */\n\n  function allSettled(entries, label) {\n    if (!Array.isArray(entries)) {\n      return Promise.reject(new TypeError(\"Promise.allSettled must be called with an array\"), label);\n    }\n    return new AllSettled(Promise, entries, label).promise;\n  }\n\n  /**\n    This is a convenient alias for `Promise.race`.\n  \n    @method race\n    @public\n    @static\n    @for rsvp\n    @param {Array} array Array of promises.\n    @param {String} [label] An optional label. This is useful\n    for tooling.\n   */\n  function race$1(array, label) {\n    return Promise.race(array, label);\n  }\n  class PromiseHash extends Enumerator {\n    constructor(Constructor, object, abortOnReject, label) {\n      if (abortOnReject === void 0) {\n        abortOnReject = true;\n      }\n      super(Constructor, object, abortOnReject, label);\n    }\n    _init(Constructor, object) {\n      this._result = {};\n      this._enumerate(object);\n    }\n    _enumerate(input) {\n      var keys = Object.keys(input);\n      var length = keys.length;\n      var promise = this.promise;\n      this._remaining = length;\n      var key, val;\n      for (var i = 0; promise._state === PENDING && i < length; i++) {\n        key = keys[i];\n        val = input[key];\n        this._eachEntry(val, key, true);\n      }\n      this._checkFullfillment();\n    }\n  }\n\n  /**\n    `hash` is similar to `all`, but takes an object instead of an array\n    for its `promises` argument.\n  \n    Returns a promise that is fulfilled when all the given promises have been\n    fulfilled, or rejected if any of them become rejected. The returned promise\n    is fulfilled with a hash that has the same key names as the `promises` object\n    argument. If any of the values in the object are not promises, they will\n    simply be copied over to the fulfilled object.\n  \n    Example:\n  \n    ```javascript\n    let promises = {\n      myPromise: resolve(1),\n      yourPromise: resolve(2),\n      theirPromise: resolve(3),\n      notAPromise: 4\n    };\n  \n    hash(promises).then(function(hash){\n      // hash here is an object that looks like:\n      // {\n      //   myPromise: 1,\n      //   yourPromise: 2,\n      //   theirPromise: 3,\n      //   notAPromise: 4\n      // }\n    });\n    ```\n  \n    If any of the `promises` given to `hash` are rejected, the first promise\n    that is rejected will be given as the reason to the rejection handler.\n  \n    Example:\n  \n    ```javascript\n    let promises = {\n      myPromise: resolve(1),\n      rejectedPromise: reject(new Error('rejectedPromise')),\n      anotherRejectedPromise: reject(new Error('anotherRejectedPromise')),\n    };\n  \n    hash(promises).then(function(hash){\n      // Code here never runs because there are rejected promises!\n    }, function(reason) {\n      // reason.message === 'rejectedPromise'\n    });\n    ```\n  \n    An important note: `hash` is intended for plain JavaScript objects that\n    are just a set of keys and values. `hash` will NOT preserve prototype\n    chains.\n  \n    Example:\n  \n    ```javascript\n    import { hash, resolve } from 'rsvp';\n    function MyConstructor(){\n      this.example = resolve('Example');\n    }\n  \n    MyConstructor.prototype = {\n      protoProperty: resolve('Proto Property')\n    };\n  \n    let myObject = new MyConstructor();\n  \n    hash(myObject).then(function(hash){\n      // protoProperty will not be present, instead you will just have an\n      // object that looks like:\n      // {\n      //   example: 'Example'\n      // }\n      //\n      // hash.hasOwnProperty('protoProperty'); // false\n      // 'undefined' === typeof hash.protoProperty\n    });\n    ```\n  \n    @method hash\n    @public\n    @static\n    @for rsvp\n    @param {Object} object\n    @param {String} [label] optional string that describes the promise.\n    Useful for tooling.\n    @return {Promise} promise that is fulfilled when all properties of `promises`\n    have been fulfilled, or rejected if any of them become rejected.\n  */\n  function hash(object, label) {\n    return Promise.resolve(object, label).then(function (object) {\n      if (object === null || typeof object !== 'object') {\n        throw new TypeError(\"Promise.hash must be called with an object\");\n      }\n      return new PromiseHash(Promise, object, label).promise;\n    });\n  }\n  class HashSettled extends PromiseHash {\n    constructor(Constructor, object, label) {\n      super(Constructor, object, false, label);\n    }\n  }\n  HashSettled.prototype._setResultAt = setSettledResult;\n\n  /**\n    `hashSettled` is similar to `allSettled`, but takes an object\n    instead of an array for its `promises` argument.\n  \n    Unlike `all` or `hash`, which implement a fail-fast method,\n    but like `allSettled`, `hashSettled` waits until all the\n    constituent promises have returned and then shows you all the results\n    with their states and values/reasons. This is useful if you want to\n    handle multiple promises' failure states together as a set.\n  \n    Returns a promise that is fulfilled when all the given promises have been\n    settled, or rejected if the passed parameters are invalid.\n  \n    The returned promise is fulfilled with a hash that has the same key names as\n    the `promises` object argument. If any of the values in the object are not\n    promises, they will be copied over to the fulfilled object and marked with state\n    'fulfilled'.\n  \n    Example:\n  \n    ```javascript\n    import { hashSettled, resolve } from 'rsvp';\n  \n    let promises = {\n      myPromise: resolve(1),\n      yourPromise: resolve(2),\n      theirPromise: resolve(3),\n      notAPromise: 4\n    };\n  \n    hashSettled(promises).then(function(hash){\n      // hash here is an object that looks like:\n      // {\n      //   myPromise: { state: 'fulfilled', value: 1 },\n      //   yourPromise: { state: 'fulfilled', value: 2 },\n      //   theirPromise: { state: 'fulfilled', value: 3 },\n      //   notAPromise: { state: 'fulfilled', value: 4 }\n      // }\n    });\n    ```\n  \n    If any of the `promises` given to `hash` are rejected, the state will\n    be set to 'rejected' and the reason for rejection provided.\n  \n    Example:\n  \n    ```javascript\n    import { hashSettled, reject, resolve } from 'rsvp';\n  \n    let promises = {\n      myPromise: resolve(1),\n      rejectedPromise: reject(new Error('rejection')),\n      anotherRejectedPromise: reject(new Error('more rejection')),\n    };\n  \n    hashSettled(promises).then(function(hash){\n      // hash here is an object that looks like:\n      // {\n      //   myPromise:              { state: 'fulfilled', value: 1 },\n      //   rejectedPromise:        { state: 'rejected', reason: Error },\n      //   anotherRejectedPromise: { state: 'rejected', reason: Error },\n      // }\n      // Note that for rejectedPromise, reason.message == 'rejection',\n      // and for anotherRejectedPromise, reason.message == 'more rejection'.\n    });\n    ```\n  \n    An important note: `hashSettled` is intended for plain JavaScript objects that\n    are just a set of keys and values. `hashSettled` will NOT preserve prototype\n    chains.\n  \n    Example:\n  \n    ```javascript\n    import Promise, { hashSettled, resolve } from 'rsvp';\n  \n    function MyConstructor(){\n      this.example = resolve('Example');\n    }\n  \n    MyConstructor.prototype = {\n      protoProperty: Promise.resolve('Proto Property')\n    };\n  \n    let myObject = new MyConstructor();\n  \n    hashSettled(myObject).then(function(hash){\n      // protoProperty will not be present, instead you will just have an\n      // object that looks like:\n      // {\n      //   example: { state: 'fulfilled', value: 'Example' }\n      // }\n      //\n      // hash.hasOwnProperty('protoProperty'); // false\n      // 'undefined' === typeof hash.protoProperty\n    });\n    ```\n  \n    @method hashSettled\n    @public\n    @for rsvp\n    @param {Object} object\n    @param {String} [label] optional string that describes the promise.\n    Useful for tooling.\n    @return {Promise} promise that is fulfilled when when all properties of `promises`\n    have been settled.\n    @static\n  */\n\n  function hashSettled(object, label) {\n    return Promise.resolve(object, label).then(function (object) {\n      if (object === null || typeof object !== 'object') {\n        throw new TypeError(\"hashSettled must be called with an object\");\n      }\n      return new HashSettled(Promise, object, false, label).promise;\n    });\n  }\n\n  /**\n    `rethrow` will rethrow an error on the next turn of the JavaScript event\n    loop in order to aid debugging.\n  \n    Promises A+ specifies that any exceptions that occur with a promise must be\n    caught by the promises implementation and bubbled to the last handler. For\n    this reason, it is recommended that you always specify a second rejection\n    handler function to `then`. However, `rethrow` will throw the exception\n    outside of the promise, so it bubbles up to your console if in the browser,\n    or domain/cause uncaught exception in Node. `rethrow` will also throw the\n    error again so the error can be handled by the promise per the spec.\n  \n    ```javascript\n    import { rethrow } from 'rsvp';\n  \n    function throws(){\n      throw new Error('Whoops!');\n    }\n  \n    let promise = new Promise(function(resolve, reject){\n      throws();\n    });\n  \n    promise.catch(rethrow).then(function(){\n      // Code here doesn't run because the promise became rejected due to an\n      // error!\n    }, function (err){\n      // handle the error here\n    });\n    ```\n  \n    The 'Whoops' error will be thrown on the next turn of the event loop\n    and you can watch for it in your console. You can also handle it using a\n    rejection handler given to `.then` or `.catch` on the returned promise.\n  \n    @method rethrow\n    @public\n    @static\n    @for rsvp\n    @param {Error} reason reason the promise became rejected.\n    @throws Error\n    @static\n  */\n  function rethrow(reason) {\n    setTimeout(() => {\n      throw reason;\n    });\n    throw reason;\n  }\n\n  /**\n    `defer` returns an object similar to jQuery's `$.Deferred`.\n    `defer` should be used when porting over code reliant on `$.Deferred`'s\n    interface. New code should use the `Promise` constructor instead.\n  \n    The object returned from `defer` is a plain object with three properties:\n  \n    * promise - an `Promise`.\n    * reject - a function that causes the `promise` property on this object to\n      become rejected\n    * resolve - a function that causes the `promise` property on this object to\n      become fulfilled.\n  \n    Example:\n  \n     ```javascript\n     let deferred = defer();\n  \n     deferred.resolve(\"Success!\");\n  \n     deferred.promise.then(function(value){\n       // value here is \"Success!\"\n     });\n     ```\n  \n    @method defer\n    @public\n    @static\n    @for rsvp\n    @param {String} [label] optional string for labeling the promise.\n    Useful for tooling.\n    @return {Object}\n   */\n\n  function defer(label) {\n    var deferred = {\n      resolve: undefined,\n      reject: undefined\n    };\n    deferred.promise = new Promise((resolve, reject) => {\n      deferred.resolve = resolve;\n      deferred.reject = reject;\n    }, label);\n    return deferred;\n  }\n  class MapEnumerator extends Enumerator {\n    constructor(Constructor, entries, mapFn, label) {\n      super(Constructor, entries, true, label, mapFn);\n    }\n    _init(Constructor, input, bool, label, mapFn) {\n      var len = input.length || 0;\n      this.length = len;\n      this._remaining = len;\n      this._result = new Array(len);\n      this._mapFn = mapFn;\n      this._enumerate(input);\n    }\n    _setResultAt(state, i, value, firstPass) {\n      if (firstPass) {\n        try {\n          this._eachEntry(this._mapFn(value, i), i, false);\n        } catch (error) {\n          this._settledAt(REJECTED, i, error, false);\n        }\n      } else {\n        this._remaining--;\n        this._result[i] = value;\n      }\n    }\n  }\n\n  /**\n   `map` is similar to JavaScript's native `map` method. `mapFn` is eagerly called\n    meaning that as soon as any promise resolves its value will be passed to `mapFn`.\n    `map` returns a promise that will become fulfilled with the result of running\n    `mapFn` on the values the promises become fulfilled with.\n  \n    For example:\n  \n    ```javascript\n    import { map, resolve } from 'rsvp';\n  \n    let promise1 = resolve(1);\n    let promise2 = resolve(2);\n    let promise3 = resolve(3);\n    let promises = [ promise1, promise2, promise3 ];\n  \n    let mapFn = function(item){\n      return item + 1;\n    };\n  \n    map(promises, mapFn).then(function(result){\n      // result is [ 2, 3, 4 ]\n    });\n    ```\n  \n    If any of the `promises` given to `map` are rejected, the first promise\n    that is rejected will be given as an argument to the returned promise's\n    rejection handler. For example:\n  \n    ```javascript\n    import { map, reject, resolve } from 'rsvp';\n  \n    let promise1 = resolve(1);\n    let promise2 = reject(new Error('2'));\n    let promise3 = reject(new Error('3'));\n    let promises = [ promise1, promise2, promise3 ];\n  \n    let mapFn = function(item){\n      return item + 1;\n    };\n  \n    map(promises, mapFn).then(function(array){\n      // Code here never runs because there are rejected promises!\n    }, function(reason) {\n      // reason.message === '2'\n    });\n    ```\n  \n    `map` will also wait if a promise is returned from `mapFn`. For example,\n    say you want to get all comments from a set of blog posts, but you need\n    the blog posts first because they contain a url to those comments.\n  \n    ```javscript\n    import { map } from 'rsvp';\n  \n    let mapFn = function(blogPost){\n      // getComments does some ajax and returns an Promise that is fulfilled\n      // with some comments data\n      return getComments(blogPost.comments_url);\n    };\n  \n    // getBlogPosts does some ajax and returns an Promise that is fulfilled\n    // with some blog post data\n    map(getBlogPosts(), mapFn).then(function(comments){\n      // comments is the result of asking the server for the comments\n      // of all blog posts returned from getBlogPosts()\n    });\n    ```\n  \n    @method map\n    @public\n    @static\n    @for rsvp\n    @param {Array} promises\n    @param {Function} mapFn function to be called on each fulfilled promise.\n    @param {String} [label] optional string for labeling the promise.\n    Useful for tooling.\n    @return {Promise} promise that is fulfilled with the result of calling\n    `mapFn` on each fulfilled promise or value when they become fulfilled.\n     The promise will be rejected if any of the given `promises` become rejected.\n  */\n  function map(promises, mapFn, label) {\n    if (typeof mapFn !== 'function') {\n      return Promise.reject(new TypeError(\"map expects a function as a second argument\"), label);\n    }\n    return Promise.resolve(promises, label).then(function (promises) {\n      if (!Array.isArray(promises)) {\n        throw new TypeError(\"map must be called with an array\");\n      }\n      return new MapEnumerator(Promise, promises, mapFn, label).promise;\n    });\n  }\n\n  /**\n    This is a convenient alias for `Promise.resolve`.\n  \n    @method resolve\n    @public\n    @static\n    @for rsvp\n    @param {*} value value that the returned promise will be resolved with\n    @param {String} [label] optional string for identifying the returned promise.\n    Useful for tooling.\n    @return {Promise} a promise that will become fulfilled with the given\n    `value`\n  */\n  function resolve$2(value, label) {\n    return Promise.resolve(value, label);\n  }\n\n  /**\n    This is a convenient alias for `Promise.reject`.\n  \n    @method reject\n    @public\n    @static\n    @for rsvp\n    @param {*} reason value that the returned promise will be rejected with.\n    @param {String} [label] optional string for identifying the returned promise.\n    Useful for tooling.\n    @return {Promise} a promise rejected with the given `reason`.\n  */\n  function reject$2(reason, label) {\n    return Promise.reject(reason, label);\n  }\n  var EMPTY_OBJECT = {};\n  class FilterEnumerator extends MapEnumerator {\n    _checkFullfillment() {\n      if (this._remaining === 0 && this._result !== null) {\n        var result = this._result.filter(val => val !== EMPTY_OBJECT);\n        fulfill(this.promise, result);\n        this._result = null;\n      }\n    }\n    _setResultAt(state, i, value, firstPass) {\n      if (firstPass) {\n        this._result[i] = value;\n        var val,\n          succeeded = true;\n        try {\n          val = this._mapFn(value, i);\n        } catch (error) {\n          succeeded = false;\n          this._settledAt(REJECTED, i, error, false);\n        }\n        if (succeeded) {\n          this._eachEntry(val, i, false);\n        }\n      } else {\n        this._remaining--;\n        if (!value) {\n          this._result[i] = EMPTY_OBJECT;\n        }\n      }\n    }\n  }\n\n  /**\n   `filter` is similar to JavaScript's native `filter` method.\n   `filterFn` is eagerly called meaning that as soon as any promise\n    resolves its value will be passed to `filterFn`. `filter` returns\n    a promise that will become fulfilled with the result of running\n    `filterFn` on the values the promises become fulfilled with.\n  \n    For example:\n  \n    ```javascript\n    import { filter, resolve } from 'rsvp';\n  \n    let promise1 = resolve(1);\n    let promise2 = resolve(2);\n    let promise3 = resolve(3);\n  \n    let promises = [promise1, promise2, promise3];\n  \n    let filterFn = function(item){\n      return item > 1;\n    };\n  \n    filter(promises, filterFn).then(function(result){\n      // result is [ 2, 3 ]\n    });\n    ```\n  \n    If any of the `promises` given to `filter` are rejected, the first promise\n    that is rejected will be given as an argument to the returned promise's\n    rejection handler. For example:\n  \n    ```javascript\n    import { filter, reject, resolve } from 'rsvp';\n  \n    let promise1 = resolve(1);\n    let promise2 = reject(new Error('2'));\n    let promise3 = reject(new Error('3'));\n    let promises = [ promise1, promise2, promise3 ];\n  \n    let filterFn = function(item){\n      return item > 1;\n    };\n  \n    filter(promises, filterFn).then(function(array){\n      // Code here never runs because there are rejected promises!\n    }, function(reason) {\n      // reason.message === '2'\n    });\n    ```\n  \n    `filter` will also wait for any promises returned from `filterFn`.\n    For instance, you may want to fetch a list of users then return a subset\n    of those users based on some asynchronous operation:\n  \n    ```javascript\n    import { filter, resolve } from 'rsvp';\n  \n    let alice = { name: 'alice' };\n    let bob   = { name: 'bob' };\n    let users = [ alice, bob ];\n  \n    let promises = users.map(function(user){\n      return resolve(user);\n    });\n  \n    let filterFn = function(user){\n      // Here, Alice has permissions to create a blog post, but Bob does not.\n      return getPrivilegesForUser(user).then(function(privs){\n        return privs.can_create_blog_post === true;\n      });\n    };\n    filter(promises, filterFn).then(function(users){\n      // true, because the server told us only Alice can create a blog post.\n      users.length === 1;\n      // false, because Alice is the only user present in `users`\n      users[0] === bob;\n    });\n    ```\n  \n    @method filter\n    @public\n    @static\n    @for rsvp\n    @param {Array} promises\n    @param {Function} filterFn - function to be called on each resolved value to\n    filter the final results.\n    @param {String} [label] optional string describing the promise. Useful for\n    tooling.\n    @return {Promise}\n  */\n\n  function filter(promises, filterFn, label) {\n    if (typeof filterFn !== 'function') {\n      return Promise.reject(new TypeError(\"filter expects function as a second argument\"), label);\n    }\n    return Promise.resolve(promises, label).then(function (promises) {\n      if (!Array.isArray(promises)) {\n        throw new TypeError(\"filter must be called with an array\");\n      }\n      return new FilterEnumerator(Promise, promises, filterFn, label).promise;\n    });\n  }\n  var len = 0;\n  var vertxNext;\n  function asap(callback, arg) {\n    queue$1[len] = callback;\n    queue$1[len + 1] = arg;\n    len += 2;\n    if (len === 2) {\n      // If len is 1, that means that we need to schedule an async flush.\n      // If additional callbacks are queued before the queue is flushed, they\n      // will be processed by this flush that we are scheduling.\n      scheduleFlush$1();\n    }\n  }\n  var browserWindow = typeof window !== 'undefined' ? window : undefined;\n  var browserGlobal = browserWindow || {};\n  var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\n  var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n  // test for web worker but not in IE10\n  var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n  // node\n  function useNextTick() {\n    var nextTick = process.nextTick;\n    // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n    // setImmediate should be used instead instead\n    var version = process.versions.node.match(/^(?:(\\d+)\\.)?(?:(\\d+)\\.)?(\\*|\\d+)$/);\n    if (Array.isArray(version) && version[1] === '0' && version[2] === '10') {\n      nextTick = setImmediate;\n    }\n    return () => nextTick(flush);\n  }\n\n  // vertx\n  function useVertxTimer() {\n    if (typeof vertxNext !== 'undefined') {\n      return function () {\n        vertxNext(flush);\n      };\n    }\n    return useSetTimeout();\n  }\n  function useMutationObserver() {\n    var iterations = 0;\n    var observer = new BrowserMutationObserver(flush);\n    var node = document.createTextNode('');\n    observer.observe(node, {\n      characterData: true\n    });\n    return () => node.data = iterations = ++iterations % 2;\n  }\n\n  // web worker\n  function useMessageChannel() {\n    var channel = new MessageChannel();\n    channel.port1.onmessage = flush;\n    return () => channel.port2.postMessage(0);\n  }\n  function useSetTimeout() {\n    return () => setTimeout(flush, 1);\n  }\n  var queue$1 = new Array(1000);\n  function flush() {\n    for (var i = 0; i < len; i += 2) {\n      var callback = queue$1[i];\n      var arg = queue$1[i + 1];\n      callback(arg);\n      queue$1[i] = undefined;\n      queue$1[i + 1] = undefined;\n    }\n    len = 0;\n  }\n  function attemptVertex() {\n    try {\n      var vertx = Function('return this')().require('vertx');\n      vertxNext = vertx.runOnLoop || vertx.runOnContext;\n      return useVertxTimer();\n    } catch (e) {\n      return useSetTimeout();\n    }\n  }\n  var scheduleFlush$1;\n  // Decide what async method to use to triggering processing of queued callbacks:\n  if (isNode) {\n    scheduleFlush$1 = useNextTick();\n  } else if (BrowserMutationObserver) {\n    scheduleFlush$1 = useMutationObserver();\n  } else if (isWorker) {\n    scheduleFlush$1 = useMessageChannel();\n  } else if (browserWindow === undefined && typeof require === 'function') {\n    scheduleFlush$1 = attemptVertex();\n  } else {\n    scheduleFlush$1 = useSetTimeout();\n  }\n\n  // defaults\n  config.async = asap;\n  config.after = cb => setTimeout(cb, 0);\n  var cast = resolve$2;\n  _exports.cast = cast;\n  var async = (callback, arg) => config.async(callback, arg);\n  _exports.async = async;\n  function on() {\n    config.on(...arguments);\n  }\n  function off() {\n    config.off(...arguments);\n  }\n\n  // Set up instrumentation through `window.__PROMISE_INTRUMENTATION__`\n  if (typeof window !== 'undefined' && typeof window['__PROMISE_INSTRUMENTATION__'] === 'object') {\n    var callbacks = window['__PROMISE_INSTRUMENTATION__'];\n    configure('instrument', true);\n    for (var eventName in callbacks) {\n      if (callbacks.hasOwnProperty(eventName)) {\n        on(eventName, callbacks[eventName]);\n      }\n    }\n  }\n\n  // the default export here is for backwards compat:\n  //   https://github.com/tildeio/rsvp.js/issues/434\n  var rsvp = {\n    asap,\n    cast,\n    Promise,\n    EventTarget,\n    all: all$1,\n    allSettled,\n    race: race$1,\n    hash,\n    hashSettled,\n    rethrow,\n    defer,\n    denodeify,\n    configure,\n    on,\n    off,\n    resolve: resolve$2,\n    reject: reject$2,\n    map,\n    async,\n    filter\n  };\n  var _default = rsvp;\n  _exports.default = _default;\n});","(function () {\n  function vendorModule() {\n    'use strict';\n\n    return {\n      'default': self['jQuery'],\n      __esModule: true\n    };\n  }\n  define('jquery', [], vendorModule);\n})();","if (typeof FastBoot === 'undefined') {\n      var preferNative = false;\n      (function (originalGlobal) {\n  define('fetch', ['exports', 'ember', 'rsvp'], function (exports, Ember__module, RSVP__module) {\n    'use strict';\n\n    var Ember = 'default' in Ember__module ? Ember__module['default'] : Ember__module;\n    var RSVP = 'default' in RSVP__module ? RSVP__module['default'] : RSVP__module;\n    var Promise = RSVP.Promise;\n    var supportProps = ['FormData', 'FileReader', 'Blob', 'URLSearchParams', 'Symbol', 'ArrayBuffer'];\n    var polyfillProps = ['fetch', 'Headers', 'Request', 'Response', 'AbortController'];\n    var combinedProps = supportProps;\n    if (preferNative) {\n      combinedProps = supportProps.concat(polyfillProps);\n    }\n    combinedProps.forEach(function (prop) {\n      if (originalGlobal[prop]) {\n        Object.defineProperty(exports, prop, {\n          configurable: true,\n          get: function () {\n            return originalGlobal[prop];\n          },\n          set: function (v) {\n            originalGlobal[prop] = v;\n          }\n        });\n      }\n    });\n\n    // shadow github/fetch global object\n    // https://github.com/github/fetch/blob/v3.4.0/fetch.js\n    var globalThis = exports;\n    // shadow mo/abortcontroller-polyfill global object\n    // https://github.com/mo/abortcontroller-polyfill/blob/v1.4.0/src/abortcontroller-polyfill.js\n    var self = exports;\n    (function () {\n      'use strict';\n\n      class Emitter {\n        constructor() {\n          Object.defineProperty(this, 'listeners', {\n            value: {},\n            writable: true,\n            configurable: true\n          });\n        }\n        addEventListener(type, callback, options) {\n          if (!(type in this.listeners)) {\n            this.listeners[type] = [];\n          }\n          this.listeners[type].push({\n            callback,\n            options\n          });\n        }\n        removeEventListener(type, callback) {\n          if (!(type in this.listeners)) {\n            return;\n          }\n          const stack = this.listeners[type];\n          for (let i = 0, l = stack.length; i < l; i++) {\n            if (stack[i].callback === callback) {\n              stack.splice(i, 1);\n              return;\n            }\n          }\n        }\n        dispatchEvent(event) {\n          if (!(event.type in this.listeners)) {\n            return;\n          }\n          const stack = this.listeners[event.type];\n          const stackToCall = stack.slice();\n          for (let i = 0, l = stackToCall.length; i < l; i++) {\n            const listener = stackToCall[i];\n            try {\n              listener.callback.call(this, event);\n            } catch (e) {\n              Promise.resolve().then(() => {\n                throw e;\n              });\n            }\n            if (listener.options && listener.options.once) {\n              this.removeEventListener(event.type, listener.callback);\n            }\n          }\n          return !event.defaultPrevented;\n        }\n      }\n      class AbortSignal extends Emitter {\n        constructor() {\n          super();\n          // Some versions of babel does not transpile super() correctly for IE <= 10, if the parent\n          // constructor has failed to run, then \"this.listeners\" will still be undefined and then we call\n          // the parent constructor directly instead as a workaround. For general details, see babel bug:\n          // https://github.com/babel/babel/issues/3041\n          // This hack was added as a fix for the issue described here:\n          // https://github.com/Financial-Times/polyfill-library/pull/59#issuecomment-477558042\n          if (!this.listeners) {\n            Emitter.call(this);\n          }\n\n          // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and\n          // we want Object.keys(new AbortController().signal) to be [] for compat with the native impl\n          Object.defineProperty(this, 'aborted', {\n            value: false,\n            writable: true,\n            configurable: true\n          });\n          Object.defineProperty(this, 'onabort', {\n            value: null,\n            writable: true,\n            configurable: true\n          });\n          Object.defineProperty(this, 'reason', {\n            value: undefined,\n            writable: true,\n            configurable: true\n          });\n        }\n        toString() {\n          return '[object AbortSignal]';\n        }\n        dispatchEvent(event) {\n          if (event.type === 'abort') {\n            this.aborted = true;\n            if (typeof this.onabort === 'function') {\n              this.onabort.call(this, event);\n            }\n          }\n          super.dispatchEvent(event);\n        }\n      }\n      class AbortController {\n        constructor() {\n          // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and\n          // we want Object.keys(new AbortController()) to be [] for compat with the native impl\n          Object.defineProperty(this, 'signal', {\n            value: new AbortSignal(),\n            writable: true,\n            configurable: true\n          });\n        }\n        abort(reason) {\n          let event;\n          try {\n            event = new Event('abort');\n          } catch (e) {\n            if (typeof document !== 'undefined') {\n              if (!document.createEvent) {\n                // For Internet Explorer 8:\n                event = document.createEventObject();\n                event.type = 'abort';\n              } else {\n                // For Internet Explorer 11:\n                event = document.createEvent('Event');\n                event.initEvent('abort', false, false);\n              }\n            } else {\n              // Fallback where document isn't available:\n              event = {\n                type: 'abort',\n                bubbles: false,\n                cancelable: false\n              };\n            }\n          }\n          let signalReason = reason;\n          if (signalReason === undefined) {\n            if (typeof document === 'undefined') {\n              signalReason = new Error('This operation was aborted');\n              signalReason.name = 'AbortError';\n            } else {\n              try {\n                signalReason = new DOMException('signal is aborted without reason');\n              } catch (err) {\n                // IE 11 does not support calling the DOMException constructor, use a\n                // regular error object on it instead.\n                signalReason = new Error('This operation was aborted');\n                signalReason.name = 'AbortError';\n              }\n            }\n          }\n          this.signal.reason = signalReason;\n          this.signal.dispatchEvent(event);\n        }\n        toString() {\n          return '[object AbortController]';\n        }\n      }\n      if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n        // These are necessary to make sure that we get correct output for:\n        // Object.prototype.toString.call(new AbortController())\n        AbortController.prototype[Symbol.toStringTag] = 'AbortController';\n        AbortSignal.prototype[Symbol.toStringTag] = 'AbortSignal';\n      }\n      function polyfillNeeded(self) {\n        if (self.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) {\n          console.log('__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL=true is set, will force install polyfill');\n          return true;\n        }\n\n        // Note that the \"unfetch\" minimal fetch polyfill defines fetch() without\n        // defining window.Request, and this polyfill need to work on top of unfetch\n        // so the below feature detection needs the !self.AbortController part.\n        // The Request.prototype check is also needed because Safari versions 11.1.2\n        // up to and including 12.1.x has a window.AbortController present but still\n        // does NOT correctly implement abortable fetch:\n        // https://bugs.webkit.org/show_bug.cgi?id=174980#c2\n        return typeof self.Request === 'function' && !self.Request.prototype.hasOwnProperty('signal') || !self.AbortController;\n      }\n      (function (self) {\n        if (!polyfillNeeded(self)) {\n          return;\n        }\n        self.AbortController = AbortController;\n        self.AbortSignal = AbortSignal;\n      })(typeof self !== 'undefined' ? self : global);\n    })();\n    var WHATWGFetch = function (exports) {\n      'use strict';\n\n      var global = typeof globalThis !== 'undefined' && globalThis || typeof self !== 'undefined' && self || typeof global !== 'undefined' && global;\n      var support = {\n        searchParams: 'URLSearchParams' in global,\n        iterable: 'Symbol' in global && 'iterator' in Symbol,\n        blob: 'FileReader' in global && 'Blob' in global && function () {\n          try {\n            new Blob();\n            return true;\n          } catch (e) {\n            return false;\n          }\n        }(),\n        formData: 'FormData' in global,\n        arrayBuffer: 'ArrayBuffer' in global\n      };\n      function isDataView(obj) {\n        return obj && DataView.prototype.isPrototypeOf(obj);\n      }\n      if (support.arrayBuffer) {\n        var viewClasses = ['[object Int8Array]', '[object Uint8Array]', '[object Uint8ClampedArray]', '[object Int16Array]', '[object Uint16Array]', '[object Int32Array]', '[object Uint32Array]', '[object Float32Array]', '[object Float64Array]'];\n        var isArrayBufferView = ArrayBuffer.isView || function (obj) {\n          return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1;\n        };\n      }\n      function normalizeName(name) {\n        if (typeof name !== 'string') {\n          name = String(name);\n        }\n        if (/[^a-z0-9\\-#$%&'*+.^_`|~!]/i.test(name) || name === '') {\n          throw new TypeError('Invalid character in header field name: \"' + name + '\"');\n        }\n        return name.toLowerCase();\n      }\n      function normalizeValue(value) {\n        if (typeof value !== 'string') {\n          value = String(value);\n        }\n        return value;\n      }\n\n      // Build a destructive iterator for the value list\n      function iteratorFor(items) {\n        var iterator = {\n          next: function () {\n            var value = items.shift();\n            return {\n              done: value === undefined,\n              value: value\n            };\n          }\n        };\n        if (support.iterable) {\n          iterator[Symbol.iterator] = function () {\n            return iterator;\n          };\n        }\n        return iterator;\n      }\n      function Headers(headers) {\n        this.map = {};\n        if (headers instanceof Headers) {\n          headers.forEach(function (value, name) {\n            this.append(name, value);\n          }, this);\n        } else if (Array.isArray(headers)) {\n          headers.forEach(function (header) {\n            this.append(header[0], header[1]);\n          }, this);\n        } else if (headers) {\n          Object.getOwnPropertyNames(headers).forEach(function (name) {\n            this.append(name, headers[name]);\n          }, this);\n        }\n      }\n      Headers.prototype.append = function (name, value) {\n        name = normalizeName(name);\n        value = normalizeValue(value);\n        var oldValue = this.map[name];\n        this.map[name] = oldValue ? oldValue + ', ' + value : value;\n      };\n      Headers.prototype['delete'] = function (name) {\n        delete this.map[normalizeName(name)];\n      };\n      Headers.prototype.get = function (name) {\n        name = normalizeName(name);\n        return this.has(name) ? this.map[name] : null;\n      };\n      Headers.prototype.has = function (name) {\n        return this.map.hasOwnProperty(normalizeName(name));\n      };\n      Headers.prototype.set = function (name, value) {\n        this.map[normalizeName(name)] = normalizeValue(value);\n      };\n      Headers.prototype.forEach = function (callback, thisArg) {\n        for (var name in this.map) {\n          if (this.map.hasOwnProperty(name)) {\n            callback.call(thisArg, this.map[name], name, this);\n          }\n        }\n      };\n      Headers.prototype.keys = function () {\n        var items = [];\n        this.forEach(function (value, name) {\n          items.push(name);\n        });\n        return iteratorFor(items);\n      };\n      Headers.prototype.values = function () {\n        var items = [];\n        this.forEach(function (value) {\n          items.push(value);\n        });\n        return iteratorFor(items);\n      };\n      Headers.prototype.entries = function () {\n        var items = [];\n        this.forEach(function (value, name) {\n          items.push([name, value]);\n        });\n        return iteratorFor(items);\n      };\n      if (support.iterable) {\n        Headers.prototype[Symbol.iterator] = Headers.prototype.entries;\n      }\n      function consumed(body) {\n        if (body.bodyUsed) {\n          return Promise.reject(new TypeError('Already read'));\n        }\n        body.bodyUsed = true;\n      }\n      function fileReaderReady(reader) {\n        return new Promise(function (resolve, reject) {\n          reader.onload = function () {\n            resolve(reader.result);\n          };\n          reader.onerror = function () {\n            reject(reader.error);\n          };\n        });\n      }\n      function readBlobAsArrayBuffer(blob) {\n        var reader = new FileReader();\n        var promise = fileReaderReady(reader);\n        reader.readAsArrayBuffer(blob);\n        return promise;\n      }\n      function readBlobAsText(blob) {\n        var reader = new FileReader();\n        var promise = fileReaderReady(reader);\n        reader.readAsText(blob);\n        return promise;\n      }\n      function readArrayBufferAsText(buf) {\n        var view = new Uint8Array(buf);\n        var chars = new Array(view.length);\n        for (var i = 0; i < view.length; i++) {\n          chars[i] = String.fromCharCode(view[i]);\n        }\n        return chars.join('');\n      }\n      function bufferClone(buf) {\n        if (buf.slice) {\n          return buf.slice(0);\n        } else {\n          var view = new Uint8Array(buf.byteLength);\n          view.set(new Uint8Array(buf));\n          return view.buffer;\n        }\n      }\n      function Body() {\n        this.bodyUsed = false;\n        this._initBody = function (body) {\n          /*\n            fetch-mock wraps the Response object in an ES6 Proxy to\n            provide useful test harness features such as flush. However, on\n            ES5 browsers without fetch or Proxy support pollyfills must be used;\n            the proxy-pollyfill is unable to proxy an attribute unless it exists\n            on the object before the Proxy is created. This change ensures\n            Response.bodyUsed exists on the instance, while maintaining the\n            semantic of setting Request.bodyUsed in the constructor before\n            _initBody is called.\n          */\n          this.bodyUsed = this.bodyUsed;\n          this._bodyInit = body;\n          if (!body) {\n            this._bodyText = '';\n          } else if (typeof body === 'string') {\n            this._bodyText = body;\n          } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n            this._bodyBlob = body;\n          } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n            this._bodyFormData = body;\n          } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n            this._bodyText = body.toString();\n          } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n            this._bodyArrayBuffer = bufferClone(body.buffer);\n            // IE 10-11 can't handle a DataView body.\n            this._bodyInit = new Blob([this._bodyArrayBuffer]);\n          } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n            this._bodyArrayBuffer = bufferClone(body);\n          } else {\n            this._bodyText = body = Object.prototype.toString.call(body);\n          }\n          if (!this.headers.get('content-type')) {\n            if (typeof body === 'string') {\n              this.headers.set('content-type', 'text/plain;charset=UTF-8');\n            } else if (this._bodyBlob && this._bodyBlob.type) {\n              this.headers.set('content-type', this._bodyBlob.type);\n            } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n              this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n            }\n          }\n        };\n        if (support.blob) {\n          this.blob = function () {\n            var rejected = consumed(this);\n            if (rejected) {\n              return rejected;\n            }\n            if (this._bodyBlob) {\n              return Promise.resolve(this._bodyBlob);\n            } else if (this._bodyArrayBuffer) {\n              return Promise.resolve(new Blob([this._bodyArrayBuffer]));\n            } else if (this._bodyFormData) {\n              throw new Error('could not read FormData body as blob');\n            } else {\n              return Promise.resolve(new Blob([this._bodyText]));\n            }\n          };\n          this.arrayBuffer = function () {\n            if (this._bodyArrayBuffer) {\n              var isConsumed = consumed(this);\n              if (isConsumed) {\n                return isConsumed;\n              }\n              if (ArrayBuffer.isView(this._bodyArrayBuffer)) {\n                return Promise.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset, this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength));\n              } else {\n                return Promise.resolve(this._bodyArrayBuffer);\n              }\n            } else {\n              return this.blob().then(readBlobAsArrayBuffer);\n            }\n          };\n        }\n        this.text = function () {\n          var rejected = consumed(this);\n          if (rejected) {\n            return rejected;\n          }\n          if (this._bodyBlob) {\n            return readBlobAsText(this._bodyBlob);\n          } else if (this._bodyArrayBuffer) {\n            return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer));\n          } else if (this._bodyFormData) {\n            throw new Error('could not read FormData body as text');\n          } else {\n            return Promise.resolve(this._bodyText);\n          }\n        };\n        if (support.formData) {\n          this.formData = function () {\n            return this.text().then(decode);\n          };\n        }\n        this.json = function () {\n          return this.text().then(JSON.parse);\n        };\n        return this;\n      }\n\n      // HTTP methods whose capitalization should be normalized\n      var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];\n      function normalizeMethod(method) {\n        var upcased = method.toUpperCase();\n        return methods.indexOf(upcased) > -1 ? upcased : method;\n      }\n      function Request(input, options) {\n        if (!(this instanceof Request)) {\n          throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.');\n        }\n        options = options || {};\n        var body = options.body;\n        if (input instanceof Request) {\n          if (input.bodyUsed) {\n            throw new TypeError('Already read');\n          }\n          this.url = input.url;\n          this.credentials = input.credentials;\n          if (!options.headers) {\n            this.headers = new Headers(input.headers);\n          }\n          this.method = input.method;\n          this.mode = input.mode;\n          this.signal = input.signal;\n          if (!body && input._bodyInit != null) {\n            body = input._bodyInit;\n            input.bodyUsed = true;\n          }\n        } else {\n          this.url = String(input);\n        }\n        this.credentials = options.credentials || this.credentials || 'same-origin';\n        if (options.headers || !this.headers) {\n          this.headers = new Headers(options.headers);\n        }\n        this.method = normalizeMethod(options.method || this.method || 'GET');\n        this.mode = options.mode || this.mode || null;\n        this.signal = options.signal || this.signal;\n        this.referrer = null;\n        if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n          throw new TypeError('Body not allowed for GET or HEAD requests');\n        }\n        this._initBody(body);\n        if (this.method === 'GET' || this.method === 'HEAD') {\n          if (options.cache === 'no-store' || options.cache === 'no-cache') {\n            // Search for a '_' parameter in the query string\n            var reParamSearch = /([?&])_=[^&]*/;\n            if (reParamSearch.test(this.url)) {\n              // If it already exists then set the value with the current time\n              this.url = this.url.replace(reParamSearch, '$1_=' + new Date().getTime());\n            } else {\n              // Otherwise add a new '_' parameter to the end with the current time\n              var reQueryString = /\\?/;\n              this.url += (reQueryString.test(this.url) ? '&' : '?') + '_=' + new Date().getTime();\n            }\n          }\n        }\n      }\n      Request.prototype.clone = function () {\n        return new Request(this, {\n          body: this._bodyInit\n        });\n      };\n      function decode(body) {\n        var form = new FormData();\n        body.trim().split('&').forEach(function (bytes) {\n          if (bytes) {\n            var split = bytes.split('=');\n            var name = split.shift().replace(/\\+/g, ' ');\n            var value = split.join('=').replace(/\\+/g, ' ');\n            form.append(decodeURIComponent(name), decodeURIComponent(value));\n          }\n        });\n        return form;\n      }\n      function parseHeaders(rawHeaders) {\n        var headers = new Headers();\n        // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n        // https://tools.ietf.org/html/rfc7230#section-3.2\n        var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ');\n        // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill\n        // https://github.com/github/fetch/issues/748\n        // https://github.com/zloirock/core-js/issues/751\n        preProcessedHeaders.split('\\r').map(function (header) {\n          return header.indexOf('\\n') === 0 ? header.substr(1, header.length) : header;\n        }).forEach(function (line) {\n          var parts = line.split(':');\n          var key = parts.shift().trim();\n          if (key) {\n            var value = parts.join(':').trim();\n            headers.append(key, value);\n          }\n        });\n        return headers;\n      }\n      Body.call(Request.prototype);\n      function Response(bodyInit, options) {\n        if (!(this instanceof Response)) {\n          throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.');\n        }\n        if (!options) {\n          options = {};\n        }\n        this.type = 'default';\n        this.status = options.status === undefined ? 200 : options.status;\n        this.ok = this.status >= 200 && this.status < 300;\n        this.statusText = options.statusText === undefined ? '' : '' + options.statusText;\n        this.headers = new Headers(options.headers);\n        this.url = options.url || '';\n        this._initBody(bodyInit);\n      }\n      Body.call(Response.prototype);\n      Response.prototype.clone = function () {\n        return new Response(this._bodyInit, {\n          status: this.status,\n          statusText: this.statusText,\n          headers: new Headers(this.headers),\n          url: this.url\n        });\n      };\n      Response.error = function () {\n        var response = new Response(null, {\n          status: 0,\n          statusText: ''\n        });\n        response.type = 'error';\n        return response;\n      };\n      var redirectStatuses = [301, 302, 303, 307, 308];\n      Response.redirect = function (url, status) {\n        if (redirectStatuses.indexOf(status) === -1) {\n          throw new RangeError('Invalid status code');\n        }\n        return new Response(null, {\n          status: status,\n          headers: {\n            location: url\n          }\n        });\n      };\n      exports.DOMException = global.DOMException;\n      try {\n        new exports.DOMException();\n      } catch (err) {\n        exports.DOMException = function (message, name) {\n          this.message = message;\n          this.name = name;\n          var error = Error(message);\n          this.stack = error.stack;\n        };\n        exports.DOMException.prototype = Object.create(Error.prototype);\n        exports.DOMException.prototype.constructor = exports.DOMException;\n      }\n      function fetch(input, init) {\n        return new Promise(function (resolve, reject) {\n          var request = new Request(input, init);\n          if (request.signal && request.signal.aborted) {\n            return reject(new exports.DOMException('Aborted', 'AbortError'));\n          }\n          var xhr = new XMLHttpRequest();\n          function abortXhr() {\n            xhr.abort();\n          }\n          xhr.onload = function () {\n            var options = {\n              status: xhr.status,\n              statusText: xhr.statusText,\n              headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n            };\n            options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');\n            var body = 'response' in xhr ? xhr.response : xhr.responseText;\n            setTimeout(function () {\n              resolve(new Response(body, options));\n            }, 0);\n          };\n          xhr.onerror = function () {\n            setTimeout(function () {\n              reject(new TypeError('Network request failed'));\n            }, 0);\n          };\n          xhr.ontimeout = function () {\n            setTimeout(function () {\n              reject(new TypeError('Network request failed'));\n            }, 0);\n          };\n          xhr.onabort = function () {\n            setTimeout(function () {\n              reject(new exports.DOMException('Aborted', 'AbortError'));\n            }, 0);\n          };\n          function fixUrl(url) {\n            try {\n              return url === '' && global.location.href ? global.location.href : url;\n            } catch (e) {\n              return url;\n            }\n          }\n          xhr.open(request.method, fixUrl(request.url), true);\n          if (request.credentials === 'include') {\n            xhr.withCredentials = true;\n          } else if (request.credentials === 'omit') {\n            xhr.withCredentials = false;\n          }\n          if ('responseType' in xhr) {\n            if (support.blob) {\n              xhr.responseType = 'blob';\n            } else if (support.arrayBuffer && request.headers.get('Content-Type') && request.headers.get('Content-Type').indexOf('application/octet-stream') !== -1) {\n              xhr.responseType = 'arraybuffer';\n            }\n          }\n          if (init && typeof init.headers === 'object' && !(init.headers instanceof Headers)) {\n            Object.getOwnPropertyNames(init.headers).forEach(function (name) {\n              xhr.setRequestHeader(name, normalizeValue(init.headers[name]));\n            });\n          } else {\n            request.headers.forEach(function (value, name) {\n              xhr.setRequestHeader(name, value);\n            });\n          }\n          if (request.signal) {\n            request.signal.addEventListener('abort', abortXhr);\n            xhr.onreadystatechange = function () {\n              // DONE (success or failure)\n              if (xhr.readyState === 4) {\n                request.signal.removeEventListener('abort', abortXhr);\n              }\n            };\n          }\n          xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);\n        });\n      }\n      fetch.polyfill = true;\n      if (!global.fetch) {\n        global.fetch = fetch;\n        global.Headers = Headers;\n        global.Request = Request;\n        global.Response = Response;\n      }\n      exports.Headers = Headers;\n      exports.Request = Request;\n      exports.Response = Response;\n      exports.fetch = fetch;\n      return exports;\n    }({});\n    if (!globalThis.fetch) {\n      throw new Error('fetch is not defined - maybe your browser targets are not covering everything you need?');\n    }\n    var pending = 0;\n    function decrement(result) {\n      pending--;\n      return result;\n    }\n    if (Ember.Test) {\n      Ember.Test.registerWaiter(function () {\n        return pending === 0;\n      });\n      exports['default'] = function () {\n        pending++;\n        return exports.fetch.apply(originalGlobal, arguments).then(function (response) {\n          response.clone().blob().then(decrement, decrement);\n          return response;\n        }, function (reason) {\n          decrement(reason);\n          throw reason;\n        });\n      };\n    } else {\n      exports['default'] = exports.fetch;\n    }\n    supportProps.forEach(function (prop) {\n      delete exports[prop];\n    });\n  });\n})(typeof window !== 'undefined' && window || typeof globalThis !== 'undefined' && globalThis || typeof self !== 'undefined' && self || typeof global !== 'undefined' && global);\n    }","// Opt into manual highlighting as Prism mangling with the DOM directly will break GlimmerVM w/ dynamic updates\n(window.Prism = window.Prism || {}).manual = true;\n","\n/* **********************************************\n     Begin prism-core.js\n********************************************** */\n\n/// <reference lib=\"WebWorker\"/>\n\nvar _self = (typeof window !== 'undefined')\n\t? window   // if in browser\n\t: (\n\t\t(typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope)\n\t\t\t? self // if in worker\n\t\t\t: {}   // if in node js\n\t);\n\n/**\n * Prism: Lightweight, robust, elegant syntax highlighting\n *\n * @license MIT <https://opensource.org/licenses/MIT>\n * @author Lea Verou <https://lea.verou.me>\n * @namespace\n * @public\n */\nvar Prism = (function (_self) {\n\n\t// Private helper vars\n\tvar lang = /(?:^|\\s)lang(?:uage)?-([\\w-]+)(?=\\s|$)/i;\n\tvar uniqueId = 0;\n\n\t// The grammar object for plaintext\n\tvar plainTextGrammar = {};\n\n\n\tvar _ = {\n\t\t/**\n\t\t * By default, Prism will attempt to highlight all code elements (by calling {@link Prism.highlightAll}) on the\n\t\t * current page after the page finished loading. This might be a problem if e.g. you wanted to asynchronously load\n\t\t * additional languages or plugins yourself.\n\t\t *\n\t\t * By setting this value to `true`, Prism will not automatically highlight all code elements on the page.\n\t\t *\n\t\t * You obviously have to change this value before the automatic highlighting started. To do this, you can add an\n\t\t * empty Prism object into the global scope before loading the Prism script like this:\n\t\t *\n\t\t * ```js\n\t\t * window.Prism = window.Prism || {};\n\t\t * Prism.manual = true;\n\t\t * // add a new <script> to load Prism's script\n\t\t * ```\n\t\t *\n\t\t * @default false\n\t\t * @type {boolean}\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\tmanual: _self.Prism && _self.Prism.manual,\n\t\t/**\n\t\t * By default, if Prism is in a web worker, it assumes that it is in a worker it created itself, so it uses\n\t\t * `addEventListener` to communicate with its parent instance. However, if you're using Prism manually in your\n\t\t * own worker, you don't want it to do this.\n\t\t *\n\t\t * By setting this value to `true`, Prism will not add its own listeners to the worker.\n\t\t *\n\t\t * You obviously have to change this value before Prism executes. To do this, you can add an\n\t\t * empty Prism object into the global scope before loading the Prism script like this:\n\t\t *\n\t\t * ```js\n\t\t * window.Prism = window.Prism || {};\n\t\t * Prism.disableWorkerMessageHandler = true;\n\t\t * // Load Prism's script\n\t\t * ```\n\t\t *\n\t\t * @default false\n\t\t * @type {boolean}\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\tdisableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler,\n\n\t\t/**\n\t\t * A namespace for utility methods.\n\t\t *\n\t\t * All function in this namespace that are not explicitly marked as _public_ are for __internal use only__ and may\n\t\t * change or disappear at any time.\n\t\t *\n\t\t * @namespace\n\t\t * @memberof Prism\n\t\t */\n\t\tutil: {\n\t\t\tencode: function encode(tokens) {\n\t\t\t\tif (tokens instanceof Token) {\n\t\t\t\t\treturn new Token(tokens.type, encode(tokens.content), tokens.alias);\n\t\t\t\t} else if (Array.isArray(tokens)) {\n\t\t\t\t\treturn tokens.map(encode);\n\t\t\t\t} else {\n\t\t\t\t\treturn tokens.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\\u00a0/g, ' ');\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Returns the name of the type of the given value.\n\t\t\t *\n\t\t\t * @param {any} o\n\t\t\t * @returns {string}\n\t\t\t * @example\n\t\t\t * type(null)      === 'Null'\n\t\t\t * type(undefined) === 'Undefined'\n\t\t\t * type(123)       === 'Number'\n\t\t\t * type('foo')     === 'String'\n\t\t\t * type(true)      === 'Boolean'\n\t\t\t * type([1, 2])    === 'Array'\n\t\t\t * type({})        === 'Object'\n\t\t\t * type(String)    === 'Function'\n\t\t\t * type(/abc+/)    === 'RegExp'\n\t\t\t */\n\t\t\ttype: function (o) {\n\t\t\t\treturn Object.prototype.toString.call(o).slice(8, -1);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Returns a unique number for the given object. Later calls will still return the same number.\n\t\t\t *\n\t\t\t * @param {Object} obj\n\t\t\t * @returns {number}\n\t\t\t */\n\t\t\tobjId: function (obj) {\n\t\t\t\tif (!obj['__id']) {\n\t\t\t\t\tObject.defineProperty(obj, '__id', { value: ++uniqueId });\n\t\t\t\t}\n\t\t\t\treturn obj['__id'];\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Creates a deep clone of the given object.\n\t\t\t *\n\t\t\t * The main intended use of this function is to clone language definitions.\n\t\t\t *\n\t\t\t * @param {T} o\n\t\t\t * @param {Record<number, any>} [visited]\n\t\t\t * @returns {T}\n\t\t\t * @template T\n\t\t\t */\n\t\t\tclone: function deepClone(o, visited) {\n\t\t\t\tvisited = visited || {};\n\n\t\t\t\tvar clone; var id;\n\t\t\t\tswitch (_.util.type(o)) {\n\t\t\t\t\tcase 'Object':\n\t\t\t\t\t\tid = _.util.objId(o);\n\t\t\t\t\t\tif (visited[id]) {\n\t\t\t\t\t\t\treturn visited[id];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tclone = /** @type {Record<string, any>} */ ({});\n\t\t\t\t\t\tvisited[id] = clone;\n\n\t\t\t\t\t\tfor (var key in o) {\n\t\t\t\t\t\t\tif (o.hasOwnProperty(key)) {\n\t\t\t\t\t\t\t\tclone[key] = deepClone(o[key], visited);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn /** @type {any} */ (clone);\n\n\t\t\t\t\tcase 'Array':\n\t\t\t\t\t\tid = _.util.objId(o);\n\t\t\t\t\t\tif (visited[id]) {\n\t\t\t\t\t\t\treturn visited[id];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t\tvisited[id] = clone;\n\n\t\t\t\t\t\t(/** @type {Array} */(/** @type {any} */(o))).forEach(function (v, i) {\n\t\t\t\t\t\t\tclone[i] = deepClone(v, visited);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn /** @type {any} */ (clone);\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn o;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Returns the Prism language of the given element set by a `language-xxxx` or `lang-xxxx` class.\n\t\t\t *\n\t\t\t * If no language is set for the element or the element is `null` or `undefined`, `none` will be returned.\n\t\t\t *\n\t\t\t * @param {Element} element\n\t\t\t * @returns {string}\n\t\t\t */\n\t\t\tgetLanguage: function (element) {\n\t\t\t\twhile (element) {\n\t\t\t\t\tvar m = lang.exec(element.className);\n\t\t\t\t\tif (m) {\n\t\t\t\t\t\treturn m[1].toLowerCase();\n\t\t\t\t\t}\n\t\t\t\t\telement = element.parentElement;\n\t\t\t\t}\n\t\t\t\treturn 'none';\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Sets the Prism `language-xxxx` class of the given element.\n\t\t\t *\n\t\t\t * @param {Element} element\n\t\t\t * @param {string} language\n\t\t\t * @returns {void}\n\t\t\t */\n\t\t\tsetLanguage: function (element, language) {\n\t\t\t\t// remove all `language-xxxx` classes\n\t\t\t\t// (this might leave behind a leading space)\n\t\t\t\telement.className = element.className.replace(RegExp(lang, 'gi'), '');\n\n\t\t\t\t// add the new `language-xxxx` class\n\t\t\t\t// (using `classList` will automatically clean up spaces for us)\n\t\t\t\telement.classList.add('language-' + language);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Returns the script element that is currently executing.\n\t\t\t *\n\t\t\t * This does __not__ work for line script element.\n\t\t\t *\n\t\t\t * @returns {HTMLScriptElement | null}\n\t\t\t */\n\t\t\tcurrentScript: function () {\n\t\t\t\tif (typeof document === 'undefined') {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tif ('currentScript' in document && 1 < 2 /* hack to trip TS' flow analysis */) {\n\t\t\t\t\treturn /** @type {any} */ (document.currentScript);\n\t\t\t\t}\n\n\t\t\t\t// IE11 workaround\n\t\t\t\t// we'll get the src of the current script by parsing IE11's error stack trace\n\t\t\t\t// this will not work for inline scripts\n\n\t\t\t\ttry {\n\t\t\t\t\tthrow new Error();\n\t\t\t\t} catch (err) {\n\t\t\t\t\t// Get file src url from stack. Specifically works with the format of stack traces in IE.\n\t\t\t\t\t// A stack will look like this:\n\t\t\t\t\t//\n\t\t\t\t\t// Error\n\t\t\t\t\t//    at _.util.currentScript (http://localhost/components/prism-core.js:119:5)\n\t\t\t\t\t//    at Global code (http://localhost/components/prism-core.js:606:1)\n\n\t\t\t\t\tvar src = (/at [^(\\r\\n]*\\((.*):[^:]+:[^:]+\\)$/i.exec(err.stack) || [])[1];\n\t\t\t\t\tif (src) {\n\t\t\t\t\t\tvar scripts = document.getElementsByTagName('script');\n\t\t\t\t\t\tfor (var i in scripts) {\n\t\t\t\t\t\t\tif (scripts[i].src == src) {\n\t\t\t\t\t\t\t\treturn scripts[i];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Returns whether a given class is active for `element`.\n\t\t\t *\n\t\t\t * The class can be activated if `element` or one of its ancestors has the given class and it can be deactivated\n\t\t\t * if `element` or one of its ancestors has the negated version of the given class. The _negated version_ of the\n\t\t\t * given class is just the given class with a `no-` prefix.\n\t\t\t *\n\t\t\t * Whether the class is active is determined by the closest ancestor of `element` (where `element` itself is\n\t\t\t * closest ancestor) that has the given class or the negated version of it. If neither `element` nor any of its\n\t\t\t * ancestors have the given class or the negated version of it, then the default activation will be returned.\n\t\t\t *\n\t\t\t * In the paradoxical situation where the closest ancestor contains __both__ the given class and the negated\n\t\t\t * version of it, the class is considered active.\n\t\t\t *\n\t\t\t * @param {Element} element\n\t\t\t * @param {string} className\n\t\t\t * @param {boolean} [defaultActivation=false]\n\t\t\t * @returns {boolean}\n\t\t\t */\n\t\t\tisActive: function (element, className, defaultActivation) {\n\t\t\t\tvar no = 'no-' + className;\n\n\t\t\t\twhile (element) {\n\t\t\t\t\tvar classList = element.classList;\n\t\t\t\t\tif (classList.contains(className)) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tif (classList.contains(no)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telement = element.parentElement;\n\t\t\t\t}\n\t\t\t\treturn !!defaultActivation;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * This namespace contains all currently loaded languages and the some helper functions to create and modify languages.\n\t\t *\n\t\t * @namespace\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\tlanguages: {\n\t\t\t/**\n\t\t\t * The grammar for plain, unformatted text.\n\t\t\t */\n\t\t\tplain: plainTextGrammar,\n\t\t\tplaintext: plainTextGrammar,\n\t\t\ttext: plainTextGrammar,\n\t\t\ttxt: plainTextGrammar,\n\n\t\t\t/**\n\t\t\t * Creates a deep copy of the language with the given id and appends the given tokens.\n\t\t\t *\n\t\t\t * If a token in `redef` also appears in the copied language, then the existing token in the copied language\n\t\t\t * will be overwritten at its original position.\n\t\t\t *\n\t\t\t * ## Best practices\n\t\t\t *\n\t\t\t * Since the position of overwriting tokens (token in `redef` that overwrite tokens in the copied language)\n\t\t\t * doesn't matter, they can technically be in any order. However, this can be confusing to others that trying to\n\t\t\t * understand the language definition because, normally, the order of tokens matters in Prism grammars.\n\t\t\t *\n\t\t\t * Therefore, it is encouraged to order overwriting tokens according to the positions of the overwritten tokens.\n\t\t\t * Furthermore, all non-overwriting tokens should be placed after the overwriting ones.\n\t\t\t *\n\t\t\t * @param {string} id The id of the language to extend. This has to be a key in `Prism.languages`.\n\t\t\t * @param {Grammar} redef The new tokens to append.\n\t\t\t * @returns {Grammar} The new language created.\n\t\t\t * @public\n\t\t\t * @example\n\t\t\t * Prism.languages['css-with-colors'] = Prism.languages.extend('css', {\n\t\t\t *     // Prism.languages.css already has a 'comment' token, so this token will overwrite CSS' 'comment' token\n\t\t\t *     // at its original position\n\t\t\t *     'comment': { ... },\n\t\t\t *     // CSS doesn't have a 'color' token, so this token will be appended\n\t\t\t *     'color': /\\b(?:red|green|blue)\\b/\n\t\t\t * });\n\t\t\t */\n\t\t\textend: function (id, redef) {\n\t\t\t\tvar lang = _.util.clone(_.languages[id]);\n\n\t\t\t\tfor (var key in redef) {\n\t\t\t\t\tlang[key] = redef[key];\n\t\t\t\t}\n\n\t\t\t\treturn lang;\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Inserts tokens _before_ another token in a language definition or any other grammar.\n\t\t\t *\n\t\t\t * ## Usage\n\t\t\t *\n\t\t\t * This helper method makes it easy to modify existing languages. For example, the CSS language definition\n\t\t\t * not only defines CSS highlighting for CSS documents, but also needs to define highlighting for CSS embedded\n\t\t\t * in HTML through `<style>` elements. To do this, it needs to modify `Prism.languages.markup` and add the\n\t\t\t * appropriate tokens. However, `Prism.languages.markup` is a regular JavaScript object literal, so if you do\n\t\t\t * this:\n\t\t\t *\n\t\t\t * ```js\n\t\t\t * Prism.languages.markup.style = {\n\t\t\t *     // token\n\t\t\t * };\n\t\t\t * ```\n\t\t\t *\n\t\t\t * then the `style` token will be added (and processed) at the end. `insertBefore` allows you to insert tokens\n\t\t\t * before existing tokens. For the CSS example above, you would use it like this:\n\t\t\t *\n\t\t\t * ```js\n\t\t\t * Prism.languages.insertBefore('markup', 'cdata', {\n\t\t\t *     'style': {\n\t\t\t *         // token\n\t\t\t *     }\n\t\t\t * });\n\t\t\t * ```\n\t\t\t *\n\t\t\t * ## Special cases\n\t\t\t *\n\t\t\t * If the grammars of `inside` and `insert` have tokens with the same name, the tokens in `inside`'s grammar\n\t\t\t * will be ignored.\n\t\t\t *\n\t\t\t * This behavior can be used to insert tokens after `before`:\n\t\t\t *\n\t\t\t * ```js\n\t\t\t * Prism.languages.insertBefore('markup', 'comment', {\n\t\t\t *     'comment': Prism.languages.markup.comment,\n\t\t\t *     // tokens after 'comment'\n\t\t\t * });\n\t\t\t * ```\n\t\t\t *\n\t\t\t * ## Limitations\n\t\t\t *\n\t\t\t * The main problem `insertBefore` has to solve is iteration order. Since ES2015, the iteration order for object\n\t\t\t * properties is guaranteed to be the insertion order (except for integer keys) but some browsers behave\n\t\t\t * differently when keys are deleted and re-inserted. So `insertBefore` can't be implemented by temporarily\n\t\t\t * deleting properties which is necessary to insert at arbitrary positions.\n\t\t\t *\n\t\t\t * To solve this problem, `insertBefore` doesn't actually insert the given tokens into the target object.\n\t\t\t * Instead, it will create a new object and replace all references to the target object with the new one. This\n\t\t\t * can be done without temporarily deleting properties, so the iteration order is well-defined.\n\t\t\t *\n\t\t\t * However, only references that can be reached from `Prism.languages` or `insert` will be replaced. I.e. if\n\t\t\t * you hold the target object in a variable, then the value of the variable will not change.\n\t\t\t *\n\t\t\t * ```js\n\t\t\t * var oldMarkup = Prism.languages.markup;\n\t\t\t * var newMarkup = Prism.languages.insertBefore('markup', 'comment', { ... });\n\t\t\t *\n\t\t\t * assert(oldMarkup !== Prism.languages.markup);\n\t\t\t * assert(newMarkup === Prism.languages.markup);\n\t\t\t * ```\n\t\t\t *\n\t\t\t * @param {string} inside The property of `root` (e.g. a language id in `Prism.languages`) that contains the\n\t\t\t * object to be modified.\n\t\t\t * @param {string} before The key to insert before.\n\t\t\t * @param {Grammar} insert An object containing the key-value pairs to be inserted.\n\t\t\t * @param {Object<string, any>} [root] The object containing `inside`, i.e. the object that contains the\n\t\t\t * object to be modified.\n\t\t\t *\n\t\t\t * Defaults to `Prism.languages`.\n\t\t\t * @returns {Grammar} The new grammar object.\n\t\t\t * @public\n\t\t\t */\n\t\t\tinsertBefore: function (inside, before, insert, root) {\n\t\t\t\troot = root || /** @type {any} */ (_.languages);\n\t\t\t\tvar grammar = root[inside];\n\t\t\t\t/** @type {Grammar} */\n\t\t\t\tvar ret = {};\n\n\t\t\t\tfor (var token in grammar) {\n\t\t\t\t\tif (grammar.hasOwnProperty(token)) {\n\n\t\t\t\t\t\tif (token == before) {\n\t\t\t\t\t\t\tfor (var newToken in insert) {\n\t\t\t\t\t\t\t\tif (insert.hasOwnProperty(newToken)) {\n\t\t\t\t\t\t\t\t\tret[newToken] = insert[newToken];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Do not insert token which also occur in insert. See #1525\n\t\t\t\t\t\tif (!insert.hasOwnProperty(token)) {\n\t\t\t\t\t\t\tret[token] = grammar[token];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar old = root[inside];\n\t\t\t\troot[inside] = ret;\n\n\t\t\t\t// Update references in other language definitions\n\t\t\t\t_.languages.DFS(_.languages, function (key, value) {\n\t\t\t\t\tif (value === old && key != inside) {\n\t\t\t\t\t\tthis[key] = ret;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn ret;\n\t\t\t},\n\n\t\t\t// Traverse a language definition with Depth First Search\n\t\t\tDFS: function DFS(o, callback, type, visited) {\n\t\t\t\tvisited = visited || {};\n\n\t\t\t\tvar objId = _.util.objId;\n\n\t\t\t\tfor (var i in o) {\n\t\t\t\t\tif (o.hasOwnProperty(i)) {\n\t\t\t\t\t\tcallback.call(o, i, o[i], type || i);\n\n\t\t\t\t\t\tvar property = o[i];\n\t\t\t\t\t\tvar propertyType = _.util.type(property);\n\n\t\t\t\t\t\tif (propertyType === 'Object' && !visited[objId(property)]) {\n\t\t\t\t\t\t\tvisited[objId(property)] = true;\n\t\t\t\t\t\t\tDFS(property, callback, null, visited);\n\t\t\t\t\t\t} else if (propertyType === 'Array' && !visited[objId(property)]) {\n\t\t\t\t\t\t\tvisited[objId(property)] = true;\n\t\t\t\t\t\t\tDFS(property, callback, i, visited);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tplugins: {},\n\n\t\t/**\n\t\t * This is the most high-level function in Prism’s API.\n\t\t * It fetches all the elements that have a `.language-xxxx` class and then calls {@link Prism.highlightElement} on\n\t\t * each one of them.\n\t\t *\n\t\t * This is equivalent to `Prism.highlightAllUnder(document, async, callback)`.\n\t\t *\n\t\t * @param {boolean} [async=false] Same as in {@link Prism.highlightAllUnder}.\n\t\t * @param {HighlightCallback} [callback] Same as in {@link Prism.highlightAllUnder}.\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\thighlightAll: function (async, callback) {\n\t\t\t_.highlightAllUnder(document, async, callback);\n\t\t},\n\n\t\t/**\n\t\t * Fetches all the descendants of `container` that have a `.language-xxxx` class and then calls\n\t\t * {@link Prism.highlightElement} on each one of them.\n\t\t *\n\t\t * The following hooks will be run:\n\t\t * 1. `before-highlightall`\n\t\t * 2. `before-all-elements-highlight`\n\t\t * 3. All hooks of {@link Prism.highlightElement} for each element.\n\t\t *\n\t\t * @param {ParentNode} container The root element, whose descendants that have a `.language-xxxx` class will be highlighted.\n\t\t * @param {boolean} [async=false] Whether each element is to be highlighted asynchronously using Web Workers.\n\t\t * @param {HighlightCallback} [callback] An optional callback to be invoked on each element after its highlighting is done.\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\thighlightAllUnder: function (container, async, callback) {\n\t\t\tvar env = {\n\t\t\t\tcallback: callback,\n\t\t\t\tcontainer: container,\n\t\t\t\tselector: 'code[class*=\"language-\"], [class*=\"language-\"] code, code[class*=\"lang-\"], [class*=\"lang-\"] code'\n\t\t\t};\n\n\t\t\t_.hooks.run('before-highlightall', env);\n\n\t\t\tenv.elements = Array.prototype.slice.apply(env.container.querySelectorAll(env.selector));\n\n\t\t\t_.hooks.run('before-all-elements-highlight', env);\n\n\t\t\tfor (var i = 0, element; (element = env.elements[i++]);) {\n\t\t\t\t_.highlightElement(element, async === true, env.callback);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Highlights the code inside a single element.\n\t\t *\n\t\t * The following hooks will be run:\n\t\t * 1. `before-sanity-check`\n\t\t * 2. `before-highlight`\n\t\t * 3. All hooks of {@link Prism.highlight}. These hooks will be run by an asynchronous worker if `async` is `true`.\n\t\t * 4. `before-insert`\n\t\t * 5. `after-highlight`\n\t\t * 6. `complete`\n\t\t *\n\t\t * Some the above hooks will be skipped if the element doesn't contain any text or there is no grammar loaded for\n\t\t * the element's language.\n\t\t *\n\t\t * @param {Element} element The element containing the code.\n\t\t * It must have a class of `language-xxxx` to be processed, where `xxxx` is a valid language identifier.\n\t\t * @param {boolean} [async=false] Whether the element is to be highlighted asynchronously using Web Workers\n\t\t * to improve performance and avoid blocking the UI when highlighting very large chunks of code. This option is\n\t\t * [disabled by default](https://prismjs.com/faq.html#why-is-asynchronous-highlighting-disabled-by-default).\n\t\t *\n\t\t * Note: All language definitions required to highlight the code must be included in the main `prism.js` file for\n\t\t * asynchronous highlighting to work. You can build your own bundle on the\n\t\t * [Download page](https://prismjs.com/download.html).\n\t\t * @param {HighlightCallback} [callback] An optional callback to be invoked after the highlighting is done.\n\t\t * Mostly useful when `async` is `true`, since in that case, the highlighting is done asynchronously.\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\thighlightElement: function (element, async, callback) {\n\t\t\t// Find language\n\t\t\tvar language = _.util.getLanguage(element);\n\t\t\tvar grammar = _.languages[language];\n\n\t\t\t// Set language on the element, if not present\n\t\t\t_.util.setLanguage(element, language);\n\n\t\t\t// Set language on the parent, for styling\n\t\t\tvar parent = element.parentElement;\n\t\t\tif (parent && parent.nodeName.toLowerCase() === 'pre') {\n\t\t\t\t_.util.setLanguage(parent, language);\n\t\t\t}\n\n\t\t\tvar code = element.textContent;\n\n\t\t\tvar env = {\n\t\t\t\telement: element,\n\t\t\t\tlanguage: language,\n\t\t\t\tgrammar: grammar,\n\t\t\t\tcode: code\n\t\t\t};\n\n\t\t\tfunction insertHighlightedCode(highlightedCode) {\n\t\t\t\tenv.highlightedCode = highlightedCode;\n\n\t\t\t\t_.hooks.run('before-insert', env);\n\n\t\t\t\tenv.element.innerHTML = env.highlightedCode;\n\n\t\t\t\t_.hooks.run('after-highlight', env);\n\t\t\t\t_.hooks.run('complete', env);\n\t\t\t\tcallback && callback.call(env.element);\n\t\t\t}\n\n\t\t\t_.hooks.run('before-sanity-check', env);\n\n\t\t\t// plugins may change/add the parent/element\n\t\t\tparent = env.element.parentElement;\n\t\t\tif (parent && parent.nodeName.toLowerCase() === 'pre' && !parent.hasAttribute('tabindex')) {\n\t\t\t\tparent.setAttribute('tabindex', '0');\n\t\t\t}\n\n\t\t\tif (!env.code) {\n\t\t\t\t_.hooks.run('complete', env);\n\t\t\t\tcallback && callback.call(env.element);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_.hooks.run('before-highlight', env);\n\n\t\t\tif (!env.grammar) {\n\t\t\t\tinsertHighlightedCode(_.util.encode(env.code));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (async && _self.Worker) {\n\t\t\t\tvar worker = new Worker(_.filename);\n\n\t\t\t\tworker.onmessage = function (evt) {\n\t\t\t\t\tinsertHighlightedCode(evt.data);\n\t\t\t\t};\n\n\t\t\t\tworker.postMessage(JSON.stringify({\n\t\t\t\t\tlanguage: env.language,\n\t\t\t\t\tcode: env.code,\n\t\t\t\t\timmediateClose: true\n\t\t\t\t}));\n\t\t\t} else {\n\t\t\t\tinsertHighlightedCode(_.highlight(env.code, env.grammar, env.language));\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Low-level function, only use if you know what you’re doing. It accepts a string of text as input\n\t\t * and the language definitions to use, and returns a string with the HTML produced.\n\t\t *\n\t\t * The following hooks will be run:\n\t\t * 1. `before-tokenize`\n\t\t * 2. `after-tokenize`\n\t\t * 3. `wrap`: On each {@link Token}.\n\t\t *\n\t\t * @param {string} text A string with the code to be highlighted.\n\t\t * @param {Grammar} grammar An object containing the tokens to use.\n\t\t *\n\t\t * Usually a language definition like `Prism.languages.markup`.\n\t\t * @param {string} language The name of the language definition passed to `grammar`.\n\t\t * @returns {string} The highlighted HTML.\n\t\t * @memberof Prism\n\t\t * @public\n\t\t * @example\n\t\t * Prism.highlight('var foo = true;', Prism.languages.javascript, 'javascript');\n\t\t */\n\t\thighlight: function (text, grammar, language) {\n\t\t\tvar env = {\n\t\t\t\tcode: text,\n\t\t\t\tgrammar: grammar,\n\t\t\t\tlanguage: language\n\t\t\t};\n\t\t\t_.hooks.run('before-tokenize', env);\n\t\t\tif (!env.grammar) {\n\t\t\t\tthrow new Error('The language \"' + env.language + '\" has no grammar.');\n\t\t\t}\n\t\t\tenv.tokens = _.tokenize(env.code, env.grammar);\n\t\t\t_.hooks.run('after-tokenize', env);\n\t\t\treturn Token.stringify(_.util.encode(env.tokens), env.language);\n\t\t},\n\n\t\t/**\n\t\t * This is the heart of Prism, and the most low-level function you can use. It accepts a string of text as input\n\t\t * and the language definitions to use, and returns an array with the tokenized code.\n\t\t *\n\t\t * When the language definition includes nested tokens, the function is called recursively on each of these tokens.\n\t\t *\n\t\t * This method could be useful in other contexts as well, as a very crude parser.\n\t\t *\n\t\t * @param {string} text A string with the code to be highlighted.\n\t\t * @param {Grammar} grammar An object containing the tokens to use.\n\t\t *\n\t\t * Usually a language definition like `Prism.languages.markup`.\n\t\t * @returns {TokenStream} An array of strings and tokens, a token stream.\n\t\t * @memberof Prism\n\t\t * @public\n\t\t * @example\n\t\t * let code = `var foo = 0;`;\n\t\t * let tokens = Prism.tokenize(code, Prism.languages.javascript);\n\t\t * tokens.forEach(token => {\n\t\t *     if (token instanceof Prism.Token && token.type === 'number') {\n\t\t *         console.log(`Found numeric literal: ${token.content}`);\n\t\t *     }\n\t\t * });\n\t\t */\n\t\ttokenize: function (text, grammar) {\n\t\t\tvar rest = grammar.rest;\n\t\t\tif (rest) {\n\t\t\t\tfor (var token in rest) {\n\t\t\t\t\tgrammar[token] = rest[token];\n\t\t\t\t}\n\n\t\t\t\tdelete grammar.rest;\n\t\t\t}\n\n\t\t\tvar tokenList = new LinkedList();\n\t\t\taddAfter(tokenList, tokenList.head, text);\n\n\t\t\tmatchGrammar(text, tokenList, grammar, tokenList.head, 0);\n\n\t\t\treturn toArray(tokenList);\n\t\t},\n\n\t\t/**\n\t\t * @namespace\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\thooks: {\n\t\t\tall: {},\n\n\t\t\t/**\n\t\t\t * Adds the given callback to the list of callbacks for the given hook.\n\t\t\t *\n\t\t\t * The callback will be invoked when the hook it is registered for is run.\n\t\t\t * Hooks are usually directly run by a highlight function but you can also run hooks yourself.\n\t\t\t *\n\t\t\t * One callback function can be registered to multiple hooks and the same hook multiple times.\n\t\t\t *\n\t\t\t * @param {string} name The name of the hook.\n\t\t\t * @param {HookCallback} callback The callback function which is given environment variables.\n\t\t\t * @public\n\t\t\t */\n\t\t\tadd: function (name, callback) {\n\t\t\t\tvar hooks = _.hooks.all;\n\n\t\t\t\thooks[name] = hooks[name] || [];\n\n\t\t\t\thooks[name].push(callback);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Runs a hook invoking all registered callbacks with the given environment variables.\n\t\t\t *\n\t\t\t * Callbacks will be invoked synchronously and in the order in which they were registered.\n\t\t\t *\n\t\t\t * @param {string} name The name of the hook.\n\t\t\t * @param {Object<string, any>} env The environment variables of the hook passed to all callbacks registered.\n\t\t\t * @public\n\t\t\t */\n\t\t\trun: function (name, env) {\n\t\t\t\tvar callbacks = _.hooks.all[name];\n\n\t\t\t\tif (!callbacks || !callbacks.length) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tfor (var i = 0, callback; (callback = callbacks[i++]);) {\n\t\t\t\t\tcallback(env);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tToken: Token\n\t};\n\t_self.Prism = _;\n\n\n\t// Typescript note:\n\t// The following can be used to import the Token type in JSDoc:\n\t//\n\t//   @typedef {InstanceType<import(\"./prism-core\")[\"Token\"]>} Token\n\n\t/**\n\t * Creates a new token.\n\t *\n\t * @param {string} type See {@link Token#type type}\n\t * @param {string | TokenStream} content See {@link Token#content content}\n\t * @param {string|string[]} [alias] The alias(es) of the token.\n\t * @param {string} [matchedStr=\"\"] A copy of the full string this token was created from.\n\t * @class\n\t * @global\n\t * @public\n\t */\n\tfunction Token(type, content, alias, matchedStr) {\n\t\t/**\n\t\t * The type of the token.\n\t\t *\n\t\t * This is usually the key of a pattern in a {@link Grammar}.\n\t\t *\n\t\t * @type {string}\n\t\t * @see GrammarToken\n\t\t * @public\n\t\t */\n\t\tthis.type = type;\n\t\t/**\n\t\t * The strings or tokens contained by this token.\n\t\t *\n\t\t * This will be a token stream if the pattern matched also defined an `inside` grammar.\n\t\t *\n\t\t * @type {string | TokenStream}\n\t\t * @public\n\t\t */\n\t\tthis.content = content;\n\t\t/**\n\t\t * The alias(es) of the token.\n\t\t *\n\t\t * @type {string|string[]}\n\t\t * @see GrammarToken\n\t\t * @public\n\t\t */\n\t\tthis.alias = alias;\n\t\t// Copy of the full string this token was created from\n\t\tthis.length = (matchedStr || '').length | 0;\n\t}\n\n\t/**\n\t * A token stream is an array of strings and {@link Token Token} objects.\n\t *\n\t * Token streams have to fulfill a few properties that are assumed by most functions (mostly internal ones) that process\n\t * them.\n\t *\n\t * 1. No adjacent strings.\n\t * 2. No empty strings.\n\t *\n\t *    The only exception here is the token stream that only contains the empty string and nothing else.\n\t *\n\t * @typedef {Array<string | Token>} TokenStream\n\t * @global\n\t * @public\n\t */\n\n\t/**\n\t * Converts the given token or token stream to an HTML representation.\n\t *\n\t * The following hooks will be run:\n\t * 1. `wrap`: On each {@link Token}.\n\t *\n\t * @param {string | Token | TokenStream} o The token or token stream to be converted.\n\t * @param {string} language The name of current language.\n\t * @returns {string} The HTML representation of the token or token stream.\n\t * @memberof Token\n\t * @static\n\t */\n\tToken.stringify = function stringify(o, language) {\n\t\tif (typeof o == 'string') {\n\t\t\treturn o;\n\t\t}\n\t\tif (Array.isArray(o)) {\n\t\t\tvar s = '';\n\t\t\to.forEach(function (e) {\n\t\t\t\ts += stringify(e, language);\n\t\t\t});\n\t\t\treturn s;\n\t\t}\n\n\t\tvar env = {\n\t\t\ttype: o.type,\n\t\t\tcontent: stringify(o.content, language),\n\t\t\ttag: 'span',\n\t\t\tclasses: ['token', o.type],\n\t\t\tattributes: {},\n\t\t\tlanguage: language\n\t\t};\n\n\t\tvar aliases = o.alias;\n\t\tif (aliases) {\n\t\t\tif (Array.isArray(aliases)) {\n\t\t\t\tArray.prototype.push.apply(env.classes, aliases);\n\t\t\t} else {\n\t\t\t\tenv.classes.push(aliases);\n\t\t\t}\n\t\t}\n\n\t\t_.hooks.run('wrap', env);\n\n\t\tvar attributes = '';\n\t\tfor (var name in env.attributes) {\n\t\t\tattributes += ' ' + name + '=\"' + (env.attributes[name] || '').replace(/\"/g, '&quot;') + '\"';\n\t\t}\n\n\t\treturn '<' + env.tag + ' class=\"' + env.classes.join(' ') + '\"' + attributes + '>' + env.content + '</' + env.tag + '>';\n\t};\n\n\t/**\n\t * @param {RegExp} pattern\n\t * @param {number} pos\n\t * @param {string} text\n\t * @param {boolean} lookbehind\n\t * @returns {RegExpExecArray | null}\n\t */\n\tfunction matchPattern(pattern, pos, text, lookbehind) {\n\t\tpattern.lastIndex = pos;\n\t\tvar match = pattern.exec(text);\n\t\tif (match && lookbehind && match[1]) {\n\t\t\t// change the match to remove the text matched by the Prism lookbehind group\n\t\t\tvar lookbehindLength = match[1].length;\n\t\t\tmatch.index += lookbehindLength;\n\t\t\tmatch[0] = match[0].slice(lookbehindLength);\n\t\t}\n\t\treturn match;\n\t}\n\n\t/**\n\t * @param {string} text\n\t * @param {LinkedList<string | Token>} tokenList\n\t * @param {any} grammar\n\t * @param {LinkedListNode<string | Token>} startNode\n\t * @param {number} startPos\n\t * @param {RematchOptions} [rematch]\n\t * @returns {void}\n\t * @private\n\t *\n\t * @typedef RematchOptions\n\t * @property {string} cause\n\t * @property {number} reach\n\t */\n\tfunction matchGrammar(text, tokenList, grammar, startNode, startPos, rematch) {\n\t\tfor (var token in grammar) {\n\t\t\tif (!grammar.hasOwnProperty(token) || !grammar[token]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar patterns = grammar[token];\n\t\t\tpatterns = Array.isArray(patterns) ? patterns : [patterns];\n\n\t\t\tfor (var j = 0; j < patterns.length; ++j) {\n\t\t\t\tif (rematch && rematch.cause == token + ',' + j) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar patternObj = patterns[j];\n\t\t\t\tvar inside = patternObj.inside;\n\t\t\t\tvar lookbehind = !!patternObj.lookbehind;\n\t\t\t\tvar greedy = !!patternObj.greedy;\n\t\t\t\tvar alias = patternObj.alias;\n\n\t\t\t\tif (greedy && !patternObj.pattern.global) {\n\t\t\t\t\t// Without the global flag, lastIndex won't work\n\t\t\t\t\tvar flags = patternObj.pattern.toString().match(/[imsuy]*$/)[0];\n\t\t\t\t\tpatternObj.pattern = RegExp(patternObj.pattern.source, flags + 'g');\n\t\t\t\t}\n\n\t\t\t\t/** @type {RegExp} */\n\t\t\t\tvar pattern = patternObj.pattern || patternObj;\n\n\t\t\t\tfor ( // iterate the token list and keep track of the current token/string position\n\t\t\t\t\tvar currentNode = startNode.next, pos = startPos;\n\t\t\t\t\tcurrentNode !== tokenList.tail;\n\t\t\t\t\tpos += currentNode.value.length, currentNode = currentNode.next\n\t\t\t\t) {\n\n\t\t\t\t\tif (rematch && pos >= rematch.reach) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar str = currentNode.value;\n\n\t\t\t\t\tif (tokenList.length > text.length) {\n\t\t\t\t\t\t// Something went terribly wrong, ABORT, ABORT!\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (str instanceof Token) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar removeCount = 1; // this is the to parameter of removeBetween\n\t\t\t\t\tvar match;\n\n\t\t\t\t\tif (greedy) {\n\t\t\t\t\t\tmatch = matchPattern(pattern, pos, text, lookbehind);\n\t\t\t\t\t\tif (!match || match.index >= text.length) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar from = match.index;\n\t\t\t\t\t\tvar to = match.index + match[0].length;\n\t\t\t\t\t\tvar p = pos;\n\n\t\t\t\t\t\t// find the node that contains the match\n\t\t\t\t\t\tp += currentNode.value.length;\n\t\t\t\t\t\twhile (from >= p) {\n\t\t\t\t\t\t\tcurrentNode = currentNode.next;\n\t\t\t\t\t\t\tp += currentNode.value.length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// adjust pos (and p)\n\t\t\t\t\t\tp -= currentNode.value.length;\n\t\t\t\t\t\tpos = p;\n\n\t\t\t\t\t\t// the current node is a Token, then the match starts inside another Token, which is invalid\n\t\t\t\t\t\tif (currentNode.value instanceof Token) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// find the last node which is affected by this match\n\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\tvar k = currentNode;\n\t\t\t\t\t\t\tk !== tokenList.tail && (p < to || typeof k.value === 'string');\n\t\t\t\t\t\t\tk = k.next\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tremoveCount++;\n\t\t\t\t\t\t\tp += k.value.length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tremoveCount--;\n\n\t\t\t\t\t\t// replace with the new match\n\t\t\t\t\t\tstr = text.slice(pos, p);\n\t\t\t\t\t\tmatch.index -= pos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmatch = matchPattern(pattern, 0, str, lookbehind);\n\t\t\t\t\t\tif (!match) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// eslint-disable-next-line no-redeclare\n\t\t\t\t\tvar from = match.index;\n\t\t\t\t\tvar matchStr = match[0];\n\t\t\t\t\tvar before = str.slice(0, from);\n\t\t\t\t\tvar after = str.slice(from + matchStr.length);\n\n\t\t\t\t\tvar reach = pos + str.length;\n\t\t\t\t\tif (rematch && reach > rematch.reach) {\n\t\t\t\t\t\trematch.reach = reach;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar removeFrom = currentNode.prev;\n\n\t\t\t\t\tif (before) {\n\t\t\t\t\t\tremoveFrom = addAfter(tokenList, removeFrom, before);\n\t\t\t\t\t\tpos += before.length;\n\t\t\t\t\t}\n\n\t\t\t\t\tremoveRange(tokenList, removeFrom, removeCount);\n\n\t\t\t\t\tvar wrapped = new Token(token, inside ? _.tokenize(matchStr, inside) : matchStr, alias, matchStr);\n\t\t\t\t\tcurrentNode = addAfter(tokenList, removeFrom, wrapped);\n\n\t\t\t\t\tif (after) {\n\t\t\t\t\t\taddAfter(tokenList, currentNode, after);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (removeCount > 1) {\n\t\t\t\t\t\t// at least one Token object was removed, so we have to do some rematching\n\t\t\t\t\t\t// this can only happen if the current pattern is greedy\n\n\t\t\t\t\t\t/** @type {RematchOptions} */\n\t\t\t\t\t\tvar nestedRematch = {\n\t\t\t\t\t\t\tcause: token + ',' + j,\n\t\t\t\t\t\t\treach: reach\n\t\t\t\t\t\t};\n\t\t\t\t\t\tmatchGrammar(text, tokenList, grammar, currentNode.prev, pos, nestedRematch);\n\n\t\t\t\t\t\t// the reach might have been extended because of the rematching\n\t\t\t\t\t\tif (rematch && nestedRematch.reach > rematch.reach) {\n\t\t\t\t\t\t\trematch.reach = nestedRematch.reach;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @typedef LinkedListNode\n\t * @property {T} value\n\t * @property {LinkedListNode<T> | null} prev The previous node.\n\t * @property {LinkedListNode<T> | null} next The next node.\n\t * @template T\n\t * @private\n\t */\n\n\t/**\n\t * @template T\n\t * @private\n\t */\n\tfunction LinkedList() {\n\t\t/** @type {LinkedListNode<T>} */\n\t\tvar head = { value: null, prev: null, next: null };\n\t\t/** @type {LinkedListNode<T>} */\n\t\tvar tail = { value: null, prev: head, next: null };\n\t\thead.next = tail;\n\n\t\t/** @type {LinkedListNode<T>} */\n\t\tthis.head = head;\n\t\t/** @type {LinkedListNode<T>} */\n\t\tthis.tail = tail;\n\t\tthis.length = 0;\n\t}\n\n\t/**\n\t * Adds a new node with the given value to the list.\n\t *\n\t * @param {LinkedList<T>} list\n\t * @param {LinkedListNode<T>} node\n\t * @param {T} value\n\t * @returns {LinkedListNode<T>} The added node.\n\t * @template T\n\t */\n\tfunction addAfter(list, node, value) {\n\t\t// assumes that node != list.tail && values.length >= 0\n\t\tvar next = node.next;\n\n\t\tvar newNode = { value: value, prev: node, next: next };\n\t\tnode.next = newNode;\n\t\tnext.prev = newNode;\n\t\tlist.length++;\n\n\t\treturn newNode;\n\t}\n\t/**\n\t * Removes `count` nodes after the given node. The given node will not be removed.\n\t *\n\t * @param {LinkedList<T>} list\n\t * @param {LinkedListNode<T>} node\n\t * @param {number} count\n\t * @template T\n\t */\n\tfunction removeRange(list, node, count) {\n\t\tvar next = node.next;\n\t\tfor (var i = 0; i < count && next !== list.tail; i++) {\n\t\t\tnext = next.next;\n\t\t}\n\t\tnode.next = next;\n\t\tnext.prev = node;\n\t\tlist.length -= i;\n\t}\n\t/**\n\t * @param {LinkedList<T>} list\n\t * @returns {T[]}\n\t * @template T\n\t */\n\tfunction toArray(list) {\n\t\tvar array = [];\n\t\tvar node = list.head.next;\n\t\twhile (node !== list.tail) {\n\t\t\tarray.push(node.value);\n\t\t\tnode = node.next;\n\t\t}\n\t\treturn array;\n\t}\n\n\n\tif (!_self.document) {\n\t\tif (!_self.addEventListener) {\n\t\t\t// in Node.js\n\t\t\treturn _;\n\t\t}\n\n\t\tif (!_.disableWorkerMessageHandler) {\n\t\t\t// In worker\n\t\t\t_self.addEventListener('message', function (evt) {\n\t\t\t\tvar message = JSON.parse(evt.data);\n\t\t\t\tvar lang = message.language;\n\t\t\t\tvar code = message.code;\n\t\t\t\tvar immediateClose = message.immediateClose;\n\n\t\t\t\t_self.postMessage(_.highlight(code, _.languages[lang], lang));\n\t\t\t\tif (immediateClose) {\n\t\t\t\t\t_self.close();\n\t\t\t\t}\n\t\t\t}, false);\n\t\t}\n\n\t\treturn _;\n\t}\n\n\t// Get current script and highlight\n\tvar script = _.util.currentScript();\n\n\tif (script) {\n\t\t_.filename = script.src;\n\n\t\tif (script.hasAttribute('data-manual')) {\n\t\t\t_.manual = true;\n\t\t}\n\t}\n\n\tfunction highlightAutomaticallyCallback() {\n\t\tif (!_.manual) {\n\t\t\t_.highlightAll();\n\t\t}\n\t}\n\n\tif (!_.manual) {\n\t\t// If the document state is \"loading\", then we'll use DOMContentLoaded.\n\t\t// If the document state is \"interactive\" and the prism.js script is deferred, then we'll also use the\n\t\t// DOMContentLoaded event because there might be some plugins or languages which have also been deferred and they\n\t\t// might take longer one animation frame to execute which can create a race condition where only some plugins have\n\t\t// been loaded when Prism.highlightAll() is executed, depending on how fast resources are loaded.\n\t\t// See https://github.com/PrismJS/prism/issues/2102\n\t\tvar readyState = document.readyState;\n\t\tif (readyState === 'loading' || readyState === 'interactive' && script && script.defer) {\n\t\t\tdocument.addEventListener('DOMContentLoaded', highlightAutomaticallyCallback);\n\t\t} else {\n\t\t\tif (window.requestAnimationFrame) {\n\t\t\t\twindow.requestAnimationFrame(highlightAutomaticallyCallback);\n\t\t\t} else {\n\t\t\t\twindow.setTimeout(highlightAutomaticallyCallback, 16);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn _;\n\n}(_self));\n\nif (typeof module !== 'undefined' && module.exports) {\n\tmodule.exports = Prism;\n}\n\n// hack for components to work correctly in node.js\nif (typeof global !== 'undefined') {\n\tglobal.Prism = Prism;\n}\n\n// some additional documentation/types\n\n/**\n * The expansion of a simple `RegExp` literal to support additional properties.\n *\n * @typedef GrammarToken\n * @property {RegExp} pattern The regular expression of the token.\n * @property {boolean} [lookbehind=false] If `true`, then the first capturing group of `pattern` will (effectively)\n * behave as a lookbehind group meaning that the captured text will not be part of the matched text of the new token.\n * @property {boolean} [greedy=false] Whether the token is greedy.\n * @property {string|string[]} [alias] An optional alias or list of aliases.\n * @property {Grammar} [inside] The nested grammar of this token.\n *\n * The `inside` grammar will be used to tokenize the text value of each token of this kind.\n *\n * This can be used to make nested and even recursive language definitions.\n *\n * Note: This can cause infinite recursion. Be careful when you embed different languages or even the same language into\n * each another.\n * @global\n * @public\n */\n\n/**\n * @typedef Grammar\n * @type {Object<string, RegExp | GrammarToken | Array<RegExp | GrammarToken>>}\n * @property {Grammar} [rest] An optional grammar object that will be appended to this grammar.\n * @global\n * @public\n */\n\n/**\n * A function which will invoked after an element was successfully highlighted.\n *\n * @callback HighlightCallback\n * @param {Element} element The element successfully highlighted.\n * @returns {void}\n * @global\n * @public\n */\n\n/**\n * @callback HookCallback\n * @param {Object<string, any>} env The environment variables of the hook.\n * @returns {void}\n * @global\n * @public\n */\n\n\n/* **********************************************\n     Begin prism-markup.js\n********************************************** */\n\nPrism.languages.markup = {\n\t'comment': {\n\t\tpattern: /<!--(?:(?!<!--)[\\s\\S])*?-->/,\n\t\tgreedy: true\n\t},\n\t'prolog': {\n\t\tpattern: /<\\?[\\s\\S]+?\\?>/,\n\t\tgreedy: true\n\t},\n\t'doctype': {\n\t\t// https://www.w3.org/TR/xml/#NT-doctypedecl\n\t\tpattern: /<!DOCTYPE(?:[^>\"'[\\]]|\"[^\"]*\"|'[^']*')+(?:\\[(?:[^<\"'\\]]|\"[^\"]*\"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\\]\\s*)?>/i,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'internal-subset': {\n\t\t\t\tpattern: /(^[^\\[]*\\[)[\\s\\S]+(?=\\]>$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: null // see below\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /\"[^\"]*\"|'[^']*'/,\n\t\t\t\tgreedy: true\n\t\t\t},\n\t\t\t'punctuation': /^<!|>$|[[\\]]/,\n\t\t\t'doctype-tag': /^DOCTYPE/i,\n\t\t\t'name': /[^\\s<>'\"]+/\n\t\t}\n\t},\n\t'cdata': {\n\t\tpattern: /<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/i,\n\t\tgreedy: true\n\t},\n\t'tag': {\n\t\tpattern: /<\\/?(?!\\d)[^\\s>\\/=$<%]+(?:\\s(?:\\s*[^\\s>\\/=]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))|(?=[\\s/>])))+)?\\s*\\/?>/,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'tag': {\n\t\t\t\tpattern: /^<\\/?[^\\s>\\/]+/,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^<\\/?/,\n\t\t\t\t\t'namespace': /^[^\\s>\\/:]+:/\n\t\t\t\t}\n\t\t\t},\n\t\t\t'special-attr': [],\n\t\t\t'attr-value': {\n\t\t\t\tpattern: /=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+)/,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /^=/,\n\t\t\t\t\t\t\talias: 'attr-equals'\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /^(\\s*)[\"']|[\"']$/,\n\t\t\t\t\t\t\tlookbehind: true\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t},\n\t\t\t'punctuation': /\\/?>/,\n\t\t\t'attr-name': {\n\t\t\t\tpattern: /[^\\s>\\/]+/,\n\t\t\t\tinside: {\n\t\t\t\t\t'namespace': /^[^\\s>\\/:]+:/\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t},\n\t'entity': [\n\t\t{\n\t\t\tpattern: /&[\\da-z]{1,8};/i,\n\t\t\talias: 'named-entity'\n\t\t},\n\t\t/&#x?[\\da-f]{1,8};/i\n\t]\n};\n\nPrism.languages.markup['tag'].inside['attr-value'].inside['entity'] =\n\tPrism.languages.markup['entity'];\nPrism.languages.markup['doctype'].inside['internal-subset'].inside = Prism.languages.markup;\n\n// Plugin to make entity title show the real entity, idea by Roman Komarov\nPrism.hooks.add('wrap', function (env) {\n\n\tif (env.type === 'entity') {\n\t\tenv.attributes['title'] = env.content.replace(/&amp;/, '&');\n\t}\n});\n\nObject.defineProperty(Prism.languages.markup.tag, 'addInlined', {\n\t/**\n\t * Adds an inlined language to markup.\n\t *\n\t * An example of an inlined language is CSS with `<style>` tags.\n\t *\n\t * @param {string} tagName The name of the tag that contains the inlined language. This name will be treated as\n\t * case insensitive.\n\t * @param {string} lang The language key.\n\t * @example\n\t * addInlined('style', 'css');\n\t */\n\tvalue: function addInlined(tagName, lang) {\n\t\tvar includedCdataInside = {};\n\t\tincludedCdataInside['language-' + lang] = {\n\t\t\tpattern: /(^<!\\[CDATA\\[)[\\s\\S]+?(?=\\]\\]>$)/i,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages[lang]\n\t\t};\n\t\tincludedCdataInside['cdata'] = /^<!\\[CDATA\\[|\\]\\]>$/i;\n\n\t\tvar inside = {\n\t\t\t'included-cdata': {\n\t\t\t\tpattern: /<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/i,\n\t\t\t\tinside: includedCdataInside\n\t\t\t}\n\t\t};\n\t\tinside['language-' + lang] = {\n\t\t\tpattern: /[\\s\\S]+/,\n\t\t\tinside: Prism.languages[lang]\n\t\t};\n\n\t\tvar def = {};\n\t\tdef[tagName] = {\n\t\t\tpattern: RegExp(/(<__[^>]*>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[\\s\\S])*?(?=<\\/__>)/.source.replace(/__/g, function () { return tagName; }), 'i'),\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\tinside: inside\n\t\t};\n\n\t\tPrism.languages.insertBefore('markup', 'cdata', def);\n\t}\n});\nObject.defineProperty(Prism.languages.markup.tag, 'addAttribute', {\n\t/**\n\t * Adds an pattern to highlight languages embedded in HTML attributes.\n\t *\n\t * An example of an inlined language is CSS with `style` attributes.\n\t *\n\t * @param {string} attrName The name of the tag that contains the inlined language. This name will be treated as\n\t * case insensitive.\n\t * @param {string} lang The language key.\n\t * @example\n\t * addAttribute('style', 'css');\n\t */\n\tvalue: function (attrName, lang) {\n\t\tPrism.languages.markup.tag.inside['special-attr'].push({\n\t\t\tpattern: RegExp(\n\t\t\t\t/(^|[\"'\\s])/.source + '(?:' + attrName + ')' + /\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))/.source,\n\t\t\t\t'i'\n\t\t\t),\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'attr-name': /^[^\\s=]+/,\n\t\t\t\t'attr-value': {\n\t\t\t\t\tpattern: /=[\\s\\S]+/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'value': {\n\t\t\t\t\t\t\tpattern: /(^=\\s*([\"']|(?![\"'])))\\S[\\s\\S]*(?=\\2$)/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: [lang, 'language-' + lang],\n\t\t\t\t\t\t\tinside: Prism.languages[lang]\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'punctuation': [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpattern: /^=/,\n\t\t\t\t\t\t\t\talias: 'attr-equals'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t/\"|'/\n\t\t\t\t\t\t]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n});\n\nPrism.languages.html = Prism.languages.markup;\nPrism.languages.mathml = Prism.languages.markup;\nPrism.languages.svg = Prism.languages.markup;\n\nPrism.languages.xml = Prism.languages.extend('markup', {});\nPrism.languages.ssml = Prism.languages.xml;\nPrism.languages.atom = Prism.languages.xml;\nPrism.languages.rss = Prism.languages.xml;\n\n\n/* **********************************************\n     Begin prism-css.js\n********************************************** */\n\n(function (Prism) {\n\n\tvar string = /(?:\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"|'(?:\\\\(?:\\r\\n|[\\s\\S])|[^'\\\\\\r\\n])*')/;\n\n\tPrism.languages.css = {\n\t\t'comment': /\\/\\*[\\s\\S]*?\\*\\//,\n\t\t'atrule': {\n\t\t\tpattern: RegExp('@[\\\\w-](?:' + /[^;{\\s\"']|\\s+(?!\\s)/.source + '|' + string.source + ')*?' + /(?:;|(?=\\s*\\{))/.source),\n\t\t\tinside: {\n\t\t\t\t'rule': /^@[\\w-]+/,\n\t\t\t\t'selector-function-argument': {\n\t\t\t\t\tpattern: /(\\bselector\\s*\\(\\s*(?![\\s)]))(?:[^()\\s]|\\s+(?![\\s)])|\\((?:[^()]|\\([^()]*\\))*\\))+(?=\\s*\\))/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'selector'\n\t\t\t\t},\n\t\t\t\t'keyword': {\n\t\t\t\t\tpattern: /(^|[^\\w-])(?:and|not|only|or)(?![\\w-])/,\n\t\t\t\t\tlookbehind: true\n\t\t\t\t}\n\t\t\t\t// See rest below\n\t\t\t}\n\t\t},\n\t\t'url': {\n\t\t\t// https://drafts.csswg.org/css-values-3/#urls\n\t\t\tpattern: RegExp('\\\\burl\\\\((?:' + string.source + '|' + /(?:[^\\\\\\r\\n()\"']|\\\\[\\s\\S])*/.source + ')\\\\)', 'i'),\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'function': /^url/i,\n\t\t\t\t'punctuation': /^\\(|\\)$/,\n\t\t\t\t'string': {\n\t\t\t\t\tpattern: RegExp('^' + string.source + '$'),\n\t\t\t\t\talias: 'url'\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t'selector': {\n\t\t\tpattern: RegExp('(^|[{}\\\\s])[^{}\\\\s](?:[^{};\"\\'\\\\s]|\\\\s+(?![\\\\s{])|' + string.source + ')*(?=\\\\s*\\\\{)'),\n\t\t\tlookbehind: true\n\t\t},\n\t\t'string': {\n\t\t\tpattern: string,\n\t\t\tgreedy: true\n\t\t},\n\t\t'property': {\n\t\t\tpattern: /(^|[^-\\w\\xA0-\\uFFFF])(?!\\s)[-_a-z\\xA0-\\uFFFF](?:(?!\\s)[-\\w\\xA0-\\uFFFF])*(?=\\s*:)/i,\n\t\t\tlookbehind: true\n\t\t},\n\t\t'important': /!important\\b/i,\n\t\t'function': {\n\t\t\tpattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\\()/i,\n\t\t\tlookbehind: true\n\t\t},\n\t\t'punctuation': /[(){};:,]/\n\t};\n\n\tPrism.languages.css['atrule'].inside.rest = Prism.languages.css;\n\n\tvar markup = Prism.languages.markup;\n\tif (markup) {\n\t\tmarkup.tag.addInlined('style', 'css');\n\t\tmarkup.tag.addAttribute('style', 'css');\n\t}\n\n}(Prism));\n\n\n/* **********************************************\n     Begin prism-clike.js\n********************************************** */\n\nPrism.languages.clike = {\n\t'comment': [\n\t\t{\n\t\t\tpattern: /(^|[^\\\\])\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true\n\t\t},\n\t\t{\n\t\t\tpattern: /(^|[^\\\\:])\\/\\/.*/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true\n\t\t}\n\t],\n\t'string': {\n\t\tpattern: /([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\tgreedy: true\n\t},\n\t'class-name': {\n\t\tpattern: /(\\b(?:class|extends|implements|instanceof|interface|new|trait)\\s+|\\bcatch\\s+\\()[\\w.\\\\]+/i,\n\t\tlookbehind: true,\n\t\tinside: {\n\t\t\t'punctuation': /[.\\\\]/\n\t\t}\n\t},\n\t'keyword': /\\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\\b/,\n\t'boolean': /\\b(?:false|true)\\b/,\n\t'function': /\\b\\w+(?=\\()/,\n\t'number': /\\b0x[\\da-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?/i,\n\t'operator': /[<>]=?|[!=]=?=?|--?|\\+\\+?|&&?|\\|\\|?|[?*/~^%]/,\n\t'punctuation': /[{}[\\];(),.:]/\n};\n\n\n/* **********************************************\n     Begin prism-javascript.js\n********************************************** */\n\nPrism.languages.javascript = Prism.languages.extend('clike', {\n\t'class-name': [\n\t\tPrism.languages.clike['class-name'],\n\t\t{\n\t\t\tpattern: /(^|[^$\\w\\xA0-\\uFFFF])(?!\\s)[_$A-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\.(?:constructor|prototype))/,\n\t\t\tlookbehind: true\n\t\t}\n\t],\n\t'keyword': [\n\t\t{\n\t\t\tpattern: /((?:^|\\})\\s*)catch\\b/,\n\t\t\tlookbehind: true\n\t\t},\n\t\t{\n\t\t\tpattern: /(^|[^.]|\\.\\.\\.\\s*)\\b(?:as|assert(?=\\s*\\{)|async(?=\\s*(?:function\\b|\\(|[$\\w\\xA0-\\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\\s*(?:\\{|$))|for|from(?=\\s*(?:['\"]|$))|function|(?:get|set)(?=\\s*(?:[#\\[$\\w\\xA0-\\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\\b/,\n\t\t\tlookbehind: true\n\t\t},\n\t],\n\t// Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)\n\t'function': /#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*(?:\\.\\s*(?:apply|bind|call)\\s*)?\\()/,\n\t'number': {\n\t\tpattern: RegExp(\n\t\t\t/(^|[^\\w$])/.source +\n\t\t\t'(?:' +\n\t\t\t(\n\t\t\t\t// constant\n\t\t\t\t/NaN|Infinity/.source +\n\t\t\t\t'|' +\n\t\t\t\t// binary integer\n\t\t\t\t/0[bB][01]+(?:_[01]+)*n?/.source +\n\t\t\t\t'|' +\n\t\t\t\t// octal integer\n\t\t\t\t/0[oO][0-7]+(?:_[0-7]+)*n?/.source +\n\t\t\t\t'|' +\n\t\t\t\t// hexadecimal integer\n\t\t\t\t/0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?/.source +\n\t\t\t\t'|' +\n\t\t\t\t// decimal bigint\n\t\t\t\t/\\d+(?:_\\d+)*n/.source +\n\t\t\t\t'|' +\n\t\t\t\t// decimal number (integer or float) but no bigint\n\t\t\t\t/(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?/.source\n\t\t\t) +\n\t\t\t')' +\n\t\t\t/(?![\\w$])/.source\n\t\t),\n\t\tlookbehind: true\n\t},\n\t'operator': /--|\\+\\+|\\*\\*=?|=>|&&=?|\\|\\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\\.{3}|\\?\\?=?|\\?\\.?|[~:]/\n});\n\nPrism.languages.javascript['class-name'][0].pattern = /(\\b(?:class|extends|implements|instanceof|interface|new)\\s+)[\\w.\\\\]+/;\n\nPrism.languages.insertBefore('javascript', 'keyword', {\n\t'regex': {\n\t\tpattern: RegExp(\n\t\t\t// lookbehind\n\t\t\t// eslint-disable-next-line regexp/no-dupe-characters-character-class\n\t\t\t/((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/.source +\n\t\t\t// Regex pattern:\n\t\t\t// There are 2 regex patterns here. The RegExp set notation proposal added support for nested character\n\t\t\t// classes if the `v` flag is present. Unfortunately, nested CCs are both context-free and incompatible\n\t\t\t// with the only syntax, so we have to define 2 different regex patterns.\n\t\t\t/\\//.source +\n\t\t\t'(?:' +\n\t\t\t/(?:\\[(?:[^\\]\\\\\\r\\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[dgimyus]{0,7}/.source +\n\t\t\t'|' +\n\t\t\t// `v` flag syntax. This supports 3 levels of nested character classes.\n\t\t\t/(?:\\[(?:[^[\\]\\\\\\r\\n]|\\\\.|\\[(?:[^[\\]\\\\\\r\\n]|\\\\.|\\[(?:[^[\\]\\\\\\r\\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source +\n\t\t\t')' +\n\t\t\t// lookahead\n\t\t\t/(?=(?:\\s|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/)*(?:$|[\\r\\n,.;:})\\]]|\\/\\/))/.source\n\t\t),\n\t\tlookbehind: true,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'regex-source': {\n\t\t\t\tpattern: /^(\\/)[\\s\\S]+(?=\\/[a-z]*$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'language-regex',\n\t\t\t\tinside: Prism.languages.regex\n\t\t\t},\n\t\t\t'regex-delimiter': /^\\/|\\/$/,\n\t\t\t'regex-flags': /^[a-z]+$/,\n\t\t}\n\t},\n\t// This must be declared before keyword because we use \"function\" inside the look-forward\n\t'function-variable': {\n\t\tpattern: /#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*[=:]\\s*(?:async\\s*)?(?:\\bfunction\\b|(?:\\((?:[^()]|\\([^()]*\\))*\\)|(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)\\s*=>))/,\n\t\talias: 'function'\n\t},\n\t'parameter': [\n\t\t{\n\t\t\tpattern: /(function(?:\\s+(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)?\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\))/,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t},\n\t\t{\n\t\t\tpattern: /(^|[^$\\w\\xA0-\\uFFFF])(?!\\s)[_$a-z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*=>)/i,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t},\n\t\t{\n\t\t\tpattern: /(\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*=>)/,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t},\n\t\t{\n\t\t\tpattern: /((?:\\b|\\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\\w\\xA0-\\uFFFF]))(?:(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*)\\(\\s*|\\]\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*\\{)/,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t}\n\t],\n\t'constant': /\\b[A-Z](?:[A-Z_]|\\dx?)*\\b/\n});\n\nPrism.languages.insertBefore('javascript', 'string', {\n\t'hashbang': {\n\t\tpattern: /^#!.*/,\n\t\tgreedy: true,\n\t\talias: 'comment'\n\t},\n\t'template-string': {\n\t\tpattern: /`(?:\\\\[\\s\\S]|\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}|(?!\\$\\{)[^\\\\`])*`/,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'template-punctuation': {\n\t\t\t\tpattern: /^`|`$/,\n\t\t\t\talias: 'string'\n\t\t\t},\n\t\t\t'interpolation': {\n\t\t\t\tpattern: /((?:^|[^\\\\])(?:\\\\{2})*)\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\tpattern: /^\\$\\{|\\}$/,\n\t\t\t\t\t\talias: 'punctuation'\n\t\t\t\t\t},\n\t\t\t\t\trest: Prism.languages.javascript\n\t\t\t\t}\n\t\t\t},\n\t\t\t'string': /[\\s\\S]+/\n\t\t}\n\t},\n\t'string-property': {\n\t\tpattern: /((?:^|[,{])[ \\t]*)([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\2)[^\\\\\\r\\n])*\\2(?=\\s*:)/m,\n\t\tlookbehind: true,\n\t\tgreedy: true,\n\t\talias: 'property'\n\t}\n});\n\nPrism.languages.insertBefore('javascript', 'operator', {\n\t'literal-property': {\n\t\tpattern: /((?:^|[,{])[ \\t]*)(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*:)/m,\n\t\tlookbehind: true,\n\t\talias: 'property'\n\t},\n});\n\nif (Prism.languages.markup) {\n\tPrism.languages.markup.tag.addInlined('script', 'javascript');\n\n\t// add attribute support for all DOM events.\n\t// https://developer.mozilla.org/en-US/docs/Web/Events#Standard_events\n\tPrism.languages.markup.tag.addAttribute(\n\t\t/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,\n\t\t'javascript'\n\t);\n}\n\nPrism.languages.js = Prism.languages.javascript;\n\n\n/* **********************************************\n     Begin prism-file-highlight.js\n********************************************** */\n\n(function () {\n\n\tif (typeof Prism === 'undefined' || typeof document === 'undefined') {\n\t\treturn;\n\t}\n\n\t// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches#Polyfill\n\tif (!Element.prototype.matches) {\n\t\tElement.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;\n\t}\n\n\tvar LOADING_MESSAGE = 'Loading…';\n\tvar FAILURE_MESSAGE = function (status, message) {\n\t\treturn '✖ Error ' + status + ' while fetching file: ' + message;\n\t};\n\tvar FAILURE_EMPTY_MESSAGE = '✖ Error: File does not exist or is empty';\n\n\tvar EXTENSIONS = {\n\t\t'js': 'javascript',\n\t\t'py': 'python',\n\t\t'rb': 'ruby',\n\t\t'ps1': 'powershell',\n\t\t'psm1': 'powershell',\n\t\t'sh': 'bash',\n\t\t'bat': 'batch',\n\t\t'h': 'c',\n\t\t'tex': 'latex'\n\t};\n\n\tvar STATUS_ATTR = 'data-src-status';\n\tvar STATUS_LOADING = 'loading';\n\tvar STATUS_LOADED = 'loaded';\n\tvar STATUS_FAILED = 'failed';\n\n\tvar SELECTOR = 'pre[data-src]:not([' + STATUS_ATTR + '=\"' + STATUS_LOADED + '\"])'\n\t\t+ ':not([' + STATUS_ATTR + '=\"' + STATUS_LOADING + '\"])';\n\n\t/**\n\t * Loads the given file.\n\t *\n\t * @param {string} src The URL or path of the source file to load.\n\t * @param {(result: string) => void} success\n\t * @param {(reason: string) => void} error\n\t */\n\tfunction loadFile(src, success, error) {\n\t\tvar xhr = new XMLHttpRequest();\n\t\txhr.open('GET', src, true);\n\t\txhr.onreadystatechange = function () {\n\t\t\tif (xhr.readyState == 4) {\n\t\t\t\tif (xhr.status < 400 && xhr.responseText) {\n\t\t\t\t\tsuccess(xhr.responseText);\n\t\t\t\t} else {\n\t\t\t\t\tif (xhr.status >= 400) {\n\t\t\t\t\t\terror(FAILURE_MESSAGE(xhr.status, xhr.statusText));\n\t\t\t\t\t} else {\n\t\t\t\t\t\terror(FAILURE_EMPTY_MESSAGE);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\txhr.send(null);\n\t}\n\n\t/**\n\t * Parses the given range.\n\t *\n\t * This returns a range with inclusive ends.\n\t *\n\t * @param {string | null | undefined} range\n\t * @returns {[number, number | undefined] | undefined}\n\t */\n\tfunction parseRange(range) {\n\t\tvar m = /^\\s*(\\d+)\\s*(?:(,)\\s*(?:(\\d+)\\s*)?)?$/.exec(range || '');\n\t\tif (m) {\n\t\t\tvar start = Number(m[1]);\n\t\t\tvar comma = m[2];\n\t\t\tvar end = m[3];\n\n\t\t\tif (!comma) {\n\t\t\t\treturn [start, start];\n\t\t\t}\n\t\t\tif (!end) {\n\t\t\t\treturn [start, undefined];\n\t\t\t}\n\t\t\treturn [start, Number(end)];\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tPrism.hooks.add('before-highlightall', function (env) {\n\t\tenv.selector += ', ' + SELECTOR;\n\t});\n\n\tPrism.hooks.add('before-sanity-check', function (env) {\n\t\tvar pre = /** @type {HTMLPreElement} */ (env.element);\n\t\tif (pre.matches(SELECTOR)) {\n\t\t\tenv.code = ''; // fast-path the whole thing and go to complete\n\n\t\t\tpre.setAttribute(STATUS_ATTR, STATUS_LOADING); // mark as loading\n\n\t\t\t// add code element with loading message\n\t\t\tvar code = pre.appendChild(document.createElement('CODE'));\n\t\t\tcode.textContent = LOADING_MESSAGE;\n\n\t\t\tvar src = pre.getAttribute('data-src');\n\n\t\t\tvar language = env.language;\n\t\t\tif (language === 'none') {\n\t\t\t\t// the language might be 'none' because there is no language set;\n\t\t\t\t// in this case, we want to use the extension as the language\n\t\t\t\tvar extension = (/\\.(\\w+)$/.exec(src) || [, 'none'])[1];\n\t\t\t\tlanguage = EXTENSIONS[extension] || extension;\n\t\t\t}\n\n\t\t\t// set language classes\n\t\t\tPrism.util.setLanguage(code, language);\n\t\t\tPrism.util.setLanguage(pre, language);\n\n\t\t\t// preload the language\n\t\t\tvar autoloader = Prism.plugins.autoloader;\n\t\t\tif (autoloader) {\n\t\t\t\tautoloader.loadLanguages(language);\n\t\t\t}\n\n\t\t\t// load file\n\t\t\tloadFile(\n\t\t\t\tsrc,\n\t\t\t\tfunction (text) {\n\t\t\t\t\t// mark as loaded\n\t\t\t\t\tpre.setAttribute(STATUS_ATTR, STATUS_LOADED);\n\n\t\t\t\t\t// handle data-range\n\t\t\t\t\tvar range = parseRange(pre.getAttribute('data-range'));\n\t\t\t\t\tif (range) {\n\t\t\t\t\t\tvar lines = text.split(/\\r\\n?|\\n/g);\n\n\t\t\t\t\t\t// the range is one-based and inclusive on both ends\n\t\t\t\t\t\tvar start = range[0];\n\t\t\t\t\t\tvar end = range[1] == null ? lines.length : range[1];\n\n\t\t\t\t\t\tif (start < 0) { start += lines.length; }\n\t\t\t\t\t\tstart = Math.max(0, Math.min(start - 1, lines.length));\n\t\t\t\t\t\tif (end < 0) { end += lines.length; }\n\t\t\t\t\t\tend = Math.max(0, Math.min(end, lines.length));\n\n\t\t\t\t\t\ttext = lines.slice(start, end).join('\\n');\n\n\t\t\t\t\t\t// add data-start for line numbers\n\t\t\t\t\t\tif (!pre.hasAttribute('data-start')) {\n\t\t\t\t\t\t\tpre.setAttribute('data-start', String(start + 1));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// highlight code\n\t\t\t\t\tcode.textContent = text;\n\t\t\t\t\tPrism.highlightElement(code);\n\t\t\t\t},\n\t\t\t\tfunction (error) {\n\t\t\t\t\t// mark as failed\n\t\t\t\t\tpre.setAttribute(STATUS_ATTR, STATUS_FAILED);\n\n\t\t\t\t\tcode.textContent = error;\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t});\n\n\tPrism.plugins.fileHighlight = {\n\t\t/**\n\t\t * Executes the File Highlight plugin for all matching `pre` elements under the given container.\n\t\t *\n\t\t * Note: Elements which are already loaded or currently loading will not be touched by this method.\n\t\t *\n\t\t * @param {ParentNode} [container=document]\n\t\t */\n\t\thighlight: function highlight(container) {\n\t\t\tvar elements = (container || document).querySelectorAll(SELECTOR);\n\n\t\t\tfor (var i = 0, element; (element = elements[i++]);) {\n\t\t\t\tPrism.highlightElement(element);\n\t\t\t}\n\t\t}\n\t};\n\n\tvar logged = false;\n\t/** @deprecated Use `Prism.plugins.fileHighlight.highlight` instead. */\n\tPrism.fileHighlight = function () {\n\t\tif (!logged) {\n\t\t\tconsole.warn('Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead.');\n\t\t\tlogged = true;\n\t\t}\n\t\tPrism.plugins.fileHighlight.highlight.apply(this, arguments);\n\t};\n\n}());\n","(function (Prism) {\n\n\tvar string = /(?:\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"|'(?:\\\\(?:\\r\\n|[\\s\\S])|[^'\\\\\\r\\n])*')/;\n\n\tPrism.languages.css = {\n\t\t'comment': /\\/\\*[\\s\\S]*?\\*\\//,\n\t\t'atrule': {\n\t\t\tpattern: RegExp('@[\\\\w-](?:' + /[^;{\\s\"']|\\s+(?!\\s)/.source + '|' + string.source + ')*?' + /(?:;|(?=\\s*\\{))/.source),\n\t\t\tinside: {\n\t\t\t\t'rule': /^@[\\w-]+/,\n\t\t\t\t'selector-function-argument': {\n\t\t\t\t\tpattern: /(\\bselector\\s*\\(\\s*(?![\\s)]))(?:[^()\\s]|\\s+(?![\\s)])|\\((?:[^()]|\\([^()]*\\))*\\))+(?=\\s*\\))/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'selector'\n\t\t\t\t},\n\t\t\t\t'keyword': {\n\t\t\t\t\tpattern: /(^|[^\\w-])(?:and|not|only|or)(?![\\w-])/,\n\t\t\t\t\tlookbehind: true\n\t\t\t\t}\n\t\t\t\t// See rest below\n\t\t\t}\n\t\t},\n\t\t'url': {\n\t\t\t// https://drafts.csswg.org/css-values-3/#urls\n\t\t\tpattern: RegExp('\\\\burl\\\\((?:' + string.source + '|' + /(?:[^\\\\\\r\\n()\"']|\\\\[\\s\\S])*/.source + ')\\\\)', 'i'),\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'function': /^url/i,\n\t\t\t\t'punctuation': /^\\(|\\)$/,\n\t\t\t\t'string': {\n\t\t\t\t\tpattern: RegExp('^' + string.source + '$'),\n\t\t\t\t\talias: 'url'\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t'selector': {\n\t\t\tpattern: RegExp('(^|[{}\\\\s])[^{}\\\\s](?:[^{};\"\\'\\\\s]|\\\\s+(?![\\\\s{])|' + string.source + ')*(?=\\\\s*\\\\{)'),\n\t\t\tlookbehind: true\n\t\t},\n\t\t'string': {\n\t\t\tpattern: string,\n\t\t\tgreedy: true\n\t\t},\n\t\t'property': {\n\t\t\tpattern: /(^|[^-\\w\\xA0-\\uFFFF])(?!\\s)[-_a-z\\xA0-\\uFFFF](?:(?!\\s)[-\\w\\xA0-\\uFFFF])*(?=\\s*:)/i,\n\t\t\tlookbehind: true\n\t\t},\n\t\t'important': /!important\\b/i,\n\t\t'function': {\n\t\t\tpattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\\()/i,\n\t\t\tlookbehind: true\n\t\t},\n\t\t'punctuation': /[(){};:,]/\n\t};\n\n\tPrism.languages.css['atrule'].inside.rest = Prism.languages.css;\n\n\tvar markup = Prism.languages.markup;\n\tif (markup) {\n\t\tmarkup.tag.addInlined('style', 'css');\n\t\tmarkup.tag.addAttribute('style', 'css');\n\t}\n\n}(Prism));\n","Prism.languages.scss = Prism.languages.extend('css', {\n\t'comment': {\n\t\tpattern: /(^|[^\\\\])(?:\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*)/,\n\t\tlookbehind: true\n\t},\n\t'atrule': {\n\t\tpattern: /@[\\w-](?:\\([^()]+\\)|[^()\\s]|\\s+(?!\\s))*?(?=\\s+[{;])/,\n\t\tinside: {\n\t\t\t'rule': /@[\\w-]+/\n\t\t\t// See rest below\n\t\t}\n\t},\n\t// url, compassified\n\t'url': /(?:[-a-z]+-)?url(?=\\()/i,\n\t// CSS selector regex is not appropriate for Sass\n\t// since there can be lot more things (var, @ directive, nesting..)\n\t// a selector must start at the end of a property or after a brace (end of other rules or nesting)\n\t// it can contain some characters that aren't used for defining rules or end of selector, & (parent selector), or interpolated variable\n\t// the end of a selector is found when there is no rules in it ( {} or {\\s}) or if there is a property (because an interpolated var\n\t// can \"pass\" as a selector- e.g: proper#{$erty})\n\t// this one was hard to do, so please be careful if you edit this one :)\n\t'selector': {\n\t\t// Initial look-ahead is used to prevent matching of blank selectors\n\t\tpattern: /(?=\\S)[^@;{}()]?(?:[^@;{}()\\s]|\\s+(?!\\s)|#\\{\\$[-\\w]+\\})+(?=\\s*\\{(?:\\}|\\s|[^}][^:{}]*[:{][^}]))/,\n\t\tinside: {\n\t\t\t'parent': {\n\t\t\t\tpattern: /&/,\n\t\t\t\talias: 'important'\n\t\t\t},\n\t\t\t'placeholder': /%[-\\w]+/,\n\t\t\t'variable': /\\$[-\\w]+|#\\{\\$[-\\w]+\\}/\n\t\t}\n\t},\n\t'property': {\n\t\tpattern: /(?:[-\\w]|\\$[-\\w]|#\\{\\$[-\\w]+\\})+(?=\\s*:)/,\n\t\tinside: {\n\t\t\t'variable': /\\$[-\\w]+|#\\{\\$[-\\w]+\\}/\n\t\t}\n\t}\n});\n\nPrism.languages.insertBefore('scss', 'atrule', {\n\t'keyword': [\n\t\t/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\\b/i,\n\t\t{\n\t\t\tpattern: /( )(?:from|through)(?= )/,\n\t\t\tlookbehind: true\n\t\t}\n\t]\n});\n\nPrism.languages.insertBefore('scss', 'important', {\n\t// var and interpolated vars\n\t'variable': /\\$[-\\w]+|#\\{\\$[-\\w]+\\}/\n});\n\nPrism.languages.insertBefore('scss', 'function', {\n\t'module-modifier': {\n\t\tpattern: /\\b(?:as|hide|show|with)\\b/i,\n\t\talias: 'keyword'\n\t},\n\t'placeholder': {\n\t\tpattern: /%[-\\w]+/,\n\t\talias: 'selector'\n\t},\n\t'statement': {\n\t\tpattern: /\\B!(?:default|optional)\\b/i,\n\t\talias: 'keyword'\n\t},\n\t'boolean': /\\b(?:false|true)\\b/,\n\t'null': {\n\t\tpattern: /\\bnull\\b/,\n\t\talias: 'keyword'\n\t},\n\t'operator': {\n\t\tpattern: /(\\s)(?:[-+*\\/%]|[=!]=|<=?|>=?|and|not|or)(?=\\s)/,\n\t\tlookbehind: true\n\t}\n});\n\nPrism.languages.scss['atrule'].inside.rest = Prism.languages.scss;\n","Prism.languages.javascript = Prism.languages.extend('clike', {\n\t'class-name': [\n\t\tPrism.languages.clike['class-name'],\n\t\t{\n\t\t\tpattern: /(^|[^$\\w\\xA0-\\uFFFF])(?!\\s)[_$A-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\.(?:constructor|prototype))/,\n\t\t\tlookbehind: true\n\t\t}\n\t],\n\t'keyword': [\n\t\t{\n\t\t\tpattern: /((?:^|\\})\\s*)catch\\b/,\n\t\t\tlookbehind: true\n\t\t},\n\t\t{\n\t\t\tpattern: /(^|[^.]|\\.\\.\\.\\s*)\\b(?:as|assert(?=\\s*\\{)|async(?=\\s*(?:function\\b|\\(|[$\\w\\xA0-\\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\\s*(?:\\{|$))|for|from(?=\\s*(?:['\"]|$))|function|(?:get|set)(?=\\s*(?:[#\\[$\\w\\xA0-\\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\\b/,\n\t\t\tlookbehind: true\n\t\t},\n\t],\n\t// Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)\n\t'function': /#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*(?:\\.\\s*(?:apply|bind|call)\\s*)?\\()/,\n\t'number': {\n\t\tpattern: RegExp(\n\t\t\t/(^|[^\\w$])/.source +\n\t\t\t'(?:' +\n\t\t\t(\n\t\t\t\t// constant\n\t\t\t\t/NaN|Infinity/.source +\n\t\t\t\t'|' +\n\t\t\t\t// binary integer\n\t\t\t\t/0[bB][01]+(?:_[01]+)*n?/.source +\n\t\t\t\t'|' +\n\t\t\t\t// octal integer\n\t\t\t\t/0[oO][0-7]+(?:_[0-7]+)*n?/.source +\n\t\t\t\t'|' +\n\t\t\t\t// hexadecimal integer\n\t\t\t\t/0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?/.source +\n\t\t\t\t'|' +\n\t\t\t\t// decimal bigint\n\t\t\t\t/\\d+(?:_\\d+)*n/.source +\n\t\t\t\t'|' +\n\t\t\t\t// decimal number (integer or float) but no bigint\n\t\t\t\t/(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?/.source\n\t\t\t) +\n\t\t\t')' +\n\t\t\t/(?![\\w$])/.source\n\t\t),\n\t\tlookbehind: true\n\t},\n\t'operator': /--|\\+\\+|\\*\\*=?|=>|&&=?|\\|\\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\\.{3}|\\?\\?=?|\\?\\.?|[~:]/\n});\n\nPrism.languages.javascript['class-name'][0].pattern = /(\\b(?:class|extends|implements|instanceof|interface|new)\\s+)[\\w.\\\\]+/;\n\nPrism.languages.insertBefore('javascript', 'keyword', {\n\t'regex': {\n\t\tpattern: RegExp(\n\t\t\t// lookbehind\n\t\t\t// eslint-disable-next-line regexp/no-dupe-characters-character-class\n\t\t\t/((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/.source +\n\t\t\t// Regex pattern:\n\t\t\t// There are 2 regex patterns here. The RegExp set notation proposal added support for nested character\n\t\t\t// classes if the `v` flag is present. Unfortunately, nested CCs are both context-free and incompatible\n\t\t\t// with the only syntax, so we have to define 2 different regex patterns.\n\t\t\t/\\//.source +\n\t\t\t'(?:' +\n\t\t\t/(?:\\[(?:[^\\]\\\\\\r\\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[dgimyus]{0,7}/.source +\n\t\t\t'|' +\n\t\t\t// `v` flag syntax. This supports 3 levels of nested character classes.\n\t\t\t/(?:\\[(?:[^[\\]\\\\\\r\\n]|\\\\.|\\[(?:[^[\\]\\\\\\r\\n]|\\\\.|\\[(?:[^[\\]\\\\\\r\\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source +\n\t\t\t')' +\n\t\t\t// lookahead\n\t\t\t/(?=(?:\\s|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/)*(?:$|[\\r\\n,.;:})\\]]|\\/\\/))/.source\n\t\t),\n\t\tlookbehind: true,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'regex-source': {\n\t\t\t\tpattern: /^(\\/)[\\s\\S]+(?=\\/[a-z]*$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'language-regex',\n\t\t\t\tinside: Prism.languages.regex\n\t\t\t},\n\t\t\t'regex-delimiter': /^\\/|\\/$/,\n\t\t\t'regex-flags': /^[a-z]+$/,\n\t\t}\n\t},\n\t// This must be declared before keyword because we use \"function\" inside the look-forward\n\t'function-variable': {\n\t\tpattern: /#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*[=:]\\s*(?:async\\s*)?(?:\\bfunction\\b|(?:\\((?:[^()]|\\([^()]*\\))*\\)|(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)\\s*=>))/,\n\t\talias: 'function'\n\t},\n\t'parameter': [\n\t\t{\n\t\t\tpattern: /(function(?:\\s+(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)?\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\))/,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t},\n\t\t{\n\t\t\tpattern: /(^|[^$\\w\\xA0-\\uFFFF])(?!\\s)[_$a-z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*=>)/i,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t},\n\t\t{\n\t\t\tpattern: /(\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*=>)/,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t},\n\t\t{\n\t\t\tpattern: /((?:\\b|\\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\\w\\xA0-\\uFFFF]))(?:(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*)\\(\\s*|\\]\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*\\{)/,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t}\n\t],\n\t'constant': /\\b[A-Z](?:[A-Z_]|\\dx?)*\\b/\n});\n\nPrism.languages.insertBefore('javascript', 'string', {\n\t'hashbang': {\n\t\tpattern: /^#!.*/,\n\t\tgreedy: true,\n\t\talias: 'comment'\n\t},\n\t'template-string': {\n\t\tpattern: /`(?:\\\\[\\s\\S]|\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}|(?!\\$\\{)[^\\\\`])*`/,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'template-punctuation': {\n\t\t\t\tpattern: /^`|`$/,\n\t\t\t\talias: 'string'\n\t\t\t},\n\t\t\t'interpolation': {\n\t\t\t\tpattern: /((?:^|[^\\\\])(?:\\\\{2})*)\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\tpattern: /^\\$\\{|\\}$/,\n\t\t\t\t\t\talias: 'punctuation'\n\t\t\t\t\t},\n\t\t\t\t\trest: Prism.languages.javascript\n\t\t\t\t}\n\t\t\t},\n\t\t\t'string': /[\\s\\S]+/\n\t\t}\n\t},\n\t'string-property': {\n\t\tpattern: /((?:^|[,{])[ \\t]*)([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\2)[^\\\\\\r\\n])*\\2(?=\\s*:)/m,\n\t\tlookbehind: true,\n\t\tgreedy: true,\n\t\talias: 'property'\n\t}\n});\n\nPrism.languages.insertBefore('javascript', 'operator', {\n\t'literal-property': {\n\t\tpattern: /((?:^|[,{])[ \\t]*)(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*:)/m,\n\t\tlookbehind: true,\n\t\talias: 'property'\n\t},\n});\n\nif (Prism.languages.markup) {\n\tPrism.languages.markup.tag.addInlined('script', 'javascript');\n\n\t// add attribute support for all DOM events.\n\t// https://developer.mozilla.org/en-US/docs/Web/Events#Standard_events\n\tPrism.languages.markup.tag.addAttribute(\n\t\t/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,\n\t\t'javascript'\n\t);\n}\n\nPrism.languages.js = Prism.languages.javascript;\n","Prism.languages.markup = {\n\t'comment': {\n\t\tpattern: /<!--(?:(?!<!--)[\\s\\S])*?-->/,\n\t\tgreedy: true\n\t},\n\t'prolog': {\n\t\tpattern: /<\\?[\\s\\S]+?\\?>/,\n\t\tgreedy: true\n\t},\n\t'doctype': {\n\t\t// https://www.w3.org/TR/xml/#NT-doctypedecl\n\t\tpattern: /<!DOCTYPE(?:[^>\"'[\\]]|\"[^\"]*\"|'[^']*')+(?:\\[(?:[^<\"'\\]]|\"[^\"]*\"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\\]\\s*)?>/i,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'internal-subset': {\n\t\t\t\tpattern: /(^[^\\[]*\\[)[\\s\\S]+(?=\\]>$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: null // see below\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /\"[^\"]*\"|'[^']*'/,\n\t\t\t\tgreedy: true\n\t\t\t},\n\t\t\t'punctuation': /^<!|>$|[[\\]]/,\n\t\t\t'doctype-tag': /^DOCTYPE/i,\n\t\t\t'name': /[^\\s<>'\"]+/\n\t\t}\n\t},\n\t'cdata': {\n\t\tpattern: /<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/i,\n\t\tgreedy: true\n\t},\n\t'tag': {\n\t\tpattern: /<\\/?(?!\\d)[^\\s>\\/=$<%]+(?:\\s(?:\\s*[^\\s>\\/=]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))|(?=[\\s/>])))+)?\\s*\\/?>/,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'tag': {\n\t\t\t\tpattern: /^<\\/?[^\\s>\\/]+/,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^<\\/?/,\n\t\t\t\t\t'namespace': /^[^\\s>\\/:]+:/\n\t\t\t\t}\n\t\t\t},\n\t\t\t'special-attr': [],\n\t\t\t'attr-value': {\n\t\t\t\tpattern: /=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+)/,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /^=/,\n\t\t\t\t\t\t\talias: 'attr-equals'\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /^(\\s*)[\"']|[\"']$/,\n\t\t\t\t\t\t\tlookbehind: true\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t},\n\t\t\t'punctuation': /\\/?>/,\n\t\t\t'attr-name': {\n\t\t\t\tpattern: /[^\\s>\\/]+/,\n\t\t\t\tinside: {\n\t\t\t\t\t'namespace': /^[^\\s>\\/:]+:/\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t},\n\t'entity': [\n\t\t{\n\t\t\tpattern: /&[\\da-z]{1,8};/i,\n\t\t\talias: 'named-entity'\n\t\t},\n\t\t/&#x?[\\da-f]{1,8};/i\n\t]\n};\n\nPrism.languages.markup['tag'].inside['attr-value'].inside['entity'] =\n\tPrism.languages.markup['entity'];\nPrism.languages.markup['doctype'].inside['internal-subset'].inside = Prism.languages.markup;\n\n// Plugin to make entity title show the real entity, idea by Roman Komarov\nPrism.hooks.add('wrap', function (env) {\n\n\tif (env.type === 'entity') {\n\t\tenv.attributes['title'] = env.content.replace(/&amp;/, '&');\n\t}\n});\n\nObject.defineProperty(Prism.languages.markup.tag, 'addInlined', {\n\t/**\n\t * Adds an inlined language to markup.\n\t *\n\t * An example of an inlined language is CSS with `<style>` tags.\n\t *\n\t * @param {string} tagName The name of the tag that contains the inlined language. This name will be treated as\n\t * case insensitive.\n\t * @param {string} lang The language key.\n\t * @example\n\t * addInlined('style', 'css');\n\t */\n\tvalue: function addInlined(tagName, lang) {\n\t\tvar includedCdataInside = {};\n\t\tincludedCdataInside['language-' + lang] = {\n\t\t\tpattern: /(^<!\\[CDATA\\[)[\\s\\S]+?(?=\\]\\]>$)/i,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages[lang]\n\t\t};\n\t\tincludedCdataInside['cdata'] = /^<!\\[CDATA\\[|\\]\\]>$/i;\n\n\t\tvar inside = {\n\t\t\t'included-cdata': {\n\t\t\t\tpattern: /<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/i,\n\t\t\t\tinside: includedCdataInside\n\t\t\t}\n\t\t};\n\t\tinside['language-' + lang] = {\n\t\t\tpattern: /[\\s\\S]+/,\n\t\t\tinside: Prism.languages[lang]\n\t\t};\n\n\t\tvar def = {};\n\t\tdef[tagName] = {\n\t\t\tpattern: RegExp(/(<__[^>]*>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[\\s\\S])*?(?=<\\/__>)/.source.replace(/__/g, function () { return tagName; }), 'i'),\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\tinside: inside\n\t\t};\n\n\t\tPrism.languages.insertBefore('markup', 'cdata', def);\n\t}\n});\nObject.defineProperty(Prism.languages.markup.tag, 'addAttribute', {\n\t/**\n\t * Adds an pattern to highlight languages embedded in HTML attributes.\n\t *\n\t * An example of an inlined language is CSS with `style` attributes.\n\t *\n\t * @param {string} attrName The name of the tag that contains the inlined language. This name will be treated as\n\t * case insensitive.\n\t * @param {string} lang The language key.\n\t * @example\n\t * addAttribute('style', 'css');\n\t */\n\tvalue: function (attrName, lang) {\n\t\tPrism.languages.markup.tag.inside['special-attr'].push({\n\t\t\tpattern: RegExp(\n\t\t\t\t/(^|[\"'\\s])/.source + '(?:' + attrName + ')' + /\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))/.source,\n\t\t\t\t'i'\n\t\t\t),\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'attr-name': /^[^\\s=]+/,\n\t\t\t\t'attr-value': {\n\t\t\t\t\tpattern: /=[\\s\\S]+/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'value': {\n\t\t\t\t\t\t\tpattern: /(^=\\s*([\"']|(?![\"'])))\\S[\\s\\S]*(?=\\2$)/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: [lang, 'language-' + lang],\n\t\t\t\t\t\t\tinside: Prism.languages[lang]\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'punctuation': [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpattern: /^=/,\n\t\t\t\t\t\t\t\talias: 'attr-equals'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t/\"|'/\n\t\t\t\t\t\t]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n});\n\nPrism.languages.html = Prism.languages.markup;\nPrism.languages.mathml = Prism.languages.markup;\nPrism.languages.svg = Prism.languages.markup;\n\nPrism.languages.xml = Prism.languages.extend('markup', {});\nPrism.languages.ssml = Prism.languages.xml;\nPrism.languages.atom = Prism.languages.xml;\nPrism.languages.rss = Prism.languages.xml;\n","(function () {\n\n\tif (typeof Prism === 'undefined' || typeof document === 'undefined') {\n\t\treturn;\n\t}\n\n\t/**\n\t * Plugin name which is used as a class name for <pre> which is activating the plugin\n\t *\n\t * @type {string}\n\t */\n\tvar PLUGIN_NAME = 'line-numbers';\n\n\t/**\n\t * Regular expression used for determining line breaks\n\t *\n\t * @type {RegExp}\n\t */\n\tvar NEW_LINE_EXP = /\\n(?!$)/g;\n\n\n\t/**\n\t * Global exports\n\t */\n\tvar config = Prism.plugins.lineNumbers = {\n\t\t/**\n\t\t * Get node for provided line number\n\t\t *\n\t\t * @param {Element} element pre element\n\t\t * @param {number} number line number\n\t\t * @returns {Element|undefined}\n\t\t */\n\t\tgetLine: function (element, number) {\n\t\t\tif (element.tagName !== 'PRE' || !element.classList.contains(PLUGIN_NAME)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar lineNumberRows = element.querySelector('.line-numbers-rows');\n\t\t\tif (!lineNumberRows) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar lineNumberStart = parseInt(element.getAttribute('data-start'), 10) || 1;\n\t\t\tvar lineNumberEnd = lineNumberStart + (lineNumberRows.children.length - 1);\n\n\t\t\tif (number < lineNumberStart) {\n\t\t\t\tnumber = lineNumberStart;\n\t\t\t}\n\t\t\tif (number > lineNumberEnd) {\n\t\t\t\tnumber = lineNumberEnd;\n\t\t\t}\n\n\t\t\tvar lineIndex = number - lineNumberStart;\n\n\t\t\treturn lineNumberRows.children[lineIndex];\n\t\t},\n\n\t\t/**\n\t\t * Resizes the line numbers of the given element.\n\t\t *\n\t\t * This function will not add line numbers. It will only resize existing ones.\n\t\t *\n\t\t * @param {HTMLElement} element A `<pre>` element with line numbers.\n\t\t * @returns {void}\n\t\t */\n\t\tresize: function (element) {\n\t\t\tresizeElements([element]);\n\t\t},\n\n\t\t/**\n\t\t * Whether the plugin can assume that the units font sizes and margins are not depended on the size of\n\t\t * the current viewport.\n\t\t *\n\t\t * Setting this to `true` will allow the plugin to do certain optimizations for better performance.\n\t\t *\n\t\t * Set this to `false` if you use any of the following CSS units: `vh`, `vw`, `vmin`, `vmax`.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tassumeViewportIndependence: true\n\t};\n\n\t/**\n\t * Resizes the given elements.\n\t *\n\t * @param {HTMLElement[]} elements\n\t */\n\tfunction resizeElements(elements) {\n\t\telements = elements.filter(function (e) {\n\t\t\tvar codeStyles = getStyles(e);\n\t\t\tvar whiteSpace = codeStyles['white-space'];\n\t\t\treturn whiteSpace === 'pre-wrap' || whiteSpace === 'pre-line';\n\t\t});\n\n\t\tif (elements.length == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar infos = elements.map(function (element) {\n\t\t\tvar codeElement = element.querySelector('code');\n\t\t\tvar lineNumbersWrapper = element.querySelector('.line-numbers-rows');\n\t\t\tif (!codeElement || !lineNumbersWrapper) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\t/** @type {HTMLElement} */\n\t\t\tvar lineNumberSizer = element.querySelector('.line-numbers-sizer');\n\t\t\tvar codeLines = codeElement.textContent.split(NEW_LINE_EXP);\n\n\t\t\tif (!lineNumberSizer) {\n\t\t\t\tlineNumberSizer = document.createElement('span');\n\t\t\t\tlineNumberSizer.className = 'line-numbers-sizer';\n\n\t\t\t\tcodeElement.appendChild(lineNumberSizer);\n\t\t\t}\n\n\t\t\tlineNumberSizer.innerHTML = '0';\n\t\t\tlineNumberSizer.style.display = 'block';\n\n\t\t\tvar oneLinerHeight = lineNumberSizer.getBoundingClientRect().height;\n\t\t\tlineNumberSizer.innerHTML = '';\n\n\t\t\treturn {\n\t\t\t\telement: element,\n\t\t\t\tlines: codeLines,\n\t\t\t\tlineHeights: [],\n\t\t\t\toneLinerHeight: oneLinerHeight,\n\t\t\t\tsizer: lineNumberSizer,\n\t\t\t};\n\t\t}).filter(Boolean);\n\n\t\tinfos.forEach(function (info) {\n\t\t\tvar lineNumberSizer = info.sizer;\n\t\t\tvar lines = info.lines;\n\t\t\tvar lineHeights = info.lineHeights;\n\t\t\tvar oneLinerHeight = info.oneLinerHeight;\n\n\t\t\tlineHeights[lines.length - 1] = undefined;\n\t\t\tlines.forEach(function (line, index) {\n\t\t\t\tif (line && line.length > 1) {\n\t\t\t\t\tvar e = lineNumberSizer.appendChild(document.createElement('span'));\n\t\t\t\t\te.style.display = 'block';\n\t\t\t\t\te.textContent = line;\n\t\t\t\t} else {\n\t\t\t\t\tlineHeights[index] = oneLinerHeight;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tinfos.forEach(function (info) {\n\t\t\tvar lineNumberSizer = info.sizer;\n\t\t\tvar lineHeights = info.lineHeights;\n\n\t\t\tvar childIndex = 0;\n\t\t\tfor (var i = 0; i < lineHeights.length; i++) {\n\t\t\t\tif (lineHeights[i] === undefined) {\n\t\t\t\t\tlineHeights[i] = lineNumberSizer.children[childIndex++].getBoundingClientRect().height;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tinfos.forEach(function (info) {\n\t\t\tvar lineNumberSizer = info.sizer;\n\t\t\tvar wrapper = info.element.querySelector('.line-numbers-rows');\n\n\t\t\tlineNumberSizer.style.display = 'none';\n\t\t\tlineNumberSizer.innerHTML = '';\n\n\t\t\tinfo.lineHeights.forEach(function (height, lineNumber) {\n\t\t\t\twrapper.children[lineNumber].style.height = height + 'px';\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Returns style declarations for the element\n\t *\n\t * @param {Element} element\n\t */\n\tfunction getStyles(element) {\n\t\tif (!element) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn window.getComputedStyle ? getComputedStyle(element) : (element.currentStyle || null);\n\t}\n\n\tvar lastWidth = undefined;\n\twindow.addEventListener('resize', function () {\n\t\tif (config.assumeViewportIndependence && lastWidth === window.innerWidth) {\n\t\t\treturn;\n\t\t}\n\t\tlastWidth = window.innerWidth;\n\n\t\tresizeElements(Array.prototype.slice.call(document.querySelectorAll('pre.' + PLUGIN_NAME)));\n\t});\n\n\tPrism.hooks.add('complete', function (env) {\n\t\tif (!env.code) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar code = /** @type {Element} */ (env.element);\n\t\tvar pre = /** @type {HTMLElement} */ (code.parentNode);\n\n\t\t// works only for <code> wrapped inside <pre> (not inline)\n\t\tif (!pre || !/pre/i.test(pre.nodeName)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Abort if line numbers already exists\n\t\tif (code.querySelector('.line-numbers-rows')) {\n\t\t\treturn;\n\t\t}\n\n\t\t// only add line numbers if <code> or one of its ancestors has the `line-numbers` class\n\t\tif (!Prism.util.isActive(code, PLUGIN_NAME)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remove the class 'line-numbers' from the <code>\n\t\tcode.classList.remove(PLUGIN_NAME);\n\t\t// Add the class 'line-numbers' to the <pre>\n\t\tpre.classList.add(PLUGIN_NAME);\n\n\t\tvar match = env.code.match(NEW_LINE_EXP);\n\t\tvar linesNum = match ? match.length + 1 : 1;\n\t\tvar lineNumbersWrapper;\n\n\t\tvar lines = new Array(linesNum + 1).join('<span></span>');\n\n\t\tlineNumbersWrapper = document.createElement('span');\n\t\tlineNumbersWrapper.setAttribute('aria-hidden', 'true');\n\t\tlineNumbersWrapper.className = 'line-numbers-rows';\n\t\tlineNumbersWrapper.innerHTML = lines;\n\n\t\tif (pre.hasAttribute('data-start')) {\n\t\t\tpre.style.counterReset = 'linenumber ' + (parseInt(pre.getAttribute('data-start'), 10) - 1);\n\t\t}\n\n\t\tenv.element.appendChild(lineNumbersWrapper);\n\n\t\tresizeElements([pre]);\n\n\t\tPrism.hooks.run('line-numbers', env);\n\t});\n\n\tPrism.hooks.add('line-numbers', function (env) {\n\t\tenv.plugins = env.plugins || {};\n\t\tenv.plugins.lineNumbers = true;\n\t});\n\n}());\n","(function () {\n\n\tif (typeof Prism === 'undefined' || typeof document === 'undefined' || !document.querySelector) {\n\t\treturn;\n\t}\n\n\tvar LINE_NUMBERS_CLASS = 'line-numbers';\n\tvar LINKABLE_LINE_NUMBERS_CLASS = 'linkable-line-numbers';\n\tvar NEW_LINE_EXP = /\\n(?!$)/g;\n\n\t/**\n\t * @param {string} selector\n\t * @param {ParentNode} [container]\n\t * @returns {HTMLElement[]}\n\t */\n\tfunction $$(selector, container) {\n\t\treturn Array.prototype.slice.call((container || document).querySelectorAll(selector));\n\t}\n\n\t/**\n\t * Returns whether the given element has the given class.\n\t *\n\t * @param {Element} element\n\t * @param {string} className\n\t * @returns {boolean}\n\t */\n\tfunction hasClass(element, className) {\n\t\treturn element.classList.contains(className);\n\t}\n\n\t/**\n\t * Calls the given function.\n\t *\n\t * @param {() => any} func\n\t * @returns {void}\n\t */\n\tfunction callFunction(func) {\n\t\tfunc();\n\t}\n\n\t// Some browsers round the line-height, others don't.\n\t// We need to test for it to position the elements properly.\n\tvar isLineHeightRounded = (function () {\n\t\tvar res;\n\t\treturn function () {\n\t\t\tif (typeof res === 'undefined') {\n\t\t\t\tvar d = document.createElement('div');\n\t\t\t\td.style.fontSize = '13px';\n\t\t\t\td.style.lineHeight = '1.5';\n\t\t\t\td.style.padding = '0';\n\t\t\t\td.style.border = '0';\n\t\t\t\td.innerHTML = '&nbsp;<br />&nbsp;';\n\t\t\t\tdocument.body.appendChild(d);\n\t\t\t\t// Browsers that round the line-height should have offsetHeight === 38\n\t\t\t\t// The others should have 39.\n\t\t\t\tres = d.offsetHeight === 38;\n\t\t\t\tdocument.body.removeChild(d);\n\t\t\t}\n\t\t\treturn res;\n\t\t};\n\t}());\n\n\t/**\n\t * Returns the top offset of the content box of the given parent and the content box of one of its children.\n\t *\n\t * @param {HTMLElement} parent\n\t * @param {HTMLElement} child\n\t */\n\tfunction getContentBoxTopOffset(parent, child) {\n\t\tvar parentStyle = getComputedStyle(parent);\n\t\tvar childStyle = getComputedStyle(child);\n\n\t\t/**\n\t\t * Returns the numeric value of the given pixel value.\n\t\t *\n\t\t * @param {string} px\n\t\t */\n\t\tfunction pxToNumber(px) {\n\t\t\treturn +px.substr(0, px.length - 2);\n\t\t}\n\n\t\treturn child.offsetTop\n\t\t\t+ pxToNumber(childStyle.borderTopWidth)\n\t\t\t+ pxToNumber(childStyle.paddingTop)\n\t\t\t- pxToNumber(parentStyle.paddingTop);\n\t}\n\n\t/**\n\t * Returns whether the Line Highlight plugin is active for the given element.\n\t *\n\t * If this function returns `false`, do not call `highlightLines` for the given element.\n\t *\n\t * @param {HTMLElement | null | undefined} pre\n\t * @returns {boolean}\n\t */\n\tfunction isActiveFor(pre) {\n\t\tif (!pre || !/pre/i.test(pre.nodeName)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (pre.hasAttribute('data-line')) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (pre.id && Prism.util.isActive(pre, LINKABLE_LINE_NUMBERS_CLASS)) {\n\t\t\t// Technically, the line numbers plugin is also necessary but this plugin doesn't control the classes of\n\t\t\t// the line numbers plugin, so we can't assume that they are present.\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tvar scrollIntoView = true;\n\n\tPrism.plugins.lineHighlight = {\n\t\t/**\n\t\t * Highlights the lines of the given pre.\n\t\t *\n\t\t * This function is split into a DOM measuring and mutate phase to improve performance.\n\t\t * The returned function mutates the DOM when called.\n\t\t *\n\t\t * @param {HTMLElement} pre\n\t\t * @param {string | null} [lines]\n\t\t * @param {string} [classes='']\n\t\t * @returns {() => void}\n\t\t */\n\t\thighlightLines: function highlightLines(pre, lines, classes) {\n\t\t\tlines = typeof lines === 'string' ? lines : (pre.getAttribute('data-line') || '');\n\n\t\t\tvar ranges = lines.replace(/\\s+/g, '').split(',').filter(Boolean);\n\t\t\tvar offset = +pre.getAttribute('data-line-offset') || 0;\n\n\t\t\tvar parseMethod = isLineHeightRounded() ? parseInt : parseFloat;\n\t\t\tvar lineHeight = parseMethod(getComputedStyle(pre).lineHeight);\n\t\t\tvar hasLineNumbers = Prism.util.isActive(pre, LINE_NUMBERS_CLASS);\n\t\t\tvar codeElement = pre.querySelector('code');\n\t\t\tvar parentElement = hasLineNumbers ? pre : codeElement || pre;\n\t\t\tvar mutateActions = /** @type {(() => void)[]} */ ([]);\n\t\t\tvar lineBreakMatch = codeElement.textContent.match(NEW_LINE_EXP);\n\t\t\tvar numberOfLines = lineBreakMatch ? lineBreakMatch.length + 1 : 1;\n\t\t\t/**\n\t\t\t * The top offset between the content box of the <code> element and the content box of the parent element of\n\t\t\t * the line highlight element (either `<pre>` or `<code>`).\n\t\t\t *\n\t\t\t * This offset might not be zero for some themes where the <code> element has a top margin. Some plugins\n\t\t\t * (or users) might also add element above the <code> element. Because the line highlight is aligned relative\n\t\t\t * to the <pre> element, we have to take this into account.\n\t\t\t *\n\t\t\t * This offset will be 0 if the parent element of the line highlight element is the `<code>` element.\n\t\t\t */\n\t\t\tvar codePreOffset = !codeElement || parentElement == codeElement ? 0 : getContentBoxTopOffset(pre, codeElement);\n\n\t\t\tranges.forEach(function (currentRange) {\n\t\t\t\tvar range = currentRange.split('-');\n\n\t\t\t\tvar start = +range[0];\n\t\t\t\tvar end = +range[1] || start;\n\t\t\t\tend = Math.min(numberOfLines + offset, end);\n\n\t\t\t\tif (end < start) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t/** @type {HTMLElement} */\n\t\t\t\tvar line = pre.querySelector('.line-highlight[data-range=\"' + currentRange + '\"]') || document.createElement('div');\n\n\t\t\t\tmutateActions.push(function () {\n\t\t\t\t\tline.setAttribute('aria-hidden', 'true');\n\t\t\t\t\tline.setAttribute('data-range', currentRange);\n\t\t\t\t\tline.className = (classes || '') + ' line-highlight';\n\t\t\t\t});\n\n\t\t\t\t// if the line-numbers plugin is enabled, then there is no reason for this plugin to display the line numbers\n\t\t\t\tif (hasLineNumbers && Prism.plugins.lineNumbers) {\n\t\t\t\t\tvar startNode = Prism.plugins.lineNumbers.getLine(pre, start);\n\t\t\t\t\tvar endNode = Prism.plugins.lineNumbers.getLine(pre, end);\n\n\t\t\t\t\tif (startNode) {\n\t\t\t\t\t\tvar top = startNode.offsetTop + codePreOffset + 'px';\n\t\t\t\t\t\tmutateActions.push(function () {\n\t\t\t\t\t\t\tline.style.top = top;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (endNode) {\n\t\t\t\t\t\tvar height = (endNode.offsetTop - startNode.offsetTop) + endNode.offsetHeight + 'px';\n\t\t\t\t\t\tmutateActions.push(function () {\n\t\t\t\t\t\t\tline.style.height = height;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmutateActions.push(function () {\n\t\t\t\t\t\tline.setAttribute('data-start', String(start));\n\n\t\t\t\t\t\tif (end > start) {\n\t\t\t\t\t\t\tline.setAttribute('data-end', String(end));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tline.style.top = (start - offset - 1) * lineHeight + codePreOffset + 'px';\n\n\t\t\t\t\t\tline.textContent = new Array(end - start + 2).join(' \\n');\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tmutateActions.push(function () {\n\t\t\t\t\tline.style.width = pre.scrollWidth + 'px';\n\t\t\t\t});\n\n\t\t\t\tmutateActions.push(function () {\n\t\t\t\t\t// allow this to play nicely with the line-numbers plugin\n\t\t\t\t\t// need to attack to pre as when line-numbers is enabled, the code tag is relatively which screws up the positioning\n\t\t\t\t\tparentElement.appendChild(line);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tvar id = pre.id;\n\t\t\tif (hasLineNumbers && Prism.util.isActive(pre, LINKABLE_LINE_NUMBERS_CLASS) && id) {\n\t\t\t\t// This implements linkable line numbers. Linkable line numbers use Line Highlight to create a link to a\n\t\t\t\t// specific line. For this to work, the pre element has to:\n\t\t\t\t//  1) have line numbers,\n\t\t\t\t//  2) have the `linkable-line-numbers` class or an ascendant that has that class, and\n\t\t\t\t//  3) have an id.\n\n\t\t\t\tif (!hasClass(pre, LINKABLE_LINE_NUMBERS_CLASS)) {\n\t\t\t\t\t// add class to pre\n\t\t\t\t\tmutateActions.push(function () {\n\t\t\t\t\t\tpre.classList.add(LINKABLE_LINE_NUMBERS_CLASS);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tvar start = parseInt(pre.getAttribute('data-start') || '1');\n\n\t\t\t\t// iterate all line number spans\n\t\t\t\t$$('.line-numbers-rows > span', pre).forEach(function (lineSpan, i) {\n\t\t\t\t\tvar lineNumber = i + start;\n\t\t\t\t\tlineSpan.onclick = function () {\n\t\t\t\t\t\tvar hash = id + '.' + lineNumber;\n\n\t\t\t\t\t\t// this will prevent scrolling since the span is obviously in view\n\t\t\t\t\t\tscrollIntoView = false;\n\t\t\t\t\t\tlocation.hash = hash;\n\t\t\t\t\t\tsetTimeout(function () {\n\t\t\t\t\t\t\tscrollIntoView = true;\n\t\t\t\t\t\t}, 1);\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn function () {\n\t\t\t\tmutateActions.forEach(callFunction);\n\t\t\t};\n\t\t}\n\t};\n\n\n\tfunction applyHash() {\n\t\tvar hash = location.hash.slice(1);\n\n\t\t// Remove pre-existing temporary lines\n\t\t$$('.temporary.line-highlight').forEach(function (line) {\n\t\t\tline.parentNode.removeChild(line);\n\t\t});\n\n\t\tvar range = (hash.match(/\\.([\\d,-]+)$/) || [, ''])[1];\n\n\t\tif (!range || document.getElementById(hash)) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar id = hash.slice(0, hash.lastIndexOf('.'));\n\t\tvar pre = document.getElementById(id);\n\n\t\tif (!pre) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!pre.hasAttribute('data-line')) {\n\t\t\tpre.setAttribute('data-line', '');\n\t\t}\n\n\t\tvar mutateDom = Prism.plugins.lineHighlight.highlightLines(pre, range, 'temporary ');\n\t\tmutateDom();\n\n\t\tif (scrollIntoView) {\n\t\t\tdocument.querySelector('.temporary.line-highlight').scrollIntoView();\n\t\t}\n\t}\n\n\tvar fakeTimer = 0; // Hack to limit the number of times applyHash() runs\n\n\tPrism.hooks.add('before-sanity-check', function (env) {\n\t\tvar pre = env.element.parentElement;\n\t\tif (!isActiveFor(pre)) {\n\t\t\treturn;\n\t\t}\n\n\t\t/*\n\t\t * Cleanup for other plugins (e.g. autoloader).\n\t\t *\n\t\t * Sometimes <code> blocks are highlighted multiple times. It is necessary\n\t\t * to cleanup any left-over tags, because the whitespace inside of the <div>\n\t\t * tags change the content of the <code> tag.\n\t\t */\n\t\tvar num = 0;\n\t\t$$('.line-highlight', pre).forEach(function (line) {\n\t\t\tnum += line.textContent.length;\n\t\t\tline.parentNode.removeChild(line);\n\t\t});\n\t\t// Remove extra whitespace\n\t\tif (num && /^(?: \\n)+$/.test(env.code.slice(-num))) {\n\t\t\tenv.code = env.code.slice(0, -num);\n\t\t}\n\t});\n\n\tPrism.hooks.add('complete', function completeHook(env) {\n\t\tvar pre = env.element.parentElement;\n\t\tif (!isActiveFor(pre)) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearTimeout(fakeTimer);\n\n\t\tvar hasLineNumbers = Prism.plugins.lineNumbers;\n\t\tvar isLineNumbersLoaded = env.plugins && env.plugins.lineNumbers;\n\n\t\tif (hasClass(pre, LINE_NUMBERS_CLASS) && hasLineNumbers && !isLineNumbersLoaded) {\n\t\t\tPrism.hooks.add('line-numbers', completeHook);\n\t\t} else {\n\t\t\tvar mutateDom = Prism.plugins.lineHighlight.highlightLines(pre);\n\t\t\tmutateDom();\n\t\t\tfakeTimer = setTimeout(applyHash, 1);\n\t\t}\n\t});\n\n\twindow.addEventListener('hashchange', applyHash);\n\twindow.addEventListener('resize', function () {\n\t\tvar actions = $$('pre')\n\t\t\t.filter(isActiveFor)\n\t\t\t.map(function (pre) {\n\t\t\t\treturn Prism.plugins.lineHighlight.highlightLines(pre);\n\t\t\t});\n\t\tactions.forEach(callFunction);\n\t});\n\n}());\n","(function () {\n\n\tif (typeof Prism === 'undefined' || typeof document === 'undefined') {\n\t\treturn;\n\t}\n\n\tvar callbacks = [];\n\tvar map = {};\n\tvar noop = function () {};\n\n\tPrism.plugins.toolbar = {};\n\n\t/**\n\t * @typedef ButtonOptions\n\t * @property {string} text The text displayed.\n\t * @property {string} [url] The URL of the link which will be created.\n\t * @property {Function} [onClick] The event listener for the `click` event of the created button.\n\t * @property {string} [className] The class attribute to include with element.\n\t */\n\n\t/**\n\t * Register a button callback with the toolbar.\n\t *\n\t * @param {string} key\n\t * @param {ButtonOptions|Function} opts\n\t */\n\tvar registerButton = Prism.plugins.toolbar.registerButton = function (key, opts) {\n\t\tvar callback;\n\n\t\tif (typeof opts === 'function') {\n\t\t\tcallback = opts;\n\t\t} else {\n\t\t\tcallback = function (env) {\n\t\t\t\tvar element;\n\n\t\t\t\tif (typeof opts.onClick === 'function') {\n\t\t\t\t\telement = document.createElement('button');\n\t\t\t\t\telement.type = 'button';\n\t\t\t\t\telement.addEventListener('click', function () {\n\t\t\t\t\t\topts.onClick.call(this, env);\n\t\t\t\t\t});\n\t\t\t\t} else if (typeof opts.url === 'string') {\n\t\t\t\t\telement = document.createElement('a');\n\t\t\t\t\telement.href = opts.url;\n\t\t\t\t} else {\n\t\t\t\t\telement = document.createElement('span');\n\t\t\t\t}\n\n\t\t\t\tif (opts.className) {\n\t\t\t\t\telement.classList.add(opts.className);\n\t\t\t\t}\n\n\t\t\t\telement.textContent = opts.text;\n\n\t\t\t\treturn element;\n\t\t\t};\n\t\t}\n\n\t\tif (key in map) {\n\t\t\tconsole.warn('There is a button with the key \"' + key + '\" registered already.');\n\t\t\treturn;\n\t\t}\n\n\t\tcallbacks.push(map[key] = callback);\n\t};\n\n\t/**\n\t * Returns the callback order of the given element.\n\t *\n\t * @param {HTMLElement} element\n\t * @returns {string[] | undefined}\n\t */\n\tfunction getOrder(element) {\n\t\twhile (element) {\n\t\t\tvar order = element.getAttribute('data-toolbar-order');\n\t\t\tif (order != null) {\n\t\t\t\torder = order.trim();\n\t\t\t\tif (order.length) {\n\t\t\t\t\treturn order.split(/\\s*,\\s*/g);\n\t\t\t\t} else {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t}\n\t\t\telement = element.parentElement;\n\t\t}\n\t}\n\n\t/**\n\t * Post-highlight Prism hook callback.\n\t *\n\t * @param env\n\t */\n\tvar hook = Prism.plugins.toolbar.hook = function (env) {\n\t\t// Check if inline or actual code block (credit to line-numbers plugin)\n\t\tvar pre = env.element.parentNode;\n\t\tif (!pre || !/pre/i.test(pre.nodeName)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Autoloader rehighlights, so only do this once.\n\t\tif (pre.parentNode.classList.contains('code-toolbar')) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Create wrapper for <pre> to prevent scrolling toolbar with content\n\t\tvar wrapper = document.createElement('div');\n\t\twrapper.classList.add('code-toolbar');\n\t\tpre.parentNode.insertBefore(wrapper, pre);\n\t\twrapper.appendChild(pre);\n\n\t\t// Setup the toolbar\n\t\tvar toolbar = document.createElement('div');\n\t\ttoolbar.classList.add('toolbar');\n\n\t\t// order callbacks\n\t\tvar elementCallbacks = callbacks;\n\t\tvar order = getOrder(env.element);\n\t\tif (order) {\n\t\t\telementCallbacks = order.map(function (key) {\n\t\t\t\treturn map[key] || noop;\n\t\t\t});\n\t\t}\n\n\t\telementCallbacks.forEach(function (callback) {\n\t\t\tvar element = callback(env);\n\n\t\t\tif (!element) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar item = document.createElement('div');\n\t\t\titem.classList.add('toolbar-item');\n\n\t\t\titem.appendChild(element);\n\t\t\ttoolbar.appendChild(item);\n\t\t});\n\n\t\t// Add our toolbar to the currently created wrapper of <pre> tag\n\t\twrapper.appendChild(toolbar);\n\t};\n\n\tregisterButton('label', function (env) {\n\t\tvar pre = env.element.parentNode;\n\t\tif (!pre || !/pre/i.test(pre.nodeName)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!pre.hasAttribute('data-label')) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar element; var template;\n\t\tvar text = pre.getAttribute('data-label');\n\t\ttry {\n\t\t\t// Any normal text will blow up this selector.\n\t\t\ttemplate = document.querySelector('template#' + text);\n\t\t} catch (e) { /* noop */ }\n\n\t\tif (template) {\n\t\t\telement = template.content;\n\t\t} else {\n\t\t\tif (pre.hasAttribute('data-url')) {\n\t\t\t\telement = document.createElement('a');\n\t\t\t\telement.href = pre.getAttribute('data-url');\n\t\t\t} else {\n\t\t\t\telement = document.createElement('span');\n\t\t\t}\n\n\t\t\telement.textContent = text;\n\t\t}\n\n\t\treturn element;\n\t});\n\n\t/**\n\t * Register the toolbar with Prism.\n\t */\n\tPrism.hooks.add('complete', hook);\n}());\n","(function () {\n\n\tif (typeof Prism === 'undefined' || typeof document === 'undefined') {\n\t\treturn;\n\t}\n\n\tif (!Prism.plugins.toolbar) {\n\t\tconsole.warn('Copy to Clipboard plugin loaded before Toolbar plugin.');\n\n\t\treturn;\n\t}\n\n\t/**\n\t * When the given elements is clicked by the user, the given text will be copied to clipboard.\n\t *\n\t * @param {HTMLElement} element\n\t * @param {CopyInfo} copyInfo\n\t *\n\t * @typedef CopyInfo\n\t * @property {() => string} getText\n\t * @property {() => void} success\n\t * @property {(reason: unknown) => void} error\n\t */\n\tfunction registerClipboard(element, copyInfo) {\n\t\telement.addEventListener('click', function () {\n\t\t\tcopyTextToClipboard(copyInfo);\n\t\t});\n\t}\n\n\t// https://stackoverflow.com/a/30810322/7595472\n\n\t/** @param {CopyInfo} copyInfo */\n\tfunction fallbackCopyTextToClipboard(copyInfo) {\n\t\tvar textArea = document.createElement('textarea');\n\t\ttextArea.value = copyInfo.getText();\n\n\t\t// Avoid scrolling to bottom\n\t\ttextArea.style.top = '0';\n\t\ttextArea.style.left = '0';\n\t\ttextArea.style.position = 'fixed';\n\n\t\tdocument.body.appendChild(textArea);\n\t\ttextArea.focus();\n\t\ttextArea.select();\n\n\t\ttry {\n\t\t\tvar successful = document.execCommand('copy');\n\t\t\tsetTimeout(function () {\n\t\t\t\tif (successful) {\n\t\t\t\t\tcopyInfo.success();\n\t\t\t\t} else {\n\t\t\t\t\tcopyInfo.error();\n\t\t\t\t}\n\t\t\t}, 1);\n\t\t} catch (err) {\n\t\t\tsetTimeout(function () {\n\t\t\t\tcopyInfo.error(err);\n\t\t\t}, 1);\n\t\t}\n\n\t\tdocument.body.removeChild(textArea);\n\t}\n\t/** @param {CopyInfo} copyInfo */\n\tfunction copyTextToClipboard(copyInfo) {\n\t\tif (navigator.clipboard) {\n\t\t\tnavigator.clipboard.writeText(copyInfo.getText()).then(copyInfo.success, function () {\n\t\t\t\t// try the fallback in case `writeText` didn't work\n\t\t\t\tfallbackCopyTextToClipboard(copyInfo);\n\t\t\t});\n\t\t} else {\n\t\t\tfallbackCopyTextToClipboard(copyInfo);\n\t\t}\n\t}\n\n\t/**\n\t * Selects the text content of the given element.\n\t *\n\t * @param {Element} element\n\t */\n\tfunction selectElementText(element) {\n\t\t// https://stackoverflow.com/a/20079910/7595472\n\t\twindow.getSelection().selectAllChildren(element);\n\t}\n\n\t/**\n\t * Traverses up the DOM tree to find data attributes that override the default plugin settings.\n\t *\n\t * @param {Element} startElement An element to start from.\n\t * @returns {Settings} The plugin settings.\n\t * @typedef {Record<\"copy\" | \"copy-error\" | \"copy-success\" | \"copy-timeout\", string | number>} Settings\n\t */\n\tfunction getSettings(startElement) {\n\t\t/** @type {Settings} */\n\t\tvar settings = {\n\t\t\t'copy': 'Copy',\n\t\t\t'copy-error': 'Press Ctrl+C to copy',\n\t\t\t'copy-success': 'Copied!',\n\t\t\t'copy-timeout': 5000\n\t\t};\n\n\t\tvar prefix = 'data-prismjs-';\n\t\tfor (var key in settings) {\n\t\t\tvar attr = prefix + key;\n\t\t\tvar element = startElement;\n\t\t\twhile (element && !element.hasAttribute(attr)) {\n\t\t\t\telement = element.parentElement;\n\t\t\t}\n\t\t\tif (element) {\n\t\t\t\tsettings[key] = element.getAttribute(attr);\n\t\t\t}\n\t\t}\n\t\treturn settings;\n\t}\n\n\tPrism.plugins.toolbar.registerButton('copy-to-clipboard', function (env) {\n\t\tvar element = env.element;\n\n\t\tvar settings = getSettings(element);\n\n\t\tvar linkCopy = document.createElement('button');\n\t\tlinkCopy.className = 'copy-to-clipboard-button';\n\t\tlinkCopy.setAttribute('type', 'button');\n\t\tvar linkSpan = document.createElement('span');\n\t\tlinkCopy.appendChild(linkSpan);\n\n\t\tsetState('copy');\n\n\t\tregisterClipboard(linkCopy, {\n\t\t\tgetText: function () {\n\t\t\t\treturn element.textContent;\n\t\t\t},\n\t\t\tsuccess: function () {\n\t\t\t\tsetState('copy-success');\n\n\t\t\t\tresetText();\n\t\t\t},\n\t\t\terror: function () {\n\t\t\t\tsetState('copy-error');\n\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\tselectElementText(element);\n\t\t\t\t}, 1);\n\n\t\t\t\tresetText();\n\t\t\t}\n\t\t});\n\n\t\treturn linkCopy;\n\n\t\tfunction resetText() {\n\t\t\tsetTimeout(function () { setState('copy'); }, settings['copy-timeout']);\n\t\t}\n\n\t\t/** @param {\"copy\" | \"copy-error\" | \"copy-success\"} state */\n\t\tfunction setState(state) {\n\t\t\tlinkSpan.textContent = settings[state];\n\t\t\tlinkCopy.setAttribute('data-copy-state', state);\n\t\t}\n\t});\n}());\n","(function () {\n\n\tif (typeof Prism === 'undefined' || typeof document === 'undefined') {\n\t\treturn;\n\t}\n\n\tif (!Prism.plugins.toolbar) {\n\t\tconsole.warn('Show Languages plugin loaded before Toolbar plugin.');\n\n\t\treturn;\n\t}\n\n\t/* eslint-disable */\n\n\t// The languages map is built automatically with gulp\n\tvar Languages = /*languages_placeholder[*/{\n\t\t\"none\": \"Plain text\",\n\t\t\"plain\": \"Plain text\",\n\t\t\"plaintext\": \"Plain text\",\n\t\t\"text\": \"Plain text\",\n\t\t\"txt\": \"Plain text\",\n\t\t\"html\": \"HTML\",\n\t\t\"xml\": \"XML\",\n\t\t\"svg\": \"SVG\",\n\t\t\"mathml\": \"MathML\",\n\t\t\"ssml\": \"SSML\",\n\t\t\"rss\": \"RSS\",\n\t\t\"css\": \"CSS\",\n\t\t\"clike\": \"C-like\",\n\t\t\"js\": \"JavaScript\",\n\t\t\"abap\": \"ABAP\",\n\t\t\"abnf\": \"ABNF\",\n\t\t\"al\": \"AL\",\n\t\t\"antlr4\": \"ANTLR4\",\n\t\t\"g4\": \"ANTLR4\",\n\t\t\"apacheconf\": \"Apache Configuration\",\n\t\t\"apl\": \"APL\",\n\t\t\"aql\": \"AQL\",\n\t\t\"ino\": \"Arduino\",\n\t\t\"arff\": \"ARFF\",\n\t\t\"armasm\": \"ARM Assembly\",\n\t\t\"arm-asm\": \"ARM Assembly\",\n\t\t\"art\": \"Arturo\",\n\t\t\"asciidoc\": \"AsciiDoc\",\n\t\t\"adoc\": \"AsciiDoc\",\n\t\t\"aspnet\": \"ASP.NET (C#)\",\n\t\t\"asm6502\": \"6502 Assembly\",\n\t\t\"asmatmel\": \"Atmel AVR Assembly\",\n\t\t\"autohotkey\": \"AutoHotkey\",\n\t\t\"autoit\": \"AutoIt\",\n\t\t\"avisynth\": \"AviSynth\",\n\t\t\"avs\": \"AviSynth\",\n\t\t\"avro-idl\": \"Avro IDL\",\n\t\t\"avdl\": \"Avro IDL\",\n\t\t\"awk\": \"AWK\",\n\t\t\"gawk\": \"GAWK\",\n\t\t\"sh\": \"Shell\",\n\t\t\"basic\": \"BASIC\",\n\t\t\"bbcode\": \"BBcode\",\n\t\t\"bbj\": \"BBj\",\n\t\t\"bnf\": \"BNF\",\n\t\t\"rbnf\": \"RBNF\",\n\t\t\"bqn\": \"BQN\",\n\t\t\"bsl\": \"BSL (1C:Enterprise)\",\n\t\t\"oscript\": \"OneScript\",\n\t\t\"csharp\": \"C#\",\n\t\t\"cs\": \"C#\",\n\t\t\"dotnet\": \"C#\",\n\t\t\"cpp\": \"C++\",\n\t\t\"cfscript\": \"CFScript\",\n\t\t\"cfc\": \"CFScript\",\n\t\t\"cil\": \"CIL\",\n\t\t\"cilkc\": \"Cilk/C\",\n\t\t\"cilk-c\": \"Cilk/C\",\n\t\t\"cilkcpp\": \"Cilk/C++\",\n\t\t\"cilk-cpp\": \"Cilk/C++\",\n\t\t\"cilk\": \"Cilk/C++\",\n\t\t\"cmake\": \"CMake\",\n\t\t\"cobol\": \"COBOL\",\n\t\t\"coffee\": \"CoffeeScript\",\n\t\t\"conc\": \"Concurnas\",\n\t\t\"csp\": \"Content-Security-Policy\",\n\t\t\"css-extras\": \"CSS Extras\",\n\t\t\"csv\": \"CSV\",\n\t\t\"cue\": \"CUE\",\n\t\t\"dataweave\": \"DataWeave\",\n\t\t\"dax\": \"DAX\",\n\t\t\"django\": \"Django/Jinja2\",\n\t\t\"jinja2\": \"Django/Jinja2\",\n\t\t\"dns-zone-file\": \"DNS zone file\",\n\t\t\"dns-zone\": \"DNS zone file\",\n\t\t\"dockerfile\": \"Docker\",\n\t\t\"dot\": \"DOT (Graphviz)\",\n\t\t\"gv\": \"DOT (Graphviz)\",\n\t\t\"ebnf\": \"EBNF\",\n\t\t\"editorconfig\": \"EditorConfig\",\n\t\t\"ejs\": \"EJS\",\n\t\t\"etlua\": \"Embedded Lua templating\",\n\t\t\"erb\": \"ERB\",\n\t\t\"excel-formula\": \"Excel Formula\",\n\t\t\"xlsx\": \"Excel Formula\",\n\t\t\"xls\": \"Excel Formula\",\n\t\t\"fsharp\": \"F#\",\n\t\t\"firestore-security-rules\": \"Firestore security rules\",\n\t\t\"ftl\": \"FreeMarker Template Language\",\n\t\t\"gml\": \"GameMaker Language\",\n\t\t\"gamemakerlanguage\": \"GameMaker Language\",\n\t\t\"gap\": \"GAP (CAS)\",\n\t\t\"gcode\": \"G-code\",\n\t\t\"gdscript\": \"GDScript\",\n\t\t\"gedcom\": \"GEDCOM\",\n\t\t\"gettext\": \"gettext\",\n\t\t\"po\": \"gettext\",\n\t\t\"glsl\": \"GLSL\",\n\t\t\"gn\": \"GN\",\n\t\t\"gni\": \"GN\",\n\t\t\"linker-script\": \"GNU Linker Script\",\n\t\t\"ld\": \"GNU Linker Script\",\n\t\t\"go-module\": \"Go module\",\n\t\t\"go-mod\": \"Go module\",\n\t\t\"graphql\": \"GraphQL\",\n\t\t\"hbs\": \"Handlebars\",\n\t\t\"hs\": \"Haskell\",\n\t\t\"hcl\": \"HCL\",\n\t\t\"hlsl\": \"HLSL\",\n\t\t\"http\": \"HTTP\",\n\t\t\"hpkp\": \"HTTP Public-Key-Pins\",\n\t\t\"hsts\": \"HTTP Strict-Transport-Security\",\n\t\t\"ichigojam\": \"IchigoJam\",\n\t\t\"icu-message-format\": \"ICU Message Format\",\n\t\t\"idr\": \"Idris\",\n\t\t\"ignore\": \".ignore\",\n\t\t\"gitignore\": \".gitignore\",\n\t\t\"hgignore\": \".hgignore\",\n\t\t\"npmignore\": \".npmignore\",\n\t\t\"inform7\": \"Inform 7\",\n\t\t\"javadoc\": \"JavaDoc\",\n\t\t\"javadoclike\": \"JavaDoc-like\",\n\t\t\"javastacktrace\": \"Java stack trace\",\n\t\t\"jq\": \"JQ\",\n\t\t\"jsdoc\": \"JSDoc\",\n\t\t\"js-extras\": \"JS Extras\",\n\t\t\"json\": \"JSON\",\n\t\t\"webmanifest\": \"Web App Manifest\",\n\t\t\"json5\": \"JSON5\",\n\t\t\"jsonp\": \"JSONP\",\n\t\t\"jsstacktrace\": \"JS stack trace\",\n\t\t\"js-templates\": \"JS Templates\",\n\t\t\"keepalived\": \"Keepalived Configure\",\n\t\t\"kts\": \"Kotlin Script\",\n\t\t\"kt\": \"Kotlin\",\n\t\t\"kumir\": \"KuMir (КуМир)\",\n\t\t\"kum\": \"KuMir (КуМир)\",\n\t\t\"latex\": \"LaTeX\",\n\t\t\"tex\": \"TeX\",\n\t\t\"context\": \"ConTeXt\",\n\t\t\"lilypond\": \"LilyPond\",\n\t\t\"ly\": \"LilyPond\",\n\t\t\"emacs\": \"Lisp\",\n\t\t\"elisp\": \"Lisp\",\n\t\t\"emacs-lisp\": \"Lisp\",\n\t\t\"llvm\": \"LLVM IR\",\n\t\t\"log\": \"Log file\",\n\t\t\"lolcode\": \"LOLCODE\",\n\t\t\"magma\": \"Magma (CAS)\",\n\t\t\"md\": \"Markdown\",\n\t\t\"markup-templating\": \"Markup templating\",\n\t\t\"matlab\": \"MATLAB\",\n\t\t\"maxscript\": \"MAXScript\",\n\t\t\"mel\": \"MEL\",\n\t\t\"metafont\": \"METAFONT\",\n\t\t\"mongodb\": \"MongoDB\",\n\t\t\"moon\": \"MoonScript\",\n\t\t\"n1ql\": \"N1QL\",\n\t\t\"n4js\": \"N4JS\",\n\t\t\"n4jsd\": \"N4JS\",\n\t\t\"nand2tetris-hdl\": \"Nand To Tetris HDL\",\n\t\t\"naniscript\": \"Naninovel Script\",\n\t\t\"nani\": \"Naninovel Script\",\n\t\t\"nasm\": \"NASM\",\n\t\t\"neon\": \"NEON\",\n\t\t\"nginx\": \"nginx\",\n\t\t\"nsis\": \"NSIS\",\n\t\t\"objectivec\": \"Objective-C\",\n\t\t\"objc\": \"Objective-C\",\n\t\t\"ocaml\": \"OCaml\",\n\t\t\"opencl\": \"OpenCL\",\n\t\t\"openqasm\": \"OpenQasm\",\n\t\t\"qasm\": \"OpenQasm\",\n\t\t\"parigp\": \"PARI/GP\",\n\t\t\"objectpascal\": \"Object Pascal\",\n\t\t\"psl\": \"PATROL Scripting Language\",\n\t\t\"pcaxis\": \"PC-Axis\",\n\t\t\"px\": \"PC-Axis\",\n\t\t\"peoplecode\": \"PeopleCode\",\n\t\t\"pcode\": \"PeopleCode\",\n\t\t\"php\": \"PHP\",\n\t\t\"phpdoc\": \"PHPDoc\",\n\t\t\"php-extras\": \"PHP Extras\",\n\t\t\"plant-uml\": \"PlantUML\",\n\t\t\"plantuml\": \"PlantUML\",\n\t\t\"plsql\": \"PL/SQL\",\n\t\t\"powerquery\": \"PowerQuery\",\n\t\t\"pq\": \"PowerQuery\",\n\t\t\"mscript\": \"PowerQuery\",\n\t\t\"powershell\": \"PowerShell\",\n\t\t\"promql\": \"PromQL\",\n\t\t\"properties\": \".properties\",\n\t\t\"protobuf\": \"Protocol Buffers\",\n\t\t\"purebasic\": \"PureBasic\",\n\t\t\"pbfasm\": \"PureBasic\",\n\t\t\"purs\": \"PureScript\",\n\t\t\"py\": \"Python\",\n\t\t\"qsharp\": \"Q#\",\n\t\t\"qs\": \"Q#\",\n\t\t\"q\": \"Q (kdb+ database)\",\n\t\t\"qml\": \"QML\",\n\t\t\"rkt\": \"Racket\",\n\t\t\"cshtml\": \"Razor C#\",\n\t\t\"razor\": \"Razor C#\",\n\t\t\"jsx\": \"React JSX\",\n\t\t\"tsx\": \"React TSX\",\n\t\t\"renpy\": \"Ren'py\",\n\t\t\"rpy\": \"Ren'py\",\n\t\t\"res\": \"ReScript\",\n\t\t\"rest\": \"reST (reStructuredText)\",\n\t\t\"robotframework\": \"Robot Framework\",\n\t\t\"robot\": \"Robot Framework\",\n\t\t\"rb\": \"Ruby\",\n\t\t\"sas\": \"SAS\",\n\t\t\"sass\": \"Sass (Sass)\",\n\t\t\"scss\": \"Sass (SCSS)\",\n\t\t\"shell-session\": \"Shell session\",\n\t\t\"sh-session\": \"Shell session\",\n\t\t\"shellsession\": \"Shell session\",\n\t\t\"sml\": \"SML\",\n\t\t\"smlnj\": \"SML/NJ\",\n\t\t\"solidity\": \"Solidity (Ethereum)\",\n\t\t\"sol\": \"Solidity (Ethereum)\",\n\t\t\"solution-file\": \"Solution file\",\n\t\t\"sln\": \"Solution file\",\n\t\t\"soy\": \"Soy (Closure Template)\",\n\t\t\"sparql\": \"SPARQL\",\n\t\t\"rq\": \"SPARQL\",\n\t\t\"splunk-spl\": \"Splunk SPL\",\n\t\t\"sqf\": \"SQF: Status Quo Function (Arma 3)\",\n\t\t\"sql\": \"SQL\",\n\t\t\"stata\": \"Stata Ado\",\n\t\t\"iecst\": \"Structured Text (IEC 61131-3)\",\n\t\t\"supercollider\": \"SuperCollider\",\n\t\t\"sclang\": \"SuperCollider\",\n\t\t\"systemd\": \"Systemd configuration file\",\n\t\t\"t4-templating\": \"T4 templating\",\n\t\t\"t4-cs\": \"T4 Text Templates (C#)\",\n\t\t\"t4\": \"T4 Text Templates (C#)\",\n\t\t\"t4-vb\": \"T4 Text Templates (VB)\",\n\t\t\"tap\": \"TAP\",\n\t\t\"tt2\": \"Template Toolkit 2\",\n\t\t\"toml\": \"TOML\",\n\t\t\"trickle\": \"trickle\",\n\t\t\"troy\": \"troy\",\n\t\t\"trig\": \"TriG\",\n\t\t\"ts\": \"TypeScript\",\n\t\t\"tsconfig\": \"TSConfig\",\n\t\t\"uscript\": \"UnrealScript\",\n\t\t\"uc\": \"UnrealScript\",\n\t\t\"uorazor\": \"UO Razor Script\",\n\t\t\"uri\": \"URI\",\n\t\t\"url\": \"URL\",\n\t\t\"vbnet\": \"VB.Net\",\n\t\t\"vhdl\": \"VHDL\",\n\t\t\"vim\": \"vim\",\n\t\t\"visual-basic\": \"Visual Basic\",\n\t\t\"vba\": \"VBA\",\n\t\t\"vb\": \"Visual Basic\",\n\t\t\"wasm\": \"WebAssembly\",\n\t\t\"web-idl\": \"Web IDL\",\n\t\t\"webidl\": \"Web IDL\",\n\t\t\"wgsl\": \"WGSL\",\n\t\t\"wiki\": \"Wiki markup\",\n\t\t\"wolfram\": \"Wolfram language\",\n\t\t\"nb\": \"Mathematica Notebook\",\n\t\t\"wl\": \"Wolfram language\",\n\t\t\"xeoracube\": \"XeoraCube\",\n\t\t\"xml-doc\": \"XML doc (.net)\",\n\t\t\"xojo\": \"Xojo (REALbasic)\",\n\t\t\"xquery\": \"XQuery\",\n\t\t\"yaml\": \"YAML\",\n\t\t\"yml\": \"YAML\",\n\t\t\"yang\": \"YANG\"\n\t}/*]*/;\n\n\t/* eslint-enable */\n\n\tPrism.plugins.toolbar.registerButton('show-language', function (env) {\n\t\tvar pre = env.element.parentNode;\n\t\tif (!pre || !/pre/i.test(pre.nodeName)) {\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * Tries to guess the name of a language given its id.\n\t\t *\n\t\t * @param {string} id The language id.\n\t\t * @returns {string}\n\t\t */\n\t\tfunction guessTitle(id) {\n\t\t\tif (!id) {\n\t\t\t\treturn id;\n\t\t\t}\n\t\t\treturn (id.substring(0, 1).toUpperCase() + id.substring(1)).replace(/s(?=cript)/, 'S');\n\t\t}\n\n\t\tvar language = pre.getAttribute('data-language') || Languages[env.language] || guessTitle(env.language);\n\n\t\tif (!language) {\n\t\t\treturn;\n\t\t}\n\t\tvar element = document.createElement('span');\n\t\telement.textContent = language;\n\n\t\treturn element;\n\t});\n\n}());\n","(function () {\n\n\tif (typeof Prism === 'undefined') {\n\t\treturn;\n\t}\n\n\tvar assign = Object.assign || function (obj1, obj2) {\n\t\tfor (var name in obj2) {\n\t\t\tif (obj2.hasOwnProperty(name)) {\n\t\t\t\tobj1[name] = obj2[name];\n\t\t\t}\n\t\t}\n\t\treturn obj1;\n\t};\n\n\tfunction NormalizeWhitespace(defaults) {\n\t\tthis.defaults = assign({}, defaults);\n\t}\n\n\tfunction toCamelCase(value) {\n\t\treturn value.replace(/-(\\w)/g, function (match, firstChar) {\n\t\t\treturn firstChar.toUpperCase();\n\t\t});\n\t}\n\n\tfunction tabLen(str) {\n\t\tvar res = 0;\n\t\tfor (var i = 0; i < str.length; ++i) {\n\t\t\tif (str.charCodeAt(i) == '\\t'.charCodeAt(0)) {\n\t\t\t\tres += 3;\n\t\t\t}\n\t\t}\n\t\treturn str.length + res;\n\t}\n\n\tvar settingsConfig = {\n\t\t'remove-trailing': 'boolean',\n\t\t'remove-indent': 'boolean',\n\t\t'left-trim': 'boolean',\n\t\t'right-trim': 'boolean',\n\t\t'break-lines': 'number',\n\t\t'indent': 'number',\n\t\t'remove-initial-line-feed': 'boolean',\n\t\t'tabs-to-spaces': 'number',\n\t\t'spaces-to-tabs': 'number',\n\t};\n\n\tNormalizeWhitespace.prototype = {\n\t\tsetDefaults: function (defaults) {\n\t\t\tthis.defaults = assign(this.defaults, defaults);\n\t\t},\n\t\tnormalize: function (input, settings) {\n\t\t\tsettings = assign(this.defaults, settings);\n\n\t\t\tfor (var name in settings) {\n\t\t\t\tvar methodName = toCamelCase(name);\n\t\t\t\tif (name !== 'normalize' && methodName !== 'setDefaults' &&\n\t\t\t\t\tsettings[name] && this[methodName]) {\n\t\t\t\t\tinput = this[methodName].call(this, input, settings[name]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn input;\n\t\t},\n\n\t\t/*\n\t\t * Normalization methods\n\t\t */\n\t\tleftTrim: function (input) {\n\t\t\treturn input.replace(/^\\s+/, '');\n\t\t},\n\t\trightTrim: function (input) {\n\t\t\treturn input.replace(/\\s+$/, '');\n\t\t},\n\t\ttabsToSpaces: function (input, spaces) {\n\t\t\tspaces = spaces|0 || 4;\n\t\t\treturn input.replace(/\\t/g, new Array(++spaces).join(' '));\n\t\t},\n\t\tspacesToTabs: function (input, spaces) {\n\t\t\tspaces = spaces|0 || 4;\n\t\t\treturn input.replace(RegExp(' {' + spaces + '}', 'g'), '\\t');\n\t\t},\n\t\tremoveTrailing: function (input) {\n\t\t\treturn input.replace(/\\s*?$/gm, '');\n\t\t},\n\t\t// Support for deprecated plugin remove-initial-line-feed\n\t\tremoveInitialLineFeed: function (input) {\n\t\t\treturn input.replace(/^(?:\\r?\\n|\\r)/, '');\n\t\t},\n\t\tremoveIndent: function (input) {\n\t\t\tvar indents = input.match(/^[^\\S\\n\\r]*(?=\\S)/gm);\n\n\t\t\tif (!indents || !indents[0].length) {\n\t\t\t\treturn input;\n\t\t\t}\n\n\t\t\tindents.sort(function (a, b) { return a.length - b.length; });\n\n\t\t\tif (!indents[0].length) {\n\t\t\t\treturn input;\n\t\t\t}\n\n\t\t\treturn input.replace(RegExp('^' + indents[0], 'gm'), '');\n\t\t},\n\t\tindent: function (input, tabs) {\n\t\t\treturn input.replace(/^[^\\S\\n\\r]*(?=\\S)/gm, new Array(++tabs).join('\\t') + '$&');\n\t\t},\n\t\tbreakLines: function (input, characters) {\n\t\t\tcharacters = (characters === true) ? 80 : characters|0 || 80;\n\n\t\t\tvar lines = input.split('\\n');\n\t\t\tfor (var i = 0; i < lines.length; ++i) {\n\t\t\t\tif (tabLen(lines[i]) <= characters) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tvar line = lines[i].split(/(\\s+)/g);\n\t\t\t\tvar len = 0;\n\n\t\t\t\tfor (var j = 0; j < line.length; ++j) {\n\t\t\t\t\tvar tl = tabLen(line[j]);\n\t\t\t\t\tlen += tl;\n\t\t\t\t\tif (len > characters) {\n\t\t\t\t\t\tline[j] = '\\n' + line[j];\n\t\t\t\t\t\tlen = tl;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlines[i] = line.join('');\n\t\t\t}\n\t\t\treturn lines.join('\\n');\n\t\t}\n\t};\n\n\t// Support node modules\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tmodule.exports = NormalizeWhitespace;\n\t}\n\n\tPrism.plugins.NormalizeWhitespace = new NormalizeWhitespace({\n\t\t'remove-trailing': true,\n\t\t'remove-indent': true,\n\t\t'left-trim': true,\n\t\t'right-trim': true,\n\t\t/*'break-lines': 80,\n\t\t'indent': 2,\n\t\t'remove-initial-line-feed': false,\n\t\t'tabs-to-spaces': 4,\n\t\t'spaces-to-tabs': 4*/\n\t});\n\n\tPrism.hooks.add('before-sanity-check', function (env) {\n\t\tvar Normalizer = Prism.plugins.NormalizeWhitespace;\n\n\t\t// Check settings\n\t\tif (env.settings && env.settings['whitespace-normalization'] === false) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Check classes\n\t\tif (!Prism.util.isActive(env.element, 'whitespace-normalization', true)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Simple mode if there is no env.element\n\t\tif ((!env.element || !env.element.parentNode) && env.code) {\n\t\t\tenv.code = Normalizer.normalize(env.code, env.settings);\n\t\t\treturn;\n\t\t}\n\n\t\t// Normal mode\n\t\tvar pre = env.element.parentNode;\n\t\tif (!env.code || !pre || pre.nodeName.toLowerCase() !== 'pre') {\n\t\t\treturn;\n\t\t}\n\n\t\tif (env.settings == null) { env.settings = {}; }\n\n\t\t// Read settings from 'data-' attributes\n\t\tfor (var key in settingsConfig) {\n\t\t\tif (Object.hasOwnProperty.call(settingsConfig, key)) {\n\t\t\t\tvar settingType = settingsConfig[key];\n\t\t\t\tif (pre.hasAttribute('data-' + key)) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvar value = JSON.parse(pre.getAttribute('data-' + key) || 'true');\n\t\t\t\t\t\tif (typeof value === settingType) {\n\t\t\t\t\t\t\tenv.settings[key] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (_error) {\n\t\t\t\t\t\t// ignore error\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar children = pre.childNodes;\n\t\tvar before = '';\n\t\tvar after = '';\n\t\tvar codeFound = false;\n\n\t\t// Move surrounding whitespace from the <pre> tag into the <code> tag\n\t\tfor (var i = 0; i < children.length; ++i) {\n\t\t\tvar node = children[i];\n\n\t\t\tif (node == env.element) {\n\t\t\t\tcodeFound = true;\n\t\t\t} else if (node.nodeName === '#text') {\n\t\t\t\tif (codeFound) {\n\t\t\t\t\tafter += node.nodeValue;\n\t\t\t\t} else {\n\t\t\t\t\tbefore += node.nodeValue;\n\t\t\t\t}\n\n\t\t\t\tpre.removeChild(node);\n\t\t\t\t--i;\n\t\t\t}\n\t\t}\n\n\t\tif (!env.element.children.length || !Prism.plugins.KeepMarkup) {\n\t\t\tenv.code = before + env.code + after;\n\t\t\tenv.code = Normalizer.normalize(env.code, env.settings);\n\t\t} else {\n\t\t\t// Preserve markup for keep-markup plugin\n\t\t\tvar html = before + env.element.innerHTML + after;\n\t\t\tenv.element.innerHTML = Normalizer.normalize(html, env.settings);\n\t\t\tenv.code = env.element.textContent;\n\t\t}\n\t});\n\n}());\n","/*! http://mths.be/base64 v0.1.0 by @mathias | MIT license */\n;(function(root) {\n\n\t// Detect free variables `exports`.\n\tvar freeExports = typeof exports == 'object' && exports;\n\n\t// Detect free variable `module`.\n\tvar freeModule = typeof module == 'object' && module &&\n\t\tmodule.exports == freeExports && module;\n\n\t// Detect free variable `global`, from Node.js or Browserified code, and use\n\t// it as `root`.\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {\n\t\troot = freeGlobal;\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\tvar InvalidCharacterError = function(message) {\n\t\tthis.message = message;\n\t};\n\tInvalidCharacterError.prototype = new Error;\n\tInvalidCharacterError.prototype.name = 'InvalidCharacterError';\n\n\tvar error = function(message) {\n\t\t// Note: the error messages used throughout this file match those used by\n\t\t// the native `atob`/`btoa` implementation in Chromium.\n\t\tthrow new InvalidCharacterError(message);\n\t};\n\n\tvar TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\t// http://whatwg.org/html/common-microsyntaxes.html#space-character\n\tvar REGEX_SPACE_CHARACTERS = /[\\t\\n\\f\\r ]/g;\n\n\t// `decode` is designed to be fully compatible with `atob` as described in the\n\t// HTML Standard. http://whatwg.org/html/webappapis.html#dom-windowbase64-atob\n\t// The optimized base64-decoding algorithm used is based on @atk’s excellent\n\t// implementation. https://gist.github.com/atk/1020396\n\tvar decode = function(input) {\n\t\tinput = String(input)\n\t\t\t.replace(REGEX_SPACE_CHARACTERS, '');\n\t\tvar length = input.length;\n\t\tif (length % 4 == 0) {\n\t\t\tinput = input.replace(/==?$/, '');\n\t\t\tlength = input.length;\n\t\t}\n\t\tif (\n\t\t\tlength % 4 == 1 ||\n\t\t\t// http://whatwg.org/C#alphanumeric-ascii-characters\n\t\t\t/[^+a-zA-Z0-9/]/.test(input)\n\t\t) {\n\t\t\terror(\n\t\t\t\t'Invalid character: the string to be decoded is not correctly encoded.'\n\t\t\t);\n\t\t}\n\t\tvar bitCounter = 0;\n\t\tvar bitStorage;\n\t\tvar buffer;\n\t\tvar output = '';\n\t\tvar position = -1;\n\t\twhile (++position < length) {\n\t\t\tbuffer = TABLE.indexOf(input.charAt(position));\n\t\t\tbitStorage = bitCounter % 4 ? bitStorage * 64 + buffer : buffer;\n\t\t\t// Unless this is the first of a group of 4 characters…\n\t\t\tif (bitCounter++ % 4) {\n\t\t\t\t// …convert the first 8 bits to a single ASCII character.\n\t\t\t\toutput += String.fromCharCode(\n\t\t\t\t\t0xFF & bitStorage >> (-2 * bitCounter & 6)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t};\n\n\t// `encode` is designed to be fully compatible with `btoa` as described in the\n\t// HTML Standard: http://whatwg.org/html/webappapis.html#dom-windowbase64-btoa\n\tvar encode = function(input) {\n\t\tinput = String(input);\n\t\tif (/[^\\0-\\xFF]/.test(input)) {\n\t\t\t// Note: no need to special-case astral symbols here, as surrogates are\n\t\t\t// matched, and the input is supposed to only contain ASCII anyway.\n\t\t\terror(\n\t\t\t\t'The string to be encoded contains characters outside of the ' +\n\t\t\t\t'Latin1 range.'\n\t\t\t);\n\t\t}\n\t\tvar padding = input.length % 3;\n\t\tvar output = '';\n\t\tvar position = -1;\n\t\tvar a;\n\t\tvar b;\n\t\tvar c;\n\t\tvar d;\n\t\tvar buffer;\n\t\t// Make sure any padding is handled outside of the loop.\n\t\tvar length = input.length - padding;\n\n\t\twhile (++position < length) {\n\t\t\t// Read three bytes, i.e. 24 bits.\n\t\t\ta = input.charCodeAt(position) << 16;\n\t\t\tb = input.charCodeAt(++position) << 8;\n\t\t\tc = input.charCodeAt(++position);\n\t\t\tbuffer = a + b + c;\n\t\t\t// Turn the 24 bits into four chunks of 6 bits each, and append the\n\t\t\t// matching character for each of them to the output.\n\t\t\toutput += (\n\t\t\t\tTABLE.charAt(buffer >> 18 & 0x3F) +\n\t\t\t\tTABLE.charAt(buffer >> 12 & 0x3F) +\n\t\t\t\tTABLE.charAt(buffer >> 6 & 0x3F) +\n\t\t\t\tTABLE.charAt(buffer & 0x3F)\n\t\t\t);\n\t\t}\n\n\t\tif (padding == 2) {\n\t\t\ta = input.charCodeAt(position) << 8;\n\t\t\tb = input.charCodeAt(++position);\n\t\t\tbuffer = a + b;\n\t\t\toutput += (\n\t\t\t\tTABLE.charAt(buffer >> 10) +\n\t\t\t\tTABLE.charAt((buffer >> 4) & 0x3F) +\n\t\t\t\tTABLE.charAt((buffer << 2) & 0x3F) +\n\t\t\t\t'='\n\t\t\t);\n\t\t} else if (padding == 1) {\n\t\t\tbuffer = input.charCodeAt(position);\n\t\t\toutput += (\n\t\t\t\tTABLE.charAt(buffer >> 2) +\n\t\t\t\tTABLE.charAt((buffer << 4) & 0x3F) +\n\t\t\t\t'=='\n\t\t\t);\n\t\t}\n\n\t\treturn output;\n\t};\n\n\tvar base64 = {\n\t\t'encode': encode,\n\t\t'decode': decode,\n\t\t'version': '0.1.0'\n\t};\n\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttypeof define == 'function' &&\n\t\ttypeof define.amd == 'object' &&\n\t\tdefine.amd\n\t) {\n\t\tdefine(function() {\n\t\t\treturn base64;\n\t\t});\n\t}\telse if (freeExports && !freeExports.nodeType) {\n\t\tif (freeModule) { // in Node.js or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = base64;\n\t\t} else { // in Narwhal or RingoJS v0.7.0-\n\t\t\tfor (var key in base64) {\n\t\t\t\tbase64.hasOwnProperty(key) && (freeExports[key] = base64[key]);\n\t\t\t}\n\t\t}\n\t} else { // in Rhino or a web browser\n\t\troot.base64 = base64;\n\t}\n\n}(this));\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"io\"] = factory();\n\telse\n\t\troot[\"io\"] = factory();\n})(self, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 17);\n","\r\n/**\r\n * Expose `Emitter`.\r\n */\r\n\r\nif (typeof module !== 'undefined') {\r\n  module.exports = Emitter;\r\n}\r\n\r\n/**\r\n * Initialize a new `Emitter`.\r\n *\r\n * @api public\r\n */\r\n\r\nfunction Emitter(obj) {\r\n  if (obj) return mixin(obj);\r\n};\r\n\r\n/**\r\n * Mixin the emitter properties.\r\n *\r\n * @param {Object} obj\r\n * @return {Object}\r\n * @api private\r\n */\r\n\r\nfunction mixin(obj) {\r\n  for (var key in Emitter.prototype) {\r\n    obj[key] = Emitter.prototype[key];\r\n  }\r\n  return obj;\r\n}\r\n\r\n/**\r\n * Listen on the given `event` with `fn`.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.on =\r\nEmitter.prototype.addEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n  (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\r\n    .push(fn);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Adds an `event` listener that will be invoked a single\r\n * time then automatically removed.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.once = function(event, fn){\r\n  function on() {\r\n    this.off(event, on);\r\n    fn.apply(this, arguments);\r\n  }\r\n\r\n  on.fn = fn;\r\n  this.on(event, on);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Remove the given callback for `event` or all\r\n * registered callbacks.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.off =\r\nEmitter.prototype.removeListener =\r\nEmitter.prototype.removeAllListeners =\r\nEmitter.prototype.removeEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n\r\n  // all\r\n  if (0 == arguments.length) {\r\n    this._callbacks = {};\r\n    return this;\r\n  }\r\n\r\n  // specific event\r\n  var callbacks = this._callbacks['$' + event];\r\n  if (!callbacks) return this;\r\n\r\n  // remove all handlers\r\n  if (1 == arguments.length) {\r\n    delete this._callbacks['$' + event];\r\n    return this;\r\n  }\r\n\r\n  // remove specific handler\r\n  var cb;\r\n  for (var i = 0; i < callbacks.length; i++) {\r\n    cb = callbacks[i];\r\n    if (cb === fn || cb.fn === fn) {\r\n      callbacks.splice(i, 1);\r\n      break;\r\n    }\r\n  }\r\n\r\n  // Remove event specific arrays for event types that no\r\n  // one is subscribed for to avoid memory leak.\r\n  if (callbacks.length === 0) {\r\n    delete this._callbacks['$' + event];\r\n  }\r\n\r\n  return this;\r\n};\r\n\r\n/**\r\n * Emit `event` with the given args.\r\n *\r\n * @param {String} event\r\n * @param {Mixed} ...\r\n * @return {Emitter}\r\n */\r\n\r\nEmitter.prototype.emit = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n\r\n  var args = new Array(arguments.length - 1)\r\n    , callbacks = this._callbacks['$' + event];\r\n\r\n  for (var i = 1; i < arguments.length; i++) {\r\n    args[i - 1] = arguments[i];\r\n  }\r\n\r\n  if (callbacks) {\r\n    callbacks = callbacks.slice(0);\r\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\r\n      callbacks[i].apply(this, args);\r\n    }\r\n  }\r\n\r\n  return this;\r\n};\r\n\r\n/**\r\n * Return array of callbacks for `event`.\r\n *\r\n * @param {String} event\r\n * @return {Array}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.listeners = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n  return this._callbacks['$' + event] || [];\r\n};\r\n\r\n/**\r\n * Check if this emitter has `event` handlers.\r\n *\r\n * @param {String} event\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.hasListeners = function(event){\r\n  return !! this.listeners(event).length;\r\n};\r\n","const encodePacket = require(\"./encodePacket\");\nconst decodePacket = require(\"./decodePacket\");\n\nconst SEPARATOR = String.fromCharCode(30); // see https://en.wikipedia.org/wiki/Delimiter#ASCII_delimited_text\n\nconst encodePayload = (packets, callback) => {\n  // some packets may be added to the array while encoding, so the initial length must be saved\n  const length = packets.length;\n  const encodedPackets = new Array(length);\n  let count = 0;\n\n  packets.forEach((packet, i) => {\n    // force base64 encoding for binary packets\n    encodePacket(packet, false, encodedPacket => {\n      encodedPackets[i] = encodedPacket;\n      if (++count === length) {\n        callback(encodedPackets.join(SEPARATOR));\n      }\n    });\n  });\n};\n\nconst decodePayload = (encodedPayload, binaryType) => {\n  const encodedPackets = encodedPayload.split(SEPARATOR);\n  const packets = [];\n  for (let i = 0; i < encodedPackets.length; i++) {\n    const decodedPacket = decodePacket(encodedPackets[i], binaryType);\n    packets.push(decodedPacket);\n    if (decodedPacket.type === \"error\") {\n      break;\n    }\n  }\n  return packets;\n};\n\nmodule.exports = {\n  protocol: 4,\n  encodePacket,\n  encodePayload,\n  decodePacket,\n  decodePayload\n};\n","module.exports = (() => {\n  if (typeof self !== \"undefined\") {\n    return self;\n  } else if (typeof window !== \"undefined\") {\n    return window;\n  } else {\n    return Function(\"return this\")();\n  }\n})();\n","const parser = require(\"engine.io-parser\");\nconst Emitter = require(\"component-emitter\");\n\nclass Transport extends Emitter {\n  /**\n   * Transport abstract constructor.\n   *\n   * @param {Object} options.\n   * @api private\n   */\n  constructor(opts) {\n    super();\n\n    this.opts = opts;\n    this.query = opts.query;\n    this.readyState = \"\";\n    this.socket = opts.socket;\n  }\n\n  /**\n   * Emits an error.\n   *\n   * @param {String} str\n   * @return {Transport} for chaining\n   * @api public\n   */\n  onError(msg, desc) {\n    const err = new Error(msg);\n    err.type = \"TransportError\";\n    err.description = desc;\n    this.emit(\"error\", err);\n    return this;\n  }\n\n  /**\n   * Opens the transport.\n   *\n   * @api public\n   */\n  open() {\n    if (\"closed\" === this.readyState || \"\" === this.readyState) {\n      this.readyState = \"opening\";\n      this.doOpen();\n    }\n\n    return this;\n  }\n\n  /**\n   * Closes the transport.\n   *\n   * @api private\n   */\n  close() {\n    if (\"opening\" === this.readyState || \"open\" === this.readyState) {\n      this.doClose();\n      this.onClose();\n    }\n\n    return this;\n  }\n\n  /**\n   * Sends multiple packets.\n   *\n   * @param {Array} packets\n   * @api private\n   */\n  send(packets) {\n    if (\"open\" === this.readyState) {\n      this.write(packets);\n    } else {\n      throw new Error(\"Transport not open\");\n    }\n  }\n\n  /**\n   * Called upon open\n   *\n   * @api private\n   */\n  onOpen() {\n    this.readyState = \"open\";\n    this.writable = true;\n    this.emit(\"open\");\n  }\n\n  /**\n   * Called with data.\n   *\n   * @param {String} data\n   * @api private\n   */\n  onData(data) {\n    const packet = parser.decodePacket(data, this.socket.binaryType);\n    this.onPacket(packet);\n  }\n\n  /**\n   * Called with a decoded packet.\n   */\n  onPacket(packet) {\n    this.emit(\"packet\", packet);\n  }\n\n  /**\n   * Called upon close.\n   *\n   * @api private\n   */\n  onClose() {\n    this.readyState = \"closed\";\n    this.emit(\"close\");\n  }\n}\n\nmodule.exports = Transport;\n","/**\n * Compiles a querystring\n * Returns string representation of the object\n *\n * @param {Object}\n * @api private\n */\n\nexports.encode = function (obj) {\n  var str = '';\n\n  for (var i in obj) {\n    if (obj.hasOwnProperty(i)) {\n      if (str.length) str += '&';\n      str += encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]);\n    }\n  }\n\n  return str;\n};\n\n/**\n * Parses a simple querystring into an object\n *\n * @param {String} qs\n * @api private\n */\n\nexports.decode = function(qs){\n  var qry = {};\n  var pairs = qs.split('&');\n  for (var i = 0, l = pairs.length; i < l; i++) {\n    var pair = pairs[i].split('=');\n    qry[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n  }\n  return qry;\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Decoder = exports.Encoder = exports.PacketType = exports.protocol = void 0;\nconst Emitter = require(\"component-emitter\");\nconst binary_1 = require(\"./binary\");\nconst is_binary_1 = require(\"./is-binary\");\n\n\n/**\n * Protocol version.\n *\n * @public\n */\nexports.protocol = 5;\nvar PacketType;\n(function (PacketType) {\n    PacketType[PacketType[\"CONNECT\"] = 0] = \"CONNECT\";\n    PacketType[PacketType[\"DISCONNECT\"] = 1] = \"DISCONNECT\";\n    PacketType[PacketType[\"EVENT\"] = 2] = \"EVENT\";\n    PacketType[PacketType[\"ACK\"] = 3] = \"ACK\";\n    PacketType[PacketType[\"CONNECT_ERROR\"] = 4] = \"CONNECT_ERROR\";\n    PacketType[PacketType[\"BINARY_EVENT\"] = 5] = \"BINARY_EVENT\";\n    PacketType[PacketType[\"BINARY_ACK\"] = 6] = \"BINARY_ACK\";\n})(PacketType = exports.PacketType || (exports.PacketType = {}));\n/**\n * A socket.io Encoder instance\n */\nclass Encoder {\n    /**\n     * Encode a packet as a single string if non-binary, or as a\n     * buffer sequence, depending on packet type.\n     *\n     * @param {Object} obj - packet object\n     */\n    encode(obj) {\n\n\n        if (obj.type === PacketType.EVENT || obj.type === PacketType.ACK) {\n            if (is_binary_1.hasBinary(obj)) {\n                obj.type =\n                    obj.type === PacketType.EVENT\n                        ? PacketType.BINARY_EVENT\n                        : PacketType.BINARY_ACK;\n                return this.encodeAsBinary(obj);\n            }\n        }\n        return [this.encodeAsString(obj)];\n    }\n    /**\n     * Encode packet as string.\n     */\n    encodeAsString(obj) {\n        // first is type\n        let str = \"\" + obj.type;\n        // attachments if we have them\n        if (obj.type === PacketType.BINARY_EVENT ||\n            obj.type === PacketType.BINARY_ACK) {\n            str += obj.attachments + \"-\";\n        }\n        // if we have a namespace other than `/`\n        // we append it followed by a comma `,`\n        if (obj.nsp && \"/\" !== obj.nsp) {\n            str += obj.nsp + \",\";\n        }\n        // immediately followed by the id\n        if (null != obj.id) {\n            str += obj.id;\n        }\n        // json data\n        if (null != obj.data) {\n            str += JSON.stringify(obj.data);\n        }\n\n\n        return str;\n    }\n    /**\n     * Encode packet as 'buffer sequence' by removing blobs, and\n     * deconstructing packet into object with placeholders and\n     * a list of buffers.\n     */\n    encodeAsBinary(obj) {\n        const deconstruction = binary_1.deconstructPacket(obj);\n        const pack = this.encodeAsString(deconstruction.packet);\n        const buffers = deconstruction.buffers;\n        buffers.unshift(pack); // add packet info to beginning of data list\n        return buffers; // write all the buffers\n    }\n}\nexports.Encoder = Encoder;\n/**\n * A socket.io Decoder instance\n *\n * @return {Object} decoder\n */\nclass Decoder extends Emitter {\n    constructor() {\n        super();\n    }\n    /**\n     * Decodes an encoded packet string into packet JSON.\n     *\n     * @param {String} obj - encoded packet\n     */\n    add(obj) {\n        let packet;\n        if (typeof obj === \"string\") {\n            packet = this.decodeString(obj);\n            if (packet.type === PacketType.BINARY_EVENT ||\n                packet.type === PacketType.BINARY_ACK) {\n                // binary packet's json\n                this.reconstructor = new BinaryReconstructor(packet);\n                // no attachments, labeled binary but no binary data to follow\n                if (packet.attachments === 0) {\n                    super.emit(\"decoded\", packet);\n                }\n            }\n            else {\n                // non-binary full packet\n                super.emit(\"decoded\", packet);\n            }\n        }\n        else if (is_binary_1.isBinary(obj) || obj.base64) {\n            // raw binary data\n            if (!this.reconstructor) {\n                throw new Error(\"got binary data when not reconstructing a packet\");\n            }\n            else {\n                packet = this.reconstructor.takeBinaryData(obj);\n                if (packet) {\n                    // received final buffer\n                    this.reconstructor = null;\n                    super.emit(\"decoded\", packet);\n                }\n            }\n        }\n        else {\n            throw new Error(\"Unknown type: \" + obj);\n        }\n    }\n    /**\n     * Decode a packet String (JSON data)\n     *\n     * @param {String} str\n     * @return {Object} packet\n     */\n    decodeString(str) {\n        let i = 0;\n        // look up type\n        const p = {\n            type: Number(str.charAt(0)),\n        };\n        if (PacketType[p.type] === undefined) {\n            throw new Error(\"unknown packet type \" + p.type);\n        }\n        // look up attachments if type binary\n        if (p.type === PacketType.BINARY_EVENT ||\n            p.type === PacketType.BINARY_ACK) {\n            const start = i + 1;\n            while (str.charAt(++i) !== \"-\" && i != str.length) { }\n            const buf = str.substring(start, i);\n            if (buf != Number(buf) || str.charAt(i) !== \"-\") {\n                throw new Error(\"Illegal attachments\");\n            }\n            p.attachments = Number(buf);\n        }\n        // look up namespace (if any)\n        if (\"/\" === str.charAt(i + 1)) {\n            const start = i + 1;\n            while (++i) {\n                const c = str.charAt(i);\n                if (\",\" === c)\n                    break;\n                if (i === str.length)\n                    break;\n            }\n            p.nsp = str.substring(start, i);\n        }\n        else {\n            p.nsp = \"/\";\n        }\n        // look up id\n        const next = str.charAt(i + 1);\n        if (\"\" !== next && Number(next) == next) {\n            const start = i + 1;\n            while (++i) {\n                const c = str.charAt(i);\n                if (null == c || Number(c) != c) {\n                    --i;\n                    break;\n                }\n                if (i === str.length)\n                    break;\n            }\n            p.id = Number(str.substring(start, i + 1));\n        }\n        // look up json data\n        if (str.charAt(++i)) {\n            const payload = tryParse(str.substr(i));\n            if (Decoder.isPayloadValid(p.type, payload)) {\n                p.data = payload;\n            }\n            else {\n                throw new Error(\"invalid payload\");\n            }\n        }\n\n\n        return p;\n    }\n    static isPayloadValid(type, payload) {\n        switch (type) {\n            case PacketType.CONNECT:\n                return typeof payload === \"object\";\n            case PacketType.DISCONNECT:\n                return payload === undefined;\n            case PacketType.CONNECT_ERROR:\n                return typeof payload === \"string\" || typeof payload === \"object\";\n            case PacketType.EVENT:\n            case PacketType.BINARY_EVENT:\n                return Array.isArray(payload) && payload.length > 0;\n            case PacketType.ACK:\n            case PacketType.BINARY_ACK:\n                return Array.isArray(payload);\n        }\n    }\n    /**\n     * Deallocates a parser's resources\n     */\n    destroy() {\n        if (this.reconstructor) {\n            this.reconstructor.finishedReconstruction();\n        }\n    }\n}\nexports.Decoder = Decoder;\nfunction tryParse(str) {\n    try {\n        return JSON.parse(str);\n    }\n    catch (e) {\n        return false;\n    }\n}\n/**\n * A manager of a binary event's 'buffer sequence'. Should\n * be constructed whenever a packet of type BINARY_EVENT is\n * decoded.\n *\n * @param {Object} packet\n * @return {BinaryReconstructor} initialized reconstructor\n */\nclass BinaryReconstructor {\n    constructor(packet) {\n        this.packet = packet;\n        this.buffers = [];\n        this.reconPack = packet;\n    }\n    /**\n     * Method to be called when binary data received from connection\n     * after a BINARY_EVENT packet.\n     *\n     * @param {Buffer | ArrayBuffer} binData - the raw binary data received\n     * @return {null | Object} returns null if more binary data is expected or\n     *   a reconstructed packet object if all buffers have been received.\n     */\n    takeBinaryData(binData) {\n        this.buffers.push(binData);\n        if (this.buffers.length === this.reconPack.attachments) {\n            // done with buffer list\n            const packet = binary_1.reconstructPacket(this.reconPack, this.buffers);\n            this.finishedReconstruction();\n            return packet;\n        }\n        return null;\n    }\n    /**\n     * Cleans up binary packet reconstruction variables.\n     */\n    finishedReconstruction() {\n        this.reconPack = null;\n        this.buffers = [];\n    }\n}\n","/**\n * Parses an URI\n *\n * @author Steven Levithan <stevenlevithan.com> (MIT license)\n * @api private\n */\n\nvar re = /^(?:(?![^:@]+:[^:@\\/]*@)(http|https|ws|wss):\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\n\nvar parts = [\n    'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'\n];\n\nmodule.exports = function parseuri(str) {\n    var src = str,\n        b = str.indexOf('['),\n        e = str.indexOf(']');\n\n    if (b != -1 && e != -1) {\n        str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length);\n    }\n\n    var m = re.exec(str || ''),\n        uri = {},\n        i = 14;\n\n    while (i--) {\n        uri[parts[i]] = m[i] || '';\n    }\n\n    if (b != -1 && e != -1) {\n        uri.source = src;\n        uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':');\n        uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':');\n        uri.ipv6uri = true;\n    }\n\n    uri.pathNames = pathNames(uri, uri['path']);\n    uri.queryKey = queryKey(uri, uri['query']);\n\n    return uri;\n};\n\nfunction pathNames(obj, path) {\n    var regx = /\\/{2,9}/g,\n        names = path.replace(regx, \"/\").split(\"/\");\n\n    if (path.substr(0, 1) == '/' || path.length === 0) {\n        names.splice(0, 1);\n    }\n    if (path.substr(path.length - 1, 1) == '/') {\n        names.splice(names.length - 1, 1);\n    }\n\n    return names;\n}\n\nfunction queryKey(uri, query) {\n    var data = {};\n\n    query.replace(/(?:^|&)([^&=]*)=?([^&]*)/g, function ($0, $1, $2) {\n        if ($1) {\n            data[$1] = $2;\n        }\n    });\n\n    return data;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Manager = void 0;\nconst eio = require(\"engine.io-client\");\nconst socket_1 = require(\"./socket\");\nconst Emitter = require(\"component-emitter\");\nconst parser = require(\"socket.io-parser\");\nconst on_1 = require(\"./on\");\nconst Backoff = require(\"backo2\");\n\n\nclass Manager extends Emitter {\n    constructor(uri, opts) {\n        super();\n        this.nsps = {};\n        this.subs = [];\n        if (uri && \"object\" === typeof uri) {\n            opts = uri;\n            uri = undefined;\n        }\n        opts = opts || {};\n        opts.path = opts.path || \"/socket.io\";\n        this.opts = opts;\n        this.reconnection(opts.reconnection !== false);\n        this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);\n        this.reconnectionDelay(opts.reconnectionDelay || 1000);\n        this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);\n        this.randomizationFactor(opts.randomizationFactor || 0.5);\n        this.backoff = new Backoff({\n            min: this.reconnectionDelay(),\n            max: this.reconnectionDelayMax(),\n            jitter: this.randomizationFactor(),\n        });\n        this.timeout(null == opts.timeout ? 20000 : opts.timeout);\n        this._readyState = \"closed\";\n        this.uri = uri;\n        const _parser = opts.parser || parser;\n        this.encoder = new _parser.Encoder();\n        this.decoder = new _parser.Decoder();\n        this._autoConnect = opts.autoConnect !== false;\n        if (this._autoConnect)\n            this.open();\n    }\n    reconnection(v) {\n        if (!arguments.length)\n            return this._reconnection;\n        this._reconnection = !!v;\n        return this;\n    }\n    reconnectionAttempts(v) {\n        if (v === undefined)\n            return this._reconnectionAttempts;\n        this._reconnectionAttempts = v;\n        return this;\n    }\n    reconnectionDelay(v) {\n        var _a;\n        if (v === undefined)\n            return this._reconnectionDelay;\n        this._reconnectionDelay = v;\n        (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMin(v);\n        return this;\n    }\n    randomizationFactor(v) {\n        var _a;\n        if (v === undefined)\n            return this._randomizationFactor;\n        this._randomizationFactor = v;\n        (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setJitter(v);\n        return this;\n    }\n    reconnectionDelayMax(v) {\n        var _a;\n        if (v === undefined)\n            return this._reconnectionDelayMax;\n        this._reconnectionDelayMax = v;\n        (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMax(v);\n        return this;\n    }\n    timeout(v) {\n        if (!arguments.length)\n            return this._timeout;\n        this._timeout = v;\n        return this;\n    }\n    /**\n     * Starts trying to reconnect if reconnection is enabled and we have not\n     * started reconnecting yet\n     *\n     * @private\n     */\n    maybeReconnectOnOpen() {\n        // Only try to reconnect if it's the first time we're connecting\n        if (!this._reconnecting &&\n            this._reconnection &&\n            this.backoff.attempts === 0) {\n            // keeps reconnection from firing twice for the same reconnection loop\n            this.reconnect();\n        }\n    }\n    /**\n     * Sets the current transport `socket`.\n     *\n     * @param {Function} fn - optional, callback\n     * @return self\n     * @public\n     */\n    open(fn) {\n\n\n        if (~this._readyState.indexOf(\"open\"))\n            return this;\n\n\n        this.engine = eio(this.uri, this.opts);\n        const socket = this.engine;\n        const self = this;\n        this._readyState = \"opening\";\n        this.skipReconnect = false;\n        // emit `open`\n        const openSubDestroy = on_1.on(socket, \"open\", function () {\n            self.onopen();\n            fn && fn();\n        });\n        // emit `error`\n        const errorSub = on_1.on(socket, \"error\", (err) => {\n\n\n            self.cleanup();\n            self._readyState = \"closed\";\n            super.emit(\"error\", err);\n            if (fn) {\n                fn(err);\n            }\n            else {\n                // Only do this if there is no fn to handle the error\n                self.maybeReconnectOnOpen();\n            }\n        });\n        if (false !== this._timeout) {\n            const timeout = this._timeout;\n\n\n            if (timeout === 0) {\n                openSubDestroy(); // prevents a race condition with the 'open' event\n            }\n            // set timer\n            const timer = setTimeout(() => {\n\n\n                openSubDestroy();\n                socket.close();\n                socket.emit(\"error\", new Error(\"timeout\"));\n            }, timeout);\n            this.subs.push(function subDestroy() {\n                clearTimeout(timer);\n            });\n        }\n        this.subs.push(openSubDestroy);\n        this.subs.push(errorSub);\n        return this;\n    }\n    /**\n     * Alias for open()\n     *\n     * @return self\n     * @public\n     */\n    connect(fn) {\n        return this.open(fn);\n    }\n    /**\n     * Called upon transport open.\n     *\n     * @private\n     */\n    onopen() {\n\n\n        // clear old subs\n        this.cleanup();\n        // mark as open\n        this._readyState = \"open\";\n        super.emit(\"open\");\n        // add new subs\n        const socket = this.engine;\n        this.subs.push(on_1.on(socket, \"ping\", this.onping.bind(this)), on_1.on(socket, \"data\", this.ondata.bind(this)), on_1.on(socket, \"error\", this.onerror.bind(this)), on_1.on(socket, \"close\", this.onclose.bind(this)), on_1.on(this.decoder, \"decoded\", this.ondecoded.bind(this)));\n    }\n    /**\n     * Called upon a ping.\n     *\n     * @private\n     */\n    onping() {\n        super.emit(\"ping\");\n    }\n    /**\n     * Called with data.\n     *\n     * @private\n     */\n    ondata(data) {\n        this.decoder.add(data);\n    }\n    /**\n     * Called when parser fully decodes a packet.\n     *\n     * @private\n     */\n    ondecoded(packet) {\n        super.emit(\"packet\", packet);\n    }\n    /**\n     * Called upon socket error.\n     *\n     * @private\n     */\n    onerror(err) {\n\n\n        super.emit(\"error\", err);\n    }\n    /**\n     * Creates a new socket for the given `nsp`.\n     *\n     * @return {Socket}\n     * @public\n     */\n    socket(nsp, opts) {\n        let socket = this.nsps[nsp];\n        if (!socket) {\n            socket = new socket_1.Socket(this, nsp, opts);\n            this.nsps[nsp] = socket;\n        }\n        return socket;\n    }\n    /**\n     * Called upon a socket close.\n     *\n     * @param socket\n     * @private\n     */\n    _destroy(socket) {\n        const nsps = Object.keys(this.nsps);\n        for (const nsp of nsps) {\n            const socket = this.nsps[nsp];\n            if (socket.active) {\n\n\n                return;\n            }\n        }\n        this._close();\n    }\n    /**\n     * Writes a packet.\n     *\n     * @param packet\n     * @private\n     */\n    _packet(packet) {\n\n\n        const encodedPackets = this.encoder.encode(packet);\n        for (let i = 0; i < encodedPackets.length; i++) {\n            this.engine.write(encodedPackets[i], packet.options);\n        }\n    }\n    /**\n     * Clean up transport subscriptions and packet buffer.\n     *\n     * @private\n     */\n    cleanup() {\n\n\n        this.subs.forEach((subDestroy) => subDestroy());\n        this.subs.length = 0;\n        this.decoder.destroy();\n    }\n    /**\n     * Close the current socket.\n     *\n     * @private\n     */\n    _close() {\n\n\n        this.skipReconnect = true;\n        this._reconnecting = false;\n        if (\"opening\" === this._readyState) {\n            // `onclose` will not fire because\n            // an open event never happened\n            this.cleanup();\n        }\n        this.backoff.reset();\n        this._readyState = \"closed\";\n        if (this.engine)\n            this.engine.close();\n    }\n    /**\n     * Alias for close()\n     *\n     * @private\n     */\n    disconnect() {\n        return this._close();\n    }\n    /**\n     * Called upon engine close.\n     *\n     * @private\n     */\n    onclose(reason) {\n\n\n        this.cleanup();\n        this.backoff.reset();\n        this._readyState = \"closed\";\n        super.emit(\"close\", reason);\n        if (this._reconnection && !this.skipReconnect) {\n            this.reconnect();\n        }\n    }\n    /**\n     * Attempt a reconnection.\n     *\n     * @private\n     */\n    reconnect() {\n        if (this._reconnecting || this.skipReconnect)\n            return this;\n        const self = this;\n        if (this.backoff.attempts >= this._reconnectionAttempts) {\n\n\n            this.backoff.reset();\n            super.emit(\"reconnect_failed\");\n            this._reconnecting = false;\n        }\n        else {\n            const delay = this.backoff.duration();\n\n\n            this._reconnecting = true;\n            const timer = setTimeout(() => {\n                if (self.skipReconnect)\n                    return;\n\n\n                super.emit(\"reconnect_attempt\", self.backoff.attempts);\n                // check again for the case socket closed in above events\n                if (self.skipReconnect)\n                    return;\n                self.open((err) => {\n                    if (err) {\n\n\n                        self._reconnecting = false;\n                        self.reconnect();\n                        super.emit(\"reconnect_error\", err);\n                    }\n                    else {\n\n\n                        self.onreconnect();\n                    }\n                });\n            }, delay);\n            this.subs.push(function subDestroy() {\n                clearTimeout(timer);\n            });\n        }\n    }\n    /**\n     * Called upon successful reconnect.\n     *\n     * @private\n     */\n    onreconnect() {\n        const attempt = this.backoff.attempts;\n        this._reconnecting = false;\n        this.backoff.reset();\n        super.emit(\"reconnect\", attempt);\n    }\n}\nexports.Manager = Manager;\n","const XMLHttpRequest = require(\"xmlhttprequest-ssl\");\nconst XHR = require(\"./polling-xhr\");\nconst JSONP = require(\"./polling-jsonp\");\nconst websocket = require(\"./websocket\");\n\nexports.polling = polling;\nexports.websocket = websocket;\n\n/**\n * Polling transport polymorphic constructor.\n * Decides on xhr vs jsonp based on feature detection.\n *\n * @api private\n */\n\nfunction polling(opts) {\n  let xhr;\n  let xd = false;\n  let xs = false;\n  const jsonp = false !== opts.jsonp;\n\n  if (typeof location !== \"undefined\") {\n    const isSSL = \"https:\" === location.protocol;\n    let port = location.port;\n\n    // some user agents have empty `location.port`\n    if (!port) {\n      port = isSSL ? 443 : 80;\n    }\n\n    xd = opts.hostname !== location.hostname || port !== opts.port;\n    xs = opts.secure !== isSSL;\n  }\n\n  opts.xdomain = xd;\n  opts.xscheme = xs;\n  xhr = new XMLHttpRequest(opts);\n\n  if (\"open\" in xhr && !opts.forceJSONP) {\n    return new XHR(opts);\n  } else {\n    if (!jsonp) throw new Error(\"JSONP disabled\");\n    return new JSONP(opts);\n  }\n}\n","// browser shim for xmlhttprequest module\n\nconst hasCORS = require(\"has-cors\");\nconst globalThis = require(\"./globalThis\");\n\nmodule.exports = function(opts) {\n  const xdomain = opts.xdomain;\n\n  // scheme must be same when usign XDomainRequest\n  // http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx\n  const xscheme = opts.xscheme;\n\n  // XDomainRequest has a flow of not sending cookie, therefore it should be disabled as a default.\n  // https://github.com/Automattic/engine.io-client/pull/217\n  const enablesXDR = opts.enablesXDR;\n\n  // XMLHttpRequest can be disabled on IE\n  try {\n    if (\"undefined\" !== typeof XMLHttpRequest && (!xdomain || hasCORS)) {\n      return new XMLHttpRequest();\n    }\n  } catch (e) {}\n\n  // Use XDomainRequest for IE8 if enablesXDR is true\n  // because loading bar keeps flashing when using jsonp-polling\n  // https://github.com/yujiosaka/socke.io-ie8-loading-example\n  try {\n    if (\"undefined\" !== typeof XDomainRequest && !xscheme && enablesXDR) {\n      return new XDomainRequest();\n    }\n  } catch (e) {}\n\n  if (!xdomain) {\n    try {\n      return new globalThis[[\"Active\"].concat(\"Object\").join(\"X\")](\n        \"Microsoft.XMLHTTP\"\n      );\n    } catch (e) {}\n  }\n};\n","const Transport = require(\"../transport\");\nconst parseqs = require(\"parseqs\");\nconst parser = require(\"engine.io-parser\");\nconst yeast = require(\"yeast\");\n\n\n\n\nclass Polling extends Transport {\n  /**\n   * Transport name.\n   */\n  get name() {\n    return \"polling\";\n  }\n\n  /**\n   * Opens the socket (triggers polling). We write a PING message to determine\n   * when the transport is open.\n   *\n   * @api private\n   */\n  doOpen() {\n    this.poll();\n  }\n\n  /**\n   * Pauses polling.\n   *\n   * @param {Function} callback upon buffers are flushed and transport is paused\n   * @api private\n   */\n  pause(onPause) {\n    const self = this;\n\n    this.readyState = \"pausing\";\n\n    function pause() {\n\n\n      self.readyState = \"paused\";\n      onPause();\n    }\n\n    if (this.polling || !this.writable) {\n      let total = 0;\n\n      if (this.polling) {\n\n\n        total++;\n        this.once(\"pollComplete\", function() {\n\n\n          --total || pause();\n        });\n      }\n\n      if (!this.writable) {\n\n\n        total++;\n        this.once(\"drain\", function() {\n\n\n          --total || pause();\n        });\n      }\n    } else {\n      pause();\n    }\n  }\n\n  /**\n   * Starts polling cycle.\n   *\n   * @api public\n   */\n  poll() {\n\n\n    this.polling = true;\n    this.doPoll();\n    this.emit(\"poll\");\n  }\n\n  /**\n   * Overloads onData to detect payloads.\n   *\n   * @api private\n   */\n  onData(data) {\n    const self = this;\n\n\n    const callback = function(packet, index, total) {\n      // if its the first message we consider the transport open\n      if (\"opening\" === self.readyState && packet.type === \"open\") {\n        self.onOpen();\n      }\n\n      // if its a close packet, we close the ongoing requests\n      if (\"close\" === packet.type) {\n        self.onClose();\n        return false;\n      }\n\n      // otherwise bypass onData and handle the message\n      self.onPacket(packet);\n    };\n\n    // decode payload\n    parser.decodePayload(data, this.socket.binaryType).forEach(callback);\n\n    // if an event did not trigger closing\n    if (\"closed\" !== this.readyState) {\n      // if we got data we're not polling\n      this.polling = false;\n      this.emit(\"pollComplete\");\n\n      if (\"open\" === this.readyState) {\n        this.poll();\n      } else {\n\n\n      }\n    }\n  }\n\n  /**\n   * For polling, send a close packet.\n   *\n   * @api private\n   */\n  doClose() {\n    const self = this;\n\n    function close() {\n\n\n      self.write([{ type: \"close\" }]);\n    }\n\n    if (\"open\" === this.readyState) {\n\n\n      close();\n    } else {\n      // in case we're trying to close while\n      // handshaking is in progress (GH-164)\n\n\n      this.once(\"open\", close);\n    }\n  }\n\n  /**\n   * Writes a packets payload.\n   *\n   * @param {Array} data packets\n   * @param {Function} drain callback\n   * @api private\n   */\n  write(packets) {\n    this.writable = false;\n\n    parser.encodePayload(packets, data => {\n      this.doWrite(data, () => {\n        this.writable = true;\n        this.emit(\"drain\");\n      });\n    });\n  }\n\n  /**\n   * Generates uri for connection.\n   *\n   * @api private\n   */\n  uri() {\n    let query = this.query || {};\n    const schema = this.opts.secure ? \"https\" : \"http\";\n    let port = \"\";\n\n    // cache busting is forced\n    if (false !== this.opts.timestampRequests) {\n      query[this.opts.timestampParam] = yeast();\n    }\n\n    if (!this.supportsBinary && !query.sid) {\n      query.b64 = 1;\n    }\n\n    query = parseqs.encode(query);\n\n    // avoid port if default for schema\n    if (\n      this.opts.port &&\n      ((\"https\" === schema && Number(this.opts.port) !== 443) ||\n        (\"http\" === schema && Number(this.opts.port) !== 80))\n    ) {\n      port = \":\" + this.opts.port;\n    }\n\n    // prepend ? to query\n    if (query.length) {\n      query = \"?\" + query;\n    }\n\n    const ipv6 = this.opts.hostname.indexOf(\":\") !== -1;\n    return (\n      schema +\n      \"://\" +\n      (ipv6 ? \"[\" + this.opts.hostname + \"]\" : this.opts.hostname) +\n      port +\n      this.opts.path +\n      query\n    );\n  }\n}\n\nmodule.exports = Polling;\n","const PACKET_TYPES = Object.create(null); // no Map = no polyfill\nPACKET_TYPES[\"open\"] = \"0\";\nPACKET_TYPES[\"close\"] = \"1\";\nPACKET_TYPES[\"ping\"] = \"2\";\nPACKET_TYPES[\"pong\"] = \"3\";\nPACKET_TYPES[\"message\"] = \"4\";\nPACKET_TYPES[\"upgrade\"] = \"5\";\nPACKET_TYPES[\"noop\"] = \"6\";\n\nconst PACKET_TYPES_REVERSE = Object.create(null);\nObject.keys(PACKET_TYPES).forEach(key => {\n  PACKET_TYPES_REVERSE[PACKET_TYPES[key]] = key;\n});\n\nconst ERROR_PACKET = { type: \"error\", data: \"parser error\" };\n\nmodule.exports = {\n  PACKET_TYPES,\n  PACKET_TYPES_REVERSE,\n  ERROR_PACKET\n};\n","'use strict';\n\nvar alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_'.split('')\n  , length = 64\n  , map = {}\n  , seed = 0\n  , i = 0\n  , prev;\n\n/**\n * Return a string representing the specified number.\n *\n * @param {Number} num The number to convert.\n * @returns {String} The string representation of the number.\n * @api public\n */\nfunction encode(num) {\n  var encoded = '';\n\n  do {\n    encoded = alphabet[num % length] + encoded;\n    num = Math.floor(num / length);\n  } while (num > 0);\n\n  return encoded;\n}\n\n/**\n * Return the integer value specified by the given string.\n *\n * @param {String} str The string to convert.\n * @returns {Number} The integer value represented by the string.\n * @api public\n */\nfunction decode(str) {\n  var decoded = 0;\n\n  for (i = 0; i < str.length; i++) {\n    decoded = decoded * length + map[str.charAt(i)];\n  }\n\n  return decoded;\n}\n\n/**\n * Yeast: A tiny growing id generator.\n *\n * @returns {String} A unique id.\n * @api public\n */\nfunction yeast() {\n  var now = encode(+new Date());\n\n  if (now !== prev) return seed = 0, prev = now;\n  return now +'.'+ encode(seed++);\n}\n\n//\n// Map each character to its index.\n//\nfor (; i < length; i++) map[alphabet[i]] = i;\n\n//\n// Expose the `yeast`, `encode` and `decode` functions.\n//\nyeast.encode = encode;\nyeast.decode = decode;\nmodule.exports = yeast;\n","module.exports.pick = (obj, ...attr) => {\n  return attr.reduce((acc, k) => {\n    if (obj.hasOwnProperty(k)) {\n      acc[k] = obj[k];\n    }\n    return acc;\n  }, {});\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Socket = void 0;\nconst socket_io_parser_1 = require(\"socket.io-parser\");\nconst Emitter = require(\"component-emitter\");\nconst on_1 = require(\"./on\");\n\n\n/**\n * Internal events.\n * These events can't be emitted by the user.\n */\nconst RESERVED_EVENTS = Object.freeze({\n    connect: 1,\n    connect_error: 1,\n    disconnect: 1,\n    disconnecting: 1,\n    // EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener\n    newListener: 1,\n    removeListener: 1,\n});\nclass Socket extends Emitter {\n    /**\n     * `Socket` constructor.\n     *\n     * @public\n     */\n    constructor(io, nsp, opts) {\n        super();\n        this.receiveBuffer = [];\n        this.sendBuffer = [];\n        this.ids = 0;\n        this.acks = {};\n        this.flags = {};\n        this.io = io;\n        this.nsp = nsp;\n        this.ids = 0;\n        this.acks = {};\n        this.receiveBuffer = [];\n        this.sendBuffer = [];\n        this.connected = false;\n        this.disconnected = true;\n        this.flags = {};\n        if (opts && opts.auth) {\n            this.auth = opts.auth;\n        }\n        if (this.io._autoConnect)\n            this.open();\n    }\n    /**\n     * Subscribe to open, close and packet events\n     *\n     * @private\n     */\n    subEvents() {\n        if (this.subs)\n            return;\n        const io = this.io;\n        this.subs = [\n            on_1.on(io, \"open\", this.onopen.bind(this)),\n            on_1.on(io, \"packet\", this.onpacket.bind(this)),\n            on_1.on(io, \"error\", this.onerror.bind(this)),\n            on_1.on(io, \"close\", this.onclose.bind(this)),\n        ];\n    }\n    /**\n     * Whether the Socket will try to reconnect when its Manager connects or reconnects\n     */\n    get active() {\n        return !!this.subs;\n    }\n    /**\n     * \"Opens\" the socket.\n     *\n     * @public\n     */\n    connect() {\n        if (this.connected)\n            return this;\n        this.subEvents();\n        if (!this.io[\"_reconnecting\"])\n            this.io.open(); // ensure open\n        if (\"open\" === this.io._readyState)\n            this.onopen();\n        return this;\n    }\n    /**\n     * Alias for connect()\n     */\n    open() {\n        return this.connect();\n    }\n    /**\n     * Sends a `message` event.\n     *\n     * @return self\n     * @public\n     */\n    send(...args) {\n        args.unshift(\"message\");\n        this.emit.apply(this, args);\n        return this;\n    }\n    /**\n     * Override `emit`.\n     * If the event is in `events`, it's emitted normally.\n     *\n     * @param ev - event name\n     * @return self\n     * @public\n     */\n    emit(ev, ...args) {\n        if (RESERVED_EVENTS.hasOwnProperty(ev)) {\n            throw new Error('\"' + ev + '\" is a reserved event name');\n        }\n        args.unshift(ev);\n        const packet = {\n            type: socket_io_parser_1.PacketType.EVENT,\n            data: args,\n        };\n        packet.options = {};\n        packet.options.compress = this.flags.compress !== false;\n        // event ack callback\n        if (\"function\" === typeof args[args.length - 1]) {\n\n\n            this.acks[this.ids] = args.pop();\n            packet.id = this.ids++;\n        }\n        const isTransportWritable = this.io.engine &&\n            this.io.engine.transport &&\n            this.io.engine.transport.writable;\n        const discardPacket = this.flags.volatile && (!isTransportWritable || !this.connected);\n        if (discardPacket) {\n\n\n        }\n        else if (this.connected) {\n            this.packet(packet);\n        }\n        else {\n            this.sendBuffer.push(packet);\n        }\n        this.flags = {};\n        return this;\n    }\n    /**\n     * Sends a packet.\n     *\n     * @param packet\n     * @private\n     */\n    packet(packet) {\n        packet.nsp = this.nsp;\n        this.io._packet(packet);\n    }\n    /**\n     * Called upon engine `open`.\n     *\n     * @private\n     */\n    onopen() {\n\n\n        if (typeof this.auth == \"function\") {\n            this.auth((data) => {\n                this.packet({ type: socket_io_parser_1.PacketType.CONNECT, data });\n            });\n        }\n        else {\n            this.packet({ type: socket_io_parser_1.PacketType.CONNECT, data: this.auth });\n        }\n    }\n    /**\n     * Called upon engine or manager `error`.\n     *\n     * @param err\n     * @private\n     */\n    onerror(err) {\n        if (!this.connected) {\n            super.emit(\"connect_error\", err);\n        }\n    }\n    /**\n     * Called upon engine `close`.\n     *\n     * @param reason\n     * @private\n     */\n    onclose(reason) {\n\n\n        this.connected = false;\n        this.disconnected = true;\n        delete this.id;\n        super.emit(\"disconnect\", reason);\n    }\n    /**\n     * Called with socket packet.\n     *\n     * @param packet\n     * @private\n     */\n    onpacket(packet) {\n        const sameNamespace = packet.nsp === this.nsp;\n        if (!sameNamespace)\n            return;\n        switch (packet.type) {\n            case socket_io_parser_1.PacketType.CONNECT:\n                if (packet.data && packet.data.sid) {\n                    const id = packet.data.sid;\n                    this.onconnect(id);\n                }\n                else {\n                    super.emit(\"connect_error\", new Error(\"It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)\"));\n                }\n                break;\n            case socket_io_parser_1.PacketType.EVENT:\n                this.onevent(packet);\n                break;\n            case socket_io_parser_1.PacketType.BINARY_EVENT:\n                this.onevent(packet);\n                break;\n            case socket_io_parser_1.PacketType.ACK:\n                this.onack(packet);\n                break;\n            case socket_io_parser_1.PacketType.BINARY_ACK:\n                this.onack(packet);\n                break;\n            case socket_io_parser_1.PacketType.DISCONNECT:\n                this.ondisconnect();\n                break;\n            case socket_io_parser_1.PacketType.CONNECT_ERROR:\n                const err = new Error(packet.data.message);\n                // @ts-ignore\n                err.data = packet.data.data;\n                super.emit(\"connect_error\", err);\n                break;\n        }\n    }\n    /**\n     * Called upon a server event.\n     *\n     * @param packet\n     * @private\n     */\n    onevent(packet) {\n        const args = packet.data || [];\n\n\n        if (null != packet.id) {\n\n\n            args.push(this.ack(packet.id));\n        }\n        if (this.connected) {\n            this.emitEvent(args);\n        }\n        else {\n            this.receiveBuffer.push(Object.freeze(args));\n        }\n    }\n    emitEvent(args) {\n        if (this._anyListeners && this._anyListeners.length) {\n            const listeners = this._anyListeners.slice();\n            for (const listener of listeners) {\n                listener.apply(this, args);\n            }\n        }\n        super.emit.apply(this, args);\n    }\n    /**\n     * Produces an ack callback to emit with an event.\n     *\n     * @private\n     */\n    ack(id) {\n        const self = this;\n        let sent = false;\n        return function (...args) {\n            // prevent double callbacks\n            if (sent)\n                return;\n            sent = true;\n\n\n            self.packet({\n                type: socket_io_parser_1.PacketType.ACK,\n                id: id,\n                data: args,\n            });\n        };\n    }\n    /**\n     * Called upon a server acknowlegement.\n     *\n     * @param packet\n     * @private\n     */\n    onack(packet) {\n        const ack = this.acks[packet.id];\n        if (\"function\" === typeof ack) {\n\n\n            ack.apply(this, packet.data);\n            delete this.acks[packet.id];\n        }\n        else {\n\n\n        }\n    }\n    /**\n     * Called upon server connect.\n     *\n     * @private\n     */\n    onconnect(id) {\n\n\n        this.id = id;\n        this.connected = true;\n        this.disconnected = false;\n        super.emit(\"connect\");\n        this.emitBuffered();\n    }\n    /**\n     * Emit buffered events (received and emitted).\n     *\n     * @private\n     */\n    emitBuffered() {\n        this.receiveBuffer.forEach((args) => this.emitEvent(args));\n        this.receiveBuffer = [];\n        this.sendBuffer.forEach((packet) => this.packet(packet));\n        this.sendBuffer = [];\n    }\n    /**\n     * Called upon server disconnect.\n     *\n     * @private\n     */\n    ondisconnect() {\n\n\n        this.destroy();\n        this.onclose(\"io server disconnect\");\n    }\n    /**\n     * Called upon forced client/server side disconnections,\n     * this method ensures the manager stops tracking us and\n     * that reconnections don't get triggered for this.\n     *\n     * @private\n     */\n    destroy() {\n        if (this.subs) {\n            // clean subscriptions to avoid reconnections\n            this.subs.forEach((subDestroy) => subDestroy());\n            this.subs = undefined;\n        }\n        this.io[\"_destroy\"](this);\n    }\n    /**\n     * Disconnects the socket manually.\n     *\n     * @return self\n     * @public\n     */\n    disconnect() {\n        if (this.connected) {\n\n\n            this.packet({ type: socket_io_parser_1.PacketType.DISCONNECT });\n        }\n        // remove socket from pool\n        this.destroy();\n        if (this.connected) {\n            // fire events\n            this.onclose(\"io client disconnect\");\n        }\n        return this;\n    }\n    /**\n     * Alias for disconnect()\n     *\n     * @return self\n     * @public\n     */\n    close() {\n        return this.disconnect();\n    }\n    /**\n     * Sets the compress flag.\n     *\n     * @param compress - if `true`, compresses the sending data\n     * @return self\n     * @public\n     */\n    compress(compress) {\n        this.flags.compress = compress;\n        return this;\n    }\n    /**\n     * Sets a modifier for a subsequent event emission that the event message will be dropped when this socket is not\n     * ready to send messages.\n     *\n     * @returns self\n     * @public\n     */\n    get volatile() {\n        this.flags.volatile = true;\n        return this;\n    }\n    /**\n     * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n     * callback.\n     *\n     * @param listener\n     * @public\n     */\n    onAny(listener) {\n        this._anyListeners = this._anyListeners || [];\n        this._anyListeners.push(listener);\n        return this;\n    }\n    /**\n     * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n     * callback. The listener is added to the beginning of the listeners array.\n     *\n     * @param listener\n     * @public\n     */\n    prependAny(listener) {\n        this._anyListeners = this._anyListeners || [];\n        this._anyListeners.unshift(listener);\n        return this;\n    }\n    /**\n     * Removes the listener that will be fired when any event is emitted.\n     *\n     * @param listener\n     * @public\n     */\n    offAny(listener) {\n        if (!this._anyListeners) {\n            return this;\n        }\n        if (listener) {\n            const listeners = this._anyListeners;\n            for (let i = 0; i < listeners.length; i++) {\n                if (listener === listeners[i]) {\n                    listeners.splice(i, 1);\n                    return this;\n                }\n            }\n        }\n        else {\n            this._anyListeners = [];\n        }\n        return this;\n    }\n    /**\n     * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated,\n     * e.g. to remove listeners.\n     *\n     * @public\n     */\n    listenersAny() {\n        return this._anyListeners || [];\n    }\n}\nexports.Socket = Socket;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.hasBinary = exports.isBinary = void 0;\nconst withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\nconst isView = (obj) => {\n    return typeof ArrayBuffer.isView === \"function\"\n        ? ArrayBuffer.isView(obj)\n        : obj.buffer instanceof ArrayBuffer;\n};\nconst toString = Object.prototype.toString;\nconst withNativeBlob = typeof Blob === \"function\" ||\n    (typeof Blob !== \"undefined\" &&\n        toString.call(Blob) === \"[object BlobConstructor]\");\nconst withNativeFile = typeof File === \"function\" ||\n    (typeof File !== \"undefined\" &&\n        toString.call(File) === \"[object FileConstructor]\");\n/**\n * Returns true if obj is a Buffer, an ArrayBuffer, a Blob or a File.\n *\n * @private\n */\nfunction isBinary(obj) {\n    return ((withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj))) ||\n        (withNativeBlob && obj instanceof Blob) ||\n        (withNativeFile && obj instanceof File));\n}\nexports.isBinary = isBinary;\nfunction hasBinary(obj, toJSON) {\n    if (!obj || typeof obj !== \"object\") {\n        return false;\n    }\n    if (Array.isArray(obj)) {\n        for (let i = 0, l = obj.length; i < l; i++) {\n            if (hasBinary(obj[i])) {\n                return true;\n            }\n        }\n        return false;\n    }\n    if (isBinary(obj)) {\n        return true;\n    }\n    if (obj.toJSON &&\n        typeof obj.toJSON === \"function\" &&\n        arguments.length === 1) {\n        return hasBinary(obj.toJSON(), true);\n    }\n    for (const key in obj) {\n        if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) {\n            return true;\n        }\n    }\n    return false;\n}\nexports.hasBinary = hasBinary;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.on = void 0;\nfunction on(obj, ev, fn) {\n    obj.on(ev, fn);\n    return function subDestroy() {\n        obj.off(ev, fn);\n    };\n}\nexports.on = on;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Socket = exports.io = exports.Manager = exports.protocol = void 0;\nconst url_1 = require(\"./url\");\nconst manager_1 = require(\"./manager\");\nconst socket_1 = require(\"./socket\");\nObject.defineProperty(exports, \"Socket\", { enumerable: true, get: function () { return socket_1.Socket; } });\n\n\n/**\n * Module exports.\n */\nmodule.exports = exports = lookup;\n/**\n * Managers cache.\n */\nconst cache = (exports.managers = {});\nfunction lookup(uri, opts) {\n    if (typeof uri === \"object\") {\n        opts = uri;\n        uri = undefined;\n    }\n    opts = opts || {};\n    const parsed = url_1.url(uri, opts.path);\n    const source = parsed.source;\n    const id = parsed.id;\n    const path = parsed.path;\n    const sameNamespace = cache[id] && path in cache[id][\"nsps\"];\n    const newConnection = opts.forceNew ||\n        opts[\"force new connection\"] ||\n        false === opts.multiplex ||\n        sameNamespace;\n    let io;\n    if (newConnection) {\n\n\n        io = new manager_1.Manager(source, opts);\n    }\n    else {\n        if (!cache[id]) {\n\n\n            cache[id] = new manager_1.Manager(source, opts);\n        }\n        io = cache[id];\n    }\n    if (parsed.query && !opts.query) {\n        opts.query = parsed.queryKey;\n    }\n    return io.socket(parsed.path, opts);\n}\nexports.io = lookup;\n/**\n * Protocol version.\n *\n * @public\n */\nvar socket_io_parser_1 = require(\"socket.io-parser\");\nObject.defineProperty(exports, \"protocol\", { enumerable: true, get: function () { return socket_io_parser_1.protocol; } });\n/**\n * `connect`.\n *\n * @param {String} uri\n * @public\n */\nexports.connect = lookup;\n/**\n * Expose constructors for standalone build.\n *\n * @public\n */\nvar manager_2 = require(\"./manager\");\nObject.defineProperty(exports, \"Manager\", { enumerable: true, get: function () { return manager_2.Manager; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.url = void 0;\nconst parseuri = require(\"parseuri\");\n\n\n/**\n * URL parser.\n *\n * @param uri - url\n * @param path - the request path of the connection\n * @param loc - An object meant to mimic window.location.\n *        Defaults to window.location.\n * @public\n */\nfunction url(uri, path = \"\", loc) {\n    let obj = uri;\n    // default to window.location\n    loc = loc || (typeof location !== \"undefined\" && location);\n    if (null == uri)\n        uri = loc.protocol + \"//\" + loc.host;\n    // relative path support\n    if (typeof uri === \"string\") {\n        if (\"/\" === uri.charAt(0)) {\n            if (\"/\" === uri.charAt(1)) {\n                uri = loc.protocol + uri;\n            }\n            else {\n                uri = loc.host + uri;\n            }\n        }\n        if (!/^(https?|wss?):\\/\\//.test(uri)) {\n\n\n            if (\"undefined\" !== typeof loc) {\n                uri = loc.protocol + \"//\" + uri;\n            }\n            else {\n                uri = \"https://\" + uri;\n            }\n        }\n        // parse\n\n\n        obj = parseuri(uri);\n    }\n    // make sure we treat `localhost:80` and `localhost` equally\n    if (!obj.port) {\n        if (/^(http|ws)$/.test(obj.protocol)) {\n            obj.port = \"80\";\n        }\n        else if (/^(http|ws)s$/.test(obj.protocol)) {\n            obj.port = \"443\";\n        }\n    }\n    obj.path = obj.path || \"/\";\n    const ipv6 = obj.host.indexOf(\":\") !== -1;\n    const host = ipv6 ? \"[\" + obj.host + \"]\" : obj.host;\n    // define unique id\n    obj.id = obj.protocol + \"://\" + host + \":\" + obj.port + path;\n    // define href\n    obj.href =\n        obj.protocol +\n            \"://\" +\n            host +\n            (loc && loc.port === obj.port ? \"\" : \":\" + obj.port);\n    return obj;\n}\nexports.url = url;\n","const Socket = require(\"./socket\");\n\nmodule.exports = (uri, opts) => new Socket(uri, opts);\n\n/**\n * Expose deps for legacy compatibility\n * and standalone browser access.\n */\n\nmodule.exports.Socket = Socket;\nmodule.exports.protocol = Socket.protocol; // this is an int\nmodule.exports.Transport = require(\"./transport\");\nmodule.exports.transports = require(\"./transports/index\");\nmodule.exports.parser = require(\"engine.io-parser\");\n","const transports = require(\"./transports/index\");\nconst Emitter = require(\"component-emitter\");\n\n\nconst parser = require(\"engine.io-parser\");\nconst parseuri = require(\"parseuri\");\nconst parseqs = require(\"parseqs\");\n\nclass Socket extends Emitter {\n  /**\n   * Socket constructor.\n   *\n   * @param {String|Object} uri or options\n   * @param {Object} options\n   * @api public\n   */\n  constructor(uri, opts = {}) {\n    super();\n\n    if (uri && \"object\" === typeof uri) {\n      opts = uri;\n      uri = null;\n    }\n\n    if (uri) {\n      uri = parseuri(uri);\n      opts.hostname = uri.host;\n      opts.secure = uri.protocol === \"https\" || uri.protocol === \"wss\";\n      opts.port = uri.port;\n      if (uri.query) opts.query = uri.query;\n    } else if (opts.host) {\n      opts.hostname = parseuri(opts.host).host;\n    }\n\n    this.secure =\n      null != opts.secure\n        ? opts.secure\n        : typeof location !== \"undefined\" && \"https:\" === location.protocol;\n\n    if (opts.hostname && !opts.port) {\n      // if no port is specified manually, use the protocol default\n      opts.port = this.secure ? \"443\" : \"80\";\n    }\n\n    this.hostname =\n      opts.hostname ||\n      (typeof location !== \"undefined\" ? location.hostname : \"localhost\");\n    this.port =\n      opts.port ||\n      (typeof location !== \"undefined\" && location.port\n        ? location.port\n        : this.secure\n        ? 443\n        : 80);\n\n    this.transports = opts.transports || [\"polling\", \"websocket\"];\n    this.readyState = \"\";\n    this.writeBuffer = [];\n    this.prevBufferLen = 0;\n\n    this.opts = Object.assign(\n      {\n        path: \"/engine.io\",\n        agent: false,\n        withCredentials: false,\n        upgrade: true,\n        jsonp: true,\n        timestampParam: \"t\",\n        rememberUpgrade: false,\n        rejectUnauthorized: true,\n        perMessageDeflate: {\n          threshold: 1024\n        },\n        transportOptions: {}\n      },\n      opts\n    );\n\n    this.opts.path = this.opts.path.replace(/\\/$/, \"\") + \"/\";\n\n    if (typeof this.opts.query === \"string\") {\n      this.opts.query = parseqs.decode(this.opts.query);\n    }\n\n    // set on handshake\n    this.id = null;\n    this.upgrades = null;\n    this.pingInterval = null;\n    this.pingTimeout = null;\n\n    // set on heartbeat\n    this.pingTimeoutTimer = null;\n\n    if (typeof addEventListener === \"function\") {\n      addEventListener(\n        \"beforeunload\",\n        () => {\n          if (this.transport) {\n            // silently close the transport\n            this.transport.removeAllListeners();\n            this.transport.close();\n          }\n        },\n        false\n      );\n    }\n\n    this.open();\n  }\n\n  /**\n   * Creates transport of the given type.\n   *\n   * @param {String} transport name\n   * @return {Transport}\n   * @api private\n   */\n  createTransport(name) {\n\n\n    const query = clone(this.opts.query);\n\n    // append engine.io protocol identifier\n    query.EIO = parser.protocol;\n\n    // transport name\n    query.transport = name;\n\n    // session id if we already have one\n    if (this.id) query.sid = this.id;\n\n    const opts = Object.assign(\n      {},\n      this.opts.transportOptions[name],\n      this.opts,\n      {\n        query,\n        socket: this,\n        hostname: this.hostname,\n        secure: this.secure,\n        port: this.port\n      }\n    );\n\n\n\n\n    return new transports[name](opts);\n  }\n\n  /**\n   * Initializes transport to use and starts probe.\n   *\n   * @api private\n   */\n  open() {\n    let transport;\n    if (\n      this.opts.rememberUpgrade &&\n      Socket.priorWebsocketSuccess &&\n      this.transports.indexOf(\"websocket\") !== -1\n    ) {\n      transport = \"websocket\";\n    } else if (0 === this.transports.length) {\n      // Emit error on next tick so it can be listened to\n      const self = this;\n      setTimeout(function() {\n        self.emit(\"error\", \"No transports available\");\n      }, 0);\n      return;\n    } else {\n      transport = this.transports[0];\n    }\n    this.readyState = \"opening\";\n\n    // Retry with the next transport if the transport is disabled (jsonp: false)\n    try {\n      transport = this.createTransport(transport);\n    } catch (e) {\n\n\n      this.transports.shift();\n      this.open();\n      return;\n    }\n\n    transport.open();\n    this.setTransport(transport);\n  }\n\n  /**\n   * Sets the current transport. Disables the existing one (if any).\n   *\n   * @api private\n   */\n  setTransport(transport) {\n\n\n    const self = this;\n\n    if (this.transport) {\n\n\n      this.transport.removeAllListeners();\n    }\n\n    // set up transport\n    this.transport = transport;\n\n    // set up transport listeners\n    transport\n      .on(\"drain\", function() {\n        self.onDrain();\n      })\n      .on(\"packet\", function(packet) {\n        self.onPacket(packet);\n      })\n      .on(\"error\", function(e) {\n        self.onError(e);\n      })\n      .on(\"close\", function() {\n        self.onClose(\"transport close\");\n      });\n  }\n\n  /**\n   * Probes a transport.\n   *\n   * @param {String} transport name\n   * @api private\n   */\n  probe(name) {\n\n\n    let transport = this.createTransport(name, { probe: 1 });\n    let failed = false;\n    const self = this;\n\n    Socket.priorWebsocketSuccess = false;\n\n    function onTransportOpen() {\n      if (self.onlyBinaryUpgrades) {\n        const upgradeLosesBinary =\n          !this.supportsBinary && self.transport.supportsBinary;\n        failed = failed || upgradeLosesBinary;\n      }\n      if (failed) return;\n\n\n\n      transport.send([{ type: \"ping\", data: \"probe\" }]);\n      transport.once(\"packet\", function(msg) {\n        if (failed) return;\n        if (\"pong\" === msg.type && \"probe\" === msg.data) {\n\n\n          self.upgrading = true;\n          self.emit(\"upgrading\", transport);\n          if (!transport) return;\n          Socket.priorWebsocketSuccess = \"websocket\" === transport.name;\n\n\n\n          self.transport.pause(function() {\n            if (failed) return;\n            if (\"closed\" === self.readyState) return;\n\n\n\n            cleanup();\n\n            self.setTransport(transport);\n            transport.send([{ type: \"upgrade\" }]);\n            self.emit(\"upgrade\", transport);\n            transport = null;\n            self.upgrading = false;\n            self.flush();\n          });\n        } else {\n\n\n          const err = new Error(\"probe error\");\n          err.transport = transport.name;\n          self.emit(\"upgradeError\", err);\n        }\n      });\n    }\n\n    function freezeTransport() {\n      if (failed) return;\n\n      // Any callback called by transport should be ignored since now\n      failed = true;\n\n      cleanup();\n\n      transport.close();\n      transport = null;\n    }\n\n    // Handle any error that happens while probing\n    function onerror(err) {\n      const error = new Error(\"probe error: \" + err);\n      error.transport = transport.name;\n\n      freezeTransport();\n\n\n\n\n      self.emit(\"upgradeError\", error);\n    }\n\n    function onTransportClose() {\n      onerror(\"transport closed\");\n    }\n\n    // When the socket is closed while we're probing\n    function onclose() {\n      onerror(\"socket closed\");\n    }\n\n    // When the socket is upgraded while we're probing\n    function onupgrade(to) {\n      if (transport && to.name !== transport.name) {\n\n\n        freezeTransport();\n      }\n    }\n\n    // Remove all listeners on the transport and on self\n    function cleanup() {\n      transport.removeListener(\"open\", onTransportOpen);\n      transport.removeListener(\"error\", onerror);\n      transport.removeListener(\"close\", onTransportClose);\n      self.removeListener(\"close\", onclose);\n      self.removeListener(\"upgrading\", onupgrade);\n    }\n\n    transport.once(\"open\", onTransportOpen);\n    transport.once(\"error\", onerror);\n    transport.once(\"close\", onTransportClose);\n\n    this.once(\"close\", onclose);\n    this.once(\"upgrading\", onupgrade);\n\n    transport.open();\n  }\n\n  /**\n   * Called when connection is deemed open.\n   *\n   * @api public\n   */\n  onOpen() {\n\n\n    this.readyState = \"open\";\n    Socket.priorWebsocketSuccess = \"websocket\" === this.transport.name;\n    this.emit(\"open\");\n    this.flush();\n\n    // we check for `readyState` in case an `open`\n    // listener already closed the socket\n    if (\n      \"open\" === this.readyState &&\n      this.opts.upgrade &&\n      this.transport.pause\n    ) {\n\n\n      let i = 0;\n      const l = this.upgrades.length;\n      for (; i < l; i++) {\n        this.probe(this.upgrades[i]);\n      }\n    }\n  }\n\n  /**\n   * Handles a packet.\n   *\n   * @api private\n   */\n  onPacket(packet) {\n    if (\n      \"opening\" === this.readyState ||\n      \"open\" === this.readyState ||\n      \"closing\" === this.readyState\n    ) {\n\n\n\n      this.emit(\"packet\", packet);\n\n      // Socket is live - any packet counts\n      this.emit(\"heartbeat\");\n\n      switch (packet.type) {\n        case \"open\":\n          this.onHandshake(JSON.parse(packet.data));\n          break;\n\n        case \"ping\":\n          this.resetPingTimeout();\n          this.sendPacket(\"pong\");\n          this.emit(\"pong\");\n          break;\n\n        case \"error\":\n          const err = new Error(\"server error\");\n          err.code = packet.data;\n          this.onError(err);\n          break;\n\n        case \"message\":\n          this.emit(\"data\", packet.data);\n          this.emit(\"message\", packet.data);\n          break;\n      }\n    } else {\n\n\n    }\n  }\n\n  /**\n   * Called upon handshake completion.\n   *\n   * @param {Object} handshake obj\n   * @api private\n   */\n  onHandshake(data) {\n    this.emit(\"handshake\", data);\n    this.id = data.sid;\n    this.transport.query.sid = data.sid;\n    this.upgrades = this.filterUpgrades(data.upgrades);\n    this.pingInterval = data.pingInterval;\n    this.pingTimeout = data.pingTimeout;\n    this.onOpen();\n    // In case open handler closes socket\n    if (\"closed\" === this.readyState) return;\n    this.resetPingTimeout();\n  }\n\n  /**\n   * Sets and resets ping timeout timer based on server pings.\n   *\n   * @api private\n   */\n  resetPingTimeout() {\n    clearTimeout(this.pingTimeoutTimer);\n    this.pingTimeoutTimer = setTimeout(() => {\n      this.onClose(\"ping timeout\");\n    }, this.pingInterval + this.pingTimeout);\n  }\n\n  /**\n   * Called on `drain` event\n   *\n   * @api private\n   */\n  onDrain() {\n    this.writeBuffer.splice(0, this.prevBufferLen);\n\n    // setting prevBufferLen = 0 is very important\n    // for example, when upgrading, upgrade packet is sent over,\n    // and a nonzero prevBufferLen could cause problems on `drain`\n    this.prevBufferLen = 0;\n\n    if (0 === this.writeBuffer.length) {\n      this.emit(\"drain\");\n    } else {\n      this.flush();\n    }\n  }\n\n  /**\n   * Flush write buffers.\n   *\n   * @api private\n   */\n  flush() {\n    if (\n      \"closed\" !== this.readyState &&\n      this.transport.writable &&\n      !this.upgrading &&\n      this.writeBuffer.length\n    ) {\n\n\n      this.transport.send(this.writeBuffer);\n      // keep track of current length of writeBuffer\n      // splice writeBuffer and callbackBuffer on `drain`\n      this.prevBufferLen = this.writeBuffer.length;\n      this.emit(\"flush\");\n    }\n  }\n\n  /**\n   * Sends a message.\n   *\n   * @param {String} message.\n   * @param {Function} callback function.\n   * @param {Object} options.\n   * @return {Socket} for chaining.\n   * @api public\n   */\n  write(msg, options, fn) {\n    this.sendPacket(\"message\", msg, options, fn);\n    return this;\n  }\n\n  send(msg, options, fn) {\n    this.sendPacket(\"message\", msg, options, fn);\n    return this;\n  }\n\n  /**\n   * Sends a packet.\n   *\n   * @param {String} packet type.\n   * @param {String} data.\n   * @param {Object} options.\n   * @param {Function} callback function.\n   * @api private\n   */\n  sendPacket(type, data, options, fn) {\n    if (\"function\" === typeof data) {\n      fn = data;\n      data = undefined;\n    }\n\n    if (\"function\" === typeof options) {\n      fn = options;\n      options = null;\n    }\n\n    if (\"closing\" === this.readyState || \"closed\" === this.readyState) {\n      return;\n    }\n\n    options = options || {};\n    options.compress = false !== options.compress;\n\n    const packet = {\n      type: type,\n      data: data,\n      options: options\n    };\n    this.emit(\"packetCreate\", packet);\n    this.writeBuffer.push(packet);\n    if (fn) this.once(\"flush\", fn);\n    this.flush();\n  }\n\n  /**\n   * Closes the connection.\n   *\n   * @api private\n   */\n  close() {\n    const self = this;\n\n    if (\"opening\" === this.readyState || \"open\" === this.readyState) {\n      this.readyState = \"closing\";\n\n      if (this.writeBuffer.length) {\n        this.once(\"drain\", function() {\n          if (this.upgrading) {\n            waitForUpgrade();\n          } else {\n            close();\n          }\n        });\n      } else if (this.upgrading) {\n        waitForUpgrade();\n      } else {\n        close();\n      }\n    }\n\n    function close() {\n      self.onClose(\"forced close\");\n\n\n      self.transport.close();\n    }\n\n    function cleanupAndClose() {\n      self.removeListener(\"upgrade\", cleanupAndClose);\n      self.removeListener(\"upgradeError\", cleanupAndClose);\n      close();\n    }\n\n    function waitForUpgrade() {\n      // wait for upgrade to finish since we can't send packets while pausing a transport\n      self.once(\"upgrade\", cleanupAndClose);\n      self.once(\"upgradeError\", cleanupAndClose);\n    }\n\n    return this;\n  }\n\n  /**\n   * Called upon transport error\n   *\n   * @api private\n   */\n  onError(err) {\n\n\n    Socket.priorWebsocketSuccess = false;\n    this.emit(\"error\", err);\n    this.onClose(\"transport error\", err);\n  }\n\n  /**\n   * Called upon transport close.\n   *\n   * @api private\n   */\n  onClose(reason, desc) {\n    if (\n      \"opening\" === this.readyState ||\n      \"open\" === this.readyState ||\n      \"closing\" === this.readyState\n    ) {\n\n\n      const self = this;\n\n      // clear timers\n      clearTimeout(this.pingIntervalTimer);\n      clearTimeout(this.pingTimeoutTimer);\n\n      // stop event from firing again for transport\n      this.transport.removeAllListeners(\"close\");\n\n      // ensure transport won't stay open\n      this.transport.close();\n\n      // ignore further transport communication\n      this.transport.removeAllListeners();\n\n      // set ready state\n      this.readyState = \"closed\";\n\n      // clear session id\n      this.id = null;\n\n      // emit close event\n      this.emit(\"close\", reason, desc);\n\n      // clean buffers after, so users can still\n      // grab the buffers on `close` event\n      self.writeBuffer = [];\n      self.prevBufferLen = 0;\n    }\n  }\n\n  /**\n   * Filters upgrades, returning only those matching client transports.\n   *\n   * @param {Array} server upgrades\n   * @api private\n   *\n   */\n  filterUpgrades(upgrades) {\n    const filteredUpgrades = [];\n    let i = 0;\n    const j = upgrades.length;\n    for (; i < j; i++) {\n      if (~this.transports.indexOf(upgrades[i]))\n        filteredUpgrades.push(upgrades[i]);\n    }\n    return filteredUpgrades;\n  }\n}\n\nSocket.priorWebsocketSuccess = false;\n\n/**\n * Protocol version.\n *\n * @api public\n */\n\nSocket.protocol = parser.protocol; // this is an int\n\nfunction clone(obj) {\n  const o = {};\n  for (let i in obj) {\n    if (obj.hasOwnProperty(i)) {\n      o[i] = obj[i];\n    }\n  }\n  return o;\n}\n\nmodule.exports = Socket;\n","\n/**\n * Module exports.\n *\n * Logic borrowed from Modernizr:\n *\n *   - https://github.com/Modernizr/Modernizr/blob/master/feature-detects/cors.js\n */\n\ntry {\n  module.exports = typeof XMLHttpRequest !== 'undefined' &&\n    'withCredentials' in new XMLHttpRequest();\n} catch (err) {\n  // if XMLHttp support is disabled in IE then it will throw\n  // when trying to create\n  module.exports = false;\n}\n","/* global attachEvent */\n\nconst XMLHttpRequest = require(\"xmlhttprequest-ssl\");\nconst Polling = require(\"./polling\");\nconst Emitter = require(\"component-emitter\");\nconst { pick } = require(\"../util\");\nconst globalThis = require(\"../globalThis\");\n\n\n\n\n/**\n * Empty function\n */\n\nfunction empty() {}\n\nconst hasXHR2 = (function() {\n  const xhr = new XMLHttpRequest({ xdomain: false });\n  return null != xhr.responseType;\n})();\n\nclass XHR extends Polling {\n  /**\n   * XHR Polling constructor.\n   *\n   * @param {Object} opts\n   * @api public\n   */\n  constructor(opts) {\n    super(opts);\n\n    if (typeof location !== \"undefined\") {\n      const isSSL = \"https:\" === location.protocol;\n      let port = location.port;\n\n      // some user agents have empty `location.port`\n      if (!port) {\n        port = isSSL ? 443 : 80;\n      }\n\n      this.xd =\n        (typeof location !== \"undefined\" &&\n          opts.hostname !== location.hostname) ||\n        port !== opts.port;\n      this.xs = opts.secure !== isSSL;\n    }\n    /**\n     * XHR supports binary\n     */\n    const forceBase64 = opts && opts.forceBase64;\n    this.supportsBinary = hasXHR2 && !forceBase64;\n  }\n\n  /**\n   * Creates a request.\n   *\n   * @param {String} method\n   * @api private\n   */\n  request(opts = {}) {\n    Object.assign(opts, { xd: this.xd, xs: this.xs }, this.opts);\n    return new Request(this.uri(), opts);\n  }\n\n  /**\n   * Sends data.\n   *\n   * @param {String} data to send.\n   * @param {Function} called upon flush.\n   * @api private\n   */\n  doWrite(data, fn) {\n    const req = this.request({\n      method: \"POST\",\n      data: data\n    });\n    const self = this;\n    req.on(\"success\", fn);\n    req.on(\"error\", function(err) {\n      self.onError(\"xhr post error\", err);\n    });\n  }\n\n  /**\n   * Starts a poll cycle.\n   *\n   * @api private\n   */\n  doPoll() {\n\n\n    const req = this.request();\n    const self = this;\n    req.on(\"data\", function(data) {\n      self.onData(data);\n    });\n    req.on(\"error\", function(err) {\n      self.onError(\"xhr poll error\", err);\n    });\n    this.pollXhr = req;\n  }\n}\n\nclass Request extends Emitter {\n  /**\n   * Request constructor\n   *\n   * @param {Object} options\n   * @api public\n   */\n  constructor(uri, opts) {\n    super();\n    this.opts = opts;\n\n    this.method = opts.method || \"GET\";\n    this.uri = uri;\n    this.async = false !== opts.async;\n    this.data = undefined !== opts.data ? opts.data : null;\n\n    this.create();\n  }\n\n  /**\n   * Creates the XHR object and sends the request.\n   *\n   * @api private\n   */\n  create() {\n    const opts = pick(\n      this.opts,\n      \"agent\",\n      \"enablesXDR\",\n      \"pfx\",\n      \"key\",\n      \"passphrase\",\n      \"cert\",\n      \"ca\",\n      \"ciphers\",\n      \"rejectUnauthorized\"\n    );\n    opts.xdomain = !!this.opts.xd;\n    opts.xscheme = !!this.opts.xs;\n\n    const xhr = (this.xhr = new XMLHttpRequest(opts));\n    const self = this;\n\n    try {\n\n\n      xhr.open(this.method, this.uri, this.async);\n      try {\n        if (this.opts.extraHeaders) {\n          xhr.setDisableHeaderCheck && xhr.setDisableHeaderCheck(true);\n          for (let i in this.opts.extraHeaders) {\n            if (this.opts.extraHeaders.hasOwnProperty(i)) {\n              xhr.setRequestHeader(i, this.opts.extraHeaders[i]);\n            }\n          }\n        }\n      } catch (e) {}\n\n      if (\"POST\" === this.method) {\n        try {\n          xhr.setRequestHeader(\"Content-type\", \"text/plain;charset=UTF-8\");\n        } catch (e) {}\n      }\n\n      try {\n        xhr.setRequestHeader(\"Accept\", \"*/*\");\n      } catch (e) {}\n\n      // ie6 check\n      if (\"withCredentials\" in xhr) {\n        xhr.withCredentials = this.opts.withCredentials;\n      }\n\n      if (this.opts.requestTimeout) {\n        xhr.timeout = this.opts.requestTimeout;\n      }\n\n      if (this.hasXDR()) {\n        xhr.onload = function() {\n          self.onLoad();\n        };\n        xhr.onerror = function() {\n          self.onError(xhr.responseText);\n        };\n      } else {\n        xhr.onreadystatechange = function() {\n          if (4 !== xhr.readyState) return;\n          if (200 === xhr.status || 1223 === xhr.status) {\n            self.onLoad();\n          } else {\n            // make sure the `error` event handler that's user-set\n            // does not throw in the same tick and gets caught here\n            setTimeout(function() {\n              self.onError(typeof xhr.status === \"number\" ? xhr.status : 0);\n            }, 0);\n          }\n        };\n      }\n\n\n\n      xhr.send(this.data);\n    } catch (e) {\n      // Need to defer since .create() is called directly from the constructor\n      // and thus the 'error' event can only be only bound *after* this exception\n      // occurs.  Therefore, also, we cannot throw here at all.\n      setTimeout(function() {\n        self.onError(e);\n      }, 0);\n      return;\n    }\n\n    if (typeof document !== \"undefined\") {\n      this.index = Request.requestsCount++;\n      Request.requests[this.index] = this;\n    }\n  }\n\n  /**\n   * Called upon successful response.\n   *\n   * @api private\n   */\n  onSuccess() {\n    this.emit(\"success\");\n    this.cleanup();\n  }\n\n  /**\n   * Called if we have data.\n   *\n   * @api private\n   */\n  onData(data) {\n    this.emit(\"data\", data);\n    this.onSuccess();\n  }\n\n  /**\n   * Called upon error.\n   *\n   * @api private\n   */\n  onError(err) {\n    this.emit(\"error\", err);\n    this.cleanup(true);\n  }\n\n  /**\n   * Cleans up house.\n   *\n   * @api private\n   */\n  cleanup(fromError) {\n    if (\"undefined\" === typeof this.xhr || null === this.xhr) {\n      return;\n    }\n    // xmlhttprequest\n    if (this.hasXDR()) {\n      this.xhr.onload = this.xhr.onerror = empty;\n    } else {\n      this.xhr.onreadystatechange = empty;\n    }\n\n    if (fromError) {\n      try {\n        this.xhr.abort();\n      } catch (e) {}\n    }\n\n    if (typeof document !== \"undefined\") {\n      delete Request.requests[this.index];\n    }\n\n    this.xhr = null;\n  }\n\n  /**\n   * Called upon load.\n   *\n   * @api private\n   */\n  onLoad() {\n    const data = this.xhr.responseText;\n    if (data !== null) {\n      this.onData(data);\n    }\n  }\n\n  /**\n   * Check if it has XDomainRequest.\n   *\n   * @api private\n   */\n  hasXDR() {\n    return typeof XDomainRequest !== \"undefined\" && !this.xs && this.enablesXDR;\n  }\n\n  /**\n   * Aborts the request.\n   *\n   * @api public\n   */\n  abort() {\n    this.cleanup();\n  }\n}\n\n/**\n * Aborts pending requests when unloading the window. This is needed to prevent\n * memory leaks (e.g. when using IE) and to ensure that no spurious error is\n * emitted.\n */\n\nRequest.requestsCount = 0;\nRequest.requests = {};\n\nif (typeof document !== \"undefined\") {\n  if (typeof attachEvent === \"function\") {\n    attachEvent(\"onunload\", unloadHandler);\n  } else if (typeof addEventListener === \"function\") {\n    const terminationEvent = \"onpagehide\" in globalThis ? \"pagehide\" : \"unload\";\n    addEventListener(terminationEvent, unloadHandler, false);\n  }\n}\n\nfunction unloadHandler() {\n  for (let i in Request.requests) {\n    if (Request.requests.hasOwnProperty(i)) {\n      Request.requests[i].abort();\n    }\n  }\n}\n\nmodule.exports = XHR;\nmodule.exports.Request = Request;\n","const { PACKET_TYPES } = require(\"./commons\");\n\nconst withNativeBlob =\n  typeof Blob === \"function\" ||\n  (typeof Blob !== \"undefined\" &&\n    Object.prototype.toString.call(Blob) === \"[object BlobConstructor]\");\nconst withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\n\n// ArrayBuffer.isView method is not defined in IE10\nconst isView = obj => {\n  return typeof ArrayBuffer.isView === \"function\"\n    ? ArrayBuffer.isView(obj)\n    : obj && obj.buffer instanceof ArrayBuffer;\n};\n\nconst encodePacket = ({ type, data }, supportsBinary, callback) => {\n  if (withNativeBlob && data instanceof Blob) {\n    if (supportsBinary) {\n      return callback(data);\n    } else {\n      return encodeBlobAsBase64(data, callback);\n    }\n  } else if (\n    withNativeArrayBuffer &&\n    (data instanceof ArrayBuffer || isView(data))\n  ) {\n    if (supportsBinary) {\n      return callback(data instanceof ArrayBuffer ? data : data.buffer);\n    } else {\n      return encodeBlobAsBase64(new Blob([data]), callback);\n    }\n  }\n  // plain string\n  return callback(PACKET_TYPES[type] + (data || \"\"));\n};\n\nconst encodeBlobAsBase64 = (data, callback) => {\n  const fileReader = new FileReader();\n  fileReader.onload = function() {\n    const content = fileReader.result.split(\",\")[1];\n    callback(\"b\" + content);\n  };\n  return fileReader.readAsDataURL(data);\n};\n\nmodule.exports = encodePacket;\n","const { PACKET_TYPES_REVERSE, ERROR_PACKET } = require(\"./commons\");\n\nconst withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\n\nlet base64decoder;\nif (withNativeArrayBuffer) {\n  base64decoder = require(\"base64-arraybuffer\");\n}\n\nconst decodePacket = (encodedPacket, binaryType) => {\n  if (typeof encodedPacket !== \"string\") {\n    return {\n      type: \"message\",\n      data: mapBinary(encodedPacket, binaryType)\n    };\n  }\n  const type = encodedPacket.charAt(0);\n  if (type === \"b\") {\n    return {\n      type: \"message\",\n      data: decodeBase64Packet(encodedPacket.substring(1), binaryType)\n    };\n  }\n  const packetType = PACKET_TYPES_REVERSE[type];\n  if (!packetType) {\n    return ERROR_PACKET;\n  }\n  return encodedPacket.length > 1\n    ? {\n        type: PACKET_TYPES_REVERSE[type],\n        data: encodedPacket.substring(1)\n      }\n    : {\n        type: PACKET_TYPES_REVERSE[type]\n      };\n};\n\nconst decodeBase64Packet = (data, binaryType) => {\n  if (base64decoder) {\n    const decoded = base64decoder.decode(data);\n    return mapBinary(decoded, binaryType);\n  } else {\n    return { base64: true, data }; // fallback for old browsers\n  }\n};\n\nconst mapBinary = (data, binaryType) => {\n  switch (binaryType) {\n    case \"blob\":\n      return data instanceof ArrayBuffer ? new Blob([data]) : data;\n    case \"arraybuffer\":\n    default:\n      return data; // assuming the data is already an ArrayBuffer\n  }\n};\n\nmodule.exports = decodePacket;\n","/*\n * base64-arraybuffer\n * https://github.com/niklasvh/base64-arraybuffer\n *\n * Copyright (c) 2012 Niklas von Hertzen\n * Licensed under the MIT license.\n */\n(function(chars){\n  \"use strict\";\n\n  exports.encode = function(arraybuffer) {\n    var bytes = new Uint8Array(arraybuffer),\n    i, len = bytes.length, base64 = \"\";\n\n    for (i = 0; i < len; i+=3) {\n      base64 += chars[bytes[i] >> 2];\n      base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n      base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n      base64 += chars[bytes[i + 2] & 63];\n    }\n\n    if ((len % 3) === 2) {\n      base64 = base64.substring(0, base64.length - 1) + \"=\";\n    } else if (len % 3 === 1) {\n      base64 = base64.substring(0, base64.length - 2) + \"==\";\n    }\n\n    return base64;\n  };\n\n  exports.decode =  function(base64) {\n    var bufferLength = base64.length * 0.75,\n    len = base64.length, i, p = 0,\n    encoded1, encoded2, encoded3, encoded4;\n\n    if (base64[base64.length - 1] === \"=\") {\n      bufferLength--;\n      if (base64[base64.length - 2] === \"=\") {\n        bufferLength--;\n      }\n    }\n\n    var arraybuffer = new ArrayBuffer(bufferLength),\n    bytes = new Uint8Array(arraybuffer);\n\n    for (i = 0; i < len; i+=4) {\n      encoded1 = chars.indexOf(base64[i]);\n      encoded2 = chars.indexOf(base64[i+1]);\n      encoded3 = chars.indexOf(base64[i+2]);\n      encoded4 = chars.indexOf(base64[i+3]);\n\n      bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n      bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n      bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n    }\n\n    return arraybuffer;\n  };\n})(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\");\n","const Polling = require(\"./polling\");\nconst globalThis = require(\"../globalThis\");\n\nconst rNewline = /\\n/g;\nconst rEscapedNewline = /\\\\n/g;\n\n/**\n * Global JSONP callbacks.\n */\n\nlet callbacks;\n\nclass JSONPPolling extends Polling {\n  /**\n   * JSONP Polling constructor.\n   *\n   * @param {Object} opts.\n   * @api public\n   */\n  constructor(opts) {\n    super(opts);\n\n    this.query = this.query || {};\n\n    // define global callbacks array if not present\n    // we do this here (lazily) to avoid unneeded global pollution\n    if (!callbacks) {\n      // we need to consider multiple engines in the same page\n      callbacks = globalThis.___eio = globalThis.___eio || [];\n    }\n\n    // callback identifier\n    this.index = callbacks.length;\n\n    // add callback to jsonp global\n    const self = this;\n    callbacks.push(function(msg) {\n      self.onData(msg);\n    });\n\n    // append to query string\n    this.query.j = this.index;\n  }\n\n  /**\n   * JSONP only supports binary as base64 encoded strings\n   */\n  get supportsBinary() {\n    return false;\n  }\n\n  /**\n   * Closes the socket.\n   *\n   * @api private\n   */\n  doClose() {\n    if (this.script) {\n      // prevent spurious errors from being emitted when the window is unloaded\n      this.script.onerror = () => {};\n      this.script.parentNode.removeChild(this.script);\n      this.script = null;\n    }\n\n    if (this.form) {\n      this.form.parentNode.removeChild(this.form);\n      this.form = null;\n      this.iframe = null;\n    }\n\n    super.doClose();\n  }\n\n  /**\n   * Starts a poll cycle.\n   *\n   * @api private\n   */\n  doPoll() {\n    const self = this;\n    const script = document.createElement(\"script\");\n\n    if (this.script) {\n      this.script.parentNode.removeChild(this.script);\n      this.script = null;\n    }\n\n    script.async = true;\n    script.src = this.uri();\n    script.onerror = function(e) {\n      self.onError(\"jsonp poll error\", e);\n    };\n\n    const insertAt = document.getElementsByTagName(\"script\")[0];\n    if (insertAt) {\n      insertAt.parentNode.insertBefore(script, insertAt);\n    } else {\n      (document.head || document.body).appendChild(script);\n    }\n    this.script = script;\n\n    const isUAgecko =\n      \"undefined\" !== typeof navigator && /gecko/i.test(navigator.userAgent);\n\n    if (isUAgecko) {\n      setTimeout(function() {\n        const iframe = document.createElement(\"iframe\");\n        document.body.appendChild(iframe);\n        document.body.removeChild(iframe);\n      }, 100);\n    }\n  }\n\n  /**\n   * Writes with a hidden iframe.\n   *\n   * @param {String} data to send\n   * @param {Function} called upon flush.\n   * @api private\n   */\n  doWrite(data, fn) {\n    const self = this;\n    let iframe;\n\n    if (!this.form) {\n      const form = document.createElement(\"form\");\n      const area = document.createElement(\"textarea\");\n      const id = (this.iframeId = \"eio_iframe_\" + this.index);\n\n      form.className = \"socketio\";\n      form.style.position = \"absolute\";\n      form.style.top = \"-1000px\";\n      form.style.left = \"-1000px\";\n      form.target = id;\n      form.method = \"POST\";\n      form.setAttribute(\"accept-charset\", \"utf-8\");\n      area.name = \"d\";\n      form.appendChild(area);\n      document.body.appendChild(form);\n\n      this.form = form;\n      this.area = area;\n    }\n\n    this.form.action = this.uri();\n\n    function complete() {\n      initIframe();\n      fn();\n    }\n\n    function initIframe() {\n      if (self.iframe) {\n        try {\n          self.form.removeChild(self.iframe);\n        } catch (e) {\n          self.onError(\"jsonp polling iframe removal error\", e);\n        }\n      }\n\n      try {\n        // ie6 dynamic iframes with target=\"\" support (thanks Chris Lambacher)\n        const html = '<iframe src=\"javascript:0\" name=\"' + self.iframeId + '\">';\n        iframe = document.createElement(html);\n      } catch (e) {\n        iframe = document.createElement(\"iframe\");\n        iframe.name = self.iframeId;\n        iframe.src = \"javascript:0\";\n      }\n\n      iframe.id = self.iframeId;\n\n      self.form.appendChild(iframe);\n      self.iframe = iframe;\n    }\n\n    initIframe();\n\n    // escape \\n to prevent it from being converted into \\r\\n by some UAs\n    // double escaping is required for escaped new lines because unescaping of new lines can be done safely on server-side\n    data = data.replace(rEscapedNewline, \"\\\\\\n\");\n    this.area.value = data.replace(rNewline, \"\\\\n\");\n\n    try {\n      this.form.submit();\n    } catch (e) {}\n\n    if (this.iframe.attachEvent) {\n      this.iframe.onreadystatechange = function() {\n        if (self.iframe.readyState === \"complete\") {\n          complete();\n        }\n      };\n    } else {\n      this.iframe.onload = complete;\n    }\n  }\n}\n\nmodule.exports = JSONPPolling;\n","const Transport = require(\"../transport\");\nconst parser = require(\"engine.io-parser\");\nconst parseqs = require(\"parseqs\");\nconst yeast = require(\"yeast\");\nconst { pick } = require(\"../util\");\nconst {\n  WebSocket,\n  usingBrowserWebSocket,\n  defaultBinaryType\n} = require(\"./websocket-constructor\");\n\n\n\n\n// detect ReactNative environment\nconst isReactNative =\n  typeof navigator !== \"undefined\" &&\n  typeof navigator.product === \"string\" &&\n  navigator.product.toLowerCase() === \"reactnative\";\n\nclass WS extends Transport {\n  /**\n   * WebSocket transport constructor.\n   *\n   * @api {Object} connection options\n   * @api public\n   */\n  constructor(opts) {\n    super(opts);\n\n    this.supportsBinary = !opts.forceBase64;\n  }\n\n  /**\n   * Transport name.\n   *\n   * @api public\n   */\n  get name() {\n    return \"websocket\";\n  }\n\n  /**\n   * Opens socket.\n   *\n   * @api private\n   */\n  doOpen() {\n    if (!this.check()) {\n      // let probe timeout\n      return;\n    }\n\n    const uri = this.uri();\n    const protocols = this.opts.protocols;\n\n    // React Native only supports the 'headers' option, and will print a warning if anything else is passed\n    const opts = isReactNative\n      ? {}\n      : pick(\n          this.opts,\n          \"agent\",\n          \"perMessageDeflate\",\n          \"pfx\",\n          \"key\",\n          \"passphrase\",\n          \"cert\",\n          \"ca\",\n          \"ciphers\",\n          \"rejectUnauthorized\",\n          \"localAddress\",\n          \"protocolVersion\",\n          \"origin\",\n          \"maxPayload\",\n          \"family\",\n          \"checkServerIdentity\"\n        );\n\n    if (this.opts.extraHeaders) {\n      opts.headers = this.opts.extraHeaders;\n    }\n\n    try {\n      this.ws =\n        usingBrowserWebSocket && !isReactNative\n          ? protocols\n            ? new WebSocket(uri, protocols)\n            : new WebSocket(uri)\n          : new WebSocket(uri, protocols, opts);\n    } catch (err) {\n      return this.emit(\"error\", err);\n    }\n\n    this.ws.binaryType = this.socket.binaryType || defaultBinaryType;\n\n    this.addEventListeners();\n  }\n\n  /**\n   * Adds event listeners to the socket\n   *\n   * @api private\n   */\n  addEventListeners() {\n    const self = this;\n\n    this.ws.onopen = function() {\n      self.onOpen();\n    };\n    this.ws.onclose = function() {\n      self.onClose();\n    };\n    this.ws.onmessage = function(ev) {\n      self.onData(ev.data);\n    };\n    this.ws.onerror = function(e) {\n      self.onError(\"websocket error\", e);\n    };\n  }\n\n  /**\n   * Writes data to socket.\n   *\n   * @param {Array} array of packets.\n   * @api private\n   */\n  write(packets) {\n    const self = this;\n    this.writable = false;\n\n    // encodePacket efficient as it uses WS framing\n    // no need for encodePayload\n    let total = packets.length;\n    let i = 0;\n    const l = total;\n    for (; i < l; i++) {\n      (function(packet) {\n        parser.encodePacket(packet, self.supportsBinary, function(data) {\n          // always create a new object (GH-437)\n          const opts = {};\n          if (!usingBrowserWebSocket) {\n            if (packet.options) {\n              opts.compress = packet.options.compress;\n            }\n\n            if (self.opts.perMessageDeflate) {\n              const len =\n                \"string\" === typeof data\n                  ? Buffer.byteLength(data)\n                  : data.length;\n              if (len < self.opts.perMessageDeflate.threshold) {\n                opts.compress = false;\n              }\n            }\n          }\n\n          // Sometimes the websocket has already been closed but the browser didn't\n          // have a chance of informing us about it yet, in that case send will\n          // throw an error\n          try {\n            if (usingBrowserWebSocket) {\n              // TypeError is thrown when passing the second argument on Safari\n              self.ws.send(data);\n            } else {\n              self.ws.send(data, opts);\n            }\n          } catch (e) {\n\n\n          }\n\n          --total || done();\n        });\n      })(packets[i]);\n    }\n\n    function done() {\n      self.emit(\"flush\");\n\n      // fake drain\n      // defer to next tick to allow Socket to clear writeBuffer\n      setTimeout(function() {\n        self.writable = true;\n        self.emit(\"drain\");\n      }, 0);\n    }\n  }\n\n  /**\n   * Called upon close\n   *\n   * @api private\n   */\n  onClose() {\n    Transport.prototype.onClose.call(this);\n  }\n\n  /**\n   * Closes socket.\n   *\n   * @api private\n   */\n  doClose() {\n    if (typeof this.ws !== \"undefined\") {\n      this.ws.close();\n      this.ws = null;\n    }\n  }\n\n  /**\n   * Generates uri for connection.\n   *\n   * @api private\n   */\n  uri() {\n    let query = this.query || {};\n    const schema = this.opts.secure ? \"wss\" : \"ws\";\n    let port = \"\";\n\n    // avoid port if default for schema\n    if (\n      this.opts.port &&\n      ((\"wss\" === schema && Number(this.opts.port) !== 443) ||\n        (\"ws\" === schema && Number(this.opts.port) !== 80))\n    ) {\n      port = \":\" + this.opts.port;\n    }\n\n    // append timestamp to URI\n    if (this.opts.timestampRequests) {\n      query[this.opts.timestampParam] = yeast();\n    }\n\n    // communicate binary support capabilities\n    if (!this.supportsBinary) {\n      query.b64 = 1;\n    }\n\n    query = parseqs.encode(query);\n\n    // prepend ? to query\n    if (query.length) {\n      query = \"?\" + query;\n    }\n\n    const ipv6 = this.opts.hostname.indexOf(\":\") !== -1;\n    return (\n      schema +\n      \"://\" +\n      (ipv6 ? \"[\" + this.opts.hostname + \"]\" : this.opts.hostname) +\n      port +\n      this.opts.path +\n      query\n    );\n  }\n\n  /**\n   * Feature detection for WebSocket.\n   *\n   * @return {Boolean} whether this transport is available.\n   * @api public\n   */\n  check() {\n    return (\n      !!WebSocket &&\n      !(\"__initialize\" in WebSocket && this.name === WS.prototype.name)\n    );\n  }\n}\n\nmodule.exports = WS;\n","const globalThis = require(\"../globalThis\");\n\nmodule.exports = {\n  WebSocket: globalThis.WebSocket || globalThis.MozWebSocket,\n  usingBrowserWebSocket: true,\n  defaultBinaryType: \"arraybuffer\"\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.reconstructPacket = exports.deconstructPacket = void 0;\nconst is_binary_1 = require(\"./is-binary\");\n/**\n * Replaces every Buffer | ArrayBuffer | Blob | File in packet with a numbered placeholder.\n *\n * @param {Object} packet - socket.io event packet\n * @return {Object} with deconstructed packet and list of buffers\n * @public\n */\nfunction deconstructPacket(packet) {\n    const buffers = [];\n    const packetData = packet.data;\n    const pack = packet;\n    pack.data = _deconstructPacket(packetData, buffers);\n    pack.attachments = buffers.length; // number of binary 'attachments'\n    return { packet: pack, buffers: buffers };\n}\nexports.deconstructPacket = deconstructPacket;\nfunction _deconstructPacket(data, buffers) {\n    if (!data)\n        return data;\n    if (is_binary_1.isBinary(data)) {\n        const placeholder = { _placeholder: true, num: buffers.length };\n        buffers.push(data);\n        return placeholder;\n    }\n    else if (Array.isArray(data)) {\n        const newData = new Array(data.length);\n        for (let i = 0; i < data.length; i++) {\n            newData[i] = _deconstructPacket(data[i], buffers);\n        }\n        return newData;\n    }\n    else if (typeof data === \"object\" && !(data instanceof Date)) {\n        const newData = {};\n        for (const key in data) {\n            if (data.hasOwnProperty(key)) {\n                newData[key] = _deconstructPacket(data[key], buffers);\n            }\n        }\n        return newData;\n    }\n    return data;\n}\n/**\n * Reconstructs a binary packet from its placeholder packet and buffers\n *\n * @param {Object} packet - event packet with placeholders\n * @param {Array} buffers - binary buffers to put in placeholder positions\n * @return {Object} reconstructed packet\n * @public\n */\nfunction reconstructPacket(packet, buffers) {\n    packet.data = _reconstructPacket(packet.data, buffers);\n    packet.attachments = undefined; // no longer useful\n    return packet;\n}\nexports.reconstructPacket = reconstructPacket;\nfunction _reconstructPacket(data, buffers) {\n    if (!data)\n        return data;\n    if (data && data._placeholder) {\n        return buffers[data.num]; // appropriate buffer (should be natural order anyway)\n    }\n    else if (Array.isArray(data)) {\n        for (let i = 0; i < data.length; i++) {\n            data[i] = _reconstructPacket(data[i], buffers);\n        }\n    }\n    else if (typeof data === \"object\") {\n        for (const key in data) {\n            if (data.hasOwnProperty(key)) {\n                data[key] = _reconstructPacket(data[key], buffers);\n            }\n        }\n    }\n    return data;\n}\n","\n/**\n * Expose `Backoff`.\n */\n\nmodule.exports = Backoff;\n\n/**\n * Initialize backoff timer with `opts`.\n *\n * - `min` initial timeout in milliseconds [100]\n * - `max` max timeout [10000]\n * - `jitter` [0]\n * - `factor` [2]\n *\n * @param {Object} opts\n * @api public\n */\n\nfunction Backoff(opts) {\n  opts = opts || {};\n  this.ms = opts.min || 100;\n  this.max = opts.max || 10000;\n  this.factor = opts.factor || 2;\n  this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0;\n  this.attempts = 0;\n}\n\n/**\n * Return the backoff duration.\n *\n * @return {Number}\n * @api public\n */\n\nBackoff.prototype.duration = function(){\n  var ms = this.ms * Math.pow(this.factor, this.attempts++);\n  if (this.jitter) {\n    var rand =  Math.random();\n    var deviation = Math.floor(rand * this.jitter * ms);\n    ms = (Math.floor(rand * 10) & 1) == 0  ? ms - deviation : ms + deviation;\n  }\n  return Math.min(ms, this.max) | 0;\n};\n\n/**\n * Reset the number of attempts.\n *\n * @api public\n */\n\nBackoff.prototype.reset = function(){\n  this.attempts = 0;\n};\n\n/**\n * Set the minimum duration\n *\n * @api public\n */\n\nBackoff.prototype.setMin = function(min){\n  this.ms = min;\n};\n\n/**\n * Set the maximum duration\n *\n * @api public\n */\n\nBackoff.prototype.setMax = function(max){\n  this.max = max;\n};\n\n/**\n * Set the jitter\n *\n * @api public\n */\n\nBackoff.prototype.setJitter = function(jitter){\n  this.jitter = jitter;\n};\n\n","export default typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined';\n","import isBrowser from './isBrowser';\n\nconst timeoutDuration = (function(){\n  const longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\n  for (let i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n    if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n      return 1;\n    }\n  }\n  return 0;\n}());\n\nexport function microtaskDebounce(fn) {\n  let called = false\n  return () => {\n    if (called) {\n      return\n    }\n    called = true\n    window.Promise.resolve().then(() => {\n      called = false\n      fn()\n    })\n  }\n}\n\nexport function taskDebounce(fn) {\n  let scheduled = false;\n  return () => {\n    if (!scheduled) {\n      scheduled = true;\n      setTimeout(() => {\n        scheduled = false;\n        fn();\n      }, timeoutDuration);\n    }\n  };\n}\n\nconst supportsMicroTasks = isBrowser && window.Promise\n\n\n/**\n* Create a debounced version of a method, that's asynchronously deferred\n* but called in the minimum time possible.\n*\n* @method\n* @memberof Popper.Utils\n* @argument {Function} fn\n* @returns {Function}\n*/\nexport default (supportsMicroTasks\n  ? microtaskDebounce\n  : taskDebounce);\n","/**\n * Check if the given variable is a function\n * @method\n * @memberof Popper.Utils\n * @argument {Any} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\nexport default function isFunction(functionToCheck) {\n  const getType = {};\n  return (\n    functionToCheck &&\n    getType.toString.call(functionToCheck) === '[object Function]'\n  );\n}\n","/**\n * Get CSS computed property of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Eement} element\n * @argument {String} property\n */\nexport default function getStyleComputedProperty(element, property) {\n  if (element.nodeType !== 1) {\n    return [];\n  }\n  // NOTE: 1 DOM access here\n  const window = element.ownerDocument.defaultView;\n  const css = window.getComputedStyle(element, null);\n  return property ? css[property] : css;\n}\n","/**\n * Returns the parentNode or the host of the element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} parent\n */\nexport default function getParentNode(element) {\n  if (element.nodeName === 'HTML') {\n    return element;\n  }\n  return element.parentNode || element.host;\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport getParentNode from './getParentNode';\n\n/**\n * Returns the scrolling parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} scroll parent\n */\nexport default function getScrollParent(element) {\n  // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n  if (!element) {\n    return document.body\n  }\n\n  switch (element.nodeName) {\n    case 'HTML':\n    case 'BODY':\n      return element.ownerDocument.body\n    case '#document':\n      return element.body\n  }\n\n  // Firefox want us to check `-x` and `-y` variations as well\n  const { overflow, overflowX, overflowY } = getStyleComputedProperty(element);\n  if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n    return element;\n  }\n\n  return getScrollParent(getParentNode(element));\n}\n","/**\n * Returns the reference node of the reference object, or the reference object itself.\n * @method\n * @memberof Popper.Utils\n * @param {Element|Object} reference - the reference element (the popper will be relative to this)\n * @returns {Element} parent\n */\nexport default function getReferenceNode(reference) {\n  return reference && reference.referenceNode ? reference.referenceNode : reference;\n}\n","import isBrowser from './isBrowser';\n\nconst isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\nconst isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\n\n/**\n * Determines if the browser is Internet Explorer\n * @method\n * @memberof Popper.Utils\n * @param {Number} version to check\n * @returns {Boolean} isIE\n */\nexport default function isIE(version) {\n  if (version === 11) {\n    return isIE11;\n  }\n  if (version === 10) {\n    return isIE10;\n  }\n  return isIE11 || isIE10;\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport isIE from './isIE';\n/**\n * Returns the offset parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} offset parent\n */\nexport default function getOffsetParent(element) {\n  if (!element) {\n    return document.documentElement;\n  }\n\n  const noOffsetParent = isIE(10) ? document.body : null;\n\n  // NOTE: 1 DOM access here\n  let offsetParent = element.offsetParent || null;\n  // Skip hidden elements which don't have an offsetParent\n  while (offsetParent === noOffsetParent && element.nextElementSibling) {\n    offsetParent = (element = element.nextElementSibling).offsetParent;\n  }\n\n  const nodeName = offsetParent && offsetParent.nodeName;\n\n  if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n    return element ? element.ownerDocument.documentElement : document.documentElement;\n  }\n\n  // .offsetParent will return the closest TH, TD or TABLE in case\n  // no offsetParent is present, I hate this job...\n  if (\n    ['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 &&\n    getStyleComputedProperty(offsetParent, 'position') === 'static'\n  ) {\n    return getOffsetParent(offsetParent);\n  }\n\n  return offsetParent;\n}\n","import getOffsetParent from './getOffsetParent';\n\nexport default function isOffsetContainer(element) {\n  const { nodeName } = element;\n  if (nodeName === 'BODY') {\n    return false;\n  }\n  return (\n    nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element\n  );\n}\n","/**\n * Finds the root node (document, shadowDOM root) of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} node\n * @returns {Element} root node\n */\nexport default function getRoot(node) {\n  if (node.parentNode !== null) {\n    return getRoot(node.parentNode);\n  }\n\n  return node;\n}\n","import isOffsetContainer from './isOffsetContainer';\nimport getRoot from './getRoot';\nimport getOffsetParent from './getOffsetParent';\n\n/**\n * Finds the offset parent common to the two provided nodes\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element1\n * @argument {Element} element2\n * @returns {Element} common offset parent\n */\nexport default function findCommonOffsetParent(element1, element2) {\n  // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n  if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n    return document.documentElement;\n  }\n\n  // Here we make sure to give as \"start\" the element that comes first in the DOM\n  const order =\n    element1.compareDocumentPosition(element2) &\n    Node.DOCUMENT_POSITION_FOLLOWING;\n  const start = order ? element1 : element2;\n  const end = order ? element2 : element1;\n\n  // Get common ancestor container\n  const range = document.createRange();\n  range.setStart(start, 0);\n  range.setEnd(end, 0);\n  const { commonAncestorContainer } = range;\n\n  // Both nodes are inside #document\n  if (\n    (element1 !== commonAncestorContainer &&\n      element2 !== commonAncestorContainer) ||\n    start.contains(end)\n  ) {\n    if (isOffsetContainer(commonAncestorContainer)) {\n      return commonAncestorContainer;\n    }\n\n    return getOffsetParent(commonAncestorContainer);\n  }\n\n  // one of the nodes is inside shadowDOM, find which one\n  const element1root = getRoot(element1);\n  if (element1root.host) {\n    return findCommonOffsetParent(element1root.host, element2);\n  } else {\n    return findCommonOffsetParent(element1, getRoot(element2).host);\n  }\n}\n","/**\n * Gets the scroll value of the given element in the given side (top and left)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {String} side `top` or `left`\n * @returns {number} amount of scrolled pixels\n */\nexport default function getScroll(element, side = 'top') {\n  const upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n  const nodeName = element.nodeName;\n\n  if (nodeName === 'BODY' || nodeName === 'HTML') {\n    const html = element.ownerDocument.documentElement;\n    const scrollingElement = element.ownerDocument.scrollingElement || html;\n    return scrollingElement[upperSide];\n  }\n\n  return element[upperSide];\n}\n","import getScroll from './getScroll';\n\n/*\n * Sum or subtract the element scroll values (left and top) from a given rect object\n * @method\n * @memberof Popper.Utils\n * @param {Object} rect - Rect object you want to change\n * @param {HTMLElement} element - The element from the function reads the scroll values\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n * @return {Object} rect - The modifier rect object\n */\nexport default function includeScroll(rect, element, subtract = false) {\n  const scrollTop = getScroll(element, 'top');\n  const scrollLeft = getScroll(element, 'left');\n  const modifier = subtract ? -1 : 1;\n  rect.top += scrollTop * modifier;\n  rect.bottom += scrollTop * modifier;\n  rect.left += scrollLeft * modifier;\n  rect.right += scrollLeft * modifier;\n  return rect;\n}\n","/*\n * Helper to detect borders of a given element\n * @method\n * @memberof Popper.Utils\n * @param {CSSStyleDeclaration} styles\n * Result of `getStyleComputedProperty` on the given element\n * @param {String} axis - `x` or `y`\n * @return {number} borders - The borders size of the given axis\n */\n\nexport default function getBordersSize(styles, axis) {\n  const sideA = axis === 'x' ? 'Left' : 'Top';\n  const sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n  return (\n    parseFloat(styles[`border${sideA}Width`]) +\n    parseFloat(styles[`border${sideB}Width`])\n  );\n}\n","import isIE from './isIE';\n\nfunction getSize(axis, body, html, computedStyle) {\n  return Math.max(\n    body[`offset${axis}`],\n    body[`scroll${axis}`],\n    html[`client${axis}`],\n    html[`offset${axis}`],\n    html[`scroll${axis}`],\n    isIE(10)\n      ? (parseInt(html[`offset${axis}`]) + \n      parseInt(computedStyle[`margin${axis === 'Height' ? 'Top' : 'Left'}`]) + \n      parseInt(computedStyle[`margin${axis === 'Height' ? 'Bottom' : 'Right'}`]))\n    : 0 \n  );\n}\n\nexport default function getWindowSizes(document) {\n  const body = document.body;\n  const html = document.documentElement;\n  const computedStyle = isIE(10) && getComputedStyle(html);\n\n  return {\n    height: getSize('Height', body, html, computedStyle),\n    width: getSize('Width', body, html, computedStyle),\n  };\n}\n","/**\n * Given element offsets, generate an output similar to getBoundingClientRect\n * @method\n * @memberof Popper.Utils\n * @argument {Object} offsets\n * @returns {Object} ClientRect like output\n */\nexport default function getClientRect(offsets) {\n  return {\n    ...offsets,\n    right: offsets.left + offsets.width,\n    bottom: offsets.top + offsets.height,\n  };\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport getBordersSize from './getBordersSize';\nimport getWindowSizes from './getWindowSizes';\nimport getScroll from './getScroll';\nimport getClientRect from './getClientRect';\nimport isIE from './isIE';\n\n/**\n * Get bounding client rect of given element\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} element\n * @return {Object} client rect\n */\nexport default function getBoundingClientRect(element) {\n  let rect = {};\n\n  // IE10 10 FIX: Please, don't ask, the element isn't\n  // considered in DOM in some circumstances...\n  // This isn't reproducible in IE10 compatibility mode of IE11\n  try {\n    if (isIE(10)) {\n      rect = element.getBoundingClientRect();\n      const scrollTop = getScroll(element, 'top');\n      const scrollLeft = getScroll(element, 'left');\n      rect.top += scrollTop;\n      rect.left += scrollLeft;\n      rect.bottom += scrollTop;\n      rect.right += scrollLeft;\n    }\n    else {\n      rect = element.getBoundingClientRect();\n    }\n  }\n  catch(e){}\n\n  const result = {\n    left: rect.left,\n    top: rect.top,\n    width: rect.right - rect.left,\n    height: rect.bottom - rect.top,\n  };\n\n  // subtract scrollbar size from sizes\n  const sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\n  const width =\n    sizes.width || element.clientWidth || result.width;\n  const height =\n    sizes.height || element.clientHeight || result.height;\n\n  let horizScrollbar = element.offsetWidth - width;\n  let vertScrollbar = element.offsetHeight - height;\n\n  // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n  // we make this check conditional for performance reasons\n  if (horizScrollbar || vertScrollbar) {\n    const styles = getStyleComputedProperty(element);\n    horizScrollbar -= getBordersSize(styles, 'x');\n    vertScrollbar -= getBordersSize(styles, 'y');\n\n    result.width -= horizScrollbar;\n    result.height -= vertScrollbar;\n  }\n\n  return getClientRect(result);\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport includeScroll from './includeScroll';\nimport getScrollParent from './getScrollParent';\nimport getBoundingClientRect from './getBoundingClientRect';\nimport runIsIE from './isIE';\nimport getClientRect from './getClientRect';\n\nexport default function getOffsetRectRelativeToArbitraryNode(children, parent, fixedPosition = false) {\n  const isIE10 = runIsIE(10);\n  const isHTML = parent.nodeName === 'HTML';\n  const childrenRect = getBoundingClientRect(children);\n  const parentRect = getBoundingClientRect(parent);\n  const scrollParent = getScrollParent(children);\n\n  const styles = getStyleComputedProperty(parent);\n  const borderTopWidth = parseFloat(styles.borderTopWidth);\n  const borderLeftWidth = parseFloat(styles.borderLeftWidth);\n\n  // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n  if(fixedPosition && isHTML) {\n    parentRect.top = Math.max(parentRect.top, 0);\n    parentRect.left = Math.max(parentRect.left, 0);\n  }\n  let offsets = getClientRect({\n    top: childrenRect.top - parentRect.top - borderTopWidth,\n    left: childrenRect.left - parentRect.left - borderLeftWidth,\n    width: childrenRect.width,\n    height: childrenRect.height,\n  });\n  offsets.marginTop = 0;\n  offsets.marginLeft = 0;\n\n  // Subtract margins of documentElement in case it's being used as parent\n  // we do this only on HTML because it's the only element that behaves\n  // differently when margins are applied to it. The margins are included in\n  // the box of the documentElement, in the other cases not.\n  if (!isIE10 && isHTML) {\n    const marginTop = parseFloat(styles.marginTop);\n    const marginLeft = parseFloat(styles.marginLeft);\n\n    offsets.top -= borderTopWidth - marginTop;\n    offsets.bottom -= borderTopWidth - marginTop;\n    offsets.left -= borderLeftWidth - marginLeft;\n    offsets.right -= borderLeftWidth - marginLeft;\n\n    // Attach marginTop and marginLeft because in some circumstances we may need them\n    offsets.marginTop = marginTop;\n    offsets.marginLeft = marginLeft;\n  }\n\n  if (\n    isIE10 && !fixedPosition\n      ? parent.contains(scrollParent)\n      : parent === scrollParent && scrollParent.nodeName !== 'BODY'\n  ) {\n    offsets = includeScroll(offsets, parent);\n  }\n\n  return offsets;\n}\n","import getOffsetRectRelativeToArbitraryNode from './getOffsetRectRelativeToArbitraryNode';\nimport getScroll from './getScroll';\nimport getClientRect from './getClientRect';\n\nexport default function getViewportOffsetRectRelativeToArtbitraryNode(element, excludeScroll = false) {\n  const html = element.ownerDocument.documentElement;\n  const relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n  const width = Math.max(html.clientWidth, window.innerWidth || 0);\n  const height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n  const scrollTop = !excludeScroll ? getScroll(html) : 0;\n  const scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n\n  const offset = {\n    top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n    left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n    width,\n    height,\n  };\n\n  return getClientRect(offset);\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport getParentNode from './getParentNode';\n\n/**\n * Check if the given element is fixed or is inside a fixed parent\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {Element} customContainer\n * @returns {Boolean} answer to \"isFixed?\"\n */\nexport default function isFixed(element) {\n  const nodeName = element.nodeName;\n  if (nodeName === 'BODY' || nodeName === 'HTML') {\n    return false;\n  }\n  if (getStyleComputedProperty(element, 'position') === 'fixed') {\n    return true;\n  }\n  const parentNode = getParentNode(element);\n  if (!parentNode) {\n    return false;\n  }\n  return isFixed(parentNode);\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport isIE from './isIE';\n/**\n * Finds the first parent of an element that has a transformed property defined\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} first transformed parent or documentElement\n */\n\nexport default function getFixedPositionOffsetParent(element) {\n  // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n   if (!element || !element.parentElement || isIE()) {\n    return document.documentElement;\n  }\n  let el = element.parentElement;\n  while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n    el = el.parentElement;\n  }\n  return el || document.documentElement;\n\n}\n","import getScrollParent from './getScrollParent';\nimport getParentNode from './getParentNode';\nimport getReferenceNode from './getReferenceNode';\nimport findCommonOffsetParent from './findCommonOffsetParent';\nimport getOffsetRectRelativeToArbitraryNode from './getOffsetRectRelativeToArbitraryNode';\nimport getViewportOffsetRectRelativeToArtbitraryNode from './getViewportOffsetRectRelativeToArtbitraryNode';\nimport getWindowSizes from './getWindowSizes';\nimport isFixed from './isFixed';\nimport getFixedPositionOffsetParent from './getFixedPositionOffsetParent';\n\n/**\n * Computed the boundaries limits and return them\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} popper\n * @param {HTMLElement} reference\n * @param {number} padding\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n * @param {Boolean} fixedPosition - Is in fixed position mode\n * @returns {Object} Coordinates of the boundaries\n */\nexport default function getBoundaries(\n  popper,\n  reference,\n  padding,\n  boundariesElement,\n  fixedPosition = false\n) {\n  // NOTE: 1 DOM access here\n\n  let boundaries = { top: 0, left: 0 };\n  const offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n\n  // Handle viewport case\n  if (boundariesElement === 'viewport' ) {\n    boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n  }\n\n  else {\n    // Handle other cases based on DOM element used as boundaries\n    let boundariesNode;\n    if (boundariesElement === 'scrollParent') {\n      boundariesNode = getScrollParent(getParentNode(reference));\n      if (boundariesNode.nodeName === 'BODY') {\n        boundariesNode = popper.ownerDocument.documentElement;\n      }\n    } else if (boundariesElement === 'window') {\n      boundariesNode = popper.ownerDocument.documentElement;\n    } else {\n      boundariesNode = boundariesElement;\n    }\n\n    const offsets = getOffsetRectRelativeToArbitraryNode(\n      boundariesNode,\n      offsetParent,\n      fixedPosition\n    );\n\n    // In case of HTML, we need a different computation\n    if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n      const { height, width } = getWindowSizes(popper.ownerDocument);\n      boundaries.top += offsets.top - offsets.marginTop;\n      boundaries.bottom = height + offsets.top;\n      boundaries.left += offsets.left - offsets.marginLeft;\n      boundaries.right = width + offsets.left;\n    } else {\n      // for all the other DOM elements, this one is good\n      boundaries = offsets;\n    }\n  }\n\n  // Add paddings\n  padding = padding || 0;\n  const isPaddingNumber = typeof padding === 'number';\n  boundaries.left += isPaddingNumber ? padding : padding.left || 0; \n  boundaries.top += isPaddingNumber ? padding : padding.top || 0; \n  boundaries.right -= isPaddingNumber ? padding : padding.right || 0; \n  boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0; \n\n  return boundaries;\n}\n","import getBoundaries from '../utils/getBoundaries';\n\nfunction getArea({ width, height }) {\n  return width * height;\n}\n\n/**\n * Utility used to transform the `auto` placement to the placement with more\n * available space.\n * @method\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function computeAutoPlacement(\n  placement,\n  refRect,\n  popper,\n  reference,\n  boundariesElement,\n  padding = 0\n) {\n  if (placement.indexOf('auto') === -1) {\n    return placement;\n  }\n\n  const boundaries = getBoundaries(\n    popper,\n    reference,\n    padding,\n    boundariesElement\n  );\n\n  const rects = {\n    top: {\n      width: boundaries.width,\n      height: refRect.top - boundaries.top,\n    },\n    right: {\n      width: boundaries.right - refRect.right,\n      height: boundaries.height,\n    },\n    bottom: {\n      width: boundaries.width,\n      height: boundaries.bottom - refRect.bottom,\n    },\n    left: {\n      width: refRect.left - boundaries.left,\n      height: boundaries.height,\n    },\n  };\n\n  const sortedAreas = Object.keys(rects)\n    .map(key => ({\n      key,\n      ...rects[key],\n      area: getArea(rects[key]),\n    }))\n    .sort((a, b) => b.area - a.area);\n\n  const filteredAreas = sortedAreas.filter(\n    ({ width, height }) =>\n      width >= popper.clientWidth && height >= popper.clientHeight\n  );\n\n  const computedPlacement = filteredAreas.length > 0\n    ? filteredAreas[0].key\n    : sortedAreas[0].key;\n\n  const variation = placement.split('-')[1];\n\n  return computedPlacement + (variation ? `-${variation}` : '');\n}\n","import findCommonOffsetParent from './findCommonOffsetParent';\nimport getOffsetRectRelativeToArbitraryNode from './getOffsetRectRelativeToArbitraryNode';\nimport getFixedPositionOffsetParent from './getFixedPositionOffsetParent';\nimport getReferenceNode from './getReferenceNode';\n\n/**\n * Get offsets to the reference element\n * @method\n * @memberof Popper.Utils\n * @param {Object} state\n * @param {Element} popper - the popper element\n * @param {Element} reference - the reference element (the popper will be relative to this)\n * @param {Element} fixedPosition - is in fixed position mode\n * @returns {Object} An object containing the offsets which will be applied to the popper\n */\nexport default function getReferenceOffsets(state, popper, reference, fixedPosition = null) {\n  const commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n  return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n}\n","/**\n * Get the outer sizes of the given element (offset size + margins)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Object} object containing width and height properties\n */\nexport default function getOuterSizes(element) {\n  const window = element.ownerDocument.defaultView;\n  const styles = window.getComputedStyle(element);\n  const x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\n  const y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\n  const result = {\n    width: element.offsetWidth + y,\n    height: element.offsetHeight + x,\n  };\n  return result;\n}\n","/**\n * Get the opposite placement of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement\n * @returns {String} flipped placement\n */\nexport default function getOppositePlacement(placement) {\n  const hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n  return placement.replace(/left|right|bottom|top/g, matched => hash[matched]);\n}\n","import getOuterSizes from './getOuterSizes';\nimport getOppositePlacement from './getOppositePlacement';\n\n/**\n * Get offsets to the popper\n * @method\n * @memberof Popper.Utils\n * @param {Object} position - CSS position the Popper will get applied\n * @param {HTMLElement} popper - the popper element\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n * @param {String} placement - one of the valid placement options\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n */\nexport default function getPopperOffsets(popper, referenceOffsets, placement) {\n  placement = placement.split('-')[0];\n\n  // Get popper node sizes\n  const popperRect = getOuterSizes(popper);\n\n  // Add position, width and height to our offsets object\n  const popperOffsets = {\n    width: popperRect.width,\n    height: popperRect.height,\n  };\n\n  // depending by the popper placement we have to compute its offsets slightly differently\n  const isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n  const mainSide = isHoriz ? 'top' : 'left';\n  const secondarySide = isHoriz ? 'left' : 'top';\n  const measurement = isHoriz ? 'height' : 'width';\n  const secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n  popperOffsets[mainSide] =\n    referenceOffsets[mainSide] +\n    referenceOffsets[measurement] / 2 -\n    popperRect[measurement] / 2;\n  if (placement === secondarySide) {\n    popperOffsets[secondarySide] =\n      referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n  } else {\n    popperOffsets[secondarySide] =\n      referenceOffsets[getOppositePlacement(secondarySide)];\n  }\n\n  return popperOffsets;\n}\n","/**\n * Mimics the `find` method of Array\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nexport default function find(arr, check) {\n  // use native find if supported\n  if (Array.prototype.find) {\n    return arr.find(check);\n  }\n\n  // use `filter` to obtain the same behavior of `find`\n  return arr.filter(check)[0];\n}\n","import find from './find';\n\n/**\n * Return the index of the matching object\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nexport default function findIndex(arr, prop, value) {\n  // use native findIndex if supported\n  if (Array.prototype.findIndex) {\n    return arr.findIndex(cur => cur[prop] === value);\n  }\n\n  // use `find` + `indexOf` if `findIndex` isn't supported\n  const match = find(arr, obj => obj[prop] === value);\n  return arr.indexOf(match);\n}\n","import isFunction from './isFunction';\nimport findIndex from './findIndex';\nimport getClientRect from '../utils/getClientRect';\n\n/**\n * Loop trough the list of modifiers and run them in order,\n * each of them will then edit the data object.\n * @method\n * @memberof Popper.Utils\n * @param {dataObject} data\n * @param {Array} modifiers\n * @param {String} ends - Optional modifier name used as stopper\n * @returns {dataObject}\n */\nexport default function runModifiers(modifiers, data, ends) {\n  const modifiersToRun = ends === undefined\n    ? modifiers\n    : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n  modifiersToRun.forEach(modifier => {\n    if (modifier['function']) { // eslint-disable-line dot-notation\n      console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n    }\n    const fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n    if (modifier.enabled && isFunction(fn)) {\n      // Add properties to offsets to make them a complete clientRect object\n      // we do this before each modifier to make sure the previous one doesn't\n      // mess with these values\n      data.offsets.popper = getClientRect(data.offsets.popper);\n      data.offsets.reference = getClientRect(data.offsets.reference);\n\n      data = fn(data, modifier);\n    }\n  });\n\n  return data;\n}\n","import computeAutoPlacement from '../utils/computeAutoPlacement';\nimport getReferenceOffsets from '../utils/getReferenceOffsets';\nimport getPopperOffsets from '../utils/getPopperOffsets';\nimport runModifiers from '../utils/runModifiers';\n\n/**\n * Updates the position of the popper, computing the new offsets and applying\n * the new style.<br />\n * Prefer `scheduleUpdate` over `update` because of performance reasons.\n * @method\n * @memberof Popper\n */\nexport default function update() {\n  // if popper is destroyed, don't perform any further update\n  if (this.state.isDestroyed) {\n    return;\n  }\n\n  let data = {\n    instance: this,\n    styles: {},\n    arrowStyles: {},\n    attributes: {},\n    flipped: false,\n    offsets: {},\n  };\n\n  // compute reference element offsets\n  data.offsets.reference = getReferenceOffsets(\n    this.state,\n    this.popper,\n    this.reference,\n    this.options.positionFixed\n  );\n\n  // compute auto placement, store placement inside the data object,\n  // modifiers will be able to edit `placement` if needed\n  // and refer to originalPlacement to know the original value\n  data.placement = computeAutoPlacement(\n    this.options.placement,\n    data.offsets.reference,\n    this.popper,\n    this.reference,\n    this.options.modifiers.flip.boundariesElement,\n    this.options.modifiers.flip.padding\n  );\n\n  // store the computed placement inside `originalPlacement`\n  data.originalPlacement = data.placement;\n\n  data.positionFixed = this.options.positionFixed;\n\n  // compute the popper offsets\n  data.offsets.popper = getPopperOffsets(\n    this.popper,\n    data.offsets.reference,\n    data.placement\n  );\n\n  data.offsets.popper.position = this.options.positionFixed\n    ? 'fixed'\n    : 'absolute';\n\n  // run the modifiers\n  data = runModifiers(this.modifiers, data);\n\n  // the first `update` will call `onCreate` callback\n  // the other ones will call `onUpdate` callback\n  if (!this.state.isCreated) {\n    this.state.isCreated = true;\n    this.options.onCreate(data);\n  } else {\n    this.options.onUpdate(data);\n  }\n}\n","/**\n * Helper used to know if the given modifier is enabled.\n * @method\n * @memberof Popper.Utils\n * @returns {Boolean}\n */\nexport default function isModifierEnabled(modifiers, modifierName) {\n  return modifiers.some(\n    ({ name, enabled }) => enabled && name === modifierName\n  );\n}\n","/**\n * Get the prefixed supported property name\n * @method\n * @memberof Popper.Utils\n * @argument {String} property (camelCase)\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n */\nexport default function getSupportedPropertyName(property) {\n  const prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n  const upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n  for (let i = 0; i < prefixes.length; i++) {\n    const prefix = prefixes[i];\n    const toCheck = prefix ? `${prefix}${upperProp}` : property;\n    if (typeof document.body.style[toCheck] !== 'undefined') {\n      return toCheck;\n    }\n  }\n  return null;\n}\n","import isModifierEnabled from '../utils/isModifierEnabled';\nimport getSupportedPropertyName from '../utils/getSupportedPropertyName';\n\n/**\n * Destroys the popper.\n * @method\n * @memberof Popper\n */\nexport default function destroy() {\n  this.state.isDestroyed = true;\n\n  // touch DOM only if `applyStyle` modifier is enabled\n  if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n    this.popper.removeAttribute('x-placement');\n    this.popper.style.position = '';\n    this.popper.style.top = '';\n    this.popper.style.left = '';\n    this.popper.style.right = '';\n    this.popper.style.bottom = '';\n    this.popper.style.willChange = '';\n    this.popper.style[getSupportedPropertyName('transform')] = '';\n  }\n\n  this.disableEventListeners();\n\n  // remove the popper if user explicitly asked for the deletion on destroy\n  // do not use `remove` because IE11 doesn't support it\n  if (this.options.removeOnDestroy) {\n    this.popper.parentNode.removeChild(this.popper);\n  }\n  return this;\n}\n","/**\n * Get the window associated with the element\n * @argument {Element} element\n * @returns {Window}\n */\nexport default function getWindow(element) {\n  const ownerDocument = element.ownerDocument;\n  return ownerDocument ? ownerDocument.defaultView : window;\n}\n","import getScrollParent from './getScrollParent';\nimport getWindow from './getWindow';\n\nfunction attachToScrollParents(scrollParent, event, callback, scrollParents) {\n  const isBody = scrollParent.nodeName === 'BODY';\n  const target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n  target.addEventListener(event, callback, { passive: true });\n\n  if (!isBody) {\n    attachToScrollParents(\n      getScrollParent(target.parentNode),\n      event,\n      callback,\n      scrollParents\n    );\n  }\n  scrollParents.push(target);\n}\n\n/**\n * Setup needed event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nexport default function setupEventListeners(\n  reference,\n  options,\n  state,\n  updateBound\n) {\n  // Resize event listener on window\n  state.updateBound = updateBound;\n  getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n  // Scroll event listener on scroll parents\n  const scrollElement = getScrollParent(reference);\n  attachToScrollParents(\n    scrollElement,\n    'scroll',\n    state.updateBound,\n    state.scrollParents\n  );\n  state.scrollElement = scrollElement;\n  state.eventsEnabled = true;\n\n  return state;\n}\n","import setupEventListeners from '../utils/setupEventListeners';\n\n/**\n * It will add resize/scroll events and start recalculating\n * position of the popper element when they are triggered.\n * @method\n * @memberof Popper\n */\nexport default function enableEventListeners() {\n  if (!this.state.eventsEnabled) {\n    this.state = setupEventListeners(\n      this.reference,\n      this.options,\n      this.state,\n      this.scheduleUpdate\n    );\n  }\n}\n","import getWindow from './getWindow';\n\n/**\n * Remove event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nexport default function removeEventListeners(reference, state) {\n  // Remove resize event listener on window\n  getWindow(reference).removeEventListener('resize', state.updateBound);\n\n  // Remove scroll event listener on scroll parents\n  state.scrollParents.forEach(target => {\n    target.removeEventListener('scroll', state.updateBound);\n  });\n\n  // Reset state\n  state.updateBound = null;\n  state.scrollParents = [];\n  state.scrollElement = null;\n  state.eventsEnabled = false;\n  return state;\n}\n","import removeEventListeners from '../utils/removeEventListeners';\n\n/**\n * It will remove resize/scroll events and won't recalculate popper position\n * when they are triggered. It also won't trigger `onUpdate` callback anymore,\n * unless you call `update` method manually.\n * @method\n * @memberof Popper\n */\nexport default function disableEventListeners() {\n  if (this.state.eventsEnabled) {\n    cancelAnimationFrame(this.scheduleUpdate);\n    this.state = removeEventListeners(this.reference, this.state);\n  }\n}\n","/**\n * Tells if a given input is a number\n * @method\n * @memberof Popper.Utils\n * @param {*} input to check\n * @return {Boolean}\n */\nexport default function isNumeric(n) {\n  return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n}\n","import isNumeric from './isNumeric';\n\n/**\n * Set the style to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the style to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nexport default function setStyles(element, styles) {\n  Object.keys(styles).forEach(prop => {\n    let unit = '';\n    // add unit if the value is numeric and is one of the following\n    if (\n      ['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !==\n        -1 &&\n      isNumeric(styles[prop])\n    ) {\n      unit = 'px';\n    }\n    element.style[prop] = styles[prop] + unit;\n  });\n}\n","/**\n * Set the attributes to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the attributes to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nexport default function setAttributes(element, attributes) {\n  Object.keys(attributes).forEach(function(prop) {\n    const value = attributes[prop];\n    if (value !== false) {\n      element.setAttribute(prop, attributes[prop]);\n    } else {\n      element.removeAttribute(prop);\n    }\n  });\n}\n","import setStyles from '../utils/setStyles';\nimport setAttributes from '../utils/setAttributes';\nimport getReferenceOffsets from '../utils/getReferenceOffsets';\nimport computeAutoPlacement from '../utils/computeAutoPlacement';\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} data.styles - List of style properties - values to apply to popper element\n * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The same data object\n */\nexport default function applyStyle(data) {\n  // any property present in `data.styles` will be applied to the popper,\n  // in this way we can make the 3rd party modifiers add custom styles to it\n  // Be aware, modifiers could override the properties defined in the previous\n  // lines of this modifier!\n  setStyles(data.instance.popper, data.styles);\n\n  // any property present in `data.attributes` will be applied to the popper,\n  // they will be set as HTML attributes of the element\n  setAttributes(data.instance.popper, data.attributes);\n\n  // if arrowElement is defined and arrowStyles has some properties\n  if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n    setStyles(data.arrowElement, data.arrowStyles);\n  }\n\n  return data;\n}\n\n/**\n * Set the x-placement attribute before everything else because it could be used\n * to add margins to the popper margins needs to be calculated to get the\n * correct popper offsets.\n * @method\n * @memberof Popper.modifiers\n * @param {HTMLElement} reference - The reference element used to position the popper\n * @param {HTMLElement} popper - The HTML element used as popper\n * @param {Object} options - Popper.js options\n */\nexport function applyStyleOnLoad(\n  reference,\n  popper,\n  options,\n  modifierOptions,\n  state\n) {\n  // compute reference element offsets\n  const referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\n\n  // compute auto placement, store placement inside the data object,\n  // modifiers will be able to edit `placement` if needed\n  // and refer to originalPlacement to know the original value\n  const placement = computeAutoPlacement(\n    options.placement,\n    referenceOffsets,\n    popper,\n    reference,\n    options.modifiers.flip.boundariesElement,\n    options.modifiers.flip.padding\n  );\n\n  popper.setAttribute('x-placement', placement);\n\n  // Apply `position` to popper before anything else because\n  // without the position applied we can't guarantee correct computations\n  setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\n\n  return options;\n}\n","/**\n * @function\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Boolean} shouldRound - If the offsets should be rounded at all\n * @returns {Object} The popper's position offsets rounded\n *\n * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\n * good as it can be within reason.\n * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\n *\n * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\n * as well on High DPI screens).\n *\n * Firefox prefers no rounding for positioning and does not have blurriness on\n * high DPI screens.\n *\n * Only horizontal placement and left/right values need to be considered.\n */\nexport default function getRoundedOffsets(data, shouldRound) {\n  const { popper, reference } = data.offsets;\n  const { round, floor } = Math;\n  const noRound = v => v;\n  \n  const referenceWidth = round(reference.width);\n  const popperWidth = round(popper.width);\n  \n  const isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\n  const isVariation = data.placement.indexOf('-') !== -1;\n  const sameWidthParity = referenceWidth % 2 === popperWidth % 2;\n  const bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\n\n  const horizontalToInteger = !shouldRound\n    ? noRound\n    : isVertical || isVariation || sameWidthParity\n    ? round\n    : floor;\n  const verticalToInteger = !shouldRound ? noRound : round;\n\n  return {\n    left: horizontalToInteger(\n      bothOddWidth && !isVariation && shouldRound\n        ? popper.left - 1\n        : popper.left\n    ),\n    top: verticalToInteger(popper.top),\n    bottom: verticalToInteger(popper.bottom),\n    right: horizontalToInteger(popper.right),\n  };\n}\n","import getSupportedPropertyName from '../utils/getSupportedPropertyName';\nimport find from '../utils/find';\nimport getOffsetParent from '../utils/getOffsetParent';\nimport getBoundingClientRect from '../utils/getBoundingClientRect';\nimport getRoundedOffsets from '../utils/getRoundedOffsets';\nimport isBrowser from '../utils/isBrowser';\n\nconst isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function computeStyle(data, options) {\n  const { x, y } = options;\n  const { popper } = data.offsets;\n\n  // Remove this legacy support in Popper.js v2\n  const legacyGpuAccelerationOption = find(\n    data.instance.modifiers,\n    modifier => modifier.name === 'applyStyle'\n  ).gpuAcceleration;\n  if (legacyGpuAccelerationOption !== undefined) {\n    console.warn(\n      'WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!'\n    );\n  }\n  const gpuAcceleration =\n    legacyGpuAccelerationOption !== undefined\n      ? legacyGpuAccelerationOption\n      : options.gpuAcceleration;\n\n  const offsetParent = getOffsetParent(data.instance.popper);\n  const offsetParentRect = getBoundingClientRect(offsetParent);\n\n  // Styles\n  const styles = {\n    position: popper.position,\n  };\n\n  const offsets = getRoundedOffsets(\n    data,\n    window.devicePixelRatio < 2 || !isFirefox\n  );\n\n  const sideA = x === 'bottom' ? 'top' : 'bottom';\n  const sideB = y === 'right' ? 'left' : 'right';\n\n  // if gpuAcceleration is set to `true` and transform is supported,\n  //  we use `translate3d` to apply the position to the popper we\n  // automatically use the supported prefixed version if needed\n  const prefixedProperty = getSupportedPropertyName('transform');\n\n  // now, let's make a step back and look at this code closely (wtf?)\n  // If the content of the popper grows once it's been positioned, it\n  // may happen that the popper gets misplaced because of the new content\n  // overflowing its reference element\n  // To avoid this problem, we provide two options (x and y), which allow\n  // the consumer to define the offset origin.\n  // If we position a popper on top of a reference element, we can set\n  // `x` to `top` to make the popper grow towards its top instead of\n  // its bottom.\n  let left, top;\n  if (sideA === 'bottom') {\n    // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)\n    // and not the bottom of the html element\n    if (offsetParent.nodeName === 'HTML') {\n      top = -offsetParent.clientHeight + offsets.bottom;\n    } else {\n      top = -offsetParentRect.height + offsets.bottom;\n    }\n  } else {\n    top = offsets.top;\n  }\n  if (sideB === 'right') {\n    if (offsetParent.nodeName === 'HTML') {\n      left = -offsetParent.clientWidth + offsets.right;\n    } else {\n      left = -offsetParentRect.width + offsets.right;\n    }\n  } else {\n    left = offsets.left;\n  }\n  if (gpuAcceleration && prefixedProperty) {\n    styles[prefixedProperty] = `translate3d(${left}px, ${top}px, 0)`;\n    styles[sideA] = 0;\n    styles[sideB] = 0;\n    styles.willChange = 'transform';\n  } else {\n    // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n    const invertTop = sideA === 'bottom' ? -1 : 1;\n    const invertLeft = sideB === 'right' ? -1 : 1;\n    styles[sideA] = top * invertTop;\n    styles[sideB] = left * invertLeft;\n    styles.willChange = `${sideA}, ${sideB}`;\n  }\n\n  // Attributes\n  const attributes = {\n    'x-placement': data.placement,\n  };\n\n  // Update `data` attributes, styles and arrowStyles\n  data.attributes = { ...attributes, ...data.attributes };\n  data.styles = { ...styles, ...data.styles };\n  data.arrowStyles = { ...data.offsets.arrow, ...data.arrowStyles };\n\n  return data;\n}\n","import find from './find';\n\n/**\n * Helper used to know if the given modifier depends from another one.<br />\n * It checks if the needed modifier is listed and enabled.\n * @method\n * @memberof Popper.Utils\n * @param {Array} modifiers - list of modifiers\n * @param {String} requestingName - name of requesting modifier\n * @param {String} requestedName - name of requested modifier\n * @returns {Boolean}\n */\nexport default function isModifierRequired(\n  modifiers,\n  requestingName,\n  requestedName\n) {\n  const requesting = find(modifiers, ({ name }) => name === requestingName);\n\n  const isRequired =\n    !!requesting &&\n    modifiers.some(modifier => {\n      return (\n        modifier.name === requestedName &&\n        modifier.enabled &&\n        modifier.order < requesting.order\n      );\n    });\n\n  if (!isRequired) {\n    const requesting = `\\`${requestingName}\\``;\n    const requested = `\\`${requestedName}\\``;\n    console.warn(\n      `${requested} modifier is required by ${requesting} modifier in order to work, be sure to include it before ${requesting}!`\n    );\n  }\n  return isRequired;\n}\n","import getClientRect from '../utils/getClientRect';\nimport getOuterSizes from '../utils/getOuterSizes';\nimport isModifierRequired from '../utils/isModifierRequired';\nimport getStyleComputedProperty from '../utils/getStyleComputedProperty';\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function arrow(data, options) {\n  // arrow depends on keepTogether in order to work\n  if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n    return data;\n  }\n\n  let arrowElement = options.element;\n\n  // if arrowElement is a string, suppose it's a CSS selector\n  if (typeof arrowElement === 'string') {\n    arrowElement = data.instance.popper.querySelector(arrowElement);\n\n    // if arrowElement is not found, don't run the modifier\n    if (!arrowElement) {\n      return data;\n    }\n  } else {\n    // if the arrowElement isn't a query selector we must check that the\n    // provided DOM node is child of its popper node\n    if (!data.instance.popper.contains(arrowElement)) {\n      console.warn(\n        'WARNING: `arrow.element` must be child of its popper element!'\n      );\n      return data;\n    }\n  }\n\n  const placement = data.placement.split('-')[0];\n  const { popper, reference } = data.offsets;\n  const isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n  const len = isVertical ? 'height' : 'width';\n  const sideCapitalized = isVertical ? 'Top' : 'Left';\n  const side = sideCapitalized.toLowerCase();\n  const altSide = isVertical ? 'left' : 'top';\n  const opSide = isVertical ? 'bottom' : 'right';\n  const arrowElementSize = getOuterSizes(arrowElement)[len];\n\n  //\n  // extends keepTogether behavior making sure the popper and its\n  // reference have enough pixels in conjunction\n  //\n\n  // top/left side\n  if (reference[opSide] - arrowElementSize < popper[side]) {\n    data.offsets.popper[side] -=\n      popper[side] - (reference[opSide] - arrowElementSize);\n  }\n  // bottom/right side\n  if (reference[side] + arrowElementSize > popper[opSide]) {\n    data.offsets.popper[side] +=\n      reference[side] + arrowElementSize - popper[opSide];\n  }\n  data.offsets.popper = getClientRect(data.offsets.popper);\n\n  // compute center of the popper\n  const center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n\n  // Compute the sideValue using the updated popper offsets\n  // take popper margin in account because we don't have this info available\n  const css = getStyleComputedProperty(data.instance.popper);\n  const popperMarginSide = parseFloat(css[`margin${sideCapitalized}`]);\n  const popperBorderSide = parseFloat(css[`border${sideCapitalized}Width`]);\n  let sideValue =\n    center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n\n  // prevent arrowElement from being placed not contiguously to its popper\n  sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n\n  data.arrowElement = arrowElement;\n  data.offsets.arrow = {\n    [side]: Math.round(sideValue),\n    [altSide]: '', // make sure to unset any eventual altSide value from the DOM node\n  };\n\n  return data;\n}\n","/**\n * Get the opposite placement variation of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement variation\n * @returns {String} flipped placement variation\n */\nexport default function getOppositeVariation(variation) {\n  if (variation === 'end') {\n    return 'start';\n  } else if (variation === 'start') {\n    return 'end';\n  }\n  return variation;\n}\n","/**\n * List of accepted placements to use as values of the `placement` option.<br />\n * Valid placements are:\n * - `auto`\n * - `top`\n * - `right`\n * - `bottom`\n * - `left`\n *\n * Each placement can have a variation from this list:\n * - `-start`\n * - `-end`\n *\n * Variations are interpreted easily if you think of them as the left to right\n * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n * is right.<br />\n * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n *\n * Some valid examples are:\n * - `top-end` (on top of reference, right aligned)\n * - `right-start` (on right of reference, top aligned)\n * - `bottom` (on bottom, centered)\n * - `auto-end` (on the side with more space available, alignment depends by placement)\n *\n * @static\n * @type {Array}\n * @enum {String}\n * @readonly\n * @method placements\n * @memberof Popper\n */\nexport default [\n  'auto-start',\n  'auto',\n  'auto-end',\n  'top-start',\n  'top',\n  'top-end',\n  'right-start',\n  'right',\n  'right-end',\n  'bottom-end',\n  'bottom',\n  'bottom-start',\n  'left-end',\n  'left',\n  'left-start',\n];\n","import placements from '../methods/placements';\n\n// Get rid of `auto` `auto-start` and `auto-end`\nconst validPlacements = placements.slice(3);\n\n/**\n * Given an initial placement, returns all the subsequent placements\n * clockwise (or counter-clockwise).\n *\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement - A valid placement (it accepts variations)\n * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n * @returns {Array} placements including their variations\n */\nexport default function clockwise(placement, counter = false) {\n  const index = validPlacements.indexOf(placement);\n  const arr = validPlacements\n    .slice(index + 1)\n    .concat(validPlacements.slice(0, index));\n  return counter ? arr.reverse() : arr;\n}\n","import getOppositePlacement from '../utils/getOppositePlacement';\nimport getOppositeVariation from '../utils/getOppositeVariation';\nimport getPopperOffsets from '../utils/getPopperOffsets';\nimport runModifiers from '../utils/runModifiers';\nimport getBoundaries from '../utils/getBoundaries';\nimport isModifierEnabled from '../utils/isModifierEnabled';\nimport clockwise from '../utils/clockwise';\n\nconst BEHAVIORS = {\n  FLIP: 'flip',\n  CLOCKWISE: 'clockwise',\n  COUNTERCLOCKWISE: 'counterclockwise',\n};\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function flip(data, options) {\n  // if `inner` modifier is enabled, we can't use the `flip` modifier\n  if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n    return data;\n  }\n\n  if (data.flipped && data.placement === data.originalPlacement) {\n    // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n    return data;\n  }\n\n  const boundaries = getBoundaries(\n    data.instance.popper,\n    data.instance.reference,\n    options.padding,\n    options.boundariesElement,\n    data.positionFixed\n  );\n\n  let placement = data.placement.split('-')[0];\n  let placementOpposite = getOppositePlacement(placement);\n  let variation = data.placement.split('-')[1] || '';\n\n  let flipOrder = [];\n\n  switch (options.behavior) {\n    case BEHAVIORS.FLIP:\n      flipOrder = [placement, placementOpposite];\n      break;\n    case BEHAVIORS.CLOCKWISE:\n      flipOrder = clockwise(placement);\n      break;\n    case BEHAVIORS.COUNTERCLOCKWISE:\n      flipOrder = clockwise(placement, true);\n      break;\n    default:\n      flipOrder = options.behavior;\n  }\n\n  flipOrder.forEach((step, index) => {\n    if (placement !== step || flipOrder.length === index + 1) {\n      return data;\n    }\n\n    placement = data.placement.split('-')[0];\n    placementOpposite = getOppositePlacement(placement);\n\n    const popperOffsets = data.offsets.popper;\n    const refOffsets = data.offsets.reference;\n\n    // using floor because the reference offsets may contain decimals we are not going to consider here\n    const floor = Math.floor;\n    const overlapsRef =\n      (placement === 'left' &&\n        floor(popperOffsets.right) > floor(refOffsets.left)) ||\n      (placement === 'right' &&\n        floor(popperOffsets.left) < floor(refOffsets.right)) ||\n      (placement === 'top' &&\n        floor(popperOffsets.bottom) > floor(refOffsets.top)) ||\n      (placement === 'bottom' &&\n        floor(popperOffsets.top) < floor(refOffsets.bottom));\n\n    const overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n    const overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n    const overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n    const overflowsBottom =\n      floor(popperOffsets.bottom) > floor(boundaries.bottom);\n\n    const overflowsBoundaries =\n      (placement === 'left' && overflowsLeft) ||\n      (placement === 'right' && overflowsRight) ||\n      (placement === 'top' && overflowsTop) ||\n      (placement === 'bottom' && overflowsBottom);\n\n    // flip the variation if required\n    const isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n\n    // flips variation if reference element overflows boundaries\n    const flippedVariationByRef =\n      !!options.flipVariations &&\n      ((isVertical && variation === 'start' && overflowsLeft) ||\n        (isVertical && variation === 'end' && overflowsRight) ||\n        (!isVertical && variation === 'start' && overflowsTop) ||\n        (!isVertical && variation === 'end' && overflowsBottom));\n\n    // flips variation if popper content overflows boundaries\n    const flippedVariationByContent =\n      !!options.flipVariationsByContent &&\n      ((isVertical && variation === 'start' && overflowsRight) ||\n        (isVertical && variation === 'end' && overflowsLeft) ||\n        (!isVertical && variation === 'start' && overflowsBottom) ||\n        (!isVertical && variation === 'end' && overflowsTop));\n\n    const flippedVariation = flippedVariationByRef || flippedVariationByContent;\n\n    if (overlapsRef || overflowsBoundaries || flippedVariation) {\n      // this boolean to detect any flip loop\n      data.flipped = true;\n\n      if (overlapsRef || overflowsBoundaries) {\n        placement = flipOrder[index + 1];\n      }\n\n      if (flippedVariation) {\n        variation = getOppositeVariation(variation);\n      }\n\n      data.placement = placement + (variation ? '-' + variation : '');\n\n      // this object contains `position`, we want to preserve it along with\n      // any additional property we may add in the future\n      data.offsets.popper = {\n        ...data.offsets.popper,\n        ...getPopperOffsets(\n          data.instance.popper,\n          data.offsets.reference,\n          data.placement\n        ),\n      };\n\n      data = runModifiers(data.instance.modifiers, data, 'flip');\n    }\n  });\n  return data;\n}\n","/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function keepTogether(data) {\n  const { popper, reference } = data.offsets;\n  const placement = data.placement.split('-')[0];\n  const floor = Math.floor;\n  const isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n  const side = isVertical ? 'right' : 'bottom';\n  const opSide = isVertical ? 'left' : 'top';\n  const measurement = isVertical ? 'width' : 'height';\n\n  if (popper[side] < floor(reference[opSide])) {\n    data.offsets.popper[opSide] =\n      floor(reference[opSide]) - popper[measurement];\n  }\n  if (popper[opSide] > floor(reference[side])) {\n    data.offsets.popper[opSide] = floor(reference[side]);\n  }\n\n  return data;\n}\n","import isNumeric from '../utils/isNumeric';\nimport getClientRect from '../utils/getClientRect';\nimport find from '../utils/find';\n\n/**\n * Converts a string containing value + unit into a px value number\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} str - Value + unit string\n * @argument {String} measurement - `height` or `width`\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @returns {Number|String}\n * Value in pixels, or original string if no values were extracted\n */\nexport function toValue(str, measurement, popperOffsets, referenceOffsets) {\n  // separate value from unit\n  const split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n  const value = +split[1];\n  const unit = split[2];\n\n  // If it's not a number it's an operator, I guess\n  if (!value) {\n    return str;\n  }\n\n  if (unit.indexOf('%') === 0) {\n    let element;\n    switch (unit) {\n      case '%p':\n        element = popperOffsets;\n        break;\n      case '%':\n      case '%r':\n      default:\n        element = referenceOffsets;\n    }\n\n    const rect = getClientRect(element);\n    return rect[measurement] / 100 * value;\n  } else if (unit === 'vh' || unit === 'vw') {\n    // if is a vh or vw, we calculate the size based on the viewport\n    let size;\n    if (unit === 'vh') {\n      size = Math.max(\n        document.documentElement.clientHeight,\n        window.innerHeight || 0\n      );\n    } else {\n      size = Math.max(\n        document.documentElement.clientWidth,\n        window.innerWidth || 0\n      );\n    }\n    return size / 100 * value;\n  } else {\n    // if is an explicit pixel unit, we get rid of the unit and keep the value\n    // if is an implicit unit, it's px, and we return just the value\n    return value;\n  }\n}\n\n/**\n * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} offset\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @argument {String} basePlacement\n * @returns {Array} a two cells array with x and y offsets in numbers\n */\nexport function parseOffset(\n  offset,\n  popperOffsets,\n  referenceOffsets,\n  basePlacement\n) {\n  const offsets = [0, 0];\n\n  // Use height if placement is left or right and index is 0 otherwise use width\n  // in this way the first offset will use an axis and the second one\n  // will use the other one\n  const useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n\n  // Split the offset string to obtain a list of values and operands\n  // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n  const fragments = offset.split(/(\\+|\\-)/).map(frag => frag.trim());\n\n  // Detect if the offset string contains a pair of values or a single one\n  // they could be separated by comma or space\n  const divider = fragments.indexOf(\n    find(fragments, frag => frag.search(/,|\\s/) !== -1)\n  );\n\n  if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n    console.warn(\n      'Offsets separated by white space(s) are deprecated, use a comma (,) instead.'\n    );\n  }\n\n  // If divider is found, we divide the list of values and operands to divide\n  // them by ofset X and Y.\n  const splitRegex = /\\s*,\\s*|\\s+/;\n  let ops = divider !== -1\n    ? [\n        fragments\n          .slice(0, divider)\n          .concat([fragments[divider].split(splitRegex)[0]]),\n        [fragments[divider].split(splitRegex)[1]].concat(\n          fragments.slice(divider + 1)\n        ),\n      ]\n    : [fragments];\n\n  // Convert the values with units to absolute pixels to allow our computations\n  ops = ops.map((op, index) => {\n    // Most of the units rely on the orientation of the popper\n    const measurement = (index === 1 ? !useHeight : useHeight)\n      ? 'height'\n      : 'width';\n    let mergeWithPrevious = false;\n    return (\n      op\n        // This aggregates any `+` or `-` sign that aren't considered operators\n        // e.g.: 10 + +5 => [10, +, +5]\n        .reduce((a, b) => {\n          if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n            a[a.length - 1] = b;\n            mergeWithPrevious = true;\n            return a;\n          } else if (mergeWithPrevious) {\n            a[a.length - 1] += b;\n            mergeWithPrevious = false;\n            return a;\n          } else {\n            return a.concat(b);\n          }\n        }, [])\n        // Here we convert the string values into number values (in px)\n        .map(str => toValue(str, measurement, popperOffsets, referenceOffsets))\n    );\n  });\n\n  // Loop trough the offsets arrays and execute the operations\n  ops.forEach((op, index) => {\n    op.forEach((frag, index2) => {\n      if (isNumeric(frag)) {\n        offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n      }\n    });\n  });\n  return offsets;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @argument {Number|String} options.offset=0\n * The offset value as described in the modifier description\n * @returns {Object} The data object, properly modified\n */\nexport default function offset(data, { offset }) {\n  const { placement, offsets: { popper, reference } } = data;\n  const basePlacement = placement.split('-')[0];\n\n  let offsets;\n  if (isNumeric(+offset)) {\n    offsets = [+offset, 0];\n  } else {\n    offsets = parseOffset(offset, popper, reference, basePlacement);\n  }\n\n  if (basePlacement === 'left') {\n    popper.top += offsets[0];\n    popper.left -= offsets[1];\n  } else if (basePlacement === 'right') {\n    popper.top += offsets[0];\n    popper.left += offsets[1];\n  } else if (basePlacement === 'top') {\n    popper.left += offsets[0];\n    popper.top -= offsets[1];\n  } else if (basePlacement === 'bottom') {\n    popper.left += offsets[0];\n    popper.top += offsets[1];\n  }\n\n  data.popper = popper;\n  return data;\n}\n","import getOffsetParent from '../utils/getOffsetParent';\nimport getBoundaries from '../utils/getBoundaries';\nimport getSupportedPropertyName from '../utils/getSupportedPropertyName';\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function preventOverflow(data, options) {\n  let boundariesElement =\n    options.boundariesElement || getOffsetParent(data.instance.popper);\n\n  // If offsetParent is the reference element, we really want to\n  // go one step up and use the next offsetParent as reference to\n  // avoid to make this modifier completely useless and look like broken\n  if (data.instance.reference === boundariesElement) {\n    boundariesElement = getOffsetParent(boundariesElement);\n  }\n\n  // NOTE: DOM access here\n  // resets the popper's position so that the document size can be calculated excluding\n  // the size of the popper element itself\n  const transformProp = getSupportedPropertyName('transform');\n  const popperStyles = data.instance.popper.style; // assignment to help minification\n  const { top, left, [transformProp]: transform } = popperStyles;\n  popperStyles.top = '';\n  popperStyles.left = '';\n  popperStyles[transformProp] = '';\n\n  const boundaries = getBoundaries(\n    data.instance.popper,\n    data.instance.reference,\n    options.padding,\n    boundariesElement,\n    data.positionFixed\n  );\n\n  // NOTE: DOM access here\n  // restores the original style properties after the offsets have been computed\n  popperStyles.top = top;\n  popperStyles.left = left;\n  popperStyles[transformProp] = transform;\n\n  options.boundaries = boundaries;\n\n  const order = options.priority;\n  let popper = data.offsets.popper;\n\n  const check = {\n    primary(placement) {\n      let value = popper[placement];\n      if (\n        popper[placement] < boundaries[placement] &&\n        !options.escapeWithReference\n      ) {\n        value = Math.max(popper[placement], boundaries[placement]);\n      }\n      return { [placement]: value };\n    },\n    secondary(placement) {\n      const mainSide = placement === 'right' ? 'left' : 'top';\n      let value = popper[mainSide];\n      if (\n        popper[placement] > boundaries[placement] &&\n        !options.escapeWithReference\n      ) {\n        value = Math.min(\n          popper[mainSide],\n          boundaries[placement] -\n            (placement === 'right' ? popper.width : popper.height)\n        );\n      }\n      return { [mainSide]: value };\n    },\n  };\n\n  order.forEach(placement => {\n    const side =\n      ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n    popper = { ...popper, ...check[side](placement) };\n  });\n\n  data.offsets.popper = popper;\n\n  return data;\n}\n","/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function shift(data) {\n  const placement = data.placement;\n  const basePlacement = placement.split('-')[0];\n  const shiftvariation = placement.split('-')[1];\n\n  // if shift shiftvariation is specified, run the modifier\n  if (shiftvariation) {\n    const { reference, popper } = data.offsets;\n    const isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n    const side = isVertical ? 'left' : 'top';\n    const measurement = isVertical ? 'width' : 'height';\n\n    const shiftOffsets = {\n      start: { [side]: reference[side] },\n      end: {\n        [side]: reference[side] + reference[measurement] - popper[measurement],\n      },\n    };\n\n    data.offsets.popper = { ...popper, ...shiftOffsets[shiftvariation] };\n  }\n\n  return data;\n}\n","import isModifierRequired from '../utils/isModifierRequired';\nimport find from '../utils/find';\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function hide(data) {\n  if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n    return data;\n  }\n\n  const refRect = data.offsets.reference;\n  const bound = find(\n    data.instance.modifiers,\n    modifier => modifier.name === 'preventOverflow'\n  ).boundaries;\n\n  if (\n    refRect.bottom < bound.top ||\n    refRect.left > bound.right ||\n    refRect.top > bound.bottom ||\n    refRect.right < bound.left\n  ) {\n    // Avoid unnecessary DOM access if visibility hasn't changed\n    if (data.hide === true) {\n      return data;\n    }\n\n    data.hide = true;\n    data.attributes['x-out-of-boundaries'] = '';\n  } else {\n    // Avoid unnecessary DOM access if visibility hasn't changed\n    if (data.hide === false) {\n      return data;\n    }\n\n    data.hide = false;\n    data.attributes['x-out-of-boundaries'] = false;\n  }\n\n  return data;\n}\n","import getClientRect from '../utils/getClientRect';\nimport getOppositePlacement from '../utils/getOppositePlacement';\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function inner(data) {\n  const placement = data.placement;\n  const basePlacement = placement.split('-')[0];\n  const { popper, reference } = data.offsets;\n  const isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n\n  const subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n\n  popper[isHoriz ? 'left' : 'top'] =\n    reference[basePlacement] -\n    (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n\n  data.placement = getOppositePlacement(placement);\n  data.offsets.popper = getClientRect(popper);\n\n  return data;\n}\n","import applyStyle, { applyStyleOnLoad } from './applyStyle';\nimport computeStyle from './computeStyle';\nimport arrow from './arrow';\nimport flip from './flip';\nimport keepTogether from './keepTogether';\nimport offset from './offset';\nimport preventOverflow from './preventOverflow';\nimport shift from './shift';\nimport hide from './hide';\nimport inner from './inner';\n\n/**\n * Modifier function, each modifier can have a function of this type assigned\n * to its `fn` property.<br />\n * These functions will be called on each update, this means that you must\n * make sure they are performant enough to avoid performance bottlenecks.\n *\n * @function ModifierFn\n * @argument {dataObject} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {dataObject} The data object, properly modified\n */\n\n/**\n * Modifiers are plugins used to alter the behavior of your poppers.<br />\n * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n * needed by the library.\n *\n * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n * All the other properties are configurations that could be tweaked.\n * @namespace modifiers\n */\nexport default {\n  /**\n   * Modifier used to shift the popper on the start or end of its reference\n   * element.<br />\n   * It will read the variation of the `placement` property.<br />\n   * It can be one either `-end` or `-start`.\n   * @memberof modifiers\n   * @inner\n   */\n  shift: {\n    /** @prop {number} order=100 - Index used to define the order of execution */\n    order: 100,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: shift,\n  },\n\n  /**\n   * The `offset` modifier can shift your popper on both its axis.\n   *\n   * It accepts the following units:\n   * - `px` or unit-less, interpreted as pixels\n   * - `%` or `%r`, percentage relative to the length of the reference element\n   * - `%p`, percentage relative to the length of the popper element\n   * - `vw`, CSS viewport width unit\n   * - `vh`, CSS viewport height unit\n   *\n   * For length is intended the main axis relative to the placement of the popper.<br />\n   * This means that if the placement is `top` or `bottom`, the length will be the\n   * `width`. In case of `left` or `right`, it will be the `height`.\n   *\n   * You can provide a single value (as `Number` or `String`), or a pair of values\n   * as `String` divided by a comma or one (or more) white spaces.<br />\n   * The latter is a deprecated method because it leads to confusion and will be\n   * removed in v2.<br />\n   * Additionally, it accepts additions and subtractions between different units.\n   * Note that multiplications and divisions aren't supported.\n   *\n   * Valid examples are:\n   * ```\n   * 10\n   * '10%'\n   * '10, 10'\n   * '10%, 10'\n   * '10 + 10%'\n   * '10 - 5vh + 3%'\n   * '-10px + 5vh, 5px - 6%'\n   * ```\n   * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n   * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n   * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  offset: {\n    /** @prop {number} order=200 - Index used to define the order of execution */\n    order: 200,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: offset,\n    /** @prop {Number|String} offset=0\n     * The offset value as described in the modifier description\n     */\n    offset: 0,\n  },\n\n  /**\n   * Modifier used to prevent the popper from being positioned outside the boundary.\n   *\n   * A scenario exists where the reference itself is not within the boundaries.<br />\n   * We can say it has \"escaped the boundaries\" — or just \"escaped\".<br />\n   * In this case we need to decide whether the popper should either:\n   *\n   * - detach from the reference and remain \"trapped\" in the boundaries, or\n   * - if it should ignore the boundary and \"escape with its reference\"\n   *\n   * When `escapeWithReference` is set to`true` and reference is completely\n   * outside its boundaries, the popper will overflow (or completely leave)\n   * the boundaries in order to remain attached to the edge of the reference.\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  preventOverflow: {\n    /** @prop {number} order=300 - Index used to define the order of execution */\n    order: 300,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: preventOverflow,\n    /**\n     * @prop {Array} [priority=['left','right','top','bottom']]\n     * Popper will try to prevent overflow following these priorities by default,\n     * then, it could overflow on the left and on top of the `boundariesElement`\n     */\n    priority: ['left', 'right', 'top', 'bottom'],\n    /**\n     * @prop {number} padding=5\n     * Amount of pixel used to define a minimum distance between the boundaries\n     * and the popper. This makes sure the popper always has a little padding\n     * between the edges of its container\n     */\n    padding: 5,\n    /**\n     * @prop {String|HTMLElement} boundariesElement='scrollParent'\n     * Boundaries used by the modifier. Can be `scrollParent`, `window`,\n     * `viewport` or any DOM element.\n     */\n    boundariesElement: 'scrollParent',\n  },\n\n  /**\n   * Modifier used to make sure the reference and its popper stay near each other\n   * without leaving any gap between the two. Especially useful when the arrow is\n   * enabled and you want to ensure that it points to its reference element.\n   * It cares only about the first axis. You can still have poppers with margin\n   * between the popper and its reference element.\n   * @memberof modifiers\n   * @inner\n   */\n  keepTogether: {\n    /** @prop {number} order=400 - Index used to define the order of execution */\n    order: 400,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: keepTogether,\n  },\n\n  /**\n   * This modifier is used to move the `arrowElement` of the popper to make\n   * sure it is positioned between the reference element and its popper element.\n   * It will read the outer size of the `arrowElement` node to detect how many\n   * pixels of conjunction are needed.\n   *\n   * It has no effect if no `arrowElement` is provided.\n   * @memberof modifiers\n   * @inner\n   */\n  arrow: {\n    /** @prop {number} order=500 - Index used to define the order of execution */\n    order: 500,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: arrow,\n    /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n    element: '[x-arrow]',\n  },\n\n  /**\n   * Modifier used to flip the popper's placement when it starts to overlap its\n   * reference element.\n   *\n   * Requires the `preventOverflow` modifier before it in order to work.\n   *\n   * **NOTE:** this modifier will interrupt the current update cycle and will\n   * restart it if it detects the need to flip the placement.\n   * @memberof modifiers\n   * @inner\n   */\n  flip: {\n    /** @prop {number} order=600 - Index used to define the order of execution */\n    order: 600,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: flip,\n    /**\n     * @prop {String|Array} behavior='flip'\n     * The behavior used to change the popper's placement. It can be one of\n     * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n     * placements (with optional variations)\n     */\n    behavior: 'flip',\n    /**\n     * @prop {number} padding=5\n     * The popper will flip if it hits the edges of the `boundariesElement`\n     */\n    padding: 5,\n    /**\n     * @prop {String|HTMLElement} boundariesElement='viewport'\n     * The element which will define the boundaries of the popper position.\n     * The popper will never be placed outside of the defined boundaries\n     * (except if `keepTogether` is enabled)\n     */\n    boundariesElement: 'viewport',\n    /**\n     * @prop {Boolean} flipVariations=false\n     * The popper will switch placement variation between `-start` and `-end` when\n     * the reference element overlaps its boundaries.\n     *\n     * The original placement should have a set variation.\n     */\n    flipVariations: false,\n    /**\n     * @prop {Boolean} flipVariationsByContent=false\n     * The popper will switch placement variation between `-start` and `-end` when\n     * the popper element overlaps its reference boundaries.\n     *\n     * The original placement should have a set variation.\n     */\n    flipVariationsByContent: false,\n  },\n\n  /**\n   * Modifier used to make the popper flow toward the inner of the reference element.\n   * By default, when this modifier is disabled, the popper will be placed outside\n   * the reference element.\n   * @memberof modifiers\n   * @inner\n   */\n  inner: {\n    /** @prop {number} order=700 - Index used to define the order of execution */\n    order: 700,\n    /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n    enabled: false,\n    /** @prop {ModifierFn} */\n    fn: inner,\n  },\n\n  /**\n   * Modifier used to hide the popper when its reference element is outside of the\n   * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n   * be used to hide with a CSS selector the popper when its reference is\n   * out of boundaries.\n   *\n   * Requires the `preventOverflow` modifier before it in order to work.\n   * @memberof modifiers\n   * @inner\n   */\n  hide: {\n    /** @prop {number} order=800 - Index used to define the order of execution */\n    order: 800,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: hide,\n  },\n\n  /**\n   * Computes the style that will be applied to the popper element to gets\n   * properly positioned.\n   *\n   * Note that this modifier will not touch the DOM, it just prepares the styles\n   * so that `applyStyle` modifier can apply it. This separation is useful\n   * in case you need to replace `applyStyle` with a custom implementation.\n   *\n   * This modifier has `850` as `order` value to maintain backward compatibility\n   * with previous versions of Popper.js. Expect the modifiers ordering method\n   * to change in future major versions of the library.\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  computeStyle: {\n    /** @prop {number} order=850 - Index used to define the order of execution */\n    order: 850,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: computeStyle,\n    /**\n     * @prop {Boolean} gpuAcceleration=true\n     * If true, it uses the CSS 3D transformation to position the popper.\n     * Otherwise, it will use the `top` and `left` properties\n     */\n    gpuAcceleration: true,\n    /**\n     * @prop {string} [x='bottom']\n     * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n     * Change this if your popper should grow in a direction different from `bottom`\n     */\n    x: 'bottom',\n    /**\n     * @prop {string} [x='left']\n     * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n     * Change this if your popper should grow in a direction different from `right`\n     */\n    y: 'right',\n  },\n\n  /**\n   * Applies the computed styles to the popper element.\n   *\n   * All the DOM manipulations are limited to this modifier. This is useful in case\n   * you want to integrate Popper.js inside a framework or view library and you\n   * want to delegate all the DOM manipulations to it.\n   *\n   * Note that if you disable this modifier, you must make sure the popper element\n   * has its position set to `absolute` before Popper.js can do its work!\n   *\n   * Just disable this modifier and define your own to achieve the desired effect.\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  applyStyle: {\n    /** @prop {number} order=900 - Index used to define the order of execution */\n    order: 900,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: applyStyle,\n    /** @prop {Function} */\n    onLoad: applyStyleOnLoad,\n    /**\n     * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n     * @prop {Boolean} gpuAcceleration=true\n     * If true, it uses the CSS 3D transformation to position the popper.\n     * Otherwise, it will use the `top` and `left` properties\n     */\n    gpuAcceleration: undefined,\n  },\n};\n\n/**\n * The `dataObject` is an object containing all the information used by Popper.js.\n * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n * @name dataObject\n * @property {Object} data.instance The Popper.js instance\n * @property {String} data.placement Placement applied to popper\n * @property {String} data.originalPlacement Placement originally defined on init\n * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\n * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.boundaries Offsets of the popper boundaries\n * @property {Object} data.offsets The measurements of popper, reference and arrow elements\n * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n */\n","import modifiers from '../modifiers/index';\n\n/**\n * Default options provided to Popper.js constructor.<br />\n * These can be overridden using the `options` argument of Popper.js.<br />\n * To override an option, simply pass an object with the same\n * structure of the `options` object, as the 3rd argument. For example:\n * ```\n * new Popper(ref, pop, {\n *   modifiers: {\n *     preventOverflow: { enabled: false }\n *   }\n * })\n * ```\n * @type {Object}\n * @static\n * @memberof Popper\n */\nexport default {\n  /**\n   * Popper's placement.\n   * @prop {Popper.placements} placement='bottom'\n   */\n  placement: 'bottom',\n\n  /**\n   * Set this to true if you want popper to position it self in 'fixed' mode\n   * @prop {Boolean} positionFixed=false\n   */\n  positionFixed: false,\n\n  /**\n   * Whether events (resize, scroll) are initially enabled.\n   * @prop {Boolean} eventsEnabled=true\n   */\n  eventsEnabled: true,\n\n  /**\n   * Set to true if you want to automatically remove the popper when\n   * you call the `destroy` method.\n   * @prop {Boolean} removeOnDestroy=false\n   */\n  removeOnDestroy: false,\n\n  /**\n   * Callback called when the popper is created.<br />\n   * By default, it is set to no-op.<br />\n   * Access Popper.js instance with `data.instance`.\n   * @prop {onCreate}\n   */\n  onCreate: () => {},\n\n  /**\n   * Callback called when the popper is updated. This callback is not called\n   * on the initialization/creation of the popper, but only on subsequent\n   * updates.<br />\n   * By default, it is set to no-op.<br />\n   * Access Popper.js instance with `data.instance`.\n   * @prop {onUpdate}\n   */\n  onUpdate: () => {},\n\n  /**\n   * List of modifiers used to modify the offsets before they are applied to the popper.\n   * They provide most of the functionalities of Popper.js.\n   * @prop {modifiers}\n   */\n  modifiers,\n};\n\n/**\n * @callback onCreate\n * @param {dataObject} data\n */\n\n/**\n * @callback onUpdate\n * @param {dataObject} data\n */\n","// Utils\nimport debounce from './utils/debounce';\nimport isFunction from './utils/isFunction';\n\n// Methods\nimport update from './methods/update';\nimport destroy from './methods/destroy';\nimport enableEventListeners from './methods/enableEventListeners';\nimport disableEventListeners from './methods/disableEventListeners';\nimport Defaults from './methods/defaults';\nimport placements from './methods/placements';\n\nexport default class Popper {\n  /**\n   * Creates a new Popper.js instance.\n   * @class Popper\n   * @param {Element|referenceObject} reference - The reference element used to position the popper\n   * @param {Element} popper - The HTML / XML element used as the popper\n   * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n   * @return {Object} instance - The generated Popper.js instance\n   */\n  constructor(reference, popper, options = {}) {\n    // make update() debounced, so that it only runs at most once-per-tick\n    this.update = debounce(this.update.bind(this));\n\n    // with {} we create a new object with the options inside it\n    this.options = { ...Popper.Defaults, ...options };\n\n    // init state\n    this.state = {\n      isDestroyed: false,\n      isCreated: false,\n      scrollParents: [],\n    };\n\n    // get reference and popper elements (allow jQuery wrappers)\n    this.reference = reference && reference.jquery ? reference[0] : reference;\n    this.popper = popper && popper.jquery ? popper[0] : popper;\n\n    // Deep merge modifiers options\n    this.options.modifiers = {};\n    Object.keys({\n      ...Popper.Defaults.modifiers,\n      ...options.modifiers,\n    }).forEach(name => {\n      this.options.modifiers[name] = {\n        // If it's a built-in modifier, use it as base\n        ...(Popper.Defaults.modifiers[name] || {}),\n        // If there are custom options, override and merge with default ones\n        ...(options.modifiers ? options.modifiers[name] : {}),\n      };\n    });\n\n    // Refactoring modifiers' list (Object => Array)\n    this.modifiers = Object.keys(this.options.modifiers)\n      .map(name => ({\n        name,\n        ...this.options.modifiers[name],\n      }))\n      // sort the modifiers by order\n      .sort((a, b) => a.order - b.order);\n\n    // modifiers have the ability to execute arbitrary code when Popper.js get inited\n    // such code is executed in the same order of its modifier\n    // they could add new properties to their options configuration\n    // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n    this.modifiers.forEach(modifierOptions => {\n      if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n        modifierOptions.onLoad(\n          this.reference,\n          this.popper,\n          this.options,\n          modifierOptions,\n          this.state\n        );\n      }\n    });\n\n    // fire the first update to position the popper in the right place\n    this.update();\n\n    const eventsEnabled = this.options.eventsEnabled;\n    if (eventsEnabled) {\n      // setup event listeners, they will take care of update the position in specific situations\n      this.enableEventListeners();\n    }\n\n    this.state.eventsEnabled = eventsEnabled;\n  }\n\n  // We can't use class properties because they don't get listed in the\n  // class prototype and break stuff like Sinon stubs\n  update() {\n    return update.call(this);\n  }\n  destroy() {\n    return destroy.call(this);\n  }\n  enableEventListeners() {\n    return enableEventListeners.call(this);\n  }\n  disableEventListeners() {\n    return disableEventListeners.call(this);\n  }\n\n  /**\n   * Schedules an update. It will run on the next UI update available.\n   * @method scheduleUpdate\n   * @memberof Popper\n   */\n  scheduleUpdate = () => requestAnimationFrame(this.update);\n\n  /**\n   * Collection of utilities useful when writing custom modifiers.\n   * Starting from version 1.7, this method is available only if you\n   * include `popper-utils.js` before `popper.js`.\n   *\n   * **DEPRECATION**: This way to access PopperUtils is deprecated\n   * and will be removed in v2! Use the PopperUtils module directly instead.\n   * Due to the high instability of the methods contained in Utils, we can't\n   * guarantee them to follow semver. Use them at your own risk!\n   * @static\n   * @private\n   * @type {Object}\n   * @deprecated since version 1.8\n   * @member Utils\n   * @memberof Popper\n   */\n  static Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\n\n  static placements = placements;\n\n  static Defaults = Defaults;\n}\n\n/**\n * The `referenceObject` is an object that provides an interface compatible with Popper.js\n * and lets you use it as replacement of a real DOM node.<br />\n * You can use this method to position a popper relatively to a set of coordinates\n * in case you don't have a DOM node to use as reference.\n *\n * ```\n * new Popper(referenceObject, popperNode);\n * ```\n *\n * NB: This feature isn't supported in Internet Explorer 10.\n * @name referenceObject\n * @property {Function} data.getBoundingClientRect\n * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n * @property {number} data.clientWidth\n * An ES6 getter that will return the width of the virtual reference element.\n * @property {number} data.clientHeight\n * An ES6 getter that will return the height of the virtual reference element.\n */\n","/**\n * Get CSS computed property of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Eement} element\n * @argument {String} property\n */\nexport default function getStyleComputedProperty(element, property) {\n  if (element.nodeType !== 1) {\n    return [];\n  }\n  // NOTE: 1 DOM access here\n  const window = element.ownerDocument.defaultView;\n  const css = window.getComputedStyle(element, null);\n  return property ? css[property] : css;\n}\n","/**\n * Returns the parentNode or the host of the element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} parent\n */\nexport default function getParentNode(element) {\n  if (element.nodeName === 'HTML') {\n    return element;\n  }\n  return element.parentNode || element.host;\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport getParentNode from './getParentNode';\n\n/**\n * Returns the scrolling parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} scroll parent\n */\nexport default function getScrollParent(element) {\n  // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n  if (!element) {\n    return document.body\n  }\n\n  switch (element.nodeName) {\n    case 'HTML':\n    case 'BODY':\n      return element.ownerDocument.body\n    case '#document':\n      return element.body\n  }\n\n  // Firefox want us to check `-x` and `-y` variations as well\n  const { overflow, overflowX, overflowY } = getStyleComputedProperty(element);\n  if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n    return element;\n  }\n\n  return getScrollParent(getParentNode(element));\n}\n","/**\n * Returns the reference node of the reference object, or the reference object itself.\n * @method\n * @memberof Popper.Utils\n * @param {Element|Object} reference - the reference element (the popper will be relative to this)\n * @returns {Element} parent\n */\nexport default function getReferenceNode(reference) {\n  return reference && reference.referenceNode ? reference.referenceNode : reference;\n}\n","export default typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined';\n","import isBrowser from './isBrowser';\n\nconst isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\nconst isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\n\n/**\n * Determines if the browser is Internet Explorer\n * @method\n * @memberof Popper.Utils\n * @param {Number} version to check\n * @returns {Boolean} isIE\n */\nexport default function isIE(version) {\n  if (version === 11) {\n    return isIE11;\n  }\n  if (version === 10) {\n    return isIE10;\n  }\n  return isIE11 || isIE10;\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport isIE from './isIE';\n/**\n * Returns the offset parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} offset parent\n */\nexport default function getOffsetParent(element) {\n  if (!element) {\n    return document.documentElement;\n  }\n\n  const noOffsetParent = isIE(10) ? document.body : null;\n\n  // NOTE: 1 DOM access here\n  let offsetParent = element.offsetParent || null;\n  // Skip hidden elements which don't have an offsetParent\n  while (offsetParent === noOffsetParent && element.nextElementSibling) {\n    offsetParent = (element = element.nextElementSibling).offsetParent;\n  }\n\n  const nodeName = offsetParent && offsetParent.nodeName;\n\n  if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n    return element ? element.ownerDocument.documentElement : document.documentElement;\n  }\n\n  // .offsetParent will return the closest TH, TD or TABLE in case\n  // no offsetParent is present, I hate this job...\n  if (\n    ['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 &&\n    getStyleComputedProperty(offsetParent, 'position') === 'static'\n  ) {\n    return getOffsetParent(offsetParent);\n  }\n\n  return offsetParent;\n}\n","import getOffsetParent from './getOffsetParent';\n\nexport default function isOffsetContainer(element) {\n  const { nodeName } = element;\n  if (nodeName === 'BODY') {\n    return false;\n  }\n  return (\n    nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element\n  );\n}\n","/**\n * Finds the root node (document, shadowDOM root) of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} node\n * @returns {Element} root node\n */\nexport default function getRoot(node) {\n  if (node.parentNode !== null) {\n    return getRoot(node.parentNode);\n  }\n\n  return node;\n}\n","import isOffsetContainer from './isOffsetContainer';\nimport getRoot from './getRoot';\nimport getOffsetParent from './getOffsetParent';\n\n/**\n * Finds the offset parent common to the two provided nodes\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element1\n * @argument {Element} element2\n * @returns {Element} common offset parent\n */\nexport default function findCommonOffsetParent(element1, element2) {\n  // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n  if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n    return document.documentElement;\n  }\n\n  // Here we make sure to give as \"start\" the element that comes first in the DOM\n  const order =\n    element1.compareDocumentPosition(element2) &\n    Node.DOCUMENT_POSITION_FOLLOWING;\n  const start = order ? element1 : element2;\n  const end = order ? element2 : element1;\n\n  // Get common ancestor container\n  const range = document.createRange();\n  range.setStart(start, 0);\n  range.setEnd(end, 0);\n  const { commonAncestorContainer } = range;\n\n  // Both nodes are inside #document\n  if (\n    (element1 !== commonAncestorContainer &&\n      element2 !== commonAncestorContainer) ||\n    start.contains(end)\n  ) {\n    if (isOffsetContainer(commonAncestorContainer)) {\n      return commonAncestorContainer;\n    }\n\n    return getOffsetParent(commonAncestorContainer);\n  }\n\n  // one of the nodes is inside shadowDOM, find which one\n  const element1root = getRoot(element1);\n  if (element1root.host) {\n    return findCommonOffsetParent(element1root.host, element2);\n  } else {\n    return findCommonOffsetParent(element1, getRoot(element2).host);\n  }\n}\n","/**\n * Gets the scroll value of the given element in the given side (top and left)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {String} side `top` or `left`\n * @returns {number} amount of scrolled pixels\n */\nexport default function getScroll(element, side = 'top') {\n  const upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n  const nodeName = element.nodeName;\n\n  if (nodeName === 'BODY' || nodeName === 'HTML') {\n    const html = element.ownerDocument.documentElement;\n    const scrollingElement = element.ownerDocument.scrollingElement || html;\n    return scrollingElement[upperSide];\n  }\n\n  return element[upperSide];\n}\n","import getScroll from './getScroll';\n\n/*\n * Sum or subtract the element scroll values (left and top) from a given rect object\n * @method\n * @memberof Popper.Utils\n * @param {Object} rect - Rect object you want to change\n * @param {HTMLElement} element - The element from the function reads the scroll values\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n * @return {Object} rect - The modifier rect object\n */\nexport default function includeScroll(rect, element, subtract = false) {\n  const scrollTop = getScroll(element, 'top');\n  const scrollLeft = getScroll(element, 'left');\n  const modifier = subtract ? -1 : 1;\n  rect.top += scrollTop * modifier;\n  rect.bottom += scrollTop * modifier;\n  rect.left += scrollLeft * modifier;\n  rect.right += scrollLeft * modifier;\n  return rect;\n}\n","/*\n * Helper to detect borders of a given element\n * @method\n * @memberof Popper.Utils\n * @param {CSSStyleDeclaration} styles\n * Result of `getStyleComputedProperty` on the given element\n * @param {String} axis - `x` or `y`\n * @return {number} borders - The borders size of the given axis\n */\n\nexport default function getBordersSize(styles, axis) {\n  const sideA = axis === 'x' ? 'Left' : 'Top';\n  const sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n  return (\n    parseFloat(styles[`border${sideA}Width`]) +\n    parseFloat(styles[`border${sideB}Width`])\n  );\n}\n","import isIE from './isIE';\n\nfunction getSize(axis, body, html, computedStyle) {\n  return Math.max(\n    body[`offset${axis}`],\n    body[`scroll${axis}`],\n    html[`client${axis}`],\n    html[`offset${axis}`],\n    html[`scroll${axis}`],\n    isIE(10)\n      ? (parseInt(html[`offset${axis}`]) + \n      parseInt(computedStyle[`margin${axis === 'Height' ? 'Top' : 'Left'}`]) + \n      parseInt(computedStyle[`margin${axis === 'Height' ? 'Bottom' : 'Right'}`]))\n    : 0 \n  );\n}\n\nexport default function getWindowSizes(document) {\n  const body = document.body;\n  const html = document.documentElement;\n  const computedStyle = isIE(10) && getComputedStyle(html);\n\n  return {\n    height: getSize('Height', body, html, computedStyle),\n    width: getSize('Width', body, html, computedStyle),\n  };\n}\n","/**\n * Given element offsets, generate an output similar to getBoundingClientRect\n * @method\n * @memberof Popper.Utils\n * @argument {Object} offsets\n * @returns {Object} ClientRect like output\n */\nexport default function getClientRect(offsets) {\n  return {\n    ...offsets,\n    right: offsets.left + offsets.width,\n    bottom: offsets.top + offsets.height,\n  };\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport getBordersSize from './getBordersSize';\nimport getWindowSizes from './getWindowSizes';\nimport getScroll from './getScroll';\nimport getClientRect from './getClientRect';\nimport isIE from './isIE';\n\n/**\n * Get bounding client rect of given element\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} element\n * @return {Object} client rect\n */\nexport default function getBoundingClientRect(element) {\n  let rect = {};\n\n  // IE10 10 FIX: Please, don't ask, the element isn't\n  // considered in DOM in some circumstances...\n  // This isn't reproducible in IE10 compatibility mode of IE11\n  try {\n    if (isIE(10)) {\n      rect = element.getBoundingClientRect();\n      const scrollTop = getScroll(element, 'top');\n      const scrollLeft = getScroll(element, 'left');\n      rect.top += scrollTop;\n      rect.left += scrollLeft;\n      rect.bottom += scrollTop;\n      rect.right += scrollLeft;\n    }\n    else {\n      rect = element.getBoundingClientRect();\n    }\n  }\n  catch(e){}\n\n  const result = {\n    left: rect.left,\n    top: rect.top,\n    width: rect.right - rect.left,\n    height: rect.bottom - rect.top,\n  };\n\n  // subtract scrollbar size from sizes\n  const sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\n  const width =\n    sizes.width || element.clientWidth || result.width;\n  const height =\n    sizes.height || element.clientHeight || result.height;\n\n  let horizScrollbar = element.offsetWidth - width;\n  let vertScrollbar = element.offsetHeight - height;\n\n  // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n  // we make this check conditional for performance reasons\n  if (horizScrollbar || vertScrollbar) {\n    const styles = getStyleComputedProperty(element);\n    horizScrollbar -= getBordersSize(styles, 'x');\n    vertScrollbar -= getBordersSize(styles, 'y');\n\n    result.width -= horizScrollbar;\n    result.height -= vertScrollbar;\n  }\n\n  return getClientRect(result);\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport includeScroll from './includeScroll';\nimport getScrollParent from './getScrollParent';\nimport getBoundingClientRect from './getBoundingClientRect';\nimport runIsIE from './isIE';\nimport getClientRect from './getClientRect';\n\nexport default function getOffsetRectRelativeToArbitraryNode(children, parent, fixedPosition = false) {\n  const isIE10 = runIsIE(10);\n  const isHTML = parent.nodeName === 'HTML';\n  const childrenRect = getBoundingClientRect(children);\n  const parentRect = getBoundingClientRect(parent);\n  const scrollParent = getScrollParent(children);\n\n  const styles = getStyleComputedProperty(parent);\n  const borderTopWidth = parseFloat(styles.borderTopWidth);\n  const borderLeftWidth = parseFloat(styles.borderLeftWidth);\n\n  // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n  if(fixedPosition && isHTML) {\n    parentRect.top = Math.max(parentRect.top, 0);\n    parentRect.left = Math.max(parentRect.left, 0);\n  }\n  let offsets = getClientRect({\n    top: childrenRect.top - parentRect.top - borderTopWidth,\n    left: childrenRect.left - parentRect.left - borderLeftWidth,\n    width: childrenRect.width,\n    height: childrenRect.height,\n  });\n  offsets.marginTop = 0;\n  offsets.marginLeft = 0;\n\n  // Subtract margins of documentElement in case it's being used as parent\n  // we do this only on HTML because it's the only element that behaves\n  // differently when margins are applied to it. The margins are included in\n  // the box of the documentElement, in the other cases not.\n  if (!isIE10 && isHTML) {\n    const marginTop = parseFloat(styles.marginTop);\n    const marginLeft = parseFloat(styles.marginLeft);\n\n    offsets.top -= borderTopWidth - marginTop;\n    offsets.bottom -= borderTopWidth - marginTop;\n    offsets.left -= borderLeftWidth - marginLeft;\n    offsets.right -= borderLeftWidth - marginLeft;\n\n    // Attach marginTop and marginLeft because in some circumstances we may need them\n    offsets.marginTop = marginTop;\n    offsets.marginLeft = marginLeft;\n  }\n\n  if (\n    isIE10 && !fixedPosition\n      ? parent.contains(scrollParent)\n      : parent === scrollParent && scrollParent.nodeName !== 'BODY'\n  ) {\n    offsets = includeScroll(offsets, parent);\n  }\n\n  return offsets;\n}\n","import getOffsetRectRelativeToArbitraryNode from './getOffsetRectRelativeToArbitraryNode';\nimport getScroll from './getScroll';\nimport getClientRect from './getClientRect';\n\nexport default function getViewportOffsetRectRelativeToArtbitraryNode(element, excludeScroll = false) {\n  const html = element.ownerDocument.documentElement;\n  const relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n  const width = Math.max(html.clientWidth, window.innerWidth || 0);\n  const height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n  const scrollTop = !excludeScroll ? getScroll(html) : 0;\n  const scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n\n  const offset = {\n    top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n    left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n    width,\n    height,\n  };\n\n  return getClientRect(offset);\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport getParentNode from './getParentNode';\n\n/**\n * Check if the given element is fixed or is inside a fixed parent\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {Element} customContainer\n * @returns {Boolean} answer to \"isFixed?\"\n */\nexport default function isFixed(element) {\n  const nodeName = element.nodeName;\n  if (nodeName === 'BODY' || nodeName === 'HTML') {\n    return false;\n  }\n  if (getStyleComputedProperty(element, 'position') === 'fixed') {\n    return true;\n  }\n  const parentNode = getParentNode(element);\n  if (!parentNode) {\n    return false;\n  }\n  return isFixed(parentNode);\n}\n","import getStyleComputedProperty from './getStyleComputedProperty';\nimport isIE from './isIE';\n/**\n * Finds the first parent of an element that has a transformed property defined\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} first transformed parent or documentElement\n */\n\nexport default function getFixedPositionOffsetParent(element) {\n  // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n   if (!element || !element.parentElement || isIE()) {\n    return document.documentElement;\n  }\n  let el = element.parentElement;\n  while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n    el = el.parentElement;\n  }\n  return el || document.documentElement;\n\n}\n","import getScrollParent from './getScrollParent';\nimport getParentNode from './getParentNode';\nimport getReferenceNode from './getReferenceNode';\nimport findCommonOffsetParent from './findCommonOffsetParent';\nimport getOffsetRectRelativeToArbitraryNode from './getOffsetRectRelativeToArbitraryNode';\nimport getViewportOffsetRectRelativeToArtbitraryNode from './getViewportOffsetRectRelativeToArtbitraryNode';\nimport getWindowSizes from './getWindowSizes';\nimport isFixed from './isFixed';\nimport getFixedPositionOffsetParent from './getFixedPositionOffsetParent';\n\n/**\n * Computed the boundaries limits and return them\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} popper\n * @param {HTMLElement} reference\n * @param {number} padding\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n * @param {Boolean} fixedPosition - Is in fixed position mode\n * @returns {Object} Coordinates of the boundaries\n */\nexport default function getBoundaries(\n  popper,\n  reference,\n  padding,\n  boundariesElement,\n  fixedPosition = false\n) {\n  // NOTE: 1 DOM access here\n\n  let boundaries = { top: 0, left: 0 };\n  const offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n\n  // Handle viewport case\n  if (boundariesElement === 'viewport' ) {\n    boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n  }\n\n  else {\n    // Handle other cases based on DOM element used as boundaries\n    let boundariesNode;\n    if (boundariesElement === 'scrollParent') {\n      boundariesNode = getScrollParent(getParentNode(reference));\n      if (boundariesNode.nodeName === 'BODY') {\n        boundariesNode = popper.ownerDocument.documentElement;\n      }\n    } else if (boundariesElement === 'window') {\n      boundariesNode = popper.ownerDocument.documentElement;\n    } else {\n      boundariesNode = boundariesElement;\n    }\n\n    const offsets = getOffsetRectRelativeToArbitraryNode(\n      boundariesNode,\n      offsetParent,\n      fixedPosition\n    );\n\n    // In case of HTML, we need a different computation\n    if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n      const { height, width } = getWindowSizes(popper.ownerDocument);\n      boundaries.top += offsets.top - offsets.marginTop;\n      boundaries.bottom = height + offsets.top;\n      boundaries.left += offsets.left - offsets.marginLeft;\n      boundaries.right = width + offsets.left;\n    } else {\n      // for all the other DOM elements, this one is good\n      boundaries = offsets;\n    }\n  }\n\n  // Add paddings\n  padding = padding || 0;\n  const isPaddingNumber = typeof padding === 'number';\n  boundaries.left += isPaddingNumber ? padding : padding.left || 0; \n  boundaries.top += isPaddingNumber ? padding : padding.top || 0; \n  boundaries.right -= isPaddingNumber ? padding : padding.right || 0; \n  boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0; \n\n  return boundaries;\n}\n","import getBoundaries from '../utils/getBoundaries';\n\nfunction getArea({ width, height }) {\n  return width * height;\n}\n\n/**\n * Utility used to transform the `auto` placement to the placement with more\n * available space.\n * @method\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function computeAutoPlacement(\n  placement,\n  refRect,\n  popper,\n  reference,\n  boundariesElement,\n  padding = 0\n) {\n  if (placement.indexOf('auto') === -1) {\n    return placement;\n  }\n\n  const boundaries = getBoundaries(\n    popper,\n    reference,\n    padding,\n    boundariesElement\n  );\n\n  const rects = {\n    top: {\n      width: boundaries.width,\n      height: refRect.top - boundaries.top,\n    },\n    right: {\n      width: boundaries.right - refRect.right,\n      height: boundaries.height,\n    },\n    bottom: {\n      width: boundaries.width,\n      height: boundaries.bottom - refRect.bottom,\n    },\n    left: {\n      width: refRect.left - boundaries.left,\n      height: boundaries.height,\n    },\n  };\n\n  const sortedAreas = Object.keys(rects)\n    .map(key => ({\n      key,\n      ...rects[key],\n      area: getArea(rects[key]),\n    }))\n    .sort((a, b) => b.area - a.area);\n\n  const filteredAreas = sortedAreas.filter(\n    ({ width, height }) =>\n      width >= popper.clientWidth && height >= popper.clientHeight\n  );\n\n  const computedPlacement = filteredAreas.length > 0\n    ? filteredAreas[0].key\n    : sortedAreas[0].key;\n\n  const variation = placement.split('-')[1];\n\n  return computedPlacement + (variation ? `-${variation}` : '');\n}\n","import isBrowser from './isBrowser';\n\nconst timeoutDuration = (function(){\n  const longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\n  for (let i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n    if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n      return 1;\n    }\n  }\n  return 0;\n}());\n\nexport function microtaskDebounce(fn) {\n  let called = false\n  return () => {\n    if (called) {\n      return\n    }\n    called = true\n    window.Promise.resolve().then(() => {\n      called = false\n      fn()\n    })\n  }\n}\n\nexport function taskDebounce(fn) {\n  let scheduled = false;\n  return () => {\n    if (!scheduled) {\n      scheduled = true;\n      setTimeout(() => {\n        scheduled = false;\n        fn();\n      }, timeoutDuration);\n    }\n  };\n}\n\nconst supportsMicroTasks = isBrowser && window.Promise\n\n\n/**\n* Create a debounced version of a method, that's asynchronously deferred\n* but called in the minimum time possible.\n*\n* @method\n* @memberof Popper.Utils\n* @argument {Function} fn\n* @returns {Function}\n*/\nexport default (supportsMicroTasks\n  ? microtaskDebounce\n  : taskDebounce);\n","/**\n * Mimics the `find` method of Array\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nexport default function find(arr, check) {\n  // use native find if supported\n  if (Array.prototype.find) {\n    return arr.find(check);\n  }\n\n  // use `filter` to obtain the same behavior of `find`\n  return arr.filter(check)[0];\n}\n","import find from './find';\n\n/**\n * Return the index of the matching object\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nexport default function findIndex(arr, prop, value) {\n  // use native findIndex if supported\n  if (Array.prototype.findIndex) {\n    return arr.findIndex(cur => cur[prop] === value);\n  }\n\n  // use `find` + `indexOf` if `findIndex` isn't supported\n  const match = find(arr, obj => obj[prop] === value);\n  return arr.indexOf(match);\n}\n","import getWindowSizes from './getWindowSizes';\nimport getClientRect from './getClientRect';\n\n/**\n * Get the position of the given element, relative to its offset parent\n * @method\n * @memberof Popper.Utils\n * @param {Element} element\n * @return {Object} position - Coordinates of the element and its `scrollTop`\n */\nexport default function getOffsetRect(element) {\n  let elementRect;\n  if (element.nodeName === 'HTML') {\n    const { width, height } = getWindowSizes(element.ownerDocument);\n    elementRect = {\n      width,\n      height,\n      left: 0,\n      top: 0,\n    };\n  } else {\n    elementRect = {\n      width: element.offsetWidth,\n      height: element.offsetHeight,\n      left: element.offsetLeft,\n      top: element.offsetTop,\n    };\n  }\n\n  // position\n  return getClientRect(elementRect);\n}\n","/**\n * Get the outer sizes of the given element (offset size + margins)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Object} object containing width and height properties\n */\nexport default function getOuterSizes(element) {\n  const window = element.ownerDocument.defaultView;\n  const styles = window.getComputedStyle(element);\n  const x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\n  const y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\n  const result = {\n    width: element.offsetWidth + y,\n    height: element.offsetHeight + x,\n  };\n  return result;\n}\n","/**\n * Get the opposite placement of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement\n * @returns {String} flipped placement\n */\nexport default function getOppositePlacement(placement) {\n  const hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n  return placement.replace(/left|right|bottom|top/g, matched => hash[matched]);\n}\n","import getOuterSizes from './getOuterSizes';\nimport getOppositePlacement from './getOppositePlacement';\n\n/**\n * Get offsets to the popper\n * @method\n * @memberof Popper.Utils\n * @param {Object} position - CSS position the Popper will get applied\n * @param {HTMLElement} popper - the popper element\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n * @param {String} placement - one of the valid placement options\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n */\nexport default function getPopperOffsets(popper, referenceOffsets, placement) {\n  placement = placement.split('-')[0];\n\n  // Get popper node sizes\n  const popperRect = getOuterSizes(popper);\n\n  // Add position, width and height to our offsets object\n  const popperOffsets = {\n    width: popperRect.width,\n    height: popperRect.height,\n  };\n\n  // depending by the popper placement we have to compute its offsets slightly differently\n  const isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n  const mainSide = isHoriz ? 'top' : 'left';\n  const secondarySide = isHoriz ? 'left' : 'top';\n  const measurement = isHoriz ? 'height' : 'width';\n  const secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n  popperOffsets[mainSide] =\n    referenceOffsets[mainSide] +\n    referenceOffsets[measurement] / 2 -\n    popperRect[measurement] / 2;\n  if (placement === secondarySide) {\n    popperOffsets[secondarySide] =\n      referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n  } else {\n    popperOffsets[secondarySide] =\n      referenceOffsets[getOppositePlacement(secondarySide)];\n  }\n\n  return popperOffsets;\n}\n","import findCommonOffsetParent from './findCommonOffsetParent';\nimport getOffsetRectRelativeToArbitraryNode from './getOffsetRectRelativeToArbitraryNode';\nimport getFixedPositionOffsetParent from './getFixedPositionOffsetParent';\nimport getReferenceNode from './getReferenceNode';\n\n/**\n * Get offsets to the reference element\n * @method\n * @memberof Popper.Utils\n * @param {Object} state\n * @param {Element} popper - the popper element\n * @param {Element} reference - the reference element (the popper will be relative to this)\n * @param {Element} fixedPosition - is in fixed position mode\n * @returns {Object} An object containing the offsets which will be applied to the popper\n */\nexport default function getReferenceOffsets(state, popper, reference, fixedPosition = null) {\n  const commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n  return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n}\n","/**\n * Get the prefixed supported property name\n * @method\n * @memberof Popper.Utils\n * @argument {String} property (camelCase)\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n */\nexport default function getSupportedPropertyName(property) {\n  const prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n  const upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n  for (let i = 0; i < prefixes.length; i++) {\n    const prefix = prefixes[i];\n    const toCheck = prefix ? `${prefix}${upperProp}` : property;\n    if (typeof document.body.style[toCheck] !== 'undefined') {\n      return toCheck;\n    }\n  }\n  return null;\n}\n","/**\n * Check if the given variable is a function\n * @method\n * @memberof Popper.Utils\n * @argument {Any} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\nexport default function isFunction(functionToCheck) {\n  const getType = {};\n  return (\n    functionToCheck &&\n    getType.toString.call(functionToCheck) === '[object Function]'\n  );\n}\n","/**\n * Helper used to know if the given modifier is enabled.\n * @method\n * @memberof Popper.Utils\n * @returns {Boolean}\n */\nexport default function isModifierEnabled(modifiers, modifierName) {\n  return modifiers.some(\n    ({ name, enabled }) => enabled && name === modifierName\n  );\n}\n","import find from './find';\n\n/**\n * Helper used to know if the given modifier depends from another one.<br />\n * It checks if the needed modifier is listed and enabled.\n * @method\n * @memberof Popper.Utils\n * @param {Array} modifiers - list of modifiers\n * @param {String} requestingName - name of requesting modifier\n * @param {String} requestedName - name of requested modifier\n * @returns {Boolean}\n */\nexport default function isModifierRequired(\n  modifiers,\n  requestingName,\n  requestedName\n) {\n  const requesting = find(modifiers, ({ name }) => name === requestingName);\n\n  const isRequired =\n    !!requesting &&\n    modifiers.some(modifier => {\n      return (\n        modifier.name === requestedName &&\n        modifier.enabled &&\n        modifier.order < requesting.order\n      );\n    });\n\n  if (!isRequired) {\n    const requesting = `\\`${requestingName}\\``;\n    const requested = `\\`${requestedName}\\``;\n    console.warn(\n      `${requested} modifier is required by ${requesting} modifier in order to work, be sure to include it before ${requesting}!`\n    );\n  }\n  return isRequired;\n}\n","/**\n * Tells if a given input is a number\n * @method\n * @memberof Popper.Utils\n * @param {*} input to check\n * @return {Boolean}\n */\nexport default function isNumeric(n) {\n  return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n}\n","/**\n * Get the window associated with the element\n * @argument {Element} element\n * @returns {Window}\n */\nexport default function getWindow(element) {\n  const ownerDocument = element.ownerDocument;\n  return ownerDocument ? ownerDocument.defaultView : window;\n}\n","import getWindow from './getWindow';\n\n/**\n * Remove event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nexport default function removeEventListeners(reference, state) {\n  // Remove resize event listener on window\n  getWindow(reference).removeEventListener('resize', state.updateBound);\n\n  // Remove scroll event listener on scroll parents\n  state.scrollParents.forEach(target => {\n    target.removeEventListener('scroll', state.updateBound);\n  });\n\n  // Reset state\n  state.updateBound = null;\n  state.scrollParents = [];\n  state.scrollElement = null;\n  state.eventsEnabled = false;\n  return state;\n}\n","import isFunction from './isFunction';\nimport findIndex from './findIndex';\nimport getClientRect from '../utils/getClientRect';\n\n/**\n * Loop trough the list of modifiers and run them in order,\n * each of them will then edit the data object.\n * @method\n * @memberof Popper.Utils\n * @param {dataObject} data\n * @param {Array} modifiers\n * @param {String} ends - Optional modifier name used as stopper\n * @returns {dataObject}\n */\nexport default function runModifiers(modifiers, data, ends) {\n  const modifiersToRun = ends === undefined\n    ? modifiers\n    : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n  modifiersToRun.forEach(modifier => {\n    if (modifier['function']) { // eslint-disable-line dot-notation\n      console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n    }\n    const fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n    if (modifier.enabled && isFunction(fn)) {\n      // Add properties to offsets to make them a complete clientRect object\n      // we do this before each modifier to make sure the previous one doesn't\n      // mess with these values\n      data.offsets.popper = getClientRect(data.offsets.popper);\n      data.offsets.reference = getClientRect(data.offsets.reference);\n\n      data = fn(data, modifier);\n    }\n  });\n\n  return data;\n}\n","/**\n * Set the attributes to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the attributes to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nexport default function setAttributes(element, attributes) {\n  Object.keys(attributes).forEach(function(prop) {\n    const value = attributes[prop];\n    if (value !== false) {\n      element.setAttribute(prop, attributes[prop]);\n    } else {\n      element.removeAttribute(prop);\n    }\n  });\n}\n","import isNumeric from './isNumeric';\n\n/**\n * Set the style to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the style to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nexport default function setStyles(element, styles) {\n  Object.keys(styles).forEach(prop => {\n    let unit = '';\n    // add unit if the value is numeric and is one of the following\n    if (\n      ['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !==\n        -1 &&\n      isNumeric(styles[prop])\n    ) {\n      unit = 'px';\n    }\n    element.style[prop] = styles[prop] + unit;\n  });\n}\n","import getScrollParent from './getScrollParent';\nimport getWindow from './getWindow';\n\nfunction attachToScrollParents(scrollParent, event, callback, scrollParents) {\n  const isBody = scrollParent.nodeName === 'BODY';\n  const target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n  target.addEventListener(event, callback, { passive: true });\n\n  if (!isBody) {\n    attachToScrollParents(\n      getScrollParent(target.parentNode),\n      event,\n      callback,\n      scrollParents\n    );\n  }\n  scrollParents.push(target);\n}\n\n/**\n * Setup needed event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nexport default function setupEventListeners(\n  reference,\n  options,\n  state,\n  updateBound\n) {\n  // Resize event listener on window\n  state.updateBound = updateBound;\n  getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n  // Scroll event listener on scroll parents\n  const scrollElement = getScrollParent(reference);\n  attachToScrollParents(\n    scrollElement,\n    'scroll',\n    state.updateBound,\n    state.scrollParents\n  );\n  state.scrollElement = scrollElement;\n  state.eventsEnabled = true;\n\n  return state;\n}\n","import computeAutoPlacement from './computeAutoPlacement';\nimport debounce from './debounce';\nimport findIndex from './findIndex';\nimport getBordersSize from './getBordersSize';\nimport getBoundaries from './getBoundaries';\nimport getBoundingClientRect from './getBoundingClientRect';\nimport getClientRect from './getClientRect';\nimport getOffsetParent from './getOffsetParent';\nimport getOffsetRect from './getOffsetRect';\nimport getOffsetRectRelativeToArbitraryNode from './getOffsetRectRelativeToArbitraryNode';\nimport getOuterSizes from './getOuterSizes';\nimport getParentNode from './getParentNode';\nimport getPopperOffsets from './getPopperOffsets';\nimport getReferenceOffsets from './getReferenceOffsets';\nimport getScroll from './getScroll';\nimport getScrollParent from './getScrollParent';\nimport getStyleComputedProperty from './getStyleComputedProperty';\nimport getSupportedPropertyName from './getSupportedPropertyName';\nimport getWindowSizes from './getWindowSizes';\nimport isFixed from './isFixed';\nimport isFunction from './isFunction';\nimport isModifierEnabled from './isModifierEnabled';\nimport isModifierRequired from './isModifierRequired';\nimport isNumeric from './isNumeric';\nimport removeEventListeners from './removeEventListeners';\nimport runModifiers from './runModifiers';\nimport setAttributes from './setAttributes';\nimport setStyles from './setStyles';\nimport setupEventListeners from './setupEventListeners';\n\n/** @namespace Popper.Utils */\nexport {\n  computeAutoPlacement,\n  debounce,\n  findIndex,\n  getBordersSize,\n  getBoundaries,\n  getBoundingClientRect,\n  getClientRect,\n  getOffsetParent,\n  getOffsetRect,\n  getOffsetRectRelativeToArbitraryNode,\n  getOuterSizes,\n  getParentNode,\n  getPopperOffsets,\n  getReferenceOffsets,\n  getScroll,\n  getScrollParent,\n  getStyleComputedProperty,\n  getSupportedPropertyName,\n  getWindowSizes,\n  isFixed,\n  isFunction,\n  isModifierEnabled,\n  isModifierRequired,\n  isNumeric,\n  removeEventListeners,\n  runModifiers,\n  setAttributes,\n  setStyles,\n  setupEventListeners,\n};\n\n// This is here just for backward compatibility with versions lower than v1.10.3\n// you should import the utilities using named exports, if you want them all use:\n// ```\n// import * as PopperUtils from 'popper-utils';\n// ```\n// The default export will be removed in the next major version.\nexport default {\n  computeAutoPlacement,\n  debounce,\n  findIndex,\n  getBordersSize,\n  getBoundaries,\n  getBoundingClientRect,\n  getClientRect,\n  getOffsetParent,\n  getOffsetRect,\n  getOffsetRectRelativeToArbitraryNode,\n  getOuterSizes,\n  getParentNode,\n  getPopperOffsets,\n  getReferenceOffsets,\n  getScroll,\n  getScrollParent,\n  getStyleComputedProperty,\n  getSupportedPropertyName,\n  getWindowSizes,\n  isFixed,\n  isFunction,\n  isModifierEnabled,\n  isModifierRequired,\n  isNumeric,\n  removeEventListeners,\n  runModifiers,\n  setAttributes,\n  setStyles,\n  setupEventListeners,\n};\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2): util.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * Private TransitionEnd Helpers\n */\n\nconst TRANSITION_END = 'transitionend'\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nfunction toType(obj) {\n  if (obj === null || typeof obj === 'undefined') {\n    return `${obj}`\n  }\n\n  return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\nfunction getSpecialTransitionEndEvent() {\n  return {\n    bindType: TRANSITION_END,\n    delegateType: TRANSITION_END,\n    handle(event) {\n      if ($(event.target).is(this)) {\n        return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params\n      }\n\n      return undefined\n    }\n  }\n}\n\nfunction transitionEndEmulator(duration) {\n  let called = false\n\n  $(this).one(Util.TRANSITION_END, () => {\n    called = true\n  })\n\n  setTimeout(() => {\n    if (!called) {\n      Util.triggerTransitionEnd(this)\n    }\n  }, duration)\n\n  return this\n}\n\nfunction setTransitionEndSupport() {\n  $.fn.emulateTransitionEnd = transitionEndEmulator\n  $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()\n}\n\n/**\n * Public Util API\n */\n\nconst Util = {\n  TRANSITION_END: 'bsTransitionEnd',\n\n  getUID(prefix) {\n    do {\n      // eslint-disable-next-line no-bitwise\n      prefix += ~~(Math.random() * MAX_UID) // \"~~\" acts like a faster Math.floor() here\n    } while (document.getElementById(prefix))\n\n    return prefix\n  },\n\n  getSelectorFromElement(element) {\n    let selector = element.getAttribute('data-target')\n\n    if (!selector || selector === '#') {\n      const hrefAttr = element.getAttribute('href')\n      selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''\n    }\n\n    try {\n      return document.querySelector(selector) ? selector : null\n    } catch (_) {\n      return null\n    }\n  },\n\n  getTransitionDurationFromElement(element) {\n    if (!element) {\n      return 0\n    }\n\n    // Get transition-duration of the element\n    let transitionDuration = $(element).css('transition-duration')\n    let transitionDelay = $(element).css('transition-delay')\n\n    const floatTransitionDuration = parseFloat(transitionDuration)\n    const floatTransitionDelay = parseFloat(transitionDelay)\n\n    // Return 0 if element or transition duration is not found\n    if (!floatTransitionDuration && !floatTransitionDelay) {\n      return 0\n    }\n\n    // If multiple durations are defined, take the first\n    transitionDuration = transitionDuration.split(',')[0]\n    transitionDelay = transitionDelay.split(',')[0]\n\n    return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n  },\n\n  reflow(element) {\n    return element.offsetHeight\n  },\n\n  triggerTransitionEnd(element) {\n    $(element).trigger(TRANSITION_END)\n  },\n\n  supportsTransitionEnd() {\n    return Boolean(TRANSITION_END)\n  },\n\n  isElement(obj) {\n    return (obj[0] || obj).nodeType\n  },\n\n  typeCheckConfig(componentName, config, configTypes) {\n    for (const property in configTypes) {\n      if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n        const expectedTypes = configTypes[property]\n        const value = config[property]\n        const valueType = value && Util.isElement(value) ?\n          'element' : toType(value)\n\n        if (!new RegExp(expectedTypes).test(valueType)) {\n          throw new Error(\n            `${componentName.toUpperCase()}: ` +\n            `Option \"${property}\" provided type \"${valueType}\" ` +\n            `but expected type \"${expectedTypes}\".`)\n        }\n      }\n    }\n  },\n\n  findShadowRoot(element) {\n    if (!document.documentElement.attachShadow) {\n      return null\n    }\n\n    // Can find the shadow root otherwise it'll return the document\n    if (typeof element.getRootNode === 'function') {\n      const root = element.getRootNode()\n      return root instanceof ShadowRoot ? root : null\n    }\n\n    if (element instanceof ShadowRoot) {\n      return element\n    }\n\n    // when we don't find a shadow root\n    if (!element.parentNode) {\n      return null\n    }\n\n    return Util.findShadowRoot(element.parentNode)\n  },\n\n  jQueryDetection() {\n    if (typeof $ === 'undefined') {\n      throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.')\n    }\n\n    const version = $.fn.jquery.split(' ')[0].split('.')\n    const minMajor = 1\n    const ltMajor = 2\n    const minMinor = 9\n    const minPatch = 1\n    const maxMajor = 4\n\n    if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n      throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0')\n    }\n  }\n}\n\nUtil.jQueryDetection()\nsetTransitionEndSupport()\n\nexport default Util\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * Constants\n */\n\nconst NAME = 'alert'\nconst VERSION = '4.6.2'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst CLASS_NAME_ALERT = 'alert'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst SELECTOR_DISMISS = '[data-dismiss=\"alert\"]'\n\n/**\n * Class definition\n */\n\nclass Alert {\n  constructor(element) {\n    this._element = element\n  }\n\n  // Getters\n  static get VERSION() {\n    return VERSION\n  }\n\n  // Public\n  close(element) {\n    let rootElement = this._element\n    if (element) {\n      rootElement = this._getRootElement(element)\n    }\n\n    const customEvent = this._triggerCloseEvent(rootElement)\n\n    if (customEvent.isDefaultPrevented()) {\n      return\n    }\n\n    this._removeElement(rootElement)\n  }\n\n  dispose() {\n    $.removeData(this._element, DATA_KEY)\n    this._element = null\n  }\n\n  // Private\n  _getRootElement(element) {\n    const selector = Util.getSelectorFromElement(element)\n    let parent = false\n\n    if (selector) {\n      parent = document.querySelector(selector)\n    }\n\n    if (!parent) {\n      parent = $(element).closest(`.${CLASS_NAME_ALERT}`)[0]\n    }\n\n    return parent\n  }\n\n  _triggerCloseEvent(element) {\n    const closeEvent = $.Event(EVENT_CLOSE)\n\n    $(element).trigger(closeEvent)\n    return closeEvent\n  }\n\n  _removeElement(element) {\n    $(element).removeClass(CLASS_NAME_SHOW)\n\n    if (!$(element).hasClass(CLASS_NAME_FADE)) {\n      this._destroyElement(element)\n      return\n    }\n\n    const transitionDuration = Util.getTransitionDurationFromElement(element)\n\n    $(element)\n      .one(Util.TRANSITION_END, event => this._destroyElement(element, event))\n      .emulateTransitionEnd(transitionDuration)\n  }\n\n  _destroyElement(element) {\n    $(element)\n      .detach()\n      .trigger(EVENT_CLOSED)\n      .remove()\n  }\n\n  // Static\n  static _jQueryInterface(config) {\n    return this.each(function () {\n      const $element = $(this)\n      let data = $element.data(DATA_KEY)\n\n      if (!data) {\n        data = new Alert(this)\n        $element.data(DATA_KEY, data)\n      }\n\n      if (config === 'close') {\n        data[config](this)\n      }\n    })\n  }\n\n  static _handleDismiss(alertInstance) {\n    return function (event) {\n      if (event) {\n        event.preventDefault()\n      }\n\n      alertInstance.close(this)\n    }\n  }\n}\n\n/**\n * Data API implementation\n */\n\n$(document).on(\n  EVENT_CLICK_DATA_API,\n  SELECTOR_DISMISS,\n  Alert._handleDismiss(new Alert())\n)\n\n/**\n * jQuery\n */\n\n$.fn[NAME] = Alert._jQueryInterface\n$.fn[NAME].Constructor = Alert\n$.fn[NAME].noConflict = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return Alert._jQueryInterface\n}\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * Constants\n */\n\nconst NAME = 'button'\nconst VERSION = '4.6.2'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_BUTTON = 'btn'\nconst CLASS_NAME_FOCUS = 'focus'\n\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_FOCUS_BLUR_DATA_API = `focus${EVENT_KEY}${DATA_API_KEY} ` +\n                          `blur${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst SELECTOR_DATA_TOGGLE_CARROT = '[data-toggle^=\"button\"]'\nconst SELECTOR_DATA_TOGGLES = '[data-toggle=\"buttons\"]'\nconst SELECTOR_DATA_TOGGLE = '[data-toggle=\"button\"]'\nconst SELECTOR_DATA_TOGGLES_BUTTONS = '[data-toggle=\"buttons\"] .btn'\nconst SELECTOR_INPUT = 'input:not([type=\"hidden\"])'\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_BUTTON = '.btn'\n\n/**\n * Class definition\n */\n\nclass Button {\n  constructor(element) {\n    this._element = element\n    this.shouldAvoidTriggerChange = false\n  }\n\n  // Getters\n  static get VERSION() {\n    return VERSION\n  }\n\n  // Public\n  toggle() {\n    let triggerChangeEvent = true\n    let addAriaPressed = true\n    const rootElement = $(this._element).closest(SELECTOR_DATA_TOGGLES)[0]\n\n    if (rootElement) {\n      const input = this._element.querySelector(SELECTOR_INPUT)\n\n      if (input) {\n        if (input.type === 'radio') {\n          if (input.checked && this._element.classList.contains(CLASS_NAME_ACTIVE)) {\n            triggerChangeEvent = false\n          } else {\n            const activeElement = rootElement.querySelector(SELECTOR_ACTIVE)\n\n            if (activeElement) {\n              $(activeElement).removeClass(CLASS_NAME_ACTIVE)\n            }\n          }\n        }\n\n        if (triggerChangeEvent) {\n          // if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input\n          if (input.type === 'checkbox' || input.type === 'radio') {\n            input.checked = !this._element.classList.contains(CLASS_NAME_ACTIVE)\n          }\n\n          if (!this.shouldAvoidTriggerChange) {\n            $(input).trigger('change')\n          }\n        }\n\n        input.focus()\n        addAriaPressed = false\n      }\n    }\n\n    if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) {\n      if (addAriaPressed) {\n        this._element.setAttribute('aria-pressed', !this._element.classList.contains(CLASS_NAME_ACTIVE))\n      }\n\n      if (triggerChangeEvent) {\n        $(this._element).toggleClass(CLASS_NAME_ACTIVE)\n      }\n    }\n  }\n\n  dispose() {\n    $.removeData(this._element, DATA_KEY)\n    this._element = null\n  }\n\n  // Static\n  static _jQueryInterface(config, avoidTriggerChange) {\n    return this.each(function () {\n      const $element = $(this)\n      let data = $element.data(DATA_KEY)\n\n      if (!data) {\n        data = new Button(this)\n        $element.data(DATA_KEY, data)\n      }\n\n      data.shouldAvoidTriggerChange = avoidTriggerChange\n\n      if (config === 'toggle') {\n        data[config]()\n      }\n    })\n  }\n}\n\n/**\n * Data API implementation\n */\n\n$(document)\n  .on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, event => {\n    let button = event.target\n    const initialButton = button\n\n    if (!$(button).hasClass(CLASS_NAME_BUTTON)) {\n      button = $(button).closest(SELECTOR_BUTTON)[0]\n    }\n\n    if (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')) {\n      event.preventDefault() // work around Firefox bug #1540995\n    } else {\n      const inputBtn = button.querySelector(SELECTOR_INPUT)\n\n      if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) {\n        event.preventDefault() // work around Firefox bug #1540995\n        return\n      }\n\n      if (initialButton.tagName === 'INPUT' || button.tagName !== 'LABEL') {\n        Button._jQueryInterface.call($(button), 'toggle', initialButton.tagName === 'INPUT')\n      }\n    }\n  })\n  .on(EVENT_FOCUS_BLUR_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, event => {\n    const button = $(event.target).closest(SELECTOR_BUTTON)[0]\n    $(button).toggleClass(CLASS_NAME_FOCUS, /^focus(in)?$/.test(event.type))\n  })\n\n$(window).on(EVENT_LOAD_DATA_API, () => {\n  // ensure correct active class is set to match the controls' actual values/states\n\n  // find all checkboxes/readio buttons inside data-toggle groups\n  let buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLES_BUTTONS))\n  for (let i = 0, len = buttons.length; i < len; i++) {\n    const button = buttons[i]\n    const input = button.querySelector(SELECTOR_INPUT)\n    if (input.checked || input.hasAttribute('checked')) {\n      button.classList.add(CLASS_NAME_ACTIVE)\n    } else {\n      button.classList.remove(CLASS_NAME_ACTIVE)\n    }\n  }\n\n  // find all button toggles\n  buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE))\n  for (let i = 0, len = buttons.length; i < len; i++) {\n    const button = buttons[i]\n    if (button.getAttribute('aria-pressed') === 'true') {\n      button.classList.add(CLASS_NAME_ACTIVE)\n    } else {\n      button.classList.remove(CLASS_NAME_ACTIVE)\n    }\n  }\n})\n\n/**\n * jQuery\n */\n\n$.fn[NAME] = Button._jQueryInterface\n$.fn[NAME].Constructor = Button\n$.fn[NAME].noConflict = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return Button._jQueryInterface\n}\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * Constants\n */\n\nconst NAME = 'carousel'\nconst VERSION = '4.6.2'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key\nconst ARROW_RIGHT_KEYCODE = 39 // KeyboardEvent.which value for right arrow key\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\nconst SWIPE_THRESHOLD = 40\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_RIGHT = 'carousel-item-right'\nconst CLASS_NAME_LEFT = 'carousel-item-left'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\n\nconst DIRECTION_NEXT = 'next'\nconst DIRECTION_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ACTIVE_ITEM = '.active.carousel-item'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_DATA_SLIDE = '[data-slide], [data-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-ride=\"carousel\"]'\n\nconst Default = {\n  interval: 5000,\n  keyboard: true,\n  slide: false,\n  pause: 'hover',\n  wrap: true,\n  touch: true\n}\n\nconst DefaultType = {\n  interval: '(number|boolean)',\n  keyboard: 'boolean',\n  slide: '(boolean|string)',\n  pause: '(string|boolean)',\n  wrap: 'boolean',\n  touch: 'boolean'\n}\n\nconst PointerType = {\n  TOUCH: 'touch',\n  PEN: 'pen'\n}\n\n/**\n * Class definition\n */\n\nclass Carousel {\n  constructor(element, config) {\n    this._items = null\n    this._interval = null\n    this._activeElement = null\n    this._isPaused = false\n    this._isSliding = false\n    this.touchTimeout = null\n    this.touchStartX = 0\n    this.touchDeltaX = 0\n\n    this._config = this._getConfig(config)\n    this._element = element\n    this._indicatorsElement = this._element.querySelector(SELECTOR_INDICATORS)\n    this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n    this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent)\n\n    this._addEventListeners()\n  }\n\n  // Getters\n  static get VERSION() {\n    return VERSION\n  }\n\n  static get Default() {\n    return Default\n  }\n\n  // Public\n  next() {\n    if (!this._isSliding) {\n      this._slide(DIRECTION_NEXT)\n    }\n  }\n\n  nextWhenVisible() {\n    const $element = $(this._element)\n    // Don't call next when the page isn't visible\n    // or the carousel or its parent isn't visible\n    if (!document.hidden &&\n      ($element.is(':visible') && $element.css('visibility') !== 'hidden')) {\n      this.next()\n    }\n  }\n\n  prev() {\n    if (!this._isSliding) {\n      this._slide(DIRECTION_PREV)\n    }\n  }\n\n  pause(event) {\n    if (!event) {\n      this._isPaused = true\n    }\n\n    if (this._element.querySelector(SELECTOR_NEXT_PREV)) {\n      Util.triggerTransitionEnd(this._element)\n      this.cycle(true)\n    }\n\n    clearInterval(this._interval)\n    this._interval = null\n  }\n\n  cycle(event) {\n    if (!event) {\n      this._isPaused = false\n    }\n\n    if (this._interval) {\n      clearInterval(this._interval)\n      this._interval = null\n    }\n\n    if (this._config.interval && !this._isPaused) {\n      this._updateInterval()\n\n      this._interval = setInterval(\n        (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\n        this._config.interval\n      )\n    }\n  }\n\n  to(index) {\n    this._activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM)\n\n    const activeIndex = this._getItemIndex(this._activeElement)\n\n    if (index > this._items.length - 1 || index < 0) {\n      return\n    }\n\n    if (this._isSliding) {\n      $(this._element).one(EVENT_SLID, () => this.to(index))\n      return\n    }\n\n    if (activeIndex === index) {\n      this.pause()\n      this.cycle()\n      return\n    }\n\n    const direction = index > activeIndex ?\n      DIRECTION_NEXT :\n      DIRECTION_PREV\n\n    this._slide(direction, this._items[index])\n  }\n\n  dispose() {\n    $(this._element).off(EVENT_KEY)\n    $.removeData(this._element, DATA_KEY)\n\n    this._items = null\n    this._config = null\n    this._element = null\n    this._interval = null\n    this._isPaused = null\n    this._isSliding = null\n    this._activeElement = null\n    this._indicatorsElement = null\n  }\n\n  // Private\n  _getConfig(config) {\n    config = {\n      ...Default,\n      ...config\n    }\n    Util.typeCheckConfig(NAME, config, DefaultType)\n    return config\n  }\n\n  _handleSwipe() {\n    const absDeltax = Math.abs(this.touchDeltaX)\n\n    if (absDeltax <= SWIPE_THRESHOLD) {\n      return\n    }\n\n    const direction = absDeltax / this.touchDeltaX\n\n    this.touchDeltaX = 0\n\n    // swipe left\n    if (direction > 0) {\n      this.prev()\n    }\n\n    // swipe right\n    if (direction < 0) {\n      this.next()\n    }\n  }\n\n  _addEventListeners() {\n    if (this._config.keyboard) {\n      $(this._element).on(EVENT_KEYDOWN, event => this._keydown(event))\n    }\n\n    if (this._config.pause === 'hover') {\n      $(this._element)\n        .on(EVENT_MOUSEENTER, event => this.pause(event))\n        .on(EVENT_MOUSELEAVE, event => this.cycle(event))\n    }\n\n    if (this._config.touch) {\n      this._addTouchEventListeners()\n    }\n  }\n\n  _addTouchEventListeners() {\n    if (!this._touchSupported) {\n      return\n    }\n\n    const start = event => {\n      if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n        this.touchStartX = event.originalEvent.clientX\n      } else if (!this._pointerEvent) {\n        this.touchStartX = event.originalEvent.touches[0].clientX\n      }\n    }\n\n    const move = event => {\n      // ensure swiping with one touch and not pinching\n      this.touchDeltaX = event.originalEvent.touches && event.originalEvent.touches.length > 1 ?\n        0 :\n        event.originalEvent.touches[0].clientX - this.touchStartX\n    }\n\n    const end = event => {\n      if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n        this.touchDeltaX = event.originalEvent.clientX - this.touchStartX\n      }\n\n      this._handleSwipe()\n      if (this._config.pause === 'hover') {\n        // If it's a touch-enabled device, mouseenter/leave are fired as\n        // part of the mouse compatibility events on first tap - the carousel\n        // would stop cycling until user tapped out of it;\n        // here, we listen for touchend, explicitly pause the carousel\n        // (as if it's the second time we tap on it, mouseenter compat event\n        // is NOT fired) and after a timeout (to allow for mouse compatibility\n        // events to fire) we explicitly restart cycling\n\n        this.pause()\n        if (this.touchTimeout) {\n          clearTimeout(this.touchTimeout)\n        }\n\n        this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n      }\n    }\n\n    $(this._element.querySelectorAll(SELECTOR_ITEM_IMG))\n      .on(EVENT_DRAG_START, e => e.preventDefault())\n\n    if (this._pointerEvent) {\n      $(this._element).on(EVENT_POINTERDOWN, event => start(event))\n      $(this._element).on(EVENT_POINTERUP, event => end(event))\n\n      this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n    } else {\n      $(this._element).on(EVENT_TOUCHSTART, event => start(event))\n      $(this._element).on(EVENT_TOUCHMOVE, event => move(event))\n      $(this._element).on(EVENT_TOUCHEND, event => end(event))\n    }\n  }\n\n  _keydown(event) {\n    if (/input|textarea/i.test(event.target.tagName)) {\n      return\n    }\n\n    switch (event.which) {\n      case ARROW_LEFT_KEYCODE:\n        event.preventDefault()\n        this.prev()\n        break\n      case ARROW_RIGHT_KEYCODE:\n        event.preventDefault()\n        this.next()\n        break\n      default:\n    }\n  }\n\n  _getItemIndex(element) {\n    this._items = element && element.parentNode ?\n      [].slice.call(element.parentNode.querySelectorAll(SELECTOR_ITEM)) :\n      []\n    return this._items.indexOf(element)\n  }\n\n  _getItemByDirection(direction, activeElement) {\n    const isNextDirection = direction === DIRECTION_NEXT\n    const isPrevDirection = direction === DIRECTION_PREV\n    const activeIndex = this._getItemIndex(activeElement)\n    const lastItemIndex = this._items.length - 1\n    const isGoingToWrap = isPrevDirection && activeIndex === 0 ||\n                            isNextDirection && activeIndex === lastItemIndex\n\n    if (isGoingToWrap && !this._config.wrap) {\n      return activeElement\n    }\n\n    const delta = direction === DIRECTION_PREV ? -1 : 1\n    const itemIndex = (activeIndex + delta) % this._items.length\n\n    return itemIndex === -1 ?\n      this._items[this._items.length - 1] : this._items[itemIndex]\n  }\n\n  _triggerSlideEvent(relatedTarget, eventDirectionName) {\n    const targetIndex = this._getItemIndex(relatedTarget)\n    const fromIndex = this._getItemIndex(this._element.querySelector(SELECTOR_ACTIVE_ITEM))\n    const slideEvent = $.Event(EVENT_SLIDE, {\n      relatedTarget,\n      direction: eventDirectionName,\n      from: fromIndex,\n      to: targetIndex\n    })\n\n    $(this._element).trigger(slideEvent)\n\n    return slideEvent\n  }\n\n  _setActiveIndicatorElement(element) {\n    if (this._indicatorsElement) {\n      const indicators = [].slice.call(this._indicatorsElement.querySelectorAll(SELECTOR_ACTIVE))\n      $(indicators).removeClass(CLASS_NAME_ACTIVE)\n\n      const nextIndicator = this._indicatorsElement.children[\n        this._getItemIndex(element)\n      ]\n\n      if (nextIndicator) {\n        $(nextIndicator).addClass(CLASS_NAME_ACTIVE)\n      }\n    }\n  }\n\n  _updateInterval() {\n    const element = this._activeElement || this._element.querySelector(SELECTOR_ACTIVE_ITEM)\n\n    if (!element) {\n      return\n    }\n\n    const elementInterval = parseInt(element.getAttribute('data-interval'), 10)\n\n    if (elementInterval) {\n      this._config.defaultInterval = this._config.defaultInterval || this._config.interval\n      this._config.interval = elementInterval\n    } else {\n      this._config.interval = this._config.defaultInterval || this._config.interval\n    }\n  }\n\n  _slide(direction, element) {\n    const activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM)\n    const activeElementIndex = this._getItemIndex(activeElement)\n    const nextElement = element || activeElement &&\n      this._getItemByDirection(direction, activeElement)\n    const nextElementIndex = this._getItemIndex(nextElement)\n    const isCycling = Boolean(this._interval)\n\n    let directionalClassName\n    let orderClassName\n    let eventDirectionName\n\n    if (direction === DIRECTION_NEXT) {\n      directionalClassName = CLASS_NAME_LEFT\n      orderClassName = CLASS_NAME_NEXT\n      eventDirectionName = DIRECTION_LEFT\n    } else {\n      directionalClassName = CLASS_NAME_RIGHT\n      orderClassName = CLASS_NAME_PREV\n      eventDirectionName = DIRECTION_RIGHT\n    }\n\n    if (nextElement && $(nextElement).hasClass(CLASS_NAME_ACTIVE)) {\n      this._isSliding = false\n      return\n    }\n\n    const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\n    if (slideEvent.isDefaultPrevented()) {\n      return\n    }\n\n    if (!activeElement || !nextElement) {\n      // Some weirdness is happening, so we bail\n      return\n    }\n\n    this._isSliding = true\n\n    if (isCycling) {\n      this.pause()\n    }\n\n    this._setActiveIndicatorElement(nextElement)\n    this._activeElement = nextElement\n\n    const slidEvent = $.Event(EVENT_SLID, {\n      relatedTarget: nextElement,\n      direction: eventDirectionName,\n      from: activeElementIndex,\n      to: nextElementIndex\n    })\n\n    if ($(this._element).hasClass(CLASS_NAME_SLIDE)) {\n      $(nextElement).addClass(orderClassName)\n\n      Util.reflow(nextElement)\n\n      $(activeElement).addClass(directionalClassName)\n      $(nextElement).addClass(directionalClassName)\n\n      const transitionDuration = Util.getTransitionDurationFromElement(activeElement)\n\n      $(activeElement)\n        .one(Util.TRANSITION_END, () => {\n          $(nextElement)\n            .removeClass(`${directionalClassName} ${orderClassName}`)\n            .addClass(CLASS_NAME_ACTIVE)\n\n          $(activeElement).removeClass(`${CLASS_NAME_ACTIVE} ${orderClassName} ${directionalClassName}`)\n\n          this._isSliding = false\n\n          setTimeout(() => $(this._element).trigger(slidEvent), 0)\n        })\n        .emulateTransitionEnd(transitionDuration)\n    } else {\n      $(activeElement).removeClass(CLASS_NAME_ACTIVE)\n      $(nextElement).addClass(CLASS_NAME_ACTIVE)\n\n      this._isSliding = false\n      $(this._element).trigger(slidEvent)\n    }\n\n    if (isCycling) {\n      this.cycle()\n    }\n  }\n\n  // Static\n  static _jQueryInterface(config) {\n    return this.each(function () {\n      let data = $(this).data(DATA_KEY)\n      let _config = {\n        ...Default,\n        ...$(this).data()\n      }\n\n      if (typeof config === 'object') {\n        _config = {\n          ..._config,\n          ...config\n        }\n      }\n\n      const action = typeof config === 'string' ? config : _config.slide\n\n      if (!data) {\n        data = new Carousel(this, _config)\n        $(this).data(DATA_KEY, data)\n      }\n\n      if (typeof config === 'number') {\n        data.to(config)\n      } else if (typeof action === 'string') {\n        if (typeof data[action] === 'undefined') {\n          throw new TypeError(`No method named \"${action}\"`)\n        }\n\n        data[action]()\n      } else if (_config.interval && _config.ride) {\n        data.pause()\n        data.cycle()\n      }\n    })\n  }\n\n  static _dataApiClickHandler(event) {\n    const selector = Util.getSelectorFromElement(this)\n\n    if (!selector) {\n      return\n    }\n\n    const target = $(selector)[0]\n\n    if (!target || !$(target).hasClass(CLASS_NAME_CAROUSEL)) {\n      return\n    }\n\n    const config = {\n      ...$(target).data(),\n      ...$(this).data()\n    }\n    const slideIndex = this.getAttribute('data-slide-to')\n\n    if (slideIndex) {\n      config.interval = false\n    }\n\n    Carousel._jQueryInterface.call($(target), config)\n\n    if (slideIndex) {\n      $(target).data(DATA_KEY).to(slideIndex)\n    }\n\n    event.preventDefault()\n  }\n}\n\n/**\n * Data API implementation\n */\n\n$(document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, Carousel._dataApiClickHandler)\n\n$(window).on(EVENT_LOAD_DATA_API, () => {\n  const carousels = [].slice.call(document.querySelectorAll(SELECTOR_DATA_RIDE))\n  for (let i = 0, len = carousels.length; i < len; i++) {\n    const $carousel = $(carousels[i])\n    Carousel._jQueryInterface.call($carousel, $carousel.data())\n  }\n})\n\n/**\n * jQuery\n */\n\n$.fn[NAME] = Carousel._jQueryInterface\n$.fn[NAME].Constructor = Carousel\n$.fn[NAME].noConflict = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return Carousel._jQueryInterface\n}\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * Constants\n */\n\nconst NAME = 'collapse'\nconst VERSION = '4.6.2'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\n\nconst DIMENSION_WIDTH = 'width'\nconst DIMENSION_HEIGHT = 'height'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst SELECTOR_ACTIVES = '.show, .collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-toggle=\"collapse\"]'\n\nconst Default = {\n  toggle: true,\n  parent: ''\n}\n\nconst DefaultType = {\n  toggle: 'boolean',\n  parent: '(string|element)'\n}\n\n/**\n * Class definition\n */\n\nclass Collapse {\n  constructor(element, config) {\n    this._isTransitioning = false\n    this._element = element\n    this._config = this._getConfig(config)\n    this._triggerArray = [].slice.call(document.querySelectorAll(\n      `[data-toggle=\"collapse\"][href=\"#${element.id}\"],` +\n      `[data-toggle=\"collapse\"][data-target=\"#${element.id}\"]`\n    ))\n\n    const toggleList = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE))\n    for (let i = 0, len = toggleList.length; i < len; i++) {\n      const elem = toggleList[i]\n      const selector = Util.getSelectorFromElement(elem)\n      const filterElement = [].slice.call(document.querySelectorAll(selector))\n        .filter(foundElem => foundElem === element)\n\n      if (selector !== null && filterElement.length > 0) {\n        this._selector = selector\n        this._triggerArray.push(elem)\n      }\n    }\n\n    this._parent = this._config.parent ? this._getParent() : null\n\n    if (!this._config.parent) {\n      this._addAriaAndCollapsedClass(this._element, this._triggerArray)\n    }\n\n    if (this._config.toggle) {\n      this.toggle()\n    }\n  }\n\n  // Getters\n  static get VERSION() {\n    return VERSION\n  }\n\n  static get Default() {\n    return Default\n  }\n\n  // Public\n  toggle() {\n    if ($(this._element).hasClass(CLASS_NAME_SHOW)) {\n      this.hide()\n    } else {\n      this.show()\n    }\n  }\n\n  show() {\n    if (this._isTransitioning ||\n      $(this._element).hasClass(CLASS_NAME_SHOW)) {\n      return\n    }\n\n    let actives\n    let activesData\n\n    if (this._parent) {\n      actives = [].slice.call(this._parent.querySelectorAll(SELECTOR_ACTIVES))\n        .filter(elem => {\n          if (typeof this._config.parent === 'string') {\n            return elem.getAttribute('data-parent') === this._config.parent\n          }\n\n          return elem.classList.contains(CLASS_NAME_COLLAPSE)\n        })\n\n      if (actives.length === 0) {\n        actives = null\n      }\n    }\n\n    if (actives) {\n      activesData = $(actives).not(this._selector).data(DATA_KEY)\n      if (activesData && activesData._isTransitioning) {\n        return\n      }\n    }\n\n    const startEvent = $.Event(EVENT_SHOW)\n    $(this._element).trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) {\n      return\n    }\n\n    if (actives) {\n      Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide')\n      if (!activesData) {\n        $(actives).data(DATA_KEY, null)\n      }\n    }\n\n    const dimension = this._getDimension()\n\n    $(this._element)\n      .removeClass(CLASS_NAME_COLLAPSE)\n      .addClass(CLASS_NAME_COLLAPSING)\n\n    this._element.style[dimension] = 0\n\n    if (this._triggerArray.length) {\n      $(this._triggerArray)\n        .removeClass(CLASS_NAME_COLLAPSED)\n        .attr('aria-expanded', true)\n    }\n\n    this.setTransitioning(true)\n\n    const complete = () => {\n      $(this._element)\n        .removeClass(CLASS_NAME_COLLAPSING)\n        .addClass(`${CLASS_NAME_COLLAPSE} ${CLASS_NAME_SHOW}`)\n\n      this._element.style[dimension] = ''\n\n      this.setTransitioning(false)\n\n      $(this._element).trigger(EVENT_SHOWN)\n    }\n\n    const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n    const scrollSize = `scroll${capitalizedDimension}`\n    const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n    $(this._element)\n      .one(Util.TRANSITION_END, complete)\n      .emulateTransitionEnd(transitionDuration)\n\n    this._element.style[dimension] = `${this._element[scrollSize]}px`\n  }\n\n  hide() {\n    if (this._isTransitioning ||\n      !$(this._element).hasClass(CLASS_NAME_SHOW)) {\n      return\n    }\n\n    const startEvent = $.Event(EVENT_HIDE)\n    $(this._element).trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) {\n      return\n    }\n\n    const dimension = this._getDimension()\n\n    this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n    Util.reflow(this._element)\n\n    $(this._element)\n      .addClass(CLASS_NAME_COLLAPSING)\n      .removeClass(`${CLASS_NAME_COLLAPSE} ${CLASS_NAME_SHOW}`)\n\n    const triggerArrayLength = this._triggerArray.length\n    if (triggerArrayLength > 0) {\n      for (let i = 0; i < triggerArrayLength; i++) {\n        const trigger = this._triggerArray[i]\n        const selector = Util.getSelectorFromElement(trigger)\n\n        if (selector !== null) {\n          const $elem = $([].slice.call(document.querySelectorAll(selector)))\n          if (!$elem.hasClass(CLASS_NAME_SHOW)) {\n            $(trigger).addClass(CLASS_NAME_COLLAPSED)\n              .attr('aria-expanded', false)\n          }\n        }\n      }\n    }\n\n    this.setTransitioning(true)\n\n    const complete = () => {\n      this.setTransitioning(false)\n      $(this._element)\n        .removeClass(CLASS_NAME_COLLAPSING)\n        .addClass(CLASS_NAME_COLLAPSE)\n        .trigger(EVENT_HIDDEN)\n    }\n\n    this._element.style[dimension] = ''\n    const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n    $(this._element)\n      .one(Util.TRANSITION_END, complete)\n      .emulateTransitionEnd(transitionDuration)\n  }\n\n  setTransitioning(isTransitioning) {\n    this._isTransitioning = isTransitioning\n  }\n\n  dispose() {\n    $.removeData(this._element, DATA_KEY)\n\n    this._config = null\n    this._parent = null\n    this._element = null\n    this._triggerArray = null\n    this._isTransitioning = null\n  }\n\n  // Private\n  _getConfig(config) {\n    config = {\n      ...Default,\n      ...config\n    }\n    config.toggle = Boolean(config.toggle) // Coerce string values\n    Util.typeCheckConfig(NAME, config, DefaultType)\n    return config\n  }\n\n  _getDimension() {\n    const hasWidth = $(this._element).hasClass(DIMENSION_WIDTH)\n    return hasWidth ? DIMENSION_WIDTH : DIMENSION_HEIGHT\n  }\n\n  _getParent() {\n    let parent\n\n    if (Util.isElement(this._config.parent)) {\n      parent = this._config.parent\n\n      // It's a jQuery object\n      if (typeof this._config.parent.jquery !== 'undefined') {\n        parent = this._config.parent[0]\n      }\n    } else {\n      parent = document.querySelector(this._config.parent)\n    }\n\n    const selector = `[data-toggle=\"collapse\"][data-parent=\"${this._config.parent}\"]`\n    const children = [].slice.call(parent.querySelectorAll(selector))\n\n    $(children).each((i, element) => {\n      this._addAriaAndCollapsedClass(\n        Collapse._getTargetFromElement(element),\n        [element]\n      )\n    })\n\n    return parent\n  }\n\n  _addAriaAndCollapsedClass(element, triggerArray) {\n    const isOpen = $(element).hasClass(CLASS_NAME_SHOW)\n\n    if (triggerArray.length) {\n      $(triggerArray)\n        .toggleClass(CLASS_NAME_COLLAPSED, !isOpen)\n        .attr('aria-expanded', isOpen)\n    }\n  }\n\n  // Static\n  static _getTargetFromElement(element) {\n    const selector = Util.getSelectorFromElement(element)\n    return selector ? document.querySelector(selector) : null\n  }\n\n  static _jQueryInterface(config) {\n    return this.each(function () {\n      const $element = $(this)\n      let data = $element.data(DATA_KEY)\n      const _config = {\n        ...Default,\n        ...$element.data(),\n        ...(typeof config === 'object' && config ? config : {})\n      }\n\n      if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) {\n        _config.toggle = false\n      }\n\n      if (!data) {\n        data = new Collapse(this, _config)\n        $element.data(DATA_KEY, data)\n      }\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n\n        data[config]()\n      }\n    })\n  }\n}\n\n/**\n * Data API implementation\n */\n\n$(document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n  // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n  if (event.currentTarget.tagName === 'A') {\n    event.preventDefault()\n  }\n\n  const $trigger = $(this)\n  const selector = Util.getSelectorFromElement(this)\n  const selectors = [].slice.call(document.querySelectorAll(selector))\n\n  $(selectors).each(function () {\n    const $target = $(this)\n    const data = $target.data(DATA_KEY)\n    const config = data ? 'toggle' : $trigger.data()\n    Collapse._jQueryInterface.call($target, config)\n  })\n})\n\n/**\n * jQuery\n */\n\n$.fn[NAME] = Collapse._jQueryInterface\n$.fn[NAME].Constructor = Collapse\n$.fn[NAME].noConflict = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return Collapse._jQueryInterface\n}\n\nexport default Collapse\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * Constants\n */\n\nconst NAME = 'dropdown'\nconst VERSION = '4.6.2'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\nconst SPACE_KEYCODE = 32 // KeyboardEvent.which value for space key\nconst TAB_KEYCODE = 9 // KeyboardEvent.which value for tab key\nconst ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key\nconst ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key\nconst RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)\n\nconst CLASS_NAME_DISABLED = 'disabled'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPRIGHT = 'dropright'\nconst CLASS_NAME_DROPLEFT = 'dropleft'\nconst CLASS_NAME_MENURIGHT = 'dropdown-menu-right'\nconst CLASS_NAME_POSITION_STATIC = 'position-static'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-toggle=\"dropdown\"]'\nconst SELECTOR_FORM_CHILD = '.dropdown form'\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = 'top-start'\nconst PLACEMENT_TOPEND = 'top-end'\nconst PLACEMENT_BOTTOM = 'bottom-start'\nconst PLACEMENT_BOTTOMEND = 'bottom-end'\nconst PLACEMENT_RIGHT = 'right-start'\nconst PLACEMENT_LEFT = 'left-start'\n\nconst Default = {\n  offset: 0,\n  flip: true,\n  boundary: 'scrollParent',\n  reference: 'toggle',\n  display: 'dynamic',\n  popperConfig: null\n}\n\nconst DefaultType = {\n  offset: '(number|string|function)',\n  flip: 'boolean',\n  boundary: '(string|element)',\n  reference: '(string|element)',\n  display: 'string',\n  popperConfig: '(null|object)'\n}\n\n/**\n * Class definition\n */\n\nclass Dropdown {\n  constructor(element, config) {\n    this._element = element\n    this._popper = null\n    this._config = this._getConfig(config)\n    this._menu = this._getMenuElement()\n    this._inNavbar = this._detectNavbar()\n\n    this._addEventListeners()\n  }\n\n  // Getters\n  static get VERSION() {\n    return VERSION\n  }\n\n  static get Default() {\n    return Default\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  // Public\n  toggle() {\n    if (this._element.disabled || $(this._element).hasClass(CLASS_NAME_DISABLED)) {\n      return\n    }\n\n    const isActive = $(this._menu).hasClass(CLASS_NAME_SHOW)\n\n    Dropdown._clearMenus()\n\n    if (isActive) {\n      return\n    }\n\n    this.show(true)\n  }\n\n  show(usePopper = false) {\n    if (this._element.disabled || $(this._element).hasClass(CLASS_NAME_DISABLED) || $(this._menu).hasClass(CLASS_NAME_SHOW)) {\n      return\n    }\n\n    const relatedTarget = {\n      relatedTarget: this._element\n    }\n    const showEvent = $.Event(EVENT_SHOW, relatedTarget)\n    const parent = Dropdown._getParentFromElement(this._element)\n\n    $(parent).trigger(showEvent)\n\n    if (showEvent.isDefaultPrevented()) {\n      return\n    }\n\n    // Totally disable Popper for Dropdowns in Navbar\n    if (!this._inNavbar && usePopper) {\n      // Check for Popper dependency\n      if (typeof Popper === 'undefined') {\n        throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)')\n      }\n\n      let referenceElement = this._element\n\n      if (this._config.reference === 'parent') {\n        referenceElement = parent\n      } else if (Util.isElement(this._config.reference)) {\n        referenceElement = this._config.reference\n\n        // Check if it's jQuery element\n        if (typeof this._config.reference.jquery !== 'undefined') {\n          referenceElement = this._config.reference[0]\n        }\n      }\n\n      // If boundary is not `scrollParent`, then set position to `static`\n      // to allow the menu to \"escape\" the scroll parent's boundaries\n      // https://github.com/twbs/bootstrap/issues/24251\n      if (this._config.boundary !== 'scrollParent') {\n        $(parent).addClass(CLASS_NAME_POSITION_STATIC)\n      }\n\n      this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig())\n    }\n\n    // If this is a touch-enabled device we add extra\n    // empty mouseover listeners to the body's immediate children;\n    // only needed because of broken event delegation on iOS\n    // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n    if ('ontouchstart' in document.documentElement &&\n        $(parent).closest(SELECTOR_NAVBAR_NAV).length === 0) {\n      $(document.body).children().on('mouseover', null, $.noop)\n    }\n\n    this._element.focus()\n    this._element.setAttribute('aria-expanded', true)\n\n    $(this._menu).toggleClass(CLASS_NAME_SHOW)\n    $(parent)\n      .toggleClass(CLASS_NAME_SHOW)\n      .trigger($.Event(EVENT_SHOWN, relatedTarget))\n  }\n\n  hide() {\n    if (this._element.disabled || $(this._element).hasClass(CLASS_NAME_DISABLED) || !$(this._menu).hasClass(CLASS_NAME_SHOW)) {\n      return\n    }\n\n    const relatedTarget = {\n      relatedTarget: this._element\n    }\n    const hideEvent = $.Event(EVENT_HIDE, relatedTarget)\n    const parent = Dropdown._getParentFromElement(this._element)\n\n    $(parent).trigger(hideEvent)\n\n    if (hideEvent.isDefaultPrevented()) {\n      return\n    }\n\n    if (this._popper) {\n      this._popper.destroy()\n    }\n\n    $(this._menu).toggleClass(CLASS_NAME_SHOW)\n    $(parent)\n      .toggleClass(CLASS_NAME_SHOW)\n      .trigger($.Event(EVENT_HIDDEN, relatedTarget))\n  }\n\n  dispose() {\n    $.removeData(this._element, DATA_KEY)\n    $(this._element).off(EVENT_KEY)\n    this._element = null\n    this._menu = null\n    if (this._popper !== null) {\n      this._popper.destroy()\n      this._popper = null\n    }\n  }\n\n  update() {\n    this._inNavbar = this._detectNavbar()\n    if (this._popper !== null) {\n      this._popper.scheduleUpdate()\n    }\n  }\n\n  // Private\n  _addEventListeners() {\n    $(this._element).on(EVENT_CLICK, event => {\n      event.preventDefault()\n      event.stopPropagation()\n      this.toggle()\n    })\n  }\n\n  _getConfig(config) {\n    config = {\n      ...this.constructor.Default,\n      ...$(this._element).data(),\n      ...config\n    }\n\n    Util.typeCheckConfig(\n      NAME,\n      config,\n      this.constructor.DefaultType\n    )\n\n    return config\n  }\n\n  _getMenuElement() {\n    if (!this._menu) {\n      const parent = Dropdown._getParentFromElement(this._element)\n\n      if (parent) {\n        this._menu = parent.querySelector(SELECTOR_MENU)\n      }\n    }\n\n    return this._menu\n  }\n\n  _getPlacement() {\n    const $parentDropdown = $(this._element.parentNode)\n    let placement = PLACEMENT_BOTTOM\n\n    // Handle dropup\n    if ($parentDropdown.hasClass(CLASS_NAME_DROPUP)) {\n      placement = $(this._menu).hasClass(CLASS_NAME_MENURIGHT) ?\n        PLACEMENT_TOPEND :\n        PLACEMENT_TOP\n    } else if ($parentDropdown.hasClass(CLASS_NAME_DROPRIGHT)) {\n      placement = PLACEMENT_RIGHT\n    } else if ($parentDropdown.hasClass(CLASS_NAME_DROPLEFT)) {\n      placement = PLACEMENT_LEFT\n    } else if ($(this._menu).hasClass(CLASS_NAME_MENURIGHT)) {\n      placement = PLACEMENT_BOTTOMEND\n    }\n\n    return placement\n  }\n\n  _detectNavbar() {\n    return $(this._element).closest('.navbar').length > 0\n  }\n\n  _getOffset() {\n    const offset = {}\n\n    if (typeof this._config.offset === 'function') {\n      offset.fn = data => {\n        data.offsets = {\n          ...data.offsets,\n          ...this._config.offset(data.offsets, this._element)\n        }\n\n        return data\n      }\n    } else {\n      offset.offset = this._config.offset\n    }\n\n    return offset\n  }\n\n  _getPopperConfig() {\n    const popperConfig = {\n      placement: this._getPlacement(),\n      modifiers: {\n        offset: this._getOffset(),\n        flip: {\n          enabled: this._config.flip\n        },\n        preventOverflow: {\n          boundariesElement: this._config.boundary\n        }\n      }\n    }\n\n    // Disable Popper if we have a static display\n    if (this._config.display === 'static') {\n      popperConfig.modifiers.applyStyle = {\n        enabled: false\n      }\n    }\n\n    return {\n      ...popperConfig,\n      ...this._config.popperConfig\n    }\n  }\n\n  // Static\n  static _jQueryInterface(config) {\n    return this.each(function () {\n      let data = $(this).data(DATA_KEY)\n      const _config = typeof config === 'object' ? config : null\n\n      if (!data) {\n        data = new Dropdown(this, _config)\n        $(this).data(DATA_KEY, data)\n      }\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n\n        data[config]()\n      }\n    })\n  }\n\n  static _clearMenus(event) {\n    if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH ||\n      event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n      return\n    }\n\n    const toggles = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE))\n\n    for (let i = 0, len = toggles.length; i < len; i++) {\n      const parent = Dropdown._getParentFromElement(toggles[i])\n      const context = $(toggles[i]).data(DATA_KEY)\n      const relatedTarget = {\n        relatedTarget: toggles[i]\n      }\n\n      if (event && event.type === 'click') {\n        relatedTarget.clickEvent = event\n      }\n\n      if (!context) {\n        continue\n      }\n\n      const dropdownMenu = context._menu\n      if (!$(parent).hasClass(CLASS_NAME_SHOW)) {\n        continue\n      }\n\n      if (event && (event.type === 'click' &&\n          /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) &&\n          $.contains(parent, event.target)) {\n        continue\n      }\n\n      const hideEvent = $.Event(EVENT_HIDE, relatedTarget)\n      $(parent).trigger(hideEvent)\n      if (hideEvent.isDefaultPrevented()) {\n        continue\n      }\n\n      // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n      if ('ontouchstart' in document.documentElement) {\n        $(document.body).children().off('mouseover', null, $.noop)\n      }\n\n      toggles[i].setAttribute('aria-expanded', 'false')\n\n      if (context._popper) {\n        context._popper.destroy()\n      }\n\n      $(dropdownMenu).removeClass(CLASS_NAME_SHOW)\n      $(parent)\n        .removeClass(CLASS_NAME_SHOW)\n        .trigger($.Event(EVENT_HIDDEN, relatedTarget))\n    }\n  }\n\n  static _getParentFromElement(element) {\n    let parent\n    const selector = Util.getSelectorFromElement(element)\n\n    if (selector) {\n      parent = document.querySelector(selector)\n    }\n\n    return parent || element.parentNode\n  }\n\n  // eslint-disable-next-line complexity\n  static _dataApiKeydownHandler(event) {\n    // If not input/textarea:\n    //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\n    // If input/textarea:\n    //  - If space key => not a dropdown command\n    //  - If key is other than escape\n    //    - If key is not up or down => not a dropdown command\n    //    - If trigger inside the menu => not a dropdown command\n    if (/input|textarea/i.test(event.target.tagName) ?\n      event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&\n      (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE ||\n        $(event.target).closest(SELECTOR_MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n      return\n    }\n\n    if (this.disabled || $(this).hasClass(CLASS_NAME_DISABLED)) {\n      return\n    }\n\n    const parent = Dropdown._getParentFromElement(this)\n    const isActive = $(parent).hasClass(CLASS_NAME_SHOW)\n\n    if (!isActive && event.which === ESCAPE_KEYCODE) {\n      return\n    }\n\n    event.preventDefault()\n    event.stopPropagation()\n\n    if (!isActive || (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n      if (event.which === ESCAPE_KEYCODE) {\n        $(parent.querySelector(SELECTOR_DATA_TOGGLE)).trigger('focus')\n      }\n\n      $(this).trigger('click')\n      return\n    }\n\n    const items = [].slice.call(parent.querySelectorAll(SELECTOR_VISIBLE_ITEMS))\n      .filter(item => $(item).is(':visible'))\n\n    if (items.length === 0) {\n      return\n    }\n\n    let index = items.indexOf(event.target)\n\n    if (event.which === ARROW_UP_KEYCODE && index > 0) { // Up\n      index--\n    }\n\n    if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { // Down\n      index++\n    }\n\n    if (index < 0) {\n      index = 0\n    }\n\n    items[index].focus()\n  }\n}\n\n/**\n * Data API implementation\n */\n\n$(document)\n  .on(EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown._dataApiKeydownHandler)\n  .on(EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown._dataApiKeydownHandler)\n  .on(`${EVENT_CLICK_DATA_API} ${EVENT_KEYUP_DATA_API}`, Dropdown._clearMenus)\n  .on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n    event.preventDefault()\n    event.stopPropagation()\n    Dropdown._jQueryInterface.call($(this), 'toggle')\n  })\n  .on(EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, e => {\n    e.stopPropagation()\n  })\n\n/**\n * jQuery\n */\n\n$.fn[NAME] = Dropdown._jQueryInterface\n$.fn[NAME].Constructor = Dropdown\n$.fn[NAME].noConflict = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return Dropdown._jQueryInterface\n}\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * Constants\n */\n\nconst NAME = 'modal'\nconst VERSION = '4.6.2'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\n\nconst CLASS_NAME_SCROLLABLE = 'modal-dialog-scrollable'\nconst CLASS_NAME_SCROLLBAR_MEASURER = 'modal-scrollbar-measure'\nconst CLASS_NAME_BACKDROP = 'modal-backdrop'\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-toggle=\"modal\"]'\nconst SELECTOR_DATA_DISMISS = '[data-dismiss=\"modal\"]'\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\n\nconst Default = {\n  backdrop: true,\n  keyboard: true,\n  focus: true,\n  show: true\n}\n\nconst DefaultType = {\n  backdrop: '(boolean|string)',\n  keyboard: 'boolean',\n  focus: 'boolean',\n  show: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Modal {\n  constructor(element, config) {\n    this._config = this._getConfig(config)\n    this._element = element\n    this._dialog = element.querySelector(SELECTOR_DIALOG)\n    this._backdrop = null\n    this._isShown = false\n    this._isBodyOverflowing = false\n    this._ignoreBackdropClick = false\n    this._isTransitioning = false\n    this._scrollbarWidth = 0\n  }\n\n  // Getters\n  static get VERSION() {\n    return VERSION\n  }\n\n  static get Default() {\n    return Default\n  }\n\n  // Public\n  toggle(relatedTarget) {\n    return this._isShown ? this.hide() : this.show(relatedTarget)\n  }\n\n  show(relatedTarget) {\n    if (this._isShown || this._isTransitioning) {\n      return\n    }\n\n    const showEvent = $.Event(EVENT_SHOW, {\n      relatedTarget\n    })\n\n    $(this._element).trigger(showEvent)\n\n    if (showEvent.isDefaultPrevented()) {\n      return\n    }\n\n    this._isShown = true\n\n    if ($(this._element).hasClass(CLASS_NAME_FADE)) {\n      this._isTransitioning = true\n    }\n\n    this._checkScrollbar()\n    this._setScrollbar()\n\n    this._adjustDialog()\n\n    this._setEscapeEvent()\n    this._setResizeEvent()\n\n    $(this._element).on(\n      EVENT_CLICK_DISMISS,\n      SELECTOR_DATA_DISMISS,\n      event => this.hide(event)\n    )\n\n    $(this._dialog).on(EVENT_MOUSEDOWN_DISMISS, () => {\n      $(this._element).one(EVENT_MOUSEUP_DISMISS, event => {\n        if ($(event.target).is(this._element)) {\n          this._ignoreBackdropClick = true\n        }\n      })\n    })\n\n    this._showBackdrop(() => this._showElement(relatedTarget))\n  }\n\n  hide(event) {\n    if (event) {\n      event.preventDefault()\n    }\n\n    if (!this._isShown || this._isTransitioning) {\n      return\n    }\n\n    const hideEvent = $.Event(EVENT_HIDE)\n\n    $(this._element).trigger(hideEvent)\n\n    if (!this._isShown || hideEvent.isDefaultPrevented()) {\n      return\n    }\n\n    this._isShown = false\n    const transition = $(this._element).hasClass(CLASS_NAME_FADE)\n\n    if (transition) {\n      this._isTransitioning = true\n    }\n\n    this._setEscapeEvent()\n    this._setResizeEvent()\n\n    $(document).off(EVENT_FOCUSIN)\n\n    $(this._element).removeClass(CLASS_NAME_SHOW)\n\n    $(this._element).off(EVENT_CLICK_DISMISS)\n    $(this._dialog).off(EVENT_MOUSEDOWN_DISMISS)\n\n    if (transition) {\n      const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n      $(this._element)\n        .one(Util.TRANSITION_END, event => this._hideModal(event))\n        .emulateTransitionEnd(transitionDuration)\n    } else {\n      this._hideModal()\n    }\n  }\n\n  dispose() {\n    [window, this._element, this._dialog]\n      .forEach(htmlElement => $(htmlElement).off(EVENT_KEY))\n\n    /**\n     * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API`\n     * Do not move `document` in `htmlElements` array\n     * It will remove `EVENT_CLICK_DATA_API` event that should remain\n     */\n    $(document).off(EVENT_FOCUSIN)\n\n    $.removeData(this._element, DATA_KEY)\n\n    this._config = null\n    this._element = null\n    this._dialog = null\n    this._backdrop = null\n    this._isShown = null\n    this._isBodyOverflowing = null\n    this._ignoreBackdropClick = null\n    this._isTransitioning = null\n    this._scrollbarWidth = null\n  }\n\n  handleUpdate() {\n    this._adjustDialog()\n  }\n\n  // Private\n  _getConfig(config) {\n    config = {\n      ...Default,\n      ...config\n    }\n    Util.typeCheckConfig(NAME, config, DefaultType)\n    return config\n  }\n\n  _triggerBackdropTransition() {\n    const hideEventPrevented = $.Event(EVENT_HIDE_PREVENTED)\n\n    $(this._element).trigger(hideEventPrevented)\n    if (hideEventPrevented.isDefaultPrevented()) {\n      return\n    }\n\n    const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n\n    if (!isModalOverflowing) {\n      this._element.style.overflowY = 'hidden'\n    }\n\n    this._element.classList.add(CLASS_NAME_STATIC)\n\n    const modalTransitionDuration = Util.getTransitionDurationFromElement(this._dialog)\n    $(this._element).off(Util.TRANSITION_END)\n\n    $(this._element).one(Util.TRANSITION_END, () => {\n      this._element.classList.remove(CLASS_NAME_STATIC)\n      if (!isModalOverflowing) {\n        $(this._element).one(Util.TRANSITION_END, () => {\n          this._element.style.overflowY = ''\n        })\n          .emulateTransitionEnd(this._element, modalTransitionDuration)\n      }\n    })\n      .emulateTransitionEnd(modalTransitionDuration)\n    this._element.focus()\n  }\n\n  _showElement(relatedTarget) {\n    const transition = $(this._element).hasClass(CLASS_NAME_FADE)\n    const modalBody = this._dialog ? this._dialog.querySelector(SELECTOR_MODAL_BODY) : null\n\n    if (!this._element.parentNode ||\n        this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n      // Don't move modal's DOM position\n      document.body.appendChild(this._element)\n    }\n\n    this._element.style.display = 'block'\n    this._element.removeAttribute('aria-hidden')\n    this._element.setAttribute('aria-modal', true)\n    this._element.setAttribute('role', 'dialog')\n\n    if ($(this._dialog).hasClass(CLASS_NAME_SCROLLABLE) && modalBody) {\n      modalBody.scrollTop = 0\n    } else {\n      this._element.scrollTop = 0\n    }\n\n    if (transition) {\n      Util.reflow(this._element)\n    }\n\n    $(this._element).addClass(CLASS_NAME_SHOW)\n\n    if (this._config.focus) {\n      this._enforceFocus()\n    }\n\n    const shownEvent = $.Event(EVENT_SHOWN, {\n      relatedTarget\n    })\n\n    const transitionComplete = () => {\n      if (this._config.focus) {\n        this._element.focus()\n      }\n\n      this._isTransitioning = false\n      $(this._element).trigger(shownEvent)\n    }\n\n    if (transition) {\n      const transitionDuration = Util.getTransitionDurationFromElement(this._dialog)\n\n      $(this._dialog)\n        .one(Util.TRANSITION_END, transitionComplete)\n        .emulateTransitionEnd(transitionDuration)\n    } else {\n      transitionComplete()\n    }\n  }\n\n  _enforceFocus() {\n    $(document)\n      .off(EVENT_FOCUSIN) // Guard against infinite focus loop\n      .on(EVENT_FOCUSIN, event => {\n        if (document !== event.target &&\n            this._element !== event.target &&\n            $(this._element).has(event.target).length === 0) {\n          this._element.focus()\n        }\n      })\n  }\n\n  _setEscapeEvent() {\n    if (this._isShown) {\n      $(this._element).on(EVENT_KEYDOWN_DISMISS, event => {\n        if (this._config.keyboard && event.which === ESCAPE_KEYCODE) {\n          event.preventDefault()\n          this.hide()\n        } else if (!this._config.keyboard && event.which === ESCAPE_KEYCODE) {\n          this._triggerBackdropTransition()\n        }\n      })\n    } else if (!this._isShown) {\n      $(this._element).off(EVENT_KEYDOWN_DISMISS)\n    }\n  }\n\n  _setResizeEvent() {\n    if (this._isShown) {\n      $(window).on(EVENT_RESIZE, event => this.handleUpdate(event))\n    } else {\n      $(window).off(EVENT_RESIZE)\n    }\n  }\n\n  _hideModal() {\n    this._element.style.display = 'none'\n    this._element.setAttribute('aria-hidden', true)\n    this._element.removeAttribute('aria-modal')\n    this._element.removeAttribute('role')\n    this._isTransitioning = false\n    this._showBackdrop(() => {\n      $(document.body).removeClass(CLASS_NAME_OPEN)\n      this._resetAdjustments()\n      this._resetScrollbar()\n      $(this._element).trigger(EVENT_HIDDEN)\n    })\n  }\n\n  _removeBackdrop() {\n    if (this._backdrop) {\n      $(this._backdrop).remove()\n      this._backdrop = null\n    }\n  }\n\n  _showBackdrop(callback) {\n    const animate = $(this._element).hasClass(CLASS_NAME_FADE) ?\n      CLASS_NAME_FADE : ''\n\n    if (this._isShown && this._config.backdrop) {\n      this._backdrop = document.createElement('div')\n      this._backdrop.className = CLASS_NAME_BACKDROP\n\n      if (animate) {\n        this._backdrop.classList.add(animate)\n      }\n\n      $(this._backdrop).appendTo(document.body)\n\n      $(this._element).on(EVENT_CLICK_DISMISS, event => {\n        if (this._ignoreBackdropClick) {\n          this._ignoreBackdropClick = false\n          return\n        }\n\n        if (event.target !== event.currentTarget) {\n          return\n        }\n\n        if (this._config.backdrop === 'static') {\n          this._triggerBackdropTransition()\n        } else {\n          this.hide()\n        }\n      })\n\n      if (animate) {\n        Util.reflow(this._backdrop)\n      }\n\n      $(this._backdrop).addClass(CLASS_NAME_SHOW)\n\n      if (!callback) {\n        return\n      }\n\n      if (!animate) {\n        callback()\n        return\n      }\n\n      const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n      $(this._backdrop)\n        .one(Util.TRANSITION_END, callback)\n        .emulateTransitionEnd(backdropTransitionDuration)\n    } else if (!this._isShown && this._backdrop) {\n      $(this._backdrop).removeClass(CLASS_NAME_SHOW)\n\n      const callbackRemove = () => {\n        this._removeBackdrop()\n        if (callback) {\n          callback()\n        }\n      }\n\n      if ($(this._element).hasClass(CLASS_NAME_FADE)) {\n        const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n        $(this._backdrop)\n          .one(Util.TRANSITION_END, callbackRemove)\n          .emulateTransitionEnd(backdropTransitionDuration)\n      } else {\n        callbackRemove()\n      }\n    } else if (callback) {\n      callback()\n    }\n  }\n\n  // ----------------------------------------------------------------------\n  // the following methods are used to handle overflowing modals\n  // todo (fat): these should probably be refactored out of modal.js\n  // ----------------------------------------------------------------------\n\n  _adjustDialog() {\n    const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n\n    if (!this._isBodyOverflowing && isModalOverflowing) {\n      this._element.style.paddingLeft = `${this._scrollbarWidth}px`\n    }\n\n    if (this._isBodyOverflowing && !isModalOverflowing) {\n      this._element.style.paddingRight = `${this._scrollbarWidth}px`\n    }\n  }\n\n  _resetAdjustments() {\n    this._element.style.paddingLeft = ''\n    this._element.style.paddingRight = ''\n  }\n\n  _checkScrollbar() {\n    const rect = document.body.getBoundingClientRect()\n    this._isBodyOverflowing = Math.round(rect.left + rect.right) < window.innerWidth\n    this._scrollbarWidth = this._getScrollbarWidth()\n  }\n\n  _setScrollbar() {\n    if (this._isBodyOverflowing) {\n      // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n      //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n      const fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT))\n      const stickyContent = [].slice.call(document.querySelectorAll(SELECTOR_STICKY_CONTENT))\n\n      // Adjust fixed content padding\n      $(fixedContent).each((index, element) => {\n        const actualPadding = element.style.paddingRight\n        const calculatedPadding = $(element).css('padding-right')\n        $(element)\n          .data('padding-right', actualPadding)\n          .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\n      })\n\n      // Adjust sticky content margin\n      $(stickyContent).each((index, element) => {\n        const actualMargin = element.style.marginRight\n        const calculatedMargin = $(element).css('margin-right')\n        $(element)\n          .data('margin-right', actualMargin)\n          .css('margin-right', `${parseFloat(calculatedMargin) - this._scrollbarWidth}px`)\n      })\n\n      // Adjust body padding\n      const actualPadding = document.body.style.paddingRight\n      const calculatedPadding = $(document.body).css('padding-right')\n      $(document.body)\n        .data('padding-right', actualPadding)\n        .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\n    }\n\n    $(document.body).addClass(CLASS_NAME_OPEN)\n  }\n\n  _resetScrollbar() {\n    // Restore fixed content padding\n    const fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT))\n    $(fixedContent).each((index, element) => {\n      const padding = $(element).data('padding-right')\n      $(element).removeData('padding-right')\n      element.style.paddingRight = padding ? padding : ''\n    })\n\n    // Restore sticky content\n    const elements = [].slice.call(document.querySelectorAll(`${SELECTOR_STICKY_CONTENT}`))\n    $(elements).each((index, element) => {\n      const margin = $(element).data('margin-right')\n      if (typeof margin !== 'undefined') {\n        $(element).css('margin-right', margin).removeData('margin-right')\n      }\n    })\n\n    // Restore body padding\n    const padding = $(document.body).data('padding-right')\n    $(document.body).removeData('padding-right')\n    document.body.style.paddingRight = padding ? padding : ''\n  }\n\n  _getScrollbarWidth() { // thx d.walsh\n    const scrollDiv = document.createElement('div')\n    scrollDiv.className = CLASS_NAME_SCROLLBAR_MEASURER\n    document.body.appendChild(scrollDiv)\n    const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth\n    document.body.removeChild(scrollDiv)\n    return scrollbarWidth\n  }\n\n  // Static\n  static _jQueryInterface(config, relatedTarget) {\n    return this.each(function () {\n      let data = $(this).data(DATA_KEY)\n      const _config = {\n        ...Default,\n        ...$(this).data(),\n        ...(typeof config === 'object' && config ? config : {})\n      }\n\n      if (!data) {\n        data = new Modal(this, _config)\n        $(this).data(DATA_KEY, data)\n      }\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n\n        data[config](relatedTarget)\n      } else if (_config.show) {\n        data.show(relatedTarget)\n      }\n    })\n  }\n}\n\n/**\n * Data API implementation\n */\n\n$(document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n  let target\n  const selector = Util.getSelectorFromElement(this)\n\n  if (selector) {\n    target = document.querySelector(selector)\n  }\n\n  const config = $(target).data(DATA_KEY) ?\n    'toggle' : {\n      ...$(target).data(),\n      ...$(this).data()\n    }\n\n  if (this.tagName === 'A' || this.tagName === 'AREA') {\n    event.preventDefault()\n  }\n\n  const $target = $(target).one(EVENT_SHOW, showEvent => {\n    if (showEvent.isDefaultPrevented()) {\n      // Only register focus restorer if modal will actually get shown\n      return\n    }\n\n    $target.one(EVENT_HIDDEN, () => {\n      if ($(this).is(':visible')) {\n        this.focus()\n      }\n    })\n  })\n\n  Modal._jQueryInterface.call($(target), config, this)\n})\n\n/**\n * jQuery\n */\n\n$.fn[NAME] = Modal._jQueryInterface\n$.fn[NAME].Constructor = Modal\n$.fn[NAME].noConflict = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return Modal._jQueryInterface\n}\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2): tools/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttrs = [\n  'background',\n  'cite',\n  'href',\n  'itemtype',\n  'longdesc',\n  'poster',\n  'src',\n  'xlink:href'\n]\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultWhitelist = {\n  // Global attributes allowed on any supplied element below.\n  '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n  a: ['target', 'href', 'title', 'rel'],\n  area: [],\n  b: [],\n  br: [],\n  col: [],\n  code: [],\n  div: [],\n  em: [],\n  hr: [],\n  h1: [],\n  h2: [],\n  h3: [],\n  h4: [],\n  h5: [],\n  h6: [],\n  i: [],\n  img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n  li: [],\n  ol: [],\n  p: [],\n  pre: [],\n  s: [],\n  small: [],\n  span: [],\n  sub: [],\n  sup: [],\n  strong: [],\n  u: [],\n  ul: []\n}\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[\\d+/a-z]+=*$/i\n\nfunction allowedAttribute(attr, allowedAttributeList) {\n  const attrName = attr.nodeName.toLowerCase()\n\n  if (allowedAttributeList.indexOf(attrName) !== -1) {\n    if (uriAttrs.indexOf(attrName) !== -1) {\n      return Boolean(SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue))\n    }\n\n    return true\n  }\n\n  const regExp = allowedAttributeList.filter(attrRegex => attrRegex instanceof RegExp)\n\n  // Check if a regular expression validates the attribute.\n  for (let i = 0, len = regExp.length; i < len; i++) {\n    if (regExp[i].test(attrName)) {\n      return true\n    }\n  }\n\n  return false\n}\n\nexport function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n  if (unsafeHtml.length === 0) {\n    return unsafeHtml\n  }\n\n  if (sanitizeFn && typeof sanitizeFn === 'function') {\n    return sanitizeFn(unsafeHtml)\n  }\n\n  const domParser = new window.DOMParser()\n  const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n  const whitelistKeys = Object.keys(whiteList)\n  const elements = [].slice.call(createdDocument.body.querySelectorAll('*'))\n\n  for (let i = 0, len = elements.length; i < len; i++) {\n    const el = elements[i]\n    const elName = el.nodeName.toLowerCase()\n\n    if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\n      el.parentNode.removeChild(el)\n\n      continue\n    }\n\n    const attributeList = [].slice.call(el.attributes)\n    // eslint-disable-next-line unicorn/prefer-spread\n    const whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])\n\n    attributeList.forEach(attr => {\n      if (!allowedAttribute(attr, whitelistedAttributes)) {\n        el.removeAttribute(attr.nodeName)\n      }\n    })\n  }\n\n  return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { DefaultWhitelist, sanitizeHtml } from './tools/sanitizer'\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * Constants\n */\n\nconst NAME = 'tooltip'\nconst VERSION = '4.6.2'\nconst DATA_KEY = 'bs.tooltip'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-tooltip'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\nconst DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst HOVER_STATE_SHOW = 'show'\nconst HOVER_STATE_OUT = 'out'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_ARROW = '.arrow'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\nconst AttachmentMap = {\n  AUTO: 'auto',\n  TOP: 'top',\n  RIGHT: 'right',\n  BOTTOM: 'bottom',\n  LEFT: 'left'\n}\n\nconst Default = {\n  animation: true,\n  template: '<div class=\"tooltip\" role=\"tooltip\">' +\n                    '<div class=\"arrow\"></div>' +\n                    '<div class=\"tooltip-inner\"></div></div>',\n  trigger: 'hover focus',\n  title: '',\n  delay: 0,\n  html: false,\n  selector: false,\n  placement: 'top',\n  offset: 0,\n  container: false,\n  fallbackPlacement: 'flip',\n  boundary: 'scrollParent',\n  customClass: '',\n  sanitize: true,\n  sanitizeFn: null,\n  whiteList: DefaultWhitelist,\n  popperConfig: null\n}\n\nconst DefaultType = {\n  animation: 'boolean',\n  template: 'string',\n  title: '(string|element|function)',\n  trigger: 'string',\n  delay: '(number|object)',\n  html: 'boolean',\n  selector: '(string|boolean)',\n  placement: '(string|function)',\n  offset: '(number|string|function)',\n  container: '(string|element|boolean)',\n  fallbackPlacement: '(string|array)',\n  boundary: '(string|element)',\n  customClass: '(string|function)',\n  sanitize: 'boolean',\n  sanitizeFn: '(null|function)',\n  whiteList: 'object',\n  popperConfig: '(null|object)'\n}\n\nconst Event = {\n  HIDE: `hide${EVENT_KEY}`,\n  HIDDEN: `hidden${EVENT_KEY}`,\n  SHOW: `show${EVENT_KEY}`,\n  SHOWN: `shown${EVENT_KEY}`,\n  INSERTED: `inserted${EVENT_KEY}`,\n  CLICK: `click${EVENT_KEY}`,\n  FOCUSIN: `focusin${EVENT_KEY}`,\n  FOCUSOUT: `focusout${EVENT_KEY}`,\n  MOUSEENTER: `mouseenter${EVENT_KEY}`,\n  MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\n/**\n * Class definition\n */\n\nclass Tooltip {\n  constructor(element, config) {\n    if (typeof Popper === 'undefined') {\n      throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)')\n    }\n\n    // Private\n    this._isEnabled = true\n    this._timeout = 0\n    this._hoverState = ''\n    this._activeTrigger = {}\n    this._popper = null\n\n    // Protected\n    this.element = element\n    this.config = this._getConfig(config)\n    this.tip = null\n\n    this._setListeners()\n  }\n\n  // Getters\n  static get VERSION() {\n    return VERSION\n  }\n\n  static get Default() {\n    return Default\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  static get DATA_KEY() {\n    return DATA_KEY\n  }\n\n  static get Event() {\n    return Event\n  }\n\n  static get EVENT_KEY() {\n    return EVENT_KEY\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  // Public\n  enable() {\n    this._isEnabled = true\n  }\n\n  disable() {\n    this._isEnabled = false\n  }\n\n  toggleEnabled() {\n    this._isEnabled = !this._isEnabled\n  }\n\n  toggle(event) {\n    if (!this._isEnabled) {\n      return\n    }\n\n    if (event) {\n      const dataKey = this.constructor.DATA_KEY\n      let context = $(event.currentTarget).data(dataKey)\n\n      if (!context) {\n        context = new this.constructor(\n          event.currentTarget,\n          this._getDelegateConfig()\n        )\n        $(event.currentTarget).data(dataKey, context)\n      }\n\n      context._activeTrigger.click = !context._activeTrigger.click\n\n      if (context._isWithActiveTrigger()) {\n        context._enter(null, context)\n      } else {\n        context._leave(null, context)\n      }\n    } else {\n      if ($(this.getTipElement()).hasClass(CLASS_NAME_SHOW)) {\n        this._leave(null, this)\n        return\n      }\n\n      this._enter(null, this)\n    }\n  }\n\n  dispose() {\n    clearTimeout(this._timeout)\n\n    $.removeData(this.element, this.constructor.DATA_KEY)\n\n    $(this.element).off(this.constructor.EVENT_KEY)\n    $(this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler)\n\n    if (this.tip) {\n      $(this.tip).remove()\n    }\n\n    this._isEnabled = null\n    this._timeout = null\n    this._hoverState = null\n    this._activeTrigger = null\n    if (this._popper) {\n      this._popper.destroy()\n    }\n\n    this._popper = null\n    this.element = null\n    this.config = null\n    this.tip = null\n  }\n\n  show() {\n    if ($(this.element).css('display') === 'none') {\n      throw new Error('Please use show on visible elements')\n    }\n\n    const showEvent = $.Event(this.constructor.Event.SHOW)\n    if (this.isWithContent() && this._isEnabled) {\n      $(this.element).trigger(showEvent)\n\n      const shadowRoot = Util.findShadowRoot(this.element)\n      const isInTheDom = $.contains(\n        shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement,\n        this.element\n      )\n\n      if (showEvent.isDefaultPrevented() || !isInTheDom) {\n        return\n      }\n\n      const tip = this.getTipElement()\n      const tipId = Util.getUID(this.constructor.NAME)\n\n      tip.setAttribute('id', tipId)\n      this.element.setAttribute('aria-describedby', tipId)\n\n      this.setContent()\n\n      if (this.config.animation) {\n        $(tip).addClass(CLASS_NAME_FADE)\n      }\n\n      const placement = typeof this.config.placement === 'function' ?\n        this.config.placement.call(this, tip, this.element) :\n        this.config.placement\n\n      const attachment = this._getAttachment(placement)\n      this.addAttachmentClass(attachment)\n\n      const container = this._getContainer()\n      $(tip).data(this.constructor.DATA_KEY, this)\n\n      if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\n        $(tip).appendTo(container)\n      }\n\n      $(this.element).trigger(this.constructor.Event.INSERTED)\n\n      this._popper = new Popper(this.element, tip, this._getPopperConfig(attachment))\n\n      $(tip).addClass(CLASS_NAME_SHOW)\n      $(tip).addClass(this.config.customClass)\n\n      // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n      if ('ontouchstart' in document.documentElement) {\n        $(document.body).children().on('mouseover', null, $.noop)\n      }\n\n      const complete = () => {\n        if (this.config.animation) {\n          this._fixTransition()\n        }\n\n        const prevHoverState = this._hoverState\n        this._hoverState = null\n\n        $(this.element).trigger(this.constructor.Event.SHOWN)\n\n        if (prevHoverState === HOVER_STATE_OUT) {\n          this._leave(null, this)\n        }\n      }\n\n      if ($(this.tip).hasClass(CLASS_NAME_FADE)) {\n        const transitionDuration = Util.getTransitionDurationFromElement(this.tip)\n\n        $(this.tip)\n          .one(Util.TRANSITION_END, complete)\n          .emulateTransitionEnd(transitionDuration)\n      } else {\n        complete()\n      }\n    }\n  }\n\n  hide(callback) {\n    const tip = this.getTipElement()\n    const hideEvent = $.Event(this.constructor.Event.HIDE)\n    const complete = () => {\n      if (this._hoverState !== HOVER_STATE_SHOW && tip.parentNode) {\n        tip.parentNode.removeChild(tip)\n      }\n\n      this._cleanTipClass()\n      this.element.removeAttribute('aria-describedby')\n      $(this.element).trigger(this.constructor.Event.HIDDEN)\n      if (this._popper !== null) {\n        this._popper.destroy()\n      }\n\n      if (callback) {\n        callback()\n      }\n    }\n\n    $(this.element).trigger(hideEvent)\n\n    if (hideEvent.isDefaultPrevented()) {\n      return\n    }\n\n    $(tip).removeClass(CLASS_NAME_SHOW)\n\n    // If this is a touch-enabled device we remove the extra\n    // empty mouseover listeners we added for iOS support\n    if ('ontouchstart' in document.documentElement) {\n      $(document.body).children().off('mouseover', null, $.noop)\n    }\n\n    this._activeTrigger[TRIGGER_CLICK] = false\n    this._activeTrigger[TRIGGER_FOCUS] = false\n    this._activeTrigger[TRIGGER_HOVER] = false\n\n    if ($(this.tip).hasClass(CLASS_NAME_FADE)) {\n      const transitionDuration = Util.getTransitionDurationFromElement(tip)\n\n      $(tip)\n        .one(Util.TRANSITION_END, complete)\n        .emulateTransitionEnd(transitionDuration)\n    } else {\n      complete()\n    }\n\n    this._hoverState = ''\n  }\n\n  update() {\n    if (this._popper !== null) {\n      this._popper.scheduleUpdate()\n    }\n  }\n\n  // Protected\n  isWithContent() {\n    return Boolean(this.getTitle())\n  }\n\n  addAttachmentClass(attachment) {\n    $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n  }\n\n  getTipElement() {\n    this.tip = this.tip || $(this.config.template)[0]\n    return this.tip\n  }\n\n  setContent() {\n    const tip = this.getTipElement()\n    this.setElementContent($(tip.querySelectorAll(SELECTOR_TOOLTIP_INNER)), this.getTitle())\n    $(tip).removeClass(`${CLASS_NAME_FADE} ${CLASS_NAME_SHOW}`)\n  }\n\n  setElementContent($element, content) {\n    if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n      // Content is a DOM node or a jQuery\n      if (this.config.html) {\n        if (!$(content).parent().is($element)) {\n          $element.empty().append(content)\n        }\n      } else {\n        $element.text($(content).text())\n      }\n\n      return\n    }\n\n    if (this.config.html) {\n      if (this.config.sanitize) {\n        content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn)\n      }\n\n      $element.html(content)\n    } else {\n      $element.text(content)\n    }\n  }\n\n  getTitle() {\n    let title = this.element.getAttribute('data-original-title')\n\n    if (!title) {\n      title = typeof this.config.title === 'function' ?\n        this.config.title.call(this.element) :\n        this.config.title\n    }\n\n    return title\n  }\n\n  // Private\n  _getPopperConfig(attachment) {\n    const defaultBsConfig = {\n      placement: attachment,\n      modifiers: {\n        offset: this._getOffset(),\n        flip: {\n          behavior: this.config.fallbackPlacement\n        },\n        arrow: {\n          element: SELECTOR_ARROW\n        },\n        preventOverflow: {\n          boundariesElement: this.config.boundary\n        }\n      },\n      onCreate: data => {\n        if (data.originalPlacement !== data.placement) {\n          this._handlePopperPlacementChange(data)\n        }\n      },\n      onUpdate: data => this._handlePopperPlacementChange(data)\n    }\n\n    return {\n      ...defaultBsConfig,\n      ...this.config.popperConfig\n    }\n  }\n\n  _getOffset() {\n    const offset = {}\n\n    if (typeof this.config.offset === 'function') {\n      offset.fn = data => {\n        data.offsets = {\n          ...data.offsets,\n          ...this.config.offset(data.offsets, this.element)\n        }\n\n        return data\n      }\n    } else {\n      offset.offset = this.config.offset\n    }\n\n    return offset\n  }\n\n  _getContainer() {\n    if (this.config.container === false) {\n      return document.body\n    }\n\n    if (Util.isElement(this.config.container)) {\n      return $(this.config.container)\n    }\n\n    return $(document).find(this.config.container)\n  }\n\n  _getAttachment(placement) {\n    return AttachmentMap[placement.toUpperCase()]\n  }\n\n  _setListeners() {\n    const triggers = this.config.trigger.split(' ')\n\n    triggers.forEach(trigger => {\n      if (trigger === 'click') {\n        $(this.element).on(\n          this.constructor.Event.CLICK,\n          this.config.selector,\n          event => this.toggle(event)\n        )\n      } else if (trigger !== TRIGGER_MANUAL) {\n        const eventIn = trigger === TRIGGER_HOVER ?\n          this.constructor.Event.MOUSEENTER :\n          this.constructor.Event.FOCUSIN\n        const eventOut = trigger === TRIGGER_HOVER ?\n          this.constructor.Event.MOUSELEAVE :\n          this.constructor.Event.FOCUSOUT\n\n        $(this.element)\n          .on(eventIn, this.config.selector, event => this._enter(event))\n          .on(eventOut, this.config.selector, event => this._leave(event))\n      }\n    })\n\n    this._hideModalHandler = () => {\n      if (this.element) {\n        this.hide()\n      }\n    }\n\n    $(this.element).closest('.modal').on('hide.bs.modal', this._hideModalHandler)\n\n    if (this.config.selector) {\n      this.config = {\n        ...this.config,\n        trigger: 'manual',\n        selector: ''\n      }\n    } else {\n      this._fixTitle()\n    }\n  }\n\n  _fixTitle() {\n    const titleType = typeof this.element.getAttribute('data-original-title')\n\n    if (this.element.getAttribute('title') || titleType !== 'string') {\n      this.element.setAttribute(\n        'data-original-title',\n        this.element.getAttribute('title') || ''\n      )\n\n      this.element.setAttribute('title', '')\n    }\n  }\n\n  _enter(event, context) {\n    const dataKey = this.constructor.DATA_KEY\n    context = context || $(event.currentTarget).data(dataKey)\n\n    if (!context) {\n      context = new this.constructor(\n        event.currentTarget,\n        this._getDelegateConfig()\n      )\n      $(event.currentTarget).data(dataKey, context)\n    }\n\n    if (event) {\n      context._activeTrigger[\n        event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER\n      ] = true\n    }\n\n    if ($(context.getTipElement()).hasClass(CLASS_NAME_SHOW) || context._hoverState === HOVER_STATE_SHOW) {\n      context._hoverState = HOVER_STATE_SHOW\n      return\n    }\n\n    clearTimeout(context._timeout)\n\n    context._hoverState = HOVER_STATE_SHOW\n\n    if (!context.config.delay || !context.config.delay.show) {\n      context.show()\n      return\n    }\n\n    context._timeout = setTimeout(() => {\n      if (context._hoverState === HOVER_STATE_SHOW) {\n        context.show()\n      }\n    }, context.config.delay.show)\n  }\n\n  _leave(event, context) {\n    const dataKey = this.constructor.DATA_KEY\n    context = context || $(event.currentTarget).data(dataKey)\n\n    if (!context) {\n      context = new this.constructor(\n        event.currentTarget,\n        this._getDelegateConfig()\n      )\n      $(event.currentTarget).data(dataKey, context)\n    }\n\n    if (event) {\n      context._activeTrigger[\n        event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER\n      ] = false\n    }\n\n    if (context._isWithActiveTrigger()) {\n      return\n    }\n\n    clearTimeout(context._timeout)\n\n    context._hoverState = HOVER_STATE_OUT\n\n    if (!context.config.delay || !context.config.delay.hide) {\n      context.hide()\n      return\n    }\n\n    context._timeout = setTimeout(() => {\n      if (context._hoverState === HOVER_STATE_OUT) {\n        context.hide()\n      }\n    }, context.config.delay.hide)\n  }\n\n  _isWithActiveTrigger() {\n    for (const trigger in this._activeTrigger) {\n      if (this._activeTrigger[trigger]) {\n        return true\n      }\n    }\n\n    return false\n  }\n\n  _getConfig(config) {\n    const dataAttributes = $(this.element).data()\n\n    Object.keys(dataAttributes)\n      .forEach(dataAttr => {\n        if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\n          delete dataAttributes[dataAttr]\n        }\n      })\n\n    config = {\n      ...this.constructor.Default,\n      ...dataAttributes,\n      ...(typeof config === 'object' && config ? config : {})\n    }\n\n    if (typeof config.delay === 'number') {\n      config.delay = {\n        show: config.delay,\n        hide: config.delay\n      }\n    }\n\n    if (typeof config.title === 'number') {\n      config.title = config.title.toString()\n    }\n\n    if (typeof config.content === 'number') {\n      config.content = config.content.toString()\n    }\n\n    Util.typeCheckConfig(\n      NAME,\n      config,\n      this.constructor.DefaultType\n    )\n\n    if (config.sanitize) {\n      config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn)\n    }\n\n    return config\n  }\n\n  _getDelegateConfig() {\n    const config = {}\n\n    if (this.config) {\n      for (const key in this.config) {\n        if (this.constructor.Default[key] !== this.config[key]) {\n          config[key] = this.config[key]\n        }\n      }\n    }\n\n    return config\n  }\n\n  _cleanTipClass() {\n    const $tip = $(this.getTipElement())\n    const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n    if (tabClass !== null && tabClass.length) {\n      $tip.removeClass(tabClass.join(''))\n    }\n  }\n\n  _handlePopperPlacementChange(popperData) {\n    this.tip = popperData.instance.popper\n    this._cleanTipClass()\n    this.addAttachmentClass(this._getAttachment(popperData.placement))\n  }\n\n  _fixTransition() {\n    const tip = this.getTipElement()\n    const initConfigAnimation = this.config.animation\n\n    if (tip.getAttribute('x-placement') !== null) {\n      return\n    }\n\n    $(tip).removeClass(CLASS_NAME_FADE)\n    this.config.animation = false\n    this.hide()\n    this.show()\n    this.config.animation = initConfigAnimation\n  }\n\n  // Static\n  static _jQueryInterface(config) {\n    return this.each(function () {\n      const $element = $(this)\n      let data = $element.data(DATA_KEY)\n      const _config = typeof config === 'object' && config\n\n      if (!data && /dispose|hide/.test(config)) {\n        return\n      }\n\n      if (!data) {\n        data = new Tooltip(this, _config)\n        $element.data(DATA_KEY, data)\n      }\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n\n        data[config]()\n      }\n    })\n  }\n}\n\n/**\n * jQuery\n */\n\n$.fn[NAME] = Tooltip._jQueryInterface\n$.fn[NAME].Constructor = Tooltip\n$.fn[NAME].noConflict = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return Tooltip._jQueryInterface\n}\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Tooltip from './tooltip'\n\n/**\n * Constants\n */\n\nconst NAME = 'popover'\nconst VERSION = '4.6.2'\nconst DATA_KEY = 'bs.popover'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-popover'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\nconst Default = {\n  ...Tooltip.Default,\n  placement: 'right',\n  trigger: 'click',\n  content: '',\n  template: '<div class=\"popover\" role=\"tooltip\">' +\n              '<div class=\"arrow\"></div>' +\n              '<h3 class=\"popover-header\"></h3>' +\n              '<div class=\"popover-body\"></div></div>'\n}\n\nconst DefaultType = {\n  ...Tooltip.DefaultType,\n  content: '(string|element|function)'\n}\n\nconst Event = {\n  HIDE: `hide${EVENT_KEY}`,\n  HIDDEN: `hidden${EVENT_KEY}`,\n  SHOW: `show${EVENT_KEY}`,\n  SHOWN: `shown${EVENT_KEY}`,\n  INSERTED: `inserted${EVENT_KEY}`,\n  CLICK: `click${EVENT_KEY}`,\n  FOCUSIN: `focusin${EVENT_KEY}`,\n  FOCUSOUT: `focusout${EVENT_KEY}`,\n  MOUSEENTER: `mouseenter${EVENT_KEY}`,\n  MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n  // Getters\n  static get VERSION() {\n    return VERSION\n  }\n\n  static get Default() {\n    return Default\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  static get DATA_KEY() {\n    return DATA_KEY\n  }\n\n  static get Event() {\n    return Event\n  }\n\n  static get EVENT_KEY() {\n    return EVENT_KEY\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  // Overrides\n  isWithContent() {\n    return this.getTitle() || this._getContent()\n  }\n\n  addAttachmentClass(attachment) {\n    $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n  }\n\n  getTipElement() {\n    this.tip = this.tip || $(this.config.template)[0]\n    return this.tip\n  }\n\n  setContent() {\n    const $tip = $(this.getTipElement())\n\n    // We use append for html objects to maintain js events\n    this.setElementContent($tip.find(SELECTOR_TITLE), this.getTitle())\n    let content = this._getContent()\n    if (typeof content === 'function') {\n      content = content.call(this.element)\n    }\n\n    this.setElementContent($tip.find(SELECTOR_CONTENT), content)\n\n    $tip.removeClass(`${CLASS_NAME_FADE} ${CLASS_NAME_SHOW}`)\n  }\n\n  // Private\n  _getContent() {\n    return this.element.getAttribute('data-content') ||\n      this.config.content\n  }\n\n  _cleanTipClass() {\n    const $tip = $(this.getTipElement())\n    const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n    if (tabClass !== null && tabClass.length > 0) {\n      $tip.removeClass(tabClass.join(''))\n    }\n  }\n\n  // Static\n  static _jQueryInterface(config) {\n    return this.each(function () {\n      let data = $(this).data(DATA_KEY)\n      const _config = typeof config === 'object' ? config : null\n\n      if (!data && /dispose|hide/.test(config)) {\n        return\n      }\n\n      if (!data) {\n        data = new Popover(this, _config)\n        $(this).data(DATA_KEY, data)\n      }\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n\n        data[config]()\n      }\n    })\n  }\n}\n\n/**\n * jQuery\n */\n\n$.fn[NAME] = Popover._jQueryInterface\n$.fn[NAME].Constructor = Popover\n$.fn[NAME].noConflict = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return Popover._jQueryInterface\n}\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * Constants\n */\n\nconst NAME = 'scrollspy'\nconst VERSION = '4.6.2'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_SCROLL = `scroll${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst METHOD_OFFSET = 'offset'\nconst METHOD_POSITION = 'position'\n\nconst SELECTOR_DATA_SPY = '[data-spy=\"scroll\"]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_ITEMS = '.dropdown-item'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst Default = {\n  offset: 10,\n  method: 'auto',\n  target: ''\n}\n\nconst DefaultType = {\n  offset: 'number',\n  method: 'string',\n  target: '(string|element)'\n}\n\n/**\n * Class definition\n */\n\nclass ScrollSpy {\n  constructor(element, config) {\n    this._element = element\n    this._scrollElement = element.tagName === 'BODY' ? window : element\n    this._config = this._getConfig(config)\n    this._selector = `${this._config.target} ${SELECTOR_NAV_LINKS},` +\n                          `${this._config.target} ${SELECTOR_LIST_ITEMS},` +\n                          `${this._config.target} ${SELECTOR_DROPDOWN_ITEMS}`\n    this._offsets = []\n    this._targets = []\n    this._activeTarget = null\n    this._scrollHeight = 0\n\n    $(this._scrollElement).on(EVENT_SCROLL, event => this._process(event))\n\n    this.refresh()\n    this._process()\n  }\n\n  // Getters\n  static get VERSION() {\n    return VERSION\n  }\n\n  static get Default() {\n    return Default\n  }\n\n  // Public\n  refresh() {\n    const autoMethod = this._scrollElement === this._scrollElement.window ?\n      METHOD_OFFSET : METHOD_POSITION\n\n    const offsetMethod = this._config.method === 'auto' ?\n      autoMethod : this._config.method\n\n    const offsetBase = offsetMethod === METHOD_POSITION ?\n      this._getScrollTop() : 0\n\n    this._offsets = []\n    this._targets = []\n\n    this._scrollHeight = this._getScrollHeight()\n\n    const targets = [].slice.call(document.querySelectorAll(this._selector))\n\n    targets\n      .map(element => {\n        let target\n        const targetSelector = Util.getSelectorFromElement(element)\n\n        if (targetSelector) {\n          target = document.querySelector(targetSelector)\n        }\n\n        if (target) {\n          const targetBCR = target.getBoundingClientRect()\n          if (targetBCR.width || targetBCR.height) {\n            // TODO (fat): remove sketch reliance on jQuery position/offset\n            return [\n              $(target)[offsetMethod]().top + offsetBase,\n              targetSelector\n            ]\n          }\n        }\n\n        return null\n      })\n      .filter(Boolean)\n      .sort((a, b) => a[0] - b[0])\n      .forEach(item => {\n        this._offsets.push(item[0])\n        this._targets.push(item[1])\n      })\n  }\n\n  dispose() {\n    $.removeData(this._element, DATA_KEY)\n    $(this._scrollElement).off(EVENT_KEY)\n\n    this._element = null\n    this._scrollElement = null\n    this._config = null\n    this._selector = null\n    this._offsets = null\n    this._targets = null\n    this._activeTarget = null\n    this._scrollHeight = null\n  }\n\n  // Private\n  _getConfig(config) {\n    config = {\n      ...Default,\n      ...(typeof config === 'object' && config ? config : {})\n    }\n\n    if (typeof config.target !== 'string' && Util.isElement(config.target)) {\n      let id = $(config.target).attr('id')\n      if (!id) {\n        id = Util.getUID(NAME)\n        $(config.target).attr('id', id)\n      }\n\n      config.target = `#${id}`\n    }\n\n    Util.typeCheckConfig(NAME, config, DefaultType)\n\n    return config\n  }\n\n  _getScrollTop() {\n    return this._scrollElement === window ?\n      this._scrollElement.pageYOffset : this._scrollElement.scrollTop\n  }\n\n  _getScrollHeight() {\n    return this._scrollElement.scrollHeight || Math.max(\n      document.body.scrollHeight,\n      document.documentElement.scrollHeight\n    )\n  }\n\n  _getOffsetHeight() {\n    return this._scrollElement === window ?\n      window.innerHeight : this._scrollElement.getBoundingClientRect().height\n  }\n\n  _process() {\n    const scrollTop = this._getScrollTop() + this._config.offset\n    const scrollHeight = this._getScrollHeight()\n    const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight()\n\n    if (this._scrollHeight !== scrollHeight) {\n      this.refresh()\n    }\n\n    if (scrollTop >= maxScroll) {\n      const target = this._targets[this._targets.length - 1]\n\n      if (this._activeTarget !== target) {\n        this._activate(target)\n      }\n\n      return\n    }\n\n    if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n      this._activeTarget = null\n      this._clear()\n      return\n    }\n\n    for (let i = this._offsets.length; i--;) {\n      const isActiveTarget = this._activeTarget !== this._targets[i] &&\n          scrollTop >= this._offsets[i] &&\n          (typeof this._offsets[i + 1] === 'undefined' ||\n              scrollTop < this._offsets[i + 1])\n\n      if (isActiveTarget) {\n        this._activate(this._targets[i])\n      }\n    }\n  }\n\n  _activate(target) {\n    this._activeTarget = target\n\n    this._clear()\n\n    const queries = this._selector\n      .split(',')\n      .map(selector => `${selector}[data-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n    const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))\n\n    if ($link.hasClass(CLASS_NAME_DROPDOWN_ITEM)) {\n      $link.closest(SELECTOR_DROPDOWN)\n        .find(SELECTOR_DROPDOWN_TOGGLE)\n        .addClass(CLASS_NAME_ACTIVE)\n      $link.addClass(CLASS_NAME_ACTIVE)\n    } else {\n      // Set triggered link as active\n      $link.addClass(CLASS_NAME_ACTIVE)\n      // Set triggered links parents as active\n      // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n      $link.parents(SELECTOR_NAV_LIST_GROUP)\n        .prev(`${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`)\n        .addClass(CLASS_NAME_ACTIVE)\n      // Handle special case when .nav-link is inside .nav-item\n      $link.parents(SELECTOR_NAV_LIST_GROUP)\n        .prev(SELECTOR_NAV_ITEMS)\n        .children(SELECTOR_NAV_LINKS)\n        .addClass(CLASS_NAME_ACTIVE)\n    }\n\n    $(this._scrollElement).trigger(EVENT_ACTIVATE, {\n      relatedTarget: target\n    })\n  }\n\n  _clear() {\n    [].slice.call(document.querySelectorAll(this._selector))\n      .filter(node => node.classList.contains(CLASS_NAME_ACTIVE))\n      .forEach(node => node.classList.remove(CLASS_NAME_ACTIVE))\n  }\n\n  // Static\n  static _jQueryInterface(config) {\n    return this.each(function () {\n      let data = $(this).data(DATA_KEY)\n      const _config = typeof config === 'object' && config\n\n      if (!data) {\n        data = new ScrollSpy(this, _config)\n        $(this).data(DATA_KEY, data)\n      }\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n\n        data[config]()\n      }\n    })\n  }\n}\n\n/**\n * Data API implementation\n */\n\n$(window).on(EVENT_LOAD_DATA_API, () => {\n  const scrollSpys = [].slice.call(document.querySelectorAll(SELECTOR_DATA_SPY))\n  const scrollSpysLength = scrollSpys.length\n\n  for (let i = scrollSpysLength; i--;) {\n    const $spy = $(scrollSpys[i])\n    ScrollSpy._jQueryInterface.call($spy, $spy.data())\n  }\n})\n\n/**\n * jQuery\n */\n\n$.fn[NAME] = ScrollSpy._jQueryInterface\n$.fn[NAME].Constructor = ScrollSpy\n$.fn[NAME].noConflict = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return ScrollSpy._jQueryInterface\n}\n\nexport default ScrollSpy\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2): tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * Constants\n */\n\nconst NAME = 'tab'\nconst VERSION = '4.6.2'\nconst DATA_KEY = 'bs.tab'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_DISABLED = 'disabled'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ACTIVE_UL = '> li > .active'\nconst SELECTOR_DATA_TOGGLE = '[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\nconst SELECTOR_DROPDOWN_ACTIVE_CHILD = '> .dropdown-menu .active'\n\n/**\n * Class definition\n */\n\nclass Tab {\n  constructor(element) {\n    this._element = element\n  }\n\n  // Getters\n  static get VERSION() {\n    return VERSION\n  }\n\n  // Public\n  show() {\n    if (this._element.parentNode &&\n        this._element.parentNode.nodeType === Node.ELEMENT_NODE &&\n        $(this._element).hasClass(CLASS_NAME_ACTIVE) ||\n        $(this._element).hasClass(CLASS_NAME_DISABLED) ||\n        this._element.hasAttribute('disabled')) {\n      return\n    }\n\n    let target\n    let previous\n    const listElement = $(this._element).closest(SELECTOR_NAV_LIST_GROUP)[0]\n    const selector = Util.getSelectorFromElement(this._element)\n\n    if (listElement) {\n      const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE\n      previous = $.makeArray($(listElement).find(itemSelector))\n      previous = previous[previous.length - 1]\n    }\n\n    const hideEvent = $.Event(EVENT_HIDE, {\n      relatedTarget: this._element\n    })\n\n    const showEvent = $.Event(EVENT_SHOW, {\n      relatedTarget: previous\n    })\n\n    if (previous) {\n      $(previous).trigger(hideEvent)\n    }\n\n    $(this._element).trigger(showEvent)\n\n    if (showEvent.isDefaultPrevented() ||\n        hideEvent.isDefaultPrevented()) {\n      return\n    }\n\n    if (selector) {\n      target = document.querySelector(selector)\n    }\n\n    this._activate(\n      this._element,\n      listElement\n    )\n\n    const complete = () => {\n      const hiddenEvent = $.Event(EVENT_HIDDEN, {\n        relatedTarget: this._element\n      })\n\n      const shownEvent = $.Event(EVENT_SHOWN, {\n        relatedTarget: previous\n      })\n\n      $(previous).trigger(hiddenEvent)\n      $(this._element).trigger(shownEvent)\n    }\n\n    if (target) {\n      this._activate(target, target.parentNode, complete)\n    } else {\n      complete()\n    }\n  }\n\n  dispose() {\n    $.removeData(this._element, DATA_KEY)\n    this._element = null\n  }\n\n  // Private\n  _activate(element, container, callback) {\n    const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ?\n      $(container).find(SELECTOR_ACTIVE_UL) :\n      $(container).children(SELECTOR_ACTIVE)\n\n    const active = activeElements[0]\n    const isTransitioning = callback && (active && $(active).hasClass(CLASS_NAME_FADE))\n    const complete = () => this._transitionComplete(\n      element,\n      active,\n      callback\n    )\n\n    if (active && isTransitioning) {\n      const transitionDuration = Util.getTransitionDurationFromElement(active)\n\n      $(active)\n        .removeClass(CLASS_NAME_SHOW)\n        .one(Util.TRANSITION_END, complete)\n        .emulateTransitionEnd(transitionDuration)\n    } else {\n      complete()\n    }\n  }\n\n  _transitionComplete(element, active, callback) {\n    if (active) {\n      $(active).removeClass(CLASS_NAME_ACTIVE)\n\n      const dropdownChild = $(active.parentNode).find(\n        SELECTOR_DROPDOWN_ACTIVE_CHILD\n      )[0]\n\n      if (dropdownChild) {\n        $(dropdownChild).removeClass(CLASS_NAME_ACTIVE)\n      }\n\n      if (active.getAttribute('role') === 'tab') {\n        active.setAttribute('aria-selected', false)\n      }\n    }\n\n    $(element).addClass(CLASS_NAME_ACTIVE)\n    if (element.getAttribute('role') === 'tab') {\n      element.setAttribute('aria-selected', true)\n    }\n\n    Util.reflow(element)\n\n    if (element.classList.contains(CLASS_NAME_FADE)) {\n      element.classList.add(CLASS_NAME_SHOW)\n    }\n\n    let parent = element.parentNode\n    if (parent && parent.nodeName === 'LI') {\n      parent = parent.parentNode\n    }\n\n    if (parent && $(parent).hasClass(CLASS_NAME_DROPDOWN_MENU)) {\n      const dropdownElement = $(element).closest(SELECTOR_DROPDOWN)[0]\n\n      if (dropdownElement) {\n        const dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(SELECTOR_DROPDOWN_TOGGLE))\n\n        $(dropdownToggleList).addClass(CLASS_NAME_ACTIVE)\n      }\n\n      element.setAttribute('aria-expanded', true)\n    }\n\n    if (callback) {\n      callback()\n    }\n  }\n\n  // Static\n  static _jQueryInterface(config) {\n    return this.each(function () {\n      const $this = $(this)\n      let data = $this.data(DATA_KEY)\n\n      if (!data) {\n        data = new Tab(this)\n        $this.data(DATA_KEY, data)\n      }\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n\n        data[config]()\n      }\n    })\n  }\n}\n\n/**\n * Data API implementation\n */\n\n$(document)\n  .on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n    event.preventDefault()\n    Tab._jQueryInterface.call($(this), 'show')\n  })\n\n/**\n * jQuery\n */\n\n$.fn[NAME] = Tab._jQueryInterface\n$.fn[NAME].Constructor = Tab\n$.fn[NAME].noConflict = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return Tab._jQueryInterface\n}\n\nexport default Tab\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2): toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * Constants\n */\n\nconst NAME = 'toast'\nconst VERSION = '4.6.2'\nconst DATA_KEY = 'bs.toast'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_HIDE = 'hide'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\n\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\n\nconst SELECTOR_DATA_DISMISS = '[data-dismiss=\"toast\"]'\n\nconst Default = {\n  animation: true,\n  autohide: true,\n  delay: 500\n}\n\nconst DefaultType = {\n  animation: 'boolean',\n  autohide: 'boolean',\n  delay: 'number'\n}\n\n/**\n * Class definition\n */\n\nclass Toast {\n  constructor(element, config) {\n    this._element = element\n    this._config = this._getConfig(config)\n    this._timeout = null\n    this._setListeners()\n  }\n\n  // Getters\n  static get VERSION() {\n    return VERSION\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  static get Default() {\n    return Default\n  }\n\n  // Public\n  show() {\n    const showEvent = $.Event(EVENT_SHOW)\n\n    $(this._element).trigger(showEvent)\n    if (showEvent.isDefaultPrevented()) {\n      return\n    }\n\n    this._clearTimeout()\n\n    if (this._config.animation) {\n      this._element.classList.add(CLASS_NAME_FADE)\n    }\n\n    const complete = () => {\n      this._element.classList.remove(CLASS_NAME_SHOWING)\n      this._element.classList.add(CLASS_NAME_SHOW)\n\n      $(this._element).trigger(EVENT_SHOWN)\n\n      if (this._config.autohide) {\n        this._timeout = setTimeout(() => {\n          this.hide()\n        }, this._config.delay)\n      }\n    }\n\n    this._element.classList.remove(CLASS_NAME_HIDE)\n    Util.reflow(this._element)\n    this._element.classList.add(CLASS_NAME_SHOWING)\n    if (this._config.animation) {\n      const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n      $(this._element)\n        .one(Util.TRANSITION_END, complete)\n        .emulateTransitionEnd(transitionDuration)\n    } else {\n      complete()\n    }\n  }\n\n  hide() {\n    if (!this._element.classList.contains(CLASS_NAME_SHOW)) {\n      return\n    }\n\n    const hideEvent = $.Event(EVENT_HIDE)\n\n    $(this._element).trigger(hideEvent)\n    if (hideEvent.isDefaultPrevented()) {\n      return\n    }\n\n    this._close()\n  }\n\n  dispose() {\n    this._clearTimeout()\n\n    if (this._element.classList.contains(CLASS_NAME_SHOW)) {\n      this._element.classList.remove(CLASS_NAME_SHOW)\n    }\n\n    $(this._element).off(EVENT_CLICK_DISMISS)\n\n    $.removeData(this._element, DATA_KEY)\n    this._element = null\n    this._config = null\n  }\n\n  // Private\n  _getConfig(config) {\n    config = {\n      ...Default,\n      ...$(this._element).data(),\n      ...(typeof config === 'object' && config ? config : {})\n    }\n\n    Util.typeCheckConfig(\n      NAME,\n      config,\n      this.constructor.DefaultType\n    )\n\n    return config\n  }\n\n  _setListeners() {\n    $(this._element).on(EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, () => this.hide())\n  }\n\n  _close() {\n    const complete = () => {\n      this._element.classList.add(CLASS_NAME_HIDE)\n      $(this._element).trigger(EVENT_HIDDEN)\n    }\n\n    this._element.classList.remove(CLASS_NAME_SHOW)\n    if (this._config.animation) {\n      const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n      $(this._element)\n        .one(Util.TRANSITION_END, complete)\n        .emulateTransitionEnd(transitionDuration)\n    } else {\n      complete()\n    }\n  }\n\n  _clearTimeout() {\n    clearTimeout(this._timeout)\n    this._timeout = null\n  }\n\n  // Static\n  static _jQueryInterface(config) {\n    return this.each(function () {\n      const $element = $(this)\n      let data = $element.data(DATA_KEY)\n      const _config = typeof config === 'object' && config\n\n      if (!data) {\n        data = new Toast(this, _config)\n        $element.data(DATA_KEY, data)\n      }\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n\n        data[config](this)\n      }\n    })\n  }\n}\n\n/**\n * jQuery\n */\n\n$.fn[NAME] = Toast._jQueryInterface\n$.fn[NAME].Constructor = Toast\n$.fn[NAME].noConflict = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return Toast._jQueryInterface\n}\n\nexport default Toast\n","/*! alertifyjs - v1.13.1 - Mohammad Younes <Mohammad@alertifyjs.com> (http://alertifyjs.com) */\n!function(a){\"use strict\";function b(a,b){a.className+=\" \"+b}function c(a,b){for(var c=a.className.split(\" \"),d=b.split(\" \"),e=0;e<d.length;e+=1){var f=c.indexOf(d[e]);f>-1&&c.splice(f,1)}a.className=c.join(\" \")}function d(){return\"rtl\"===a.getComputedStyle(document.body).direction}function e(){return document.documentElement&&document.documentElement.scrollTop||document.body.scrollTop}function f(){return document.documentElement&&document.documentElement.scrollLeft||document.body.scrollLeft}function g(a){for(;a.lastChild;)a.removeChild(a.lastChild)}function h(a){if(null===a)return a;var b;if(Array.isArray(a)){b=[];for(var c=0;c<a.length;c+=1)b.push(h(a[c]));return b}if(a instanceof Date)return new Date(a.getTime());if(a instanceof RegExp)return b=new RegExp(a.source),b.global=a.global,b.ignoreCase=a.ignoreCase,b.multiline=a.multiline,b.lastIndex=a.lastIndex,b;if(\"object\"==typeof a){b={};for(var d in a)a.hasOwnProperty(d)&&(b[d]=h(a[d]));return b}return a}function i(a,b){if(a.elements){var c=a.elements.root;c.parentNode.removeChild(c),delete a.elements,a.settings=h(a.__settings),a.__init=b,delete a.__internal}}function j(a,b){return function(){if(arguments.length>0){for(var c=[],d=0;d<arguments.length;d+=1)c.push(arguments[d]);return c.push(a),b.apply(a,c)}return b.apply(a,[null,a])}}function k(a,b){return{index:a,button:b,cancel:!1}}function l(a,b){if(\"function\"==typeof b.get(a))return b.get(a).call(b)}function m(){function a(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a}function b(a){var b=d[a].dialog;return b&&\"function\"==typeof b.__init&&b.__init(b),b}function c(b,c,e,f){var g={dialog:null,factory:c};return void 0!==f&&(g.factory=function(){return a(new d[f].factory,new c)}),e||(g.dialog=a(new g.factory,w)),d[b]=g}var d={};return{defaults:p,dialog:function(d,e,f,g){if(\"function\"!=typeof e)return b(d);if(this.hasOwnProperty(d))throw new Error(\"alertify.dialog: name already exists\");var h=c(d,e,f,g);this[d]=f?function(){if(0===arguments.length)return h.dialog;var b=a(new h.factory,w);return b&&\"function\"==typeof b.__init&&b.__init(b),b.main.apply(b,arguments),b.show.apply(b)}:function(){if(h.dialog&&\"function\"==typeof h.dialog.__init&&h.dialog.__init(h.dialog),0===arguments.length)return h.dialog;var a=h.dialog;return a.main.apply(h.dialog,arguments),a.show.apply(h.dialog)}},closeAll:function(a){for(var b=q.slice(0),c=0;c<b.length;c+=1){var d=b[c];void 0!==a&&a===d||d.close()}},setting:function(a,c,d){if(\"notifier\"===a)return x.setting(c,d);var e=b(a);return e?e.setting(c,d):void 0},set:function(a,b,c){return this.setting(a,b,c)},get:function(a,b){return this.setting(a,b)},notify:function(a,b,c,d){return x.create(b,d).push(a,c)},message:function(a,b,c){return x.create(null,c).push(a,b)},success:function(a,b,c){return x.create(\"success\",c).push(a,b)},error:function(a,b,c){return x.create(\"error\",c).push(a,b)},warning:function(a,b,c){return x.create(\"warning\",c).push(a,b)},dismissAll:function(){x.dismissAll()}}}var n=\":not(:disabled):not(.ajs-reset)\",o={ENTER:13,ESC:27,F1:112,F12:123,LEFT:37,RIGHT:39,TAB:9},p={autoReset:!0,basic:!1,closable:!0,closableByDimmer:!0,invokeOnCloseOff:!1,frameless:!1,defaultFocusOff:!1,maintainFocus:!0,maximizable:!0,modal:!0,movable:!0,moveBounded:!1,overflow:!0,padding:!0,pinnable:!0,pinned:!0,preventBodyShift:!1,resizable:!0,startMaximized:!1,transition:\"pulse\",transitionOff:!1,tabbable:[\"button\",\"[href]\",\"input\",\"select\",\"textarea\",'[tabindex]:not([tabindex^=\"-\"])'+n].join(n+\",\"),notifier:{delay:5,position:\"bottom-right\",closeButton:!1,classes:{base:\"alertify-notifier\",prefix:\"ajs-\",message:\"ajs-message\",top:\"ajs-top\",right:\"ajs-right\",bottom:\"ajs-bottom\",left:\"ajs-left\",center:\"ajs-center\",visible:\"ajs-visible\",hidden:\"ajs-hidden\",close:\"ajs-close\"}},glossary:{title:\"AlertifyJS\",ok:\"OK\",cancel:\"Cancel\",acccpt:\"Accept\",deny:\"Deny\",confirm:\"Confirm\",decline:\"Decline\",close:\"Close\",maximize:\"Maximize\",restore:\"Restore\"},theme:{input:\"ajs-input\",ok:\"ajs-ok\",cancel:\"ajs-cancel\"},hooks:{preinit:function(){},postinit:function(){}}},q=[],r=!1;try{var s=Object.defineProperty({},\"passive\",{get:function(){r=!0}});a.addEventListener(\"test\",s,s),a.removeEventListener(\"test\",s,s)}catch(z){}var t=function(a,b,c,d,e){a.addEventListener(b,c,r?{capture:d,passive:e}:!0===d)},u=function(a,b,c,d,e){a.removeEventListener(b,c,r?{capture:d,passive:e}:!0===d)},v=function(){var a,b,c=!1,d={animation:\"animationend\",OAnimation:\"oAnimationEnd oanimationend\",msAnimation:\"MSAnimationEnd\",MozAnimation:\"animationend\",WebkitAnimation:\"webkitAnimationEnd\"};for(a in d)if(void 0!==document.documentElement.style[a]){b=d[a],c=!0;break}return{type:b,supported:c}}(),w=function(){function m(a){if(!a.__internal){y.defaults.hooks.preinit(a),delete a.__init,a.__settings||(a.__settings=h(a.settings));var c;\"function\"==typeof a.setup?(c=a.setup(),c.options=c.options||{},c.focus=c.focus||{}):c={buttons:[],focus:{element:null,select:!1},options:{}},\"object\"!=typeof a.hooks&&(a.hooks={});var d=[];if(Array.isArray(c.buttons))for(var e=0;e<c.buttons.length;e+=1){var f=c.buttons[e],g={};for(var i in f)f.hasOwnProperty(i)&&(g[i]=f[i]);d.push(g)}var k=a.__internal={isOpen:!1,activeElement:document.body,timerIn:void 0,timerOut:void 0,buttons:d,focus:c.focus,options:{title:void 0,modal:void 0,basic:void 0,frameless:void 0,defaultFocusOff:void 0,pinned:void 0,movable:void 0,moveBounded:void 0,resizable:void 0,autoReset:void 0,closable:void 0,closableByDimmer:void 0,invokeOnCloseOff:void 0,maximizable:void 0,startMaximized:void 0,pinnable:void 0,transition:void 0,transitionOff:void 0,padding:void 0,overflow:void 0,onshow:void 0,onclosing:void 0,onclose:void 0,onfocus:void 0,onmove:void 0,onmoved:void 0,onresize:void 0,onresized:void 0,onmaximize:void 0,onmaximized:void 0,onrestore:void 0,onrestored:void 0},resetHandler:void 0,beginMoveHandler:void 0,beginResizeHandler:void 0,bringToFrontHandler:void 0,modalClickHandler:void 0,buttonsClickHandler:void 0,commandsClickHandler:void 0,transitionInHandler:void 0,transitionOutHandler:void 0,destroy:void 0},l={};l.root=document.createElement(\"div\"),l.root.style.display=\"none\",l.root.className=Ha.base+\" \"+Ha.hidden+\" \",l.root.innerHTML=Ga.dimmer+Ga.modal,l.dimmer=l.root.firstChild,l.modal=l.root.lastChild,l.modal.innerHTML=Ga.dialog,l.dialog=l.modal.firstChild,l.dialog.innerHTML=Ga.reset+Ga.commands+Ga.header+Ga.body+Ga.footer+Ga.resizeHandle+Ga.reset,l.reset=[],l.reset.push(l.dialog.firstChild),l.reset.push(l.dialog.lastChild),l.commands={},l.commands.container=l.reset[0].nextSibling,l.commands.pin=l.commands.container.firstChild,l.commands.maximize=l.commands.pin.nextSibling,l.commands.close=l.commands.maximize.nextSibling,l.header=l.commands.container.nextSibling,l.body=l.header.nextSibling,l.body.innerHTML=Ga.content,l.content=l.body.firstChild,l.footer=l.body.nextSibling,l.footer.innerHTML=Ga.buttons.auxiliary+Ga.buttons.primary,l.resizeHandle=l.footer.nextSibling,l.buttons={},l.buttons.auxiliary=l.footer.firstChild,l.buttons.primary=l.buttons.auxiliary.nextSibling,l.buttons.primary.innerHTML=Ga.button,l.buttonTemplate=l.buttons.primary.firstChild,l.buttons.primary.removeChild(l.buttonTemplate);for(var m=0;m<a.__internal.buttons.length;m+=1){var n=a.__internal.buttons[m];Ca.indexOf(n.key)<0&&Ca.push(n.key),n.element=l.buttonTemplate.cloneNode(),n.element.innerHTML=n.text,\"string\"==typeof n.className&&\"\"!==n.className&&b(n.element,n.className);for(var o in n.attrs)\"className\"!==o&&n.attrs.hasOwnProperty(o)&&n.element.setAttribute(o,n.attrs[o]);\"auxiliary\"===n.scope?l.buttons.auxiliary.appendChild(n.element):l.buttons.primary.appendChild(n.element)}a.elements=l,k.resetHandler=j(a,Z),k.beginMoveHandler=j(a,ea),k.beginResizeHandler=j(a,ka),k.bringToFrontHandler=j(a,D),k.modalClickHandler=j(a,T),k.buttonsClickHandler=j(a,V),k.commandsClickHandler=j(a,H),k.transitionInHandler=j(a,aa),k.transitionOutHandler=j(a,ba);for(var p in k.options)void 0!==c.options[p]?a.set(p,c.options[p]):y.defaults.hasOwnProperty(p)?a.set(p,y.defaults[p]):\"title\"===p&&a.set(p,y.defaults.glossary[p]);\"function\"==typeof a.build&&a.build(),y.defaults.hooks.postinit(a)}document.body.appendChild(a.elements.root)}function n(){Aa=f(),Ba=e()}function r(){a.scrollTo(Aa,Ba)}function s(){for(var a=0,d=0;d<q.length;d+=1){var e=q[d];(e.isModal()||e.isMaximized())&&(a+=1)}0===a&&document.body.className.indexOf(Ha.noOverflow)>=0?(c(document.body,Ha.noOverflow),w(!1)):a>0&&document.body.className.indexOf(Ha.noOverflow)<0&&(w(!0),b(document.body,Ha.noOverflow))}function w(d){y.defaults.preventBodyShift&&(d&&document.documentElement.scrollHeight>document.documentElement.clientHeight?(Ja=Ba,Ia=a.getComputedStyle(document.body).top,b(document.body,Ha.fixed),document.body.style.top=-Ba+\"px\"):d||(Ba=Ja,document.body.style.top=Ia,c(document.body,Ha.fixed),r()))}function x(a,d,e){\"string\"==typeof e&&c(a.elements.root,Ha.prefix+e),b(a.elements.root,Ha.prefix+d),Da=a.elements.root.offsetWidth}function z(a){a.get(\"transitionOff\")?b(a.elements.root,Ha.noTransition):c(a.elements.root,Ha.noTransition)}function A(a){a.get(\"modal\")?(c(a.elements.root,Ha.modeless),a.isOpen()&&(ta(a),P(a),s())):(b(a.elements.root,Ha.modeless),a.isOpen()&&(sa(a),P(a),s()))}function B(a){a.get(\"basic\")?b(a.elements.root,Ha.basic):c(a.elements.root,Ha.basic)}function C(a){a.get(\"frameless\")?b(a.elements.root,Ha.frameless):c(a.elements.root,Ha.frameless)}function D(a,b){for(var c=q.indexOf(b),d=c+1;d<q.length;d+=1)if(q[d].isModal())return;return document.body.lastChild!==b.elements.root&&(document.body.appendChild(b.elements.root),q.splice(q.indexOf(b),1),q.push(b),Y(b)),!1}function E(a,d,e,f){switch(d){case\"title\":a.setHeader(f);break;case\"modal\":A(a);break;case\"basic\":B(a);break;case\"frameless\":C(a);break;case\"pinned\":Q(a);break;case\"closable\":S(a);break;case\"maximizable\":R(a);break;case\"pinnable\":M(a);break;case\"movable\":ia(a);break;case\"resizable\":oa(a);break;case\"padding\":f?c(a.elements.root,Ha.noPadding):a.elements.root.className.indexOf(Ha.noPadding)<0&&b(a.elements.root,Ha.noPadding);break;case\"overflow\":f?c(a.elements.root,Ha.noOverflow):a.elements.root.className.indexOf(Ha.noOverflow)<0&&b(a.elements.root,Ha.noOverflow);break;case\"transition\":x(a,f,e);break;case\"transitionOff\":z(a)}\"function\"==typeof a.hooks.onupdate&&a.hooks.onupdate.call(a,d,e,f)}function F(a,b,c,d,e){var f={op:void 0,items:[]};if(void 0===e&&\"string\"==typeof d)f.op=\"get\",b.hasOwnProperty(d)?(f.found=!0,f.value=b[d]):(f.found=!1,f.value=void 0);else{var g;if(f.op=\"set\",\"object\"==typeof d){var h=d;for(var i in h)b.hasOwnProperty(i)?(b[i]!==h[i]&&(g=b[i],b[i]=h[i],c.call(a,i,g,h[i])),f.items.push({key:i,value:h[i],found:!0})):f.items.push({key:i,value:h[i],found:!1})}else{if(\"string\"!=typeof d)throw new Error(\"args must be a string or object\");b.hasOwnProperty(d)?(b[d]!==e&&(g=b[d],b[d]=e,c.call(a,d,g,e)),f.items.push({key:d,value:e,found:!0})):f.items.push({key:d,value:e,found:!1})}}return f}function G(a){var b;U(a,function(c){return b=!0!==a.get(\"invokeOnCloseOff\")&&!0===c.invokeOnClose}),!b&&a.isOpen()&&a.close()}function H(a,b){switch(a.srcElement||a.target){case b.elements.commands.pin:b.isPinned()?J(b):I(b);break;case b.elements.commands.maximize:b.isMaximized()?L(b):K(b);break;case b.elements.commands.close:G(b)}return!1}function I(a){a.set(\"pinned\",!0)}function J(a){a.set(\"pinned\",!1)}function K(a){l(\"onmaximize\",a),b(a.elements.root,Ha.maximized),a.isOpen()&&s(),l(\"onmaximized\",a)}function L(a){l(\"onrestore\",a),c(a.elements.root,Ha.maximized),a.isOpen()&&s(),l(\"onrestored\",a)}function M(a){a.get(\"pinnable\")?b(a.elements.root,Ha.pinnable):c(a.elements.root,Ha.pinnable)}function N(a){var b=f();a.elements.modal.style.marginTop=e()+\"px\",a.elements.modal.style.marginLeft=b+\"px\",a.elements.modal.style.marginRight=-b+\"px\"}function O(a){var b=parseInt(a.elements.modal.style.marginTop,10),c=parseInt(a.elements.modal.style.marginLeft,10);if(a.elements.modal.style.marginTop=\"\",a.elements.modal.style.marginLeft=\"\",a.elements.modal.style.marginRight=\"\",a.isOpen()){var d=0,g=0;\"\"!==a.elements.dialog.style.top&&(d=parseInt(a.elements.dialog.style.top,10)),a.elements.dialog.style.top=d+(b-e())+\"px\",\"\"!==a.elements.dialog.style.left&&(g=parseInt(a.elements.dialog.style.left,10)),a.elements.dialog.style.left=g+(c-f())+\"px\"}}function P(a){a.get(\"modal\")||a.get(\"pinned\")?O(a):N(a)}function Q(a){a.get(\"pinned\")?(c(a.elements.root,Ha.unpinned),a.isOpen()&&O(a)):(b(a.elements.root,Ha.unpinned),a.isOpen()&&!a.isModal()&&N(a))}function R(a){a.get(\"maximizable\")?b(a.elements.root,Ha.maximizable):c(a.elements.root,Ha.maximizable)}function S(a){a.get(\"closable\")?(b(a.elements.root,Ha.closable),ya(a)):(c(a.elements.root,Ha.closable),za(a))}function T(a,b){if(a.timeStamp-La>200&&(La=a.timeStamp)&&!Ka){var c=a.srcElement||a.target;!0===b.get(\"closableByDimmer\")&&c===b.elements.modal&&G(b)}Ka=!1}function U(a,b){if(Date.now()-Ma>200&&(Ma=Date.now()))for(var c=0;c<a.__internal.buttons.length;c+=1){var d=a.__internal.buttons[c];if(!d.element.disabled&&b(d)){var e=k(c,d);\"function\"==typeof a.callback&&a.callback.apply(a,[e]),!1===e.cancel&&a.close();break}}}function V(a,b){var c=a.srcElement||a.target;U(b,function(a){return a.element===c&&(Na=!0)})}function W(a){if(Na)return void(Na=!1);var b=q[q.length-1],c=a.keyCode;return 0===b.__internal.buttons.length&&c===o.ESC&&!0===b.get(\"closable\")?(G(b),!1):Ca.indexOf(c)>-1?(U(b,function(a){return a.key===c}),!1):void 0}function X(a){var b=q[q.length-1],c=a.keyCode;if(c===o.LEFT||c===o.RIGHT){for(var d=b.__internal.buttons,e=0;e<d.length;e+=1)if(document.activeElement===d[e].element)switch(c){case o.LEFT:return void d[(e||d.length)-1].element.focus();case o.RIGHT:return void d[(e+1)%d.length].element.focus()}}else if(c<o.F12+1&&c>o.F1-1&&Ca.indexOf(c)>-1)return a.preventDefault(),a.stopPropagation(),U(b,function(a){return a.key===c}),!1}function Y(a,b){if(b)b.focus();else{var c=a.__internal.focus,d=c.element;switch(typeof c.element){case\"number\":a.__internal.buttons.length>c.element&&(d=!0===a.get(\"basic\")?a.elements.reset[0]:a.__internal.buttons[c.element].element);break;case\"string\":d=a.elements.body.querySelector(c.element);break;case\"function\":d=c.element.call(a)}!0!==a.get(\"defaultFocusOff\")&&(void 0!==d&&null!==d||0!==a.__internal.buttons.length)||(d=a.elements.reset[0]),d&&d.focus&&(d.focus(),c.select&&d.select&&d.select())}}function Z(a,b){if(!b)for(var c=q.length-1;c>-1;c-=1)if(q[c].isModal()){b=q[c];break}if(b&&b.isModal()){var d,e=b.elements.reset[0],f=b.elements.reset[1],g=a.relatedTarget,h=b.elements.root.contains(g),i=a.srcElement||a.target;if(i===e&&!h||i===f&&g===e)return;i===f||i===document.body?d=e:i===e&&g===f?d=$(b):i===e&&h&&(d=$(b,!0)),Y(b,d)}}function $(a,b){var c=[].slice.call(a.elements.dialog.querySelectorAll(p.tabbable));b&&c.reverse();for(var d=0;d<c.length;d+=1){var e=c[d];if(e.offsetParent||e.offsetWidth||e.offsetHeight||e.getClientRects().length)return e}}function _(a){var b=q[q.length-1];b&&a.shiftKey&&a.keyCode===o.TAB&&b.elements.reset[1].focus()}function aa(a,b){clearTimeout(b.__internal.timerIn),Y(b),Na=!1,l(\"onfocus\",b),u(b.elements.dialog,v.type,b.__internal.transitionInHandler),c(b.elements.root,Ha.animationIn)}function ba(a,b){clearTimeout(b.__internal.timerOut),u(b.elements.dialog,v.type,b.__internal.transitionOutHandler),ha(b),na(b),b.isMaximized()&&!b.get(\"startMaximized\")&&L(b),\"function\"==typeof b.__internal.destroy&&b.__internal.destroy.apply(b)}function ca(a,b){var c=a[Ra]-Pa,d=a[Sa]-Qa;Ua&&(d-=document.body.scrollTop),b.style.left=c+\"px\",b.style.top=d+\"px\"}function da(a,b){var c=a[Ra]-Pa,d=a[Sa]-Qa;Ua&&(d-=document.body.scrollTop),b.style.left=Math.min(Ta.maxLeft,Math.max(Ta.minLeft,c))+\"px\",b.style.top=Ua?Math.min(Ta.maxTop,Math.max(Ta.minTop,d))+\"px\":Math.max(Ta.minTop,d)+\"px\"}function ea(a,c){if(null===Wa&&!c.isMaximized()&&c.get(\"movable\")){var d,e=0,f=0;if(\"touchstart\"===a.type?(a.preventDefault(),d=a.targetTouches[0],Ra=\"clientX\",Sa=\"clientY\"):0===a.button&&(d=a),d){var g=c.elements.dialog;if(b(g,Ha.capture),g.style.left&&(e=parseInt(g.style.left,10)),g.style.top&&(f=parseInt(g.style.top,10)),Pa=d[Ra]-e,Qa=d[Sa]-f,c.isModal()?Qa+=c.elements.modal.scrollTop:c.isPinned()&&(Qa-=document.body.scrollTop),c.get(\"moveBounded\")){var h=g,i=-e,j=-f;do{i+=h.offsetLeft,j+=h.offsetTop}while(h=h.offsetParent);Ta={maxLeft:i,minLeft:-i,maxTop:document.documentElement.clientHeight-g.clientHeight-j,minTop:-j},Va=da}else Ta=null,Va=ca;return l(\"onmove\",c),Ua=!c.isModal()&&c.isPinned(),Oa=c,Va(d,g),b(document.body,Ha.noSelection),!1}}}function fa(a){if(Oa){var b;\"touchmove\"===a.type?(a.preventDefault(),b=a.targetTouches[0]):0===a.button&&(b=a),b&&Va(b,Oa.elements.dialog)}}function ga(){if(Oa){var a=Oa;Oa=Ta=null,c(document.body,Ha.noSelection),c(a.elements.dialog,Ha.capture),l(\"onmoved\",a)}}function ha(a){Oa=null;var b=a.elements.dialog;b.style.left=b.style.top=\"\"}function ia(a){a.get(\"movable\")?(b(a.elements.root,Ha.movable),a.isOpen()&&ua(a)):(ha(a),c(a.elements.root,Ha.movable),a.isOpen()&&va(a))}function ja(a,b,c){var e=b,f=0,g=0;do{f+=e.offsetLeft,g+=e.offsetTop}while(e=e.offsetParent);var h,i;!0===c?(h=a.pageX,i=a.pageY):(h=a.clientX,i=a.clientY);var j=d();if(j&&(h=document.body.offsetWidth-h,isNaN(Xa)||(f=document.body.offsetWidth-f-b.offsetWidth)),b.style.height=i-g+$a+\"px\",b.style.width=h-f+$a+\"px\",!isNaN(Xa)){var k=.5*Math.abs(b.offsetWidth-Ya);j&&(k*=-1),b.offsetWidth>Ya?b.style.left=Xa+k+\"px\":b.offsetWidth>=Za&&(b.style.left=Xa-k+\"px\")}}function ka(a,c){if(!c.isMaximized()){var d;if(\"touchstart\"===a.type?(a.preventDefault(),d=a.targetTouches[0]):0===a.button&&(d=a),d){l(\"onresize\",c),Wa=c,$a=c.elements.resizeHandle.offsetHeight/2;var e=c.elements.dialog;return b(e,Ha.capture),Xa=parseInt(e.style.left,10),e.style.height=e.offsetHeight+\"px\",e.style.minHeight=c.elements.header.offsetHeight+c.elements.footer.offsetHeight+\"px\",e.style.width=(Ya=e.offsetWidth)+\"px\",\"none\"!==e.style.maxWidth&&(e.style.minWidth=(Za=e.offsetWidth)+\"px\"),e.style.maxWidth=\"none\",b(document.body,Ha.noSelection),!1}}}function la(a){if(Wa){var b;\"touchmove\"===a.type?(a.preventDefault(),b=a.targetTouches[0]):0===a.button&&(b=a),b&&ja(b,Wa.elements.dialog,!Wa.get(\"modal\")&&!Wa.get(\"pinned\"))}}function ma(){if(Wa){var a=Wa;Wa=null,c(document.body,Ha.noSelection),c(a.elements.dialog,Ha.capture),Ka=!0,l(\"onresized\",a)}}function na(a){Wa=null;var b=a.elements.dialog;\"none\"===b.style.maxWidth&&(b.style.maxWidth=b.style.minWidth=b.style.width=b.style.height=b.style.minHeight=b.style.left=\"\",Xa=Number.Nan,Ya=Za=$a=0)}function oa(a){a.get(\"resizable\")?(b(a.elements.root,Ha.resizable),a.isOpen()&&wa(a)):(na(a),c(a.elements.root,Ha.resizable),a.isOpen()&&xa(a))}function pa(){for(var a=0;a<q.length;a+=1){var b=q[a];b.get(\"autoReset\")&&(ha(b),na(b))}}function qa(b){1===q.length&&(t(a,\"resize\",pa),t(document.body,\"keyup\",W),t(document.body,\"keydown\",X),t(document.body,\"focus\",Z),t(document.documentElement,\"mousemove\",fa),t(document.documentElement,\"touchmove\",fa,!1,!1),t(document.documentElement,\"mouseup\",ga),t(document.documentElement,\"touchend\",ga),t(document.documentElement,\"mousemove\",la),t(document.documentElement,\"touchmove\",la,!1,!1),t(document.documentElement,\"mouseup\",ma),t(document.documentElement,\"touchend\",ma)),t(b.elements.commands.container,\"click\",b.__internal.commandsClickHandler),t(b.elements.footer,\"click\",b.__internal.buttonsClickHandler),t(b.elements.reset[0],\"focusin\",b.__internal.resetHandler),t(b.elements.reset[0],\"keydown\",_),t(b.elements.reset[1],\"focusin\",b.__internal.resetHandler),Na=!0,t(b.elements.dialog,v.type,b.__internal.transitionInHandler),b.get(\"modal\")||sa(b),b.get(\"resizable\")&&wa(b),b.get(\"movable\")&&ua(b)}function ra(b){1===q.length&&(u(a,\"resize\",pa),u(document.body,\"keyup\",W),u(document.body,\"keydown\",X),u(document.body,\"focus\",Z),u(document.documentElement,\"mousemove\",fa),u(document.documentElement,\"mouseup\",ga),u(document.documentElement,\"mousemove\",la),u(document.documentElement,\"mouseup\",ma)),u(b.elements.commands.container,\"click\",b.__internal.commandsClickHandler),u(b.elements.footer,\"click\",b.__internal.buttonsClickHandler),u(b.elements.reset[0],\"focusin\",b.__internal.resetHandler),u(b.elements.reset[0],\"keydown\",_),u(b.elements.reset[1],\"focusin\",b.__internal.resetHandler),t(b.elements.dialog,v.type,b.__internal.transitionOutHandler),b.get(\"modal\")||ta(b),b.get(\"movable\")&&va(b),b.get(\"resizable\")&&xa(b)}function sa(a){t(a.elements.dialog,\"focus\",a.__internal.bringToFrontHandler,!0)}function ta(a){u(a.elements.dialog,\"focus\",a.__internal.bringToFrontHandler,!0)}function ua(a){t(a.elements.header,\"mousedown\",a.__internal.beginMoveHandler),t(a.elements.header,\"touchstart\",a.__internal.beginMoveHandler,!1,!1)}function va(a){u(a.elements.header,\"mousedown\",a.__internal.beginMoveHandler),u(a.elements.header,\"touchstart\",a.__internal.beginMoveHandler,!1,!1)}function wa(a){t(a.elements.resizeHandle,\"mousedown\",a.__internal.beginResizeHandler),t(a.elements.resizeHandle,\"touchstart\",a.__internal.beginResizeHandler,!1,!1)}function xa(a){u(a.elements.resizeHandle,\"mousedown\",a.__internal.beginResizeHandler),u(a.elements.resizeHandle,\"touchstart\",a.__internal.beginResizeHandler,!1,!1)}function ya(a){t(a.elements.modal,\"click\",a.__internal.modalClickHandler)}function za(a){u(a.elements.modal,\"click\",a.__internal.modalClickHandler)}var Aa,Ba,Ca=[],Da=null,Ea=!1,Fa=a.navigator.userAgent.indexOf(\"Safari\")>-1&&a.navigator.userAgent.indexOf(\"Chrome\")<0,Ga={dimmer:'<div class=\"ajs-dimmer\"></div>',modal:'<div class=\"ajs-modal\" tabindex=\"0\"></div>',dialog:'<div class=\"ajs-dialog\" tabindex=\"0\"></div>',reset:'<button class=\"ajs-reset\"></button>',commands:'<div class=\"ajs-commands\"><button class=\"ajs-pin\"></button><button class=\"ajs-maximize\"></button><button class=\"ajs-close\"></button></div>',header:'<div class=\"ajs-header\"></div>',body:'<div class=\"ajs-body\"></div>',content:'<div class=\"ajs-content\"></div>',footer:'<div class=\"ajs-footer\"></div>',buttons:{primary:'<div class=\"ajs-primary ajs-buttons\"></div>',auxiliary:'<div class=\"ajs-auxiliary ajs-buttons\"></div>'},button:'<button class=\"ajs-button\"></button>',resizeHandle:'<div class=\"ajs-handle\"></div>'},Ha={animationIn:\"ajs-in\",animationOut:\"ajs-out\",base:\"alertify\",basic:\"ajs-basic\",capture:\"ajs-capture\",closable:\"ajs-closable\",fixed:\"ajs-fixed\",frameless:\"ajs-frameless\",hidden:\"ajs-hidden\",maximize:\"ajs-maximize\",maximized:\"ajs-maximized\",maximizable:\"ajs-maximizable\",modeless:\"ajs-modeless\",movable:\"ajs-movable\",noSelection:\"ajs-no-selection\",noOverflow:\"ajs-no-overflow\",noPadding:\"ajs-no-padding\",pin:\"ajs-pin\",pinnable:\"ajs-pinnable\",prefix:\"ajs-\",resizable:\"ajs-resizable\",restore:\"ajs-restore\",shake:\"ajs-shake\",unpinned:\"ajs-unpinned\",noTransition:\"ajs-no-transition\"},Ia=\"\",Ja=0,Ka=!1,La=0,Ma=0,Na=!1,Oa=null,Pa=0,Qa=0,Ra=\"pageX\",Sa=\"pageY\",Ta=null,Ua=!1,Va=null,Wa=null,Xa=Number.Nan,Ya=0,Za=0,$a=0;return{__init:m,isOpen:function(){return this.__internal.isOpen},isModal:function(){return this.elements.root.className.indexOf(Ha.modeless)<0},isMaximized:function(){return this.elements.root.className.indexOf(Ha.maximized)>-1},isPinned:function(){return this.elements.root.className.indexOf(Ha.unpinned)<0},maximize:function(){return this.isMaximized()||K(this),this},restore:function(){return this.isMaximized()&&L(this),this},pin:function(){return this.isPinned()||I(this),this},unpin:function(){return this.isPinned()&&J(this),this},bringToFront:function(){return D(null,this),this},moveTo:function(a,b){if(!isNaN(a)&&!isNaN(b)){l(\"onmove\",this);var c=this.elements.dialog,e=c,f=0,g=0;c.style.left&&(f-=parseInt(c.style.left,10)),c.style.top&&(g-=parseInt(c.style.top,10));do{f+=e.offsetLeft,g+=e.offsetTop}while(e=e.offsetParent);var h=a-f,i=b-g;d()&&(h*=-1),c.style.left=h+\"px\",c.style.top=i+\"px\",l(\"onmoved\",this)}return this},resizeTo:function(a,b){var c=parseFloat(a),d=parseFloat(b),e=/(\\d*\\.\\d+|\\d+)%/;if(!isNaN(c)&&!isNaN(d)&&!0===this.get(\"resizable\")){l(\"onresize\",this),(\"\"+a).match(e)&&(c=c/100*document.documentElement.clientWidth),(\"\"+b).match(e)&&(d=d/100*document.documentElement.clientHeight);var f=this.elements.dialog;\"none\"!==f.style.maxWidth&&(f.style.minWidth=(Za=f.offsetWidth)+\"px\"),f.style.maxWidth=\"none\",f.style.minHeight=this.elements.header.offsetHeight+this.elements.footer.offsetHeight+\"px\",f.style.width=c+\"px\",f.style.height=d+\"px\",l(\"onresized\",this)}return this},setting:function(a,b){var c=this,d=F(this,this.__internal.options,function(a,b,d){E(c,a,b,d)},a,b);if(\"get\"===d.op)return d.found?d.value:void 0!==this.settings?F(this,this.settings,this.settingUpdated||function(){},a,b).value:void 0;if(\"set\"===d.op){if(d.items.length>0)for(var e=this.settingUpdated||function(){},f=0;f<d.items.length;f+=1){var g=d.items[f];g.found||void 0===this.settings||F(this,this.settings,e,g.key,g.value)}return this}},set:function(a,b){return this.setting(a,b),this},get:function(a){return this.setting(a)},setHeader:function(b){return\"string\"==typeof b?(g(this.elements.header),this.elements.header.innerHTML=b):b instanceof a.HTMLElement&&this.elements.header.firstChild!==b&&(g(this.elements.header),this.elements.header.appendChild(b)),this},setContent:function(b){return\"string\"==typeof b?(g(this.elements.content),this.elements.content.innerHTML=b):b instanceof a.HTMLElement&&this.elements.content.firstChild!==b&&(g(this.elements.content),this.elements.content.appendChild(b)),this},showModal:function(a){return this.show(!0,a)},show:function(a,d){if(m(this),this.__internal.isOpen){ha(this),na(this),b(this.elements.dialog,Ha.shake);var e=this;setTimeout(function(){c(e.elements.dialog,Ha.shake)},200)}else{if(this.__internal.isOpen=!0,q.push(this),y.defaults.maintainFocus&&(this.__internal.activeElement=document.activeElement),document.body.hasAttribute(\"tabindex\")||document.body.setAttribute(\"tabindex\",Ea=\"0\"),\"function\"==typeof this.prepare&&this.prepare(),qa(this),void 0!==a&&this.set(\"modal\",a),n(),s(),\"string\"==typeof d&&\"\"!==d&&(this.__internal.className=d,b(this.elements.root,d)),this.get(\"startMaximized\")?this.maximize():this.isMaximized()&&L(this),P(this),this.elements.root.removeAttribute(\"style\"),c(this.elements.root,Ha.animationOut),b(this.elements.root,Ha.animationIn),clearTimeout(this.__internal.timerIn),this.__internal.timerIn=setTimeout(this.__internal.transitionInHandler,v.supported?1e3:100),Fa){var f=this.elements.root;f.style.display=\"none\",setTimeout(function(){f.style.display=\"block\"},0)}Da=this.elements.root.offsetWidth,c(this.elements.root,Ha.hidden),r(),\"function\"==typeof this.hooks.onshow&&this.hooks.onshow.call(this),l(\"onshow\",this)}return this},close:function(){return this.__internal.isOpen&&!1!==l(\"onclosing\",this)&&(ra(this),c(this.elements.root,Ha.animationIn),b(this.elements.root,Ha.animationOut),clearTimeout(this.__internal.timerOut),this.__internal.timerOut=setTimeout(this.__internal.transitionOutHandler,v.supported?1e3:100),b(this.elements.root,Ha.hidden),Da=this.elements.modal.offsetWidth,y.defaults.maintainFocus&&this.__internal.activeElement&&(this.__internal.activeElement.focus(),this.__internal.activeElement=null),void 0!==this.__internal.className&&\"\"!==this.__internal.className&&c(this.elements.root,this.__internal.className),\"function\"==typeof this.hooks.onclose&&this.hooks.onclose.call(this),l(\"onclose\",this),q.splice(q.indexOf(this),1),this.__internal.isOpen=!1,s()),q.length||\"0\"!==Ea||document.body.removeAttribute(\"tabindex\"),this},closeOthers:function(){return y.closeAll(this),this},destroy:function(){return this.__internal&&(this.__internal.isOpen?(this.__internal.destroy=function(){i(this,m)},this.close()):this.__internal.destroy||i(this,m)),this}}}(),x=function(){function d(a){if(!a.__internal){a.__internal={position:y.defaults.notifier.position,delay:y.defaults.notifier.delay},l=document.createElement(\"DIV\");(\"transitionOff\"in p.notifier?p.notifier.transitionOff:p.transitionOff)&&(o=n.base+\" ajs-no-transition\"),h(a)}l.parentNode!==document.body&&document.body.appendChild(l)}function e(a){a.__internal.pushed=!0,m.push(a)}function f(a){m.splice(m.indexOf(a),1),a.__internal.pushed=!1}function h(a){switch(l.className=o,a.__internal.position){case\"top-right\":b(l,n.top+\" \"+n.right);break;case\"top-left\":b(l,n.top+\" \"+n.left);break;case\"top-center\":b(l,n.top+\" \"+n.center);break;case\"bottom-left\":b(l,n.bottom+\" \"+n.left);break;case\"bottom-center\":b(l,n.bottom+\" \"+n.center);break;default:case\"bottom-right\":b(l,n.bottom+\" \"+n.right)}}function i(d,h){function i(a,b){b.__internal.closeButton&&\"true\"!==a.target.getAttribute(\"data-close\")||b.dismiss(!0)}function m(a,b){u(b.element,v.type,m),l.removeChild(b.element)}function o(a){return a.__internal||(a.__internal={pushed:!1,delay:void 0,timer:void 0,clickHandler:void 0,transitionEndHandler:void 0,transitionTimeout:void 0},a.__internal.clickHandler=j(a,i),a.__internal.transitionEndHandler=j(a,m)),a}function p(a){clearTimeout(a.__internal.timer),clearTimeout(a.__internal.transitionTimeout)}return o({element:d,push:function(a,c){if(!this.__internal.pushed){e(this),p(this);var d,f;switch(arguments.length){case 0:f=this.__internal.delay;break;case 1:\"number\"==typeof a?f=a:(d=a,f=this.__internal.delay);break;case 2:d=a,f=c}return this.__internal.closeButton=y.defaults.notifier.closeButton,void 0!==d&&this.setContent(d),x.__internal.position.indexOf(\"top\")<0?l.appendChild(this.element):l.insertBefore(this.element,l.firstChild),k=this.element.offsetWidth,b(this.element,n.visible),t(this.element,\"click\",this.__internal.clickHandler),this.delay(f)}return this},ondismiss:function(){},callback:h,dismiss:function(a){return this.__internal.pushed&&(p(this),\"function\"==typeof this.ondismiss&&!1===this.ondismiss.call(this)||(u(this.element,\"click\",this.__internal.clickHandler),void 0!==this.element&&this.element.parentNode===l&&(this.__internal.transitionTimeout=setTimeout(this.__internal.transitionEndHandler,v.supported?1e3:100),c(this.element,n.visible),\"function\"==typeof this.callback&&this.callback.call(this,a)),f(this))),this},delay:function(a){if(p(this),this.__internal.delay=void 0===a||isNaN(+a)?x.__internal.delay:+a,this.__internal.delay>0){var b=this;this.__internal.timer=setTimeout(function(){b.dismiss()},1e3*this.__internal.delay)}return this},setContent:function(c){if(\"string\"==typeof c?(g(this.element),this.element.innerHTML=c):c instanceof a.HTMLElement&&this.element.firstChild!==c&&(g(this.element),this.element.appendChild(c)),this.__internal.closeButton){var d=document.createElement(\"span\");b(d,n.close),d.setAttribute(\"data-close\",!0),this.element.appendChild(d)}return this},dismissOthers:function(){return x.dismissAll(this),this}})}var k,l,m=[],n=p.notifier.classes,o=n.base;return{setting:function(a,b){if(d(this),void 0===b)return this.__internal[a];switch(a){case\"position\":this.__internal.position=b,h(this);break;case\"delay\":this.__internal.delay=b}return this},set:function(a,b){return this.setting(a,b),this},get:function(a){return this.setting(a)},create:function(a,b){d(this);var c=document.createElement(\"div\");return c.className=n.message+(\"string\"==typeof a&&\"\"!==a?\" \"+n.prefix+a:\"\"),i(c,b)},dismissAll:function(a){for(var b=m.slice(0),c=0;c<b.length;c+=1){var d=b[c];void 0!==a&&a===d||d.dismiss()}}}}(),y=new m;y.dialog(\"alert\",function(){return{main:function(a,b,c){var d,e,f;switch(arguments.length){case 1:e=a;break;case 2:\"function\"==typeof b?(e=a,f=b):(d=a,e=b);break;case 3:d=a,e=b,f=c}return this.set(\"title\",d),this.set(\"message\",e),this.set(\"onok\",f),this},setup:function(){return{buttons:[{text:y.defaults.glossary.ok,key:o.ESC,invokeOnClose:!0,className:y.defaults.theme.ok}],focus:{element:0,select:!1},options:{maximizable:!1,resizable:!1}}},build:function(){},prepare:function(){},setMessage:function(a){this.setContent(a)},settings:{message:void 0,onok:void 0,label:void 0},settingUpdated:function(a,b,c){switch(a){case\"message\":this.setMessage(c);break;case\"label\":this.__internal.buttons[0].element&&(this.__internal.buttons[0].element.innerHTML=c)}},\ncallback:function(a){if(\"function\"==typeof this.get(\"onok\")){var b=this.get(\"onok\").call(this,a);void 0!==b&&(a.cancel=!b)}}}}),y.dialog(\"confirm\",function(){function a(a){null!==c.timer&&(clearInterval(c.timer),c.timer=null,a.__internal.buttons[c.index].element.innerHTML=c.text)}function b(b,d,e){a(b),c.duration=e,c.index=d,c.text=b.__internal.buttons[d].element.innerHTML,c.timer=setInterval(j(b,c.task),1e3),c.task(null,b)}var c={timer:null,index:null,text:null,duration:null,task:function(b,d){if(d.isOpen()){if(d.__internal.buttons[c.index].element.innerHTML=c.text+\" (&#8207;\"+c.duration+\"&#8207;) \",c.duration-=1,-1===c.duration){a(d);var e=d.__internal.buttons[c.index],f=k(c.index,e);\"function\"==typeof d.callback&&d.callback.apply(d,[f]),!1!==f.close&&d.close()}}else a(d)}};return{main:function(a,b,c,d){var e,f,g,h;switch(arguments.length){case 1:f=a;break;case 2:f=a,g=b;break;case 3:f=a,g=b,h=c;break;case 4:e=a,f=b,g=c,h=d}return this.set(\"title\",e),this.set(\"message\",f),this.set(\"onok\",g),this.set(\"oncancel\",h),this},setup:function(){return{buttons:[{text:y.defaults.glossary.ok,key:o.ENTER,className:y.defaults.theme.ok},{text:y.defaults.glossary.cancel,key:o.ESC,invokeOnClose:!0,className:y.defaults.theme.cancel}],focus:{element:0,select:!1},options:{maximizable:!1,resizable:!1}}},build:function(){},prepare:function(){},setMessage:function(a){this.setContent(a)},settings:{message:null,labels:null,onok:null,oncancel:null,defaultFocus:null,reverseButtons:null},settingUpdated:function(a,b,c){switch(a){case\"message\":this.setMessage(c);break;case\"labels\":\"ok\"in c&&this.__internal.buttons[0].element&&(this.__internal.buttons[0].text=c.ok,this.__internal.buttons[0].element.innerHTML=c.ok),\"cancel\"in c&&this.__internal.buttons[1].element&&(this.__internal.buttons[1].text=c.cancel,this.__internal.buttons[1].element.innerHTML=c.cancel);break;case\"reverseButtons\":!0===c?this.elements.buttons.primary.appendChild(this.__internal.buttons[0].element):this.elements.buttons.primary.appendChild(this.__internal.buttons[1].element);break;case\"defaultFocus\":this.__internal.focus.element=\"ok\"===c?0:1}},callback:function(b){a(this);var c;switch(b.index){case 0:\"function\"==typeof this.get(\"onok\")&&void 0!==(c=this.get(\"onok\").call(this,b))&&(b.cancel=!c);break;case 1:\"function\"==typeof this.get(\"oncancel\")&&void 0!==(c=this.get(\"oncancel\").call(this,b))&&(b.cancel=!c)}},autoOk:function(a){return b(this,0,a),this},autoCancel:function(a){return b(this,1,a),this}}}),y.dialog(\"prompt\",function(){var b=document.createElement(\"INPUT\"),c=document.createElement(\"P\");return{main:function(a,b,c,d,e){var f,g,h,i,j;switch(arguments.length){case 1:g=a;break;case 2:g=a,h=b;break;case 3:g=a,h=b,i=c;break;case 4:g=a,h=b,i=c,j=d;break;case 5:f=a,g=b,h=c,i=d,j=e}return this.set(\"title\",f),this.set(\"message\",g),this.set(\"value\",h),this.set(\"onok\",i),this.set(\"oncancel\",j),this},setup:function(){return{buttons:[{text:y.defaults.glossary.ok,key:o.ENTER,className:y.defaults.theme.ok},{text:y.defaults.glossary.cancel,key:o.ESC,invokeOnClose:!0,className:y.defaults.theme.cancel}],focus:{element:b,select:!0},options:{maximizable:!1,resizable:!1}}},build:function(){b.className=y.defaults.theme.input,b.setAttribute(\"type\",\"text\"),b.value=this.get(\"value\"),this.elements.content.appendChild(c),this.elements.content.appendChild(b)},prepare:function(){},setMessage:function(b){\"string\"==typeof b?(g(c),c.innerHTML=b):b instanceof a.HTMLElement&&c.firstChild!==b&&(g(c),c.appendChild(b))},settings:{message:void 0,labels:void 0,onok:void 0,oncancel:void 0,value:\"\",type:\"text\",reverseButtons:void 0},settingUpdated:function(a,c,d){switch(a){case\"message\":this.setMessage(d);break;case\"value\":b.value=d;break;case\"type\":switch(d){case\"text\":case\"color\":case\"date\":case\"datetime-local\":case\"email\":case\"month\":case\"number\":case\"password\":case\"search\":case\"tel\":case\"time\":case\"week\":b.type=d;break;default:b.type=\"text\"}break;case\"labels\":d.ok&&this.__internal.buttons[0].element&&(this.__internal.buttons[0].element.innerHTML=d.ok),d.cancel&&this.__internal.buttons[1].element&&(this.__internal.buttons[1].element.innerHTML=d.cancel);break;case\"reverseButtons\":!0===d?this.elements.buttons.primary.appendChild(this.__internal.buttons[0].element):this.elements.buttons.primary.appendChild(this.__internal.buttons[1].element)}},callback:function(a){var c;switch(a.index){case 0:this.settings.value=b.value,\"function\"==typeof this.get(\"onok\")&&void 0!==(c=this.get(\"onok\").call(this,a,this.settings.value))&&(a.cancel=!c);break;case 1:\"function\"==typeof this.get(\"oncancel\")&&void 0!==(c=this.get(\"oncancel\").call(this,a))&&(a.cancel=!c),a.cancel||(b.value=this.settings.value)}}}}),\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=y:\"function\"==typeof define&&define.amd?define([],function(){return y}):a.alertify||(a.alertify=y)}(\"undefined\"!=typeof window?window:this);","/*!\n\nJSZip v3.10.1 - A JavaScript class for generating and reading zip files\n<http://stuartk.com/jszip>\n\n(c) 2009-2016 Stuart Knightley <stuart [at] stuartk.com>\nDual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/main/LICENSE.markdown.\n\nJSZip uses the library pako released under the MIT license :\nhttps://github.com/nodeca/pako/blob/main/LICENSE\n*/\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define([],e);else{(\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).JSZip=e()}}(function(){return function s(a,o,h){function u(r,e){if(!o[r]){if(!a[r]){var t=\"function\"==typeof require&&require;if(!e&&t)return t(r,!0);if(l)return l(r,!0);var n=new Error(\"Cannot find module '\"+r+\"'\");throw n.code=\"MODULE_NOT_FOUND\",n}var i=o[r]={exports:{}};a[r][0].call(i.exports,function(e){var t=a[r][1][e];return u(t||e)},i,i.exports,s,a,o,h)}return o[r].exports}for(var l=\"function\"==typeof require&&require,e=0;e<h.length;e++)u(h[e]);return u}({1:[function(e,t,r){\"use strict\";var d=e(\"./utils\"),c=e(\"./support\"),p=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";r.encode=function(e){for(var t,r,n,i,s,a,o,h=[],u=0,l=e.length,f=l,c=\"string\"!==d.getTypeOf(e);u<e.length;)f=l-u,n=c?(t=e[u++],r=u<l?e[u++]:0,u<l?e[u++]:0):(t=e.charCodeAt(u++),r=u<l?e.charCodeAt(u++):0,u<l?e.charCodeAt(u++):0),i=t>>2,s=(3&t)<<4|r>>4,a=1<f?(15&r)<<2|n>>6:64,o=2<f?63&n:64,h.push(p.charAt(i)+p.charAt(s)+p.charAt(a)+p.charAt(o));return h.join(\"\")},r.decode=function(e){var t,r,n,i,s,a,o=0,h=0,u=\"data:\";if(e.substr(0,u.length)===u)throw new Error(\"Invalid base64 input, it looks like a data url.\");var l,f=3*(e=e.replace(/[^A-Za-z0-9+/=]/g,\"\")).length/4;if(e.charAt(e.length-1)===p.charAt(64)&&f--,e.charAt(e.length-2)===p.charAt(64)&&f--,f%1!=0)throw new Error(\"Invalid base64 input, bad content length.\");for(l=c.uint8array?new Uint8Array(0|f):new Array(0|f);o<e.length;)t=p.indexOf(e.charAt(o++))<<2|(i=p.indexOf(e.charAt(o++)))>>4,r=(15&i)<<4|(s=p.indexOf(e.charAt(o++)))>>2,n=(3&s)<<6|(a=p.indexOf(e.charAt(o++))),l[h++]=t,64!==s&&(l[h++]=r),64!==a&&(l[h++]=n);return l}},{\"./support\":30,\"./utils\":32}],2:[function(e,t,r){\"use strict\";var n=e(\"./external\"),i=e(\"./stream/DataWorker\"),s=e(\"./stream/Crc32Probe\"),a=e(\"./stream/DataLengthProbe\");function o(e,t,r,n,i){this.compressedSize=e,this.uncompressedSize=t,this.crc32=r,this.compression=n,this.compressedContent=i}o.prototype={getContentWorker:function(){var e=new i(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new a(\"data_length\")),t=this;return e.on(\"end\",function(){if(this.streamInfo.data_length!==t.uncompressedSize)throw new Error(\"Bug : uncompressed data size mismatch\")}),e},getCompressedWorker:function(){return new i(n.Promise.resolve(this.compressedContent)).withStreamInfo(\"compressedSize\",this.compressedSize).withStreamInfo(\"uncompressedSize\",this.uncompressedSize).withStreamInfo(\"crc32\",this.crc32).withStreamInfo(\"compression\",this.compression)}},o.createWorkerFrom=function(e,t,r){return e.pipe(new s).pipe(new a(\"uncompressedSize\")).pipe(t.compressWorker(r)).pipe(new a(\"compressedSize\")).withStreamInfo(\"compression\",t)},t.exports=o},{\"./external\":6,\"./stream/Crc32Probe\":25,\"./stream/DataLengthProbe\":26,\"./stream/DataWorker\":27}],3:[function(e,t,r){\"use strict\";var n=e(\"./stream/GenericWorker\");r.STORE={magic:\"\\0\\0\",compressWorker:function(){return new n(\"STORE compression\")},uncompressWorker:function(){return new n(\"STORE decompression\")}},r.DEFLATE=e(\"./flate\")},{\"./flate\":7,\"./stream/GenericWorker\":28}],4:[function(e,t,r){\"use strict\";var n=e(\"./utils\");var o=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t){return void 0!==e&&e.length?\"string\"!==n.getTypeOf(e)?function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a<s;a++)e=e>>>8^i[255&(e^t[a])];return-1^e}(0|t,e,e.length,0):function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a<s;a++)e=e>>>8^i[255&(e^t.charCodeAt(a))];return-1^e}(0|t,e,e.length,0):0}},{\"./utils\":32}],5:[function(e,t,r){\"use strict\";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],6:[function(e,t,r){\"use strict\";var n=null;n=\"undefined\"!=typeof Promise?Promise:e(\"lie\"),t.exports={Promise:n}},{lie:37}],7:[function(e,t,r){\"use strict\";var n=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Uint32Array,i=e(\"pako\"),s=e(\"./utils\"),a=e(\"./stream/GenericWorker\"),o=n?\"uint8array\":\"array\";function h(e,t){a.call(this,\"FlateWorker/\"+e),this._pako=null,this._pakoAction=e,this._pakoOptions=t,this.meta={}}r.magic=\"\\b\\0\",s.inherits(h,a),h.prototype.processChunk=function(e){this.meta=e.meta,null===this._pako&&this._createPako(),this._pako.push(s.transformTo(o,e.data),!1)},h.prototype.flush=function(){a.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},h.prototype.cleanUp=function(){a.prototype.cleanUp.call(this),this._pako=null},h.prototype._createPako=function(){this._pako=new i[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var t=this;this._pako.onData=function(e){t.push({data:e,meta:t.meta})}},r.compressWorker=function(e){return new h(\"Deflate\",e)},r.uncompressWorker=function(){return new h(\"Inflate\",{})}},{\"./stream/GenericWorker\":28,\"./utils\":32,pako:38}],8:[function(e,t,r){\"use strict\";function A(e,t){var r,n=\"\";for(r=0;r<t;r++)n+=String.fromCharCode(255&e),e>>>=8;return n}function n(e,t,r,n,i,s){var a,o,h=e.file,u=e.compression,l=s!==O.utf8encode,f=I.transformTo(\"string\",s(h.name)),c=I.transformTo(\"string\",O.utf8encode(h.name)),d=h.comment,p=I.transformTo(\"string\",s(d)),m=I.transformTo(\"string\",O.utf8encode(d)),_=c.length!==h.name.length,g=m.length!==d.length,b=\"\",v=\"\",y=\"\",w=h.dir,k=h.date,x={crc32:0,compressedSize:0,uncompressedSize:0};t&&!r||(x.crc32=e.crc32,x.compressedSize=e.compressedSize,x.uncompressedSize=e.uncompressedSize);var S=0;t&&(S|=8),l||!_&&!g||(S|=2048);var z=0,C=0;w&&(z|=16),\"UNIX\"===i?(C=798,z|=function(e,t){var r=e;return e||(r=t?16893:33204),(65535&r)<<16}(h.unixPermissions,w)):(C=20,z|=function(e){return 63&(e||0)}(h.dosPermissions)),a=k.getUTCHours(),a<<=6,a|=k.getUTCMinutes(),a<<=5,a|=k.getUTCSeconds()/2,o=k.getUTCFullYear()-1980,o<<=4,o|=k.getUTCMonth()+1,o<<=5,o|=k.getUTCDate(),_&&(v=A(1,1)+A(B(f),4)+c,b+=\"up\"+A(v.length,2)+v),g&&(y=A(1,1)+A(B(p),4)+m,b+=\"uc\"+A(y.length,2)+y);var E=\"\";return E+=\"\\n\\0\",E+=A(S,2),E+=u.magic,E+=A(a,2),E+=A(o,2),E+=A(x.crc32,4),E+=A(x.compressedSize,4),E+=A(x.uncompressedSize,4),E+=A(f.length,2),E+=A(b.length,2),{fileRecord:R.LOCAL_FILE_HEADER+E+f+b,dirRecord:R.CENTRAL_FILE_HEADER+A(C,2)+E+A(p.length,2)+\"\\0\\0\\0\\0\"+A(z,4)+A(n,4)+f+b+p}}var I=e(\"../utils\"),i=e(\"../stream/GenericWorker\"),O=e(\"../utf8\"),B=e(\"../crc32\"),R=e(\"../signature\");function s(e,t,r,n){i.call(this,\"ZipFileWorker\"),this.bytesWritten=0,this.zipComment=t,this.zipPlatform=r,this.encodeFileName=n,this.streamFiles=e,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}I.inherits(s,i),s.prototype.push=function(e){var t=e.meta.percent||0,r=this.entriesCount,n=this._sources.length;this.accumulate?this.contentBuffer.push(e):(this.bytesWritten+=e.data.length,i.prototype.push.call(this,{data:e.data,meta:{currentFile:this.currentFile,percent:r?(t+100*(r-n-1))/r:100}}))},s.prototype.openedSource=function(e){this.currentSourceOffset=this.bytesWritten,this.currentFile=e.file.name;var t=this.streamFiles&&!e.file.dir;if(t){var r=n(e,t,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:r.fileRecord,meta:{percent:0}})}else this.accumulate=!0},s.prototype.closedSource=function(e){this.accumulate=!1;var t=this.streamFiles&&!e.file.dir,r=n(e,t,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(r.dirRecord),t)this.push({data:function(e){return R.DATA_DESCRIPTOR+A(e.crc32,4)+A(e.compressedSize,4)+A(e.uncompressedSize,4)}(e),meta:{percent:100}});else for(this.push({data:r.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},s.prototype.flush=function(){for(var e=this.bytesWritten,t=0;t<this.dirRecords.length;t++)this.push({data:this.dirRecords[t],meta:{percent:100}});var r=this.bytesWritten-e,n=function(e,t,r,n,i){var s=I.transformTo(\"string\",i(n));return R.CENTRAL_DIRECTORY_END+\"\\0\\0\\0\\0\"+A(e,2)+A(e,2)+A(t,4)+A(r,4)+A(s.length,2)+s}(this.dirRecords.length,r,e,this.zipComment,this.encodeFileName);this.push({data:n,meta:{percent:100}})},s.prototype.prepareNextSource=function(){this.previous=this._sources.shift(),this.openedSource(this.previous.streamInfo),this.isPaused?this.previous.pause():this.previous.resume()},s.prototype.registerPrevious=function(e){this._sources.push(e);var t=this;return e.on(\"data\",function(e){t.processChunk(e)}),e.on(\"end\",function(){t.closedSource(t.previous.streamInfo),t._sources.length?t.prepareNextSource():t.end()}),e.on(\"error\",function(e){t.error(e)}),this},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(!this.previous&&this._sources.length?(this.prepareNextSource(),!0):this.previous||this._sources.length||this.generatedError?void 0:(this.end(),!0))},s.prototype.error=function(e){var t=this._sources;if(!i.prototype.error.call(this,e))return!1;for(var r=0;r<t.length;r++)try{t[r].error(e)}catch(e){}return!0},s.prototype.lock=function(){i.prototype.lock.call(this);for(var e=this._sources,t=0;t<e.length;t++)e[t].lock()},t.exports=s},{\"../crc32\":4,\"../signature\":23,\"../stream/GenericWorker\":28,\"../utf8\":31,\"../utils\":32}],9:[function(e,t,r){\"use strict\";var u=e(\"../compressions\"),n=e(\"./ZipFileWorker\");r.generateWorker=function(e,a,t){var o=new n(a.streamFiles,t,a.platform,a.encodeFileName),h=0;try{e.forEach(function(e,t){h++;var r=function(e,t){var r=e||t,n=u[r];if(!n)throw new Error(r+\" is not a valid compression method !\");return n}(t.options.compression,a.compression),n=t.options.compressionOptions||a.compressionOptions||{},i=t.dir,s=t.date;t._compressWorker(r,n).withStreamInfo(\"file\",{name:e,dir:i,date:s,comment:t.comment||\"\",unixPermissions:t.unixPermissions,dosPermissions:t.dosPermissions}).pipe(o)}),o.entriesCount=h}catch(e){o.error(e)}return o}},{\"../compressions\":3,\"./ZipFileWorker\":8}],10:[function(e,t,r){\"use strict\";function n(){if(!(this instanceof n))return new n;if(arguments.length)throw new Error(\"The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.\");this.files=Object.create(null),this.comment=null,this.root=\"\",this.clone=function(){var e=new n;for(var t in this)\"function\"!=typeof this[t]&&(e[t]=this[t]);return e}}(n.prototype=e(\"./object\")).loadAsync=e(\"./load\"),n.support=e(\"./support\"),n.defaults=e(\"./defaults\"),n.version=\"3.10.1\",n.loadAsync=function(e,t){return(new n).loadAsync(e,t)},n.external=e(\"./external\"),t.exports=n},{\"./defaults\":5,\"./external\":6,\"./load\":11,\"./object\":15,\"./support\":30}],11:[function(e,t,r){\"use strict\";var u=e(\"./utils\"),i=e(\"./external\"),n=e(\"./utf8\"),s=e(\"./zipEntries\"),a=e(\"./stream/Crc32Probe\"),l=e(\"./nodejsUtils\");function f(n){return new i.Promise(function(e,t){var r=n.decompressed.getContentWorker().pipe(new a);r.on(\"error\",function(e){t(e)}).on(\"end\",function(){r.streamInfo.crc32!==n.decompressed.crc32?t(new Error(\"Corrupted zip : CRC32 mismatch\")):e()}).resume()})}t.exports=function(e,o){var h=this;return o=u.extend(o||{},{base64:!1,checkCRC32:!1,optimizedBinaryString:!1,createFolders:!1,decodeFileName:n.utf8decode}),l.isNode&&l.isStream(e)?i.Promise.reject(new Error(\"JSZip can't accept a stream when loading a zip file.\")):u.prepareContent(\"the loaded zip file\",e,!0,o.optimizedBinaryString,o.base64).then(function(e){var t=new s(o);return t.load(e),t}).then(function(e){var t=[i.Promise.resolve(e)],r=e.files;if(o.checkCRC32)for(var n=0;n<r.length;n++)t.push(f(r[n]));return i.Promise.all(t)}).then(function(e){for(var t=e.shift(),r=t.files,n=0;n<r.length;n++){var i=r[n],s=i.fileNameStr,a=u.resolve(i.fileNameStr);h.file(a,i.decompressed,{binary:!0,optimizedBinaryString:!0,date:i.date,dir:i.dir,comment:i.fileCommentStr.length?i.fileCommentStr:null,unixPermissions:i.unixPermissions,dosPermissions:i.dosPermissions,createFolders:o.createFolders}),i.dir||(h.file(a).unsafeOriginalName=s)}return t.zipComment.length&&(h.comment=t.zipComment),h})}},{\"./external\":6,\"./nodejsUtils\":14,\"./stream/Crc32Probe\":25,\"./utf8\":31,\"./utils\":32,\"./zipEntries\":33}],12:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"../stream/GenericWorker\");function s(e,t){i.call(this,\"Nodejs stream input adapter for \"+e),this._upstreamEnded=!1,this._bindStream(t)}n.inherits(s,i),s.prototype._bindStream=function(e){var t=this;(this._stream=e).pause(),e.on(\"data\",function(e){t.push({data:e,meta:{percent:0}})}).on(\"error\",function(e){t.isPaused?this.generatedError=e:t.error(e)}).on(\"end\",function(){t.isPaused?t._upstreamEnded=!0:t.end()})},s.prototype.pause=function(){return!!i.prototype.pause.call(this)&&(this._stream.pause(),!0)},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(this._upstreamEnded?this.end():this._stream.resume(),!0)},t.exports=s},{\"../stream/GenericWorker\":28,\"../utils\":32}],13:[function(e,t,r){\"use strict\";var i=e(\"readable-stream\").Readable;function n(e,t,r){i.call(this,t),this._helper=e;var n=this;e.on(\"data\",function(e,t){n.push(e)||n._helper.pause(),r&&r(t)}).on(\"error\",function(e){n.emit(\"error\",e)}).on(\"end\",function(){n.push(null)})}e(\"../utils\").inherits(n,i),n.prototype._read=function(){this._helper.resume()},t.exports=n},{\"../utils\":32,\"readable-stream\":16}],14:[function(e,t,r){\"use strict\";t.exports={isNode:\"undefined\"!=typeof Buffer,newBufferFrom:function(e,t){if(Buffer.from&&Buffer.from!==Uint8Array.from)return Buffer.from(e,t);if(\"number\"==typeof e)throw new Error('The \"data\" argument must not be a number');return new Buffer(e,t)},allocBuffer:function(e){if(Buffer.alloc)return Buffer.alloc(e);var t=new Buffer(e);return t.fill(0),t},isBuffer:function(e){return Buffer.isBuffer(e)},isStream:function(e){return e&&\"function\"==typeof e.on&&\"function\"==typeof e.pause&&\"function\"==typeof e.resume}}},{}],15:[function(e,t,r){\"use strict\";function s(e,t,r){var n,i=u.getTypeOf(t),s=u.extend(r||{},f);s.date=s.date||new Date,null!==s.compression&&(s.compression=s.compression.toUpperCase()),\"string\"==typeof s.unixPermissions&&(s.unixPermissions=parseInt(s.unixPermissions,8)),s.unixPermissions&&16384&s.unixPermissions&&(s.dir=!0),s.dosPermissions&&16&s.dosPermissions&&(s.dir=!0),s.dir&&(e=g(e)),s.createFolders&&(n=_(e))&&b.call(this,n,!0);var a=\"string\"===i&&!1===s.binary&&!1===s.base64;r&&void 0!==r.binary||(s.binary=!a),(t instanceof c&&0===t.uncompressedSize||s.dir||!t||0===t.length)&&(s.base64=!1,s.binary=!0,t=\"\",s.compression=\"STORE\",i=\"string\");var o=null;o=t instanceof c||t instanceof l?t:p.isNode&&p.isStream(t)?new m(e,t):u.prepareContent(e,t,s.binary,s.optimizedBinaryString,s.base64);var h=new d(e,o,s);this.files[e]=h}var i=e(\"./utf8\"),u=e(\"./utils\"),l=e(\"./stream/GenericWorker\"),a=e(\"./stream/StreamHelper\"),f=e(\"./defaults\"),c=e(\"./compressedObject\"),d=e(\"./zipObject\"),o=e(\"./generate\"),p=e(\"./nodejsUtils\"),m=e(\"./nodejs/NodejsStreamInputAdapter\"),_=function(e){\"/\"===e.slice(-1)&&(e=e.substring(0,e.length-1));var t=e.lastIndexOf(\"/\");return 0<t?e.substring(0,t):\"\"},g=function(e){return\"/\"!==e.slice(-1)&&(e+=\"/\"),e},b=function(e,t){return t=void 0!==t?t:f.createFolders,e=g(e),this.files[e]||s.call(this,e,null,{dir:!0,createFolders:t}),this.files[e]};function h(e){return\"[object RegExp]\"===Object.prototype.toString.call(e)}var n={load:function(){throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\")},forEach:function(e){var t,r,n;for(t in this.files)n=this.files[t],(r=t.slice(this.root.length,t.length))&&t.slice(0,this.root.length)===this.root&&e(r,n)},filter:function(r){var n=[];return this.forEach(function(e,t){r(e,t)&&n.push(t)}),n},file:function(e,t,r){if(1!==arguments.length)return e=this.root+e,s.call(this,e,t,r),this;if(h(e)){var n=e;return this.filter(function(e,t){return!t.dir&&n.test(e)})}var i=this.files[this.root+e];return i&&!i.dir?i:null},folder:function(r){if(!r)return this;if(h(r))return this.filter(function(e,t){return t.dir&&r.test(e)});var e=this.root+r,t=b.call(this,e),n=this.clone();return n.root=t.name,n},remove:function(r){r=this.root+r;var e=this.files[r];if(e||(\"/\"!==r.slice(-1)&&(r+=\"/\"),e=this.files[r]),e&&!e.dir)delete this.files[r];else for(var t=this.filter(function(e,t){return t.name.slice(0,r.length)===r}),n=0;n<t.length;n++)delete this.files[t[n].name];return this},generate:function(){throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\")},generateInternalStream:function(e){var t,r={};try{if((r=u.extend(e||{},{streamFiles:!1,compression:\"STORE\",compressionOptions:null,type:\"\",platform:\"DOS\",comment:null,mimeType:\"application/zip\",encodeFileName:i.utf8encode})).type=r.type.toLowerCase(),r.compression=r.compression.toUpperCase(),\"binarystring\"===r.type&&(r.type=\"string\"),!r.type)throw new Error(\"No output type specified.\");u.checkSupport(r.type),\"darwin\"!==r.platform&&\"freebsd\"!==r.platform&&\"linux\"!==r.platform&&\"sunos\"!==r.platform||(r.platform=\"UNIX\"),\"win32\"===r.platform&&(r.platform=\"DOS\");var n=r.comment||this.comment||\"\";t=o.generateWorker(this,r,n)}catch(e){(t=new l(\"error\")).error(e)}return new a(t,r.type||\"string\",r.mimeType)},generateAsync:function(e,t){return this.generateInternalStream(e).accumulate(t)},generateNodeStream:function(e,t){return(e=e||{}).type||(e.type=\"nodebuffer\"),this.generateInternalStream(e).toNodejsStream(t)}};t.exports=n},{\"./compressedObject\":2,\"./defaults\":5,\"./generate\":9,\"./nodejs/NodejsStreamInputAdapter\":12,\"./nodejsUtils\":14,\"./stream/GenericWorker\":28,\"./stream/StreamHelper\":29,\"./utf8\":31,\"./utils\":32,\"./zipObject\":35}],16:[function(e,t,r){\"use strict\";t.exports=e(\"stream\")},{stream:void 0}],17:[function(e,t,r){\"use strict\";var n=e(\"./DataReader\");function i(e){n.call(this,e);for(var t=0;t<this.data.length;t++)e[t]=255&e[t]}e(\"../utils\").inherits(i,n),i.prototype.byteAt=function(e){return this.data[this.zero+e]},i.prototype.lastIndexOfSignature=function(e){for(var t=e.charCodeAt(0),r=e.charCodeAt(1),n=e.charCodeAt(2),i=e.charCodeAt(3),s=this.length-4;0<=s;--s)if(this.data[s]===t&&this.data[s+1]===r&&this.data[s+2]===n&&this.data[s+3]===i)return s-this.zero;return-1},i.prototype.readAndCheckSignature=function(e){var t=e.charCodeAt(0),r=e.charCodeAt(1),n=e.charCodeAt(2),i=e.charCodeAt(3),s=this.readData(4);return t===s[0]&&r===s[1]&&n===s[2]&&i===s[3]},i.prototype.readData=function(e){if(this.checkOffset(e),0===e)return[];var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./DataReader\":18}],18:[function(e,t,r){\"use strict\";var n=e(\"../utils\");function i(e){this.data=e,this.length=e.length,this.index=0,this.zero=0}i.prototype={checkOffset:function(e){this.checkIndex(this.index+e)},checkIndex:function(e){if(this.length<this.zero+e||e<0)throw new Error(\"End of data reached (data length = \"+this.length+\", asked index = \"+e+\"). Corrupted zip ?\")},setIndex:function(e){this.checkIndex(e),this.index=e},skip:function(e){this.setIndex(this.index+e)},byteAt:function(){},readInt:function(e){var t,r=0;for(this.checkOffset(e),t=this.index+e-1;t>=this.index;t--)r=(r<<8)+this.byteAt(t);return this.index+=e,r},readString:function(e){return n.transformTo(\"string\",this.readData(e))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var e=this.readInt(4);return new Date(Date.UTC(1980+(e>>25&127),(e>>21&15)-1,e>>16&31,e>>11&31,e>>5&63,(31&e)<<1))}},t.exports=i},{\"../utils\":32}],19:[function(e,t,r){\"use strict\";var n=e(\"./Uint8ArrayReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./Uint8ArrayReader\":21}],20:[function(e,t,r){\"use strict\";var n=e(\"./DataReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.byteAt=function(e){return this.data.charCodeAt(this.zero+e)},i.prototype.lastIndexOfSignature=function(e){return this.data.lastIndexOf(e)-this.zero},i.prototype.readAndCheckSignature=function(e){return e===this.readData(4)},i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./DataReader\":18}],21:[function(e,t,r){\"use strict\";var n=e(\"./ArrayReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.readData=function(e){if(this.checkOffset(e),0===e)return new Uint8Array(0);var t=this.data.subarray(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./ArrayReader\":17}],22:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"../support\"),s=e(\"./ArrayReader\"),a=e(\"./StringReader\"),o=e(\"./NodeBufferReader\"),h=e(\"./Uint8ArrayReader\");t.exports=function(e){var t=n.getTypeOf(e);return n.checkSupport(t),\"string\"!==t||i.uint8array?\"nodebuffer\"===t?new o(e):i.uint8array?new h(n.transformTo(\"uint8array\",e)):new s(n.transformTo(\"array\",e)):new a(e)}},{\"../support\":30,\"../utils\":32,\"./ArrayReader\":17,\"./NodeBufferReader\":19,\"./StringReader\":20,\"./Uint8ArrayReader\":21}],23:[function(e,t,r){\"use strict\";r.LOCAL_FILE_HEADER=\"PK\u0003\u0004\",r.CENTRAL_FILE_HEADER=\"PK\u0001\u0002\",r.CENTRAL_DIRECTORY_END=\"PK\u0005\u0006\",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR=\"PK\u0006\u0007\",r.ZIP64_CENTRAL_DIRECTORY_END=\"PK\u0006\u0006\",r.DATA_DESCRIPTOR=\"PK\u0007\\b\"},{}],24:[function(e,t,r){\"use strict\";var n=e(\"./GenericWorker\"),i=e(\"../utils\");function s(e){n.call(this,\"ConvertWorker to \"+e),this.destType=e}i.inherits(s,n),s.prototype.processChunk=function(e){this.push({data:i.transformTo(this.destType,e.data),meta:e.meta})},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],25:[function(e,t,r){\"use strict\";var n=e(\"./GenericWorker\"),i=e(\"../crc32\");function s(){n.call(this,\"Crc32Probe\"),this.withStreamInfo(\"crc32\",0)}e(\"../utils\").inherits(s,n),s.prototype.processChunk=function(e){this.streamInfo.crc32=i(e.data,this.streamInfo.crc32||0),this.push(e)},t.exports=s},{\"../crc32\":4,\"../utils\":32,\"./GenericWorker\":28}],26:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"./GenericWorker\");function s(e){i.call(this,\"DataLengthProbe for \"+e),this.propName=e,this.withStreamInfo(e,0)}n.inherits(s,i),s.prototype.processChunk=function(e){if(e){var t=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=t+e.data.length}i.prototype.processChunk.call(this,e)},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],27:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"./GenericWorker\");function s(e){i.call(this,\"DataWorker\");var t=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type=\"\",this._tickScheduled=!1,e.then(function(e){t.dataIsReady=!0,t.data=e,t.max=e&&e.length||0,t.type=n.getTypeOf(e),t.isPaused||t._tickAndRepeat()},function(e){t.error(e)})}n.inherits(s,i),s.prototype.cleanUp=function(){i.prototype.cleanUp.call(this),this.data=null},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,n.delay(this._tickAndRepeat,[],this)),!0)},s.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(n.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},s.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var e=null,t=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case\"string\":e=this.data.substring(this.index,t);break;case\"uint8array\":e=this.data.subarray(this.index,t);break;case\"array\":case\"nodebuffer\":e=this.data.slice(this.index,t)}return this.index=t,this.push({data:e,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],28:[function(e,t,r){\"use strict\";function n(e){this.name=e||\"default\",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}n.prototype={push:function(e){this.emit(\"data\",e)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit(\"end\"),this.cleanUp(),this.isFinished=!0}catch(e){this.emit(\"error\",e)}return!0},error:function(e){return!this.isFinished&&(this.isPaused?this.generatedError=e:(this.isFinished=!0,this.emit(\"error\",e),this.previous&&this.previous.error(e),this.cleanUp()),!0)},on:function(e,t){return this._listeners[e].push(t),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(e,t){if(this._listeners[e])for(var r=0;r<this._listeners[e].length;r++)this._listeners[e][r].call(this,t)},pipe:function(e){return e.registerPrevious(this)},registerPrevious:function(e){if(this.isLocked)throw new Error(\"The stream '\"+this+\"' has already been used.\");this.streamInfo=e.streamInfo,this.mergeStreamInfo(),this.previous=e;var t=this;return e.on(\"data\",function(e){t.processChunk(e)}),e.on(\"end\",function(){t.end()}),e.on(\"error\",function(e){t.error(e)}),this},pause:function(){return!this.isPaused&&!this.isFinished&&(this.isPaused=!0,this.previous&&this.previous.pause(),!0)},resume:function(){if(!this.isPaused||this.isFinished)return!1;var e=this.isPaused=!1;return this.generatedError&&(this.error(this.generatedError),e=!0),this.previous&&this.previous.resume(),!e},flush:function(){},processChunk:function(e){this.push(e)},withStreamInfo:function(e,t){return this.extraStreamInfo[e]=t,this.mergeStreamInfo(),this},mergeStreamInfo:function(){for(var e in this.extraStreamInfo)Object.prototype.hasOwnProperty.call(this.extraStreamInfo,e)&&(this.streamInfo[e]=this.extraStreamInfo[e])},lock:function(){if(this.isLocked)throw new Error(\"The stream '\"+this+\"' has already been used.\");this.isLocked=!0,this.previous&&this.previous.lock()},toString:function(){var e=\"Worker \"+this.name;return this.previous?this.previous+\" -> \"+e:e}},t.exports=n},{}],29:[function(e,t,r){\"use strict\";var h=e(\"../utils\"),i=e(\"./ConvertWorker\"),s=e(\"./GenericWorker\"),u=e(\"../base64\"),n=e(\"../support\"),a=e(\"../external\"),o=null;if(n.nodestream)try{o=e(\"../nodejs/NodejsStreamOutputAdapter\")}catch(e){}function l(e,o){return new a.Promise(function(t,r){var n=[],i=e._internalType,s=e._outputType,a=e._mimeType;e.on(\"data\",function(e,t){n.push(e),o&&o(t)}).on(\"error\",function(e){n=[],r(e)}).on(\"end\",function(){try{var e=function(e,t,r){switch(e){case\"blob\":return h.newBlob(h.transformTo(\"arraybuffer\",t),r);case\"base64\":return u.encode(t);default:return h.transformTo(e,t)}}(s,function(e,t){var r,n=0,i=null,s=0;for(r=0;r<t.length;r++)s+=t[r].length;switch(e){case\"string\":return t.join(\"\");case\"array\":return Array.prototype.concat.apply([],t);case\"uint8array\":for(i=new Uint8Array(s),r=0;r<t.length;r++)i.set(t[r],n),n+=t[r].length;return i;case\"nodebuffer\":return Buffer.concat(t);default:throw new Error(\"concat : unsupported type '\"+e+\"'\")}}(i,n),a);t(e)}catch(e){r(e)}n=[]}).resume()})}function f(e,t,r){var n=t;switch(t){case\"blob\":case\"arraybuffer\":n=\"uint8array\";break;case\"base64\":n=\"string\"}try{this._internalType=n,this._outputType=t,this._mimeType=r,h.checkSupport(n),this._worker=e.pipe(new i(n)),e.lock()}catch(e){this._worker=new s(\"error\"),this._worker.error(e)}}f.prototype={accumulate:function(e){return l(this,e)},on:function(e,t){var r=this;return\"data\"===e?this._worker.on(e,function(e){t.call(r,e.data,e.meta)}):this._worker.on(e,function(){h.delay(t,arguments,r)}),this},resume:function(){return h.delay(this._worker.resume,[],this._worker),this},pause:function(){return this._worker.pause(),this},toNodejsStream:function(e){if(h.checkSupport(\"nodestream\"),\"nodebuffer\"!==this._outputType)throw new Error(this._outputType+\" is not supported by this method\");return new o(this,{objectMode:\"nodebuffer\"!==this._outputType},e)}},t.exports=f},{\"../base64\":1,\"../external\":6,\"../nodejs/NodejsStreamOutputAdapter\":13,\"../support\":30,\"../utils\":32,\"./ConvertWorker\":24,\"./GenericWorker\":28}],30:[function(e,t,r){\"use strict\";if(r.base64=!0,r.array=!0,r.string=!0,r.arraybuffer=\"undefined\"!=typeof ArrayBuffer&&\"undefined\"!=typeof Uint8Array,r.nodebuffer=\"undefined\"!=typeof Buffer,r.uint8array=\"undefined\"!=typeof Uint8Array,\"undefined\"==typeof ArrayBuffer)r.blob=!1;else{var n=new ArrayBuffer(0);try{r.blob=0===new Blob([n],{type:\"application/zip\"}).size}catch(e){try{var i=new(self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder);i.append(n),r.blob=0===i.getBlob(\"application/zip\").size}catch(e){r.blob=!1}}}try{r.nodestream=!!e(\"readable-stream\").Readable}catch(e){r.nodestream=!1}},{\"readable-stream\":16}],31:[function(e,t,s){\"use strict\";for(var o=e(\"./utils\"),h=e(\"./support\"),r=e(\"./nodejsUtils\"),n=e(\"./stream/GenericWorker\"),u=new Array(256),i=0;i<256;i++)u[i]=252<=i?6:248<=i?5:240<=i?4:224<=i?3:192<=i?2:1;u[254]=u[254]=1;function a(){n.call(this,\"utf-8 decode\"),this.leftOver=null}function l(){n.call(this,\"utf-8 encode\")}s.utf8encode=function(e){return h.nodebuffer?r.newBufferFrom(e,\"utf-8\"):function(e){var t,r,n,i,s,a=e.length,o=0;for(i=0;i<a;i++)55296==(64512&(r=e.charCodeAt(i)))&&i+1<a&&56320==(64512&(n=e.charCodeAt(i+1)))&&(r=65536+(r-55296<<10)+(n-56320),i++),o+=r<128?1:r<2048?2:r<65536?3:4;for(t=h.uint8array?new Uint8Array(o):new Array(o),i=s=0;s<o;i++)55296==(64512&(r=e.charCodeAt(i)))&&i+1<a&&56320==(64512&(n=e.charCodeAt(i+1)))&&(r=65536+(r-55296<<10)+(n-56320),i++),r<128?t[s++]=r:(r<2048?t[s++]=192|r>>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t}(e)},s.utf8decode=function(e){return h.nodebuffer?o.transformTo(\"nodebuffer\",e).toString(\"utf-8\"):function(e){var t,r,n,i,s=e.length,a=new Array(2*s);for(t=r=0;t<s;)if((n=e[t++])<128)a[r++]=n;else if(4<(i=u[n]))a[r++]=65533,t+=i-1;else{for(n&=2===i?31:3===i?15:7;1<i&&t<s;)n=n<<6|63&e[t++],i--;1<i?a[r++]=65533:n<65536?a[r++]=n:(n-=65536,a[r++]=55296|n>>10&1023,a[r++]=56320|1023&n)}return a.length!==r&&(a.subarray?a=a.subarray(0,r):a.length=r),o.applyFromCharCode(a)}(e=o.transformTo(h.uint8array?\"uint8array\":\"array\",e))},o.inherits(a,n),a.prototype.processChunk=function(e){var t=o.transformTo(h.uint8array?\"uint8array\":\"array\",e.data);if(this.leftOver&&this.leftOver.length){if(h.uint8array){var r=t;(t=new Uint8Array(r.length+this.leftOver.length)).set(this.leftOver,0),t.set(r,this.leftOver.length)}else t=this.leftOver.concat(t);this.leftOver=null}var n=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+u[e[r]]>t?r:t}(t),i=t;n!==t.length&&(h.uint8array?(i=t.subarray(0,n),this.leftOver=t.subarray(n,t.length)):(i=t.slice(0,n),this.leftOver=t.slice(n,t.length))),this.push({data:s.utf8decode(i),meta:e.meta})},a.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:s.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},s.Utf8DecodeWorker=a,o.inherits(l,n),l.prototype.processChunk=function(e){this.push({data:s.utf8encode(e.data),meta:e.meta})},s.Utf8EncodeWorker=l},{\"./nodejsUtils\":14,\"./stream/GenericWorker\":28,\"./support\":30,\"./utils\":32}],32:[function(e,t,a){\"use strict\";var o=e(\"./support\"),h=e(\"./base64\"),r=e(\"./nodejsUtils\"),u=e(\"./external\");function n(e){return e}function l(e,t){for(var r=0;r<e.length;++r)t[r]=255&e.charCodeAt(r);return t}e(\"setimmediate\"),a.newBlob=function(t,r){a.checkSupport(\"blob\");try{return new Blob([t],{type:r})}catch(e){try{var n=new(self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder);return n.append(t),n.getBlob(r)}catch(e){throw new Error(\"Bug : can't construct the Blob.\")}}};var i={stringifyByChunk:function(e,t,r){var n=[],i=0,s=e.length;if(s<=r)return String.fromCharCode.apply(null,e);for(;i<s;)\"array\"===t||\"nodebuffer\"===t?n.push(String.fromCharCode.apply(null,e.slice(i,Math.min(i+r,s)))):n.push(String.fromCharCode.apply(null,e.subarray(i,Math.min(i+r,s)))),i+=r;return n.join(\"\")},stringifyByChar:function(e){for(var t=\"\",r=0;r<e.length;r++)t+=String.fromCharCode(e[r]);return t},applyCanBeUsed:{uint8array:function(){try{return o.uint8array&&1===String.fromCharCode.apply(null,new Uint8Array(1)).length}catch(e){return!1}}(),nodebuffer:function(){try{return o.nodebuffer&&1===String.fromCharCode.apply(null,r.allocBuffer(1)).length}catch(e){return!1}}()}};function s(e){var t=65536,r=a.getTypeOf(e),n=!0;if(\"uint8array\"===r?n=i.applyCanBeUsed.uint8array:\"nodebuffer\"===r&&(n=i.applyCanBeUsed.nodebuffer),n)for(;1<t;)try{return i.stringifyByChunk(e,r,t)}catch(e){t=Math.floor(t/2)}return i.stringifyByChar(e)}function f(e,t){for(var r=0;r<e.length;r++)t[r]=e[r];return t}a.applyFromCharCode=s;var c={};c.string={string:n,array:function(e){return l(e,new Array(e.length))},arraybuffer:function(e){return c.string.uint8array(e).buffer},uint8array:function(e){return l(e,new Uint8Array(e.length))},nodebuffer:function(e){return l(e,r.allocBuffer(e.length))}},c.array={string:s,array:n,arraybuffer:function(e){return new Uint8Array(e).buffer},uint8array:function(e){return new Uint8Array(e)},nodebuffer:function(e){return r.newBufferFrom(e)}},c.arraybuffer={string:function(e){return s(new Uint8Array(e))},array:function(e){return f(new Uint8Array(e),new Array(e.byteLength))},arraybuffer:n,uint8array:function(e){return new Uint8Array(e)},nodebuffer:function(e){return r.newBufferFrom(new Uint8Array(e))}},c.uint8array={string:s,array:function(e){return f(e,new Array(e.length))},arraybuffer:function(e){return e.buffer},uint8array:n,nodebuffer:function(e){return r.newBufferFrom(e)}},c.nodebuffer={string:s,array:function(e){return f(e,new Array(e.length))},arraybuffer:function(e){return c.nodebuffer.uint8array(e).buffer},uint8array:function(e){return f(e,new Uint8Array(e.length))},nodebuffer:n},a.transformTo=function(e,t){if(t=t||\"\",!e)return t;a.checkSupport(e);var r=a.getTypeOf(t);return c[r][e](t)},a.resolve=function(e){for(var t=e.split(\"/\"),r=[],n=0;n<t.length;n++){var i=t[n];\".\"===i||\"\"===i&&0!==n&&n!==t.length-1||(\"..\"===i?r.pop():r.push(i))}return r.join(\"/\")},a.getTypeOf=function(e){return\"string\"==typeof e?\"string\":\"[object Array]\"===Object.prototype.toString.call(e)?\"array\":o.nodebuffer&&r.isBuffer(e)?\"nodebuffer\":o.uint8array&&e instanceof Uint8Array?\"uint8array\":o.arraybuffer&&e instanceof ArrayBuffer?\"arraybuffer\":void 0},a.checkSupport=function(e){if(!o[e.toLowerCase()])throw new Error(e+\" is not supported by this platform\")},a.MAX_VALUE_16BITS=65535,a.MAX_VALUE_32BITS=-1,a.pretty=function(e){var t,r,n=\"\";for(r=0;r<(e||\"\").length;r++)n+=\"\\\\x\"+((t=e.charCodeAt(r))<16?\"0\":\"\")+t.toString(16).toUpperCase();return n},a.delay=function(e,t,r){setImmediate(function(){e.apply(r||null,t||[])})},a.inherits=function(e,t){function r(){}r.prototype=t.prototype,e.prototype=new r},a.extend=function(){var e,t,r={};for(e=0;e<arguments.length;e++)for(t in arguments[e])Object.prototype.hasOwnProperty.call(arguments[e],t)&&void 0===r[t]&&(r[t]=arguments[e][t]);return r},a.prepareContent=function(r,e,n,i,s){return u.Promise.resolve(e).then(function(n){return o.blob&&(n instanceof Blob||-1!==[\"[object File]\",\"[object Blob]\"].indexOf(Object.prototype.toString.call(n)))&&\"undefined\"!=typeof FileReader?new u.Promise(function(t,r){var e=new FileReader;e.onload=function(e){t(e.target.result)},e.onerror=function(e){r(e.target.error)},e.readAsArrayBuffer(n)}):n}).then(function(e){var t=a.getTypeOf(e);return t?(\"arraybuffer\"===t?e=a.transformTo(\"uint8array\",e):\"string\"===t&&(s?e=h.decode(e):n&&!0!==i&&(e=function(e){return l(e,o.uint8array?new Uint8Array(e.length):new Array(e.length))}(e))),e):u.Promise.reject(new Error(\"Can't read the data of '\"+r+\"'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?\"))})}},{\"./base64\":1,\"./external\":6,\"./nodejsUtils\":14,\"./support\":30,setimmediate:54}],33:[function(e,t,r){\"use strict\";var n=e(\"./reader/readerFor\"),i=e(\"./utils\"),s=e(\"./signature\"),a=e(\"./zipEntry\"),o=e(\"./support\");function h(e){this.files=[],this.loadOptions=e}h.prototype={checkSignature:function(e){if(!this.reader.readAndCheckSignature(e)){this.reader.index-=4;var t=this.reader.readString(4);throw new Error(\"Corrupted zip or bug: unexpected signature (\"+i.pretty(t)+\", expected \"+i.pretty(e)+\")\")}},isSignature:function(e,t){var r=this.reader.index;this.reader.setIndex(e);var n=this.reader.readString(4)===t;return this.reader.setIndex(r),n},readBlockEndOfCentral:function(){this.diskNumber=this.reader.readInt(2),this.diskWithCentralDirStart=this.reader.readInt(2),this.centralDirRecordsOnThisDisk=this.reader.readInt(2),this.centralDirRecords=this.reader.readInt(2),this.centralDirSize=this.reader.readInt(4),this.centralDirOffset=this.reader.readInt(4),this.zipCommentLength=this.reader.readInt(2);var e=this.reader.readData(this.zipCommentLength),t=o.uint8array?\"uint8array\":\"array\",r=i.transformTo(t,e);this.zipComment=this.loadOptions.decodeFileName(r)},readBlockZip64EndOfCentral:function(){this.zip64EndOfCentralSize=this.reader.readInt(8),this.reader.skip(4),this.diskNumber=this.reader.readInt(4),this.diskWithCentralDirStart=this.reader.readInt(4),this.centralDirRecordsOnThisDisk=this.reader.readInt(8),this.centralDirRecords=this.reader.readInt(8),this.centralDirSize=this.reader.readInt(8),this.centralDirOffset=this.reader.readInt(8),this.zip64ExtensibleData={};for(var e,t,r,n=this.zip64EndOfCentralSize-44;0<n;)e=this.reader.readInt(2),t=this.reader.readInt(4),r=this.reader.readData(t),this.zip64ExtensibleData[e]={id:e,length:t,value:r}},readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),1<this.disksCount)throw new Error(\"Multi-volumes zip are not supported\")},readLocalFiles:function(){var e,t;for(e=0;e<this.files.length;e++)t=this.files[e],this.reader.setIndex(t.localHeaderOffset),this.checkSignature(s.LOCAL_FILE_HEADER),t.readLocalPart(this.reader),t.handleUTF8(),t.processAttributes()},readCentralDir:function(){var e;for(this.reader.setIndex(this.centralDirOffset);this.reader.readAndCheckSignature(s.CENTRAL_FILE_HEADER);)(e=new a({zip64:this.zip64},this.loadOptions)).readCentralPart(this.reader),this.files.push(e);if(this.centralDirRecords!==this.files.length&&0!==this.centralDirRecords&&0===this.files.length)throw new Error(\"Corrupted zip or bug: expected \"+this.centralDirRecords+\" records in central dir, got \"+this.files.length)},readEndOfCentral:function(){var e=this.reader.lastIndexOfSignature(s.CENTRAL_DIRECTORY_END);if(e<0)throw!this.isSignature(0,s.LOCAL_FILE_HEADER)?new Error(\"Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html\"):new Error(\"Corrupted zip: can't find end of central directory\");this.reader.setIndex(e);var t=e;if(this.checkSignature(s.CENTRAL_DIRECTORY_END),this.readBlockEndOfCentral(),this.diskNumber===i.MAX_VALUE_16BITS||this.diskWithCentralDirStart===i.MAX_VALUE_16BITS||this.centralDirRecordsOnThisDisk===i.MAX_VALUE_16BITS||this.centralDirRecords===i.MAX_VALUE_16BITS||this.centralDirSize===i.MAX_VALUE_32BITS||this.centralDirOffset===i.MAX_VALUE_32BITS){if(this.zip64=!0,(e=this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR))<0)throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory locator\");if(this.reader.setIndex(e),this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR),this.readBlockZip64EndOfCentralLocator(),!this.isSignature(this.relativeOffsetEndOfZip64CentralDir,s.ZIP64_CENTRAL_DIRECTORY_END)&&(this.relativeOffsetEndOfZip64CentralDir=this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_END),this.relativeOffsetEndOfZip64CentralDir<0))throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory\");this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir),this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_END),this.readBlockZip64EndOfCentral()}var r=this.centralDirOffset+this.centralDirSize;this.zip64&&(r+=20,r+=12+this.zip64EndOfCentralSize);var n=t-r;if(0<n)this.isSignature(t,s.CENTRAL_FILE_HEADER)||(this.reader.zero=n);else if(n<0)throw new Error(\"Corrupted zip: missing \"+Math.abs(n)+\" bytes.\")},prepareReader:function(e){this.reader=n(e)},load:function(e){this.prepareReader(e),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},t.exports=h},{\"./reader/readerFor\":22,\"./signature\":23,\"./support\":30,\"./utils\":32,\"./zipEntry\":34}],34:[function(e,t,r){\"use strict\";var n=e(\"./reader/readerFor\"),s=e(\"./utils\"),i=e(\"./compressedObject\"),a=e(\"./crc32\"),o=e(\"./utf8\"),h=e(\"./compressions\"),u=e(\"./support\");function l(e,t){this.options=e,this.loadOptions=t}l.prototype={isEncrypted:function(){return 1==(1&this.bitFlag)},useUTF8:function(){return 2048==(2048&this.bitFlag)},readLocalPart:function(e){var t,r;if(e.skip(22),this.fileNameLength=e.readInt(2),r=e.readInt(2),this.fileName=e.readData(this.fileNameLength),e.skip(r),-1===this.compressedSize||-1===this.uncompressedSize)throw new Error(\"Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)\");if(null===(t=function(e){for(var t in h)if(Object.prototype.hasOwnProperty.call(h,t)&&h[t].magic===e)return h[t];return null}(this.compressionMethod)))throw new Error(\"Corrupted zip : compression \"+s.pretty(this.compressionMethod)+\" unknown (inner file : \"+s.transformTo(\"string\",this.fileName)+\")\");this.decompressed=new i(this.compressedSize,this.uncompressedSize,this.crc32,t,e.readData(this.compressedSize))},readCentralPart:function(e){this.versionMadeBy=e.readInt(2),e.skip(2),this.bitFlag=e.readInt(2),this.compressionMethod=e.readString(2),this.date=e.readDate(),this.crc32=e.readInt(4),this.compressedSize=e.readInt(4),this.uncompressedSize=e.readInt(4);var t=e.readInt(2);if(this.extraFieldsLength=e.readInt(2),this.fileCommentLength=e.readInt(2),this.diskNumberStart=e.readInt(2),this.internalFileAttributes=e.readInt(2),this.externalFileAttributes=e.readInt(4),this.localHeaderOffset=e.readInt(4),this.isEncrypted())throw new Error(\"Encrypted zip are not supported\");e.skip(t),this.readExtraFields(e),this.parseZIP64ExtraField(e),this.fileComment=e.readData(this.fileCommentLength)},processAttributes:function(){this.unixPermissions=null,this.dosPermissions=null;var e=this.versionMadeBy>>8;this.dir=!!(16&this.externalFileAttributes),0==e&&(this.dosPermissions=63&this.externalFileAttributes),3==e&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||\"/\"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var e=n(this.extraFields[1].value);this.uncompressedSize===s.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===s.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===s.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===s.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(e){var t,r,n,i=e.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});e.index+4<i;)t=e.readInt(2),r=e.readInt(2),n=e.readData(r),this.extraFields[t]={id:t,length:r,value:n};e.setIndex(i)},handleUTF8:function(){var e=u.uint8array?\"uint8array\":\"array\";if(this.useUTF8())this.fileNameStr=o.utf8decode(this.fileName),this.fileCommentStr=o.utf8decode(this.fileComment);else{var t=this.findExtraFieldUnicodePath();if(null!==t)this.fileNameStr=t;else{var r=s.transformTo(e,this.fileName);this.fileNameStr=this.loadOptions.decodeFileName(r)}var n=this.findExtraFieldUnicodeComment();if(null!==n)this.fileCommentStr=n;else{var i=s.transformTo(e,this.fileComment);this.fileCommentStr=this.loadOptions.decodeFileName(i)}}},findExtraFieldUnicodePath:function(){var e=this.extraFields[28789];if(e){var t=n(e.value);return 1!==t.readInt(1)?null:a(this.fileName)!==t.readInt(4)?null:o.utf8decode(t.readData(e.length-5))}return null},findExtraFieldUnicodeComment:function(){var e=this.extraFields[25461];if(e){var t=n(e.value);return 1!==t.readInt(1)?null:a(this.fileComment)!==t.readInt(4)?null:o.utf8decode(t.readData(e.length-5))}return null}},t.exports=l},{\"./compressedObject\":2,\"./compressions\":3,\"./crc32\":4,\"./reader/readerFor\":22,\"./support\":30,\"./utf8\":31,\"./utils\":32}],35:[function(e,t,r){\"use strict\";function n(e,t,r){this.name=e,this.dir=r.dir,this.date=r.date,this.comment=r.comment,this.unixPermissions=r.unixPermissions,this.dosPermissions=r.dosPermissions,this._data=t,this._dataBinary=r.binary,this.options={compression:r.compression,compressionOptions:r.compressionOptions}}var s=e(\"./stream/StreamHelper\"),i=e(\"./stream/DataWorker\"),a=e(\"./utf8\"),o=e(\"./compressedObject\"),h=e(\"./stream/GenericWorker\");n.prototype={internalStream:function(e){var t=null,r=\"string\";try{if(!e)throw new Error(\"No output type specified.\");var n=\"string\"===(r=e.toLowerCase())||\"text\"===r;\"binarystring\"!==r&&\"text\"!==r||(r=\"string\"),t=this._decompressWorker();var i=!this._dataBinary;i&&!n&&(t=t.pipe(new a.Utf8EncodeWorker)),!i&&n&&(t=t.pipe(new a.Utf8DecodeWorker))}catch(e){(t=new h(\"error\")).error(e)}return new s(t,r,\"\")},async:function(e,t){return this.internalStream(e).accumulate(t)},nodeStream:function(e,t){return this.internalStream(e||\"nodebuffer\").toNodejsStream(t)},_compressWorker:function(e,t){if(this._data instanceof o&&this._data.compression.magic===e.magic)return this._data.getCompressedWorker();var r=this._decompressWorker();return this._dataBinary||(r=r.pipe(new a.Utf8EncodeWorker)),o.createWorkerFrom(r,e,t)},_decompressWorker:function(){return this._data instanceof o?this._data.getContentWorker():this._data instanceof h?this._data:new i(this._data)}};for(var u=[\"asText\",\"asBinary\",\"asNodeBuffer\",\"asUint8Array\",\"asArrayBuffer\"],l=function(){throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\")},f=0;f<u.length;f++)n.prototype[u[f]]=l;t.exports=n},{\"./compressedObject\":2,\"./stream/DataWorker\":27,\"./stream/GenericWorker\":28,\"./stream/StreamHelper\":29,\"./utf8\":31}],36:[function(e,l,t){(function(t){\"use strict\";var r,n,e=t.MutationObserver||t.WebKitMutationObserver;if(e){var i=0,s=new e(u),a=t.document.createTextNode(\"\");s.observe(a,{characterData:!0}),r=function(){a.data=i=++i%2}}else if(t.setImmediate||void 0===t.MessageChannel)r=\"document\"in t&&\"onreadystatechange\"in t.document.createElement(\"script\")?function(){var e=t.document.createElement(\"script\");e.onreadystatechange=function(){u(),e.onreadystatechange=null,e.parentNode.removeChild(e),e=null},t.document.documentElement.appendChild(e)}:function(){setTimeout(u,0)};else{var o=new t.MessageChannel;o.port1.onmessage=u,r=function(){o.port2.postMessage(0)}}var h=[];function u(){var e,t;n=!0;for(var r=h.length;r;){for(t=h,h=[],e=-1;++e<r;)t[e]();r=h.length}n=!1}l.exports=function(e){1!==h.push(e)||n||r()}}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}],37:[function(e,t,r){\"use strict\";var i=e(\"immediate\");function u(){}var l={},s=[\"REJECTED\"],a=[\"FULFILLED\"],n=[\"PENDING\"];function o(e){if(\"function\"!=typeof e)throw new TypeError(\"resolver must be a function\");this.state=n,this.queue=[],this.outcome=void 0,e!==u&&d(this,e)}function h(e,t,r){this.promise=e,\"function\"==typeof t&&(this.onFulfilled=t,this.callFulfilled=this.otherCallFulfilled),\"function\"==typeof r&&(this.onRejected=r,this.callRejected=this.otherCallRejected)}function f(t,r,n){i(function(){var e;try{e=r(n)}catch(e){return l.reject(t,e)}e===t?l.reject(t,new TypeError(\"Cannot resolve promise with itself\")):l.resolve(t,e)})}function c(e){var t=e&&e.then;if(e&&(\"object\"==typeof e||\"function\"==typeof e)&&\"function\"==typeof t)return function(){t.apply(e,arguments)}}function d(t,e){var r=!1;function n(e){r||(r=!0,l.reject(t,e))}function i(e){r||(r=!0,l.resolve(t,e))}var s=p(function(){e(i,n)});\"error\"===s.status&&n(s.value)}function p(e,t){var r={};try{r.value=e(t),r.status=\"success\"}catch(e){r.status=\"error\",r.value=e}return r}(t.exports=o).prototype.finally=function(t){if(\"function\"!=typeof t)return this;var r=this.constructor;return this.then(function(e){return r.resolve(t()).then(function(){return e})},function(e){return r.resolve(t()).then(function(){throw e})})},o.prototype.catch=function(e){return this.then(null,e)},o.prototype.then=function(e,t){if(\"function\"!=typeof e&&this.state===a||\"function\"!=typeof t&&this.state===s)return this;var r=new this.constructor(u);this.state!==n?f(r,this.state===a?e:t,this.outcome):this.queue.push(new h(r,e,t));return r},h.prototype.callFulfilled=function(e){l.resolve(this.promise,e)},h.prototype.otherCallFulfilled=function(e){f(this.promise,this.onFulfilled,e)},h.prototype.callRejected=function(e){l.reject(this.promise,e)},h.prototype.otherCallRejected=function(e){f(this.promise,this.onRejected,e)},l.resolve=function(e,t){var r=p(c,t);if(\"error\"===r.status)return l.reject(e,r.value);var n=r.value;if(n)d(e,n);else{e.state=a,e.outcome=t;for(var i=-1,s=e.queue.length;++i<s;)e.queue[i].callFulfilled(t)}return e},l.reject=function(e,t){e.state=s,e.outcome=t;for(var r=-1,n=e.queue.length;++r<n;)e.queue[r].callRejected(t);return e},o.resolve=function(e){if(e instanceof this)return e;return l.resolve(new this(u),e)},o.reject=function(e){var t=new this(u);return l.reject(t,e)},o.all=function(e){var r=this;if(\"[object Array]\"!==Object.prototype.toString.call(e))return this.reject(new TypeError(\"must be an array\"));var n=e.length,i=!1;if(!n)return this.resolve([]);var s=new Array(n),a=0,t=-1,o=new this(u);for(;++t<n;)h(e[t],t);return o;function h(e,t){r.resolve(e).then(function(e){s[t]=e,++a!==n||i||(i=!0,l.resolve(o,s))},function(e){i||(i=!0,l.reject(o,e))})}},o.race=function(e){var t=this;if(\"[object Array]\"!==Object.prototype.toString.call(e))return this.reject(new TypeError(\"must be an array\"));var r=e.length,n=!1;if(!r)return this.resolve([]);var i=-1,s=new this(u);for(;++i<r;)a=e[i],t.resolve(a).then(function(e){n||(n=!0,l.resolve(s,e))},function(e){n||(n=!0,l.reject(s,e))});var a;return s}},{immediate:36}],38:[function(e,t,r){\"use strict\";var n={};(0,e(\"./lib/utils/common\").assign)(n,e(\"./lib/deflate\"),e(\"./lib/inflate\"),e(\"./lib/zlib/constants\")),t.exports=n},{\"./lib/deflate\":39,\"./lib/inflate\":40,\"./lib/utils/common\":41,\"./lib/zlib/constants\":44}],39:[function(e,t,r){\"use strict\";var a=e(\"./zlib/deflate\"),o=e(\"./utils/common\"),h=e(\"./utils/strings\"),i=e(\"./zlib/messages\"),s=e(\"./zlib/zstream\"),u=Object.prototype.toString,l=0,f=-1,c=0,d=8;function p(e){if(!(this instanceof p))return new p(e);this.options=o.assign({level:f,method:d,chunkSize:16384,windowBits:15,memLevel:8,strategy:c,to:\"\"},e||{});var t=this.options;t.raw&&0<t.windowBits?t.windowBits=-t.windowBits:t.gzip&&0<t.windowBits&&t.windowBits<16&&(t.windowBits+=16),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new s,this.strm.avail_out=0;var r=a.deflateInit2(this.strm,t.level,t.method,t.windowBits,t.memLevel,t.strategy);if(r!==l)throw new Error(i[r]);if(t.header&&a.deflateSetHeader(this.strm,t.header),t.dictionary){var n;if(n=\"string\"==typeof t.dictionary?h.string2buf(t.dictionary):\"[object ArrayBuffer]\"===u.call(t.dictionary)?new Uint8Array(t.dictionary):t.dictionary,(r=a.deflateSetDictionary(this.strm,n))!==l)throw new Error(i[r]);this._dict_set=!0}}function n(e,t){var r=new p(t);if(r.push(e,!0),r.err)throw r.msg||i[r.err];return r.result}p.prototype.push=function(e,t){var r,n,i=this.strm,s=this.options.chunkSize;if(this.ended)return!1;n=t===~~t?t:!0===t?4:0,\"string\"==typeof e?i.input=h.string2buf(e):\"[object ArrayBuffer]\"===u.call(e)?i.input=new Uint8Array(e):i.input=e,i.next_in=0,i.avail_in=i.input.length;do{if(0===i.avail_out&&(i.output=new o.Buf8(s),i.next_out=0,i.avail_out=s),1!==(r=a.deflate(i,n))&&r!==l)return this.onEnd(r),!(this.ended=!0);0!==i.avail_out&&(0!==i.avail_in||4!==n&&2!==n)||(\"string\"===this.options.to?this.onData(h.buf2binstring(o.shrinkBuf(i.output,i.next_out))):this.onData(o.shrinkBuf(i.output,i.next_out)))}while((0<i.avail_in||0===i.avail_out)&&1!==r);return 4===n?(r=a.deflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===l):2!==n||(this.onEnd(l),!(i.avail_out=0))},p.prototype.onData=function(e){this.chunks.push(e)},p.prototype.onEnd=function(e){e===l&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=o.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Deflate=p,r.deflate=n,r.deflateRaw=function(e,t){return(t=t||{}).raw=!0,n(e,t)},r.gzip=function(e,t){return(t=t||{}).gzip=!0,n(e,t)}},{\"./utils/common\":41,\"./utils/strings\":42,\"./zlib/deflate\":46,\"./zlib/messages\":51,\"./zlib/zstream\":53}],40:[function(e,t,r){\"use strict\";var c=e(\"./zlib/inflate\"),d=e(\"./utils/common\"),p=e(\"./utils/strings\"),m=e(\"./zlib/constants\"),n=e(\"./zlib/messages\"),i=e(\"./zlib/zstream\"),s=e(\"./zlib/gzheader\"),_=Object.prototype.toString;function a(e){if(!(this instanceof a))return new a(e);this.options=d.assign({chunkSize:16384,windowBits:0,to:\"\"},e||{});var t=this.options;t.raw&&0<=t.windowBits&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(0<=t.windowBits&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),15<t.windowBits&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new i,this.strm.avail_out=0;var r=c.inflateInit2(this.strm,t.windowBits);if(r!==m.Z_OK)throw new Error(n[r]);this.header=new s,c.inflateGetHeader(this.strm,this.header)}function o(e,t){var r=new a(t);if(r.push(e,!0),r.err)throw r.msg||n[r.err];return r.result}a.prototype.push=function(e,t){var r,n,i,s,a,o,h=this.strm,u=this.options.chunkSize,l=this.options.dictionary,f=!1;if(this.ended)return!1;n=t===~~t?t:!0===t?m.Z_FINISH:m.Z_NO_FLUSH,\"string\"==typeof e?h.input=p.binstring2buf(e):\"[object ArrayBuffer]\"===_.call(e)?h.input=new Uint8Array(e):h.input=e,h.next_in=0,h.avail_in=h.input.length;do{if(0===h.avail_out&&(h.output=new d.Buf8(u),h.next_out=0,h.avail_out=u),(r=c.inflate(h,m.Z_NO_FLUSH))===m.Z_NEED_DICT&&l&&(o=\"string\"==typeof l?p.string2buf(l):\"[object ArrayBuffer]\"===_.call(l)?new Uint8Array(l):l,r=c.inflateSetDictionary(this.strm,o)),r===m.Z_BUF_ERROR&&!0===f&&(r=m.Z_OK,f=!1),r!==m.Z_STREAM_END&&r!==m.Z_OK)return this.onEnd(r),!(this.ended=!0);h.next_out&&(0!==h.avail_out&&r!==m.Z_STREAM_END&&(0!==h.avail_in||n!==m.Z_FINISH&&n!==m.Z_SYNC_FLUSH)||(\"string\"===this.options.to?(i=p.utf8border(h.output,h.next_out),s=h.next_out-i,a=p.buf2string(h.output,i),h.next_out=s,h.avail_out=u-s,s&&d.arraySet(h.output,h.output,i,s,0),this.onData(a)):this.onData(d.shrinkBuf(h.output,h.next_out)))),0===h.avail_in&&0===h.avail_out&&(f=!0)}while((0<h.avail_in||0===h.avail_out)&&r!==m.Z_STREAM_END);return r===m.Z_STREAM_END&&(n=m.Z_FINISH),n===m.Z_FINISH?(r=c.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===m.Z_OK):n!==m.Z_SYNC_FLUSH||(this.onEnd(m.Z_OK),!(h.avail_out=0))},a.prototype.onData=function(e){this.chunks.push(e)},a.prototype.onEnd=function(e){e===m.Z_OK&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=d.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Inflate=a,r.inflate=o,r.inflateRaw=function(e,t){return(t=t||{}).raw=!0,o(e,t)},r.ungzip=o},{\"./utils/common\":41,\"./utils/strings\":42,\"./zlib/constants\":44,\"./zlib/gzheader\":47,\"./zlib/inflate\":49,\"./zlib/messages\":51,\"./zlib/zstream\":53}],41:[function(e,t,r){\"use strict\";var n=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Int32Array;r.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var r=t.shift();if(r){if(\"object\"!=typeof r)throw new TypeError(r+\"must be non-object\");for(var n in r)r.hasOwnProperty(n)&&(e[n]=r[n])}}return e},r.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var i={arraySet:function(e,t,r,n,i){if(t.subarray&&e.subarray)e.set(t.subarray(r,r+n),i);else for(var s=0;s<n;s++)e[i+s]=t[r+s]},flattenChunks:function(e){var t,r,n,i,s,a;for(t=n=0,r=e.length;t<r;t++)n+=e[t].length;for(a=new Uint8Array(n),t=i=0,r=e.length;t<r;t++)s=e[t],a.set(s,i),i+=s.length;return a}},s={arraySet:function(e,t,r,n,i){for(var s=0;s<n;s++)e[i+s]=t[r+s]},flattenChunks:function(e){return[].concat.apply([],e)}};r.setTyped=function(e){e?(r.Buf8=Uint8Array,r.Buf16=Uint16Array,r.Buf32=Int32Array,r.assign(r,i)):(r.Buf8=Array,r.Buf16=Array,r.Buf32=Array,r.assign(r,s))},r.setTyped(n)},{}],42:[function(e,t,r){\"use strict\";var h=e(\"./common\"),i=!0,s=!0;try{String.fromCharCode.apply(null,[0])}catch(e){i=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){s=!1}for(var u=new h.Buf8(256),n=0;n<256;n++)u[n]=252<=n?6:248<=n?5:240<=n?4:224<=n?3:192<=n?2:1;function l(e,t){if(t<65537&&(e.subarray&&s||!e.subarray&&i))return String.fromCharCode.apply(null,h.shrinkBuf(e,t));for(var r=\"\",n=0;n<t;n++)r+=String.fromCharCode(e[n]);return r}u[254]=u[254]=1,r.string2buf=function(e){var t,r,n,i,s,a=e.length,o=0;for(i=0;i<a;i++)55296==(64512&(r=e.charCodeAt(i)))&&i+1<a&&56320==(64512&(n=e.charCodeAt(i+1)))&&(r=65536+(r-55296<<10)+(n-56320),i++),o+=r<128?1:r<2048?2:r<65536?3:4;for(t=new h.Buf8(o),i=s=0;s<o;i++)55296==(64512&(r=e.charCodeAt(i)))&&i+1<a&&56320==(64512&(n=e.charCodeAt(i+1)))&&(r=65536+(r-55296<<10)+(n-56320),i++),r<128?t[s++]=r:(r<2048?t[s++]=192|r>>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t},r.buf2binstring=function(e){return l(e,e.length)},r.binstring2buf=function(e){for(var t=new h.Buf8(e.length),r=0,n=t.length;r<n;r++)t[r]=e.charCodeAt(r);return t},r.buf2string=function(e,t){var r,n,i,s,a=t||e.length,o=new Array(2*a);for(r=n=0;r<a;)if((i=e[r++])<128)o[n++]=i;else if(4<(s=u[i]))o[n++]=65533,r+=s-1;else{for(i&=2===s?31:3===s?15:7;1<s&&r<a;)i=i<<6|63&e[r++],s--;1<s?o[n++]=65533:i<65536?o[n++]=i:(i-=65536,o[n++]=55296|i>>10&1023,o[n++]=56320|1023&i)}return l(o,n)},r.utf8border=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+u[e[r]]>t?r:t}},{\"./common\":41}],43:[function(e,t,r){\"use strict\";t.exports=function(e,t,r,n){for(var i=65535&e|0,s=e>>>16&65535|0,a=0;0!==r;){for(r-=a=2e3<r?2e3:r;s=s+(i=i+t[n++]|0)|0,--a;);i%=65521,s%=65521}return i|s<<16|0}},{}],44:[function(e,t,r){\"use strict\";t.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],45:[function(e,t,r){\"use strict\";var o=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a<s;a++)e=e>>>8^i[255&(e^t[a])];return-1^e}},{}],46:[function(e,t,r){\"use strict\";var h,c=e(\"../utils/common\"),u=e(\"./trees\"),d=e(\"./adler32\"),p=e(\"./crc32\"),n=e(\"./messages\"),l=0,f=4,m=0,_=-2,g=-1,b=4,i=2,v=8,y=9,s=286,a=30,o=19,w=2*s+1,k=15,x=3,S=258,z=S+x+1,C=42,E=113,A=1,I=2,O=3,B=4;function R(e,t){return e.msg=n[t],t}function T(e){return(e<<1)-(4<e?9:0)}function D(e){for(var t=e.length;0<=--t;)e[t]=0}function F(e){var t=e.state,r=t.pending;r>e.avail_out&&(r=e.avail_out),0!==r&&(c.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function N(e,t){u._tr_flush_block(e,0<=e.block_start?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,F(e.strm)}function U(e,t){e.pending_buf[e.pending++]=t}function P(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function L(e,t){var r,n,i=e.max_chain_length,s=e.strstart,a=e.prev_length,o=e.nice_match,h=e.strstart>e.w_size-z?e.strstart-(e.w_size-z):0,u=e.window,l=e.w_mask,f=e.prev,c=e.strstart+S,d=u[s+a-1],p=u[s+a];e.prev_length>=e.good_match&&(i>>=2),o>e.lookahead&&(o=e.lookahead);do{if(u[(r=t)+a]===p&&u[r+a-1]===d&&u[r]===u[s]&&u[++r]===u[s+1]){s+=2,r++;do{}while(u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&s<c);if(n=S-(c-s),s=c-S,a<n){if(e.match_start=t,o<=(a=n))break;d=u[s+a-1],p=u[s+a]}}}while((t=f[t&l])>h&&0!=--i);return a<=e.lookahead?a:e.lookahead}function j(e){var t,r,n,i,s,a,o,h,u,l,f=e.w_size;do{if(i=e.window_size-e.lookahead-e.strstart,e.strstart>=f+(f-z)){for(c.arraySet(e.window,e.window,f,f,0),e.match_start-=f,e.strstart-=f,e.block_start-=f,t=r=e.hash_size;n=e.head[--t],e.head[t]=f<=n?n-f:0,--r;);for(t=r=f;n=e.prev[--t],e.prev[t]=f<=n?n-f:0,--r;);i+=f}if(0===e.strm.avail_in)break;if(a=e.strm,o=e.window,h=e.strstart+e.lookahead,u=i,l=void 0,l=a.avail_in,u<l&&(l=u),r=0===l?0:(a.avail_in-=l,c.arraySet(o,a.input,a.next_in,l,h),1===a.state.wrap?a.adler=d(a.adler,o,l,h):2===a.state.wrap&&(a.adler=p(a.adler,o,l,h)),a.next_in+=l,a.total_in+=l,l),e.lookahead+=r,e.lookahead+e.insert>=x)for(s=e.strstart-e.insert,e.ins_h=e.window[s],e.ins_h=(e.ins_h<<e.hash_shift^e.window[s+1])&e.hash_mask;e.insert&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[s+x-1])&e.hash_mask,e.prev[s&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=s,s++,e.insert--,!(e.lookahead+e.insert<x)););}while(e.lookahead<z&&0!==e.strm.avail_in)}function Z(e,t){for(var r,n;;){if(e.lookahead<z){if(j(e),e.lookahead<z&&t===l)return A;if(0===e.lookahead)break}if(r=0,e.lookahead>=x&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+x-1])&e.hash_mask,r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),0!==r&&e.strstart-r<=e.w_size-z&&(e.match_length=L(e,r)),e.match_length>=x)if(n=u._tr_tally(e,e.strstart-e.match_start,e.match_length-x),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=x){for(e.match_length--;e.strstart++,e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+x-1])&e.hash_mask,r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart,0!=--e.match_length;);e.strstart++}else e.strstart+=e.match_length,e.match_length=0,e.ins_h=e.window[e.strstart],e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+1])&e.hash_mask;else n=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++;if(n&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=e.strstart<x-1?e.strstart:x-1,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}function W(e,t){for(var r,n,i;;){if(e.lookahead<z){if(j(e),e.lookahead<z&&t===l)return A;if(0===e.lookahead)break}if(r=0,e.lookahead>=x&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+x-1])&e.hash_mask,r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),e.prev_length=e.match_length,e.prev_match=e.match_start,e.match_length=x-1,0!==r&&e.prev_length<e.max_lazy_match&&e.strstart-r<=e.w_size-z&&(e.match_length=L(e,r),e.match_length<=5&&(1===e.strategy||e.match_length===x&&4096<e.strstart-e.match_start)&&(e.match_length=x-1)),e.prev_length>=x&&e.match_length<=e.prev_length){for(i=e.strstart+e.lookahead-x,n=u._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-x),e.lookahead-=e.prev_length-1,e.prev_length-=2;++e.strstart<=i&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+x-1])&e.hash_mask,r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),0!=--e.prev_length;);if(e.match_available=0,e.match_length=x-1,e.strstart++,n&&(N(e,!1),0===e.strm.avail_out))return A}else if(e.match_available){if((n=u._tr_tally(e,0,e.window[e.strstart-1]))&&N(e,!1),e.strstart++,e.lookahead--,0===e.strm.avail_out)return A}else e.match_available=1,e.strstart++,e.lookahead--}return e.match_available&&(n=u._tr_tally(e,0,e.window[e.strstart-1]),e.match_available=0),e.insert=e.strstart<x-1?e.strstart:x-1,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}function M(e,t,r,n,i){this.good_length=e,this.max_lazy=t,this.nice_length=r,this.max_chain=n,this.func=i}function H(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=v,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new c.Buf16(2*w),this.dyn_dtree=new c.Buf16(2*(2*a+1)),this.bl_tree=new c.Buf16(2*(2*o+1)),D(this.dyn_ltree),D(this.dyn_dtree),D(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new c.Buf16(k+1),this.heap=new c.Buf16(2*s+1),D(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new c.Buf16(2*s+1),D(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function G(e){var t;return e&&e.state?(e.total_in=e.total_out=0,e.data_type=i,(t=e.state).pending=0,t.pending_out=0,t.wrap<0&&(t.wrap=-t.wrap),t.status=t.wrap?C:E,e.adler=2===t.wrap?0:1,t.last_flush=l,u._tr_init(t),m):R(e,_)}function K(e){var t=G(e);return t===m&&function(e){e.window_size=2*e.w_size,D(e.head),e.max_lazy_match=h[e.level].max_lazy,e.good_match=h[e.level].good_length,e.nice_match=h[e.level].nice_length,e.max_chain_length=h[e.level].max_chain,e.strstart=0,e.block_start=0,e.lookahead=0,e.insert=0,e.match_length=e.prev_length=x-1,e.match_available=0,e.ins_h=0}(e.state),t}function Y(e,t,r,n,i,s){if(!e)return _;var a=1;if(t===g&&(t=6),n<0?(a=0,n=-n):15<n&&(a=2,n-=16),i<1||y<i||r!==v||n<8||15<n||t<0||9<t||s<0||b<s)return R(e,_);8===n&&(n=9);var o=new H;return(e.state=o).strm=e,o.wrap=a,o.gzhead=null,o.w_bits=n,o.w_size=1<<o.w_bits,o.w_mask=o.w_size-1,o.hash_bits=i+7,o.hash_size=1<<o.hash_bits,o.hash_mask=o.hash_size-1,o.hash_shift=~~((o.hash_bits+x-1)/x),o.window=new c.Buf8(2*o.w_size),o.head=new c.Buf16(o.hash_size),o.prev=new c.Buf16(o.w_size),o.lit_bufsize=1<<i+6,o.pending_buf_size=4*o.lit_bufsize,o.pending_buf=new c.Buf8(o.pending_buf_size),o.d_buf=1*o.lit_bufsize,o.l_buf=3*o.lit_bufsize,o.level=t,o.strategy=s,o.method=r,K(e)}h=[new M(0,0,0,0,function(e,t){var r=65535;for(r>e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(j(e),0===e.lookahead&&t===l)return A;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,N(e,!1),0===e.strm.avail_out))return A;if(e.strstart-e.block_start>=e.w_size-z&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):(e.strstart>e.block_start&&(N(e,!1),e.strm.avail_out),A)}),new M(4,4,8,4,Z),new M(4,5,16,8,Z),new M(4,6,32,32,Z),new M(4,4,16,16,W),new M(8,16,32,32,W),new M(8,16,128,128,W),new M(8,32,128,256,W),new M(32,128,258,1024,W),new M(32,258,258,4096,W)],r.deflateInit=function(e,t){return Y(e,t,v,15,8,0)},r.deflateInit2=Y,r.deflateReset=K,r.deflateResetKeep=G,r.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?_:(e.state.gzhead=t,m):_},r.deflate=function(e,t){var r,n,i,s;if(!e||!e.state||5<t||t<0)return e?R(e,_):_;if(n=e.state,!e.output||!e.input&&0!==e.avail_in||666===n.status&&t!==f)return R(e,0===e.avail_out?-5:_);if(n.strm=e,r=n.last_flush,n.last_flush=t,n.status===C)if(2===n.wrap)e.adler=0,U(n,31),U(n,139),U(n,8),n.gzhead?(U(n,(n.gzhead.text?1:0)+(n.gzhead.hcrc?2:0)+(n.gzhead.extra?4:0)+(n.gzhead.name?8:0)+(n.gzhead.comment?16:0)),U(n,255&n.gzhead.time),U(n,n.gzhead.time>>8&255),U(n,n.gzhead.time>>16&255),U(n,n.gzhead.time>>24&255),U(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),U(n,255&n.gzhead.os),n.gzhead.extra&&n.gzhead.extra.length&&(U(n,255&n.gzhead.extra.length),U(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(e.adler=p(e.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=69):(U(n,0),U(n,0),U(n,0),U(n,0),U(n,0),U(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),U(n,3),n.status=E);else{var a=v+(n.w_bits-8<<4)<<8;a|=(2<=n.strategy||n.level<2?0:n.level<6?1:6===n.level?2:3)<<6,0!==n.strstart&&(a|=32),a+=31-a%31,n.status=E,P(n,a),0!==n.strstart&&(P(n,e.adler>>>16),P(n,65535&e.adler)),e.adler=1}if(69===n.status)if(n.gzhead.extra){for(i=n.pending;n.gzindex<(65535&n.gzhead.extra.length)&&(n.pending!==n.pending_buf_size||(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending!==n.pending_buf_size));)U(n,255&n.gzhead.extra[n.gzindex]),n.gzindex++;n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),n.gzindex===n.gzhead.extra.length&&(n.gzindex=0,n.status=73)}else n.status=73;if(73===n.status)if(n.gzhead.name){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindex<n.gzhead.name.length?255&n.gzhead.name.charCodeAt(n.gzindex++):0,U(n,s)}while(0!==s);n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.gzindex=0,n.status=91)}else n.status=91;if(91===n.status)if(n.gzhead.comment){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindex<n.gzhead.comment.length?255&n.gzhead.comment.charCodeAt(n.gzindex++):0,U(n,s)}while(0!==s);n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.status=103)}else n.status=103;if(103===n.status&&(n.gzhead.hcrc?(n.pending+2>n.pending_buf_size&&F(e),n.pending+2<=n.pending_buf_size&&(U(n,255&e.adler),U(n,e.adler>>8&255),e.adler=0,n.status=E)):n.status=E),0!==n.pending){if(F(e),0===e.avail_out)return n.last_flush=-1,m}else if(0===e.avail_in&&T(t)<=T(r)&&t!==f)return R(e,-5);if(666===n.status&&0!==e.avail_in)return R(e,-5);if(0!==e.avail_in||0!==n.lookahead||t!==l&&666!==n.status){var o=2===n.strategy?function(e,t){for(var r;;){if(0===e.lookahead&&(j(e),0===e.lookahead)){if(t===l)return A;break}if(e.match_length=0,r=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(n,t):3===n.strategy?function(e,t){for(var r,n,i,s,a=e.window;;){if(e.lookahead<=S){if(j(e),e.lookahead<=S&&t===l)return A;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=x&&0<e.strstart&&(n=a[i=e.strstart-1])===a[++i]&&n===a[++i]&&n===a[++i]){s=e.strstart+S;do{}while(n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&i<s);e.match_length=S-(s-i),e.match_length>e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=x?(r=u._tr_tally(e,1,e.match_length-x),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(n,t):h[n.level].func(n,t);if(o!==O&&o!==B||(n.status=666),o===A||o===O)return 0===e.avail_out&&(n.last_flush=-1),m;if(o===I&&(1===t?u._tr_align(n):5!==t&&(u._tr_stored_block(n,0,0,!1),3===t&&(D(n.head),0===n.lookahead&&(n.strstart=0,n.block_start=0,n.insert=0))),F(e),0===e.avail_out))return n.last_flush=-1,m}return t!==f?m:n.wrap<=0?1:(2===n.wrap?(U(n,255&e.adler),U(n,e.adler>>8&255),U(n,e.adler>>16&255),U(n,e.adler>>24&255),U(n,255&e.total_in),U(n,e.total_in>>8&255),U(n,e.total_in>>16&255),U(n,e.total_in>>24&255)):(P(n,e.adler>>>16),P(n,65535&e.adler)),F(e),0<n.wrap&&(n.wrap=-n.wrap),0!==n.pending?m:1)},r.deflateEnd=function(e){var t;return e&&e.state?(t=e.state.status)!==C&&69!==t&&73!==t&&91!==t&&103!==t&&t!==E&&666!==t?R(e,_):(e.state=null,t===E?R(e,-3):m):_},r.deflateSetDictionary=function(e,t){var r,n,i,s,a,o,h,u,l=t.length;if(!e||!e.state)return _;if(2===(s=(r=e.state).wrap)||1===s&&r.status!==C||r.lookahead)return _;for(1===s&&(e.adler=d(e.adler,t,l,0)),r.wrap=0,l>=r.w_size&&(0===s&&(D(r.head),r.strstart=0,r.block_start=0,r.insert=0),u=new c.Buf8(r.w_size),c.arraySet(u,t,l-r.w_size,r.w_size,0),t=u,l=r.w_size),a=e.avail_in,o=e.next_in,h=e.input,e.avail_in=l,e.next_in=0,e.input=t,j(r);r.lookahead>=x;){for(n=r.strstart,i=r.lookahead-(x-1);r.ins_h=(r.ins_h<<r.hash_shift^r.window[n+x-1])&r.hash_mask,r.prev[n&r.w_mask]=r.head[r.ins_h],r.head[r.ins_h]=n,n++,--i;);r.strstart=n,r.lookahead=x-1,j(r)}return r.strstart+=r.lookahead,r.block_start=r.strstart,r.insert=r.lookahead,r.lookahead=0,r.match_length=r.prev_length=x-1,r.match_available=0,e.next_in=o,e.input=h,e.avail_in=a,r.wrap=s,m},r.deflateInfo=\"pako deflate (from Nodeca project)\"},{\"../utils/common\":41,\"./adler32\":43,\"./crc32\":45,\"./messages\":51,\"./trees\":52}],47:[function(e,t,r){\"use strict\";t.exports=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name=\"\",this.comment=\"\",this.hcrc=0,this.done=!1}},{}],48:[function(e,t,r){\"use strict\";t.exports=function(e,t){var r,n,i,s,a,o,h,u,l,f,c,d,p,m,_,g,b,v,y,w,k,x,S,z,C;r=e.state,n=e.next_in,z=e.input,i=n+(e.avail_in-5),s=e.next_out,C=e.output,a=s-(t-e.avail_out),o=s+(e.avail_out-257),h=r.dmax,u=r.wsize,l=r.whave,f=r.wnext,c=r.window,d=r.hold,p=r.bits,m=r.lencode,_=r.distcode,g=(1<<r.lenbits)-1,b=(1<<r.distbits)-1;e:do{p<15&&(d+=z[n++]<<p,p+=8,d+=z[n++]<<p,p+=8),v=m[d&g];t:for(;;){if(d>>>=y=v>>>24,p-=y,0===(y=v>>>16&255))C[s++]=65535&v;else{if(!(16&y)){if(0==(64&y)){v=m[(65535&v)+(d&(1<<y)-1)];continue t}if(32&y){r.mode=12;break e}e.msg=\"invalid literal/length code\",r.mode=30;break e}w=65535&v,(y&=15)&&(p<y&&(d+=z[n++]<<p,p+=8),w+=d&(1<<y)-1,d>>>=y,p-=y),p<15&&(d+=z[n++]<<p,p+=8,d+=z[n++]<<p,p+=8),v=_[d&b];r:for(;;){if(d>>>=y=v>>>24,p-=y,!(16&(y=v>>>16&255))){if(0==(64&y)){v=_[(65535&v)+(d&(1<<y)-1)];continue r}e.msg=\"invalid distance code\",r.mode=30;break e}if(k=65535&v,p<(y&=15)&&(d+=z[n++]<<p,(p+=8)<y&&(d+=z[n++]<<p,p+=8)),h<(k+=d&(1<<y)-1)){e.msg=\"invalid distance too far back\",r.mode=30;break e}if(d>>>=y,p-=y,(y=s-a)<k){if(l<(y=k-y)&&r.sane){e.msg=\"invalid distance too far back\",r.mode=30;break e}if(S=c,(x=0)===f){if(x+=u-y,y<w){for(w-=y;C[s++]=c[x++],--y;);x=s-k,S=C}}else if(f<y){if(x+=u+f-y,(y-=f)<w){for(w-=y;C[s++]=c[x++],--y;);if(x=0,f<w){for(w-=y=f;C[s++]=c[x++],--y;);x=s-k,S=C}}}else if(x+=f-y,y<w){for(w-=y;C[s++]=c[x++],--y;);x=s-k,S=C}for(;2<w;)C[s++]=S[x++],C[s++]=S[x++],C[s++]=S[x++],w-=3;w&&(C[s++]=S[x++],1<w&&(C[s++]=S[x++]))}else{for(x=s-k;C[s++]=C[x++],C[s++]=C[x++],C[s++]=C[x++],2<(w-=3););w&&(C[s++]=C[x++],1<w&&(C[s++]=C[x++]))}break}}break}}while(n<i&&s<o);n-=w=p>>3,d&=(1<<(p-=w<<3))-1,e.next_in=n,e.next_out=s,e.avail_in=n<i?i-n+5:5-(n-i),e.avail_out=s<o?o-s+257:257-(s-o),r.hold=d,r.bits=p}},{}],49:[function(e,t,r){\"use strict\";var I=e(\"../utils/common\"),O=e(\"./adler32\"),B=e(\"./crc32\"),R=e(\"./inffast\"),T=e(\"./inftrees\"),D=1,F=2,N=0,U=-2,P=1,n=852,i=592;function L(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function s(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new I.Buf16(320),this.work=new I.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function a(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=P,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new I.Buf32(n),t.distcode=t.distdyn=new I.Buf32(i),t.sane=1,t.back=-1,N):U}function o(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,a(e)):U}function h(e,t){var r,n;return e&&e.state?(n=e.state,t<0?(r=0,t=-t):(r=1+(t>>4),t<48&&(t&=15)),t&&(t<8||15<t)?U:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=r,n.wbits=t,o(e))):U}function u(e,t){var r,n;return e?(n=new s,(e.state=n).window=null,(r=h(e,t))!==N&&(e.state=null),r):U}var l,f,c=!0;function j(e){if(c){var t;for(l=new I.Buf32(512),f=new I.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(T(D,e.lens,0,288,l,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;T(F,e.lens,0,32,f,0,e.work,{bits:5}),c=!1}e.lencode=l,e.lenbits=9,e.distcode=f,e.distbits=5}function Z(e,t,r,n){var i,s=e.state;return null===s.window&&(s.wsize=1<<s.wbits,s.wnext=0,s.whave=0,s.window=new I.Buf8(s.wsize)),n>=s.wsize?(I.arraySet(s.window,t,r-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):(n<(i=s.wsize-s.wnext)&&(i=n),I.arraySet(s.window,t,r-n,i,s.wnext),(n-=i)?(I.arraySet(s.window,t,r-n,n,0),s.wnext=n,s.whave=s.wsize):(s.wnext+=i,s.wnext===s.wsize&&(s.wnext=0),s.whave<s.wsize&&(s.whave+=i))),0}r.inflateReset=o,r.inflateReset2=h,r.inflateResetKeep=a,r.inflateInit=function(e){return u(e,15)},r.inflateInit2=u,r.inflate=function(e,t){var r,n,i,s,a,o,h,u,l,f,c,d,p,m,_,g,b,v,y,w,k,x,S,z,C=0,E=new I.Buf8(4),A=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return U;12===(r=e.state).mode&&(r.mode=13),a=e.next_out,i=e.output,h=e.avail_out,s=e.next_in,n=e.input,o=e.avail_in,u=r.hold,l=r.bits,f=o,c=h,x=N;e:for(;;)switch(r.mode){case P:if(0===r.wrap){r.mode=13;break}for(;l<16;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(2&r.wrap&&35615===u){E[r.check=0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0),l=u=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&u)<<8)+(u>>8))%31){e.msg=\"incorrect header check\",r.mode=30;break}if(8!=(15&u)){e.msg=\"unknown compression method\",r.mode=30;break}if(l-=4,k=8+(15&(u>>>=4)),0===r.wbits)r.wbits=k;else if(k>r.wbits){e.msg=\"invalid window size\",r.mode=30;break}r.dmax=1<<k,e.adler=r.check=1,r.mode=512&u?10:12,l=u=0;break;case 2:for(;l<16;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(r.flags=u,8!=(255&r.flags)){e.msg=\"unknown compression method\",r.mode=30;break}if(57344&r.flags){e.msg=\"unknown header flags set\",r.mode=30;break}r.head&&(r.head.text=u>>8&1),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=3;case 3:for(;l<32;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.head&&(r.head.time=u),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,E[2]=u>>>16&255,E[3]=u>>>24&255,r.check=B(r.check,E,4,0)),l=u=0,r.mode=4;case 4:for(;l<16;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.head&&(r.head.xflags=255&u,r.head.os=u>>8),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=5;case 5:if(1024&r.flags){for(;l<16;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.length=u,r.head&&(r.head.extra_len=u),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(o<(d=r.length)&&(d=o),d&&(r.head&&(k=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),I.arraySet(r.head.extra,n,s,d,k)),512&r.flags&&(r.check=B(r.check,n,d,s)),o-=d,s+=d,r.length-=d),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===o)break e;for(d=0;k=n[s+d++],r.head&&k&&r.length<65536&&(r.head.name+=String.fromCharCode(k)),k&&d<o;);if(512&r.flags&&(r.check=B(r.check,n,d,s)),o-=d,s+=d,k)break e}else r.head&&(r.head.name=null);r.length=0,r.mode=8;case 8:if(4096&r.flags){if(0===o)break e;for(d=0;k=n[s+d++],r.head&&k&&r.length<65536&&(r.head.comment+=String.fromCharCode(k)),k&&d<o;);if(512&r.flags&&(r.check=B(r.check,n,d,s)),o-=d,s+=d,k)break e}else r.head&&(r.head.comment=null);r.mode=9;case 9:if(512&r.flags){for(;l<16;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(u!==(65535&r.check)){e.msg=\"header crc mismatch\",r.mode=30;break}l=u=0}r.head&&(r.head.hcrc=r.flags>>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=12;break;case 10:for(;l<32;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}e.adler=r.check=L(u),l=u=0,r.mode=11;case 11:if(0===r.havedict)return e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,r.hold=u,r.bits=l,2;e.adler=r.check=1,r.mode=12;case 12:if(5===t||6===t)break e;case 13:if(r.last){u>>>=7&l,l-=7&l,r.mode=27;break}for(;l<3;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}switch(r.last=1&u,l-=1,3&(u>>>=1)){case 0:r.mode=14;break;case 1:if(j(r),r.mode=20,6!==t)break;u>>>=2,l-=2;break e;case 2:r.mode=17;break;case 3:e.msg=\"invalid block type\",r.mode=30}u>>>=2,l-=2;break;case 14:for(u>>>=7&l,l-=7&l;l<32;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if((65535&u)!=(u>>>16^65535)){e.msg=\"invalid stored block lengths\",r.mode=30;break}if(r.length=65535&u,l=u=0,r.mode=15,6===t)break e;case 15:r.mode=16;case 16:if(d=r.length){if(o<d&&(d=o),h<d&&(d=h),0===d)break e;I.arraySet(i,n,s,d,a),o-=d,s+=d,h-=d,a+=d,r.length-=d;break}r.mode=12;break;case 17:for(;l<14;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(r.nlen=257+(31&u),u>>>=5,l-=5,r.ndist=1+(31&u),u>>>=5,l-=5,r.ncode=4+(15&u),u>>>=4,l-=4,286<r.nlen||30<r.ndist){e.msg=\"too many length or distance symbols\",r.mode=30;break}r.have=0,r.mode=18;case 18:for(;r.have<r.ncode;){for(;l<3;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.lens[A[r.have++]]=7&u,u>>>=3,l-=3}for(;r.have<19;)r.lens[A[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,S={bits:r.lenbits},x=T(0,r.lens,0,19,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg=\"invalid code lengths set\",r.mode=30;break}r.have=0,r.mode=19;case 19:for(;r.have<r.nlen+r.ndist;){for(;g=(C=r.lencode[u&(1<<r.lenbits)-1])>>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(b<16)u>>>=_,l-=_,r.lens[r.have++]=b;else{if(16===b){for(z=_+2;l<z;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(u>>>=_,l-=_,0===r.have){e.msg=\"invalid bit length repeat\",r.mode=30;break}k=r.lens[r.have-1],d=3+(3&u),u>>>=2,l-=2}else if(17===b){for(z=_+3;l<z;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}l-=_,k=0,d=3+(7&(u>>>=_)),u>>>=3,l-=3}else{for(z=_+7;l<z;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}l-=_,k=0,d=11+(127&(u>>>=_)),u>>>=7,l-=7}if(r.have+d>r.nlen+r.ndist){e.msg=\"invalid bit length repeat\",r.mode=30;break}for(;d--;)r.lens[r.have++]=k}}if(30===r.mode)break;if(0===r.lens[256]){e.msg=\"invalid code -- missing end-of-block\",r.mode=30;break}if(r.lenbits=9,S={bits:r.lenbits},x=T(D,r.lens,0,r.nlen,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg=\"invalid literal/lengths set\",r.mode=30;break}if(r.distbits=6,r.distcode=r.distdyn,S={bits:r.distbits},x=T(F,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,S),r.distbits=S.bits,x){e.msg=\"invalid distances set\",r.mode=30;break}if(r.mode=20,6===t)break e;case 20:r.mode=21;case 21:if(6<=o&&258<=h){e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,r.hold=u,r.bits=l,R(e,c),a=e.next_out,i=e.output,h=e.avail_out,s=e.next_in,n=e.input,o=e.avail_in,u=r.hold,l=r.bits,12===r.mode&&(r.back=-1);break}for(r.back=0;g=(C=r.lencode[u&(1<<r.lenbits)-1])>>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(g&&0==(240&g)){for(v=_,y=g,w=b;g=(C=r.lencode[w+((u&(1<<v+y)-1)>>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}u>>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,r.length=b,0===g){r.mode=26;break}if(32&g){r.back=-1,r.mode=12;break}if(64&g){e.msg=\"invalid literal/length code\",r.mode=30;break}r.extra=15&g,r.mode=22;case 22:if(r.extra){for(z=r.extra;l<z;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.length+=u&(1<<r.extra)-1,u>>>=r.extra,l-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;g=(C=r.distcode[u&(1<<r.distbits)-1])>>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(0==(240&g)){for(v=_,y=g,w=b;g=(C=r.distcode[w+((u&(1<<v+y)-1)>>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}u>>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,64&g){e.msg=\"invalid distance code\",r.mode=30;break}r.offset=b,r.extra=15&g,r.mode=24;case 24:if(r.extra){for(z=r.extra;l<z;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.offset+=u&(1<<r.extra)-1,u>>>=r.extra,l-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg=\"invalid distance too far back\",r.mode=30;break}r.mode=25;case 25:if(0===h)break e;if(d=c-h,r.offset>d){if((d=r.offset-d)>r.whave&&r.sane){e.msg=\"invalid distance too far back\",r.mode=30;break}p=d>r.wnext?(d-=r.wnext,r.wsize-d):r.wnext-d,d>r.length&&(d=r.length),m=r.window}else m=i,p=a-r.offset,d=r.length;for(h<d&&(d=h),h-=d,r.length-=d;i[a++]=m[p++],--d;);0===r.length&&(r.mode=21);break;case 26:if(0===h)break e;i[a++]=r.length,h--,r.mode=21;break;case 27:if(r.wrap){for(;l<32;){if(0===o)break e;o--,u|=n[s++]<<l,l+=8}if(c-=h,e.total_out+=c,r.total+=c,c&&(e.adler=r.check=r.flags?B(r.check,i,c,a-c):O(r.check,i,c,a-c)),c=h,(r.flags?u:L(u))!==r.check){e.msg=\"incorrect data check\",r.mode=30;break}l=u=0}r.mode=28;case 28:if(r.wrap&&r.flags){for(;l<32;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(u!==(4294967295&r.total)){e.msg=\"incorrect length check\",r.mode=30;break}l=u=0}r.mode=29;case 29:x=1;break e;case 30:x=-3;break e;case 31:return-4;case 32:default:return U}return e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,r.hold=u,r.bits=l,(r.wsize||c!==e.avail_out&&r.mode<30&&(r.mode<27||4!==t))&&Z(e,e.output,e.next_out,c-e.avail_out)?(r.mode=31,-4):(f-=e.avail_in,c-=e.avail_out,e.total_in+=f,e.total_out+=c,r.total+=c,r.wrap&&c&&(e.adler=r.check=r.flags?B(r.check,i,c,e.next_out-c):O(r.check,i,c,e.next_out-c)),e.data_type=r.bits+(r.last?64:0)+(12===r.mode?128:0)+(20===r.mode||15===r.mode?256:0),(0==f&&0===c||4===t)&&x===N&&(x=-5),x)},r.inflateEnd=function(e){if(!e||!e.state)return U;var t=e.state;return t.window&&(t.window=null),e.state=null,N},r.inflateGetHeader=function(e,t){var r;return e&&e.state?0==(2&(r=e.state).wrap)?U:((r.head=t).done=!1,N):U},r.inflateSetDictionary=function(e,t){var r,n=t.length;return e&&e.state?0!==(r=e.state).wrap&&11!==r.mode?U:11===r.mode&&O(1,t,n,0)!==r.check?-3:Z(e,t,n,n)?(r.mode=31,-4):(r.havedict=1,N):U},r.inflateInfo=\"pako inflate (from Nodeca project)\"},{\"../utils/common\":41,\"./adler32\":43,\"./crc32\":45,\"./inffast\":48,\"./inftrees\":50}],50:[function(e,t,r){\"use strict\";var D=e(\"../utils/common\"),F=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],N=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],U=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],P=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];t.exports=function(e,t,r,n,i,s,a,o){var h,u,l,f,c,d,p,m,_,g=o.bits,b=0,v=0,y=0,w=0,k=0,x=0,S=0,z=0,C=0,E=0,A=null,I=0,O=new D.Buf16(16),B=new D.Buf16(16),R=null,T=0;for(b=0;b<=15;b++)O[b]=0;for(v=0;v<n;v++)O[t[r+v]]++;for(k=g,w=15;1<=w&&0===O[w];w--);if(w<k&&(k=w),0===w)return i[s++]=20971520,i[s++]=20971520,o.bits=1,0;for(y=1;y<w&&0===O[y];y++);for(k<y&&(k=y),b=z=1;b<=15;b++)if(z<<=1,(z-=O[b])<0)return-1;if(0<z&&(0===e||1!==w))return-1;for(B[1]=0,b=1;b<15;b++)B[b+1]=B[b]+O[b];for(v=0;v<n;v++)0!==t[r+v]&&(a[B[t[r+v]]++]=v);if(d=0===e?(A=R=a,19):1===e?(A=F,I-=257,R=N,T-=257,256):(A=U,R=P,-1),b=y,c=s,S=v=E=0,l=-1,f=(C=1<<(x=k))-1,1===e&&852<C||2===e&&592<C)return 1;for(;;){for(p=b-S,_=a[v]<d?(m=0,a[v]):a[v]>d?(m=R[T+a[v]],A[I+a[v]]):(m=96,0),h=1<<b-S,y=u=1<<x;i[c+(E>>S)+(u-=h)]=p<<24|m<<16|_|0,0!==u;);for(h=1<<b-1;E&h;)h>>=1;if(0!==h?(E&=h-1,E+=h):E=0,v++,0==--O[b]){if(b===w)break;b=t[r+a[v]]}if(k<b&&(E&f)!==l){for(0===S&&(S=k),c+=y,z=1<<(x=b-S);x+S<w&&!((z-=O[x+S])<=0);)x++,z<<=1;if(C+=1<<x,1===e&&852<C||2===e&&592<C)return 1;i[l=E&f]=k<<24|x<<16|c-s|0}}return 0!==E&&(i[c+E]=b-S<<24|64<<16|0),o.bits=k,0}},{\"../utils/common\":41}],51:[function(e,t,r){\"use strict\";t.exports={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"}},{}],52:[function(e,t,r){\"use strict\";var i=e(\"../utils/common\"),o=0,h=1;function n(e){for(var t=e.length;0<=--t;)e[t]=0}var s=0,a=29,u=256,l=u+1+a,f=30,c=19,_=2*l+1,g=15,d=16,p=7,m=256,b=16,v=17,y=18,w=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],k=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],x=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],S=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],z=new Array(2*(l+2));n(z);var C=new Array(2*f);n(C);var E=new Array(512);n(E);var A=new Array(256);n(A);var I=new Array(a);n(I);var O,B,R,T=new Array(f);function D(e,t,r,n,i){this.static_tree=e,this.extra_bits=t,this.extra_base=r,this.elems=n,this.max_length=i,this.has_stree=e&&e.length}function F(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function N(e){return e<256?E[e]:E[256+(e>>>7)]}function U(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function P(e,t,r){e.bi_valid>d-r?(e.bi_buf|=t<<e.bi_valid&65535,U(e,e.bi_buf),e.bi_buf=t>>d-e.bi_valid,e.bi_valid+=r-d):(e.bi_buf|=t<<e.bi_valid&65535,e.bi_valid+=r)}function L(e,t,r){P(e,r[2*t],r[2*t+1])}function j(e,t){for(var r=0;r|=1&e,e>>>=1,r<<=1,0<--t;);return r>>>1}function Z(e,t,r){var n,i,s=new Array(g+1),a=0;for(n=1;n<=g;n++)s[n]=a=a+r[n-1]<<1;for(i=0;i<=t;i++){var o=e[2*i+1];0!==o&&(e[2*i]=j(s[o]++,o))}}function W(e){var t;for(t=0;t<l;t++)e.dyn_ltree[2*t]=0;for(t=0;t<f;t++)e.dyn_dtree[2*t]=0;for(t=0;t<c;t++)e.bl_tree[2*t]=0;e.dyn_ltree[2*m]=1,e.opt_len=e.static_len=0,e.last_lit=e.matches=0}function M(e){8<e.bi_valid?U(e,e.bi_buf):0<e.bi_valid&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function H(e,t,r,n){var i=2*t,s=2*r;return e[i]<e[s]||e[i]===e[s]&&n[t]<=n[r]}function G(e,t,r){for(var n=e.heap[r],i=r<<1;i<=e.heap_len&&(i<e.heap_len&&H(t,e.heap[i+1],e.heap[i],e.depth)&&i++,!H(t,n,e.heap[i],e.depth));)e.heap[r]=e.heap[i],r=i,i<<=1;e.heap[r]=n}function K(e,t,r){var n,i,s,a,o=0;if(0!==e.last_lit)for(;n=e.pending_buf[e.d_buf+2*o]<<8|e.pending_buf[e.d_buf+2*o+1],i=e.pending_buf[e.l_buf+o],o++,0===n?L(e,i,t):(L(e,(s=A[i])+u+1,t),0!==(a=w[s])&&P(e,i-=I[s],a),L(e,s=N(--n),r),0!==(a=k[s])&&P(e,n-=T[s],a)),o<e.last_lit;);L(e,m,t)}function Y(e,t){var r,n,i,s=t.dyn_tree,a=t.stat_desc.static_tree,o=t.stat_desc.has_stree,h=t.stat_desc.elems,u=-1;for(e.heap_len=0,e.heap_max=_,r=0;r<h;r++)0!==s[2*r]?(e.heap[++e.heap_len]=u=r,e.depth[r]=0):s[2*r+1]=0;for(;e.heap_len<2;)s[2*(i=e.heap[++e.heap_len]=u<2?++u:0)]=1,e.depth[i]=0,e.opt_len--,o&&(e.static_len-=a[2*i+1]);for(t.max_code=u,r=e.heap_len>>1;1<=r;r--)G(e,s,r);for(i=h;r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],G(e,s,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,s[2*i]=s[2*r]+s[2*n],e.depth[i]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,s[2*r+1]=s[2*n+1]=i,e.heap[1]=i++,G(e,s,1),2<=e.heap_len;);e.heap[--e.heap_max]=e.heap[1],function(e,t){var r,n,i,s,a,o,h=t.dyn_tree,u=t.max_code,l=t.stat_desc.static_tree,f=t.stat_desc.has_stree,c=t.stat_desc.extra_bits,d=t.stat_desc.extra_base,p=t.stat_desc.max_length,m=0;for(s=0;s<=g;s++)e.bl_count[s]=0;for(h[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;r<_;r++)p<(s=h[2*h[2*(n=e.heap[r])+1]+1]+1)&&(s=p,m++),h[2*n+1]=s,u<n||(e.bl_count[s]++,a=0,d<=n&&(a=c[n-d]),o=h[2*n],e.opt_len+=o*(s+a),f&&(e.static_len+=o*(l[2*n+1]+a)));if(0!==m){do{for(s=p-1;0===e.bl_count[s];)s--;e.bl_count[s]--,e.bl_count[s+1]+=2,e.bl_count[p]--,m-=2}while(0<m);for(s=p;0!==s;s--)for(n=e.bl_count[s];0!==n;)u<(i=e.heap[--r])||(h[2*i+1]!==s&&(e.opt_len+=(s-h[2*i+1])*h[2*i],h[2*i+1]=s),n--)}}(e,t),Z(s,u,e.bl_count)}function X(e,t,r){var n,i,s=-1,a=t[1],o=0,h=7,u=4;for(0===a&&(h=138,u=3),t[2*(r+1)+1]=65535,n=0;n<=r;n++)i=a,a=t[2*(n+1)+1],++o<h&&i===a||(o<u?e.bl_tree[2*i]+=o:0!==i?(i!==s&&e.bl_tree[2*i]++,e.bl_tree[2*b]++):o<=10?e.bl_tree[2*v]++:e.bl_tree[2*y]++,s=i,u=(o=0)===a?(h=138,3):i===a?(h=6,3):(h=7,4))}function V(e,t,r){var n,i,s=-1,a=t[1],o=0,h=7,u=4;for(0===a&&(h=138,u=3),n=0;n<=r;n++)if(i=a,a=t[2*(n+1)+1],!(++o<h&&i===a)){if(o<u)for(;L(e,i,e.bl_tree),0!=--o;);else 0!==i?(i!==s&&(L(e,i,e.bl_tree),o--),L(e,b,e.bl_tree),P(e,o-3,2)):o<=10?(L(e,v,e.bl_tree),P(e,o-3,3)):(L(e,y,e.bl_tree),P(e,o-11,7));s=i,u=(o=0)===a?(h=138,3):i===a?(h=6,3):(h=7,4)}}n(T);var q=!1;function J(e,t,r,n){P(e,(s<<1)+(n?1:0),3),function(e,t,r,n){M(e),n&&(U(e,r),U(e,~r)),i.arraySet(e.pending_buf,e.window,t,r,e.pending),e.pending+=r}(e,t,r,!0)}r._tr_init=function(e){q||(function(){var e,t,r,n,i,s=new Array(g+1);for(n=r=0;n<a-1;n++)for(I[n]=r,e=0;e<1<<w[n];e++)A[r++]=n;for(A[r-1]=n,n=i=0;n<16;n++)for(T[n]=i,e=0;e<1<<k[n];e++)E[i++]=n;for(i>>=7;n<f;n++)for(T[n]=i<<7,e=0;e<1<<k[n]-7;e++)E[256+i++]=n;for(t=0;t<=g;t++)s[t]=0;for(e=0;e<=143;)z[2*e+1]=8,e++,s[8]++;for(;e<=255;)z[2*e+1]=9,e++,s[9]++;for(;e<=279;)z[2*e+1]=7,e++,s[7]++;for(;e<=287;)z[2*e+1]=8,e++,s[8]++;for(Z(z,l+1,s),e=0;e<f;e++)C[2*e+1]=5,C[2*e]=j(e,5);O=new D(z,w,u+1,l,g),B=new D(C,k,0,f,g),R=new D(new Array(0),x,0,c,p)}(),q=!0),e.l_desc=new F(e.dyn_ltree,O),e.d_desc=new F(e.dyn_dtree,B),e.bl_desc=new F(e.bl_tree,R),e.bi_buf=0,e.bi_valid=0,W(e)},r._tr_stored_block=J,r._tr_flush_block=function(e,t,r,n){var i,s,a=0;0<e.level?(2===e.strm.data_type&&(e.strm.data_type=function(e){var t,r=4093624447;for(t=0;t<=31;t++,r>>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return o;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return h;for(t=32;t<u;t++)if(0!==e.dyn_ltree[2*t])return h;return o}(e)),Y(e,e.l_desc),Y(e,e.d_desc),a=function(e){var t;for(X(e,e.dyn_ltree,e.l_desc.max_code),X(e,e.dyn_dtree,e.d_desc.max_code),Y(e,e.bl_desc),t=c-1;3<=t&&0===e.bl_tree[2*S[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}(e),i=e.opt_len+3+7>>>3,(s=e.static_len+3+7>>>3)<=i&&(i=s)):i=s=r+5,r+4<=i&&-1!==t?J(e,t,r,n):4===e.strategy||s===i?(P(e,2+(n?1:0),3),K(e,z,C)):(P(e,4+(n?1:0),3),function(e,t,r,n){var i;for(P(e,t-257,5),P(e,r-1,5),P(e,n-4,4),i=0;i<n;i++)P(e,e.bl_tree[2*S[i]+1],3);V(e,e.dyn_ltree,t-1),V(e,e.dyn_dtree,r-1)}(e,e.l_desc.max_code+1,e.d_desc.max_code+1,a+1),K(e,e.dyn_ltree,e.dyn_dtree)),W(e),n&&M(e)},r._tr_tally=function(e,t,r){return e.pending_buf[e.d_buf+2*e.last_lit]=t>>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(A[r]+u+1)]++,e.dyn_dtree[2*N(t)]++),e.last_lit===e.lit_bufsize-1},r._tr_align=function(e){P(e,2,3),L(e,m,z),function(e){16===e.bi_valid?(U(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):8<=e.bi_valid&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},{\"../utils/common\":41}],53:[function(e,t,r){\"use strict\";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(e,t,r){(function(e){!function(r,n){\"use strict\";if(!r.setImmediate){var i,s,t,a,o=1,h={},u=!1,l=r.document,e=Object.getPrototypeOf&&Object.getPrototypeOf(r);e=e&&e.setTimeout?e:r,i=\"[object process]\"==={}.toString.call(r.process)?function(e){process.nextTick(function(){c(e)})}:function(){if(r.postMessage&&!r.importScripts){var e=!0,t=r.onmessage;return r.onmessage=function(){e=!1},r.postMessage(\"\",\"*\"),r.onmessage=t,e}}()?(a=\"setImmediate$\"+Math.random()+\"$\",r.addEventListener?r.addEventListener(\"message\",d,!1):r.attachEvent(\"onmessage\",d),function(e){r.postMessage(a+e,\"*\")}):r.MessageChannel?((t=new MessageChannel).port1.onmessage=function(e){c(e.data)},function(e){t.port2.postMessage(e)}):l&&\"onreadystatechange\"in l.createElement(\"script\")?(s=l.documentElement,function(e){var t=l.createElement(\"script\");t.onreadystatechange=function(){c(e),t.onreadystatechange=null,s.removeChild(t),t=null},s.appendChild(t)}):function(e){setTimeout(c,0,e)},e.setImmediate=function(e){\"function\"!=typeof e&&(e=new Function(\"\"+e));for(var t=new Array(arguments.length-1),r=0;r<t.length;r++)t[r]=arguments[r+1];var n={callback:e,args:t};return h[o]=n,i(o),o++},e.clearImmediate=f}function f(e){delete h[e]}function c(e){if(u)setTimeout(c,0,e);else{var t=h[e];if(t){u=!0;try{!function(e){var t=e.callback,r=e.args;switch(r.length){case 0:t();break;case 1:t(r[0]);break;case 2:t(r[0],r[1]);break;case 3:t(r[0],r[1],r[2]);break;default:t.apply(n,r)}}(t)}finally{f(e),u=!1}}}}function d(e){e.source===r&&\"string\"==typeof e.data&&0===e.data.indexOf(a)&&c(+e.data.slice(a.length))}}(\"undefined\"==typeof self?void 0===e?this:e:self)}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}]},{},[10])(10)});","/*\n* FileSaver.js\n* A saveAs() FileSaver implementation.\n*\n* By Eli Grey, http://eligrey.com\n*\n* License : https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md (MIT)\n* source  : http://purl.eligrey.com/github/FileSaver.js\n*/\n\n// The one and only way of getting global scope in all environments\n// https://stackoverflow.com/q/3277182/1008999\nvar _global = typeof window === 'object' && window.window === window\n  ? window : typeof self === 'object' && self.self === self\n  ? self : typeof global === 'object' && global.global === global\n  ? global\n  : this\n\nfunction bom (blob, opts) {\n  if (typeof opts === 'undefined') opts = { autoBom: false }\n  else if (typeof opts !== 'object') {\n    console.warn('Deprecated: Expected third argument to be a object')\n    opts = { autoBom: !opts }\n  }\n\n  // prepend BOM for UTF-8 XML and text/* types (including HTML)\n  // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF\n  if (opts.autoBom && /^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(blob.type)) {\n    return new Blob([String.fromCharCode(0xFEFF), blob], { type: blob.type })\n  }\n  return blob\n}\n\nfunction download (url, name, opts) {\n  var xhr = new XMLHttpRequest()\n  xhr.open('GET', url)\n  xhr.responseType = 'blob'\n  xhr.onload = function () {\n    saveAs(xhr.response, name, opts)\n  }\n  xhr.onerror = function () {\n    console.error('could not download file')\n  }\n  xhr.send()\n}\n\nfunction corsEnabled (url) {\n  var xhr = new XMLHttpRequest()\n  // use sync to avoid popup blocker\n  xhr.open('HEAD', url, false)\n  try {\n    xhr.send()\n  } catch (e) {}\n  return xhr.status >= 200 && xhr.status <= 299\n}\n\n// `a.click()` doesn't work for all browsers (#465)\nfunction click (node) {\n  try {\n    node.dispatchEvent(new MouseEvent('click'))\n  } catch (e) {\n    var evt = document.createEvent('MouseEvents')\n    evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80,\n                          20, false, false, false, false, 0, null)\n    node.dispatchEvent(evt)\n  }\n}\n\n// Detect WebView inside a native macOS app by ruling out all browsers\n// We just need to check for 'Safari' because all other browsers (besides Firefox) include that too\n// https://www.whatismybrowser.com/guides/the-latest-user-agent/macos\nvar isMacOSWebView = _global.navigator && /Macintosh/.test(navigator.userAgent) && /AppleWebKit/.test(navigator.userAgent) && !/Safari/.test(navigator.userAgent)\n\nvar saveAs = _global.saveAs || (\n  // probably in some web worker\n  (typeof window !== 'object' || window !== _global)\n    ? function saveAs () { /* noop */ }\n\n  // Use download attribute first if possible (#193 Lumia mobile) unless this is a macOS WebView\n  : ('download' in HTMLAnchorElement.prototype && !isMacOSWebView)\n  ? function saveAs (blob, name, opts) {\n    var URL = _global.URL || _global.webkitURL\n    var a = document.createElement('a')\n    name = name || blob.name || 'download'\n\n    a.download = name\n    a.rel = 'noopener' // tabnabbing\n\n    // TODO: detect chrome extensions & packaged apps\n    // a.target = '_blank'\n\n    if (typeof blob === 'string') {\n      // Support regular links\n      a.href = blob\n      if (a.origin !== location.origin) {\n        corsEnabled(a.href)\n          ? download(blob, name, opts)\n          : click(a, a.target = '_blank')\n      } else {\n        click(a)\n      }\n    } else {\n      // Support blobs\n      a.href = URL.createObjectURL(blob)\n      setTimeout(function () { URL.revokeObjectURL(a.href) }, 4E4) // 40s\n      setTimeout(function () { click(a) }, 0)\n    }\n  }\n\n  // Use msSaveOrOpenBlob as a second approach\n  : 'msSaveOrOpenBlob' in navigator\n  ? function saveAs (blob, name, opts) {\n    name = name || blob.name || 'download'\n\n    if (typeof blob === 'string') {\n      if (corsEnabled(blob)) {\n        download(blob, name, opts)\n      } else {\n        var a = document.createElement('a')\n        a.href = blob\n        a.target = '_blank'\n        setTimeout(function () { click(a) })\n      }\n    } else {\n      navigator.msSaveOrOpenBlob(bom(blob, opts), name)\n    }\n  }\n\n  // Fallback to using FileReader and a popup\n  : function saveAs (blob, name, opts, popup) {\n    // Open a popup immediately do go around popup blocker\n    // Mostly only available on user interaction and the fileReader is async so...\n    popup = popup || open('', '_blank')\n    if (popup) {\n      popup.document.title =\n      popup.document.body.innerText = 'downloading...'\n    }\n\n    if (typeof blob === 'string') return download(blob, name, opts)\n\n    var force = blob.type === 'application/octet-stream'\n    var isSafari = /constructor/i.test(_global.HTMLElement) || _global.safari\n    var isChromeIOS = /CriOS\\/[\\d]+/.test(navigator.userAgent)\n\n    if ((isChromeIOS || (force && isSafari) || isMacOSWebView) && typeof FileReader !== 'undefined') {\n      // Safari doesn't allow downloading of blob URLs\n      var reader = new FileReader()\n      reader.onloadend = function () {\n        var url = reader.result\n        url = isChromeIOS ? url : url.replace(/^data:[^;]*;/, 'data:attachment/file;')\n        if (popup) popup.location.href = url\n        else location = url\n        popup = null // reverse-tabnabbing #460\n      }\n      reader.readAsDataURL(blob)\n    } else {\n      var URL = _global.URL || _global.webkitURL\n      var url = URL.createObjectURL(blob)\n      if (popup) popup.location = url\n      else location.href = url\n      popup = null // reverse-tabnabbing #460\n      setTimeout(function () { URL.revokeObjectURL(url) }, 4E4) // 40s\n    }\n  }\n)\n\n_global.saveAs = saveAs.saveAs = saveAs\n\nif (typeof module !== 'undefined') {\n  module.exports = saveAs;\n}\n","/*! ExcelJS 19-10-2023 */\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define([],e);else{(\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).ExcelJS=e()}}((function(){return function e(t,r,n){function i(o,a){if(!r[o]){if(!t[o]){var l=\"function\"==typeof require&&require;if(!a&&l)return l(o,!0);if(s)return s(o,!0);var c=new Error(\"Cannot find module '\"+o+\"'\");throw c.code=\"MODULE_NOT_FOUND\",c}var u=r[o]={exports:{}};t[o][0].call(u.exports,(function(e){return i(t[o][1][e]||e)}),u,u.exports,e,t,r,n)}return r[o].exports}for(var s=\"function\"==typeof require&&require,o=0;o<n.length;o++)i(n[o]);return i}({1:[function(e,t,r){\"use strict\";const n=e(\"fs\"),i=e(\"fast-csv\"),s=e(\"dayjs/plugin/customParseFormat\"),o=e(\"dayjs/plugin/utc\"),a=e(\"dayjs\").extend(s).extend(o),l=e(\"../utils/stream-buf\"),{fs:{exists:c}}=e(\"../utils/utils\"),u={true:!0,false:!1,\"#N/A\":{error:\"#N/A\"},\"#REF!\":{error:\"#REF!\"},\"#NAME?\":{error:\"#NAME?\"},\"#DIV/0!\":{error:\"#DIV/0!\"},\"#NULL!\":{error:\"#NULL!\"},\"#VALUE!\":{error:\"#VALUE!\"},\"#NUM!\":{error:\"#NUM!\"}};t.exports=class{constructor(e){this.workbook=e,this.worksheet=null}async readFile(e,t){if(t=t||{},!await c(e))throw new Error(\"File not found: \"+e);const r=n.createReadStream(e),i=await this.read(r,t);return r.close(),i}read(e,t){return t=t||{},new Promise((r,n)=>{const s=this.workbook.addWorksheet(t.sheetName),o=t.dateFormats||[\"YYYY-MM-DD[T]HH:mm:ssZ\",\"YYYY-MM-DD[T]HH:mm:ss\",\"MM-DD-YYYY\",\"YYYY-MM-DD\"],l=t.map||function(e){if(\"\"===e)return null;const t=Number(e);if(!Number.isNaN(t)&&t!==1/0)return t;const r=o.reduce((t,r)=>{if(t)return t;const n=a(e,r,!0);return n.isValid()?n:null},null);if(r)return new Date(r.valueOf());const n=u[e];return void 0!==n?n:e},c=i.parse(t.parserOptions).on(\"data\",e=>{s.addRow(e.map(l))}).on(\"end\",()=>{c.emit(\"worksheet\",s)});c.on(\"worksheet\",r).on(\"error\",n),e.pipe(c)})}createInputStream(){throw new Error(\"`CSV#createInputStream` is deprecated. You should use `CSV#read` instead. This method will be removed in version 5.0. Please follow upgrade instruction: https://github.com/exceljs/exceljs/blob/master/UPGRADE-4.0.md\")}write(e,t){return new Promise((r,n)=>{t=t||{};const s=this.workbook.getWorksheet(t.sheetName||t.sheetId),o=i.format(t.formatterOptions);e.on(\"finish\",()=>{r()}),o.on(\"error\",n),o.pipe(e);const{dateFormat:l,dateUTC:c}=t,u=t.map||(e=>{if(e){if(e.text||e.hyperlink)return e.hyperlink||e.text||\"\";if(e.formula||e.result)return e.result||\"\";if(e instanceof Date)return l?c?a.utc(e).format(l):a(e).format(l):c?a.utc(e).format():a(e).format();if(e.error)return e.error;if(\"object\"==typeof e)return JSON.stringify(e)}return e}),h=void 0===t.includeEmptyRows||t.includeEmptyRows;let f=1;s&&s.eachRow((e,t)=>{if(h)for(;f++<t-1;)o.write([]);const{values:r}=e;r.shift(),o.write(r.map(u)),f=t}),o.end()})}writeFile(e,t){const r={encoding:(t=t||{}).encoding||\"utf8\"},i=n.createWriteStream(e,r);return this.write(i,t)}async writeBuffer(e){const t=new l;return await this.write(t,e),t.read()}}},{\"../utils/stream-buf\":24,\"../utils/utils\":27,dayjs:391,\"dayjs/plugin/customParseFormat\":392,\"dayjs/plugin/utc\":393,\"fast-csv\":424,fs:216}],2:[function(e,t,r){\"use strict\";const n=e(\"../utils/col-cache\");class i{constructor(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;if(this.worksheet=e,t)if(\"string\"==typeof t){const e=n.decodeAddress(t);this.nativeCol=e.col+r,this.nativeColOff=0,this.nativeRow=e.row+r,this.nativeRowOff=0}else void 0!==t.nativeCol?(this.nativeCol=t.nativeCol||0,this.nativeColOff=t.nativeColOff||0,this.nativeRow=t.nativeRow||0,this.nativeRowOff=t.nativeRowOff||0):void 0!==t.col?(this.col=t.col+r,this.row=t.row+r):(this.nativeCol=0,this.nativeColOff=0,this.nativeRow=0,this.nativeRowOff=0);else this.nativeCol=0,this.nativeColOff=0,this.nativeRow=0,this.nativeRowOff=0}static asInstance(e){return e instanceof i||null==e?e:new i(e)}get col(){return this.nativeCol+Math.min(this.colWidth-1,this.nativeColOff)/this.colWidth}set col(e){this.nativeCol=Math.floor(e),this.nativeColOff=Math.floor((e-this.nativeCol)*this.colWidth)}get row(){return this.nativeRow+Math.min(this.rowHeight-1,this.nativeRowOff)/this.rowHeight}set row(e){this.nativeRow=Math.floor(e),this.nativeRowOff=Math.floor((e-this.nativeRow)*this.rowHeight)}get colWidth(){return this.worksheet&&this.worksheet.getColumn(this.nativeCol+1)&&this.worksheet.getColumn(this.nativeCol+1).isCustomWidth?Math.floor(1e4*this.worksheet.getColumn(this.nativeCol+1).width):64e4}get rowHeight(){return this.worksheet&&this.worksheet.getRow(this.nativeRow+1)&&this.worksheet.getRow(this.nativeRow+1).height?Math.floor(1e4*this.worksheet.getRow(this.nativeRow+1).height):18e4}get model(){return{nativeCol:this.nativeCol,nativeColOff:this.nativeColOff,nativeRow:this.nativeRow,nativeRowOff:this.nativeRowOff}}set model(e){this.nativeCol=e.nativeCol,this.nativeColOff=e.nativeColOff,this.nativeRow=e.nativeRow,this.nativeRowOff=e.nativeRowOff}}t.exports=i},{\"../utils/col-cache\":19}],3:[function(e,t,r){\"use strict\";const n=e(\"../utils/col-cache\"),i=e(\"../utils/under-dash\"),s=e(\"./enums\"),{slideFormula:o}=e(\"../utils/shared-formula\"),a=e(\"./note\");class l{constructor(e,t,r){if(!e||!t)throw new Error(\"A Cell needs a Row\");this._row=e,this._column=t,n.validateAddress(r),this._address=r,this._value=c.create(l.Types.Null,this),this.style=this._mergeStyle(e.style,t.style,{}),this._mergeCount=0}get worksheet(){return this._row.worksheet}get workbook(){return this._row.worksheet.workbook}destroy(){delete this.style,delete this._value,delete this._row,delete this._column,delete this._address}get numFmt(){return this.style.numFmt}set numFmt(e){this.style.numFmt=e}get font(){return this.style.font}set font(e){this.style.font=e}get alignment(){return this.style.alignment}set alignment(e){this.style.alignment=e}get border(){return this.style.border}set border(e){this.style.border=e}get fill(){return this.style.fill}set fill(e){this.style.fill=e}get protection(){return this.style.protection}set protection(e){this.style.protection=e}_mergeStyle(e,t,r){const n=e&&e.numFmt||t&&t.numFmt;n&&(r.numFmt=n);const i=e&&e.font||t&&t.font;i&&(r.font=i);const s=e&&e.alignment||t&&t.alignment;s&&(r.alignment=s);const o=e&&e.border||t&&t.border;o&&(r.border=o);const a=e&&e.fill||t&&t.fill;a&&(r.fill=a);const l=e&&e.protection||t&&t.protection;return l&&(r.protection=l),r}get address(){return this._address}get row(){return this._row.number}get col(){return this._column.number}get $col$row(){return`$${this._column.letter}$${this.row}`}get type(){return this._value.type}get effectiveType(){return this._value.effectiveType}toCsvString(){return this._value.toCsvString()}addMergeRef(){this._mergeCount++}releaseMergeRef(){this._mergeCount--}get isMerged(){return this._mergeCount>0||this.type===l.Types.Merge}merge(e,t){this._value.release(),this._value=c.create(l.Types.Merge,this,e),t||(this.style=e.style)}unmerge(){this.type===l.Types.Merge&&(this._value.release(),this._value=c.create(l.Types.Null,this),this.style=this._mergeStyle(this._row.style,this._column.style,{}))}isMergedTo(e){return this._value.type===l.Types.Merge&&this._value.isMergedTo(e)}get master(){return this.type===l.Types.Merge?this._value.master:this}get isHyperlink(){return this._value.type===l.Types.Hyperlink}get hyperlink(){return this._value.hyperlink}get value(){return this._value.value}set value(e){this.type!==l.Types.Merge?(this._value.release(),this._value=c.create(c.getType(e),this,e)):this._value.master.value=e}get note(){return this._comment&&this._comment.note}set note(e){this._comment=new a(e)}get text(){return this._value.toString()}get html(){return i.escapeHtml(this.text)}toString(){return this.text}_upgradeToHyperlink(e){this.type===l.Types.String&&(this._value=c.create(l.Types.Hyperlink,this,{text:this._value.value,hyperlink:e}))}get formula(){return this._value.formula}get result(){return this._value.result}get formulaType(){return this._value.formulaType}get fullAddress(){const{worksheet:e}=this._row;return{sheetName:e.name,address:this.address,row:this.row,col:this.col}}get name(){return this.names[0]}set name(e){this.names=[e]}get names(){return this.workbook.definedNames.getNamesEx(this.fullAddress)}set names(e){const{definedNames:t}=this.workbook;t.removeAllNames(this.fullAddress),e.forEach(e=>{t.addEx(this.fullAddress,e)})}addName(e){this.workbook.definedNames.addEx(this.fullAddress,e)}removeName(e){this.workbook.definedNames.removeEx(this.fullAddress,e)}removeAllNames(){this.workbook.definedNames.removeAllNames(this.fullAddress)}get _dataValidations(){return this.worksheet.dataValidations}get dataValidation(){return this._dataValidations.find(this.address)}set dataValidation(e){this._dataValidations.add(this.address,e)}get model(){const{model:e}=this._value;return e.style=this.style,this._comment&&(e.comment=this._comment.model),e}set model(e){if(this._value.release(),this._value=c.create(e.type,this),this._value.model=e,e.comment)switch(e.comment.type){case\"note\":this._comment=a.fromModel(e.comment)}e.style?this.style=e.style:this.style={}}}l.Types=s.ValueType;const c={getType:e=>null==e?l.Types.Null:e instanceof String||\"string\"==typeof e?l.Types.String:\"number\"==typeof e?l.Types.Number:\"boolean\"==typeof e?l.Types.Boolean:e instanceof Date?l.Types.Date:e.text&&e.hyperlink?l.Types.Hyperlink:e.formula||e.sharedFormula?l.Types.Formula:e.richText?l.Types.RichText:e.sharedString?l.Types.SharedString:e.error?l.Types.Error:l.Types.JSON,types:[{t:l.Types.Null,f:class{constructor(e){this.model={address:e.address,type:l.Types.Null}}get value(){return null}set value(e){}get type(){return l.Types.Null}get effectiveType(){return l.Types.Null}get address(){return this.model.address}set address(e){this.model.address=e}toCsvString(){return\"\"}release(){}toString(){return\"\"}}},{t:l.Types.Number,f:class{constructor(e,t){this.model={address:e.address,type:l.Types.Number,value:t}}get value(){return this.model.value}set value(e){this.model.value=e}get type(){return l.Types.Number}get effectiveType(){return l.Types.Number}get address(){return this.model.address}set address(e){this.model.address=e}toCsvString(){return this.model.value.toString()}release(){}toString(){return this.model.value.toString()}}},{t:l.Types.String,f:class{constructor(e,t){this.model={address:e.address,type:l.Types.String,value:t}}get value(){return this.model.value}set value(e){this.model.value=e}get type(){return l.Types.String}get effectiveType(){return l.Types.String}get address(){return this.model.address}set address(e){this.model.address=e}toCsvString(){return`\"${this.model.value.replace(/\"/g,'\"\"')}\"`}release(){}toString(){return this.model.value}}},{t:l.Types.Date,f:class{constructor(e,t){this.model={address:e.address,type:l.Types.Date,value:t}}get value(){return this.model.value}set value(e){this.model.value=e}get type(){return l.Types.Date}get effectiveType(){return l.Types.Date}get address(){return this.model.address}set address(e){this.model.address=e}toCsvString(){return this.model.value.toISOString()}release(){}toString(){return this.model.value.toString()}}},{t:l.Types.Hyperlink,f:class{constructor(e,t){this.model={address:e.address,type:l.Types.Hyperlink,text:t?t.text:void 0,hyperlink:t?t.hyperlink:void 0},t&&t.tooltip&&(this.model.tooltip=t.tooltip)}get value(){const e={text:this.model.text,hyperlink:this.model.hyperlink};return this.model.tooltip&&(e.tooltip=this.model.tooltip),e}set value(e){this.model={text:e.text,hyperlink:e.hyperlink},e.tooltip&&(this.model.tooltip=e.tooltip)}get text(){return this.model.text}set text(e){this.model.text=e}get hyperlink(){return this.model.hyperlink}set hyperlink(e){this.model.hyperlink=e}get type(){return l.Types.Hyperlink}get effectiveType(){return l.Types.Hyperlink}get address(){return this.model.address}set address(e){this.model.address=e}toCsvString(){return this.model.hyperlink}release(){}toString(){return this.model.text}}},{t:l.Types.Formula,f:class{constructor(e,t){this.cell=e,this.model={address:e.address,type:l.Types.Formula,shareType:t?t.shareType:void 0,ref:t?t.ref:void 0,formula:t?t.formula:void 0,sharedFormula:t?t.sharedFormula:void 0,result:t?t.result:void 0}}_copyModel(e){const t={},r=r=>{const n=e[r];n&&(t[r]=n)};return r(\"formula\"),r(\"result\"),r(\"ref\"),r(\"shareType\"),r(\"sharedFormula\"),t}get value(){return this._copyModel(this.model)}set value(e){this.model=this._copyModel(e)}validate(e){switch(c.getType(e)){case l.Types.Null:case l.Types.String:case l.Types.Number:case l.Types.Date:break;case l.Types.Hyperlink:case l.Types.Formula:default:throw new Error(\"Cannot process that type of result value\")}}get dependencies(){return{ranges:this.formula.match(/([a-zA-Z0-9]+!)?[A-Z]{1,3}\\d{1,4}:[A-Z]{1,3}\\d{1,4}/g),cells:this.formula.replace(/([a-zA-Z0-9]+!)?[A-Z]{1,3}\\d{1,4}:[A-Z]{1,3}\\d{1,4}/g,\"\").match(/([a-zA-Z0-9]+!)?[A-Z]{1,3}\\d{1,4}/g)}}get formula(){return this.model.formula||this._getTranslatedFormula()}set formula(e){this.model.formula=e}get formulaType(){return this.model.formula?s.FormulaType.Master:this.model.sharedFormula?s.FormulaType.Shared:s.FormulaType.None}get result(){return this.model.result}set result(e){this.model.result=e}get type(){return l.Types.Formula}get effectiveType(){const e=this.model.result;return null==e?s.ValueType.Null:e instanceof String||\"string\"==typeof e?s.ValueType.String:\"number\"==typeof e?s.ValueType.Number:e instanceof Date?s.ValueType.Date:e.text&&e.hyperlink?s.ValueType.Hyperlink:e.formula?s.ValueType.Formula:s.ValueType.Null}get address(){return this.model.address}set address(e){this.model.address=e}_getTranslatedFormula(){if(!this._translatedFormula&&this.model.sharedFormula){const{worksheet:e}=this.cell,t=e.findCell(this.model.sharedFormula);this._translatedFormula=t&&o(t.formula,t.address,this.model.address)}return this._translatedFormula}toCsvString(){return\"\"+(this.model.result||\"\")}release(){}toString(){return this.model.result?this.model.result.toString():\"\"}}},{t:l.Types.Merge,f:class{constructor(e,t){this.model={address:e.address,type:l.Types.Merge,master:t?t.address:void 0},this._master=t,t&&t.addMergeRef()}get value(){return this._master.value}set value(e){e instanceof l?(this._master&&this._master.releaseMergeRef(),e.addMergeRef(),this._master=e):this._master.value=e}isMergedTo(e){return e===this._master}get master(){return this._master}get type(){return l.Types.Merge}get effectiveType(){return this._master.effectiveType}get address(){return this.model.address}set address(e){this.model.address=e}toCsvString(){return\"\"}release(){this._master.releaseMergeRef()}toString(){return this.value.toString()}}},{t:l.Types.JSON,f:class{constructor(e,t){this.model={address:e.address,type:l.Types.String,value:JSON.stringify(t),rawValue:t}}get value(){return this.model.rawValue}set value(e){this.model.rawValue=e,this.model.value=JSON.stringify(e)}get type(){return l.Types.String}get effectiveType(){return l.Types.String}get address(){return this.model.address}set address(e){this.model.address=e}toCsvString(){return this.model.value}release(){}toString(){return this.model.value}}},{t:l.Types.SharedString,f:class{constructor(e,t){this.model={address:e.address,type:l.Types.SharedString,value:t}}get value(){return this.model.value}set value(e){this.model.value=e}get type(){return l.Types.SharedString}get effectiveType(){return l.Types.SharedString}get address(){return this.model.address}set address(e){this.model.address=e}toCsvString(){return this.model.value.toString()}release(){}toString(){return this.model.value.toString()}}},{t:l.Types.RichText,f:class{constructor(e,t){this.model={address:e.address,type:l.Types.String,value:t}}get value(){return this.model.value}set value(e){this.model.value=e}toString(){return this.model.value.richText.map(e=>e.text).join(\"\")}get type(){return l.Types.RichText}get effectiveType(){return l.Types.RichText}get address(){return this.model.address}set address(e){this.model.address=e}toCsvString(){return`\"${this.text.replace(/\"/g,'\"\"')}\"`}release(){}}},{t:l.Types.Boolean,f:class{constructor(e,t){this.model={address:e.address,type:l.Types.Boolean,value:t}}get value(){return this.model.value}set value(e){this.model.value=e}get type(){return l.Types.Boolean}get effectiveType(){return l.Types.Boolean}get address(){return this.model.address}set address(e){this.model.address=e}toCsvString(){return this.model.value?1:0}release(){}toString(){return this.model.value.toString()}}},{t:l.Types.Error,f:class{constructor(e,t){this.model={address:e.address,type:l.Types.Error,value:t}}get value(){return this.model.value}set value(e){this.model.value=e}get type(){return l.Types.Error}get effectiveType(){return l.Types.Error}get address(){return this.model.address}set address(e){this.model.address=e}toCsvString(){return this.toString()}release(){}toString(){return this.model.value.error.toString()}}}].reduce((e,t)=>(e[t.t]=t.f,e),[]),create(e,t,r){const n=this.types[e];if(!n)throw new Error(\"Could not create Value of type \"+e);return new n(t,r)}};t.exports=l},{\"../utils/col-cache\":19,\"../utils/shared-formula\":23,\"../utils/under-dash\":26,\"./enums\":7,\"./note\":9}],4:[function(e,t,r){\"use strict\";const n=e(\"../utils/under-dash\"),i=e(\"./enums\"),s=e(\"../utils/col-cache\");class o{constructor(e,t,r){this._worksheet=e,this._number=t,!1!==r&&(this.defn=r)}get number(){return this._number}get worksheet(){return this._worksheet}get letter(){return s.n2l(this._number)}get isCustomWidth(){return void 0!==this.width&&9!==this.width}get defn(){return{header:this._header,key:this.key,width:this.width,style:this.style,hidden:this.hidden,outlineLevel:this.outlineLevel}}set defn(e){e?(this.key=e.key,this.width=void 0!==e.width?e.width:9,this.outlineLevel=e.outlineLevel,e.style?this.style=e.style:this.style={},this.header=e.header,this._hidden=!!e.hidden):(delete this._header,delete this._key,delete this.width,this.style={},this.outlineLevel=0)}get headers(){return this._header&&this._header instanceof Array?this._header:[this._header]}get header(){return this._header}set header(e){void 0!==e?(this._header=e,this.headers.forEach((e,t)=>{this._worksheet.getCell(t+1,this.number).value=e})):this._header=void 0}get key(){return this._key}set key(e){(this._key&&this._worksheet.getColumnKey(this._key))===this&&this._worksheet.deleteColumnKey(this._key),this._key=e,e&&this._worksheet.setColumnKey(this._key,this)}get hidden(){return!!this._hidden}set hidden(e){this._hidden=e}get outlineLevel(){return this._outlineLevel||0}set outlineLevel(e){this._outlineLevel=e}get collapsed(){return!!(this._outlineLevel&&this._outlineLevel>=this._worksheet.properties.outlineLevelCol)}toString(){return JSON.stringify({key:this.key,width:this.width,headers:this.headers.length?this.headers:void 0})}equivalentTo(e){return this.width===e.width&&this.hidden===e.hidden&&this.outlineLevel===e.outlineLevel&&n.isEqual(this.style,e.style)}get isDefault(){if(this.isCustomWidth)return!1;if(this.hidden)return!1;if(this.outlineLevel)return!1;const e=this.style;return!e||!(e.font||e.numFmt||e.alignment||e.border||e.fill||e.protection)}get headerCount(){return this.headers.length}eachCell(e,t){const r=this.number;t||(t=e,e=null),this._worksheet.eachRow(e,(e,n)=>{t(e.getCell(r),n)})}get values(){const e=[];return this.eachCell((t,r)=>{t&&t.type!==i.ValueType.Null&&(e[r]=t.value)}),e}set values(e){if(!e)return;const t=this.number;let r=0;e.hasOwnProperty(\"0\")&&(r=1),e.forEach((e,n)=>{this._worksheet.getCell(n+r,t).value=e})}_applyStyle(e,t){return this.style[e]=t,this.eachCell(r=>{r[e]=t}),t}get numFmt(){return this.style.numFmt}set numFmt(e){this._applyStyle(\"numFmt\",e)}get font(){return this.style.font}set font(e){this._applyStyle(\"font\",e)}get alignment(){return this.style.alignment}set alignment(e){this._applyStyle(\"alignment\",e)}get protection(){return this.style.protection}set protection(e){this._applyStyle(\"protection\",e)}get border(){return this.style.border}set border(e){this._applyStyle(\"border\",e)}get fill(){return this.style.fill}set fill(e){this._applyStyle(\"fill\",e)}static toModel(e){const t=[];let r=null;return e&&e.forEach((e,n)=>{e.isDefault?r&&(r=null):r&&e.equivalentTo(r)?r.max=n+1:(r={min:n+1,max:n+1,width:void 0!==e.width?e.width:9,style:e.style,isCustomWidth:e.isCustomWidth,hidden:e.hidden,outlineLevel:e.outlineLevel,collapsed:e.collapsed},t.push(r))}),t.length?t:void 0}static fromModel(e,t){const r=[];let n=1,i=0;for(t=(t=t||[]).sort((function(e,t){return e.min-t.min}));i<t.length;){const s=t[i++];for(;n<s.min;)r.push(new o(e,n++));for(;n<=s.max;)r.push(new o(e,n++,s))}return r.length?r:null}}t.exports=o},{\"../utils/col-cache\":19,\"../utils/under-dash\":26,\"./enums\":7}],5:[function(e,t,r){\"use strict\";t.exports=class{constructor(e){this.model=e||{}}add(e,t){return this.model[e]=t}find(e){return this.model[e]}remove(e){this.model[e]=void 0}}},{}],6:[function(e,t,r){\"use strict\";const n=e(\"../utils/under-dash\"),i=e(\"../utils/col-cache\"),s=e(\"../utils/cell-matrix\"),o=e(\"./range\"),a=/[$](\\w+)[$](\\d+)(:[$](\\w+)[$](\\d+))?/;t.exports=class{constructor(){this.matrixMap={}}getMatrix(e){return this.matrixMap[e]||(this.matrixMap[e]=new s)}add(e,t){const r=i.decodeEx(e);this.addEx(r,t)}addEx(e,t){const r=this.getMatrix(t);if(e.top)for(let t=e.left;t<=e.right;t++)for(let n=e.top;n<=e.bottom;n++){const s={sheetName:e.sheetName,address:i.n2l(t)+n,row:n,col:t};r.addCellEx(s)}else r.addCellEx(e)}remove(e,t){const r=i.decodeEx(e);this.removeEx(r,t)}removeEx(e,t){this.getMatrix(t).removeCellEx(e)}removeAllNames(e){n.each(this.matrixMap,t=>{t.removeCellEx(e)})}forEach(e){n.each(this.matrixMap,(t,r)=>{t.forEach(t=>{e(r,t)})})}getNames(e){return this.getNamesEx(i.decodeEx(e))}getNamesEx(e){return n.map(this.matrixMap,(t,r)=>t.findCellEx(e)&&r).filter(Boolean)}_explore(e,t){t.mark=!1;const{sheetName:r}=t,n=new o(t.row,t.col,t.row,t.col,r);let i,s;function a(i,s){const o=e.findCellAt(r,i,t.col);return!(!o||!o.mark)&&(n[s]=i,o.mark=!1,!0)}for(s=t.row-1;a(s,\"top\");s--);for(s=t.row+1;a(s,\"bottom\");s++);function l(t,i){const o=[];for(s=n.top;s<=n.bottom;s++){const n=e.findCellAt(r,s,t);if(!n||!n.mark)return!1;o.push(n)}n[i]=t;for(let e=0;e<o.length;e++)o[e].mark=!1;return!0}for(i=t.col-1;l(i,\"left\");i--);for(i=t.col+1;l(i,\"right\");i++);return n}getRanges(e,t){if(!(t=t||this.matrixMap[e]))return{name:e,ranges:[]};t.forEach(e=>{e.mark=!0});return{name:e,ranges:t.map(e=>e.mark&&this._explore(t,e)).filter(Boolean).map(e=>e.$shortRange)}}normaliseMatrix(e,t){e.forEachInSheet(t,(e,t,r)=>{e&&(e.row===t&&e.col===r||(e.row=t,e.col=r,e.address=i.n2l(r)+t))})}spliceRows(e,t,r,i){n.each(this.matrixMap,n=>{n.spliceRows(e,t,r,i),this.normaliseMatrix(n,e)})}spliceColumns(e,t,r,i){n.each(this.matrixMap,n=>{n.spliceColumns(e,t,r,i),this.normaliseMatrix(n,e)})}get model(){return n.map(this.matrixMap,(e,t)=>this.getRanges(t,e)).filter(e=>e.ranges.length)}set model(e){const t=this.matrixMap={};e.forEach(e=>{const r=t[e.name]=new s;e.ranges.forEach(e=>{a.test(e.split(\"!\").pop()||\"\")&&r.addCell(e)})})}}},{\"../utils/cell-matrix\":18,\"../utils/col-cache\":19,\"../utils/under-dash\":26,\"./range\":10}],7:[function(e,t,r){\"use strict\";t.exports={ValueType:{Null:0,Merge:1,Number:2,String:3,Date:4,Hyperlink:5,Formula:6,SharedString:7,RichText:8,Boolean:9,Error:10},FormulaType:{None:0,Master:1,Shared:2},RelationshipType:{None:0,OfficeDocument:1,Worksheet:2,CalcChain:3,SharedStrings:4,Styles:5,Theme:6,Hyperlink:7},DocumentType:{Xlsx:1},ReadingOrder:{LeftToRight:1,RightToLeft:2},ErrorValue:{NotApplicable:\"#N/A\",Ref:\"#REF!\",Name:\"#NAME?\",DivZero:\"#DIV/0!\",Null:\"#NULL!\",Value:\"#VALUE!\",Num:\"#NUM!\"}}},{}],8:[function(e,t,r){\"use strict\";const n=e(\"../utils/col-cache\"),i=e(\"./anchor\");t.exports=class{constructor(e,t){this.worksheet=e,this.model=t}get model(){switch(this.type){case\"background\":return{type:this.type,imageId:this.imageId};case\"image\":return{type:this.type,imageId:this.imageId,hyperlinks:this.range.hyperlinks,range:{tl:this.range.tl.model,br:this.range.br&&this.range.br.model,ext:this.range.ext,editAs:this.range.editAs}};default:throw new Error(\"Invalid Image Type\")}}set model(e){let{type:t,imageId:r,range:s,hyperlinks:o}=e;if(this.type=t,this.imageId=r,\"image\"===t)if(\"string\"==typeof s){const e=n.decode(s);this.range={tl:new i(this.worksheet,{col:e.left,row:e.top},-1),br:new i(this.worksheet,{col:e.right,row:e.bottom},0),editAs:\"oneCell\"}}else this.range={tl:new i(this.worksheet,s.tl,0),br:s.br&&new i(this.worksheet,s.br,0),ext:s.ext,editAs:s.editAs,hyperlinks:o||s.hyperlinks}}}},{\"../utils/col-cache\":19,\"./anchor\":2}],9:[function(e,t,r){\"use strict\";const n=e(\"../utils/under-dash\");class i{constructor(e){this.note=e}get model(){let e=null;switch(typeof this.note){case\"string\":e={type:\"note\",note:{texts:[{text:this.note}]}};break;default:e={type:\"note\",note:this.note}}return n.deepMerge({},i.DEFAULT_CONFIGS,e)}set model(e){const{note:t}=e,{texts:r}=t;1===r.length&&1===Object.keys(r[0]).length?this.note=r[0].text:this.note=t}static fromModel(e){const t=new i;return t.model=e,t}}i.DEFAULT_CONFIGS={note:{margins:{insetmode:\"auto\",inset:[.13,.13,.25,.25]},protection:{locked:\"True\",lockText:\"True\"},editAs:\"absolute\"}},t.exports=i},{\"../utils/under-dash\":26}],10:[function(e,t,r){\"use strict\";const n=e(\"../utils/col-cache\");class i{constructor(){this.decode(arguments)}setTLBR(e,t,r,i,s){if(arguments.length<4){const i=n.decodeAddress(e),o=n.decodeAddress(t);this.model={top:Math.min(i.row,o.row),left:Math.min(i.col,o.col),bottom:Math.max(i.row,o.row),right:Math.max(i.col,o.col),sheetName:r},this.setTLBR(i.row,i.col,o.row,o.col,s)}else this.model={top:Math.min(e,r),left:Math.min(t,i),bottom:Math.max(e,r),right:Math.max(t,i),sheetName:s}}decode(e){switch(e.length){case 5:this.setTLBR(e[0],e[1],e[2],e[3],e[4]);break;case 4:this.setTLBR(e[0],e[1],e[2],e[3]);break;case 3:this.setTLBR(e[0],e[1],e[2]);break;case 2:this.setTLBR(e[0],e[1]);break;case 1:{const t=e[0];if(t instanceof i)this.model={top:t.model.top,left:t.model.left,bottom:t.model.bottom,right:t.model.right,sheetName:t.sheetName};else if(t instanceof Array)this.decode(t);else if(t.top&&t.left&&t.bottom&&t.right)this.model={top:t.top,left:t.left,bottom:t.bottom,right:t.right,sheetName:t.sheetName};else{const e=n.decodeEx(t);e.top?this.model={top:e.top,left:e.left,bottom:e.bottom,right:e.right,sheetName:e.sheetName}:this.model={top:e.row,left:e.col,bottom:e.row,right:e.col,sheetName:e.sheetName}}break}case 0:this.model={top:0,left:0,bottom:0,right:0};break;default:throw new Error(\"Invalid number of arguments to _getDimensions() - \"+e.length)}}get top(){return this.model.top||1}set top(e){this.model.top=e}get left(){return this.model.left||1}set left(e){this.model.left=e}get bottom(){return this.model.bottom||1}set bottom(e){this.model.bottom=e}get right(){return this.model.right||1}set right(e){this.model.right=e}get sheetName(){return this.model.sheetName}set sheetName(e){this.model.sheetName=e}get _serialisedSheetName(){const{sheetName:e}=this.model;return e?/^[a-zA-Z0-9]*$/.test(e)?e+\"!\":`'${e}'!`:\"\"}expand(e,t,r,n){(!this.model.top||e<this.top)&&(this.top=e),(!this.model.left||t<this.left)&&(this.left=t),(!this.model.bottom||r>this.bottom)&&(this.bottom=r),(!this.model.right||n>this.right)&&(this.right=n)}expandRow(e){if(e){const{dimensions:t,number:r}=e;t&&this.expand(r,t.min,r,t.max)}}expandToAddress(e){const t=n.decodeEx(e);this.expand(t.row,t.col,t.row,t.col)}get tl(){return n.n2l(this.left)+this.top}get $t$l(){return`$${n.n2l(this.left)}$${this.top}`}get br(){return n.n2l(this.right)+this.bottom}get $b$r(){return`$${n.n2l(this.right)}$${this.bottom}`}get range(){return`${this._serialisedSheetName+this.tl}:${this.br}`}get $range(){return`${this._serialisedSheetName+this.$t$l}:${this.$b$r}`}get shortRange(){return this.count>1?this.range:this._serialisedSheetName+this.tl}get $shortRange(){return this.count>1?this.$range:this._serialisedSheetName+this.$t$l}get count(){return(1+this.bottom-this.top)*(1+this.right-this.left)}toString(){return this.range}intersects(e){return(!e.sheetName||!this.sheetName||e.sheetName===this.sheetName)&&(!(e.bottom<this.top)&&(!(e.top>this.bottom)&&(!(e.right<this.left)&&!(e.left>this.right))))}contains(e){const t=n.decodeEx(e);return this.containsEx(t)}containsEx(e){return(!e.sheetName||!this.sheetName||e.sheetName===this.sheetName)&&(e.row>=this.top&&e.row<=this.bottom&&e.col>=this.left&&e.col<=this.right)}forEachAddress(e){for(let t=this.left;t<=this.right;t++)for(let r=this.top;r<=this.bottom;r++)e(n.encodeAddress(r,t),r,t)}}t.exports=i},{\"../utils/col-cache\":19}],11:[function(e,t,r){\"use strict\";const n=e(\"../utils/under-dash\"),i=e(\"./enums\"),s=e(\"../utils/col-cache\"),o=e(\"./cell\");t.exports=class{constructor(e,t){this._worksheet=e,this._number=t,this._cells=[],this.style={},this.outlineLevel=0}get number(){return this._number}get worksheet(){return this._worksheet}commit(){this._worksheet._commitRow(this)}destroy(){delete this._worksheet,delete this._cells,delete this.style}findCell(e){return this._cells[e-1]}getCellEx(e){let t=this._cells[e.col-1];if(!t){const r=this._worksheet.getColumn(e.col);t=new o(this,r,e.address),this._cells[e.col-1]=t}return t}getCell(e){if(\"string\"==typeof e){const t=this._worksheet.getColumnKey(e);e=t?t.number:s.l2n(e)}return this._cells[e-1]||this.getCellEx({address:s.encodeAddress(this._number,e),row:this._number,col:e})}splice(e,t){const r=e+t;for(var n=arguments.length,i=new Array(n>2?n-2:0),s=2;s<n;s++)i[s-2]=arguments[s];const o=i.length-t,a=this._cells.length;let l,c,u;if(o<0)for(l=e+i.length;l<=a;l++)u=this._cells[l-1],c=this._cells[l-o-1],c?(u=this.getCell(l),u.value=c.value,u.style=c.style,u._comment=c._comment):u&&(u.value=null,u.style={},u._comment=void 0);else if(o>0)for(l=a;l>=r;l--)c=this._cells[l-1],c?(u=this.getCell(l+o),u.value=c.value,u.style=c.style,u._comment=c._comment):this._cells[l+o-1]=void 0;for(l=0;l<i.length;l++)u=this.getCell(e+l),u.value=i[l],u.style={},u._comment=void 0}eachCell(e,t){if(t||(t=e,e=null),e&&e.includeEmpty){const e=this._cells.length;for(let r=1;r<=e;r++)t(this.getCell(r),r)}else this._cells.forEach((e,r)=>{e&&e.type!==i.ValueType.Null&&t(e,r+1)})}addPageBreak(e,t){const r=this._worksheet,n=Math.max(0,e-1)||0,i=Math.max(0,t-1)||16838,s={id:this._number,max:i,man:1};n&&(s.min=n),r.rowBreaks.push(s)}get values(){const e=[];return this._cells.forEach(t=>{t&&t.type!==i.ValueType.Null&&(e[t.col]=t.value)}),e}set values(e){if(this._cells=[],e)if(e instanceof Array){let t=0;e.hasOwnProperty(\"0\")&&(t=1),e.forEach((e,r)=>{void 0!==e&&(this.getCellEx({address:s.encodeAddress(this._number,r+t),row:this._number,col:r+t}).value=e)})}else this._worksheet.eachColumnKey((t,r)=>{void 0!==e[r]&&(this.getCellEx({address:s.encodeAddress(this._number,t.number),row:this._number,col:t.number}).value=e[r])});else;}get hasValues(){return n.some(this._cells,e=>e&&e.type!==i.ValueType.Null)}get cellCount(){return this._cells.length}get actualCellCount(){let e=0;return this.eachCell(()=>{e++}),e}get dimensions(){let e=0,t=0;return this._cells.forEach(r=>{r&&r.type!==i.ValueType.Null&&((!e||e>r.col)&&(e=r.col),t<r.col&&(t=r.col))}),e>0?{min:e,max:t}:null}_applyStyle(e,t){return this.style[e]=t,this._cells.forEach(r=>{r&&(r[e]=t)}),t}get numFmt(){return this.style.numFmt}set numFmt(e){this._applyStyle(\"numFmt\",e)}get font(){return this.style.font}set font(e){this._applyStyle(\"font\",e)}get alignment(){return this.style.alignment}set alignment(e){this._applyStyle(\"alignment\",e)}get protection(){return this.style.protection}set protection(e){this._applyStyle(\"protection\",e)}get border(){return this.style.border}set border(e){this._applyStyle(\"border\",e)}get fill(){return this.style.fill}set fill(e){this._applyStyle(\"fill\",e)}get hidden(){return!!this._hidden}set hidden(e){this._hidden=e}get outlineLevel(){return this._outlineLevel||0}set outlineLevel(e){this._outlineLevel=e}get collapsed(){return!!(this._outlineLevel&&this._outlineLevel>=this._worksheet.properties.outlineLevelRow)}get model(){const e=[];let t=0,r=0;return this._cells.forEach(n=>{if(n){const i=n.model;i&&((!t||t>n.col)&&(t=n.col),r<n.col&&(r=n.col),e.push(i))}}),this.height||e.length?{cells:e,number:this.number,min:t,max:r,height:this.height,style:this.style,hidden:this.hidden,outlineLevel:this.outlineLevel,collapsed:this.collapsed}:null}set model(e){if(e.number!==this._number)throw new Error(\"Invalid row number in model\");let t;this._cells=[],e.cells.forEach(e=>{switch(e.type){case o.Types.Merge:break;default:{let r;if(e.address)r=s.decodeAddress(e.address);else if(t){const{row:e}=t,n=t.col+1;r={row:e,col:n,address:s.encodeAddress(e,n),$col$row:`$${s.n2l(n)}$${e}`}}t=r;this.getCellEx(r).model=e;break}}}),e.height?this.height=e.height:delete this.height,this.hidden=e.hidden,this.outlineLevel=e.outlineLevel||0,this.style=e.style&&JSON.parse(JSON.stringify(e.style))||{}}}},{\"../utils/col-cache\":19,\"../utils/under-dash\":26,\"./cell\":3,\"./enums\":7}],12:[function(e,t,r){\"use strict\";const n=e(\"../utils/col-cache\");class i{constructor(e,t,r){this.table=e,this.column=t,this.index=r}_set(e,t){this.table.cacheState(),this.column[e]=t}get name(){return this.column.name}set name(e){this._set(\"name\",e)}get filterButton(){return this.column.filterButton}set filterButton(e){this.column.filterButton=e}get style(){return this.column.style}set style(e){this.column.style=e}get totalsRowLabel(){return this.column.totalsRowLabel}set totalsRowLabel(e){this._set(\"totalsRowLabel\",e)}get totalsRowFunction(){return this.column.totalsRowFunction}set totalsRowFunction(e){this._set(\"totalsRowFunction\",e)}get totalsRowResult(){return this.column.totalsRowResult}set totalsRowResult(e){this._set(\"totalsRowResult\",e)}get totalsRowFormula(){return this.column.totalsRowFormula}set totalsRowFormula(e){this._set(\"totalsRowFormula\",e)}}t.exports=class{constructor(e,t){this.worksheet=e,t&&(this.table=t,this.validate(),this.store())}getFormula(e){switch(e.totalsRowFunction){case\"none\":return null;case\"average\":return`SUBTOTAL(101,${this.table.name}[${e.name}])`;case\"countNums\":return`SUBTOTAL(102,${this.table.name}[${e.name}])`;case\"count\":return`SUBTOTAL(103,${this.table.name}[${e.name}])`;case\"max\":return`SUBTOTAL(104,${this.table.name}[${e.name}])`;case\"min\":return`SUBTOTAL(105,${this.table.name}[${e.name}])`;case\"stdDev\":return`SUBTOTAL(106,${this.table.name}[${e.name}])`;case\"var\":return`SUBTOTAL(107,${this.table.name}[${e.name}])`;case\"sum\":return`SUBTOTAL(109,${this.table.name}[${e.name}])`;case\"custom\":return e.totalsRowFormula;default:throw new Error(\"Invalid Totals Row Function: \"+e.totalsRowFunction)}}get width(){return this.table.columns.length}get height(){return this.table.rows.length}get filterHeight(){return this.height+(this.table.headerRow?1:0)}get tableHeight(){return this.filterHeight+(this.table.totalsRow?1:0)}validate(){const{table:e}=this,t=(e,t,r)=>{void 0===e[t]&&(e[t]=r)};t(e,\"headerRow\",!0),t(e,\"totalsRow\",!1),t(e,\"style\",{}),t(e.style,\"theme\",\"TableStyleMedium2\"),t(e.style,\"showFirstColumn\",!1),t(e.style,\"showLastColumn\",!1),t(e.style,\"showRowStripes\",!1),t(e.style,\"showColumnStripes\",!1);const r=(e,t)=>{if(!e)throw new Error(t)};r(e.ref,\"Table must have ref\"),r(e.columns,\"Table must have column definitions\"),r(e.rows,\"Table must have row definitions\"),e.tl=n.decodeAddress(e.ref);const{row:i,col:s}=e.tl;r(i>0,\"Table must be on valid row\"),r(s>0,\"Table must be on valid col\");const{width:o,filterHeight:a,tableHeight:l}=this;e.autoFilterRef=n.encode(i,s,i+a-1,s+o-1),e.tableRef=n.encode(i,s,i+l-1,s+o-1),e.columns.forEach((e,n)=>{r(e.name,`Column ${n} must have a name`),0===n?t(e,\"totalsRowLabel\",\"Total\"):(t(e,\"totalsRowFunction\",\"none\"),e.totalsRowFormula=this.getFormula(e))})}store(){const e=(e,t)=>{t&&Object.keys(t).forEach(r=>{e[r]=t[r]})},{worksheet:t,table:r}=this,{row:n,col:i}=r.tl;let s=0;if(r.headerRow){const o=t.getRow(n+s++);r.columns.forEach((t,r)=>{const{style:n,name:s}=t,a=o.getCell(i+r);a.value=s,e(a,n)})}if(r.rows.forEach(o=>{const a=t.getRow(n+s++);o.forEach((t,n)=>{const s=a.getCell(i+n);s.value=t,e(s,r.columns[n].style)})}),r.totalsRow){const o=t.getRow(n+s++);r.columns.forEach((t,r)=>{const n=o.getCell(i+r);if(0===r)n.value=t.totalsRowLabel;else{const e=this.getFormula(t);n.value=e?{formula:t.totalsRowFormula,result:t.totalsRowResult}:null}e(n,t.style)})}}load(e){const{table:t}=this,{row:r,col:n}=t.tl;let i=0;if(t.headerRow){const s=e.getRow(r+i++);t.columns.forEach((e,t)=>{s.getCell(n+t).value=e.name})}if(t.rows.forEach(t=>{const s=e.getRow(r+i++);t.forEach((e,t)=>{s.getCell(n+t).value=e})}),t.totalsRow){const s=e.getRow(r+i++);t.columns.forEach((e,t)=>{const r=s.getCell(n+t);if(0===t)r.value=e.totalsRowLabel;else{this.getFormula(e)&&(r.value={formula:e.totalsRowFormula,result:e.totalsRowResult})}})}}get model(){return this.table}set model(e){this.table=e}cacheState(){this._cache||(this._cache={ref:this.ref,width:this.width,tableHeight:this.tableHeight})}commit(){if(!this._cache)return;this.validate();const e=n.decodeAddress(this._cache.ref);if(this.ref!==this._cache.ref)for(let t=0;t<this._cache.tableHeight;t++){const r=this.worksheet.getRow(e.row+t);for(let t=0;t<this._cache.width;t++){r.getCell(e.col+t).value=null}}else{for(let t=this.tableHeight;t<this._cache.tableHeight;t++){const r=this.worksheet.getRow(e.row+t);for(let t=0;t<this._cache.width;t++){r.getCell(e.col+t).value=null}}for(let t=0;t<this.tableHeight;t++){const r=this.worksheet.getRow(e.row+t);for(let t=this.width;t<this._cache.width;t++){r.getCell(e.col+t).value=null}}}this.store()}addRow(e,t){this.cacheState(),void 0===t?this.table.rows.push(e):this.table.rows.splice(t,0,e)}removeRows(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;this.cacheState(),this.table.rows.splice(e,t)}getColumn(e){const t=this.table.columns[e];return new i(this,t,e)}addColumn(e,t,r){this.cacheState(),void 0===r?(this.table.columns.push(e),this.table.rows.forEach((e,r)=>{e.push(t[r])})):(this.table.columns.splice(r,0,e),this.table.rows.forEach((e,n)=>{e.splice(r,0,t[n])}))}removeColumns(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;this.cacheState(),this.table.columns.splice(e,t),this.table.rows.forEach(r=>{r.splice(e,t)})}_assign(e,t,r){this.cacheState(),e[t]=r}get ref(){return this.table.ref}set ref(e){this._assign(this.table,\"ref\",e)}get name(){return this.table.name}set name(e){this.table.name=e}get displayName(){return this.table.displyName||this.table.name}set displayNamename(e){this.table.displayName=e}get headerRow(){return this.table.headerRow}set headerRow(e){this._assign(this.table,\"headerRow\",e)}get totalsRow(){return this.table.totalsRow}set totalsRow(e){this._assign(this.table,\"totalsRow\",e)}get theme(){return this.table.style.name}set theme(e){this.table.style.name=e}get showFirstColumn(){return this.table.style.showFirstColumn}set showFirstColumn(e){this.table.style.showFirstColumn=e}get showLastColumn(){return this.table.style.showLastColumn}set showLastColumn(e){this.table.style.showLastColumn=e}get showRowStripes(){return this.table.style.showRowStripes}set showRowStripes(e){this.table.style.showRowStripes=e}get showColumnStripes(){return this.table.style.showColumnStripes}set showColumnStripes(e){this.table.style.showColumnStripes=e}}},{\"../utils/col-cache\":19}],13:[function(e,t,r){\"use strict\";const n=e(\"./worksheet\"),i=e(\"./defined-names\"),s=e(\"../xlsx/xlsx\"),o=e(\"../csv/csv\");t.exports=class{constructor(){this.category=\"\",this.company=\"\",this.created=new Date,this.description=\"\",this.keywords=\"\",this.manager=\"\",this.modified=this.created,this.properties={},this.calcProperties={},this._worksheets=[],this.subject=\"\",this.title=\"\",this.views=[],this.media=[],this._definedNames=new i}get xlsx(){return this._xlsx||(this._xlsx=new s(this)),this._xlsx}get csv(){return this._csv||(this._csv=new o(this)),this._csv}get nextId(){for(let e=1;e<this._worksheets.length;e++)if(!this._worksheets[e])return e;return this._worksheets.length||1}addWorksheet(e,t){const r=this.nextId;t&&(\"string\"==typeof t?(console.trace('tabColor argument is now deprecated. Please use workbook.addWorksheet(name, {properties: { tabColor: { argb: \"rbg value\" } }'),t={properties:{tabColor:{argb:t}}}):(t.argb||t.theme||t.indexed)&&(console.trace(\"tabColor argument is now deprecated. Please use workbook.addWorksheet(name, {properties: { tabColor: { ... } }\"),t={properties:{tabColor:t}}));const i=this._worksheets.reduce((e,t)=>(t&&t.orderNo)>e?t.orderNo:e,0),s=Object.assign({},t,{id:r,name:e,orderNo:i+1,workbook:this}),o=new n(s);return this._worksheets[r]=o,o}removeWorksheetEx(e){delete this._worksheets[e.id]}removeWorksheet(e){const t=this.getWorksheet(e);t&&t.destroy()}getWorksheet(e){return void 0===e?this._worksheets.find(Boolean):\"number\"==typeof e?this._worksheets[e]:\"string\"==typeof e?this._worksheets.find(t=>t&&t.name===e):void 0}get worksheets(){return this._worksheets.slice(1).sort((e,t)=>e.orderNo-t.orderNo).filter(Boolean)}eachSheet(e){this.worksheets.forEach(t=>{e(t,t.id)})}get definedNames(){return this._definedNames}clearThemes(){this._themes=void 0}addImage(e){const t=this.media.length;return this.media.push(Object.assign({},e,{type:\"image\"})),t}getImage(e){return this.media[e]}get model(){return{creator:this.creator||\"Unknown\",lastModifiedBy:this.lastModifiedBy||\"Unknown\",lastPrinted:this.lastPrinted,created:this.created,modified:this.modified,properties:this.properties,worksheets:this.worksheets.map(e=>e.model),sheets:this.worksheets.map(e=>e.model).filter(Boolean),definedNames:this._definedNames.model,views:this.views,company:this.company,manager:this.manager,title:this.title,subject:this.subject,keywords:this.keywords,category:this.category,description:this.description,language:this.language,revision:this.revision,contentStatus:this.contentStatus,themes:this._themes,media:this.media,calcProperties:this.calcProperties}}set model(e){this.creator=e.creator,this.lastModifiedBy=e.lastModifiedBy,this.lastPrinted=e.lastPrinted,this.created=e.created,this.modified=e.modified,this.company=e.company,this.manager=e.manager,this.title=e.title,this.subject=e.subject,this.keywords=e.keywords,this.category=e.category,this.description=e.description,this.language=e.language,this.revision=e.revision,this.contentStatus=e.contentStatus,this.properties=e.properties,this.calcProperties=e.calcProperties,this._worksheets=[],e.worksheets.forEach(t=>{const{id:r,name:i,state:s}=t,o=e.sheets&&e.sheets.findIndex(e=>e.id===r);(this._worksheets[r]=new n({id:r,name:i,orderNo:o,state:s,workbook:this})).model=t}),this._definedNames.model=e.definedNames,this.views=e.views,this._themes=e.themes,this.media=e.media||[]}}},{\"../csv/csv\":1,\"../xlsx/xlsx\":144,\"./defined-names\":6,\"./worksheet\":14}],14:[function(e,t,r){\"use strict\";const n=e(\"../utils/under-dash\"),i=e(\"../utils/col-cache\"),s=e(\"./range\"),o=e(\"./row\"),a=e(\"./column\"),l=e(\"./enums\"),c=e(\"./image\"),u=e(\"./table\"),h=e(\"./data-validations\"),f=e(\"../utils/encryptor\"),{copyStyle:d}=e(\"../utils/copy-style\");t.exports=class{constructor(e){e=e||{},this._workbook=e.workbook,this.id=e.id,this.orderNo=e.orderNo,this.name=e.name,this.state=e.state||\"visible\",this._rows=[],this._columns=null,this._keys={},this._merges={},this.rowBreaks=[],this.properties=Object.assign({},{defaultRowHeight:15,dyDescent:55,outlineLevelCol:0,outlineLevelRow:0},e.properties),this.pageSetup=Object.assign({},{margins:{left:.7,right:.7,top:.75,bottom:.75,header:.3,footer:.3},orientation:\"portrait\",horizontalDpi:4294967295,verticalDpi:4294967295,fitToPage:!(!e.pageSetup||!e.pageSetup.fitToWidth&&!e.pageSetup.fitToHeight||e.pageSetup.scale),pageOrder:\"downThenOver\",blackAndWhite:!1,draft:!1,cellComments:\"None\",errors:\"displayed\",scale:100,fitToWidth:1,fitToHeight:1,paperSize:void 0,showRowColHeaders:!1,showGridLines:!1,firstPageNumber:void 0,horizontalCentered:!1,verticalCentered:!1,rowBreaks:null,colBreaks:null},e.pageSetup),this.headerFooter=Object.assign({},{differentFirst:!1,differentOddEven:!1,oddHeader:null,oddFooter:null,evenHeader:null,evenFooter:null,firstHeader:null,firstFooter:null},e.headerFooter),this.dataValidations=new h,this.views=e.views||[],this.autoFilter=e.autoFilter||null,this._media=[],this.sheetProtection=null,this.tables={},this.conditionalFormattings=[]}get name(){return this._name}set name(e){if(void 0===e&&(e=\"sheet\"+this.id),this._name!==e){if(\"string\"!=typeof e)throw new Error(\"The name has to be a string.\");if(\"\"===e)throw new Error(\"The name can't be empty.\");if(\"History\"===e)throw new Error('The name \"History\" is protected. Please use a different name.');if(/[*?:/\\\\[\\]]/.test(e))throw new Error(`Worksheet name ${e} cannot include any of the following characters: * ? : \\\\ / [ ]`);if(/(^')|('$)/.test(e))throw new Error(\"The first or last character of worksheet name cannot be a single quotation mark: \"+e);if(e&&e.length>31&&(console.warn(`Worksheet name ${e} exceeds 31 chars. This will be truncated`),e=e.substring(0,31)),this._workbook._worksheets.find(t=>t&&t.name.toLowerCase()===e.toLowerCase()))throw new Error(\"Worksheet name already exists: \"+e);this._name=e}}get workbook(){return this._workbook}destroy(){this._workbook.removeWorksheetEx(this)}get dimensions(){const e=new s;return this._rows.forEach(t=>{if(t){const r=t.dimensions;r&&e.expand(t.number,r.min,t.number,r.max)}}),e}get columns(){return this._columns}set columns(e){this._headerRowCount=e.reduce((e,t)=>{const r=(t.header?1:t.headers&&t.headers.length)||0;return Math.max(e,r)},0);let t=1;const r=this._columns=[];e.forEach(e=>{const n=new a(this,t++,!1);r.push(n),n.defn=e})}getColumnKey(e){return this._keys[e]}setColumnKey(e,t){this._keys[e]=t}deleteColumnKey(e){delete this._keys[e]}eachColumnKey(e){n.each(this._keys,e)}getColumn(e){if(\"string\"==typeof e){const t=this._keys[e];if(t)return t;e=i.l2n(e)}if(this._columns||(this._columns=[]),e>this._columns.length){let t=this._columns.length+1;for(;t<=e;)this._columns.push(new a(this,t++))}return this._columns[e-1]}spliceColumns(e,t){const r=this._rows.length;for(var n=arguments.length,i=new Array(n>2?n-2:0),s=2;s<n;s++)i[s-2]=arguments[s];if(i.length>0)for(let n=0;n<r;n++){const r=[e,t];i.forEach(e=>{r.push(e[n]||null)});const s=this.getRow(n+1);s.splice.apply(s,r)}else this._rows.forEach(r=>{r&&r.splice(e,t)});const o=i.length-t,a=e+t,l=this._columns.length;if(o<0)for(let t=e+i.length;t<=l;t++)this.getColumn(t).defn=this.getColumn(t-o).defn;else if(o>0)for(let e=l;e>=a;e--)this.getColumn(e+o).defn=this.getColumn(e).defn;for(let t=e;t<e+i.length;t++)this.getColumn(t).defn=null;this.workbook.definedNames.spliceColumns(this.name,e,t,i.length)}get lastColumn(){return this.getColumn(this.columnCount)}get columnCount(){let e=0;return this.eachRow(t=>{e=Math.max(e,t.cellCount)}),e}get actualColumnCount(){const e=[];let t=0;return this.eachRow(r=>{r.eachCell(r=>{let{col:n}=r;e[n]||(e[n]=!0,t++)})}),t}_commitRow(){}get _lastRowNumber(){const e=this._rows;let t=e.length;for(;t>0&&void 0===e[t-1];)t--;return t}get _nextRow(){return this._lastRowNumber+1}get lastRow(){if(this._rows.length)return this._rows[this._rows.length-1]}findRow(e){return this._rows[e-1]}findRows(e,t){return this._rows.slice(e-1,e-1+t)}get rowCount(){return this._lastRowNumber}get actualRowCount(){let e=0;return this.eachRow(()=>{e++}),e}getRow(e){let t=this._rows[e-1];return t||(t=this._rows[e-1]=new o(this,e)),t}getRows(e,t){if(t<1)return;const r=[];for(let n=e;n<e+t;n++)r.push(this.getRow(n));return r}addRow(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"n\";const r=this._nextRow,n=this.getRow(r);return n.values=e,this._setStyleOption(r,\"i\"===t[0]?t:\"n\"),n}addRows(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"n\";const r=[];return e.forEach(e=>{r.push(this.addRow(e,t))}),r}insertRow(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"n\";return this.spliceRows(e,0,t),this._setStyleOption(e,r),this.getRow(e)}insertRows(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"n\";if(this.spliceRows(e,0,...t),\"n\"!==r)for(let n=0;n<t.length;n++)\"o\"===r[0]&&void 0!==this.findRow(t.length+e+n)?this._copyStyle(t.length+e+n,e+n,\"+\"===r[1]):\"i\"===r[0]&&void 0!==this.findRow(e-1)&&this._copyStyle(e-1,e+n,\"+\"===r[1]);return this.getRows(e,t.length)}_setStyleOption(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"n\";\"o\"===t[0]&&void 0!==this.findRow(e+1)?this._copyStyle(e+1,e,\"+\"===t[1]):\"i\"===t[0]&&void 0!==this.findRow(e-1)&&this._copyStyle(e-1,e,\"+\"===t[1])}_copyStyle(e,t){let r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const n=this.getRow(e),i=this.getRow(t);i.style=d(n.style),n.eachCell({includeEmpty:r},(e,t)=>{i.getCell(t).style=d(e.style)}),i.height=n.height}duplicateRow(e,t){let r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const n=this._rows[e-1],i=new Array(t).fill(n.values);this.spliceRows(e+1,r?0:t,...i);for(let r=0;r<t;r++){const t=this._rows[e+r];t.style=n.style,t.height=n.height,n.eachCell({includeEmpty:!0},(e,r)=>{t.getCell(r).style=e.style})}}spliceRows(e,t){const r=e+t;for(var n=arguments.length,i=new Array(n>2?n-2:0),s=2;s<n;s++)i[s-2]=arguments[s];const o=i.length,a=o-t,l=this._rows.length;let c,u;if(a<0)for(e===l&&(this._rows[l-1]=void 0),c=r;c<=l;c++)if(u=this._rows[c-1],u){const e=this.getRow(c+a);e.values=u.values,e.style=u.style,e.height=u.height,u.eachCell({includeEmpty:!0},(t,r)=>{e.getCell(r).style=t.style}),this._rows[c-1]=void 0}else this._rows[c+a-1]=void 0;else if(a>0)for(c=l;c>=r;c--)if(u=this._rows[c-1],u){const e=this.getRow(c+a);e.values=u.values,e.style=u.style,e.height=u.height,u.eachCell({includeEmpty:!0},(t,r)=>{if(e.getCell(r).style=t.style,\"MergeValue\"===t._value.constructor.name){const e=this.getRow(t._row._number+o).getCell(r),n=t._value._master,i=this.getRow(n._row._number+o).getCell(n._column._number);e.merge(i)}})}else this._rows[c+a-1]=void 0;for(c=0;c<o;c++){const t=this.getRow(e+c);t.style={},t.values=i[c]}this.workbook.definedNames.spliceRows(this.name,e,t,o)}eachRow(e,t){if(t||(t=e,e=void 0),e&&e.includeEmpty){const e=this._rows.length;for(let r=1;r<=e;r++)t(this.getRow(r),r)}else this._rows.forEach(e=>{e&&e.hasValues&&t(e,e.number)})}getSheetValues(){const e=[];return this._rows.forEach(t=>{t&&(e[t.number]=t.values)}),e}findCell(e,t){const r=i.getAddress(e,t),n=this._rows[r.row-1];return n?n.findCell(r.col):void 0}getCell(e,t){const r=i.getAddress(e,t);return this.getRow(r.row).getCellEx(r)}mergeCells(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];const n=new s(t);this._mergeCellsInternal(n)}mergeCellsWithoutStyle(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];const n=new s(t);this._mergeCellsInternal(n,!0)}_mergeCellsInternal(e,t){n.each(this._merges,t=>{if(t.intersects(e))throw new Error(\"Cannot merge already merged cells\")});const r=this.getCell(e.top,e.left);for(let n=e.top;n<=e.bottom;n++)for(let i=e.left;i<=e.right;i++)(n>e.top||i>e.left)&&this.getCell(n,i).merge(r,t);this._merges[r.address]=e}_unMergeMaster(e){const t=this._merges[e.address];if(t){for(let e=t.top;e<=t.bottom;e++)for(let r=t.left;r<=t.right;r++)this.getCell(e,r).unmerge();delete this._merges[e.address]}}get hasMerges(){return n.some(this._merges,Boolean)}unMergeCells(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];const n=new s(t);for(let e=n.top;e<=n.bottom;e++)for(let t=n.left;t<=n.right;t++){const r=this.findCell(e,t);r&&(r.type===l.ValueType.Merge?this._unMergeMaster(r.master):this._merges[r.address]&&this._unMergeMaster(r))}}fillFormula(e,t,r){let n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"shared\";const s=i.decode(e),{top:o,left:a,bottom:l,right:c}=s,u=c-a+1,h=i.encodeAddress(o,a),f=\"shared\"===n;let d;d=\"function\"==typeof r?r:Array.isArray(r)?Array.isArray(r[0])?(e,t)=>r[e-o][t-a]:(e,t)=>r[(e-o)*u+(t-a)]:()=>{};let p=!0;for(let r=o;r<=l;r++)for(let i=a;i<=c;i++)p?(this.getCell(r,i).value={shareType:n,formula:t,ref:e,result:d(r,i)},p=!1):this.getCell(r,i).value=f?{sharedFormula:h,result:d(r,i)}:d(r,i)}addImage(e,t){const r={type:\"image\",imageId:e,range:t};this._media.push(new c(this,r))}getImages(){return this._media.filter(e=>\"image\"===e.type)}addBackgroundImage(e){const t={type:\"background\",imageId:e};this._media.push(new c(this,t))}getBackgroundImageId(){const e=this._media.find(e=>\"background\"===e.type);return e&&e.imageId}protect(e,t){return new Promise(r=>{this.sheetProtection={sheet:!0},t&&\"spinCount\"in t&&(t.spinCount=Number.isFinite(t.spinCount)?Math.round(Math.max(0,t.spinCount)):1e5),e&&(this.sheetProtection.algorithmName=\"SHA-512\",this.sheetProtection.saltValue=f.randomBytes(16).toString(\"base64\"),this.sheetProtection.spinCount=t&&\"spinCount\"in t?t.spinCount:1e5,this.sheetProtection.hashValue=f.convertPasswordToHash(e,\"SHA512\",this.sheetProtection.saltValue,this.sheetProtection.spinCount)),t&&(this.sheetProtection=Object.assign(this.sheetProtection,t),!e&&\"spinCount\"in t&&delete this.sheetProtection.spinCount),r()})}unprotect(){this.sheetProtection=null}addTable(e){const t=new u(this,e);return this.tables[e.name]=t,t}getTable(e){return this.tables[e]}removeTable(e){delete this.tables[e]}getTables(){return Object.values(this.tables)}addConditionalFormatting(e){this.conditionalFormattings.push(e)}removeConditionalFormatting(e){\"number\"==typeof e?this.conditionalFormattings.splice(e,1):this.conditionalFormattings=e instanceof Function?this.conditionalFormattings.filter(e):[]}get tabColor(){return console.trace(\"worksheet.tabColor property is now deprecated. Please use worksheet.properties.tabColor\"),this.properties.tabColor}set tabColor(e){console.trace(\"worksheet.tabColor property is now deprecated. Please use worksheet.properties.tabColor\"),this.properties.tabColor=e}get model(){const e={id:this.id,name:this.name,dataValidations:this.dataValidations.model,properties:this.properties,state:this.state,pageSetup:this.pageSetup,headerFooter:this.headerFooter,rowBreaks:this.rowBreaks,views:this.views,autoFilter:this.autoFilter,media:this._media.map(e=>e.model),sheetProtection:this.sheetProtection,tables:Object.values(this.tables).map(e=>e.model),conditionalFormattings:this.conditionalFormattings};e.cols=a.toModel(this.columns);const t=e.rows=[],r=e.dimensions=new s;return this._rows.forEach(e=>{const n=e&&e.model;n&&(r.expand(n.number,n.min,n.number,n.max),t.push(n))}),e.merges=[],n.each(this._merges,t=>{e.merges.push(t.range)}),e}_parseRows(e){this._rows=[],e.rows.forEach(e=>{const t=new o(this,e.number);this._rows[t.number-1]=t,t.model=e})}_parseMergeCells(e){n.each(e.mergeCells,e=>{this.mergeCellsWithoutStyle(e)})}set model(e){this.name=e.name,this._columns=a.fromModel(this,e.cols),this._parseRows(e),this._parseMergeCells(e),this.dataValidations=new h(e.dataValidations),this.properties=e.properties,this.pageSetup=e.pageSetup,this.headerFooter=e.headerFooter,this.views=e.views,this.autoFilter=e.autoFilter,this._media=e.media.map(e=>new c(this,e)),this.sheetProtection=e.sheetProtection,this.tables=e.tables.reduce((e,t)=>{const r=new u;return r.model=t,e[t.name]=r,e},{}),this.conditionalFormattings=e.conditionalFormattings}}},{\"../utils/col-cache\":19,\"../utils/copy-style\":20,\"../utils/encryptor\":21,\"../utils/under-dash\":26,\"./column\":4,\"./data-validations\":5,\"./enums\":7,\"./image\":8,\"./range\":10,\"./row\":11,\"./table\":12}],15:[function(e,t,r){\"use strict\";e(\"core-js/modules/es.promise\"),e(\"core-js/modules/es.promise.finally\"),e(\"core-js/modules/es.object.assign\"),e(\"core-js/modules/es.object.keys\"),e(\"core-js/modules/es.object.values\"),e(\"core-js/modules/es.symbol\"),e(\"core-js/modules/es.symbol.async-iterator\"),e(\"core-js/modules/es.array.iterator\"),e(\"core-js/modules/es.array.includes\"),e(\"core-js/modules/es.array.find-index\"),e(\"core-js/modules/es.array.find\"),e(\"core-js/modules/es.string.from-code-point\"),e(\"core-js/modules/es.string.includes\"),e(\"core-js/modules/es.number.is-nan\"),e(\"regenerator-runtime/runtime\");const n={Workbook:e(\"./doc/workbook\")},i=e(\"./doc/enums\");Object.keys(i).forEach(e=>{n[e]=i[e]}),t.exports=n},{\"./doc/enums\":7,\"./doc/workbook\":13,\"core-js/modules/es.array.find\":359,\"core-js/modules/es.array.find-index\":358,\"core-js/modules/es.array.includes\":360,\"core-js/modules/es.array.iterator\":361,\"core-js/modules/es.number.is-nan\":363,\"core-js/modules/es.object.assign\":364,\"core-js/modules/es.object.keys\":366,\"core-js/modules/es.object.values\":367,\"core-js/modules/es.promise\":372,\"core-js/modules/es.promise.finally\":371,\"core-js/modules/es.string.from-code-point\":376,\"core-js/modules/es.string.includes\":377,\"core-js/modules/es.symbol\":381,\"core-js/modules/es.symbol.async-iterator\":378,\"regenerator-runtime/runtime\":492}],16:[function(e,t,r){\"use strict\";const n=\"undefined\"==typeof TextDecoder?null:new TextDecoder(\"utf-8\");r.bufferToString=function(e){return\"string\"==typeof e?e:n?n.decode(e):e.toString()}},{}],17:[function(e,t,r){\"use strict\";const n=\"undefined\"==typeof TextEncoder?null:new TextEncoder(\"utf-8\"),{Buffer:i}=e(\"buffer\");r.stringToBuffer=function(e){return\"string\"!=typeof e?e:n?i.from(n.encode(e).buffer):i.from(e)}},{buffer:220}],18:[function(e,t,r){\"use strict\";const n=e(\"./under-dash\"),i=e(\"./col-cache\");t.exports=class{constructor(e){this.template=e,this.sheets={}}addCell(e){this.addCellEx(i.decodeEx(e))}getCell(e){return this.findCellEx(i.decodeEx(e),!0)}findCell(e){return this.findCellEx(i.decodeEx(e),!1)}findCellAt(e,t,r){const n=this.sheets[e],i=n&&n[t];return i&&i[r]}addCellEx(e){if(e.top)for(let t=e.top;t<=e.bottom;t++)for(let r=e.left;r<=e.right;r++)this.getCellAt(e.sheetName,t,r);else this.findCellEx(e,!0)}getCellEx(e){return this.findCellEx(e,!0)}findCellEx(e,t){const r=this.findSheet(e,t),n=this.findSheetRow(r,e,t);return this.findRowCell(n,e,t)}getCellAt(e,t,r){const n=this.sheets[e]||(this.sheets[e]=[]),s=n[t]||(n[t]=[]);return s[r]||(s[r]={sheetName:e,address:i.n2l(r)+t,row:t,col:r})}removeCellEx(e){const t=this.findSheet(e);if(!t)return;const r=this.findSheetRow(t,e);r&&delete r[e.col]}forEachInSheet(e,t){const r=this.sheets[e];r&&r.forEach((e,r)=>{e&&e.forEach((e,n)=>{e&&t(e,r,n)})})}forEach(e){n.each(this.sheets,(t,r)=>{this.forEachInSheet(r,e)})}map(e){const t=[];return this.forEach(r=>{t.push(e(r))}),t}findSheet(e,t){const r=e.sheetName;return this.sheets[r]?this.sheets[r]:t?this.sheets[r]=[]:void 0}findSheetRow(e,t,r){const{row:n}=t;return e&&e[n]?e[n]:r?e[n]=[]:void 0}findRowCell(e,t,r){const{col:n}=t;return e&&e[n]?e[n]:r?e[n]=this.template?Object.assign(t,JSON.parse(JSON.stringify(this.template))):t:void 0}spliceRows(e,t,r,n){const i=this.sheets[e];if(i){const e=[];for(let t=0;t<n;t++)e.push([]);i.splice(t,r,...e)}}spliceColumns(e,t,r,i){const s=this.sheets[e];if(s){const e=[];for(let t=0;t<i;t++)e.push(null);n.each(s,n=>{n.splice(t,r,...e)})}}}},{\"./col-cache\":19,\"./under-dash\":26}],19:[function(e,t,r){\"use strict\";const n=/^[A-Z]+\\d+$/,i={_dictionary:[\"A\",\"B\",\"C\",\"D\",\"E\",\"F\",\"G\",\"H\",\"I\",\"J\",\"K\",\"L\",\"M\",\"N\",\"O\",\"P\",\"Q\",\"R\",\"S\",\"T\",\"U\",\"V\",\"W\",\"X\",\"Y\",\"Z\"],_l2nFill:0,_l2n:{},_n2l:[],_level:e=>e<=26?1:e<=676?2:3,_fill(e){let t,r,n,i,s,o=1;if(e>=4)throw new Error(\"Out of bounds. Excel supports columns from 1 to 16384\");if(this._l2nFill<1&&e>=1){for(;o<=26;)t=this._dictionary[o-1],this._n2l[o]=t,this._l2n[t]=o,o++;this._l2nFill=1}if(this._l2nFill<2&&e>=2){for(o=27;o<=702;)r=o-27,n=r%26,i=Math.floor(r/26),t=this._dictionary[i]+this._dictionary[n],this._n2l[o]=t,this._l2n[t]=o,o++;this._l2nFill=2}if(this._l2nFill<3&&e>=3){for(o=703;o<=16384;)r=o-703,n=r%26,i=Math.floor(r/26)%26,s=Math.floor(r/676),t=this._dictionary[s]+this._dictionary[i]+this._dictionary[n],this._n2l[o]=t,this._l2n[t]=o,o++;this._l2nFill=3}},l2n(e){if(this._l2n[e]||this._fill(e.length),!this._l2n[e])throw new Error(\"Out of bounds. Invalid column letter: \"+e);return this._l2n[e]},n2l(e){if(e<1||e>16384)throw new Error(e+\" is out of bounds. Excel supports columns from 1 to 16384\");return this._n2l[e]||this._fill(this._level(e)),this._n2l[e]},_hash:{},validateAddress(e){if(!n.test(e))throw new Error(\"Invalid Address: \"+e);return!0},decodeAddress(e){const t=e.length<5&&this._hash[e];if(t)return t;let r=!1,n=\"\",i=0,s=!1,o=\"\",a=0;for(let t,l=0;l<e.length;l++)if(t=e.charCodeAt(l),!s&&t>=65&&t<=90)r=!0,n+=e[l],i=26*i+t-64;else if(t>=48&&t<=57)s=!0,o+=e[l],a=10*a+t-48;else if(s&&r&&36!==t)break;if(r){if(i>16384)throw new Error(\"Out of bounds. Invalid column letter: \"+n)}else i=void 0;s||(a=void 0);const l={address:e=n+o,col:i,row:a,$col$row:`$${n}$${o}`};return i<=100&&a<=100&&(this._hash[e]=l,this._hash[l.$col$row]=l),l},getAddress(e,t){if(t){const r=this.n2l(t)+e;return this.decodeAddress(r)}return this.decodeAddress(e)},decode(e){const t=e.split(\":\");if(2===t.length){const e=this.decodeAddress(t[0]),r=this.decodeAddress(t[1]),n={top:Math.min(e.row,r.row),left:Math.min(e.col,r.col),bottom:Math.max(e.row,r.row),right:Math.max(e.col,r.col)};return n.tl=this.n2l(n.left)+n.top,n.br=this.n2l(n.right)+n.bottom,n.dimensions=`${n.tl}:${n.br}`,n}return this.decodeAddress(e)},decodeEx(e){const t=e.match(/(?:(?:(?:'((?:[^']|'')*)')|([^'^ !]*))!)?(.*)/),r=t[1]||t[2],n=t[3],i=n.split(\":\");if(i.length>1){let e=this.decodeAddress(i[0]),t=this.decodeAddress(i[1]);const n=Math.min(e.row,t.row),s=Math.min(e.col,t.col),o=Math.max(e.row,t.row),a=Math.max(e.col,t.col);return e=this.n2l(s)+n,t=this.n2l(a)+o,{top:n,left:s,bottom:o,right:a,sheetName:r,tl:{address:e,col:s,row:n,$col$row:`$${this.n2l(s)}$${n}`,sheetName:r},br:{address:t,col:a,row:o,$col$row:`$${this.n2l(a)}$${o}`,sheetName:r},dimensions:`${e}:${t}`}}if(n.startsWith(\"#\"))return r?{sheetName:r,error:n}:{error:n};const s=this.decodeAddress(n);return r?{sheetName:r,...s}:s},encodeAddress:(e,t)=>i.n2l(t)+e,encode(){switch(arguments.length){case 2:return i.encodeAddress(arguments[0],arguments[1]);case 4:return`${i.encodeAddress(arguments[0],arguments[1])}:${i.encodeAddress(arguments[2],arguments[3])}`;default:throw new Error(\"Can only encode with 2 or 4 arguments\")}},inRange(e,t){const[r,n,,i,s]=e,[o,a]=t;return o>=r&&o<=i&&a>=n&&a<=s}};t.exports=i},{}],20:[function(e,t,r){\"use strict\";const n=(e,t)=>({...e,...t.reduce((t,r)=>(e[r]&&(t[r]={...e[r]}),t),{})}),i=function(e,t,r){let i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[];e[r]&&(t[r]=n(e[r],i))};r.copyStyle=e=>{if(!e)return e;if(t=e,0===Object.keys(t).length)return{};var t;const r={...e};return i(e,r,\"font\",[\"color\"]),i(e,r,\"alignment\"),i(e,r,\"protection\"),e.border&&(i(e,r,\"border\"),i(e.border,r.border,\"top\",[\"color\"]),i(e.border,r.border,\"left\",[\"color\"]),i(e.border,r.border,\"bottom\",[\"color\"]),i(e.border,r.border,\"right\",[\"color\"]),i(e.border,r.border,\"diagonal\",[\"color\"])),e.fill&&(i(e,r,\"fill\",[\"fgColor\",\"bgColor\",\"center\"]),e.fill.stops&&(r.fill.stops=e.fill.stops.map(e=>n(e,[\"color\"])))),r}},{}],21:[function(e,t,r){(function(r){(function(){\"use strict\";const n=e(\"crypto\"),i={hash(e){const t=n.createHash(e);for(var i=arguments.length,s=new Array(i>1?i-1:0),o=1;o<i;o++)s[o-1]=arguments[o];return t.update(r.concat(s)),t.digest()},convertPasswordToHash(e,t,i,s){t=t.toLowerCase();if(n.getHashes().indexOf(t)<0)throw new Error(`Hash algorithm '${t}' not supported!`);const o=r.from(e,\"utf16le\");let a=this.hash(t,r.from(i,\"base64\"),o);for(let e=0;e<s;e++){const n=r.alloc(4);n.writeUInt32LE(e,0),a=this.hash(t,a,n)}return a.toString(\"base64\")},randomBytes:e=>n.randomBytes(e)};t.exports=i}).call(this)}).call(this,e(\"buffer\").Buffer)},{buffer:220,crypto:390}],22:[function(e,t,r){\"use strict\";const{SaxesParser:n}=e(\"saxes\"),{PassThrough:i}=e(\"readable-stream\"),{bufferToString:s}=e(\"./browser-buffer-decode\");t.exports=async function*(e){e.pipe&&!e[Symbol.asyncIterator]&&(e=e.pipe(new i));const t=new n;let r;t.on(\"error\",e=>{r=e});let o=[];t.on(\"opentag\",e=>o.push({eventType:\"opentag\",value:e})),t.on(\"text\",e=>o.push({eventType:\"text\",value:e})),t.on(\"closetag\",e=>o.push({eventType:\"closetag\",value:e}));for await(const n of e){if(t.write(s(n)),r)throw r;yield o,o=[]}}},{\"./browser-buffer-decode\":16,\"readable-stream\":491,saxes:496}],23:[function(e,t,r){\"use strict\";const n=e(\"./col-cache\"),i=/(([a-z_\\-0-9]*)!)?([a-z0-9_$]{2,})([(])?/gi,s=/^([$])?([a-z]+)([$])?([1-9][0-9]*)$/i;t.exports={slideFormula:function(e,t,r){const o=n.decode(t),a=n.decode(r);return e.replace(i,(e,t,r,i,l)=>{if(l)return e;const c=s.exec(i);if(c){const r=c[1],i=c[2].toUpperCase(),s=c[3],l=c[4];if(i.length>3||3===i.length&&i>\"XFD\")return e;let u=n.l2n(i),h=parseInt(l,10);r||(u+=a.col-o.col),s||(h+=a.row-o.row);return(t||\"\")+(r||\"\")+n.n2l(u)+(s||\"\")+h}return e})}}},{\"./col-cache\":19}],24:[function(e,t,r){(function(r,n){(function(){\"use strict\";const i=e(\"readable-stream\"),s=e(\"./utils\"),o=e(\"./string-buf\");class a{constructor(e,t){this._data=e,this._encoding=t}get length(){return this.toBuffer().length}copy(e,t,r,n){return this.toBuffer().copy(e,t,r,n)}toBuffer(){return this._buffer||(this._buffer=n.from(this._data,this._encoding)),this._buffer}}class l{constructor(e){this._data=e}get length(){return this._data.length}copy(e,t,r,n){return this._data._buf.copy(e,t,r,n)}toBuffer(){return this._data.toBuffer()}}class c{constructor(e){this._data=e}get length(){return this._data.length}copy(e,t,r,n){this._data.copy(e,t,r,n)}toBuffer(){return this._data}}class u{constructor(e){this.size=e,this.buffer=n.alloc(e),this.iRead=0,this.iWrite=0}toBuffer(){if(0===this.iRead&&this.iWrite===this.size)return this.buffer;const e=n.alloc(this.iWrite-this.iRead);return this.buffer.copy(e,0,this.iRead,this.iWrite),e}get length(){return this.iWrite-this.iRead}get eod(){return this.iRead===this.iWrite}get full(){return this.iWrite===this.size}read(e){let t;return 0===e?null:void 0===e||e>=this.length?(t=this.toBuffer(),this.iRead=this.iWrite,t):(t=n.alloc(e),this.buffer.copy(t,0,this.iRead,e),this.iRead+=e,t)}write(e,t,r){const n=Math.min(r,this.size-this.iWrite);return e.copy(this.buffer,this.iWrite,t,t+n),this.iWrite+=n,n}}const h=function(e){e=e||{},this.bufSize=e.bufSize||1048576,this.buffers=[],this.batch=e.batch||!1,this.corked=!1,this.inPos=0,this.outPos=0,this.pipes=[],this.paused=!1,this.encoding=null};s.inherits(h,i.Duplex,{toBuffer(){switch(this.buffers.length){case 0:return null;case 1:return this.buffers[0].toBuffer();default:return n.concat(this.buffers.map(e=>e.toBuffer()))}},_getWritableBuffer(){if(this.buffers.length){const e=this.buffers[this.buffers.length-1];if(!e.full)return e}const e=new u(this.bufSize);return this.buffers.push(e),e},async _pipe(e){await Promise.all(this.pipes.map((function(t){return new Promise(r=>{t.write(e.toBuffer(),()=>{r()})})})))},_writeToBuffers(e){let t=0;const r=e.length;for(;t<r;){t+=this._getWritableBuffer().write(e,t,r-t)}},async write(e,t,i){let u;if(t instanceof Function&&(i=t,t=\"utf8\"),i=i||s.nop,e instanceof o)u=new l(e);else if(e instanceof n)u=new c(e);else{if(!(\"string\"==typeof e||e instanceof String||e instanceof ArrayBuffer))throw new Error(\"Chunk must be one of type String, Buffer or StringBuf.\");u=new a(e,t)}if(this.pipes.length)if(this.batch)for(this._writeToBuffers(u);!this.corked&&this.buffers.length>1;)this._pipe(this.buffers.shift());else this.corked?(this._writeToBuffers(u),r.nextTick(i)):(await this._pipe(u),i());else this.paused||this.emit(\"data\",u.toBuffer()),this._writeToBuffers(u),this.emit(\"readable\");return!0},cork(){this.corked=!0},_flush(){if(this.pipes.length)for(;this.buffers.length;)this._pipe(this.buffers.shift())},uncork(){this.corked=!1,this._flush()},end(e,t,r){const n=e=>{e?r(e):(this._flush(),this.pipes.forEach(e=>{e.end()}),this.emit(\"finish\"))};e?this.write(e,t,n):n()},read(e){let t;if(e){for(t=[];e&&this.buffers.length&&!this.buffers[0].eod;){const r=this.buffers[0],n=r.read(e);e-=n.length,t.push(n),r.eod&&r.full&&this.buffers.shift()}return n.concat(t)}return t=this.buffers.map(e=>e.toBuffer()).filter(Boolean),this.buffers=[],n.concat(t)},setEncoding(e){this.encoding=e},pause(){this.paused=!0},resume(){this.paused=!1},isPaused(){return!!this.paused},pipe(e){this.pipes.push(e),!this.paused&&this.buffers.length&&this.end()},unpipe(e){this.pipes=this.pipes.filter(t=>t!==e)},unshift(){throw new Error(\"Not Implemented\")},wrap(){throw new Error(\"Not Implemented\")}}),t.exports=h}).call(this)}).call(this,e(\"_process\"),e(\"buffer\").Buffer)},{\"./string-buf\":25,\"./utils\":27,_process:467,buffer:220,\"readable-stream\":491}],25:[function(e,t,r){(function(e){(function(){\"use strict\";t.exports=class{constructor(t){this._buf=e.alloc(t&&t.size||16384),this._encoding=t&&t.encoding||\"utf8\",this._inPos=0,this._buffer=void 0}get length(){return this._inPos}get capacity(){return this._buf.length}get buffer(){return this._buf}toBuffer(){return this._buffer||(this._buffer=e.alloc(this.length),this._buf.copy(this._buffer,0,0,this.length)),this._buffer}reset(e){e=e||0,this._buffer=void 0,this._inPos=e}_grow(t){let r=2*this._buf.length;for(;r<t;)r*=2;const n=e.alloc(r);this._buf.copy(n,0),this._buf=n}addText(e){this._buffer=void 0;let t=this._inPos+this._buf.write(e,this._inPos,this._encoding);for(;t>=this._buf.length-4;)this._grow(this._inPos+e.length),t=this._inPos+this._buf.write(e,this._inPos,this._encoding);this._inPos=t}addStringBuf(e){e.length&&(this._buffer=void 0,this.length+e.length>this.capacity&&this._grow(this.length+e.length),e._buf.copy(this._buf,this._inPos,0,e.length),this._inPos+=e.length)}}}).call(this)}).call(this,e(\"buffer\").Buffer)},{buffer:220}],26:[function(e,t,r){\"use strict\";const{toString:n}=Object.prototype,i=/[\"&<>]/,s={each:function(e,t){e&&(Array.isArray(e)?e.forEach(t):Object.keys(e).forEach(r=>{t(e[r],r)}))},some:function(e,t){return!!e&&(Array.isArray(e)?e.some(t):Object.keys(e).some(r=>t(e[r],r)))},every:function(e,t){return!e||(Array.isArray(e)?e.every(t):Object.keys(e).every(r=>t(e[r],r)))},map:function(e,t){return e?Array.isArray(e)?e.map(t):Object.keys(e).map(r=>t(e[r],r)):[]},keyBy:(e,t)=>e.reduce((e,r)=>(e[r[t]]=r,e),{}),isEqual:function(e,t){const r=typeof e,n=typeof t,i=Array.isArray(e),o=Array.isArray(t);let a;if(r!==n)return!1;switch(typeof e){case\"object\":if(i||o)return!(!i||!o)&&(e.length===t.length&&e.every((e,r)=>{const n=t[r];return s.isEqual(e,n)}));if(null===e||null===t)return e===t;if(a=Object.keys(e),Object.keys(t).length!==a.length)return!1;for(const e of a)if(!t.hasOwnProperty(e))return!1;return s.every(e,(e,r)=>{const n=t[r];return s.isEqual(e,n)});default:return e===t}},escapeHtml(e){const t=i.exec(e);if(!t)return e;let r=\"\",n=\"\",s=0,o=t.index;for(;o<e.length;o++){switch(e.charAt(o)){case'\"':n=\"&quot;\";break;case\"&\":n=\"&amp;\";break;case\"'\":n=\"&apos;\";break;case\"<\":n=\"&lt;\";break;case\">\":n=\"&gt;\";break;default:continue}s!==o&&(r+=e.substring(s,o)),s=o+1,r+=n}return s!==o?r+e.substring(s,o):r},strcmp:(e,t)=>e<t?-1:e>t?1:0,isUndefined:e=>\"[object Undefined]\"===n.call(e),isObject:e=>\"[object Object]\"===n.call(e),deepMerge(){const e=arguments[0]||{},{length:t}=arguments;let r,n,i;function o(t,o){r=e[o],i=Array.isArray(t),s.isObject(t)||i?(i?(i=!1,n=r&&Array.isArray(r)?r:[]):n=r&&s.isObject(r)?r:{},e[o]=s.deepMerge(n,t)):s.isUndefined(t)||(e[o]=t)}for(let e=0;e<t;e++)s.each(arguments[e],o);return e}};t.exports=s},{}],27:[function(e,t,r){(function(r,n){(function(){\"use strict\";const i=e(\"fs\"),s=/[<>&'\"\\x7F\\x00-\\x08\\x0B-\\x0C\\x0E-\\x1F]/,o={nop(){},promiseImmediate:e=>new Promise(t=>{r.setImmediate?n(()=>{t(e)}):setTimeout(()=>{t(e)},1)}),inherits:function(e,t,r,n){e.super_=t,n||(n=r,r=null),r&&Object.keys(r).forEach(t=>{Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))});const i={constructor:{value:e,enumerable:!1,writable:!1,configurable:!0}};n&&Object.keys(n).forEach(e=>{i[e]=Object.getOwnPropertyDescriptor(n,e)}),e.prototype=Object.create(t.prototype,i)},dateToExcel:(e,t)=>25569+e.getTime()/864e5-(t?1462:0),excelToDate(e,t){const r=Math.round(24*(e-25569+(t?1462:0))*3600*1e3);return new Date(r)},parsePath(e){const t=e.lastIndexOf(\"/\");return{path:e.substring(0,t),name:e.substring(t+1)}},getRelsPath(e){const t=o.parsePath(e);return`${t.path}/_rels/${t.name}.rels`},xmlEncode(e){const t=s.exec(e);if(!t)return e;let r=\"\",n=\"\",i=0,o=t.index;for(;o<e.length;o++){const t=e.charCodeAt(o);switch(t){case 34:n=\"&quot;\";break;case 38:n=\"&amp;\";break;case 39:n=\"&apos;\";break;case 60:n=\"&lt;\";break;case 62:n=\"&gt;\";break;case 127:n=\"\";break;default:if(t<=31&&(t<=8||t>=11&&13!==t)){n=\"\";break}continue}i!==o&&(r+=e.substring(i,o)),i=o+1,n&&(r+=n)}return i!==o?r+e.substring(i,o):r},xmlDecode:e=>e.replace(/&([a-z]*);/g,e=>{switch(e){case\"&lt;\":return\"<\";case\"&gt;\":return\">\";case\"&amp;\":return\"&\";case\"&apos;\":return\"'\";case\"&quot;\":return'\"';default:return e}}),validInt(e){const t=parseInt(e,10);return Number.isNaN(t)?0:t},isDateFmt(e){if(!e)return!1;return null!==(e=(e=e.replace(/\\[[^\\]]*]/g,\"\")).replace(/\"[^\"]*\"/g,\"\")).match(/[ymdhMsb]+/)},fs:{exists:e=>new Promise(t=>{i.access(e,i.constants.F_OK,e=>{t(!e)})})},toIsoDateString:e=>e.toIsoString().subsstr(0,10),parseBoolean:e=>!0===e||\"true\"===e||1===e||\"1\"===e};t.exports=o}).call(this)}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"timers\").setImmediate)},{fs:216,timers:523}],28:[function(e,t,r){\"use strict\";const n=e(\"./under-dash\"),i=e(\"./utils\");function s(e,t,r){e.push(` ${t}=\"${i.xmlEncode(r.toString())}\"`)}function o(e,t){if(t){const r=[];n.each(t,(e,t)=>{void 0!==e&&s(r,t,e)}),e.push(r.join(\"\"))}}class a{constructor(){this._xml=[],this._stack=[],this._rollbacks=[]}get tos(){return this._stack.length?this._stack[this._stack.length-1]:void 0}get cursor(){return this._xml.length}openXml(e){const t=this._xml;t.push(\"<?xml\"),o(t,e),t.push(\"?>\\n\")}openNode(e,t){const r=this.tos,n=this._xml;r&&this.open&&n.push(\">\"),this._stack.push(e),n.push(\"<\"),n.push(e),o(n,t),this.leaf=!0,this.open=!0}addAttribute(e,t){if(!this.open)throw new Error(\"Cannot write attributes to node if it is not open\");void 0!==t&&s(this._xml,e,t)}addAttributes(e){if(!this.open)throw new Error(\"Cannot write attributes to node if it is not open\");o(this._xml,e)}writeText(e){const t=this._xml;this.open&&(t.push(\">\"),this.open=!1),this.leaf=!1,t.push(i.xmlEncode(e.toString()))}writeXml(e){this.open&&(this._xml.push(\">\"),this.open=!1),this.leaf=!1,this._xml.push(e)}closeNode(){const e=this._stack.pop(),t=this._xml;this.leaf?t.push(\"/>\"):(t.push(\"</\"),t.push(e),t.push(\">\")),this.open=!1,this.leaf=!1}leafNode(e,t,r){this.openNode(e,t),void 0!==r&&this.writeText(r),this.closeNode()}closeAll(){for(;this._stack.length;)this.closeNode()}addRollback(){return this._rollbacks.push({xml:this._xml.length,stack:this._stack.length,leaf:this.leaf,open:this.open}),this.cursor}commit(){this._rollbacks.pop()}rollback(){const e=this._rollbacks.pop();this._xml.length>e.xml&&this._xml.splice(e.xml,this._xml.length-e.xml),this._stack.length>e.stack&&this._stack.splice(e.stack,this._stack.length-e.stack),this.leaf=e.leaf,this.open=e.open}get xml(){return this.closeAll(),this._xml.join(\"\")}}a.StdDocAttributes={version:\"1.0\",encoding:\"UTF-8\",standalone:\"yes\"},t.exports=a},{\"./under-dash\":26,\"./utils\":27}],29:[function(e,t,r){(function(r){(function(){\"use strict\";const n=e(\"events\"),i=e(\"jszip\"),s=e(\"./stream-buf\"),{stringToBuffer:o}=e(\"./browser-buffer-encode\");class a extends n.EventEmitter{constructor(e){super(),this.options=Object.assign({type:\"nodebuffer\",compression:\"DEFLATE\"},e),this.zip=new i,this.stream=new s}append(e,t){t.hasOwnProperty(\"base64\")&&t.base64?this.zip.file(t.name,e,{base64:!0}):(r.browser&&\"string\"==typeof e&&(e=o(e)),this.zip.file(t.name,e))}async finalize(){const e=await this.zip.generateAsync(this.options);this.stream.end(e),this.emit(\"finish\")}read(e){return this.stream.read(e)}setEncoding(e){return this.stream.setEncoding(e)}pause(){return this.stream.pause()}resume(){return this.stream.resume()}isPaused(){return this.stream.isPaused()}pipe(e,t){return this.stream.pipe(e,t)}unpipe(e){return this.stream.unpipe(e)}unshift(e){return this.stream.unshift(e)}wrap(e){return this.stream.wrap(e)}}t.exports={ZipWriter:a}}).call(this)}).call(this,e(\"_process\"))},{\"./browser-buffer-encode\":17,\"./stream-buf\":24,_process:467,events:422,jszip:441}],30:[function(e,t,r){\"use strict\";t.exports={0:{f:\"General\"},1:{f:\"0\"},2:{f:\"0.00\"},3:{f:\"#,##0\"},4:{f:\"#,##0.00\"},9:{f:\"0%\"},10:{f:\"0.00%\"},11:{f:\"0.00E+00\"},12:{f:\"# ?/?\"},13:{f:\"# ??/??\"},14:{f:\"mm-dd-yy\"},15:{f:\"d-mmm-yy\"},16:{f:\"d-mmm\"},17:{f:\"mmm-yy\"},18:{f:\"h:mm AM/PM\"},19:{f:\"h:mm:ss AM/PM\"},20:{f:\"h:mm\"},21:{f:\"h:mm:ss\"},22:{f:'m/d/yy \"h\":mm'},27:{\"zh-tw\":\"[$-404]e/m/d\",\"zh-cn\":'yyyy\"\\u5e74\"m\"\\u6708\"',\"ja-jp\":\"[$-411]ge.m.d\",\"ko-kr\":'yyyy\"\\u5e74\" mm\"\\u6708\" dd\"\\u65e5\"'},28:{\"zh-tw\":'[$-404]e\"\\u5e74\"m\"\\u6708\"d\"\\u65e5\"',\"zh-cn\":'m\"\\u6708\"d\"\\u65e5\"',\"ja-jp\":'[$-411]ggge\"\\u5e74\"m\"\\u6708\"d\"\\u65e5\"',\"ko-kr\":\"mm-dd\"},29:{\"zh-tw\":'[$-404]e\"\\u5e74\"m\"\\u6708\"d\"\\u65e5\"',\"zh-cn\":'m\"\\u6708\"d\"\\u65e5\"',\"ja-jp\":'[$-411]ggge\"\\u5e74\"m\"\\u6708\"d\"\\u65e5\"',\"ko-kr\":\"mm-dd\"},30:{\"zh-tw\":\"m/d/yy \",\"zh-cn\":\"m-d-yy\",\"ja-jp\":\"m/d/yy\",\"ko-kr\":\"mm-dd-yy\"},31:{\"zh-tw\":'yyyy\"\\u5e74\"m\"\\u6708\"d\"\\u65e5\"',\"zh-cn\":'yyyy\"\\u5e74\"m\"\\u6708\"d\"\\u65e5\"',\"ja-jp\":'yyyy\"\\u5e74\"m\"\\u6708\"d\"\\u65e5\"',\"ko-kr\":'yyyy\"\\ub144\" mm\"\\uc6d4\" dd\"\\uc77c\"'},32:{\"zh-tw\":'hh\"\\u6642\"mm\"\\u5206\"',\"zh-cn\":'h\"\\u65f6\"mm\"\\u5206\"',\"ja-jp\":'h\"\\u6642\"mm\"\\u5206\"',\"ko-kr\":'h\"\\uc2dc\" mm\"\\ubd84\"'},33:{\"zh-tw\":'hh\"\\u6642\"mm\"\\u5206\"ss\"\\u79d2\"',\"zh-cn\":'h\"\\u65f6\"mm\"\\u5206\"ss\"\\u79d2\"',\"ja-jp\":'h\"\\u6642\"mm\"\\u5206\"ss\"\\u79d2\"',\"ko-kr\":'h\"\\uc2dc\" mm\"\\ubd84\" ss\"\\ucd08\"'},34:{\"zh-tw\":'\\u4e0a\\u5348/\\u4e0b\\u5348 hh\"\\u6642\"mm\"\\u5206\"',\"zh-cn\":'\\u4e0a\\u5348/\\u4e0b\\u5348 h\"\\u65f6\"mm\"\\u5206\"',\"ja-jp\":'yyyy\"\\u5e74\"m\"\\u6708\"',\"ko-kr\":\"yyyy-mm-dd\"},35:{\"zh-tw\":'\\u4e0a\\u5348/\\u4e0b\\u5348 hh\"\\u6642\"mm\"\\u5206\"ss\"\\u79d2\"',\"zh-cn\":'\\u4e0a\\u5348/\\u4e0b\\u5348 h\"\\u65f6\"mm\"\\u5206\"ss\"\\u79d2\"',\"ja-jp\":'m\"\\u6708\"d\"\\u65e5\"',\"ko-kr\":\"yyyy-mm-dd\"},36:{\"zh-tw\":\"[$-404]e/m/d\",\"zh-cn\":'yyyy\"\\u5e74\"m\"\\u6708\"',\"ja-jp\":\"[$-411]ge.m.d\",\"ko-kr\":'yyyy\"\\u5e74\" mm\"\\u6708\" dd\"\\u65e5\"'},37:{f:\"#,##0 ;(#,##0)\"},38:{f:\"#,##0 ;[Red](#,##0)\"},39:{f:\"#,##0.00 ;(#,##0.00)\"},40:{f:\"#,##0.00 ;[Red](#,##0.00)\"},45:{f:\"mm:ss\"},46:{f:\"[h]:mm:ss\"},47:{f:\"mmss.0\"},48:{f:\"##0.0E+0\"},49:{f:\"@\"},50:{\"zh-tw\":\"[$-404]e/m/d\",\"zh-cn\":'yyyy\"\\u5e74\"m\"\\u6708\"',\"ja-jp\":\"[$-411]ge.m.d\",\"ko-kr\":'yyyy\"\\u5e74\" mm\"\\u6708\" dd\"\\u65e5\"'},51:{\"zh-tw\":'[$-404]e\"\\u5e74\"m\"\\u6708\"d\"\\u65e5\"',\"zh-cn\":'m\"\\u6708\"d\"\\u65e5\"',\"ja-jp\":'[$-411]ggge\"\\u5e74\"m\"\\u6708\"d\"\\u65e5\"',\"ko-kr\":\"mm-dd\"},52:{\"zh-tw\":'\\u4e0a\\u5348/\\u4e0b\\u5348 hh\"\\u6642\"mm\"\\u5206\"',\"zh-cn\":'yyyy\"\\u5e74\"m\"\\u6708\"',\"ja-jp\":'yyyy\"\\u5e74\"m\"\\u6708\"',\"ko-kr\":\"yyyy-mm-dd\"},53:{\"zh-tw\":'\\u4e0a\\u5348/\\u4e0b\\u5348 hh\"\\u6642\"mm\"\\u5206\"ss\"\\u79d2\"',\"zh-cn\":'m\"\\u6708\"d\"\\u65e5\"',\"ja-jp\":'m\"\\u6708\"d\"\\u65e5\"',\"ko-kr\":\"yyyy-mm-dd\"},54:{\"zh-tw\":'[$-404]e\"\\u5e74\"m\"\\u6708\"d\"\\u65e5\"',\"zh-cn\":'m\"\\u6708\"d\"\\u65e5\"',\"ja-jp\":'[$-411]ggge\"\\u5e74\"m\"\\u6708\"d\"\\u65e5\"',\"ko-kr\":\"mm-dd\"},55:{\"zh-tw\":'\\u4e0a\\u5348/\\u4e0b\\u5348 hh\"\\u6642\"mm\"\\u5206\"',\"zh-cn\":'\\u4e0a\\u5348/\\u4e0b\\u5348 h\"\\u65f6\"mm\"\\u5206\"',\"ja-jp\":'yyyy\"\\u5e74\"m\"\\u6708\"',\"ko-kr\":\"yyyy-mm-dd\"},56:{\"zh-tw\":'\\u4e0a\\u5348/\\u4e0b\\u5348 hh\"\\u6642\"mm\"\\u5206\"ss\"\\u79d2\"',\"zh-cn\":'\\u4e0a\\u5348/\\u4e0b\\u5348 h\"\\u65f6\"mm\"\\u5206\"ss\"\\u79d2\"',\"ja-jp\":'m\"\\u6708\"d\"\\u65e5\"',\"ko-kr\":\"yyyy-mm-dd\"},57:{\"zh-tw\":\"[$-404]e/m/d\",\"zh-cn\":'yyyy\"\\u5e74\"m\"\\u6708\"',\"ja-jp\":\"[$-411]ge.m.d\",\"ko-kr\":'yyyy\"\\u5e74\" mm\"\\u6708\" dd\"\\u65e5\"'},58:{\"zh-tw\":'[$-404]e\"\\u5e74\"m\"\\u6708\"d\"\\u65e5\"',\"zh-cn\":'m\"\\u6708\"d\"\\u65e5\"',\"ja-jp\":'[$-411]ggge\"\\u5e74\"m\"\\u6708\"d\"\\u65e5\"',\"ko-kr\":\"mm-dd\"},59:{\"th-th\":\"t0\"},60:{\"th-th\":\"t0.00\"},61:{\"th-th\":\"t#,##0\"},62:{\"th-th\":\"t#,##0.00\"},67:{\"th-th\":\"t0%\"},68:{\"th-th\":\"t0.00%\"},69:{\"th-th\":\"t# ?/?\"},70:{\"th-th\":\"t# ??/??\"},81:{\"th-th\":\"d/m/bb\"}}},{}],31:[function(e,t,r){\"use strict\";t.exports={OfficeDocument:\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",Worksheet:\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\",CalcChain:\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain\",SharedStrings:\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\",Styles:\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\",Theme:\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\",Hyperlink:\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\",Image:\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",CoreProperties:\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\",ExtenderProperties:\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\",Comments:\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\",VmlDrawing:\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing\",Table:\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/table\"}},{}],32:[function(e,t,r){\"use strict\";const n=e(\"../../utils/parse-sax\"),i=e(\"../../utils/xml-stream\");class s{prepare(){}render(){}parseOpen(e){}parseText(e){}parseClose(e){}reconcile(e,t){}reset(){this.model=null,this.map&&Object.values(this.map).forEach(e=>{e instanceof s?e.reset():e.xform&&e.xform.reset()})}mergeModel(e){this.model=Object.assign(this.model||{},e)}async parse(e){for await(const t of e)for(const{eventType:e,value:r}of t)if(\"opentag\"===e)this.parseOpen(r);else if(\"text\"===e)this.parseText(r);else if(\"closetag\"===e&&!this.parseClose(r.name))return this.model;return this.model}async parseStream(e){return this.parse(n(e))}get xml(){return this.toXml(this.model)}toXml(e){const t=new i;return this.render(t,e),t.xml}static toAttribute(e,t){let r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(void 0===e){if(r)return t}else if(r||e!==t)return e.toString()}static toStringAttribute(e,t){let r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return s.toAttribute(e,t,r)}static toStringValue(e,t){return void 0===e?t:e}static toBoolAttribute(e,t){let r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(void 0===e){if(r)return t}else if(r||e!==t)return e?\"1\":\"0\"}static toBoolValue(e,t){return void 0===e?t:\"1\"===e}static toIntAttribute(e,t){let r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return s.toAttribute(e,t,r)}static toIntValue(e,t){return void 0===e?t:parseInt(e,10)}static toFloatAttribute(e,t){let r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return s.toAttribute(e,t,r)}static toFloatValue(e,t){return void 0===e?t:parseFloat(e)}}t.exports=s},{\"../../utils/parse-sax\":22,\"../../utils/xml-stream\":28}],33:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\"),i=e(\"../../../utils/col-cache\");function s(e){try{return i.decodeEx(e),!0}catch(e){return!1}}function o(e){const t=[];let r=!1,n=\"\";return e.split(\",\").forEach(e=>{if(!e)return;const i=(e.match(/'/g)||[]).length;if(!i)return void(r?n+=e+\",\":s(e)&&t.push(e));const o=i%2==0;!r&&o&&s(e)?t.push(e):r&&!o?(r=!1,s(n+e)&&t.push(n+e),n=\"\"):(r=!0,n+=e+\",\")}),t}t.exports=class extends n{render(e,t){e.openNode(\"definedName\",{name:t.name,localSheetId:t.localSheetId}),e.writeText(t.ranges.join(\",\")),e.closeNode()}parseOpen(e){switch(e.name){case\"definedName\":return this._parsedName=e.attributes.name,this._parsedLocalSheetId=e.attributes.localSheetId,this._parsedText=[],!0;default:return!1}}parseText(e){this._parsedText.push(e)}parseClose(){return this.model={name:this._parsedName,ranges:o(this._parsedText.join(\"\"))},void 0!==this._parsedLocalSheetId&&(this.model.localSheetId=parseInt(this._parsedLocalSheetId,10)),!1}}},{\"../../../utils/col-cache\":19,\"../base-xform\":32}],34:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/utils\"),i=e(\"../base-xform\");t.exports=class extends i{render(e,t){e.leafNode(\"sheet\",{sheetId:t.id,name:t.name,state:t.state,\"r:id\":t.rId})}parseOpen(e){return\"sheet\"===e.name&&(this.model={name:n.xmlDecode(e.attributes.name),id:parseInt(e.attributes.sheetId,10),state:e.attributes.state,rId:e.attributes[\"r:id\"]},!0)}parseText(){}parseClose(){return!1}}},{\"../../../utils/utils\":27,\"../base-xform\":32}],35:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{render(e,t){e.leafNode(\"calcPr\",{calcId:171027,fullCalcOnLoad:t.fullCalcOnLoad?1:void 0})}parseOpen(e){return\"calcPr\"===e.name&&(this.model={},!0)}parseText(){}parseClose(){return!1}}},{\"../base-xform\":32}],36:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{render(e,t){e.leafNode(\"workbookPr\",{date1904:t.date1904?1:void 0,defaultThemeVersion:164011,filterPrivacy:1})}parseOpen(e){return\"workbookPr\"===e.name&&(this.model={date1904:\"1\"===e.attributes.date1904},!0)}parseText(){}parseClose(){return!1}}},{\"../base-xform\":32}],37:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{render(e,t){const r={xWindow:t.x||0,yWindow:t.y||0,windowWidth:t.width||12e3,windowHeight:t.height||24e3,firstSheet:t.firstSheet,activeTab:t.activeTab};t.visibility&&\"visible\"!==t.visibility&&(r.visibility=t.visibility),e.leafNode(\"workbookView\",r)}parseOpen(e){if(\"workbookView\"===e.name){const t=this.model={},r=function(e,r,n){const i=void 0!==r?t[e]=r:n;void 0!==i&&(t[e]=i)},n=function(e,r,n){const i=void 0!==r?t[e]=parseInt(r,10):n;void 0!==i&&(t[e]=i)};return n(\"x\",e.attributes.xWindow,0),n(\"y\",e.attributes.yWindow,0),n(\"width\",e.attributes.windowWidth,25e3),n(\"height\",e.attributes.windowHeight,1e4),r(\"visibility\",e.attributes.visibility,\"visible\"),n(\"activeTab\",e.attributes.activeTab,void 0),n(\"firstSheet\",e.attributes.firstSheet,void 0),!0}return!1}parseText(){}parseClose(){return!1}}},{\"../base-xform\":32}],38:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/under-dash\"),i=e(\"../../../utils/col-cache\"),s=e(\"../../../utils/xml-stream\"),o=e(\"../base-xform\"),a=e(\"../static-xform\"),l=e(\"../list-xform\"),c=e(\"./defined-name-xform\"),u=e(\"./sheet-xform\"),h=e(\"./workbook-view-xform\"),f=e(\"./workbook-properties-xform\"),d=e(\"./workbook-calc-properties-xform\");class p extends o{constructor(){super(),this.map={fileVersion:p.STATIC_XFORMS.fileVersion,workbookPr:new f,bookViews:new l({tag:\"bookViews\",count:!1,childXform:new h}),sheets:new l({tag:\"sheets\",count:!1,childXform:new u}),definedNames:new l({tag:\"definedNames\",count:!1,childXform:new c}),calcPr:new d}}prepare(e){e.sheets=e.worksheets;const t=[];let r=0;e.sheets.forEach(e=>{if(e.pageSetup&&e.pageSetup.printArea&&e.pageSetup.printArea.split(\"&&\").forEach(n=>{const i=n.split(\":\"),s={name:\"_xlnm.Print_Area\",ranges:[`'${e.name}'!$${i[0]}:$${i[1]}`],localSheetId:r};t.push(s)}),e.pageSetup&&(e.pageSetup.printTitlesRow||e.pageSetup.printTitlesColumn)){const n=[];if(e.pageSetup.printTitlesColumn){const t=e.pageSetup.printTitlesColumn.split(\":\");n.push(`'${e.name}'!$${t[0]}:$${t[1]}`)}if(e.pageSetup.printTitlesRow){const t=e.pageSetup.printTitlesRow.split(\":\");n.push(`'${e.name}'!$${t[0]}:$${t[1]}`)}const i={name:\"_xlnm.Print_Titles\",ranges:n,localSheetId:r};t.push(i)}r++}),t.length&&(e.definedNames=e.definedNames.concat(t)),(e.media||[]).forEach((e,t)=>{e.name=e.type+(t+1)})}render(e,t){e.openXml(s.StdDocAttributes),e.openNode(\"workbook\",p.WORKBOOK_ATTRIBUTES),this.map.fileVersion.render(e),this.map.workbookPr.render(e,t.properties),this.map.bookViews.render(e,t.views),this.map.sheets.render(e,t.sheets),this.map.definedNames.render(e,t.definedNames),this.map.calcPr.render(e,t.calcProperties),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case\"workbook\":return!0;default:return this.parser=this.map[e.name],this.parser&&this.parser.parseOpen(e),!0}}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){if(this.parser)return this.parser.parseClose(e)||(this.parser=void 0),!0;switch(e){case\"workbook\":return this.model={sheets:this.map.sheets.model,properties:this.map.workbookPr.model||{},views:this.map.bookViews.model,calcProperties:{}},this.map.definedNames.model&&(this.model.definedNames=this.map.definedNames.model),!1;default:return!0}}reconcile(e){const t=(e.workbookRels||[]).reduce((e,t)=>(e[t.Id]=t,e),{}),r=[];let s,o=0;(e.sheets||[]).forEach(n=>{const i=t[n.rId];i&&(s=e.worksheetHash[\"xl/\"+i.Target.replace(/^(\\s|\\/xl\\/)+/,\"\")],s&&(s.name=n.name,s.id=n.id,s.state=n.state,r[o++]=s))});const a=[];n.each(e.definedNames,e=>{if(\"_xlnm.Print_Area\"===e.name){if(s=r[e.localSheetId],s){s.pageSetup||(s.pageSetup={});const t=i.decodeEx(e.ranges[0]);s.pageSetup.printArea=s.pageSetup.printArea?`${s.pageSetup.printArea}&&${t.dimensions}`:t.dimensions}}else if(\"_xlnm.Print_Titles\"===e.name){if(s=r[e.localSheetId],s){s.pageSetup||(s.pageSetup={});const t=e.ranges.join(\",\"),r=/\\$/g,n=/\\$\\d+:\\$\\d+/,i=t.match(n);if(i&&i.length){const e=i[0];s.pageSetup.printTitlesRow=e.replace(r,\"\")}const o=/\\$[A-Z]+:\\$[A-Z]+/,a=t.match(o);if(a&&a.length){const e=a[0];s.pageSetup.printTitlesColumn=e.replace(r,\"\")}}}else a.push(e)}),e.definedNames=a,e.media.forEach((e,t)=>{e.index=t})}}p.WORKBOOK_ATTRIBUTES={xmlns:\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\"xmlns:r\":\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\"xmlns:mc\":\"http://schemas.openxmlformats.org/markup-compatibility/2006\",\"mc:Ignorable\":\"x15\",\"xmlns:x15\":\"http://schemas.microsoft.com/office/spreadsheetml/2010/11/main\"},p.STATIC_XFORMS={fileVersion:new a({tag:\"fileVersion\",$:{appName:\"xl\",lastEdited:5,lowestEdited:5,rupBuild:9303}})},t.exports=p},{\"../../../utils/col-cache\":19,\"../../../utils/under-dash\":26,\"../../../utils/xml-stream\":28,\"../base-xform\":32,\"../list-xform\":71,\"../static-xform\":120,\"./defined-name-xform\":33,\"./sheet-xform\":34,\"./workbook-calc-properties-xform\":35,\"./workbook-properties-xform\":36,\"./workbook-view-xform\":37}],39:[function(e,t,r){\"use strict\";const n=e(\"../strings/rich-text-xform\"),i=e(\"../../../utils/utils\"),s=e(\"../base-xform\"),o=t.exports=function(e){this.model=e};i.inherits(o,s,{get tag(){return\"r\"},get richTextXform(){return this._richTextXform||(this._richTextXform=new n),this._richTextXform},render(e,t){t=t||this.model,e.openNode(\"comment\",{ref:t.ref,authorId:0}),e.openNode(\"text\"),t&&t.note&&t.note.texts&&t.note.texts.forEach(t=>{this.richTextXform.render(e,t)}),e.closeNode(),e.closeNode()},parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case\"comment\":return this.model={type:\"note\",note:{texts:[]},...e.attributes},!0;case\"r\":return this.parser=this.richTextXform,this.parser.parseOpen(e),!0;default:return!1}},parseText(e){this.parser&&this.parser.parseText(e)},parseClose(e){switch(e){case\"comment\":return!1;case\"r\":return this.model.note.texts.push(this.parser.model),this.parser=void 0,!0;default:return this.parser&&this.parser.parseClose(e),!0}}})},{\"../../../utils/utils\":27,\"../base-xform\":32,\"../strings/rich-text-xform\":122}],40:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/xml-stream\"),i=e(\"../../../utils/utils\"),s=e(\"../base-xform\"),o=e(\"./comment-xform\"),a=t.exports=function(){this.map={comment:new o}};i.inherits(a,s,{COMMENTS_ATTRIBUTES:{xmlns:\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"}},{render(e,t){t=t||this.model,e.openXml(n.StdDocAttributes),e.openNode(\"comments\",a.COMMENTS_ATTRIBUTES),e.openNode(\"authors\"),e.leafNode(\"author\",null,\"Author\"),e.closeNode(),e.openNode(\"commentList\"),t.comments.forEach(t=>{this.map.comment.render(e,t)}),e.closeNode(),e.closeNode()},parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case\"commentList\":return this.model={comments:[]},!0;case\"comment\":return this.parser=this.map.comment,this.parser.parseOpen(e),!0;default:return!1}},parseText(e){this.parser&&this.parser.parseText(e)},parseClose(e){switch(e){case\"commentList\":return!1;case\"comment\":return this.model.comments.push(this.parser.model),this.parser=void 0,!0;default:return this.parser&&this.parser.parseClose(e),!0}}})},{\"../../../utils/utils\":27,\"../../../utils/xml-stream\":28,\"../base-xform\":32,\"./comment-xform\":39}],41:[function(e,t,r){\"use strict\";const n=e(\"../../base-xform\");t.exports=class extends n{constructor(e){super(),this._model=e}get tag(){return this._model&&this._model.tag}render(e,t,r){(t===r[2]||\"x:SizeWithCells\"===this.tag&&t===r[1])&&e.leafNode(this.tag)}parseOpen(e){switch(e.name){case this.tag:return this.model={},this.model[this.tag]=!0,!0;default:return!1}}parseText(){}parseClose(){return!1}}},{\"../../base-xform\":32}],42:[function(e,t,r){\"use strict\";const n=e(\"../../base-xform\");t.exports=class extends n{constructor(e){super(),this._model=e}get tag(){return this._model&&this._model.tag}render(e,t){e.leafNode(this.tag,null,t)}parseOpen(e){switch(e.name){case this.tag:return this.text=\"\",!0;default:return!1}}parseText(e){this.text=e}parseClose(){return!1}}},{\"../../base-xform\":32}],43:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{get tag(){return\"x:Anchor\"}getAnchorRect(e){const t=Math.floor(e.left),r=Math.floor(68*(e.left-t)),n=Math.floor(e.top),i=Math.floor(18*(e.top-n)),s=Math.floor(e.right),o=Math.floor(68*(e.right-s)),a=Math.floor(e.bottom);return[t,r,n,i,s,o,a,Math.floor(18*(e.bottom-a))]}getDefaultRect(e){const t=e.col,r=Math.max(e.row-2,0);return[t,6,r,14,t+2,2,r+4,16]}render(e,t){const r=t.anchor?this.getAnchorRect(t.anchor):this.getDefaultRect(t.refAddress);e.leafNode(\"x:Anchor\",null,r.join(\", \"))}parseOpen(e){switch(e.name){case this.tag:return this.text=\"\",!0;default:return!1}}parseText(e){this.text=e}parseClose(){return!1}}},{\"../base-xform\":32}],44:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\"),i=e(\"./vml-anchor-xform\"),s=e(\"./style/vml-protection-xform\"),o=e(\"./style/vml-position-xform\"),a=[\"twoCells\",\"oneCells\",\"absolute\"];t.exports=class extends n{constructor(){super(),this.map={\"x:Anchor\":new i,\"x:Locked\":new s({tag:\"x:Locked\"}),\"x:LockText\":new s({tag:\"x:LockText\"}),\"x:SizeWithCells\":new o({tag:\"x:SizeWithCells\"}),\"x:MoveWithCells\":new o({tag:\"x:MoveWithCells\"})}}get tag(){return\"x:ClientData\"}render(e,t){const{protection:r,editAs:n}=t.note;e.openNode(this.tag,{ObjectType:\"Note\"}),this.map[\"x:MoveWithCells\"].render(e,n,a),this.map[\"x:SizeWithCells\"].render(e,n,a),this.map[\"x:Anchor\"].render(e,t),this.map[\"x:Locked\"].render(e,r.locked),e.leafNode(\"x:AutoFill\",null,\"False\"),this.map[\"x:LockText\"].render(e,r.lockText),e.leafNode(\"x:Row\",null,t.refAddress.row-1),e.leafNode(\"x:Column\",null,t.refAddress.col-1),e.closeNode()}parseOpen(e){switch(e.name){case this.tag:this.reset(),this.model={anchor:[],protection:{},editAs:\"\"};break;default:this.parser=this.map[e.name],this.parser&&this.parser.parseOpen(e)}return!0}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){if(this.parser)return this.parser.parseClose(e)||(this.parser=void 0),!0;switch(e){case this.tag:return this.normalizeModel(),!1;default:return!0}}normalizeModel(){const e=Object.assign({},this.map[\"x:MoveWithCells\"].model,this.map[\"x:SizeWithCells\"].model),t=Object.keys(e).length;this.model.editAs=a[t],this.model.anchor=this.map[\"x:Anchor\"].text,this.model.protection.locked=this.map[\"x:Locked\"].text,this.model.protection.lockText=this.map[\"x:LockText\"].text}}},{\"../base-xform\":32,\"./style/vml-position-xform\":41,\"./style/vml-protection-xform\":42,\"./vml-anchor-xform\":43}],45:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/xml-stream\"),i=e(\"../base-xform\"),s=e(\"./vml-shape-xform\");class o extends i{constructor(){super(),this.map={\"v:shape\":new s}}get tag(){return\"xml\"}render(e,t){e.openXml(n.StdDocAttributes),e.openNode(this.tag,o.DRAWING_ATTRIBUTES),e.openNode(\"o:shapelayout\",{\"v:ext\":\"edit\"}),e.leafNode(\"o:idmap\",{\"v:ext\":\"edit\",data:1}),e.closeNode(),e.openNode(\"v:shapetype\",{id:\"_x0000_t202\",coordsize:\"21600,21600\",\"o:spt\":202,path:\"m,l,21600r21600,l21600,xe\"}),e.leafNode(\"v:stroke\",{joinstyle:\"miter\"}),e.leafNode(\"v:path\",{gradientshapeok:\"t\",\"o:connecttype\":\"rect\"}),e.closeNode(),t.comments.forEach((t,r)=>{this.map[\"v:shape\"].render(e,t,r)}),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case this.tag:this.reset(),this.model={comments:[]};break;default:this.parser=this.map[e.name],this.parser&&this.parser.parseOpen(e)}return!0}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){if(this.parser)return this.parser.parseClose(e)||(this.model.comments.push(this.parser.model),this.parser=void 0),!0;switch(e){case this.tag:return!1;default:return!0}}reconcile(e,t){e.anchors.forEach(e=>{e.br?this.map[\"xdr:twoCellAnchor\"].reconcile(e,t):this.map[\"xdr:oneCellAnchor\"].reconcile(e,t)})}}o.DRAWING_ATTRIBUTES={\"xmlns:v\":\"urn:schemas-microsoft-com:vml\",\"xmlns:o\":\"urn:schemas-microsoft-com:office:office\",\"xmlns:x\":\"urn:schemas-microsoft-com:office:excel\"},t.exports=o},{\"../../../utils/xml-stream\":28,\"../base-xform\":32,\"./vml-shape-xform\":46}],46:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\"),i=e(\"./vml-textbox-xform\"),s=e(\"./vml-client-data-xform\");class o extends n{constructor(){super(),this.map={\"v:textbox\":new i,\"x:ClientData\":new s}}get tag(){return\"v:shape\"}render(e,t,r){e.openNode(\"v:shape\",o.V_SHAPE_ATTRIBUTES(t,r)),e.leafNode(\"v:fill\",{color2:\"infoBackground [80]\"}),e.leafNode(\"v:shadow\",{color:\"none [81]\",obscured:\"t\"}),e.leafNode(\"v:path\",{\"o:connecttype\":\"none\"}),this.map[\"v:textbox\"].render(e,t),this.map[\"x:ClientData\"].render(e,t),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case this.tag:this.reset(),this.model={margins:{insetmode:e.attributes[\"o:insetmode\"]},anchor:\"\",editAs:\"\",protection:{}};break;default:this.parser=this.map[e.name],this.parser&&this.parser.parseOpen(e)}return!0}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){if(this.parser)return this.parser.parseClose(e)||(this.parser=void 0),!0;switch(e){case this.tag:return this.model.margins.inset=this.map[\"v:textbox\"].model&&this.map[\"v:textbox\"].model.inset,this.model.protection=this.map[\"x:ClientData\"].model&&this.map[\"x:ClientData\"].model.protection,this.model.anchor=this.map[\"x:ClientData\"].model&&this.map[\"x:ClientData\"].model.anchor,this.model.editAs=this.map[\"x:ClientData\"].model&&this.map[\"x:ClientData\"].model.editAs,!1;default:return!0}}}o.V_SHAPE_ATTRIBUTES=(e,t)=>({id:\"_x0000_s\"+(1025+t),type:\"#_x0000_t202\",style:\"position:absolute; margin-left:105.3pt;margin-top:10.5pt;width:97.8pt;height:59.1pt;z-index:1;visibility:hidden\",fillcolor:\"infoBackground [80]\",strokecolor:\"none [81]\",\"o:insetmode\":e.note.margins&&e.note.margins.insetmode}),t.exports=o},{\"../base-xform\":32,\"./vml-client-data-xform\":44,\"./vml-textbox-xform\":47}],47:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{get tag(){return\"v:textbox\"}conversionUnit(e,t,r){return`${parseFloat(e)*t.toFixed(2)}${r}`}reverseConversionUnit(e){return(e||\"\").split(\",\").map(e=>Number(parseFloat(this.conversionUnit(parseFloat(e),.1,\"\")).toFixed(2)))}render(e,t){const r={style:\"mso-direction-alt:auto\"};if(t&&t.note){let{inset:e}=t.note&&t.note.margins;Array.isArray(e)&&(e=e.map(e=>this.conversionUnit(e,10,\"mm\")).join(\",\")),e&&(r.inset=e)}e.openNode(\"v:textbox\",r),e.leafNode(\"div\",{style:\"text-align:left\"}),e.closeNode()}parseOpen(e){switch(e.name){case this.tag:return this.model={inset:this.reverseConversionUnit(e.attributes.inset)},!0;default:return!0}}parseText(){}parseClose(e){switch(e){case this.tag:return!1;default:return!0}}}},{\"../base-xform\":32}],48:[function(e,t,r){\"use strict\";const n=e(\"./base-xform\");t.exports=class extends n{createNewModel(e){return{}}parseOpen(e){return this.parser=this.parser||this.map[e.name],this.parser?(this.parser.parseOpen(e),!0):e.name===this.tag&&(this.model=this.createNewModel(e),!0)}parseText(e){this.parser&&this.parser.parseText(e)}onParserClose(e,t){this.model[e]=t.model}parseClose(e){return this.parser?(this.parser.parseClose(e)||(this.onParserClose(e,this.parser),this.parser=void 0),!0):e!==this.tag}}},{\"./base-xform\":32}],49:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{render(e,t){e.openNode(\"HeadingPairs\"),e.openNode(\"vt:vector\",{size:2,baseType:\"variant\"}),e.openNode(\"vt:variant\"),e.leafNode(\"vt:lpstr\",void 0,\"Worksheets\"),e.closeNode(),e.openNode(\"vt:variant\"),e.leafNode(\"vt:i4\",void 0,t.length),e.closeNode(),e.closeNode(),e.closeNode()}parseOpen(e){return\"HeadingPairs\"===e.name}parseText(){}parseClose(e){return\"HeadingPairs\"!==e}}},{\"../base-xform\":32}],50:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{render(e,t){e.openNode(\"TitlesOfParts\"),e.openNode(\"vt:vector\",{size:t.length,baseType:\"lpstr\"}),t.forEach(t=>{e.leafNode(\"vt:lpstr\",void 0,t.name)}),e.closeNode(),e.closeNode()}parseOpen(e){return\"TitlesOfParts\"===e.name}parseText(){}parseClose(e){return\"TitlesOfParts\"!==e}}},{\"../base-xform\":32}],51:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/xml-stream\"),i=e(\"../base-xform\"),s=e(\"../simple/string-xform\"),o=e(\"./app-heading-pairs-xform\"),a=e(\"./app-titles-of-parts-xform\");class l extends i{constructor(){super(),this.map={Company:new s({tag:\"Company\"}),Manager:new s({tag:\"Manager\"}),HeadingPairs:new o,TitleOfParts:new a}}render(e,t){e.openXml(n.StdDocAttributes),e.openNode(\"Properties\",l.PROPERTY_ATTRIBUTES),e.leafNode(\"Application\",void 0,\"Microsoft Excel\"),e.leafNode(\"DocSecurity\",void 0,\"0\"),e.leafNode(\"ScaleCrop\",void 0,\"false\"),this.map.HeadingPairs.render(e,t.worksheets),this.map.TitleOfParts.render(e,t.worksheets),this.map.Company.render(e,t.company||\"\"),this.map.Manager.render(e,t.manager),e.leafNode(\"LinksUpToDate\",void 0,\"false\"),e.leafNode(\"SharedDoc\",void 0,\"false\"),e.leafNode(\"HyperlinksChanged\",void 0,\"false\"),e.leafNode(\"AppVersion\",void 0,\"16.0300\"),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case\"Properties\":return!0;default:return this.parser=this.map[e.name],!!this.parser&&(this.parser.parseOpen(e),!0)}}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){if(this.parser)return this.parser.parseClose(e)||(this.parser=void 0),!0;switch(e){case\"Properties\":return this.model={worksheets:this.map.TitleOfParts.model,company:this.map.Company.model,manager:this.map.Manager.model},!1;default:return!0}}}l.DateFormat=function(e){return e.toISOString().replace(/[.]\\d{3,6}/,\"\")},l.DateAttrs={\"xsi:type\":\"dcterms:W3CDTF\"},l.PROPERTY_ATTRIBUTES={xmlns:\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\",\"xmlns:vt\":\"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\"},t.exports=l},{\"../../../utils/xml-stream\":28,\"../base-xform\":32,\"../simple/string-xform\":119,\"./app-heading-pairs-xform\":49,\"./app-titles-of-parts-xform\":50}],52:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/xml-stream\"),i=e(\"../base-xform\");class s extends i{render(e,t){e.openXml(n.StdDocAttributes),e.openNode(\"Types\",s.PROPERTY_ATTRIBUTES);const r={};(t.media||[]).forEach(t=>{if(\"image\"===t.type){const n=t.extension;r[n]||(r[n]=!0,e.leafNode(\"Default\",{Extension:n,ContentType:\"image/\"+n}))}}),e.leafNode(\"Default\",{Extension:\"rels\",ContentType:\"application/vnd.openxmlformats-package.relationships+xml\"}),e.leafNode(\"Default\",{Extension:\"xml\",ContentType:\"application/xml\"}),e.leafNode(\"Override\",{PartName:\"/xl/workbook.xml\",ContentType:\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"}),t.worksheets.forEach(t=>{const r=`/xl/worksheets/sheet${t.id}.xml`;e.leafNode(\"Override\",{PartName:r,ContentType:\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"})}),e.leafNode(\"Override\",{PartName:\"/xl/theme/theme1.xml\",ContentType:\"application/vnd.openxmlformats-officedocument.theme+xml\"}),e.leafNode(\"Override\",{PartName:\"/xl/styles.xml\",ContentType:\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"});t.sharedStrings&&t.sharedStrings.count&&e.leafNode(\"Override\",{PartName:\"/xl/sharedStrings.xml\",ContentType:\"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\"}),t.tables&&t.tables.forEach(t=>{e.leafNode(\"Override\",{PartName:\"/xl/tables/\"+t.target,ContentType:\"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml\"})}),t.drawings&&t.drawings.forEach(t=>{e.leafNode(\"Override\",{PartName:`/xl/drawings/${t.name}.xml`,ContentType:\"application/vnd.openxmlformats-officedocument.drawing+xml\"})}),t.commentRefs&&(e.leafNode(\"Default\",{Extension:\"vml\",ContentType:\"application/vnd.openxmlformats-officedocument.vmlDrawing\"}),t.commentRefs.forEach(t=>{let{commentName:r}=t;e.leafNode(\"Override\",{PartName:`/xl/${r}.xml`,ContentType:\"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\"})})),e.leafNode(\"Override\",{PartName:\"/docProps/core.xml\",ContentType:\"application/vnd.openxmlformats-package.core-properties+xml\"}),e.leafNode(\"Override\",{PartName:\"/docProps/app.xml\",ContentType:\"application/vnd.openxmlformats-officedocument.extended-properties+xml\"}),e.closeNode()}parseOpen(){return!1}parseText(){}parseClose(){return!1}}s.PROPERTY_ATTRIBUTES={xmlns:\"http://schemas.openxmlformats.org/package/2006/content-types\"},t.exports=s},{\"../../../utils/xml-stream\":28,\"../base-xform\":32}],53:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/xml-stream\"),i=e(\"../base-xform\"),s=e(\"../simple/date-xform\"),o=e(\"../simple/string-xform\"),a=e(\"../simple/integer-xform\");class l extends i{constructor(){super(),this.map={\"dc:creator\":new o({tag:\"dc:creator\"}),\"dc:title\":new o({tag:\"dc:title\"}),\"dc:subject\":new o({tag:\"dc:subject\"}),\"dc:description\":new o({tag:\"dc:description\"}),\"dc:identifier\":new o({tag:\"dc:identifier\"}),\"dc:language\":new o({tag:\"dc:language\"}),\"cp:keywords\":new o({tag:\"cp:keywords\"}),\"cp:category\":new o({tag:\"cp:category\"}),\"cp:lastModifiedBy\":new o({tag:\"cp:lastModifiedBy\"}),\"cp:lastPrinted\":new s({tag:\"cp:lastPrinted\",format:l.DateFormat}),\"cp:revision\":new a({tag:\"cp:revision\"}),\"cp:version\":new o({tag:\"cp:version\"}),\"cp:contentStatus\":new o({tag:\"cp:contentStatus\"}),\"cp:contentType\":new o({tag:\"cp:contentType\"}),\"dcterms:created\":new s({tag:\"dcterms:created\",attrs:l.DateAttrs,format:l.DateFormat}),\"dcterms:modified\":new s({tag:\"dcterms:modified\",attrs:l.DateAttrs,format:l.DateFormat})}}render(e,t){e.openXml(n.StdDocAttributes),e.openNode(\"cp:coreProperties\",l.CORE_PROPERTY_ATTRIBUTES),this.map[\"dc:creator\"].render(e,t.creator),this.map[\"dc:title\"].render(e,t.title),this.map[\"dc:subject\"].render(e,t.subject),this.map[\"dc:description\"].render(e,t.description),this.map[\"dc:identifier\"].render(e,t.identifier),this.map[\"dc:language\"].render(e,t.language),this.map[\"cp:keywords\"].render(e,t.keywords),this.map[\"cp:category\"].render(e,t.category),this.map[\"cp:lastModifiedBy\"].render(e,t.lastModifiedBy),this.map[\"cp:lastPrinted\"].render(e,t.lastPrinted),this.map[\"cp:revision\"].render(e,t.revision),this.map[\"cp:version\"].render(e,t.version),this.map[\"cp:contentStatus\"].render(e,t.contentStatus),this.map[\"cp:contentType\"].render(e,t.contentType),this.map[\"dcterms:created\"].render(e,t.created),this.map[\"dcterms:modified\"].render(e,t.modified),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case\"cp:coreProperties\":case\"coreProperties\":return!0;default:if(this.parser=this.map[e.name],this.parser)return this.parser.parseOpen(e),!0;throw new Error(\"Unexpected xml node in parseOpen: \"+JSON.stringify(e))}}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){if(this.parser)return this.parser.parseClose(e)||(this.parser=void 0),!0;switch(e){case\"cp:coreProperties\":case\"coreProperties\":return this.model={creator:this.map[\"dc:creator\"].model,title:this.map[\"dc:title\"].model,subject:this.map[\"dc:subject\"].model,description:this.map[\"dc:description\"].model,identifier:this.map[\"dc:identifier\"].model,language:this.map[\"dc:language\"].model,keywords:this.map[\"cp:keywords\"].model,category:this.map[\"cp:category\"].model,lastModifiedBy:this.map[\"cp:lastModifiedBy\"].model,lastPrinted:this.map[\"cp:lastPrinted\"].model,revision:this.map[\"cp:revision\"].model,contentStatus:this.map[\"cp:contentStatus\"].model,contentType:this.map[\"cp:contentType\"].model,created:this.map[\"dcterms:created\"].model,modified:this.map[\"dcterms:modified\"].model},!1;default:throw new Error(\"Unexpected xml node in parseClose: \"+e)}}}l.DateFormat=function(e){return e.toISOString().replace(/[.]\\d{3}/,\"\")},l.DateAttrs={\"xsi:type\":\"dcterms:W3CDTF\"},l.CORE_PROPERTY_ATTRIBUTES={\"xmlns:cp\":\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\",\"xmlns:dc\":\"http://purl.org/dc/elements/1.1/\",\"xmlns:dcterms\":\"http://purl.org/dc/terms/\",\"xmlns:dcmitype\":\"http://purl.org/dc/dcmitype/\",\"xmlns:xsi\":\"http://www.w3.org/2001/XMLSchema-instance\"},t.exports=l},{\"../../../utils/xml-stream\":28,\"../base-xform\":32,\"../simple/date-xform\":117,\"../simple/integer-xform\":118,\"../simple/string-xform\":119}],54:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{render(e,t){e.leafNode(\"Relationship\",t)}parseOpen(e){switch(e.name){case\"Relationship\":return this.model=e.attributes,!0;default:return!1}}parseText(){}parseClose(){return!1}}},{\"../base-xform\":32}],55:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/xml-stream\"),i=e(\"../base-xform\"),s=e(\"./relationship-xform\");class o extends i{constructor(){super(),this.map={Relationship:new s}}render(e,t){t=t||this._values,e.openXml(n.StdDocAttributes),e.openNode(\"Relationships\",o.RELATIONSHIPS_ATTRIBUTES),t.forEach(t=>{this.map.Relationship.render(e,t)}),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case\"Relationships\":return this.model=[],!0;default:if(this.parser=this.map[e.name],this.parser)return this.parser.parseOpen(e),!0;throw new Error(\"Unexpected xml node in parseOpen: \"+JSON.stringify(e))}}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){if(this.parser)return this.parser.parseClose(e)||(this.model.push(this.parser.model),this.parser=void 0),!0;switch(e){case\"Relationships\":return!1;default:throw new Error(\"Unexpected xml node in parseClose: \"+e)}}}o.RELATIONSHIPS_ATTRIBUTES={xmlns:\"http://schemas.openxmlformats.org/package/2006/relationships\"},t.exports=o},{\"../../../utils/xml-stream\":28,\"../base-xform\":32,\"./relationship-xform\":54}],56:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case this.tag:this.reset(),this.model={range:{editAs:e.attributes.editAs||\"oneCell\"}};break;default:this.parser=this.map[e.name],this.parser&&this.parser.parseOpen(e)}return!0}parseText(e){this.parser&&this.parser.parseText(e)}reconcilePicture(e,t){if(e&&e.rId){const r=t.rels[e.rId].Target.match(/.*\\/media\\/(.+[.][a-zA-Z]{3,4})/);if(r){const e=r[1],n=t.mediaIndex[e];return t.media[n]}}}}},{\"../base-xform\":32}],57:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\"),i=e(\"./blip-xform\");t.exports=class extends n{constructor(){super(),this.map={\"a:blip\":new i}}get tag(){return\"xdr:blipFill\"}render(e,t){e.openNode(this.tag),this.map[\"a:blip\"].render(e,t),e.openNode(\"a:stretch\"),e.leafNode(\"a:fillRect\"),e.closeNode(),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case this.tag:this.reset();break;default:this.parser=this.map[e.name],this.parser&&this.parser.parseOpen(e)}return!0}parseText(){}parseClose(e){if(this.parser)return this.parser.parseClose(e)||(this.parser=void 0),!0;switch(e){case this.tag:return this.model=this.map[\"a:blip\"].model,!1;default:return!0}}}},{\"../base-xform\":32,\"./blip-xform\":58}],58:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{get tag(){return\"a:blip\"}render(e,t){e.leafNode(this.tag,{\"xmlns:r\":\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\"r:embed\":t.rId,cstate:\"print\"})}parseOpen(e){switch(e.name){case this.tag:return this.model={rId:e.attributes[\"r:embed\"]},!0;default:return!0}}parseText(){}parseClose(e){switch(e){case this.tag:return!1;default:return!0}}}},{\"../base-xform\":32}],59:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{get tag(){return\"xdr:cNvPicPr\"}render(e){e.openNode(this.tag),e.leafNode(\"a:picLocks\",{noChangeAspect:\"1\"}),e.closeNode()}parseOpen(e){switch(e.name){case this.tag:default:return!0}}parseText(){}parseClose(e){switch(e){case this.tag:return!1;default:return!0}}}},{\"../base-xform\":32}],60:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\"),i=e(\"./hlink-click-xform\"),s=e(\"./ext-lst-xform\");t.exports=class extends n{constructor(){super(),this.map={\"a:hlinkClick\":new i,\"a:extLst\":new s}}get tag(){return\"xdr:cNvPr\"}render(e,t){e.openNode(this.tag,{id:t.index,name:\"Picture \"+t.index}),this.map[\"a:hlinkClick\"].render(e,t),this.map[\"a:extLst\"].render(e,t),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case this.tag:this.reset();break;default:this.parser=this.map[e.name],this.parser&&this.parser.parseOpen(e)}return!0}parseText(){}parseClose(e){if(this.parser)return this.parser.parseClose(e)||(this.parser=void 0),!0;switch(e){case this.tag:return this.model=this.map[\"a:hlinkClick\"].model,!1;default:return!0}}}},{\"../base-xform\":32,\"./ext-lst-xform\":63,\"./hlink-click-xform\":65}],61:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\"),i=e(\"../simple/integer-xform\");t.exports=class extends n{constructor(e){super(),this.tag=e.tag,this.map={\"xdr:col\":new i({tag:\"xdr:col\",zero:!0}),\"xdr:colOff\":new i({tag:\"xdr:colOff\",zero:!0}),\"xdr:row\":new i({tag:\"xdr:row\",zero:!0}),\"xdr:rowOff\":new i({tag:\"xdr:rowOff\",zero:!0})}}render(e,t){e.openNode(this.tag),this.map[\"xdr:col\"].render(e,t.nativeCol),this.map[\"xdr:colOff\"].render(e,t.nativeColOff),this.map[\"xdr:row\"].render(e,t.nativeRow),this.map[\"xdr:rowOff\"].render(e,t.nativeRowOff),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case this.tag:this.reset();break;default:this.parser=this.map[e.name],this.parser&&this.parser.parseOpen(e)}return!0}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){if(this.parser)return this.parser.parseClose(e)||(this.parser=void 0),!0;switch(e){case this.tag:return this.model={nativeCol:this.map[\"xdr:col\"].model,nativeColOff:this.map[\"xdr:colOff\"].model,nativeRow:this.map[\"xdr:row\"].model,nativeRowOff:this.map[\"xdr:rowOff\"].model},!1;default:return!0}}}},{\"../base-xform\":32,\"../simple/integer-xform\":118}],62:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/col-cache\"),i=e(\"../../../utils/xml-stream\"),s=e(\"../base-xform\"),o=e(\"./two-cell-anchor-xform\"),a=e(\"./one-cell-anchor-xform\");class l extends s{constructor(){super(),this.map={\"xdr:twoCellAnchor\":new o,\"xdr:oneCellAnchor\":new a}}prepare(e){e.anchors.forEach((e,t)=>{e.anchorType=function(e){return(\"string\"==typeof e.range?n.decode(e.range):e.range).br?\"xdr:twoCellAnchor\":\"xdr:oneCellAnchor\"}(e);this.map[e.anchorType].prepare(e,{index:t})})}get tag(){return\"xdr:wsDr\"}render(e,t){e.openXml(i.StdDocAttributes),e.openNode(this.tag,l.DRAWING_ATTRIBUTES),t.anchors.forEach(t=>{this.map[t.anchorType].render(e,t)}),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case this.tag:this.reset(),this.model={anchors:[]};break;default:this.parser=this.map[e.name],this.parser&&this.parser.parseOpen(e)}return!0}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){if(this.parser)return this.parser.parseClose(e)||(this.model.anchors.push(this.parser.model),this.parser=void 0),!0;switch(e){case this.tag:return!1;default:return!0}}reconcile(e,t){e.anchors.forEach(e=>{e.br?this.map[\"xdr:twoCellAnchor\"].reconcile(e,t):this.map[\"xdr:oneCellAnchor\"].reconcile(e,t)})}}l.DRAWING_ATTRIBUTES={\"xmlns:xdr\":\"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\",\"xmlns:a\":\"http://schemas.openxmlformats.org/drawingml/2006/main\"},t.exports=l},{\"../../../utils/col-cache\":19,\"../../../utils/xml-stream\":28,\"../base-xform\":32,\"./one-cell-anchor-xform\":67,\"./two-cell-anchor-xform\":70}],63:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{get tag(){return\"a:extLst\"}render(e){e.openNode(this.tag),e.openNode(\"a:ext\",{uri:\"{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}\"}),e.leafNode(\"a16:creationId\",{\"xmlns:a16\":\"http://schemas.microsoft.com/office/drawing/2014/main\",id:\"{00000000-0008-0000-0000-000002000000}\"}),e.closeNode(),e.closeNode()}parseOpen(e){switch(e.name){case this.tag:default:return!0}}parseText(){}parseClose(e){switch(e){case this.tag:return!1;default:return!0}}}},{\"../base-xform\":32}],64:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{constructor(e){super(),this.tag=e.tag,this.map={}}render(e,t){e.openNode(this.tag);const r=Math.floor(9525*t.width),n=Math.floor(9525*t.height);e.addAttribute(\"cx\",r),e.addAttribute(\"cy\",n),e.closeNode()}parseOpen(e){return e.name===this.tag&&(this.model={width:parseInt(e.attributes.cx||\"0\",10)/9525,height:parseInt(e.attributes.cy||\"0\",10)/9525},!0)}parseText(){}parseClose(){return!1}}},{\"../base-xform\":32}],65:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{get tag(){return\"a:hlinkClick\"}render(e,t){t.hyperlinks&&t.hyperlinks.rId&&e.leafNode(this.tag,{\"xmlns:r\":\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\"r:id\":t.hyperlinks.rId,tooltip:t.hyperlinks.tooltip})}parseOpen(e){switch(e.name){case this.tag:return this.model={hyperlinks:{rId:e.attributes[\"r:id\"],tooltip:e.attributes.tooltip}},!0;default:return!0}}parseText(){}parseClose(){return!1}}},{\"../base-xform\":32}],66:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\"),i=e(\"./c-nv-pr-xform\"),s=e(\"./c-nv-pic-pr-xform\");t.exports=class extends n{constructor(){super(),this.map={\"xdr:cNvPr\":new i,\"xdr:cNvPicPr\":new s}}get tag(){return\"xdr:nvPicPr\"}render(e,t){e.openNode(this.tag),this.map[\"xdr:cNvPr\"].render(e,t),this.map[\"xdr:cNvPicPr\"].render(e,t),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case this.tag:this.reset();break;default:this.parser=this.map[e.name],this.parser&&this.parser.parseOpen(e)}return!0}parseText(){}parseClose(e){if(this.parser)return this.parser.parseClose(e)||(this.parser=void 0),!0;switch(e){case this.tag:return this.model=this.map[\"xdr:cNvPr\"].model,!1;default:return!0}}}},{\"../base-xform\":32,\"./c-nv-pic-pr-xform\":59,\"./c-nv-pr-xform\":60}],67:[function(e,t,r){\"use strict\";const n=e(\"./base-cell-anchor-xform\"),i=e(\"../static-xform\"),s=e(\"./cell-position-xform\"),o=e(\"./ext-xform\"),a=e(\"./pic-xform\");t.exports=class extends n{constructor(){super(),this.map={\"xdr:from\":new s({tag:\"xdr:from\"}),\"xdr:ext\":new o({tag:\"xdr:ext\"}),\"xdr:pic\":new a,\"xdr:clientData\":new i({tag:\"xdr:clientData\"})}}get tag(){return\"xdr:oneCellAnchor\"}prepare(e,t){this.map[\"xdr:pic\"].prepare(e.picture,t)}render(e,t){e.openNode(this.tag,{editAs:t.range.editAs||\"oneCell\"}),this.map[\"xdr:from\"].render(e,t.range.tl),this.map[\"xdr:ext\"].render(e,t.range.ext),this.map[\"xdr:pic\"].render(e,t.picture),this.map[\"xdr:clientData\"].render(e,{}),e.closeNode()}parseClose(e){if(this.parser)return this.parser.parseClose(e)||(this.parser=void 0),!0;switch(e){case this.tag:return this.model.range.tl=this.map[\"xdr:from\"].model,this.model.range.ext=this.map[\"xdr:ext\"].model,this.model.picture=this.map[\"xdr:pic\"].model,!1;default:return!0}}reconcile(e,t){e.medium=this.reconcilePicture(e.picture,t)}}},{\"../static-xform\":120,\"./base-cell-anchor-xform\":56,\"./cell-position-xform\":61,\"./ext-xform\":64,\"./pic-xform\":68}],68:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\"),i=e(\"../static-xform\"),s=e(\"./blip-fill-xform\"),o=e(\"./nv-pic-pr-xform\"),a=e(\"./sp-pr\");t.exports=class extends n{constructor(){super(),this.map={\"xdr:nvPicPr\":new o,\"xdr:blipFill\":new s,\"xdr:spPr\":new i(a)}}get tag(){return\"xdr:pic\"}prepare(e,t){e.index=t.index+1}render(e,t){e.openNode(this.tag),this.map[\"xdr:nvPicPr\"].render(e,t),this.map[\"xdr:blipFill\"].render(e,t),this.map[\"xdr:spPr\"].render(e,t),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case this.tag:this.reset();break;default:this.parser=this.map[e.name],this.parser&&this.parser.parseOpen(e)}return!0}parseText(){}parseClose(e){if(this.parser)return this.parser.parseClose(e)||(this.mergeModel(this.parser.model),this.parser=void 0),!0;switch(e){case this.tag:return!1;default:return!0}}}},{\"../base-xform\":32,\"../static-xform\":120,\"./blip-fill-xform\":57,\"./nv-pic-pr-xform\":66,\"./sp-pr\":69}],69:[function(e,t,r){\"use strict\";t.exports={tag:\"xdr:spPr\",c:[{tag:\"a:xfrm\",c:[{tag:\"a:off\",$:{x:\"0\",y:\"0\"}},{tag:\"a:ext\",$:{cx:\"0\",cy:\"0\"}}]},{tag:\"a:prstGeom\",$:{prst:\"rect\"},c:[{tag:\"a:avLst\"}]}]}},{}],70:[function(e,t,r){\"use strict\";const n=e(\"./base-cell-anchor-xform\"),i=e(\"../static-xform\"),s=e(\"./cell-position-xform\"),o=e(\"./pic-xform\");t.exports=class extends n{constructor(){super(),this.map={\"xdr:from\":new s({tag:\"xdr:from\"}),\"xdr:to\":new s({tag:\"xdr:to\"}),\"xdr:pic\":new o,\"xdr:clientData\":new i({tag:\"xdr:clientData\"})}}get tag(){return\"xdr:twoCellAnchor\"}prepare(e,t){this.map[\"xdr:pic\"].prepare(e.picture,t)}render(e,t){e.openNode(this.tag,{editAs:t.range.editAs||\"oneCell\"}),this.map[\"xdr:from\"].render(e,t.range.tl),this.map[\"xdr:to\"].render(e,t.range.br),this.map[\"xdr:pic\"].render(e,t.picture),this.map[\"xdr:clientData\"].render(e,{}),e.closeNode()}parseClose(e){if(this.parser)return this.parser.parseClose(e)||(this.parser=void 0),!0;switch(e){case this.tag:return this.model.range.tl=this.map[\"xdr:from\"].model,this.model.range.br=this.map[\"xdr:to\"].model,this.model.picture=this.map[\"xdr:pic\"].model,!1;default:return!0}}reconcile(e,t){e.medium=this.reconcilePicture(e.picture,t)}}},{\"../static-xform\":120,\"./base-cell-anchor-xform\":56,\"./cell-position-xform\":61,\"./pic-xform\":68}],71:[function(e,t,r){\"use strict\";const n=e(\"./base-xform\");t.exports=class extends n{constructor(e){super(),this.tag=e.tag,this.always=!!e.always,this.count=e.count,this.empty=e.empty,this.$count=e.$count||\"count\",this.$=e.$,this.childXform=e.childXform,this.maxItems=e.maxItems}prepare(e,t){const{childXform:r}=this;e&&e.forEach((e,n)=>{t.index=n,r.prepare(e,t)})}render(e,t){if(this.always||t&&t.length){e.openNode(this.tag,this.$),this.count&&e.addAttribute(this.$count,t&&t.length||0);const{childXform:r}=this;(t||[]).forEach((t,n)=>{r.render(e,t,n)}),e.closeNode()}else this.empty&&e.leafNode(this.tag)}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case this.tag:return this.model=[],!0;default:return!!this.childXform.parseOpen(e)&&(this.parser=this.childXform,!0)}}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){if(this.parser){if(!this.parser.parseClose(e)&&(this.model.push(this.parser.model),this.parser=void 0,this.maxItems&&this.model.length>this.maxItems))throw new Error(`Max ${this.childXform.tag} count (${this.maxItems}) exceeded`);return!0}return!1}reconcile(e,t){if(e){const{childXform:r}=this;e.forEach(e=>{r.reconcile(e,t)})}}}},{\"./base-xform\":32}],72:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/col-cache\"),i=e(\"../base-xform\");t.exports=class extends i{get tag(){return\"autoFilter\"}render(e,t){if(t)if(\"string\"==typeof t)e.leafNode(\"autoFilter\",{ref:t});else{const r=function(e){return\"string\"==typeof e?e:n.getAddress(e.row,e.column).address},i=r(t.from),s=r(t.to);i&&s&&e.leafNode(\"autoFilter\",{ref:`${i}:${s}`})}}parseOpen(e){\"autoFilter\"===e.name&&(this.model=e.attributes.ref)}}},{\"../../../utils/col-cache\":19,\"../base-xform\":32}],73:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/utils\"),i=e(\"../base-xform\"),s=e(\"../../../doc/range\"),o=e(\"../../../doc/enums\"),a=e(\"../strings/rich-text-xform\");function l(e){if(null==e)return o.ValueType.Null;if(e instanceof String||\"string\"==typeof e)return o.ValueType.String;if(\"number\"==typeof e)return o.ValueType.Number;if(\"boolean\"==typeof e)return o.ValueType.Boolean;if(e instanceof Date)return o.ValueType.Date;if(e.text&&e.hyperlink)return o.ValueType.Hyperlink;if(e.formula)return o.ValueType.Formula;if(e.error)return o.ValueType.Error;throw new Error(\"I could not understand type of value\")}t.exports=class extends i{constructor(){super(),this.richTextXForm=new a}get tag(){return\"c\"}prepare(e,t){const r=t.styles.addStyleModel(e.style||{},function(e){switch(e.type){case o.ValueType.Formula:return l(e.result);default:return e.type}}(e));switch(r&&(e.styleId=r),e.comment&&t.comments.push({...e.comment,ref:e.address}),e.type){case o.ValueType.String:case o.ValueType.RichText:t.sharedStrings&&(e.ssId=t.sharedStrings.add(e.value));break;case o.ValueType.Date:t.date1904&&(e.date1904=!0);break;case o.ValueType.Hyperlink:t.sharedStrings&&void 0!==e.text&&null!==e.text&&(e.ssId=t.sharedStrings.add(e.text)),t.hyperlinks.push({address:e.address,target:e.hyperlink,tooltip:e.tooltip});break;case o.ValueType.Merge:t.merges.add(e);break;case o.ValueType.Formula:if(t.date1904&&(e.date1904=!0),\"shared\"===e.shareType&&(e.si=t.siFormulae++),e.formula)t.formulae[e.address]=e;else if(e.sharedFormula){const r=t.formulae[e.sharedFormula];if(!r)throw new Error(\"Shared Formula master must exist above and or left of clone for cell \"+e.address);void 0===r.si?(r.shareType=\"shared\",r.si=t.siFormulae++,r.range=new s(r.address,e.address)):r.range&&r.range.expandToAddress(e.address),e.si=r.si}}}renderFormula(e,t){let r=null;switch(t.shareType){case\"shared\":r={t:\"shared\",ref:t.ref||t.range.range,si:t.si};break;case\"array\":r={t:\"array\",ref:t.ref};break;default:void 0!==t.si&&(r={t:\"shared\",si:t.si})}switch(l(t.result)){case o.ValueType.Null:e.leafNode(\"f\",r,t.formula);break;case o.ValueType.String:e.addAttribute(\"t\",\"str\"),e.leafNode(\"f\",r,t.formula),e.leafNode(\"v\",null,t.result);break;case o.ValueType.Number:e.leafNode(\"f\",r,t.formula),e.leafNode(\"v\",null,t.result);break;case o.ValueType.Boolean:e.addAttribute(\"t\",\"b\"),e.leafNode(\"f\",r,t.formula),e.leafNode(\"v\",null,t.result?1:0);break;case o.ValueType.Error:e.addAttribute(\"t\",\"e\"),e.leafNode(\"f\",r,t.formula),e.leafNode(\"v\",null,t.result.error);break;case o.ValueType.Date:e.leafNode(\"f\",r,t.formula),e.leafNode(\"v\",null,n.dateToExcel(t.result,t.date1904));break;default:throw new Error(\"I could not understand type of value\")}}render(e,t){if(t.type!==o.ValueType.Null||t.styleId){switch(e.openNode(\"c\"),e.addAttribute(\"r\",t.address),t.styleId&&e.addAttribute(\"s\",t.styleId),t.type){case o.ValueType.Null:break;case o.ValueType.Number:e.leafNode(\"v\",null,t.value);break;case o.ValueType.Boolean:e.addAttribute(\"t\",\"b\"),e.leafNode(\"v\",null,t.value?\"1\":\"0\");break;case o.ValueType.Error:e.addAttribute(\"t\",\"e\"),e.leafNode(\"v\",null,t.value.error);break;case o.ValueType.String:case o.ValueType.RichText:void 0!==t.ssId?(e.addAttribute(\"t\",\"s\"),e.leafNode(\"v\",null,t.ssId)):t.value&&t.value.richText?(e.addAttribute(\"t\",\"inlineStr\"),e.openNode(\"is\"),t.value.richText.forEach(t=>{this.richTextXForm.render(e,t)}),e.closeNode(\"is\")):(e.addAttribute(\"t\",\"str\"),e.leafNode(\"v\",null,t.value));break;case o.ValueType.Date:e.leafNode(\"v\",null,n.dateToExcel(t.value,t.date1904));break;case o.ValueType.Hyperlink:void 0!==t.ssId?(e.addAttribute(\"t\",\"s\"),e.leafNode(\"v\",null,t.ssId)):(e.addAttribute(\"t\",\"str\"),e.leafNode(\"v\",null,t.text));break;case o.ValueType.Formula:this.renderFormula(e,t);break;case o.ValueType.Merge:}e.closeNode()}}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case\"c\":return this.model={address:e.attributes.r},this.t=e.attributes.t,e.attributes.s&&(this.model.styleId=parseInt(e.attributes.s,10)),!0;case\"f\":return this.currentNode=\"f\",this.model.si=e.attributes.si,this.model.shareType=e.attributes.t,this.model.ref=e.attributes.ref,!0;case\"v\":return this.currentNode=\"v\",!0;case\"t\":return this.currentNode=\"t\",!0;case\"r\":return this.parser=this.richTextXForm,this.parser.parseOpen(e),!0;default:return!1}}parseText(e){if(this.parser)this.parser.parseText(e);else switch(this.currentNode){case\"f\":this.model.formula=this.model.formula?this.model.formula+e:e;break;case\"v\":case\"t\":this.model.value&&this.model.value.richText?this.model.value.richText.text=this.model.value.richText.text?this.model.value.richText.text+e:e:this.model.value=this.model.value?this.model.value+e:e}}parseClose(e){switch(e){case\"c\":{const{model:e}=this;if(e.formula||e.shareType)e.type=o.ValueType.Formula,e.value&&(\"str\"===this.t?e.result=n.xmlDecode(e.value):\"b\"===this.t?e.result=0!==parseInt(e.value,10):\"e\"===this.t?e.result={error:e.value}:e.result=parseFloat(e.value),e.value=void 0);else if(void 0!==e.value)switch(this.t){case\"s\":e.type=o.ValueType.String,e.value=parseInt(e.value,10);break;case\"str\":e.type=o.ValueType.String,e.value=n.xmlDecode(e.value);break;case\"inlineStr\":e.type=o.ValueType.String;break;case\"b\":e.type=o.ValueType.Boolean,e.value=0!==parseInt(e.value,10);break;case\"e\":e.type=o.ValueType.Error,e.value={error:e.value};break;default:e.type=o.ValueType.Number,e.value=parseFloat(e.value)}else e.styleId?e.type=o.ValueType.Null:e.type=o.ValueType.Merge;return!1}case\"f\":case\"v\":case\"is\":return this.currentNode=void 0,!0;case\"t\":return this.parser?(this.parser.parseClose(e),!0):(this.currentNode=void 0,!0);case\"r\":return this.model.value=this.model.value||{},this.model.value.richText=this.model.value.richText||[],this.model.value.richText.push(this.parser.model),this.parser=void 0,this.currentNode=void 0,!0;default:return!!this.parser&&(this.parser.parseClose(e),!0)}}reconcile(e,t){const r=e.styleId&&t.styles&&t.styles.getStyleModel(e.styleId);switch(r&&(e.style=r),void 0!==e.styleId&&(e.styleId=void 0),e.type){case o.ValueType.String:\"number\"==typeof e.value&&t.sharedStrings&&(e.value=t.sharedStrings.getString(e.value)),e.value.richText&&(e.type=o.ValueType.RichText);break;case o.ValueType.Number:r&&n.isDateFmt(r.numFmt)&&(e.type=o.ValueType.Date,e.value=n.excelToDate(e.value,t.date1904));break;case o.ValueType.Formula:void 0!==e.result&&r&&n.isDateFmt(r.numFmt)&&(e.result=n.excelToDate(e.result,t.date1904)),\"shared\"===e.shareType&&(e.ref?t.formulae[e.si]=e.address:(e.sharedFormula=t.formulae[e.si],delete e.shareType),delete e.si)}const i=t.hyperlinkMap[e.address];i&&(e.type===o.ValueType.Formula?(e.text=e.result,e.result=void 0):(e.text=e.value,e.value=void 0),e.type=o.ValueType.Hyperlink,e.hyperlink=i);const s=t.commentsMap&&t.commentsMap[e.address];s&&(e.comment=s)}}},{\"../../../doc/enums\":7,\"../../../doc/range\":10,\"../../../utils/utils\":27,\"../base-xform\":32,\"../strings/rich-text-xform\":122}],74:[function(e,t,r){\"use strict\";const n=e(\"../../base-xform\");t.exports=class extends n{get tag(){return\"x14:cfIcon\"}render(e,t){e.leafNode(this.tag,{iconSet:t.iconSet,iconId:t.iconId})}parseOpen(e){let{attributes:t}=e;this.model={iconSet:t.iconSet,iconId:n.toIntValue(t.iconId)}}parseClose(e){return e!==this.tag}}},{\"../../base-xform\":32}],75:[function(e,t,r){\"use strict\";const{v4:n}=e(\"uuid\"),i=e(\"../../base-xform\"),s=e(\"../../composite-xform\"),o=e(\"./databar-ext-xform\"),a=e(\"./icon-set-ext-xform\"),l={\"3Triangles\":!0,\"3Stars\":!0,\"5Boxes\":!0};class c extends s{constructor(){super(),this.map={\"x14:dataBar\":this.databarXform=new o,\"x14:iconSet\":this.iconSetXform=new a}}get tag(){return\"x14:cfRule\"}static isExt(e){return\"dataBar\"===e.type?o.isExt(e):!(\"iconSet\"!==e.type||!e.custom&&!l[e.iconSet])}prepare(e){c.isExt(e)&&(e.x14Id=`{${n()}}`.toUpperCase())}render(e,t){if(c.isExt(t))switch(t.type){case\"dataBar\":this.renderDataBar(e,t);break;case\"iconSet\":this.renderIconSet(e,t)}}renderDataBar(e,t){e.openNode(this.tag,{type:\"dataBar\",id:t.x14Id}),this.databarXform.render(e,t),e.closeNode()}renderIconSet(e,t){e.openNode(this.tag,{type:\"iconSet\",priority:t.priority,id:t.x14Id||`{${n()}}`}),this.iconSetXform.render(e,t),e.closeNode()}createNewModel(e){let{attributes:t}=e;return{type:t.type,x14Id:t.id,priority:i.toIntValue(t.priority)}}onParserClose(e,t){Object.assign(this.model,t.model)}}t.exports=c},{\"../../base-xform\":32,\"../../composite-xform\":48,\"./databar-ext-xform\":79,\"./icon-set-ext-xform\":81,uuid:528}],76:[function(e,t,r){\"use strict\";const n=e(\"../../composite-xform\"),i=e(\"./f-ext-xform\");t.exports=class extends n{constructor(){super(),this.map={\"xm:f\":this.fExtXform=new i}}get tag(){return\"x14:cfvo\"}render(e,t){e.openNode(this.tag,{type:t.type}),void 0!==t.value&&this.fExtXform.render(e,t.value),e.closeNode()}createNewModel(e){return{type:e.attributes.type}}onParserClose(e,t){switch(e){case\"xm:f\":this.model.value=t.model?parseFloat(t.model):0}}}},{\"../../composite-xform\":48,\"./f-ext-xform\":80}],77:[function(e,t,r){\"use strict\";const n=e(\"../../composite-xform\"),i=e(\"./sqref-ext-xform\"),s=e(\"./cf-rule-ext-xform\");t.exports=class extends n{constructor(){super(),this.map={\"xm:sqref\":this.sqRef=new i,\"x14:cfRule\":this.cfRule=new s}}get tag(){return\"x14:conditionalFormatting\"}prepare(e,t){e.rules.forEach(e=>{this.cfRule.prepare(e,t)})}render(e,t){t.rules.some(s.isExt)&&(e.openNode(this.tag,{\"xmlns:xm\":\"http://schemas.microsoft.com/office/excel/2006/main\"}),t.rules.filter(s.isExt).forEach(t=>this.cfRule.render(e,t)),this.sqRef.render(e,t.ref),e.closeNode())}createNewModel(){return{rules:[]}}onParserClose(e,t){switch(e){case\"xm:sqref\":this.model.ref=t.model;break;case\"x14:cfRule\":this.model.rules.push(t.model)}}}},{\"../../composite-xform\":48,\"./cf-rule-ext-xform\":75,\"./sqref-ext-xform\":82}],78:[function(e,t,r){\"use strict\";const n=e(\"../../composite-xform\"),i=e(\"./cf-rule-ext-xform\"),s=e(\"./conditional-formatting-ext-xform\");t.exports=class extends n{constructor(){super(),this.map={\"x14:conditionalFormatting\":this.cfXform=new s}}get tag(){return\"x14:conditionalFormattings\"}hasContent(e){return void 0===e.hasExtContent&&(e.hasExtContent=e.some(e=>e.rules.some(i.isExt))),e.hasExtContent}prepare(e,t){e.forEach(e=>{this.cfXform.prepare(e,t)})}render(e,t){this.hasContent(t)&&(e.openNode(this.tag),t.forEach(t=>this.cfXform.render(e,t)),e.closeNode())}createNewModel(){return[]}onParserClose(e,t){this.model.push(t.model)}}},{\"../../composite-xform\":48,\"./cf-rule-ext-xform\":75,\"./conditional-formatting-ext-xform\":77}],79:[function(e,t,r){\"use strict\";const n=e(\"../../base-xform\"),i=e(\"../../composite-xform\"),s=e(\"../../style/color-xform\"),o=e(\"./cfvo-ext-xform\");t.exports=class extends i{constructor(){super(),this.map={\"x14:cfvo\":this.cfvoXform=new o,\"x14:borderColor\":this.borderColorXform=new s(\"x14:borderColor\"),\"x14:negativeBorderColor\":this.negativeBorderColorXform=new s(\"x14:negativeBorderColor\"),\"x14:negativeFillColor\":this.negativeFillColorXform=new s(\"x14:negativeFillColor\"),\"x14:axisColor\":this.axisColorXform=new s(\"x14:axisColor\")}}static isExt(e){return!e.gradient}get tag(){return\"x14:dataBar\"}render(e,t){e.openNode(this.tag,{minLength:n.toIntAttribute(t.minLength,0,!0),maxLength:n.toIntAttribute(t.maxLength,100,!0),border:n.toBoolAttribute(t.border,!1),gradient:n.toBoolAttribute(t.gradient,!0),negativeBarColorSameAsPositive:n.toBoolAttribute(t.negativeBarColorSameAsPositive,!0),negativeBarBorderColorSameAsPositive:n.toBoolAttribute(t.negativeBarBorderColorSameAsPositive,!0),axisPosition:n.toAttribute(t.axisPosition,\"auto\"),direction:n.toAttribute(t.direction,\"leftToRight\")}),t.cfvo.forEach(t=>{this.cfvoXform.render(e,t)}),this.borderColorXform.render(e,t.borderColor),this.negativeBorderColorXform.render(e,t.negativeBorderColor),this.negativeFillColorXform.render(e,t.negativeFillColor),this.axisColorXform.render(e,t.axisColor),e.closeNode()}createNewModel(e){let{attributes:t}=e;return{cfvo:[],minLength:n.toIntValue(t.minLength,0),maxLength:n.toIntValue(t.maxLength,100),border:n.toBoolValue(t.border,!1),gradient:n.toBoolValue(t.gradient,!0),negativeBarColorSameAsPositive:n.toBoolValue(t.negativeBarColorSameAsPositive,!0),negativeBarBorderColorSameAsPositive:n.toBoolValue(t.negativeBarBorderColorSameAsPositive,!0),axisPosition:n.toStringValue(t.axisPosition,\"auto\"),direction:n.toStringValue(t.direction,\"leftToRight\")}}onParserClose(e,t){const[,r]=e.split(\":\");switch(r){case\"cfvo\":this.model.cfvo.push(t.model);break;default:this.model[r]=t.model}}}},{\"../../base-xform\":32,\"../../composite-xform\":48,\"../../style/color-xform\":128,\"./cfvo-ext-xform\":76}],80:[function(e,t,r){\"use strict\";const n=e(\"../../base-xform\");t.exports=class extends n{get tag(){return\"xm:f\"}render(e,t){e.leafNode(this.tag,null,t)}parseOpen(){this.model=\"\"}parseText(e){this.model+=e}parseClose(e){return e!==this.tag}}},{\"../../base-xform\":32}],81:[function(e,t,r){\"use strict\";const n=e(\"../../base-xform\"),i=e(\"../../composite-xform\"),s=e(\"./cfvo-ext-xform\"),o=e(\"./cf-icon-ext-xform\");t.exports=class extends i{constructor(){super(),this.map={\"x14:cfvo\":this.cfvoXform=new s,\"x14:cfIcon\":this.cfIconXform=new o}}get tag(){return\"x14:iconSet\"}render(e,t){e.openNode(this.tag,{iconSet:n.toStringAttribute(t.iconSet),reverse:n.toBoolAttribute(t.reverse,!1),showValue:n.toBoolAttribute(t.showValue,!0),custom:n.toBoolAttribute(t.icons,!1)}),t.cfvo.forEach(t=>{this.cfvoXform.render(e,t)}),t.icons&&t.icons.forEach((t,r)=>{t.iconId=r,this.cfIconXform.render(e,t)}),e.closeNode()}createNewModel(e){let{attributes:t}=e;return{cfvo:[],iconSet:n.toStringValue(t.iconSet,\"3TrafficLights\"),reverse:n.toBoolValue(t.reverse,!1),showValue:n.toBoolValue(t.showValue,!0)}}onParserClose(e,t){const[,r]=e.split(\":\");switch(r){case\"cfvo\":this.model.cfvo.push(t.model);break;case\"cfIcon\":this.model.icons||(this.model.icons=[]),this.model.icons.push(t.model);break;default:this.model[r]=t.model}}}},{\"../../base-xform\":32,\"../../composite-xform\":48,\"./cf-icon-ext-xform\":74,\"./cfvo-ext-xform\":76}],82:[function(e,t,r){\"use strict\";const n=e(\"../../base-xform\");t.exports=class extends n{get tag(){return\"xm:sqref\"}render(e,t){e.leafNode(this.tag,null,t)}parseOpen(){this.model=\"\"}parseText(e){this.model+=e}parseClose(e){return e!==this.tag}}},{\"../../base-xform\":32}],83:[function(e,t,r){\"use strict\";const n=e(\"../../base-xform\"),i=e(\"../../composite-xform\"),s=e(\"../../../../doc/range\"),o=e(\"./databar-xform\"),a=e(\"./ext-lst-ref-xform\"),l=e(\"./formula-xform\"),c=e(\"./color-scale-xform\"),u=e(\"./icon-set-xform\"),h={\"3Triangles\":!0,\"3Stars\":!0,\"5Boxes\":!0},f=e=>{const{type:t,operator:r}=e;switch(t){case\"containsText\":case\"containsBlanks\":case\"notContainsBlanks\":case\"containsErrors\":case\"notContainsErrors\":return{type:\"containsText\",operator:t};default:return{type:t,operator:r}}};class d extends i{constructor(){super(),this.map={dataBar:this.databarXform=new o,extLst:this.extLstRefXform=new a,formula:this.formulaXform=new l,colorScale:this.colorScaleXform=new c,iconSet:this.iconSetXform=new u}}get tag(){return\"cfRule\"}static isPrimitive(e){return\"iconSet\"!==e.type||!e.custom&&!h[e.iconSet]}render(e,t){switch(t.type){case\"expression\":this.renderExpression(e,t);break;case\"cellIs\":this.renderCellIs(e,t);break;case\"top10\":this.renderTop10(e,t);break;case\"aboveAverage\":this.renderAboveAverage(e,t);break;case\"dataBar\":this.renderDataBar(e,t);break;case\"colorScale\":this.renderColorScale(e,t);break;case\"iconSet\":this.renderIconSet(e,t);break;case\"containsText\":this.renderText(e,t);break;case\"timePeriod\":this.renderTimePeriod(e,t)}}renderExpression(e,t){e.openNode(this.tag,{type:\"expression\",dxfId:t.dxfId,priority:t.priority}),this.formulaXform.render(e,t.formulae[0]),e.closeNode()}renderCellIs(e,t){e.openNode(this.tag,{type:\"cellIs\",dxfId:t.dxfId,priority:t.priority,operator:t.operator}),t.formulae.forEach(t=>{this.formulaXform.render(e,t)}),e.closeNode()}renderTop10(e,t){e.leafNode(this.tag,{type:\"top10\",dxfId:t.dxfId,priority:t.priority,percent:n.toBoolAttribute(t.percent,!1),bottom:n.toBoolAttribute(t.bottom,!1),rank:n.toIntValue(t.rank,10,!0)})}renderAboveAverage(e,t){e.leafNode(this.tag,{type:\"aboveAverage\",dxfId:t.dxfId,priority:t.priority,aboveAverage:n.toBoolAttribute(t.aboveAverage,!0)})}renderDataBar(e,t){e.openNode(this.tag,{type:\"dataBar\",priority:t.priority}),this.databarXform.render(e,t),this.extLstRefXform.render(e,t),e.closeNode()}renderColorScale(e,t){e.openNode(this.tag,{type:\"colorScale\",priority:t.priority}),this.colorScaleXform.render(e,t),e.closeNode()}renderIconSet(e,t){d.isPrimitive(t)&&(e.openNode(this.tag,{type:\"iconSet\",priority:t.priority}),this.iconSetXform.render(e,t),e.closeNode())}renderText(e,t){e.openNode(this.tag,{type:t.operator,dxfId:t.dxfId,priority:t.priority,operator:n.toStringAttribute(t.operator,\"containsText\")});const r=(e=>{if(e.formulae&&e.formulae[0])return e.formulae[0];const t=new s(e.ref),{tl:r}=t;switch(e.operator){case\"containsText\":return`NOT(ISERROR(SEARCH(\"${e.text}\",${r})))`;case\"containsBlanks\":return`LEN(TRIM(${r}))=0`;case\"notContainsBlanks\":return`LEN(TRIM(${r}))>0`;case\"containsErrors\":return`ISERROR(${r})`;case\"notContainsErrors\":return`NOT(ISERROR(${r}))`;default:return}})(t);r&&this.formulaXform.render(e,r),e.closeNode()}renderTimePeriod(e,t){e.openNode(this.tag,{type:\"timePeriod\",dxfId:t.dxfId,priority:t.priority,timePeriod:t.timePeriod});const r=(e=>{if(e.formulae&&e.formulae[0])return e.formulae[0];const t=new s(e.ref),{tl:r}=t;switch(e.timePeriod){case\"thisWeek\":return`AND(TODAY()-ROUNDDOWN(${r},0)<=WEEKDAY(TODAY())-1,ROUNDDOWN(${r},0)-TODAY()<=7-WEEKDAY(TODAY()))`;case\"lastWeek\":return`AND(TODAY()-ROUNDDOWN(${r},0)>=(WEEKDAY(TODAY())),TODAY()-ROUNDDOWN(${r},0)<(WEEKDAY(TODAY())+7))`;case\"nextWeek\":return`AND(ROUNDDOWN(${r},0)-TODAY()>(7-WEEKDAY(TODAY())),ROUNDDOWN(${r},0)-TODAY()<(15-WEEKDAY(TODAY())))`;case\"yesterday\":return`FLOOR(${r},1)=TODAY()-1`;case\"today\":return`FLOOR(${r},1)=TODAY()`;case\"tomorrow\":return`FLOOR(${r},1)=TODAY()+1`;case\"last7Days\":return`AND(TODAY()-FLOOR(${r},1)<=6,FLOOR(${r},1)<=TODAY())`;case\"lastMonth\":return`AND(MONTH(${r})=MONTH(EDATE(TODAY(),0-1)),YEAR(${r})=YEAR(EDATE(TODAY(),0-1)))`;case\"thisMonth\":return`AND(MONTH(${r})=MONTH(TODAY()),YEAR(${r})=YEAR(TODAY()))`;case\"nextMonth\":return`AND(MONTH(${r})=MONTH(EDATE(TODAY(),0+1)),YEAR(${r})=YEAR(EDATE(TODAY(),0+1)))`;default:return}})(t);r&&this.formulaXform.render(e,r),e.closeNode()}createNewModel(e){let{attributes:t}=e;return{...f(t),dxfId:n.toIntValue(t.dxfId),priority:n.toIntValue(t.priority),timePeriod:t.timePeriod,percent:n.toBoolValue(t.percent),bottom:n.toBoolValue(t.bottom),rank:n.toIntValue(t.rank),aboveAverage:n.toBoolValue(t.aboveAverage)}}onParserClose(e,t){switch(e){case\"dataBar\":case\"extLst\":case\"colorScale\":case\"iconSet\":Object.assign(this.model,t.model);break;case\"formula\":this.model.formulae=this.model.formulae||[],this.model.formulae.push(t.model)}}}t.exports=d},{\"../../../../doc/range\":10,\"../../base-xform\":32,\"../../composite-xform\":48,\"./color-scale-xform\":85,\"./databar-xform\":88,\"./ext-lst-ref-xform\":89,\"./formula-xform\":90,\"./icon-set-xform\":91}],84:[function(e,t,r){\"use strict\";const n=e(\"../../base-xform\");t.exports=class extends n{get tag(){return\"cfvo\"}render(e,t){e.leafNode(this.tag,{type:t.type,val:t.value})}parseOpen(e){this.model={type:e.attributes.type,value:n.toFloatValue(e.attributes.val)}}parseClose(e){return e!==this.tag}}},{\"../../base-xform\":32}],85:[function(e,t,r){\"use strict\";const n=e(\"../../composite-xform\"),i=e(\"../../style/color-xform\"),s=e(\"./cfvo-xform\");t.exports=class extends n{constructor(){super(),this.map={cfvo:this.cfvoXform=new s,color:this.colorXform=new i}}get tag(){return\"colorScale\"}render(e,t){e.openNode(this.tag),t.cfvo.forEach(t=>{this.cfvoXform.render(e,t)}),t.color.forEach(t=>{this.colorXform.render(e,t)}),e.closeNode()}createNewModel(e){return{cfvo:[],color:[]}}onParserClose(e,t){this.model[e].push(t.model)}}},{\"../../composite-xform\":48,\"../../style/color-xform\":128,\"./cfvo-xform\":84}],86:[function(e,t,r){\"use strict\";const n=e(\"../../composite-xform\"),i=e(\"./cf-rule-xform\");t.exports=class extends n{constructor(){super(),this.map={cfRule:new i}}get tag(){return\"conditionalFormatting\"}render(e,t){t.rules.some(i.isPrimitive)&&(e.openNode(this.tag,{sqref:t.ref}),t.rules.forEach(r=>{i.isPrimitive(r)&&(r.ref=t.ref,this.map.cfRule.render(e,r))}),e.closeNode())}createNewModel(e){let{attributes:t}=e;return{ref:t.sqref,rules:[]}}onParserClose(e,t){this.model.rules.push(t.model)}}},{\"../../composite-xform\":48,\"./cf-rule-xform\":83}],87:[function(e,t,r){\"use strict\";const n=e(\"../../base-xform\"),i=e(\"./conditional-formatting-xform\");t.exports=class extends n{constructor(){super(),this.cfXform=new i}get tag(){return\"conditionalFormatting\"}reset(){this.model=[]}prepare(e,t){let r=e.reduce((e,t)=>Math.max(e,...t.rules.map(e=>e.priority||0)),1);e.forEach(e=>{e.rules.forEach(e=>{e.priority||(e.priority=r++),e.style&&(e.dxfId=t.styles.addDxfStyle(e.style))})})}render(e,t){t.forEach(t=>{this.cfXform.render(e,t)})}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case\"conditionalFormatting\":return this.parser=this.cfXform,this.parser.parseOpen(e),!0;default:return!1}}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){return!!this.parser&&(!!this.parser.parseClose(e)||(this.model.push(this.parser.model),this.parser=void 0,!1))}reconcile(e,t){e.forEach(e=>{e.rules.forEach(e=>{void 0!==e.dxfId&&(e.style=t.styles.getDxfStyle(e.dxfId),delete e.dxfId)})})}}},{\"../../base-xform\":32,\"./conditional-formatting-xform\":86}],88:[function(e,t,r){\"use strict\";const n=e(\"../../composite-xform\"),i=e(\"../../style/color-xform\"),s=e(\"./cfvo-xform\");t.exports=class extends n{constructor(){super(),this.map={cfvo:this.cfvoXform=new s,color:this.colorXform=new i}}get tag(){return\"dataBar\"}render(e,t){e.openNode(this.tag),t.cfvo.forEach(t=>{this.cfvoXform.render(e,t)}),this.colorXform.render(e,t.color),e.closeNode()}createNewModel(){return{cfvo:[]}}onParserClose(e,t){switch(e){case\"cfvo\":this.model.cfvo.push(t.model);break;case\"color\":this.model.color=t.model}}}},{\"../../composite-xform\":48,\"../../style/color-xform\":128,\"./cfvo-xform\":84}],89:[function(e,t,r){\"use strict\";const n=e(\"../../base-xform\"),i=e(\"../../composite-xform\");class s extends n{get tag(){return\"x14:id\"}render(e,t){e.leafNode(this.tag,null,t)}parseOpen(){this.model=\"\"}parseText(e){this.model+=e}parseClose(e){return e!==this.tag}}class o extends i{constructor(){super(),this.map={\"x14:id\":this.idXform=new s}}get tag(){return\"ext\"}render(e,t){e.openNode(this.tag,{uri:\"{B025F937-C7B1-47D3-B67F-A62EFF666E3E}\",\"xmlns:x14\":\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\"}),this.idXform.render(e,t.x14Id),e.closeNode()}createNewModel(){return{}}onParserClose(e,t){this.model.x14Id=t.model}}t.exports=class extends i{constructor(){super(),this.map={ext:new o}}get tag(){return\"extLst\"}render(e,t){e.openNode(this.tag),this.map.ext.render(e,t),e.closeNode()}createNewModel(){return{}}onParserClose(e,t){Object.assign(this.model,t.model)}}},{\"../../base-xform\":32,\"../../composite-xform\":48}],90:[function(e,t,r){\"use strict\";const n=e(\"../../base-xform\");t.exports=class extends n{get tag(){return\"formula\"}render(e,t){e.leafNode(this.tag,null,t)}parseOpen(){this.model=\"\"}parseText(e){this.model+=e}parseClose(e){return e!==this.tag}}},{\"../../base-xform\":32}],91:[function(e,t,r){\"use strict\";const n=e(\"../../base-xform\"),i=e(\"../../composite-xform\"),s=e(\"./cfvo-xform\");t.exports=class extends i{constructor(){super(),this.map={cfvo:this.cfvoXform=new s}}get tag(){return\"iconSet\"}render(e,t){e.openNode(this.tag,{iconSet:n.toStringAttribute(t.iconSet,\"3TrafficLights\"),reverse:n.toBoolAttribute(t.reverse,!1),showValue:n.toBoolAttribute(t.showValue,!0)}),t.cfvo.forEach(t=>{this.cfvoXform.render(e,t)}),e.closeNode()}createNewModel(e){let{attributes:t}=e;return{iconSet:n.toStringValue(t.iconSet,\"3TrafficLights\"),reverse:n.toBoolValue(t.reverse),showValue:n.toBoolValue(t.showValue),cfvo:[]}}onParserClose(e,t){this.model[e].push(t.model)}}},{\"../../base-xform\":32,\"../../composite-xform\":48,\"./cfvo-xform\":84}],92:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/utils\"),i=e(\"../base-xform\");t.exports=class extends i{get tag(){return\"col\"}prepare(e,t){const r=t.styles.addStyleModel(e.style||{});r&&(e.styleId=r)}render(e,t){e.openNode(\"col\"),e.addAttribute(\"min\",t.min),e.addAttribute(\"max\",t.max),t.width&&e.addAttribute(\"width\",t.width),t.styleId&&e.addAttribute(\"style\",t.styleId),t.hidden&&e.addAttribute(\"hidden\",\"1\"),t.bestFit&&e.addAttribute(\"bestFit\",\"1\"),t.outlineLevel&&e.addAttribute(\"outlineLevel\",t.outlineLevel),t.collapsed&&e.addAttribute(\"collapsed\",\"1\"),e.addAttribute(\"customWidth\",\"1\"),e.closeNode()}parseOpen(e){if(\"col\"===e.name){const t=this.model={min:parseInt(e.attributes.min||\"0\",10),max:parseInt(e.attributes.max||\"0\",10),width:void 0===e.attributes.width?void 0:parseFloat(e.attributes.width||\"0\")};return e.attributes.style&&(t.styleId=parseInt(e.attributes.style,10)),n.parseBoolean(e.attributes.hidden)&&(t.hidden=!0),n.parseBoolean(e.attributes.bestFit)&&(t.bestFit=!0),e.attributes.outlineLevel&&(t.outlineLevel=parseInt(e.attributes.outlineLevel,10)),n.parseBoolean(e.attributes.collapsed)&&(t.collapsed=!0),!0}return!1}parseText(){}parseClose(){return!1}reconcile(e,t){e.styleId&&(e.style=t.styles.getStyleModel(e.styleId))}}},{\"../../../utils/utils\":27,\"../base-xform\":32}],93:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/under-dash\"),i=e(\"../../../utils/utils\"),s=e(\"../../../utils/col-cache\"),o=e(\"../base-xform\"),a=e(\"../../../doc/range\");function l(e,t,r,n){const i=t[r];void 0!==i?e[r]=i:void 0!==n&&(e[r]=n)}function c(e,t,r,n){const s=t[r];void 0!==s?e[r]=i.parseBoolean(s):void 0!==n&&(e[r]=n)}t.exports=class extends o{get tag(){return\"dataValidations\"}render(e,t){const r=function(e){const t=n.map(e,(e,t)=>({address:t,dataValidation:e,marked:!1})).sort((e,t)=>n.strcmp(e.address,t.address)),r=n.keyBy(t,\"address\"),i=(t,r,i)=>{for(let o=0;o<r;o++){const r=s.encodeAddress(t.row+o,i);if(!e[r]||!n.isEqual(e[t.address],e[r]))return!1}return!0};return t.map(t=>{if(!t.marked){const o=s.decodeEx(t.address);if(o.dimensions)return r[o.dimensions].marked=!0,{...t.dataValidation,sqref:t.address};let a=1,l=s.encodeAddress(o.row+a,o.col);for(;e[l]&&n.isEqual(t.dataValidation,e[l]);)a++,l=s.encodeAddress(o.row+a,o.col);let c=1;for(;i(o,a,o.col+c);)c++;for(let e=0;e<a;e++)for(let t=0;t<c;t++)l=s.encodeAddress(o.row+e,o.col+t),r[l].marked=!0;if(a>1||c>1){const e=o.row+(a-1),r=o.col+(c-1);return{...t.dataValidation,sqref:`${t.address}:${s.encodeAddress(e,r)}`}}return{...t.dataValidation,sqref:t.address}}return null}).filter(Boolean)}(t);r.length&&(e.openNode(\"dataValidations\",{count:r.length}),r.forEach(t=>{e.openNode(\"dataValidation\"),\"any\"!==t.type&&(e.addAttribute(\"type\",t.type),t.operator&&\"list\"!==t.type&&\"between\"!==t.operator&&e.addAttribute(\"operator\",t.operator),t.allowBlank&&e.addAttribute(\"allowBlank\",\"1\")),t.showInputMessage&&e.addAttribute(\"showInputMessage\",\"1\"),t.promptTitle&&e.addAttribute(\"promptTitle\",t.promptTitle),t.prompt&&e.addAttribute(\"prompt\",t.prompt),t.showErrorMessage&&e.addAttribute(\"showErrorMessage\",\"1\"),t.errorStyle&&e.addAttribute(\"errorStyle\",t.errorStyle),t.errorTitle&&e.addAttribute(\"errorTitle\",t.errorTitle),t.error&&e.addAttribute(\"error\",t.error),e.addAttribute(\"sqref\",t.sqref),(t.formulae||[]).forEach((r,n)=>{e.openNode(\"formula\"+(n+1)),\"date\"===t.type?e.writeText(i.dateToExcel(new Date(r))):e.writeText(r),e.closeNode()}),e.closeNode()}),e.closeNode())}parseOpen(e){switch(e.name){case\"dataValidations\":return this.model={},!0;case\"dataValidation\":{this._address=e.attributes.sqref;const t={type:e.attributes.type||\"any\",formulae:[]};switch(e.attributes.type&&c(t,e.attributes,\"allowBlank\"),c(t,e.attributes,\"showInputMessage\"),c(t,e.attributes,\"showErrorMessage\"),t.type){case\"any\":case\"list\":case\"custom\":break;default:l(t,e.attributes,\"operator\",\"between\")}return l(t,e.attributes,\"promptTitle\"),l(t,e.attributes,\"prompt\"),l(t,e.attributes,\"errorStyle\"),l(t,e.attributes,\"errorTitle\"),l(t,e.attributes,\"error\"),this._dataValidation=t,!0}case\"formula1\":case\"formula2\":return this._formula=[],!0;default:return!1}}parseText(e){this._formula&&this._formula.push(e)}parseClose(e){switch(e){case\"dataValidations\":return!1;case\"dataValidation\":this._dataValidation.formulae&&this._dataValidation.formulae.length||(delete this._dataValidation.formulae,delete this._dataValidation.operator);return(this._address.split(/\\s+/g)||[]).forEach(e=>{if(e.includes(\":\")){new a(e).forEachAddress(e=>{this.model[e]=this._dataValidation})}else this.model[e]=this._dataValidation}),!0;case\"formula1\":case\"formula2\":{let e=this._formula.join(\"\");switch(this._dataValidation.type){case\"whole\":case\"textLength\":e=parseInt(e,10);break;case\"decimal\":e=parseFloat(e);break;case\"date\":e=i.excelToDate(parseFloat(e))}return this._dataValidation.formulae.push(e),this._formula=void 0,!0}default:return!0}}}},{\"../../../doc/range\":10,\"../../../utils/col-cache\":19,\"../../../utils/under-dash\":26,\"../../../utils/utils\":27,\"../base-xform\":32}],94:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{get tag(){return\"dimension\"}render(e,t){t&&e.leafNode(\"dimension\",{ref:t})}parseOpen(e){return\"dimension\"===e.name&&(this.model=e.attributes.ref,!0)}parseText(){}parseClose(){return!1}}},{\"../base-xform\":32}],95:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{get tag(){return\"drawing\"}render(e,t){t&&e.leafNode(this.tag,{\"r:id\":t.rId})}parseOpen(e){switch(e.name){case this.tag:return this.model={rId:e.attributes[\"r:id\"]},!0;default:return!1}}parseText(){}parseClose(){return!1}}},{\"../base-xform\":32}],96:[function(e,t,r){\"use strict\";const n=e(\"../composite-xform\"),i=e(\"./cf-ext/conditional-formattings-ext-xform\");class s extends n{constructor(){super(),this.map={\"x14:conditionalFormattings\":this.conditionalFormattings=new i}}get tag(){return\"ext\"}hasContent(e){return this.conditionalFormattings.hasContent(e.conditionalFormattings)}prepare(e,t){this.conditionalFormattings.prepare(e.conditionalFormattings,t)}render(e,t){e.openNode(\"ext\",{uri:\"{78C0D931-6437-407d-A8EE-F0AAD7539E65}\",\"xmlns:x14\":\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\"}),this.conditionalFormattings.render(e,t.conditionalFormattings),e.closeNode()}createNewModel(){return{}}onParserClose(e,t){this.model[e]=t.model}}t.exports=class extends n{constructor(){super(),this.map={ext:this.ext=new s}}get tag(){return\"extLst\"}prepare(e,t){this.ext.prepare(e,t)}hasContent(e){return this.ext.hasContent(e)}render(e,t){this.hasContent(t)&&(e.openNode(\"extLst\"),this.ext.render(e,t),e.closeNode())}createNewModel(){return{}}onParserClose(e,t){Object.assign(this.model,t.model)}}},{\"../composite-xform\":48,\"./cf-ext/conditional-formattings-ext-xform\":78}],97:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{get tag(){return\"headerFooter\"}render(e,t){if(t){e.addRollback();let r=!1;e.openNode(\"headerFooter\"),t.differentFirst&&(e.addAttribute(\"differentFirst\",\"1\"),r=!0),t.differentOddEven&&(e.addAttribute(\"differentOddEven\",\"1\"),r=!0),t.oddHeader&&\"string\"==typeof t.oddHeader&&(e.leafNode(\"oddHeader\",null,t.oddHeader),r=!0),t.oddFooter&&\"string\"==typeof t.oddFooter&&(e.leafNode(\"oddFooter\",null,t.oddFooter),r=!0),t.evenHeader&&\"string\"==typeof t.evenHeader&&(e.leafNode(\"evenHeader\",null,t.evenHeader),r=!0),t.evenFooter&&\"string\"==typeof t.evenFooter&&(e.leafNode(\"evenFooter\",null,t.evenFooter),r=!0),t.firstHeader&&\"string\"==typeof t.firstHeader&&(e.leafNode(\"firstHeader\",null,t.firstHeader),r=!0),t.firstFooter&&\"string\"==typeof t.firstFooter&&(e.leafNode(\"firstFooter\",null,t.firstFooter),r=!0),r?(e.closeNode(),e.commit()):e.rollback()}}parseOpen(e){switch(e.name){case\"headerFooter\":return this.model={},e.attributes.differentFirst&&(this.model.differentFirst=1===parseInt(e.attributes.differentFirst,0)),e.attributes.differentOddEven&&(this.model.differentOddEven=1===parseInt(e.attributes.differentOddEven,0)),!0;case\"oddHeader\":return this.currentNode=\"oddHeader\",!0;case\"oddFooter\":return this.currentNode=\"oddFooter\",!0;case\"evenHeader\":return this.currentNode=\"evenHeader\",!0;case\"evenFooter\":return this.currentNode=\"evenFooter\",!0;case\"firstHeader\":return this.currentNode=\"firstHeader\",!0;case\"firstFooter\":return this.currentNode=\"firstFooter\",!0;default:return!1}}parseText(e){switch(this.currentNode){case\"oddHeader\":this.model.oddHeader=e;break;case\"oddFooter\":this.model.oddFooter=e;break;case\"evenHeader\":this.model.evenHeader=e;break;case\"evenFooter\":this.model.evenFooter=e;break;case\"firstHeader\":this.model.firstHeader=e;break;case\"firstFooter\":this.model.firstFooter=e}}parseClose(){switch(this.currentNode){case\"oddHeader\":case\"oddFooter\":case\"evenHeader\":case\"evenFooter\":case\"firstHeader\":case\"firstFooter\":return this.currentNode=void 0,!0;default:return!1}}}},{\"../base-xform\":32}],98:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{get tag(){return\"hyperlink\"}render(e,t){this.isInternalLink(t)?e.leafNode(\"hyperlink\",{ref:t.address,\"r:id\":t.rId,tooltip:t.tooltip,location:t.target}):e.leafNode(\"hyperlink\",{ref:t.address,\"r:id\":t.rId,tooltip:t.tooltip})}parseOpen(e){return\"hyperlink\"===e.name&&(this.model={address:e.attributes.ref,rId:e.attributes[\"r:id\"],tooltip:e.attributes.tooltip},e.attributes.location&&(this.model.target=e.attributes.location),!0)}parseText(){}parseClose(){return!1}isInternalLink(e){return e.target&&/^[^!]+![a-zA-Z]+[\\d]+$/.test(e.target)}}},{\"../base-xform\":32}],99:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{get tag(){return\"mergeCell\"}render(e,t){e.leafNode(\"mergeCell\",{ref:t})}parseOpen(e){return\"mergeCell\"===e.name&&(this.model=e.attributes.ref,!0)}parseText(){}parseClose(){return!1}}},{\"../base-xform\":32}],100:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/under-dash\"),i=e(\"../../../doc/range\"),s=e(\"../../../utils/col-cache\"),o=e(\"../../../doc/enums\");t.exports=class{constructor(){this.merges={}}add(e){if(this.merges[e.master])this.merges[e.master].expandToAddress(e.address);else{const t=`${e.master}:${e.address}`;this.merges[e.master]=new i(t)}}get mergeCells(){return n.map(this.merges,e=>e.range)}reconcile(e,t){n.each(e,e=>{const r=s.decode(e);for(let e=r.top;e<=r.bottom;e++){const n=t[e-1];for(let t=r.left;t<=r.right;t++){const i=n.cells[t-1];i?i.type===o.ValueType.Merge&&(i.master=r.tl):n.cells[t]={type:o.ValueType.Null,address:s.encodeAddress(e,t)}}}})}getMasterAddress(e){const t=this.hash[e];return t&&t.tl}}},{\"../../../doc/enums\":7,\"../../../doc/range\":10,\"../../../utils/col-cache\":19,\"../../../utils/under-dash\":26}],101:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\"),i=e=>void 0!==e;t.exports=class extends n{get tag(){return\"outlinePr\"}render(e,t){return!(!t||!i(t.summaryBelow)&&!i(t.summaryRight))&&(e.leafNode(this.tag,{summaryBelow:i(t.summaryBelow)?Number(t.summaryBelow):void 0,summaryRight:i(t.summaryRight)?Number(t.summaryRight):void 0}),!0)}parseOpen(e){return e.name===this.tag&&(this.model={summaryBelow:i(e.attributes.summaryBelow)?Boolean(Number(e.attributes.summaryBelow)):void 0,summaryRight:i(e.attributes.summaryRight)?Boolean(Number(e.attributes.summaryRight)):void 0},!0)}parseText(){}parseClose(){return!1}}},{\"../base-xform\":32}],102:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{get tag(){return\"brk\"}render(e,t){e.leafNode(\"brk\",t)}parseOpen(e){return\"brk\"===e.name&&(this.model=e.attributes.ref,!0)}parseText(){}parseClose(){return!1}}},{\"../base-xform\":32}],103:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/under-dash\"),i=e(\"../base-xform\");t.exports=class extends i{get tag(){return\"pageMargins\"}render(e,t){if(t){const r={left:t.left,right:t.right,top:t.top,bottom:t.bottom,header:t.header,footer:t.footer};n.some(r,e=>void 0!==e)&&e.leafNode(this.tag,r)}}parseOpen(e){switch(e.name){case this.tag:return this.model={left:parseFloat(e.attributes.left||.7),right:parseFloat(e.attributes.right||.7),top:parseFloat(e.attributes.top||.75),bottom:parseFloat(e.attributes.bottom||.75),header:parseFloat(e.attributes.header||.3),footer:parseFloat(e.attributes.footer||.3)},!0;default:return!1}}parseText(){}parseClose(){return!1}}},{\"../../../utils/under-dash\":26,\"../base-xform\":32}],104:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{get tag(){return\"pageSetUpPr\"}render(e,t){return!(!t||!t.fitToPage)&&(e.leafNode(this.tag,{fitToPage:t.fitToPage?\"1\":void 0}),!0)}parseOpen(e){return e.name===this.tag&&(this.model={fitToPage:\"1\"===e.attributes.fitToPage},!0)}parseText(){}parseClose(){return!1}}},{\"../base-xform\":32}],105:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/under-dash\"),i=e(\"../base-xform\");function s(e){return e?\"1\":void 0}function o(e){switch(e){case\"overThenDown\":return e;default:return}}function a(e){switch(e){case\"atEnd\":case\"asDisplyed\":return e;default:return}}function l(e){switch(e){case\"dash\":case\"blank\":case\"NA\":return e;default:return}}t.exports=class extends i{get tag(){return\"pageSetup\"}render(e,t){if(t){const r={paperSize:t.paperSize,orientation:t.orientation,horizontalDpi:t.horizontalDpi,verticalDpi:t.verticalDpi,pageOrder:o(t.pageOrder),blackAndWhite:s(t.blackAndWhite),draft:s(t.draft),cellComments:a(t.cellComments),errors:l(t.errors),scale:t.scale,fitToWidth:t.fitToWidth,fitToHeight:t.fitToHeight,firstPageNumber:t.firstPageNumber,useFirstPageNumber:s(t.firstPageNumber),usePrinterDefaults:s(t.usePrinterDefaults),copies:t.copies};n.some(r,e=>void 0!==e)&&e.leafNode(this.tag,r)}}parseOpen(e){switch(e.name){case this.tag:return this.model={paperSize:(t=e.attributes.paperSize,void 0!==t?parseInt(t,10):void 0),orientation:e.attributes.orientation||\"portrait\",horizontalDpi:parseInt(e.attributes.horizontalDpi||\"4294967295\",10),verticalDpi:parseInt(e.attributes.verticalDpi||\"4294967295\",10),pageOrder:e.attributes.pageOrder||\"downThenOver\",blackAndWhite:\"1\"===e.attributes.blackAndWhite,draft:\"1\"===e.attributes.draft,cellComments:e.attributes.cellComments||\"None\",errors:e.attributes.errors||\"displayed\",scale:parseInt(e.attributes.scale||\"100\",10),fitToWidth:parseInt(e.attributes.fitToWidth||\"1\",10),fitToHeight:parseInt(e.attributes.fitToHeight||\"1\",10),firstPageNumber:parseInt(e.attributes.firstPageNumber||\"1\",10),useFirstPageNumber:\"1\"===e.attributes.useFirstPageNumber,usePrinterDefaults:\"1\"===e.attributes.usePrinterDefaults,copies:parseInt(e.attributes.copies||\"1\",10)},!0;default:return!1}var t}parseText(){}parseClose(){return!1}}},{\"../../../utils/under-dash\":26,\"../base-xform\":32}],106:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{get tag(){return\"picture\"}render(e,t){t&&e.leafNode(this.tag,{\"r:id\":t.rId})}parseOpen(e){switch(e.name){case this.tag:return this.model={rId:e.attributes[\"r:id\"]},!0;default:return!1}}parseText(){}parseClose(){return!1}}},{\"../base-xform\":32}],107:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/under-dash\"),i=e(\"../base-xform\");function s(e){return e?\"1\":void 0}t.exports=class extends i{get tag(){return\"printOptions\"}render(e,t){if(t){const r={headings:s(t.showRowColHeaders),gridLines:s(t.showGridLines),horizontalCentered:s(t.horizontalCentered),verticalCentered:s(t.verticalCentered)};n.some(r,e=>void 0!==e)&&e.leafNode(this.tag,r)}}parseOpen(e){switch(e.name){case this.tag:return this.model={showRowColHeaders:\"1\"===e.attributes.headings,showGridLines:\"1\"===e.attributes.gridLines,horizontalCentered:\"1\"===e.attributes.horizontalCentered,verticalCentered:\"1\"===e.attributes.verticalCentered},!0;default:return!1}}parseText(){}parseClose(){return!1}}},{\"../../../utils/under-dash\":26,\"../base-xform\":32}],108:[function(e,t,r){\"use strict\";const n=e(\"./page-breaks-xform\"),i=e(\"../list-xform\");t.exports=class extends i{constructor(){super({tag:\"rowBreaks\",count:!0,childXform:new n})}render(e,t){if(t&&t.length){e.openNode(this.tag,this.$),this.count&&(e.addAttribute(this.$count,t.length),e.addAttribute(\"manualBreakCount\",t.length));const{childXform:r}=this;t.forEach(t=>{r.render(e,t)}),e.closeNode()}else this.empty&&e.leafNode(this.tag)}}},{\"../list-xform\":71,\"./page-breaks-xform\":102}],109:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\"),i=e(\"../../../utils/utils\"),s=e(\"./cell-xform\");t.exports=class extends n{constructor(e){super(),this.maxItems=e&&e.maxItems,this.map={c:new s}}get tag(){return\"row\"}prepare(e,t){const r=t.styles.addStyleModel(e.style);r&&(e.styleId=r);const n=this.map.c;e.cells.forEach(e=>{n.prepare(e,t)})}render(e,t,r){e.openNode(\"row\"),e.addAttribute(\"r\",t.number),t.height&&(e.addAttribute(\"ht\",t.height),e.addAttribute(\"customHeight\",\"1\")),t.hidden&&e.addAttribute(\"hidden\",\"1\"),t.min>0&&t.max>0&&t.min<=t.max&&e.addAttribute(\"spans\",`${t.min}:${t.max}`),t.styleId&&(e.addAttribute(\"s\",t.styleId),e.addAttribute(\"customFormat\",\"1\")),e.addAttribute(\"x14ac:dyDescent\",\"0.25\"),t.outlineLevel&&e.addAttribute(\"outlineLevel\",t.outlineLevel),t.collapsed&&e.addAttribute(\"collapsed\",\"1\");const n=this.map.c;t.cells.forEach(t=>{n.render(e,t,r)}),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;if(\"row\"===e.name){this.numRowsSeen+=1;const t=e.attributes.spans?e.attributes.spans.split(\":\").map(e=>parseInt(e,10)):[void 0,void 0],r=this.model={number:parseInt(e.attributes.r,10),min:t[0],max:t[1],cells:[]};return e.attributes.s&&(r.styleId=parseInt(e.attributes.s,10)),i.parseBoolean(e.attributes.hidden)&&(r.hidden=!0),i.parseBoolean(e.attributes.bestFit)&&(r.bestFit=!0),e.attributes.ht&&(r.height=parseFloat(e.attributes.ht)),e.attributes.outlineLevel&&(r.outlineLevel=parseInt(e.attributes.outlineLevel,10)),i.parseBoolean(e.attributes.collapsed)&&(r.collapsed=!0),!0}return this.parser=this.map[e.name],!!this.parser&&(this.parser.parseOpen(e),!0)}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){if(this.parser){if(!this.parser.parseClose(e)){if(this.model.cells.push(this.parser.model),this.maxItems&&this.model.cells.length>this.maxItems)throw new Error(`Max column count (${this.maxItems}) exceeded`);this.parser=void 0}return!0}return!1}reconcile(e,t){e.style=e.styleId?t.styles.getStyleModel(e.styleId):{},void 0!==e.styleId&&(e.styleId=void 0);const r=this.map.c;e.cells.forEach(e=>{r.reconcile(e,t)})}}},{\"../../../utils/utils\":27,\"../base-xform\":32,\"./cell-xform\":73}],110:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/under-dash\"),i=e(\"../base-xform\");t.exports=class extends i{get tag(){return\"sheetFormatPr\"}render(e,t){if(t){const r={defaultRowHeight:t.defaultRowHeight,outlineLevelRow:t.outlineLevelRow,outlineLevelCol:t.outlineLevelCol,\"x14ac:dyDescent\":t.dyDescent};t.defaultColWidth&&(r.defaultColWidth=t.defaultColWidth),t.defaultRowHeight&&15===t.defaultRowHeight||(r.customHeight=\"1\"),n.some(r,e=>void 0!==e)&&e.leafNode(\"sheetFormatPr\",r)}}parseOpen(e){return\"sheetFormatPr\"===e.name&&(this.model={defaultRowHeight:parseFloat(e.attributes.defaultRowHeight||\"0\"),dyDescent:parseFloat(e.attributes[\"x14ac:dyDescent\"]||\"0\"),outlineLevelRow:parseInt(e.attributes.outlineLevelRow||\"0\",10),outlineLevelCol:parseInt(e.attributes.outlineLevelCol||\"0\",10)},e.attributes.defaultColWidth&&(this.model.defaultColWidth=parseFloat(e.attributes.defaultColWidth)),!0)}parseText(){}parseClose(){return!1}}},{\"../../../utils/under-dash\":26,\"../base-xform\":32}],111:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\"),i=e(\"../style/color-xform\"),s=e(\"./page-setup-properties-xform\"),o=e(\"./outline-properties-xform\");t.exports=class extends n{constructor(){super(),this.map={tabColor:new i(\"tabColor\"),pageSetUpPr:new s,outlinePr:new o}}get tag(){return\"sheetPr\"}render(e,t){if(t){e.addRollback(),e.openNode(\"sheetPr\");let r=!1;r=this.map.tabColor.render(e,t.tabColor)||r,r=this.map.pageSetUpPr.render(e,t.pageSetup)||r,r=this.map.outlinePr.render(e,t.outlineProperties)||r,r?(e.closeNode(),e.commit()):e.rollback()}}parseOpen(e){return this.parser?(this.parser.parseOpen(e),!0):e.name===this.tag?(this.reset(),!0):!!this.map[e.name]&&(this.parser=this.map[e.name],this.parser.parseOpen(e),!0)}parseText(e){return!!this.parser&&(this.parser.parseText(e),!0)}parseClose(e){return this.parser?(this.parser.parseClose(e)||(this.parser=void 0),!0):(this.map.tabColor.model||this.map.pageSetUpPr.model||this.map.outlinePr.model?(this.model={},this.map.tabColor.model&&(this.model.tabColor=this.map.tabColor.model),this.map.pageSetUpPr.model&&(this.model.pageSetup=this.map.pageSetUpPr.model),this.map.outlinePr.model&&(this.model.outlineProperties=this.map.outlinePr.model)):this.model=null,!1)}}},{\"../base-xform\":32,\"../style/color-xform\":128,\"./outline-properties-xform\":101,\"./page-setup-properties-xform\":104}],112:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/under-dash\"),i=e(\"../base-xform\");function s(e,t){return e?t:void 0}function o(e,t){return e===t||void 0}t.exports=class extends i{get tag(){return\"sheetProtection\"}render(e,t){if(t){const r={sheet:s(t.sheet,\"1\"),selectLockedCells:!1===t.selectLockedCells?\"1\":void 0,selectUnlockedCells:!1===t.selectUnlockedCells?\"1\":void 0,formatCells:s(t.formatCells,\"0\"),formatColumns:s(t.formatColumns,\"0\"),formatRows:s(t.formatRows,\"0\"),insertColumns:s(t.insertColumns,\"0\"),insertRows:s(t.insertRows,\"0\"),insertHyperlinks:s(t.insertHyperlinks,\"0\"),deleteColumns:s(t.deleteColumns,\"0\"),deleteRows:s(t.deleteRows,\"0\"),sort:s(t.sort,\"0\"),autoFilter:s(t.autoFilter,\"0\"),pivotTables:s(t.pivotTables,\"0\")};t.sheet&&(r.algorithmName=t.algorithmName,r.hashValue=t.hashValue,r.saltValue=t.saltValue,r.spinCount=t.spinCount,r.objects=s(!1===t.objects,\"1\"),r.scenarios=s(!1===t.scenarios,\"1\")),n.some(r,e=>void 0!==e)&&e.leafNode(this.tag,r)}}parseOpen(e){switch(e.name){case this.tag:return this.model={sheet:o(e.attributes.sheet,\"1\"),objects:\"1\"!==e.attributes.objects&&void 0,scenarios:\"1\"!==e.attributes.scenarios&&void 0,selectLockedCells:\"1\"!==e.attributes.selectLockedCells&&void 0,selectUnlockedCells:\"1\"!==e.attributes.selectUnlockedCells&&void 0,formatCells:o(e.attributes.formatCells,\"0\"),formatColumns:o(e.attributes.formatColumns,\"0\"),formatRows:o(e.attributes.formatRows,\"0\"),insertColumns:o(e.attributes.insertColumns,\"0\"),insertRows:o(e.attributes.insertRows,\"0\"),insertHyperlinks:o(e.attributes.insertHyperlinks,\"0\"),deleteColumns:o(e.attributes.deleteColumns,\"0\"),deleteRows:o(e.attributes.deleteRows,\"0\"),sort:o(e.attributes.sort,\"0\"),autoFilter:o(e.attributes.autoFilter,\"0\"),pivotTables:o(e.attributes.pivotTables,\"0\")},e.attributes.algorithmName&&(this.model.algorithmName=e.attributes.algorithmName,this.model.hashValue=e.attributes.hashValue,this.model.saltValue=e.attributes.saltValue,this.model.spinCount=parseInt(e.attributes.spinCount,10)),!0;default:return!1}}parseText(){}parseClose(){return!1}}},{\"../../../utils/under-dash\":26,\"../base-xform\":32}],113:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/col-cache\"),i=e(\"../base-xform\"),s={frozen:\"frozen\",frozenSplit:\"frozen\",split:\"split\"};t.exports=class extends i{get tag(){return\"sheetView\"}prepare(e){switch(e.state){case\"frozen\":case\"split\":break;default:e.state=\"normal\"}}render(e,t){e.openNode(\"sheetView\",{workbookViewId:t.workbookViewId||0});const r=function(t,r,n){n&&e.addAttribute(t,r)};let i,s,o,a;switch(r(\"rightToLeft\",\"1\",!0===t.rightToLeft),r(\"tabSelected\",\"1\",t.tabSelected),r(\"showRuler\",\"0\",!1===t.showRuler),r(\"showRowColHeaders\",\"0\",!1===t.showRowColHeaders),r(\"showGridLines\",\"0\",!1===t.showGridLines),r(\"zoomScale\",t.zoomScale,t.zoomScale),r(\"zoomScaleNormal\",t.zoomScaleNormal,t.zoomScaleNormal),r(\"view\",t.style,t.style),t.state){case\"frozen\":s=t.xSplit||0,o=t.ySplit||0,i=t.topLeftCell||n.getAddress(o+1,s+1).address,a=(t.xSplit&&t.ySplit?\"bottomRight\":t.xSplit&&\"topRight\")||\"bottomLeft\",e.leafNode(\"pane\",{xSplit:t.xSplit||void 0,ySplit:t.ySplit||void 0,topLeftCell:i,activePane:a,state:\"frozen\"}),e.leafNode(\"selection\",{pane:a,activeCell:t.activeCell,sqref:t.activeCell});break;case\"split\":\"topLeft\"===t.activePane&&(t.activePane=void 0),e.leafNode(\"pane\",{xSplit:t.xSplit||void 0,ySplit:t.ySplit||void 0,topLeftCell:t.topLeftCell,activePane:t.activePane}),e.leafNode(\"selection\",{pane:t.activePane,activeCell:t.activeCell,sqref:t.activeCell});break;case\"normal\":t.activeCell&&e.leafNode(\"selection\",{activeCell:t.activeCell,sqref:t.activeCell})}e.closeNode()}parseOpen(e){switch(e.name){case\"sheetView\":return this.sheetView={workbookViewId:parseInt(e.attributes.workbookViewId,10),rightToLeft:\"1\"===e.attributes.rightToLeft,tabSelected:\"1\"===e.attributes.tabSelected,showRuler:!(\"0\"===e.attributes.showRuler),showRowColHeaders:!(\"0\"===e.attributes.showRowColHeaders),showGridLines:!(\"0\"===e.attributes.showGridLines),zoomScale:parseInt(e.attributes.zoomScale||\"100\",10),zoomScaleNormal:parseInt(e.attributes.zoomScaleNormal||\"100\",10),style:e.attributes.view},this.pane=void 0,this.selections={},!0;case\"pane\":return this.pane={xSplit:parseInt(e.attributes.xSplit||\"0\",10),ySplit:parseInt(e.attributes.ySplit||\"0\",10),topLeftCell:e.attributes.topLeftCell,activePane:e.attributes.activePane||\"topLeft\",state:e.attributes.state},!0;case\"selection\":{const t=e.attributes.pane||\"topLeft\";return this.selections[t]={pane:t,activeCell:e.attributes.activeCell},!0}default:return!1}}parseText(){}parseClose(e){let t,r;switch(e){case\"sheetView\":return this.sheetView&&this.pane?(t=this.model={workbookViewId:this.sheetView.workbookViewId,rightToLeft:this.sheetView.rightToLeft,state:s[this.pane.state]||\"split\",xSplit:this.pane.xSplit,ySplit:this.pane.ySplit,topLeftCell:this.pane.topLeftCell,showRuler:this.sheetView.showRuler,showRowColHeaders:this.sheetView.showRowColHeaders,showGridLines:this.sheetView.showGridLines,zoomScale:this.sheetView.zoomScale,zoomScaleNormal:this.sheetView.zoomScaleNormal},\"split\"===this.model.state&&(t.activePane=this.pane.activePane),r=this.selections[this.pane.activePane],r&&r.activeCell&&(t.activeCell=r.activeCell),this.sheetView.style&&(t.style=this.sheetView.style)):(t=this.model={workbookViewId:this.sheetView.workbookViewId,rightToLeft:this.sheetView.rightToLeft,state:\"normal\",showRuler:this.sheetView.showRuler,showRowColHeaders:this.sheetView.showRowColHeaders,showGridLines:this.sheetView.showGridLines,zoomScale:this.sheetView.zoomScale,zoomScaleNormal:this.sheetView.zoomScaleNormal},r=this.selections.topLeft,r&&r.activeCell&&(t.activeCell=r.activeCell),this.sheetView.style&&(t.style=this.sheetView.style)),!1;default:return!0}}reconcile(){}}},{\"../../../utils/col-cache\":19,\"../base-xform\":32}],114:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{get tag(){return\"tablePart\"}render(e,t){t&&e.leafNode(this.tag,{\"r:id\":t.rId})}parseOpen(e){switch(e.name){case this.tag:return this.model={rId:e.attributes[\"r:id\"]},!0;default:return!1}}parseText(){}parseClose(){return!1}}},{\"../base-xform\":32}],115:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/under-dash\"),i=e(\"../../../utils/col-cache\"),s=e(\"../../../utils/xml-stream\"),o=e(\"../../rel-type\"),a=e(\"./merges\"),l=e(\"../base-xform\"),c=e(\"../list-xform\"),u=e(\"./row-xform\"),h=e(\"./col-xform\"),f=e(\"./dimension-xform\"),d=e(\"./hyperlink-xform\"),p=e(\"./merge-cell-xform\"),m=e(\"./data-validations-xform\"),b=e(\"./sheet-properties-xform\"),g=e(\"./sheet-format-properties-xform\"),y=e(\"./sheet-view-xform\"),v=e(\"./sheet-protection-xform\"),w=e(\"./page-margins-xform\"),_=e(\"./page-setup-xform\"),x=e(\"./print-options-xform\"),k=e(\"./auto-filter-xform\"),S=e(\"./picture-xform\"),M=e(\"./drawing-xform\"),C=e(\"./table-part-xform\"),T=e(\"./row-breaks-xform\"),E=e(\"./header-footer-xform\"),A=e(\"./cf/conditional-formattings-xform\"),R=e(\"./ext-lst-xform\"),O=(e,t)=>{if(!t||!t.length)return e;if(!e||!e.length)return t;const r={},n={};return e.forEach(e=>{r[e.ref]=e,e.rules.forEach(e=>{const{x14Id:t}=e;t&&(n[t]=e)})}),t.forEach(t=>{t.rules.forEach(i=>{const s=n[i.x14Id];s?((e,t)=>{Object.keys(t).forEach(r=>{const n=e[r],i=t[r];void 0===n&&void 0!==i&&(e[r]=i)})})(s,i):r[t.ref]?r[t.ref].rules.push(i):e.push({ref:t.ref,rules:[i]})})}),e};class j extends l{constructor(e){super();const{maxRows:t,maxCols:r,ignoreNodes:n}=e||{};this.ignoreNodes=n||[],this.map={sheetPr:new b,dimension:new f,sheetViews:new c({tag:\"sheetViews\",count:!1,childXform:new y}),sheetFormatPr:new g,cols:new c({tag:\"cols\",count:!1,childXform:new h}),sheetData:new c({tag:\"sheetData\",count:!1,empty:!0,childXform:new u({maxItems:r}),maxItems:t}),autoFilter:new k,mergeCells:new c({tag:\"mergeCells\",count:!0,childXform:new p}),rowBreaks:new T,hyperlinks:new c({tag:\"hyperlinks\",count:!1,childXform:new d}),pageMargins:new w,dataValidations:new m,pageSetup:new _,headerFooter:new E,printOptions:new x,picture:new S,drawing:new M,sheetProtection:new v,tableParts:new c({tag:\"tableParts\",count:!0,childXform:new C}),conditionalFormatting:new A,extLst:new R}}prepare(e,t){t.merges=new a,e.hyperlinks=t.hyperlinks=[],e.comments=t.comments=[],t.formulae={},t.siFormulae=0,this.map.cols.prepare(e.cols,t),this.map.sheetData.prepare(e.rows,t),this.map.conditionalFormatting.prepare(e.conditionalFormattings,t),e.mergeCells=t.merges.mergeCells;const r=e.rels=[];function n(e){return\"rId\"+(e.length+1)}if(e.hyperlinks.forEach(e=>{const t=n(r);e.rId=t,r.push({Id:t,Type:o.Hyperlink,Target:e.target,TargetMode:\"External\"})}),e.comments.length>0){const s={Id:n(r),Type:o.Comments,Target:`../comments${e.id}.xml`};r.push(s);const a={Id:n(r),Type:o.VmlDrawing,Target:`../drawings/vmlDrawing${e.id}.vml`};r.push(a),e.comments.forEach(e=>{e.refAddress=i.decodeAddress(e.ref)}),t.commentRefs.push({commentName:\"comments\"+e.id,vmlDrawing:\"vmlDrawing\"+e.id})}const s=[];let l;e.media.forEach(i=>{if(\"background\"===i.type){const s=n(r);l=t.media[i.imageId],r.push({Id:s,Type:o.Image,Target:`../media/${l.name}.${l.extension}`}),e.background={rId:s},e.image=t.media[i.imageId]}else if(\"image\"===i.type){let{drawing:a}=e;l=t.media[i.imageId],a||(a=e.drawing={rId:n(r),name:\"drawing\"+ ++t.drawingsCount,anchors:[],rels:[]},t.drawings.push(a),r.push({Id:a.rId,Type:\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\",Target:`../drawings/${a.name}.xml`}));let c=this.preImageId===i.imageId?s[i.imageId]:s[a.rels.length];c||(c=n(a.rels),s[a.rels.length]=c,a.rels.push({Id:c,Type:\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",Target:`../media/${l.name}.${l.extension}`}));const u={picture:{rId:c},range:i.range};if(i.hyperlinks&&i.hyperlinks.hyperlink){const e=n(a.rels);s[a.rels.length]=e,u.picture.hyperlinks={tooltip:i.hyperlinks.tooltip,rId:e},a.rels.push({Id:e,Type:o.Hyperlink,Target:i.hyperlinks.hyperlink,TargetMode:\"External\"})}this.preImageId=i.imageId,a.anchors.push(u)}}),e.tables.forEach(e=>{const i=n(r);e.rId=i,r.push({Id:i,Type:o.Table,Target:\"../tables/\"+e.target}),e.columns.forEach(e=>{const{style:r}=e;r&&(e.dxfId=t.styles.addDxfStyle(r))})}),this.map.extLst.prepare(e,t)}render(e,t){e.openXml(s.StdDocAttributes),e.openNode(\"worksheet\",j.WORKSHEET_ATTRIBUTES);const r=t.properties?{defaultRowHeight:t.properties.defaultRowHeight,dyDescent:t.properties.dyDescent,outlineLevelCol:t.properties.outlineLevelCol,outlineLevelRow:t.properties.outlineLevelRow}:void 0;t.properties&&t.properties.defaultColWidth&&(r.defaultColWidth=t.properties.defaultColWidth);const n={outlineProperties:t.properties&&t.properties.outlineProperties,tabColor:t.properties&&t.properties.tabColor,pageSetup:t.pageSetup&&t.pageSetup.fitToPage?{fitToPage:t.pageSetup.fitToPage}:void 0},i=t.pageSetup&&t.pageSetup.margins,a={showRowColHeaders:t.pageSetup&&t.pageSetup.showRowColHeaders,showGridLines:t.pageSetup&&t.pageSetup.showGridLines,horizontalCentered:t.pageSetup&&t.pageSetup.horizontalCentered,verticalCentered:t.pageSetup&&t.pageSetup.verticalCentered},l=t.sheetProtection;this.map.sheetPr.render(e,n),this.map.dimension.render(e,t.dimensions),this.map.sheetViews.render(e,t.views),this.map.sheetFormatPr.render(e,r),this.map.cols.render(e,t.cols),this.map.sheetData.render(e,t.rows),this.map.sheetProtection.render(e,l),this.map.autoFilter.render(e,t.autoFilter),this.map.mergeCells.render(e,t.mergeCells),this.map.conditionalFormatting.render(e,t.conditionalFormattings),this.map.dataValidations.render(e,t.dataValidations),this.map.hyperlinks.render(e,t.hyperlinks),this.map.printOptions.render(e,a),this.map.pageMargins.render(e,i),this.map.pageSetup.render(e,t.pageSetup),this.map.headerFooter.render(e,t.headerFooter),this.map.rowBreaks.render(e,t.rowBreaks),this.map.drawing.render(e,t.drawing),this.map.picture.render(e,t.background),this.map.tableParts.render(e,t.tables),this.map.extLst.render(e,t),t.rels&&t.rels.forEach(t=>{t.Type===o.VmlDrawing&&e.leafNode(\"legacyDrawing\",{\"r:id\":t.Id})}),e.closeNode()}parseOpen(e){return this.parser?(this.parser.parseOpen(e),!0):\"worksheet\"===e.name?(n.each(this.map,e=>{e.reset()}),!0):(this.map[e.name]&&!this.ignoreNodes.includes(e.name)&&(this.parser=this.map[e.name],this.parser.parseOpen(e)),!0)}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){if(this.parser)return this.parser.parseClose(e)||(this.parser=void 0),!0;switch(e){case\"worksheet\":{const e=this.map.sheetFormatPr.model||{};this.map.sheetPr.model&&this.map.sheetPr.model.tabColor&&(e.tabColor=this.map.sheetPr.model.tabColor),this.map.sheetPr.model&&this.map.sheetPr.model.outlineProperties&&(e.outlineProperties=this.map.sheetPr.model.outlineProperties);const t={fitToPage:this.map.sheetPr.model&&this.map.sheetPr.model.pageSetup&&this.map.sheetPr.model.pageSetup.fitToPage||!1,margins:this.map.pageMargins.model},r=Object.assign(t,this.map.pageSetup.model,this.map.printOptions.model),n=O(this.map.conditionalFormatting.model,this.map.extLst.model&&this.map.extLst.model[\"x14:conditionalFormattings\"]);return this.model={dimensions:this.map.dimension.model,cols:this.map.cols.model,rows:this.map.sheetData.model,mergeCells:this.map.mergeCells.model,hyperlinks:this.map.hyperlinks.model,dataValidations:this.map.dataValidations.model,properties:e,views:this.map.sheetViews.model,pageSetup:r,headerFooter:this.map.headerFooter.model,background:this.map.picture.model,drawing:this.map.drawing.model,tables:this.map.tableParts.model,conditionalFormattings:n},this.map.autoFilter.model&&(this.model.autoFilter=this.map.autoFilter.model),this.map.sheetProtection.model&&(this.model.sheetProtection=this.map.sheetProtection.model),!1}default:return!0}}reconcile(e,t){const r=(e.relationships||[]).reduce((r,n)=>{if(r[n.Id]=n,n.Type===o.Comments&&(e.comments=t.comments[n.Target].comments),n.Type===o.VmlDrawing&&e.comments&&e.comments.length){const r=t.vmlDrawings[n.Target].comments;e.comments.forEach((e,t)=>{e.note=Object.assign({},e.note,r[t])})}return r},{});if(t.commentsMap=(e.comments||[]).reduce((e,t)=>(t.ref&&(e[t.ref]=t),e),{}),t.hyperlinkMap=(e.hyperlinks||[]).reduce((e,t)=>(t.rId&&(e[t.address]=r[t.rId].Target),e),{}),t.formulae={},e.rows=e.rows&&e.rows.filter(Boolean)||[],e.rows.forEach(e=>{e.cells=e.cells&&e.cells.filter(Boolean)||[]}),this.map.cols.reconcile(e.cols,t),this.map.sheetData.reconcile(e.rows,t),this.map.conditionalFormatting.reconcile(e.conditionalFormattings,t),e.media=[],e.drawing){const n=r[e.drawing.rId].Target.match(/\\/drawings\\/([a-zA-Z0-9]+)[.][a-zA-Z]{3,4}$/);if(n){const r=n[1];t.drawings[r].anchors.forEach(t=>{if(t.medium){const r={type:\"image\",imageId:t.medium.index,range:t.range,hyperlinks:t.picture.hyperlinks};e.media.push(r)}})}}const n=e.background&&r[e.background.rId];if(n){const r=n.Target.split(\"/media/\")[1],i=t.mediaIndex&&t.mediaIndex[r];void 0!==i&&e.media.push({type:\"background\",imageId:i})}e.tables=(e.tables||[]).map(e=>{const n=r[e.rId];return t.tables[n.Target]}),delete e.relationships,delete e.hyperlinks,delete e.comments}}j.WORKSHEET_ATTRIBUTES={xmlns:\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\"xmlns:r\":\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\"xmlns:mc\":\"http://schemas.openxmlformats.org/markup-compatibility/2006\",\"mc:Ignorable\":\"x14ac\",\"xmlns:x14ac\":\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac\"},t.exports=j},{\"../../../utils/col-cache\":19,\"../../../utils/under-dash\":26,\"../../../utils/xml-stream\":28,\"../../rel-type\":31,\"../base-xform\":32,\"../list-xform\":71,\"./auto-filter-xform\":72,\"./cf/conditional-formattings-xform\":87,\"./col-xform\":92,\"./data-validations-xform\":93,\"./dimension-xform\":94,\"./drawing-xform\":95,\"./ext-lst-xform\":96,\"./header-footer-xform\":97,\"./hyperlink-xform\":98,\"./merge-cell-xform\":99,\"./merges\":100,\"./page-margins-xform\":103,\"./page-setup-xform\":105,\"./picture-xform\":106,\"./print-options-xform\":107,\"./row-breaks-xform\":108,\"./row-xform\":109,\"./sheet-format-properties-xform\":110,\"./sheet-properties-xform\":111,\"./sheet-protection-xform\":112,\"./sheet-view-xform\":113,\"./table-part-xform\":114}],116:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{constructor(e){super(),this.tag=e.tag,this.attr=e.attr}render(e,t){t&&(e.openNode(this.tag),e.closeNode())}parseOpen(e){e.name===this.tag&&(this.model=!0)}parseText(){}parseClose(){return!1}}},{\"../base-xform\":32}],117:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{constructor(e){super(),this.tag=e.tag,this.attr=e.attr,this.attrs=e.attrs,this._format=e.format||function(e){try{return Number.isNaN(e.getTime())?\"\":e.toISOString()}catch(e){return\"\"}},this._parse=e.parse||function(e){return new Date(e)}}render(e,t){t&&(e.openNode(this.tag),this.attrs&&e.addAttributes(this.attrs),this.attr?e.addAttribute(this.attr,this._format(t)):e.writeText(this._format(t)),e.closeNode())}parseOpen(e){e.name===this.tag&&(this.attr?this.model=this._parse(e.attributes[this.attr]):this.text=[])}parseText(e){this.attr||this.text.push(e)}parseClose(){return this.attr||(this.model=this._parse(this.text.join(\"\"))),!1}}},{\"../base-xform\":32}],118:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{constructor(e){super(),this.tag=e.tag,this.attr=e.attr,this.attrs=e.attrs,this.zero=e.zero}render(e,t){(t||this.zero)&&(e.openNode(this.tag),this.attrs&&e.addAttributes(this.attrs),this.attr?e.addAttribute(this.attr,t):e.writeText(t),e.closeNode())}parseOpen(e){return e.name===this.tag&&(this.attr?this.model=parseInt(e.attributes[this.attr],10):this.text=[],!0)}parseText(e){this.attr||this.text.push(e)}parseClose(){return this.attr||(this.model=parseInt(this.text.join(\"\")||0,10)),!1}}},{\"../base-xform\":32}],119:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{constructor(e){super(),this.tag=e.tag,this.attr=e.attr,this.attrs=e.attrs}render(e,t){void 0!==t&&(e.openNode(this.tag),this.attrs&&e.addAttributes(this.attrs),this.attr?e.addAttribute(this.attr,t):e.writeText(t),e.closeNode())}parseOpen(e){e.name===this.tag&&(this.attr?this.model=e.attributes[this.attr]:this.text=[])}parseText(e){this.attr||this.text.push(e)}parseClose(){return this.attr||(this.model=this.text.join(\"\")),!1}}},{\"../base-xform\":32}],120:[function(e,t,r){\"use strict\";const n=e(\"./base-xform\"),i=e(\"../../utils/xml-stream\");t.exports=class extends n{constructor(e){super(),this._model=e}render(e){if(!this._xml){const e=new i;!function e(t,r){t.openNode(r.tag,r.$),r.c&&r.c.forEach(r=>{e(t,r)}),r.t&&t.writeText(r.t),t.closeNode()}(e,this._model),this._xml=e.xml}e.writeXml(this._xml)}parseOpen(){return!0}parseText(){}parseClose(e){switch(e){case this._model.tag:return!1;default:return!0}}}},{\"../../utils/xml-stream\":28,\"./base-xform\":32}],121:[function(e,t,r){\"use strict\";const n=e(\"./text-xform\"),i=e(\"./rich-text-xform\"),s=e(\"../base-xform\");t.exports=class extends s{constructor(){super(),this.map={r:new i,t:new n}}get tag(){return\"rPh\"}render(e,t){if(e.openNode(this.tag,{sb:t.sb||0,eb:t.eb||0}),t&&t.hasOwnProperty(\"richText\")&&t.richText){const{r:r}=this.map;t.richText.forEach(t=>{r.render(e,t)})}else t&&this.map.t.render(e,t.text);e.closeNode()}parseOpen(e){const{name:t}=e;return this.parser?(this.parser.parseOpen(e),!0):t===this.tag?(this.model={sb:parseInt(e.attributes.sb,10),eb:parseInt(e.attributes.eb,10)},!0):(this.parser=this.map[t],!!this.parser&&(this.parser.parseOpen(e),!0))}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){if(this.parser){if(!this.parser.parseClose(e)){switch(e){case\"r\":{let e=this.model.richText;e||(e=this.model.richText=[]),e.push(this.parser.model);break}case\"t\":this.model.text=this.parser.model}this.parser=void 0}return!0}switch(e){case this.tag:return!1;default:return!0}}}},{\"../base-xform\":32,\"./rich-text-xform\":122,\"./text-xform\":125}],122:[function(e,t,r){\"use strict\";const n=e(\"./text-xform\"),i=e(\"../style/font-xform\"),s=e(\"../base-xform\");class o extends s{constructor(e){super(),this.model=e}get tag(){return\"r\"}get textXform(){return this._textXform||(this._textXform=new n)}get fontXform(){return this._fontXform||(this._fontXform=new i(o.FONT_OPTIONS))}render(e,t){t=t||this.model,e.openNode(\"r\"),t.font&&this.fontXform.render(e,t.font),this.textXform.render(e,t.text),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case\"r\":return this.model={},!0;case\"t\":return this.parser=this.textXform,this.parser.parseOpen(e),!0;case\"rPr\":return this.parser=this.fontXform,this.parser.parseOpen(e),!0;default:return!1}}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){switch(e){case\"r\":return!1;case\"t\":return this.model.text=this.parser.model,this.parser=void 0,!0;case\"rPr\":return this.model.font=this.parser.model,this.parser=void 0,!0;default:return this.parser&&this.parser.parseClose(e),!0}}}o.FONT_OPTIONS={tagName:\"rPr\",fontNameTag:\"rFont\"},t.exports=o},{\"../base-xform\":32,\"../style/font-xform\":131,\"./text-xform\":125}],123:[function(e,t,r){\"use strict\";const n=e(\"./text-xform\"),i=e(\"./rich-text-xform\"),s=e(\"./phonetic-text-xform\"),o=e(\"../base-xform\");t.exports=class extends o{constructor(e){super(),this.model=e,this.map={r:new i,t:new n,rPh:new s}}get tag(){return\"si\"}render(e,t){e.openNode(this.tag),t&&t.hasOwnProperty(\"richText\")&&t.richText?t.richText.length?t.richText.forEach(t=>{this.map.r.render(e,t)}):this.map.t.render(e,\"\"):null!=t&&this.map.t.render(e,t),e.closeNode()}parseOpen(e){const{name:t}=e;return this.parser?(this.parser.parseOpen(e),!0):t===this.tag?(this.model={},!0):(this.parser=this.map[t],!!this.parser&&(this.parser.parseOpen(e),!0))}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){if(this.parser){if(!this.parser.parseClose(e)){switch(e){case\"r\":{let e=this.model.richText;e||(e=this.model.richText=[]),e.push(this.parser.model);break}case\"t\":this.model=this.parser.model}this.parser=void 0}return!0}switch(e){case this.tag:return!1;default:return!0}}}},{\"../base-xform\":32,\"./phonetic-text-xform\":121,\"./rich-text-xform\":122,\"./text-xform\":125}],124:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/xml-stream\"),i=e(\"../base-xform\"),s=e(\"./shared-string-xform\");t.exports=class extends i{constructor(e){super(),this.model=e||{values:[],count:0},this.hash=Object.create(null),this.rich=Object.create(null)}get sharedStringXform(){return this._sharedStringXform||(this._sharedStringXform=new s)}get values(){return this.model.values}get uniqueCount(){return this.model.values.length}get count(){return this.model.count}getString(e){return this.model.values[e]}add(e){return e.richText?this.addRichText(e):this.addText(e)}addText(e){let t=this.hash[e];return void 0===t&&(t=this.hash[e]=this.model.values.length,this.model.values.push(e)),this.model.count++,t}addRichText(e){const t=this.sharedStringXform.toXml(e);let r=this.rich[t];return void 0===r&&(r=this.rich[t]=this.model.values.length,this.model.values.push(e)),this.model.count++,r}render(e,t){t=t||this._values,e.openXml(n.StdDocAttributes),e.openNode(\"sst\",{xmlns:\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",count:t.count,uniqueCount:t.values.length});const r=this.sharedStringXform;t.values.forEach(t=>{r.render(e,t)}),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case\"sst\":return!0;case\"si\":return this.parser=this.sharedStringXform,this.parser.parseOpen(e),!0;default:throw new Error(\"Unexpected xml node in parseOpen: \"+JSON.stringify(e))}}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){if(this.parser)return this.parser.parseClose(e)||(this.model.values.push(this.parser.model),this.model.count++,this.parser=void 0),!0;switch(e){case\"sst\":return!1;default:throw new Error(\"Unexpected xml node in parseClose: \"+e)}}}},{\"../../../utils/xml-stream\":28,\"../base-xform\":32,\"./shared-string-xform\":123}],125:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{get tag(){return\"t\"}render(e,t){e.openNode(\"t\"),/^\\s|\\n|\\s$/.test(t)&&e.addAttribute(\"xml:space\",\"preserve\"),e.writeText(t),e.closeNode()}get model(){return this._text.join(\"\").replace(/_x([0-9A-F]{4})_/g,(e,t)=>String.fromCharCode(parseInt(t,16)))}parseOpen(e){switch(e.name){case\"t\":return this._text=[],!0;default:return!1}}parseText(e){this._text.push(e)}parseClose(){return!1}}},{\"../base-xform\":32}],126:[function(e,t,r){\"use strict\";const n=e(\"../../../doc/enums\"),i=e(\"../../../utils/utils\"),s=e(\"../base-xform\"),o={horizontalValues:[\"left\",\"center\",\"right\",\"fill\",\"centerContinuous\",\"distributed\",\"justify\"].reduce((e,t)=>(e[t]=!0,e),{}),horizontal(e){return this.horizontalValues[e]?e:void 0},verticalValues:[\"top\",\"middle\",\"bottom\",\"distributed\",\"justify\"].reduce((e,t)=>(e[t]=!0,e),{}),vertical(e){return\"middle\"===e?\"center\":this.verticalValues[e]?e:void 0},wrapText:e=>!!e||void 0,shrinkToFit:e=>!!e||void 0,textRotation(e){switch(e){case\"vertical\":return e;default:return(e=i.validInt(e))>=-90&&e<=90?e:void 0}},indent:e=>(e=i.validInt(e),Math.max(0,e)),readingOrder(e){switch(e){case\"ltr\":return n.ReadingOrder.LeftToRight;case\"rtl\":return n.ReadingOrder.RightToLeft;default:return}}},a={toXml(e){if(e=o.textRotation(e)){if(\"vertical\"===e)return 255;const t=Math.round(e);if(t>=0&&t<=90)return t;if(t<0&&t>=-90)return 90-t}},toModel(e){const t=i.validInt(e);if(void 0!==t){if(255===t)return\"vertical\";if(t>=0&&t<=90)return t;if(t>90&&t<=180)return 90-t}}};t.exports=class extends s{get tag(){return\"alignment\"}render(e,t){e.addRollback(),e.openNode(\"alignment\");let r=!1;function n(t,n){n&&(e.addAttribute(t,n),r=!0)}n(\"horizontal\",o.horizontal(t.horizontal)),n(\"vertical\",o.vertical(t.vertical)),n(\"wrapText\",!!o.wrapText(t.wrapText)&&\"1\"),n(\"shrinkToFit\",!!o.shrinkToFit(t.shrinkToFit)&&\"1\"),n(\"indent\",o.indent(t.indent)),n(\"textRotation\",a.toXml(t.textRotation)),n(\"readingOrder\",o.readingOrder(t.readingOrder)),e.closeNode(),r?e.commit():e.rollback()}parseOpen(e){const t={};let r=!1;function n(e,n,i){e&&(t[n]=i,r=!0)}n(e.attributes.horizontal,\"horizontal\",e.attributes.horizontal),n(e.attributes.vertical,\"vertical\",\"center\"===e.attributes.vertical?\"middle\":e.attributes.vertical),n(e.attributes.wrapText,\"wrapText\",i.parseBoolean(e.attributes.wrapText)),n(e.attributes.shrinkToFit,\"shrinkToFit\",i.parseBoolean(e.attributes.shrinkToFit)),n(e.attributes.indent,\"indent\",parseInt(e.attributes.indent,10)),n(e.attributes.textRotation,\"textRotation\",a.toModel(e.attributes.textRotation)),n(e.attributes.readingOrder,\"readingOrder\",\"2\"===e.attributes.readingOrder?\"rtl\":\"ltr\"),this.model=r?t:null}parseText(){}parseClose(){return!1}}},{\"../../../doc/enums\":7,\"../../../utils/utils\":27,\"../base-xform\":32}],127:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\"),i=e(\"../../../utils/utils\"),s=e(\"./color-xform\");class o extends n{constructor(e){super(),this.name=e,this.map={color:new s}}get tag(){return this.name}render(e,t,r){const n=t&&t.color||r||this.defaultColor;e.openNode(this.name),t&&t.style&&(e.addAttribute(\"style\",t.style),n&&this.map.color.render(e,n)),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case this.name:{const{style:t}=e.attributes;return this.model=t?{style:t}:void 0,!0}case\"color\":return this.parser=this.map.color,this.parser.parseOpen(e),!0;default:return!1}}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){return this.parser?(this.parser.parseClose(e)||(this.parser=void 0),!0):(e===this.name&&this.map.color.model&&(this.model||(this.model={}),this.model.color=this.map.color.model),!1)}validStyle(e){return o.validStyleValues[e]}}o.validStyleValues=[\"thin\",\"dashed\",\"dotted\",\"dashDot\",\"hair\",\"dashDotDot\",\"slantDashDot\",\"mediumDashed\",\"mediumDashDotDot\",\"mediumDashDot\",\"medium\",\"double\",\"thick\"].reduce((e,t)=>(e[t]=!0,e),{});t.exports=class extends n{constructor(){super(),this.map={top:new o(\"top\"),left:new o(\"left\"),bottom:new o(\"bottom\"),right:new o(\"right\"),diagonal:new o(\"diagonal\")}}render(e,t){const{color:r}=t;function n(n,i){n&&!n.color&&t.color&&(n={...n,color:t.color}),i.render(e,n,r)}e.openNode(\"border\"),t.diagonal&&t.diagonal.style&&(t.diagonal.up&&e.addAttribute(\"diagonalUp\",\"1\"),t.diagonal.down&&e.addAttribute(\"diagonalDown\",\"1\")),n(t.left,this.map.left),n(t.right,this.map.right),n(t.top,this.map.top),n(t.bottom,this.map.bottom),n(t.diagonal,this.map.diagonal),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case\"border\":return this.reset(),this.diagonalUp=i.parseBoolean(e.attributes.diagonalUp),this.diagonalDown=i.parseBoolean(e.attributes.diagonalDown),!0;default:return this.parser=this.map[e.name],!!this.parser&&(this.parser.parseOpen(e),!0)}}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){if(this.parser)return this.parser.parseClose(e)||(this.parser=void 0),!0;if(\"border\"===e){const e=this.model={},t=function(t,r,n){r&&(n&&Object.assign(r,n),e[t]=r)};t(\"left\",this.map.left.model),t(\"right\",this.map.right.model),t(\"top\",this.map.top.model),t(\"bottom\",this.map.bottom.model),t(\"diagonal\",this.map.diagonal.model,{up:this.diagonalUp,down:this.diagonalDown})}return!1}}},{\"../../../utils/utils\":27,\"../base-xform\":32,\"./color-xform\":128}],128:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{constructor(e){super(),this.name=e||\"color\"}get tag(){return this.name}render(e,t){return!!t&&(e.openNode(this.name),t.argb?e.addAttribute(\"rgb\",t.argb):void 0!==t.theme?(e.addAttribute(\"theme\",t.theme),void 0!==t.tint&&e.addAttribute(\"tint\",t.tint)):void 0!==t.indexed?e.addAttribute(\"indexed\",t.indexed):e.addAttribute(\"auto\",\"1\"),e.closeNode(),!0)}parseOpen(e){return e.name===this.name&&(e.attributes.rgb?this.model={argb:e.attributes.rgb}:e.attributes.theme?(this.model={theme:parseInt(e.attributes.theme,10)},e.attributes.tint&&(this.model.tint=parseFloat(e.attributes.tint))):e.attributes.indexed?this.model={indexed:parseInt(e.attributes.indexed,10)}:this.model=void 0,!0)}parseText(){}parseClose(){return!1}}},{\"../base-xform\":32}],129:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\"),i=e(\"./alignment-xform\"),s=e(\"./border-xform\"),o=e(\"./fill-xform\"),a=e(\"./font-xform\"),l=e(\"./numfmt-xform\"),c=e(\"./protection-xform\");t.exports=class extends n{constructor(){super(),this.map={alignment:new i,border:new s,fill:new o,font:new a,numFmt:new l,protection:new c}}get tag(){return\"dxf\"}render(e,t){if(e.openNode(this.tag),t.font&&this.map.font.render(e,t.font),t.numFmt&&t.numFmtId){const r={id:t.numFmtId,formatCode:t.numFmt};this.map.numFmt.render(e,r)}t.fill&&this.map.fill.render(e,t.fill),t.alignment&&this.map.alignment.render(e,t.alignment),t.border&&this.map.border.render(e,t.border),t.protection&&this.map.protection.render(e,t.protection),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case this.tag:return this.reset(),!0;default:return this.parser=this.map[e.name],this.parser&&this.parser.parseOpen(e),!0}}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){return this.parser?(this.parser.parseClose(e)||(this.parser=void 0),!0):e!==this.tag||(this.model={alignment:this.map.alignment.model,border:this.map.border.model,fill:this.map.fill.model,font:this.map.font.model,numFmt:this.map.numFmt.model,protection:this.map.protection.model},!1)}}},{\"../base-xform\":32,\"./alignment-xform\":126,\"./border-xform\":127,\"./fill-xform\":130,\"./font-xform\":131,\"./numfmt-xform\":132,\"./protection-xform\":133}],130:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\"),i=e(\"./color-xform\");class s extends n{constructor(){super(),this.map={color:new i}}get tag(){return\"stop\"}render(e,t){e.openNode(\"stop\"),e.addAttribute(\"position\",t.position),this.map.color.render(e,t.color),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case\"stop\":return this.model={position:parseFloat(e.attributes.position)},!0;case\"color\":return this.parser=this.map.color,this.parser.parseOpen(e),!0;default:return!1}}parseText(){}parseClose(e){return!!this.parser&&(this.parser.parseClose(e)||(this.model.color=this.parser.model,this.parser=void 0),!0)}}class o extends n{constructor(){super(),this.map={fgColor:new i(\"fgColor\"),bgColor:new i(\"bgColor\")}}get name(){return\"pattern\"}get tag(){return\"patternFill\"}render(e,t){e.openNode(\"patternFill\"),e.addAttribute(\"patternType\",t.pattern),t.fgColor&&this.map.fgColor.render(e,t.fgColor),t.bgColor&&this.map.bgColor.render(e,t.bgColor),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case\"patternFill\":return this.model={type:\"pattern\",pattern:e.attributes.patternType},!0;default:return this.parser=this.map[e.name],!!this.parser&&(this.parser.parseOpen(e),!0)}}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){return!!this.parser&&(this.parser.parseClose(e)||(this.parser.model&&(this.model[e]=this.parser.model),this.parser=void 0),!0)}}class a extends n{constructor(){super(),this.map={stop:new s}}get name(){return\"gradient\"}get tag(){return\"gradientFill\"}render(e,t){switch(e.openNode(\"gradientFill\"),t.gradient){case\"angle\":e.addAttribute(\"degree\",t.degree);break;case\"path\":e.addAttribute(\"type\",\"path\"),t.center.left&&(e.addAttribute(\"left\",t.center.left),void 0===t.center.right&&e.addAttribute(\"right\",t.center.left)),t.center.right&&e.addAttribute(\"right\",t.center.right),t.center.top&&(e.addAttribute(\"top\",t.center.top),void 0===t.center.bottom&&e.addAttribute(\"bottom\",t.center.top)),t.center.bottom&&e.addAttribute(\"bottom\",t.center.bottom)}const r=this.map.stop;t.stops.forEach(t=>{r.render(e,t)}),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case\"gradientFill\":{const t=this.model={stops:[]};return e.attributes.degree?(t.gradient=\"angle\",t.degree=parseInt(e.attributes.degree,10)):\"path\"===e.attributes.type&&(t.gradient=\"path\",t.center={left:e.attributes.left?parseFloat(e.attributes.left):0,top:e.attributes.top?parseFloat(e.attributes.top):0},e.attributes.right!==e.attributes.left&&(t.center.right=e.attributes.right?parseFloat(e.attributes.right):0),e.attributes.bottom!==e.attributes.top&&(t.center.bottom=e.attributes.bottom?parseFloat(e.attributes.bottom):0)),!0}case\"stop\":return this.parser=this.map.stop,this.parser.parseOpen(e),!0;default:return!1}}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){return!!this.parser&&(this.parser.parseClose(e)||(this.model.stops.push(this.parser.model),this.parser=void 0),!0)}}class l extends n{constructor(){super(),this.map={patternFill:new o,gradientFill:new a}}get tag(){return\"fill\"}render(e,t){switch(e.addRollback(),e.openNode(\"fill\"),t.type){case\"pattern\":this.map.patternFill.render(e,t);break;case\"gradient\":this.map.gradientFill.render(e,t);break;default:return void e.rollback()}e.closeNode(),e.commit()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case\"fill\":return this.model={},!0;default:return this.parser=this.map[e.name],!!this.parser&&(this.parser.parseOpen(e),!0)}}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){return!!this.parser&&(this.parser.parseClose(e)||(this.model=this.parser.model,this.model.type=this.parser.name,this.parser=void 0),!0)}validStyle(e){return l.validPatternValues[e]}}l.validPatternValues=[\"none\",\"solid\",\"darkVertical\",\"darkGray\",\"mediumGray\",\"lightGray\",\"gray125\",\"gray0625\",\"darkHorizontal\",\"darkVertical\",\"darkDown\",\"darkUp\",\"darkGrid\",\"darkTrellis\",\"lightHorizontal\",\"lightVertical\",\"lightDown\",\"lightUp\",\"lightGrid\",\"lightTrellis\",\"lightGrid\"].reduce((e,t)=>(e[t]=!0,e),{}),l.StopXform=s,l.PatternFillXform=o,l.GradientFillXform=a,t.exports=l},{\"../base-xform\":32,\"./color-xform\":128}],131:[function(e,t,r){\"use strict\";const n=e(\"./color-xform\"),i=e(\"../simple/boolean-xform\"),s=e(\"../simple/integer-xform\"),o=e(\"../simple/string-xform\"),a=e(\"./underline-xform\"),l=e(\"../../../utils/under-dash\"),c=e(\"../base-xform\");class u extends c{constructor(e){super(),this.options=e||u.OPTIONS,this.map={b:{prop:\"bold\",xform:new i({tag:\"b\",attr:\"val\"})},i:{prop:\"italic\",xform:new i({tag:\"i\",attr:\"val\"})},u:{prop:\"underline\",xform:new a},charset:{prop:\"charset\",xform:new s({tag:\"charset\",attr:\"val\"})},color:{prop:\"color\",xform:new n},condense:{prop:\"condense\",xform:new i({tag:\"condense\",attr:\"val\"})},extend:{prop:\"extend\",xform:new i({tag:\"extend\",attr:\"val\"})},family:{prop:\"family\",xform:new s({tag:\"family\",attr:\"val\"})},outline:{prop:\"outline\",xform:new i({tag:\"outline\",attr:\"val\"})},vertAlign:{prop:\"vertAlign\",xform:new o({tag:\"vertAlign\",attr:\"val\"})},scheme:{prop:\"scheme\",xform:new o({tag:\"scheme\",attr:\"val\"})},shadow:{prop:\"shadow\",xform:new i({tag:\"shadow\",attr:\"val\"})},strike:{prop:\"strike\",xform:new i({tag:\"strike\",attr:\"val\"})},sz:{prop:\"size\",xform:new s({tag:\"sz\",attr:\"val\"})}},this.map[this.options.fontNameTag]={prop:\"name\",xform:new o({tag:this.options.fontNameTag,attr:\"val\"})}}get tag(){return this.options.tagName}render(e,t){const{map:r}=this;e.openNode(this.options.tagName),l.each(this.map,(n,i)=>{r[i].xform.render(e,t[n.prop])}),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;if(this.map[e.name])return this.parser=this.map[e.name].xform,this.parser.parseOpen(e);switch(e.name){case this.options.tagName:return this.model={},!0;default:return!1}}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){if(this.parser&&!this.parser.parseClose(e)){const t=this.map[e];return this.parser.model&&(this.model[t.prop]=this.parser.model),this.parser=void 0,!0}switch(e){case this.options.tagName:return!1;default:return!0}}}u.OPTIONS={tagName:\"font\",fontNameTag:\"name\"},t.exports=u},{\"../../../utils/under-dash\":26,\"../base-xform\":32,\"../simple/boolean-xform\":116,\"../simple/integer-xform\":118,\"../simple/string-xform\":119,\"./color-xform\":128,\"./underline-xform\":136}],132:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/under-dash\"),i=e(\"../../defaultnumformats\"),s=e(\"../base-xform\");const o=function(){const e={};return n.each(i,(t,r)=>{t.f&&(e[t.f]=parseInt(r,10))}),e}();class a extends s{constructor(e,t){super(),this.id=e,this.formatCode=t}get tag(){return\"numFmt\"}render(e,t){e.leafNode(\"numFmt\",{numFmtId:t.id,formatCode:t.formatCode})}parseOpen(e){switch(e.name){case\"numFmt\":return this.model={id:parseInt(e.attributes.numFmtId,10),formatCode:e.attributes.formatCode.replace(/[\\\\](.)/g,\"$1\")},!0;default:return!1}}parseText(){}parseClose(){return!1}}a.getDefaultFmtId=function(e){return o[e]},a.getDefaultFmtCode=function(e){return i[e]&&i[e].f},t.exports=a},{\"../../../utils/under-dash\":26,\"../../defaultnumformats\":30,\"../base-xform\":32}],133:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\"),i={boolean:(e,t)=>void 0===e?t:e};t.exports=class extends n{get tag(){return\"protection\"}render(e,t){e.addRollback(),e.openNode(\"protection\");let r=!1;function n(t,n){void 0!==n&&(e.addAttribute(t,n),r=!0)}n(\"locked\",i.boolean(t.locked,!0)?void 0:\"0\"),n(\"hidden\",i.boolean(t.hidden,!1)?\"1\":void 0),e.closeNode(),r?e.commit():e.rollback()}parseOpen(e){const t={locked:!(\"0\"===e.attributes.locked),hidden:\"1\"===e.attributes.hidden},r=!t.locked||t.hidden;this.model=r?t:null}parseText(){}parseClose(){return!1}}},{\"../base-xform\":32}],134:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\"),i=e(\"./alignment-xform\"),s=e(\"./protection-xform\");t.exports=class extends n{constructor(e){super(),this.xfId=!(!e||!e.xfId),this.map={alignment:new i,protection:new s}}get tag(){return\"xf\"}render(e,t){e.openNode(\"xf\",{numFmtId:t.numFmtId||0,fontId:t.fontId||0,fillId:t.fillId||0,borderId:t.borderId||0}),this.xfId&&e.addAttribute(\"xfId\",t.xfId||0),t.numFmtId&&e.addAttribute(\"applyNumberFormat\",\"1\"),t.fontId&&e.addAttribute(\"applyFont\",\"1\"),t.fillId&&e.addAttribute(\"applyFill\",\"1\"),t.borderId&&e.addAttribute(\"applyBorder\",\"1\"),t.alignment&&e.addAttribute(\"applyAlignment\",\"1\"),t.protection&&e.addAttribute(\"applyProtection\",\"1\"),t.alignment&&this.map.alignment.render(e,t.alignment),t.protection&&this.map.protection.render(e,t.protection),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case\"xf\":return this.model={numFmtId:parseInt(e.attributes.numFmtId,10),fontId:parseInt(e.attributes.fontId,10),fillId:parseInt(e.attributes.fillId,10),borderId:parseInt(e.attributes.borderId,10)},this.xfId&&(this.model.xfId=parseInt(e.attributes.xfId,10)),!0;case\"alignment\":return this.parser=this.map.alignment,this.parser.parseOpen(e),!0;case\"protection\":return this.parser=this.map.protection,this.parser.parseOpen(e),!0;default:return!1}}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){return this.parser?(this.parser.parseClose(e)||(this.map.protection===this.parser?this.model.protection=this.parser.model:this.model.alignment=this.parser.model,this.parser=void 0),!0):\"xf\"!==e}}},{\"../base-xform\":32,\"./alignment-xform\":126,\"./protection-xform\":133}],135:[function(e,t,r){\"use strict\";const n=e(\"../../../doc/enums\"),i=e(\"../../../utils/xml-stream\"),s=e(\"../base-xform\"),o=e(\"../static-xform\"),a=e(\"../list-xform\"),l=e(\"./font-xform\"),c=e(\"./fill-xform\"),u=e(\"./border-xform\"),h=e(\"./numfmt-xform\"),f=e(\"./style-xform\"),d=e(\"./dxf-xform\");class p extends s{constructor(e){super(),this.map={numFmts:new a({tag:\"numFmts\",count:!0,childXform:new h}),fonts:new a({tag:\"fonts\",count:!0,childXform:new l,$:{\"x14ac:knownFonts\":1}}),fills:new a({tag:\"fills\",count:!0,childXform:new c}),borders:new a({tag:\"borders\",count:!0,childXform:new u}),cellStyleXfs:new a({tag:\"cellStyleXfs\",count:!0,childXform:new f}),cellXfs:new a({tag:\"cellXfs\",count:!0,childXform:new f({xfId:!0})}),dxfs:new a({tag:\"dxfs\",always:!0,count:!0,childXform:new d}),numFmt:new h,font:new l,fill:new c,border:new u,style:new f({xfId:!0}),cellStyles:p.STATIC_XFORMS.cellStyles,tableStyles:p.STATIC_XFORMS.tableStyles,extLst:p.STATIC_XFORMS.extLst},e&&this.init()}initIndex(){this.index={style:{},numFmt:{},numFmtNextId:164,font:{},border:{},fill:{}}}init(){this.model={styles:[],numFmts:[],fonts:[],borders:[],fills:[],dxfs:[]},this.initIndex(),this._addBorder({}),this._addStyle({numFmtId:0,fontId:0,fillId:0,borderId:0,xfId:0}),this._addFill({type:\"pattern\",pattern:\"none\"}),this._addFill({type:\"pattern\",pattern:\"gray125\"}),this.weakMap=new WeakMap}render(e,t){t=t||this.model,e.openXml(i.StdDocAttributes),e.openNode(\"styleSheet\",p.STYLESHEET_ATTRIBUTES),this.index?(t.numFmts&&t.numFmts.length&&(e.openNode(\"numFmts\",{count:t.numFmts.length}),t.numFmts.forEach(t=>{e.writeXml(t)}),e.closeNode()),t.fonts.length||this._addFont({size:11,color:{theme:1},name:\"Calibri\",family:2,scheme:\"minor\"}),e.openNode(\"fonts\",{count:t.fonts.length,\"x14ac:knownFonts\":1}),t.fonts.forEach(t=>{e.writeXml(t)}),e.closeNode(),e.openNode(\"fills\",{count:t.fills.length}),t.fills.forEach(t=>{e.writeXml(t)}),e.closeNode(),e.openNode(\"borders\",{count:t.borders.length}),t.borders.forEach(t=>{e.writeXml(t)}),e.closeNode(),this.map.cellStyleXfs.render(e,[{numFmtId:0,fontId:0,fillId:0,borderId:0,xfId:0}]),e.openNode(\"cellXfs\",{count:t.styles.length}),t.styles.forEach(t=>{e.writeXml(t)}),e.closeNode()):(this.map.numFmts.render(e,t.numFmts),this.map.fonts.render(e,t.fonts),this.map.fills.render(e,t.fills),this.map.borders.render(e,t.borders),this.map.cellStyleXfs.render(e,[{numFmtId:0,fontId:0,fillId:0,borderId:0,xfId:0}]),this.map.cellXfs.render(e,t.styles)),p.STATIC_XFORMS.cellStyles.render(e),this.map.dxfs.render(e,t.dxfs),p.STATIC_XFORMS.tableStyles.render(e),p.STATIC_XFORMS.extLst.render(e),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case\"styleSheet\":return this.initIndex(),!0;default:return this.parser=this.map[e.name],this.parser&&this.parser.parseOpen(e),!0}}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){if(this.parser)return this.parser.parseClose(e)||(this.parser=void 0),!0;switch(e){case\"styleSheet\":{this.model={};const e=(e,t)=>{t.model&&t.model.length&&(this.model[e]=t.model)};if(e(\"numFmts\",this.map.numFmts),e(\"fonts\",this.map.fonts),e(\"fills\",this.map.fills),e(\"borders\",this.map.borders),e(\"styles\",this.map.cellXfs),e(\"dxfs\",this.map.dxfs),this.index={model:[],numFmt:[]},this.model.numFmts){const e=this.index.numFmt;this.model.numFmts.forEach(t=>{e[t.id]=t.formatCode})}return!1}default:return!0}}addStyleModel(e,t){if(!e)return 0;if(this.model.fonts.length||this._addFont({size:11,color:{theme:1},name:\"Calibri\",family:2,scheme:\"minor\"}),this.weakMap&&this.weakMap.has(e))return this.weakMap.get(e);const r={};if(t=t||n.ValueType.Number,e.numFmt)r.numFmtId=this._addNumFmtStr(e.numFmt);else switch(t){case n.ValueType.Number:r.numFmtId=this._addNumFmtStr(\"General\");break;case n.ValueType.Date:r.numFmtId=this._addNumFmtStr(\"mm-dd-yy\")}e.font&&(r.fontId=this._addFont(e.font)),e.border&&(r.borderId=this._addBorder(e.border)),e.fill&&(r.fillId=this._addFill(e.fill)),e.alignment&&(r.alignment=e.alignment),e.protection&&(r.protection=e.protection);const i=this._addStyle(r);return this.weakMap&&this.weakMap.set(e,i),i}getStyleModel(e){const t=this.model.styles[e];if(!t)return null;let r=this.index.model[e];if(r)return r;if(r=this.index.model[e]={},t.numFmtId){const e=this.index.numFmt[t.numFmtId]||h.getDefaultFmtCode(t.numFmtId);e&&(r.numFmt=e)}function n(e,t,n){if(n||0===n){const i=t[n];i&&(r[e]=i)}}return n(\"font\",this.model.fonts,t.fontId),n(\"border\",this.model.borders,t.borderId),n(\"fill\",this.model.fills,t.fillId),t.alignment&&(r.alignment=t.alignment),t.protection&&(r.protection=t.protection),r}addDxfStyle(e){return e.numFmt&&(e.numFmtId=this._addNumFmtStr(e.numFmt)),this.model.dxfs.push(e),this.model.dxfs.length-1}getDxfStyle(e){return this.model.dxfs[e]}_addStyle(e){const t=this.map.style.toXml(e);let r=this.index.style[t];return void 0===r&&(r=this.index.style[t]=this.model.styles.length,this.model.styles.push(t)),r}_addNumFmtStr(e){let t=h.getDefaultFmtId(e);if(void 0!==t)return t;if(t=this.index.numFmt[e],void 0!==t)return t;t=this.index.numFmt[e]=164+this.model.numFmts.length;const r=this.map.numFmt.toXml({id:t,formatCode:e});return this.model.numFmts.push(r),t}_addFont(e){const t=this.map.font.toXml(e);let r=this.index.font[t];return void 0===r&&(r=this.index.font[t]=this.model.fonts.length,this.model.fonts.push(t)),r}_addBorder(e){const t=this.map.border.toXml(e);let r=this.index.border[t];return void 0===r&&(r=this.index.border[t]=this.model.borders.length,this.model.borders.push(t)),r}_addFill(e){const t=this.map.fill.toXml(e);let r=this.index.fill[t];return void 0===r&&(r=this.index.fill[t]=this.model.fills.length,this.model.fills.push(t)),r}}p.STYLESHEET_ATTRIBUTES={xmlns:\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\"xmlns:mc\":\"http://schemas.openxmlformats.org/markup-compatibility/2006\",\"mc:Ignorable\":\"x14ac x16r2\",\"xmlns:x14ac\":\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac\",\"xmlns:x16r2\":\"http://schemas.microsoft.com/office/spreadsheetml/2015/02/main\"},p.STATIC_XFORMS={cellStyles:new o({tag:\"cellStyles\",$:{count:1},c:[{tag:\"cellStyle\",$:{name:\"Normal\",xfId:0,builtinId:0}}]}),dxfs:new o({tag:\"dxfs\",$:{count:0}}),tableStyles:new o({tag:\"tableStyles\",$:{count:0,defaultTableStyle:\"TableStyleMedium2\",defaultPivotStyle:\"PivotStyleLight16\"}}),extLst:new o({tag:\"extLst\",c:[{tag:\"ext\",$:{uri:\"{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}\",\"xmlns:x14\":\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\"},c:[{tag:\"x14:slicerStyles\",$:{defaultSlicerStyle:\"SlicerStyleLight1\"}}]},{tag:\"ext\",$:{uri:\"{9260A510-F301-46a8-8635-F512D64BE5F5}\",\"xmlns:x15\":\"http://schemas.microsoft.com/office/spreadsheetml/2010/11/main\"},c:[{tag:\"x15:timelineStyles\",$:{defaultTimelineStyle:\"TimeSlicerStyleLight1\"}}]}]})};p.Mock=class extends p{constructor(){super(),this.model={styles:[{numFmtId:0,fontId:0,fillId:0,borderId:0,xfId:0}],numFmts:[],fonts:[{size:11,color:{theme:1},name:\"Calibri\",family:2,scheme:\"minor\"}],borders:[{}],fills:[{type:\"pattern\",pattern:\"none\"},{type:\"pattern\",pattern:\"gray125\"}]}}parseStream(e){return e.autodrain(),Promise.resolve()}addStyleModel(e,t){switch(t){case n.ValueType.Date:return this.dateStyleId;default:return 0}}get dateStyleId(){if(!this._dateStyleId){const e={numFmtId:h.getDefaultFmtId(\"mm-dd-yy\")};this._dateStyleId=this.model.styles.length,this.model.styles.push(e)}return this._dateStyleId}getStyleModel(){return{}}},t.exports=p},{\"../../../doc/enums\":7,\"../../../utils/xml-stream\":28,\"../base-xform\":32,\"../list-xform\":71,\"../static-xform\":120,\"./border-xform\":127,\"./dxf-xform\":129,\"./fill-xform\":130,\"./font-xform\":131,\"./numfmt-xform\":132,\"./style-xform\":134}],136:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");class i extends n{constructor(e){super(),this.model=e}get tag(){return\"u\"}render(e,t){if(!0===(t=t||this.model))e.leafNode(\"u\");else{const r=i.Attributes[t];r&&e.leafNode(\"u\",r)}}parseOpen(e){\"u\"===e.name&&(this.model=e.attributes.val||!0)}parseText(){}parseClose(){return!1}}i.Attributes={single:{},double:{val:\"double\"},singleAccounting:{val:\"singleAccounting\"},doubleAccounting:{val:\"doubleAccounting\"}},t.exports=i},{\"../base-xform\":32}],137:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\"),i=e(\"./filter-column-xform\");t.exports=class extends n{constructor(){super(),this.map={filterColumn:new i}}get tag(){return\"autoFilter\"}prepare(e){e.columns.forEach((e,t)=>{this.map.filterColumn.prepare(e,{index:t})})}render(e,t){return e.openNode(this.tag,{ref:t.autoFilterRef}),t.columns.forEach(t=>{this.map.filterColumn.render(e,t)}),e.closeNode(),!0}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;switch(e.name){case this.tag:return this.model={autoFilterRef:e.attributes.ref,columns:[]},!0;default:if(this.parser=this.map[e.name],this.parser)return this.parseOpen(e),!0;throw new Error(\"Unexpected xml node in parseOpen: \"+JSON.stringify(e))}}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){if(this.parser)return this.parser.parseClose(e)||(this.model.columns.push(this.parser.model),this.parser=void 0),!0;switch(e){case this.tag:return!1;default:throw new Error(\"Unexpected xml node in parseClose: \"+e)}}}},{\"../base-xform\":32,\"./filter-column-xform\":139}],138:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{get tag(){return\"customFilter\"}render(e,t){e.leafNode(this.tag,{val:t.val,operator:t.operator})}parseOpen(e){return e.name===this.tag&&(this.model={val:e.attributes.val,operator:e.attributes.operator},!0)}parseText(){}parseClose(){return!1}}},{\"../base-xform\":32}],139:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\"),i=e(\"../list-xform\"),s=e(\"./custom-filter-xform\"),o=e(\"./filter-xform\");t.exports=class extends n{constructor(){super(),this.map={customFilters:new i({tag:\"customFilters\",count:!1,empty:!0,childXform:new s}),filters:new i({tag:\"filters\",count:!1,empty:!0,childXform:new o})}}get tag(){return\"filterColumn\"}prepare(e,t){e.colId=t.index.toString()}render(e,t){return t.customFilters?(e.openNode(this.tag,{colId:t.colId,hiddenButton:t.filterButton?\"0\":\"1\"}),this.map.customFilters.render(e,t.customFilters),e.closeNode(),!0):(e.leafNode(this.tag,{colId:t.colId,hiddenButton:t.filterButton?\"0\":\"1\"}),!0)}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;const{attributes:t}=e;switch(e.name){case this.tag:return this.model={filterButton:\"0\"===t.hiddenButton},!0;default:if(this.parser=this.map[e.name],this.parser)return this.parseOpen(e),!0;throw new Error(\"Unexpected xml node in parseOpen: \"+JSON.stringify(e))}}parseText(){}parseClose(e){if(this.parser)return this.parser.parseClose(e)||(this.parser=void 0),!0;switch(e){case this.tag:return this.model.customFilters=this.map.customFilters.model,!1;default:return!0}}}},{\"../base-xform\":32,\"../list-xform\":71,\"./custom-filter-xform\":138,\"./filter-xform\":140}],140:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{get tag(){return\"filter\"}render(e,t){e.leafNode(this.tag,{val:t.val})}parseOpen(e){return e.name===this.tag&&(this.model={val:e.attributes.val},!0)}parseText(){}parseClose(){return!1}}},{\"../base-xform\":32}],141:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{get tag(){return\"tableColumn\"}prepare(e,t){e.id=t.index+1}render(e,t){return e.leafNode(this.tag,{id:t.id.toString(),name:t.name,totalsRowLabel:t.totalsRowLabel,totalsRowFunction:t.totalsRowFunction,dxfId:t.dxfId}),!0}parseOpen(e){if(e.name===this.tag){const{attributes:t}=e;return this.model={name:t.name,totalsRowLabel:t.totalsRowLabel,totalsRowFunction:t.totalsRowFunction,dxfId:t.dxfId},!0}return!1}parseText(){}parseClose(){return!1}}},{\"../base-xform\":32}],142:[function(e,t,r){\"use strict\";const n=e(\"../base-xform\");t.exports=class extends n{get tag(){return\"tableStyleInfo\"}render(e,t){return e.leafNode(this.tag,{name:t.theme?t.theme:void 0,showFirstColumn:t.showFirstColumn?\"1\":\"0\",showLastColumn:t.showLastColumn?\"1\":\"0\",showRowStripes:t.showRowStripes?\"1\":\"0\",showColumnStripes:t.showColumnStripes?\"1\":\"0\"}),!0}parseOpen(e){if(e.name===this.tag){const{attributes:t}=e;return this.model={theme:t.name?t.name:null,showFirstColumn:\"1\"===t.showFirstColumn,showLastColumn:\"1\"===t.showLastColumn,showRowStripes:\"1\"===t.showRowStripes,showColumnStripes:\"1\"===t.showColumnStripes},!0}return!1}parseText(){}parseClose(){return!1}}},{\"../base-xform\":32}],143:[function(e,t,r){\"use strict\";const n=e(\"../../../utils/xml-stream\"),i=e(\"../base-xform\"),s=e(\"../list-xform\"),o=e(\"./auto-filter-xform\"),a=e(\"./table-column-xform\"),l=e(\"./table-style-info-xform\");class c extends i{constructor(){super(),this.map={autoFilter:new o,tableColumns:new s({tag:\"tableColumns\",count:!0,empty:!0,childXform:new a}),tableStyleInfo:new l}}prepare(e,t){this.map.autoFilter.prepare(e),this.map.tableColumns.prepare(e.columns,t)}get tag(){return\"table\"}render(e,t){e.openXml(n.StdDocAttributes),e.openNode(this.tag,{...c.TABLE_ATTRIBUTES,id:t.id,name:t.name,displayName:t.displayName||t.name,ref:t.tableRef,totalsRowCount:t.totalsRow?\"1\":void 0,totalsRowShown:t.totalsRow?void 0:\"1\",headerRowCount:t.headerRow?\"1\":\"0\"}),this.map.autoFilter.render(e,t),this.map.tableColumns.render(e,t.columns),this.map.tableStyleInfo.render(e,t.style),e.closeNode()}parseOpen(e){if(this.parser)return this.parser.parseOpen(e),!0;const{name:t,attributes:r}=e;switch(t){case this.tag:this.reset(),this.model={name:r.name,displayName:r.displayName||r.name,tableRef:r.ref,totalsRow:\"1\"===r.totalsRowCount,headerRow:\"1\"===r.headerRowCount};break;default:this.parser=this.map[e.name],this.parser&&this.parser.parseOpen(e)}return!0}parseText(e){this.parser&&this.parser.parseText(e)}parseClose(e){if(this.parser)return this.parser.parseClose(e)||(this.parser=void 0),!0;switch(e){case this.tag:return this.model.columns=this.map.tableColumns.model,this.map.autoFilter.model&&(this.model.autoFilterRef=this.map.autoFilter.model.autoFilterRef,this.map.autoFilter.model.columns.forEach((e,t)=>{this.model.columns[t].filterButton=e.filterButton})),this.model.style=this.map.tableStyleInfo.model,!1;default:return!0}}reconcile(e,t){e.columns.forEach(e=>{void 0!==e.dxfId&&(e.style=t.styles.getDxfStyle(e.dxfId))})}}c.TABLE_ATTRIBUTES={xmlns:\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\"xmlns:mc\":\"http://schemas.openxmlformats.org/markup-compatibility/2006\",\"mc:Ignorable\":\"xr xr3\",\"xmlns:xr\":\"http://schemas.microsoft.com/office/spreadsheetml/2014/revision\",\"xmlns:xr3\":\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"},t.exports=c},{\"../../../utils/xml-stream\":28,\"../base-xform\":32,\"../list-xform\":71,\"./auto-filter-xform\":137,\"./table-column-xform\":141,\"./table-style-info-xform\":142}],144:[function(e,t,r){(function(r,n){(function(){\"use strict\";const i=e(\"fs\"),s=e(\"jszip\"),{PassThrough:o}=e(\"readable-stream\"),a=e(\"../utils/zip-stream\"),l=e(\"../utils/stream-buf\"),c=e(\"../utils/utils\"),u=e(\"../utils/xml-stream\"),{bufferToString:h}=e(\"../utils/browser-buffer-decode\"),f=e(\"./xform/style/styles-xform\"),d=e(\"./xform/core/core-xform\"),p=e(\"./xform/strings/shared-strings-xform\"),m=e(\"./xform/core/relationships-xform\"),b=e(\"./xform/core/content-types-xform\"),g=e(\"./xform/core/app-xform\"),y=e(\"./xform/book/workbook-xform\"),v=e(\"./xform/sheet/worksheet-xform\"),w=e(\"./xform/drawing/drawing-xform\"),_=e(\"./xform/table/table-xform\"),x=e(\"./xform/comment/comments-xform\"),k=e(\"./xform/comment/vml-notes-xform\"),S=e(\"./xml/theme1\");class M{constructor(e){this.workbook=e}async readFile(e,t){if(!await c.fs.exists(e))throw new Error(\"File not found: \"+e);const r=i.createReadStream(e);try{const e=await this.read(r,t);return r.close(),e}catch(e){throw r.close(),e}}parseRels(e){return(new m).parseStream(e)}parseWorkbook(e){return(new y).parseStream(e)}parseSharedStrings(e){return(new p).parseStream(e)}reconcile(e,t){const r=new y,n=new v(t),i=new w,s=new _;r.reconcile(e);const o={media:e.media,mediaIndex:e.mediaIndex};Object.keys(e.drawings).forEach(t=>{const r=e.drawings[t],n=e.drawingRels[t];n&&(o.rels=n.reduce((e,t)=>(e[t.Id]=t,e),{}),(r.anchors||[]).forEach(e=>{const t=e.picture&&e.picture.hyperlinks;t&&o.rels[t.rId]&&(t.hyperlink=o.rels[t.rId].Target,delete t.rId)}),i.reconcile(r,o))});const a={styles:e.styles};Object.values(e.tables).forEach(e=>{s.reconcile(e,a)});const l={styles:e.styles,sharedStrings:e.sharedStrings,media:e.media,mediaIndex:e.mediaIndex,date1904:e.properties&&e.properties.date1904,drawings:e.drawings,comments:e.comments,tables:e.tables,vmlDrawings:e.vmlDrawings};e.worksheets.forEach(t=>{t.relationships=e.worksheetRels[t.sheetNo],n.reconcile(t,l)}),delete e.worksheetHash,delete e.worksheetRels,delete e.globalRels,delete e.sharedStrings,delete e.workbookRels,delete e.sheetDefs,delete e.styles,delete e.mediaIndex,delete e.drawings,delete e.drawingRels,delete e.vmlDrawings}async _processWorksheetEntry(e,t,r,n,i){const s=new v(n),o=await s.parseStream(e);o.sheetNo=r,t.worksheetHash[i]=o,t.worksheets.push(o)}async _processCommentEntry(e,t,r){const n=new x,i=await n.parseStream(e);t.comments[`../${r}.xml`]=i}async _processTableEntry(e,t,r){const n=new _,i=await n.parseStream(e);t.tables[`../tables/${r}.xml`]=i}async _processWorksheetRelsEntry(e,t,r){const n=new m,i=await n.parseStream(e);t.worksheetRels[r]=i}async _processMediaEntry(e,t,r){const n=r.lastIndexOf(\".\");if(n>=1){const i=r.substr(n+1),s=r.substr(0,n);await new Promise((n,o)=>{const a=new l;a.on(\"finish\",()=>{t.mediaIndex[r]=t.media.length,t.mediaIndex[s]=t.media.length;const e={type:\"image\",name:s,extension:i,buffer:a.toBuffer()};t.media.push(e),n()}),e.on(\"error\",e=>{o(e)}),e.pipe(a)})}}async _processDrawingEntry(e,t,r){const n=new w,i=await n.parseStream(e);t.drawings[r]=i}async _processDrawingRelsEntry(e,t,r){const n=new m,i=await n.parseStream(e);t.drawingRels[r]=i}async _processVmlDrawingEntry(e,t,r){const n=new k,i=await n.parseStream(e);t.vmlDrawings[`../drawings/${r}.vml`]=i}async _processThemeEntry(e,t,r){await new Promise((n,i)=>{const s=new l;e.on(\"error\",i),s.on(\"error\",i),s.on(\"finish\",()=>{t.themes[r]=s.read().toString(),n()}),e.pipe(s)})}createInputStream(){throw new Error(\"`XLSX#createInputStream` is deprecated. You should use `XLSX#read` instead. This method will be removed in version 5.0. Please follow upgrade instruction: https://github.com/exceljs/exceljs/blob/master/UPGRADE-4.0.md\")}async read(e,t){!e[Symbol.asyncIterator]&&e.pipe&&(e=e.pipe(new o));const r=[];for await(const t of e)r.push(t);return this.load(n.concat(r),t)}async load(e,t){let i;i=t&&t.base64?n.from(e.toString(),\"base64\"):e;const a={worksheets:[],worksheetHash:{},worksheetRels:[],themes:{},media:[],mediaIndex:{},drawings:{},drawingRels:{},comments:{},tables:{},vmlDrawings:{}},l=await s.loadAsync(i);for(const e of Object.values(l.files))if(!e.dir){let n,i=e.name;if(\"/\"===i[0]&&(i=i.substr(1)),i.match(/xl\\/media\\//)||i.match(/xl\\/theme\\/([a-zA-Z0-9]+)[.]xml/))n=new o,n.write(await e.async(\"nodebuffer\"));else{let t;n=new o({writableObjectMode:!0,readableObjectMode:!0}),t=r.browser?h(await e.async(\"nodebuffer\")):await e.async(\"string\");const i=16384;for(let e=0;e<t.length;e+=i)n.write(t.substring(e,e+i))}switch(n.end(),i){case\"_rels/.rels\":a.globalRels=await this.parseRels(n);break;case\"xl/workbook.xml\":{const e=await this.parseWorkbook(n);a.sheets=e.sheets,a.definedNames=e.definedNames,a.views=e.views,a.properties=e.properties,a.calcProperties=e.calcProperties;break}case\"xl/_rels/workbook.xml.rels\":a.workbookRels=await this.parseRels(n);break;case\"xl/sharedStrings.xml\":a.sharedStrings=new p,await a.sharedStrings.parseStream(n);break;case\"xl/styles.xml\":a.styles=new f,await a.styles.parseStream(n);break;case\"docProps/app.xml\":{const e=new g,t=await e.parseStream(n);a.company=t.company,a.manager=t.manager;break}case\"docProps/core.xml\":{const e=new d,t=await e.parseStream(n);Object.assign(a,t);break}default:{let e=i.match(/xl\\/worksheets\\/sheet(\\d+)[.]xml/);if(e){await this._processWorksheetEntry(n,a,e[1],t,i);break}if(e=i.match(/xl\\/worksheets\\/_rels\\/sheet(\\d+)[.]xml.rels/),e){await this._processWorksheetRelsEntry(n,a,e[1]);break}if(e=i.match(/xl\\/theme\\/([a-zA-Z0-9]+)[.]xml/),e){await this._processThemeEntry(n,a,e[1]);break}if(e=i.match(/xl\\/media\\/([a-zA-Z0-9]+[.][a-zA-Z0-9]{3,4})$/),e){await this._processMediaEntry(n,a,e[1]);break}if(e=i.match(/xl\\/drawings\\/([a-zA-Z0-9]+)[.]xml/),e){await this._processDrawingEntry(n,a,e[1]);break}if(e=i.match(/xl\\/(comments\\d+)[.]xml/),e){await this._processCommentEntry(n,a,e[1]);break}if(e=i.match(/xl\\/tables\\/(table\\d+)[.]xml/),e){await this._processTableEntry(n,a,e[1]);break}if(e=i.match(/xl\\/drawings\\/_rels\\/([a-zA-Z0-9]+)[.]xml[.]rels/),e){await this._processDrawingRelsEntry(n,a,e[1]);break}if(e=i.match(/xl\\/drawings\\/(vmlDrawing\\d+)[.]vml/),e){await this._processVmlDrawingEntry(n,a,e[1]);break}}}}return this.reconcile(a,t),this.workbook.model=a,this.workbook}async addMedia(e,t){await Promise.all(t.media.map(async t=>{if(\"image\"===t.type){const r=`xl/media/${t.name}.${t.extension}`;if(t.filename){const n=await function(e,t){return new Promise((r,n)=>{i.readFile(e,t,(e,t)=>{e?n(e):r(t)})})}(t.filename);return e.append(n,{name:r})}if(t.buffer)return e.append(t.buffer,{name:r});if(t.base64){const n=t.base64,i=n.substring(n.indexOf(\",\")+1);return e.append(i,{name:r,base64:!0})}}throw new Error(\"Unsupported media\")}))}addDrawings(e,t){const r=new w,n=new m;t.worksheets.forEach(t=>{const{drawing:i}=t;if(i){r.prepare(i,{});let t=r.toXml(i);e.append(t,{name:`xl/drawings/${i.name}.xml`}),t=n.toXml(i.rels),e.append(t,{name:`xl/drawings/_rels/${i.name}.xml.rels`})}})}addTables(e,t){const r=new _;t.worksheets.forEach(t=>{const{tables:n}=t;n.forEach(t=>{r.prepare(t,{});const n=r.toXml(t);e.append(n,{name:\"xl/tables/\"+t.target})})})}async addContentTypes(e,t){const r=(new b).toXml(t);e.append(r,{name:\"[Content_Types].xml\"})}async addApp(e,t){const r=(new g).toXml(t);e.append(r,{name:\"docProps/app.xml\"})}async addCore(e,t){const r=new d;e.append(r.toXml(t),{name:\"docProps/core.xml\"})}async addThemes(e,t){const r=t.themes||{theme1:S};Object.keys(r).forEach(t=>{const n=r[t],i=`xl/theme/${t}.xml`;e.append(n,{name:i})})}async addOfficeRels(e){const t=(new m).toXml([{Id:\"rId1\",Type:M.RelType.OfficeDocument,Target:\"xl/workbook.xml\"},{Id:\"rId2\",Type:M.RelType.CoreProperties,Target:\"docProps/core.xml\"},{Id:\"rId3\",Type:M.RelType.ExtenderProperties,Target:\"docProps/app.xml\"}]);e.append(t,{name:\"_rels/.rels\"})}async addWorkbookRels(e,t){let r=1;const n=[{Id:\"rId\"+r++,Type:M.RelType.Styles,Target:\"styles.xml\"},{Id:\"rId\"+r++,Type:M.RelType.Theme,Target:\"theme/theme1.xml\"}];t.sharedStrings.count&&n.push({Id:\"rId\"+r++,Type:M.RelType.SharedStrings,Target:\"sharedStrings.xml\"}),t.worksheets.forEach(e=>{e.rId=\"rId\"+r++,n.push({Id:e.rId,Type:M.RelType.Worksheet,Target:`worksheets/sheet${e.id}.xml`})});const i=(new m).toXml(n);e.append(i,{name:\"xl/_rels/workbook.xml.rels\"})}async addSharedStrings(e,t){t.sharedStrings&&t.sharedStrings.count&&e.append(t.sharedStrings.xml,{name:\"xl/sharedStrings.xml\"})}async addStyles(e,t){const{xml:r}=t.styles;r&&e.append(r,{name:\"xl/styles.xml\"})}async addWorkbook(e,t){const r=new y;e.append(r.toXml(t),{name:\"xl/workbook.xml\"})}async addWorksheets(e,t){const r=new v,n=new m,i=new x,s=new k;t.worksheets.forEach(t=>{let o=new u;r.render(o,t),e.append(o.xml,{name:`xl/worksheets/sheet${t.id}.xml`}),t.rels&&t.rels.length&&(o=new u,n.render(o,t.rels),e.append(o.xml,{name:`xl/worksheets/_rels/sheet${t.id}.xml.rels`})),t.comments.length>0&&(o=new u,i.render(o,t),e.append(o.xml,{name:`xl/comments${t.id}.xml`}),o=new u,s.render(o,t),e.append(o.xml,{name:`xl/drawings/vmlDrawing${t.id}.vml`}))})}_finalize(e){return new Promise((t,r)=>{e.on(\"finish\",()=>{t(this)}),e.on(\"error\",r),e.finalize()})}prepareModel(e,t){e.creator=e.creator||\"ExcelJS\",e.lastModifiedBy=e.lastModifiedBy||\"ExcelJS\",e.created=e.created||new Date,e.modified=e.modified||new Date,e.useSharedStrings=void 0===t.useSharedStrings||t.useSharedStrings,e.useStyles=void 0===t.useStyles||t.useStyles,e.sharedStrings=new p,e.styles=e.useStyles?new f(!0):new f.Mock;const r=new y,n=new v;r.prepare(e);const i={sharedStrings:e.sharedStrings,styles:e.styles,date1904:e.properties.date1904,drawingsCount:0,media:e.media};i.drawings=e.drawings=[],i.commentRefs=e.commentRefs=[];let s=0;e.tables=[],e.worksheets.forEach(t=>{t.tables.forEach(t=>{s++,t.target=`table${s}.xml`,t.id=s,e.tables.push(t)}),n.prepare(t,i)})}async write(e,t){t=t||{};const{model:r}=this.workbook,n=new a.ZipWriter(t.zip);return n.pipe(e),this.prepareModel(r,t),await this.addContentTypes(n,r),await this.addOfficeRels(n,r),await this.addWorkbookRels(n,r),await this.addWorksheets(n,r),await this.addSharedStrings(n,r),await this.addDrawings(n,r),await this.addTables(n,r),await Promise.all([this.addThemes(n,r),this.addStyles(n,r)]),await this.addMedia(n,r),await Promise.all([this.addApp(n,r),this.addCore(n,r)]),await this.addWorkbook(n,r),this._finalize(n)}writeFile(e,t){const r=i.createWriteStream(e);return new Promise((e,n)=>{r.on(\"finish\",()=>{e()}),r.on(\"error\",e=>{n(e)}),this.write(r,t).then(()=>{r.end()}).catch(e=>{n(e)})})}async writeBuffer(e){const t=new l;return await this.write(t,e),t.read()}}M.RelType=e(\"./rel-type\"),t.exports=M}).call(this)}).call(this,e(\"_process\"),e(\"buffer\").Buffer)},{\"../utils/browser-buffer-decode\":16,\"../utils/stream-buf\":24,\"../utils/utils\":27,\"../utils/xml-stream\":28,\"../utils/zip-stream\":29,\"./rel-type\":31,\"./xform/book/workbook-xform\":38,\"./xform/comment/comments-xform\":40,\"./xform/comment/vml-notes-xform\":45,\"./xform/core/app-xform\":51,\"./xform/core/content-types-xform\":52,\"./xform/core/core-xform\":53,\"./xform/core/relationships-xform\":55,\"./xform/drawing/drawing-xform\":62,\"./xform/sheet/worksheet-xform\":115,\"./xform/strings/shared-strings-xform\":124,\"./xform/style/styles-xform\":135,\"./xform/table/table-xform\":143,\"./xml/theme1\":145,_process:467,buffer:220,fs:216,jszip:441,\"readable-stream\":491}],145:[function(e,t,r){\"use strict\";t.exports='<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"Office Theme\"> <a:themeElements> <a:clrScheme name=\"Office\"> <a:dk1> <a:sysClr val=\"windowText\" lastClr=\"000000\"/> </a:dk1> <a:lt1> <a:sysClr val=\"window\" lastClr=\"FFFFFF\"/> </a:lt1> <a:dk2> <a:srgbClr val=\"1F497D\"/> </a:dk2> <a:lt2> <a:srgbClr val=\"EEECE1\"/> </a:lt2> <a:accent1> <a:srgbClr val=\"4F81BD\"/> </a:accent1> <a:accent2> <a:srgbClr val=\"C0504D\"/> </a:accent2> <a:accent3> <a:srgbClr val=\"9BBB59\"/> </a:accent3> <a:accent4> <a:srgbClr val=\"8064A2\"/> </a:accent4> <a:accent5> <a:srgbClr val=\"4BACC6\"/> </a:accent5> <a:accent6> <a:srgbClr val=\"F79646\"/> </a:accent6> <a:hlink> <a:srgbClr val=\"0000FF\"/> </a:hlink> <a:folHlink> <a:srgbClr val=\"800080\"/> </a:folHlink> </a:clrScheme> <a:fontScheme name=\"Office\"> <a:majorFont> <a:latin typeface=\"Cambria\"/> <a:ea typeface=\"\"/> <a:cs typeface=\"\"/> <a:font script=\"Jpan\" typeface=\"\\uff2d\\uff33 \\uff30\\u30b4\\u30b7\\u30c3\\u30af\"/> <a:font script=\"Hang\" typeface=\"\\ub9d1\\uc740 \\uace0\\ub515\"/> <a:font script=\"Hans\" typeface=\"\\u5b8b\\u4f53\"/> <a:font script=\"Hant\" typeface=\"\\u65b0\\u7d30\\u660e\\u9ad4\"/> <a:font script=\"Arab\" typeface=\"Times New Roman\"/> <a:font script=\"Hebr\" typeface=\"Times New Roman\"/> <a:font script=\"Thai\" typeface=\"Tahoma\"/> <a:font script=\"Ethi\" typeface=\"Nyala\"/> <a:font script=\"Beng\" typeface=\"Vrinda\"/> <a:font script=\"Gujr\" typeface=\"Shruti\"/> <a:font script=\"Khmr\" typeface=\"MoolBoran\"/> <a:font script=\"Knda\" typeface=\"Tunga\"/> <a:font script=\"Guru\" typeface=\"Raavi\"/> <a:font script=\"Cans\" typeface=\"Euphemia\"/> <a:font script=\"Cher\" typeface=\"Plantagenet Cherokee\"/> <a:font script=\"Yiii\" typeface=\"Microsoft Yi Baiti\"/> <a:font script=\"Tibt\" typeface=\"Microsoft Himalaya\"/> <a:font script=\"Thaa\" typeface=\"MV Boli\"/> <a:font script=\"Deva\" typeface=\"Mangal\"/> <a:font script=\"Telu\" typeface=\"Gautami\"/> <a:font script=\"Taml\" typeface=\"Latha\"/> <a:font script=\"Syrc\" typeface=\"Estrangelo Edessa\"/> <a:font script=\"Orya\" typeface=\"Kalinga\"/> <a:font script=\"Mlym\" typeface=\"Kartika\"/> <a:font script=\"Laoo\" typeface=\"DokChampa\"/> <a:font script=\"Sinh\" typeface=\"Iskoola Pota\"/> <a:font script=\"Mong\" typeface=\"Mongolian Baiti\"/> <a:font script=\"Viet\" typeface=\"Times New Roman\"/> <a:font script=\"Uigh\" typeface=\"Microsoft Uighur\"/> <a:font script=\"Geor\" typeface=\"Sylfaen\"/> </a:majorFont> <a:minorFont> <a:latin typeface=\"Calibri\"/> <a:ea typeface=\"\"/> <a:cs typeface=\"\"/> <a:font script=\"Jpan\" typeface=\"\\uff2d\\uff33 \\uff30\\u30b4\\u30b7\\u30c3\\u30af\"/> <a:font script=\"Hang\" typeface=\"\\ub9d1\\uc740 \\uace0\\ub515\"/> <a:font script=\"Hans\" typeface=\"\\u5b8b\\u4f53\"/> <a:font script=\"Hant\" typeface=\"\\u65b0\\u7d30\\u660e\\u9ad4\"/> <a:font script=\"Arab\" typeface=\"Arial\"/> <a:font script=\"Hebr\" typeface=\"Arial\"/> <a:font script=\"Thai\" typeface=\"Tahoma\"/> <a:font script=\"Ethi\" typeface=\"Nyala\"/> <a:font script=\"Beng\" typeface=\"Vrinda\"/> <a:font script=\"Gujr\" typeface=\"Shruti\"/> <a:font script=\"Khmr\" typeface=\"DaunPenh\"/> <a:font script=\"Knda\" typeface=\"Tunga\"/> <a:font script=\"Guru\" typeface=\"Raavi\"/> <a:font script=\"Cans\" typeface=\"Euphemia\"/> <a:font script=\"Cher\" typeface=\"Plantagenet Cherokee\"/> <a:font script=\"Yiii\" typeface=\"Microsoft Yi Baiti\"/> <a:font script=\"Tibt\" typeface=\"Microsoft Himalaya\"/> <a:font script=\"Thaa\" typeface=\"MV Boli\"/> <a:font script=\"Deva\" typeface=\"Mangal\"/> <a:font script=\"Telu\" typeface=\"Gautami\"/> <a:font script=\"Taml\" typeface=\"Latha\"/> <a:font script=\"Syrc\" typeface=\"Estrangelo Edessa\"/> <a:font script=\"Orya\" typeface=\"Kalinga\"/> <a:font script=\"Mlym\" typeface=\"Kartika\"/> <a:font script=\"Laoo\" typeface=\"DokChampa\"/> <a:font script=\"Sinh\" typeface=\"Iskoola Pota\"/> <a:font script=\"Mong\" typeface=\"Mongolian Baiti\"/> <a:font script=\"Viet\" typeface=\"Arial\"/> <a:font script=\"Uigh\" typeface=\"Microsoft Uighur\"/> <a:font script=\"Geor\" typeface=\"Sylfaen\"/> </a:minorFont> </a:fontScheme> <a:fmtScheme name=\"Office\"> <a:fillStyleLst> <a:solidFill> <a:schemeClr val=\"phClr\"/> </a:solidFill> <a:gradFill rotWithShape=\"1\"> <a:gsLst> <a:gs pos=\"0\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"50000\"/> <a:satMod val=\"300000\"/> </a:schemeClr> </a:gs> <a:gs pos=\"35000\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"37000\"/> <a:satMod val=\"300000\"/> </a:schemeClr> </a:gs> <a:gs pos=\"100000\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"15000\"/> <a:satMod val=\"350000\"/> </a:schemeClr> </a:gs> </a:gsLst> <a:lin ang=\"16200000\" scaled=\"1\"/> </a:gradFill> <a:gradFill rotWithShape=\"1\"> <a:gsLst> <a:gs pos=\"0\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"100000\"/> <a:shade val=\"100000\"/> <a:satMod val=\"130000\"/> </a:schemeClr> </a:gs> <a:gs pos=\"100000\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"50000\"/> <a:shade val=\"100000\"/> <a:satMod val=\"350000\"/> </a:schemeClr> </a:gs> </a:gsLst> <a:lin ang=\"16200000\" scaled=\"0\"/> </a:gradFill> </a:fillStyleLst> <a:lnStyleLst> <a:ln w=\"9525\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"> <a:solidFill> <a:schemeClr val=\"phClr\"> <a:shade val=\"95000\"/> <a:satMod val=\"105000\"/> </a:schemeClr> </a:solidFill> <a:prstDash val=\"solid\"/> </a:ln> <a:ln w=\"25400\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"> <a:solidFill> <a:schemeClr val=\"phClr\"/> </a:solidFill> <a:prstDash val=\"solid\"/> </a:ln> <a:ln w=\"38100\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"> <a:solidFill> <a:schemeClr val=\"phClr\"/> </a:solidFill> <a:prstDash val=\"solid\"/> </a:ln> </a:lnStyleLst> <a:effectStyleLst> <a:effectStyle> <a:effectLst> <a:outerShdw blurRad=\"40000\" dist=\"20000\" dir=\"5400000\" rotWithShape=\"0\"> <a:srgbClr val=\"000000\"> <a:alpha val=\"38000\"/> </a:srgbClr> </a:outerShdw> </a:effectLst> </a:effectStyle> <a:effectStyle> <a:effectLst> <a:outerShdw blurRad=\"40000\" dist=\"23000\" dir=\"5400000\" rotWithShape=\"0\"> <a:srgbClr val=\"000000\"> <a:alpha val=\"35000\"/> </a:srgbClr> </a:outerShdw> </a:effectLst> </a:effectStyle> <a:effectStyle> <a:effectLst> <a:outerShdw blurRad=\"40000\" dist=\"23000\" dir=\"5400000\" rotWithShape=\"0\"> <a:srgbClr val=\"000000\"> <a:alpha val=\"35000\"/> </a:srgbClr> </a:outerShdw> </a:effectLst> <a:scene3d> <a:camera prst=\"orthographicFront\"> <a:rot lat=\"0\" lon=\"0\" rev=\"0\"/> </a:camera> <a:lightRig rig=\"threePt\" dir=\"t\"> <a:rot lat=\"0\" lon=\"0\" rev=\"1200000\"/> </a:lightRig> </a:scene3d> <a:sp3d> <a:bevelT w=\"63500\" h=\"25400\"/> </a:sp3d> </a:effectStyle> </a:effectStyleLst> <a:bgFillStyleLst> <a:solidFill> <a:schemeClr val=\"phClr\"/> </a:solidFill> <a:gradFill rotWithShape=\"1\"> <a:gsLst> <a:gs pos=\"0\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"40000\"/> <a:satMod val=\"350000\"/> </a:schemeClr> </a:gs> <a:gs pos=\"40000\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"45000\"/> <a:shade val=\"99000\"/> <a:satMod val=\"350000\"/> </a:schemeClr> </a:gs> <a:gs pos=\"100000\"> <a:schemeClr val=\"phClr\"> <a:shade val=\"20000\"/> <a:satMod val=\"255000\"/> </a:schemeClr> </a:gs> </a:gsLst> <a:path path=\"circle\"> <a:fillToRect l=\"50000\" t=\"-80000\" r=\"50000\" b=\"180000\"/> </a:path> </a:gradFill> <a:gradFill rotWithShape=\"1\"> <a:gsLst> <a:gs pos=\"0\"> <a:schemeClr val=\"phClr\"> <a:tint val=\"80000\"/> <a:satMod val=\"300000\"/> </a:schemeClr> </a:gs> <a:gs pos=\"100000\"> <a:schemeClr val=\"phClr\"> <a:shade val=\"30000\"/> <a:satMod val=\"200000\"/> </a:schemeClr> </a:gs> </a:gsLst> <a:path path=\"circle\"> <a:fillToRect l=\"50000\" t=\"50000\" r=\"50000\" b=\"50000\"/> </a:path> </a:gradFill> </a:bgFillStyleLst> </a:fmtScheme> </a:themeElements> <a:objectDefaults> <a:spDef> <a:spPr/> <a:bodyPr/> <a:lstStyle/> <a:style> <a:lnRef idx=\"1\"> <a:schemeClr val=\"accent1\"/> </a:lnRef> <a:fillRef idx=\"3\"> <a:schemeClr val=\"accent1\"/> </a:fillRef> <a:effectRef idx=\"2\"> <a:schemeClr val=\"accent1\"/> </a:effectRef> <a:fontRef idx=\"minor\"> <a:schemeClr val=\"lt1\"/> </a:fontRef> </a:style> </a:spDef> <a:lnDef> <a:spPr/> <a:bodyPr/> <a:lstStyle/> <a:style> <a:lnRef idx=\"2\"> <a:schemeClr val=\"accent1\"/> </a:lnRef> <a:fillRef idx=\"0\"> <a:schemeClr val=\"accent1\"/> </a:fillRef> <a:effectRef idx=\"1\"> <a:schemeClr val=\"accent1\"/> </a:effectRef> <a:fontRef idx=\"minor\"> <a:schemeClr val=\"tx1\"/> </a:fontRef> </a:style> </a:lnDef> </a:objectDefaults> <a:extraClrSchemeLst/> </a:theme>'},{}],146:[function(e,t,r){(function(t){(function(){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.CsvFormatterStream=void 0;const n=e(\"stream\"),i=e(\"./formatter\");class s extends n.Transform{constructor(e){super({writableObjectMode:e.objectMode}),this.hasWrittenBOM=!1,this.formatterOptions=e,this.rowFormatter=new i.RowFormatter(e),this.hasWrittenBOM=!e.writeBOM}transform(e){return this.rowFormatter.rowTransform=e,this}_transform(e,r,n){let i=!1;try{this.hasWrittenBOM||(this.push(this.formatterOptions.BOM),this.hasWrittenBOM=!0),this.rowFormatter.format(e,(e,r)=>e?(i=!0,n(e)):(r&&r.forEach(e=>{this.push(t.from(e,\"utf8\"))}),i=!0,n()))}catch(e){if(i)throw e;n(e)}}_flush(e){this.rowFormatter.finish((r,n)=>r?e(r):(n&&n.forEach(e=>{this.push(t.from(e,\"utf8\"))}),e()))}}r.CsvFormatterStream=s}).call(this)}).call(this,e(\"buffer\").Buffer)},{\"./formatter\":150,buffer:220,stream:505}],147:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.FormatterOptions=void 0;r.FormatterOptions=class{constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};var t;this.objectMode=!0,this.delimiter=\",\",this.rowDelimiter=\"\\n\",this.quote='\"',this.escape=this.quote,this.quoteColumns=!1,this.quoteHeaders=this.quoteColumns,this.headers=null,this.includeEndRowDelimiter=!1,this.writeBOM=!1,this.BOM=\"\\ufeff\",this.alwaysWriteHeaders=!1,Object.assign(this,e||{}),void 0===(null==e?void 0:e.quoteHeaders)&&(this.quoteHeaders=this.quoteColumns),!0===(null==e?void 0:e.quote)?this.quote='\"':!1===(null==e?void 0:e.quote)&&(this.quote=\"\"),\"string\"!=typeof(null==e?void 0:e.escape)&&(this.escape=this.quote),this.shouldWriteHeaders=!!this.headers&&(null===(t=e.writeHeaders)||void 0===t||t),this.headers=Array.isArray(this.headers)?this.headers:null,this.escapedQuote=`${this.escape}${this.quote}`}}},{}],148:[function(e,t,r){\"use strict\";var n=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(r,\"__esModule\",{value:!0}),r.FieldFormatter=void 0;const i=n(e(\"lodash.isboolean\")),s=n(e(\"lodash.isnil\")),o=n(e(\"lodash.escaperegexp\"));r.FieldFormatter=class{constructor(e){this._headers=null,this.formatterOptions=e,null!==e.headers&&(this.headers=e.headers),this.REPLACE_REGEXP=new RegExp(e.quote,\"g\");const t=`[${e.delimiter}${o.default(e.rowDelimiter)}|\\r|\\n]`;this.ESCAPE_REGEXP=new RegExp(t)}set headers(e){this._headers=e}shouldQuote(e,t){const r=t?this.formatterOptions.quoteHeaders:this.formatterOptions.quoteColumns;return i.default(r)?r:Array.isArray(r)?r[e]:null!==this._headers&&r[this._headers[e]]}format(e,t,r){const n=(\"\"+(s.default(e)?\"\":e)).replace(/\\0/g,\"\"),{formatterOptions:i}=this;if(\"\"!==i.quote){if(-1!==n.indexOf(i.quote))return this.quoteField(n.replace(this.REPLACE_REGEXP,i.escapedQuote))}return-1!==n.search(this.ESCAPE_REGEXP)||this.shouldQuote(t,r)?this.quoteField(n):n}quoteField(e){const{quote:t}=this.formatterOptions;return`${t}${e}${t}`}}},{\"lodash.escaperegexp\":442,\"lodash.isboolean\":444,\"lodash.isnil\":447}],149:[function(e,t,r){\"use strict\";var n=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(r,\"__esModule\",{value:!0}),r.RowFormatter=void 0;const i=n(e(\"lodash.isfunction\")),s=n(e(\"lodash.isequal\")),o=e(\"./FieldFormatter\"),a=e(\"../types\");class l{constructor(e){this.rowCount=0,this.formatterOptions=e,this.fieldFormatter=new o.FieldFormatter(e),this.headers=e.headers,this.shouldWriteHeaders=e.shouldWriteHeaders,this.hasWrittenHeaders=!1,null!==this.headers&&(this.fieldFormatter.headers=this.headers),e.transform&&(this.rowTransform=e.transform)}static isRowHashArray(e){return!!Array.isArray(e)&&(Array.isArray(e[0])&&2===e[0].length)}static isRowArray(e){return Array.isArray(e)&&!this.isRowHashArray(e)}static gatherHeaders(e){return l.isRowHashArray(e)?e.map(e=>e[0]):Array.isArray(e)?e:Object.keys(e)}static createTransform(e){return a.isSyncTransform(e)?(t,r)=>{let n=null;try{n=e(t)}catch(e){return r(e)}return r(null,n)}:(t,r)=>{e(t,r)}}set rowTransform(e){if(!i.default(e))throw new TypeError(\"The transform should be a function\");this._rowTransform=l.createTransform(e)}format(e,t){this.callTransformer(e,(r,n)=>{if(r)return t(r);if(!e)return t(null);const i=[];if(n){const{shouldFormatColumns:e,headers:t}=this.checkHeaders(n);if(this.shouldWriteHeaders&&t&&!this.hasWrittenHeaders&&(i.push(this.formatColumns(t,!0)),this.hasWrittenHeaders=!0),e){const e=this.gatherColumns(n);i.push(this.formatColumns(e,!1))}}return t(null,i)})}finish(e){const t=[];if(this.formatterOptions.alwaysWriteHeaders&&0===this.rowCount){if(!this.headers)return e(new Error(\"`alwaysWriteHeaders` option is set to true but `headers` option not provided.\"));t.push(this.formatColumns(this.headers,!0))}return this.formatterOptions.includeEndRowDelimiter&&t.push(this.formatterOptions.rowDelimiter),e(null,t)}checkHeaders(e){if(this.headers)return{shouldFormatColumns:!0,headers:this.headers};const t=l.gatherHeaders(e);return this.headers=t,this.fieldFormatter.headers=t,this.shouldWriteHeaders?{shouldFormatColumns:!s.default(t,e),headers:t}:{shouldFormatColumns:!0,headers:null}}gatherColumns(e){if(null===this.headers)throw new Error(\"Headers is currently null\");return Array.isArray(e)?l.isRowHashArray(e)?this.headers.map((t,r)=>{const n=e[r];return n?n[1]:\"\"}):l.isRowArray(e)&&!this.shouldWriteHeaders?e:this.headers.map((t,r)=>e[r]):this.headers.map(t=>e[t])}callTransformer(e,t){return this._rowTransform?this._rowTransform(e,t):t(null,e)}formatColumns(e,t){const r=e.map((e,r)=>this.fieldFormatter.format(e,r,t)).join(this.formatterOptions.delimiter),{rowCount:n}=this;return this.rowCount+=1,n?[this.formatterOptions.rowDelimiter,r].join(\"\"):r}}r.RowFormatter=l},{\"../types\":152,\"./FieldFormatter\":148,\"lodash.isequal\":445,\"lodash.isfunction\":446}],150:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.FieldFormatter=r.RowFormatter=void 0;var n=e(\"./RowFormatter\");Object.defineProperty(r,\"RowFormatter\",{enumerable:!0,get:function(){return n.RowFormatter}});var i=e(\"./FieldFormatter\");Object.defineProperty(r,\"FieldFormatter\",{enumerable:!0,get:function(){return i.FieldFormatter}})},{\"./FieldFormatter\":148,\"./RowFormatter\":149}],151:[function(e,t,r){(function(t){(function(){\"use strict\";var n=Object.create?function(e,t,r,n){void 0===n&&(n=r),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,n){void 0===n&&(n=r),e[n]=t[r]},i=Object.create?function(e,t){Object.defineProperty(e,\"default\",{enumerable:!0,value:t})}:function(e,t){e.default=t},s=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)\"default\"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&n(t,e,r);return i(t,e),t},o=function(e,t){for(var r in e)\"default\"===r||Object.prototype.hasOwnProperty.call(t,r)||n(t,e,r)};Object.defineProperty(r,\"__esModule\",{value:!0}),r.writeToPath=r.writeToString=r.writeToBuffer=r.writeToStream=r.write=r.format=r.FormatterOptions=r.CsvFormatterStream=void 0;const a=e(\"util\"),l=e(\"stream\"),c=s(e(\"fs\")),u=e(\"./FormatterOptions\"),h=e(\"./CsvFormatterStream\");o(e(\"./types\"),r);var f=e(\"./CsvFormatterStream\");Object.defineProperty(r,\"CsvFormatterStream\",{enumerable:!0,get:function(){return f.CsvFormatterStream}});var d=e(\"./FormatterOptions\");Object.defineProperty(r,\"FormatterOptions\",{enumerable:!0,get:function(){return d.FormatterOptions}}),r.format=e=>new h.CsvFormatterStream(new u.FormatterOptions(e)),r.write=(e,t)=>{const n=r.format(t),i=a.promisify((e,t)=>{n.write(e,void 0,t)});return e.reduce((e,t)=>e.then(()=>i(t)),Promise.resolve()).then(()=>n.end()).catch(e=>{n.emit(\"error\",e)}),n},r.writeToStream=(e,t,n)=>r.write(t,n).pipe(e),r.writeToBuffer=function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const i=[],s=new l.Writable({write(e,t,r){i.push(e),r()}});return new Promise((o,a)=>{s.on(\"error\",a).on(\"finish\",()=>o(t.concat(i))),r.write(e,n).pipe(s)})},r.writeToString=(e,t)=>r.writeToBuffer(e,t).then(e=>e.toString()),r.writeToPath=(e,t,n)=>{const i=c.createWriteStream(e,{encoding:\"utf8\"});return r.write(t,n).pipe(i)}}).call(this)}).call(this,e(\"buffer\").Buffer)},{\"./CsvFormatterStream\":146,\"./FormatterOptions\":147,\"./types\":152,buffer:220,fs:216,stream:505,util:527}],152:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.isSyncTransform=void 0,r.isSyncTransform=e=>1===e.length},{}],153:[function(e,t,r){(function(t){(function(){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.CsvParserStream=void 0;const n=e(\"string_decoder\"),i=e(\"stream\"),s=e(\"./transforms\"),o=e(\"./parser\");class a extends i.Transform{constructor(e){super({objectMode:e.objectMode}),this.lines=\"\",this.rowCount=0,this.parsedRowCount=0,this.parsedLineCount=0,this.endEmitted=!1,this.headersEmitted=!1,this.parserOptions=e,this.parser=new o.Parser(e),this.headerTransformer=new s.HeaderTransformer(e),this.decoder=new n.StringDecoder(e.encoding),this.rowTransformerValidator=new s.RowTransformerValidator}get hasHitRowLimit(){return this.parserOptions.limitRows&&this.rowCount>=this.parserOptions.maxRows}get shouldEmitRows(){return this.parsedRowCount>this.parserOptions.skipRows}get shouldSkipLine(){return this.parsedLineCount<=this.parserOptions.skipLines}transform(e){return this.rowTransformerValidator.rowTransform=e,this}validate(e){return this.rowTransformerValidator.rowValidator=e,this}emit(e){if(\"end\"===e)return this.endEmitted||(this.endEmitted=!0,super.emit(\"end\",this.rowCount)),!1;for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n<t;n++)r[n-1]=arguments[n];return super.emit(e,...r)}_transform(e,t,r){if(this.hasHitRowLimit)return r();const n=a.wrapDoneCallback(r);try{const{lines:t}=this,r=t+this.decoder.write(e),i=this.parse(r,!0);return this.processRows(i,n)}catch(e){return n(e)}}_flush(e){const t=a.wrapDoneCallback(e);if(this.hasHitRowLimit)return t();try{const e=this.lines+this.decoder.end(),r=this.parse(e,!1);return this.processRows(r,t)}catch(e){return t(e)}}parse(e,t){if(!e)return[];const{line:r,rows:n}=this.parser.parse(e,t);return this.lines=r,n}processRows(e,r){const n=e.length,i=s=>{const o=e=>e?r(e):s%100!=0?i(s+1):void t(()=>i(s+1));if(this.checkAndEmitHeaders(),s>=n||this.hasHitRowLimit)return r();if(this.parsedLineCount+=1,this.shouldSkipLine)return o();const a=e[s];this.rowCount+=1,this.parsedRowCount+=1;const l=this.rowCount;return this.transformRow(a,(e,t)=>{if(e)return this.rowCount-=1,o(e);if(!t)return o(new Error(\"expected transform result\"));if(t.isValid){if(t.row)return this.pushRow(t.row,o)}else this.emit(\"data-invalid\",t.row,l,t.reason);return o()})};i(0)}transformRow(e,t){try{this.headerTransformer.transform(e,(r,n)=>r?t(r):n?n.isValid?n.row?this.shouldEmitRows?this.rowTransformerValidator.transformAndValidate(n.row,t):this.skipRow(t):(this.rowCount-=1,this.parsedRowCount-=1,t(null,{row:null,isValid:!0})):this.shouldEmitRows?t(null,{isValid:!1,row:e}):this.skipRow(t):t(new Error(\"Expected result from header transform\")))}catch(e){t(e)}}checkAndEmitHeaders(){!this.headersEmitted&&this.headerTransformer.headers&&(this.headersEmitted=!0,this.emit(\"headers\",this.headerTransformer.headers))}skipRow(e){return this.rowCount-=1,e(null,{row:null,isValid:!0})}pushRow(e,t){try{this.parserOptions.objectMode?this.push(e):this.push(JSON.stringify(e)),t()}catch(e){t(e)}}static wrapDoneCallback(e){let t=!1;return function(r){if(r){if(t)throw r;return t=!0,void e(r)}for(var n=arguments.length,i=new Array(n>1?n-1:0),s=1;s<n;s++)i[s-1]=arguments[s];e(...i)}}}r.CsvParserStream=a}).call(this)}).call(this,e(\"timers\").setImmediate)},{\"./parser\":165,\"./transforms\":168,stream:505,string_decoder:218,timers:523}],154:[function(e,t,r){\"use strict\";var n=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(r,\"__esModule\",{value:!0}),r.ParserOptions=void 0;const i=n(e(\"lodash.escaperegexp\")),s=n(e(\"lodash.isnil\"));r.ParserOptions=class{constructor(e){var t;if(this.objectMode=!0,this.delimiter=\",\",this.ignoreEmpty=!1,this.quote='\"',this.escape=null,this.escapeChar=this.quote,this.comment=null,this.supportsComments=!1,this.ltrim=!1,this.rtrim=!1,this.trim=!1,this.headers=null,this.renameHeaders=!1,this.strictColumnHandling=!1,this.discardUnmappedColumns=!1,this.carriageReturn=\"\\r\",this.encoding=\"utf8\",this.limitRows=!1,this.maxRows=0,this.skipLines=0,this.skipRows=0,Object.assign(this,e||{}),this.delimiter.length>1)throw new Error(\"delimiter option must be one character long\");this.escapedDelimiter=i.default(this.delimiter),this.escapeChar=null!==(t=this.escape)&&void 0!==t?t:this.quote,this.supportsComments=!s.default(this.comment),this.NEXT_TOKEN_REGEXP=new RegExp(`([^\\\\s]|\\\\r\\\\n|\\\\n|\\\\r|${this.escapedDelimiter})`),this.maxRows>0&&(this.limitRows=!0)}}},{\"lodash.escaperegexp\":442,\"lodash.isnil\":447}],155:[function(e,t,r){\"use strict\";var n=Object.create?function(e,t,r,n){void 0===n&&(n=r),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,n){void 0===n&&(n=r),e[n]=t[r]},i=Object.create?function(e,t){Object.defineProperty(e,\"default\",{enumerable:!0,value:t})}:function(e,t){e.default=t},s=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)\"default\"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&n(t,e,r);return i(t,e),t},o=function(e,t){for(var r in e)\"default\"===r||Object.prototype.hasOwnProperty.call(t,r)||n(t,e,r)};Object.defineProperty(r,\"__esModule\",{value:!0}),r.parseString=r.parseFile=r.parseStream=r.parse=r.ParserOptions=r.CsvParserStream=void 0;const a=s(e(\"fs\")),l=e(\"stream\"),c=e(\"./ParserOptions\"),u=e(\"./CsvParserStream\");o(e(\"./types\"),r);var h=e(\"./CsvParserStream\");Object.defineProperty(r,\"CsvParserStream\",{enumerable:!0,get:function(){return h.CsvParserStream}});var f=e(\"./ParserOptions\");Object.defineProperty(r,\"ParserOptions\",{enumerable:!0,get:function(){return f.ParserOptions}}),r.parse=e=>new u.CsvParserStream(new c.ParserOptions(e)),r.parseStream=(e,t)=>e.pipe(new u.CsvParserStream(new c.ParserOptions(t))),r.parseFile=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return a.createReadStream(e).pipe(new u.CsvParserStream(new c.ParserOptions(t)))},r.parseString=(e,t)=>{const r=new l.Readable;return r.push(e),r.push(null),r.pipe(new u.CsvParserStream(new c.ParserOptions(t)))}},{\"./CsvParserStream\":153,\"./ParserOptions\":154,\"./types\":169,fs:216,stream:505}],156:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.Parser=void 0;const n=e(\"./Scanner\"),i=e(\"./RowParser\"),s=e(\"./Token\");class o{constructor(e){this.parserOptions=e,this.rowParser=new i.RowParser(this.parserOptions)}static removeBOM(e){return e&&65279===e.charCodeAt(0)?e.slice(1):e}parse(e,t){const r=new n.Scanner({line:o.removeBOM(e),parserOptions:this.parserOptions,hasMoreData:t});return this.parserOptions.supportsComments?this.parseWithComments(r):this.parseWithoutComments(r)}parseWithoutComments(e){const t=[];let r=!0;for(;r;)r=this.parseRow(e,t);return{line:e.line,rows:t}}parseWithComments(e){const{parserOptions:t}=this,r=[];for(let n=e.nextCharacterToken;null!==n;n=e.nextCharacterToken)if(s.Token.isTokenComment(n,t)){if(null===e.advancePastLine())return{line:e.lineFromCursor,rows:r};if(!e.hasMoreCharacters)return{line:e.lineFromCursor,rows:r};e.truncateToCursor()}else if(!this.parseRow(e,r))break;return{line:e.line,rows:r}}parseRow(e,t){if(!e.nextNonSpaceToken)return!1;const r=this.rowParser.parse(e);return null!==r&&(this.parserOptions.ignoreEmpty&&i.RowParser.isEmptyRow(r)||t.push(r),!0)}}r.Parser=o},{\"./RowParser\":157,\"./Scanner\":158,\"./Token\":159}],157:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.RowParser=void 0;const n=e(\"./column\"),i=e(\"./Token\");r.RowParser=class{constructor(e){this.parserOptions=e,this.columnParser=new n.ColumnParser(e)}static isEmptyRow(e){return\"\"===e.join(\"\").replace(/\\s+/g,\"\")}parse(e){const{parserOptions:t}=this,{hasMoreData:r}=e,n=e,s=[];let o=this.getStartToken(n,s);for(;o;){if(i.Token.isTokenRowDelimiter(o))return n.advancePastToken(o),!n.hasMoreCharacters&&i.Token.isTokenCarriageReturn(o,t)&&r?null:(n.truncateToCursor(),s);if(!this.shouldSkipColumnParse(n,o,s)){const e=this.columnParser.parse(n);if(null===e)return null;s.push(e)}o=n.nextNonSpaceToken}return r?null:(n.truncateToCursor(),s)}getStartToken(e,t){const r=e.nextNonSpaceToken;return null!==r&&i.Token.isTokenDelimiter(r,this.parserOptions)?(t.push(\"\"),e.nextNonSpaceToken):r}shouldSkipColumnParse(e,t,r){const{parserOptions:n}=this;if(i.Token.isTokenDelimiter(t,n)){e.advancePastToken(t);const s=e.nextCharacterToken;if(!e.hasMoreCharacters||null!==s&&i.Token.isTokenRowDelimiter(s))return r.push(\"\"),!0;if(null!==s&&i.Token.isTokenDelimiter(s,n))return r.push(\"\"),!0}return!1}}},{\"./Token\":159,\"./column\":164}],158:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.Scanner=void 0;const n=e(\"./Token\"),i=/((?:\\r\\n)|\\n|\\r)/;r.Scanner=class{constructor(e){this.cursor=0,this.line=e.line,this.lineLength=this.line.length,this.parserOptions=e.parserOptions,this.hasMoreData=e.hasMoreData,this.cursor=e.cursor||0}get hasMoreCharacters(){return this.lineLength>this.cursor}get nextNonSpaceToken(){const{lineFromCursor:e}=this,t=this.parserOptions.NEXT_TOKEN_REGEXP;if(-1===e.search(t))return null;const r=t.exec(e);if(null==r)return null;const i=r[1],s=this.cursor+(r.index||0);return new n.Token({token:i,startCursor:s,endCursor:s+i.length-1})}get nextCharacterToken(){const{cursor:e,lineLength:t}=this;return t<=e?null:new n.Token({token:this.line[e],startCursor:e,endCursor:e})}get lineFromCursor(){return this.line.substr(this.cursor)}advancePastLine(){const e=i.exec(this.lineFromCursor);return e?(this.cursor+=(e.index||0)+e[0].length,this):this.hasMoreData?null:(this.cursor=this.lineLength,this)}advanceTo(e){return this.cursor=e,this}advanceToToken(e){return this.cursor=e.startCursor,this}advancePastToken(e){return this.cursor=e.endCursor+1,this}truncateToCursor(){return this.line=this.lineFromCursor,this.lineLength=this.line.length,this.cursor=0,this}}},{\"./Token\":159}],159:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.Token=void 0;r.Token=class{constructor(e){this.token=e.token,this.startCursor=e.startCursor,this.endCursor=e.endCursor}static isTokenRowDelimiter(e){const t=e.token;return\"\\r\"===t||\"\\n\"===t||\"\\r\\n\"===t}static isTokenCarriageReturn(e,t){return e.token===t.carriageReturn}static isTokenComment(e,t){return t.supportsComments&&!!e&&e.token===t.comment}static isTokenEscapeCharacter(e,t){return e.token===t.escapeChar}static isTokenQuote(e,t){return e.token===t.quote}static isTokenDelimiter(e,t){return e.token===t.delimiter}}},{}],160:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.ColumnFormatter=void 0;r.ColumnFormatter=class{constructor(e){e.trim?this.format=e=>e.trim():e.ltrim?this.format=e=>e.trimLeft():e.rtrim?this.format=e=>e.trimRight():this.format=e=>e}}},{}],161:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.ColumnParser=void 0;const n=e(\"./NonQuotedColumnParser\"),i=e(\"./QuotedColumnParser\"),s=e(\"../Token\");r.ColumnParser=class{constructor(e){this.parserOptions=e,this.quotedColumnParser=new i.QuotedColumnParser(e),this.nonQuotedColumnParser=new n.NonQuotedColumnParser(e)}parse(e){const{nextNonSpaceToken:t}=e;return null!==t&&s.Token.isTokenQuote(t,this.parserOptions)?(e.advanceToToken(t),this.quotedColumnParser.parse(e)):this.nonQuotedColumnParser.parse(e)}}},{\"../Token\":159,\"./NonQuotedColumnParser\":162,\"./QuotedColumnParser\":163}],162:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.NonQuotedColumnParser=void 0;const n=e(\"./ColumnFormatter\"),i=e(\"../Token\");r.NonQuotedColumnParser=class{constructor(e){this.parserOptions=e,this.columnFormatter=new n.ColumnFormatter(e)}parse(e){if(!e.hasMoreCharacters)return null;const{parserOptions:t}=this,r=[];let n=e.nextCharacterToken;for(;n&&(!i.Token.isTokenDelimiter(n,t)&&!i.Token.isTokenRowDelimiter(n));n=e.nextCharacterToken)r.push(n.token),e.advancePastToken(n);return this.columnFormatter.format(r.join(\"\"))}}},{\"../Token\":159,\"./ColumnFormatter\":160}],163:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.QuotedColumnParser=void 0;const n=e(\"./ColumnFormatter\"),i=e(\"../Token\");r.QuotedColumnParser=class{constructor(e){this.parserOptions=e,this.columnFormatter=new n.ColumnFormatter(e)}parse(e){if(!e.hasMoreCharacters)return null;const t=e.cursor,{foundClosingQuote:r,col:n}=this.gatherDataBetweenQuotes(e);if(!r){if(e.advanceTo(t),!e.hasMoreData)throw new Error(`Parse Error: missing closing: '${this.parserOptions.quote||\"\"}' in line: at '${e.lineFromCursor.replace(/[\\r\\n]/g,\"\\\\n'\")}'`);return null}return this.checkForMalformedColumn(e),n}gatherDataBetweenQuotes(e){const{parserOptions:t}=this;let r=!1,n=!1;const s=[];let o=e.nextCharacterToken;for(;!n&&null!==o;o=e.nextCharacterToken){const a=i.Token.isTokenQuote(o,t);if(!r&&a)r=!0;else if(r)if(i.Token.isTokenEscapeCharacter(o,t)){e.advancePastToken(o);const r=e.nextCharacterToken;null!==r&&(i.Token.isTokenQuote(r,t)||i.Token.isTokenEscapeCharacter(r,t))?(s.push(r.token),o=r):a?n=!0:s.push(o.token)}else a?n=!0:s.push(o.token);e.advancePastToken(o)}return{col:this.columnFormatter.format(s.join(\"\")),foundClosingQuote:n}}checkForMalformedColumn(e){const{parserOptions:t}=this,{nextNonSpaceToken:r}=e;if(r){const n=i.Token.isTokenDelimiter(r,t),s=i.Token.isTokenRowDelimiter(r);if(!n&&!s){const n=e.lineFromCursor.substr(0,10).replace(/[\\r\\n]/g,\"\\\\n'\");throw new Error(`Parse Error: expected: '${t.escapedDelimiter}' OR new line got: '${r.token}'. at '${n}`)}e.advanceToToken(r)}else e.hasMoreData||e.advancePastLine()}}},{\"../Token\":159,\"./ColumnFormatter\":160}],164:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.ColumnFormatter=r.QuotedColumnParser=r.NonQuotedColumnParser=r.ColumnParser=void 0;var n=e(\"./ColumnParser\");Object.defineProperty(r,\"ColumnParser\",{enumerable:!0,get:function(){return n.ColumnParser}});var i=e(\"./NonQuotedColumnParser\");Object.defineProperty(r,\"NonQuotedColumnParser\",{enumerable:!0,get:function(){return i.NonQuotedColumnParser}});var s=e(\"./QuotedColumnParser\");Object.defineProperty(r,\"QuotedColumnParser\",{enumerable:!0,get:function(){return s.QuotedColumnParser}});var o=e(\"./ColumnFormatter\");Object.defineProperty(r,\"ColumnFormatter\",{enumerable:!0,get:function(){return o.ColumnFormatter}})},{\"./ColumnFormatter\":160,\"./ColumnParser\":161,\"./NonQuotedColumnParser\":162,\"./QuotedColumnParser\":163}],165:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.QuotedColumnParser=r.NonQuotedColumnParser=r.ColumnParser=r.Token=r.Scanner=r.RowParser=r.Parser=void 0;var n=e(\"./Parser\");Object.defineProperty(r,\"Parser\",{enumerable:!0,get:function(){return n.Parser}});var i=e(\"./RowParser\");Object.defineProperty(r,\"RowParser\",{enumerable:!0,get:function(){return i.RowParser}});var s=e(\"./Scanner\");Object.defineProperty(r,\"Scanner\",{enumerable:!0,get:function(){return s.Scanner}});var o=e(\"./Token\");Object.defineProperty(r,\"Token\",{enumerable:!0,get:function(){return o.Token}});var a=e(\"./column\");Object.defineProperty(r,\"ColumnParser\",{enumerable:!0,get:function(){return a.ColumnParser}}),Object.defineProperty(r,\"NonQuotedColumnParser\",{enumerable:!0,get:function(){return a.NonQuotedColumnParser}}),Object.defineProperty(r,\"QuotedColumnParser\",{enumerable:!0,get:function(){return a.QuotedColumnParser}})},{\"./Parser\":156,\"./RowParser\":157,\"./Scanner\":158,\"./Token\":159,\"./column\":164}],166:[function(e,t,r){\"use strict\";var n=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(r,\"__esModule\",{value:!0}),r.HeaderTransformer=void 0;const i=n(e(\"lodash.isundefined\")),s=n(e(\"lodash.isfunction\")),o=n(e(\"lodash.uniq\")),a=n(e(\"lodash.groupby\"));r.HeaderTransformer=class{constructor(e){this.headers=null,this.receivedHeaders=!1,this.shouldUseFirstRow=!1,this.processedFirstRow=!1,this.headersLength=0,this.parserOptions=e,!0===e.headers?this.shouldUseFirstRow=!0:Array.isArray(e.headers)?this.setHeaders(e.headers):s.default(e.headers)&&(this.headersTransform=e.headers)}transform(e,t){return this.shouldMapRow(e)?t(null,this.processRow(e)):t(null,{row:null,isValid:!0})}shouldMapRow(e){const{parserOptions:t}=this;if(!this.headersTransform&&t.renameHeaders&&!this.processedFirstRow){if(!this.receivedHeaders)throw new Error(\"Error renaming headers: new headers must be provided in an array\");return this.processedFirstRow=!0,!1}if(!this.receivedHeaders&&Array.isArray(e)){if(this.headersTransform)this.setHeaders(this.headersTransform(e));else{if(!this.shouldUseFirstRow)return!0;this.setHeaders(e)}return!1}return!0}processRow(e){if(!this.headers)return{row:e,isValid:!0};const{parserOptions:t}=this;if(!t.discardUnmappedColumns&&e.length>this.headersLength){if(!t.strictColumnHandling)throw new Error(`Unexpected Error: column header mismatch expected: ${this.headersLength} columns got: ${e.length}`);return{row:e,isValid:!1,reason:`Column header mismatch expected: ${this.headersLength} columns got: ${e.length}`}}return t.strictColumnHandling&&e.length<this.headersLength?{row:e,isValid:!1,reason:`Column header mismatch expected: ${this.headersLength} columns got: ${e.length}`}:{row:this.mapHeaders(e),isValid:!0}}mapHeaders(e){const t={},{headers:r,headersLength:n}=this;for(let s=0;s<n;s+=1){const n=r[s];if(!i.default(n)){const r=e[s];i.default(r)?t[n]=\"\":t[n]=r}}return t}setHeaders(e){var t;const r=e.filter(e=>!!e);if(o.default(r).length!==r.length){const e=a.default(r),t=Object.keys(e).filter(t=>e[t].length>1);throw new Error(\"Duplicate headers found \"+JSON.stringify(t))}this.headers=e,this.receivedHeaders=!0,this.headersLength=(null===(t=this.headers)||void 0===t?void 0:t.length)||0}}},{\"lodash.groupby\":443,\"lodash.isfunction\":446,\"lodash.isundefined\":448,\"lodash.uniq\":449}],167:[function(e,t,r){\"use strict\";var n=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(r,\"__esModule\",{value:!0}),r.RowTransformerValidator=void 0;const i=n(e(\"lodash.isfunction\")),s=e(\"../types\");class o{constructor(){this._rowTransform=null,this._rowValidator=null}static createTransform(e){return s.isSyncTransform(e)?(t,r)=>{let n=null;try{n=e(t)}catch(e){return r(e)}return r(null,n)}:e}static createValidator(e){return s.isSyncValidate(e)?(t,r)=>{r(null,{row:t,isValid:e(t)})}:(t,r)=>{e(t,(e,n,i)=>e?r(e):r(null,n?{row:t,isValid:n,reason:i}:{row:t,isValid:!1,reason:i}))}}set rowTransform(e){if(!i.default(e))throw new TypeError(\"The transform should be a function\");this._rowTransform=o.createTransform(e)}set rowValidator(e){if(!i.default(e))throw new TypeError(\"The validate should be a function\");this._rowValidator=o.createValidator(e)}transformAndValidate(e,t){return this.callTransformer(e,(e,r)=>e?t(e):r?this.callValidator(r,(e,n)=>e?t(e):n&&!n.isValid?t(null,{row:r,isValid:!1,reason:n.reason}):t(null,{row:r,isValid:!0})):t(null,{row:null,isValid:!0}))}callTransformer(e,t){return this._rowTransform?this._rowTransform(e,t):t(null,e)}callValidator(e,t){return this._rowValidator?this._rowValidator(e,t):t(null,{row:e,isValid:!0})}}r.RowTransformerValidator=o},{\"../types\":169,\"lodash.isfunction\":446}],168:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.HeaderTransformer=r.RowTransformerValidator=void 0;var n=e(\"./RowTransformerValidator\");Object.defineProperty(r,\"RowTransformerValidator\",{enumerable:!0,get:function(){return n.RowTransformerValidator}});var i=e(\"./HeaderTransformer\");Object.defineProperty(r,\"HeaderTransformer\",{enumerable:!0,get:function(){return i.HeaderTransformer}})},{\"./HeaderTransformer\":166,\"./RowTransformerValidator\":167}],169:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.isSyncValidate=r.isSyncTransform=void 0,r.isSyncTransform=e=>1===e.length,r.isSyncValidate=e=>1===e.length},{}],170:[function(e,t,r){\"use strict\";const n=r;n.bignum=e(\"bn.js\"),n.define=e(\"./asn1/api\").define,n.base=e(\"./asn1/base\"),n.constants=e(\"./asn1/constants\"),n.decoders=e(\"./asn1/decoders\"),n.encoders=e(\"./asn1/encoders\")},{\"./asn1/api\":171,\"./asn1/base\":173,\"./asn1/constants\":177,\"./asn1/decoders\":179,\"./asn1/encoders\":182,\"bn.js\":184}],171:[function(e,t,r){\"use strict\";const n=e(\"./encoders\"),i=e(\"./decoders\"),s=e(\"inherits\");function o(e,t){this.name=e,this.body=t,this.decoders={},this.encoders={}}r.define=function(e,t){return new o(e,t)},o.prototype._createNamed=function(e){const t=this.name;function r(e){this._initNamed(e,t)}return s(r,e),r.prototype._initNamed=function(t,r){e.call(this,t,r)},new r(this)},o.prototype._getDecoder=function(e){return e=e||\"der\",this.decoders.hasOwnProperty(e)||(this.decoders[e]=this._createNamed(i[e])),this.decoders[e]},o.prototype.decode=function(e,t,r){return this._getDecoder(t).decode(e,r)},o.prototype._getEncoder=function(e){return e=e||\"der\",this.encoders.hasOwnProperty(e)||(this.encoders[e]=this._createNamed(n[e])),this.encoders[e]},o.prototype.encode=function(e,t,r){return this._getEncoder(t).encode(e,r)}},{\"./decoders\":179,\"./encoders\":182,inherits:440}],172:[function(e,t,r){\"use strict\";const n=e(\"inherits\"),i=e(\"../base/reporter\").Reporter,s=e(\"safer-buffer\").Buffer;function o(e,t){i.call(this,t),s.isBuffer(e)?(this.base=e,this.offset=0,this.length=e.length):this.error(\"Input not Buffer\")}function a(e,t){if(Array.isArray(e))this.length=0,this.value=e.map((function(e){return a.isEncoderBuffer(e)||(e=new a(e,t)),this.length+=e.length,e}),this);else if(\"number\"==typeof e){if(!(0<=e&&e<=255))return t.error(\"non-byte EncoderBuffer value\");this.value=e,this.length=1}else if(\"string\"==typeof e)this.value=e,this.length=s.byteLength(e);else{if(!s.isBuffer(e))return t.error(\"Unsupported type: \"+typeof e);this.value=e,this.length=e.length}}n(o,i),r.DecoderBuffer=o,o.isDecoderBuffer=function(e){if(e instanceof o)return!0;return\"object\"==typeof e&&s.isBuffer(e.base)&&\"DecoderBuffer\"===e.constructor.name&&\"number\"==typeof e.offset&&\"number\"==typeof e.length&&\"function\"==typeof e.save&&\"function\"==typeof e.restore&&\"function\"==typeof e.isEmpty&&\"function\"==typeof e.readUInt8&&\"function\"==typeof e.skip&&\"function\"==typeof e.raw},o.prototype.save=function(){return{offset:this.offset,reporter:i.prototype.save.call(this)}},o.prototype.restore=function(e){const t=new o(this.base);return t.offset=e.offset,t.length=this.offset,this.offset=e.offset,i.prototype.restore.call(this,e.reporter),t},o.prototype.isEmpty=function(){return this.offset===this.length},o.prototype.readUInt8=function(e){return this.offset+1<=this.length?this.base.readUInt8(this.offset++,!0):this.error(e||\"DecoderBuffer overrun\")},o.prototype.skip=function(e,t){if(!(this.offset+e<=this.length))return this.error(t||\"DecoderBuffer overrun\");const r=new o(this.base);return r._reporterState=this._reporterState,r.offset=this.offset,r.length=this.offset+e,this.offset+=e,r},o.prototype.raw=function(e){return this.base.slice(e?e.offset:this.offset,this.length)},r.EncoderBuffer=a,a.isEncoderBuffer=function(e){if(e instanceof a)return!0;return\"object\"==typeof e&&\"EncoderBuffer\"===e.constructor.name&&\"number\"==typeof e.length&&\"function\"==typeof e.join},a.prototype.join=function(e,t){return e||(e=s.alloc(this.length)),t||(t=0),0===this.length||(Array.isArray(this.value)?this.value.forEach((function(r){r.join(e,t),t+=r.length})):(\"number\"==typeof this.value?e[t]=this.value:\"string\"==typeof this.value?e.write(this.value,t):s.isBuffer(this.value)&&this.value.copy(e,t),t+=this.length)),e}},{\"../base/reporter\":175,inherits:440,\"safer-buffer\":495}],173:[function(e,t,r){\"use strict\";const n=r;n.Reporter=e(\"./reporter\").Reporter,n.DecoderBuffer=e(\"./buffer\").DecoderBuffer,n.EncoderBuffer=e(\"./buffer\").EncoderBuffer,n.Node=e(\"./node\")},{\"./buffer\":172,\"./node\":174,\"./reporter\":175}],174:[function(e,t,r){\"use strict\";const n=e(\"../base/reporter\").Reporter,i=e(\"../base/buffer\").EncoderBuffer,s=e(\"../base/buffer\").DecoderBuffer,o=e(\"minimalistic-assert\"),a=[\"seq\",\"seqof\",\"set\",\"setof\",\"objid\",\"bool\",\"gentime\",\"utctime\",\"null_\",\"enum\",\"int\",\"objDesc\",\"bitstr\",\"bmpstr\",\"charstr\",\"genstr\",\"graphstr\",\"ia5str\",\"iso646str\",\"numstr\",\"octstr\",\"printstr\",\"t61str\",\"unistr\",\"utf8str\",\"videostr\"],l=[\"key\",\"obj\",\"use\",\"optional\",\"explicit\",\"implicit\",\"def\",\"choice\",\"any\",\"contains\"].concat(a);function c(e,t,r){const n={};this._baseState=n,n.name=r,n.enc=e,n.parent=t||null,n.children=null,n.tag=null,n.args=null,n.reverseArgs=null,n.choice=null,n.optional=!1,n.any=!1,n.obj=!1,n.use=null,n.useDecoder=null,n.key=null,n.default=null,n.explicit=null,n.implicit=null,n.contains=null,n.parent||(n.children=[],this._wrap())}t.exports=c;const u=[\"enc\",\"parent\",\"children\",\"tag\",\"args\",\"reverseArgs\",\"choice\",\"optional\",\"any\",\"obj\",\"use\",\"alteredUse\",\"key\",\"default\",\"explicit\",\"implicit\",\"contains\"];c.prototype.clone=function(){const e=this._baseState,t={};u.forEach((function(r){t[r]=e[r]}));const r=new this.constructor(t.parent);return r._baseState=t,r},c.prototype._wrap=function(){const e=this._baseState;l.forEach((function(t){this[t]=function(){const r=new this.constructor(this);return e.children.push(r),r[t].apply(r,arguments)}}),this)},c.prototype._init=function(e){const t=this._baseState;o(null===t.parent),e.call(this),t.children=t.children.filter((function(e){return e._baseState.parent===this}),this),o.equal(t.children.length,1,\"Root node can have only one child\")},c.prototype._useArgs=function(e){const t=this._baseState,r=e.filter((function(e){return e instanceof this.constructor}),this);e=e.filter((function(e){return!(e instanceof this.constructor)}),this),0!==r.length&&(o(null===t.children),t.children=r,r.forEach((function(e){e._baseState.parent=this}),this)),0!==e.length&&(o(null===t.args),t.args=e,t.reverseArgs=e.map((function(e){if(\"object\"!=typeof e||e.constructor!==Object)return e;const t={};return Object.keys(e).forEach((function(r){r==(0|r)&&(r|=0);const n=e[r];t[n]=r})),t})))},[\"_peekTag\",\"_decodeTag\",\"_use\",\"_decodeStr\",\"_decodeObjid\",\"_decodeTime\",\"_decodeNull\",\"_decodeInt\",\"_decodeBool\",\"_decodeList\",\"_encodeComposite\",\"_encodeStr\",\"_encodeObjid\",\"_encodeTime\",\"_encodeNull\",\"_encodeInt\",\"_encodeBool\"].forEach((function(e){c.prototype[e]=function(){const t=this._baseState;throw new Error(e+\" not implemented for encoding: \"+t.enc)}})),a.forEach((function(e){c.prototype[e]=function(){const t=this._baseState,r=Array.prototype.slice.call(arguments);return o(null===t.tag),t.tag=e,this._useArgs(r),this}})),c.prototype.use=function(e){o(e);const t=this._baseState;return o(null===t.use),t.use=e,this},c.prototype.optional=function(){return this._baseState.optional=!0,this},c.prototype.def=function(e){const t=this._baseState;return o(null===t.default),t.default=e,t.optional=!0,this},c.prototype.explicit=function(e){const t=this._baseState;return o(null===t.explicit&&null===t.implicit),t.explicit=e,this},c.prototype.implicit=function(e){const t=this._baseState;return o(null===t.explicit&&null===t.implicit),t.implicit=e,this},c.prototype.obj=function(){const e=this._baseState,t=Array.prototype.slice.call(arguments);return e.obj=!0,0!==t.length&&this._useArgs(t),this},c.prototype.key=function(e){const t=this._baseState;return o(null===t.key),t.key=e,this},c.prototype.any=function(){return this._baseState.any=!0,this},c.prototype.choice=function(e){const t=this._baseState;return o(null===t.choice),t.choice=e,this._useArgs(Object.keys(e).map((function(t){return e[t]}))),this},c.prototype.contains=function(e){const t=this._baseState;return o(null===t.use),t.contains=e,this},c.prototype._decode=function(e,t){const r=this._baseState;if(null===r.parent)return e.wrapResult(r.children[0]._decode(e,t));let n,i=r.default,o=!0,a=null;if(null!==r.key&&(a=e.enterKey(r.key)),r.optional){let n=null;if(null!==r.explicit?n=r.explicit:null!==r.implicit?n=r.implicit:null!==r.tag&&(n=r.tag),null!==n||r.any){if(o=this._peekTag(e,n,r.any),e.isError(o))return o}else{const n=e.save();try{null===r.choice?this._decodeGeneric(r.tag,e,t):this._decodeChoice(e,t),o=!0}catch(e){o=!1}e.restore(n)}}if(r.obj&&o&&(n=e.enterObject()),o){if(null!==r.explicit){const t=this._decodeTag(e,r.explicit);if(e.isError(t))return t;e=t}const n=e.offset;if(null===r.use&&null===r.choice){let t;r.any&&(t=e.save());const n=this._decodeTag(e,null!==r.implicit?r.implicit:r.tag,r.any);if(e.isError(n))return n;r.any?i=e.raw(t):e=n}if(t&&t.track&&null!==r.tag&&t.track(e.path(),n,e.length,\"tagged\"),t&&t.track&&null!==r.tag&&t.track(e.path(),e.offset,e.length,\"content\"),r.any||(i=null===r.choice?this._decodeGeneric(r.tag,e,t):this._decodeChoice(e,t)),e.isError(i))return i;if(r.any||null!==r.choice||null===r.children||r.children.forEach((function(r){r._decode(e,t)})),r.contains&&(\"octstr\"===r.tag||\"bitstr\"===r.tag)){const n=new s(i);i=this._getUse(r.contains,e._reporterState.obj)._decode(n,t)}}return r.obj&&o&&(i=e.leaveObject(n)),null===r.key||null===i&&!0!==o?null!==a&&e.exitKey(a):e.leaveKey(a,r.key,i),i},c.prototype._decodeGeneric=function(e,t,r){const n=this._baseState;return\"seq\"===e||\"set\"===e?null:\"seqof\"===e||\"setof\"===e?this._decodeList(t,e,n.args[0],r):/str$/.test(e)?this._decodeStr(t,e,r):\"objid\"===e&&n.args?this._decodeObjid(t,n.args[0],n.args[1],r):\"objid\"===e?this._decodeObjid(t,null,null,r):\"gentime\"===e||\"utctime\"===e?this._decodeTime(t,e,r):\"null_\"===e?this._decodeNull(t,r):\"bool\"===e?this._decodeBool(t,r):\"objDesc\"===e?this._decodeStr(t,e,r):\"int\"===e||\"enum\"===e?this._decodeInt(t,n.args&&n.args[0],r):null!==n.use?this._getUse(n.use,t._reporterState.obj)._decode(t,r):t.error(\"unknown tag: \"+e)},c.prototype._getUse=function(e,t){const r=this._baseState;return r.useDecoder=this._use(e,t),o(null===r.useDecoder._baseState.parent),r.useDecoder=r.useDecoder._baseState.children[0],r.implicit!==r.useDecoder._baseState.implicit&&(r.useDecoder=r.useDecoder.clone(),r.useDecoder._baseState.implicit=r.implicit),r.useDecoder},c.prototype._decodeChoice=function(e,t){const r=this._baseState;let n=null,i=!1;return Object.keys(r.choice).some((function(s){const o=e.save(),a=r.choice[s];try{const r=a._decode(e,t);if(e.isError(r))return!1;n={type:s,value:r},i=!0}catch(t){return e.restore(o),!1}return!0}),this),i?n:e.error(\"Choice not matched\")},c.prototype._createEncoderBuffer=function(e){return new i(e,this.reporter)},c.prototype._encode=function(e,t,r){const n=this._baseState;if(null!==n.default&&n.default===e)return;const i=this._encodeValue(e,t,r);return void 0===i||this._skipDefault(i,t,r)?void 0:i},c.prototype._encodeValue=function(e,t,r){const i=this._baseState;if(null===i.parent)return i.children[0]._encode(e,t||new n);let s=null;if(this.reporter=t,i.optional&&void 0===e){if(null===i.default)return;e=i.default}let o=null,a=!1;if(i.any)s=this._createEncoderBuffer(e);else if(i.choice)s=this._encodeChoice(e,t);else if(i.contains)o=this._getUse(i.contains,r)._encode(e,t),a=!0;else if(i.children)o=i.children.map((function(r){if(\"null_\"===r._baseState.tag)return r._encode(null,t,e);if(null===r._baseState.key)return t.error(\"Child should have a key\");const n=t.enterKey(r._baseState.key);if(\"object\"!=typeof e)return t.error(\"Child expected, but input is not object\");const i=r._encode(e[r._baseState.key],t,e);return t.leaveKey(n),i}),this).filter((function(e){return e})),o=this._createEncoderBuffer(o);else if(\"seqof\"===i.tag||\"setof\"===i.tag){if(!i.args||1!==i.args.length)return t.error(\"Too many args for : \"+i.tag);if(!Array.isArray(e))return t.error(\"seqof/setof, but data is not Array\");const r=this.clone();r._baseState.implicit=null,o=this._createEncoderBuffer(e.map((function(r){const n=this._baseState;return this._getUse(n.args[0],e)._encode(r,t)}),r))}else null!==i.use?s=this._getUse(i.use,r)._encode(e,t):(o=this._encodePrimitive(i.tag,e),a=!0);if(!i.any&&null===i.choice){const e=null!==i.implicit?i.implicit:i.tag,r=null===i.implicit?\"universal\":\"context\";null===e?null===i.use&&t.error(\"Tag could be omitted only for .use()\"):null===i.use&&(s=this._encodeComposite(e,a,r,o))}return null!==i.explicit&&(s=this._encodeComposite(i.explicit,!1,\"context\",s)),s},c.prototype._encodeChoice=function(e,t){const r=this._baseState,n=r.choice[e.type];return n||o(!1,e.type+\" not found in \"+JSON.stringify(Object.keys(r.choice))),n._encode(e.value,t)},c.prototype._encodePrimitive=function(e,t){const r=this._baseState;if(/str$/.test(e))return this._encodeStr(t,e);if(\"objid\"===e&&r.args)return this._encodeObjid(t,r.reverseArgs[0],r.args[1]);if(\"objid\"===e)return this._encodeObjid(t,null,null);if(\"gentime\"===e||\"utctime\"===e)return this._encodeTime(t,e);if(\"null_\"===e)return this._encodeNull();if(\"int\"===e||\"enum\"===e)return this._encodeInt(t,r.args&&r.reverseArgs[0]);if(\"bool\"===e)return this._encodeBool(t);if(\"objDesc\"===e)return this._encodeStr(t,e);throw new Error(\"Unsupported tag: \"+e)},c.prototype._isNumstr=function(e){return/^[0-9 ]*$/.test(e)},c.prototype._isPrintstr=function(e){return/^[A-Za-z0-9 '()+,-./:=?]*$/.test(e)}},{\"../base/buffer\":172,\"../base/reporter\":175,\"minimalistic-assert\":453}],175:[function(e,t,r){\"use strict\";const n=e(\"inherits\");function i(e){this._reporterState={obj:null,path:[],options:e||{},errors:[]}}function s(e,t){this.path=e,this.rethrow(t)}r.Reporter=i,i.prototype.isError=function(e){return e instanceof s},i.prototype.save=function(){const e=this._reporterState;return{obj:e.obj,pathLen:e.path.length}},i.prototype.restore=function(e){const t=this._reporterState;t.obj=e.obj,t.path=t.path.slice(0,e.pathLen)},i.prototype.enterKey=function(e){return this._reporterState.path.push(e)},i.prototype.exitKey=function(e){const t=this._reporterState;t.path=t.path.slice(0,e-1)},i.prototype.leaveKey=function(e,t,r){const n=this._reporterState;this.exitKey(e),null!==n.obj&&(n.obj[t]=r)},i.prototype.path=function(){return this._reporterState.path.join(\"/\")},i.prototype.enterObject=function(){const e=this._reporterState,t=e.obj;return e.obj={},t},i.prototype.leaveObject=function(e){const t=this._reporterState,r=t.obj;return t.obj=e,r},i.prototype.error=function(e){let t;const r=this._reporterState,n=e instanceof s;if(t=n?e:new s(r.path.map((function(e){return\"[\"+JSON.stringify(e)+\"]\"})).join(\"\"),e.message||e,e.stack),!r.options.partial)throw t;return n||r.errors.push(t),t},i.prototype.wrapResult=function(e){const t=this._reporterState;return t.options.partial?{result:this.isError(e)?null:e,errors:t.errors}:e},n(s,Error),s.prototype.rethrow=function(e){if(this.message=e+\" at: \"+(this.path||\"(shallow)\"),Error.captureStackTrace&&Error.captureStackTrace(this,s),!this.stack)try{throw new Error(this.message)}catch(e){this.stack=e.stack}return this}},{inherits:440}],176:[function(e,t,r){\"use strict\";function n(e){const t={};return Object.keys(e).forEach((function(r){(0|r)==r&&(r|=0);const n=e[r];t[n]=r})),t}r.tagClass={0:\"universal\",1:\"application\",2:\"context\",3:\"private\"},r.tagClassByName=n(r.tagClass),r.tag={0:\"end\",1:\"bool\",2:\"int\",3:\"bitstr\",4:\"octstr\",5:\"null_\",6:\"objid\",7:\"objDesc\",8:\"external\",9:\"real\",10:\"enum\",11:\"embed\",12:\"utf8str\",13:\"relativeOid\",16:\"seq\",17:\"set\",18:\"numstr\",19:\"printstr\",20:\"t61str\",21:\"videostr\",22:\"ia5str\",23:\"utctime\",24:\"gentime\",25:\"graphstr\",26:\"iso646str\",27:\"genstr\",28:\"unistr\",29:\"charstr\",30:\"bmpstr\"},r.tagByName=n(r.tag)},{}],177:[function(e,t,r){\"use strict\";const n=r;n._reverse=function(e){const t={};return Object.keys(e).forEach((function(r){(0|r)==r&&(r|=0);const n=e[r];t[n]=r})),t},n.der=e(\"./der\")},{\"./der\":176}],178:[function(e,t,r){\"use strict\";const n=e(\"inherits\"),i=e(\"bn.js\"),s=e(\"../base/buffer\").DecoderBuffer,o=e(\"../base/node\"),a=e(\"../constants/der\");function l(e){this.enc=\"der\",this.name=e.name,this.entity=e,this.tree=new c,this.tree._init(e.body)}function c(e){o.call(this,\"der\",e)}function u(e,t){let r=e.readUInt8(t);if(e.isError(r))return r;const n=a.tagClass[r>>6],i=0==(32&r);if(31==(31&r)){let n=r;for(r=0;128==(128&n);){if(n=e.readUInt8(t),e.isError(n))return n;r<<=7,r|=127&n}}else r&=31;return{cls:n,primitive:i,tag:r,tagStr:a.tag[r]}}function h(e,t,r){let n=e.readUInt8(r);if(e.isError(n))return n;if(!t&&128===n)return null;if(0==(128&n))return n;const i=127&n;if(i>4)return e.error(\"length octect is too long\");n=0;for(let t=0;t<i;t++){n<<=8;const t=e.readUInt8(r);if(e.isError(t))return t;n|=t}return n}t.exports=l,l.prototype.decode=function(e,t){return s.isDecoderBuffer(e)||(e=new s(e,t)),this.tree._decode(e,t)},n(c,o),c.prototype._peekTag=function(e,t,r){if(e.isEmpty())return!1;const n=e.save(),i=u(e,'Failed to peek tag: \"'+t+'\"');return e.isError(i)?i:(e.restore(n),i.tag===t||i.tagStr===t||i.tagStr+\"of\"===t||r)},c.prototype._decodeTag=function(e,t,r){const n=u(e,'Failed to decode tag of \"'+t+'\"');if(e.isError(n))return n;let i=h(e,n.primitive,'Failed to get length of \"'+t+'\"');if(e.isError(i))return i;if(!r&&n.tag!==t&&n.tagStr!==t&&n.tagStr+\"of\"!==t)return e.error('Failed to match tag: \"'+t+'\"');if(n.primitive||null!==i)return e.skip(i,'Failed to match body of: \"'+t+'\"');const s=e.save(),o=this._skipUntilEnd(e,'Failed to skip indefinite length body: \"'+this.tag+'\"');return e.isError(o)?o:(i=e.offset-s.offset,e.restore(s),e.skip(i,'Failed to match body of: \"'+t+'\"'))},c.prototype._skipUntilEnd=function(e,t){for(;;){const r=u(e,t);if(e.isError(r))return r;const n=h(e,r.primitive,t);if(e.isError(n))return n;let i;if(i=r.primitive||null!==n?e.skip(n):this._skipUntilEnd(e,t),e.isError(i))return i;if(\"end\"===r.tagStr)break}},c.prototype._decodeList=function(e,t,r,n){const i=[];for(;!e.isEmpty();){const t=this._peekTag(e,\"end\");if(e.isError(t))return t;const s=r.decode(e,\"der\",n);if(e.isError(s)&&t)break;i.push(s)}return i},c.prototype._decodeStr=function(e,t){if(\"bitstr\"===t){const t=e.readUInt8();return e.isError(t)?t:{unused:t,data:e.raw()}}if(\"bmpstr\"===t){const t=e.raw();if(t.length%2==1)return e.error(\"Decoding of string type: bmpstr length mismatch\");let r=\"\";for(let e=0;e<t.length/2;e++)r+=String.fromCharCode(t.readUInt16BE(2*e));return r}if(\"numstr\"===t){const t=e.raw().toString(\"ascii\");return this._isNumstr(t)?t:e.error(\"Decoding of string type: numstr unsupported characters\")}if(\"octstr\"===t)return e.raw();if(\"objDesc\"===t)return e.raw();if(\"printstr\"===t){const t=e.raw().toString(\"ascii\");return this._isPrintstr(t)?t:e.error(\"Decoding of string type: printstr unsupported characters\")}return/str$/.test(t)?e.raw().toString():e.error(\"Decoding of string type: \"+t+\" unsupported\")},c.prototype._decodeObjid=function(e,t,r){let n;const i=[];let s=0,o=0;for(;!e.isEmpty();)o=e.readUInt8(),s<<=7,s|=127&o,0==(128&o)&&(i.push(s),s=0);128&o&&i.push(s);const a=i[0]/40|0,l=i[0]%40;if(n=r?i:[a,l].concat(i.slice(1)),t){let e=t[n.join(\" \")];void 0===e&&(e=t[n.join(\".\")]),void 0!==e&&(n=e)}return n},c.prototype._decodeTime=function(e,t){const r=e.raw().toString();let n,i,s,o,a,l;if(\"gentime\"===t)n=0|r.slice(0,4),i=0|r.slice(4,6),s=0|r.slice(6,8),o=0|r.slice(8,10),a=0|r.slice(10,12),l=0|r.slice(12,14);else{if(\"utctime\"!==t)return e.error(\"Decoding \"+t+\" time is not supported yet\");n=0|r.slice(0,2),i=0|r.slice(2,4),s=0|r.slice(4,6),o=0|r.slice(6,8),a=0|r.slice(8,10),l=0|r.slice(10,12),n=n<70?2e3+n:1900+n}return Date.UTC(n,i-1,s,o,a,l,0)},c.prototype._decodeNull=function(){return null},c.prototype._decodeBool=function(e){const t=e.readUInt8();return e.isError(t)?t:0!==t},c.prototype._decodeInt=function(e,t){const r=e.raw();let n=new i(r);return t&&(n=t[n.toString(10)]||n),n},c.prototype._use=function(e,t){return\"function\"==typeof e&&(e=e(t)),e._getDecoder(\"der\").tree}},{\"../base/buffer\":172,\"../base/node\":174,\"../constants/der\":176,\"bn.js\":184,inherits:440}],179:[function(e,t,r){\"use strict\";const n=r;n.der=e(\"./der\"),n.pem=e(\"./pem\")},{\"./der\":178,\"./pem\":180}],180:[function(e,t,r){\"use strict\";const n=e(\"inherits\"),i=e(\"safer-buffer\").Buffer,s=e(\"./der\");function o(e){s.call(this,e),this.enc=\"pem\"}n(o,s),t.exports=o,o.prototype.decode=function(e,t){const r=e.toString().split(/[\\r\\n]+/g),n=t.label.toUpperCase(),o=/^-----(BEGIN|END) ([^-]+)-----$/;let a=-1,l=-1;for(let e=0;e<r.length;e++){const t=r[e].match(o);if(null!==t&&t[2]===n){if(-1!==a){if(\"END\"!==t[1])break;l=e;break}if(\"BEGIN\"!==t[1])break;a=e}}if(-1===a||-1===l)throw new Error(\"PEM section not found for: \"+n);const c=r.slice(a+1,l).join(\"\");c.replace(/[^a-z0-9+/=]+/gi,\"\");const u=i.from(c,\"base64\");return s.prototype.decode.call(this,u,t)}},{\"./der\":178,inherits:440,\"safer-buffer\":495}],181:[function(e,t,r){\"use strict\";const n=e(\"inherits\"),i=e(\"safer-buffer\").Buffer,s=e(\"../base/node\"),o=e(\"../constants/der\");function a(e){this.enc=\"der\",this.name=e.name,this.entity=e,this.tree=new l,this.tree._init(e.body)}function l(e){s.call(this,\"der\",e)}function c(e){return e<10?\"0\"+e:e}t.exports=a,a.prototype.encode=function(e,t){return this.tree._encode(e,t).join()},n(l,s),l.prototype._encodeComposite=function(e,t,r,n){const s=function(e,t,r,n){let i;\"seqof\"===e?e=\"seq\":\"setof\"===e&&(e=\"set\");if(o.tagByName.hasOwnProperty(e))i=o.tagByName[e];else{if(\"number\"!=typeof e||(0|e)!==e)return n.error(\"Unknown tag: \"+e);i=e}if(i>=31)return n.error(\"Multi-octet tag encoding unsupported\");t||(i|=32);return i|=o.tagClassByName[r||\"universal\"]<<6,i}(e,t,r,this.reporter);if(n.length<128){const e=i.alloc(2);return e[0]=s,e[1]=n.length,this._createEncoderBuffer([e,n])}let a=1;for(let e=n.length;e>=256;e>>=8)a++;const l=i.alloc(2+a);l[0]=s,l[1]=128|a;for(let e=1+a,t=n.length;t>0;e--,t>>=8)l[e]=255&t;return this._createEncoderBuffer([l,n])},l.prototype._encodeStr=function(e,t){if(\"bitstr\"===t)return this._createEncoderBuffer([0|e.unused,e.data]);if(\"bmpstr\"===t){const t=i.alloc(2*e.length);for(let r=0;r<e.length;r++)t.writeUInt16BE(e.charCodeAt(r),2*r);return this._createEncoderBuffer(t)}return\"numstr\"===t?this._isNumstr(e)?this._createEncoderBuffer(e):this.reporter.error(\"Encoding of string type: numstr supports only digits and space\"):\"printstr\"===t?this._isPrintstr(e)?this._createEncoderBuffer(e):this.reporter.error(\"Encoding of string type: printstr supports only latin upper and lower case letters, digits, space, apostrophe, left and rigth parenthesis, plus sign, comma, hyphen, dot, slash, colon, equal sign, question mark\"):/str$/.test(t)||\"objDesc\"===t?this._createEncoderBuffer(e):this.reporter.error(\"Encoding of string type: \"+t+\" unsupported\")},l.prototype._encodeObjid=function(e,t,r){if(\"string\"==typeof e){if(!t)return this.reporter.error(\"string objid given, but no values map found\");if(!t.hasOwnProperty(e))return this.reporter.error(\"objid not found in values map\");e=t[e].split(/[\\s.]+/g);for(let t=0;t<e.length;t++)e[t]|=0}else if(Array.isArray(e)){e=e.slice();for(let t=0;t<e.length;t++)e[t]|=0}if(!Array.isArray(e))return this.reporter.error(\"objid() should be either array or string, got: \"+JSON.stringify(e));if(!r){if(e[1]>=40)return this.reporter.error(\"Second objid identifier OOB\");e.splice(0,2,40*e[0]+e[1])}let n=0;for(let t=0;t<e.length;t++){let r=e[t];for(n++;r>=128;r>>=7)n++}const s=i.alloc(n);let o=s.length-1;for(let t=e.length-1;t>=0;t--){let r=e[t];for(s[o--]=127&r;(r>>=7)>0;)s[o--]=128|127&r}return this._createEncoderBuffer(s)},l.prototype._encodeTime=function(e,t){let r;const n=new Date(e);return\"gentime\"===t?r=[c(n.getUTCFullYear()),c(n.getUTCMonth()+1),c(n.getUTCDate()),c(n.getUTCHours()),c(n.getUTCMinutes()),c(n.getUTCSeconds()),\"Z\"].join(\"\"):\"utctime\"===t?r=[c(n.getUTCFullYear()%100),c(n.getUTCMonth()+1),c(n.getUTCDate()),c(n.getUTCHours()),c(n.getUTCMinutes()),c(n.getUTCSeconds()),\"Z\"].join(\"\"):this.reporter.error(\"Encoding \"+t+\" time is not supported yet\"),this._encodeStr(r,\"octstr\")},l.prototype._encodeNull=function(){return this._createEncoderBuffer(\"\")},l.prototype._encodeInt=function(e,t){if(\"string\"==typeof e){if(!t)return this.reporter.error(\"String int or enum given, but no values map\");if(!t.hasOwnProperty(e))return this.reporter.error(\"Values map doesn't contain: \"+JSON.stringify(e));e=t[e]}if(\"number\"!=typeof e&&!i.isBuffer(e)){const t=e.toArray();!e.sign&&128&t[0]&&t.unshift(0),e=i.from(t)}if(i.isBuffer(e)){let t=e.length;0===e.length&&t++;const r=i.alloc(t);return e.copy(r),0===e.length&&(r[0]=0),this._createEncoderBuffer(r)}if(e<128)return this._createEncoderBuffer(e);if(e<256)return this._createEncoderBuffer([0,e]);let r=1;for(let t=e;t>=256;t>>=8)r++;const n=new Array(r);for(let t=n.length-1;t>=0;t--)n[t]=255&e,e>>=8;return 128&n[0]&&n.unshift(0),this._createEncoderBuffer(i.from(n))},l.prototype._encodeBool=function(e){return this._createEncoderBuffer(e?255:0)},l.prototype._use=function(e,t){return\"function\"==typeof e&&(e=e(t)),e._getEncoder(\"der\").tree},l.prototype._skipDefault=function(e,t,r){const n=this._baseState;let i;if(null===n.default)return!1;const s=e.join();if(void 0===n.defaultBuffer&&(n.defaultBuffer=this._encodeValue(n.default,t,r).join()),s.length!==n.defaultBuffer.length)return!1;for(i=0;i<s.length;i++)if(s[i]!==n.defaultBuffer[i])return!1;return!0}},{\"../base/node\":174,\"../constants/der\":176,inherits:440,\"safer-buffer\":495}],182:[function(e,t,r){\"use strict\";const n=r;n.der=e(\"./der\"),n.pem=e(\"./pem\")},{\"./der\":181,\"./pem\":183}],183:[function(e,t,r){\"use strict\";const n=e(\"inherits\"),i=e(\"./der\");function s(e){i.call(this,e),this.enc=\"pem\"}n(s,i),t.exports=s,s.prototype.encode=function(e,t){const r=i.prototype.encode.call(this,e).toString(\"base64\"),n=[\"-----BEGIN \"+t.label+\"-----\"];for(let e=0;e<r.length;e+=64)n.push(r.slice(e,e+64));return n.push(\"-----END \"+t.label+\"-----\"),n.join(\"\\n\")}},{\"./der\":181,inherits:440}],184:[function(e,t,r){\"use strict\";!function(t,r){function n(e,t){if(!e)throw new Error(t||\"Assertion failed\")}function i(e,t){e.super_=t;var r=function(){};r.prototype=t.prototype,e.prototype=new r,e.prototype.constructor=e}function s(e,t,r){if(s.isBN(e))return e;this.negative=0,this.words=null,this.length=0,this.red=null,null!==e&&(\"le\"!==t&&\"be\"!==t||(r=t,t=10),this._init(e||0,t||10,r||\"be\"))}var o;\"object\"==typeof t?t.exports=s:(void 0).BN=s,s.BN=s,s.wordSize=26;try{o=\"undefined\"!=typeof window&&void 0!==window.Buffer?window.Buffer:e(\"buffer\").Buffer}catch(e){}function a(e,t){var r=e.charCodeAt(t);return r>=65&&r<=70?r-55:r>=97&&r<=102?r-87:r-48&15}function l(e,t,r){var n=a(e,r);return r-1>=t&&(n|=a(e,r-1)<<4),n}function c(e,t,r,n){for(var i=0,s=Math.min(e.length,r),o=t;o<s;o++){var a=e.charCodeAt(o)-48;i*=n,i+=a>=49?a-49+10:a>=17?a-17+10:a}return i}s.isBN=function(e){return e instanceof s||null!==e&&\"object\"==typeof e&&e.constructor.wordSize===s.wordSize&&Array.isArray(e.words)},s.max=function(e,t){return e.cmp(t)>0?e:t},s.min=function(e,t){return e.cmp(t)<0?e:t},s.prototype._init=function(e,t,r){if(\"number\"==typeof e)return this._initNumber(e,t,r);if(\"object\"==typeof e)return this._initArray(e,t,r);\"hex\"===t&&(t=16),n(t===(0|t)&&t>=2&&t<=36);var i=0;\"-\"===(e=e.toString().replace(/\\s+/g,\"\"))[0]&&(i++,this.negative=1),i<e.length&&(16===t?this._parseHex(e,i,r):(this._parseBase(e,t,i),\"le\"===r&&this._initArray(this.toArray(),t,r)))},s.prototype._initNumber=function(e,t,r){e<0&&(this.negative=1,e=-e),e<67108864?(this.words=[67108863&e],this.length=1):e<4503599627370496?(this.words=[67108863&e,e/67108864&67108863],this.length=2):(n(e<9007199254740992),this.words=[67108863&e,e/67108864&67108863,1],this.length=3),\"le\"===r&&this._initArray(this.toArray(),t,r)},s.prototype._initArray=function(e,t,r){if(n(\"number\"==typeof e.length),e.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(e.length/3),this.words=new Array(this.length);for(var i=0;i<this.length;i++)this.words[i]=0;var s,o,a=0;if(\"be\"===r)for(i=e.length-1,s=0;i>=0;i-=3)o=e[i]|e[i-1]<<8|e[i-2]<<16,this.words[s]|=o<<a&67108863,this.words[s+1]=o>>>26-a&67108863,(a+=24)>=26&&(a-=26,s++);else if(\"le\"===r)for(i=0,s=0;i<e.length;i+=3)o=e[i]|e[i+1]<<8|e[i+2]<<16,this.words[s]|=o<<a&67108863,this.words[s+1]=o>>>26-a&67108863,(a+=24)>=26&&(a-=26,s++);return this.strip()},s.prototype._parseHex=function(e,t,r){this.length=Math.ceil((e.length-t)/6),this.words=new Array(this.length);for(var n=0;n<this.length;n++)this.words[n]=0;var i,s=0,o=0;if(\"be\"===r)for(n=e.length-1;n>=t;n-=2)i=l(e,t,n)<<s,this.words[o]|=67108863&i,s>=18?(s-=18,o+=1,this.words[o]|=i>>>26):s+=8;else for(n=(e.length-t)%2==0?t+1:t;n<e.length;n+=2)i=l(e,t,n)<<s,this.words[o]|=67108863&i,s>=18?(s-=18,o+=1,this.words[o]|=i>>>26):s+=8;this.strip()},s.prototype._parseBase=function(e,t,r){this.words=[0],this.length=1;for(var n=0,i=1;i<=67108863;i*=t)n++;n--,i=i/t|0;for(var s=e.length-r,o=s%n,a=Math.min(s,s-o)+r,l=0,u=r;u<a;u+=n)l=c(e,u,u+n,t),this.imuln(i),this.words[0]+l<67108864?this.words[0]+=l:this._iaddn(l);if(0!==o){var h=1;for(l=c(e,u,e.length,t),u=0;u<o;u++)h*=t;this.imuln(h),this.words[0]+l<67108864?this.words[0]+=l:this._iaddn(l)}this.strip()},s.prototype.copy=function(e){e.words=new Array(this.length);for(var t=0;t<this.length;t++)e.words[t]=this.words[t];e.length=this.length,e.negative=this.negative,e.red=this.red},s.prototype.clone=function(){var e=new s(null);return this.copy(e),e},s.prototype._expand=function(e){for(;this.length<e;)this.words[this.length++]=0;return this},s.prototype.strip=function(){for(;this.length>1&&0===this.words[this.length-1];)this.length--;return this._normSign()},s.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},s.prototype.inspect=function(){return(this.red?\"<BN-R: \":\"<BN: \")+this.toString(16)+\">\"};var u=[\"\",\"0\",\"00\",\"000\",\"0000\",\"00000\",\"000000\",\"0000000\",\"00000000\",\"000000000\",\"0000000000\",\"00000000000\",\"000000000000\",\"0000000000000\",\"00000000000000\",\"000000000000000\",\"0000000000000000\",\"00000000000000000\",\"000000000000000000\",\"0000000000000000000\",\"00000000000000000000\",\"000000000000000000000\",\"0000000000000000000000\",\"00000000000000000000000\",\"000000000000000000000000\",\"0000000000000000000000000\"],h=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],f=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];function d(e,t,r){r.negative=t.negative^e.negative;var n=e.length+t.length|0;r.length=n,n=n-1|0;var i=0|e.words[0],s=0|t.words[0],o=i*s,a=67108863&o,l=o/67108864|0;r.words[0]=a;for(var c=1;c<n;c++){for(var u=l>>>26,h=67108863&l,f=Math.min(c,t.length-1),d=Math.max(0,c-e.length+1);d<=f;d++){var p=c-d|0;u+=(o=(i=0|e.words[p])*(s=0|t.words[d])+h)/67108864|0,h=67108863&o}r.words[c]=0|h,l=0|u}return 0!==l?r.words[c]=0|l:r.length--,r.strip()}s.prototype.toString=function(e,t){var r;if(t=0|t||1,16===(e=e||10)||\"hex\"===e){r=\"\";for(var i=0,s=0,o=0;o<this.length;o++){var a=this.words[o],l=(16777215&(a<<i|s)).toString(16);r=0!==(s=a>>>24-i&16777215)||o!==this.length-1?u[6-l.length]+l+r:l+r,(i+=2)>=26&&(i-=26,o--)}for(0!==s&&(r=s.toString(16)+r);r.length%t!=0;)r=\"0\"+r;return 0!==this.negative&&(r=\"-\"+r),r}if(e===(0|e)&&e>=2&&e<=36){var c=h[e],d=f[e];r=\"\";var p=this.clone();for(p.negative=0;!p.isZero();){var m=p.modn(d).toString(e);r=(p=p.idivn(d)).isZero()?m+r:u[c-m.length]+m+r}for(this.isZero()&&(r=\"0\"+r);r.length%t!=0;)r=\"0\"+r;return 0!==this.negative&&(r=\"-\"+r),r}n(!1,\"Base should be between 2 and 36\")},s.prototype.toNumber=function(){var e=this.words[0];return 2===this.length?e+=67108864*this.words[1]:3===this.length&&1===this.words[2]?e+=4503599627370496+67108864*this.words[1]:this.length>2&&n(!1,\"Number can only safely store up to 53 bits\"),0!==this.negative?-e:e},s.prototype.toJSON=function(){return this.toString(16)},s.prototype.toBuffer=function(e,t){return n(void 0!==o),this.toArrayLike(o,e,t)},s.prototype.toArray=function(e,t){return this.toArrayLike(Array,e,t)},s.prototype.toArrayLike=function(e,t,r){var i=this.byteLength(),s=r||Math.max(1,i);n(i<=s,\"byte array longer than desired length\"),n(s>0,\"Requested array length <= 0\"),this.strip();var o,a,l=\"le\"===t,c=new e(s),u=this.clone();if(l){for(a=0;!u.isZero();a++)o=u.andln(255),u.iushrn(8),c[a]=o;for(;a<s;a++)c[a]=0}else{for(a=0;a<s-i;a++)c[a]=0;for(a=0;!u.isZero();a++)o=u.andln(255),u.iushrn(8),c[s-a-1]=o}return c},Math.clz32?s.prototype._countBits=function(e){return 32-Math.clz32(e)}:s.prototype._countBits=function(e){var t=e,r=0;return t>=4096&&(r+=13,t>>>=13),t>=64&&(r+=7,t>>>=7),t>=8&&(r+=4,t>>>=4),t>=2&&(r+=2,t>>>=2),r+t},s.prototype._zeroBits=function(e){if(0===e)return 26;var t=e,r=0;return 0==(8191&t)&&(r+=13,t>>>=13),0==(127&t)&&(r+=7,t>>>=7),0==(15&t)&&(r+=4,t>>>=4),0==(3&t)&&(r+=2,t>>>=2),0==(1&t)&&r++,r},s.prototype.bitLength=function(){var e=this.words[this.length-1],t=this._countBits(e);return 26*(this.length-1)+t},s.prototype.zeroBits=function(){if(this.isZero())return 0;for(var e=0,t=0;t<this.length;t++){var r=this._zeroBits(this.words[t]);if(e+=r,26!==r)break}return e},s.prototype.byteLength=function(){return Math.ceil(this.bitLength()/8)},s.prototype.toTwos=function(e){return 0!==this.negative?this.abs().inotn(e).iaddn(1):this.clone()},s.prototype.fromTwos=function(e){return this.testn(e-1)?this.notn(e).iaddn(1).ineg():this.clone()},s.prototype.isNeg=function(){return 0!==this.negative},s.prototype.neg=function(){return this.clone().ineg()},s.prototype.ineg=function(){return this.isZero()||(this.negative^=1),this},s.prototype.iuor=function(e){for(;this.length<e.length;)this.words[this.length++]=0;for(var t=0;t<e.length;t++)this.words[t]=this.words[t]|e.words[t];return this.strip()},s.prototype.ior=function(e){return n(0==(this.negative|e.negative)),this.iuor(e)},s.prototype.or=function(e){return this.length>e.length?this.clone().ior(e):e.clone().ior(this)},s.prototype.uor=function(e){return this.length>e.length?this.clone().iuor(e):e.clone().iuor(this)},s.prototype.iuand=function(e){var t;t=this.length>e.length?e:this;for(var r=0;r<t.length;r++)this.words[r]=this.words[r]&e.words[r];return this.length=t.length,this.strip()},s.prototype.iand=function(e){return n(0==(this.negative|e.negative)),this.iuand(e)},s.prototype.and=function(e){return this.length>e.length?this.clone().iand(e):e.clone().iand(this)},s.prototype.uand=function(e){return this.length>e.length?this.clone().iuand(e):e.clone().iuand(this)},s.prototype.iuxor=function(e){var t,r;this.length>e.length?(t=this,r=e):(t=e,r=this);for(var n=0;n<r.length;n++)this.words[n]=t.words[n]^r.words[n];if(this!==t)for(;n<t.length;n++)this.words[n]=t.words[n];return this.length=t.length,this.strip()},s.prototype.ixor=function(e){return n(0==(this.negative|e.negative)),this.iuxor(e)},s.prototype.xor=function(e){return this.length>e.length?this.clone().ixor(e):e.clone().ixor(this)},s.prototype.uxor=function(e){return this.length>e.length?this.clone().iuxor(e):e.clone().iuxor(this)},s.prototype.inotn=function(e){n(\"number\"==typeof e&&e>=0);var t=0|Math.ceil(e/26),r=e%26;this._expand(t),r>0&&t--;for(var i=0;i<t;i++)this.words[i]=67108863&~this.words[i];return r>0&&(this.words[i]=~this.words[i]&67108863>>26-r),this.strip()},s.prototype.notn=function(e){return this.clone().inotn(e)},s.prototype.setn=function(e,t){n(\"number\"==typeof e&&e>=0);var r=e/26|0,i=e%26;return this._expand(r+1),this.words[r]=t?this.words[r]|1<<i:this.words[r]&~(1<<i),this.strip()},s.prototype.iadd=function(e){var t,r,n;if(0!==this.negative&&0===e.negative)return this.negative=0,t=this.isub(e),this.negative^=1,this._normSign();if(0===this.negative&&0!==e.negative)return e.negative=0,t=this.isub(e),e.negative=1,t._normSign();this.length>e.length?(r=this,n=e):(r=e,n=this);for(var i=0,s=0;s<n.length;s++)t=(0|r.words[s])+(0|n.words[s])+i,this.words[s]=67108863&t,i=t>>>26;for(;0!==i&&s<r.length;s++)t=(0|r.words[s])+i,this.words[s]=67108863&t,i=t>>>26;if(this.length=r.length,0!==i)this.words[this.length]=i,this.length++;else if(r!==this)for(;s<r.length;s++)this.words[s]=r.words[s];return this},s.prototype.add=function(e){var t;return 0!==e.negative&&0===this.negative?(e.negative=0,t=this.sub(e),e.negative^=1,t):0===e.negative&&0!==this.negative?(this.negative=0,t=e.sub(this),this.negative=1,t):this.length>e.length?this.clone().iadd(e):e.clone().iadd(this)},s.prototype.isub=function(e){if(0!==e.negative){e.negative=0;var t=this.iadd(e);return e.negative=1,t._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(e),this.negative=1,this._normSign();var r,n,i=this.cmp(e);if(0===i)return this.negative=0,this.length=1,this.words[0]=0,this;i>0?(r=this,n=e):(r=e,n=this);for(var s=0,o=0;o<n.length;o++)s=(t=(0|r.words[o])-(0|n.words[o])+s)>>26,this.words[o]=67108863&t;for(;0!==s&&o<r.length;o++)s=(t=(0|r.words[o])+s)>>26,this.words[o]=67108863&t;if(0===s&&o<r.length&&r!==this)for(;o<r.length;o++)this.words[o]=r.words[o];return this.length=Math.max(this.length,o),r!==this&&(this.negative=1),this.strip()},s.prototype.sub=function(e){return this.clone().isub(e)};var p=function(e,t,r){var n,i,s,o=e.words,a=t.words,l=r.words,c=0,u=0|o[0],h=8191&u,f=u>>>13,d=0|o[1],p=8191&d,m=d>>>13,b=0|o[2],g=8191&b,y=b>>>13,v=0|o[3],w=8191&v,_=v>>>13,x=0|o[4],k=8191&x,S=x>>>13,M=0|o[5],C=8191&M,T=M>>>13,E=0|o[6],A=8191&E,R=E>>>13,O=0|o[7],j=8191&O,I=O>>>13,N=0|o[8],P=8191&N,B=N>>>13,D=0|o[9],F=8191&D,L=D>>>13,z=0|a[0],U=8191&z,$=z>>>13,H=0|a[1],V=8191&H,q=H>>>13,W=0|a[2],X=8191&W,K=W>>>13,Y=0|a[3],Z=8191&Y,G=Y>>>13,J=0|a[4],Q=8191&J,ee=J>>>13,te=0|a[5],re=8191&te,ne=te>>>13,ie=0|a[6],se=8191&ie,oe=ie>>>13,ae=0|a[7],le=8191&ae,ce=ae>>>13,ue=0|a[8],he=8191&ue,fe=ue>>>13,de=0|a[9],pe=8191&de,me=de>>>13;r.negative=e.negative^t.negative,r.length=19;var be=(c+(n=Math.imul(h,U))|0)+((8191&(i=(i=Math.imul(h,$))+Math.imul(f,U)|0))<<13)|0;c=((s=Math.imul(f,$))+(i>>>13)|0)+(be>>>26)|0,be&=67108863,n=Math.imul(p,U),i=(i=Math.imul(p,$))+Math.imul(m,U)|0,s=Math.imul(m,$);var ge=(c+(n=n+Math.imul(h,V)|0)|0)+((8191&(i=(i=i+Math.imul(h,q)|0)+Math.imul(f,V)|0))<<13)|0;c=((s=s+Math.imul(f,q)|0)+(i>>>13)|0)+(ge>>>26)|0,ge&=67108863,n=Math.imul(g,U),i=(i=Math.imul(g,$))+Math.imul(y,U)|0,s=Math.imul(y,$),n=n+Math.imul(p,V)|0,i=(i=i+Math.imul(p,q)|0)+Math.imul(m,V)|0,s=s+Math.imul(m,q)|0;var ye=(c+(n=n+Math.imul(h,X)|0)|0)+((8191&(i=(i=i+Math.imul(h,K)|0)+Math.imul(f,X)|0))<<13)|0;c=((s=s+Math.imul(f,K)|0)+(i>>>13)|0)+(ye>>>26)|0,ye&=67108863,n=Math.imul(w,U),i=(i=Math.imul(w,$))+Math.imul(_,U)|0,s=Math.imul(_,$),n=n+Math.imul(g,V)|0,i=(i=i+Math.imul(g,q)|0)+Math.imul(y,V)|0,s=s+Math.imul(y,q)|0,n=n+Math.imul(p,X)|0,i=(i=i+Math.imul(p,K)|0)+Math.imul(m,X)|0,s=s+Math.imul(m,K)|0;var ve=(c+(n=n+Math.imul(h,Z)|0)|0)+((8191&(i=(i=i+Math.imul(h,G)|0)+Math.imul(f,Z)|0))<<13)|0;c=((s=s+Math.imul(f,G)|0)+(i>>>13)|0)+(ve>>>26)|0,ve&=67108863,n=Math.imul(k,U),i=(i=Math.imul(k,$))+Math.imul(S,U)|0,s=Math.imul(S,$),n=n+Math.imul(w,V)|0,i=(i=i+Math.imul(w,q)|0)+Math.imul(_,V)|0,s=s+Math.imul(_,q)|0,n=n+Math.imul(g,X)|0,i=(i=i+Math.imul(g,K)|0)+Math.imul(y,X)|0,s=s+Math.imul(y,K)|0,n=n+Math.imul(p,Z)|0,i=(i=i+Math.imul(p,G)|0)+Math.imul(m,Z)|0,s=s+Math.imul(m,G)|0;var we=(c+(n=n+Math.imul(h,Q)|0)|0)+((8191&(i=(i=i+Math.imul(h,ee)|0)+Math.imul(f,Q)|0))<<13)|0;c=((s=s+Math.imul(f,ee)|0)+(i>>>13)|0)+(we>>>26)|0,we&=67108863,n=Math.imul(C,U),i=(i=Math.imul(C,$))+Math.imul(T,U)|0,s=Math.imul(T,$),n=n+Math.imul(k,V)|0,i=(i=i+Math.imul(k,q)|0)+Math.imul(S,V)|0,s=s+Math.imul(S,q)|0,n=n+Math.imul(w,X)|0,i=(i=i+Math.imul(w,K)|0)+Math.imul(_,X)|0,s=s+Math.imul(_,K)|0,n=n+Math.imul(g,Z)|0,i=(i=i+Math.imul(g,G)|0)+Math.imul(y,Z)|0,s=s+Math.imul(y,G)|0,n=n+Math.imul(p,Q)|0,i=(i=i+Math.imul(p,ee)|0)+Math.imul(m,Q)|0,s=s+Math.imul(m,ee)|0;var _e=(c+(n=n+Math.imul(h,re)|0)|0)+((8191&(i=(i=i+Math.imul(h,ne)|0)+Math.imul(f,re)|0))<<13)|0;c=((s=s+Math.imul(f,ne)|0)+(i>>>13)|0)+(_e>>>26)|0,_e&=67108863,n=Math.imul(A,U),i=(i=Math.imul(A,$))+Math.imul(R,U)|0,s=Math.imul(R,$),n=n+Math.imul(C,V)|0,i=(i=i+Math.imul(C,q)|0)+Math.imul(T,V)|0,s=s+Math.imul(T,q)|0,n=n+Math.imul(k,X)|0,i=(i=i+Math.imul(k,K)|0)+Math.imul(S,X)|0,s=s+Math.imul(S,K)|0,n=n+Math.imul(w,Z)|0,i=(i=i+Math.imul(w,G)|0)+Math.imul(_,Z)|0,s=s+Math.imul(_,G)|0,n=n+Math.imul(g,Q)|0,i=(i=i+Math.imul(g,ee)|0)+Math.imul(y,Q)|0,s=s+Math.imul(y,ee)|0,n=n+Math.imul(p,re)|0,i=(i=i+Math.imul(p,ne)|0)+Math.imul(m,re)|0,s=s+Math.imul(m,ne)|0;var xe=(c+(n=n+Math.imul(h,se)|0)|0)+((8191&(i=(i=i+Math.imul(h,oe)|0)+Math.imul(f,se)|0))<<13)|0;c=((s=s+Math.imul(f,oe)|0)+(i>>>13)|0)+(xe>>>26)|0,xe&=67108863,n=Math.imul(j,U),i=(i=Math.imul(j,$))+Math.imul(I,U)|0,s=Math.imul(I,$),n=n+Math.imul(A,V)|0,i=(i=i+Math.imul(A,q)|0)+Math.imul(R,V)|0,s=s+Math.imul(R,q)|0,n=n+Math.imul(C,X)|0,i=(i=i+Math.imul(C,K)|0)+Math.imul(T,X)|0,s=s+Math.imul(T,K)|0,n=n+Math.imul(k,Z)|0,i=(i=i+Math.imul(k,G)|0)+Math.imul(S,Z)|0,s=s+Math.imul(S,G)|0,n=n+Math.imul(w,Q)|0,i=(i=i+Math.imul(w,ee)|0)+Math.imul(_,Q)|0,s=s+Math.imul(_,ee)|0,n=n+Math.imul(g,re)|0,i=(i=i+Math.imul(g,ne)|0)+Math.imul(y,re)|0,s=s+Math.imul(y,ne)|0,n=n+Math.imul(p,se)|0,i=(i=i+Math.imul(p,oe)|0)+Math.imul(m,se)|0,s=s+Math.imul(m,oe)|0;var ke=(c+(n=n+Math.imul(h,le)|0)|0)+((8191&(i=(i=i+Math.imul(h,ce)|0)+Math.imul(f,le)|0))<<13)|0;c=((s=s+Math.imul(f,ce)|0)+(i>>>13)|0)+(ke>>>26)|0,ke&=67108863,n=Math.imul(P,U),i=(i=Math.imul(P,$))+Math.imul(B,U)|0,s=Math.imul(B,$),n=n+Math.imul(j,V)|0,i=(i=i+Math.imul(j,q)|0)+Math.imul(I,V)|0,s=s+Math.imul(I,q)|0,n=n+Math.imul(A,X)|0,i=(i=i+Math.imul(A,K)|0)+Math.imul(R,X)|0,s=s+Math.imul(R,K)|0,n=n+Math.imul(C,Z)|0,i=(i=i+Math.imul(C,G)|0)+Math.imul(T,Z)|0,s=s+Math.imul(T,G)|0,n=n+Math.imul(k,Q)|0,i=(i=i+Math.imul(k,ee)|0)+Math.imul(S,Q)|0,s=s+Math.imul(S,ee)|0,n=n+Math.imul(w,re)|0,i=(i=i+Math.imul(w,ne)|0)+Math.imul(_,re)|0,s=s+Math.imul(_,ne)|0,n=n+Math.imul(g,se)|0,i=(i=i+Math.imul(g,oe)|0)+Math.imul(y,se)|0,s=s+Math.imul(y,oe)|0,n=n+Math.imul(p,le)|0,i=(i=i+Math.imul(p,ce)|0)+Math.imul(m,le)|0,s=s+Math.imul(m,ce)|0;var Se=(c+(n=n+Math.imul(h,he)|0)|0)+((8191&(i=(i=i+Math.imul(h,fe)|0)+Math.imul(f,he)|0))<<13)|0;c=((s=s+Math.imul(f,fe)|0)+(i>>>13)|0)+(Se>>>26)|0,Se&=67108863,n=Math.imul(F,U),i=(i=Math.imul(F,$))+Math.imul(L,U)|0,s=Math.imul(L,$),n=n+Math.imul(P,V)|0,i=(i=i+Math.imul(P,q)|0)+Math.imul(B,V)|0,s=s+Math.imul(B,q)|0,n=n+Math.imul(j,X)|0,i=(i=i+Math.imul(j,K)|0)+Math.imul(I,X)|0,s=s+Math.imul(I,K)|0,n=n+Math.imul(A,Z)|0,i=(i=i+Math.imul(A,G)|0)+Math.imul(R,Z)|0,s=s+Math.imul(R,G)|0,n=n+Math.imul(C,Q)|0,i=(i=i+Math.imul(C,ee)|0)+Math.imul(T,Q)|0,s=s+Math.imul(T,ee)|0,n=n+Math.imul(k,re)|0,i=(i=i+Math.imul(k,ne)|0)+Math.imul(S,re)|0,s=s+Math.imul(S,ne)|0,n=n+Math.imul(w,se)|0,i=(i=i+Math.imul(w,oe)|0)+Math.imul(_,se)|0,s=s+Math.imul(_,oe)|0,n=n+Math.imul(g,le)|0,i=(i=i+Math.imul(g,ce)|0)+Math.imul(y,le)|0,s=s+Math.imul(y,ce)|0,n=n+Math.imul(p,he)|0,i=(i=i+Math.imul(p,fe)|0)+Math.imul(m,he)|0,s=s+Math.imul(m,fe)|0;var Me=(c+(n=n+Math.imul(h,pe)|0)|0)+((8191&(i=(i=i+Math.imul(h,me)|0)+Math.imul(f,pe)|0))<<13)|0;c=((s=s+Math.imul(f,me)|0)+(i>>>13)|0)+(Me>>>26)|0,Me&=67108863,n=Math.imul(F,V),i=(i=Math.imul(F,q))+Math.imul(L,V)|0,s=Math.imul(L,q),n=n+Math.imul(P,X)|0,i=(i=i+Math.imul(P,K)|0)+Math.imul(B,X)|0,s=s+Math.imul(B,K)|0,n=n+Math.imul(j,Z)|0,i=(i=i+Math.imul(j,G)|0)+Math.imul(I,Z)|0,s=s+Math.imul(I,G)|0,n=n+Math.imul(A,Q)|0,i=(i=i+Math.imul(A,ee)|0)+Math.imul(R,Q)|0,s=s+Math.imul(R,ee)|0,n=n+Math.imul(C,re)|0,i=(i=i+Math.imul(C,ne)|0)+Math.imul(T,re)|0,s=s+Math.imul(T,ne)|0,n=n+Math.imul(k,se)|0,i=(i=i+Math.imul(k,oe)|0)+Math.imul(S,se)|0,s=s+Math.imul(S,oe)|0,n=n+Math.imul(w,le)|0,i=(i=i+Math.imul(w,ce)|0)+Math.imul(_,le)|0,s=s+Math.imul(_,ce)|0,n=n+Math.imul(g,he)|0,i=(i=i+Math.imul(g,fe)|0)+Math.imul(y,he)|0,s=s+Math.imul(y,fe)|0;var Ce=(c+(n=n+Math.imul(p,pe)|0)|0)+((8191&(i=(i=i+Math.imul(p,me)|0)+Math.imul(m,pe)|0))<<13)|0;c=((s=s+Math.imul(m,me)|0)+(i>>>13)|0)+(Ce>>>26)|0,Ce&=67108863,n=Math.imul(F,X),i=(i=Math.imul(F,K))+Math.imul(L,X)|0,s=Math.imul(L,K),n=n+Math.imul(P,Z)|0,i=(i=i+Math.imul(P,G)|0)+Math.imul(B,Z)|0,s=s+Math.imul(B,G)|0,n=n+Math.imul(j,Q)|0,i=(i=i+Math.imul(j,ee)|0)+Math.imul(I,Q)|0,s=s+Math.imul(I,ee)|0,n=n+Math.imul(A,re)|0,i=(i=i+Math.imul(A,ne)|0)+Math.imul(R,re)|0,s=s+Math.imul(R,ne)|0,n=n+Math.imul(C,se)|0,i=(i=i+Math.imul(C,oe)|0)+Math.imul(T,se)|0,s=s+Math.imul(T,oe)|0,n=n+Math.imul(k,le)|0,i=(i=i+Math.imul(k,ce)|0)+Math.imul(S,le)|0,s=s+Math.imul(S,ce)|0,n=n+Math.imul(w,he)|0,i=(i=i+Math.imul(w,fe)|0)+Math.imul(_,he)|0,s=s+Math.imul(_,fe)|0;var Te=(c+(n=n+Math.imul(g,pe)|0)|0)+((8191&(i=(i=i+Math.imul(g,me)|0)+Math.imul(y,pe)|0))<<13)|0;c=((s=s+Math.imul(y,me)|0)+(i>>>13)|0)+(Te>>>26)|0,Te&=67108863,n=Math.imul(F,Z),i=(i=Math.imul(F,G))+Math.imul(L,Z)|0,s=Math.imul(L,G),n=n+Math.imul(P,Q)|0,i=(i=i+Math.imul(P,ee)|0)+Math.imul(B,Q)|0,s=s+Math.imul(B,ee)|0,n=n+Math.imul(j,re)|0,i=(i=i+Math.imul(j,ne)|0)+Math.imul(I,re)|0,s=s+Math.imul(I,ne)|0,n=n+Math.imul(A,se)|0,i=(i=i+Math.imul(A,oe)|0)+Math.imul(R,se)|0,s=s+Math.imul(R,oe)|0,n=n+Math.imul(C,le)|0,i=(i=i+Math.imul(C,ce)|0)+Math.imul(T,le)|0,s=s+Math.imul(T,ce)|0,n=n+Math.imul(k,he)|0,i=(i=i+Math.imul(k,fe)|0)+Math.imul(S,he)|0,s=s+Math.imul(S,fe)|0;var Ee=(c+(n=n+Math.imul(w,pe)|0)|0)+((8191&(i=(i=i+Math.imul(w,me)|0)+Math.imul(_,pe)|0))<<13)|0;c=((s=s+Math.imul(_,me)|0)+(i>>>13)|0)+(Ee>>>26)|0,Ee&=67108863,n=Math.imul(F,Q),i=(i=Math.imul(F,ee))+Math.imul(L,Q)|0,s=Math.imul(L,ee),n=n+Math.imul(P,re)|0,i=(i=i+Math.imul(P,ne)|0)+Math.imul(B,re)|0,s=s+Math.imul(B,ne)|0,n=n+Math.imul(j,se)|0,i=(i=i+Math.imul(j,oe)|0)+Math.imul(I,se)|0,s=s+Math.imul(I,oe)|0,n=n+Math.imul(A,le)|0,i=(i=i+Math.imul(A,ce)|0)+Math.imul(R,le)|0,s=s+Math.imul(R,ce)|0,n=n+Math.imul(C,he)|0,i=(i=i+Math.imul(C,fe)|0)+Math.imul(T,he)|0,s=s+Math.imul(T,fe)|0;var Ae=(c+(n=n+Math.imul(k,pe)|0)|0)+((8191&(i=(i=i+Math.imul(k,me)|0)+Math.imul(S,pe)|0))<<13)|0;c=((s=s+Math.imul(S,me)|0)+(i>>>13)|0)+(Ae>>>26)|0,Ae&=67108863,n=Math.imul(F,re),i=(i=Math.imul(F,ne))+Math.imul(L,re)|0,s=Math.imul(L,ne),n=n+Math.imul(P,se)|0,i=(i=i+Math.imul(P,oe)|0)+Math.imul(B,se)|0,s=s+Math.imul(B,oe)|0,n=n+Math.imul(j,le)|0,i=(i=i+Math.imul(j,ce)|0)+Math.imul(I,le)|0,s=s+Math.imul(I,ce)|0,n=n+Math.imul(A,he)|0,i=(i=i+Math.imul(A,fe)|0)+Math.imul(R,he)|0,s=s+Math.imul(R,fe)|0;var Re=(c+(n=n+Math.imul(C,pe)|0)|0)+((8191&(i=(i=i+Math.imul(C,me)|0)+Math.imul(T,pe)|0))<<13)|0;c=((s=s+Math.imul(T,me)|0)+(i>>>13)|0)+(Re>>>26)|0,Re&=67108863,n=Math.imul(F,se),i=(i=Math.imul(F,oe))+Math.imul(L,se)|0,s=Math.imul(L,oe),n=n+Math.imul(P,le)|0,i=(i=i+Math.imul(P,ce)|0)+Math.imul(B,le)|0,s=s+Math.imul(B,ce)|0,n=n+Math.imul(j,he)|0,i=(i=i+Math.imul(j,fe)|0)+Math.imul(I,he)|0,s=s+Math.imul(I,fe)|0;var Oe=(c+(n=n+Math.imul(A,pe)|0)|0)+((8191&(i=(i=i+Math.imul(A,me)|0)+Math.imul(R,pe)|0))<<13)|0;c=((s=s+Math.imul(R,me)|0)+(i>>>13)|0)+(Oe>>>26)|0,Oe&=67108863,n=Math.imul(F,le),i=(i=Math.imul(F,ce))+Math.imul(L,le)|0,s=Math.imul(L,ce),n=n+Math.imul(P,he)|0,i=(i=i+Math.imul(P,fe)|0)+Math.imul(B,he)|0,s=s+Math.imul(B,fe)|0;var je=(c+(n=n+Math.imul(j,pe)|0)|0)+((8191&(i=(i=i+Math.imul(j,me)|0)+Math.imul(I,pe)|0))<<13)|0;c=((s=s+Math.imul(I,me)|0)+(i>>>13)|0)+(je>>>26)|0,je&=67108863,n=Math.imul(F,he),i=(i=Math.imul(F,fe))+Math.imul(L,he)|0,s=Math.imul(L,fe);var Ie=(c+(n=n+Math.imul(P,pe)|0)|0)+((8191&(i=(i=i+Math.imul(P,me)|0)+Math.imul(B,pe)|0))<<13)|0;c=((s=s+Math.imul(B,me)|0)+(i>>>13)|0)+(Ie>>>26)|0,Ie&=67108863;var Ne=(c+(n=Math.imul(F,pe))|0)+((8191&(i=(i=Math.imul(F,me))+Math.imul(L,pe)|0))<<13)|0;return c=((s=Math.imul(L,me))+(i>>>13)|0)+(Ne>>>26)|0,Ne&=67108863,l[0]=be,l[1]=ge,l[2]=ye,l[3]=ve,l[4]=we,l[5]=_e,l[6]=xe,l[7]=ke,l[8]=Se,l[9]=Me,l[10]=Ce,l[11]=Te,l[12]=Ee,l[13]=Ae,l[14]=Re,l[15]=Oe,l[16]=je,l[17]=Ie,l[18]=Ne,0!==c&&(l[19]=c,r.length++),r};function m(e,t,r){return(new b).mulp(e,t,r)}function b(e,t){this.x=e,this.y=t}Math.imul||(p=d),s.prototype.mulTo=function(e,t){var r=this.length+e.length;return 10===this.length&&10===e.length?p(this,e,t):r<63?d(this,e,t):r<1024?function(e,t,r){r.negative=t.negative^e.negative,r.length=e.length+t.length;for(var n=0,i=0,s=0;s<r.length-1;s++){var o=i;i=0;for(var a=67108863&n,l=Math.min(s,t.length-1),c=Math.max(0,s-e.length+1);c<=l;c++){var u=s-c,h=(0|e.words[u])*(0|t.words[c]),f=67108863&h;a=67108863&(f=f+a|0),i+=(o=(o=o+(h/67108864|0)|0)+(f>>>26)|0)>>>26,o&=67108863}r.words[s]=a,n=o,o=i}return 0!==n?r.words[s]=n:r.length--,r.strip()}(this,e,t):m(this,e,t)},b.prototype.makeRBT=function(e){for(var t=new Array(e),r=s.prototype._countBits(e)-1,n=0;n<e;n++)t[n]=this.revBin(n,r,e);return t},b.prototype.revBin=function(e,t,r){if(0===e||e===r-1)return e;for(var n=0,i=0;i<t;i++)n|=(1&e)<<t-i-1,e>>=1;return n},b.prototype.permute=function(e,t,r,n,i,s){for(var o=0;o<s;o++)n[o]=t[e[o]],i[o]=r[e[o]]},b.prototype.transform=function(e,t,r,n,i,s){this.permute(s,e,t,r,n,i);for(var o=1;o<i;o<<=1)for(var a=o<<1,l=Math.cos(2*Math.PI/a),c=Math.sin(2*Math.PI/a),u=0;u<i;u+=a)for(var h=l,f=c,d=0;d<o;d++){var p=r[u+d],m=n[u+d],b=r[u+d+o],g=n[u+d+o],y=h*b-f*g;g=h*g+f*b,b=y,r[u+d]=p+b,n[u+d]=m+g,r[u+d+o]=p-b,n[u+d+o]=m-g,d!==a&&(y=l*h-c*f,f=l*f+c*h,h=y)}},b.prototype.guessLen13b=function(e,t){var r=1|Math.max(t,e),n=1&r,i=0;for(r=r/2|0;r;r>>>=1)i++;return 1<<i+1+n},b.prototype.conjugate=function(e,t,r){if(!(r<=1))for(var n=0;n<r/2;n++){var i=e[n];e[n]=e[r-n-1],e[r-n-1]=i,i=t[n],t[n]=-t[r-n-1],t[r-n-1]=-i}},b.prototype.normalize13b=function(e,t){for(var r=0,n=0;n<t/2;n++){var i=8192*Math.round(e[2*n+1]/t)+Math.round(e[2*n]/t)+r;e[n]=67108863&i,r=i<67108864?0:i/67108864|0}return e},b.prototype.convert13b=function(e,t,r,i){for(var s=0,o=0;o<t;o++)s+=0|e[o],r[2*o]=8191&s,s>>>=13,r[2*o+1]=8191&s,s>>>=13;for(o=2*t;o<i;++o)r[o]=0;n(0===s),n(0==(-8192&s))},b.prototype.stub=function(e){for(var t=new Array(e),r=0;r<e;r++)t[r]=0;return t},b.prototype.mulp=function(e,t,r){var n=2*this.guessLen13b(e.length,t.length),i=this.makeRBT(n),s=this.stub(n),o=new Array(n),a=new Array(n),l=new Array(n),c=new Array(n),u=new Array(n),h=new Array(n),f=r.words;f.length=n,this.convert13b(e.words,e.length,o,n),this.convert13b(t.words,t.length,c,n),this.transform(o,s,a,l,n,i),this.transform(c,s,u,h,n,i);for(var d=0;d<n;d++){var p=a[d]*u[d]-l[d]*h[d];l[d]=a[d]*h[d]+l[d]*u[d],a[d]=p}return this.conjugate(a,l,n),this.transform(a,l,f,s,n,i),this.conjugate(f,s,n),this.normalize13b(f,n),r.negative=e.negative^t.negative,r.length=e.length+t.length,r.strip()},s.prototype.mul=function(e){var t=new s(null);return t.words=new Array(this.length+e.length),this.mulTo(e,t)},s.prototype.mulf=function(e){var t=new s(null);return t.words=new Array(this.length+e.length),m(this,e,t)},s.prototype.imul=function(e){return this.clone().mulTo(e,this)},s.prototype.imuln=function(e){n(\"number\"==typeof e),n(e<67108864);for(var t=0,r=0;r<this.length;r++){var i=(0|this.words[r])*e,s=(67108863&i)+(67108863&t);t>>=26,t+=i/67108864|0,t+=s>>>26,this.words[r]=67108863&s}return 0!==t&&(this.words[r]=t,this.length++),this},s.prototype.muln=function(e){return this.clone().imuln(e)},s.prototype.sqr=function(){return this.mul(this)},s.prototype.isqr=function(){return this.imul(this.clone())},s.prototype.pow=function(e){var t=function(e){for(var t=new Array(e.bitLength()),r=0;r<t.length;r++){var n=r/26|0,i=r%26;t[r]=(e.words[n]&1<<i)>>>i}return t}(e);if(0===t.length)return new s(1);for(var r=this,n=0;n<t.length&&0===t[n];n++,r=r.sqr());if(++n<t.length)for(var i=r.sqr();n<t.length;n++,i=i.sqr())0!==t[n]&&(r=r.mul(i));return r},s.prototype.iushln=function(e){n(\"number\"==typeof e&&e>=0);var t,r=e%26,i=(e-r)/26,s=67108863>>>26-r<<26-r;if(0!==r){var o=0;for(t=0;t<this.length;t++){var a=this.words[t]&s,l=(0|this.words[t])-a<<r;this.words[t]=l|o,o=a>>>26-r}o&&(this.words[t]=o,this.length++)}if(0!==i){for(t=this.length-1;t>=0;t--)this.words[t+i]=this.words[t];for(t=0;t<i;t++)this.words[t]=0;this.length+=i}return this.strip()},s.prototype.ishln=function(e){return n(0===this.negative),this.iushln(e)},s.prototype.iushrn=function(e,t,r){var i;n(\"number\"==typeof e&&e>=0),i=t?(t-t%26)/26:0;var s=e%26,o=Math.min((e-s)/26,this.length),a=67108863^67108863>>>s<<s,l=r;if(i-=o,i=Math.max(0,i),l){for(var c=0;c<o;c++)l.words[c]=this.words[c];l.length=o}if(0===o);else if(this.length>o)for(this.length-=o,c=0;c<this.length;c++)this.words[c]=this.words[c+o];else this.words[0]=0,this.length=1;var u=0;for(c=this.length-1;c>=0&&(0!==u||c>=i);c--){var h=0|this.words[c];this.words[c]=u<<26-s|h>>>s,u=h&a}return l&&0!==u&&(l.words[l.length++]=u),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},s.prototype.ishrn=function(e,t,r){return n(0===this.negative),this.iushrn(e,t,r)},s.prototype.shln=function(e){return this.clone().ishln(e)},s.prototype.ushln=function(e){return this.clone().iushln(e)},s.prototype.shrn=function(e){return this.clone().ishrn(e)},s.prototype.ushrn=function(e){return this.clone().iushrn(e)},s.prototype.testn=function(e){n(\"number\"==typeof e&&e>=0);var t=e%26,r=(e-t)/26,i=1<<t;return!(this.length<=r)&&!!(this.words[r]&i)},s.prototype.imaskn=function(e){n(\"number\"==typeof e&&e>=0);var t=e%26,r=(e-t)/26;if(n(0===this.negative,\"imaskn works only with positive numbers\"),this.length<=r)return this;if(0!==t&&r++,this.length=Math.min(r,this.length),0!==t){var i=67108863^67108863>>>t<<t;this.words[this.length-1]&=i}return this.strip()},s.prototype.maskn=function(e){return this.clone().imaskn(e)},s.prototype.iaddn=function(e){return n(\"number\"==typeof e),n(e<67108864),e<0?this.isubn(-e):0!==this.negative?1===this.length&&(0|this.words[0])<e?(this.words[0]=e-(0|this.words[0]),this.negative=0,this):(this.negative=0,this.isubn(e),this.negative=1,this):this._iaddn(e)},s.prototype._iaddn=function(e){this.words[0]+=e;for(var t=0;t<this.length&&this.words[t]>=67108864;t++)this.words[t]-=67108864,t===this.length-1?this.words[t+1]=1:this.words[t+1]++;return this.length=Math.max(this.length,t+1),this},s.prototype.isubn=function(e){if(n(\"number\"==typeof e),n(e<67108864),e<0)return this.iaddn(-e);if(0!==this.negative)return this.negative=0,this.iaddn(e),this.negative=1,this;if(this.words[0]-=e,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var t=0;t<this.length&&this.words[t]<0;t++)this.words[t]+=67108864,this.words[t+1]-=1;return this.strip()},s.prototype.addn=function(e){return this.clone().iaddn(e)},s.prototype.subn=function(e){return this.clone().isubn(e)},s.prototype.iabs=function(){return this.negative=0,this},s.prototype.abs=function(){return this.clone().iabs()},s.prototype._ishlnsubmul=function(e,t,r){var i,s,o=e.length+r;this._expand(o);var a=0;for(i=0;i<e.length;i++){s=(0|this.words[i+r])+a;var l=(0|e.words[i])*t;a=((s-=67108863&l)>>26)-(l/67108864|0),this.words[i+r]=67108863&s}for(;i<this.length-r;i++)a=(s=(0|this.words[i+r])+a)>>26,this.words[i+r]=67108863&s;if(0===a)return this.strip();for(n(-1===a),a=0,i=0;i<this.length;i++)a=(s=-(0|this.words[i])+a)>>26,this.words[i]=67108863&s;return this.negative=1,this.strip()},s.prototype._wordDiv=function(e,t){var r=(this.length,e.length),n=this.clone(),i=e,o=0|i.words[i.length-1];0!==(r=26-this._countBits(o))&&(i=i.ushln(r),n.iushln(r),o=0|i.words[i.length-1]);var a,l=n.length-i.length;if(\"mod\"!==t){(a=new s(null)).length=l+1,a.words=new Array(a.length);for(var c=0;c<a.length;c++)a.words[c]=0}var u=n.clone()._ishlnsubmul(i,1,l);0===u.negative&&(n=u,a&&(a.words[l]=1));for(var h=l-1;h>=0;h--){var f=67108864*(0|n.words[i.length+h])+(0|n.words[i.length+h-1]);for(f=Math.min(f/o|0,67108863),n._ishlnsubmul(i,f,h);0!==n.negative;)f--,n.negative=0,n._ishlnsubmul(i,1,h),n.isZero()||(n.negative^=1);a&&(a.words[h]=f)}return a&&a.strip(),n.strip(),\"div\"!==t&&0!==r&&n.iushrn(r),{div:a||null,mod:n}},s.prototype.divmod=function(e,t,r){return n(!e.isZero()),this.isZero()?{div:new s(0),mod:new s(0)}:0!==this.negative&&0===e.negative?(a=this.neg().divmod(e,t),\"mod\"!==t&&(i=a.div.neg()),\"div\"!==t&&(o=a.mod.neg(),r&&0!==o.negative&&o.iadd(e)),{div:i,mod:o}):0===this.negative&&0!==e.negative?(a=this.divmod(e.neg(),t),\"mod\"!==t&&(i=a.div.neg()),{div:i,mod:a.mod}):0!=(this.negative&e.negative)?(a=this.neg().divmod(e.neg(),t),\"div\"!==t&&(o=a.mod.neg(),r&&0!==o.negative&&o.isub(e)),{div:a.div,mod:o}):e.length>this.length||this.cmp(e)<0?{div:new s(0),mod:this}:1===e.length?\"div\"===t?{div:this.divn(e.words[0]),mod:null}:\"mod\"===t?{div:null,mod:new s(this.modn(e.words[0]))}:{div:this.divn(e.words[0]),mod:new s(this.modn(e.words[0]))}:this._wordDiv(e,t);var i,o,a},s.prototype.div=function(e){return this.divmod(e,\"div\",!1).div},s.prototype.mod=function(e){return this.divmod(e,\"mod\",!1).mod},s.prototype.umod=function(e){return this.divmod(e,\"mod\",!0).mod},s.prototype.divRound=function(e){var t=this.divmod(e);if(t.mod.isZero())return t.div;var r=0!==t.div.negative?t.mod.isub(e):t.mod,n=e.ushrn(1),i=e.andln(1),s=r.cmp(n);return s<0||1===i&&0===s?t.div:0!==t.div.negative?t.div.isubn(1):t.div.iaddn(1)},s.prototype.modn=function(e){n(e<=67108863);for(var t=(1<<26)%e,r=0,i=this.length-1;i>=0;i--)r=(t*r+(0|this.words[i]))%e;return r},s.prototype.idivn=function(e){n(e<=67108863);for(var t=0,r=this.length-1;r>=0;r--){var i=(0|this.words[r])+67108864*t;this.words[r]=i/e|0,t=i%e}return this.strip()},s.prototype.divn=function(e){return this.clone().idivn(e)},s.prototype.egcd=function(e){n(0===e.negative),n(!e.isZero());var t=this,r=e.clone();t=0!==t.negative?t.umod(e):t.clone();for(var i=new s(1),o=new s(0),a=new s(0),l=new s(1),c=0;t.isEven()&&r.isEven();)t.iushrn(1),r.iushrn(1),++c;for(var u=r.clone(),h=t.clone();!t.isZero();){for(var f=0,d=1;0==(t.words[0]&d)&&f<26;++f,d<<=1);if(f>0)for(t.iushrn(f);f-- >0;)(i.isOdd()||o.isOdd())&&(i.iadd(u),o.isub(h)),i.iushrn(1),o.iushrn(1);for(var p=0,m=1;0==(r.words[0]&m)&&p<26;++p,m<<=1);if(p>0)for(r.iushrn(p);p-- >0;)(a.isOdd()||l.isOdd())&&(a.iadd(u),l.isub(h)),a.iushrn(1),l.iushrn(1);t.cmp(r)>=0?(t.isub(r),i.isub(a),o.isub(l)):(r.isub(t),a.isub(i),l.isub(o))}return{a:a,b:l,gcd:r.iushln(c)}},s.prototype._invmp=function(e){n(0===e.negative),n(!e.isZero());var t=this,r=e.clone();t=0!==t.negative?t.umod(e):t.clone();for(var i,o=new s(1),a=new s(0),l=r.clone();t.cmpn(1)>0&&r.cmpn(1)>0;){for(var c=0,u=1;0==(t.words[0]&u)&&c<26;++c,u<<=1);if(c>0)for(t.iushrn(c);c-- >0;)o.isOdd()&&o.iadd(l),o.iushrn(1);for(var h=0,f=1;0==(r.words[0]&f)&&h<26;++h,f<<=1);if(h>0)for(r.iushrn(h);h-- >0;)a.isOdd()&&a.iadd(l),a.iushrn(1);t.cmp(r)>=0?(t.isub(r),o.isub(a)):(r.isub(t),a.isub(o))}return(i=0===t.cmpn(1)?o:a).cmpn(0)<0&&i.iadd(e),i},s.prototype.gcd=function(e){if(this.isZero())return e.abs();if(e.isZero())return this.abs();var t=this.clone(),r=e.clone();t.negative=0,r.negative=0;for(var n=0;t.isEven()&&r.isEven();n++)t.iushrn(1),r.iushrn(1);for(;;){for(;t.isEven();)t.iushrn(1);for(;r.isEven();)r.iushrn(1);var i=t.cmp(r);if(i<0){var s=t;t=r,r=s}else if(0===i||0===r.cmpn(1))break;t.isub(r)}return r.iushln(n)},s.prototype.invm=function(e){return this.egcd(e).a.umod(e)},s.prototype.isEven=function(){return 0==(1&this.words[0])},s.prototype.isOdd=function(){return 1==(1&this.words[0])},s.prototype.andln=function(e){return this.words[0]&e},s.prototype.bincn=function(e){n(\"number\"==typeof e);var t=e%26,r=(e-t)/26,i=1<<t;if(this.length<=r)return this._expand(r+1),this.words[r]|=i,this;for(var s=i,o=r;0!==s&&o<this.length;o++){var a=0|this.words[o];s=(a+=s)>>>26,a&=67108863,this.words[o]=a}return 0!==s&&(this.words[o]=s,this.length++),this},s.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},s.prototype.cmpn=function(e){var t,r=e<0;if(0!==this.negative&&!r)return-1;if(0===this.negative&&r)return 1;if(this.strip(),this.length>1)t=1;else{r&&(e=-e),n(e<=67108863,\"Number is too big\");var i=0|this.words[0];t=i===e?0:i<e?-1:1}return 0!==this.negative?0|-t:t},s.prototype.cmp=function(e){if(0!==this.negative&&0===e.negative)return-1;if(0===this.negative&&0!==e.negative)return 1;var t=this.ucmp(e);return 0!==this.negative?0|-t:t},s.prototype.ucmp=function(e){if(this.length>e.length)return 1;if(this.length<e.length)return-1;for(var t=0,r=this.length-1;r>=0;r--){var n=0|this.words[r],i=0|e.words[r];if(n!==i){n<i?t=-1:n>i&&(t=1);break}}return t},s.prototype.gtn=function(e){return 1===this.cmpn(e)},s.prototype.gt=function(e){return 1===this.cmp(e)},s.prototype.gten=function(e){return this.cmpn(e)>=0},s.prototype.gte=function(e){return this.cmp(e)>=0},s.prototype.ltn=function(e){return-1===this.cmpn(e)},s.prototype.lt=function(e){return-1===this.cmp(e)},s.prototype.lten=function(e){return this.cmpn(e)<=0},s.prototype.lte=function(e){return this.cmp(e)<=0},s.prototype.eqn=function(e){return 0===this.cmpn(e)},s.prototype.eq=function(e){return 0===this.cmp(e)},s.red=function(e){return new k(e)},s.prototype.toRed=function(e){return n(!this.red,\"Already a number in reduction context\"),n(0===this.negative,\"red works only with positives\"),e.convertTo(this)._forceRed(e)},s.prototype.fromRed=function(){return n(this.red,\"fromRed works only with numbers in reduction context\"),this.red.convertFrom(this)},s.prototype._forceRed=function(e){return this.red=e,this},s.prototype.forceRed=function(e){return n(!this.red,\"Already a number in reduction context\"),this._forceRed(e)},s.prototype.redAdd=function(e){return n(this.red,\"redAdd works only with red numbers\"),this.red.add(this,e)},s.prototype.redIAdd=function(e){return n(this.red,\"redIAdd works only with red numbers\"),this.red.iadd(this,e)},s.prototype.redSub=function(e){return n(this.red,\"redSub works only with red numbers\"),this.red.sub(this,e)},s.prototype.redISub=function(e){return n(this.red,\"redISub works only with red numbers\"),this.red.isub(this,e)},s.prototype.redShl=function(e){return n(this.red,\"redShl works only with red numbers\"),this.red.shl(this,e)},s.prototype.redMul=function(e){return n(this.red,\"redMul works only with red numbers\"),this.red._verify2(this,e),this.red.mul(this,e)},s.prototype.redIMul=function(e){return n(this.red,\"redMul works only with red numbers\"),this.red._verify2(this,e),this.red.imul(this,e)},s.prototype.redSqr=function(){return n(this.red,\"redSqr works only with red numbers\"),this.red._verify1(this),this.red.sqr(this)},s.prototype.redISqr=function(){return n(this.red,\"redISqr works only with red numbers\"),this.red._verify1(this),this.red.isqr(this)},s.prototype.redSqrt=function(){return n(this.red,\"redSqrt works only with red numbers\"),this.red._verify1(this),this.red.sqrt(this)},s.prototype.redInvm=function(){return n(this.red,\"redInvm works only with red numbers\"),this.red._verify1(this),this.red.invm(this)},s.prototype.redNeg=function(){return n(this.red,\"redNeg works only with red numbers\"),this.red._verify1(this),this.red.neg(this)},s.prototype.redPow=function(e){return n(this.red&&!e.red,\"redPow(normalNum)\"),this.red._verify1(this),this.red.pow(this,e)};var g={k256:null,p224:null,p192:null,p25519:null};function y(e,t){this.name=e,this.p=new s(t,16),this.n=this.p.bitLength(),this.k=new s(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function v(){y.call(this,\"k256\",\"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f\")}function w(){y.call(this,\"p224\",\"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001\")}function _(){y.call(this,\"p192\",\"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff\")}function x(){y.call(this,\"25519\",\"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed\")}function k(e){if(\"string\"==typeof e){var t=s._prime(e);this.m=t.p,this.prime=t}else n(e.gtn(1),\"modulus must be greater than 1\"),this.m=e,this.prime=null}function S(e){k.call(this,e),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new s(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}y.prototype._tmp=function(){var e=new s(null);return e.words=new Array(Math.ceil(this.n/13)),e},y.prototype.ireduce=function(e){var t,r=e;do{this.split(r,this.tmp),t=(r=(r=this.imulK(r)).iadd(this.tmp)).bitLength()}while(t>this.n);var n=t<this.n?-1:r.ucmp(this.p);return 0===n?(r.words[0]=0,r.length=1):n>0?r.isub(this.p):void 0!==r.strip?r.strip():r._strip(),r},y.prototype.split=function(e,t){e.iushrn(this.n,0,t)},y.prototype.imulK=function(e){return e.imul(this.k)},i(v,y),v.prototype.split=function(e,t){for(var r=Math.min(e.length,9),n=0;n<r;n++)t.words[n]=e.words[n];if(t.length=r,e.length<=9)return e.words[0]=0,void(e.length=1);var i=e.words[9];for(t.words[t.length++]=4194303&i,n=10;n<e.length;n++){var s=0|e.words[n];e.words[n-10]=(4194303&s)<<4|i>>>22,i=s}i>>>=22,e.words[n-10]=i,0===i&&e.length>10?e.length-=10:e.length-=9},v.prototype.imulK=function(e){e.words[e.length]=0,e.words[e.length+1]=0,e.length+=2;for(var t=0,r=0;r<e.length;r++){var n=0|e.words[r];t+=977*n,e.words[r]=67108863&t,t=64*n+(t/67108864|0)}return 0===e.words[e.length-1]&&(e.length--,0===e.words[e.length-1]&&e.length--),e},i(w,y),i(_,y),i(x,y),x.prototype.imulK=function(e){for(var t=0,r=0;r<e.length;r++){var n=19*(0|e.words[r])+t,i=67108863&n;n>>>=26,e.words[r]=i,t=n}return 0!==t&&(e.words[e.length++]=t),e},s._prime=function(e){if(g[e])return g[e];var t;if(\"k256\"===e)t=new v;else if(\"p224\"===e)t=new w;else if(\"p192\"===e)t=new _;else{if(\"p25519\"!==e)throw new Error(\"Unknown prime \"+e);t=new x}return g[e]=t,t},k.prototype._verify1=function(e){n(0===e.negative,\"red works only with positives\"),n(e.red,\"red works only with red numbers\")},k.prototype._verify2=function(e,t){n(0==(e.negative|t.negative),\"red works only with positives\"),n(e.red&&e.red===t.red,\"red works only with red numbers\")},k.prototype.imod=function(e){return this.prime?this.prime.ireduce(e)._forceRed(this):e.umod(this.m)._forceRed(this)},k.prototype.neg=function(e){return e.isZero()?e.clone():this.m.sub(e)._forceRed(this)},k.prototype.add=function(e,t){this._verify2(e,t);var r=e.add(t);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},k.prototype.iadd=function(e,t){this._verify2(e,t);var r=e.iadd(t);return r.cmp(this.m)>=0&&r.isub(this.m),r},k.prototype.sub=function(e,t){this._verify2(e,t);var r=e.sub(t);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},k.prototype.isub=function(e,t){this._verify2(e,t);var r=e.isub(t);return r.cmpn(0)<0&&r.iadd(this.m),r},k.prototype.shl=function(e,t){return this._verify1(e),this.imod(e.ushln(t))},k.prototype.imul=function(e,t){return this._verify2(e,t),this.imod(e.imul(t))},k.prototype.mul=function(e,t){return this._verify2(e,t),this.imod(e.mul(t))},k.prototype.isqr=function(e){return this.imul(e,e.clone())},k.prototype.sqr=function(e){return this.mul(e,e)},k.prototype.sqrt=function(e){if(e.isZero())return e.clone();var t=this.m.andln(3);if(n(t%2==1),3===t){var r=this.m.add(new s(1)).iushrn(2);return this.pow(e,r)}for(var i=this.m.subn(1),o=0;!i.isZero()&&0===i.andln(1);)o++,i.iushrn(1);n(!i.isZero());var a=new s(1).toRed(this),l=a.redNeg(),c=this.m.subn(1).iushrn(1),u=this.m.bitLength();for(u=new s(2*u*u).toRed(this);0!==this.pow(u,c).cmp(l);)u.redIAdd(l);for(var h=this.pow(u,i),f=this.pow(e,i.addn(1).iushrn(1)),d=this.pow(e,i),p=o;0!==d.cmp(a);){for(var m=d,b=0;0!==m.cmp(a);b++)m=m.redSqr();n(b<p);var g=this.pow(h,new s(1).iushln(p-b-1));f=f.redMul(g),h=g.redSqr(),d=d.redMul(h),p=b}return f},k.prototype.invm=function(e){var t=e._invmp(this.m);return 0!==t.negative?(t.negative=0,this.imod(t).redNeg()):this.imod(t)},k.prototype.pow=function(e,t){if(t.isZero())return new s(1).toRed(this);if(0===t.cmpn(1))return e.clone();var r=new Array(16);r[0]=new s(1).toRed(this),r[1]=e;for(var n=2;n<r.length;n++)r[n]=this.mul(r[n-1],e);var i=r[0],o=0,a=0,l=t.bitLength()%26;for(0===l&&(l=26),n=t.length-1;n>=0;n--){for(var c=t.words[n],u=l-1;u>=0;u--){var h=c>>u&1;i!==r[0]&&(i=this.sqr(i)),0!==h||0!==o?(o<<=1,o|=h,(4===++a||0===n&&0===u)&&(i=this.mul(i,r[o]),a=0,o=0)):a=0}l=26}return i},k.prototype.convertTo=function(e){var t=e.umod(this.m);return t===e?t.clone():t},k.prototype.convertFrom=function(e){var t=e.clone();return t.red=null,t},s.mont=function(e){return new S(e)},i(S,k),S.prototype.convertTo=function(e){return this.imod(e.ushln(this.shift))},S.prototype.convertFrom=function(e){var t=this.imod(e.mul(this.rinv));return t.red=null,t},S.prototype.imul=function(e,t){if(e.isZero()||t.isZero())return e.words[0]=0,e.length=1,e;var r=e.imul(t),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),s=i;return i.cmp(this.m)>=0?s=i.isub(this.m):i.cmpn(0)<0&&(s=i.iadd(this.m)),s._forceRed(this)},S.prototype.mul=function(e,t){if(e.isZero()||t.isZero())return new s(0)._forceRed(this);var r=e.mul(t),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),o=i;return i.cmp(this.m)>=0?o=i.isub(this.m):i.cmpn(0)<0&&(o=i.iadd(this.m)),o._forceRed(this)},S.prototype.invm=function(e){return this.imod(e._invmp(this.m).mul(this.r2))._forceRed(this)}}(void 0===t||t)},{buffer:188}],185:[function(e,t,r){\"use strict\";r.byteLength=function(e){var t=c(e),r=t[0],n=t[1];return 3*(r+n)/4-n},r.toByteArray=function(e){var t,r,n=c(e),o=n[0],a=n[1],l=new s(function(e,t,r){return 3*(t+r)/4-r}(0,o,a)),u=0,h=a>0?o-4:o;for(r=0;r<h;r+=4)t=i[e.charCodeAt(r)]<<18|i[e.charCodeAt(r+1)]<<12|i[e.charCodeAt(r+2)]<<6|i[e.charCodeAt(r+3)],l[u++]=t>>16&255,l[u++]=t>>8&255,l[u++]=255&t;2===a&&(t=i[e.charCodeAt(r)]<<2|i[e.charCodeAt(r+1)]>>4,l[u++]=255&t);1===a&&(t=i[e.charCodeAt(r)]<<10|i[e.charCodeAt(r+1)]<<4|i[e.charCodeAt(r+2)]>>2,l[u++]=t>>8&255,l[u++]=255&t);return l},r.fromByteArray=function(e){for(var t,r=e.length,i=r%3,s=[],o=0,a=r-i;o<a;o+=16383)s.push(u(e,o,o+16383>a?a:o+16383));1===i?(t=e[r-1],s.push(n[t>>2]+n[t<<4&63]+\"==\")):2===i&&(t=(e[r-2]<<8)+e[r-1],s.push(n[t>>10]+n[t>>4&63]+n[t<<2&63]+\"=\"));return s.join(\"\")};for(var n=[],i=[],s=\"undefined\"!=typeof Uint8Array?Uint8Array:Array,o=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",a=0,l=o.length;a<l;++a)n[a]=o[a],i[o.charCodeAt(a)]=a;function c(e){var t=e.length;if(t%4>0)throw new Error(\"Invalid string. Length must be a multiple of 4\");var r=e.indexOf(\"=\");return-1===r&&(r=t),[r,r===t?0:4-r%4]}function u(e,t,r){for(var i,s,o=[],a=t;a<r;a+=3)i=(e[a]<<16&16711680)+(e[a+1]<<8&65280)+(255&e[a+2]),o.push(n[(s=i)>>18&63]+n[s>>12&63]+n[s>>6&63]+n[63&s]);return o.join(\"\")}i[\"-\".charCodeAt(0)]=62,i[\"_\".charCodeAt(0)]=63},{}],186:[function(e,t,r){\"use strict\";!function(t,r){function n(e,t){if(!e)throw new Error(t||\"Assertion failed\")}function i(e,t){e.super_=t;var r=function(){};r.prototype=t.prototype,e.prototype=new r,e.prototype.constructor=e}function s(e,t,r){if(s.isBN(e))return e;this.negative=0,this.words=null,this.length=0,this.red=null,null!==e&&(\"le\"!==t&&\"be\"!==t||(r=t,t=10),this._init(e||0,t||10,r||\"be\"))}var o;\"object\"==typeof t?t.exports=s:(void 0).BN=s,s.BN=s,s.wordSize=26;try{o=\"undefined\"!=typeof window&&void 0!==window.Buffer?window.Buffer:e(\"buffer\").Buffer}catch(e){}function a(e,t){var r=e.charCodeAt(t);return r>=48&&r<=57?r-48:r>=65&&r<=70?r-55:r>=97&&r<=102?r-87:void n(!1,\"Invalid character in \"+e)}function l(e,t,r){var n=a(e,r);return r-1>=t&&(n|=a(e,r-1)<<4),n}function c(e,t,r,i){for(var s=0,o=0,a=Math.min(e.length,r),l=t;l<a;l++){var c=e.charCodeAt(l)-48;s*=i,o=c>=49?c-49+10:c>=17?c-17+10:c,n(c>=0&&o<i,\"Invalid character\"),s+=o}return s}function u(e,t){e.words=t.words,e.length=t.length,e.negative=t.negative,e.red=t.red}if(s.isBN=function(e){return e instanceof s||null!==e&&\"object\"==typeof e&&e.constructor.wordSize===s.wordSize&&Array.isArray(e.words)},s.max=function(e,t){return e.cmp(t)>0?e:t},s.min=function(e,t){return e.cmp(t)<0?e:t},s.prototype._init=function(e,t,r){if(\"number\"==typeof e)return this._initNumber(e,t,r);if(\"object\"==typeof e)return this._initArray(e,t,r);\"hex\"===t&&(t=16),n(t===(0|t)&&t>=2&&t<=36);var i=0;\"-\"===(e=e.toString().replace(/\\s+/g,\"\"))[0]&&(i++,this.negative=1),i<e.length&&(16===t?this._parseHex(e,i,r):(this._parseBase(e,t,i),\"le\"===r&&this._initArray(this.toArray(),t,r)))},s.prototype._initNumber=function(e,t,r){e<0&&(this.negative=1,e=-e),e<67108864?(this.words=[67108863&e],this.length=1):e<4503599627370496?(this.words=[67108863&e,e/67108864&67108863],this.length=2):(n(e<9007199254740992),this.words=[67108863&e,e/67108864&67108863,1],this.length=3),\"le\"===r&&this._initArray(this.toArray(),t,r)},s.prototype._initArray=function(e,t,r){if(n(\"number\"==typeof e.length),e.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(e.length/3),this.words=new Array(this.length);for(var i=0;i<this.length;i++)this.words[i]=0;var s,o,a=0;if(\"be\"===r)for(i=e.length-1,s=0;i>=0;i-=3)o=e[i]|e[i-1]<<8|e[i-2]<<16,this.words[s]|=o<<a&67108863,this.words[s+1]=o>>>26-a&67108863,(a+=24)>=26&&(a-=26,s++);else if(\"le\"===r)for(i=0,s=0;i<e.length;i+=3)o=e[i]|e[i+1]<<8|e[i+2]<<16,this.words[s]|=o<<a&67108863,this.words[s+1]=o>>>26-a&67108863,(a+=24)>=26&&(a-=26,s++);return this._strip()},s.prototype._parseHex=function(e,t,r){this.length=Math.ceil((e.length-t)/6),this.words=new Array(this.length);for(var n=0;n<this.length;n++)this.words[n]=0;var i,s=0,o=0;if(\"be\"===r)for(n=e.length-1;n>=t;n-=2)i=l(e,t,n)<<s,this.words[o]|=67108863&i,s>=18?(s-=18,o+=1,this.words[o]|=i>>>26):s+=8;else for(n=(e.length-t)%2==0?t+1:t;n<e.length;n+=2)i=l(e,t,n)<<s,this.words[o]|=67108863&i,s>=18?(s-=18,o+=1,this.words[o]|=i>>>26):s+=8;this._strip()},s.prototype._parseBase=function(e,t,r){this.words=[0],this.length=1;for(var n=0,i=1;i<=67108863;i*=t)n++;n--,i=i/t|0;for(var s=e.length-r,o=s%n,a=Math.min(s,s-o)+r,l=0,u=r;u<a;u+=n)l=c(e,u,u+n,t),this.imuln(i),this.words[0]+l<67108864?this.words[0]+=l:this._iaddn(l);if(0!==o){var h=1;for(l=c(e,u,e.length,t),u=0;u<o;u++)h*=t;this.imuln(h),this.words[0]+l<67108864?this.words[0]+=l:this._iaddn(l)}this._strip()},s.prototype.copy=function(e){e.words=new Array(this.length);for(var t=0;t<this.length;t++)e.words[t]=this.words[t];e.length=this.length,e.negative=this.negative,e.red=this.red},s.prototype._move=function(e){u(e,this)},s.prototype.clone=function(){var e=new s(null);return this.copy(e),e},s.prototype._expand=function(e){for(;this.length<e;)this.words[this.length++]=0;return this},s.prototype._strip=function(){for(;this.length>1&&0===this.words[this.length-1];)this.length--;return this._normSign()},s.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},\"undefined\"!=typeof Symbol&&\"function\"==typeof Symbol.for)try{s.prototype[Symbol.for(\"nodejs.util.inspect.custom\")]=h}catch(e){s.prototype.inspect=h}else s.prototype.inspect=h;function h(){return(this.red?\"<BN-R: \":\"<BN: \")+this.toString(16)+\">\"}var f=[\"\",\"0\",\"00\",\"000\",\"0000\",\"00000\",\"000000\",\"0000000\",\"00000000\",\"000000000\",\"0000000000\",\"00000000000\",\"000000000000\",\"0000000000000\",\"00000000000000\",\"000000000000000\",\"0000000000000000\",\"00000000000000000\",\"000000000000000000\",\"0000000000000000000\",\"00000000000000000000\",\"000000000000000000000\",\"0000000000000000000000\",\"00000000000000000000000\",\"000000000000000000000000\",\"0000000000000000000000000\"],d=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],p=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];s.prototype.toString=function(e,t){var r;if(t=0|t||1,16===(e=e||10)||\"hex\"===e){r=\"\";for(var i=0,s=0,o=0;o<this.length;o++){var a=this.words[o],l=(16777215&(a<<i|s)).toString(16);s=a>>>24-i&16777215,(i+=2)>=26&&(i-=26,o--),r=0!==s||o!==this.length-1?f[6-l.length]+l+r:l+r}for(0!==s&&(r=s.toString(16)+r);r.length%t!=0;)r=\"0\"+r;return 0!==this.negative&&(r=\"-\"+r),r}if(e===(0|e)&&e>=2&&e<=36){var c=d[e],u=p[e];r=\"\";var h=this.clone();for(h.negative=0;!h.isZero();){var m=h.modrn(u).toString(e);r=(h=h.idivn(u)).isZero()?m+r:f[c-m.length]+m+r}for(this.isZero()&&(r=\"0\"+r);r.length%t!=0;)r=\"0\"+r;return 0!==this.negative&&(r=\"-\"+r),r}n(!1,\"Base should be between 2 and 36\")},s.prototype.toNumber=function(){var e=this.words[0];return 2===this.length?e+=67108864*this.words[1]:3===this.length&&1===this.words[2]?e+=4503599627370496+67108864*this.words[1]:this.length>2&&n(!1,\"Number can only safely store up to 53 bits\"),0!==this.negative?-e:e},s.prototype.toJSON=function(){return this.toString(16,2)},o&&(s.prototype.toBuffer=function(e,t){return this.toArrayLike(o,e,t)}),s.prototype.toArray=function(e,t){return this.toArrayLike(Array,e,t)};function m(e,t,r){r.negative=t.negative^e.negative;var n=e.length+t.length|0;r.length=n,n=n-1|0;var i=0|e.words[0],s=0|t.words[0],o=i*s,a=67108863&o,l=o/67108864|0;r.words[0]=a;for(var c=1;c<n;c++){for(var u=l>>>26,h=67108863&l,f=Math.min(c,t.length-1),d=Math.max(0,c-e.length+1);d<=f;d++){var p=c-d|0;u+=(o=(i=0|e.words[p])*(s=0|t.words[d])+h)/67108864|0,h=67108863&o}r.words[c]=0|h,l=0|u}return 0!==l?r.words[c]=0|l:r.length--,r._strip()}s.prototype.toArrayLike=function(e,t,r){this._strip();var i=this.byteLength(),s=r||Math.max(1,i);n(i<=s,\"byte array longer than desired length\"),n(s>0,\"Requested array length <= 0\");var o=function(e,t){return e.allocUnsafe?e.allocUnsafe(t):new e(t)}(e,s);return this[\"_toArrayLike\"+(\"le\"===t?\"LE\":\"BE\")](o,i),o},s.prototype._toArrayLikeLE=function(e,t){for(var r=0,n=0,i=0,s=0;i<this.length;i++){var o=this.words[i]<<s|n;e[r++]=255&o,r<e.length&&(e[r++]=o>>8&255),r<e.length&&(e[r++]=o>>16&255),6===s?(r<e.length&&(e[r++]=o>>24&255),n=0,s=0):(n=o>>>24,s+=2)}if(r<e.length)for(e[r++]=n;r<e.length;)e[r++]=0},s.prototype._toArrayLikeBE=function(e,t){for(var r=e.length-1,n=0,i=0,s=0;i<this.length;i++){var o=this.words[i]<<s|n;e[r--]=255&o,r>=0&&(e[r--]=o>>8&255),r>=0&&(e[r--]=o>>16&255),6===s?(r>=0&&(e[r--]=o>>24&255),n=0,s=0):(n=o>>>24,s+=2)}if(r>=0)for(e[r--]=n;r>=0;)e[r--]=0},Math.clz32?s.prototype._countBits=function(e){return 32-Math.clz32(e)}:s.prototype._countBits=function(e){var t=e,r=0;return t>=4096&&(r+=13,t>>>=13),t>=64&&(r+=7,t>>>=7),t>=8&&(r+=4,t>>>=4),t>=2&&(r+=2,t>>>=2),r+t},s.prototype._zeroBits=function(e){if(0===e)return 26;var t=e,r=0;return 0==(8191&t)&&(r+=13,t>>>=13),0==(127&t)&&(r+=7,t>>>=7),0==(15&t)&&(r+=4,t>>>=4),0==(3&t)&&(r+=2,t>>>=2),0==(1&t)&&r++,r},s.prototype.bitLength=function(){var e=this.words[this.length-1],t=this._countBits(e);return 26*(this.length-1)+t},s.prototype.zeroBits=function(){if(this.isZero())return 0;for(var e=0,t=0;t<this.length;t++){var r=this._zeroBits(this.words[t]);if(e+=r,26!==r)break}return e},s.prototype.byteLength=function(){return Math.ceil(this.bitLength()/8)},s.prototype.toTwos=function(e){return 0!==this.negative?this.abs().inotn(e).iaddn(1):this.clone()},s.prototype.fromTwos=function(e){return this.testn(e-1)?this.notn(e).iaddn(1).ineg():this.clone()},s.prototype.isNeg=function(){return 0!==this.negative},s.prototype.neg=function(){return this.clone().ineg()},s.prototype.ineg=function(){return this.isZero()||(this.negative^=1),this},s.prototype.iuor=function(e){for(;this.length<e.length;)this.words[this.length++]=0;for(var t=0;t<e.length;t++)this.words[t]=this.words[t]|e.words[t];return this._strip()},s.prototype.ior=function(e){return n(0==(this.negative|e.negative)),this.iuor(e)},s.prototype.or=function(e){return this.length>e.length?this.clone().ior(e):e.clone().ior(this)},s.prototype.uor=function(e){return this.length>e.length?this.clone().iuor(e):e.clone().iuor(this)},s.prototype.iuand=function(e){var t;t=this.length>e.length?e:this;for(var r=0;r<t.length;r++)this.words[r]=this.words[r]&e.words[r];return this.length=t.length,this._strip()},s.prototype.iand=function(e){return n(0==(this.negative|e.negative)),this.iuand(e)},s.prototype.and=function(e){return this.length>e.length?this.clone().iand(e):e.clone().iand(this)},s.prototype.uand=function(e){return this.length>e.length?this.clone().iuand(e):e.clone().iuand(this)},s.prototype.iuxor=function(e){var t,r;this.length>e.length?(t=this,r=e):(t=e,r=this);for(var n=0;n<r.length;n++)this.words[n]=t.words[n]^r.words[n];if(this!==t)for(;n<t.length;n++)this.words[n]=t.words[n];return this.length=t.length,this._strip()},s.prototype.ixor=function(e){return n(0==(this.negative|e.negative)),this.iuxor(e)},s.prototype.xor=function(e){return this.length>e.length?this.clone().ixor(e):e.clone().ixor(this)},s.prototype.uxor=function(e){return this.length>e.length?this.clone().iuxor(e):e.clone().iuxor(this)},s.prototype.inotn=function(e){n(\"number\"==typeof e&&e>=0);var t=0|Math.ceil(e/26),r=e%26;this._expand(t),r>0&&t--;for(var i=0;i<t;i++)this.words[i]=67108863&~this.words[i];return r>0&&(this.words[i]=~this.words[i]&67108863>>26-r),this._strip()},s.prototype.notn=function(e){return this.clone().inotn(e)},s.prototype.setn=function(e,t){n(\"number\"==typeof e&&e>=0);var r=e/26|0,i=e%26;return this._expand(r+1),this.words[r]=t?this.words[r]|1<<i:this.words[r]&~(1<<i),this._strip()},s.prototype.iadd=function(e){var t,r,n;if(0!==this.negative&&0===e.negative)return this.negative=0,t=this.isub(e),this.negative^=1,this._normSign();if(0===this.negative&&0!==e.negative)return e.negative=0,t=this.isub(e),e.negative=1,t._normSign();this.length>e.length?(r=this,n=e):(r=e,n=this);for(var i=0,s=0;s<n.length;s++)t=(0|r.words[s])+(0|n.words[s])+i,this.words[s]=67108863&t,i=t>>>26;for(;0!==i&&s<r.length;s++)t=(0|r.words[s])+i,this.words[s]=67108863&t,i=t>>>26;if(this.length=r.length,0!==i)this.words[this.length]=i,this.length++;else if(r!==this)for(;s<r.length;s++)this.words[s]=r.words[s];return this},s.prototype.add=function(e){var t;return 0!==e.negative&&0===this.negative?(e.negative=0,t=this.sub(e),e.negative^=1,t):0===e.negative&&0!==this.negative?(this.negative=0,t=e.sub(this),this.negative=1,t):this.length>e.length?this.clone().iadd(e):e.clone().iadd(this)},s.prototype.isub=function(e){if(0!==e.negative){e.negative=0;var t=this.iadd(e);return e.negative=1,t._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(e),this.negative=1,this._normSign();var r,n,i=this.cmp(e);if(0===i)return this.negative=0,this.length=1,this.words[0]=0,this;i>0?(r=this,n=e):(r=e,n=this);for(var s=0,o=0;o<n.length;o++)s=(t=(0|r.words[o])-(0|n.words[o])+s)>>26,this.words[o]=67108863&t;for(;0!==s&&o<r.length;o++)s=(t=(0|r.words[o])+s)>>26,this.words[o]=67108863&t;if(0===s&&o<r.length&&r!==this)for(;o<r.length;o++)this.words[o]=r.words[o];return this.length=Math.max(this.length,o),r!==this&&(this.negative=1),this._strip()},s.prototype.sub=function(e){return this.clone().isub(e)};var b=function(e,t,r){var n,i,s,o=e.words,a=t.words,l=r.words,c=0,u=0|o[0],h=8191&u,f=u>>>13,d=0|o[1],p=8191&d,m=d>>>13,b=0|o[2],g=8191&b,y=b>>>13,v=0|o[3],w=8191&v,_=v>>>13,x=0|o[4],k=8191&x,S=x>>>13,M=0|o[5],C=8191&M,T=M>>>13,E=0|o[6],A=8191&E,R=E>>>13,O=0|o[7],j=8191&O,I=O>>>13,N=0|o[8],P=8191&N,B=N>>>13,D=0|o[9],F=8191&D,L=D>>>13,z=0|a[0],U=8191&z,$=z>>>13,H=0|a[1],V=8191&H,q=H>>>13,W=0|a[2],X=8191&W,K=W>>>13,Y=0|a[3],Z=8191&Y,G=Y>>>13,J=0|a[4],Q=8191&J,ee=J>>>13,te=0|a[5],re=8191&te,ne=te>>>13,ie=0|a[6],se=8191&ie,oe=ie>>>13,ae=0|a[7],le=8191&ae,ce=ae>>>13,ue=0|a[8],he=8191&ue,fe=ue>>>13,de=0|a[9],pe=8191&de,me=de>>>13;r.negative=e.negative^t.negative,r.length=19;var be=(c+(n=Math.imul(h,U))|0)+((8191&(i=(i=Math.imul(h,$))+Math.imul(f,U)|0))<<13)|0;c=((s=Math.imul(f,$))+(i>>>13)|0)+(be>>>26)|0,be&=67108863,n=Math.imul(p,U),i=(i=Math.imul(p,$))+Math.imul(m,U)|0,s=Math.imul(m,$);var ge=(c+(n=n+Math.imul(h,V)|0)|0)+((8191&(i=(i=i+Math.imul(h,q)|0)+Math.imul(f,V)|0))<<13)|0;c=((s=s+Math.imul(f,q)|0)+(i>>>13)|0)+(ge>>>26)|0,ge&=67108863,n=Math.imul(g,U),i=(i=Math.imul(g,$))+Math.imul(y,U)|0,s=Math.imul(y,$),n=n+Math.imul(p,V)|0,i=(i=i+Math.imul(p,q)|0)+Math.imul(m,V)|0,s=s+Math.imul(m,q)|0;var ye=(c+(n=n+Math.imul(h,X)|0)|0)+((8191&(i=(i=i+Math.imul(h,K)|0)+Math.imul(f,X)|0))<<13)|0;c=((s=s+Math.imul(f,K)|0)+(i>>>13)|0)+(ye>>>26)|0,ye&=67108863,n=Math.imul(w,U),i=(i=Math.imul(w,$))+Math.imul(_,U)|0,s=Math.imul(_,$),n=n+Math.imul(g,V)|0,i=(i=i+Math.imul(g,q)|0)+Math.imul(y,V)|0,s=s+Math.imul(y,q)|0,n=n+Math.imul(p,X)|0,i=(i=i+Math.imul(p,K)|0)+Math.imul(m,X)|0,s=s+Math.imul(m,K)|0;var ve=(c+(n=n+Math.imul(h,Z)|0)|0)+((8191&(i=(i=i+Math.imul(h,G)|0)+Math.imul(f,Z)|0))<<13)|0;c=((s=s+Math.imul(f,G)|0)+(i>>>13)|0)+(ve>>>26)|0,ve&=67108863,n=Math.imul(k,U),i=(i=Math.imul(k,$))+Math.imul(S,U)|0,s=Math.imul(S,$),n=n+Math.imul(w,V)|0,i=(i=i+Math.imul(w,q)|0)+Math.imul(_,V)|0,s=s+Math.imul(_,q)|0,n=n+Math.imul(g,X)|0,i=(i=i+Math.imul(g,K)|0)+Math.imul(y,X)|0,s=s+Math.imul(y,K)|0,n=n+Math.imul(p,Z)|0,i=(i=i+Math.imul(p,G)|0)+Math.imul(m,Z)|0,s=s+Math.imul(m,G)|0;var we=(c+(n=n+Math.imul(h,Q)|0)|0)+((8191&(i=(i=i+Math.imul(h,ee)|0)+Math.imul(f,Q)|0))<<13)|0;c=((s=s+Math.imul(f,ee)|0)+(i>>>13)|0)+(we>>>26)|0,we&=67108863,n=Math.imul(C,U),i=(i=Math.imul(C,$))+Math.imul(T,U)|0,s=Math.imul(T,$),n=n+Math.imul(k,V)|0,i=(i=i+Math.imul(k,q)|0)+Math.imul(S,V)|0,s=s+Math.imul(S,q)|0,n=n+Math.imul(w,X)|0,i=(i=i+Math.imul(w,K)|0)+Math.imul(_,X)|0,s=s+Math.imul(_,K)|0,n=n+Math.imul(g,Z)|0,i=(i=i+Math.imul(g,G)|0)+Math.imul(y,Z)|0,s=s+Math.imul(y,G)|0,n=n+Math.imul(p,Q)|0,i=(i=i+Math.imul(p,ee)|0)+Math.imul(m,Q)|0,s=s+Math.imul(m,ee)|0;var _e=(c+(n=n+Math.imul(h,re)|0)|0)+((8191&(i=(i=i+Math.imul(h,ne)|0)+Math.imul(f,re)|0))<<13)|0;c=((s=s+Math.imul(f,ne)|0)+(i>>>13)|0)+(_e>>>26)|0,_e&=67108863,n=Math.imul(A,U),i=(i=Math.imul(A,$))+Math.imul(R,U)|0,s=Math.imul(R,$),n=n+Math.imul(C,V)|0,i=(i=i+Math.imul(C,q)|0)+Math.imul(T,V)|0,s=s+Math.imul(T,q)|0,n=n+Math.imul(k,X)|0,i=(i=i+Math.imul(k,K)|0)+Math.imul(S,X)|0,s=s+Math.imul(S,K)|0,n=n+Math.imul(w,Z)|0,i=(i=i+Math.imul(w,G)|0)+Math.imul(_,Z)|0,s=s+Math.imul(_,G)|0,n=n+Math.imul(g,Q)|0,i=(i=i+Math.imul(g,ee)|0)+Math.imul(y,Q)|0,s=s+Math.imul(y,ee)|0,n=n+Math.imul(p,re)|0,i=(i=i+Math.imul(p,ne)|0)+Math.imul(m,re)|0,s=s+Math.imul(m,ne)|0;var xe=(c+(n=n+Math.imul(h,se)|0)|0)+((8191&(i=(i=i+Math.imul(h,oe)|0)+Math.imul(f,se)|0))<<13)|0;c=((s=s+Math.imul(f,oe)|0)+(i>>>13)|0)+(xe>>>26)|0,xe&=67108863,n=Math.imul(j,U),i=(i=Math.imul(j,$))+Math.imul(I,U)|0,s=Math.imul(I,$),n=n+Math.imul(A,V)|0,i=(i=i+Math.imul(A,q)|0)+Math.imul(R,V)|0,s=s+Math.imul(R,q)|0,n=n+Math.imul(C,X)|0,i=(i=i+Math.imul(C,K)|0)+Math.imul(T,X)|0,s=s+Math.imul(T,K)|0,n=n+Math.imul(k,Z)|0,i=(i=i+Math.imul(k,G)|0)+Math.imul(S,Z)|0,s=s+Math.imul(S,G)|0,n=n+Math.imul(w,Q)|0,i=(i=i+Math.imul(w,ee)|0)+Math.imul(_,Q)|0,s=s+Math.imul(_,ee)|0,n=n+Math.imul(g,re)|0,i=(i=i+Math.imul(g,ne)|0)+Math.imul(y,re)|0,s=s+Math.imul(y,ne)|0,n=n+Math.imul(p,se)|0,i=(i=i+Math.imul(p,oe)|0)+Math.imul(m,se)|0,s=s+Math.imul(m,oe)|0;var ke=(c+(n=n+Math.imul(h,le)|0)|0)+((8191&(i=(i=i+Math.imul(h,ce)|0)+Math.imul(f,le)|0))<<13)|0;c=((s=s+Math.imul(f,ce)|0)+(i>>>13)|0)+(ke>>>26)|0,ke&=67108863,n=Math.imul(P,U),i=(i=Math.imul(P,$))+Math.imul(B,U)|0,s=Math.imul(B,$),n=n+Math.imul(j,V)|0,i=(i=i+Math.imul(j,q)|0)+Math.imul(I,V)|0,s=s+Math.imul(I,q)|0,n=n+Math.imul(A,X)|0,i=(i=i+Math.imul(A,K)|0)+Math.imul(R,X)|0,s=s+Math.imul(R,K)|0,n=n+Math.imul(C,Z)|0,i=(i=i+Math.imul(C,G)|0)+Math.imul(T,Z)|0,s=s+Math.imul(T,G)|0,n=n+Math.imul(k,Q)|0,i=(i=i+Math.imul(k,ee)|0)+Math.imul(S,Q)|0,s=s+Math.imul(S,ee)|0,n=n+Math.imul(w,re)|0,i=(i=i+Math.imul(w,ne)|0)+Math.imul(_,re)|0,s=s+Math.imul(_,ne)|0,n=n+Math.imul(g,se)|0,i=(i=i+Math.imul(g,oe)|0)+Math.imul(y,se)|0,s=s+Math.imul(y,oe)|0,n=n+Math.imul(p,le)|0,i=(i=i+Math.imul(p,ce)|0)+Math.imul(m,le)|0,s=s+Math.imul(m,ce)|0;var Se=(c+(n=n+Math.imul(h,he)|0)|0)+((8191&(i=(i=i+Math.imul(h,fe)|0)+Math.imul(f,he)|0))<<13)|0;c=((s=s+Math.imul(f,fe)|0)+(i>>>13)|0)+(Se>>>26)|0,Se&=67108863,n=Math.imul(F,U),i=(i=Math.imul(F,$))+Math.imul(L,U)|0,s=Math.imul(L,$),n=n+Math.imul(P,V)|0,i=(i=i+Math.imul(P,q)|0)+Math.imul(B,V)|0,s=s+Math.imul(B,q)|0,n=n+Math.imul(j,X)|0,i=(i=i+Math.imul(j,K)|0)+Math.imul(I,X)|0,s=s+Math.imul(I,K)|0,n=n+Math.imul(A,Z)|0,i=(i=i+Math.imul(A,G)|0)+Math.imul(R,Z)|0,s=s+Math.imul(R,G)|0,n=n+Math.imul(C,Q)|0,i=(i=i+Math.imul(C,ee)|0)+Math.imul(T,Q)|0,s=s+Math.imul(T,ee)|0,n=n+Math.imul(k,re)|0,i=(i=i+Math.imul(k,ne)|0)+Math.imul(S,re)|0,s=s+Math.imul(S,ne)|0,n=n+Math.imul(w,se)|0,i=(i=i+Math.imul(w,oe)|0)+Math.imul(_,se)|0,s=s+Math.imul(_,oe)|0,n=n+Math.imul(g,le)|0,i=(i=i+Math.imul(g,ce)|0)+Math.imul(y,le)|0,s=s+Math.imul(y,ce)|0,n=n+Math.imul(p,he)|0,i=(i=i+Math.imul(p,fe)|0)+Math.imul(m,he)|0,s=s+Math.imul(m,fe)|0;var Me=(c+(n=n+Math.imul(h,pe)|0)|0)+((8191&(i=(i=i+Math.imul(h,me)|0)+Math.imul(f,pe)|0))<<13)|0;c=((s=s+Math.imul(f,me)|0)+(i>>>13)|0)+(Me>>>26)|0,Me&=67108863,n=Math.imul(F,V),i=(i=Math.imul(F,q))+Math.imul(L,V)|0,s=Math.imul(L,q),n=n+Math.imul(P,X)|0,i=(i=i+Math.imul(P,K)|0)+Math.imul(B,X)|0,s=s+Math.imul(B,K)|0,n=n+Math.imul(j,Z)|0,i=(i=i+Math.imul(j,G)|0)+Math.imul(I,Z)|0,s=s+Math.imul(I,G)|0,n=n+Math.imul(A,Q)|0,i=(i=i+Math.imul(A,ee)|0)+Math.imul(R,Q)|0,s=s+Math.imul(R,ee)|0,n=n+Math.imul(C,re)|0,i=(i=i+Math.imul(C,ne)|0)+Math.imul(T,re)|0,s=s+Math.imul(T,ne)|0,n=n+Math.imul(k,se)|0,i=(i=i+Math.imul(k,oe)|0)+Math.imul(S,se)|0,s=s+Math.imul(S,oe)|0,n=n+Math.imul(w,le)|0,i=(i=i+Math.imul(w,ce)|0)+Math.imul(_,le)|0,s=s+Math.imul(_,ce)|0,n=n+Math.imul(g,he)|0,i=(i=i+Math.imul(g,fe)|0)+Math.imul(y,he)|0,s=s+Math.imul(y,fe)|0;var Ce=(c+(n=n+Math.imul(p,pe)|0)|0)+((8191&(i=(i=i+Math.imul(p,me)|0)+Math.imul(m,pe)|0))<<13)|0;c=((s=s+Math.imul(m,me)|0)+(i>>>13)|0)+(Ce>>>26)|0,Ce&=67108863,n=Math.imul(F,X),i=(i=Math.imul(F,K))+Math.imul(L,X)|0,s=Math.imul(L,K),n=n+Math.imul(P,Z)|0,i=(i=i+Math.imul(P,G)|0)+Math.imul(B,Z)|0,s=s+Math.imul(B,G)|0,n=n+Math.imul(j,Q)|0,i=(i=i+Math.imul(j,ee)|0)+Math.imul(I,Q)|0,s=s+Math.imul(I,ee)|0,n=n+Math.imul(A,re)|0,i=(i=i+Math.imul(A,ne)|0)+Math.imul(R,re)|0,s=s+Math.imul(R,ne)|0,n=n+Math.imul(C,se)|0,i=(i=i+Math.imul(C,oe)|0)+Math.imul(T,se)|0,s=s+Math.imul(T,oe)|0,n=n+Math.imul(k,le)|0,i=(i=i+Math.imul(k,ce)|0)+Math.imul(S,le)|0,s=s+Math.imul(S,ce)|0,n=n+Math.imul(w,he)|0,i=(i=i+Math.imul(w,fe)|0)+Math.imul(_,he)|0,s=s+Math.imul(_,fe)|0;var Te=(c+(n=n+Math.imul(g,pe)|0)|0)+((8191&(i=(i=i+Math.imul(g,me)|0)+Math.imul(y,pe)|0))<<13)|0;c=((s=s+Math.imul(y,me)|0)+(i>>>13)|0)+(Te>>>26)|0,Te&=67108863,n=Math.imul(F,Z),i=(i=Math.imul(F,G))+Math.imul(L,Z)|0,s=Math.imul(L,G),n=n+Math.imul(P,Q)|0,i=(i=i+Math.imul(P,ee)|0)+Math.imul(B,Q)|0,s=s+Math.imul(B,ee)|0,n=n+Math.imul(j,re)|0,i=(i=i+Math.imul(j,ne)|0)+Math.imul(I,re)|0,s=s+Math.imul(I,ne)|0,n=n+Math.imul(A,se)|0,i=(i=i+Math.imul(A,oe)|0)+Math.imul(R,se)|0,s=s+Math.imul(R,oe)|0,n=n+Math.imul(C,le)|0,i=(i=i+Math.imul(C,ce)|0)+Math.imul(T,le)|0,s=s+Math.imul(T,ce)|0,n=n+Math.imul(k,he)|0,i=(i=i+Math.imul(k,fe)|0)+Math.imul(S,he)|0,s=s+Math.imul(S,fe)|0;var Ee=(c+(n=n+Math.imul(w,pe)|0)|0)+((8191&(i=(i=i+Math.imul(w,me)|0)+Math.imul(_,pe)|0))<<13)|0;c=((s=s+Math.imul(_,me)|0)+(i>>>13)|0)+(Ee>>>26)|0,Ee&=67108863,n=Math.imul(F,Q),i=(i=Math.imul(F,ee))+Math.imul(L,Q)|0,s=Math.imul(L,ee),n=n+Math.imul(P,re)|0,i=(i=i+Math.imul(P,ne)|0)+Math.imul(B,re)|0,s=s+Math.imul(B,ne)|0,n=n+Math.imul(j,se)|0,i=(i=i+Math.imul(j,oe)|0)+Math.imul(I,se)|0,s=s+Math.imul(I,oe)|0,n=n+Math.imul(A,le)|0,i=(i=i+Math.imul(A,ce)|0)+Math.imul(R,le)|0,s=s+Math.imul(R,ce)|0,n=n+Math.imul(C,he)|0,i=(i=i+Math.imul(C,fe)|0)+Math.imul(T,he)|0,s=s+Math.imul(T,fe)|0;var Ae=(c+(n=n+Math.imul(k,pe)|0)|0)+((8191&(i=(i=i+Math.imul(k,me)|0)+Math.imul(S,pe)|0))<<13)|0;c=((s=s+Math.imul(S,me)|0)+(i>>>13)|0)+(Ae>>>26)|0,Ae&=67108863,n=Math.imul(F,re),i=(i=Math.imul(F,ne))+Math.imul(L,re)|0,s=Math.imul(L,ne),n=n+Math.imul(P,se)|0,i=(i=i+Math.imul(P,oe)|0)+Math.imul(B,se)|0,s=s+Math.imul(B,oe)|0,n=n+Math.imul(j,le)|0,i=(i=i+Math.imul(j,ce)|0)+Math.imul(I,le)|0,s=s+Math.imul(I,ce)|0,n=n+Math.imul(A,he)|0,i=(i=i+Math.imul(A,fe)|0)+Math.imul(R,he)|0,s=s+Math.imul(R,fe)|0;var Re=(c+(n=n+Math.imul(C,pe)|0)|0)+((8191&(i=(i=i+Math.imul(C,me)|0)+Math.imul(T,pe)|0))<<13)|0;c=((s=s+Math.imul(T,me)|0)+(i>>>13)|0)+(Re>>>26)|0,Re&=67108863,n=Math.imul(F,se),i=(i=Math.imul(F,oe))+Math.imul(L,se)|0,s=Math.imul(L,oe),n=n+Math.imul(P,le)|0,i=(i=i+Math.imul(P,ce)|0)+Math.imul(B,le)|0,s=s+Math.imul(B,ce)|0,n=n+Math.imul(j,he)|0,i=(i=i+Math.imul(j,fe)|0)+Math.imul(I,he)|0,s=s+Math.imul(I,fe)|0;var Oe=(c+(n=n+Math.imul(A,pe)|0)|0)+((8191&(i=(i=i+Math.imul(A,me)|0)+Math.imul(R,pe)|0))<<13)|0;c=((s=s+Math.imul(R,me)|0)+(i>>>13)|0)+(Oe>>>26)|0,Oe&=67108863,n=Math.imul(F,le),i=(i=Math.imul(F,ce))+Math.imul(L,le)|0,s=Math.imul(L,ce),n=n+Math.imul(P,he)|0,i=(i=i+Math.imul(P,fe)|0)+Math.imul(B,he)|0,s=s+Math.imul(B,fe)|0;var je=(c+(n=n+Math.imul(j,pe)|0)|0)+((8191&(i=(i=i+Math.imul(j,me)|0)+Math.imul(I,pe)|0))<<13)|0;c=((s=s+Math.imul(I,me)|0)+(i>>>13)|0)+(je>>>26)|0,je&=67108863,n=Math.imul(F,he),i=(i=Math.imul(F,fe))+Math.imul(L,he)|0,s=Math.imul(L,fe);var Ie=(c+(n=n+Math.imul(P,pe)|0)|0)+((8191&(i=(i=i+Math.imul(P,me)|0)+Math.imul(B,pe)|0))<<13)|0;c=((s=s+Math.imul(B,me)|0)+(i>>>13)|0)+(Ie>>>26)|0,Ie&=67108863;var Ne=(c+(n=Math.imul(F,pe))|0)+((8191&(i=(i=Math.imul(F,me))+Math.imul(L,pe)|0))<<13)|0;return c=((s=Math.imul(L,me))+(i>>>13)|0)+(Ne>>>26)|0,Ne&=67108863,l[0]=be,l[1]=ge,l[2]=ye,l[3]=ve,l[4]=we,l[5]=_e,l[6]=xe,l[7]=ke,l[8]=Se,l[9]=Me,l[10]=Ce,l[11]=Te,l[12]=Ee,l[13]=Ae,l[14]=Re,l[15]=Oe,l[16]=je,l[17]=Ie,l[18]=Ne,0!==c&&(l[19]=c,r.length++),r};function g(e,t,r){r.negative=t.negative^e.negative,r.length=e.length+t.length;for(var n=0,i=0,s=0;s<r.length-1;s++){var o=i;i=0;for(var a=67108863&n,l=Math.min(s,t.length-1),c=Math.max(0,s-e.length+1);c<=l;c++){var u=s-c,h=(0|e.words[u])*(0|t.words[c]),f=67108863&h;a=67108863&(f=f+a|0),i+=(o=(o=o+(h/67108864|0)|0)+(f>>>26)|0)>>>26,o&=67108863}r.words[s]=a,n=o,o=i}return 0!==n?r.words[s]=n:r.length--,r._strip()}function y(e,t,r){return g(e,t,r)}function v(e,t){this.x=e,this.y=t}Math.imul||(b=m),s.prototype.mulTo=function(e,t){var r=this.length+e.length;return 10===this.length&&10===e.length?b(this,e,t):r<63?m(this,e,t):r<1024?g(this,e,t):y(this,e,t)},v.prototype.makeRBT=function(e){for(var t=new Array(e),r=s.prototype._countBits(e)-1,n=0;n<e;n++)t[n]=this.revBin(n,r,e);return t},v.prototype.revBin=function(e,t,r){if(0===e||e===r-1)return e;for(var n=0,i=0;i<t;i++)n|=(1&e)<<t-i-1,e>>=1;return n},v.prototype.permute=function(e,t,r,n,i,s){for(var o=0;o<s;o++)n[o]=t[e[o]],i[o]=r[e[o]]},v.prototype.transform=function(e,t,r,n,i,s){this.permute(s,e,t,r,n,i);for(var o=1;o<i;o<<=1)for(var a=o<<1,l=Math.cos(2*Math.PI/a),c=Math.sin(2*Math.PI/a),u=0;u<i;u+=a)for(var h=l,f=c,d=0;d<o;d++){var p=r[u+d],m=n[u+d],b=r[u+d+o],g=n[u+d+o],y=h*b-f*g;g=h*g+f*b,b=y,r[u+d]=p+b,n[u+d]=m+g,r[u+d+o]=p-b,n[u+d+o]=m-g,d!==a&&(y=l*h-c*f,f=l*f+c*h,h=y)}},v.prototype.guessLen13b=function(e,t){var r=1|Math.max(t,e),n=1&r,i=0;for(r=r/2|0;r;r>>>=1)i++;return 1<<i+1+n},v.prototype.conjugate=function(e,t,r){if(!(r<=1))for(var n=0;n<r/2;n++){var i=e[n];e[n]=e[r-n-1],e[r-n-1]=i,i=t[n],t[n]=-t[r-n-1],t[r-n-1]=-i}},v.prototype.normalize13b=function(e,t){for(var r=0,n=0;n<t/2;n++){var i=8192*Math.round(e[2*n+1]/t)+Math.round(e[2*n]/t)+r;e[n]=67108863&i,r=i<67108864?0:i/67108864|0}return e},v.prototype.convert13b=function(e,t,r,i){for(var s=0,o=0;o<t;o++)s+=0|e[o],r[2*o]=8191&s,s>>>=13,r[2*o+1]=8191&s,s>>>=13;for(o=2*t;o<i;++o)r[o]=0;n(0===s),n(0==(-8192&s))},v.prototype.stub=function(e){for(var t=new Array(e),r=0;r<e;r++)t[r]=0;return t},v.prototype.mulp=function(e,t,r){var n=2*this.guessLen13b(e.length,t.length),i=this.makeRBT(n),s=this.stub(n),o=new Array(n),a=new Array(n),l=new Array(n),c=new Array(n),u=new Array(n),h=new Array(n),f=r.words;f.length=n,this.convert13b(e.words,e.length,o,n),this.convert13b(t.words,t.length,c,n),this.transform(o,s,a,l,n,i),this.transform(c,s,u,h,n,i);for(var d=0;d<n;d++){var p=a[d]*u[d]-l[d]*h[d];l[d]=a[d]*h[d]+l[d]*u[d],a[d]=p}return this.conjugate(a,l,n),this.transform(a,l,f,s,n,i),this.conjugate(f,s,n),this.normalize13b(f,n),r.negative=e.negative^t.negative,r.length=e.length+t.length,r._strip()},s.prototype.mul=function(e){var t=new s(null);return t.words=new Array(this.length+e.length),this.mulTo(e,t)},s.prototype.mulf=function(e){var t=new s(null);return t.words=new Array(this.length+e.length),y(this,e,t)},s.prototype.imul=function(e){return this.clone().mulTo(e,this)},s.prototype.imuln=function(e){var t=e<0;t&&(e=-e),n(\"number\"==typeof e),n(e<67108864);for(var r=0,i=0;i<this.length;i++){var s=(0|this.words[i])*e,o=(67108863&s)+(67108863&r);r>>=26,r+=s/67108864|0,r+=o>>>26,this.words[i]=67108863&o}return 0!==r&&(this.words[i]=r,this.length++),t?this.ineg():this},s.prototype.muln=function(e){return this.clone().imuln(e)},s.prototype.sqr=function(){return this.mul(this)},s.prototype.isqr=function(){return this.imul(this.clone())},s.prototype.pow=function(e){var t=function(e){for(var t=new Array(e.bitLength()),r=0;r<t.length;r++){var n=r/26|0,i=r%26;t[r]=e.words[n]>>>i&1}return t}(e);if(0===t.length)return new s(1);for(var r=this,n=0;n<t.length&&0===t[n];n++,r=r.sqr());if(++n<t.length)for(var i=r.sqr();n<t.length;n++,i=i.sqr())0!==t[n]&&(r=r.mul(i));return r},s.prototype.iushln=function(e){n(\"number\"==typeof e&&e>=0);var t,r=e%26,i=(e-r)/26,s=67108863>>>26-r<<26-r;if(0!==r){var o=0;for(t=0;t<this.length;t++){var a=this.words[t]&s,l=(0|this.words[t])-a<<r;this.words[t]=l|o,o=a>>>26-r}o&&(this.words[t]=o,this.length++)}if(0!==i){for(t=this.length-1;t>=0;t--)this.words[t+i]=this.words[t];for(t=0;t<i;t++)this.words[t]=0;this.length+=i}return this._strip()},s.prototype.ishln=function(e){return n(0===this.negative),this.iushln(e)},s.prototype.iushrn=function(e,t,r){var i;n(\"number\"==typeof e&&e>=0),i=t?(t-t%26)/26:0;var s=e%26,o=Math.min((e-s)/26,this.length),a=67108863^67108863>>>s<<s,l=r;if(i-=o,i=Math.max(0,i),l){for(var c=0;c<o;c++)l.words[c]=this.words[c];l.length=o}if(0===o);else if(this.length>o)for(this.length-=o,c=0;c<this.length;c++)this.words[c]=this.words[c+o];else this.words[0]=0,this.length=1;var u=0;for(c=this.length-1;c>=0&&(0!==u||c>=i);c--){var h=0|this.words[c];this.words[c]=u<<26-s|h>>>s,u=h&a}return l&&0!==u&&(l.words[l.length++]=u),0===this.length&&(this.words[0]=0,this.length=1),this._strip()},s.prototype.ishrn=function(e,t,r){return n(0===this.negative),this.iushrn(e,t,r)},s.prototype.shln=function(e){return this.clone().ishln(e)},s.prototype.ushln=function(e){return this.clone().iushln(e)},s.prototype.shrn=function(e){return this.clone().ishrn(e)},s.prototype.ushrn=function(e){return this.clone().iushrn(e)},s.prototype.testn=function(e){n(\"number\"==typeof e&&e>=0);var t=e%26,r=(e-t)/26,i=1<<t;return!(this.length<=r)&&!!(this.words[r]&i)},s.prototype.imaskn=function(e){n(\"number\"==typeof e&&e>=0);var t=e%26,r=(e-t)/26;if(n(0===this.negative,\"imaskn works only with positive numbers\"),this.length<=r)return this;if(0!==t&&r++,this.length=Math.min(r,this.length),0!==t){var i=67108863^67108863>>>t<<t;this.words[this.length-1]&=i}return this._strip()},s.prototype.maskn=function(e){return this.clone().imaskn(e)},s.prototype.iaddn=function(e){return n(\"number\"==typeof e),n(e<67108864),e<0?this.isubn(-e):0!==this.negative?1===this.length&&(0|this.words[0])<=e?(this.words[0]=e-(0|this.words[0]),this.negative=0,this):(this.negative=0,this.isubn(e),this.negative=1,this):this._iaddn(e)},s.prototype._iaddn=function(e){this.words[0]+=e;for(var t=0;t<this.length&&this.words[t]>=67108864;t++)this.words[t]-=67108864,t===this.length-1?this.words[t+1]=1:this.words[t+1]++;return this.length=Math.max(this.length,t+1),this},s.prototype.isubn=function(e){if(n(\"number\"==typeof e),n(e<67108864),e<0)return this.iaddn(-e);if(0!==this.negative)return this.negative=0,this.iaddn(e),this.negative=1,this;if(this.words[0]-=e,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var t=0;t<this.length&&this.words[t]<0;t++)this.words[t]+=67108864,this.words[t+1]-=1;return this._strip()},s.prototype.addn=function(e){return this.clone().iaddn(e)},s.prototype.subn=function(e){return this.clone().isubn(e)},s.prototype.iabs=function(){return this.negative=0,this},s.prototype.abs=function(){return this.clone().iabs()},s.prototype._ishlnsubmul=function(e,t,r){var i,s,o=e.length+r;this._expand(o);var a=0;for(i=0;i<e.length;i++){s=(0|this.words[i+r])+a;var l=(0|e.words[i])*t;a=((s-=67108863&l)>>26)-(l/67108864|0),this.words[i+r]=67108863&s}for(;i<this.length-r;i++)a=(s=(0|this.words[i+r])+a)>>26,this.words[i+r]=67108863&s;if(0===a)return this._strip();for(n(-1===a),a=0,i=0;i<this.length;i++)a=(s=-(0|this.words[i])+a)>>26,this.words[i]=67108863&s;return this.negative=1,this._strip()},s.prototype._wordDiv=function(e,t){var r=(this.length,e.length),n=this.clone(),i=e,o=0|i.words[i.length-1];0!==(r=26-this._countBits(o))&&(i=i.ushln(r),n.iushln(r),o=0|i.words[i.length-1]);var a,l=n.length-i.length;if(\"mod\"!==t){(a=new s(null)).length=l+1,a.words=new Array(a.length);for(var c=0;c<a.length;c++)a.words[c]=0}var u=n.clone()._ishlnsubmul(i,1,l);0===u.negative&&(n=u,a&&(a.words[l]=1));for(var h=l-1;h>=0;h--){var f=67108864*(0|n.words[i.length+h])+(0|n.words[i.length+h-1]);for(f=Math.min(f/o|0,67108863),n._ishlnsubmul(i,f,h);0!==n.negative;)f--,n.negative=0,n._ishlnsubmul(i,1,h),n.isZero()||(n.negative^=1);a&&(a.words[h]=f)}return a&&a._strip(),n._strip(),\"div\"!==t&&0!==r&&n.iushrn(r),{div:a||null,mod:n}},s.prototype.divmod=function(e,t,r){return n(!e.isZero()),this.isZero()?{div:new s(0),mod:new s(0)}:0!==this.negative&&0===e.negative?(a=this.neg().divmod(e,t),\"mod\"!==t&&(i=a.div.neg()),\"div\"!==t&&(o=a.mod.neg(),r&&0!==o.negative&&o.iadd(e)),{div:i,mod:o}):0===this.negative&&0!==e.negative?(a=this.divmod(e.neg(),t),\"mod\"!==t&&(i=a.div.neg()),{div:i,mod:a.mod}):0!=(this.negative&e.negative)?(a=this.neg().divmod(e.neg(),t),\"div\"!==t&&(o=a.mod.neg(),r&&0!==o.negative&&o.isub(e)),{div:a.div,mod:o}):e.length>this.length||this.cmp(e)<0?{div:new s(0),mod:this}:1===e.length?\"div\"===t?{div:this.divn(e.words[0]),mod:null}:\"mod\"===t?{div:null,mod:new s(this.modrn(e.words[0]))}:{div:this.divn(e.words[0]),mod:new s(this.modrn(e.words[0]))}:this._wordDiv(e,t);var i,o,a},s.prototype.div=function(e){return this.divmod(e,\"div\",!1).div},s.prototype.mod=function(e){return this.divmod(e,\"mod\",!1).mod},s.prototype.umod=function(e){return this.divmod(e,\"mod\",!0).mod},s.prototype.divRound=function(e){var t=this.divmod(e);if(t.mod.isZero())return t.div;var r=0!==t.div.negative?t.mod.isub(e):t.mod,n=e.ushrn(1),i=e.andln(1),s=r.cmp(n);return s<0||1===i&&0===s?t.div:0!==t.div.negative?t.div.isubn(1):t.div.iaddn(1)},s.prototype.modrn=function(e){var t=e<0;t&&(e=-e),n(e<=67108863);for(var r=(1<<26)%e,i=0,s=this.length-1;s>=0;s--)i=(r*i+(0|this.words[s]))%e;return t?-i:i},s.prototype.modn=function(e){return this.modrn(e)},s.prototype.idivn=function(e){var t=e<0;t&&(e=-e),n(e<=67108863);for(var r=0,i=this.length-1;i>=0;i--){var s=(0|this.words[i])+67108864*r;this.words[i]=s/e|0,r=s%e}return this._strip(),t?this.ineg():this},s.prototype.divn=function(e){return this.clone().idivn(e)},s.prototype.egcd=function(e){n(0===e.negative),n(!e.isZero());var t=this,r=e.clone();t=0!==t.negative?t.umod(e):t.clone();for(var i=new s(1),o=new s(0),a=new s(0),l=new s(1),c=0;t.isEven()&&r.isEven();)t.iushrn(1),r.iushrn(1),++c;for(var u=r.clone(),h=t.clone();!t.isZero();){for(var f=0,d=1;0==(t.words[0]&d)&&f<26;++f,d<<=1);if(f>0)for(t.iushrn(f);f-- >0;)(i.isOdd()||o.isOdd())&&(i.iadd(u),o.isub(h)),i.iushrn(1),o.iushrn(1);for(var p=0,m=1;0==(r.words[0]&m)&&p<26;++p,m<<=1);if(p>0)for(r.iushrn(p);p-- >0;)(a.isOdd()||l.isOdd())&&(a.iadd(u),l.isub(h)),a.iushrn(1),l.iushrn(1);t.cmp(r)>=0?(t.isub(r),i.isub(a),o.isub(l)):(r.isub(t),a.isub(i),l.isub(o))}return{a:a,b:l,gcd:r.iushln(c)}},s.prototype._invmp=function(e){n(0===e.negative),n(!e.isZero());var t=this,r=e.clone();t=0!==t.negative?t.umod(e):t.clone();for(var i,o=new s(1),a=new s(0),l=r.clone();t.cmpn(1)>0&&r.cmpn(1)>0;){for(var c=0,u=1;0==(t.words[0]&u)&&c<26;++c,u<<=1);if(c>0)for(t.iushrn(c);c-- >0;)o.isOdd()&&o.iadd(l),o.iushrn(1);for(var h=0,f=1;0==(r.words[0]&f)&&h<26;++h,f<<=1);if(h>0)for(r.iushrn(h);h-- >0;)a.isOdd()&&a.iadd(l),a.iushrn(1);t.cmp(r)>=0?(t.isub(r),o.isub(a)):(r.isub(t),a.isub(o))}return(i=0===t.cmpn(1)?o:a).cmpn(0)<0&&i.iadd(e),i},s.prototype.gcd=function(e){if(this.isZero())return e.abs();if(e.isZero())return this.abs();var t=this.clone(),r=e.clone();t.negative=0,r.negative=0;for(var n=0;t.isEven()&&r.isEven();n++)t.iushrn(1),r.iushrn(1);for(;;){for(;t.isEven();)t.iushrn(1);for(;r.isEven();)r.iushrn(1);var i=t.cmp(r);if(i<0){var s=t;t=r,r=s}else if(0===i||0===r.cmpn(1))break;t.isub(r)}return r.iushln(n)},s.prototype.invm=function(e){return this.egcd(e).a.umod(e)},s.prototype.isEven=function(){return 0==(1&this.words[0])},s.prototype.isOdd=function(){return 1==(1&this.words[0])},s.prototype.andln=function(e){return this.words[0]&e},s.prototype.bincn=function(e){n(\"number\"==typeof e);var t=e%26,r=(e-t)/26,i=1<<t;if(this.length<=r)return this._expand(r+1),this.words[r]|=i,this;for(var s=i,o=r;0!==s&&o<this.length;o++){var a=0|this.words[o];s=(a+=s)>>>26,a&=67108863,this.words[o]=a}return 0!==s&&(this.words[o]=s,this.length++),this},s.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},s.prototype.cmpn=function(e){var t,r=e<0;if(0!==this.negative&&!r)return-1;if(0===this.negative&&r)return 1;if(this._strip(),this.length>1)t=1;else{r&&(e=-e),n(e<=67108863,\"Number is too big\");var i=0|this.words[0];t=i===e?0:i<e?-1:1}return 0!==this.negative?0|-t:t},s.prototype.cmp=function(e){if(0!==this.negative&&0===e.negative)return-1;if(0===this.negative&&0!==e.negative)return 1;var t=this.ucmp(e);return 0!==this.negative?0|-t:t},s.prototype.ucmp=function(e){if(this.length>e.length)return 1;if(this.length<e.length)return-1;for(var t=0,r=this.length-1;r>=0;r--){var n=0|this.words[r],i=0|e.words[r];if(n!==i){n<i?t=-1:n>i&&(t=1);break}}return t},s.prototype.gtn=function(e){return 1===this.cmpn(e)},s.prototype.gt=function(e){return 1===this.cmp(e)},s.prototype.gten=function(e){return this.cmpn(e)>=0},s.prototype.gte=function(e){return this.cmp(e)>=0},s.prototype.ltn=function(e){return-1===this.cmpn(e)},s.prototype.lt=function(e){return-1===this.cmp(e)},s.prototype.lten=function(e){return this.cmpn(e)<=0},s.prototype.lte=function(e){return this.cmp(e)<=0},s.prototype.eqn=function(e){return 0===this.cmpn(e)},s.prototype.eq=function(e){return 0===this.cmp(e)},s.red=function(e){return new C(e)},s.prototype.toRed=function(e){return n(!this.red,\"Already a number in reduction context\"),n(0===this.negative,\"red works only with positives\"),e.convertTo(this)._forceRed(e)},s.prototype.fromRed=function(){return n(this.red,\"fromRed works only with numbers in reduction context\"),this.red.convertFrom(this)},s.prototype._forceRed=function(e){return this.red=e,this},s.prototype.forceRed=function(e){return n(!this.red,\"Already a number in reduction context\"),this._forceRed(e)},s.prototype.redAdd=function(e){return n(this.red,\"redAdd works only with red numbers\"),this.red.add(this,e)},s.prototype.redIAdd=function(e){return n(this.red,\"redIAdd works only with red numbers\"),this.red.iadd(this,e)},s.prototype.redSub=function(e){return n(this.red,\"redSub works only with red numbers\"),this.red.sub(this,e)},s.prototype.redISub=function(e){return n(this.red,\"redISub works only with red numbers\"),this.red.isub(this,e)},s.prototype.redShl=function(e){return n(this.red,\"redShl works only with red numbers\"),this.red.shl(this,e)},s.prototype.redMul=function(e){return n(this.red,\"redMul works only with red numbers\"),this.red._verify2(this,e),this.red.mul(this,e)},s.prototype.redIMul=function(e){return n(this.red,\"redMul works only with red numbers\"),this.red._verify2(this,e),this.red.imul(this,e)},s.prototype.redSqr=function(){return n(this.red,\"redSqr works only with red numbers\"),this.red._verify1(this),this.red.sqr(this)},s.prototype.redISqr=function(){return n(this.red,\"redISqr works only with red numbers\"),this.red._verify1(this),this.red.isqr(this)},s.prototype.redSqrt=function(){return n(this.red,\"redSqrt works only with red numbers\"),this.red._verify1(this),this.red.sqrt(this)},s.prototype.redInvm=function(){return n(this.red,\"redInvm works only with red numbers\"),this.red._verify1(this),this.red.invm(this)},s.prototype.redNeg=function(){return n(this.red,\"redNeg works only with red numbers\"),this.red._verify1(this),this.red.neg(this)},s.prototype.redPow=function(e){return n(this.red&&!e.red,\"redPow(normalNum)\"),this.red._verify1(this),this.red.pow(this,e)};var w={k256:null,p224:null,p192:null,p25519:null};function _(e,t){this.name=e,this.p=new s(t,16),this.n=this.p.bitLength(),this.k=new s(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function x(){_.call(this,\"k256\",\"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f\")}function k(){_.call(this,\"p224\",\"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001\")}function S(){_.call(this,\"p192\",\"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff\")}function M(){_.call(this,\"25519\",\"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed\")}function C(e){if(\"string\"==typeof e){var t=s._prime(e);this.m=t.p,this.prime=t}else n(e.gtn(1),\"modulus must be greater than 1\"),this.m=e,this.prime=null}function T(e){C.call(this,e),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new s(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}_.prototype._tmp=function(){var e=new s(null);return e.words=new Array(Math.ceil(this.n/13)),e},_.prototype.ireduce=function(e){var t,r=e;do{this.split(r,this.tmp),t=(r=(r=this.imulK(r)).iadd(this.tmp)).bitLength()}while(t>this.n);var n=t<this.n?-1:r.ucmp(this.p);return 0===n?(r.words[0]=0,r.length=1):n>0?r.isub(this.p):void 0!==r.strip?r.strip():r._strip(),r},_.prototype.split=function(e,t){e.iushrn(this.n,0,t)},_.prototype.imulK=function(e){return e.imul(this.k)},i(x,_),x.prototype.split=function(e,t){for(var r=Math.min(e.length,9),n=0;n<r;n++)t.words[n]=e.words[n];if(t.length=r,e.length<=9)return e.words[0]=0,void(e.length=1);var i=e.words[9];for(t.words[t.length++]=4194303&i,n=10;n<e.length;n++){var s=0|e.words[n];e.words[n-10]=(4194303&s)<<4|i>>>22,i=s}i>>>=22,e.words[n-10]=i,0===i&&e.length>10?e.length-=10:e.length-=9},x.prototype.imulK=function(e){e.words[e.length]=0,e.words[e.length+1]=0,e.length+=2;for(var t=0,r=0;r<e.length;r++){var n=0|e.words[r];t+=977*n,e.words[r]=67108863&t,t=64*n+(t/67108864|0)}return 0===e.words[e.length-1]&&(e.length--,0===e.words[e.length-1]&&e.length--),e},i(k,_),i(S,_),i(M,_),M.prototype.imulK=function(e){for(var t=0,r=0;r<e.length;r++){var n=19*(0|e.words[r])+t,i=67108863&n;n>>>=26,e.words[r]=i,t=n}return 0!==t&&(e.words[e.length++]=t),e},s._prime=function(e){if(w[e])return w[e];var t;if(\"k256\"===e)t=new x;else if(\"p224\"===e)t=new k;else if(\"p192\"===e)t=new S;else{if(\"p25519\"!==e)throw new Error(\"Unknown prime \"+e);t=new M}return w[e]=t,t},C.prototype._verify1=function(e){n(0===e.negative,\"red works only with positives\"),n(e.red,\"red works only with red numbers\")},C.prototype._verify2=function(e,t){n(0==(e.negative|t.negative),\"red works only with positives\"),n(e.red&&e.red===t.red,\"red works only with red numbers\")},C.prototype.imod=function(e){return this.prime?this.prime.ireduce(e)._forceRed(this):(u(e,e.umod(this.m)._forceRed(this)),e)},C.prototype.neg=function(e){return e.isZero()?e.clone():this.m.sub(e)._forceRed(this)},C.prototype.add=function(e,t){this._verify2(e,t);var r=e.add(t);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},C.prototype.iadd=function(e,t){this._verify2(e,t);var r=e.iadd(t);return r.cmp(this.m)>=0&&r.isub(this.m),r},C.prototype.sub=function(e,t){this._verify2(e,t);var r=e.sub(t);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},C.prototype.isub=function(e,t){this._verify2(e,t);var r=e.isub(t);return r.cmpn(0)<0&&r.iadd(this.m),r},C.prototype.shl=function(e,t){return this._verify1(e),this.imod(e.ushln(t))},C.prototype.imul=function(e,t){return this._verify2(e,t),this.imod(e.imul(t))},C.prototype.mul=function(e,t){return this._verify2(e,t),this.imod(e.mul(t))},C.prototype.isqr=function(e){return this.imul(e,e.clone())},C.prototype.sqr=function(e){return this.mul(e,e)},C.prototype.sqrt=function(e){if(e.isZero())return e.clone();var t=this.m.andln(3);if(n(t%2==1),3===t){var r=this.m.add(new s(1)).iushrn(2);return this.pow(e,r)}for(var i=this.m.subn(1),o=0;!i.isZero()&&0===i.andln(1);)o++,i.iushrn(1);n(!i.isZero());var a=new s(1).toRed(this),l=a.redNeg(),c=this.m.subn(1).iushrn(1),u=this.m.bitLength();for(u=new s(2*u*u).toRed(this);0!==this.pow(u,c).cmp(l);)u.redIAdd(l);for(var h=this.pow(u,i),f=this.pow(e,i.addn(1).iushrn(1)),d=this.pow(e,i),p=o;0!==d.cmp(a);){for(var m=d,b=0;0!==m.cmp(a);b++)m=m.redSqr();n(b<p);var g=this.pow(h,new s(1).iushln(p-b-1));f=f.redMul(g),h=g.redSqr(),d=d.redMul(h),p=b}return f},C.prototype.invm=function(e){var t=e._invmp(this.m);return 0!==t.negative?(t.negative=0,this.imod(t).redNeg()):this.imod(t)},C.prototype.pow=function(e,t){if(t.isZero())return new s(1).toRed(this);if(0===t.cmpn(1))return e.clone();var r=new Array(16);r[0]=new s(1).toRed(this),r[1]=e;for(var n=2;n<r.length;n++)r[n]=this.mul(r[n-1],e);var i=r[0],o=0,a=0,l=t.bitLength()%26;for(0===l&&(l=26),n=t.length-1;n>=0;n--){for(var c=t.words[n],u=l-1;u>=0;u--){var h=c>>u&1;i!==r[0]&&(i=this.sqr(i)),0!==h||0!==o?(o<<=1,o|=h,(4===++a||0===n&&0===u)&&(i=this.mul(i,r[o]),a=0,o=0)):a=0}l=26}return i},C.prototype.convertTo=function(e){var t=e.umod(this.m);return t===e?t.clone():t},C.prototype.convertFrom=function(e){var t=e.clone();return t.red=null,t},s.mont=function(e){return new T(e)},i(T,C),T.prototype.convertTo=function(e){return this.imod(e.ushln(this.shift))},T.prototype.convertFrom=function(e){var t=this.imod(e.mul(this.rinv));return t.red=null,t},T.prototype.imul=function(e,t){if(e.isZero()||t.isZero())return e.words[0]=0,e.length=1,e;var r=e.imul(t),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),s=i;return i.cmp(this.m)>=0?s=i.isub(this.m):i.cmpn(0)<0&&(s=i.iadd(this.m)),s._forceRed(this)},T.prototype.mul=function(e,t){if(e.isZero()||t.isZero())return new s(0)._forceRed(this);var r=e.mul(t),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),o=i;return i.cmp(this.m)>=0?o=i.isub(this.m):i.cmpn(0)<0&&(o=i.iadd(this.m)),o._forceRed(this)},T.prototype.invm=function(e){return this.imod(e._invmp(this.m).mul(this.r2))._forceRed(this)}}(void 0===t||t)},{buffer:188}],187:[function(e,t,r){\"use strict\";var n;function i(e){this.rand=e}if(t.exports=function(e){return n||(n=new i(null)),n.generate(e)},t.exports.Rand=i,i.prototype.generate=function(e){return this._rand(e)},i.prototype._rand=function(e){if(this.rand.getBytes)return this.rand.getBytes(e);for(var t=new Uint8Array(e),r=0;r<t.length;r++)t[r]=this.rand.getByte();return t},\"object\"==typeof self)self.crypto&&self.crypto.getRandomValues?i.prototype._rand=function(e){var t=new Uint8Array(e);return self.crypto.getRandomValues(t),t}:self.msCrypto&&self.msCrypto.getRandomValues?i.prototype._rand=function(e){var t=new Uint8Array(e);return self.msCrypto.getRandomValues(t),t}:\"object\"==typeof window&&(i.prototype._rand=function(){throw new Error(\"Not implemented yet\")});else try{var s=e(\"crypto\");if(\"function\"!=typeof s.randomBytes)throw new Error(\"Not supported\");i.prototype._rand=function(e){return s.randomBytes(e)}}catch(e){}},{crypto:188}],188:[function(e,t,r){},{}],189:[function(e,t,r){\"use strict\";var n=e(\"safe-buffer\").Buffer;function i(e){n.isBuffer(e)||(e=n.from(e));for(var t=e.length/4|0,r=new Array(t),i=0;i<t;i++)r[i]=e.readUInt32BE(4*i);return r}function s(e){for(;0<e.length;e++)e[0]=0}function o(e,t,r,n,i){for(var s,o,a,l,c=r[0],u=r[1],h=r[2],f=r[3],d=e[0]^t[0],p=e[1]^t[1],m=e[2]^t[2],b=e[3]^t[3],g=4,y=1;y<i;y++)s=c[d>>>24]^u[p>>>16&255]^h[m>>>8&255]^f[255&b]^t[g++],o=c[p>>>24]^u[m>>>16&255]^h[b>>>8&255]^f[255&d]^t[g++],a=c[m>>>24]^u[b>>>16&255]^h[d>>>8&255]^f[255&p]^t[g++],l=c[b>>>24]^u[d>>>16&255]^h[p>>>8&255]^f[255&m]^t[g++],d=s,p=o,m=a,b=l;return s=(n[d>>>24]<<24|n[p>>>16&255]<<16|n[m>>>8&255]<<8|n[255&b])^t[g++],o=(n[p>>>24]<<24|n[m>>>16&255]<<16|n[b>>>8&255]<<8|n[255&d])^t[g++],a=(n[m>>>24]<<24|n[b>>>16&255]<<16|n[d>>>8&255]<<8|n[255&p])^t[g++],l=(n[b>>>24]<<24|n[d>>>16&255]<<16|n[p>>>8&255]<<8|n[255&m])^t[g++],[s>>>=0,o>>>=0,a>>>=0,l>>>=0]}var a=[0,1,2,4,8,16,32,64,128,27,54],l=function(){for(var e=new Array(256),t=0;t<256;t++)e[t]=t<128?t<<1:t<<1^283;for(var r=[],n=[],i=[[],[],[],[]],s=[[],[],[],[]],o=0,a=0,l=0;l<256;++l){var c=a^a<<1^a<<2^a<<3^a<<4;c=c>>>8^255&c^99,r[o]=c,n[c]=o;var u=e[o],h=e[u],f=e[h],d=257*e[c]^16843008*c;i[0][o]=d<<24|d>>>8,i[1][o]=d<<16|d>>>16,i[2][o]=d<<8|d>>>24,i[3][o]=d,d=16843009*f^65537*h^257*u^16843008*o,s[0][c]=d<<24|d>>>8,s[1][c]=d<<16|d>>>16,s[2][c]=d<<8|d>>>24,s[3][c]=d,0===o?o=a=1:(o=u^e[e[e[f^u]]],a^=e[e[a]])}return{SBOX:r,INV_SBOX:n,SUB_MIX:i,INV_SUB_MIX:s}}();function c(e){this._key=i(e),this._reset()}c.blockSize=16,c.keySize=32,c.prototype.blockSize=c.blockSize,c.prototype.keySize=c.keySize,c.prototype._reset=function(){for(var e=this._key,t=e.length,r=t+6,n=4*(r+1),i=[],s=0;s<t;s++)i[s]=e[s];for(s=t;s<n;s++){var o=i[s-1];s%t==0?(o=o<<8|o>>>24,o=l.SBOX[o>>>24]<<24|l.SBOX[o>>>16&255]<<16|l.SBOX[o>>>8&255]<<8|l.SBOX[255&o],o^=a[s/t|0]<<24):t>6&&s%t==4&&(o=l.SBOX[o>>>24]<<24|l.SBOX[o>>>16&255]<<16|l.SBOX[o>>>8&255]<<8|l.SBOX[255&o]),i[s]=i[s-t]^o}for(var c=[],u=0;u<n;u++){var h=n-u,f=i[h-(u%4?0:4)];c[u]=u<4||h<=4?f:l.INV_SUB_MIX[0][l.SBOX[f>>>24]]^l.INV_SUB_MIX[1][l.SBOX[f>>>16&255]]^l.INV_SUB_MIX[2][l.SBOX[f>>>8&255]]^l.INV_SUB_MIX[3][l.SBOX[255&f]]}this._nRounds=r,this._keySchedule=i,this._invKeySchedule=c},c.prototype.encryptBlockRaw=function(e){return o(e=i(e),this._keySchedule,l.SUB_MIX,l.SBOX,this._nRounds)},c.prototype.encryptBlock=function(e){var t=this.encryptBlockRaw(e),r=n.allocUnsafe(16);return r.writeUInt32BE(t[0],0),r.writeUInt32BE(t[1],4),r.writeUInt32BE(t[2],8),r.writeUInt32BE(t[3],12),r},c.prototype.decryptBlock=function(e){var t=(e=i(e))[1];e[1]=e[3],e[3]=t;var r=o(e,this._invKeySchedule,l.INV_SUB_MIX,l.INV_SBOX,this._nRounds),s=n.allocUnsafe(16);return s.writeUInt32BE(r[0],0),s.writeUInt32BE(r[3],4),s.writeUInt32BE(r[2],8),s.writeUInt32BE(r[1],12),s},c.prototype.scrub=function(){s(this._keySchedule),s(this._invKeySchedule),s(this._key)},t.exports.AES=c},{\"safe-buffer\":494}],190:[function(e,t,r){\"use strict\";var n=e(\"./aes\"),i=e(\"safe-buffer\").Buffer,s=e(\"cipher-base\"),o=e(\"inherits\"),a=e(\"./ghash\"),l=e(\"buffer-xor\"),c=e(\"./incr32\");function u(e,t,r,o){s.call(this);var l=i.alloc(4,0);this._cipher=new n.AES(t);var u=this._cipher.encryptBlock(l);this._ghash=new a(u),r=function(e,t,r){if(12===t.length)return e._finID=i.concat([t,i.from([0,0,0,1])]),i.concat([t,i.from([0,0,0,2])]);var n=new a(r),s=t.length,o=s%16;n.update(t),o&&(o=16-o,n.update(i.alloc(o,0))),n.update(i.alloc(8,0));var l=8*s,u=i.alloc(8);u.writeUIntBE(l,0,8),n.update(u),e._finID=n.state;var h=i.from(e._finID);return c(h),h}(this,r,u),this._prev=i.from(r),this._cache=i.allocUnsafe(0),this._secCache=i.allocUnsafe(0),this._decrypt=o,this._alen=0,this._len=0,this._mode=e,this._authTag=null,this._called=!1}o(u,s),u.prototype._update=function(e){if(!this._called&&this._alen){var t=16-this._alen%16;t<16&&(t=i.alloc(t,0),this._ghash.update(t))}this._called=!0;var r=this._mode.encrypt(this,e);return this._decrypt?this._ghash.update(e):this._ghash.update(r),this._len+=e.length,r},u.prototype._final=function(){if(this._decrypt&&!this._authTag)throw new Error(\"Unsupported state or unable to authenticate data\");var e=l(this._ghash.final(8*this._alen,8*this._len),this._cipher.encryptBlock(this._finID));if(this._decrypt&&function(e,t){var r=0;e.length!==t.length&&r++;for(var n=Math.min(e.length,t.length),i=0;i<n;++i)r+=e[i]^t[i];return r}(e,this._authTag))throw new Error(\"Unsupported state or unable to authenticate data\");this._authTag=e,this._cipher.scrub()},u.prototype.getAuthTag=function(){if(this._decrypt||!i.isBuffer(this._authTag))throw new Error(\"Attempting to get auth tag in unsupported state\");return this._authTag},u.prototype.setAuthTag=function(e){if(!this._decrypt)throw new Error(\"Attempting to set auth tag in unsupported state\");this._authTag=e},u.prototype.setAAD=function(e){if(this._called)throw new Error(\"Attempting to set AAD in unsupported state\");this._ghash.update(e),this._alen+=e.length},t.exports=u},{\"./aes\":189,\"./ghash\":194,\"./incr32\":195,\"buffer-xor\":219,\"cipher-base\":221,inherits:440,\"safe-buffer\":494}],191:[function(e,t,r){\"use strict\";var n=e(\"./encrypter\"),i=e(\"./decrypter\"),s=e(\"./modes/list.json\");r.createCipher=r.Cipher=n.createCipher,r.createCipheriv=r.Cipheriv=n.createCipheriv,r.createDecipher=r.Decipher=i.createDecipher,r.createDecipheriv=r.Decipheriv=i.createDecipheriv,r.listCiphers=r.getCiphers=function(){return Object.keys(s)}},{\"./decrypter\":192,\"./encrypter\":193,\"./modes/list.json\":203}],192:[function(e,t,r){\"use strict\";var n=e(\"./authCipher\"),i=e(\"safe-buffer\").Buffer,s=e(\"./modes\"),o=e(\"./streamCipher\"),a=e(\"cipher-base\"),l=e(\"./aes\"),c=e(\"evp_bytestokey\");function u(e,t,r){a.call(this),this._cache=new h,this._last=void 0,this._cipher=new l.AES(t),this._prev=i.from(r),this._mode=e,this._autopadding=!0}function h(){this.cache=i.allocUnsafe(0)}function f(e,t,r){var a=s[e.toLowerCase()];if(!a)throw new TypeError(\"invalid suite type\");if(\"string\"==typeof r&&(r=i.from(r)),\"GCM\"!==a.mode&&r.length!==a.iv)throw new TypeError(\"invalid iv length \"+r.length);if(\"string\"==typeof t&&(t=i.from(t)),t.length!==a.key/8)throw new TypeError(\"invalid key length \"+t.length);return\"stream\"===a.type?new o(a.module,t,r,!0):\"auth\"===a.type?new n(a.module,t,r,!0):new u(a.module,t,r)}e(\"inherits\")(u,a),u.prototype._update=function(e){var t,r;this._cache.add(e);for(var n=[];t=this._cache.get(this._autopadding);)r=this._mode.decrypt(this,t),n.push(r);return i.concat(n)},u.prototype._final=function(){var e=this._cache.flush();if(this._autopadding)return function(e){var t=e[15];if(t<1||t>16)throw new Error(\"unable to decrypt data\");var r=-1;for(;++r<t;)if(e[r+(16-t)]!==t)throw new Error(\"unable to decrypt data\");if(16===t)return;return e.slice(0,16-t)}(this._mode.decrypt(this,e));if(e)throw new Error(\"data not multiple of block length\")},u.prototype.setAutoPadding=function(e){return this._autopadding=!!e,this},h.prototype.add=function(e){this.cache=i.concat([this.cache,e])},h.prototype.get=function(e){var t;if(e){if(this.cache.length>16)return t=this.cache.slice(0,16),this.cache=this.cache.slice(16),t}else if(this.cache.length>=16)return t=this.cache.slice(0,16),this.cache=this.cache.slice(16),t;return null},h.prototype.flush=function(){if(this.cache.length)return this.cache},r.createDecipher=function(e,t){var r=s[e.toLowerCase()];if(!r)throw new TypeError(\"invalid suite type\");var n=c(t,!1,r.key,r.iv);return f(e,n.key,n.iv)},r.createDecipheriv=f},{\"./aes\":189,\"./authCipher\":190,\"./modes\":202,\"./streamCipher\":205,\"cipher-base\":221,evp_bytestokey:423,inherits:440,\"safe-buffer\":494}],193:[function(e,t,r){\"use strict\";var n=e(\"./modes\"),i=e(\"./authCipher\"),s=e(\"safe-buffer\").Buffer,o=e(\"./streamCipher\"),a=e(\"cipher-base\"),l=e(\"./aes\"),c=e(\"evp_bytestokey\");function u(e,t,r){a.call(this),this._cache=new f,this._cipher=new l.AES(t),this._prev=s.from(r),this._mode=e,this._autopadding=!0}e(\"inherits\")(u,a),u.prototype._update=function(e){var t,r;this._cache.add(e);for(var n=[];t=this._cache.get();)r=this._mode.encrypt(this,t),n.push(r);return s.concat(n)};var h=s.alloc(16,16);function f(){this.cache=s.allocUnsafe(0)}function d(e,t,r){var a=n[e.toLowerCase()];if(!a)throw new TypeError(\"invalid suite type\");if(\"string\"==typeof t&&(t=s.from(t)),t.length!==a.key/8)throw new TypeError(\"invalid key length \"+t.length);if(\"string\"==typeof r&&(r=s.from(r)),\"GCM\"!==a.mode&&r.length!==a.iv)throw new TypeError(\"invalid iv length \"+r.length);return\"stream\"===a.type?new o(a.module,t,r):\"auth\"===a.type?new i(a.module,t,r):new u(a.module,t,r)}u.prototype._final=function(){var e=this._cache.flush();if(this._autopadding)return e=this._mode.encrypt(this,e),this._cipher.scrub(),e;if(!e.equals(h))throw this._cipher.scrub(),new Error(\"data not multiple of block length\")},u.prototype.setAutoPadding=function(e){return this._autopadding=!!e,this},f.prototype.add=function(e){this.cache=s.concat([this.cache,e])},f.prototype.get=function(){if(this.cache.length>15){var e=this.cache.slice(0,16);return this.cache=this.cache.slice(16),e}return null},f.prototype.flush=function(){for(var e=16-this.cache.length,t=s.allocUnsafe(e),r=-1;++r<e;)t.writeUInt8(e,r);return s.concat([this.cache,t])},r.createCipheriv=d,r.createCipher=function(e,t){var r=n[e.toLowerCase()];if(!r)throw new TypeError(\"invalid suite type\");var i=c(t,!1,r.key,r.iv);return d(e,i.key,i.iv)}},{\"./aes\":189,\"./authCipher\":190,\"./modes\":202,\"./streamCipher\":205,\"cipher-base\":221,evp_bytestokey:423,inherits:440,\"safe-buffer\":494}],194:[function(e,t,r){\"use strict\";var n=e(\"safe-buffer\").Buffer,i=n.alloc(16,0);function s(e){var t=n.allocUnsafe(16);return t.writeUInt32BE(e[0]>>>0,0),t.writeUInt32BE(e[1]>>>0,4),t.writeUInt32BE(e[2]>>>0,8),t.writeUInt32BE(e[3]>>>0,12),t}function o(e){this.h=e,this.state=n.alloc(16,0),this.cache=n.allocUnsafe(0)}o.prototype.ghash=function(e){for(var t=-1;++t<e.length;)this.state[t]^=e[t];this._multiply()},o.prototype._multiply=function(){for(var e,t,r,n=[(e=this.h).readUInt32BE(0),e.readUInt32BE(4),e.readUInt32BE(8),e.readUInt32BE(12)],i=[0,0,0,0],o=-1;++o<128;){for(0!=(this.state[~~(o/8)]&1<<7-o%8)&&(i[0]^=n[0],i[1]^=n[1],i[2]^=n[2],i[3]^=n[3]),r=0!=(1&n[3]),t=3;t>0;t--)n[t]=n[t]>>>1|(1&n[t-1])<<31;n[0]=n[0]>>>1,r&&(n[0]=n[0]^225<<24)}this.state=s(i)},o.prototype.update=function(e){var t;for(this.cache=n.concat([this.cache,e]);this.cache.length>=16;)t=this.cache.slice(0,16),this.cache=this.cache.slice(16),this.ghash(t)},o.prototype.final=function(e,t){return this.cache.length&&this.ghash(n.concat([this.cache,i],16)),this.ghash(s([0,e,0,t])),this.state},t.exports=o},{\"safe-buffer\":494}],195:[function(e,t,r){\"use strict\";t.exports=function(e){for(var t,r=e.length;r--;){if(255!==(t=e.readUInt8(r))){t++,e.writeUInt8(t,r);break}e.writeUInt8(0,r)}}},{}],196:[function(e,t,r){\"use strict\";var n=e(\"buffer-xor\");r.encrypt=function(e,t){var r=n(t,e._prev);return e._prev=e._cipher.encryptBlock(r),e._prev},r.decrypt=function(e,t){var r=e._prev;e._prev=t;var i=e._cipher.decryptBlock(t);return n(i,r)}},{\"buffer-xor\":219}],197:[function(e,t,r){\"use strict\";var n=e(\"safe-buffer\").Buffer,i=e(\"buffer-xor\");function s(e,t,r){var s=t.length,o=i(t,e._cache);return e._cache=e._cache.slice(s),e._prev=n.concat([e._prev,r?t:o]),o}r.encrypt=function(e,t,r){for(var i,o=n.allocUnsafe(0);t.length;){if(0===e._cache.length&&(e._cache=e._cipher.encryptBlock(e._prev),e._prev=n.allocUnsafe(0)),!(e._cache.length<=t.length)){o=n.concat([o,s(e,t,r)]);break}i=e._cache.length,o=n.concat([o,s(e,t.slice(0,i),r)]),t=t.slice(i)}return o}},{\"buffer-xor\":219,\"safe-buffer\":494}],198:[function(e,t,r){\"use strict\";var n=e(\"safe-buffer\").Buffer;function i(e,t,r){for(var n,i,o=-1,a=0;++o<8;)n=t&1<<7-o?128:0,a+=(128&(i=e._cipher.encryptBlock(e._prev)[0]^n))>>o%8,e._prev=s(e._prev,r?n:i);return a}function s(e,t){var r=e.length,i=-1,s=n.allocUnsafe(e.length);for(e=n.concat([e,n.from([t])]);++i<r;)s[i]=e[i]<<1|e[i+1]>>7;return s}r.encrypt=function(e,t,r){for(var s=t.length,o=n.allocUnsafe(s),a=-1;++a<s;)o[a]=i(e,t[a],r);return o}},{\"safe-buffer\":494}],199:[function(e,t,r){\"use strict\";var n=e(\"safe-buffer\").Buffer;function i(e,t,r){var i=e._cipher.encryptBlock(e._prev)[0]^t;return e._prev=n.concat([e._prev.slice(1),n.from([r?t:i])]),i}r.encrypt=function(e,t,r){for(var s=t.length,o=n.allocUnsafe(s),a=-1;++a<s;)o[a]=i(e,t[a],r);return o}},{\"safe-buffer\":494}],200:[function(e,t,r){\"use strict\";var n=e(\"buffer-xor\"),i=e(\"safe-buffer\").Buffer,s=e(\"../incr32\");function o(e){var t=e._cipher.encryptBlockRaw(e._prev);return s(e._prev),t}r.encrypt=function(e,t){var r=Math.ceil(t.length/16),s=e._cache.length;e._cache=i.concat([e._cache,i.allocUnsafe(16*r)]);for(var a=0;a<r;a++){var l=o(e),c=s+16*a;e._cache.writeUInt32BE(l[0],c+0),e._cache.writeUInt32BE(l[1],c+4),e._cache.writeUInt32BE(l[2],c+8),e._cache.writeUInt32BE(l[3],c+12)}var u=e._cache.slice(0,t.length);return e._cache=e._cache.slice(t.length),n(t,u)}},{\"../incr32\":195,\"buffer-xor\":219,\"safe-buffer\":494}],201:[function(e,t,r){\"use strict\";r.encrypt=function(e,t){return e._cipher.encryptBlock(t)},r.decrypt=function(e,t){return e._cipher.decryptBlock(t)}},{}],202:[function(e,t,r){\"use strict\";var n={ECB:e(\"./ecb\"),CBC:e(\"./cbc\"),CFB:e(\"./cfb\"),CFB8:e(\"./cfb8\"),CFB1:e(\"./cfb1\"),OFB:e(\"./ofb\"),CTR:e(\"./ctr\"),GCM:e(\"./ctr\")},i=e(\"./list.json\");for(var s in i)i[s].module=n[i[s].mode];t.exports=i},{\"./cbc\":196,\"./cfb\":197,\"./cfb1\":198,\"./cfb8\":199,\"./ctr\":200,\"./ecb\":201,\"./list.json\":203,\"./ofb\":204}],203:[function(e,t,r){t.exports={\"aes-128-ecb\":{cipher:\"AES\",key:128,iv:0,mode:\"ECB\",type:\"block\"},\"aes-192-ecb\":{cipher:\"AES\",key:192,iv:0,mode:\"ECB\",type:\"block\"},\"aes-256-ecb\":{cipher:\"AES\",key:256,iv:0,mode:\"ECB\",type:\"block\"},\"aes-128-cbc\":{cipher:\"AES\",key:128,iv:16,mode:\"CBC\",type:\"block\"},\"aes-192-cbc\":{cipher:\"AES\",key:192,iv:16,mode:\"CBC\",type:\"block\"},\"aes-256-cbc\":{cipher:\"AES\",key:256,iv:16,mode:\"CBC\",type:\"block\"},aes128:{cipher:\"AES\",key:128,iv:16,mode:\"CBC\",type:\"block\"},aes192:{cipher:\"AES\",key:192,iv:16,mode:\"CBC\",type:\"block\"},aes256:{cipher:\"AES\",key:256,iv:16,mode:\"CBC\",type:\"block\"},\"aes-128-cfb\":{cipher:\"AES\",key:128,iv:16,mode:\"CFB\",type:\"stream\"},\"aes-192-cfb\":{cipher:\"AES\",key:192,iv:16,mode:\"CFB\",type:\"stream\"},\"aes-256-cfb\":{cipher:\"AES\",key:256,iv:16,mode:\"CFB\",type:\"stream\"},\"aes-128-cfb8\":{cipher:\"AES\",key:128,iv:16,mode:\"CFB8\",type:\"stream\"},\"aes-192-cfb8\":{cipher:\"AES\",key:192,iv:16,mode:\"CFB8\",type:\"stream\"},\"aes-256-cfb8\":{cipher:\"AES\",key:256,iv:16,mode:\"CFB8\",type:\"stream\"},\"aes-128-cfb1\":{cipher:\"AES\",key:128,iv:16,mode:\"CFB1\",type:\"stream\"},\"aes-192-cfb1\":{cipher:\"AES\",key:192,iv:16,mode:\"CFB1\",type:\"stream\"},\"aes-256-cfb1\":{cipher:\"AES\",key:256,iv:16,mode:\"CFB1\",type:\"stream\"},\"aes-128-ofb\":{cipher:\"AES\",key:128,iv:16,mode:\"OFB\",type:\"stream\"},\"aes-192-ofb\":{cipher:\"AES\",key:192,iv:16,mode:\"OFB\",type:\"stream\"},\"aes-256-ofb\":{cipher:\"AES\",key:256,iv:16,mode:\"OFB\",type:\"stream\"},\"aes-128-ctr\":{cipher:\"AES\",key:128,iv:16,mode:\"CTR\",type:\"stream\"},\"aes-192-ctr\":{cipher:\"AES\",key:192,iv:16,mode:\"CTR\",type:\"stream\"},\"aes-256-ctr\":{cipher:\"AES\",key:256,iv:16,mode:\"CTR\",type:\"stream\"},\"aes-128-gcm\":{cipher:\"AES\",key:128,iv:12,mode:\"GCM\",type:\"auth\"},\"aes-192-gcm\":{cipher:\"AES\",key:192,iv:12,mode:\"GCM\",type:\"auth\"},\"aes-256-gcm\":{cipher:\"AES\",key:256,iv:12,mode:\"GCM\",type:\"auth\"}}},{}],204:[function(e,t,r){(function(t){(function(){\"use strict\";var n=e(\"buffer-xor\");function i(e){return e._prev=e._cipher.encryptBlock(e._prev),e._prev}r.encrypt=function(e,r){for(;e._cache.length<r.length;)e._cache=t.concat([e._cache,i(e)]);var s=e._cache.slice(0,r.length);return e._cache=e._cache.slice(r.length),n(r,s)}}).call(this)}).call(this,e(\"buffer\").Buffer)},{buffer:220,\"buffer-xor\":219}],205:[function(e,t,r){\"use strict\";var n=e(\"./aes\"),i=e(\"safe-buffer\").Buffer,s=e(\"cipher-base\");function o(e,t,r,o){s.call(this),this._cipher=new n.AES(t),this._prev=i.from(r),this._cache=i.allocUnsafe(0),this._secCache=i.allocUnsafe(0),this._decrypt=o,this._mode=e}e(\"inherits\")(o,s),o.prototype._update=function(e){return this._mode.encrypt(this,e,this._decrypt)},o.prototype._final=function(){this._cipher.scrub()},t.exports=o},{\"./aes\":189,\"cipher-base\":221,inherits:440,\"safe-buffer\":494}],206:[function(e,t,r){\"use strict\";var n=e(\"browserify-des\"),i=e(\"browserify-aes/browser\"),s=e(\"browserify-aes/modes\"),o=e(\"browserify-des/modes\"),a=e(\"evp_bytestokey\");function l(e,t,r){if(e=e.toLowerCase(),s[e])return i.createCipheriv(e,t,r);if(o[e])return new n({key:t,iv:r,mode:e});throw new TypeError(\"invalid suite type\")}function c(e,t,r){if(e=e.toLowerCase(),s[e])return i.createDecipheriv(e,t,r);if(o[e])return new n({key:t,iv:r,mode:e,decrypt:!0});throw new TypeError(\"invalid suite type\")}r.createCipher=r.Cipher=function(e,t){var r,n;if(e=e.toLowerCase(),s[e])r=s[e].key,n=s[e].iv;else{if(!o[e])throw new TypeError(\"invalid suite type\");r=8*o[e].key,n=o[e].iv}var i=a(t,!1,r,n);return l(e,i.key,i.iv)},r.createCipheriv=r.Cipheriv=l,r.createDecipher=r.Decipher=function(e,t){var r,n;if(e=e.toLowerCase(),s[e])r=s[e].key,n=s[e].iv;else{if(!o[e])throw new TypeError(\"invalid suite type\");r=8*o[e].key,n=o[e].iv}var i=a(t,!1,r,n);return c(e,i.key,i.iv)},r.createDecipheriv=r.Decipheriv=c,r.listCiphers=r.getCiphers=function(){return Object.keys(o).concat(i.getCiphers())}},{\"browserify-aes/browser\":191,\"browserify-aes/modes\":202,\"browserify-des\":207,\"browserify-des/modes\":208,evp_bytestokey:423}],207:[function(e,t,r){\"use strict\";var n=e(\"cipher-base\"),i=e(\"des.js\"),s=e(\"inherits\"),o=e(\"safe-buffer\").Buffer,a={\"des-ede3-cbc\":i.CBC.instantiate(i.EDE),\"des-ede3\":i.EDE,\"des-ede-cbc\":i.CBC.instantiate(i.EDE),\"des-ede\":i.EDE,\"des-cbc\":i.CBC.instantiate(i.DES),\"des-ecb\":i.DES};function l(e){n.call(this);var t,r=e.mode.toLowerCase(),i=a[r];t=e.decrypt?\"decrypt\":\"encrypt\";var s=e.key;o.isBuffer(s)||(s=o.from(s)),\"des-ede\"!==r&&\"des-ede-cbc\"!==r||(s=o.concat([s,s.slice(0,8)]));var l=e.iv;o.isBuffer(l)||(l=o.from(l)),this._des=i.create({key:s,iv:l,type:t})}a.des=a[\"des-cbc\"],a.des3=a[\"des-ede3-cbc\"],t.exports=l,s(l,n),l.prototype._update=function(e){return o.from(this._des.update(e))},l.prototype._final=function(){return o.from(this._des.final())}},{\"cipher-base\":221,\"des.js\":394,inherits:440,\"safe-buffer\":494}],208:[function(e,t,r){\"use strict\";r[\"des-ecb\"]={key:8,iv:0},r[\"des-cbc\"]=r.des={key:8,iv:8},r[\"des-ede3-cbc\"]=r.des3={key:24,iv:8},r[\"des-ede3\"]={key:24,iv:0},r[\"des-ede-cbc\"]={key:16,iv:8},r[\"des-ede\"]={key:16,iv:0}},{}],209:[function(e,t,r){(function(r){(function(){\"use strict\";var n=e(\"bn.js\"),i=e(\"randombytes\");function s(e){var t,r=e.modulus.byteLength();do{t=new n(i(r))}while(t.cmp(e.modulus)>=0||!t.umod(e.prime1)||!t.umod(e.prime2));return t}function o(e,t){var i=function(e){var t=s(e);return{blinder:t.toRed(n.mont(e.modulus)).redPow(new n(e.publicExponent)).fromRed(),unblinder:t.invm(e.modulus)}}(t),o=t.modulus.byteLength(),a=new n(e).mul(i.blinder).umod(t.modulus),l=a.toRed(n.mont(t.prime1)),c=a.toRed(n.mont(t.prime2)),u=t.coefficient,h=t.prime1,f=t.prime2,d=l.redPow(t.exponent1).fromRed(),p=c.redPow(t.exponent2).fromRed(),m=d.isub(p).imul(u).umod(h).imul(f);return p.iadd(m).imul(i.unblinder).umod(t.modulus).toArrayLike(r,\"be\",o)}o.getr=s,t.exports=o}).call(this)}).call(this,e(\"buffer\").Buffer)},{\"bn.js\":186,buffer:220,randombytes:475}],210:[function(e,t,r){\"use strict\";t.exports=e(\"./browser/algorithms.json\")},{\"./browser/algorithms.json\":211}],211:[function(e,t,r){t.exports={sha224WithRSAEncryption:{sign:\"rsa\",hash:\"sha224\",id:\"302d300d06096086480165030402040500041c\"},\"RSA-SHA224\":{sign:\"ecdsa/rsa\",hash:\"sha224\",id:\"302d300d06096086480165030402040500041c\"},sha256WithRSAEncryption:{sign:\"rsa\",hash:\"sha256\",id:\"3031300d060960864801650304020105000420\"},\"RSA-SHA256\":{sign:\"ecdsa/rsa\",hash:\"sha256\",id:\"3031300d060960864801650304020105000420\"},sha384WithRSAEncryption:{sign:\"rsa\",hash:\"sha384\",id:\"3041300d060960864801650304020205000430\"},\"RSA-SHA384\":{sign:\"ecdsa/rsa\",hash:\"sha384\",id:\"3041300d060960864801650304020205000430\"},sha512WithRSAEncryption:{sign:\"rsa\",hash:\"sha512\",id:\"3051300d060960864801650304020305000440\"},\"RSA-SHA512\":{sign:\"ecdsa/rsa\",hash:\"sha512\",id:\"3051300d060960864801650304020305000440\"},\"RSA-SHA1\":{sign:\"rsa\",hash:\"sha1\",id:\"3021300906052b0e03021a05000414\"},\"ecdsa-with-SHA1\":{sign:\"ecdsa\",hash:\"sha1\",id:\"\"},sha256:{sign:\"ecdsa\",hash:\"sha256\",id:\"\"},sha224:{sign:\"ecdsa\",hash:\"sha224\",id:\"\"},sha384:{sign:\"ecdsa\",hash:\"sha384\",id:\"\"},sha512:{sign:\"ecdsa\",hash:\"sha512\",id:\"\"},\"DSA-SHA\":{sign:\"dsa\",hash:\"sha1\",id:\"\"},\"DSA-SHA1\":{sign:\"dsa\",hash:\"sha1\",id:\"\"},DSA:{sign:\"dsa\",hash:\"sha1\",id:\"\"},\"DSA-WITH-SHA224\":{sign:\"dsa\",hash:\"sha224\",id:\"\"},\"DSA-SHA224\":{sign:\"dsa\",hash:\"sha224\",id:\"\"},\"DSA-WITH-SHA256\":{sign:\"dsa\",hash:\"sha256\",id:\"\"},\"DSA-SHA256\":{sign:\"dsa\",hash:\"sha256\",id:\"\"},\"DSA-WITH-SHA384\":{sign:\"dsa\",hash:\"sha384\",id:\"\"},\"DSA-SHA384\":{sign:\"dsa\",hash:\"sha384\",id:\"\"},\"DSA-WITH-SHA512\":{sign:\"dsa\",hash:\"sha512\",id:\"\"},\"DSA-SHA512\":{sign:\"dsa\",hash:\"sha512\",id:\"\"},\"DSA-RIPEMD160\":{sign:\"dsa\",hash:\"rmd160\",id:\"\"},ripemd160WithRSA:{sign:\"rsa\",hash:\"rmd160\",id:\"3021300906052b2403020105000414\"},\"RSA-RIPEMD160\":{sign:\"rsa\",hash:\"rmd160\",id:\"3021300906052b2403020105000414\"},md5WithRSAEncryption:{sign:\"rsa\",hash:\"md5\",id:\"3020300c06082a864886f70d020505000410\"},\"RSA-MD5\":{sign:\"rsa\",hash:\"md5\",id:\"3020300c06082a864886f70d020505000410\"}}},{}],212:[function(e,t,r){t.exports={\"1.3.132.0.10\":\"secp256k1\",\"1.3.132.0.33\":\"p224\",\"1.2.840.10045.3.1.1\":\"p192\",\"1.2.840.10045.3.1.7\":\"p256\",\"1.3.132.0.34\":\"p384\",\"1.3.132.0.35\":\"p521\"}},{}],213:[function(e,t,r){\"use strict\";var n=e(\"safe-buffer\").Buffer,i=e(\"create-hash\"),s=e(\"readable-stream\"),o=e(\"inherits\"),a=e(\"./sign\"),l=e(\"./verify\"),c=e(\"./algorithms.json\");function u(e){s.Writable.call(this);var t=c[e];if(!t)throw new Error(\"Unknown message digest\");this._hashType=t.hash,this._hash=i(t.hash),this._tag=t.id,this._signType=t.sign}function h(e){s.Writable.call(this);var t=c[e];if(!t)throw new Error(\"Unknown message digest\");this._hash=i(t.hash),this._tag=t.id,this._signType=t.sign}function f(e){return new u(e)}function d(e){return new h(e)}Object.keys(c).forEach((function(e){c[e].id=n.from(c[e].id,\"hex\"),c[e.toLowerCase()]=c[e]})),o(u,s.Writable),u.prototype._write=function(e,t,r){this._hash.update(e),r()},u.prototype.update=function(e,t){return\"string\"==typeof e&&(e=n.from(e,t)),this._hash.update(e),this},u.prototype.sign=function(e,t){this.end();var r=this._hash.digest(),n=a(r,e,this._hashType,this._signType,this._tag);return t?n.toString(t):n},o(h,s.Writable),h.prototype._write=function(e,t,r){this._hash.update(e),r()},h.prototype.update=function(e,t){return\"string\"==typeof e&&(e=n.from(e,t)),this._hash.update(e),this},h.prototype.verify=function(e,t,r){\"string\"==typeof t&&(t=n.from(t,r)),this.end();var i=this._hash.digest();return l(t,i,e,this._signType,this._tag)},t.exports={Sign:f,Verify:d,createSign:f,createVerify:d}},{\"./algorithms.json\":211,\"./sign\":214,\"./verify\":215,\"create-hash\":386,inherits:440,\"readable-stream\":491,\"safe-buffer\":494}],214:[function(e,t,r){\"use strict\";var n=e(\"safe-buffer\").Buffer,i=e(\"create-hmac\"),s=e(\"browserify-rsa\"),o=e(\"elliptic\").ec,a=e(\"bn.js\"),l=e(\"parse-asn1\"),c=e(\"./curves.json\");function u(e,t,r,s){if((e=n.from(e.toArray())).length<t.byteLength()){var o=n.alloc(t.byteLength()-e.length);e=n.concat([o,e])}var a=r.length,l=function(e,t){e=(e=h(e,t)).mod(t);var r=n.from(e.toArray());if(r.length<t.byteLength()){var i=n.alloc(t.byteLength()-r.length);r=n.concat([i,r])}return r}(r,t),c=n.alloc(a);c.fill(1);var u=n.alloc(a);return u=i(s,u).update(c).update(n.from([0])).update(e).update(l).digest(),c=i(s,u).update(c).digest(),{k:u=i(s,u).update(c).update(n.from([1])).update(e).update(l).digest(),v:c=i(s,u).update(c).digest()}}function h(e,t){var r=new a(e),n=(e.length<<3)-t.bitLength();return n>0&&r.ishrn(n),r}function f(e,t,r){var s,o;do{for(s=n.alloc(0);8*s.length<e.bitLength();)t.v=i(r,t.k).update(t.v).digest(),s=n.concat([s,t.v]);o=h(s,e),t.k=i(r,t.k).update(t.v).update(n.from([0])).digest(),t.v=i(r,t.k).update(t.v).digest()}while(-1!==o.cmp(e));return o}function d(e,t,r,n){return e.toRed(a.mont(r)).redPow(t).fromRed().mod(n)}t.exports=function(e,t,r,i,p){var m=l(t);if(m.curve){if(\"ecdsa\"!==i&&\"ecdsa/rsa\"!==i)throw new Error(\"wrong private key type\");return function(e,t){var r=c[t.curve.join(\".\")];if(!r)throw new Error(\"unknown curve \"+t.curve.join(\".\"));var i=new o(r).keyFromPrivate(t.privateKey).sign(e);return n.from(i.toDER())}(e,m)}if(\"dsa\"===m.type){if(\"dsa\"!==i)throw new Error(\"wrong private key type\");return function(e,t,r){var i,s=t.params.priv_key,o=t.params.p,l=t.params.q,c=t.params.g,p=new a(0),m=h(e,l).mod(l),b=!1,g=u(s,l,e,r);for(;!1===b;)i=f(l,g,r),p=d(c,i,o,l),0===(b=i.invm(l).imul(m.add(s.mul(p))).mod(l)).cmpn(0)&&(b=!1,p=new a(0));return function(e,t){e=e.toArray(),t=t.toArray(),128&e[0]&&(e=[0].concat(e));128&t[0]&&(t=[0].concat(t));var r=[48,e.length+t.length+4,2,e.length];return r=r.concat(e,[2,t.length],t),n.from(r)}(p,b)}(e,m,r)}if(\"rsa\"!==i&&\"ecdsa/rsa\"!==i)throw new Error(\"wrong private key type\");e=n.concat([p,e]);for(var b=m.modulus.byteLength(),g=[0,1];e.length+g.length+1<b;)g.push(255);g.push(0);for(var y=-1;++y<e.length;)g.push(e[y]);return s(g,m)},t.exports.getKey=u,t.exports.makeKey=f},{\"./curves.json\":212,\"bn.js\":186,\"browserify-rsa\":209,\"create-hmac\":388,elliptic:405,\"parse-asn1\":459,\"safe-buffer\":494}],215:[function(e,t,r){\"use strict\";var n=e(\"safe-buffer\").Buffer,i=e(\"bn.js\"),s=e(\"elliptic\").ec,o=e(\"parse-asn1\"),a=e(\"./curves.json\");function l(e,t){if(e.cmpn(0)<=0)throw new Error(\"invalid sig\");if(e.cmp(t)>=t)throw new Error(\"invalid sig\")}t.exports=function(e,t,r,c,u){var h=o(r);if(\"ec\"===h.type){if(\"ecdsa\"!==c&&\"ecdsa/rsa\"!==c)throw new Error(\"wrong public key type\");return function(e,t,r){var n=a[r.data.algorithm.curve.join(\".\")];if(!n)throw new Error(\"unknown curve \"+r.data.algorithm.curve.join(\".\"));var i=new s(n),o=r.data.subjectPrivateKey.data;return i.verify(t,e,o)}(e,t,h)}if(\"dsa\"===h.type){if(\"dsa\"!==c)throw new Error(\"wrong public key type\");return function(e,t,r){var n=r.data.p,s=r.data.q,a=r.data.g,c=r.data.pub_key,u=o.signature.decode(e,\"der\"),h=u.s,f=u.r;l(h,s),l(f,s);var d=i.mont(n),p=h.invm(s);return 0===a.toRed(d).redPow(new i(t).mul(p).mod(s)).fromRed().mul(c.toRed(d).redPow(f.mul(p).mod(s)).fromRed()).mod(n).mod(s).cmp(f)}(e,t,h)}if(\"rsa\"!==c&&\"ecdsa/rsa\"!==c)throw new Error(\"wrong public key type\");t=n.concat([u,t]);for(var f=h.modulus.byteLength(),d=[1],p=0;t.length+d.length+2<f;)d.push(255),p++;d.push(0);for(var m=-1;++m<t.length;)d.push(t[m]);d=n.from(d);var b=i.mont(h.modulus);e=(e=new i(e).toRed(b)).redPow(new i(h.publicExponent)),e=n.from(e.fromRed().toArray());var g=p<8?1:0;for(f=Math.min(e.length,d.length),e.length!==d.length&&(g=1),m=-1;++m<f;)g|=e[m]^d[m];return 0===g}},{\"./curves.json\":212,\"bn.js\":186,elliptic:405,\"parse-asn1\":459,\"safe-buffer\":494}],216:[function(e,t,r){},{}],217:[function(e,t,r){\"use strict\";var n=e(\"buffer\"),i=n.Buffer;function s(e,t){for(var r in e)t[r]=e[r]}function o(e,t,r){return i(e,t,r)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?t.exports=n:(s(n,r),r.Buffer=o),s(i,o),o.from=function(e,t,r){if(\"number\"==typeof e)throw new TypeError(\"Argument must not be a number\");return i(e,t,r)},o.alloc=function(e,t,r){if(\"number\"!=typeof e)throw new TypeError(\"Argument must be a number\");var n=i(e);return void 0!==t?\"string\"==typeof r?n.fill(t,r):n.fill(t):n.fill(0),n},o.allocUnsafe=function(e){if(\"number\"!=typeof e)throw new TypeError(\"Argument must be a number\");return i(e)},o.allocUnsafeSlow=function(e){if(\"number\"!=typeof e)throw new TypeError(\"Argument must be a number\");return n.SlowBuffer(e)}},{buffer:220}],218:[function(e,t,r){\"use strict\";var n=e(\"safe-buffer\").Buffer,i=n.isEncoding||function(e){switch((e=\"\"+e)&&e.toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":case\"raw\":return!0;default:return!1}};function s(e){var t;switch(this.encoding=function(e){var t=function(e){if(!e)return\"utf8\";for(var t;;)switch(e){case\"utf8\":case\"utf-8\":return\"utf8\";case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return\"utf16le\";case\"latin1\":case\"binary\":return\"latin1\";case\"base64\":case\"ascii\":case\"hex\":return e;default:if(t)return;e=(\"\"+e).toLowerCase(),t=!0}}(e);if(\"string\"!=typeof t&&(n.isEncoding===i||!i(e)))throw new Error(\"Unknown encoding: \"+e);return t||e}(e),this.encoding){case\"utf16le\":this.text=l,this.end=c,t=4;break;case\"utf8\":this.fillLast=a,t=4;break;case\"base64\":this.text=u,this.end=h,t=3;break;default:return this.write=f,void(this.end=d)}this.lastNeed=0,this.lastTotal=0,this.lastChar=n.allocUnsafe(t)}function o(e){return e<=127?0:e>>5==6?2:e>>4==14?3:e>>3==30?4:e>>6==2?-1:-2}function a(e){var t=this.lastTotal-this.lastNeed,r=function(e,t,r){if(128!=(192&t[0]))return e.lastNeed=0,\"\\ufffd\";if(e.lastNeed>1&&t.length>1){if(128!=(192&t[1]))return e.lastNeed=1,\"\\ufffd\";if(e.lastNeed>2&&t.length>2&&128!=(192&t[2]))return e.lastNeed=2,\"\\ufffd\"}}(this,e);return void 0!==r?r:this.lastNeed<=e.length?(e.copy(this.lastChar,t,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(e.copy(this.lastChar,t,0,e.length),void(this.lastNeed-=e.length))}function l(e,t){if((e.length-t)%2==0){var r=e.toString(\"utf16le\",t);if(r){var n=r.charCodeAt(r.length-1);if(n>=55296&&n<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=e[e.length-1],e.toString(\"utf16le\",t,e.length-1)}function c(e){var t=e&&e.length?this.write(e):\"\";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return t+this.lastChar.toString(\"utf16le\",0,r)}return t}function u(e,t){var r=(e.length-t)%3;return 0===r?e.toString(\"base64\",t):(this.lastNeed=3-r,this.lastTotal=3,1===r?this.lastChar[0]=e[e.length-1]:(this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1]),e.toString(\"base64\",t,e.length-r))}function h(e){var t=e&&e.length?this.write(e):\"\";return this.lastNeed?t+this.lastChar.toString(\"base64\",0,3-this.lastNeed):t}function f(e){return e.toString(this.encoding)}function d(e){return e&&e.length?this.write(e):\"\"}r.StringDecoder=s,s.prototype.write=function(e){if(0===e.length)return\"\";var t,r;if(this.lastNeed){if(void 0===(t=this.fillLast(e)))return\"\";r=this.lastNeed,this.lastNeed=0}else r=0;return r<e.length?t?t+this.text(e,r):this.text(e,r):t||\"\"},s.prototype.end=function(e){var t=e&&e.length?this.write(e):\"\";return this.lastNeed?t+\"\\ufffd\":t},s.prototype.text=function(e,t){var r=function(e,t,r){var n=t.length-1;if(n<r)return 0;var i=o(t[n]);if(i>=0)return i>0&&(e.lastNeed=i-1),i;if(--n<r||-2===i)return 0;if((i=o(t[n]))>=0)return i>0&&(e.lastNeed=i-2),i;if(--n<r||-2===i)return 0;if((i=o(t[n]))>=0)return i>0&&(2===i?i=0:e.lastNeed=i-3),i;return 0}(this,e,t);if(!this.lastNeed)return e.toString(\"utf8\",t);this.lastTotal=r;var n=e.length-(r-this.lastNeed);return e.copy(this.lastChar,0,n),e.toString(\"utf8\",t,n)},s.prototype.fillLast=function(e){if(this.lastNeed<=e.length)return e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,e.length),this.lastNeed-=e.length}},{\"safe-buffer\":217}],219:[function(e,t,r){(function(e){(function(){\"use strict\";t.exports=function(t,r){for(var n=Math.min(t.length,r.length),i=new e(n),s=0;s<n;++s)i[s]=t[s]^r[s];return i}}).call(this)}).call(this,e(\"buffer\").Buffer)},{buffer:220}],220:[function(e,t,r){(function(t){(function(){\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <https://feross.org>\n * @license  MIT\n */\n\"use strict\";var t=e(\"base64-js\"),n=e(\"ieee754\");r.Buffer=s,r.SlowBuffer=function(e){+e!=e&&(e=0);return s.alloc(+e)},r.INSPECT_MAX_BYTES=50;function i(e){if(e>2147483647)throw new RangeError('The value \"'+e+'\" is invalid for option \"size\"');var t=new Uint8Array(e);return t.__proto__=s.prototype,t}function s(e,t,r){if(\"number\"==typeof e){if(\"string\"==typeof t)throw new TypeError('The \"string\" argument must be of type string. Received type number');return l(e)}return o(e,t,r)}function o(e,t,r){if(\"string\"==typeof e)return function(e,t){\"string\"==typeof t&&\"\"!==t||(t=\"utf8\");if(!s.isEncoding(t))throw new TypeError(\"Unknown encoding: \"+t);var r=0|h(e,t),n=i(r),o=n.write(e,t);o!==r&&(n=n.slice(0,o));return n}(e,t);if(ArrayBuffer.isView(e))return c(e);if(null==e)throw TypeError(\"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \"+typeof e);if(F(e,ArrayBuffer)||e&&F(e.buffer,ArrayBuffer))return function(e,t,r){if(t<0||e.byteLength<t)throw new RangeError('\"offset\" is outside of buffer bounds');if(e.byteLength<t+(r||0))throw new RangeError('\"length\" is outside of buffer bounds');var n;n=void 0===t&&void 0===r?new Uint8Array(e):void 0===r?new Uint8Array(e,t):new Uint8Array(e,t,r);return n.__proto__=s.prototype,n}(e,t,r);if(\"number\"==typeof e)throw new TypeError('The \"value\" argument must not be of type number. Received type number');var n=e.valueOf&&e.valueOf();if(null!=n&&n!==e)return s.from(n,t,r);var o=function(e){if(s.isBuffer(e)){var t=0|u(e.length),r=i(t);return 0===r.length||e.copy(r,0,0,t),r}if(void 0!==e.length)return\"number\"!=typeof e.length||L(e.length)?i(0):c(e);if(\"Buffer\"===e.type&&Array.isArray(e.data))return c(e.data)}(e);if(o)return o;if(\"undefined\"!=typeof Symbol&&null!=Symbol.toPrimitive&&\"function\"==typeof e[Symbol.toPrimitive])return s.from(e[Symbol.toPrimitive](\"string\"),t,r);throw new TypeError(\"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \"+typeof e)}function a(e){if(\"number\"!=typeof e)throw new TypeError('\"size\" argument must be of type number');if(e<0)throw new RangeError('The value \"'+e+'\" is invalid for option \"size\"')}function l(e){return a(e),i(e<0?0:0|u(e))}function c(e){for(var t=e.length<0?0:0|u(e.length),r=i(t),n=0;n<t;n+=1)r[n]=255&e[n];return r}function u(e){if(e>=2147483647)throw new RangeError(\"Attempt to allocate Buffer larger than maximum size: 0x\"+2147483647..toString(16)+\" bytes\");return 0|e}function h(e,t){if(s.isBuffer(e))return e.length;if(ArrayBuffer.isView(e)||F(e,ArrayBuffer))return e.byteLength;if(\"string\"!=typeof e)throw new TypeError('The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof e);var r=e.length,n=arguments.length>2&&!0===arguments[2];if(!n&&0===r)return 0;for(var i=!1;;)switch(t){case\"ascii\":case\"latin1\":case\"binary\":return r;case\"utf8\":case\"utf-8\":return P(e).length;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return 2*r;case\"hex\":return r>>>1;case\"base64\":return B(e).length;default:if(i)return n?-1:P(e).length;t=(\"\"+t).toLowerCase(),i=!0}}function f(e,t,r){var n=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return\"\";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return\"\";if((r>>>=0)<=(t>>>=0))return\"\";for(e||(e=\"utf8\");;)switch(e){case\"hex\":return C(this,t,r);case\"utf8\":case\"utf-8\":return k(this,t,r);case\"ascii\":return S(this,t,r);case\"latin1\":case\"binary\":return M(this,t,r);case\"base64\":return x(this,t,r);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return T(this,t,r);default:if(n)throw new TypeError(\"Unknown encoding: \"+e);e=(e+\"\").toLowerCase(),n=!0}}function d(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}function p(e,t,r,n,i){if(0===e.length)return-1;if(\"string\"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),L(r=+r)&&(r=i?0:e.length-1),r<0&&(r=e.length+r),r>=e.length){if(i)return-1;r=e.length-1}else if(r<0){if(!i)return-1;r=0}if(\"string\"==typeof t&&(t=s.from(t,n)),s.isBuffer(t))return 0===t.length?-1:m(e,t,r,n,i);if(\"number\"==typeof t)return t&=255,\"function\"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):m(e,[t],r,n,i);throw new TypeError(\"val must be string, number or Buffer\")}function m(e,t,r,n,i){var s,o=1,a=e.length,l=t.length;if(void 0!==n&&(\"ucs2\"===(n=String(n).toLowerCase())||\"ucs-2\"===n||\"utf16le\"===n||\"utf-16le\"===n)){if(e.length<2||t.length<2)return-1;o=2,a/=2,l/=2,r/=2}function c(e,t){return 1===o?e[t]:e.readUInt16BE(t*o)}if(i){var u=-1;for(s=r;s<a;s++)if(c(e,s)===c(t,-1===u?0:s-u)){if(-1===u&&(u=s),s-u+1===l)return u*o}else-1!==u&&(s-=s-u),u=-1}else for(r+l>a&&(r=a-l),s=r;s>=0;s--){for(var h=!0,f=0;f<l;f++)if(c(e,s+f)!==c(t,f)){h=!1;break}if(h)return s}return-1}function b(e,t,r,n){r=Number(r)||0;var i=e.length-r;n?(n=Number(n))>i&&(n=i):n=i;var s=t.length;n>s/2&&(n=s/2);for(var o=0;o<n;++o){var a=parseInt(t.substr(2*o,2),16);if(L(a))return o;e[r+o]=a}return o}function g(e,t,r,n){return D(P(t,e.length-r),e,r,n)}function y(e,t,r,n){return D(function(e){for(var t=[],r=0;r<e.length;++r)t.push(255&e.charCodeAt(r));return t}(t),e,r,n)}function v(e,t,r,n){return y(e,t,r,n)}function w(e,t,r,n){return D(B(t),e,r,n)}function _(e,t,r,n){return D(function(e,t){for(var r,n,i,s=[],o=0;o<e.length&&!((t-=2)<0);++o)r=e.charCodeAt(o),n=r>>8,i=r%256,s.push(i),s.push(n);return s}(t,e.length-r),e,r,n)}function x(e,r,n){return 0===r&&n===e.length?t.fromByteArray(e):t.fromByteArray(e.slice(r,n))}function k(e,t,r){r=Math.min(e.length,r);for(var n=[],i=t;i<r;){var s,o,a,l,c=e[i],u=null,h=c>239?4:c>223?3:c>191?2:1;if(i+h<=r)switch(h){case 1:c<128&&(u=c);break;case 2:128==(192&(s=e[i+1]))&&(l=(31&c)<<6|63&s)>127&&(u=l);break;case 3:s=e[i+1],o=e[i+2],128==(192&s)&&128==(192&o)&&(l=(15&c)<<12|(63&s)<<6|63&o)>2047&&(l<55296||l>57343)&&(u=l);break;case 4:s=e[i+1],o=e[i+2],a=e[i+3],128==(192&s)&&128==(192&o)&&128==(192&a)&&(l=(15&c)<<18|(63&s)<<12|(63&o)<<6|63&a)>65535&&l<1114112&&(u=l)}null===u?(u=65533,h=1):u>65535&&(u-=65536,n.push(u>>>10&1023|55296),u=56320|1023&u),n.push(u),i+=h}return function(e){var t=e.length;if(t<=4096)return String.fromCharCode.apply(String,e);var r=\"\",n=0;for(;n<t;)r+=String.fromCharCode.apply(String,e.slice(n,n+=4096));return r}(n)}r.kMaxLength=2147483647,s.TYPED_ARRAY_SUPPORT=function(){try{var e=new Uint8Array(1);return e.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===e.foo()}catch(e){return!1}}(),s.TYPED_ARRAY_SUPPORT||\"undefined\"==typeof console||\"function\"!=typeof console.error||console.error(\"This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support.\"),Object.defineProperty(s.prototype,\"parent\",{enumerable:!0,get:function(){if(s.isBuffer(this))return this.buffer}}),Object.defineProperty(s.prototype,\"offset\",{enumerable:!0,get:function(){if(s.isBuffer(this))return this.byteOffset}}),\"undefined\"!=typeof Symbol&&null!=Symbol.species&&s[Symbol.species]===s&&Object.defineProperty(s,Symbol.species,{value:null,configurable:!0,enumerable:!1,writable:!1}),s.poolSize=8192,s.from=function(e,t,r){return o(e,t,r)},s.prototype.__proto__=Uint8Array.prototype,s.__proto__=Uint8Array,s.alloc=function(e,t,r){return function(e,t,r){return a(e),e<=0?i(e):void 0!==t?\"string\"==typeof r?i(e).fill(t,r):i(e).fill(t):i(e)}(e,t,r)},s.allocUnsafe=function(e){return l(e)},s.allocUnsafeSlow=function(e){return l(e)},s.isBuffer=function(e){return null!=e&&!0===e._isBuffer&&e!==s.prototype},s.compare=function(e,t){if(F(e,Uint8Array)&&(e=s.from(e,e.offset,e.byteLength)),F(t,Uint8Array)&&(t=s.from(t,t.offset,t.byteLength)),!s.isBuffer(e)||!s.isBuffer(t))throw new TypeError('The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array');if(e===t)return 0;for(var r=e.length,n=t.length,i=0,o=Math.min(r,n);i<o;++i)if(e[i]!==t[i]){r=e[i],n=t[i];break}return r<n?-1:n<r?1:0},s.isEncoding=function(e){switch(String(e).toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"latin1\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return!0;default:return!1}},s.concat=function(e,t){if(!Array.isArray(e))throw new TypeError('\"list\" argument must be an Array of Buffers');if(0===e.length)return s.alloc(0);var r;if(void 0===t)for(t=0,r=0;r<e.length;++r)t+=e[r].length;var n=s.allocUnsafe(t),i=0;for(r=0;r<e.length;++r){var o=e[r];if(F(o,Uint8Array)&&(o=s.from(o)),!s.isBuffer(o))throw new TypeError('\"list\" argument must be an Array of Buffers');o.copy(n,i),i+=o.length}return n},s.byteLength=h,s.prototype._isBuffer=!0,s.prototype.swap16=function(){var e=this.length;if(e%2!=0)throw new RangeError(\"Buffer size must be a multiple of 16-bits\");for(var t=0;t<e;t+=2)d(this,t,t+1);return this},s.prototype.swap32=function(){var e=this.length;if(e%4!=0)throw new RangeError(\"Buffer size must be a multiple of 32-bits\");for(var t=0;t<e;t+=4)d(this,t,t+3),d(this,t+1,t+2);return this},s.prototype.swap64=function(){var e=this.length;if(e%8!=0)throw new RangeError(\"Buffer size must be a multiple of 64-bits\");for(var t=0;t<e;t+=8)d(this,t,t+7),d(this,t+1,t+6),d(this,t+2,t+5),d(this,t+3,t+4);return this},s.prototype.toString=function(){var e=this.length;return 0===e?\"\":0===arguments.length?k(this,0,e):f.apply(this,arguments)},s.prototype.toLocaleString=s.prototype.toString,s.prototype.equals=function(e){if(!s.isBuffer(e))throw new TypeError(\"Argument must be a Buffer\");return this===e||0===s.compare(this,e)},s.prototype.inspect=function(){var e=\"\",t=r.INSPECT_MAX_BYTES;return e=this.toString(\"hex\",0,t).replace(/(.{2})/g,\"$1 \").trim(),this.length>t&&(e+=\" ... \"),\"<Buffer \"+e+\">\"},s.prototype.compare=function(e,t,r,n,i){if(F(e,Uint8Array)&&(e=s.from(e,e.offset,e.byteLength)),!s.isBuffer(e))throw new TypeError('The \"target\" argument must be one of type Buffer or Uint8Array. Received type '+typeof e);if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),t<0||r>e.length||n<0||i>this.length)throw new RangeError(\"out of range index\");if(n>=i&&t>=r)return 0;if(n>=i)return-1;if(t>=r)return 1;if(this===e)return 0;for(var o=(i>>>=0)-(n>>>=0),a=(r>>>=0)-(t>>>=0),l=Math.min(o,a),c=this.slice(n,i),u=e.slice(t,r),h=0;h<l;++h)if(c[h]!==u[h]){o=c[h],a=u[h];break}return o<a?-1:a<o?1:0},s.prototype.includes=function(e,t,r){return-1!==this.indexOf(e,t,r)},s.prototype.indexOf=function(e,t,r){return p(this,e,t,r,!0)},s.prototype.lastIndexOf=function(e,t,r){return p(this,e,t,r,!1)},s.prototype.write=function(e,t,r,n){if(void 0===t)n=\"utf8\",r=this.length,t=0;else if(void 0===r&&\"string\"==typeof t)n=t,r=this.length,t=0;else{if(!isFinite(t))throw new Error(\"Buffer.write(string, encoding, offset[, length]) is no longer supported\");t>>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n=\"utf8\")):(n=r,r=void 0)}var i=this.length-t;if((void 0===r||r>i)&&(r=i),e.length>0&&(r<0||t<0)||t>this.length)throw new RangeError(\"Attempt to write outside buffer bounds\");n||(n=\"utf8\");for(var s=!1;;)switch(n){case\"hex\":return b(this,e,t,r);case\"utf8\":case\"utf-8\":return g(this,e,t,r);case\"ascii\":return y(this,e,t,r);case\"latin1\":case\"binary\":return v(this,e,t,r);case\"base64\":return w(this,e,t,r);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return _(this,e,t,r);default:if(s)throw new TypeError(\"Unknown encoding: \"+n);n=(\"\"+n).toLowerCase(),s=!0}},s.prototype.toJSON=function(){return{type:\"Buffer\",data:Array.prototype.slice.call(this._arr||this,0)}};function S(e,t,r){var n=\"\";r=Math.min(e.length,r);for(var i=t;i<r;++i)n+=String.fromCharCode(127&e[i]);return n}function M(e,t,r){var n=\"\";r=Math.min(e.length,r);for(var i=t;i<r;++i)n+=String.fromCharCode(e[i]);return n}function C(e,t,r){var n=e.length;(!t||t<0)&&(t=0),(!r||r<0||r>n)&&(r=n);for(var i=\"\",s=t;s<r;++s)i+=N(e[s]);return i}function T(e,t,r){for(var n=e.slice(t,r),i=\"\",s=0;s<n.length;s+=2)i+=String.fromCharCode(n[s]+256*n[s+1]);return i}function E(e,t,r){if(e%1!=0||e<0)throw new RangeError(\"offset is not uint\");if(e+t>r)throw new RangeError(\"Trying to access beyond buffer length\")}function A(e,t,r,n,i,o){if(!s.isBuffer(e))throw new TypeError('\"buffer\" argument must be a Buffer instance');if(t>i||t<o)throw new RangeError('\"value\" argument is out of bounds');if(r+n>e.length)throw new RangeError(\"Index out of range\")}function R(e,t,r,n,i,s){if(r+n>e.length)throw new RangeError(\"Index out of range\");if(r<0)throw new RangeError(\"Index out of range\")}function O(e,t,r,i,s){return t=+t,r>>>=0,s||R(e,0,r,4),n.write(e,t,r,i,23,4),r+4}function j(e,t,r,i,s){return t=+t,r>>>=0,s||R(e,0,r,8),n.write(e,t,r,i,52,8),r+8}s.prototype.slice=function(e,t){var r=this.length;(e=~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),(t=void 0===t?r:~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),t<e&&(t=e);var n=this.subarray(e,t);return n.__proto__=s.prototype,n},s.prototype.readUIntLE=function(e,t,r){e>>>=0,t>>>=0,r||E(e,t,this.length);for(var n=this[e],i=1,s=0;++s<t&&(i*=256);)n+=this[e+s]*i;return n},s.prototype.readUIntBE=function(e,t,r){e>>>=0,t>>>=0,r||E(e,t,this.length);for(var n=this[e+--t],i=1;t>0&&(i*=256);)n+=this[e+--t]*i;return n},s.prototype.readUInt8=function(e,t){return e>>>=0,t||E(e,1,this.length),this[e]},s.prototype.readUInt16LE=function(e,t){return e>>>=0,t||E(e,2,this.length),this[e]|this[e+1]<<8},s.prototype.readUInt16BE=function(e,t){return e>>>=0,t||E(e,2,this.length),this[e]<<8|this[e+1]},s.prototype.readUInt32LE=function(e,t){return e>>>=0,t||E(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},s.prototype.readUInt32BE=function(e,t){return e>>>=0,t||E(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},s.prototype.readIntLE=function(e,t,r){e>>>=0,t>>>=0,r||E(e,t,this.length);for(var n=this[e],i=1,s=0;++s<t&&(i*=256);)n+=this[e+s]*i;return n>=(i*=128)&&(n-=Math.pow(2,8*t)),n},s.prototype.readIntBE=function(e,t,r){e>>>=0,t>>>=0,r||E(e,t,this.length);for(var n=t,i=1,s=this[e+--n];n>0&&(i*=256);)s+=this[e+--n]*i;return s>=(i*=128)&&(s-=Math.pow(2,8*t)),s},s.prototype.readInt8=function(e,t){return e>>>=0,t||E(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},s.prototype.readInt16LE=function(e,t){e>>>=0,t||E(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},s.prototype.readInt16BE=function(e,t){e>>>=0,t||E(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},s.prototype.readInt32LE=function(e,t){return e>>>=0,t||E(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},s.prototype.readInt32BE=function(e,t){return e>>>=0,t||E(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},s.prototype.readFloatLE=function(e,t){return e>>>=0,t||E(e,4,this.length),n.read(this,e,!0,23,4)},s.prototype.readFloatBE=function(e,t){return e>>>=0,t||E(e,4,this.length),n.read(this,e,!1,23,4)},s.prototype.readDoubleLE=function(e,t){return e>>>=0,t||E(e,8,this.length),n.read(this,e,!0,52,8)},s.prototype.readDoubleBE=function(e,t){return e>>>=0,t||E(e,8,this.length),n.read(this,e,!1,52,8)},s.prototype.writeUIntLE=function(e,t,r,n){(e=+e,t>>>=0,r>>>=0,n)||A(this,e,t,r,Math.pow(2,8*r)-1,0);var i=1,s=0;for(this[t]=255&e;++s<r&&(i*=256);)this[t+s]=e/i&255;return t+r},s.prototype.writeUIntBE=function(e,t,r,n){(e=+e,t>>>=0,r>>>=0,n)||A(this,e,t,r,Math.pow(2,8*r)-1,0);var i=r-1,s=1;for(this[t+i]=255&e;--i>=0&&(s*=256);)this[t+i]=e/s&255;return t+r},s.prototype.writeUInt8=function(e,t,r){return e=+e,t>>>=0,r||A(this,e,t,1,255,0),this[t]=255&e,t+1},s.prototype.writeUInt16LE=function(e,t,r){return e=+e,t>>>=0,r||A(this,e,t,2,65535,0),this[t]=255&e,this[t+1]=e>>>8,t+2},s.prototype.writeUInt16BE=function(e,t,r){return e=+e,t>>>=0,r||A(this,e,t,2,65535,0),this[t]=e>>>8,this[t+1]=255&e,t+2},s.prototype.writeUInt32LE=function(e,t,r){return e=+e,t>>>=0,r||A(this,e,t,4,4294967295,0),this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e,t+4},s.prototype.writeUInt32BE=function(e,t,r){return e=+e,t>>>=0,r||A(this,e,t,4,4294967295,0),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},s.prototype.writeIntLE=function(e,t,r,n){if(e=+e,t>>>=0,!n){var i=Math.pow(2,8*r-1);A(this,e,t,r,i-1,-i)}var s=0,o=1,a=0;for(this[t]=255&e;++s<r&&(o*=256);)e<0&&0===a&&0!==this[t+s-1]&&(a=1),this[t+s]=(e/o>>0)-a&255;return t+r},s.prototype.writeIntBE=function(e,t,r,n){if(e=+e,t>>>=0,!n){var i=Math.pow(2,8*r-1);A(this,e,t,r,i-1,-i)}var s=r-1,o=1,a=0;for(this[t+s]=255&e;--s>=0&&(o*=256);)e<0&&0===a&&0!==this[t+s+1]&&(a=1),this[t+s]=(e/o>>0)-a&255;return t+r},s.prototype.writeInt8=function(e,t,r){return e=+e,t>>>=0,r||A(this,e,t,1,127,-128),e<0&&(e=255+e+1),this[t]=255&e,t+1},s.prototype.writeInt16LE=function(e,t,r){return e=+e,t>>>=0,r||A(this,e,t,2,32767,-32768),this[t]=255&e,this[t+1]=e>>>8,t+2},s.prototype.writeInt16BE=function(e,t,r){return e=+e,t>>>=0,r||A(this,e,t,2,32767,-32768),this[t]=e>>>8,this[t+1]=255&e,t+2},s.prototype.writeInt32LE=function(e,t,r){return e=+e,t>>>=0,r||A(this,e,t,4,2147483647,-2147483648),this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24,t+4},s.prototype.writeInt32BE=function(e,t,r){return e=+e,t>>>=0,r||A(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},s.prototype.writeFloatLE=function(e,t,r){return O(this,e,t,!0,r)},s.prototype.writeFloatBE=function(e,t,r){return O(this,e,t,!1,r)},s.prototype.writeDoubleLE=function(e,t,r){return j(this,e,t,!0,r)},s.prototype.writeDoubleBE=function(e,t,r){return j(this,e,t,!1,r)},s.prototype.copy=function(e,t,r,n){if(!s.isBuffer(e))throw new TypeError(\"argument should be a Buffer\");if(r||(r=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&n<r&&(n=r),n===r)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError(\"targetStart out of bounds\");if(r<0||r>=this.length)throw new RangeError(\"Index out of range\");if(n<0)throw new RangeError(\"sourceEnd out of bounds\");n>this.length&&(n=this.length),e.length-t<n-r&&(n=e.length-t+r);var i=n-r;if(this===e&&\"function\"==typeof Uint8Array.prototype.copyWithin)this.copyWithin(t,r,n);else if(this===e&&r<t&&t<n)for(var o=i-1;o>=0;--o)e[o+t]=this[o+r];else Uint8Array.prototype.set.call(e,this.subarray(r,n),t);return i},s.prototype.fill=function(e,t,r,n){if(\"string\"==typeof e){if(\"string\"==typeof t?(n=t,t=0,r=this.length):\"string\"==typeof r&&(n=r,r=this.length),void 0!==n&&\"string\"!=typeof n)throw new TypeError(\"encoding must be a string\");if(\"string\"==typeof n&&!s.isEncoding(n))throw new TypeError(\"Unknown encoding: \"+n);if(1===e.length){var i=e.charCodeAt(0);(\"utf8\"===n&&i<128||\"latin1\"===n)&&(e=i)}}else\"number\"==typeof e&&(e&=255);if(t<0||this.length<t||this.length<r)throw new RangeError(\"Out of range index\");if(r<=t)return this;var o;if(t>>>=0,r=void 0===r?this.length:r>>>0,e||(e=0),\"number\"==typeof e)for(o=t;o<r;++o)this[o]=e;else{var a=s.isBuffer(e)?e:s.from(e,n),l=a.length;if(0===l)throw new TypeError('The value \"'+e+'\" is invalid for argument \"value\"');for(o=0;o<r-t;++o)this[o+t]=a[o%l]}return this};var I=/[^+/0-9A-Za-z-_]/g;function N(e){return e<16?\"0\"+e.toString(16):e.toString(16)}function P(e,t){var r;t=t||1/0;for(var n=e.length,i=null,s=[],o=0;o<n;++o){if((r=e.charCodeAt(o))>55295&&r<57344){if(!i){if(r>56319){(t-=3)>-1&&s.push(239,191,189);continue}if(o+1===n){(t-=3)>-1&&s.push(239,191,189);continue}i=r;continue}if(r<56320){(t-=3)>-1&&s.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(t-=3)>-1&&s.push(239,191,189);if(i=null,r<128){if((t-=1)<0)break;s.push(r)}else if(r<2048){if((t-=2)<0)break;s.push(r>>6|192,63&r|128)}else if(r<65536){if((t-=3)<0)break;s.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error(\"Invalid code point\");if((t-=4)<0)break;s.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return s}function B(e){return t.toByteArray(function(e){if((e=(e=e.split(\"=\")[0]).trim().replace(I,\"\")).length<2)return\"\";for(;e.length%4!=0;)e+=\"=\";return e}(e))}function D(e,t,r,n){for(var i=0;i<n&&!(i+r>=t.length||i>=e.length);++i)t[i+r]=e[i];return i}function F(e,t){return e instanceof t||null!=e&&null!=e.constructor&&null!=e.constructor.name&&e.constructor.name===t.name}function L(e){return e!=e}}).call(this)}).call(this,e(\"buffer\").Buffer)},{\"base64-js\":185,buffer:220,ieee754:439}],221:[function(e,t,r){\"use strict\";var n=e(\"safe-buffer\").Buffer,i=e(\"stream\").Transform,s=e(\"string_decoder\").StringDecoder;function o(e){i.call(this),this.hashMode=\"string\"==typeof e,this.hashMode?this[e]=this._finalOrDigest:this.final=this._finalOrDigest,this._final&&(this.__final=this._final,this._final=null),this._decoder=null,this._encoding=null}e(\"inherits\")(o,i),o.prototype.update=function(e,t,r){\"string\"==typeof e&&(e=n.from(e,t));var i=this._update(e);return this.hashMode?this:(r&&(i=this._toString(i,r)),i)},o.prototype.setAutoPadding=function(){},o.prototype.getAuthTag=function(){throw new Error(\"trying to get auth tag in unsupported state\")},o.prototype.setAuthTag=function(){throw new Error(\"trying to set auth tag in unsupported state\")},o.prototype.setAAD=function(){throw new Error(\"trying to set aad in unsupported state\")},o.prototype._transform=function(e,t,r){var n;try{this.hashMode?this._update(e):this.push(this._update(e))}catch(e){n=e}finally{r(n)}},o.prototype._flush=function(e){var t;try{this.push(this.__final())}catch(e){t=e}e(t)},o.prototype._finalOrDigest=function(e){var t=this.__final()||n.alloc(0);return e&&(t=this._toString(t,e,!0)),t},o.prototype._toString=function(e,t,r){if(this._decoder||(this._decoder=new s(t),this._encoding=t),this._encoding!==t)throw new Error(\"can't switch encodings\");var n=this._decoder.write(e);return r&&(n+=this._decoder.end()),n},t.exports=o},{inherits:440,\"safe-buffer\":494,stream:505,string_decoder:218}],222:[function(e,t,r){\"use strict\";var n=e(\"../internals/is-callable\"),i=e(\"../internals/try-to-string\"),s=TypeError;t.exports=function(e){if(n(e))return e;throw new s(i(e)+\" is not a function\")}},{\"../internals/is-callable\":285,\"../internals/try-to-string\":349}],223:[function(e,t,r){\"use strict\";var n=e(\"../internals/is-constructor\"),i=e(\"../internals/try-to-string\"),s=TypeError;t.exports=function(e){if(n(e))return e;throw new s(i(e)+\" is not a constructor\")}},{\"../internals/is-constructor\":286,\"../internals/try-to-string\":349}],224:[function(e,t,r){\"use strict\";var n=e(\"../internals/is-callable\"),i=String,s=TypeError;t.exports=function(e){if(\"object\"==typeof e||n(e))return e;throw new s(\"Can't set \"+i(e)+\" as a prototype\")}},{\"../internals/is-callable\":285}],225:[function(e,t,r){\"use strict\";var n=e(\"../internals/well-known-symbol\"),i=e(\"../internals/object-create\"),s=e(\"../internals/object-define-property\").f,o=n(\"unscopables\"),a=Array.prototype;void 0===a[o]&&s(a,o,{configurable:!0,value:i(null)}),t.exports=function(e){a[o][e]=!0}},{\"../internals/object-create\":306,\"../internals/object-define-property\":308,\"../internals/well-known-symbol\":357}],226:[function(e,t,r){\"use strict\";var n=e(\"../internals/object-is-prototype-of\"),i=TypeError;t.exports=function(e,t){if(n(t,e))return e;throw new i(\"Incorrect invocation\")}},{\"../internals/object-is-prototype-of\":314}],227:[function(e,t,r){\"use strict\";var n=e(\"../internals/is-object\"),i=String,s=TypeError;t.exports=function(e){if(n(e))return e;throw new s(i(e)+\" is not an object\")}},{\"../internals/is-object\":289}],228:[function(e,t,r){\"use strict\";var n=e(\"../internals/to-indexed-object\"),i=e(\"../internals/to-absolute-index\"),s=e(\"../internals/length-of-array-like\"),o=function(e){return function(t,r,o){var a,l=n(t),c=s(l),u=i(o,c);if(e&&r!=r){for(;c>u;)if((a=l[u++])!=a)return!0}else for(;c>u;u++)if((e||u in l)&&l[u]===r)return e||u||0;return!e&&-1}};t.exports={includes:o(!0),indexOf:o(!1)}},{\"../internals/length-of-array-like\":299,\"../internals/to-absolute-index\":340,\"../internals/to-indexed-object\":341}],229:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-bind-context\"),i=e(\"../internals/function-uncurry-this\"),s=e(\"../internals/indexed-object\"),o=e(\"../internals/to-object\"),a=e(\"../internals/length-of-array-like\"),l=e(\"../internals/array-species-create\"),c=i([].push),u=function(e){var t=1===e,r=2===e,i=3===e,u=4===e,h=6===e,f=7===e,d=5===e||h;return function(p,m,b,g){for(var y,v,w=o(p),_=s(w),x=n(m,b),k=a(_),S=0,M=g||l,C=t?M(p,k):r||f?M(p,0):void 0;k>S;S++)if((d||S in _)&&(v=x(y=_[S],S,w),e))if(t)C[S]=v;else if(v)switch(e){case 3:return!0;case 5:return y;case 6:return S;case 2:c(C,y)}else switch(e){case 4:return!1;case 7:c(C,y)}return h?-1:i||u?u:C}};t.exports={forEach:u(0),map:u(1),filter:u(2),some:u(3),every:u(4),find:u(5),findIndex:u(6),filterReject:u(7)}},{\"../internals/array-species-create\":233,\"../internals/function-bind-context\":262,\"../internals/function-uncurry-this\":268,\"../internals/indexed-object\":280,\"../internals/length-of-array-like\":299,\"../internals/to-object\":344}],230:[function(e,t,r){\"use strict\";var n=e(\"../internals/to-absolute-index\"),i=e(\"../internals/length-of-array-like\"),s=e(\"../internals/create-property\"),o=Array,a=Math.max;t.exports=function(e,t,r){for(var l=i(e),c=n(t,l),u=n(void 0===r?l:r,l),h=o(a(u-c,0)),f=0;c<u;c++,f++)s(h,f,e[c]);return h.length=f,h}},{\"../internals/create-property\":243,\"../internals/length-of-array-like\":299,\"../internals/to-absolute-index\":340}],231:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-uncurry-this\");t.exports=n([].slice)},{\"../internals/function-uncurry-this\":268}],232:[function(e,t,r){\"use strict\";var n=e(\"../internals/is-array\"),i=e(\"../internals/is-constructor\"),s=e(\"../internals/is-object\"),o=e(\"../internals/well-known-symbol\")(\"species\"),a=Array;t.exports=function(e){var t;return n(e)&&(t=e.constructor,(i(t)&&(t===a||n(t.prototype))||s(t)&&null===(t=t[o]))&&(t=void 0)),void 0===t?a:t}},{\"../internals/is-array\":284,\"../internals/is-constructor\":286,\"../internals/is-object\":289,\"../internals/well-known-symbol\":357}],233:[function(e,t,r){\"use strict\";var n=e(\"../internals/array-species-constructor\");t.exports=function(e,t){return new(n(e))(0===t?0:t)}},{\"../internals/array-species-constructor\":232}],234:[function(e,t,r){\"use strict\";var n=e(\"../internals/well-known-symbol\")(\"iterator\"),i=!1;try{var s=0,o={next:function(){return{done:!!s++}},return:function(){i=!0}};o[n]=function(){return this},Array.from(o,(function(){throw 2}))}catch(e){}t.exports=function(e,t){try{if(!t&&!i)return!1}catch(e){return!1}var r=!1;try{var s={};s[n]=function(){return{next:function(){return{done:r=!0}}}},e(s)}catch(e){}return r}},{\"../internals/well-known-symbol\":357}],235:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-uncurry-this\"),i=n({}.toString),s=n(\"\".slice);t.exports=function(e){return s(i(e),8,-1)}},{\"../internals/function-uncurry-this\":268}],236:[function(e,t,r){\"use strict\";var n=e(\"../internals/to-string-tag-support\"),i=e(\"../internals/is-callable\"),s=e(\"../internals/classof-raw\"),o=e(\"../internals/well-known-symbol\")(\"toStringTag\"),a=Object,l=\"Arguments\"===s(function(){return arguments}());t.exports=n?s:function(e){var t,r,n;return void 0===e?\"Undefined\":null===e?\"Null\":\"string\"==typeof(r=function(e,t){try{return e[t]}catch(e){}}(t=a(e),o))?r:l?s(t):\"Object\"===(n=s(t))&&i(t.callee)?\"Arguments\":n}},{\"../internals/classof-raw\":235,\"../internals/is-callable\":285,\"../internals/to-string-tag-support\":347,\"../internals/well-known-symbol\":357}],237:[function(e,t,r){\"use strict\";var n=e(\"../internals/has-own-property\"),i=e(\"../internals/own-keys\"),s=e(\"../internals/object-get-own-property-descriptor\"),o=e(\"../internals/object-define-property\");t.exports=function(e,t,r){for(var a=i(t),l=o.f,c=s.f,u=0;u<a.length;u++){var h=a[u];n(e,h)||r&&n(r,h)||l(e,h,c(t,h))}}},{\"../internals/has-own-property\":275,\"../internals/object-define-property\":308,\"../internals/object-get-own-property-descriptor\":309,\"../internals/own-keys\":321}],238:[function(e,t,r){\"use strict\";var n=e(\"../internals/well-known-symbol\")(\"match\");t.exports=function(e){var t=/./;try{\"/./\"[e](t)}catch(r){try{return t[n]=!1,\"/./\"[e](t)}catch(e){}}return!1}},{\"../internals/well-known-symbol\":357}],239:[function(e,t,r){\"use strict\";var n=e(\"../internals/fails\");t.exports=!n((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},{\"../internals/fails\":260}],240:[function(e,t,r){\"use strict\";t.exports=function(e,t){return{value:e,done:t}}},{}],241:[function(e,t,r){\"use strict\";var n=e(\"../internals/descriptors\"),i=e(\"../internals/object-define-property\"),s=e(\"../internals/create-property-descriptor\");t.exports=n?function(e,t,r){return i.f(e,t,s(1,r))}:function(e,t,r){return e[t]=r,e}},{\"../internals/create-property-descriptor\":242,\"../internals/descriptors\":247,\"../internals/object-define-property\":308}],242:[function(e,t,r){\"use strict\";t.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},{}],243:[function(e,t,r){\"use strict\";var n=e(\"../internals/to-property-key\"),i=e(\"../internals/object-define-property\"),s=e(\"../internals/create-property-descriptor\");t.exports=function(e,t,r){var o=n(t);o in e?i.f(e,o,s(0,r)):e[o]=r}},{\"../internals/create-property-descriptor\":242,\"../internals/object-define-property\":308,\"../internals/to-property-key\":346}],244:[function(e,t,r){\"use strict\";var n=e(\"../internals/make-built-in\"),i=e(\"../internals/object-define-property\");t.exports=function(e,t,r){return r.get&&n(r.get,t,{getter:!0}),r.set&&n(r.set,t,{setter:!0}),i.f(e,t,r)}},{\"../internals/make-built-in\":300,\"../internals/object-define-property\":308}],245:[function(e,t,r){\"use strict\";var n=e(\"../internals/is-callable\"),i=e(\"../internals/object-define-property\"),s=e(\"../internals/make-built-in\"),o=e(\"../internals/define-global-property\");t.exports=function(e,t,r,a){a||(a={});var l=a.enumerable,c=void 0!==a.name?a.name:t;if(n(r)&&s(r,c,a),a.global)l?e[t]=r:o(t,r);else{try{a.unsafe?e[t]&&(l=!0):delete e[t]}catch(e){}l?e[t]=r:i.f(e,t,{value:r,enumerable:!1,configurable:!a.nonConfigurable,writable:!a.nonWritable})}return e}},{\"../internals/define-global-property\":246,\"../internals/is-callable\":285,\"../internals/make-built-in\":300,\"../internals/object-define-property\":308}],246:[function(e,t,r){\"use strict\";var n=e(\"../internals/global\"),i=Object.defineProperty;t.exports=function(e,t){try{i(n,e,{value:t,configurable:!0,writable:!0})}catch(r){n[e]=t}return t}},{\"../internals/global\":274}],247:[function(e,t,r){\"use strict\";var n=e(\"../internals/fails\");t.exports=!n((function(){return 7!==Object.defineProperty({},1,{get:function(){return 7}})[1]}))},{\"../internals/fails\":260}],248:[function(e,t,r){\"use strict\";var n=\"object\"==typeof document&&document.all,i=void 0===n&&void 0!==n;t.exports={all:n,IS_HTMLDDA:i}},{}],249:[function(e,t,r){\"use strict\";var n=e(\"../internals/global\"),i=e(\"../internals/is-object\"),s=n.document,o=i(s)&&i(s.createElement);t.exports=function(e){return o?s.createElement(e):{}}},{\"../internals/global\":274,\"../internals/is-object\":289}],250:[function(e,t,r){\"use strict\";var n=e(\"../internals/engine-is-deno\"),i=e(\"../internals/engine-is-node\");t.exports=!n&&!i&&\"object\"==typeof window&&\"object\"==typeof document},{\"../internals/engine-is-deno\":251,\"../internals/engine-is-node\":254}],251:[function(e,t,r){\"use strict\";t.exports=\"object\"==typeof Deno&&Deno&&\"object\"==typeof Deno.version},{}],252:[function(e,t,r){\"use strict\";var n=e(\"../internals/engine-user-agent\");t.exports=/ipad|iphone|ipod/i.test(n)&&\"undefined\"!=typeof Pebble},{\"../internals/engine-user-agent\":256}],253:[function(e,t,r){\"use strict\";var n=e(\"../internals/engine-user-agent\");t.exports=/(?:ipad|iphone|ipod).*applewebkit/i.test(n)},{\"../internals/engine-user-agent\":256}],254:[function(e,t,r){\"use strict\";var n=e(\"../internals/global\"),i=e(\"../internals/classof-raw\");t.exports=\"process\"===i(n.process)},{\"../internals/classof-raw\":235,\"../internals/global\":274}],255:[function(e,t,r){\"use strict\";var n=e(\"../internals/engine-user-agent\");t.exports=/web0s(?!.*chrome)/i.test(n)},{\"../internals/engine-user-agent\":256}],256:[function(e,t,r){\"use strict\";t.exports=\"undefined\"!=typeof navigator&&String(navigator.userAgent)||\"\"},{}],257:[function(e,t,r){\"use strict\";var n,i,s=e(\"../internals/global\"),o=e(\"../internals/engine-user-agent\"),a=s.process,l=s.Deno,c=a&&a.versions||l&&l.version,u=c&&c.v8;u&&(i=(n=u.split(\".\"))[0]>0&&n[0]<4?1:+(n[0]+n[1])),!i&&o&&(!(n=o.match(/Edge\\/(\\d+)/))||n[1]>=74)&&(n=o.match(/Chrome\\/(\\d+)/))&&(i=+n[1]),t.exports=i},{\"../internals/engine-user-agent\":256,\"../internals/global\":274}],258:[function(e,t,r){\"use strict\";t.exports=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"]},{}],259:[function(e,t,r){\"use strict\";var n=e(\"../internals/global\"),i=e(\"../internals/object-get-own-property-descriptor\").f,s=e(\"../internals/create-non-enumerable-property\"),o=e(\"../internals/define-built-in\"),a=e(\"../internals/define-global-property\"),l=e(\"../internals/copy-constructor-properties\"),c=e(\"../internals/is-forced\");t.exports=function(e,t){var r,u,h,f,d,p=e.target,m=e.global,b=e.stat;if(r=m?n:b?n[p]||a(p,{}):(n[p]||{}).prototype)for(u in t){if(f=t[u],h=e.dontCallGetSet?(d=i(r,u))&&d.value:r[u],!c(m?u:p+(b?\".\":\"#\")+u,e.forced)&&void 0!==h){if(typeof f==typeof h)continue;l(f,h)}(e.sham||h&&h.sham)&&s(f,\"sham\",!0),o(r,u,f,e)}}},{\"../internals/copy-constructor-properties\":237,\"../internals/create-non-enumerable-property\":241,\"../internals/define-built-in\":245,\"../internals/define-global-property\":246,\"../internals/global\":274,\"../internals/is-forced\":287,\"../internals/object-get-own-property-descriptor\":309}],260:[function(e,t,r){\"use strict\";t.exports=function(e){try{return!!e()}catch(e){return!0}}},{}],261:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-bind-native\"),i=Function.prototype,s=i.apply,o=i.call;t.exports=\"object\"==typeof Reflect&&Reflect.apply||(n?o.bind(s):function(){return o.apply(s,arguments)})},{\"../internals/function-bind-native\":263}],262:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-uncurry-this-clause\"),i=e(\"../internals/a-callable\"),s=e(\"../internals/function-bind-native\"),o=n(n.bind);t.exports=function(e,t){return i(e),void 0===t?e:s?o(e,t):function(){return e.apply(t,arguments)}}},{\"../internals/a-callable\":222,\"../internals/function-bind-native\":263,\"../internals/function-uncurry-this-clause\":267}],263:[function(e,t,r){\"use strict\";var n=e(\"../internals/fails\");t.exports=!n((function(){var e=function(){}.bind();return\"function\"!=typeof e||e.hasOwnProperty(\"prototype\")}))},{\"../internals/fails\":260}],264:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-bind-native\"),i=Function.prototype.call;t.exports=n?i.bind(i):function(){return i.apply(i,arguments)}},{\"../internals/function-bind-native\":263}],265:[function(e,t,r){\"use strict\";var n=e(\"../internals/descriptors\"),i=e(\"../internals/has-own-property\"),s=Function.prototype,o=n&&Object.getOwnPropertyDescriptor,a=i(s,\"name\"),l=a&&\"something\"===function(){}.name,c=a&&(!n||n&&o(s,\"name\").configurable);t.exports={EXISTS:a,PROPER:l,CONFIGURABLE:c}},{\"../internals/descriptors\":247,\"../internals/has-own-property\":275}],266:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-uncurry-this\"),i=e(\"../internals/a-callable\");t.exports=function(e,t,r){try{return n(i(Object.getOwnPropertyDescriptor(e,t)[r]))}catch(e){}}},{\"../internals/a-callable\":222,\"../internals/function-uncurry-this\":268}],267:[function(e,t,r){\"use strict\";var n=e(\"../internals/classof-raw\"),i=e(\"../internals/function-uncurry-this\");t.exports=function(e){if(\"Function\"===n(e))return i(e)}},{\"../internals/classof-raw\":235,\"../internals/function-uncurry-this\":268}],268:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-bind-native\"),i=Function.prototype,s=i.call,o=n&&i.bind.bind(s,s);t.exports=n?o:function(e){return function(){return s.apply(e,arguments)}}},{\"../internals/function-bind-native\":263}],269:[function(e,t,r){\"use strict\";var n=e(\"../internals/global\"),i=e(\"../internals/is-callable\"),s=function(e){return i(e)?e:void 0};t.exports=function(e,t){return arguments.length<2?s(n[e]):n[e]&&n[e][t]}},{\"../internals/global\":274,\"../internals/is-callable\":285}],270:[function(e,t,r){\"use strict\";var n=e(\"../internals/classof\"),i=e(\"../internals/get-method\"),s=e(\"../internals/is-null-or-undefined\"),o=e(\"../internals/iterators\"),a=e(\"../internals/well-known-symbol\")(\"iterator\");t.exports=function(e){if(!s(e))return i(e,a)||i(e,\"@@iterator\")||o[n(e)]}},{\"../internals/classof\":236,\"../internals/get-method\":273,\"../internals/is-null-or-undefined\":288,\"../internals/iterators\":298,\"../internals/well-known-symbol\":357}],271:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-call\"),i=e(\"../internals/a-callable\"),s=e(\"../internals/an-object\"),o=e(\"../internals/try-to-string\"),a=e(\"../internals/get-iterator-method\"),l=TypeError;t.exports=function(e,t){var r=arguments.length<2?a(e):t;if(i(r))return s(n(r,e));throw new l(o(e)+\" is not iterable\")}},{\"../internals/a-callable\":222,\"../internals/an-object\":227,\"../internals/function-call\":264,\"../internals/get-iterator-method\":270,\"../internals/try-to-string\":349}],272:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-uncurry-this\"),i=e(\"../internals/is-array\"),s=e(\"../internals/is-callable\"),o=e(\"../internals/classof-raw\"),a=e(\"../internals/to-string\"),l=n([].push);t.exports=function(e){if(s(e))return e;if(i(e)){for(var t=e.length,r=[],n=0;n<t;n++){var c=e[n];\"string\"==typeof c?l(r,c):\"number\"!=typeof c&&\"Number\"!==o(c)&&\"String\"!==o(c)||l(r,a(c))}var u=r.length,h=!0;return function(e,t){if(h)return h=!1,t;if(i(this))return t;for(var n=0;n<u;n++)if(r[n]===e)return t}}}},{\"../internals/classof-raw\":235,\"../internals/function-uncurry-this\":268,\"../internals/is-array\":284,\"../internals/is-callable\":285,\"../internals/to-string\":348}],273:[function(e,t,r){\"use strict\";var n=e(\"../internals/a-callable\"),i=e(\"../internals/is-null-or-undefined\");t.exports=function(e,t){var r=e[t];return i(r)?void 0:n(r)}},{\"../internals/a-callable\":222,\"../internals/is-null-or-undefined\":288}],274:[function(e,t,r){(function(e){(function(){\"use strict\";var r=function(e){return e&&e.Math===Math&&e};t.exports=r(\"object\"==typeof globalThis&&globalThis)||r(\"object\"==typeof window&&window)||r(\"object\"==typeof self&&self)||r(\"object\"==typeof e&&e)||function(){return this}()||this||Function(\"return this\")()}).call(this)}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}],275:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-uncurry-this\"),i=e(\"../internals/to-object\"),s=n({}.hasOwnProperty);t.exports=Object.hasOwn||function(e,t){return s(i(e),t)}},{\"../internals/function-uncurry-this\":268,\"../internals/to-object\":344}],276:[function(e,t,r){\"use strict\";t.exports={}},{}],277:[function(e,t,r){\"use strict\";t.exports=function(e,t){try{1===arguments.length?console.error(e):console.error(e,t)}catch(e){}}},{}],278:[function(e,t,r){\"use strict\";var n=e(\"../internals/get-built-in\");t.exports=n(\"document\",\"documentElement\")},{\"../internals/get-built-in\":269}],279:[function(e,t,r){\"use strict\";var n=e(\"../internals/descriptors\"),i=e(\"../internals/fails\"),s=e(\"../internals/document-create-element\");t.exports=!n&&!i((function(){return 7!==Object.defineProperty(s(\"div\"),\"a\",{get:function(){return 7}}).a}))},{\"../internals/descriptors\":247,\"../internals/document-create-element\":249,\"../internals/fails\":260}],280:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-uncurry-this\"),i=e(\"../internals/fails\"),s=e(\"../internals/classof-raw\"),o=Object,a=n(\"\".split);t.exports=i((function(){return!o(\"z\").propertyIsEnumerable(0)}))?function(e){return\"String\"===s(e)?a(e,\"\"):o(e)}:o},{\"../internals/classof-raw\":235,\"../internals/fails\":260,\"../internals/function-uncurry-this\":268}],281:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-uncurry-this\"),i=e(\"../internals/is-callable\"),s=e(\"../internals/shared-store\"),o=n(Function.toString);i(s.inspectSource)||(s.inspectSource=function(e){return o(e)}),t.exports=s.inspectSource},{\"../internals/function-uncurry-this\":268,\"../internals/is-callable\":285,\"../internals/shared-store\":333}],282:[function(e,t,r){\"use strict\";var n,i,s,o=e(\"../internals/weak-map-basic-detection\"),a=e(\"../internals/global\"),l=e(\"../internals/is-object\"),c=e(\"../internals/create-non-enumerable-property\"),u=e(\"../internals/has-own-property\"),h=e(\"../internals/shared-store\"),f=e(\"../internals/shared-key\"),d=e(\"../internals/hidden-keys\"),p=a.TypeError,m=a.WeakMap;if(o||h.state){var b=h.state||(h.state=new m);b.get=b.get,b.has=b.has,b.set=b.set,n=function(e,t){if(b.has(e))throw new p(\"Object already initialized\");return t.facade=e,b.set(e,t),t},i=function(e){return b.get(e)||{}},s=function(e){return b.has(e)}}else{var g=f(\"state\");d[g]=!0,n=function(e,t){if(u(e,g))throw new p(\"Object already initialized\");return t.facade=e,c(e,g,t),t},i=function(e){return u(e,g)?e[g]:{}},s=function(e){return u(e,g)}}t.exports={set:n,get:i,has:s,enforce:function(e){return s(e)?i(e):n(e,{})},getterFor:function(e){return function(t){var r;if(!l(t)||(r=i(t)).type!==e)throw new p(\"Incompatible receiver, \"+e+\" required\");return r}}}},{\"../internals/create-non-enumerable-property\":241,\"../internals/global\":274,\"../internals/has-own-property\":275,\"../internals/hidden-keys\":276,\"../internals/is-object\":289,\"../internals/shared-key\":332,\"../internals/shared-store\":333,\"../internals/weak-map-basic-detection\":354}],283:[function(e,t,r){\"use strict\";var n=e(\"../internals/well-known-symbol\"),i=e(\"../internals/iterators\"),s=n(\"iterator\"),o=Array.prototype;t.exports=function(e){return void 0!==e&&(i.Array===e||o[s]===e)}},{\"../internals/iterators\":298,\"../internals/well-known-symbol\":357}],284:[function(e,t,r){\"use strict\";var n=e(\"../internals/classof-raw\");t.exports=Array.isArray||function(e){return\"Array\"===n(e)}},{\"../internals/classof-raw\":235}],285:[function(e,t,r){\"use strict\";var n=e(\"../internals/document-all\"),i=n.all;t.exports=n.IS_HTMLDDA?function(e){return\"function\"==typeof e||e===i}:function(e){return\"function\"==typeof e}},{\"../internals/document-all\":248}],286:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-uncurry-this\"),i=e(\"../internals/fails\"),s=e(\"../internals/is-callable\"),o=e(\"../internals/classof\"),a=e(\"../internals/get-built-in\"),l=e(\"../internals/inspect-source\"),c=function(){},u=[],h=a(\"Reflect\",\"construct\"),f=/^\\s*(?:class|function)\\b/,d=n(f.exec),p=!f.test(c),m=function(e){if(!s(e))return!1;try{return h(c,u,e),!0}catch(e){return!1}},b=function(e){if(!s(e))return!1;switch(o(e)){case\"AsyncFunction\":case\"GeneratorFunction\":case\"AsyncGeneratorFunction\":return!1}try{return p||!!d(f,l(e))}catch(e){return!0}};b.sham=!0,t.exports=!h||i((function(){var e;return m(m.call)||!m(Object)||!m((function(){e=!0}))||e}))?b:m},{\"../internals/classof\":236,\"../internals/fails\":260,\"../internals/function-uncurry-this\":268,\"../internals/get-built-in\":269,\"../internals/inspect-source\":281,\"../internals/is-callable\":285}],287:[function(e,t,r){\"use strict\";var n=e(\"../internals/fails\"),i=e(\"../internals/is-callable\"),s=/#|\\.prototype\\./,o=function(e,t){var r=l[a(e)];return r===u||r!==c&&(i(t)?n(t):!!t)},a=o.normalize=function(e){return String(e).replace(s,\".\").toLowerCase()},l=o.data={},c=o.NATIVE=\"N\",u=o.POLYFILL=\"P\";t.exports=o},{\"../internals/fails\":260,\"../internals/is-callable\":285}],288:[function(e,t,r){\"use strict\";t.exports=function(e){return null==e}},{}],289:[function(e,t,r){\"use strict\";var n=e(\"../internals/is-callable\"),i=e(\"../internals/document-all\"),s=i.all;t.exports=i.IS_HTMLDDA?function(e){return\"object\"==typeof e?null!==e:n(e)||e===s}:function(e){return\"object\"==typeof e?null!==e:n(e)}},{\"../internals/document-all\":248,\"../internals/is-callable\":285}],290:[function(e,t,r){\"use strict\";t.exports=!1},{}],291:[function(e,t,r){\"use strict\";var n=e(\"../internals/is-object\"),i=e(\"../internals/classof-raw\"),s=e(\"../internals/well-known-symbol\")(\"match\");t.exports=function(e){var t;return n(e)&&(void 0!==(t=e[s])?!!t:\"RegExp\"===i(e))}},{\"../internals/classof-raw\":235,\"../internals/is-object\":289,\"../internals/well-known-symbol\":357}],292:[function(e,t,r){\"use strict\";var n=e(\"../internals/get-built-in\"),i=e(\"../internals/is-callable\"),s=e(\"../internals/object-is-prototype-of\"),o=e(\"../internals/use-symbol-as-uid\"),a=Object;t.exports=o?function(e){return\"symbol\"==typeof e}:function(e){var t=n(\"Symbol\");return i(t)&&s(t.prototype,a(e))}},{\"../internals/get-built-in\":269,\"../internals/is-callable\":285,\"../internals/object-is-prototype-of\":314,\"../internals/use-symbol-as-uid\":351}],293:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-bind-context\"),i=e(\"../internals/function-call\"),s=e(\"../internals/an-object\"),o=e(\"../internals/try-to-string\"),a=e(\"../internals/is-array-iterator-method\"),l=e(\"../internals/length-of-array-like\"),c=e(\"../internals/object-is-prototype-of\"),u=e(\"../internals/get-iterator\"),h=e(\"../internals/get-iterator-method\"),f=e(\"../internals/iterator-close\"),d=TypeError,p=function(e,t){this.stopped=e,this.result=t},m=p.prototype;t.exports=function(e,t,r){var b,g,y,v,w,_,x,k=r&&r.that,S=!(!r||!r.AS_ENTRIES),M=!(!r||!r.IS_RECORD),C=!(!r||!r.IS_ITERATOR),T=!(!r||!r.INTERRUPTED),E=n(t,k),A=function(e){return b&&f(b,\"normal\",e),new p(!0,e)},R=function(e){return S?(s(e),T?E(e[0],e[1],A):E(e[0],e[1])):T?E(e,A):E(e)};if(M)b=e.iterator;else if(C)b=e;else{if(!(g=h(e)))throw new d(o(e)+\" is not iterable\");if(a(g)){for(y=0,v=l(e);v>y;y++)if((w=R(e[y]))&&c(m,w))return w;return new p(!1)}b=u(e,g)}for(_=M?e.next:b.next;!(x=i(_,b)).done;){try{w=R(x.value)}catch(e){f(b,\"throw\",e)}if(\"object\"==typeof w&&w&&c(m,w))return w}return new p(!1)}},{\"../internals/an-object\":227,\"../internals/function-bind-context\":262,\"../internals/function-call\":264,\"../internals/get-iterator\":271,\"../internals/get-iterator-method\":270,\"../internals/is-array-iterator-method\":283,\"../internals/iterator-close\":294,\"../internals/length-of-array-like\":299,\"../internals/object-is-prototype-of\":314,\"../internals/try-to-string\":349}],294:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-call\"),i=e(\"../internals/an-object\"),s=e(\"../internals/get-method\");t.exports=function(e,t,r){var o,a;i(e);try{if(!(o=s(e,\"return\"))){if(\"throw\"===t)throw r;return r}o=n(o,e)}catch(e){a=!0,o=e}if(\"throw\"===t)throw r;if(a)throw o;return i(o),r}},{\"../internals/an-object\":227,\"../internals/function-call\":264,\"../internals/get-method\":273}],295:[function(e,t,r){\"use strict\";var n=e(\"../internals/iterators-core\").IteratorPrototype,i=e(\"../internals/object-create\"),s=e(\"../internals/create-property-descriptor\"),o=e(\"../internals/set-to-string-tag\"),a=e(\"../internals/iterators\"),l=function(){return this};t.exports=function(e,t,r,c){var u=t+\" Iterator\";return e.prototype=i(n,{next:s(+!c,r)}),o(e,u,!1,!0),a[u]=l,e}},{\"../internals/create-property-descriptor\":242,\"../internals/iterators\":298,\"../internals/iterators-core\":297,\"../internals/object-create\":306,\"../internals/set-to-string-tag\":331}],296:[function(e,t,r){\"use strict\";var n=e(\"../internals/export\"),i=e(\"../internals/function-call\"),s=e(\"../internals/is-pure\"),o=e(\"../internals/function-name\"),a=e(\"../internals/is-callable\"),l=e(\"../internals/iterator-create-constructor\"),c=e(\"../internals/object-get-prototype-of\"),u=e(\"../internals/object-set-prototype-of\"),h=e(\"../internals/set-to-string-tag\"),f=e(\"../internals/create-non-enumerable-property\"),d=e(\"../internals/define-built-in\"),p=e(\"../internals/well-known-symbol\"),m=e(\"../internals/iterators\"),b=e(\"../internals/iterators-core\"),g=o.PROPER,y=o.CONFIGURABLE,v=b.IteratorPrototype,w=b.BUGGY_SAFARI_ITERATORS,_=p(\"iterator\"),x=function(){return this};t.exports=function(e,t,r,o,p,b,k){l(r,t,o);var S,M,C,T=function(e){if(e===p&&j)return j;if(!w&&e&&e in R)return R[e];switch(e){case\"keys\":case\"values\":case\"entries\":return function(){return new r(this,e)}}return function(){return new r(this)}},E=t+\" Iterator\",A=!1,R=e.prototype,O=R[_]||R[\"@@iterator\"]||p&&R[p],j=!w&&O||T(p),I=\"Array\"===t&&R.entries||O;if(I&&(S=c(I.call(new e)))!==Object.prototype&&S.next&&(s||c(S)===v||(u?u(S,v):a(S[_])||d(S,_,x)),h(S,E,!0,!0),s&&(m[E]=x)),g&&\"values\"===p&&O&&\"values\"!==O.name&&(!s&&y?f(R,\"name\",\"values\"):(A=!0,j=function(){return i(O,this)})),p)if(M={values:T(\"values\"),keys:b?j:T(\"keys\"),entries:T(\"entries\")},k)for(C in M)(w||A||!(C in R))&&d(R,C,M[C]);else n({target:t,proto:!0,forced:w||A},M);return s&&!k||R[_]===j||d(R,_,j,{name:p}),m[t]=j,M}},{\"../internals/create-non-enumerable-property\":241,\"../internals/define-built-in\":245,\"../internals/export\":259,\"../internals/function-call\":264,\"../internals/function-name\":265,\"../internals/is-callable\":285,\"../internals/is-pure\":290,\"../internals/iterator-create-constructor\":295,\"../internals/iterators\":298,\"../internals/iterators-core\":297,\"../internals/object-get-prototype-of\":313,\"../internals/object-set-prototype-of\":318,\"../internals/set-to-string-tag\":331,\"../internals/well-known-symbol\":357}],297:[function(e,t,r){\"use strict\";var n,i,s,o=e(\"../internals/fails\"),a=e(\"../internals/is-callable\"),l=e(\"../internals/is-object\"),c=e(\"../internals/object-create\"),u=e(\"../internals/object-get-prototype-of\"),h=e(\"../internals/define-built-in\"),f=e(\"../internals/well-known-symbol\"),d=e(\"../internals/is-pure\"),p=f(\"iterator\"),m=!1;[].keys&&(\"next\"in(s=[].keys())?(i=u(u(s)))!==Object.prototype&&(n=i):m=!0),!l(n)||o((function(){var e={};return n[p].call(e)!==e}))?n={}:d&&(n=c(n)),a(n[p])||h(n,p,(function(){return this})),t.exports={IteratorPrototype:n,BUGGY_SAFARI_ITERATORS:m}},{\"../internals/define-built-in\":245,\"../internals/fails\":260,\"../internals/is-callable\":285,\"../internals/is-object\":289,\"../internals/is-pure\":290,\"../internals/object-create\":306,\"../internals/object-get-prototype-of\":313,\"../internals/well-known-symbol\":357}],298:[function(e,t,r){arguments[4][276][0].apply(r,arguments)},{dup:276}],299:[function(e,t,r){\"use strict\";var n=e(\"../internals/to-length\");t.exports=function(e){return n(e.length)}},{\"../internals/to-length\":343}],300:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-uncurry-this\"),i=e(\"../internals/fails\"),s=e(\"../internals/is-callable\"),o=e(\"../internals/has-own-property\"),a=e(\"../internals/descriptors\"),l=e(\"../internals/function-name\").CONFIGURABLE,c=e(\"../internals/inspect-source\"),u=e(\"../internals/internal-state\"),h=u.enforce,f=u.get,d=String,p=Object.defineProperty,m=n(\"\".slice),b=n(\"\".replace),g=n([].join),y=a&&!i((function(){return 8!==p((function(){}),\"length\",{value:8}).length})),v=String(String).split(\"String\"),w=t.exports=function(e,t,r){\"Symbol(\"===m(d(t),0,7)&&(t=\"[\"+b(d(t),/^Symbol\\(([^)]*)\\)/,\"$1\")+\"]\"),r&&r.getter&&(t=\"get \"+t),r&&r.setter&&(t=\"set \"+t),(!o(e,\"name\")||l&&e.name!==t)&&(a?p(e,\"name\",{value:t,configurable:!0}):e.name=t),y&&r&&o(r,\"arity\")&&e.length!==r.arity&&p(e,\"length\",{value:r.arity});try{r&&o(r,\"constructor\")&&r.constructor?a&&p(e,\"prototype\",{writable:!1}):e.prototype&&(e.prototype=void 0)}catch(e){}var n=h(e);return o(n,\"source\")||(n.source=g(v,\"string\"==typeof t?t:\"\")),e};Function.prototype.toString=w((function(){return s(this)&&f(this).source||c(this)}),\"toString\")},{\"../internals/descriptors\":247,\"../internals/fails\":260,\"../internals/function-name\":265,\"../internals/function-uncurry-this\":268,\"../internals/has-own-property\":275,\"../internals/inspect-source\":281,\"../internals/internal-state\":282,\"../internals/is-callable\":285}],301:[function(e,t,r){\"use strict\";var n=Math.ceil,i=Math.floor;t.exports=Math.trunc||function(e){var t=+e;return(t>0?i:n)(t)}},{}],302:[function(e,t,r){\"use strict\";var n,i,s,o,a,l=e(\"../internals/global\"),c=e(\"../internals/function-bind-context\"),u=e(\"../internals/object-get-own-property-descriptor\").f,h=e(\"../internals/task\").set,f=e(\"../internals/queue\"),d=e(\"../internals/engine-is-ios\"),p=e(\"../internals/engine-is-ios-pebble\"),m=e(\"../internals/engine-is-webos-webkit\"),b=e(\"../internals/engine-is-node\"),g=l.MutationObserver||l.WebKitMutationObserver,y=l.document,v=l.process,w=l.Promise,_=u(l,\"queueMicrotask\"),x=_&&_.value;if(!x){var k=new f,S=function(){var e,t;for(b&&(e=v.domain)&&e.exit();t=k.get();)try{t()}catch(e){throw k.head&&n(),e}e&&e.enter()};d||b||m||!g||!y?!p&&w&&w.resolve?((o=w.resolve(void 0)).constructor=w,a=c(o.then,o),n=function(){a(S)}):b?n=function(){v.nextTick(S)}:(h=c(h,l),n=function(){h(S)}):(i=!0,s=y.createTextNode(\"\"),new g(S).observe(s,{characterData:!0}),n=function(){s.data=i=!i}),x=function(e){k.head||n(),k.add(e)}}t.exports=x},{\"../internals/engine-is-ios\":253,\"../internals/engine-is-ios-pebble\":252,\"../internals/engine-is-node\":254,\"../internals/engine-is-webos-webkit\":255,\"../internals/function-bind-context\":262,\"../internals/global\":274,\"../internals/object-get-own-property-descriptor\":309,\"../internals/queue\":328,\"../internals/task\":339}],303:[function(e,t,r){\"use strict\";var n=e(\"../internals/a-callable\"),i=TypeError,s=function(e){var t,r;this.promise=new e((function(e,n){if(void 0!==t||void 0!==r)throw new i(\"Bad Promise constructor\");t=e,r=n})),this.resolve=n(t),this.reject=n(r)};t.exports.f=function(e){return new s(e)}},{\"../internals/a-callable\":222}],304:[function(e,t,r){\"use strict\";var n=e(\"../internals/is-regexp\"),i=TypeError;t.exports=function(e){if(n(e))throw new i(\"The method doesn't accept regular expressions\");return e}},{\"../internals/is-regexp\":291}],305:[function(e,t,r){\"use strict\";var n=e(\"../internals/descriptors\"),i=e(\"../internals/function-uncurry-this\"),s=e(\"../internals/function-call\"),o=e(\"../internals/fails\"),a=e(\"../internals/object-keys\"),l=e(\"../internals/object-get-own-property-symbols\"),c=e(\"../internals/object-property-is-enumerable\"),u=e(\"../internals/to-object\"),h=e(\"../internals/indexed-object\"),f=Object.assign,d=Object.defineProperty,p=i([].concat);t.exports=!f||o((function(){if(n&&1!==f({b:1},f(d({},\"a\",{enumerable:!0,get:function(){d(this,\"b\",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},r=Symbol(\"assign detection\");return e[r]=7,\"abcdefghijklmnopqrst\".split(\"\").forEach((function(e){t[e]=e})),7!==f({},e)[r]||\"abcdefghijklmnopqrst\"!==a(f({},t)).join(\"\")}))?function(e,t){for(var r=u(e),i=arguments.length,o=1,f=l.f,d=c.f;i>o;)for(var m,b=h(arguments[o++]),g=f?p(a(b),f(b)):a(b),y=g.length,v=0;y>v;)m=g[v++],n&&!s(d,b,m)||(r[m]=b[m]);return r}:f},{\"../internals/descriptors\":247,\"../internals/fails\":260,\"../internals/function-call\":264,\"../internals/function-uncurry-this\":268,\"../internals/indexed-object\":280,\"../internals/object-get-own-property-symbols\":312,\"../internals/object-keys\":316,\"../internals/object-property-is-enumerable\":317,\"../internals/to-object\":344}],306:[function(e,t,r){\"use strict\";var n,i=e(\"../internals/an-object\"),s=e(\"../internals/object-define-properties\"),o=e(\"../internals/enum-bug-keys\"),a=e(\"../internals/hidden-keys\"),l=e(\"../internals/html\"),c=e(\"../internals/document-create-element\"),u=e(\"../internals/shared-key\"),h=u(\"IE_PROTO\"),f=function(){},d=function(e){return\"<script>\"+e+\"<\\/script>\"},p=function(e){e.write(d(\"\")),e.close();var t=e.parentWindow.Object;return e=null,t},m=function(){try{n=new ActiveXObject(\"htmlfile\")}catch(e){}var e,t;m=\"undefined\"!=typeof document?document.domain&&n?p(n):((t=c(\"iframe\")).style.display=\"none\",l.appendChild(t),t.src=String(\"javascript:\"),(e=t.contentWindow.document).open(),e.write(d(\"document.F=Object\")),e.close(),e.F):p(n);for(var r=o.length;r--;)delete m.prototype[o[r]];return m()};a[h]=!0,t.exports=Object.create||function(e,t){var r;return null!==e?(f.prototype=i(e),r=new f,f.prototype=null,r[h]=e):r=m(),void 0===t?r:s.f(r,t)}},{\"../internals/an-object\":227,\"../internals/document-create-element\":249,\"../internals/enum-bug-keys\":258,\"../internals/hidden-keys\":276,\"../internals/html\":278,\"../internals/object-define-properties\":307,\"../internals/shared-key\":332}],307:[function(e,t,r){\"use strict\";var n=e(\"../internals/descriptors\"),i=e(\"../internals/v8-prototype-define-bug\"),s=e(\"../internals/object-define-property\"),o=e(\"../internals/an-object\"),a=e(\"../internals/to-indexed-object\"),l=e(\"../internals/object-keys\");r.f=n&&!i?Object.defineProperties:function(e,t){o(e);for(var r,n=a(t),i=l(t),c=i.length,u=0;c>u;)s.f(e,r=i[u++],n[r]);return e}},{\"../internals/an-object\":227,\"../internals/descriptors\":247,\"../internals/object-define-property\":308,\"../internals/object-keys\":316,\"../internals/to-indexed-object\":341,\"../internals/v8-prototype-define-bug\":352}],308:[function(e,t,r){\"use strict\";var n=e(\"../internals/descriptors\"),i=e(\"../internals/ie8-dom-define\"),s=e(\"../internals/v8-prototype-define-bug\"),o=e(\"../internals/an-object\"),a=e(\"../internals/to-property-key\"),l=TypeError,c=Object.defineProperty,u=Object.getOwnPropertyDescriptor;r.f=n?s?function(e,t,r){if(o(e),t=a(t),o(r),\"function\"==typeof e&&\"prototype\"===t&&\"value\"in r&&\"writable\"in r&&!r.writable){var n=u(e,t);n&&n.writable&&(e[t]=r.value,r={configurable:\"configurable\"in r?r.configurable:n.configurable,enumerable:\"enumerable\"in r?r.enumerable:n.enumerable,writable:!1})}return c(e,t,r)}:c:function(e,t,r){if(o(e),t=a(t),o(r),i)try{return c(e,t,r)}catch(e){}if(\"get\"in r||\"set\"in r)throw new l(\"Accessors not supported\");return\"value\"in r&&(e[t]=r.value),e}},{\"../internals/an-object\":227,\"../internals/descriptors\":247,\"../internals/ie8-dom-define\":279,\"../internals/to-property-key\":346,\"../internals/v8-prototype-define-bug\":352}],309:[function(e,t,r){\"use strict\";var n=e(\"../internals/descriptors\"),i=e(\"../internals/function-call\"),s=e(\"../internals/object-property-is-enumerable\"),o=e(\"../internals/create-property-descriptor\"),a=e(\"../internals/to-indexed-object\"),l=e(\"../internals/to-property-key\"),c=e(\"../internals/has-own-property\"),u=e(\"../internals/ie8-dom-define\"),h=Object.getOwnPropertyDescriptor;r.f=n?h:function(e,t){if(e=a(e),t=l(t),u)try{return h(e,t)}catch(e){}if(c(e,t))return o(!i(s.f,e,t),e[t])}},{\"../internals/create-property-descriptor\":242,\"../internals/descriptors\":247,\"../internals/function-call\":264,\"../internals/has-own-property\":275,\"../internals/ie8-dom-define\":279,\"../internals/object-property-is-enumerable\":317,\"../internals/to-indexed-object\":341,\"../internals/to-property-key\":346}],310:[function(e,t,r){\"use strict\";var n=e(\"../internals/classof-raw\"),i=e(\"../internals/to-indexed-object\"),s=e(\"../internals/object-get-own-property-names\").f,o=e(\"../internals/array-slice-simple\"),a=\"object\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];t.exports.f=function(e){return a&&\"Window\"===n(e)?function(e){try{return s(e)}catch(e){return o(a)}}(e):s(i(e))}},{\"../internals/array-slice-simple\":230,\"../internals/classof-raw\":235,\"../internals/object-get-own-property-names\":311,\"../internals/to-indexed-object\":341}],311:[function(e,t,r){\"use strict\";var n=e(\"../internals/object-keys-internal\"),i=e(\"../internals/enum-bug-keys\").concat(\"length\",\"prototype\");r.f=Object.getOwnPropertyNames||function(e){return n(e,i)}},{\"../internals/enum-bug-keys\":258,\"../internals/object-keys-internal\":315}],312:[function(e,t,r){\"use strict\";r.f=Object.getOwnPropertySymbols},{}],313:[function(e,t,r){\"use strict\";var n=e(\"../internals/has-own-property\"),i=e(\"../internals/is-callable\"),s=e(\"../internals/to-object\"),o=e(\"../internals/shared-key\"),a=e(\"../internals/correct-prototype-getter\"),l=o(\"IE_PROTO\"),c=Object,u=c.prototype;t.exports=a?c.getPrototypeOf:function(e){var t=s(e);if(n(t,l))return t[l];var r=t.constructor;return i(r)&&t instanceof r?r.prototype:t instanceof c?u:null}},{\"../internals/correct-prototype-getter\":239,\"../internals/has-own-property\":275,\"../internals/is-callable\":285,\"../internals/shared-key\":332,\"../internals/to-object\":344}],314:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-uncurry-this\");t.exports=n({}.isPrototypeOf)},{\"../internals/function-uncurry-this\":268}],315:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-uncurry-this\"),i=e(\"../internals/has-own-property\"),s=e(\"../internals/to-indexed-object\"),o=e(\"../internals/array-includes\").indexOf,a=e(\"../internals/hidden-keys\"),l=n([].push);t.exports=function(e,t){var r,n=s(e),c=0,u=[];for(r in n)!i(a,r)&&i(n,r)&&l(u,r);for(;t.length>c;)i(n,r=t[c++])&&(~o(u,r)||l(u,r));return u}},{\"../internals/array-includes\":228,\"../internals/function-uncurry-this\":268,\"../internals/has-own-property\":275,\"../internals/hidden-keys\":276,\"../internals/to-indexed-object\":341}],316:[function(e,t,r){\"use strict\";var n=e(\"../internals/object-keys-internal\"),i=e(\"../internals/enum-bug-keys\");t.exports=Object.keys||function(e){return n(e,i)}},{\"../internals/enum-bug-keys\":258,\"../internals/object-keys-internal\":315}],317:[function(e,t,r){\"use strict\";var n={}.propertyIsEnumerable,i=Object.getOwnPropertyDescriptor,s=i&&!n.call({1:2},1);r.f=s?function(e){var t=i(this,e);return!!t&&t.enumerable}:n},{}],318:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-uncurry-this-accessor\"),i=e(\"../internals/an-object\"),s=e(\"../internals/a-possible-prototype\");t.exports=Object.setPrototypeOf||(\"__proto__\"in{}?function(){var e,t=!1,r={};try{(e=n(Object.prototype,\"__proto__\",\"set\"))(r,[]),t=r instanceof Array}catch(e){}return function(r,n){return i(r),s(n),t?e(r,n):r.__proto__=n,r}}():void 0)},{\"../internals/a-possible-prototype\":224,\"../internals/an-object\":227,\"../internals/function-uncurry-this-accessor\":266}],319:[function(e,t,r){\"use strict\";var n=e(\"../internals/descriptors\"),i=e(\"../internals/fails\"),s=e(\"../internals/function-uncurry-this\"),o=e(\"../internals/object-get-prototype-of\"),a=e(\"../internals/object-keys\"),l=e(\"../internals/to-indexed-object\"),c=s(e(\"../internals/object-property-is-enumerable\").f),u=s([].push),h=n&&i((function(){var e=Object.create(null);return e[2]=2,!c(e,2)})),f=function(e){return function(t){for(var r,i=l(t),s=a(i),f=h&&null===o(i),d=s.length,p=0,m=[];d>p;)r=s[p++],n&&!(f?r in i:c(i,r))||u(m,e?[r,i[r]]:i[r]);return m}};t.exports={entries:f(!0),values:f(!1)}},{\"../internals/descriptors\":247,\"../internals/fails\":260,\"../internals/function-uncurry-this\":268,\"../internals/object-get-prototype-of\":313,\"../internals/object-keys\":316,\"../internals/object-property-is-enumerable\":317,\"../internals/to-indexed-object\":341}],320:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-call\"),i=e(\"../internals/is-callable\"),s=e(\"../internals/is-object\"),o=TypeError;t.exports=function(e,t){var r,a;if(\"string\"===t&&i(r=e.toString)&&!s(a=n(r,e)))return a;if(i(r=e.valueOf)&&!s(a=n(r,e)))return a;if(\"string\"!==t&&i(r=e.toString)&&!s(a=n(r,e)))return a;throw new o(\"Can't convert object to primitive value\")}},{\"../internals/function-call\":264,\"../internals/is-callable\":285,\"../internals/is-object\":289}],321:[function(e,t,r){\"use strict\";var n=e(\"../internals/get-built-in\"),i=e(\"../internals/function-uncurry-this\"),s=e(\"../internals/object-get-own-property-names\"),o=e(\"../internals/object-get-own-property-symbols\"),a=e(\"../internals/an-object\"),l=i([].concat);t.exports=n(\"Reflect\",\"ownKeys\")||function(e){var t=s.f(a(e)),r=o.f;return r?l(t,r(e)):t}},{\"../internals/an-object\":227,\"../internals/function-uncurry-this\":268,\"../internals/get-built-in\":269,\"../internals/object-get-own-property-names\":311,\"../internals/object-get-own-property-symbols\":312}],322:[function(e,t,r){\"use strict\";var n=e(\"../internals/global\");t.exports=n},{\"../internals/global\":274}],323:[function(e,t,r){\"use strict\";t.exports=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}}},{}],324:[function(e,t,r){\"use strict\";var n=e(\"../internals/global\"),i=e(\"../internals/promise-native-constructor\"),s=e(\"../internals/is-callable\"),o=e(\"../internals/is-forced\"),a=e(\"../internals/inspect-source\"),l=e(\"../internals/well-known-symbol\"),c=e(\"../internals/engine-is-browser\"),u=e(\"../internals/engine-is-deno\"),h=e(\"../internals/is-pure\"),f=e(\"../internals/engine-v8-version\"),d=i&&i.prototype,p=l(\"species\"),m=!1,b=s(n.PromiseRejectionEvent),g=o(\"Promise\",(function(){var e=a(i),t=e!==String(i);if(!t&&66===f)return!0;if(h&&(!d.catch||!d.finally))return!0;if(!f||f<51||!/native code/.test(e)){var r=new i((function(e){e(1)})),n=function(e){e((function(){}),(function(){}))};if((r.constructor={})[p]=n,!(m=r.then((function(){}))instanceof n))return!0}return!t&&(c||u)&&!b}));t.exports={CONSTRUCTOR:g,REJECTION_EVENT:b,SUBCLASSING:m}},{\"../internals/engine-is-browser\":250,\"../internals/engine-is-deno\":251,\"../internals/engine-v8-version\":257,\"../internals/global\":274,\"../internals/inspect-source\":281,\"../internals/is-callable\":285,\"../internals/is-forced\":287,\"../internals/is-pure\":290,\"../internals/promise-native-constructor\":325,\"../internals/well-known-symbol\":357}],325:[function(e,t,r){\"use strict\";var n=e(\"../internals/global\");t.exports=n.Promise},{\"../internals/global\":274}],326:[function(e,t,r){\"use strict\";var n=e(\"../internals/an-object\"),i=e(\"../internals/is-object\"),s=e(\"../internals/new-promise-capability\");t.exports=function(e,t){if(n(e),i(t)&&t.constructor===e)return t;var r=s.f(e);return(0,r.resolve)(t),r.promise}},{\"../internals/an-object\":227,\"../internals/is-object\":289,\"../internals/new-promise-capability\":303}],327:[function(e,t,r){\"use strict\";var n=e(\"../internals/promise-native-constructor\"),i=e(\"../internals/check-correctness-of-iteration\"),s=e(\"../internals/promise-constructor-detection\").CONSTRUCTOR;t.exports=s||!i((function(e){n.all(e).then(void 0,(function(){}))}))},{\"../internals/check-correctness-of-iteration\":234,\"../internals/promise-constructor-detection\":324,\"../internals/promise-native-constructor\":325}],328:[function(e,t,r){\"use strict\";var n=function(){this.head=null,this.tail=null};n.prototype={add:function(e){var t={item:e,next:null},r=this.tail;r?r.next=t:this.head=t,this.tail=t},get:function(){var e=this.head;if(e)return null===(this.head=e.next)&&(this.tail=null),e.item}},t.exports=n},{}],329:[function(e,t,r){\"use strict\";var n=e(\"../internals/is-null-or-undefined\"),i=TypeError;t.exports=function(e){if(n(e))throw new i(\"Can't call method on \"+e);return e}},{\"../internals/is-null-or-undefined\":288}],330:[function(e,t,r){\"use strict\";var n=e(\"../internals/get-built-in\"),i=e(\"../internals/define-built-in-accessor\"),s=e(\"../internals/well-known-symbol\"),o=e(\"../internals/descriptors\"),a=s(\"species\");t.exports=function(e){var t=n(e);o&&t&&!t[a]&&i(t,a,{configurable:!0,get:function(){return this}})}},{\"../internals/define-built-in-accessor\":244,\"../internals/descriptors\":247,\"../internals/get-built-in\":269,\"../internals/well-known-symbol\":357}],331:[function(e,t,r){\"use strict\";var n=e(\"../internals/object-define-property\").f,i=e(\"../internals/has-own-property\"),s=e(\"../internals/well-known-symbol\")(\"toStringTag\");t.exports=function(e,t,r){e&&!r&&(e=e.prototype),e&&!i(e,s)&&n(e,s,{configurable:!0,value:t})}},{\"../internals/has-own-property\":275,\"../internals/object-define-property\":308,\"../internals/well-known-symbol\":357}],332:[function(e,t,r){\"use strict\";var n=e(\"../internals/shared\"),i=e(\"../internals/uid\"),s=n(\"keys\");t.exports=function(e){return s[e]||(s[e]=i(e))}},{\"../internals/shared\":334,\"../internals/uid\":350}],333:[function(e,t,r){\"use strict\";var n=e(\"../internals/global\"),i=e(\"../internals/define-global-property\"),s=n[\"__core-js_shared__\"]||i(\"__core-js_shared__\",{});t.exports=s},{\"../internals/define-global-property\":246,\"../internals/global\":274}],334:[function(e,t,r){\"use strict\";var n=e(\"../internals/is-pure\"),i=e(\"../internals/shared-store\");(t.exports=function(e,t){return i[e]||(i[e]=void 0!==t?t:{})})(\"versions\",[]).push({version:\"3.33.0\",mode:n?\"pure\":\"global\",copyright:\"\\xa9 2014-2023 Denis Pushkarev (zloirock.ru)\",license:\"https://github.com/zloirock/core-js/blob/v3.33.0/LICENSE\",source:\"https://github.com/zloirock/core-js\"})},{\"../internals/is-pure\":290,\"../internals/shared-store\":333}],335:[function(e,t,r){\"use strict\";var n=e(\"../internals/an-object\"),i=e(\"../internals/a-constructor\"),s=e(\"../internals/is-null-or-undefined\"),o=e(\"../internals/well-known-symbol\")(\"species\");t.exports=function(e,t){var r,a=n(e).constructor;return void 0===a||s(r=n(a)[o])?t:i(r)}},{\"../internals/a-constructor\":223,\"../internals/an-object\":227,\"../internals/is-null-or-undefined\":288,\"../internals/well-known-symbol\":357}],336:[function(e,t,r){\"use strict\";var n=e(\"../internals/engine-v8-version\"),i=e(\"../internals/fails\"),s=e(\"../internals/global\").String;t.exports=!!Object.getOwnPropertySymbols&&!i((function(){var e=Symbol(\"symbol detection\");return!s(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&n&&n<41}))},{\"../internals/engine-v8-version\":257,\"../internals/fails\":260,\"../internals/global\":274}],337:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-call\"),i=e(\"../internals/get-built-in\"),s=e(\"../internals/well-known-symbol\"),o=e(\"../internals/define-built-in\");t.exports=function(){var e=i(\"Symbol\"),t=e&&e.prototype,r=t&&t.valueOf,a=s(\"toPrimitive\");t&&!t[a]&&o(t,a,(function(e){return n(r,this)}),{arity:1})}},{\"../internals/define-built-in\":245,\"../internals/function-call\":264,\"../internals/get-built-in\":269,\"../internals/well-known-symbol\":357}],338:[function(e,t,r){\"use strict\";var n=e(\"../internals/symbol-constructor-detection\");t.exports=n&&!!Symbol.for&&!!Symbol.keyFor},{\"../internals/symbol-constructor-detection\":336}],339:[function(e,t,r){\"use strict\";var n,i,s,o,a=e(\"../internals/global\"),l=e(\"../internals/function-apply\"),c=e(\"../internals/function-bind-context\"),u=e(\"../internals/is-callable\"),h=e(\"../internals/has-own-property\"),f=e(\"../internals/fails\"),d=e(\"../internals/html\"),p=e(\"../internals/array-slice\"),m=e(\"../internals/document-create-element\"),b=e(\"../internals/validate-arguments-length\"),g=e(\"../internals/engine-is-ios\"),y=e(\"../internals/engine-is-node\"),v=a.setImmediate,w=a.clearImmediate,_=a.process,x=a.Dispatch,k=a.Function,S=a.MessageChannel,M=a.String,C=0,T={};f((function(){n=a.location}));var E=function(e){if(h(T,e)){var t=T[e];delete T[e],t()}},A=function(e){return function(){E(e)}},R=function(e){E(e.data)},O=function(e){a.postMessage(M(e),n.protocol+\"//\"+n.host)};v&&w||(v=function(e){b(arguments.length,1);var t=u(e)?e:k(e),r=p(arguments,1);return T[++C]=function(){l(t,void 0,r)},i(C),C},w=function(e){delete T[e]},y?i=function(e){_.nextTick(A(e))}:x&&x.now?i=function(e){x.now(A(e))}:S&&!g?(o=(s=new S).port2,s.port1.onmessage=R,i=c(o.postMessage,o)):a.addEventListener&&u(a.postMessage)&&!a.importScripts&&n&&\"file:\"!==n.protocol&&!f(O)?(i=O,a.addEventListener(\"message\",R,!1)):i=\"onreadystatechange\"in m(\"script\")?function(e){d.appendChild(m(\"script\")).onreadystatechange=function(){d.removeChild(this),E(e)}}:function(e){setTimeout(A(e),0)}),t.exports={set:v,clear:w}},{\"../internals/array-slice\":231,\"../internals/document-create-element\":249,\"../internals/engine-is-ios\":253,\"../internals/engine-is-node\":254,\"../internals/fails\":260,\"../internals/function-apply\":261,\"../internals/function-bind-context\":262,\"../internals/global\":274,\"../internals/has-own-property\":275,\"../internals/html\":278,\"../internals/is-callable\":285,\"../internals/validate-arguments-length\":353}],340:[function(e,t,r){\"use strict\";var n=e(\"../internals/to-integer-or-infinity\"),i=Math.max,s=Math.min;t.exports=function(e,t){var r=n(e);return r<0?i(r+t,0):s(r,t)}},{\"../internals/to-integer-or-infinity\":342}],341:[function(e,t,r){\"use strict\";var n=e(\"../internals/indexed-object\"),i=e(\"../internals/require-object-coercible\");t.exports=function(e){return n(i(e))}},{\"../internals/indexed-object\":280,\"../internals/require-object-coercible\":329}],342:[function(e,t,r){\"use strict\";var n=e(\"../internals/math-trunc\");t.exports=function(e){var t=+e;return t!=t||0===t?0:n(t)}},{\"../internals/math-trunc\":301}],343:[function(e,t,r){\"use strict\";var n=e(\"../internals/to-integer-or-infinity\"),i=Math.min;t.exports=function(e){return e>0?i(n(e),9007199254740991):0}},{\"../internals/to-integer-or-infinity\":342}],344:[function(e,t,r){\"use strict\";var n=e(\"../internals/require-object-coercible\"),i=Object;t.exports=function(e){return i(n(e))}},{\"../internals/require-object-coercible\":329}],345:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-call\"),i=e(\"../internals/is-object\"),s=e(\"../internals/is-symbol\"),o=e(\"../internals/get-method\"),a=e(\"../internals/ordinary-to-primitive\"),l=e(\"../internals/well-known-symbol\"),c=TypeError,u=l(\"toPrimitive\");t.exports=function(e,t){if(!i(e)||s(e))return e;var r,l=o(e,u);if(l){if(void 0===t&&(t=\"default\"),r=n(l,e,t),!i(r)||s(r))return r;throw new c(\"Can't convert object to primitive value\")}return void 0===t&&(t=\"number\"),a(e,t)}},{\"../internals/function-call\":264,\"../internals/get-method\":273,\"../internals/is-object\":289,\"../internals/is-symbol\":292,\"../internals/ordinary-to-primitive\":320,\"../internals/well-known-symbol\":357}],346:[function(e,t,r){\"use strict\";var n=e(\"../internals/to-primitive\"),i=e(\"../internals/is-symbol\");t.exports=function(e){var t=n(e,\"string\");return i(t)?t:t+\"\"}},{\"../internals/is-symbol\":292,\"../internals/to-primitive\":345}],347:[function(e,t,r){\"use strict\";var n={};n[e(\"../internals/well-known-symbol\")(\"toStringTag\")]=\"z\",t.exports=\"[object z]\"===String(n)},{\"../internals/well-known-symbol\":357}],348:[function(e,t,r){\"use strict\";var n=e(\"../internals/classof\"),i=String;t.exports=function(e){if(\"Symbol\"===n(e))throw new TypeError(\"Cannot convert a Symbol value to a string\");return i(e)}},{\"../internals/classof\":236}],349:[function(e,t,r){\"use strict\";var n=String;t.exports=function(e){try{return n(e)}catch(e){return\"Object\"}}},{}],350:[function(e,t,r){\"use strict\";var n=e(\"../internals/function-uncurry-this\"),i=0,s=Math.random(),o=n(1..toString);t.exports=function(e){return\"Symbol(\"+(void 0===e?\"\":e)+\")_\"+o(++i+s,36)}},{\"../internals/function-uncurry-this\":268}],351:[function(e,t,r){\"use strict\";var n=e(\"../internals/symbol-constructor-detection\");t.exports=n&&!Symbol.sham&&\"symbol\"==typeof Symbol.iterator},{\"../internals/symbol-constructor-detection\":336}],352:[function(e,t,r){\"use strict\";var n=e(\"../internals/descriptors\"),i=e(\"../internals/fails\");t.exports=n&&i((function(){return 42!==Object.defineProperty((function(){}),\"prototype\",{value:42,writable:!1}).prototype}))},{\"../internals/descriptors\":247,\"../internals/fails\":260}],353:[function(e,t,r){\"use strict\";var n=TypeError;t.exports=function(e,t){if(e<t)throw new n(\"Not enough arguments\");return e}},{}],354:[function(e,t,r){\"use strict\";var n=e(\"../internals/global\"),i=e(\"../internals/is-callable\"),s=n.WeakMap;t.exports=i(s)&&/native code/.test(String(s))},{\"../internals/global\":274,\"../internals/is-callable\":285}],355:[function(e,t,r){\"use strict\";var n=e(\"../internals/path\"),i=e(\"../internals/has-own-property\"),s=e(\"../internals/well-known-symbol-wrapped\"),o=e(\"../internals/object-define-property\").f;t.exports=function(e){var t=n.Symbol||(n.Symbol={});i(t,e)||o(t,e,{value:s.f(e)})}},{\"../internals/has-own-property\":275,\"../internals/object-define-property\":308,\"../internals/path\":322,\"../internals/well-known-symbol-wrapped\":356}],356:[function(e,t,r){\"use strict\";var n=e(\"../internals/well-known-symbol\");r.f=n},{\"../internals/well-known-symbol\":357}],357:[function(e,t,r){\"use strict\";var n=e(\"../internals/global\"),i=e(\"../internals/shared\"),s=e(\"../internals/has-own-property\"),o=e(\"../internals/uid\"),a=e(\"../internals/symbol-constructor-detection\"),l=e(\"../internals/use-symbol-as-uid\"),c=n.Symbol,u=i(\"wks\"),h=l?c.for||c:c&&c.withoutSetter||o;t.exports=function(e){return s(u,e)||(u[e]=a&&s(c,e)?c[e]:h(\"Symbol.\"+e)),u[e]}},{\"../internals/global\":274,\"../internals/has-own-property\":275,\"../internals/shared\":334,\"../internals/symbol-constructor-detection\":336,\"../internals/uid\":350,\"../internals/use-symbol-as-uid\":351}],358:[function(e,t,r){\"use strict\";var n=e(\"../internals/export\"),i=e(\"../internals/array-iteration\").findIndex,s=e(\"../internals/add-to-unscopables\"),o=!0;\"findIndex\"in[]&&Array(1).findIndex((function(){o=!1})),n({target:\"Array\",proto:!0,forced:o},{findIndex:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}}),s(\"findIndex\")},{\"../internals/add-to-unscopables\":225,\"../internals/array-iteration\":229,\"../internals/export\":259}],359:[function(e,t,r){\"use strict\";var n=e(\"../internals/export\"),i=e(\"../internals/array-iteration\").find,s=e(\"../internals/add-to-unscopables\"),o=!0;\"find\"in[]&&Array(1).find((function(){o=!1})),n({target:\"Array\",proto:!0,forced:o},{find:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}}),s(\"find\")},{\"../internals/add-to-unscopables\":225,\"../internals/array-iteration\":229,\"../internals/export\":259}],360:[function(e,t,r){\"use strict\";var n=e(\"../internals/export\"),i=e(\"../internals/array-includes\").includes,s=e(\"../internals/fails\"),o=e(\"../internals/add-to-unscopables\");n({target:\"Array\",proto:!0,forced:s((function(){return!Array(1).includes()}))},{includes:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}}),o(\"includes\")},{\"../internals/add-to-unscopables\":225,\"../internals/array-includes\":228,\"../internals/export\":259,\"../internals/fails\":260}],361:[function(e,t,r){\"use strict\";var n=e(\"../internals/to-indexed-object\"),i=e(\"../internals/add-to-unscopables\"),s=e(\"../internals/iterators\"),o=e(\"../internals/internal-state\"),a=e(\"../internals/object-define-property\").f,l=e(\"../internals/iterator-define\"),c=e(\"../internals/create-iter-result-object\"),u=e(\"../internals/is-pure\"),h=e(\"../internals/descriptors\"),f=o.set,d=o.getterFor(\"Array Iterator\");t.exports=l(Array,\"Array\",(function(e,t){f(this,{type:\"Array Iterator\",target:n(e),index:0,kind:t})}),(function(){var e=d(this),t=e.target,r=e.kind,n=e.index++;if(!t||n>=t.length)return e.target=void 0,c(void 0,!0);switch(r){case\"keys\":return c(n,!1);case\"values\":return c(t[n],!1)}return c([n,t[n]],!1)}),\"values\");var p=s.Arguments=s.Array;if(i(\"keys\"),i(\"values\"),i(\"entries\"),!u&&h&&\"values\"!==p.name)try{a(p,\"name\",{value:\"values\"})}catch(e){}},{\"../internals/add-to-unscopables\":225,\"../internals/create-iter-result-object\":240,\"../internals/descriptors\":247,\"../internals/internal-state\":282,\"../internals/is-pure\":290,\"../internals/iterator-define\":296,\"../internals/iterators\":298,\"../internals/object-define-property\":308,\"../internals/to-indexed-object\":341}],362:[function(e,t,r){\"use strict\";var n=e(\"../internals/export\"),i=e(\"../internals/get-built-in\"),s=e(\"../internals/function-apply\"),o=e(\"../internals/function-call\"),a=e(\"../internals/function-uncurry-this\"),l=e(\"../internals/fails\"),c=e(\"../internals/is-callable\"),u=e(\"../internals/is-symbol\"),h=e(\"../internals/array-slice\"),f=e(\"../internals/get-json-replacer-function\"),d=e(\"../internals/symbol-constructor-detection\"),p=String,m=i(\"JSON\",\"stringify\"),b=a(/./.exec),g=a(\"\".charAt),y=a(\"\".charCodeAt),v=a(\"\".replace),w=a(1..toString),_=/[\\uD800-\\uDFFF]/g,x=/^[\\uD800-\\uDBFF]$/,k=/^[\\uDC00-\\uDFFF]$/,S=!d||l((function(){var e=i(\"Symbol\")(\"stringify detection\");return\"[null]\"!==m([e])||\"{}\"!==m({a:e})||\"{}\"!==m(Object(e))})),M=l((function(){return'\"\\\\udf06\\\\ud834\"'!==m(\"\\udf06\\ud834\")||'\"\\\\udead\"'!==m(\"\\udead\")})),C=function(e,t){var r=h(arguments),n=f(t);if(c(n)||void 0!==e&&!u(e))return r[1]=function(e,t){if(c(n)&&(t=o(n,this,p(e),t)),!u(t))return t},s(m,null,r)},T=function(e,t,r){var n=g(r,t-1),i=g(r,t+1);return b(x,e)&&!b(k,i)||b(k,e)&&!b(x,n)?\"\\\\u\"+w(y(e,0),16):e};m&&n({target:\"JSON\",stat:!0,arity:3,forced:S||M},{stringify:function(e,t,r){var n=h(arguments),i=s(S?C:m,null,n);return M&&\"string\"==typeof i?v(i,_,T):i}})},{\"../internals/array-slice\":231,\"../internals/export\":259,\"../internals/fails\":260,\"../internals/function-apply\":261,\"../internals/function-call\":264,\"../internals/function-uncurry-this\":268,\"../internals/get-built-in\":269,\"../internals/get-json-replacer-function\":272,\"../internals/is-callable\":285,\"../internals/is-symbol\":292,\"../internals/symbol-constructor-detection\":336}],363:[function(e,t,r){\"use strict\";e(\"../internals/export\")({target:\"Number\",stat:!0},{isNaN:function(e){return e!=e}})},{\"../internals/export\":259}],364:[function(e,t,r){\"use strict\";var n=e(\"../internals/export\"),i=e(\"../internals/object-assign\");n({target:\"Object\",stat:!0,arity:2,forced:Object.assign!==i},{assign:i})},{\"../internals/export\":259,\"../internals/object-assign\":305}],365:[function(e,t,r){\"use strict\";var n=e(\"../internals/export\"),i=e(\"../internals/symbol-constructor-detection\"),s=e(\"../internals/fails\"),o=e(\"../internals/object-get-own-property-symbols\"),a=e(\"../internals/to-object\");n({target:\"Object\",stat:!0,forced:!i||s((function(){o.f(1)}))},{getOwnPropertySymbols:function(e){var t=o.f;return t?t(a(e)):[]}})},{\"../internals/export\":259,\"../internals/fails\":260,\"../internals/object-get-own-property-symbols\":312,\"../internals/symbol-constructor-detection\":336,\"../internals/to-object\":344}],366:[function(e,t,r){\"use strict\";var n=e(\"../internals/export\"),i=e(\"../internals/to-object\"),s=e(\"../internals/object-keys\");n({target:\"Object\",stat:!0,forced:e(\"../internals/fails\")((function(){s(1)}))},{keys:function(e){return s(i(e))}})},{\"../internals/export\":259,\"../internals/fails\":260,\"../internals/object-keys\":316,\"../internals/to-object\":344}],367:[function(e,t,r){\"use strict\";var n=e(\"../internals/export\"),i=e(\"../internals/object-to-array\").values;n({target:\"Object\",stat:!0},{values:function(e){return i(e)}})},{\"../internals/export\":259,\"../internals/object-to-array\":319}],368:[function(e,t,r){\"use strict\";var n=e(\"../internals/export\"),i=e(\"../internals/function-call\"),s=e(\"../internals/a-callable\"),o=e(\"../internals/new-promise-capability\"),a=e(\"../internals/perform\"),l=e(\"../internals/iterate\");n({target:\"Promise\",stat:!0,forced:e(\"../internals/promise-statics-incorrect-iteration\")},{all:function(e){var t=this,r=o.f(t),n=r.resolve,c=r.reject,u=a((function(){var r=s(t.resolve),o=[],a=0,u=1;l(e,(function(e){var s=a++,l=!1;u++,i(r,t,e).then((function(e){l||(l=!0,o[s]=e,--u||n(o))}),c)})),--u||n(o)}));return u.error&&c(u.value),r.promise}})},{\"../internals/a-callable\":222,\"../internals/export\":259,\"../internals/function-call\":264,\"../internals/iterate\":293,\"../internals/new-promise-capability\":303,\"../internals/perform\":323,\"../internals/promise-statics-incorrect-iteration\":327}],369:[function(e,t,r){\"use strict\";var n=e(\"../internals/export\"),i=e(\"../internals/is-pure\"),s=e(\"../internals/promise-constructor-detection\").CONSTRUCTOR,o=e(\"../internals/promise-native-constructor\"),a=e(\"../internals/get-built-in\"),l=e(\"../internals/is-callable\"),c=e(\"../internals/define-built-in\"),u=o&&o.prototype;if(n({target:\"Promise\",proto:!0,forced:s,real:!0},{catch:function(e){return this.then(void 0,e)}}),!i&&l(o)){var h=a(\"Promise\").prototype.catch;u.catch!==h&&c(u,\"catch\",h,{unsafe:!0})}},{\"../internals/define-built-in\":245,\"../internals/export\":259,\"../internals/get-built-in\":269,\"../internals/is-callable\":285,\"../internals/is-pure\":290,\"../internals/promise-constructor-detection\":324,\"../internals/promise-native-constructor\":325}],370:[function(e,t,r){\"use strict\";var n,i,s,o=e(\"../internals/export\"),a=e(\"../internals/is-pure\"),l=e(\"../internals/engine-is-node\"),c=e(\"../internals/global\"),u=e(\"../internals/function-call\"),h=e(\"../internals/define-built-in\"),f=e(\"../internals/object-set-prototype-of\"),d=e(\"../internals/set-to-string-tag\"),p=e(\"../internals/set-species\"),m=e(\"../internals/a-callable\"),b=e(\"../internals/is-callable\"),g=e(\"../internals/is-object\"),y=e(\"../internals/an-instance\"),v=e(\"../internals/species-constructor\"),w=e(\"../internals/task\").set,_=e(\"../internals/microtask\"),x=e(\"../internals/host-report-errors\"),k=e(\"../internals/perform\"),S=e(\"../internals/queue\"),M=e(\"../internals/internal-state\"),C=e(\"../internals/promise-native-constructor\"),T=e(\"../internals/promise-constructor-detection\"),E=e(\"../internals/new-promise-capability\"),A=T.CONSTRUCTOR,R=T.REJECTION_EVENT,O=T.SUBCLASSING,j=M.getterFor(\"Promise\"),I=M.set,N=C&&C.prototype,P=C,B=N,D=c.TypeError,F=c.document,L=c.process,z=E.f,U=z,$=!!(F&&F.createEvent&&c.dispatchEvent),H=function(e){var t;return!(!g(e)||!b(t=e.then))&&t},V=function(e,t){var r,n,i,s=t.value,o=1===t.state,a=o?e.ok:e.fail,l=e.resolve,c=e.reject,h=e.domain;try{a?(o||(2===t.rejection&&Y(t),t.rejection=1),!0===a?r=s:(h&&h.enter(),r=a(s),h&&(h.exit(),i=!0)),r===e.promise?c(new D(\"Promise-chain cycle\")):(n=H(r))?u(n,r,l,c):l(r)):c(s)}catch(e){h&&!i&&h.exit(),c(e)}},q=function(e,t){e.notified||(e.notified=!0,_((function(){for(var r,n=e.reactions;r=n.get();)V(r,e);e.notified=!1,t&&!e.rejection&&X(e)})))},W=function(e,t,r){var n,i;$?((n=F.createEvent(\"Event\")).promise=t,n.reason=r,n.initEvent(e,!1,!0),c.dispatchEvent(n)):n={promise:t,reason:r},!R&&(i=c[\"on\"+e])?i(n):\"unhandledrejection\"===e&&x(\"Unhandled promise rejection\",r)},X=function(e){u(w,c,(function(){var t,r=e.facade,n=e.value;if(K(e)&&(t=k((function(){l?L.emit(\"unhandledRejection\",n,r):W(\"unhandledrejection\",r,n)})),e.rejection=l||K(e)?2:1,t.error))throw t.value}))},K=function(e){return 1!==e.rejection&&!e.parent},Y=function(e){u(w,c,(function(){var t=e.facade;l?L.emit(\"rejectionHandled\",t):W(\"rejectionhandled\",t,e.value)}))},Z=function(e,t,r){return function(n){e(t,n,r)}},G=function(e,t,r){e.done||(e.done=!0,r&&(e=r),e.value=t,e.state=2,q(e,!0))},J=function(e,t,r){if(!e.done){e.done=!0,r&&(e=r);try{if(e.facade===t)throw new D(\"Promise can't be resolved itself\");var n=H(t);n?_((function(){var r={done:!1};try{u(n,t,Z(J,r,e),Z(G,r,e))}catch(t){G(r,t,e)}})):(e.value=t,e.state=1,q(e,!1))}catch(t){G({done:!1},t,e)}}};if(A&&(B=(P=function(e){y(this,B),m(e),u(n,this);var t=j(this);try{e(Z(J,t),Z(G,t))}catch(e){G(t,e)}}).prototype,(n=function(e){I(this,{type:\"Promise\",done:!1,notified:!1,parent:!1,reactions:new S,rejection:!1,state:0,value:void 0})}).prototype=h(B,\"then\",(function(e,t){var r=j(this),n=z(v(this,P));return r.parent=!0,n.ok=!b(e)||e,n.fail=b(t)&&t,n.domain=l?L.domain:void 0,0===r.state?r.reactions.add(n):_((function(){V(n,r)})),n.promise})),i=function(){var e=new n,t=j(e);this.promise=e,this.resolve=Z(J,t),this.reject=Z(G,t)},E.f=z=function(e){return e===P||void 0===e?new i(e):U(e)},!a&&b(C)&&N!==Object.prototype)){s=N.then,O||h(N,\"then\",(function(e,t){var r=this;return new P((function(e,t){u(s,r,e,t)})).then(e,t)}),{unsafe:!0});try{delete N.constructor}catch(e){}f&&f(N,B)}o({global:!0,constructor:!0,wrap:!0,forced:A},{Promise:P}),d(P,\"Promise\",!1,!0),p(\"Promise\")},{\"../internals/a-callable\":222,\"../internals/an-instance\":226,\"../internals/define-built-in\":245,\"../internals/engine-is-node\":254,\"../internals/export\":259,\"../internals/function-call\":264,\"../internals/global\":274,\"../internals/host-report-errors\":277,\"../internals/internal-state\":282,\"../internals/is-callable\":285,\"../internals/is-object\":289,\"../internals/is-pure\":290,\"../internals/microtask\":302,\"../internals/new-promise-capability\":303,\"../internals/object-set-prototype-of\":318,\"../internals/perform\":323,\"../internals/promise-constructor-detection\":324,\"../internals/promise-native-constructor\":325,\"../internals/queue\":328,\"../internals/set-species\":330,\"../internals/set-to-string-tag\":331,\"../internals/species-constructor\":335,\"../internals/task\":339}],371:[function(e,t,r){\"use strict\";var n=e(\"../internals/export\"),i=e(\"../internals/is-pure\"),s=e(\"../internals/promise-native-constructor\"),o=e(\"../internals/fails\"),a=e(\"../internals/get-built-in\"),l=e(\"../internals/is-callable\"),c=e(\"../internals/species-constructor\"),u=e(\"../internals/promise-resolve\"),h=e(\"../internals/define-built-in\"),f=s&&s.prototype;if(n({target:\"Promise\",proto:!0,real:!0,forced:!!s&&o((function(){f.finally.call({then:function(){}},(function(){}))}))},{finally:function(e){var t=c(this,a(\"Promise\")),r=l(e);return this.then(r?function(r){return u(t,e()).then((function(){return r}))}:e,r?function(r){return u(t,e()).then((function(){throw r}))}:e)}}),!i&&l(s)){var d=a(\"Promise\").prototype.finally;f.finally!==d&&h(f,\"finally\",d,{unsafe:!0})}},{\"../internals/define-built-in\":245,\"../internals/export\":259,\"../internals/fails\":260,\"../internals/get-built-in\":269,\"../internals/is-callable\":285,\"../internals/is-pure\":290,\"../internals/promise-native-constructor\":325,\"../internals/promise-resolve\":326,\"../internals/species-constructor\":335}],372:[function(e,t,r){\"use strict\";e(\"../modules/es.promise.constructor\"),e(\"../modules/es.promise.all\"),e(\"../modules/es.promise.catch\"),e(\"../modules/es.promise.race\"),e(\"../modules/es.promise.reject\"),e(\"../modules/es.promise.resolve\")},{\"../modules/es.promise.all\":368,\"../modules/es.promise.catch\":369,\"../modules/es.promise.constructor\":370,\"../modules/es.promise.race\":373,\"../modules/es.promise.reject\":374,\"../modules/es.promise.resolve\":375}],373:[function(e,t,r){\"use strict\";var n=e(\"../internals/export\"),i=e(\"../internals/function-call\"),s=e(\"../internals/a-callable\"),o=e(\"../internals/new-promise-capability\"),a=e(\"../internals/perform\"),l=e(\"../internals/iterate\");n({target:\"Promise\",stat:!0,forced:e(\"../internals/promise-statics-incorrect-iteration\")},{race:function(e){var t=this,r=o.f(t),n=r.reject,c=a((function(){var o=s(t.resolve);l(e,(function(e){i(o,t,e).then(r.resolve,n)}))}));return c.error&&n(c.value),r.promise}})},{\"../internals/a-callable\":222,\"../internals/export\":259,\"../internals/function-call\":264,\"../internals/iterate\":293,\"../internals/new-promise-capability\":303,\"../internals/perform\":323,\"../internals/promise-statics-incorrect-iteration\":327}],374:[function(e,t,r){\"use strict\";var n=e(\"../internals/export\"),i=e(\"../internals/function-call\"),s=e(\"../internals/new-promise-capability\");n({target:\"Promise\",stat:!0,forced:e(\"../internals/promise-constructor-detection\").CONSTRUCTOR},{reject:function(e){var t=s.f(this);return i(t.reject,void 0,e),t.promise}})},{\"../internals/export\":259,\"../internals/function-call\":264,\"../internals/new-promise-capability\":303,\"../internals/promise-constructor-detection\":324}],375:[function(e,t,r){\"use strict\";var n=e(\"../internals/export\"),i=e(\"../internals/get-built-in\"),s=e(\"../internals/is-pure\"),o=e(\"../internals/promise-native-constructor\"),a=e(\"../internals/promise-constructor-detection\").CONSTRUCTOR,l=e(\"../internals/promise-resolve\"),c=i(\"Promise\"),u=s&&!a;n({target:\"Promise\",stat:!0,forced:s||a},{resolve:function(e){return l(u&&this===c?o:this,e)}})},{\"../internals/export\":259,\"../internals/get-built-in\":269,\"../internals/is-pure\":290,\"../internals/promise-constructor-detection\":324,\"../internals/promise-native-constructor\":325,\"../internals/promise-resolve\":326}],376:[function(e,t,r){\"use strict\";var n=e(\"../internals/export\"),i=e(\"../internals/function-uncurry-this\"),s=e(\"../internals/to-absolute-index\"),o=RangeError,a=String.fromCharCode,l=String.fromCodePoint,c=i([].join);n({target:\"String\",stat:!0,arity:1,forced:!!l&&1!==l.length},{fromCodePoint:function(e){for(var t,r=[],n=arguments.length,i=0;n>i;){if(t=+arguments[i++],s(t,1114111)!==t)throw new o(t+\" is not a valid code point\");r[i]=t<65536?a(t):a(55296+((t-=65536)>>10),t%1024+56320)}return c(r,\"\")}})},{\"../internals/export\":259,\"../internals/function-uncurry-this\":268,\"../internals/to-absolute-index\":340}],377:[function(e,t,r){\"use strict\";var n=e(\"../internals/export\"),i=e(\"../internals/function-uncurry-this\"),s=e(\"../internals/not-a-regexp\"),o=e(\"../internals/require-object-coercible\"),a=e(\"../internals/to-string\"),l=e(\"../internals/correct-is-regexp-logic\"),c=i(\"\".indexOf);n({target:\"String\",proto:!0,forced:!l(\"includes\")},{includes:function(e){return!!~c(a(o(this)),a(s(e)),arguments.length>1?arguments[1]:void 0)}})},{\"../internals/correct-is-regexp-logic\":238,\"../internals/export\":259,\"../internals/function-uncurry-this\":268,\"../internals/not-a-regexp\":304,\"../internals/require-object-coercible\":329,\"../internals/to-string\":348}],378:[function(e,t,r){\"use strict\";e(\"../internals/well-known-symbol-define\")(\"asyncIterator\")},{\"../internals/well-known-symbol-define\":355}],379:[function(e,t,r){\"use strict\";var n=e(\"../internals/export\"),i=e(\"../internals/global\"),s=e(\"../internals/function-call\"),o=e(\"../internals/function-uncurry-this\"),a=e(\"../internals/is-pure\"),l=e(\"../internals/descriptors\"),c=e(\"../internals/symbol-constructor-detection\"),u=e(\"../internals/fails\"),h=e(\"../internals/has-own-property\"),f=e(\"../internals/object-is-prototype-of\"),d=e(\"../internals/an-object\"),p=e(\"../internals/to-indexed-object\"),m=e(\"../internals/to-property-key\"),b=e(\"../internals/to-string\"),g=e(\"../internals/create-property-descriptor\"),y=e(\"../internals/object-create\"),v=e(\"../internals/object-keys\"),w=e(\"../internals/object-get-own-property-names\"),_=e(\"../internals/object-get-own-property-names-external\"),x=e(\"../internals/object-get-own-property-symbols\"),k=e(\"../internals/object-get-own-property-descriptor\"),S=e(\"../internals/object-define-property\"),M=e(\"../internals/object-define-properties\"),C=e(\"../internals/object-property-is-enumerable\"),T=e(\"../internals/define-built-in\"),E=e(\"../internals/define-built-in-accessor\"),A=e(\"../internals/shared\"),R=e(\"../internals/shared-key\"),O=e(\"../internals/hidden-keys\"),j=e(\"../internals/uid\"),I=e(\"../internals/well-known-symbol\"),N=e(\"../internals/well-known-symbol-wrapped\"),P=e(\"../internals/well-known-symbol-define\"),B=e(\"../internals/symbol-define-to-primitive\"),D=e(\"../internals/set-to-string-tag\"),F=e(\"../internals/internal-state\"),L=e(\"../internals/array-iteration\").forEach,z=R(\"hidden\"),U=F.set,$=F.getterFor(\"Symbol\"),H=Object.prototype,V=i.Symbol,q=V&&V.prototype,W=i.RangeError,X=i.TypeError,K=i.QObject,Y=k.f,Z=S.f,G=_.f,J=C.f,Q=o([].push),ee=A(\"symbols\"),te=A(\"op-symbols\"),re=A(\"wks\"),ne=!K||!K.prototype||!K.prototype.findChild,ie=function(e,t,r){var n=Y(H,t);n&&delete H[t],Z(e,t,r),n&&e!==H&&Z(H,t,n)},se=l&&u((function(){return 7!==y(Z({},\"a\",{get:function(){return Z(this,\"a\",{value:7}).a}})).a}))?ie:Z,oe=function(e,t){var r=ee[e]=y(q);return U(r,{type:\"Symbol\",tag:e,description:t}),l||(r.description=t),r},ae=function(e,t,r){e===H&&ae(te,t,r),d(e);var n=m(t);return d(r),h(ee,n)?(r.enumerable?(h(e,z)&&e[z][n]&&(e[z][n]=!1),r=y(r,{enumerable:g(0,!1)})):(h(e,z)||Z(e,z,g(1,{})),e[z][n]=!0),se(e,n,r)):Z(e,n,r)},le=function(e,t){d(e);var r=p(t),n=v(r).concat(fe(r));return L(n,(function(t){l&&!s(ce,r,t)||ae(e,t,r[t])})),e},ce=function(e){var t=m(e),r=s(J,this,t);return!(this===H&&h(ee,t)&&!h(te,t))&&(!(r||!h(this,t)||!h(ee,t)||h(this,z)&&this[z][t])||r)},ue=function(e,t){var r=p(e),n=m(t);if(r!==H||!h(ee,n)||h(te,n)){var i=Y(r,n);return!i||!h(ee,n)||h(r,z)&&r[z][n]||(i.enumerable=!0),i}},he=function(e){var t=G(p(e)),r=[];return L(t,(function(e){h(ee,e)||h(O,e)||Q(r,e)})),r},fe=function(e){var t=e===H,r=G(t?te:p(e)),n=[];return L(r,(function(e){!h(ee,e)||t&&!h(H,e)||Q(n,ee[e])})),n};c||(T(q=(V=function(){if(f(q,this))throw new X(\"Symbol is not a constructor\");var e=arguments.length&&void 0!==arguments[0]?b(arguments[0]):void 0,t=j(e),r=function(e){this===H&&s(r,te,e),h(this,z)&&h(this[z],t)&&(this[z][t]=!1);var n=g(1,e);try{se(this,t,n)}catch(e){if(!(e instanceof W))throw e;ie(this,t,n)}};return l&&ne&&se(H,t,{configurable:!0,set:r}),oe(t,e)}).prototype,\"toString\",(function(){return $(this).tag})),T(V,\"withoutSetter\",(function(e){return oe(j(e),e)})),C.f=ce,S.f=ae,M.f=le,k.f=ue,w.f=_.f=he,x.f=fe,N.f=function(e){return oe(I(e),e)},l&&(E(q,\"description\",{configurable:!0,get:function(){return $(this).description}}),a||T(H,\"propertyIsEnumerable\",ce,{unsafe:!0}))),n({global:!0,constructor:!0,wrap:!0,forced:!c,sham:!c},{Symbol:V}),L(v(re),(function(e){P(e)})),n({target:\"Symbol\",stat:!0,forced:!c},{useSetter:function(){ne=!0},useSimple:function(){ne=!1}}),n({target:\"Object\",stat:!0,forced:!c,sham:!l},{create:function(e,t){return void 0===t?y(e):le(y(e),t)},defineProperty:ae,defineProperties:le,getOwnPropertyDescriptor:ue}),n({target:\"Object\",stat:!0,forced:!c},{getOwnPropertyNames:he}),B(),D(V,\"Symbol\"),O[z]=!0},{\"../internals/an-object\":227,\"../internals/array-iteration\":229,\"../internals/create-property-descriptor\":242,\"../internals/define-built-in\":245,\"../internals/define-built-in-accessor\":244,\"../internals/descriptors\":247,\"../internals/export\":259,\"../internals/fails\":260,\"../internals/function-call\":264,\"../internals/function-uncurry-this\":268,\"../internals/global\":274,\"../internals/has-own-property\":275,\"../internals/hidden-keys\":276,\"../internals/internal-state\":282,\"../internals/is-pure\":290,\"../internals/object-create\":306,\"../internals/object-define-properties\":307,\"../internals/object-define-property\":308,\"../internals/object-get-own-property-descriptor\":309,\"../internals/object-get-own-property-names\":311,\"../internals/object-get-own-property-names-external\":310,\"../internals/object-get-own-property-symbols\":312,\"../internals/object-is-prototype-of\":314,\"../internals/object-keys\":316,\"../internals/object-property-is-enumerable\":317,\"../internals/set-to-string-tag\":331,\"../internals/shared\":334,\"../internals/shared-key\":332,\"../internals/symbol-constructor-detection\":336,\"../internals/symbol-define-to-primitive\":337,\"../internals/to-indexed-object\":341,\"../internals/to-property-key\":346,\"../internals/to-string\":348,\"../internals/uid\":350,\"../internals/well-known-symbol\":357,\"../internals/well-known-symbol-define\":355,\"../internals/well-known-symbol-wrapped\":356}],380:[function(e,t,r){\"use strict\";var n=e(\"../internals/export\"),i=e(\"../internals/get-built-in\"),s=e(\"../internals/has-own-property\"),o=e(\"../internals/to-string\"),a=e(\"../internals/shared\"),l=e(\"../internals/symbol-registry-detection\"),c=a(\"string-to-symbol-registry\"),u=a(\"symbol-to-string-registry\");n({target:\"Symbol\",stat:!0,forced:!l},{for:function(e){var t=o(e);if(s(c,t))return c[t];var r=i(\"Symbol\")(t);return c[t]=r,u[r]=t,r}})},{\"../internals/export\":259,\"../internals/get-built-in\":269,\"../internals/has-own-property\":275,\"../internals/shared\":334,\"../internals/symbol-registry-detection\":338,\"../internals/to-string\":348}],381:[function(e,t,r){\"use strict\";e(\"../modules/es.symbol.constructor\"),e(\"../modules/es.symbol.for\"),e(\"../modules/es.symbol.key-for\"),e(\"../modules/es.json.stringify\"),e(\"../modules/es.object.get-own-property-symbols\")},{\"../modules/es.json.stringify\":362,\"../modules/es.object.get-own-property-symbols\":365,\"../modules/es.symbol.constructor\":379,\"../modules/es.symbol.for\":380,\"../modules/es.symbol.key-for\":382}],382:[function(e,t,r){\"use strict\";var n=e(\"../internals/export\"),i=e(\"../internals/has-own-property\"),s=e(\"../internals/is-symbol\"),o=e(\"../internals/try-to-string\"),a=e(\"../internals/shared\"),l=e(\"../internals/symbol-registry-detection\"),c=a(\"symbol-to-string-registry\");n({target:\"Symbol\",stat:!0,forced:!l},{keyFor:function(e){if(!s(e))throw new TypeError(o(e)+\" is not a symbol\");if(i(c,e))return c[e]}})},{\"../internals/export\":259,\"../internals/has-own-property\":275,\"../internals/is-symbol\":292,\"../internals/shared\":334,\"../internals/symbol-registry-detection\":338,\"../internals/try-to-string\":349}],383:[function(e,t,r){\"use strict\";function n(e){return Object.prototype.toString.call(e)}r.isArray=function(e){return Array.isArray?Array.isArray(e):\"[object Array]\"===n(e)},r.isBoolean=function(e){return\"boolean\"==typeof e},r.isNull=function(e){return null===e},r.isNullOrUndefined=function(e){return null==e},r.isNumber=function(e){return\"number\"==typeof e},r.isString=function(e){return\"string\"==typeof e},r.isSymbol=function(e){return\"symbol\"==typeof e},r.isUndefined=function(e){return void 0===e},r.isRegExp=function(e){return\"[object RegExp]\"===n(e)},r.isObject=function(e){return\"object\"==typeof e&&null!==e},r.isDate=function(e){return\"[object Date]\"===n(e)},r.isError=function(e){return\"[object Error]\"===n(e)||e instanceof Error},r.isFunction=function(e){return\"function\"==typeof e},r.isPrimitive=function(e){return null===e||\"boolean\"==typeof e||\"number\"==typeof e||\"string\"==typeof e||\"symbol\"==typeof e||void 0===e},r.isBuffer=e(\"buffer\").Buffer.isBuffer},{buffer:220}],384:[function(e,t,r){(function(r){(function(){\"use strict\";var n=e(\"elliptic\"),i=e(\"bn.js\");t.exports=function(e){return new o(e)};var s={secp256k1:{name:\"secp256k1\",byteLength:32},secp224r1:{name:\"p224\",byteLength:28},prime256v1:{name:\"p256\",byteLength:32},prime192v1:{name:\"p192\",byteLength:24},ed25519:{name:\"ed25519\",byteLength:32},secp384r1:{name:\"p384\",byteLength:48},secp521r1:{name:\"p521\",byteLength:66}};function o(e){this.curveType=s[e],this.curveType||(this.curveType={name:e}),this.curve=new n.ec(this.curveType.name),this.keys=void 0}function a(e,t,n){Array.isArray(e)||(e=e.toArray());var i=new r(e);if(n&&i.length<n){var s=new r(n-i.length);s.fill(0),i=r.concat([s,i])}return t?i.toString(t):i}s.p224=s.secp224r1,s.p256=s.secp256r1=s.prime256v1,s.p192=s.secp192r1=s.prime192v1,s.p384=s.secp384r1,s.p521=s.secp521r1,o.prototype.generateKeys=function(e,t){return this.keys=this.curve.genKeyPair(),this.getPublicKey(e,t)},o.prototype.computeSecret=function(e,t,n){return t=t||\"utf8\",r.isBuffer(e)||(e=new r(e,t)),a(this.curve.keyFromPublic(e).getPublic().mul(this.keys.getPrivate()).getX(),n,this.curveType.byteLength)},o.prototype.getPublicKey=function(e,t){var r=this.keys.getPublic(\"compressed\"===t,!0);return\"hybrid\"===t&&(r[r.length-1]%2?r[0]=7:r[0]=6),a(r,e)},o.prototype.getPrivateKey=function(e){return a(this.keys.getPrivate(),e)},o.prototype.setPublicKey=function(e,t){return t=t||\"utf8\",r.isBuffer(e)||(e=new r(e,t)),this.keys._importPublic(e),this},o.prototype.setPrivateKey=function(e,t){t=t||\"utf8\",r.isBuffer(e)||(e=new r(e,t));var n=new i(e);return n=n.toString(16),this.keys=this.curve.genKeyPair(),this.keys._importPrivate(n),this}}).call(this)}).call(this,e(\"buffer\").Buffer)},{\"bn.js\":385,buffer:220,elliptic:405}],385:[function(e,t,r){arguments[4][184][0].apply(r,arguments)},{buffer:188,dup:184}],386:[function(e,t,r){\"use strict\";var n=e(\"inherits\"),i=e(\"md5.js\"),s=e(\"ripemd160\"),o=e(\"sha.js\"),a=e(\"cipher-base\");function l(e){a.call(this,\"digest\"),this._hash=e}n(l,a),l.prototype._update=function(e){this._hash.update(e)},l.prototype._final=function(){return this._hash.digest()},t.exports=function(e){return\"md5\"===(e=e.toLowerCase())?new i:\"rmd160\"===e||\"ripemd160\"===e?new s:new l(o(e))}},{\"cipher-base\":221,inherits:440,\"md5.js\":450,ripemd160:493,\"sha.js\":498}],387:[function(e,t,r){\"use strict\";var n=e(\"md5.js\");t.exports=function(e){return(new n).update(e).digest()}},{\"md5.js\":450}],388:[function(e,t,r){\"use strict\";var n=e(\"inherits\"),i=e(\"./legacy\"),s=e(\"cipher-base\"),o=e(\"safe-buffer\").Buffer,a=e(\"create-hash/md5\"),l=e(\"ripemd160\"),c=e(\"sha.js\"),u=o.alloc(128);function h(e,t){s.call(this,\"digest\"),\"string\"==typeof t&&(t=o.from(t));var r=\"sha512\"===e||\"sha384\"===e?128:64;(this._alg=e,this._key=t,t.length>r)?t=(\"rmd160\"===e?new l:c(e)).update(t).digest():t.length<r&&(t=o.concat([t,u],r));for(var n=this._ipad=o.allocUnsafe(r),i=this._opad=o.allocUnsafe(r),a=0;a<r;a++)n[a]=54^t[a],i[a]=92^t[a];this._hash=\"rmd160\"===e?new l:c(e),this._hash.update(n)}n(h,s),h.prototype._update=function(e){this._hash.update(e)},h.prototype._final=function(){var e=this._hash.digest();return(\"rmd160\"===this._alg?new l:c(this._alg)).update(this._opad).update(e).digest()},t.exports=function(e,t){return\"rmd160\"===(e=e.toLowerCase())||\"ripemd160\"===e?new h(\"rmd160\",t):\"md5\"===e?new i(a,t):new h(e,t)}},{\"./legacy\":389,\"cipher-base\":221,\"create-hash/md5\":387,inherits:440,ripemd160:493,\"safe-buffer\":494,\"sha.js\":498}],389:[function(e,t,r){\"use strict\";var n=e(\"inherits\"),i=e(\"safe-buffer\").Buffer,s=e(\"cipher-base\"),o=i.alloc(128);function a(e,t){s.call(this,\"digest\"),\"string\"==typeof t&&(t=i.from(t)),this._alg=e,this._key=t,t.length>64?t=e(t):t.length<64&&(t=i.concat([t,o],64));for(var r=this._ipad=i.allocUnsafe(64),n=this._opad=i.allocUnsafe(64),a=0;a<64;a++)r[a]=54^t[a],n[a]=92^t[a];this._hash=[r]}n(a,s),a.prototype._update=function(e){this._hash.push(e)},a.prototype._final=function(){var e=this._alg(i.concat(this._hash));return this._alg(i.concat([this._opad,e]))},t.exports=a},{\"cipher-base\":221,inherits:440,\"safe-buffer\":494}],390:[function(e,t,r){\"use strict\";r.randomBytes=r.rng=r.pseudoRandomBytes=r.prng=e(\"randombytes\"),r.createHash=r.Hash=e(\"create-hash\"),r.createHmac=r.Hmac=e(\"create-hmac\");var n=e(\"browserify-sign/algos\"),i=Object.keys(n),s=[\"sha1\",\"sha224\",\"sha256\",\"sha384\",\"sha512\",\"md5\",\"rmd160\"].concat(i);r.getHashes=function(){return s};var o=e(\"pbkdf2\");r.pbkdf2=o.pbkdf2,r.pbkdf2Sync=o.pbkdf2Sync;var a=e(\"browserify-cipher\");r.Cipher=a.Cipher,r.createCipher=a.createCipher,r.Cipheriv=a.Cipheriv,r.createCipheriv=a.createCipheriv,r.Decipher=a.Decipher,r.createDecipher=a.createDecipher,r.Decipheriv=a.Decipheriv,r.createDecipheriv=a.createDecipheriv,r.getCiphers=a.getCiphers,r.listCiphers=a.listCiphers;var l=e(\"diffie-hellman\");r.DiffieHellmanGroup=l.DiffieHellmanGroup,r.createDiffieHellmanGroup=l.createDiffieHellmanGroup,r.getDiffieHellman=l.getDiffieHellman,r.createDiffieHellman=l.createDiffieHellman,r.DiffieHellman=l.DiffieHellman;var c=e(\"browserify-sign\");r.createSign=c.createSign,r.Sign=c.Sign,r.createVerify=c.createVerify,r.Verify=c.Verify,r.createECDH=e(\"create-ecdh\");var u=e(\"public-encrypt\");r.publicEncrypt=u.publicEncrypt,r.privateEncrypt=u.privateEncrypt,r.publicDecrypt=u.publicDecrypt,r.privateDecrypt=u.privateDecrypt;var h=e(\"randomfill\");r.randomFill=h.randomFill,r.randomFillSync=h.randomFillSync,r.createCredentials=function(){throw new Error([\"sorry, createCredentials is not implemented yet\",\"we accept pull requests\",\"https://github.com/crypto-browserify/crypto-browserify\"].join(\"\\n\"))},r.constants={DH_CHECK_P_NOT_SAFE_PRIME:2,DH_CHECK_P_NOT_PRIME:1,DH_UNABLE_TO_CHECK_GENERATOR:4,DH_NOT_SUITABLE_GENERATOR:8,NPN_ENABLED:1,ALPN_ENABLED:1,RSA_PKCS1_PADDING:1,RSA_SSLV23_PADDING:2,RSA_NO_PADDING:3,RSA_PKCS1_OAEP_PADDING:4,RSA_X931_PADDING:5,RSA_PKCS1_PSS_PADDING:6,POINT_CONVERSION_COMPRESSED:2,POINT_CONVERSION_UNCOMPRESSED:4,POINT_CONVERSION_HYBRID:6}},{\"browserify-cipher\":206,\"browserify-sign\":213,\"browserify-sign/algos\":210,\"create-ecdh\":384,\"create-hash\":386,\"create-hmac\":388,\"diffie-hellman\":400,pbkdf2:460,\"public-encrypt\":468,randombytes:475,randomfill:476}],391:[function(e,t,r){\"use strict\";!function(e,n){\"object\"==typeof r&&void 0!==t?t.exports=n():(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs=n()}(void 0,(function(){var e=6e4,t=36e5,r=\"millisecond\",n=\"second\",i=\"minute\",s=\"hour\",o=\"day\",a=\"week\",l=\"month\",c=\"quarter\",u=\"year\",h=\"date\",f=\"Invalid Date\",d=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,p=/\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,m={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(e){var t=[\"th\",\"st\",\"nd\",\"rd\"],r=e%100;return\"[\"+e+(t[(r-20)%10]||t[r]||t[0])+\"]\"}},b=function(e,t,r){var n=String(e);return!n||n.length>=t?e:\"\"+Array(t+1-n.length).join(r)+e},g={s:b,z:function(e){var t=-e.utcOffset(),r=Math.abs(t),n=Math.floor(r/60),i=r%60;return(t<=0?\"+\":\"-\")+b(n,2,\"0\")+\":\"+b(i,2,\"0\")},m:function e(t,r){if(t.date()<r.date())return-e(r,t);var n=12*(r.year()-t.year())+(r.month()-t.month()),i=t.clone().add(n,l),s=r-i<0,o=t.clone().add(n+(s?-1:1),l);return+(-(n+(r-i)/(s?i-o:o-i))||0)},a:function(e){return e<0?Math.ceil(e)||0:Math.floor(e)},p:function(e){return{M:l,y:u,w:a,d:o,D:h,h:s,m:i,s:n,ms:r,Q:c}[e]||String(e||\"\").toLowerCase().replace(/s$/,\"\")},u:function(e){return void 0===e}},y=\"en\",v={};v[y]=m;var w=\"$isDayjsObject\",_=function(e){return e instanceof M||!(!e||!e[w])},x=function e(t,r,n){var i;if(!t)return y;if(\"string\"==typeof t){var s=t.toLowerCase();v[s]&&(i=s),r&&(v[s]=r,i=s);var o=t.split(\"-\");if(!i&&o.length>1)return e(o[0])}else{var a=t.name;v[a]=t,i=a}return!n&&i&&(y=i),i||!n&&y},k=function(e,t){if(_(e))return e.clone();var r=\"object\"==typeof t?t:{};return r.date=e,r.args=arguments,new M(r)},S=g;S.l=x,S.i=_,S.w=function(e,t){return k(e,{locale:t.$L,utc:t.$u,x:t.$x,$offset:t.$offset})};var M=function(){function m(e){this.$L=x(e.locale,null,!0),this.parse(e),this.$x=this.$x||e.x||{},this[w]=!0}var b=m.prototype;return b.parse=function(e){this.$d=function(e){var t=e.date,r=e.utc;if(null===t)return new Date(NaN);if(S.u(t))return new Date;if(t instanceof Date)return new Date(t);if(\"string\"==typeof t&&!/Z$/i.test(t)){var n=t.match(d);if(n){var i=n[2]-1||0,s=(n[7]||\"0\").substring(0,3);return r?new Date(Date.UTC(n[1],i,n[3]||1,n[4]||0,n[5]||0,n[6]||0,s)):new Date(n[1],i,n[3]||1,n[4]||0,n[5]||0,n[6]||0,s)}}return new Date(t)}(e),this.init()},b.init=function(){var e=this.$d;this.$y=e.getFullYear(),this.$M=e.getMonth(),this.$D=e.getDate(),this.$W=e.getDay(),this.$H=e.getHours(),this.$m=e.getMinutes(),this.$s=e.getSeconds(),this.$ms=e.getMilliseconds()},b.$utils=function(){return S},b.isValid=function(){return!(this.$d.toString()===f)},b.isSame=function(e,t){var r=k(e);return this.startOf(t)<=r&&r<=this.endOf(t)},b.isAfter=function(e,t){return k(e)<this.startOf(t)},b.isBefore=function(e,t){return this.endOf(t)<k(e)},b.$g=function(e,t,r){return S.u(e)?this[t]:this.set(r,e)},b.unix=function(){return Math.floor(this.valueOf()/1e3)},b.valueOf=function(){return this.$d.getTime()},b.startOf=function(e,t){var r=this,c=!!S.u(t)||t,f=S.p(e),d=function(e,t){var n=S.w(r.$u?Date.UTC(r.$y,t,e):new Date(r.$y,t,e),r);return c?n:n.endOf(o)},p=function(e,t){return S.w(r.toDate()[e].apply(r.toDate(\"s\"),(c?[0,0,0,0]:[23,59,59,999]).slice(t)),r)},m=this.$W,b=this.$M,g=this.$D,y=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case u:return c?d(1,0):d(31,11);case l:return c?d(1,b):d(0,b+1);case a:var v=this.$locale().weekStart||0,w=(m<v?m+7:m)-v;return d(c?g-w:g+(6-w),b);case o:case h:return p(y+\"Hours\",0);case s:return p(y+\"Minutes\",1);case i:return p(y+\"Seconds\",2);case n:return p(y+\"Milliseconds\",3);default:return this.clone()}},b.endOf=function(e){return this.startOf(e,!1)},b.$set=function(e,t){var a,c=S.p(e),f=\"set\"+(this.$u?\"UTC\":\"\"),d=(a={},a[o]=f+\"Date\",a[h]=f+\"Date\",a[l]=f+\"Month\",a[u]=f+\"FullYear\",a[s]=f+\"Hours\",a[i]=f+\"Minutes\",a[n]=f+\"Seconds\",a[r]=f+\"Milliseconds\",a)[c],p=c===o?this.$D+(t-this.$W):t;if(c===l||c===u){var m=this.clone().set(h,1);m.$d[d](p),m.init(),this.$d=m.set(h,Math.min(this.$D,m.daysInMonth())).$d}else d&&this.$d[d](p);return this.init(),this},b.set=function(e,t){return this.clone().$set(e,t)},b.get=function(e){return this[S.p(e)]()},b.add=function(r,c){var h,f=this;r=Number(r);var d=S.p(c),p=function(e){var t=k(f);return S.w(t.date(t.date()+Math.round(e*r)),f)};if(d===l)return this.set(l,this.$M+r);if(d===u)return this.set(u,this.$y+r);if(d===o)return p(1);if(d===a)return p(7);var m=(h={},h[i]=e,h[s]=t,h[n]=1e3,h)[d]||1,b=this.$d.getTime()+r*m;return S.w(b,this)},b.subtract=function(e,t){return this.add(-1*e,t)},b.format=function(e){var t=this,r=this.$locale();if(!this.isValid())return r.invalidDate||f;var n=e||\"YYYY-MM-DDTHH:mm:ssZ\",i=S.z(this),s=this.$H,o=this.$m,a=this.$M,l=r.weekdays,c=r.months,u=r.meridiem,h=function(e,r,i,s){return e&&(e[r]||e(t,n))||i[r].slice(0,s)},d=function(e){return S.s(s%12||12,e,\"0\")},m=u||function(e,t,r){var n=e<12?\"AM\":\"PM\";return r?n.toLowerCase():n};return n.replace(p,(function(e,n){return n||function(e){switch(e){case\"YY\":return String(t.$y).slice(-2);case\"YYYY\":return S.s(t.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return S.s(a+1,2,\"0\");case\"MMM\":return h(r.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return t.$D;case\"DD\":return S.s(t.$D,2,\"0\");case\"d\":return String(t.$W);case\"dd\":return h(r.weekdaysMin,t.$W,l,2);case\"ddd\":return h(r.weekdaysShort,t.$W,l,3);case\"dddd\":return l[t.$W];case\"H\":return String(s);case\"HH\":return S.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return m(s,o,!0);case\"A\":return m(s,o,!1);case\"m\":return String(o);case\"mm\":return S.s(o,2,\"0\");case\"s\":return String(t.$s);case\"ss\":return S.s(t.$s,2,\"0\");case\"SSS\":return S.s(t.$ms,3,\"0\");case\"Z\":return i}return null}(e)||i.replace(\":\",\"\")}))},b.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},b.diff=function(r,h,f){var d,p=this,m=S.p(h),b=k(r),g=(b.utcOffset()-this.utcOffset())*e,y=this-b,v=function(){return S.m(p,b)};switch(m){case u:d=v()/12;break;case l:d=v();break;case c:d=v()/3;break;case a:d=(y-g)/6048e5;break;case o:d=(y-g)/864e5;break;case s:d=y/t;break;case i:d=y/e;break;case n:d=y/1e3;break;default:d=y}return f?d:S.a(d)},b.daysInMonth=function(){return this.endOf(l).$D},b.$locale=function(){return v[this.$L]},b.locale=function(e,t){if(!e)return this.$L;var r=this.clone(),n=x(e,t,!0);return n&&(r.$L=n),r},b.clone=function(){return S.w(this.$d,this)},b.toDate=function(){return new Date(this.valueOf())},b.toJSON=function(){return this.isValid()?this.toISOString():null},b.toISOString=function(){return this.$d.toISOString()},b.toString=function(){return this.$d.toUTCString()},m}(),C=M.prototype;return k.prototype=C,[[\"$ms\",r],[\"$s\",n],[\"$m\",i],[\"$H\",s],[\"$W\",o],[\"$M\",l],[\"$y\",u],[\"$D\",h]].forEach((function(e){C[e[1]]=function(t){return this.$g(t,e[0],e[1])}})),k.extend=function(e,t){return e.$i||(e(t,M,k),e.$i=!0),k},k.locale=x,k.isDayjs=_,k.unix=function(e){return k(1e3*e)},k.en=v[y],k.Ls=v,k.p={},k}))},{}],392:[function(e,t,r){\"use strict\";!function(e,n){\"object\"==typeof r&&void 0!==t?t.exports=n():(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_customParseFormat=n()}(void 0,(function(){var e={LTS:\"h:mm:ss A\",LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY h:mm A\",LLLL:\"dddd, MMMM D, YYYY h:mm A\"},t=/(\\[[^[]*\\])|([-_:/.,()\\s]+)|(A|a|YYYY|YY?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,r=/\\d\\d/,n=/\\d\\d?/,i=/\\d*[^-_:/,()\\s\\d]+/,s={},o=function(e){return(e=+e)+(e>68?1900:2e3)},a=function(e){return function(t){this[e]=+t}},l=[/[+-]\\d\\d:?(\\d\\d)?|Z/,function(e){(this.zone||(this.zone={})).offset=function(e){if(!e)return 0;if(\"Z\"===e)return 0;var t=e.match(/([+-]|\\d\\d)/g),r=60*t[1]+(+t[2]||0);return 0===r?0:\"+\"===t[0]?-r:r}(e)}],c=function(e){var t=s[e];return t&&(t.indexOf?t:t.s.concat(t.f))},u=function(e,t){var r,n=s.meridiem;if(n){for(var i=1;i<=24;i+=1)if(e.indexOf(n(i,0,t))>-1){r=i>12;break}}else r=e===(t?\"pm\":\"PM\");return r},h={A:[i,function(e){this.afternoon=u(e,!1)}],a:[i,function(e){this.afternoon=u(e,!0)}],S:[/\\d/,function(e){this.milliseconds=100*+e}],SS:[r,function(e){this.milliseconds=10*+e}],SSS:[/\\d{3}/,function(e){this.milliseconds=+e}],s:[n,a(\"seconds\")],ss:[n,a(\"seconds\")],m:[n,a(\"minutes\")],mm:[n,a(\"minutes\")],H:[n,a(\"hours\")],h:[n,a(\"hours\")],HH:[n,a(\"hours\")],hh:[n,a(\"hours\")],D:[n,a(\"day\")],DD:[r,a(\"day\")],Do:[i,function(e){var t=s.ordinal,r=e.match(/\\d+/);if(this.day=r[0],t)for(var n=1;n<=31;n+=1)t(n).replace(/\\[|\\]/g,\"\")===e&&(this.day=n)}],M:[n,a(\"month\")],MM:[r,a(\"month\")],MMM:[i,function(e){var t=c(\"months\"),r=(c(\"monthsShort\")||t.map((function(e){return e.slice(0,3)}))).indexOf(e)+1;if(r<1)throw new Error;this.month=r%12||r}],MMMM:[i,function(e){var t=c(\"months\").indexOf(e)+1;if(t<1)throw new Error;this.month=t%12||t}],Y:[/[+-]?\\d+/,a(\"year\")],YY:[r,function(e){this.year=o(e)}],YYYY:[/\\d{4}/,a(\"year\")],Z:l,ZZ:l};function f(r){var n,i;n=r,i=s&&s.formats;for(var o=(r=n.replace(/(\\[[^\\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(t,r,n){var s=n&&n.toUpperCase();return r||i[n]||e[n]||i[s].replace(/(\\[[^\\]]+])|(MMMM|MM|DD|dddd)/g,(function(e,t,r){return t||r.slice(1)}))}))).match(t),a=o.length,l=0;l<a;l+=1){var c=o[l],u=h[c],f=u&&u[0],d=u&&u[1];o[l]=d?{regex:f,parser:d}:c.replace(/^\\[|\\]$/g,\"\")}return function(e){for(var t={},r=0,n=0;r<a;r+=1){var i=o[r];if(\"string\"==typeof i)n+=i.length;else{var s=i.regex,l=i.parser,c=e.slice(n),u=s.exec(c)[0];l.call(t,u),e=e.replace(u,\"\")}}return function(e){var t=e.afternoon;if(void 0!==t){var r=e.hours;t?r<12&&(e.hours+=12):12===r&&(e.hours=0),delete e.afternoon}}(t),t}}return function(e,t,r){r.p.customParseFormat=!0,e&&e.parseTwoDigitYear&&(o=e.parseTwoDigitYear);var n=t.prototype,i=n.parse;n.parse=function(e){var t=e.date,n=e.utc,o=e.args;this.$u=n;var a=o[1];if(\"string\"==typeof a){var l=!0===o[2],c=!0===o[3],u=l||c,h=o[2];c&&(h=o[2]),s=this.$locale(),!l&&h&&(s=r.Ls[h]),this.$d=function(e,t,r){try{if([\"x\",\"X\"].indexOf(t)>-1)return new Date((\"X\"===t?1e3:1)*e);var n=f(t)(e),i=n.year,s=n.month,o=n.day,a=n.hours,l=n.minutes,c=n.seconds,u=n.milliseconds,h=n.zone,d=new Date,p=o||(i||s?1:d.getDate()),m=i||d.getFullYear(),b=0;i&&!s||(b=s>0?s-1:d.getMonth());var g=a||0,y=l||0,v=c||0,w=u||0;return h?new Date(Date.UTC(m,b,p,g,y,v,w+60*h.offset*1e3)):r?new Date(Date.UTC(m,b,p,g,y,v,w)):new Date(m,b,p,g,y,v,w)}catch(e){return new Date(\"\")}}(t,a,n),this.init(),h&&!0!==h&&(this.$L=this.locale(h).$L),u&&t!=this.format(a)&&(this.$d=new Date(\"\")),s={}}else if(a instanceof Array)for(var d=a.length,p=1;p<=d;p+=1){o[1]=a[p-1];var m=r.apply(this,o);if(m.isValid()){this.$d=m.$d,this.$L=m.$L,this.init();break}p===d&&(this.$d=new Date(\"\"))}else i.call(this,e)}}}))},{}],393:[function(e,t,r){\"use strict\";!function(e,n){\"object\"==typeof r&&void 0!==t?t.exports=n():(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_utc=n()}(void 0,(function(){var e=\"minute\",t=/[+-]\\d\\d(?::?\\d\\d)?/g,r=/([+-]|\\d\\d)/g;return function(n,i,s){var o=i.prototype;s.utc=function(e){var t={date:e,utc:!0,args:arguments};return new i(t)},o.utc=function(t){var r=s(this.toDate(),{locale:this.$L,utc:!0});return t?r.add(this.utcOffset(),e):r},o.local=function(){return s(this.toDate(),{locale:this.$L,utc:!1})};var a=o.parse;o.parse=function(e){e.utc&&(this.$u=!0),this.$utils().u(e.$offset)||(this.$offset=e.$offset),a.call(this,e)};var l=o.init;o.init=function(){if(this.$u){var e=this.$d;this.$y=e.getUTCFullYear(),this.$M=e.getUTCMonth(),this.$D=e.getUTCDate(),this.$W=e.getUTCDay(),this.$H=e.getUTCHours(),this.$m=e.getUTCMinutes(),this.$s=e.getUTCSeconds(),this.$ms=e.getUTCMilliseconds()}else l.call(this)};var c=o.utcOffset;o.utcOffset=function(n,i){var s=this.$utils().u;if(s(n))return this.$u?0:s(this.$offset)?c.call(this):this.$offset;if(\"string\"==typeof n&&null===(n=function(e){void 0===e&&(e=\"\");var n=e.match(t);if(!n)return null;var i=(\"\"+n[0]).match(r)||[\"-\",0,0],s=i[0],o=60*+i[1]+ +i[2];return 0===o?0:\"+\"===s?o:-o}(n)))return this;var o=Math.abs(n)<=16?60*n:n,a=this;if(i)return a.$offset=o,a.$u=0===n,a;if(0!==n){var l=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();(a=this.local().add(o+l,e)).$offset=o,a.$x.$localOffset=l}else a=this.utc();return a};var u=o.format;o.format=function(e){var t=e||(this.$u?\"YYYY-MM-DDTHH:mm:ss[Z]\":\"\");return u.call(this,t)},o.valueOf=function(){var e=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*e},o.isUTC=function(){return!!this.$u},o.toISOString=function(){return this.toDate().toISOString()},o.toString=function(){return this.toDate().toUTCString()};var h=o.toDate;o.toDate=function(e){return\"s\"===e&&this.$offset?s(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\")).toDate():h.call(this)};var f=o.diff;o.diff=function(e,t,r){if(e&&this.$u===e.$u)return f.call(this,e,t,r);var n=this.local(),i=s(e).local();return f.call(n,i,t,r)}}}))},{}],394:[function(e,t,r){\"use strict\";r.utils=e(\"./des/utils\"),r.Cipher=e(\"./des/cipher\"),r.DES=e(\"./des/des\"),r.CBC=e(\"./des/cbc\"),r.EDE=e(\"./des/ede\")},{\"./des/cbc\":395,\"./des/cipher\":396,\"./des/des\":397,\"./des/ede\":398,\"./des/utils\":399}],395:[function(e,t,r){\"use strict\";var n=e(\"minimalistic-assert\"),i=e(\"inherits\"),s={};function o(e){n.equal(e.length,8,\"Invalid IV length\"),this.iv=new Array(8);for(var t=0;t<this.iv.length;t++)this.iv[t]=e[t]}r.instantiate=function(e){function t(t){e.call(this,t),this._cbcInit()}i(t,e);for(var r=Object.keys(s),n=0;n<r.length;n++){var o=r[n];t.prototype[o]=s[o]}return t.create=function(e){return new t(e)},t},s._cbcInit=function(){var e=new o(this.options.iv);this._cbcState=e},s._update=function(e,t,r,n){var i=this._cbcState,s=this.constructor.super_.prototype,o=i.iv;if(\"encrypt\"===this.type){for(var a=0;a<this.blockSize;a++)o[a]^=e[t+a];s._update.call(this,o,0,r,n);for(a=0;a<this.blockSize;a++)o[a]=r[n+a]}else{s._update.call(this,e,t,r,n);for(a=0;a<this.blockSize;a++)r[n+a]^=o[a];for(a=0;a<this.blockSize;a++)o[a]=e[t+a]}}},{inherits:440,\"minimalistic-assert\":453}],396:[function(e,t,r){\"use strict\";var n=e(\"minimalistic-assert\");function i(e){this.options=e,this.type=this.options.type,this.blockSize=8,this._init(),this.buffer=new Array(this.blockSize),this.bufferOff=0,this.padding=!1!==e.padding}t.exports=i,i.prototype._init=function(){},i.prototype.update=function(e){return 0===e.length?[]:\"decrypt\"===this.type?this._updateDecrypt(e):this._updateEncrypt(e)},i.prototype._buffer=function(e,t){for(var r=Math.min(this.buffer.length-this.bufferOff,e.length-t),n=0;n<r;n++)this.buffer[this.bufferOff+n]=e[t+n];return this.bufferOff+=r,r},i.prototype._flushBuffer=function(e,t){return this._update(this.buffer,0,e,t),this.bufferOff=0,this.blockSize},i.prototype._updateEncrypt=function(e){var t=0,r=0,n=(this.bufferOff+e.length)/this.blockSize|0,i=new Array(n*this.blockSize);0!==this.bufferOff&&(t+=this._buffer(e,t),this.bufferOff===this.buffer.length&&(r+=this._flushBuffer(i,r)));for(var s=e.length-(e.length-t)%this.blockSize;t<s;t+=this.blockSize)this._update(e,t,i,r),r+=this.blockSize;for(;t<e.length;t++,this.bufferOff++)this.buffer[this.bufferOff]=e[t];return i},i.prototype._updateDecrypt=function(e){for(var t=0,r=0,n=Math.ceil((this.bufferOff+e.length)/this.blockSize)-1,i=new Array(n*this.blockSize);n>0;n--)t+=this._buffer(e,t),r+=this._flushBuffer(i,r);return t+=this._buffer(e,t),i},i.prototype.final=function(e){var t,r;return e&&(t=this.update(e)),r=\"encrypt\"===this.type?this._finalEncrypt():this._finalDecrypt(),t?t.concat(r):r},i.prototype._pad=function(e,t){if(0===t)return!1;for(;t<e.length;)e[t++]=0;return!0},i.prototype._finalEncrypt=function(){if(!this._pad(this.buffer,this.bufferOff))return[];var e=new Array(this.blockSize);return this._update(this.buffer,0,e,0),e},i.prototype._unpad=function(e){return e},i.prototype._finalDecrypt=function(){n.equal(this.bufferOff,this.blockSize,\"Not enough data to decrypt\");var e=new Array(this.blockSize);return this._flushBuffer(e,0),this._unpad(e)}},{\"minimalistic-assert\":453}],397:[function(e,t,r){\"use strict\";var n=e(\"minimalistic-assert\"),i=e(\"inherits\"),s=e(\"./utils\"),o=e(\"./cipher\");function a(){this.tmp=new Array(2),this.keys=null}function l(e){o.call(this,e);var t=new a;this._desState=t,this.deriveKeys(t,e.key)}i(l,o),t.exports=l,l.create=function(e){return new l(e)};var c=[1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1];l.prototype.deriveKeys=function(e,t){e.keys=new Array(32),n.equal(t.length,this.blockSize,\"Invalid key length\");var r=s.readUInt32BE(t,0),i=s.readUInt32BE(t,4);s.pc1(r,i,e.tmp,0),r=e.tmp[0],i=e.tmp[1];for(var o=0;o<e.keys.length;o+=2){var a=c[o>>>1];r=s.r28shl(r,a),i=s.r28shl(i,a),s.pc2(r,i,e.keys,o)}},l.prototype._update=function(e,t,r,n){var i=this._desState,o=s.readUInt32BE(e,t),a=s.readUInt32BE(e,t+4);s.ip(o,a,i.tmp,0),o=i.tmp[0],a=i.tmp[1],\"encrypt\"===this.type?this._encrypt(i,o,a,i.tmp,0):this._decrypt(i,o,a,i.tmp,0),o=i.tmp[0],a=i.tmp[1],s.writeUInt32BE(r,o,n),s.writeUInt32BE(r,a,n+4)},l.prototype._pad=function(e,t){if(!1===this.padding)return!1;for(var r=e.length-t,n=t;n<e.length;n++)e[n]=r;return!0},l.prototype._unpad=function(e){if(!1===this.padding)return e;for(var t=e[e.length-1],r=e.length-t;r<e.length;r++)n.equal(e[r],t);return e.slice(0,e.length-t)},l.prototype._encrypt=function(e,t,r,n,i){for(var o=t,a=r,l=0;l<e.keys.length;l+=2){var c=e.keys[l],u=e.keys[l+1];s.expand(a,e.tmp,0),c^=e.tmp[0],u^=e.tmp[1];var h=s.substitute(c,u),f=a;a=(o^s.permute(h))>>>0,o=f}s.rip(a,o,n,i)},l.prototype._decrypt=function(e,t,r,n,i){for(var o=r,a=t,l=e.keys.length-2;l>=0;l-=2){var c=e.keys[l],u=e.keys[l+1];s.expand(o,e.tmp,0),c^=e.tmp[0],u^=e.tmp[1];var h=s.substitute(c,u),f=o;o=(a^s.permute(h))>>>0,a=f}s.rip(o,a,n,i)}},{\"./cipher\":396,\"./utils\":399,inherits:440,\"minimalistic-assert\":453}],398:[function(e,t,r){\"use strict\";var n=e(\"minimalistic-assert\"),i=e(\"inherits\"),s=e(\"./cipher\"),o=e(\"./des\");function a(e,t){n.equal(t.length,24,\"Invalid key length\");var r=t.slice(0,8),i=t.slice(8,16),s=t.slice(16,24);this.ciphers=\"encrypt\"===e?[o.create({type:\"encrypt\",key:r}),o.create({type:\"decrypt\",key:i}),o.create({type:\"encrypt\",key:s})]:[o.create({type:\"decrypt\",key:s}),o.create({type:\"encrypt\",key:i}),o.create({type:\"decrypt\",key:r})]}function l(e){s.call(this,e);var t=new a(this.type,this.options.key);this._edeState=t}i(l,s),t.exports=l,l.create=function(e){return new l(e)},l.prototype._update=function(e,t,r,n){var i=this._edeState;i.ciphers[0]._update(e,t,r,n),i.ciphers[1]._update(r,n,r,n),i.ciphers[2]._update(r,n,r,n)},l.prototype._pad=o.prototype._pad,l.prototype._unpad=o.prototype._unpad},{\"./cipher\":396,\"./des\":397,inherits:440,\"minimalistic-assert\":453}],399:[function(e,t,r){\"use strict\";r.readUInt32BE=function(e,t){return(e[0+t]<<24|e[1+t]<<16|e[2+t]<<8|e[3+t])>>>0},r.writeUInt32BE=function(e,t,r){e[0+r]=t>>>24,e[1+r]=t>>>16&255,e[2+r]=t>>>8&255,e[3+r]=255&t},r.ip=function(e,t,r,n){for(var i=0,s=0,o=6;o>=0;o-=2){for(var a=0;a<=24;a+=8)i<<=1,i|=t>>>a+o&1;for(a=0;a<=24;a+=8)i<<=1,i|=e>>>a+o&1}for(o=6;o>=0;o-=2){for(a=1;a<=25;a+=8)s<<=1,s|=t>>>a+o&1;for(a=1;a<=25;a+=8)s<<=1,s|=e>>>a+o&1}r[n+0]=i>>>0,r[n+1]=s>>>0},r.rip=function(e,t,r,n){for(var i=0,s=0,o=0;o<4;o++)for(var a=24;a>=0;a-=8)i<<=1,i|=t>>>a+o&1,i<<=1,i|=e>>>a+o&1;for(o=4;o<8;o++)for(a=24;a>=0;a-=8)s<<=1,s|=t>>>a+o&1,s<<=1,s|=e>>>a+o&1;r[n+0]=i>>>0,r[n+1]=s>>>0},r.pc1=function(e,t,r,n){for(var i=0,s=0,o=7;o>=5;o--){for(var a=0;a<=24;a+=8)i<<=1,i|=t>>a+o&1;for(a=0;a<=24;a+=8)i<<=1,i|=e>>a+o&1}for(a=0;a<=24;a+=8)i<<=1,i|=t>>a+o&1;for(o=1;o<=3;o++){for(a=0;a<=24;a+=8)s<<=1,s|=t>>a+o&1;for(a=0;a<=24;a+=8)s<<=1,s|=e>>a+o&1}for(a=0;a<=24;a+=8)s<<=1,s|=e>>a+o&1;r[n+0]=i>>>0,r[n+1]=s>>>0},r.r28shl=function(e,t){return e<<t&268435455|e>>>28-t};var n=[14,11,17,4,27,23,25,0,13,22,7,18,5,9,16,24,2,20,12,21,1,8,15,26,15,4,25,19,9,1,26,16,5,11,23,8,12,7,17,0,22,3,10,14,6,20,27,24];r.pc2=function(e,t,r,i){for(var s=0,o=0,a=n.length>>>1,l=0;l<a;l++)s<<=1,s|=e>>>n[l]&1;for(l=a;l<n.length;l++)o<<=1,o|=t>>>n[l]&1;r[i+0]=s>>>0,r[i+1]=o>>>0},r.expand=function(e,t,r){var n=0,i=0;n=(1&e)<<5|e>>>27;for(var s=23;s>=15;s-=4)n<<=6,n|=e>>>s&63;for(s=11;s>=3;s-=4)i|=e>>>s&63,i<<=6;i|=(31&e)<<1|e>>>31,t[r+0]=n>>>0,t[r+1]=i>>>0};var i=[14,0,4,15,13,7,1,4,2,14,15,2,11,13,8,1,3,10,10,6,6,12,12,11,5,9,9,5,0,3,7,8,4,15,1,12,14,8,8,2,13,4,6,9,2,1,11,7,15,5,12,11,9,3,7,14,3,10,10,0,5,6,0,13,15,3,1,13,8,4,14,7,6,15,11,2,3,8,4,14,9,12,7,0,2,1,13,10,12,6,0,9,5,11,10,5,0,13,14,8,7,10,11,1,10,3,4,15,13,4,1,2,5,11,8,6,12,7,6,12,9,0,3,5,2,14,15,9,10,13,0,7,9,0,14,9,6,3,3,4,15,6,5,10,1,2,13,8,12,5,7,14,11,12,4,11,2,15,8,1,13,1,6,10,4,13,9,0,8,6,15,9,3,8,0,7,11,4,1,15,2,14,12,3,5,11,10,5,14,2,7,12,7,13,13,8,14,11,3,5,0,6,6,15,9,0,10,3,1,4,2,7,8,2,5,12,11,1,12,10,4,14,15,9,10,3,6,15,9,0,0,6,12,10,11,1,7,13,13,8,15,9,1,4,3,5,14,11,5,12,2,7,8,2,4,14,2,14,12,11,4,2,1,12,7,4,10,7,11,13,6,1,8,5,5,0,3,15,15,10,13,3,0,9,14,8,9,6,4,11,2,8,1,12,11,7,10,1,13,14,7,2,8,13,15,6,9,15,12,0,5,9,6,10,3,4,0,5,14,3,12,10,1,15,10,4,15,2,9,7,2,12,6,9,8,5,0,6,13,1,3,13,4,14,14,0,7,11,5,3,11,8,9,4,14,3,15,2,5,12,2,9,8,5,12,15,3,10,7,11,0,14,4,1,10,7,1,6,13,0,11,8,6,13,4,13,11,0,2,11,14,7,15,4,0,9,8,1,13,10,3,14,12,3,9,5,7,12,5,2,10,15,6,8,1,6,1,6,4,11,11,13,13,8,12,1,3,4,7,10,14,7,10,9,15,5,6,0,8,15,0,14,5,2,9,3,2,12,13,1,2,15,8,13,4,8,6,10,15,3,11,7,1,4,10,12,9,5,3,6,14,11,5,0,0,14,12,9,7,2,7,2,11,1,4,14,1,7,9,4,12,10,14,8,2,13,0,15,6,12,10,9,13,0,15,3,3,5,5,6,8,11];r.substitute=function(e,t){for(var r=0,n=0;n<4;n++){r<<=4,r|=i[64*n+(e>>>18-6*n&63)]}for(n=0;n<4;n++){r<<=4,r|=i[256+64*n+(t>>>18-6*n&63)]}return r>>>0};var s=[16,25,12,11,3,20,4,15,31,17,9,6,27,14,1,22,30,24,8,18,0,5,29,23,13,19,2,26,10,21,28,7];r.permute=function(e){for(var t=0,r=0;r<s.length;r++)t<<=1,t|=e>>>s[r]&1;return t>>>0},r.padSplit=function(e,t,r){for(var n=e.toString(2);n.length<t;)n=\"0\"+n;for(var i=[],s=0;s<t;s+=r)i.push(n.slice(s,s+r));return i.join(\" \")}},{}],400:[function(e,t,r){(function(t){(function(){\"use strict\";var n=e(\"./lib/generatePrime\"),i=e(\"./lib/primes.json\"),s=e(\"./lib/dh\");var o={binary:!0,hex:!0,base64:!0};r.DiffieHellmanGroup=r.createDiffieHellmanGroup=r.getDiffieHellman=function(e){var r=new t(i[e].prime,\"hex\"),n=new t(i[e].gen,\"hex\");return new s(r,n)},r.createDiffieHellman=r.DiffieHellman=function e(r,i,a,l){return t.isBuffer(i)||void 0===o[i]?e(r,\"binary\",i,a):(i=i||\"binary\",l=l||\"binary\",a=a||new t([2]),t.isBuffer(a)||(a=new t(a,l)),\"number\"==typeof r?new s(n(r,a),a,!0):(t.isBuffer(r)||(r=new t(r,i)),new s(r,a,!0)))}}).call(this)}).call(this,e(\"buffer\").Buffer)},{\"./lib/dh\":401,\"./lib/generatePrime\":402,\"./lib/primes.json\":403,buffer:220}],401:[function(e,t,r){(function(r){(function(){\"use strict\";var n=e(\"bn.js\"),i=new(e(\"miller-rabin\")),s=new n(24),o=new n(11),a=new n(10),l=new n(3),c=new n(7),u=e(\"./generatePrime\"),h=e(\"randombytes\");function f(e,t){return t=t||\"utf8\",r.isBuffer(e)||(e=new r(e,t)),this._pub=new n(e),this}function d(e,t){return t=t||\"utf8\",r.isBuffer(e)||(e=new r(e,t)),this._priv=new n(e),this}t.exports=m;var p={};function m(e,t,r){this.setGenerator(t),this.__prime=new n(e),this._prime=n.mont(this.__prime),this._primeLen=e.length,this._pub=void 0,this._priv=void 0,this._primeCode=void 0,r?(this.setPublicKey=f,this.setPrivateKey=d):this._primeCode=8}function b(e,t){var n=new r(e.toArray());return t?n.toString(t):n}Object.defineProperty(m.prototype,\"verifyError\",{enumerable:!0,get:function(){return\"number\"!=typeof this._primeCode&&(this._primeCode=function(e,t){var r=t.toString(\"hex\"),n=[r,e.toString(16)].join(\"_\");if(n in p)return p[n];var h,f=0;if(e.isEven()||!u.simpleSieve||!u.fermatTest(e)||!i.test(e))return f+=1,f+=\"02\"===r||\"05\"===r?8:4,p[n]=f,f;switch(i.test(e.shrn(1))||(f+=2),r){case\"02\":e.mod(s).cmp(o)&&(f+=8);break;case\"05\":(h=e.mod(a)).cmp(l)&&h.cmp(c)&&(f+=8);break;default:f+=4}return p[n]=f,f}(this.__prime,this.__gen)),this._primeCode}}),m.prototype.generateKeys=function(){return this._priv||(this._priv=new n(h(this._primeLen))),this._pub=this._gen.toRed(this._prime).redPow(this._priv).fromRed(),this.getPublicKey()},m.prototype.computeSecret=function(e){var t=(e=(e=new n(e)).toRed(this._prime)).redPow(this._priv).fromRed(),i=new r(t.toArray()),s=this.getPrime();if(i.length<s.length){var o=new r(s.length-i.length);o.fill(0),i=r.concat([o,i])}return i},m.prototype.getPublicKey=function(e){return b(this._pub,e)},m.prototype.getPrivateKey=function(e){return b(this._priv,e)},m.prototype.getPrime=function(e){return b(this.__prime,e)},m.prototype.getGenerator=function(e){return b(this._gen,e)},m.prototype.setGenerator=function(e,t){return t=t||\"utf8\",r.isBuffer(e)||(e=new r(e,t)),this.__gen=e,this._gen=new n(e),this}}).call(this)}).call(this,e(\"buffer\").Buffer)},{\"./generatePrime\":402,\"bn.js\":404,buffer:220,\"miller-rabin\":451,randombytes:475}],402:[function(e,t,r){\"use strict\";var n=e(\"randombytes\");t.exports=y,y.simpleSieve=b,y.fermatTest=g;var i=e(\"bn.js\"),s=new i(24),o=new(e(\"miller-rabin\")),a=new i(1),l=new i(2),c=new i(5),u=(new i(16),new i(8),new i(10)),h=new i(3),f=(new i(7),new i(11)),d=new i(4),p=(new i(12),null);function m(){if(null!==p)return p;var e=[];e[0]=2;for(var t=1,r=3;r<1048576;r+=2){for(var n=Math.ceil(Math.sqrt(r)),i=0;i<t&&e[i]<=n&&r%e[i]!=0;i++);t!==i&&e[i]<=n||(e[t++]=r)}return p=e,e}function b(e){for(var t=m(),r=0;r<t.length;r++)if(0===e.modn(t[r]))return 0===e.cmpn(t[r]);return!0}function g(e){var t=i.mont(e);return 0===l.toRed(t).redPow(e.subn(1)).fromRed().cmpn(1)}function y(e,t){if(e<16)return new i(2===t||5===t?[140,123]:[140,39]);var r,p;for(t=new i(t);;){for(r=new i(n(Math.ceil(e/8)));r.bitLength()>e;)r.ishrn(1);if(r.isEven()&&r.iadd(a),r.testn(1)||r.iadd(l),t.cmp(l)){if(!t.cmp(c))for(;r.mod(u).cmp(h);)r.iadd(d)}else for(;r.mod(s).cmp(f);)r.iadd(d);if(b(p=r.shrn(1))&&b(r)&&g(p)&&g(r)&&o.test(p)&&o.test(r))return r}}},{\"bn.js\":404,\"miller-rabin\":451,randombytes:475}],403:[function(e,t,r){t.exports={modp1:{gen:\"02\",prime:\"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a63a3620ffffffffffffffff\"},modp2:{gen:\"02\",prime:\"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece65381ffffffffffffffff\"},modp5:{gen:\"02\",prime:\"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff\"},modp14:{gen:\"02\",prime:\"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff\"},modp15:{gen:\"02\",prime:\"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a93ad2caffffffffffffffff\"},modp16:{gen:\"02\",prime:\"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199ffffffffffffffff\"},modp17:{gen:\"02\",prime:\"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffff\"},modp18:{gen:\"02\",prime:\"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dbe115974a3926f12fee5e438777cb6a932df8cd8bec4d073b931ba3bc832b68d9dd300741fa7bf8afc47ed2576f6936ba424663aab639c5ae4f5683423b4742bf1c978238f16cbe39d652de3fdb8befc848ad922222e04a4037c0713eb57a81a23f0c73473fc646cea306b4bcbc8862f8385ddfa9d4b7fa2c087e879683303ed5bdd3a062b3cf5b3a278a66d2a13f83f44f82ddf310ee074ab6a364597e899a0255dc164f31cc50846851df9ab48195ded7ea1b1d510bd7ee74d73faf36bc31ecfa268359046f4eb879f924009438b481c6cd7889a002ed5ee382bc9190da6fc026e479558e4475677e9aa9e3050e2765694dfc81f56e880b96e7160c980dd98edd3dfffffffffffffffff\"}}},{}],404:[function(e,t,r){arguments[4][184][0].apply(r,arguments)},{buffer:188,dup:184}],405:[function(e,t,r){\"use strict\";var n=r;n.version=e(\"../package.json\").version,n.utils=e(\"./elliptic/utils\"),n.rand=e(\"brorand\"),n.curve=e(\"./elliptic/curve\"),n.curves=e(\"./elliptic/curves\"),n.ec=e(\"./elliptic/ec\"),n.eddsa=e(\"./elliptic/eddsa\")},{\"../package.json\":421,\"./elliptic/curve\":408,\"./elliptic/curves\":411,\"./elliptic/ec\":412,\"./elliptic/eddsa\":415,\"./elliptic/utils\":419,brorand:187}],406:[function(e,t,r){\"use strict\";var n=e(\"bn.js\"),i=e(\"../utils\"),s=i.getNAF,o=i.getJSF,a=i.assert;function l(e,t){this.type=e,this.p=new n(t.p,16),this.red=t.prime?n.red(t.prime):n.mont(this.p),this.zero=new n(0).toRed(this.red),this.one=new n(1).toRed(this.red),this.two=new n(2).toRed(this.red),this.n=t.n&&new n(t.n,16),this.g=t.g&&this.pointFromJSON(t.g,t.gRed),this._wnafT1=new Array(4),this._wnafT2=new Array(4),this._wnafT3=new Array(4),this._wnafT4=new Array(4),this._bitLength=this.n?this.n.bitLength():0;var r=this.n&&this.p.div(this.n);!r||r.cmpn(100)>0?this.redN=null:(this._maxwellTrick=!0,this.redN=this.n.toRed(this.red))}function c(e,t){this.curve=e,this.type=t,this.precomputed=null}t.exports=l,l.prototype.point=function(){throw new Error(\"Not implemented\")},l.prototype.validate=function(){throw new Error(\"Not implemented\")},l.prototype._fixedNafMul=function(e,t){a(e.precomputed);var r=e._getDoubles(),n=s(t,1,this._bitLength),i=(1<<r.step+1)-(r.step%2==0?2:1);i/=3;var o,l,c=[];for(o=0;o<n.length;o+=r.step){l=0;for(var u=o+r.step-1;u>=o;u--)l=(l<<1)+n[u];c.push(l)}for(var h=this.jpoint(null,null,null),f=this.jpoint(null,null,null),d=i;d>0;d--){for(o=0;o<c.length;o++)(l=c[o])===d?f=f.mixedAdd(r.points[o]):l===-d&&(f=f.mixedAdd(r.points[o].neg()));h=h.add(f)}return h.toP()},l.prototype._wnafMul=function(e,t){var r=4,n=e._getNAFPoints(r);r=n.wnd;for(var i=n.points,o=s(t,r,this._bitLength),l=this.jpoint(null,null,null),c=o.length-1;c>=0;c--){for(var u=0;c>=0&&0===o[c];c--)u++;if(c>=0&&u++,l=l.dblp(u),c<0)break;var h=o[c];a(0!==h),l=\"affine\"===e.type?h>0?l.mixedAdd(i[h-1>>1]):l.mixedAdd(i[-h-1>>1].neg()):h>0?l.add(i[h-1>>1]):l.add(i[-h-1>>1].neg())}return\"affine\"===e.type?l.toP():l},l.prototype._wnafMulAdd=function(e,t,r,n,i){var a,l,c,u=this._wnafT1,h=this._wnafT2,f=this._wnafT3,d=0;for(a=0;a<n;a++){var p=(c=t[a])._getNAFPoints(e);u[a]=p.wnd,h[a]=p.points}for(a=n-1;a>=1;a-=2){var m=a-1,b=a;if(1===u[m]&&1===u[b]){var g=[t[m],null,null,t[b]];0===t[m].y.cmp(t[b].y)?(g[1]=t[m].add(t[b]),g[2]=t[m].toJ().mixedAdd(t[b].neg())):0===t[m].y.cmp(t[b].y.redNeg())?(g[1]=t[m].toJ().mixedAdd(t[b]),g[2]=t[m].add(t[b].neg())):(g[1]=t[m].toJ().mixedAdd(t[b]),g[2]=t[m].toJ().mixedAdd(t[b].neg()));var y=[-3,-1,-5,-7,0,7,5,1,3],v=o(r[m],r[b]);for(d=Math.max(v[0].length,d),f[m]=new Array(d),f[b]=new Array(d),l=0;l<d;l++){var w=0|v[0][l],_=0|v[1][l];f[m][l]=y[3*(w+1)+(_+1)],f[b][l]=0,h[m]=g}}else f[m]=s(r[m],u[m],this._bitLength),f[b]=s(r[b],u[b],this._bitLength),d=Math.max(f[m].length,d),d=Math.max(f[b].length,d)}var x=this.jpoint(null,null,null),k=this._wnafT4;for(a=d;a>=0;a--){for(var S=0;a>=0;){var M=!0;for(l=0;l<n;l++)k[l]=0|f[l][a],0!==k[l]&&(M=!1);if(!M)break;S++,a--}if(a>=0&&S++,x=x.dblp(S),a<0)break;for(l=0;l<n;l++){var C=k[l];0!==C&&(C>0?c=h[l][C-1>>1]:C<0&&(c=h[l][-C-1>>1].neg()),x=\"affine\"===c.type?x.mixedAdd(c):x.add(c))}}for(a=0;a<n;a++)h[a]=null;return i?x:x.toP()},l.BasePoint=c,c.prototype.eq=function(){throw new Error(\"Not implemented\")},c.prototype.validate=function(){return this.curve.validate(this)},l.prototype.decodePoint=function(e,t){e=i.toArray(e,t);var r=this.p.byteLength();if((4===e[0]||6===e[0]||7===e[0])&&e.length-1==2*r)return 6===e[0]?a(e[e.length-1]%2==0):7===e[0]&&a(e[e.length-1]%2==1),this.point(e.slice(1,1+r),e.slice(1+r,1+2*r));if((2===e[0]||3===e[0])&&e.length-1===r)return this.pointFromX(e.slice(1,1+r),3===e[0]);throw new Error(\"Unknown point format\")},c.prototype.encodeCompressed=function(e){return this.encode(e,!0)},c.prototype._encode=function(e){var t=this.curve.p.byteLength(),r=this.getX().toArray(\"be\",t);return e?[this.getY().isEven()?2:3].concat(r):[4].concat(r,this.getY().toArray(\"be\",t))},c.prototype.encode=function(e,t){return i.encode(this._encode(t),e)},c.prototype.precompute=function(e){if(this.precomputed)return this;var t={doubles:null,naf:null,beta:null};return t.naf=this._getNAFPoints(8),t.doubles=this._getDoubles(4,e),t.beta=this._getBeta(),this.precomputed=t,this},c.prototype._hasDoubles=function(e){if(!this.precomputed)return!1;var t=this.precomputed.doubles;return!!t&&t.points.length>=Math.ceil((e.bitLength()+1)/t.step)},c.prototype._getDoubles=function(e,t){if(this.precomputed&&this.precomputed.doubles)return this.precomputed.doubles;for(var r=[this],n=this,i=0;i<t;i+=e){for(var s=0;s<e;s++)n=n.dbl();r.push(n)}return{step:e,points:r}},c.prototype._getNAFPoints=function(e){if(this.precomputed&&this.precomputed.naf)return this.precomputed.naf;for(var t=[this],r=(1<<e)-1,n=1===r?null:this.dbl(),i=1;i<r;i++)t[i]=t[i-1].add(n);return{wnd:e,points:t}},c.prototype._getBeta=function(){return null},c.prototype.dblp=function(e){for(var t=this,r=0;r<e;r++)t=t.dbl();return t}},{\"../utils\":419,\"bn.js\":420}],407:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"bn.js\"),s=e(\"inherits\"),o=e(\"./base\"),a=n.assert;function l(e){this.twisted=1!=(0|e.a),this.mOneA=this.twisted&&-1==(0|e.a),this.extended=this.mOneA,o.call(this,\"edwards\",e),this.a=new i(e.a,16).umod(this.red.m),this.a=this.a.toRed(this.red),this.c=new i(e.c,16).toRed(this.red),this.c2=this.c.redSqr(),this.d=new i(e.d,16).toRed(this.red),this.dd=this.d.redAdd(this.d),a(!this.twisted||0===this.c.fromRed().cmpn(1)),this.oneC=1==(0|e.c)}function c(e,t,r,n,s){o.BasePoint.call(this,e,\"projective\"),null===t&&null===r&&null===n?(this.x=this.curve.zero,this.y=this.curve.one,this.z=this.curve.one,this.t=this.curve.zero,this.zOne=!0):(this.x=new i(t,16),this.y=new i(r,16),this.z=n?new i(n,16):this.curve.one,this.t=s&&new i(s,16),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)),this.t&&!this.t.red&&(this.t=this.t.toRed(this.curve.red)),this.zOne=this.z===this.curve.one,this.curve.extended&&!this.t&&(this.t=this.x.redMul(this.y),this.zOne||(this.t=this.t.redMul(this.z.redInvm()))))}s(l,o),t.exports=l,l.prototype._mulA=function(e){return this.mOneA?e.redNeg():this.a.redMul(e)},l.prototype._mulC=function(e){return this.oneC?e:this.c.redMul(e)},l.prototype.jpoint=function(e,t,r,n){return this.point(e,t,r,n)},l.prototype.pointFromX=function(e,t){(e=new i(e,16)).red||(e=e.toRed(this.red));var r=e.redSqr(),n=this.c2.redSub(this.a.redMul(r)),s=this.one.redSub(this.c2.redMul(this.d).redMul(r)),o=n.redMul(s.redInvm()),a=o.redSqrt();if(0!==a.redSqr().redSub(o).cmp(this.zero))throw new Error(\"invalid point\");var l=a.fromRed().isOdd();return(t&&!l||!t&&l)&&(a=a.redNeg()),this.point(e,a)},l.prototype.pointFromY=function(e,t){(e=new i(e,16)).red||(e=e.toRed(this.red));var r=e.redSqr(),n=r.redSub(this.c2),s=r.redMul(this.d).redMul(this.c2).redSub(this.a),o=n.redMul(s.redInvm());if(0===o.cmp(this.zero)){if(t)throw new Error(\"invalid point\");return this.point(this.zero,e)}var a=o.redSqrt();if(0!==a.redSqr().redSub(o).cmp(this.zero))throw new Error(\"invalid point\");return a.fromRed().isOdd()!==t&&(a=a.redNeg()),this.point(a,e)},l.prototype.validate=function(e){if(e.isInfinity())return!0;e.normalize();var t=e.x.redSqr(),r=e.y.redSqr(),n=t.redMul(this.a).redAdd(r),i=this.c2.redMul(this.one.redAdd(this.d.redMul(t).redMul(r)));return 0===n.cmp(i)},s(c,o.BasePoint),l.prototype.pointFromJSON=function(e){return c.fromJSON(this,e)},l.prototype.point=function(e,t,r,n){return new c(this,e,t,r,n)},c.fromJSON=function(e,t){return new c(e,t[0],t[1],t[2])},c.prototype.inspect=function(){return this.isInfinity()?\"<EC Point Infinity>\":\"<EC Point x: \"+this.x.fromRed().toString(16,2)+\" y: \"+this.y.fromRed().toString(16,2)+\" z: \"+this.z.fromRed().toString(16,2)+\">\"},c.prototype.isInfinity=function(){return 0===this.x.cmpn(0)&&(0===this.y.cmp(this.z)||this.zOne&&0===this.y.cmp(this.curve.c))},c.prototype._extDbl=function(){var e=this.x.redSqr(),t=this.y.redSqr(),r=this.z.redSqr();r=r.redIAdd(r);var n=this.curve._mulA(e),i=this.x.redAdd(this.y).redSqr().redISub(e).redISub(t),s=n.redAdd(t),o=s.redSub(r),a=n.redSub(t),l=i.redMul(o),c=s.redMul(a),u=i.redMul(a),h=o.redMul(s);return this.curve.point(l,c,h,u)},c.prototype._projDbl=function(){var e,t,r,n,i,s,o=this.x.redAdd(this.y).redSqr(),a=this.x.redSqr(),l=this.y.redSqr();if(this.curve.twisted){var c=(n=this.curve._mulA(a)).redAdd(l);this.zOne?(e=o.redSub(a).redSub(l).redMul(c.redSub(this.curve.two)),t=c.redMul(n.redSub(l)),r=c.redSqr().redSub(c).redSub(c)):(i=this.z.redSqr(),s=c.redSub(i).redISub(i),e=o.redSub(a).redISub(l).redMul(s),t=c.redMul(n.redSub(l)),r=c.redMul(s))}else n=a.redAdd(l),i=this.curve._mulC(this.z).redSqr(),s=n.redSub(i).redSub(i),e=this.curve._mulC(o.redISub(n)).redMul(s),t=this.curve._mulC(n).redMul(a.redISub(l)),r=n.redMul(s);return this.curve.point(e,t,r)},c.prototype.dbl=function(){return this.isInfinity()?this:this.curve.extended?this._extDbl():this._projDbl()},c.prototype._extAdd=function(e){var t=this.y.redSub(this.x).redMul(e.y.redSub(e.x)),r=this.y.redAdd(this.x).redMul(e.y.redAdd(e.x)),n=this.t.redMul(this.curve.dd).redMul(e.t),i=this.z.redMul(e.z.redAdd(e.z)),s=r.redSub(t),o=i.redSub(n),a=i.redAdd(n),l=r.redAdd(t),c=s.redMul(o),u=a.redMul(l),h=s.redMul(l),f=o.redMul(a);return this.curve.point(c,u,f,h)},c.prototype._projAdd=function(e){var t,r,n=this.z.redMul(e.z),i=n.redSqr(),s=this.x.redMul(e.x),o=this.y.redMul(e.y),a=this.curve.d.redMul(s).redMul(o),l=i.redSub(a),c=i.redAdd(a),u=this.x.redAdd(this.y).redMul(e.x.redAdd(e.y)).redISub(s).redISub(o),h=n.redMul(l).redMul(u);return this.curve.twisted?(t=n.redMul(c).redMul(o.redSub(this.curve._mulA(s))),r=l.redMul(c)):(t=n.redMul(c).redMul(o.redSub(s)),r=this.curve._mulC(l).redMul(c)),this.curve.point(h,t,r)},c.prototype.add=function(e){return this.isInfinity()?e:e.isInfinity()?this:this.curve.extended?this._extAdd(e):this._projAdd(e)},c.prototype.mul=function(e){return this._hasDoubles(e)?this.curve._fixedNafMul(this,e):this.curve._wnafMul(this,e)},c.prototype.mulAdd=function(e,t,r){return this.curve._wnafMulAdd(1,[this,t],[e,r],2,!1)},c.prototype.jmulAdd=function(e,t,r){return this.curve._wnafMulAdd(1,[this,t],[e,r],2,!0)},c.prototype.normalize=function(){if(this.zOne)return this;var e=this.z.redInvm();return this.x=this.x.redMul(e),this.y=this.y.redMul(e),this.t&&(this.t=this.t.redMul(e)),this.z=this.curve.one,this.zOne=!0,this},c.prototype.neg=function(){return this.curve.point(this.x.redNeg(),this.y,this.z,this.t&&this.t.redNeg())},c.prototype.getX=function(){return this.normalize(),this.x.fromRed()},c.prototype.getY=function(){return this.normalize(),this.y.fromRed()},c.prototype.eq=function(e){return this===e||0===this.getX().cmp(e.getX())&&0===this.getY().cmp(e.getY())},c.prototype.eqXToP=function(e){var t=e.toRed(this.curve.red).redMul(this.z);if(0===this.x.cmp(t))return!0;for(var r=e.clone(),n=this.curve.redN.redMul(this.z);;){if(r.iadd(this.curve.n),r.cmp(this.curve.p)>=0)return!1;if(t.redIAdd(n),0===this.x.cmp(t))return!0}},c.prototype.toP=c.prototype.normalize,c.prototype.mixedAdd=c.prototype.add},{\"../utils\":419,\"./base\":406,\"bn.js\":420,inherits:440}],408:[function(e,t,r){\"use strict\";var n=r;n.base=e(\"./base\"),n.short=e(\"./short\"),n.mont=e(\"./mont\"),n.edwards=e(\"./edwards\")},{\"./base\":406,\"./edwards\":407,\"./mont\":409,\"./short\":410}],409:[function(e,t,r){\"use strict\";var n=e(\"bn.js\"),i=e(\"inherits\"),s=e(\"./base\"),o=e(\"../utils\");function a(e){s.call(this,\"mont\",e),this.a=new n(e.a,16).toRed(this.red),this.b=new n(e.b,16).toRed(this.red),this.i4=new n(4).toRed(this.red).redInvm(),this.two=new n(2).toRed(this.red),this.a24=this.i4.redMul(this.a.redAdd(this.two))}function l(e,t,r){s.BasePoint.call(this,e,\"projective\"),null===t&&null===r?(this.x=this.curve.one,this.z=this.curve.zero):(this.x=new n(t,16),this.z=new n(r,16),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)))}i(a,s),t.exports=a,a.prototype.validate=function(e){var t=e.normalize().x,r=t.redSqr(),n=r.redMul(t).redAdd(r.redMul(this.a)).redAdd(t);return 0===n.redSqrt().redSqr().cmp(n)},i(l,s.BasePoint),a.prototype.decodePoint=function(e,t){return this.point(o.toArray(e,t),1)},a.prototype.point=function(e,t){return new l(this,e,t)},a.prototype.pointFromJSON=function(e){return l.fromJSON(this,e)},l.prototype.precompute=function(){},l.prototype._encode=function(){return this.getX().toArray(\"be\",this.curve.p.byteLength())},l.fromJSON=function(e,t){return new l(e,t[0],t[1]||e.one)},l.prototype.inspect=function(){return this.isInfinity()?\"<EC Point Infinity>\":\"<EC Point x: \"+this.x.fromRed().toString(16,2)+\" z: \"+this.z.fromRed().toString(16,2)+\">\"},l.prototype.isInfinity=function(){return 0===this.z.cmpn(0)},l.prototype.dbl=function(){var e=this.x.redAdd(this.z).redSqr(),t=this.x.redSub(this.z).redSqr(),r=e.redSub(t),n=e.redMul(t),i=r.redMul(t.redAdd(this.curve.a24.redMul(r)));return this.curve.point(n,i)},l.prototype.add=function(){throw new Error(\"Not supported on Montgomery curve\")},l.prototype.diffAdd=function(e,t){var r=this.x.redAdd(this.z),n=this.x.redSub(this.z),i=e.x.redAdd(e.z),s=e.x.redSub(e.z).redMul(r),o=i.redMul(n),a=t.z.redMul(s.redAdd(o).redSqr()),l=t.x.redMul(s.redISub(o).redSqr());return this.curve.point(a,l)},l.prototype.mul=function(e){for(var t=e.clone(),r=this,n=this.curve.point(null,null),i=[];0!==t.cmpn(0);t.iushrn(1))i.push(t.andln(1));for(var s=i.length-1;s>=0;s--)0===i[s]?(r=r.diffAdd(n,this),n=n.dbl()):(n=r.diffAdd(n,this),r=r.dbl());return n},l.prototype.mulAdd=function(){throw new Error(\"Not supported on Montgomery curve\")},l.prototype.jumlAdd=function(){throw new Error(\"Not supported on Montgomery curve\")},l.prototype.eq=function(e){return 0===this.getX().cmp(e.getX())},l.prototype.normalize=function(){return this.x=this.x.redMul(this.z.redInvm()),this.z=this.curve.one,this},l.prototype.getX=function(){return this.normalize(),this.x.fromRed()}},{\"../utils\":419,\"./base\":406,\"bn.js\":420,inherits:440}],410:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"bn.js\"),s=e(\"inherits\"),o=e(\"./base\"),a=n.assert;function l(e){o.call(this,\"short\",e),this.a=new i(e.a,16).toRed(this.red),this.b=new i(e.b,16).toRed(this.red),this.tinv=this.two.redInvm(),this.zeroA=0===this.a.fromRed().cmpn(0),this.threeA=0===this.a.fromRed().sub(this.p).cmpn(-3),this.endo=this._getEndomorphism(e),this._endoWnafT1=new Array(4),this._endoWnafT2=new Array(4)}function c(e,t,r,n){o.BasePoint.call(this,e,\"affine\"),null===t&&null===r?(this.x=null,this.y=null,this.inf=!0):(this.x=new i(t,16),this.y=new i(r,16),n&&(this.x.forceRed(this.curve.red),this.y.forceRed(this.curve.red)),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.inf=!1)}function u(e,t,r,n){o.BasePoint.call(this,e,\"jacobian\"),null===t&&null===r&&null===n?(this.x=this.curve.one,this.y=this.curve.one,this.z=new i(0)):(this.x=new i(t,16),this.y=new i(r,16),this.z=new i(n,16)),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)),this.zOne=this.z===this.curve.one}s(l,o),t.exports=l,l.prototype._getEndomorphism=function(e){if(this.zeroA&&this.g&&this.n&&1===this.p.modn(3)){var t,r;if(e.beta)t=new i(e.beta,16).toRed(this.red);else{var n=this._getEndoRoots(this.p);t=(t=n[0].cmp(n[1])<0?n[0]:n[1]).toRed(this.red)}if(e.lambda)r=new i(e.lambda,16);else{var s=this._getEndoRoots(this.n);0===this.g.mul(s[0]).x.cmp(this.g.x.redMul(t))?r=s[0]:(r=s[1],a(0===this.g.mul(r).x.cmp(this.g.x.redMul(t))))}return{beta:t,lambda:r,basis:e.basis?e.basis.map((function(e){return{a:new i(e.a,16),b:new i(e.b,16)}})):this._getEndoBasis(r)}}},l.prototype._getEndoRoots=function(e){var t=e===this.p?this.red:i.mont(e),r=new i(2).toRed(t).redInvm(),n=r.redNeg(),s=new i(3).toRed(t).redNeg().redSqrt().redMul(r);return[n.redAdd(s).fromRed(),n.redSub(s).fromRed()]},l.prototype._getEndoBasis=function(e){for(var t,r,n,s,o,a,l,c,u,h=this.n.ushrn(Math.floor(this.n.bitLength()/2)),f=e,d=this.n.clone(),p=new i(1),m=new i(0),b=new i(0),g=new i(1),y=0;0!==f.cmpn(0);){var v=d.div(f);c=d.sub(v.mul(f)),u=b.sub(v.mul(p));var w=g.sub(v.mul(m));if(!n&&c.cmp(h)<0)t=l.neg(),r=p,n=c.neg(),s=u;else if(n&&2==++y)break;l=c,d=f,f=c,b=p,p=u,g=m,m=w}o=c.neg(),a=u;var _=n.sqr().add(s.sqr());return o.sqr().add(a.sqr()).cmp(_)>=0&&(o=t,a=r),n.negative&&(n=n.neg(),s=s.neg()),o.negative&&(o=o.neg(),a=a.neg()),[{a:n,b:s},{a:o,b:a}]},l.prototype._endoSplit=function(e){var t=this.endo.basis,r=t[0],n=t[1],i=n.b.mul(e).divRound(this.n),s=r.b.neg().mul(e).divRound(this.n),o=i.mul(r.a),a=s.mul(n.a),l=i.mul(r.b),c=s.mul(n.b);return{k1:e.sub(o).sub(a),k2:l.add(c).neg()}},l.prototype.pointFromX=function(e,t){(e=new i(e,16)).red||(e=e.toRed(this.red));var r=e.redSqr().redMul(e).redIAdd(e.redMul(this.a)).redIAdd(this.b),n=r.redSqrt();if(0!==n.redSqr().redSub(r).cmp(this.zero))throw new Error(\"invalid point\");var s=n.fromRed().isOdd();return(t&&!s||!t&&s)&&(n=n.redNeg()),this.point(e,n)},l.prototype.validate=function(e){if(e.inf)return!0;var t=e.x,r=e.y,n=this.a.redMul(t),i=t.redSqr().redMul(t).redIAdd(n).redIAdd(this.b);return 0===r.redSqr().redISub(i).cmpn(0)},l.prototype._endoWnafMulAdd=function(e,t,r){for(var n=this._endoWnafT1,i=this._endoWnafT2,s=0;s<e.length;s++){var o=this._endoSplit(t[s]),a=e[s],l=a._getBeta();o.k1.negative&&(o.k1.ineg(),a=a.neg(!0)),o.k2.negative&&(o.k2.ineg(),l=l.neg(!0)),n[2*s]=a,n[2*s+1]=l,i[2*s]=o.k1,i[2*s+1]=o.k2}for(var c=this._wnafMulAdd(1,n,i,2*s,r),u=0;u<2*s;u++)n[u]=null,i[u]=null;return c},s(c,o.BasePoint),l.prototype.point=function(e,t,r){return new c(this,e,t,r)},l.prototype.pointFromJSON=function(e,t){return c.fromJSON(this,e,t)},c.prototype._getBeta=function(){if(this.curve.endo){var e=this.precomputed;if(e&&e.beta)return e.beta;var t=this.curve.point(this.x.redMul(this.curve.endo.beta),this.y);if(e){var r=this.curve,n=function(e){return r.point(e.x.redMul(r.endo.beta),e.y)};e.beta=t,t.precomputed={beta:null,naf:e.naf&&{wnd:e.naf.wnd,points:e.naf.points.map(n)},doubles:e.doubles&&{step:e.doubles.step,points:e.doubles.points.map(n)}}}return t}},c.prototype.toJSON=function(){return this.precomputed?[this.x,this.y,this.precomputed&&{doubles:this.precomputed.doubles&&{step:this.precomputed.doubles.step,points:this.precomputed.doubles.points.slice(1)},naf:this.precomputed.naf&&{wnd:this.precomputed.naf.wnd,points:this.precomputed.naf.points.slice(1)}}]:[this.x,this.y]},c.fromJSON=function(e,t,r){\"string\"==typeof t&&(t=JSON.parse(t));var n=e.point(t[0],t[1],r);if(!t[2])return n;function i(t){return e.point(t[0],t[1],r)}var s=t[2];return n.precomputed={beta:null,doubles:s.doubles&&{step:s.doubles.step,points:[n].concat(s.doubles.points.map(i))},naf:s.naf&&{wnd:s.naf.wnd,points:[n].concat(s.naf.points.map(i))}},n},c.prototype.inspect=function(){return this.isInfinity()?\"<EC Point Infinity>\":\"<EC Point x: \"+this.x.fromRed().toString(16,2)+\" y: \"+this.y.fromRed().toString(16,2)+\">\"},c.prototype.isInfinity=function(){return this.inf},c.prototype.add=function(e){if(this.inf)return e;if(e.inf)return this;if(this.eq(e))return this.dbl();if(this.neg().eq(e))return this.curve.point(null,null);if(0===this.x.cmp(e.x))return this.curve.point(null,null);var t=this.y.redSub(e.y);0!==t.cmpn(0)&&(t=t.redMul(this.x.redSub(e.x).redInvm()));var r=t.redSqr().redISub(this.x).redISub(e.x),n=t.redMul(this.x.redSub(r)).redISub(this.y);return this.curve.point(r,n)},c.prototype.dbl=function(){if(this.inf)return this;var e=this.y.redAdd(this.y);if(0===e.cmpn(0))return this.curve.point(null,null);var t=this.curve.a,r=this.x.redSqr(),n=e.redInvm(),i=r.redAdd(r).redIAdd(r).redIAdd(t).redMul(n),s=i.redSqr().redISub(this.x.redAdd(this.x)),o=i.redMul(this.x.redSub(s)).redISub(this.y);return this.curve.point(s,o)},c.prototype.getX=function(){return this.x.fromRed()},c.prototype.getY=function(){return this.y.fromRed()},c.prototype.mul=function(e){return e=new i(e,16),this.isInfinity()?this:this._hasDoubles(e)?this.curve._fixedNafMul(this,e):this.curve.endo?this.curve._endoWnafMulAdd([this],[e]):this.curve._wnafMul(this,e)},c.prototype.mulAdd=function(e,t,r){var n=[this,t],i=[e,r];return this.curve.endo?this.curve._endoWnafMulAdd(n,i):this.curve._wnafMulAdd(1,n,i,2)},c.prototype.jmulAdd=function(e,t,r){var n=[this,t],i=[e,r];return this.curve.endo?this.curve._endoWnafMulAdd(n,i,!0):this.curve._wnafMulAdd(1,n,i,2,!0)},c.prototype.eq=function(e){return this===e||this.inf===e.inf&&(this.inf||0===this.x.cmp(e.x)&&0===this.y.cmp(e.y))},c.prototype.neg=function(e){if(this.inf)return this;var t=this.curve.point(this.x,this.y.redNeg());if(e&&this.precomputed){var r=this.precomputed,n=function(e){return e.neg()};t.precomputed={naf:r.naf&&{wnd:r.naf.wnd,points:r.naf.points.map(n)},doubles:r.doubles&&{step:r.doubles.step,points:r.doubles.points.map(n)}}}return t},c.prototype.toJ=function(){return this.inf?this.curve.jpoint(null,null,null):this.curve.jpoint(this.x,this.y,this.curve.one)},s(u,o.BasePoint),l.prototype.jpoint=function(e,t,r){return new u(this,e,t,r)},u.prototype.toP=function(){if(this.isInfinity())return this.curve.point(null,null);var e=this.z.redInvm(),t=e.redSqr(),r=this.x.redMul(t),n=this.y.redMul(t).redMul(e);return this.curve.point(r,n)},u.prototype.neg=function(){return this.curve.jpoint(this.x,this.y.redNeg(),this.z)},u.prototype.add=function(e){if(this.isInfinity())return e;if(e.isInfinity())return this;var t=e.z.redSqr(),r=this.z.redSqr(),n=this.x.redMul(t),i=e.x.redMul(r),s=this.y.redMul(t.redMul(e.z)),o=e.y.redMul(r.redMul(this.z)),a=n.redSub(i),l=s.redSub(o);if(0===a.cmpn(0))return 0!==l.cmpn(0)?this.curve.jpoint(null,null,null):this.dbl();var c=a.redSqr(),u=c.redMul(a),h=n.redMul(c),f=l.redSqr().redIAdd(u).redISub(h).redISub(h),d=l.redMul(h.redISub(f)).redISub(s.redMul(u)),p=this.z.redMul(e.z).redMul(a);return this.curve.jpoint(f,d,p)},u.prototype.mixedAdd=function(e){if(this.isInfinity())return e.toJ();if(e.isInfinity())return this;var t=this.z.redSqr(),r=this.x,n=e.x.redMul(t),i=this.y,s=e.y.redMul(t).redMul(this.z),o=r.redSub(n),a=i.redSub(s);if(0===o.cmpn(0))return 0!==a.cmpn(0)?this.curve.jpoint(null,null,null):this.dbl();var l=o.redSqr(),c=l.redMul(o),u=r.redMul(l),h=a.redSqr().redIAdd(c).redISub(u).redISub(u),f=a.redMul(u.redISub(h)).redISub(i.redMul(c)),d=this.z.redMul(o);return this.curve.jpoint(h,f,d)},u.prototype.dblp=function(e){if(0===e)return this;if(this.isInfinity())return this;if(!e)return this.dbl();var t;if(this.curve.zeroA||this.curve.threeA){var r=this;for(t=0;t<e;t++)r=r.dbl();return r}var n=this.curve.a,i=this.curve.tinv,s=this.x,o=this.y,a=this.z,l=a.redSqr().redSqr(),c=o.redAdd(o);for(t=0;t<e;t++){var u=s.redSqr(),h=c.redSqr(),f=h.redSqr(),d=u.redAdd(u).redIAdd(u).redIAdd(n.redMul(l)),p=s.redMul(h),m=d.redSqr().redISub(p.redAdd(p)),b=p.redISub(m),g=d.redMul(b);g=g.redIAdd(g).redISub(f);var y=c.redMul(a);t+1<e&&(l=l.redMul(f)),s=m,a=y,c=g}return this.curve.jpoint(s,c.redMul(i),a)},u.prototype.dbl=function(){return this.isInfinity()?this:this.curve.zeroA?this._zeroDbl():this.curve.threeA?this._threeDbl():this._dbl()},u.prototype._zeroDbl=function(){var e,t,r;if(this.zOne){var n=this.x.redSqr(),i=this.y.redSqr(),s=i.redSqr(),o=this.x.redAdd(i).redSqr().redISub(n).redISub(s);o=o.redIAdd(o);var a=n.redAdd(n).redIAdd(n),l=a.redSqr().redISub(o).redISub(o),c=s.redIAdd(s);c=(c=c.redIAdd(c)).redIAdd(c),e=l,t=a.redMul(o.redISub(l)).redISub(c),r=this.y.redAdd(this.y)}else{var u=this.x.redSqr(),h=this.y.redSqr(),f=h.redSqr(),d=this.x.redAdd(h).redSqr().redISub(u).redISub(f);d=d.redIAdd(d);var p=u.redAdd(u).redIAdd(u),m=p.redSqr(),b=f.redIAdd(f);b=(b=b.redIAdd(b)).redIAdd(b),e=m.redISub(d).redISub(d),t=p.redMul(d.redISub(e)).redISub(b),r=(r=this.y.redMul(this.z)).redIAdd(r)}return this.curve.jpoint(e,t,r)},u.prototype._threeDbl=function(){var e,t,r;if(this.zOne){var n=this.x.redSqr(),i=this.y.redSqr(),s=i.redSqr(),o=this.x.redAdd(i).redSqr().redISub(n).redISub(s);o=o.redIAdd(o);var a=n.redAdd(n).redIAdd(n).redIAdd(this.curve.a),l=a.redSqr().redISub(o).redISub(o);e=l;var c=s.redIAdd(s);c=(c=c.redIAdd(c)).redIAdd(c),t=a.redMul(o.redISub(l)).redISub(c),r=this.y.redAdd(this.y)}else{var u=this.z.redSqr(),h=this.y.redSqr(),f=this.x.redMul(h),d=this.x.redSub(u).redMul(this.x.redAdd(u));d=d.redAdd(d).redIAdd(d);var p=f.redIAdd(f),m=(p=p.redIAdd(p)).redAdd(p);e=d.redSqr().redISub(m),r=this.y.redAdd(this.z).redSqr().redISub(h).redISub(u);var b=h.redSqr();b=(b=(b=b.redIAdd(b)).redIAdd(b)).redIAdd(b),t=d.redMul(p.redISub(e)).redISub(b)}return this.curve.jpoint(e,t,r)},u.prototype._dbl=function(){var e=this.curve.a,t=this.x,r=this.y,n=this.z,i=n.redSqr().redSqr(),s=t.redSqr(),o=r.redSqr(),a=s.redAdd(s).redIAdd(s).redIAdd(e.redMul(i)),l=t.redAdd(t),c=(l=l.redIAdd(l)).redMul(o),u=a.redSqr().redISub(c.redAdd(c)),h=c.redISub(u),f=o.redSqr();f=(f=(f=f.redIAdd(f)).redIAdd(f)).redIAdd(f);var d=a.redMul(h).redISub(f),p=r.redAdd(r).redMul(n);return this.curve.jpoint(u,d,p)},u.prototype.trpl=function(){if(!this.curve.zeroA)return this.dbl().add(this);var e=this.x.redSqr(),t=this.y.redSqr(),r=this.z.redSqr(),n=t.redSqr(),i=e.redAdd(e).redIAdd(e),s=i.redSqr(),o=this.x.redAdd(t).redSqr().redISub(e).redISub(n),a=(o=(o=(o=o.redIAdd(o)).redAdd(o).redIAdd(o)).redISub(s)).redSqr(),l=n.redIAdd(n);l=(l=(l=l.redIAdd(l)).redIAdd(l)).redIAdd(l);var c=i.redIAdd(o).redSqr().redISub(s).redISub(a).redISub(l),u=t.redMul(c);u=(u=u.redIAdd(u)).redIAdd(u);var h=this.x.redMul(a).redISub(u);h=(h=h.redIAdd(h)).redIAdd(h);var f=this.y.redMul(c.redMul(l.redISub(c)).redISub(o.redMul(a)));f=(f=(f=f.redIAdd(f)).redIAdd(f)).redIAdd(f);var d=this.z.redAdd(o).redSqr().redISub(r).redISub(a);return this.curve.jpoint(h,f,d)},u.prototype.mul=function(e,t){return e=new i(e,t),this.curve._wnafMul(this,e)},u.prototype.eq=function(e){if(\"affine\"===e.type)return this.eq(e.toJ());if(this===e)return!0;var t=this.z.redSqr(),r=e.z.redSqr();if(0!==this.x.redMul(r).redISub(e.x.redMul(t)).cmpn(0))return!1;var n=t.redMul(this.z),i=r.redMul(e.z);return 0===this.y.redMul(i).redISub(e.y.redMul(n)).cmpn(0)},u.prototype.eqXToP=function(e){var t=this.z.redSqr(),r=e.toRed(this.curve.red).redMul(t);if(0===this.x.cmp(r))return!0;for(var n=e.clone(),i=this.curve.redN.redMul(t);;){if(n.iadd(this.curve.n),n.cmp(this.curve.p)>=0)return!1;if(r.redIAdd(i),0===this.x.cmp(r))return!0}},u.prototype.inspect=function(){return this.isInfinity()?\"<EC JPoint Infinity>\":\"<EC JPoint x: \"+this.x.toString(16,2)+\" y: \"+this.y.toString(16,2)+\" z: \"+this.z.toString(16,2)+\">\"},u.prototype.isInfinity=function(){return 0===this.z.cmpn(0)}},{\"../utils\":419,\"./base\":406,\"bn.js\":420,inherits:440}],411:[function(e,t,r){\"use strict\";var n,i=r,s=e(\"hash.js\"),o=e(\"./curve\"),a=e(\"./utils\").assert;function l(e){\"short\"===e.type?this.curve=new o.short(e):\"edwards\"===e.type?this.curve=new o.edwards(e):this.curve=new o.mont(e),this.g=this.curve.g,this.n=this.curve.n,this.hash=e.hash,a(this.g.validate(),\"Invalid curve\"),a(this.g.mul(this.n).isInfinity(),\"Invalid curve, G*N != O\")}function c(e,t){Object.defineProperty(i,e,{configurable:!0,enumerable:!0,get:function(){var r=new l(t);return Object.defineProperty(i,e,{configurable:!0,enumerable:!0,value:r}),r}})}i.PresetCurve=l,c(\"p192\",{type:\"short\",prime:\"p192\",p:\"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff\",a:\"ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc\",b:\"64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1\",n:\"ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831\",hash:s.sha256,gRed:!1,g:[\"188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012\",\"07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811\"]}),c(\"p224\",{type:\"short\",prime:\"p224\",p:\"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001\",a:\"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe\",b:\"b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4\",n:\"ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d\",hash:s.sha256,gRed:!1,g:[\"b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21\",\"bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34\"]}),c(\"p256\",{type:\"short\",prime:null,p:\"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff\",a:\"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc\",b:\"5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b\",n:\"ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551\",hash:s.sha256,gRed:!1,g:[\"6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296\",\"4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5\"]}),c(\"p384\",{type:\"short\",prime:null,p:\"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 ffffffff\",a:\"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 fffffffc\",b:\"b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f 5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef\",n:\"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 f4372ddf 581a0db2 48b0a77a ecec196a ccc52973\",hash:s.sha384,gRed:!1,g:[\"aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 5502f25d bf55296c 3a545e38 72760ab7\",\"3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 0a60b1ce 1d7e819d 7a431d7c 90ea0e5f\"]}),c(\"p521\",{type:\"short\",prime:null,p:\"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff\",a:\"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffc\",b:\"00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b 99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd 3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00\",n:\"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409\",hash:s.sha512,gRed:!1,g:[\"000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66\",\"00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 3fad0761 353c7086 a272c240 88be9476 9fd16650\"]}),c(\"curve25519\",{type:\"mont\",prime:\"p25519\",p:\"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed\",a:\"76d06\",b:\"1\",n:\"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed\",hash:s.sha256,gRed:!1,g:[\"9\"]}),c(\"ed25519\",{type:\"edwards\",prime:\"p25519\",p:\"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed\",a:\"-1\",c:\"1\",d:\"52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3\",n:\"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed\",hash:s.sha256,gRed:!1,g:[\"216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a\",\"6666666666666666666666666666666666666666666666666666666666666658\"]});try{n=e(\"./precomputed/secp256k1\")}catch(e){n=void 0}c(\"secp256k1\",{type:\"short\",prime:\"k256\",p:\"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f\",a:\"0\",b:\"7\",n:\"ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141\",h:\"1\",hash:s.sha256,beta:\"7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee\",lambda:\"5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72\",basis:[{a:\"3086d221a7d46bcde86c90e49284eb15\",b:\"-e4437ed6010e88286f547fa90abfe4c3\"},{a:\"114ca50f7a8e2f3f657c1108d9d44cfd8\",b:\"3086d221a7d46bcde86c90e49284eb15\"}],gRed:!1,g:[\"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798\",\"483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8\",n]})},{\"./curve\":408,\"./precomputed/secp256k1\":418,\"./utils\":419,\"hash.js\":426}],412:[function(e,t,r){\"use strict\";var n=e(\"bn.js\"),i=e(\"hmac-drbg\"),s=e(\"../utils\"),o=e(\"../curves\"),a=e(\"brorand\"),l=s.assert,c=e(\"./key\"),u=e(\"./signature\");function h(e){if(!(this instanceof h))return new h(e);\"string\"==typeof e&&(l(Object.prototype.hasOwnProperty.call(o,e),\"Unknown curve \"+e),e=o[e]),e instanceof o.PresetCurve&&(e={curve:e}),this.curve=e.curve.curve,this.n=this.curve.n,this.nh=this.n.ushrn(1),this.g=this.curve.g,this.g=e.curve.g,this.g.precompute(e.curve.n.bitLength()+1),this.hash=e.hash||e.curve.hash}t.exports=h,h.prototype.keyPair=function(e){return new c(this,e)},h.prototype.keyFromPrivate=function(e,t){return c.fromPrivate(this,e,t)},h.prototype.keyFromPublic=function(e,t){return c.fromPublic(this,e,t)},h.prototype.genKeyPair=function(e){e||(e={});for(var t=new i({hash:this.hash,pers:e.pers,persEnc:e.persEnc||\"utf8\",entropy:e.entropy||a(this.hash.hmacStrength),entropyEnc:e.entropy&&e.entropyEnc||\"utf8\",nonce:this.n.toArray()}),r=this.n.byteLength(),s=this.n.sub(new n(2));;){var o=new n(t.generate(r));if(!(o.cmp(s)>0))return o.iaddn(1),this.keyFromPrivate(o)}},h.prototype._truncateToN=function(e,t){var r=8*e.byteLength()-this.n.bitLength();return r>0&&(e=e.ushrn(r)),!t&&e.cmp(this.n)>=0?e.sub(this.n):e},h.prototype.sign=function(e,t,r,s){\"object\"==typeof r&&(s=r,r=null),s||(s={}),t=this.keyFromPrivate(t,r),e=this._truncateToN(new n(e,16));for(var o=this.n.byteLength(),a=t.getPrivate().toArray(\"be\",o),l=e.toArray(\"be\",o),c=new i({hash:this.hash,entropy:a,nonce:l,pers:s.pers,persEnc:s.persEnc||\"utf8\"}),h=this.n.sub(new n(1)),f=0;;f++){var d=s.k?s.k(f):new n(c.generate(this.n.byteLength()));if(!((d=this._truncateToN(d,!0)).cmpn(1)<=0||d.cmp(h)>=0)){var p=this.g.mul(d);if(!p.isInfinity()){var m=p.getX(),b=m.umod(this.n);if(0!==b.cmpn(0)){var g=d.invm(this.n).mul(b.mul(t.getPrivate()).iadd(e));if(0!==(g=g.umod(this.n)).cmpn(0)){var y=(p.getY().isOdd()?1:0)|(0!==m.cmp(b)?2:0);return s.canonical&&g.cmp(this.nh)>0&&(g=this.n.sub(g),y^=1),new u({r:b,s:g,recoveryParam:y})}}}}}},h.prototype.verify=function(e,t,r,i){e=this._truncateToN(new n(e,16)),r=this.keyFromPublic(r,i);var s=(t=new u(t,\"hex\")).r,o=t.s;if(s.cmpn(1)<0||s.cmp(this.n)>=0)return!1;if(o.cmpn(1)<0||o.cmp(this.n)>=0)return!1;var a,l=o.invm(this.n),c=l.mul(e).umod(this.n),h=l.mul(s).umod(this.n);return this.curve._maxwellTrick?!(a=this.g.jmulAdd(c,r.getPublic(),h)).isInfinity()&&a.eqXToP(s):!(a=this.g.mulAdd(c,r.getPublic(),h)).isInfinity()&&0===a.getX().umod(this.n).cmp(s)},h.prototype.recoverPubKey=function(e,t,r,i){l((3&r)===r,\"The recovery param is more than two bits\"),t=new u(t,i);var s=this.n,o=new n(e),a=t.r,c=t.s,h=1&r,f=r>>1;if(a.cmp(this.curve.p.umod(this.curve.n))>=0&&f)throw new Error(\"Unable to find sencond key candinate\");a=f?this.curve.pointFromX(a.add(this.curve.n),h):this.curve.pointFromX(a,h);var d=t.r.invm(s),p=s.sub(o).mul(d).umod(s),m=c.mul(d).umod(s);return this.g.mulAdd(p,a,m)},h.prototype.getKeyRecoveryParam=function(e,t,r,n){if(null!==(t=new u(t,n)).recoveryParam)return t.recoveryParam;for(var i=0;i<4;i++){var s;try{s=this.recoverPubKey(e,t,i)}catch(e){continue}if(s.eq(r))return i}throw new Error(\"Unable to find valid recovery factor\")}},{\"../curves\":411,\"../utils\":419,\"./key\":413,\"./signature\":414,\"bn.js\":420,brorand:187,\"hmac-drbg\":438}],413:[function(e,t,r){\"use strict\";var n=e(\"bn.js\"),i=e(\"../utils\").assert;function s(e,t){this.ec=e,this.priv=null,this.pub=null,t.priv&&this._importPrivate(t.priv,t.privEnc),t.pub&&this._importPublic(t.pub,t.pubEnc)}t.exports=s,s.fromPublic=function(e,t,r){return t instanceof s?t:new s(e,{pub:t,pubEnc:r})},s.fromPrivate=function(e,t,r){return t instanceof s?t:new s(e,{priv:t,privEnc:r})},s.prototype.validate=function(){var e=this.getPublic();return e.isInfinity()?{result:!1,reason:\"Invalid public key\"}:e.validate()?e.mul(this.ec.curve.n).isInfinity()?{result:!0,reason:null}:{result:!1,reason:\"Public key * N != O\"}:{result:!1,reason:\"Public key is not a point\"}},s.prototype.getPublic=function(e,t){return\"string\"==typeof e&&(t=e,e=null),this.pub||(this.pub=this.ec.g.mul(this.priv)),t?this.pub.encode(t,e):this.pub},s.prototype.getPrivate=function(e){return\"hex\"===e?this.priv.toString(16,2):this.priv},s.prototype._importPrivate=function(e,t){this.priv=new n(e,t||16),this.priv=this.priv.umod(this.ec.curve.n)},s.prototype._importPublic=function(e,t){if(e.x||e.y)return\"mont\"===this.ec.curve.type?i(e.x,\"Need x coordinate\"):\"short\"!==this.ec.curve.type&&\"edwards\"!==this.ec.curve.type||i(e.x&&e.y,\"Need both x and y coordinate\"),void(this.pub=this.ec.curve.point(e.x,e.y));this.pub=this.ec.curve.decodePoint(e,t)},s.prototype.derive=function(e){return e.validate()||i(e.validate(),\"public point not validated\"),e.mul(this.priv).getX()},s.prototype.sign=function(e,t,r){return this.ec.sign(e,this,t,r)},s.prototype.verify=function(e,t){return this.ec.verify(e,t,this)},s.prototype.inspect=function(){return\"<Key priv: \"+(this.priv&&this.priv.toString(16,2))+\" pub: \"+(this.pub&&this.pub.inspect())+\" >\"}},{\"../utils\":419,\"bn.js\":420}],414:[function(e,t,r){\"use strict\";var n=e(\"bn.js\"),i=e(\"../utils\"),s=i.assert;function o(e,t){if(e instanceof o)return e;this._importDER(e,t)||(s(e.r&&e.s,\"Signature without r or s\"),this.r=new n(e.r,16),this.s=new n(e.s,16),void 0===e.recoveryParam?this.recoveryParam=null:this.recoveryParam=e.recoveryParam)}function a(){this.place=0}function l(e,t){var r=e[t.place++];if(!(128&r))return r;var n=15&r;if(0===n||n>4)return!1;for(var i=0,s=0,o=t.place;s<n;s++,o++)i<<=8,i|=e[o],i>>>=0;return!(i<=127)&&(t.place=o,i)}function c(e){for(var t=0,r=e.length-1;!e[t]&&!(128&e[t+1])&&t<r;)t++;return 0===t?e:e.slice(t)}function u(e,t){if(t<128)e.push(t);else{var r=1+(Math.log(t)/Math.LN2>>>3);for(e.push(128|r);--r;)e.push(t>>>(r<<3)&255);e.push(t)}}t.exports=o,o.prototype._importDER=function(e,t){e=i.toArray(e,t);var r=new a;if(48!==e[r.place++])return!1;var s=l(e,r);if(!1===s)return!1;if(s+r.place!==e.length)return!1;if(2!==e[r.place++])return!1;var o=l(e,r);if(!1===o)return!1;var c=e.slice(r.place,o+r.place);if(r.place+=o,2!==e[r.place++])return!1;var u=l(e,r);if(!1===u)return!1;if(e.length!==u+r.place)return!1;var h=e.slice(r.place,u+r.place);if(0===c[0]){if(!(128&c[1]))return!1;c=c.slice(1)}if(0===h[0]){if(!(128&h[1]))return!1;h=h.slice(1)}return this.r=new n(c),this.s=new n(h),this.recoveryParam=null,!0},o.prototype.toDER=function(e){var t=this.r.toArray(),r=this.s.toArray();for(128&t[0]&&(t=[0].concat(t)),128&r[0]&&(r=[0].concat(r)),t=c(t),r=c(r);!(r[0]||128&r[1]);)r=r.slice(1);var n=[2];u(n,t.length),(n=n.concat(t)).push(2),u(n,r.length);var s=n.concat(r),o=[48];return u(o,s.length),o=o.concat(s),i.encode(o,e)}},{\"../utils\":419,\"bn.js\":420}],415:[function(e,t,r){\"use strict\";var n=e(\"hash.js\"),i=e(\"../curves\"),s=e(\"../utils\"),o=s.assert,a=s.parseBytes,l=e(\"./key\"),c=e(\"./signature\");function u(e){if(o(\"ed25519\"===e,\"only tested with ed25519 so far\"),!(this instanceof u))return new u(e);e=i[e].curve,this.curve=e,this.g=e.g,this.g.precompute(e.n.bitLength()+1),this.pointClass=e.point().constructor,this.encodingLength=Math.ceil(e.n.bitLength()/8),this.hash=n.sha512}t.exports=u,u.prototype.sign=function(e,t){e=a(e);var r=this.keyFromSecret(t),n=this.hashInt(r.messagePrefix(),e),i=this.g.mul(n),s=this.encodePoint(i),o=this.hashInt(s,r.pubBytes(),e).mul(r.priv()),l=n.add(o).umod(this.curve.n);return this.makeSignature({R:i,S:l,Rencoded:s})},u.prototype.verify=function(e,t,r){e=a(e),t=this.makeSignature(t);var n=this.keyFromPublic(r),i=this.hashInt(t.Rencoded(),n.pubBytes(),e),s=this.g.mul(t.S());return t.R().add(n.pub().mul(i)).eq(s)},u.prototype.hashInt=function(){for(var e=this.hash(),t=0;t<arguments.length;t++)e.update(arguments[t]);return s.intFromLE(e.digest()).umod(this.curve.n)},u.prototype.keyFromPublic=function(e){return l.fromPublic(this,e)},u.prototype.keyFromSecret=function(e){return l.fromSecret(this,e)},u.prototype.makeSignature=function(e){return e instanceof c?e:new c(this,e)},u.prototype.encodePoint=function(e){var t=e.getY().toArray(\"le\",this.encodingLength);return t[this.encodingLength-1]|=e.getX().isOdd()?128:0,t},u.prototype.decodePoint=function(e){var t=(e=s.parseBytes(e)).length-1,r=e.slice(0,t).concat(-129&e[t]),n=0!=(128&e[t]),i=s.intFromLE(r);return this.curve.pointFromY(i,n)},u.prototype.encodeInt=function(e){return e.toArray(\"le\",this.encodingLength)},u.prototype.decodeInt=function(e){return s.intFromLE(e)},u.prototype.isPoint=function(e){return e instanceof this.pointClass}},{\"../curves\":411,\"../utils\":419,\"./key\":416,\"./signature\":417,\"hash.js\":426}],416:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=n.assert,s=n.parseBytes,o=n.cachedProperty;function a(e,t){this.eddsa=e,this._secret=s(t.secret),e.isPoint(t.pub)?this._pub=t.pub:this._pubBytes=s(t.pub)}a.fromPublic=function(e,t){return t instanceof a?t:new a(e,{pub:t})},a.fromSecret=function(e,t){return t instanceof a?t:new a(e,{secret:t})},a.prototype.secret=function(){return this._secret},o(a,\"pubBytes\",(function(){return this.eddsa.encodePoint(this.pub())})),o(a,\"pub\",(function(){return this._pubBytes?this.eddsa.decodePoint(this._pubBytes):this.eddsa.g.mul(this.priv())})),o(a,\"privBytes\",(function(){var e=this.eddsa,t=this.hash(),r=e.encodingLength-1,n=t.slice(0,e.encodingLength);return n[0]&=248,n[r]&=127,n[r]|=64,n})),o(a,\"priv\",(function(){return this.eddsa.decodeInt(this.privBytes())})),o(a,\"hash\",(function(){return this.eddsa.hash().update(this.secret()).digest()})),o(a,\"messagePrefix\",(function(){return this.hash().slice(this.eddsa.encodingLength)})),a.prototype.sign=function(e){return i(this._secret,\"KeyPair can only verify\"),this.eddsa.sign(e,this)},a.prototype.verify=function(e,t){return this.eddsa.verify(e,t,this)},a.prototype.getSecret=function(e){return i(this._secret,\"KeyPair is public only\"),n.encode(this.secret(),e)},a.prototype.getPublic=function(e){return n.encode(this.pubBytes(),e)},t.exports=a},{\"../utils\":419}],417:[function(e,t,r){\"use strict\";var n=e(\"bn.js\"),i=e(\"../utils\"),s=i.assert,o=i.cachedProperty,a=i.parseBytes;function l(e,t){this.eddsa=e,\"object\"!=typeof t&&(t=a(t)),Array.isArray(t)&&(t={R:t.slice(0,e.encodingLength),S:t.slice(e.encodingLength)}),s(t.R&&t.S,\"Signature without R or S\"),e.isPoint(t.R)&&(this._R=t.R),t.S instanceof n&&(this._S=t.S),this._Rencoded=Array.isArray(t.R)?t.R:t.Rencoded,this._Sencoded=Array.isArray(t.S)?t.S:t.Sencoded}o(l,\"S\",(function(){return this.eddsa.decodeInt(this.Sencoded())})),o(l,\"R\",(function(){return this.eddsa.decodePoint(this.Rencoded())})),o(l,\"Rencoded\",(function(){return this.eddsa.encodePoint(this.R())})),o(l,\"Sencoded\",(function(){return this.eddsa.encodeInt(this.S())})),l.prototype.toBytes=function(){return this.Rencoded().concat(this.Sencoded())},l.prototype.toHex=function(){return i.encode(this.toBytes(),\"hex\").toUpperCase()},t.exports=l},{\"../utils\":419,\"bn.js\":420}],418:[function(e,t,r){\"use strict\";t.exports={doubles:{step:4,points:[[\"e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a\",\"f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821\"],[\"8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508\",\"11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf\"],[\"175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739\",\"d3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695\"],[\"363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640\",\"4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9\"],[\"8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c\",\"4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36\"],[\"723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda\",\"96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f\"],[\"eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa\",\"5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999\"],[\"100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0\",\"cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09\"],[\"e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d\",\"9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d\"],[\"feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d\",\"e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088\"],[\"da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1\",\"9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d\"],[\"53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0\",\"5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8\"],[\"8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047\",\"10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a\"],[\"385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862\",\"283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453\"],[\"6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7\",\"7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160\"],[\"3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd\",\"56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0\"],[\"85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83\",\"7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6\"],[\"948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a\",\"53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589\"],[\"6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8\",\"bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17\"],[\"e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d\",\"4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda\"],[\"e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725\",\"7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd\"],[\"213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754\",\"4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2\"],[\"4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c\",\"17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6\"],[\"fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6\",\"6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f\"],[\"76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39\",\"c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01\"],[\"c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891\",\"893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3\"],[\"d895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b\",\"febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f\"],[\"b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03\",\"2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7\"],[\"e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d\",\"eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78\"],[\"a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070\",\"7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1\"],[\"90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4\",\"e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150\"],[\"8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da\",\"662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82\"],[\"e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11\",\"1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc\"],[\"8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e\",\"efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b\"],[\"e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41\",\"2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51\"],[\"b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef\",\"67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45\"],[\"d68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8\",\"db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120\"],[\"324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d\",\"648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84\"],[\"4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96\",\"35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d\"],[\"9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd\",\"ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d\"],[\"6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5\",\"9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8\"],[\"a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266\",\"40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8\"],[\"7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71\",\"34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac\"],[\"928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac\",\"c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f\"],[\"85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751\",\"1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962\"],[\"ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e\",\"493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907\"],[\"827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241\",\"c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec\"],[\"eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3\",\"be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d\"],[\"e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f\",\"4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414\"],[\"1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19\",\"aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd\"],[\"146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be\",\"b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0\"],[\"fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9\",\"6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811\"],[\"da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2\",\"8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1\"],[\"a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13\",\"7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c\"],[\"174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c\",\"ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73\"],[\"959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba\",\"2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd\"],[\"d2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151\",\"e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405\"],[\"64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073\",\"d99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589\"],[\"8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458\",\"38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e\"],[\"13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b\",\"69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27\"],[\"bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366\",\"d3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1\"],[\"8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa\",\"40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482\"],[\"8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0\",\"620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945\"],[\"dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787\",\"7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573\"],[\"f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e\",\"ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82\"]]},naf:{wnd:7,points:[[\"f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9\",\"388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672\"],[\"2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4\",\"d8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6\"],[\"5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc\",\"6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da\"],[\"acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe\",\"cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37\"],[\"774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb\",\"d984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b\"],[\"f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8\",\"ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81\"],[\"d7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e\",\"581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58\"],[\"defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34\",\"4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77\"],[\"2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c\",\"85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a\"],[\"352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5\",\"321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c\"],[\"2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f\",\"2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67\"],[\"9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714\",\"73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402\"],[\"daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729\",\"a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55\"],[\"c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db\",\"2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482\"],[\"6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4\",\"e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82\"],[\"1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5\",\"b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396\"],[\"605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479\",\"2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49\"],[\"62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d\",\"80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf\"],[\"80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f\",\"1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a\"],[\"7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb\",\"d0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7\"],[\"d528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9\",\"eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933\"],[\"49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963\",\"758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a\"],[\"77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74\",\"958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6\"],[\"f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530\",\"e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37\"],[\"463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b\",\"5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e\"],[\"f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247\",\"cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6\"],[\"caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1\",\"cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476\"],[\"2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120\",\"4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40\"],[\"7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435\",\"91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61\"],[\"754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18\",\"673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683\"],[\"e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8\",\"59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5\"],[\"186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb\",\"3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b\"],[\"df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f\",\"55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417\"],[\"5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143\",\"efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868\"],[\"290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba\",\"e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a\"],[\"af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45\",\"f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6\"],[\"766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a\",\"744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996\"],[\"59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e\",\"c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e\"],[\"f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8\",\"e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d\"],[\"7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c\",\"30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2\"],[\"948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519\",\"e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e\"],[\"7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab\",\"100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437\"],[\"3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca\",\"ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311\"],[\"d3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf\",\"8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4\"],[\"1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610\",\"68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575\"],[\"733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4\",\"f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d\"],[\"15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c\",\"d56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d\"],[\"a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940\",\"edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629\"],[\"e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980\",\"a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06\"],[\"311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3\",\"66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374\"],[\"34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf\",\"9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee\"],[\"f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63\",\"4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1\"],[\"d7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448\",\"fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b\"],[\"32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf\",\"5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661\"],[\"7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5\",\"8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6\"],[\"ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6\",\"8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e\"],[\"16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5\",\"5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d\"],[\"eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99\",\"f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc\"],[\"78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51\",\"f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4\"],[\"494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5\",\"42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c\"],[\"a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5\",\"204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b\"],[\"c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997\",\"4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913\"],[\"841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881\",\"73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154\"],[\"5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5\",\"39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865\"],[\"36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66\",\"d2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc\"],[\"336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726\",\"ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224\"],[\"8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede\",\"6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e\"],[\"1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94\",\"60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6\"],[\"85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31\",\"3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511\"],[\"29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51\",\"b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b\"],[\"a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252\",\"ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2\"],[\"4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5\",\"cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c\"],[\"d24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b\",\"6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3\"],[\"ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4\",\"322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d\"],[\"af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f\",\"6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700\"],[\"e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889\",\"2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4\"],[\"591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246\",\"b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196\"],[\"11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984\",\"998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4\"],[\"3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a\",\"b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257\"],[\"cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030\",\"bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13\"],[\"c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197\",\"6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096\"],[\"c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593\",\"c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38\"],[\"a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef\",\"21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f\"],[\"347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38\",\"60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448\"],[\"da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a\",\"49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a\"],[\"c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111\",\"5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4\"],[\"4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502\",\"7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437\"],[\"3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea\",\"be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7\"],[\"cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26\",\"8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d\"],[\"b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986\",\"39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a\"],[\"d4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e\",\"62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54\"],[\"48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4\",\"25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77\"],[\"dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda\",\"ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517\"],[\"6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859\",\"cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10\"],[\"e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f\",\"f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125\"],[\"eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c\",\"6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e\"],[\"13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942\",\"fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1\"],[\"ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a\",\"1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2\"],[\"b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80\",\"5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423\"],[\"ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d\",\"438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8\"],[\"8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1\",\"cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758\"],[\"52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63\",\"c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375\"],[\"e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352\",\"6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d\"],[\"7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193\",\"ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec\"],[\"5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00\",\"9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0\"],[\"32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58\",\"ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c\"],[\"e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7\",\"d3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4\"],[\"8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8\",\"c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f\"],[\"4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e\",\"67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649\"],[\"3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d\",\"cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826\"],[\"674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b\",\"299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5\"],[\"d32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f\",\"f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87\"],[\"30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6\",\"462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b\"],[\"be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297\",\"62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc\"],[\"93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a\",\"7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c\"],[\"b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c\",\"ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f\"],[\"d5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52\",\"4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a\"],[\"d3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb\",\"bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46\"],[\"463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065\",\"bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f\"],[\"7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917\",\"603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03\"],[\"74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9\",\"cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08\"],[\"30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3\",\"553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8\"],[\"9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57\",\"712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373\"],[\"176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66\",\"ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3\"],[\"75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8\",\"9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8\"],[\"809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721\",\"9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1\"],[\"1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180\",\"4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9\"]]}}},{}],419:[function(e,t,r){\"use strict\";var n=r,i=e(\"bn.js\"),s=e(\"minimalistic-assert\"),o=e(\"minimalistic-crypto-utils\");n.assert=s,n.toArray=o.toArray,n.zero2=o.zero2,n.toHex=o.toHex,n.encode=o.encode,n.getNAF=function(e,t,r){var n=new Array(Math.max(e.bitLength(),r)+1);n.fill(0);for(var i=1<<t+1,s=e.clone(),o=0;o<n.length;o++){var a,l=s.andln(i-1);s.isOdd()?(a=l>(i>>1)-1?(i>>1)-l:l,s.isubn(a)):a=0,n[o]=a,s.iushrn(1)}return n},n.getJSF=function(e,t){var r=[[],[]];e=e.clone(),t=t.clone();for(var n,i=0,s=0;e.cmpn(-i)>0||t.cmpn(-s)>0;){var o,a,l=e.andln(3)+i&3,c=t.andln(3)+s&3;3===l&&(l=-1),3===c&&(c=-1),o=0==(1&l)?0:3!==(n=e.andln(7)+i&7)&&5!==n||2!==c?l:-l,r[0].push(o),a=0==(1&c)?0:3!==(n=t.andln(7)+s&7)&&5!==n||2!==l?c:-c,r[1].push(a),2*i===o+1&&(i=1-i),2*s===a+1&&(s=1-s),e.iushrn(1),t.iushrn(1)}return r},n.cachedProperty=function(e,t,r){var n=\"_\"+t;e.prototype[t]=function(){return void 0!==this[n]?this[n]:this[n]=r.call(this)}},n.parseBytes=function(e){return\"string\"==typeof e?n.toArray(e,\"hex\"):e},n.intFromLE=function(e){return new i(e,\"hex\",\"le\")}},{\"bn.js\":420,\"minimalistic-assert\":453,\"minimalistic-crypto-utils\":454}],420:[function(e,t,r){arguments[4][184][0].apply(r,arguments)},{buffer:188,dup:184}],421:[function(e,t,r){t.exports={name:\"elliptic\",version:\"6.5.4\",description:\"EC cryptography\",main:\"lib/elliptic.js\",files:[\"lib\"],scripts:{lint:\"eslint lib test\",\"lint:fix\":\"npm run lint -- --fix\",unit:\"istanbul test _mocha --reporter=spec test/index.js\",test:\"npm run lint && npm run unit\",version:\"grunt dist && git add dist/\"},repository:{type:\"git\",url:\"git@github.com:indutny/elliptic\"},keywords:[\"EC\",\"Elliptic\",\"curve\",\"Cryptography\"],author:\"Fedor Indutny <fedor@indutny.com>\",license:\"MIT\",bugs:{url:\"https://github.com/indutny/elliptic/issues\"},homepage:\"https://github.com/indutny/elliptic\",devDependencies:{brfs:\"^2.0.2\",coveralls:\"^3.1.0\",eslint:\"^7.6.0\",grunt:\"^1.2.1\",\"grunt-browserify\":\"^5.3.0\",\"grunt-cli\":\"^1.3.2\",\"grunt-contrib-connect\":\"^3.0.0\",\"grunt-contrib-copy\":\"^1.0.0\",\"grunt-contrib-uglify\":\"^5.0.0\",\"grunt-mocha-istanbul\":\"^5.0.2\",\"grunt-saucelabs\":\"^9.0.1\",istanbul:\"^0.4.5\",mocha:\"^8.0.1\"},dependencies:{\"bn.js\":\"^4.11.9\",brorand:\"^1.1.0\",\"hash.js\":\"^1.0.0\",\"hmac-drbg\":\"^1.0.1\",inherits:\"^2.0.4\",\"minimalistic-assert\":\"^1.0.1\",\"minimalistic-crypto-utils\":\"^1.0.1\"}}},{}],422:[function(e,t,r){\"use strict\";var n=Object.create||function(e){var t=function(){};return t.prototype=e,new t},i=Object.keys||function(e){var t=[];for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.push(r);return r},s=Function.prototype.bind||function(e){var t=this;return function(){return t.apply(e,arguments)}};function o(){this._events&&Object.prototype.hasOwnProperty.call(this,\"_events\")||(this._events=n(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0}t.exports=o,o.EventEmitter=o,o.prototype._events=void 0,o.prototype._maxListeners=void 0;var a,l=10;try{var c={};Object.defineProperty&&Object.defineProperty(c,\"x\",{value:0}),a=0===c.x}catch(e){a=!1}function u(e){return void 0===e._maxListeners?o.defaultMaxListeners:e._maxListeners}function h(e,t,r){if(t)e.call(r);else for(var n=e.length,i=_(e,n),s=0;s<n;++s)i[s].call(r)}function f(e,t,r,n){if(t)e.call(r,n);else for(var i=e.length,s=_(e,i),o=0;o<i;++o)s[o].call(r,n)}function d(e,t,r,n,i){if(t)e.call(r,n,i);else for(var s=e.length,o=_(e,s),a=0;a<s;++a)o[a].call(r,n,i)}function p(e,t,r,n,i,s){if(t)e.call(r,n,i,s);else for(var o=e.length,a=_(e,o),l=0;l<o;++l)a[l].call(r,n,i,s)}function m(e,t,r,n){if(t)e.apply(r,n);else for(var i=e.length,s=_(e,i),o=0;o<i;++o)s[o].apply(r,n)}function b(e,t,r,i){var s,o,a;if(\"function\"!=typeof r)throw new TypeError('\"listener\" argument must be a function');if((o=e._events)?(o.newListener&&(e.emit(\"newListener\",t,r.listener?r.listener:r),o=e._events),a=o[t]):(o=e._events=n(null),e._eventsCount=0),a){if(\"function\"==typeof a?a=o[t]=i?[r,a]:[a,r]:i?a.unshift(r):a.push(r),!a.warned&&(s=u(e))&&s>0&&a.length>s){a.warned=!0;var l=new Error(\"Possible EventEmitter memory leak detected. \"+a.length+' \"'+String(t)+'\" listeners added. Use emitter.setMaxListeners() to increase limit.');l.name=\"MaxListenersExceededWarning\",l.emitter=e,l.type=t,l.count=a.length,\"object\"==typeof console&&console.warn&&console.warn(\"%s: %s\",l.name,l.message)}}else a=o[t]=r,++e._eventsCount;return e}function g(){if(!this.fired)switch(this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length){case 0:return this.listener.call(this.target);case 1:return this.listener.call(this.target,arguments[0]);case 2:return this.listener.call(this.target,arguments[0],arguments[1]);case 3:return this.listener.call(this.target,arguments[0],arguments[1],arguments[2]);default:for(var e=new Array(arguments.length),t=0;t<e.length;++t)e[t]=arguments[t];this.listener.apply(this.target,e)}}function y(e,t,r){var n={fired:!1,wrapFn:void 0,target:e,type:t,listener:r},i=s.call(g,n);return i.listener=r,n.wrapFn=i,i}function v(e,t,r){var n=e._events;if(!n)return[];var i=n[t];return i?\"function\"==typeof i?r?[i.listener||i]:[i]:r?function(e){for(var t=new Array(e.length),r=0;r<t.length;++r)t[r]=e[r].listener||e[r];return t}(i):_(i,i.length):[]}function w(e){var t=this._events;if(t){var r=t[e];if(\"function\"==typeof r)return 1;if(r)return r.length}return 0}function _(e,t){for(var r=new Array(t),n=0;n<t;++n)r[n]=e[n];return r}a?Object.defineProperty(o,\"defaultMaxListeners\",{enumerable:!0,get:function(){return l},set:function(e){if(\"number\"!=typeof e||e<0||e!=e)throw new TypeError('\"defaultMaxListeners\" must be a positive number');l=e}}):o.defaultMaxListeners=l,o.prototype.setMaxListeners=function(e){if(\"number\"!=typeof e||e<0||isNaN(e))throw new TypeError('\"n\" argument must be a positive number');return this._maxListeners=e,this},o.prototype.getMaxListeners=function(){return u(this)},o.prototype.emit=function(e){var t,r,n,i,s,o,a=\"error\"===e;if(o=this._events)a=a&&null==o.error;else if(!a)return!1;if(a){if(arguments.length>1&&(t=arguments[1]),t instanceof Error)throw t;var l=new Error('Unhandled \"error\" event. ('+t+\")\");throw l.context=t,l}if(!(r=o[e]))return!1;var c=\"function\"==typeof r;switch(n=arguments.length){case 1:h(r,c,this);break;case 2:f(r,c,this,arguments[1]);break;case 3:d(r,c,this,arguments[1],arguments[2]);break;case 4:p(r,c,this,arguments[1],arguments[2],arguments[3]);break;default:for(i=new Array(n-1),s=1;s<n;s++)i[s-1]=arguments[s];m(r,c,this,i)}return!0},o.prototype.addListener=function(e,t){return b(this,e,t,!1)},o.prototype.on=o.prototype.addListener,o.prototype.prependListener=function(e,t){return b(this,e,t,!0)},o.prototype.once=function(e,t){if(\"function\"!=typeof t)throw new TypeError('\"listener\" argument must be a function');return this.on(e,y(this,e,t)),this},o.prototype.prependOnceListener=function(e,t){if(\"function\"!=typeof t)throw new TypeError('\"listener\" argument must be a function');return this.prependListener(e,y(this,e,t)),this},o.prototype.removeListener=function(e,t){var r,i,s,o,a;if(\"function\"!=typeof t)throw new TypeError('\"listener\" argument must be a function');if(!(i=this._events))return this;if(!(r=i[e]))return this;if(r===t||r.listener===t)0==--this._eventsCount?this._events=n(null):(delete i[e],i.removeListener&&this.emit(\"removeListener\",e,r.listener||t));else if(\"function\"!=typeof r){for(s=-1,o=r.length-1;o>=0;o--)if(r[o]===t||r[o].listener===t){a=r[o].listener,s=o;break}if(s<0)return this;0===s?r.shift():function(e,t){for(var r=t,n=r+1,i=e.length;n<i;r+=1,n+=1)e[r]=e[n];e.pop()}(r,s),1===r.length&&(i[e]=r[0]),i.removeListener&&this.emit(\"removeListener\",e,a||t)}return this},o.prototype.removeAllListeners=function(e){var t,r,s;if(!(r=this._events))return this;if(!r.removeListener)return 0===arguments.length?(this._events=n(null),this._eventsCount=0):r[e]&&(0==--this._eventsCount?this._events=n(null):delete r[e]),this;if(0===arguments.length){var o,a=i(r);for(s=0;s<a.length;++s)\"removeListener\"!==(o=a[s])&&this.removeAllListeners(o);return this.removeAllListeners(\"removeListener\"),this._events=n(null),this._eventsCount=0,this}if(\"function\"==typeof(t=r[e]))this.removeListener(e,t);else if(t)for(s=t.length-1;s>=0;s--)this.removeListener(e,t[s]);return this},o.prototype.listeners=function(e){return v(this,e,!0)},o.prototype.rawListeners=function(e){return v(this,e,!1)},o.listenerCount=function(e,t){return\"function\"==typeof e.listenerCount?e.listenerCount(t):w.call(e,t)},o.prototype.listenerCount=w,o.prototype.eventNames=function(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]}},{}],423:[function(e,t,r){\"use strict\";var n=e(\"safe-buffer\").Buffer,i=e(\"md5.js\");t.exports=function(e,t,r,s){if(n.isBuffer(e)||(e=n.from(e,\"binary\")),t&&(n.isBuffer(t)||(t=n.from(t,\"binary\")),8!==t.length))throw new RangeError(\"salt should be Buffer with 8 byte length\");for(var o=r/8,a=n.alloc(o),l=n.alloc(s||0),c=n.alloc(0);o>0||s>0;){var u=new i;u.update(c),u.update(e),t&&u.update(t),c=u.digest();var h=0;if(o>0){var f=a.length-o;h=Math.min(o,c.length),c.copy(a,f,0,h),o-=h}if(h<c.length&&s>0){var d=l.length-s,p=Math.min(s,c.length-h);c.copy(l,d,h,h+p),s-=p}}return c.fill(0),{key:a,iv:l}}},{\"md5.js\":450,\"safe-buffer\":494}],424:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.CsvParserStream=r.ParserOptions=r.parseFile=r.parseStream=r.parseString=r.parse=r.FormatterOptions=r.CsvFormatterStream=r.writeToPath=r.writeToString=r.writeToBuffer=r.writeToStream=r.write=r.format=void 0;var n=e(\"@fast-csv/format\");Object.defineProperty(r,\"format\",{enumerable:!0,get:function(){return n.format}}),Object.defineProperty(r,\"write\",{enumerable:!0,get:function(){return n.write}}),Object.defineProperty(r,\"writeToStream\",{enumerable:!0,get:function(){return n.writeToStream}}),Object.defineProperty(r,\"writeToBuffer\",{enumerable:!0,get:function(){return n.writeToBuffer}}),Object.defineProperty(r,\"writeToString\",{enumerable:!0,get:function(){return n.writeToString}}),Object.defineProperty(r,\"writeToPath\",{enumerable:!0,get:function(){return n.writeToPath}}),Object.defineProperty(r,\"CsvFormatterStream\",{enumerable:!0,get:function(){return n.CsvFormatterStream}}),Object.defineProperty(r,\"FormatterOptions\",{enumerable:!0,get:function(){return n.FormatterOptions}});var i=e(\"@fast-csv/parse\");Object.defineProperty(r,\"parse\",{enumerable:!0,get:function(){return i.parse}}),Object.defineProperty(r,\"parseString\",{enumerable:!0,get:function(){return i.parseString}}),Object.defineProperty(r,\"parseStream\",{enumerable:!0,get:function(){return i.parseStream}}),Object.defineProperty(r,\"parseFile\",{enumerable:!0,get:function(){return i.parseFile}}),Object.defineProperty(r,\"ParserOptions\",{enumerable:!0,get:function(){return i.ParserOptions}}),Object.defineProperty(r,\"CsvParserStream\",{enumerable:!0,get:function(){return i.CsvParserStream}})},{\"@fast-csv/format\":151,\"@fast-csv/parse\":155}],425:[function(e,t,r){\"use strict\";var n=e(\"safe-buffer\").Buffer,i=e(\"readable-stream\").Transform;function s(e){i.call(this),this._block=n.allocUnsafe(e),this._blockSize=e,this._blockOffset=0,this._length=[0,0,0,0],this._finalized=!1}e(\"inherits\")(s,i),s.prototype._transform=function(e,t,r){var n=null;try{this.update(e,t)}catch(e){n=e}r(n)},s.prototype._flush=function(e){var t=null;try{this.push(this.digest())}catch(e){t=e}e(t)},s.prototype.update=function(e,t){if(function(e,t){if(!n.isBuffer(e)&&\"string\"!=typeof e)throw new TypeError(t+\" must be a string or a buffer\")}(e,\"Data\"),this._finalized)throw new Error(\"Digest already called\");n.isBuffer(e)||(e=n.from(e,t));for(var r=this._block,i=0;this._blockOffset+e.length-i>=this._blockSize;){for(var s=this._blockOffset;s<this._blockSize;)r[s++]=e[i++];this._update(),this._blockOffset=0}for(;i<e.length;)r[this._blockOffset++]=e[i++];for(var o=0,a=8*e.length;a>0;++o)this._length[o]+=a,(a=this._length[o]/4294967296|0)>0&&(this._length[o]-=4294967296*a);return this},s.prototype._update=function(){throw new Error(\"_update is not implemented\")},s.prototype.digest=function(e){if(this._finalized)throw new Error(\"Digest already called\");this._finalized=!0;var t=this._digest();void 0!==e&&(t=t.toString(e)),this._block.fill(0),this._blockOffset=0;for(var r=0;r<4;++r)this._length[r]=0;return t},s.prototype._digest=function(){throw new Error(\"_digest is not implemented\")},t.exports=s},{inherits:440,\"readable-stream\":491,\"safe-buffer\":494}],426:[function(e,t,r){\"use strict\";var n=r;n.utils=e(\"./hash/utils\"),n.common=e(\"./hash/common\"),n.sha=e(\"./hash/sha\"),n.ripemd=e(\"./hash/ripemd\"),n.hmac=e(\"./hash/hmac\"),n.sha1=n.sha.sha1,n.sha256=n.sha.sha256,n.sha224=n.sha.sha224,n.sha384=n.sha.sha384,n.sha512=n.sha.sha512,n.ripemd160=n.ripemd.ripemd160},{\"./hash/common\":427,\"./hash/hmac\":428,\"./hash/ripemd\":429,\"./hash/sha\":430,\"./hash/utils\":437}],427:[function(e,t,r){\"use strict\";var n=e(\"./utils\"),i=e(\"minimalistic-assert\");function s(){this.pending=null,this.pendingTotal=0,this.blockSize=this.constructor.blockSize,this.outSize=this.constructor.outSize,this.hmacStrength=this.constructor.hmacStrength,this.padLength=this.constructor.padLength/8,this.endian=\"big\",this._delta8=this.blockSize/8,this._delta32=this.blockSize/32}r.BlockHash=s,s.prototype.update=function(e,t){if(e=n.toArray(e,t),this.pending?this.pending=this.pending.concat(e):this.pending=e,this.pendingTotal+=e.length,this.pending.length>=this._delta8){var r=(e=this.pending).length%this._delta8;this.pending=e.slice(e.length-r,e.length),0===this.pending.length&&(this.pending=null),e=n.join32(e,0,e.length-r,this.endian);for(var i=0;i<e.length;i+=this._delta32)this._update(e,i,i+this._delta32)}return this},s.prototype.digest=function(e){return this.update(this._pad()),i(null===this.pending),this._digest(e)},s.prototype._pad=function(){var e=this.pendingTotal,t=this._delta8,r=t-(e+this.padLength)%t,n=new Array(r+this.padLength);n[0]=128;for(var i=1;i<r;i++)n[i]=0;if(e<<=3,\"big\"===this.endian){for(var s=8;s<this.padLength;s++)n[i++]=0;n[i++]=0,n[i++]=0,n[i++]=0,n[i++]=0,n[i++]=e>>>24&255,n[i++]=e>>>16&255,n[i++]=e>>>8&255,n[i++]=255&e}else for(n[i++]=255&e,n[i++]=e>>>8&255,n[i++]=e>>>16&255,n[i++]=e>>>24&255,n[i++]=0,n[i++]=0,n[i++]=0,n[i++]=0,s=8;s<this.padLength;s++)n[i++]=0;return n}},{\"./utils\":437,\"minimalistic-assert\":453}],428:[function(e,t,r){\"use strict\";var n=e(\"./utils\"),i=e(\"minimalistic-assert\");function s(e,t,r){if(!(this instanceof s))return new s(e,t,r);this.Hash=e,this.blockSize=e.blockSize/8,this.outSize=e.outSize/8,this.inner=null,this.outer=null,this._init(n.toArray(t,r))}t.exports=s,s.prototype._init=function(e){e.length>this.blockSize&&(e=(new this.Hash).update(e).digest()),i(e.length<=this.blockSize);for(var t=e.length;t<this.blockSize;t++)e.push(0);for(t=0;t<e.length;t++)e[t]^=54;for(this.inner=(new this.Hash).update(e),t=0;t<e.length;t++)e[t]^=106;this.outer=(new this.Hash).update(e)},s.prototype.update=function(e,t){return this.inner.update(e,t),this},s.prototype.digest=function(e){return this.outer.update(this.inner.digest()),this.outer.digest(e)}},{\"./utils\":437,\"minimalistic-assert\":453}],429:[function(e,t,r){\"use strict\";var n=e(\"./utils\"),i=e(\"./common\"),s=n.rotl32,o=n.sum32,a=n.sum32_3,l=n.sum32_4,c=i.BlockHash;function u(){if(!(this instanceof u))return new u;c.call(this),this.h=[1732584193,4023233417,2562383102,271733878,3285377520],this.endian=\"little\"}function h(e,t,r,n){return e<=15?t^r^n:e<=31?t&r|~t&n:e<=47?(t|~r)^n:e<=63?t&n|r&~n:t^(r|~n)}function f(e){return e<=15?0:e<=31?1518500249:e<=47?1859775393:e<=63?2400959708:2840853838}function d(e){return e<=15?1352829926:e<=31?1548603684:e<=47?1836072691:e<=63?2053994217:0}n.inherits(u,c),r.ripemd160=u,u.blockSize=512,u.outSize=160,u.hmacStrength=192,u.padLength=64,u.prototype._update=function(e,t){for(var r=this.h[0],n=this.h[1],i=this.h[2],c=this.h[3],u=this.h[4],y=r,v=n,w=i,_=c,x=u,k=0;k<80;k++){var S=o(s(l(r,h(k,n,i,c),e[p[k]+t],f(k)),b[k]),u);r=u,u=c,c=s(i,10),i=n,n=S,S=o(s(l(y,h(79-k,v,w,_),e[m[k]+t],d(k)),g[k]),x),y=x,x=_,_=s(w,10),w=v,v=S}S=a(this.h[1],i,_),this.h[1]=a(this.h[2],c,x),this.h[2]=a(this.h[3],u,y),this.h[3]=a(this.h[4],r,v),this.h[4]=a(this.h[0],n,w),this.h[0]=S},u.prototype._digest=function(e){return\"hex\"===e?n.toHex32(this.h,\"little\"):n.split32(this.h,\"little\")};var p=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13],m=[5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11],b=[11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6],g=[8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]},{\"./common\":427,\"./utils\":437}],430:[function(e,t,r){\"use strict\";r.sha1=e(\"./sha/1\"),r.sha224=e(\"./sha/224\"),r.sha256=e(\"./sha/256\"),r.sha384=e(\"./sha/384\"),r.sha512=e(\"./sha/512\")},{\"./sha/1\":431,\"./sha/224\":432,\"./sha/256\":433,\"./sha/384\":434,\"./sha/512\":435}],431:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"../common\"),s=e(\"./common\"),o=n.rotl32,a=n.sum32,l=n.sum32_5,c=s.ft_1,u=i.BlockHash,h=[1518500249,1859775393,2400959708,3395469782];function f(){if(!(this instanceof f))return new f;u.call(this),this.h=[1732584193,4023233417,2562383102,271733878,3285377520],this.W=new Array(80)}n.inherits(f,u),t.exports=f,f.blockSize=512,f.outSize=160,f.hmacStrength=80,f.padLength=64,f.prototype._update=function(e,t){for(var r=this.W,n=0;n<16;n++)r[n]=e[t+n];for(;n<r.length;n++)r[n]=o(r[n-3]^r[n-8]^r[n-14]^r[n-16],1);var i=this.h[0],s=this.h[1],u=this.h[2],f=this.h[3],d=this.h[4];for(n=0;n<r.length;n++){var p=~~(n/20),m=l(o(i,5),c(p,s,u,f),d,r[n],h[p]);d=f,f=u,u=o(s,30),s=i,i=m}this.h[0]=a(this.h[0],i),this.h[1]=a(this.h[1],s),this.h[2]=a(this.h[2],u),this.h[3]=a(this.h[3],f),this.h[4]=a(this.h[4],d)},f.prototype._digest=function(e){return\"hex\"===e?n.toHex32(this.h,\"big\"):n.split32(this.h,\"big\")}},{\"../common\":427,\"../utils\":437,\"./common\":436}],432:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"./256\");function s(){if(!(this instanceof s))return new s;i.call(this),this.h=[3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428]}n.inherits(s,i),t.exports=s,s.blockSize=512,s.outSize=224,s.hmacStrength=192,s.padLength=64,s.prototype._digest=function(e){return\"hex\"===e?n.toHex32(this.h.slice(0,7),\"big\"):n.split32(this.h.slice(0,7),\"big\")}},{\"../utils\":437,\"./256\":433}],433:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"../common\"),s=e(\"./common\"),o=e(\"minimalistic-assert\"),a=n.sum32,l=n.sum32_4,c=n.sum32_5,u=s.ch32,h=s.maj32,f=s.s0_256,d=s.s1_256,p=s.g0_256,m=s.g1_256,b=i.BlockHash,g=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];function y(){if(!(this instanceof y))return new y;b.call(this),this.h=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],this.k=g,this.W=new Array(64)}n.inherits(y,b),t.exports=y,y.blockSize=512,y.outSize=256,y.hmacStrength=192,y.padLength=64,y.prototype._update=function(e,t){for(var r=this.W,n=0;n<16;n++)r[n]=e[t+n];for(;n<r.length;n++)r[n]=l(m(r[n-2]),r[n-7],p(r[n-15]),r[n-16]);var i=this.h[0],s=this.h[1],b=this.h[2],g=this.h[3],y=this.h[4],v=this.h[5],w=this.h[6],_=this.h[7];for(o(this.k.length===r.length),n=0;n<r.length;n++){var x=c(_,d(y),u(y,v,w),this.k[n],r[n]),k=a(f(i),h(i,s,b));_=w,w=v,v=y,y=a(g,x),g=b,b=s,s=i,i=a(x,k)}this.h[0]=a(this.h[0],i),this.h[1]=a(this.h[1],s),this.h[2]=a(this.h[2],b),this.h[3]=a(this.h[3],g),this.h[4]=a(this.h[4],y),this.h[5]=a(this.h[5],v),this.h[6]=a(this.h[6],w),this.h[7]=a(this.h[7],_)},y.prototype._digest=function(e){return\"hex\"===e?n.toHex32(this.h,\"big\"):n.split32(this.h,\"big\")}},{\"../common\":427,\"../utils\":437,\"./common\":436,\"minimalistic-assert\":453}],434:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"./512\");function s(){if(!(this instanceof s))return new s;i.call(this),this.h=[3418070365,3238371032,1654270250,914150663,2438529370,812702999,355462360,4144912697,1731405415,4290775857,2394180231,1750603025,3675008525,1694076839,1203062813,3204075428]}n.inherits(s,i),t.exports=s,s.blockSize=1024,s.outSize=384,s.hmacStrength=192,s.padLength=128,s.prototype._digest=function(e){return\"hex\"===e?n.toHex32(this.h.slice(0,12),\"big\"):n.split32(this.h.slice(0,12),\"big\")}},{\"../utils\":437,\"./512\":435}],435:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"../common\"),s=e(\"minimalistic-assert\"),o=n.rotr64_hi,a=n.rotr64_lo,l=n.shr64_hi,c=n.shr64_lo,u=n.sum64,h=n.sum64_hi,f=n.sum64_lo,d=n.sum64_4_hi,p=n.sum64_4_lo,m=n.sum64_5_hi,b=n.sum64_5_lo,g=i.BlockHash,y=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591];function v(){if(!(this instanceof v))return new v;g.call(this),this.h=[1779033703,4089235720,3144134277,2227873595,1013904242,4271175723,2773480762,1595750129,1359893119,2917565137,2600822924,725511199,528734635,4215389547,1541459225,327033209],this.k=y,this.W=new Array(160)}function w(e,t,r,n,i){var s=e&r^~e&i;return s<0&&(s+=4294967296),s}function _(e,t,r,n,i,s){var o=t&n^~t&s;return o<0&&(o+=4294967296),o}function x(e,t,r,n,i){var s=e&r^e&i^r&i;return s<0&&(s+=4294967296),s}function k(e,t,r,n,i,s){var o=t&n^t&s^n&s;return o<0&&(o+=4294967296),o}function S(e,t){var r=o(e,t,28)^o(t,e,2)^o(t,e,7);return r<0&&(r+=4294967296),r}function M(e,t){var r=a(e,t,28)^a(t,e,2)^a(t,e,7);return r<0&&(r+=4294967296),r}function C(e,t){var r=o(e,t,14)^o(e,t,18)^o(t,e,9);return r<0&&(r+=4294967296),r}function T(e,t){var r=a(e,t,14)^a(e,t,18)^a(t,e,9);return r<0&&(r+=4294967296),r}function E(e,t){var r=o(e,t,1)^o(e,t,8)^l(e,t,7);return r<0&&(r+=4294967296),r}function A(e,t){var r=a(e,t,1)^a(e,t,8)^c(e,t,7);return r<0&&(r+=4294967296),r}function R(e,t){var r=o(e,t,19)^o(t,e,29)^l(e,t,6);return r<0&&(r+=4294967296),r}function O(e,t){var r=a(e,t,19)^a(t,e,29)^c(e,t,6);return r<0&&(r+=4294967296),r}n.inherits(v,g),t.exports=v,v.blockSize=1024,v.outSize=512,v.hmacStrength=192,v.padLength=128,v.prototype._prepareBlock=function(e,t){for(var r=this.W,n=0;n<32;n++)r[n]=e[t+n];for(;n<r.length;n+=2){var i=R(r[n-4],r[n-3]),s=O(r[n-4],r[n-3]),o=r[n-14],a=r[n-13],l=E(r[n-30],r[n-29]),c=A(r[n-30],r[n-29]),u=r[n-32],h=r[n-31];r[n]=d(i,s,o,a,l,c,u,h),r[n+1]=p(i,s,o,a,l,c,u,h)}},v.prototype._update=function(e,t){this._prepareBlock(e,t);var r=this.W,n=this.h[0],i=this.h[1],o=this.h[2],a=this.h[3],l=this.h[4],c=this.h[5],d=this.h[6],p=this.h[7],g=this.h[8],y=this.h[9],v=this.h[10],E=this.h[11],A=this.h[12],R=this.h[13],O=this.h[14],j=this.h[15];s(this.k.length===r.length);for(var I=0;I<r.length;I+=2){var N=O,P=j,B=C(g,y),D=T(g,y),F=w(g,y,v,E,A),L=_(g,y,v,E,A,R),z=this.k[I],U=this.k[I+1],$=r[I],H=r[I+1],V=m(N,P,B,D,F,L,z,U,$,H),q=b(N,P,B,D,F,L,z,U,$,H);N=S(n,i),P=M(n,i),B=x(n,i,o,a,l),D=k(n,i,o,a,l,c);var W=h(N,P,B,D),X=f(N,P,B,D);O=A,j=R,A=v,R=E,v=g,E=y,g=h(d,p,V,q),y=f(p,p,V,q),d=l,p=c,l=o,c=a,o=n,a=i,n=h(V,q,W,X),i=f(V,q,W,X)}u(this.h,0,n,i),u(this.h,2,o,a),u(this.h,4,l,c),u(this.h,6,d,p),u(this.h,8,g,y),u(this.h,10,v,E),u(this.h,12,A,R),u(this.h,14,O,j)},v.prototype._digest=function(e){return\"hex\"===e?n.toHex32(this.h,\"big\"):n.split32(this.h,\"big\")}},{\"../common\":427,\"../utils\":437,\"minimalistic-assert\":453}],436:[function(e,t,r){\"use strict\";var n=e(\"../utils\").rotr32;function i(e,t,r){return e&t^~e&r}function s(e,t,r){return e&t^e&r^t&r}function o(e,t,r){return e^t^r}r.ft_1=function(e,t,r,n){return 0===e?i(t,r,n):1===e||3===e?o(t,r,n):2===e?s(t,r,n):void 0},r.ch32=i,r.maj32=s,r.p32=o,r.s0_256=function(e){return n(e,2)^n(e,13)^n(e,22)},r.s1_256=function(e){return n(e,6)^n(e,11)^n(e,25)},r.g0_256=function(e){return n(e,7)^n(e,18)^e>>>3},r.g1_256=function(e){return n(e,17)^n(e,19)^e>>>10}},{\"../utils\":437}],437:[function(e,t,r){\"use strict\";var n=e(\"minimalistic-assert\"),i=e(\"inherits\");function s(e,t){return 55296==(64512&e.charCodeAt(t))&&(!(t<0||t+1>=e.length)&&56320==(64512&e.charCodeAt(t+1)))}function o(e){return(e>>>24|e>>>8&65280|e<<8&16711680|(255&e)<<24)>>>0}function a(e){return 1===e.length?\"0\"+e:e}function l(e){return 7===e.length?\"0\"+e:6===e.length?\"00\"+e:5===e.length?\"000\"+e:4===e.length?\"0000\"+e:3===e.length?\"00000\"+e:2===e.length?\"000000\"+e:1===e.length?\"0000000\"+e:e}r.inherits=i,r.toArray=function(e,t){if(Array.isArray(e))return e.slice();if(!e)return[];var r=[];if(\"string\"==typeof e)if(t){if(\"hex\"===t)for((e=e.replace(/[^a-z0-9]+/gi,\"\")).length%2!=0&&(e=\"0\"+e),i=0;i<e.length;i+=2)r.push(parseInt(e[i]+e[i+1],16))}else for(var n=0,i=0;i<e.length;i++){var o=e.charCodeAt(i);o<128?r[n++]=o:o<2048?(r[n++]=o>>6|192,r[n++]=63&o|128):s(e,i)?(o=65536+((1023&o)<<10)+(1023&e.charCodeAt(++i)),r[n++]=o>>18|240,r[n++]=o>>12&63|128,r[n++]=o>>6&63|128,r[n++]=63&o|128):(r[n++]=o>>12|224,r[n++]=o>>6&63|128,r[n++]=63&o|128)}else for(i=0;i<e.length;i++)r[i]=0|e[i];return r},r.toHex=function(e){for(var t=\"\",r=0;r<e.length;r++)t+=a(e[r].toString(16));return t},r.htonl=o,r.toHex32=function(e,t){for(var r=\"\",n=0;n<e.length;n++){var i=e[n];\"little\"===t&&(i=o(i)),r+=l(i.toString(16))}return r},r.zero2=a,r.zero8=l,r.join32=function(e,t,r,i){var s=r-t;n(s%4==0);for(var o=new Array(s/4),a=0,l=t;a<o.length;a++,l+=4){var c;c=\"big\"===i?e[l]<<24|e[l+1]<<16|e[l+2]<<8|e[l+3]:e[l+3]<<24|e[l+2]<<16|e[l+1]<<8|e[l],o[a]=c>>>0}return o},r.split32=function(e,t){for(var r=new Array(4*e.length),n=0,i=0;n<e.length;n++,i+=4){var s=e[n];\"big\"===t?(r[i]=s>>>24,r[i+1]=s>>>16&255,r[i+2]=s>>>8&255,r[i+3]=255&s):(r[i+3]=s>>>24,r[i+2]=s>>>16&255,r[i+1]=s>>>8&255,r[i]=255&s)}return r},r.rotr32=function(e,t){return e>>>t|e<<32-t},r.rotl32=function(e,t){return e<<t|e>>>32-t},r.sum32=function(e,t){return e+t>>>0},r.sum32_3=function(e,t,r){return e+t+r>>>0},r.sum32_4=function(e,t,r,n){return e+t+r+n>>>0},r.sum32_5=function(e,t,r,n,i){return e+t+r+n+i>>>0},r.sum64=function(e,t,r,n){var i=e[t],s=n+e[t+1]>>>0,o=(s<n?1:0)+r+i;e[t]=o>>>0,e[t+1]=s},r.sum64_hi=function(e,t,r,n){return(t+n>>>0<t?1:0)+e+r>>>0},r.sum64_lo=function(e,t,r,n){return t+n>>>0},r.sum64_4_hi=function(e,t,r,n,i,s,o,a){var l=0,c=t;return l+=(c=c+n>>>0)<t?1:0,l+=(c=c+s>>>0)<s?1:0,e+r+i+o+(l+=(c=c+a>>>0)<a?1:0)>>>0},r.sum64_4_lo=function(e,t,r,n,i,s,o,a){return t+n+s+a>>>0},r.sum64_5_hi=function(e,t,r,n,i,s,o,a,l,c){var u=0,h=t;return u+=(h=h+n>>>0)<t?1:0,u+=(h=h+s>>>0)<s?1:0,u+=(h=h+a>>>0)<a?1:0,e+r+i+o+l+(u+=(h=h+c>>>0)<c?1:0)>>>0},r.sum64_5_lo=function(e,t,r,n,i,s,o,a,l,c){return t+n+s+a+c>>>0},r.rotr64_hi=function(e,t,r){return(t<<32-r|e>>>r)>>>0},r.rotr64_lo=function(e,t,r){return(e<<32-r|t>>>r)>>>0},r.shr64_hi=function(e,t,r){return e>>>r},r.shr64_lo=function(e,t,r){return(e<<32-r|t>>>r)>>>0}},{inherits:440,\"minimalistic-assert\":453}],438:[function(e,t,r){\"use strict\";var n=e(\"hash.js\"),i=e(\"minimalistic-crypto-utils\"),s=e(\"minimalistic-assert\");function o(e){if(!(this instanceof o))return new o(e);this.hash=e.hash,this.predResist=!!e.predResist,this.outLen=this.hash.outSize,this.minEntropy=e.minEntropy||this.hash.hmacStrength,this._reseed=null,this.reseedInterval=null,this.K=null,this.V=null;var t=i.toArray(e.entropy,e.entropyEnc||\"hex\"),r=i.toArray(e.nonce,e.nonceEnc||\"hex\"),n=i.toArray(e.pers,e.persEnc||\"hex\");s(t.length>=this.minEntropy/8,\"Not enough entropy. Minimum is: \"+this.minEntropy+\" bits\"),this._init(t,r,n)}t.exports=o,o.prototype._init=function(e,t,r){var n=e.concat(t).concat(r);this.K=new Array(this.outLen/8),this.V=new Array(this.outLen/8);for(var i=0;i<this.V.length;i++)this.K[i]=0,this.V[i]=1;this._update(n),this._reseed=1,this.reseedInterval=281474976710656},o.prototype._hmac=function(){return new n.hmac(this.hash,this.K)},o.prototype._update=function(e){var t=this._hmac().update(this.V).update([0]);e&&(t=t.update(e)),this.K=t.digest(),this.V=this._hmac().update(this.V).digest(),e&&(this.K=this._hmac().update(this.V).update([1]).update(e).digest(),this.V=this._hmac().update(this.V).digest())},o.prototype.reseed=function(e,t,r,n){\"string\"!=typeof t&&(n=r,r=t,t=null),e=i.toArray(e,t),r=i.toArray(r,n),s(e.length>=this.minEntropy/8,\"Not enough entropy. Minimum is: \"+this.minEntropy+\" bits\"),this._update(e.concat(r||[])),this._reseed=1},o.prototype.generate=function(e,t,r,n){if(this._reseed>this.reseedInterval)throw new Error(\"Reseed is required\");\"string\"!=typeof t&&(n=r,r=t,t=null),r&&(r=i.toArray(r,n||\"hex\"),this._update(r));for(var s=[];s.length<e;)this.V=this._hmac().update(this.V).digest(),s=s.concat(this.V);var o=s.slice(0,e);return this._update(r),this._reseed++,i.encode(o,t)}},{\"hash.js\":426,\"minimalistic-assert\":453,\"minimalistic-crypto-utils\":454}],439:[function(e,t,r){\"use strict\";\n/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */r.read=function(e,t,r,n,i){var s,o,a=8*i-n-1,l=(1<<a)-1,c=l>>1,u=-7,h=r?i-1:0,f=r?-1:1,d=e[t+h];for(h+=f,s=d&(1<<-u)-1,d>>=-u,u+=a;u>0;s=256*s+e[t+h],h+=f,u-=8);for(o=s&(1<<-u)-1,s>>=-u,u+=n;u>0;o=256*o+e[t+h],h+=f,u-=8);if(0===s)s=1-c;else{if(s===l)return o?NaN:1/0*(d?-1:1);o+=Math.pow(2,n),s-=c}return(d?-1:1)*o*Math.pow(2,s-n)},r.write=function(e,t,r,n,i,s){var o,a,l,c=8*s-i-1,u=(1<<c)-1,h=u>>1,f=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,d=n?0:s-1,p=n?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,o=u):(o=Math.floor(Math.log(t)/Math.LN2),t*(l=Math.pow(2,-o))<1&&(o--,l*=2),(t+=o+h>=1?f/l:f*Math.pow(2,1-h))*l>=2&&(o++,l/=2),o+h>=u?(a=0,o=u):o+h>=1?(a=(t*l-1)*Math.pow(2,i),o+=h):(a=t*Math.pow(2,h-1)*Math.pow(2,i),o=0));i>=8;e[r+d]=255&a,d+=p,a/=256,i-=8);for(o=o<<i|a,c+=i;c>0;e[r+d]=255&o,d+=p,o/=256,c-=8);e[r+d-p]|=128*m}},{}],440:[function(e,t,r){\"use strict\";\"function\"==typeof Object.create?t.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:t.exports=function(e,t){if(t){e.super_=t;var r=function(){};r.prototype=t.prototype,e.prototype=new r,e.prototype.constructor=e}}},{}],441:[function(e,t,r){(function(n,i,s,o,a,l,c,u){(function(){\"use strict\";\n/*!\n\nJSZip v3.10.1 - A JavaScript class for generating and reading zip files\n<http://stuartk.com/jszip>\n\n(c) 2009-2016 Stuart Knightley <stuart [at] stuartk.com>\nDual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/main/LICENSE.markdown.\n\nJSZip uses the library pako released under the MIT license :\nhttps://github.com/nodeca/pako/blob/main/LICENSE\n*/!function(e){\"object\"==typeof r&&void 0!==t?t.exports=e():(\"undefined\"!=typeof window?window:void 0!==i?i:\"undefined\"!=typeof self?self:this).JSZip=e()}((function(){return function t(r,n,i){function s(a,l){if(!n[a]){if(!r[a]){var c=\"function\"==typeof e&&e;if(!l&&c)return c(a,!0);if(o)return o(a,!0);var u=new Error(\"Cannot find module '\"+a+\"'\");throw u.code=\"MODULE_NOT_FOUND\",u}var h=n[a]={exports:{}};r[a][0].call(h.exports,(function(e){return s(r[a][1][e]||e)}),h,h.exports,t,r,n,i)}return n[a].exports}for(var o=\"function\"==typeof e&&e,a=0;a<i.length;a++)s(i[a]);return s}({1:[function(e,t,r){var n=e(\"./utils\"),i=e(\"./support\"),s=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";r.encode=function(e){for(var t,r,i,o,a,l,c,u=[],h=0,f=e.length,d=f,p=\"string\"!==n.getTypeOf(e);h<e.length;)d=f-h,i=p?(t=e[h++],r=h<f?e[h++]:0,h<f?e[h++]:0):(t=e.charCodeAt(h++),r=h<f?e.charCodeAt(h++):0,h<f?e.charCodeAt(h++):0),o=t>>2,a=(3&t)<<4|r>>4,l=1<d?(15&r)<<2|i>>6:64,c=2<d?63&i:64,u.push(s.charAt(o)+s.charAt(a)+s.charAt(l)+s.charAt(c));return u.join(\"\")},r.decode=function(e){var t,r,n,o,a,l,c=0,u=0,h=\"data:\";if(e.substr(0,h.length)===h)throw new Error(\"Invalid base64 input, it looks like a data url.\");var f,d=3*(e=e.replace(/[^A-Za-z0-9+/=]/g,\"\")).length/4;if(e.charAt(e.length-1)===s.charAt(64)&&d--,e.charAt(e.length-2)===s.charAt(64)&&d--,d%1!=0)throw new Error(\"Invalid base64 input, bad content length.\");for(f=i.uint8array?new Uint8Array(0|d):new Array(0|d);c<e.length;)t=s.indexOf(e.charAt(c++))<<2|(o=s.indexOf(e.charAt(c++)))>>4,r=(15&o)<<4|(a=s.indexOf(e.charAt(c++)))>>2,n=(3&a)<<6|(l=s.indexOf(e.charAt(c++))),f[u++]=t,64!==a&&(f[u++]=r),64!==l&&(f[u++]=n);return f}},{\"./support\":30,\"./utils\":32}],2:[function(e,t,r){var n=e(\"./external\"),i=e(\"./stream/DataWorker\"),s=e(\"./stream/Crc32Probe\"),o=e(\"./stream/DataLengthProbe\");function a(e,t,r,n,i){this.compressedSize=e,this.uncompressedSize=t,this.crc32=r,this.compression=n,this.compressedContent=i}a.prototype={getContentWorker:function(){var e=new i(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new o(\"data_length\")),t=this;return e.on(\"end\",(function(){if(this.streamInfo.data_length!==t.uncompressedSize)throw new Error(\"Bug : uncompressed data size mismatch\")})),e},getCompressedWorker:function(){return new i(n.Promise.resolve(this.compressedContent)).withStreamInfo(\"compressedSize\",this.compressedSize).withStreamInfo(\"uncompressedSize\",this.uncompressedSize).withStreamInfo(\"crc32\",this.crc32).withStreamInfo(\"compression\",this.compression)}},a.createWorkerFrom=function(e,t,r){return e.pipe(new s).pipe(new o(\"uncompressedSize\")).pipe(t.compressWorker(r)).pipe(new o(\"compressedSize\")).withStreamInfo(\"compression\",t)},t.exports=a},{\"./external\":6,\"./stream/Crc32Probe\":25,\"./stream/DataLengthProbe\":26,\"./stream/DataWorker\":27}],3:[function(e,t,r){var n=e(\"./stream/GenericWorker\");r.STORE={magic:\"\\0\\0\",compressWorker:function(){return new n(\"STORE compression\")},uncompressWorker:function(){return new n(\"STORE decompression\")}},r.DEFLATE=e(\"./flate\")},{\"./flate\":7,\"./stream/GenericWorker\":28}],4:[function(e,t,r){var n=e(\"./utils\"),i=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t){return void 0!==e&&e.length?\"string\"!==n.getTypeOf(e)?function(e,t,r,n){var s=i,o=0+r;e^=-1;for(var a=0;a<o;a++)e=e>>>8^s[255&(e^t[a])];return-1^e}(0|t,e,e.length):function(e,t,r,n){var s=i,o=0+r;e^=-1;for(var a=0;a<o;a++)e=e>>>8^s[255&(e^t.charCodeAt(a))];return-1^e}(0|t,e,e.length):0}},{\"./utils\":32}],5:[function(e,t,r){r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],6:[function(e,t,r){var n;n=\"undefined\"!=typeof Promise?Promise:e(\"lie\"),t.exports={Promise:n}},{lie:37}],7:[function(e,t,r){var n=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Uint32Array,i=e(\"pako\"),s=e(\"./utils\"),o=e(\"./stream/GenericWorker\"),a=n?\"uint8array\":\"array\";function l(e,t){o.call(this,\"FlateWorker/\"+e),this._pako=null,this._pakoAction=e,this._pakoOptions=t,this.meta={}}r.magic=\"\\b\\0\",s.inherits(l,o),l.prototype.processChunk=function(e){this.meta=e.meta,null===this._pako&&this._createPako(),this._pako.push(s.transformTo(a,e.data),!1)},l.prototype.flush=function(){o.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},l.prototype.cleanUp=function(){o.prototype.cleanUp.call(this),this._pako=null},l.prototype._createPako=function(){this._pako=new i[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var e=this;this._pako.onData=function(t){e.push({data:t,meta:e.meta})}},r.compressWorker=function(e){return new l(\"Deflate\",e)},r.uncompressWorker=function(){return new l(\"Inflate\",{})}},{\"./stream/GenericWorker\":28,\"./utils\":32,pako:38}],8:[function(e,t,r){function n(e,t){var r,n=\"\";for(r=0;r<t;r++)n+=String.fromCharCode(255&e),e>>>=8;return n}function i(e,t,r,i,o,u){var h,f,d=e.file,p=e.compression,m=u!==a.utf8encode,b=s.transformTo(\"string\",u(d.name)),g=s.transformTo(\"string\",a.utf8encode(d.name)),y=d.comment,v=s.transformTo(\"string\",u(y)),w=s.transformTo(\"string\",a.utf8encode(y)),_=g.length!==d.name.length,x=w.length!==y.length,k=\"\",S=\"\",M=\"\",C=d.dir,T=d.date,E={crc32:0,compressedSize:0,uncompressedSize:0};t&&!r||(E.crc32=e.crc32,E.compressedSize=e.compressedSize,E.uncompressedSize=e.uncompressedSize);var A=0;t&&(A|=8),m||!_&&!x||(A|=2048);var R=0,O=0;C&&(R|=16),\"UNIX\"===o?(O=798,R|=function(e,t){var r=e;return e||(r=t?16893:33204),(65535&r)<<16}(d.unixPermissions,C)):(O=20,R|=function(e){return 63&(e||0)}(d.dosPermissions)),h=T.getUTCHours(),h<<=6,h|=T.getUTCMinutes(),h<<=5,h|=T.getUTCSeconds()/2,f=T.getUTCFullYear()-1980,f<<=4,f|=T.getUTCMonth()+1,f<<=5,f|=T.getUTCDate(),_&&(S=n(1,1)+n(l(b),4)+g,k+=\"up\"+n(S.length,2)+S),x&&(M=n(1,1)+n(l(v),4)+w,k+=\"uc\"+n(M.length,2)+M);var j=\"\";return j+=\"\\n\\0\",j+=n(A,2),j+=p.magic,j+=n(h,2),j+=n(f,2),j+=n(E.crc32,4),j+=n(E.compressedSize,4),j+=n(E.uncompressedSize,4),j+=n(b.length,2),j+=n(k.length,2),{fileRecord:c.LOCAL_FILE_HEADER+j+b+k,dirRecord:c.CENTRAL_FILE_HEADER+n(O,2)+j+n(v.length,2)+\"\\0\\0\\0\\0\"+n(R,4)+n(i,4)+b+k+v}}var s=e(\"../utils\"),o=e(\"../stream/GenericWorker\"),a=e(\"../utf8\"),l=e(\"../crc32\"),c=e(\"../signature\");function u(e,t,r,n){o.call(this,\"ZipFileWorker\"),this.bytesWritten=0,this.zipComment=t,this.zipPlatform=r,this.encodeFileName=n,this.streamFiles=e,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}s.inherits(u,o),u.prototype.push=function(e){var t=e.meta.percent||0,r=this.entriesCount,n=this._sources.length;this.accumulate?this.contentBuffer.push(e):(this.bytesWritten+=e.data.length,o.prototype.push.call(this,{data:e.data,meta:{currentFile:this.currentFile,percent:r?(t+100*(r-n-1))/r:100}}))},u.prototype.openedSource=function(e){this.currentSourceOffset=this.bytesWritten,this.currentFile=e.file.name;var t=this.streamFiles&&!e.file.dir;if(t){var r=i(e,t,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:r.fileRecord,meta:{percent:0}})}else this.accumulate=!0},u.prototype.closedSource=function(e){this.accumulate=!1;var t=this.streamFiles&&!e.file.dir,r=i(e,t,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(r.dirRecord),t)this.push({data:function(e){return c.DATA_DESCRIPTOR+n(e.crc32,4)+n(e.compressedSize,4)+n(e.uncompressedSize,4)}(e),meta:{percent:100}});else for(this.push({data:r.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},u.prototype.flush=function(){for(var e=this.bytesWritten,t=0;t<this.dirRecords.length;t++)this.push({data:this.dirRecords[t],meta:{percent:100}});var r=this.bytesWritten-e,i=function(e,t,r,i,o){var a=s.transformTo(\"string\",o(i));return c.CENTRAL_DIRECTORY_END+\"\\0\\0\\0\\0\"+n(e,2)+n(e,2)+n(t,4)+n(r,4)+n(a.length,2)+a}(this.dirRecords.length,r,e,this.zipComment,this.encodeFileName);this.push({data:i,meta:{percent:100}})},u.prototype.prepareNextSource=function(){this.previous=this._sources.shift(),this.openedSource(this.previous.streamInfo),this.isPaused?this.previous.pause():this.previous.resume()},u.prototype.registerPrevious=function(e){this._sources.push(e);var t=this;return e.on(\"data\",(function(e){t.processChunk(e)})),e.on(\"end\",(function(){t.closedSource(t.previous.streamInfo),t._sources.length?t.prepareNextSource():t.end()})),e.on(\"error\",(function(e){t.error(e)})),this},u.prototype.resume=function(){return!!o.prototype.resume.call(this)&&(!this.previous&&this._sources.length?(this.prepareNextSource(),!0):this.previous||this._sources.length||this.generatedError?void 0:(this.end(),!0))},u.prototype.error=function(e){var t=this._sources;if(!o.prototype.error.call(this,e))return!1;for(var r=0;r<t.length;r++)try{t[r].error(e)}catch(e){}return!0},u.prototype.lock=function(){o.prototype.lock.call(this);for(var e=this._sources,t=0;t<e.length;t++)e[t].lock()},t.exports=u},{\"../crc32\":4,\"../signature\":23,\"../stream/GenericWorker\":28,\"../utf8\":31,\"../utils\":32}],9:[function(e,t,r){var n=e(\"../compressions\"),i=e(\"./ZipFileWorker\");r.generateWorker=function(e,t,r){var s=new i(t.streamFiles,r,t.platform,t.encodeFileName),o=0;try{e.forEach((function(e,r){o++;var i=function(e,t){var r=e||t,i=n[r];if(!i)throw new Error(r+\" is not a valid compression method !\");return i}(r.options.compression,t.compression),a=r.options.compressionOptions||t.compressionOptions||{},l=r.dir,c=r.date;r._compressWorker(i,a).withStreamInfo(\"file\",{name:e,dir:l,date:c,comment:r.comment||\"\",unixPermissions:r.unixPermissions,dosPermissions:r.dosPermissions}).pipe(s)})),s.entriesCount=o}catch(e){s.error(e)}return s}},{\"../compressions\":3,\"./ZipFileWorker\":8}],10:[function(e,t,r){function n(){if(!(this instanceof n))return new n;if(arguments.length)throw new Error(\"The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.\");this.files=Object.create(null),this.comment=null,this.root=\"\",this.clone=function(){var e=new n;for(var t in this)\"function\"!=typeof this[t]&&(e[t]=this[t]);return e}}(n.prototype=e(\"./object\")).loadAsync=e(\"./load\"),n.support=e(\"./support\"),n.defaults=e(\"./defaults\"),n.version=\"3.10.1\",n.loadAsync=function(e,t){return(new n).loadAsync(e,t)},n.external=e(\"./external\"),t.exports=n},{\"./defaults\":5,\"./external\":6,\"./load\":11,\"./object\":15,\"./support\":30}],11:[function(e,t,r){var n=e(\"./utils\"),i=e(\"./external\"),s=e(\"./utf8\"),o=e(\"./zipEntries\"),a=e(\"./stream/Crc32Probe\"),l=e(\"./nodejsUtils\");function c(e){return new i.Promise((function(t,r){var n=e.decompressed.getContentWorker().pipe(new a);n.on(\"error\",(function(e){r(e)})).on(\"end\",(function(){n.streamInfo.crc32!==e.decompressed.crc32?r(new Error(\"Corrupted zip : CRC32 mismatch\")):t()})).resume()}))}t.exports=function(e,t){var r=this;return t=n.extend(t||{},{base64:!1,checkCRC32:!1,optimizedBinaryString:!1,createFolders:!1,decodeFileName:s.utf8decode}),l.isNode&&l.isStream(e)?i.Promise.reject(new Error(\"JSZip can't accept a stream when loading a zip file.\")):n.prepareContent(\"the loaded zip file\",e,!0,t.optimizedBinaryString,t.base64).then((function(e){var r=new o(t);return r.load(e),r})).then((function(e){var r=[i.Promise.resolve(e)],n=e.files;if(t.checkCRC32)for(var s=0;s<n.length;s++)r.push(c(n[s]));return i.Promise.all(r)})).then((function(e){for(var i=e.shift(),s=i.files,o=0;o<s.length;o++){var a=s[o],l=a.fileNameStr,c=n.resolve(a.fileNameStr);r.file(c,a.decompressed,{binary:!0,optimizedBinaryString:!0,date:a.date,dir:a.dir,comment:a.fileCommentStr.length?a.fileCommentStr:null,unixPermissions:a.unixPermissions,dosPermissions:a.dosPermissions,createFolders:t.createFolders}),a.dir||(r.file(c).unsafeOriginalName=l)}return i.zipComment.length&&(r.comment=i.zipComment),r}))}},{\"./external\":6,\"./nodejsUtils\":14,\"./stream/Crc32Probe\":25,\"./utf8\":31,\"./utils\":32,\"./zipEntries\":33}],12:[function(e,t,r){var n=e(\"../utils\"),i=e(\"../stream/GenericWorker\");function s(e,t){i.call(this,\"Nodejs stream input adapter for \"+e),this._upstreamEnded=!1,this._bindStream(t)}n.inherits(s,i),s.prototype._bindStream=function(e){var t=this;(this._stream=e).pause(),e.on(\"data\",(function(e){t.push({data:e,meta:{percent:0}})})).on(\"error\",(function(e){t.isPaused?this.generatedError=e:t.error(e)})).on(\"end\",(function(){t.isPaused?t._upstreamEnded=!0:t.end()}))},s.prototype.pause=function(){return!!i.prototype.pause.call(this)&&(this._stream.pause(),!0)},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(this._upstreamEnded?this.end():this._stream.resume(),!0)},t.exports=s},{\"../stream/GenericWorker\":28,\"../utils\":32}],13:[function(e,t,r){var n=e(\"readable-stream\").Readable;function i(e,t,r){n.call(this,t),this._helper=e;var i=this;e.on(\"data\",(function(e,t){i.push(e)||i._helper.pause(),r&&r(t)})).on(\"error\",(function(e){i.emit(\"error\",e)})).on(\"end\",(function(){i.push(null)}))}e(\"../utils\").inherits(i,n),i.prototype._read=function(){this._helper.resume()},t.exports=i},{\"../utils\":32,\"readable-stream\":16}],14:[function(e,t,r){t.exports={isNode:void 0!==s,newBufferFrom:function(e,t){if(s.from&&s.from!==Uint8Array.from)return s.from(e,t);if(\"number\"==typeof e)throw new Error('The \"data\" argument must not be a number');return new s(e,t)},allocBuffer:function(e){if(s.alloc)return s.alloc(e);var t=new s(e);return t.fill(0),t},isBuffer:function(e){return s.isBuffer(e)},isStream:function(e){return e&&\"function\"==typeof e.on&&\"function\"==typeof e.pause&&\"function\"==typeof e.resume}}},{}],15:[function(e,t,r){function n(e,t,r){var n,i=s.getTypeOf(t),a=s.extend(r||{},l);a.date=a.date||new Date,null!==a.compression&&(a.compression=a.compression.toUpperCase()),\"string\"==typeof a.unixPermissions&&(a.unixPermissions=parseInt(a.unixPermissions,8)),a.unixPermissions&&16384&a.unixPermissions&&(a.dir=!0),a.dosPermissions&&16&a.dosPermissions&&(a.dir=!0),a.dir&&(e=m(e)),a.createFolders&&(n=p(e))&&b.call(this,n,!0);var h=\"string\"===i&&!1===a.binary&&!1===a.base64;r&&void 0!==r.binary||(a.binary=!h),(t instanceof c&&0===t.uncompressedSize||a.dir||!t||0===t.length)&&(a.base64=!1,a.binary=!0,t=\"\",a.compression=\"STORE\",i=\"string\");var g;g=t instanceof c||t instanceof o?t:f.isNode&&f.isStream(t)?new d(e,t):s.prepareContent(e,t,a.binary,a.optimizedBinaryString,a.base64);var y=new u(e,g,a);this.files[e]=y}var i=e(\"./utf8\"),s=e(\"./utils\"),o=e(\"./stream/GenericWorker\"),a=e(\"./stream/StreamHelper\"),l=e(\"./defaults\"),c=e(\"./compressedObject\"),u=e(\"./zipObject\"),h=e(\"./generate\"),f=e(\"./nodejsUtils\"),d=e(\"./nodejs/NodejsStreamInputAdapter\"),p=function(e){\"/\"===e.slice(-1)&&(e=e.substring(0,e.length-1));var t=e.lastIndexOf(\"/\");return 0<t?e.substring(0,t):\"\"},m=function(e){return\"/\"!==e.slice(-1)&&(e+=\"/\"),e},b=function(e,t){return t=void 0!==t?t:l.createFolders,e=m(e),this.files[e]||n.call(this,e,null,{dir:!0,createFolders:t}),this.files[e]};function g(e){return\"[object RegExp]\"===Object.prototype.toString.call(e)}var y={load:function(){throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\")},forEach:function(e){var t,r,n;for(t in this.files)n=this.files[t],(r=t.slice(this.root.length,t.length))&&t.slice(0,this.root.length)===this.root&&e(r,n)},filter:function(e){var t=[];return this.forEach((function(r,n){e(r,n)&&t.push(n)})),t},file:function(e,t,r){if(1!==arguments.length)return e=this.root+e,n.call(this,e,t,r),this;if(g(e)){var i=e;return this.filter((function(e,t){return!t.dir&&i.test(e)}))}var s=this.files[this.root+e];return s&&!s.dir?s:null},folder:function(e){if(!e)return this;if(g(e))return this.filter((function(t,r){return r.dir&&e.test(t)}));var t=this.root+e,r=b.call(this,t),n=this.clone();return n.root=r.name,n},remove:function(e){e=this.root+e;var t=this.files[e];if(t||(\"/\"!==e.slice(-1)&&(e+=\"/\"),t=this.files[e]),t&&!t.dir)delete this.files[e];else for(var r=this.filter((function(t,r){return r.name.slice(0,e.length)===e})),n=0;n<r.length;n++)delete this.files[r[n].name];return this},generate:function(){throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\")},generateInternalStream:function(e){var t,r={};try{if((r=s.extend(e||{},{streamFiles:!1,compression:\"STORE\",compressionOptions:null,type:\"\",platform:\"DOS\",comment:null,mimeType:\"application/zip\",encodeFileName:i.utf8encode})).type=r.type.toLowerCase(),r.compression=r.compression.toUpperCase(),\"binarystring\"===r.type&&(r.type=\"string\"),!r.type)throw new Error(\"No output type specified.\");s.checkSupport(r.type),\"darwin\"!==r.platform&&\"freebsd\"!==r.platform&&\"linux\"!==r.platform&&\"sunos\"!==r.platform||(r.platform=\"UNIX\"),\"win32\"===r.platform&&(r.platform=\"DOS\");var n=r.comment||this.comment||\"\";t=h.generateWorker(this,r,n)}catch(e){(t=new o(\"error\")).error(e)}return new a(t,r.type||\"string\",r.mimeType)},generateAsync:function(e,t){return this.generateInternalStream(e).accumulate(t)},generateNodeStream:function(e,t){return(e=e||{}).type||(e.type=\"nodebuffer\"),this.generateInternalStream(e).toNodejsStream(t)}};t.exports=y},{\"./compressedObject\":2,\"./defaults\":5,\"./generate\":9,\"./nodejs/NodejsStreamInputAdapter\":12,\"./nodejsUtils\":14,\"./stream/GenericWorker\":28,\"./stream/StreamHelper\":29,\"./utf8\":31,\"./utils\":32,\"./zipObject\":35}],16:[function(e,t,r){t.exports=e(\"stream\")},{stream:void 0}],17:[function(e,t,r){var n=e(\"./DataReader\");function i(e){n.call(this,e);for(var t=0;t<this.data.length;t++)e[t]=255&e[t]}e(\"../utils\").inherits(i,n),i.prototype.byteAt=function(e){return this.data[this.zero+e]},i.prototype.lastIndexOfSignature=function(e){for(var t=e.charCodeAt(0),r=e.charCodeAt(1),n=e.charCodeAt(2),i=e.charCodeAt(3),s=this.length-4;0<=s;--s)if(this.data[s]===t&&this.data[s+1]===r&&this.data[s+2]===n&&this.data[s+3]===i)return s-this.zero;return-1},i.prototype.readAndCheckSignature=function(e){var t=e.charCodeAt(0),r=e.charCodeAt(1),n=e.charCodeAt(2),i=e.charCodeAt(3),s=this.readData(4);return t===s[0]&&r===s[1]&&n===s[2]&&i===s[3]},i.prototype.readData=function(e){if(this.checkOffset(e),0===e)return[];var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./DataReader\":18}],18:[function(e,t,r){var n=e(\"../utils\");function i(e){this.data=e,this.length=e.length,this.index=0,this.zero=0}i.prototype={checkOffset:function(e){this.checkIndex(this.index+e)},checkIndex:function(e){if(this.length<this.zero+e||e<0)throw new Error(\"End of data reached (data length = \"+this.length+\", asked index = \"+e+\"). Corrupted zip ?\")},setIndex:function(e){this.checkIndex(e),this.index=e},skip:function(e){this.setIndex(this.index+e)},byteAt:function(){},readInt:function(e){var t,r=0;for(this.checkOffset(e),t=this.index+e-1;t>=this.index;t--)r=(r<<8)+this.byteAt(t);return this.index+=e,r},readString:function(e){return n.transformTo(\"string\",this.readData(e))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var e=this.readInt(4);return new Date(Date.UTC(1980+(e>>25&127),(e>>21&15)-1,e>>16&31,e>>11&31,e>>5&63,(31&e)<<1))}},t.exports=i},{\"../utils\":32}],19:[function(e,t,r){var n=e(\"./Uint8ArrayReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./Uint8ArrayReader\":21}],20:[function(e,t,r){var n=e(\"./DataReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.byteAt=function(e){return this.data.charCodeAt(this.zero+e)},i.prototype.lastIndexOfSignature=function(e){return this.data.lastIndexOf(e)-this.zero},i.prototype.readAndCheckSignature=function(e){return e===this.readData(4)},i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./DataReader\":18}],21:[function(e,t,r){var n=e(\"./ArrayReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.readData=function(e){if(this.checkOffset(e),0===e)return new Uint8Array(0);var t=this.data.subarray(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./ArrayReader\":17}],22:[function(e,t,r){var n=e(\"../utils\"),i=e(\"../support\"),s=e(\"./ArrayReader\"),o=e(\"./StringReader\"),a=e(\"./NodeBufferReader\"),l=e(\"./Uint8ArrayReader\");t.exports=function(e){var t=n.getTypeOf(e);return n.checkSupport(t),\"string\"!==t||i.uint8array?\"nodebuffer\"===t?new a(e):i.uint8array?new l(n.transformTo(\"uint8array\",e)):new s(n.transformTo(\"array\",e)):new o(e)}},{\"../support\":30,\"../utils\":32,\"./ArrayReader\":17,\"./NodeBufferReader\":19,\"./StringReader\":20,\"./Uint8ArrayReader\":21}],23:[function(e,t,r){r.LOCAL_FILE_HEADER=\"PK\\x03\\x04\",r.CENTRAL_FILE_HEADER=\"PK\\x01\\x02\",r.CENTRAL_DIRECTORY_END=\"PK\\x05\\x06\",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR=\"PK\\x06\\x07\",r.ZIP64_CENTRAL_DIRECTORY_END=\"PK\\x06\\x06\",r.DATA_DESCRIPTOR=\"PK\\x07\\b\"},{}],24:[function(e,t,r){var n=e(\"./GenericWorker\"),i=e(\"../utils\");function s(e){n.call(this,\"ConvertWorker to \"+e),this.destType=e}i.inherits(s,n),s.prototype.processChunk=function(e){this.push({data:i.transformTo(this.destType,e.data),meta:e.meta})},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],25:[function(e,t,r){var n=e(\"./GenericWorker\"),i=e(\"../crc32\");function s(){n.call(this,\"Crc32Probe\"),this.withStreamInfo(\"crc32\",0)}e(\"../utils\").inherits(s,n),s.prototype.processChunk=function(e){this.streamInfo.crc32=i(e.data,this.streamInfo.crc32||0),this.push(e)},t.exports=s},{\"../crc32\":4,\"../utils\":32,\"./GenericWorker\":28}],26:[function(e,t,r){var n=e(\"../utils\"),i=e(\"./GenericWorker\");function s(e){i.call(this,\"DataLengthProbe for \"+e),this.propName=e,this.withStreamInfo(e,0)}n.inherits(s,i),s.prototype.processChunk=function(e){if(e){var t=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=t+e.data.length}i.prototype.processChunk.call(this,e)},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],27:[function(e,t,r){var n=e(\"../utils\"),i=e(\"./GenericWorker\");function s(e){i.call(this,\"DataWorker\");var t=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type=\"\",this._tickScheduled=!1,e.then((function(e){t.dataIsReady=!0,t.data=e,t.max=e&&e.length||0,t.type=n.getTypeOf(e),t.isPaused||t._tickAndRepeat()}),(function(e){t.error(e)}))}n.inherits(s,i),s.prototype.cleanUp=function(){i.prototype.cleanUp.call(this),this.data=null},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,n.delay(this._tickAndRepeat,[],this)),!0)},s.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(n.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},s.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var e=null,t=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case\"string\":e=this.data.substring(this.index,t);break;case\"uint8array\":e=this.data.subarray(this.index,t);break;case\"array\":case\"nodebuffer\":e=this.data.slice(this.index,t)}return this.index=t,this.push({data:e,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],28:[function(e,t,r){function n(e){this.name=e||\"default\",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}n.prototype={push:function(e){this.emit(\"data\",e)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit(\"end\"),this.cleanUp(),this.isFinished=!0}catch(e){this.emit(\"error\",e)}return!0},error:function(e){return!this.isFinished&&(this.isPaused?this.generatedError=e:(this.isFinished=!0,this.emit(\"error\",e),this.previous&&this.previous.error(e),this.cleanUp()),!0)},on:function(e,t){return this._listeners[e].push(t),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(e,t){if(this._listeners[e])for(var r=0;r<this._listeners[e].length;r++)this._listeners[e][r].call(this,t)},pipe:function(e){return e.registerPrevious(this)},registerPrevious:function(e){if(this.isLocked)throw new Error(\"The stream '\"+this+\"' has already been used.\");this.streamInfo=e.streamInfo,this.mergeStreamInfo(),this.previous=e;var t=this;return e.on(\"data\",(function(e){t.processChunk(e)})),e.on(\"end\",(function(){t.end()})),e.on(\"error\",(function(e){t.error(e)})),this},pause:function(){return!this.isPaused&&!this.isFinished&&(this.isPaused=!0,this.previous&&this.previous.pause(),!0)},resume:function(){if(!this.isPaused||this.isFinished)return!1;var e=this.isPaused=!1;return this.generatedError&&(this.error(this.generatedError),e=!0),this.previous&&this.previous.resume(),!e},flush:function(){},processChunk:function(e){this.push(e)},withStreamInfo:function(e,t){return this.extraStreamInfo[e]=t,this.mergeStreamInfo(),this},mergeStreamInfo:function(){for(var e in this.extraStreamInfo)Object.prototype.hasOwnProperty.call(this.extraStreamInfo,e)&&(this.streamInfo[e]=this.extraStreamInfo[e])},lock:function(){if(this.isLocked)throw new Error(\"The stream '\"+this+\"' has already been used.\");this.isLocked=!0,this.previous&&this.previous.lock()},toString:function(){var e=\"Worker \"+this.name;return this.previous?this.previous+\" -> \"+e:e}},t.exports=n},{}],29:[function(e,t,r){var n=e(\"../utils\"),i=e(\"./ConvertWorker\"),o=e(\"./GenericWorker\"),a=e(\"../base64\"),l=e(\"../support\"),c=e(\"../external\"),u=null;if(l.nodestream)try{u=e(\"../nodejs/NodejsStreamOutputAdapter\")}catch(e){}function h(e,t,r){var s=t;switch(t){case\"blob\":case\"arraybuffer\":s=\"uint8array\";break;case\"base64\":s=\"string\"}try{this._internalType=s,this._outputType=t,this._mimeType=r,n.checkSupport(s),this._worker=e.pipe(new i(s)),e.lock()}catch(e){this._worker=new o(\"error\"),this._worker.error(e)}}h.prototype={accumulate:function(e){return function(e,t){return new c.Promise((function(r,i){var o=[],l=e._internalType,c=e._outputType,u=e._mimeType;e.on(\"data\",(function(e,r){o.push(e),t&&t(r)})).on(\"error\",(function(e){o=[],i(e)})).on(\"end\",(function(){try{var e=function(e,t,r){switch(e){case\"blob\":return n.newBlob(n.transformTo(\"arraybuffer\",t),r);case\"base64\":return a.encode(t);default:return n.transformTo(e,t)}}(c,function(e,t){var r,n=0,i=null,o=0;for(r=0;r<t.length;r++)o+=t[r].length;switch(e){case\"string\":return t.join(\"\");case\"array\":return Array.prototype.concat.apply([],t);case\"uint8array\":for(i=new Uint8Array(o),r=0;r<t.length;r++)i.set(t[r],n),n+=t[r].length;return i;case\"nodebuffer\":return s.concat(t);default:throw new Error(\"concat : unsupported type '\"+e+\"'\")}}(l,o),u);r(e)}catch(e){i(e)}o=[]})).resume()}))}(this,e)},on:function(e,t){var r=this;return\"data\"===e?this._worker.on(e,(function(e){t.call(r,e.data,e.meta)})):this._worker.on(e,(function(){n.delay(t,arguments,r)})),this},resume:function(){return n.delay(this._worker.resume,[],this._worker),this},pause:function(){return this._worker.pause(),this},toNodejsStream:function(e){if(n.checkSupport(\"nodestream\"),\"nodebuffer\"!==this._outputType)throw new Error(this._outputType+\" is not supported by this method\");return new u(this,{objectMode:\"nodebuffer\"!==this._outputType},e)}},t.exports=h},{\"../base64\":1,\"../external\":6,\"../nodejs/NodejsStreamOutputAdapter\":13,\"../support\":30,\"../utils\":32,\"./ConvertWorker\":24,\"./GenericWorker\":28}],30:[function(e,t,r){if(r.base64=!0,r.array=!0,r.string=!0,r.arraybuffer=\"undefined\"!=typeof ArrayBuffer&&\"undefined\"!=typeof Uint8Array,r.nodebuffer=void 0!==s,r.uint8array=\"undefined\"!=typeof Uint8Array,\"undefined\"==typeof ArrayBuffer)r.blob=!1;else{var n=new ArrayBuffer(0);try{r.blob=0===new Blob([n],{type:\"application/zip\"}).size}catch(e){try{var i=new(self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder);i.append(n),r.blob=0===i.getBlob(\"application/zip\").size}catch(e){r.blob=!1}}}try{r.nodestream=!!e(\"readable-stream\").Readable}catch(e){r.nodestream=!1}},{\"readable-stream\":16}],31:[function(e,t,r){for(var n=e(\"./utils\"),i=e(\"./support\"),s=e(\"./nodejsUtils\"),o=e(\"./stream/GenericWorker\"),a=new Array(256),l=0;l<256;l++)a[l]=252<=l?6:248<=l?5:240<=l?4:224<=l?3:192<=l?2:1;function c(){o.call(this,\"utf-8 decode\"),this.leftOver=null}function u(){o.call(this,\"utf-8 encode\")}a[254]=a[254]=1,r.utf8encode=function(e){return i.nodebuffer?s.newBufferFrom(e,\"utf-8\"):function(e){var t,r,n,s,o,a=e.length,l=0;for(s=0;s<a;s++)55296==(64512&(r=e.charCodeAt(s)))&&s+1<a&&56320==(64512&(n=e.charCodeAt(s+1)))&&(r=65536+(r-55296<<10)+(n-56320),s++),l+=r<128?1:r<2048?2:r<65536?3:4;for(t=i.uint8array?new Uint8Array(l):new Array(l),s=o=0;o<l;s++)55296==(64512&(r=e.charCodeAt(s)))&&s+1<a&&56320==(64512&(n=e.charCodeAt(s+1)))&&(r=65536+(r-55296<<10)+(n-56320),s++),r<128?t[o++]=r:(r<2048?t[o++]=192|r>>>6:(r<65536?t[o++]=224|r>>>12:(t[o++]=240|r>>>18,t[o++]=128|r>>>12&63),t[o++]=128|r>>>6&63),t[o++]=128|63&r);return t}(e)},r.utf8decode=function(e){return i.nodebuffer?n.transformTo(\"nodebuffer\",e).toString(\"utf-8\"):function(e){var t,r,i,s,o=e.length,l=new Array(2*o);for(t=r=0;t<o;)if((i=e[t++])<128)l[r++]=i;else if(4<(s=a[i]))l[r++]=65533,t+=s-1;else{for(i&=2===s?31:3===s?15:7;1<s&&t<o;)i=i<<6|63&e[t++],s--;1<s?l[r++]=65533:i<65536?l[r++]=i:(i-=65536,l[r++]=55296|i>>10&1023,l[r++]=56320|1023&i)}return l.length!==r&&(l.subarray?l=l.subarray(0,r):l.length=r),n.applyFromCharCode(l)}(e=n.transformTo(i.uint8array?\"uint8array\":\"array\",e))},n.inherits(c,o),c.prototype.processChunk=function(e){var t=n.transformTo(i.uint8array?\"uint8array\":\"array\",e.data);if(this.leftOver&&this.leftOver.length){if(i.uint8array){var s=t;(t=new Uint8Array(s.length+this.leftOver.length)).set(this.leftOver,0),t.set(s,this.leftOver.length)}else t=this.leftOver.concat(t);this.leftOver=null}var o=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0||0===r?t:r+a[e[r]]>t?r:t}(t),l=t;o!==t.length&&(i.uint8array?(l=t.subarray(0,o),this.leftOver=t.subarray(o,t.length)):(l=t.slice(0,o),this.leftOver=t.slice(o,t.length))),this.push({data:r.utf8decode(l),meta:e.meta})},c.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:r.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},r.Utf8DecodeWorker=c,n.inherits(u,o),u.prototype.processChunk=function(e){this.push({data:r.utf8encode(e.data),meta:e.meta})},r.Utf8EncodeWorker=u},{\"./nodejsUtils\":14,\"./stream/GenericWorker\":28,\"./support\":30,\"./utils\":32}],32:[function(e,t,r){var n=e(\"./support\"),i=e(\"./base64\"),s=e(\"./nodejsUtils\"),o=e(\"./external\");function a(e){return e}function l(e,t){for(var r=0;r<e.length;++r)t[r]=255&e.charCodeAt(r);return t}e(\"setimmediate\"),r.newBlob=function(e,t){r.checkSupport(\"blob\");try{return new Blob([e],{type:t})}catch(r){try{var n=new(self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder);return n.append(e),n.getBlob(t)}catch(e){throw new Error(\"Bug : can't construct the Blob.\")}}};var c={stringifyByChunk:function(e,t,r){var n=[],i=0,s=e.length;if(s<=r)return String.fromCharCode.apply(null,e);for(;i<s;)\"array\"===t||\"nodebuffer\"===t?n.push(String.fromCharCode.apply(null,e.slice(i,Math.min(i+r,s)))):n.push(String.fromCharCode.apply(null,e.subarray(i,Math.min(i+r,s)))),i+=r;return n.join(\"\")},stringifyByChar:function(e){for(var t=\"\",r=0;r<e.length;r++)t+=String.fromCharCode(e[r]);return t},applyCanBeUsed:{uint8array:function(){try{return n.uint8array&&1===String.fromCharCode.apply(null,new Uint8Array(1)).length}catch(e){return!1}}(),nodebuffer:function(){try{return n.nodebuffer&&1===String.fromCharCode.apply(null,s.allocBuffer(1)).length}catch(e){return!1}}()}};function h(e){var t=65536,n=r.getTypeOf(e),i=!0;if(\"uint8array\"===n?i=c.applyCanBeUsed.uint8array:\"nodebuffer\"===n&&(i=c.applyCanBeUsed.nodebuffer),i)for(;1<t;)try{return c.stringifyByChunk(e,n,t)}catch(e){t=Math.floor(t/2)}return c.stringifyByChar(e)}function f(e,t){for(var r=0;r<e.length;r++)t[r]=e[r];return t}r.applyFromCharCode=h;var d={};d.string={string:a,array:function(e){return l(e,new Array(e.length))},arraybuffer:function(e){return d.string.uint8array(e).buffer},uint8array:function(e){return l(e,new Uint8Array(e.length))},nodebuffer:function(e){return l(e,s.allocBuffer(e.length))}},d.array={string:h,array:a,arraybuffer:function(e){return new Uint8Array(e).buffer},uint8array:function(e){return new Uint8Array(e)},nodebuffer:function(e){return s.newBufferFrom(e)}},d.arraybuffer={string:function(e){return h(new Uint8Array(e))},array:function(e){return f(new Uint8Array(e),new Array(e.byteLength))},arraybuffer:a,uint8array:function(e){return new Uint8Array(e)},nodebuffer:function(e){return s.newBufferFrom(new Uint8Array(e))}},d.uint8array={string:h,array:function(e){return f(e,new Array(e.length))},arraybuffer:function(e){return e.buffer},uint8array:a,nodebuffer:function(e){return s.newBufferFrom(e)}},d.nodebuffer={string:h,array:function(e){return f(e,new Array(e.length))},arraybuffer:function(e){return d.nodebuffer.uint8array(e).buffer},uint8array:function(e){return f(e,new Uint8Array(e.length))},nodebuffer:a},r.transformTo=function(e,t){if(t=t||\"\",!e)return t;r.checkSupport(e);var n=r.getTypeOf(t);return d[n][e](t)},r.resolve=function(e){for(var t=e.split(\"/\"),r=[],n=0;n<t.length;n++){var i=t[n];\".\"===i||\"\"===i&&0!==n&&n!==t.length-1||(\"..\"===i?r.pop():r.push(i))}return r.join(\"/\")},r.getTypeOf=function(e){return\"string\"==typeof e?\"string\":\"[object Array]\"===Object.prototype.toString.call(e)?\"array\":n.nodebuffer&&s.isBuffer(e)?\"nodebuffer\":n.uint8array&&e instanceof Uint8Array?\"uint8array\":n.arraybuffer&&e instanceof ArrayBuffer?\"arraybuffer\":void 0},r.checkSupport=function(e){if(!n[e.toLowerCase()])throw new Error(e+\" is not supported by this platform\")},r.MAX_VALUE_16BITS=65535,r.MAX_VALUE_32BITS=-1,r.pretty=function(e){var t,r,n=\"\";for(r=0;r<(e||\"\").length;r++)n+=\"\\\\x\"+((t=e.charCodeAt(r))<16?\"0\":\"\")+t.toString(16).toUpperCase();return n},r.delay=function(e,t,r){u((function(){e.apply(r||null,t||[])}))},r.inherits=function(e,t){function r(){}r.prototype=t.prototype,e.prototype=new r},r.extend=function(){var e,t,r={};for(e=0;e<arguments.length;e++)for(t in arguments[e])Object.prototype.hasOwnProperty.call(arguments[e],t)&&void 0===r[t]&&(r[t]=arguments[e][t]);return r},r.prepareContent=function(e,t,s,a,c){return o.Promise.resolve(t).then((function(e){return n.blob&&(e instanceof Blob||-1!==[\"[object File]\",\"[object Blob]\"].indexOf(Object.prototype.toString.call(e)))&&\"undefined\"!=typeof FileReader?new o.Promise((function(t,r){var n=new FileReader;n.onload=function(e){t(e.target.result)},n.onerror=function(e){r(e.target.error)},n.readAsArrayBuffer(e)})):e})).then((function(t){var u=r.getTypeOf(t);return u?(\"arraybuffer\"===u?t=r.transformTo(\"uint8array\",t):\"string\"===u&&(c?t=i.decode(t):s&&!0!==a&&(t=function(e){return l(e,n.uint8array?new Uint8Array(e.length):new Array(e.length))}(t))),t):o.Promise.reject(new Error(\"Can't read the data of '\"+e+\"'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?\"))}))}},{\"./base64\":1,\"./external\":6,\"./nodejsUtils\":14,\"./support\":30,setimmediate:54}],33:[function(e,t,r){var n=e(\"./reader/readerFor\"),i=e(\"./utils\"),s=e(\"./signature\"),o=e(\"./zipEntry\"),a=e(\"./support\");function l(e){this.files=[],this.loadOptions=e}l.prototype={checkSignature:function(e){if(!this.reader.readAndCheckSignature(e)){this.reader.index-=4;var t=this.reader.readString(4);throw new Error(\"Corrupted zip or bug: unexpected signature (\"+i.pretty(t)+\", expected \"+i.pretty(e)+\")\")}},isSignature:function(e,t){var r=this.reader.index;this.reader.setIndex(e);var n=this.reader.readString(4)===t;return this.reader.setIndex(r),n},readBlockEndOfCentral:function(){this.diskNumber=this.reader.readInt(2),this.diskWithCentralDirStart=this.reader.readInt(2),this.centralDirRecordsOnThisDisk=this.reader.readInt(2),this.centralDirRecords=this.reader.readInt(2),this.centralDirSize=this.reader.readInt(4),this.centralDirOffset=this.reader.readInt(4),this.zipCommentLength=this.reader.readInt(2);var e=this.reader.readData(this.zipCommentLength),t=a.uint8array?\"uint8array\":\"array\",r=i.transformTo(t,e);this.zipComment=this.loadOptions.decodeFileName(r)},readBlockZip64EndOfCentral:function(){this.zip64EndOfCentralSize=this.reader.readInt(8),this.reader.skip(4),this.diskNumber=this.reader.readInt(4),this.diskWithCentralDirStart=this.reader.readInt(4),this.centralDirRecordsOnThisDisk=this.reader.readInt(8),this.centralDirRecords=this.reader.readInt(8),this.centralDirSize=this.reader.readInt(8),this.centralDirOffset=this.reader.readInt(8),this.zip64ExtensibleData={};for(var e,t,r,n=this.zip64EndOfCentralSize-44;0<n;)e=this.reader.readInt(2),t=this.reader.readInt(4),r=this.reader.readData(t),this.zip64ExtensibleData[e]={id:e,length:t,value:r}},readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),1<this.disksCount)throw new Error(\"Multi-volumes zip are not supported\")},readLocalFiles:function(){var e,t;for(e=0;e<this.files.length;e++)t=this.files[e],this.reader.setIndex(t.localHeaderOffset),this.checkSignature(s.LOCAL_FILE_HEADER),t.readLocalPart(this.reader),t.handleUTF8(),t.processAttributes()},readCentralDir:function(){var e;for(this.reader.setIndex(this.centralDirOffset);this.reader.readAndCheckSignature(s.CENTRAL_FILE_HEADER);)(e=new o({zip64:this.zip64},this.loadOptions)).readCentralPart(this.reader),this.files.push(e);if(this.centralDirRecords!==this.files.length&&0!==this.centralDirRecords&&0===this.files.length)throw new Error(\"Corrupted zip or bug: expected \"+this.centralDirRecords+\" records in central dir, got \"+this.files.length)},readEndOfCentral:function(){var e=this.reader.lastIndexOfSignature(s.CENTRAL_DIRECTORY_END);if(e<0)throw this.isSignature(0,s.LOCAL_FILE_HEADER)?new Error(\"Corrupted zip: can't find end of central directory\"):new Error(\"Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html\");this.reader.setIndex(e);var t=e;if(this.checkSignature(s.CENTRAL_DIRECTORY_END),this.readBlockEndOfCentral(),this.diskNumber===i.MAX_VALUE_16BITS||this.diskWithCentralDirStart===i.MAX_VALUE_16BITS||this.centralDirRecordsOnThisDisk===i.MAX_VALUE_16BITS||this.centralDirRecords===i.MAX_VALUE_16BITS||this.centralDirSize===i.MAX_VALUE_32BITS||this.centralDirOffset===i.MAX_VALUE_32BITS){if(this.zip64=!0,(e=this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR))<0)throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory locator\");if(this.reader.setIndex(e),this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR),this.readBlockZip64EndOfCentralLocator(),!this.isSignature(this.relativeOffsetEndOfZip64CentralDir,s.ZIP64_CENTRAL_DIRECTORY_END)&&(this.relativeOffsetEndOfZip64CentralDir=this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_END),this.relativeOffsetEndOfZip64CentralDir<0))throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory\");this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir),this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_END),this.readBlockZip64EndOfCentral()}var r=this.centralDirOffset+this.centralDirSize;this.zip64&&(r+=20,r+=12+this.zip64EndOfCentralSize);var n=t-r;if(0<n)this.isSignature(t,s.CENTRAL_FILE_HEADER)||(this.reader.zero=n);else if(n<0)throw new Error(\"Corrupted zip: missing \"+Math.abs(n)+\" bytes.\")},prepareReader:function(e){this.reader=n(e)},load:function(e){this.prepareReader(e),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},t.exports=l},{\"./reader/readerFor\":22,\"./signature\":23,\"./support\":30,\"./utils\":32,\"./zipEntry\":34}],34:[function(e,t,r){var n=e(\"./reader/readerFor\"),i=e(\"./utils\"),s=e(\"./compressedObject\"),o=e(\"./crc32\"),a=e(\"./utf8\"),l=e(\"./compressions\"),c=e(\"./support\");function u(e,t){this.options=e,this.loadOptions=t}u.prototype={isEncrypted:function(){return 1==(1&this.bitFlag)},useUTF8:function(){return 2048==(2048&this.bitFlag)},readLocalPart:function(e){var t,r;if(e.skip(22),this.fileNameLength=e.readInt(2),r=e.readInt(2),this.fileName=e.readData(this.fileNameLength),e.skip(r),-1===this.compressedSize||-1===this.uncompressedSize)throw new Error(\"Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)\");if(null===(t=function(e){for(var t in l)if(Object.prototype.hasOwnProperty.call(l,t)&&l[t].magic===e)return l[t];return null}(this.compressionMethod)))throw new Error(\"Corrupted zip : compression \"+i.pretty(this.compressionMethod)+\" unknown (inner file : \"+i.transformTo(\"string\",this.fileName)+\")\");this.decompressed=new s(this.compressedSize,this.uncompressedSize,this.crc32,t,e.readData(this.compressedSize))},readCentralPart:function(e){this.versionMadeBy=e.readInt(2),e.skip(2),this.bitFlag=e.readInt(2),this.compressionMethod=e.readString(2),this.date=e.readDate(),this.crc32=e.readInt(4),this.compressedSize=e.readInt(4),this.uncompressedSize=e.readInt(4);var t=e.readInt(2);if(this.extraFieldsLength=e.readInt(2),this.fileCommentLength=e.readInt(2),this.diskNumberStart=e.readInt(2),this.internalFileAttributes=e.readInt(2),this.externalFileAttributes=e.readInt(4),this.localHeaderOffset=e.readInt(4),this.isEncrypted())throw new Error(\"Encrypted zip are not supported\");e.skip(t),this.readExtraFields(e),this.parseZIP64ExtraField(e),this.fileComment=e.readData(this.fileCommentLength)},processAttributes:function(){this.unixPermissions=null,this.dosPermissions=null;var e=this.versionMadeBy>>8;this.dir=!!(16&this.externalFileAttributes),0==e&&(this.dosPermissions=63&this.externalFileAttributes),3==e&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||\"/\"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var e=n(this.extraFields[1].value);this.uncompressedSize===i.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===i.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===i.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===i.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(e){var t,r,n,i=e.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});e.index+4<i;)t=e.readInt(2),r=e.readInt(2),n=e.readData(r),this.extraFields[t]={id:t,length:r,value:n};e.setIndex(i)},handleUTF8:function(){var e=c.uint8array?\"uint8array\":\"array\";if(this.useUTF8())this.fileNameStr=a.utf8decode(this.fileName),this.fileCommentStr=a.utf8decode(this.fileComment);else{var t=this.findExtraFieldUnicodePath();if(null!==t)this.fileNameStr=t;else{var r=i.transformTo(e,this.fileName);this.fileNameStr=this.loadOptions.decodeFileName(r)}var n=this.findExtraFieldUnicodeComment();if(null!==n)this.fileCommentStr=n;else{var s=i.transformTo(e,this.fileComment);this.fileCommentStr=this.loadOptions.decodeFileName(s)}}},findExtraFieldUnicodePath:function(){var e=this.extraFields[28789];if(e){var t=n(e.value);return 1!==t.readInt(1)||o(this.fileName)!==t.readInt(4)?null:a.utf8decode(t.readData(e.length-5))}return null},findExtraFieldUnicodeComment:function(){var e=this.extraFields[25461];if(e){var t=n(e.value);return 1!==t.readInt(1)||o(this.fileComment)!==t.readInt(4)?null:a.utf8decode(t.readData(e.length-5))}return null}},t.exports=u},{\"./compressedObject\":2,\"./compressions\":3,\"./crc32\":4,\"./reader/readerFor\":22,\"./support\":30,\"./utf8\":31,\"./utils\":32}],35:[function(e,t,r){function n(e,t,r){this.name=e,this.dir=r.dir,this.date=r.date,this.comment=r.comment,this.unixPermissions=r.unixPermissions,this.dosPermissions=r.dosPermissions,this._data=t,this._dataBinary=r.binary,this.options={compression:r.compression,compressionOptions:r.compressionOptions}}var i=e(\"./stream/StreamHelper\"),s=e(\"./stream/DataWorker\"),o=e(\"./utf8\"),a=e(\"./compressedObject\"),l=e(\"./stream/GenericWorker\");n.prototype={internalStream:function(e){var t=null,r=\"string\";try{if(!e)throw new Error(\"No output type specified.\");var n=\"string\"===(r=e.toLowerCase())||\"text\"===r;\"binarystring\"!==r&&\"text\"!==r||(r=\"string\"),t=this._decompressWorker();var s=!this._dataBinary;s&&!n&&(t=t.pipe(new o.Utf8EncodeWorker)),!s&&n&&(t=t.pipe(new o.Utf8DecodeWorker))}catch(e){(t=new l(\"error\")).error(e)}return new i(t,r,\"\")},async:function(e,t){return this.internalStream(e).accumulate(t)},nodeStream:function(e,t){return this.internalStream(e||\"nodebuffer\").toNodejsStream(t)},_compressWorker:function(e,t){if(this._data instanceof a&&this._data.compression.magic===e.magic)return this._data.getCompressedWorker();var r=this._decompressWorker();return this._dataBinary||(r=r.pipe(new o.Utf8EncodeWorker)),a.createWorkerFrom(r,e,t)},_decompressWorker:function(){return this._data instanceof a?this._data.getContentWorker():this._data instanceof l?this._data:new s(this._data)}};for(var c=[\"asText\",\"asBinary\",\"asNodeBuffer\",\"asUint8Array\",\"asArrayBuffer\"],u=function(){throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\")},h=0;h<c.length;h++)n.prototype[c[h]]=u;t.exports=n},{\"./compressedObject\":2,\"./stream/DataWorker\":27,\"./stream/GenericWorker\":28,\"./stream/StreamHelper\":29,\"./utf8\":31}],36:[function(e,t,r){(function(e){var r,n,i=e.MutationObserver||e.WebKitMutationObserver;if(i){var s=0,o=new i(u),a=e.document.createTextNode(\"\");o.observe(a,{characterData:!0}),r=function(){a.data=s=++s%2}}else if(e.setImmediate||void 0===e.MessageChannel)r=\"document\"in e&&\"onreadystatechange\"in e.document.createElement(\"script\")?function(){var t=e.document.createElement(\"script\");t.onreadystatechange=function(){u(),t.onreadystatechange=null,t.parentNode.removeChild(t),t=null},e.document.documentElement.appendChild(t)}:function(){setTimeout(u,0)};else{var l=new e.MessageChannel;l.port1.onmessage=u,r=function(){l.port2.postMessage(0)}}var c=[];function u(){var e,t;n=!0;for(var r=c.length;r;){for(t=c,c=[],e=-1;++e<r;)t[e]();r=c.length}n=!1}t.exports=function(e){1!==c.push(e)||n||r()}}).call(this,void 0!==i?i:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}],37:[function(e,t,r){var n=e(\"immediate\");function i(){}var s={},o=[\"REJECTED\"],a=[\"FULFILLED\"],l=[\"PENDING\"];function c(e){if(\"function\"!=typeof e)throw new TypeError(\"resolver must be a function\");this.state=l,this.queue=[],this.outcome=void 0,e!==i&&d(this,e)}function u(e,t,r){this.promise=e,\"function\"==typeof t&&(this.onFulfilled=t,this.callFulfilled=this.otherCallFulfilled),\"function\"==typeof r&&(this.onRejected=r,this.callRejected=this.otherCallRejected)}function h(e,t,r){n((function(){var n;try{n=t(r)}catch(n){return s.reject(e,n)}n===e?s.reject(e,new TypeError(\"Cannot resolve promise with itself\")):s.resolve(e,n)}))}function f(e){var t=e&&e.then;if(e&&(\"object\"==typeof e||\"function\"==typeof e)&&\"function\"==typeof t)return function(){t.apply(e,arguments)}}function d(e,t){var r=!1;function n(t){r||(r=!0,s.reject(e,t))}function i(t){r||(r=!0,s.resolve(e,t))}var o=p((function(){t(i,n)}));\"error\"===o.status&&n(o.value)}function p(e,t){var r={};try{r.value=e(t),r.status=\"success\"}catch(e){r.status=\"error\",r.value=e}return r}(t.exports=c).prototype.finally=function(e){if(\"function\"!=typeof e)return this;var t=this.constructor;return this.then((function(r){return t.resolve(e()).then((function(){return r}))}),(function(r){return t.resolve(e()).then((function(){throw r}))}))},c.prototype.catch=function(e){return this.then(null,e)},c.prototype.then=function(e,t){if(\"function\"!=typeof e&&this.state===a||\"function\"!=typeof t&&this.state===o)return this;var r=new this.constructor(i);return this.state!==l?h(r,this.state===a?e:t,this.outcome):this.queue.push(new u(r,e,t)),r},u.prototype.callFulfilled=function(e){s.resolve(this.promise,e)},u.prototype.otherCallFulfilled=function(e){h(this.promise,this.onFulfilled,e)},u.prototype.callRejected=function(e){s.reject(this.promise,e)},u.prototype.otherCallRejected=function(e){h(this.promise,this.onRejected,e)},s.resolve=function(e,t){var r=p(f,t);if(\"error\"===r.status)return s.reject(e,r.value);var n=r.value;if(n)d(e,n);else{e.state=a,e.outcome=t;for(var i=-1,o=e.queue.length;++i<o;)e.queue[i].callFulfilled(t)}return e},s.reject=function(e,t){e.state=o,e.outcome=t;for(var r=-1,n=e.queue.length;++r<n;)e.queue[r].callRejected(t);return e},c.resolve=function(e){return e instanceof this?e:s.resolve(new this(i),e)},c.reject=function(e){var t=new this(i);return s.reject(t,e)},c.all=function(e){var t=this;if(\"[object Array]\"!==Object.prototype.toString.call(e))return this.reject(new TypeError(\"must be an array\"));var r=e.length,n=!1;if(!r)return this.resolve([]);for(var o=new Array(r),a=0,l=-1,c=new this(i);++l<r;)u(e[l],l);return c;function u(e,i){t.resolve(e).then((function(e){o[i]=e,++a!==r||n||(n=!0,s.resolve(c,o))}),(function(e){n||(n=!0,s.reject(c,e))}))}},c.race=function(e){if(\"[object Array]\"!==Object.prototype.toString.call(e))return this.reject(new TypeError(\"must be an array\"));var t=e.length,r=!1;if(!t)return this.resolve([]);for(var n,o=-1,a=new this(i);++o<t;)n=e[o],this.resolve(n).then((function(e){r||(r=!0,s.resolve(a,e))}),(function(e){r||(r=!0,s.reject(a,e))}));return a}},{immediate:36}],38:[function(e,t,r){var n={};(0,e(\"./lib/utils/common\").assign)(n,e(\"./lib/deflate\"),e(\"./lib/inflate\"),e(\"./lib/zlib/constants\")),t.exports=n},{\"./lib/deflate\":39,\"./lib/inflate\":40,\"./lib/utils/common\":41,\"./lib/zlib/constants\":44}],39:[function(e,t,r){var n=e(\"./zlib/deflate\"),i=e(\"./utils/common\"),s=e(\"./utils/strings\"),o=e(\"./zlib/messages\"),a=e(\"./zlib/zstream\"),l=Object.prototype.toString;function c(e){if(!(this instanceof c))return new c(e);this.options=i.assign({level:-1,method:8,chunkSize:16384,windowBits:15,memLevel:8,strategy:0,to:\"\"},e||{});var t=this.options;t.raw&&0<t.windowBits?t.windowBits=-t.windowBits:t.gzip&&0<t.windowBits&&t.windowBits<16&&(t.windowBits+=16),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new a,this.strm.avail_out=0;var r=n.deflateInit2(this.strm,t.level,t.method,t.windowBits,t.memLevel,t.strategy);if(0!==r)throw new Error(o[r]);if(t.header&&n.deflateSetHeader(this.strm,t.header),t.dictionary){var u;if(u=\"string\"==typeof t.dictionary?s.string2buf(t.dictionary):\"[object ArrayBuffer]\"===l.call(t.dictionary)?new Uint8Array(t.dictionary):t.dictionary,0!==(r=n.deflateSetDictionary(this.strm,u)))throw new Error(o[r]);this._dict_set=!0}}function u(e,t){var r=new c(t);if(r.push(e,!0),r.err)throw r.msg||o[r.err];return r.result}c.prototype.push=function(e,t){var r,o,a=this.strm,c=this.options.chunkSize;if(this.ended)return!1;o=t===~~t?t:!0===t?4:0,\"string\"==typeof e?a.input=s.string2buf(e):\"[object ArrayBuffer]\"===l.call(e)?a.input=new Uint8Array(e):a.input=e,a.next_in=0,a.avail_in=a.input.length;do{if(0===a.avail_out&&(a.output=new i.Buf8(c),a.next_out=0,a.avail_out=c),1!==(r=n.deflate(a,o))&&0!==r)return this.onEnd(r),!(this.ended=!0);0!==a.avail_out&&(0!==a.avail_in||4!==o&&2!==o)||(\"string\"===this.options.to?this.onData(s.buf2binstring(i.shrinkBuf(a.output,a.next_out))):this.onData(i.shrinkBuf(a.output,a.next_out)))}while((0<a.avail_in||0===a.avail_out)&&1!==r);return 4===o?(r=n.deflateEnd(this.strm),this.onEnd(r),this.ended=!0,0===r):2!==o||(this.onEnd(0),!(a.avail_out=0))},c.prototype.onData=function(e){this.chunks.push(e)},c.prototype.onEnd=function(e){0===e&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=i.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Deflate=c,r.deflate=u,r.deflateRaw=function(e,t){return(t=t||{}).raw=!0,u(e,t)},r.gzip=function(e,t){return(t=t||{}).gzip=!0,u(e,t)}},{\"./utils/common\":41,\"./utils/strings\":42,\"./zlib/deflate\":46,\"./zlib/messages\":51,\"./zlib/zstream\":53}],40:[function(e,t,r){var n=e(\"./zlib/inflate\"),i=e(\"./utils/common\"),s=e(\"./utils/strings\"),o=e(\"./zlib/constants\"),a=e(\"./zlib/messages\"),l=e(\"./zlib/zstream\"),c=e(\"./zlib/gzheader\"),u=Object.prototype.toString;function h(e){if(!(this instanceof h))return new h(e);this.options=i.assign({chunkSize:16384,windowBits:0,to:\"\"},e||{});var t=this.options;t.raw&&0<=t.windowBits&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(0<=t.windowBits&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),15<t.windowBits&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new l,this.strm.avail_out=0;var r=n.inflateInit2(this.strm,t.windowBits);if(r!==o.Z_OK)throw new Error(a[r]);this.header=new c,n.inflateGetHeader(this.strm,this.header)}function f(e,t){var r=new h(t);if(r.push(e,!0),r.err)throw r.msg||a[r.err];return r.result}h.prototype.push=function(e,t){var r,a,l,c,h,f,d=this.strm,p=this.options.chunkSize,m=this.options.dictionary,b=!1;if(this.ended)return!1;a=t===~~t?t:!0===t?o.Z_FINISH:o.Z_NO_FLUSH,\"string\"==typeof e?d.input=s.binstring2buf(e):\"[object ArrayBuffer]\"===u.call(e)?d.input=new Uint8Array(e):d.input=e,d.next_in=0,d.avail_in=d.input.length;do{if(0===d.avail_out&&(d.output=new i.Buf8(p),d.next_out=0,d.avail_out=p),(r=n.inflate(d,o.Z_NO_FLUSH))===o.Z_NEED_DICT&&m&&(f=\"string\"==typeof m?s.string2buf(m):\"[object ArrayBuffer]\"===u.call(m)?new Uint8Array(m):m,r=n.inflateSetDictionary(this.strm,f)),r===o.Z_BUF_ERROR&&!0===b&&(r=o.Z_OK,b=!1),r!==o.Z_STREAM_END&&r!==o.Z_OK)return this.onEnd(r),!(this.ended=!0);d.next_out&&(0!==d.avail_out&&r!==o.Z_STREAM_END&&(0!==d.avail_in||a!==o.Z_FINISH&&a!==o.Z_SYNC_FLUSH)||(\"string\"===this.options.to?(l=s.utf8border(d.output,d.next_out),c=d.next_out-l,h=s.buf2string(d.output,l),d.next_out=c,d.avail_out=p-c,c&&i.arraySet(d.output,d.output,l,c,0),this.onData(h)):this.onData(i.shrinkBuf(d.output,d.next_out)))),0===d.avail_in&&0===d.avail_out&&(b=!0)}while((0<d.avail_in||0===d.avail_out)&&r!==o.Z_STREAM_END);return r===o.Z_STREAM_END&&(a=o.Z_FINISH),a===o.Z_FINISH?(r=n.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===o.Z_OK):a!==o.Z_SYNC_FLUSH||(this.onEnd(o.Z_OK),!(d.avail_out=0))},h.prototype.onData=function(e){this.chunks.push(e)},h.prototype.onEnd=function(e){e===o.Z_OK&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=i.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Inflate=h,r.inflate=f,r.inflateRaw=function(e,t){return(t=t||{}).raw=!0,f(e,t)},r.ungzip=f},{\"./utils/common\":41,\"./utils/strings\":42,\"./zlib/constants\":44,\"./zlib/gzheader\":47,\"./zlib/inflate\":49,\"./zlib/messages\":51,\"./zlib/zstream\":53}],41:[function(e,t,r){var n=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Int32Array;r.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var r=t.shift();if(r){if(\"object\"!=typeof r)throw new TypeError(r+\"must be non-object\");for(var n in r)r.hasOwnProperty(n)&&(e[n]=r[n])}}return e},r.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var i={arraySet:function(e,t,r,n,i){if(t.subarray&&e.subarray)e.set(t.subarray(r,r+n),i);else for(var s=0;s<n;s++)e[i+s]=t[r+s]},flattenChunks:function(e){var t,r,n,i,s,o;for(t=n=0,r=e.length;t<r;t++)n+=e[t].length;for(o=new Uint8Array(n),t=i=0,r=e.length;t<r;t++)s=e[t],o.set(s,i),i+=s.length;return o}},s={arraySet:function(e,t,r,n,i){for(var s=0;s<n;s++)e[i+s]=t[r+s]},flattenChunks:function(e){return[].concat.apply([],e)}};r.setTyped=function(e){e?(r.Buf8=Uint8Array,r.Buf16=Uint16Array,r.Buf32=Int32Array,r.assign(r,i)):(r.Buf8=Array,r.Buf16=Array,r.Buf32=Array,r.assign(r,s))},r.setTyped(n)},{}],42:[function(e,t,r){var n=e(\"./common\"),i=!0,s=!0;try{String.fromCharCode.apply(null,[0])}catch(e){i=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){s=!1}for(var o=new n.Buf8(256),a=0;a<256;a++)o[a]=252<=a?6:248<=a?5:240<=a?4:224<=a?3:192<=a?2:1;function l(e,t){if(t<65537&&(e.subarray&&s||!e.subarray&&i))return String.fromCharCode.apply(null,n.shrinkBuf(e,t));for(var r=\"\",o=0;o<t;o++)r+=String.fromCharCode(e[o]);return r}o[254]=o[254]=1,r.string2buf=function(e){var t,r,i,s,o,a=e.length,l=0;for(s=0;s<a;s++)55296==(64512&(r=e.charCodeAt(s)))&&s+1<a&&56320==(64512&(i=e.charCodeAt(s+1)))&&(r=65536+(r-55296<<10)+(i-56320),s++),l+=r<128?1:r<2048?2:r<65536?3:4;for(t=new n.Buf8(l),s=o=0;o<l;s++)55296==(64512&(r=e.charCodeAt(s)))&&s+1<a&&56320==(64512&(i=e.charCodeAt(s+1)))&&(r=65536+(r-55296<<10)+(i-56320),s++),r<128?t[o++]=r:(r<2048?t[o++]=192|r>>>6:(r<65536?t[o++]=224|r>>>12:(t[o++]=240|r>>>18,t[o++]=128|r>>>12&63),t[o++]=128|r>>>6&63),t[o++]=128|63&r);return t},r.buf2binstring=function(e){return l(e,e.length)},r.binstring2buf=function(e){for(var t=new n.Buf8(e.length),r=0,i=t.length;r<i;r++)t[r]=e.charCodeAt(r);return t},r.buf2string=function(e,t){var r,n,i,s,a=t||e.length,c=new Array(2*a);for(r=n=0;r<a;)if((i=e[r++])<128)c[n++]=i;else if(4<(s=o[i]))c[n++]=65533,r+=s-1;else{for(i&=2===s?31:3===s?15:7;1<s&&r<a;)i=i<<6|63&e[r++],s--;1<s?c[n++]=65533:i<65536?c[n++]=i:(i-=65536,c[n++]=55296|i>>10&1023,c[n++]=56320|1023&i)}return l(c,n)},r.utf8border=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0||0===r?t:r+o[e[r]]>t?r:t}},{\"./common\":41}],43:[function(e,t,r){t.exports=function(e,t,r,n){for(var i=65535&e|0,s=e>>>16&65535|0,o=0;0!==r;){for(r-=o=2e3<r?2e3:r;s=s+(i=i+t[n++]|0)|0,--o;);i%=65521,s%=65521}return i|s<<16|0}},{}],44:[function(e,t,r){t.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],45:[function(e,t,r){var n=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t,r,i){var s=n,o=i+r;e^=-1;for(var a=i;a<o;a++)e=e>>>8^s[255&(e^t[a])];return-1^e}},{}],46:[function(e,t,r){var n,i=e(\"../utils/common\"),s=e(\"./trees\"),o=e(\"./adler32\"),a=e(\"./crc32\"),l=e(\"./messages\"),c=-2,u=258,h=262,f=113;function d(e,t){return e.msg=l[t],t}function p(e){return(e<<1)-(4<e?9:0)}function m(e){for(var t=e.length;0<=--t;)e[t]=0}function b(e){var t=e.state,r=t.pending;r>e.avail_out&&(r=e.avail_out),0!==r&&(i.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function g(e,t){s._tr_flush_block(e,0<=e.block_start?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,b(e.strm)}function y(e,t){e.pending_buf[e.pending++]=t}function v(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function w(e,t){var r,n,i=e.max_chain_length,s=e.strstart,o=e.prev_length,a=e.nice_match,l=e.strstart>e.w_size-h?e.strstart-(e.w_size-h):0,c=e.window,f=e.w_mask,d=e.prev,p=e.strstart+u,m=c[s+o-1],b=c[s+o];e.prev_length>=e.good_match&&(i>>=2),a>e.lookahead&&(a=e.lookahead);do{if(c[(r=t)+o]===b&&c[r+o-1]===m&&c[r]===c[s]&&c[++r]===c[s+1]){s+=2,r++;do{}while(c[++s]===c[++r]&&c[++s]===c[++r]&&c[++s]===c[++r]&&c[++s]===c[++r]&&c[++s]===c[++r]&&c[++s]===c[++r]&&c[++s]===c[++r]&&c[++s]===c[++r]&&s<p);if(n=u-(p-s),s=p-u,o<n){if(e.match_start=t,a<=(o=n))break;m=c[s+o-1],b=c[s+o]}}}while((t=d[t&f])>l&&0!=--i);return o<=e.lookahead?o:e.lookahead}function _(e){var t,r,n,s,l,c,u,f,d,p,m=e.w_size;do{if(s=e.window_size-e.lookahead-e.strstart,e.strstart>=m+(m-h)){for(i.arraySet(e.window,e.window,m,m,0),e.match_start-=m,e.strstart-=m,e.block_start-=m,t=r=e.hash_size;n=e.head[--t],e.head[t]=m<=n?n-m:0,--r;);for(t=r=m;n=e.prev[--t],e.prev[t]=m<=n?n-m:0,--r;);s+=m}if(0===e.strm.avail_in)break;if(c=e.strm,u=e.window,f=e.strstart+e.lookahead,p=void 0,(d=s)<(p=c.avail_in)&&(p=d),r=0===p?0:(c.avail_in-=p,i.arraySet(u,c.input,c.next_in,p,f),1===c.state.wrap?c.adler=o(c.adler,u,p,f):2===c.state.wrap&&(c.adler=a(c.adler,u,p,f)),c.next_in+=p,c.total_in+=p,p),e.lookahead+=r,e.lookahead+e.insert>=3)for(l=e.strstart-e.insert,e.ins_h=e.window[l],e.ins_h=(e.ins_h<<e.hash_shift^e.window[l+1])&e.hash_mask;e.insert&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[l+3-1])&e.hash_mask,e.prev[l&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=l,l++,e.insert--,!(e.lookahead+e.insert<3)););}while(e.lookahead<h&&0!==e.strm.avail_in)}function x(e,t){for(var r,n;;){if(e.lookahead<h){if(_(e),e.lookahead<h&&0===t)return 1;if(0===e.lookahead)break}if(r=0,e.lookahead>=3&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+3-1])&e.hash_mask,r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),0!==r&&e.strstart-r<=e.w_size-h&&(e.match_length=w(e,r)),e.match_length>=3)if(n=s._tr_tally(e,e.strstart-e.match_start,e.match_length-3),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=3){for(e.match_length--;e.strstart++,e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+3-1])&e.hash_mask,r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart,0!=--e.match_length;);e.strstart++}else e.strstart+=e.match_length,e.match_length=0,e.ins_h=e.window[e.strstart],e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+1])&e.hash_mask;else n=s._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++;if(n&&(g(e,!1),0===e.strm.avail_out))return 1}return e.insert=e.strstart<2?e.strstart:2,4===t?(g(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(g(e,!1),0===e.strm.avail_out)?1:2}function k(e,t){for(var r,n,i;;){if(e.lookahead<h){if(_(e),e.lookahead<h&&0===t)return 1;if(0===e.lookahead)break}if(r=0,e.lookahead>=3&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+3-1])&e.hash_mask,r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),e.prev_length=e.match_length,e.prev_match=e.match_start,e.match_length=2,0!==r&&e.prev_length<e.max_lazy_match&&e.strstart-r<=e.w_size-h&&(e.match_length=w(e,r),e.match_length<=5&&(1===e.strategy||3===e.match_length&&4096<e.strstart-e.match_start)&&(e.match_length=2)),e.prev_length>=3&&e.match_length<=e.prev_length){for(i=e.strstart+e.lookahead-3,n=s._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-3),e.lookahead-=e.prev_length-1,e.prev_length-=2;++e.strstart<=i&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+3-1])&e.hash_mask,r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),0!=--e.prev_length;);if(e.match_available=0,e.match_length=2,e.strstart++,n&&(g(e,!1),0===e.strm.avail_out))return 1}else if(e.match_available){if((n=s._tr_tally(e,0,e.window[e.strstart-1]))&&g(e,!1),e.strstart++,e.lookahead--,0===e.strm.avail_out)return 1}else e.match_available=1,e.strstart++,e.lookahead--}return e.match_available&&(n=s._tr_tally(e,0,e.window[e.strstart-1]),e.match_available=0),e.insert=e.strstart<2?e.strstart:2,4===t?(g(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(g(e,!1),0===e.strm.avail_out)?1:2}function S(e,t,r,n,i){this.good_length=e,this.max_lazy=t,this.nice_length=r,this.max_chain=n,this.func=i}function M(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=8,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new i.Buf16(1146),this.dyn_dtree=new i.Buf16(122),this.bl_tree=new i.Buf16(78),m(this.dyn_ltree),m(this.dyn_dtree),m(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new i.Buf16(16),this.heap=new i.Buf16(573),m(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new i.Buf16(573),m(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function C(e){var t;return e&&e.state?(e.total_in=e.total_out=0,e.data_type=2,(t=e.state).pending=0,t.pending_out=0,t.wrap<0&&(t.wrap=-t.wrap),t.status=t.wrap?42:f,e.adler=2===t.wrap?0:1,t.last_flush=0,s._tr_init(t),0):d(e,c)}function T(e){var t=C(e);return 0===t&&function(e){e.window_size=2*e.w_size,m(e.head),e.max_lazy_match=n[e.level].max_lazy,e.good_match=n[e.level].good_length,e.nice_match=n[e.level].nice_length,e.max_chain_length=n[e.level].max_chain,e.strstart=0,e.block_start=0,e.lookahead=0,e.insert=0,e.match_length=e.prev_length=2,e.match_available=0,e.ins_h=0}(e.state),t}function E(e,t,r,n,s,o){if(!e)return c;var a=1;if(-1===t&&(t=6),n<0?(a=0,n=-n):15<n&&(a=2,n-=16),s<1||9<s||8!==r||n<8||15<n||t<0||9<t||o<0||4<o)return d(e,c);8===n&&(n=9);var l=new M;return(e.state=l).strm=e,l.wrap=a,l.gzhead=null,l.w_bits=n,l.w_size=1<<l.w_bits,l.w_mask=l.w_size-1,l.hash_bits=s+7,l.hash_size=1<<l.hash_bits,l.hash_mask=l.hash_size-1,l.hash_shift=~~((l.hash_bits+3-1)/3),l.window=new i.Buf8(2*l.w_size),l.head=new i.Buf16(l.hash_size),l.prev=new i.Buf16(l.w_size),l.lit_bufsize=1<<s+6,l.pending_buf_size=4*l.lit_bufsize,l.pending_buf=new i.Buf8(l.pending_buf_size),l.d_buf=1*l.lit_bufsize,l.l_buf=3*l.lit_bufsize,l.level=t,l.strategy=o,l.method=r,T(e)}n=[new S(0,0,0,0,(function(e,t){var r=65535;for(r>e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(_(e),0===e.lookahead&&0===t)return 1;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,g(e,!1),0===e.strm.avail_out))return 1;if(e.strstart-e.block_start>=e.w_size-h&&(g(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(g(e,!0),0===e.strm.avail_out?3:4):(e.strstart>e.block_start&&(g(e,!1),e.strm.avail_out),1)})),new S(4,4,8,4,x),new S(4,5,16,8,x),new S(4,6,32,32,x),new S(4,4,16,16,k),new S(8,16,32,32,k),new S(8,16,128,128,k),new S(8,32,128,256,k),new S(32,128,258,1024,k),new S(32,258,258,4096,k)],r.deflateInit=function(e,t){return E(e,t,8,15,8,0)},r.deflateInit2=E,r.deflateReset=T,r.deflateResetKeep=C,r.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?c:(e.state.gzhead=t,0):c},r.deflate=function(e,t){var r,i,o,l;if(!e||!e.state||5<t||t<0)return e?d(e,c):c;if(i=e.state,!e.output||!e.input&&0!==e.avail_in||666===i.status&&4!==t)return d(e,0===e.avail_out?-5:c);if(i.strm=e,r=i.last_flush,i.last_flush=t,42===i.status)if(2===i.wrap)e.adler=0,y(i,31),y(i,139),y(i,8),i.gzhead?(y(i,(i.gzhead.text?1:0)+(i.gzhead.hcrc?2:0)+(i.gzhead.extra?4:0)+(i.gzhead.name?8:0)+(i.gzhead.comment?16:0)),y(i,255&i.gzhead.time),y(i,i.gzhead.time>>8&255),y(i,i.gzhead.time>>16&255),y(i,i.gzhead.time>>24&255),y(i,9===i.level?2:2<=i.strategy||i.level<2?4:0),y(i,255&i.gzhead.os),i.gzhead.extra&&i.gzhead.extra.length&&(y(i,255&i.gzhead.extra.length),y(i,i.gzhead.extra.length>>8&255)),i.gzhead.hcrc&&(e.adler=a(e.adler,i.pending_buf,i.pending,0)),i.gzindex=0,i.status=69):(y(i,0),y(i,0),y(i,0),y(i,0),y(i,0),y(i,9===i.level?2:2<=i.strategy||i.level<2?4:0),y(i,3),i.status=f);else{var h=8+(i.w_bits-8<<4)<<8;h|=(2<=i.strategy||i.level<2?0:i.level<6?1:6===i.level?2:3)<<6,0!==i.strstart&&(h|=32),h+=31-h%31,i.status=f,v(i,h),0!==i.strstart&&(v(i,e.adler>>>16),v(i,65535&e.adler)),e.adler=1}if(69===i.status)if(i.gzhead.extra){for(o=i.pending;i.gzindex<(65535&i.gzhead.extra.length)&&(i.pending!==i.pending_buf_size||(i.gzhead.hcrc&&i.pending>o&&(e.adler=a(e.adler,i.pending_buf,i.pending-o,o)),b(e),o=i.pending,i.pending!==i.pending_buf_size));)y(i,255&i.gzhead.extra[i.gzindex]),i.gzindex++;i.gzhead.hcrc&&i.pending>o&&(e.adler=a(e.adler,i.pending_buf,i.pending-o,o)),i.gzindex===i.gzhead.extra.length&&(i.gzindex=0,i.status=73)}else i.status=73;if(73===i.status)if(i.gzhead.name){o=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>o&&(e.adler=a(e.adler,i.pending_buf,i.pending-o,o)),b(e),o=i.pending,i.pending===i.pending_buf_size)){l=1;break}l=i.gzindex<i.gzhead.name.length?255&i.gzhead.name.charCodeAt(i.gzindex++):0,y(i,l)}while(0!==l);i.gzhead.hcrc&&i.pending>o&&(e.adler=a(e.adler,i.pending_buf,i.pending-o,o)),0===l&&(i.gzindex=0,i.status=91)}else i.status=91;if(91===i.status)if(i.gzhead.comment){o=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>o&&(e.adler=a(e.adler,i.pending_buf,i.pending-o,o)),b(e),o=i.pending,i.pending===i.pending_buf_size)){l=1;break}l=i.gzindex<i.gzhead.comment.length?255&i.gzhead.comment.charCodeAt(i.gzindex++):0,y(i,l)}while(0!==l);i.gzhead.hcrc&&i.pending>o&&(e.adler=a(e.adler,i.pending_buf,i.pending-o,o)),0===l&&(i.status=103)}else i.status=103;if(103===i.status&&(i.gzhead.hcrc?(i.pending+2>i.pending_buf_size&&b(e),i.pending+2<=i.pending_buf_size&&(y(i,255&e.adler),y(i,e.adler>>8&255),e.adler=0,i.status=f)):i.status=f),0!==i.pending){if(b(e),0===e.avail_out)return i.last_flush=-1,0}else if(0===e.avail_in&&p(t)<=p(r)&&4!==t)return d(e,-5);if(666===i.status&&0!==e.avail_in)return d(e,-5);if(0!==e.avail_in||0!==i.lookahead||0!==t&&666!==i.status){var w=2===i.strategy?function(e,t){for(var r;;){if(0===e.lookahead&&(_(e),0===e.lookahead)){if(0===t)return 1;break}if(e.match_length=0,r=s._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(g(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(g(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(g(e,!1),0===e.strm.avail_out)?1:2}(i,t):3===i.strategy?function(e,t){for(var r,n,i,o,a=e.window;;){if(e.lookahead<=u){if(_(e),e.lookahead<=u&&0===t)return 1;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=3&&0<e.strstart&&(n=a[i=e.strstart-1])===a[++i]&&n===a[++i]&&n===a[++i]){o=e.strstart+u;do{}while(n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&i<o);e.match_length=u-(o-i),e.match_length>e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=3?(r=s._tr_tally(e,1,e.match_length-3),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=s._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(g(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(g(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(g(e,!1),0===e.strm.avail_out)?1:2}(i,t):n[i.level].func(i,t);if(3!==w&&4!==w||(i.status=666),1===w||3===w)return 0===e.avail_out&&(i.last_flush=-1),0;if(2===w&&(1===t?s._tr_align(i):5!==t&&(s._tr_stored_block(i,0,0,!1),3===t&&(m(i.head),0===i.lookahead&&(i.strstart=0,i.block_start=0,i.insert=0))),b(e),0===e.avail_out))return i.last_flush=-1,0}return 4!==t?0:i.wrap<=0?1:(2===i.wrap?(y(i,255&e.adler),y(i,e.adler>>8&255),y(i,e.adler>>16&255),y(i,e.adler>>24&255),y(i,255&e.total_in),y(i,e.total_in>>8&255),y(i,e.total_in>>16&255),y(i,e.total_in>>24&255)):(v(i,e.adler>>>16),v(i,65535&e.adler)),b(e),0<i.wrap&&(i.wrap=-i.wrap),0!==i.pending?0:1)},r.deflateEnd=function(e){var t;return e&&e.state?42!==(t=e.state.status)&&69!==t&&73!==t&&91!==t&&103!==t&&t!==f&&666!==t?d(e,c):(e.state=null,t===f?d(e,-3):0):c},r.deflateSetDictionary=function(e,t){var r,n,s,a,l,u,h,f,d=t.length;if(!e||!e.state)return c;if(2===(a=(r=e.state).wrap)||1===a&&42!==r.status||r.lookahead)return c;for(1===a&&(e.adler=o(e.adler,t,d,0)),r.wrap=0,d>=r.w_size&&(0===a&&(m(r.head),r.strstart=0,r.block_start=0,r.insert=0),f=new i.Buf8(r.w_size),i.arraySet(f,t,d-r.w_size,r.w_size,0),t=f,d=r.w_size),l=e.avail_in,u=e.next_in,h=e.input,e.avail_in=d,e.next_in=0,e.input=t,_(r);r.lookahead>=3;){for(n=r.strstart,s=r.lookahead-2;r.ins_h=(r.ins_h<<r.hash_shift^r.window[n+3-1])&r.hash_mask,r.prev[n&r.w_mask]=r.head[r.ins_h],r.head[r.ins_h]=n,n++,--s;);r.strstart=n,r.lookahead=2,_(r)}return r.strstart+=r.lookahead,r.block_start=r.strstart,r.insert=r.lookahead,r.lookahead=0,r.match_length=r.prev_length=2,r.match_available=0,e.next_in=u,e.input=h,e.avail_in=l,r.wrap=a,0},r.deflateInfo=\"pako deflate (from Nodeca project)\"},{\"../utils/common\":41,\"./adler32\":43,\"./crc32\":45,\"./messages\":51,\"./trees\":52}],47:[function(e,t,r){t.exports=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name=\"\",this.comment=\"\",this.hcrc=0,this.done=!1}},{}],48:[function(e,t,r){t.exports=function(e,t){var r,n,i,s,o,a,l,c,u,h,f,d,p,m,b,g,y,v,w,_,x,k,S,M,C;r=e.state,n=e.next_in,M=e.input,i=n+(e.avail_in-5),s=e.next_out,C=e.output,o=s-(t-e.avail_out),a=s+(e.avail_out-257),l=r.dmax,c=r.wsize,u=r.whave,h=r.wnext,f=r.window,d=r.hold,p=r.bits,m=r.lencode,b=r.distcode,g=(1<<r.lenbits)-1,y=(1<<r.distbits)-1;e:do{p<15&&(d+=M[n++]<<p,p+=8,d+=M[n++]<<p,p+=8),v=m[d&g];t:for(;;){if(d>>>=w=v>>>24,p-=w,0==(w=v>>>16&255))C[s++]=65535&v;else{if(!(16&w)){if(0==(64&w)){v=m[(65535&v)+(d&(1<<w)-1)];continue t}if(32&w){r.mode=12;break e}e.msg=\"invalid literal/length code\",r.mode=30;break e}_=65535&v,(w&=15)&&(p<w&&(d+=M[n++]<<p,p+=8),_+=d&(1<<w)-1,d>>>=w,p-=w),p<15&&(d+=M[n++]<<p,p+=8,d+=M[n++]<<p,p+=8),v=b[d&y];r:for(;;){if(d>>>=w=v>>>24,p-=w,!(16&(w=v>>>16&255))){if(0==(64&w)){v=b[(65535&v)+(d&(1<<w)-1)];continue r}e.msg=\"invalid distance code\",r.mode=30;break e}if(x=65535&v,p<(w&=15)&&(d+=M[n++]<<p,(p+=8)<w&&(d+=M[n++]<<p,p+=8)),l<(x+=d&(1<<w)-1)){e.msg=\"invalid distance too far back\",r.mode=30;break e}if(d>>>=w,p-=w,(w=s-o)<x){if(u<(w=x-w)&&r.sane){e.msg=\"invalid distance too far back\",r.mode=30;break e}if(S=f,(k=0)===h){if(k+=c-w,w<_){for(_-=w;C[s++]=f[k++],--w;);k=s-x,S=C}}else if(h<w){if(k+=c+h-w,(w-=h)<_){for(_-=w;C[s++]=f[k++],--w;);if(k=0,h<_){for(_-=w=h;C[s++]=f[k++],--w;);k=s-x,S=C}}}else if(k+=h-w,w<_){for(_-=w;C[s++]=f[k++],--w;);k=s-x,S=C}for(;2<_;)C[s++]=S[k++],C[s++]=S[k++],C[s++]=S[k++],_-=3;_&&(C[s++]=S[k++],1<_&&(C[s++]=S[k++]))}else{for(k=s-x;C[s++]=C[k++],C[s++]=C[k++],C[s++]=C[k++],2<(_-=3););_&&(C[s++]=C[k++],1<_&&(C[s++]=C[k++]))}break}}break}}while(n<i&&s<a);n-=_=p>>3,d&=(1<<(p-=_<<3))-1,e.next_in=n,e.next_out=s,e.avail_in=n<i?i-n+5:5-(n-i),e.avail_out=s<a?a-s+257:257-(s-a),r.hold=d,r.bits=p}},{}],49:[function(e,t,r){var n=e(\"../utils/common\"),i=e(\"./adler32\"),s=e(\"./crc32\"),o=e(\"./inffast\"),a=e(\"./inftrees\"),l=-2;function c(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function u(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new n.Buf16(320),this.work=new n.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function h(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new n.Buf32(852),t.distcode=t.distdyn=new n.Buf32(592),t.sane=1,t.back=-1,0):l}function f(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,h(e)):l}function d(e,t){var r,n;return e&&e.state?(n=e.state,t<0?(r=0,t=-t):(r=1+(t>>4),t<48&&(t&=15)),t&&(t<8||15<t)?l:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=r,n.wbits=t,f(e))):l}function p(e,t){var r,n;return e?(n=new u,(e.state=n).window=null,0!==(r=d(e,t))&&(e.state=null),r):l}var m,b,g=!0;function y(e){if(g){var t;for(m=new n.Buf32(512),b=new n.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(a(1,e.lens,0,288,m,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;a(2,e.lens,0,32,b,0,e.work,{bits:5}),g=!1}e.lencode=m,e.lenbits=9,e.distcode=b,e.distbits=5}function v(e,t,r,i){var s,o=e.state;return null===o.window&&(o.wsize=1<<o.wbits,o.wnext=0,o.whave=0,o.window=new n.Buf8(o.wsize)),i>=o.wsize?(n.arraySet(o.window,t,r-o.wsize,o.wsize,0),o.wnext=0,o.whave=o.wsize):(i<(s=o.wsize-o.wnext)&&(s=i),n.arraySet(o.window,t,r-i,s,o.wnext),(i-=s)?(n.arraySet(o.window,t,r-i,i,0),o.wnext=i,o.whave=o.wsize):(o.wnext+=s,o.wnext===o.wsize&&(o.wnext=0),o.whave<o.wsize&&(o.whave+=s))),0}r.inflateReset=f,r.inflateReset2=d,r.inflateResetKeep=h,r.inflateInit=function(e){return p(e,15)},r.inflateInit2=p,r.inflate=function(e,t){var r,u,h,f,d,p,m,b,g,w,_,x,k,S,M,C,T,E,A,R,O,j,I,N,P=0,B=new n.Buf8(4),D=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return l;12===(r=e.state).mode&&(r.mode=13),d=e.next_out,h=e.output,m=e.avail_out,f=e.next_in,u=e.input,p=e.avail_in,b=r.hold,g=r.bits,w=p,_=m,j=0;e:for(;;)switch(r.mode){case 1:if(0===r.wrap){r.mode=13;break}for(;g<16;){if(0===p)break e;p--,b+=u[f++]<<g,g+=8}if(2&r.wrap&&35615===b){B[r.check=0]=255&b,B[1]=b>>>8&255,r.check=s(r.check,B,2,0),g=b=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&b)<<8)+(b>>8))%31){e.msg=\"incorrect header check\",r.mode=30;break}if(8!=(15&b)){e.msg=\"unknown compression method\",r.mode=30;break}if(g-=4,O=8+(15&(b>>>=4)),0===r.wbits)r.wbits=O;else if(O>r.wbits){e.msg=\"invalid window size\",r.mode=30;break}r.dmax=1<<O,e.adler=r.check=1,r.mode=512&b?10:12,g=b=0;break;case 2:for(;g<16;){if(0===p)break e;p--,b+=u[f++]<<g,g+=8}if(r.flags=b,8!=(255&r.flags)){e.msg=\"unknown compression method\",r.mode=30;break}if(57344&r.flags){e.msg=\"unknown header flags set\",r.mode=30;break}r.head&&(r.head.text=b>>8&1),512&r.flags&&(B[0]=255&b,B[1]=b>>>8&255,r.check=s(r.check,B,2,0)),g=b=0,r.mode=3;case 3:for(;g<32;){if(0===p)break e;p--,b+=u[f++]<<g,g+=8}r.head&&(r.head.time=b),512&r.flags&&(B[0]=255&b,B[1]=b>>>8&255,B[2]=b>>>16&255,B[3]=b>>>24&255,r.check=s(r.check,B,4,0)),g=b=0,r.mode=4;case 4:for(;g<16;){if(0===p)break e;p--,b+=u[f++]<<g,g+=8}r.head&&(r.head.xflags=255&b,r.head.os=b>>8),512&r.flags&&(B[0]=255&b,B[1]=b>>>8&255,r.check=s(r.check,B,2,0)),g=b=0,r.mode=5;case 5:if(1024&r.flags){for(;g<16;){if(0===p)break e;p--,b+=u[f++]<<g,g+=8}r.length=b,r.head&&(r.head.extra_len=b),512&r.flags&&(B[0]=255&b,B[1]=b>>>8&255,r.check=s(r.check,B,2,0)),g=b=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(p<(x=r.length)&&(x=p),x&&(r.head&&(O=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),n.arraySet(r.head.extra,u,f,x,O)),512&r.flags&&(r.check=s(r.check,u,x,f)),p-=x,f+=x,r.length-=x),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===p)break e;for(x=0;O=u[f+x++],r.head&&O&&r.length<65536&&(r.head.name+=String.fromCharCode(O)),O&&x<p;);if(512&r.flags&&(r.check=s(r.check,u,x,f)),p-=x,f+=x,O)break e}else r.head&&(r.head.name=null);r.length=0,r.mode=8;case 8:if(4096&r.flags){if(0===p)break e;for(x=0;O=u[f+x++],r.head&&O&&r.length<65536&&(r.head.comment+=String.fromCharCode(O)),O&&x<p;);if(512&r.flags&&(r.check=s(r.check,u,x,f)),p-=x,f+=x,O)break e}else r.head&&(r.head.comment=null);r.mode=9;case 9:if(512&r.flags){for(;g<16;){if(0===p)break e;p--,b+=u[f++]<<g,g+=8}if(b!==(65535&r.check)){e.msg=\"header crc mismatch\",r.mode=30;break}g=b=0}r.head&&(r.head.hcrc=r.flags>>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=12;break;case 10:for(;g<32;){if(0===p)break e;p--,b+=u[f++]<<g,g+=8}e.adler=r.check=c(b),g=b=0,r.mode=11;case 11:if(0===r.havedict)return e.next_out=d,e.avail_out=m,e.next_in=f,e.avail_in=p,r.hold=b,r.bits=g,2;e.adler=r.check=1,r.mode=12;case 12:if(5===t||6===t)break e;case 13:if(r.last){b>>>=7&g,g-=7&g,r.mode=27;break}for(;g<3;){if(0===p)break e;p--,b+=u[f++]<<g,g+=8}switch(r.last=1&b,g-=1,3&(b>>>=1)){case 0:r.mode=14;break;case 1:if(y(r),r.mode=20,6!==t)break;b>>>=2,g-=2;break e;case 2:r.mode=17;break;case 3:e.msg=\"invalid block type\",r.mode=30}b>>>=2,g-=2;break;case 14:for(b>>>=7&g,g-=7&g;g<32;){if(0===p)break e;p--,b+=u[f++]<<g,g+=8}if((65535&b)!=(b>>>16^65535)){e.msg=\"invalid stored block lengths\",r.mode=30;break}if(r.length=65535&b,g=b=0,r.mode=15,6===t)break e;case 15:r.mode=16;case 16:if(x=r.length){if(p<x&&(x=p),m<x&&(x=m),0===x)break e;n.arraySet(h,u,f,x,d),p-=x,f+=x,m-=x,d+=x,r.length-=x;break}r.mode=12;break;case 17:for(;g<14;){if(0===p)break e;p--,b+=u[f++]<<g,g+=8}if(r.nlen=257+(31&b),b>>>=5,g-=5,r.ndist=1+(31&b),b>>>=5,g-=5,r.ncode=4+(15&b),b>>>=4,g-=4,286<r.nlen||30<r.ndist){e.msg=\"too many length or distance symbols\",r.mode=30;break}r.have=0,r.mode=18;case 18:for(;r.have<r.ncode;){for(;g<3;){if(0===p)break e;p--,b+=u[f++]<<g,g+=8}r.lens[D[r.have++]]=7&b,b>>>=3,g-=3}for(;r.have<19;)r.lens[D[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,I={bits:r.lenbits},j=a(0,r.lens,0,19,r.lencode,0,r.work,I),r.lenbits=I.bits,j){e.msg=\"invalid code lengths set\",r.mode=30;break}r.have=0,r.mode=19;case 19:for(;r.have<r.nlen+r.ndist;){for(;C=(P=r.lencode[b&(1<<r.lenbits)-1])>>>16&255,T=65535&P,!((M=P>>>24)<=g);){if(0===p)break e;p--,b+=u[f++]<<g,g+=8}if(T<16)b>>>=M,g-=M,r.lens[r.have++]=T;else{if(16===T){for(N=M+2;g<N;){if(0===p)break e;p--,b+=u[f++]<<g,g+=8}if(b>>>=M,g-=M,0===r.have){e.msg=\"invalid bit length repeat\",r.mode=30;break}O=r.lens[r.have-1],x=3+(3&b),b>>>=2,g-=2}else if(17===T){for(N=M+3;g<N;){if(0===p)break e;p--,b+=u[f++]<<g,g+=8}g-=M,O=0,x=3+(7&(b>>>=M)),b>>>=3,g-=3}else{for(N=M+7;g<N;){if(0===p)break e;p--,b+=u[f++]<<g,g+=8}g-=M,O=0,x=11+(127&(b>>>=M)),b>>>=7,g-=7}if(r.have+x>r.nlen+r.ndist){e.msg=\"invalid bit length repeat\",r.mode=30;break}for(;x--;)r.lens[r.have++]=O}}if(30===r.mode)break;if(0===r.lens[256]){e.msg=\"invalid code -- missing end-of-block\",r.mode=30;break}if(r.lenbits=9,I={bits:r.lenbits},j=a(1,r.lens,0,r.nlen,r.lencode,0,r.work,I),r.lenbits=I.bits,j){e.msg=\"invalid literal/lengths set\",r.mode=30;break}if(r.distbits=6,r.distcode=r.distdyn,I={bits:r.distbits},j=a(2,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,I),r.distbits=I.bits,j){e.msg=\"invalid distances set\",r.mode=30;break}if(r.mode=20,6===t)break e;case 20:r.mode=21;case 21:if(6<=p&&258<=m){e.next_out=d,e.avail_out=m,e.next_in=f,e.avail_in=p,r.hold=b,r.bits=g,o(e,_),d=e.next_out,h=e.output,m=e.avail_out,f=e.next_in,u=e.input,p=e.avail_in,b=r.hold,g=r.bits,12===r.mode&&(r.back=-1);break}for(r.back=0;C=(P=r.lencode[b&(1<<r.lenbits)-1])>>>16&255,T=65535&P,!((M=P>>>24)<=g);){if(0===p)break e;p--,b+=u[f++]<<g,g+=8}if(C&&0==(240&C)){for(E=M,A=C,R=T;C=(P=r.lencode[R+((b&(1<<E+A)-1)>>E)])>>>16&255,T=65535&P,!(E+(M=P>>>24)<=g);){if(0===p)break e;p--,b+=u[f++]<<g,g+=8}b>>>=E,g-=E,r.back+=E}if(b>>>=M,g-=M,r.back+=M,r.length=T,0===C){r.mode=26;break}if(32&C){r.back=-1,r.mode=12;break}if(64&C){e.msg=\"invalid literal/length code\",r.mode=30;break}r.extra=15&C,r.mode=22;case 22:if(r.extra){for(N=r.extra;g<N;){if(0===p)break e;p--,b+=u[f++]<<g,g+=8}r.length+=b&(1<<r.extra)-1,b>>>=r.extra,g-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;C=(P=r.distcode[b&(1<<r.distbits)-1])>>>16&255,T=65535&P,!((M=P>>>24)<=g);){if(0===p)break e;p--,b+=u[f++]<<g,g+=8}if(0==(240&C)){for(E=M,A=C,R=T;C=(P=r.distcode[R+((b&(1<<E+A)-1)>>E)])>>>16&255,T=65535&P,!(E+(M=P>>>24)<=g);){if(0===p)break e;p--,b+=u[f++]<<g,g+=8}b>>>=E,g-=E,r.back+=E}if(b>>>=M,g-=M,r.back+=M,64&C){e.msg=\"invalid distance code\",r.mode=30;break}r.offset=T,r.extra=15&C,r.mode=24;case 24:if(r.extra){for(N=r.extra;g<N;){if(0===p)break e;p--,b+=u[f++]<<g,g+=8}r.offset+=b&(1<<r.extra)-1,b>>>=r.extra,g-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg=\"invalid distance too far back\",r.mode=30;break}r.mode=25;case 25:if(0===m)break e;if(x=_-m,r.offset>x){if((x=r.offset-x)>r.whave&&r.sane){e.msg=\"invalid distance too far back\",r.mode=30;break}k=x>r.wnext?(x-=r.wnext,r.wsize-x):r.wnext-x,x>r.length&&(x=r.length),S=r.window}else S=h,k=d-r.offset,x=r.length;for(m<x&&(x=m),m-=x,r.length-=x;h[d++]=S[k++],--x;);0===r.length&&(r.mode=21);break;case 26:if(0===m)break e;h[d++]=r.length,m--,r.mode=21;break;case 27:if(r.wrap){for(;g<32;){if(0===p)break e;p--,b|=u[f++]<<g,g+=8}if(_-=m,e.total_out+=_,r.total+=_,_&&(e.adler=r.check=r.flags?s(r.check,h,_,d-_):i(r.check,h,_,d-_)),_=m,(r.flags?b:c(b))!==r.check){e.msg=\"incorrect data check\",r.mode=30;break}g=b=0}r.mode=28;case 28:if(r.wrap&&r.flags){for(;g<32;){if(0===p)break e;p--,b+=u[f++]<<g,g+=8}if(b!==(4294967295&r.total)){e.msg=\"incorrect length check\",r.mode=30;break}g=b=0}r.mode=29;case 29:j=1;break e;case 30:j=-3;break e;case 31:return-4;case 32:default:return l}return e.next_out=d,e.avail_out=m,e.next_in=f,e.avail_in=p,r.hold=b,r.bits=g,(r.wsize||_!==e.avail_out&&r.mode<30&&(r.mode<27||4!==t))&&v(e,e.output,e.next_out,_-e.avail_out)?(r.mode=31,-4):(w-=e.avail_in,_-=e.avail_out,e.total_in+=w,e.total_out+=_,r.total+=_,r.wrap&&_&&(e.adler=r.check=r.flags?s(r.check,h,_,e.next_out-_):i(r.check,h,_,e.next_out-_)),e.data_type=r.bits+(r.last?64:0)+(12===r.mode?128:0)+(20===r.mode||15===r.mode?256:0),(0==w&&0===_||4===t)&&0===j&&(j=-5),j)},r.inflateEnd=function(e){if(!e||!e.state)return l;var t=e.state;return t.window&&(t.window=null),e.state=null,0},r.inflateGetHeader=function(e,t){var r;return e&&e.state?0==(2&(r=e.state).wrap)?l:((r.head=t).done=!1,0):l},r.inflateSetDictionary=function(e,t){var r,n=t.length;return e&&e.state?0!==(r=e.state).wrap&&11!==r.mode?l:11===r.mode&&i(1,t,n,0)!==r.check?-3:v(e,t,n,n)?(r.mode=31,-4):(r.havedict=1,0):l},r.inflateInfo=\"pako inflate (from Nodeca project)\"},{\"../utils/common\":41,\"./adler32\":43,\"./crc32\":45,\"./inffast\":48,\"./inftrees\":50}],50:[function(e,t,r){var n=e(\"../utils/common\"),i=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],s=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],o=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],a=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];t.exports=function(e,t,r,l,c,u,h,f){var d,p,m,b,g,y,v,w,_,x=f.bits,k=0,S=0,M=0,C=0,T=0,E=0,A=0,R=0,O=0,j=0,I=null,N=0,P=new n.Buf16(16),B=new n.Buf16(16),D=null,F=0;for(k=0;k<=15;k++)P[k]=0;for(S=0;S<l;S++)P[t[r+S]]++;for(T=x,C=15;1<=C&&0===P[C];C--);if(C<T&&(T=C),0===C)return c[u++]=20971520,c[u++]=20971520,f.bits=1,0;for(M=1;M<C&&0===P[M];M++);for(T<M&&(T=M),k=R=1;k<=15;k++)if(R<<=1,(R-=P[k])<0)return-1;if(0<R&&(0===e||1!==C))return-1;for(B[1]=0,k=1;k<15;k++)B[k+1]=B[k]+P[k];for(S=0;S<l;S++)0!==t[r+S]&&(h[B[t[r+S]]++]=S);if(y=0===e?(I=D=h,19):1===e?(I=i,N-=257,D=s,F-=257,256):(I=o,D=a,-1),k=M,g=u,A=S=j=0,m=-1,b=(O=1<<(E=T))-1,1===e&&852<O||2===e&&592<O)return 1;for(;;){for(v=k-A,_=h[S]<y?(w=0,h[S]):h[S]>y?(w=D[F+h[S]],I[N+h[S]]):(w=96,0),d=1<<k-A,M=p=1<<E;c[g+(j>>A)+(p-=d)]=v<<24|w<<16|_|0,0!==p;);for(d=1<<k-1;j&d;)d>>=1;if(0!==d?(j&=d-1,j+=d):j=0,S++,0==--P[k]){if(k===C)break;k=t[r+h[S]]}if(T<k&&(j&b)!==m){for(0===A&&(A=T),g+=M,R=1<<(E=k-A);E+A<C&&!((R-=P[E+A])<=0);)E++,R<<=1;if(O+=1<<E,1===e&&852<O||2===e&&592<O)return 1;c[m=j&b]=T<<24|E<<16|g-u|0}}return 0!==j&&(c[g+j]=k-A<<24|64<<16|0),f.bits=T,0}},{\"../utils/common\":41}],51:[function(e,t,r){t.exports={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"}},{}],52:[function(e,t,r){var n=e(\"../utils/common\");function i(e){for(var t=e.length;0<=--t;)e[t]=0}var s=256,o=286,a=30,l=15,c=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],u=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],h=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],f=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],d=new Array(576);i(d);var p=new Array(60);i(p);var m=new Array(512);i(m);var b=new Array(256);i(b);var g=new Array(29);i(g);var y,v,w,_=new Array(a);function x(e,t,r,n,i){this.static_tree=e,this.extra_bits=t,this.extra_base=r,this.elems=n,this.max_length=i,this.has_stree=e&&e.length}function k(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function S(e){return e<256?m[e]:m[256+(e>>>7)]}function M(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function C(e,t,r){e.bi_valid>16-r?(e.bi_buf|=t<<e.bi_valid&65535,M(e,e.bi_buf),e.bi_buf=t>>16-e.bi_valid,e.bi_valid+=r-16):(e.bi_buf|=t<<e.bi_valid&65535,e.bi_valid+=r)}function T(e,t,r){C(e,r[2*t],r[2*t+1])}function E(e,t){for(var r=0;r|=1&e,e>>>=1,r<<=1,0<--t;);return r>>>1}function A(e,t,r){var n,i,s=new Array(16),o=0;for(n=1;n<=l;n++)s[n]=o=o+r[n-1]<<1;for(i=0;i<=t;i++){var a=e[2*i+1];0!==a&&(e[2*i]=E(s[a]++,a))}}function R(e){var t;for(t=0;t<o;t++)e.dyn_ltree[2*t]=0;for(t=0;t<a;t++)e.dyn_dtree[2*t]=0;for(t=0;t<19;t++)e.bl_tree[2*t]=0;e.dyn_ltree[512]=1,e.opt_len=e.static_len=0,e.last_lit=e.matches=0}function O(e){8<e.bi_valid?M(e,e.bi_buf):0<e.bi_valid&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function j(e,t,r,n){var i=2*t,s=2*r;return e[i]<e[s]||e[i]===e[s]&&n[t]<=n[r]}function I(e,t,r){for(var n=e.heap[r],i=r<<1;i<=e.heap_len&&(i<e.heap_len&&j(t,e.heap[i+1],e.heap[i],e.depth)&&i++,!j(t,n,e.heap[i],e.depth));)e.heap[r]=e.heap[i],r=i,i<<=1;e.heap[r]=n}function N(e,t,r){var n,i,o,a,l=0;if(0!==e.last_lit)for(;n=e.pending_buf[e.d_buf+2*l]<<8|e.pending_buf[e.d_buf+2*l+1],i=e.pending_buf[e.l_buf+l],l++,0===n?T(e,i,t):(T(e,(o=b[i])+s+1,t),0!==(a=c[o])&&C(e,i-=g[o],a),T(e,o=S(--n),r),0!==(a=u[o])&&C(e,n-=_[o],a)),l<e.last_lit;);T(e,256,t)}function P(e,t){var r,n,i,s=t.dyn_tree,o=t.stat_desc.static_tree,a=t.stat_desc.has_stree,c=t.stat_desc.elems,u=-1;for(e.heap_len=0,e.heap_max=573,r=0;r<c;r++)0!==s[2*r]?(e.heap[++e.heap_len]=u=r,e.depth[r]=0):s[2*r+1]=0;for(;e.heap_len<2;)s[2*(i=e.heap[++e.heap_len]=u<2?++u:0)]=1,e.depth[i]=0,e.opt_len--,a&&(e.static_len-=o[2*i+1]);for(t.max_code=u,r=e.heap_len>>1;1<=r;r--)I(e,s,r);for(i=c;r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],I(e,s,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,s[2*i]=s[2*r]+s[2*n],e.depth[i]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,s[2*r+1]=s[2*n+1]=i,e.heap[1]=i++,I(e,s,1),2<=e.heap_len;);e.heap[--e.heap_max]=e.heap[1],function(e,t){var r,n,i,s,o,a,c=t.dyn_tree,u=t.max_code,h=t.stat_desc.static_tree,f=t.stat_desc.has_stree,d=t.stat_desc.extra_bits,p=t.stat_desc.extra_base,m=t.stat_desc.max_length,b=0;for(s=0;s<=l;s++)e.bl_count[s]=0;for(c[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;r<573;r++)m<(s=c[2*c[2*(n=e.heap[r])+1]+1]+1)&&(s=m,b++),c[2*n+1]=s,u<n||(e.bl_count[s]++,o=0,p<=n&&(o=d[n-p]),a=c[2*n],e.opt_len+=a*(s+o),f&&(e.static_len+=a*(h[2*n+1]+o)));if(0!==b){do{for(s=m-1;0===e.bl_count[s];)s--;e.bl_count[s]--,e.bl_count[s+1]+=2,e.bl_count[m]--,b-=2}while(0<b);for(s=m;0!==s;s--)for(n=e.bl_count[s];0!==n;)u<(i=e.heap[--r])||(c[2*i+1]!==s&&(e.opt_len+=(s-c[2*i+1])*c[2*i],c[2*i+1]=s),n--)}}(e,t),A(s,u,e.bl_count)}function B(e,t,r){var n,i,s=-1,o=t[1],a=0,l=7,c=4;for(0===o&&(l=138,c=3),t[2*(r+1)+1]=65535,n=0;n<=r;n++)i=o,o=t[2*(n+1)+1],++a<l&&i===o||(a<c?e.bl_tree[2*i]+=a:0!==i?(i!==s&&e.bl_tree[2*i]++,e.bl_tree[32]++):a<=10?e.bl_tree[34]++:e.bl_tree[36]++,s=i,c=(a=0)===o?(l=138,3):i===o?(l=6,3):(l=7,4))}function D(e,t,r){var n,i,s=-1,o=t[1],a=0,l=7,c=4;for(0===o&&(l=138,c=3),n=0;n<=r;n++)if(i=o,o=t[2*(n+1)+1],!(++a<l&&i===o)){if(a<c)for(;T(e,i,e.bl_tree),0!=--a;);else 0!==i?(i!==s&&(T(e,i,e.bl_tree),a--),T(e,16,e.bl_tree),C(e,a-3,2)):a<=10?(T(e,17,e.bl_tree),C(e,a-3,3)):(T(e,18,e.bl_tree),C(e,a-11,7));s=i,c=(a=0)===o?(l=138,3):i===o?(l=6,3):(l=7,4)}}i(_);var F=!1;function L(e,t,r,i){C(e,0+(i?1:0),3),function(e,t,r,i){O(e),M(e,r),M(e,~r),n.arraySet(e.pending_buf,e.window,t,r,e.pending),e.pending+=r}(e,t,r)}r._tr_init=function(e){F||(function(){var e,t,r,n,i,s=new Array(16);for(n=r=0;n<28;n++)for(g[n]=r,e=0;e<1<<c[n];e++)b[r++]=n;for(b[r-1]=n,n=i=0;n<16;n++)for(_[n]=i,e=0;e<1<<u[n];e++)m[i++]=n;for(i>>=7;n<a;n++)for(_[n]=i<<7,e=0;e<1<<u[n]-7;e++)m[256+i++]=n;for(t=0;t<=l;t++)s[t]=0;for(e=0;e<=143;)d[2*e+1]=8,e++,s[8]++;for(;e<=255;)d[2*e+1]=9,e++,s[9]++;for(;e<=279;)d[2*e+1]=7,e++,s[7]++;for(;e<=287;)d[2*e+1]=8,e++,s[8]++;for(A(d,287,s),e=0;e<a;e++)p[2*e+1]=5,p[2*e]=E(e,5);y=new x(d,c,257,o,l),v=new x(p,u,0,a,l),w=new x(new Array(0),h,0,19,7)}(),F=!0),e.l_desc=new k(e.dyn_ltree,y),e.d_desc=new k(e.dyn_dtree,v),e.bl_desc=new k(e.bl_tree,w),e.bi_buf=0,e.bi_valid=0,R(e)},r._tr_stored_block=L,r._tr_flush_block=function(e,t,r,n){var i,o,a=0;0<e.level?(2===e.strm.data_type&&(e.strm.data_type=function(e){var t,r=4093624447;for(t=0;t<=31;t++,r>>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return 0;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return 1;for(t=32;t<s;t++)if(0!==e.dyn_ltree[2*t])return 1;return 0}(e)),P(e,e.l_desc),P(e,e.d_desc),a=function(e){var t;for(B(e,e.dyn_ltree,e.l_desc.max_code),B(e,e.dyn_dtree,e.d_desc.max_code),P(e,e.bl_desc),t=18;3<=t&&0===e.bl_tree[2*f[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}(e),i=e.opt_len+3+7>>>3,(o=e.static_len+3+7>>>3)<=i&&(i=o)):i=o=r+5,r+4<=i&&-1!==t?L(e,t,r,n):4===e.strategy||o===i?(C(e,2+(n?1:0),3),N(e,d,p)):(C(e,4+(n?1:0),3),function(e,t,r,n){var i;for(C(e,t-257,5),C(e,r-1,5),C(e,n-4,4),i=0;i<n;i++)C(e,e.bl_tree[2*f[i]+1],3);D(e,e.dyn_ltree,t-1),D(e,e.dyn_dtree,r-1)}(e,e.l_desc.max_code+1,e.d_desc.max_code+1,a+1),N(e,e.dyn_ltree,e.dyn_dtree)),R(e),n&&O(e)},r._tr_tally=function(e,t,r){return e.pending_buf[e.d_buf+2*e.last_lit]=t>>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(b[r]+s+1)]++,e.dyn_dtree[2*S(t)]++),e.last_lit===e.lit_bufsize-1},r._tr_align=function(e){C(e,2,3),T(e,256,d),function(e){16===e.bi_valid?(M(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):8<=e.bi_valid&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},{\"../utils/common\":41}],53:[function(e,t,r){t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(e,t,r){(function(e){!function(e,t){if(!e.setImmediate){var r,i,s,o,a=1,l={},c=!1,u=e.document,h=Object.getPrototypeOf&&Object.getPrototypeOf(e);h=h&&h.setTimeout?h:e,r=\"[object process]\"==={}.toString.call(e.process)?function(e){n.nextTick((function(){d(e)}))}:function(){if(e.postMessage&&!e.importScripts){var t=!0,r=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage(\"\",\"*\"),e.onmessage=r,t}}()?(o=\"setImmediate$\"+Math.random()+\"$\",e.addEventListener?e.addEventListener(\"message\",p,!1):e.attachEvent(\"onmessage\",p),function(t){e.postMessage(o+t,\"*\")}):e.MessageChannel?((s=new MessageChannel).port1.onmessage=function(e){d(e.data)},function(e){s.port2.postMessage(e)}):u&&\"onreadystatechange\"in u.createElement(\"script\")?(i=u.documentElement,function(e){var t=u.createElement(\"script\");t.onreadystatechange=function(){d(e),t.onreadystatechange=null,i.removeChild(t),t=null},i.appendChild(t)}):function(e){setTimeout(d,0,e)},h.setImmediate=function(e){\"function\"!=typeof e&&(e=new Function(\"\"+e));for(var t=new Array(arguments.length-1),n=0;n<t.length;n++)t[n]=arguments[n+1];var i={callback:e,args:t};return l[a]=i,r(a),a++},h.clearImmediate=f}function f(e){delete l[e]}function d(e){if(c)setTimeout(d,0,e);else{var t=l[e];if(t){c=!0;try{!function(e){var t=e.callback,r=e.args;switch(r.length){case 0:t();break;case 1:t(r[0]);break;case 2:t(r[0],r[1]);break;case 3:t(r[0],r[1],r[2]);break;default:t.apply(void 0,r)}}(t)}finally{f(e),c=!1}}}}function p(t){t.source===e&&\"string\"==typeof t.data&&0===t.data.indexOf(o)&&d(+t.data.slice(o.length))}}(\"undefined\"==typeof self?void 0===e?this:e:self)}).call(this,void 0!==i?i:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}]},{},[10])(10)}))}).call(this)}).call(this,e(\"_process\"),\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],e(\"timers\").setImmediate)},{_process:467,buffer:220,timers:523}],442:[function(e,t,r){(function(e){(function(){\"use strict\";var r=/[\\\\^$.*+?()[\\]{}|]/g,n=RegExp(r.source),i=\"object\"==typeof e&&e&&e.Object===Object&&e,s=\"object\"==typeof self&&self&&self.Object===Object&&self,o=i||s||Function(\"return this\")(),a=Object.prototype.toString,l=o.Symbol,c=l?l.prototype:void 0,u=c?c.toString:void 0;function h(e){if(\"string\"==typeof e)return e;if(function(e){return\"symbol\"==typeof e||function(e){return!!e&&\"object\"==typeof e}(e)&&\"[object Symbol]\"==a.call(e)}(e))return u?u.call(e):\"\";var t=e+\"\";return\"0\"==t&&1/e==-1/0?\"-0\":t}t.exports=function(e){var t;return(e=null==(t=e)?\"\":h(t))&&n.test(e)?e.replace(r,\"\\\\$&\"):e}}).call(this)}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}],443:[function(e,t,r){(function(e){(function(){\"use strict\";var n=\"[object Arguments]\",i=\"[object Map]\",s=\"[object Object]\",o=\"[object Set]\",a=/\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,l=/^\\w*$/,c=/^\\./,u=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g,h=/\\\\(\\\\)?/g,f=/^\\[object .+?Constructor\\]$/,d=/^(?:0|[1-9]\\d*)$/,p={};p[\"[object Float32Array]\"]=p[\"[object Float64Array]\"]=p[\"[object Int8Array]\"]=p[\"[object Int16Array]\"]=p[\"[object Int32Array]\"]=p[\"[object Uint8Array]\"]=p[\"[object Uint8ClampedArray]\"]=p[\"[object Uint16Array]\"]=p[\"[object Uint32Array]\"]=!0,p[n]=p[\"[object Array]\"]=p[\"[object ArrayBuffer]\"]=p[\"[object Boolean]\"]=p[\"[object DataView]\"]=p[\"[object Date]\"]=p[\"[object Error]\"]=p[\"[object Function]\"]=p[i]=p[\"[object Number]\"]=p[s]=p[\"[object RegExp]\"]=p[o]=p[\"[object String]\"]=p[\"[object WeakMap]\"]=!1;var m=\"object\"==typeof e&&e&&e.Object===Object&&e,b=\"object\"==typeof self&&self&&self.Object===Object&&self,g=m||b||Function(\"return this\")(),y=\"object\"==typeof r&&r&&!r.nodeType&&r,v=y&&\"object\"==typeof t&&t&&!t.nodeType&&t,w=v&&v.exports===y&&m.process,_=function(){try{return w&&w.binding(\"util\")}catch(e){}}(),x=_&&_.isTypedArray;function k(e,t,r,n){for(var i=-1,s=e?e.length:0;++i<s;){var o=e[i];t(n,o,r(o),e)}return n}function S(e,t){for(var r=-1,n=e?e.length:0;++r<n;)if(t(e[r],r,e))return!0;return!1}function M(e){var t=!1;if(null!=e&&\"function\"!=typeof e.toString)try{t=!!(e+\"\")}catch(e){}return t}function C(e){var t=-1,r=Array(e.size);return e.forEach((function(e,n){r[++t]=[n,e]})),r}function T(e){var t=-1,r=Array(e.size);return e.forEach((function(e){r[++t]=e})),r}var E,A,R,O=Array.prototype,j=Function.prototype,I=Object.prototype,N=g[\"__core-js_shared__\"],P=(E=/[^.]+$/.exec(N&&N.keys&&N.keys.IE_PROTO||\"\"))?\"Symbol(src)_1.\"+E:\"\",B=j.toString,D=I.hasOwnProperty,F=I.toString,L=RegExp(\"^\"+B.call(D).replace(/[\\\\^$.*+?()[\\]{}|]/g,\"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\"),z=g.Symbol,U=g.Uint8Array,$=I.propertyIsEnumerable,H=O.splice,V=(A=Object.keys,R=Object,function(e){return A(R(e))}),q=Ce(g,\"DataView\"),W=Ce(g,\"Map\"),X=Ce(g,\"Promise\"),K=Ce(g,\"Set\"),Y=Ce(g,\"WeakMap\"),Z=Ce(Object,\"create\"),G=Ne(q),J=Ne(W),Q=Ne(X),ee=Ne(K),te=Ne(Y),re=z?z.prototype:void 0,ne=re?re.valueOf:void 0,ie=re?re.toString:void 0;function se(e){var t=-1,r=e?e.length:0;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function oe(e){var t=-1,r=e?e.length:0;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function ae(e){var t=-1,r=e?e.length:0;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function le(e){var t=-1,r=e?e.length:0;for(this.__data__=new ae;++t<r;)this.add(e[t])}function ce(e){this.__data__=new oe(e)}function ue(e,t){var r=Ue(e)||ze(e)?function(e,t){for(var r=-1,n=Array(e);++r<e;)n[r]=t(r);return n}(e.length,String):[],n=r.length,i=!!n;for(var s in e)!t&&!D.call(e,s)||i&&(\"length\"==s||Ee(s,n))||r.push(s);return r}function he(e,t){for(var r=e.length;r--;)if(Le(e[r][0],t))return r;return-1}function fe(e,t,r,n){return me(e,(function(e,i,s){t(n,e,r(e),s)})),n}se.prototype.clear=function(){this.__data__=Z?Z(null):{}},se.prototype.delete=function(e){return this.has(e)&&delete this.__data__[e]},se.prototype.get=function(e){var t=this.__data__;if(Z){var r=t[e];return\"__lodash_hash_undefined__\"===r?void 0:r}return D.call(t,e)?t[e]:void 0},se.prototype.has=function(e){var t=this.__data__;return Z?void 0!==t[e]:D.call(t,e)},se.prototype.set=function(e,t){return this.__data__[e]=Z&&void 0===t?\"__lodash_hash_undefined__\":t,this},oe.prototype.clear=function(){this.__data__=[]},oe.prototype.delete=function(e){var t=this.__data__,r=he(t,e);return!(r<0)&&(r==t.length-1?t.pop():H.call(t,r,1),!0)},oe.prototype.get=function(e){var t=this.__data__,r=he(t,e);return r<0?void 0:t[r][1]},oe.prototype.has=function(e){return he(this.__data__,e)>-1},oe.prototype.set=function(e,t){var r=this.__data__,n=he(r,e);return n<0?r.push([e,t]):r[n][1]=t,this},ae.prototype.clear=function(){this.__data__={hash:new se,map:new(W||oe),string:new se}},ae.prototype.delete=function(e){return Me(this,e).delete(e)},ae.prototype.get=function(e){return Me(this,e).get(e)},ae.prototype.has=function(e){return Me(this,e).has(e)},ae.prototype.set=function(e,t){return Me(this,e).set(e,t),this},le.prototype.add=le.prototype.push=function(e){return this.__data__.set(e,\"__lodash_hash_undefined__\"),this},le.prototype.has=function(e){return this.__data__.has(e)},ce.prototype.clear=function(){this.__data__=new oe},ce.prototype.delete=function(e){return this.__data__.delete(e)},ce.prototype.get=function(e){return this.__data__.get(e)},ce.prototype.has=function(e){return this.__data__.has(e)},ce.prototype.set=function(e,t){var r=this.__data__;if(r instanceof oe){var n=r.__data__;if(!W||n.length<199)return n.push([e,t]),this;r=this.__data__=new ae(n)}return r.set(e,t),this};var de,pe,me=(de=function(e,t){return e&&be(e,t,Ye)},function(e,t){if(null==e)return e;if(!$e(e))return de(e,t);for(var r=e.length,n=pe?r:-1,i=Object(e);(pe?n--:++n<r)&&!1!==t(i[n],n,i););return e}),be=function(e){return function(t,r,n){for(var i=-1,s=Object(t),o=n(t),a=o.length;a--;){var l=o[e?a:++i];if(!1===r(s[l],l,s))break}return t}}();function ge(e,t){for(var r=0,n=(t=Ae(t,e)?[t]:ke(t)).length;null!=e&&r<n;)e=e[Ie(t[r++])];return r&&r==n?e:void 0}function ye(e,t){return null!=e&&t in Object(e)}function ve(e,t,r,a,l){return e===t||(null==e||null==t||!qe(e)&&!We(t)?e!=e&&t!=t:function(e,t,r,a,l,c){var u=Ue(e),h=Ue(t),f=\"[object Array]\",d=\"[object Array]\";u||(f=(f=Te(e))==n?s:f);h||(d=(d=Te(t))==n?s:d);var p=f==s&&!M(e),m=d==s&&!M(t),b=f==d;if(b&&!p)return c||(c=new ce),u||Ke(e)?Se(e,t,r,a,l,c):function(e,t,r,n,s,a,l){switch(r){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||!n(new U(e),new U(t)));case\"[object Boolean]\":case\"[object Date]\":case\"[object Number]\":return Le(+e,+t);case\"[object Error]\":return e.name==t.name&&e.message==t.message;case\"[object RegExp]\":case\"[object String]\":return e==t+\"\";case i:var c=C;case o:var u=2&a;if(c||(c=T),e.size!=t.size&&!u)return!1;var h=l.get(e);if(h)return h==t;a|=1,l.set(e,t);var f=Se(c(e),c(t),n,s,a,l);return l.delete(e),f;case\"[object Symbol]\":if(ne)return ne.call(e)==ne.call(t)}return!1}(e,t,f,r,a,l,c);if(!(2&l)){var g=p&&D.call(e,\"__wrapped__\"),y=m&&D.call(t,\"__wrapped__\");if(g||y){var v=g?e.value():e,w=y?t.value():t;return c||(c=new ce),r(v,w,a,l,c)}}if(!b)return!1;return c||(c=new ce),function(e,t,r,n,i,s){var o=2&i,a=Ye(e),l=a.length,c=Ye(t).length;if(l!=c&&!o)return!1;var u=l;for(;u--;){var h=a[u];if(!(o?h in t:D.call(t,h)))return!1}var f=s.get(e);if(f&&s.get(t))return f==t;var d=!0;s.set(e,t),s.set(t,e);var p=o;for(;++u<l;){h=a[u];var m=e[h],b=t[h];if(n)var g=o?n(b,m,h,t,e,s):n(m,b,h,e,t,s);if(!(void 0===g?m===b||r(m,b,n,i,s):g)){d=!1;break}p||(p=\"constructor\"==h)}if(d&&!p){var y=e.constructor,v=t.constructor;y==v||!(\"constructor\"in e)||!(\"constructor\"in t)||\"function\"==typeof y&&y instanceof y&&\"function\"==typeof v&&v instanceof v||(d=!1)}return s.delete(e),s.delete(t),d}(e,t,r,a,l,c)}(e,t,ve,r,a,l))}function we(e){return!(!qe(e)||function(e){return!!P&&P in e}(e))&&(He(e)||M(e)?L:f).test(Ne(e))}function _e(e){return\"function\"==typeof e?e:null==e?Ze:\"object\"==typeof e?Ue(e)?function(e,t){if(Ae(e)&&Re(t))return Oe(Ie(e),t);return function(r){var n=function(e,t,r){var n=null==e?void 0:ge(e,t);return void 0===n?r:n}(r,e);return void 0===n&&n===t?function(e,t){return null!=e&&function(e,t,r){t=Ae(t,e)?[t]:ke(t);var n,i=-1,s=t.length;for(;++i<s;){var o=Ie(t[i]);if(!(n=null!=e&&r(e,o)))break;e=e[o]}if(n)return n;return!!(s=e?e.length:0)&&Ve(s)&&Ee(o,s)&&(Ue(e)||ze(e))}(e,t,ye)}(r,e):ve(t,n,void 0,3)}}(e[0],e[1]):function(e){var t=function(e){var t=Ye(e),r=t.length;for(;r--;){var n=t[r],i=e[n];t[r]=[n,i,Re(i)]}return t}(e);if(1==t.length&&t[0][2])return Oe(t[0][0],t[0][1]);return function(r){return r===e||function(e,t,r,n){var i=r.length,s=i,o=!n;if(null==e)return!s;for(e=Object(e);i--;){var a=r[i];if(o&&a[2]?a[1]!==e[a[0]]:!(a[0]in e))return!1}for(;++i<s;){var l=(a=r[i])[0],c=e[l],u=a[1];if(o&&a[2]){if(void 0===c&&!(l in e))return!1}else{var h=new ce;if(n)var f=n(c,u,l,e,t,h);if(!(void 0===f?ve(u,c,n,3,h):f))return!1}}return!0}(r,e,t)}}(e):Ae(t=e)?(r=Ie(t),function(e){return null==e?void 0:e[r]}):function(e){return function(t){return ge(t,e)}}(t);var t,r}function xe(e){if(r=(t=e)&&t.constructor,n=\"function\"==typeof r&&r.prototype||I,t!==n)return V(e);var t,r,n,i=[];for(var s in Object(e))D.call(e,s)&&\"constructor\"!=s&&i.push(s);return i}function ke(e){return Ue(e)?e:je(e)}function Se(e,t,r,n,i,s){var o=2&i,a=e.length,l=t.length;if(a!=l&&!(o&&l>a))return!1;var c=s.get(e);if(c&&s.get(t))return c==t;var u=-1,h=!0,f=1&i?new le:void 0;for(s.set(e,t),s.set(t,e);++u<a;){var d=e[u],p=t[u];if(n)var m=o?n(p,d,u,t,e,s):n(d,p,u,e,t,s);if(void 0!==m){if(m)continue;h=!1;break}if(f){if(!S(t,(function(e,t){if(!f.has(t)&&(d===e||r(d,e,n,i,s)))return f.add(t)}))){h=!1;break}}else if(d!==p&&!r(d,p,n,i,s)){h=!1;break}}return s.delete(e),s.delete(t),h}function Me(e,t){var r,n,i=e.__data__;return(\"string\"==(n=typeof(r=t))||\"number\"==n||\"symbol\"==n||\"boolean\"==n?\"__proto__\"!==r:null===r)?i[\"string\"==typeof t?\"string\":\"hash\"]:i.map}function Ce(e,t){var r=function(e,t){return null==e?void 0:e[t]}(e,t);return we(r)?r:void 0}var Te=function(e){return F.call(e)};function Ee(e,t){return!!(t=null==t?9007199254740991:t)&&(\"number\"==typeof e||d.test(e))&&e>-1&&e%1==0&&e<t}function Ae(e,t){if(Ue(e))return!1;var r=typeof e;return!(\"number\"!=r&&\"symbol\"!=r&&\"boolean\"!=r&&null!=e&&!Xe(e))||(l.test(e)||!a.test(e)||null!=t&&e in Object(t))}function Re(e){return e==e&&!qe(e)}function Oe(e,t){return function(r){return null!=r&&(r[e]===t&&(void 0!==t||e in Object(r)))}}(q&&\"[object DataView]\"!=Te(new q(new ArrayBuffer(1)))||W&&Te(new W)!=i||X&&\"[object Promise]\"!=Te(X.resolve())||K&&Te(new K)!=o||Y&&\"[object WeakMap]\"!=Te(new Y))&&(Te=function(e){var t=F.call(e),r=t==s?e.constructor:void 0,n=r?Ne(r):void 0;if(n)switch(n){case G:return\"[object DataView]\";case J:return i;case Q:return\"[object Promise]\";case ee:return o;case te:return\"[object WeakMap]\"}return t});var je=Fe((function(e){var t;e=null==(t=e)?\"\":function(e){if(\"string\"==typeof e)return e;if(Xe(e))return ie?ie.call(e):\"\";var t=e+\"\";return\"0\"==t&&1/e==-1/0?\"-0\":t}(t);var r=[];return c.test(e)&&r.push(\"\"),e.replace(u,(function(e,t,n,i){r.push(n?i.replace(h,\"$1\"):t||e)})),r}));function Ie(e){if(\"string\"==typeof e||Xe(e))return e;var t=e+\"\";return\"0\"==t&&1/e==-1/0?\"-0\":t}function Ne(e){if(null!=e){try{return B.call(e)}catch(e){}try{return e+\"\"}catch(e){}}return\"\"}var Pe,Be,De=(Pe=function(e,t,r){D.call(e,r)?e[r].push(t):e[r]=[t]},function(e,t){var r=Ue(e)?k:fe,n=Be?Be():{};return r(e,Pe,_e(t),n)});function Fe(e,t){if(\"function\"!=typeof e||t&&\"function\"!=typeof t)throw new TypeError(\"Expected a function\");var r=function(){var n=arguments,i=t?t.apply(this,n):n[0],s=r.cache;if(s.has(i))return s.get(i);var o=e.apply(this,n);return r.cache=s.set(i,o),o};return r.cache=new(Fe.Cache||ae),r}function Le(e,t){return e===t||e!=e&&t!=t}function ze(e){return function(e){return We(e)&&$e(e)}(e)&&D.call(e,\"callee\")&&(!$.call(e,\"callee\")||F.call(e)==n)}Fe.Cache=ae;var Ue=Array.isArray;function $e(e){return null!=e&&Ve(e.length)&&!He(e)}function He(e){var t=qe(e)?F.call(e):\"\";return\"[object Function]\"==t||\"[object GeneratorFunction]\"==t}function Ve(e){return\"number\"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}function qe(e){var t=typeof e;return!!e&&(\"object\"==t||\"function\"==t)}function We(e){return!!e&&\"object\"==typeof e}function Xe(e){return\"symbol\"==typeof e||We(e)&&\"[object Symbol]\"==F.call(e)}var Ke=x?function(e){return function(t){return e(t)}}(x):function(e){return We(e)&&Ve(e.length)&&!!p[F.call(e)]};function Ye(e){return $e(e)?ue(e):xe(e)}function Ze(e){return e}t.exports=De}).call(this)}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}],444:[function(e,t,r){\"use strict\";var n=Object.prototype.toString;t.exports=function(e){return!0===e||!1===e||function(e){return!!e&&\"object\"==typeof e}(e)&&\"[object Boolean]\"==n.call(e)}},{}],445:[function(e,t,r){(function(e){(function(){\"use strict\";var n=\"[object Arguments]\",i=\"[object Map]\",s=\"[object Object]\",o=\"[object Set]\",a=/^\\[object .+?Constructor\\]$/,l=/^(?:0|[1-9]\\d*)$/,c={};c[\"[object Float32Array]\"]=c[\"[object Float64Array]\"]=c[\"[object Int8Array]\"]=c[\"[object Int16Array]\"]=c[\"[object Int32Array]\"]=c[\"[object Uint8Array]\"]=c[\"[object Uint8ClampedArray]\"]=c[\"[object Uint16Array]\"]=c[\"[object Uint32Array]\"]=!0,c[n]=c[\"[object Array]\"]=c[\"[object ArrayBuffer]\"]=c[\"[object Boolean]\"]=c[\"[object DataView]\"]=c[\"[object Date]\"]=c[\"[object Error]\"]=c[\"[object Function]\"]=c[i]=c[\"[object Number]\"]=c[s]=c[\"[object RegExp]\"]=c[o]=c[\"[object String]\"]=c[\"[object WeakMap]\"]=!1;var u=\"object\"==typeof e&&e&&e.Object===Object&&e,h=\"object\"==typeof self&&self&&self.Object===Object&&self,f=u||h||Function(\"return this\")(),d=\"object\"==typeof r&&r&&!r.nodeType&&r,p=d&&\"object\"==typeof t&&t&&!t.nodeType&&t,m=p&&p.exports===d,b=m&&u.process,g=function(){try{return b&&b.binding&&b.binding(\"util\")}catch(e){}}(),y=g&&g.isTypedArray;function v(e,t){for(var r=-1,n=null==e?0:e.length;++r<n;)if(t(e[r],r,e))return!0;return!1}function w(e){var t=-1,r=Array(e.size);return e.forEach((function(e,n){r[++t]=[n,e]})),r}function _(e){var t=-1,r=Array(e.size);return e.forEach((function(e){r[++t]=e})),r}var x,k,S,M=Array.prototype,C=Function.prototype,T=Object.prototype,E=f[\"__core-js_shared__\"],A=C.toString,R=T.hasOwnProperty,O=(x=/[^.]+$/.exec(E&&E.keys&&E.keys.IE_PROTO||\"\"))?\"Symbol(src)_1.\"+x:\"\",j=T.toString,I=RegExp(\"^\"+A.call(R).replace(/[\\\\^$.*+?()[\\]{}|]/g,\"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\"),N=m?f.Buffer:void 0,P=f.Symbol,B=f.Uint8Array,D=T.propertyIsEnumerable,F=M.splice,L=P?P.toStringTag:void 0,z=Object.getOwnPropertySymbols,U=N?N.isBuffer:void 0,$=(k=Object.keys,S=Object,function(e){return k(S(e))}),H=ge(f,\"DataView\"),V=ge(f,\"Map\"),q=ge(f,\"Promise\"),W=ge(f,\"Set\"),X=ge(f,\"WeakMap\"),K=ge(Object,\"create\"),Y=_e(H),Z=_e(V),G=_e(q),J=_e(W),Q=_e(X),ee=P?P.prototype:void 0,te=ee?ee.valueOf:void 0;function re(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function ne(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function ie(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function se(e){var t=-1,r=null==e?0:e.length;for(this.__data__=new ie;++t<r;)this.add(e[t])}function oe(e){var t=this.__data__=new ne(e);this.size=t.size}function ae(e,t){var r=Se(e),n=!r&&ke(e),i=!r&&!n&&Me(e),s=!r&&!n&&!i&&Re(e),o=r||n||i||s,a=o?function(e,t){for(var r=-1,n=Array(e);++r<e;)n[r]=t(r);return n}(e.length,String):[],l=a.length;for(var c in e)!t&&!R.call(e,c)||o&&(\"length\"==c||i&&(\"offset\"==c||\"parent\"==c)||s&&(\"buffer\"==c||\"byteLength\"==c||\"byteOffset\"==c)||we(c,l))||a.push(c);return a}function le(e,t){for(var r=e.length;r--;)if(xe(e[r][0],t))return r;return-1}function ce(e){return null==e?void 0===e?\"[object Undefined]\":\"[object Null]\":L&&L in Object(e)?function(e){var t=R.call(e,L),r=e[L];try{e[L]=void 0;var n=!0}catch(e){}var i=j.call(e);n&&(t?e[L]=r:delete e[L]);return i}(e):function(e){return j.call(e)}(e)}function ue(e){return Ae(e)&&ce(e)==n}function he(e,t,r,a,l){return e===t||(null==e||null==t||!Ae(e)&&!Ae(t)?e!=e&&t!=t:function(e,t,r,a,l,c){var u=Se(e),h=Se(t),f=u?\"[object Array]\":ve(e),d=h?\"[object Array]\":ve(t),p=(f=f==n?s:f)==s,m=(d=d==n?s:d)==s,b=f==d;if(b&&Me(e)){if(!Me(t))return!1;u=!0,p=!1}if(b&&!p)return c||(c=new oe),u||Re(e)?pe(e,t,r,a,l,c):function(e,t,r,n,s,a,l){switch(r){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||!a(new B(e),new B(t)));case\"[object Boolean]\":case\"[object Date]\":case\"[object Number]\":return xe(+e,+t);case\"[object Error]\":return e.name==t.name&&e.message==t.message;case\"[object RegExp]\":case\"[object String]\":return e==t+\"\";case i:var c=w;case o:var u=1&n;if(c||(c=_),e.size!=t.size&&!u)return!1;var h=l.get(e);if(h)return h==t;n|=2,l.set(e,t);var f=pe(c(e),c(t),n,s,a,l);return l.delete(e),f;case\"[object Symbol]\":if(te)return te.call(e)==te.call(t)}return!1}(e,t,f,r,a,l,c);if(!(1&r)){var g=p&&R.call(e,\"__wrapped__\"),y=m&&R.call(t,\"__wrapped__\");if(g||y){var v=g?e.value():e,x=y?t.value():t;return c||(c=new oe),l(v,x,r,a,c)}}if(!b)return!1;return c||(c=new oe),function(e,t,r,n,i,s){var o=1&r,a=me(e),l=a.length,c=me(t).length;if(l!=c&&!o)return!1;var u=l;for(;u--;){var h=a[u];if(!(o?h in t:R.call(t,h)))return!1}var f=s.get(e);if(f&&s.get(t))return f==t;var d=!0;s.set(e,t),s.set(t,e);var p=o;for(;++u<l;){h=a[u];var m=e[h],b=t[h];if(n)var g=o?n(b,m,h,t,e,s):n(m,b,h,e,t,s);if(!(void 0===g?m===b||i(m,b,r,n,s):g)){d=!1;break}p||(p=\"constructor\"==h)}if(d&&!p){var y=e.constructor,v=t.constructor;y==v||!(\"constructor\"in e)||!(\"constructor\"in t)||\"function\"==typeof y&&y instanceof y&&\"function\"==typeof v&&v instanceof v||(d=!1)}return s.delete(e),s.delete(t),d}(e,t,r,a,l,c)}(e,t,r,a,he,l))}function fe(e){return!(!Ee(e)||function(e){return!!O&&O in e}(e))&&(Ce(e)?I:a).test(_e(e))}function de(e){if(r=(t=e)&&t.constructor,n=\"function\"==typeof r&&r.prototype||T,t!==n)return $(e);var t,r,n,i=[];for(var s in Object(e))R.call(e,s)&&\"constructor\"!=s&&i.push(s);return i}function pe(e,t,r,n,i,s){var o=1&r,a=e.length,l=t.length;if(a!=l&&!(o&&l>a))return!1;var c=s.get(e);if(c&&s.get(t))return c==t;var u=-1,h=!0,f=2&r?new se:void 0;for(s.set(e,t),s.set(t,e);++u<a;){var d=e[u],p=t[u];if(n)var m=o?n(p,d,u,t,e,s):n(d,p,u,e,t,s);if(void 0!==m){if(m)continue;h=!1;break}if(f){if(!v(t,(function(e,t){if(o=t,!f.has(o)&&(d===e||i(d,e,r,n,s)))return f.push(t);var o}))){h=!1;break}}else if(d!==p&&!i(d,p,r,n,s)){h=!1;break}}return s.delete(e),s.delete(t),h}function me(e){return function(e,t,r){var n=t(e);return Se(e)?n:function(e,t){for(var r=-1,n=t.length,i=e.length;++r<n;)e[i+r]=t[r];return e}(n,r(e))}(e,Oe,ye)}function be(e,t){var r,n,i=e.__data__;return(\"string\"==(n=typeof(r=t))||\"number\"==n||\"symbol\"==n||\"boolean\"==n?\"__proto__\"!==r:null===r)?i[\"string\"==typeof t?\"string\":\"hash\"]:i.map}function ge(e,t){var r=function(e,t){return null==e?void 0:e[t]}(e,t);return fe(r)?r:void 0}re.prototype.clear=function(){this.__data__=K?K(null):{},this.size=0},re.prototype.delete=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t},re.prototype.get=function(e){var t=this.__data__;if(K){var r=t[e];return\"__lodash_hash_undefined__\"===r?void 0:r}return R.call(t,e)?t[e]:void 0},re.prototype.has=function(e){var t=this.__data__;return K?void 0!==t[e]:R.call(t,e)},re.prototype.set=function(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=K&&void 0===t?\"__lodash_hash_undefined__\":t,this},ne.prototype.clear=function(){this.__data__=[],this.size=0},ne.prototype.delete=function(e){var t=this.__data__,r=le(t,e);return!(r<0)&&(r==t.length-1?t.pop():F.call(t,r,1),--this.size,!0)},ne.prototype.get=function(e){var t=this.__data__,r=le(t,e);return r<0?void 0:t[r][1]},ne.prototype.has=function(e){return le(this.__data__,e)>-1},ne.prototype.set=function(e,t){var r=this.__data__,n=le(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this},ie.prototype.clear=function(){this.size=0,this.__data__={hash:new re,map:new(V||ne),string:new re}},ie.prototype.delete=function(e){var t=be(this,e).delete(e);return this.size-=t?1:0,t},ie.prototype.get=function(e){return be(this,e).get(e)},ie.prototype.has=function(e){return be(this,e).has(e)},ie.prototype.set=function(e,t){var r=be(this,e),n=r.size;return r.set(e,t),this.size+=r.size==n?0:1,this},se.prototype.add=se.prototype.push=function(e){return this.__data__.set(e,\"__lodash_hash_undefined__\"),this},se.prototype.has=function(e){return this.__data__.has(e)},oe.prototype.clear=function(){this.__data__=new ne,this.size=0},oe.prototype.delete=function(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r},oe.prototype.get=function(e){return this.__data__.get(e)},oe.prototype.has=function(e){return this.__data__.has(e)},oe.prototype.set=function(e,t){var r=this.__data__;if(r instanceof ne){var n=r.__data__;if(!V||n.length<199)return n.push([e,t]),this.size=++r.size,this;r=this.__data__=new ie(n)}return r.set(e,t),this.size=r.size,this};var ye=z?function(e){return null==e?[]:(e=Object(e),function(e,t){for(var r=-1,n=null==e?0:e.length,i=0,s=[];++r<n;){var o=e[r];t(o,r,e)&&(s[i++]=o)}return s}(z(e),(function(t){return D.call(e,t)})))}:function(){return[]},ve=ce;function we(e,t){return!!(t=null==t?9007199254740991:t)&&(\"number\"==typeof e||l.test(e))&&e>-1&&e%1==0&&e<t}function _e(e){if(null!=e){try{return A.call(e)}catch(e){}try{return e+\"\"}catch(e){}}return\"\"}function xe(e,t){return e===t||e!=e&&t!=t}(H&&\"[object DataView]\"!=ve(new H(new ArrayBuffer(1)))||V&&ve(new V)!=i||q&&\"[object Promise]\"!=ve(q.resolve())||W&&ve(new W)!=o||X&&\"[object WeakMap]\"!=ve(new X))&&(ve=function(e){var t=ce(e),r=t==s?e.constructor:void 0,n=r?_e(r):\"\";if(n)switch(n){case Y:return\"[object DataView]\";case Z:return i;case G:return\"[object Promise]\";case J:return o;case Q:return\"[object WeakMap]\"}return t});var ke=ue(function(){return arguments}())?ue:function(e){return Ae(e)&&R.call(e,\"callee\")&&!D.call(e,\"callee\")},Se=Array.isArray;var Me=U||function(){return!1};function Ce(e){if(!Ee(e))return!1;var t=ce(e);return\"[object Function]\"==t||\"[object GeneratorFunction]\"==t||\"[object AsyncFunction]\"==t||\"[object Proxy]\"==t}function Te(e){return\"number\"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}function Ee(e){var t=typeof e;return null!=e&&(\"object\"==t||\"function\"==t)}function Ae(e){return null!=e&&\"object\"==typeof e}var Re=y?function(e){return function(t){return e(t)}}(y):function(e){return Ae(e)&&Te(e.length)&&!!c[ce(e)]};function Oe(e){return null!=(t=e)&&Te(t.length)&&!Ce(t)?ae(e):de(e);var t}t.exports=function(e,t){return he(e,t)}}).call(this)}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}],446:[function(e,t,r){(function(e){(function(){\"use strict\";var r=\"object\"==typeof e&&e&&e.Object===Object&&e,n=\"object\"==typeof self&&self&&self.Object===Object&&self,i=r||n||Function(\"return this\")(),s=Object.prototype,o=s.hasOwnProperty,a=s.toString,l=i.Symbol,c=l?l.toStringTag:void 0;function u(e){return null==e?void 0===e?\"[object Undefined]\":\"[object Null]\":c&&c in Object(e)?function(e){var t=o.call(e,c),r=e[c];try{e[c]=void 0;var n=!0}catch(e){}var i=a.call(e);n&&(t?e[c]=r:delete e[c]);return i}(e):function(e){return a.call(e)}(e)}t.exports=function(e){if(!function(e){var t=typeof e;return null!=e&&(\"object\"==t||\"function\"==t)}(e))return!1;var t=u(e);return\"[object Function]\"==t||\"[object GeneratorFunction]\"==t||\"[object AsyncFunction]\"==t||\"[object Proxy]\"==t}}).call(this)}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}],447:[function(e,t,r){\"use strict\";t.exports=function(e){return null==e}},{}],448:[function(e,t,r){\"use strict\";t.exports=function(e){return void 0===e}},{}],449:[function(e,t,r){(function(e){(function(){\"use strict\";var r=/^\\[object .+?Constructor\\]$/,n=\"object\"==typeof e&&e&&e.Object===Object&&e,i=\"object\"==typeof self&&self&&self.Object===Object&&self,s=n||i||Function(\"return this\")();function o(e,t){return!!(e?e.length:0)&&function(e,t,r){if(t!=t)return function(e,t,r,n){var i=e.length,s=r+(n?1:-1);for(;n?s--:++s<i;)if(t(e[s],s,e))return s;return-1}(e,l,r);var n=r-1,i=e.length;for(;++n<i;)if(e[n]===t)return n;return-1}(e,t,0)>-1}function a(e,t,r){for(var n=-1,i=e?e.length:0;++n<i;)if(r(t,e[n]))return!0;return!1}function l(e){return e!=e}function c(e,t){return e.has(t)}function u(e){var t=-1,r=Array(e.size);return e.forEach((function(e){r[++t]=e})),r}var h,f=Array.prototype,d=Function.prototype,p=Object.prototype,m=s[\"__core-js_shared__\"],b=(h=/[^.]+$/.exec(m&&m.keys&&m.keys.IE_PROTO||\"\"))?\"Symbol(src)_1.\"+h:\"\",g=d.toString,y=p.hasOwnProperty,v=p.toString,w=RegExp(\"^\"+g.call(y).replace(/[\\\\^$.*+?()[\\]{}|]/g,\"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\"),_=f.splice,x=I(s,\"Map\"),k=I(s,\"Set\"),S=I(Object,\"create\");function M(e){var t=-1,r=e?e.length:0;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function C(e){var t=-1,r=e?e.length:0;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function T(e){var t=-1,r=e?e.length:0;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function E(e){var t=-1,r=e?e.length:0;for(this.__data__=new T;++t<r;)this.add(e[t])}function A(e,t){for(var r,n,i=e.length;i--;)if((r=e[i][0])===(n=t)||r!=r&&n!=n)return i;return-1}function R(e){return!(!N(e)||(t=e,b&&b in t))&&(function(e){var t=N(e)?v.call(e):\"\";return\"[object Function]\"==t||\"[object GeneratorFunction]\"==t}(e)||function(e){var t=!1;if(null!=e&&\"function\"!=typeof e.toString)try{t=!!(e+\"\")}catch(e){}return t}(e)?w:r).test(function(e){if(null!=e){try{return g.call(e)}catch(e){}try{return e+\"\"}catch(e){}}return\"\"}(e));var t}M.prototype.clear=function(){this.__data__=S?S(null):{}},M.prototype.delete=function(e){return this.has(e)&&delete this.__data__[e]},M.prototype.get=function(e){var t=this.__data__;if(S){var r=t[e];return\"__lodash_hash_undefined__\"===r?void 0:r}return y.call(t,e)?t[e]:void 0},M.prototype.has=function(e){var t=this.__data__;return S?void 0!==t[e]:y.call(t,e)},M.prototype.set=function(e,t){return this.__data__[e]=S&&void 0===t?\"__lodash_hash_undefined__\":t,this},C.prototype.clear=function(){this.__data__=[]},C.prototype.delete=function(e){var t=this.__data__,r=A(t,e);return!(r<0)&&(r==t.length-1?t.pop():_.call(t,r,1),!0)},C.prototype.get=function(e){var t=this.__data__,r=A(t,e);return r<0?void 0:t[r][1]},C.prototype.has=function(e){return A(this.__data__,e)>-1},C.prototype.set=function(e,t){var r=this.__data__,n=A(r,e);return n<0?r.push([e,t]):r[n][1]=t,this},T.prototype.clear=function(){this.__data__={hash:new M,map:new(x||C),string:new M}},T.prototype.delete=function(e){return j(this,e).delete(e)},T.prototype.get=function(e){return j(this,e).get(e)},T.prototype.has=function(e){return j(this,e).has(e)},T.prototype.set=function(e,t){return j(this,e).set(e,t),this},E.prototype.add=E.prototype.push=function(e){return this.__data__.set(e,\"__lodash_hash_undefined__\"),this},E.prototype.has=function(e){return this.__data__.has(e)};var O=k&&1/u(new k([,-0]))[1]==1/0?function(e){return new k(e)}:function(){};function j(e,t){var r,n,i=e.__data__;return(\"string\"==(n=typeof(r=t))||\"number\"==n||\"symbol\"==n||\"boolean\"==n?\"__proto__\"!==r:null===r)?i[\"string\"==typeof t?\"string\":\"hash\"]:i.map}function I(e,t){var r=function(e,t){return null==e?void 0:e[t]}(e,t);return R(r)?r:void 0}function N(e){var t=typeof e;return!!e&&(\"object\"==t||\"function\"==t)}t.exports=function(e){return e&&e.length?function(e,t,r){var n=-1,i=o,s=e.length,l=!0,h=[],f=h;if(r)l=!1,i=a;else if(s>=200){var d=t?null:O(e);if(d)return u(d);l=!1,i=c,f=new E}else f=t?[]:h;e:for(;++n<s;){var p=e[n],m=t?t(p):p;if(p=r||0!==p?p:0,l&&m==m){for(var b=f.length;b--;)if(f[b]===m)continue e;t&&f.push(m),h.push(p)}else i(f,m,r)||(f!==h&&f.push(m),h.push(p))}return h}(e):[]}}).call(this)}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}],450:[function(e,t,r){\"use strict\";var n=e(\"inherits\"),i=e(\"hash-base\"),s=e(\"safe-buffer\").Buffer,o=new Array(16);function a(){i.call(this,64),this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878}function l(e,t){return e<<t|e>>>32-t}function c(e,t,r,n,i,s,o){return l(e+(t&r|~t&n)+i+s|0,o)+t|0}function u(e,t,r,n,i,s,o){return l(e+(t&n|r&~n)+i+s|0,o)+t|0}function h(e,t,r,n,i,s,o){return l(e+(t^r^n)+i+s|0,o)+t|0}function f(e,t,r,n,i,s,o){return l(e+(r^(t|~n))+i+s|0,o)+t|0}n(a,i),a.prototype._update=function(){for(var e=o,t=0;t<16;++t)e[t]=this._block.readInt32LE(4*t);var r=this._a,n=this._b,i=this._c,s=this._d;r=c(r,n,i,s,e[0],3614090360,7),s=c(s,r,n,i,e[1],3905402710,12),i=c(i,s,r,n,e[2],606105819,17),n=c(n,i,s,r,e[3],3250441966,22),r=c(r,n,i,s,e[4],4118548399,7),s=c(s,r,n,i,e[5],1200080426,12),i=c(i,s,r,n,e[6],2821735955,17),n=c(n,i,s,r,e[7],4249261313,22),r=c(r,n,i,s,e[8],1770035416,7),s=c(s,r,n,i,e[9],2336552879,12),i=c(i,s,r,n,e[10],4294925233,17),n=c(n,i,s,r,e[11],2304563134,22),r=c(r,n,i,s,e[12],1804603682,7),s=c(s,r,n,i,e[13],4254626195,12),i=c(i,s,r,n,e[14],2792965006,17),r=u(r,n=c(n,i,s,r,e[15],1236535329,22),i,s,e[1],4129170786,5),s=u(s,r,n,i,e[6],3225465664,9),i=u(i,s,r,n,e[11],643717713,14),n=u(n,i,s,r,e[0],3921069994,20),r=u(r,n,i,s,e[5],3593408605,5),s=u(s,r,n,i,e[10],38016083,9),i=u(i,s,r,n,e[15],3634488961,14),n=u(n,i,s,r,e[4],3889429448,20),r=u(r,n,i,s,e[9],568446438,5),s=u(s,r,n,i,e[14],3275163606,9),i=u(i,s,r,n,e[3],4107603335,14),n=u(n,i,s,r,e[8],1163531501,20),r=u(r,n,i,s,e[13],2850285829,5),s=u(s,r,n,i,e[2],4243563512,9),i=u(i,s,r,n,e[7],1735328473,14),r=h(r,n=u(n,i,s,r,e[12],2368359562,20),i,s,e[5],4294588738,4),s=h(s,r,n,i,e[8],2272392833,11),i=h(i,s,r,n,e[11],1839030562,16),n=h(n,i,s,r,e[14],4259657740,23),r=h(r,n,i,s,e[1],2763975236,4),s=h(s,r,n,i,e[4],1272893353,11),i=h(i,s,r,n,e[7],4139469664,16),n=h(n,i,s,r,e[10],3200236656,23),r=h(r,n,i,s,e[13],681279174,4),s=h(s,r,n,i,e[0],3936430074,11),i=h(i,s,r,n,e[3],3572445317,16),n=h(n,i,s,r,e[6],76029189,23),r=h(r,n,i,s,e[9],3654602809,4),s=h(s,r,n,i,e[12],3873151461,11),i=h(i,s,r,n,e[15],530742520,16),r=f(r,n=h(n,i,s,r,e[2],3299628645,23),i,s,e[0],4096336452,6),s=f(s,r,n,i,e[7],1126891415,10),i=f(i,s,r,n,e[14],2878612391,15),n=f(n,i,s,r,e[5],4237533241,21),r=f(r,n,i,s,e[12],1700485571,6),s=f(s,r,n,i,e[3],2399980690,10),i=f(i,s,r,n,e[10],4293915773,15),n=f(n,i,s,r,e[1],2240044497,21),r=f(r,n,i,s,e[8],1873313359,6),s=f(s,r,n,i,e[15],4264355552,10),i=f(i,s,r,n,e[6],2734768916,15),n=f(n,i,s,r,e[13],1309151649,21),r=f(r,n,i,s,e[4],4149444226,6),s=f(s,r,n,i,e[11],3174756917,10),i=f(i,s,r,n,e[2],718787259,15),n=f(n,i,s,r,e[9],3951481745,21),this._a=this._a+r|0,this._b=this._b+n|0,this._c=this._c+i|0,this._d=this._d+s|0},a.prototype._digest=function(){this._block[this._blockOffset++]=128,this._blockOffset>56&&(this._block.fill(0,this._blockOffset,64),this._update(),this._blockOffset=0),this._block.fill(0,this._blockOffset,56),this._block.writeUInt32LE(this._length[0],56),this._block.writeUInt32LE(this._length[1],60),this._update();var e=s.allocUnsafe(16);return e.writeInt32LE(this._a,0),e.writeInt32LE(this._b,4),e.writeInt32LE(this._c,8),e.writeInt32LE(this._d,12),e},t.exports=a},{\"hash-base\":425,inherits:440,\"safe-buffer\":494}],451:[function(e,t,r){\"use strict\";var n=e(\"bn.js\"),i=e(\"brorand\");function s(e){this.rand=e||new i.Rand}t.exports=s,s.create=function(e){return new s(e)},s.prototype._randbelow=function(e){var t=e.bitLength(),r=Math.ceil(t/8);do{var i=new n(this.rand.generate(r))}while(i.cmp(e)>=0);return i},s.prototype._randrange=function(e,t){var r=t.sub(e);return e.add(this._randbelow(r))},s.prototype.test=function(e,t,r){var i=e.bitLength(),s=n.mont(e),o=new n(1).toRed(s);t||(t=Math.max(1,i/48|0));for(var a=e.subn(1),l=0;!a.testn(l);l++);for(var c=e.shrn(l),u=a.toRed(s);t>0;t--){var h=this._randrange(new n(2),a);r&&r(h);var f=h.toRed(s).redPow(c);if(0!==f.cmp(o)&&0!==f.cmp(u)){for(var d=1;d<l;d++){if(0===(f=f.redSqr()).cmp(o))return!1;if(0===f.cmp(u))break}if(d===l)return!1}}return!0},s.prototype.getDivisor=function(e,t){var r=e.bitLength(),i=n.mont(e),s=new n(1).toRed(i);t||(t=Math.max(1,r/48|0));for(var o=e.subn(1),a=0;!o.testn(a);a++);for(var l=e.shrn(a),c=o.toRed(i);t>0;t--){var u=this._randrange(new n(2),o),h=e.gcd(u);if(0!==h.cmpn(1))return h;var f=u.toRed(i).redPow(l);if(0!==f.cmp(s)&&0!==f.cmp(c)){for(var d=1;d<a;d++){if(0===(f=f.redSqr()).cmp(s))return f.fromRed().subn(1).gcd(e);if(0===f.cmp(c))break}if(d===a)return(f=f.redSqr()).fromRed().subn(1).gcd(e)}}return!1}},{\"bn.js\":452,brorand:187}],452:[function(e,t,r){arguments[4][184][0].apply(r,arguments)},{buffer:188,dup:184}],453:[function(e,t,r){\"use strict\";function n(e,t){if(!e)throw new Error(t||\"Assertion failed\")}t.exports=n,n.equal=function(e,t,r){if(e!=t)throw new Error(r||\"Assertion failed: \"+e+\" != \"+t)}},{}],454:[function(e,t,r){\"use strict\";var n=r;function i(e){return 1===e.length?\"0\"+e:e}function s(e){for(var t=\"\",r=0;r<e.length;r++)t+=i(e[r].toString(16));return t}n.toArray=function(e,t){if(Array.isArray(e))return e.slice();if(!e)return[];var r=[];if(\"string\"!=typeof e){for(var n=0;n<e.length;n++)r[n]=0|e[n];return r}if(\"hex\"===t){(e=e.replace(/[^a-z0-9]+/gi,\"\")).length%2!=0&&(e=\"0\"+e);for(n=0;n<e.length;n+=2)r.push(parseInt(e[n]+e[n+1],16))}else for(n=0;n<e.length;n++){var i=e.charCodeAt(n),s=i>>8,o=255&i;s?r.push(s,o):r.push(o)}return r},n.zero2=i,n.toHex=s,n.encode=function(e,t){return\"hex\"===t?s(e):e}},{}],455:[function(e,t,r){t.exports={\"2.16.840.1.101.3.4.1.1\":\"aes-128-ecb\",\"2.16.840.1.101.3.4.1.2\":\"aes-128-cbc\",\"2.16.840.1.101.3.4.1.3\":\"aes-128-ofb\",\"2.16.840.1.101.3.4.1.4\":\"aes-128-cfb\",\"2.16.840.1.101.3.4.1.21\":\"aes-192-ecb\",\"2.16.840.1.101.3.4.1.22\":\"aes-192-cbc\",\"2.16.840.1.101.3.4.1.23\":\"aes-192-ofb\",\"2.16.840.1.101.3.4.1.24\":\"aes-192-cfb\",\"2.16.840.1.101.3.4.1.41\":\"aes-256-ecb\",\"2.16.840.1.101.3.4.1.42\":\"aes-256-cbc\",\"2.16.840.1.101.3.4.1.43\":\"aes-256-ofb\",\"2.16.840.1.101.3.4.1.44\":\"aes-256-cfb\"}},{}],456:[function(e,t,r){\"use strict\";var n=e(\"asn1.js\");r.certificate=e(\"./certificate\");var i=n.define(\"RSAPrivateKey\",(function(){this.seq().obj(this.key(\"version\").int(),this.key(\"modulus\").int(),this.key(\"publicExponent\").int(),this.key(\"privateExponent\").int(),this.key(\"prime1\").int(),this.key(\"prime2\").int(),this.key(\"exponent1\").int(),this.key(\"exponent2\").int(),this.key(\"coefficient\").int())}));r.RSAPrivateKey=i;var s=n.define(\"RSAPublicKey\",(function(){this.seq().obj(this.key(\"modulus\").int(),this.key(\"publicExponent\").int())}));r.RSAPublicKey=s;var o=n.define(\"SubjectPublicKeyInfo\",(function(){this.seq().obj(this.key(\"algorithm\").use(a),this.key(\"subjectPublicKey\").bitstr())}));r.PublicKey=o;var a=n.define(\"AlgorithmIdentifier\",(function(){this.seq().obj(this.key(\"algorithm\").objid(),this.key(\"none\").null_().optional(),this.key(\"curve\").objid().optional(),this.key(\"params\").seq().obj(this.key(\"p\").int(),this.key(\"q\").int(),this.key(\"g\").int()).optional())})),l=n.define(\"PrivateKeyInfo\",(function(){this.seq().obj(this.key(\"version\").int(),this.key(\"algorithm\").use(a),this.key(\"subjectPrivateKey\").octstr())}));r.PrivateKey=l;var c=n.define(\"EncryptedPrivateKeyInfo\",(function(){this.seq().obj(this.key(\"algorithm\").seq().obj(this.key(\"id\").objid(),this.key(\"decrypt\").seq().obj(this.key(\"kde\").seq().obj(this.key(\"id\").objid(),this.key(\"kdeparams\").seq().obj(this.key(\"salt\").octstr(),this.key(\"iters\").int())),this.key(\"cipher\").seq().obj(this.key(\"algo\").objid(),this.key(\"iv\").octstr()))),this.key(\"subjectPrivateKey\").octstr())}));r.EncryptedPrivateKey=c;var u=n.define(\"DSAPrivateKey\",(function(){this.seq().obj(this.key(\"version\").int(),this.key(\"p\").int(),this.key(\"q\").int(),this.key(\"g\").int(),this.key(\"pub_key\").int(),this.key(\"priv_key\").int())}));r.DSAPrivateKey=u,r.DSAparam=n.define(\"DSAparam\",(function(){this.int()}));var h=n.define(\"ECPrivateKey\",(function(){this.seq().obj(this.key(\"version\").int(),this.key(\"privateKey\").octstr(),this.key(\"parameters\").optional().explicit(0).use(f),this.key(\"publicKey\").optional().explicit(1).bitstr())}));r.ECPrivateKey=h;var f=n.define(\"ECParameters\",(function(){this.choice({namedCurve:this.objid()})}));r.signature=n.define(\"signature\",(function(){this.seq().obj(this.key(\"r\").int(),this.key(\"s\").int())}))},{\"./certificate\":457,\"asn1.js\":170}],457:[function(e,t,r){\"use strict\";var n=e(\"asn1.js\"),i=n.define(\"Time\",(function(){this.choice({utcTime:this.utctime(),generalTime:this.gentime()})})),s=n.define(\"AttributeTypeValue\",(function(){this.seq().obj(this.key(\"type\").objid(),this.key(\"value\").any())})),o=n.define(\"AlgorithmIdentifier\",(function(){this.seq().obj(this.key(\"algorithm\").objid(),this.key(\"parameters\").optional(),this.key(\"curve\").objid().optional())})),a=n.define(\"SubjectPublicKeyInfo\",(function(){this.seq().obj(this.key(\"algorithm\").use(o),this.key(\"subjectPublicKey\").bitstr())})),l=n.define(\"RelativeDistinguishedName\",(function(){this.setof(s)})),c=n.define(\"RDNSequence\",(function(){this.seqof(l)})),u=n.define(\"Name\",(function(){this.choice({rdnSequence:this.use(c)})})),h=n.define(\"Validity\",(function(){this.seq().obj(this.key(\"notBefore\").use(i),this.key(\"notAfter\").use(i))})),f=n.define(\"Extension\",(function(){this.seq().obj(this.key(\"extnID\").objid(),this.key(\"critical\").bool().def(!1),this.key(\"extnValue\").octstr())})),d=n.define(\"TBSCertificate\",(function(){this.seq().obj(this.key(\"version\").explicit(0).int().optional(),this.key(\"serialNumber\").int(),this.key(\"signature\").use(o),this.key(\"issuer\").use(u),this.key(\"validity\").use(h),this.key(\"subject\").use(u),this.key(\"subjectPublicKeyInfo\").use(a),this.key(\"issuerUniqueID\").implicit(1).bitstr().optional(),this.key(\"subjectUniqueID\").implicit(2).bitstr().optional(),this.key(\"extensions\").explicit(3).seqof(f).optional())})),p=n.define(\"X509Certificate\",(function(){this.seq().obj(this.key(\"tbsCertificate\").use(d),this.key(\"signatureAlgorithm\").use(o),this.key(\"signatureValue\").bitstr())}));t.exports=p},{\"asn1.js\":170}],458:[function(e,t,r){\"use strict\";var n=/Proc-Type: 4,ENCRYPTED[\\n\\r]+DEK-Info: AES-((?:128)|(?:192)|(?:256))-CBC,([0-9A-H]+)[\\n\\r]+([0-9A-z\\n\\r+/=]+)[\\n\\r]+/m,i=/^-----BEGIN ((?:.*? KEY)|CERTIFICATE)-----/m,s=/^-----BEGIN ((?:.*? KEY)|CERTIFICATE)-----([0-9A-z\\n\\r+/=]+)-----END \\1-----$/m,o=e(\"evp_bytestokey\"),a=e(\"browserify-aes\"),l=e(\"safe-buffer\").Buffer;t.exports=function(e,t){var r,c=e.toString(),u=c.match(n);if(u){var h=\"aes\"+u[1],f=l.from(u[2],\"hex\"),d=l.from(u[3].replace(/[\\r\\n]/g,\"\"),\"base64\"),p=o(t,f.slice(0,8),parseInt(u[1],10)).key,m=[],b=a.createDecipheriv(h,p,f);m.push(b.update(d)),m.push(b.final()),r=l.concat(m)}else{var g=c.match(s);r=l.from(g[2].replace(/[\\r\\n]/g,\"\"),\"base64\")}return{tag:c.match(i)[1],data:r}}},{\"browserify-aes\":191,evp_bytestokey:423,\"safe-buffer\":494}],459:[function(e,t,r){\"use strict\";var n=e(\"./asn1\"),i=e(\"./aesid.json\"),s=e(\"./fixProc\"),o=e(\"browserify-aes\"),a=e(\"pbkdf2\"),l=e(\"safe-buffer\").Buffer;function c(e){var t;\"object\"!=typeof e||l.isBuffer(e)||(t=e.passphrase,e=e.key),\"string\"==typeof e&&(e=l.from(e));var r,c,u=s(e,t),h=u.tag,f=u.data;switch(h){case\"CERTIFICATE\":c=n.certificate.decode(f,\"der\").tbsCertificate.subjectPublicKeyInfo;case\"PUBLIC KEY\":switch(c||(c=n.PublicKey.decode(f,\"der\")),r=c.algorithm.algorithm.join(\".\")){case\"1.2.840.113549.1.1.1\":return n.RSAPublicKey.decode(c.subjectPublicKey.data,\"der\");case\"1.2.840.10045.2.1\":return c.subjectPrivateKey=c.subjectPublicKey,{type:\"ec\",data:c};case\"1.2.840.10040.4.1\":return c.algorithm.params.pub_key=n.DSAparam.decode(c.subjectPublicKey.data,\"der\"),{type:\"dsa\",data:c.algorithm.params};default:throw new Error(\"unknown key id \"+r)}case\"ENCRYPTED PRIVATE KEY\":f=function(e,t){var r=e.algorithm.decrypt.kde.kdeparams.salt,n=parseInt(e.algorithm.decrypt.kde.kdeparams.iters.toString(),10),s=i[e.algorithm.decrypt.cipher.algo.join(\".\")],c=e.algorithm.decrypt.cipher.iv,u=e.subjectPrivateKey,h=parseInt(s.split(\"-\")[1],10)/8,f=a.pbkdf2Sync(t,r,n,h,\"sha1\"),d=o.createDecipheriv(s,f,c),p=[];return p.push(d.update(u)),p.push(d.final()),l.concat(p)}(f=n.EncryptedPrivateKey.decode(f,\"der\"),t);case\"PRIVATE KEY\":switch(r=(c=n.PrivateKey.decode(f,\"der\")).algorithm.algorithm.join(\".\")){case\"1.2.840.113549.1.1.1\":return n.RSAPrivateKey.decode(c.subjectPrivateKey,\"der\");case\"1.2.840.10045.2.1\":return{curve:c.algorithm.curve,privateKey:n.ECPrivateKey.decode(c.subjectPrivateKey,\"der\").privateKey};case\"1.2.840.10040.4.1\":return c.algorithm.params.priv_key=n.DSAparam.decode(c.subjectPrivateKey,\"der\"),{type:\"dsa\",params:c.algorithm.params};default:throw new Error(\"unknown key id \"+r)}case\"RSA PUBLIC KEY\":return n.RSAPublicKey.decode(f,\"der\");case\"RSA PRIVATE KEY\":return n.RSAPrivateKey.decode(f,\"der\");case\"DSA PRIVATE KEY\":return{type:\"dsa\",params:n.DSAPrivateKey.decode(f,\"der\")};case\"EC PRIVATE KEY\":return{curve:(f=n.ECPrivateKey.decode(f,\"der\")).parameters.value,privateKey:f.privateKey};default:throw new Error(\"unknown key type \"+h)}}t.exports=c,c.signature=n.signature},{\"./aesid.json\":455,\"./asn1\":456,\"./fixProc\":458,\"browserify-aes\":191,pbkdf2:460,\"safe-buffer\":494}],460:[function(e,t,r){\"use strict\";r.pbkdf2=e(\"./lib/async\"),r.pbkdf2Sync=e(\"./lib/sync\")},{\"./lib/async\":461,\"./lib/sync\":464}],461:[function(e,t,r){(function(r){(function(){\"use strict\";var n,i,s=e(\"safe-buffer\").Buffer,o=e(\"./precondition\"),a=e(\"./default-encoding\"),l=e(\"./sync\"),c=e(\"./to-buffer\"),u=r.crypto&&r.crypto.subtle,h={sha:\"SHA-1\",\"sha-1\":\"SHA-1\",sha1:\"SHA-1\",sha256:\"SHA-256\",\"sha-256\":\"SHA-256\",sha384:\"SHA-384\",\"sha-384\":\"SHA-384\",\"sha-512\":\"SHA-512\",sha512:\"SHA-512\"},f=[];function d(){return i||(i=r.process&&r.process.nextTick?r.process.nextTick:r.queueMicrotask?r.queueMicrotask:r.setImmediate?r.setImmediate:r.setTimeout)}function p(e,t,r,n,i){return u.importKey(\"raw\",e,{name:\"PBKDF2\"},!1,[\"deriveBits\"]).then((function(e){return u.deriveBits({name:\"PBKDF2\",salt:t,iterations:r,hash:{name:i}},e,n<<3)})).then((function(e){return s.from(e)}))}t.exports=function(e,t,i,m,b,g){\"function\"==typeof b&&(g=b,b=void 0);var y=h[(b=b||\"sha1\").toLowerCase()];if(y&&\"function\"==typeof r.Promise){if(o(i,m),e=c(e,a,\"Password\"),t=c(t,a,\"Salt\"),\"function\"!=typeof g)throw new Error(\"No callback provided to pbkdf2\");!function(e,t){e.then((function(e){d()((function(){t(null,e)}))}),(function(e){d()((function(){t(e)}))}))}(function(e){if(r.process&&!r.process.browser)return Promise.resolve(!1);if(!u||!u.importKey||!u.deriveBits)return Promise.resolve(!1);if(void 0!==f[e])return f[e];var t=p(n=n||s.alloc(8),n,10,128,e).then((function(){return!0})).catch((function(){return!1}));return f[e]=t,t}(y).then((function(r){return r?p(e,t,i,m,y):l(e,t,i,m,b)})),g)}else d()((function(){var r;try{r=l(e,t,i,m,b)}catch(e){return g(e)}g(null,r)}))}}).call(this)}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{\"./default-encoding\":462,\"./precondition\":463,\"./sync\":464,\"./to-buffer\":465,\"safe-buffer\":494}],462:[function(e,t,r){(function(e,r){(function(){\"use strict\";var n;if(r.process&&r.process.browser)n=\"utf-8\";else if(r.process&&r.process.version){n=parseInt(e.version.split(\".\")[0].slice(1),10)>=6?\"utf-8\":\"binary\"}else n=\"utf-8\";t.exports=n}).call(this)}).call(this,e(\"_process\"),\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{_process:467}],463:[function(e,t,r){\"use strict\";var n=Math.pow(2,30)-1;t.exports=function(e,t){if(\"number\"!=typeof e)throw new TypeError(\"Iterations not a number\");if(e<0)throw new TypeError(\"Bad iterations\");if(\"number\"!=typeof t)throw new TypeError(\"Key length not a number\");if(t<0||t>n||t!=t)throw new TypeError(\"Bad key length\")}},{}],464:[function(e,t,r){\"use strict\";var n=e(\"create-hash/md5\"),i=e(\"ripemd160\"),s=e(\"sha.js\"),o=e(\"safe-buffer\").Buffer,a=e(\"./precondition\"),l=e(\"./default-encoding\"),c=e(\"./to-buffer\"),u=o.alloc(128),h={md5:16,sha1:20,sha224:28,sha256:32,sha384:48,sha512:64,rmd160:20,ripemd160:20};function f(e,t,r){var a=function(e){function t(t){return s(e).update(t).digest()}return\"rmd160\"===e||\"ripemd160\"===e?function(e){return(new i).update(e).digest()}:\"md5\"===e?n:t}(e),l=\"sha512\"===e||\"sha384\"===e?128:64;t.length>l?t=a(t):t.length<l&&(t=o.concat([t,u],l));for(var c=o.allocUnsafe(l+h[e]),f=o.allocUnsafe(l+h[e]),d=0;d<l;d++)c[d]=54^t[d],f[d]=92^t[d];var p=o.allocUnsafe(l+r+4);c.copy(p,0,0,l),this.ipad1=p,this.ipad2=c,this.opad=f,this.alg=e,this.blocksize=l,this.hash=a,this.size=h[e]}f.prototype.run=function(e,t){return e.copy(t,this.blocksize),this.hash(t).copy(this.opad,this.blocksize),this.hash(this.opad)},t.exports=function(e,t,r,n,i){a(r,n);var s=new f(i=i||\"sha1\",e=c(e,l,\"Password\"),(t=c(t,l,\"Salt\")).length),u=o.allocUnsafe(n),d=o.allocUnsafe(t.length+4);t.copy(d,0,0,t.length);for(var p=0,m=h[i],b=Math.ceil(n/m),g=1;g<=b;g++){d.writeUInt32BE(g,t.length);for(var y=s.run(d,s.ipad1),v=y,w=1;w<r;w++){v=s.run(v,s.ipad2);for(var _=0;_<m;_++)y[_]^=v[_]}y.copy(u,p),p+=m}return u}},{\"./default-encoding\":462,\"./precondition\":463,\"./to-buffer\":465,\"create-hash/md5\":387,ripemd160:493,\"safe-buffer\":494,\"sha.js\":498}],465:[function(e,t,r){\"use strict\";var n=e(\"safe-buffer\").Buffer;t.exports=function(e,t,r){if(n.isBuffer(e))return e;if(\"string\"==typeof e)return n.from(e,t);if(ArrayBuffer.isView(e))return n.from(e.buffer);throw new TypeError(r+\" must be a string, a Buffer, a typed array or a DataView\")}},{\"safe-buffer\":494}],466:[function(e,t,r){(function(e){(function(){\"use strict\";void 0===e||!e.version||0===e.version.indexOf(\"v0.\")||0===e.version.indexOf(\"v1.\")&&0!==e.version.indexOf(\"v1.8.\")?t.exports={nextTick:function(t,r,n,i){if(\"function\"!=typeof t)throw new TypeError('\"callback\" argument must be a function');var s,o,a=arguments.length;switch(a){case 0:case 1:return e.nextTick(t);case 2:return e.nextTick((function(){t.call(null,r)}));case 3:return e.nextTick((function(){t.call(null,r,n)}));case 4:return e.nextTick((function(){t.call(null,r,n,i)}));default:for(s=new Array(a-1),o=0;o<s.length;)s[o++]=arguments[o];return e.nextTick((function(){t.apply(null,s)}))}}}:t.exports=e}).call(this)}).call(this,e(\"_process\"))},{_process:467}],467:[function(e,t,r){\"use strict\";var n,i,s=t.exports={};function o(){throw new Error(\"setTimeout has not been defined\")}function a(){throw new Error(\"clearTimeout has not been defined\")}function l(e){if(n===setTimeout)return setTimeout(e,0);if((n===o||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n=\"function\"==typeof setTimeout?setTimeout:o}catch(e){n=o}try{i=\"function\"==typeof clearTimeout?clearTimeout:a}catch(e){i=a}}();var c,u=[],h=!1,f=-1;function d(){h&&c&&(h=!1,c.length?u=c.concat(u):f=-1,u.length&&p())}function p(){if(!h){var e=l(d);h=!0;for(var t=u.length;t;){for(c=u,u=[];++f<t;)c&&c[f].run();f=-1,t=u.length}c=null,h=!1,function(e){if(i===clearTimeout)return clearTimeout(e);if((i===a||!i)&&clearTimeout)return i=clearTimeout,clearTimeout(e);try{i(e)}catch(t){try{return i.call(null,e)}catch(t){return i.call(this,e)}}}(e)}}function m(e,t){this.fun=e,this.array=t}function b(){}s.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)t[r-1]=arguments[r];u.push(new m(e,t)),1!==u.length||h||l(p)},m.prototype.run=function(){this.fun.apply(null,this.array)},s.title=\"browser\",s.browser=!0,s.env={},s.argv=[],s.version=\"\",s.versions={},s.on=b,s.addListener=b,s.once=b,s.off=b,s.removeListener=b,s.removeAllListeners=b,s.emit=b,s.prependListener=b,s.prependOnceListener=b,s.listeners=function(e){return[]},s.binding=function(e){throw new Error(\"process.binding is not supported\")},s.cwd=function(){return\"/\"},s.chdir=function(e){throw new Error(\"process.chdir is not supported\")},s.umask=function(){return 0}},{}],468:[function(e,t,r){\"use strict\";r.publicEncrypt=e(\"./publicEncrypt\"),r.privateDecrypt=e(\"./privateDecrypt\"),r.privateEncrypt=function(e,t){return r.publicEncrypt(e,t,!0)},r.publicDecrypt=function(e,t){return r.privateDecrypt(e,t,!0)}},{\"./privateDecrypt\":471,\"./publicEncrypt\":472}],469:[function(e,t,r){\"use strict\";var n=e(\"create-hash\"),i=e(\"safe-buffer\").Buffer;function s(e){var t=i.allocUnsafe(4);return t.writeUInt32BE(e,0),t}t.exports=function(e,t){for(var r,o=i.alloc(0),a=0;o.length<t;)r=s(a++),o=i.concat([o,n(\"sha1\").update(e).update(r).digest()]);return o.slice(0,t)}},{\"create-hash\":386,\"safe-buffer\":494}],470:[function(e,t,r){arguments[4][184][0].apply(r,arguments)},{buffer:188,dup:184}],471:[function(e,t,r){\"use strict\";var n=e(\"parse-asn1\"),i=e(\"./mgf\"),s=e(\"./xor\"),o=e(\"bn.js\"),a=e(\"browserify-rsa\"),l=e(\"create-hash\"),c=e(\"./withPublic\"),u=e(\"safe-buffer\").Buffer;t.exports=function(e,t,r){var h;h=e.padding?e.padding:r?1:4;var f,d=n(e),p=d.modulus.byteLength();if(t.length>p||new o(t).cmp(d.modulus)>=0)throw new Error(\"decryption error\");f=r?c(new o(t),d):a(t,d);var m=u.alloc(p-f.length);if(f=u.concat([m,f],p),4===h)return function(e,t){var r=e.modulus.byteLength(),n=l(\"sha1\").update(u.alloc(0)).digest(),o=n.length;if(0!==t[0])throw new Error(\"decryption error\");var a=t.slice(1,o+1),c=t.slice(o+1),h=s(a,i(c,o)),f=s(c,i(h,r-o-1));if(function(e,t){e=u.from(e),t=u.from(t);var r=0,n=e.length;e.length!==t.length&&(r++,n=Math.min(e.length,t.length));var i=-1;for(;++i<n;)r+=e[i]^t[i];return r}(n,f.slice(0,o)))throw new Error(\"decryption error\");var d=o;for(;0===f[d];)d++;if(1!==f[d++])throw new Error(\"decryption error\");return f.slice(d)}(d,f);if(1===h)return function(e,t,r){var n=t.slice(0,2),i=2,s=0;for(;0!==t[i++];)if(i>=t.length){s++;break}var o=t.slice(2,i-1);(\"0002\"!==n.toString(\"hex\")&&!r||\"0001\"!==n.toString(\"hex\")&&r)&&s++;o.length<8&&s++;if(s)throw new Error(\"decryption error\");return t.slice(i)}(0,f,r);if(3===h)return f;throw new Error(\"unknown padding\")}},{\"./mgf\":469,\"./withPublic\":473,\"./xor\":474,\"bn.js\":470,\"browserify-rsa\":209,\"create-hash\":386,\"parse-asn1\":459,\"safe-buffer\":494}],472:[function(e,t,r){\"use strict\";var n=e(\"parse-asn1\"),i=e(\"randombytes\"),s=e(\"create-hash\"),o=e(\"./mgf\"),a=e(\"./xor\"),l=e(\"bn.js\"),c=e(\"./withPublic\"),u=e(\"browserify-rsa\"),h=e(\"safe-buffer\").Buffer;t.exports=function(e,t,r){var f;f=e.padding?e.padding:r?1:4;var d,p=n(e);if(4===f)d=function(e,t){var r=e.modulus.byteLength(),n=t.length,c=s(\"sha1\").update(h.alloc(0)).digest(),u=c.length,f=2*u;if(n>r-f-2)throw new Error(\"message too long\");var d=h.alloc(r-n-f-2),p=r-u-1,m=i(u),b=a(h.concat([c,d,h.alloc(1,1),t],p),o(m,p)),g=a(m,o(b,u));return new l(h.concat([h.alloc(1),g,b],r))}(p,t);else if(1===f)d=function(e,t,r){var n,s=t.length,o=e.modulus.byteLength();if(s>o-11)throw new Error(\"message too long\");n=r?h.alloc(o-s-3,255):function(e){var t,r=h.allocUnsafe(e),n=0,s=i(2*e),o=0;for(;n<e;)o===s.length&&(s=i(2*e),o=0),(t=s[o++])&&(r[n++]=t);return r}(o-s-3);return new l(h.concat([h.from([0,r?1:2]),n,h.alloc(1),t],o))}(p,t,r);else{if(3!==f)throw new Error(\"unknown padding\");if((d=new l(t)).cmp(p.modulus)>=0)throw new Error(\"data too long for modulus\")}return r?u(d,p):c(d,p)}},{\"./mgf\":469,\"./withPublic\":473,\"./xor\":474,\"bn.js\":470,\"browserify-rsa\":209,\"create-hash\":386,\"parse-asn1\":459,randombytes:475,\"safe-buffer\":494}],473:[function(e,t,r){\"use strict\";var n=e(\"bn.js\"),i=e(\"safe-buffer\").Buffer;t.exports=function(e,t){return i.from(e.toRed(n.mont(t.modulus)).redPow(new n(t.publicExponent)).fromRed().toArray())}},{\"bn.js\":470,\"safe-buffer\":494}],474:[function(e,t,r){\"use strict\";t.exports=function(e,t){for(var r=e.length,n=-1;++n<r;)e[n]^=t[n];return e}},{}],475:[function(e,t,r){(function(r,n){(function(){\"use strict\";var i=e(\"safe-buffer\").Buffer,s=n.crypto||n.msCrypto;s&&s.getRandomValues?t.exports=function(e,t){if(e>4294967295)throw new RangeError(\"requested too many random bytes\");var n=i.allocUnsafe(e);if(e>0)if(e>65536)for(var o=0;o<e;o+=65536)s.getRandomValues(n.slice(o,o+65536));else s.getRandomValues(n);if(\"function\"==typeof t)return r.nextTick((function(){t(null,n)}));return n}:t.exports=function(){throw new Error(\"Secure random number generation is not supported by this browser.\\nUse Chrome, Firefox or Internet Explorer 11\")}}).call(this)}).call(this,e(\"_process\"),\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{_process:467,\"safe-buffer\":494}],476:[function(e,t,r){(function(t,n){(function(){\"use strict\";function i(){throw new Error(\"secure random number generation not supported by this browser\\nuse chrome, FireFox or Internet Explorer 11\")}var s=e(\"safe-buffer\"),o=e(\"randombytes\"),a=s.Buffer,l=s.kMaxLength,c=n.crypto||n.msCrypto,u=Math.pow(2,32)-1;function h(e,t){if(\"number\"!=typeof e||e!=e)throw new TypeError(\"offset must be a number\");if(e>u||e<0)throw new TypeError(\"offset must be a uint32\");if(e>l||e>t)throw new RangeError(\"offset out of range\")}function f(e,t,r){if(\"number\"!=typeof e||e!=e)throw new TypeError(\"size must be a number\");if(e>u||e<0)throw new TypeError(\"size must be a uint32\");if(e+t>r||e>l)throw new RangeError(\"buffer too small\")}function d(e,r,n,i){if(t.browser){var s=e.buffer,a=new Uint8Array(s,r,n);return c.getRandomValues(a),i?void t.nextTick((function(){i(null,e)})):e}if(!i)return o(n).copy(e,r),e;o(n,(function(t,n){if(t)return i(t);n.copy(e,r),i(null,e)}))}c&&c.getRandomValues||!t.browser?(r.randomFill=function(e,t,r,i){if(!(a.isBuffer(e)||e instanceof n.Uint8Array))throw new TypeError('\"buf\" argument must be a Buffer or Uint8Array');if(\"function\"==typeof t)i=t,t=0,r=e.length;else if(\"function\"==typeof r)i=r,r=e.length-t;else if(\"function\"!=typeof i)throw new TypeError('\"cb\" argument must be a function');return h(t,e.length),f(r,t,e.length),d(e,t,r,i)},r.randomFillSync=function(e,t,r){void 0===t&&(t=0);if(!(a.isBuffer(e)||e instanceof n.Uint8Array))throw new TypeError('\"buf\" argument must be a Buffer or Uint8Array');h(t,e.length),void 0===r&&(r=e.length-t);return f(r,t,e.length),d(e,t,r)}):(r.randomFill=i,r.randomFillSync=i)}).call(this)}).call(this,e(\"_process\"),\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{_process:467,randombytes:475,\"safe-buffer\":494}],477:[function(e,t,r){\"use strict\";var n={};function i(e,t,r){r||(r=Error);var i=function(e){var r,n;function i(r,n,i){return e.call(this,function(e,r,n){return\"string\"==typeof t?t:t(e,r,n)}(r,n,i))||this}return n=e,(r=i).prototype=Object.create(n.prototype),r.prototype.constructor=r,r.__proto__=n,i}(r);i.prototype.name=r.name,i.prototype.code=e,n[e]=i}function s(e,t){if(Array.isArray(e)){var r=e.length;return e=e.map((function(e){return String(e)})),r>2?\"one of \".concat(t,\" \").concat(e.slice(0,r-1).join(\", \"),\", or \")+e[r-1]:2===r?\"one of \".concat(t,\" \").concat(e[0],\" or \").concat(e[1]):\"of \".concat(t,\" \").concat(e[0])}return\"of \".concat(t,\" \").concat(String(e))}i(\"ERR_INVALID_OPT_VALUE\",(function(e,t){return'The value \"'+t+'\" is invalid for option \"'+e+'\"'}),TypeError),i(\"ERR_INVALID_ARG_TYPE\",(function(e,t,r){var n,i,o,a;if(\"string\"==typeof t&&(i=\"not \",t.substr(!o||o<0?0:+o,i.length)===i)?(n=\"must not be\",t=t.replace(/^not /,\"\")):n=\"must be\",function(e,t,r){return(void 0===r||r>e.length)&&(r=e.length),e.substring(r-t.length,r)===t}(e,\" argument\"))a=\"The \".concat(e,\" \").concat(n,\" \").concat(s(t,\"type\"));else{var l=function(e,t,r){return\"number\"!=typeof r&&(r=0),!(r+t.length>e.length)&&-1!==e.indexOf(t,r)}(e,\".\")?\"property\":\"argument\";a='The \"'.concat(e,'\" ').concat(l,\" \").concat(n,\" \").concat(s(t,\"type\"))}return a+=\". Received type \".concat(typeof r)}),TypeError),i(\"ERR_STREAM_PUSH_AFTER_EOF\",\"stream.push() after EOF\"),i(\"ERR_METHOD_NOT_IMPLEMENTED\",(function(e){return\"The \"+e+\" method is not implemented\"})),i(\"ERR_STREAM_PREMATURE_CLOSE\",\"Premature close\"),i(\"ERR_STREAM_DESTROYED\",(function(e){return\"Cannot call \"+e+\" after a stream was destroyed\"})),i(\"ERR_MULTIPLE_CALLBACK\",\"Callback called multiple times\"),i(\"ERR_STREAM_CANNOT_PIPE\",\"Cannot pipe, not readable\"),i(\"ERR_STREAM_WRITE_AFTER_END\",\"write after end\"),i(\"ERR_STREAM_NULL_VALUES\",\"May not write null values to stream\",TypeError),i(\"ERR_UNKNOWN_ENCODING\",(function(e){return\"Unknown encoding: \"+e}),TypeError),i(\"ERR_STREAM_UNSHIFT_AFTER_END_EVENT\",\"stream.unshift() after end event\"),t.exports.codes=n},{}],478:[function(e,t,r){(function(r){(function(){\"use strict\";var n=Object.keys||function(e){var t=[];for(var r in e)t.push(r);return t};t.exports=c;var i=e(\"./_stream_readable\"),s=e(\"./_stream_writable\");e(\"inherits\")(c,i);for(var o=n(s.prototype),a=0;a<o.length;a++){var l=o[a];c.prototype[l]||(c.prototype[l]=s.prototype[l])}function c(e){if(!(this instanceof c))return new c(e);i.call(this,e),s.call(this,e),this.allowHalfOpen=!0,e&&(!1===e.readable&&(this.readable=!1),!1===e.writable&&(this.writable=!1),!1===e.allowHalfOpen&&(this.allowHalfOpen=!1,this.once(\"end\",u)))}function u(){this._writableState.ended||r.nextTick(h,this)}function h(e){e.end()}Object.defineProperty(c.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),Object.defineProperty(c.prototype,\"writableBuffer\",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}}),Object.defineProperty(c.prototype,\"writableLength\",{enumerable:!1,get:function(){return this._writableState.length}}),Object.defineProperty(c.prototype,\"destroyed\",{enumerable:!1,get:function(){return void 0!==this._readableState&&void 0!==this._writableState&&(this._readableState.destroyed&&this._writableState.destroyed)},set:function(e){void 0!==this._readableState&&void 0!==this._writableState&&(this._readableState.destroyed=e,this._writableState.destroyed=e)}})}).call(this)}).call(this,e(\"_process\"))},{\"./_stream_readable\":480,\"./_stream_writable\":482,_process:467,inherits:440}],479:[function(e,t,r){\"use strict\";t.exports=i;var n=e(\"./_stream_transform\");function i(e){if(!(this instanceof i))return new i(e);n.call(this,e)}e(\"inherits\")(i,n),i.prototype._transform=function(e,t,r){r(null,e)}},{\"./_stream_transform\":481,inherits:440}],480:[function(e,t,r){(function(r,n){(function(){\"use strict\";var i;t.exports=M,M.ReadableState=S;e(\"events\").EventEmitter;var s=function(e,t){return e.listeners(t).length},o=e(\"./internal/streams/stream\"),a=e(\"buffer\").Buffer,l=(void 0!==n?n:\"undefined\"!=typeof window?window:\"undefined\"!=typeof self?self:{}).Uint8Array||function(){};var c,u=e(\"util\");c=u&&u.debuglog?u.debuglog(\"stream\"):function(){};var h,f,d,p=e(\"./internal/streams/buffer_list\"),m=e(\"./internal/streams/destroy\"),b=e(\"./internal/streams/state\").getHighWaterMark,g=e(\"../errors\").codes,y=g.ERR_INVALID_ARG_TYPE,v=g.ERR_STREAM_PUSH_AFTER_EOF,w=g.ERR_METHOD_NOT_IMPLEMENTED,_=g.ERR_STREAM_UNSHIFT_AFTER_END_EVENT;e(\"inherits\")(M,o);var x=m.errorOrDestroy,k=[\"error\",\"close\",\"destroy\",\"pause\",\"resume\"];function S(t,r,n){i=i||e(\"./_stream_duplex\"),t=t||{},\"boolean\"!=typeof n&&(n=r instanceof i),this.objectMode=!!t.objectMode,n&&(this.objectMode=this.objectMode||!!t.readableObjectMode),this.highWaterMark=b(this,t,\"readableHighWaterMark\",n),this.buffer=new p,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=!1!==t.emitClose,this.autoDestroy=!!t.autoDestroy,this.destroyed=!1,this.defaultEncoding=t.defaultEncoding||\"utf8\",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(h||(h=e(\"string_decoder/\").StringDecoder),this.decoder=new h(t.encoding),this.encoding=t.encoding)}function M(t){if(i=i||e(\"./_stream_duplex\"),!(this instanceof M))return new M(t);var r=this instanceof i;this._readableState=new S(t,this,r),this.readable=!0,t&&(\"function\"==typeof t.read&&(this._read=t.read),\"function\"==typeof t.destroy&&(this._destroy=t.destroy)),o.call(this)}function C(e,t,r,n,i){c(\"readableAddChunk\",t);var s,o=e._readableState;if(null===t)o.reading=!1,function(e,t){if(c(\"onEofChunk\"),t.ended)return;if(t.decoder){var r=t.decoder.end();r&&r.length&&(t.buffer.push(r),t.length+=t.objectMode?1:r.length)}t.ended=!0,t.sync?A(e):(t.needReadable=!1,t.emittedReadable||(t.emittedReadable=!0,R(e)))}(e,o);else if(i||(s=function(e,t){var r;n=t,a.isBuffer(n)||n instanceof l||\"string\"==typeof t||void 0===t||e.objectMode||(r=new y(\"chunk\",[\"string\",\"Buffer\",\"Uint8Array\"],t));var n;return r}(o,t)),s)x(e,s);else if(o.objectMode||t&&t.length>0)if(\"string\"==typeof t||o.objectMode||Object.getPrototypeOf(t)===a.prototype||(t=function(e){return a.from(e)}(t)),n)o.endEmitted?x(e,new _):T(e,o,t,!0);else if(o.ended)x(e,new v);else{if(o.destroyed)return!1;o.reading=!1,o.decoder&&!r?(t=o.decoder.write(t),o.objectMode||0!==t.length?T(e,o,t,!1):O(e,o)):T(e,o,t,!1)}else n||(o.reading=!1,O(e,o));return!o.ended&&(o.length<o.highWaterMark||0===o.length)}function T(e,t,r,n){t.flowing&&0===t.length&&!t.sync?(t.awaitDrain=0,e.emit(\"data\",r)):(t.length+=t.objectMode?1:r.length,n?t.buffer.unshift(r):t.buffer.push(r),t.needReadable&&A(e)),O(e,t)}Object.defineProperty(M.prototype,\"destroyed\",{enumerable:!1,get:function(){return void 0!==this._readableState&&this._readableState.destroyed},set:function(e){this._readableState&&(this._readableState.destroyed=e)}}),M.prototype.destroy=m.destroy,M.prototype._undestroy=m.undestroy,M.prototype._destroy=function(e,t){t(e)},M.prototype.push=function(e,t){var r,n=this._readableState;return n.objectMode?r=!0:\"string\"==typeof e&&((t=t||n.defaultEncoding)!==n.encoding&&(e=a.from(e,t),t=\"\"),r=!0),C(this,e,t,!1,r)},M.prototype.unshift=function(e){return C(this,e,null,!0,!1)},M.prototype.isPaused=function(){return!1===this._readableState.flowing},M.prototype.setEncoding=function(t){h||(h=e(\"string_decoder/\").StringDecoder);var r=new h(t);this._readableState.decoder=r,this._readableState.encoding=this._readableState.decoder.encoding;for(var n=this._readableState.buffer.head,i=\"\";null!==n;)i+=r.write(n.data),n=n.next;return this._readableState.buffer.clear(),\"\"!==i&&this._readableState.buffer.push(i),this._readableState.length=i.length,this};function E(e,t){return e<=0||0===t.length&&t.ended?0:t.objectMode?1:e!=e?t.flowing&&t.length?t.buffer.head.data.length:t.length:(e>t.highWaterMark&&(t.highWaterMark=function(e){return e>=1073741824?e=1073741824:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}(e)),e<=t.length?e:t.ended?t.length:(t.needReadable=!0,0))}function A(e){var t=e._readableState;c(\"emitReadable\",t.needReadable,t.emittedReadable),t.needReadable=!1,t.emittedReadable||(c(\"emitReadable\",t.flowing),t.emittedReadable=!0,r.nextTick(R,e))}function R(e){var t=e._readableState;c(\"emitReadable_\",t.destroyed,t.length,t.ended),t.destroyed||!t.length&&!t.ended||(e.emit(\"readable\"),t.emittedReadable=!1),t.needReadable=!t.flowing&&!t.ended&&t.length<=t.highWaterMark,B(e)}function O(e,t){t.readingMore||(t.readingMore=!0,r.nextTick(j,e,t))}function j(e,t){for(;!t.reading&&!t.ended&&(t.length<t.highWaterMark||t.flowing&&0===t.length);){var r=t.length;if(c(\"maybeReadMore read 0\"),e.read(0),r===t.length)break}t.readingMore=!1}function I(e){var t=e._readableState;t.readableListening=e.listenerCount(\"readable\")>0,t.resumeScheduled&&!t.paused?t.flowing=!0:e.listenerCount(\"data\")>0&&e.resume()}function N(e){c(\"readable nexttick read 0\"),e.read(0)}function P(e,t){c(\"resume\",t.reading),t.reading||e.read(0),t.resumeScheduled=!1,e.emit(\"resume\"),B(e),t.flowing&&!t.reading&&e.read(0)}function B(e){var t=e._readableState;for(c(\"flow\",t.flowing);t.flowing&&null!==e.read(););}function D(e,t){return 0===t.length?null:(t.objectMode?r=t.buffer.shift():!e||e>=t.length?(r=t.decoder?t.buffer.join(\"\"):1===t.buffer.length?t.buffer.first():t.buffer.concat(t.length),t.buffer.clear()):r=t.buffer.consume(e,t.decoder),r);var r}function F(e){var t=e._readableState;c(\"endReadable\",t.endEmitted),t.endEmitted||(t.ended=!0,r.nextTick(L,t,e))}function L(e,t){if(c(\"endReadableNT\",e.endEmitted,e.length),!e.endEmitted&&0===e.length&&(e.endEmitted=!0,t.readable=!1,t.emit(\"end\"),e.autoDestroy)){var r=t._writableState;(!r||r.autoDestroy&&r.finished)&&t.destroy()}}function z(e,t){for(var r=0,n=e.length;r<n;r++)if(e[r]===t)return r;return-1}M.prototype.read=function(e){c(\"read\",e),e=parseInt(e,10);var t=this._readableState,r=e;if(0!==e&&(t.emittedReadable=!1),0===e&&t.needReadable&&((0!==t.highWaterMark?t.length>=t.highWaterMark:t.length>0)||t.ended))return c(\"read: emitReadable\",t.length,t.ended),0===t.length&&t.ended?F(this):A(this),null;if(0===(e=E(e,t))&&t.ended)return 0===t.length&&F(this),null;var n,i=t.needReadable;return c(\"need readable\",i),(0===t.length||t.length-e<t.highWaterMark)&&c(\"length less than watermark\",i=!0),t.ended||t.reading?c(\"reading or ended\",i=!1):i&&(c(\"do read\"),t.reading=!0,t.sync=!0,0===t.length&&(t.needReadable=!0),this._read(t.highWaterMark),t.sync=!1,t.reading||(e=E(r,t))),null===(n=e>0?D(e,t):null)?(t.needReadable=t.length<=t.highWaterMark,e=0):(t.length-=e,t.awaitDrain=0),0===t.length&&(t.ended||(t.needReadable=!0),r!==e&&t.ended&&F(this)),null!==n&&this.emit(\"data\",n),n},M.prototype._read=function(e){x(this,new w(\"_read()\"))},M.prototype.pipe=function(e,t){var n=this,i=this._readableState;switch(i.pipesCount){case 0:i.pipes=e;break;case 1:i.pipes=[i.pipes,e];break;default:i.pipes.push(e)}i.pipesCount+=1,c(\"pipe count=%d opts=%j\",i.pipesCount,t);var o=(!t||!1!==t.end)&&e!==r.stdout&&e!==r.stderr?l:b;function a(t,r){c(\"onunpipe\"),t===n&&r&&!1===r.hasUnpiped&&(r.hasUnpiped=!0,c(\"cleanup\"),e.removeListener(\"close\",p),e.removeListener(\"finish\",m),e.removeListener(\"drain\",u),e.removeListener(\"error\",d),e.removeListener(\"unpipe\",a),n.removeListener(\"end\",l),n.removeListener(\"end\",b),n.removeListener(\"data\",f),h=!0,!i.awaitDrain||e._writableState&&!e._writableState.needDrain||u())}function l(){c(\"onend\"),e.end()}i.endEmitted?r.nextTick(o):n.once(\"end\",o),e.on(\"unpipe\",a);var u=function(e){return function(){var t=e._readableState;c(\"pipeOnDrain\",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,0===t.awaitDrain&&s(e,\"data\")&&(t.flowing=!0,B(e))}}(n);e.on(\"drain\",u);var h=!1;function f(t){c(\"ondata\");var r=e.write(t);c(\"dest.write\",r),!1===r&&((1===i.pipesCount&&i.pipes===e||i.pipesCount>1&&-1!==z(i.pipes,e))&&!h&&(c(\"false write response, pause\",i.awaitDrain),i.awaitDrain++),n.pause())}function d(t){c(\"onerror\",t),b(),e.removeListener(\"error\",d),0===s(e,\"error\")&&x(e,t)}function p(){e.removeListener(\"finish\",m),b()}function m(){c(\"onfinish\"),e.removeListener(\"close\",p),b()}function b(){c(\"unpipe\"),n.unpipe(e)}return n.on(\"data\",f),function(e,t,r){if(\"function\"==typeof e.prependListener)return e.prependListener(t,r);e._events&&e._events[t]?Array.isArray(e._events[t])?e._events[t].unshift(r):e._events[t]=[r,e._events[t]]:e.on(t,r)}(e,\"error\",d),e.once(\"close\",p),e.once(\"finish\",m),e.emit(\"pipe\",n),i.flowing||(c(\"pipe resume\"),n.resume()),e},M.prototype.unpipe=function(e){var t=this._readableState,r={hasUnpiped:!1};if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes||(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit(\"unpipe\",this,r)),this;if(!e){var n=t.pipes,i=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var s=0;s<i;s++)n[s].emit(\"unpipe\",this,{hasUnpiped:!1});return this}var o=z(t.pipes,e);return-1===o||(t.pipes.splice(o,1),t.pipesCount-=1,1===t.pipesCount&&(t.pipes=t.pipes[0]),e.emit(\"unpipe\",this,r)),this},M.prototype.on=function(e,t){var n=o.prototype.on.call(this,e,t),i=this._readableState;return\"data\"===e?(i.readableListening=this.listenerCount(\"readable\")>0,!1!==i.flowing&&this.resume()):\"readable\"===e&&(i.endEmitted||i.readableListening||(i.readableListening=i.needReadable=!0,i.flowing=!1,i.emittedReadable=!1,c(\"on readable\",i.length,i.reading),i.length?A(this):i.reading||r.nextTick(N,this))),n},M.prototype.addListener=M.prototype.on,M.prototype.removeListener=function(e,t){var n=o.prototype.removeListener.call(this,e,t);return\"readable\"===e&&r.nextTick(I,this),n},M.prototype.removeAllListeners=function(e){var t=o.prototype.removeAllListeners.apply(this,arguments);return\"readable\"!==e&&void 0!==e||r.nextTick(I,this),t},M.prototype.resume=function(){var e=this._readableState;return e.flowing||(c(\"resume\"),e.flowing=!e.readableListening,function(e,t){t.resumeScheduled||(t.resumeScheduled=!0,r.nextTick(P,e,t))}(this,e)),e.paused=!1,this},M.prototype.pause=function(){return c(\"call pause flowing=%j\",this._readableState.flowing),!1!==this._readableState.flowing&&(c(\"pause\"),this._readableState.flowing=!1,this.emit(\"pause\")),this._readableState.paused=!0,this},M.prototype.wrap=function(e){var t=this,r=this._readableState,n=!1;for(var i in e.on(\"end\",(function(){if(c(\"wrapped end\"),r.decoder&&!r.ended){var e=r.decoder.end();e&&e.length&&t.push(e)}t.push(null)})),e.on(\"data\",(function(i){(c(\"wrapped data\"),r.decoder&&(i=r.decoder.write(i)),r.objectMode&&null==i)||(r.objectMode||i&&i.length)&&(t.push(i)||(n=!0,e.pause()))})),e)void 0===this[i]&&\"function\"==typeof e[i]&&(this[i]=function(t){return function(){return e[t].apply(e,arguments)}}(i));for(var s=0;s<k.length;s++)e.on(k[s],this.emit.bind(this,k[s]));return this._read=function(t){c(\"wrapped _read\",t),n&&(n=!1,e.resume())},this},\"function\"==typeof Symbol&&(M.prototype[Symbol.asyncIterator]=function(){return void 0===f&&(f=e(\"./internal/streams/async_iterator\")),f(this)}),Object.defineProperty(M.prototype,\"readableHighWaterMark\",{enumerable:!1,get:function(){return this._readableState.highWaterMark}}),Object.defineProperty(M.prototype,\"readableBuffer\",{enumerable:!1,get:function(){return this._readableState&&this._readableState.buffer}}),Object.defineProperty(M.prototype,\"readableFlowing\",{enumerable:!1,get:function(){return this._readableState.flowing},set:function(e){this._readableState&&(this._readableState.flowing=e)}}),M._fromList=D,Object.defineProperty(M.prototype,\"readableLength\",{enumerable:!1,get:function(){return this._readableState.length}}),\"function\"==typeof Symbol&&(M.from=function(t,r){return void 0===d&&(d=e(\"./internal/streams/from\")),d(M,t,r)})}).call(this)}).call(this,e(\"_process\"),\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{\"../errors\":477,\"./_stream_duplex\":478,\"./internal/streams/async_iterator\":483,\"./internal/streams/buffer_list\":484,\"./internal/streams/destroy\":485,\"./internal/streams/from\":487,\"./internal/streams/state\":489,\"./internal/streams/stream\":490,_process:467,buffer:220,events:422,inherits:440,\"string_decoder/\":522,util:188}],481:[function(e,t,r){\"use strict\";t.exports=u;var n=e(\"../errors\").codes,i=n.ERR_METHOD_NOT_IMPLEMENTED,s=n.ERR_MULTIPLE_CALLBACK,o=n.ERR_TRANSFORM_ALREADY_TRANSFORMING,a=n.ERR_TRANSFORM_WITH_LENGTH_0,l=e(\"./_stream_duplex\");function c(e,t){var r=this._transformState;r.transforming=!1;var n=r.writecb;if(null===n)return this.emit(\"error\",new s);r.writechunk=null,r.writecb=null,null!=t&&this.push(t),n(e);var i=this._readableState;i.reading=!1,(i.needReadable||i.length<i.highWaterMark)&&this._read(i.highWaterMark)}function u(e){if(!(this instanceof u))return new u(e);l.call(this,e),this._transformState={afterTransform:c.bind(this),needTransform:!1,transforming:!1,writecb:null,writechunk:null,writeencoding:null},this._readableState.needReadable=!0,this._readableState.sync=!1,e&&(\"function\"==typeof e.transform&&(this._transform=e.transform),\"function\"==typeof e.flush&&(this._flush=e.flush)),this.on(\"prefinish\",h)}function h(){var e=this;\"function\"!=typeof this._flush||this._readableState.destroyed?f(this,null,null):this._flush((function(t,r){f(e,t,r)}))}function f(e,t,r){if(t)return e.emit(\"error\",t);if(null!=r&&e.push(r),e._writableState.length)throw new a;if(e._transformState.transforming)throw new o;return e.push(null)}e(\"inherits\")(u,l),u.prototype.push=function(e,t){return this._transformState.needTransform=!1,l.prototype.push.call(this,e,t)},u.prototype._transform=function(e,t,r){r(new i(\"_transform()\"))},u.prototype._write=function(e,t,r){var n=this._transformState;if(n.writecb=r,n.writechunk=e,n.writeencoding=t,!n.transforming){var i=this._readableState;(n.needTransform||i.needReadable||i.length<i.highWaterMark)&&this._read(i.highWaterMark)}},u.prototype._read=function(e){var t=this._transformState;null===t.writechunk||t.transforming?t.needTransform=!0:(t.transforming=!0,this._transform(t.writechunk,t.writeencoding,t.afterTransform))},u.prototype._destroy=function(e,t){l.prototype._destroy.call(this,e,(function(e){t(e)}))}},{\"../errors\":477,\"./_stream_duplex\":478,inherits:440}],482:[function(e,t,r){(function(r,n){(function(){\"use strict\";function i(e){var t=this;this.next=null,this.entry=null,this.finish=function(){!function(e,t,r){var n=e.entry;e.entry=null;for(;n;){var i=n.callback;t.pendingcb--,i(r),n=n.next}t.corkedRequestsFree.next=e}(t,e)}}var s;t.exports=M,M.WritableState=S;var o={deprecate:e(\"util-deprecate\")},a=e(\"./internal/streams/stream\"),l=e(\"buffer\").Buffer,c=(void 0!==n?n:\"undefined\"!=typeof window?window:\"undefined\"!=typeof self?self:{}).Uint8Array||function(){};var u,h=e(\"./internal/streams/destroy\"),f=e(\"./internal/streams/state\").getHighWaterMark,d=e(\"../errors\").codes,p=d.ERR_INVALID_ARG_TYPE,m=d.ERR_METHOD_NOT_IMPLEMENTED,b=d.ERR_MULTIPLE_CALLBACK,g=d.ERR_STREAM_CANNOT_PIPE,y=d.ERR_STREAM_DESTROYED,v=d.ERR_STREAM_NULL_VALUES,w=d.ERR_STREAM_WRITE_AFTER_END,_=d.ERR_UNKNOWN_ENCODING,x=h.errorOrDestroy;function k(){}function S(t,n,o){s=s||e(\"./_stream_duplex\"),t=t||{},\"boolean\"!=typeof o&&(o=n instanceof s),this.objectMode=!!t.objectMode,o&&(this.objectMode=this.objectMode||!!t.writableObjectMode),this.highWaterMark=f(this,t,\"writableHighWaterMark\",o),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var a=!1===t.decodeStrings;this.decodeStrings=!a,this.defaultEncoding=t.defaultEncoding||\"utf8\",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(e){!function(e,t){var n=e._writableState,i=n.sync,s=n.writecb;if(\"function\"!=typeof s)throw new b;if(function(e){e.writing=!1,e.writecb=null,e.length-=e.writelen,e.writelen=0}(n),t)!function(e,t,n,i,s){--t.pendingcb,n?(r.nextTick(s,i),r.nextTick(O,e,t),e._writableState.errorEmitted=!0,x(e,i)):(s(i),e._writableState.errorEmitted=!0,x(e,i),O(e,t))}(e,n,i,t,s);else{var o=A(n)||e.destroyed;o||n.corked||n.bufferProcessing||!n.bufferedRequest||E(e,n),i?r.nextTick(T,e,n,o,s):T(e,n,o,s)}}(n,e)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=!1!==t.emitClose,this.autoDestroy=!!t.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new i(this)}function M(t){var r=this instanceof(s=s||e(\"./_stream_duplex\"));if(!r&&!u.call(M,this))return new M(t);this._writableState=new S(t,this,r),this.writable=!0,t&&(\"function\"==typeof t.write&&(this._write=t.write),\"function\"==typeof t.writev&&(this._writev=t.writev),\"function\"==typeof t.destroy&&(this._destroy=t.destroy),\"function\"==typeof t.final&&(this._final=t.final)),a.call(this)}function C(e,t,r,n,i,s,o){t.writelen=n,t.writecb=o,t.writing=!0,t.sync=!0,t.destroyed?t.onwrite(new y(\"write\")):r?e._writev(i,t.onwrite):e._write(i,s,t.onwrite),t.sync=!1}function T(e,t,r,n){r||function(e,t){0===t.length&&t.needDrain&&(t.needDrain=!1,e.emit(\"drain\"))}(e,t),t.pendingcb--,n(),O(e,t)}function E(e,t){t.bufferProcessing=!0;var r=t.bufferedRequest;if(e._writev&&r&&r.next){var n=t.bufferedRequestCount,s=new Array(n),o=t.corkedRequestsFree;o.entry=r;for(var a=0,l=!0;r;)s[a]=r,r.isBuf||(l=!1),r=r.next,a+=1;s.allBuffers=l,C(e,t,!0,t.length,s,\"\",o.finish),t.pendingcb++,t.lastBufferedRequest=null,o.next?(t.corkedRequestsFree=o.next,o.next=null):t.corkedRequestsFree=new i(t),t.bufferedRequestCount=0}else{for(;r;){var c=r.chunk,u=r.encoding,h=r.callback;if(C(e,t,!1,t.objectMode?1:c.length,c,u,h),r=r.next,t.bufferedRequestCount--,t.writing)break}null===r&&(t.lastBufferedRequest=null)}t.bufferedRequest=r,t.bufferProcessing=!1}function A(e){return e.ending&&0===e.length&&null===e.bufferedRequest&&!e.finished&&!e.writing}function R(e,t){e._final((function(r){t.pendingcb--,r&&x(e,r),t.prefinished=!0,e.emit(\"prefinish\"),O(e,t)}))}function O(e,t){var n=A(t);if(n&&(function(e,t){t.prefinished||t.finalCalled||(\"function\"!=typeof e._final||t.destroyed?(t.prefinished=!0,e.emit(\"prefinish\")):(t.pendingcb++,t.finalCalled=!0,r.nextTick(R,e,t)))}(e,t),0===t.pendingcb&&(t.finished=!0,e.emit(\"finish\"),t.autoDestroy))){var i=e._readableState;(!i||i.autoDestroy&&i.endEmitted)&&e.destroy()}return n}e(\"inherits\")(M,a),S.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t},function(){try{Object.defineProperty(S.prototype,\"buffer\",{get:o.deprecate((function(){return this.getBuffer()}),\"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.\",\"DEP0003\")})}catch(e){}}(),\"function\"==typeof Symbol&&Symbol.hasInstance&&\"function\"==typeof Function.prototype[Symbol.hasInstance]?(u=Function.prototype[Symbol.hasInstance],Object.defineProperty(M,Symbol.hasInstance,{value:function(e){return!!u.call(this,e)||this===M&&(e&&e._writableState instanceof S)}})):u=function(e){return e instanceof this},M.prototype.pipe=function(){x(this,new g)},M.prototype.write=function(e,t,n){var i,s=this._writableState,o=!1,a=!s.objectMode&&(i=e,l.isBuffer(i)||i instanceof c);return a&&!l.isBuffer(e)&&(e=function(e){return l.from(e)}(e)),\"function\"==typeof t&&(n=t,t=null),a?t=\"buffer\":t||(t=s.defaultEncoding),\"function\"!=typeof n&&(n=k),s.ending?function(e,t){var n=new w;x(e,n),r.nextTick(t,n)}(this,n):(a||function(e,t,n,i){var s;return null===n?s=new v:\"string\"==typeof n||t.objectMode||(s=new p(\"chunk\",[\"string\",\"Buffer\"],n)),!s||(x(e,s),r.nextTick(i,s),!1)}(this,s,e,n))&&(s.pendingcb++,o=function(e,t,r,n,i,s){if(!r){var o=function(e,t,r){e.objectMode||!1===e.decodeStrings||\"string\"!=typeof t||(t=l.from(t,r));return t}(t,n,i);n!==o&&(r=!0,i=\"buffer\",n=o)}var a=t.objectMode?1:n.length;t.length+=a;var c=t.length<t.highWaterMark;c||(t.needDrain=!0);if(t.writing||t.corked){var u=t.lastBufferedRequest;t.lastBufferedRequest={chunk:n,encoding:i,isBuf:r,callback:s,next:null},u?u.next=t.lastBufferedRequest:t.bufferedRequest=t.lastBufferedRequest,t.bufferedRequestCount+=1}else C(e,t,!1,a,n,i,s);return c}(this,s,a,e,t,n)),o},M.prototype.cork=function(){this._writableState.corked++},M.prototype.uncork=function(){var e=this._writableState;e.corked&&(e.corked--,e.writing||e.corked||e.bufferProcessing||!e.bufferedRequest||E(this,e))},M.prototype.setDefaultEncoding=function(e){if(\"string\"==typeof e&&(e=e.toLowerCase()),!([\"hex\",\"utf8\",\"utf-8\",\"ascii\",\"binary\",\"base64\",\"ucs2\",\"ucs-2\",\"utf16le\",\"utf-16le\",\"raw\"].indexOf((e+\"\").toLowerCase())>-1))throw new _(e);return this._writableState.defaultEncoding=e,this},Object.defineProperty(M.prototype,\"writableBuffer\",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}}),Object.defineProperty(M.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),M.prototype._write=function(e,t,r){r(new m(\"_write()\"))},M.prototype._writev=null,M.prototype.end=function(e,t,n){var i=this._writableState;return\"function\"==typeof e?(n=e,e=null,t=null):\"function\"==typeof t&&(n=t,t=null),null!=e&&this.write(e,t),i.corked&&(i.corked=1,this.uncork()),i.ending||function(e,t,n){t.ending=!0,O(e,t),n&&(t.finished?r.nextTick(n):e.once(\"finish\",n));t.ended=!0,e.writable=!1}(this,i,n),this},Object.defineProperty(M.prototype,\"writableLength\",{enumerable:!1,get:function(){return this._writableState.length}}),Object.defineProperty(M.prototype,\"destroyed\",{enumerable:!1,get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(e){this._writableState&&(this._writableState.destroyed=e)}}),M.prototype.destroy=h.destroy,M.prototype._undestroy=h.undestroy,M.prototype._destroy=function(e,t){t(e)}}).call(this)}).call(this,e(\"_process\"),\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{\"../errors\":477,\"./_stream_duplex\":478,\"./internal/streams/destroy\":485,\"./internal/streams/state\":489,\"./internal/streams/stream\":490,_process:467,buffer:220,inherits:440,\"util-deprecate\":524}],483:[function(e,t,r){(function(r){(function(){\"use strict\";var n;function i(e,t,r){return(t=function(e){var t=function(e,t){if(\"object\"!=typeof e||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||\"default\");if(\"object\"!=typeof n)return n;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return(\"string\"===t?String:Number)(e)}(e,\"string\");return\"symbol\"==typeof t?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var s=e(\"./end-of-stream\"),o=Symbol(\"lastResolve\"),a=Symbol(\"lastReject\"),l=Symbol(\"error\"),c=Symbol(\"ended\"),u=Symbol(\"lastPromise\"),h=Symbol(\"handlePromise\"),f=Symbol(\"stream\");function d(e,t){return{value:e,done:t}}function p(e){var t=e[o];if(null!==t){var r=e[f].read();null!==r&&(e[u]=null,e[o]=null,e[a]=null,t(d(r,!1)))}}function m(e){r.nextTick(p,e)}var b=Object.getPrototypeOf((function(){})),g=Object.setPrototypeOf((i(n={get stream(){return this[f]},next:function(){var e=this,t=this[l];if(null!==t)return Promise.reject(t);if(this[c])return Promise.resolve(d(void 0,!0));if(this[f].destroyed)return new Promise((function(t,n){r.nextTick((function(){e[l]?n(e[l]):t(d(void 0,!0))}))}));var n,i=this[u];if(i)n=new Promise(function(e,t){return function(r,n){e.then((function(){t[c]?r(d(void 0,!0)):t[h](r,n)}),n)}}(i,this));else{var s=this[f].read();if(null!==s)return Promise.resolve(d(s,!1));n=new Promise(this[h])}return this[u]=n,n}},Symbol.asyncIterator,(function(){return this})),i(n,\"return\",(function(){var e=this;return new Promise((function(t,r){e[f].destroy(null,(function(e){e?r(e):t(d(void 0,!0))}))}))})),n),b);t.exports=function(e){var t,r=Object.create(g,(i(t={},f,{value:e,writable:!0}),i(t,o,{value:null,writable:!0}),i(t,a,{value:null,writable:!0}),i(t,l,{value:null,writable:!0}),i(t,c,{value:e._readableState.endEmitted,writable:!0}),i(t,h,{value:function(e,t){var n=r[f].read();n?(r[u]=null,r[o]=null,r[a]=null,e(d(n,!1))):(r[o]=e,r[a]=t)},writable:!0}),t));return r[u]=null,s(e,(function(e){if(e&&\"ERR_STREAM_PREMATURE_CLOSE\"!==e.code){var t=r[a];return null!==t&&(r[u]=null,r[o]=null,r[a]=null,t(e)),void(r[l]=e)}var n=r[o];null!==n&&(r[u]=null,r[o]=null,r[a]=null,n(d(void 0,!0))),r[c]=!0})),e.on(\"readable\",m.bind(null,r)),r}}).call(this)}).call(this,e(\"_process\"))},{\"./end-of-stream\":486,_process:467}],484:[function(e,t,r){\"use strict\";function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?n(Object(r),!0).forEach((function(t){s(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):n(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t,r){return(t=a(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,a(n.key),n)}}function a(e){var t=function(e,t){if(\"object\"!=typeof e||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||\"default\");if(\"object\"!=typeof n)return n;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return(\"string\"===t?String:Number)(e)}(e,\"string\");return\"symbol\"==typeof t?t:String(t)}var l=e(\"buffer\").Buffer,c=e(\"util\").inspect,u=c&&c.custom||\"inspect\";t.exports=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,e),this.head=null,this.tail=null,this.length=0}var t,r,n;return t=e,(r=[{key:\"push\",value:function(e){var t={data:e,next:null};this.length>0?this.tail.next=t:this.head=t,this.tail=t,++this.length}},{key:\"unshift\",value:function(e){var t={data:e,next:this.head};0===this.length&&(this.tail=t),this.head=t,++this.length}},{key:\"shift\",value:function(){if(0!==this.length){var e=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,e}}},{key:\"clear\",value:function(){this.head=this.tail=null,this.length=0}},{key:\"join\",value:function(e){if(0===this.length)return\"\";for(var t=this.head,r=\"\"+t.data;t=t.next;)r+=e+t.data;return r}},{key:\"concat\",value:function(e){if(0===this.length)return l.alloc(0);for(var t,r,n,i=l.allocUnsafe(e>>>0),s=this.head,o=0;s;)t=s.data,r=i,n=o,l.prototype.copy.call(t,r,n),o+=s.data.length,s=s.next;return i}},{key:\"consume\",value:function(e,t){var r;return e<this.head.data.length?(r=this.head.data.slice(0,e),this.head.data=this.head.data.slice(e)):r=e===this.head.data.length?this.shift():t?this._getString(e):this._getBuffer(e),r}},{key:\"first\",value:function(){return this.head.data}},{key:\"_getString\",value:function(e){var t=this.head,r=1,n=t.data;for(e-=n.length;t=t.next;){var i=t.data,s=e>i.length?i.length:e;if(s===i.length?n+=i:n+=i.slice(0,e),0==(e-=s)){s===i.length?(++r,t.next?this.head=t.next:this.head=this.tail=null):(this.head=t,t.data=i.slice(s));break}++r}return this.length-=r,n}},{key:\"_getBuffer\",value:function(e){var t=l.allocUnsafe(e),r=this.head,n=1;for(r.data.copy(t),e-=r.data.length;r=r.next;){var i=r.data,s=e>i.length?i.length:e;if(i.copy(t,t.length-e,0,s),0==(e-=s)){s===i.length?(++n,r.next?this.head=r.next:this.head=this.tail=null):(this.head=r,r.data=i.slice(s));break}++n}return this.length-=n,t}},{key:u,value:function(e,t){return c(this,i(i({},t),{},{depth:0,customInspect:!1}))}}])&&o(t.prototype,r),n&&o(t,n),Object.defineProperty(t,\"prototype\",{writable:!1}),e}()},{buffer:220,util:188}],485:[function(e,t,r){(function(e){(function(){\"use strict\";function r(e,t){i(e,t),n(e)}function n(e){e._writableState&&!e._writableState.emitClose||e._readableState&&!e._readableState.emitClose||e.emit(\"close\")}function i(e,t){e.emit(\"error\",t)}t.exports={destroy:function(t,s){var o=this,a=this._readableState&&this._readableState.destroyed,l=this._writableState&&this._writableState.destroyed;return a||l?(s?s(t):t&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,e.nextTick(i,this,t)):e.nextTick(i,this,t)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(t||null,(function(t){!s&&t?o._writableState?o._writableState.errorEmitted?e.nextTick(n,o):(o._writableState.errorEmitted=!0,e.nextTick(r,o,t)):e.nextTick(r,o,t):s?(e.nextTick(n,o),s(t)):e.nextTick(n,o)})),this)},undestroy:function(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)},errorOrDestroy:function(e,t){var r=e._readableState,n=e._writableState;r&&r.autoDestroy||n&&n.autoDestroy?e.destroy(t):e.emit(\"error\",t)}}}).call(this)}).call(this,e(\"_process\"))},{_process:467}],486:[function(e,t,r){\"use strict\";var n=e(\"../../../errors\").codes.ERR_STREAM_PREMATURE_CLOSE;function i(){}t.exports=function e(t,r,s){if(\"function\"==typeof r)return e(t,null,r);r||(r={}),s=function(e){var t=!1;return function(){if(!t){t=!0;for(var r=arguments.length,n=new Array(r),i=0;i<r;i++)n[i]=arguments[i];e.apply(this,n)}}}(s||i);var o=r.readable||!1!==r.readable&&t.readable,a=r.writable||!1!==r.writable&&t.writable,l=function(){t.writable||u()},c=t._writableState&&t._writableState.finished,u=function(){a=!1,c=!0,o||s.call(t)},h=t._readableState&&t._readableState.endEmitted,f=function(){o=!1,h=!0,a||s.call(t)},d=function(e){s.call(t,e)},p=function(){var e;return o&&!h?(t._readableState&&t._readableState.ended||(e=new n),s.call(t,e)):a&&!c?(t._writableState&&t._writableState.ended||(e=new n),s.call(t,e)):void 0},m=function(){t.req.on(\"finish\",u)};return!function(e){return e.setHeader&&\"function\"==typeof e.abort}(t)?a&&!t._writableState&&(t.on(\"end\",l),t.on(\"close\",l)):(t.on(\"complete\",u),t.on(\"abort\",p),t.req?m():t.on(\"request\",m)),t.on(\"end\",f),t.on(\"finish\",u),!1!==r.error&&t.on(\"error\",d),t.on(\"close\",p),function(){t.removeListener(\"complete\",u),t.removeListener(\"abort\",p),t.removeListener(\"request\",m),t.req&&t.req.removeListener(\"finish\",u),t.removeListener(\"end\",l),t.removeListener(\"close\",l),t.removeListener(\"finish\",u),t.removeListener(\"end\",f),t.removeListener(\"error\",d),t.removeListener(\"close\",p)}}},{\"../../../errors\":477}],487:[function(e,t,r){\"use strict\";t.exports=function(){throw new Error(\"Readable.from is not available in the browser\")}},{}],488:[function(e,t,r){\"use strict\";var n;var i=e(\"../../../errors\").codes,s=i.ERR_MISSING_ARGS,o=i.ERR_STREAM_DESTROYED;function a(e){if(e)throw e}function l(t,r,i,s){s=function(e){var t=!1;return function(){t||(t=!0,e.apply(void 0,arguments))}}(s);var a=!1;t.on(\"close\",(function(){a=!0})),void 0===n&&(n=e(\"./end-of-stream\")),n(t,{readable:r,writable:i},(function(e){if(e)return s(e);a=!0,s()}));var l=!1;return function(e){if(!a&&!l)return l=!0,function(e){return e.setHeader&&\"function\"==typeof e.abort}(t)?t.abort():\"function\"==typeof t.destroy?t.destroy():void s(e||new o(\"pipe\"))}}function c(e){e()}function u(e,t){return e.pipe(t)}function h(e){return e.length?\"function\"!=typeof e[e.length-1]?a:e.pop():a}t.exports=function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];var n,i=h(t);if(Array.isArray(t[0])&&(t=t[0]),t.length<2)throw new s(\"streams\");var o=t.map((function(e,r){var s=r<t.length-1;return l(e,s,r>0,(function(e){n||(n=e),e&&o.forEach(c),s||(o.forEach(c),i(n))}))}));return t.reduce(u)}},{\"../../../errors\":477,\"./end-of-stream\":486}],489:[function(e,t,r){\"use strict\";var n=e(\"../../../errors\").codes.ERR_INVALID_OPT_VALUE;t.exports={getHighWaterMark:function(e,t,r,i){var s=function(e,t,r){return null!=e.highWaterMark?e.highWaterMark:t?e[r]:null}(t,i,r);if(null!=s){if(!isFinite(s)||Math.floor(s)!==s||s<0)throw new n(i?r:\"highWaterMark\",s);return Math.floor(s)}return e.objectMode?16:16384}}},{\"../../../errors\":477}],490:[function(e,t,r){\"use strict\";t.exports=e(\"events\").EventEmitter},{events:422}],491:[function(e,t,r){\"use strict\";(r=t.exports=e(\"./lib/_stream_readable.js\")).Stream=r,r.Readable=r,r.Writable=e(\"./lib/_stream_writable.js\"),r.Duplex=e(\"./lib/_stream_duplex.js\"),r.Transform=e(\"./lib/_stream_transform.js\"),r.PassThrough=e(\"./lib/_stream_passthrough.js\"),r.finished=e(\"./lib/internal/streams/end-of-stream.js\"),r.pipeline=e(\"./lib/internal/streams/pipeline.js\")},{\"./lib/_stream_duplex.js\":478,\"./lib/_stream_passthrough.js\":479,\"./lib/_stream_readable.js\":480,\"./lib/_stream_transform.js\":481,\"./lib/_stream_writable.js\":482,\"./lib/internal/streams/end-of-stream.js\":486,\"./lib/internal/streams/pipeline.js\":488}],492:[function(e,t,r){\"use strict\";var n=function(e){var t=Object.prototype,r=t.hasOwnProperty,n=Object.defineProperty||function(e,t,r){e[t]=r.value},i=\"function\"==typeof Symbol?Symbol:{},s=i.iterator||\"@@iterator\",o=i.asyncIterator||\"@@asyncIterator\",a=i.toStringTag||\"@@toStringTag\";function l(e,t,r){return Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{l({},\"\")}catch(e){l=function(e,t,r){return e[t]=r}}function c(e,t,r,i){var s=t&&t.prototype instanceof f?t:f,o=Object.create(s.prototype),a=new M(i||[]);return n(o,\"_invoke\",{value:_(e,r,a)}),o}function u(e,t,r){try{return{type:\"normal\",arg:e.call(t,r)}}catch(e){return{type:\"throw\",arg:e}}}e.wrap=c;var h={};function f(){}function d(){}function p(){}var m={};l(m,s,(function(){return this}));var b=Object.getPrototypeOf,g=b&&b(b(C([])));g&&g!==t&&r.call(g,s)&&(m=g);var y=p.prototype=f.prototype=Object.create(m);function v(e){[\"next\",\"throw\",\"return\"].forEach((function(t){l(e,t,(function(e){return this._invoke(t,e)}))}))}function w(e,t){var i;n(this,\"_invoke\",{value:function(n,s){function o(){return new t((function(i,o){!function n(i,s,o,a){var l=u(e[i],e,s);if(\"throw\"!==l.type){var c=l.arg,h=c.value;return h&&\"object\"==typeof h&&r.call(h,\"__await\")?t.resolve(h.__await).then((function(e){n(\"next\",e,o,a)}),(function(e){n(\"throw\",e,o,a)})):t.resolve(h).then((function(e){c.value=e,o(c)}),(function(e){return n(\"throw\",e,o,a)}))}a(l.arg)}(n,s,i,o)}))}return i=i?i.then(o,o):o()}})}function _(e,t,r){var n=\"suspendedStart\";return function(i,s){if(\"executing\"===n)throw new Error(\"Generator is already running\");if(\"completed\"===n){if(\"throw\"===i)throw s;return T()}for(r.method=i,r.arg=s;;){var o=r.delegate;if(o){var a=x(o,r);if(a){if(a===h)continue;return a}}if(\"next\"===r.method)r.sent=r._sent=r.arg;else if(\"throw\"===r.method){if(\"suspendedStart\"===n)throw n=\"completed\",r.arg;r.dispatchException(r.arg)}else\"return\"===r.method&&r.abrupt(\"return\",r.arg);n=\"executing\";var l=u(e,t,r);if(\"normal\"===l.type){if(n=r.done?\"completed\":\"suspendedYield\",l.arg===h)continue;return{value:l.arg,done:r.done}}\"throw\"===l.type&&(n=\"completed\",r.method=\"throw\",r.arg=l.arg)}}}function x(e,t){var r=t.method,n=e.iterator[r];if(void 0===n)return t.delegate=null,\"throw\"===r&&e.iterator.return&&(t.method=\"return\",t.arg=void 0,x(e,t),\"throw\"===t.method)||\"return\"!==r&&(t.method=\"throw\",t.arg=new TypeError(\"The iterator does not provide a '\"+r+\"' method\")),h;var i=u(n,e.iterator,t.arg);if(\"throw\"===i.type)return t.method=\"throw\",t.arg=i.arg,t.delegate=null,h;var s=i.arg;return s?s.done?(t[e.resultName]=s.value,t.next=e.nextLoc,\"return\"!==t.method&&(t.method=\"next\",t.arg=void 0),t.delegate=null,h):s:(t.method=\"throw\",t.arg=new TypeError(\"iterator result is not an object\"),t.delegate=null,h)}function k(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function S(e){var t=e.completion||{};t.type=\"normal\",delete t.arg,e.completion=t}function M(e){this.tryEntries=[{tryLoc:\"root\"}],e.forEach(k,this),this.reset(!0)}function C(e){if(e){var t=e[s];if(t)return t.call(e);if(\"function\"==typeof e.next)return e;if(!isNaN(e.length)){var n=-1,i=function t(){for(;++n<e.length;)if(r.call(e,n))return t.value=e[n],t.done=!1,t;return t.value=void 0,t.done=!0,t};return i.next=i}}return{next:T}}function T(){return{value:void 0,done:!0}}return d.prototype=p,n(y,\"constructor\",{value:p,configurable:!0}),n(p,\"constructor\",{value:d,configurable:!0}),d.displayName=l(p,a,\"GeneratorFunction\"),e.isGeneratorFunction=function(e){var t=\"function\"==typeof e&&e.constructor;return!!t&&(t===d||\"GeneratorFunction\"===(t.displayName||t.name))},e.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,p):(e.__proto__=p,l(e,a,\"GeneratorFunction\")),e.prototype=Object.create(y),e},e.awrap=function(e){return{__await:e}},v(w.prototype),l(w.prototype,o,(function(){return this})),e.AsyncIterator=w,e.async=function(t,r,n,i,s){void 0===s&&(s=Promise);var o=new w(c(t,r,n,i),s);return e.isGeneratorFunction(r)?o:o.next().then((function(e){return e.done?e.value:o.next()}))},v(y),l(y,a,\"Generator\"),l(y,s,(function(){return this})),l(y,\"toString\",(function(){return\"[object Generator]\"})),e.keys=function(e){var t=Object(e),r=[];for(var n in t)r.push(n);return r.reverse(),function e(){for(;r.length;){var n=r.pop();if(n in t)return e.value=n,e.done=!1,e}return e.done=!0,e}},e.values=C,M.prototype={constructor:M,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method=\"next\",this.arg=void 0,this.tryEntries.forEach(S),!e)for(var t in this)\"t\"===t.charAt(0)&&r.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=void 0)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if(\"throw\"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var t=this;function n(r,n){return o.type=\"throw\",o.arg=e,t.next=r,n&&(t.method=\"next\",t.arg=void 0),!!n}for(var i=this.tryEntries.length-1;i>=0;--i){var s=this.tryEntries[i],o=s.completion;if(\"root\"===s.tryLoc)return n(\"end\");if(s.tryLoc<=this.prev){var a=r.call(s,\"catchLoc\"),l=r.call(s,\"finallyLoc\");if(a&&l){if(this.prev<s.catchLoc)return n(s.catchLoc,!0);if(this.prev<s.finallyLoc)return n(s.finallyLoc)}else if(a){if(this.prev<s.catchLoc)return n(s.catchLoc,!0)}else{if(!l)throw new Error(\"try statement without catch or finally\");if(this.prev<s.finallyLoc)return n(s.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&r.call(i,\"finallyLoc\")&&this.prev<i.finallyLoc){var s=i;break}}s&&(\"break\"===e||\"continue\"===e)&&s.tryLoc<=t&&t<=s.finallyLoc&&(s=null);var o=s?s.completion:{};return o.type=e,o.arg=t,s?(this.method=\"next\",this.next=s.finallyLoc,h):this.complete(o)},complete:function(e,t){if(\"throw\"===e.type)throw e.arg;return\"break\"===e.type||\"continue\"===e.type?this.next=e.arg:\"return\"===e.type?(this.rval=this.arg=e.arg,this.method=\"return\",this.next=\"end\"):\"normal\"===e.type&&t&&(this.next=t),h},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),S(r),h}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if(\"throw\"===n.type){var i=n.arg;S(r)}return i}}throw new Error(\"illegal catch attempt\")},delegateYield:function(e,t,r){return this.delegate={iterator:C(e),resultName:t,nextLoc:r},\"next\"===this.method&&(this.arg=void 0),h}},e}(\"object\"==typeof t?t.exports:{});try{regeneratorRuntime=n}catch(e){\"object\"==typeof globalThis?globalThis.regeneratorRuntime=n:Function(\"r\",\"regeneratorRuntime = r\")(n)}},{}],493:[function(e,t,r){\"use strict\";var n=e(\"buffer\").Buffer,i=e(\"inherits\"),s=e(\"hash-base\"),o=new Array(16),a=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13],l=[5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11],c=[11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6],u=[8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11],h=[0,1518500249,1859775393,2400959708,2840853838],f=[1352829926,1548603684,1836072691,2053994217,0];function d(){s.call(this,64),this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520}function p(e,t){return e<<t|e>>>32-t}function m(e,t,r,n,i,s,o,a){return p(e+(t^r^n)+s+o|0,a)+i|0}function b(e,t,r,n,i,s,o,a){return p(e+(t&r|~t&n)+s+o|0,a)+i|0}function g(e,t,r,n,i,s,o,a){return p(e+((t|~r)^n)+s+o|0,a)+i|0}function y(e,t,r,n,i,s,o,a){return p(e+(t&n|r&~n)+s+o|0,a)+i|0}function v(e,t,r,n,i,s,o,a){return p(e+(t^(r|~n))+s+o|0,a)+i|0}i(d,s),d.prototype._update=function(){for(var e=o,t=0;t<16;++t)e[t]=this._block.readInt32LE(4*t);for(var r=0|this._a,n=0|this._b,i=0|this._c,s=0|this._d,d=0|this._e,w=0|this._a,_=0|this._b,x=0|this._c,k=0|this._d,S=0|this._e,M=0;M<80;M+=1){var C,T;M<16?(C=m(r,n,i,s,d,e[a[M]],h[0],c[M]),T=v(w,_,x,k,S,e[l[M]],f[0],u[M])):M<32?(C=b(r,n,i,s,d,e[a[M]],h[1],c[M]),T=y(w,_,x,k,S,e[l[M]],f[1],u[M])):M<48?(C=g(r,n,i,s,d,e[a[M]],h[2],c[M]),T=g(w,_,x,k,S,e[l[M]],f[2],u[M])):M<64?(C=y(r,n,i,s,d,e[a[M]],h[3],c[M]),T=b(w,_,x,k,S,e[l[M]],f[3],u[M])):(C=v(r,n,i,s,d,e[a[M]],h[4],c[M]),T=m(w,_,x,k,S,e[l[M]],f[4],u[M])),r=d,d=s,s=p(i,10),i=n,n=C,w=S,S=k,k=p(x,10),x=_,_=T}var E=this._b+i+k|0;this._b=this._c+s+S|0,this._c=this._d+d+w|0,this._d=this._e+r+_|0,this._e=this._a+n+x|0,this._a=E},d.prototype._digest=function(){this._block[this._blockOffset++]=128,this._blockOffset>56&&(this._block.fill(0,this._blockOffset,64),this._update(),this._blockOffset=0),this._block.fill(0,this._blockOffset,56),this._block.writeUInt32LE(this._length[0],56),this._block.writeUInt32LE(this._length[1],60),this._update();var e=n.alloc?n.alloc(20):new n(20);return e.writeInt32LE(this._a,0),e.writeInt32LE(this._b,4),e.writeInt32LE(this._c,8),e.writeInt32LE(this._d,12),e.writeInt32LE(this._e,16),e},t.exports=d},{buffer:220,\"hash-base\":425,inherits:440}],494:[function(e,t,r){\"use strict\";\n/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */var n=e(\"buffer\"),i=n.Buffer;function s(e,t){for(var r in e)t[r]=e[r]}function o(e,t,r){return i(e,t,r)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?t.exports=n:(s(n,r),r.Buffer=o),o.prototype=Object.create(i.prototype),s(i,o),o.from=function(e,t,r){if(\"number\"==typeof e)throw new TypeError(\"Argument must not be a number\");return i(e,t,r)},o.alloc=function(e,t,r){if(\"number\"!=typeof e)throw new TypeError(\"Argument must be a number\");var n=i(e);return void 0!==t?\"string\"==typeof r?n.fill(t,r):n.fill(t):n.fill(0),n},o.allocUnsafe=function(e){if(\"number\"!=typeof e)throw new TypeError(\"Argument must be a number\");return i(e)},o.allocUnsafeSlow=function(e){if(\"number\"!=typeof e)throw new TypeError(\"Argument must be a number\");return n.SlowBuffer(e)}},{buffer:220}],495:[function(e,t,r){(function(r){(function(){\"use strict\";var n,i=e(\"buffer\"),s=i.Buffer,o={};for(n in i)i.hasOwnProperty(n)&&\"SlowBuffer\"!==n&&\"Buffer\"!==n&&(o[n]=i[n]);var a=o.Buffer={};for(n in s)s.hasOwnProperty(n)&&\"allocUnsafe\"!==n&&\"allocUnsafeSlow\"!==n&&(a[n]=s[n]);if(o.Buffer.prototype=s.prototype,a.from&&a.from!==Uint8Array.from||(a.from=function(e,t,r){if(\"number\"==typeof e)throw new TypeError('The \"value\" argument must not be of type number. Received type '+typeof e);if(e&&void 0===e.length)throw new TypeError(\"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \"+typeof e);return s(e,t,r)}),a.alloc||(a.alloc=function(e,t,r){if(\"number\"!=typeof e)throw new TypeError('The \"size\" argument must be of type number. Received type '+typeof e);if(e<0||e>=2*(1<<30))throw new RangeError('The value \"'+e+'\" is invalid for option \"size\"');var n=s(e);return t&&0!==t.length?\"string\"==typeof r?n.fill(t,r):n.fill(t):n.fill(0),n}),!o.kStringMaxLength)try{o.kStringMaxLength=r.binding(\"buffer\").kStringMaxLength}catch(e){}o.constants||(o.constants={MAX_LENGTH:o.kMaxLength},o.kStringMaxLength&&(o.constants.MAX_STRING_LENGTH=o.kStringMaxLength)),t.exports=o}).call(this)}).call(this,e(\"_process\"))},{_process:467,buffer:220}],496:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});const n=e(\"xmlchars/xml/1.0/ed5\"),i=e(\"xmlchars/xml/1.1/ed2\"),s=e(\"xmlchars/xmlns/1.0/ed3\");var o=n.isS,a=n.isChar,l=n.isNameStartChar,c=n.isNameChar,u=n.S_LIST,h=n.NAME_RE,f=i.isChar,d=s.isNCNameStartChar,p=s.isNCNameChar,m=s.NC_NAME_RE;const b=\"http://www.w3.org/XML/1998/namespace\",g=\"http://www.w3.org/2000/xmlns/\",y={__proto__:null,xml:b,xmlns:g},v={__proto__:null,amp:\"&\",gt:\">\",lt:\"<\",quot:'\"',apos:\"'\"},w=e=>34===e||39===e,_=[34,39],x=[..._,91,62],k=[..._,60,93],S=[61,63,...u],M=[...u,62,38,60];function C(e,t,r){switch(t){case\"xml\":r!==b&&e.fail(`xml prefix must be bound to ${b}.`);break;case\"xmlns\":r!==g&&e.fail(`xmlns prefix must be bound to ${g}.`)}switch(r){case g:e.fail(\"\"===t?`the default namespace may not be set to ${r}.`:`may not assign a prefix (even \"xmlns\") to the URI ${g}.`);break;case b:switch(t){case\"xml\":break;case\"\":e.fail(`the default namespace may not be set to ${r}.`);break;default:e.fail(\"may not assign the xml namespace to another prefix.\")}}}const T=e=>m.test(e),E=e=>h.test(e);r.EVENTS=[\"xmldecl\",\"text\",\"processinginstruction\",\"doctype\",\"comment\",\"opentagstart\",\"attribute\",\"opentag\",\"closetag\",\"cdata\",\"error\",\"end\",\"ready\"];const A={xmldecl:\"xmldeclHandler\",text:\"textHandler\",processinginstruction:\"piHandler\",doctype:\"doctypeHandler\",comment:\"commentHandler\",opentagstart:\"openTagStartHandler\",attribute:\"attributeHandler\",opentag:\"openTagHandler\",closetag:\"closeTagHandler\",cdata:\"cdataHandler\",error:\"errorHandler\",end:\"endHandler\",ready:\"readyHandler\"};r.SaxesParser=class{constructor(e){this.opt=null!=e?e:{},this.fragmentOpt=!!this.opt.fragment;const t=this.xmlnsOpt=!!this.opt.xmlns;if(this.trackPosition=!1!==this.opt.position,this.fileName=this.opt.fileName,t){this.nameStartCheck=d,this.nameCheck=p,this.isName=T,this.processAttribs=this.processAttribsNS,this.pushAttrib=this.pushAttribNS,this.ns=Object.assign({__proto__:null},y);const e=this.opt.additionalNamespaces;null!=e&&(!function(e,t){for(const r of Object.keys(t))C(e,r,t[r])}(this,e),Object.assign(this.ns,e))}else this.nameStartCheck=l,this.nameCheck=c,this.isName=E,this.processAttribs=this.processAttribsPlain,this.pushAttrib=this.pushAttribPlain;this.stateTable=[this.sBegin,this.sBeginWhitespace,this.sDoctype,this.sDoctypeQuote,this.sDTD,this.sDTDQuoted,this.sDTDOpenWaka,this.sDTDOpenWakaBang,this.sDTDComment,this.sDTDCommentEnding,this.sDTDCommentEnded,this.sDTDPI,this.sDTDPIEnding,this.sText,this.sEntity,this.sOpenWaka,this.sOpenWakaBang,this.sComment,this.sCommentEnding,this.sCommentEnded,this.sCData,this.sCDataEnding,this.sCDataEnding2,this.sPIFirstChar,this.sPIRest,this.sPIBody,this.sPIEnding,this.sXMLDeclNameStart,this.sXMLDeclName,this.sXMLDeclEq,this.sXMLDeclValueStart,this.sXMLDeclValue,this.sXMLDeclSeparator,this.sXMLDeclEnding,this.sOpenTag,this.sOpenTagSlash,this.sAttrib,this.sAttribName,this.sAttribNameSawWhite,this.sAttribValue,this.sAttribValueQuoted,this.sAttribValueClosed,this.sAttribValueUnquoted,this.sCloseTag,this.sCloseTagSawWhite],this._init()}get closed(){return this._closed}_init(){var e;this.openWakaBang=\"\",this.text=\"\",this.name=\"\",this.piTarget=\"\",this.entity=\"\",this.q=null,this.tags=[],this.tag=null,this.topNS=null,this.chunk=\"\",this.chunkPosition=0,this.i=0,this.prevI=0,this.carriedFromPrevious=void 0,this.forbiddenState=0,this.attribList=[];const{fragmentOpt:t}=this;this.state=t?13:0,this.reportedTextBeforeRoot=this.reportedTextAfterRoot=this.closedRoot=this.sawRoot=t,this.xmlDeclPossible=!t,this.xmlDeclExpects=[\"version\"],this.entityReturnState=void 0;let{defaultXMLVersion:r}=this.opt;if(void 0===r){if(!0===this.opt.forceXMLVersion)throw new Error(\"forceXMLVersion set but defaultXMLVersion is not set\");r=\"1.0\"}this.setXMLVersion(r),this.positionAtNewLine=0,this.doctype=!1,this._closed=!1,this.xmlDecl={version:void 0,encoding:void 0,standalone:void 0},this.line=1,this.column=0,this.ENTITIES=Object.create(v),null===(e=this.readyHandler)||void 0===e||e.call(this)}get position(){return this.chunkPosition+this.i}get columnIndex(){return this.position-this.positionAtNewLine}on(e,t){this[A[e]]=t}off(e){this[A[e]]=void 0}makeError(e){var t;let r=null!==(t=this.fileName)&&void 0!==t?t:\"\";return this.trackPosition&&(r.length>0&&(r+=\":\"),r+=`${this.line}:${this.column}`),r.length>0&&(r+=\": \"),new Error(r+e)}fail(e){const t=this.makeError(e),r=this.errorHandler;if(void 0===r)throw t;return r(t),this}write(e){if(this.closed)return this.fail(\"cannot write after close; assign an onready handler.\");let t=!1;null===e?(t=!0,e=\"\"):\"object\"==typeof e&&(e=e.toString()),void 0!==this.carriedFromPrevious&&(e=`${this.carriedFromPrevious}${e}`,this.carriedFromPrevious=void 0);let r=e.length;const n=e.charCodeAt(r-1);!t&&(13===n||n>=55296&&n<=56319)&&(this.carriedFromPrevious=e[r-1],r--,e=e.slice(0,r));const{stateTable:i}=this;for(this.chunk=e,this.i=0;this.i<r;)i[this.state].call(this);return this.chunkPosition+=r,t?this.end():this}close(){return this.write(null)}getCode10(){const{chunk:e,i:t}=this;if(this.prevI=t,this.i=t+1,t>=e.length)return-1;const r=e.charCodeAt(t);if(this.column++,r<55296){if(r>=32||9===r)return r;switch(r){case 10:return this.line++,this.column=0,this.positionAtNewLine=this.position,10;case 13:return 10===e.charCodeAt(t+1)&&(this.i=t+2),this.line++,this.column=0,this.positionAtNewLine=this.position,-2;default:return this.fail(\"disallowed character.\"),r}}if(r>56319)return r>=57344&&r<=65533||this.fail(\"disallowed character.\"),r;const n=65536+1024*(r-55296)+(e.charCodeAt(t+1)-56320);return this.i=t+2,n>1114111&&this.fail(\"disallowed character.\"),n}getCode11(){const{chunk:e,i:t}=this;if(this.prevI=t,this.i=t+1,t>=e.length)return-1;const r=e.charCodeAt(t);if(this.column++,r<55296){if(r>31&&r<127||r>159&&8232!==r||9===r)return r;switch(r){case 10:return this.line++,this.column=0,this.positionAtNewLine=this.position,10;case 13:{const r=e.charCodeAt(t+1);10!==r&&133!==r||(this.i=t+2)}case 133:case 8232:return this.line++,this.column=0,this.positionAtNewLine=this.position,-2;default:return this.fail(\"disallowed character.\"),r}}if(r>56319)return r>=57344&&r<=65533||this.fail(\"disallowed character.\"),r;const n=65536+1024*(r-55296)+(e.charCodeAt(t+1)-56320);return this.i=t+2,n>1114111&&this.fail(\"disallowed character.\"),n}getCodeNorm(){const e=this.getCode();return-2===e?10:e}unget(){this.i=this.prevI,this.column--}captureTo(e){let{i:t}=this;const{chunk:r}=this;for(;;){const n=this.getCode(),i=-2===n,s=i?10:n;if(-1===s||e.includes(s))return this.text+=r.slice(t,this.prevI),s;i&&(this.text+=r.slice(t,this.prevI)+\"\\n\",t=this.i)}}captureToChar(e){let{i:t}=this;const{chunk:r}=this;for(;;){let n=this.getCode();switch(n){case-2:this.text+=r.slice(t,this.prevI)+\"\\n\",t=this.i,n=10;break;case-1:return this.text+=r.slice(t),!1}if(n===e)return this.text+=r.slice(t,this.prevI),!0}}captureNameChars(){const{chunk:e,i:t}=this;for(;;){const r=this.getCode();if(-1===r)return this.name+=e.slice(t),-1;if(!c(r))return this.name+=e.slice(t,this.prevI),-2===r?10:r}}skipSpaces(){for(;;){const e=this.getCodeNorm();if(-1===e||!o(e))return e}}setXMLVersion(e){this.currentXMLVersion=e,\"1.0\"===e?(this.isChar=a,this.getCode=this.getCode10):(this.isChar=f,this.getCode=this.getCode11)}sBegin(){65279===this.chunk.charCodeAt(0)&&(this.i++,this.column++),this.state=1}sBeginWhitespace(){const e=this.i,t=this.skipSpaces();switch(this.prevI!==e&&(this.xmlDeclPossible=!1),t){case 60:if(this.state=15,0!==this.text.length)throw new Error(\"no-empty text at start\");break;case-1:break;default:this.unget(),this.state=13,this.xmlDeclPossible=!1}}sDoctype(){var e;const t=this.captureTo(x);switch(t){case 62:null===(e=this.doctypeHandler)||void 0===e||e.call(this,this.text),this.text=\"\",this.state=13,this.doctype=!0;break;case-1:break;default:this.text+=String.fromCodePoint(t),91===t?this.state=4:w(t)&&(this.state=3,this.q=t)}}sDoctypeQuote(){const e=this.q;this.captureToChar(e)&&(this.text+=String.fromCodePoint(e),this.q=null,this.state=2)}sDTD(){const e=this.captureTo(k);-1!==e&&(this.text+=String.fromCodePoint(e),93===e?this.state=2:60===e?this.state=6:w(e)&&(this.state=5,this.q=e))}sDTDQuoted(){const e=this.q;this.captureToChar(e)&&(this.text+=String.fromCodePoint(e),this.state=4,this.q=null)}sDTDOpenWaka(){const e=this.getCodeNorm();switch(this.text+=String.fromCodePoint(e),e){case 33:this.state=7,this.openWakaBang=\"\";break;case 63:this.state=11;break;default:this.state=4}}sDTDOpenWakaBang(){const e=String.fromCodePoint(this.getCodeNorm()),t=this.openWakaBang+=e;this.text+=e,\"-\"!==t&&(this.state=\"--\"===t?8:4,this.openWakaBang=\"\")}sDTDComment(){this.captureToChar(45)&&(this.text+=\"-\",this.state=9)}sDTDCommentEnding(){const e=this.getCodeNorm();this.text+=String.fromCodePoint(e),this.state=45===e?10:8}sDTDCommentEnded(){const e=this.getCodeNorm();this.text+=String.fromCodePoint(e),62===e?this.state=4:(this.fail(\"malformed comment.\"),this.state=8)}sDTDPI(){this.captureToChar(63)&&(this.text+=\"?\",this.state=12)}sDTDPIEnding(){const e=this.getCodeNorm();this.text+=String.fromCodePoint(e),62===e&&(this.state=4)}sText(){0!==this.tags.length?this.handleTextInRoot():this.handleTextOutsideRoot()}sEntity(){let{i:e}=this;const{chunk:t}=this;e:for(;;)switch(this.getCode()){case-2:this.entity+=t.slice(e,this.prevI)+\"\\n\",e=this.i;break;case 59:{const{entityReturnState:r}=this,n=this.entity+t.slice(e,this.prevI);let i;this.state=r,\"\"===n?(this.fail(\"empty entity name.\"),i=\"&;\"):(i=this.parseEntity(n),this.entity=\"\"),13===r&&void 0===this.textHandler||(this.text+=i);break e}case-1:this.entity+=t.slice(e);break e}}sOpenWaka(){const e=this.getCode();if(l(e))this.state=34,this.unget(),this.xmlDeclPossible=!1;else switch(e){case 47:this.state=43,this.xmlDeclPossible=!1;break;case 33:this.state=16,this.openWakaBang=\"\",this.xmlDeclPossible=!1;break;case 63:this.state=23;break;default:this.fail(\"disallowed character in tag name\"),this.state=13,this.xmlDeclPossible=!1}}sOpenWakaBang(){switch(this.openWakaBang+=String.fromCodePoint(this.getCodeNorm()),this.openWakaBang){case\"[CDATA[\":this.sawRoot||this.reportedTextBeforeRoot||(this.fail(\"text data outside of root node.\"),this.reportedTextBeforeRoot=!0),this.closedRoot&&!this.reportedTextAfterRoot&&(this.fail(\"text data outside of root node.\"),this.reportedTextAfterRoot=!0),this.state=20,this.openWakaBang=\"\";break;case\"--\":this.state=17,this.openWakaBang=\"\";break;case\"DOCTYPE\":this.state=2,(this.doctype||this.sawRoot)&&this.fail(\"inappropriately located doctype declaration.\"),this.openWakaBang=\"\";break;default:this.openWakaBang.length>=7&&this.fail(\"incorrect syntax.\")}}sComment(){this.captureToChar(45)&&(this.state=18)}sCommentEnding(){var e;const t=this.getCodeNorm();45===t?(this.state=19,null===(e=this.commentHandler)||void 0===e||e.call(this,this.text),this.text=\"\"):(this.text+=\"-\"+String.fromCodePoint(t),this.state=17)}sCommentEnded(){const e=this.getCodeNorm();62!==e?(this.fail(\"malformed comment.\"),this.text+=\"--\"+String.fromCodePoint(e),this.state=17):this.state=13}sCData(){this.captureToChar(93)&&(this.state=21)}sCDataEnding(){const e=this.getCodeNorm();93===e?this.state=22:(this.text+=\"]\"+String.fromCodePoint(e),this.state=20)}sCDataEnding2(){var e;const t=this.getCodeNorm();switch(t){case 62:null===(e=this.cdataHandler)||void 0===e||e.call(this,this.text),this.text=\"\",this.state=13;break;case 93:this.text+=\"]\";break;default:this.text+=\"]]\"+String.fromCodePoint(t),this.state=20}}sPIFirstChar(){const e=this.getCodeNorm();this.nameStartCheck(e)?(this.piTarget+=String.fromCodePoint(e),this.state=24):63===e||o(e)?(this.fail(\"processing instruction without a target.\"),this.state=63===e?26:25):(this.fail(\"disallowed character in processing instruction name.\"),this.piTarget+=String.fromCodePoint(e),this.state=24)}sPIRest(){const{chunk:e,i:t}=this;for(;;){const r=this.getCodeNorm();if(-1===r)return void(this.piTarget+=e.slice(t));if(!this.nameCheck(r)){this.piTarget+=e.slice(t,this.prevI);const n=63===r;n||o(r)?\"xml\"===this.piTarget?(this.xmlDeclPossible||this.fail(\"an XML declaration must be at the start of the document.\"),this.state=n?33:27):this.state=n?26:25:(this.fail(\"disallowed character in processing instruction name.\"),this.piTarget+=String.fromCodePoint(r));break}}}sPIBody(){if(0===this.text.length){const e=this.getCodeNorm();63===e?this.state=26:o(e)||(this.text=String.fromCodePoint(e))}else this.captureToChar(63)&&(this.state=26)}sPIEnding(){var e;const t=this.getCodeNorm();if(62===t){const{piTarget:t}=this;\"xml\"===t.toLowerCase()&&this.fail(\"the XML declaration must appear at the start of the document.\"),null===(e=this.piHandler)||void 0===e||e.call(this,{target:t,body:this.text}),this.piTarget=this.text=\"\",this.state=13}else 63===t?this.text+=\"?\":(this.text+=\"?\"+String.fromCodePoint(t),this.state=25);this.xmlDeclPossible=!1}sXMLDeclNameStart(){const e=this.skipSpaces();63!==e?-1!==e&&(this.state=28,this.name=String.fromCodePoint(e)):this.state=33}sXMLDeclName(){const e=this.captureTo(S);if(63===e)return this.state=33,this.name+=this.text,this.text=\"\",void this.fail(\"XML declaration is incomplete.\");if(o(e)||61===e){if(this.name+=this.text,this.text=\"\",!this.xmlDeclExpects.includes(this.name))switch(this.name.length){case 0:this.fail(\"did not expect any more name/value pairs.\");break;case 1:this.fail(`expected the name ${this.xmlDeclExpects[0]}.`);break;default:this.fail(\"expected one of \"+this.xmlDeclExpects.join(\", \"))}this.state=61===e?30:29}}sXMLDeclEq(){const e=this.getCodeNorm();if(63===e)return this.state=33,void this.fail(\"XML declaration is incomplete.\");o(e)||(61!==e&&this.fail(\"value required.\"),this.state=30)}sXMLDeclValueStart(){const e=this.getCodeNorm();if(63===e)return this.state=33,void this.fail(\"XML declaration is incomplete.\");o(e)||(w(e)?this.q=e:(this.fail(\"value must be quoted.\"),this.q=32),this.state=31)}sXMLDeclValue(){const e=this.captureTo([this.q,63]);if(63===e)return this.state=33,this.text=\"\",void this.fail(\"XML declaration is incomplete.\");if(-1===e)return;const t=this.text;switch(this.text=\"\",this.name){case\"version\":{this.xmlDeclExpects=[\"encoding\",\"standalone\"];const e=t;this.xmlDecl.version=e,/^1\\.[0-9]+$/.test(e)?this.opt.forceXMLVersion||this.setXMLVersion(e):this.fail(\"version number must match /^1\\\\.[0-9]+$/.\");break}case\"encoding\":/^[A-Za-z][A-Za-z0-9._-]*$/.test(t)||this.fail(\"encoding value must match /^[A-Za-z0-9][A-Za-z0-9._-]*$/.\"),this.xmlDeclExpects=[\"standalone\"],this.xmlDecl.encoding=t;break;case\"standalone\":\"yes\"!==t&&\"no\"!==t&&this.fail('standalone value must match \"yes\" or \"no\".'),this.xmlDeclExpects=[],this.xmlDecl.standalone=t}this.name=\"\",this.state=32}sXMLDeclSeparator(){const e=this.getCodeNorm();63!==e?(o(e)||(this.fail(\"whitespace required.\"),this.unget()),this.state=27):this.state=33}sXMLDeclEnding(){var e;62===this.getCodeNorm()?(\"xml\"!==this.piTarget?this.fail(\"processing instructions are not allowed before root.\"):\"version\"!==this.name&&this.xmlDeclExpects.includes(\"version\")&&this.fail(\"XML declaration must contain a version.\"),null===(e=this.xmldeclHandler)||void 0===e||e.call(this,this.xmlDecl),this.name=\"\",this.piTarget=this.text=\"\",this.state=13):this.fail(\"The character ? is disallowed anywhere in XML declarations.\"),this.xmlDeclPossible=!1}sOpenTag(){var e;const t=this.captureNameChars();if(-1===t)return;const r=this.tag={name:this.name,attributes:Object.create(null)};switch(this.name=\"\",this.xmlnsOpt&&(this.topNS=r.ns=Object.create(null)),null===(e=this.openTagStartHandler)||void 0===e||e.call(this,r),this.sawRoot=!0,!this.fragmentOpt&&this.closedRoot&&this.fail(\"documents may contain only one root.\"),t){case 62:this.openTag();break;case 47:this.state=35;break;default:o(t)||this.fail(\"disallowed character in tag name.\"),this.state=36}}sOpenTagSlash(){62===this.getCode()?this.openSelfClosingTag():(this.fail(\"forward-slash in opening tag not followed by >.\"),this.state=36)}sAttrib(){const e=this.skipSpaces();-1!==e&&(l(e)?(this.unget(),this.state=37):62===e?this.openTag():47===e?this.state=35:this.fail(\"disallowed character in attribute name.\"))}sAttribName(){const e=this.captureNameChars();61===e?this.state=39:o(e)?this.state=38:62===e?(this.fail(\"attribute without value.\"),this.pushAttrib(this.name,this.name),this.name=this.text=\"\",this.openTag()):-1!==e&&this.fail(\"disallowed character in attribute name.\")}sAttribNameSawWhite(){const e=this.skipSpaces();switch(e){case-1:return;case 61:this.state=39;break;default:this.fail(\"attribute without value.\"),this.text=\"\",this.name=\"\",62===e?this.openTag():l(e)?(this.unget(),this.state=37):(this.fail(\"disallowed character in attribute name.\"),this.state=36)}}sAttribValue(){const e=this.getCodeNorm();w(e)?(this.q=e,this.state=40):o(e)||(this.fail(\"unquoted attribute value.\"),this.state=42,this.unget())}sAttribValueQuoted(){const{q:e,chunk:t}=this;let{i:r}=this;for(;;)switch(this.getCode()){case e:return this.pushAttrib(this.name,this.text+t.slice(r,this.prevI)),this.name=this.text=\"\",this.q=null,void(this.state=41);case 38:return this.text+=t.slice(r,this.prevI),this.state=14,void(this.entityReturnState=40);case 10:case-2:case 9:this.text+=t.slice(r,this.prevI)+\" \",r=this.i;break;case 60:return this.text+=t.slice(r,this.prevI),void this.fail(\"disallowed character.\");case-1:return void(this.text+=t.slice(r))}}sAttribValueClosed(){const e=this.getCodeNorm();o(e)?this.state=36:62===e?this.openTag():47===e?this.state=35:l(e)?(this.fail(\"no whitespace between attributes.\"),this.unget(),this.state=37):this.fail(\"disallowed character in attribute name.\")}sAttribValueUnquoted(){const e=this.captureTo(M);switch(e){case 38:this.state=14,this.entityReturnState=42;break;case 60:this.fail(\"disallowed character.\");break;case-1:break;default:this.text.includes(\"]]>\")&&this.fail('the string \"]]>\" is disallowed in char data.'),this.pushAttrib(this.name,this.text),this.name=this.text=\"\",62===e?this.openTag():this.state=36}}sCloseTag(){const e=this.captureNameChars();62===e?this.closeTag():o(e)?this.state=44:-1!==e&&this.fail(\"disallowed character in closing tag.\")}sCloseTagSawWhite(){switch(this.skipSpaces()){case 62:this.closeTag();break;case-1:break;default:this.fail(\"disallowed character in closing tag.\")}}handleTextInRoot(){let{i:e,forbiddenState:t}=this;const{chunk:r,textHandler:n}=this;e:for(;;)switch(this.getCode()){case 60:if(this.state=15,void 0!==n){const{text:t}=this,i=r.slice(e,this.prevI);0!==t.length?(n(t+i),this.text=\"\"):0!==i.length&&n(i)}t=0;break e;case 38:this.state=14,this.entityReturnState=13,void 0!==n&&(this.text+=r.slice(e,this.prevI)),t=0;break e;case 93:switch(t){case 0:t=1;break;case 1:t=2;break;case 2:break;default:throw new Error(\"impossible state\")}break;case 62:2===t&&this.fail('the string \"]]>\" is disallowed in char data.'),t=0;break;case-2:void 0!==n&&(this.text+=r.slice(e,this.prevI)+\"\\n\"),e=this.i,t=0;break;case-1:void 0!==n&&(this.text+=r.slice(e));break e;default:t=0}this.forbiddenState=t}handleTextOutsideRoot(){let{i:e}=this;const{chunk:t,textHandler:r}=this;let n=!1;e:for(;;){const i=this.getCode();switch(i){case 60:if(this.state=15,void 0!==r){const{text:n}=this,i=t.slice(e,this.prevI);0!==n.length?(r(n+i),this.text=\"\"):0!==i.length&&r(i)}break e;case 38:this.state=14,this.entityReturnState=13,void 0!==r&&(this.text+=t.slice(e,this.prevI)),n=!0;break e;case-2:void 0!==r&&(this.text+=t.slice(e,this.prevI)+\"\\n\"),e=this.i;break;case-1:void 0!==r&&(this.text+=t.slice(e));break e;default:o(i)||(n=!0)}}n&&(this.sawRoot||this.reportedTextBeforeRoot||(this.fail(\"text data outside of root node.\"),this.reportedTextBeforeRoot=!0),this.closedRoot&&!this.reportedTextAfterRoot&&(this.fail(\"text data outside of root node.\"),this.reportedTextAfterRoot=!0))}pushAttribNS(e,t){var r;const{prefix:n,local:i}=this.qname(e),s={name:e,prefix:n,local:i,value:t};if(this.attribList.push(s),null===(r=this.attributeHandler)||void 0===r||r.call(this,s),\"xmlns\"===n){const e=t.trim();\"1.0\"===this.currentXMLVersion&&\"\"===e&&this.fail(\"invalid attempt to undefine prefix in XML 1.0\"),this.topNS[i]=e,C(this,i,e)}else if(\"xmlns\"===e){const e=t.trim();this.topNS[\"\"]=e,C(this,\"\",e)}}pushAttribPlain(e,t){var r;const n={name:e,value:t};this.attribList.push(n),null===(r=this.attributeHandler)||void 0===r||r.call(this,n)}end(){var e,t;this.sawRoot||this.fail(\"document must contain a root element.\");const{tags:r}=this;for(;r.length>0;){const e=r.pop();this.fail(\"unclosed tag: \"+e.name)}0!==this.state&&13!==this.state&&this.fail(\"unexpected end.\");const{text:n}=this;return 0!==n.length&&(null===(e=this.textHandler)||void 0===e||e.call(this,n),this.text=\"\"),this._closed=!0,null===(t=this.endHandler)||void 0===t||t.call(this),this._init(),this}resolve(e){var t,r;let n=this.topNS[e];if(void 0!==n)return n;const{tags:i}=this;for(let t=i.length-1;t>=0;t--)if(n=i[t].ns[e],void 0!==n)return n;return n=this.ns[e],void 0!==n?n:null===(r=(t=this.opt).resolvePrefix)||void 0===r?void 0:r.call(t,e)}qname(e){const t=e.indexOf(\":\");if(-1===t)return{prefix:\"\",local:e};const r=e.slice(t+1),n=e.slice(0,t);return(\"\"===n||\"\"===r||r.includes(\":\"))&&this.fail(`malformed name: ${e}.`),{prefix:n,local:r}}processAttribsNS(){var e;const{attribList:t}=this,r=this.tag;{const{prefix:t,local:n}=this.qname(r.name);r.prefix=t,r.local=n;const i=r.uri=null!==(e=this.resolve(t))&&void 0!==e?e:\"\";\"\"!==t&&(\"xmlns\"===t&&this.fail('tags may not have \"xmlns\" as prefix.'),\"\"===i&&(this.fail(`unbound namespace prefix: ${JSON.stringify(t)}.`),r.uri=t))}if(0===t.length)return;const{attributes:n}=r,i=new Set;for(const e of t){const{name:t,prefix:r,local:s}=e;let o,a;\"\"===r?(o=\"xmlns\"===t?g:\"\",a=t):(o=this.resolve(r),void 0===o&&(this.fail(`unbound namespace prefix: ${JSON.stringify(r)}.`),o=r),a=`{${o}}${s}`),i.has(a)&&this.fail(`duplicate attribute: ${a}.`),i.add(a),e.uri=o,n[t]=e}this.attribList=[]}processAttribsPlain(){const{attribList:e}=this,t=this.tag.attributes;for(const{name:r,value:n}of e)void 0!==t[r]&&this.fail(`duplicate attribute: ${r}.`),t[r]=n;this.attribList=[]}openTag(){var e;this.processAttribs();const{tags:t}=this,r=this.tag;r.isSelfClosing=!1,null===(e=this.openTagHandler)||void 0===e||e.call(this,r),t.push(r),this.state=13,this.name=\"\"}openSelfClosingTag(){var e,t,r;this.processAttribs();const{tags:n}=this,i=this.tag;i.isSelfClosing=!0,null===(e=this.openTagHandler)||void 0===e||e.call(this,i),null===(t=this.closeTagHandler)||void 0===t||t.call(this,i);null===(this.tag=null!==(r=n[n.length-1])&&void 0!==r?r:null)&&(this.closedRoot=!0),this.state=13,this.name=\"\"}closeTag(){const{tags:e,name:t}=this;if(this.state=13,this.name=\"\",\"\"===t)return this.fail(\"weird empty close tag.\"),void(this.text+=\"</>\");const r=this.closeTagHandler;let n=e.length;for(;n-- >0;){const n=this.tag=e.pop();if(this.topNS=n.ns,null==r||r(n),n.name===t)break;this.fail(\"unexpected close tag.\")}0===n?this.closedRoot=!0:n<0&&(this.fail(`unmatched closing tag: ${t}.`),this.text+=`</${t}>`)}parseEntity(e){if(\"#\"!==e[0]){const t=this.ENTITIES[e];return void 0!==t?t:(this.fail(this.isName(e)?\"undefined entity.\":\"disallowed character in entity name.\"),`&${e};`)}let t=NaN;return\"x\"===e[1]&&/^#x[0-9a-f]+$/i.test(e)?t=parseInt(e.slice(2),16):/^#[0-9]+$/.test(e)&&(t=parseInt(e.slice(1),10)),this.isChar(t)?String.fromCodePoint(t):(this.fail(\"malformed character entity.\"),`&${e};`)}}},{\"xmlchars/xml/1.0/ed5\":543,\"xmlchars/xml/1.1/ed2\":544,\"xmlchars/xmlns/1.0/ed3\":545}],497:[function(e,t,r){\"use strict\";var n=e(\"safe-buffer\").Buffer;function i(e,t){this._block=n.alloc(e),this._finalSize=t,this._blockSize=e,this._len=0}i.prototype.update=function(e,t){\"string\"==typeof e&&(t=t||\"utf8\",e=n.from(e,t));for(var r=this._block,i=this._blockSize,s=e.length,o=this._len,a=0;a<s;){for(var l=o%i,c=Math.min(s-a,i-l),u=0;u<c;u++)r[l+u]=e[a+u];a+=c,(o+=c)%i==0&&this._update(r)}return this._len+=s,this},i.prototype.digest=function(e){var t=this._len%this._blockSize;this._block[t]=128,this._block.fill(0,t+1),t>=this._finalSize&&(this._update(this._block),this._block.fill(0));var r=8*this._len;if(r<=4294967295)this._block.writeUInt32BE(r,this._blockSize-4);else{var n=(4294967295&r)>>>0,i=(r-n)/4294967296;this._block.writeUInt32BE(i,this._blockSize-8),this._block.writeUInt32BE(n,this._blockSize-4)}this._update(this._block);var s=this._hash();return e?s.toString(e):s},i.prototype._update=function(){throw new Error(\"_update must be implemented by subclass\")},t.exports=i},{\"safe-buffer\":494}],498:[function(e,t,r){\"use strict\";var n=t.exports=function(e){e=e.toLowerCase();var t=n[e];if(!t)throw new Error(e+\" is not supported (we accept pull requests)\");return new t};n.sha=e(\"./sha\"),n.sha1=e(\"./sha1\"),n.sha224=e(\"./sha224\"),n.sha256=e(\"./sha256\"),n.sha384=e(\"./sha384\"),n.sha512=e(\"./sha512\")},{\"./sha\":499,\"./sha1\":500,\"./sha224\":501,\"./sha256\":502,\"./sha384\":503,\"./sha512\":504}],499:[function(e,t,r){\"use strict\";var n=e(\"inherits\"),i=e(\"./hash\"),s=e(\"safe-buffer\").Buffer,o=[1518500249,1859775393,-1894007588,-899497514],a=new Array(80);function l(){this.init(),this._w=a,i.call(this,64,56)}function c(e){return e<<30|e>>>2}function u(e,t,r,n){return 0===e?t&r|~t&n:2===e?t&r|t&n|r&n:t^r^n}n(l,i),l.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},l.prototype._update=function(e){for(var t,r=this._w,n=0|this._a,i=0|this._b,s=0|this._c,a=0|this._d,l=0|this._e,h=0;h<16;++h)r[h]=e.readInt32BE(4*h);for(;h<80;++h)r[h]=r[h-3]^r[h-8]^r[h-14]^r[h-16];for(var f=0;f<80;++f){var d=~~(f/20),p=0|((t=n)<<5|t>>>27)+u(d,i,s,a)+l+r[f]+o[d];l=a,a=s,s=c(i),i=n,n=p}this._a=n+this._a|0,this._b=i+this._b|0,this._c=s+this._c|0,this._d=a+this._d|0,this._e=l+this._e|0},l.prototype._hash=function(){var e=s.allocUnsafe(20);return e.writeInt32BE(0|this._a,0),e.writeInt32BE(0|this._b,4),e.writeInt32BE(0|this._c,8),e.writeInt32BE(0|this._d,12),e.writeInt32BE(0|this._e,16),e},t.exports=l},{\"./hash\":497,inherits:440,\"safe-buffer\":494}],500:[function(e,t,r){\"use strict\";var n=e(\"inherits\"),i=e(\"./hash\"),s=e(\"safe-buffer\").Buffer,o=[1518500249,1859775393,-1894007588,-899497514],a=new Array(80);function l(){this.init(),this._w=a,i.call(this,64,56)}function c(e){return e<<5|e>>>27}function u(e){return e<<30|e>>>2}function h(e,t,r,n){return 0===e?t&r|~t&n:2===e?t&r|t&n|r&n:t^r^n}n(l,i),l.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},l.prototype._update=function(e){for(var t,r=this._w,n=0|this._a,i=0|this._b,s=0|this._c,a=0|this._d,l=0|this._e,f=0;f<16;++f)r[f]=e.readInt32BE(4*f);for(;f<80;++f)r[f]=(t=r[f-3]^r[f-8]^r[f-14]^r[f-16])<<1|t>>>31;for(var d=0;d<80;++d){var p=~~(d/20),m=c(n)+h(p,i,s,a)+l+r[d]+o[p]|0;l=a,a=s,s=u(i),i=n,n=m}this._a=n+this._a|0,this._b=i+this._b|0,this._c=s+this._c|0,this._d=a+this._d|0,this._e=l+this._e|0},l.prototype._hash=function(){var e=s.allocUnsafe(20);return e.writeInt32BE(0|this._a,0),e.writeInt32BE(0|this._b,4),e.writeInt32BE(0|this._c,8),e.writeInt32BE(0|this._d,12),e.writeInt32BE(0|this._e,16),e},t.exports=l},{\"./hash\":497,inherits:440,\"safe-buffer\":494}],501:[function(e,t,r){\"use strict\";var n=e(\"inherits\"),i=e(\"./sha256\"),s=e(\"./hash\"),o=e(\"safe-buffer\").Buffer,a=new Array(64);function l(){this.init(),this._w=a,s.call(this,64,56)}n(l,i),l.prototype.init=function(){return this._a=3238371032,this._b=914150663,this._c=812702999,this._d=4144912697,this._e=4290775857,this._f=1750603025,this._g=1694076839,this._h=3204075428,this},l.prototype._hash=function(){var e=o.allocUnsafe(28);return e.writeInt32BE(this._a,0),e.writeInt32BE(this._b,4),e.writeInt32BE(this._c,8),e.writeInt32BE(this._d,12),e.writeInt32BE(this._e,16),e.writeInt32BE(this._f,20),e.writeInt32BE(this._g,24),e},t.exports=l},{\"./hash\":497,\"./sha256\":502,inherits:440,\"safe-buffer\":494}],502:[function(e,t,r){\"use strict\";var n=e(\"inherits\"),i=e(\"./hash\"),s=e(\"safe-buffer\").Buffer,o=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],a=new Array(64);function l(){this.init(),this._w=a,i.call(this,64,56)}function c(e,t,r){return r^e&(t^r)}function u(e,t,r){return e&t|r&(e|t)}function h(e){return(e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10)}function f(e){return(e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7)}function d(e){return(e>>>7|e<<25)^(e>>>18|e<<14)^e>>>3}n(l,i),l.prototype.init=function(){return this._a=1779033703,this._b=3144134277,this._c=1013904242,this._d=2773480762,this._e=1359893119,this._f=2600822924,this._g=528734635,this._h=1541459225,this},l.prototype._update=function(e){for(var t,r=this._w,n=0|this._a,i=0|this._b,s=0|this._c,a=0|this._d,l=0|this._e,p=0|this._f,m=0|this._g,b=0|this._h,g=0;g<16;++g)r[g]=e.readInt32BE(4*g);for(;g<64;++g)r[g]=0|(((t=r[g-2])>>>17|t<<15)^(t>>>19|t<<13)^t>>>10)+r[g-7]+d(r[g-15])+r[g-16];for(var y=0;y<64;++y){var v=b+f(l)+c(l,p,m)+o[y]+r[y]|0,w=h(n)+u(n,i,s)|0;b=m,m=p,p=l,l=a+v|0,a=s,s=i,i=n,n=v+w|0}this._a=n+this._a|0,this._b=i+this._b|0,this._c=s+this._c|0,this._d=a+this._d|0,this._e=l+this._e|0,this._f=p+this._f|0,this._g=m+this._g|0,this._h=b+this._h|0},l.prototype._hash=function(){var e=s.allocUnsafe(32);return e.writeInt32BE(this._a,0),e.writeInt32BE(this._b,4),e.writeInt32BE(this._c,8),e.writeInt32BE(this._d,12),e.writeInt32BE(this._e,16),e.writeInt32BE(this._f,20),e.writeInt32BE(this._g,24),e.writeInt32BE(this._h,28),e},t.exports=l},{\"./hash\":497,inherits:440,\"safe-buffer\":494}],503:[function(e,t,r){\"use strict\";var n=e(\"inherits\"),i=e(\"./sha512\"),s=e(\"./hash\"),o=e(\"safe-buffer\").Buffer,a=new Array(160);function l(){this.init(),this._w=a,s.call(this,128,112)}n(l,i),l.prototype.init=function(){return this._ah=3418070365,this._bh=1654270250,this._ch=2438529370,this._dh=355462360,this._eh=1731405415,this._fh=2394180231,this._gh=3675008525,this._hh=1203062813,this._al=3238371032,this._bl=914150663,this._cl=812702999,this._dl=4144912697,this._el=4290775857,this._fl=1750603025,this._gl=1694076839,this._hl=3204075428,this},l.prototype._hash=function(){var e=o.allocUnsafe(48);function t(t,r,n){e.writeInt32BE(t,n),e.writeInt32BE(r,n+4)}return t(this._ah,this._al,0),t(this._bh,this._bl,8),t(this._ch,this._cl,16),t(this._dh,this._dl,24),t(this._eh,this._el,32),t(this._fh,this._fl,40),e},t.exports=l},{\"./hash\":497,\"./sha512\":504,inherits:440,\"safe-buffer\":494}],504:[function(e,t,r){\"use strict\";var n=e(\"inherits\"),i=e(\"./hash\"),s=e(\"safe-buffer\").Buffer,o=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],a=new Array(160);function l(){this.init(),this._w=a,i.call(this,128,112)}function c(e,t,r){return r^e&(t^r)}function u(e,t,r){return e&t|r&(e|t)}function h(e,t){return(e>>>28|t<<4)^(t>>>2|e<<30)^(t>>>7|e<<25)}function f(e,t){return(e>>>14|t<<18)^(e>>>18|t<<14)^(t>>>9|e<<23)}function d(e,t){return(e>>>1|t<<31)^(e>>>8|t<<24)^e>>>7}function p(e,t){return(e>>>1|t<<31)^(e>>>8|t<<24)^(e>>>7|t<<25)}function m(e,t){return(e>>>19|t<<13)^(t>>>29|e<<3)^e>>>6}function b(e,t){return(e>>>19|t<<13)^(t>>>29|e<<3)^(e>>>6|t<<26)}function g(e,t){return e>>>0<t>>>0?1:0}n(l,i),l.prototype.init=function(){return this._ah=1779033703,this._bh=3144134277,this._ch=1013904242,this._dh=2773480762,this._eh=1359893119,this._fh=2600822924,this._gh=528734635,this._hh=1541459225,this._al=4089235720,this._bl=2227873595,this._cl=4271175723,this._dl=1595750129,this._el=2917565137,this._fl=725511199,this._gl=4215389547,this._hl=327033209,this},l.prototype._update=function(e){for(var t=this._w,r=0|this._ah,n=0|this._bh,i=0|this._ch,s=0|this._dh,a=0|this._eh,l=0|this._fh,y=0|this._gh,v=0|this._hh,w=0|this._al,_=0|this._bl,x=0|this._cl,k=0|this._dl,S=0|this._el,M=0|this._fl,C=0|this._gl,T=0|this._hl,E=0;E<32;E+=2)t[E]=e.readInt32BE(4*E),t[E+1]=e.readInt32BE(4*E+4);for(;E<160;E+=2){var A=t[E-30],R=t[E-30+1],O=d(A,R),j=p(R,A),I=m(A=t[E-4],R=t[E-4+1]),N=b(R,A),P=t[E-14],B=t[E-14+1],D=t[E-32],F=t[E-32+1],L=j+B|0,z=O+P+g(L,j)|0;z=(z=z+I+g(L=L+N|0,N)|0)+D+g(L=L+F|0,F)|0,t[E]=z,t[E+1]=L}for(var U=0;U<160;U+=2){z=t[U],L=t[U+1];var $=u(r,n,i),H=u(w,_,x),V=h(r,w),q=h(w,r),W=f(a,S),X=f(S,a),K=o[U],Y=o[U+1],Z=c(a,l,y),G=c(S,M,C),J=T+X|0,Q=v+W+g(J,T)|0;Q=(Q=(Q=Q+Z+g(J=J+G|0,G)|0)+K+g(J=J+Y|0,Y)|0)+z+g(J=J+L|0,L)|0;var ee=q+H|0,te=V+$+g(ee,q)|0;v=y,T=C,y=l,C=M,l=a,M=S,a=s+Q+g(S=k+J|0,k)|0,s=i,k=x,i=n,x=_,n=r,_=w,r=Q+te+g(w=J+ee|0,J)|0}this._al=this._al+w|0,this._bl=this._bl+_|0,this._cl=this._cl+x|0,this._dl=this._dl+k|0,this._el=this._el+S|0,this._fl=this._fl+M|0,this._gl=this._gl+C|0,this._hl=this._hl+T|0,this._ah=this._ah+r+g(this._al,w)|0,this._bh=this._bh+n+g(this._bl,_)|0,this._ch=this._ch+i+g(this._cl,x)|0,this._dh=this._dh+s+g(this._dl,k)|0,this._eh=this._eh+a+g(this._el,S)|0,this._fh=this._fh+l+g(this._fl,M)|0,this._gh=this._gh+y+g(this._gl,C)|0,this._hh=this._hh+v+g(this._hl,T)|0},l.prototype._hash=function(){var e=s.allocUnsafe(64);function t(t,r,n){e.writeInt32BE(t,n),e.writeInt32BE(r,n+4)}return t(this._ah,this._al,0),t(this._bh,this._bl,8),t(this._ch,this._cl,16),t(this._dh,this._dl,24),t(this._eh,this._el,32),t(this._fh,this._fl,40),t(this._gh,this._gl,48),t(this._hh,this._hl,56),e},t.exports=l},{\"./hash\":497,inherits:440,\"safe-buffer\":494}],505:[function(e,t,r){\"use strict\";t.exports=i;var n=e(\"events\").EventEmitter;function i(){n.call(this)}e(\"inherits\")(i,n),i.Readable=e(\"readable-stream/readable.js\"),i.Writable=e(\"readable-stream/writable.js\"),i.Duplex=e(\"readable-stream/duplex.js\"),i.Transform=e(\"readable-stream/transform.js\"),i.PassThrough=e(\"readable-stream/passthrough.js\"),i.Stream=i,i.prototype.pipe=function(e,t){var r=this;function i(t){e.writable&&!1===e.write(t)&&r.pause&&r.pause()}function s(){r.readable&&r.resume&&r.resume()}r.on(\"data\",i),e.on(\"drain\",s),e._isStdio||t&&!1===t.end||(r.on(\"end\",a),r.on(\"close\",l));var o=!1;function a(){o||(o=!0,e.end())}function l(){o||(o=!0,\"function\"==typeof e.destroy&&e.destroy())}function c(e){if(u(),0===n.listenerCount(this,\"error\"))throw e}function u(){r.removeListener(\"data\",i),e.removeListener(\"drain\",s),r.removeListener(\"end\",a),r.removeListener(\"close\",l),r.removeListener(\"error\",c),e.removeListener(\"error\",c),r.removeListener(\"end\",u),r.removeListener(\"close\",u),e.removeListener(\"close\",u)}return r.on(\"error\",c),e.on(\"error\",c),r.on(\"end\",u),r.on(\"close\",u),e.on(\"close\",u),e.emit(\"pipe\",r),e}},{events:422,inherits:440,\"readable-stream/duplex.js\":507,\"readable-stream/passthrough.js\":516,\"readable-stream/readable.js\":517,\"readable-stream/transform.js\":518,\"readable-stream/writable.js\":519}],506:[function(e,t,r){\"use strict\";var n={}.toString;t.exports=Array.isArray||function(e){return\"[object Array]\"==n.call(e)}},{}],507:[function(e,t,r){\"use strict\";t.exports=e(\"./lib/_stream_duplex.js\")},{\"./lib/_stream_duplex.js\":508}],508:[function(e,t,r){\"use strict\";var n=e(\"process-nextick-args\"),i=Object.keys||function(e){var t=[];for(var r in e)t.push(r);return t};t.exports=h;var s=Object.create(e(\"core-util-is\"));s.inherits=e(\"inherits\");var o=e(\"./_stream_readable\"),a=e(\"./_stream_writable\");s.inherits(h,o);for(var l=i(a.prototype),c=0;c<l.length;c++){var u=l[c];h.prototype[u]||(h.prototype[u]=a.prototype[u])}function h(e){if(!(this instanceof h))return new h(e);o.call(this,e),a.call(this,e),e&&!1===e.readable&&(this.readable=!1),e&&!1===e.writable&&(this.writable=!1),this.allowHalfOpen=!0,e&&!1===e.allowHalfOpen&&(this.allowHalfOpen=!1),this.once(\"end\",f)}function f(){this.allowHalfOpen||this._writableState.ended||n.nextTick(d,this)}function d(e){e.end()}Object.defineProperty(h.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),Object.defineProperty(h.prototype,\"destroyed\",{get:function(){return void 0!==this._readableState&&void 0!==this._writableState&&(this._readableState.destroyed&&this._writableState.destroyed)},set:function(e){void 0!==this._readableState&&void 0!==this._writableState&&(this._readableState.destroyed=e,this._writableState.destroyed=e)}}),h.prototype._destroy=function(e,t){this.push(null),this.end(),n.nextTick(t,e)}},{\"./_stream_readable\":510,\"./_stream_writable\":512,\"core-util-is\":383,inherits:440,\"process-nextick-args\":466}],509:[function(e,t,r){\"use strict\";t.exports=s;var n=e(\"./_stream_transform\"),i=Object.create(e(\"core-util-is\"));function s(e){if(!(this instanceof s))return new s(e);n.call(this,e)}i.inherits=e(\"inherits\"),i.inherits(s,n),s.prototype._transform=function(e,t,r){r(null,e)}},{\"./_stream_transform\":511,\"core-util-is\":383,inherits:440}],510:[function(e,t,r){(function(r,n){(function(){\"use strict\";var i=e(\"process-nextick-args\");t.exports=v;var s,o=e(\"isarray\");v.ReadableState=y;e(\"events\").EventEmitter;var a=function(e,t){return e.listeners(t).length},l=e(\"./internal/streams/stream\"),c=e(\"safe-buffer\").Buffer,u=(void 0!==n?n:\"undefined\"!=typeof window?window:\"undefined\"!=typeof self?self:{}).Uint8Array||function(){};var h=Object.create(e(\"core-util-is\"));h.inherits=e(\"inherits\");var f=e(\"util\"),d=void 0;d=f&&f.debuglog?f.debuglog(\"stream\"):function(){};var p,m=e(\"./internal/streams/BufferList\"),b=e(\"./internal/streams/destroy\");h.inherits(v,l);var g=[\"error\",\"close\",\"destroy\",\"pause\",\"resume\"];function y(t,r){t=t||{};var n=r instanceof(s=s||e(\"./_stream_duplex\"));this.objectMode=!!t.objectMode,n&&(this.objectMode=this.objectMode||!!t.readableObjectMode);var i=t.highWaterMark,o=t.readableHighWaterMark,a=this.objectMode?16:16384;this.highWaterMark=i||0===i?i:n&&(o||0===o)?o:a,this.highWaterMark=Math.floor(this.highWaterMark),this.buffer=new m,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.destroyed=!1,this.defaultEncoding=t.defaultEncoding||\"utf8\",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(p||(p=e(\"string_decoder/\").StringDecoder),this.decoder=new p(t.encoding),this.encoding=t.encoding)}function v(t){if(s=s||e(\"./_stream_duplex\"),!(this instanceof v))return new v(t);this._readableState=new y(t,this),this.readable=!0,t&&(\"function\"==typeof t.read&&(this._read=t.read),\"function\"==typeof t.destroy&&(this._destroy=t.destroy)),l.call(this)}function w(e,t,r,n,i){var s,o=e._readableState;null===t?(o.reading=!1,function(e,t){if(t.ended)return;if(t.decoder){var r=t.decoder.end();r&&r.length&&(t.buffer.push(r),t.length+=t.objectMode?1:r.length)}t.ended=!0,k(e)}(e,o)):(i||(s=function(e,t){var r;n=t,c.isBuffer(n)||n instanceof u||\"string\"==typeof t||void 0===t||e.objectMode||(r=new TypeError(\"Invalid non-string/buffer chunk\"));var n;return r}(o,t)),s?e.emit(\"error\",s):o.objectMode||t&&t.length>0?(\"string\"==typeof t||o.objectMode||Object.getPrototypeOf(t)===c.prototype||(t=function(e){return c.from(e)}(t)),n?o.endEmitted?e.emit(\"error\",new Error(\"stream.unshift() after end event\")):_(e,o,t,!0):o.ended?e.emit(\"error\",new Error(\"stream.push() after EOF\")):(o.reading=!1,o.decoder&&!r?(t=o.decoder.write(t),o.objectMode||0!==t.length?_(e,o,t,!1):M(e,o)):_(e,o,t,!1))):n||(o.reading=!1));return function(e){return!e.ended&&(e.needReadable||e.length<e.highWaterMark||0===e.length)}(o)}function _(e,t,r,n){t.flowing&&0===t.length&&!t.sync?(e.emit(\"data\",r),e.read(0)):(t.length+=t.objectMode?1:r.length,n?t.buffer.unshift(r):t.buffer.push(r),t.needReadable&&k(e)),M(e,t)}Object.defineProperty(v.prototype,\"destroyed\",{get:function(){return void 0!==this._readableState&&this._readableState.destroyed},set:function(e){this._readableState&&(this._readableState.destroyed=e)}}),v.prototype.destroy=b.destroy,v.prototype._undestroy=b.undestroy,v.prototype._destroy=function(e,t){this.push(null),t(e)},v.prototype.push=function(e,t){var r,n=this._readableState;return n.objectMode?r=!0:\"string\"==typeof e&&((t=t||n.defaultEncoding)!==n.encoding&&(e=c.from(e,t),t=\"\"),r=!0),w(this,e,t,!1,r)},v.prototype.unshift=function(e){return w(this,e,null,!0,!1)},v.prototype.isPaused=function(){return!1===this._readableState.flowing},v.prototype.setEncoding=function(t){return p||(p=e(\"string_decoder/\").StringDecoder),this._readableState.decoder=new p(t),this._readableState.encoding=t,this};function x(e,t){return e<=0||0===t.length&&t.ended?0:t.objectMode?1:e!=e?t.flowing&&t.length?t.buffer.head.data.length:t.length:(e>t.highWaterMark&&(t.highWaterMark=function(e){return e>=8388608?e=8388608:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}(e)),e<=t.length?e:t.ended?t.length:(t.needReadable=!0,0))}function k(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(d(\"emitReadable\",t.flowing),t.emittedReadable=!0,t.sync?i.nextTick(S,e):S(e))}function S(e){d(\"emit readable\"),e.emit(\"readable\"),A(e)}function M(e,t){t.readingMore||(t.readingMore=!0,i.nextTick(C,e,t))}function C(e,t){for(var r=t.length;!t.reading&&!t.flowing&&!t.ended&&t.length<t.highWaterMark&&(d(\"maybeReadMore read 0\"),e.read(0),r!==t.length);)r=t.length;t.readingMore=!1}function T(e){d(\"readable nexttick read 0\"),e.read(0)}function E(e,t){t.reading||(d(\"resume read 0\"),e.read(0)),t.resumeScheduled=!1,t.awaitDrain=0,e.emit(\"resume\"),A(e),t.flowing&&!t.reading&&e.read(0)}function A(e){var t=e._readableState;for(d(\"flow\",t.flowing);t.flowing&&null!==e.read(););}function R(e,t){return 0===t.length?null:(t.objectMode?r=t.buffer.shift():!e||e>=t.length?(r=t.decoder?t.buffer.join(\"\"):1===t.buffer.length?t.buffer.head.data:t.buffer.concat(t.length),t.buffer.clear()):r=function(e,t,r){var n;e<t.head.data.length?(n=t.head.data.slice(0,e),t.head.data=t.head.data.slice(e)):n=e===t.head.data.length?t.shift():r?function(e,t){var r=t.head,n=1,i=r.data;e-=i.length;for(;r=r.next;){var s=r.data,o=e>s.length?s.length:e;if(o===s.length?i+=s:i+=s.slice(0,e),0===(e-=o)){o===s.length?(++n,r.next?t.head=r.next:t.head=t.tail=null):(t.head=r,r.data=s.slice(o));break}++n}return t.length-=n,i}(e,t):function(e,t){var r=c.allocUnsafe(e),n=t.head,i=1;n.data.copy(r),e-=n.data.length;for(;n=n.next;){var s=n.data,o=e>s.length?s.length:e;if(s.copy(r,r.length-e,0,o),0===(e-=o)){o===s.length?(++i,n.next?t.head=n.next:t.head=t.tail=null):(t.head=n,n.data=s.slice(o));break}++i}return t.length-=i,r}(e,t);return n}(e,t.buffer,t.decoder),r);var r}function O(e){var t=e._readableState;if(t.length>0)throw new Error('\"endReadable()\" called on non-empty stream');t.endEmitted||(t.ended=!0,i.nextTick(j,t,e))}function j(e,t){e.endEmitted||0!==e.length||(e.endEmitted=!0,t.readable=!1,t.emit(\"end\"))}function I(e,t){for(var r=0,n=e.length;r<n;r++)if(e[r]===t)return r;return-1}v.prototype.read=function(e){d(\"read\",e),e=parseInt(e,10);var t=this._readableState,r=e;if(0!==e&&(t.emittedReadable=!1),0===e&&t.needReadable&&(t.length>=t.highWaterMark||t.ended))return d(\"read: emitReadable\",t.length,t.ended),0===t.length&&t.ended?O(this):k(this),null;if(0===(e=x(e,t))&&t.ended)return 0===t.length&&O(this),null;var n,i=t.needReadable;return d(\"need readable\",i),(0===t.length||t.length-e<t.highWaterMark)&&d(\"length less than watermark\",i=!0),t.ended||t.reading?d(\"reading or ended\",i=!1):i&&(d(\"do read\"),t.reading=!0,t.sync=!0,0===t.length&&(t.needReadable=!0),this._read(t.highWaterMark),t.sync=!1,t.reading||(e=x(r,t))),null===(n=e>0?R(e,t):null)?(t.needReadable=!0,e=0):t.length-=e,0===t.length&&(t.ended||(t.needReadable=!0),r!==e&&t.ended&&O(this)),null!==n&&this.emit(\"data\",n),n},v.prototype._read=function(e){this.emit(\"error\",new Error(\"_read() is not implemented\"))},v.prototype.pipe=function(e,t){var n=this,s=this._readableState;switch(s.pipesCount){case 0:s.pipes=e;break;case 1:s.pipes=[s.pipes,e];break;default:s.pipes.push(e)}s.pipesCount+=1,d(\"pipe count=%d opts=%j\",s.pipesCount,t);var l=(!t||!1!==t.end)&&e!==r.stdout&&e!==r.stderr?u:v;function c(t,r){d(\"onunpipe\"),t===n&&r&&!1===r.hasUnpiped&&(r.hasUnpiped=!0,d(\"cleanup\"),e.removeListener(\"close\",g),e.removeListener(\"finish\",y),e.removeListener(\"drain\",h),e.removeListener(\"error\",b),e.removeListener(\"unpipe\",c),n.removeListener(\"end\",u),n.removeListener(\"end\",v),n.removeListener(\"data\",m),f=!0,!s.awaitDrain||e._writableState&&!e._writableState.needDrain||h())}function u(){d(\"onend\"),e.end()}s.endEmitted?i.nextTick(l):n.once(\"end\",l),e.on(\"unpipe\",c);var h=function(e){return function(){var t=e._readableState;d(\"pipeOnDrain\",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,0===t.awaitDrain&&a(e,\"data\")&&(t.flowing=!0,A(e))}}(n);e.on(\"drain\",h);var f=!1;var p=!1;function m(t){d(\"ondata\"),p=!1,!1!==e.write(t)||p||((1===s.pipesCount&&s.pipes===e||s.pipesCount>1&&-1!==I(s.pipes,e))&&!f&&(d(\"false write response, pause\",s.awaitDrain),s.awaitDrain++,p=!0),n.pause())}function b(t){d(\"onerror\",t),v(),e.removeListener(\"error\",b),0===a(e,\"error\")&&e.emit(\"error\",t)}function g(){e.removeListener(\"finish\",y),v()}function y(){d(\"onfinish\"),e.removeListener(\"close\",g),v()}function v(){d(\"unpipe\"),n.unpipe(e)}return n.on(\"data\",m),function(e,t,r){if(\"function\"==typeof e.prependListener)return e.prependListener(t,r);e._events&&e._events[t]?o(e._events[t])?e._events[t].unshift(r):e._events[t]=[r,e._events[t]]:e.on(t,r)}(e,\"error\",b),e.once(\"close\",g),e.once(\"finish\",y),e.emit(\"pipe\",n),s.flowing||(d(\"pipe resume\"),n.resume()),e},v.prototype.unpipe=function(e){var t=this._readableState,r={hasUnpiped:!1};if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes||(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit(\"unpipe\",this,r)),this;if(!e){var n=t.pipes,i=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var s=0;s<i;s++)n[s].emit(\"unpipe\",this,{hasUnpiped:!1});return this}var o=I(t.pipes,e);return-1===o||(t.pipes.splice(o,1),t.pipesCount-=1,1===t.pipesCount&&(t.pipes=t.pipes[0]),e.emit(\"unpipe\",this,r)),this},v.prototype.on=function(e,t){var r=l.prototype.on.call(this,e,t);if(\"data\"===e)!1!==this._readableState.flowing&&this.resume();else if(\"readable\"===e){var n=this._readableState;n.endEmitted||n.readableListening||(n.readableListening=n.needReadable=!0,n.emittedReadable=!1,n.reading?n.length&&k(this):i.nextTick(T,this))}return r},v.prototype.addListener=v.prototype.on,v.prototype.resume=function(){var e=this._readableState;return e.flowing||(d(\"resume\"),e.flowing=!0,function(e,t){t.resumeScheduled||(t.resumeScheduled=!0,i.nextTick(E,e,t))}(this,e)),this},v.prototype.pause=function(){return d(\"call pause flowing=%j\",this._readableState.flowing),!1!==this._readableState.flowing&&(d(\"pause\"),this._readableState.flowing=!1,this.emit(\"pause\")),this},v.prototype.wrap=function(e){var t=this,r=this._readableState,n=!1;for(var i in e.on(\"end\",(function(){if(d(\"wrapped end\"),r.decoder&&!r.ended){var e=r.decoder.end();e&&e.length&&t.push(e)}t.push(null)})),e.on(\"data\",(function(i){(d(\"wrapped data\"),r.decoder&&(i=r.decoder.write(i)),r.objectMode&&null==i)||(r.objectMode||i&&i.length)&&(t.push(i)||(n=!0,e.pause()))})),e)void 0===this[i]&&\"function\"==typeof e[i]&&(this[i]=function(t){return function(){return e[t].apply(e,arguments)}}(i));for(var s=0;s<g.length;s++)e.on(g[s],this.emit.bind(this,g[s]));return this._read=function(t){d(\"wrapped _read\",t),n&&(n=!1,e.resume())},this},Object.defineProperty(v.prototype,\"readableHighWaterMark\",{enumerable:!1,get:function(){return this._readableState.highWaterMark}}),v._fromList=R}).call(this)}).call(this,e(\"_process\"),\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{\"./_stream_duplex\":508,\"./internal/streams/BufferList\":513,\"./internal/streams/destroy\":514,\"./internal/streams/stream\":515,_process:467,\"core-util-is\":383,events:422,inherits:440,isarray:506,\"process-nextick-args\":466,\"safe-buffer\":520,\"string_decoder/\":521,util:188}],511:[function(e,t,r){\"use strict\";t.exports=o;var n=e(\"./_stream_duplex\"),i=Object.create(e(\"core-util-is\"));function s(e,t){var r=this._transformState;r.transforming=!1;var n=r.writecb;if(!n)return this.emit(\"error\",new Error(\"write callback called multiple times\"));r.writechunk=null,r.writecb=null,null!=t&&this.push(t),n(e);var i=this._readableState;i.reading=!1,(i.needReadable||i.length<i.highWaterMark)&&this._read(i.highWaterMark)}function o(e){if(!(this instanceof o))return new o(e);n.call(this,e),this._transformState={afterTransform:s.bind(this),needTransform:!1,transforming:!1,writecb:null,writechunk:null,writeencoding:null},this._readableState.needReadable=!0,this._readableState.sync=!1,e&&(\"function\"==typeof e.transform&&(this._transform=e.transform),\"function\"==typeof e.flush&&(this._flush=e.flush)),this.on(\"prefinish\",a)}function a(){var e=this;\"function\"==typeof this._flush?this._flush((function(t,r){l(e,t,r)})):l(this,null,null)}function l(e,t,r){if(t)return e.emit(\"error\",t);if(null!=r&&e.push(r),e._writableState.length)throw new Error(\"Calling transform done when ws.length != 0\");if(e._transformState.transforming)throw new Error(\"Calling transform done when still transforming\");return e.push(null)}i.inherits=e(\"inherits\"),i.inherits(o,n),o.prototype.push=function(e,t){return this._transformState.needTransform=!1,n.prototype.push.call(this,e,t)},o.prototype._transform=function(e,t,r){throw new Error(\"_transform() is not implemented\")},o.prototype._write=function(e,t,r){var n=this._transformState;if(n.writecb=r,n.writechunk=e,n.writeencoding=t,!n.transforming){var i=this._readableState;(n.needTransform||i.needReadable||i.length<i.highWaterMark)&&this._read(i.highWaterMark)}},o.prototype._read=function(e){var t=this._transformState;null!==t.writechunk&&t.writecb&&!t.transforming?(t.transforming=!0,this._transform(t.writechunk,t.writeencoding,t.afterTransform)):t.needTransform=!0},o.prototype._destroy=function(e,t){var r=this;n.prototype._destroy.call(this,e,(function(e){t(e),r.emit(\"close\")}))}},{\"./_stream_duplex\":508,\"core-util-is\":383,inherits:440}],512:[function(e,t,r){(function(r,n,i){(function(){\"use strict\";var s=e(\"process-nextick-args\");function o(e){var t=this;this.next=null,this.entry=null,this.finish=function(){!function(e,t,r){var n=e.entry;e.entry=null;for(;n;){var i=n.callback;t.pendingcb--,i(r),n=n.next}t.corkedRequestsFree.next=e}(t,e)}}t.exports=y;var a,l=!r.browser&&[\"v0.10\",\"v0.9.\"].indexOf(r.version.slice(0,5))>-1?i:s.nextTick;y.WritableState=g;var c=Object.create(e(\"core-util-is\"));c.inherits=e(\"inherits\");var u={deprecate:e(\"util-deprecate\")},h=e(\"./internal/streams/stream\"),f=e(\"safe-buffer\").Buffer,d=(void 0!==n?n:\"undefined\"!=typeof window?window:\"undefined\"!=typeof self?self:{}).Uint8Array||function(){};var p,m=e(\"./internal/streams/destroy\");function b(){}function g(t,r){a=a||e(\"./_stream_duplex\"),t=t||{};var n=r instanceof a;this.objectMode=!!t.objectMode,n&&(this.objectMode=this.objectMode||!!t.writableObjectMode);var i=t.highWaterMark,c=t.writableHighWaterMark,u=this.objectMode?16:16384;this.highWaterMark=i||0===i?i:n&&(c||0===c)?c:u,this.highWaterMark=Math.floor(this.highWaterMark),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var h=!1===t.decodeStrings;this.decodeStrings=!h,this.defaultEncoding=t.defaultEncoding||\"utf8\",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(e){!function(e,t){var r=e._writableState,n=r.sync,i=r.writecb;if(function(e){e.writing=!1,e.writecb=null,e.length-=e.writelen,e.writelen=0}(r),t)!function(e,t,r,n,i){--t.pendingcb,r?(s.nextTick(i,n),s.nextTick(S,e,t),e._writableState.errorEmitted=!0,e.emit(\"error\",n)):(i(n),e._writableState.errorEmitted=!0,e.emit(\"error\",n),S(e,t))}(e,r,n,t,i);else{var o=x(r);o||r.corked||r.bufferProcessing||!r.bufferedRequest||_(e,r),n?l(w,e,r,o,i):w(e,r,o,i)}}(r,e)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new o(this)}function y(t){if(a=a||e(\"./_stream_duplex\"),!(p.call(y,this)||this instanceof a))return new y(t);this._writableState=new g(t,this),this.writable=!0,t&&(\"function\"==typeof t.write&&(this._write=t.write),\"function\"==typeof t.writev&&(this._writev=t.writev),\"function\"==typeof t.destroy&&(this._destroy=t.destroy),\"function\"==typeof t.final&&(this._final=t.final)),h.call(this)}function v(e,t,r,n,i,s,o){t.writelen=n,t.writecb=o,t.writing=!0,t.sync=!0,r?e._writev(i,t.onwrite):e._write(i,s,t.onwrite),t.sync=!1}function w(e,t,r,n){r||function(e,t){0===t.length&&t.needDrain&&(t.needDrain=!1,e.emit(\"drain\"))}(e,t),t.pendingcb--,n(),S(e,t)}function _(e,t){t.bufferProcessing=!0;var r=t.bufferedRequest;if(e._writev&&r&&r.next){var n=t.bufferedRequestCount,i=new Array(n),s=t.corkedRequestsFree;s.entry=r;for(var a=0,l=!0;r;)i[a]=r,r.isBuf||(l=!1),r=r.next,a+=1;i.allBuffers=l,v(e,t,!0,t.length,i,\"\",s.finish),t.pendingcb++,t.lastBufferedRequest=null,s.next?(t.corkedRequestsFree=s.next,s.next=null):t.corkedRequestsFree=new o(t),t.bufferedRequestCount=0}else{for(;r;){var c=r.chunk,u=r.encoding,h=r.callback;if(v(e,t,!1,t.objectMode?1:c.length,c,u,h),r=r.next,t.bufferedRequestCount--,t.writing)break}null===r&&(t.lastBufferedRequest=null)}t.bufferedRequest=r,t.bufferProcessing=!1}function x(e){return e.ending&&0===e.length&&null===e.bufferedRequest&&!e.finished&&!e.writing}function k(e,t){e._final((function(r){t.pendingcb--,r&&e.emit(\"error\",r),t.prefinished=!0,e.emit(\"prefinish\"),S(e,t)}))}function S(e,t){var r=x(t);return r&&(!function(e,t){t.prefinished||t.finalCalled||(\"function\"==typeof e._final?(t.pendingcb++,t.finalCalled=!0,s.nextTick(k,e,t)):(t.prefinished=!0,e.emit(\"prefinish\")))}(e,t),0===t.pendingcb&&(t.finished=!0,e.emit(\"finish\"))),r}c.inherits(y,h),g.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t},function(){try{Object.defineProperty(g.prototype,\"buffer\",{get:u.deprecate((function(){return this.getBuffer()}),\"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.\",\"DEP0003\")})}catch(e){}}(),\"function\"==typeof Symbol&&Symbol.hasInstance&&\"function\"==typeof Function.prototype[Symbol.hasInstance]?(p=Function.prototype[Symbol.hasInstance],Object.defineProperty(y,Symbol.hasInstance,{value:function(e){return!!p.call(this,e)||this===y&&(e&&e._writableState instanceof g)}})):p=function(e){return e instanceof this},y.prototype.pipe=function(){this.emit(\"error\",new Error(\"Cannot pipe, not readable\"))},y.prototype.write=function(e,t,r){var n,i=this._writableState,o=!1,a=!i.objectMode&&(n=e,f.isBuffer(n)||n instanceof d);return a&&!f.isBuffer(e)&&(e=function(e){return f.from(e)}(e)),\"function\"==typeof t&&(r=t,t=null),a?t=\"buffer\":t||(t=i.defaultEncoding),\"function\"!=typeof r&&(r=b),i.ended?function(e,t){var r=new Error(\"write after end\");e.emit(\"error\",r),s.nextTick(t,r)}(this,r):(a||function(e,t,r,n){var i=!0,o=!1;return null===r?o=new TypeError(\"May not write null values to stream\"):\"string\"==typeof r||void 0===r||t.objectMode||(o=new TypeError(\"Invalid non-string/buffer chunk\")),o&&(e.emit(\"error\",o),s.nextTick(n,o),i=!1),i}(this,i,e,r))&&(i.pendingcb++,o=function(e,t,r,n,i,s){if(!r){var o=function(e,t,r){e.objectMode||!1===e.decodeStrings||\"string\"!=typeof t||(t=f.from(t,r));return t}(t,n,i);n!==o&&(r=!0,i=\"buffer\",n=o)}var a=t.objectMode?1:n.length;t.length+=a;var l=t.length<t.highWaterMark;l||(t.needDrain=!0);if(t.writing||t.corked){var c=t.lastBufferedRequest;t.lastBufferedRequest={chunk:n,encoding:i,isBuf:r,callback:s,next:null},c?c.next=t.lastBufferedRequest:t.bufferedRequest=t.lastBufferedRequest,t.bufferedRequestCount+=1}else v(e,t,!1,a,n,i,s);return l}(this,i,a,e,t,r)),o},y.prototype.cork=function(){this._writableState.corked++},y.prototype.uncork=function(){var e=this._writableState;e.corked&&(e.corked--,e.writing||e.corked||e.bufferProcessing||!e.bufferedRequest||_(this,e))},y.prototype.setDefaultEncoding=function(e){if(\"string\"==typeof e&&(e=e.toLowerCase()),!([\"hex\",\"utf8\",\"utf-8\",\"ascii\",\"binary\",\"base64\",\"ucs2\",\"ucs-2\",\"utf16le\",\"utf-16le\",\"raw\"].indexOf((e+\"\").toLowerCase())>-1))throw new TypeError(\"Unknown encoding: \"+e);return this._writableState.defaultEncoding=e,this},Object.defineProperty(y.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),y.prototype._write=function(e,t,r){r(new Error(\"_write() is not implemented\"))},y.prototype._writev=null,y.prototype.end=function(e,t,r){var n=this._writableState;\"function\"==typeof e?(r=e,e=null,t=null):\"function\"==typeof t&&(r=t,t=null),null!=e&&this.write(e,t),n.corked&&(n.corked=1,this.uncork()),n.ending||function(e,t,r){t.ending=!0,S(e,t),r&&(t.finished?s.nextTick(r):e.once(\"finish\",r));t.ended=!0,e.writable=!1}(this,n,r)},Object.defineProperty(y.prototype,\"destroyed\",{get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(e){this._writableState&&(this._writableState.destroyed=e)}}),y.prototype.destroy=m.destroy,y.prototype._undestroy=m.undestroy,y.prototype._destroy=function(e,t){this.end(),t(e)}}).call(this)}).call(this,e(\"_process\"),\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"timers\").setImmediate)},{\"./_stream_duplex\":508,\"./internal/streams/destroy\":514,\"./internal/streams/stream\":515,_process:467,\"core-util-is\":383,inherits:440,\"process-nextick-args\":466,\"safe-buffer\":520,timers:523,\"util-deprecate\":524}],513:[function(e,t,r){\"use strict\";var n=e(\"safe-buffer\").Buffer,i=e(\"util\");t.exports=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,e),this.head=null,this.tail=null,this.length=0}return e.prototype.push=function(e){var t={data:e,next:null};this.length>0?this.tail.next=t:this.head=t,this.tail=t,++this.length},e.prototype.unshift=function(e){var t={data:e,next:this.head};0===this.length&&(this.tail=t),this.head=t,++this.length},e.prototype.shift=function(){if(0!==this.length){var e=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,e}},e.prototype.clear=function(){this.head=this.tail=null,this.length=0},e.prototype.join=function(e){if(0===this.length)return\"\";for(var t=this.head,r=\"\"+t.data;t=t.next;)r+=e+t.data;return r},e.prototype.concat=function(e){if(0===this.length)return n.alloc(0);for(var t,r,i,s=n.allocUnsafe(e>>>0),o=this.head,a=0;o;)t=o.data,r=s,i=a,t.copy(r,i),a+=o.data.length,o=o.next;return s},e}(),i&&i.inspect&&i.inspect.custom&&(t.exports.prototype[i.inspect.custom]=function(){var e=i.inspect({length:this.length});return this.constructor.name+\" \"+e})},{\"safe-buffer\":520,util:188}],514:[function(e,t,r){\"use strict\";var n=e(\"process-nextick-args\");function i(e,t){e.emit(\"error\",t)}t.exports={destroy:function(e,t){var r=this,s=this._readableState&&this._readableState.destroyed,o=this._writableState&&this._writableState.destroyed;return s||o?(t?t(e):e&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,n.nextTick(i,this,e)):n.nextTick(i,this,e)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(e||null,(function(e){!t&&e?r._writableState?r._writableState.errorEmitted||(r._writableState.errorEmitted=!0,n.nextTick(i,r,e)):n.nextTick(i,r,e):t&&t(e)})),this)},undestroy:function(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}}},{\"process-nextick-args\":466}],515:[function(e,t,r){arguments[4][490][0].apply(r,arguments)},{dup:490,events:422}],516:[function(e,t,r){\"use strict\";t.exports=e(\"./readable\").PassThrough},{\"./readable\":517}],517:[function(e,t,r){\"use strict\";(r=t.exports=e(\"./lib/_stream_readable.js\")).Stream=r,r.Readable=r,r.Writable=e(\"./lib/_stream_writable.js\"),r.Duplex=e(\"./lib/_stream_duplex.js\"),r.Transform=e(\"./lib/_stream_transform.js\"),r.PassThrough=e(\"./lib/_stream_passthrough.js\")},{\"./lib/_stream_duplex.js\":508,\"./lib/_stream_passthrough.js\":509,\"./lib/_stream_readable.js\":510,\"./lib/_stream_transform.js\":511,\"./lib/_stream_writable.js\":512}],518:[function(e,t,r){\"use strict\";t.exports=e(\"./readable\").Transform},{\"./readable\":517}],519:[function(e,t,r){\"use strict\";t.exports=e(\"./lib/_stream_writable.js\")},{\"./lib/_stream_writable.js\":512}],520:[function(e,t,r){arguments[4][217][0].apply(r,arguments)},{buffer:220,dup:217}],521:[function(e,t,r){arguments[4][218][0].apply(r,arguments)},{dup:218,\"safe-buffer\":520}],522:[function(e,t,r){arguments[4][218][0].apply(r,arguments)},{dup:218,\"safe-buffer\":494}],523:[function(e,t,r){(function(t,n){(function(){\"use strict\";var i=e(\"process/browser.js\").nextTick,s=Function.prototype.apply,o=Array.prototype.slice,a={},l=0;function c(e,t){this._id=e,this._clearFn=t}r.setTimeout=function(){return new c(s.call(setTimeout,window,arguments),clearTimeout)},r.setInterval=function(){return new c(s.call(setInterval,window,arguments),clearInterval)},r.clearTimeout=r.clearInterval=function(e){e.close()},c.prototype.unref=c.prototype.ref=function(){},c.prototype.close=function(){this._clearFn.call(window,this._id)},r.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},r.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},r._unrefActive=r.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},r.setImmediate=\"function\"==typeof t?t:function(e){var t=l++,n=!(arguments.length<2)&&o.call(arguments,1);return a[t]=!0,i((function(){a[t]&&(n?e.apply(null,n):e.call(null),r.clearImmediate(t))})),t},r.clearImmediate=\"function\"==typeof n?n:function(e){delete a[e]}}).call(this)}).call(this,e(\"timers\").setImmediate,e(\"timers\").clearImmediate)},{\"process/browser.js\":467,timers:523}],524:[function(e,t,r){(function(e){(function(){\"use strict\";function r(t){try{if(!e.localStorage)return!1}catch(e){return!1}var r=e.localStorage[t];return null!=r&&\"true\"===String(r).toLowerCase()}t.exports=function(e,t){if(r(\"noDeprecation\"))return e;var n=!1;return function(){if(!n){if(r(\"throwDeprecation\"))throw new Error(t);r(\"traceDeprecation\")?console.trace(t):console.warn(t),n=!0}return e.apply(this,arguments)}}}).call(this)}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}],525:[function(e,t,r){\"use strict\";\"function\"==typeof Object.create?t.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:t.exports=function(e,t){e.super_=t;var r=function(){};r.prototype=t.prototype,e.prototype=new r,e.prototype.constructor=e}},{}],526:[function(e,t,r){\"use strict\";t.exports=function(e){return e&&\"object\"==typeof e&&\"function\"==typeof e.copy&&\"function\"==typeof e.fill&&\"function\"==typeof e.readUInt8}},{}],527:[function(e,t,r){(function(t,n){(function(){\"use strict\";var i=/%[sdj%]/g;r.format=function(e){if(!g(e)){for(var t=[],r=0;r<arguments.length;r++)t.push(a(arguments[r]));return t.join(\" \")}r=1;for(var n=arguments,s=n.length,o=String(e).replace(i,(function(e){if(\"%%\"===e)return\"%\";if(r>=s)return e;switch(e){case\"%s\":return String(n[r++]);case\"%d\":return Number(n[r++]);case\"%j\":try{return JSON.stringify(n[r++])}catch(e){return\"[Circular]\"}default:return e}})),l=n[r];r<s;l=n[++r])m(l)||!w(l)?o+=\" \"+l:o+=\" \"+a(l);return o},r.deprecate=function(e,i){if(y(n.process))return function(){return r.deprecate(e,i).apply(this,arguments)};if(!0===t.noDeprecation)return e;var s=!1;return function(){if(!s){if(t.throwDeprecation)throw new Error(i);t.traceDeprecation?console.trace(i):console.error(i),s=!0}return e.apply(this,arguments)}};var s,o={};function a(e,t){var n={seen:[],stylize:c};return arguments.length>=3&&(n.depth=arguments[2]),arguments.length>=4&&(n.colors=arguments[3]),p(t)?n.showHidden=t:t&&r._extend(n,t),y(n.showHidden)&&(n.showHidden=!1),y(n.depth)&&(n.depth=2),y(n.colors)&&(n.colors=!1),y(n.customInspect)&&(n.customInspect=!0),n.colors&&(n.stylize=l),u(n,e,n.depth)}function l(e,t){var r=a.styles[t];return r?\"\\x1b[\"+a.colors[r][0]+\"m\"+e+\"\\x1b[\"+a.colors[r][1]+\"m\":e}function c(e,t){return e}function u(e,t,n){if(e.customInspect&&t&&k(t.inspect)&&t.inspect!==r.inspect&&(!t.constructor||t.constructor.prototype!==t)){var i=t.inspect(n,e);return g(i)||(i=u(e,i,n)),i}var s=function(e,t){if(y(t))return e.stylize(\"undefined\",\"undefined\");if(g(t)){var r=\"'\"+JSON.stringify(t).replace(/^\"|\"$/g,\"\").replace(/'/g,\"\\\\'\").replace(/\\\\\"/g,'\"')+\"'\";return e.stylize(r,\"string\")}if(b(t))return e.stylize(\"\"+t,\"number\");if(p(t))return e.stylize(\"\"+t,\"boolean\");if(m(t))return e.stylize(\"null\",\"null\")}(e,t);if(s)return s;var o=Object.keys(t),a=function(e){var t={};return e.forEach((function(e,r){t[e]=!0})),t}(o);if(e.showHidden&&(o=Object.getOwnPropertyNames(t)),x(t)&&(o.indexOf(\"message\")>=0||o.indexOf(\"description\")>=0))return h(t);if(0===o.length){if(k(t)){var l=t.name?\": \"+t.name:\"\";return e.stylize(\"[Function\"+l+\"]\",\"special\")}if(v(t))return e.stylize(RegExp.prototype.toString.call(t),\"regexp\");if(_(t))return e.stylize(Date.prototype.toString.call(t),\"date\");if(x(t))return h(t)}var c,w=\"\",S=!1,M=[\"{\",\"}\"];(d(t)&&(S=!0,M=[\"[\",\"]\"]),k(t))&&(w=\" [Function\"+(t.name?\": \"+t.name:\"\")+\"]\");return v(t)&&(w=\" \"+RegExp.prototype.toString.call(t)),_(t)&&(w=\" \"+Date.prototype.toUTCString.call(t)),x(t)&&(w=\" \"+h(t)),0!==o.length||S&&0!=t.length?n<0?v(t)?e.stylize(RegExp.prototype.toString.call(t),\"regexp\"):e.stylize(\"[Object]\",\"special\"):(e.seen.push(t),c=S?function(e,t,r,n,i){for(var s=[],o=0,a=t.length;o<a;++o)E(t,String(o))?s.push(f(e,t,r,n,String(o),!0)):s.push(\"\");return i.forEach((function(i){i.match(/^\\d+$/)||s.push(f(e,t,r,n,i,!0))})),s}(e,t,n,a,o):o.map((function(r){return f(e,t,n,a,r,S)})),e.seen.pop(),function(e,t,r){if(e.reduce((function(e,t){return t.indexOf(\"\\n\")>=0&&0,e+t.replace(/\\u001b\\[\\d\\d?m/g,\"\").length+1}),0)>60)return r[0]+(\"\"===t?\"\":t+\"\\n \")+\" \"+e.join(\",\\n  \")+\" \"+r[1];return r[0]+t+\" \"+e.join(\", \")+\" \"+r[1]}(c,w,M)):M[0]+w+M[1]}function h(e){return\"[\"+Error.prototype.toString.call(e)+\"]\"}function f(e,t,r,n,i,s){var o,a,l;if((l=Object.getOwnPropertyDescriptor(t,i)||{value:t[i]}).get?a=l.set?e.stylize(\"[Getter/Setter]\",\"special\"):e.stylize(\"[Getter]\",\"special\"):l.set&&(a=e.stylize(\"[Setter]\",\"special\")),E(n,i)||(o=\"[\"+i+\"]\"),a||(e.seen.indexOf(l.value)<0?(a=m(r)?u(e,l.value,null):u(e,l.value,r-1)).indexOf(\"\\n\")>-1&&(a=s?a.split(\"\\n\").map((function(e){return\"  \"+e})).join(\"\\n\").substr(2):\"\\n\"+a.split(\"\\n\").map((function(e){return\"   \"+e})).join(\"\\n\")):a=e.stylize(\"[Circular]\",\"special\")),y(o)){if(s&&i.match(/^\\d+$/))return a;(o=JSON.stringify(\"\"+i)).match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)?(o=o.substr(1,o.length-2),o=e.stylize(o,\"name\")):(o=o.replace(/'/g,\"\\\\'\").replace(/\\\\\"/g,'\"').replace(/(^\"|\"$)/g,\"'\"),o=e.stylize(o,\"string\"))}return o+\": \"+a}function d(e){return Array.isArray(e)}function p(e){return\"boolean\"==typeof e}function m(e){return null===e}function b(e){return\"number\"==typeof e}function g(e){return\"string\"==typeof e}function y(e){return void 0===e}function v(e){return w(e)&&\"[object RegExp]\"===S(e)}function w(e){return\"object\"==typeof e&&null!==e}function _(e){return w(e)&&\"[object Date]\"===S(e)}function x(e){return w(e)&&(\"[object Error]\"===S(e)||e instanceof Error)}function k(e){return\"function\"==typeof e}function S(e){return Object.prototype.toString.call(e)}function M(e){return e<10?\"0\"+e.toString(10):e.toString(10)}r.debuglog=function(e){if(y(s)&&(s=t.env.NODE_DEBUG||\"\"),e=e.toUpperCase(),!o[e])if(new RegExp(\"\\\\b\"+e+\"\\\\b\",\"i\").test(s)){var n=t.pid;o[e]=function(){var t=r.format.apply(r,arguments);console.error(\"%s %d: %s\",e,n,t)}}else o[e]=function(){};return o[e]},r.inspect=a,a.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},a.styles={special:\"cyan\",number:\"yellow\",boolean:\"yellow\",undefined:\"grey\",null:\"bold\",string:\"green\",date:\"magenta\",regexp:\"red\"},r.isArray=d,r.isBoolean=p,r.isNull=m,r.isNullOrUndefined=function(e){return null==e},r.isNumber=b,r.isString=g,r.isSymbol=function(e){return\"symbol\"==typeof e},r.isUndefined=y,r.isRegExp=v,r.isObject=w,r.isDate=_,r.isError=x,r.isFunction=k,r.isPrimitive=function(e){return null===e||\"boolean\"==typeof e||\"number\"==typeof e||\"string\"==typeof e||\"symbol\"==typeof e||void 0===e},r.isBuffer=e(\"./support/isBuffer\");var C=[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"];function T(){var e=new Date,t=[M(e.getHours()),M(e.getMinutes()),M(e.getSeconds())].join(\":\");return[e.getDate(),C[e.getMonth()],t].join(\" \")}function E(e,t){return Object.prototype.hasOwnProperty.call(e,t)}r.log=function(){console.log(\"%s - %s\",T(),r.format.apply(r,arguments))},r.inherits=e(\"inherits\"),r._extend=function(e,t){if(!t||!w(t))return e;for(var r=Object.keys(t),n=r.length;n--;)e[r[n]]=t[r[n]];return e}}).call(this)}).call(this,e(\"_process\"),\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{\"./support/isBuffer\":526,_process:467,inherits:525}],528:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),Object.defineProperty(r,\"v1\",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(r,\"v3\",{enumerable:!0,get:function(){return i.default}}),Object.defineProperty(r,\"v4\",{enumerable:!0,get:function(){return s.default}}),Object.defineProperty(r,\"v5\",{enumerable:!0,get:function(){return o.default}}),Object.defineProperty(r,\"NIL\",{enumerable:!0,get:function(){return a.default}}),Object.defineProperty(r,\"version\",{enumerable:!0,get:function(){return l.default}}),Object.defineProperty(r,\"validate\",{enumerable:!0,get:function(){return c.default}}),Object.defineProperty(r,\"stringify\",{enumerable:!0,get:function(){return u.default}}),Object.defineProperty(r,\"parse\",{enumerable:!0,get:function(){return h.default}});var n=f(e(\"./v1.js\")),i=f(e(\"./v3.js\")),s=f(e(\"./v4.js\")),o=f(e(\"./v5.js\")),a=f(e(\"./nil.js\")),l=f(e(\"./version.js\")),c=f(e(\"./validate.js\")),u=f(e(\"./stringify.js\")),h=f(e(\"./parse.js\"));function f(e){return e&&e.__esModule?e:{default:e}}},{\"./nil.js\":530,\"./parse.js\":531,\"./stringify.js\":535,\"./v1.js\":536,\"./v3.js\":537,\"./v4.js\":539,\"./v5.js\":540,\"./validate.js\":541,\"./version.js\":542}],529:[function(e,t,r){\"use strict\";function n(e){return 14+(e+64>>>9<<4)+1}function i(e,t){const r=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(r>>16)<<16|65535&r}function s(e,t,r,n,s,o){return i((a=i(i(t,e),i(n,o)))<<(l=s)|a>>>32-l,r);var a,l}function o(e,t,r,n,i,o,a){return s(t&r|~t&n,e,t,i,o,a)}function a(e,t,r,n,i,o,a){return s(t&n|r&~n,e,t,i,o,a)}function l(e,t,r,n,i,o,a){return s(t^r^n,e,t,i,o,a)}function c(e,t,r,n,i,o,a){return s(r^(t|~n),e,t,i,o,a)}Object.defineProperty(r,\"__esModule\",{value:!0}),r.default=void 0;var u=function(e){if(\"string\"==typeof e){const t=unescape(encodeURIComponent(e));e=new Uint8Array(t.length);for(let r=0;r<t.length;++r)e[r]=t.charCodeAt(r)}return function(e){const t=[],r=32*e.length;for(let n=0;n<r;n+=8){const r=e[n>>5]>>>n%32&255,i=parseInt(\"0123456789abcdef\".charAt(r>>>4&15)+\"0123456789abcdef\".charAt(15&r),16);t.push(i)}return t}(function(e,t){e[t>>5]|=128<<t%32,e[n(t)-1]=t;let r=1732584193,s=-271733879,u=-1732584194,h=271733878;for(let t=0;t<e.length;t+=16){const n=r,f=s,d=u,p=h;r=o(r,s,u,h,e[t],7,-680876936),h=o(h,r,s,u,e[t+1],12,-389564586),u=o(u,h,r,s,e[t+2],17,606105819),s=o(s,u,h,r,e[t+3],22,-1044525330),r=o(r,s,u,h,e[t+4],7,-176418897),h=o(h,r,s,u,e[t+5],12,1200080426),u=o(u,h,r,s,e[t+6],17,-1473231341),s=o(s,u,h,r,e[t+7],22,-45705983),r=o(r,s,u,h,e[t+8],7,1770035416),h=o(h,r,s,u,e[t+9],12,-1958414417),u=o(u,h,r,s,e[t+10],17,-42063),s=o(s,u,h,r,e[t+11],22,-1990404162),r=o(r,s,u,h,e[t+12],7,1804603682),h=o(h,r,s,u,e[t+13],12,-40341101),u=o(u,h,r,s,e[t+14],17,-1502002290),s=o(s,u,h,r,e[t+15],22,1236535329),r=a(r,s,u,h,e[t+1],5,-165796510),h=a(h,r,s,u,e[t+6],9,-1069501632),u=a(u,h,r,s,e[t+11],14,643717713),s=a(s,u,h,r,e[t],20,-373897302),r=a(r,s,u,h,e[t+5],5,-701558691),h=a(h,r,s,u,e[t+10],9,38016083),u=a(u,h,r,s,e[t+15],14,-660478335),s=a(s,u,h,r,e[t+4],20,-405537848),r=a(r,s,u,h,e[t+9],5,568446438),h=a(h,r,s,u,e[t+14],9,-1019803690),u=a(u,h,r,s,e[t+3],14,-187363961),s=a(s,u,h,r,e[t+8],20,1163531501),r=a(r,s,u,h,e[t+13],5,-1444681467),h=a(h,r,s,u,e[t+2],9,-51403784),u=a(u,h,r,s,e[t+7],14,1735328473),s=a(s,u,h,r,e[t+12],20,-1926607734),r=l(r,s,u,h,e[t+5],4,-378558),h=l(h,r,s,u,e[t+8],11,-2022574463),u=l(u,h,r,s,e[t+11],16,1839030562),s=l(s,u,h,r,e[t+14],23,-35309556),r=l(r,s,u,h,e[t+1],4,-1530992060),h=l(h,r,s,u,e[t+4],11,1272893353),u=l(u,h,r,s,e[t+7],16,-155497632),s=l(s,u,h,r,e[t+10],23,-1094730640),r=l(r,s,u,h,e[t+13],4,681279174),h=l(h,r,s,u,e[t],11,-358537222),u=l(u,h,r,s,e[t+3],16,-722521979),s=l(s,u,h,r,e[t+6],23,76029189),r=l(r,s,u,h,e[t+9],4,-640364487),h=l(h,r,s,u,e[t+12],11,-421815835),u=l(u,h,r,s,e[t+15],16,530742520),s=l(s,u,h,r,e[t+2],23,-995338651),r=c(r,s,u,h,e[t],6,-198630844),h=c(h,r,s,u,e[t+7],10,1126891415),u=c(u,h,r,s,e[t+14],15,-1416354905),s=c(s,u,h,r,e[t+5],21,-57434055),r=c(r,s,u,h,e[t+12],6,1700485571),h=c(h,r,s,u,e[t+3],10,-1894986606),u=c(u,h,r,s,e[t+10],15,-1051523),s=c(s,u,h,r,e[t+1],21,-2054922799),r=c(r,s,u,h,e[t+8],6,1873313359),h=c(h,r,s,u,e[t+15],10,-30611744),u=c(u,h,r,s,e[t+6],15,-1560198380),s=c(s,u,h,r,e[t+13],21,1309151649),r=c(r,s,u,h,e[t+4],6,-145523070),h=c(h,r,s,u,e[t+11],10,-1120210379),u=c(u,h,r,s,e[t+2],15,718787259),s=c(s,u,h,r,e[t+9],21,-343485551),r=i(r,n),s=i(s,f),u=i(u,d),h=i(h,p)}return[r,s,u,h]}(function(e){if(0===e.length)return[];const t=8*e.length,r=new Uint32Array(n(t));for(let n=0;n<t;n+=8)r[n>>5]|=(255&e[n/8])<<n%32;return r}(e),8*e.length))};r.default=u},{}],530:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.default=void 0;r.default=\"00000000-0000-0000-0000-000000000000\"},{}],531:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.default=void 0;var n,i=(n=e(\"./validate.js\"))&&n.__esModule?n:{default:n};var s=function(e){if(!(0,i.default)(e))throw TypeError(\"Invalid UUID\");let t;const r=new Uint8Array(16);return r[0]=(t=parseInt(e.slice(0,8),16))>>>24,r[1]=t>>>16&255,r[2]=t>>>8&255,r[3]=255&t,r[4]=(t=parseInt(e.slice(9,13),16))>>>8,r[5]=255&t,r[6]=(t=parseInt(e.slice(14,18),16))>>>8,r[7]=255&t,r[8]=(t=parseInt(e.slice(19,23),16))>>>8,r[9]=255&t,r[10]=(t=parseInt(e.slice(24,36),16))/1099511627776&255,r[11]=t/4294967296&255,r[12]=t>>>24&255,r[13]=t>>>16&255,r[14]=t>>>8&255,r[15]=255&t,r};r.default=s},{\"./validate.js\":541}],532:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.default=void 0;r.default=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i},{}],533:[function(e,t,r){\"use strict\";let n;Object.defineProperty(r,\"__esModule\",{value:!0}),r.default=function(){if(!n&&(n=\"undefined\"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||\"undefined\"!=typeof msCrypto&&\"function\"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto),!n))throw new Error(\"crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported\");return n(i)};const i=new Uint8Array(16)},{}],534:[function(e,t,r){\"use strict\";function n(e,t,r,n){switch(e){case 0:return t&r^~t&n;case 1:return t^r^n;case 2:return t&r^t&n^r&n;case 3:return t^r^n}}function i(e,t){return e<<t|e>>>32-t}Object.defineProperty(r,\"__esModule\",{value:!0}),r.default=void 0;var s=function(e){const t=[1518500249,1859775393,2400959708,3395469782],r=[1732584193,4023233417,2562383102,271733878,3285377520];if(\"string\"==typeof e){const t=unescape(encodeURIComponent(e));e=[];for(let r=0;r<t.length;++r)e.push(t.charCodeAt(r))}else Array.isArray(e)||(e=Array.prototype.slice.call(e));e.push(128);const s=e.length/4+2,o=Math.ceil(s/16),a=new Array(o);for(let t=0;t<o;++t){const r=new Uint32Array(16);for(let n=0;n<16;++n)r[n]=e[64*t+4*n]<<24|e[64*t+4*n+1]<<16|e[64*t+4*n+2]<<8|e[64*t+4*n+3];a[t]=r}a[o-1][14]=8*(e.length-1)/Math.pow(2,32),a[o-1][14]=Math.floor(a[o-1][14]),a[o-1][15]=8*(e.length-1)&4294967295;for(let e=0;e<o;++e){const s=new Uint32Array(80);for(let t=0;t<16;++t)s[t]=a[e][t];for(let e=16;e<80;++e)s[e]=i(s[e-3]^s[e-8]^s[e-14]^s[e-16],1);let o=r[0],l=r[1],c=r[2],u=r[3],h=r[4];for(let e=0;e<80;++e){const r=Math.floor(e/20),a=i(o,5)+n(r,l,c,u)+h+t[r]+s[e]>>>0;h=u,u=c,c=i(l,30)>>>0,l=o,o=a}r[0]=r[0]+o>>>0,r[1]=r[1]+l>>>0,r[2]=r[2]+c>>>0,r[3]=r[3]+u>>>0,r[4]=r[4]+h>>>0}return[r[0]>>24&255,r[0]>>16&255,r[0]>>8&255,255&r[0],r[1]>>24&255,r[1]>>16&255,r[1]>>8&255,255&r[1],r[2]>>24&255,r[2]>>16&255,r[2]>>8&255,255&r[2],r[3]>>24&255,r[3]>>16&255,r[3]>>8&255,255&r[3],r[4]>>24&255,r[4]>>16&255,r[4]>>8&255,255&r[4]]};r.default=s},{}],535:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.default=void 0;var n,i=(n=e(\"./validate.js\"))&&n.__esModule?n:{default:n};const s=[];for(let e=0;e<256;++e)s.push((e+256).toString(16).substr(1));var o=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;const r=(s[e[t+0]]+s[e[t+1]]+s[e[t+2]]+s[e[t+3]]+\"-\"+s[e[t+4]]+s[e[t+5]]+\"-\"+s[e[t+6]]+s[e[t+7]]+\"-\"+s[e[t+8]]+s[e[t+9]]+\"-\"+s[e[t+10]]+s[e[t+11]]+s[e[t+12]]+s[e[t+13]]+s[e[t+14]]+s[e[t+15]]).toLowerCase();if(!(0,i.default)(r))throw TypeError(\"Stringified UUID is invalid\");return r};r.default=o},{\"./validate.js\":541}],536:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.default=void 0;var n=s(e(\"./rng.js\")),i=s(e(\"./stringify.js\"));function s(e){return e&&e.__esModule?e:{default:e}}let o,a,l=0,c=0;var u=function(e,t,r){let s=t&&r||0;const u=t||new Array(16);let h=(e=e||{}).node||o,f=void 0!==e.clockseq?e.clockseq:a;if(null==h||null==f){const t=e.random||(e.rng||n.default)();null==h&&(h=o=[1|t[0],t[1],t[2],t[3],t[4],t[5]]),null==f&&(f=a=16383&(t[6]<<8|t[7]))}let d=void 0!==e.msecs?e.msecs:Date.now(),p=void 0!==e.nsecs?e.nsecs:c+1;const m=d-l+(p-c)/1e4;if(m<0&&void 0===e.clockseq&&(f=f+1&16383),(m<0||d>l)&&void 0===e.nsecs&&(p=0),p>=1e4)throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");l=d,c=p,a=f,d+=122192928e5;const b=(1e4*(268435455&d)+p)%4294967296;u[s++]=b>>>24&255,u[s++]=b>>>16&255,u[s++]=b>>>8&255,u[s++]=255&b;const g=d/4294967296*1e4&268435455;u[s++]=g>>>8&255,u[s++]=255&g,u[s++]=g>>>24&15|16,u[s++]=g>>>16&255,u[s++]=f>>>8|128,u[s++]=255&f;for(let e=0;e<6;++e)u[s+e]=h[e];return t||(0,i.default)(u)};r.default=u},{\"./rng.js\":533,\"./stringify.js\":535}],537:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.default=void 0;var n=s(e(\"./v35.js\")),i=s(e(\"./md5.js\"));function s(e){return e&&e.__esModule?e:{default:e}}var o=(0,n.default)(\"v3\",48,i.default);r.default=o},{\"./md5.js\":529,\"./v35.js\":538}],538:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.default=function(e,t,r){function s(e,s,o,a){if(\"string\"==typeof e&&(e=function(e){e=unescape(encodeURIComponent(e));const t=[];for(let r=0;r<e.length;++r)t.push(e.charCodeAt(r));return t}(e)),\"string\"==typeof s&&(s=(0,i.default)(s)),16!==s.length)throw TypeError(\"Namespace must be array-like (16 iterable integer values, 0-255)\");let l=new Uint8Array(16+e.length);if(l.set(s),l.set(e,s.length),l=r(l),l[6]=15&l[6]|t,l[8]=63&l[8]|128,o){a=a||0;for(let e=0;e<16;++e)o[a+e]=l[e];return o}return(0,n.default)(l)}try{s.name=e}catch(e){}return s.DNS=o,s.URL=a,s},r.URL=r.DNS=void 0;var n=s(e(\"./stringify.js\")),i=s(e(\"./parse.js\"));function s(e){return e&&e.__esModule?e:{default:e}}const o=\"6ba7b810-9dad-11d1-80b4-00c04fd430c8\";r.DNS=o;const a=\"6ba7b811-9dad-11d1-80b4-00c04fd430c8\";r.URL=a},{\"./parse.js\":531,\"./stringify.js\":535}],539:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.default=void 0;var n=s(e(\"./rng.js\")),i=s(e(\"./stringify.js\"));function s(e){return e&&e.__esModule?e:{default:e}}var o=function(e,t,r){const s=(e=e||{}).random||(e.rng||n.default)();if(s[6]=15&s[6]|64,s[8]=63&s[8]|128,t){r=r||0;for(let e=0;e<16;++e)t[r+e]=s[e];return t}return(0,i.default)(s)};r.default=o},{\"./rng.js\":533,\"./stringify.js\":535}],540:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.default=void 0;var n=s(e(\"./v35.js\")),i=s(e(\"./sha1.js\"));function s(e){return e&&e.__esModule?e:{default:e}}var o=(0,n.default)(\"v5\",80,i.default);r.default=o},{\"./sha1.js\":534,\"./v35.js\":538}],541:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.default=void 0;var n,i=(n=e(\"./regex.js\"))&&n.__esModule?n:{default:n};var s=function(e){return\"string\"==typeof e&&i.default.test(e)};r.default=s},{\"./regex.js\":532}],542:[function(e,t,r){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0}),r.default=void 0;var n,i=(n=e(\"./validate.js\"))&&n.__esModule?n:{default:n};var s=function(e){if(!(0,i.default)(e))throw TypeError(\"Invalid UUID\");return parseInt(e.substr(14,1),16)};r.default=s},{\"./validate.js\":541}],543:[function(e,t,r){\"use strict\";\n/**\n * Character classes and associated utilities for the 5th edition of XML 1.0.\n *\n * @author Louis-Dominique Dubeau\n * @license MIT\n * @copyright Louis-Dominique Dubeau\n */Object.defineProperty(r,\"__esModule\",{value:!0}),r.CHAR=\"\\t\\n\\r -\\ud7ff\\ue000-\\ufffd\\ud800\\udc00-\\udbff\\udfff\",r.S=\" \\t\\r\\n\",r.NAME_START_CHAR=\":A-Z_a-z\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\u02ff\\u0370-\\u037d\\u037f-\\u1fff\\u200c\\u200d\\u2070-\\u218f\\u2c00-\\u2fef\\u3001-\\ud7ff\\uf900-\\ufdcf\\ufdf0-\\ufffd\\ud800\\udc00-\\udb7f\\udfff\",r.NAME_CHAR=\"-\"+r.NAME_START_CHAR+\".0-9\\xb7\\u0300-\\u036f\\u203f-\\u2040\",r.CHAR_RE=new RegExp(\"^[\"+r.CHAR+\"]$\",\"u\"),r.S_RE=new RegExp(\"^[\"+r.S+\"]+$\",\"u\"),r.NAME_START_CHAR_RE=new RegExp(\"^[\"+r.NAME_START_CHAR+\"]$\",\"u\"),r.NAME_CHAR_RE=new RegExp(\"^[\"+r.NAME_CHAR+\"]$\",\"u\"),r.NAME_RE=new RegExp(\"^[\"+r.NAME_START_CHAR+\"][\"+r.NAME_CHAR+\"]*$\",\"u\"),r.NMTOKEN_RE=new RegExp(\"^[\"+r.NAME_CHAR+\"]+$\",\"u\");function n(e){return e>=65&&e<=90||e>=97&&e<=122||58===e||95===e||8204===e||8205===e||e>=192&&e<=214||e>=216&&e<=246||e>=248&&e<=767||e>=880&&e<=893||e>=895&&e<=8191||e>=8304&&e<=8591||e>=11264&&e<=12271||e>=12289&&e<=55295||e>=63744&&e<=64975||e>=65008&&e<=65533||e>=65536&&e<=983039}r.S_LIST=[32,10,13,9],r.isChar=function(e){return e>=32&&e<=55295||10===e||13===e||9===e||e>=57344&&e<=65533||e>=65536&&e<=1114111},r.isS=function(e){return 32===e||10===e||13===e||9===e},r.isNameStartChar=n,r.isNameChar=function(e){return n(e)||e>=48&&e<=57||45===e||46===e||183===e||e>=768&&e<=879||e>=8255&&e<=8256}},{}],544:[function(e,t,r){\"use strict\";\n/**\n * Character classes and associated utilities for the 2nd edition of XML 1.1.\n *\n * @author Louis-Dominique Dubeau\n * @license MIT\n * @copyright Louis-Dominique Dubeau\n */Object.defineProperty(r,\"__esModule\",{value:!0}),r.CHAR=\"\\x01-\\ud7ff\\ue000-\\ufffd\\ud800\\udc00-\\udbff\\udfff\",r.RESTRICTED_CHAR=\"\\x01-\\b\\v\\f\\x0e-\\x1f\\x7f-\\x84\\x86-\\x9f\",r.S=\" \\t\\r\\n\",r.NAME_START_CHAR=\":A-Z_a-z\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\u02ff\\u0370-\\u037d\\u037f-\\u1fff\\u200c\\u200d\\u2070-\\u218f\\u2c00-\\u2fef\\u3001-\\ud7ff\\uf900-\\ufdcf\\ufdf0-\\ufffd\\ud800\\udc00-\\udb7f\\udfff\",r.NAME_CHAR=\"-\"+r.NAME_START_CHAR+\".0-9\\xb7\\u0300-\\u036f\\u203f-\\u2040\",r.CHAR_RE=new RegExp(\"^[\"+r.CHAR+\"]$\",\"u\"),r.RESTRICTED_CHAR_RE=new RegExp(\"^[\"+r.RESTRICTED_CHAR+\"]$\",\"u\"),r.S_RE=new RegExp(\"^[\"+r.S+\"]+$\",\"u\"),r.NAME_START_CHAR_RE=new RegExp(\"^[\"+r.NAME_START_CHAR+\"]$\",\"u\"),r.NAME_CHAR_RE=new RegExp(\"^[\"+r.NAME_CHAR+\"]$\",\"u\"),r.NAME_RE=new RegExp(\"^[\"+r.NAME_START_CHAR+\"][\"+r.NAME_CHAR+\"]*$\",\"u\"),r.NMTOKEN_RE=new RegExp(\"^[\"+r.NAME_CHAR+\"]+$\",\"u\");function n(e){return e>=65&&e<=90||e>=97&&e<=122||58===e||95===e||8204===e||8205===e||e>=192&&e<=214||e>=216&&e<=246||e>=248&&e<=767||e>=880&&e<=893||e>=895&&e<=8191||e>=8304&&e<=8591||e>=11264&&e<=12271||e>=12289&&e<=55295||e>=63744&&e<=64975||e>=65008&&e<=65533||e>=65536&&e<=983039}r.S_LIST=[32,10,13,9],r.isChar=function(e){return e>=1&&e<=55295||e>=57344&&e<=65533||e>=65536&&e<=1114111},r.isRestrictedChar=function(e){return e>=1&&e<=8||11===e||12===e||e>=14&&e<=31||e>=127&&e<=132||e>=134&&e<=159},r.isCharAndNotRestricted=function(e){return 9===e||10===e||13===e||e>31&&e<127||133===e||e>159&&e<=55295||e>=57344&&e<=65533||e>=65536&&e<=1114111},r.isS=function(e){return 32===e||10===e||13===e||9===e},r.isNameStartChar=n,r.isNameChar=function(e){return n(e)||e>=48&&e<=57||45===e||46===e||183===e||e>=768&&e<=879||e>=8255&&e<=8256}},{}],545:[function(e,t,r){\"use strict\";\n/**\n * Character class utilities for XML NS 1.0 edition 3.\n *\n * @author Louis-Dominique Dubeau\n * @license MIT\n * @copyright Louis-Dominique Dubeau\n */function n(e){return e>=65&&e<=90||95===e||e>=97&&e<=122||e>=192&&e<=214||e>=216&&e<=246||e>=248&&e<=767||e>=880&&e<=893||e>=895&&e<=8191||e>=8204&&e<=8205||e>=8304&&e<=8591||e>=11264&&e<=12271||e>=12289&&e<=55295||e>=63744&&e<=64975||e>=65008&&e<=65533||e>=65536&&e<=983039}Object.defineProperty(r,\"__esModule\",{value:!0}),r.NC_NAME_START_CHAR=\"A-Z_a-z\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\u02ff\\u0370-\\u037d\\u037f-\\u1fff\\u200c-\\u200d\\u2070-\\u218f\\u2c00-\\u2fef\\u3001-\\ud7ff\\uf900-\\ufdcf\\ufdf0-\\ufffd\\ud800\\udc00-\\udb7f\\udfff\",r.NC_NAME_CHAR=\"-\"+r.NC_NAME_START_CHAR+\".0-9\\xb7\\u0300-\\u036f\\u203f-\\u2040\",r.NC_NAME_START_CHAR_RE=new RegExp(\"^[\"+r.NC_NAME_START_CHAR+\"]$\",\"u\"),r.NC_NAME_CHAR_RE=new RegExp(\"^[\"+r.NC_NAME_CHAR+\"]$\",\"u\"),r.NC_NAME_RE=new RegExp(\"^[\"+r.NC_NAME_START_CHAR+\"][\"+r.NC_NAME_CHAR+\"]*$\",\"u\"),r.isNCNameStartChar=n,r.isNCNameChar=function(e){return n(e)||45===e||46===e||e>=48&&e<=57||183===e||e>=768&&e<=879||e>=8255&&e<=8256}},{}]},{},[15])(15)}));\n","/*! Sortable 1.15.7 - MIT | git://github.com/SortableJS/Sortable.git */\n!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=t||self).Sortable=e()}(this,function(){\"use strict\";function o(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,o=Array(e);n<e;n++)o[n]=t[n];return o}function i(t,e,n){return(e=function(t){t=function(t,e){if(\"object\"!=typeof t||!t)return t;var n=t[Symbol.toPrimitive];if(void 0===n)return(\"string\"===e?String:Number)(t);e=n.call(t,e||\"default\");if(\"object\"!=typeof e)return e;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}(t,\"string\");return\"symbol\"==typeof t?t:t+\"\"}(e))in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function a(){return(a=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var n,o=arguments[e];for(n in o)!{}.hasOwnProperty.call(o,n)||(t[n]=o[n])}return t}).apply(null,arguments)}function r(e,t){var n,o=Object.keys(e);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(e),t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),o.push.apply(o,n)),o}function I(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach(function(t){i(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function l(t,e){if(null==t)return{};var n,o=function(t,e){if(null==t)return{};var n,o={};for(n in t)if({}.hasOwnProperty.call(t,n)){if(-1!==e.indexOf(n))continue;o[n]=t[n]}return o}(t,e);if(Object.getOwnPropertySymbols)for(var i=Object.getOwnPropertySymbols(t),r=0;r<i.length;r++)n=i[r],-1===e.indexOf(n)&&{}.propertyIsEnumerable.call(t,n)&&(o[n]=t[n]);return o}function e(t){return function(t){if(Array.isArray(t))return o(t)}(t)||function(t){if(\"undefined\"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t[\"@@iterator\"])return Array.from(t)}(t)||function(t,e){if(t){if(\"string\"==typeof t)return o(t,e);var n={}.toString.call(t).slice(8,-1);return\"Map\"===(n=\"Object\"===n&&t.constructor?t.constructor.name:n)||\"Set\"===n?Array.from(t):\"Arguments\"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(t,e):void 0}}(t)||function(){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 s(t){return(s=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t})(t)}function t(t){if(\"undefined\"!=typeof window&&window.navigator)return!!navigator.userAgent.match(t)}var y=t(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i),w=t(/Edge/i),c=t(/firefox/i),u=t(/safari/i)&&!t(/chrome/i)&&!t(/android/i),d=t(/iP(ad|od|hone)/i),n=t(/chrome/i)&&t(/android/i),h={capture:!1,passive:!1};function f(t,e,n){t.addEventListener(e,n,!y&&h)}function p(t,e,n){t.removeEventListener(e,n,!y&&h)}function g(t,e){if(e&&(\">\"===e[0]&&(e=e.substring(1)),t))try{if(t.matches)return t.matches(e);if(t.msMatchesSelector)return t.msMatchesSelector(e);if(t.webkitMatchesSelector)return t.webkitMatchesSelector(e)}catch(t){return}}function m(t){return t.host&&t!==document&&t.host.nodeType&&t.host!==t?t.host:t.parentNode}function P(t,e,n,o){if(t){n=n||document;do{if(null!=e&&(\">\"!==e[0]||t.parentNode===n)&&g(t,e)||o&&t===n)return t}while(t!==n&&(t=m(t)))}return null}var v,b=/\\s+/g;function k(t,e,n){var o;t&&e&&(t.classList?t.classList[n?\"add\":\"remove\"](e):(o=(\" \"+t.className+\" \").replace(b,\" \").replace(\" \"+e+\" \",\" \"),t.className=(o+(n?\" \"+e:\"\")).replace(b,\" \")))}function R(t,e,n){var o=t&&t.style;if(o){if(void 0===n)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(t,\"\"):t.currentStyle&&(n=t.currentStyle),void 0===e?n:n[e];o[e=!(e in o||-1!==e.indexOf(\"webkit\"))?\"-webkit-\"+e:e]=n+(\"string\"==typeof n?\"\":\"px\")}}function D(t,e){var n=\"\";if(\"string\"==typeof t)n=t;else do{var o=R(t,\"transform\")}while(o&&\"none\"!==o&&(n=o+\" \"+n),!e&&(t=t.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(n)}function E(t,e,n){if(t){var o=t.getElementsByTagName(e),i=0,r=o.length;if(n)for(;i<r;i++)n(o[i],i);return o}return[]}function O(){var t=document.scrollingElement;return t||document.documentElement}function X(t,e,n,o,i){if(t.getBoundingClientRect||t===window){var r,a,l,s,c,u,d=t!==window&&t.parentNode&&t!==O()?(a=(r=t.getBoundingClientRect()).top,l=r.left,s=r.bottom,c=r.right,u=r.height,r.width):(l=a=0,s=window.innerHeight,c=window.innerWidth,u=window.innerHeight,window.innerWidth);if((e||n)&&t!==window&&(i=i||t.parentNode,!y))do{if(i&&i.getBoundingClientRect&&(\"none\"!==R(i,\"transform\")||n&&\"static\"!==R(i,\"position\"))){var h=i.getBoundingClientRect();a-=h.top+parseInt(R(i,\"border-top-width\")),l-=h.left+parseInt(R(i,\"border-left-width\")),s=a+r.height,c=l+r.width;break}}while(i=i.parentNode);return o&&t!==window&&(o=(e=D(i||t))&&e.a,t=e&&e.d,e&&(s=(a/=t)+(u/=t),c=(l/=o)+(d/=o))),{top:a,left:l,bottom:s,right:c,width:d,height:u}}}function Y(t,e,n){for(var o=M(t,!0),i=X(t)[e];o;){var r=X(o)[n];if(!(\"top\"===n||\"left\"===n?r<=i:i<=r))return o;if(o===O())break;o=M(o,!1)}return!1}function B(t,e,n,o){for(var i=0,r=0,a=t.children;r<a.length;){if(\"none\"!==a[r].style.display&&a[r]!==Ht.ghost&&(o||a[r]!==Ht.dragged)&&P(a[r],n.draggable,t,!1)){if(i===e)return a[r];i++}r++}return null}function F(t,e){for(var n=t.lastElementChild;n&&(n===Ht.ghost||\"none\"===R(n,\"display\")||e&&!g(n,e));)n=n.previousElementSibling;return n||null}function j(t,e){var n=0;if(!t||!t.parentNode)return-1;for(;t=t.previousElementSibling;)\"TEMPLATE\"===t.nodeName.toUpperCase()||t===Ht.clone||e&&!g(t,e)||n++;return n}function S(t){var e=0,n=0,o=O();if(t)do{var i=D(t),r=i.a,i=i.d}while(e+=t.scrollLeft*r,n+=t.scrollTop*i,t!==o&&(t=t.parentNode));return[e,n]}function M(t,e){if(!t||!t.getBoundingClientRect)return O();var n=t,o=!1;do{if(n.clientWidth<n.scrollWidth||n.clientHeight<n.scrollHeight){var i=R(n);if(n.clientWidth<n.scrollWidth&&(\"auto\"==i.overflowX||\"scroll\"==i.overflowX)||n.clientHeight<n.scrollHeight&&(\"auto\"==i.overflowY||\"scroll\"==i.overflowY)){if(!n.getBoundingClientRect||n===document.body)return O();if(o||e)return n;o=!0}}}while(n=n.parentNode);return O()}function _(t,e){return Math.round(t.top)===Math.round(e.top)&&Math.round(t.left)===Math.round(e.left)&&Math.round(t.height)===Math.round(e.height)&&Math.round(t.width)===Math.round(e.width)}function C(e,n){return function(){var t;v||(1===(t=arguments).length?e.call(this,t[0]):e.apply(this,t),v=setTimeout(function(){v=void 0},n))}}function H(t,e,n){t.scrollLeft+=e,t.scrollTop+=n}function T(t){var e=window.Polymer,n=window.jQuery||window.Zepto;return e&&e.dom?e.dom(t).cloneNode(!0):n?n(t).clone(!0)[0]:t.cloneNode(!0)}function x(t,e){R(t,\"position\",\"absolute\"),R(t,\"top\",e.top),R(t,\"left\",e.left),R(t,\"width\",e.width),R(t,\"height\",e.height)}function A(t){R(t,\"position\",\"\"),R(t,\"top\",\"\"),R(t,\"left\",\"\"),R(t,\"width\",\"\"),R(t,\"height\",\"\")}function L(n,o,i){var r={};return Array.from(n.children).forEach(function(t){var e;P(t,o.draggable,n,!1)&&!t.animated&&t!==i&&(e=X(t),r.left=Math.min(null!==(t=r.left)&&void 0!==t?t:1/0,e.left),r.top=Math.min(null!==(t=r.top)&&void 0!==t?t:1/0,e.top),r.right=Math.max(null!==(t=r.right)&&void 0!==t?t:-1/0,e.right),r.bottom=Math.max(null!==(t=r.bottom)&&void 0!==t?t:-1/0,e.bottom))}),r.width=r.right-r.left,r.height=r.bottom-r.top,r.x=r.left,r.y=r.top,r}var K=\"Sortable\"+(new Date).getTime();function N(){var e,o=[];return{captureAnimationState:function(){o=[],this.options.animation&&[].slice.call(this.el.children).forEach(function(t){var e,n;\"none\"!==R(t,\"display\")&&t!==Ht.ghost&&(o.push({target:t,rect:X(t)}),e=I({},o[o.length-1].rect),!t.thisAnimationDuration||(n=D(t,!0))&&(e.top-=n.f,e.left-=n.e),t.fromRect=e)})},addAnimationState:function(t){o.push(t)},removeAnimationState:function(t){o.splice(function(t,e){for(var n in t)if(t.hasOwnProperty(n))for(var o in e)if(e.hasOwnProperty(o)&&e[o]===t[n][o])return Number(n);return-1}(o,{target:t}),1)},animateAll:function(t){var c=this;if(!this.options.animation)return clearTimeout(e),void(\"function\"==typeof t&&t());var u=!1,d=0;o.forEach(function(t){var e=0,n=t.target,o=n.fromRect,i=X(n),r=n.prevFromRect,a=n.prevToRect,l=t.rect,s=D(n,!0);s&&(i.top-=s.f,i.left-=s.e),n.toRect=i,n.thisAnimationDuration&&_(r,i)&&!_(o,i)&&(l.top-i.top)/(l.left-i.left)==(o.top-i.top)/(o.left-i.left)&&(t=l,s=r,r=a,a=c.options,e=Math.sqrt(Math.pow(s.top-t.top,2)+Math.pow(s.left-t.left,2))/Math.sqrt(Math.pow(s.top-r.top,2)+Math.pow(s.left-r.left,2))*a.animation),_(i,o)||(n.prevFromRect=o,n.prevToRect=i,e=e||c.options.animation,c.animate(n,l,i,e)),e&&(u=!0,d=Math.max(d,e),clearTimeout(n.animationResetTimer),n.animationResetTimer=setTimeout(function(){n.animationTime=0,n.prevFromRect=null,n.fromRect=null,n.prevToRect=null,n.thisAnimationDuration=null},e),n.thisAnimationDuration=e)}),clearTimeout(e),u?e=setTimeout(function(){\"function\"==typeof t&&t()},d):\"function\"==typeof t&&t(),o=[]},animate:function(t,e,n,o){var i,r;o&&(R(t,\"transition\",\"\"),R(t,\"transform\",\"\"),i=(r=D(this.el))&&r.a,r=r&&r.d,i=(e.left-n.left)/(i||1),r=(e.top-n.top)/(r||1),t.animatingX=!!i,t.animatingY=!!r,R(t,\"transform\",\"translate3d(\"+i+\"px,\"+r+\"px,0)\"),this.forRepaintDummy=t.offsetWidth,R(t,\"transition\",\"transform \"+o+\"ms\"+(this.options.easing?\" \"+this.options.easing:\"\")),R(t,\"transform\",\"translate3d(0,0,0)\"),\"number\"==typeof t.animated&&clearTimeout(t.animated),t.animated=setTimeout(function(){R(t,\"transition\",\"\"),R(t,\"transform\",\"\"),t.animated=!1,t.animatingX=!1,t.animatingY=!1},o))}}}var W=[],z={initializeByDefault:!0},G={mount:function(e){for(var t in z)!z.hasOwnProperty(t)||t in e||(e[t]=z[t]);W.forEach(function(t){if(t.pluginName===e.pluginName)throw\"Sortable: Cannot mount plugin \".concat(e.pluginName,\" more than once\")}),W.push(e)},pluginEvent:function(e,n,o){var t=this;this.eventCanceled=!1,o.cancel=function(){t.eventCanceled=!0};var i=e+\"Global\";W.forEach(function(t){n[t.pluginName]&&(n[t.pluginName][i]&&n[t.pluginName][i](I({sortable:n},o)),n.options[t.pluginName]&&n[t.pluginName][e]&&n[t.pluginName][e](I({sortable:n},o)))})},initializePlugins:function(n,o,i,t){for(var e in W.forEach(function(t){var e=t.pluginName;(n.options[e]||t.initializeByDefault)&&((t=new t(n,o,n.options)).sortable=n,t.options=n.options,n[e]=t,a(i,t.defaults))}),n.options){var r;n.options.hasOwnProperty(e)&&(void 0!==(r=this.modifyOption(n,e,n.options[e]))&&(n.options[e]=r))}},getEventProperties:function(e,n){var o={};return W.forEach(function(t){\"function\"==typeof t.eventProperties&&a(o,t.eventProperties.call(n[t.pluginName],e))}),o},modifyOption:function(e,n,o){var i;return W.forEach(function(t){e[t.pluginName]&&t.optionListeners&&\"function\"==typeof t.optionListeners[n]&&(i=t.optionListeners[n].call(e[t.pluginName],o))}),i}};function U(t){var e=t.sortable,n=t.rootEl,o=t.name,i=t.targetEl,r=t.cloneEl,a=t.toEl,l=t.fromEl,s=t.oldIndex,c=t.newIndex,u=t.oldDraggableIndex,d=t.newDraggableIndex,h=t.originalEvent,f=t.putSortable,p=t.extraEventProperties;if(e=e||n&&n[K]){var g,m=e.options,t=\"on\"+o.charAt(0).toUpperCase()+o.substr(1);!window.CustomEvent||y||w?(g=document.createEvent(\"Event\")).initEvent(o,!0,!0):g=new CustomEvent(o,{bubbles:!0,cancelable:!0}),g.to=a||n,g.from=l||n,g.item=i||n,g.clone=r,g.oldIndex=s,g.newIndex=c,g.oldDraggableIndex=u,g.newDraggableIndex=d,g.originalEvent=h,g.pullMode=f?f.lastPutMode:void 0;var v,b=I(I({},p),G.getEventProperties(o,e));for(v in b)g[v]=b[v];n&&n.dispatchEvent(g),m[t]&&m[t].call(e,g)}}function q(t,e){var n=(o=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{}).evt,o=l(o,V);G.pluginEvent.bind(Ht)(t,e,I({dragEl:$,parentEl:Q,ghostEl:J,rootEl:tt,nextEl:et,lastDownEl:nt,cloneEl:ot,cloneHidden:it,dragStarted:vt,putSortable:ut,activeSortable:Ht.active,originalEvent:n,oldIndex:rt,oldDraggableIndex:lt,newIndex:at,newDraggableIndex:st,hideGhostForTarget:Yt,unhideGhostForTarget:Bt,cloneNowHidden:function(){it=!0},cloneNowShown:function(){it=!1},dispatchSortableEvent:function(t){Z({sortable:e,name:t,originalEvent:n})}},o))}var V=[\"evt\"];function Z(t){U(I({putSortable:ut,cloneEl:ot,targetEl:$,rootEl:tt,oldIndex:rt,oldDraggableIndex:lt,newIndex:at,newDraggableIndex:st},t))}var $,Q,J,tt,et,nt,ot,it,rt,at,lt,st,ct,ut,dt,ht,ft,pt,gt,mt,vt,bt,yt,wt,Dt,Et=!1,St=!1,_t=[],Ct=!1,Tt=!1,xt=[],Ot=!1,Mt=[],At=\"undefined\"!=typeof document,Nt=d,It=w||y?\"cssFloat\":\"float\",Pt=At&&!n&&!d&&\"draggable\"in document.createElement(\"div\"),kt=function(){if(At){if(y)return!1;var t=document.createElement(\"x\");return t.style.cssText=\"pointer-events:auto\",\"auto\"===t.style.pointerEvents}}(),Rt=function(t,e){var n=R(t),o=parseInt(n.width)-parseInt(n.paddingLeft)-parseInt(n.paddingRight)-parseInt(n.borderLeftWidth)-parseInt(n.borderRightWidth),i=B(t,0,e),r=B(t,1,e),a=i&&R(i),l=r&&R(r),s=a&&parseInt(a.marginLeft)+parseInt(a.marginRight)+X(i).width,t=l&&parseInt(l.marginLeft)+parseInt(l.marginRight)+X(r).width;if(\"flex\"===n.display)return\"column\"===n.flexDirection||\"column-reverse\"===n.flexDirection?\"vertical\":\"horizontal\";if(\"grid\"===n.display)return n.gridTemplateColumns.split(\" \").length<=1?\"vertical\":\"horizontal\";if(i&&a.float&&\"none\"!==a.float){e=\"left\"===a.float?\"left\":\"right\";return!r||\"both\"!==l.clear&&l.clear!==e?\"horizontal\":\"vertical\"}return i&&(\"block\"===a.display||\"flex\"===a.display||\"table\"===a.display||\"grid\"===a.display||o<=s&&\"none\"===n[It]||r&&\"none\"===n[It]&&o<s+t)?\"vertical\":\"horizontal\"},Xt=function(t){function l(r,a){return function(t,e,n,o){var i=t.options.group.name&&e.options.group.name&&t.options.group.name===e.options.group.name;if(null==r&&(a||i))return!0;if(null==r||!1===r)return!1;if(a&&\"clone\"===r)return r;if(\"function\"==typeof r)return l(r(t,e,n,o),a)(t,e,n,o);e=(a?t:e).options.group.name;return!0===r||\"string\"==typeof r&&r===e||r.join&&-1<r.indexOf(e)}}var e={},n=t.group;n&&\"object\"==s(n)||(n={name:n}),e.name=n.name,e.checkPull=l(n.pull,!0),e.checkPut=l(n.put),e.revertClone=n.revertClone,t.group=e},Yt=function(){!kt&&J&&R(J,\"display\",\"none\")},Bt=function(){!kt&&J&&R(J,\"display\",\"\")};At&&!n&&document.addEventListener(\"click\",function(t){if(St)return t.preventDefault(),t.stopPropagation&&t.stopPropagation(),t.stopImmediatePropagation&&t.stopImmediatePropagation(),St=!1},!0);function Ft(t){if($){t=t.touches?t.touches[0]:t;var e=(i=t.clientX,r=t.clientY,_t.some(function(t){var e=t[K].options.emptyInsertThreshold;if(e&&!F(t)){var n=X(t),o=i>=n.left-e&&i<=n.right+e,e=r>=n.top-e&&r<=n.bottom+e;return o&&e?a=t:void 0}}),a);if(e){var n,o={};for(n in t)t.hasOwnProperty(n)&&(o[n]=t[n]);o.target=o.rootEl=e,o.preventDefault=void 0,o.stopPropagation=void 0,e[K]._onDragOver(o)}}var i,r,a}function jt(t){$&&$.parentNode[K]._isOutsideThisEl(t.target)}function Ht(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw\"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(t));this.el=t,this.options=e=a({},e),t[K]=this;var n,o,i={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(t.nodeName)?\">li\":\">*\",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return Rt(t,this.options)},ghostClass:\"sortable-ghost\",chosenClass:\"sortable-chosen\",dragClass:\"sortable-drag\",ignore:\"a, img\",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(t,e){t.setData(\"Text\",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:\"data-id\",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:\"sortable-fallback\",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==Ht.supportPointer&&\"PointerEvent\"in window&&(!u||d),emptyInsertThreshold:5};for(n in G.initializePlugins(this,t,i),i)n in e||(e[n]=i[n]);for(o in Xt(e),this)\"_\"===o.charAt(0)&&\"function\"==typeof this[o]&&(this[o]=this[o].bind(this));this.nativeDraggable=!e.forceFallback&&Pt,this.nativeDraggable&&(this.options.touchStartThreshold=1),e.supportPointer?f(t,\"pointerdown\",this._onTapStart):(f(t,\"mousedown\",this._onTapStart),f(t,\"touchstart\",this._onTapStart)),this.nativeDraggable&&(f(t,\"dragover\",this),f(t,\"dragenter\",this)),_t.push(this.el),e.store&&e.store.get&&this.sort(e.store.get(this)||[]),a(this,N())}function Lt(t,e,n,o,i,r,a,l){var s,c,u=t[K],d=u.options.onMove;return!window.CustomEvent||y||w?(s=document.createEvent(\"Event\")).initEvent(\"move\",!0,!0):s=new CustomEvent(\"move\",{bubbles:!0,cancelable:!0}),s.to=e,s.from=t,s.dragged=n,s.draggedRect=o,s.related=i||e,s.relatedRect=r||X(e),s.willInsertAfter=l,s.originalEvent=a,t.dispatchEvent(s),c=d?d.call(u,s,a):c}function Kt(t){t.draggable=!1}function Wt(){Ot=!1}function zt(t){return setTimeout(t,0)}function Gt(t){return clearTimeout(t)}Ht.prototype={constructor:Ht,_isOutsideThisEl:function(t){this.el.contains(t)||t===this.el||(bt=null)},_getDirection:function(t,e){return\"function\"==typeof this.options.direction?this.options.direction.call(this,t,e,$):this.options.direction},_onTapStart:function(e){if(e.cancelable){var n=this,o=this.el,t=this.options,i=t.preventOnFilter,r=e.type,a=e.touches&&e.touches[0]||e.pointerType&&\"touch\"===e.pointerType&&e,l=(a||e).target,s=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||l,c=t.filter;if(!function(t){Mt.length=0;var e=t.getElementsByTagName(\"input\"),n=e.length;for(;n--;){var o=e[n];o.checked&&Mt.push(o)}}(o),!$&&!(/mousedown|pointerdown/.test(r)&&0!==e.button||t.disabled)&&!s.isContentEditable&&(this.nativeDraggable||!u||!l||\"SELECT\"!==l.tagName.toUpperCase())&&!((l=P(l,t.draggable,o,!1))&&l.animated||nt===l)){if(rt=j(l),lt=j(l,t.draggable),\"function\"==typeof c){if(c.call(this,e,l,this))return Z({sortable:n,rootEl:s,name:\"filter\",targetEl:l,toEl:o,fromEl:o}),q(\"filter\",n,{evt:e}),void(i&&e.preventDefault())}else if(c=c&&c.split(\",\").some(function(t){if(t=P(s,t.trim(),o,!1))return Z({sortable:n,rootEl:t,name:\"filter\",targetEl:l,fromEl:o,toEl:o}),q(\"filter\",n,{evt:e}),!0}))return void(i&&e.preventDefault());t.handle&&!P(s,t.handle,o,!1)||this._prepareDragStart(e,a,l)}}},_prepareDragStart:function(t,e,n){var o,i=this,r=i.el,a=i.options,l=r.ownerDocument;n&&!$&&n.parentNode===r&&(o=X(n),tt=r,Q=($=n).parentNode,et=$.nextSibling,nt=n,ct=a.group,dt={target:Ht.dragged=$,clientX:(e||t).clientX,clientY:(e||t).clientY},gt=dt.clientX-o.left,mt=dt.clientY-o.top,this._lastX=(e||t).clientX,this._lastY=(e||t).clientY,$.style[\"will-change\"]=\"all\",o=function(){q(\"delayEnded\",i,{evt:t}),Ht.eventCanceled?i._onDrop():(i._disableDelayedDragEvents(),!c&&i.nativeDraggable&&($.draggable=!0),i._triggerDragStart(t,e),Z({sortable:i,name:\"choose\",originalEvent:t}),k($,a.chosenClass,!0))},a.ignore.split(\",\").forEach(function(t){E($,t.trim(),Kt)}),f(l,\"dragover\",Ft),f(l,\"mousemove\",Ft),f(l,\"touchmove\",Ft),a.supportPointer?(f(l,\"pointerup\",i._onDrop),this.nativeDraggable||f(l,\"pointercancel\",i._onDrop)):(f(l,\"mouseup\",i._onDrop),f(l,\"touchend\",i._onDrop),f(l,\"touchcancel\",i._onDrop)),c&&this.nativeDraggable&&(this.options.touchStartThreshold=4,$.draggable=!0),q(\"delayStart\",this,{evt:t}),!a.delay||a.delayOnTouchOnly&&!e||this.nativeDraggable&&(w||y)?o():Ht.eventCanceled?this._onDrop():(a.supportPointer?(f(l,\"pointerup\",i._disableDelayedDrag),f(l,\"pointercancel\",i._disableDelayedDrag)):(f(l,\"mouseup\",i._disableDelayedDrag),f(l,\"touchend\",i._disableDelayedDrag),f(l,\"touchcancel\",i._disableDelayedDrag)),f(l,\"mousemove\",i._delayedDragTouchMoveHandler),f(l,\"touchmove\",i._delayedDragTouchMoveHandler),a.supportPointer&&f(l,\"pointermove\",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(o,a.delay)))},_delayedDragTouchMoveHandler:function(t){t=t.touches?t.touches[0]:t;Math.max(Math.abs(t.clientX-this._lastX),Math.abs(t.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){$&&Kt($),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;p(t,\"mouseup\",this._disableDelayedDrag),p(t,\"touchend\",this._disableDelayedDrag),p(t,\"touchcancel\",this._disableDelayedDrag),p(t,\"pointerup\",this._disableDelayedDrag),p(t,\"pointercancel\",this._disableDelayedDrag),p(t,\"mousemove\",this._delayedDragTouchMoveHandler),p(t,\"touchmove\",this._delayedDragTouchMoveHandler),p(t,\"pointermove\",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,e){e=e||\"touch\"==t.pointerType&&t,!this.nativeDraggable||e?this.options.supportPointer?f(document,\"pointermove\",this._onTouchMove):f(document,e?\"touchmove\":\"mousemove\",this._onTouchMove):(f($,\"dragend\",this),f(tt,\"dragstart\",this._onDragStart));try{document.selection?zt(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch(t){}},_dragStarted:function(t,e){var n;Et=!1,tt&&$?(q(\"dragStarted\",this,{evt:e}),this.nativeDraggable&&f(document,\"dragover\",jt),n=this.options,t||k($,n.dragClass,!1),k($,n.ghostClass,!0),Ht.active=this,t&&this._appendGhost(),Z({sortable:this,name:\"start\",originalEvent:e})):this._nulling()},_emulateDragOver:function(){if(ht){this._lastX=ht.clientX,this._lastY=ht.clientY,Yt();for(var t=document.elementFromPoint(ht.clientX,ht.clientY),e=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(ht.clientX,ht.clientY))!==e;)e=t;if($.parentNode[K]._isOutsideThisEl(t),e)do{if(e[K])if(e[K]._onDragOver({clientX:ht.clientX,clientY:ht.clientY,target:t,rootEl:e})&&!this.options.dragoverBubble)break}while(e=m(t=e));Bt()}},_onTouchMove:function(t){if(dt){var e=this.options,n=e.fallbackTolerance,o=e.fallbackOffset,i=t.touches?t.touches[0]:t,r=J&&D(J,!0),a=J&&r&&r.a,l=J&&r&&r.d,e=Nt&&Dt&&S(Dt),a=(i.clientX-dt.clientX+o.x)/(a||1)+(e?e[0]-xt[0]:0)/(a||1),l=(i.clientY-dt.clientY+o.y)/(l||1)+(e?e[1]-xt[1]:0)/(l||1);if(!Ht.active&&!Et){if(n&&Math.max(Math.abs(i.clientX-this._lastX),Math.abs(i.clientY-this._lastY))<n)return;this._onDragStart(t,!0)}J&&(r?(r.e+=a-(ft||0),r.f+=l-(pt||0)):r={a:1,b:0,c:0,d:1,e:a,f:l},r=\"matrix(\".concat(r.a,\",\").concat(r.b,\",\").concat(r.c,\",\").concat(r.d,\",\").concat(r.e,\",\").concat(r.f,\")\"),R(J,\"webkitTransform\",r),R(J,\"mozTransform\",r),R(J,\"msTransform\",r),R(J,\"transform\",r),ft=a,pt=l,ht=i),t.cancelable&&t.preventDefault()}},_appendGhost:function(){if(!J){var t=this.options.fallbackOnBody?document.body:tt,e=X($,!0,Nt,!0,t),n=this.options;if(Nt){for(Dt=t;\"static\"===R(Dt,\"position\")&&\"none\"===R(Dt,\"transform\")&&Dt!==document;)Dt=Dt.parentNode;Dt!==document.body&&Dt!==document.documentElement?(Dt===document&&(Dt=O()),e.top+=Dt.scrollTop,e.left+=Dt.scrollLeft):Dt=O(),xt=S(Dt)}k(J=$.cloneNode(!0),n.ghostClass,!1),k(J,n.fallbackClass,!0),k(J,n.dragClass,!0),R(J,\"transition\",\"\"),R(J,\"transform\",\"\"),R(J,\"box-sizing\",\"border-box\"),R(J,\"margin\",0),R(J,\"top\",e.top),R(J,\"left\",e.left),R(J,\"width\",e.width),R(J,\"height\",e.height),R(J,\"opacity\",\"0.8\"),R(J,\"position\",Nt?\"absolute\":\"fixed\"),R(J,\"zIndex\",\"100000\"),R(J,\"pointerEvents\",\"none\"),Ht.ghost=J,t.appendChild(J),R(J,\"transform-origin\",gt/parseInt(J.style.width)*100+\"% \"+mt/parseInt(J.style.height)*100+\"%\")}},_onDragStart:function(t,e){var n=this,o=t.dataTransfer,i=n.options;q(\"dragStart\",this,{evt:t}),Ht.eventCanceled?this._onDrop():(q(\"setupClone\",this),Ht.eventCanceled||((ot=T($)).removeAttribute(\"id\"),ot.draggable=!1,ot.style[\"will-change\"]=\"\",this._hideClone(),k(ot,this.options.chosenClass,!1),Ht.clone=ot),n.cloneId=zt(function(){q(\"clone\",n),Ht.eventCanceled||(n.options.removeCloneOnHide||tt.insertBefore(ot,$),n._hideClone(),Z({sortable:n,name:\"clone\"}))}),e||k($,i.dragClass,!0),e?(St=!0,n._loopId=setInterval(n._emulateDragOver,50)):(p(document,\"mouseup\",n._onDrop),p(document,\"touchend\",n._onDrop),p(document,\"touchcancel\",n._onDrop),o&&(o.effectAllowed=\"move\",i.setData&&i.setData.call(n,o,$)),f(document,\"drop\",n),R($,\"transform\",\"translateZ(0)\")),Et=!0,n._dragStartId=zt(n._dragStarted.bind(n,e,t)),f(document,\"selectstart\",n),vt=!0,window.getSelection().removeAllRanges(),u&&R(document.body,\"user-select\",\"none\"))},_onDragOver:function(n){var o,i,r,t,e,a=this.el,l=n.target,s=this.options,c=s.group,u=Ht.active,d=ct===c,h=s.sort,f=ut||u,p=this,g=!1;if(!Ot){if(void 0!==n.preventDefault&&n.cancelable&&n.preventDefault(),l=P(l,s.draggable,a,!0),O(\"dragOver\"),Ht.eventCanceled)return g;if($.contains(n.target)||l.animated&&l.animatingX&&l.animatingY||p._ignoreWhileAnimating===l)return A(!1);if(St=!1,u&&!s.disabled&&(d?h||(i=Q!==tt):ut===this||(this.lastPutMode=ct.checkPull(this,u,$,n))&&c.checkPut(this,u,$,n))){if(r=\"vertical\"===this._getDirection(n,l),o=X($),O(\"dragOverValid\"),Ht.eventCanceled)return g;if(i)return Q=tt,M(),this._hideClone(),O(\"revert\"),Ht.eventCanceled||(et?tt.insertBefore($,et):tt.appendChild($)),A(!0);var m=F(a,s.draggable);if(m&&(S=n,c=r,x=X(F((E=this).el,E.options.draggable)),E=L(E.el,E.options,J),!(c?S.clientX>E.right+10||S.clientY>x.bottom&&S.clientX>x.left:S.clientY>E.bottom+10||S.clientX>x.right&&S.clientY>x.top)||m.animated)){if(m&&(t=n,e=r,C=X(B((_=this).el,0,_.options,!0)),_=L(_.el,_.options,J),e?t.clientX<_.left-10||t.clientY<C.top&&t.clientX<C.right:t.clientY<_.top-10||t.clientY<C.bottom&&t.clientX<C.left)){var v=B(a,0,s,!0);if(v===$)return A(!1);if(D=X(l=v),!1!==Lt(tt,a,$,o,l,D,n,!1))return M(),a.insertBefore($,v),Q=a,N(),A(!0)}else if(l.parentNode===a){var b,y,w,D=X(l),E=$.parentNode!==a,S=(S=$.animated&&$.toRect||o,x=l.animated&&l.toRect||D,_=(e=r)?S.left:S.top,t=e?S.right:S.bottom,C=e?S.width:S.height,v=e?x.left:x.top,S=e?x.right:x.bottom,x=e?x.width:x.height,!(_===v||t===S||_+C/2===v+x/2)),_=r?\"top\":\"left\",C=Y(l,\"top\",\"top\")||Y($,\"top\",\"top\"),v=C?C.scrollTop:void 0;if(bt!==l&&(y=D[_],Ct=!1,Tt=!S&&s.invertSwap||E),0!==(b=function(t,e,n,o,i,r,a,l){var s=o?t.clientY:t.clientX,c=o?n.height:n.width,t=o?n.top:n.left,o=o?n.bottom:n.right,n=!1;if(!a)if(l&&wt<c*i){if(Ct=!Ct&&(1===yt?t+c*r/2<s:s<o-c*r/2)?!0:Ct)n=!0;else if(1===yt?s<t+wt:o-wt<s)return-yt}else if(t+c*(1-i)/2<s&&s<o-c*(1-i)/2)return function(t){return j($)<j(t)?1:-1}(e);if((n=n||a)&&(s<t+c*r/2||o-c*r/2<s))return t+c/2<s?1:-1;return 0}(n,l,D,r,S?1:s.swapThreshold,null==s.invertedSwapThreshold?s.swapThreshold:s.invertedSwapThreshold,Tt,bt===l)))for(var T=j($);(w=Q.children[T-=b])&&(\"none\"===R(w,\"display\")||w===J););if(0===b||w===l)return A(!1);yt=b;var x=(bt=l).nextElementSibling,E=!1,S=Lt(tt,a,$,o,l,D,n,E=1===b);if(!1!==S)return 1!==S&&-1!==S||(E=1===S),Ot=!0,setTimeout(Wt,30),M(),E&&!x?a.appendChild($):l.parentNode.insertBefore($,E?x:l),C&&H(C,0,v-C.scrollTop),Q=$.parentNode,void 0===y||Tt||(wt=Math.abs(y-X(l)[_])),N(),A(!0)}}else{if(m===$)return A(!1);if((l=m&&a===n.target?m:l)&&(D=X(l)),!1!==Lt(tt,a,$,o,l,D,n,!!l))return M(),m&&m.nextSibling?a.insertBefore($,m.nextSibling):a.appendChild($),Q=a,N(),A(!0)}if(a.contains($))return A(!1)}return!1}function O(t,e){q(t,p,I({evt:n,isOwner:d,axis:r?\"vertical\":\"horizontal\",revert:i,dragRect:o,targetRect:D,canSort:h,fromSortable:f,target:l,completed:A,onMove:function(t,e){return Lt(tt,a,$,o,t,X(t),n,e)},changed:N},e))}function M(){O(\"dragOverAnimationCapture\"),p.captureAnimationState(),p!==f&&f.captureAnimationState()}function A(t){return O(\"dragOverCompleted\",{insertion:t}),t&&(d?u._hideClone():u._showClone(p),p!==f&&(k($,(ut||u).options.ghostClass,!1),k($,s.ghostClass,!0)),ut!==p&&p!==Ht.active?ut=p:p===Ht.active&&ut&&(ut=null),f===p&&(p._ignoreWhileAnimating=l),p.animateAll(function(){O(\"dragOverAnimationComplete\"),p._ignoreWhileAnimating=null}),p!==f&&(f.animateAll(),f._ignoreWhileAnimating=null)),(l===$&&!$.animated||l===a&&!l.animated)&&(bt=null),s.dragoverBubble||n.rootEl||l===document||($.parentNode[K]._isOutsideThisEl(n.target),t||Ft(n)),!s.dragoverBubble&&n.stopPropagation&&n.stopPropagation(),g=!0}function N(){at=j($),st=j($,s.draggable),Z({sortable:p,name:\"change\",toEl:a,newIndex:at,newDraggableIndex:st,originalEvent:n})}},_ignoreWhileAnimating:null,_offMoveEvents:function(){p(document,\"mousemove\",this._onTouchMove),p(document,\"touchmove\",this._onTouchMove),p(document,\"pointermove\",this._onTouchMove),p(document,\"dragover\",Ft),p(document,\"mousemove\",Ft),p(document,\"touchmove\",Ft)},_offUpEvents:function(){var t=this.el.ownerDocument;p(t,\"mouseup\",this._onDrop),p(t,\"touchend\",this._onDrop),p(t,\"pointerup\",this._onDrop),p(t,\"pointercancel\",this._onDrop),p(t,\"touchcancel\",this._onDrop),p(document,\"selectstart\",this)},_onDrop:function(t){var e=this.el,n=this.options;at=j($),st=j($,n.draggable),q(\"drop\",this,{evt:t}),Q=$&&$.parentNode,at=j($),st=j($,n.draggable),Ht.eventCanceled||(Ct=Tt=Et=!1,clearInterval(this._loopId),clearTimeout(this._dragStartTimer),Gt(this.cloneId),Gt(this._dragStartId),this.nativeDraggable&&(p(document,\"drop\",this),p(e,\"dragstart\",this._onDragStart)),this._offMoveEvents(),this._offUpEvents(),u&&R(document.body,\"user-select\",\"\"),R($,\"transform\",\"\"),t&&(vt&&(t.cancelable&&t.preventDefault(),n.dropBubble||t.stopPropagation()),J&&J.parentNode&&J.parentNode.removeChild(J),(tt===Q||ut&&\"clone\"!==ut.lastPutMode)&&ot&&ot.parentNode&&ot.parentNode.removeChild(ot),$&&(this.nativeDraggable&&p($,\"dragend\",this),Kt($),$.style[\"will-change\"]=\"\",vt&&!Et&&k($,(ut||this).options.ghostClass,!1),k($,this.options.chosenClass,!1),Z({sortable:this,name:\"unchoose\",toEl:Q,newIndex:null,newDraggableIndex:null,originalEvent:t}),tt!==Q?(0<=at&&(Z({rootEl:Q,name:\"add\",toEl:Q,fromEl:tt,originalEvent:t}),Z({sortable:this,name:\"remove\",toEl:Q,originalEvent:t}),Z({rootEl:Q,name:\"sort\",toEl:Q,fromEl:tt,originalEvent:t}),Z({sortable:this,name:\"sort\",toEl:Q,originalEvent:t})),ut&&ut.save()):at!==rt&&0<=at&&(Z({sortable:this,name:\"update\",toEl:Q,originalEvent:t}),Z({sortable:this,name:\"sort\",toEl:Q,originalEvent:t})),Ht.active&&(null!=at&&-1!==at||(at=rt,st=lt),Z({sortable:this,name:\"end\",toEl:Q,originalEvent:t}),this.save())))),this._nulling()},_nulling:function(){q(\"nulling\",this),tt=$=Q=J=et=ot=nt=it=dt=ht=vt=at=st=rt=lt=bt=yt=ut=ct=Ht.dragged=Ht.ghost=Ht.clone=Ht.active=null;var e=this.el;Mt.forEach(function(t){e.contains(t)&&(t.checked=!0)}),Mt.length=ft=pt=0},handleEvent:function(t){switch(t.type){case\"drop\":case\"dragend\":this._onDrop(t);break;case\"dragenter\":case\"dragover\":$&&(this._onDragOver(t),function(t){t.dataTransfer&&(t.dataTransfer.dropEffect=\"move\");t.cancelable&&t.preventDefault()}(t));break;case\"selectstart\":t.preventDefault()}},toArray:function(){for(var t,e=[],n=this.el.children,o=0,i=n.length,r=this.options;o<i;o++)P(t=n[o],r.draggable,this.el,!1)&&e.push(t.getAttribute(r.dataIdAttr)||function(t){var e=t.tagName+t.className+t.src+t.href+t.textContent,n=e.length,o=0;for(;n--;)o+=e.charCodeAt(n);return o.toString(36)}(t));return e},sort:function(t,e){var n={},o=this.el;this.toArray().forEach(function(t,e){e=o.children[e];P(e,this.options.draggable,o,!1)&&(n[t]=e)},this),e&&this.captureAnimationState(),t.forEach(function(t){n[t]&&(o.removeChild(n[t]),o.appendChild(n[t]))}),e&&this.animateAll()},save:function(){var t=this.options.store;t&&t.set&&t.set(this)},closest:function(t,e){return P(t,e||this.options.draggable,this.el,!1)},option:function(t,e){var n=this.options;if(void 0===e)return n[t];var o=G.modifyOption(this,t,e);n[t]=void 0!==o?o:e,\"group\"===t&&Xt(n)},destroy:function(){q(\"destroy\",this);var t=this.el;t[K]=null,p(t,\"mousedown\",this._onTapStart),p(t,\"touchstart\",this._onTapStart),p(t,\"pointerdown\",this._onTapStart),this.nativeDraggable&&(p(t,\"dragover\",this),p(t,\"dragenter\",this)),Array.prototype.forEach.call(t.querySelectorAll(\"[draggable]\"),function(t){t.removeAttribute(\"draggable\")}),this._onDrop(),this._disableDelayedDragEvents(),_t.splice(_t.indexOf(this.el),1),this.el=t=null},_hideClone:function(){it||(q(\"hideClone\",this),Ht.eventCanceled||(R(ot,\"display\",\"none\"),this.options.removeCloneOnHide&&ot.parentNode&&ot.parentNode.removeChild(ot),it=!0))},_showClone:function(t){\"clone\"===t.lastPutMode?it&&(q(\"showClone\",this),Ht.eventCanceled||($.parentNode!=tt||this.options.group.revertClone?et?tt.insertBefore(ot,et):tt.appendChild(ot):tt.insertBefore(ot,$),this.options.group.revertClone&&this.animate($,ot),R(ot,\"display\",\"\"),it=!1)):this._hideClone()}},At&&f(document,\"touchmove\",function(t){(Ht.active||Et)&&t.cancelable&&t.preventDefault()}),Ht.utils={on:f,off:p,css:R,find:E,is:function(t,e){return!!P(t,e,t,!1)},extend:function(t,e){if(t&&e)for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t},throttle:C,closest:P,toggleClass:k,clone:T,index:j,nextTick:zt,cancelNextTick:Gt,detectDirection:Rt,getChild:B,expando:K},Ht.get=function(t){return t[K]},Ht.mount=function(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];(e=e[0].constructor===Array?e[0]:e).forEach(function(t){if(!t.prototype||!t.prototype.constructor)throw\"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(t));t.utils&&(Ht.utils=I(I({},Ht.utils),t.utils)),G.mount(t)})},Ht.create=function(t,e){return new Ht(t,e)};var Ut,qt,Vt,Zt,$t,Qt,Jt=[],te=!(Ht.version=\"1.15.7\");function ee(){Jt.forEach(function(t){clearInterval(t.pid)}),Jt=[]}function ne(){clearInterval(Qt)}var oe,ie=C(function(n,t,e,o){if(t.scroll){var i,r=(n.touches?n.touches[0]:n).clientX,a=(n.touches?n.touches[0]:n).clientY,l=t.scrollSensitivity,s=t.scrollSpeed,c=O(),u=!1;qt!==e&&(qt=e,ee(),Ut=t.scroll,i=t.scrollFn,!0===Ut&&(Ut=M(e,!0)));var d=0,h=Ut;do{var f=h,p=X(f),g=p.top,m=p.bottom,v=p.left,b=p.right,y=p.width,w=p.height,D=void 0,E=void 0,S=f.scrollWidth,_=f.scrollHeight,C=R(f),T=f.scrollLeft,p=f.scrollTop,E=f===c?(D=y<S&&(\"auto\"===C.overflowX||\"scroll\"===C.overflowX||\"visible\"===C.overflowX),w<_&&(\"auto\"===C.overflowY||\"scroll\"===C.overflowY||\"visible\"===C.overflowY)):(D=y<S&&(\"auto\"===C.overflowX||\"scroll\"===C.overflowX),w<_&&(\"auto\"===C.overflowY||\"scroll\"===C.overflowY)),T=D&&(Math.abs(b-r)<=l&&T+y<S)-(Math.abs(v-r)<=l&&!!T),p=E&&(Math.abs(m-a)<=l&&p+w<_)-(Math.abs(g-a)<=l&&!!p);if(!Jt[d])for(var x=0;x<=d;x++)Jt[x]||(Jt[x]={});Jt[d].vx==T&&Jt[d].vy==p&&Jt[d].el===f||(Jt[d].el=f,Jt[d].vx=T,Jt[d].vy=p,clearInterval(Jt[d].pid),0==T&&0==p||(u=!0,Jt[d].pid=setInterval(function(){o&&0===this.layer&&Ht.active._onTouchMove($t);var t=Jt[this.layer].vy?Jt[this.layer].vy*s:0,e=Jt[this.layer].vx?Jt[this.layer].vx*s:0;\"function\"==typeof i&&\"continue\"!==i.call(Ht.dragged.parentNode[K],e,t,n,$t,Jt[this.layer].el)||H(Jt[this.layer].el,e,t)}.bind({layer:d}),24))),d++}while(t.bubbleScroll&&h!==c&&(h=M(h,!1)));te=u}},30),n=function(t){var e=t.originalEvent,n=t.putSortable,o=t.dragEl,i=t.activeSortable,r=t.dispatchSortableEvent,a=t.hideGhostForTarget,t=t.unhideGhostForTarget;e&&(i=n||i,a(),e=e.changedTouches&&e.changedTouches.length?e.changedTouches[0]:e,e=document.elementFromPoint(e.clientX,e.clientY),t(),i&&!i.el.contains(e)&&(r(\"spill\"),this.onSpill({dragEl:o,putSortable:n})))};function re(){}function ae(){}re.prototype={startIndex:null,dragStart:function(t){t=t.oldDraggableIndex;this.startIndex=t},onSpill:function(t){var e=t.dragEl,n=t.putSortable;this.sortable.captureAnimationState(),n&&n.captureAnimationState();t=B(this.sortable.el,this.startIndex,this.options);t?this.sortable.el.insertBefore(e,t):this.sortable.el.appendChild(e),this.sortable.animateAll(),n&&n.animateAll()},drop:n},a(re,{pluginName:\"revertOnSpill\"}),ae.prototype={onSpill:function(t){var e=t.dragEl,t=t.putSortable||this.sortable;t.captureAnimationState(),e.parentNode&&e.parentNode.removeChild(e),t.animateAll()},drop:n},a(ae,{pluginName:\"removeOnSpill\"});var le,se,ce,ue,de,he=[],fe=[],pe=!1,ge=!1,me=!1;function ve(n,o){fe.forEach(function(t,e){e=o.children[t.sortableIndex+(n?Number(e):0)];e?o.insertBefore(t,e):o.appendChild(t)})}function be(){he.forEach(function(t){t!==ce&&t.parentNode&&t.parentNode.removeChild(t)})}return Ht.mount(new function(){function t(){for(var t in this.defaults={scroll:!0,forceAutoScrollFallback:!1,scrollSensitivity:30,scrollSpeed:10,bubbleScroll:!0},this)\"_\"===t.charAt(0)&&\"function\"==typeof this[t]&&(this[t]=this[t].bind(this))}return t.prototype={dragStarted:function(t){t=t.originalEvent;this.sortable.nativeDraggable?f(document,\"dragover\",this._handleAutoScroll):this.options.supportPointer?f(document,\"pointermove\",this._handleFallbackAutoScroll):t.touches?f(document,\"touchmove\",this._handleFallbackAutoScroll):f(document,\"mousemove\",this._handleFallbackAutoScroll)},dragOverCompleted:function(t){t=t.originalEvent;this.options.dragOverBubble||t.rootEl||this._handleAutoScroll(t)},drop:function(){this.sortable.nativeDraggable?p(document,\"dragover\",this._handleAutoScroll):(p(document,\"pointermove\",this._handleFallbackAutoScroll),p(document,\"touchmove\",this._handleFallbackAutoScroll),p(document,\"mousemove\",this._handleFallbackAutoScroll)),ne(),ee(),clearTimeout(v),v=void 0},nulling:function(){$t=qt=Ut=te=Qt=Vt=Zt=null,Jt.length=0},_handleFallbackAutoScroll:function(t){this._handleAutoScroll(t,!0)},_handleAutoScroll:function(e,n){var o,i=this,r=(e.touches?e.touches[0]:e).clientX,a=(e.touches?e.touches[0]:e).clientY,t=document.elementFromPoint(r,a);$t=e,n||this.options.forceAutoScrollFallback||w||y||u?(ie(e,this.options,t,n),o=M(t,!0),!te||Qt&&r===Vt&&a===Zt||(Qt&&ne(),Qt=setInterval(function(){var t=M(document.elementFromPoint(r,a),!0);t!==o&&(o=t,ee()),ie(e,i.options,t,n)},10),Vt=r,Zt=a)):this.options.bubbleScroll&&M(t,!0)!==O()?ie(e,this.options,M(t,!1),!1):ee()}},a(t,{pluginName:\"scroll\",initializeByDefault:!0})}),Ht.mount(ae,re),Ht.mount(new function(){function t(){this.defaults={swapClass:\"sortable-swap-highlight\"}}return t.prototype={dragStart:function(t){t=t.dragEl;oe=t},dragOverValid:function(t){var e=t.completed,n=t.target,o=t.onMove,i=t.activeSortable,r=t.changed,a=t.cancel;i.options.swap&&(t=this.sortable.el,i=this.options,n&&n!==t&&(t=oe,oe=!1!==o(n)?(k(n,i.swapClass,!0),n):null,t&&t!==oe&&k(t,i.swapClass,!1)),r(),e(!0),a())},drop:function(t){var e,n,o=t.activeSortable,i=t.putSortable,r=t.dragEl,a=i||this.sortable,l=this.options;oe&&k(oe,l.swapClass,!1),oe&&(l.swap||i&&i.options.swap)&&r!==oe&&(a.captureAnimationState(),a!==o&&o.captureAnimationState(),n=oe,t=(e=r).parentNode,l=n.parentNode,t&&l&&!t.isEqualNode(n)&&!l.isEqualNode(e)&&(i=j(e),r=j(n),t.isEqualNode(l)&&i<r&&r++,t.insertBefore(n,t.children[i]),l.insertBefore(e,l.children[r])),a.animateAll(),a!==o&&o.animateAll())},nulling:function(){oe=null}},a(t,{pluginName:\"swap\",eventProperties:function(){return{swapItem:oe}}})}),Ht.mount(new function(){function t(o){for(var t in this)\"_\"===t.charAt(0)&&\"function\"==typeof this[t]&&(this[t]=this[t].bind(this));o.options.avoidImplicitDeselect||(o.options.supportPointer?f(document,\"pointerup\",this._deselectMultiDrag):(f(document,\"mouseup\",this._deselectMultiDrag),f(document,\"touchend\",this._deselectMultiDrag))),f(document,\"keydown\",this._checkKeyDown),f(document,\"keyup\",this._checkKeyUp),this.defaults={selectedClass:\"sortable-selected\",multiDragKey:null,avoidImplicitDeselect:!1,setData:function(t,e){var n=\"\";he.length&&se===o?he.forEach(function(t,e){n+=(e?\", \":\"\")+t.textContent}):n=e.textContent,t.setData(\"Text\",n)}}}return t.prototype={multiDragKeyDown:!1,isMultiDrag:!1,delayStartGlobal:function(t){t=t.dragEl;ce=t},delayEnded:function(){this.isMultiDrag=~he.indexOf(ce)},setupClone:function(t){var e=t.sortable,t=t.cancel;if(this.isMultiDrag){for(var n=0;n<he.length;n++)fe.push(T(he[n])),fe[n].sortableIndex=he[n].sortableIndex,fe[n].draggable=!1,fe[n].style[\"will-change\"]=\"\",k(fe[n],this.options.selectedClass,!1),he[n]===ce&&k(fe[n],this.options.chosenClass,!1);e._hideClone(),t()}},clone:function(t){var e=t.sortable,n=t.rootEl,o=t.dispatchSortableEvent,t=t.cancel;this.isMultiDrag&&(this.options.removeCloneOnHide||he.length&&se===e&&(ve(!0,n),o(\"clone\"),t()))},showClone:function(t){var e=t.cloneNowShown,n=t.rootEl,t=t.cancel;this.isMultiDrag&&(ve(!1,n),fe.forEach(function(t){R(t,\"display\",\"\")}),e(),de=!1,t())},hideClone:function(t){var e=this,n=(t.sortable,t.cloneNowHidden),t=t.cancel;this.isMultiDrag&&(fe.forEach(function(t){R(t,\"display\",\"none\"),e.options.removeCloneOnHide&&t.parentNode&&t.parentNode.removeChild(t)}),n(),de=!0,t())},dragStartGlobal:function(t){t.sortable;!this.isMultiDrag&&se&&se.multiDrag._deselectMultiDrag(),he.forEach(function(t){t.sortableIndex=j(t)}),he=he.sort(function(t,e){return t.sortableIndex-e.sortableIndex}),me=!0},dragStarted:function(t){var e,n=this,t=t.sortable;this.isMultiDrag&&(this.options.sort&&(t.captureAnimationState(),this.options.animation&&(he.forEach(function(t){t!==ce&&R(t,\"position\",\"absolute\")}),e=X(ce,!1,!0,!0),he.forEach(function(t){t!==ce&&x(t,e)}),pe=ge=!0)),t.animateAll(function(){pe=ge=!1,n.options.animation&&he.forEach(function(t){A(t)}),n.options.sort&&be()}))},dragOver:function(t){var e=t.target,n=t.completed,t=t.cancel;ge&&~he.indexOf(e)&&(n(!1),t())},revert:function(t){var n,o,e=t.fromSortable,i=t.rootEl,r=t.sortable,a=t.dragRect;1<he.length&&(he.forEach(function(t){r.addAnimationState({target:t,rect:ge?X(t):a}),A(t),t.fromRect=a,e.removeAnimationState(t)}),ge=!1,n=!this.options.removeCloneOnHide,o=i,he.forEach(function(t,e){e=o.children[t.sortableIndex+(n?Number(e):0)];e?o.insertBefore(t,e):o.appendChild(t)}))},dragOverCompleted:function(t){var e,n=t.sortable,o=t.isOwner,i=t.insertion,r=t.activeSortable,a=t.parentEl,l=t.putSortable,t=this.options;i&&(o&&r._hideClone(),pe=!1,t.animation&&1<he.length&&(ge||!o&&!r.options.sort&&!l)&&(e=X(ce,!1,!0,!0),he.forEach(function(t){t!==ce&&(x(t,e),a.appendChild(t))}),ge=!0),o||(ge||be(),1<he.length?(o=de,r._showClone(n),r.options.animation&&!de&&o&&fe.forEach(function(t){r.addAnimationState({target:t,rect:ue}),t.fromRect=ue,t.thisAnimationDuration=null})):r._showClone(n)))},dragOverAnimationCapture:function(t){var e=t.dragRect,n=t.isOwner,t=t.activeSortable;he.forEach(function(t){t.thisAnimationDuration=null}),t.options.animation&&!n&&t.multiDrag.isMultiDrag&&(ue=a({},e),e=D(ce,!0),ue.top-=e.f,ue.left-=e.e)},dragOverAnimationComplete:function(){ge&&(ge=!1,be())},drop:function(t){var o,i,r,a,n,e,l,s=t.originalEvent,c=t.rootEl,u=t.parentEl,d=t.sortable,h=t.dispatchSortableEvent,f=t.oldIndex,t=t.putSortable,p=t||this.sortable;s&&(o=this.options,i=u.children,me||(o.multiDragKey&&!this.multiDragKeyDown&&this._deselectMultiDrag(),k(ce,o.selectedClass,!~he.indexOf(ce)),~he.indexOf(ce)?(he.splice(he.indexOf(ce),1),le=null,U({sortable:d,rootEl:c,name:\"deselect\",targetEl:ce,originalEvent:s})):(he.push(ce),U({sortable:d,rootEl:c,name:\"select\",targetEl:ce,originalEvent:s}),s.shiftKey&&le&&d.el.contains(le)?(r=j(le),a=j(ce),~r&&~a&&r!==a&&function(){for(var e,t=r<a?(e=r,a):(e=a,r+1),n=o.filter;e<t;e++)~he.indexOf(i[e])||P(i[e],o.draggable,u,!1)&&(n&&(\"function\"==typeof n?n.call(d,s,i[e],d):n.split(\",\").some(function(t){return P(i[e],t.trim(),u,!1)}))||(k(i[e],o.selectedClass,!0),he.push(i[e]),U({sortable:d,rootEl:c,name:\"select\",targetEl:i[e],originalEvent:s})))}()):le=ce,se=p)),me&&this.isMultiDrag&&(ge=!1,(u[K].options.sort||u!==c)&&1<he.length&&(n=X(ce),e=j(ce,\":not(.\"+this.options.selectedClass+\")\"),!pe&&o.animation&&(ce.thisAnimationDuration=null),p.captureAnimationState(),pe||(o.animation&&(ce.fromRect=n,he.forEach(function(t){var e;t.thisAnimationDuration=null,t!==ce&&(e=ge?X(t):n,t.fromRect=e,p.addAnimationState({target:t,rect:e}))})),be(),he.forEach(function(t){i[e]?u.insertBefore(t,i[e]):u.appendChild(t),e++}),f===j(ce)&&(l=!1,he.forEach(function(t){t.sortableIndex!==j(t)&&(l=!0)}),l&&(h(\"update\"),h(\"sort\")))),he.forEach(function(t){A(t)}),p.animateAll()),se=p),(c===u||t&&\"clone\"!==t.lastPutMode)&&fe.forEach(function(t){t.parentNode&&t.parentNode.removeChild(t)}))},nullingGlobal:function(){this.isMultiDrag=me=!1,fe.length=0},destroyGlobal:function(){this._deselectMultiDrag(),p(document,\"pointerup\",this._deselectMultiDrag),p(document,\"mouseup\",this._deselectMultiDrag),p(document,\"touchend\",this._deselectMultiDrag),p(document,\"keydown\",this._checkKeyDown),p(document,\"keyup\",this._checkKeyUp)},_deselectMultiDrag:function(t){if(!(void 0!==me&&me||se!==this.sortable||t&&P(t.target,this.options.draggable,this.sortable.el,!1)||t&&0!==t.button))for(;he.length;){var e=he[0];k(e,this.options.selectedClass,!1),he.shift(),U({sortable:this.sortable,rootEl:this.sortable.el,name:\"deselect\",targetEl:e,originalEvent:t})}},_checkKeyDown:function(t){t.key===this.options.multiDragKey&&(this.multiDragKeyDown=!0)},_checkKeyUp:function(t){t.key===this.options.multiDragKey&&(this.multiDragKeyDown=!1)}},a(t,{pluginName:\"multiDrag\",utils:{select:function(t){var e=t.parentNode[K];e&&e.options.multiDrag&&!~he.indexOf(t)&&(se&&se!==e&&(se.multiDrag._deselectMultiDrag(),se=e),k(t,e.options.selectedClass,!0),he.push(t))},deselect:function(t){var e=t.parentNode[K],n=he.indexOf(t);e&&e.options.multiDrag&&~n&&(k(t,e.options.selectedClass,!1),he.splice(n,1))}},eventProperties:function(){var n=this,o=[],i=[];return he.forEach(function(t){var e;o.push({multiDragElement:t,index:t.sortableIndex}),e=ge&&t!==ce?-1:ge?j(t,\":not(.\"+n.options.selectedClass+\")\"):j(t),i.push({multiDragElement:t,index:e})}),{items:e(he),clones:[].concat(fe),oldIndicies:o,newIndicies:i}},optionListeners:{multiDragKey:function(t){return\"ctrl\"===(t=t.toLowerCase())?t=\"Control\":1<t.length&&(t=t.charAt(0).toUpperCase()+t.substr(1)),t}}})}),Ht});","/*!\n* metismenu https://github.com/onokumus/metismenu#readme\n* A collapsible jQuery menu plugin\n* @version 3.0.7\n* @author Osman Nuri Okumus <onokumus@gmail.com> (https://github.com/onokumus)\n* @license: MIT \n*/\n!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t(require(\"jquery\")):\"function\"==typeof define&&define.amd?define([\"jquery\"],t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).metisMenu=t(e.$)}(this,(function(e){\"use strict\";function t(e){return e&&\"object\"==typeof e&&\"default\"in e?e:{default:e}}var n=t(e);const i=(e=>{const t=\"transitionend\",n={TRANSITION_END:\"mmTransitionEnd\",triggerTransitionEnd(n){e(n).trigger(t)},supportsTransitionEnd:()=>Boolean(t)};function i(t){let i=!1;return e(this).one(n.TRANSITION_END,(()=>{i=!0})),setTimeout((()=>{i||n.triggerTransitionEnd(this)}),t),this}return e.fn.mmEmulateTransitionEnd=i,e.event.special[n.TRANSITION_END]={bindType:t,delegateType:t,handle(t){if(e(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}},n})(n.default),s=\"metisMenu\",r=\"metisMenu\",a=n.default.fn[s],o={toggle:!0,preventDefault:!0,triggerElement:\"a\",parentTrigger:\"li\",subMenu:\"ul\"},l={SHOW:\"show.metisMenu\",SHOWN:\"shown.metisMenu\",HIDE:\"hide.metisMenu\",HIDDEN:\"hidden.metisMenu\",CLICK_DATA_API:\"click.metisMenu.data-api\"},d=\"metismenu\",g=\"mm-active\",h=\"mm-show\",u=\"mm-collapse\",f=\"mm-collapsing\";class c{constructor(e,t){this.element=e,this.config={...o,...t},this.transitioning=null,this.init()}init(){const e=this,t=this.config,i=n.default(this.element);i.addClass(d),i.find(`${t.parentTrigger}.${g}`).children(t.triggerElement).attr(\"aria-expanded\",\"true\"),i.find(`${t.parentTrigger}.${g}`).parents(t.parentTrigger).addClass(g),i.find(`${t.parentTrigger}.${g}`).parents(t.parentTrigger).children(t.triggerElement).attr(\"aria-expanded\",\"true\"),i.find(`${t.parentTrigger}.${g}`).has(t.subMenu).children(t.subMenu).addClass(`${u} ${h}`),i.find(t.parentTrigger).not(`.${g}`).has(t.subMenu).children(t.subMenu).addClass(u),i.find(t.parentTrigger).children(t.triggerElement).on(l.CLICK_DATA_API,(function(i){const s=n.default(this);if(\"true\"===s.attr(\"aria-disabled\"))return;t.preventDefault&&\"#\"===s.attr(\"href\")&&i.preventDefault();const r=s.parent(t.parentTrigger),a=r.siblings(t.parentTrigger),o=a.children(t.triggerElement);r.hasClass(g)?(s.attr(\"aria-expanded\",\"false\"),e.removeActive(r)):(s.attr(\"aria-expanded\",\"true\"),e.setActive(r),t.toggle&&(e.removeActive(a),o.attr(\"aria-expanded\",\"false\"))),t.onTransitionStart&&t.onTransitionStart(i)}))}setActive(e){n.default(e).addClass(g);const t=n.default(e).children(this.config.subMenu);t.length>0&&!t.hasClass(h)&&this.show(t)}removeActive(e){n.default(e).removeClass(g);const t=n.default(e).children(`${this.config.subMenu}.${h}`);t.length>0&&this.hide(t)}show(e){if(this.transitioning||n.default(e).hasClass(f))return;const t=n.default(e),s=n.default.Event(l.SHOW);if(t.trigger(s),s.isDefaultPrevented())return;if(t.parent(this.config.parentTrigger).addClass(g),this.config.toggle){const e=t.parent(this.config.parentTrigger).siblings().children(`${this.config.subMenu}.${h}`);this.hide(e)}t.removeClass(u).addClass(f).height(0),this.setTransitioning(!0);t.height(e[0].scrollHeight).one(i.TRANSITION_END,(()=>{this.config&&this.element&&(t.removeClass(f).addClass(`${u} ${h}`).height(\"\"),this.setTransitioning(!1),t.trigger(l.SHOWN))})).mmEmulateTransitionEnd(350)}hide(e){if(this.transitioning||!n.default(e).hasClass(h))return;const t=n.default(e),s=n.default.Event(l.HIDE);if(t.trigger(s),s.isDefaultPrevented())return;t.parent(this.config.parentTrigger).removeClass(g),t.height(t.height())[0].offsetHeight,t.addClass(f).removeClass(u).removeClass(h),this.setTransitioning(!0);const r=()=>{this.config&&this.element&&(this.transitioning&&this.config.onTransitionEnd&&this.config.onTransitionEnd(),this.setTransitioning(!1),t.trigger(l.HIDDEN),t.removeClass(f).addClass(u))};0===t.height()||\"none\"===t.css(\"display\")?r():t.height(0).one(i.TRANSITION_END,r).mmEmulateTransitionEnd(350)}setTransitioning(e){this.transitioning=e}dispose(){n.default.removeData(this.element,r),n.default(this.element).find(this.config.parentTrigger).children(this.config.triggerElement).off(l.CLICK_DATA_API),this.transitioning=null,this.config=null,this.element=null}static jQueryInterface(e){return this.each((function(){const t=n.default(this);let i=t.data(r);const s={...o,...t.data(),...\"object\"==typeof e&&e?e:{}};if(i||(i=new c(this,s),t.data(r,i)),\"string\"==typeof e){if(void 0===i[e])throw new Error(`No method named \"${e}\"`);i[e]()}}))}}return n.default.fn[s]=c.jQueryInterface,n.default.fn[s].Constructor=c,n.default.fn[s].noConflict=()=>(n.default.fn[s]=a,c.jQueryInterface),c}));\n","/*!\n * perfect-scrollbar v1.5.3\n * Copyright 2021 Hyunje Jun, MDBootstrap and Contributors\n * Licensed under MIT\n */(function(a,b){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=b():\"function\"==typeof define&&define.amd?define(b):(a=a||self,a.PerfectScrollbar=b())})(this,function(){'use strict';var u=Math.abs,v=Math.floor;function a(a){return getComputedStyle(a)}function b(a,b){for(var c in b){var d=b[c];\"number\"==typeof d&&(d+=\"px\"),a.style[c]=d}return a}function c(a){var b=document.createElement(\"div\");return b.className=a,b}function d(a,b){if(!w)throw new Error(\"No element matching method supported\");return w.call(a,b)}function e(a){a.remove?a.remove():a.parentNode&&a.parentNode.removeChild(a)}function f(a,b){return Array.prototype.filter.call(a.children,function(a){return d(a,b)})}function g(a,b){var c=a.element.classList,d=z.state.scrolling(b);c.contains(d)?clearTimeout(A[b]):c.add(d)}function h(a,b){A[b]=setTimeout(function(){return a.isAlive&&a.element.classList.remove(z.state.scrolling(b))},a.settings.scrollingThreshold)}function j(a,b){g(a,b),h(a,b)}function k(a){if(\"function\"==typeof window.CustomEvent)return new CustomEvent(a);var b=document.createEvent(\"CustomEvent\");return b.initCustomEvent(a,!1,!1,void 0),b}function l(a,b,c,d,e){void 0===d&&(d=!0),void 0===e&&(e=!1);var f;if(\"top\"===b)f=[\"contentHeight\",\"containerHeight\",\"scrollTop\",\"y\",\"up\",\"down\"];else if(\"left\"===b)f=[\"contentWidth\",\"containerWidth\",\"scrollLeft\",\"x\",\"left\",\"right\"];else throw new Error(\"A proper axis should be provided\");m(a,c,f,d,e)}function m(a,b,c,d,e){var f=c[0],g=c[1],h=c[2],i=c[3],l=c[4],m=c[5];void 0===d&&(d=!0),void 0===e&&(e=!1);var n=a.element;// reset reach\na.reach[i]=null,1>n[h]&&(a.reach[i]=\"start\"),n[h]>a[f]-a[g]-1&&(a.reach[i]=\"end\"),b&&(n.dispatchEvent(k(\"ps-scroll-\"+i)),0>b?n.dispatchEvent(k(\"ps-scroll-\"+l)):0<b&&n.dispatchEvent(k(\"ps-scroll-\"+m)),d&&j(a,i)),a.reach[i]&&(b||e)&&n.dispatchEvent(k(\"ps-\"+i+\"-reach-\"+a.reach[i]))}function n(a){return parseInt(a,10)||0}function o(a){return d(a,\"input,[contenteditable]\")||d(a,\"select,[contenteditable]\")||d(a,\"textarea,[contenteditable]\")||d(a,\"button,[contenteditable]\")}function p(b){var c=a(b);return n(c.width)+n(c.paddingLeft)+n(c.paddingRight)+n(c.borderLeftWidth)+n(c.borderRightWidth)}function q(a){var b=Math.round,c=a.element,d=v(c.scrollTop),g=c.getBoundingClientRect();a.containerWidth=b(g.width),a.containerHeight=b(g.height),a.contentWidth=c.scrollWidth,a.contentHeight=c.scrollHeight,c.contains(a.scrollbarXRail)||(f(c,z.element.rail(\"x\")).forEach(function(a){return e(a)}),c.appendChild(a.scrollbarXRail)),c.contains(a.scrollbarYRail)||(f(c,z.element.rail(\"y\")).forEach(function(a){return e(a)}),c.appendChild(a.scrollbarYRail)),!a.settings.suppressScrollX&&a.containerWidth+a.settings.scrollXMarginOffset<a.contentWidth?(a.scrollbarXActive=!0,a.railXWidth=a.containerWidth-a.railXMarginWidth,a.railXRatio=a.containerWidth/a.railXWidth,a.scrollbarXWidth=r(a,n(a.railXWidth*a.containerWidth/a.contentWidth)),a.scrollbarXLeft=n((a.negativeScrollAdjustment+c.scrollLeft)*(a.railXWidth-a.scrollbarXWidth)/(a.contentWidth-a.containerWidth))):a.scrollbarXActive=!1,!a.settings.suppressScrollY&&a.containerHeight+a.settings.scrollYMarginOffset<a.contentHeight?(a.scrollbarYActive=!0,a.railYHeight=a.containerHeight-a.railYMarginHeight,a.railYRatio=a.containerHeight/a.railYHeight,a.scrollbarYHeight=r(a,n(a.railYHeight*a.containerHeight/a.contentHeight)),a.scrollbarYTop=n(d*(a.railYHeight-a.scrollbarYHeight)/(a.contentHeight-a.containerHeight))):a.scrollbarYActive=!1,a.scrollbarXLeft>=a.railXWidth-a.scrollbarXWidth&&(a.scrollbarXLeft=a.railXWidth-a.scrollbarXWidth),a.scrollbarYTop>=a.railYHeight-a.scrollbarYHeight&&(a.scrollbarYTop=a.railYHeight-a.scrollbarYHeight),s(c,a),a.scrollbarXActive?c.classList.add(z.state.active(\"x\")):(c.classList.remove(z.state.active(\"x\")),a.scrollbarXWidth=0,a.scrollbarXLeft=0,c.scrollLeft=!0===a.isRtl?a.contentWidth:0),a.scrollbarYActive?c.classList.add(z.state.active(\"y\")):(c.classList.remove(z.state.active(\"y\")),a.scrollbarYHeight=0,a.scrollbarYTop=0,c.scrollTop=0)}function r(a,b){var c=Math.min,d=Math.max;return a.settings.minScrollbarLength&&(b=d(b,a.settings.minScrollbarLength)),a.settings.maxScrollbarLength&&(b=c(b,a.settings.maxScrollbarLength)),b}function s(a,c){var d={width:c.railXWidth},e=v(a.scrollTop);d.left=c.isRtl?c.negativeScrollAdjustment+a.scrollLeft+c.containerWidth-c.contentWidth:a.scrollLeft,c.isScrollbarXUsingBottom?d.bottom=c.scrollbarXBottom-e:d.top=c.scrollbarXTop+e,b(c.scrollbarXRail,d);var f={top:e,height:c.railYHeight};c.isScrollbarYUsingRight?c.isRtl?f.right=c.contentWidth-(c.negativeScrollAdjustment+a.scrollLeft)-c.scrollbarYRight-c.scrollbarYOuterWidth-9:f.right=c.scrollbarYRight-a.scrollLeft:c.isRtl?f.left=c.negativeScrollAdjustment+a.scrollLeft+2*c.containerWidth-c.contentWidth-c.scrollbarYLeft-c.scrollbarYOuterWidth:f.left=c.scrollbarYLeft+a.scrollLeft,b(c.scrollbarYRail,f),b(c.scrollbarX,{left:c.scrollbarXLeft,width:c.scrollbarXWidth-c.railBorderXWidth}),b(c.scrollbarY,{top:c.scrollbarYTop,height:c.scrollbarYHeight-c.railBorderYWidth})}function t(a,b){function c(b){b.touches&&b.touches[0]&&(b[k]=b.touches[0].pageY),s[o]=t+v*(b[k]-u),g(a,p),q(a),b.stopPropagation(),b.type.startsWith(\"touch\")&&1<b.changedTouches.length&&b.preventDefault()}function d(){h(a,p),a[r].classList.remove(z.state.clicking),a.event.unbind(a.ownerDocument,\"mousemove\",c)}function f(b,e){t=s[o],e&&b.touches&&(b[k]=b.touches[0].pageY),u=b[k],v=(a[j]-a[i])/(a[l]-a[n]),e?a.event.bind(a.ownerDocument,\"touchmove\",c):(a.event.bind(a.ownerDocument,\"mousemove\",c),a.event.once(a.ownerDocument,\"mouseup\",d),b.preventDefault()),a[r].classList.add(z.state.clicking),b.stopPropagation()}var i=b[0],j=b[1],k=b[2],l=b[3],m=b[4],n=b[5],o=b[6],p=b[7],r=b[8],s=a.element,t=null,u=null,v=null;a.event.bind(a[m],\"mousedown\",function(a){f(a)}),a.event.bind(a[m],\"touchstart\",function(a){f(a,!0)})}var w=\"undefined\"!=typeof Element&&(Element.prototype.matches||Element.prototype.webkitMatchesSelector||Element.prototype.mozMatchesSelector||Element.prototype.msMatchesSelector),z={main:\"ps\",rtl:\"ps__rtl\",element:{thumb:function(a){return\"ps__thumb-\"+a},rail:function(a){return\"ps__rail-\"+a},consuming:\"ps__child--consume\"},state:{focus:\"ps--focus\",clicking:\"ps--clicking\",active:function(a){return\"ps--active-\"+a},scrolling:function(a){return\"ps--scrolling-\"+a}}},A={x:null,y:null},B=function(a){this.element=a,this.handlers={}},C={isEmpty:{configurable:!0}};B.prototype.bind=function(a,b){\"undefined\"==typeof this.handlers[a]&&(this.handlers[a]=[]),this.handlers[a].push(b),this.element.addEventListener(a,b,!1)},B.prototype.unbind=function(a,b){var c=this;this.handlers[a]=this.handlers[a].filter(function(d){return!!(b&&d!==b)||(c.element.removeEventListener(a,d,!1),!1)})},B.prototype.unbindAll=function(){for(var a in this.handlers)this.unbind(a)},C.isEmpty.get=function(){var a=this;return Object.keys(this.handlers).every(function(b){return 0===a.handlers[b].length})},Object.defineProperties(B.prototype,C);var D=function(){this.eventElements=[]};D.prototype.eventElement=function(a){var b=this.eventElements.filter(function(b){return b.element===a})[0];return b||(b=new B(a),this.eventElements.push(b)),b},D.prototype.bind=function(a,b,c){this.eventElement(a).bind(b,c)},D.prototype.unbind=function(a,b,c){var d=this.eventElement(a);d.unbind(b,c),d.isEmpty&&this.eventElements.splice(this.eventElements.indexOf(d),1)},D.prototype.unbindAll=function(){this.eventElements.forEach(function(a){return a.unbindAll()}),this.eventElements=[]},D.prototype.once=function(a,b,c){var d=this.eventElement(a),e=function(a){d.unbind(b,e),c(a)};d.bind(b,e)};var E={isWebKit:\"undefined\"!=typeof document&&\"WebkitAppearance\"in document.documentElement.style,supportsTouch:\"undefined\"!=typeof window&&(\"ontouchstart\"in window||\"maxTouchPoints\"in window.navigator&&0<window.navigator.maxTouchPoints||window.DocumentTouch&&document instanceof window.DocumentTouch),supportsIePointer:\"undefined\"!=typeof navigator&&navigator.msMaxTouchPoints,isChrome:\"undefined\"!=typeof navigator&&/Chrome/i.test(navigator&&navigator.userAgent)},F=function(){return{handlers:[\"click-rail\",\"drag-thumb\",\"keyboard\",\"wheel\",\"touch\"],maxScrollbarLength:null,minScrollbarLength:null,scrollingThreshold:1e3,scrollXMarginOffset:0,scrollYMarginOffset:0,suppressScrollX:!1,suppressScrollY:!1,swipeEasing:!0,useBothWheelAxes:!1,wheelPropagation:!0,wheelSpeed:1}},G={\"click-rail\":function(a){a.element;a.event.bind(a.scrollbarY,\"mousedown\",function(a){return a.stopPropagation()}),a.event.bind(a.scrollbarYRail,\"mousedown\",function(b){var c=b.pageY-window.pageYOffset-a.scrollbarYRail.getBoundingClientRect().top,d=c>a.scrollbarYTop?1:-1;a.element.scrollTop+=d*a.containerHeight,q(a),b.stopPropagation()}),a.event.bind(a.scrollbarX,\"mousedown\",function(a){return a.stopPropagation()}),a.event.bind(a.scrollbarXRail,\"mousedown\",function(b){var c=b.pageX-window.pageXOffset-a.scrollbarXRail.getBoundingClientRect().left,d=c>a.scrollbarXLeft?1:-1;a.element.scrollLeft+=d*a.containerWidth,q(a),b.stopPropagation()})},\"drag-thumb\":function(a){t(a,[\"containerWidth\",\"contentWidth\",\"pageX\",\"railXWidth\",\"scrollbarX\",\"scrollbarXWidth\",\"scrollLeft\",\"x\",\"scrollbarXRail\"]),t(a,[\"containerHeight\",\"contentHeight\",\"pageY\",\"railYHeight\",\"scrollbarY\",\"scrollbarYHeight\",\"scrollTop\",\"y\",\"scrollbarYRail\"])},keyboard:function(a){function b(b,d){var e=v(c.scrollTop);if(0===b){if(!a.scrollbarYActive)return!1;if(0===e&&0<d||e>=a.contentHeight-a.containerHeight&&0>d)return!a.settings.wheelPropagation}var f=c.scrollLeft;if(0===d){if(!a.scrollbarXActive)return!1;if(0===f&&0>b||f>=a.contentWidth-a.containerWidth&&0<b)return!a.settings.wheelPropagation}return!0}var c=a.element,f=function(){return d(c,\":hover\")},g=function(){return d(a.scrollbarX,\":focus\")||d(a.scrollbarY,\":focus\")};a.event.bind(a.ownerDocument,\"keydown\",function(d){if(!(d.isDefaultPrevented&&d.isDefaultPrevented()||d.defaultPrevented)&&(f()||g())){var e=document.activeElement?document.activeElement:a.ownerDocument.activeElement;if(e){if(\"IFRAME\"===e.tagName)e=e.contentDocument.activeElement;else// go deeper if element is a webcomponent\nfor(;e.shadowRoot;)e=e.shadowRoot.activeElement;if(o(e))return}var h=0,i=0;switch(d.which){case 37:h=d.metaKey?-a.contentWidth:d.altKey?-a.containerWidth:-30;break;case 38:i=d.metaKey?a.contentHeight:d.altKey?a.containerHeight:30;break;case 39:h=d.metaKey?a.contentWidth:d.altKey?a.containerWidth:30;break;case 40:i=d.metaKey?-a.contentHeight:d.altKey?-a.containerHeight:-30;break;case 32:i=d.shiftKey?a.containerHeight:-a.containerHeight;break;case 33:i=a.containerHeight;break;case 34:i=-a.containerHeight;break;case 36:i=a.contentHeight;break;case 35:i=-a.contentHeight;break;default:return;}a.settings.suppressScrollX&&0!==h||a.settings.suppressScrollY&&0!==i||(c.scrollTop-=i,c.scrollLeft+=h,q(a),b(h,i)&&d.preventDefault())}})},wheel:function(b){function c(a,c){var d,e=v(h.scrollTop),f=0===h.scrollTop,g=e+h.offsetHeight===h.scrollHeight,i=0===h.scrollLeft,j=h.scrollLeft+h.offsetWidth===h.scrollWidth;return d=u(c)>u(a)?f||g:i||j,!d||!b.settings.wheelPropagation}function d(a){var b=a.deltaX,c=-1*a.deltaY;return(\"undefined\"==typeof b||\"undefined\"==typeof c)&&(b=-1*a.wheelDeltaX/6,c=a.wheelDeltaY/6),a.deltaMode&&1===a.deltaMode&&(b*=10,c*=10),b!==b&&c!==c/* NaN checks */&&(b=0,c=a.wheelDelta),a.shiftKey?[-c,-b]:[b,c]}function f(b,c,d){// FIXME: this is a workaround for <select> issue in FF and IE #571\nif(!E.isWebKit&&h.querySelector(\"select:focus\"))return!0;if(!h.contains(b))return!1;for(var e=b;e&&e!==h;){if(e.classList.contains(z.element.consuming))return!0;var f=a(e);// if deltaY && vertical scrollable\nif(d&&f.overflowY.match(/(scroll|auto)/)){var g=e.scrollHeight-e.clientHeight;if(0<g&&(0<e.scrollTop&&0>d||e.scrollTop<g&&0<d))return!0}// if deltaX && horizontal scrollable\nif(c&&f.overflowX.match(/(scroll|auto)/)){var i=e.scrollWidth-e.clientWidth;if(0<i&&(0<e.scrollLeft&&0>c||e.scrollLeft<i&&0<c))return!0}e=e.parentNode}return!1}function g(a){var e=d(a),g=e[0],i=e[1];if(!f(a.target,g,i)){var j=!1;b.settings.useBothWheelAxes?b.scrollbarYActive&&!b.scrollbarXActive?(i?h.scrollTop-=i*b.settings.wheelSpeed:h.scrollTop+=g*b.settings.wheelSpeed,j=!0):b.scrollbarXActive&&!b.scrollbarYActive&&(g?h.scrollLeft+=g*b.settings.wheelSpeed:h.scrollLeft-=i*b.settings.wheelSpeed,j=!0):(h.scrollTop-=i*b.settings.wheelSpeed,h.scrollLeft+=g*b.settings.wheelSpeed),q(b),j=j||c(g,i),j&&!a.ctrlKey&&(a.stopPropagation(),a.preventDefault())}}var h=b.element;\"undefined\"==typeof window.onwheel?\"undefined\"!=typeof window.onmousewheel&&b.event.bind(h,\"mousewheel\",g):b.event.bind(h,\"wheel\",g)},touch:function(b){function c(a,c){var d=v(l.scrollTop),e=l.scrollLeft,f=u(a),g=u(c);if(g>f){// user is perhaps trying to swipe up/down the page\nif(0>c&&d===b.contentHeight-b.containerHeight||0<c&&0===d)// set prevent for mobile Chrome refresh\nreturn 0===window.scrollY&&0<c&&E.isChrome;}else if(f>g&&(0>a&&e===b.contentWidth-b.containerWidth||0<a&&0===e))// user is perhaps trying to swipe left/right across the page\nreturn!0;return!0}function d(a,c){l.scrollTop-=c,l.scrollLeft-=a,q(b)}function f(a){return a.targetTouches?a.targetTouches[0]:a}function g(a){return!(a.pointerType&&\"pen\"===a.pointerType&&0===a.buttons)&&(!!(a.targetTouches&&1===a.targetTouches.length)||!!(a.pointerType&&\"mouse\"!==a.pointerType&&a.pointerType!==a.MSPOINTER_TYPE_MOUSE))}function h(a){if(g(a)){var b=f(a);m.pageX=b.pageX,m.pageY=b.pageY,n=new Date().getTime(),null!==p&&clearInterval(p)}}function i(b,c,d){if(!l.contains(b))return!1;for(var e=b;e&&e!==l;){if(e.classList.contains(z.element.consuming))return!0;var f=a(e);// if deltaY && vertical scrollable\nif(d&&f.overflowY.match(/(scroll|auto)/)){var g=e.scrollHeight-e.clientHeight;if(0<g&&(0<e.scrollTop&&0>d||e.scrollTop<g&&0<d))return!0}// if deltaX && horizontal scrollable\nif(c&&f.overflowX.match(/(scroll|auto)/)){var h=e.scrollWidth-e.clientWidth;if(0<h&&(0<e.scrollLeft&&0>c||e.scrollLeft<h&&0<c))return!0}e=e.parentNode}return!1}function j(a){if(g(a)){var b=f(a),e={pageX:b.pageX,pageY:b.pageY},h=e.pageX-m.pageX,j=e.pageY-m.pageY;if(i(a.target,h,j))return;d(h,j),m=e;var k=new Date().getTime(),l=k-n;0<l&&(o.x=h/l,o.y=j/l,n=k),c(h,j)&&a.preventDefault()}}function k(){b.settings.swipeEasing&&(clearInterval(p),p=setInterval(function(){return b.isInitialized?void clearInterval(p):o.x||o.y?.01>u(o.x)&&.01>u(o.y)?void clearInterval(p):b.element?void(d(30*o.x,30*o.y),o.x*=.8,o.y*=.8):void clearInterval(p):void clearInterval(p)},10))}if(E.supportsTouch||E.supportsIePointer){var l=b.element,m={},n=0,o={},p=null;E.supportsTouch?(b.event.bind(l,\"touchstart\",h),b.event.bind(l,\"touchmove\",j),b.event.bind(l,\"touchend\",k)):E.supportsIePointer&&(window.PointerEvent?(b.event.bind(l,\"pointerdown\",h),b.event.bind(l,\"pointermove\",j),b.event.bind(l,\"pointerup\",k)):window.MSPointerEvent&&(b.event.bind(l,\"MSPointerDown\",h),b.event.bind(l,\"MSPointerMove\",j),b.event.bind(l,\"MSPointerUp\",k)))}}},H=function(d,e){var f=this;if(void 0===e&&(e={}),\"string\"==typeof d&&(d=document.querySelector(d)),!d||!d.nodeName)throw new Error(\"no element is specified to initialize PerfectScrollbar\");for(var g in this.element=d,d.classList.add(z.main),this.settings=F(),e)this.settings[g]=e[g];this.containerWidth=null,this.containerHeight=null,this.contentWidth=null,this.contentHeight=null;var h=function(){return d.classList.add(z.state.focus)},i=function(){return d.classList.remove(z.state.focus)};this.isRtl=\"rtl\"===a(d).direction,!0===this.isRtl&&d.classList.add(z.rtl),this.isNegativeScroll=function(){var a=d.scrollLeft,b=null;return d.scrollLeft=-1,b=0>d.scrollLeft,d.scrollLeft=a,b}(),this.negativeScrollAdjustment=this.isNegativeScroll?d.scrollWidth-d.clientWidth:0,this.event=new D,this.ownerDocument=d.ownerDocument||document,this.scrollbarXRail=c(z.element.rail(\"x\")),d.appendChild(this.scrollbarXRail),this.scrollbarX=c(z.element.thumb(\"x\")),this.scrollbarXRail.appendChild(this.scrollbarX),this.scrollbarX.setAttribute(\"tabindex\",0),this.event.bind(this.scrollbarX,\"focus\",h),this.event.bind(this.scrollbarX,\"blur\",i),this.scrollbarXActive=null,this.scrollbarXWidth=null,this.scrollbarXLeft=null;var j=a(this.scrollbarXRail);this.scrollbarXBottom=parseInt(j.bottom,10),isNaN(this.scrollbarXBottom)?(this.isScrollbarXUsingBottom=!1,this.scrollbarXTop=n(j.top)):this.isScrollbarXUsingBottom=!0,this.railBorderXWidth=n(j.borderLeftWidth)+n(j.borderRightWidth),b(this.scrollbarXRail,{display:\"block\"}),this.railXMarginWidth=n(j.marginLeft)+n(j.marginRight),b(this.scrollbarXRail,{display:\"\"}),this.railXWidth=null,this.railXRatio=null,this.scrollbarYRail=c(z.element.rail(\"y\")),d.appendChild(this.scrollbarYRail),this.scrollbarY=c(z.element.thumb(\"y\")),this.scrollbarYRail.appendChild(this.scrollbarY),this.scrollbarY.setAttribute(\"tabindex\",0),this.event.bind(this.scrollbarY,\"focus\",h),this.event.bind(this.scrollbarY,\"blur\",i),this.scrollbarYActive=null,this.scrollbarYHeight=null,this.scrollbarYTop=null;var k=a(this.scrollbarYRail);this.scrollbarYRight=parseInt(k.right,10),isNaN(this.scrollbarYRight)?(this.isScrollbarYUsingRight=!1,this.scrollbarYLeft=n(k.left)):this.isScrollbarYUsingRight=!0,this.scrollbarYOuterWidth=this.isRtl?p(this.scrollbarY):null,this.railBorderYWidth=n(k.borderTopWidth)+n(k.borderBottomWidth),b(this.scrollbarYRail,{display:\"block\"}),this.railYMarginHeight=n(k.marginTop)+n(k.marginBottom),b(this.scrollbarYRail,{display:\"\"}),this.railYHeight=null,this.railYRatio=null,this.reach={x:0>=d.scrollLeft?\"start\":d.scrollLeft>=this.contentWidth-this.containerWidth?\"end\":null,y:0>=d.scrollTop?\"start\":d.scrollTop>=this.contentHeight-this.containerHeight?\"end\":null},this.isAlive=!0,this.settings.handlers.forEach(function(a){return G[a](f)}),this.lastScrollTop=v(d.scrollTop),this.lastScrollLeft=d.scrollLeft,this.event.bind(this.element,\"scroll\",function(a){return f.onScroll(a)}),q(this)};return H.prototype.update=function(){this.isAlive&&(// Recalcuate negative scrollLeft adjustment\n// Recalculate rail margins\n// Hide scrollbars not to affect scrollWidth and scrollHeight\nthis.negativeScrollAdjustment=this.isNegativeScroll?this.element.scrollWidth-this.element.clientWidth:0,b(this.scrollbarXRail,{display:\"block\"}),b(this.scrollbarYRail,{display:\"block\"}),this.railXMarginWidth=n(a(this.scrollbarXRail).marginLeft)+n(a(this.scrollbarXRail).marginRight),this.railYMarginHeight=n(a(this.scrollbarYRail).marginTop)+n(a(this.scrollbarYRail).marginBottom),b(this.scrollbarXRail,{display:\"none\"}),b(this.scrollbarYRail,{display:\"none\"}),q(this),l(this,\"top\",0,!1,!0),l(this,\"left\",0,!1,!0),b(this.scrollbarXRail,{display:\"\"}),b(this.scrollbarYRail,{display:\"\"}))},H.prototype.onScroll=function(){this.isAlive&&(q(this),l(this,\"top\",this.element.scrollTop-this.lastScrollTop),l(this,\"left\",this.element.scrollLeft-this.lastScrollLeft),this.lastScrollTop=v(this.element.scrollTop),this.lastScrollLeft=this.element.scrollLeft)},H.prototype.destroy=function(){this.isAlive&&(// unset elements\nthis.event.unbindAll(),e(this.scrollbarX),e(this.scrollbarY),e(this.scrollbarXRail),e(this.scrollbarYRail),this.removePsClasses(),this.element=null,this.scrollbarX=null,this.scrollbarY=null,this.scrollbarXRail=null,this.scrollbarYRail=null,this.isAlive=!1)},H.prototype.removePsClasses=function(){this.element.className=this.element.className.split(\" \").filter(function(a){return!a.match(/^ps([-_].+|)$/)}).join(\" \")},H});\n","!function(i){\"use strict\";\"function\"==typeof define&&define.amd?define([\"jquery\"],i):\"undefined\"!=typeof exports?module.exports=i(require(\"jquery\")):i(jQuery)}(function(i){\"use strict\";var e=window.Slick||{};(e=function(){var e=0;return function(t,o){var s,n=this;n.defaults={accessibility:!0,adaptiveHeight:!1,appendArrows:i(t),appendDots:i(t),arrows:!0,asNavFor:null,prevArrow:'<button class=\"slick-prev\" aria-label=\"Previous\" type=\"button\">Previous</button>',nextArrow:'<button class=\"slick-next\" aria-label=\"Next\" type=\"button\">Next</button>',autoplay:!1,autoplaySpeed:3e3,centerMode:!1,centerPadding:\"50px\",cssEase:\"ease\",customPaging:function(e,t){return i('<button type=\"button\" />').text(t+1)},dots:!1,dotsClass:\"slick-dots\",draggable:!0,easing:\"linear\",edgeFriction:.35,fade:!1,focusOnSelect:!1,focusOnChange:!1,infinite:!0,initialSlide:0,lazyLoad:\"ondemand\",mobileFirst:!1,pauseOnHover:!0,pauseOnFocus:!0,pauseOnDotsHover:!1,respondTo:\"window\",responsive:null,rows:1,rtl:!1,slide:\"\",slidesPerRow:1,slidesToShow:1,slidesToScroll:1,speed:500,swipe:!0,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,useTransform:!0,variableWidth:!1,vertical:!1,verticalSwiping:!1,waitForAnimate:!0,zIndex:1e3},n.initials={animating:!1,dragging:!1,autoPlayTimer:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,$dots:null,listWidth:null,listHeight:null,loadIndex:0,$nextArrow:null,$prevArrow:null,scrolling:!1,slideCount:null,slideWidth:null,$slideTrack:null,$slides:null,sliding:!1,slideOffset:0,swipeLeft:null,swiping:!1,$list:null,touchObject:{},transformsEnabled:!1,unslicked:!1},i.extend(n,n.initials),n.activeBreakpoint=null,n.animType=null,n.animProp=null,n.breakpoints=[],n.breakpointSettings=[],n.cssTransitions=!1,n.focussed=!1,n.interrupted=!1,n.hidden=\"hidden\",n.paused=!0,n.positionProp=null,n.respondTo=null,n.rowCount=1,n.shouldClick=!0,n.$slider=i(t),n.$slidesCache=null,n.transformType=null,n.transitionType=null,n.visibilityChange=\"visibilitychange\",n.windowWidth=0,n.windowTimer=null,s=i(t).data(\"slick\")||{},n.options=i.extend({},n.defaults,o,s),n.currentSlide=n.options.initialSlide,n.originalSettings=n.options,void 0!==document.mozHidden?(n.hidden=\"mozHidden\",n.visibilityChange=\"mozvisibilitychange\"):void 0!==document.webkitHidden&&(n.hidden=\"webkitHidden\",n.visibilityChange=\"webkitvisibilitychange\"),n.autoPlay=i.proxy(n.autoPlay,n),n.autoPlayClear=i.proxy(n.autoPlayClear,n),n.autoPlayIterator=i.proxy(n.autoPlayIterator,n),n.changeSlide=i.proxy(n.changeSlide,n),n.clickHandler=i.proxy(n.clickHandler,n),n.selectHandler=i.proxy(n.selectHandler,n),n.setPosition=i.proxy(n.setPosition,n),n.swipeHandler=i.proxy(n.swipeHandler,n),n.dragHandler=i.proxy(n.dragHandler,n),n.keyHandler=i.proxy(n.keyHandler,n),n.instanceUid=e++,n.htmlExpr=/^(?:\\s*(<[\\w\\W]+>)[^>]*)$/,n.registerBreakpoints(),n.init(!0)}}()).prototype.activateADA=function(){this.$slideTrack.find(\".slick-active\").attr({\"aria-hidden\":\"false\"}).find(\"a, input, button, select\").attr({tabindex:\"0\"})},e.prototype.addSlide=e.prototype.slickAdd=function(e,t,o){var s=this;if(\"boolean\"==typeof t)o=t,t=null;else if(t<0||t>=s.slideCount)return!1;s.unload(),\"number\"==typeof t?0===t&&0===s.$slides.length?i(e).appendTo(s.$slideTrack):o?i(e).insertBefore(s.$slides.eq(t)):i(e).insertAfter(s.$slides.eq(t)):!0===o?i(e).prependTo(s.$slideTrack):i(e).appendTo(s.$slideTrack),s.$slides=s.$slideTrack.children(this.options.slide),s.$slideTrack.children(this.options.slide).detach(),s.$slideTrack.append(s.$slides),s.$slides.each(function(e,t){i(t).attr(\"data-slick-index\",e)}),s.$slidesCache=s.$slides,s.reinit()},e.prototype.animateHeight=function(){var i=this;if(1===i.options.slidesToShow&&!0===i.options.adaptiveHeight&&!1===i.options.vertical){var e=i.$slides.eq(i.currentSlide).outerHeight(!0);i.$list.animate({height:e},i.options.speed)}},e.prototype.animateSlide=function(e,t){var o={},s=this;s.animateHeight(),!0===s.options.rtl&&!1===s.options.vertical&&(e=-e),!1===s.transformsEnabled?!1===s.options.vertical?s.$slideTrack.animate({left:e},s.options.speed,s.options.easing,t):s.$slideTrack.animate({top:e},s.options.speed,s.options.easing,t):!1===s.cssTransitions?(!0===s.options.rtl&&(s.currentLeft=-s.currentLeft),i({animStart:s.currentLeft}).animate({animStart:e},{duration:s.options.speed,easing:s.options.easing,step:function(i){i=Math.ceil(i),!1===s.options.vertical?(o[s.animType]=\"translate(\"+i+\"px, 0px)\",s.$slideTrack.css(o)):(o[s.animType]=\"translate(0px,\"+i+\"px)\",s.$slideTrack.css(o))},complete:function(){t&&t.call()}})):(s.applyTransition(),e=Math.ceil(e),!1===s.options.vertical?o[s.animType]=\"translate3d(\"+e+\"px, 0px, 0px)\":o[s.animType]=\"translate3d(0px,\"+e+\"px, 0px)\",s.$slideTrack.css(o),t&&setTimeout(function(){s.disableTransition(),t.call()},s.options.speed))},e.prototype.getNavTarget=function(){var e=this,t=e.options.asNavFor;return t&&null!==t&&(t=i(t).not(e.$slider)),t},e.prototype.asNavFor=function(e){var t=this.getNavTarget();null!==t&&\"object\"==typeof t&&t.each(function(){var t=i(this).slick(\"getSlick\");t.unslicked||t.slideHandler(e,!0)})},e.prototype.applyTransition=function(i){var e=this,t={};!1===e.options.fade?t[e.transitionType]=e.transformType+\" \"+e.options.speed+\"ms \"+e.options.cssEase:t[e.transitionType]=\"opacity \"+e.options.speed+\"ms \"+e.options.cssEase,!1===e.options.fade?e.$slideTrack.css(t):e.$slides.eq(i).css(t)},e.prototype.autoPlay=function(){var i=this;i.autoPlayClear(),i.slideCount>i.options.slidesToShow&&(i.autoPlayTimer=setInterval(i.autoPlayIterator,i.options.autoplaySpeed))},e.prototype.autoPlayClear=function(){var i=this;i.autoPlayTimer&&clearInterval(i.autoPlayTimer)},e.prototype.autoPlayIterator=function(){var i=this,e=i.currentSlide+i.options.slidesToScroll;i.paused||i.interrupted||i.focussed||(!1===i.options.infinite&&(1===i.direction&&i.currentSlide+1===i.slideCount-1?i.direction=0:0===i.direction&&(e=i.currentSlide-i.options.slidesToScroll,i.currentSlide-1==0&&(i.direction=1))),i.slideHandler(e))},e.prototype.buildArrows=function(){var e=this;!0===e.options.arrows&&(e.$prevArrow=i(e.options.prevArrow).addClass(\"slick-arrow\"),e.$nextArrow=i(e.options.nextArrow).addClass(\"slick-arrow\"),e.slideCount>e.options.slidesToShow?(e.$prevArrow.removeClass(\"slick-hidden\").removeAttr(\"aria-hidden tabindex\"),e.$nextArrow.removeClass(\"slick-hidden\").removeAttr(\"aria-hidden tabindex\"),e.htmlExpr.test(e.options.prevArrow)&&e.$prevArrow.prependTo(e.options.appendArrows),e.htmlExpr.test(e.options.nextArrow)&&e.$nextArrow.appendTo(e.options.appendArrows),!0!==e.options.infinite&&e.$prevArrow.addClass(\"slick-disabled\").attr(\"aria-disabled\",\"true\")):e.$prevArrow.add(e.$nextArrow).addClass(\"slick-hidden\").attr({\"aria-disabled\":\"true\",tabindex:\"-1\"}))},e.prototype.buildDots=function(){var e,t,o=this;if(!0===o.options.dots){for(o.$slider.addClass(\"slick-dotted\"),t=i(\"<ul />\").addClass(o.options.dotsClass),e=0;e<=o.getDotCount();e+=1)t.append(i(\"<li />\").append(o.options.customPaging.call(this,o,e)));o.$dots=t.appendTo(o.options.appendDots),o.$dots.find(\"li\").first().addClass(\"slick-active\")}},e.prototype.buildOut=function(){var e=this;e.$slides=e.$slider.children(e.options.slide+\":not(.slick-cloned)\").addClass(\"slick-slide\"),e.slideCount=e.$slides.length,e.$slides.each(function(e,t){i(t).attr(\"data-slick-index\",e).data(\"originalStyling\",i(t).attr(\"style\")||\"\")}),e.$slider.addClass(\"slick-slider\"),e.$slideTrack=0===e.slideCount?i('<div class=\"slick-track\"/>').appendTo(e.$slider):e.$slides.wrapAll('<div class=\"slick-track\"/>').parent(),e.$list=e.$slideTrack.wrap('<div class=\"slick-list\"/>').parent(),e.$slideTrack.css(\"opacity\",0),!0!==e.options.centerMode&&!0!==e.options.swipeToSlide||(e.options.slidesToScroll=1),i(\"img[data-lazy]\",e.$slider).not(\"[src]\").addClass(\"slick-loading\"),e.setupInfinite(),e.buildArrows(),e.buildDots(),e.updateDots(),e.setSlideClasses(\"number\"==typeof e.currentSlide?e.currentSlide:0),!0===e.options.draggable&&e.$list.addClass(\"draggable\")},e.prototype.buildRows=function(){var i,e,t,o,s,n,r,l=this;if(o=document.createDocumentFragment(),n=l.$slider.children(),l.options.rows>1){for(r=l.options.slidesPerRow*l.options.rows,s=Math.ceil(n.length/r),i=0;i<s;i++){var d=document.createElement(\"div\");for(e=0;e<l.options.rows;e++){var a=document.createElement(\"div\");for(t=0;t<l.options.slidesPerRow;t++){var c=i*r+(e*l.options.slidesPerRow+t);n.get(c)&&a.appendChild(n.get(c))}d.appendChild(a)}o.appendChild(d)}l.$slider.empty().append(o),l.$slider.children().children().children().css({width:100/l.options.slidesPerRow+\"%\",display:\"inline-block\"})}},e.prototype.checkResponsive=function(e,t){var o,s,n,r=this,l=!1,d=r.$slider.width(),a=window.innerWidth||i(window).width();if(\"window\"===r.respondTo?n=a:\"slider\"===r.respondTo?n=d:\"min\"===r.respondTo&&(n=Math.min(a,d)),r.options.responsive&&r.options.responsive.length&&null!==r.options.responsive){s=null;for(o in r.breakpoints)r.breakpoints.hasOwnProperty(o)&&(!1===r.originalSettings.mobileFirst?n<r.breakpoints[o]&&(s=r.breakpoints[o]):n>r.breakpoints[o]&&(s=r.breakpoints[o]));null!==s?null!==r.activeBreakpoint?(s!==r.activeBreakpoint||t)&&(r.activeBreakpoint=s,\"unslick\"===r.breakpointSettings[s]?r.unslick(s):(r.options=i.extend({},r.originalSettings,r.breakpointSettings[s]),!0===e&&(r.currentSlide=r.options.initialSlide),r.refresh(e)),l=s):(r.activeBreakpoint=s,\"unslick\"===r.breakpointSettings[s]?r.unslick(s):(r.options=i.extend({},r.originalSettings,r.breakpointSettings[s]),!0===e&&(r.currentSlide=r.options.initialSlide),r.refresh(e)),l=s):null!==r.activeBreakpoint&&(r.activeBreakpoint=null,r.options=r.originalSettings,!0===e&&(r.currentSlide=r.options.initialSlide),r.refresh(e),l=s),e||!1===l||r.$slider.trigger(\"breakpoint\",[r,l])}},e.prototype.changeSlide=function(e,t){var o,s,n,r=this,l=i(e.currentTarget);switch(l.is(\"a\")&&e.preventDefault(),l.is(\"li\")||(l=l.closest(\"li\")),n=r.slideCount%r.options.slidesToScroll!=0,o=n?0:(r.slideCount-r.currentSlide)%r.options.slidesToScroll,e.data.message){case\"previous\":s=0===o?r.options.slidesToScroll:r.options.slidesToShow-o,r.slideCount>r.options.slidesToShow&&r.slideHandler(r.currentSlide-s,!1,t);break;case\"next\":s=0===o?r.options.slidesToScroll:o,r.slideCount>r.options.slidesToShow&&r.slideHandler(r.currentSlide+s,!1,t);break;case\"index\":var d=0===e.data.index?0:e.data.index||l.index()*r.options.slidesToScroll;r.slideHandler(r.checkNavigable(d),!1,t),l.children().trigger(\"focus\");break;default:return}},e.prototype.checkNavigable=function(i){var e,t;if(e=this.getNavigableIndexes(),t=0,i>e[e.length-1])i=e[e.length-1];else for(var o in e){if(i<e[o]){i=t;break}t=e[o]}return i},e.prototype.cleanUpEvents=function(){var e=this;e.options.dots&&null!==e.$dots&&(i(\"li\",e.$dots).off(\"click.slick\",e.changeSlide).off(\"mouseenter.slick\",i.proxy(e.interrupt,e,!0)).off(\"mouseleave.slick\",i.proxy(e.interrupt,e,!1)),!0===e.options.accessibility&&e.$dots.off(\"keydown.slick\",e.keyHandler)),e.$slider.off(\"focus.slick blur.slick\"),!0===e.options.arrows&&e.slideCount>e.options.slidesToShow&&(e.$prevArrow&&e.$prevArrow.off(\"click.slick\",e.changeSlide),e.$nextArrow&&e.$nextArrow.off(\"click.slick\",e.changeSlide),!0===e.options.accessibility&&(e.$prevArrow&&e.$prevArrow.off(\"keydown.slick\",e.keyHandler),e.$nextArrow&&e.$nextArrow.off(\"keydown.slick\",e.keyHandler))),e.$list.off(\"touchstart.slick mousedown.slick\",e.swipeHandler),e.$list.off(\"touchmove.slick mousemove.slick\",e.swipeHandler),e.$list.off(\"touchend.slick mouseup.slick\",e.swipeHandler),e.$list.off(\"touchcancel.slick mouseleave.slick\",e.swipeHandler),e.$list.off(\"click.slick\",e.clickHandler),i(document).off(e.visibilityChange,e.visibility),e.cleanUpSlideEvents(),!0===e.options.accessibility&&e.$list.off(\"keydown.slick\",e.keyHandler),!0===e.options.focusOnSelect&&i(e.$slideTrack).children().off(\"click.slick\",e.selectHandler),i(window).off(\"orientationchange.slick.slick-\"+e.instanceUid,e.orientationChange),i(window).off(\"resize.slick.slick-\"+e.instanceUid,e.resize),i(\"[draggable!=true]\",e.$slideTrack).off(\"dragstart\",e.preventDefault),i(window).off(\"load.slick.slick-\"+e.instanceUid,e.setPosition)},e.prototype.cleanUpSlideEvents=function(){var e=this;e.$list.off(\"mouseenter.slick\",i.proxy(e.interrupt,e,!0)),e.$list.off(\"mouseleave.slick\",i.proxy(e.interrupt,e,!1))},e.prototype.cleanUpRows=function(){var i,e=this;e.options.rows>1&&((i=e.$slides.children().children()).removeAttr(\"style\"),e.$slider.empty().append(i))},e.prototype.clickHandler=function(i){!1===this.shouldClick&&(i.stopImmediatePropagation(),i.stopPropagation(),i.preventDefault())},e.prototype.destroy=function(e){var t=this;t.autoPlayClear(),t.touchObject={},t.cleanUpEvents(),i(\".slick-cloned\",t.$slider).detach(),t.$dots&&t.$dots.remove(),t.$prevArrow&&t.$prevArrow.length&&(t.$prevArrow.removeClass(\"slick-disabled slick-arrow slick-hidden\").removeAttr(\"aria-hidden aria-disabled tabindex\").css(\"display\",\"\"),t.htmlExpr.test(t.options.prevArrow)&&t.$prevArrow.remove()),t.$nextArrow&&t.$nextArrow.length&&(t.$nextArrow.removeClass(\"slick-disabled slick-arrow slick-hidden\").removeAttr(\"aria-hidden aria-disabled tabindex\").css(\"display\",\"\"),t.htmlExpr.test(t.options.nextArrow)&&t.$nextArrow.remove()),t.$slides&&(t.$slides.removeClass(\"slick-slide slick-active slick-center slick-visible slick-current\").removeAttr(\"aria-hidden\").removeAttr(\"data-slick-index\").each(function(){i(this).attr(\"style\",i(this).data(\"originalStyling\"))}),t.$slideTrack.children(this.options.slide).detach(),t.$slideTrack.detach(),t.$list.detach(),t.$slider.append(t.$slides)),t.cleanUpRows(),t.$slider.removeClass(\"slick-slider\"),t.$slider.removeClass(\"slick-initialized\"),t.$slider.removeClass(\"slick-dotted\"),t.unslicked=!0,e||t.$slider.trigger(\"destroy\",[t])},e.prototype.disableTransition=function(i){var e=this,t={};t[e.transitionType]=\"\",!1===e.options.fade?e.$slideTrack.css(t):e.$slides.eq(i).css(t)},e.prototype.fadeSlide=function(i,e){var t=this;!1===t.cssTransitions?(t.$slides.eq(i).css({zIndex:t.options.zIndex}),t.$slides.eq(i).animate({opacity:1},t.options.speed,t.options.easing,e)):(t.applyTransition(i),t.$slides.eq(i).css({opacity:1,zIndex:t.options.zIndex}),e&&setTimeout(function(){t.disableTransition(i),e.call()},t.options.speed))},e.prototype.fadeSlideOut=function(i){var e=this;!1===e.cssTransitions?e.$slides.eq(i).animate({opacity:0,zIndex:e.options.zIndex-2},e.options.speed,e.options.easing):(e.applyTransition(i),e.$slides.eq(i).css({opacity:0,zIndex:e.options.zIndex-2}))},e.prototype.filterSlides=e.prototype.slickFilter=function(i){var e=this;null!==i&&(e.$slidesCache=e.$slides,e.unload(),e.$slideTrack.children(this.options.slide).detach(),e.$slidesCache.filter(i).appendTo(e.$slideTrack),e.reinit())},e.prototype.focusHandler=function(){var e=this;e.$slider.off(\"focus.slick blur.slick\").on(\"focus.slick blur.slick\",\"*\",function(t){t.stopImmediatePropagation();var o=i(this);setTimeout(function(){e.options.pauseOnFocus&&(e.focussed=o.is(\":focus\"),e.autoPlay())},0)})},e.prototype.getCurrent=e.prototype.slickCurrentSlide=function(){return this.currentSlide},e.prototype.getDotCount=function(){var i=this,e=0,t=0,o=0;if(!0===i.options.infinite)if(i.slideCount<=i.options.slidesToShow)++o;else for(;e<i.slideCount;)++o,e=t+i.options.slidesToScroll,t+=i.options.slidesToScroll<=i.options.slidesToShow?i.options.slidesToScroll:i.options.slidesToShow;else if(!0===i.options.centerMode)o=i.slideCount;else if(i.options.asNavFor)for(;e<i.slideCount;)++o,e=t+i.options.slidesToScroll,t+=i.options.slidesToScroll<=i.options.slidesToShow?i.options.slidesToScroll:i.options.slidesToShow;else o=1+Math.ceil((i.slideCount-i.options.slidesToShow)/i.options.slidesToScroll);return o-1},e.prototype.getLeft=function(i){var e,t,o,s,n=this,r=0;return n.slideOffset=0,t=n.$slides.first().outerHeight(!0),!0===n.options.infinite?(n.slideCount>n.options.slidesToShow&&(n.slideOffset=n.slideWidth*n.options.slidesToShow*-1,s=-1,!0===n.options.vertical&&!0===n.options.centerMode&&(2===n.options.slidesToShow?s=-1.5:1===n.options.slidesToShow&&(s=-2)),r=t*n.options.slidesToShow*s),n.slideCount%n.options.slidesToScroll!=0&&i+n.options.slidesToScroll>n.slideCount&&n.slideCount>n.options.slidesToShow&&(i>n.slideCount?(n.slideOffset=(n.options.slidesToShow-(i-n.slideCount))*n.slideWidth*-1,r=(n.options.slidesToShow-(i-n.slideCount))*t*-1):(n.slideOffset=n.slideCount%n.options.slidesToScroll*n.slideWidth*-1,r=n.slideCount%n.options.slidesToScroll*t*-1))):i+n.options.slidesToShow>n.slideCount&&(n.slideOffset=(i+n.options.slidesToShow-n.slideCount)*n.slideWidth,r=(i+n.options.slidesToShow-n.slideCount)*t),n.slideCount<=n.options.slidesToShow&&(n.slideOffset=0,r=0),!0===n.options.centerMode&&n.slideCount<=n.options.slidesToShow?n.slideOffset=n.slideWidth*Math.floor(n.options.slidesToShow)/2-n.slideWidth*n.slideCount/2:!0===n.options.centerMode&&!0===n.options.infinite?n.slideOffset+=n.slideWidth*Math.floor(n.options.slidesToShow/2)-n.slideWidth:!0===n.options.centerMode&&(n.slideOffset=0,n.slideOffset+=n.slideWidth*Math.floor(n.options.slidesToShow/2)),e=!1===n.options.vertical?i*n.slideWidth*-1+n.slideOffset:i*t*-1+r,!0===n.options.variableWidth&&(o=n.slideCount<=n.options.slidesToShow||!1===n.options.infinite?n.$slideTrack.children(\".slick-slide\").eq(i):n.$slideTrack.children(\".slick-slide\").eq(i+n.options.slidesToShow),e=!0===n.options.rtl?o[0]?-1*(n.$slideTrack.width()-o[0].offsetLeft-o.width()):0:o[0]?-1*o[0].offsetLeft:0,!0===n.options.centerMode&&(o=n.slideCount<=n.options.slidesToShow||!1===n.options.infinite?n.$slideTrack.children(\".slick-slide\").eq(i):n.$slideTrack.children(\".slick-slide\").eq(i+n.options.slidesToShow+1),e=!0===n.options.rtl?o[0]?-1*(n.$slideTrack.width()-o[0].offsetLeft-o.width()):0:o[0]?-1*o[0].offsetLeft:0,e+=(n.$list.width()-o.outerWidth())/2)),e},e.prototype.getOption=e.prototype.slickGetOption=function(i){return this.options[i]},e.prototype.getNavigableIndexes=function(){var i,e=this,t=0,o=0,s=[];for(!1===e.options.infinite?i=e.slideCount:(t=-1*e.options.slidesToScroll,o=-1*e.options.slidesToScroll,i=2*e.slideCount);t<i;)s.push(t),t=o+e.options.slidesToScroll,o+=e.options.slidesToScroll<=e.options.slidesToShow?e.options.slidesToScroll:e.options.slidesToShow;return s},e.prototype.getSlick=function(){return this},e.prototype.getSlideCount=function(){var e,t,o=this;return t=!0===o.options.centerMode?o.slideWidth*Math.floor(o.options.slidesToShow/2):0,!0===o.options.swipeToSlide?(o.$slideTrack.find(\".slick-slide\").each(function(s,n){if(n.offsetLeft-t+i(n).outerWidth()/2>-1*o.swipeLeft)return e=n,!1}),Math.abs(i(e).attr(\"data-slick-index\")-o.currentSlide)||1):o.options.slidesToScroll},e.prototype.goTo=e.prototype.slickGoTo=function(i,e){this.changeSlide({data:{message:\"index\",index:parseInt(i)}},e)},e.prototype.init=function(e){var t=this;i(t.$slider).hasClass(\"slick-initialized\")||(i(t.$slider).addClass(\"slick-initialized\"),t.buildRows(),t.buildOut(),t.setProps(),t.startLoad(),t.loadSlider(),t.initializeEvents(),t.updateArrows(),t.updateDots(),t.checkResponsive(!0),t.focusHandler()),e&&t.$slider.trigger(\"init\",[t]),!0===t.options.accessibility&&t.initADA(),t.options.autoplay&&(t.paused=!1,t.autoPlay())},e.prototype.initADA=function(){var e=this,t=Math.ceil(e.slideCount/e.options.slidesToShow),o=e.getNavigableIndexes().filter(function(i){return i>=0&&i<e.slideCount});e.$slides.add(e.$slideTrack.find(\".slick-cloned\")).attr({\"aria-hidden\":\"true\",tabindex:\"-1\"}).find(\"a, input, button, select\").attr({tabindex:\"-1\"}),null!==e.$dots&&(e.$slides.not(e.$slideTrack.find(\".slick-cloned\")).each(function(t){var s=o.indexOf(t);i(this).attr({role:\"tabpanel\",id:\"slick-slide\"+e.instanceUid+t,tabindex:-1}),-1!==s&&i(this).attr({\"aria-describedby\":\"slick-slide-control\"+e.instanceUid+s})}),e.$dots.attr(\"role\",\"tablist\").find(\"li\").each(function(s){var n=o[s];i(this).attr({role:\"presentation\"}),i(this).find(\"button\").first().attr({role:\"tab\",id:\"slick-slide-control\"+e.instanceUid+s,\"aria-controls\":\"slick-slide\"+e.instanceUid+n,\"aria-label\":s+1+\" of \"+t,\"aria-selected\":null,tabindex:\"-1\"})}).eq(e.currentSlide).find(\"button\").attr({\"aria-selected\":\"true\",tabindex:\"0\"}).end());for(var s=e.currentSlide,n=s+e.options.slidesToShow;s<n;s++)e.$slides.eq(s).attr(\"tabindex\",0);e.activateADA()},e.prototype.initArrowEvents=function(){var i=this;!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.off(\"click.slick\").on(\"click.slick\",{message:\"previous\"},i.changeSlide),i.$nextArrow.off(\"click.slick\").on(\"click.slick\",{message:\"next\"},i.changeSlide),!0===i.options.accessibility&&(i.$prevArrow.on(\"keydown.slick\",i.keyHandler),i.$nextArrow.on(\"keydown.slick\",i.keyHandler)))},e.prototype.initDotEvents=function(){var e=this;!0===e.options.dots&&(i(\"li\",e.$dots).on(\"click.slick\",{message:\"index\"},e.changeSlide),!0===e.options.accessibility&&e.$dots.on(\"keydown.slick\",e.keyHandler)),!0===e.options.dots&&!0===e.options.pauseOnDotsHover&&i(\"li\",e.$dots).on(\"mouseenter.slick\",i.proxy(e.interrupt,e,!0)).on(\"mouseleave.slick\",i.proxy(e.interrupt,e,!1))},e.prototype.initSlideEvents=function(){var e=this;e.options.pauseOnHover&&(e.$list.on(\"mouseenter.slick\",i.proxy(e.interrupt,e,!0)),e.$list.on(\"mouseleave.slick\",i.proxy(e.interrupt,e,!1)))},e.prototype.initializeEvents=function(){var e=this;e.initArrowEvents(),e.initDotEvents(),e.initSlideEvents(),e.$list.on(\"touchstart.slick mousedown.slick\",{action:\"start\"},e.swipeHandler),e.$list.on(\"touchmove.slick mousemove.slick\",{action:\"move\"},e.swipeHandler),e.$list.on(\"touchend.slick mouseup.slick\",{action:\"end\"},e.swipeHandler),e.$list.on(\"touchcancel.slick mouseleave.slick\",{action:\"end\"},e.swipeHandler),e.$list.on(\"click.slick\",e.clickHandler),i(document).on(e.visibilityChange,i.proxy(e.visibility,e)),!0===e.options.accessibility&&e.$list.on(\"keydown.slick\",e.keyHandler),!0===e.options.focusOnSelect&&i(e.$slideTrack).children().on(\"click.slick\",e.selectHandler),i(window).on(\"orientationchange.slick.slick-\"+e.instanceUid,i.proxy(e.orientationChange,e)),i(window).on(\"resize.slick.slick-\"+e.instanceUid,i.proxy(e.resize,e)),i(\"[draggable!=true]\",e.$slideTrack).on(\"dragstart\",e.preventDefault),i(window).on(\"load.slick.slick-\"+e.instanceUid,e.setPosition),i(e.setPosition)},e.prototype.initUI=function(){var i=this;!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.show(),i.$nextArrow.show()),!0===i.options.dots&&i.slideCount>i.options.slidesToShow&&i.$dots.show()},e.prototype.keyHandler=function(i){var e=this;i.target.tagName.match(\"TEXTAREA|INPUT|SELECT\")||(37===i.keyCode&&!0===e.options.accessibility?e.changeSlide({data:{message:!0===e.options.rtl?\"next\":\"previous\"}}):39===i.keyCode&&!0===e.options.accessibility&&e.changeSlide({data:{message:!0===e.options.rtl?\"previous\":\"next\"}}))},e.prototype.lazyLoad=function(){function e(e){i(\"img[data-lazy]\",e).each(function(){var e=i(this),t=i(this).attr(\"data-lazy\"),o=i(this).attr(\"data-srcset\"),s=i(this).attr(\"data-sizes\")||n.$slider.attr(\"data-sizes\"),r=document.createElement(\"img\");r.onload=function(){e.animate({opacity:0},100,function(){o&&(e.attr(\"srcset\",o),s&&e.attr(\"sizes\",s)),e.attr(\"src\",t).animate({opacity:1},200,function(){e.removeAttr(\"data-lazy data-srcset data-sizes\").removeClass(\"slick-loading\")}),n.$slider.trigger(\"lazyLoaded\",[n,e,t])})},r.onerror=function(){e.removeAttr(\"data-lazy\").removeClass(\"slick-loading\").addClass(\"slick-lazyload-error\"),n.$slider.trigger(\"lazyLoadError\",[n,e,t])},r.src=t})}var t,o,s,n=this;if(!0===n.options.centerMode?!0===n.options.infinite?s=(o=n.currentSlide+(n.options.slidesToShow/2+1))+n.options.slidesToShow+2:(o=Math.max(0,n.currentSlide-(n.options.slidesToShow/2+1)),s=n.options.slidesToShow/2+1+2+n.currentSlide):(o=n.options.infinite?n.options.slidesToShow+n.currentSlide:n.currentSlide,s=Math.ceil(o+n.options.slidesToShow),!0===n.options.fade&&(o>0&&o--,s<=n.slideCount&&s++)),t=n.$slider.find(\".slick-slide\").slice(o,s),\"anticipated\"===n.options.lazyLoad)for(var r=o-1,l=s,d=n.$slider.find(\".slick-slide\"),a=0;a<n.options.slidesToScroll;a++)r<0&&(r=n.slideCount-1),t=(t=t.add(d.eq(r))).add(d.eq(l)),r--,l++;e(t),n.slideCount<=n.options.slidesToShow?e(n.$slider.find(\".slick-slide\")):n.currentSlide>=n.slideCount-n.options.slidesToShow?e(n.$slider.find(\".slick-cloned\").slice(0,n.options.slidesToShow)):0===n.currentSlide&&e(n.$slider.find(\".slick-cloned\").slice(-1*n.options.slidesToShow))},e.prototype.loadSlider=function(){var i=this;i.setPosition(),i.$slideTrack.css({opacity:1}),i.$slider.removeClass(\"slick-loading\"),i.initUI(),\"progressive\"===i.options.lazyLoad&&i.progressiveLazyLoad()},e.prototype.next=e.prototype.slickNext=function(){this.changeSlide({data:{message:\"next\"}})},e.prototype.orientationChange=function(){var i=this;i.checkResponsive(),i.setPosition()},e.prototype.pause=e.prototype.slickPause=function(){var i=this;i.autoPlayClear(),i.paused=!0},e.prototype.play=e.prototype.slickPlay=function(){var i=this;i.autoPlay(),i.options.autoplay=!0,i.paused=!1,i.focussed=!1,i.interrupted=!1},e.prototype.postSlide=function(e){var t=this;t.unslicked||(t.$slider.trigger(\"afterChange\",[t,e]),t.animating=!1,t.slideCount>t.options.slidesToShow&&t.setPosition(),t.swipeLeft=null,t.options.autoplay&&t.autoPlay(),!0===t.options.accessibility&&(t.initADA(),t.options.focusOnChange&&i(t.$slides.get(t.currentSlide)).attr(\"tabindex\",0).focus()))},e.prototype.prev=e.prototype.slickPrev=function(){this.changeSlide({data:{message:\"previous\"}})},e.prototype.preventDefault=function(i){i.preventDefault()},e.prototype.progressiveLazyLoad=function(e){e=e||1;var t,o,s,n,r,l=this,d=i(\"img[data-lazy]\",l.$slider);d.length?(t=d.first(),o=t.attr(\"data-lazy\"),s=t.attr(\"data-srcset\"),n=t.attr(\"data-sizes\")||l.$slider.attr(\"data-sizes\"),(r=document.createElement(\"img\")).onload=function(){s&&(t.attr(\"srcset\",s),n&&t.attr(\"sizes\",n)),t.attr(\"src\",o).removeAttr(\"data-lazy data-srcset data-sizes\").removeClass(\"slick-loading\"),!0===l.options.adaptiveHeight&&l.setPosition(),l.$slider.trigger(\"lazyLoaded\",[l,t,o]),l.progressiveLazyLoad()},r.onerror=function(){e<3?setTimeout(function(){l.progressiveLazyLoad(e+1)},500):(t.removeAttr(\"data-lazy\").removeClass(\"slick-loading\").addClass(\"slick-lazyload-error\"),l.$slider.trigger(\"lazyLoadError\",[l,t,o]),l.progressiveLazyLoad())},r.src=o):l.$slider.trigger(\"allImagesLoaded\",[l])},e.prototype.refresh=function(e){var t,o,s=this;o=s.slideCount-s.options.slidesToShow,!s.options.infinite&&s.currentSlide>o&&(s.currentSlide=o),s.slideCount<=s.options.slidesToShow&&(s.currentSlide=0),t=s.currentSlide,s.destroy(!0),i.extend(s,s.initials,{currentSlide:t}),s.init(),e||s.changeSlide({data:{message:\"index\",index:t}},!1)},e.prototype.registerBreakpoints=function(){var e,t,o,s=this,n=s.options.responsive||null;if(\"array\"===i.type(n)&&n.length){s.respondTo=s.options.respondTo||\"window\";for(e in n)if(o=s.breakpoints.length-1,n.hasOwnProperty(e)){for(t=n[e].breakpoint;o>=0;)s.breakpoints[o]&&s.breakpoints[o]===t&&s.breakpoints.splice(o,1),o--;s.breakpoints.push(t),s.breakpointSettings[t]=n[e].settings}s.breakpoints.sort(function(i,e){return s.options.mobileFirst?i-e:e-i})}},e.prototype.reinit=function(){var e=this;e.$slides=e.$slideTrack.children(e.options.slide).addClass(\"slick-slide\"),e.slideCount=e.$slides.length,e.currentSlide>=e.slideCount&&0!==e.currentSlide&&(e.currentSlide=e.currentSlide-e.options.slidesToScroll),e.slideCount<=e.options.slidesToShow&&(e.currentSlide=0),e.registerBreakpoints(),e.setProps(),e.setupInfinite(),e.buildArrows(),e.updateArrows(),e.initArrowEvents(),e.buildDots(),e.updateDots(),e.initDotEvents(),e.cleanUpSlideEvents(),e.initSlideEvents(),e.checkResponsive(!1,!0),!0===e.options.focusOnSelect&&i(e.$slideTrack).children().on(\"click.slick\",e.selectHandler),e.setSlideClasses(\"number\"==typeof e.currentSlide?e.currentSlide:0),e.setPosition(),e.focusHandler(),e.paused=!e.options.autoplay,e.autoPlay(),e.$slider.trigger(\"reInit\",[e])},e.prototype.resize=function(){var e=this;i(window).width()!==e.windowWidth&&(clearTimeout(e.windowDelay),e.windowDelay=window.setTimeout(function(){e.windowWidth=i(window).width(),e.checkResponsive(),e.unslicked||e.setPosition()},50))},e.prototype.removeSlide=e.prototype.slickRemove=function(i,e,t){var o=this;if(i=\"boolean\"==typeof i?!0===(e=i)?0:o.slideCount-1:!0===e?--i:i,o.slideCount<1||i<0||i>o.slideCount-1)return!1;o.unload(),!0===t?o.$slideTrack.children().remove():o.$slideTrack.children(this.options.slide).eq(i).remove(),o.$slides=o.$slideTrack.children(this.options.slide),o.$slideTrack.children(this.options.slide).detach(),o.$slideTrack.append(o.$slides),o.$slidesCache=o.$slides,o.reinit()},e.prototype.setCSS=function(i){var e,t,o=this,s={};!0===o.options.rtl&&(i=-i),e=\"left\"==o.positionProp?Math.ceil(i)+\"px\":\"0px\",t=\"top\"==o.positionProp?Math.ceil(i)+\"px\":\"0px\",s[o.positionProp]=i,!1===o.transformsEnabled?o.$slideTrack.css(s):(s={},!1===o.cssTransitions?(s[o.animType]=\"translate(\"+e+\", \"+t+\")\",o.$slideTrack.css(s)):(s[o.animType]=\"translate3d(\"+e+\", \"+t+\", 0px)\",o.$slideTrack.css(s)))},e.prototype.setDimensions=function(){var i=this;!1===i.options.vertical?!0===i.options.centerMode&&i.$list.css({padding:\"0px \"+i.options.centerPadding}):(i.$list.height(i.$slides.first().outerHeight(!0)*i.options.slidesToShow),!0===i.options.centerMode&&i.$list.css({padding:i.options.centerPadding+\" 0px\"})),i.listWidth=i.$list.width(),i.listHeight=i.$list.height(),!1===i.options.vertical&&!1===i.options.variableWidth?(i.slideWidth=Math.ceil(i.listWidth/i.options.slidesToShow),i.$slideTrack.width(Math.ceil(i.slideWidth*i.$slideTrack.children(\".slick-slide\").length))):!0===i.options.variableWidth?i.$slideTrack.width(5e3*i.slideCount):(i.slideWidth=Math.ceil(i.listWidth),i.$slideTrack.height(Math.ceil(i.$slides.first().outerHeight(!0)*i.$slideTrack.children(\".slick-slide\").length)));var e=i.$slides.first().outerWidth(!0)-i.$slides.first().width();!1===i.options.variableWidth&&i.$slideTrack.children(\".slick-slide\").width(i.slideWidth-e)},e.prototype.setFade=function(){var e,t=this;t.$slides.each(function(o,s){e=t.slideWidth*o*-1,!0===t.options.rtl?i(s).css({position:\"relative\",right:e,top:0,zIndex:t.options.zIndex-2,opacity:0}):i(s).css({position:\"relative\",left:e,top:0,zIndex:t.options.zIndex-2,opacity:0})}),t.$slides.eq(t.currentSlide).css({zIndex:t.options.zIndex-1,opacity:1})},e.prototype.setHeight=function(){var i=this;if(1===i.options.slidesToShow&&!0===i.options.adaptiveHeight&&!1===i.options.vertical){var e=i.$slides.eq(i.currentSlide).outerHeight(!0);i.$list.css(\"height\",e)}},e.prototype.setOption=e.prototype.slickSetOption=function(){var e,t,o,s,n,r=this,l=!1;if(\"object\"===i.type(arguments[0])?(o=arguments[0],l=arguments[1],n=\"multiple\"):\"string\"===i.type(arguments[0])&&(o=arguments[0],s=arguments[1],l=arguments[2],\"responsive\"===arguments[0]&&\"array\"===i.type(arguments[1])?n=\"responsive\":void 0!==arguments[1]&&(n=\"single\")),\"single\"===n)r.options[o]=s;else if(\"multiple\"===n)i.each(o,function(i,e){r.options[i]=e});else if(\"responsive\"===n)for(t in s)if(\"array\"!==i.type(r.options.responsive))r.options.responsive=[s[t]];else{for(e=r.options.responsive.length-1;e>=0;)r.options.responsive[e].breakpoint===s[t].breakpoint&&r.options.responsive.splice(e,1),e--;r.options.responsive.push(s[t])}l&&(r.unload(),r.reinit())},e.prototype.setPosition=function(){var i=this;i.setDimensions(),i.setHeight(),!1===i.options.fade?i.setCSS(i.getLeft(i.currentSlide)):i.setFade(),i.$slider.trigger(\"setPosition\",[i])},e.prototype.setProps=function(){var i=this,e=document.body.style;i.positionProp=!0===i.options.vertical?\"top\":\"left\",\"top\"===i.positionProp?i.$slider.addClass(\"slick-vertical\"):i.$slider.removeClass(\"slick-vertical\"),void 0===e.WebkitTransition&&void 0===e.MozTransition&&void 0===e.msTransition||!0===i.options.useCSS&&(i.cssTransitions=!0),i.options.fade&&(\"number\"==typeof i.options.zIndex?i.options.zIndex<3&&(i.options.zIndex=3):i.options.zIndex=i.defaults.zIndex),void 0!==e.OTransform&&(i.animType=\"OTransform\",i.transformType=\"-o-transform\",i.transitionType=\"OTransition\",void 0===e.perspectiveProperty&&void 0===e.webkitPerspective&&(i.animType=!1)),void 0!==e.MozTransform&&(i.animType=\"MozTransform\",i.transformType=\"-moz-transform\",i.transitionType=\"MozTransition\",void 0===e.perspectiveProperty&&void 0===e.MozPerspective&&(i.animType=!1)),void 0!==e.webkitTransform&&(i.animType=\"webkitTransform\",i.transformType=\"-webkit-transform\",i.transitionType=\"webkitTransition\",void 0===e.perspectiveProperty&&void 0===e.webkitPerspective&&(i.animType=!1)),void 0!==e.msTransform&&(i.animType=\"msTransform\",i.transformType=\"-ms-transform\",i.transitionType=\"msTransition\",void 0===e.msTransform&&(i.animType=!1)),void 0!==e.transform&&!1!==i.animType&&(i.animType=\"transform\",i.transformType=\"transform\",i.transitionType=\"transition\"),i.transformsEnabled=i.options.useTransform&&null!==i.animType&&!1!==i.animType},e.prototype.setSlideClasses=function(i){var e,t,o,s,n=this;if(t=n.$slider.find(\".slick-slide\").removeClass(\"slick-active slick-center slick-current\").attr(\"aria-hidden\",\"true\"),n.$slides.eq(i).addClass(\"slick-current\"),!0===n.options.centerMode){var r=n.options.slidesToShow%2==0?1:0;e=Math.floor(n.options.slidesToShow/2),!0===n.options.infinite&&(i>=e&&i<=n.slideCount-1-e?n.$slides.slice(i-e+r,i+e+1).addClass(\"slick-active\").attr(\"aria-hidden\",\"false\"):(o=n.options.slidesToShow+i,t.slice(o-e+1+r,o+e+2).addClass(\"slick-active\").attr(\"aria-hidden\",\"false\")),0===i?t.eq(t.length-1-n.options.slidesToShow).addClass(\"slick-center\"):i===n.slideCount-1&&t.eq(n.options.slidesToShow).addClass(\"slick-center\")),n.$slides.eq(i).addClass(\"slick-center\")}else i>=0&&i<=n.slideCount-n.options.slidesToShow?n.$slides.slice(i,i+n.options.slidesToShow).addClass(\"slick-active\").attr(\"aria-hidden\",\"false\"):t.length<=n.options.slidesToShow?t.addClass(\"slick-active\").attr(\"aria-hidden\",\"false\"):(s=n.slideCount%n.options.slidesToShow,o=!0===n.options.infinite?n.options.slidesToShow+i:i,n.options.slidesToShow==n.options.slidesToScroll&&n.slideCount-i<n.options.slidesToShow?t.slice(o-(n.options.slidesToShow-s),o+s).addClass(\"slick-active\").attr(\"aria-hidden\",\"false\"):t.slice(o,o+n.options.slidesToShow).addClass(\"slick-active\").attr(\"aria-hidden\",\"false\"));\"ondemand\"!==n.options.lazyLoad&&\"anticipated\"!==n.options.lazyLoad||n.lazyLoad()},e.prototype.setupInfinite=function(){var e,t,o,s=this;if(!0===s.options.fade&&(s.options.centerMode=!1),!0===s.options.infinite&&!1===s.options.fade&&(t=null,s.slideCount>s.options.slidesToShow)){for(o=!0===s.options.centerMode?s.options.slidesToShow+1:s.options.slidesToShow,e=s.slideCount;e>s.slideCount-o;e-=1)t=e-1,i(s.$slides[t]).clone(!0).attr(\"id\",\"\").attr(\"data-slick-index\",t-s.slideCount).prependTo(s.$slideTrack).addClass(\"slick-cloned\");for(e=0;e<o+s.slideCount;e+=1)t=e,i(s.$slides[t]).clone(!0).attr(\"id\",\"\").attr(\"data-slick-index\",t+s.slideCount).appendTo(s.$slideTrack).addClass(\"slick-cloned\");s.$slideTrack.find(\".slick-cloned\").find(\"[id]\").each(function(){i(this).attr(\"id\",\"\")})}},e.prototype.interrupt=function(i){var e=this;i||e.autoPlay(),e.interrupted=i},e.prototype.selectHandler=function(e){var t=this,o=i(e.target).is(\".slick-slide\")?i(e.target):i(e.target).parents(\".slick-slide\"),s=parseInt(o.attr(\"data-slick-index\"));s||(s=0),t.slideCount<=t.options.slidesToShow?t.slideHandler(s,!1,!0):t.slideHandler(s)},e.prototype.slideHandler=function(i,e,t){var o,s,n,r,l,d=null,a=this;if(e=e||!1,!(!0===a.animating&&!0===a.options.waitForAnimate||!0===a.options.fade&&a.currentSlide===i))if(!1===e&&a.asNavFor(i),o=i,d=a.getLeft(o),r=a.getLeft(a.currentSlide),a.currentLeft=null===a.swipeLeft?r:a.swipeLeft,!1===a.options.infinite&&!1===a.options.centerMode&&(i<0||i>a.getDotCount()*a.options.slidesToScroll))!1===a.options.fade&&(o=a.currentSlide,!0!==t?a.animateSlide(r,function(){a.postSlide(o)}):a.postSlide(o));else if(!1===a.options.infinite&&!0===a.options.centerMode&&(i<0||i>a.slideCount-a.options.slidesToScroll))!1===a.options.fade&&(o=a.currentSlide,!0!==t?a.animateSlide(r,function(){a.postSlide(o)}):a.postSlide(o));else{if(a.options.autoplay&&clearInterval(a.autoPlayTimer),s=o<0?a.slideCount%a.options.slidesToScroll!=0?a.slideCount-a.slideCount%a.options.slidesToScroll:a.slideCount+o:o>=a.slideCount?a.slideCount%a.options.slidesToScroll!=0?0:o-a.slideCount:o,a.animating=!0,a.$slider.trigger(\"beforeChange\",[a,a.currentSlide,s]),n=a.currentSlide,a.currentSlide=s,a.setSlideClasses(a.currentSlide),a.options.asNavFor&&(l=(l=a.getNavTarget()).slick(\"getSlick\")).slideCount<=l.options.slidesToShow&&l.setSlideClasses(a.currentSlide),a.updateDots(),a.updateArrows(),!0===a.options.fade)return!0!==t?(a.fadeSlideOut(n),a.fadeSlide(s,function(){a.postSlide(s)})):a.postSlide(s),void a.animateHeight();!0!==t?a.animateSlide(d,function(){a.postSlide(s)}):a.postSlide(s)}},e.prototype.startLoad=function(){var i=this;!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.hide(),i.$nextArrow.hide()),!0===i.options.dots&&i.slideCount>i.options.slidesToShow&&i.$dots.hide(),i.$slider.addClass(\"slick-loading\")},e.prototype.swipeDirection=function(){var i,e,t,o,s=this;return i=s.touchObject.startX-s.touchObject.curX,e=s.touchObject.startY-s.touchObject.curY,t=Math.atan2(e,i),(o=Math.round(180*t/Math.PI))<0&&(o=360-Math.abs(o)),o<=45&&o>=0?!1===s.options.rtl?\"left\":\"right\":o<=360&&o>=315?!1===s.options.rtl?\"left\":\"right\":o>=135&&o<=225?!1===s.options.rtl?\"right\":\"left\":!0===s.options.verticalSwiping?o>=35&&o<=135?\"down\":\"up\":\"vertical\"},e.prototype.swipeEnd=function(i){var e,t,o=this;if(o.dragging=!1,o.swiping=!1,o.scrolling)return o.scrolling=!1,!1;if(o.interrupted=!1,o.shouldClick=!(o.touchObject.swipeLength>10),void 0===o.touchObject.curX)return!1;if(!0===o.touchObject.edgeHit&&o.$slider.trigger(\"edge\",[o,o.swipeDirection()]),o.touchObject.swipeLength>=o.touchObject.minSwipe){switch(t=o.swipeDirection()){case\"left\":case\"down\":e=o.options.swipeToSlide?o.checkNavigable(o.currentSlide+o.getSlideCount()):o.currentSlide+o.getSlideCount(),o.currentDirection=0;break;case\"right\":case\"up\":e=o.options.swipeToSlide?o.checkNavigable(o.currentSlide-o.getSlideCount()):o.currentSlide-o.getSlideCount(),o.currentDirection=1}\"vertical\"!=t&&(o.slideHandler(e),o.touchObject={},o.$slider.trigger(\"swipe\",[o,t]))}else o.touchObject.startX!==o.touchObject.curX&&(o.slideHandler(o.currentSlide),o.touchObject={})},e.prototype.swipeHandler=function(i){var e=this;if(!(!1===e.options.swipe||\"ontouchend\"in document&&!1===e.options.swipe||!1===e.options.draggable&&-1!==i.type.indexOf(\"mouse\")))switch(e.touchObject.fingerCount=i.originalEvent&&void 0!==i.originalEvent.touches?i.originalEvent.touches.length:1,e.touchObject.minSwipe=e.listWidth/e.options.touchThreshold,!0===e.options.verticalSwiping&&(e.touchObject.minSwipe=e.listHeight/e.options.touchThreshold),i.data.action){case\"start\":e.swipeStart(i);break;case\"move\":e.swipeMove(i);break;case\"end\":e.swipeEnd(i)}},e.prototype.swipeMove=function(i){var e,t,o,s,n,r,l=this;return n=void 0!==i.originalEvent?i.originalEvent.touches:null,!(!l.dragging||l.scrolling||n&&1!==n.length)&&(e=l.getLeft(l.currentSlide),l.touchObject.curX=void 0!==n?n[0].pageX:i.clientX,l.touchObject.curY=void 0!==n?n[0].pageY:i.clientY,l.touchObject.swipeLength=Math.round(Math.sqrt(Math.pow(l.touchObject.curX-l.touchObject.startX,2))),r=Math.round(Math.sqrt(Math.pow(l.touchObject.curY-l.touchObject.startY,2))),!l.options.verticalSwiping&&!l.swiping&&r>4?(l.scrolling=!0,!1):(!0===l.options.verticalSwiping&&(l.touchObject.swipeLength=r),t=l.swipeDirection(),void 0!==i.originalEvent&&l.touchObject.swipeLength>4&&(l.swiping=!0,i.preventDefault()),s=(!1===l.options.rtl?1:-1)*(l.touchObject.curX>l.touchObject.startX?1:-1),!0===l.options.verticalSwiping&&(s=l.touchObject.curY>l.touchObject.startY?1:-1),o=l.touchObject.swipeLength,l.touchObject.edgeHit=!1,!1===l.options.infinite&&(0===l.currentSlide&&\"right\"===t||l.currentSlide>=l.getDotCount()&&\"left\"===t)&&(o=l.touchObject.swipeLength*l.options.edgeFriction,l.touchObject.edgeHit=!0),!1===l.options.vertical?l.swipeLeft=e+o*s:l.swipeLeft=e+o*(l.$list.height()/l.listWidth)*s,!0===l.options.verticalSwiping&&(l.swipeLeft=e+o*s),!0!==l.options.fade&&!1!==l.options.touchMove&&(!0===l.animating?(l.swipeLeft=null,!1):void l.setCSS(l.swipeLeft))))},e.prototype.swipeStart=function(i){var e,t=this;if(t.interrupted=!0,1!==t.touchObject.fingerCount||t.slideCount<=t.options.slidesToShow)return t.touchObject={},!1;void 0!==i.originalEvent&&void 0!==i.originalEvent.touches&&(e=i.originalEvent.touches[0]),t.touchObject.startX=t.touchObject.curX=void 0!==e?e.pageX:i.clientX,t.touchObject.startY=t.touchObject.curY=void 0!==e?e.pageY:i.clientY,t.dragging=!0},e.prototype.unfilterSlides=e.prototype.slickUnfilter=function(){var i=this;null!==i.$slidesCache&&(i.unload(),i.$slideTrack.children(this.options.slide).detach(),i.$slidesCache.appendTo(i.$slideTrack),i.reinit())},e.prototype.unload=function(){var e=this;i(\".slick-cloned\",e.$slider).remove(),e.$dots&&e.$dots.remove(),e.$prevArrow&&e.htmlExpr.test(e.options.prevArrow)&&e.$prevArrow.remove(),e.$nextArrow&&e.htmlExpr.test(e.options.nextArrow)&&e.$nextArrow.remove(),e.$slides.removeClass(\"slick-slide slick-active slick-visible slick-current\").attr(\"aria-hidden\",\"true\").css(\"width\",\"\")},e.prototype.unslick=function(i){var e=this;e.$slider.trigger(\"unslick\",[e,i]),e.destroy()},e.prototype.updateArrows=function(){var i=this;Math.floor(i.options.slidesToShow/2),!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&!i.options.infinite&&(i.$prevArrow.removeClass(\"slick-disabled\").attr(\"aria-disabled\",\"false\"),i.$nextArrow.removeClass(\"slick-disabled\").attr(\"aria-disabled\",\"false\"),0===i.currentSlide?(i.$prevArrow.addClass(\"slick-disabled\").attr(\"aria-disabled\",\"true\"),i.$nextArrow.removeClass(\"slick-disabled\").attr(\"aria-disabled\",\"false\")):i.currentSlide>=i.slideCount-i.options.slidesToShow&&!1===i.options.centerMode?(i.$nextArrow.addClass(\"slick-disabled\").attr(\"aria-disabled\",\"true\"),i.$prevArrow.removeClass(\"slick-disabled\").attr(\"aria-disabled\",\"false\")):i.currentSlide>=i.slideCount-1&&!0===i.options.centerMode&&(i.$nextArrow.addClass(\"slick-disabled\").attr(\"aria-disabled\",\"true\"),i.$prevArrow.removeClass(\"slick-disabled\").attr(\"aria-disabled\",\"false\")))},e.prototype.updateDots=function(){var i=this;null!==i.$dots&&(i.$dots.find(\"li\").removeClass(\"slick-active\").end(),i.$dots.find(\"li\").eq(Math.floor(i.currentSlide/i.options.slidesToScroll)).addClass(\"slick-active\"))},e.prototype.visibility=function(){var i=this;i.options.autoplay&&(document[i.hidden]?i.interrupted=!0:i.interrupted=!1)},i.fn.slick=function(){var i,t,o=this,s=arguments[0],n=Array.prototype.slice.call(arguments,1),r=o.length;for(i=0;i<r;i++)if(\"object\"==typeof s||void 0===s?o[i].slick=new e(o[i],s):t=o[i].slick[s].apply(o[i].slick,n),void 0!==t)return t;return o}});\n","/**\n * jquery-circle-progress - jQuery Plugin to draw animated circular progress bars:\n * {@link http://kottenator.github.io/jquery-circle-progress/}\n *\n * @author Rostyslav Bryzgunov <kottenator@gmail.com>\n * @version 1.2.2\n * @licence MIT\n * @preserve\n */\n!function(i){if(\"function\"==typeof define&&define.amd)define([\"jquery\"],i);else if(\"object\"==typeof module&&module.exports){var t=require(\"jquery\");i(t),module.exports=t}else i(jQuery)}(function(i){function t(i){this.init(i)}t.prototype={value:0,size:100,startAngle:-Math.PI,thickness:\"auto\",fill:{gradient:[\"#3aeabb\",\"#fdd250\"]},emptyFill:\"rgba(0, 0, 0, .1)\",animation:{duration:1200,easing:\"circleProgressEasing\"},animationStartValue:0,reverse:!1,lineCap:\"butt\",insertMode:\"prepend\",constructor:t,el:null,canvas:null,ctx:null,radius:0,arcFill:null,lastFrameValue:0,init:function(t){i.extend(this,t),this.radius=this.size/2,this.initWidget(),this.initFill(),this.draw(),this.el.trigger(\"circle-inited\")},initWidget:function(){this.canvas||(this.canvas=i(\"<canvas>\")[\"prepend\"==this.insertMode?\"prependTo\":\"appendTo\"](this.el)[0]);var t=this.canvas;if(t.width=this.size,t.height=this.size,this.ctx=t.getContext(\"2d\"),window.devicePixelRatio>1){var e=window.devicePixelRatio;t.style.width=t.style.height=this.size+\"px\",t.width=t.height=this.size*e,this.ctx.scale(e,e)}},initFill:function(){function t(){var t=i(\"<canvas>\")[0];t.width=e.size,t.height=e.size,t.getContext(\"2d\").drawImage(g,0,0,r,r),e.arcFill=e.ctx.createPattern(t,\"no-repeat\"),e.drawFrame(e.lastFrameValue)}var e=this,a=this.fill,n=this.ctx,r=this.size;if(!a)throw Error(\"The fill is not specified!\");if(\"string\"==typeof a&&(a={color:a}),a.color&&(this.arcFill=a.color),a.gradient){var s=a.gradient;if(1==s.length)this.arcFill=s[0];else if(s.length>1){for(var l=a.gradientAngle||0,o=a.gradientDirection||[r/2*(1-Math.cos(l)),r/2*(1+Math.sin(l)),r/2*(1+Math.cos(l)),r/2*(1-Math.sin(l))],h=n.createLinearGradient.apply(n,o),c=0;c<s.length;c++){var d=s[c],u=c/(s.length-1);i.isArray(d)&&(u=d[1],d=d[0]),h.addColorStop(u,d)}this.arcFill=h}}if(a.image){var g;a.image instanceof Image?g=a.image:(g=new Image,g.src=a.image),g.complete?t():g.onload=t}},draw:function(){this.animation?this.drawAnimated(this.value):this.drawFrame(this.value)},drawFrame:function(i){this.lastFrameValue=i,this.ctx.clearRect(0,0,this.size,this.size),this.drawEmptyArc(i),this.drawArc(i)},drawArc:function(i){if(0!==i){var t=this.ctx,e=this.radius,a=this.getThickness(),n=this.startAngle;t.save(),t.beginPath(),this.reverse?t.arc(e,e,e-a/2,n-2*Math.PI*i,n):t.arc(e,e,e-a/2,n,n+2*Math.PI*i),t.lineWidth=a,t.lineCap=this.lineCap,t.strokeStyle=this.arcFill,t.stroke(),t.restore()}},drawEmptyArc:function(i){var t=this.ctx,e=this.radius,a=this.getThickness(),n=this.startAngle;i<1&&(t.save(),t.beginPath(),i<=0?t.arc(e,e,e-a/2,0,2*Math.PI):this.reverse?t.arc(e,e,e-a/2,n,n-2*Math.PI*i):t.arc(e,e,e-a/2,n+2*Math.PI*i,n),t.lineWidth=a,t.strokeStyle=this.emptyFill,t.stroke(),t.restore())},drawAnimated:function(t){var e=this,a=this.el,n=i(this.canvas);n.stop(!0,!1),a.trigger(\"circle-animation-start\"),n.css({animationProgress:0}).animate({animationProgress:1},i.extend({},this.animation,{step:function(i){var n=e.animationStartValue*(1-i)+t*i;e.drawFrame(n),a.trigger(\"circle-animation-progress\",[i,n])}})).promise().always(function(){a.trigger(\"circle-animation-end\")})},getThickness:function(){return i.isNumeric(this.thickness)?this.thickness:this.size/14},getValue:function(){return this.value},setValue:function(i){this.animation&&(this.animationStartValue=this.lastFrameValue),this.value=i,this.draw()}},i.circleProgress={defaults:t.prototype},i.easing.circleProgressEasing=function(i){return i<.5?(i=2*i,.5*i*i*i):(i=2-2*i,1-.5*i*i*i)},i.fn.circleProgress=function(e,a){var n=\"circle-progress\",r=this.data(n);if(\"widget\"==e){if(!r)throw Error('Calling \"widget\" method on not initialized instance is forbidden');return r.canvas}if(\"value\"==e){if(!r)throw Error('Calling \"value\" method on not initialized instance is forbidden');if(\"undefined\"==typeof a)return r.getValue();var s=arguments[1];return this.each(function(){i(this).data(n).setValue(s)})}return this.each(function(){var a=i(this),r=a.data(n),s=i.isPlainObject(e)?e:{};if(r)r.init(s);else{var l=i.extend({},a.data());\"string\"==typeof l.fill&&(l.fill=JSON.parse(l.fill)),\"string\"==typeof l.animation&&(l.animation=JSON.parse(l.animation)),s=i.extend(l,s),s.el=a,r=new t(s),a.data(n,r)}})}});","/*!\n * Intro.js v7.0.1\n * https://introjs.com\n *\n * Copyright (C) 2012-2023 Afshin Mehrabani (@afshinmeh).\n * https://introjs.com\n *\n * Date: Sat, 25 Mar 2023 14:24:34 GMT\n */\n!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).introJs=e()}(this,(function(){\"use strict\";function t(){t=function(){return e};var e={},n=Object.prototype,r=n.hasOwnProperty,i=Object.defineProperty||function(t,e,n){t[e]=n.value},o=\"function\"==typeof Symbol?Symbol:{},a=o.iterator||\"@@iterator\",s=o.asyncIterator||\"@@asyncIterator\",l=o.toStringTag||\"@@toStringTag\";function c(t,e,n){return Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{c({},\"\")}catch(t){c=function(t,e,n){return t[e]=n}}function u(t,e,n,r){var o=e&&e.prototype instanceof f?e:f,a=Object.create(o.prototype),s=new j(r||[]);return i(a,\"_invoke\",{value:x(t,n,s)}),a}function h(t,e,n){try{return{type:\"normal\",arg:t.call(e,n)}}catch(t){return{type:\"throw\",arg:t}}}e.wrap=u;var p={};function f(){}function d(){}function m(){}var b={};c(b,a,(function(){return this}));var v=Object.getPrototypeOf,y=v&&v(v(A([])));y&&y!==n&&r.call(y,a)&&(b=y);var g=m.prototype=f.prototype=Object.create(b);function w(t){[\"next\",\"throw\",\"return\"].forEach((function(e){c(t,e,(function(t){return this._invoke(e,t)}))}))}function _(t,e){function n(i,o,a,s){var l=h(t[i],t,o);if(\"throw\"!==l.type){var c=l.arg,u=c.value;return u&&\"object\"==typeof u&&r.call(u,\"__await\")?e.resolve(u.__await).then((function(t){n(\"next\",t,a,s)}),(function(t){n(\"throw\",t,a,s)})):e.resolve(u).then((function(t){c.value=t,a(c)}),(function(t){return n(\"throw\",t,a,s)}))}s(l.arg)}var o;i(this,\"_invoke\",{value:function(t,r){function i(){return new e((function(e,i){n(t,r,e,i)}))}return o=o?o.then(i,i):i()}})}function x(t,e,n){var r=\"suspendedStart\";return function(i,o){if(\"executing\"===r)throw new Error(\"Generator is already running\");if(\"completed\"===r){if(\"throw\"===i)throw o;return E()}for(n.method=i,n.arg=o;;){var a=n.delegate;if(a){var s=k(a,n);if(s){if(s===p)continue;return s}}if(\"next\"===n.method)n.sent=n._sent=n.arg;else if(\"throw\"===n.method){if(\"suspendedStart\"===r)throw r=\"completed\",n.arg;n.dispatchException(n.arg)}else\"return\"===n.method&&n.abrupt(\"return\",n.arg);r=\"executing\";var l=h(t,e,n);if(\"normal\"===l.type){if(r=n.done?\"completed\":\"suspendedYield\",l.arg===p)continue;return{value:l.arg,done:n.done}}\"throw\"===l.type&&(r=\"completed\",n.method=\"throw\",n.arg=l.arg)}}}function k(t,e){var n=t.iterator[e.method];if(void 0===n){if(e.delegate=null,\"throw\"===e.method){if(t.iterator.return&&(e.method=\"return\",e.arg=void 0,k(t,e),\"throw\"===e.method))return p;e.method=\"throw\",e.arg=new TypeError(\"The iterator does not provide a 'throw' method\")}return p}var r=h(n,t.iterator,e.arg);if(\"throw\"===r.type)return e.method=\"throw\",e.arg=r.arg,e.delegate=null,p;var i=r.arg;return i?i.done?(e[t.resultName]=i.value,e.next=t.nextLoc,\"return\"!==e.method&&(e.method=\"next\",e.arg=void 0),e.delegate=null,p):i:(e.method=\"throw\",e.arg=new TypeError(\"iterator result is not an object\"),e.delegate=null,p)}function C(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function S(t){var e=t.completion||{};e.type=\"normal\",delete e.arg,t.completion=e}function j(t){this.tryEntries=[{tryLoc:\"root\"}],t.forEach(C,this),this.reset(!0)}function A(t){if(t){var e=t[a];if(e)return e.call(t);if(\"function\"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,i=function e(){for(;++n<t.length;)if(r.call(t,n))return e.value=t[n],e.done=!1,e;return e.value=void 0,e.done=!0,e};return i.next=i}}return{next:E}}function E(){return{value:void 0,done:!0}}return d.prototype=m,i(g,\"constructor\",{value:m,configurable:!0}),i(m,\"constructor\",{value:d,configurable:!0}),d.displayName=c(m,l,\"GeneratorFunction\"),e.isGeneratorFunction=function(t){var e=\"function\"==typeof t&&t.constructor;return!!e&&(e===d||\"GeneratorFunction\"===(e.displayName||e.name))},e.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,m):(t.__proto__=m,c(t,l,\"GeneratorFunction\")),t.prototype=Object.create(g),t},e.awrap=function(t){return{__await:t}},w(_.prototype),c(_.prototype,s,(function(){return this})),e.AsyncIterator=_,e.async=function(t,n,r,i,o){void 0===o&&(o=Promise);var a=new _(u(t,n,r,i),o);return e.isGeneratorFunction(n)?a:a.next().then((function(t){return t.done?t.value:a.next()}))},w(g),c(g,l,\"Generator\"),c(g,a,(function(){return this})),c(g,\"toString\",(function(){return\"[object Generator]\"})),e.keys=function(t){var e=Object(t),n=[];for(var r in e)n.push(r);return n.reverse(),function t(){for(;n.length;){var r=n.pop();if(r in e)return t.value=r,t.done=!1,t}return t.done=!0,t}},e.values=A,j.prototype={constructor:j,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method=\"next\",this.arg=void 0,this.tryEntries.forEach(S),!t)for(var e in this)\"t\"===e.charAt(0)&&r.call(this,e)&&!isNaN(+e.slice(1))&&(this[e]=void 0)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if(\"throw\"===t.type)throw t.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var e=this;function n(n,r){return a.type=\"throw\",a.arg=t,e.next=n,r&&(e.method=\"next\",e.arg=void 0),!!r}for(var i=this.tryEntries.length-1;i>=0;--i){var o=this.tryEntries[i],a=o.completion;if(\"root\"===o.tryLoc)return n(\"end\");if(o.tryLoc<=this.prev){var s=r.call(o,\"catchLoc\"),l=r.call(o,\"finallyLoc\");if(s&&l){if(this.prev<o.catchLoc)return n(o.catchLoc,!0);if(this.prev<o.finallyLoc)return n(o.finallyLoc)}else if(s){if(this.prev<o.catchLoc)return n(o.catchLoc,!0)}else{if(!l)throw new Error(\"try statement without catch or finally\");if(this.prev<o.finallyLoc)return n(o.finallyLoc)}}}},abrupt:function(t,e){for(var n=this.tryEntries.length-1;n>=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&r.call(i,\"finallyLoc\")&&this.prev<i.finallyLoc){var o=i;break}}o&&(\"break\"===t||\"continue\"===t)&&o.tryLoc<=e&&e<=o.finallyLoc&&(o=null);var a=o?o.completion:{};return a.type=t,a.arg=e,o?(this.method=\"next\",this.next=o.finallyLoc,p):this.complete(a)},complete:function(t,e){if(\"throw\"===t.type)throw t.arg;return\"break\"===t.type||\"continue\"===t.type?this.next=t.arg:\"return\"===t.type?(this.rval=this.arg=t.arg,this.method=\"return\",this.next=\"end\"):\"normal\"===t.type&&e&&(this.next=e),p},finish:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),S(n),p}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if(\"throw\"===r.type){var i=r.arg;S(n)}return i}}throw new Error(\"illegal catch attempt\")},delegateYield:function(t,e,n){return this.delegate={iterator:A(t),resultName:e,nextLoc:n},\"next\"===this.method&&(this.arg=void 0),p}},e}function e(t){return e=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},e(t)}function n(t,e,n,r,i,o,a){try{var s=t[o](a),l=s.value}catch(t){return void n(t)}s.done?e(l):Promise.resolve(l).then(r,i)}function r(t){return function(){var e=this,r=arguments;return new Promise((function(i,o){var a=t.apply(e,r);function s(t){n(a,i,o,s,l,\"next\",t)}function l(t){n(a,i,o,s,l,\"throw\",t)}s(void 0)}))}}function i(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}function o(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function a(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var n=null==t?null:\"undefined\"!=typeof Symbol&&t[Symbol.iterator]||t[\"@@iterator\"];if(null==n)return;var r,i,o=[],a=!0,s=!1;try{for(n=n.call(t);!(a=(r=n.next()).done)&&(o.push(r.value),!e||o.length!==e);a=!0);}catch(t){s=!0,i=t}finally{try{a||null==n.return||n.return()}finally{if(s)throw i}}return o}(t,e)||function(t,e){if(!t)return;if(\"string\"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);\"Object\"===n&&t.constructor&&(n=t.constructor.name);if(\"Map\"===n||\"Set\"===n)return Array.from(t);if(\"Arguments\"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return s(t,e)}(t,e)||function(){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 s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n<e;n++)r[n]=t[n];return r}var l,c=(l={},function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"introjs-stamp\";return l[e]=l[e]||0,void 0===t[e]&&(t[e]=l[e]++),t[e]});function u(t,e,n){if(t)for(var r=0,i=t.length;r<i;r++)e(t[r],r);\"function\"==typeof n&&n()}var h=new function(){var t=\"introjs_event\";this._id=function(t,e,n){return t+c(e)+(n?\"_\".concat(c(n)):\"\")},this.on=function(e,n,r,i,o){var a=this._id.apply(this,[n,r,i]),s=function(t){return r.call(i||e,t||window.event)};\"addEventListener\"in e?e.addEventListener(n,s,o):\"attachEvent\"in e&&e.attachEvent(\"on\".concat(n),s),e[t]=e[t]||{},e[t][a]=s},this.off=function(e,n,r,i,o){var a=this._id.apply(this,[n,r,i]),s=e[t]&&e[t][a];s&&(\"removeEventListener\"in e?e.removeEventListener(n,s,o):\"detachEvent\"in e&&e.detachEvent(\"on\".concat(n),s),e[t][a]=null)}};function p(t,e){if(t instanceof SVGElement){var n=t.getAttribute(\"class\")||\"\";n.match(e)||t.setAttribute(\"class\",\"\".concat(n,\" \").concat(e))}else{if(void 0!==t.classList)u(e.split(\" \"),(function(e){t.classList.add(e)}));else t.className.match(e)||(t.className+=\" \".concat(e))}}function f(t,e){var n=\"\";return\"currentStyle\"in t?n=t.currentStyle[e]:document.defaultView&&document.defaultView.getComputedStyle&&(n=document.defaultView.getComputedStyle(t,null).getPropertyValue(e)),n&&n.toLowerCase?n.toLowerCase():n}function d(t){p(t,\"introjs-showElement\");var e=f(t,\"position\");\"absolute\"!==e&&\"relative\"!==e&&\"sticky\"!==e&&\"fixed\"!==e&&p(t,\"introjs-relativePosition\")}function m(t){if(this._options.scrollToElement){var e=function(t){var e=window.getComputedStyle(t),n=\"absolute\"===e.position,r=/(auto|scroll)/;if(\"fixed\"===e.position)return document.body;for(var i=t;i=i.parentElement;)if(e=window.getComputedStyle(i),(!n||\"static\"!==e.position)&&r.test(e.overflow+e.overflowY+e.overflowX))return i;return document.body}(t);e!==document.body&&(e.scrollTop=t.offsetTop-e.offsetTop)}}function b(){if(void 0!==window.innerWidth)return{width:window.innerWidth,height:window.innerHeight};var t=document.documentElement;return{width:t.clientWidth,height:t.clientHeight}}function v(t,e,n){var r;if(\"off\"!==t&&(this._options.scrollToElement&&(r=\"tooltip\"===t?n.getBoundingClientRect():e.getBoundingClientRect(),!function(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom+80<=window.innerHeight&&e.right<=window.innerWidth}(e)))){var i=b().height;r.bottom-(r.bottom-r.top)<0||e.clientHeight>i?window.scrollBy(0,r.top-(i/2-r.height/2)-this._options.scrollPadding):window.scrollBy(0,r.top-(i/2-r.height/2)+this._options.scrollPadding)}}function y(t){t.setAttribute(\"role\",\"button\"),t.tabIndex=0}function g(t){var e=t.parentElement;return!(!e||\"HTML\"===e.nodeName)&&(\"fixed\"===f(t,\"position\")||g(e))}function w(t,e){var n=document.body,r=document.documentElement,i=window.pageYOffset||r.scrollTop||n.scrollTop,o=window.pageXOffset||r.scrollLeft||n.scrollLeft;e=e||n;var a=t.getBoundingClientRect(),s=e.getBoundingClientRect(),l=f(e,\"position\"),c={width:a.width,height:a.height};return\"body\"!==e.tagName.toLowerCase()&&\"relative\"===l||\"sticky\"===l?Object.assign(c,{top:a.top-s.top,left:a.left-s.left}):g(t)?Object.assign(c,{top:a.top,left:a.left}):Object.assign(c,{top:a.top+i,left:a.left+o})}function _(t,e){if(t instanceof SVGElement){var n=t.getAttribute(\"class\")||\"\";t.setAttribute(\"class\",n.replace(e,\"\").replace(/^\\s+|\\s+$/g,\"\"))}else t.className=t.className.replace(e,\"\").replace(/^\\s+|\\s+$/g,\"\")}function x(t,e){var n=\"\";if(t.style.cssText&&(n+=t.style.cssText),\"string\"==typeof e)n+=e;else for(var r in e)n+=\"\".concat(r,\":\").concat(e[r],\";\");t.style.cssText=n}function k(t){if(t){if(!this._introItems[this._currentStep])return;var e=this._introItems[this._currentStep],n=w(e.element,this._targetElement),r=this._options.helperElementPadding;g(e.element)?p(t,\"introjs-fixedTooltip\"):_(t,\"introjs-fixedTooltip\"),\"floating\"===e.position&&(r=0),x(t,{width:\"\".concat(n.width+r,\"px\"),height:\"\".concat(n.height+r,\"px\"),top:\"\".concat(n.top-r/2,\"px\"),left:\"\".concat(n.left-r/2,\"px\")})}}function C(t,e,n,r,i){return t.left+e+n.width>r.width?(i.style.left=\"\".concat(r.width-n.width-t.left,\"px\"),!1):(i.style.left=\"\".concat(e,\"px\"),!0)}function S(t,e,n,r){return t.left+t.width-e-n.width<0?(r.style.left=\"\".concat(-t.left,\"px\"),!1):(r.style.right=\"\".concat(e,\"px\"),!0)}function j(t,e){t.includes(e)&&t.splice(t.indexOf(e),1)}function A(t,e,n){var r=this._options.positionPrecedence.slice(),i=b(),o=w(e).height+10,a=w(e).width+20,s=t.getBoundingClientRect(),l=\"floating\";s.bottom+o>i.height&&j(r,\"bottom\"),s.top-o<0&&j(r,\"top\"),s.right+a>i.width&&j(r,\"right\"),s.left-a<0&&j(r,\"left\");var c,u,h=-1!==(u=(c=n||\"\").indexOf(\"-\"))?c.substr(u):\"\";return n&&(n=n.split(\"-\")[0]),r.length&&(l=r.includes(n)?n:r[0]),[\"top\",\"bottom\"].includes(l)&&(l+=function(t,e,n,r){var i=e/2,o=Math.min(n,window.screen.width),a=[\"-left-aligned\",\"-middle-aligned\",\"-right-aligned\"];return o-t<e&&j(a,\"-left-aligned\"),(t<i||o-t<i)&&j(a,\"-middle-aligned\"),t<e&&j(a,\"-right-aligned\"),a.length?a.includes(r)?r:a[0]:\"-middle-aligned\"}(s.left,a,i.width,h)),l}function E(t,e,n,r){var i,o,a,s,l,c=\"\";if(r=r||!1,e.style.top=null,e.style.right=null,e.style.bottom=null,e.style.left=null,e.style.marginLeft=null,e.style.marginTop=null,n.style.display=\"inherit\",this._introItems[this._currentStep]){c=\"string\"==typeof(i=this._introItems[this._currentStep]).tooltipClass?i.tooltipClass:this._options.tooltipClass,e.className=[\"introjs-tooltip\",c].filter(Boolean).join(\" \"),e.setAttribute(\"role\",\"dialog\"),\"floating\"!==(l=this._introItems[this._currentStep].position)&&this._options.autoPosition&&(l=A.call(this,t,e,l)),a=w(t),o=w(e),s=b(),p(e,\"introjs-\".concat(l));var u=a.width/2-o.width/2;switch(l){case\"top-right-aligned\":n.className=\"introjs-arrow bottom-right\";var h=0;S(a,h,o,e),e.style.bottom=\"\".concat(a.height+20,\"px\");break;case\"top-middle-aligned\":n.className=\"introjs-arrow bottom-middle\",r&&(u+=5),S(a,u,o,e)&&(e.style.right=null,C(a,u,o,s,e)),e.style.bottom=\"\".concat(a.height+20,\"px\");break;case\"top-left-aligned\":case\"top\":n.className=\"introjs-arrow bottom\",C(a,r?0:15,o,s,e),e.style.bottom=\"\".concat(a.height+20,\"px\");break;case\"right\":e.style.left=\"\".concat(a.width+20,\"px\"),a.top+o.height>s.height?(n.className=\"introjs-arrow left-bottom\",e.style.top=\"-\".concat(o.height-a.height-20,\"px\")):n.className=\"introjs-arrow left\";break;case\"left\":r||!0!==this._options.showStepNumbers||(e.style.top=\"15px\"),a.top+o.height>s.height?(e.style.top=\"-\".concat(o.height-a.height-20,\"px\"),n.className=\"introjs-arrow right-bottom\"):n.className=\"introjs-arrow right\",e.style.right=\"\".concat(a.width+20,\"px\");break;case\"floating\":n.style.display=\"none\",e.style.left=\"50%\",e.style.top=\"50%\",e.style.marginLeft=\"-\".concat(o.width/2,\"px\"),e.style.marginTop=\"-\".concat(o.height/2,\"px\");break;case\"bottom-right-aligned\":n.className=\"introjs-arrow top-right\",S(a,h=0,o,e),e.style.top=\"\".concat(a.height+20,\"px\");break;case\"bottom-middle-aligned\":n.className=\"introjs-arrow top-middle\",r&&(u+=5),S(a,u,o,e)&&(e.style.right=null,C(a,u,o,s,e)),e.style.top=\"\".concat(a.height+20,\"px\");break;default:n.className=\"introjs-arrow top\",C(a,0,o,s,e),e.style.top=\"\".concat(a.height+20,\"px\")}}}function N(){u(Array.from(document.querySelectorAll(\".introjs-showElement\")),(function(t){_(t,/introjs-[a-zA-Z]+/g)}))}function L(t,e){var n=document.createElement(t);e=e||{};var r=/^(?:role|data-|aria-)/;for(var i in e){var o=e[i];\"style\"===i?x(n,o):i.match(r)?n.setAttribute(i,o):n[i]=o}return n}function T(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(n){var r=e.style.opacity||\"1\";x(e,{opacity:\"0\"}),window.setTimeout((function(){x(e,{opacity:r})}),10)}t.appendChild(e)}function I(){return parseInt(this._currentStep+1,10)/this._introItems.length*100}function P(){var t=document.querySelector(\".introjs-disableInteraction\");null===t&&(t=L(\"div\",{className:\"introjs-disableInteraction\"}),this._targetElement.appendChild(t)),k.call(this,t)}function q(t){var e=this,n=L(\"div\",{className:\"introjs-bullets\"});!1===this._options.showBullets&&(n.style.display=\"none\");var r=L(\"ul\");r.setAttribute(\"role\",\"tablist\");var i=function(){e.goToStep(this.getAttribute(\"data-step-number\"))};return u(this._introItems,(function(e,n){var o=e.step,a=L(\"li\"),s=L(\"a\");a.setAttribute(\"role\",\"presentation\"),s.setAttribute(\"role\",\"tab\"),s.onclick=i,n===t.step-1&&(s.className=\"active\"),y(s),s.innerHTML=\"&nbsp;\",s.setAttribute(\"data-step-number\",o),a.appendChild(s),r.appendChild(a)})),n.appendChild(r),n}function O(t){if(this._options.showBullets){var e=document.querySelector(\".introjs-bullets\");e&&e.parentNode.replaceChild(q.call(this,t),e)}}function B(t,e){this._options.showBullets&&(t.querySelector(\".introjs-bullets li > a.active\").className=\"\",t.querySelector('.introjs-bullets li > a[data-step-number=\"'.concat(e.step,'\"]')).className=\"active\")}function H(){var t=L(\"div\");t.className=\"introjs-progress\",!1===this._options.showProgress&&(t.style.display=\"none\");var e=L(\"div\",{className:\"introjs-progressbar\"});return this._options.progressBarAdditionalClass&&(e.className+=\" \"+this._options.progressBarAdditionalClass),e.setAttribute(\"role\",\"progress\"),e.setAttribute(\"aria-valuemin\",\"0\"),e.setAttribute(\"aria-valuemax\",\"100\"),e.setAttribute(\"aria-valuenow\",I.call(this)),e.style.cssText=\"width:\".concat(I.call(this),\"%;\"),t.appendChild(e),t}function R(t){t.querySelector(\".introjs-progress .introjs-progressbar\").style.cssText=\"width:\".concat(I.call(this),\"%;\"),t.querySelector(\".introjs-progress .introjs-progressbar\").setAttribute(\"aria-valuenow\",I.call(this))}function M(t){return F.apply(this,arguments)}function F(){return(F=r(t().mark((function e(n){var i,o,a,s,l,c,u,h,f,b,g,w,_,C,S,j,A,I,O,M,F,D,G,V,z,Y=this;return t().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(void 0===this._introChangeCallback){e.next=3;break}return e.next=3,this._introChangeCallback.call(this,n.element);case 3:if(i=this,o=document.querySelector(\".introjs-helperLayer\"),a=document.querySelector(\".introjs-tooltipReferenceLayer\"),s=\"introjs-helperLayer\",\"string\"==typeof n.highlightClass&&(s+=\" \".concat(n.highlightClass)),\"string\"==typeof this._options.highlightClass&&(s+=\" \".concat(this._options.highlightClass)),null!==o&&null!==a?(h=a.querySelector(\".introjs-helperNumberLayer\"),f=a.querySelector(\".introjs-tooltiptext\"),b=a.querySelector(\".introjs-tooltip-title\"),g=a.querySelector(\".introjs-arrow\"),w=a.querySelector(\".introjs-tooltip\"),u=a.querySelector(\".introjs-skipbutton\"),c=a.querySelector(\".introjs-prevbutton\"),l=a.querySelector(\".introjs-nextbutton\"),o.className=s,w.style.opacity=\"0\",w.style.display=\"none\",m.call(i,n.element),k.call(i,o),k.call(i,a),N(),i._lastShowElementTimer&&window.clearTimeout(i._lastShowElementTimer),i._lastShowElementTimer=window.setTimeout((function(){null!==h&&(h.innerHTML=\"\".concat(n.step,\" \").concat(Y._options.stepNumbersOfLabel,\" \").concat(Y._introItems.length)),f.innerHTML=n.intro,b.innerHTML=n.title,w.style.display=\"block\",E.call(i,n.element,w,g),B.call(i,a,n),R.call(i,a),w.style.opacity=\"1\",(null!=l&&/introjs-donebutton/gi.test(l.className)||null!=l)&&l.focus(),v.call(i,n.scrollTo,n.element,f)}),350)):(_=L(\"div\",{className:s}),C=L(\"div\",{className:\"introjs-tooltipReferenceLayer\"}),S=L(\"div\",{className:\"introjs-arrow\"}),j=L(\"div\",{className:\"introjs-tooltip\"}),A=L(\"div\",{className:\"introjs-tooltiptext\"}),I=L(\"div\",{className:\"introjs-tooltip-header\"}),O=L(\"h1\",{className:\"introjs-tooltip-title\"}),M=L(\"div\"),x(_,{\"box-shadow\":\"0 0 1px 2px rgba(33, 33, 33, 0.8), rgba(33, 33, 33, \".concat(i._options.overlayOpacity.toString(),\") 0 0 0 5000px\")}),m.call(i,n.element),k.call(i,_),k.call(i,C),T(this._targetElement,_,!0),T(this._targetElement,C),A.innerHTML=n.intro,O.innerHTML=n.title,M.className=\"introjs-tooltipbuttons\",!1===this._options.showButtons&&(M.style.display=\"none\"),I.appendChild(O),j.appendChild(I),j.appendChild(A),this._options.dontShowAgain&&(F=L(\"div\",{className:\"introjs-dontShowAgain\"}),(D=L(\"input\",{type:\"checkbox\",id:\"introjs-dontShowAgain\",name:\"introjs-dontShowAgain\"})).onchange=function(t){Y.setDontShowAgain(t.target.checked)},(G=L(\"label\",{htmlFor:\"introjs-dontShowAgain\"})).innerText=this._options.dontShowAgainLabel,F.appendChild(D),F.appendChild(G),j.appendChild(F)),j.appendChild(q.call(this,n)),j.appendChild(H.call(this)),V=L(\"div\"),!0===this._options.showStepNumbers&&(V.className=\"introjs-helperNumberLayer\",V.innerHTML=\"\".concat(n.step,\" \").concat(this._options.stepNumbersOfLabel,\" \").concat(this._introItems.length),j.appendChild(V)),j.appendChild(S),C.appendChild(j),(l=L(\"a\")).onclick=r(t().mark((function e(){return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(i._introItems.length-1===i._currentStep){t.next=5;break}return t.next=3,W.call(i);case 3:t.next=11;break;case 5:if(!/introjs-donebutton/gi.test(l.className)){t.next=11;break}if(\"function\"!=typeof i._introCompleteCallback){t.next=9;break}return t.next=9,i._introCompleteCallback.call(i,i._currentStep,\"done\");case 9:return t.next=11,xt.call(i,i._targetElement);case 11:case\"end\":return t.stop()}}),e)}))),y(l),l.innerHTML=this._options.nextLabel,(c=L(\"a\")).onclick=r(t().mark((function e(){return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(0===i._currentStep){t.next=3;break}return t.next=3,$.call(i);case 3:case\"end\":return t.stop()}}),e)}))),y(c),c.innerHTML=this._options.prevLabel,y(u=L(\"a\",{className:\"introjs-skipbutton\"})),u.innerHTML=this._options.skipLabel,u.onclick=r(t().mark((function e(){return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(i._introItems.length-1!==i._currentStep||\"function\"!=typeof i._introCompleteCallback){t.next=3;break}return t.next=3,i._introCompleteCallback.call(i,i._currentStep,\"skip\");case 3:if(\"function\"!=typeof i._introSkipCallback){t.next=6;break}return t.next=6,i._introSkipCallback.call(i);case 6:return t.next=8,xt.call(i,i._targetElement);case 8:case\"end\":return t.stop()}}),e)}))),I.appendChild(u),this._introItems.length>1&&M.appendChild(c),M.appendChild(l),j.appendChild(M),E.call(i,n.element,j,S),v.call(this,n.scrollTo,n.element,j)),(z=i._targetElement.querySelector(\".introjs-disableInteraction\"))&&z.parentNode.removeChild(z),n.disableInteraction&&P.call(i),0===this._currentStep&&this._introItems.length>1?(null!=l&&(l.className=\"\".concat(this._options.buttonClass,\" introjs-nextbutton\"),l.innerHTML=this._options.nextLabel),!0===this._options.hidePrev?(null!=c&&(c.className=\"\".concat(this._options.buttonClass,\" introjs-prevbutton introjs-hidden\")),null!=l&&p(l,\"introjs-fullbutton\")):null!=c&&(c.className=\"\".concat(this._options.buttonClass,\" introjs-prevbutton introjs-disabled\"))):this._introItems.length-1===this._currentStep||1===this._introItems.length?(null!=c&&(c.className=\"\".concat(this._options.buttonClass,\" introjs-prevbutton\")),!0===this._options.hideNext?(null!=l&&(l.className=\"\".concat(this._options.buttonClass,\" introjs-nextbutton introjs-hidden\")),null!=c&&p(c,\"introjs-fullbutton\")):null!=l&&(!0===this._options.nextToDone?(l.innerHTML=this._options.doneLabel,p(l,\"\".concat(this._options.buttonClass,\" introjs-nextbutton introjs-donebutton\"))):l.className=\"\".concat(this._options.buttonClass,\" introjs-nextbutton introjs-disabled\"))):(null!=c&&(c.className=\"\".concat(this._options.buttonClass,\" introjs-prevbutton\")),null!=l&&(l.className=\"\".concat(this._options.buttonClass,\" introjs-nextbutton\"),l.innerHTML=this._options.nextLabel)),null!=c&&c.setAttribute(\"role\",\"button\"),null!=l&&l.setAttribute(\"role\",\"button\"),null!=u&&u.setAttribute(\"role\",\"button\"),null!=l&&l.focus(),d(n.element),void 0===this._introAfterChangeCallback){e.next=22;break}return e.next=22,this._introAfterChangeCallback.call(this,n.element);case 22:case\"end\":return e.stop()}}),e,this)})))).apply(this,arguments)}function D(t){return G.apply(this,arguments)}function G(){return(G=r(t().mark((function e(n){return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(this._currentStep=n-2,void 0===this._introItems){t.next=4;break}return t.next=4,W.call(this);case 4:case\"end\":return t.stop()}}),e,this)})))).apply(this,arguments)}function V(t){return z.apply(this,arguments)}function z(){return(z=r(t().mark((function e(n){return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(this._currentStepNumber=n,void 0===this._introItems){t.next=4;break}return t.next=4,W.call(this);case 4:case\"end\":return t.stop()}}),e,this)})))).apply(this,arguments)}function W(){return Y.apply(this,arguments)}function Y(){return Y=r(t().mark((function e(){var n,r,i=this;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(this._direction=\"forward\",void 0!==this._currentStepNumber&&u(this._introItems,(function(t,e){t.step===i._currentStepNumber&&(i._currentStep=e-1,i._currentStepNumber=void 0)})),void 0===this._currentStep?this._currentStep=0:++this._currentStep,n=this._introItems[this._currentStep],r=!0,void 0===this._introBeforeChangeCallback){t.next=9;break}return t.next=8,this._introBeforeChangeCallback.call(this,n&&n.element);case 8:r=t.sent;case 9:if(!1!==r){t.next=12;break}return--this._currentStep,t.abrupt(\"return\",!1);case 12:if(!(this._introItems.length<=this._currentStep)){t.next=19;break}if(\"function\"!=typeof this._introCompleteCallback){t.next=16;break}return t.next=16,this._introCompleteCallback.call(this,this._currentStep,\"end\");case 16:return t.next=18,xt.call(this,this._targetElement);case 18:return t.abrupt(\"return\",!1);case 19:return t.next=21,M.call(this,n);case 21:return t.abrupt(\"return\",!0);case 22:case\"end\":return t.stop()}}),e,this)}))),Y.apply(this,arguments)}function $(){return Q.apply(this,arguments)}function Q(){return Q=r(t().mark((function e(){var n,r;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(this._direction=\"backward\",0!==this._currentStep){t.next=3;break}return t.abrupt(\"return\",!1);case 3:if(--this._currentStep,n=this._introItems[this._currentStep],r=!0,void 0===this._introBeforeChangeCallback){t.next=10;break}return t.next=9,this._introBeforeChangeCallback.call(this,n&&n.element);case 9:r=t.sent;case 10:if(!1!==r){t.next=13;break}return++this._currentStep,t.abrupt(\"return\",!1);case 13:return t.next=15,M.call(this,n);case 15:return t.abrupt(\"return\",!0);case 16:case\"end\":return t.stop()}}),e,this)}))),Q.apply(this,arguments)}function U(){return this._currentStep}function X(t){return J.apply(this,arguments)}function J(){return(J=r(t().mark((function e(n){var r,i;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(null===(r=void 0===n.code?n.which:n.code)&&(r=null===n.charCode?n.keyCode:n.charCode),\"Escape\"!==r&&27!==r||!0!==this._options.exitOnEsc){t.next=7;break}return t.next=5,xt.call(this,this._targetElement);case 5:t.next=39;break;case 7:if(\"ArrowLeft\"!==r&&37!==r){t.next=12;break}return t.next=10,$.call(this);case 10:t.next=39;break;case 12:if(\"ArrowRight\"!==r&&39!==r){t.next=17;break}return t.next=15,W.call(this);case 15:t.next=39;break;case 17:if(\"Enter\"!==r&&\"NumpadEnter\"!==r&&13!==r){t.next=39;break}if(!(i=n.target||n.srcElement)||!i.className.match(\"introjs-prevbutton\")){t.next=24;break}return t.next=22,$.call(this);case 22:t.next=38;break;case 24:if(!i||!i.className.match(\"introjs-skipbutton\")){t.next=32;break}if(this._introItems.length-1!==this._currentStep||\"function\"!=typeof this._introCompleteCallback){t.next=28;break}return t.next=28,this._introCompleteCallback.call(this,this._currentStep,\"skip\");case 28:return t.next=30,xt.call(this,this._targetElement);case 30:t.next=38;break;case 32:if(!i||!i.getAttribute(\"data-step-number\")){t.next=36;break}i.click(),t.next=38;break;case 36:return t.next=38,W.call(this);case 38:n.preventDefault?n.preventDefault():n.returnValue=!1;case 39:case\"end\":return t.stop()}}),e,this)})))).apply(this,arguments)}function Z(t){if(null===t||\"object\"!==e(t)||\"nodeType\"in t)return t;var n={};for(var r in t)\"jQuery\"in window&&t[r]instanceof window.jQuery?n[r]=t[r]:n[r]=Z(t[r]);return n}function K(t,e){var n,r=this;return function(){for(var i=arguments.length,o=new Array(i),a=0;a<i;a++)o[a]=arguments[a];clearTimeout(n),n=setTimeout((function(){t.apply(r,o)}),e)}}function tt(t){var e=document.querySelector(\".introjs-hints\");return e?Array.from(e.querySelectorAll(t)):[]}function et(t){return nt.apply(this,arguments)}function nt(){return(nt=r(t().mark((function e(n){var r;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(r=tt('.introjs-hint[data-step=\"'.concat(n,'\"]'))[0],dt.call(this),r&&p(r,\"introjs-hidehint\"),void 0===this._hintCloseCallback){t.next=6;break}return t.next=6,this._hintCloseCallback.call(this,n);case 6:case\"end\":return t.stop()}}),e,this)})))).apply(this,arguments)}function rt(){var e=this;u(tt(\".introjs-hint\"),function(){var n=r(t().mark((function n(r){return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,et.call(e,r.getAttribute(\"data-step\"));case 2:case\"end\":return t.stop()}}),n)})));return function(t){return n.apply(this,arguments)}}())}function it(){return ot.apply(this,arguments)}function ot(){return(ot=r(t().mark((function e(){var n,r=this;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!(n=tt(\".introjs-hint\"))||!n.length){t.next=5;break}u(n,(function(t){at.call(r,t.getAttribute(\"data-step\"))})),t.next=7;break;case 5:return t.next=7,mt.call(this,this._targetElement);case 7:case\"end\":return t.stop()}}),e,this)})))).apply(this,arguments)}function at(t){var e=tt('.introjs-hint[data-step=\"'.concat(t,'\"]'))[0];e&&_(e,/introjs-hidehint/g)}function st(){var t=this;u(tt(\".introjs-hint\"),(function(e){lt.call(t,e.getAttribute(\"data-step\"))})),h.off(document,\"click\",dt,this,!1),h.off(window,\"resize\",vt,this,!0),this._hintsAutoRefreshFunction&&h.off(window,\"scroll\",this._hintsAutoRefreshFunction,this,!0)}function lt(t){var e=tt('.introjs-hint[data-step=\"'.concat(t,'\"]'))[0];e&&e.parentNode.removeChild(e)}function ct(){return ut.apply(this,arguments)}function ut(){return(ut=r(t().mark((function e(){var n,r,i,o=this;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(n=this,null===(r=document.querySelector(\".introjs-hints\"))&&(r=L(\"div\",{className:\"introjs-hints\"})),i=function(t){return function(e){var r=e||window.event;r.stopPropagation&&r.stopPropagation(),null!==r.cancelBubble&&(r.cancelBubble=!0),pt.call(n,t)}},u(this._introItems,(function(t,e){if(!document.querySelector('.introjs-hint[data-step=\"'.concat(e,'\"]'))){var n=L(\"a\",{className:\"introjs-hint\"});y(n),n.onclick=i(e),t.hintAnimation||p(n,\"introjs-hint-no-anim\"),g(t.element)&&p(n,\"introjs-fixedhint\");var a=L(\"div\",{className:\"introjs-hint-dot\"}),s=L(\"div\",{className:\"introjs-hint-pulse\"});n.appendChild(a),n.appendChild(s),n.setAttribute(\"data-step\",e.toString());var l=t.element;t.element=n,ht.call(o,t.hintPosition,n,l),r.appendChild(n)}})),document.body.appendChild(r),void 0===this._hintsAddedCallback){t.next=9;break}return t.next=9,this._hintsAddedCallback.call(this);case 9:this._options.hintAutoRefreshInterval>=0&&(this._hintsAutoRefreshFunction=K((function(){return vt.call(o)}),this._options.hintAutoRefreshInterval),h.on(window,\"scroll\",this._hintsAutoRefreshFunction,this,!0));case 10:case\"end\":return t.stop()}}),e,this)})))).apply(this,arguments)}function ht(t,e,n){var r=w.call(this,n),i=20,o=20;switch(t){default:case\"top-left\":e.style.left=\"\".concat(r.left,\"px\"),e.style.top=\"\".concat(r.top,\"px\");break;case\"top-right\":e.style.left=\"\".concat(r.left+r.width-i,\"px\"),e.style.top=\"\".concat(r.top,\"px\");break;case\"bottom-left\":e.style.left=\"\".concat(r.left,\"px\"),e.style.top=\"\".concat(r.top+r.height-o,\"px\");break;case\"bottom-right\":e.style.left=\"\".concat(r.left+r.width-i,\"px\"),e.style.top=\"\".concat(r.top+r.height-o,\"px\");break;case\"middle-left\":e.style.left=\"\".concat(r.left,\"px\"),e.style.top=\"\".concat(r.top+(r.height-o)/2,\"px\");break;case\"middle-right\":e.style.left=\"\".concat(r.left+r.width-i,\"px\"),e.style.top=\"\".concat(r.top+(r.height-o)/2,\"px\");break;case\"middle-middle\":e.style.left=\"\".concat(r.left+(r.width-i)/2,\"px\"),e.style.top=\"\".concat(r.top+(r.height-o)/2,\"px\");break;case\"bottom-middle\":e.style.left=\"\".concat(r.left+(r.width-i)/2,\"px\"),e.style.top=\"\".concat(r.top+r.height-o,\"px\");break;case\"top-middle\":e.style.left=\"\".concat(r.left+(r.width-i)/2,\"px\"),e.style.top=\"\".concat(r.top,\"px\")}}function pt(t){return ft.apply(this,arguments)}function ft(){return(ft=r(t().mark((function e(n){var r,i,o,a,s,l,c,u,h;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(r=document.querySelector('.introjs-hint[data-step=\"'.concat(n,'\"]')),i=this._introItems[n],void 0===this._hintClickCallback){t.next=5;break}return t.next=5,this._hintClickCallback.call(this,r,i,n);case 5:if(o=dt.call(this),parseInt(o,10)!==n){t.next=8;break}return t.abrupt(\"return\");case 8:a=L(\"div\",{className:\"introjs-tooltip\"}),s=L(\"div\"),l=L(\"div\"),c=L(\"div\"),a.onclick=function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},s.className=\"introjs-tooltiptext\",(u=L(\"p\")).innerHTML=i.hint,s.appendChild(u),this._options.hintShowButton&&((h=L(\"a\")).className=this._options.buttonClass,h.setAttribute(\"role\",\"button\"),h.innerHTML=this._options.hintButtonLabel,h.onclick=et.bind(this,n),s.appendChild(h)),l.className=\"introjs-arrow\",a.appendChild(l),a.appendChild(s),this._currentStep=r.getAttribute(\"data-step\"),c.className=\"introjs-tooltipReferenceLayer introjs-hintReference\",c.setAttribute(\"data-step\",r.getAttribute(\"data-step\")),k.call(this,c),c.appendChild(a),document.body.appendChild(c),E.call(this,r,a,l,!0);case 28:case\"end\":return t.stop()}}),e,this)})))).apply(this,arguments)}function dt(){var t=document.querySelector(\".introjs-hintReference\");if(t){var e=t.getAttribute(\"data-step\");return t.parentNode.removeChild(t),e}}function mt(t){return bt.apply(this,arguments)}function bt(){return(bt=r(t().mark((function e(n){var r,i=this;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(this._introItems=[],!this._options.hints){t.next=5;break}u(this._options.hints,(function(t){var e=Z(t);\"string\"==typeof e.element&&(e.element=document.querySelector(e.element)),e.hintPosition=e.hintPosition||i._options.hintPosition,e.hintAnimation=e.hintAnimation||i._options.hintAnimation,null!==e.element&&i._introItems.push(e)})),t.next=9;break;case 5:if((r=Array.from(n.querySelectorAll(\"*[data-hint]\")))&&r.length){t.next=8;break}return t.abrupt(\"return\",!1);case 8:u(r,(function(t){var e=t.getAttribute(\"data-hint-animation\");e=e?\"true\"===e:i._options.hintAnimation,i._introItems.push({element:t,hint:t.getAttribute(\"data-hint\"),hintPosition:t.getAttribute(\"data-hint-position\")||i._options.hintPosition,hintAnimation:e,tooltipClass:t.getAttribute(\"data-tooltip-class\"),position:t.getAttribute(\"data-position\")||i._options.tooltipPosition})}));case 9:return t.next=11,ct.call(this);case 11:return h.on(document,\"click\",dt,this,!1),h.on(window,\"resize\",vt,this,!0),t.abrupt(\"return\",!0);case 14:case\"end\":return t.stop()}}),e,this)})))).apply(this,arguments)}function vt(){var t=this;u(this._introItems,(function(e){var n=e.targetElement,r=e.hintPosition,i=e.element;void 0!==n&&ht.call(t,r,i,n)}))}function yt(t){var e=this,n=Array.from(t.querySelectorAll(\"*[data-intro]\")),r=[];if(this._options.steps)u(this._options.steps,(function(t){var n=Z(t);if(n.step=r.length+1,n.title=n.title||\"\",\"string\"==typeof n.element&&(n.element=document.querySelector(n.element)),void 0===n.element||null===n.element){var i=document.querySelector(\".introjsFloatingElement\");null===i&&(i=L(\"div\",{className:\"introjsFloatingElement\"}),document.body.appendChild(i)),n.element=i,n.position=\"floating\"}n.position=n.position||e._options.tooltipPosition,n.scrollTo=n.scrollTo||e._options.scrollTo,void 0===n.disableInteraction&&(n.disableInteraction=e._options.disableInteraction),null!==n.element&&r.push(n)}));else{var i;if(n.length<1)return[];u(n,(function(t){if((!e._options.group||t.getAttribute(\"data-intro-group\")===e._options.group)&&\"none\"!==t.style.display){var n=parseInt(t.getAttribute(\"data-step\"),10);i=t.hasAttribute(\"data-disable-interaction\")?!!t.getAttribute(\"data-disable-interaction\"):e._options.disableInteraction,n>0&&(r[n-1]={element:t,title:t.getAttribute(\"data-title\")||\"\",intro:t.getAttribute(\"data-intro\"),step:parseInt(t.getAttribute(\"data-step\"),10),tooltipClass:t.getAttribute(\"data-tooltip-class\"),highlightClass:t.getAttribute(\"data-highlight-class\"),position:t.getAttribute(\"data-position\")||e._options.tooltipPosition,scrollTo:t.getAttribute(\"data-scroll-to\")||e._options.scrollTo,disableInteraction:i})}}));var o=0;u(n,(function(t){if((!e._options.group||t.getAttribute(\"data-intro-group\")===e._options.group)&&null===t.getAttribute(\"data-step\")){for(;void 0!==r[o];)o++;i=t.hasAttribute(\"data-disable-interaction\")?!!t.getAttribute(\"data-disable-interaction\"):e._options.disableInteraction,r[o]={element:t,title:t.getAttribute(\"data-title\")||\"\",intro:t.getAttribute(\"data-intro\"),step:o+1,tooltipClass:t.getAttribute(\"data-tooltip-class\"),highlightClass:t.getAttribute(\"data-highlight-class\"),position:t.getAttribute(\"data-position\")||e._options.tooltipPosition,scrollTo:t.getAttribute(\"data-scroll-to\")||e._options.scrollTo,disableInteraction:i}}}))}for(var a=[],s=0;s<r.length;s++)r[s]&&a.push(r[s]);return(r=a).sort((function(t,e){return t.step-e.step})),r}function gt(t){var e=document.querySelector(\".introjs-tooltipReferenceLayer\"),n=document.querySelector(\".introjs-helperLayer\"),r=document.querySelector(\".introjs-disableInteraction\");if(k.call(this,n),k.call(this,e),k.call(this,r),t&&(this._introItems=yt.call(this,this._targetElement),O.call(this,this._introItems[this._currentStep]),R.call(this,e)),void 0!==this._currentStep&&null!==this._currentStep){var i=document.querySelector(\".introjs-arrow\"),o=document.querySelector(\".introjs-tooltip\");o&&i&&E.call(this,this._introItems[this._currentStep].element,o,i)}return vt.call(this),this}function wt(){gt.call(this)}function _t(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(t&&t.parentElement){var n=t.parentElement;e?(x(t,{opacity:\"0\"}),window.setTimeout((function(){try{n.removeChild(t)}catch(t){}}),500)):n.removeChild(t)}}function xt(t,e){return kt.apply(this,arguments)}function kt(){return(kt=r(t().mark((function e(n,r){var i,o;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(i=!0,void 0===this._introBeforeExitCallback){t.next=5;break}return t.next=4,this._introBeforeExitCallback.call(this);case 4:i=t.sent;case 5:if(r||!1!==i){t.next=7;break}return t.abrupt(\"return\");case 7:if((o=Array.from(n.querySelectorAll(\".introjs-overlay\")))&&o.length&&u(o,(function(t){return _t(t)})),_t(n.querySelector(\".introjs-helperLayer\"),!0),_t(n.querySelector(\".introjs-tooltipReferenceLayer\")),_t(n.querySelector(\".introjs-disableInteraction\")),_t(document.querySelector(\".introjsFloatingElement\")),N(),h.off(window,\"keydown\",X,this,!0),h.off(window,\"resize\",wt,this,!0),void 0===this._introExitCallback){t.next=23;break}return t.next=23,this._introExitCallback.call(this);case 23:this._currentStep=void 0;case 24:case\"end\":return t.stop()}}),e,this)})))).apply(this,arguments)}function Ct(e){var n=this,i=L(\"div\",{className:\"introjs-overlay\"});return x(i,{top:0,bottom:0,left:0,right:0,position:\"fixed\"}),e.appendChild(i),!0===this._options.exitOnOverlayClick&&(x(i,{cursor:\"pointer\"}),i.onclick=r(t().mark((function r(){return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,xt.call(n,e);case 2:case\"end\":return t.stop()}}),r)})))),!0}function St(t){return jt.apply(this,arguments)}function jt(){return(jt=r(t().mark((function e(n){var r;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(this.isActive()){t.next=2;break}return t.abrupt(\"return\",!1);case 2:if(void 0===this._introStartCallback){t.next=5;break}return t.next=5,this._introStartCallback.call(this,n);case 5:if(0!==(r=yt.call(this,n)).length){t.next=8;break}return t.abrupt(\"return\",!1);case 8:if(this._introItems=r,!Ct.call(this,n)){t.next=14;break}return t.next=12,W.call(this);case 12:this._options.keyboardNavigation&&h.on(window,\"keydown\",X,this,!0),h.on(window,\"resize\",wt,this,!0);case 14:return t.abrupt(\"return\",!1);case 15:case\"end\":return t.stop()}}),e,this)})))).apply(this,arguments)}function At(t,e,n){var r,i=(o(r={},t,e),o(r,\"path\",\"/\"),o(r,\"expires\",void 0),r);if(n){var a=new Date;a.setTime(a.getTime()+24*n*60*60*1e3),i.expires=a.toUTCString()}var s=[];for(var l in i)s.push(\"\".concat(l,\"=\").concat(i[l]));return document.cookie=s.join(\"; \"),Et(t)}function Et(t){return(e={},document.cookie.split(\";\").forEach((function(t){var n=a(t.split(\"=\"),2),r=n[0],i=n[1];e[r.trim()]=i})),e)[t];var e}var Nt=\"true\";function Lt(t){t?At(this._options.dontShowAgainCookie,Nt,this._options.dontShowAgainCookieDays):At(this._options.dontShowAgainCookie,\"\",-1)}function Tt(){var t=Et(this._options.dontShowAgainCookie);return t&&t===Nt}var It=function(){function e(t){!function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,e),o(this,\"_targetElement\",void 0),o(this,\"_introItems\",[]),o(this,\"_options\",void 0),o(this,\"_introBeforeChangeCallback\",void 0),o(this,\"_introChangeCallback\",void 0),o(this,\"_introAfterChangeCallback\",void 0),o(this,\"_introCompleteCallback\",void 0),o(this,\"_hintsAddedCallback\",void 0),o(this,\"_hintClickCallback\",void 0),o(this,\"_hintCloseCallback\",void 0),o(this,\"_introStartCallback\",void 0),o(this,\"_introExitCallback\",void 0),o(this,\"_introSkipCallback\",void 0),o(this,\"_introBeforeExitCallback\",void 0),this._targetElement=t,this._options={isActive:!0,nextLabel:\"Next\",prevLabel:\"Back\",skipLabel:\"×\",doneLabel:\"Done\",hidePrev:!1,hideNext:!1,nextToDone:!0,tooltipPosition:\"bottom\",tooltipClass:\"\",group:\"\",highlightClass:\"\",exitOnEsc:!0,exitOnOverlayClick:!0,showStepNumbers:!1,stepNumbersOfLabel:\"of\",keyboardNavigation:!0,showButtons:!0,showBullets:!0,showProgress:!1,scrollToElement:!0,scrollTo:\"element\",scrollPadding:30,overlayOpacity:.5,autoPosition:!0,positionPrecedence:[\"bottom\",\"top\",\"right\",\"left\"],disableInteraction:!1,dontShowAgain:!1,dontShowAgainLabel:\"Don't show this again\",dontShowAgainCookie:\"introjs-dontShowAgain\",dontShowAgainCookieDays:365,helperElementPadding:10,hintPosition:\"top-middle\",hintButtonLabel:\"Got it\",hintShowButton:!0,hintAutoRefreshInterval:10,hintAnimation:!0,buttonClass:\"introjs-button\",progressBarAdditionalClass:!1}}var n,a,s,l,c,u,h,p,f,d,m,b,v;return n=e,a=[{key:\"isActive\",value:function(){return(!this._options.dontShowAgain||!Tt.call(this))&&this._options.isActive}},{key:\"clone\",value:function(){return new e(this._targetElement)}},{key:\"setOption\",value:function(t,e){return this._options[t]=e,this}},{key:\"setOptions\",value:function(t){return this._options=function(t,e){var n,r={};for(n in t)r[n]=t[n];for(n in e)r[n]=e[n];return r}(this._options,t),this}},{key:\"start\",value:(v=r(t().mark((function e(){return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,St.call(this,this._targetElement);case 2:return t.abrupt(\"return\",this);case 3:case\"end\":return t.stop()}}),e,this)}))),function(){return v.apply(this,arguments)})},{key:\"goToStep\",value:(b=r(t().mark((function e(n){return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,D.call(this,n);case 2:return t.abrupt(\"return\",this);case 3:case\"end\":return t.stop()}}),e,this)}))),function(t){return b.apply(this,arguments)})},{key:\"addStep\",value:function(t){return this._options.steps||(this._options.steps=[]),this._options.steps.push(t),this}},{key:\"addSteps\",value:function(t){if(!t.length)return this;for(var e=0;e<t.length;e++)this.addStep(t[e]);return this}},{key:\"goToStepNumber\",value:(m=r(t().mark((function e(n){return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,V.call(this,n);case 2:return t.abrupt(\"return\",this);case 3:case\"end\":return t.stop()}}),e,this)}))),function(t){return m.apply(this,arguments)})},{key:\"nextStep\",value:(d=r(t().mark((function e(){return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,W.call(this);case 2:return t.abrupt(\"return\",this);case 3:case\"end\":return t.stop()}}),e,this)}))),function(){return d.apply(this,arguments)})},{key:\"previousStep\",value:(f=r(t().mark((function e(){return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,$.call(this);case 2:return t.abrupt(\"return\",this);case 3:case\"end\":return t.stop()}}),e,this)}))),function(){return f.apply(this,arguments)})},{key:\"currentStep\",value:function(){return U.call(this)}},{key:\"exit\",value:(p=r(t().mark((function e(n){return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,xt.call(this,this._targetElement,n);case 2:return t.abrupt(\"return\",this);case 3:case\"end\":return t.stop()}}),e,this)}))),function(t){return p.apply(this,arguments)})},{key:\"refresh\",value:function(t){return gt.call(this,t),this}},{key:\"setDontShowAgain\",value:function(t){return Lt.call(this,t),this}},{key:\"onbeforechange\",value:function(t){if(\"function\"!=typeof t)throw new Error(\"Provided callback for onbeforechange was not a function\");return this._introBeforeChangeCallback=t,this}},{key:\"onchange\",value:function(t){if(\"function\"!=typeof t)throw new Error(\"Provided callback for onchange was not a function.\");return this._introChangeCallback=t,this}},{key:\"onafterchange\",value:function(t){if(\"function\"!=typeof t)throw new Error(\"Provided callback for onafterchange was not a function\");return this._introAfterChangeCallback=t,this}},{key:\"oncomplete\",value:function(t){if(\"function\"!=typeof t)throw new Error(\"Provided callback for oncomplete was not a function.\");return this._introCompleteCallback=t,this}},{key:\"onhintsadded\",value:function(t){if(\"function\"!=typeof t)throw new Error(\"Provided callback for onhintsadded was not a function.\");return this._hintsAddedCallback=t,this}},{key:\"onhintclick\",value:function(t){if(\"function\"!=typeof t)throw new Error(\"Provided callback for onhintclick was not a function.\");return this._hintClickCallback=t,this}},{key:\"onhintclose\",value:function(t){if(\"function\"!=typeof t)throw new Error(\"Provided callback for onhintclose was not a function.\");return this._hintCloseCallback=t,this}},{key:\"onstart\",value:function(t){if(\"function\"!=typeof t)throw new Error(\"Provided callback for onstart was not a function.\");return this._introStartCallback=t,this}},{key:\"onexit\",value:function(t){if(\"function\"!=typeof t)throw new Error(\"Provided callback for onexit was not a function.\");return this._introExitCallback=t,this}},{key:\"onskip\",value:function(t){if(\"function\"!=typeof t)throw new Error(\"Provided callback for onskip was not a function.\");return this._introSkipCallback=t,this}},{key:\"onbeforeexit\",value:function(t){if(\"function\"!=typeof t)throw new Error(\"Provided callback for onbeforeexit was not a function.\");return this._introBeforeExitCallback=t,this}},{key:\"addHints\",value:function(){var e=r(t().mark((function e(){return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,mt.call(this,this._targetElement);case 2:return t.abrupt(\"return\",this);case 3:case\"end\":return t.stop()}}),e,this)})));return function(){return e.apply(this,arguments)}}()},{key:\"hideHint\",value:(h=r(t().mark((function e(n){return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,et.call(this,n);case 2:return t.abrupt(\"return\",this);case 3:case\"end\":return t.stop()}}),e,this)}))),function(t){return h.apply(this,arguments)})},{key:\"hideHints\",value:(u=r(t().mark((function e(){return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,rt.call(this);case 2:return t.abrupt(\"return\",this);case 3:case\"end\":return t.stop()}}),e,this)}))),function(){return u.apply(this,arguments)})},{key:\"showHint\",value:function(t){return at.call(this,t),this}},{key:\"showHints\",value:(c=r(t().mark((function e(){return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,it.call(this);case 2:return t.abrupt(\"return\",this);case 3:case\"end\":return t.stop()}}),e,this)}))),function(){return c.apply(this,arguments)})},{key:\"removeHints\",value:function(){return st.call(this),this}},{key:\"removeHint\",value:function(t){return lt.call(this,t),this}},{key:\"showHintDialog\",value:(l=r(t().mark((function e(n){return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,pt.call(this,n);case 2:return t.abrupt(\"return\",this);case 3:case\"end\":return t.stop()}}),e,this)}))),function(t){return l.apply(this,arguments)})}],a&&i(n.prototype,a),s&&i(n,s),Object.defineProperty(n,\"prototype\",{writable:!1}),e}(),Pt=function t(n){var r;if(\"object\"===e(n))r=new It(n);else if(\"string\"==typeof n){var i=document.querySelector(n);if(!i)throw new Error(\"There is no element with given selector.\");r=new It(i)}else r=new It(document.body);return t.instances[c(r,\"introjs-instance\")]=r,r};return Pt.version=\"7.0.1\",Pt.instances={},Pt}));\n","/*!\n* sweetalert2 v11.7.3\n* Released under the MIT License.\n*/\n!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).Sweetalert2=t()}(this,(function(){\"use strict\";var e={awaitingPromise:new WeakMap,promise:new WeakMap,innerParams:new WeakMap,domCache:new WeakMap};const t=e=>{const t={};for(const n in e)t[e[n]]=\"swal2-\"+e[n];return t},n=t([\"container\",\"shown\",\"height-auto\",\"iosfix\",\"popup\",\"modal\",\"no-backdrop\",\"no-transition\",\"toast\",\"toast-shown\",\"show\",\"hide\",\"close\",\"title\",\"html-container\",\"actions\",\"confirm\",\"deny\",\"cancel\",\"default-outline\",\"footer\",\"icon\",\"icon-content\",\"image\",\"input\",\"file\",\"range\",\"select\",\"radio\",\"checkbox\",\"label\",\"textarea\",\"inputerror\",\"input-label\",\"validation-message\",\"progress-steps\",\"active-progress-step\",\"progress-step\",\"progress-step-line\",\"loader\",\"loading\",\"styled\",\"top\",\"top-start\",\"top-end\",\"top-left\",\"top-right\",\"center\",\"center-start\",\"center-end\",\"center-left\",\"center-right\",\"bottom\",\"bottom-start\",\"bottom-end\",\"bottom-left\",\"bottom-right\",\"grow-row\",\"grow-column\",\"grow-fullscreen\",\"rtl\",\"timer-progress-bar\",\"timer-progress-bar-container\",\"scrollbar-measure\",\"icon-success\",\"icon-warning\",\"icon-info\",\"icon-question\",\"icon-error\"]),o=t([\"success\",\"warning\",\"info\",\"question\",\"error\"]),i=\"SweetAlert2:\",s=e=>e.charAt(0).toUpperCase()+e.slice(1),r=e=>{console.warn(`${i} ${\"object\"==typeof e?e.join(\" \"):e}`)},a=e=>{console.error(`${i} ${e}`)},l=[],c=(e,t)=>{var n;n=`\"${e}\" is deprecated and will be removed in the next major release. Please use \"${t}\" instead.`,l.includes(n)||(l.push(n),r(n))},u=e=>\"function\"==typeof e?e():e,d=e=>e&&\"function\"==typeof e.toPromise,p=e=>d(e)?e.toPromise():Promise.resolve(e),m=e=>e&&Promise.resolve(e)===e,g=()=>document.body.querySelector(`.${n.container}`),h=e=>{const t=g();return t?t.querySelector(e):null},f=e=>h(`.${e}`),b=()=>f(n.popup),y=()=>f(n.icon),w=()=>f(n.title),v=()=>f(n[\"html-container\"]),C=()=>f(n.image),A=()=>f(n[\"progress-steps\"]),k=()=>f(n[\"validation-message\"]),B=()=>h(`.${n.actions} .${n.confirm}`),P=()=>h(`.${n.actions} .${n.cancel}`),x=()=>h(`.${n.actions} .${n.deny}`),E=()=>h(`.${n.loader}`),$=()=>f(n.actions),T=()=>f(n.footer),S=()=>f(n[\"timer-progress-bar\"]),L=()=>f(n.close),O=()=>{const e=Array.from(b().querySelectorAll('[tabindex]:not([tabindex=\"-1\"]):not([tabindex=\"0\"])')).sort(((e,t)=>{const n=parseInt(e.getAttribute(\"tabindex\")),o=parseInt(t.getAttribute(\"tabindex\"));return n>o?1:n<o?-1:0})),t=Array.from(b().querySelectorAll('\\n  a[href],\\n  area[href],\\n  input:not([disabled]),\\n  select:not([disabled]),\\n  textarea:not([disabled]),\\n  button:not([disabled]),\\n  iframe,\\n  object,\\n  embed,\\n  [tabindex=\"0\"],\\n  [contenteditable],\\n  audio[controls],\\n  video[controls],\\n  summary\\n')).filter((e=>\"-1\"!==e.getAttribute(\"tabindex\")));return(e=>{const t=[];for(let n=0;n<e.length;n++)-1===t.indexOf(e[n])&&t.push(e[n]);return t})(e.concat(t)).filter((e=>J(e)))},j=()=>D(document.body,n.shown)&&!D(document.body,n[\"toast-shown\"])&&!D(document.body,n[\"no-backdrop\"]),M=()=>b()&&D(b(),n.toast),H={previousBodyPadding:null},I=(e,t)=>{if(e.textContent=\"\",t){const n=(new DOMParser).parseFromString(t,\"text/html\");Array.from(n.querySelector(\"head\").childNodes).forEach((t=>{e.appendChild(t)})),Array.from(n.querySelector(\"body\").childNodes).forEach((t=>{t instanceof HTMLVideoElement||t instanceof HTMLAudioElement?e.appendChild(t.cloneNode(!0)):e.appendChild(t)}))}},D=(e,t)=>{if(!t)return!1;const n=t.split(/\\s+/);for(let t=0;t<n.length;t++)if(!e.classList.contains(n[t]))return!1;return!0},q=(e,t,i)=>{if(((e,t)=>{Array.from(e.classList).forEach((i=>{Object.values(n).includes(i)||Object.values(o).includes(i)||Object.values(t.showClass).includes(i)||e.classList.remove(i)}))})(e,t),t.customClass&&t.customClass[i]){if(\"string\"!=typeof t.customClass[i]&&!t.customClass[i].forEach)return void r(`Invalid type of customClass.${i}! Expected string or iterable object, got \"${typeof t.customClass[i]}\"`);R(e,t.customClass[i])}},V=(e,t)=>{if(!t)return null;switch(t){case\"select\":case\"textarea\":case\"file\":return e.querySelector(`.${n.popup} > .${n[t]}`);case\"checkbox\":return e.querySelector(`.${n.popup} > .${n.checkbox} input`);case\"radio\":return e.querySelector(`.${n.popup} > .${n.radio} input:checked`)||e.querySelector(`.${n.popup} > .${n.radio} input:first-child`);case\"range\":return e.querySelector(`.${n.popup} > .${n.range} input`);default:return e.querySelector(`.${n.popup} > .${n.input}`)}},N=e=>{if(e.focus(),\"file\"!==e.type){const t=e.value;e.value=\"\",e.value=t}},F=(e,t,n)=>{e&&t&&(\"string\"==typeof t&&(t=t.split(/\\s+/).filter(Boolean)),t.forEach((t=>{Array.isArray(e)?e.forEach((e=>{n?e.classList.add(t):e.classList.remove(t)})):n?e.classList.add(t):e.classList.remove(t)})))},R=(e,t)=>{F(e,t,!0)},U=(e,t)=>{F(e,t,!1)},_=(e,t)=>{const n=Array.from(e.children);for(let e=0;e<n.length;e++){const o=n[e];if(o instanceof HTMLElement&&D(o,t))return o}},W=(e,t,n)=>{n===`${parseInt(n)}`&&(n=parseInt(n)),n||0===parseInt(n)?e.style[t]=\"number\"==typeof n?`${n}px`:n:e.style.removeProperty(t)},z=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"flex\";e.style.display=t},K=e=>{e.style.display=\"none\"},Y=(e,t,n,o)=>{const i=e.querySelector(t);i&&(i.style[n]=o)},Z=function(e,t){t?z(e,arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"flex\"):K(e)},J=e=>!(!e||!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)),X=e=>!!(e.scrollHeight>e.clientHeight),G=e=>{const t=window.getComputedStyle(e),n=parseFloat(t.getPropertyValue(\"animation-duration\")||\"0\"),o=parseFloat(t.getPropertyValue(\"transition-duration\")||\"0\");return n>0||o>0},Q=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const n=S();J(n)&&(t&&(n.style.transition=\"none\",n.style.width=\"100%\"),setTimeout((()=>{n.style.transition=`width ${e/1e3}s linear`,n.style.width=\"0%\"}),10))},ee={},te=e=>new Promise((t=>{if(!e)return t();const n=window.scrollX,o=window.scrollY;ee.restoreFocusTimeout=setTimeout((()=>{ee.previousActiveElement instanceof HTMLElement?(ee.previousActiveElement.focus(),ee.previousActiveElement=null):document.body&&document.body.focus(),t()}),100),window.scrollTo(n,o)})),ne=()=>\"undefined\"==typeof window||\"undefined\"==typeof document,oe=`\\n <div aria-labelledby=\"${n.title}\" aria-describedby=\"${n[\"html-container\"]}\" class=\"${n.popup}\" tabindex=\"-1\">\\n   <button type=\"button\" class=\"${n.close}\"></button>\\n   <ul class=\"${n[\"progress-steps\"]}\"></ul>\\n   <div class=\"${n.icon}\"></div>\\n   <img class=\"${n.image}\" />\\n   <h2 class=\"${n.title}\" id=\"${n.title}\"></h2>\\n   <div class=\"${n[\"html-container\"]}\" id=\"${n[\"html-container\"]}\"></div>\\n   <input class=\"${n.input}\" />\\n   <input type=\"file\" class=\"${n.file}\" />\\n   <div class=\"${n.range}\">\\n     <input type=\"range\" />\\n     <output></output>\\n   </div>\\n   <select class=\"${n.select}\"></select>\\n   <div class=\"${n.radio}\"></div>\\n   <label for=\"${n.checkbox}\" class=\"${n.checkbox}\">\\n     <input type=\"checkbox\" />\\n     <span class=\"${n.label}\"></span>\\n   </label>\\n   <textarea class=\"${n.textarea}\"></textarea>\\n   <div class=\"${n[\"validation-message\"]}\" id=\"${n[\"validation-message\"]}\"></div>\\n   <div class=\"${n.actions}\">\\n     <div class=\"${n.loader}\"></div>\\n     <button type=\"button\" class=\"${n.confirm}\"></button>\\n     <button type=\"button\" class=\"${n.deny}\"></button>\\n     <button type=\"button\" class=\"${n.cancel}\"></button>\\n   </div>\\n   <div class=\"${n.footer}\"></div>\\n   <div class=\"${n[\"timer-progress-bar-container\"]}\">\\n     <div class=\"${n[\"timer-progress-bar\"]}\"></div>\\n   </div>\\n </div>\\n`.replace(/(^|\\n)\\s*/g,\"\"),ie=()=>{ee.currentInstance.resetValidationMessage()},se=e=>{const t=(()=>{const e=g();return!!e&&(e.remove(),U([document.documentElement,document.body],[n[\"no-backdrop\"],n[\"toast-shown\"],n[\"has-column\"]]),!0)})();if(ne())return void a(\"SweetAlert2 requires document to initialize\");const o=document.createElement(\"div\");o.className=n.container,t&&R(o,n[\"no-transition\"]),I(o,oe);const i=\"string\"==typeof(s=e.target)?document.querySelector(s):s;var s;i.appendChild(o),(e=>{const t=b();t.setAttribute(\"role\",e.toast?\"alert\":\"dialog\"),t.setAttribute(\"aria-live\",e.toast?\"polite\":\"assertive\"),e.toast||t.setAttribute(\"aria-modal\",\"true\")})(e),(e=>{\"rtl\"===window.getComputedStyle(e).direction&&R(g(),n.rtl)})(i),(()=>{const e=b(),t=_(e,n.input),o=_(e,n.file),i=e.querySelector(`.${n.range} input`),s=e.querySelector(`.${n.range} output`),r=_(e,n.select),a=e.querySelector(`.${n.checkbox} input`),l=_(e,n.textarea);t.oninput=ie,o.onchange=ie,r.onchange=ie,a.onchange=ie,l.oninput=ie,i.oninput=()=>{ie(),s.value=i.value},i.onchange=()=>{ie(),s.value=i.value}})()},re=(e,t)=>{e instanceof HTMLElement?t.appendChild(e):\"object\"==typeof e?ae(e,t):e&&I(t,e)},ae=(e,t)=>{e.jquery?le(t,e):I(t,e.toString())},le=(e,t)=>{if(e.textContent=\"\",0 in t)for(let n=0;n in t;n++)e.appendChild(t[n].cloneNode(!0));else e.appendChild(t.cloneNode(!0))},ce=(()=>{if(ne())return!1;const e=document.createElement(\"div\"),t={WebkitAnimation:\"webkitAnimationEnd\",animation:\"animationend\"};for(const n in t)if(Object.prototype.hasOwnProperty.call(t,n)&&void 0!==e.style[n])return t[n];return!1})(),ue=(e,t)=>{const o=$(),i=E();t.showConfirmButton||t.showDenyButton||t.showCancelButton?z(o):K(o),q(o,t,\"actions\"),function(e,t,o){const i=B(),s=x(),r=P();de(i,\"confirm\",o),de(s,\"deny\",o),de(r,\"cancel\",o),function(e,t,o,i){if(!i.buttonsStyling)return void U([e,t,o],n.styled);R([e,t,o],n.styled),i.confirmButtonColor&&(e.style.backgroundColor=i.confirmButtonColor,R(e,n[\"default-outline\"]));i.denyButtonColor&&(t.style.backgroundColor=i.denyButtonColor,R(t,n[\"default-outline\"]));i.cancelButtonColor&&(o.style.backgroundColor=i.cancelButtonColor,R(o,n[\"default-outline\"]))}(i,s,r,o),o.reverseButtons&&(o.toast?(e.insertBefore(r,i),e.insertBefore(s,i)):(e.insertBefore(r,t),e.insertBefore(s,t),e.insertBefore(i,t)))}(o,i,t),I(i,t.loaderHtml),q(i,t,\"loader\")};function de(e,t,o){Z(e,o[`show${s(t)}Button`],\"inline-block\"),I(e,o[`${t}ButtonText`]),e.setAttribute(\"aria-label\",o[`${t}ButtonAriaLabel`]),e.className=n[t],q(e,o,`${t}Button`),R(e,o[`${t}ButtonClass`])}const pe=(e,t)=>{const o=g();o&&(!function(e,t){\"string\"==typeof t?e.style.background=t:t||R([document.documentElement,document.body],n[\"no-backdrop\"])}(o,t.backdrop),function(e,t){t in n?R(e,n[t]):(r('The \"position\" parameter is not valid, defaulting to \"center\"'),R(e,n.center))}(o,t.position),function(e,t){if(t&&\"string\"==typeof t){const o=`grow-${t}`;o in n&&R(e,n[o])}}(o,t.grow),q(o,t,\"container\"))};const me=[\"input\",\"file\",\"range\",\"select\",\"radio\",\"checkbox\",\"textarea\"],ge=e=>{if(!Ce[e.input])return void a(`Unexpected type of input! Expected \"text\", \"email\", \"password\", \"number\", \"tel\", \"select\", \"radio\", \"checkbox\", \"textarea\", \"file\" or \"url\", got \"${e.input}\"`);const t=we(e.input),n=Ce[e.input](t,e);z(t),e.inputAutoFocus&&setTimeout((()=>{N(n)}))},he=(e,t)=>{const n=V(b(),e);if(n){(e=>{for(let t=0;t<e.attributes.length;t++){const n=e.attributes[t].name;[\"type\",\"value\",\"style\"].includes(n)||e.removeAttribute(n)}})(n);for(const e in t)n.setAttribute(e,t[e])}},fe=e=>{const t=we(e.input);\"object\"==typeof e.customClass&&R(t,e.customClass.input)},be=(e,t)=>{e.placeholder&&!t.inputPlaceholder||(e.placeholder=t.inputPlaceholder)},ye=(e,t,o)=>{if(o.inputLabel){e.id=n.input;const i=document.createElement(\"label\"),s=n[\"input-label\"];i.setAttribute(\"for\",e.id),i.className=s,\"object\"==typeof o.customClass&&R(i,o.customClass.inputLabel),i.innerText=o.inputLabel,t.insertAdjacentElement(\"beforebegin\",i)}},we=e=>_(b(),n[e]||n.input),ve=(e,t)=>{[\"string\",\"number\"].includes(typeof t)?e.value=`${t}`:m(t)||r(`Unexpected type of inputValue! Expected \"string\", \"number\" or \"Promise\", got \"${typeof t}\"`)},Ce={};Ce.text=Ce.email=Ce.password=Ce.number=Ce.tel=Ce.url=(e,t)=>(ve(e,t.inputValue),ye(e,e,t),be(e,t),e.type=t.input,e),Ce.file=(e,t)=>(ye(e,e,t),be(e,t),e),Ce.range=(e,t)=>{const n=e.querySelector(\"input\"),o=e.querySelector(\"output\");return ve(n,t.inputValue),n.type=t.input,ve(o,t.inputValue),ye(n,e,t),e},Ce.select=(e,t)=>{if(e.textContent=\"\",t.inputPlaceholder){const n=document.createElement(\"option\");I(n,t.inputPlaceholder),n.value=\"\",n.disabled=!0,n.selected=!0,e.appendChild(n)}return ye(e,e,t),e},Ce.radio=e=>(e.textContent=\"\",e),Ce.checkbox=(e,t)=>{const o=V(b(),\"checkbox\");o.value=\"1\",o.id=n.checkbox,o.checked=Boolean(t.inputValue);const i=e.querySelector(\"span\");return I(i,t.inputPlaceholder),o},Ce.textarea=(e,t)=>{ve(e,t.inputValue),be(e,t),ye(e,e,t);return setTimeout((()=>{if(\"MutationObserver\"in window){const t=parseInt(window.getComputedStyle(b()).width);new MutationObserver((()=>{const n=e.offsetWidth+(o=e,parseInt(window.getComputedStyle(o).marginLeft)+parseInt(window.getComputedStyle(o).marginRight));var o;b().style.width=n>t?`${n}px`:null})).observe(e,{attributes:!0,attributeFilter:[\"style\"]})}})),e};const Ae=(t,o)=>{const i=v();q(i,o,\"htmlContainer\"),o.html?(re(o.html,i),z(i,\"block\")):o.text?(i.textContent=o.text,z(i,\"block\")):K(i),((t,o)=>{const i=b(),s=e.innerParams.get(t),r=!s||o.input!==s.input;me.forEach((e=>{const t=_(i,n[e]);he(e,o.inputAttributes),t.className=n[e],r&&K(t)})),o.input&&(r&&ge(o),fe(o))})(t,o)},ke=(e,t)=>{for(const n in o)t.icon!==n&&U(e,o[n]);R(e,o[t.icon]),xe(e,t),Be(),q(e,t,\"icon\")},Be=()=>{const e=b(),t=window.getComputedStyle(e).getPropertyValue(\"background-color\"),n=e.querySelectorAll(\"[class^=swal2-success-circular-line], .swal2-success-fix\");for(let e=0;e<n.length;e++)n[e].style.backgroundColor=t},Pe=(e,t)=>{let n,o=e.innerHTML;if(t.iconHtml)n=Ee(t.iconHtml);else if(\"success\"===t.icon)n='\\n  <div class=\"swal2-success-circular-line-left\"></div>\\n  <span class=\"swal2-success-line-tip\"></span> <span class=\"swal2-success-line-long\"></span>\\n  <div class=\"swal2-success-ring\"></div> <div class=\"swal2-success-fix\"></div>\\n  <div class=\"swal2-success-circular-line-right\"></div>\\n',o=o.replace(/ style=\".*?\"/g,\"\");else if(\"error\"===t.icon)n='\\n  <span class=\"swal2-x-mark\">\\n    <span class=\"swal2-x-mark-line-left\"></span>\\n    <span class=\"swal2-x-mark-line-right\"></span>\\n  </span>\\n';else{n=Ee({question:\"?\",warning:\"!\",info:\"i\"}[t.icon])}o.trim()!==n.trim()&&I(e,n)},xe=(e,t)=>{if(t.iconColor){e.style.color=t.iconColor,e.style.borderColor=t.iconColor;for(const n of[\".swal2-success-line-tip\",\".swal2-success-line-long\",\".swal2-x-mark-line-left\",\".swal2-x-mark-line-right\"])Y(e,n,\"backgroundColor\",t.iconColor);Y(e,\".swal2-success-ring\",\"borderColor\",t.iconColor)}},Ee=e=>`<div class=\"${n[\"icon-content\"]}\">${e}</div>`,$e=(e,t)=>{e.className=`${n.popup} ${J(e)?t.showClass.popup:\"\"}`,t.toast?(R([document.documentElement,document.body],n[\"toast-shown\"]),R(e,n.toast)):R(e,n.modal),q(e,t,\"popup\"),\"string\"==typeof t.customClass&&R(e,t.customClass),t.icon&&R(e,n[`icon-${t.icon}`])},Te=e=>{const t=document.createElement(\"li\");return R(t,n[\"progress-step\"]),I(t,e),t},Se=e=>{const t=document.createElement(\"li\");return R(t,n[\"progress-step-line\"]),e.progressStepsDistance&&W(t,\"width\",e.progressStepsDistance),t},Le=(t,i)=>{((e,t)=>{const n=g(),o=b();t.toast?(W(n,\"width\",t.width),o.style.width=\"100%\",o.insertBefore(E(),y())):W(o,\"width\",t.width),W(o,\"padding\",t.padding),t.color&&(o.style.color=t.color),t.background&&(o.style.background=t.background),K(k()),$e(o,t)})(0,i),pe(0,i),((e,t)=>{const o=A();t.progressSteps&&0!==t.progressSteps.length?(z(o),o.textContent=\"\",t.currentProgressStep>=t.progressSteps.length&&r(\"Invalid currentProgressStep parameter, it should be less than progressSteps.length (currentProgressStep like JS arrays starts from 0)\"),t.progressSteps.forEach(((e,i)=>{const s=Te(e);if(o.appendChild(s),i===t.currentProgressStep&&R(s,n[\"active-progress-step\"]),i!==t.progressSteps.length-1){const e=Se(t);o.appendChild(e)}}))):K(o)})(0,i),((t,n)=>{const i=e.innerParams.get(t),s=y();if(i&&n.icon===i.icon)return Pe(s,n),void ke(s,n);if(n.icon||n.iconHtml){if(n.icon&&-1===Object.keys(o).indexOf(n.icon))return a(`Unknown icon! Expected \"success\", \"error\", \"warning\", \"info\" or \"question\", got \"${n.icon}\"`),void K(s);z(s),Pe(s,n),ke(s,n),R(s,n.showClass.icon)}else K(s)})(t,i),((e,t)=>{const o=C();t.imageUrl?(z(o,\"\"),o.setAttribute(\"src\",t.imageUrl),o.setAttribute(\"alt\",t.imageAlt),W(o,\"width\",t.imageWidth),W(o,\"height\",t.imageHeight),o.className=n.image,q(o,t,\"image\")):K(o)})(0,i),((e,t)=>{const n=w();Z(n,t.title||t.titleText,\"block\"),t.title&&re(t.title,n),t.titleText&&(n.innerText=t.titleText),q(n,t,\"title\")})(0,i),((e,t)=>{const n=L();I(n,t.closeButtonHtml),q(n,t,\"closeButton\"),Z(n,t.showCloseButton),n.setAttribute(\"aria-label\",t.closeButtonAriaLabel)})(0,i),Ae(t,i),ue(0,i),((e,t)=>{const n=T();Z(n,t.footer),t.footer&&re(t.footer,n),q(n,t,\"footer\")})(0,i),\"function\"==typeof i.didRender&&i.didRender(b())};function Oe(){const t=e.innerParams.get(this);if(!t)return;const o=e.domCache.get(this);K(o.loader),M()?t.icon&&z(y()):je(o),U([o.popup,o.actions],n.loading),o.popup.removeAttribute(\"aria-busy\"),o.popup.removeAttribute(\"data-loading\"),o.confirmButton.disabled=!1,o.denyButton.disabled=!1,o.cancelButton.disabled=!1}const je=e=>{const t=e.popup.getElementsByClassName(e.loader.getAttribute(\"data-button-to-replace\"));t.length?z(t[0],\"inline-block\"):J(B())||J(x())||J(P())||K(e.actions)};const Me=()=>B()&&B().click(),He=Object.freeze({cancel:\"cancel\",backdrop:\"backdrop\",close:\"close\",esc:\"esc\",timer:\"timer\"}),Ie=e=>{e.keydownTarget&&e.keydownHandlerAdded&&(e.keydownTarget.removeEventListener(\"keydown\",e.keydownHandler,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!1)},De=(e,t)=>{const n=O();if(n.length)return(e+=t)===n.length?e=0:-1===e&&(e=n.length-1),void n[e].focus();b().focus()},qe=[\"ArrowRight\",\"ArrowDown\"],Ve=[\"ArrowLeft\",\"ArrowUp\"],Ne=(t,n,o)=>{const i=e.innerParams.get(t);i&&(n.isComposing||229===n.keyCode||(i.stopKeydownPropagation&&n.stopPropagation(),\"Enter\"===n.key?Fe(t,n,i):\"Tab\"===n.key?Re(n):[...qe,...Ve].includes(n.key)?Ue(n.key):\"Escape\"===n.key&&_e(n,i,o)))},Fe=(e,t,n)=>{if(u(n.allowEnterKey)&&t.target&&e.getInput()&&t.target instanceof HTMLElement&&t.target.outerHTML===e.getInput().outerHTML){if([\"textarea\",\"file\"].includes(n.input))return;Me(),t.preventDefault()}},Re=e=>{const t=e.target,n=O();let o=-1;for(let e=0;e<n.length;e++)if(t===n[e]){o=e;break}e.shiftKey?De(o,-1):De(o,1),e.stopPropagation(),e.preventDefault()},Ue=e=>{const t=[B(),x(),P()];if(document.activeElement instanceof HTMLElement&&!t.includes(document.activeElement))return;const n=qe.includes(e)?\"nextElementSibling\":\"previousElementSibling\";let o=document.activeElement;for(let e=0;e<$().children.length;e++){if(o=o[n],!o)return;if(o instanceof HTMLButtonElement&&J(o))break}o instanceof HTMLButtonElement&&o.focus()},_e=(e,t,n)=>{u(t.allowEscapeKey)&&(e.preventDefault(),n(He.esc))};var We={swalPromiseResolve:new WeakMap,swalPromiseReject:new WeakMap};const ze=()=>{Array.from(document.body.children).forEach((e=>{e.hasAttribute(\"data-previous-aria-hidden\")?(e.setAttribute(\"aria-hidden\",e.getAttribute(\"data-previous-aria-hidden\")),e.removeAttribute(\"data-previous-aria-hidden\")):e.removeAttribute(\"aria-hidden\")}))},Ke=()=>{const e=navigator.userAgent,t=!!e.match(/iPad/i)||!!e.match(/iPhone/i),n=!!e.match(/WebKit/i);if(t&&n&&!e.match(/CriOS/i)){const e=44;b().scrollHeight>window.innerHeight-e&&(g().style.paddingBottom=`${e}px`)}},Ye=()=>{const e=g();let t;e.ontouchstart=e=>{t=Ze(e)},e.ontouchmove=e=>{t&&(e.preventDefault(),e.stopPropagation())}},Ze=e=>{const t=e.target,n=g();return!Je(e)&&!Xe(e)&&(t===n||!X(n)&&t instanceof HTMLElement&&\"INPUT\"!==t.tagName&&\"TEXTAREA\"!==t.tagName&&(!X(v())||!v().contains(t)))},Je=e=>e.touches&&e.touches.length&&\"stylus\"===e.touches[0].touchType,Xe=e=>e.touches&&e.touches.length>1,Ge=()=>{if(D(document.body,n.iosfix)){const e=parseInt(document.body.style.top,10);U(document.body,n.iosfix),document.body.style.top=\"\",document.body.scrollTop=-1*e}},Qe=()=>{null===H.previousBodyPadding&&document.body.scrollHeight>window.innerHeight&&(H.previousBodyPadding=parseInt(window.getComputedStyle(document.body).getPropertyValue(\"padding-right\")),document.body.style.paddingRight=`${H.previousBodyPadding+(()=>{const e=document.createElement(\"div\");e.className=n[\"scrollbar-measure\"],document.body.appendChild(e);const t=e.getBoundingClientRect().width-e.clientWidth;return document.body.removeChild(e),t})()}px`)},et=()=>{null!==H.previousBodyPadding&&(document.body.style.paddingRight=`${H.previousBodyPadding}px`,H.previousBodyPadding=null)};function tt(e,t,o,i){M()?lt(e,i):(te(o).then((()=>lt(e,i))),Ie(ee));/^((?!chrome|android).)*safari/i.test(navigator.userAgent)?(t.setAttribute(\"style\",\"display:none !important\"),t.removeAttribute(\"class\"),t.innerHTML=\"\"):t.remove(),j()&&(et(),Ge(),ze()),U([document.documentElement,document.body],[n.shown,n[\"height-auto\"],n[\"no-backdrop\"],n[\"toast-shown\"]])}function nt(e){e=st(e);const t=We.swalPromiseResolve.get(this),n=ot(this);this.isAwaitingPromise()?e.isDismissed||(it(this),t(e)):n&&t(e)}const ot=t=>{const n=b();if(!n)return!1;const o=e.innerParams.get(t);if(!o||D(n,o.hideClass.popup))return!1;U(n,o.showClass.popup),R(n,o.hideClass.popup);const i=g();return U(i,o.showClass.backdrop),R(i,o.hideClass.backdrop),rt(t,n,o),!0};const it=t=>{t.isAwaitingPromise()&&(e.awaitingPromise.delete(t),e.innerParams.get(t)||t._destroy())},st=e=>void 0===e?{isConfirmed:!1,isDenied:!1,isDismissed:!0}:Object.assign({isConfirmed:!1,isDenied:!1,isDismissed:!1},e),rt=(e,t,n)=>{const o=g(),i=ce&&G(t);\"function\"==typeof n.willClose&&n.willClose(t),i?at(e,t,o,n.returnFocus,n.didClose):tt(e,o,n.returnFocus,n.didClose)},at=(e,t,n,o,i)=>{ee.swalCloseEventFinishedCallback=tt.bind(null,e,n,o,i),t.addEventListener(ce,(function(e){e.target===t&&(ee.swalCloseEventFinishedCallback(),delete ee.swalCloseEventFinishedCallback)}))},lt=(e,t)=>{setTimeout((()=>{\"function\"==typeof t&&t.bind(e.params)(),e._destroy()}))};function ct(t,n,o){const i=e.domCache.get(t);n.forEach((e=>{i[e].disabled=o}))}function ut(e,t){if(e)if(\"radio\"===e.type){const n=e.parentNode.parentNode.querySelectorAll(\"input\");for(let e=0;e<n.length;e++)n[e].disabled=t}else e.disabled=t}const dt={title:\"\",titleText:\"\",text:\"\",html:\"\",footer:\"\",icon:void 0,iconColor:void 0,iconHtml:void 0,template:void 0,toast:!1,showClass:{popup:\"swal2-show\",backdrop:\"swal2-backdrop-show\",icon:\"swal2-icon-show\"},hideClass:{popup:\"swal2-hide\",backdrop:\"swal2-backdrop-hide\",icon:\"swal2-icon-hide\"},customClass:{},target:\"body\",color:void 0,backdrop:!0,heightAuto:!0,allowOutsideClick:!0,allowEscapeKey:!0,allowEnterKey:!0,stopKeydownPropagation:!0,keydownListenerCapture:!1,showConfirmButton:!0,showDenyButton:!1,showCancelButton:!1,preConfirm:void 0,preDeny:void 0,confirmButtonText:\"OK\",confirmButtonAriaLabel:\"\",confirmButtonColor:void 0,denyButtonText:\"No\",denyButtonAriaLabel:\"\",denyButtonColor:void 0,cancelButtonText:\"Cancel\",cancelButtonAriaLabel:\"\",cancelButtonColor:void 0,buttonsStyling:!0,reverseButtons:!1,focusConfirm:!0,focusDeny:!1,focusCancel:!1,returnFocus:!0,showCloseButton:!1,closeButtonHtml:\"&times;\",closeButtonAriaLabel:\"Close this dialog\",loaderHtml:\"\",showLoaderOnConfirm:!1,showLoaderOnDeny:!1,imageUrl:void 0,imageWidth:void 0,imageHeight:void 0,imageAlt:\"\",timer:void 0,timerProgressBar:!1,width:void 0,padding:void 0,background:void 0,input:void 0,inputPlaceholder:\"\",inputLabel:\"\",inputValue:\"\",inputOptions:{},inputAutoFocus:!0,inputAutoTrim:!0,inputAttributes:{},inputValidator:void 0,returnInputValueOnDeny:!1,validationMessage:void 0,grow:!1,position:\"center\",progressSteps:[],currentProgressStep:void 0,progressStepsDistance:void 0,willOpen:void 0,didOpen:void 0,didRender:void 0,willClose:void 0,didClose:void 0,didDestroy:void 0,scrollbarPadding:!0},pt=[\"allowEscapeKey\",\"allowOutsideClick\",\"background\",\"buttonsStyling\",\"cancelButtonAriaLabel\",\"cancelButtonColor\",\"cancelButtonText\",\"closeButtonAriaLabel\",\"closeButtonHtml\",\"color\",\"confirmButtonAriaLabel\",\"confirmButtonColor\",\"confirmButtonText\",\"currentProgressStep\",\"customClass\",\"denyButtonAriaLabel\",\"denyButtonColor\",\"denyButtonText\",\"didClose\",\"didDestroy\",\"footer\",\"hideClass\",\"html\",\"icon\",\"iconColor\",\"iconHtml\",\"imageAlt\",\"imageHeight\",\"imageUrl\",\"imageWidth\",\"preConfirm\",\"preDeny\",\"progressSteps\",\"returnFocus\",\"reverseButtons\",\"showCancelButton\",\"showCloseButton\",\"showConfirmButton\",\"showDenyButton\",\"text\",\"title\",\"titleText\",\"willClose\"],mt={},gt=[\"allowOutsideClick\",\"allowEnterKey\",\"backdrop\",\"focusConfirm\",\"focusDeny\",\"focusCancel\",\"returnFocus\",\"heightAuto\",\"keydownListenerCapture\"],ht=e=>Object.prototype.hasOwnProperty.call(dt,e),ft=e=>-1!==pt.indexOf(e),bt=e=>mt[e],yt=e=>{ht(e)||r(`Unknown parameter \"${e}\"`)},wt=e=>{gt.includes(e)&&r(`The parameter \"${e}\" is incompatible with toasts`)},vt=e=>{bt(e)&&c(e,bt(e))};const Ct=e=>{const t={};return Object.keys(e).forEach((n=>{ft(n)?t[n]=e[n]:r(`Invalid parameter to update: ${n}`)})),t};const At=e=>{kt(e),delete e.params,delete ee.keydownHandler,delete ee.keydownTarget,delete ee.currentInstance},kt=t=>{t.isAwaitingPromise()?(Bt(e,t),e.awaitingPromise.set(t,!0)):(Bt(We,t),Bt(e,t))},Bt=(e,t)=>{for(const n in e)e[n].delete(t)};var Pt=Object.freeze({__proto__:null,_destroy:function(){const t=e.domCache.get(this),n=e.innerParams.get(this);n?(t.popup&&ee.swalCloseEventFinishedCallback&&(ee.swalCloseEventFinishedCallback(),delete ee.swalCloseEventFinishedCallback),\"function\"==typeof n.didDestroy&&n.didDestroy(),At(this)):kt(this)},close:nt,closeModal:nt,closePopup:nt,closeToast:nt,disableButtons:function(){ct(this,[\"confirmButton\",\"denyButton\",\"cancelButton\"],!0)},disableInput:function(){ut(this.getInput(),!0)},disableLoading:Oe,enableButtons:function(){ct(this,[\"confirmButton\",\"denyButton\",\"cancelButton\"],!1)},enableInput:function(){ut(this.getInput(),!1)},getInput:function(t){const n=e.innerParams.get(t||this),o=e.domCache.get(t||this);return o?V(o.popup,n.input):null},handleAwaitingPromise:it,hideLoading:Oe,isAwaitingPromise:function(){return!!e.awaitingPromise.get(this)},rejectPromise:function(e){const t=We.swalPromiseReject.get(this);it(this),t&&t(e)},resetValidationMessage:function(){const t=e.domCache.get(this);t.validationMessage&&K(t.validationMessage);const o=this.getInput();o&&(o.removeAttribute(\"aria-invalid\"),o.removeAttribute(\"aria-describedby\"),U(o,n.inputerror))},showValidationMessage:function(t){const o=e.domCache.get(this),i=e.innerParams.get(this);I(o.validationMessage,t),o.validationMessage.className=n[\"validation-message\"],i.customClass&&i.customClass.validationMessage&&R(o.validationMessage,i.customClass.validationMessage),z(o.validationMessage);const s=this.getInput();s&&(s.setAttribute(\"aria-invalid\",!0),s.setAttribute(\"aria-describedby\",n[\"validation-message\"]),N(s),R(s,n.inputerror))},update:function(t){const n=b(),o=e.innerParams.get(this);if(!n||D(n,o.hideClass.popup))return void r(\"You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup.\");const i=Ct(t),s=Object.assign({},o,i);Le(this,s),e.innerParams.set(this,s),Object.defineProperties(this,{params:{value:Object.assign({},this.params,t),writable:!1,enumerable:!0}})}});const xt=e=>{let t=b();t||new Tn,t=b();const n=E();M()?K(y()):Et(t,e),z(n),t.setAttribute(\"data-loading\",\"true\"),t.setAttribute(\"aria-busy\",\"true\"),t.focus()},Et=(e,t)=>{const o=$(),i=E();!t&&J(B())&&(t=B()),z(o),t&&(K(t),i.setAttribute(\"data-button-to-replace\",t.className)),i.parentNode.insertBefore(i,t),R([e,o],n.loading)},$t=e=>e.checked?1:0,Tt=e=>e.checked?e.value:null,St=e=>e.files.length?null!==e.getAttribute(\"multiple\")?e.files:e.files[0]:null,Lt=(e,t)=>{const n=b(),o=e=>{jt[t.input](n,Mt(e),t)};d(t.inputOptions)||m(t.inputOptions)?(xt(B()),p(t.inputOptions).then((t=>{e.hideLoading(),o(t)}))):\"object\"==typeof t.inputOptions?o(t.inputOptions):a(\"Unexpected type of inputOptions! Expected object, Map or Promise, got \"+typeof t.inputOptions)},Ot=(e,t)=>{const n=e.getInput();K(n),p(t.inputValue).then((o=>{n.value=\"number\"===t.input?`${parseFloat(o)||0}`:`${o}`,z(n),n.focus(),e.hideLoading()})).catch((t=>{a(`Error in inputValue promise: ${t}`),n.value=\"\",z(n),n.focus(),e.hideLoading()}))},jt={select:(e,t,o)=>{const i=_(e,n.select),s=(e,t,n)=>{const i=document.createElement(\"option\");i.value=n,I(i,t),i.selected=Ht(n,o.inputValue),e.appendChild(i)};t.forEach((e=>{const t=e[0],n=e[1];if(Array.isArray(n)){const e=document.createElement(\"optgroup\");e.label=t,e.disabled=!1,i.appendChild(e),n.forEach((t=>s(e,t[1],t[0])))}else s(i,n,t)})),i.focus()},radio:(e,t,o)=>{const i=_(e,n.radio);t.forEach((e=>{const t=e[0],s=e[1],r=document.createElement(\"input\"),a=document.createElement(\"label\");r.type=\"radio\",r.name=n.radio,r.value=t,Ht(t,o.inputValue)&&(r.checked=!0);const l=document.createElement(\"span\");I(l,s),l.className=n.label,a.appendChild(r),a.appendChild(l),i.appendChild(a)}));const s=i.querySelectorAll(\"input\");s.length&&s[0].focus()}},Mt=e=>{const t=[];return\"undefined\"!=typeof Map&&e instanceof Map?e.forEach(((e,n)=>{let o=e;\"object\"==typeof o&&(o=Mt(o)),t.push([n,o])})):Object.keys(e).forEach((n=>{let o=e[n];\"object\"==typeof o&&(o=Mt(o)),t.push([n,o])})),t},Ht=(e,t)=>t&&t.toString()===e.toString(),It=(t,n)=>{const o=e.innerParams.get(t);if(!o.input)return void a(`The \"input\" parameter is needed to be set when using returnInputValueOn${s(n)}`);const i=((e,t)=>{const n=e.getInput();if(!n)return null;switch(t.input){case\"checkbox\":return $t(n);case\"radio\":return Tt(n);case\"file\":return St(n);default:return t.inputAutoTrim?n.value.trim():n.value}})(t,o);o.inputValidator?Dt(t,i,n):t.getInput().checkValidity()?\"deny\"===n?qt(t,i):Ft(t,i):(t.enableButtons(),t.showValidationMessage(o.validationMessage))},Dt=(t,n,o)=>{const i=e.innerParams.get(t);t.disableInput();Promise.resolve().then((()=>p(i.inputValidator(n,i.validationMessage)))).then((e=>{t.enableButtons(),t.enableInput(),e?t.showValidationMessage(e):\"deny\"===o?qt(t,n):Ft(t,n)}))},qt=(t,n)=>{const o=e.innerParams.get(t||void 0);if(o.showLoaderOnDeny&&xt(x()),o.preDeny){e.awaitingPromise.set(t||void 0,!0);Promise.resolve().then((()=>p(o.preDeny(n,o.validationMessage)))).then((e=>{!1===e?(t.hideLoading(),it(t)):t.close({isDenied:!0,value:void 0===e?n:e})})).catch((e=>Nt(t||void 0,e)))}else t.close({isDenied:!0,value:n})},Vt=(e,t)=>{e.close({isConfirmed:!0,value:t})},Nt=(e,t)=>{e.rejectPromise(t)},Ft=(t,n)=>{const o=e.innerParams.get(t||void 0);if(o.showLoaderOnConfirm&&xt(),o.preConfirm){t.resetValidationMessage(),e.awaitingPromise.set(t||void 0,!0);Promise.resolve().then((()=>p(o.preConfirm(n,o.validationMessage)))).then((e=>{J(k())||!1===e?(t.hideLoading(),it(t)):Vt(t,void 0===e?n:e)})).catch((e=>Nt(t||void 0,e)))}else Vt(t,n)},Rt=(t,n,o)=>{n.popup.onclick=()=>{const n=e.innerParams.get(t);n&&(Ut(n)||n.timer||n.input)||o(He.close)}},Ut=e=>e.showConfirmButton||e.showDenyButton||e.showCancelButton||e.showCloseButton;let _t=!1;const Wt=e=>{e.popup.onmousedown=()=>{e.container.onmouseup=function(t){e.container.onmouseup=void 0,t.target===e.container&&(_t=!0)}}},zt=e=>{e.container.onmousedown=()=>{e.popup.onmouseup=function(t){e.popup.onmouseup=void 0,(t.target===e.popup||e.popup.contains(t.target))&&(_t=!0)}}},Kt=(t,n,o)=>{n.container.onclick=i=>{const s=e.innerParams.get(t);_t?_t=!1:i.target===n.container&&u(s.allowOutsideClick)&&o(He.backdrop)}},Yt=e=>e instanceof Element||(e=>\"object\"==typeof e&&e.jquery)(e);const Zt=()=>{if(ee.timeout)return(()=>{const e=S(),t=parseInt(window.getComputedStyle(e).width);e.style.removeProperty(\"transition\"),e.style.width=\"100%\";const n=t/parseInt(window.getComputedStyle(e).width)*100;e.style.width=`${n}%`})(),ee.timeout.stop()},Jt=()=>{if(ee.timeout){const e=ee.timeout.start();return Q(e),e}};let Xt=!1;const Gt={};const Qt=e=>{for(let t=e.target;t&&t!==document;t=t.parentNode)for(const e in Gt){const n=t.getAttribute(e);if(n)return void Gt[e].fire({template:n})}};var en=Object.freeze({__proto__:null,argsToParams:e=>{const t={};return\"object\"!=typeof e[0]||Yt(e[0])?[\"title\",\"html\",\"icon\"].forEach(((n,o)=>{const i=e[o];\"string\"==typeof i||Yt(i)?t[n]=i:void 0!==i&&a(`Unexpected type of ${n}! Expected \"string\" or \"Element\", got ${typeof i}`)})):Object.assign(t,e[0]),t},bindClickHandler:function(){Gt[arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"data-swal-template\"]=this,Xt||(document.body.addEventListener(\"click\",Qt),Xt=!0)},clickCancel:()=>P()&&P().click(),clickConfirm:Me,clickDeny:()=>x()&&x().click(),enableLoading:xt,fire:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return new this(...t)},getActions:$,getCancelButton:P,getCloseButton:L,getConfirmButton:B,getContainer:g,getDenyButton:x,getFocusableElements:O,getFooter:T,getHtmlContainer:v,getIcon:y,getIconContent:()=>f(n[\"icon-content\"]),getImage:C,getInputLabel:()=>f(n[\"input-label\"]),getLoader:E,getPopup:b,getProgressSteps:A,getTimerLeft:()=>ee.timeout&&ee.timeout.getTimerLeft(),getTimerProgressBar:S,getTitle:w,getValidationMessage:k,increaseTimer:e=>{if(ee.timeout){const t=ee.timeout.increase(e);return Q(t,!0),t}},isDeprecatedParameter:bt,isLoading:()=>b().hasAttribute(\"data-loading\"),isTimerRunning:()=>ee.timeout&&ee.timeout.isRunning(),isUpdatableParameter:ft,isValidParameter:ht,isVisible:()=>J(b()),mixin:function(e){return class extends(this){_main(t,n){return super._main(t,Object.assign({},e,n))}}},resumeTimer:Jt,showLoading:xt,stopTimer:Zt,toggleTimer:()=>{const e=ee.timeout;return e&&(e.running?Zt():Jt())}});class tn{constructor(e,t){this.callback=e,this.remaining=t,this.running=!1,this.start()}start(){return this.running||(this.running=!0,this.started=new Date,this.id=setTimeout(this.callback,this.remaining)),this.remaining}stop(){return this.running&&(this.running=!1,clearTimeout(this.id),this.remaining-=(new Date).getTime()-this.started.getTime()),this.remaining}increase(e){const t=this.running;return t&&this.stop(),this.remaining+=e,t&&this.start(),this.remaining}getTimerLeft(){return this.running&&(this.stop(),this.start()),this.remaining}isRunning(){return this.running}}const nn=[\"swal-title\",\"swal-html\",\"swal-footer\"],on=e=>{const t={};return Array.from(e.querySelectorAll(\"swal-param\")).forEach((e=>{pn(e,[\"name\",\"value\"]);const n=e.getAttribute(\"name\"),o=e.getAttribute(\"value\");t[n]=\"boolean\"==typeof dt[n]?\"false\"!==o:\"object\"==typeof dt[n]?JSON.parse(o):o})),t},sn=e=>{const t={};return Array.from(e.querySelectorAll(\"swal-function-param\")).forEach((e=>{const n=e.getAttribute(\"name\"),o=e.getAttribute(\"value\");t[n]=new Function(`return ${o}`)()})),t},rn=e=>{const t={};return Array.from(e.querySelectorAll(\"swal-button\")).forEach((e=>{pn(e,[\"type\",\"color\",\"aria-label\"]);const n=e.getAttribute(\"type\");t[`${n}ButtonText`]=e.innerHTML,t[`show${s(n)}Button`]=!0,e.hasAttribute(\"color\")&&(t[`${n}ButtonColor`]=e.getAttribute(\"color\")),e.hasAttribute(\"aria-label\")&&(t[`${n}ButtonAriaLabel`]=e.getAttribute(\"aria-label\"))})),t},an=e=>{const t={},n=e.querySelector(\"swal-image\");return n&&(pn(n,[\"src\",\"width\",\"height\",\"alt\"]),n.hasAttribute(\"src\")&&(t.imageUrl=n.getAttribute(\"src\")),n.hasAttribute(\"width\")&&(t.imageWidth=n.getAttribute(\"width\")),n.hasAttribute(\"height\")&&(t.imageHeight=n.getAttribute(\"height\")),n.hasAttribute(\"alt\")&&(t.imageAlt=n.getAttribute(\"alt\"))),t},ln=e=>{const t={},n=e.querySelector(\"swal-icon\");return n&&(pn(n,[\"type\",\"color\"]),n.hasAttribute(\"type\")&&(t.icon=n.getAttribute(\"type\")),n.hasAttribute(\"color\")&&(t.iconColor=n.getAttribute(\"color\")),t.iconHtml=n.innerHTML),t},cn=e=>{const t={},n=e.querySelector(\"swal-input\");n&&(pn(n,[\"type\",\"label\",\"placeholder\",\"value\"]),t.input=n.getAttribute(\"type\")||\"text\",n.hasAttribute(\"label\")&&(t.inputLabel=n.getAttribute(\"label\")),n.hasAttribute(\"placeholder\")&&(t.inputPlaceholder=n.getAttribute(\"placeholder\")),n.hasAttribute(\"value\")&&(t.inputValue=n.getAttribute(\"value\")));const o=Array.from(e.querySelectorAll(\"swal-input-option\"));return o.length&&(t.inputOptions={},o.forEach((e=>{pn(e,[\"value\"]);const n=e.getAttribute(\"value\"),o=e.innerHTML;t.inputOptions[n]=o}))),t},un=(e,t)=>{const n={};for(const o in t){const i=t[o],s=e.querySelector(i);s&&(pn(s,[]),n[i.replace(/^swal-/,\"\")]=s.innerHTML.trim())}return n},dn=e=>{const t=nn.concat([\"swal-param\",\"swal-function-param\",\"swal-button\",\"swal-image\",\"swal-icon\",\"swal-input\",\"swal-input-option\"]);Array.from(e.children).forEach((e=>{const n=e.tagName.toLowerCase();t.includes(n)||r(`Unrecognized element <${n}>`)}))},pn=(e,t)=>{Array.from(e.attributes).forEach((n=>{-1===t.indexOf(n.name)&&r([`Unrecognized attribute \"${n.name}\" on <${e.tagName.toLowerCase()}>.`,\"\"+(t.length?`Allowed attributes are: ${t.join(\", \")}`:\"To set the value, use HTML within the element.\")])}))},mn=e=>{const t=g(),o=b();\"function\"==typeof e.willOpen&&e.willOpen(o);const i=window.getComputedStyle(document.body).overflowY;bn(t,o,e),setTimeout((()=>{hn(t,o)}),10),j()&&(fn(t,e.scrollbarPadding,i),Array.from(document.body.children).forEach((e=>{e===g()||e.contains(g())||(e.hasAttribute(\"aria-hidden\")&&e.setAttribute(\"data-previous-aria-hidden\",e.getAttribute(\"aria-hidden\")),e.setAttribute(\"aria-hidden\",\"true\"))}))),M()||ee.previousActiveElement||(ee.previousActiveElement=document.activeElement),\"function\"==typeof e.didOpen&&setTimeout((()=>e.didOpen(o))),U(t,n[\"no-transition\"])},gn=e=>{const t=b();if(e.target!==t)return;const n=g();t.removeEventListener(ce,gn),n.style.overflowY=\"auto\"},hn=(e,t)=>{ce&&G(t)?(e.style.overflowY=\"hidden\",t.addEventListener(ce,gn)):e.style.overflowY=\"auto\"},fn=(e,t,o)=>{(()=>{if((/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream||\"MacIntel\"===navigator.platform&&navigator.maxTouchPoints>1)&&!D(document.body,n.iosfix)){const e=document.body.scrollTop;document.body.style.top=-1*e+\"px\",R(document.body,n.iosfix),Ye(),Ke()}})(),t&&\"hidden\"!==o&&Qe(),setTimeout((()=>{e.scrollTop=0}))},bn=(e,t,o)=>{R(e,o.showClass.backdrop),t.style.setProperty(\"opacity\",\"0\",\"important\"),z(t,\"grid\"),setTimeout((()=>{R(t,o.showClass.popup),t.style.removeProperty(\"opacity\")}),10),R([document.documentElement,document.body],n.shown),o.heightAuto&&o.backdrop&&!o.toast&&R([document.documentElement,document.body],n[\"height-auto\"])};var yn={email:(e,t)=>/^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z0-9-]{2,24}$/.test(e)?Promise.resolve():Promise.resolve(t||\"Invalid email address\"),url:(e,t)=>/^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-z]{2,63}\\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(e)?Promise.resolve():Promise.resolve(t||\"Invalid URL\")};function wn(e){!function(e){e.inputValidator||Object.keys(yn).forEach((t=>{e.input===t&&(e.inputValidator=yn[t])}))}(e),e.showLoaderOnConfirm&&!e.preConfirm&&r(\"showLoaderOnConfirm is set to true, but preConfirm is not defined.\\nshowLoaderOnConfirm should be used together with preConfirm, see usage example:\\nhttps://sweetalert2.github.io/#ajax-request\"),function(e){(!e.target||\"string\"==typeof e.target&&!document.querySelector(e.target)||\"string\"!=typeof e.target&&!e.target.appendChild)&&(r('Target parameter is not valid, defaulting to \"body\"'),e.target=\"body\")}(e),\"string\"==typeof e.title&&(e.title=e.title.split(\"\\n\").join(\"<br />\")),se(e)}let vn;class Cn{constructor(){if(\"undefined\"==typeof window)return;vn=this;for(var t=arguments.length,n=new Array(t),o=0;o<t;o++)n[o]=arguments[o];const i=Object.freeze(this.constructor.argsToParams(n));Object.defineProperties(this,{params:{value:i,writable:!1,enumerable:!0,configurable:!0}});const s=vn._main(vn.params);e.promise.set(this,s)}_main(t){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};(e=>{!1===e.backdrop&&e.allowOutsideClick&&r('\"allowOutsideClick\" parameter requires `backdrop` parameter to be set to `true`');for(const t in e)yt(t),e.toast&&wt(t),vt(t)})(Object.assign({},n,t)),ee.currentInstance&&(ee.currentInstance._destroy(),j()&&ze()),ee.currentInstance=vn;const o=kn(t,n);wn(o),Object.freeze(o),ee.timeout&&(ee.timeout.stop(),delete ee.timeout),clearTimeout(ee.restoreFocusTimeout);const i=Bn(vn);return Le(vn,o),e.innerParams.set(vn,o),An(vn,i,o)}then(t){return e.promise.get(this).then(t)}finally(t){return e.promise.get(this).finally(t)}}const An=(t,n,o)=>new Promise(((i,s)=>{const r=e=>{t.close({isDismissed:!0,dismiss:e})};We.swalPromiseResolve.set(t,i),We.swalPromiseReject.set(t,s),n.confirmButton.onclick=()=>{(t=>{const n=e.innerParams.get(t);t.disableButtons(),n.input?It(t,\"confirm\"):Ft(t,!0)})(t)},n.denyButton.onclick=()=>{(t=>{const n=e.innerParams.get(t);t.disableButtons(),n.returnInputValueOnDeny?It(t,\"deny\"):qt(t,!1)})(t)},n.cancelButton.onclick=()=>{((e,t)=>{e.disableButtons(),t(He.cancel)})(t,r)},n.closeButton.onclick=()=>{r(He.close)},((t,n,o)=>{e.innerParams.get(t).toast?Rt(t,n,o):(Wt(n),zt(n),Kt(t,n,o))})(t,n,r),((e,t,n,o)=>{Ie(t),n.toast||(t.keydownHandler=t=>Ne(e,t,o),t.keydownTarget=n.keydownListenerCapture?window:b(),t.keydownListenerCapture=n.keydownListenerCapture,t.keydownTarget.addEventListener(\"keydown\",t.keydownHandler,{capture:t.keydownListenerCapture}),t.keydownHandlerAdded=!0)})(t,ee,o,r),((e,t)=>{\"select\"===t.input||\"radio\"===t.input?Lt(e,t):[\"text\",\"email\",\"number\",\"tel\",\"textarea\"].includes(t.input)&&(d(t.inputValue)||m(t.inputValue))&&(xt(B()),Ot(e,t))})(t,o),mn(o),Pn(ee,o,r),xn(n,o),setTimeout((()=>{n.container.scrollTop=0}))})),kn=(e,t)=>{const n=(e=>{const t=\"string\"==typeof e.template?document.querySelector(e.template):e.template;if(!t)return{};const n=t.content;return dn(n),Object.assign(on(n),sn(n),rn(n),an(n),ln(n),cn(n),un(n,nn))})(e),o=Object.assign({},dt,t,n,e);return o.showClass=Object.assign({},dt.showClass,o.showClass),o.hideClass=Object.assign({},dt.hideClass,o.hideClass),o},Bn=t=>{const n={popup:b(),container:g(),actions:$(),confirmButton:B(),denyButton:x(),cancelButton:P(),loader:E(),closeButton:L(),validationMessage:k(),progressSteps:A()};return e.domCache.set(t,n),n},Pn=(e,t,n)=>{const o=S();K(o),t.timer&&(e.timeout=new tn((()=>{n(\"timer\"),delete e.timeout}),t.timer),t.timerProgressBar&&(z(o),q(o,t,\"timerProgressBar\"),setTimeout((()=>{e.timeout&&e.timeout.running&&Q(t.timer)}))))},xn=(e,t)=>{t.toast||(u(t.allowEnterKey)?En(e,t)||De(-1,1):$n())},En=(e,t)=>t.focusDeny&&J(e.denyButton)?(e.denyButton.focus(),!0):t.focusCancel&&J(e.cancelButton)?(e.cancelButton.focus(),!0):!(!t.focusConfirm||!J(e.confirmButton))&&(e.confirmButton.focus(),!0),$n=()=>{document.activeElement instanceof HTMLElement&&\"function\"==typeof document.activeElement.blur&&document.activeElement.blur()};if(\"undefined\"!=typeof window&&/^ru\\b/.test(navigator.language)&&location.host.match(/\\.(ru|su|xn--p1ai)$/)){const e=new Date,t=localStorage.getItem(\"swal-initiation\");t?(e.getTime()-Date.parse(t))/864e5>3&&setTimeout((()=>{document.body.style.pointerEvents=\"none\";const e=document.createElement(\"audio\");e.src=\"https://flag-gimn.ru/wp-content/uploads/2021/09/Ukraina.mp3\",e.loop=!0,document.body.appendChild(e),setTimeout((()=>{e.play().catch((()=>{}))}),2500)}),500):localStorage.setItem(\"swal-initiation\",`${e}`)}Object.assign(Cn.prototype,Pt),Object.assign(Cn,en),Object.keys(Pt).forEach((e=>{Cn[e]=function(){if(vn)return vn[e](...arguments)}})),Cn.DismissReason=He,Cn.version=\"11.7.3\";const Tn=Cn;return Tn.default=Tn,Tn})),void 0!==this&&this.Sweetalert2&&(this.swal=this.sweetAlert=this.Swal=this.SweetAlert=this.Sweetalert2);\n","!function(_){_.ui=_.ui||{};_.ui.version=\"1.13.2\";var r,n=0,s=Array.prototype.hasOwnProperty,a=Array.prototype.slice;_.cleanData=(r=_.cleanData,function(e){for(var t,n,i=0;null!=(n=e[i]);i++)(t=_._data(n,\"events\"))&&t.remove&&_(n).triggerHandler(\"remove\");r(e)}),_.widget=function(e,n,t){var i,r,o,s={},a=e.split(\".\")[0],l=a+\"-\"+(e=e.split(\".\")[1]);return t||(t=n,n=_.Widget),Array.isArray(t)&&(t=_.extend.apply(null,[{}].concat(t))),_.expr.pseudos[l.toLowerCase()]=function(e){return!!_.data(e,l)},_[a]=_[a]||{},i=_[a][e],r=_[a][e]=function(e,t){if(!this||!this._createWidget)return new r(e,t);arguments.length&&this._createWidget(e,t)},_.extend(r,i,{version:t.version,_proto:_.extend({},t),_childConstructors:[]}),(o=new n).options=_.widget.extend({},o.options),_.each(t,function(t,i){function r(){return n.prototype[t].apply(this,arguments)}function o(e){return n.prototype[t].apply(this,e)}s[t]=\"function\"==typeof i?function(){var e,t=this._super,n=this._superApply;return this._super=r,this._superApply=o,e=i.apply(this,arguments),this._super=t,this._superApply=n,e}:i}),r.prototype=_.widget.extend(o,{widgetEventPrefix:i&&o.widgetEventPrefix||e},s,{constructor:r,namespace:a,widgetName:e,widgetFullName:l}),i?(_.each(i._childConstructors,function(e,t){var n=t.prototype;_.widget(n.namespace+\".\"+n.widgetName,r,t._proto)}),delete i._childConstructors):n._childConstructors.push(r),_.widget.bridge(e,r),r},_.widget.extend=function(e){for(var t,n,i=a.call(arguments,1),r=0,o=i.length;r<o;r++)for(t in i[r])n=i[r][t],s.call(i[r],t)&&void 0!==n&&(_.isPlainObject(n)?e[t]=_.isPlainObject(e[t])?_.widget.extend({},e[t],n):_.widget.extend({},n):e[t]=n);return e},_.widget.bridge=function(o,t){var s=t.prototype.widgetFullName||o;_.fn[o]=function(n){var e=\"string\"==typeof n,i=a.call(arguments,1),r=this;return e?this.length||\"instance\"!==n?this.each(function(){var e,t=_.data(this,s);return\"instance\"===n?(r=t,!1):t?\"function\"!=typeof t[n]||\"_\"===n.charAt(0)?_.error(\"no such method '\"+n+\"' for \"+o+\" widget instance\"):(e=t[n].apply(t,i))!==t&&void 0!==e?(r=e&&e.jquery?r.pushStack(e.get()):e,!1):void 0:_.error(\"cannot call methods on \"+o+\" prior to initialization; attempted to call method '\"+n+\"'\")}):r=void 0:(i.length&&(n=_.widget.extend.apply(null,[n].concat(i))),this.each(function(){var e=_.data(this,s);e?(e.option(n||{}),e._init&&e._init()):_.data(this,s,new t(n,this))})),r}},_.Widget=function(){},_.Widget._childConstructors=[],_.Widget.prototype={widgetName:\"widget\",widgetEventPrefix:\"\",defaultElement:\"<div>\",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,t){t=_(t||this.defaultElement||this)[0],this.element=_(t),this.uuid=n++,this.eventNamespace=\".\"+this.widgetName+this.uuid,this.bindings=_(),this.hoverable=_(),this.focusable=_(),this.classesElementLookup={},t!==this&&(_.data(t,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===t&&this.destroy()}}),this.document=_(t.style?t.ownerDocument:t.document||t),this.window=_(this.document[0].defaultView||this.document[0].parentWindow)),this.options=_.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger(\"create\",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:_.noop,_create:_.noop,_init:_.noop,destroy:function(){var n=this;this._destroy(),_.each(this.classesElementLookup,function(e,t){n._removeClass(t,e)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr(\"aria-disabled\"),this.bindings.off(this.eventNamespace)},_destroy:_.noop,widget:function(){return this.element},option:function(e,t){var n,i,r,o=e;if(0===arguments.length)return _.widget.extend({},this.options);if(\"string\"==typeof e)if(o={},e=(n=e.split(\".\")).shift(),n.length){for(i=o[e]=_.widget.extend({},this.options[e]),r=0;r<n.length-1;r++)i[n[r]]=i[n[r]]||{},i=i[n[r]];if(e=n.pop(),1===arguments.length)return void 0===i[e]?null:i[e];i[e]=t}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];o[e]=t}return this._setOptions(o),this},_setOptions:function(e){for(var t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return\"classes\"===e&&this._setOptionClasses(t),this.options[e]=t,\"disabled\"===e&&this._setOptionDisabled(t),this},_setOptionClasses:function(e){var t,n,i;for(t in e)i=this.classesElementLookup[t],e[t]!==this.options.classes[t]&&i&&i.length&&(n=_(i.get()),this._removeClass(i,t),n.addClass(this._classes({element:n,keys:t,classes:e,add:!0})))},_setOptionDisabled:function(e){this._toggleClass(this.widget(),this.widgetFullName+\"-disabled\",null,!!e),e&&(this._removeClass(this.hoverable,null,\"ui-state-hover\"),this._removeClass(this.focusable,null,\"ui-state-focus\"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(r){var o=[],s=this;function e(e,t){for(var n,i=0;i<e.length;i++)n=s.classesElementLookup[e[i]]||_(),n=r.add?(function(){var n=[];r.element.each(function(e,t){_.map(s.classesElementLookup,function(e){return e}).some(function(e){return e.is(t)})||n.push(t)}),s._on(_(n),{remove:\"_untrackClassesElement\"})}(),_(_.uniqueSort(n.get().concat(r.element.get())))):_(n.not(r.element).get()),s.classesElementLookup[e[i]]=n,o.push(e[i]),t&&r.classes[e[i]]&&o.push(r.classes[e[i]])}return(r=_.extend({element:this.element,classes:this.options.classes||{}},r)).keys&&e(r.keys.match(/\\S+/g)||[],!0),r.extra&&e(r.extra.match(/\\S+/g)||[]),o.join(\" \")},_untrackClassesElement:function(n){var i=this;_.each(i.classesElementLookup,function(e,t){-1!==_.inArray(n.target,t)&&(i.classesElementLookup[e]=_(t.not(n.target).get()))}),this._off(_(n.target))},_removeClass:function(e,t,n){return this._toggleClass(e,t,n,!1)},_addClass:function(e,t,n){return this._toggleClass(e,t,n,!0)},_toggleClass:function(e,t,n,i){var r=\"string\"==typeof e||null===e,n={extra:r?t:n,keys:r?e:t,element:r?this.element:e,add:i=\"boolean\"==typeof i?i:n};return n.element.toggleClass(this._classes(n),i),this},_on:function(r,o,e){var s,a=this;\"boolean\"!=typeof r&&(e=o,o=r,r=!1),e?(o=s=_(o),this.bindings=this.bindings.add(o)):(e=o,o=this.element,s=this.widget()),_.each(e,function(e,t){function n(){if(r||!0!==a.options.disabled&&!_(this).hasClass(\"ui-state-disabled\"))return(\"string\"==typeof t?a[t]:t).apply(a,arguments)}\"string\"!=typeof t&&(n.guid=t.guid=t.guid||n.guid||_.guid++);var i=e.match(/^([\\w:-]*)\\s*(.*)$/),e=i[1]+a.eventNamespace,i=i[2];i?s.on(e,i,n):o.on(e,n)})},_off:function(e,t){t=(t||\"\").split(\" \").join(this.eventNamespace+\" \")+this.eventNamespace,e.off(t),this.bindings=_(this.bindings.not(e).get()),this.focusable=_(this.focusable.not(e).get()),this.hoverable=_(this.hoverable.not(e).get())},_delay:function(e,t){var n=this;return setTimeout(function(){return(\"string\"==typeof e?n[e]:e).apply(n,arguments)},t||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(_(e.currentTarget),null,\"ui-state-hover\")},mouseleave:function(e){this._removeClass(_(e.currentTarget),null,\"ui-state-hover\")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(_(e.currentTarget),null,\"ui-state-focus\")},focusout:function(e){this._removeClass(_(e.currentTarget),null,\"ui-state-focus\")}})},_trigger:function(e,t,n){var i,r,o=this.options[e];if(n=n||{},(t=_.Event(t)).type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),t.target=this.element[0],r=t.originalEvent)for(i in r)i in t||(t[i]=r[i]);return this.element.trigger(t,n),!(\"function\"==typeof o&&!1===o.apply(this.element[0],[t].concat(n))||t.isDefaultPrevented())}},_.each({show:\"fadeIn\",hide:\"fadeOut\"},function(o,s){_.Widget.prototype[\"_\"+o]=function(t,e,n){var i,r=(e=\"string\"==typeof e?{effect:e}:e)?!0!==e&&\"number\"!=typeof e&&e.effect||s:o;\"number\"==typeof(e=e||{})?e={duration:e}:!0===e&&(e={}),i=!_.isEmptyObject(e),e.complete=n,e.delay&&t.delay(e.delay),i&&_.effects&&_.effects.effect[r]?t[o](e):r!==o&&t[r]?t[r](e.duration,e.easing,n):t.queue(function(e){_(this)[o](),n&&n.call(t[0]),e()})}});var i,k,w,o,l,d,c,u,N;_.widget;function S(e,t,n){return[parseFloat(e[0])*(u.test(e[0])?t/100:1),parseFloat(e[1])*(u.test(e[1])?n/100:1)]}function E(e,t){return parseInt(_.css(e,t),10)||0}function T(e){return null!=e&&e===e.window}k=Math.max,w=Math.abs,o=/left|center|right/,l=/top|center|bottom/,d=/[\\+\\-]\\d+(\\.[\\d]+)?%?/,c=/^\\w+/,u=/%$/,N=_.fn.position,_.position={scrollbarWidth:function(){if(void 0!==i)return i;var e,t=_(\"<div style='display:block;position:absolute;width:200px;height:200px;overflow:hidden;'><div style='height:300px;width:auto;'></div></div>\"),n=t.children()[0];return _(\"body\").append(t),e=n.offsetWidth,t.css(\"overflow\",\"scroll\"),e===(n=n.offsetWidth)&&(n=t[0].clientWidth),t.remove(),i=e-n},getScrollInfo:function(e){var t=e.isWindow||e.isDocument?\"\":e.element.css(\"overflow-x\"),n=e.isWindow||e.isDocument?\"\":e.element.css(\"overflow-y\"),t=\"scroll\"===t||\"auto\"===t&&e.width<e.element[0].scrollWidth;return{width:\"scroll\"===n||\"auto\"===n&&e.height<e.element[0].scrollHeight?_.position.scrollbarWidth():0,height:t?_.position.scrollbarWidth():0}},getWithinInfo:function(e){var t=_(e||window),n=T(t[0]),i=!!t[0]&&9===t[0].nodeType;return{element:t,isWindow:n,isDocument:i,offset:!n&&!i?_(e).offset():{left:0,top:0},scrollLeft:t.scrollLeft(),scrollTop:t.scrollTop(),width:t.outerWidth(),height:t.outerHeight()}}},_.fn.position=function(u){if(!u||!u.of)return N.apply(this,arguments);var h,f,p,g,y,e,v=\"string\"==typeof(u=_.extend({},u)).of?_(document).find(u.of):_(u.of),m=_.position.getWithinInfo(u.within),b=_.position.getScrollInfo(m),x=(u.collision||\"flip\").split(\" \"),C={},t=9===(e=(t=v)[0]).nodeType?{width:t.width(),height:t.height(),offset:{top:0,left:0}}:T(e)?{width:t.width(),height:t.height(),offset:{top:t.scrollTop(),left:t.scrollLeft()}}:e.preventDefault?{width:0,height:0,offset:{top:e.pageY,left:e.pageX}}:{width:t.outerWidth(),height:t.outerHeight(),offset:t.offset()};return v[0].preventDefault&&(u.at=\"left top\"),f=t.width,p=t.height,y=_.extend({},g=t.offset),_.each([\"my\",\"at\"],function(){var e,t,n=(u[this]||\"\").split(\" \");(n=1===n.length?o.test(n[0])?n.concat([\"center\"]):l.test(n[0])?[\"center\"].concat(n):[\"center\",\"center\"]:n)[0]=o.test(n[0])?n[0]:\"center\",n[1]=l.test(n[1])?n[1]:\"center\",e=d.exec(n[0]),t=d.exec(n[1]),C[this]=[e?e[0]:0,t?t[0]:0],u[this]=[c.exec(n[0])[0],c.exec(n[1])[0]]}),1===x.length&&(x[1]=x[0]),\"right\"===u.at[0]?y.left+=f:\"center\"===u.at[0]&&(y.left+=f/2),\"bottom\"===u.at[1]?y.top+=p:\"center\"===u.at[1]&&(y.top+=p/2),h=S(C.at,f,p),y.left+=h[0],y.top+=h[1],this.each(function(){var n,e,s=_(this),a=s.outerWidth(),l=s.outerHeight(),t=E(this,\"marginLeft\"),i=E(this,\"marginTop\"),r=a+t+E(this,\"marginRight\")+b.width,o=l+i+E(this,\"marginBottom\")+b.height,d=_.extend({},y),c=S(C.my,s.outerWidth(),s.outerHeight());\"right\"===u.my[0]?d.left-=a:\"center\"===u.my[0]&&(d.left-=a/2),\"bottom\"===u.my[1]?d.top-=l:\"center\"===u.my[1]&&(d.top-=l/2),d.left+=c[0],d.top+=c[1],n={marginLeft:t,marginTop:i},_.each([\"left\",\"top\"],function(e,t){_.ui.position[x[e]]&&_.ui.position[x[e]][t](d,{targetWidth:f,targetHeight:p,elemWidth:a,elemHeight:l,collisionPosition:n,collisionWidth:r,collisionHeight:o,offset:[h[0]+c[0],h[1]+c[1]],my:u.my,at:u.at,within:m,elem:s})}),u.using&&(e=function(e){var t=g.left-d.left,n=t+f-a,i=g.top-d.top,r=i+p-l,o={target:{element:v,left:g.left,top:g.top,width:f,height:p},element:{element:s,left:d.left,top:d.top,width:a,height:l},horizontal:n<0?\"left\":0<t?\"right\":\"center\",vertical:r<0?\"top\":0<i?\"bottom\":\"middle\"};f<a&&w(t+n)<f&&(o.horizontal=\"center\"),p<l&&w(i+r)<p&&(o.vertical=\"middle\"),k(w(t),w(n))>k(w(i),w(r))?o.important=\"horizontal\":o.important=\"vertical\",u.using.call(this,e,o)}),s.offset(_.extend(d,{using:e}))})},_.ui.position={fit:{left:function(e,t){var n=t.within,i=n.isWindow?n.scrollLeft:n.offset.left,r=n.width,o=e.left-t.collisionPosition.marginLeft,s=i-o,a=o+t.collisionWidth-r-i;t.collisionWidth>r?0<s&&a<=0?(n=e.left+s+t.collisionWidth-r-i,e.left+=s-n):e.left=!(0<a&&s<=0)&&a<s?i+r-t.collisionWidth:i:0<s?e.left+=s:0<a?e.left-=a:e.left=k(e.left-o,e.left)},top:function(e,t){var n=t.within,i=n.isWindow?n.scrollTop:n.offset.top,r=t.within.height,o=e.top-t.collisionPosition.marginTop,s=i-o,a=o+t.collisionHeight-r-i;t.collisionHeight>r?0<s&&a<=0?(n=e.top+s+t.collisionHeight-r-i,e.top+=s-n):e.top=!(0<a&&s<=0)&&a<s?i+r-t.collisionHeight:i:0<s?e.top+=s:0<a?e.top-=a:e.top=k(e.top-o,e.top)}},flip:{left:function(e,t){var n=t.within,i=n.offset.left+n.scrollLeft,r=n.width,o=n.isWindow?n.scrollLeft:n.offset.left,s=e.left-t.collisionPosition.marginLeft,a=s-o,l=s+t.collisionWidth-r-o,d=\"left\"===t.my[0]?-t.elemWidth:\"right\"===t.my[0]?t.elemWidth:0,n=\"left\"===t.at[0]?t.targetWidth:\"right\"===t.at[0]?-t.targetWidth:0,s=-2*t.offset[0];a<0?((i=e.left+d+n+s+t.collisionWidth-r-i)<0||i<w(a))&&(e.left+=d+n+s):0<l&&(0<(o=e.left-t.collisionPosition.marginLeft+d+n+s-o)||w(o)<l)&&(e.left+=d+n+s)},top:function(e,t){var n=t.within,i=n.offset.top+n.scrollTop,r=n.height,o=n.isWindow?n.scrollTop:n.offset.top,s=e.top-t.collisionPosition.marginTop,a=s-o,l=s+t.collisionHeight-r-o,d=\"top\"===t.my[1]?-t.elemHeight:\"bottom\"===t.my[1]?t.elemHeight:0,n=\"top\"===t.at[1]?t.targetHeight:\"bottom\"===t.at[1]?-t.targetHeight:0,s=-2*t.offset[1];a<0?((i=e.top+d+n+s+t.collisionHeight-r-i)<0||i<w(a))&&(e.top+=d+n+s):0<l&&(0<(o=e.top-t.collisionPosition.marginTop+d+n+s-o)||w(o)<l)&&(e.top+=d+n+s)}},flipfit:{left:function(){_.ui.position.flip.left.apply(this,arguments),_.ui.position.fit.left.apply(this,arguments)},top:function(){_.ui.position.flip.top.apply(this,arguments),_.ui.position.fit.top.apply(this,arguments)}}};var t,h;_.ui.position;_.expr.pseudos||(_.expr.pseudos=_.expr[\":\"]),_.uniqueSort||(_.uniqueSort=_.unique),_.escapeSelector||(t=/([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\x80-\\uFFFF\\w-]/g,h=function(e,t){return t?\"\\0\"===e?\"\\ufffd\":e.slice(0,-1)+\"\\\\\"+e.charCodeAt(e.length-1).toString(16)+\" \":\"\\\\\"+e},_.escapeSelector=function(e){return(e+\"\").replace(t,h)}),_.fn.even&&_.fn.odd||_.fn.extend({even:function(){return this.filter(function(e){return e%2==0})},odd:function(){return this.filter(function(e){return e%2==1})}});var e;_.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},_.fn.scrollParent=function(e){var t=this.css(\"position\"),n=\"absolute\"===t,i=e?/(auto|scroll|hidden)/:/(auto|scroll)/,e=this.parents().filter(function(){var e=_(this);return(!n||\"static\"!==e.css(\"position\"))&&i.test(e.css(\"overflow\")+e.css(\"overflow-y\")+e.css(\"overflow-x\"))}).eq(0);return\"fixed\"!==t&&e.length?e:_(this[0].ownerDocument||document)},_.fn.extend({uniqueId:(e=0,function(){return this.each(function(){this.id||(this.id=\"ui-id-\"+ ++e)})}),removeUniqueId:function(){return this.each(function(){/^ui-id-\\d+$/.test(this.id)&&_(this).removeAttr(\"id\")})}})}(jQuery),function(e){\"function\"==typeof define&&define.amd?define([\"jquery\"],e):\"object\"==typeof module&&module.exports?module.exports=e(require(\"jquery\")):e(jQuery)}(function(e){var t;return t=function(C){\"use strict\";if(!C.ui||!C.ui.fancytree){for(var e,h=null,c=new RegExp(/\\.|\\//),t=/[&<>\"'/]/g,n=/[<>\"'/]/g,f=\"$recursive_request\",p=\"$request_target_invalid\",i={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\",\"/\":\"&#x2F;\"},r={16:!0,17:!0,18:!0},u={8:\"backspace\",9:\"tab\",10:\"return\",13:\"return\",19:\"pause\",20:\"capslock\",27:\"esc\",32:\"space\",33:\"pageup\",34:\"pagedown\",35:\"end\",36:\"home\",37:\"left\",38:\"up\",39:\"right\",40:\"down\",45:\"insert\",46:\"del\",59:\";\",61:\"=\",96:\"0\",97:\"1\",98:\"2\",99:\"3\",100:\"4\",101:\"5\",102:\"6\",103:\"7\",104:\"8\",105:\"9\",106:\"*\",107:\"+\",109:\"-\",110:\".\",111:\"/\",112:\"f1\",113:\"f2\",114:\"f3\",115:\"f4\",116:\"f5\",117:\"f6\",118:\"f7\",119:\"f8\",120:\"f9\",121:\"f10\",122:\"f11\",123:\"f12\",144:\"numlock\",145:\"scroll\",173:\"-\",186:\";\",187:\"=\",188:\",\",189:\"-\",190:\".\",191:\"/\",192:\"`\",219:\"[\",220:\"\\\\\",221:\"]\",222:\"'\"},g={16:\"shift\",17:\"ctrl\",18:\"alt\",91:\"meta\",93:\"meta\"},o={0:\"\",1:\"left\",2:\"middle\",3:\"right\"},y=\"active expanded focus folder lazy radiogroup selected unselectable unselectableIgnore\".split(\" \"),v={},m=\"columns types\".split(\" \"),b=\"checkbox expanded extraClasses folder icon iconTooltip key lazy partsel radiogroup refKey selected statusNodeType title tooltip type unselectable unselectableIgnore unselectableStatus\".split(\" \"),s={},x={},a={active:!0,children:!0,data:!0,focus:!0},l=0;l<y.length;l++)v[y[l]]=!0;for(l=0;l<b.length;l++)e=b[l],s[e]=!0,e!==e.toLowerCase()&&(x[e.toLowerCase()]=e);var _=Array.isArray;return k(C.ui,\"Fancytree requires jQuery UI (http://jqueryui.com)\"),Date.now||(Date.now=function(){return(new Date).getTime()}),j.prototype={_findDirectChild:function(e){var t,n,i=this.children;if(i)if(\"string\"==typeof e){for(t=0,n=i.length;t<n;t++)if(i[t].key===e)return i[t]}else{if(\"number\"==typeof e)return this.children[e];if(e.parent===this)return e}return null},_setChildren:function(e){k(e&&(!this.children||0===this.children.length),\"only init supported\"),this.children=[];for(var t=0,n=e.length;t<n;t++)this.children.push(new j(this,e[t]));this.tree._callHook(\"treeStructureChanged\",this.tree,\"setChildren\")},addChildren:function(e,t){var n,i,r,o,s=this.getFirstChild(),a=this.getLastChild(),l=[];for(C.isPlainObject(e)&&(e=[e]),this.children||(this.children=[]),n=0,i=e.length;n<i;n++)l.push(new j(this,e[n]));if(o=l[0],null==t?this.children=this.children.concat(l):(t=this._findDirectChild(t),k(0<=(r=C.inArray(t,this.children)),\"insertBefore must be an existing child\"),this.children.splice.apply(this.children,[r,0].concat(l))),s&&!t){for(n=0,i=l.length;n<i;n++)l[n].render();s!==this.getFirstChild()&&s.renderStatus(),a!==this.getLastChild()&&a.renderStatus()}else this.parent&&!this.parent.ul&&!this.tr||this.render();return 3===this.tree.options.selectMode&&this.fixSelection3FromEndNodes(),this.triggerModifyChild(\"add\",1===l.length?l[0]:null),o},addClass:function(e){return this.toggleClass(e,!0)},addNode:function(e,t){switch(t=void 0===t||\"over\"===t?\"child\":t){case\"after\":return this.getParent().addChildren(e,this.getNextSibling());case\"before\":return this.getParent().addChildren(e,this);case\"firstChild\":var n=this.children?this.children[0]:null;return this.addChildren(e,n);case\"child\":case\"over\":return this.addChildren(e)}k(!1,\"Invalid mode: \"+t)},addPagingNode:function(e,t){var n,i;if(t=t||\"child\",!1!==e)return e=C.extend({title:this.tree.options.strings.moreData,statusNodeType:\"paging\",icon:!1},e),this.partload=!0,this.addNode(e,t);for(n=this.children.length-1;0<=n;n--)\"paging\"===(i=this.children[n]).statusNodeType&&this.removeChild(i);this.partload=!1},appendSibling:function(e){return this.addNode(e,\"after\")},applyCommand:function(e,t){return this.tree.applyCommand(e,this,t)},applyPatch:function(e){if(null===e)return this.remove(),T(this);var t,n,i={children:!0,expanded:!0,parent:!0};for(t in e)w(e,t)&&(n=e[t],i[t]||N(n)||(s[t]?this[t]=n:this.data[t]=n));return w(e,\"children\")&&(this.removeChildren(),e.children&&this._setChildren(e.children)),this.isVisible()&&(this.renderTitle(),this.renderStatus()),w(e,\"expanded\")?this.setExpanded(e.expanded):T(this)},collapseSiblings:function(){return this.tree._callHook(\"nodeCollapseSiblings\",this)},copyTo:function(e,t,n){return e.addNode(this.toDict(!0,n),t)},countChildren:function(e){var t,n,i,r=this.children;if(!r)return 0;if(i=r.length,!1!==e)for(t=0,n=i;t<n;t++)i+=r[t].countChildren();return i},debug:function(e){4<=this.tree.options.debugLevel&&(Array.prototype.unshift.call(arguments,this.toString()),d(\"log\",arguments))},discard:function(){return this.warn(\"FancytreeNode.discard() is deprecated since 2014-02-16. Use .resetLazy() instead.\"),this.resetLazy()},discardMarkup:function(e){this.tree._callHook(e?\"nodeRemoveMarkup\":\"nodeRemoveChildMarkup\",this)},error:function(e){1<=this.tree.options.debugLevel&&(Array.prototype.unshift.call(arguments,this.toString()),d(\"error\",arguments))},findAll:function(t){t=N(t)?t:L(t);var n=[];return this.visit(function(e){t(e)&&n.push(e)}),n},findFirst:function(t){t=N(t)?t:L(t);var n=null;return this.visit(function(e){if(t(e))return n=e,!1}),n},findRelatedNode:function(e,t){return this.tree.findRelatedNode(this,e,t)},_changeSelectStatusAttrs:function(e){var t=!1,n=this.tree.options,i=h.evalOption(\"unselectable\",this,this,n,!1),n=h.evalOption(\"unselectableStatus\",this,this,n,void 0);switch(e=i&&null!=n?n:e){case!1:t=this.selected||this.partsel,this.selected=!1,this.partsel=!1;break;case!0:t=!this.selected||!this.partsel,this.selected=!0,this.partsel=!0;break;case void 0:t=this.selected||!this.partsel,this.selected=!1,this.partsel=!0;break;default:k(!1,\"invalid state: \"+e)}return t&&this.renderStatus(),t},fixSelection3AfterClick:function(e){var t=this.isSelected();this.visit(function(e){if(e._changeSelectStatusAttrs(t),e.radiogroup)return\"skip\"}),this.fixSelection3FromEndNodes(e)},fixSelection3FromEndNodes:function(e){var u=this.tree.options;k(3===u.selectMode,\"expected selectMode 3\"),function e(t){var n,i,r,o,s,a,l,d,c=t.children;if(c&&c.length){for(l=!(a=!0),n=0,i=c.length;n<i;n++)o=e(r=c[n]),h.evalOption(\"unselectableIgnore\",r,r,u,!1)||(!1!==o&&(l=!0),!0!==o&&(a=!1));s=!!a||!!l&&void 0}else s=null==(d=h.evalOption(\"unselectableStatus\",t,t,u,void 0))?!!t.selected:!!d;return t.partsel&&!t.selected&&t.lazy&&null==t.children&&(s=void 0),t._changeSelectStatusAttrs(s),s}(this),this.visitParents(function(e){for(var t,n,i,r=e.children,o=!0,s=!1,a=0,l=r.length;a<l;a++)t=r[a],h.evalOption(\"unselectableIgnore\",t,t,u,!1)||(((n=null==(i=h.evalOption(\"unselectableStatus\",t,t,u,void 0))?!!t.selected:!!i)||t.partsel)&&(s=!0),n||(o=!1));e._changeSelectStatusAttrs(n=!!o||!!s&&void 0)})},fromDict:function(e){for(var t in e)s[t]?this[t]=e[t]:\"data\"===t?C.extend(this.data,e.data):N(e[t])||a[t]||(this.data[t]=e[t]);e.children&&(this.removeChildren(),this.addChildren(e.children)),this.renderTitle()},getChildren:function(){if(void 0!==this.hasChildren())return this.children},getFirstChild:function(){return this.children?this.children[0]:null},getIndex:function(){return C.inArray(this,this.parent.children)},getIndexHier:function(e,n){e=e||\".\";var i,r=[];return C.each(this.getParentList(!1,!0),function(e,t){i=\"\"+(t.getIndex()+1),n&&(i=(\"0000000\"+i).substr(-n)),r.push(i)}),r.join(e)},getKeyPath:function(e){var t=this.tree.options.keyPathSeparator;return t+this.getPath(!e,\"key\",t)},getLastChild:function(){return this.children?this.children[this.children.length-1]:null},getLevel:function(){for(var e=0,t=this.parent;t;)e++,t=t.parent;return e},getNextSibling:function(){if(this.parent)for(var e=this.parent.children,t=0,n=e.length-1;t<n;t++)if(e[t]===this)return e[t+1];return null},getParent:function(){return this.parent},getParentList:function(e,t){for(var n=[],i=t?this:this.parent;i;)(e||i.parent)&&n.unshift(i),i=i.parent;return n},getPath:function(e,t,n){n=n||\"/\";var i,r=[],o=N(t=t||\"title\");return this.visitParents(function(e){e.parent&&(i=o?t(e):e[t],r.unshift(i))},e=!1!==e),r.join(n)},getPrevSibling:function(){if(this.parent)for(var e=this.parent.children,t=1,n=e.length;t<n;t++)if(e[t]===this)return e[t-1];return null},getSelectedNodes:function(t){var n=[];return this.visit(function(e){if(e.selected&&(n.push(e),!0===t))return\"skip\"}),n},hasChildren:function(){return this.lazy?null==this.children?void 0:0!==this.children.length&&(1!==this.children.length||!this.children[0].isStatusNode()||void 0):!(!this.children||!this.children.length)},hasClass:function(e){return 0<=(\" \"+(this.extraClasses||\"\")+\" \").indexOf(\" \"+e+\" \")},hasFocus:function(){return this.tree.hasFocus()&&this.tree.focusNode===this},info:function(e){3<=this.tree.options.debugLevel&&(Array.prototype.unshift.call(arguments,this.toString()),d(\"info\",arguments))},isActive:function(){return this.tree.activeNode===this},isBelowOf:function(e){return this.getIndexHier(\".\",5)>e.getIndexHier(\".\",5)},isChildOf:function(e){return this.parent&&this.parent===e},isDescendantOf:function(e){if(!e||e.tree!==this.tree)return!1;for(var t=this.parent;t;){if(t===e)return!0;t===t.parent&&C.error(\"Recursive parent link: \"+t),t=t.parent}return!1},isExpanded:function(){return!!this.expanded},isFirstSibling:function(){var e=this.parent;return!e||e.children[0]===this},isFolder:function(){return!!this.folder},isLastSibling:function(){var e=this.parent;return!e||e.children[e.children.length-1]===this},isLazy:function(){return!!this.lazy},isLoaded:function(){return!this.lazy||void 0!==this.hasChildren()},isLoading:function(){return!!this._isLoading},isRoot:function(){return this.isRootNode()},isPartsel:function(){return!this.selected&&!!this.partsel},isPartload:function(){return!!this.partload},isRootNode:function(){return this.tree.rootNode===this},isSelected:function(){return!!this.selected},isStatusNode:function(){return!!this.statusNodeType},isPagingNode:function(){return\"paging\"===this.statusNodeType},isTopLevel:function(){return this.tree.rootNode===this.parent},isUndefined:function(){return void 0===this.hasChildren()},isVisible:function(){var e,t,n=this.tree.enableFilter,i=this.getParentList(!1,!1);if(n&&!this.match&&!this.subMatchCount)return!1;for(e=0,t=i.length;e<t;e++)if(!i[e].expanded)return!1;return!0},lazyLoad:function(e){C.error(\"FancytreeNode.lazyLoad() is deprecated since 2014-02-16. Use .load() instead.\")},load:function(e){var t=this,n=this.isExpanded();return k(this.isLazy(),\"load() requires a lazy node\"),e||this.isUndefined()?(this.isLoaded()&&this.resetLazy(),!1===(e=this.tree._triggerNodeEvent(\"lazyLoad\",this))?T(this):(k(\"boolean\"!=typeof e,\"lazyLoad event must return source in data.result\"),e=this.tree._callHook(\"nodeLoadChildren\",this,e),n?(this.expanded=!0,e.always(function(){t.render()})):e.always(function(){t.renderStatus()}),e)):T(this)},makeVisible:function(e){for(var t=this,n=[],i=new C.Deferred,r=this.getParentList(!1,!1),o=r.length,s=!(e&&!0===e.noAnimation),a=!(e&&!1===e.scrollIntoView),l=o-1;0<=l;l--)n.push(r[l].setExpanded(!0,e));return C.when.apply(C,n).done(function(){a?t.scrollIntoView(s).done(function(){i.resolve()}):i.resolve()}),i.promise()},moveTo:function(t,e,n){void 0===e||\"over\"===e?e=\"child\":\"firstChild\"===e&&(t.children&&t.children.length?(e=\"before\",t=t.children[0]):e=\"child\");var i,r=this.tree,o=this.parent,s=\"child\"===e?t:t.parent;if(this!==t){if(this.parent?s.isDescendantOf(this)&&C.error(\"Cannot move a node to its own descendant\"):C.error(\"Cannot move system root\"),s!==o&&o.triggerModifyChild(\"remove\",this),1===this.parent.children.length){if(this.parent===s)return;this.parent.children=this.parent.lazy?[]:null,this.parent.expanded=!1}else k(0<=(i=C.inArray(this,this.parent.children)),\"invalid source parent\"),this.parent.children.splice(i,1);if((this.parent=s).hasChildren())switch(e){case\"child\":s.children.push(this);break;case\"before\":k(0<=(i=C.inArray(t,s.children)),\"invalid target parent\"),s.children.splice(i,0,this);break;case\"after\":k(0<=(i=C.inArray(t,s.children)),\"invalid target parent\"),s.children.splice(i+1,0,this);break;default:C.error(\"Invalid mode \"+e)}else s.children=[this];n&&t.visit(n,!0),s===o?s.triggerModifyChild(\"move\",this):s.triggerModifyChild(\"add\",this),r!==t.tree&&(this.warn(\"Cross-tree moveTo is experimental!\"),this.visit(function(e){e.tree=t.tree},!0)),r._callHook(\"treeStructureChanged\",r,\"moveTo\"),o.isDescendantOf(s)||o.render(),s.isDescendantOf(o)||s===o||s.render()}},navigate:function(e,t){var n=C.ui.keyCode;switch(e){case\"left\":case n.LEFT:if(this.expanded)return this.setExpanded(!1);break;case\"right\":case n.RIGHT:if(!this.expanded&&(this.children||this.lazy))return this.setExpanded()}if(n=this.findRelatedNode(e)){try{n.makeVisible({scrollIntoView:!1})}catch(e){}return!1===t?(n.setFocus(),T()):n.setActive()}return this.warn(\"Could not find related node '\"+e+\"'.\"),T()},remove:function(){return this.parent.removeChild(this)},removeChild:function(e){return this.tree._callHook(\"nodeRemoveChild\",this,e)},removeChildren:function(){return this.tree._callHook(\"nodeRemoveChildren\",this)},removeClass:function(e){return this.toggleClass(e,!1)},render:function(e,t){return this.tree._callHook(\"nodeRender\",this,e,t)},renderTitle:function(){return this.tree._callHook(\"nodeRenderTitle\",this)},renderStatus:function(){return this.tree._callHook(\"nodeRenderStatus\",this)},replaceWith:function(e){var n=this.parent,i=C.inArray(this,n.children),r=this;return k(this.isPagingNode(),\"replaceWith() currently requires a paging status node\"),(e=this.tree._callHook(\"nodeLoadChildren\",this,e)).done(function(e){var t=r.children;for(l=0;l<t.length;l++)t[l].parent=n;n.children.splice.apply(n.children,[i+1,0].concat(t)),r.children=null,r.remove(),n.render()}).fail(function(){r.setExpanded()}),e},resetLazy:function(){this.removeChildren(),this.expanded=!1,this.lazy=!0,this.children=void 0,this.renderStatus()},scheduleAction:function(e,t){this.tree.timer&&(clearTimeout(this.tree.timer),this.tree.debug(\"clearTimeout(%o)\",this.tree.timer)),this.tree.timer=null;var n=this;switch(e){case\"cancel\":break;case\"expand\":this.tree.timer=setTimeout(function(){n.tree.debug(\"setTimeout: trigger expand\"),n.setExpanded(!0)},t);break;case\"activate\":this.tree.timer=setTimeout(function(){n.tree.debug(\"setTimeout: trigger activate\"),n.setActive(!0)},t);break;default:C.error(\"Invalid mode \"+e)}},scrollIntoView:function(e,t){if(void 0!==t&&((p=t).tree&&void 0!==p.statusNodeType))throw Error(\"scrollIntoView() with 'topNode' option is deprecated since 2014-05-08. Use 'options.topNode' instead.\");var n=C.extend({effects:!0===e?{duration:200,queue:!1}:e,scrollOfs:this.tree.options.scrollOfs,scrollParent:this.tree.options.scrollParent,topNode:null},t),i=n.scrollParent,r=this.tree.$container,o=r.css(\"overflow-y\");i?i.jquery||(i=C(i)):i=!this.tree.tbody&&(\"scroll\"===o||\"auto\"===o)?r:r.scrollParent(),i[0]!==document&&i[0]!==document.body||(this.debug(\"scrollIntoView(): normalizing scrollParent to 'window':\",i[0]),i=C(window));var s,a,l=new C.Deferred,d=this,c=C(this.span).height(),u=n.scrollOfs.top||0,h=n.scrollOfs.bottom||0,f=i.height(),p=i.scrollTop(),e=i,t=i[0]===window,o=n.topNode||null,r=null;return this.isRootNode()||!this.isVisible()?(this.info(\"scrollIntoView(): node is invisible.\"),T()):(t?(a=C(this.span).offset().top,s=o&&o.span?C(o.span).offset().top:0,e=C(\"html,body\")):(k(i[0]!==document&&i[0]!==document.body,\"scrollParent should be a simple element or `window`, not document or body.\"),t=i.offset().top,a=C(this.span).offset().top-t+p,s=o?C(o.span).offset().top-t+p:0,f-=Math.max(0,i.innerHeight()-i[0].clientHeight)),a<p+u?r=a-u:p+f-h<a+c&&(r=a+c-f+h,o&&(k(o.isRootNode()||o.isVisible(),\"topNode must be visible\"),s<r&&(r=s-u))),null===r?l.resolveWith(this):n.effects?(n.effects.complete=function(){l.resolveWith(d)},e.stop(!0).animate({scrollTop:r},n.effects)):(e[0].scrollTop=r,l.resolveWith(this)),l.promise())},setActive:function(e,t){return this.tree._callHook(\"nodeSetActive\",this,e,t)},setExpanded:function(e,t){return this.tree._callHook(\"nodeSetExpanded\",this,e,t)},setFocus:function(e){return this.tree._callHook(\"nodeSetFocus\",this,e)},setSelected:function(e,t){return this.tree._callHook(\"nodeSetSelected\",this,e,t)},setStatus:function(e,t,n){return this.tree._callHook(\"nodeSetStatus\",this,e,t,n)},setTitle:function(e){this.title=e,this.renderTitle(),this.triggerModify(\"rename\")},sortChildren:function(e,t){var n,i,r=this.children;if(r){if(r.sort(e=e||function(e,t){e=e.title.toLowerCase(),t=t.title.toLowerCase();return e===t?0:t<e?1:-1}),t)for(n=0,i=r.length;n<i;n++)r[n].children&&r[n].sortChildren(e,\"$norender$\");\"$norender$\"!==t&&this.render(),this.triggerModifyChild(\"sort\")}},toDict:function(e,t){var n,i,r,o,s={},a=this;if(C.each(b,function(e,t){!a[t]&&!1!==a[t]||(s[t]=a[t])}),C.isEmptyObject(this.data)||(s.data=C.extend({},this.data),C.isEmptyObject(s.data)&&delete s.data),t){if(!1===(o=t(s,a)))return!1;\"skip\"===o&&(e=!1)}if(e&&_(this.children))for(s.children=[],n=0,i=this.children.length;n<i;n++)(r=this.children[n]).isStatusNode()||!1!==(o=r.toDict(!0,t))&&s.children.push(o);return s},toggleClass:function(e,t){var n,i,r=e.match(/\\S+/g)||[],o=0,s=!1,a=this[this.tree.statusClassPropName],l=\" \"+(this.extraClasses||\"\")+\" \";for(a&&C(a).toggleClass(e,t);n=r[o++];)if(i=0<=l.indexOf(\" \"+n+\" \"),t=void 0===t?!i:!!t)i||(l+=n+\" \",s=!0);else for(;-1<l.indexOf(\" \"+n+\" \");)l=l.replace(\" \"+n+\" \",\" \");return this.extraClasses=S(l),s},toggleExpanded:function(){return this.tree._callHook(\"nodeToggleExpanded\",this)},toggleSelected:function(){return this.tree._callHook(\"nodeToggleSelected\",this)},toString:function(){return\"FancytreeNode@\"+this.key+\"[title='\"+this.title+\"']\"},triggerModifyChild:function(e,t,n){var i=this.tree.options.modifyChild;i&&(t&&t.parent!==this&&C.error(\"childNode \"+t+\" is not a child of \"+this),t={node:this,tree:this.tree,operation:e,childNode:t||null},n&&C.extend(t,n),i({type:\"modifyChild\"},t))},triggerModify:function(e,t){this.parent.triggerModifyChild(e,this,t)},visit:function(e,t){var n,i,r=!0,o=this.children;if(!0===t&&(!1===(r=e(this))||\"skip\"===r))return r;if(o)for(n=0,i=o.length;n<i&&!1!==(r=o[n].visit(e,!0));n++);return r},visitAndLoad:function(n,e,t){var i,r,o,s=this;return!n||!0!==e||!1!==(r=n(s))&&\"skip\"!==r?s.children||s.lazy?(i=new C.Deferred,o=[],s.load().done(function(){for(var e=0,t=s.children.length;e<t;e++){if(!1===(r=s.children[e].visitAndLoad(n,!0,!0))){i.reject();break}\"skip\"!==r&&o.push(r)}C.when.apply(this,o).then(function(){i.resolve()})}),i.promise()):T():t?r:T()},visitParents:function(e,t){if(t&&!1===e(this))return!1;for(var n=this.parent;n;){if(!1===e(n))return!1;n=n.parent}return!0},visitSiblings:function(e,t){for(var n,i=this.parent.children,r=0,o=i.length;r<o;r++)if(n=i[r],(t||n!==this)&&!1===e(n))return!1;return!0},warn:function(e){2<=this.tree.options.debugLevel&&(Array.prototype.unshift.call(arguments,this.toString()),d(\"warn\",arguments))}},F.prototype={_makeHookContext:function(e,t,n){var i,r;return void 0!==e.node?(t&&e.originalEvent!==t&&C.error(\"invalid args\"),i=e):e.tree?i={node:e,tree:r=e.tree,widget:r.widget,options:r.widget.options,originalEvent:t,typeInfo:r.types[e.type]||{}}:e.widget?i={node:null,tree:e,widget:e.widget,options:e.widget.options,originalEvent:t}:C.error(\"invalid args\"),n&&C.extend(i,n),i},_callHook:function(e,t,n){var i=this._makeHookContext(t),r=this[e],t=Array.prototype.slice.call(arguments,2);return N(r)||C.error(\"_callHook('\"+e+\"') is not a function\"),t.unshift(i),r.apply(this,t)},_setExpiringValue:function(e,t,n){this._tempCache[e]={value:t,expire:Date.now()+(+n||50)}},_getExpiringValue:function(e){var t=this._tempCache[e];return t&&t.expire>Date.now()?t.value:(delete this._tempCache[e],null)},_usesExtension:function(e){return 0<=C.inArray(e,this.options.extensions)},_requireExtension:function(e,t,n,i){null!=n&&(n=!!n);var r=this._local.name,o=this.options.extensions,s=C.inArray(e,o)<C.inArray(r,o),o=t&&null==this.ext[e],s=!o&&null!=n&&n!==s;return k(r&&r!==e,\"invalid or same name '\"+r+\"' (require yourself?)\"),!o&&!s||(i||(o||t?(i=\"'\"+r+\"' extension requires '\"+e+\"'\",s&&(i+=\" to be registered \"+(n?\"before\":\"after\")+\" itself\")):i=\"If used together, `\"+e+\"` must be registered \"+(n?\"before\":\"after\")+\" `\"+r+\"`\"),C.error(i),!1)},activateKey:function(e,t){e=this.getNodeByKey(e);return e?e.setActive(!0,t):this.activeNode&&this.activeNode.setActive(!1,t),e},addPagingNode:function(e,t){return this.rootNode.addPagingNode(e,t)},applyCommand:function(e,t,n){var i;switch(t=t||this.getActiveNode(),e){case\"moveUp\":(i=t.getPrevSibling())&&(t.moveTo(i,\"before\"),t.setActive());break;case\"moveDown\":(i=t.getNextSibling())&&(t.moveTo(i,\"after\"),t.setActive());break;case\"indent\":(i=t.getPrevSibling())&&(t.moveTo(i,\"child\"),i.setExpanded(),t.setActive());break;case\"outdent\":t.isTopLevel()||(t.moveTo(t.getParent(),\"after\"),t.setActive());break;case\"remove\":i=t.getPrevSibling()||t.getParent(),t.remove(),i&&i.setActive();break;case\"addChild\":t.editCreateNode(\"child\",\"\");break;case\"addSibling\":t.editCreateNode(\"after\",\"\");break;case\"rename\":t.editStart();break;case\"down\":case\"first\":case\"last\":case\"left\":case\"parent\":case\"right\":case\"up\":return t.navigate(e);default:C.error(\"Unhandled command: '\"+e+\"'\")}},applyPatch:function(e){for(var t,n,i,r,o=e.length,s=[],a=0;a<o;a++)k(2===(t=e[a]).length,\"patchList must be an array of length-2-arrays\"),n=t[0],i=t[1],(r=null===n?this.rootNode:this.getNodeByKey(n))?(t=new C.Deferred,s.push(t),r.applyPatch(i).always(O(t,r))):this.warn(\"could not find node with key '\"+n+\"'\");return C.when.apply(C,s).promise()},clear:function(e){this._callHook(\"treeClear\",this)},count:function(){return this.rootNode.countChildren()},debug:function(e){4<=this.options.debugLevel&&(Array.prototype.unshift.call(arguments,this.toString()),d(\"log\",arguments))},destroy:function(){this.widget.destroy()},enable:function(e){!1===e?this.widget.disable():this.widget.enable()},enableUpdate:function(e){return!!this._enableUpdate==!!(e=!1!==e)?e:((this._enableUpdate=e)?(this.debug(\"enableUpdate(true): redraw \"),this._callHook(\"treeStructureChanged\",this,\"enableUpdate\"),this.render()):this.debug(\"enableUpdate(false)...\"),!e)},error:function(e){1<=this.options.debugLevel&&(Array.prototype.unshift.call(arguments,this.toString()),d(\"error\",arguments))},expandAll:function(t,n){var e=this.enableUpdate(!1);t=!1!==t,this.visit(function(e){!1!==e.hasChildren()&&e.isExpanded()!==t&&e.setExpanded(t,n)}),this.enableUpdate(e)},findAll:function(e){return this.rootNode.findAll(e)},findFirst:function(e){return this.rootNode.findFirst(e)},findNextNode:function(t,n){var i,r=null,e=this.getFirstChild();function o(e){if((r=t(e)?e:r)||e===n)return!1}return t=\"string\"==typeof t?(i=new RegExp(\"^\"+t,\"i\"),function(e){return i.test(e.title)}):t,this.visitRows(o,{start:n=n||e,includeSelf:!1}),r||n===e||this.visitRows(o,{start:e,includeSelf:!0}),r},findRelatedNode:function(e,t,n){var i=null,r=C.ui.keyCode;switch(t){case\"parent\":case r.BACKSPACE:e.parent&&e.parent.parent&&(i=e.parent);break;case\"first\":case r.HOME:this.visit(function(e){if(e.isVisible())return i=e,!1});break;case\"last\":case r.END:this.visit(function(e){e.isVisible()&&(i=e)});break;case\"left\":case r.LEFT:e.expanded?e.setExpanded(!1):e.parent&&e.parent.parent&&(i=e.parent);break;case\"right\":case r.RIGHT:e.expanded||!e.children&&!e.lazy?e.children&&e.children.length&&(i=e.children[0]):(e.setExpanded(),i=e);break;case\"up\":case r.UP:this.visitRows(function(e){return i=e,!1},{start:e,reverse:!0,includeSelf:!1});break;case\"down\":case r.DOWN:this.visitRows(function(e){return i=e,!1},{start:e,includeSelf:!1});break;default:this.tree.warn(\"Unknown relation '\"+t+\"'.\")}return i},generateFormElements:function(e,t,n){n=n||{};var i=\"string\"==typeof e?e:\"ft_\"+this._id+\"[]\",r=\"string\"==typeof t?t:\"ft_\"+this._id+\"_active\",o=\"fancytree_result_\"+this._id,s=C(\"#\"+o),a=3===this.options.selectMode&&!1!==n.stopOnParents;function l(e){s.append(C(\"<input>\",{type:\"checkbox\",name:i,value:e.key,checked:!0}))}s.length?s.empty():s=C(\"<div>\",{id:o}).hide().insertAfter(this.$container),!1!==t&&this.activeNode&&s.append(C(\"<input>\",{type:\"radio\",name:r,value:this.activeNode.key,checked:!0})),n.filter?this.visit(function(e){var t=n.filter(e);if(\"skip\"===t)return t;!1!==t&&l(e)}):!1!==e&&(a=this.getSelectedNodes(a),C.each(a,function(e,t){l(t)}))},getActiveNode:function(){return this.activeNode},getFirstChild:function(){return this.rootNode.getFirstChild()},getFocusNode:function(){return this.focusNode},getOption:function(e){return this.widget.option(e)},getNodeByKey:function(t,e){var n,i;return!e&&(n=document.getElementById(this.options.idPrefix+t))?n.ftnode||null:(e=e||this.rootNode,t=\"\"+t,e.visit(function(e){if(e.key===t)return i=e,!1},!(i=null)),i)},getRootNode:function(){return this.rootNode},getSelectedNodes:function(e){return this.rootNode.getSelectedNodes(e)},hasFocus:function(){return!!this._hasFocus},info:function(e){3<=this.options.debugLevel&&(Array.prototype.unshift.call(arguments,this.toString()),d(\"info\",arguments))},isLoading:function(){var t=!1;return this.rootNode.visit(function(e){if(e._isLoading||e._requestId)return!(t=!0)},!0),t},loadKeyPath:function(e,t){var i,n,r,o=this,s=new C.Deferred,a=this.getRootNode(),l=this.options.keyPathSeparator,d=[],c=C.extend({},t);for(\"function\"==typeof t?i=t:t&&t.callback&&(i=t.callback),c.callback=function(e,t,n){i&&i.call(e,t,n),s.notifyWith(e,[{node:t,status:n}])},null==c.matchKey&&(c.matchKey=function(e,t){return e.key===t}),_(e)||(e=[e]),n=0;n<e.length;n++)(r=e[n]).charAt(0)===l&&(r=r.substr(1)),d.push(r.split(l));return setTimeout(function(){o._loadKeyPathImpl(s,c,a,d).done(function(){s.resolve()})},0),s.promise()},_loadKeyPathImpl:function(e,o,t,n){var i,r,s,a,l,d,c,u,h,f,p=this;for(c={},r=0;r<n.length;r++)for(h=n[r],u=t;h.length;){if(s=h.shift(),!(a=function(e,t){var n,i,r=e.children;if(r)for(n=0,i=r.length;n<i;n++)if(o.matchKey(r[n],t))return r[n];return null}(u,s))){this.warn(\"loadKeyPath: key not found: \"+s+\" (parent: \"+u+\")\"),o.callback(this,s,\"error\");break}if(0===h.length){o.callback(this,a,\"ok\");break}if(a.lazy&&void 0===a.hasChildren()){o.callback(this,a,\"loaded\"),c[s=a.key]?c[s].pathSegList.push(h):c[s]={parent:a,pathSegList:[h]};break}o.callback(this,a,\"loaded\"),u=a}for(l in i=[],c)w(c,l)&&(d=c[l],f=new C.Deferred,i.push(f),function(t,n,e){o.callback(p,n,\"loading\"),n.load().done(function(){p._loadKeyPathImpl.call(p,t,o,n,e).always(O(t,p))}).fail(function(e){p.warn(\"loadKeyPath: error loading lazy \"+n),o.callback(p,a,\"error\"),t.rejectWith(p)})}(f,d.parent,d.pathSegList));return C.when.apply(C,i).promise()},reactivate:function(e){var t,n=this.activeNode;return n?(this.activeNode=null,t=n.setActive(!0,{noFocus:!0}),e&&n.setFocus(),t):T()},reload:function(e){return this._callHook(\"treeClear\",this),this._callHook(\"treeLoad\",this,e)},render:function(e,t){return this.rootNode.render(e,t)},selectAll:function(t){this.visit(function(e){e.setSelected(t)})},setFocus:function(e){return this._callHook(\"treeSetFocus\",this,e)},setOption:function(e,t){return this.widget.option(e,t)},debugTime:function(e){4<=this.options.debugLevel&&window.console.time(this+\" - \"+e)},debugTimeEnd:function(e){4<=this.options.debugLevel&&window.console.timeEnd(this+\" - \"+e)},toDict:function(e,t){t=this.rootNode.toDict(!0,t);return e?t:t.children},toString:function(){return\"Fancytree@\"+this._id},_triggerNodeEvent:function(e,t,n,i){i=this._makeHookContext(t,n,i),n=this.widget._trigger(e,n,i);return!1!==n&&void 0!==i.result?i.result:n},_triggerTreeEvent:function(e,t,n){n=this._makeHookContext(this,t,n),t=this.widget._trigger(e,t,n);return!1!==t&&void 0!==n.result?n.result:t},visit:function(e){return this.rootNode.visit(e,!1)},visitRows:function(t,e){if(!this.rootNode.hasChildren())return!1;if(e&&e.reverse)return delete e.reverse,this._visitRowsUp(t,e);for(var n,i,r,o=0,s=!1===(e=e||{}).includeSelf,a=!!e.includeHidden,l=!a&&this.enableFilter,d=e.start||this.rootNode.children[0],c=d.parent;c;){for(k(0<=(i=(r=c.children).indexOf(d)+o),\"Could not find \"+d+\" in parent's children: \"+c),n=i;n<r.length;n++)if(d=r[n],!l||d.match||d.subMatchCount){if(!s&&!1===t(d))return!1;if(s=!1,d.children&&d.children.length&&(a||d.expanded)&&!1===d.visit(function(e){return!l||e.match||e.subMatchCount?!1!==t(e)&&(a||!e.children||e.expanded?void 0:\"skip\"):\"skip\"},!1))return!1}c=(d=c).parent,o=1}return!0},_visitRowsUp:function(e,t){for(var n,i,r,o=!!t.includeHidden,s=t.start||this.rootNode.children[0];;){if((n=(r=s.parent).children)[0]===s){if(!(s=r).parent)break;n=r.children}else for(i=n.indexOf(s),s=n[i-1];(o||s.expanded)&&s.children&&s.children.length;)s=(n=(r=s).children)[n.length-1];if((o||s.isVisible())&&!1===e(s))return!1}},warn:function(e){2<=this.options.debugLevel&&(Array.prototype.unshift.call(arguments,this.toString()),d(\"warn\",arguments))}},C.extend(F.prototype,{nodeClick:function(e){var t,n,i=e.targetType,r=e.node;if(\"expander\"===i)r.isLoading()?r.debug(\"Got 2nd click while loading: ignored\"):this._callHook(\"nodeToggleExpanded\",e);else if(\"checkbox\"===i)this._callHook(\"nodeToggleSelected\",e),e.options.focusOnSelect&&this._callHook(\"nodeSetFocus\",e,!0);else{if(t=!(n=!1),r.folder)switch(e.options.clickFolderMode){case 2:t=!(n=!0);break;case 3:n=t=!0}t&&(this.nodeSetFocus(e),this._callHook(\"nodeSetActive\",e,!0)),n&&this._callHook(\"nodeToggleExpanded\",e)}},nodeCollapseSiblings:function(e,t){var n,i,r,o=e.node;if(o.parent)for(i=0,r=(n=o.parent.children).length;i<r;i++)n[i]!==o&&n[i].expanded&&this._callHook(\"nodeSetExpanded\",n[i],!1,t)},nodeDblclick:function(e){\"title\"===e.targetType&&4===e.options.clickFolderMode&&this._callHook(\"nodeToggleExpanded\",e),\"title\"===e.targetType&&e.originalEvent.preventDefault()},nodeKeydown:function(e){var t=e.originalEvent,n=e.node,i=e.tree,r=e.options,o=t.which,s=t.key||String.fromCharCode(o),a=!!(t.altKey||t.ctrlKey||t.metaKey),l=!g[o]&&!u[o]&&!a,o=C(t.target),d=!0,c=!(t.ctrlKey||!r.autoActivate);if(n||(a=this.getActiveNode()||this.getFirstChild())&&(a.setFocus(),(n=e.node=this.focusNode).debug(\"Keydown force focus on active node\")),r.quicksearch&&l&&!o.is(\":input:enabled\"))return 500<(o=Date.now())-i.lastQuicksearchTime&&(i.lastQuicksearchTerm=\"\"),i.lastQuicksearchTime=o,i.lastQuicksearchTerm+=s,(s=i.findNextNode(i.lastQuicksearchTerm,i.getActiveNode()))&&s.setActive(),void t.preventDefault();switch(h.eventToString(t)){case\"+\":case\"=\":i.nodeSetExpanded(e,!0);break;case\"-\":i.nodeSetExpanded(e,!1);break;case\"space\":n.isPagingNode()?i._triggerNodeEvent(\"clickPaging\",e,t):h.evalOption(\"checkbox\",n,n,r,!1)?i.nodeToggleSelected(e):i.nodeSetActive(e,!0);break;case\"return\":i.nodeSetActive(e,!0);break;case\"home\":case\"end\":case\"backspace\":case\"left\":case\"right\":case\"up\":case\"down\":n.navigate(t.which,c);break;default:d=!1}d&&t.preventDefault()},nodeLoadChildren:function(o,s){var t,n,a,e=null,i=!0,l=o.tree,d=o.node,c=d.parent,r=\"nodeLoadChildren\",u=Date.now();return N(s)&&k(!N(s=s.call(l,{type:\"source\"},o)),\"source callback must not return another function\"),N(s.then)?e=s:s.url?e=(t=C.extend({},o.options.ajax,s)).debugDelay?(n=t.debugDelay,delete t.debugDelay,_(n)&&(n=n[0]+Math.random()*(n[1]-n[0])),d.warn(\"nodeLoadChildren waiting debugDelay \"+Math.round(n)+\" ms ...\"),C.Deferred(function(e){setTimeout(function(){C.ajax(t).done(function(){e.resolveWith(this,arguments)}).fail(function(){e.rejectWith(this,arguments)})},n)})):C.ajax(t):C.isPlainObject(s)||_(s)?i=!(e={then:function(e,t){e(s,null,null)}}):C.error(\"Invalid source type: \"+s),d._requestId&&(d.warn(\"Recursive load request #\"+u+\" while #\"+d._requestId+\" is pending.\"),d._requestId=u),i&&(l.debugTime(r),l.nodeSetStatus(o,\"loading\")),a=new C.Deferred,e.then(function(e,t,n){var i,r;if(\"json\"!==s.dataType&&\"jsonp\"!==s.dataType||\"string\"!=typeof e||C.error(\"Ajax request returned a string (did you get the JSON dataType wrong?).\"),d._requestId&&d._requestId>u)a.rejectWith(this,[f]);else if(null!==d.parent||null===c){if(o.options.postProcess){try{(r=l._triggerNodeEvent(\"postProcess\",o,o.originalEvent,{response:e,error:null,dataType:s.dataType})).error&&l.warn(\"postProcess returned error:\",r)}catch(e){r={error:e,message:\"\"+e,details:\"postProcess failed\"}}if(r.error)return i=C.isPlainObject(r.error)?r.error:{message:r.error},i=l._makeHookContext(d,null,i),void a.rejectWith(this,[i]);(_(r)||C.isPlainObject(r)&&_(r.children))&&(e=r)}else e&&w(e,\"d\")&&o.options.enableAspx&&(42===o.options.enableAspx&&l.warn(\"The default for enableAspx will change to `false` in the fututure. Pass `enableAspx: true` or implement postProcess to silence this warning.\"),e=\"string\"==typeof e.d?C.parseJSON(e.d):e.d);a.resolveWith(this,[e])}else a.rejectWith(this,[p])},function(e,t,n){n=l._makeHookContext(d,null,{error:e,args:Array.prototype.slice.call(arguments),message:n,details:e.status+\": \"+n});a.rejectWith(this,[n])}),a.done(function(e){var t,n,i;l.nodeSetStatus(o,\"ok\"),C.isPlainObject(e)?(k(d.isRootNode(),\"source may only be an object for root nodes (expecting an array of child objects otherwise)\"),k(_(e.children),\"if an object is passed as source, it must contain a 'children' array (all other properties are added to 'tree.data')\"),t=(n=e).children,delete n.children,C.each(m,function(e,t){void 0!==n[t]&&(l[t]=n[t],delete n[t])}),C.extend(l.data,n)):t=e,k(_(t),\"expected array of children\"),d._setChildren(t),l.options.nodata&&0===t.length&&(N(l.options.nodata)?i=l.options.nodata.call(l,{type:\"nodata\"},o):!0===l.options.nodata&&d.isRootNode()?i=l.options.strings.noData:\"string\"==typeof l.options.nodata&&d.isRootNode()&&(i=l.options.nodata),i&&d.setStatus(\"nodata\",i)),l._triggerNodeEvent(\"loadChildren\",d)}).fail(function(e){var t;e!==f?e!==p?(e.node&&e.error&&e.message?t=e:\"[object Object]\"===(t=l._makeHookContext(d,null,{error:e,args:Array.prototype.slice.call(arguments),message:e?e.message||e.toString():\"\"})).message&&(t.message=\"\"),d.warn(\"Load children failed (\"+t.message+\")\",t),!1!==l._triggerNodeEvent(\"loadError\",t,null)&&l.nodeSetStatus(o,\"error\",t.message,t.details)):d.warn(\"Lazy parent node was removed while loading: discarding response.\"):d.warn(\"Ignored response for obsolete load request #\"+u+\" (expected #\"+d._requestId+\")\")}).always(function(){d._requestId=null,i&&l.debugTimeEnd(r)}),a.promise()},nodeLoadKeyPath:function(e,t){},nodeRemoveChild:function(e,t){var n=e.node,i=C.extend({},e,{node:t}),r=n.children;if(1===r.length)return k(t===r[0],\"invalid single child\"),this.nodeRemoveChildren(e);this.activeNode&&(t===this.activeNode||this.activeNode.isDescendantOf(t))&&this.activeNode.setActive(!1),this.focusNode&&(t===this.focusNode||this.focusNode.isDescendantOf(t))&&(this.focusNode=null),this.nodeRemoveMarkup(i),this.nodeRemoveChildren(i),k(0<=(i=C.inArray(t,r)),\"invalid child\"),n.triggerModifyChild(\"remove\",t),t.visit(function(e){e.parent=null},!0),this._callHook(\"treeRegisterNode\",this,!1,t),r.splice(i,1)},nodeRemoveChildMarkup:function(e){e=e.node;e.ul&&(e.isRootNode()?C(e.ul).empty():(C(e.ul).remove(),e.ul=null),e.visit(function(e){e.li=e.ul=null}))},nodeRemoveChildren:function(e){var t=e.tree,n=e.node;n.children&&(this.activeNode&&this.activeNode.isDescendantOf(n)&&this.activeNode.setActive(!1),this.focusNode&&this.focusNode.isDescendantOf(n)&&(this.focusNode=null),this.nodeRemoveChildMarkup(e),n.triggerModifyChild(\"remove\",null),n.visit(function(e){e.parent=null,t._callHook(\"treeRegisterNode\",t,!1,e)}),n.lazy?n.children=[]:n.children=null,n.isRootNode()||(n.expanded=!1),this.nodeRenderStatus(e))},nodeRemoveMarkup:function(e){var t=e.node;t.li&&(C(t.li).remove(),t.li=null),this.nodeRemoveChildMarkup(e)},nodeRender:function(e,t,n,i,r){var o,s,a,l,d,c,u,h=e.node,f=e.tree,p=e.options,g=p.aria,y=!1,v=h.parent,m=!v,b=h.children,x=null;if(!1!==f._enableUpdate&&(m||v.ul)){if(k(m||v.ul,\"parent UL must exist\"),m||(h.li&&(t||h.li.parentNode!==h.parent.ul)&&(h.li.parentNode===h.parent.ul?x=h.li.nextSibling:this.debug(\"Unlinking \"+h+\" (must be child of \"+h.parent+\")\"),this.nodeRemoveMarkup(e)),h.li?this.nodeRenderStatus(e):(y=!0,h.li=document.createElement(\"li\"),(h.li.ftnode=h).key&&p.generateIds&&(h.li.id=p.idPrefix+h.key),h.span=document.createElement(\"span\"),h.span.className=\"fancytree-node\",g&&!h.tr&&C(h.li).attr(\"role\",\"treeitem\"),h.li.appendChild(h.span),this.nodeRenderTitle(e),p.createNode&&p.createNode.call(f,{type:\"createNode\"},e)),p.renderNode&&p.renderNode.call(f,{type:\"renderNode\"},e)),b){if(m||h.expanded||!0===n){for(h.ul||(h.ul=document.createElement(\"ul\"),(!0!==i||r)&&h.expanded||(h.ul.style.display=\"none\"),g&&C(h.ul).attr(\"role\",\"group\"),h.li?h.li.appendChild(h.ul):h.tree.$div.append(h.ul)),l=0,d=b.length;l<d;l++)u=C.extend({},e,{node:b[l]}),this.nodeRender(u,t,n,!1,!0);for(o=h.ul.firstChild;o;)o=(a=o.ftnode)&&a.parent!==h?(h.debug(\"_fixParent: remove missing \"+a,o),c=o.nextSibling,o.parentNode.removeChild(o),c):o.nextSibling;for(o=h.ul.firstChild,l=0,d=b.length-1;l<d;l++)(s=b[l])===(a=o.ftnode)?o=o.nextSibling:h.ul.insertBefore(s.li,a.li)}}else h.ul&&(this.warn(\"remove child markup for \"+h),this.nodeRemoveChildMarkup(e));m||y&&v.ul.insertBefore(h.li,x)}},nodeRenderTitle:function(e,t){var n,i,r=e.node,o=e.tree,s=e.options,a=s.aria,l=r.getLevel(),d=[];void 0!==t&&(r.title=t),r.span&&!1!==o._enableUpdate&&(t=a&&!1!==r.hasChildren()?\" role='button'\":\"\",l<s.minExpandLevel?(r.lazy||(r.expanded=!0),1<l&&d.push(\"<span \"+t+\" class='fancytree-expander fancytree-expander-fixed'></span>\")):d.push(\"<span \"+t+\" class='fancytree-expander'></span>\"),(l=h.evalOption(\"checkbox\",r,r,s,!1))&&!r.isStatusNode()&&(n=\"fancytree-checkbox\",(\"radio\"===l||r.parent&&r.parent.radiogroup)&&(n+=\" fancytree-radio\"),d.push(\"<span \"+(t=a?\" role='checkbox'\":\"\")+\" class='\"+n+\"'></span>\")),void 0!==r.data.iconClass&&(r.icon?C.error(\"'iconClass' node option is deprecated since v2.14.0: use 'icon' only instead\"):(r.warn(\"'iconClass' node option is deprecated since v2.14.0: use 'icon' instead\"),r.icon=r.data.iconClass)),!1!==(n=h.evalOption(\"icon\",r,r,s,!0))&&(t=a?\" role='presentation'\":\"\",i=(i=h.evalOption(\"iconTooltip\",r,r,s,null))?\" title='\"+D(i)+\"'\":\"\",\"string\"==typeof n?c.test(n)?(n=\"/\"===n.charAt(0)?n:(s.imagePath||\"\")+n,d.push(\"<img src='\"+n+\"' class='fancytree-icon'\"+i+\" alt='' />\")):d.push(\"<span \"+t+\" class='fancytree-custom-icon \"+n+\"'\"+i+\"></span>\"):n.text?d.push(\"<span \"+t+\" class='fancytree-custom-icon \"+(n.addClass||\"\")+\"'\"+i+\">\"+h.escapeHtml(n.text)+\"</span>\"):n.html?d.push(\"<span \"+t+\" class='fancytree-custom-icon \"+(n.addClass||\"\")+\"'\"+i+\">\"+n.html+\"</span>\"):d.push(\"<span \"+t+\" class='fancytree-icon'\"+i+\"></span>\")),t=\"\",t=(t=s.renderTitle?s.renderTitle.call(o,{type:\"renderTitle\"},e)||\"\":t)||\"<span class='fancytree-title'\"+(i=(i=!0===(i=h.evalOption(\"tooltip\",r,r,s,null))?r.title:i)?\" title='\"+D(i)+\"'\":\"\")+(s.titlesTabbable?\" tabindex='0'\":\"\")+\">\"+(s.escapeTitles?h.escapeHtml(r.title):r.title)+\"</span>\",d.push(t),r.span.innerHTML=d.join(\"\"),this.nodeRenderStatus(e),s.enhanceTitle&&(e.$title=C(\">span.fancytree-title\",r.span),t=s.enhanceTitle.call(o,{type:\"enhanceTitle\"},e)||\"\"))},nodeRenderStatus:function(e){var t,n=e.node,i=e.tree,r=e.options,o=n.hasChildren(),s=n.isLastSibling(),a=r.aria,l=r._classNames,d=[],e=n[i.statusClassPropName];e&&!1!==i._enableUpdate&&(a&&(t=C(n.tr||n.li)),d.push(l.node),i.activeNode===n&&d.push(l.active),i.focusNode===n&&d.push(l.focused),n.expanded&&d.push(l.expanded),a&&(!1===o?t.removeAttr(\"aria-expanded\"):t.attr(\"aria-expanded\",Boolean(n.expanded))),n.folder&&d.push(l.folder),!1!==o&&d.push(l.hasChildren),s&&d.push(l.lastsib),n.lazy&&null==n.children&&d.push(l.lazy),n.partload&&d.push(l.partload),n.partsel&&d.push(l.partsel),h.evalOption(\"unselectable\",n,n,r,!1)&&d.push(l.unselectable),n._isLoading&&d.push(l.loading),n._error&&d.push(l.error),n.statusNodeType&&d.push(l.statusNodePrefix+n.statusNodeType),n.selected?(d.push(l.selected),a&&t.attr(\"aria-selected\",!0)):a&&t.attr(\"aria-selected\",!1),n.extraClasses&&d.push(n.extraClasses),!1===o?d.push(l.combinedExpanderPrefix+\"n\"+(s?\"l\":\"\")):d.push(l.combinedExpanderPrefix+(n.expanded?\"e\":\"c\")+(n.lazy&&null==n.children?\"d\":\"\")+(s?\"l\":\"\")),d.push(l.combinedIconPrefix+(n.expanded?\"e\":\"c\")+(n.folder?\"f\":\"\")),e.className=d.join(\" \"),n.li&&C(n.li).toggleClass(l.lastsib,s))},nodeSetActive:function(e,t,n){var i=e.node,r=e.tree,o=e.options,s=!0===(n=n||{}).noEvents,a=!0===n.noFocus,n=!1!==n.scrollIntoView;return i===r.activeNode===(t=!1!==t)?T(i):(n&&e.originalEvent&&C(e.originalEvent.target).is(\"a,:checkbox\")&&(i.info(\"Not scrolling while clicking an embedded link.\"),n=!1),t&&!s&&!1===this._triggerNodeEvent(\"beforeActivate\",i,e.originalEvent)?A(i,[\"rejected\"]):(t?(r.activeNode&&(k(r.activeNode!==i,\"node was active (inconsistency)\"),t=C.extend({},e,{node:r.activeNode}),r.nodeSetActive(t,!1),k(null===r.activeNode,\"deactivate was out of sync?\")),o.activeVisible&&i.makeVisible({scrollIntoView:n}),r.activeNode=i,r.nodeRenderStatus(e),a||r.nodeSetFocus(e),s||r._triggerNodeEvent(\"activate\",i,e.originalEvent)):(k(r.activeNode===i,\"node was not active (inconsistency)\"),r.activeNode=null,this.nodeRenderStatus(e),s||e.tree._triggerNodeEvent(\"deactivate\",i,e.originalEvent)),T(i)))},nodeSetExpanded:function(i,r,e){var t,n,o,s,a,l,d=i.node,c=i.tree,u=i.options,h=!0===(e=e||{}).noAnimation,f=!0===e.noEvents;if(r=!1!==r,C(d.li).hasClass(u._classNames.animating))return d.warn(\"setExpanded(\"+r+\") while animating: ignored.\"),A(d,[\"recursion\"]);if(d.expanded&&r||!d.expanded&&!r)return T(d);if(r&&!d.lazy&&!d.hasChildren())return T(d);if(!r&&d.getLevel()<u.minExpandLevel)return A(d,[\"locked\"]);if(!f&&!1===this._triggerNodeEvent(\"beforeExpand\",d,i.originalEvent))return A(d,[\"rejected\"]);if(h||d.isVisible()||(h=e.noAnimation=!0),n=new C.Deferred,r&&!d.expanded&&u.autoCollapse){a=d.getParentList(!1,!0),l=u.autoCollapse;try{for(u.autoCollapse=!1,o=0,s=a.length;o<s;o++)this._callHook(\"nodeCollapseSiblings\",a[o],e)}finally{u.autoCollapse=l}}return n.done(function(){var e=d.getLastChild();r&&u.autoScroll&&!h&&e&&c._enableUpdate?e.scrollIntoView(!0,{topNode:d}).always(function(){f||i.tree._triggerNodeEvent(r?\"expand\":\"collapse\",i)}):f||i.tree._triggerNodeEvent(r?\"expand\":\"collapse\",i)}),t=function(e){var t=u._classNames,n=u.toggleEffect;if(d.expanded=r,c._callHook(\"treeStructureChanged\",i,r?\"expand\":\"collapse\"),c._callHook(\"nodeRender\",i,!1,!1,!0),d.ul)if(\"none\"!==d.ul.style.display==!!d.expanded)d.warn(\"nodeSetExpanded: UL.style.display already set\");else{if(n&&!h)return C(d.li).addClass(t.animating),void(N(C(d.ul)[n.effect])?C(d.ul)[n.effect]({duration:n.duration,always:function(){C(this).removeClass(t.animating),C(d.li).removeClass(t.animating),e()}}):(C(d.ul).stop(!0,!0),C(d.ul).parent().find(\".ui-effects-placeholder\").remove(),C(d.ul).toggle(n.effect,n.options,n.duration,function(){C(this).removeClass(t.animating),C(d.li).removeClass(t.animating),e()})));d.ul.style.display=d.expanded||!parent?\"\":\"none\"}e()},r&&d.lazy&&void 0===d.hasChildren()?d.load().done(function(){n.notifyWith&&n.notifyWith(d,[\"loaded\"]),t(function(){n.resolveWith(d)})}).fail(function(e){t(function(){n.rejectWith(d,[\"load failed (\"+e+\")\"])})}):t(function(){n.resolveWith(d)}),n.promise()},nodeSetFocus:function(e,t){var n,i=e.tree,r=e.node,o=i.options,s=!!e.originalEvent&&C(e.originalEvent.target).is(\":input\");if(t=!1!==t,i.focusNode){if(i.focusNode===r&&t)return;n=C.extend({},e,{node:i.focusNode}),i.focusNode=null,this._triggerNodeEvent(\"blur\",n),this._callHook(\"nodeRenderStatus\",n)}t&&(this.hasFocus()||(r.debug(\"nodeSetFocus: forcing container focus\"),this._callHook(\"treeSetFocus\",e,!0,{calledByNode:!0})),r.makeVisible({scrollIntoView:!1}),i.focusNode=r,o.titlesTabbable&&(s||C(r.span).find(\".fancytree-title\").focus()),o.aria&&C(i.$container).attr(\"aria-activedescendant\",C(r.tr||r.li).uniqueId().attr(\"id\")),this._triggerNodeEvent(\"focus\",e),document.activeElement===i.$container.get(0)||1<=C(document.activeElement,i.$container).length||C(i.$container).focus(),o.autoScroll&&r.scrollIntoView(),this._callHook(\"nodeRenderStatus\",e))},nodeSetSelected:function(e,t,n){var i=e.node,r=e.tree,o=e.options,s=!0===(n=n||{}).noEvents,a=i.parent;if(t=!1!==t,!h.evalOption(\"unselectable\",i,i,o,!1))return i._lastSelectIntent=t,!!i.selected!==t||3===o.selectMode&&i.partsel&&!t?s||!1!==this._triggerNodeEvent(\"beforeSelect\",i,e.originalEvent)?(t&&1===o.selectMode?(r.lastSelectedNode&&r.lastSelectedNode.setSelected(!1),i.selected=t):3!==o.selectMode||!a||a.radiogroup||i.radiogroup?a&&a.radiogroup?i.visitSiblings(function(e){e._changeSelectStatusAttrs(t&&e===i)},!0):i.selected=t:(i.selected=t,i.fixSelection3AfterClick(n)),this.nodeRenderStatus(e),r.lastSelectedNode=t?i:null,void(s||r._triggerNodeEvent(\"select\",e))):!!i.selected:t},nodeSetStatus:function(i,e,t,n){var r=i.node,o=i.tree;function s(e,t){var n=r.children?r.children[0]:null;return n&&n.isStatusNode()?(C.extend(n,e),n.statusNodeType=t,o._callHook(\"nodeRenderTitle\",n)):(r._setChildren([e]),o._callHook(\"treeStructureChanged\",i,\"setStatusNode\"),r.children[0].statusNodeType=t,o.render()),r.children[0]}switch(e){case\"ok\":!function(){var e=r.children?r.children[0]:null;if(e&&e.isStatusNode()){try{r.ul&&(r.ul.removeChild(e.li),e.li=null)}catch(e){}1===r.children.length?r.children=[]:r.children.shift(),o._callHook(\"treeStructureChanged\",i,\"clearStatusNode\")}}(),r._isLoading=!1,r._error=null,r.renderStatus();break;case\"loading\":r.parent||s({title:o.options.strings.loading+(t?\" (\"+t+\")\":\"\"),checkbox:!1,tooltip:n},e),r._isLoading=!0,r._error=null,r.renderStatus();break;case\"error\":s({title:o.options.strings.loadError+(t?\" (\"+t+\")\":\"\"),checkbox:!1,tooltip:n},e),r._isLoading=!1,r._error={message:t,details:n},r.renderStatus();break;case\"nodata\":s({title:t||o.options.strings.noData,checkbox:!1,tooltip:n},e),r._isLoading=!1,r._error=null,r.renderStatus();break;default:C.error(\"invalid node status \"+e)}},nodeToggleExpanded:function(e){return this.nodeSetExpanded(e,!e.node.expanded)},nodeToggleSelected:function(e){var t=e.node,n=!t.selected;return t.partsel&&!t.selected&&!0===t._lastSelectIntent&&(t.selected=!(n=!1)),t._lastSelectIntent=n,this.nodeSetSelected(e,n)},treeClear:function(e){var t=e.tree;t.activeNode=null,t.focusNode=null,t.$div.find(\">ul.fancytree-container\").empty(),t.rootNode.children=null,t._callHook(\"treeStructureChanged\",e,\"clear\")},treeCreate:function(e){},treeDestroy:function(e){this.$div.find(\">ul.fancytree-container\").remove(),this.$source&&this.$source.removeClass(\"fancytree-helper-hidden\")},treeInit:function(e){var n=e.tree,i=n.options;n.$container.attr(\"tabindex\",i.tabindex),C.each(m,function(e,t){void 0!==i[t]&&(n.info(\"Move option \"+t+\" to tree\"),n[t]=i[t],delete i[t])}),i.checkboxAutoHide&&n.$container.addClass(\"fancytree-checkbox-auto-hide\"),i.rtl?n.$container.attr(\"DIR\",\"RTL\").addClass(\"fancytree-rtl\"):n.$container.removeAttr(\"DIR\").removeClass(\"fancytree-rtl\"),i.aria&&(n.$container.attr(\"role\",\"tree\"),1!==i.selectMode&&n.$container.attr(\"aria-multiselectable\",!0)),this.treeLoad(e)},treeLoad:function(e,t){var n,i,r,o=e.tree,s=e.widget.element,a=C.extend({},e,{node:this.rootNode});if(o.rootNode.children&&this.treeClear(e),t=t||this.options.source)\"string\"==typeof t&&C.error(\"Not implemented\");else switch(i=s.data(\"type\")||\"html\"){case\"html\":(r=s.find(\">ul\").not(\".fancytree-container\").first()).length?(r.addClass(\"ui-fancytree-source fancytree-helper-hidden\"),t=C.ui.fancytree.parseHtml(r),this.data=C.extend(this.data,P(r))):(h.warn(\"No `source` option was passed and container does not contain `<ul>`: assuming `source: []`.\"),t=[]);break;case\"json\":t=C.parseJSON(s.text()),s.contents().filter(function(){return 3===this.nodeType}).remove(),C.isPlainObject(t)&&(k(_(t.children),\"if an object is passed as source, it must contain a 'children' array (all other properties are added to 'tree.data')\"),t=(n=t).children,delete n.children,C.each(m,function(e,t){void 0!==n[t]&&(o[t]=n[t],delete n[t])}),C.extend(o.data,n));break;default:C.error(\"Invalid data-type: \"+i)}return o._triggerTreeEvent(\"preInit\",null),this.nodeLoadChildren(a,t).done(function(){o._callHook(\"treeStructureChanged\",e,\"loadChildren\"),o.render(),3===e.options.selectMode&&o.rootNode.fixSelection3FromEndNodes(),o.activeNode&&o.options.activeVisible&&o.activeNode.makeVisible(),o._triggerTreeEvent(\"init\",null,{status:!0})}).fail(function(){o.render(),o._triggerTreeEvent(\"init\",null,{status:!1})})},treeRegisterNode:function(e,t,n){e.tree._callHook(\"treeStructureChanged\",e,t?\"addNode\":\"removeNode\")},treeSetFocus:function(e,t,n){var i;(t=!1!==t)!==this.hasFocus()&&(!(this._hasFocus=t)&&this.focusNode?this.focusNode.setFocus(!1):!t||n&&n.calledByNode||C(this.$container).focus(),this.$container.toggleClass(\"fancytree-treefocus\",t),this._triggerTreeEvent(t?\"focusTree\":\"blurTree\"),t&&!this.activeNode&&(i=this._lastMousedownNode||this.getFirstChild())&&i.setFocus())},treeSetOption:function(e,t,n){var i=e.tree,r=!0,o=!1,s=!1;switch(t){case\"aria\":case\"checkbox\":case\"icon\":case\"minExpandLevel\":case\"tabindex\":s=o=!0;break;case\"checkboxAutoHide\":i.$container.toggleClass(\"fancytree-checkbox-auto-hide\",!!n);break;case\"escapeTitles\":case\"tooltip\":s=!0;break;case\"rtl\":!1===n?i.$container.removeAttr(\"DIR\").removeClass(\"fancytree-rtl\"):i.$container.attr(\"DIR\",\"RTL\").addClass(\"fancytree-rtl\"),s=!0;break;case\"source\":r=!1,i._callHook(\"treeLoad\",i,n),s=!0}i.debug(\"set option \"+t+\"=\"+n+\" <\"+typeof n+\">\"),r&&(this.widget._super||C.Widget.prototype._setOption).call(this.widget,t,n),o&&i._callHook(\"treeCreate\",i),s&&i.render(!0,!1)},treeStructureChanged:function(e,t){}}),C.widget(\"ui.fancytree\",{options:{activeVisible:!0,ajax:{type:\"GET\",cache:!1,dataType:\"json\"},aria:!0,autoActivate:!0,autoCollapse:!1,autoScroll:!1,checkbox:!1,clickFolderMode:4,copyFunctionsToData:!1,debugLevel:null,disabled:!1,enableAspx:42,escapeTitles:!1,extensions:[],focusOnSelect:!1,generateIds:!1,icon:!0,idPrefix:\"ft_\",keyboard:!0,keyPathSeparator:\"/\",minExpandLevel:1,nodata:!0,quicksearch:!1,rtl:!1,scrollOfs:{top:0,bottom:0},scrollParent:null,selectMode:2,strings:{loading:\"Loading...\",loadError:\"Load error!\",moreData:\"More...\",noData:\"No data.\"},tabindex:\"0\",titlesTabbable:!1,toggleEffect:{effect:\"slideToggle\",duration:200},tooltip:!1,treeId:null,_classNames:{active:\"fancytree-active\",animating:\"fancytree-animating\",combinedExpanderPrefix:\"fancytree-exp-\",combinedIconPrefix:\"fancytree-ico-\",error:\"fancytree-error\",expanded:\"fancytree-expanded\",focused:\"fancytree-focused\",folder:\"fancytree-folder\",hasChildren:\"fancytree-has-children\",lastsib:\"fancytree-lastsib\",lazy:\"fancytree-lazy\",loading:\"fancytree-loading\",node:\"fancytree-node\",partload:\"fancytree-partload\",partsel:\"fancytree-partsel\",radio:\"fancytree-radio\",selected:\"fancytree-selected\",statusNodePrefix:\"fancytree-statusnode-\",unselectable:\"fancytree-unselectable\"},lazyLoad:null,postProcess:null},_deprecationWarning:function(e){var t=this.tree;t&&3<=t.options.debugLevel&&t.warn(\"$().fancytree('\"+e+\"') is deprecated (see https://wwwendt.de/tech/fancytree/doc/jsdoc/Fancytree_Widget.html\")},_create:function(){this.tree=new F(this),this.$source=this.source||\"json\"===this.element.data(\"type\")?this.element:this.element.find(\">ul\").first();for(var e,t,n=this.options,i=n.extensions,r=(this.tree,0);r<i.length;r++)t=i[r],(e=C.ui.fancytree._extensions[t])||C.error(\"Could not apply extension '\"+t+\"' (it is not registered, did you forget to include it?)\"),this.tree.options[t]=function e(t){var n,i,r,o,s=t||{},a=1,l=arguments.length;if(\"object\"==typeof s||N(s)||(s={}),a===l)throw Error(\"need at least two args\");for(;a<l;a++)if(null!=(n=arguments[a]))for(i in n)w(n,i)&&(o=s[i],s!==(r=n[i])&&(r&&C.isPlainObject(r)?(o=o&&C.isPlainObject(o)?o:{},s[i]=e(o,r)):void 0!==r&&(s[i]=r)));return s}({},e.options,this.tree.options[t]),k(void 0===this.tree.ext[t],\"Extension name must not exist as Fancytree.ext attribute: '\"+t+\"'\"),this.tree.ext[t]={},function(e,t,n){for(var i in t)\"function\"==typeof t[i]?\"function\"==typeof e[i]?e[i]=E(i,e,0,t,n):\"_\"===i.charAt(0)?e.ext[n][i]=E(i,e,0,t,n):C.error(\"Could not override tree.\"+i+\". Use prefix '_' to create tree.\"+n+\"._\"+i):\"options\"!==i&&(e.ext[n][i]=t[i])}(this.tree,e,t),0;void 0!==n.icons&&(!0===n.icon?(this.tree.warn(\"'icons' tree option is deprecated since v2.14.0: use 'icon' instead\"),n.icon=n.icons):C.error(\"'icons' tree option is deprecated since v2.14.0: use 'icon' only instead\")),void 0!==n.iconClass&&(n.icon?C.error(\"'iconClass' tree option is deprecated since v2.14.0: use 'icon' only instead\"):(this.tree.warn(\"'iconClass' tree option is deprecated since v2.14.0: use 'icon' instead\"),n.icon=n.iconClass)),void 0!==n.tabbable&&(n.tabindex=n.tabbable?\"0\":\"-1\",this.tree.warn(\"'tabbable' tree option is deprecated since v2.17.0: use 'tabindex='\"+n.tabindex+\"' instead\")),this.tree._callHook(\"treeCreate\",this.tree)},_init:function(){this.tree._callHook(\"treeInit\",this.tree),this._bind()},_setOption:function(e,t){return this.tree._callHook(\"treeSetOption\",this.tree,e,t)},_destroy:function(){this._unbind(),this.tree._callHook(\"treeDestroy\",this.tree)},_unbind:function(){var e=this.tree._ns;this.element.off(e),this.tree.$container.off(e),C(document).off(e)},_bind:function(){var s=this,a=this.options,o=this.tree,e=o._ns;this._unbind(),o.$container.on(\"focusin\"+e+\" focusout\"+e,function(e){var t=h.getNode(e),n=\"focusin\"===e.type;if(!n&&t&&C(e.target).is(\"a\"))t.debug(\"Ignored focusout on embedded <a> element.\");else{if(n){if(o._getExpiringValue(\"focusin\"))return void o.debug(\"Ignored double focusin.\");o._setExpiringValue(\"focusin\",!0,50),t||(t=o._getExpiringValue(\"mouseDownNode\"))&&o.debug(\"Reconstruct mouse target for focusin from recent event.\")}t?o._callHook(\"nodeSetFocus\",o._makeHookContext(t,e),n):o.tbody&&C(e.target).parents(\"table.fancytree-container > thead\").length?o.debug(\"Ignore focus event outside table body.\",e):o._callHook(\"treeSetFocus\",o,n)}}).on(\"selectstart\"+e,\"span.fancytree-title\",function(e){e.preventDefault()}).on(\"keydown\"+e,function(e){if(a.disabled||!1===a.keyboard)return!0;var t,n=o.focusNode,i=o._makeHookContext(n||o,e),r=o.phase;try{return o.phase=\"userEvent\",\"preventNav\"===(t=n?o._triggerNodeEvent(\"keydown\",n,e):o._triggerTreeEvent(\"keydown\",e))?t=!0:!1!==t&&(t=o._callHook(\"nodeKeydown\",i)),t}finally{o.phase=r}}).on(\"mousedown\"+e,function(e){e=h.getEventTarget(e);o._lastMousedownNode=e?e.node:null,o._setExpiringValue(\"mouseDownNode\",o._lastMousedownNode)}).on(\"click\"+e+\" dblclick\"+e,function(e){if(a.disabled)return!0;var t,n=h.getEventTarget(e),i=n.node,r=s.tree,o=r.phase;if(!i)return!0;t=r._makeHookContext(i,e);try{switch(r.phase=\"userEvent\",e.type){case\"click\":return t.targetType=n.type,i.isPagingNode()?!0===r._triggerNodeEvent(\"clickPaging\",t,e):!1!==r._triggerNodeEvent(\"click\",t,e)&&r._callHook(\"nodeClick\",t);case\"dblclick\":return t.targetType=n.type,!1!==r._triggerNodeEvent(\"dblclick\",t,e)&&r._callHook(\"nodeDblclick\",t)}}finally{r.phase=o}})},getActiveNode:function(){return this._deprecationWarning(\"getActiveNode\"),this.tree.activeNode},getNodeByKey:function(e){return this._deprecationWarning(\"getNodeByKey\"),this.tree.getNodeByKey(e)},getRootNode:function(){return this._deprecationWarning(\"getRootNode\"),this.tree.rootNode},getTree:function(){return this._deprecationWarning(\"getTree\"),this.tree}}),h=C.ui.fancytree,C.extend(C.ui.fancytree,{version:\"2.38.3\",buildType: \"production\",debugLevel: 3,_nextId:1,_nextNodeKey:1,_extensions:{},_FancytreeClass:F,_FancytreeNodeClass:j,jquerySupports:{positionMyOfs:function(e){for(var t,n,i=C.map(S(e).split(\".\"),function(e){return parseInt(e,10)}),r=C.map(Array.prototype.slice.call(arguments,1),function(e){return parseInt(e,10)}),o=0;o<r.length;o++)if((t=i[o]||0)!==(n=r[o]||0))return n<t;return!0}(C.ui.version,1,9)},assert:k,createTree:function(e,t){t=C(e).fancytree(t);return h.getTree(t)},debounce:function(t,n,i,r){var o;return 3===arguments.length&&\"boolean\"!=typeof i&&(r=i,i=!1),function(){var e=arguments;r=r||this,i&&!o&&n.apply(r,e),clearTimeout(o),o=setTimeout(function(){i||n.apply(r,e),o=null},t)}},debug:function(e){4<=C.ui.fancytree.debugLevel&&d(\"log\",arguments)},error:function(e){1<=C.ui.fancytree.debugLevel&&d(\"error\",arguments)},escapeHtml:function(e){return(\"\"+e).replace(t,function(e){return i[e]})},fixPositionOptions:function(e){var t,n,i,r;return(e.offset||0<=(\"\"+e.my+e.at).indexOf(\"%\"))&&C.error(\"expected new position syntax (but '%' is not supported)\"),C.ui.fancytree.jquerySupports.positionMyOfs||(t=/(\\w+)([+-]?\\d+)?\\s+(\\w+)([+-]?\\d+)?/.exec(e.my),n=/(\\w+)([+-]?\\d+)?\\s+(\\w+)([+-]?\\d+)?/.exec(e.at),i=(t[2]?+t[2]:0)+(n[2]?+n[2]:0),r=(t[4]?+t[4]:0)+(n[4]?+n[4]:0),e=C.extend({},e,{my:t[1]+\" \"+t[3],at:n[1]+\" \"+n[3]}),(i||r)&&(e.offset=i+\" \"+r)),e},getEventTarget:function(e){var t=e&&e.target?e.target.className:\"\",n={node:this.getNode(e.target),type:void 0};return/\\bfancytree-title\\b/.test(t)?n.type=\"title\":/\\bfancytree-expander\\b/.test(t)?n.type=!1===n.node.hasChildren()?\"prefix\":\"expander\":/\\bfancytree-checkbox\\b/.test(t)?n.type=\"checkbox\":/\\bfancytree(-custom)?-icon\\b/.test(t)?n.type=\"icon\":/\\bfancytree-node\\b/.test(t)?n.type=\"title\":e&&e.target&&((e=C(e.target)).is(\"ul[role=group]\")?((n.node&&n.node.tree||h).debug(\"Ignoring click on outer UL.\"),n.node=null):e.closest(\".fancytree-title\").length?n.type=\"title\":e.closest(\".fancytree-checkbox\").length?n.type=\"checkbox\":e.closest(\".fancytree-expander\").length&&(n.type=\"expander\")),n},getEventTargetType:function(e){return this.getEventTarget(e).type},getNode:function(e){if(e instanceof j)return e;for(e instanceof C?e=e[0]:void 0!==e.originalEvent&&(e=e.target);e;){if(e.ftnode)return e.ftnode;e=e.parentNode}return null},getTree:function(e){var t=e;return e instanceof F?e:(\"number\"==typeof(e=void 0===e?0:e)?e=C(\".fancytree-container\").eq(e):\"string\"==typeof e?(e=C(\"#ft-id-\"+t).eq(0)).length||(e=C(t).eq(0)):e instanceof Element||e instanceof HTMLDocument?e=C(e):e instanceof C?e=e.eq(0):void 0!==e.originalEvent&&(e=C(e.target)),(e=(e=e.closest(\":ui-fancytree\")).data(\"ui-fancytree\")||e.data(\"fancytree\"))?e.tree:null)},evalOption:function(e,t,n,i,r){var o,s=t.tree,i=i[e],n=n[e];return N(i)?(o={node:t,tree:s,widget:s.widget,options:s.widget.options,typeInfo:s.types[t.type]||{}},null==(o=i.call(s,{type:e},o))&&(o=n)):o=null==n?i:n,o=null==o?r:o},setSpanIcon:function(e,t,n){var i=C(e);\"string\"==typeof n?i.attr(\"class\",t+\" \"+n):(n.text?i.text(\"\"+n.text):n.html&&(e.innerHTML=n.html),i.attr(\"class\",t+\" \"+(n.addClass||\"\")))},eventToString:function(e){var t=e.which,n=e.type,i=[];return e.altKey&&i.push(\"alt\"),e.ctrlKey&&i.push(\"ctrl\"),e.metaKey&&i.push(\"meta\"),e.shiftKey&&i.push(\"shift\"),\"click\"===n||\"dblclick\"===n?i.push(o[e.button]+n):\"wheel\"===n?i.push(n):r[t]||i.push(u[t]||String.fromCharCode(t).toLowerCase()),i.join(\"+\")},info:function(e){3<=C.ui.fancytree.debugLevel&&d(\"info\",arguments)},keyEventToString:function(e){return this.warn(\"keyEventToString() is deprecated: use eventToString()\"),this.eventToString(e)},overrideMethod:function(e,t,n,i){var r,o=e[t]||C.noop;e[t]=function(){var e=i||this;try{return r=e._super,e._super=o,n.apply(e,arguments)}finally{e._super=r}}},parseHtml:function(s){var a,l,d,c,u,h,f,p,e=s.find(\">li\"),g=[];return e.each(function(){var e,t,n=C(this),i=n.find(\">span\",this).first(),r=i.length?null:n.find(\">a\").first(),o={tooltip:null,data:{}};for(i.length?o.title=i.html():r&&r.length?(o.title=r.html(),o.data.href=r.attr(\"href\"),o.data.target=r.attr(\"target\"),o.tooltip=r.attr(\"title\")):(o.title=n.html(),0<=(u=o.title.search(/<ul/i))&&(o.title=o.title.substring(0,u))),o.title=S(o.title),c=0,h=y.length;c<h;c++)o[y[c]]=void 0;for(a=this.className.split(\" \"),d=[],c=0,h=a.length;c<h;c++)l=a[c],v[l]?o[l]=!0:d.push(l);if(o.extraClasses=d.join(\" \"),(f=n.attr(\"title\"))&&(o.tooltip=f),(f=n.attr(\"id\"))&&(o.key=f),n.attr(\"hideCheckbox\")&&(o.checkbox=!1),(e=P(n))&&!C.isEmptyObject(e)){for(t in x)w(e,t)&&(e[x[t]]=e[t],delete e[t]);for(c=0,h=b.length;c<h;c++)f=b[c],null!=(p=e[f])&&(delete e[f],o[f]=p);C.extend(o.data,e)}(s=n.find(\">ul\").first()).length?o.children=C.ui.fancytree.parseHtml(s):o.children=o.lazy?void 0:null,g.push(o)}),g},registerExtension:function(e){k(null!=e.name,\"extensions must have a `name` property.\"),k(null!=e.version,\"extensions must have a `version` property.\"),C.ui.fancytree._extensions[e.name]=e},trim:S,unescapeHtml:function(e){var t=document.createElement(\"div\");return t.innerHTML=e,0===t.childNodes.length?\"\":t.childNodes[0].nodeValue},warn:function(e){2<=C.ui.fancytree.debugLevel&&d(\"warn\",arguments)}}),C.ui.fancytree}function k(e,t){e||(C.ui.fancytree.error(t=\"Fancytree assertion failed\"+(t=t?\": \"+t:\"\")),C.error(t))}function w(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function N(e){return\"function\"==typeof e}function S(e){return null==e?\"\":e.trim()}function d(t,n){var i,r,t=window.console?window.console[t]:null;if(t)try{t.apply(window.console,n)}catch(e){for(r=\"\",i=0;i<n.length;i++)r+=n[i];t(r)}}function E(e,i,t,n,r){var o,s,a;function l(){return o.apply(i,arguments)}function d(e){return o.apply(i,e)}return o=i[e],s=n[e],a=i.ext[r],function(){var e=i._local,t=i._super,n=i._superApply;try{return i._local=a,i._super=l,i._superApply=d,s.apply(i,arguments)}finally{i._local=e,i._super=t,i._superApply=n}}}function T(e,t){return(void 0===e?C.Deferred(function(){this.resolve()}):C.Deferred(function(){this.resolveWith(e,t)})).promise()}function A(e,t){return(void 0===e?C.Deferred(function(){this.reject()}):C.Deferred(function(){this.rejectWith(e,t)})).promise()}function O(e,t){return function(){e.resolveWith(t)}}function P(e){var t=C.extend({},e.data()),e=t.json;return delete t.fancytree,delete t.uiFancytree,e&&(delete t.json,t=C.extend(t,e)),t}function D(e){return(\"\"+e).replace(n,function(e){return i[e]})}function L(t){return t=t.toLowerCase(),function(e){return 0<=e.title.toLowerCase().indexOf(t)}}function j(e,t){var n,i,r;for(this.parent=e,this.tree=e.tree,this.ul=null,this.li=null,this.statusNodeType=null,this._isLoading=!1,this._error=null,this.data={},n=0,i=b.length;n<i;n++)this[r=b[n]]=t[r];for(r in null==this.unselectableIgnore&&null==this.unselectableStatus||(this.unselectable=!0),t.hideCheckbox&&C.error(\"'hideCheckbox' node option was removed in v2.23.0: use 'checkbox: false'\"),t.data&&C.extend(this.data,t.data),t)s[r]||!this.tree.options.copyFunctionsToData&&N(t[r])||a[r]||(this.data[r]=t[r]);null==this.key?this.tree.options.defaultKey?(this.key=\"\"+this.tree.options.defaultKey(this),k(this.key,\"defaultKey() must return a unique key\")):this.key=\"_\"+h._nextNodeKey++:this.key=\"\"+this.key,t.active&&(k(null===this.tree.activeNode,\"only one active node allowed\"),this.tree.activeNode=this),t.selected&&(this.tree.lastSelectedNode=this),(e=t.children)?e.length?this._setChildren(e):this.children=this.lazy?[]:null:this.children=null,this.tree._callHook(\"treeRegisterNode\",this.tree,!0,this)}function F(e){this.widget=e,this.$div=e.element,this.options=e.options,this.options&&(void 0!==this.options.lazyload&&C.error(\"The 'lazyload' event is deprecated since 2014-02-25. Use 'lazyLoad' (with uppercase L) instead.\"),void 0!==this.options.loaderror&&C.error(\"The 'loaderror' event was renamed since 2014-07-03. Use 'loadError' (with uppercase E) instead.\"),void 0!==this.options.fx&&C.error(\"The 'fx' option was replaced by 'toggleEffect' since 2014-11-30.\"),void 0!==this.options.removeNode&&C.error(\"The 'removeNode' event was replaced by 'modifyChild' since 2.20 (2016-09-10).\")),this.ext={},this.types={},this.columns={},this.data=P(this.$div),this._id=\"\"+(this.options.treeId||C.ui.fancytree._nextId++),this._ns=\".fancytree-\"+this._id,this.activeNode=null,this.focusNode=null,this._hasFocus=null,this._tempCache={},this._lastMousedownNode=null,this._enableUpdate=!0,this.lastSelectedNode=null,this.systemFocusElement=null,this.lastQuicksearchTerm=\"\",this.lastQuicksearchTime=0,this.viewport=null,this.statusClassPropName=\"span\",this.ariaPropName=\"li\",this.nodeContainerAttrName=\"li\",this.$div.find(\">ul.fancytree-container\").remove(),this.rootNode=new j({tree:this},{title:\"root\",key:\"root_\"+this._id,children:null,expanded:!0}),this.rootNode.parent=null,e=C(\"<ul>\",{id:\"ft-id-\"+this._id,class:\"ui-fancytree fancytree-container fancytree-plain\"}).appendTo(this.$div),this.$container=e,this.rootNode.ul=e[0],null==this.options.debugLevel&&(this.options.debugLevel=h.debugLevel)}C.ui.fancytree.warn(\"Fancytree: ignored duplicate include\")},\"function\"==typeof define&&define.amd?define([\"jquery\",\"./jquery.fancytree.ui-deps\"],t):\"object\"==typeof module&&module.exports?(require(\"./jquery.fancytree.ui-deps\"),module.exports=t(require(\"jquery\"))):t(jQuery),t=function(o){\"use strict\";return o.ui.fancytree._FancytreeClass.prototype.countSelected=function(e){this.options;return this.getSelectedNodes(e).length},o.ui.fancytree._FancytreeNodeClass.prototype.updateCounters=function(){var e=this,t=o(\"span.fancytree-childcounter\",e.span),n=e.tree.options.childcounter,i=e.countChildren(n.deep);!(e.data.childCounter=i)&&n.hideZeros||e.isExpanded()&&n.hideExpanded?t.remove():(t=!t.length?o(\"<span class='fancytree-childcounter'/>\").appendTo(o(\"span.fancytree-icon,span.fancytree-custom-icon\",e.span)):t).text(i),!n.deep||e.isTopLevel()||e.isRootNode()||e.parent.updateCounters()},o.ui.fancytree.prototype.widgetMethod1=function(e){this.tree;return e},o.ui.fancytree.registerExtension({name:\"childcounter\",version:\"2.38.3\",options:{deep:!0,hideZeros:!0,hideExpanded:!1},foo:42,_appendCounter:function(e){},treeInit:function(e){e.options,e.options.childcounter;this._superApply(arguments),this.$container.addClass(\"fancytree-ext-childcounter\")},treeDestroy:function(e){this._superApply(arguments)},nodeRenderTitle:function(e,t){var n=e.node,i=e.options.childcounter,r=null==n.data.childCounter?n.countChildren(i.deep):+n.data.childCounter;this._super(e,t),!r&&i.hideZeros||n.isExpanded()&&i.hideExpanded||o(\"span.fancytree-icon,span.fancytree-custom-icon\",n.span).append(o(\"<span class='fancytree-childcounter'/>\").text(r))},nodeSetExpanded:function(e,t,n){var i=e.tree;e.node;return this._superApply(arguments).always(function(){i.nodeRenderTitle(e)})}}),o.ui.fancytree},\"function\"==typeof define&&define.amd?define([\"jquery\",\"./jquery.fancytree\"],t):\"object\"==typeof module&&module.exports?(require(\"./jquery.fancytree\"),module.exports=t(require(\"jquery\"))):t(jQuery),t=function(c){\"use strict\";var u=c.ui.fancytree.assert;function n(e,t,n){for(var i,r,o=3&e.length,s=e.length-o,a=n,l=3432918353,d=461845907,c=0;c<s;)r=255&e.charCodeAt(c)|(255&e.charCodeAt(++c))<<8|(255&e.charCodeAt(++c))<<16|(255&e.charCodeAt(++c))<<24,++c,a=27492+(65535&(i=5*(65535&(a=(a^=r=(65535&(r=(r=(65535&r)*l+(((r>>>16)*l&65535)<<16)&4294967295)<<15|r>>>17))*d+(((r>>>16)*d&65535)<<16)&4294967295)<<13|a>>>19))+((5*(a>>>16)&65535)<<16)&4294967295))+((58964+(i>>>16)&65535)<<16);switch(r=0,o){case 3:r^=(255&e.charCodeAt(c+2))<<16;case 2:r^=(255&e.charCodeAt(c+1))<<8;case 1:a^=r=(65535&(r=(r=(65535&(r^=255&e.charCodeAt(c)))*l+(((r>>>16)*l&65535)<<16)&4294967295)<<15|r>>>17))*d+(((r>>>16)*d&65535)<<16)&4294967295}return a^=e.length,a=2246822507*(65535&(a^=a>>>16))+((2246822507*(a>>>16)&65535)<<16)&4294967295,a=3266489909*(65535&(a^=a>>>13))+((3266489909*(a>>>16)&65535)<<16)&4294967295,a^=a>>>16,t?(\"0000000\"+(a>>>0).toString(16)).substr(-8):a>>>0}return c.ui.fancytree._FancytreeNodeClass.prototype.getCloneList=function(e){var t,n=this.tree,i=n.refMap[this.refKey]||null,r=n.keyMap;return i&&(t=this.key,e?i=c.map(i,function(e){return r[e]}):(i=c.map(i,function(e){return e===t?null:r[e]})).length<1&&(i=null)),i},c.ui.fancytree._FancytreeNodeClass.prototype.isClone=function(){var e=this.refKey||null,e=e&&this.tree.refMap[e]||null;return!!(e&&1<e.length)},c.ui.fancytree._FancytreeNodeClass.prototype.reRegister=function(t,e){e=null==e?null:\"\"+e;var n=this.tree,i=this.key,r=this.refKey,o=n.keyMap,s=n.refMap,a=s[r]||null,n=!1;return null!=(t=null==t?null:\"\"+t)&&t!==this.key&&(o[t]&&c.error(\"[ext-clones] reRegister(\"+t+\"): already exists: \"+this),delete o[i],o[t]=this,a&&(s[r]=c.map(a,function(e){return e===i?t:e})),this.key=t,n=!0),null!=e&&e!==this.refKey&&(a&&(1===a.length?delete s[r]:s[r]=c.map(a,function(e){return e===i?null:e})),s[e]?s[e].append(t):s[e]=[this.key],this.refKey=e,n=!0),n},c.ui.fancytree._FancytreeNodeClass.prototype.setRefKey=function(e){return this.reRegister(null,e)},c.ui.fancytree._FancytreeClass.prototype.getNodesByRef=function(e,t){var n=this.keyMap,e=this.refMap[e]||null;return e=e&&(e=t?c.map(e,function(e){e=n[e];return e.isDescendantOf(t)?e:null}):c.map(e,function(e){return n[e]})).length<1?null:e},c.ui.fancytree._FancytreeClass.prototype.changeRefKey=function(e,t){var n,i=this.keyMap,r=this.refMap[e]||null;if(r){for(n=0;n<r.length;n++)i[r[n]].refKey=t;delete this.refMap[e],this.refMap[t]=r}},c.ui.fancytree.registerExtension({name:\"clones\",version:\"2.38.3\",options:{highlightActiveClones:!0,highlightClones:!1},treeCreate:function(e){this._superApply(arguments),e.tree.refMap={},e.tree.keyMap={}},treeInit:function(e){this.$container.addClass(\"fancytree-ext-clones\"),u(null==e.options.defaultKey),e.options.defaultKey=function(e){return t=e,\"id_\"+(t=n(e=(e=c.map(e.getParentList(!1,!0),function(e){return e.refKey||e.key})).join(\"/\"),!0))+n(t+e,!0);var t},this._superApply(arguments)},treeClear:function(e){return e.tree.refMap={},e.tree.keyMap={},this._superApply(arguments)},treeRegisterNode:function(e,t,n){var i,r,o=e.tree,s=o.keyMap,a=o.refMap,l=n.key,d=n&&null!=n.refKey?\"\"+n.refKey:null;return n.isStatusNode()||(t?(null!=s[n.key]&&(r=s[n.key],r=\"clones.treeRegisterNode: duplicate key '\"+n.key+\"': /\"+n.getPath(!0)+\" => \"+r.getPath(!0),o.error(r),c.error(r)),s[l]=n,d&&((i=a[d])?(i.push(l),2===i.length&&e.options.clones.highlightClones&&s[i[0]].renderStatus()):a[d]=[l])):(null==s[l]&&c.error(\"clones.treeRegisterNode: node.key not registered: \"+n.key),delete s[l],d&&(i=a[d])&&((r=i.length)<=1?(u(1===r),u(i[0]===l),delete a[d]):(function(e,t){for(var n=e.length-1;0<=n;n--)if(e[n]===t)return e.splice(n,1)}(i,l),2===r&&e.options.clones.highlightClones&&s[i[0]].renderStatus())))),this._super(e,t,n)},nodeRenderStatus:function(e){var t,n=e.node,i=this._super(e);return e.options.clones.highlightClones&&(t=c(n[e.tree.statusClassPropName])).length&&n.isClone()&&t.addClass(\"fancytree-clone\"),i},nodeSetActive:function(e,n,t){var i=e.tree.statusClassPropName,r=e.node,o=this._superApply(arguments);return e.options.clones.highlightActiveClones&&r.isClone()&&c.each(r.getCloneList(!0),function(e,t){c(t[i]).toggleClass(\"fancytree-active-clone\",!1!==n)}),o}}),c.ui.fancytree},\"function\"==typeof define&&define.amd?define([\"jquery\",\"./jquery.fancytree\"],t):\"object\"==typeof module&&module.exports?(require(\"./jquery.fancytree\"),module.exports=t(require(\"jquery\"))):t(jQuery),t=function(f){\"use strict\";var a,l,p=f.ui.fancytree,o=/Mac/.test(navigator.platform),d=\"fancytree-drag-source\",c=\"fancytree-drag-remove\",g=\"fancytree-drop-accept\",y=\"fancytree-drop-after\",v=\"fancytree-drop-before\",m=\"fancytree-drop-over\",b=\"fancytree-drop-reject\",x=\"fancytree-drop-target\",u=\"application/x-fancytree-node\",C=null,h=null,_=null,k=null,w=null,s=null,N=null,S=null,E=null,T=null;function A(){_=h=s=S=N=T=w=null,k&&k.removeClass(d+\" \"+c),k=null,C&&C.hide(),l&&(l.remove(),l=null)}function O(e){return 0===e?\"\":0<e?\"+\"+e:\"\"+e}function P(e,t){var n,i=t.tree,r=t.dataTransfer;\"dragstart\"===e.type?(t.effectAllowed=i.options.dnd5.effectAllowed,t.dropEffect=i.options.dnd5.dropEffectDefault):(t.effectAllowed=S,t.dropEffect=N),t.dropEffectSuggested=(n=e,i=(e=i).options.dnd5.dropEffectDefault,o?n.metaKey&&n.altKey||n.ctrlKey?i=\"link\":n.metaKey?i=\"move\":n.altKey&&(i=\"copy\"):n.ctrlKey?i=\"copy\":n.shiftKey?i=\"move\":n.altKey&&(i=\"link\"),i!==s&&e.info(\"evalEffectModifiers: \"+n.type+\" - evalEffectModifiers(): \"+s+\" -> \"+i),s=i),t.isMove=\"move\"===t.dropEffect,t.files=r.files||[]}function D(e,t,n){var i=t.tree,r=t.dataTransfer;return\"dragstart\"!==e.type&&S!==t.effectAllowed&&i.warn(\"effectAllowed should only be changed in dragstart event: \"+e.type+\": data.effectAllowed changed from \"+S+\" -> \"+t.effectAllowed),!1===n&&(i.info(\"applyDropEffectCallback: allowDrop === false\"),t.effectAllowed=\"none\",t.dropEffect=\"none\"),t.isMove=\"move\"===t.dropEffect,\"dragstart\"===e.type&&(S=t.effectAllowed,N=t.dropEffect),r.effectAllowed=S,r.dropEffect=N}function L(e,t){if(t.options.dnd5.scroll&&(h=t.tree,s=e,r=h.options.dnd5,o=h.$scrollParent[0],l=r.scrollSensitivity,u=r.scrollSpeed,i=0,o!==document&&\"HTML\"!==o.tagName?(r=h.$scrollParent.offset(),d=o.scrollTop,r.top+o.offsetHeight-s.pageY<l?0<o.scrollHeight-h.$scrollParent.innerHeight()-d&&(o.scrollTop=i=d+u):0<d&&s.pageY-r.top<l&&(o.scrollTop=i=d-u)):0<(d=f(document).scrollTop())&&s.pageY-d<l?(i=d-u,f(document).scrollTop(i)):f(window).height()-(s.pageY-d)<l&&(i=d+u,f(document).scrollTop(i)),i&&h.debug(\"autoScroll: \"+i+\"px\")),!t.node)return t.tree.warn(\"Ignored dragover for non-node\"),E;var n,i,r=null,o=t.tree,s=o.options,a=s.dnd5,l=t.node,d=t.otherNode,c=\"center\",u=f(l.span),h=u.find(\"span.fancytree-title\");if(!1===w)return o.debug(\"Ignored dragover, since dragenter returned false.\"),!1;if(\"string\"==typeof w&&f.error(\"assert failed: dragenter returned string\"),i=u.offset(),u=(e.pageY-i.top)/u.height(),void 0===e.pageY&&o.warn(\"event.pageY is undefined: see issue #1013.\"),w.after&&.75<u||!w.over&&w.after&&.5<u?r=\"after\":w.before&&u<=.25||!w.over&&w.before&&u<=.5?r=\"before\":w.over&&(r=\"over\"),a.preventVoidMoves&&\"move\"===t.dropEffect&&(l===d?(l.debug(\"Drop over source node prevented.\"),r=null):\"before\"===r&&d&&l===d.getNextSibling()?(l.debug(\"Drop after source node prevented.\"),r=null):\"after\"===r&&d&&l===d.getPrevSibling()?(l.debug(\"Drop before source node prevented.\"),r=null):\"over\"===r&&d&&d.parent===l&&d.isLastSibling()&&(l.debug(\"Drop last child over own parent prevented.\"),r=null)),(t.hitMode=r)&&a.dragOver&&(P(e,t),a.dragOver(l,t),D(e,t,!!r),r=t.hitMode),\"after\"===(E=r)||\"before\"===r||\"over\"===r){switch(n=a.dropMarkerOffsetX||0,r){case\"before\":c=\"top\",n+=a.dropMarkerInsertOffsetX||0;break;case\"after\":c=\"bottom\",n+=a.dropMarkerInsertOffsetX||0}h={my:\"left\"+O(n)+\" center\",at:\"left \"+c,of:h},s.rtl&&(h.my=\"right\"+O(-n)+\" center\",h.at=\"right \"+c),C.toggleClass(y,\"after\"===r).toggleClass(m,\"over\"===r).toggleClass(v,\"before\"===r).show().position(p.fixPositionOptions(h))}else C.hide();return f(l.span).toggleClass(x,\"after\"===r||\"before\"===r||\"over\"===r).toggleClass(y,\"after\"===r).toggleClass(v,\"before\"===r).toggleClass(g,\"over\"===r).toggleClass(b,!1===r),r}function j(e){var t,n=this,i=n.options.dnd5,r=null,o=p.getNode(e),s=e.dataTransfer||e.originalEvent.dataTransfer,a={tree:n,node:o,options:n.options,originalEvent:e.originalEvent,widget:n.widget,hitMode:w,dataTransfer:s,otherNode:h||null,otherNodeList:_||null,otherNodeData:null,useDefaultImage:!0,dropEffect:void 0,dropEffectSuggested:void 0,effectAllowed:void 0,files:null,isCancelled:void 0,isMove:void 0};switch(e.type){case\"dragenter\":if(T=null,!o){n.debug(\"Ignore non-node \"+e.type+\": \"+e.target.tagName+\".\"+e.target.className),w=!1;break}if(f(o.span).addClass(m).removeClass(g+\" \"+b),t=0<=f.inArray(u,s.types),i.preventNonNodes&&!t){o.debug(\"Reject dropping a non-node.\"),w=!1;break}if(i.preventForeignNodes&&(!h||h.tree!==o.tree)){o.debug(\"Reject dropping a foreign node.\"),w=!1;break}if(i.preventSameParent&&a.otherNode&&a.otherNode.tree===o.tree&&o.parent===a.otherNode.parent){o.debug(\"Reject dropping as sibling (same parent).\"),w=!1;break}if(i.preventRecursion&&a.otherNode&&a.otherNode.tree===o.tree&&o.isDescendantOf(a.otherNode)){o.debug(\"Reject dropping below own ancestor.\"),w=!1;break}if(i.preventLazyParents&&!o.isLoaded()){o.warn(\"Drop over unloaded target node prevented.\"),w=!1;break}C.show(),P(e,a),t=i.dragEnter(o,a),t=!!(t=t)&&(t=f.isPlainObject(t)?{over:!!t.over,before:!!t.before,after:!!t.after}:Array.isArray(t)?{over:0<=f.inArray(\"over\",t),before:0<=f.inArray(\"before\",t),after:0<=f.inArray(\"after\",t)}:{over:!0===t||\"over\"===t,before:!0===t||\"before\"===t,after:!0===t||\"after\"===t},0!==Object.keys(t).length&&t),D(e,a,r=(w=t)&&(t.over||t.before||t.after));break;case\"dragover\":if(!o){n.debug(\"Ignore non-node \"+e.type+\": \"+e.target.tagName+\".\"+e.target.className);break}P(e,a),r=!!(E=L(e,a)),(\"over\"===E||!1===E)&&!o.expanded&&!1!==o.hasChildren()?T?!(i.autoExpandMS&&Date.now()-T>i.autoExpandMS)||o.isLoading()||i.dragExpand&&!1===i.dragExpand(o,a)||o.setExpanded():T=Date.now():T=null;break;case\"dragleave\":if(!o){n.debug(\"Ignore non-node \"+e.type+\": \"+e.target.tagName+\".\"+e.target.className);break}if(!f(o.span).hasClass(m)){o.debug(\"Ignore dragleave (multi).\");break}f(o.span).removeClass(m+\" \"+g+\" \"+b),o.scheduleAction(\"cancel\"),i.dragLeave(o,a),C.hide();break;case\"drop\":if(0<=f.inArray(u,s.types)&&(d=s.getData(u),n.info(e.type+\": getData('application/x-fancytree-node'): '\"+d+\"'\")),d||(d=s.getData(\"text\"),n.info(e.type+\": getData('text'): '\"+d+\"'\")),d)try{void 0!==(l=JSON.parse(d)).title&&(a.otherNodeData=l)}catch(e){}n.debug(e.type+\": nodeData: '\"+d+\"', otherNodeData: \",a.otherNodeData),f(o.span).removeClass(m+\" \"+g+\" \"+b),a.hitMode=E,P(e,a),a.isCancelled=!E;var l=h&&h.span,d=h&&h.tree;i.dragDrop(o,a),e.preventDefault(),l&&!document.body.contains(l)&&(d===n?(n.debug(\"Drop handler removed source element: generating dragEnd.\"),i.dragEnd(h,a)):n.warn(\"Drop handler removed source element: dragend event may be lost.\")),A()}if(r)return e.preventDefault(),!1}return f.ui.fancytree.getDragNodeList=function(){return _||[]},f.ui.fancytree.getDragNode=function(){return h},f.ui.fancytree.registerExtension({name:\"dnd5\",version:\"2.38.3\",options:{autoExpandMS:1500,dropMarkerInsertOffsetX:-16,dropMarkerOffsetX:-24,dropMarkerParent:\"body\",multiSource:!1,effectAllowed:\"all\",dropEffectDefault:\"move\",preventForeignNodes:!1,preventLazyParents:!0,preventNonNodes:!1,preventRecursion:!0,preventSameParent:!1,preventVoidMoves:!0,scroll:!0,scrollSensitivity:20,scrollSpeed:5,setTextTypeJson:!1,sourceCopyHook:null,dragStart:null,dragDrag:f.noop,dragEnd:f.noop,dragEnter:null,dragOver:f.noop,dragExpand:f.noop,dragDrop:f.noop,dragLeave:f.noop},treeInit:function(e){var t=e.tree,n=e.options,i=n.glyph||null,r=n.dnd5;0<=f.inArray(\"dnd\",n.extensions)&&f.error(\"Extensions 'dnd' and 'dnd5' are mutually exclusive.\"),r.dragStop&&f.error(\"dragStop is not used by ext-dnd5. Use dragEnd instead.\"),null!=r.preventRecursiveMoves&&f.error(\"preventRecursiveMoves was renamed to preventRecursion.\"),r.dragStart&&p.overrideMethod(e.options,\"createNode\",function(e,t){this._super.apply(this,arguments),t.node.span?t.node.span.draggable=!0:t.node.warn(\"Cannot add `draggable`: no span tag\")}),this._superApply(arguments),this.$container.addClass(\"fancytree-ext-dnd5\"),e=f(\"<span>\").appendTo(this.$container),this.$scrollParent=e.scrollParent(),e.remove(),(C=f(\"#fancytree-drop-marker\")).length||(C=f(\"<div id='fancytree-drop-marker'></div>\").hide().css({\"z-index\":1e3,\"pointer-events\":\"none\"}).prependTo(r.dropMarkerParent),i&&p.setSpanIcon(C[0],i.map._addClass,i.map.dropMarker)),C.toggleClass(\"fancytree-rtl\",!!n.rtl),r.dragStart&&t.$container.on(\"dragstart drag dragend\",function(e){var t=this,n=t.options.dnd5,i=p.getNode(e),r=e.dataTransfer||e.originalEvent.dataTransfer,o={tree:t,node:i,options:t.options,originalEvent:e.originalEvent,widget:t.widget,dataTransfer:r,useDefaultImage:!0,dropEffect:void 0,dropEffectSuggested:void 0,effectAllowed:void 0,files:void 0,isCancelled:void 0,isMove:void 0};switch(e.type){case\"dragstart\":if(!i)return t.info(\"Ignored dragstart on a non-node.\"),!1;h=i,_=!1===n.multiSource?[i]:!0===n.multiSource?i.isSelected()?t.getSelectedNodes():[i]:n.multiSource(i,o),(k=f(f.map(_,function(e){return e.span}))).addClass(d);var s=i.toDict(!0,n.sourceCopyHook);s.treeId=i.tree._id,s=JSON.stringify(s);try{r.setData(u,s),r.setData(\"text/html\",f(i.span).html()),r.setData(\"text/plain\",i.title)}catch(e){t.warn(\"Could not set data (IE only accepts 'text') - \"+e)}return(n.setTextTypeJson?r.setData(\"text\",s):r.setData(\"text\",i.title),P(e,o),!1===n.dragStart(i,o))?(A(),!1):(D(e,o),l=null,o.useDefaultImage&&(a=f(i.span).find(\".fancytree-title\"),_&&1<_.length&&(l=f(\"<span class='fancytree-childcounter'/>\").text(\"+\"+(_.length-1)).appendTo(a)),r.setDragImage&&r.setDragImage(a[0],-10,-10)),!0);case\"drag\":P(e,o),n.dragDrag(i,o),D(e,o),k.toggleClass(c,o.isMove);break;case\"dragend\":P(e,o),A(),o.isCancelled=!E,n.dragEnd(i,o,!E)}}.bind(t)),r.dragEnter&&t.$container.on(\"dragenter dragover dragleave drop\",j.bind(t))}}),f.ui.fancytree},\"function\"==typeof define&&define.amd?define([\"jquery\",\"./jquery.fancytree\"],t):\"object\"==typeof module&&module.exports?(require(\"./jquery.fancytree\"),module.exports=t(require(\"jquery\"))):t(jQuery),t=function(d){\"use strict\";var t=/Mac/.test(navigator.platform),c=d.ui.fancytree.escapeHtml,u=d.ui.fancytree.trim,a=d.ui.fancytree.unescapeHtml;return d.ui.fancytree._FancytreeNodeClass.prototype.editStart=function(){var t,n=this,e=this.tree,i=e.ext.edit,r=e.options.edit,o=d(\".fancytree-title\",n.span),s={node:n,tree:e,options:e.options,isNew:d(n[e.statusClassPropName]).hasClass(\"fancytree-edit-new\"),orgTitle:n.title,input:null,dirty:!1};if(!1===r.beforeEdit.call(n,{type:\"beforeEdit\"},s))return!1;d.ui.fancytree.assert(!i.currentNode,\"recursive edit\"),i.currentNode=this,i.eventData=s,e.widget._unbind(),i.lastDraggableAttrValue=n.span.draggable,i.lastDraggableAttrValue&&(n.span.draggable=!1),d(document).on(\"mousedown.fancytree-edit\",function(e){d(e.target).hasClass(\"fancytree-edit-input\")||n.editEnd(!0,e)}),t=d(\"<input />\",{class:\"fancytree-edit-input\",type:\"text\",value:e.options.escapeTitles?s.orgTitle:a(s.orgTitle)}),i.eventData.input=t,null!=r.adjustWidthOfs&&t.width(o.width()+r.adjustWidthOfs),null!=r.inputCss&&t.css(r.inputCss),o.html(t),t.focus().change(function(e){t.addClass(\"fancytree-edit-dirty\")}).on(\"keydown\",function(e){switch(e.which){case d.ui.keyCode.ESCAPE:n.editEnd(!1,e);break;case d.ui.keyCode.ENTER:return n.editEnd(!0,e),!1}e.stopPropagation()}).blur(function(e){return n.editEnd(!0,e)}),r.edit.call(n,{type:\"edit\"},s)},d.ui.fancytree._FancytreeNodeClass.prototype.editEnd=function(e,t){var n,i=this,r=this.tree,o=r.ext.edit,s=o.eventData,a=r.options.edit,l=d(\".fancytree-title\",i.span).find(\"input.fancytree-edit-input\");return a.trim&&l.val(u(l.val())),n=l.val(),s.dirty=n!==i.title,s.originalEvent=t,!1===e?s.save=!1:s.isNew?s.save=\"\"!==n:s.save=s.dirty&&\"\"!==n,!1!==a.beforeClose.call(i,{type:\"beforeClose\"},s)&&((!s.save||!1!==a.save.call(i,{type:\"save\"},s))&&(l.removeClass(\"fancytree-edit-dirty\").off(),d(document).off(\".fancytree-edit\"),s.save?(i.setTitle(r.options.escapeTitles?n:c(n)),i.setFocus()):s.isNew?(i.remove(),i=s.node=null,o.relatedNode.setFocus()):(i.renderTitle(),i.setFocus()),o.eventData=null,o.currentNode=null,o.relatedNode=null,r.widget._bind(),i&&o.lastDraggableAttrValue&&(i.span.draggable=!0),r.$container.get(0).focus({preventScroll:!0}),s.input=null,a.close.call(i,{type:\"close\"},s),!0))},d.ui.fancytree._FancytreeNodeClass.prototype.editCreateNode=function(e,t){var n,i=this.tree,r=this;e=e||\"child\",null==t?t={title:\"\"}:\"string\"==typeof t?t={title:t}:d.ui.fancytree.assert(d.isPlainObject(t)),\"child\"!==e||this.isExpanded()||!1===this.hasChildren()?((n=this.addNode(t,e)).match=!0,d(n[i.statusClassPropName]).removeClass(\"fancytree-hide\").addClass(\"fancytree-match\"),n.makeVisible().done(function(){d(n[i.statusClassPropName]).addClass(\"fancytree-edit-new\"),r.tree.ext.edit.relatedNode=r,n.editStart()})):this.setExpanded().done(function(){r.editCreateNode(e,t)})},d.ui.fancytree._FancytreeClass.prototype.isEditing=function(){return this.ext.edit?this.ext.edit.currentNode:null},d.ui.fancytree._FancytreeNodeClass.prototype.isEditing=function(){return!!this.tree.ext.edit&&this.tree.ext.edit.currentNode===this},d.ui.fancytree.registerExtension({name:\"edit\",version:\"2.38.3\",options:{adjustWidthOfs:4,allowEmpty:!1,inputCss:{minWidth:\"3em\"},triggerStart:[\"f2\",\"mac+enter\",\"shift+click\"],trim:!0,beforeClose:d.noop,beforeEdit:d.noop,close:d.noop,edit:d.noop,save:d.noop},currentNode:null,treeInit:function(e){var i=e.tree;this._superApply(arguments),this.$container.addClass(\"fancytree-ext-edit\").on(\"fancytreebeforeupdateviewport\",function(e,t){var n=i.isEditing();n&&(n.info(\"Cancel edit due to scroll event.\"),n.editEnd(!1,e))})},nodeClick:function(e){var t=d.ui.fancytree.eventToString(e.originalEvent),n=e.options.edit.triggerStart;return\"shift+click\"===t&&0<=d.inArray(\"shift+click\",n)&&e.originalEvent.shiftKey||\"click\"===t&&0<=d.inArray(\"clickActive\",n)&&e.node.isActive()&&!e.node.isEditing()&&d(e.originalEvent.target).hasClass(\"fancytree-title\")?(e.node.editStart(),!1):this._superApply(arguments)},nodeDblclick:function(e){return 0<=d.inArray(\"dblclick\",e.options.edit.triggerStart)?(e.node.editStart(),!1):this._superApply(arguments)},nodeKeydown:function(e){switch(e.originalEvent.which){case 113:if(0<=d.inArray(\"f2\",e.options.edit.triggerStart))return e.node.editStart(),!1;break;case d.ui.keyCode.ENTER:if(0<=d.inArray(\"mac+enter\",e.options.edit.triggerStart)&&t)return e.node.editStart(),!1}return this._superApply(arguments)}}),d.ui.fancytree},\"function\"==typeof define&&define.amd?define([\"jquery\",\"./jquery.fancytree\"],t):\"object\"==typeof module&&module.exports?(require(\"./jquery.fancytree\"),module.exports=t(require(\"jquery\"))):t(jQuery),t=function(y){\"use strict\";var v=\"__not_found__\",m=y.ui.fancytree.escapeHtml;function b(e){return(e+\"\").replace(/([.?*+^$[\\]\\\\(){}|-])/g,\"\\\\$1\")}function x(e,t,n){for(var i=[],r=1;r<t.length;r++){var o=t[r].length+(1===r?0:1)+(i[i.length-1]||0);i.push(o)}var s=e.split(\"\");return n?i.forEach(function(e){s[e]=\"\\ufff7\"+s[e]+\"\\ufff8\"}):i.forEach(function(e){s[e]=\"<mark>\"+s[e]+\"</mark>\"}),s.join(\"\")}return y.ui.fancytree._FancytreeClass.prototype._applyFilterImpl=function(i,r,e){var t,o,s,a,l,d,c=0,n=this.options,u=n.escapeTitles,h=n.autoCollapse,f=y.extend({},n.filter,e),p=\"hide\"===f.mode,g=!!f.leavesOnly&&!r;if(\"string\"==typeof i){if(\"\"===i)return this.warn(\"Fancytree passing an empty string as a filter is handled as clearFilter().\"),void this.clearFilter();t=f.fuzzy?i.split(\"\").map(b).reduce(function(e,t){return e+\"([^\"+t+\"]*)\"+t},\"\"):b(i),o=new RegExp(t,\"i\"),s=new RegExp(b(i),\"gi\"),u&&(a=new RegExp(b(\"\\ufff7\"),\"g\"),l=new RegExp(b(\"\\ufff8\"),\"g\")),i=function(e){if(!e.title)return!1;var t,n=u?e.title:0<=(t=e.title).indexOf(\">\")?y(\"<div/>\").html(t).text():t,t=n.match(o);return t&&f.highlight&&(u?(d=f.fuzzy?x(n,t,u):n.replace(s,function(e){return\"\\ufff7\"+e+\"\\ufff8\"}),e.titleWithHighlight=m(d).replace(a,\"<mark>\").replace(l,\"</mark>\")):f.fuzzy?e.titleWithHighlight=x(n,t):e.titleWithHighlight=n.replace(s,function(e){return\"<mark>\"+e+\"</mark>\"})),!!t}}return this.enableFilter=!0,this.lastFilterArgs=arguments,e=this.enableUpdate(!1),this.$div.addClass(\"fancytree-ext-filter\"),p?this.$div.addClass(\"fancytree-ext-filter-hide\"):this.$div.addClass(\"fancytree-ext-filter-dimm\"),this.$div.toggleClass(\"fancytree-ext-filter-hide-expanders\",!!f.hideExpanders),this.rootNode.subMatchCount=0,this.visit(function(e){delete e.match,delete e.titleWithHighlight,e.subMatchCount=0}),(t=this.getRootNode()._findDirectChild(v))&&t.remove(),n.autoCollapse=!1,this.visit(function(t){if(!g||null==t.children){var e=i(t),n=!1;if(\"skip\"===e)return t.visit(function(e){e.match=!1},!0),\"skip\";e||!r&&\"branch\"!==e||!t.parent.match||(n=e=!0),e&&(c++,t.match=!0,t.visitParents(function(e){e!==t&&(e.subMatchCount+=1),!f.autoExpand||n||e.expanded||(e.setExpanded(!0,{noAnimation:!0,noEvents:!0,scrollIntoView:!1}),e._filterAutoExpanded=!0)},!0))}}),n.autoCollapse=h,0===c&&f.nodata&&p&&(!0===(t=\"function\"==typeof(t=f.nodata)?t():t)?t={}:\"string\"==typeof t&&(t={title:t}),t=y.extend({statusNodeType:\"nodata\",key:v,title:this.options.strings.noData},t),this.getRootNode().addNode(t).match=!0),this._callHook(\"treeStructureChanged\",this,\"applyFilter\"),this.enableUpdate(e),c},y.ui.fancytree._FancytreeClass.prototype.filterNodes=function(e,t){return\"boolean\"==typeof t&&(t={leavesOnly:t},this.warn(\"Fancytree.filterNodes() leavesOnly option is deprecated since 2.9.0 / 2015-04-19. Use opts.leavesOnly instead.\")),this._applyFilterImpl(e,!1,t)},y.ui.fancytree._FancytreeClass.prototype.filterBranches=function(e,t){return this._applyFilterImpl(e,!0,t)},y.ui.fancytree._FancytreeClass.prototype.updateFilter=function(){this.enableFilter&&this.lastFilterArgs&&this.options.filter.autoApply?this._applyFilterImpl.apply(this,this.lastFilterArgs):this.warn(\"updateFilter(): no filter active.\")},y.ui.fancytree._FancytreeClass.prototype.clearFilter=function(){var t,e=this.getRootNode()._findDirectChild(v),n=this.options.escapeTitles,i=this.options.enhanceTitle,r=this.enableUpdate(!1);e&&e.remove(),delete this.rootNode.match,delete this.rootNode.subMatchCount,this.visit(function(e){e.match&&e.span&&(t=y(e.span).find(\">span.fancytree-title\"),n?t.text(e.title):t.html(e.title),i&&i({type:\"enhanceTitle\"},{node:e,$title:t})),delete e.match,delete e.subMatchCount,delete e.titleWithHighlight,e.$subMatchBadge&&(e.$subMatchBadge.remove(),delete e.$subMatchBadge),e._filterAutoExpanded&&e.expanded&&e.setExpanded(!1,{noAnimation:!0,noEvents:!0,scrollIntoView:!1}),delete e._filterAutoExpanded}),this.enableFilter=!1,this.lastFilterArgs=null,this.$div.removeClass(\"fancytree-ext-filter fancytree-ext-filter-dimm fancytree-ext-filter-hide\"),this._callHook(\"treeStructureChanged\",this,\"clearFilter\"),this.enableUpdate(r)},y.ui.fancytree._FancytreeClass.prototype.isFilterActive=function(){return!!this.enableFilter},y.ui.fancytree._FancytreeNodeClass.prototype.isMatched=function(){return!(this.tree.enableFilter&&!this.match)},y.ui.fancytree.registerExtension({name:\"filter\",version:\"2.38.3\",options:{autoApply:!0,autoExpand:!1,counter:!0,fuzzy:!1,hideExpandedCounter:!0,hideExpanders:!1,highlight:!0,leavesOnly:!1,nodata:!0,mode:\"dimm\"},nodeLoadChildren:function(e,t){var n=e.tree;return this._superApply(arguments).done(function(){n.enableFilter&&n.lastFilterArgs&&e.options.filter.autoApply&&n._applyFilterImpl.apply(n,n.lastFilterArgs)})},nodeSetExpanded:function(e,t,n){var i=e.node;return delete i._filterAutoExpanded,!t&&e.options.filter.hideExpandedCounter&&i.$subMatchBadge&&i.$subMatchBadge.show(),this._superApply(arguments)},nodeRenderStatus:function(e){var t=e.node,n=e.tree,i=e.options.filter,r=y(t.span).find(\"span.fancytree-title\"),o=y(t[n.statusClassPropName]),s=e.options.enhanceTitle,a=e.options.escapeTitles,e=this._super(e);return o.length&&n.enableFilter&&(o.toggleClass(\"fancytree-match\",!!t.match).toggleClass(\"fancytree-submatch\",!!t.subMatchCount).toggleClass(\"fancytree-hide\",!(t.match||t.subMatchCount)),!i.counter||!t.subMatchCount||t.isExpanded()&&i.hideExpandedCounter?t.$subMatchBadge&&t.$subMatchBadge.hide():(t.$subMatchBadge||(t.$subMatchBadge=y(\"<span class='fancytree-childcounter'/>\"),y(\"span.fancytree-icon, span.fancytree-custom-icon\",t.span).append(t.$subMatchBadge)),t.$subMatchBadge.show().text(t.subMatchCount)),!t.span||t.isEditing&&t.isEditing.call(t)||(t.titleWithHighlight?r.html(t.titleWithHighlight):a?r.text(t.title):r.html(t.title),s&&s({type:\"enhanceTitle\"},{node:t,$title:r}))),e}}),y.ui.fancytree},\"function\"==typeof define&&define.amd?define([\"jquery\",\"./jquery.fancytree\"],t):\"object\"==typeof module&&module.exports?(require(\"./jquery.fancytree\"),module.exports=t(require(\"jquery\"))):t(jQuery),t=function(l){\"use strict\";var a=l.ui.fancytree,n={awesome3:{_addClass:\"\",checkbox:\"icon-check-empty\",checkboxSelected:\"icon-check\",checkboxUnknown:\"icon-check icon-muted\",dragHelper:\"icon-caret-right\",dropMarker:\"icon-caret-right\",error:\"icon-exclamation-sign\",expanderClosed:\"icon-caret-right\",expanderLazy:\"icon-angle-right\",expanderOpen:\"icon-caret-down\",loading:\"icon-refresh icon-spin\",nodata:\"icon-meh\",noExpander:\"\",radio:\"icon-circle-blank\",radioSelected:\"icon-circle\",doc:\"icon-file-alt\",docOpen:\"icon-file-alt\",folder:\"icon-folder-close-alt\",folderOpen:\"icon-folder-open-alt\"},awesome4:{_addClass:\"fa\",checkbox:\"fa-square-o\",checkboxSelected:\"fa-check-square-o\",checkboxUnknown:\"fa-square fancytree-helper-indeterminate-cb\",dragHelper:\"fa-arrow-right\",dropMarker:\"fa-long-arrow-right\",error:\"fa-warning\",expanderClosed:\"fa-caret-right\",expanderLazy:\"fa-angle-right\",expanderOpen:\"fa-caret-down\",loading:{html:\"<span class='fa fa-spinner fa-pulse' />\"},nodata:\"fa-meh-o\",noExpander:\"\",radio:\"fa-circle-thin\",radioSelected:\"fa-circle\",doc:\"fa-file-o\",docOpen:\"fa-file-o\",folder:\"fa-folder-o\",folderOpen:\"fa-folder-open-o\"},awesome5:{_addClass:\"\",checkbox:\"far fa-square\",checkboxSelected:\"far fa-check-square\",checkboxUnknown:\"fas fa-square fancytree-helper-indeterminate-cb\",radio:\"far fa-circle\",radioSelected:\"fas fa-circle\",radioUnknown:\"far fa-dot-circle\",dragHelper:\"fas fa-arrow-right\",dropMarker:\"fas fa-long-arrow-alt-right\",error:\"fas fa-exclamation-triangle\",expanderClosed:\"fas fa-caret-right\",expanderLazy:\"fas fa-angle-right\",expanderOpen:\"fas fa-caret-down\",loading:\"fas fa-spinner fa-pulse\",nodata:\"far fa-meh\",noExpander:\"\",doc:\"far fa-file\",docOpen:\"far fa-file\",folder:\"far fa-folder\",folderOpen:\"far fa-folder-open\"},bootstrap3:{_addClass:\"glyphicon\",checkbox:\"glyphicon-unchecked\",checkboxSelected:\"glyphicon-check\",checkboxUnknown:\"glyphicon-expand fancytree-helper-indeterminate-cb\",dragHelper:\"glyphicon-play\",dropMarker:\"glyphicon-arrow-right\",error:\"glyphicon-warning-sign\",expanderClosed:\"glyphicon-menu-right\",expanderLazy:\"glyphicon-menu-right\",expanderOpen:\"glyphicon-menu-down\",loading:\"glyphicon-refresh fancytree-helper-spin\",nodata:\"glyphicon-info-sign\",noExpander:\"\",radio:\"glyphicon-remove-circle\",radioSelected:\"glyphicon-ok-circle\",doc:\"glyphicon-file\",docOpen:\"glyphicon-file\",folder:\"glyphicon-folder-close\",folderOpen:\"glyphicon-folder-open\"},material:{_addClass:\"material-icons\",checkbox:{text:\"check_box_outline_blank\"},checkboxSelected:{text:\"check_box\"},checkboxUnknown:{text:\"indeterminate_check_box\"},dragHelper:{text:\"play_arrow\"},dropMarker:{text:\"arrow-forward\"},error:{text:\"warning\"},expanderClosed:{text:\"chevron_right\"},expanderLazy:{text:\"last_page\"},expanderOpen:{text:\"expand_more\"},loading:{text:\"autorenew\",addClass:\"fancytree-helper-spin\"},nodata:{text:\"info\"},noExpander:{text:\"\"},radio:{text:\"radio_button_unchecked\"},radioSelected:{text:\"radio_button_checked\"},doc:{text:\"insert_drive_file\"},docOpen:{text:\"insert_drive_file\"},folder:{text:\"folder\"},folderOpen:{text:\"folder_open\"}}};function d(e,t,n,i,r){var o=i.map,s=o[r],a=l(t),i=a.find(\".fancytree-childcounter\"),o=n+\" \"+(o._addClass||\"\");\"string\"==typeof(s=\"function\"==typeof s?s.call(this,e,t,r):s)?(t.innerHTML=\"\",a.attr(\"class\",o+\" \"+s).append(i)):s&&(s.text?t.textContent=\"\"+s.text:s.html?t.innerHTML=s.html:t.innerHTML=\"\",a.attr(\"class\",o+\" \"+(s.addClass||\"\")).append(i))}return l.ui.fancytree.registerExtension({name:\"glyph\",version:\"2.38.3\",options:{preset:null,map:{}},treeInit:function(e){var t=e.tree,e=e.options.glyph;e.preset?(a.assert(!!n[e.preset],\"Invalid value for `options.glyph.preset`: \"+e.preset),e.map=l.extend({},n[e.preset],e.map)):t.warn(\"ext-glyph: missing `preset` option.\"),this._superApply(arguments),t.$container.addClass(\"fancytree-ext-glyph\")},nodeRenderStatus:function(e){var t,n,i=e.node,r=l(i.span),o=e.options.glyph,s=this._super(e);return i.isRootNode()||((n=r.children(\".fancytree-expander\").get(0))&&(t=i.expanded&&i.hasChildren()?\"expanderOpen\":i.isUndefined()?\"expanderLazy\":i.hasChildren()?\"expanderClosed\":\"noExpander\",d(i,n,\"fancytree-expander\",o,t)),(n=(i.tr?l(\"td\",i.tr).find(\".fancytree-checkbox\"):r.children(\".fancytree-checkbox\")).get(0))&&(e=a.evalOption(\"checkbox\",i,i,o,!1),i.parent&&i.parent.radiogroup||\"radio\"===e?d(i,n,\"fancytree-checkbox fancytree-radio\",o,t=i.selected?\"radioSelected\":\"radio\"):d(i,n,\"fancytree-checkbox\",o,t=i.selected?\"checkboxSelected\":i.partsel?\"checkboxUnknown\":\"checkbox\")),(n=r.children(\".fancytree-icon\").get(0))&&(t=i.statusNodeType||(i.folder?i.expanded&&i.hasChildren()?\"folderOpen\":\"folder\":i.expanded?\"docOpen\":\"doc\"),d(i,n,\"fancytree-icon\",o,t))),s},nodeSetStatus:function(e,t,n,i){var r,o=e.options.glyph,s=e.node,e=this._superApply(arguments);return\"error\"!==t&&\"loading\"!==t&&\"nodata\"!==t||(s.parent?(r=l(\".fancytree-expander\",s.span).get(0))&&d(s,r,\"fancytree-expander\",o,t):(r=l(\".fancytree-statusnode-\"+t,s[this.nodeContainerAttrName]).find(\".fancytree-icon\").get(0))&&d(s,r,\"fancytree-icon\",o,t)),e}}),l.ui.fancytree},\"function\"==typeof define&&define.amd?define([\"jquery\",\"./jquery.fancytree\"],t):\"object\"==typeof module&&module.exports?(require(\"./jquery.fancytree\"),module.exports=t(require(\"jquery\"))):t(jQuery),t=function(c){\"use strict\";var u=c.ui.keyCode,o={text:[u.UP,u.DOWN],checkbox:[u.UP,u.DOWN,u.LEFT,u.RIGHT],link:[u.UP,u.DOWN,u.LEFT,u.RIGHT],radiobutton:[u.UP,u.DOWN,u.LEFT,u.RIGHT],\"select-one\":[u.LEFT,u.RIGHT],\"select-multiple\":[u.LEFT,u.RIGHT]};function s(e,t){var n,i,r,o,s,a,l=e.closest(\"td\"),d=null;switch(t){case u.LEFT:d=l.prev();break;case u.RIGHT:d=l.next();break;case u.UP:case u.DOWN:for(n=l.parent(),r=n,s=l.get(0),a=0,r.children().each(function(){return this!==s&&(o=c(this).prop(\"colspan\"),void(a+=o||1))}),i=a;(n=t===u.UP?n.prev():n.next()).length&&(n.is(\":hidden\")||!(d=function(e,t){var n,i=null,r=0;return e.children().each(function(){return t<=r?(i=c(this),!1):(n=c(this).prop(\"colspan\"),void(r+=n||1))}),i}(n,i))||!d.find(\":input,a\").length););}return d}return c.ui.fancytree.registerExtension({name:\"gridnav\",version:\"2.38.3\",options:{autofocusInput:!1,handleCursorKeys:!0},treeInit:function(n){this._requireExtension(\"table\",!0,!0),this._superApply(arguments),this.$container.addClass(\"fancytree-ext-gridnav\"),this.$container.on(\"focusin\",function(e){var t=c.ui.fancytree.getNode(e.target);t&&!t.isActive()&&(e=n.tree._makeHookContext(t,e),n.tree._callHook(\"nodeSetActive\",e,!0))})},nodeSetActive:function(e,t,n){var i=e.options.gridnav,r=e.node,o=e.originalEvent||{},o=c(o.target).is(\":input\");t=!1!==t,this._superApply(arguments),t&&(e.options.titlesTabbable?(o||(c(r.span).find(\"span.fancytree-title\").focus(),r.setFocus()),e.tree.$container.attr(\"tabindex\",\"-1\")):i.autofocusInput&&!o&&c(r.tr||r.span).find(\":input:enabled\").first().focus())},nodeKeydown:function(e){var t,n,i=e.options.gridnav,r=e.originalEvent,e=c(r.target);return e.is(\":input:enabled\")?t=e.prop(\"type\"):e.is(\"a\")&&(t=\"link\"),t&&i.handleCursorKeys?!((t=o[t])&&0<=c.inArray(r.which,t)&&(n=s(e,r.which))&&n.length)||(n.find(\":input:enabled,a\").focus(),!1):this._superApply(arguments)}}),c.ui.fancytree},\"function\"==typeof define&&define.amd?define([\"jquery\",\"./jquery.fancytree\",\"./jquery.fancytree.table\"],t):\"object\"==typeof module&&module.exports?(require(\"./jquery.fancytree.table\"),module.exports=t(require(\"jquery\"))):t(jQuery),t=function(s){\"use strict\";return s.ui.fancytree.registerExtension({name:\"multi\",version:\"2.38.3\",options:{allowNoSelect:!1,mode:\"sameParent\"},treeInit:function(e){this._superApply(arguments),this.$container.addClass(\"fancytree-ext-multi\"),1===e.options.selectMode&&s.error(\"Fancytree ext-multi: selectMode: 1 (single) is not compatible.\")},nodeClick:function(e){var t=e.tree,n=e.node,i=t.getActiveNode()||t.getFirstChild(),r=\"checkbox\"===e.targetType,o=\"expander\"===e.targetType;switch(s.ui.fancytree.eventToString(e.originalEvent)){case\"click\":if(o)break;r||(t.selectAll(!1),n.setSelected());break;case\"shift+click\":t.visitRows(function(e){if(e.setSelected(),e===n)return!1},{start:i,reverse:i.isBelowOf(n)});break;case\"ctrl+click\":case\"meta+click\":return void n.toggleSelected()}return this._superApply(arguments)},nodeKeydown:function(e){var t=e.tree,n=e.node,i=e.originalEvent;switch(s.ui.fancytree.eventToString(i)){case\"up\":case\"down\":t.selectAll(!1),n.navigate(i.which,!0),t.getActiveNode().setSelected();break;case\"shift+up\":case\"shift+down\":n.navigate(i.which,!0),t.getActiveNode().setSelected()}return this._superApply(arguments)}}),s.ui.fancytree},\"function\"==typeof define&&define.amd?define([\"jquery\",\"./jquery.fancytree\"],t):\"object\"==typeof module&&module.exports?(require(\"./jquery.fancytree\"),module.exports=t(require(\"jquery\"))):t(jQuery),t=function(p){\"use strict\";var t=null,n=null,i=null,r=p.ui.fancytree.assert,u=\"active\",g=\"expanded\",h=\"focus\",f=\"selected\";try{r(window.localStorage&&window.localStorage.getItem),n={get:function(e){return window.localStorage.getItem(e)},set:function(e,t){window.localStorage.setItem(e,t)},remove:function(e){window.localStorage.removeItem(e)}}}catch(e){p.ui.fancytree.warn(\"Could not access window.localStorage\",e)}try{r(window.sessionStorage&&window.sessionStorage.getItem),i={get:function(e){return window.sessionStorage.getItem(e)},set:function(e,t){window.sessionStorage.setItem(e,t)},remove:function(e){window.sessionStorage.removeItem(e)}}}catch(e){p.ui.fancytree.warn(\"Could not access window.sessionStorage\",e)}return\"function\"==typeof Cookies?t={get:Cookies.get,set:function(e,t){Cookies.set(e,t,this.options.persist.cookie)},remove:Cookies.remove}:p&&\"function\"==typeof p.cookie&&(t={get:p.cookie,set:function(e,t){p.cookie(e,t,this.options.persist.cookie)},remove:p.removeCookie}),p.ui.fancytree._FancytreeClass.prototype.clearPersistData=function(e){var t=this.ext.persist,n=t.cookiePrefix;0<=(e=e||\"active expanded focus selected\").indexOf(u)&&t._data(n+u,null),0<=e.indexOf(g)&&t._data(n+g,null),0<=e.indexOf(h)&&t._data(n+h,null),0<=e.indexOf(f)&&t._data(n+f,null)},p.ui.fancytree._FancytreeClass.prototype.clearCookies=function(e){return this.warn(\"'tree.clearCookies()' is deprecated since v2.27.0: use 'clearPersistData()' instead.\"),this.clearPersistData(e)},p.ui.fancytree._FancytreeClass.prototype.getPersistData=function(){var e=this.ext.persist,t=e.cookiePrefix,n=e.cookieDelimiter,i={};return i[u]=e._data(t+u),i[g]=(e._data(t+g)||\"\").split(n),i[f]=(e._data(t+f)||\"\").split(n),i[h]=e._data(t+h),i},p.ui.fancytree.registerExtension({name:\"persist\",version:\"2.38.3\",options:{cookieDelimiter:\"~\",cookiePrefix:void 0,cookie:{raw:!1,expires:\"\",path:\"\",domain:\"\",secure:!1},expandLazy:!1,expandOpts:void 0,fireActivate:!0,overrideSource:!0,store:\"auto\",types:\"active expanded focus selected\"},_data:function(e,t){var n=this._local.store;if(void 0===t)return n.get.call(this,e);null===t?n.remove.call(this,e):n.set.call(this,e,t)},_appendKey:function(e,t,n){t=\"\"+t;var i=this._local,r=this.options.persist.cookieDelimiter,o=i.cookiePrefix+e,s=i._data(o),e=s?s.split(r):[],s=p.inArray(t,e);0<=s&&e.splice(s,1),n&&e.push(t),i._data(o,e.join(r))},treeInit:function(e){var a=e.tree,l=e.options,d=this._local,c=this.options.persist;return d.cookiePrefix=c.cookiePrefix||\"fancytree-\"+a._id+\"-\",d.storeActive=0<=c.types.indexOf(u),d.storeExpanded=0<=c.types.indexOf(g),d.storeSelected=0<=c.types.indexOf(f),d.storeFocus=0<=c.types.indexOf(h),d.store=null,\"auto\"===c.store&&(c.store=n?\"local\":\"cookie\"),p.isPlainObject(c.store)?d.store=c.store:\"cookie\"===c.store?d.store=t:\"local\"!==c.store&&\"session\"!==c.store||(d.store=\"local\"===c.store?n:i),r(d.store,\"Need a valid store.\"),a.$div.on(\"fancytreeinit\",function(e){var t,n,i,r,o,s;!1!==a._triggerTreeEvent(\"beforeRestore\",null,{})&&(i=d._data(d.cookiePrefix+h),r=!1===c.fireActivate,o=d._data(d.cookiePrefix+g),s=o&&o.split(c.cookieDelimiter),(d.storeExpanded?function e(t,n,i,r,o){var s,a,l,d,c=!1,u=t.options.persist.expandOpts,h=[],f=[];for(i=i||[],o=o||p.Deferred(),s=0,l=i.length;s<l;s++)a=i[s],(d=t.getNodeByKey(a))?r&&d.isUndefined()?(c=!0,t.debug(\"_loadLazyNodes: \"+d+\" is lazy: loading...\"),\"expand\"===r?h.push(d.setExpanded(!0,u)):h.push(d.load())):(t.debug(\"_loadLazyNodes: \"+d+\" already loaded.\"),d.setExpanded(!0,u)):(f.push(a),t.debug(\"_loadLazyNodes: \"+d+\" was not yet found.\"));return p.when.apply(p,h).always(function(){if(c&&0<f.length)e(t,n,f,r,o);else{if(f.length)for(t.warn(\"_loadLazyNodes: could not load those keys: \",f),s=0,l=f.length;s<l;s++)a=i[s],n._appendKey(g,i[s],!1);o.resolve()}}),o}(a,d,s,!!c.expandLazy&&\"expand\",null):(new p.Deferred).resolve()).done(function(){if(d.storeSelected){if(o=d._data(d.cookiePrefix+f))for(s=o.split(c.cookieDelimiter),t=0;t<s.length;t++)(n=a.getNodeByKey(s[t]))?(void 0===n.selected||c.overrideSource&&!1===n.selected)&&(n.selected=!0,n.renderStatus()):d._appendKey(f,s[t],!1);3===a.options.selectMode&&a.visit(function(e){if(e.selected)return e.fixSelection3AfterClick(),\"skip\"})}d.storeActive&&(!(o=d._data(d.cookiePrefix+u))||!l.persist.overrideSource&&a.activeNode||(n=a.getNodeByKey(o))&&(n.debug(\"persist: set active\",o),n.setActive(!0,{noFocus:!0,noEvents:r}))),d.storeFocus&&i&&(n=a.getNodeByKey(i))&&(a.options.titlesTabbable?p(n.span).find(\".fancytree-title\"):p(a.$container)).focus(),a._triggerTreeEvent(\"restore\",null,{})}))}),this._superApply(arguments)},nodeSetActive:function(e,t,n){var i=this._local;return t=!1!==t,t=this._superApply(arguments),i.storeActive&&i._data(i.cookiePrefix+u,this.activeNode?this.activeNode.key:null),t},nodeSetExpanded:function(e,t,n){var i=e.node,r=this._local;return t=!1!==t,e=this._superApply(arguments),r.storeExpanded&&r._appendKey(g,i.key,t),e},nodeSetFocus:function(e,t){var n=this._local;return t=!1!==t,t=this._superApply(arguments),n.storeFocus&&n._data(n.cookiePrefix+h,this.focusNode?this.focusNode.key:null),t},nodeSetSelected:function(e,t,n){var i=e.tree,r=e.node,o=this._local;return t=!1!==t,t=this._superApply(arguments),o.storeSelected&&(3===i.options.selectMode?(i=(i=p.map(i.getSelectedNodes(!0),function(e){return e.key})).join(e.options.persist.cookieDelimiter),o._data(o.cookiePrefix+f,i)):o._appendKey(f,r.key,r.selected)),t}}),p.ui.fancytree},\"function\"==typeof define&&define.amd?define([\"jquery\",\"./jquery.fancytree\"],t):\"object\"==typeof module&&module.exports?(require(\"./jquery.fancytree\"),module.exports=t(require(\"jquery\"))):t(jQuery),t=function(m){\"use strict\";var b=m.ui.fancytree.assert;function x(e,n){e.visit(function(e){var t=e.tr;if(t&&(t.style.display=e.hide||!n?\"none\":\"\"),!e.expanded)return\"skip\"})}return m.ui.fancytree.registerExtension({name:\"table\",version:\"2.38.3\",options:{checkboxColumnIdx:null,indentation:16,mergeStatusColumns:!0,nodeColumnIdx:0},treeInit:function(e){var t,n,i,r=e.tree,o=e.options,s=o.table,a=r.widget.element;if(null!=s.customStatus&&(null==o.renderStatusColumns?(r.warn(\"The 'customStatus' option is deprecated since v2.15.0. Use 'renderStatusColumns' instead.\"),o.renderStatusColumns=s.customStatus):m.error(\"The 'customStatus' option is deprecated since v2.15.0. Use 'renderStatusColumns' only instead.\")),o.renderStatusColumns&&!0===o.renderStatusColumns&&(o.renderStatusColumns=o.renderColumns),a.addClass(\"fancytree-container fancytree-ext-table\"),(i=a.find(\">tbody\")).length||(a.find(\">tr\").length&&m.error(\"Expected table > tbody > tr. If you see this please open an issue.\"),i=m(\"<tbody>\").appendTo(a)),r.tbody=i[0],r.columnCount=m(\"thead >tr\",a).last().find(\">th\",a).length,(n=i.children(\"tr\").first()).length)e=n.children(\"td\").length,r.columnCount&&e!==r.columnCount&&(r.warn(\"Column count mismatch between thead (\"+r.columnCount+\") and tbody (\"+e+\"): using tbody.\"),r.columnCount=e),n=n.clone();else for(b(1<=r.columnCount,\"Need either <thead> or <tbody> with <td> elements to determine column count.\"),n=m(\"<tr />\"),t=0;t<r.columnCount;t++)n.append(\"<td />\");n.find(\">td\").eq(s.nodeColumnIdx).html(\"<span class='fancytree-node' />\"),o.aria&&(n.attr(\"role\",\"row\"),n.find(\"td\").attr(\"role\",\"gridcell\")),r.rowFragment=document.createDocumentFragment(),r.rowFragment.appendChild(n.get(0)),i.empty(),r.statusClassPropName=\"tr\",r.ariaPropName=\"tr\",this.nodeContainerAttrName=\"tr\",r.$container=a,this._superApply(arguments),m(r.rootNode.ul).remove(),r.rootNode.ul=null,this.$container.attr(\"tabindex\",o.tabindex),o.aria&&r.$container.attr(\"role\",\"treegrid\").attr(\"aria-readonly\",!0)},nodeRemoveChildMarkup:function(e){e.node.visit(function(e){e.tr&&(m(e.tr).remove(),e.tr=null)})},nodeRemoveMarkup:function(e){var t=e.node;t.tr&&(m(t.tr).remove(),t.tr=null),this.nodeRemoveChildMarkup(e)},nodeRender:function(e,t,n,i,r){var o,s,a,l,d,c,u,h,f,p=e.tree,g=e.node,y=e.options,v=!g.parent;if(!1!==p._enableUpdate){if(r||(e.hasCollapsedParents=g.parent&&!g.parent.expanded),!v)if(g.tr&&t&&this.nodeRemoveMarkup(e),g.tr)t?this.nodeRenderTitle(e):this.nodeRenderStatus(e);else{if(e.hasCollapsedParents&&!n)return;d=p.rowFragment.firstChild.cloneNode(!0),h=function(e){var t,n,i=e.parent,r=i?i.children:null;if(r&&1<r.length&&r[0]!==e)for(n=r[m.inArray(e,r)-1],b(n.tr);n.children&&n.children.length&&(t=n.children[n.children.length-1]).tr;)n=t;else n=i;return n}(g),b(h),(!0===i&&r||n&&e.hasCollapsedParents)&&(d.style.display=\"none\"),h.tr?(f=h.tr).parentNode.insertBefore(d,f.nextSibling):(b(!h.parent,\"prev. row must have a tr, or be system root\"),(h=p.tbody).insertBefore(d,h.firstChild)),g.tr=d,g.key&&y.generateIds&&(g.tr.id=y.idPrefix+g.key),(g.tr.ftnode=g).span=m(\"span.fancytree-node\",g.tr).get(0),this.nodeRenderTitle(e),y.createNode&&y.createNode.call(p,{type:\"createNode\"},e)}if(y.renderNode&&y.renderNode.call(p,{type:\"renderNode\"},e),(o=g.children)&&(v||n||g.expanded))for(a=0,l=o.length;a<l;a++)(u=m.extend({},e,{node:o[a]})).hasCollapsedParents=u.hasCollapsedParents||!g.expanded,this.nodeRender(u,t,n,i,!0);o&&!r&&(c=g.tr||null,s=p.tbody.firstChild,g.visit(function(e){var t;e.tr&&(e.parent.expanded||\"none\"===e.tr.style.display||(e.tr.style.display=\"none\",x(e,!1)),e.tr.previousSibling!==c&&(g.debug(\"_fixOrder: mismatch at node: \"+e),t=c?c.nextSibling:s,p.tbody.insertBefore(e.tr,t)),c=e.tr)}))}},nodeRenderTitle:function(e,t){var n=e.tree,i=e.node,r=e.options,o=i.isStatusNode(),s=this._super(e,t);return i.isRootNode()||(r.checkbox&&!o&&null!=r.table.checkboxColumnIdx&&(t=m(\"span.fancytree-checkbox\",i.span),m(i.tr).find(\"td\").eq(+r.table.checkboxColumnIdx).html(t)),this.nodeRenderStatus(e),o?r.renderStatusColumns?r.renderStatusColumns.call(n,{type:\"renderStatusColumns\"},e):r.table.mergeStatusColumns&&i.isTopLevel()&&m(i.tr).find(\">td\").eq(0).prop(\"colspan\",n.columnCount).text(i.title).addClass(\"fancytree-status-merged\").nextAll().remove():r.renderColumns&&r.renderColumns.call(n,{type:\"renderColumns\"},e)),s},nodeRenderStatus:function(e){var t=e.node,n=e.options;this._super(e),m(t.tr).removeClass(\"fancytree-node\"),e=(t.getLevel()-1)*n.table.indentation,n.rtl?m(t.span).css({paddingRight:e+\"px\"}):m(t.span).css({paddingLeft:e+\"px\"})},nodeSetExpanded:function(t,n,i){if(n=!1!==n,t.node.expanded&&n||!t.node.expanded&&!n)return this._superApply(arguments);var r=new m.Deferred,e=m.extend({},i,{noEvents:!0,noAnimation:!0});function o(e){e?(x(t.node,n),n&&t.options.autoScroll&&!i.noAnimation&&t.node.hasChildren()?t.node.getLastChild().scrollIntoView(!0,{topNode:t.node}).always(function(){i.noEvents||t.tree._triggerNodeEvent(n?\"expand\":\"collapse\",t),r.resolveWith(t.node)}):(i.noEvents||t.tree._triggerNodeEvent(n?\"expand\":\"collapse\",t),r.resolveWith(t.node))):(i.noEvents||t.tree._triggerNodeEvent(n?\"expand\":\"collapse\",t),r.rejectWith(t.node))}return i=i||{},this._super(t,n,e).done(function(){o(!0)}).fail(function(){o(!1)}),r.promise()},nodeSetStatus:function(e,t,n,i){return\"ok\"!==t||(e=(e=e.node).children?e.children[0]:null)&&e.isStatusNode()&&m(e.tr).remove(),this._superApply(arguments)},treeClear:function(e){return this.nodeRemoveChildMarkup(this._makeHookContext(this.rootNode)),this._superApply(arguments)},treeDestroy:function(e){return this.$container.find(\"tbody\").empty(),this.$source&&this.$source.removeClass(\"fancytree-helper-hidden\"),this._superApply(arguments)}}),m.ui.fancytree},\"function\"==typeof define&&define.amd?define([\"jquery\",\"./jquery.fancytree\"],t):\"object\"==typeof module&&module.exports?(require(\"./jquery.fancytree\"),module.exports=t(require(\"jquery\"))):t(jQuery),t=function(o){\"use strict\";return o.ui.fancytree.registerExtension({name:\"themeroller\",version:\"2.38.3\",options:{activeClass:\"ui-state-active\",addClass:\"ui-corner-all\",focusClass:\"ui-state-focus\",hoverClass:\"ui-state-hover\",selectedClass:\"ui-state-highlight\"},treeInit:function(e){var t=e.widget.element,n=e.options.themeroller;this._superApply(arguments),\"TABLE\"===t[0].nodeName?(t.addClass(\"ui-widget ui-corner-all\"),t.find(\">thead tr\").addClass(\"ui-widget-header\"),t.find(\">tbody\").addClass(\"ui-widget-conent\")):t.addClass(\"ui-widget ui-widget-content ui-corner-all\"),t.on(\"mouseenter mouseleave\",\".fancytree-node\",function(e){var t=o.ui.fancytree.getNode(e.target),e=\"mouseenter\"===e.type;o(t.tr||t.span).toggleClass(n.hoverClass+\" \"+n.addClass,e)})},treeDestroy:function(e){this._superApply(arguments),e.widget.element.removeClass(\"ui-widget ui-widget-content ui-corner-all\")},nodeRenderStatus:function(e){var t={},n=e.node,i=o(n.tr||n.span),r=e.options.themeroller;this._super(e),t[r.activeClass]=!1,t[r.focusClass]=!1,t[r.selectedClass]=!1,n.isActive()&&(t[r.activeClass]=!0),n.hasFocus()&&(t[r.focusClass]=!0),n.isSelected()&&!n.isActive()&&(t[r.selectedClass]=!0),i.toggleClass(r.activeClass,t[r.activeClass]),i.toggleClass(r.focusClass,t[r.focusClass]),i.toggleClass(r.selectedClass,t[r.selectedClass]),i.addClass(r.addClass)}}),o.ui.fancytree},\"function\"==typeof define&&define.amd?define([\"jquery\",\"./jquery.fancytree\"],t):\"object\"==typeof module&&module.exports?(require(\"./jquery.fancytree\"),module.exports=t(require(\"jquery\"))):t(jQuery),t=function(d){\"use strict\";var c=/^([+-]?(?:\\d+|\\d*\\.\\d+))([a-z]*|%)$/;function u(e,t){var n=d(\"#\"+(e=\"fancytree-style-\"+e));if(t){n.length||(n=d(\"<style />\").attr(\"id\",e).addClass(\"fancytree-style\").prop(\"type\",\"text/css\").appendTo(\"head\"));try{n.html(t)}catch(e){n[0].styleSheet.cssText=t}return n}n.remove()}function h(e,t,n,i,r,o){for(var s=\"#\"+e+\" span.fancytree-level-\",a=[],l=0;l<t;l++)a.push(s+(l+1)+\" span.fancytree-title { padding-left: \"+(l*n+i)+o+\"; }\");return a.push(\"#\"+e+\" div.ui-effects-wrapper ul li span.fancytree-title, #\"+e+\" li.fancytree-animating span.fancytree-title { padding-left: \"+r+o+\"; position: static; width: auto; }\"),a.join(\"\\n\")}return d.ui.fancytree.registerExtension({name:\"wide\",version:\"2.38.3\",options:{iconWidth:null,iconSpacing:null,labelSpacing:null,levelOfs:null},treeCreate:function(e){this._superApply(arguments),this.$container.addClass(\"fancytree-ext-wide\");var t=e.options.wide,n=d(\"<li id='fancytreeTemp'><span class='fancytree-node'><span class='fancytree-icon' /><span class='fancytree-title' /></span><ul />\").appendTo(e.tree.$container),i=n.find(\".fancytree-icon\"),r=n.find(\"ul\"),o=t.iconSpacing||i.css(\"margin-left\"),s=t.iconWidth||i.css(\"width\"),a=t.labelSpacing||\"3px\",l=t.levelOfs||r.css(\"padding-left\");n.remove(),i=o.match(c)[2],o=parseFloat(o,10),t=a.match(c)[2],a=parseFloat(a,10),r=s.match(c)[2],s=parseFloat(s,10),n=l.match(c)[2],i===r&&n===r&&t===r||d.error(\"iconWidth, iconSpacing, and levelOfs must have the same css measure unit\"),this._local.measureUnit=r,this._local.levelOfs=parseFloat(l),this._local.lineOfs=(1+(e.options.checkbox?1:0)+(!1===e.options.icon?0:1))*(s+o)+o,this._local.labelOfs=a,this._local.maxDepth=10,u(a=this.$container.uniqueId().attr(\"id\"),h(a,this._local.maxDepth,this._local.levelOfs,this._local.lineOfs,this._local.labelOfs,this._local.measureUnit))},treeDestroy:function(e){return u(this.$container.attr(\"id\"),null),this._superApply(arguments)},nodeRenderStatus:function(e){var t=e.node,n=t.getLevel(),i=this._super(e);return n>this._local.maxDepth&&(e=this.$container.attr(\"id\"),this._local.maxDepth*=2,t.debug(\"Define global ext-wide css up to level \"+this._local.maxDepth),u(e,h(e,this._local.maxDepth,this._local.levelOfs,this._local.lineOfs,this._local.labelSpacing,this._local.measureUnit))),d(t.span).addClass(\"fancytree-level-\"+n),i}}),d.ui.fancytree},\"function\"==typeof define&&define.amd?define([\"jquery\",\"./jquery.fancytree\"],t):\"object\"==typeof module&&module.exports?(require(\"./jquery.fancytree\"),module.exports=t(require(\"jquery\"))):t(jQuery),e.ui.fancytree});\n","/*!\n * jquery.fancytree.filter.js\n *\n * Remove or highlight tree nodes, based on a filter.\n * (Extension module for jquery.fancytree.js: https://github.com/mar10/fancytree/)\n *\n * Copyright (c) 2008-2023, Martin Wendt (https://wwWendt.de)\n *\n * Released under the MIT license\n * https://github.com/mar10/fancytree/wiki/LicenseInfo\n *\n * @version 2.38.3\n * @date 2023-02-01T20:52:50Z\n */\n\n(function (factory) {\n\tif (typeof define === \"function\" && define.amd) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([\"jquery\", \"./jquery.fancytree\"], factory);\n\t} else if (typeof module === \"object\" && module.exports) {\n\t\t// Node/CommonJS\n\t\trequire(\"./jquery.fancytree\");\n\t\tmodule.exports = factory(require(\"jquery\"));\n\t} else {\n\t\t// Browser globals\n\t\tfactory(jQuery);\n\t}\n})(function ($) {\n\t\"use strict\";\n\n\t/*******************************************************************************\n\t * Private functions and variables\n\t */\n\n\tvar KeyNoData = \"__not_found__\",\n\t\tescapeHtml = $.ui.fancytree.escapeHtml,\n\t\texoticStartChar = \"\\uFFF7\",\n\t\texoticEndChar = \"\\uFFF8\";\n\tfunction _escapeRegex(str) {\n\t\treturn (str + \"\").replace(/([.?*+^$[\\]\\\\(){}|-])/g, \"\\\\$1\");\n\t}\n\n\tfunction extractHtmlText(s) {\n\t\tif (s.indexOf(\">\") >= 0) {\n\t\t\treturn $(\"<div/>\").html(s).text();\n\t\t}\n\t\treturn s;\n\t}\n\n\t/**\n\t * @description Marks the matching charecters of `text` either by `mark` or\n\t * by exotic*Chars (if `escapeTitles` is `true`) based on `regexMatchArray`\n\t * which is an array of matching groups.\n\t * @param {string} text\n\t * @param {RegExpMatchArray} regexMatchArray\n\t */\n\tfunction _markFuzzyMatchedChars(text, regexMatchArray, escapeTitles) {\n\t\t// It is extremely infuriating that we can not use `let` or `const` or arrow functions.\n\t\t// Damn you IE!!!\n\t\tvar matchingIndices = [];\n\t\t// get the indices of matched characters (Iterate through `RegExpMatchArray`)\n\t\tfor (\n\t\t\tvar _matchingArrIdx = 1;\n\t\t\t_matchingArrIdx < regexMatchArray.length;\n\t\t\t_matchingArrIdx++\n\t\t) {\n\t\t\tvar _mIdx =\n\t\t\t\t// get matching char index by cumulatively adding\n\t\t\t\t// the matched group length\n\t\t\t\tregexMatchArray[_matchingArrIdx].length +\n\t\t\t\t(_matchingArrIdx === 1 ? 0 : 1) +\n\t\t\t\t(matchingIndices[matchingIndices.length - 1] || 0);\n\t\t\tmatchingIndices.push(_mIdx);\n\t\t}\n\t\t// Map each `text` char to its position and store in `textPoses`.\n\t\tvar textPoses = text.split(\"\");\n\t\tif (escapeTitles) {\n\t\t\t// If escaping the title, then wrap the matchng char within exotic chars\n\t\t\tmatchingIndices.forEach(function (v) {\n\t\t\t\ttextPoses[v] = exoticStartChar + textPoses[v] + exoticEndChar;\n\t\t\t});\n\t\t} else {\n\t\t\t// Otherwise, Wrap the matching chars within `mark`.\n\t\t\tmatchingIndices.forEach(function (v) {\n\t\t\t\ttextPoses[v] = \"<mark>\" + textPoses[v] + \"</mark>\";\n\t\t\t});\n\t\t}\n\t\t// Join back the modified `textPoses` to create final highlight markup.\n\t\treturn textPoses.join(\"\");\n\t}\n\t$.ui.fancytree._FancytreeClass.prototype._applyFilterImpl = function (\n\t\tfilter,\n\t\tbranchMode,\n\t\t_opts\n\t) {\n\t\tvar match,\n\t\t\tstatusNode,\n\t\t\tre,\n\t\t\treHighlight,\n\t\t\treExoticStartChar,\n\t\t\treExoticEndChar,\n\t\t\ttemp,\n\t\t\tprevEnableUpdate,\n\t\t\tcount = 0,\n\t\t\ttreeOpts = this.options,\n\t\t\tescapeTitles = treeOpts.escapeTitles,\n\t\t\tprevAutoCollapse = treeOpts.autoCollapse,\n\t\t\topts = $.extend({}, treeOpts.filter, _opts),\n\t\t\thideMode = opts.mode === \"hide\",\n\t\t\tleavesOnly = !!opts.leavesOnly && !branchMode;\n\n\t\t// Default to 'match title substring (not case sensitive)'\n\t\tif (typeof filter === \"string\") {\n\t\t\tif (filter === \"\") {\n\t\t\t\tthis.warn(\n\t\t\t\t\t\"Fancytree passing an empty string as a filter is handled as clearFilter().\"\n\t\t\t\t);\n\t\t\t\tthis.clearFilter();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (opts.fuzzy) {\n\t\t\t\t// See https://codereview.stackexchange.com/questions/23899/faster-javascript-fuzzy-string-matching-function/23905#23905\n\t\t\t\t// and http://www.quora.com/How-is-the-fuzzy-search-algorithm-in-Sublime-Text-designed\n\t\t\t\t// and http://www.dustindiaz.com/autocomplete-fuzzy-matching\n\t\t\t\tmatch = filter\n\t\t\t\t\t.split(\"\")\n\t\t\t\t\t// Escaping the `filter` will not work because,\n\t\t\t\t\t// it gets further split into individual characters. So,\n\t\t\t\t\t// escape each character after splitting\n\t\t\t\t\t.map(_escapeRegex)\n\t\t\t\t\t.reduce(function (a, b) {\n\t\t\t\t\t\t// create capture groups for parts that comes before\n\t\t\t\t\t\t// the character\n\t\t\t\t\t\treturn a + \"([^\" + b + \"]*)\" + b;\n\t\t\t\t\t}, \"\");\n\t\t\t} else {\n\t\t\t\tmatch = _escapeRegex(filter); // make sure a '.' is treated literally\n\t\t\t}\n\t\t\tre = new RegExp(match, \"i\");\n\t\t\treHighlight = new RegExp(_escapeRegex(filter), \"gi\");\n\t\t\tif (escapeTitles) {\n\t\t\t\treExoticStartChar = new RegExp(\n\t\t\t\t\t_escapeRegex(exoticStartChar),\n\t\t\t\t\t\"g\"\n\t\t\t\t);\n\t\t\t\treExoticEndChar = new RegExp(_escapeRegex(exoticEndChar), \"g\");\n\t\t\t}\n\t\t\tfilter = function (node) {\n\t\t\t\tif (!node.title) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tvar text = escapeTitles\n\t\t\t\t\t\t? node.title\n\t\t\t\t\t\t: extractHtmlText(node.title),\n\t\t\t\t\t// `.match` instead of `.test` to get the capture groups\n\t\t\t\t\tres = text.match(re);\n\t\t\t\tif (res && opts.highlight) {\n\t\t\t\t\tif (escapeTitles) {\n\t\t\t\t\t\tif (opts.fuzzy) {\n\t\t\t\t\t\t\ttemp = _markFuzzyMatchedChars(\n\t\t\t\t\t\t\t\ttext,\n\t\t\t\t\t\t\t\tres,\n\t\t\t\t\t\t\t\tescapeTitles\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// #740: we must not apply the marks to escaped entity names, e.g. `&quot;`\n\t\t\t\t\t\t\t// Use some exotic characters to mark matches:\n\t\t\t\t\t\t\ttemp = text.replace(reHighlight, function (s) {\n\t\t\t\t\t\t\t\treturn exoticStartChar + s + exoticEndChar;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// now we can escape the title...\n\t\t\t\t\t\tnode.titleWithHighlight = escapeHtml(temp)\n\t\t\t\t\t\t\t// ... and finally insert the desired `<mark>` tags\n\t\t\t\t\t\t\t.replace(reExoticStartChar, \"<mark>\")\n\t\t\t\t\t\t\t.replace(reExoticEndChar, \"</mark>\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (opts.fuzzy) {\n\t\t\t\t\t\t\tnode.titleWithHighlight = _markFuzzyMatchedChars(\n\t\t\t\t\t\t\t\ttext,\n\t\t\t\t\t\t\t\tres\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode.titleWithHighlight = text.replace(\n\t\t\t\t\t\t\t\treHighlight,\n\t\t\t\t\t\t\t\tfunction (s) {\n\t\t\t\t\t\t\t\t\treturn \"<mark>\" + s + \"</mark>\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// node.debug(\"filter\", escapeTitles, text, node.titleWithHighlight);\n\t\t\t\t}\n\t\t\t\treturn !!res;\n\t\t\t};\n\t\t}\n\n\t\tthis.enableFilter = true;\n\t\tthis.lastFilterArgs = arguments;\n\n\t\tprevEnableUpdate = this.enableUpdate(false);\n\n\t\tthis.$div.addClass(\"fancytree-ext-filter\");\n\t\tif (hideMode) {\n\t\t\tthis.$div.addClass(\"fancytree-ext-filter-hide\");\n\t\t} else {\n\t\t\tthis.$div.addClass(\"fancytree-ext-filter-dimm\");\n\t\t}\n\t\tthis.$div.toggleClass(\n\t\t\t\"fancytree-ext-filter-hide-expanders\",\n\t\t\t!!opts.hideExpanders\n\t\t);\n\t\t// Reset current filter\n\t\tthis.rootNode.subMatchCount = 0;\n\t\tthis.visit(function (node) {\n\t\t\tdelete node.match;\n\t\t\tdelete node.titleWithHighlight;\n\t\t\tnode.subMatchCount = 0;\n\t\t});\n\t\tstatusNode = this.getRootNode()._findDirectChild(KeyNoData);\n\t\tif (statusNode) {\n\t\t\tstatusNode.remove();\n\t\t}\n\n\t\t// Adjust node.hide, .match, and .subMatchCount properties\n\t\ttreeOpts.autoCollapse = false; // #528\n\n\t\tthis.visit(function (node) {\n\t\t\tif (leavesOnly && node.children != null) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar res = filter(node),\n\t\t\t\tmatchedByBranch = false;\n\n\t\t\tif (res === \"skip\") {\n\t\t\t\tnode.visit(function (c) {\n\t\t\t\t\tc.match = false;\n\t\t\t\t}, true);\n\t\t\t\treturn \"skip\";\n\t\t\t}\n\t\t\tif (!res && (branchMode || res === \"branch\") && node.parent.match) {\n\t\t\t\tres = true;\n\t\t\t\tmatchedByBranch = true;\n\t\t\t}\n\t\t\tif (res) {\n\t\t\t\tcount++;\n\t\t\t\tnode.match = true;\n\t\t\t\tnode.visitParents(function (p) {\n\t\t\t\t\tif (p !== node) {\n\t\t\t\t\t\tp.subMatchCount += 1;\n\t\t\t\t\t}\n\t\t\t\t\t// Expand match (unless this is no real match, but only a node in a matched branch)\n\t\t\t\t\tif (opts.autoExpand && !matchedByBranch && !p.expanded) {\n\t\t\t\t\t\tp.setExpanded(true, {\n\t\t\t\t\t\t\tnoAnimation: true,\n\t\t\t\t\t\t\tnoEvents: true,\n\t\t\t\t\t\t\tscrollIntoView: false,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tp._filterAutoExpanded = true;\n\t\t\t\t\t}\n\t\t\t\t}, true);\n\t\t\t}\n\t\t});\n\t\ttreeOpts.autoCollapse = prevAutoCollapse;\n\n\t\tif (count === 0 && opts.nodata && hideMode) {\n\t\t\tstatusNode = opts.nodata;\n\t\t\tif (typeof statusNode === \"function\") {\n\t\t\t\tstatusNode = statusNode();\n\t\t\t}\n\t\t\tif (statusNode === true) {\n\t\t\t\tstatusNode = {};\n\t\t\t} else if (typeof statusNode === \"string\") {\n\t\t\t\tstatusNode = { title: statusNode };\n\t\t\t}\n\t\t\tstatusNode = $.extend(\n\t\t\t\t{\n\t\t\t\t\tstatusNodeType: \"nodata\",\n\t\t\t\t\tkey: KeyNoData,\n\t\t\t\t\ttitle: this.options.strings.noData,\n\t\t\t\t},\n\t\t\t\tstatusNode\n\t\t\t);\n\n\t\t\tthis.getRootNode().addNode(statusNode).match = true;\n\t\t}\n\t\t// Redraw whole tree\n\t\tthis._callHook(\"treeStructureChanged\", this, \"applyFilter\");\n\t\t// this.render();\n\t\tthis.enableUpdate(prevEnableUpdate);\n\t\treturn count;\n\t};\n\n\t/**\n\t * [ext-filter] Dimm or hide nodes.\n\t *\n\t * @param {function | string} filter\n\t * @param {boolean} [opts={autoExpand: false, leavesOnly: false}]\n\t * @returns {integer} count\n\t * @alias Fancytree#filterNodes\n\t * @requires jquery.fancytree.filter.js\n\t */\n\t$.ui.fancytree._FancytreeClass.prototype.filterNodes = function (\n\t\tfilter,\n\t\topts\n\t) {\n\t\tif (typeof opts === \"boolean\") {\n\t\t\topts = { leavesOnly: opts };\n\t\t\tthis.warn(\n\t\t\t\t\"Fancytree.filterNodes() leavesOnly option is deprecated since 2.9.0 / 2015-04-19. Use opts.leavesOnly instead.\"\n\t\t\t);\n\t\t}\n\t\treturn this._applyFilterImpl(filter, false, opts);\n\t};\n\n\t/**\n\t * [ext-filter] Dimm or hide whole branches.\n\t *\n\t * @param {function | string} filter\n\t * @param {boolean} [opts={autoExpand: false}]\n\t * @returns {integer} count\n\t * @alias Fancytree#filterBranches\n\t * @requires jquery.fancytree.filter.js\n\t */\n\t$.ui.fancytree._FancytreeClass.prototype.filterBranches = function (\n\t\tfilter,\n\t\topts\n\t) {\n\t\treturn this._applyFilterImpl(filter, true, opts);\n\t};\n\n\t/**\n\t * [ext-filter] Re-apply current filter.\n\t *\n\t * @returns {integer} count\n\t * @alias Fancytree#updateFilter\n\t * @requires jquery.fancytree.filter.js\n\t * @since 2.38\n\t */\n\t$.ui.fancytree._FancytreeClass.prototype.updateFilter = function () {\n\t\tif (\n\t\t\tthis.enableFilter &&\n\t\t\tthis.lastFilterArgs &&\n\t\t\tthis.options.filter.autoApply\n\t\t) {\n\t\t\tthis._applyFilterImpl.apply(this, this.lastFilterArgs);\n\t\t} else {\n\t\t\tthis.warn(\"updateFilter(): no filter active.\");\n\t\t}\n\t};\n\n\t/**\n\t * [ext-filter] Reset the filter.\n\t *\n\t * @alias Fancytree#clearFilter\n\t * @requires jquery.fancytree.filter.js\n\t */\n\t$.ui.fancytree._FancytreeClass.prototype.clearFilter = function () {\n\t\tvar $title,\n\t\t\tstatusNode = this.getRootNode()._findDirectChild(KeyNoData),\n\t\t\tescapeTitles = this.options.escapeTitles,\n\t\t\tenhanceTitle = this.options.enhanceTitle,\n\t\t\tprevEnableUpdate = this.enableUpdate(false);\n\n\t\tif (statusNode) {\n\t\t\tstatusNode.remove();\n\t\t}\n\t\t// we also counted root node's subMatchCount\n\t\tdelete this.rootNode.match;\n\t\tdelete this.rootNode.subMatchCount;\n\n\t\tthis.visit(function (node) {\n\t\t\tif (node.match && node.span) {\n\t\t\t\t// #491, #601\n\t\t\t\t$title = $(node.span).find(\">span.fancytree-title\");\n\t\t\t\tif (escapeTitles) {\n\t\t\t\t\t$title.text(node.title);\n\t\t\t\t} else {\n\t\t\t\t\t$title.html(node.title);\n\t\t\t\t}\n\t\t\t\tif (enhanceTitle) {\n\t\t\t\t\tenhanceTitle(\n\t\t\t\t\t\t{ type: \"enhanceTitle\" },\n\t\t\t\t\t\t{ node: node, $title: $title }\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tdelete node.match;\n\t\t\tdelete node.subMatchCount;\n\t\t\tdelete node.titleWithHighlight;\n\t\t\tif (node.$subMatchBadge) {\n\t\t\t\tnode.$subMatchBadge.remove();\n\t\t\t\tdelete node.$subMatchBadge;\n\t\t\t}\n\t\t\tif (node._filterAutoExpanded && node.expanded) {\n\t\t\t\tnode.setExpanded(false, {\n\t\t\t\t\tnoAnimation: true,\n\t\t\t\t\tnoEvents: true,\n\t\t\t\t\tscrollIntoView: false,\n\t\t\t\t});\n\t\t\t}\n\t\t\tdelete node._filterAutoExpanded;\n\t\t});\n\t\tthis.enableFilter = false;\n\t\tthis.lastFilterArgs = null;\n\t\tthis.$div.removeClass(\n\t\t\t\"fancytree-ext-filter fancytree-ext-filter-dimm fancytree-ext-filter-hide\"\n\t\t);\n\t\tthis._callHook(\"treeStructureChanged\", this, \"clearFilter\");\n\t\t// this.render();\n\t\tthis.enableUpdate(prevEnableUpdate);\n\t};\n\n\t/**\n\t * [ext-filter] Return true if a filter is currently applied.\n\t *\n\t * @returns {Boolean}\n\t * @alias Fancytree#isFilterActive\n\t * @requires jquery.fancytree.filter.js\n\t * @since 2.13\n\t */\n\t$.ui.fancytree._FancytreeClass.prototype.isFilterActive = function () {\n\t\treturn !!this.enableFilter;\n\t};\n\n\t/**\n\t * [ext-filter] Return true if this node is matched by current filter (or no filter is active).\n\t *\n\t * @returns {Boolean}\n\t * @alias FancytreeNode#isMatched\n\t * @requires jquery.fancytree.filter.js\n\t * @since 2.13\n\t */\n\t$.ui.fancytree._FancytreeNodeClass.prototype.isMatched = function () {\n\t\treturn !(this.tree.enableFilter && !this.match);\n\t};\n\n\t/*******************************************************************************\n\t * Extension code\n\t */\n\t$.ui.fancytree.registerExtension({\n\t\tname: \"filter\",\n\t\tversion: \"2.38.3\",\n\t\t// Default options for this extension.\n\t\toptions: {\n\t\t\tautoApply: true, // Re-apply last filter if lazy data is loaded\n\t\t\tautoExpand: false, // Expand all branches that contain matches while filtered\n\t\t\tcounter: true, // Show a badge with number of matching child nodes near parent icons\n\t\t\tfuzzy: false, // Match single characters in order, e.g. 'fb' will match 'FooBar'\n\t\t\thideExpandedCounter: true, // Hide counter badge if parent is expanded\n\t\t\thideExpanders: false, // Hide expanders if all child nodes are hidden by filter\n\t\t\thighlight: true, // Highlight matches by wrapping inside <mark> tags\n\t\t\tleavesOnly: false, // Match end nodes only\n\t\t\tnodata: true, // Display a 'no data' status node if result is empty\n\t\t\tmode: \"dimm\", // Grayout unmatched nodes (pass \"hide\" to remove unmatched node instead)\n\t\t},\n\t\tnodeLoadChildren: function (ctx, source) {\n\t\t\tvar tree = ctx.tree;\n\n\t\t\treturn this._superApply(arguments).done(function () {\n\t\t\t\tif (\n\t\t\t\t\ttree.enableFilter &&\n\t\t\t\t\ttree.lastFilterArgs &&\n\t\t\t\t\tctx.options.filter.autoApply\n\t\t\t\t) {\n\t\t\t\t\ttree._applyFilterImpl.apply(tree, tree.lastFilterArgs);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tnodeSetExpanded: function (ctx, flag, callOpts) {\n\t\t\tvar node = ctx.node;\n\n\t\t\tdelete node._filterAutoExpanded;\n\t\t\t// Make sure counter badge is displayed again, when node is beeing collapsed\n\t\t\tif (\n\t\t\t\t!flag &&\n\t\t\t\tctx.options.filter.hideExpandedCounter &&\n\t\t\t\tnode.$subMatchBadge\n\t\t\t) {\n\t\t\t\tnode.$subMatchBadge.show();\n\t\t\t}\n\t\t\treturn this._superApply(arguments);\n\t\t},\n\t\tnodeRenderStatus: function (ctx) {\n\t\t\t// Set classes for current status\n\t\t\tvar res,\n\t\t\t\tnode = ctx.node,\n\t\t\t\ttree = ctx.tree,\n\t\t\t\topts = ctx.options.filter,\n\t\t\t\t$title = $(node.span).find(\"span.fancytree-title\"),\n\t\t\t\t$span = $(node[tree.statusClassPropName]),\n\t\t\t\tenhanceTitle = ctx.options.enhanceTitle,\n\t\t\t\tescapeTitles = ctx.options.escapeTitles;\n\n\t\t\tres = this._super(ctx);\n\t\t\t// nothing to do, if node was not yet rendered\n\t\t\tif (!$span.length || !tree.enableFilter) {\n\t\t\t\treturn res;\n\t\t\t}\n\t\t\t$span\n\t\t\t\t.toggleClass(\"fancytree-match\", !!node.match)\n\t\t\t\t.toggleClass(\"fancytree-submatch\", !!node.subMatchCount)\n\t\t\t\t.toggleClass(\n\t\t\t\t\t\"fancytree-hide\",\n\t\t\t\t\t!(node.match || node.subMatchCount)\n\t\t\t\t);\n\t\t\t// Add/update counter badge\n\t\t\tif (\n\t\t\t\topts.counter &&\n\t\t\t\tnode.subMatchCount &&\n\t\t\t\t(!node.isExpanded() || !opts.hideExpandedCounter)\n\t\t\t) {\n\t\t\t\tif (!node.$subMatchBadge) {\n\t\t\t\t\tnode.$subMatchBadge = $(\n\t\t\t\t\t\t\"<span class='fancytree-childcounter'/>\"\n\t\t\t\t\t);\n\t\t\t\t\t$(\n\t\t\t\t\t\t\"span.fancytree-icon, span.fancytree-custom-icon\",\n\t\t\t\t\t\tnode.span\n\t\t\t\t\t).append(node.$subMatchBadge);\n\t\t\t\t}\n\t\t\t\tnode.$subMatchBadge.show().text(node.subMatchCount);\n\t\t\t} else if (node.$subMatchBadge) {\n\t\t\t\tnode.$subMatchBadge.hide();\n\t\t\t}\n\t\t\t// node.debug(\"nodeRenderStatus\", node.titleWithHighlight, node.title)\n\t\t\t// #601: also check for $title.length, because we don't need to render\n\t\t\t// if node.span is null (i.e. not rendered)\n\t\t\tif (node.span && (!node.isEditing || !node.isEditing.call(node))) {\n\t\t\t\tif (node.titleWithHighlight) {\n\t\t\t\t\t$title.html(node.titleWithHighlight);\n\t\t\t\t} else if (escapeTitles) {\n\t\t\t\t\t$title.text(node.title);\n\t\t\t\t} else {\n\t\t\t\t\t$title.html(node.title);\n\t\t\t\t}\n\t\t\t\tif (enhanceTitle) {\n\t\t\t\t\tenhanceTitle(\n\t\t\t\t\t\t{ type: \"enhanceTitle\" },\n\t\t\t\t\t\t{ node: node, $title: $title }\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn res;\n\t\t},\n\t});\n\t// Value returned by `require('jquery.fancytree..')`\n\treturn $.ui.fancytree;\n}); // End of closure\n","/*!\n * jquery.fancytree.table.js\n *\n * Render tree as table (aka 'tree grid', 'table tree').\n * (Extension module for jquery.fancytree.js: https://github.com/mar10/fancytree/)\n *\n * Copyright (c) 2008-2023, Martin Wendt (https://wwWendt.de)\n *\n * Released under the MIT license\n * https://github.com/mar10/fancytree/wiki/LicenseInfo\n *\n * @version 2.38.3\n * @date 2023-02-01T20:52:50Z\n */\n\n(function (factory) {\n\tif (typeof define === \"function\" && define.amd) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([\"jquery\", \"./jquery.fancytree\"], factory);\n\t} else if (typeof module === \"object\" && module.exports) {\n\t\t// Node/CommonJS\n\t\trequire(\"./jquery.fancytree\");\n\t\tmodule.exports = factory(require(\"jquery\"));\n\t} else {\n\t\t// Browser globals\n\t\tfactory(jQuery);\n\t}\n})(function ($) {\n\t\"use strict\";\n\n\t/******************************************************************************\n\t * Private functions and variables\n\t */\n\tvar _assert = $.ui.fancytree.assert;\n\n\tfunction insertFirstChild(referenceNode, newNode) {\n\t\treferenceNode.insertBefore(newNode, referenceNode.firstChild);\n\t}\n\n\tfunction insertSiblingAfter(referenceNode, newNode) {\n\t\treferenceNode.parentNode.insertBefore(\n\t\t\tnewNode,\n\t\t\treferenceNode.nextSibling\n\t\t);\n\t}\n\n\t/* Show/hide all rows that are structural descendants of `parent`. */\n\tfunction setChildRowVisibility(parent, flag) {\n\t\tparent.visit(function (node) {\n\t\t\tvar tr = node.tr;\n\t\t\t// currentFlag = node.hide ? false : flag; // fix for ext-filter\n\t\t\tif (tr) {\n\t\t\t\ttr.style.display = node.hide || !flag ? \"none\" : \"\";\n\t\t\t}\n\t\t\tif (!node.expanded) {\n\t\t\t\treturn \"skip\";\n\t\t\t}\n\t\t});\n\t}\n\n\t/* Find node that is rendered in previous row. */\n\tfunction findPrevRowNode(node) {\n\t\tvar i,\n\t\t\tlast,\n\t\t\tprev,\n\t\t\tparent = node.parent,\n\t\t\tsiblings = parent ? parent.children : null;\n\n\t\tif (siblings && siblings.length > 1 && siblings[0] !== node) {\n\t\t\t// use the lowest descendant of the preceeding sibling\n\t\t\ti = $.inArray(node, siblings);\n\t\t\tprev = siblings[i - 1];\n\t\t\t_assert(prev.tr);\n\t\t\t// descend to lowest child (with a <tr> tag)\n\t\t\twhile (prev.children && prev.children.length) {\n\t\t\t\tlast = prev.children[prev.children.length - 1];\n\t\t\t\tif (!last.tr) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tprev = last;\n\t\t\t}\n\t\t} else {\n\t\t\t// if there is no preceding sibling, use the direct parent\n\t\t\tprev = parent;\n\t\t}\n\t\treturn prev;\n\t}\n\n\t$.ui.fancytree.registerExtension({\n\t\tname: \"table\",\n\t\tversion: \"2.38.3\",\n\t\t// Default options for this extension.\n\t\toptions: {\n\t\t\tcheckboxColumnIdx: null, // render the checkboxes into the this column index (default: nodeColumnIdx)\n\t\t\tindentation: 16, // indent every node level by 16px\n\t\t\tmergeStatusColumns: true, // display 'nodata', 'loading', 'error' centered in a single, merged TR\n\t\t\tnodeColumnIdx: 0, // render node expander, icon, and title to this column (default: #0)\n\t\t},\n\t\t// Overide virtual methods for this extension.\n\t\t// `this`       : is this extension object\n\t\t// `this._super`: the virtual function that was overriden (member of prev. extension or Fancytree)\n\t\ttreeInit: function (ctx) {\n\t\t\tvar i,\n\t\t\t\tn,\n\t\t\t\t$row,\n\t\t\t\t$tbody,\n\t\t\t\ttree = ctx.tree,\n\t\t\t\topts = ctx.options,\n\t\t\t\ttableOpts = opts.table,\n\t\t\t\t$table = tree.widget.element;\n\n\t\t\tif (tableOpts.customStatus != null) {\n\t\t\t\tif (opts.renderStatusColumns == null) {\n\t\t\t\t\ttree.warn(\n\t\t\t\t\t\t\"The 'customStatus' option is deprecated since v2.15.0. Use 'renderStatusColumns' instead.\"\n\t\t\t\t\t);\n\t\t\t\t\topts.renderStatusColumns = tableOpts.customStatus;\n\t\t\t\t} else {\n\t\t\t\t\t$.error(\n\t\t\t\t\t\t\"The 'customStatus' option is deprecated since v2.15.0. Use 'renderStatusColumns' only instead.\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (opts.renderStatusColumns) {\n\t\t\t\tif (opts.renderStatusColumns === true) {\n\t\t\t\t\topts.renderStatusColumns = opts.renderColumns;\n\t\t\t\t\t// } else if( opts.renderStatusColumns === \"wide\" ) {\n\t\t\t\t\t// \topts.renderStatusColumns = _renderStatusNodeWide;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$table.addClass(\"fancytree-container fancytree-ext-table\");\n\t\t\t$tbody = $table.find(\">tbody\");\n\t\t\tif (!$tbody.length) {\n\t\t\t\t// TODO: not sure if we can rely on browsers to insert missing <tbody> before <tr>s:\n\t\t\t\tif ($table.find(\">tr\").length) {\n\t\t\t\t\t$.error(\n\t\t\t\t\t\t\"Expected table > tbody > tr. If you see this please open an issue.\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t$tbody = $(\"<tbody>\").appendTo($table);\n\t\t\t}\n\n\t\t\ttree.tbody = $tbody[0];\n\n\t\t\t// Prepare row templates:\n\t\t\t// Determine column count from table header if any\n\t\t\ttree.columnCount = $(\"thead >tr\", $table)\n\t\t\t\t.last()\n\t\t\t\t.find(\">th\", $table).length;\n\t\t\t// Read TR templates from tbody if any\n\t\t\t$row = $tbody.children(\"tr\").first();\n\t\t\tif ($row.length) {\n\t\t\t\tn = $row.children(\"td\").length;\n\t\t\t\tif (tree.columnCount && n !== tree.columnCount) {\n\t\t\t\t\ttree.warn(\n\t\t\t\t\t\t\"Column count mismatch between thead (\" +\n\t\t\t\t\t\t\ttree.columnCount +\n\t\t\t\t\t\t\t\") and tbody (\" +\n\t\t\t\t\t\t\tn +\n\t\t\t\t\t\t\t\"): using tbody.\"\n\t\t\t\t\t);\n\t\t\t\t\ttree.columnCount = n;\n\t\t\t\t}\n\t\t\t\t$row = $row.clone();\n\t\t\t} else {\n\t\t\t\t// Only thead is defined: create default row markup\n\t\t\t\t_assert(\n\t\t\t\t\ttree.columnCount >= 1,\n\t\t\t\t\t\"Need either <thead> or <tbody> with <td> elements to determine column count.\"\n\t\t\t\t);\n\t\t\t\t$row = $(\"<tr />\");\n\t\t\t\tfor (i = 0; i < tree.columnCount; i++) {\n\t\t\t\t\t$row.append(\"<td />\");\n\t\t\t\t}\n\t\t\t}\n\t\t\t$row.find(\">td\")\n\t\t\t\t.eq(tableOpts.nodeColumnIdx)\n\t\t\t\t.html(\"<span class='fancytree-node' />\");\n\t\t\tif (opts.aria) {\n\t\t\t\t$row.attr(\"role\", \"row\");\n\t\t\t\t$row.find(\"td\").attr(\"role\", \"gridcell\");\n\t\t\t}\n\t\t\ttree.rowFragment = document.createDocumentFragment();\n\t\t\ttree.rowFragment.appendChild($row.get(0));\n\n\t\t\t// // If tbody contains a second row, use this as status node template\n\t\t\t// $row = $tbody.children(\"tr\").eq(1);\n\t\t\t// if( $row.length === 0 ) {\n\t\t\t// \ttree.statusRowFragment = tree.rowFragment;\n\t\t\t// } else {\n\t\t\t// \t$row = $row.clone();\n\t\t\t// \ttree.statusRowFragment = document.createDocumentFragment();\n\t\t\t// \ttree.statusRowFragment.appendChild($row.get(0));\n\t\t\t// }\n\t\t\t//\n\t\t\t$tbody.empty();\n\n\t\t\t// Make sure that status classes are set on the node's <tr> elements\n\t\t\ttree.statusClassPropName = \"tr\";\n\t\t\ttree.ariaPropName = \"tr\";\n\t\t\tthis.nodeContainerAttrName = \"tr\";\n\n\t\t\t// #489: make sure $container is set to <table>, even if ext-dnd is listed before ext-table\n\t\t\ttree.$container = $table;\n\n\t\t\tthis._superApply(arguments);\n\n\t\t\t// standard Fancytree created a root UL\n\t\t\t$(tree.rootNode.ul).remove();\n\t\t\ttree.rootNode.ul = null;\n\n\t\t\t// Add container to the TAB chain\n\t\t\t// #577: Allow to set tabindex to \"0\", \"-1\" and \"\"\n\t\t\tthis.$container.attr(\"tabindex\", opts.tabindex);\n\t\t\t// this.$container.attr(\"tabindex\", opts.tabbable ? \"0\" : \"-1\");\n\t\t\tif (opts.aria) {\n\t\t\t\ttree.$container\n\t\t\t\t\t.attr(\"role\", \"treegrid\")\n\t\t\t\t\t.attr(\"aria-readonly\", true);\n\t\t\t}\n\t\t},\n\t\tnodeRemoveChildMarkup: function (ctx) {\n\t\t\tvar node = ctx.node;\n\t\t\t//\t\tnode.debug(\"nodeRemoveChildMarkup()\");\n\t\t\tnode.visit(function (n) {\n\t\t\t\tif (n.tr) {\n\t\t\t\t\t$(n.tr).remove();\n\t\t\t\t\tn.tr = null;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tnodeRemoveMarkup: function (ctx) {\n\t\t\tvar node = ctx.node;\n\t\t\t//\t\tnode.debug(\"nodeRemoveMarkup()\");\n\t\t\tif (node.tr) {\n\t\t\t\t$(node.tr).remove();\n\t\t\t\tnode.tr = null;\n\t\t\t}\n\t\t\tthis.nodeRemoveChildMarkup(ctx);\n\t\t},\n\t\t/* Override standard render. */\n\t\tnodeRender: function (ctx, force, deep, collapsed, _recursive) {\n\t\t\tvar children,\n\t\t\t\tfirstTr,\n\t\t\t\ti,\n\t\t\t\tl,\n\t\t\t\tnewRow,\n\t\t\t\tprevNode,\n\t\t\t\tprevTr,\n\t\t\t\tsubCtx,\n\t\t\t\ttree = ctx.tree,\n\t\t\t\tnode = ctx.node,\n\t\t\t\topts = ctx.options,\n\t\t\t\tisRootNode = !node.parent;\n\n\t\t\tif (tree._enableUpdate === false) {\n\t\t\t\t// $.ui.fancytree.debug(\"*** nodeRender _enableUpdate: false\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!_recursive) {\n\t\t\t\tctx.hasCollapsedParents = node.parent && !node.parent.expanded;\n\t\t\t}\n\t\t\t// $.ui.fancytree.debug(\"*** nodeRender \" + node + \", isRoot=\" + isRootNode, \"tr=\" + node.tr, \"hcp=\" + ctx.hasCollapsedParents, \"parent.tr=\" + (node.parent && node.parent.tr));\n\t\t\tif (!isRootNode) {\n\t\t\t\tif (node.tr && force) {\n\t\t\t\t\tthis.nodeRemoveMarkup(ctx);\n\t\t\t\t}\n\t\t\t\tif (node.tr) {\n\t\t\t\t\tif (force) {\n\t\t\t\t\t\t// Set icon, link, and title (normally this is only required on initial render)\n\t\t\t\t\t\tthis.nodeRenderTitle(ctx); // triggers renderColumns()\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Update element classes according to node state\n\t\t\t\t\t\tthis.nodeRenderStatus(ctx);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (ctx.hasCollapsedParents && !deep) {\n\t\t\t\t\t\t// #166: we assume that the parent will be (recursively) rendered\n\t\t\t\t\t\t// later anyway.\n\t\t\t\t\t\t// node.debug(\"nodeRender ignored due to unrendered parent\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t// Create new <tr> after previous row\n\t\t\t\t\t// if( node.isStatusNode() ) {\n\t\t\t\t\t// \tnewRow = tree.statusRowFragment.firstChild.cloneNode(true);\n\t\t\t\t\t// } else {\n\t\t\t\t\tnewRow = tree.rowFragment.firstChild.cloneNode(true);\n\t\t\t\t\t// }\n\t\t\t\t\tprevNode = findPrevRowNode(node);\n\t\t\t\t\t// $.ui.fancytree.debug(\"*** nodeRender \" + node + \": prev: \" + prevNode.key);\n\t\t\t\t\t_assert(prevNode);\n\t\t\t\t\tif (collapsed === true && _recursive) {\n\t\t\t\t\t\t// hide all child rows, so we can use an animation to show it later\n\t\t\t\t\t\tnewRow.style.display = \"none\";\n\t\t\t\t\t} else if (deep && ctx.hasCollapsedParents) {\n\t\t\t\t\t\t// also hide this row if deep === true but any parent is collapsed\n\t\t\t\t\t\tnewRow.style.display = \"none\";\n\t\t\t\t\t\t//\t\t\t\t\tnewRow.style.color = \"red\";\n\t\t\t\t\t}\n\t\t\t\t\tif (prevNode.tr) {\n\t\t\t\t\t\tinsertSiblingAfter(prevNode.tr, newRow);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_assert(\n\t\t\t\t\t\t\t!prevNode.parent,\n\t\t\t\t\t\t\t\"prev. row must have a tr, or be system root\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// tree.tbody.appendChild(newRow);\n\t\t\t\t\t\tinsertFirstChild(tree.tbody, newRow); // #675\n\t\t\t\t\t}\n\t\t\t\t\tnode.tr = newRow;\n\t\t\t\t\tif (node.key && opts.generateIds) {\n\t\t\t\t\t\tnode.tr.id = opts.idPrefix + node.key;\n\t\t\t\t\t}\n\t\t\t\t\tnode.tr.ftnode = node;\n\t\t\t\t\t// if(opts.aria){\n\t\t\t\t\t// \t$(node.tr).attr(\"aria-labelledby\", \"ftal_\" + opts.idPrefix + node.key);\n\t\t\t\t\t// }\n\t\t\t\t\tnode.span = $(\"span.fancytree-node\", node.tr).get(0);\n\t\t\t\t\t// Set icon, link, and title (normally this is only required on initial render)\n\t\t\t\t\tthis.nodeRenderTitle(ctx);\n\t\t\t\t\t// Allow tweaking, binding, after node was created for the first time\n\t\t\t\t\t//\t\t\t\ttree._triggerNodeEvent(\"createNode\", ctx);\n\t\t\t\t\tif (opts.createNode) {\n\t\t\t\t\t\topts.createNode.call(tree, { type: \"createNode\" }, ctx);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Allow tweaking after node state was rendered\n\t\t\t//\t\ttree._triggerNodeEvent(\"renderNode\", ctx);\n\t\t\tif (opts.renderNode) {\n\t\t\t\topts.renderNode.call(tree, { type: \"renderNode\" }, ctx);\n\t\t\t}\n\t\t\t// Visit child nodes\n\t\t\t// Add child markup\n\t\t\tchildren = node.children;\n\t\t\tif (children && (isRootNode || deep || node.expanded)) {\n\t\t\t\tfor (i = 0, l = children.length; i < l; i++) {\n\t\t\t\t\tsubCtx = $.extend({}, ctx, { node: children[i] });\n\t\t\t\t\tsubCtx.hasCollapsedParents =\n\t\t\t\t\t\tsubCtx.hasCollapsedParents || !node.expanded;\n\t\t\t\t\tthis.nodeRender(subCtx, force, deep, collapsed, true);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Make sure, that <tr> order matches node.children order.\n\t\t\tif (children && !_recursive) {\n\t\t\t\t// we only have to do it once, for the root branch\n\t\t\t\tprevTr = node.tr || null;\n\t\t\t\tfirstTr = tree.tbody.firstChild;\n\t\t\t\t// Iterate over all descendants\n\t\t\t\tnode.visit(function (n) {\n\t\t\t\t\tif (n.tr) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!n.parent.expanded &&\n\t\t\t\t\t\t\tn.tr.style.display !== \"none\"\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// fix after a node was dropped over a collapsed\n\t\t\t\t\t\t\tn.tr.style.display = \"none\";\n\t\t\t\t\t\t\tsetChildRowVisibility(n, false);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (n.tr.previousSibling !== prevTr) {\n\t\t\t\t\t\t\tnode.debug(\"_fixOrder: mismatch at node: \" + n);\n\t\t\t\t\t\t\tvar nextTr = prevTr ? prevTr.nextSibling : firstTr;\n\t\t\t\t\t\t\ttree.tbody.insertBefore(n.tr, nextTr);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tprevTr = n.tr;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Update element classes according to node state\n\t\t\t// if(!isRootNode){\n\t\t\t// \tthis.nodeRenderStatus(ctx);\n\t\t\t// }\n\t\t},\n\t\tnodeRenderTitle: function (ctx, title) {\n\t\t\tvar $cb,\n\t\t\t\tres,\n\t\t\t\ttree = ctx.tree,\n\t\t\t\tnode = ctx.node,\n\t\t\t\topts = ctx.options,\n\t\t\t\tisStatusNode = node.isStatusNode();\n\n\t\t\tres = this._super(ctx, title);\n\n\t\t\tif (node.isRootNode()) {\n\t\t\t\treturn res;\n\t\t\t}\n\t\t\t// Move checkbox to custom column\n\t\t\tif (\n\t\t\t\topts.checkbox &&\n\t\t\t\t!isStatusNode &&\n\t\t\t\topts.table.checkboxColumnIdx != null\n\t\t\t) {\n\t\t\t\t$cb = $(\"span.fancytree-checkbox\", node.span); //.detach();\n\t\t\t\t$(node.tr)\n\t\t\t\t\t.find(\"td\")\n\t\t\t\t\t.eq(+opts.table.checkboxColumnIdx)\n\t\t\t\t\t.html($cb);\n\t\t\t}\n\t\t\t// Update element classes according to node state\n\t\t\tthis.nodeRenderStatus(ctx);\n\n\t\t\tif (isStatusNode) {\n\t\t\t\tif (opts.renderStatusColumns) {\n\t\t\t\t\t// Let user code write column content\n\t\t\t\t\topts.renderStatusColumns.call(\n\t\t\t\t\t\ttree,\n\t\t\t\t\t\t{ type: \"renderStatusColumns\" },\n\t\t\t\t\t\tctx\n\t\t\t\t\t);\n\t\t\t\t} else if (opts.table.mergeStatusColumns && node.isTopLevel()) {\n\t\t\t\t\t$(node.tr)\n\t\t\t\t\t\t.find(\">td\")\n\t\t\t\t\t\t.eq(0)\n\t\t\t\t\t\t.prop(\"colspan\", tree.columnCount)\n\t\t\t\t\t\t.text(node.title)\n\t\t\t\t\t\t.addClass(\"fancytree-status-merged\")\n\t\t\t\t\t\t.nextAll()\n\t\t\t\t\t\t.remove();\n\t\t\t\t} // else: default rendering for status node: leave other cells empty\n\t\t\t} else if (opts.renderColumns) {\n\t\t\t\topts.renderColumns.call(tree, { type: \"renderColumns\" }, ctx);\n\t\t\t}\n\t\t\treturn res;\n\t\t},\n\t\tnodeRenderStatus: function (ctx) {\n\t\t\tvar indent,\n\t\t\t\tnode = ctx.node,\n\t\t\t\topts = ctx.options;\n\n\t\t\tthis._super(ctx);\n\n\t\t\t$(node.tr).removeClass(\"fancytree-node\");\n\t\t\t// indent\n\t\t\tindent = (node.getLevel() - 1) * opts.table.indentation;\n\t\t\tif (opts.rtl) {\n\t\t\t\t$(node.span).css({ paddingRight: indent + \"px\" });\n\t\t\t} else {\n\t\t\t\t$(node.span).css({ paddingLeft: indent + \"px\" });\n\t\t\t}\n\t\t},\n\t\t/* Expand node, return Deferred.promise. */\n\t\tnodeSetExpanded: function (ctx, flag, callOpts) {\n\t\t\t// flag defaults to true\n\t\t\tflag = flag !== false;\n\n\t\t\tif ((ctx.node.expanded && flag) || (!ctx.node.expanded && !flag)) {\n\t\t\t\t// Expanded state isn't changed - just call base implementation\n\t\t\t\treturn this._superApply(arguments);\n\t\t\t}\n\n\t\t\tvar dfd = new $.Deferred(),\n\t\t\t\tsubOpts = $.extend({}, callOpts, {\n\t\t\t\t\tnoEvents: true,\n\t\t\t\t\tnoAnimation: true,\n\t\t\t\t});\n\n\t\t\tcallOpts = callOpts || {};\n\n\t\t\tfunction _afterExpand(ok, args) {\n\t\t\t\t// ctx.tree.info(\"ok:\" + ok, args);\n\t\t\t\tif (ok) {\n\t\t\t\t\t// #1108 minExpandLevel: 2 together with table extension does not work\n\t\t\t\t\t// don't call when 'ok' is false:\n\t\t\t\t\tsetChildRowVisibility(ctx.node, flag);\n\t\t\t\t\tif (\n\t\t\t\t\t\tflag &&\n\t\t\t\t\t\tctx.options.autoScroll &&\n\t\t\t\t\t\t!callOpts.noAnimation &&\n\t\t\t\t\t\tctx.node.hasChildren()\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Scroll down to last child, but keep current node visible\n\t\t\t\t\t\tctx.node\n\t\t\t\t\t\t\t.getLastChild()\n\t\t\t\t\t\t\t.scrollIntoView(true, { topNode: ctx.node })\n\t\t\t\t\t\t\t.always(function () {\n\t\t\t\t\t\t\t\tif (!callOpts.noEvents) {\n\t\t\t\t\t\t\t\t\tctx.tree._triggerNodeEvent(\n\t\t\t\t\t\t\t\t\t\tflag ? \"expand\" : \"collapse\",\n\t\t\t\t\t\t\t\t\t\tctx\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tdfd.resolveWith(ctx.node);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (!callOpts.noEvents) {\n\t\t\t\t\t\t\tctx.tree._triggerNodeEvent(\n\t\t\t\t\t\t\t\tflag ? \"expand\" : \"collapse\",\n\t\t\t\t\t\t\t\tctx\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdfd.resolveWith(ctx.node);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (!callOpts.noEvents) {\n\t\t\t\t\t\tctx.tree._triggerNodeEvent(\n\t\t\t\t\t\t\tflag ? \"expand\" : \"collapse\",\n\t\t\t\t\t\t\tctx\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tdfd.rejectWith(ctx.node);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Call base-expand with disabled events and animation\n\t\t\tthis._super(ctx, flag, subOpts)\n\t\t\t\t.done(function () {\n\t\t\t\t\t_afterExpand(true, arguments);\n\t\t\t\t})\n\t\t\t\t.fail(function () {\n\t\t\t\t\t_afterExpand(false, arguments);\n\t\t\t\t});\n\t\t\treturn dfd.promise();\n\t\t},\n\t\tnodeSetStatus: function (ctx, status, message, details) {\n\t\t\tif (status === \"ok\") {\n\t\t\t\tvar node = ctx.node,\n\t\t\t\t\tfirstChild = node.children ? node.children[0] : null;\n\t\t\t\tif (firstChild && firstChild.isStatusNode()) {\n\t\t\t\t\t$(firstChild.tr).remove();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this._superApply(arguments);\n\t\t},\n\t\ttreeClear: function (ctx) {\n\t\t\tthis.nodeRemoveChildMarkup(this._makeHookContext(this.rootNode));\n\t\t\treturn this._superApply(arguments);\n\t\t},\n\t\ttreeDestroy: function (ctx) {\n\t\t\tthis.$container.find(\"tbody\").empty();\n\t\t\tif (this.$source) {\n\t\t\t\tthis.$source.removeClass(\"fancytree-helper-hidden\");\n\t\t\t}\n\t\t\treturn this._superApply(arguments);\n\t\t},\n\t\t/*,\n\ttreeSetFocus: function(ctx, flag) {\n//\t        alert(\"treeSetFocus\" + ctx.tree.$container);\n\t\tctx.tree.$container.focus();\n\t\t$.ui.fancytree.focusTree = ctx.tree;\n\t}*/\n\t});\n\t// Value returned by `require('jquery.fancytree..')`\n\treturn $.ui.fancytree;\n}); // End of closure\n","/*!\n * jquery.fancytree.grid.js\n *\n * Render tree as table (aka 'tree grid', 'table tree').\n * (Extension module for jquery.fancytree.js: https://github.com/mar10/fancytree/)\n *\n * Copyright (c) 2008-2023, Martin Wendt (http://wwWendt.de)\n *\n * Released under the MIT license\n * https://github.com/mar10/fancytree/wiki/LicenseInfo\n *\n * @version 2.38.3\n * @date 2023-02-01T20:52:50Z\n */\n\n(function (factory) {\n\tif (typeof define === \"function\" && define.amd) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([\"jquery\", \"./jquery.fancytree\"], factory);\n\t} else if (typeof module === \"object\" && module.exports) {\n\t\t// Node/CommonJS\n\t\trequire(\"./jquery.fancytree\");\n\t\tmodule.exports = factory(require(\"jquery\"));\n\t} else {\n\t\t// Browser globals\n\t\tfactory(jQuery);\n\t}\n})(function ($) {\n\t\"use strict\";\n\n\t/******************************************************************************\n\t * Private functions and variables\n\t */\n\tvar FT = $.ui.fancytree,\n\t\t_assert = FT.assert,\n\t\tSCROLL_MODE = \"wheel\"; // 'wheel' | 'scroll'\n\t// EPS = 1.0;\n\n\t/*\n\t * [ext-grid] ...\n\t *\n\t * @alias Fancytree#_addScrollbar\n\t * @requires jquery.fancytree.grid.js\n\t */\n\tfunction _addScrollbar(table) {\n\t\tvar sbWidth = 10,\n\t\t\t$table = $(table),\n\t\t\tposition = $table.position(),\n\t\t\t// top = $table.find(\"tbody\").position().top,\n\n\t\t\t$sb = $(\"<div>\", {\n\t\t\t\tclass: \"fancytree-scrollbar\",\n\t\t\t\tcss: {\n\t\t\t\t\tborder: \"1px solid gray\",\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\ttop: position.top,\n\t\t\t\t\tleft: position.left + $table.width(),\n\t\t\t\t\twidth: sbWidth,\n\t\t\t\t\theight: $table.find(\"tbody\").height(),\n\t\t\t\t},\n\t\t\t});\n\n\t\t$table\n\t\t\t.css({\n\t\t\t\t\"margin-right\": sbWidth,\n\t\t\t})\n\t\t\t.after($sb);\n\n\t\treturn $sb;\n\t}\n\n\t/*\n\t * [ext-grid] Invalidate renumber status, i.e. trigger renumber next time.\n\t *\n\t * @alias Fancytree#_renumberReset\n\t * @requires jquery.fancytree.grid.js\n\t */\n\t$.ui.fancytree._FancytreeClass.prototype._renumberReset = function () {\n\t\t// this.debug(\"_renumberReset()\");\n\t\tthis.visibleNodeList = null;\n\t};\n\n\t/*\n\t * [ext-grid] Adjust the start value if the content would be outside otherwise.\n\t *\n\t * @alias Fancytree#_fixStart\n\t * @requires jquery.fancytree.grid.js\n\t */\n\t$.ui.fancytree._FancytreeClass.prototype._fixStart = function (\n\t\tstart,\n\t\tapply\n\t) {\n\t\tvar vp = this.viewport,\n\t\t\tnodeList = this.visibleNodeList;\n\n\t\tstart = start == null ? vp.start : start;\n\t\t// this.debug(\"_fixStart(\" + start + \", \" + !!apply + \")\");\n\t\tvar orgStart = start;\n\t\t// Don't scroll down below bottom node\n\t\tif (nodeList) {\n\t\t\tstart = Math.min(start, this.visibleNodeList.length - vp.count);\n\t\t\tstart = Math.max(start, 0, start);\n\t\t\tif (start !== orgStart) {\n\t\t\t\tthis.debug(\"Adjust start \" + orgStart + \" => \" + start);\n\t\t\t\tif (apply) {\n\t\t\t\t\tvp.start = start;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn start;\n\t};\n\n\t/*\n\t * [ext-grid] ...\n\t *\n\t * @alias Fancytree#_shiftViewport\n\t * @requires jquery.fancytree.grid.js\n\t */\n\t$.ui.fancytree._FancytreeClass.prototype._shiftViewport = function (\n\t\tmode,\n\t\tofs\n\t) {\n\t\tthis.debug(\"_shiftViewport\", mode, ofs);\n\t\tswitch (mode) {\n\t\t\tcase \"vscroll\":\n\t\t\t\tif (ofs) {\n\t\t\t\t\tthis.setViewport({\n\t\t\t\t\t\tstart: this.viewport.start + (ofs > 0 ? 1 : -1),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow Error(\"Invalid  mode: \" + mode);\n\t\t}\n\t};\n\n\t/**\n\t * [ext-grid] Return true if viewport cannot be scrolled down any further.\n\t *\n\t * @alias Fancytree#isViewportBottom\n\t * @requires jquery.fancytree.grid.js\n\t */\n\t$.ui.fancytree._FancytreeClass.prototype.isViewportBottom = function () {\n\t\treturn (\n\t\t\tthis.viewport.start + this.viewport.count >=\n\t\t\tthis.visibleNodeList.length\n\t\t);\n\t};\n\n\t/**\n\t * [ext-grid] Define a subset of rows/columns to display and redraw.\n\t *\n\t * @param {object | boolean} options viewport boundaries and status.\n\t *\n\t * @alias Fancytree#setViewport\n\t * @requires jquery.fancytree.grid.js\n\t */\n\t$.ui.fancytree._FancytreeClass.prototype.setViewport = function (opts) {\n\t\tif (typeof opts === \"boolean\") {\n\t\t\tthis.debug(\"setViewport( \" + opts + \")\");\n\t\t\treturn this.setViewport({ enabled: opts });\n\t\t}\n\t\topts = opts || {};\n\t\tvar i,\n\t\t\tcount,\n\t\t\tstart,\n\t\t\tnewRow,\n\t\t\tredrawReason = \"\",\n\t\t\tvp = this.viewport,\n\t\t\tdiffVp = { start: 0, count: 0, enabled: null, force: null },\n\t\t\tnewVp = $.extend({}, vp),\n\t\t\ttrList = this.tbody.children,\n\t\t\ttrCount = trList.length;\n\n\t\t// Sanitize viewport settings and check if we need to redraw\n\t\tthis.debug(\"setViewport(\" + opts.start + \", +\" + opts.count + \")\");\n\t\tif (opts.force) {\n\t\t\tredrawReason += \"force\";\n\t\t\tdiffVp.force = true;\n\t\t}\n\n\t\topts.enabled = opts.enabled !== false; // default to true\n\t\tif (vp.enabled !== opts.enabled) {\n\t\t\tredrawReason += \"enable\";\n\t\t\tnewVp.enabled = diffVp.enabled = opts.enabled;\n\t\t}\n\n\t\tstart = opts.start == null ? vp.start : Math.max(0, +opts.start);\n\t\t// Adjust start value to assure the current content is inside vp\n\t\tstart = this._fixStart(start, false);\n\n\t\tif (vp.start !== +start) {\n\t\t\tredrawReason += \"start\";\n\t\t\tnewVp.start = start;\n\t\t\tdiffVp.start = start - vp.start;\n\t\t}\n\n\t\tcount = opts.count == null ? vp.count : Math.max(1, +opts.count);\n\t\tif (vp.count !== +count) {\n\t\t\tredrawReason += \"count\";\n\t\t\tnewVp.count = count;\n\t\t\tdiffVp.count = count - vp.count;\n\t\t}\n\t\t// if (vp.left !== +opts.left) {\n\t\t// \tdiffVp.left = left - vp.left;\n\t\t// \tnewVp.left = opts.left;\n\t\t// \tredrawReason += \"left\";\n\t\t// }\n\t\t// if (vp.right !== +opts.right) {\n\t\t// \tdiffVp.right = right - vp.right;\n\t\t// \tnewVp.right = opts.right;\n\t\t// \tredrawReason += \"right\";\n\t\t// }\n\n\t\tif (!redrawReason) {\n\t\t\treturn false;\n\t\t}\n\t\t// Let user cancel or modify the update\n\t\tvar info = {\n\t\t\tnext: newVp,\n\t\t\tdiff: diffVp,\n\t\t\treason: redrawReason,\n\t\t\tscrollOnly: redrawReason === \"start\",\n\t\t};\n\t\tif (\n\t\t\t!opts.noEvents &&\n\t\t\tthis._triggerTreeEvent(\"beforeUpdateViewport\", null, info) === false\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\tinfo.prev = $.extend({}, vp);\n\t\tdelete info.next;\n\t\t// vp.enabled = newVp.enabled;\n\t\tvp.start = newVp.start;\n\t\tvp.count = newVp.count;\n\n\t\t// Make sure we have the correct count of TRs\n\t\tvar prevPhase = this.isVpUpdating;\n\n\t\tif (trCount > count) {\n\t\t\tfor (i = 0; i < trCount - count; i++) {\n\t\t\t\tdelete this.tbody.lastChild.ftnode;\n\t\t\t\tthis.tbody.removeChild(this.tbody.lastChild);\n\t\t\t}\n\t\t} else if (trCount < count) {\n\t\t\tfor (i = 0; i < count - trCount; i++) {\n\t\t\t\tnewRow = this.rowFragment.firstChild.cloneNode(true);\n\t\t\t\tthis.tbody.appendChild(newRow);\n\t\t\t}\n\t\t}\n\t\ttrCount = trList.length;\n\n\t\t// Update visible node cache if needed\n\t\tvar force = opts.force;\n\t\tthis.redrawViewport(force);\n\n\t\tif (!opts.noEvents) {\n\t\t\tthis._triggerTreeEvent(\"updateViewport\", null, info);\n\t\t}\n\n\t\tthis.isVpUpdating = prevPhase;\n\t\treturn true;\n\t};\n\n\t/**\n\t * [ext-grid] Calculate the viewport count from current scroll wrapper height.\n\t *\n\t * @alias Fancytree#adjustViewportSize\n\t * @requires jquery.fancytree.grid.js\n\t */\n\t$.ui.fancytree._FancytreeClass.prototype.adjustViewportSize = function () {\n\t\t_assert(\n\t\t\tthis.scrollWrapper,\n\t\t\t\"No parent div.fancytree-grid-container found.\"\n\t\t);\n\t\tif (this.isVpUpdating) {\n\t\t\tthis.debug(\"Ignoring adjustViewportSize() during VP update.\");\n\t\t\treturn;\n\t\t}\n\t\t// Calculate how many rows fit into current container height\n\t\tvar $table = this.$container,\n\t\t\twrapper = this.scrollWrapper,\n\t\t\ttrHeight = $table.find(\">tbody>tr\").first().height() || 0,\n\t\t\ttableHeight = $table.height(),\n\t\t\theadHeight = tableHeight - this.viewport.count * trHeight,\n\t\t\twrapperHeight = wrapper.offsetHeight,\n\t\t\tfree = wrapperHeight - headHeight,\n\t\t\tnewCount = trHeight ? Math.floor(free / trHeight) : 0;\n\n\t\t// console.info(\n\t\t// \t\"set container height\",\n\t\t// \t$(this)\n\t\t// \t\t.parent(\".fancytree-grid-container\")\n\t\t// \t\t.height()\n\t\t// );\n\n\t\tthis.setViewport({ count: newCount });\n\t\t// if (SCROLL_MODE === \"scroll\") {\n\t\t// \t// Add bottom margin to the table, to make sure the wrapper becomes\n\t\t// \t// scrollable\n\t\t// \tvar mb = wrapperHeight - $table.height() - 2.0 * EPS;\n\t\t// \tthis.debug(\"margin-bottom=\" + mb);\n\t\t// \t$table.css(\"margin-bottom\", mb);\n\t\t// }\n\t};\n\n\t/*\n\t * [ext-grid] Calculate the scroll container dimension from the current tree table.\n\t *\n\t * @alias Fancytree#initViewportWrapper\n\t * @requires jquery.fancytree.grid.js\n\t */\n\t$.ui.fancytree._FancytreeClass.prototype._initViewportWrapper =\n\t\tfunction () {\n\t\t\tvar // wrapper = this.scrollWrapper,\n\t\t\t\t// $wrapper = $(wrapper),\n\t\t\t\ttree = this;\n\n\t\t\t// if (SCROLL_MODE === \"scroll\") {\n\t\t\t// \t$wrapper.on(\"scroll\", function(e) {\n\t\t\t// \t\tvar viewport = tree.viewport,\n\t\t\t// \t\t\tcurTop = wrapper.scrollTop,\n\t\t\t// \t\t\thomeTop = viewport.start === 0 ? 0 : EPS,\n\t\t\t// \t\t\tdy = viewport.start === 0 ? 1 : curTop - EPS; //homeTop;\n\n\t\t\t// \t\ttree.debug(\n\t\t\t// \t\t\t\"Got 'scroll' event: scrollTop=\" +\n\t\t\t// \t\t\t\tcurTop +\n\t\t\t// \t\t\t\t\", homeTop=\" +\n\t\t\t// \t\t\t\thomeTop +\n\t\t\t// \t\t\t\t\", start=\" +\n\t\t\t// \t\t\t\tviewport.start +\n\t\t\t// \t\t\t\t\", dy=\" +\n\t\t\t// \t\t\t\tdy\n\t\t\t// \t\t);\n\t\t\t// \t\tif (tree.isVpUpdating) {\n\t\t\t// \t\t\ttree.debug(\"Ignoring scroll during VP update.\");\n\t\t\t// \t\t\treturn;\n\t\t\t// \t\t} else if (curTop === homeTop) {\n\t\t\t// \t\t\ttree.debug(\"Ignoring scroll to neutral \" + homeTop + \".\");\n\t\t\t// \t\t\treturn;\n\t\t\t// \t\t}\n\t\t\t// \t\ttree._shiftViewport(\"vscroll\", dy);\n\t\t\t// \t\thomeTop = viewport.start === 0 ? 0 : EPS;\n\t\t\t// \t\tsetTimeout(function() {\n\t\t\t// \t\t\ttree.debug(\n\t\t\t// \t\t\t\t\"scrollTop(\" +\n\t\t\t// \t\t\t\t\twrapper.scrollTop +\n\t\t\t// \t\t\t\t\t\" -> \" +\n\t\t\t// \t\t\t\t\thomeTop +\n\t\t\t// \t\t\t\t\t\")...\"\n\t\t\t// \t\t\t);\n\t\t\t// \t\t\twrapper.scrollTop = homeTop;\n\t\t\t// \t\t}, 0);\n\t\t\t// \t});\n\t\t\t// }\n\t\t\tif (SCROLL_MODE === \"wheel\") {\n\t\t\t\tthis.$container.on(\"wheel\", function (e) {\n\t\t\t\t\tvar orgEvent = e.originalEvent,\n\t\t\t\t\t\tviewport = tree.viewport,\n\t\t\t\t\t\tdy = orgEvent.deltaY; // * orgEvent.wheelDeltaY;\n\n\t\t\t\t\tif (\n\t\t\t\t\t\t!dy ||\n\t\t\t\t\t\te.altKey ||\n\t\t\t\t\t\te.ctrlKey ||\n\t\t\t\t\t\te.metaKey ||\n\t\t\t\t\t\te.shiftKey\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tif (dy < 0 && viewport.start === 0) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tif (dy > 0 && tree.isViewportBottom()) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\ttree.debug(\n\t\t\t\t\t\t\"Got 'wheel' event: dy=\" +\n\t\t\t\t\t\t\tdy +\n\t\t\t\t\t\t\t\", mode=\" +\n\t\t\t\t\t\t\torgEvent.deltaMode\n\t\t\t\t\t);\n\t\t\t\t\ttree._shiftViewport(\"vscroll\", dy);\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t/*\n\t * [ext-grid] Renumber and collect all visible rows.\n\t *\n\t * @param {bool} [force=false]\n\t * @param {FancytreeNode | int} [startIdx=0]\n\t * @alias Fancytree#_renumberVisibleNodes\n\t * @requires jquery.fancytree.grid.js\n\t */\n\t$.ui.fancytree._FancytreeClass.prototype._renumberVisibleNodes = function (\n\t\tforce,\n\t\tstartIdx\n\t) {\n\t\tif (\n\t\t\t(!this.options.viewport.enabled || this.visibleNodeList != null) &&\n\t\t\tforce !== true\n\t\t) {\n\t\t\t// this.debug(\"_renumberVisibleNodes() ignored.\");\n\t\t\treturn false;\n\t\t}\n\t\tthis.debugTime(\"_renumberVisibleNodes()\");\n\t\tvar i = 0,\n\t\t\tprevLength = this.visibleNodeList ? this.visibleNodeList.length : 0,\n\t\t\tvisibleNodeList = (this.visibleNodeList = []);\n\n\t\t// Reset previous data\n\t\tthis.visit(function (node) {\n\t\t\tnode._rowIdx = null;\n\t\t\t// node.span = null;\n\t\t\t// if (node.tr) {\n\t\t\t// \tdelete node.tr.ftnode;\n\t\t\t// \tnode.tr = null;\n\t\t\t// }\n\t\t});\n\t\t// Iterate over all *visible* nodes\n\t\tthis.visitRows(function (node) {\n\t\t\tnode._rowIdx = i++;\n\t\t\tvisibleNodeList.push(node);\n\t\t});\n\t\tthis.debugTimeEnd(\"_renumberVisibleNodes()\");\n\t\tif (i !== prevLength) {\n\t\t\tthis._triggerTreeEvent(\"updateViewport\", null, {\n\t\t\t\treason: \"renumber\",\n\t\t\t\tdiff: { start: 0, count: 0, enabled: null, force: null },\n\t\t\t\tnext: $.extend({}, this.viewport),\n\t\t\t\t// visibleCount: prevLength,\n\t\t\t\t// cur: i,\n\t\t\t});\n\t\t}\n\t};\n\n\t/**\n\t * [ext-grid] Render all visible nodes into the viweport.\n\t *\n\t * @param {bool} [force=false]\n\t * @alias Fancytree#redrawViewport\n\t * @requires jquery.fancytree.grid.js\n\t */\n\t$.ui.fancytree._FancytreeClass.prototype.redrawViewport = function (force) {\n\t\tif (this._enableUpdate === false) {\n\t\t\t// tree.debug(\"no render\", tree._enableUpdate);\n\t\t\treturn;\n\t\t}\n\t\tthis.debugTime(\"redrawViewport()\");\n\t\tthis._renumberVisibleNodes(force);\n\t\t// Adjust vp.start value to assure the current content is inside:\n\t\tthis._fixStart(null, true);\n\n\t\tvar i = 0,\n\t\t\tvp = this.viewport,\n\t\t\tvisibleNodeList = this.visibleNodeList,\n\t\t\tstart = vp.start,\n\t\t\tbottom = start + vp.count,\n\t\t\ttr,\n\t\t\t_renderCount = 0,\n\t\t\ttrIdx = 0,\n\t\t\ttrList = this.tbody.children,\n\t\t\tprevPhase = this.isVpUpdating;\n\n\t\t// Reset previous data\n\t\tthis.visit(function (node) {\n\t\t\t// node.debug(\"redrawViewport(): _rowIdx=\" + node._rowIdx);\n\t\t\tnode.span = null;\n\t\t\tif (node.tr) {\n\t\t\t\tdelete node.tr.ftnode;\n\t\t\t\tnode.tr = null;\n\t\t\t}\n\t\t});\n\n\t\t// Redraw the whole tree, erasing all node markup before and after\n\t\t// the viewport\n\n\t\tfor (i = start; i < bottom; i++) {\n\t\t\tvar node = visibleNodeList[i];\n\n\t\t\ttr = trList[trIdx];\n\n\t\t\tif (!node) {\n\t\t\t\t// TODO: make trailing empty rows configurable (custom template or remove TRs)\n\t\t\t\tvar newRow = this.rowFragment.firstChild.cloneNode(true);\n\t\t\t\tthis.tbody.replaceChild(newRow, tr);\n\t\t\t\ttrIdx++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (tr !== node.tr) {\n\t\t\t\tnode.tr = tr;\n\t\t\t\tnode.render();\n\t\t\t\t_renderCount++;\n\n\t\t\t\t// TODO:\n\t\t\t\t// Implement scrolling by re-using existing markup\n\t\t\t\t// e.g. shifting TRs or TR child elements instead of\n\t\t\t\t// re-creating all the time\n\t\t\t}\n\t\t\ttrIdx++;\n\t\t}\n\t\tthis.isVpUpdating = prevPhase;\n\t\tthis.debugTimeEnd(\"redrawViewport()\");\n\t};\n\n\t$.ui.fancytree.registerExtension({\n\t\tname: \"grid\",\n\t\tversion: \"2.38.3\",\n\t\t// Default options for this extension.\n\t\toptions: {\n\t\t\tcheckboxColumnIdx: null, // render the checkboxes into the this column index (default: nodeColumnIdx)\n\t\t\tindentation: 16, // indent every node level by 16px\n\t\t\tmergeStatusColumns: true, // display 'nodata', 'loading', 'error' centered in a single, merged TR\n\t\t\tnodeColumnIdx: 0, // render node expander, icon, and title to this column (default: #0)\n\t\t},\n\t\t// Overide virtual methods for this extension.\n\t\t// `this`       : is this extension object\n\t\t// `this._super`: the virtual function that was overriden (member of prev. extension or Fancytree)\n\t\ttreeInit: function (ctx) {\n\t\t\tvar i,\n\t\t\t\tcolumnCount,\n\t\t\t\tn,\n\t\t\t\t$row,\n\t\t\t\t$tbody,\n\t\t\t\ttree = ctx.tree,\n\t\t\t\topts = ctx.options,\n\t\t\t\ttableOpts = opts.table,\n\t\t\t\t$table = tree.widget.element,\n\t\t\t\t$scrollWrapper = $table.parent(\".fancytree-grid-container\");\n\n\t\t\tif ($.inArray(\"table\", opts.extensions) >= 0) {\n\t\t\t\t$.error(\"ext-grid and ext-table are mutually exclusive.\");\n\t\t\t}\n\t\t\tif (opts.renderStatusColumns === true) {\n\t\t\t\topts.renderStatusColumns = opts.renderColumns;\n\t\t\t}\n\t\t\t// Note: we also re-use CSS rules from ext-table\n\t\t\t$table.addClass(\n\t\t\t\t\"fancytree-container fancytree-ext-grid fancytree-ext-table\"\n\t\t\t);\n\t\t\t$tbody = $table.find(\">tbody\");\n\t\t\tif (!$tbody.length) {\n\t\t\t\t// TODO: not sure if we can rely on browsers to insert missing <tbody> before <tr>s:\n\t\t\t\tif ($table.find(\">tr\").length) {\n\t\t\t\t\t$.error(\n\t\t\t\t\t\t\"Expected table > tbody > tr. If you see this, please open an issue.\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t$tbody = $(\"<tbody>\").appendTo($table);\n\t\t\t}\n\n\t\t\ttree.tbody = $tbody[0];\n\n\t\t\t// Prepare row templates:\n\t\t\t// Determine column count from table header if any\n\t\t\tcolumnCount = $(\"thead >tr\", $table).last().find(\">th\").length;\n\t\t\t// Read TR templates from tbody if any\n\t\t\t$row = $tbody.children(\"tr\").first();\n\t\t\tif ($row.length) {\n\t\t\t\tn = $row.children(\"td\").length;\n\t\t\t\tif (columnCount && n !== columnCount) {\n\t\t\t\t\ttree.warn(\n\t\t\t\t\t\t\"Column count mismatch between thead (\" +\n\t\t\t\t\t\t\tcolumnCount +\n\t\t\t\t\t\t\t\") and tbody (\" +\n\t\t\t\t\t\t\tn +\n\t\t\t\t\t\t\t\"): using tbody.\"\n\t\t\t\t\t);\n\t\t\t\t\tcolumnCount = n;\n\t\t\t\t}\n\t\t\t\t$row = $row.clone();\n\t\t\t} else {\n\t\t\t\t// Only thead is defined: create default row markup\n\t\t\t\t_assert(\n\t\t\t\t\tcolumnCount >= 1,\n\t\t\t\t\t\"Need either <thead> or <tbody> with <td> elements to determine column count.\"\n\t\t\t\t);\n\t\t\t\t$row = $(\"<tr />\");\n\t\t\t\tfor (i = 0; i < columnCount; i++) {\n\t\t\t\t\t$row.append(\"<td />\");\n\t\t\t\t}\n\t\t\t}\n\t\t\t$row.find(\">td\")\n\t\t\t\t.eq(tableOpts.nodeColumnIdx)\n\t\t\t\t.html(\"<span class='fancytree-node' />\");\n\t\t\tif (opts.aria) {\n\t\t\t\t$row.attr(\"role\", \"row\");\n\t\t\t\t$row.find(\"td\").attr(\"role\", \"gridcell\");\n\t\t\t}\n\t\t\ttree.rowFragment = document.createDocumentFragment();\n\t\t\ttree.rowFragment.appendChild($row.get(0));\n\n\t\t\t$tbody.empty();\n\n\t\t\t// Make sure that status classes are set on the node's <tr> elements\n\t\t\ttree.statusClassPropName = \"tr\";\n\t\t\ttree.ariaPropName = \"tr\";\n\t\t\tthis.nodeContainerAttrName = \"tr\";\n\n\t\t\t// #489: make sure $container is set to <table>, even if ext-dnd is listed before ext-grid\n\t\t\ttree.$container = $table;\n\t\t\tif ($scrollWrapper.length) {\n\t\t\t\ttree.scrollWrapper = $scrollWrapper[0];\n\t\t\t\tthis._initViewportWrapper();\n\t\t\t} else {\n\t\t\t\ttree.scrollWrapper = null;\n\t\t\t}\n\n\t\t\t// Scrolling is implemented completely differently here\n\t\t\t$.ui.fancytree.overrideMethod(\n\t\t\t\t$.ui.fancytree._FancytreeNodeClass.prototype,\n\t\t\t\t\"scrollIntoView\",\n\t\t\t\tfunction (effects, options) {\n\t\t\t\t\tvar node = this,\n\t\t\t\t\t\ttree = node.tree,\n\t\t\t\t\t\ttopNode = options && options.topNode,\n\t\t\t\t\t\tvp = tree.viewport,\n\t\t\t\t\t\tstart = vp ? vp.start : null;\n\n\t\t\t\t\tif (!tree.viewport) {\n\t\t\t\t\t\treturn node._super.apply(this, arguments);\n\t\t\t\t\t}\n\t\t\t\t\tif (node._rowIdx < vp.start) {\n\t\t\t\t\t\tstart = node._rowIdx;\n\t\t\t\t\t} else if (node._rowIdx >= vp.start + vp.count) {\n\t\t\t\t\t\tstart = node._rowIdx - vp.count + 1;\n\t\t\t\t\t}\n\t\t\t\t\tif (topNode && topNode._rowIdx < start) {\n\t\t\t\t\t\tstart = topNode._rowIdx;\n\t\t\t\t\t}\n\t\t\t\t\ttree.setViewport({ start: start });\n\t\t\t\t\t// Return a resolved promise\n\t\t\t\t\treturn $.Deferred(function () {\n\t\t\t\t\t\tthis.resolveWith(node);\n\t\t\t\t\t}).promise();\n\t\t\t\t}\n\t\t\t);\n\n\t\t\ttree.visibleNodeList = null; // Set by _renumberVisibleNodes()\n\t\t\ttree.viewport = {\n\t\t\t\tenabled: true,\n\t\t\t\tstart: 0,\n\t\t\t\tcount: 10,\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t};\n\t\t\tthis.setViewport(\n\t\t\t\t$.extend(\n\t\t\t\t\t{\n\t\t\t\t\t\t// enabled: true,\n\t\t\t\t\t\tautoSize: true,\n\t\t\t\t\t\tstart: 0,\n\t\t\t\t\t\tcount: 10,\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\tkeepEmptyRows: true,\n\t\t\t\t\t\tnoEvents: true,\n\t\t\t\t\t},\n\t\t\t\t\topts.viewport\n\t\t\t\t)\n\t\t\t);\n\t\t\t// tree.$scrollbar = _addScrollbar($table);\n\n\t\t\tthis._superApply(arguments);\n\n\t\t\t// standard Fancytree created a root UL\n\t\t\t$(tree.rootNode.ul).remove();\n\t\t\ttree.rootNode.ul = null;\n\n\t\t\t// Add container to the TAB chain\n\t\t\t// #577: Allow to set tabindex to \"0\", \"-1\" and \"\"\n\t\t\tthis.$container.attr(\"tabindex\", opts.tabindex);\n\t\t\t// this.$container.attr(\"tabindex\", opts.tabbable ? \"0\" : \"-1\");\n\t\t\tif (opts.aria) {\n\t\t\t\ttree.$container\n\t\t\t\t\t.attr(\"role\", \"treegrid\")\n\t\t\t\t\t.attr(\"aria-readonly\", true);\n\t\t\t}\n\t\t},\n\t\tnodeKeydown: function (ctx) {\n\t\t\tvar nextNode = null,\n\t\t\t\tnextIdx = null,\n\t\t\t\ttree = ctx.tree,\n\t\t\t\tnode = ctx.node,\n\t\t\t\tnodeList = tree.visibleNodeList,\n\t\t\t\t// treeOpts = ctx.options,\n\t\t\t\tviewport = tree.viewport,\n\t\t\t\tevent = ctx.originalEvent,\n\t\t\t\teventString = FT.eventToString(event);\n\n\t\t\ttree.debug(\"nodeKeydown(\" + eventString + \")\");\n\n\t\t\tswitch (eventString) {\n\t\t\t\tcase \"home\":\n\t\t\t\tcase \"meta+up\":\n\t\t\t\t\tnextIdx = 0;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"end\":\n\t\t\t\tcase \"meta+down\":\n\t\t\t\t\tnextIdx = nodeList.length - 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"pageup\":\n\t\t\t\t\tnextIdx = node._rowIdx - viewport.count;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"pagedown\":\n\t\t\t\t\tnextIdx = node._rowIdx + viewport.count;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (nextIdx != null) {\n\t\t\t\tnextIdx = Math.min(Math.max(0, nextIdx), nodeList.length - 1);\n\t\t\t\tnextNode = nodeList[nextIdx];\n\t\t\t\tnextNode.makeVisible();\n\t\t\t\tnextNode.setActive();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn this._superApply(arguments);\n\t\t},\n\t\tnodeRemoveChildMarkup: function (ctx) {\n\t\t\tvar node = ctx.node;\n\n\t\t\tnode.visit(function (n) {\n\t\t\t\tif (n.tr) {\n\t\t\t\t\tdelete n.tr.ftnode;\n\t\t\t\t\tn.tr = null;\n\t\t\t\t\tn.span = null;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tnodeRemoveMarkup: function (ctx) {\n\t\t\tvar node = ctx.node;\n\n\t\t\tif (node.tr) {\n\t\t\t\tdelete node.tr.ftnode;\n\t\t\t\tnode.tr = null;\n\t\t\t\tnode.span = null;\n\t\t\t}\n\t\t\tthis.nodeRemoveChildMarkup(ctx);\n\t\t},\n\t\t/* Override standard render. */\n\t\tnodeRender: function (ctx, force, deep, collapsed, _recursive) {\n\t\t\tvar children,\n\t\t\t\ti,\n\t\t\t\tl,\n\t\t\t\toutsideViewport,\n\t\t\t\tsubCtx,\n\t\t\t\ttree = ctx.tree,\n\t\t\t\tnode = ctx.node;\n\n\t\t\tif (tree._enableUpdate === false) {\n\t\t\t\tnode.debug(\"nodeRender(): _enableUpdate: false\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar opts = ctx.options,\n\t\t\t\tviewport = tree.viewport.enabled ? tree.viewport : null,\n\t\t\t\tstart = viewport && viewport.start > 0 ? +viewport.start : 0,\n\t\t\t\tbottom = viewport ? start + viewport.count - 1 : 0,\n\t\t\t\tisRootNode = !node.parent;\n\n\t\t\t_assert(viewport);\n\n\t\t\t// node.debug(\"nodeRender(): \" + node + \", isRoot=\" + isRootNode, \"tr=\" + node.tr, \"hcp=\" + ctx.hasCollapsedParents, \"parent.tr=\" + (node.parent && node.parent.tr));\n\t\t\tif (!_recursive) {\n\t\t\t\t// node.debug(\"nodeRender(): start top node\");\n\t\t\t\tif (isRootNode && viewport) {\n\t\t\t\t\tnode.debug(\"nodeRender(): redrawViewport() instead\");\n\t\t\t\t\treturn ctx.tree.redrawViewport();\n\t\t\t\t}\n\t\t\t\tctx.hasCollapsedParents = node.parent && !node.parent.expanded;\n\t\t\t\t// Make sure visible row indices are up-to-date\n\t\t\t\tif (viewport) {\n\t\t\t\t\ttree._renumberVisibleNodes();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!isRootNode) {\n\t\t\t\toutsideViewport =\n\t\t\t\t\tviewport &&\n\t\t\t\t\t(node._rowIdx < start ||\n\t\t\t\t\t\tnode._rowIdx >= start + viewport.count);\n\n\t\t\t\t// node.debug(\n\t\t\t\t// \t\"nodeRender(): idx=\" +\n\t\t\t\t// \t\tnode._rowIdx +\n\t\t\t\t// \t\t\", outside=\" +\n\t\t\t\t// \t\toutsideViewport +\n\t\t\t\t// \t\t\", TR count=\" +\n\t\t\t\t// \t\ttree.tbody.rows.length\n\t\t\t\t// );\n\t\t\t\tif (outsideViewport) {\n\t\t\t\t\t// node.debug(\"nodeRender(): outsideViewport: ignored\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!node.tr) {\n\t\t\t\t\tif (node._rowIdx == null) {\n\t\t\t\t\t\t// node.warn(\"nodeRender(): ignoring hidden\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tnode.debug(\"nodeRender(): creating new TR.\");\n\t\t\t\t\tnode.tr = tree.tbody.rows[node._rowIdx - start];\n\t\t\t\t}\n\t\t\t\t// _assert(\n\t\t\t\t// \tnode.tr,\n\t\t\t\t// \t\"nodeRender() called for node.tr == null: \" + node\n\t\t\t\t// );\n\t\t\t\tnode.tr.ftnode = node;\n\n\t\t\t\tif (node.key && opts.generateIds) {\n\t\t\t\t\tnode.tr.id = opts.idPrefix + node.key;\n\t\t\t\t}\n\t\t\t\tnode.span = $(\"span.fancytree-node\", node.tr).get(0);\n\n\t\t\t\t// Set icon, link, and title (normally this is only required on initial render)\n\t\t\t\t// var ctx = this._makeHookContext(node);\n\t\t\t\tthis.nodeRenderTitle(ctx); // triggers renderColumns()\n\n\t\t\t\t// Allow tweaking, binding, after node was created for the first time\n\t\t\t\tif (opts.createNode) {\n\t\t\t\t\topts.createNode.call(this, { type: \"createNode\" }, ctx);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Allow tweaking after node state was rendered\n\t\t\tif (opts.renderNode) {\n\t\t\t\topts.renderNode.call(tree, { type: \"renderNode\" }, ctx);\n\t\t\t}\n\t\t\t// Visit child nodes\n\t\t\t// Add child markup\n\t\t\tchildren = node.children;\n\t\t\t_assert(!deep, \"deep is not supported\");\n\n\t\t\tif (children && (isRootNode || deep || node.expanded)) {\n\t\t\t\tfor (i = 0, l = children.length; i < l; i++) {\n\t\t\t\t\tvar child = children[i];\n\n\t\t\t\t\tif (viewport && child._rowIdx > bottom) {\n\t\t\t\t\t\tchildren[i].debug(\"BREAK render children loop\");\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tsubCtx = $.extend({}, ctx, { node: child });\n\t\t\t\t\tsubCtx.hasCollapsedParents =\n\t\t\t\t\t\tsubCtx.hasCollapsedParents || !node.expanded;\n\t\t\t\t\tthis.nodeRender(subCtx, force, deep, collapsed, true);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tnodeRenderTitle: function (ctx, title) {\n\t\t\tvar $cb,\n\t\t\t\tres,\n\t\t\t\ttree = ctx.tree,\n\t\t\t\tnode = ctx.node,\n\t\t\t\topts = ctx.options,\n\t\t\t\tisStatusNode = node.isStatusNode();\n\n\t\t\tres = this._super(ctx, title);\n\n\t\t\tif (node.isRootNode()) {\n\t\t\t\treturn res;\n\t\t\t}\n\t\t\t// Move checkbox to custom column\n\t\t\tif (\n\t\t\t\topts.checkbox &&\n\t\t\t\t!isStatusNode &&\n\t\t\t\topts.table.checkboxColumnIdx != null\n\t\t\t) {\n\t\t\t\t$cb = $(\"span.fancytree-checkbox\", node.span); //.detach();\n\t\t\t\t$(node.tr)\n\t\t\t\t\t.find(\"td\")\n\t\t\t\t\t.eq(+opts.table.checkboxColumnIdx)\n\t\t\t\t\t.html($cb);\n\t\t\t}\n\t\t\t// Update element classes according to node state\n\t\t\tthis.nodeRenderStatus(ctx);\n\n\t\t\tif (isStatusNode) {\n\t\t\t\tif (opts.renderStatusColumns) {\n\t\t\t\t\t// Let user code write column content\n\t\t\t\t\topts.renderStatusColumns.call(\n\t\t\t\t\t\ttree,\n\t\t\t\t\t\t{ type: \"renderStatusColumns\" },\n\t\t\t\t\t\tctx\n\t\t\t\t\t);\n\t\t\t\t} else if (opts.grid.mergeStatusColumns && node.isTopLevel()) {\n\t\t\t\t\tnode.warn(\"mergeStatusColumns is not yet implemented.\");\n\t\t\t\t\t// This approach would not work, since the roe may be re-used:\n\t\t\t\t\t// $(node.tr)\n\t\t\t\t\t// \t.find(\">td\")\n\t\t\t\t\t// \t.eq(0)\n\t\t\t\t\t// \t.prop(\"colspan\", tree.columnCount)\n\t\t\t\t\t// \t.text(node.title)\n\t\t\t\t\t// \t.addClass(\"fancytree-status-merged\")\n\t\t\t\t\t// \t.nextAll()\n\t\t\t\t\t// \t.remove();\n\t\t\t\t} // else: default rendering for status node: leave other cells empty\n\t\t\t} else if (opts.renderColumns) {\n\t\t\t\topts.renderColumns.call(tree, { type: \"renderColumns\" }, ctx);\n\t\t\t}\n\t\t\treturn res;\n\t\t},\n\t\tnodeRenderStatus: function (ctx) {\n\t\t\tvar indent,\n\t\t\t\tnode = ctx.node,\n\t\t\t\topts = ctx.options;\n\n\t\t\tthis._super(ctx);\n\n\t\t\t$(node.tr).removeClass(\"fancytree-node\");\n\t\t\t// indent\n\t\t\tindent = (node.getLevel() - 1) * opts.table.indentation;\n\t\t\tif (opts.rtl) {\n\t\t\t\t$(node.span).css({ paddingRight: indent + \"px\" });\n\t\t\t} else {\n\t\t\t\t$(node.span).css({ paddingLeft: indent + \"px\" });\n\t\t\t}\n\t\t},\n\t\t/* Expand node, return Deferred.promise. */\n\t\tnodeSetExpanded: function (ctx, flag, callOpts) {\n\t\t\tvar node = ctx.node,\n\t\t\t\ttree = ctx.tree;\n\n\t\t\t// flag defaults to true\n\t\t\tflag = flag !== false;\n\n\t\t\tif ((node.expanded && flag) || (!node.expanded && !flag)) {\n\t\t\t\t// Expanded state isn't changed - just call base implementation\n\t\t\t\treturn this._superApply(arguments);\n\t\t\t}\n\n\t\t\tvar dfd = new $.Deferred(),\n\t\t\t\tsubOpts = $.extend({}, callOpts, {\n\t\t\t\t\tnoEvents: true,\n\t\t\t\t\tnoAnimation: true,\n\t\t\t\t});\n\n\t\t\tcallOpts = callOpts || {};\n\n\t\t\tfunction _afterExpand(ok) {\n\t\t\t\ttree.redrawViewport(true);\n\n\t\t\t\tif (ok) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tflag &&\n\t\t\t\t\t\tctx.options.autoScroll &&\n\t\t\t\t\t\t!callOpts.noAnimation &&\n\t\t\t\t\t\tnode.hasChildren()\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Scroll down to last child, but keep current node visible\n\t\t\t\t\t\tnode.getLastChild()\n\t\t\t\t\t\t\t.scrollIntoView(true, { topNode: node })\n\t\t\t\t\t\t\t.always(function () {\n\t\t\t\t\t\t\t\tif (!callOpts.noEvents) {\n\t\t\t\t\t\t\t\t\ttree._triggerNodeEvent(\n\t\t\t\t\t\t\t\t\t\tflag ? \"expand\" : \"collapse\",\n\t\t\t\t\t\t\t\t\t\tctx\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tdfd.resolveWith(node);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (!callOpts.noEvents) {\n\t\t\t\t\t\t\ttree._triggerNodeEvent(\n\t\t\t\t\t\t\t\tflag ? \"expand\" : \"collapse\",\n\t\t\t\t\t\t\t\tctx\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdfd.resolveWith(node);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (!callOpts.noEvents) {\n\t\t\t\t\t\ttree._triggerNodeEvent(\n\t\t\t\t\t\t\tflag ? \"expand\" : \"collapse\",\n\t\t\t\t\t\t\tctx\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tdfd.rejectWith(node);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Call base-expand with disabled events and animation\n\t\t\tthis._super(ctx, flag, subOpts)\n\t\t\t\t.done(function () {\n\t\t\t\t\t_afterExpand(true);\n\t\t\t\t})\n\t\t\t\t.fail(function () {\n\t\t\t\t\t_afterExpand(false);\n\t\t\t\t});\n\t\t\treturn dfd.promise();\n\t\t},\n\t\ttreeClear: function (ctx) {\n\t\t\t// this.nodeRemoveChildMarkup(this._makeHookContext(this.rootNode));\n\t\t\t// this._renumberReset(); // Invalidate visible row cache\n\t\t\treturn this._superApply(arguments);\n\t\t},\n\t\ttreeDestroy: function (ctx) {\n\t\t\tthis.$container.find(\"tbody\").empty();\n\t\t\tthis.$container.off(\"wheel\");\n\t\t\tif (this.$source) {\n\t\t\t\tthis.$source.removeClass(\"fancytree-helper-hidden\");\n\t\t\t}\n\t\t\tthis._renumberReset(); // Invalidate visible row cache\n\t\t\treturn this._superApply(arguments);\n\t\t},\n\t\ttreeStructureChanged: function (ctx, type) {\n\t\t\t// debugger;\n\t\t\tif (type !== \"addNode\" || ctx.tree.visibleNodeList) {\n\t\t\t\t// this.debug(\"treeStructureChanged(\" + type + \")\");\n\t\t\t\tthis._renumberReset(); // Invalidate visible row cache\n\t\t\t}\n\t\t},\n\t});\n\t// Value returned by `require('jquery.fancytree..')`\n\treturn $.ui.fancytree;\n}); // End of closure\n","/*!\n * jquery.fancytree.glyph.js\n *\n * Use glyph-fonts, ligature-fonts, or SVG icons instead of icon sprites.\n * (Extension module for jquery.fancytree.js: https://github.com/mar10/fancytree/)\n *\n * Copyright (c) 2008-2023, Martin Wendt (https://wwWendt.de)\n *\n * Released under the MIT license\n * https://github.com/mar10/fancytree/wiki/LicenseInfo\n *\n * @version 2.38.3\n * @date 2023-02-01T20:52:50Z\n */\n\n(function (factory) {\n\tif (typeof define === \"function\" && define.amd) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([\"jquery\", \"./jquery.fancytree\"], factory);\n\t} else if (typeof module === \"object\" && module.exports) {\n\t\t// Node/CommonJS\n\t\trequire(\"./jquery.fancytree\");\n\t\tmodule.exports = factory(require(\"jquery\"));\n\t} else {\n\t\t// Browser globals\n\t\tfactory(jQuery);\n\t}\n})(function ($) {\n\t\"use strict\";\n\n\t/******************************************************************************\n\t * Private functions and variables\n\t */\n\n\tvar FT = $.ui.fancytree,\n\t\tPRESETS = {\n\t\t\tawesome3: {\n\t\t\t\t// Outdated!\n\t\t\t\t_addClass: \"\",\n\t\t\t\tcheckbox: \"icon-check-empty\",\n\t\t\t\tcheckboxSelected: \"icon-check\",\n\t\t\t\tcheckboxUnknown: \"icon-check icon-muted\",\n\t\t\t\tdragHelper: \"icon-caret-right\",\n\t\t\t\tdropMarker: \"icon-caret-right\",\n\t\t\t\terror: \"icon-exclamation-sign\",\n\t\t\t\texpanderClosed: \"icon-caret-right\",\n\t\t\t\texpanderLazy: \"icon-angle-right\",\n\t\t\t\texpanderOpen: \"icon-caret-down\",\n\t\t\t\tloading: \"icon-refresh icon-spin\",\n\t\t\t\tnodata: \"icon-meh\",\n\t\t\t\tnoExpander: \"\",\n\t\t\t\tradio: \"icon-circle-blank\",\n\t\t\t\tradioSelected: \"icon-circle\",\n\t\t\t\t// radioUnknown: \"icon-circle icon-muted\",\n\t\t\t\t// Default node icons.\n\t\t\t\t// (Use tree.options.icon callback to define custom icons based on node data)\n\t\t\t\tdoc: \"icon-file-alt\",\n\t\t\t\tdocOpen: \"icon-file-alt\",\n\t\t\t\tfolder: \"icon-folder-close-alt\",\n\t\t\t\tfolderOpen: \"icon-folder-open-alt\",\n\t\t\t},\n\t\t\tawesome4: {\n\t\t\t\t_addClass: \"fa\",\n\t\t\t\tcheckbox: \"fa-square-o\",\n\t\t\t\tcheckboxSelected: \"fa-check-square-o\",\n\t\t\t\tcheckboxUnknown: \"fa-square fancytree-helper-indeterminate-cb\",\n\t\t\t\tdragHelper: \"fa-arrow-right\",\n\t\t\t\tdropMarker: \"fa-long-arrow-right\",\n\t\t\t\terror: \"fa-warning\",\n\t\t\t\texpanderClosed: \"fa-caret-right\",\n\t\t\t\texpanderLazy: \"fa-angle-right\",\n\t\t\t\texpanderOpen: \"fa-caret-down\",\n\t\t\t\t// We may prevent wobbling rotations on FF by creating a separate sub element:\n\t\t\t\tloading: { html: \"<span class='fa fa-spinner fa-pulse' />\" },\n\t\t\t\tnodata: \"fa-meh-o\",\n\t\t\t\tnoExpander: \"\",\n\t\t\t\tradio: \"fa-circle-thin\", // \"fa-circle-o\"\n\t\t\t\tradioSelected: \"fa-circle\",\n\t\t\t\t// radioUnknown: \"fa-dot-circle-o\",\n\t\t\t\t// Default node icons.\n\t\t\t\t// (Use tree.options.icon callback to define custom icons based on node data)\n\t\t\t\tdoc: \"fa-file-o\",\n\t\t\t\tdocOpen: \"fa-file-o\",\n\t\t\t\tfolder: \"fa-folder-o\",\n\t\t\t\tfolderOpen: \"fa-folder-open-o\",\n\t\t\t},\n\t\t\tawesome5: {\n\t\t\t\t// fontawesome 5 have several different base classes\n\t\t\t\t// \"far, fas, fal and fab\" The rendered svg puts that prefix\n\t\t\t\t// in a different location so we have to keep them separate here\n\t\t\t\t_addClass: \"\",\n\t\t\t\tcheckbox: \"far fa-square\",\n\t\t\t\tcheckboxSelected: \"far fa-check-square\",\n\t\t\t\t// checkboxUnknown: \"far fa-window-close\",\n\t\t\t\tcheckboxUnknown:\n\t\t\t\t\t\"fas fa-square fancytree-helper-indeterminate-cb\",\n\t\t\t\tradio: \"far fa-circle\",\n\t\t\t\tradioSelected: \"fas fa-circle\",\n\t\t\t\tradioUnknown: \"far fa-dot-circle\",\n\t\t\t\tdragHelper: \"fas fa-arrow-right\",\n\t\t\t\tdropMarker: \"fas fa-long-arrow-alt-right\",\n\t\t\t\terror: \"fas fa-exclamation-triangle\",\n\t\t\t\texpanderClosed: \"fas fa-caret-right\",\n\t\t\t\texpanderLazy: \"fas fa-angle-right\",\n\t\t\t\texpanderOpen: \"fas fa-caret-down\",\n\t\t\t\tloading: \"fas fa-spinner fa-pulse\",\n\t\t\t\tnodata: \"far fa-meh\",\n\t\t\t\tnoExpander: \"\",\n\t\t\t\t// Default node icons.\n\t\t\t\t// (Use tree.options.icon callback to define custom icons based on node data)\n\t\t\t\tdoc: \"far fa-file\",\n\t\t\t\tdocOpen: \"far fa-file\",\n\t\t\t\tfolder: \"far fa-folder\",\n\t\t\t\tfolderOpen: \"far fa-folder-open\",\n\t\t\t},\n\t\t\tbootstrap3: {\n\t\t\t\t_addClass: \"glyphicon\",\n\t\t\t\tcheckbox: \"glyphicon-unchecked\",\n\t\t\t\tcheckboxSelected: \"glyphicon-check\",\n\t\t\t\tcheckboxUnknown:\n\t\t\t\t\t\"glyphicon-expand fancytree-helper-indeterminate-cb\", // \"glyphicon-share\",\n\t\t\t\tdragHelper: \"glyphicon-play\",\n\t\t\t\tdropMarker: \"glyphicon-arrow-right\",\n\t\t\t\terror: \"glyphicon-warning-sign\",\n\t\t\t\texpanderClosed: \"glyphicon-menu-right\", // glyphicon-plus-sign\n\t\t\t\texpanderLazy: \"glyphicon-menu-right\", // glyphicon-plus-sign\n\t\t\t\texpanderOpen: \"glyphicon-menu-down\", // glyphicon-minus-sign\n\t\t\t\tloading: \"glyphicon-refresh fancytree-helper-spin\",\n\t\t\t\tnodata: \"glyphicon-info-sign\",\n\t\t\t\tnoExpander: \"\",\n\t\t\t\tradio: \"glyphicon-remove-circle\", // \"glyphicon-unchecked\",\n\t\t\t\tradioSelected: \"glyphicon-ok-circle\", // \"glyphicon-check\",\n\t\t\t\t// radioUnknown: \"glyphicon-ban-circle\",\n\t\t\t\t// Default node icons.\n\t\t\t\t// (Use tree.options.icon callback to define custom icons based on node data)\n\t\t\t\tdoc: \"glyphicon-file\",\n\t\t\t\tdocOpen: \"glyphicon-file\",\n\t\t\t\tfolder: \"glyphicon-folder-close\",\n\t\t\t\tfolderOpen: \"glyphicon-folder-open\",\n\t\t\t},\n\t\t\tmaterial: {\n\t\t\t\t_addClass: \"material-icons\",\n\t\t\t\tcheckbox: { text: \"check_box_outline_blank\" },\n\t\t\t\tcheckboxSelected: { text: \"check_box\" },\n\t\t\t\tcheckboxUnknown: { text: \"indeterminate_check_box\" },\n\t\t\t\tdragHelper: { text: \"play_arrow\" },\n\t\t\t\tdropMarker: { text: \"arrow-forward\" },\n\t\t\t\terror: { text: \"warning\" },\n\t\t\t\texpanderClosed: { text: \"chevron_right\" },\n\t\t\t\texpanderLazy: { text: \"last_page\" },\n\t\t\t\texpanderOpen: { text: \"expand_more\" },\n\t\t\t\tloading: {\n\t\t\t\t\ttext: \"autorenew\",\n\t\t\t\t\taddClass: \"fancytree-helper-spin\",\n\t\t\t\t},\n\t\t\t\tnodata: { text: \"info\" },\n\t\t\t\tnoExpander: { text: \"\" },\n\t\t\t\tradio: { text: \"radio_button_unchecked\" },\n\t\t\t\tradioSelected: { text: \"radio_button_checked\" },\n\t\t\t\t// Default node icons.\n\t\t\t\t// (Use tree.options.icon callback to define custom icons based on node data)\n\t\t\t\tdoc: { text: \"insert_drive_file\" },\n\t\t\t\tdocOpen: { text: \"insert_drive_file\" },\n\t\t\t\tfolder: { text: \"folder\" },\n\t\t\t\tfolderOpen: { text: \"folder_open\" },\n\t\t\t},\n\t\t};\n\n\tfunction setIcon(node, span, baseClass, opts, type) {\n\t\tvar map = opts.map,\n\t\t\ticon = map[type],\n\t\t\t$span = $(span),\n\t\t\t$counter = $span.find(\".fancytree-childcounter\"),\n\t\t\tsetClass = baseClass + \" \" + (map._addClass || \"\");\n\n\t\t// #871 Allow a callback\n\t\tif (typeof icon === \"function\") {\n\t\t\ticon = icon.call(this, node, span, type);\n\t\t}\n\t\t// node.debug( \"setIcon(\" + baseClass + \", \" + type + \"): \" + \"oldIcon\" + \" -> \" + icon );\n\t\t// #871: propsed this, but I am not sure how robust this is, e.g.\n\t\t// the prefix (fas, far) class changes are not considered?\n\t\t// if (span.tagName === \"svg\" && opts.preset === \"awesome5\") {\n\t\t// \t// fa5 script converts <i> to <svg> so call a specific handler.\n\t\t// \tvar oldIcon = \"fa-\" + $span.data(\"icon\");\n\t\t// \t// node.debug( \"setIcon(\" + baseClass + \", \" + type + \"): \" + oldIcon + \" -> \" + icon );\n\t\t// \tif (typeof oldIcon === \"string\") {\n\t\t// \t\t$span.removeClass(oldIcon);\n\t\t// \t}\n\t\t// \tif (typeof icon === \"string\") {\n\t\t// \t\t$span.addClass(icon);\n\t\t// \t}\n\t\t// \treturn;\n\t\t// }\n\t\tif (typeof icon === \"string\") {\n\t\t\t// #883: remove inner html that may be added by prev. mode\n\t\t\tspan.innerHTML = \"\";\n\t\t\t$span.attr(\"class\", setClass + \" \" + icon).append($counter);\n\t\t} else if (icon) {\n\t\t\tif (icon.text) {\n\t\t\t\tspan.textContent = \"\" + icon.text;\n\t\t\t} else if (icon.html) {\n\t\t\t\tspan.innerHTML = icon.html;\n\t\t\t} else {\n\t\t\t\tspan.innerHTML = \"\";\n\t\t\t}\n\t\t\t$span\n\t\t\t\t.attr(\"class\", setClass + \" \" + (icon.addClass || \"\"))\n\t\t\t\t.append($counter);\n\t\t}\n\t}\n\n\t$.ui.fancytree.registerExtension({\n\t\tname: \"glyph\",\n\t\tversion: \"2.38.3\",\n\t\t// Default options for this extension.\n\t\toptions: {\n\t\t\tpreset: null, // 'awesome3', 'awesome4', 'bootstrap3', 'material'\n\t\t\tmap: {},\n\t\t},\n\n\t\ttreeInit: function (ctx) {\n\t\t\tvar tree = ctx.tree,\n\t\t\t\topts = ctx.options.glyph;\n\n\t\t\tif (opts.preset) {\n\t\t\t\tFT.assert(\n\t\t\t\t\t!!PRESETS[opts.preset],\n\t\t\t\t\t\"Invalid value for `options.glyph.preset`: \" + opts.preset\n\t\t\t\t);\n\t\t\t\topts.map = $.extend({}, PRESETS[opts.preset], opts.map);\n\t\t\t} else {\n\t\t\t\ttree.warn(\"ext-glyph: missing `preset` option.\");\n\t\t\t}\n\t\t\tthis._superApply(arguments);\n\t\t\ttree.$container.addClass(\"fancytree-ext-glyph\");\n\t\t},\n\t\tnodeRenderStatus: function (ctx) {\n\t\t\tvar checkbox,\n\t\t\t\ticon,\n\t\t\t\tres,\n\t\t\t\tspan,\n\t\t\t\tnode = ctx.node,\n\t\t\t\t$span = $(node.span),\n\t\t\t\topts = ctx.options.glyph;\n\n\t\t\tres = this._super(ctx);\n\n\t\t\tif (node.isRootNode()) {\n\t\t\t\treturn res;\n\t\t\t}\n\t\t\tspan = $span.children(\".fancytree-expander\").get(0);\n\t\t\tif (span) {\n\t\t\t\t// if( node.isLoading() ){\n\t\t\t\t// icon = \"loading\";\n\t\t\t\tif (node.expanded && node.hasChildren()) {\n\t\t\t\t\ticon = \"expanderOpen\";\n\t\t\t\t} else if (node.isUndefined()) {\n\t\t\t\t\ticon = \"expanderLazy\";\n\t\t\t\t} else if (node.hasChildren()) {\n\t\t\t\t\ticon = \"expanderClosed\";\n\t\t\t\t} else {\n\t\t\t\t\ticon = \"noExpander\";\n\t\t\t\t}\n\t\t\t\t// span.className = \"fancytree-expander \" + map[icon];\n\t\t\t\tsetIcon(node, span, \"fancytree-expander\", opts, icon);\n\t\t\t}\n\n\t\t\tif (node.tr) {\n\t\t\t\tspan = $(\"td\", node.tr).find(\".fancytree-checkbox\").get(0);\n\t\t\t} else {\n\t\t\t\tspan = $span.children(\".fancytree-checkbox\").get(0);\n\t\t\t}\n\t\t\tif (span) {\n\t\t\t\tcheckbox = FT.evalOption(\"checkbox\", node, node, opts, false);\n\t\t\t\tif (\n\t\t\t\t\t(node.parent && node.parent.radiogroup) ||\n\t\t\t\t\tcheckbox === \"radio\"\n\t\t\t\t) {\n\t\t\t\t\ticon = node.selected ? \"radioSelected\" : \"radio\";\n\t\t\t\t\tsetIcon(\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tspan,\n\t\t\t\t\t\t\"fancytree-checkbox fancytree-radio\",\n\t\t\t\t\t\topts,\n\t\t\t\t\t\ticon\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\t// eslint-disable-next-line no-nested-ternary\n\t\t\t\t\ticon = node.selected\n\t\t\t\t\t\t? \"checkboxSelected\"\n\t\t\t\t\t\t: node.partsel\n\t\t\t\t\t\t? \"checkboxUnknown\"\n\t\t\t\t\t\t: \"checkbox\";\n\t\t\t\t\t// span.className = \"fancytree-checkbox \" + map[icon];\n\t\t\t\t\tsetIcon(node, span, \"fancytree-checkbox\", opts, icon);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Standard icon (note that this does not match .fancytree-custom-icon,\n\t\t\t// that might be set by opts.icon callbacks)\n\t\t\tspan = $span.children(\".fancytree-icon\").get(0);\n\t\t\tif (span) {\n\t\t\t\tif (node.statusNodeType) {\n\t\t\t\t\ticon = node.statusNodeType; // loading, error\n\t\t\t\t} else if (node.folder) {\n\t\t\t\t\ticon =\n\t\t\t\t\t\tnode.expanded && node.hasChildren()\n\t\t\t\t\t\t\t? \"folderOpen\"\n\t\t\t\t\t\t\t: \"folder\";\n\t\t\t\t} else {\n\t\t\t\t\ticon = node.expanded ? \"docOpen\" : \"doc\";\n\t\t\t\t}\n\t\t\t\tsetIcon(node, span, \"fancytree-icon\", opts, icon);\n\t\t\t}\n\t\t\treturn res;\n\t\t},\n\t\tnodeSetStatus: function (ctx, status, message, details) {\n\t\t\tvar res,\n\t\t\t\tspan,\n\t\t\t\topts = ctx.options.glyph,\n\t\t\t\tnode = ctx.node;\n\n\t\t\tres = this._superApply(arguments);\n\n\t\t\tif (\n\t\t\t\tstatus === \"error\" ||\n\t\t\t\tstatus === \"loading\" ||\n\t\t\t\tstatus === \"nodata\"\n\t\t\t) {\n\t\t\t\tif (node.parent) {\n\t\t\t\t\tspan = $(\".fancytree-expander\", node.span).get(0);\n\t\t\t\t\tif (span) {\n\t\t\t\t\t\tsetIcon(node, span, \"fancytree-expander\", opts, status);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t//\n\t\t\t\t\tspan = $(\n\t\t\t\t\t\t\".fancytree-statusnode-\" + status,\n\t\t\t\t\t\tnode[this.nodeContainerAttrName]\n\t\t\t\t\t)\n\t\t\t\t\t\t.find(\".fancytree-icon\")\n\t\t\t\t\t\t.get(0);\n\t\t\t\t\tif (span) {\n\t\t\t\t\t\tsetIcon(node, span, \"fancytree-icon\", opts, status);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn res;\n\t\t},\n\t});\n\t// Value returned by `require('jquery.fancytree..')`\n\treturn $.ui.fancytree;\n}); // End of closure\n","/*!\n * jquery.fancytree.edit.js\n *\n * Make node titles editable.\n * (Extension module for jquery.fancytree.js: https://github.com/mar10/fancytree/)\n *\n * Copyright (c) 2008-2023, Martin Wendt (https://wwWendt.de)\n *\n * Released under the MIT license\n * https://github.com/mar10/fancytree/wiki/LicenseInfo\n *\n * @version 2.38.3\n * @date 2023-02-01T20:52:50Z\n */\n\n(function (factory) {\n\tif (typeof define === \"function\" && define.amd) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([\"jquery\", \"./jquery.fancytree\"], factory);\n\t} else if (typeof module === \"object\" && module.exports) {\n\t\t// Node/CommonJS\n\t\trequire(\"./jquery.fancytree\");\n\t\tmodule.exports = factory(require(\"jquery\"));\n\t} else {\n\t\t// Browser globals\n\t\tfactory(jQuery);\n\t}\n})(function ($) {\n\t\"use strict\";\n\n\t/*******************************************************************************\n\t * Private functions and variables\n\t */\n\n\tvar isMac = /Mac/.test(navigator.platform),\n\t\tescapeHtml = $.ui.fancytree.escapeHtml,\n\t\ttrim = $.ui.fancytree.trim,\n\t\tunescapeHtml = $.ui.fancytree.unescapeHtml;\n\n\t/**\n\t * [ext-edit] Start inline editing of current node title.\n\t *\n\t * @alias FancytreeNode#editStart\n\t * @requires Fancytree\n\t */\n\t$.ui.fancytree._FancytreeNodeClass.prototype.editStart = function () {\n\t\tvar $input,\n\t\t\tnode = this,\n\t\t\ttree = this.tree,\n\t\t\tlocal = tree.ext.edit,\n\t\t\tinstOpts = tree.options.edit,\n\t\t\t$title = $(\".fancytree-title\", node.span),\n\t\t\teventData = {\n\t\t\t\tnode: node,\n\t\t\t\ttree: tree,\n\t\t\t\toptions: tree.options,\n\t\t\t\tisNew: $(node[tree.statusClassPropName]).hasClass(\n\t\t\t\t\t\"fancytree-edit-new\"\n\t\t\t\t),\n\t\t\t\torgTitle: node.title,\n\t\t\t\tinput: null,\n\t\t\t\tdirty: false,\n\t\t\t};\n\n\t\t// beforeEdit may want to modify the title before editing\n\t\tif (\n\t\t\tinstOpts.beforeEdit.call(\n\t\t\t\tnode,\n\t\t\t\t{ type: \"beforeEdit\" },\n\t\t\t\teventData\n\t\t\t) === false\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\t$.ui.fancytree.assert(!local.currentNode, \"recursive edit\");\n\t\tlocal.currentNode = this;\n\t\tlocal.eventData = eventData;\n\n\t\t// Disable standard Fancytree mouse- and key handling\n\t\ttree.widget._unbind();\n\n\t\tlocal.lastDraggableAttrValue = node.span.draggable;\n\t\tif (local.lastDraggableAttrValue) {\n\t\t\tnode.span.draggable = false;\n\t\t}\n\n\t\t// #116: ext-dnd prevents the blur event, so we have to catch outer clicks\n\t\t$(document).on(\"mousedown.fancytree-edit\", function (event) {\n\t\t\tif (!$(event.target).hasClass(\"fancytree-edit-input\")) {\n\t\t\t\tnode.editEnd(true, event);\n\t\t\t}\n\t\t});\n\n\t\t// Replace node with <input>\n\t\t$input = $(\"<input />\", {\n\t\t\tclass: \"fancytree-edit-input\",\n\t\t\ttype: \"text\",\n\t\t\tvalue: tree.options.escapeTitles\n\t\t\t\t? eventData.orgTitle\n\t\t\t\t: unescapeHtml(eventData.orgTitle),\n\t\t});\n\t\tlocal.eventData.input = $input;\n\t\tif (instOpts.adjustWidthOfs != null) {\n\t\t\t$input.width($title.width() + instOpts.adjustWidthOfs);\n\t\t}\n\t\tif (instOpts.inputCss != null) {\n\t\t\t$input.css(instOpts.inputCss);\n\t\t}\n\n\t\t$title.html($input);\n\n\t\t// Focus <input> and bind keyboard handler\n\t\t$input\n\t\t\t.focus()\n\t\t\t.change(function (event) {\n\t\t\t\t$input.addClass(\"fancytree-edit-dirty\");\n\t\t\t})\n\t\t\t.on(\"keydown\", function (event) {\n\t\t\t\tswitch (event.which) {\n\t\t\t\t\tcase $.ui.keyCode.ESCAPE:\n\t\t\t\t\t\tnode.editEnd(false, event);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase $.ui.keyCode.ENTER:\n\t\t\t\t\t\tnode.editEnd(true, event);\n\t\t\t\t\t\treturn false; // so we don't start editmode on Mac\n\t\t\t\t}\n\t\t\t\tevent.stopPropagation();\n\t\t\t})\n\t\t\t.blur(function (event) {\n\t\t\t\treturn node.editEnd(true, event);\n\t\t\t});\n\n\t\tinstOpts.edit.call(node, { type: \"edit\" }, eventData);\n\t};\n\n\t/**\n\t * [ext-edit] Stop inline editing.\n\t * @param {Boolean} [applyChanges=false] false: cancel edit, true: save (if modified)\n\t * @alias FancytreeNode#editEnd\n\t * @requires jquery.fancytree.edit.js\n\t */\n\t$.ui.fancytree._FancytreeNodeClass.prototype.editEnd = function (\n\t\tapplyChanges,\n\t\t_event\n\t) {\n\t\tvar newVal,\n\t\t\tnode = this,\n\t\t\ttree = this.tree,\n\t\t\tlocal = tree.ext.edit,\n\t\t\teventData = local.eventData,\n\t\t\tinstOpts = tree.options.edit,\n\t\t\t$title = $(\".fancytree-title\", node.span),\n\t\t\t$input = $title.find(\"input.fancytree-edit-input\");\n\n\t\tif (instOpts.trim) {\n\t\t\t$input.val(trim($input.val()));\n\t\t}\n\t\tnewVal = $input.val();\n\n\t\teventData.dirty = newVal !== node.title;\n\t\teventData.originalEvent = _event;\n\n\t\t// Find out, if saving is required\n\t\tif (applyChanges === false) {\n\t\t\t// If true/false was passed, honor this (except in rename mode, if unchanged)\n\t\t\teventData.save = false;\n\t\t} else if (eventData.isNew) {\n\t\t\t// In create mode, we save everything, except for empty text\n\t\t\teventData.save = newVal !== \"\";\n\t\t} else {\n\t\t\t// In rename mode, we save everyting, except for empty or unchanged text\n\t\t\teventData.save = eventData.dirty && newVal !== \"\";\n\t\t}\n\t\t// Allow to break (keep editor open), modify input, or re-define data.save\n\t\tif (\n\t\t\tinstOpts.beforeClose.call(\n\t\t\t\tnode,\n\t\t\t\t{ type: \"beforeClose\" },\n\t\t\t\teventData\n\t\t\t) === false\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\tif (\n\t\t\teventData.save &&\n\t\t\tinstOpts.save.call(node, { type: \"save\" }, eventData) === false\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\t$input.removeClass(\"fancytree-edit-dirty\").off();\n\t\t// Unbind outer-click handler\n\t\t$(document).off(\".fancytree-edit\");\n\n\t\tif (eventData.save) {\n\t\t\t// # 171: escape user input (not required if global escaping is on)\n\t\t\tnode.setTitle(\n\t\t\t\ttree.options.escapeTitles ? newVal : escapeHtml(newVal)\n\t\t\t);\n\t\t\tnode.setFocus();\n\t\t} else {\n\t\t\tif (eventData.isNew) {\n\t\t\t\tnode.remove();\n\t\t\t\tnode = eventData.node = null;\n\t\t\t\tlocal.relatedNode.setFocus();\n\t\t\t} else {\n\t\t\t\tnode.renderTitle();\n\t\t\t\tnode.setFocus();\n\t\t\t}\n\t\t}\n\t\tlocal.eventData = null;\n\t\tlocal.currentNode = null;\n\t\tlocal.relatedNode = null;\n\t\t// Re-enable mouse and keyboard handling\n\t\ttree.widget._bind();\n\n\t\tif (node && local.lastDraggableAttrValue) {\n\t\t\tnode.span.draggable = true;\n\t\t}\n\n\t\t// Set keyboard focus, even if setFocus() claims 'nothing to do'\n\t\ttree.$container.get(0).focus({ preventScroll: true });\n\t\teventData.input = null;\n\t\tinstOpts.close.call(node, { type: \"close\" }, eventData);\n\t\treturn true;\n\t};\n\n\t/**\n\t * [ext-edit] Create a new child or sibling node and start edit mode.\n\t *\n\t * @param {String} [mode='child'] 'before', 'after', or 'child'\n\t * @param {Object} [init] NodeData (or simple title string)\n\t * @alias FancytreeNode#editCreateNode\n\t * @requires jquery.fancytree.edit.js\n\t * @since 2.4\n\t */\n\t$.ui.fancytree._FancytreeNodeClass.prototype.editCreateNode = function (\n\t\tmode,\n\t\tinit\n\t) {\n\t\tvar newNode,\n\t\t\ttree = this.tree,\n\t\t\tself = this;\n\n\t\tmode = mode || \"child\";\n\t\tif (init == null) {\n\t\t\tinit = { title: \"\" };\n\t\t} else if (typeof init === \"string\") {\n\t\t\tinit = { title: init };\n\t\t} else {\n\t\t\t$.ui.fancytree.assert($.isPlainObject(init));\n\t\t}\n\t\t// Make sure node is expanded (and loaded) in 'child' mode\n\t\tif (\n\t\t\tmode === \"child\" &&\n\t\t\t!this.isExpanded() &&\n\t\t\tthis.hasChildren() !== false\n\t\t) {\n\t\t\tthis.setExpanded().done(function () {\n\t\t\t\tself.editCreateNode(mode, init);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tnewNode = this.addNode(init, mode);\n\n\t\t// #644: Don't filter new nodes.\n\t\tnewNode.match = true;\n\t\t$(newNode[tree.statusClassPropName])\n\t\t\t.removeClass(\"fancytree-hide\")\n\t\t\t.addClass(\"fancytree-match\");\n\n\t\tnewNode.makeVisible(/*{noAnimation: true}*/).done(function () {\n\t\t\t$(newNode[tree.statusClassPropName]).addClass(\"fancytree-edit-new\");\n\t\t\tself.tree.ext.edit.relatedNode = self;\n\t\t\tnewNode.editStart();\n\t\t});\n\t};\n\n\t/**\n\t * [ext-edit] Check if any node in this tree  in edit mode.\n\t *\n\t * @returns {FancytreeNode | null}\n\t * @alias Fancytree#isEditing\n\t * @requires jquery.fancytree.edit.js\n\t */\n\t$.ui.fancytree._FancytreeClass.prototype.isEditing = function () {\n\t\treturn this.ext.edit ? this.ext.edit.currentNode : null;\n\t};\n\n\t/**\n\t * [ext-edit] Check if this node is in edit mode.\n\t * @returns {Boolean} true if node is currently beeing edited\n\t * @alias FancytreeNode#isEditing\n\t * @requires jquery.fancytree.edit.js\n\t */\n\t$.ui.fancytree._FancytreeNodeClass.prototype.isEditing = function () {\n\t\treturn this.tree.ext.edit\n\t\t\t? this.tree.ext.edit.currentNode === this\n\t\t\t: false;\n\t};\n\n\t/*******************************************************************************\n\t * Extension code\n\t */\n\t$.ui.fancytree.registerExtension({\n\t\tname: \"edit\",\n\t\tversion: \"2.38.3\",\n\t\t// Default options for this extension.\n\t\toptions: {\n\t\t\tadjustWidthOfs: 4, // null: don't adjust input size to content\n\t\t\tallowEmpty: false, // Prevent empty input\n\t\t\tinputCss: { minWidth: \"3em\" },\n\t\t\t// triggerCancel: [\"esc\", \"tab\", \"click\"],\n\t\t\ttriggerStart: [\"f2\", \"mac+enter\", \"shift+click\"],\n\t\t\ttrim: true, // Trim whitespace before save\n\t\t\t// Events:\n\t\t\tbeforeClose: $.noop, // Return false to prevent cancel/save (data.input is available)\n\t\t\tbeforeEdit: $.noop, // Return false to prevent edit mode\n\t\t\tclose: $.noop, // Editor was removed\n\t\t\tedit: $.noop, // Editor was opened (available as data.input)\n\t\t\t//\t\tkeypress: $.noop,    // Not yet implemented\n\t\t\tsave: $.noop, // Save data.input.val() or return false to keep editor open\n\t\t},\n\t\t// Local attributes\n\t\tcurrentNode: null,\n\n\t\ttreeInit: function (ctx) {\n\t\t\tvar tree = ctx.tree;\n\n\t\t\tthis._superApply(arguments);\n\n\t\t\tthis.$container\n\t\t\t\t.addClass(\"fancytree-ext-edit\")\n\t\t\t\t.on(\"fancytreebeforeupdateviewport\", function (event, data) {\n\t\t\t\t\tvar editNode = tree.isEditing();\n\t\t\t\t\t// When scrolling, the TR may be re-used by another node, so the\n\t\t\t\t\t// active cell marker an\n\t\t\t\t\tif (editNode) {\n\t\t\t\t\t\teditNode.info(\"Cancel edit due to scroll event.\");\n\t\t\t\t\t\teditNode.editEnd(false, event);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\t\tnodeClick: function (ctx) {\n\t\t\tvar eventStr = $.ui.fancytree.eventToString(ctx.originalEvent),\n\t\t\t\ttriggerStart = ctx.options.edit.triggerStart;\n\n\t\t\tif (\n\t\t\t\teventStr === \"shift+click\" &&\n\t\t\t\t$.inArray(\"shift+click\", triggerStart) >= 0\n\t\t\t) {\n\t\t\t\tif (ctx.originalEvent.shiftKey) {\n\t\t\t\t\tctx.node.editStart();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (\n\t\t\t\teventStr === \"click\" &&\n\t\t\t\t$.inArray(\"clickActive\", triggerStart) >= 0\n\t\t\t) {\n\t\t\t\t// Only when click was inside title text (not aynwhere else in the row)\n\t\t\t\tif (\n\t\t\t\t\tctx.node.isActive() &&\n\t\t\t\t\t!ctx.node.isEditing() &&\n\t\t\t\t\t$(ctx.originalEvent.target).hasClass(\"fancytree-title\")\n\t\t\t\t) {\n\t\t\t\t\tctx.node.editStart();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this._superApply(arguments);\n\t\t},\n\t\tnodeDblclick: function (ctx) {\n\t\t\tif ($.inArray(\"dblclick\", ctx.options.edit.triggerStart) >= 0) {\n\t\t\t\tctx.node.editStart();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn this._superApply(arguments);\n\t\t},\n\t\tnodeKeydown: function (ctx) {\n\t\t\tswitch (ctx.originalEvent.which) {\n\t\t\t\tcase 113: // [F2]\n\t\t\t\t\tif ($.inArray(\"f2\", ctx.options.edit.triggerStart) >= 0) {\n\t\t\t\t\t\tctx.node.editStart();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.ENTER:\n\t\t\t\t\tif (\n\t\t\t\t\t\t$.inArray(\"mac+enter\", ctx.options.edit.triggerStart) >=\n\t\t\t\t\t\t\t0 &&\n\t\t\t\t\t\tisMac\n\t\t\t\t\t) {\n\t\t\t\t\t\tctx.node.editStart();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn this._superApply(arguments);\n\t\t},\n\t});\n\t// Value returned by `require('jquery.fancytree..')`\n\treturn $.ui.fancytree;\n}); // End of closure\n","// Extending Fancytree\n// ===================\n//\n// See also the [live demo](https://wwWendt.de/tech/fancytree/demo/sample-ext-childcounter.html) of this code.\n//\n// Every extension should have a comment header containing some information\n// about the author, copyright and licensing. Also a pointer to the latest\n// source code.\n// Prefix with `/*!` so the comment is not removed by the minifier.\n\n/*!\n * jquery.fancytree.childcounter.js\n *\n * Add a child counter bubble to tree nodes.\n * (Extension module for jquery.fancytree.js: https://github.com/mar10/fancytree/)\n *\n * Copyright (c) 2008-2023, Martin Wendt (https://wwWendt.de)\n *\n * Released under the MIT license\n * https://github.com/mar10/fancytree/wiki/LicenseInfo\n *\n * @version 2.38.3\n * @date 2023-02-01T20:52:50Z\n */\n\n// To keep the global namespace clean, we wrap everything in a closure.\n// The UMD wrapper pattern defines the dependencies on jQuery and the\n// Fancytree core module, and makes sure that we can use the `require()`\n// syntax with package loaders.\n\n(function (factory) {\n\tif (typeof define === \"function\" && define.amd) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([\"jquery\", \"./jquery.fancytree\"], factory);\n\t} else if (typeof module === \"object\" && module.exports) {\n\t\t// Node/CommonJS\n\t\trequire(\"./jquery.fancytree\");\n\t\tmodule.exports = factory(require(\"jquery\"));\n\t} else {\n\t\t// Browser globals\n\t\tfactory(jQuery);\n\t}\n})(function ($) {\n\t// Consider to use [strict mode](http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/)\n\t\"use strict\";\n\n\t// The [coding guidelines](http://contribute.jquery.org/style-guide/js/)\n\t// require jshint /eslint compliance.\n\t// But for this sample, we want to allow unused variables for demonstration purpose.\n\n\t/*eslint-disable no-unused-vars */\n\n\t// Adding methods\n\t// --------------\n\n\t// New member functions can be added to the `Fancytree` class.\n\t// This function will be available for every tree instance:\n\t//\n\t//     var tree = $.ui.fancytree.getTree(\"#tree\");\n\t//     tree.countSelected(false);\n\n\t$.ui.fancytree._FancytreeClass.prototype.countSelected = function (\n\t\ttopOnly\n\t) {\n\t\tvar tree = this,\n\t\t\ttreeOptions = tree.options;\n\n\t\treturn tree.getSelectedNodes(topOnly).length;\n\t};\n\n\t// The `FancytreeNode` class can also be easily extended. This would be called\n\t// like\n\t//     node.updateCounters();\n\t//\n\t// It is also good practice to add a docstring comment.\n\t/**\n\t * [ext-childcounter] Update counter badges for `node` and its parents.\n\t * May be called in the `loadChildren` event, to update parents of lazy loaded\n\t * nodes.\n\t * @alias FancytreeNode#updateCounters\n\t * @requires jquery.fancytree.childcounters.js\n\t */\n\t$.ui.fancytree._FancytreeNodeClass.prototype.updateCounters = function () {\n\t\tvar node = this,\n\t\t\t$badge = $(\"span.fancytree-childcounter\", node.span),\n\t\t\textOpts = node.tree.options.childcounter,\n\t\t\tcount = node.countChildren(extOpts.deep);\n\n\t\tnode.data.childCounter = count;\n\t\tif (\n\t\t\t(count || !extOpts.hideZeros) &&\n\t\t\t(!node.isExpanded() || !extOpts.hideExpanded)\n\t\t) {\n\t\t\tif (!$badge.length) {\n\t\t\t\t$badge = $(\"<span class='fancytree-childcounter'/>\").appendTo(\n\t\t\t\t\t$(\n\t\t\t\t\t\t\"span.fancytree-icon,span.fancytree-custom-icon\",\n\t\t\t\t\t\tnode.span\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\t$badge.text(count);\n\t\t} else {\n\t\t\t$badge.remove();\n\t\t}\n\t\tif (extOpts.deep && !node.isTopLevel() && !node.isRootNode()) {\n\t\t\tnode.parent.updateCounters();\n\t\t}\n\t};\n\n\t// Finally, we can extend the widget API and create functions that are called\n\t// like so:\n\t//\n\t//     $(\"#tree\").fancytree(\"widgetMethod1\", \"abc\");\n\n\t$.ui.fancytree.prototype.widgetMethod1 = function (arg1) {\n\t\tvar tree = this.tree;\n\t\treturn arg1;\n\t};\n\n\t// Register a Fancytree extension\n\t// ------------------------------\n\t// A full blown extension, extension is available for all trees and can be\n\t// enabled like so (see also the [live demo](https://wwWendt.de/tech/fancytree/demo/sample-ext-childcounter.html)):\n\t//\n\t//    <script src=\"../src/jquery.fancytree.js\"></script>\n\t//    <script src=\"../src/jquery.fancytree.childcounter.js\"></script>\n\t//    ...\n\t//\n\t//     $(\"#tree\").fancytree({\n\t//         extensions: [\"childcounter\"],\n\t//         childcounter: {\n\t//             hideExpanded: true\n\t//         },\n\t//         ...\n\t//     });\n\t//\n\n\t/* 'childcounter' extension */\n\t$.ui.fancytree.registerExtension({\n\t\t// Every extension must be registered by a unique name.\n\t\tname: \"childcounter\",\n\t\t// Version information should be compliant with [semver](http://semver.org)\n\t\tversion: \"2.38.3\",\n\n\t\t// Extension specific options and their defaults.\n\t\t// This options will be available as `tree.options.childcounter.hideExpanded`\n\n\t\toptions: {\n\t\t\tdeep: true,\n\t\t\thideZeros: true,\n\t\t\thideExpanded: false,\n\t\t},\n\n\t\t// Attributes other than `options` (or functions) can be defined here, and\n\t\t// will be added to the tree.ext.EXTNAME namespace, in this case `tree.ext.childcounter.foo`.\n\t\t// They can also be accessed as `this._local.foo` from within the extension\n\t\t// methods.\n\t\tfoo: 42,\n\n\t\t// Local functions are prefixed with an underscore '_'.\n\t\t// Callable as `this._local._appendCounter()`.\n\n\t\t_appendCounter: function (bar) {\n\t\t\tvar tree = this;\n\t\t},\n\n\t\t// **Override virtual methods for this extension.**\n\t\t//\n\t\t// Fancytree implements a number of 'hook methods', prefixed by 'node...' or 'tree...'.\n\t\t// with a `ctx` argument (see [EventData](https://wwWendt.de/tech/fancytree/doc/jsdoc/global.html#EventData)\n\t\t// for details) and an extended calling context:<br>\n\t\t// `this`       : the Fancytree instance<br>\n\t\t// `this._local`: the namespace that contains extension attributes and private methods (same as this.ext.EXTNAME)<br>\n\t\t// `this._super`: the virtual function that was overridden (member of previous extension or Fancytree)\n\t\t//\n\t\t// See also the [complete list of available hook functions](https://wwWendt.de/tech/fancytree/doc/jsdoc/Fancytree_Hooks.html).\n\n\t\t/* Init */\n\t\t// `treeInit` is triggered when a tree is initalized. We can set up classes or\n\t\t// bind event handlers here...\n\t\ttreeInit: function (ctx) {\n\t\t\tvar tree = this, // same as ctx.tree,\n\t\t\t\topts = ctx.options,\n\t\t\t\textOpts = ctx.options.childcounter;\n\t\t\t// Optionally check for dependencies with other extensions\n\t\t\t/* this._requireExtension(\"glyph\", false, false); */\n\t\t\t// Call the base implementation\n\t\t\tthis._superApply(arguments);\n\t\t\t// Add a class to the tree container\n\t\t\tthis.$container.addClass(\"fancytree-ext-childcounter\");\n\t\t},\n\n\t\t// Destroy this tree instance (we only call the default implementation, so\n\t\t// this method could as well be omitted).\n\n\t\ttreeDestroy: function (ctx) {\n\t\t\tthis._superApply(arguments);\n\t\t},\n\n\t\t// Overload the `renderTitle` hook, to append a counter badge\n\t\tnodeRenderTitle: function (ctx, title) {\n\t\t\tvar node = ctx.node,\n\t\t\t\textOpts = ctx.options.childcounter,\n\t\t\t\tcount =\n\t\t\t\t\tnode.data.childCounter == null\n\t\t\t\t\t\t? node.countChildren(extOpts.deep)\n\t\t\t\t\t\t: +node.data.childCounter;\n\t\t\t// Let the base implementation render the title\n\t\t\t// We use `_super()` instead of `_superApply()` here, since it is a little bit\n\t\t\t// more performant when called often\n\t\t\tthis._super(ctx, title);\n\t\t\t// Append a counter badge\n\t\t\tif (\n\t\t\t\t(count || !extOpts.hideZeros) &&\n\t\t\t\t(!node.isExpanded() || !extOpts.hideExpanded)\n\t\t\t) {\n\t\t\t\t$(\n\t\t\t\t\t\"span.fancytree-icon,span.fancytree-custom-icon\",\n\t\t\t\t\tnode.span\n\t\t\t\t).append(\n\t\t\t\t\t$(\"<span class='fancytree-childcounter'/>\").text(count)\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\t// Overload the `setExpanded` hook, so the counters are updated\n\t\tnodeSetExpanded: function (ctx, flag, callOpts) {\n\t\t\tvar tree = ctx.tree,\n\t\t\t\tnode = ctx.node;\n\t\t\t// Let the base implementation expand/collapse the node, then redraw the title\n\t\t\t// after the animation has finished\n\t\t\treturn this._superApply(arguments).always(function () {\n\t\t\t\ttree.nodeRenderTitle(ctx);\n\t\t\t});\n\t\t},\n\n\t\t// End of extension definition\n\t});\n\t// Value returned by `require('jquery.fancytree..')`\n\treturn $.ui.fancytree;\n}); // End of closure\n","/*!\n * jquery.fancytree.columnview.js\n *\n * Render tree like a Mac Finder's column view.\n * (Extension module for jquery.fancytree.js: https://github.com/mar10/fancytree/)\n *\n * Copyright (c) 2008-2023, Martin Wendt (https://wwWendt.de)\n *\n * Released under the MIT license\n * https://github.com/mar10/fancytree/wiki/LicenseInfo\n *\n * @version 2.38.3\n * @date 2023-02-01T20:52:50Z\n */\n\n(function (factory) {\n\tif (typeof define === \"function\" && define.amd) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([\"jquery\", \"./jquery.fancytree\"], factory);\n\t} else if (typeof module === \"object\" && module.exports) {\n\t\t// Node/CommonJS\n\t\trequire(\"./jquery.fancytree\");\n\t\tmodule.exports = factory(require(\"jquery\"));\n\t} else {\n\t\t// Browser globals\n\t\tfactory(jQuery);\n\t}\n})(function ($) {\n\t\"use strict\";\n\n\t/*******************************************************************************\n\t * Private functions and variables\n\t */\n\tvar _assert = $.ui.fancytree.assert,\n\t\tFT = $.ui.fancytree;\n\n\t/*******************************************************************************\n\t * Private functions and variables\n\t */\n\t$.ui.fancytree.registerExtension({\n\t\tname: \"columnview\",\n\t\tversion: \"2.38.3\",\n\t\t// Default options for this extension.\n\t\toptions: {},\n\t\t// Overide virtual methods for this extension.\n\t\t// `this`       : is this extension object\n\t\t// `this._base` : the Fancytree instance\n\t\t// `this._super`: the virtual function that was overriden (member of prev. extension or Fancytree)\n\t\ttreeInit: function (ctx) {\n\t\t\tvar $tdFirst,\n\t\t\t\t$ul,\n\t\t\t\ttree = ctx.tree,\n\t\t\t\t$table = tree.widget.element;\n\n\t\t\ttree.tr = $(\"tbody tr\", $table)[0];\n\t\t\ttree.$tdList = $(\">td\", tree.tr);\n\t\t\ttree.columnCount = tree.$tdList.length;\n\t\t\t// Perform default behavior\n\t\t\tthis._superApply(arguments);\n\t\t\t// Standard Fancytree created a root <ul>. Now move this into first table cell\n\t\t\t$ul = $(tree.rootNode.ul);\n\t\t\t$tdFirst = tree.$tdList.eq(0);\n\n\t\t\t_assert(\n\t\t\t\t$.inArray(\"table\", this.options.extensions) < 0,\n\t\t\t\t\"columnview extensions must not use ext-table\"\n\t\t\t);\n\t\t\t_assert(\n\t\t\t\ttree.columnCount >= 2,\n\t\t\t\t\"columnview target must be a table with at least two columns\"\n\t\t\t);\n\n\t\t\t$ul.removeClass(\"fancytree-container\").removeAttr(\"tabindex\");\n\t\t\ttree.$container = $table;\n\t\t\t$table\n\t\t\t\t.addClass(\"fancytree-container fancytree-ext-columnview\")\n\t\t\t\t.attr(\"tabindex\", \"0\");\n\n\t\t\t$tdFirst.empty();\n\t\t\t$ul.detach().appendTo($tdFirst);\n\n\t\t\t// Force some required options\n\t\t\ttree.widget.options.autoCollapse = true;\n\t\t\t// tree.widget.options.autoActivate = true;\n\t\t\ttree.widget.options.toggleEffect = false;\n\t\t\ttree.widget.options.clickFolderMode = 1;\n\n\t\t\t$table\n\t\t\t\t// Make sure that only active path is expanded when a node is activated:\n\t\t\t\t.on(\"fancytreeactivate\", function (event, data) {\n\t\t\t\t\tvar node = data.node,\n\t\t\t\t\t\ttree = data.tree,\n\t\t\t\t\t\tlevel = node.getLevel();\n\n\t\t\t\t\ttree._callHook(\"nodeCollapseSiblings\", node);\n\t\t\t\t\t// Clear right neighbours\n\t\t\t\t\tif (!node.expanded) {\n\t\t\t\t\t\ttree.$tdList.eq(level).nextAll().empty();\n\t\t\t\t\t}\n\t\t\t\t\t// Expand nodes on activate, so we populate the right neighbor cell\n\t\t\t\t\tif (!node.expanded && (node.children || node.lazy)) {\n\t\t\t\t\t\tnode.setExpanded();\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t// Adjust keyboard behaviour:\n\t\t\t\t.on(\"fancytreekeydown\", function (event, data) {\n\t\t\t\t\tvar next = null,\n\t\t\t\t\t\thandled = true,\n\t\t\t\t\t\tnode = data.node || data.tree.getFirstChild();\n\n\t\t\t\t\tif (node.getLevel() >= tree.columnCount) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tswitch (FT.eventToString(event)) {\n\t\t\t\t\t\tcase \"down\":\n\t\t\t\t\t\t\tnext = node.getNextSibling();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"left\":\n\t\t\t\t\t\t\tif (!node.isTopLevel()) {\n\t\t\t\t\t\t\t\tnext = node.getParent();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"right\":\n\t\t\t\t\t\t\tnext = node.getFirstChild();\n\t\t\t\t\t\t\tif (!next) {\n\t\t\t\t\t\t\t\t// default processing: expand or ignore\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Prefer an expanded child if any\n\t\t\t\t\t\t\tnext.visitSiblings(function (n) {\n\t\t\t\t\t\t\t\tif (n.expanded) {\n\t\t\t\t\t\t\t\t\tnext = n;\n\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}, true);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"up\":\n\t\t\t\t\t\t\tnext = node.getPrevSibling();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\thandled = false;\n\t\t\t\t\t}\n\t\t\t\t\tif (next) {\n\t\t\t\t\t\tnext.setActive();\n\t\t\t\t\t}\n\t\t\t\t\treturn !handled;\n\t\t\t\t});\n\t\t},\n\t\tnodeSetExpanded: function (ctx, flag, callOpts) {\n\t\t\tvar $wait,\n\t\t\t\tnode = ctx.node,\n\t\t\t\ttree = ctx.tree,\n\t\t\t\tlevel = node.getLevel();\n\n\t\t\tif (flag !== false && !node.expanded && node.isUndefined()) {\n\t\t\t\t$wait = $(\n\t\t\t\t\t\"<span class='fancytree-icon fancytree-icon-loading'>\"\n\t\t\t\t);\n\t\t\t\ttree.$tdList.eq(level).empty().append($wait);\n\t\t\t}\n\t\t\treturn this._superApply(arguments);\n\t\t},\n\t\tnodeRemoveChildren: function (ctx) {\n\t\t\t// #899: node's children removed: remove child marker...\n\t\t\t$(ctx.node.span).find(\"span.fancytree-cv-right\").remove();\n\t\t\t// ...and clear right columns\n\t\t\tctx.tree.$tdList.eq(ctx.node.getLevel()).nextAll().empty();\n\t\t\treturn this._superApply(arguments);\n\t\t},\n\t\tnodeRender: function (ctx, force, deep, collapsed, _recursive) {\n\t\t\t// Render standard nested <ul> - <li> hierarchy\n\t\t\tthis._super(ctx, force, deep, collapsed, _recursive);\n\t\t\t// Remove expander and add a trailing triangle instead\n\t\t\tvar level,\n\t\t\t\t$tdChild,\n\t\t\t\t$ul,\n\t\t\t\ttree = ctx.tree,\n\t\t\t\tnode = ctx.node,\n\t\t\t\t$span = $(node.span);\n\n\t\t\t$span.find(\"span.fancytree-expander\").remove();\n\t\t\tif (\n\t\t\t\tnode.hasChildren() !== false &&\n\t\t\t\t!$span.find(\"span.fancytree-cv-right\").length\n\t\t\t) {\n\t\t\t\t$span.append(\n\t\t\t\t\t$(\"<span class='fancytree-icon fancytree-cv-right'>\")\n\t\t\t\t);\n\t\t\t}\n\t\t\t// Move <ul> with children into the appropriate <td>\n\t\t\tif (node.ul && node.expanded) {\n\t\t\t\tnode.ul.style.display = \"\"; // might be hidden if RIGHT was pressed\n\t\t\t\tlevel = node.getLevel();\n\t\t\t\tif (level < tree.columnCount) {\n\t\t\t\t\t// only if we are not in the last column\n\t\t\t\t\t$tdChild = tree.$tdList.eq(level);\n\t\t\t\t\t$ul = $(node.ul).detach();\n\t\t\t\t\t$tdChild.empty().append($ul);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t});\n\t// Value returned by `require('jquery.fancytree..')`\n\treturn $.ui.fancytree;\n}); // End of closure\n","/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT © Zeno Rocha\n */\n!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){\"use strict\";n.d(e,{default:function(){return b}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),r=n.n(e);function c(t){try{return document.execCommand(t)}catch(t){return}}var a=function(t){t=r()(t);return c(\"cut\"),t};function o(t,e){var n,o,t=(n=t,o=\"rtl\"===document.documentElement.getAttribute(\"dir\"),(t=document.createElement(\"textarea\")).style.fontSize=\"12pt\",t.style.border=\"0\",t.style.padding=\"0\",t.style.margin=\"0\",t.style.position=\"absolute\",t.style[o?\"right\":\"left\"]=\"-9999px\",o=window.pageYOffset||document.documentElement.scrollTop,t.style.top=\"\".concat(o,\"px\"),t.setAttribute(\"readonly\",\"\"),t.value=n,t);return e.container.appendChild(t),e=r()(t),c(\"copy\"),t.remove(),e}var f=function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{container:document.body},n=\"\";return\"string\"==typeof t?n=o(t,e):t instanceof HTMLInputElement&&![\"text\",\"search\",\"url\",\"tel\",\"password\"].includes(null==t?void 0:t.type)?n=o(t.value,e):(n=r()(t),c(\"copy\")),n};function l(t){return(l=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t})(t)}var s=function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},e=t.action,n=void 0===e?\"copy\":e,o=t.container,e=t.target,t=t.text;if(\"copy\"!==n&&\"cut\"!==n)throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');if(void 0!==e){if(!e||\"object\"!==l(e)||1!==e.nodeType)throw new Error('Invalid \"target\" value, use a valid Element');if(\"copy\"===n&&e.hasAttribute(\"disabled\"))throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');if(\"cut\"===n&&(e.hasAttribute(\"readonly\")||e.hasAttribute(\"disabled\")))throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes')}return t?f(t,{container:o}):e?\"cut\"===n?a(e):f(e,{container:o}):void 0};function p(t){return(p=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t})(t)}function d(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,\"value\"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}function y(t,e){return(y=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}function h(n){var o=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}();return function(){var t,e=v(n);return t=o?(t=v(this).constructor,Reflect.construct(e,arguments,t)):e.apply(this,arguments),e=this,!(t=t)||\"object\"!==p(t)&&\"function\"!=typeof t?function(t){if(void 0!==t)return t;throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\")}(e):t}}function v(t){return(v=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}function m(t,e){t=\"data-clipboard-\".concat(t);if(e.hasAttribute(t))return e.getAttribute(t)}var b=function(){!function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function\");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&y(t,e)}(r,i());var t,e,n,o=h(r);function r(t,e){var n;return function(t){if(!(t instanceof r))throw new TypeError(\"Cannot call a class as a function\")}(this),(n=o.call(this)).resolveOptions(e),n.listenClick(t),n}return t=r,n=[{key:\"copy\",value:function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{container:document.body};return f(t,e)}},{key:\"cut\",value:function(t){return a(t)}},{key:\"isSupported\",value:function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:[\"copy\",\"cut\"],t=\"string\"==typeof t?[t]:t,e=!!document.queryCommandSupported;return t.forEach(function(t){e=e&&!!document.queryCommandSupported(t)}),e}}],(e=[{key:\"resolveOptions\",value:function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};this.action=\"function\"==typeof t.action?t.action:this.defaultAction,this.target=\"function\"==typeof t.target?t.target:this.defaultTarget,this.text=\"function\"==typeof t.text?t.text:this.defaultText,this.container=\"object\"===p(t.container)?t.container:document.body}},{key:\"listenClick\",value:function(t){var e=this;this.listener=u()(t,\"click\",function(t){return e.onClick(t)})}},{key:\"onClick\",value:function(t){var e=t.delegateTarget||t.currentTarget,n=this.action(e)||\"copy\",t=s({action:n,container:this.container,target:this.target(e),text:this.text(e)});this.emit(t?\"success\":\"error\",{action:n,text:t,trigger:e,clearSelection:function(){e&&e.focus(),window.getSelection().removeAllRanges()}})}},{key:\"defaultAction\",value:function(t){return m(\"action\",t)}},{key:\"defaultTarget\",value:function(t){t=m(\"target\",t);if(t)return document.querySelector(t)}},{key:\"defaultText\",value:function(t){return m(\"text\",t)}},{key:\"destroy\",value:function(){this.listener.destroy()}}])&&d(t.prototype,e),n&&d(t,n),r}()},828:function(t){var e;\"undefined\"==typeof Element||Element.prototype.matches||((e=Element.prototype).matches=e.matchesSelector||e.mozMatchesSelector||e.msMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector),t.exports=function(t,e){for(;t&&9!==t.nodeType;){if(\"function\"==typeof t.matches&&t.matches(e))return t;t=t.parentNode}}},438:function(t,e,n){var u=n(828);function i(t,e,n,o,r){var i=function(e,n,t,o){return function(t){t.delegateTarget=u(t.target,n),t.delegateTarget&&o.call(e,t)}}.apply(this,arguments);return t.addEventListener(n,i,r),{destroy:function(){t.removeEventListener(n,i,r)}}}t.exports=function(t,e,n,o,r){return\"function\"==typeof t.addEventListener?i.apply(null,arguments):\"function\"==typeof n?i.bind(null,document).apply(null,arguments):(\"string\"==typeof t&&(t=document.querySelectorAll(t)),Array.prototype.map.call(t,function(t){return i(t,e,n,o,r)}))}},879:function(t,n){n.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},n.nodeList=function(t){var e=Object.prototype.toString.call(t);return void 0!==t&&(\"[object NodeList]\"===e||\"[object HTMLCollection]\"===e)&&\"length\"in t&&(0===t.length||n.node(t[0]))},n.string=function(t){return\"string\"==typeof t||t instanceof String},n.fn=function(t){return\"[object Function]\"===Object.prototype.toString.call(t)}},370:function(t,e,n){var f=n(879),l=n(438);t.exports=function(t,e,n){if(!t&&!e&&!n)throw new Error(\"Missing required arguments\");if(!f.string(e))throw new TypeError(\"Second argument must be a String\");if(!f.fn(n))throw new TypeError(\"Third argument must be a Function\");if(f.node(t))return c=e,a=n,(u=t).addEventListener(c,a),{destroy:function(){u.removeEventListener(c,a)}};if(f.nodeList(t))return o=t,r=e,i=n,Array.prototype.forEach.call(o,function(t){t.addEventListener(r,i)}),{destroy:function(){Array.prototype.forEach.call(o,function(t){t.removeEventListener(r,i)})}};if(f.string(t))return t=t,e=e,n=n,l(document.body,t,e,n);throw new TypeError(\"First argument must be a String, HTMLElement, HTMLCollection, or NodeList\");var o,r,i,u,c,a}},817:function(t){t.exports=function(t){var e,n=\"SELECT\"===t.nodeName?(t.focus(),t.value):\"INPUT\"===t.nodeName||\"TEXTAREA\"===t.nodeName?((e=t.hasAttribute(\"readonly\"))||t.setAttribute(\"readonly\",\"\"),t.select(),t.setSelectionRange(0,t.value.length),e||t.removeAttribute(\"readonly\"),t.value):(t.hasAttribute(\"contenteditable\")&&t.focus(),n=window.getSelection(),(e=document.createRange()).selectNodeContents(t),n.removeAllRanges(),n.addRange(e),n.toString());return n}},279:function(t){function e(){}e.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){var o=this;function r(){o.off(t,r),e.apply(n,arguments)}return r._=e,this.on(t,r,n)},emit:function(t){for(var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,r=n.length;o<r;o++)n[o].fn.apply(n[o].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),o=n[t],r=[];if(o&&e)for(var i=0,u=o.length;i<u;i++)o[i].fn!==e&&o[i].fn._!==e&&r.push(o[i]);return r.length?n[t]=r:delete n[t],this}},t.exports=e,t.exports.TinyEmitter=e}},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.d=function(t,e){for(var n in e)o.o(e,n)&&!o.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},o.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},o(686).default;function o(t){if(r[t])return r[t].exports;var e=r[t]={exports:{}};return n[t](e,e.exports,o),e.exports}var n,r});","/*!\n * Datepicker v1.0.10\n * https://fengyuanchen.github.io/datepicker\n *\n * Copyright 2014-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2020-09-29T14:46:10.983Z\n */\n!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?e(require(\"jquery\")):\"function\"==typeof define&&define.amd?define([\"jquery\"],e):e((t=\"undefined\"!=typeof globalThis?globalThis:t||self).jQuery)}(this,function(k){\"use strict\";function s(t,e){for(var i=0;i<e.length;i++){var a=e[i];a.enumerable=a.enumerable||!1,a.configurable=!0,\"value\"in a&&(a.writable=!0),Object.defineProperty(t,a.key,a)}}k=k&&k.hasOwnProperty(\"default\")?k.default:k;var n={autoShow:!1,autoHide:!1,autoPick:!1,inline:!1,container:null,trigger:null,language:\"\",format:\"mm/dd/yyyy\",date:null,startDate:null,endDate:null,startView:0,weekStart:0,yearFirst:!1,yearSuffix:\"\",days:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],daysShort:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],daysMin:[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],months:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],monthsShort:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],itemTag:\"li\",mutedClass:\"muted\",pickedClass:\"picked\",disabledClass:\"disabled\",highlightedClass:\"highlighted\",template:'<div class=\"datepicker-container\"><div class=\"datepicker-panel\" data-view=\"years picker\"><ul><li data-view=\"years prev\">&lsaquo;</li><li data-view=\"years current\"></li><li data-view=\"years next\">&rsaquo;</li></ul><ul data-view=\"years\"></ul></div><div class=\"datepicker-panel\" data-view=\"months picker\"><ul><li data-view=\"year prev\">&lsaquo;</li><li data-view=\"year current\"></li><li data-view=\"year next\">&rsaquo;</li></ul><ul data-view=\"months\"></ul></div><div class=\"datepicker-panel\" data-view=\"days picker\"><ul><li data-view=\"month prev\">&lsaquo;</li><li data-view=\"month current\"></li><li data-view=\"month next\">&rsaquo;</li></ul><ul data-view=\"week\"></ul><ul data-view=\"days\"></ul></div></div>',offset:10,zIndex:1e3,filter:null,show:null,hide:null,pick:null},t=\"undefined\"!=typeof window,e=t?window:{},i=t&&\"ontouchstart\"in e.document.documentElement,l=\"datepicker\",r=\"click.\".concat(l),h=\"focus.\".concat(l),o=\"hide.\".concat(l),c=\"keyup.\".concat(l),d=\"pick.\".concat(l),a=\"resize.\".concat(l),u=\"scroll.\".concat(l),p=\"show.\".concat(l),f=\"touchstart.\".concat(l),g=\"\".concat(l,\"-hide\"),y={},m=0,v=1,w=2,D=Object.prototype.toString;function b(t){return\"string\"==typeof t}var C=Number.isNaN||e.isNaN;function $(t){return\"number\"==typeof t&&!C(t)}function x(t){return void 0===t}function F(t){return\"date\"===(e=t,D.call(e).slice(8,-1).toLowerCase())&&!C(t.getTime());var e}function M(a,s){for(var t=arguments.length,n=new Array(2<t?t-2:0),e=2;e<t;e++)n[e-2]=arguments[e];return function(){for(var t=arguments.length,e=new Array(t),i=0;i<t;i++)e[i]=arguments[i];return a.apply(s,n.concat(e))}}function Y(t){return'[data-view=\"'.concat(t,'\"]')}function O(t,e){return[31,(t=t)%4==0&&t%100!=0||t%400==0?29:28,31,30,31,30,31,31,30,31,30,31][e]}function V(t,e,i){return Math.min(i,O(t,e))}var T=/(y|m|d)+/g;function I(t,e){var i=1<arguments.length&&void 0!==e?e:1,e=String(Math.abs(t)),a=e.length,s=\"\";for(t<0&&(s+=\"-\");a<i;)a+=1,s+=\"0\";return s+e}var S,P=/\\d+/g,N={show:function(){this.built||this.build(),this.shown||this.trigger(p).isDefaultPrevented()||(this.shown=!0,this.$picker.removeClass(g).on(r,k.proxy(this.click,this)),this.showView(this.options.startView),this.inline||(this.$scrollParent.on(u,k.proxy(this.place,this)),k(window).on(a,this.onResize=M(this.place,this)),k(document).on(r,this.onGlobalClick=M(this.globalClick,this)),k(document).on(c,this.onGlobalKeyup=M(this.globalKeyup,this)),i&&k(document).on(f,this.onTouchStart=M(this.touchstart,this)),this.place()))},hide:function(){this.shown&&(this.trigger(o).isDefaultPrevented()||(this.shown=!1,this.$picker.addClass(g).off(r,this.click),this.inline||(this.$scrollParent.off(u,this.place),k(window).off(a,this.onResize),k(document).off(r,this.onGlobalClick),k(document).off(c,this.onGlobalKeyup),i&&k(document).off(f,this.onTouchStart))))},toggle:function(){this.shown?this.hide():this.show()},update:function(){var t=this.getValue();t!==this.oldValue&&(this.setDate(t,!0),this.oldValue=t)},pick:function(t){var e=this.$element,i=this.date;this.trigger(d,{view:t||\"\",date:i}).isDefaultPrevented()||(i=this.formatDate(this.date),this.setValue(i),this.isInput&&(e.trigger(\"input\"),e.trigger(\"change\")))},reset:function(){this.setDate(this.initialDate,!0),this.setValue(this.initialValue),this.shown&&this.showView(this.options.startView)},getMonthName:function(t,e){var i=this.options,a=i.monthsShort,i=i.months;return k.isNumeric(t)?t=Number(t):x(e)&&(e=t),!0===e&&(i=a),i[$(t)?t:this.date.getMonth()]},getDayName:function(t,e,i){var a=this.options,s=a.days;return k.isNumeric(t)?t=Number(t):(x(i)&&(i=e),x(e)&&(e=t)),i?s=a.daysMin:e&&(s=a.daysShort),s[$(t)?t:this.date.getDay()]},getDate:function(t){var e=this.date;return t?this.formatDate(e):new Date(e)},setDate:function(t,e){var i=this.options.filter;if(F(t)||b(t)){if(t=this.parseDate(t),k.isFunction(i)&&!1===i.call(this.$element,t,\"day\"))return;this.date=t,this.viewDate=new Date(t),e||this.pick(),this.built&&this.render()}},setStartDate:function(t){F(t)||b(t)?this.startDate=this.parseDate(t):this.startDate=null,this.built&&this.render()},setEndDate:function(t){F(t)||b(t)?this.endDate=this.parseDate(t):this.endDate=null,this.built&&this.render()},parseDate:function(a){var s=this.format,t=[];return F(a)||(b(a)&&(t=a.match(P)||[]),F(a=a?new Date(a):new Date)||(a=new Date),t.length===s.parts.length&&(k.each(t,function(t,e){var i=parseInt(e,10);switch(s.parts[t]){case\"yy\":a.setFullYear(2e3+i);break;case\"yyyy\":a.setFullYear(2===e.length?2e3+i:i);break;case\"mm\":case\"m\":a.setMonth(i-1)}}),k.each(t,function(t,e){e=parseInt(e,10);switch(s.parts[t]){case\"dd\":case\"d\":a.setDate(e)}}))),new Date(a.getFullYear(),a.getMonth(),a.getDate())},formatDate:function(t){var e,i,a,s=this.format,n=\"\";return F(t)&&(e=t.getFullYear(),i=t.getMonth(),t=t.getDate(),a={d:t,dd:I(t,2),m:i+1,mm:I(i+1,2),yy:String(e).substring(2),yyyy:I(e,4)},n=s.source,k.each(s.parts,function(t,e){n=n.replace(e,a[e])})),n},destroy:function(){this.unbind(),this.unbuild(),this.$element.removeData(l)}},j={click:function(t){var e=k(t.target),i=this.options,a=this.date,s=this.viewDate,n=this.format;if(t.stopPropagation(),t.preventDefault(),!e.hasClass(\"disabled\")){var r=e.data(\"view\"),h=s.getFullYear(),o=s.getMonth(),t=s.getDate();switch(r){case\"years prev\":case\"years next\":h=\"years prev\"===r?h-10:h+10,s.setFullYear(h),s.setDate(V(h,o,t)),this.renderYears();break;case\"year prev\":case\"year next\":h=\"year prev\"===r?h-1:h+1,s.setFullYear(h),s.setDate(V(h,o,t)),this.renderMonths();break;case\"year current\":n.hasYear&&this.showView(w);break;case\"year picked\":n.hasMonth?this.showView(v):(e.siblings(\".\".concat(i.pickedClass)).removeClass(i.pickedClass).data(\"view\",\"year\"),this.hideView()),this.pick(\"year\");break;case\"year\":h=parseInt(e.text(),10),a.setDate(V(h,o,t)),a.setFullYear(h),s.setDate(V(h,o,t)),s.setFullYear(h),n.hasMonth?this.showView(v):(e.addClass(i.pickedClass).data(\"view\",\"year picked\").siblings(\".\".concat(i.pickedClass)).removeClass(i.pickedClass).data(\"view\",\"year\"),this.hideView()),this.pick(\"year\");break;case\"month prev\":case\"month next\":(o=\"month prev\"===r?o-1:o+1)<0?(--h,o+=12):11<o&&(h+=1,o-=12),s.setFullYear(h),s.setDate(V(h,o,t)),s.setMonth(o),this.renderDays();break;case\"month current\":n.hasMonth&&this.showView(v);break;case\"month picked\":n.hasDay?this.showView(m):(e.siblings(\".\".concat(i.pickedClass)).removeClass(i.pickedClass).data(\"view\",\"month\"),this.hideView()),this.pick(\"month\");break;case\"month\":o=k.inArray(e.text(),i.monthsShort),a.setFullYear(h),a.setDate(V(h,o,t)),a.setMonth(o),s.setFullYear(h),s.setDate(V(h,o,t)),s.setMonth(o),n.hasDay?this.showView(m):(e.addClass(i.pickedClass).data(\"view\",\"month picked\").siblings(\".\".concat(i.pickedClass)).removeClass(i.pickedClass).data(\"view\",\"month\"),this.hideView()),this.pick(\"month\");break;case\"day prev\":case\"day next\":case\"day\":\"day prev\"===r?--o:\"day next\"===r&&(o+=1),t=parseInt(e.text(),10),a.setDate(1),a.setFullYear(h),a.setMonth(o),a.setDate(t),s.setDate(1),s.setFullYear(h),s.setMonth(o),s.setDate(t),this.renderDays(),\"day\"===r&&this.hideView(),this.pick(\"day\");break;case\"day picked\":this.hideView(),this.pick(\"day\")}}},globalClick:function(t){for(var e=t.target,i=this.element,a=this.$trigger[0],s=!0;e!==document;){if(e===a||e===i){s=!1;break}e=e.parentNode}s&&this.hide()},keyup:function(){this.update()},globalKeyup:function(t){var e=t.target,i=t.key,t=t.keyCode;this.isInput&&e!==this.element&&this.shown&&(\"Tab\"===i||9===t)&&this.hide()},touchstart:function(t){t=t.target;this.isInput&&t!==this.element&&!k.contains(this.$picker[0],t)&&(this.hide(),this.element.blur())}},q={render:function(){this.renderYears(),this.renderMonths(),this.renderDays()},renderWeek:function(){var i=this,a=[],t=this.options,e=t.weekStart,t=t.daysMin,e=parseInt(e,10)%7,t=t.slice(e).concat(t.slice(0,e));k.each(t,function(t,e){a.push(i.createItem({text:e}))}),this.$week.html(a.join(\"\"))},renderYears:function(){for(var t=this.options,e=this.startDate,i=this.endDate,a=t.disabledClass,s=t.filter,t=t.yearSuffix,n=this.viewDate.getFullYear(),r=(new Date).getFullYear(),h=this.date.getFullYear(),o=[],l=!1,c=!1,d=-5;d<=6;d+=1){var u=new Date(n+d,1,1),p=!1;e&&(p=u.getFullYear()<e.getFullYear(),-5===d&&(l=p)),!p&&i&&(p=u.getFullYear()>i.getFullYear(),6===d&&(c=p)),!p&&s&&(p=!1===s.call(this.$element,u,\"year\"));var f=n+d===h,g=f?\"year picked\":\"year\";o.push(this.createItem({picked:f,disabled:p,text:n+d,view:p?\"year disabled\":g,highlighted:u.getFullYear()===r}))}this.$yearsPrev.toggleClass(a,l),this.$yearsNext.toggleClass(a,c),this.$yearsCurrent.toggleClass(a,!0).html(\"\".concat(n+-5+t,\" - \").concat(n+6).concat(t)),this.$years.html(o.join(\"\"))},renderMonths:function(){for(var t=this.options,e=this.startDate,i=this.endDate,a=this.viewDate,s=t.disabledClass||\"\",n=t.monthsShort,r=k.isFunction(t.filter)&&t.filter,h=a.getFullYear(),a=new Date,o=a.getFullYear(),l=a.getMonth(),c=this.date.getFullYear(),d=this.date.getMonth(),u=[],p=!1,f=!1,g=0;g<=11;g+=1){var y=new Date(h,g,1),m=!1;e&&(m=(p=y.getFullYear()===e.getFullYear())&&y.getMonth()<e.getMonth()),!m&&i&&(m=(f=y.getFullYear()===i.getFullYear())&&y.getMonth()>i.getMonth()),!m&&r&&(m=!1===r.call(this.$element,y,\"month\"));var v=h===c&&g===d,w=v?\"month picked\":\"month\";u.push(this.createItem({disabled:m,picked:v,highlighted:h===o&&y.getMonth()===l,index:g,text:n[g],view:m?\"month disabled\":w}))}this.$yearPrev.toggleClass(s,p),this.$yearNext.toggleClass(s,f),this.$yearCurrent.toggleClass(s,p&&f).html(h+t.yearSuffix||\"\"),this.$months.html(u.join(\"\"))},renderDays:function(){var t,e=this.$element,i=this.options,a=this.startDate,s=this.endDate,n=this.viewDate,r=this.date,h=i.disabledClass,o=i.filter,l=i.months,c=i.weekStart,d=i.yearSuffix,u=n.getFullYear(),p=n.getMonth(),n=new Date,f=n.getFullYear(),g=n.getMonth(),y=n.getDate(),m=r.getFullYear(),v=r.getMonth(),w=r.getDate(),k=[],D=u,b=p,n=!1;0===p?(--D,b=11):--b,t=O(D,b);var C,r=new Date(u,p,1);for((C=r.getDay()-parseInt(c,10)%7)<=0&&(C+=7),a&&(n=r.getTime()<=a.getTime()),P=t-(C-1);P<=t;P+=1){var $=new Date(D,b,P),x=!1;a&&(x=$.getTime()<a.getTime()),!x&&o&&(x=!1===o.call(e,$,\"day\")),k.push(this.createItem({disabled:x,highlighted:D===f&&b===g&&$.getDate()===y,muted:!0,picked:D===m&&b===v&&P===w,text:P,view:\"day prev\"}))}var F=[],M=u,Y=p,c=!1;11===p?(M+=1,Y=0):Y+=1,t=O(u,p),C=42-(k.length+t);r=new Date(u,p,t);for(s&&(c=r.getTime()>=s.getTime()),P=1;P<=C;P+=1){var V=new Date(M,Y,P),T=M===m&&Y===v&&P===w,I=!1;s&&(I=V.getTime()>s.getTime()),!I&&o&&(I=!1===o.call(e,V,\"day\")),F.push(this.createItem({disabled:I,picked:T,highlighted:M===f&&Y===g&&V.getDate()===y,muted:!0,text:P,view:\"day next\"}))}for(var S=[],P=1;P<=t;P+=1){var N=new Date(u,p,P),j=!1;a&&(j=N.getTime()<a.getTime()),!j&&s&&(j=N.getTime()>s.getTime()),!j&&o&&(j=!1===o.call(e,N,\"day\"));var q=u===m&&p===v&&P===w,A=q?\"day picked\":\"day\";S.push(this.createItem({disabled:j,picked:q,highlighted:u===f&&p===g&&N.getDate()===y,text:P,view:j?\"day disabled\":A}))}this.$monthPrev.toggleClass(h,n),this.$monthNext.toggleClass(h,c),this.$monthCurrent.toggleClass(h,n&&c).html(i.yearFirst?\"\".concat(u+d,\" \").concat(l[p]):\"\".concat(l[p],\" \").concat(u).concat(d)),this.$days.html(k.join(\"\")+S.join(\"\")+F.join(\"\"))}},A=\"\".concat(l,\"-top-left\"),t=\"\".concat(l,\"-top-right\"),W=\"\".concat(l,\"-bottom-left\"),e=\"\".concat(l,\"-bottom-right\"),z=[A,t,W,e].join(\" \"),J=function(){function i(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};!function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,i),this.$element=k(t),this.element=t,this.options=k.extend({},n,y[e.language],k.isPlainObject(e)&&e),this.$scrollParent=function(t,e){var i=1<arguments.length&&void 0!==e&&e,a=k(t),s=\"absolute\"===(e=a.css(\"position\")),n=i?/auto|scroll|hidden/:/auto|scroll/,a=a.parents().filter(function(t,e){e=k(e);return(!s||\"static\"!==e.css(\"position\"))&&n.test(e.css(\"overflow\")+e.css(\"overflow-y\")+e.css(\"overflow-x\"))}).eq(0);return\"fixed\"!==e&&a.length?a:k(t.ownerDocument||document)}(t,!0),this.built=!1,this.shown=!1,this.isInput=!1,this.inline=!1,this.initialValue=\"\",this.initialDate=null,this.startDate=null,this.endDate=null,this.init()}var t,e,a;return t=i,a=[{key:\"setDefaults\",value:function(t){t=0<arguments.length&&void 0!==t?t:{};k.extend(n,y[t.language],k.isPlainObject(t)&&t)}}],(e=[{key:\"init\",value:function(){var t=this.$element,e=this.options,i=e.startDate,a=e.endDate,s=e.date;this.$trigger=k(e.trigger),this.isInput=t.is(\"input\")||t.is(\"textarea\"),this.inline=e.inline&&(e.container||!this.isInput),this.format=function(i){var t=String(i).toLowerCase(),e=t.match(T);if(!e||0===e.length)throw new Error(\"Invalid date format.\");return i={source:t,parts:e},k.each(e,function(t,e){switch(e){case\"dd\":case\"d\":i.hasDay=!0;break;case\"mm\":case\"m\":i.hasMonth=!0;break;case\"yyyy\":case\"yy\":i.hasYear=!0}}),i}(e.format);t=this.getValue();this.initialValue=t,this.oldValue=t,s=this.parseDate(s||t),i&&(i=this.parseDate(i),s.getTime()<i.getTime()&&(s=new Date(i)),this.startDate=i),a&&(a=this.parseDate(a),i&&a.getTime()<i.getTime()&&(a=new Date(i)),s.getTime()>a.getTime()&&(s=new Date(a)),this.endDate=a),this.date=s,this.viewDate=new Date(s),this.initialDate=new Date(this.date),this.bind(),(e.autoShow||this.inline)&&this.show(),e.autoPick&&this.pick()}},{key:\"build\",value:function(){var t,e,i;this.built||(this.built=!0,t=this.$element,e=this.options,i=k(e.template),this.$picker=i,this.$week=i.find(Y(\"week\")),this.$yearsPicker=i.find(Y(\"years picker\")),this.$yearsPrev=i.find(Y(\"years prev\")),this.$yearsNext=i.find(Y(\"years next\")),this.$yearsCurrent=i.find(Y(\"years current\")),this.$years=i.find(Y(\"years\")),this.$monthsPicker=i.find(Y(\"months picker\")),this.$yearPrev=i.find(Y(\"year prev\")),this.$yearNext=i.find(Y(\"year next\")),this.$yearCurrent=i.find(Y(\"year current\")),this.$months=i.find(Y(\"months\")),this.$daysPicker=i.find(Y(\"days picker\")),this.$monthPrev=i.find(Y(\"month prev\")),this.$monthNext=i.find(Y(\"month next\")),this.$monthCurrent=i.find(Y(\"month current\")),this.$days=i.find(Y(\"days\")),this.inline?k(e.container||t).append(i.addClass(\"\".concat(l,\"-inline\"))):(k(document.body).append(i.addClass(\"\".concat(l,\"-dropdown\"))),i.addClass(g).css({zIndex:parseInt(e.zIndex,10)})),this.renderWeek())}},{key:\"unbuild\",value:function(){this.built&&(this.built=!1,this.$picker.remove())}},{key:\"bind\",value:function(){var t=this.options,e=this.$element;k.isFunction(t.show)&&e.on(p,t.show),k.isFunction(t.hide)&&e.on(o,t.hide),k.isFunction(t.pick)&&e.on(d,t.pick),this.isInput&&e.on(c,k.proxy(this.keyup,this)),this.inline||(t.trigger?this.$trigger.on(r,k.proxy(this.toggle,this)):this.isInput?e.on(h,k.proxy(this.show,this)):e.on(r,k.proxy(this.show,this)))}},{key:\"unbind\",value:function(){var t=this.$element,e=this.options;k.isFunction(e.show)&&t.off(p,e.show),k.isFunction(e.hide)&&t.off(o,e.hide),k.isFunction(e.pick)&&t.off(d,e.pick),this.isInput&&t.off(c,this.keyup),this.inline||(e.trigger?this.$trigger.off(r,this.toggle):this.isInput?t.off(h,this.show):t.off(r,this.show))}},{key:\"showView\",value:function(t){var e=this.$yearsPicker,i=this.$monthsPicker,a=this.$daysPicker,s=this.format;if(s.hasYear||s.hasMonth||s.hasDay)switch(Number(t)){case w:i.addClass(g),a.addClass(g),s.hasYear?(this.renderYears(),e.removeClass(g),this.place()):this.showView(m);break;case v:e.addClass(g),a.addClass(g),s.hasMonth?(this.renderMonths(),i.removeClass(g),this.place()):this.showView(w);break;default:e.addClass(g),i.addClass(g),s.hasDay?(this.renderDays(),a.removeClass(g),this.place()):this.showView(v)}}},{key:\"hideView\",value:function(){!this.inline&&this.options.autoHide&&this.hide()}},{key:\"place\",value:function(){var t,e,i,a,s,n,r,h,o,l,c;this.inline||(o=this.$element,c=this.options,t=this.$picker,e=k(document).outerWidth(),i=k(document).outerHeight(),a=o.outerWidth(),s=o.outerHeight(),n=t.width(),r=t.height(),h=(l=o.offset()).left,o=l.top,l=parseFloat(c.offset),c=A,C(l)&&(l=10),r<o&&i<o+s+r?(o-=r+l,c=W):o+=s+l,e<h+n&&(h+=a-n,c=c.replace(\"left\",\"right\")),t.removeClass(z).addClass(c).css({top:o,left:h}))}},{key:\"trigger\",value:function(t,e){e=k.Event(t,e);return this.$element.trigger(e),e}},{key:\"createItem\",value:function(t){var e=this.options,i=e.itemTag,a={text:\"\",view:\"\",muted:!1,picked:!1,disabled:!1,highlighted:!1},s=[];return k.extend(a,t),a.muted&&s.push(e.mutedClass),a.highlighted&&s.push(e.highlightedClass),a.picked&&s.push(e.pickedClass),a.disabled&&s.push(e.disabledClass),\"<\".concat(i,' class=\"').concat(s.join(\" \"),'\" data-view=\"').concat(a.view,'\">').concat(a.text,\"</\").concat(i,\">\")}},{key:\"getValue\",value:function(){var t=this.$element;return this.isInput?t.val():t.text()}},{key:\"setValue\",value:function(t){var e=0<arguments.length&&void 0!==t?t:\"\",t=this.$element;this.isInput?t.val(e):this.inline&&!this.options.container||t.text(e)}}])&&s(t.prototype,e),a&&s(t,a),i}();k.extend&&k.extend(J.prototype,q,j,N),k.fn&&(S=k.fn.datepicker,k.fn.datepicker=function(r){for(var h,t=arguments.length,o=new Array(1<t?t-1:0),e=1;e<t;e++)o[e-1]=arguments[e];return this.each(function(t,e){var i=k(e),a=\"destroy\"===r;if(!(n=i.data(l))){if(a)return;var s=k.extend({},i.data(),k.isPlainObject(r)&&r),n=new J(e,s);i.data(l,n)}b(r)&&(s=n[r],k.isFunction(s)&&(h=s.apply(n,o),a&&i.removeData(l)))}),x(h)?this:h},k.fn.datepicker.Constructor=J,k.fn.datepicker.languages=y,k.fn.datepicker.setDefaults=J.setDefaults,k.fn.datepicker.noConflict=function(){return k.fn.datepicker=S,this})});","(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('jquery')) :\n  typeof define === 'function' && define.amd ? define(['jquery'], factory) :\n  (factory(global.jQuery));\n}(this, (function ($) {\n  'use strict';\n\n  $.fn.datepicker.languages['it-IT'] = {\n    format: 'dd/mm/yyyy',\n    days: ['Domenica','Lunedì','Martedì','Mercoledì','Giovedì','Venerdì','Sabato'],\n    daysShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'],\n    daysMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'],\n    weekStart: 1,\n    months: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno','Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'],\n    monthsShort: ['Gen','Feb','Mar','Apr','Mag','Giu','Lug','Ago','Set','Ott','Nov','Dic']\n  };\n})));\n","/*! jQuery Validation Plugin - v1.19.5 - 7/1/2022\n * https://jqueryvalidation.org/\n * Copyright (c) 2022 Jörn Zaefferer; Licensed MIT */\n!function(a){\"function\"==typeof define&&define.amd?define([\"jquery\"],a):\"object\"==typeof module&&module.exports?module.exports=a(require(\"jquery\")):a(jQuery)}(function(a){a.extend(a.fn,{validate:function(b){if(!this.length)return void(b&&b.debug&&window.console&&console.warn(\"Nothing selected, can't validate, returning nothing.\"));var c=a.data(this[0],\"validator\");return c?c:(this.attr(\"novalidate\",\"novalidate\"),c=new a.validator(b,this[0]),a.data(this[0],\"validator\",c),c.settings.onsubmit&&(this.on(\"click.validate\",\":submit\",function(b){c.submitButton=b.currentTarget,a(this).hasClass(\"cancel\")&&(c.cancelSubmit=!0),void 0!==a(this).attr(\"formnovalidate\")&&(c.cancelSubmit=!0)}),this.on(\"submit.validate\",function(b){function d(){var d,e;return c.submitButton&&(c.settings.submitHandler||c.formSubmitted)&&(d=a(\"<input type='hidden'/>\").attr(\"name\",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),!(c.settings.submitHandler&&!c.settings.debug)||(e=c.settings.submitHandler.call(c,c.currentForm,b),d&&d.remove(),void 0!==e&&e)}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c,d;return a(this[0]).is(\"form\")?b=this.validate().form():(d=[],b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b,b||(d=d.concat(c.errorList))}),c.errorList=d),b},rules:function(b,c){var d,e,f,g,h,i,j=this[0],k=\"undefined\"!=typeof this.attr(\"contenteditable\")&&\"false\"!==this.attr(\"contenteditable\");if(null!=j&&(!j.form&&k&&(j.form=this.closest(\"form\")[0],j.name=this.attr(\"name\")),null!=j.form)){if(b)switch(d=a.data(j.form,\"validator\").settings,e=d.rules,f=a.validator.staticRules(j),b){case\"add\":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case\"remove\":return c?(i={},a.each(c.split(/\\s/),function(a,b){i[b]=f[b],delete f[b]}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g)),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}});var b=function(a){return a.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\"\")};a.extend(a.expr.pseudos||a.expr[\":\"],{blank:function(c){return!b(\"\"+a(c).val())},filled:function(c){var d=a(c).val();return null!==d&&!!b(\"\"+d)},unchecked:function(b){return!a(b).prop(\"checked\")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:void 0===c?b:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp(\"\\\\{\"+a+\"\\\\}\",\"g\"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:\"error\",pendingClass:\"pending\",validClass:\"valid\",errorElement:\"label\",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:\":hidden\",ignoreTitle:!1,onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(b,c){var d=[16,17,18,20,35,36,37,38,39,40,45,144,225];9===c.which&&\"\"===this.elementValue(b)||a.inArray(c.keyCode,d)!==-1||(b.name in this.submitted||b.name in this.invalid)&&this.element(b)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){\"radio\"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){\"radio\"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:\"This field is required.\",remote:\"Please fix this field.\",email:\"Please enter a valid email address.\",url:\"Please enter a valid URL.\",date:\"Please enter a valid date.\",dateISO:\"Please enter a valid date (ISO).\",number:\"Please enter a valid number.\",digits:\"Please enter only digits.\",equalTo:\"Please enter the same value again.\",maxlength:a.validator.format(\"Please enter no more than {0} characters.\"),minlength:a.validator.format(\"Please enter at least {0} characters.\"),rangelength:a.validator.format(\"Please enter a value between {0} and {1} characters long.\"),range:a.validator.format(\"Please enter a value between {0} and {1}.\"),max:a.validator.format(\"Please enter a value less than or equal to {0}.\"),min:a.validator.format(\"Please enter a value greater than or equal to {0}.\"),step:a.validator.format(\"Please enter a multiple of {0}.\")},autoCreateRanges:!1,prototype:{init:function(){function b(b){var c=\"undefined\"!=typeof a(this).attr(\"contenteditable\")&&\"false\"!==a(this).attr(\"contenteditable\");if(!this.form&&c&&(this.form=a(this).closest(\"form\")[0],this.name=a(this).attr(\"name\")),d===this.form){var e=a.data(this.form,\"validator\"),f=\"on\"+b.type.replace(/^validate/,\"\"),g=e.settings;g[f]&&!a(this).is(g.ignore)&&g[f].call(e,this,b)}}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.currentForm,e=this.groups={};a.each(this.settings.groups,function(b,c){\"string\"==typeof c&&(c=c.split(/\\s/)),a.each(c,function(a,c){e[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)}),a(this.currentForm).on(\"focusin.validate focusout.validate keyup.validate\",\":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox'], [contenteditable], [type='button']\",b).on(\"click.validate\",\"select, option, [type='radio'], [type='checkbox']\",b),this.settings.invalidHandler&&a(this.currentForm).on(\"invalid-form.validate\",this.settings.invalidHandler)},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler(\"invalid-form\",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c,d,e=this.clean(b),f=this.validationTargetFor(e),g=this,h=!0;return void 0===f?delete this.invalid[e.name]:(this.prepareElement(f),this.currentElements=a(f),d=this.groups[f.name],d&&a.each(this.groups,function(a,b){b===d&&a!==f.name&&(e=g.validationTargetFor(g.clean(g.findByName(a))),e&&e.name in g.invalid&&(g.currentElements.push(e),h=g.check(e)&&h))}),c=this.check(f)!==!1,h=h&&c,c?this.invalid[f.name]=!1:this.invalid[f.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),a(b).attr(\"aria-invalid\",!c)),h},showErrors:function(b){if(b){var c=this;a.extend(this.errorMap,b),this.errorList=a.map(this.errorMap,function(a,b){return{message:a,element:c.findByName(b)[0]}}),this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.invalid={},this.submitted={},this.prepareForm(),this.hideErrors();var b=this.elements().removeData(\"previousValue\").removeAttr(\"aria-invalid\");this.resetElements(b)},resetElements:function(a){var b;if(this.settings.unhighlight)for(b=0;a[b];b++)this.settings.unhighlight.call(this,a[b],this.settings.errorClass,\"\"),this.findByName(a[b].name).removeClass(this.settings.validClass);else a.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)void 0!==a[b]&&null!==a[b]&&a[b]!==!1&&c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(\"\"),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(\":visible\").trigger(\"focus\").trigger(\"focusin\")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={};return a(this.currentForm).find(\"input, select, textarea, [contenteditable]\").not(\":submit, :reset, :image, :disabled\").not(this.settings.ignore).filter(function(){var d=this.name||a(this).attr(\"name\"),e=\"undefined\"!=typeof a(this).attr(\"contenteditable\")&&\"false\"!==a(this).attr(\"contenteditable\");return!d&&b.settings.debug&&window.console&&console.error(\"%o has no name assigned\",this),e&&(this.form=a(this).closest(\"form\")[0],this.name=d),this.form===b.currentForm&&(!(d in c||!b.objectLength(a(this).rules()))&&(c[d]=!0,!0))})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(\" \").join(\".\");return a(this.settings.errorElement+\".\"+b,this.errorContext)},resetInternals:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([])},reset:function(){this.resetInternals(),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d,e=a(b),f=b.type,g=\"undefined\"!=typeof e.attr(\"contenteditable\")&&\"false\"!==e.attr(\"contenteditable\");return\"radio\"===f||\"checkbox\"===f?this.findByName(b.name).filter(\":checked\").val():\"number\"===f&&\"undefined\"!=typeof b.validity?b.validity.badInput?\"NaN\":e.val():(c=g?e.text():e.val(),\"file\"===f?\"C:\\\\fakepath\\\\\"===c.substr(0,12)?c.substr(12):(d=c.lastIndexOf(\"/\"),d>=0?c.substr(d+1):(d=c.lastIndexOf(\"\\\\\"),d>=0?c.substr(d+1):c)):\"string\"==typeof c?c.replace(/\\r/g,\"\"):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f,g=a(b).rules(),h=a.map(g,function(a,b){return b}).length,i=!1,j=this.elementValue(b);\"function\"==typeof g.normalizer?f=g.normalizer:\"function\"==typeof this.settings.normalizer&&(f=this.settings.normalizer),f&&(j=f.call(b,j),delete g.normalizer);for(d in g){e={method:d,parameters:g[d]};try{if(c=a.validator.methods[d].call(this,j,b,e.parameters),\"dependency-mismatch\"===c&&1===h){i=!0;continue}if(i=!1,\"pending\"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(k){throw this.settings.debug&&window.console&&console.log(\"Exception occurred when checking element \"+b.id+\", check the '\"+e.method+\"' method.\",k),k instanceof TypeError&&(k.message+=\".  Exception occurred when checking element \"+b.id+\", check the '\"+e.method+\"' method.\"),k}}if(!i)return this.objectLength(g)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data(\"msg\"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data(\"msg\")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;a<arguments.length;a++)if(void 0!==arguments[a])return arguments[a]},defaultMessage:function(b,c){\"string\"==typeof c&&(c={method:c});var d=this.findDefined(this.customMessage(b.name,c.method),this.customDataMessage(b,c.method),!this.settings.ignoreTitle&&b.title||void 0,a.validator.messages[c.method],\"<strong>Warning: No message defined for \"+b.name+\"</strong>\"),e=/\\$?\\{(\\d+)\\}/g;return\"function\"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,\"{$1}\"),c.parameters)),d},formatAndAdd:function(a,b){var c=this.defaultMessage(a,b);this.errorList.push({message:c,element:a,method:b.method}),this.errorMap[a.name]=c,this.submitted[a.name]=c},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g,h=this.errorsFor(b),i=this.idOrName(b),j=a(b).attr(\"aria-describedby\");h.length?(h.removeClass(this.settings.validClass).addClass(this.settings.errorClass),h.html(c)):(h=a(\"<\"+this.settings.errorElement+\">\").attr(\"id\",i+\"-error\").addClass(this.settings.errorClass).html(c||\"\"),d=h,this.settings.wrapper&&(d=h.hide().show().wrap(\"<\"+this.settings.wrapper+\"/>\").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement.call(this,d,a(b)):d.insertAfter(b),h.is(\"label\")?h.attr(\"for\",i):0===h.parents(\"label[for='\"+this.escapeCssMeta(i)+\"']\").length&&(f=h.attr(\"id\"),j?j.match(new RegExp(\"\\\\b\"+this.escapeCssMeta(f)+\"\\\\b\"))||(j+=\" \"+f):j=f,a(b).attr(\"aria-describedby\",j),e=this.groups[b.name],e&&(g=this,a.each(g.groups,function(b,c){c===e&&a(\"[name='\"+g.escapeCssMeta(b)+\"']\",g.currentForm).attr(\"aria-describedby\",h.attr(\"id\"))})))),!c&&this.settings.success&&(h.text(\"\"),\"string\"==typeof this.settings.success?h.addClass(this.settings.success):this.settings.success(h,b)),this.toShow=this.toShow.add(h)},errorsFor:function(b){var c=this.escapeCssMeta(this.idOrName(b)),d=a(b).attr(\"aria-describedby\"),e=\"label[for='\"+c+\"'], label[for='\"+c+\"'] *\";return d&&(e=e+\", #\"+this.escapeCssMeta(d).replace(/\\s+/g,\", #\")),this.errors().filter(e)},escapeCssMeta:function(a){return void 0===a?\"\":a.replace(/([\\\\!\"#$%&'()*+,./:;<=>?@\\[\\]^`{|}~])/g,\"\\\\$1\")},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find(\"[name='\"+this.escapeCssMeta(b)+\"']\")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case\"select\":return a(\"option:selected\",c).length;case\"input\":if(this.checkable(c))return this.findByName(c.name).filter(\":checked\").length}return b.length},depend:function(a,b){return!this.dependTypes[typeof a]||this.dependTypes[typeof a](a,b)},dependTypes:{\"boolean\":function(a){return a},string:function(b,c){return!!a(b,c.form).length},\"function\":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&\"dependency-mismatch\"},startRequest:function(b){this.pending[b.name]||(this.pendingRequest++,a(b).addClass(this.settings.pendingClass),this.pending[b.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass),c&&0===this.pendingRequest&&this.formSubmitted&&this.form()&&0===this.pendingRequest?(a(this.currentForm).trigger(\"submit\"),this.submitButton&&a(\"input:hidden[name='\"+this.submitButton.name+\"']\",this.currentForm).remove(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler(\"invalid-form\",[this]),this.formSubmitted=!1)},previousValue:function(b,c){return c=\"string\"==typeof c&&c||\"remote\",a.data(b,\"previousValue\")||a.data(b,\"previousValue\",{old:null,valid:!0,message:this.defaultMessage(b,{method:c})})},destroy:function(){this.resetForm(),a(this.currentForm).off(\".validate\").removeData(\"validator\").find(\".validate-equalTo-blur\").off(\".validate-equalTo\").removeClass(\"validate-equalTo-blur\").find(\".validate-lessThan-blur\").off(\".validate-lessThan\").removeClass(\"validate-lessThan-blur\").find(\".validate-lessThanEqual-blur\").off(\".validate-lessThanEqual\").removeClass(\"validate-lessThanEqual-blur\").find(\".validate-greaterThanEqual-blur\").off(\".validate-greaterThanEqual\").removeClass(\"validate-greaterThanEqual-blur\").find(\".validate-greaterThan-blur\").off(\".validate-greaterThan\").removeClass(\"validate-greaterThan-blur\")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr(\"class\");return d&&a.each(d.split(\" \"),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},normalizeAttributeRule:function(a,b,c,d){/min|max|step/.test(c)&&(null===b||/number|range|text/.test(b))&&(d=Number(d),isNaN(d)&&(d=void 0)),d||0===d?a[c]=d:b===c&&\"range\"!==b&&(a[\"date\"===b?\"dateISO\":c]=!0)},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute(\"type\");for(c in a.validator.methods)\"required\"===c?(d=b.getAttribute(c),\"\"===d&&(d=!0),d=!!d):d=f.attr(c),this.normalizeAttributeRule(e,g,c,d);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute(\"type\");for(c in a.validator.methods)d=f.data(\"rule\"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),\"\"===d&&(d=!0),this.normalizeAttributeRule(e,g,c,d);return e},staticRules:function(b){var c={},d=a.data(b.form,\"validator\");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case\"string\":f=!!a(e.depends,c.form).length;break;case\"function\":f=e.depends.call(c,c)}f?b[d]=void 0===e.param||e.param:(a.data(c.form,\"validator\").resetElements(a(c)),delete b[d])}}),a.each(b,function(a,d){b[a]=\"function\"==typeof d&&\"normalizer\"!==a?d(c):d}),a.each([\"minlength\",\"maxlength\"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each([\"rangelength\",\"range\"],function(){var a;b[this]&&(Array.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:\"string\"==typeof b[this]&&(a=b[this].replace(/[\\[\\]]/g,\"\").split(/[\\s,]+/),b[this]=[Number(a[0]),Number(a[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if(\"string\"==typeof b){var c={};a.each(b.split(/\\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return\"dependency-mismatch\";if(\"select\"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:void 0!==b&&null!==b&&b.length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\\/\\/)(?:(?:[^\\]\\[?\\/<~#`!@$^&*()+=}|:\";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\\]\\[?\\/<~#`!@$^&*()+=}|:\";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[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]))|(?:(?:[a-z0-9\\u00a1-\\uffff][a-z0-9\\u00a1-\\uffff_-]{0,62})?[a-z0-9\\u00a1-\\uffff]\\.)+(?:[a-z\\u00a1-\\uffff]{2,}\\.?))(?::\\d{2,5})?(?:[/?#]\\S*)?$/i.test(a)},date:function(){var a=!1;return function(b,c){return a||(a=!0,this.settings.debug&&window.console&&console.warn(\"The `date` method is deprecated and will be removed in version '2.0.0'.\\nPlease don't use it, since it relies on the Date constructor, which\\nbehaves very differently across browsers and locales. Use `dateISO`\\ninstead or one of the locale specific methods in `localizations/`\\nand `additional-methods.js`.\")),this.optional(c)||!/Invalid|NaN/.test(new Date(b).toString())}}(),dateISO:function(a,b){return this.optional(b)||/^\\d{4}[\\/\\-](0?[1-9]|1[012])[\\/\\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^(?:-?\\d+|-?\\d{1,3}(?:,\\d{3})+)?(?:\\.\\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\\d+$/.test(a)},minlength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d>=c},maxlength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d<=c},rangelength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d>=c[0]&&d<=c[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||a<=c},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},step:function(b,c,d){var e,f=a(c).attr(\"type\"),g=\"Step attribute on input type \"+f+\" is not supported.\",h=[\"text\",\"number\",\"range\"],i=new RegExp(\"\\\\b\"+f+\"\\\\b\"),j=f&&!i.test(h.join()),k=function(a){var b=(\"\"+a).match(/(?:\\.(\\d+))?$/);return b&&b[1]?b[1].length:0},l=function(a){return Math.round(a*Math.pow(10,e))},m=!0;if(j)throw new Error(g);return e=k(d),(k(b)>e||l(b)%l(d)!==0)&&(m=!1),this.optional(c)||m},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(\".validate-equalTo-blur\").length&&e.addClass(\"validate-equalTo-blur\").on(\"blur.validate-equalTo\",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d,e){if(this.optional(c))return\"dependency-mismatch\";e=\"string\"==typeof e&&e||\"remote\";var f,g,h,i=this.previousValue(c,e);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),i.originalMessage=i.originalMessage||this.settings.messages[c.name][e],this.settings.messages[c.name][e]=i.message,d=\"string\"==typeof d&&{url:d}||d,h=a.param(a.extend({data:b},d.data)),i.old===h?i.valid:(i.old=h,f=this,this.startRequest(c),g={},g[c.name]=b,a.ajax(a.extend(!0,{mode:\"abort\",port:\"validate\"+c.name,dataType:\"json\",data:g,context:f.currentForm,success:function(a){var d,g,h,j=a===!0||\"true\"===a;f.settings.messages[c.name][e]=i.originalMessage,j?(h=f.formSubmitted,f.resetInternals(),f.toHide=f.errorsFor(c),f.formSubmitted=h,f.successList.push(c),f.invalid[c.name]=!1,f.showErrors()):(d={},g=a||f.defaultMessage(c,{method:e,parameters:b}),d[c.name]=i.message=g,f.invalid[c.name]=!0,f.showErrors(d)),i.valid=j,f.stopRequest(c,j)}},d)),\"pending\")}}});var c,d={};return a.ajaxPrefilter?a.ajaxPrefilter(function(a,b,c){var e=a.port;\"abort\"===a.mode&&(d[e]&&d[e].abort(),d[e]=c)}):(c=a.ajax,a.ajax=function(b){var e=(\"mode\"in b?b:a.ajaxSettings).mode,f=(\"port\"in b?b:a.ajaxSettings).port;return\"abort\"===e?(d[f]&&d[f].abort(),d[f]=c.apply(this,arguments),d[f]):c.apply(this,arguments)}),a});","\"use strict\";function _classCallCheck(t,s){if(!(t instanceof s))throw new TypeError(\"Cannot call a class as a function\")}function _defineProperties(t,s){for(var e=0;e<s.length;e++){var n=s[e];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}function _createClass(t,s,e){return s&&_defineProperties(t.prototype,s),e&&_defineProperties(t,e),Object.defineProperty(t,\"prototype\",{writable:!1}),t}function _typeof(t){return(_typeof=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t})(t)}\n/*!\n* jQuery SmartWizard v6.0.6\n* The awesome step wizard plugin for jQuery\n* http://www.techlaboratory.net/jquery-smartwizard\n*\n* Created by Dipu Raj (http://dipu.me)\n*\n* Licensed under the terms of the MIT License\n* https://github.com/techlab/jquery-smartwizard/blob/master/LICENSE\n*/\n!function(e){\"function\"==typeof define&&define.amd?define([\"jquery\"],e):\"object\"===(\"undefined\"==typeof module?\"undefined\":_typeof(module))&&module.exports?module.exports=function(t,s){return void 0===s&&(s=\"undefined\"!=typeof window?require(\"jquery\"):require(\"jquery\")(t)),e(s),s}:e(jQuery)}(function(l){var i={selected:0,theme:\"basic\",justified:!0,autoAdjustHeight:!0,backButtonSupport:!0,enableUrlHash:!0,transition:{animation:\"none\",speed:\"400\",easing:\"\",prefixCss:\"\",fwdShowCss:\"\",fwdHideCss:\"\",bckShowCss:\"\",bckHideCss:\"\"},toolbar:{position:\"bottom\",showNextButton:!0,showPreviousButton:!0,extraHtml:\"\"},anchor:{enableNavigation:!0,enableNavigationAlways:!1,enableDoneState:!0,markPreviousStepsAsDone:!0,unDoneOnBackNavigation:!1,enableDoneStateNavigation:!0},keyboard:{keyNavigation:!0,keyLeft:[37],keyRight:[39]},lang:{next:\"Next\",previous:\"Previous\"},style:{mainCss:\"sw\",navCss:\"nav\",navLinkCss:\"nav-link\",contentCss:\"tab-content\",contentPanelCss:\"tab-pane\",themePrefixCss:\"sw-theme-\",anchorDefaultCss:\"default\",anchorDoneCss:\"done\",anchorActiveCss:\"active\",anchorDisabledCss:\"disabled\",anchorHiddenCss:\"hidden\",anchorErrorCss:\"error\",anchorWarningCss:\"warning\",justifiedCss:\"sw-justified\",btnCss:\"sw-btn\",btnNextCss:\"sw-btn-next\",btnPrevCss:\"sw-btn-prev\",loaderCss:\"sw-loading\",progressCss:\"progress\",progressBarCss:\"progress-bar\",toolbarCss:\"toolbar\",toolbarPrefixCss:\"toolbar-\"},disabledSteps:[],errorSteps:[],warningSteps:[],hiddenSteps:[],getContent:null},e=function(){function n(t,s){var e=this;_classCallCheck(this,n),this.options=l.extend(!0,{},i,s),this.main=l(t),this.nav=this._getFirstDescendant(\".\"+this.options.style.navCss),this.container=this._getFirstDescendant(\".\"+this.options.style.contentCss),this.steps=this.nav.find(\".\"+this.options.style.navLinkCss),this.pages=this.container.children(\".\"+this.options.style.contentPanelCss),this.progressbar=this.main.find(\".\"+this.options.style.progressCss),this.dir=this._getDir(),this.current_index=-1,this.is_init=!1,this._init(),setTimeout(function(){e._load()},0)}return _createClass(n,[{key:\"_init\",value:function(){if(this._setElements(),this._setToolbar(),!0===this.is_init)return!0;this._setEvents(),this.is_init=!0,this._triggerEvent(\"initialized\")}},{key:\"_load\",value:function(){this.pages.hide(),this.steps.removeClass([this.options.style.anchorDoneCss,this.options.style.anchorActiveCss]);var t=!(this.current_index=-1)!==(t=this._getURLHashIndex())?t:this.options.selected,s=this._getShowable(t-1,\"forward\");0<(t=null===s&&0<t?this._getShowable(-1,\"forward\"):s)&&this.options.anchor.enableDoneState&&this.options.anchor.markPreviousStepsAsDone&&this.steps.slice(0,t).addClass(this.options.style.anchorDoneCss),this._showStep(t),this._triggerEvent(\"loaded\")}},{key:\"_getFirstDescendant\",value:function(n){var i=this.main.children(n);return 0<i.length?i:(this.main.children().each(function(t,s){var e=l(s).children(n);if(0<e.length)return i=e,!1}),0<i.length?i:(this._showError(\"Element not found \"+n),!1))}},{key:\"_getDir\",value:function(){var t=this.main.prop(\"dir\");return 0===t.length&&(t=document.documentElement.dir,this.main.prop(\"dir\",t)),t}},{key:\"_setElements\",value:function(){var e=this;this.main.removeClass(function(t,s){return(s.match(new RegExp(\"(^|\\\\s)\"+e.options.style.themePrefixCss+\"\\\\S+\",\"g\"))||[]).join(\" \")}).addClass(this.options.style.mainCss+\" \"+this.options.style.themePrefixCss+this.options.theme),this.main.toggleClass(this.options.style.justifiedCss,this.options.justified),!0===this.options.anchor.enableNavigationAlways&&!0===this.options.anchor.enableNavigation||this.steps.addClass(this.options.style.anchorDefaultCss),l.each(this.options.disabledSteps,function(t,s){e.steps.eq(s).addClass(e.options.style.anchorDisabledCss)}),l.each(this.options.errorSteps,function(t,s){e.steps.eq(s).addClass(e.options.style.anchorErrorCss)}),l.each(this.options.warningSteps,function(t,s){e.steps.eq(s).addClass(e.options.style.anchorWarningCss)}),l.each(this.options.hiddenSteps,function(t,s){e.steps.eq(s).addClass(e.options.style.anchorHiddenCss)})}},{key:\"_setEvents\",value:function(){var e=this;this.steps.on(\"click\",function(t){var s;t.preventDefault(),!0===e.options.anchor.enableNavigation&&(s=l(t.currentTarget),e._isShowable(s)&&e._showStep(e.steps.index(s)))}),this.main.on(\"click\",function(t){l(t.target).hasClass(e.options.style.btnNextCss)?(t.preventDefault(),e._navigate(\"next\")):l(t.target).hasClass(e.options.style.btnPrevCss)&&(t.preventDefault(),e._navigate(\"prev\"))}),l(document).keyup(function(t){e._keyNav(t)}),l(window).on(\"hashchange\",function(t){var s;!0!==e.options.backButtonSupport||!1!==(s=e._getURLHashIndex())&&e._isShowable(e.steps.eq(s))&&(t.preventDefault(),e._showStep(s))}),l(window).on(\"resize\",function(t){e._fixHeight(e.current_index)})}},{key:\"_setToolbar\",value:function(){this.main.find(\".sw-toolbar-elm\").remove();var t=this.options.toolbar.position;\"none\"!==t&&(\"both\"==t?(this.container.before(this._createToolbar(\"top\")),this.container.after(this._createToolbar(\"bottom\"))):\"top\"==t?this.container.before(this._createToolbar(\"top\")):this.container.after(this._createToolbar(\"bottom\")))}},{key:\"_createToolbar\",value:function(t){var s=l(\"<div></div>\").addClass(\"sw-toolbar-elm \"+this.options.style.toolbarCss+\" \"+this.options.style.toolbarPrefixCss+t).attr(\"role\",\"toolbar\"),e=!1!==this.options.toolbar.showNextButton?l(\"<button></button>\").text(this.options.lang.next).addClass(\"btn \"+this.options.style.btnNextCss+\" \"+this.options.style.btnCss).attr(\"type\",\"button\"):null,n=!1!==this.options.toolbar.showPreviousButton?l(\"<button></button>\").text(this.options.lang.previous).addClass(\"btn \"+this.options.style.btnPrevCss+\" \"+this.options.style.btnCss).attr(\"type\",\"button\"):null;return s.append(n,e,this.options.toolbar.extraHtml)}},{key:\"_navigate\",value:function(t){this._showStep(this._getShowable(this.current_index,t))}},{key:\"_showStep\",value:function(n){var i=this;if(-1===n||null===n)return!1;if(n==this.current_index)return!1;if(!this.steps.eq(n))return!1;if(!this._isEnabled(this.steps.eq(n)))return!1;var o=this._getStepDirection(n);if(-1!==this.current_index&&!1===this._triggerEvent(\"leaveStep\",[this._getStepAnchor(this.current_index),this.current_index,n,o]))return!1;this._loadContent(n,function(){var t=i._getStepAnchor(n);i._setURLHash(t.attr(\"href\")),i._setAnchor(n);var s=i._getStepPage(i.current_index),e=i._getStepPage(n);i._transit(e,s,o,function(){i._fixHeight(n),i._triggerEvent(\"showStep\",[t,n,o,i._getStepPosition(n)])}),i.current_index=n,i._setButtons(n),i._setProgressbar(n)})}},{key:\"_getShowable\",value:function(e,n){var i=this,o=null;return(\"prev\"==n?l(this.steps.slice(0,e).get().reverse()):this.steps.slice(e+1)).each(function(t,s){if(i._isEnabled(l(s)))return o=\"prev\"==n?e-(t+1):t+e+1,!1}),o}},{key:\"_isShowable\",value:function(t){if(!this._isEnabled(t))return!1;var s=t.hasClass(this.options.style.anchorDoneCss);return(!1!==this.options.anchor.enableDoneStateNavigation||!s)&&!(!1===this.options.anchor.enableNavigationAlways&&!s)}},{key:\"_isEnabled\",value:function(t){return!t.hasClass(this.options.style.anchorDisabledCss)&&!t.hasClass(this.options.style.anchorHiddenCss)}},{key:\"_getStepDirection\",value:function(t){return this.current_index<t?\"forward\":\"backward\"}},{key:\"_getStepPosition\",value:function(t){return 0===t?\"first\":t===this.steps.length-1?\"last\":\"middle\"}},{key:\"_getStepAnchor\",value:function(t){return null==t||-1==t?null:this.steps.eq(t)}},{key:\"_getStepPage\",value:function(t){return null==t||-1==t?null:this.pages.eq(t)}},{key:\"_loadContent\",value:function(t,s){var e,n,i,o;l.isFunction(this.options.getContent)&&(e=this._getStepPage(t))?(n=this._getStepDirection(t),i=this._getStepPosition(t),o=this._getStepAnchor(t),this.options.getContent(t,n,i,o,function(t){t&&e.html(t),s()})):s()}},{key:\"_transit\",value:function(s,e,t,n){var i=l.fn.smartWizard.transitions[this.options.transition.animation];this._stopAnimations(),l.isFunction(i)?i(s,e,t,this,function(t){!1===t&&(null!==e&&e.hide(),s.show()),n()}):(null!==e&&e.hide(),s.show(),n())}},{key:\"_stopAnimations\",value:function(){l.isFunction(this.container.finish)&&(this.pages.finish(),this.container.finish())}},{key:\"_fixHeight\",value:function(t){var s;!1!==this.options.autoAdjustHeight&&(s=this._getStepPage(t).outerHeight(),l.isFunction(this.container.finish)&&l.isFunction(this.container.animate)&&0<s?this.container.finish().animate({height:s},this.options.transition.speed):this.container.css({height:0<s?s:\"auto\"}))}},{key:\"_setAnchor\",value:function(t){var s,e;null!==this.current_index&&0<=this.current_index&&(s=this.options.style.anchorActiveCss,e=\"\",!1!==this.options.anchor.enableDoneState&&(e+=this.options.style.anchorDoneCss,!1!==this.options.anchor.unDoneOnBackNavigation&&\"backward\"===this._getStepDirection(t)&&(s+=\" \"+this.options.style.anchorDoneCss)),this.steps.eq(this.current_index).addClass(e).removeClass(s)),this.steps.eq(t).removeClass(this.options.style.anchorDoneCss).addClass(this.options.style.anchorActiveCss)}},{key:\"_setButtons\",value:function(t){this.main.find(\".\"+this.options.style.btnNextCss+\", .\"+this.options.style.btnPrevCss).removeClass(this.options.style.anchorDisabledCss);var s,e=this._getStepPosition(t);\"first\"===e||\"last\"===e?(s=\"first\"===e?\".\"+this.options.style.btnPrevCss:\".\"+this.options.style.btnNextCss,this.main.find(s).addClass(this.options.style.anchorDisabledCss)):(null===this._getShowable(t,\"next\")&&this.main.find(\".\"+this.options.style.btnNextCss).addClass(this.options.style.anchorDisabledCss),null===this._getShowable(t,\"prev\")&&this.main.find(\".\"+this.options.style.btnPrevCss).addClass(this.options.style.anchorDisabledCss))}},{key:\"_setProgressbar\",value:function(t){var s=this.nav.width(),e=s/this.steps.length*(t+1)/s*100;document.documentElement.style.setProperty(\"--sw-progress-width\",e+\"%\"),0<this.progressbar.length&&this.progressbar.find(\".\"+this.options.style.progressBarCss).css(\"width\",e+\"%\")}},{key:\"_keyNav\",value:function(t){if(this.options.keyboard.keyNavigation)if(-1<l.inArray(t.which,this.options.keyboard.keyLeft))this._navigate(\"prev\"),t.preventDefault();else{if(!(-1<l.inArray(t.which,this.options.keyboard.keyRight)))return;this._navigate(\"next\"),t.preventDefault()}}},{key:\"_triggerEvent\",value:function(t,s){var e=l.Event(t);return this.main.trigger(e,s),!e.isDefaultPrevented()&&e.result}},{key:\"_setURLHash\",value:function(t){this.options.enableUrlHash&&window.location.hash!==t&&history.pushState(null,null,t)}},{key:\"_getURLHashIndex\",value:function(){if(this.options.enableUrlHash){var t=window.location.hash;if(0<t.length){var s=this.nav.find(\"a[href*='\"+t+\"']\");if(0<s.length)return this.steps.index(s)}}return!1}},{key:\"_showError\",value:function(t){console.error(t)}},{key:\"_changeState\",value:function(t,s,e){var n=this;e=!1!==e;var i=\"\";\"default\"==s?i=this.options.style.anchorDefaultCss:\"active\"==s?i=this.options.style.anchorActiveCss:\"done\"==s?i=this.options.style.anchorDoneCss:\"disable\"==s?i=this.options.style.anchorDisabledCss:\"hidden\"==s?i=this.options.style.anchorHiddenCss:\"error\"==s?i=this.options.style.anchorErrorCss:\"warning\"==s&&(i=this.options.style.anchorWarningCss),l.each(t,function(t,s){n.steps.eq(s).toggleClass(i,e)})}},{key:\"goToStep\",value:function(t,s){!0!=(s=!1!==s)&&!this._isShowable(this.steps.eq(t))||(!0===s&&0<t&&this.options.anchor.enableDoneState&&this.options.anchor.markPreviousStepsAsDone&&this.steps.slice(0,t).addClass(this.options.style.anchorDoneCss),this._showStep(t))}},{key:\"next\",value:function(){this._navigate(\"next\")}},{key:\"prev\",value:function(){this._navigate(\"prev\")}},{key:\"reset\",value:function(){this.steps.removeClass([this.options.style.anchorDoneCss,this.options.style.anchorActiveCss,this.options.style.anchorErrorCss,this.options.style.anchorWarningCss]),this._setURLHash(\"#\"),this._init(),this._load()}},{key:\"setState\",value:function(t,s){this._changeState(t,s,!0)}},{key:\"unsetState\",value:function(t,s){this._changeState(t,s,!1)}},{key:\"setOptions\",value:function(t){this.options=l.extend(!0,{},this.options,t),this._init()}},{key:\"getOptions\",value:function(){return this.options}},{key:\"getStepInfo\",value:function(){return{currentStep:this.current_index?this.current_index:0,totalSteps:this.steps?this.steps.length:0}}},{key:\"loader\",value:function(t){this.main.toggleClass(this.options.style.loaderCss,\"show\"===t)}},{key:\"fixHeight\",value:function(){this._fixHeight(this.current_index)}}]),n}();l.fn.smartWizard=function(t){if(void 0===t||\"object\"===_typeof(t))return this.each(function(){l.data(this,\"smartWizard\")||l.data(this,\"smartWizard\",new e(this,t))});if(\"string\"==typeof t&&\"_\"!==t[0]&&\"init\"!==t){var s=l.data(this[0],\"smartWizard\");return\"destroy\"===t&&l.data(this,\"smartWizard\",null),s instanceof e&&\"function\"==typeof s[t]?s[t].apply(s,Array.prototype.slice.call(arguments,1)):this}},l.fn.smartWizard.transitions={fade:function(t,s,e,n,i){l.isFunction(t.fadeOut)?s?s.fadeOut(n.options.transition.speed,n.options.transition.easing,function(){t.fadeIn(n.options.transition.speed,n.options.transition.easing,function(){i()})}):t.fadeIn(n.options.transition.speed,n.options.transition.easing,function(){i()}):i(!1)},slideSwing:function(t,s,e,n,i){l.isFunction(t.slideDown)?s?s.slideUp(n.options.transition.speed,n.options.transition.easing,function(){t.slideDown(n.options.transition.speed,n.options.transition.easing,function(){i()})}):t.slideDown(n.options.transition.speed,n.options.transition.easing,function(){i()}):i(!1)},slideHorizontal:function(t,s,e,i,n){var o,a,r,h;l.isFunction(t.animate)?(o=function(t,s,e,n){t.css({position:\"absolute\",left:s}).show().animate({left:e},i.options.transition.speed,i.options.transition.easing,n)},-1==i.current_index&&i.container.height(t.outerHeight()),a=i.container.width(),s&&(r=s.css([\"position\",\"left\"]),o(s,0,a*(\"backward\"==e?1:-1),function(){s.hide().css(r)})),h=t.css([\"position\"]),o(t,a*(\"backward\"==e?-2:1),0,function(){t.css(h),n()})):n(!1)},slideVertical:function(t,s,e,i,n){var o,a,r,h;l.isFunction(t.animate)?(o=function(t,s,e,n){t.css({position:\"absolute\",top:s}).show().animate({top:e},i.options.transition.speed,i.options.transition.easing,n)},-1==i.current_index&&i.container.height(t.outerHeight()),a=i.container.height(),s&&(r=s.css([\"position\",\"top\"]),o(s,0,a*(\"backward\"==e?-1:1),function(){s.hide().css(r)})),h=t.css([\"position\"]),o(t,a*(\"backward\"==e?1:-2),0,function(){t.css(h),n()})):n(!1)},css:function(t,s,e,n,i){var o,a,r;0!=n.options.transition.fwdHideCss.length&&0!=n.options.transition.bckHideCss.length?(o=function(t,s,e){s&&0!=s.length||e(),t.addClass(s).one(\"animationend\",function(t){l(t.currentTarget).removeClass(s),e()}),t.addClass(s).one(\"animationcancel\",function(t){l(t.currentTarget).removeClass(s),e(\"cancel\")})},a=n.options.transition.prefixCss+\" \"+(\"backward\"==e?n.options.transition.bckShowCss:n.options.transition.fwdShowCss),s?(r=n.options.transition.prefixCss+\" \"+(\"backward\"==e?n.options.transition.bckHideCss:n.options.transition.fwdHideCss),o(s,r,function(){s.hide(),o(t,a,function(){i()}),t.show()})):(o(t,a,function(){i()}),t.show())):i(!1)}}});","/**\r\n * Bootstrap Multiselect (http://davidstutz.de/bootstrap-multiselect/)\r\n *\r\n * Apache License, Version 2.0:\r\n * Copyright (c) 2012 - 2021 David Stutz\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\r\n * use this file except in compliance with the License. You may obtain a\r\n * copy of the License at http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\r\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\r\n * License for the specific language governing permissions and limitations\r\n * under the License.\r\n *\r\n * BSD 3-Clause License:\r\n * Copyright (c) 2012 - 2021 David Stutz\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *    - Redistributions of source code must retain the above copyright notice,\r\n *      this list of conditions and the following disclaimer.\r\n *    - Redistributions in binary form must reproduce the above copyright notice,\r\n *      this list of conditions and the following disclaimer in the documentation\r\n *      and/or other materials provided with the distribution.\r\n *    - Neither the name of David Stutz nor the names of its contributors may be\r\n *      used to endorse or promote products derived from this software without\r\n *      specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\r\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\r\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\r\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\r\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\r\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\r\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n(function (root, factory) {\r\n    // check to see if 'knockout' AMD module is specified if using requirejs\r\n    if (typeof define === 'function' && define.amd &&\r\n        typeof require === 'function' && typeof require.specified === 'function' && require.specified('knockout')) {\r\n\r\n        // AMD. Register as an anonymous module.\r\n        define(['jquery', 'knockout'], factory);\r\n    } else {\r\n        // Browser globals\r\n        factory(root.jQuery, root.ko);\r\n    }\r\n})(this, function ($, ko) {\r\n    \"use strict\";// jshint ;_;\r\n\r\n    if (typeof ko !== 'undefined' && ko.bindingHandlers && !ko.bindingHandlers.multiselect) {\r\n        ko.bindingHandlers.multiselect = {\r\n            after: ['options', 'value', 'selectedOptions', 'enable', 'disable'],\r\n\r\n            init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {\r\n                var $element = $(element);\r\n                var config = ko.toJS(valueAccessor());\r\n\r\n                $element.multiselect(config);\r\n\r\n                if (allBindings.has('options')) {\r\n                    var options = allBindings.get('options');\r\n                    if (ko.isObservable(options)) {\r\n                        ko.computed({\r\n                            read: function () {\r\n                                options();\r\n                                setTimeout(function () {\r\n                                    var ms = $element.data('multiselect');\r\n                                    if (ms)\r\n                                        ms.updateOriginalOptions();//Not sure how beneficial this is.\r\n                                    $element.multiselect('rebuild');\r\n                                }, 1);\r\n                            },\r\n                            disposeWhenNodeIsRemoved: element\r\n                        });\r\n                    }\r\n                }\r\n\r\n                //value and selectedOptions are two-way, so these will be triggered even by our own actions.\r\n                //It needs some way to tell if they are triggered because of us or because of outside change.\r\n                //It doesn't loop but it's a waste of processing.\r\n                if (allBindings.has('value')) {\r\n                    var value = allBindings.get('value');\r\n                    if (ko.isObservable(value)) {\r\n                        ko.computed({\r\n                            read: function () {\r\n                                value();\r\n                                setTimeout(function () {\r\n                                    $element.multiselect('refresh');\r\n                                }, 1);\r\n                            },\r\n                            disposeWhenNodeIsRemoved: element\r\n                        }).extend({ rateLimit: 100, notifyWhenChangesStop: true });\r\n                    }\r\n                }\r\n\r\n                //Switched from arrayChange subscription to general subscription using 'refresh'.\r\n                //Not sure performance is any better using 'select' and 'deselect'.\r\n                if (allBindings.has('selectedOptions')) {\r\n                    var selectedOptions = allBindings.get('selectedOptions');\r\n                    if (ko.isObservable(selectedOptions)) {\r\n                        ko.computed({\r\n                            read: function () {\r\n                                selectedOptions();\r\n                                setTimeout(function () {\r\n                                    $element.multiselect('refresh');\r\n                                }, 1);\r\n                            },\r\n                            disposeWhenNodeIsRemoved: element\r\n                        }).extend({ rateLimit: 100, notifyWhenChangesStop: true });\r\n                    }\r\n                }\r\n\r\n                var setEnabled = function (enable) {\r\n                    setTimeout(function () {\r\n                        if (enable)\r\n                            $element.multiselect('enable');\r\n                        else\r\n                            $element.multiselect('disable');\r\n                    });\r\n                };\r\n\r\n                if (allBindings.has('enable')) {\r\n                    var enable = allBindings.get('enable');\r\n                    if (ko.isObservable(enable)) {\r\n                        ko.computed({\r\n                            read: function () {\r\n                                setEnabled(enable());\r\n                            },\r\n                            disposeWhenNodeIsRemoved: element\r\n                        }).extend({ rateLimit: 100, notifyWhenChangesStop: true });\r\n                    } else {\r\n                        setEnabled(enable);\r\n                    }\r\n                }\r\n\r\n                if (allBindings.has('disable')) {\r\n                    var disable = allBindings.get('disable');\r\n                    if (ko.isObservable(disable)) {\r\n                        ko.computed({\r\n                            read: function () {\r\n                                setEnabled(!disable());\r\n                            },\r\n                            disposeWhenNodeIsRemoved: element\r\n                        }).extend({ rateLimit: 100, notifyWhenChangesStop: true });\r\n                    } else {\r\n                        setEnabled(!disable);\r\n                    }\r\n                }\r\n\r\n                ko.utils.domNodeDisposal.addDisposeCallback(element, function () {\r\n                    $element.multiselect('destroy');\r\n                });\r\n            },\r\n\r\n            update: function (element, valueAccessor, allBindings, viewModel, bindingContext) {\r\n                var $element = $(element);\r\n                var config = ko.toJS(valueAccessor());\r\n\r\n                $element.multiselect('setOptions', config);\r\n                $element.multiselect('rebuild');\r\n            }\r\n        };\r\n    }\r\n\r\n    function forEach(array, callback) {\r\n        for (var index = 0; index < array.length; ++index) {\r\n            callback(array[index], index);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Constructor to create a new multiselect using the given select.\r\n     *\r\n     * @param {jQuery} select\r\n     * @param {Object} options\r\n     * @returns {Multiselect}\r\n     */\r\n    function Multiselect(select, options) {\r\n\r\n        this.$select = $(select);\r\n        this.options = this.mergeOptions($.extend({}, options, this.$select.data()));\r\n\r\n        // Placeholder via data attributes\r\n        if (this.$select.attr(\"data-placeholder\")) {\r\n            this.options.nonSelectedText = this.$select.data(\"placeholder\");\r\n        }\r\n\r\n        // Initialization.\r\n        // We have to clone to create a new reference.\r\n        this.originalOptions = this.$select.clone()[0].options;\r\n        this.query = '';\r\n        this.searchTimeout = null;\r\n        this.lastToggledInput = null;\r\n\r\n        this.options.multiple = this.$select.attr('multiple') === \"multiple\";\r\n        this.options.onChange = $.proxy(this.options.onChange, this);\r\n        this.options.onSelectAll = $.proxy(this.options.onSelectAll, this);\r\n        this.options.onDeselectAll = $.proxy(this.options.onDeselectAll, this);\r\n        this.options.onDropdownShow = $.proxy(this.options.onDropdownShow, this);\r\n        this.options.onDropdownHide = $.proxy(this.options.onDropdownHide, this);\r\n        this.options.onDropdownShown = $.proxy(this.options.onDropdownShown, this);\r\n        this.options.onDropdownHidden = $.proxy(this.options.onDropdownHidden, this);\r\n        this.options.onInitialized = $.proxy(this.options.onInitialized, this);\r\n        this.options.onFiltering = $.proxy(this.options.onFiltering, this);\r\n\r\n        // Build select all if enabled.\r\n        this.buildContainer();\r\n        this.buildButton();\r\n        this.buildDropdown();\r\n        this.buildReset();\r\n        this.buildSelectAll();\r\n        this.buildDropdownOptions();\r\n        this.buildFilter();\r\n\r\n        this.updateButtonText();\r\n        this.updateSelectAll(true);\r\n\r\n        if (this.options.enableClickableOptGroups && this.options.multiple) {\r\n            this.updateOptGroups();\r\n        }\r\n\r\n        this.options.wasDisabled = this.$select.prop('disabled');\r\n        if (this.options.disableIfEmpty && $('option', this.$select).length <= 0) {\r\n            this.disable();\r\n        }\r\n\r\n        this.$select.wrap('<span class=\"multiselect-native-select\" />').after(this.$container);\r\n\r\n        if (this.options.widthSynchronizationMode !== 'never') {\r\n            this.synchronizeButtonAndPopupWidth();\r\n        }\r\n\r\n        this.options.onInitialized(this.$select, this.$container);\r\n    }\r\n\r\n    Multiselect.prototype = {\r\n\r\n        defaults: {\r\n            /**\r\n             * Default text function will either print 'None selected' in case no\r\n             * option is selected or a list of the selected options up to a length\r\n             * of 3 selected options.\r\n             *\r\n             * @param {jQuery} options\r\n             * @param {jQuery} select\r\n             * @returns {String}\r\n             */\r\n            buttonText: function (selectedOptions, select) {\r\n                if (this.disabledText.length > 0 && select.prop('disabled')) {\r\n                    return this.disabledText;\r\n                }\r\n                else if (selectedOptions.length === 0) {\r\n                    return this.nonSelectedText;\r\n                }\r\n                else if (this.allSelectedText\r\n                    && selectedOptions.length === $('option', $(select)).length\r\n                    && $('option', $(select)).length !== 1\r\n                    && this.multiple) {\r\n\r\n                    if (this.selectAllNumber) {\r\n                        return this.allSelectedText + ' (' + selectedOptions.length + ')';\r\n                    }\r\n                    else {\r\n                        return this.allSelectedText;\r\n                    }\r\n                }\r\n                else if (this.numberDisplayed != 0 && selectedOptions.length > this.numberDisplayed) {\r\n                    return selectedOptions.length + ' ' + this.nSelectedText;\r\n                }\r\n                else {\r\n                    var selected = '';\r\n                    var delimiter = this.delimiterText;\r\n\r\n                    selectedOptions.each(function () {\r\n                        var label = ($(this).attr('label') !== undefined) ? $(this).attr('label') : $(this).text();\r\n                        selected += label + delimiter;\r\n                    });\r\n\r\n                    return selected.substr(0, selected.length - this.delimiterText.length);\r\n                }\r\n            },\r\n            /**\r\n             * Updates the title of the button similar to the buttonText function.\r\n             *\r\n             * @param {jQuery} options\r\n             * @param {jQuery} select\r\n             * @returns {@exp;selected@call;substr}\r\n             */\r\n            buttonTitle: function (options, select) {\r\n                if (options.length === 0) {\r\n                    return this.nonSelectedText;\r\n                }\r\n                else {\r\n                    var selected = '';\r\n                    var delimiter = this.delimiterText;\r\n\r\n                    options.each(function () {\r\n                        var label = ($(this).attr('label') !== undefined) ? $(this).attr('label') : $(this).text();\r\n                        selected += label + delimiter;\r\n                    });\r\n                    return selected.substr(0, selected.length - this.delimiterText.length);\r\n                }\r\n            },\r\n            checkboxName: function (option) {\r\n                return false; // no checkbox name\r\n            },\r\n            /**\r\n             * Create a label.\r\n             *\r\n             * @param {jQuery} element\r\n             * @returns {String}\r\n             */\r\n            optionLabel: function (element) {\r\n                return $(element).attr('label') || $(element).text();\r\n            },\r\n            /**\r\n             * Create a class.\r\n             *\r\n             * @param {jQuery} element\r\n             * @returns {String}\r\n             */\r\n            optionClass: function (element) {\r\n                return $(element).attr('class') || '';\r\n            },\r\n            /**\r\n             * Triggered on change of the multiselect.\r\n             *\r\n             * Not triggered when selecting/deselecting options manually.\r\n             *\r\n             * @param {jQuery} option\r\n             * @param {Boolean} checked\r\n             */\r\n            onChange: function (option, checked) {\r\n\r\n            },\r\n            /**\r\n             * Triggered when the dropdown is shown.\r\n             *\r\n             * @param {jQuery} event\r\n             */\r\n            onDropdownShow: function (event) {\r\n\r\n            },\r\n            /**\r\n             * Triggered when the dropdown is hidden.\r\n             *\r\n             * @param {jQuery} event\r\n             */\r\n            onDropdownHide: function (event) {\r\n\r\n            },\r\n            /**\r\n             * Triggered after the dropdown is shown.\r\n             *\r\n             * @param {jQuery} event\r\n             */\r\n            onDropdownShown: function (event) {\r\n\r\n            },\r\n            /**\r\n             * Triggered after the dropdown is hidden.\r\n             *\r\n             * @param {jQuery} event\r\n             */\r\n            onDropdownHidden: function (event) {\r\n\r\n            },\r\n            /**\r\n             * Triggered on select all.\r\n             */\r\n            onSelectAll: function () {\r\n\r\n            },\r\n            /**\r\n             * Triggered on deselect all.\r\n             */\r\n            onDeselectAll: function () {\r\n\r\n            },\r\n            /**\r\n             * Triggered after initializing.\r\n             *\r\n             * @param {jQuery} $select\r\n             * @param {jQuery} $container\r\n             */\r\n            onInitialized: function ($select, $container) {\r\n\r\n            },\r\n            /**\r\n             * Triggered on filtering.\r\n             *\r\n             * @param {jQuery} $filter\r\n             */\r\n            onFiltering: function ($filter) {\r\n\r\n            },\r\n            enableHTML: false,\r\n            buttonClass: 'custom-select',\r\n            inheritClass: false,\r\n            buttonWidth: 'auto',\r\n            buttonContainer: '<div class=\"btn-group\" />',\r\n            dropRight: false,\r\n            dropUp: false,\r\n            selectedClass: 'active',\r\n            // Maximum height of the dropdown menu.\r\n            // If maximum height is exceeded a scrollbar will be displayed.\r\n            maxHeight: false,\r\n            includeSelectAllOption: false,\r\n            includeSelectAllIfMoreThan: 0,\r\n            selectAllText: ' Select all',\r\n            selectAllValue: 'multiselect-all',\r\n            selectAllName: false,\r\n            selectAllNumber: true,\r\n            selectAllJustVisible: true,\r\n            enableFiltering: false,\r\n            enableCaseInsensitiveFiltering: false,\r\n            enableFullValueFiltering: false,\r\n            enableClickableOptGroups: false,\r\n            enableCollapsibleOptGroups: false,\r\n            collapseOptGroupsByDefault: false,\r\n            filterPlaceholder: 'Search',\r\n            // possible options: 'text', 'value', 'both'\r\n            filterBehavior: 'text',\r\n            includeFilterClearBtn: true,\r\n            preventInputChangeEvent: false,\r\n            nonSelectedText: 'None selected',\r\n            nSelectedText: 'selected',\r\n            allSelectedText: 'All selected',\r\n            numberDisplayed: 3,\r\n            disableIfEmpty: false,\r\n            disabledText: '',\r\n            delimiterText: ', ',\r\n            includeResetOption: false,\r\n            includeResetDivider: false,\r\n            resetText: 'Reset',\r\n            indentGroupOptions: true,\r\n            // possible options: 'never', 'always', 'ifPopupIsSmaller', 'ifPopupIsWider'\r\n            widthSynchronizationMode: 'never',\r\n            buttonTextAlignment: 'center',\r\n            templates: {\r\n                button: '<button type=\"button\" class=\"multiselect dropdown-toggle\" data-toggle=\"dropdown\"><span class=\"multiselect-selected-text\"></span></button>',\r\n                popupContainer: '<div class=\"multiselect-container dropdown-menu\"></div>',\r\n                filter: '<div class=\"multiselect-filter d-flex align-items-center\"><i class=\"fas fa-sm fa-search text-muted\"></i><input type=\"search\" class=\"multiselect-search form-control\" /></div>',\r\n                option: '<button type=\"button\" class=\"multiselect-option dropdown-item\"></button>',\r\n                divider: '<div class=\"dropdown-divider\"></div>',\r\n                optionGroup: '<button type=\"button\" class=\"multiselect-group dropdown-item\"></button>',\r\n                resetButton: '<div class=\"multiselect-reset text-center p-2\"><button type=\"button\" class=\"btn btn-sm btn-block btn-outline-secondary\"></button></div>'\r\n            }\r\n        },\r\n\r\n        constructor: Multiselect,\r\n\r\n        /**\r\n         * Builds the container of the multiselect.\r\n         */\r\n        buildContainer: function () {\r\n            this.$container = $(this.options.buttonContainer);\r\n            if (this.options.widthSynchronizationMode !== 'never') {\r\n                this.$container.on('show.bs.dropdown', $.proxy(function () {\r\n                    // the width needs to be synchronized again in case the width of the button changed in between\r\n                    this.synchronizeButtonAndPopupWidth();\r\n                    this.options.onDropdownShow();\r\n                }, this));\r\n            }\r\n            else {\r\n                this.$container.on('show.bs.dropdown', this.options.onDropdownShow);\r\n            }\r\n            this.$container.on('hide.bs.dropdown', this.options.onDropdownHide);\r\n            this.$container.on('shown.bs.dropdown', this.options.onDropdownShown);\r\n            this.$container.on('hidden.bs.dropdown', this.options.onDropdownHidden);\r\n        },\r\n\r\n        /**\r\n         * Builds the button of the multiselect.\r\n         */\r\n        buildButton: function () {\r\n            this.$button = $(this.options.templates.button).addClass(this.options.buttonClass);\r\n            if (this.$select.attr('class') && this.options.inheritClass) {\r\n                this.$button.addClass(this.$select.attr('class'));\r\n            }\r\n            // Adopt active state.\r\n            if (this.$select.prop('disabled')) {\r\n                this.disable();\r\n            }\r\n            else {\r\n                this.enable();\r\n            }\r\n\r\n            // Manually add button width if set.\r\n            if (this.options.buttonWidth && this.options.buttonWidth !== 'auto') {\r\n                this.$button.css({\r\n                    'width': '100%' //this.options.buttonWidth,\r\n                });\r\n                this.$container.css({\r\n                    'width': this.options.buttonWidth\r\n                });\r\n            }\r\n\r\n            if (this.options.buttonTextAlignment) {\r\n                switch (this.options.buttonTextAlignment) {\r\n                    case 'left':\r\n                        this.$button.addClass('text-left');\r\n                        break;\r\n                    case 'center':\r\n                        this.$button.addClass('text-center');\r\n                        break;\r\n                    case 'right':\r\n                        this.$button.addClass('text-right');\r\n                        break;\r\n                }\r\n            }\r\n\r\n            // Keep the tab index from the select.\r\n            var tabindex = this.$select.attr('tabindex');\r\n            if (tabindex) {\r\n                this.$button.attr('tabindex', tabindex);\r\n            }\r\n\r\n            this.$container.prepend(this.$button);\r\n        },\r\n\r\n        /**\r\n         * Builds the popup container representing the dropdown menu.\r\n         */\r\n        buildDropdown: function () {\r\n\r\n            // Build popup container.\r\n            this.$popupContainer = $(this.options.templates.popupContainer);\r\n\r\n            if (this.options.dropRight) {\r\n                this.$container.addClass('dropright');\r\n            }\r\n            else if (this.options.dropUp) {\r\n                this.$container.addClass(\"dropup\");\r\n            }\r\n\r\n            // Set max height of dropdown menu to activate auto scrollbar.\r\n            if (this.options.maxHeight) {\r\n                // TODO: Add a class for this option to move the css declarations.\r\n                this.$popupContainer.css({\r\n                    'max-height': this.options.maxHeight + 'px',\r\n                    'overflow-y': 'auto',\r\n                    'overflow-x': 'hidden'\r\n                });\r\n            }\r\n\r\n            if (this.options.widthSynchronizationMode !== 'never') {\r\n                this.$popupContainer.css('overflow-x', 'hidden');\r\n            }\r\n\r\n            this.$popupContainer.on(\"touchstart click\", function (e) {\r\n                e.stopPropagation();\r\n            });\r\n\r\n            this.$container.append(this.$popupContainer);\r\n        },\r\n\r\n        synchronizeButtonAndPopupWidth: function () {\r\n            if (!this.$popupContainer || this.options.widthSynchronizationMode === 'never') {\r\n                return;\r\n            }\r\n\r\n            var buttonWidth = this.$button.outerWidth();\r\n            switch (this.options.widthSynchronizationMode) {\r\n                case 'always':\r\n                    this.$popupContainer.css('min-width', buttonWidth);\r\n                    this.$popupContainer.css('max-width', buttonWidth);\r\n                    break;\r\n                case 'ifPopupIsSmaller':\r\n                    this.$popupContainer.css('min-width', buttonWidth);\r\n                    break;\r\n                case 'ifPopupIsWider':\r\n                    this.$popupContainer.css('max-width', buttonWidth);\r\n                    break;\r\n            }\r\n        },\r\n\r\n        /**\r\n         * Build the dropdown options and binds all necessary events.\r\n         *\r\n         * Uses createDivider and createOptionValue to create the necessary options.\r\n         */\r\n        buildDropdownOptions: function () {\r\n\r\n            this.$select.children().each($.proxy(function (index, element) {\r\n\r\n                var $element = $(element);\r\n                // Support optgroups and options without a group simultaneously.\r\n                var tag = $element.prop('tagName')\r\n                    .toLowerCase();\r\n\r\n                if ($element.prop('value') === this.options.selectAllValue) {\r\n                    return;\r\n                }\r\n\r\n                if (tag === 'optgroup') {\r\n                    this.createOptgroup(element);\r\n                }\r\n                else if (tag === 'option') {\r\n\r\n                    if ($element.data('role') === 'divider') {\r\n                        this.createDivider();\r\n                    }\r\n                    else {\r\n                        this.createOptionValue(element, false);\r\n                    }\r\n\r\n                }\r\n\r\n                // Other illegal tags will be ignored.\r\n            }, this));\r\n\r\n            // Bind the change event on the dropdown elements.\r\n            $(this.$popupContainer).off('change', '> *:not(.multiselect-group) input[type=\"checkbox\"], > *:not(.multiselect-group) input[type=\"radio\"]');\r\n            $(this.$popupContainer).on('change', '> *:not(.multiselect-group) input[type=\"checkbox\"], > *:not(.multiselect-group) input[type=\"radio\"]', $.proxy(function (event) {\r\n                var $target = $(event.target);\r\n\r\n                var checked = $target.prop('checked') || false;\r\n                var isSelectAllOption = $target.val() === this.options.selectAllValue;\r\n\r\n                // Apply or unapply the configured selected class.\r\n                if (this.options.selectedClass) {\r\n                    if (checked) {\r\n                        $target.closest('.multiselect-option')\r\n                            .addClass(this.options.selectedClass);\r\n                    }\r\n                    else {\r\n                        $target.closest('.multiselect-option')\r\n                            .removeClass(this.options.selectedClass);\r\n                    }\r\n                }\r\n\r\n                // Get the corresponding option.\r\n                var value = $target.val();\r\n                var $option = this.getOptionByValue(value);\r\n\r\n                var $optionsNotThis = $('option', this.$select).not($option);\r\n                var $checkboxesNotThis = $('input', this.$container).not($target);\r\n\r\n                if (isSelectAllOption) {\r\n\r\n                    if (checked) {\r\n                        this.selectAll(this.options.selectAllJustVisible, true);\r\n                    }\r\n                    else {\r\n                        this.deselectAll(this.options.selectAllJustVisible, true);\r\n                    }\r\n                }\r\n                else {\r\n                    if (checked) {\r\n                        $option.prop('selected', true);\r\n\r\n                        if (this.options.multiple) {\r\n                            // Simply select additional option.\r\n                            $option.prop('selected', true);\r\n                        }\r\n                        else {\r\n                            // Unselect all other options and corresponding checkboxes.\r\n                            if (this.options.selectedClass) {\r\n                                $($checkboxesNotThis).closest('.dropdown-item').removeClass(this.options.selectedClass);\r\n                            }\r\n\r\n                            $($checkboxesNotThis).prop('checked', false);\r\n                            $optionsNotThis.prop('selected', false);\r\n\r\n                            // It's a single selection, so close.\r\n                            this.$button.click();\r\n                        }\r\n\r\n                        if (this.options.selectedClass === \"active\") {\r\n                            $optionsNotThis.closest(\".dropdown-item\").css(\"outline\", \"\");\r\n                        }\r\n                    }\r\n                    else {\r\n                        // Unselect option.\r\n                        $option.prop('selected', false);\r\n                    }\r\n\r\n                    // To prevent select all from firing onChange: #575\r\n                    this.options.onChange($option, checked);\r\n\r\n                    // Do not update select all or optgroups on select all change!\r\n                    this.updateSelectAll();\r\n\r\n                    if (this.options.enableClickableOptGroups && this.options.multiple) {\r\n                        this.updateOptGroups();\r\n                    }\r\n                }\r\n\r\n                this.$select.change();\r\n                this.updateButtonText();\r\n\r\n                if (this.options.preventInputChangeEvent) {\r\n                    return false;\r\n                }\r\n            }, this));\r\n\r\n            $('.multiselect-option', this.$popupContainer).off('mousedown');\r\n            $('.multiselect-option', this.$popupContainer).on('mousedown', function (e) {\r\n                if (e.shiftKey) {\r\n                    // Prevent selecting text by Shift+click\r\n                    return false;\r\n                }\r\n            });\r\n\r\n            $(this.$popupContainer).off('touchstart click', '.multiselect-option, .multiselect-all, .multiselect-group');\r\n            $(this.$popupContainer).on('touchstart click', '.multiselect-option, .multiselect-all, .multiselect-group', $.proxy(function (event) {\r\n                event.stopPropagation();\r\n\r\n                var $target = $(event.target);\r\n\r\n                if (event.shiftKey && this.options.multiple) {\r\n                    if (!$target.is(\"input\")) { // Handles checkbox selection manually (see https://github.com/davidstutz/bootstrap-multiselect/issues/431)\r\n                        event.preventDefault();\r\n                        $target = $target.closest(\".multiselect-option\").find(\"input\");\r\n                        $target.prop(\"checked\", !$target.prop(\"checked\"));\r\n                    }\r\n                    var checked = $target.prop('checked') || false;\r\n\r\n                    if (this.lastToggledInput !== null && this.lastToggledInput !== $target) { // Make sure we actually have a range\r\n                        var from = this.$popupContainer.find(\".multiselect-option:visible\").index($target.closest(\".multiselect-option\"));\r\n                        var to = this.$popupContainer.find(\".multiselect-option:visible\").index(this.lastToggledInput.closest(\".multiselect-option\"));\r\n\r\n                        if (from > to) { // Swap the indices\r\n                            var tmp = to;\r\n                            to = from;\r\n                            from = tmp;\r\n                        }\r\n\r\n                        // Make sure we grab all elements since slice excludes the last index\r\n                        ++to;\r\n\r\n                        // Change the checkboxes and underlying options\r\n                        var range = this.$popupContainer.find(\".multiselect-option:not(.multiselect-filter-hidden)\").slice(from, to).find(\"input\");\r\n\r\n                        range.prop('checked', checked);\r\n\r\n                        if (this.options.selectedClass) {\r\n                            range.closest('.multiselect-option')\r\n                                .toggleClass(this.options.selectedClass, checked);\r\n                        }\r\n\r\n                        for (var i = 0, j = range.length; i < j; i++) {\r\n                            var $checkbox = $(range[i]);\r\n\r\n                            var $option = this.getOptionByValue($checkbox.val());\r\n\r\n                            $option.prop('selected', checked);\r\n                        }\r\n                    }\r\n\r\n                    // Trigger the select \"change\" event\r\n                    $target.trigger(\"change\");\r\n                }\r\n                else if (!$target.is('input')) {\r\n                    var $checkbox = $target.closest('.multiselect-option, .multiselect-all').find('.form-check-input');\r\n                    if ($checkbox.length > 0) {\r\n                        $checkbox.prop('checked', !$checkbox.prop('checked'));\r\n                        $checkbox.change();\r\n                    }\r\n                    else if (this.options.enableClickableOptGroups && this.options.multiple && !$target.hasClass(\"caret-container\")) {\r\n                        var groupItem = $target;\r\n                        if (!groupItem.hasClass(\"multiselect-group\")) {\r\n                            groupItem = $target.closest('.multiselect-group');\r\n                        }\r\n                        $checkbox = groupItem.find(\".form-check-input\");\r\n                        if ($checkbox.length > 0) {\r\n                            $checkbox.prop('checked', !$checkbox.prop('checked'));\r\n                            $checkbox.change();\r\n                        }\r\n                    }\r\n\r\n                    event.preventDefault();\r\n                }\r\n\r\n                // Remembers last clicked option\r\n                var $input = $target.closest(\".multiselect-option\").find(\"input[type='checkbox'], input[type='radio']\");\r\n                if ($input.length > 0) {\r\n                    this.lastToggledInput = $target;\r\n                }\r\n                else {\r\n                    this.lastToggledInput = null;\r\n                }\r\n\r\n                $target.blur();\r\n            }, this));\r\n\r\n            //Keyboard support.\r\n            this.$container.off('keydown.multiselect').on('keydown.multiselect', $.proxy(function (event) {\r\n                if ($('input.multiselect-search', this.$container).is(':focus')) {\r\n                    return;\r\n                }\r\n\r\n                // keyCode 9 == Tab\r\n                if (event.keyCode === 9 && this.$container.hasClass('show')) {\r\n                    this.$button.click();\r\n                }\r\n                else {\r\n                    var $items = $(this.$container).find(\".multiselect-option:not(.disabled), .multiselect-group:not(.disabled), .multiselect-all\").filter(\":visible\");\r\n\r\n                    if (!$items.length) {\r\n                        return;\r\n                    }\r\n\r\n                    var index = $items.index($items.filter(':focus'));\r\n\r\n                    var $current = $items.eq(index);\r\n\r\n                    // keyCode 32 = Space\r\n                    if (event.keyCode === 32) {\r\n                        var $checkbox = $current.find('input');\r\n\r\n                        $checkbox.prop(\"checked\", !$checkbox.prop(\"checked\"));\r\n                        $checkbox.change();\r\n\r\n                        event.preventDefault();\r\n                    }\r\n\r\n                    // keyCode 13 = Enter\r\n                    if (event.keyCode === 13) {\r\n                        setTimeout(function () {\r\n                            $current.focus();\r\n                        }, 0);\r\n                    }\r\n                }\r\n            }, this));\r\n\r\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\r\n                $(\".multiselect-group input\", this.$popupContainer).off(\"change\");\r\n                $(\".multiselect-group input\", this.$popupContainer).on(\"change\", $.proxy(function (event) {\r\n                    event.stopPropagation();\r\n\r\n                    var $target = $(event.target);\r\n                    var checked = $target.prop('checked') || false;\r\n\r\n                    var $item = $(event.target).closest('.dropdown-item');\r\n                    var $group = $item.nextUntil(\".multiselect-group\")\r\n                        .not('.multiselect-filter-hidden')\r\n                        .not('.disabled');\r\n\r\n                    var $inputs = $group.find(\"input\");\r\n\r\n                    var $options = [];\r\n\r\n                    if (this.options.selectedClass) {\r\n                        if (checked) {\r\n                            $item.addClass(this.options.selectedClass);\r\n                        }\r\n                        else {\r\n                            $item.removeClass(this.options.selectedClass);\r\n                        }\r\n                    }\r\n\r\n                    $.each($inputs, $.proxy(function (index, input) {\r\n                        var $input = $(input);\r\n                        var value = $input.val();\r\n                        var $option = this.getOptionByValue(value);\r\n\r\n                        if (checked) {\r\n                            $input.prop('checked', true);\r\n                            $input.closest('.dropdown-item')\r\n                                .addClass(this.options.selectedClass);\r\n\r\n                            $option.prop('selected', true);\r\n                        }\r\n                        else {\r\n                            $input.prop('checked', false);\r\n                            $input.closest('.dropdown-item')\r\n                                .removeClass(this.options.selectedClass);\r\n\r\n                            $option.prop('selected', false);\r\n                        }\r\n\r\n                        $options.push(this.getOptionByValue(value));\r\n                    }, this))\r\n\r\n                    // Cannot use select or deselect here because it would call updateOptGroups again.\r\n\r\n                    this.options.onChange($options, checked);\r\n\r\n                    this.$select.change();\r\n                    this.updateButtonText();\r\n                    this.updateSelectAll();\r\n                }, this));\r\n            }\r\n\r\n            if (this.options.enableCollapsibleOptGroups && this.options.multiple) {\r\n                $(\".multiselect-group .caret-container\", this.$popupContainer).off(\"click\");\r\n                $(\".multiselect-group .caret-container\", this.$popupContainer).on(\"click\", $.proxy(function (event) {\r\n                    var $group = $(event.target).closest('.multiselect-group');\r\n                    var $inputs = $group.nextUntil(\".multiselect-group\")\r\n                        .not('.multiselect-filter-hidden');\r\n\r\n                    var visible = true;\r\n                    $inputs.each(function () {\r\n                        visible = visible && !$(this).hasClass('multiselect-collapsible-hidden');\r\n                    });\r\n\r\n                    if (visible) {\r\n                        $inputs.hide()\r\n                            .addClass('multiselect-collapsible-hidden');\r\n                    }\r\n                    else {\r\n                        $inputs.show()\r\n                            .removeClass('multiselect-collapsible-hidden');\r\n                    }\r\n                }, this));\r\n            }\r\n        },\r\n\r\n        /**\r\n         * Create a checkbox container with input and label based on given values\r\n         * @param {JQuery} $item \r\n         * @param {String} label \r\n         * @param {String} name \r\n         * @param {String} value \r\n         * @param {String} inputType \r\n         * @returns {JQuery}\r\n         */\r\n        createCheckbox: function ($item, label, name, value, title, inputType) {\r\n            var $wrapper = $('<span />');\r\n            $wrapper.addClass(\"form-check\");\r\n\r\n            if (this.options.enableHTML && $(label).length > 0) {\r\n                $wrapper.append($(label));\r\n            }\r\n            else {\r\n                var $checkboxLabel = $('<label class=\"form-check-label\" />');\r\n                $checkboxLabel.text(label);\r\n                $wrapper.append($checkboxLabel);\r\n            }\r\n\r\n            var $checkbox = $('<input class=\"form-check-input\"/>').attr('type', inputType);\r\n            $checkbox.val(value);\r\n            $wrapper.prepend($checkbox);\r\n\r\n            if (name) {\r\n                $checkbox.attr('name', name);\r\n            }\r\n\r\n            $item.prepend($wrapper);\r\n            $item.attr(\"title\", title || label);\r\n\r\n            return $checkbox;\r\n        },\r\n\r\n        /**\r\n         * Create an option using the given select option.\r\n         *\r\n         * @param {jQuery} element\r\n         */\r\n        createOptionValue: function (element, isGroupOption) {\r\n            var $element = $(element);\r\n            if ($element.is(':selected')) {\r\n                $element.prop('selected', true);\r\n            }\r\n\r\n            // Support the label attribute on options.\r\n            var label = this.options.optionLabel(element);\r\n            var classes = this.options.optionClass(element);\r\n            var value = $element.val();\r\n            var inputType = this.options.multiple ? \"checkbox\" : \"radio\";\r\n            var title = $element.attr('title');\r\n\r\n            var $option = $(this.options.templates.option);\r\n            $option.addClass(classes);\r\n\r\n            if (isGroupOption && this.options.indentGroupOptions) {\r\n                $option.addClass(\"multiselect-group-option-indented\")\r\n            }\r\n\r\n            // Hide all children items when collapseOptGroupsByDefault is true\r\n            if (this.options.collapseOptGroupsByDefault && $(element).parent().prop(\"tagName\").toLowerCase() === \"optgroup\") {\r\n                $option.addClass(\"multiselect-collapsible-hidden\");\r\n                $option.hide();\r\n            }\r\n\r\n            var name = this.options.checkboxName($element);\r\n            var $checkbox = this.createCheckbox($option, label, name, value, title, inputType);\r\n\r\n            var selected = $element.prop('selected') || false;\r\n\r\n            if (value === this.options.selectAllValue) {\r\n                $option.addClass(\"multiselect-all\");\r\n                $option.removeClass(\"multiselect-option\");\r\n                $checkbox.parent().parent()\r\n                    .addClass('multiselect-all');\r\n            }\r\n\r\n            this.$popupContainer.append($option);\r\n\r\n            if ($element.is(':disabled')) {\r\n                $checkbox.attr('disabled', 'disabled')\r\n                    .prop('disabled', true)\r\n                    .closest('.dropdown-item')\r\n                    .addClass('disabled');\r\n            }\r\n\r\n            $checkbox.prop('checked', selected);\r\n\r\n            if (selected && this.options.selectedClass) {\r\n                $checkbox.closest('.dropdown-item')\r\n                    .addClass(this.options.selectedClass);\r\n            }\r\n        },\r\n\r\n        /**\r\n         * Creates a divider using the given select option.\r\n         *\r\n         * @param {jQuery} element\r\n         */\r\n        createDivider: function (element) {\r\n            var $divider = $(this.options.templates.divider);\r\n            this.$popupContainer.append($divider);\r\n        },\r\n\r\n        /**\r\n         * Creates an optgroup.\r\n         *\r\n         * @param {jQuery} group\r\n         */\r\n        createOptgroup: function (group) {\r\n            var $group = $(group);\r\n            var label = $group.attr(\"label\");\r\n            var value = $group.attr(\"value\");\r\n            var title = $group.attr('title');\r\n\r\n            var $groupOption = $(\"<span class='multiselect-group dropdown-item-text'></span>\");\r\n\r\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\r\n                $groupOption = $(this.options.templates.optionGroup);\r\n                var $checkbox = this.createCheckbox($groupOption, label, null, value, title, \"checkbox\");\r\n            }\r\n            else {\r\n                if (this.options.enableHTML) {\r\n                    $groupOption.html(\" \" + label);\r\n                }\r\n                else {\r\n                    $groupOption.text(\" \" + label);\r\n                }\r\n            }\r\n\r\n            var classes = this.options.optionClass(group);\r\n            $groupOption.addClass(classes);\r\n\r\n            if (this.options.enableCollapsibleOptGroups && this.options.multiple) {\r\n                $groupOption.find('.form-check').addClass('d-inline-block');\r\n                $groupOption.append('<span class=\"caret-container dropdown-toggle pl-1\"></span>');\r\n            }\r\n\r\n            if ($group.is(':disabled')) {\r\n                $groupOption.addClass('disabled');\r\n            }\r\n\r\n            this.$popupContainer.append($groupOption);\r\n\r\n            $(\"option\", group).each($.proxy(function ($, group) {\r\n                this.createOptionValue(group, true);\r\n            }, this));\r\n        },\r\n\r\n        /**\r\n         * Build the reset.\r\n         *\r\n         */\r\n        buildReset: function () {\r\n            if (this.options.includeResetOption) {\r\n\r\n                // Check whether to add a divider after the reset.\r\n                if (this.options.includeResetDivider) {\r\n                    var divider = $(this.options.templates.divider);\r\n                    divider.addClass(\"mt-0\");\r\n                    this.$popupContainer.prepend(divider);\r\n                }\r\n\r\n                var $resetButton = $(this.options.templates.resetButton);\r\n\r\n                if (this.options.enableHTML) {\r\n                    $('button', $resetButton).html(this.options.resetText);\r\n                }\r\n                else {\r\n                    $('button', $resetButton).text(this.options.resetText);\r\n                }\r\n\r\n                $('button', $resetButton).click($.proxy(function () {\r\n                    this.clearSelection();\r\n                }, this));\r\n\r\n                this.$popupContainer.prepend($resetButton);\r\n            }\r\n        },\r\n\r\n        /**\r\n         * Build the select all.\r\n         *\r\n         * Checks if a select all has already been created.\r\n         */\r\n        buildSelectAll: function () {\r\n            if (typeof this.options.selectAllValue === 'number') {\r\n                this.options.selectAllValue = this.options.selectAllValue.toString();\r\n            }\r\n\r\n            var alreadyHasSelectAll = this.hasSelectAll();\r\n\r\n            if (!alreadyHasSelectAll && this.options.includeSelectAllOption && this.options.multiple\r\n                && $('option', this.$select).length > this.options.includeSelectAllIfMoreThan) {\r\n\r\n                // Check whether to add a divider after the select all.\r\n                if (this.options.includeSelectAllDivider) {\r\n                    this.$popupContainer.prepend($(this.options.templates.divider));\r\n                }\r\n\r\n                var $option = $(this.options.templates.li || this.options.templates.option);\r\n                var $checkbox = this.createCheckbox($option, this.options.selectAllText, this.options.selectAllName, this.options.selectAllValue, this.options.selectAllText, \"checkbox\");\r\n\r\n                $option.addClass(\"multiselect-all\");\r\n                $option.removeClass(\"multiselect-option\");\r\n                $option.find(\".form-check-label\").addClass(\"font-weight-bold\");\r\n\r\n                this.$popupContainer.prepend($option);\r\n\r\n                $checkbox.prop('checked', false);\r\n            }\r\n        },\r\n\r\n        /**\r\n         * Builds the filter.\r\n         */\r\n        buildFilter: function () {\r\n\r\n            // Build filter if filtering OR case insensitive filtering is enabled and the number of options exceeds (or equals) enableFilterLength.\r\n            if (this.options.enableFiltering || this.options.enableCaseInsensitiveFiltering) {\r\n                var enableFilterLength = Math.max(this.options.enableFiltering, this.options.enableCaseInsensitiveFiltering);\r\n\r\n                if (this.$select.find('option').length >= enableFilterLength) {\r\n\r\n                    this.$filter = $(this.options.templates.filter);\r\n                    $('input', this.$filter).attr('placeholder', this.options.filterPlaceholder);\r\n\r\n                    // Handles optional filter clear button                        \r\n                    if (!this.options.includeFilterClearBtn) {\r\n                        this.$filter.find(\".multiselect-search\").attr(\"type\", \"text\");\r\n\r\n                        // Remove clear button if the old design of the filter with input groups and separated clear button is used\r\n                        this.$filter.find(\".multiselect-clear-filter\").remove();\r\n                    }\r\n                    else {\r\n                        // Firefox does not support a clear button in search inputs right now therefore it must be added manually\r\n                        if (this.isFirefox() && this.$filter.find(\".multiselect-clear-filter\").length === 0) {\r\n                            this.$filter.append(\"<i class='fas fa-times text-muted multiselect-clear-filter multiselect-moz-clear-filter'></i>\");\r\n                        }\r\n\r\n                        this.$filter.find(\".multiselect-clear-filter\").on('click', $.proxy(function (event) {\r\n                            clearTimeout(this.searchTimeout);\r\n\r\n                            this.query = '';\r\n                            this.$filter.find('.multiselect-search').val('');\r\n                            $('.dropdown-item', this.$popupContainer).show().removeClass('multiselect-filter-hidden');\r\n\r\n                            this.updateSelectAll();\r\n\r\n                            if (this.options.enableClickableOptGroups && this.options.multiple) {\r\n                                this.updateOptGroups();\r\n                            }\r\n\r\n                        }, this));\r\n                    }\r\n\r\n                    this.$popupContainer.prepend(this.$filter);\r\n\r\n                    this.$filter.val(this.query).on('click', function (event) {\r\n                        event.stopPropagation();\r\n                    }).on('input keydown', $.proxy(function (event) {\r\n                        // Cancel enter key default behaviour\r\n                        if (event.which === 13) {\r\n                            event.preventDefault();\r\n                        }\r\n\r\n                        if (this.isFirefox() && this.options.includeFilterClearBtn) {\r\n                            if (event.target.value) {\r\n                                this.$filter.find(\".multiselect-moz-clear-filter\").show();\r\n                            }\r\n                            else {\r\n                                this.$filter.find(\".multiselect-moz-clear-filter\").hide();\r\n                            }\r\n                        }\r\n\r\n                        // This is useful to catch \"keydown\" events after the browser has updated the control.\r\n                        clearTimeout(this.searchTimeout);\r\n\r\n                        this.searchTimeout = this.asyncFunction($.proxy(function () {\r\n\r\n                            if (this.query !== event.target.value) {\r\n                                this.query = event.target.value;\r\n\r\n                                var currentGroup, currentGroupVisible;\r\n                                $.each($('.multiselect-option, .multiselect-group', this.$popupContainer), $.proxy(function (index, element) {\r\n                                    var value = $('input', element).length > 0 ? $('input', element).val() : \"\";\r\n                                    var text = $('.form-check-label', element).text();\r\n\r\n                                    var filterCandidate = '';\r\n                                    if ((this.options.filterBehavior === 'text')) {\r\n                                        filterCandidate = text;\r\n                                    }\r\n                                    else if ((this.options.filterBehavior === 'value')) {\r\n                                        filterCandidate = value;\r\n                                    }\r\n                                    else if (this.options.filterBehavior === 'both') {\r\n                                        filterCandidate = text + '\\n' + value;\r\n                                    }\r\n\r\n                                    if (value !== this.options.selectAllValue && text) {\r\n\r\n                                        // By default lets assume that element is not\r\n                                        // interesting for this search.\r\n                                        var showElement = false;\r\n\r\n                                        if (this.options.enableCaseInsensitiveFiltering) {\r\n                                            filterCandidate = filterCandidate.toLowerCase();\r\n                                            this.query = this.query.toLowerCase();\r\n                                        }\r\n\r\n                                        if (this.options.enableFullValueFiltering && this.options.filterBehavior !== 'both') {\r\n                                            var valueToMatch = filterCandidate.trim().substring(0, this.query.length);\r\n                                            if (this.query.indexOf(valueToMatch) > -1) {\r\n                                                showElement = true;\r\n                                            }\r\n                                        }\r\n                                        else if (filterCandidate.indexOf(this.query) > -1) {\r\n                                            showElement = true;\r\n                                        }\r\n\r\n                                        // Toggle current element (group or group item) according to showElement boolean.\r\n                                        if (!showElement) {\r\n                                            $(element).css('display', 'none');\r\n                                            $(element).addClass('multiselect-filter-hidden');\r\n                                        }\r\n                                        if (showElement) {\r\n                                            $(element).css('display', 'block');\r\n                                            $(element).removeClass('multiselect-filter-hidden');\r\n                                        }\r\n\r\n                                        // Differentiate groups and group items.\r\n                                        if ($(element).hasClass('multiselect-group')) {\r\n                                            // Remember group status.\r\n                                            currentGroup = element;\r\n                                            currentGroupVisible = showElement;\r\n                                        }\r\n                                        else {\r\n                                            // Show group name when at least one of its items is visible.\r\n                                            if (showElement) {\r\n                                                $(currentGroup).show()\r\n                                                    .removeClass('multiselect-filter-hidden');\r\n                                            }\r\n\r\n                                            // Show all group items when group name satisfies filter.\r\n                                            if (!showElement && currentGroupVisible) {\r\n                                                $(element).show()\r\n                                                    .removeClass('multiselect-filter-hidden');\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }, this));\r\n                            }\r\n\r\n                            this.updateSelectAll();\r\n\r\n                            if (this.options.enableClickableOptGroups && this.options.multiple) {\r\n                                this.updateOptGroups();\r\n                            }\r\n\r\n                            this.options.onFiltering(event.target);\r\n\r\n                        }, this), 300, this);\r\n                    }, this));\r\n                }\r\n            }\r\n        },\r\n\r\n        /**\r\n         * Unbinds the whole plugin.\r\n         */\r\n        destroy: function () {\r\n            this.$container.remove();\r\n            this.$select.show();\r\n\r\n            // reset original state\r\n            this.$select.prop('disabled', this.options.wasDisabled);\r\n\r\n            this.$select.data('multiselect', null);\r\n        },\r\n\r\n        /**\r\n         * Refreshs the multiselect based on the selected options of the select.\r\n         */\r\n        refresh: function () {\r\n            var inputs = {};\r\n            $('.multiselect-option input', this.$popupContainer).each(function () {\r\n                inputs[$(this).val()] = $(this);\r\n            });\r\n\r\n            $('option', this.$select).each($.proxy(function (index, element) {\r\n                var $elem = $(element);\r\n                var $input = inputs[$(element).val()];\r\n\r\n                if ($elem.is(':selected')) {\r\n                    $input.prop('checked', true);\r\n\r\n                    if (this.options.selectedClass) {\r\n                        $input.closest('.multiselect-option')\r\n                            .addClass(this.options.selectedClass);\r\n                    }\r\n                }\r\n                else {\r\n                    $input.prop('checked', false);\r\n\r\n                    if (this.options.selectedClass) {\r\n                        $input.closest('.multiselect-option')\r\n                            .removeClass(this.options.selectedClass);\r\n                    }\r\n                }\r\n\r\n                if ($elem.is(\":disabled\")) {\r\n                    $input.attr('disabled', 'disabled')\r\n                        .prop('disabled', true)\r\n                        .closest('.multiselect-option')\r\n                        .addClass('disabled');\r\n                }\r\n                else {\r\n                    $input.prop('disabled', false)\r\n                        .closest('.multiselect-option')\r\n                        .removeClass('disabled');\r\n                }\r\n            }, this));\r\n\r\n            this.updateButtonText();\r\n            this.updateSelectAll();\r\n\r\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\r\n                this.updateOptGroups();\r\n            }\r\n        },\r\n\r\n        /**\r\n         * Select all options of the given values.\r\n         *\r\n         * If triggerOnChange is set to true, the on change event is triggered if\r\n         * and only if one value is passed.\r\n         *\r\n         * @param {Array} selectValues\r\n         * @param {Boolean} triggerOnChange\r\n         */\r\n        select: function (selectValues, triggerOnChange) {\r\n            if (!$.isArray(selectValues)) {\r\n                selectValues = [selectValues];\r\n            }\r\n\r\n            for (var i = 0; i < selectValues.length; i++) {\r\n                var value = selectValues[i];\r\n\r\n                if (value === null || value === undefined) {\r\n                    continue;\r\n                }\r\n\r\n                var $option = this.getOptionByValue(value);\r\n                var $checkbox = this.getInputByValue(value);\r\n\r\n                if ($option === undefined || $checkbox === undefined) {\r\n                    continue;\r\n                }\r\n\r\n                if (!this.options.multiple) {\r\n                    this.deselectAll(false);\r\n                }\r\n\r\n                if (this.options.selectedClass) {\r\n                    $checkbox.closest('.dropdown-item')\r\n                        .addClass(this.options.selectedClass);\r\n                }\r\n\r\n                $checkbox.prop('checked', true);\r\n                $option.prop('selected', true);\r\n\r\n                if (triggerOnChange) {\r\n                    this.options.onChange($option, true);\r\n                }\r\n            }\r\n\r\n            this.updateButtonText();\r\n            this.updateSelectAll();\r\n\r\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\r\n                this.updateOptGroups();\r\n            }\r\n        },\r\n\r\n        /**\r\n         * Clears all selected items.\r\n         */\r\n        clearSelection: function () {\r\n            this.deselectAll(false);\r\n            this.updateButtonText();\r\n            this.updateSelectAll();\r\n\r\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\r\n                this.updateOptGroups();\r\n            }\r\n        },\r\n\r\n        /**\r\n         * Deselects all options of the given values.\r\n         *\r\n         * If triggerOnChange is set to true, the on change event is triggered, if\r\n         * and only if one value is passed.\r\n         *\r\n         * @param {Array} deselectValues\r\n         * @param {Boolean} triggerOnChange\r\n         */\r\n        deselect: function (deselectValues, triggerOnChange) {\r\n            if (!$.isArray(deselectValues)) {\r\n                deselectValues = [deselectValues];\r\n            }\r\n\r\n            for (var i = 0; i < deselectValues.length; i++) {\r\n                var value = deselectValues[i];\r\n\r\n                if (value === null || value === undefined) {\r\n                    continue;\r\n                }\r\n\r\n                var $option = this.getOptionByValue(value);\r\n                var $checkbox = this.getInputByValue(value);\r\n\r\n                if ($option === undefined || $checkbox === undefined) {\r\n                    continue;\r\n                }\r\n\r\n                if (this.options.selectedClass) {\r\n                    $checkbox.closest('.dropdown-item')\r\n                        .removeClass(this.options.selectedClass);\r\n                }\r\n\r\n                $checkbox.prop('checked', false);\r\n                $option.prop('selected', false);\r\n\r\n                if (triggerOnChange) {\r\n                    this.options.onChange($option, false);\r\n                }\r\n            }\r\n\r\n            this.updateButtonText();\r\n            this.updateSelectAll();\r\n\r\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\r\n                this.updateOptGroups();\r\n            }\r\n        },\r\n\r\n        /**\r\n         * Selects all enabled & visible options.\r\n         *\r\n         * If justVisible is true or not specified, only visible options are selected.\r\n         *\r\n         * @param {Boolean} justVisible\r\n         * @param {Boolean} triggerOnSelectAll\r\n         */\r\n        selectAll: function (justVisible, triggerOnSelectAll) {\r\n\r\n            var justVisible = typeof justVisible === 'undefined' ? true : justVisible;\r\n\r\n            if (justVisible) {\r\n                var visibleOptions = $(\".multiselect-option:not(.disabled):not(.multiselect-filter-hidden)\", this.$popupContainer);\r\n                $('input:enabled', visibleOptions).prop('checked', true);\r\n                visibleOptions.addClass(this.options.selectedClass);\r\n\r\n                $('input:enabled', visibleOptions).each($.proxy(function (index, element) {\r\n                    var value = $(element).val();\r\n                    var option = this.getOptionByValue(value);\r\n                    $(option).prop('selected', true);\r\n                }, this));\r\n            }\r\n            else {\r\n                var allOptions = $(\".multiselect-option:not(.disabled)\", this.$popupContainer);\r\n                $('input:enabled', allOptions).prop('checked', true);\r\n                allOptions.addClass(this.options.selectedClass);\r\n\r\n                $('input:enabled', allOptions).each($.proxy(function (index, element) {\r\n                    var value = $(element).val();\r\n                    var option = this.getOptionByValue(value);\r\n                    $(option).prop('selected', true);\r\n                }, this));\r\n            }\r\n\r\n            $('.multiselect-option input[value=\"' + this.options.selectAllValue + '\"]', this.$popupContainer).prop('checked', true);\r\n\r\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\r\n                this.updateOptGroups();\r\n            }\r\n\r\n            this.updateButtonText();\r\n            this.updateSelectAll();\r\n\r\n            if (triggerOnSelectAll) {\r\n                this.options.onSelectAll();\r\n            }\r\n        },\r\n\r\n        /**\r\n         * Deselects all options.\r\n         *\r\n         * If justVisible is true or not specified, only visible options are deselected.\r\n         *\r\n         * @param {Boolean} justVisible\r\n         */\r\n        deselectAll: function (justVisible, triggerOnDeselectAll) {\r\n\r\n            var justVisible = typeof justVisible === 'undefined' ? true : justVisible;\r\n\r\n            if (justVisible) {\r\n                var visibleOptions = $(\".multiselect-option:not(.disabled):not(.multiselect-filter-hidden)\", this.$popupContainer);\r\n                $('input[type=\"checkbox\"]:enabled', visibleOptions).prop('checked', false);\r\n                visibleOptions.removeClass(this.options.selectedClass);\r\n\r\n                $('input[type=\"checkbox\"]:enabled', visibleOptions).each($.proxy(function (index, element) {\r\n                    var value = $(element).val();\r\n                    var option = this.getOptionByValue(value);\r\n                    $(option).prop('selected', false);\r\n                }, this));\r\n            }\r\n            else {\r\n                var allOptions = $(\".multiselect-option:not(.disabled):not(.multiselect-group)\", this.$popupContainer);\r\n                $('input[type=\"checkbox\"]:enabled', allOptions).prop('checked', false);\r\n                allOptions.removeClass(this.options.selectedClass);\r\n\r\n                $('input[type=\"checkbox\"]:enabled', allOptions).each($.proxy(function (index, element) {\r\n                    var value = $(element).val();\r\n                    var option = this.getOptionByValue(value);\r\n                    $(option).prop('selected', false);\r\n                }, this));\r\n            }\r\n\r\n            $('.multiselect-all input[value=\"' + this.options.selectAllValue + '\"]', this.$popupContainer).prop('checked', false);\r\n\r\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\r\n                this.updateOptGroups();\r\n            }\r\n\r\n            this.updateButtonText();\r\n            this.updateSelectAll();\r\n\r\n            if (triggerOnDeselectAll) {\r\n                this.options.onDeselectAll();\r\n            }\r\n        },\r\n\r\n        /**\r\n         * Rebuild the plugin.\r\n         *\r\n         * Rebuilds the dropdown, the filter and the select all option.\r\n         */\r\n        rebuild: function () {\r\n            this.$popupContainer.html('');\r\n\r\n            // Important to distinguish between radios and checkboxes.\r\n            this.options.multiple = this.$select.attr('multiple') === \"multiple\";\r\n\r\n            this.buildSelectAll();\r\n            this.buildDropdownOptions();\r\n            this.buildFilter();\r\n\r\n            this.updateButtonText();\r\n            this.updateSelectAll(true);\r\n\r\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\r\n                this.updateOptGroups();\r\n            }\r\n\r\n            if (this.options.disableIfEmpty && $('option', this.$select).length <= 0) {\r\n                this.disable();\r\n            }\r\n            else {\r\n                this.enable();\r\n            }\r\n\r\n            if (this.options.dropRight) {\r\n                this.$container.addClass('dropright');\r\n            }\r\n            else if (this.options.dropUp) {\r\n                this.$container.addClass('dropup');\r\n            }\r\n\r\n            if (this.options.widthSynchronizationMode !== 'never') {\r\n                this.synchronizeButtonAndPopupWidth();\r\n            }\r\n        },\r\n\r\n        /**\r\n         * The provided data will be used to build the dropdown.\r\n         */\r\n        dataprovider: function (dataprovider) {\r\n\r\n            var groupCounter = 0;\r\n            var $select = this.$select.empty();\r\n\r\n            $.each(dataprovider, function (index, option) {\r\n                var $tag;\r\n\r\n                if ($.isArray(option.children)) { // create optiongroup tag\r\n                    groupCounter++;\r\n\r\n                    $tag = $('<optgroup/>').attr({\r\n                        label: option.label || 'Group ' + groupCounter,\r\n                        disabled: !!option.disabled,\r\n                        value: option.value\r\n                    });\r\n\r\n                    forEach(option.children, function (subOption) { // add children option tags\r\n                        var attributes = {\r\n                            value: subOption.value,\r\n                            label: subOption.label || subOption.value,\r\n                            title: subOption.title,\r\n                            selected: !!subOption.selected,\r\n                            disabled: !!subOption.disabled\r\n                        };\r\n\r\n                        //Loop through attributes object and add key-value for each attribute\r\n                        for (var key in subOption.attributes) {\r\n                            attributes['data-' + key] = subOption.attributes[key];\r\n                        }\r\n                        //Append original attributes + new data attributes to option\r\n                        $tag.append($('<option/>').attr(attributes));\r\n                    });\r\n                }\r\n                else {\r\n\r\n                    var attributes = {\r\n                        'value': option.value,\r\n                        'label': option.label || option.value,\r\n                        'title': option.title,\r\n                        'class': option['class'],\r\n                        'selected': !!option['selected'],\r\n                        'disabled': !!option['disabled']\r\n                    };\r\n                    //Loop through attributes object and add key-value for each attribute\r\n                    for (var key in option.attributes) {\r\n                        attributes['data-' + key] = option.attributes[key];\r\n                    }\r\n                    //Append original attributes + new data attributes to option\r\n                    $tag = $('<option/>').attr(attributes);\r\n\r\n                    $tag.text(option.label || option.value);\r\n                }\r\n\r\n                $select.append($tag);\r\n            });\r\n\r\n            this.rebuild();\r\n        },\r\n\r\n        /**\r\n         * Enable the multiselect.\r\n         */\r\n        enable: function () {\r\n            this.$select.prop('disabled', false);\r\n            this.$button.prop('disabled', false)\r\n                .removeClass('disabled');\r\n\r\n            this.updateButtonText();\r\n        },\r\n\r\n        /**\r\n         * Disable the multiselect.\r\n         */\r\n        disable: function () {\r\n            this.$select.prop('disabled', true);\r\n            this.$button.prop('disabled', true)\r\n                .addClass('disabled');\r\n\r\n            this.updateButtonText();\r\n        },\r\n\r\n        /**\r\n         * Set the options.\r\n         *\r\n         * @param {Array} options\r\n         */\r\n        setOptions: function (options) {\r\n            this.options = this.mergeOptions(options);\r\n        },\r\n\r\n        /**\r\n         * Merges the given options with the default options.\r\n         *\r\n         * @param {Array} options\r\n         * @returns {Array}\r\n         */\r\n        mergeOptions: function (options) {\r\n            return $.extend(true, {}, this.defaults, this.options, options);\r\n        },\r\n\r\n        /**\r\n         * Checks whether a select all checkbox is present.\r\n         *\r\n         * @returns {Boolean}\r\n         */\r\n        hasSelectAll: function () {\r\n            return $('.multiselect-all', this.$popupContainer).length > 0;\r\n        },\r\n\r\n        /**\r\n         * Update opt groups.\r\n         */\r\n        updateOptGroups: function () {\r\n            var $groups = $('.multiselect-group', this.$popupContainer)\r\n            var selectedClass = this.options.selectedClass;\r\n\r\n            $groups.each(function () {\r\n                var $options = $(this).nextUntil('.multiselect-group')\r\n                    .not('.multiselect-filter-hidden')\r\n                    .not('.disabled');\r\n\r\n                var checked = true;\r\n                $options.each(function () {\r\n                    var $input = $('input', this);\r\n\r\n                    if (!$input.prop('checked')) {\r\n                        checked = false;\r\n                    }\r\n                });\r\n\r\n                if (selectedClass) {\r\n                    if (checked) {\r\n                        $(this).addClass(selectedClass);\r\n                    }\r\n                    else {\r\n                        $(this).removeClass(selectedClass);\r\n                    }\r\n                }\r\n\r\n                $('input', this).prop('checked', checked);\r\n            });\r\n        },\r\n\r\n        /**\r\n         * Updates the select all checkbox based on the currently displayed and selected checkboxes.\r\n         */\r\n        updateSelectAll: function (notTriggerOnSelectAll) {\r\n            if (this.hasSelectAll()) {\r\n                var allBoxes = $(\".multiselect-option:not(.multiselect-filter-hidden):not(.multiselect-group):not(.disabled) input:enabled\", this.$popupContainer);\r\n                var allBoxesLength = allBoxes.length;\r\n                var checkedBoxesLength = allBoxes.filter(\":checked\").length;\r\n                var selectAllItem = $(\".multiselect-all\", this.$popupContainer);\r\n                var selectAllInput = selectAllItem.find(\"input\");\r\n\r\n                if (checkedBoxesLength > 0 && checkedBoxesLength === allBoxesLength) {\r\n                    selectAllInput.prop(\"checked\", true);\r\n                    selectAllItem.addClass(this.options.selectedClass);\r\n                }\r\n                else {\r\n                    selectAllInput.prop(\"checked\", false);\r\n                    selectAllItem.removeClass(this.options.selectedClass);\r\n                }\r\n            }\r\n        },\r\n\r\n        /**\r\n         * Update the button text and its title based on the currently selected options.\r\n         */\r\n        updateButtonText: function () {\r\n            var options = this.getSelected();\r\n\r\n            // First update the displayed button text.\r\n            if (this.options.enableHTML) {\r\n                $('.multiselect .multiselect-selected-text', this.$container).html(this.options.buttonText(options, this.$select));\r\n            }\r\n            else {\r\n                $('.multiselect .multiselect-selected-text', this.$container).text(this.options.buttonText(options, this.$select));\r\n            }\r\n\r\n            // Now update the title attribute of the button.\r\n            $('.multiselect', this.$container).attr('title', this.options.buttonTitle(options, this.$select));\r\n            this.$button.trigger('change');\r\n        },\r\n\r\n        /**\r\n         * Get all selected options.\r\n         *\r\n         * @returns {jQUery}\r\n         */\r\n        getSelected: function () {\r\n            return $('option', this.$select).filter(\":selected\");\r\n        },\r\n\r\n        /**\r\n         * Gets a select option by its value.\r\n         *\r\n         * @param {String} value\r\n         * @returns {jQuery}\r\n         */\r\n        getOptionByValue: function (value) {\r\n\r\n            var options = $('option', this.$select);\r\n            var valueToCompare = value.toString();\r\n\r\n            for (var i = 0; i < options.length; i = i + 1) {\r\n                var option = options[i];\r\n                if (option.value === valueToCompare) {\r\n                    return $(option);\r\n                }\r\n            }\r\n        },\r\n\r\n        /**\r\n         * Get the input (radio/checkbox) by its value.\r\n         *\r\n         * @param {String} value\r\n         * @returns {jQuery}\r\n         */\r\n        getInputByValue: function (value) {\r\n\r\n            var checkboxes = $('.multiselect-option input:not(.multiselect-search)', this.$popupContainer);\r\n            var valueToCompare = value.toString();\r\n\r\n            for (var i = 0; i < checkboxes.length; i = i + 1) {\r\n                var checkbox = checkboxes[i];\r\n                if (checkbox.value === valueToCompare) {\r\n                    return $(checkbox);\r\n                }\r\n            }\r\n        },\r\n\r\n        /**\r\n         * Used for knockout integration.\r\n         */\r\n        updateOriginalOptions: function () {\r\n            this.originalOptions = this.$select.clone()[0].options;\r\n        },\r\n\r\n        asyncFunction: function (callback, timeout, self) {\r\n            var args = Array.prototype.slice.call(arguments, 3);\r\n            return setTimeout(function () {\r\n                callback.apply(self || window, args);\r\n            }, timeout);\r\n        },\r\n\r\n        setAllSelectedText: function (allSelectedText) {\r\n            this.options.allSelectedText = allSelectedText;\r\n            this.updateButtonText();\r\n        },\r\n\r\n        isFirefox: function () {\r\n            var firefoxIdentifier = 'firefox';\r\n            var valueNotFoundIndex = -1;\r\n\r\n            if (navigator && navigator.userAgent) {\r\n                return navigator.userAgent.toLocaleLowerCase().indexOf(firefoxIdentifier) > valueNotFoundIndex;\r\n            }\r\n\r\n            return false;\r\n        }\r\n    };\r\n\r\n    $.fn.multiselect = function (option, parameter, extraOptions) {\r\n        return this.each(function () {\r\n            var data = $(this).data('multiselect');\r\n            var options = typeof option === 'object' && option;\r\n\r\n            // Initialize the multiselect.\r\n            if (!data) {\r\n                data = new Multiselect(this, options);\r\n                $(this).data('multiselect', data);\r\n            }\r\n\r\n            // Call multiselect method.\r\n            if (typeof option === 'string') {\r\n                data[option](parameter, extraOptions);\r\n\r\n                if (option === 'destroy') {\r\n                    $(this).data('multiselect', false);\r\n                }\r\n            }\r\n        });\r\n    };\r\n\r\n    $.fn.multiselect.Constructor = Multiselect;\r\n\r\n    $(function () {\r\n        $(\"select[data-role=multiselect]\").multiselect();\r\n    });\r\n\r\n});\r\n","/*! Select2 4.1.0-rc.0 | https://github.com/select2/select2/blob/master/LICENSE.md */\n!function(n){\"function\"==typeof define&&define.amd?define([\"jquery\"],n):\"object\"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t=\"undefined\"!=typeof window?require(\"jquery\"):require(\"jquery\")(e)),n(t),t}:n(jQuery)}(function(t){var e,n,s,p,r,o,h,f,g,m,y,v,i,a,_,s=((u=t&&t.fn&&t.fn.select2&&t.fn.select2.amd?t.fn.select2.amd:u)&&u.requirejs||(u?n=u:u={},g={},m={},y={},v={},i=Object.prototype.hasOwnProperty,a=[].slice,_=/\\.js$/,h=function(e,t){var n,s,i=c(e),r=i[0],t=t[1];return e=i[1],r&&(n=x(r=l(r,t))),r?e=n&&n.normalize?n.normalize(e,(s=t,function(e){return l(e,s)})):l(e,t):(r=(i=c(e=l(e,t)))[0],e=i[1],r&&(n=x(r))),{f:r?r+\"!\"+e:e,n:e,pr:r,p:n}},f={require:function(e){return w(e)},exports:function(e){var t=g[e];return void 0!==t?t:g[e]={}},module:function(e){return{id:e,uri:\"\",exports:g[e],config:(t=e,function(){return y&&y.config&&y.config[t]||{}})};var t}},r=function(e,t,n,s){var i,r,o,a,l,c=[],u=typeof n,d=A(s=s||e);if(\"undefined\"==u||\"function\"==u){for(t=!t.length&&n.length?[\"require\",\"exports\",\"module\"]:t,a=0;a<t.length;a+=1)if(\"require\"===(r=(o=h(t[a],d)).f))c[a]=f.require(e);else if(\"exports\"===r)c[a]=f.exports(e),l=!0;else if(\"module\"===r)i=c[a]=f.module(e);else if(b(g,r)||b(m,r)||b(v,r))c[a]=x(r);else{if(!o.p)throw new Error(e+\" missing \"+r);o.p.load(o.n,w(s,!0),function(t){return function(e){g[t]=e}}(r),{}),c[a]=g[r]}u=n?n.apply(g[e],c):void 0,e&&(i&&i.exports!==p&&i.exports!==g[e]?g[e]=i.exports:u===p&&l||(g[e]=u))}else e&&(g[e]=n)},e=n=o=function(e,t,n,s,i){if(\"string\"==typeof e)return f[e]?f[e](t):x(h(e,A(t)).f);if(!e.splice){if((y=e).deps&&o(y.deps,y.callback),!t)return;t.splice?(e=t,t=n,n=null):e=p}return t=t||function(){},\"function\"==typeof n&&(n=s,s=i),s?r(p,e,t,n):setTimeout(function(){r(p,e,t,n)},4),o},o.config=function(e){return o(e)},e._defined=g,(s=function(e,t,n){if(\"string\"!=typeof e)throw new Error(\"See almond README: incorrect module build, no module name\");t.splice||(n=t,t=[]),b(g,e)||b(m,e)||(m[e]=[e,t,n])}).amd={jQuery:!0},u.requirejs=e,u.require=n,u.define=s),u.define(\"almond\",function(){}),u.define(\"jquery\",[],function(){var e=t||$;return null==e&&console&&console.error&&console.error(\"Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page.\"),e}),u.define(\"select2/utils\",[\"jquery\"],function(r){var s={};function c(e){var t,n=e.prototype,s=[];for(t in n)\"function\"==typeof n[t]&&\"constructor\"!==t&&s.push(t);return s}s.Extend=function(e,t){var n,s={}.hasOwnProperty;function i(){this.constructor=e}for(n in t)s.call(t,n)&&(e[n]=t[n]);return i.prototype=t.prototype,e.prototype=new i,e.__super__=t.prototype,e},s.Decorate=function(s,i){var e=c(i),t=c(s);function r(){var e=Array.prototype.unshift,t=i.prototype.constructor.length,n=s.prototype.constructor;0<t&&(e.call(arguments,s.prototype.constructor),n=i.prototype.constructor),n.apply(this,arguments)}i.displayName=s.displayName,r.prototype=new function(){this.constructor=r};for(var n=0;n<t.length;n++){var o=t[n];r.prototype[o]=s.prototype[o]}for(var a=0;a<e.length;a++){var l=e[a];r.prototype[l]=function(e){var t=function(){};e in r.prototype&&(t=r.prototype[e]);var n=i.prototype[e];return function(){return Array.prototype.unshift.call(arguments,t),n.apply(this,arguments)}}(l)}return r};function e(){this.listeners={}}e.prototype.on=function(e,t){this.listeners=this.listeners||{},e in this.listeners?this.listeners[e].push(t):this.listeners[e]=[t]},e.prototype.trigger=function(e){var t=Array.prototype.slice,n=t.call(arguments,1);this.listeners=this.listeners||{},0===(n=null==n?[]:n).length&&n.push({}),(n[0]._type=e)in this.listeners&&this.invoke(this.listeners[e],t.call(arguments,1)),\"*\"in this.listeners&&this.invoke(this.listeners[\"*\"],arguments)},e.prototype.invoke=function(e,t){for(var n=0,s=e.length;n<s;n++)e[n].apply(this,t)},s.Observable=e,s.generateChars=function(e){for(var t=\"\",n=0;n<e;n++)t+=Math.floor(36*Math.random()).toString(36);return t},s.bind=function(e,t){return function(){e.apply(t,arguments)}},s._convertData=function(e){for(var t in e){var n=t.split(\"-\"),s=e;if(1!==n.length){for(var i=0;i<n.length;i++){var r=n[i];(r=r.substring(0,1).toLowerCase()+r.substring(1))in s||(s[r]={}),i==n.length-1&&(s[r]=e[t]),s=s[r]}delete e[t]}}return e},s.hasScroll=function(e,t){var n=r(t),s=t.style.overflowX,i=t.style.overflowY;return(s!==i||\"hidden\"!==i&&\"visible\"!==i)&&(\"scroll\"===s||\"scroll\"===i||(n.innerHeight()<t.scrollHeight||n.innerWidth()<t.scrollWidth))},s.escapeMarkup=function(e){var t={\"\\\\\":\"&#92;\",\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\",\"/\":\"&#47;\"};return\"string\"!=typeof e?e:String(e).replace(/[&<>\"'\\/\\\\]/g,function(e){return t[e]})},s.__cache={};var n=0;return s.GetUniqueElementId=function(e){var t=e.getAttribute(\"data-select2-id\");return null!=t||(t=e.id?\"select2-data-\"+e.id:\"select2-data-\"+(++n).toString()+\"-\"+s.generateChars(4),e.setAttribute(\"data-select2-id\",t)),t},s.StoreData=function(e,t,n){e=s.GetUniqueElementId(e);s.__cache[e]||(s.__cache[e]={}),s.__cache[e][t]=n},s.GetData=function(e,t){var n=s.GetUniqueElementId(e);return t?s.__cache[n]&&null!=s.__cache[n][t]?s.__cache[n][t]:r(e).data(t):s.__cache[n]},s.RemoveData=function(e){var t=s.GetUniqueElementId(e);null!=s.__cache[t]&&delete s.__cache[t],e.removeAttribute(\"data-select2-id\")},s.copyNonInternalCssClasses=function(e,t){var n=(n=e.getAttribute(\"class\").trim().split(/\\s+/)).filter(function(e){return 0===e.indexOf(\"select2-\")}),t=(t=t.getAttribute(\"class\").trim().split(/\\s+/)).filter(function(e){return 0!==e.indexOf(\"select2-\")}),t=n.concat(t);e.setAttribute(\"class\",t.join(\" \"))},s}),u.define(\"select2/results\",[\"jquery\",\"./utils\"],function(d,p){function s(e,t,n){this.$element=e,this.data=n,this.options=t,s.__super__.constructor.call(this)}return p.Extend(s,p.Observable),s.prototype.render=function(){var e=d('<ul class=\"select2-results__options\" role=\"listbox\"></ul>');return this.options.get(\"multiple\")&&e.attr(\"aria-multiselectable\",\"true\"),this.$results=e},s.prototype.clear=function(){this.$results.empty()},s.prototype.displayMessage=function(e){var t=this.options.get(\"escapeMarkup\");this.clear(),this.hideLoading();var n=d('<li role=\"alert\" aria-live=\"assertive\" class=\"select2-results__option\"></li>'),s=this.options.get(\"translations\").get(e.message);n.append(t(s(e.args))),n[0].className+=\" select2-results__message\",this.$results.append(n)},s.prototype.hideMessages=function(){this.$results.find(\".select2-results__message\").remove()},s.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n<e.results.length;n++){var s=e.results[n],s=this.option(s);t.push(s)}this.$results.append(t)}else 0===this.$results.children().length&&this.trigger(\"results:message\",{message:\"noResults\"})},s.prototype.position=function(e,t){t.find(\".select2-results\").append(e)},s.prototype.sort=function(e){return this.options.get(\"sorter\")(e)},s.prototype.highlightFirstItem=function(){var e=this.$results.find(\".select2-results__option--selectable\"),t=e.filter(\".select2-results__option--selected\");(0<t.length?t:e).first().trigger(\"mouseenter\"),this.ensureHighlightVisible()},s.prototype.setClasses=function(){var t=this;this.data.current(function(e){var s=e.map(function(e){return e.id.toString()});t.$results.find(\".select2-results__option--selectable\").each(function(){var e=d(this),t=p.GetData(this,\"data\"),n=\"\"+t.id;null!=t.element&&t.element.selected||null==t.element&&-1<s.indexOf(n)?(this.classList.add(\"select2-results__option--selected\"),e.attr(\"aria-selected\",\"true\")):(this.classList.remove(\"select2-results__option--selected\"),e.attr(\"aria-selected\",\"false\"))})})},s.prototype.showLoading=function(e){this.hideLoading();e={disabled:!0,loading:!0,text:this.options.get(\"translations\").get(\"searching\")(e)},e=this.option(e);e.className+=\" loading-results\",this.$results.prepend(e)},s.prototype.hideLoading=function(){this.$results.find(\".loading-results\").remove()},s.prototype.option=function(e){var t=document.createElement(\"li\");t.classList.add(\"select2-results__option\"),t.classList.add(\"select2-results__option--selectable\");var n,s={role:\"option\"},i=window.Element.prototype.matches||window.Element.prototype.msMatchesSelector||window.Element.prototype.webkitMatchesSelector;for(n in(null!=e.element&&i.call(e.element,\":disabled\")||null==e.element&&e.disabled)&&(s[\"aria-disabled\"]=\"true\",t.classList.remove(\"select2-results__option--selectable\"),t.classList.add(\"select2-results__option--disabled\")),null==e.id&&t.classList.remove(\"select2-results__option--selectable\"),null!=e._resultId&&(t.id=e._resultId),e.title&&(t.title=e.title),e.children&&(s.role=\"group\",s[\"aria-label\"]=e.text,t.classList.remove(\"select2-results__option--selectable\"),t.classList.add(\"select2-results__option--group\")),s){var r=s[n];t.setAttribute(n,r)}if(e.children){var o=d(t),a=document.createElement(\"strong\");a.className=\"select2-results__group\",this.template(e,a);for(var l=[],c=0;c<e.children.length;c++){var u=e.children[c],u=this.option(u);l.push(u)}i=d(\"<ul></ul>\",{class:\"select2-results__options select2-results__options--nested\",role:\"none\"});i.append(l),o.append(a),o.append(i)}else this.template(e,t);return p.StoreData(t,\"data\",e),t},s.prototype.bind=function(t,e){var i=this,n=t.id+\"-results\";this.$results.attr(\"id\",n),t.on(\"results:all\",function(e){i.clear(),i.append(e.data),t.isOpen()&&(i.setClasses(),i.highlightFirstItem())}),t.on(\"results:append\",function(e){i.append(e.data),t.isOpen()&&i.setClasses()}),t.on(\"query\",function(e){i.hideMessages(),i.showLoading(e)}),t.on(\"select\",function(){t.isOpen()&&(i.setClasses(),i.options.get(\"scrollAfterSelect\")&&i.highlightFirstItem())}),t.on(\"unselect\",function(){t.isOpen()&&(i.setClasses(),i.options.get(\"scrollAfterSelect\")&&i.highlightFirstItem())}),t.on(\"open\",function(){i.$results.attr(\"aria-expanded\",\"true\"),i.$results.attr(\"aria-hidden\",\"false\"),i.setClasses(),i.ensureHighlightVisible()}),t.on(\"close\",function(){i.$results.attr(\"aria-expanded\",\"false\"),i.$results.attr(\"aria-hidden\",\"true\"),i.$results.removeAttr(\"aria-activedescendant\")}),t.on(\"results:toggle\",function(){var e=i.getHighlightedResults();0!==e.length&&e.trigger(\"mouseup\")}),t.on(\"results:select\",function(){var e,t=i.getHighlightedResults();0!==t.length&&(e=p.GetData(t[0],\"data\"),t.hasClass(\"select2-results__option--selected\")?i.trigger(\"close\",{}):i.trigger(\"select\",{data:e}))}),t.on(\"results:previous\",function(){var e,t=i.getHighlightedResults(),n=i.$results.find(\".select2-results__option--selectable\"),s=n.index(t);s<=0||(e=s-1,0===t.length&&(e=0),(s=n.eq(e)).trigger(\"mouseenter\"),t=i.$results.offset().top,n=s.offset().top,s=i.$results.scrollTop()+(n-t),0===e?i.$results.scrollTop(0):n-t<0&&i.$results.scrollTop(s))}),t.on(\"results:next\",function(){var e,t=i.getHighlightedResults(),n=i.$results.find(\".select2-results__option--selectable\"),s=n.index(t)+1;s>=n.length||((e=n.eq(s)).trigger(\"mouseenter\"),t=i.$results.offset().top+i.$results.outerHeight(!1),n=e.offset().top+e.outerHeight(!1),e=i.$results.scrollTop()+n-t,0===s?i.$results.scrollTop(0):t<n&&i.$results.scrollTop(e))}),t.on(\"results:focus\",function(e){e.element[0].classList.add(\"select2-results__option--highlighted\"),e.element[0].setAttribute(\"aria-selected\",\"true\")}),t.on(\"results:message\",function(e){i.displayMessage(e)}),d.fn.mousewheel&&this.$results.on(\"mousewheel\",function(e){var t=i.$results.scrollTop(),n=i.$results.get(0).scrollHeight-t+e.deltaY,t=0<e.deltaY&&t-e.deltaY<=0,n=e.deltaY<0&&n<=i.$results.height();t?(i.$results.scrollTop(0),e.preventDefault(),e.stopPropagation()):n&&(i.$results.scrollTop(i.$results.get(0).scrollHeight-i.$results.height()),e.preventDefault(),e.stopPropagation())}),this.$results.on(\"mouseup\",\".select2-results__option--selectable\",function(e){var t=d(this),n=p.GetData(this,\"data\");t.hasClass(\"select2-results__option--selected\")?i.options.get(\"multiple\")?i.trigger(\"unselect\",{originalEvent:e,data:n}):i.trigger(\"close\",{}):i.trigger(\"select\",{originalEvent:e,data:n})}),this.$results.on(\"mouseenter\",\".select2-results__option--selectable\",function(e){var t=p.GetData(this,\"data\");i.getHighlightedResults().removeClass(\"select2-results__option--highlighted\").attr(\"aria-selected\",\"false\"),i.trigger(\"results:focus\",{data:t,element:d(this)})})},s.prototype.getHighlightedResults=function(){return this.$results.find(\".select2-results__option--highlighted\")},s.prototype.destroy=function(){this.$results.remove()},s.prototype.ensureHighlightVisible=function(){var e,t,n,s,i=this.getHighlightedResults();0!==i.length&&(e=this.$results.find(\".select2-results__option--selectable\").index(i),s=this.$results.offset().top,t=i.offset().top,n=this.$results.scrollTop()+(t-s),s=t-s,n-=2*i.outerHeight(!1),e<=2?this.$results.scrollTop(0):(s>this.$results.outerHeight()||s<0)&&this.$results.scrollTop(n))},s.prototype.template=function(e,t){var n=this.options.get(\"templateResult\"),s=this.options.get(\"escapeMarkup\"),e=n(e,t);null==e?t.style.display=\"none\":\"string\"==typeof e?t.innerHTML=s(e):d(t).append(e)},s}),u.define(\"select2/keys\",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),u.define(\"select2/selection/base\",[\"jquery\",\"../utils\",\"../keys\"],function(n,s,i){function r(e,t){this.$element=e,this.options=t,r.__super__.constructor.call(this)}return s.Extend(r,s.Observable),r.prototype.render=function(){var e=n('<span class=\"select2-selection\" role=\"combobox\"  aria-haspopup=\"true\" aria-expanded=\"false\"></span>');return this._tabindex=0,null!=s.GetData(this.$element[0],\"old-tabindex\")?this._tabindex=s.GetData(this.$element[0],\"old-tabindex\"):null!=this.$element.attr(\"tabindex\")&&(this._tabindex=this.$element.attr(\"tabindex\")),e.attr(\"title\",this.$element.attr(\"title\")),e.attr(\"tabindex\",this._tabindex),e.attr(\"aria-disabled\",\"false\"),this.$selection=e},r.prototype.bind=function(e,t){var n=this,s=e.id+\"-results\";this.container=e,this.$selection.on(\"focus\",function(e){n.trigger(\"focus\",e)}),this.$selection.on(\"blur\",function(e){n._handleBlur(e)}),this.$selection.on(\"keydown\",function(e){n.trigger(\"keypress\",e),e.which===i.SPACE&&e.preventDefault()}),e.on(\"results:focus\",function(e){n.$selection.attr(\"aria-activedescendant\",e.data._resultId)}),e.on(\"selection:update\",function(e){n.update(e.data)}),e.on(\"open\",function(){n.$selection.attr(\"aria-expanded\",\"true\"),n.$selection.attr(\"aria-owns\",s),n._attachCloseHandler(e)}),e.on(\"close\",function(){n.$selection.attr(\"aria-expanded\",\"false\"),n.$selection.removeAttr(\"aria-activedescendant\"),n.$selection.removeAttr(\"aria-owns\"),n.$selection.trigger(\"focus\"),n._detachCloseHandler(e)}),e.on(\"enable\",function(){n.$selection.attr(\"tabindex\",n._tabindex),n.$selection.attr(\"aria-disabled\",\"false\")}),e.on(\"disable\",function(){n.$selection.attr(\"tabindex\",\"-1\"),n.$selection.attr(\"aria-disabled\",\"true\")})},r.prototype._handleBlur=function(e){var t=this;window.setTimeout(function(){document.activeElement==t.$selection[0]||n.contains(t.$selection[0],document.activeElement)||t.trigger(\"blur\",e)},1)},r.prototype._attachCloseHandler=function(e){n(document.body).on(\"mousedown.select2.\"+e.id,function(e){var t=n(e.target).closest(\".select2\");n(\".select2.select2-container--open\").each(function(){this!=t[0]&&s.GetData(this,\"element\").select2(\"close\")})})},r.prototype._detachCloseHandler=function(e){n(document.body).off(\"mousedown.select2.\"+e.id)},r.prototype.position=function(e,t){t.find(\".selection\").append(e)},r.prototype.destroy=function(){this._detachCloseHandler(this.container)},r.prototype.update=function(e){throw new Error(\"The `update` method must be defined in child classes.\")},r.prototype.isEnabled=function(){return!this.isDisabled()},r.prototype.isDisabled=function(){return this.options.get(\"disabled\")},r}),u.define(\"select2/selection/single\",[\"jquery\",\"./base\",\"../utils\",\"../keys\"],function(e,t,n,s){function i(){i.__super__.constructor.apply(this,arguments)}return n.Extend(i,t),i.prototype.render=function(){var e=i.__super__.render.call(this);return e[0].classList.add(\"select2-selection--single\"),e.html('<span class=\"select2-selection__rendered\"></span><span class=\"select2-selection__arrow\" role=\"presentation\"><b role=\"presentation\"></b></span>'),e},i.prototype.bind=function(t,e){var n=this;i.__super__.bind.apply(this,arguments);var s=t.id+\"-container\";this.$selection.find(\".select2-selection__rendered\").attr(\"id\",s).attr(\"role\",\"textbox\").attr(\"aria-readonly\",\"true\"),this.$selection.attr(\"aria-labelledby\",s),this.$selection.attr(\"aria-controls\",s),this.$selection.on(\"mousedown\",function(e){1===e.which&&n.trigger(\"toggle\",{originalEvent:e})}),this.$selection.on(\"focus\",function(e){}),this.$selection.on(\"blur\",function(e){}),t.on(\"focus\",function(e){t.isOpen()||n.$selection.trigger(\"focus\")})},i.prototype.clear=function(){var e=this.$selection.find(\".select2-selection__rendered\");e.empty(),e.removeAttr(\"title\")},i.prototype.display=function(e,t){var n=this.options.get(\"templateSelection\");return this.options.get(\"escapeMarkup\")(n(e,t))},i.prototype.selectionContainer=function(){return e(\"<span></span>\")},i.prototype.update=function(e){var t,n;0!==e.length?(n=e[0],t=this.$selection.find(\".select2-selection__rendered\"),e=this.display(n,t),t.empty().append(e),(n=n.title||n.text)?t.attr(\"title\",n):t.removeAttr(\"title\")):this.clear()},i}),u.define(\"select2/selection/multiple\",[\"jquery\",\"./base\",\"../utils\"],function(i,e,c){function r(e,t){r.__super__.constructor.apply(this,arguments)}return c.Extend(r,e),r.prototype.render=function(){var e=r.__super__.render.call(this);return e[0].classList.add(\"select2-selection--multiple\"),e.html('<ul class=\"select2-selection__rendered\"></ul>'),e},r.prototype.bind=function(e,t){var n=this;r.__super__.bind.apply(this,arguments);var s=e.id+\"-container\";this.$selection.find(\".select2-selection__rendered\").attr(\"id\",s),this.$selection.on(\"click\",function(e){n.trigger(\"toggle\",{originalEvent:e})}),this.$selection.on(\"click\",\".select2-selection__choice__remove\",function(e){var t;n.isDisabled()||(t=i(this).parent(),t=c.GetData(t[0],\"data\"),n.trigger(\"unselect\",{originalEvent:e,data:t}))}),this.$selection.on(\"keydown\",\".select2-selection__choice__remove\",function(e){n.isDisabled()||e.stopPropagation()})},r.prototype.clear=function(){var e=this.$selection.find(\".select2-selection__rendered\");e.empty(),e.removeAttr(\"title\")},r.prototype.display=function(e,t){var n=this.options.get(\"templateSelection\");return this.options.get(\"escapeMarkup\")(n(e,t))},r.prototype.selectionContainer=function(){return i('<li class=\"select2-selection__choice\"><button type=\"button\" class=\"select2-selection__choice__remove\" tabindex=\"-1\"><span aria-hidden=\"true\">&times;</span></button><span class=\"select2-selection__choice__display\"></span></li>')},r.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],n=this.$selection.find(\".select2-selection__rendered\").attr(\"id\")+\"-choice-\",s=0;s<e.length;s++){var i=e[s],r=this.selectionContainer(),o=this.display(i,r),a=n+c.generateChars(4)+\"-\";i.id?a+=i.id:a+=c.generateChars(4),r.find(\".select2-selection__choice__display\").append(o).attr(\"id\",a);var l=i.title||i.text;l&&r.attr(\"title\",l);o=this.options.get(\"translations\").get(\"removeItem\"),l=r.find(\".select2-selection__choice__remove\");l.attr(\"title\",o()),l.attr(\"aria-label\",o()),l.attr(\"aria-describedby\",a),c.StoreData(r[0],\"data\",i),t.push(r)}this.$selection.find(\".select2-selection__rendered\").append(t)}},r}),u.define(\"select2/selection/placeholder\",[],function(){function e(e,t,n){this.placeholder=this.normalizePlaceholder(n.get(\"placeholder\")),e.call(this,t,n)}return e.prototype.normalizePlaceholder=function(e,t){return t=\"string\"==typeof t?{id:\"\",text:t}:t},e.prototype.createPlaceholder=function(e,t){var n=this.selectionContainer();n.html(this.display(t)),n[0].classList.add(\"select2-selection__placeholder\"),n[0].classList.remove(\"select2-selection__choice\");t=t.title||t.text||n.text();return this.$selection.find(\".select2-selection__rendered\").attr(\"title\",t),n},e.prototype.update=function(e,t){var n=1==t.length&&t[0].id!=this.placeholder.id;if(1<t.length||n)return e.call(this,t);this.clear();t=this.createPlaceholder(this.placeholder);this.$selection.find(\".select2-selection__rendered\").append(t)},e}),u.define(\"select2/selection/allowClear\",[\"jquery\",\"../keys\",\"../utils\"],function(i,s,a){function e(){}return e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),null==this.placeholder&&this.options.get(\"debug\")&&window.console&&console.error&&console.error(\"Select2: The `allowClear` option should be used in combination with the `placeholder` option.\"),this.$selection.on(\"mousedown\",\".select2-selection__clear\",function(e){s._handleClear(e)}),t.on(\"keypress\",function(e){s._handleKeyboardClear(e,t)})},e.prototype._handleClear=function(e,t){if(!this.isDisabled()){var n=this.$selection.find(\".select2-selection__clear\");if(0!==n.length){t.stopPropagation();var s=a.GetData(n[0],\"data\"),i=this.$element.val();this.$element.val(this.placeholder.id);var r={data:s};if(this.trigger(\"clear\",r),r.prevented)this.$element.val(i);else{for(var o=0;o<s.length;o++)if(r={data:s[o]},this.trigger(\"unselect\",r),r.prevented)return void this.$element.val(i);this.$element.trigger(\"input\").trigger(\"change\"),this.trigger(\"toggle\",{})}}}},e.prototype._handleKeyboardClear=function(e,t,n){n.isOpen()||t.which!=s.DELETE&&t.which!=s.BACKSPACE||this._handleClear(t)},e.prototype.update=function(e,t){var n,s;e.call(this,t),this.$selection.find(\".select2-selection__clear\").remove(),this.$selection[0].classList.remove(\"select2-selection--clearable\"),0<this.$selection.find(\".select2-selection__placeholder\").length||0===t.length||(n=this.$selection.find(\".select2-selection__rendered\").attr(\"id\"),s=this.options.get(\"translations\").get(\"removeAllItems\"),(e=i('<button type=\"button\" class=\"select2-selection__clear\" tabindex=\"-1\"><span aria-hidden=\"true\">&times;</span></button>')).attr(\"title\",s()),e.attr(\"aria-label\",s()),e.attr(\"aria-describedby\",n),a.StoreData(e[0],\"data\",t),this.$selection.prepend(e),this.$selection[0].classList.add(\"select2-selection--clearable\"))},e}),u.define(\"select2/selection/search\",[\"jquery\",\"../utils\",\"../keys\"],function(s,a,l){function e(e,t,n){e.call(this,t,n)}return e.prototype.render=function(e){var t=this.options.get(\"translations\").get(\"search\"),n=s('<span class=\"select2-search select2-search--inline\"><textarea class=\"select2-search__field\" type=\"search\" tabindex=\"-1\" autocorrect=\"off\" autocapitalize=\"none\" spellcheck=\"false\" role=\"searchbox\" aria-autocomplete=\"list\" ></textarea></span>');this.$searchContainer=n,this.$search=n.find(\"textarea\"),this.$search.prop(\"autocomplete\",this.options.get(\"autocomplete\")),this.$search.attr(\"aria-label\",t());e=e.call(this);return this._transferTabIndex(),e.append(this.$searchContainer),e},e.prototype.bind=function(e,t,n){var s=this,i=t.id+\"-results\",r=t.id+\"-container\";e.call(this,t,n),s.$search.attr(\"aria-describedby\",r),t.on(\"open\",function(){s.$search.attr(\"aria-controls\",i),s.$search.trigger(\"focus\")}),t.on(\"close\",function(){s.$search.val(\"\"),s.resizeSearch(),s.$search.removeAttr(\"aria-controls\"),s.$search.removeAttr(\"aria-activedescendant\"),s.$search.trigger(\"focus\")}),t.on(\"enable\",function(){s.$search.prop(\"disabled\",!1),s._transferTabIndex()}),t.on(\"disable\",function(){s.$search.prop(\"disabled\",!0)}),t.on(\"focus\",function(e){s.$search.trigger(\"focus\")}),t.on(\"results:focus\",function(e){e.data._resultId?s.$search.attr(\"aria-activedescendant\",e.data._resultId):s.$search.removeAttr(\"aria-activedescendant\")}),this.$selection.on(\"focusin\",\".select2-search--inline\",function(e){s.trigger(\"focus\",e)}),this.$selection.on(\"focusout\",\".select2-search--inline\",function(e){s._handleBlur(e)}),this.$selection.on(\"keydown\",\".select2-search--inline\",function(e){var t;e.stopPropagation(),s.trigger(\"keypress\",e),s._keyUpPrevented=e.isDefaultPrevented(),e.which!==l.BACKSPACE||\"\"!==s.$search.val()||0<(t=s.$selection.find(\".select2-selection__choice\").last()).length&&(t=a.GetData(t[0],\"data\"),s.searchRemoveChoice(t),e.preventDefault())}),this.$selection.on(\"click\",\".select2-search--inline\",function(e){s.$search.val()&&e.stopPropagation()});var t=document.documentMode,o=t&&t<=11;this.$selection.on(\"input.searchcheck\",\".select2-search--inline\",function(e){o?s.$selection.off(\"input.search input.searchcheck\"):s.$selection.off(\"keyup.search\")}),this.$selection.on(\"keyup.search input.search\",\".select2-search--inline\",function(e){var t;o&&\"input\"===e.type?s.$selection.off(\"input.search input.searchcheck\"):(t=e.which)!=l.SHIFT&&t!=l.CTRL&&t!=l.ALT&&t!=l.TAB&&s.handleSearch(e)})},e.prototype._transferTabIndex=function(e){this.$search.attr(\"tabindex\",this.$selection.attr(\"tabindex\")),this.$selection.attr(\"tabindex\",\"-1\")},e.prototype.createPlaceholder=function(e,t){this.$search.attr(\"placeholder\",t.text)},e.prototype.update=function(e,t){var n=this.$search[0]==document.activeElement;this.$search.attr(\"placeholder\",\"\"),e.call(this,t),this.resizeSearch(),n&&this.$search.trigger(\"focus\")},e.prototype.handleSearch=function(){var e;this.resizeSearch(),this._keyUpPrevented||(e=this.$search.val(),this.trigger(\"query\",{term:e})),this._keyUpPrevented=!1},e.prototype.searchRemoveChoice=function(e,t){this.trigger(\"unselect\",{data:t}),this.$search.val(t.text),this.handleSearch()},e.prototype.resizeSearch=function(){this.$search.css(\"width\",\"25px\");var e=\"100%\";\"\"===this.$search.attr(\"placeholder\")&&(e=.75*(this.$search.val().length+1)+\"em\"),this.$search.css(\"width\",e)},e}),u.define(\"select2/selection/selectionCss\",[\"../utils\"],function(n){function e(){}return e.prototype.render=function(e){var t=e.call(this),e=this.options.get(\"selectionCssClass\")||\"\";return-1!==e.indexOf(\":all:\")&&(e=e.replace(\":all:\",\"\"),n.copyNonInternalCssClasses(t[0],this.$element[0])),t.addClass(e),t},e}),u.define(\"select2/selection/eventRelay\",[\"jquery\"],function(o){function e(){}return e.prototype.bind=function(e,t,n){var s=this,i=[\"open\",\"opening\",\"close\",\"closing\",\"select\",\"selecting\",\"unselect\",\"unselecting\",\"clear\",\"clearing\"],r=[\"opening\",\"closing\",\"selecting\",\"unselecting\",\"clearing\"];e.call(this,t,n),t.on(\"*\",function(e,t){var n;-1!==i.indexOf(e)&&(t=t||{},n=o.Event(\"select2:\"+e,{params:t}),s.$element.trigger(n),-1!==r.indexOf(e)&&(t.prevented=n.isDefaultPrevented()))})},e}),u.define(\"select2/translation\",[\"jquery\",\"require\"],function(t,n){function s(e){this.dict=e||{}}return s.prototype.all=function(){return this.dict},s.prototype.get=function(e){return this.dict[e]},s.prototype.extend=function(e){this.dict=t.extend({},e.all(),this.dict)},s._cache={},s.loadPath=function(e){var t;return e in s._cache||(t=n(e),s._cache[e]=t),new s(s._cache[e])},s}),u.define(\"select2/diacritics\",[],function(){return{\"Ⓐ\":\"A\",\"Ａ\":\"A\",\"À\":\"A\",\"Á\":\"A\",\"Â\":\"A\",\"Ầ\":\"A\",\"Ấ\":\"A\",\"Ẫ\":\"A\",\"Ẩ\":\"A\",\"Ã\":\"A\",\"Ā\":\"A\",\"Ă\":\"A\",\"Ằ\":\"A\",\"Ắ\":\"A\",\"Ẵ\":\"A\",\"Ẳ\":\"A\",\"Ȧ\":\"A\",\"Ǡ\":\"A\",\"Ä\":\"A\",\"Ǟ\":\"A\",\"Ả\":\"A\",\"Å\":\"A\",\"Ǻ\":\"A\",\"Ǎ\":\"A\",\"Ȁ\":\"A\",\"Ȃ\":\"A\",\"Ạ\":\"A\",\"Ậ\":\"A\",\"Ặ\":\"A\",\"Ḁ\":\"A\",\"Ą\":\"A\",\"Ⱥ\":\"A\",\"Ɐ\":\"A\",\"Ꜳ\":\"AA\",\"Æ\":\"AE\",\"Ǽ\":\"AE\",\"Ǣ\":\"AE\",\"Ꜵ\":\"AO\",\"Ꜷ\":\"AU\",\"Ꜹ\":\"AV\",\"Ꜻ\":\"AV\",\"Ꜽ\":\"AY\",\"Ⓑ\":\"B\",\"Ｂ\":\"B\",\"Ḃ\":\"B\",\"Ḅ\":\"B\",\"Ḇ\":\"B\",\"Ƀ\":\"B\",\"Ƃ\":\"B\",\"Ɓ\":\"B\",\"Ⓒ\":\"C\",\"Ｃ\":\"C\",\"Ć\":\"C\",\"Ĉ\":\"C\",\"Ċ\":\"C\",\"Č\":\"C\",\"Ç\":\"C\",\"Ḉ\":\"C\",\"Ƈ\":\"C\",\"Ȼ\":\"C\",\"Ꜿ\":\"C\",\"Ⓓ\":\"D\",\"Ｄ\":\"D\",\"Ḋ\":\"D\",\"Ď\":\"D\",\"Ḍ\":\"D\",\"Ḑ\":\"D\",\"Ḓ\":\"D\",\"Ḏ\":\"D\",\"Đ\":\"D\",\"Ƌ\":\"D\",\"Ɗ\":\"D\",\"Ɖ\":\"D\",\"Ꝺ\":\"D\",\"Ǳ\":\"DZ\",\"Ǆ\":\"DZ\",\"ǲ\":\"Dz\",\"ǅ\":\"Dz\",\"Ⓔ\":\"E\",\"Ｅ\":\"E\",\"È\":\"E\",\"É\":\"E\",\"Ê\":\"E\",\"Ề\":\"E\",\"Ế\":\"E\",\"Ễ\":\"E\",\"Ể\":\"E\",\"Ẽ\":\"E\",\"Ē\":\"E\",\"Ḕ\":\"E\",\"Ḗ\":\"E\",\"Ĕ\":\"E\",\"Ė\":\"E\",\"Ë\":\"E\",\"Ẻ\":\"E\",\"Ě\":\"E\",\"Ȅ\":\"E\",\"Ȇ\":\"E\",\"Ẹ\":\"E\",\"Ệ\":\"E\",\"Ȩ\":\"E\",\"Ḝ\":\"E\",\"Ę\":\"E\",\"Ḙ\":\"E\",\"Ḛ\":\"E\",\"Ɛ\":\"E\",\"Ǝ\":\"E\",\"Ⓕ\":\"F\",\"Ｆ\":\"F\",\"Ḟ\":\"F\",\"Ƒ\":\"F\",\"Ꝼ\":\"F\",\"Ⓖ\":\"G\",\"Ｇ\":\"G\",\"Ǵ\":\"G\",\"Ĝ\":\"G\",\"Ḡ\":\"G\",\"Ğ\":\"G\",\"Ġ\":\"G\",\"Ǧ\":\"G\",\"Ģ\":\"G\",\"Ǥ\":\"G\",\"Ɠ\":\"G\",\"Ꞡ\":\"G\",\"Ᵹ\":\"G\",\"Ꝿ\":\"G\",\"Ⓗ\":\"H\",\"Ｈ\":\"H\",\"Ĥ\":\"H\",\"Ḣ\":\"H\",\"Ḧ\":\"H\",\"Ȟ\":\"H\",\"Ḥ\":\"H\",\"Ḩ\":\"H\",\"Ḫ\":\"H\",\"Ħ\":\"H\",\"Ⱨ\":\"H\",\"Ⱶ\":\"H\",\"Ɥ\":\"H\",\"Ⓘ\":\"I\",\"Ｉ\":\"I\",\"Ì\":\"I\",\"Í\":\"I\",\"Î\":\"I\",\"Ĩ\":\"I\",\"Ī\":\"I\",\"Ĭ\":\"I\",\"İ\":\"I\",\"Ï\":\"I\",\"Ḯ\":\"I\",\"Ỉ\":\"I\",\"Ǐ\":\"I\",\"Ȉ\":\"I\",\"Ȋ\":\"I\",\"Ị\":\"I\",\"Į\":\"I\",\"Ḭ\":\"I\",\"Ɨ\":\"I\",\"Ⓙ\":\"J\",\"Ｊ\":\"J\",\"Ĵ\":\"J\",\"Ɉ\":\"J\",\"Ⓚ\":\"K\",\"Ｋ\":\"K\",\"Ḱ\":\"K\",\"Ǩ\":\"K\",\"Ḳ\":\"K\",\"Ķ\":\"K\",\"Ḵ\":\"K\",\"Ƙ\":\"K\",\"Ⱪ\":\"K\",\"Ꝁ\":\"K\",\"Ꝃ\":\"K\",\"Ꝅ\":\"K\",\"Ꞣ\":\"K\",\"Ⓛ\":\"L\",\"Ｌ\":\"L\",\"Ŀ\":\"L\",\"Ĺ\":\"L\",\"Ľ\":\"L\",\"Ḷ\":\"L\",\"Ḹ\":\"L\",\"Ļ\":\"L\",\"Ḽ\":\"L\",\"Ḻ\":\"L\",\"Ł\":\"L\",\"Ƚ\":\"L\",\"Ɫ\":\"L\",\"Ⱡ\":\"L\",\"Ꝉ\":\"L\",\"Ꝇ\":\"L\",\"Ꞁ\":\"L\",\"Ǉ\":\"LJ\",\"ǈ\":\"Lj\",\"Ⓜ\":\"M\",\"Ｍ\":\"M\",\"Ḿ\":\"M\",\"Ṁ\":\"M\",\"Ṃ\":\"M\",\"Ɱ\":\"M\",\"Ɯ\":\"M\",\"Ⓝ\":\"N\",\"Ｎ\":\"N\",\"Ǹ\":\"N\",\"Ń\":\"N\",\"Ñ\":\"N\",\"Ṅ\":\"N\",\"Ň\":\"N\",\"Ṇ\":\"N\",\"Ņ\":\"N\",\"Ṋ\":\"N\",\"Ṉ\":\"N\",\"Ƞ\":\"N\",\"Ɲ\":\"N\",\"Ꞑ\":\"N\",\"Ꞥ\":\"N\",\"Ǌ\":\"NJ\",\"ǋ\":\"Nj\",\"Ⓞ\":\"O\",\"Ｏ\":\"O\",\"Ò\":\"O\",\"Ó\":\"O\",\"Ô\":\"O\",\"Ồ\":\"O\",\"Ố\":\"O\",\"Ỗ\":\"O\",\"Ổ\":\"O\",\"Õ\":\"O\",\"Ṍ\":\"O\",\"Ȭ\":\"O\",\"Ṏ\":\"O\",\"Ō\":\"O\",\"Ṑ\":\"O\",\"Ṓ\":\"O\",\"Ŏ\":\"O\",\"Ȯ\":\"O\",\"Ȱ\":\"O\",\"Ö\":\"O\",\"Ȫ\":\"O\",\"Ỏ\":\"O\",\"Ő\":\"O\",\"Ǒ\":\"O\",\"Ȍ\":\"O\",\"Ȏ\":\"O\",\"Ơ\":\"O\",\"Ờ\":\"O\",\"Ớ\":\"O\",\"Ỡ\":\"O\",\"Ở\":\"O\",\"Ợ\":\"O\",\"Ọ\":\"O\",\"Ộ\":\"O\",\"Ǫ\":\"O\",\"Ǭ\":\"O\",\"Ø\":\"O\",\"Ǿ\":\"O\",\"Ɔ\":\"O\",\"Ɵ\":\"O\",\"Ꝋ\":\"O\",\"Ꝍ\":\"O\",\"Œ\":\"OE\",\"Ƣ\":\"OI\",\"Ꝏ\":\"OO\",\"Ȣ\":\"OU\",\"Ⓟ\":\"P\",\"Ｐ\":\"P\",\"Ṕ\":\"P\",\"Ṗ\":\"P\",\"Ƥ\":\"P\",\"Ᵽ\":\"P\",\"Ꝑ\":\"P\",\"Ꝓ\":\"P\",\"Ꝕ\":\"P\",\"Ⓠ\":\"Q\",\"Ｑ\":\"Q\",\"Ꝗ\":\"Q\",\"Ꝙ\":\"Q\",\"Ɋ\":\"Q\",\"Ⓡ\":\"R\",\"Ｒ\":\"R\",\"Ŕ\":\"R\",\"Ṙ\":\"R\",\"Ř\":\"R\",\"Ȑ\":\"R\",\"Ȓ\":\"R\",\"Ṛ\":\"R\",\"Ṝ\":\"R\",\"Ŗ\":\"R\",\"Ṟ\":\"R\",\"Ɍ\":\"R\",\"Ɽ\":\"R\",\"Ꝛ\":\"R\",\"Ꞧ\":\"R\",\"Ꞃ\":\"R\",\"Ⓢ\":\"S\",\"Ｓ\":\"S\",\"ẞ\":\"S\",\"Ś\":\"S\",\"Ṥ\":\"S\",\"Ŝ\":\"S\",\"Ṡ\":\"S\",\"Š\":\"S\",\"Ṧ\":\"S\",\"Ṣ\":\"S\",\"Ṩ\":\"S\",\"Ș\":\"S\",\"Ş\":\"S\",\"Ȿ\":\"S\",\"Ꞩ\":\"S\",\"Ꞅ\":\"S\",\"Ⓣ\":\"T\",\"Ｔ\":\"T\",\"Ṫ\":\"T\",\"Ť\":\"T\",\"Ṭ\":\"T\",\"Ț\":\"T\",\"Ţ\":\"T\",\"Ṱ\":\"T\",\"Ṯ\":\"T\",\"Ŧ\":\"T\",\"Ƭ\":\"T\",\"Ʈ\":\"T\",\"Ⱦ\":\"T\",\"Ꞇ\":\"T\",\"Ꜩ\":\"TZ\",\"Ⓤ\":\"U\",\"Ｕ\":\"U\",\"Ù\":\"U\",\"Ú\":\"U\",\"Û\":\"U\",\"Ũ\":\"U\",\"Ṹ\":\"U\",\"Ū\":\"U\",\"Ṻ\":\"U\",\"Ŭ\":\"U\",\"Ü\":\"U\",\"Ǜ\":\"U\",\"Ǘ\":\"U\",\"Ǖ\":\"U\",\"Ǚ\":\"U\",\"Ủ\":\"U\",\"Ů\":\"U\",\"Ű\":\"U\",\"Ǔ\":\"U\",\"Ȕ\":\"U\",\"Ȗ\":\"U\",\"Ư\":\"U\",\"Ừ\":\"U\",\"Ứ\":\"U\",\"Ữ\":\"U\",\"Ử\":\"U\",\"Ự\":\"U\",\"Ụ\":\"U\",\"Ṳ\":\"U\",\"Ų\":\"U\",\"Ṷ\":\"U\",\"Ṵ\":\"U\",\"Ʉ\":\"U\",\"Ⓥ\":\"V\",\"Ｖ\":\"V\",\"Ṽ\":\"V\",\"Ṿ\":\"V\",\"Ʋ\":\"V\",\"Ꝟ\":\"V\",\"Ʌ\":\"V\",\"Ꝡ\":\"VY\",\"Ⓦ\":\"W\",\"Ｗ\":\"W\",\"Ẁ\":\"W\",\"Ẃ\":\"W\",\"Ŵ\":\"W\",\"Ẇ\":\"W\",\"Ẅ\":\"W\",\"Ẉ\":\"W\",\"Ⱳ\":\"W\",\"Ⓧ\":\"X\",\"Ｘ\":\"X\",\"Ẋ\":\"X\",\"Ẍ\":\"X\",\"Ⓨ\":\"Y\",\"Ｙ\":\"Y\",\"Ỳ\":\"Y\",\"Ý\":\"Y\",\"Ŷ\":\"Y\",\"Ỹ\":\"Y\",\"Ȳ\":\"Y\",\"Ẏ\":\"Y\",\"Ÿ\":\"Y\",\"Ỷ\":\"Y\",\"Ỵ\":\"Y\",\"Ƴ\":\"Y\",\"Ɏ\":\"Y\",\"Ỿ\":\"Y\",\"Ⓩ\":\"Z\",\"Ｚ\":\"Z\",\"Ź\":\"Z\",\"Ẑ\":\"Z\",\"Ż\":\"Z\",\"Ž\":\"Z\",\"Ẓ\":\"Z\",\"Ẕ\":\"Z\",\"Ƶ\":\"Z\",\"Ȥ\":\"Z\",\"Ɀ\":\"Z\",\"Ⱬ\":\"Z\",\"Ꝣ\":\"Z\",\"ⓐ\":\"a\",\"ａ\":\"a\",\"ẚ\":\"a\",\"à\":\"a\",\"á\":\"a\",\"â\":\"a\",\"ầ\":\"a\",\"ấ\":\"a\",\"ẫ\":\"a\",\"ẩ\":\"a\",\"ã\":\"a\",\"ā\":\"a\",\"ă\":\"a\",\"ằ\":\"a\",\"ắ\":\"a\",\"ẵ\":\"a\",\"ẳ\":\"a\",\"ȧ\":\"a\",\"ǡ\":\"a\",\"ä\":\"a\",\"ǟ\":\"a\",\"ả\":\"a\",\"å\":\"a\",\"ǻ\":\"a\",\"ǎ\":\"a\",\"ȁ\":\"a\",\"ȃ\":\"a\",\"ạ\":\"a\",\"ậ\":\"a\",\"ặ\":\"a\",\"ḁ\":\"a\",\"ą\":\"a\",\"ⱥ\":\"a\",\"ɐ\":\"a\",\"ꜳ\":\"aa\",\"æ\":\"ae\",\"ǽ\":\"ae\",\"ǣ\":\"ae\",\"ꜵ\":\"ao\",\"ꜷ\":\"au\",\"ꜹ\":\"av\",\"ꜻ\":\"av\",\"ꜽ\":\"ay\",\"ⓑ\":\"b\",\"ｂ\":\"b\",\"ḃ\":\"b\",\"ḅ\":\"b\",\"ḇ\":\"b\",\"ƀ\":\"b\",\"ƃ\":\"b\",\"ɓ\":\"b\",\"ⓒ\":\"c\",\"ｃ\":\"c\",\"ć\":\"c\",\"ĉ\":\"c\",\"ċ\":\"c\",\"č\":\"c\",\"ç\":\"c\",\"ḉ\":\"c\",\"ƈ\":\"c\",\"ȼ\":\"c\",\"ꜿ\":\"c\",\"ↄ\":\"c\",\"ⓓ\":\"d\",\"ｄ\":\"d\",\"ḋ\":\"d\",\"ď\":\"d\",\"ḍ\":\"d\",\"ḑ\":\"d\",\"ḓ\":\"d\",\"ḏ\":\"d\",\"đ\":\"d\",\"ƌ\":\"d\",\"ɖ\":\"d\",\"ɗ\":\"d\",\"ꝺ\":\"d\",\"ǳ\":\"dz\",\"ǆ\":\"dz\",\"ⓔ\":\"e\",\"ｅ\":\"e\",\"è\":\"e\",\"é\":\"e\",\"ê\":\"e\",\"ề\":\"e\",\"ế\":\"e\",\"ễ\":\"e\",\"ể\":\"e\",\"ẽ\":\"e\",\"ē\":\"e\",\"ḕ\":\"e\",\"ḗ\":\"e\",\"ĕ\":\"e\",\"ė\":\"e\",\"ë\":\"e\",\"ẻ\":\"e\",\"ě\":\"e\",\"ȅ\":\"e\",\"ȇ\":\"e\",\"ẹ\":\"e\",\"ệ\":\"e\",\"ȩ\":\"e\",\"ḝ\":\"e\",\"ę\":\"e\",\"ḙ\":\"e\",\"ḛ\":\"e\",\"ɇ\":\"e\",\"ɛ\":\"e\",\"ǝ\":\"e\",\"ⓕ\":\"f\",\"ｆ\":\"f\",\"ḟ\":\"f\",\"ƒ\":\"f\",\"ꝼ\":\"f\",\"ⓖ\":\"g\",\"ｇ\":\"g\",\"ǵ\":\"g\",\"ĝ\":\"g\",\"ḡ\":\"g\",\"ğ\":\"g\",\"ġ\":\"g\",\"ǧ\":\"g\",\"ģ\":\"g\",\"ǥ\":\"g\",\"ɠ\":\"g\",\"ꞡ\":\"g\",\"ᵹ\":\"g\",\"ꝿ\":\"g\",\"ⓗ\":\"h\",\"ｈ\":\"h\",\"ĥ\":\"h\",\"ḣ\":\"h\",\"ḧ\":\"h\",\"ȟ\":\"h\",\"ḥ\":\"h\",\"ḩ\":\"h\",\"ḫ\":\"h\",\"ẖ\":\"h\",\"ħ\":\"h\",\"ⱨ\":\"h\",\"ⱶ\":\"h\",\"ɥ\":\"h\",\"ƕ\":\"hv\",\"ⓘ\":\"i\",\"ｉ\":\"i\",\"ì\":\"i\",\"í\":\"i\",\"î\":\"i\",\"ĩ\":\"i\",\"ī\":\"i\",\"ĭ\":\"i\",\"ï\":\"i\",\"ḯ\":\"i\",\"ỉ\":\"i\",\"ǐ\":\"i\",\"ȉ\":\"i\",\"ȋ\":\"i\",\"ị\":\"i\",\"į\":\"i\",\"ḭ\":\"i\",\"ɨ\":\"i\",\"ı\":\"i\",\"ⓙ\":\"j\",\"ｊ\":\"j\",\"ĵ\":\"j\",\"ǰ\":\"j\",\"ɉ\":\"j\",\"ⓚ\":\"k\",\"ｋ\":\"k\",\"ḱ\":\"k\",\"ǩ\":\"k\",\"ḳ\":\"k\",\"ķ\":\"k\",\"ḵ\":\"k\",\"ƙ\":\"k\",\"ⱪ\":\"k\",\"ꝁ\":\"k\",\"ꝃ\":\"k\",\"ꝅ\":\"k\",\"ꞣ\":\"k\",\"ⓛ\":\"l\",\"ｌ\":\"l\",\"ŀ\":\"l\",\"ĺ\":\"l\",\"ľ\":\"l\",\"ḷ\":\"l\",\"ḹ\":\"l\",\"ļ\":\"l\",\"ḽ\":\"l\",\"ḻ\":\"l\",\"ſ\":\"l\",\"ł\":\"l\",\"ƚ\":\"l\",\"ɫ\":\"l\",\"ⱡ\":\"l\",\"ꝉ\":\"l\",\"ꞁ\":\"l\",\"ꝇ\":\"l\",\"ǉ\":\"lj\",\"ⓜ\":\"m\",\"ｍ\":\"m\",\"ḿ\":\"m\",\"ṁ\":\"m\",\"ṃ\":\"m\",\"ɱ\":\"m\",\"ɯ\":\"m\",\"ⓝ\":\"n\",\"ｎ\":\"n\",\"ǹ\":\"n\",\"ń\":\"n\",\"ñ\":\"n\",\"ṅ\":\"n\",\"ň\":\"n\",\"ṇ\":\"n\",\"ņ\":\"n\",\"ṋ\":\"n\",\"ṉ\":\"n\",\"ƞ\":\"n\",\"ɲ\":\"n\",\"ŉ\":\"n\",\"ꞑ\":\"n\",\"ꞥ\":\"n\",\"ǌ\":\"nj\",\"ⓞ\":\"o\",\"ｏ\":\"o\",\"ò\":\"o\",\"ó\":\"o\",\"ô\":\"o\",\"ồ\":\"o\",\"ố\":\"o\",\"ỗ\":\"o\",\"ổ\":\"o\",\"õ\":\"o\",\"ṍ\":\"o\",\"ȭ\":\"o\",\"ṏ\":\"o\",\"ō\":\"o\",\"ṑ\":\"o\",\"ṓ\":\"o\",\"ŏ\":\"o\",\"ȯ\":\"o\",\"ȱ\":\"o\",\"ö\":\"o\",\"ȫ\":\"o\",\"ỏ\":\"o\",\"ő\":\"o\",\"ǒ\":\"o\",\"ȍ\":\"o\",\"ȏ\":\"o\",\"ơ\":\"o\",\"ờ\":\"o\",\"ớ\":\"o\",\"ỡ\":\"o\",\"ở\":\"o\",\"ợ\":\"o\",\"ọ\":\"o\",\"ộ\":\"o\",\"ǫ\":\"o\",\"ǭ\":\"o\",\"ø\":\"o\",\"ǿ\":\"o\",\"ɔ\":\"o\",\"ꝋ\":\"o\",\"ꝍ\":\"o\",\"ɵ\":\"o\",\"œ\":\"oe\",\"ƣ\":\"oi\",\"ȣ\":\"ou\",\"ꝏ\":\"oo\",\"ⓟ\":\"p\",\"ｐ\":\"p\",\"ṕ\":\"p\",\"ṗ\":\"p\",\"ƥ\":\"p\",\"ᵽ\":\"p\",\"ꝑ\":\"p\",\"ꝓ\":\"p\",\"ꝕ\":\"p\",\"ⓠ\":\"q\",\"ｑ\":\"q\",\"ɋ\":\"q\",\"ꝗ\":\"q\",\"ꝙ\":\"q\",\"ⓡ\":\"r\",\"ｒ\":\"r\",\"ŕ\":\"r\",\"ṙ\":\"r\",\"ř\":\"r\",\"ȑ\":\"r\",\"ȓ\":\"r\",\"ṛ\":\"r\",\"ṝ\":\"r\",\"ŗ\":\"r\",\"ṟ\":\"r\",\"ɍ\":\"r\",\"ɽ\":\"r\",\"ꝛ\":\"r\",\"ꞧ\":\"r\",\"ꞃ\":\"r\",\"ⓢ\":\"s\",\"ｓ\":\"s\",\"ß\":\"s\",\"ś\":\"s\",\"ṥ\":\"s\",\"ŝ\":\"s\",\"ṡ\":\"s\",\"š\":\"s\",\"ṧ\":\"s\",\"ṣ\":\"s\",\"ṩ\":\"s\",\"ș\":\"s\",\"ş\":\"s\",\"ȿ\":\"s\",\"ꞩ\":\"s\",\"ꞅ\":\"s\",\"ẛ\":\"s\",\"ⓣ\":\"t\",\"ｔ\":\"t\",\"ṫ\":\"t\",\"ẗ\":\"t\",\"ť\":\"t\",\"ṭ\":\"t\",\"ț\":\"t\",\"ţ\":\"t\",\"ṱ\":\"t\",\"ṯ\":\"t\",\"ŧ\":\"t\",\"ƭ\":\"t\",\"ʈ\":\"t\",\"ⱦ\":\"t\",\"ꞇ\":\"t\",\"ꜩ\":\"tz\",\"ⓤ\":\"u\",\"ｕ\":\"u\",\"ù\":\"u\",\"ú\":\"u\",\"û\":\"u\",\"ũ\":\"u\",\"ṹ\":\"u\",\"ū\":\"u\",\"ṻ\":\"u\",\"ŭ\":\"u\",\"ü\":\"u\",\"ǜ\":\"u\",\"ǘ\":\"u\",\"ǖ\":\"u\",\"ǚ\":\"u\",\"ủ\":\"u\",\"ů\":\"u\",\"ű\":\"u\",\"ǔ\":\"u\",\"ȕ\":\"u\",\"ȗ\":\"u\",\"ư\":\"u\",\"ừ\":\"u\",\"ứ\":\"u\",\"ữ\":\"u\",\"ử\":\"u\",\"ự\":\"u\",\"ụ\":\"u\",\"ṳ\":\"u\",\"ų\":\"u\",\"ṷ\":\"u\",\"ṵ\":\"u\",\"ʉ\":\"u\",\"ⓥ\":\"v\",\"ｖ\":\"v\",\"ṽ\":\"v\",\"ṿ\":\"v\",\"ʋ\":\"v\",\"ꝟ\":\"v\",\"ʌ\":\"v\",\"ꝡ\":\"vy\",\"ⓦ\":\"w\",\"ｗ\":\"w\",\"ẁ\":\"w\",\"ẃ\":\"w\",\"ŵ\":\"w\",\"ẇ\":\"w\",\"ẅ\":\"w\",\"ẘ\":\"w\",\"ẉ\":\"w\",\"ⱳ\":\"w\",\"ⓧ\":\"x\",\"ｘ\":\"x\",\"ẋ\":\"x\",\"ẍ\":\"x\",\"ⓨ\":\"y\",\"ｙ\":\"y\",\"ỳ\":\"y\",\"ý\":\"y\",\"ŷ\":\"y\",\"ỹ\":\"y\",\"ȳ\":\"y\",\"ẏ\":\"y\",\"ÿ\":\"y\",\"ỷ\":\"y\",\"ẙ\":\"y\",\"ỵ\":\"y\",\"ƴ\":\"y\",\"ɏ\":\"y\",\"ỿ\":\"y\",\"ⓩ\":\"z\",\"ｚ\":\"z\",\"ź\":\"z\",\"ẑ\":\"z\",\"ż\":\"z\",\"ž\":\"z\",\"ẓ\":\"z\",\"ẕ\":\"z\",\"ƶ\":\"z\",\"ȥ\":\"z\",\"ɀ\":\"z\",\"ⱬ\":\"z\",\"ꝣ\":\"z\",\"Ά\":\"Α\",\"Έ\":\"Ε\",\"Ή\":\"Η\",\"Ί\":\"Ι\",\"Ϊ\":\"Ι\",\"Ό\":\"Ο\",\"Ύ\":\"Υ\",\"Ϋ\":\"Υ\",\"Ώ\":\"Ω\",\"ά\":\"α\",\"έ\":\"ε\",\"ή\":\"η\",\"ί\":\"ι\",\"ϊ\":\"ι\",\"ΐ\":\"ι\",\"ό\":\"ο\",\"ύ\":\"υ\",\"ϋ\":\"υ\",\"ΰ\":\"υ\",\"ώ\":\"ω\",\"ς\":\"σ\",\"’\":\"'\"}}),u.define(\"select2/data/base\",[\"../utils\"],function(n){function s(e,t){s.__super__.constructor.call(this)}return n.Extend(s,n.Observable),s.prototype.current=function(e){throw new Error(\"The `current` method must be defined in child classes.\")},s.prototype.query=function(e,t){throw new Error(\"The `query` method must be defined in child classes.\")},s.prototype.bind=function(e,t){},s.prototype.destroy=function(){},s.prototype.generateResultId=function(e,t){e=e.id+\"-result-\";return e+=n.generateChars(4),null!=t.id?e+=\"-\"+t.id.toString():e+=\"-\"+n.generateChars(4),e},s}),u.define(\"select2/data/select\",[\"./base\",\"../utils\",\"jquery\"],function(e,a,l){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return a.Extend(n,e),n.prototype.current=function(e){var t=this;e(Array.prototype.map.call(this.$element[0].querySelectorAll(\":checked\"),function(e){return t.item(l(e))}))},n.prototype.select=function(i){var e,r=this;if(i.selected=!0,null!=i.element&&\"option\"===i.element.tagName.toLowerCase())return i.element.selected=!0,void this.$element.trigger(\"input\").trigger(\"change\");this.$element.prop(\"multiple\")?this.current(function(e){var t=[];(i=[i]).push.apply(i,e);for(var n=0;n<i.length;n++){var s=i[n].id;-1===t.indexOf(s)&&t.push(s)}r.$element.val(t),r.$element.trigger(\"input\").trigger(\"change\")}):(e=i.id,this.$element.val(e),this.$element.trigger(\"input\").trigger(\"change\"))},n.prototype.unselect=function(i){var r=this;if(this.$element.prop(\"multiple\")){if(i.selected=!1,null!=i.element&&\"option\"===i.element.tagName.toLowerCase())return i.element.selected=!1,void this.$element.trigger(\"input\").trigger(\"change\");this.current(function(e){for(var t=[],n=0;n<e.length;n++){var s=e[n].id;s!==i.id&&-1===t.indexOf(s)&&t.push(s)}r.$element.val(t),r.$element.trigger(\"input\").trigger(\"change\")})}},n.prototype.bind=function(e,t){var n=this;(this.container=e).on(\"select\",function(e){n.select(e.data)}),e.on(\"unselect\",function(e){n.unselect(e.data)})},n.prototype.destroy=function(){this.$element.find(\"*\").each(function(){a.RemoveData(this)})},n.prototype.query=function(t,e){var n=[],s=this;this.$element.children().each(function(){var e;\"option\"!==this.tagName.toLowerCase()&&\"optgroup\"!==this.tagName.toLowerCase()||(e=l(this),e=s.item(e),null!==(e=s.matches(t,e))&&n.push(e))}),e({results:n})},n.prototype.addOptions=function(e){this.$element.append(e)},n.prototype.option=function(e){var t;e.children?(t=document.createElement(\"optgroup\")).label=e.text:void 0!==(t=document.createElement(\"option\")).textContent?t.textContent=e.text:t.innerText=e.text,void 0!==e.id&&(t.value=e.id),e.disabled&&(t.disabled=!0),e.selected&&(t.selected=!0),e.title&&(t.title=e.title);e=this._normalizeItem(e);return e.element=t,a.StoreData(t,\"data\",e),l(t)},n.prototype.item=function(e){var t={};if(null!=(t=a.GetData(e[0],\"data\")))return t;var n=e[0];if(\"option\"===n.tagName.toLowerCase())t={id:e.val(),text:e.text(),disabled:e.prop(\"disabled\"),selected:e.prop(\"selected\"),title:e.prop(\"title\")};else if(\"optgroup\"===n.tagName.toLowerCase()){t={text:e.prop(\"label\"),children:[],title:e.prop(\"title\")};for(var s=e.children(\"option\"),i=[],r=0;r<s.length;r++){var o=l(s[r]),o=this.item(o);i.push(o)}t.children=i}return(t=this._normalizeItem(t)).element=e[0],a.StoreData(e[0],\"data\",t),t},n.prototype._normalizeItem=function(e){e!==Object(e)&&(e={id:e,text:e});return null!=(e=l.extend({},{text:\"\"},e)).id&&(e.id=e.id.toString()),null!=e.text&&(e.text=e.text.toString()),null==e._resultId&&e.id&&null!=this.container&&(e._resultId=this.generateResultId(this.container,e)),l.extend({},{selected:!1,disabled:!1},e)},n.prototype.matches=function(e,t){return this.options.get(\"matcher\")(e,t)},n}),u.define(\"select2/data/array\",[\"./select\",\"../utils\",\"jquery\"],function(e,t,c){function s(e,t){this._dataToConvert=t.get(\"data\")||[],s.__super__.constructor.call(this,e,t)}return t.Extend(s,e),s.prototype.bind=function(e,t){s.__super__.bind.call(this,e,t),this.addOptions(this.convertToOptions(this._dataToConvert))},s.prototype.select=function(n){var e=this.$element.find(\"option\").filter(function(e,t){return t.value==n.id.toString()});0===e.length&&(e=this.option(n),this.addOptions(e)),s.__super__.select.call(this,n)},s.prototype.convertToOptions=function(e){var t=this,n=this.$element.find(\"option\"),s=n.map(function(){return t.item(c(this)).id}).get(),i=[];for(var r=0;r<e.length;r++){var o,a,l=this._normalizeItem(e[r]);0<=s.indexOf(l.id)?(o=n.filter(function(e){return function(){return c(this).val()==e.id}}(l)),a=this.item(o),a=c.extend(!0,{},l,a),a=this.option(a),o.replaceWith(a)):(a=this.option(l),l.children&&(l=this.convertToOptions(l.children),a.append(l)),i.push(a))}return i},s}),u.define(\"select2/data/ajax\",[\"./array\",\"../utils\",\"jquery\"],function(e,t,r){function n(e,t){this.ajaxOptions=this._applyDefaults(t.get(\"ajax\")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),n.__super__.constructor.call(this,e,t)}return t.Extend(n,e),n.prototype._applyDefaults=function(e){var t={data:function(e){return r.extend({},e,{q:e.term})},transport:function(e,t,n){e=r.ajax(e);return e.then(t),e.fail(n),e}};return r.extend({},t,e,!0)},n.prototype.processResults=function(e){return e},n.prototype.query=function(t,n){var s=this;null!=this._request&&(\"function\"==typeof this._request.abort&&this._request.abort(),this._request=null);var i=r.extend({type:\"GET\"},this.ajaxOptions);function e(){var e=i.transport(i,function(e){e=s.processResults(e,t);s.options.get(\"debug\")&&window.console&&console.error&&(e&&e.results&&Array.isArray(e.results)||console.error(\"Select2: The AJAX results did not return an array in the `results` key of the response.\")),n(e)},function(){\"status\"in e&&(0===e.status||\"0\"===e.status)||s.trigger(\"results:message\",{message:\"errorLoading\"})});s._request=e}\"function\"==typeof i.url&&(i.url=i.url.call(this.$element,t)),\"function\"==typeof i.data&&(i.data=i.data.call(this.$element,t)),this.ajaxOptions.delay&&null!=t.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(e,this.ajaxOptions.delay)):e()},n}),u.define(\"select2/data/tags\",[\"jquery\"],function(t){function e(e,t,n){var s=n.get(\"tags\"),i=n.get(\"createTag\");void 0!==i&&(this.createTag=i);i=n.get(\"insertTag\");if(void 0!==i&&(this.insertTag=i),e.call(this,t,n),Array.isArray(s))for(var r=0;r<s.length;r++){var o=s[r],o=this._normalizeItem(o),o=this.option(o);this.$element.append(o)}}return e.prototype.query=function(e,c,u){var d=this;this._removeOldTags(),null!=c.term&&null==c.page?e.call(this,c,function e(t,n){for(var s=t.results,i=0;i<s.length;i++){var r=s[i],o=null!=r.children&&!e({results:r.children},!0);if((r.text||\"\").toUpperCase()===(c.term||\"\").toUpperCase()||o)return!n&&(t.data=s,void u(t))}if(n)return!0;var a,l=d.createTag(c);null!=l&&((a=d.option(l)).attr(\"data-select2-tag\",\"true\"),d.addOptions([a]),d.insertTag(s,l)),t.results=s,u(t)}):e.call(this,c,u)},e.prototype.createTag=function(e,t){if(null==t.term)return null;t=t.term.trim();return\"\"===t?null:{id:t,text:t}},e.prototype.insertTag=function(e,t,n){t.unshift(n)},e.prototype._removeOldTags=function(e){this.$element.find(\"option[data-select2-tag]\").each(function(){this.selected||t(this).remove()})},e}),u.define(\"select2/data/tokenizer\",[\"jquery\"],function(c){function e(e,t,n){var s=n.get(\"tokenizer\");void 0!==s&&(this.tokenizer=s),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){e.call(this,t,n),this.$search=t.dropdown.$search||t.selection.$search||n.find(\".select2-search__field\")},e.prototype.query=function(e,t,n){var s=this;t.term=t.term||\"\";var i=this.tokenizer(t,this.options,function(e){var t,n=s._normalizeItem(e);s.$element.find(\"option\").filter(function(){return c(this).val()===n.id}).length||((t=s.option(n)).attr(\"data-select2-tag\",!0),s._removeOldTags(),s.addOptions([t])),t=n,s.trigger(\"select\",{data:t})});i.term!==t.term&&(this.$search.length&&(this.$search.val(i.term),this.$search.trigger(\"focus\")),t.term=i.term),e.call(this,t,n)},e.prototype.tokenizer=function(e,t,n,s){for(var i=n.get(\"tokenSeparators\")||[],r=t.term,o=0,a=this.createTag||function(e){return{id:e.term,text:e.term}};o<r.length;){var l=r[o];-1!==i.indexOf(l)?(l=r.substr(0,o),null!=(l=a(c.extend({},t,{term:l})))?(s(l),r=r.substr(o+1)||\"\",o=0):o++):o++}return{term:r}},e}),u.define(\"select2/data/minimumInputLength\",[],function(){function e(e,t,n){this.minimumInputLength=n.get(\"minimumInputLength\"),e.call(this,t,n)}return e.prototype.query=function(e,t,n){t.term=t.term||\"\",t.term.length<this.minimumInputLength?this.trigger(\"results:message\",{message:\"inputTooShort\",args:{minimum:this.minimumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),u.define(\"select2/data/maximumInputLength\",[],function(){function e(e,t,n){this.maximumInputLength=n.get(\"maximumInputLength\"),e.call(this,t,n)}return e.prototype.query=function(e,t,n){t.term=t.term||\"\",0<this.maximumInputLength&&t.term.length>this.maximumInputLength?this.trigger(\"results:message\",{message:\"inputTooLong\",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),u.define(\"select2/data/maximumSelectionLength\",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get(\"maximumSelectionLength\"),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on(\"select\",function(){s._checkIfMaximumSelected()})},e.prototype.query=function(e,t,n){var s=this;this._checkIfMaximumSelected(function(){e.call(s,t,n)})},e.prototype._checkIfMaximumSelected=function(e,t){var n=this;this.current(function(e){e=null!=e?e.length:0;0<n.maximumSelectionLength&&e>=n.maximumSelectionLength?n.trigger(\"results:message\",{message:\"maximumSelected\",args:{maximum:n.maximumSelectionLength}}):t&&t()})},e}),u.define(\"select2/dropdown\",[\"jquery\",\"./utils\"],function(t,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('<span class=\"select2-dropdown\"><span class=\"select2-results\"></span></span>');return e.attr(\"dir\",this.options.get(\"dir\")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),u.define(\"select2/dropdown/search\",[\"jquery\"],function(r){function e(){}return e.prototype.render=function(e){var t=e.call(this),n=this.options.get(\"translations\").get(\"search\"),e=r('<span class=\"select2-search select2-search--dropdown\"><input class=\"select2-search__field\" type=\"search\" tabindex=\"-1\" autocorrect=\"off\" autocapitalize=\"none\" spellcheck=\"false\" role=\"searchbox\" aria-autocomplete=\"list\" /></span>');return this.$searchContainer=e,this.$search=e.find(\"input\"),this.$search.prop(\"autocomplete\",this.options.get(\"autocomplete\")),this.$search.attr(\"aria-label\",n()),t.prepend(e),t},e.prototype.bind=function(e,t,n){var s=this,i=t.id+\"-results\";e.call(this,t,n),this.$search.on(\"keydown\",function(e){s.trigger(\"keypress\",e),s._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on(\"input\",function(e){r(this).off(\"keyup\")}),this.$search.on(\"keyup input\",function(e){s.handleSearch(e)}),t.on(\"open\",function(){s.$search.attr(\"tabindex\",0),s.$search.attr(\"aria-controls\",i),s.$search.trigger(\"focus\"),window.setTimeout(function(){s.$search.trigger(\"focus\")},0)}),t.on(\"close\",function(){s.$search.attr(\"tabindex\",-1),s.$search.removeAttr(\"aria-controls\"),s.$search.removeAttr(\"aria-activedescendant\"),s.$search.val(\"\"),s.$search.trigger(\"blur\")}),t.on(\"focus\",function(){t.isOpen()||s.$search.trigger(\"focus\")}),t.on(\"results:all\",function(e){null!=e.query.term&&\"\"!==e.query.term||(s.showSearch(e)?s.$searchContainer[0].classList.remove(\"select2-search--hide\"):s.$searchContainer[0].classList.add(\"select2-search--hide\"))}),t.on(\"results:focus\",function(e){e.data._resultId?s.$search.attr(\"aria-activedescendant\",e.data._resultId):s.$search.removeAttr(\"aria-activedescendant\")})},e.prototype.handleSearch=function(e){var t;this._keyUpPrevented||(t=this.$search.val(),this.trigger(\"query\",{term:t})),this._keyUpPrevented=!1},e.prototype.showSearch=function(e,t){return!0},e}),u.define(\"select2/dropdown/hidePlaceholder\",[],function(){function e(e,t,n,s){this.placeholder=this.normalizePlaceholder(n.get(\"placeholder\")),e.call(this,t,n,s)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return t=\"string\"==typeof t?{id:\"\",text:t}:t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),s=t.length-1;0<=s;s--){var i=t[s];this.placeholder.id===i.id&&n.splice(s,1)}return n},e}),u.define(\"select2/dropdown/infiniteScroll\",[\"jquery\"],function(n){function e(e,t,n,s){this.lastParams={},e.call(this,t,n,s),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&(this.$results.append(this.$loadingMore),this.loadMoreIfNeeded())},e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on(\"query\",function(e){s.lastParams=e,s.loading=!0}),t.on(\"query:append\",function(e){s.lastParams=e,s.loading=!0}),this.$results.on(\"scroll\",this.loadMoreIfNeeded.bind(this))},e.prototype.loadMoreIfNeeded=function(){var e=n.contains(document.documentElement,this.$loadingMore[0]);!this.loading&&e&&(e=this.$results.offset().top+this.$results.outerHeight(!1),this.$loadingMore.offset().top+this.$loadingMore.outerHeight(!1)<=e+50&&this.loadMore())},e.prototype.loadMore=function(){this.loading=!0;var e=n.extend({},{page:1},this.lastParams);e.page++,this.trigger(\"query:append\",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=n('<li class=\"select2-results__option select2-results__option--load-more\"role=\"option\" aria-disabled=\"true\"></li>'),t=this.options.get(\"translations\").get(\"loadingMore\");return e.html(t(this.lastParams)),e},e}),u.define(\"select2/dropdown/attachBody\",[\"jquery\",\"../utils\"],function(u,o){function e(e,t,n){this.$dropdownParent=u(n.get(\"dropdownParent\")||document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on(\"open\",function(){s._showDropdown(),s._attachPositioningHandler(t),s._bindContainerResultHandlers(t)}),t.on(\"close\",function(){s._hideDropdown(),s._detachPositioningHandler(t)}),this.$dropdownContainer.on(\"mousedown\",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr(\"class\",n.attr(\"class\")),t[0].classList.remove(\"select2\"),t[0].classList.add(\"select2-container--open\"),t.css({position:\"absolute\",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=u(\"<span></span>\"),e=e.call(this);return t.append(e),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._bindContainerResultHandlers=function(e,t){var n;this._containerResultsHandlersBound||(n=this,t.on(\"results:all\",function(){n._positionDropdown(),n._resizeDropdown()}),t.on(\"results:append\",function(){n._positionDropdown(),n._resizeDropdown()}),t.on(\"results:message\",function(){n._positionDropdown(),n._resizeDropdown()}),t.on(\"select\",function(){n._positionDropdown(),n._resizeDropdown()}),t.on(\"unselect\",function(){n._positionDropdown(),n._resizeDropdown()}),this._containerResultsHandlersBound=!0)},e.prototype._attachPositioningHandler=function(e,t){var n=this,s=\"scroll.select2.\"+t.id,i=\"resize.select2.\"+t.id,r=\"orientationchange.select2.\"+t.id,t=this.$container.parents().filter(o.hasScroll);t.each(function(){o.StoreData(this,\"select2-scroll-position\",{x:u(this).scrollLeft(),y:u(this).scrollTop()})}),t.on(s,function(e){var t=o.GetData(this,\"select2-scroll-position\");u(this).scrollTop(t.y)}),u(window).on(s+\" \"+i+\" \"+r,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n=\"scroll.select2.\"+t.id,s=\"resize.select2.\"+t.id,t=\"orientationchange.select2.\"+t.id;this.$container.parents().filter(o.hasScroll).off(n),u(window).off(n+\" \"+s+\" \"+t)},e.prototype._positionDropdown=function(){var e=u(window),t=this.$dropdown[0].classList.contains(\"select2-dropdown--above\"),n=this.$dropdown[0].classList.contains(\"select2-dropdown--below\"),s=null,i=this.$container.offset();i.bottom=i.top+this.$container.outerHeight(!1);var r={height:this.$container.outerHeight(!1)};r.top=i.top,r.bottom=i.top+r.height;var o=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=a<i.top-o,e=l>i.bottom+o,a={left:i.left,top:r.bottom},l=this.$dropdownParent;\"static\"===l.css(\"position\")&&(l=l.offsetParent());i={top:0,left:0};(u.contains(document.body,l[0])||l[0].isConnected)&&(i=l.offset()),a.top-=i.top,a.left-=i.left,t||n||(s=\"below\"),e||!c||t?!c&&e&&t&&(s=\"below\"):s=\"above\",(\"above\"==s||t&&\"below\"!==s)&&(a.top=r.top-i.top-o),null!=s&&(this.$dropdown[0].classList.remove(\"select2-dropdown--below\"),this.$dropdown[0].classList.remove(\"select2-dropdown--above\"),this.$dropdown[0].classList.add(\"select2-dropdown--\"+s),this.$container[0].classList.remove(\"select2-container--below\"),this.$container[0].classList.remove(\"select2-container--above\"),this.$container[0].classList.add(\"select2-container--\"+s)),this.$dropdownContainer.css(a)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+\"px\"};this.options.get(\"dropdownAutoWidth\")&&(e.minWidth=e.width,e.position=\"relative\",e.width=\"auto\"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),u.define(\"select2/dropdown/minimumResultsForSearch\",[],function(){function e(e,t,n,s){this.minimumResultsForSearch=n.get(\"minimumResultsForSearch\"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,s)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,s=0;s<t.length;s++){var i=t[s];i.children?n+=e(i.children):n++}return n}(t.data.results)<this.minimumResultsForSearch)&&e.call(this,t)},e}),u.define(\"select2/dropdown/selectOnClose\",[\"../utils\"],function(s){function e(){}return e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on(\"close\",function(e){s._handleSelectOnClose(e)})},e.prototype._handleSelectOnClose=function(e,t){if(t&&null!=t.originalSelect2Event){var n=t.originalSelect2Event;if(\"select\"===n._type||\"unselect\"===n._type)return}n=this.getHighlightedResults();n.length<1||(null!=(n=s.GetData(n[0],\"data\")).element&&n.element.selected||null==n.element&&n.selected||this.trigger(\"select\",{data:n}))},e}),u.define(\"select2/dropdown/closeOnSelect\",[],function(){function e(){}return e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on(\"select\",function(e){s._selectTriggered(e)}),t.on(\"unselect\",function(e){s._selectTriggered(e)})},e.prototype._selectTriggered=function(e,t){var n=t.originalEvent;n&&(n.ctrlKey||n.metaKey)||this.trigger(\"close\",{originalEvent:n,originalSelect2Event:t})},e}),u.define(\"select2/dropdown/dropdownCss\",[\"../utils\"],function(n){function e(){}return e.prototype.render=function(e){var t=e.call(this),e=this.options.get(\"dropdownCssClass\")||\"\";return-1!==e.indexOf(\":all:\")&&(e=e.replace(\":all:\",\"\"),n.copyNonInternalCssClasses(t[0],this.$element[0])),t.addClass(e),t},e}),u.define(\"select2/dropdown/tagsSearchHighlight\",[\"../utils\"],function(s){function e(){}return e.prototype.highlightFirstItem=function(e){var t=this.$results.find(\".select2-results__option--selectable:not(.select2-results__option--selected)\");if(0<t.length){var n=t.first(),t=s.GetData(n[0],\"data\").element;if(t&&t.getAttribute&&\"true\"===t.getAttribute(\"data-select2-tag\"))return void n.trigger(\"mouseenter\")}e.call(this)},e}),u.define(\"select2/i18n/en\",[],function(){return{errorLoading:function(){return\"The results could not be loaded.\"},inputTooLong:function(e){var t=e.input.length-e.maximum,e=\"Please delete \"+t+\" character\";return 1!=t&&(e+=\"s\"),e},inputTooShort:function(e){return\"Please enter \"+(e.minimum-e.input.length)+\" or more characters\"},loadingMore:function(){return\"Loading more results…\"},maximumSelected:function(e){var t=\"You can only select \"+e.maximum+\" item\";return 1!=e.maximum&&(t+=\"s\"),t},noResults:function(){return\"No results found\"},searching:function(){return\"Searching…\"},removeAllItems:function(){return\"Remove all items\"},removeItem:function(){return\"Remove item\"},search:function(){return\"Search\"}}}),u.define(\"select2/defaults\",[\"jquery\",\"./results\",\"./selection/single\",\"./selection/multiple\",\"./selection/placeholder\",\"./selection/allowClear\",\"./selection/search\",\"./selection/selectionCss\",\"./selection/eventRelay\",\"./utils\",\"./translation\",\"./diacritics\",\"./data/select\",\"./data/array\",\"./data/ajax\",\"./data/tags\",\"./data/tokenizer\",\"./data/minimumInputLength\",\"./data/maximumInputLength\",\"./data/maximumSelectionLength\",\"./dropdown\",\"./dropdown/search\",\"./dropdown/hidePlaceholder\",\"./dropdown/infiniteScroll\",\"./dropdown/attachBody\",\"./dropdown/minimumResultsForSearch\",\"./dropdown/selectOnClose\",\"./dropdown/closeOnSelect\",\"./dropdown/dropdownCss\",\"./dropdown/tagsSearchHighlight\",\"./i18n/en\"],function(l,r,o,a,c,u,d,p,h,f,g,t,m,y,v,_,b,$,w,x,A,D,S,E,O,C,L,T,q,I,e){function n(){this.reset()}return n.prototype.apply=function(e){var t;null==(e=l.extend(!0,{},this.defaults,e)).dataAdapter&&(null!=e.ajax?e.dataAdapter=v:null!=e.data?e.dataAdapter=y:e.dataAdapter=m,0<e.minimumInputLength&&(e.dataAdapter=f.Decorate(e.dataAdapter,$)),0<e.maximumInputLength&&(e.dataAdapter=f.Decorate(e.dataAdapter,w)),0<e.maximumSelectionLength&&(e.dataAdapter=f.Decorate(e.dataAdapter,x)),e.tags&&(e.dataAdapter=f.Decorate(e.dataAdapter,_)),null==e.tokenSeparators&&null==e.tokenizer||(e.dataAdapter=f.Decorate(e.dataAdapter,b))),null==e.resultsAdapter&&(e.resultsAdapter=r,null!=e.ajax&&(e.resultsAdapter=f.Decorate(e.resultsAdapter,E)),null!=e.placeholder&&(e.resultsAdapter=f.Decorate(e.resultsAdapter,S)),e.selectOnClose&&(e.resultsAdapter=f.Decorate(e.resultsAdapter,L)),e.tags&&(e.resultsAdapter=f.Decorate(e.resultsAdapter,I))),null==e.dropdownAdapter&&(e.multiple?e.dropdownAdapter=A:(t=f.Decorate(A,D),e.dropdownAdapter=t),0!==e.minimumResultsForSearch&&(e.dropdownAdapter=f.Decorate(e.dropdownAdapter,C)),e.closeOnSelect&&(e.dropdownAdapter=f.Decorate(e.dropdownAdapter,T)),null!=e.dropdownCssClass&&(e.dropdownAdapter=f.Decorate(e.dropdownAdapter,q)),e.dropdownAdapter=f.Decorate(e.dropdownAdapter,O)),null==e.selectionAdapter&&(e.multiple?e.selectionAdapter=a:e.selectionAdapter=o,null!=e.placeholder&&(e.selectionAdapter=f.Decorate(e.selectionAdapter,c)),e.allowClear&&(e.selectionAdapter=f.Decorate(e.selectionAdapter,u)),e.multiple&&(e.selectionAdapter=f.Decorate(e.selectionAdapter,d)),null!=e.selectionCssClass&&(e.selectionAdapter=f.Decorate(e.selectionAdapter,p)),e.selectionAdapter=f.Decorate(e.selectionAdapter,h)),e.language=this._resolveLanguage(e.language),e.language.push(\"en\");for(var n=[],s=0;s<e.language.length;s++){var i=e.language[s];-1===n.indexOf(i)&&n.push(i)}return e.language=n,e.translations=this._processTranslations(e.language,e.debug),e},n.prototype.reset=function(){function a(e){return e.replace(/[^\\u0000-\\u007E]/g,function(e){return t[e]||e})}this.defaults={amdLanguageBase:\"./i18n/\",autocomplete:\"off\",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:f.escapeMarkup,language:{},matcher:function e(t,n){if(null==t.term||\"\"===t.term.trim())return n;if(n.children&&0<n.children.length){for(var s=l.extend(!0,{},n),i=n.children.length-1;0<=i;i--)null==e(t,n.children[i])&&s.children.splice(i,1);return 0<s.children.length?s:e(t,s)}var r=a(n.text).toUpperCase(),o=a(t.term).toUpperCase();return-1<r.indexOf(o)?n:null},minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,scrollAfterSelect:!1,sorter:function(e){return e},templateResult:function(e){return e.text},templateSelection:function(e){return e.text},theme:\"default\",width:\"resolve\"}},n.prototype.applyFromElement=function(e,t){var n=e.language,s=this.defaults.language,i=t.prop(\"lang\"),t=t.closest(\"[lang]\").prop(\"lang\"),t=Array.prototype.concat.call(this._resolveLanguage(i),this._resolveLanguage(n),this._resolveLanguage(s),this._resolveLanguage(t));return e.language=t,e},n.prototype._resolveLanguage=function(e){if(!e)return[];if(l.isEmptyObject(e))return[];if(l.isPlainObject(e))return[e];for(var t,n=Array.isArray(e)?e:[e],s=[],i=0;i<n.length;i++)s.push(n[i]),\"string\"==typeof n[i]&&0<n[i].indexOf(\"-\")&&(t=n[i].split(\"-\")[0],s.push(t));return s},n.prototype._processTranslations=function(e,t){for(var n=new g,s=0;s<e.length;s++){var i=new g,r=e[s];if(\"string\"==typeof r)try{i=g.loadPath(r)}catch(e){try{r=this.defaults.amdLanguageBase+r,i=g.loadPath(r)}catch(e){t&&window.console&&console.warn&&console.warn('Select2: The language file for \"'+r+'\" could not be automatically loaded. A fallback will be used instead.')}}else i=l.isPlainObject(r)?new g(r):r;n.extend(i)}return n},n.prototype.set=function(e,t){var n={};n[l.camelCase(e)]=t;n=f._convertData(n);l.extend(!0,this.defaults,n)},new n}),u.define(\"select2/options\",[\"jquery\",\"./defaults\",\"./utils\"],function(c,n,u){function e(e,t){this.options=e,null!=t&&this.fromElement(t),null!=t&&(this.options=n.applyFromElement(this.options,t)),this.options=n.apply(this.options)}return e.prototype.fromElement=function(e){var t=[\"select2\"];null==this.options.multiple&&(this.options.multiple=e.prop(\"multiple\")),null==this.options.disabled&&(this.options.disabled=e.prop(\"disabled\")),null==this.options.autocomplete&&e.prop(\"autocomplete\")&&(this.options.autocomplete=e.prop(\"autocomplete\")),null==this.options.dir&&(e.prop(\"dir\")?this.options.dir=e.prop(\"dir\"):e.closest(\"[dir]\").prop(\"dir\")?this.options.dir=e.closest(\"[dir]\").prop(\"dir\"):this.options.dir=\"ltr\"),e.prop(\"disabled\",this.options.disabled),e.prop(\"multiple\",this.options.multiple),u.GetData(e[0],\"select2Tags\")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags=\"true\"` attributes and will be removed in future versions of Select2.'),u.StoreData(e[0],\"data\",u.GetData(e[0],\"select2Tags\")),u.StoreData(e[0],\"tags\",!0)),u.GetData(e[0],\"ajaxUrl\")&&(this.options.debug&&window.console&&console.warn&&console.warn(\"Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2.\"),e.attr(\"ajax--url\",u.GetData(e[0],\"ajaxUrl\")),u.StoreData(e[0],\"ajax-Url\",u.GetData(e[0],\"ajaxUrl\")));var n={};function s(e,t){return t.toUpperCase()}for(var i=0;i<e[0].attributes.length;i++){var r=e[0].attributes[i].name,o=\"data-\";r.substr(0,o.length)==o&&(r=r.substring(o.length),o=u.GetData(e[0],r),n[r.replace(/-([a-z])/g,s)]=o)}c.fn.jquery&&\"1.\"==c.fn.jquery.substr(0,2)&&e[0].dataset&&(n=c.extend(!0,{},e[0].dataset,n));var a,l=c.extend(!0,{},u.GetData(e[0]),n);for(a in l=u._convertData(l))-1<t.indexOf(a)||(c.isPlainObject(this.options[a])?c.extend(this.options[a],l[a]):this.options[a]=l[a]);return this},e.prototype.get=function(e){return this.options[e]},e.prototype.set=function(e,t){this.options[e]=t},e}),u.define(\"select2/core\",[\"jquery\",\"./options\",\"./utils\",\"./keys\"],function(t,i,r,s){var o=function(e,t){null!=r.GetData(e[0],\"select2\")&&r.GetData(e[0],\"select2\").destroy(),this.$element=e,this.id=this._generateId(e),t=t||{},this.options=new i(t,e),o.__super__.constructor.call(this);var n=e.attr(\"tabindex\")||0;r.StoreData(e[0],\"old-tabindex\",n),e.attr(\"tabindex\",\"-1\");t=this.options.get(\"dataAdapter\");this.dataAdapter=new t(e,this.options);n=this.render();this._placeContainer(n);t=this.options.get(\"selectionAdapter\");this.selection=new t(e,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,n);t=this.options.get(\"dropdownAdapter\");this.dropdown=new t(e,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,n);n=this.options.get(\"resultsAdapter\");this.results=new n(e,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var s=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(e){s.trigger(\"selection:update\",{data:e})}),e[0].classList.add(\"select2-hidden-accessible\"),e.attr(\"aria-hidden\",\"true\"),this._syncAttributes(),r.StoreData(e[0],\"select2\",this),e.data(\"select2\",this)};return r.Extend(o,r.Observable),o.prototype._generateId=function(e){return\"select2-\"+(null!=e.attr(\"id\")?e.attr(\"id\"):null!=e.attr(\"name\")?e.attr(\"name\")+\"-\"+r.generateChars(2):r.generateChars(4)).replace(/(:|\\.|\\[|\\]|,)/g,\"\")},o.prototype._placeContainer=function(e){e.insertAfter(this.$element);var t=this._resolveWidth(this.$element,this.options.get(\"width\"));null!=t&&e.css(\"width\",t)},o.prototype._resolveWidth=function(e,t){var n=/^width:(([-+]?([0-9]*\\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if(\"resolve\"==t){var s=this._resolveWidth(e,\"style\");return null!=s?s:this._resolveWidth(e,\"element\")}if(\"element\"==t){s=e.outerWidth(!1);return s<=0?\"auto\":s+\"px\"}if(\"style\"!=t)return\"computedstyle\"!=t?t:window.getComputedStyle(e[0]).width;e=e.attr(\"style\");if(\"string\"!=typeof e)return null;for(var i=e.split(\";\"),r=0,o=i.length;r<o;r+=1){var a=i[r].replace(/\\s/g,\"\").match(n);if(null!==a&&1<=a.length)return a[1]}return null},o.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},o.prototype._registerDomEvents=function(){var t=this;this.$element.on(\"change.select2\",function(){t.dataAdapter.current(function(e){t.trigger(\"selection:update\",{data:e})})}),this.$element.on(\"focus.select2\",function(e){t.trigger(\"focus\",e)}),this._syncA=r.bind(this._syncAttributes,this),this._syncS=r.bind(this._syncSubtree,this),this._observer=new window.MutationObserver(function(e){t._syncA(),t._syncS(e)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})},o.prototype._registerDataEvents=function(){var n=this;this.dataAdapter.on(\"*\",function(e,t){n.trigger(e,t)})},o.prototype._registerSelectionEvents=function(){var n=this,s=[\"toggle\",\"focus\"];this.selection.on(\"toggle\",function(){n.toggleDropdown()}),this.selection.on(\"focus\",function(e){n.focus(e)}),this.selection.on(\"*\",function(e,t){-1===s.indexOf(e)&&n.trigger(e,t)})},o.prototype._registerDropdownEvents=function(){var n=this;this.dropdown.on(\"*\",function(e,t){n.trigger(e,t)})},o.prototype._registerResultsEvents=function(){var n=this;this.results.on(\"*\",function(e,t){n.trigger(e,t)})},o.prototype._registerEvents=function(){var n=this;this.on(\"open\",function(){n.$container[0].classList.add(\"select2-container--open\")}),this.on(\"close\",function(){n.$container[0].classList.remove(\"select2-container--open\")}),this.on(\"enable\",function(){n.$container[0].classList.remove(\"select2-container--disabled\")}),this.on(\"disable\",function(){n.$container[0].classList.add(\"select2-container--disabled\")}),this.on(\"blur\",function(){n.$container[0].classList.remove(\"select2-container--focus\")}),this.on(\"query\",function(t){n.isOpen()||n.trigger(\"open\",{}),this.dataAdapter.query(t,function(e){n.trigger(\"results:all\",{data:e,query:t})})}),this.on(\"query:append\",function(t){this.dataAdapter.query(t,function(e){n.trigger(\"results:append\",{data:e,query:t})})}),this.on(\"keypress\",function(e){var t=e.which;n.isOpen()?t===s.ESC||t===s.UP&&e.altKey?(n.close(e),e.preventDefault()):t===s.ENTER||t===s.TAB?(n.trigger(\"results:select\",{}),e.preventDefault()):t===s.SPACE&&e.ctrlKey?(n.trigger(\"results:toggle\",{}),e.preventDefault()):t===s.UP?(n.trigger(\"results:previous\",{}),e.preventDefault()):t===s.DOWN&&(n.trigger(\"results:next\",{}),e.preventDefault()):(t===s.ENTER||t===s.SPACE||t===s.DOWN&&e.altKey)&&(n.open(),e.preventDefault())})},o.prototype._syncAttributes=function(){this.options.set(\"disabled\",this.$element.prop(\"disabled\")),this.isDisabled()?(this.isOpen()&&this.close(),this.trigger(\"disable\",{})):this.trigger(\"enable\",{})},o.prototype._isChangeMutation=function(e){var t=this;if(e.addedNodes&&0<e.addedNodes.length){for(var n=0;n<e.addedNodes.length;n++)if(e.addedNodes[n].selected)return!0}else{if(e.removedNodes&&0<e.removedNodes.length)return!0;if(Array.isArray(e))return e.some(function(e){return t._isChangeMutation(e)})}return!1},o.prototype._syncSubtree=function(e){var e=this._isChangeMutation(e),t=this;e&&this.dataAdapter.current(function(e){t.trigger(\"selection:update\",{data:e})})},o.prototype.trigger=function(e,t){var n=o.__super__.trigger,s={open:\"opening\",close:\"closing\",select:\"selecting\",unselect:\"unselecting\",clear:\"clearing\"};if(void 0===t&&(t={}),e in s){var i=s[e],s={prevented:!1,name:e,args:t};if(n.call(this,i,s),s.prevented)return void(t.prevented=!0)}n.call(this,e,t)},o.prototype.toggleDropdown=function(){this.isDisabled()||(this.isOpen()?this.close():this.open())},o.prototype.open=function(){this.isOpen()||this.isDisabled()||this.trigger(\"query\",{})},o.prototype.close=function(e){this.isOpen()&&this.trigger(\"close\",{originalEvent:e})},o.prototype.isEnabled=function(){return!this.isDisabled()},o.prototype.isDisabled=function(){return this.options.get(\"disabled\")},o.prototype.isOpen=function(){return this.$container[0].classList.contains(\"select2-container--open\")},o.prototype.hasFocus=function(){return this.$container[0].classList.contains(\"select2-container--focus\")},o.prototype.focus=function(e){this.hasFocus()||(this.$container[0].classList.add(\"select2-container--focus\"),this.trigger(\"focus\",{}))},o.prototype.enable=function(e){this.options.get(\"debug\")&&window.console&&console.warn&&console.warn('Select2: The `select2(\"enable\")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop(\"disabled\") instead.');e=!(e=null==e||0===e.length?[!0]:e)[0];this.$element.prop(\"disabled\",e)},o.prototype.data=function(){this.options.get(\"debug\")&&0<arguments.length&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2(\"data\")`. You should consider setting the value instead using `$element.val()`.');var t=[];return this.dataAdapter.current(function(e){t=e}),t},o.prototype.val=function(e){if(this.options.get(\"debug\")&&window.console&&console.warn&&console.warn('Select2: The `select2(\"val\")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==e||0===e.length)return this.$element.val();e=e[0];Array.isArray(e)&&(e=e.map(function(e){return e.toString()})),this.$element.val(e).trigger(\"input\").trigger(\"change\")},o.prototype.destroy=function(){r.RemoveData(this.$container[0]),this.$container.remove(),this._observer.disconnect(),this._observer=null,this._syncA=null,this._syncS=null,this.$element.off(\".select2\"),this.$element.attr(\"tabindex\",r.GetData(this.$element[0],\"old-tabindex\")),this.$element[0].classList.remove(\"select2-hidden-accessible\"),this.$element.attr(\"aria-hidden\",\"false\"),r.RemoveData(this.$element[0]),this.$element.removeData(\"select2\"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},o.prototype.render=function(){var e=t('<span class=\"select2 select2-container\"><span class=\"selection\"></span><span class=\"dropdown-wrapper\" aria-hidden=\"true\"></span></span>');return e.attr(\"dir\",this.options.get(\"dir\")),this.$container=e,this.$container[0].classList.add(\"select2-container--\"+this.options.get(\"theme\")),r.StoreData(e[0],\"element\",this.$element),e},o}),u.define(\"jquery-mousewheel\",[\"jquery\"],function(e){return e}),u.define(\"jquery.select2\",[\"jquery\",\"jquery-mousewheel\",\"./select2/core\",\"./select2/defaults\",\"./select2/utils\"],function(i,e,r,t,o){var a;return null==i.fn.select2&&(a=[\"open\",\"close\",\"destroy\"],i.fn.select2=function(t){if(\"object\"==typeof(t=t||{}))return this.each(function(){var e=i.extend(!0,{},t);new r(i(this),e)}),this;if(\"string\"!=typeof t)throw new Error(\"Invalid arguments for Select2: \"+t);var n,s=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=o.GetData(this,\"select2\");null==e&&window.console&&console.error&&console.error(\"The select2('\"+t+\"') method was called on an element that is not using Select2.\"),n=e[t].apply(e,s)}),-1<a.indexOf(t)?this:n}),null==i.fn.select2.defaults&&(i.fn.select2.defaults=t),r}),{define:u.define,require:u.require});function b(e,t){return i.call(e,t)}function l(e,t){var n,s,i,r,o,a,l,c,u,d,p=t&&t.split(\"/\"),h=y.map,f=h&&h[\"*\"]||{};if(e){for(t=(e=e.split(\"/\")).length-1,y.nodeIdCompat&&_.test(e[t])&&(e[t]=e[t].replace(_,\"\")),\".\"===e[0].charAt(0)&&p&&(e=p.slice(0,p.length-1).concat(e)),c=0;c<e.length;c++)\".\"===(d=e[c])?(e.splice(c,1),--c):\"..\"===d&&(0===c||1===c&&\"..\"===e[2]||\"..\"===e[c-1]||0<c&&(e.splice(c-1,2),c-=2));e=e.join(\"/\")}if((p||f)&&h){for(c=(n=e.split(\"/\")).length;0<c;--c){if(s=n.slice(0,c).join(\"/\"),p)for(u=p.length;0<u;--u)if(i=h[p.slice(0,u).join(\"/\")],i=i&&i[s]){r=i,o=c;break}if(r)break;!a&&f&&f[s]&&(a=f[s],l=c)}!r&&a&&(r=a,o=l),r&&(n.splice(0,o,r),e=n.join(\"/\"))}return e}function w(t,n){return function(){var e=a.call(arguments,0);return\"string\"!=typeof e[0]&&1===e.length&&e.push(null),o.apply(p,e.concat([t,n]))}}function x(e){var t;if(b(m,e)&&(t=m[e],delete m[e],v[e]=!0,r.apply(p,t)),!b(g,e)&&!b(v,e))throw new Error(\"No \"+e);return g[e]}function c(e){var t,n=e?e.indexOf(\"!\"):-1;return-1<n&&(t=e.substring(0,n),e=e.substring(n+1,e.length)),[t,e]}function A(e){return e?c(e):[]}var u=s.require(\"jquery.select2\");return t.fn.select2.amd=s,u});","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?e(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],e):e((t=\"undefined\"!=typeof globalThis?globalThis:t||self).noUiSlider={})}(this,function(ot){\"use strict\";function n(t){return\"object\"==typeof t&&\"function\"==typeof t.to}function st(t){t.parentElement.removeChild(t)}function at(t){return null!=t}function lt(t){t.preventDefault()}function i(t){return\"number\"==typeof t&&!isNaN(t)&&isFinite(t)}function ut(t,e,r){0<r&&(ft(t,e),setTimeout(function(){dt(t,e)},r))}function ct(t){return Math.max(Math.min(t,100),0)}function pt(t){return Array.isArray(t)?t:[t]}function e(t){t=(t=String(t)).split(\".\");return 1<t.length?t[1].length:0}function ft(t,e){t.classList&&!/\\s/.test(e)?t.classList.add(e):t.className+=\" \"+e}function dt(t,e){t.classList&&!/\\s/.test(e)?t.classList.remove(e):t.className=t.className.replace(new RegExp(\"(^|\\\\b)\"+e.split(\" \").join(\"|\")+\"(\\\\b|$)\",\"gi\"),\" \")}function ht(t){var e=void 0!==window.pageXOffset,r=\"CSS1Compat\"===(t.compatMode||\"\");return{x:e?window.pageXOffset:(r?t.documentElement:t.body).scrollLeft,y:e?window.pageYOffset:(r?t.documentElement:t.body).scrollTop}}function s(t,e){return 100/(e-t)}function a(t,e,r){return 100*e/(t[r+1]-t[r])}function l(t,e){for(var r=1;t>=e[r];)r+=1;return r}function r(t,e,r){if(r>=t.slice(-1)[0])return 100;var n=l(r,t),i=t[n-1],o=t[n],t=e[n-1],n=e[n];return t+(r=r,a(o=[i,o],o[0]<0?r+Math.abs(o[0]):r-o[0],0)/s(t,n))}function o(t,e,r,n){if(100===n)return n;var i=l(n,t),o=t[i-1],s=t[i];return r?(s-o)/2<n-o?s:o:e[i-1]?t[i-1]+(t=n-t[i-1],i=e[i-1],Math.round(t/i)*i):n}ot.PipsMode=void 0,(H=ot.PipsMode||(ot.PipsMode={})).Range=\"range\",H.Steps=\"steps\",H.Positions=\"positions\",H.Count=\"count\",H.Values=\"values\",ot.PipsType=void 0,(H=ot.PipsType||(ot.PipsType={}))[H.None=-1]=\"None\",H[H.NoValue=0]=\"NoValue\",H[H.LargeValue=1]=\"LargeValue\",H[H.SmallValue=2]=\"SmallValue\";var u=(t.prototype.getDistance=function(t){for(var e=[],r=0;r<this.xNumSteps.length-1;r++)e[r]=a(this.xVal,t,r);return e},t.prototype.getAbsoluteDistance=function(t,e,r){var n=0;if(t<this.xPct[this.xPct.length-1])for(;t>this.xPct[n+1];)n++;else t===this.xPct[this.xPct.length-1]&&(n=this.xPct.length-2);r||t!==this.xPct[n+1]||n++;for(var i,o=1,s=(e=null===e?[]:e)[n],a=0,l=0,u=0,c=r?(t-this.xPct[n])/(this.xPct[n+1]-this.xPct[n]):(this.xPct[n+1]-t)/(this.xPct[n+1]-this.xPct[n]);0<s;)i=this.xPct[n+1+u]-this.xPct[n+u],100<e[n+u]*o+100-100*c?(a=i*c,o=(s-100*c)/e[n+u],c=1):(a=e[n+u]*i/100*o,o=0),r?(l-=a,1<=this.xPct.length+u&&u--):(l+=a,1<=this.xPct.length-u&&u++),s=e[n+u]*o;return t+l},t.prototype.toStepping=function(t){return t=r(this.xVal,this.xPct,t)},t.prototype.fromStepping=function(t){return function(t,e,r){if(100<=r)return t.slice(-1)[0];var n=l(r,e),i=t[n-1],o=t[n],t=e[n-1],n=e[n];return(r-t)*s(t,n)*((o=[i,o])[1]-o[0])/100+o[0]}(this.xVal,this.xPct,t)},t.prototype.getStep=function(t){return t=o(this.xPct,this.xSteps,this.snap,t)},t.prototype.getDefaultStep=function(t,e,r){var n=l(t,this.xPct);return(100===t||e&&t===this.xPct[n-1])&&(n=Math.max(n-1,1)),(this.xVal[n]-this.xVal[n-1])/r},t.prototype.getNearbySteps=function(t){t=l(t,this.xPct);return{stepBefore:{startValue:this.xVal[t-2],step:this.xNumSteps[t-2],highestStep:this.xHighestCompleteStep[t-2]},thisStep:{startValue:this.xVal[t-1],step:this.xNumSteps[t-1],highestStep:this.xHighestCompleteStep[t-1]},stepAfter:{startValue:this.xVal[t],step:this.xNumSteps[t],highestStep:this.xHighestCompleteStep[t]}}},t.prototype.countStepDecimals=function(){var t=this.xNumSteps.map(e);return Math.max.apply(null,t)},t.prototype.hasNoSize=function(){return this.xVal[0]===this.xVal[this.xVal.length-1]},t.prototype.convert=function(t){return this.getStep(this.toStepping(t))},t.prototype.handleEntryPoint=function(t,e){t=\"min\"===t?0:\"max\"===t?100:parseFloat(t);if(!i(t)||!i(e[0]))throw new Error(\"noUiSlider: 'range' value isn't numeric.\");this.xPct.push(t),this.xVal.push(e[0]);e=Number(e[1]);t?this.xSteps.push(!isNaN(e)&&e):isNaN(e)||(this.xSteps[0]=e),this.xHighestCompleteStep.push(0)},t.prototype.handleStepPoint=function(t,e){e&&(this.xVal[t]!==this.xVal[t+1]?(this.xSteps[t]=a([this.xVal[t],this.xVal[t+1]],e,0)/s(this.xPct[t],this.xPct[t+1]),e=(this.xVal[t+1]-this.xVal[t])/this.xNumSteps[t],e=Math.ceil(Number(e.toFixed(3))-1),e=this.xVal[t]+this.xNumSteps[t]*e,this.xHighestCompleteStep[t]=e):this.xSteps[t]=this.xHighestCompleteStep[t]=this.xVal[t])},t);function t(e,t,r){var n;this.xPct=[],this.xVal=[],this.xSteps=[],this.xNumSteps=[],this.xHighestCompleteStep=[],this.xSteps=[r||!1],this.xNumSteps=[!1],this.snap=t;var i=[];for(Object.keys(e).forEach(function(t){i.push([pt(e[t]),t])}),i.sort(function(t,e){return t[0][0]-e[0][0]}),n=0;n<i.length;n++)this.handleEntryPoint(i[n][1],i[n][0]);for(this.xNumSteps=this.xSteps.slice(0),n=0;n<this.xNumSteps.length;n++)this.handleStepPoint(n,this.xNumSteps[n])}var c={to:function(t){return void 0===t?\"\":t.toFixed(2)},from:Number},p={target:\"target\",base:\"base\",origin:\"origin\",handle:\"handle\",handleLower:\"handle-lower\",handleUpper:\"handle-upper\",touchArea:\"touch-area\",horizontal:\"horizontal\",vertical:\"vertical\",background:\"background\",connect:\"connect\",connects:\"connects\",ltr:\"ltr\",rtl:\"rtl\",textDirectionLtr:\"txt-dir-ltr\",textDirectionRtl:\"txt-dir-rtl\",draggable:\"draggable\",drag:\"state-drag\",tap:\"state-tap\",active:\"active\",tooltip:\"tooltip\",pips:\"pips\",pipsHorizontal:\"pips-horizontal\",pipsVertical:\"pips-vertical\",marker:\"marker\",markerHorizontal:\"marker-horizontal\",markerVertical:\"marker-vertical\",markerNormal:\"marker-normal\",markerLarge:\"marker-large\",markerSub:\"marker-sub\",value:\"value\",valueHorizontal:\"value-horizontal\",valueVertical:\"value-vertical\",valueNormal:\"value-normal\",valueLarge:\"value-large\",valueSub:\"value-sub\"},mt={tooltips:\".__tooltips\",aria:\".__aria\"};function f(t,e){if(!i(e))throw new Error(\"noUiSlider: 'step' is not numeric.\");t.singleStep=e}function d(t,e){if(!i(e))throw new Error(\"noUiSlider: 'keyboardPageMultiplier' is not numeric.\");t.keyboardPageMultiplier=e}function h(t,e){if(!i(e))throw new Error(\"noUiSlider: 'keyboardMultiplier' is not numeric.\");t.keyboardMultiplier=e}function m(t,e){if(!i(e))throw new Error(\"noUiSlider: 'keyboardDefaultStep' is not numeric.\");t.keyboardDefaultStep=e}function g(t,e){if(\"object\"!=typeof e||Array.isArray(e))throw new Error(\"noUiSlider: 'range' is not an object.\");if(void 0===e.min||void 0===e.max)throw new Error(\"noUiSlider: Missing 'min' or 'max' in 'range'.\");t.spectrum=new u(e,t.snap||!1,t.singleStep)}function v(t,e){if(e=pt(e),!Array.isArray(e)||!e.length)throw new Error(\"noUiSlider: 'start' option is incorrect.\");t.handles=e.length,t.start=e}function b(t,e){if(\"boolean\"!=typeof e)throw new Error(\"noUiSlider: 'snap' option must be a boolean.\");t.snap=e}function S(t,e){if(\"boolean\"!=typeof e)throw new Error(\"noUiSlider: 'animate' option must be a boolean.\");t.animate=e}function x(t,e){if(\"number\"!=typeof e)throw new Error(\"noUiSlider: 'animationDuration' option must be a number.\");t.animationDuration=e}function y(t,e){var r,n=[!1];if(\"lower\"===e?e=[!0,!1]:\"upper\"===e&&(e=[!1,!0]),!0===e||!1===e){for(r=1;r<t.handles;r++)n.push(e);n.push(!1)}else{if(!Array.isArray(e)||!e.length||e.length!==t.handles+1)throw new Error(\"noUiSlider: 'connect' option doesn't match handle count.\");n=e}t.connect=n}function w(t,e){switch(e){case\"horizontal\":t.ort=0;break;case\"vertical\":t.ort=1;break;default:throw new Error(\"noUiSlider: 'orientation' option is invalid.\")}}function E(t,e){if(!i(e))throw new Error(\"noUiSlider: 'margin' option must be numeric.\");0!==e&&(t.margin=t.spectrum.getDistance(e))}function P(t,e){if(!i(e))throw new Error(\"noUiSlider: 'limit' option must be numeric.\");if(t.limit=t.spectrum.getDistance(e),!t.limit||t.handles<2)throw new Error(\"noUiSlider: 'limit' option is only supported on linear sliders with 2 or more handles.\")}function C(t,e){var r;if(!i(e)&&!Array.isArray(e))throw new Error(\"noUiSlider: 'padding' option must be numeric or array of exactly 2 numbers.\");if(Array.isArray(e)&&2!==e.length&&!i(e[0])&&!i(e[1]))throw new Error(\"noUiSlider: 'padding' option must be numeric or array of exactly 2 numbers.\");if(0!==e){for(Array.isArray(e)||(e=[e,e]),t.padding=[t.spectrum.getDistance(e[0]),t.spectrum.getDistance(e[1])],r=0;r<t.spectrum.xNumSteps.length-1;r++)if(t.padding[0][r]<0||t.padding[1][r]<0)throw new Error(\"noUiSlider: 'padding' option must be a positive number(s).\");var n=e[0]+e[1],e=t.spectrum.xVal[0];if(1<n/(t.spectrum.xVal[t.spectrum.xVal.length-1]-e))throw new Error(\"noUiSlider: 'padding' option must not exceed 100% of the range.\")}}function N(t,e){switch(e){case\"ltr\":t.dir=0;break;case\"rtl\":t.dir=1;break;default:throw new Error(\"noUiSlider: 'direction' option was not recognized.\")}}function V(t,e){if(\"string\"!=typeof e)throw new Error(\"noUiSlider: 'behaviour' must be a string containing options.\");var r=0<=e.indexOf(\"tap\"),n=0<=e.indexOf(\"drag\"),i=0<=e.indexOf(\"fixed\"),o=0<=e.indexOf(\"snap\"),s=0<=e.indexOf(\"hover\"),a=0<=e.indexOf(\"unconstrained\"),l=0<=e.indexOf(\"drag-all\"),e=0<=e.indexOf(\"smooth-steps\");if(i){if(2!==t.handles)throw new Error(\"noUiSlider: 'fixed' behaviour must be used with 2 handles\");E(t,t.start[1]-t.start[0])}if(a&&(t.margin||t.limit))throw new Error(\"noUiSlider: 'unconstrained' behaviour cannot be used with margin or limit\");t.events={tap:r||o,drag:n,dragAll:l,smoothSteps:e,fixed:i,snap:o,hover:s,unconstrained:a}}function A(t,e){if(!1!==e)if(!0===e||n(e)){t.tooltips=[];for(var r=0;r<t.handles;r++)t.tooltips.push(e)}else{if((e=pt(e)).length!==t.handles)throw new Error(\"noUiSlider: must pass a formatter for all handles.\");e.forEach(function(t){if(\"boolean\"!=typeof t&&!n(t))throw new Error(\"noUiSlider: 'tooltips' must be passed a formatter or 'false'.\")}),t.tooltips=e}}function k(t,e){if(e.length!==t.handles)throw new Error(\"noUiSlider: must pass a attributes for all handles.\");t.handleAttributes=e}function M(t,e){if(!n(e))throw new Error(\"noUiSlider: 'ariaFormat' requires 'to' method.\");t.ariaFormat=e}function U(t,e){if(!n(r=e)||\"function\"!=typeof r.from)throw new Error(\"noUiSlider: 'format' requires 'to' and 'from' methods.\");var r;t.format=e}function D(t,e){if(\"boolean\"!=typeof e)throw new Error(\"noUiSlider: 'keyboardSupport' option must be a boolean.\");t.keyboardSupport=e}function O(t,e){t.documentElement=e}function L(t,e){if(\"string\"!=typeof e&&!1!==e)throw new Error(\"noUiSlider: 'cssPrefix' must be a string or `false`.\");t.cssPrefix=e}function T(e,r){if(\"object\"!=typeof r)throw new Error(\"noUiSlider: 'cssClasses' must be an object.\");\"string\"==typeof e.cssPrefix?(e.cssClasses={},Object.keys(r).forEach(function(t){e.cssClasses[t]=e.cssPrefix+r[t]})):e.cssClasses=r}function gt(e){var r={margin:null,limit:null,padding:null,animate:!0,animationDuration:300,ariaFormat:c,format:c},n={step:{r:!1,t:f},keyboardPageMultiplier:{r:!1,t:d},keyboardMultiplier:{r:!1,t:h},keyboardDefaultStep:{r:!1,t:m},start:{r:!0,t:v},connect:{r:!0,t:y},direction:{r:!0,t:N},snap:{r:!1,t:b},animate:{r:!1,t:S},animationDuration:{r:!1,t:x},range:{r:!0,t:g},orientation:{r:!1,t:w},margin:{r:!1,t:E},limit:{r:!1,t:P},padding:{r:!1,t:C},behaviour:{r:!0,t:V},ariaFormat:{r:!1,t:M},format:{r:!1,t:U},tooltips:{r:!1,t:A},keyboardSupport:{r:!0,t:D},documentElement:{r:!1,t:O},cssPrefix:{r:!0,t:L},cssClasses:{r:!0,t:T},handleAttributes:{r:!1,t:k}},i={connect:!1,direction:\"ltr\",behaviour:\"tap\",orientation:\"horizontal\",keyboardSupport:!0,cssPrefix:\"noUi-\",cssClasses:p,keyboardPageMultiplier:5,keyboardMultiplier:1,keyboardDefaultStep:10};e.format&&!e.ariaFormat&&(e.ariaFormat=e.format),Object.keys(n).forEach(function(t){if(at(e[t])||void 0!==i[t])n[t].t(r,(at(e[t])?e:i)[t]);else if(n[t].r)throw new Error(\"noUiSlider: '\"+t+\"' is required.\")}),r.pips=e.pips;var t=document.createElement(\"div\"),o=void 0!==t.style.msTransform,t=void 0!==t.style.transform;r.transformRule=t?\"transform\":o?\"msTransform\":\"webkitTransform\";return r.style=[[\"left\",\"top\"],[\"right\",\"bottom\"]][r.dir][r.ort],r}function j(t,f,o){var i,l,a,n,s,u,c=window.navigator.pointerEnabled?{start:\"pointerdown\",move:\"pointermove\",end:\"pointerup\"}:window.navigator.msPointerEnabled?{start:\"MSPointerDown\",move:\"MSPointerMove\",end:\"MSPointerUp\"}:{start:\"mousedown touchstart\",move:\"mousemove touchmove\",end:\"mouseup touchend\"},p=window.CSS&&CSS.supports&&CSS.supports(\"touch-action\",\"none\")&&function(){var t=!1;try{var e=Object.defineProperty({},\"passive\",{get:function(){t=!0}});window.addEventListener(\"test\",null,e)}catch(t){}return t}(),d=t,S=f.spectrum,h=[],m=[],g=[],v=0,b={},x=t.ownerDocument,y=f.documentElement||x.documentElement,w=x.body,E=\"rtl\"===x.dir||1===f.ort?0:100;function P(t,e){var r=x.createElement(\"div\");return e&&ft(r,e),t.appendChild(r),r}function C(t,e){var r,t=P(t,f.cssClasses.origin),n=P(t,f.cssClasses.handle);return P(n,f.cssClasses.touchArea),n.setAttribute(\"data-handle\",String(e)),f.keyboardSupport&&(n.setAttribute(\"tabindex\",\"0\"),n.addEventListener(\"keydown\",function(t){return function(t,e){if(V()||A(e))return!1;var r=[\"Left\",\"Right\"],n=[\"Down\",\"Up\"],i=[\"PageDown\",\"PageUp\"],o=[\"Home\",\"End\"];f.dir&&!f.ort?r.reverse():f.ort&&!f.dir&&(n.reverse(),i.reverse());var s=t.key.replace(\"Arrow\",\"\"),a=s===i[0],l=s===i[1],i=s===n[0]||s===r[0]||a,n=s===n[1]||s===r[1]||l,r=s===o[0],o=s===o[1];if(!(i||n||r||o))return!0;if(t.preventDefault(),n||i){var u=i?0:1,u=nt(e)[u];if(null===u)return!1;!1===u&&(u=S.getDefaultStep(m[e],i,f.keyboardDefaultStep)),u*=l||a?f.keyboardPageMultiplier:f.keyboardMultiplier,u=Math.max(u,1e-7),u*=i?-1:1,u=h[e]+u}else u=o?f.spectrum.xVal[f.spectrum.xVal.length-1]:f.spectrum.xVal[0];return Q(e,S.toStepping(u),!0,!0),I(\"slide\",e),I(\"update\",e),I(\"change\",e),I(\"set\",e),!1}(t,e)})),void 0!==f.handleAttributes&&(r=f.handleAttributes[e],Object.keys(r).forEach(function(t){n.setAttribute(t,r[t])})),n.setAttribute(\"role\",\"slider\"),n.setAttribute(\"aria-orientation\",f.ort?\"vertical\":\"horizontal\"),0===e?ft(n,f.cssClasses.handleLower):e===f.handles-1&&ft(n,f.cssClasses.handleUpper),t.handle=n,t}function N(t,e){return!!e&&P(t,f.cssClasses.connect)}function e(t,e){return!(!f.tooltips||!f.tooltips[e])&&P(t.firstChild,f.cssClasses.tooltip)}function V(){return d.hasAttribute(\"disabled\")}function A(t){return l[t].hasAttribute(\"disabled\")}function k(){s&&(Y(\"update\"+mt.tooltips),s.forEach(function(t){t&&st(t)}),s=null)}function M(){k(),s=l.map(e),X(\"update\"+mt.tooltips,function(t,e,r){s&&f.tooltips&&!1!==s[e]&&(t=t[e],!0!==f.tooltips[e]&&(t=f.tooltips[e].to(r[e])),s[e].innerHTML=t)})}function U(t,e){return t.map(function(t){return S.fromStepping(e?S.getStep(t):t)})}function D(d){var h=function(t){if(t.mode===ot.PipsMode.Range||t.mode===ot.PipsMode.Steps)return S.xVal;if(t.mode!==ot.PipsMode.Count)return t.mode===ot.PipsMode.Positions?U(t.values,t.stepped):t.mode===ot.PipsMode.Values?t.stepped?t.values.map(function(t){return S.fromStepping(S.getStep(S.toStepping(t)))}):t.values:[];if(t.values<2)throw new Error(\"noUiSlider: 'values' (>= 2) required for mode 'count'.\");for(var e=t.values-1,r=100/e,n=[];e--;)n[e]=e*r;return n.push(100),U(n,t.stepped)}(d),m={},t=S.xVal[0],e=S.xVal[S.xVal.length-1],g=!1,v=!1,b=0;return(h=h.slice().sort(function(t,e){return t-e}).filter(function(t){return!this[t]&&(this[t]=!0)},{}))[0]!==t&&(h.unshift(t),g=!0),h[h.length-1]!==e&&(h.push(e),v=!0),h.forEach(function(t,e){var r,n,i,o,s,a,l,u,t=t,c=h[e+1],p=d.mode===ot.PipsMode.Steps,f=(f=p?S.xNumSteps[e]:f)||c-t;for(void 0===c&&(c=t),f=Math.max(f,1e-7),r=t;r<=c;r=Number((r+f).toFixed(7))){for(a=(o=(i=S.toStepping(r))-b)/(d.density||1),u=o/(l=Math.round(a)),n=1;n<=l;n+=1)m[(s=b+n*u).toFixed(5)]=[S.fromStepping(s),0];a=-1<h.indexOf(r)?ot.PipsType.LargeValue:p?ot.PipsType.SmallValue:ot.PipsType.NoValue,!e&&g&&r!==c&&(a=0),r===c&&v||(m[i.toFixed(5)]=[r,a]),b=i}}),m}function O(i,o,s){var t,a=x.createElement(\"div\"),n=((t={})[ot.PipsType.None]=\"\",t[ot.PipsType.NoValue]=f.cssClasses.valueNormal,t[ot.PipsType.LargeValue]=f.cssClasses.valueLarge,t[ot.PipsType.SmallValue]=f.cssClasses.valueSub,t),l=((t={})[ot.PipsType.None]=\"\",t[ot.PipsType.NoValue]=f.cssClasses.markerNormal,t[ot.PipsType.LargeValue]=f.cssClasses.markerLarge,t[ot.PipsType.SmallValue]=f.cssClasses.markerSub,t),u=[f.cssClasses.valueHorizontal,f.cssClasses.valueVertical],c=[f.cssClasses.markerHorizontal,f.cssClasses.markerVertical];function p(t,e){var r=e===f.cssClasses.value;return e+\" \"+(r?u:c)[f.ort]+\" \"+(r?n:l)[t]}return ft(a,f.cssClasses.pips),ft(a,0===f.ort?f.cssClasses.pipsHorizontal:f.cssClasses.pipsVertical),Object.keys(i).forEach(function(t){var e,r,n;r=i[e=t][0],n=i[t][1],(n=o?o(r,n):n)!==ot.PipsType.None&&((t=P(a,!1)).className=p(n,f.cssClasses.marker),t.style[f.style]=e+\"%\",n>ot.PipsType.NoValue&&((t=P(a,!1)).className=p(n,f.cssClasses.value),t.setAttribute(\"data-value\",String(r)),t.style[f.style]=e+\"%\",t.innerHTML=String(s.to(r))))}),a}function L(){n&&(st(n),n=null)}function T(t){L();var e=D(t),r=t.filter,t=t.format||{to:function(t){return String(Math.round(t))}};return n=d.appendChild(O(e,r,t))}function j(){var t=i.getBoundingClientRect(),e=\"offset\"+[\"Width\",\"Height\"][f.ort];return 0===f.ort?t.width||i[e]:t.height||i[e]}function z(n,i,o,s){function e(t){var e,r=function(e,t,r){var n=0===e.type.indexOf(\"touch\"),i=0===e.type.indexOf(\"mouse\"),o=0===e.type.indexOf(\"pointer\"),s=0,a=0;0===e.type.indexOf(\"MSPointer\")&&(o=!0);if(\"mousedown\"===e.type&&!e.buttons&&!e.touches)return!1;if(n){var l=function(t){t=t.target;return t===r||r.contains(t)||e.composed&&e.composedPath().shift()===r};if(\"touchstart\"===e.type){n=Array.prototype.filter.call(e.touches,l);if(1<n.length)return!1;s=n[0].pageX,a=n[0].pageY}else{l=Array.prototype.find.call(e.changedTouches,l);if(!l)return!1;s=l.pageX,a=l.pageY}}t=t||ht(x),(i||o)&&(s=e.clientX+t.x,a=e.clientY+t.y);return e.pageOffset=t,e.points=[s,a],e.cursor=i||o,e}(t,s.pageOffset,s.target||i);return!!r&&(!(V()&&!s.doNotReject)&&(e=d,t=f.cssClasses.tap,!((e.classList?e.classList.contains(t):new RegExp(\"\\\\b\"+t+\"\\\\b\").test(e.className))&&!s.doNotReject)&&(!(n===c.start&&void 0!==r.buttons&&1<r.buttons)&&((!s.hover||!r.buttons)&&(p||r.preventDefault(),r.calcPoint=r.points[f.ort],void o(r,s))))))}var r=[];return n.split(\" \").forEach(function(t){i.addEventListener(t,e,!!p&&{passive:!0}),r.push([t,e])}),r}function H(t){var e,r,n=ct(n=100*(t-(n=i,e=f.ort,r=n.getBoundingClientRect(),n=(t=n.ownerDocument).documentElement,t=ht(t),/webkit.*Chrome.*Mobile/i.test(navigator.userAgent)&&(t.x=0),e?r.top+t.y-n.clientTop:r.left+t.x-n.clientLeft))/j());return f.dir?100-n:n}function F(t,e){\"mouseout\"===t.type&&\"HTML\"===t.target.nodeName&&null===t.relatedTarget&&_(t,e)}function R(t,e){if(-1===navigator.appVersion.indexOf(\"MSIE 9\")&&0===t.buttons&&0!==e.buttonsProperty)return _(t,e);t=(f.dir?-1:1)*(t.calcPoint-e.startCalcPoint);G(0<t,100*t/e.baseSize,e.locations,e.handleNumbers,e.connect)}function _(t,e){e.handle&&(dt(e.handle,f.cssClasses.active),--v),e.listeners.forEach(function(t){y.removeEventListener(t[0],t[1])}),0===v&&(dt(d,f.cssClasses.drag),K(),t.cursor&&(w.style.cursor=\"\",w.removeEventListener(\"selectstart\",lt))),f.events.smoothSteps&&(e.handleNumbers.forEach(function(t){Q(t,m[t],!0,!0,!1,!1)}),e.handleNumbers.forEach(function(t){I(\"update\",t)})),e.handleNumbers.forEach(function(t){I(\"change\",t),I(\"set\",t),I(\"end\",t)})}function B(t,e){var r,n,i,o;e.handleNumbers.some(A)||(1===e.handleNumbers.length&&(o=l[e.handleNumbers[0]].children[0],v+=1,ft(o,f.cssClasses.active)),t.stopPropagation(),n=z(c.move,y,R,{target:t.target,handle:o,connect:e.connect,listeners:r=[],startCalcPoint:t.calcPoint,baseSize:j(),pageOffset:t.pageOffset,handleNumbers:e.handleNumbers,buttonsProperty:t.buttons,locations:m.slice()}),i=z(c.end,y,_,{target:t.target,handle:o,listeners:r,doNotReject:!0,handleNumbers:e.handleNumbers}),o=z(\"mouseout\",y,F,{target:t.target,handle:o,listeners:r,doNotReject:!0,handleNumbers:e.handleNumbers}),r.push.apply(r,n.concat(i,o)),t.cursor&&(w.style.cursor=getComputedStyle(t.target).cursor,1<l.length&&ft(d,f.cssClasses.drag),w.addEventListener(\"selectstart\",lt,!1)),e.handleNumbers.forEach(function(t){I(\"start\",t)}))}function r(t){t.stopPropagation();var i,o,s,e=H(t.calcPoint),r=(i=e,s=!(o=100),l.forEach(function(t,e){var r,n;A(e)||(r=m[e],((n=Math.abs(r-i))<o||n<=o&&r<i||100===n&&100===o)&&(s=e,o=n))}),s);!1!==r&&(f.events.snap||ut(d,f.cssClasses.tap,f.animationDuration),Q(r,e,!0,!0),K(),I(\"slide\",r,!0),I(\"update\",r,!0),f.events.snap?B(t,{handleNumbers:[r]}):(I(\"change\",r,!0),I(\"set\",r,!0)))}function q(t){var t=H(t.calcPoint),t=S.getStep(t),e=S.fromStepping(t);Object.keys(b).forEach(function(t){\"hover\"===t.split(\".\")[0]&&b[t].forEach(function(t){t.call(it,e)})})}function X(t,e){b[t]=b[t]||[],b[t].push(e),\"update\"===t.split(\".\")[0]&&l.forEach(function(t,e){I(\"update\",e)})}function Y(t){var n=t&&t.split(\".\")[0],i=n?t.substring(n.length):t;Object.keys(b).forEach(function(t){var e=t.split(\".\")[0],r=t.substring(e.length);n&&n!==e||i&&i!==r||((e=r)!==mt.aria&&e!==mt.tooltips||i===r)&&delete b[t]})}function I(r,n,i){Object.keys(b).forEach(function(t){var e=t.split(\".\")[0];r===e&&b[t].forEach(function(t){t.call(it,h.map(f.format.to),n,h.slice(),i||!1,m.slice(),it)})})}function W(t,e,r,n,i,o,s){var a;return 1<l.length&&!f.events.unconstrained&&(n&&0<e&&(a=S.getAbsoluteDistance(t[e-1],f.margin,!1),r=Math.max(r,a)),i&&e<l.length-1&&(a=S.getAbsoluteDistance(t[e+1],f.margin,!0),r=Math.min(r,a))),1<l.length&&f.limit&&(n&&0<e&&(a=S.getAbsoluteDistance(t[e-1],f.limit,!1),r=Math.min(r,a)),i&&e<l.length-1&&(a=S.getAbsoluteDistance(t[e+1],f.limit,!0),r=Math.max(r,a))),f.padding&&(0===e&&(a=S.getAbsoluteDistance(0,f.padding[0],!1),r=Math.max(r,a)),e===l.length-1&&(a=S.getAbsoluteDistance(100,f.padding[1],!0),r=Math.min(r,a))),!((r=ct(r=!s?S.getStep(r):r))===t[e]&&!o)&&r}function $(t,e){var r=f.ort;return(r?e:t)+\", \"+(r?t:e)}function G(t,r,n,e,i){var o=n.slice(),s=e[0],a=f.events.smoothSteps,l=[!t,t],u=[t,!t];e=e.slice(),t&&e.reverse(),1<e.length?e.forEach(function(t,e){e=W(o,t,o[t]+r,l[e],u[e],!1,a);!1===e?r=0:(r=e-o[t],o[t]=e)}):l=u=[!0];var c=!1;e.forEach(function(t,e){c=Q(t,n[t]+r,l[e],u[e],!1,a)||c}),c&&(e.forEach(function(t){I(\"update\",t),I(\"slide\",t)}),null!=i&&I(\"drag\",s))}function J(t,e){return f.dir?100-t-e:t}function K(){g.forEach(function(t){var e=50<m[t]?-1:1,e=3+(l.length+e*t);l[t].style.zIndex=String(e)})}function Q(t,e,r,n,i,o){return!1!==(e=i?e:W(m,t,e,r,n,!1,o))&&(e=e,m[t=t]=e,h[t]=S.fromStepping(e),e=\"translate(\"+$(J(e,0)-E+\"%\",\"0\")+\")\",l[t].style[f.transformRule]=e,Z(t),Z(t+1),!0)}function Z(t){var e,r;a[t]&&(r=100,e=\"translate(\"+$(J(e=(e=0)!==t?m[t-1]:e,r=(r=t!==a.length-1?m[t]:r)-e)+\"%\",\"0\")+\")\",r=\"scale(\"+$(r/100,\"1\")+\")\",a[t].style[f.transformRule]=e+\" \"+r)}function tt(t,e){return null===t||!1===t||void 0===t?m[e]:(\"number\"==typeof t&&(t=String(t)),!1===(t=!1!==(t=f.format.from(t))?S.toStepping(t):t)||isNaN(t)?m[e]:t)}function et(t,e,r){var n=pt(t),t=void 0===m[0];e=void 0===e||e,f.animate&&!t&&ut(d,f.cssClasses.tap,f.animationDuration),g.forEach(function(t){Q(t,tt(n[t],t),!0,!1,r)});var i,o=1===g.length?0:1;for(t&&S.hasNoSize()&&(r=!0,m[0]=0,1<g.length&&(i=100/(g.length-1),g.forEach(function(t){m[t]=t*i})));o<g.length;++o)g.forEach(function(t){Q(t,m[t],!0,!0,r)});K(),g.forEach(function(t){I(\"update\",t),null!==n[t]&&e&&I(\"set\",t)})}function rt(t){if(t=void 0===t?!1:t)return 1===h.length?h[0]:h.slice(0);t=h.map(f.format.to);return 1===t.length?t[0]:t}function nt(t){var e=m[t],r=S.getNearbySteps(e),n=h[t],i=r.thisStep.step,t=null;if(f.snap)return[n-r.stepBefore.startValue||null,r.stepAfter.startValue-n||null];!1!==i&&n+i>r.stepAfter.startValue&&(i=r.stepAfter.startValue-n),t=n>r.thisStep.startValue?r.thisStep.step:!1!==r.stepBefore.step&&n-r.stepBefore.highestStep,100===e?i=null:0===e&&(t=null);e=S.countStepDecimals();return null!==i&&!1!==i&&(i=Number(i.toFixed(e))),[t=null!==t&&!1!==t?Number(t.toFixed(e)):t,i]}ft(t=d,f.cssClasses.target),0===f.dir?ft(t,f.cssClasses.ltr):ft(t,f.cssClasses.rtl),0===f.ort?ft(t,f.cssClasses.horizontal):ft(t,f.cssClasses.vertical),ft(t,\"rtl\"===getComputedStyle(t).direction?f.cssClasses.textDirectionRtl:f.cssClasses.textDirectionLtr),i=P(t,f.cssClasses.base),function(t,e){var r=P(e,f.cssClasses.connects);l=[],(a=[]).push(N(r,t[0]));for(var n=0;n<f.handles;n++)l.push(C(e,n)),g[n]=n,a.push(N(r,t[n+1]))}(f.connect,i),(u=f.events).fixed||l.forEach(function(t,e){z(c.start,t.children[0],B,{handleNumbers:[e]})}),u.tap&&z(c.start,i,r,{}),u.hover&&z(c.move,i,q,{hover:!0}),u.drag&&a.forEach(function(e,t){var r,n,i,o,s;!1!==e&&0!==t&&t!==a.length-1&&(r=l[t-1],n=l[t],i=[e],o=[r,n],s=[t-1,t],ft(e,f.cssClasses.draggable),u.fixed&&(i.push(r.children[0]),i.push(n.children[0])),u.dragAll&&(o=l,s=g),i.forEach(function(t){z(c.start,t,B,{handles:o,handleNumbers:s,connect:e})}))}),et(f.start),f.pips&&T(f.pips),f.tooltips&&M(),Y(\"update\"+mt.aria),X(\"update\"+mt.aria,function(t,e,o,r,s){g.forEach(function(t){var e=l[t],r=W(m,t,0,!0,!0,!0),n=W(m,t,100,!0,!0,!0),i=s[t],t=String(f.ariaFormat.to(o[t])),r=S.fromStepping(r).toFixed(1),n=S.fromStepping(n).toFixed(1),i=S.fromStepping(i).toFixed(1);e.children[0].setAttribute(\"aria-valuemin\",r),e.children[0].setAttribute(\"aria-valuemax\",n),e.children[0].setAttribute(\"aria-valuenow\",i),e.children[0].setAttribute(\"aria-valuetext\",t)})});var it={destroy:function(){for(Y(mt.aria),Y(mt.tooltips),Object.keys(f.cssClasses).forEach(function(t){dt(d,f.cssClasses[t])});d.firstChild;)d.removeChild(d.firstChild);delete d.noUiSlider},steps:function(){return g.map(nt)},on:X,off:Y,get:rt,set:et,setHandle:function(t,e,r,n){if(!(0<=(t=Number(t))&&t<g.length))throw new Error(\"noUiSlider: invalid handle number, got: \"+t);Q(t,tt(e,t),!0,!0,n),I(\"update\",t),r&&I(\"set\",t)},reset:function(t){et(f.start,t)},disable:function(t){null!=t?(l[t].setAttribute(\"disabled\",\"\"),l[t].handle.removeAttribute(\"tabindex\")):(d.setAttribute(\"disabled\",\"\"),l.forEach(function(t){t.handle.removeAttribute(\"tabindex\")}))},enable:function(t){null!=t?(l[t].removeAttribute(\"disabled\"),l[t].handle.setAttribute(\"tabindex\",\"0\")):(d.removeAttribute(\"disabled\"),l.forEach(function(t){t.removeAttribute(\"disabled\"),t.handle.setAttribute(\"tabindex\",\"0\")}))},__moveHandles:function(t,e,r){G(t,e,m,r)},options:o,updateOptions:function(e,t){var r=rt(),n=[\"margin\",\"limit\",\"padding\",\"range\",\"animate\",\"snap\",\"step\",\"format\",\"pips\",\"tooltips\"];n.forEach(function(t){void 0!==e[t]&&(o[t]=e[t])});var i=gt(o);n.forEach(function(t){void 0!==e[t]&&(f[t]=i[t])}),S=i.spectrum,f.margin=i.margin,f.limit=i.limit,f.padding=i.padding,f.pips?T(f.pips):L(),(f.tooltips?M:k)(),m=[],et(at(e.start)?e.start:r,t)},target:d,removePips:L,removeTooltips:k,getPositions:function(){return m.slice()},getTooltips:function(){return s},getOrigins:function(){return l},pips:T};return it}function z(t,e){if(!t||!t.nodeName)throw new Error(\"noUiSlider: create requires a single element, got: \"+t);if(t.noUiSlider)throw new Error(\"noUiSlider: Slider was already initialized.\");e=j(t,gt(e),e);return t.noUiSlider=e}var H={__spectrum:u,cssClasses:p,create:z};ot.create=z,ot.cssClasses=p,ot.default=H,Object.defineProperty(ot,\"__esModule\",{value:!0})});","!function(e){\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?module.exports=e():window.wNumb=e()}(function(){\"use strict\";var o=[\"decimals\",\"thousand\",\"mark\",\"prefix\",\"suffix\",\"encoder\",\"decoder\",\"negativeBefore\",\"negative\",\"edit\",\"undo\"];function w(e){return e.split(\"\").reverse().join(\"\")}function h(e,t){return e.substring(0,t.length)===t}function f(e,t,n){if((e[t]||e[n])&&e[t]===e[n])throw new Error(t)}function x(e){return\"number\"==typeof e&&isFinite(e)}function n(e,t,n,r,i,o,f,u,s,c,a,p){var d,l,h,g=p,v=\"\",m=\"\";return o&&(p=o(p)),!!x(p)&&(!1!==e&&0===parseFloat(p.toFixed(e))&&(p=0),p<0&&(d=!0,p=Math.abs(p)),!1!==e&&(p=function(e,t){return e=e.toString().split(\"e\"),(+((e=(e=Math.round(+(e[0]+\"e\"+(e[1]?+e[1]+t:t)))).toString().split(\"e\"))[0]+\"e\"+(e[1]?e[1]-t:-t))).toFixed(t)}(p,e)),-1!==(p=p.toString()).indexOf(\".\")?(h=(l=p.split(\".\"))[0],n&&(v=n+l[1])):h=p,t&&(h=w((h=w(h).match(/.{1,3}/g)).join(w(t)))),d&&u&&(m+=u),r&&(m+=r),d&&s&&(m+=s),m+=h,m+=v,i&&(m+=i),c&&(m=c(m,g)),m)}function r(e,t,n,r,i,o,f,u,s,c,a,p){var d,l=\"\";return a&&(p=a(p)),!(!p||\"string\"!=typeof p)&&(u&&h(p,u)&&(p=p.replace(u,\"\"),d=!0),r&&h(p,r)&&(p=p.replace(r,\"\")),s&&h(p,s)&&(p=p.replace(s,\"\"),d=!0),i&&function(e,t){return e.slice(-1*t.length)===t}(p,i)&&(p=p.slice(0,-1*i.length)),t&&(p=p.split(t).join(\"\")),n&&(p=p.replace(n,\".\")),d&&(l+=\"-\"),\"\"!==(l=(l+=p).replace(/[^0-9\\.\\-.]/g,\"\"))&&(l=Number(l),f&&(l=f(l)),!!x(l)&&l))}function i(e,t,n){var r,i=[];for(r=0;r<o.length;r+=1)i.push(e[o[r]]);return i.push(n),t.apply(\"\",i)}return function e(t){if(!(this instanceof e))return new e(t);\"object\"==typeof t&&(t=function(e){var t,n,r,i={};for(void 0===e.suffix&&(e.suffix=e.postfix),t=0;t<o.length;t+=1)if(void 0===(r=e[n=o[t]]))\"negative\"!==n||i.negativeBefore?\"mark\"===n&&\".\"!==i.thousand?i[n]=\".\":i[n]=!1:i[n]=\"-\";else if(\"decimals\"===n){if(!(0<=r&&r<8))throw new Error(n);i[n]=r}else if(\"encoder\"===n||\"decoder\"===n||\"edit\"===n||\"undo\"===n){if(\"function\"!=typeof r)throw new Error(n);i[n]=r}else{if(\"string\"!=typeof r)throw new Error(n);i[n]=r}return f(i,\"mark\",\"thousand\"),f(i,\"prefix\",\"negative\"),f(i,\"prefix\",\"negativeBefore\"),i}(t),this.to=function(e){return i(t,n,e)},this.from=function(e){return i(t,r,e)})}});","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e||self).autosize=t()}(this,function(){var e=new Map;function t(t){var o=e.get(t);o&&o.destroy()}function o(t){var o=e.get(t);o&&o.update()}var r=null;return\"undefined\"==typeof window?((r=function(e){return e}).destroy=function(e){return e},r.update=function(e){return e}):((r=function(t,o){return t&&Array.prototype.forEach.call(t.length?t:[t],function(t){return function(t){if(t&&t.nodeName&&\"TEXTAREA\"===t.nodeName&&!e.has(t)){var o,r=null,n=window.getComputedStyle(t),i=(o=t.value,function(){s({testForHeightReduction:\"\"===o||!t.value.startsWith(o),restoreTextAlign:null}),o=t.value}),l=function(o){t.removeEventListener(\"autosize:destroy\",l),t.removeEventListener(\"autosize:update\",a),t.removeEventListener(\"input\",i),window.removeEventListener(\"resize\",a),Object.keys(o).forEach(function(e){return t.style[e]=o[e]}),e.delete(t)}.bind(t,{height:t.style.height,resize:t.style.resize,textAlign:t.style.textAlign,overflowY:t.style.overflowY,overflowX:t.style.overflowX,wordWrap:t.style.wordWrap});t.addEventListener(\"autosize:destroy\",l),t.addEventListener(\"autosize:update\",a),t.addEventListener(\"input\",i),window.addEventListener(\"resize\",a),t.style.overflowX=\"hidden\",t.style.wordWrap=\"break-word\",e.set(t,{destroy:l,update:a}),a()}function s(e){var o,i,l=e.restoreTextAlign,a=void 0===l?null:l,d=e.testForHeightReduction,u=void 0===d||d,f=n.overflowY;if(0!==t.scrollHeight&&(\"vertical\"===n.resize?t.style.resize=\"none\":\"both\"===n.resize&&(t.style.resize=\"horizontal\"),u&&(o=function(e){for(var t=[];e&&e.parentNode&&e.parentNode instanceof Element;)e.parentNode.scrollTop&&t.push([e.parentNode,e.parentNode.scrollTop]),e=e.parentNode;return function(){return t.forEach(function(e){var t=e[0],o=e[1];t.style.scrollBehavior=\"auto\",t.scrollTop=o,t.style.scrollBehavior=null})}}(t),t.style.height=\"\"),i=\"content-box\"===n.boxSizing?t.scrollHeight-(parseFloat(n.paddingTop)+parseFloat(n.paddingBottom)):t.scrollHeight+parseFloat(n.borderTopWidth)+parseFloat(n.borderBottomWidth),\"none\"!==n.maxHeight&&i>parseFloat(n.maxHeight)?(\"hidden\"===n.overflowY&&(t.style.overflow=\"scroll\"),i=parseFloat(n.maxHeight)):\"hidden\"!==n.overflowY&&(t.style.overflow=\"hidden\"),t.style.height=i+\"px\",a&&(t.style.textAlign=a),o&&o(),r!==i&&(t.dispatchEvent(new Event(\"autosize:resized\",{bubbles:!0})),r=i),f!==n.overflow&&!a)){var c=n.textAlign;\"hidden\"===n.overflow&&(t.style.textAlign=\"start\"===c?\"end\":\"start\"),s({restoreTextAlign:c,testForHeightReduction:!0})}}function a(){s({testForHeightReduction:!0,restoreTextAlign:null})}}(t)}),t}).destroy=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],t),e},r.update=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],o),e}),r});\n","/*!\n * ApexCharts v3.37.3\n * (c) 2018-2023 ApexCharts\n * Released under the MIT License.\n */\n!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).ApexCharts=e()}(this,(function(){\"use strict\";function t(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,a)}return i}function e(e){for(var i=1;i<arguments.length;i++){var a=null!=arguments[i]?arguments[i]:{};i%2?t(Object(a),!0).forEach((function(t){o(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):t(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(t){return i=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},i(t)}function a(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function s(t,e){for(var i=0;i<e.length;i++){var a=e[i];a.enumerable=a.enumerable||!1,a.configurable=!0,\"value\"in a&&(a.writable=!0),Object.defineProperty(t,a.key,a)}}function r(t,e,i){return e&&s(t.prototype,e),i&&s(t,i),t}function o(t,e,i){return e in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function n(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function\");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&h(t,e)}function l(t){return l=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)},l(t)}function h(t,e){return h=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},h(t,e)}function c(t,e){if(e&&(\"object\"==typeof e||\"function\"==typeof e))return e;if(void 0!==e)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(t){if(void 0===t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return t}(t)}function d(t){var e=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}();return function(){var i,a=l(t);if(e){var s=l(this).constructor;i=Reflect.construct(a,arguments,s)}else i=a.apply(this,arguments);return c(this,i)}}function g(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var i=null==t?null:\"undefined\"!=typeof Symbol&&t[Symbol.iterator]||t[\"@@iterator\"];if(null==i)return;var a,s,r=[],o=!0,n=!1;try{for(i=i.call(t);!(o=(a=i.next()).done)&&(r.push(a.value),!e||r.length!==e);o=!0);}catch(t){n=!0,s=t}finally{try{o||null==i.return||i.return()}finally{if(n)throw s}}return r}(t,e)||f(t,e)||function(){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 u(t){return function(t){if(Array.isArray(t))return p(t)}(t)||function(t){if(\"undefined\"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t[\"@@iterator\"])return Array.from(t)}(t)||f(t)||function(){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 f(t,e){if(t){if(\"string\"==typeof t)return p(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return\"Object\"===i&&t.constructor&&(i=t.constructor.name),\"Map\"===i||\"Set\"===i?Array.from(t):\"Arguments\"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?p(t,e):void 0}}function p(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,a=new Array(e);i<e;i++)a[i]=t[i];return a}var x=function(){function t(){a(this,t)}return r(t,[{key:\"shadeRGBColor\",value:function(t,e){var i=e.split(\",\"),a=t<0?0:255,s=t<0?-1*t:t,r=parseInt(i[0].slice(4),10),o=parseInt(i[1],10),n=parseInt(i[2],10);return\"rgb(\"+(Math.round((a-r)*s)+r)+\",\"+(Math.round((a-o)*s)+o)+\",\"+(Math.round((a-n)*s)+n)+\")\"}},{key:\"shadeHexColor\",value:function(t,e){var i=parseInt(e.slice(1),16),a=t<0?0:255,s=t<0?-1*t:t,r=i>>16,o=i>>8&255,n=255&i;return\"#\"+(16777216+65536*(Math.round((a-r)*s)+r)+256*(Math.round((a-o)*s)+o)+(Math.round((a-n)*s)+n)).toString(16).slice(1)}},{key:\"shadeColor\",value:function(e,i){return t.isColorHex(i)?this.shadeHexColor(e,i):this.shadeRGBColor(e,i)}}],[{key:\"bind\",value:function(t,e){return function(){return t.apply(e,arguments)}}},{key:\"isObject\",value:function(t){return t&&\"object\"===i(t)&&!Array.isArray(t)&&null!=t}},{key:\"is\",value:function(t,e){return Object.prototype.toString.call(e)===\"[object \"+t+\"]\"}},{key:\"listToArray\",value:function(t){var e,i=[];for(e=0;e<t.length;e++)i[e]=t[e];return i}},{key:\"extend\",value:function(t,e){var i=this;\"function\"!=typeof Object.assign&&(Object.assign=function(t){if(null==t)throw new TypeError(\"Cannot convert undefined or null to object\");for(var e=Object(t),i=1;i<arguments.length;i++){var a=arguments[i];if(null!=a)for(var s in a)a.hasOwnProperty(s)&&(e[s]=a[s])}return e});var a=Object.assign({},t);return this.isObject(t)&&this.isObject(e)&&Object.keys(e).forEach((function(s){i.isObject(e[s])&&s in t?a[s]=i.extend(t[s],e[s]):Object.assign(a,o({},s,e[s]))})),a}},{key:\"extendArray\",value:function(e,i){var a=[];return e.map((function(e){a.push(t.extend(i,e))})),e=a}},{key:\"monthMod\",value:function(t){return t%12}},{key:\"clone\",value:function(e){if(t.is(\"Array\",e)){for(var a=[],s=0;s<e.length;s++)a[s]=this.clone(e[s]);return a}if(t.is(\"Null\",e))return null;if(t.is(\"Date\",e))return e;if(\"object\"===i(e)){var r={};for(var o in e)e.hasOwnProperty(o)&&(r[o]=this.clone(e[o]));return r}return e}},{key:\"log10\",value:function(t){return Math.log(t)/Math.LN10}},{key:\"roundToBase10\",value:function(t){return Math.pow(10,Math.floor(Math.log10(t)))}},{key:\"roundToBase\",value:function(t,e){return Math.pow(e,Math.floor(Math.log(t)/Math.log(e)))}},{key:\"parseNumber\",value:function(t){return null===t?t:parseFloat(t)}},{key:\"randomId\",value:function(){return(Math.random()+1).toString(36).substring(4)}},{key:\"noExponents\",value:function(t){var e=String(t).split(/[eE]/);if(1===e.length)return e[0];var i=\"\",a=t<0?\"-\":\"\",s=e[0].replace(\".\",\"\"),r=Number(e[1])+1;if(r<0){for(i=a+\"0.\";r++;)i+=\"0\";return i+s.replace(/^-/,\"\")}for(r-=s.length;r--;)i+=\"0\";return s+i}},{key:\"getDimensions\",value:function(t){var e=getComputedStyle(t,null),i=t.clientHeight,a=t.clientWidth;return i-=parseFloat(e.paddingTop)+parseFloat(e.paddingBottom),[a-=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight),i]}},{key:\"getBoundingClientRect\",value:function(t){var e=t.getBoundingClientRect();return{top:e.top,right:e.right,bottom:e.bottom,left:e.left,width:t.clientWidth,height:t.clientHeight,x:e.left,y:e.top}}},{key:\"getLargestStringFromArr\",value:function(t){return t.reduce((function(t,e){return Array.isArray(e)&&(e=e.reduce((function(t,e){return t.length>e.length?t:e}))),t.length>e.length?t:e}),0)}},{key:\"hexToRgba\",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"#999999\",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:.6;\"#\"!==t.substring(0,1)&&(t=\"#999999\");var i=t.replace(\"#\",\"\");i=i.match(new RegExp(\"(.{\"+i.length/3+\"})\",\"g\"));for(var a=0;a<i.length;a++)i[a]=parseInt(1===i[a].length?i[a]+i[a]:i[a],16);return void 0!==e&&i.push(e),\"rgba(\"+i.join(\",\")+\")\"}},{key:\"getOpacityFromRGBA\",value:function(t){return parseFloat(t.replace(/^.*,(.+)\\)/,\"$1\"))}},{key:\"rgb2hex\",value:function(t){return(t=t.match(/^rgba?[\\s+]?\\([\\s+]?(\\d+)[\\s+]?,[\\s+]?(\\d+)[\\s+]?,[\\s+]?(\\d+)[\\s+]?/i))&&4===t.length?\"#\"+(\"0\"+parseInt(t[1],10).toString(16)).slice(-2)+(\"0\"+parseInt(t[2],10).toString(16)).slice(-2)+(\"0\"+parseInt(t[3],10).toString(16)).slice(-2):\"\"}},{key:\"isColorHex\",value:function(t){return/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)|(^#[0-9A-F]{8}$)/i.test(t)}},{key:\"getPolygonPos\",value:function(t,e){for(var i=[],a=2*Math.PI/e,s=0;s<e;s++){var r={};r.x=t*Math.sin(s*a),r.y=-t*Math.cos(s*a),i.push(r)}return i}},{key:\"polarToCartesian\",value:function(t,e,i,a){var s=(a-90)*Math.PI/180;return{x:t+i*Math.cos(s),y:e+i*Math.sin(s)}}},{key:\"escapeString\",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"x\",i=t.toString().slice();return i=i.replace(/[` ~!@#$%^&*()|+\\=?;:'\",.<>{}[\\]\\\\/]/gi,e)}},{key:\"negToZero\",value:function(t){return t<0?0:t}},{key:\"moveIndexInArray\",value:function(t,e,i){if(i>=t.length)for(var a=i-t.length+1;a--;)t.push(void 0);return t.splice(i,0,t.splice(e,1)[0]),t}},{key:\"extractNumber\",value:function(t){return parseFloat(t.replace(/[^\\d.]*/g,\"\"))}},{key:\"findAncestor\",value:function(t,e){for(;(t=t.parentElement)&&!t.classList.contains(e););return t}},{key:\"setELstyles\",value:function(t,e){for(var i in e)e.hasOwnProperty(i)&&(t.style.key=e[i])}},{key:\"isNumber\",value:function(t){return!isNaN(t)&&parseFloat(Number(t))===t&&!isNaN(parseInt(t,10))}},{key:\"isFloat\",value:function(t){return Number(t)===t&&t%1!=0}},{key:\"isSafari\",value:function(){return/^((?!chrome|android).)*safari/i.test(navigator.userAgent)}},{key:\"isFirefox\",value:function(){return navigator.userAgent.toLowerCase().indexOf(\"firefox\")>-1}},{key:\"isIE11\",value:function(){if(-1!==window.navigator.userAgent.indexOf(\"MSIE\")||window.navigator.appVersion.indexOf(\"Trident/\")>-1)return!0}},{key:\"isIE\",value:function(){var t=window.navigator.userAgent,e=t.indexOf(\"MSIE \");if(e>0)return parseInt(t.substring(e+5,t.indexOf(\".\",e)),10);if(t.indexOf(\"Trident/\")>0){var i=t.indexOf(\"rv:\");return parseInt(t.substring(i+3,t.indexOf(\".\",i)),10)}var a=t.indexOf(\"Edge/\");return a>0&&parseInt(t.substring(a+5,t.indexOf(\".\",a)),10)}}]),t}(),b=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.setEasingFunctions()}return r(t,[{key:\"setEasingFunctions\",value:function(){var t;if(!this.w.globals.easing){switch(this.w.config.chart.animations.easing){case\"linear\":t=\"-\";break;case\"easein\":t=\"<\";break;case\"easeout\":t=\">\";break;case\"easeinout\":default:t=\"<>\";break;case\"swing\":t=function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1};break;case\"bounce\":t=function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375};break;case\"elastic\":t=function(t){return t===!!t?t:Math.pow(2,-10*t)*Math.sin((t-.075)*(2*Math.PI)/.3)+1}}this.w.globals.easing=t}}},{key:\"animateLine\",value:function(t,e,i,a){t.attr(e).animate(a).attr(i)}},{key:\"animateMarker\",value:function(t,e,i,a,s,r){e||(e=0),t.attr({r:e,width:e,height:e}).animate(a,s).attr({r:i,width:i.width,height:i.height}).afterAll((function(){r()}))}},{key:\"animateCircle\",value:function(t,e,i,a,s){t.attr({r:e.r,cx:e.cx,cy:e.cy}).animate(a,s).attr({r:i.r,cx:i.cx,cy:i.cy})}},{key:\"animateRect\",value:function(t,e,i,a,s){t.attr(e).animate(a).attr(i).afterAll((function(){return s()}))}},{key:\"animatePathsGradually\",value:function(t){var e=t.el,i=t.realIndex,a=t.j,s=t.fill,r=t.pathFrom,o=t.pathTo,n=t.speed,l=t.delay,h=this.w,c=0;h.config.chart.animations.animateGradually.enabled&&(c=h.config.chart.animations.animateGradually.delay),h.config.chart.animations.dynamicAnimation.enabled&&h.globals.dataChanged&&\"bar\"!==h.config.chart.type&&(c=0),this.morphSVG(e,i,a,\"line\"!==h.config.chart.type||h.globals.comboCharts?s:\"stroke\",r,o,n,l*c)}},{key:\"showDelayedElements\",value:function(){this.w.globals.delayedElements.forEach((function(t){t.el.classList.remove(\"apexcharts-element-hidden\")}))}},{key:\"animationCompleted\",value:function(t){var e=this.w;e.globals.animationEnded||(e.globals.animationEnded=!0,this.showDelayedElements(),\"function\"==typeof e.config.chart.events.animationEnd&&e.config.chart.events.animationEnd(this.ctx,{el:t,w:e}))}},{key:\"morphSVG\",value:function(t,e,i,a,s,r,o,n){var l=this,h=this.w;s||(s=t.attr(\"pathFrom\")),r||(r=t.attr(\"pathTo\"));var c=function(t){return\"radar\"===h.config.chart.type&&(o=1),\"M 0 \".concat(h.globals.gridHeight)};(!s||s.indexOf(\"undefined\")>-1||s.indexOf(\"NaN\")>-1)&&(s=c()),(!r||r.indexOf(\"undefined\")>-1||r.indexOf(\"NaN\")>-1)&&(r=c()),h.globals.shouldAnimate||(o=1),t.plot(s).animate(1,h.globals.easing,n).plot(s).animate(o,h.globals.easing,n).plot(r).afterAll((function(){x.isNumber(i)?i===h.globals.series[h.globals.maxValsInArrayIndex].length-2&&h.globals.shouldAnimate&&l.animationCompleted(t):\"none\"!==a&&h.globals.shouldAnimate&&(!h.globals.comboCharts&&e===h.globals.series.length-1||h.globals.comboCharts)&&l.animationCompleted(t),l.showDelayedElements()}))}}]),t}(),v=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:\"getDefaultFilter\",value:function(t,e){var i=this.w;t.unfilter(!0),(new window.SVG.Filter).size(\"120%\",\"180%\",\"-5%\",\"-40%\"),\"none\"!==i.config.states.normal.filter?this.applyFilter(t,e,i.config.states.normal.filter.type,i.config.states.normal.filter.value):i.config.chart.dropShadow.enabled&&this.dropShadow(t,i.config.chart.dropShadow,e)}},{key:\"addNormalFilter\",value:function(t,e){var i=this.w;i.config.chart.dropShadow.enabled&&!t.node.classList.contains(\"apexcharts-marker\")&&this.dropShadow(t,i.config.chart.dropShadow,e)}},{key:\"addLightenFilter\",value:function(t,e,i){var a=this,s=this.w,r=i.intensity;t.unfilter(!0);new window.SVG.Filter;t.filter((function(t){var i=s.config.chart.dropShadow;(i.enabled?a.addShadow(t,e,i):t).componentTransfer({rgb:{type:\"linear\",slope:1.5,intercept:r}})})),t.filterer.node.setAttribute(\"filterUnits\",\"userSpaceOnUse\"),this._scaleFilterSize(t.filterer.node)}},{key:\"addDarkenFilter\",value:function(t,e,i){var a=this,s=this.w,r=i.intensity;t.unfilter(!0);new window.SVG.Filter;t.filter((function(t){var i=s.config.chart.dropShadow;(i.enabled?a.addShadow(t,e,i):t).componentTransfer({rgb:{type:\"linear\",slope:r}})})),t.filterer.node.setAttribute(\"filterUnits\",\"userSpaceOnUse\"),this._scaleFilterSize(t.filterer.node)}},{key:\"applyFilter\",value:function(t,e,i){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:.5;switch(i){case\"none\":this.addNormalFilter(t,e);break;case\"lighten\":this.addLightenFilter(t,e,{intensity:a});break;case\"darken\":this.addDarkenFilter(t,e,{intensity:a})}}},{key:\"addShadow\",value:function(t,e,i){var a=i.blur,s=i.top,r=i.left,o=i.color,n=i.opacity,l=t.flood(Array.isArray(o)?o[e]:o,n).composite(t.sourceAlpha,\"in\").offset(r,s).gaussianBlur(a).merge(t.source);return t.blend(t.source,l)}},{key:\"dropShadow\",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,a=e.top,s=e.left,r=e.blur,o=e.color,n=e.opacity,l=e.noUserSpaceOnUse,h=this.w;return t.unfilter(!0),x.isIE()&&\"radialBar\"===h.config.chart.type||(o=Array.isArray(o)?o[i]:o,t.filter((function(t){var e=null;e=x.isSafari()||x.isFirefox()||x.isIE()?t.flood(o,n).composite(t.sourceAlpha,\"in\").offset(s,a).gaussianBlur(r):t.flood(o,n).composite(t.sourceAlpha,\"in\").offset(s,a).gaussianBlur(r).merge(t.source),t.blend(t.source,e)})),l||t.filterer.node.setAttribute(\"filterUnits\",\"userSpaceOnUse\"),this._scaleFilterSize(t.filterer.node)),t}},{key:\"setSelectionFilter\",value:function(t,e,i){var a=this.w;if(void 0!==a.globals.selectedDataPoints[e]&&a.globals.selectedDataPoints[e].indexOf(i)>-1){t.node.setAttribute(\"selected\",!0);var s=a.config.states.active.filter;\"none\"!==s&&this.applyFilter(t,e,s.type,s.value)}}},{key:\"_scaleFilterSize\",value:function(t){!function(e){for(var i in e)e.hasOwnProperty(i)&&t.setAttribute(i,e[i])}({width:\"200%\",height:\"200%\",x:\"-50%\",y:\"-50%\"})}}]),t}(),m=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:\"roundPathCorners\",value:function(t,e){function i(t,e,i){var s=e.x-t.x,r=e.y-t.y,o=Math.sqrt(s*s+r*r);return a(t,e,Math.min(1,i/o))}function a(t,e,i){return{x:t.x+(e.x-t.x)*i,y:t.y+(e.y-t.y)*i}}function s(t,e){t.length>2&&(t[t.length-2]=e.x,t[t.length-1]=e.y)}function r(t){return{x:parseFloat(t[t.length-2]),y:parseFloat(t[t.length-1])}}var o=t.split(/[,\\s]/).reduce((function(t,e){var i=e.match(\"([a-zA-Z])(.+)\");return i?(t.push(i[1]),t.push(i[2])):t.push(e),t}),[]).reduce((function(t,e){return parseFloat(e)==e&&t.length?t[t.length-1].push(e):t.push([e]),t}),[]),n=[];if(o.length>1){var l=r(o[0]),h=null;\"Z\"==o[o.length-1][0]&&o[0].length>2&&(h=[\"L\",l.x,l.y],o[o.length-1]=h),n.push(o[0]);for(var c=1;c<o.length;c++){var d=n[n.length-1],g=o[c],u=g==h?o[1]:o[c+1];if(u&&d&&d.length>2&&\"L\"==g[0]&&u.length>2&&\"L\"==u[0]){var f,p,x=r(d),b=r(g),v=r(u);f=i(b,x,e),p=i(b,v,e),s(g,f),g.origPoint=b,n.push(g);var m=a(f,b,.5),y=a(b,p,.5),w=[\"C\",m.x,m.y,y.x,y.y,p.x,p.y];w.origPoint=b,n.push(w)}else n.push(g)}if(h){var k=r(n[n.length-1]);n.push([\"Z\"]),s(n[0],k)}}else n=o;return n.reduce((function(t,e){return t+e.join(\" \")+\" \"}),\"\")}},{key:\"drawLine\",value:function(t,e,i,a){var s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:\"#a8a8a8\",r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,o=arguments.length>6&&void 0!==arguments[6]?arguments[6]:null,n=arguments.length>7&&void 0!==arguments[7]?arguments[7]:\"butt\";return this.w.globals.dom.Paper.line().attr({x1:t,y1:e,x2:i,y2:a,stroke:s,\"stroke-dasharray\":r,\"stroke-width\":o,\"stroke-linecap\":n})}},{key:\"drawRect\",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:\"#fefefe\",o=arguments.length>6&&void 0!==arguments[6]?arguments[6]:1,n=arguments.length>7&&void 0!==arguments[7]?arguments[7]:null,l=arguments.length>8&&void 0!==arguments[8]?arguments[8]:null,h=arguments.length>9&&void 0!==arguments[9]?arguments[9]:0,c=this.w.globals.dom.Paper.rect();return c.attr({x:t,y:e,width:i>0?i:0,height:a>0?a:0,rx:s,ry:s,opacity:o,\"stroke-width\":null!==n?n:0,stroke:null!==l?l:\"none\",\"stroke-dasharray\":h}),c.node.setAttribute(\"fill\",r),c}},{key:\"drawPolygon\",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"#e1e1e1\",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"none\";return this.w.globals.dom.Paper.polygon(t).attr({fill:a,stroke:e,\"stroke-width\":i})}},{key:\"drawCircle\",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;t<0&&(t=0);var i=this.w.globals.dom.Paper.circle(2*t);return null!==e&&i.attr(e),i}},{key:\"drawPath\",value:function(t){var e=t.d,i=void 0===e?\"\":e,a=t.stroke,s=void 0===a?\"#a8a8a8\":a,r=t.strokeWidth,o=void 0===r?1:r,n=t.fill,l=t.fillOpacity,h=void 0===l?1:l,c=t.strokeOpacity,d=void 0===c?1:c,g=t.classes,u=t.strokeLinecap,f=void 0===u?null:u,p=t.strokeDashArray,x=void 0===p?0:p,b=this.w;return null===f&&(f=b.config.stroke.lineCap),(i.indexOf(\"undefined\")>-1||i.indexOf(\"NaN\")>-1)&&(i=\"M 0 \".concat(b.globals.gridHeight)),b.globals.dom.Paper.path(i).attr({fill:n,\"fill-opacity\":h,stroke:s,\"stroke-opacity\":d,\"stroke-linecap\":f,\"stroke-width\":o,\"stroke-dasharray\":x,class:g})}},{key:\"group\",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,e=this.w.globals.dom.Paper.group();return null!==t&&e.attr(t),e}},{key:\"move\",value:function(t,e){var i=[\"M\",t,e].join(\" \");return i}},{key:\"line\",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,a=null;return null===i?a=[\" L\",t,e].join(\" \"):\"H\"===i?a=[\" H\",t].join(\" \"):\"V\"===i&&(a=[\" V\",e].join(\" \")),a}},{key:\"curve\",value:function(t,e,i,a,s,r){var o=[\"C\",t,e,i,a,s,r].join(\" \");return o}},{key:\"quadraticCurve\",value:function(t,e,i,a){return[\"Q\",t,e,i,a].join(\" \")}},{key:\"arc\",value:function(t,e,i,a,s,r,o){var n=\"A\";arguments.length>7&&void 0!==arguments[7]&&arguments[7]&&(n=\"a\");var l=[n,t,e,i,a,s,r,o].join(\" \");return l}},{key:\"renderPaths\",value:function(t){var i,a=t.j,s=t.realIndex,r=t.pathFrom,o=t.pathTo,n=t.stroke,l=t.strokeWidth,h=t.strokeLinecap,c=t.fill,d=t.animationDelay,g=t.initialSpeed,u=t.dataChangeSpeed,f=t.className,p=t.shouldClipToGrid,x=void 0===p||p,m=t.bindEventsOnPaths,y=void 0===m||m,w=t.drawShadow,k=void 0===w||w,A=this.w,S=new v(this.ctx),C=new b(this.ctx),L=this.w.config.chart.animations.enabled,P=L&&this.w.config.chart.animations.dynamicAnimation.enabled,I=!!(L&&!A.globals.resized||P&&A.globals.dataChanged&&A.globals.shouldAnimate);I?i=r:(i=o,A.globals.animationEnded=!0);var T=A.config.stroke.dashArray,M=0;M=Array.isArray(T)?T[s]:A.config.stroke.dashArray;var z=this.drawPath({d:i,stroke:n,strokeWidth:l,fill:c,fillOpacity:1,classes:f,strokeLinecap:h,strokeDashArray:M});if(z.attr(\"index\",s),x&&z.attr({\"clip-path\":\"url(#gridRectMask\".concat(A.globals.cuid,\")\")}),\"none\"!==A.config.states.normal.filter.type)S.getDefaultFilter(z,s);else if(A.config.chart.dropShadow.enabled&&k&&(!A.config.chart.dropShadow.enabledOnSeries||A.config.chart.dropShadow.enabledOnSeries&&-1!==A.config.chart.dropShadow.enabledOnSeries.indexOf(s))){var X=A.config.chart.dropShadow;S.dropShadow(z,X,s)}y&&(z.node.addEventListener(\"mouseenter\",this.pathMouseEnter.bind(this,z)),z.node.addEventListener(\"mouseleave\",this.pathMouseLeave.bind(this,z)),z.node.addEventListener(\"mousedown\",this.pathMouseDown.bind(this,z))),z.attr({pathTo:o,pathFrom:r});var E={el:z,j:a,realIndex:s,pathFrom:r,pathTo:o,fill:c,strokeWidth:l,delay:d};return!L||A.globals.resized||A.globals.dataChanged?!A.globals.resized&&A.globals.dataChanged||C.showDelayedElements():C.animatePathsGradually(e(e({},E),{},{speed:g})),A.globals.dataChanged&&P&&I&&C.animatePathsGradually(e(e({},E),{},{speed:u})),z}},{key:\"drawPattern\",value:function(t,e,i){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"#a8a8a8\",s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0;return this.w.globals.dom.Paper.pattern(e,i,(function(r){\"horizontalLines\"===t?r.line(0,0,i,0).stroke({color:a,width:s+1}):\"verticalLines\"===t?r.line(0,0,0,e).stroke({color:a,width:s+1}):\"slantedLines\"===t?r.line(0,0,e,i).stroke({color:a,width:s}):\"squares\"===t?r.rect(e,i).fill(\"none\").stroke({color:a,width:s}):\"circles\"===t&&r.circle(e).fill(\"none\").stroke({color:a,width:s})}))}},{key:\"drawGradient\",value:function(t,e,i,a,s){var r,o=arguments.length>5&&void 0!==arguments[5]?arguments[5]:null,n=arguments.length>6&&void 0!==arguments[6]?arguments[6]:null,l=arguments.length>7&&void 0!==arguments[7]?arguments[7]:null,h=arguments.length>8&&void 0!==arguments[8]?arguments[8]:0,c=this.w;e.length<9&&0===e.indexOf(\"#\")&&(e=x.hexToRgba(e,a)),i.length<9&&0===i.indexOf(\"#\")&&(i=x.hexToRgba(i,s));var d=0,g=1,u=1,f=null;null!==n&&(d=void 0!==n[0]?n[0]/100:0,g=void 0!==n[1]?n[1]/100:1,u=void 0!==n[2]?n[2]/100:1,f=void 0!==n[3]?n[3]/100:null);var p=!(\"donut\"!==c.config.chart.type&&\"pie\"!==c.config.chart.type&&\"polarArea\"!==c.config.chart.type&&\"bubble\"!==c.config.chart.type);if(r=null===l||0===l.length?c.globals.dom.Paper.gradient(p?\"radial\":\"linear\",(function(t){t.at(d,e,a),t.at(g,i,s),t.at(u,i,s),null!==f&&t.at(f,e,a)})):c.globals.dom.Paper.gradient(p?\"radial\":\"linear\",(function(t){(Array.isArray(l[h])?l[h]:l).forEach((function(e){t.at(e.offset/100,e.color,e.opacity)}))})),p){var b=c.globals.gridWidth/2,v=c.globals.gridHeight/2;\"bubble\"!==c.config.chart.type?r.attr({gradientUnits:\"userSpaceOnUse\",cx:b,cy:v,r:o}):r.attr({cx:.5,cy:.5,r:.8,fx:.2,fy:.2})}else\"vertical\"===t?r.from(0,0).to(0,1):\"diagonal\"===t?r.from(0,0).to(1,1):\"horizontal\"===t?r.from(0,1).to(1,1):\"diagonal2\"===t&&r.from(1,0).to(0,1);return r}},{key:\"getTextBasedOnMaxWidth\",value:function(t){var e=t.text,i=t.maxWidth,a=t.fontSize,s=t.fontFamily,r=this.getTextRects(e,a,s),o=r.width/e.length,n=Math.floor(i/o);return i<r.width?e.slice(0,n-3)+\"...\":e}},{key:\"drawText\",value:function(t){var i=this,a=t.x,s=t.y,r=t.text,o=t.textAnchor,n=t.fontSize,l=t.fontFamily,h=t.fontWeight,c=t.foreColor,d=t.opacity,g=t.maxWidth,u=t.cssClass,f=void 0===u?\"\":u,p=t.isPlainText,x=void 0===p||p,b=this.w;void 0===r&&(r=\"\");var v=r;o||(o=\"start\"),c&&c.length||(c=b.config.chart.foreColor),l=l||b.config.chart.fontFamily,h=h||\"regular\";var m,y={maxWidth:g,fontSize:n=n||\"11px\",fontFamily:l};return Array.isArray(r)?m=b.globals.dom.Paper.text((function(t){for(var a=0;a<r.length;a++)v=r[a],g&&(v=i.getTextBasedOnMaxWidth(e({text:r[a]},y))),0===a?t.tspan(v):t.tspan(v).newLine()})):(g&&(v=this.getTextBasedOnMaxWidth(e({text:r},y))),m=x?b.globals.dom.Paper.plain(r):b.globals.dom.Paper.text((function(t){return t.tspan(v)}))),m.attr({x:a,y:s,\"text-anchor\":o,\"dominant-baseline\":\"auto\",\"font-size\":n,\"font-family\":l,\"font-weight\":h,fill:c,class:\"apexcharts-text \"+f}),m.node.style.fontFamily=l,m.node.style.opacity=d,m}},{key:\"drawMarker\",value:function(t,e,i){t=t||0;var a=i.pSize||0,s=null;if(\"square\"===i.shape||\"rect\"===i.shape){var r=void 0===i.pRadius?a/2:i.pRadius;null!==e&&a||(a=0,r=0);var o=1.2*a+r,n=this.drawRect(o,o,o,o,r);n.attr({x:t-o/2,y:e-o/2,cx:t,cy:e,class:i.class?i.class:\"\",fill:i.pointFillColor,\"fill-opacity\":i.pointFillOpacity?i.pointFillOpacity:1,stroke:i.pointStrokeColor,\"stroke-width\":i.pointStrokeWidth?i.pointStrokeWidth:0,\"stroke-opacity\":i.pointStrokeOpacity?i.pointStrokeOpacity:1}),s=n}else\"circle\"!==i.shape&&i.shape||(x.isNumber(e)||(a=0,e=0),s=this.drawCircle(a,{cx:t,cy:e,class:i.class?i.class:\"\",stroke:i.pointStrokeColor,fill:i.pointFillColor,\"fill-opacity\":i.pointFillOpacity?i.pointFillOpacity:1,\"stroke-width\":i.pointStrokeWidth?i.pointStrokeWidth:0,\"stroke-opacity\":i.pointStrokeOpacity?i.pointStrokeOpacity:1}));return s}},{key:\"pathMouseEnter\",value:function(t,e){var i=this.w,a=new v(this.ctx),s=parseInt(t.node.getAttribute(\"index\"),10),r=parseInt(t.node.getAttribute(\"j\"),10);if(\"function\"==typeof i.config.chart.events.dataPointMouseEnter&&i.config.chart.events.dataPointMouseEnter(e,this.ctx,{seriesIndex:s,dataPointIndex:r,w:i}),this.ctx.events.fireEvent(\"dataPointMouseEnter\",[e,this.ctx,{seriesIndex:s,dataPointIndex:r,w:i}]),(\"none\"===i.config.states.active.filter.type||\"true\"!==t.node.getAttribute(\"selected\"))&&\"none\"!==i.config.states.hover.filter.type&&!i.globals.isTouchDevice){var o=i.config.states.hover.filter;a.applyFilter(t,s,o.type,o.value)}}},{key:\"pathMouseLeave\",value:function(t,e){var i=this.w,a=new v(this.ctx),s=parseInt(t.node.getAttribute(\"index\"),10),r=parseInt(t.node.getAttribute(\"j\"),10);\"function\"==typeof i.config.chart.events.dataPointMouseLeave&&i.config.chart.events.dataPointMouseLeave(e,this.ctx,{seriesIndex:s,dataPointIndex:r,w:i}),this.ctx.events.fireEvent(\"dataPointMouseLeave\",[e,this.ctx,{seriesIndex:s,dataPointIndex:r,w:i}]),\"none\"!==i.config.states.active.filter.type&&\"true\"===t.node.getAttribute(\"selected\")||\"none\"!==i.config.states.hover.filter.type&&a.getDefaultFilter(t,s)}},{key:\"pathMouseDown\",value:function(t,e){var i=this.w,a=new v(this.ctx),s=parseInt(t.node.getAttribute(\"index\"),10),r=parseInt(t.node.getAttribute(\"j\"),10),o=\"false\";if(\"true\"===t.node.getAttribute(\"selected\")){if(t.node.setAttribute(\"selected\",\"false\"),i.globals.selectedDataPoints[s].indexOf(r)>-1){var n=i.globals.selectedDataPoints[s].indexOf(r);i.globals.selectedDataPoints[s].splice(n,1)}}else{if(!i.config.states.active.allowMultipleDataPointsSelection&&i.globals.selectedDataPoints.length>0){i.globals.selectedDataPoints=[];var l=i.globals.dom.Paper.select(\".apexcharts-series path\").members,h=i.globals.dom.Paper.select(\".apexcharts-series circle, .apexcharts-series rect\").members,c=function(t){Array.prototype.forEach.call(t,(function(t){t.node.setAttribute(\"selected\",\"false\"),a.getDefaultFilter(t,s)}))};c(l),c(h)}t.node.setAttribute(\"selected\",\"true\"),o=\"true\",void 0===i.globals.selectedDataPoints[s]&&(i.globals.selectedDataPoints[s]=[]),i.globals.selectedDataPoints[s].push(r)}if(\"true\"===o){var d=i.config.states.active.filter;if(\"none\"!==d)a.applyFilter(t,s,d.type,d.value);else if(\"none\"!==i.config.states.hover.filter&&!i.globals.isTouchDevice){var g=i.config.states.hover.filter;a.applyFilter(t,s,g.type,g.value)}}else if(\"none\"!==i.config.states.active.filter.type)if(\"none\"===i.config.states.hover.filter.type||i.globals.isTouchDevice)a.getDefaultFilter(t,s);else{g=i.config.states.hover.filter;a.applyFilter(t,s,g.type,g.value)}\"function\"==typeof i.config.chart.events.dataPointSelection&&i.config.chart.events.dataPointSelection(e,this.ctx,{selectedDataPoints:i.globals.selectedDataPoints,seriesIndex:s,dataPointIndex:r,w:i}),e&&this.ctx.events.fireEvent(\"dataPointSelection\",[e,this.ctx,{selectedDataPoints:i.globals.selectedDataPoints,seriesIndex:s,dataPointIndex:r,w:i}])}},{key:\"rotateAroundCenter\",value:function(t){var e={};return t&&\"function\"==typeof t.getBBox&&(e=t.getBBox()),{x:e.x+e.width/2,y:e.y+e.height/2}}},{key:\"getTextRects\",value:function(t,e,i,a){var s=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],r=this.w,o=this.drawText({x:-200,y:-200,text:t,textAnchor:\"start\",fontSize:e,fontFamily:i,foreColor:\"#fff\",opacity:0});a&&o.attr(\"transform\",a),r.globals.dom.Paper.add(o);var n=o.bbox();return s||(n=o.node.getBoundingClientRect()),o.remove(),{width:n.width,height:n.height}}},{key:\"placeTextWithEllipsis\",value:function(t,e,i){if(\"function\"==typeof t.getComputedTextLength&&(t.textContent=e,e.length>0&&t.getComputedTextLength()>=i/1.1)){for(var a=e.length-3;a>0;a-=3)if(t.getSubStringLength(0,a)<=i/1.1)return void(t.textContent=e.substring(0,a)+\"...\");t.textContent=\".\"}}}],[{key:\"setAttrs\",value:function(t,e){for(var i in e)e.hasOwnProperty(i)&&t.setAttribute(i,e[i])}}]),t}(),y=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:\"getStackedSeriesTotals\",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=this.w,i=[];if(0===e.globals.series.length)return i;for(var a=0;a<e.globals.series[e.globals.maxValsInArrayIndex].length;a++){for(var s=0,r=0;r<e.globals.series.length;r++)void 0!==e.globals.series[r][a]&&-1===t.indexOf(r)&&(s+=e.globals.series[r][a]);i.push(s)}return i}},{key:\"getSeriesTotalByIndex\",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return null===t?this.w.config.series.reduce((function(t,e){return t+e}),0):this.w.globals.series[t].reduce((function(t,e){return t+e}),0)}},{key:\"isSeriesNull\",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return 0===(null===t?this.w.config.series.filter((function(t){return null!==t})):this.w.config.series[t].data.filter((function(t){return null!==t}))).length}},{key:\"seriesHaveSameValues\",value:function(t){return this.w.globals.series[t].every((function(t,e,i){return t===i[0]}))}},{key:\"getCategoryLabels\",value:function(t){var e=this.w,i=t.slice();return e.config.xaxis.convertedCatToNumeric&&(i=t.map((function(t,i){return e.config.xaxis.labels.formatter(t-e.globals.minX+1)}))),i}},{key:\"getLargestSeries\",value:function(){var t=this.w;t.globals.maxValsInArrayIndex=t.globals.series.map((function(t){return t.length})).indexOf(Math.max.apply(Math,t.globals.series.map((function(t){return t.length}))))}},{key:\"getLargestMarkerSize\",value:function(){var t=this.w,e=0;return t.globals.markers.size.forEach((function(t){e=Math.max(e,t)})),t.config.markers.discrete&&t.config.markers.discrete.length&&t.config.markers.discrete.forEach((function(t){e=Math.max(e,t.size)})),e>0&&(e+=t.config.markers.hover.sizeOffset+1),t.globals.markers.largestSize=e,e}},{key:\"getSeriesTotals\",value:function(){var t=this.w;t.globals.seriesTotals=t.globals.series.map((function(t,e){var i=0;if(Array.isArray(t))for(var a=0;a<t.length;a++)i+=t[a];else i+=t;return i}))}},{key:\"getSeriesTotalsXRange\",value:function(t,e){var i=this.w;return i.globals.series.map((function(a,s){for(var r=0,o=0;o<a.length;o++)i.globals.seriesX[s][o]>t&&i.globals.seriesX[s][o]<e&&(r+=a[o]);return r}))}},{key:\"getPercentSeries\",value:function(){var t=this.w;t.globals.seriesPercent=t.globals.series.map((function(e,i){var a=[];if(Array.isArray(e))for(var s=0;s<e.length;s++){var r=t.globals.stackedSeriesTotals[s],o=0;r&&(o=100*e[s]/r),a.push(o)}else{var n=100*e/t.globals.seriesTotals.reduce((function(t,e){return t+e}),0);a.push(n)}return a}))}},{key:\"getCalculatedRatios\",value:function(){var t,e,i,a,s=this.w.globals,r=[],o=0,n=[],l=.1,h=0;if(s.yRange=[],s.isMultipleYAxis)for(var c=0;c<s.minYArr.length;c++)s.yRange.push(Math.abs(s.minYArr[c]-s.maxYArr[c])),n.push(0);else s.yRange.push(Math.abs(s.minY-s.maxY));s.xRange=Math.abs(s.maxX-s.minX),s.zRange=Math.abs(s.maxZ-s.minZ);for(var d=0;d<s.yRange.length;d++)r.push(s.yRange[d]/s.gridHeight);if(e=s.xRange/s.gridWidth,i=Math.abs(s.initialMaxX-s.initialMinX)/s.gridWidth,t=s.yRange/s.gridWidth,a=s.xRange/s.gridHeight,(o=s.zRange/s.gridHeight*16)||(o=1),s.minY!==Number.MIN_VALUE&&0!==Math.abs(s.minY)&&(s.hasNegs=!0),s.isMultipleYAxis){n=[];for(var g=0;g<r.length;g++)n.push(-s.minYArr[g]/r[g])}else n.push(-s.minY/r[0]),s.minY!==Number.MIN_VALUE&&0!==Math.abs(s.minY)&&(l=-s.minY/t,h=s.minX/e);return{yRatio:r,invertedYRatio:t,zRatio:o,xRatio:e,initialXRatio:i,invertedXRatio:a,baseLineInvertedY:l,baseLineY:n,baseLineX:h}}},{key:\"getLogSeries\",value:function(t){var e=this,i=this.w;return i.globals.seriesLog=t.map((function(t,a){return i.config.yaxis[a]&&i.config.yaxis[a].logarithmic?t.map((function(t){return null===t?null:e.getLogVal(i.config.yaxis[a].logBase,t,a)})):t})),i.globals.invalidLogScale?t:i.globals.seriesLog}},{key:\"getBaseLog\",value:function(t,e){return Math.log(e)/Math.log(t)}},{key:\"getLogVal\",value:function(t,e,i){if(0===e)return 0;var a=this.w,s=0===a.globals.minYArr[i]?-1:this.getBaseLog(t,a.globals.minYArr[i]),r=(0===a.globals.maxYArr[i]?0:this.getBaseLog(t,a.globals.maxYArr[i]))-s;return e<1?e/r:(this.getBaseLog(t,e)-s)/r}},{key:\"getLogYRatios\",value:function(t){var e=this,i=this.w,a=this.w.globals;return a.yLogRatio=t.slice(),a.logYRange=a.yRange.map((function(t,s){if(i.config.yaxis[s]&&e.w.config.yaxis[s].logarithmic){var r,o=-Number.MAX_VALUE,n=Number.MIN_VALUE;return a.seriesLog.forEach((function(t,e){t.forEach((function(t){i.config.yaxis[e]&&i.config.yaxis[e].logarithmic&&(o=Math.max(t,o),n=Math.min(t,n))}))})),r=Math.pow(a.yRange[s],Math.abs(n-o)/a.yRange[s]),a.yLogRatio[s]=r/a.gridHeight,r}})),a.invalidLogScale?t.slice():a.yLogRatio}}],[{key:\"checkComboSeries\",value:function(t){var e=!1,i=0,a=0;return t.length&&void 0!==t[0].type&&t.forEach((function(t){\"bar\"!==t.type&&\"column\"!==t.type&&\"candlestick\"!==t.type&&\"boxPlot\"!==t.type||i++,void 0!==t.type&&a++})),a>0&&(e=!0),{comboBarCount:i,comboCharts:e}}},{key:\"extendArrayProps\",value:function(t,e,i){return e.yaxis&&(e=t.extendYAxis(e,i)),e.annotations&&(e.annotations.yaxis&&(e=t.extendYAxisAnnotations(e)),e.annotations.xaxis&&(e=t.extendXAxisAnnotations(e)),e.annotations.points&&(e=t.extendPointAnnotations(e))),e}}]),t}(),w=function(){function t(e){a(this,t),this.w=e.w,this.annoCtx=e}return r(t,[{key:\"setOrientations\",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,i=this.w;if(\"vertical\"===t.label.orientation){var a=null!==e?e:0,s=i.globals.dom.baseEl.querySelector(\".apexcharts-xaxis-annotations .apexcharts-xaxis-annotation-label[rel='\".concat(a,\"']\"));if(null!==s){var r=s.getBoundingClientRect();s.setAttribute(\"x\",parseFloat(s.getAttribute(\"x\"))-r.height+4),\"top\"===t.label.position?s.setAttribute(\"y\",parseFloat(s.getAttribute(\"y\"))+r.width):s.setAttribute(\"y\",parseFloat(s.getAttribute(\"y\"))-r.width);var o=this.annoCtx.graphics.rotateAroundCenter(s),n=o.x,l=o.y;s.setAttribute(\"transform\",\"rotate(-90 \".concat(n,\" \").concat(l,\")\"))}}}},{key:\"addBackgroundToAnno\",value:function(t,e){var i=this.w;if(!t||void 0===e.label.text||void 0!==e.label.text&&!String(e.label.text).trim())return null;var a=i.globals.dom.baseEl.querySelector(\".apexcharts-grid\").getBoundingClientRect(),s=t.getBoundingClientRect(),r=e.label.style.padding.left,o=e.label.style.padding.right,n=e.label.style.padding.top,l=e.label.style.padding.bottom;\"vertical\"===e.label.orientation&&(n=e.label.style.padding.left,l=e.label.style.padding.right,r=e.label.style.padding.top,o=e.label.style.padding.bottom);var h=s.left-a.left-r,c=s.top-a.top-n,d=this.annoCtx.graphics.drawRect(h-i.globals.barPadForNumericAxis,c,s.width+r+o,s.height+n+l,e.label.borderRadius,e.label.style.background,1,e.label.borderWidth,e.label.borderColor,0);return e.id&&d.node.classList.add(e.id),d}},{key:\"annotationsBackground\",value:function(){var t=this,e=this.w,i=function(i,a,s){var r=e.globals.dom.baseEl.querySelector(\".apexcharts-\".concat(s,\"-annotations .apexcharts-\").concat(s,\"-annotation-label[rel='\").concat(a,\"']\"));if(r){var o=r.parentNode,n=t.addBackgroundToAnno(r,i);n&&(o.insertBefore(n.node,r),i.label.mouseEnter&&n.node.addEventListener(\"mouseenter\",i.label.mouseEnter.bind(t,i)),i.label.mouseLeave&&n.node.addEventListener(\"mouseleave\",i.label.mouseLeave.bind(t,i)),i.label.click&&n.node.addEventListener(\"click\",i.label.click.bind(t,i)))}};e.config.annotations.xaxis.map((function(t,e){i(t,e,\"xaxis\")})),e.config.annotations.yaxis.map((function(t,e){i(t,e,\"yaxis\")})),e.config.annotations.points.map((function(t,e){i(t,e,\"point\")}))}},{key:\"getY1Y2\",value:function(t,e){var i,a=\"y1\"===t?e.y:e.y2,s=this.w;if(this.annoCtx.invertAxis){var r=s.globals.labels.indexOf(a);s.config.xaxis.convertedCatToNumeric&&(r=s.globals.categoryLabels.indexOf(a));var o=s.globals.dom.baseEl.querySelector(\".apexcharts-yaxis-texts-g text:nth-child(\"+(r+1)+\")\");o&&(i=parseFloat(o.getAttribute(\"y\")))}else{var n;if(s.config.yaxis[e.yAxisIndex].logarithmic)n=(a=new y(this.annoCtx.ctx).getLogVal(a,e.yAxisIndex))/s.globals.yLogRatio[e.yAxisIndex];else n=(a-s.globals.minYArr[e.yAxisIndex])/(s.globals.yRange[e.yAxisIndex]/s.globals.gridHeight);i=s.globals.gridHeight-n,!e.marker||void 0!==e.y&&null!==e.y||(i=0),s.config.yaxis[e.yAxisIndex]&&s.config.yaxis[e.yAxisIndex].reversed&&(i=n)}return\"string\"==typeof a&&a.indexOf(\"px\")>-1&&(i=parseFloat(a)),i}},{key:\"getX1X2\",value:function(t,e){var i=this.w,a=this.annoCtx.invertAxis?i.globals.minY:i.globals.minX,s=this.annoCtx.invertAxis?i.globals.maxY:i.globals.maxX,r=this.annoCtx.invertAxis?i.globals.yRange[0]:i.globals.xRange,o=(e.x-a)/(r/i.globals.gridWidth);this.annoCtx.inversedReversedAxis&&(o=(s-e.x)/(r/i.globals.gridWidth)),\"category\"!==i.config.xaxis.type&&!i.config.xaxis.convertedCatToNumeric||this.annoCtx.invertAxis||i.globals.dataFormatXNumeric||(o=this.getStringX(e.x));var n=(e.x2-a)/(r/i.globals.gridWidth);return this.annoCtx.inversedReversedAxis&&(n=(s-e.x2)/(r/i.globals.gridWidth)),\"category\"!==i.config.xaxis.type&&!i.config.xaxis.convertedCatToNumeric||this.annoCtx.invertAxis||i.globals.dataFormatXNumeric||(n=this.getStringX(e.x2)),void 0!==e.x&&null!==e.x||!e.marker||(o=i.globals.gridWidth),\"x1\"===t&&\"string\"==typeof e.x&&e.x.indexOf(\"px\")>-1&&(o=parseFloat(e.x)),\"x2\"===t&&\"string\"==typeof e.x2&&e.x2.indexOf(\"px\")>-1&&(n=parseFloat(e.x2)),\"x1\"===t?o:n}},{key:\"getStringX\",value:function(t){var e=this.w,i=t;e.config.xaxis.convertedCatToNumeric&&e.globals.categoryLabels.length&&(t=e.globals.categoryLabels.indexOf(t)+1);var a=e.globals.labels.indexOf(t),s=e.globals.dom.baseEl.querySelector(\".apexcharts-xaxis-texts-g text:nth-child(\"+(a+1)+\")\");return s&&(i=parseFloat(s.getAttribute(\"x\"))),i}}]),t}(),k=function(){function t(e){a(this,t),this.w=e.w,this.annoCtx=e,this.invertAxis=this.annoCtx.invertAxis,this.helpers=new w(this.annoCtx)}return r(t,[{key:\"addXaxisAnnotation\",value:function(t,e,i){var a,s=this.w,r=this.helpers.getX1X2(\"x1\",t),o=t.label.text,n=t.strokeDashArray;if(x.isNumber(r)){if(null===t.x2||void 0===t.x2){var l=this.annoCtx.graphics.drawLine(r+t.offsetX,0+t.offsetY,r+t.offsetX,s.globals.gridHeight+t.offsetY,t.borderColor,n,t.borderWidth);e.appendChild(l.node),t.id&&l.node.classList.add(t.id)}else{if((a=this.helpers.getX1X2(\"x2\",t))<r){var h=r;r=a,a=h}var c=this.annoCtx.graphics.drawRect(r+t.offsetX,0+t.offsetY,a-r,s.globals.gridHeight+t.offsetY,0,t.fillColor,t.opacity,1,t.borderColor,n);c.node.classList.add(\"apexcharts-annotation-rect\"),c.attr(\"clip-path\",\"url(#gridRectMask\".concat(s.globals.cuid,\")\")),e.appendChild(c.node),t.id&&c.node.classList.add(t.id)}var d=this.annoCtx.graphics.getTextRects(o,parseFloat(t.label.style.fontSize)),g=\"top\"===t.label.position?4:\"center\"===t.label.position?s.globals.gridHeight/2+(\"vertical\"===t.label.orientation?d.width/2:0):s.globals.gridHeight,u=this.annoCtx.graphics.drawText({x:r+t.label.offsetX,y:g+t.label.offsetY-(\"vertical\"===t.label.orientation?\"top\"===t.label.position?d.width/2-12:-d.width/2:0),text:o,textAnchor:t.label.textAnchor,fontSize:t.label.style.fontSize,fontFamily:t.label.style.fontFamily,fontWeight:t.label.style.fontWeight,foreColor:t.label.style.color,cssClass:\"apexcharts-xaxis-annotation-label \".concat(t.label.style.cssClass,\" \").concat(t.id?t.id:\"\")});u.attr({rel:i}),e.appendChild(u.node),this.annoCtx.helpers.setOrientations(t,i)}}},{key:\"drawXAxisAnnotations\",value:function(){var t=this,e=this.w,i=this.annoCtx.graphics.group({class:\"apexcharts-xaxis-annotations\"});return e.config.annotations.xaxis.map((function(e,a){t.addXaxisAnnotation(e,i.node,a)})),i}}]),t}(),A=function(){function t(e){a(this,t),this.w=e.w,this.annoCtx=e,this.helpers=new w(this.annoCtx)}return r(t,[{key:\"addYaxisAnnotation\",value:function(t,e,i){var a,s=this.w,r=t.strokeDashArray,o=this.helpers.getY1Y2(\"y1\",t),n=t.label.text;if(null===t.y2||void 0===t.y2){var l=this.annoCtx.graphics.drawLine(0+t.offsetX,o+t.offsetY,this._getYAxisAnnotationWidth(t),o+t.offsetY,t.borderColor,r,t.borderWidth);e.appendChild(l.node),t.id&&l.node.classList.add(t.id)}else{if((a=this.helpers.getY1Y2(\"y2\",t))>o){var h=o;o=a,a=h}var c=this.annoCtx.graphics.drawRect(0+t.offsetX,a+t.offsetY,this._getYAxisAnnotationWidth(t),o-a,0,t.fillColor,t.opacity,1,t.borderColor,r);c.node.classList.add(\"apexcharts-annotation-rect\"),c.attr(\"clip-path\",\"url(#gridRectMask\".concat(s.globals.cuid,\")\")),e.appendChild(c.node),t.id&&c.node.classList.add(t.id)}var d=\"right\"===t.label.position?s.globals.gridWidth:\"center\"===t.label.position?s.globals.gridWidth/2:0,g=this.annoCtx.graphics.drawText({x:d+t.label.offsetX,y:(null!=a?a:o)+t.label.offsetY-3,text:n,textAnchor:t.label.textAnchor,fontSize:t.label.style.fontSize,fontFamily:t.label.style.fontFamily,fontWeight:t.label.style.fontWeight,foreColor:t.label.style.color,cssClass:\"apexcharts-yaxis-annotation-label \".concat(t.label.style.cssClass,\" \").concat(t.id?t.id:\"\")});g.attr({rel:i}),e.appendChild(g.node)}},{key:\"_getYAxisAnnotationWidth\",value:function(t){var e=this.w;e.globals.gridWidth;return(t.width.indexOf(\"%\")>-1?e.globals.gridWidth*parseInt(t.width,10)/100:parseInt(t.width,10))+t.offsetX}},{key:\"drawYAxisAnnotations\",value:function(){var t=this,e=this.w,i=this.annoCtx.graphics.group({class:\"apexcharts-yaxis-annotations\"});return e.config.annotations.yaxis.map((function(e,a){t.addYaxisAnnotation(e,i.node,a)})),i}}]),t}(),S=function(){function t(e){a(this,t),this.w=e.w,this.annoCtx=e,this.helpers=new w(this.annoCtx)}return r(t,[{key:\"addPointAnnotation\",value:function(t,e,i){this.w;var a=this.helpers.getX1X2(\"x1\",t),s=this.helpers.getY1Y2(\"y1\",t);if(x.isNumber(a)){var r={pSize:t.marker.size,pointStrokeWidth:t.marker.strokeWidth,pointFillColor:t.marker.fillColor,pointStrokeColor:t.marker.strokeColor,shape:t.marker.shape,pRadius:t.marker.radius,class:\"apexcharts-point-annotation-marker \".concat(t.marker.cssClass,\" \").concat(t.id?t.id:\"\")},o=this.annoCtx.graphics.drawMarker(a+t.marker.offsetX,s+t.marker.offsetY,r);e.appendChild(o.node);var n=t.label.text?t.label.text:\"\",l=this.annoCtx.graphics.drawText({x:a+t.label.offsetX,y:s+t.label.offsetY-t.marker.size-parseFloat(t.label.style.fontSize)/1.6,text:n,textAnchor:t.label.textAnchor,fontSize:t.label.style.fontSize,fontFamily:t.label.style.fontFamily,fontWeight:t.label.style.fontWeight,foreColor:t.label.style.color,cssClass:\"apexcharts-point-annotation-label \".concat(t.label.style.cssClass,\" \").concat(t.id?t.id:\"\")});if(l.attr({rel:i}),e.appendChild(l.node),t.customSVG.SVG){var h=this.annoCtx.graphics.group({class:\"apexcharts-point-annotations-custom-svg \"+t.customSVG.cssClass});h.attr({transform:\"translate(\".concat(a+t.customSVG.offsetX,\", \").concat(s+t.customSVG.offsetY,\")\")}),h.node.innerHTML=t.customSVG.SVG,e.appendChild(h.node)}if(t.image.path){var c=t.image.width?t.image.width:20,d=t.image.height?t.image.height:20;o=this.annoCtx.addImage({x:a+t.image.offsetX-c/2,y:s+t.image.offsetY-d/2,width:c,height:d,path:t.image.path,appendTo:\".apexcharts-point-annotations\"})}t.mouseEnter&&o.node.addEventListener(\"mouseenter\",t.mouseEnter.bind(this,t)),t.mouseLeave&&o.node.addEventListener(\"mouseleave\",t.mouseLeave.bind(this,t)),t.click&&o.node.addEventListener(\"click\",t.click.bind(this,t))}}},{key:\"drawPointAnnotations\",value:function(){var t=this,e=this.w,i=this.annoCtx.graphics.group({class:\"apexcharts-point-annotations\"});return e.config.annotations.points.map((function(e,a){t.addPointAnnotation(e,i.node,a)})),i}}]),t}();var C={name:\"en\",options:{months:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],shortMonths:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],days:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],shortDays:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],toolbar:{exportToSVG:\"Download SVG\",exportToPNG:\"Download PNG\",exportToCSV:\"Download CSV\",menu:\"Menu\",selection:\"Selection\",selectionZoom:\"Selection Zoom\",zoomIn:\"Zoom In\",zoomOut:\"Zoom Out\",pan:\"Panning\",reset:\"Reset Zoom\"}}},L=function(){function t(){a(this,t),this.yAxis={show:!0,showAlways:!1,showForNullSeries:!0,seriesName:void 0,opposite:!1,reversed:!1,logarithmic:!1,logBase:10,tickAmount:void 0,forceNiceScale:!1,max:void 0,min:void 0,floating:!1,decimalsInFloat:void 0,labels:{show:!0,minWidth:0,maxWidth:160,offsetX:0,offsetY:0,align:void 0,rotate:0,padding:20,style:{colors:[],fontSize:\"11px\",fontWeight:400,fontFamily:void 0,cssClass:\"\"},formatter:void 0},axisBorder:{show:!1,color:\"#e0e0e0\",width:1,offsetX:0,offsetY:0},axisTicks:{show:!1,color:\"#e0e0e0\",width:6,offsetX:0,offsetY:0},title:{text:void 0,rotate:-90,offsetY:0,offsetX:0,style:{color:void 0,fontSize:\"11px\",fontWeight:900,fontFamily:void 0,cssClass:\"\"}},tooltip:{enabled:!1,offsetX:0},crosshairs:{show:!0,position:\"front\",stroke:{color:\"#b6b6b6\",width:1,dashArray:0}}},this.pointAnnotation={id:void 0,x:0,y:null,yAxisIndex:0,seriesIndex:0,mouseEnter:void 0,mouseLeave:void 0,click:void 0,marker:{size:4,fillColor:\"#fff\",strokeWidth:2,strokeColor:\"#333\",shape:\"circle\",offsetX:0,offsetY:0,radius:2,cssClass:\"\"},label:{borderColor:\"#c2c2c2\",borderWidth:1,borderRadius:2,text:void 0,textAnchor:\"middle\",offsetX:0,offsetY:0,mouseEnter:void 0,mouseLeave:void 0,click:void 0,style:{background:\"#fff\",color:void 0,fontSize:\"11px\",fontFamily:void 0,fontWeight:400,cssClass:\"\",padding:{left:5,right:5,top:2,bottom:2}}},customSVG:{SVG:void 0,cssClass:void 0,offsetX:0,offsetY:0},image:{path:void 0,width:20,height:20,offsetX:0,offsetY:0}},this.yAxisAnnotation={id:void 0,y:0,y2:null,strokeDashArray:1,fillColor:\"#c2c2c2\",borderColor:\"#c2c2c2\",borderWidth:1,opacity:.3,offsetX:0,offsetY:0,width:\"100%\",yAxisIndex:0,label:{borderColor:\"#c2c2c2\",borderWidth:1,borderRadius:2,text:void 0,textAnchor:\"end\",position:\"right\",offsetX:0,offsetY:-3,mouseEnter:void 0,mouseLeave:void 0,click:void 0,style:{background:\"#fff\",color:void 0,fontSize:\"11px\",fontFamily:void 0,fontWeight:400,cssClass:\"\",padding:{left:5,right:5,top:2,bottom:2}}}},this.xAxisAnnotation={id:void 0,x:0,x2:null,strokeDashArray:1,fillColor:\"#c2c2c2\",borderColor:\"#c2c2c2\",borderWidth:1,opacity:.3,offsetX:0,offsetY:0,label:{borderColor:\"#c2c2c2\",borderWidth:1,borderRadius:2,text:void 0,textAnchor:\"middle\",orientation:\"vertical\",position:\"top\",offsetX:0,offsetY:0,mouseEnter:void 0,mouseLeave:void 0,click:void 0,style:{background:\"#fff\",color:void 0,fontSize:\"11px\",fontFamily:void 0,fontWeight:400,cssClass:\"\",padding:{left:5,right:5,top:2,bottom:2}}}},this.text={x:0,y:0,text:\"\",textAnchor:\"start\",foreColor:void 0,fontSize:\"13px\",fontFamily:void 0,fontWeight:400,appendTo:\".apexcharts-annotations\",backgroundColor:\"transparent\",borderColor:\"#c2c2c2\",borderRadius:0,borderWidth:0,paddingLeft:4,paddingRight:4,paddingTop:2,paddingBottom:2}}return r(t,[{key:\"init\",value:function(){return{annotations:{yaxis:[this.yAxisAnnotation],xaxis:[this.xAxisAnnotation],points:[this.pointAnnotation],texts:[],images:[],shapes:[]},chart:{animations:{enabled:!0,easing:\"easeinout\",speed:800,animateGradually:{delay:150,enabled:!0},dynamicAnimation:{enabled:!0,speed:350}},background:\"transparent\",locales:[C],defaultLocale:\"en\",dropShadow:{enabled:!1,enabledOnSeries:void 0,top:2,left:2,blur:4,color:\"#000\",opacity:.35},events:{animationEnd:void 0,beforeMount:void 0,mounted:void 0,updated:void 0,click:void 0,mouseMove:void 0,mouseLeave:void 0,xAxisLabelClick:void 0,legendClick:void 0,markerClick:void 0,selection:void 0,dataPointSelection:void 0,dataPointMouseEnter:void 0,dataPointMouseLeave:void 0,beforeZoom:void 0,beforeResetZoom:void 0,zoomed:void 0,scrolled:void 0,brushScrolled:void 0},foreColor:\"#373d3f\",fontFamily:\"Helvetica, Arial, sans-serif\",height:\"auto\",parentHeightOffset:15,redrawOnParentResize:!0,redrawOnWindowResize:!0,id:void 0,group:void 0,offsetX:0,offsetY:0,selection:{enabled:!1,type:\"x\",fill:{color:\"#24292e\",opacity:.1},stroke:{width:1,color:\"#24292e\",opacity:.4,dashArray:3},xaxis:{min:void 0,max:void 0},yaxis:{min:void 0,max:void 0}},sparkline:{enabled:!1},brush:{enabled:!1,autoScaleYaxis:!0,target:void 0},stacked:!1,stackType:\"normal\",toolbar:{show:!0,offsetX:0,offsetY:0,tools:{download:!0,selection:!0,zoom:!0,zoomin:!0,zoomout:!0,pan:!0,reset:!0,customIcons:[]},export:{csv:{filename:void 0,columnDelimiter:\",\",headerCategory:\"category\",headerValue:\"value\",dateFormatter:function(t){return new Date(t).toDateString()}},png:{filename:void 0},svg:{filename:void 0}},autoSelected:\"zoom\"},type:\"line\",width:\"100%\",zoom:{enabled:!0,type:\"x\",autoScaleYaxis:!1,zoomedArea:{fill:{color:\"#90CAF9\",opacity:.4},stroke:{color:\"#0D47A1\",opacity:.4,width:1}}}},plotOptions:{area:{fillTo:\"origin\"},bar:{horizontal:!1,columnWidth:\"70%\",barHeight:\"70%\",distributed:!1,borderRadius:0,borderRadiusApplication:\"around\",borderRadiusWhenStacked:\"last\",rangeBarOverlap:!0,rangeBarGroupRows:!1,hideZeroBarsWhenGrouped:!1,colors:{ranges:[],backgroundBarColors:[],backgroundBarOpacity:1,backgroundBarRadius:0},dataLabels:{position:\"top\",maxItems:100,hideOverflowingLabels:!0,orientation:\"horizontal\",total:{enabled:!1,formatter:void 0,offsetX:0,offsetY:0,style:{color:\"#373d3f\",fontSize:\"12px\",fontFamily:void 0,fontWeight:600}}}},bubble:{zScaling:!0,minBubbleRadius:void 0,maxBubbleRadius:void 0},candlestick:{colors:{upward:\"#00B746\",downward:\"#EF403C\"},wick:{useFillColor:!0}},boxPlot:{colors:{upper:\"#00E396\",lower:\"#008FFB\"}},heatmap:{radius:2,enableShades:!0,shadeIntensity:.5,reverseNegativeShade:!1,distributed:!1,useFillColorAsStroke:!1,colorScale:{inverse:!1,ranges:[],min:void 0,max:void 0}},treemap:{enableShades:!0,shadeIntensity:.5,distributed:!1,reverseNegativeShade:!1,useFillColorAsStroke:!1,colorScale:{inverse:!1,ranges:[],min:void 0,max:void 0}},radialBar:{inverseOrder:!1,startAngle:0,endAngle:360,offsetX:0,offsetY:0,hollow:{margin:5,size:\"50%\",background:\"transparent\",image:void 0,imageWidth:150,imageHeight:150,imageOffsetX:0,imageOffsetY:0,imageClipped:!0,position:\"front\",dropShadow:{enabled:!1,top:0,left:0,blur:3,color:\"#000\",opacity:.5}},track:{show:!0,startAngle:void 0,endAngle:void 0,background:\"#f2f2f2\",strokeWidth:\"97%\",opacity:1,margin:5,dropShadow:{enabled:!1,top:0,left:0,blur:3,color:\"#000\",opacity:.5}},dataLabels:{show:!0,name:{show:!0,fontSize:\"16px\",fontFamily:void 0,fontWeight:600,color:void 0,offsetY:0,formatter:function(t){return t}},value:{show:!0,fontSize:\"14px\",fontFamily:void 0,fontWeight:400,color:void 0,offsetY:16,formatter:function(t){return t+\"%\"}},total:{show:!1,label:\"Total\",fontSize:\"16px\",fontWeight:600,fontFamily:void 0,color:void 0,formatter:function(t){return t.globals.seriesTotals.reduce((function(t,e){return t+e}),0)/t.globals.series.length+\"%\"}}}},pie:{customScale:1,offsetX:0,offsetY:0,startAngle:0,endAngle:360,expandOnClick:!0,dataLabels:{offset:0,minAngleToShowLabel:10},donut:{size:\"65%\",background:\"transparent\",labels:{show:!1,name:{show:!0,fontSize:\"16px\",fontFamily:void 0,fontWeight:600,color:void 0,offsetY:-10,formatter:function(t){return t}},value:{show:!0,fontSize:\"20px\",fontFamily:void 0,fontWeight:400,color:void 0,offsetY:10,formatter:function(t){return t}},total:{show:!1,showAlways:!1,label:\"Total\",fontSize:\"16px\",fontWeight:400,fontFamily:void 0,color:void 0,formatter:function(t){return t.globals.seriesTotals.reduce((function(t,e){return t+e}),0)}}}}},polarArea:{rings:{strokeWidth:1,strokeColor:\"#e8e8e8\"},spokes:{strokeWidth:1,connectorColors:\"#e8e8e8\"}},radar:{size:void 0,offsetX:0,offsetY:0,polygons:{strokeWidth:1,strokeColors:\"#e8e8e8\",connectorColors:\"#e8e8e8\",fill:{colors:void 0}}}},colors:void 0,dataLabels:{enabled:!0,enabledOnSeries:void 0,formatter:function(t){return null!==t?t:\"\"},textAnchor:\"middle\",distributed:!1,offsetX:0,offsetY:0,style:{fontSize:\"12px\",fontFamily:void 0,fontWeight:600,colors:void 0},background:{enabled:!0,foreColor:\"#fff\",borderRadius:2,padding:4,opacity:.9,borderWidth:1,borderColor:\"#fff\",dropShadow:{enabled:!1,top:1,left:1,blur:1,color:\"#000\",opacity:.45}},dropShadow:{enabled:!1,top:1,left:1,blur:1,color:\"#000\",opacity:.45}},fill:{type:\"solid\",colors:void 0,opacity:.85,gradient:{shade:\"dark\",type:\"horizontal\",shadeIntensity:.5,gradientToColors:void 0,inverseColors:!0,opacityFrom:1,opacityTo:1,stops:[0,50,100],colorStops:[]},image:{src:[],width:void 0,height:void 0},pattern:{style:\"squares\",width:6,height:6,strokeWidth:2}},forecastDataPoints:{count:0,fillOpacity:.5,strokeWidth:void 0,dashArray:4},grid:{show:!0,borderColor:\"#e0e0e0\",strokeDashArray:0,position:\"back\",xaxis:{lines:{show:!1}},yaxis:{lines:{show:!0}},row:{colors:void 0,opacity:.5},column:{colors:void 0,opacity:.5},padding:{top:0,right:10,bottom:0,left:12}},labels:[],legend:{show:!0,showForSingleSeries:!1,showForNullSeries:!0,showForZeroSeries:!0,floating:!1,position:\"bottom\",horizontalAlign:\"center\",inverseOrder:!1,fontSize:\"12px\",fontFamily:void 0,fontWeight:400,width:void 0,height:void 0,formatter:void 0,tooltipHoverFormatter:void 0,offsetX:-20,offsetY:4,customLegendItems:[],labels:{colors:void 0,useSeriesColors:!1},markers:{width:12,height:12,strokeWidth:0,fillColors:void 0,strokeColor:\"#fff\",radius:12,customHTML:void 0,offsetX:0,offsetY:0,onClick:void 0},itemMargin:{horizontal:5,vertical:2},onItemClick:{toggleDataSeries:!0},onItemHover:{highlightDataSeries:!0}},markers:{discrete:[],size:0,colors:void 0,strokeColors:\"#fff\",strokeWidth:2,strokeOpacity:.9,strokeDashArray:0,fillOpacity:1,shape:\"circle\",width:8,height:8,radius:2,offsetX:0,offsetY:0,onClick:void 0,onDblClick:void 0,showNullDataPoints:!0,hover:{size:void 0,sizeOffset:3}},noData:{text:void 0,align:\"center\",verticalAlign:\"middle\",offsetX:0,offsetY:0,style:{color:void 0,fontSize:\"14px\",fontFamily:void 0}},responsive:[],series:void 0,states:{normal:{filter:{type:\"none\",value:0}},hover:{filter:{type:\"lighten\",value:.1}},active:{allowMultipleDataPointsSelection:!1,filter:{type:\"darken\",value:.5}}},title:{text:void 0,align:\"left\",margin:5,offsetX:0,offsetY:0,floating:!1,style:{fontSize:\"14px\",fontWeight:900,fontFamily:void 0,color:void 0}},subtitle:{text:void 0,align:\"left\",margin:5,offsetX:0,offsetY:30,floating:!1,style:{fontSize:\"12px\",fontWeight:400,fontFamily:void 0,color:void 0}},stroke:{show:!0,curve:\"smooth\",lineCap:\"butt\",width:2,colors:void 0,dashArray:0,fill:{type:\"solid\",colors:void 0,opacity:.85,gradient:{shade:\"dark\",type:\"horizontal\",shadeIntensity:.5,gradientToColors:void 0,inverseColors:!0,opacityFrom:1,opacityTo:1,stops:[0,50,100],colorStops:[]}}},tooltip:{enabled:!0,enabledOnSeries:void 0,shared:!0,followCursor:!1,intersect:!1,inverseOrder:!1,custom:void 0,fillSeriesColor:!1,theme:\"light\",cssClass:\"\",style:{fontSize:\"12px\",fontFamily:void 0},onDatasetHover:{highlightDataSeries:!1},x:{show:!0,format:\"dd MMM\",formatter:void 0},y:{formatter:void 0,title:{formatter:function(t){return t?t+\": \":\"\"}}},z:{formatter:void 0,title:\"Size: \"},marker:{show:!0,fillColors:void 0},items:{display:\"flex\"},fixed:{enabled:!1,position:\"topRight\",offsetX:0,offsetY:0}},xaxis:{type:\"category\",categories:[],convertedCatToNumeric:!1,offsetX:0,offsetY:0,overwriteCategories:void 0,labels:{show:!0,rotate:-45,rotateAlways:!1,hideOverlappingLabels:!0,trim:!1,minHeight:void 0,maxHeight:120,showDuplicates:!0,style:{colors:[],fontSize:\"12px\",fontWeight:400,fontFamily:void 0,cssClass:\"\"},offsetX:0,offsetY:0,format:void 0,formatter:void 0,datetimeUTC:!0,datetimeFormatter:{year:\"yyyy\",month:\"MMM 'yy\",day:\"dd MMM\",hour:\"HH:mm\",minute:\"HH:mm:ss\",second:\"HH:mm:ss\"}},group:{groups:[],style:{colors:[],fontSize:\"12px\",fontWeight:400,fontFamily:void 0,cssClass:\"\"}},axisBorder:{show:!0,color:\"#e0e0e0\",width:\"100%\",height:1,offsetX:0,offsetY:0},axisTicks:{show:!0,color:\"#e0e0e0\",height:6,offsetX:0,offsetY:0},tickAmount:void 0,tickPlacement:\"on\",min:void 0,max:void 0,range:void 0,floating:!1,decimalsInFloat:void 0,position:\"bottom\",title:{text:void 0,offsetX:0,offsetY:0,style:{color:void 0,fontSize:\"12px\",fontWeight:900,fontFamily:void 0,cssClass:\"\"}},crosshairs:{show:!0,width:1,position:\"back\",opacity:.9,stroke:{color:\"#b6b6b6\",width:1,dashArray:3},fill:{type:\"solid\",color:\"#B1B9C4\",gradient:{colorFrom:\"#D8E3F0\",colorTo:\"#BED1E6\",stops:[0,100],opacityFrom:.4,opacityTo:.5}},dropShadow:{enabled:!1,left:0,top:0,blur:1,opacity:.4}},tooltip:{enabled:!0,offsetY:0,formatter:void 0,style:{fontSize:\"12px\",fontFamily:void 0}}},yaxis:this.yAxis,theme:{mode:\"light\",palette:\"palette1\",monochrome:{enabled:!1,color:\"#008FFB\",shadeTo:\"light\",shadeIntensity:.65}}}}}]),t}(),P=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.graphics=new m(this.ctx),this.w.globals.isBarHorizontal&&(this.invertAxis=!0),this.helpers=new w(this),this.xAxisAnnotations=new k(this),this.yAxisAnnotations=new A(this),this.pointsAnnotations=new S(this),this.w.globals.isBarHorizontal&&this.w.config.yaxis[0].reversed&&(this.inversedReversedAxis=!0),this.xDivision=this.w.globals.gridWidth/this.w.globals.dataPoints}return r(t,[{key:\"drawAxesAnnotations\",value:function(){var t=this.w;if(t.globals.axisCharts){for(var e=this.yAxisAnnotations.drawYAxisAnnotations(),i=this.xAxisAnnotations.drawXAxisAnnotations(),a=this.pointsAnnotations.drawPointAnnotations(),s=t.config.chart.animations.enabled,r=[e,i,a],o=[i.node,e.node,a.node],n=0;n<3;n++)t.globals.dom.elGraphical.add(r[n]),!s||t.globals.resized||t.globals.dataChanged||\"scatter\"!==t.config.chart.type&&\"bubble\"!==t.config.chart.type&&t.globals.dataPoints>1&&o[n].classList.add(\"apexcharts-element-hidden\"),t.globals.delayedElements.push({el:o[n],index:0});this.helpers.annotationsBackground()}}},{key:\"drawImageAnnos\",value:function(){var t=this;this.w.config.annotations.images.map((function(e,i){t.addImage(e,i)}))}},{key:\"drawTextAnnos\",value:function(){var t=this;this.w.config.annotations.texts.map((function(e,i){t.addText(e,i)}))}},{key:\"addXaxisAnnotation\",value:function(t,e,i){this.xAxisAnnotations.addXaxisAnnotation(t,e,i)}},{key:\"addYaxisAnnotation\",value:function(t,e,i){this.yAxisAnnotations.addYaxisAnnotation(t,e,i)}},{key:\"addPointAnnotation\",value:function(t,e,i){this.pointsAnnotations.addPointAnnotation(t,e,i)}},{key:\"addText\",value:function(t,e){var i=t.x,a=t.y,s=t.text,r=t.textAnchor,o=t.foreColor,n=t.fontSize,l=t.fontFamily,h=t.fontWeight,c=t.cssClass,d=t.backgroundColor,g=t.borderWidth,u=t.strokeDashArray,f=t.borderRadius,p=t.borderColor,x=t.appendTo,b=void 0===x?\".apexcharts-annotations\":x,v=t.paddingLeft,m=void 0===v?4:v,y=t.paddingRight,w=void 0===y?4:y,k=t.paddingBottom,A=void 0===k?2:k,S=t.paddingTop,C=void 0===S?2:S,L=this.w,P=this.graphics.drawText({x:i,y:a,text:s,textAnchor:r||\"start\",fontSize:n||\"12px\",fontWeight:h||\"regular\",fontFamily:l||L.config.chart.fontFamily,foreColor:o||L.config.chart.foreColor,cssClass:c}),I=L.globals.dom.baseEl.querySelector(b);I&&I.appendChild(P.node);var T=P.bbox();if(s){var M=this.graphics.drawRect(T.x-m,T.y-C,T.width+m+w,T.height+A+C,f,d||\"transparent\",1,g,p,u);I.insertBefore(M.node,P.node)}}},{key:\"addImage\",value:function(t,e){var i=this.w,a=t.path,s=t.x,r=void 0===s?0:s,o=t.y,n=void 0===o?0:o,l=t.width,h=void 0===l?20:l,c=t.height,d=void 0===c?20:c,g=t.appendTo,u=void 0===g?\".apexcharts-annotations\":g,f=i.globals.dom.Paper.image(a);f.size(h,d).move(r,n);var p=i.globals.dom.baseEl.querySelector(u);return p&&p.appendChild(f.node),f}},{key:\"addXaxisAnnotationExternal\",value:function(t,e,i){return this.addAnnotationExternal({params:t,pushToMemory:e,context:i,type:\"xaxis\",contextMethod:i.addXaxisAnnotation}),i}},{key:\"addYaxisAnnotationExternal\",value:function(t,e,i){return this.addAnnotationExternal({params:t,pushToMemory:e,context:i,type:\"yaxis\",contextMethod:i.addYaxisAnnotation}),i}},{key:\"addPointAnnotationExternal\",value:function(t,e,i){return void 0===this.invertAxis&&(this.invertAxis=i.w.globals.isBarHorizontal),this.addAnnotationExternal({params:t,pushToMemory:e,context:i,type:\"point\",contextMethod:i.addPointAnnotation}),i}},{key:\"addAnnotationExternal\",value:function(t){var e=t.params,i=t.pushToMemory,a=t.context,s=t.type,r=t.contextMethod,o=a,n=o.w,l=n.globals.dom.baseEl.querySelector(\".apexcharts-\".concat(s,\"-annotations\")),h=l.childNodes.length+1,c=new L,d=Object.assign({},\"xaxis\"===s?c.xAxisAnnotation:\"yaxis\"===s?c.yAxisAnnotation:c.pointAnnotation),g=x.extend(d,e);switch(s){case\"xaxis\":this.addXaxisAnnotation(g,l,h);break;case\"yaxis\":this.addYaxisAnnotation(g,l,h);break;case\"point\":this.addPointAnnotation(g,l,h)}var u=n.globals.dom.baseEl.querySelector(\".apexcharts-\".concat(s,\"-annotations .apexcharts-\").concat(s,\"-annotation-label[rel='\").concat(h,\"']\")),f=this.helpers.addBackgroundToAnno(u,g);return f&&l.insertBefore(f.node,u),i&&n.globals.memory.methodsToExec.push({context:o,id:g.id?g.id:x.randomId(),method:r,label:\"addAnnotation\",params:e}),a}},{key:\"clearAnnotations\",value:function(t){var e=t.w,i=e.globals.dom.baseEl.querySelectorAll(\".apexcharts-yaxis-annotations, .apexcharts-xaxis-annotations, .apexcharts-point-annotations\");e.globals.memory.methodsToExec.map((function(t,i){\"addText\"!==t.label&&\"addAnnotation\"!==t.label||e.globals.memory.methodsToExec.splice(i,1)})),i=x.listToArray(i),Array.prototype.forEach.call(i,(function(t){for(;t.firstChild;)t.removeChild(t.firstChild)}))}},{key:\"removeAnnotation\",value:function(t,e){var i=t.w,a=i.globals.dom.baseEl.querySelectorAll(\".\".concat(e));a&&(i.globals.memory.methodsToExec.map((function(t,a){t.id===e&&i.globals.memory.methodsToExec.splice(a,1)})),Array.prototype.forEach.call(a,(function(t){t.parentElement.removeChild(t)})))}}]),t}(),I=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.months31=[1,3,5,7,8,10,12],this.months30=[2,4,6,9,11],this.daysCntOfYear=[0,31,59,90,120,151,181,212,243,273,304,334]}return r(t,[{key:\"isValidDate\",value:function(t){return!isNaN(this.parseDate(t))}},{key:\"getTimeStamp\",value:function(t){return Date.parse(t)?this.w.config.xaxis.labels.datetimeUTC?new Date(new Date(t).toISOString().substr(0,25)).getTime():new Date(t).getTime():t}},{key:\"getDate\",value:function(t){return this.w.config.xaxis.labels.datetimeUTC?new Date(new Date(t).toUTCString()):new Date(t)}},{key:\"parseDate\",value:function(t){var e=Date.parse(t);if(!isNaN(e))return this.getTimeStamp(t);var i=Date.parse(t.replace(/-/g,\"/\").replace(/[a-z]+/gi,\" \"));return i=this.getTimeStamp(i)}},{key:\"parseDateWithTimezone\",value:function(t){return Date.parse(t.replace(/-/g,\"/\").replace(/[a-z]+/gi,\" \"))}},{key:\"formatDate\",value:function(t,e){var i=this.w.globals.locale,a=this.w.config.xaxis.labels.datetimeUTC,s=[\"\\0\"].concat(u(i.months)),r=[\"\\x01\"].concat(u(i.shortMonths)),o=[\"\\x02\"].concat(u(i.days)),n=[\"\\x03\"].concat(u(i.shortDays));function l(t,e){var i=t+\"\";for(e=e||2;i.length<e;)i=\"0\"+i;return i}var h=a?t.getUTCFullYear():t.getFullYear();e=(e=(e=e.replace(/(^|[^\\\\])yyyy+/g,\"$1\"+h)).replace(/(^|[^\\\\])yy/g,\"$1\"+h.toString().substr(2,2))).replace(/(^|[^\\\\])y/g,\"$1\"+h);var c=(a?t.getUTCMonth():t.getMonth())+1;e=(e=(e=(e=e.replace(/(^|[^\\\\])MMMM+/g,\"$1\"+s[0])).replace(/(^|[^\\\\])MMM/g,\"$1\"+r[0])).replace(/(^|[^\\\\])MM/g,\"$1\"+l(c))).replace(/(^|[^\\\\])M/g,\"$1\"+c);var d=a?t.getUTCDate():t.getDate();e=(e=(e=(e=e.replace(/(^|[^\\\\])dddd+/g,\"$1\"+o[0])).replace(/(^|[^\\\\])ddd/g,\"$1\"+n[0])).replace(/(^|[^\\\\])dd/g,\"$1\"+l(d))).replace(/(^|[^\\\\])d/g,\"$1\"+d);var g=a?t.getUTCHours():t.getHours(),f=g>12?g-12:0===g?12:g;e=(e=(e=(e=e.replace(/(^|[^\\\\])HH+/g,\"$1\"+l(g))).replace(/(^|[^\\\\])H/g,\"$1\"+g)).replace(/(^|[^\\\\])hh+/g,\"$1\"+l(f))).replace(/(^|[^\\\\])h/g,\"$1\"+f);var p=a?t.getUTCMinutes():t.getMinutes();e=(e=e.replace(/(^|[^\\\\])mm+/g,\"$1\"+l(p))).replace(/(^|[^\\\\])m/g,\"$1\"+p);var x=a?t.getUTCSeconds():t.getSeconds();e=(e=e.replace(/(^|[^\\\\])ss+/g,\"$1\"+l(x))).replace(/(^|[^\\\\])s/g,\"$1\"+x);var b=a?t.getUTCMilliseconds():t.getMilliseconds();e=e.replace(/(^|[^\\\\])fff+/g,\"$1\"+l(b,3)),b=Math.round(b/10),e=e.replace(/(^|[^\\\\])ff/g,\"$1\"+l(b)),b=Math.round(b/10);var v=g<12?\"AM\":\"PM\";e=(e=(e=e.replace(/(^|[^\\\\])f/g,\"$1\"+b)).replace(/(^|[^\\\\])TT+/g,\"$1\"+v)).replace(/(^|[^\\\\])T/g,\"$1\"+v.charAt(0));var m=v.toLowerCase();e=(e=e.replace(/(^|[^\\\\])tt+/g,\"$1\"+m)).replace(/(^|[^\\\\])t/g,\"$1\"+m.charAt(0));var y=-t.getTimezoneOffset(),w=a||!y?\"Z\":y>0?\"+\":\"-\";if(!a){var k=(y=Math.abs(y))%60;w+=l(Math.floor(y/60))+\":\"+l(k)}e=e.replace(/(^|[^\\\\])K/g,\"$1\"+w);var A=(a?t.getUTCDay():t.getDay())+1;return e=(e=(e=(e=(e=e.replace(new RegExp(o[0],\"g\"),o[A])).replace(new RegExp(n[0],\"g\"),n[A])).replace(new RegExp(s[0],\"g\"),s[c])).replace(new RegExp(r[0],\"g\"),r[c])).replace(/\\\\(.)/g,\"$1\")}},{key:\"getTimeUnitsfromTimestamp\",value:function(t,e,i){var a=this.w;void 0!==a.config.xaxis.min&&(t=a.config.xaxis.min),void 0!==a.config.xaxis.max&&(e=a.config.xaxis.max);var s=this.getDate(t),r=this.getDate(e),o=this.formatDate(s,\"yyyy MM dd HH mm ss fff\").split(\" \"),n=this.formatDate(r,\"yyyy MM dd HH mm ss fff\").split(\" \");return{minMillisecond:parseInt(o[6],10),maxMillisecond:parseInt(n[6],10),minSecond:parseInt(o[5],10),maxSecond:parseInt(n[5],10),minMinute:parseInt(o[4],10),maxMinute:parseInt(n[4],10),minHour:parseInt(o[3],10),maxHour:parseInt(n[3],10),minDate:parseInt(o[2],10),maxDate:parseInt(n[2],10),minMonth:parseInt(o[1],10)-1,maxMonth:parseInt(n[1],10)-1,minYear:parseInt(o[0],10),maxYear:parseInt(n[0],10)}}},{key:\"isLeapYear\",value:function(t){return t%4==0&&t%100!=0||t%400==0}},{key:\"calculcateLastDaysOfMonth\",value:function(t,e,i){return this.determineDaysOfMonths(t,e)-i}},{key:\"determineDaysOfYear\",value:function(t){var e=365;return this.isLeapYear(t)&&(e=366),e}},{key:\"determineRemainingDaysOfYear\",value:function(t,e,i){var a=this.daysCntOfYear[e]+i;return e>1&&this.isLeapYear()&&a++,a}},{key:\"determineDaysOfMonths\",value:function(t,e){var i=30;switch(t=x.monthMod(t),!0){case this.months30.indexOf(t)>-1:2===t&&(i=this.isLeapYear(e)?29:28);break;case this.months31.indexOf(t)>-1:default:i=31}return i}}]),t}(),T=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.tooltipKeyFormat=\"dd MMM\"}return r(t,[{key:\"xLabelFormat\",value:function(t,e,i,a){var s=this.w;if(\"datetime\"===s.config.xaxis.type&&void 0===s.config.xaxis.labels.formatter&&void 0===s.config.tooltip.x.formatter){var r=new I(this.ctx);return r.formatDate(r.getDate(e),s.config.tooltip.x.format)}return t(e,i,a)}},{key:\"defaultGeneralFormatter\",value:function(t){return Array.isArray(t)?t.map((function(t){return t})):t}},{key:\"defaultYFormatter\",value:function(t,e,i){var a=this.w;return x.isNumber(t)&&(t=0!==a.globals.yValueDecimal?t.toFixed(void 0!==e.decimalsInFloat?e.decimalsInFloat:a.globals.yValueDecimal):a.globals.maxYArr[i]-a.globals.minYArr[i]<5?t.toFixed(1):t.toFixed(0)),t}},{key:\"setLabelFormatters\",value:function(){var t=this,e=this.w;return e.globals.xaxisTooltipFormatter=function(e){return t.defaultGeneralFormatter(e)},e.globals.ttKeyFormatter=function(e){return t.defaultGeneralFormatter(e)},e.globals.ttZFormatter=function(t){return t},e.globals.legendFormatter=function(e){return t.defaultGeneralFormatter(e)},void 0!==e.config.xaxis.labels.formatter?e.globals.xLabelFormatter=e.config.xaxis.labels.formatter:e.globals.xLabelFormatter=function(t){if(x.isNumber(t)){if(!e.config.xaxis.convertedCatToNumeric&&\"numeric\"===e.config.xaxis.type){if(x.isNumber(e.config.xaxis.decimalsInFloat))return t.toFixed(e.config.xaxis.decimalsInFloat);var i=e.globals.maxX-e.globals.minX;return i>0&&i<100?t.toFixed(1):t.toFixed(0)}if(e.globals.isBarHorizontal)if(e.globals.maxY-e.globals.minYArr<4)return t.toFixed(1);return t.toFixed(0)}return t},\"function\"==typeof e.config.tooltip.x.formatter?e.globals.ttKeyFormatter=e.config.tooltip.x.formatter:e.globals.ttKeyFormatter=e.globals.xLabelFormatter,\"function\"==typeof e.config.xaxis.tooltip.formatter&&(e.globals.xaxisTooltipFormatter=e.config.xaxis.tooltip.formatter),(Array.isArray(e.config.tooltip.y)||void 0!==e.config.tooltip.y.formatter)&&(e.globals.ttVal=e.config.tooltip.y),void 0!==e.config.tooltip.z.formatter&&(e.globals.ttZFormatter=e.config.tooltip.z.formatter),void 0!==e.config.legend.formatter&&(e.globals.legendFormatter=e.config.legend.formatter),e.config.yaxis.forEach((function(i,a){void 0!==i.labels.formatter?e.globals.yLabelFormatters[a]=i.labels.formatter:e.globals.yLabelFormatters[a]=function(s){return e.globals.xyCharts?Array.isArray(s)?s.map((function(e){return t.defaultYFormatter(e,i,a)})):t.defaultYFormatter(s,i,a):s}})),e.globals}},{key:\"heatmapLabelFormatters\",value:function(){var t=this.w;if(\"heatmap\"===t.config.chart.type){t.globals.yAxisScale[0].result=t.globals.seriesNames.slice();var e=t.globals.seriesNames.reduce((function(t,e){return t.length>e.length?t:e}),0);t.globals.yAxisScale[0].niceMax=e,t.globals.yAxisScale[0].niceMin=e}}}]),t}(),M=function(t){var e,i=t.isTimeline,a=t.ctx,s=t.seriesIndex,r=t.dataPointIndex,o=t.y1,n=t.y2,l=t.w,h=l.globals.seriesRangeStart[s][r],c=l.globals.seriesRangeEnd[s][r],d=l.globals.labels[r],g=l.config.series[s].name?l.config.series[s].name:\"\",u=l.globals.ttKeyFormatter,f=l.config.tooltip.y.title.formatter,p={w:l,seriesIndex:s,dataPointIndex:r,start:h,end:c};(\"function\"==typeof f&&(g=f(g,p)),null!==(e=l.config.series[s].data[r])&&void 0!==e&&e.x&&(d=l.config.series[s].data[r].x),i)||\"datetime\"===l.config.xaxis.type&&(d=new T(a).xLabelFormat(l.globals.ttKeyFormatter,d,d,{i:void 0,dateFormatter:new I(a).formatDate,w:l}));\"function\"==typeof u&&(d=u(d,p)),Number.isFinite(o)&&Number.isFinite(n)&&(h=o,c=n);var x=\"\",b=\"\",v=l.globals.colors[s];if(void 0===l.config.tooltip.x.formatter)if(\"datetime\"===l.config.xaxis.type){var m=new I(a);x=m.formatDate(m.getDate(h),l.config.tooltip.x.format),b=m.formatDate(m.getDate(c),l.config.tooltip.x.format)}else x=h,b=c;else x=l.config.tooltip.x.formatter(h),b=l.config.tooltip.x.formatter(c);return{start:h,end:c,startVal:x,endVal:b,ylabel:d,color:v,seriesName:g}},z=function(t){var e=t.color,i=t.seriesName,a=t.ylabel,s=t.start,r=t.end,o=t.seriesIndex,n=t.dataPointIndex,l=t.ctx.tooltip.tooltipLabels.getFormatters(o);s=l.yLbFormatter(s),r=l.yLbFormatter(r);var h=l.yLbFormatter(t.w.globals.series[o][n]),c='<span class=\"value start-value\">\\n  '.concat(s,'\\n  </span> <span class=\"separator\">-</span> <span class=\"value end-value\">\\n  ').concat(r,\"\\n  </span>\");return'<div class=\"apexcharts-tooltip-rangebar\"><div> <span class=\"series-name\" style=\"color: '+e+'\">'+(i||\"\")+'</span></div><div> <span class=\"category\">'+a+\": </span> \"+(t.w.globals.comboCharts?\"rangeArea\"===t.w.config.series[o].type||\"rangeBar\"===t.w.config.series[o].type?c:\"<span>\".concat(h,\"</span>\"):c)+\" </div></div>\"},X=function(){function t(e){a(this,t),this.opts=e}return r(t,[{key:\"line\",value:function(){return{chart:{animations:{easing:\"swing\"}},dataLabels:{enabled:!1},stroke:{width:5,curve:\"straight\"},markers:{size:0,hover:{sizeOffset:6}},xaxis:{crosshairs:{width:1}}}}},{key:\"sparkline\",value:function(t){this.opts.yaxis[0].show=!1,this.opts.yaxis[0].title.text=\"\",this.opts.yaxis[0].axisBorder.show=!1,this.opts.yaxis[0].axisTicks.show=!1,this.opts.yaxis[0].floating=!0;return x.extend(t,{grid:{show:!1,padding:{left:0,right:0,top:0,bottom:0}},legend:{show:!1},xaxis:{labels:{show:!1},tooltip:{enabled:!1},axisBorder:{show:!1},axisTicks:{show:!1}},chart:{toolbar:{show:!1},zoom:{enabled:!1}},dataLabels:{enabled:!1}})}},{key:\"bar\",value:function(){return{chart:{stacked:!1,animations:{easing:\"swing\"}},plotOptions:{bar:{dataLabels:{position:\"center\"}}},dataLabels:{style:{colors:[\"#fff\"]},background:{enabled:!1}},stroke:{width:0,lineCap:\"round\"},fill:{opacity:.85},legend:{markers:{shape:\"square\",radius:2,size:8}},tooltip:{shared:!1,intersect:!0},xaxis:{tooltip:{enabled:!1},tickPlacement:\"between\",crosshairs:{width:\"barWidth\",position:\"back\",fill:{type:\"gradient\"},dropShadow:{enabled:!1},stroke:{width:0}}}}}},{key:\"candlestick\",value:function(){var t=this;return{stroke:{width:1,colors:[\"#333\"]},fill:{opacity:1},dataLabels:{enabled:!1},tooltip:{shared:!0,custom:function(e){var i=e.seriesIndex,a=e.dataPointIndex,s=e.w;return t._getBoxTooltip(s,i,a,[\"Open\",\"High\",\"\",\"Low\",\"Close\"],\"candlestick\")}},states:{active:{filter:{type:\"none\"}}},xaxis:{crosshairs:{width:1}}}}},{key:\"boxPlot\",value:function(){var t=this;return{chart:{animations:{dynamicAnimation:{enabled:!1}}},stroke:{width:1,colors:[\"#24292e\"]},dataLabels:{enabled:!1},tooltip:{shared:!0,custom:function(e){var i=e.seriesIndex,a=e.dataPointIndex,s=e.w;return t._getBoxTooltip(s,i,a,[\"Minimum\",\"Q1\",\"Median\",\"Q3\",\"Maximum\"],\"boxPlot\")}},markers:{size:5,strokeWidth:1,strokeColors:\"#111\"},xaxis:{crosshairs:{width:1}}}}},{key:\"rangeBar\",value:function(){return{stroke:{width:0,lineCap:\"square\"},plotOptions:{bar:{borderRadius:0,dataLabels:{position:\"center\"}}},dataLabels:{enabled:!1,formatter:function(t,e){e.ctx;var i=e.seriesIndex,a=e.dataPointIndex,s=e.w,r=function(){var t=s.globals.seriesRangeStart[i][a];return s.globals.seriesRangeEnd[i][a]-t};return s.globals.comboCharts?\"rangeBar\"===s.config.series[i].type||\"rangeArea\"===s.config.series[i].type?r():t:r()},background:{enabled:!1},style:{colors:[\"#fff\"]}},tooltip:{shared:!1,followCursor:!0,custom:function(t){return t.w.config.plotOptions&&t.w.config.plotOptions.bar&&t.w.config.plotOptions.bar.horizontal?function(t){var i=M(e(e({},t),{},{isTimeline:!0})),a=i.color,s=i.seriesName,r=i.ylabel,o=i.startVal,n=i.endVal;return z(e(e({},t),{},{color:a,seriesName:s,ylabel:r,start:o,end:n}))}(t):function(t){var i=M(t),a=i.color,s=i.seriesName,r=i.ylabel,o=i.start,n=i.end;return z(e(e({},t),{},{color:a,seriesName:s,ylabel:r,start:o,end:n}))}(t)}},xaxis:{tickPlacement:\"between\",tooltip:{enabled:!1},crosshairs:{stroke:{width:0}}}}}},{key:\"area\",value:function(){return{stroke:{width:4,fill:{type:\"solid\",gradient:{inverseColors:!1,shade:\"light\",type:\"vertical\",opacityFrom:.65,opacityTo:.5,stops:[0,100,100]}}},fill:{type:\"gradient\",gradient:{inverseColors:!1,shade:\"light\",type:\"vertical\",opacityFrom:.65,opacityTo:.5,stops:[0,100,100]}},markers:{size:0,hover:{sizeOffset:6}},tooltip:{followCursor:!1}}}},{key:\"rangeArea\",value:function(){return{stroke:{curve:\"straight\",width:0},fill:{type:\"solid\",opacity:.6},markers:{size:0},states:{hover:{filter:{type:\"none\"}},active:{filter:{type:\"none\"}}},tooltip:{intersect:!1,shared:!0,followCursor:!0,custom:function(t){return function(t){var i=M(t),a=i.color,s=i.seriesName,r=i.ylabel,o=i.start,n=i.end;return z(e(e({},t),{},{color:a,seriesName:s,ylabel:r,start:o,end:n}))}(t)}}}}},{key:\"brush\",value:function(t){return x.extend(t,{chart:{toolbar:{autoSelected:\"selection\",show:!1},zoom:{enabled:!1}},dataLabels:{enabled:!1},stroke:{width:1},tooltip:{enabled:!1},xaxis:{tooltip:{enabled:!1}}})}},{key:\"stacked100\",value:function(t){t.dataLabels=t.dataLabels||{},t.dataLabels.formatter=t.dataLabels.formatter||void 0;var e=t.dataLabels.formatter;return t.yaxis.forEach((function(e,i){t.yaxis[i].min=0,t.yaxis[i].max=100})),\"bar\"===t.chart.type&&(t.dataLabels.formatter=e||function(t){return\"number\"==typeof t&&t?t.toFixed(0)+\"%\":t}),t}},{key:\"stackedBars\",value:function(){var t=this.bar();return e(e({},t),{},{plotOptions:e(e({},t.plotOptions),{},{bar:e(e({},t.plotOptions.bar),{},{borderRadiusApplication:\"end\",borderRadiusWhenStacked:\"last\"})})})}},{key:\"convertCatToNumeric\",value:function(t){return t.xaxis.convertedCatToNumeric=!0,t}},{key:\"convertCatToNumericXaxis\",value:function(t,e,i){t.xaxis.type=\"numeric\",t.xaxis.labels=t.xaxis.labels||{},t.xaxis.labels.formatter=t.xaxis.labels.formatter||function(t){return x.isNumber(t)?Math.floor(t):t};var a=t.xaxis.labels.formatter,s=t.xaxis.categories&&t.xaxis.categories.length?t.xaxis.categories:t.labels;return i&&i.length&&(s=i.map((function(t){return Array.isArray(t)?t:String(t)}))),s&&s.length&&(t.xaxis.labels.formatter=function(t){return x.isNumber(t)?a(s[Math.floor(t)-1]):a(t)}),t.xaxis.categories=[],t.labels=[],t.xaxis.tickAmount=t.xaxis.tickAmount||\"dataPoints\",t}},{key:\"bubble\",value:function(){return{dataLabels:{style:{colors:[\"#fff\"]}},tooltip:{shared:!1,intersect:!0},xaxis:{crosshairs:{width:0}},fill:{type:\"solid\",gradient:{shade:\"light\",inverse:!0,shadeIntensity:.55,opacityFrom:.4,opacityTo:.8}}}}},{key:\"scatter\",value:function(){return{dataLabels:{enabled:!1},tooltip:{shared:!1,intersect:!0},markers:{size:6,strokeWidth:1,hover:{sizeOffset:2}}}}},{key:\"heatmap\",value:function(){return{chart:{stacked:!1},fill:{opacity:1},dataLabels:{style:{colors:[\"#fff\"]}},stroke:{colors:[\"#fff\"]},tooltip:{followCursor:!0,marker:{show:!1},x:{show:!1}},legend:{position:\"top\",markers:{shape:\"square\",size:10,offsetY:2}},grid:{padding:{right:20}}}}},{key:\"treemap\",value:function(){return{chart:{zoom:{enabled:!1}},dataLabels:{style:{fontSize:14,fontWeight:600,colors:[\"#fff\"]}},stroke:{show:!0,width:2,colors:[\"#fff\"]},legend:{show:!1},fill:{gradient:{stops:[0,100]}},tooltip:{followCursor:!0,x:{show:!1}},grid:{padding:{left:0,right:0}},xaxis:{crosshairs:{show:!1},tooltip:{enabled:!1}}}}},{key:\"pie\",value:function(){return{chart:{toolbar:{show:!1}},plotOptions:{pie:{donut:{labels:{show:!1}}}},dataLabels:{formatter:function(t){return t.toFixed(1)+\"%\"},style:{colors:[\"#fff\"]},background:{enabled:!1},dropShadow:{enabled:!0}},stroke:{colors:[\"#fff\"]},fill:{opacity:1,gradient:{shade:\"light\",stops:[0,100]}},tooltip:{theme:\"dark\",fillSeriesColor:!0},legend:{position:\"right\"}}}},{key:\"donut\",value:function(){return{chart:{toolbar:{show:!1}},dataLabels:{formatter:function(t){return t.toFixed(1)+\"%\"},style:{colors:[\"#fff\"]},background:{enabled:!1},dropShadow:{enabled:!0}},stroke:{colors:[\"#fff\"]},fill:{opacity:1,gradient:{shade:\"light\",shadeIntensity:.35,stops:[80,100],opacityFrom:1,opacityTo:1}},tooltip:{theme:\"dark\",fillSeriesColor:!0},legend:{position:\"right\"}}}},{key:\"polarArea\",value:function(){return this.opts.yaxis[0].tickAmount=this.opts.yaxis[0].tickAmount?this.opts.yaxis[0].tickAmount:6,{chart:{toolbar:{show:!1}},dataLabels:{formatter:function(t){return t.toFixed(1)+\"%\"},enabled:!1},stroke:{show:!0,width:2},fill:{opacity:.7},tooltip:{theme:\"dark\",fillSeriesColor:!0},legend:{position:\"right\"}}}},{key:\"radar\",value:function(){return this.opts.yaxis[0].labels.offsetY=this.opts.yaxis[0].labels.offsetY?this.opts.yaxis[0].labels.offsetY:6,{dataLabels:{enabled:!1,style:{fontSize:\"11px\"}},stroke:{width:2},markers:{size:3,strokeWidth:1,strokeOpacity:1},fill:{opacity:.2},tooltip:{shared:!1,intersect:!0,followCursor:!0},grid:{show:!1},xaxis:{labels:{formatter:function(t){return t},style:{colors:[\"#a8a8a8\"],fontSize:\"11px\"}},tooltip:{enabled:!1},crosshairs:{show:!1}}}}},{key:\"radialBar\",value:function(){return{chart:{animations:{dynamicAnimation:{enabled:!0,speed:800}},toolbar:{show:!1}},fill:{gradient:{shade:\"dark\",shadeIntensity:.4,inverseColors:!1,type:\"diagonal2\",opacityFrom:1,opacityTo:1,stops:[70,98,100]}},legend:{show:!1,position:\"right\"},tooltip:{enabled:!1,fillSeriesColor:!0}}}},{key:\"_getBoxTooltip\",value:function(t,e,i,a,s){var r=t.globals.seriesCandleO[e][i],o=t.globals.seriesCandleH[e][i],n=t.globals.seriesCandleM[e][i],l=t.globals.seriesCandleL[e][i],h=t.globals.seriesCandleC[e][i];return t.config.series[e].type&&t.config.series[e].type!==s?'<div class=\"apexcharts-custom-tooltip\">\\n          '.concat(t.config.series[e].name?t.config.series[e].name:\"series-\"+(e+1),\": <strong>\").concat(t.globals.series[e][i],\"</strong>\\n        </div>\"):'<div class=\"apexcharts-tooltip-box apexcharts-tooltip-'.concat(t.config.chart.type,'\">')+\"<div>\".concat(a[0],': <span class=\"value\">')+r+\"</span></div>\"+\"<div>\".concat(a[1],': <span class=\"value\">')+o+\"</span></div>\"+(n?\"<div>\".concat(a[2],': <span class=\"value\">')+n+\"</span></div>\":\"\")+\"<div>\".concat(a[3],': <span class=\"value\">')+l+\"</span></div>\"+\"<div>\".concat(a[4],': <span class=\"value\">')+h+\"</span></div></div>\"}}]),t}(),E=function(){function t(e){a(this,t),this.opts=e}return r(t,[{key:\"init\",value:function(t){var e=t.responsiveOverride,a=this.opts,s=new L,r=new X(a);this.chartType=a.chart.type,a=this.extendYAxis(a),a=this.extendAnnotations(a);var o=s.init(),n={};if(a&&\"object\"===i(a)){var l={};l=-1!==[\"line\",\"area\",\"bar\",\"candlestick\",\"boxPlot\",\"rangeBar\",\"rangeArea\",\"bubble\",\"scatter\",\"heatmap\",\"treemap\",\"pie\",\"polarArea\",\"donut\",\"radar\",\"radialBar\"].indexOf(a.chart.type)?r[a.chart.type]():r.line(),a.chart.stacked&&\"bar\"===a.chart.type&&(l=r.stackedBars()),a.chart.brush&&a.chart.brush.enabled&&(l=r.brush(l)),a.chart.stacked&&\"100%\"===a.chart.stackType&&(a=r.stacked100(a)),this.checkForDarkTheme(window.Apex),this.checkForDarkTheme(a),a.xaxis=a.xaxis||window.Apex.xaxis||{},e||(a.xaxis.convertedCatToNumeric=!1),((a=this.checkForCatToNumericXAxis(this.chartType,l,a)).chart.sparkline&&a.chart.sparkline.enabled||window.Apex.chart&&window.Apex.chart.sparkline&&window.Apex.chart.sparkline.enabled)&&(l=r.sparkline(l)),n=x.extend(o,l)}var h=x.extend(n,window.Apex);return o=x.extend(h,a),o=this.handleUserInputErrors(o)}},{key:\"checkForCatToNumericXAxis\",value:function(t,e,i){var a=new X(i),s=(\"bar\"===t||\"boxPlot\"===t)&&i.plotOptions&&i.plotOptions.bar&&i.plotOptions.bar.horizontal,r=\"pie\"===t||\"polarArea\"===t||\"donut\"===t||\"radar\"===t||\"radialBar\"===t||\"heatmap\"===t,o=\"datetime\"!==i.xaxis.type&&\"numeric\"!==i.xaxis.type,n=i.xaxis.tickPlacement?i.xaxis.tickPlacement:e.xaxis&&e.xaxis.tickPlacement;return s||r||!o||\"between\"===n||(i=a.convertCatToNumeric(i)),i}},{key:\"extendYAxis\",value:function(t,e){var i=new L;(void 0===t.yaxis||!t.yaxis||Array.isArray(t.yaxis)&&0===t.yaxis.length)&&(t.yaxis={}),t.yaxis.constructor!==Array&&window.Apex.yaxis&&window.Apex.yaxis.constructor!==Array&&(t.yaxis=x.extend(t.yaxis,window.Apex.yaxis)),t.yaxis.constructor!==Array?t.yaxis=[x.extend(i.yAxis,t.yaxis)]:t.yaxis=x.extendArray(t.yaxis,i.yAxis);var a=!1;t.yaxis.forEach((function(t){t.logarithmic&&(a=!0)}));var s=t.series;return e&&!s&&(s=e.config.series),a&&s.length!==t.yaxis.length&&s.length&&(t.yaxis=s.map((function(e,a){if(e.name||(s[a].name=\"series-\".concat(a+1)),t.yaxis[a])return t.yaxis[a].seriesName=s[a].name,t.yaxis[a];var r=x.extend(i.yAxis,t.yaxis[0]);return r.show=!1,r}))),a&&s.length>1&&s.length!==t.yaxis.length&&console.warn(\"A multi-series logarithmic chart should have equal number of series and y-axes. Please make sure to equalize both.\"),t}},{key:\"extendAnnotations\",value:function(t){return void 0===t.annotations&&(t.annotations={},t.annotations.yaxis=[],t.annotations.xaxis=[],t.annotations.points=[]),t=this.extendYAxisAnnotations(t),t=this.extendXAxisAnnotations(t),t=this.extendPointAnnotations(t)}},{key:\"extendYAxisAnnotations\",value:function(t){var e=new L;return t.annotations.yaxis=x.extendArray(void 0!==t.annotations.yaxis?t.annotations.yaxis:[],e.yAxisAnnotation),t}},{key:\"extendXAxisAnnotations\",value:function(t){var e=new L;return t.annotations.xaxis=x.extendArray(void 0!==t.annotations.xaxis?t.annotations.xaxis:[],e.xAxisAnnotation),t}},{key:\"extendPointAnnotations\",value:function(t){var e=new L;return t.annotations.points=x.extendArray(void 0!==t.annotations.points?t.annotations.points:[],e.pointAnnotation),t}},{key:\"checkForDarkTheme\",value:function(t){t.theme&&\"dark\"===t.theme.mode&&(t.tooltip||(t.tooltip={}),\"light\"!==t.tooltip.theme&&(t.tooltip.theme=\"dark\"),t.chart.foreColor||(t.chart.foreColor=\"#f6f7f8\"),t.chart.background||(t.chart.background=\"#424242\"),t.theme.palette||(t.theme.palette=\"palette4\"))}},{key:\"handleUserInputErrors\",value:function(t){var e=t;if(e.tooltip.shared&&e.tooltip.intersect)throw new Error(\"tooltip.shared cannot be enabled when tooltip.intersect is true. Turn off any other option by setting it to false.\");if(\"bar\"===e.chart.type&&e.plotOptions.bar.horizontal){if(e.yaxis.length>1)throw new Error(\"Multiple Y Axis for bars are not supported. Switch to column chart by setting plotOptions.bar.horizontal=false\");e.yaxis[0].reversed&&(e.yaxis[0].opposite=!0),e.xaxis.tooltip.enabled=!1,e.yaxis[0].tooltip.enabled=!1,e.chart.zoom.enabled=!1}return\"bar\"!==e.chart.type&&\"rangeBar\"!==e.chart.type||e.tooltip.shared&&\"barWidth\"===e.xaxis.crosshairs.width&&e.series.length>1&&(e.xaxis.crosshairs.width=\"tickWidth\"),\"candlestick\"!==e.chart.type&&\"boxPlot\"!==e.chart.type||e.yaxis[0].reversed&&(console.warn(\"Reversed y-axis in \".concat(e.chart.type,\" chart is not supported.\")),e.yaxis[0].reversed=!1),e}}]),t}(),Y=function(){function t(){a(this,t)}return r(t,[{key:\"initGlobalVars\",value:function(t){t.series=[],t.seriesCandleO=[],t.seriesCandleH=[],t.seriesCandleM=[],t.seriesCandleL=[],t.seriesCandleC=[],t.seriesRangeStart=[],t.seriesRangeEnd=[],t.seriesRange=[],t.seriesPercent=[],t.seriesGoals=[],t.seriesX=[],t.seriesZ=[],t.seriesNames=[],t.seriesTotals=[],t.seriesLog=[],t.seriesColors=[],t.stackedSeriesTotals=[],t.seriesXvalues=[],t.seriesYvalues=[],t.labels=[],t.hasGroups=!1,t.groups=[],t.categoryLabels=[],t.timescaleLabels=[],t.noLabelsProvided=!1,t.resizeTimer=null,t.selectionResizeTimer=null,t.delayedElements=[],t.pointsArray=[],t.dataLabelsRects=[],t.isXNumeric=!1,t.skipLastTimelinelabel=!1,t.skipFirstTimelinelabel=!1,t.isDataXYZ=!1,t.isMultiLineX=!1,t.isMultipleYAxis=!1,t.maxY=-Number.MAX_VALUE,t.minY=Number.MIN_VALUE,t.minYArr=[],t.maxYArr=[],t.maxX=-Number.MAX_VALUE,t.minX=Number.MAX_VALUE,t.initialMaxX=-Number.MAX_VALUE,t.initialMinX=Number.MAX_VALUE,t.maxDate=0,t.minDate=Number.MAX_VALUE,t.minZ=Number.MAX_VALUE,t.maxZ=-Number.MAX_VALUE,t.minXDiff=Number.MAX_VALUE,t.yAxisScale=[],t.xAxisScale=null,t.xAxisTicksPositions=[],t.yLabelsCoords=[],t.yTitleCoords=[],t.barPadForNumericAxis=0,t.padHorizontal=0,t.xRange=0,t.yRange=[],t.zRange=0,t.dataPoints=0,t.xTickAmount=0}},{key:\"globalVars\",value:function(t){return{chartID:null,cuid:null,events:{beforeMount:[],mounted:[],updated:[],clicked:[],selection:[],dataPointSelection:[],zoomed:[],scrolled:[]},colors:[],clientX:null,clientY:null,fill:{colors:[]},stroke:{colors:[]},dataLabels:{style:{colors:[]}},radarPolygons:{fill:{colors:[]}},markers:{colors:[],size:t.markers.size,largestSize:0},animationEnded:!1,isTouchDevice:\"ontouchstart\"in window||navigator.msMaxTouchPoints,isDirty:!1,isExecCalled:!1,initialConfig:null,initialSeries:[],lastXAxis:[],lastYAxis:[],columnSeries:null,labels:[],timescaleLabels:[],noLabelsProvided:!1,allSeriesCollapsed:!1,collapsedSeries:[],collapsedSeriesIndices:[],ancillaryCollapsedSeries:[],ancillaryCollapsedSeriesIndices:[],risingSeries:[],dataFormatXNumeric:!1,capturedSeriesIndex:-1,capturedDataPointIndex:-1,selectedDataPoints:[],goldenPadding:35,invalidLogScale:!1,ignoreYAxisIndexes:[],yAxisSameScaleIndices:[],maxValsInArrayIndex:0,radialSize:0,selection:void 0,zoomEnabled:\"zoom\"===t.chart.toolbar.autoSelected&&t.chart.toolbar.tools.zoom&&t.chart.zoom.enabled,panEnabled:\"pan\"===t.chart.toolbar.autoSelected&&t.chart.toolbar.tools.pan,selectionEnabled:\"selection\"===t.chart.toolbar.autoSelected&&t.chart.toolbar.tools.selection,yaxis:null,mousedown:!1,lastClientPosition:{},visibleXRange:void 0,yValueDecimal:0,total:0,SVGNS:\"http://www.w3.org/2000/svg\",svgWidth:0,svgHeight:0,noData:!1,locale:{},dom:{},memory:{methodsToExec:[]},shouldAnimate:!0,skipLastTimelinelabel:!1,skipFirstTimelinelabel:!1,delayedElements:[],axisCharts:!0,isDataXYZ:!1,resized:!1,resizeTimer:null,comboCharts:!1,dataChanged:!1,previousPaths:[],allSeriesHasEqualX:!0,pointsArray:[],dataLabelsRects:[],lastDrawnDataLabelsIndexes:[],hasNullValues:!1,easing:null,zoomed:!1,gridWidth:0,gridHeight:0,rotateXLabels:!1,defaultLabels:!1,xLabelFormatter:void 0,yLabelFormatters:[],xaxisTooltipFormatter:void 0,ttKeyFormatter:void 0,ttVal:void 0,ttZFormatter:void 0,LINE_HEIGHT_RATIO:1.618,xAxisLabelsHeight:0,xAxisGroupLabelsHeight:0,xAxisLabelsWidth:0,yAxisLabelsWidth:0,scaleX:1,scaleY:1,translateX:0,translateY:0,translateYAxisX:[],yAxisWidths:[],translateXAxisY:0,translateXAxisX:0,tooltip:null}}},{key:\"init\",value:function(t){var e=this.globalVars(t);return this.initGlobalVars(e),e.initialConfig=x.extend({},t),e.initialSeries=x.clone(t.series),e.lastXAxis=x.clone(e.initialConfig.xaxis),e.lastYAxis=x.clone(e.initialConfig.yaxis),e}}]),t}(),F=function(){function t(e){a(this,t),this.opts=e}return r(t,[{key:\"init\",value:function(){var t=new E(this.opts).init({responsiveOverride:!1});return{config:t,globals:(new Y).init(t)}}}]),t}(),R=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.opts=null,this.seriesIndex=0}return r(t,[{key:\"clippedImgArea\",value:function(t){var e=this.w,i=e.config,a=parseInt(e.globals.gridWidth,10),s=parseInt(e.globals.gridHeight,10),r=a>s?a:s,o=t.image,n=0,l=0;void 0===t.width&&void 0===t.height?void 0!==i.fill.image.width&&void 0!==i.fill.image.height?(n=i.fill.image.width+1,l=i.fill.image.height):(n=r+1,l=r):(n=t.width,l=t.height);var h=document.createElementNS(e.globals.SVGNS,\"pattern\");m.setAttrs(h,{id:t.patternID,patternUnits:t.patternUnits?t.patternUnits:\"userSpaceOnUse\",width:n+\"px\",height:l+\"px\"});var c=document.createElementNS(e.globals.SVGNS,\"image\");h.appendChild(c),c.setAttributeNS(window.SVG.xlink,\"href\",o),m.setAttrs(c,{x:0,y:0,preserveAspectRatio:\"none\",width:n+\"px\",height:l+\"px\"}),c.style.opacity=t.opacity,e.globals.dom.elDefs.node.appendChild(h)}},{key:\"getSeriesIndex\",value:function(t){var e=this.w;return(\"bar\"===e.config.chart.type||\"rangeBar\"===e.config.chart.type)&&e.config.plotOptions.bar.distributed||\"heatmap\"===e.config.chart.type||\"treemap\"===e.config.chart.type?this.seriesIndex=t.seriesNumber:this.seriesIndex=t.seriesNumber%e.globals.series.length,this.seriesIndex}},{key:\"fillPath\",value:function(t){var e=this.w;this.opts=t;var i,a,s,r=this.w.config;this.seriesIndex=this.getSeriesIndex(t);var o=this.getFillColors()[this.seriesIndex];void 0!==e.globals.seriesColors[this.seriesIndex]&&(o=e.globals.seriesColors[this.seriesIndex]),\"function\"==typeof o&&(o=o({seriesIndex:this.seriesIndex,dataPointIndex:t.dataPointIndex,value:t.value,w:e}));var n=t.fillType?t.fillType:this.getFillType(this.seriesIndex),l=Array.isArray(r.fill.opacity)?r.fill.opacity[this.seriesIndex]:r.fill.opacity;t.color&&(o=t.color);var h=o;if(-1===o.indexOf(\"rgb\")?o.length<9&&(h=x.hexToRgba(o,l)):o.indexOf(\"rgba\")>-1&&(l=x.getOpacityFromRGBA(o)),t.opacity&&(l=t.opacity),\"pattern\"===n&&(a=this.handlePatternFill({fillConfig:t.fillConfig,patternFill:a,fillColor:o,fillOpacity:l,defaultColor:h})),\"gradient\"===n&&(s=this.handleGradientFill({fillConfig:t.fillConfig,fillColor:o,fillOpacity:l,i:this.seriesIndex})),\"image\"===n){var c=r.fill.image.src,d=t.patternID?t.patternID:\"\";this.clippedImgArea({opacity:l,image:Array.isArray(c)?t.seriesNumber<c.length?c[t.seriesNumber]:c[0]:c,width:t.width?t.width:void 0,height:t.height?t.height:void 0,patternUnits:t.patternUnits,patternID:\"pattern\".concat(e.globals.cuid).concat(t.seriesNumber+1).concat(d)}),i=\"url(#pattern\".concat(e.globals.cuid).concat(t.seriesNumber+1).concat(d,\")\")}else i=\"gradient\"===n?s:\"pattern\"===n?a:h;return t.solid&&(i=h),i}},{key:\"getFillType\",value:function(t){var e=this.w;return Array.isArray(e.config.fill.type)?e.config.fill.type[t]:e.config.fill.type}},{key:\"getFillColors\",value:function(){var t=this.w,e=t.config,i=this.opts,a=[];return t.globals.comboCharts?\"line\"===t.config.series[this.seriesIndex].type?Array.isArray(t.globals.stroke.colors)?a=t.globals.stroke.colors:a.push(t.globals.stroke.colors):Array.isArray(t.globals.fill.colors)?a=t.globals.fill.colors:a.push(t.globals.fill.colors):\"line\"===e.chart.type?Array.isArray(t.globals.stroke.colors)?a=t.globals.stroke.colors:a.push(t.globals.stroke.colors):Array.isArray(t.globals.fill.colors)?a=t.globals.fill.colors:a.push(t.globals.fill.colors),void 0!==i.fillColors&&(a=[],Array.isArray(i.fillColors)?a=i.fillColors.slice():a.push(i.fillColors)),a}},{key:\"handlePatternFill\",value:function(t){var e=t.fillConfig,i=t.patternFill,a=t.fillColor,s=t.fillOpacity,r=t.defaultColor,o=this.w.config.fill;e&&(o=e);var n=this.opts,l=new m(this.ctx),h=Array.isArray(o.pattern.strokeWidth)?o.pattern.strokeWidth[this.seriesIndex]:o.pattern.strokeWidth,c=a;Array.isArray(o.pattern.style)?i=void 0!==o.pattern.style[n.seriesNumber]?l.drawPattern(o.pattern.style[n.seriesNumber],o.pattern.width,o.pattern.height,c,h,s):r:i=l.drawPattern(o.pattern.style,o.pattern.width,o.pattern.height,c,h,s);return i}},{key:\"handleGradientFill\",value:function(t){var i=t.fillColor,a=t.fillOpacity,s=t.fillConfig,r=t.i,o=this.w.config.fill;s&&(o=e(e({},o),s));var n,l=this.opts,h=new m(this.ctx),c=new x,d=o.gradient.type,g=i,u=void 0===o.gradient.opacityFrom?a:Array.isArray(o.gradient.opacityFrom)?o.gradient.opacityFrom[r]:o.gradient.opacityFrom;g.indexOf(\"rgba\")>-1&&(u=x.getOpacityFromRGBA(g));var f=void 0===o.gradient.opacityTo?a:Array.isArray(o.gradient.opacityTo)?o.gradient.opacityTo[r]:o.gradient.opacityTo;if(void 0===o.gradient.gradientToColors||0===o.gradient.gradientToColors.length)n=\"dark\"===o.gradient.shade?c.shadeColor(-1*parseFloat(o.gradient.shadeIntensity),i.indexOf(\"rgb\")>-1?x.rgb2hex(i):i):c.shadeColor(parseFloat(o.gradient.shadeIntensity),i.indexOf(\"rgb\")>-1?x.rgb2hex(i):i);else if(o.gradient.gradientToColors[l.seriesNumber]){var p=o.gradient.gradientToColors[l.seriesNumber];n=p,p.indexOf(\"rgba\")>-1&&(f=x.getOpacityFromRGBA(p))}else n=i;if(o.gradient.gradientFrom&&(g=o.gradient.gradientFrom),o.gradient.gradientTo&&(n=o.gradient.gradientTo),o.gradient.inverseColors){var b=g;g=n,n=b}return g.indexOf(\"rgb\")>-1&&(g=x.rgb2hex(g)),n.indexOf(\"rgb\")>-1&&(n=x.rgb2hex(n)),h.drawGradient(d,g,n,u,f,l.size,o.gradient.stops,o.gradient.colorStops,r)}}]),t}(),D=function(){function t(e,i){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:\"setGlobalMarkerSize\",value:function(){var t=this.w;if(t.globals.markers.size=Array.isArray(t.config.markers.size)?t.config.markers.size:[t.config.markers.size],t.globals.markers.size.length>0){if(t.globals.markers.size.length<t.globals.series.length+1)for(var e=0;e<=t.globals.series.length;e++)void 0===t.globals.markers.size[e]&&t.globals.markers.size.push(t.globals.markers.size[0])}else t.globals.markers.size=t.config.series.map((function(e){return t.config.markers.size}))}},{key:\"plotChartMarkers\",value:function(t,e,i,a){var s,r=arguments.length>4&&void 0!==arguments[4]&&arguments[4],o=this.w,n=e,l=t,h=null,c=new m(this.ctx),d=o.config.markers.discrete&&o.config.markers.discrete.length;if((o.globals.markers.size[e]>0||r||d)&&(h=c.group({class:r||d?\"\":\"apexcharts-series-markers\"})).attr(\"clip-path\",\"url(#gridRectMarkerMask\".concat(o.globals.cuid,\")\")),Array.isArray(l.x))for(var g=0;g<l.x.length;g++){var u=i;1===i&&0===g&&(u=0),1===i&&1===g&&(u=1);var f=\"apexcharts-marker\";if(\"line\"!==o.config.chart.type&&\"area\"!==o.config.chart.type||o.globals.comboCharts||o.config.tooltip.intersect||(f+=\" no-pointer-events\"),(Array.isArray(o.config.markers.size)?o.globals.markers.size[e]>0:o.config.markers.size>0)||r||d){x.isNumber(l.y[g])?f+=\" w\".concat(x.randomId()):f=\"apexcharts-nullpoint\";var p=this.getMarkerConfig({cssClass:f,seriesIndex:e,dataPointIndex:u});o.config.series[n].data[u]&&(o.config.series[n].data[u].fillColor&&(p.pointFillColor=o.config.series[n].data[u].fillColor),o.config.series[n].data[u].strokeColor&&(p.pointStrokeColor=o.config.series[n].data[u].strokeColor)),a&&(p.pSize=a),(s=c.drawMarker(l.x[g],l.y[g],p)).attr(\"rel\",u),s.attr(\"j\",u),s.attr(\"index\",e),s.node.setAttribute(\"default-marker-size\",p.pSize),new v(this.ctx).setSelectionFilter(s,e,u),this.addEvents(s),h&&h.add(s)}else void 0===o.globals.pointsArray[e]&&(o.globals.pointsArray[e]=[]),o.globals.pointsArray[e].push([l.x[g],l.y[g]])}return h}},{key:\"getMarkerConfig\",value:function(t){var e=t.cssClass,i=t.seriesIndex,a=t.dataPointIndex,s=void 0===a?null:a,r=t.finishRadius,o=void 0===r?null:r,n=this.w,l=this.getMarkerStyle(i),h=n.globals.markers.size[i],c=n.config.markers;return null!==s&&c.discrete.length&&c.discrete.map((function(t){t.seriesIndex===i&&t.dataPointIndex===s&&(l.pointStrokeColor=t.strokeColor,l.pointFillColor=t.fillColor,h=t.size,l.pointShape=t.shape)})),{pSize:null===o?h:o,pRadius:c.radius,width:Array.isArray(c.width)?c.width[i]:c.width,height:Array.isArray(c.height)?c.height[i]:c.height,pointStrokeWidth:Array.isArray(c.strokeWidth)?c.strokeWidth[i]:c.strokeWidth,pointStrokeColor:l.pointStrokeColor,pointFillColor:l.pointFillColor,shape:l.pointShape||(Array.isArray(c.shape)?c.shape[i]:c.shape),class:e,pointStrokeOpacity:Array.isArray(c.strokeOpacity)?c.strokeOpacity[i]:c.strokeOpacity,pointStrokeDashArray:Array.isArray(c.strokeDashArray)?c.strokeDashArray[i]:c.strokeDashArray,pointFillOpacity:Array.isArray(c.fillOpacity)?c.fillOpacity[i]:c.fillOpacity,seriesIndex:i}}},{key:\"addEvents\",value:function(t){var e=this.w,i=new m(this.ctx);t.node.addEventListener(\"mouseenter\",i.pathMouseEnter.bind(this.ctx,t)),t.node.addEventListener(\"mouseleave\",i.pathMouseLeave.bind(this.ctx,t)),t.node.addEventListener(\"mousedown\",i.pathMouseDown.bind(this.ctx,t)),t.node.addEventListener(\"click\",e.config.markers.onClick),t.node.addEventListener(\"dblclick\",e.config.markers.onDblClick),t.node.addEventListener(\"touchstart\",i.pathMouseDown.bind(this.ctx,t),{passive:!0})}},{key:\"getMarkerStyle\",value:function(t){var e=this.w,i=e.globals.markers.colors,a=e.config.markers.strokeColor||e.config.markers.strokeColors;return{pointStrokeColor:Array.isArray(a)?a[t]:a,pointFillColor:Array.isArray(i)?i[t]:i}}}]),t}(),H=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.initialAnim=this.w.config.chart.animations.enabled,this.dynamicAnim=this.initialAnim&&this.w.config.chart.animations.dynamicAnimation.enabled}return r(t,[{key:\"draw\",value:function(t,e,i){var a=this.w,s=new m(this.ctx),r=i.realIndex,o=i.pointsPos,n=i.zRatio,l=i.elParent,h=s.group({class:\"apexcharts-series-markers apexcharts-series-\".concat(a.config.chart.type)});if(h.attr(\"clip-path\",\"url(#gridRectMarkerMask\".concat(a.globals.cuid,\")\")),Array.isArray(o.x))for(var c=0;c<o.x.length;c++){var d=e+1,g=!0;0===e&&0===c&&(d=0),0===e&&1===c&&(d=1);var u=0,f=a.globals.markers.size[r];if(n!==1/0){var p=a.config.plotOptions.bubble;f=a.globals.seriesZ[r][d],p.zScaling&&(f/=n),p.minBubbleRadius&&f<p.minBubbleRadius&&(f=p.minBubbleRadius),p.maxBubbleRadius&&f>p.maxBubbleRadius&&(f=p.maxBubbleRadius)}a.config.chart.animations.enabled||(u=f);var x=o.x[c],b=o.y[c];if(u=u||0,null!==b&&void 0!==a.globals.series[r][d]||(g=!1),g){var v=this.drawPoint(x,b,u,f,r,d,e);h.add(v)}l.add(h)}}},{key:\"drawPoint\",value:function(t,e,i,a,s,r,o){var n=this.w,l=s,h=new b(this.ctx),c=new v(this.ctx),d=new R(this.ctx),g=new D(this.ctx),u=new m(this.ctx),f=g.getMarkerConfig({cssClass:\"apexcharts-marker\",seriesIndex:l,dataPointIndex:r,finishRadius:\"bubble\"===n.config.chart.type||n.globals.comboCharts&&n.config.series[s]&&\"bubble\"===n.config.series[s].type?a:null});a=f.pSize;var p,x=d.fillPath({seriesNumber:s,dataPointIndex:r,color:f.pointFillColor,patternUnits:\"objectBoundingBox\",value:n.globals.series[s][o]});if(\"circle\"===f.shape?p=u.drawCircle(i):\"square\"!==f.shape&&\"rect\"!==f.shape||(p=u.drawRect(0,0,f.width-f.pointStrokeWidth/2,f.height-f.pointStrokeWidth/2,f.pRadius)),n.config.series[l].data[r]&&n.config.series[l].data[r].fillColor&&(x=n.config.series[l].data[r].fillColor),p.attr({x:t-f.width/2-f.pointStrokeWidth/2,y:e-f.height/2-f.pointStrokeWidth/2,cx:t,cy:e,fill:x,\"fill-opacity\":f.pointFillOpacity,stroke:f.pointStrokeColor,r:a,\"stroke-width\":f.pointStrokeWidth,\"stroke-dasharray\":f.pointStrokeDashArray,\"stroke-opacity\":f.pointStrokeOpacity}),n.config.chart.dropShadow.enabled){var y=n.config.chart.dropShadow;c.dropShadow(p,y,s)}if(!this.initialAnim||n.globals.dataChanged||n.globals.resized)n.globals.animationEnded=!0;else{var w=n.config.chart.animations.speed;h.animateMarker(p,0,\"circle\"===f.shape?a:{width:f.width,height:f.height},w,n.globals.easing,(function(){window.setTimeout((function(){h.animationCompleted(p)}),100)}))}if(n.globals.dataChanged&&\"circle\"===f.shape)if(this.dynamicAnim){var k,A,S,C,L=n.config.chart.animations.dynamicAnimation.speed;null!=(C=n.globals.previousPaths[s]&&n.globals.previousPaths[s][o])&&(k=C.x,A=C.y,S=void 0!==C.r?C.r:a);for(var P=0;P<n.globals.collapsedSeries.length;P++)n.globals.collapsedSeries[P].index===s&&(L=1,a=0);0===t&&0===e&&(a=0),h.animateCircle(p,{cx:k,cy:A,r:S},{cx:t,cy:e,r:a},L,n.globals.easing)}else p.attr({r:a});return p.attr({rel:r,j:r,index:s,\"default-marker-size\":a}),c.setSelectionFilter(p,s,r),g.addEvents(p),p.node.classList.add(\"apexcharts-marker\"),p}},{key:\"centerTextInBubble\",value:function(t){var e=this.w;return{y:t+=parseInt(e.config.dataLabels.style.fontSize,10)/4}}}]),t}(),O=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:\"dataLabelsCorrection\",value:function(t,e,i,a,s,r,o){var n=this.w,l=!1,h=new m(this.ctx).getTextRects(i,o),c=h.width,d=h.height;e<0&&(e=0),e>n.globals.gridHeight+d&&(e=n.globals.gridHeight+d/2),void 0===n.globals.dataLabelsRects[a]&&(n.globals.dataLabelsRects[a]=[]),n.globals.dataLabelsRects[a].push({x:t,y:e,width:c,height:d});var g=n.globals.dataLabelsRects[a].length-2,u=void 0!==n.globals.lastDrawnDataLabelsIndexes[a]?n.globals.lastDrawnDataLabelsIndexes[a][n.globals.lastDrawnDataLabelsIndexes[a].length-1]:0;if(void 0!==n.globals.dataLabelsRects[a][g]){var f=n.globals.dataLabelsRects[a][u];(t>f.x+f.width+2||e>f.y+f.height+2||t+c<f.x)&&(l=!0)}return(0===s||r)&&(l=!0),{x:t,y:e,textRects:h,drawnextLabel:l}}},{key:\"drawDataLabel\",value:function(t){var e=this,i=t.type,a=t.pos,s=t.i,r=t.j,o=t.isRangeStart,n=t.strokeWidth,l=void 0===n?2:n,h=this.w,c=new m(this.ctx),d=h.config.dataLabels,g=0,u=0,f=r,p=null;if(!d.enabled||!Array.isArray(a.x))return p;p=c.group({class:\"apexcharts-data-labels\"});for(var x=0;x<a.x.length;x++)if(g=a.x[x]+d.offsetX,u=a.y[x]+d.offsetY+l,!isNaN(g)){1===r&&0===x&&(f=0),1===r&&1===x&&(f=1);var b=h.globals.series[s][f];\"rangeArea\"===i&&(b=o?h.globals.seriesRangeStart[s][f]:h.globals.seriesRangeEnd[s][f]);var v=\"\",y=function(t){return h.config.dataLabels.formatter(t,{ctx:e.ctx,seriesIndex:s,dataPointIndex:f,w:h})};if(\"bubble\"===h.config.chart.type)v=y(b=h.globals.seriesZ[s][f]),u=a.y[x],u=new H(this.ctx).centerTextInBubble(u,s,f).y;else void 0!==b&&(v=y(b));this.plotDataLabelsText({x:g,y:u,text:v,i:s,j:f,parent:p,offsetCorrection:!0,dataLabelsConfig:h.config.dataLabels})}return p}},{key:\"plotDataLabelsText\",value:function(t){var e=this.w,i=new m(this.ctx),a=t.x,s=t.y,r=t.i,o=t.j,n=t.text,l=t.textAnchor,h=t.fontSize,c=t.parent,d=t.dataLabelsConfig,g=t.color,u=t.alwaysDrawDataLabel,f=t.offsetCorrection;if(!(Array.isArray(e.config.dataLabels.enabledOnSeries)&&e.config.dataLabels.enabledOnSeries.indexOf(r)<0)){var p={x:a,y:s,drawnextLabel:!0,textRects:null};f&&(p=this.dataLabelsCorrection(a,s,n,r,o,u,parseInt(d.style.fontSize,10))),e.globals.zoomed||(a=p.x,s=p.y),p.textRects&&(a<-10-p.textRects.width||a>e.globals.gridWidth+p.textRects.width+10)&&(n=\"\");var x=e.globals.dataLabels.style.colors[r];((\"bar\"===e.config.chart.type||\"rangeBar\"===e.config.chart.type)&&e.config.plotOptions.bar.distributed||e.config.dataLabels.distributed)&&(x=e.globals.dataLabels.style.colors[o]),\"function\"==typeof x&&(x=x({series:e.globals.series,seriesIndex:r,dataPointIndex:o,w:e})),g&&(x=g);var b=d.offsetX,y=d.offsetY;if(\"bar\"!==e.config.chart.type&&\"rangeBar\"!==e.config.chart.type||(b=0,y=0),p.drawnextLabel){var w=i.drawText({width:100,height:parseInt(d.style.fontSize,10),x:a+b,y:s+y,foreColor:x,textAnchor:l||d.textAnchor,text:n,fontSize:h||d.style.fontSize,fontFamily:d.style.fontFamily,fontWeight:d.style.fontWeight||\"normal\"});if(w.attr({class:\"apexcharts-datalabel\",cx:a,cy:s}),d.dropShadow.enabled){var k=d.dropShadow;new v(this.ctx).dropShadow(w,k)}c.add(w),void 0===e.globals.lastDrawnDataLabelsIndexes[r]&&(e.globals.lastDrawnDataLabelsIndexes[r]=[]),e.globals.lastDrawnDataLabelsIndexes[r].push(o)}}}},{key:\"addBackgroundToDataLabel\",value:function(t,e){var i=this.w,a=i.config.dataLabels.background,s=a.padding,r=a.padding/2,o=e.width,n=e.height,l=new m(this.ctx).drawRect(e.x-s,e.y-r/2,o+2*s,n+r,a.borderRadius,\"transparent\"===i.config.chart.background?\"#fff\":i.config.chart.background,a.opacity,a.borderWidth,a.borderColor);a.dropShadow.enabled&&new v(this.ctx).dropShadow(l,a.dropShadow);return l}},{key:\"dataLabelsBackground\",value:function(){var t=this.w;if(\"bubble\"!==t.config.chart.type)for(var e=t.globals.dom.baseEl.querySelectorAll(\".apexcharts-datalabels text\"),i=0;i<e.length;i++){var a=e[i],s=a.getBBox(),r=null;if(s.width&&s.height&&(r=this.addBackgroundToDataLabel(a,s)),r){a.parentNode.insertBefore(r.node,a);var o=a.getAttribute(\"fill\");t.config.chart.animations.enabled&&!t.globals.resized&&!t.globals.dataChanged?r.animate().attr({fill:o}):r.attr({fill:o}),a.setAttribute(\"fill\",t.config.dataLabels.background.foreColor)}}}},{key:\"bringForward\",value:function(){for(var t=this.w,e=t.globals.dom.baseEl.querySelectorAll(\".apexcharts-datalabels\"),i=t.globals.dom.baseEl.querySelector(\".apexcharts-plot-series:last-child\"),a=0;a<e.length;a++)i&&i.insertBefore(e[a],i.nextSibling)}}]),t}(),N=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.legendInactiveClass=\"legend-mouseover-inactive\"}return r(t,[{key:\"getAllSeriesEls\",value:function(){return this.w.globals.dom.baseEl.getElementsByClassName(\"apexcharts-series\")}},{key:\"getSeriesByName\",value:function(t){return this.w.globals.dom.baseEl.querySelector(\".apexcharts-inner .apexcharts-series[seriesName='\".concat(x.escapeString(t),\"']\"))}},{key:\"isSeriesHidden\",value:function(t){var e=this.getSeriesByName(t),i=parseInt(e.getAttribute(\"data:realIndex\"),10);return{isHidden:e.classList.contains(\"apexcharts-series-collapsed\"),realIndex:i}}},{key:\"addCollapsedClassToSeries\",value:function(t,e){var i=this.w;function a(i){for(var a=0;a<i.length;a++)i[a].index===e&&t.node.classList.add(\"apexcharts-series-collapsed\")}a(i.globals.collapsedSeries),a(i.globals.ancillaryCollapsedSeries)}},{key:\"toggleSeries\",value:function(t){var e=this.isSeriesHidden(t);return this.ctx.legend.legendHelpers.toggleDataSeries(e.realIndex,e.isHidden),e.isHidden}},{key:\"showSeries\",value:function(t){var e=this.isSeriesHidden(t);e.isHidden&&this.ctx.legend.legendHelpers.toggleDataSeries(e.realIndex,!0)}},{key:\"hideSeries\",value:function(t){var e=this.isSeriesHidden(t);e.isHidden||this.ctx.legend.legendHelpers.toggleDataSeries(e.realIndex,!1)}},{key:\"resetSeries\",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],a=this.w,s=x.clone(a.globals.initialSeries);a.globals.previousPaths=[],i?(a.globals.collapsedSeries=[],a.globals.ancillaryCollapsedSeries=[],a.globals.collapsedSeriesIndices=[],a.globals.ancillaryCollapsedSeriesIndices=[]):s=this.emptyCollapsedSeries(s),a.config.series=s,t&&(e&&(a.globals.zoomed=!1,this.ctx.updateHelpers.revertDefaultAxisMinMax()),this.ctx.updateHelpers._updateSeries(s,a.config.chart.animations.dynamicAnimation.enabled))}},{key:\"emptyCollapsedSeries\",value:function(t){for(var e=this.w,i=0;i<t.length;i++)e.globals.collapsedSeriesIndices.indexOf(i)>-1&&(t[i].data=[]);return t}},{key:\"toggleSeriesOnHover\",value:function(t,e){var i=this.w;e||(e=t.target);var a=i.globals.dom.baseEl.querySelectorAll(\".apexcharts-series, .apexcharts-datalabels\");if(\"mousemove\"===t.type){var s=parseInt(e.getAttribute(\"rel\"),10)-1,r=null,o=null;i.globals.axisCharts||\"radialBar\"===i.config.chart.type?i.globals.axisCharts?(r=i.globals.dom.baseEl.querySelector(\".apexcharts-series[data\\\\:realIndex='\".concat(s,\"']\")),o=i.globals.dom.baseEl.querySelector(\".apexcharts-datalabels[data\\\\:realIndex='\".concat(s,\"']\"))):r=i.globals.dom.baseEl.querySelector(\".apexcharts-series[rel='\".concat(s+1,\"']\")):r=i.globals.dom.baseEl.querySelector(\".apexcharts-series[rel='\".concat(s+1,\"'] path\"));for(var n=0;n<a.length;n++)a[n].classList.add(this.legendInactiveClass);null!==r&&(i.globals.axisCharts||r.parentNode.classList.remove(this.legendInactiveClass),r.classList.remove(this.legendInactiveClass),null!==o&&o.classList.remove(this.legendInactiveClass))}else if(\"mouseout\"===t.type)for(var l=0;l<a.length;l++)a[l].classList.remove(this.legendInactiveClass)}},{key:\"highlightRangeInSeries\",value:function(t,e){var i=this,a=this.w,s=a.globals.dom.baseEl.getElementsByClassName(\"apexcharts-heatmap-rect\"),r=function(t){for(var e=0;e<s.length;e++)s[e].classList[t](i.legendInactiveClass)};if(\"mousemove\"===t.type){var o=parseInt(e.getAttribute(\"rel\"),10)-1;r(\"add\"),function(t){for(var e=0;e<s.length;e++){var a=parseInt(s[e].getAttribute(\"val\"),10);a>=t.from&&a<=t.to&&s[e].classList.remove(i.legendInactiveClass)}}(a.config.plotOptions.heatmap.colorScale.ranges[o])}else\"mouseout\"===t.type&&r(\"remove\")}},{key:\"getActiveConfigSeriesIndex\",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"asc\",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],i=this.w,a=0;if(i.config.series.length>1)for(var s=i.config.series.map((function(t,a){return t.data&&t.data.length>0&&-1===i.globals.collapsedSeriesIndices.indexOf(a)&&(!i.globals.comboCharts||0===e.length||e.length&&e.indexOf(i.config.series[a].type)>-1)?a:-1})),r=\"asc\"===t?0:s.length-1;\"asc\"===t?r<s.length:r>=0;\"asc\"===t?r++:r--)if(-1!==s[r]){a=s[r];break}return a}},{key:\"getBarSeriesIndices\",value:function(){return this.w.globals.comboCharts?this.w.config.series.map((function(t,e){return\"bar\"===t.type||\"column\"===t.type?e:-1})).filter((function(t){return-1!==t})):this.w.config.series.map((function(t,e){return e}))}},{key:\"getPreviousPaths\",value:function(){var t=this.w;function e(e,i,a){for(var s=e[i].childNodes,r={type:a,paths:[],realIndex:e[i].getAttribute(\"data:realIndex\")},o=0;o<s.length;o++)if(s[o].hasAttribute(\"pathTo\")){var n=s[o].getAttribute(\"pathTo\");r.paths.push({d:n})}t.globals.previousPaths.push(r)}t.globals.previousPaths=[];[\"line\",\"area\",\"bar\",\"rangebar\",\"rangeArea\",\"candlestick\",\"radar\"].forEach((function(i){for(var a,s=(a=i,t.globals.dom.baseEl.querySelectorAll(\".apexcharts-\".concat(a,\"-series .apexcharts-series\"))),r=0;r<s.length;r++)e(s,r,i)})),this.handlePrevBubbleScatterPaths(\"bubble\"),this.handlePrevBubbleScatterPaths(\"scatter\");var i=t.globals.dom.baseEl.querySelectorAll(\".apexcharts-\".concat(t.config.chart.type,\" .apexcharts-series\"));if(i.length>0)for(var a=function(e){for(var i=t.globals.dom.baseEl.querySelectorAll(\".apexcharts-\".concat(t.config.chart.type,\" .apexcharts-series[data\\\\:realIndex='\").concat(e,\"'] rect\")),a=[],s=function(t){var e=function(e){return i[t].getAttribute(e)},s={x:parseFloat(e(\"x\")),y:parseFloat(e(\"y\")),width:parseFloat(e(\"width\")),height:parseFloat(e(\"height\"))};a.push({rect:s,color:i[t].getAttribute(\"color\")})},r=0;r<i.length;r++)s(r);t.globals.previousPaths.push(a)},s=0;s<i.length;s++)a(s);t.globals.axisCharts||(t.globals.previousPaths=t.globals.series)}},{key:\"handlePrevBubbleScatterPaths\",value:function(t){var e=this.w,i=e.globals.dom.baseEl.querySelectorAll(\".apexcharts-\".concat(t,\"-series .apexcharts-series\"));if(i.length>0)for(var a=0;a<i.length;a++){for(var s=e.globals.dom.baseEl.querySelectorAll(\".apexcharts-\".concat(t,\"-series .apexcharts-series[data\\\\:realIndex='\").concat(a,\"'] circle\")),r=[],o=0;o<s.length;o++)r.push({x:s[o].getAttribute(\"cx\"),y:s[o].getAttribute(\"cy\"),r:s[o].getAttribute(\"r\")});e.globals.previousPaths.push(r)}}},{key:\"clearPreviousPaths\",value:function(){var t=this.w;t.globals.previousPaths=[],t.globals.allSeriesCollapsed=!1}},{key:\"handleNoData\",value:function(){var t=this.w,e=t.config.noData,i=new m(this.ctx),a=t.globals.svgWidth/2,s=t.globals.svgHeight/2,r=\"middle\";if(t.globals.noData=!0,t.globals.animationEnded=!0,\"left\"===e.align?(a=10,r=\"start\"):\"right\"===e.align&&(a=t.globals.svgWidth-10,r=\"end\"),\"top\"===e.verticalAlign?s=50:\"bottom\"===e.verticalAlign&&(s=t.globals.svgHeight-50),a+=e.offsetX,s=s+parseInt(e.style.fontSize,10)+2+e.offsetY,void 0!==e.text&&\"\"!==e.text){var o=i.drawText({x:a,y:s,text:e.text,textAnchor:r,fontSize:e.style.fontSize,fontFamily:e.style.fontFamily,foreColor:e.style.color,opacity:1,class:\"apexcharts-text-nodata\"});t.globals.dom.Paper.add(o)}}},{key:\"setNullSeriesToZeroValues\",value:function(t){for(var e=this.w,i=0;i<t.length;i++)if(0===t[i].length)for(var a=0;a<t[e.globals.maxValsInArrayIndex].length;a++)t[i].push(0);return t}},{key:\"hasAllSeriesEqualX\",value:function(){for(var t=!0,e=this.w,i=this.filteredSeriesX(),a=0;a<i.length-1;a++)if(i[a][0]!==i[a+1][0]){t=!1;break}return e.globals.allSeriesHasEqualX=t,t}},{key:\"filteredSeriesX\",value:function(){var t=this.w.globals.seriesX.map((function(t){return t.length>0?t:[]}));return t}}]),t}(),W=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.twoDSeries=[],this.threeDSeries=[],this.twoDSeriesX=[],this.seriesGoals=[],this.coreUtils=new y(this.ctx)}return r(t,[{key:\"isMultiFormat\",value:function(){return this.isFormatXY()||this.isFormat2DArray()}},{key:\"isFormatXY\",value:function(){var t=this.w.config.series.slice(),e=new N(this.ctx);if(this.activeSeriesIndex=e.getActiveConfigSeriesIndex(),void 0!==t[this.activeSeriesIndex].data&&t[this.activeSeriesIndex].data.length>0&&null!==t[this.activeSeriesIndex].data[0]&&void 0!==t[this.activeSeriesIndex].data[0].x&&null!==t[this.activeSeriesIndex].data[0])return!0}},{key:\"isFormat2DArray\",value:function(){var t=this.w.config.series.slice(),e=new N(this.ctx);if(this.activeSeriesIndex=e.getActiveConfigSeriesIndex(),void 0!==t[this.activeSeriesIndex].data&&t[this.activeSeriesIndex].data.length>0&&void 0!==t[this.activeSeriesIndex].data[0]&&null!==t[this.activeSeriesIndex].data[0]&&t[this.activeSeriesIndex].data[0].constructor===Array)return!0}},{key:\"handleFormat2DArray\",value:function(t,e){for(var i=this.w.config,a=this.w.globals,s=\"boxPlot\"===i.chart.type||\"boxPlot\"===i.series[e].type,r=0;r<t[e].data.length;r++)if(void 0!==t[e].data[r][1]&&(Array.isArray(t[e].data[r][1])&&4===t[e].data[r][1].length&&!s?this.twoDSeries.push(x.parseNumber(t[e].data[r][1][3])):t[e].data[r].length>=5?this.twoDSeries.push(x.parseNumber(t[e].data[r][4])):this.twoDSeries.push(x.parseNumber(t[e].data[r][1])),a.dataFormatXNumeric=!0),\"datetime\"===i.xaxis.type){var o=new Date(t[e].data[r][0]);o=new Date(o).getTime(),this.twoDSeriesX.push(o)}else this.twoDSeriesX.push(t[e].data[r][0]);for(var n=0;n<t[e].data.length;n++)void 0!==t[e].data[n][2]&&(this.threeDSeries.push(t[e].data[n][2]),a.isDataXYZ=!0)}},{key:\"handleFormatXY\",value:function(t,e){var i=this.w.config,a=this.w.globals,s=new I(this.ctx),r=e;a.collapsedSeriesIndices.indexOf(e)>-1&&(r=this.activeSeriesIndex);for(var o=0;o<t[e].data.length;o++)void 0!==t[e].data[o].y&&(Array.isArray(t[e].data[o].y)?this.twoDSeries.push(x.parseNumber(t[e].data[o].y[t[e].data[o].y.length-1])):this.twoDSeries.push(x.parseNumber(t[e].data[o].y))),void 0!==t[e].data[o].goals&&Array.isArray(t[e].data[o].goals)?(void 0===this.seriesGoals[e]&&(this.seriesGoals[e]=[]),this.seriesGoals[e].push(t[e].data[o].goals)):(void 0===this.seriesGoals[e]&&(this.seriesGoals[e]=[]),this.seriesGoals[e].push(null));for(var n=0;n<t[r].data.length;n++){var l=\"string\"==typeof t[r].data[n].x,h=Array.isArray(t[r].data[n].x),c=!h&&!!s.isValidDate(t[r].data[n].x.toString());if(l||c)if(l||i.xaxis.convertedCatToNumeric){var d=a.isBarHorizontal&&a.isRangeData;\"datetime\"!==i.xaxis.type||d?(this.fallbackToCategory=!0,this.twoDSeriesX.push(t[r].data[n].x)):this.twoDSeriesX.push(s.parseDate(t[r].data[n].x))}else\"datetime\"===i.xaxis.type?this.twoDSeriesX.push(s.parseDate(t[r].data[n].x.toString())):(a.dataFormatXNumeric=!0,a.isXNumeric=!0,this.twoDSeriesX.push(parseFloat(t[r].data[n].x)));else h?(this.fallbackToCategory=!0,this.twoDSeriesX.push(t[r].data[n].x)):(a.isXNumeric=!0,a.dataFormatXNumeric=!0,this.twoDSeriesX.push(t[r].data[n].x))}if(t[e].data[0]&&void 0!==t[e].data[0].z){for(var g=0;g<t[e].data.length;g++)this.threeDSeries.push(t[e].data[g].z);a.isDataXYZ=!0}}},{key:\"handleRangeData\",value:function(t,e){var i=this.w.globals,a={};return this.isFormat2DArray()?a=this.handleRangeDataFormat(\"array\",t,e):this.isFormatXY()&&(a=this.handleRangeDataFormat(\"xy\",t,e)),i.seriesRangeStart.push(a.start),i.seriesRangeEnd.push(a.end),i.seriesRange.push(a.rangeUniques),i.seriesRange.forEach((function(t,e){t&&t.forEach((function(t,e){t.y.forEach((function(e,i){for(var a=0;a<t.y.length;a++)if(i!==a){var s=e.y1,r=e.y2,o=t.y[a].y1;s<=t.y[a].y2&&o<=r&&(t.overlaps.indexOf(e.rangeName)<0&&t.overlaps.push(e.rangeName),t.overlaps.indexOf(t.y[a].rangeName)<0&&t.overlaps.push(t.y[a].rangeName))}}))}))})),a}},{key:\"handleCandleStickBoxData\",value:function(t,e){var i=this.w.globals,a={};return this.isFormat2DArray()?a=this.handleCandleStickBoxDataFormat(\"array\",t,e):this.isFormatXY()&&(a=this.handleCandleStickBoxDataFormat(\"xy\",t,e)),i.seriesCandleO[e]=a.o,i.seriesCandleH[e]=a.h,i.seriesCandleM[e]=a.m,i.seriesCandleL[e]=a.l,i.seriesCandleC[e]=a.c,a}},{key:\"handleRangeDataFormat\",value:function(t,e,i){var a=[],s=[],r=e[i].data.filter((function(t,e,i){return e===i.findIndex((function(e){return e.x===t.x}))})).map((function(t,e){return{x:t.x,overlaps:[],y:[]}}));if(\"array\"===t)for(var o=0;o<e[i].data.length;o++)Array.isArray(e[i].data[o])?(a.push(e[i].data[o][1][0]),s.push(e[i].data[o][1][1])):(a.push(e[i].data[o]),s.push(e[i].data[o]));else if(\"xy\"===t)for(var n=function(t){var o=Array.isArray(e[i].data[t].y),n=x.randomId(),l=e[i].data[t].x,h={y1:o?e[i].data[t].y[0]:e[i].data[t].y,y2:o?e[i].data[t].y[1]:e[i].data[t].y,rangeName:n};e[i].data[t].rangeName=n;var c=r.findIndex((function(t){return t.x===l}));r[c].y.push(h),a.push(h.y1),s.push(h.y2)},l=0;l<e[i].data.length;l++)n(l);return{start:a,end:s,rangeUniques:r}}},{key:\"handleCandleStickBoxDataFormat\",value:function(t,e,i){var a=this.w,s=\"boxPlot\"===a.config.chart.type||\"boxPlot\"===a.config.series[i].type,r=[],o=[],n=[],l=[],h=[];if(\"array\"===t)if(s&&6===e[i].data[0].length||!s&&5===e[i].data[0].length)for(var c=0;c<e[i].data.length;c++)r.push(e[i].data[c][1]),o.push(e[i].data[c][2]),s?(n.push(e[i].data[c][3]),l.push(e[i].data[c][4]),h.push(e[i].data[c][5])):(l.push(e[i].data[c][3]),h.push(e[i].data[c][4]));else for(var d=0;d<e[i].data.length;d++)Array.isArray(e[i].data[d][1])&&(r.push(e[i].data[d][1][0]),o.push(e[i].data[d][1][1]),s?(n.push(e[i].data[d][1][2]),l.push(e[i].data[d][1][3]),h.push(e[i].data[d][1][4])):(l.push(e[i].data[d][1][2]),h.push(e[i].data[d][1][3])));else if(\"xy\"===t)for(var g=0;g<e[i].data.length;g++)Array.isArray(e[i].data[g].y)&&(r.push(e[i].data[g].y[0]),o.push(e[i].data[g].y[1]),s?(n.push(e[i].data[g].y[2]),l.push(e[i].data[g].y[3]),h.push(e[i].data[g].y[4])):(l.push(e[i].data[g].y[2]),h.push(e[i].data[g].y[3])));return{o:r,h:o,m:n,l:l,c:h}}},{key:\"parseDataAxisCharts\",value:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.ctx,a=this.w.config,s=this.w.globals,r=new I(i),o=a.labels.length>0?a.labels.slice():a.xaxis.categories.slice();s.isRangeBar=\"rangeBar\"===a.chart.type&&s.isBarHorizontal,s.hasGroups=\"category\"===a.xaxis.type&&a.xaxis.group.groups.length>0,s.hasGroups&&(s.groups=a.xaxis.group.groups);for(var n=function(){for(var t=0;t<o.length;t++)if(\"string\"==typeof o[t]){if(!r.isValidDate(o[t]))throw new Error(\"You have provided invalid Date format. Please provide a valid JavaScript Date\");e.twoDSeriesX.push(r.parseDate(o[t]))}else e.twoDSeriesX.push(o[t])},l=0;l<t.length;l++){if(this.twoDSeries=[],this.twoDSeriesX=[],this.threeDSeries=[],void 0===t[l].data)return void console.error(\"It is a possibility that you may have not included 'data' property in series.\");if(\"rangeBar\"!==a.chart.type&&\"rangeArea\"!==a.chart.type&&\"rangeBar\"!==t[l].type&&\"rangeArea\"!==t[l].type||(s.isRangeData=!0,s.isComboCharts?\"rangeBar\"!==t[l].type&&\"rangeArea\"!==t[l].type||this.handleRangeData(t,l):\"rangeBar\"!==a.chart.type&&\"rangeArea\"!==a.chart.type||this.handleRangeData(t,l)),this.isMultiFormat())this.isFormat2DArray()?this.handleFormat2DArray(t,l):this.isFormatXY()&&this.handleFormatXY(t,l),\"candlestick\"!==a.chart.type&&\"candlestick\"!==t[l].type&&\"boxPlot\"!==a.chart.type&&\"boxPlot\"!==t[l].type||this.handleCandleStickBoxData(t,l),s.series.push(this.twoDSeries),s.labels.push(this.twoDSeriesX),s.seriesX.push(this.twoDSeriesX),s.seriesGoals=this.seriesGoals,l!==this.activeSeriesIndex||this.fallbackToCategory||(s.isXNumeric=!0);else{\"datetime\"===a.xaxis.type?(s.isXNumeric=!0,n(),s.seriesX.push(this.twoDSeriesX)):\"numeric\"===a.xaxis.type&&(s.isXNumeric=!0,o.length>0&&(this.twoDSeriesX=o,s.seriesX.push(this.twoDSeriesX))),s.labels.push(this.twoDSeriesX);var h=t[l].data.map((function(t){return x.parseNumber(t)}));s.series.push(h)}s.seriesZ.push(this.threeDSeries),void 0!==t[l].name?s.seriesNames.push(t[l].name):s.seriesNames.push(\"series-\"+parseInt(l+1,10)),void 0!==t[l].color?s.seriesColors.push(t[l].color):s.seriesColors.push(void 0)}return this.w}},{key:\"parseDataNonAxisCharts\",value:function(t){var e=this.w.globals,i=this.w.config;e.series=t.slice(),e.seriesNames=i.labels.slice();for(var a=0;a<e.series.length;a++)void 0===e.seriesNames[a]&&e.seriesNames.push(\"series-\"+(a+1));return this.w}},{key:\"handleExternalLabelsData\",value:function(t){var e=this.w.config,i=this.w.globals;if(e.xaxis.categories.length>0)i.labels=e.xaxis.categories;else if(e.labels.length>0)i.labels=e.labels.slice();else if(this.fallbackToCategory){if(i.labels=i.labels[0],i.seriesRange.length&&(i.seriesRange.map((function(t){t.forEach((function(t){i.labels.indexOf(t.x)<0&&t.x&&i.labels.push(t.x)}))})),i.labels=i.labels.filter((function(t,e,i){return i.indexOf(t)===e}))),e.xaxis.convertedCatToNumeric)new X(e).convertCatToNumericXaxis(e,this.ctx,i.seriesX[0]),this._generateExternalLabels(t)}else this._generateExternalLabels(t)}},{key:\"_generateExternalLabels\",value:function(t){var e=this.w.globals,i=this.w.config,a=[];if(e.axisCharts){if(e.series.length>0)if(this.isFormatXY())for(var s=i.series.map((function(t,e){return t.data.filter((function(t,e,i){return i.findIndex((function(e){return e.x===t.x}))===e}))})),r=s.reduce((function(t,e,i,a){return a[t].length>e.length?t:i}),0),o=0;o<s[r].length;o++)a.push(o+1);else for(var n=0;n<e.series[e.maxValsInArrayIndex].length;n++)a.push(n+1);e.seriesX=[];for(var l=0;l<t.length;l++)e.seriesX.push(a);e.isXNumeric=!0}if(0===a.length){a=e.axisCharts?[]:e.series.map((function(t,e){return e+1}));for(var h=0;h<t.length;h++)e.seriesX.push(a)}e.labels=a,i.xaxis.convertedCatToNumeric&&(e.categoryLabels=a.map((function(t){return i.xaxis.labels.formatter(t)}))),e.noLabelsProvided=!0}},{key:\"parseData\",value:function(t){var e=this.w,i=e.config,a=e.globals;if(this.excludeCollapsedSeriesInYAxis(),this.fallbackToCategory=!1,this.ctx.core.resetGlobals(),this.ctx.core.isMultipleY(),a.axisCharts?(this.parseDataAxisCharts(t),this.coreUtils.getLargestSeries()):this.parseDataNonAxisCharts(t),\"bar\"===i.chart.type&&i.chart.stacked){var s=new N(this.ctx);a.series=s.setNullSeriesToZeroValues(a.series)}this.coreUtils.getSeriesTotals(),a.axisCharts&&(a.stackedSeriesTotals=this.coreUtils.getStackedSeriesTotals()),this.coreUtils.getPercentSeries(),a.dataFormatXNumeric||a.isXNumeric&&(\"numeric\"!==i.xaxis.type||0!==i.labels.length||0!==i.xaxis.categories.length)||this.handleExternalLabelsData(t);for(var r=this.coreUtils.getCategoryLabels(a.labels),o=0;o<r.length;o++)if(Array.isArray(r[o])){a.isMultiLineX=!0;break}}},{key:\"excludeCollapsedSeriesInYAxis\",value:function(){var t=this,e=this.w;e.globals.ignoreYAxisIndexes=e.globals.collapsedSeries.map((function(i,a){if(t.w.globals.isMultipleYAxis&&!e.config.chart.stacked)return i.index}))}}]),t}(),B=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:\"getLabel\",value:function(t,e,i,a){var s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:[],r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:\"12px\",o=!(arguments.length>6&&void 0!==arguments[6])||arguments[6],n=this.w,l=void 0===t[a]?\"\":t[a],h=l,c=n.globals.xLabelFormatter,d=n.config.xaxis.labels.formatter,g=!1,u=new T(this.ctx),f=l;o&&(h=u.xLabelFormat(c,l,f,{i:a,dateFormatter:new I(this.ctx).formatDate,w:n}),void 0!==d&&(h=d(l,t[a],{i:a,dateFormatter:new I(this.ctx).formatDate,w:n})));var p,x;e.length>0?(p=e[a].unit,x=null,e.forEach((function(t){\"month\"===t.unit?x=\"year\":\"day\"===t.unit?x=\"month\":\"hour\"===t.unit?x=\"day\":\"minute\"===t.unit&&(x=\"hour\")})),g=x===p,i=e[a].position,h=e[a].value):\"datetime\"===n.config.xaxis.type&&void 0===d&&(h=\"\"),void 0===h&&(h=\"\"),h=Array.isArray(h)?h:h.toString();var b=new m(this.ctx),v={};v=n.globals.rotateXLabels&&o?b.getTextRects(h,parseInt(r,10),null,\"rotate(\".concat(n.config.xaxis.labels.rotate,\" 0 0)\"),!1):b.getTextRects(h,parseInt(r,10));var y=!n.config.xaxis.labels.showDuplicates&&this.ctx.timeScale;return!Array.isArray(h)&&(0===h.indexOf(\"NaN\")||0===h.toLowerCase().indexOf(\"invalid\")||h.toLowerCase().indexOf(\"infinity\")>=0||s.indexOf(h)>=0&&y)&&(h=\"\"),{x:i,text:h,textRect:v,isBold:g}}},{key:\"checkLabelBasedOnTickamount\",value:function(t,e,i){var a=this.w,s=a.config.xaxis.tickAmount;return\"dataPoints\"===s&&(s=Math.round(a.globals.gridWidth/120)),s>i||t%Math.round(i/(s+1))==0||(e.text=\"\"),e}},{key:\"checkForOverflowingLabels\",value:function(t,e,i,a,s){var r=this.w;if(0===t&&r.globals.skipFirstTimelinelabel&&(e.text=\"\"),t===i-1&&r.globals.skipLastTimelinelabel&&(e.text=\"\"),r.config.xaxis.labels.hideOverlappingLabels&&a.length>0){var o=s[s.length-1];e.x<o.textRect.width/(r.globals.rotateXLabels?Math.abs(r.config.xaxis.labels.rotate)/12:1.01)+o.x&&(e.text=\"\")}return e}},{key:\"checkForReversedLabels\",value:function(t,e){var i=this.w;return i.config.yaxis[t]&&i.config.yaxis[t].reversed&&e.reverse(),e}},{key:\"isYAxisHidden\",value:function(t){var e=this.w,i=new y(this.ctx);return!e.config.yaxis[t].show||!e.config.yaxis[t].showForNullSeries&&i.isSeriesNull(t)&&-1===e.globals.collapsedSeriesIndices.indexOf(t)}},{key:\"getYAxisForeColor\",value:function(t,e){var i=this.w;return Array.isArray(t)&&i.globals.yAxisScale[e]&&this.ctx.theme.pushExtraColors(t,i.globals.yAxisScale[e].result.length,!1),t}},{key:\"drawYAxisTicks\",value:function(t,e,i,a,s,r,o){var n=this.w,l=new m(this.ctx),h=n.globals.translateY;if(a.show&&e>0){!0===n.config.yaxis[s].opposite&&(t+=a.width);for(var c=e;c>=0;c--){var d=h+e/10+n.config.yaxis[s].labels.offsetY-1;n.globals.isBarHorizontal&&(d=r*c),\"heatmap\"===n.config.chart.type&&(d+=r/2);var g=l.drawLine(t+i.offsetX-a.width+a.offsetX,d+a.offsetY,t+i.offsetX+a.offsetX,d+a.offsetY,a.color);o.add(g),h+=r}}}}]),t}(),G=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:\"scaleSvgNode\",value:function(t,e){var i=parseFloat(t.getAttributeNS(null,\"width\")),a=parseFloat(t.getAttributeNS(null,\"height\"));t.setAttributeNS(null,\"width\",i*e),t.setAttributeNS(null,\"height\",a*e),t.setAttributeNS(null,\"viewBox\",\"0 0 \"+i+\" \"+a)}},{key:\"fixSvgStringForIe11\",value:function(t){if(!x.isIE11())return t.replace(/&nbsp;/g,\"&#160;\");var e=0,i=t.replace(/xmlns=\"http:\\/\\/www.w3.org\\/2000\\/svg\"/g,(function(t){return 2===++e?'xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:svgjs=\"http://svgjs.dev\"':t}));return i=(i=i.replace(/xmlns:NS\\d+=\"\"/g,\"\")).replace(/NS\\d+:(\\w+:\\w+=\")/g,\"$1\")}},{key:\"getSvgString\",value:function(t){null==t&&(t=1);var e=this.w.globals.dom.Paper.svg();if(1!==t){var i=this.w.globals.dom.Paper.node.cloneNode(!0);this.scaleSvgNode(i,t),e=(new XMLSerializer).serializeToString(i)}return this.fixSvgStringForIe11(e)}},{key:\"cleanup\",value:function(){var t=this.w,e=t.globals.dom.baseEl.getElementsByClassName(\"apexcharts-xcrosshairs\"),i=t.globals.dom.baseEl.getElementsByClassName(\"apexcharts-ycrosshairs\"),a=t.globals.dom.baseEl.querySelectorAll(\".apexcharts-zoom-rect, .apexcharts-selection-rect\");Array.prototype.forEach.call(a,(function(t){t.setAttribute(\"width\",0)})),e&&e[0]&&(e[0].setAttribute(\"x\",-500),e[0].setAttribute(\"x1\",-500),e[0].setAttribute(\"x2\",-500)),i&&i[0]&&(i[0].setAttribute(\"y\",-100),i[0].setAttribute(\"y1\",-100),i[0].setAttribute(\"y2\",-100))}},{key:\"svgUrl\",value:function(){this.cleanup();var t=this.getSvgString(),e=new Blob([t],{type:\"image/svg+xml;charset=utf-8\"});return URL.createObjectURL(e)}},{key:\"dataURI\",value:function(t){var e=this;return new Promise((function(i){var a=e.w,s=t?t.scale||t.width/a.globals.svgWidth:1;e.cleanup();var r=document.createElement(\"canvas\");r.width=a.globals.svgWidth*s,r.height=parseInt(a.globals.dom.elWrap.style.height,10)*s;var o=\"transparent\"===a.config.chart.background?\"#fff\":a.config.chart.background,n=r.getContext(\"2d\");n.fillStyle=o,n.fillRect(0,0,r.width*s,r.height*s);var l=e.getSvgString(s);if(window.canvg&&x.isIE11()){var h=window.canvg.Canvg.fromString(n,l,{ignoreClear:!0,ignoreDimensions:!0});h.start();var c=r.msToBlob();h.stop(),i({blob:c})}else{var d=\"data:image/svg+xml,\"+encodeURIComponent(l),g=new Image;g.crossOrigin=\"anonymous\",g.onload=function(){if(n.drawImage(g,0,0),r.msToBlob){var t=r.msToBlob();i({blob:t})}else{var e=r.toDataURL(\"image/png\");i({imgURI:e})}},g.src=d}}))}},{key:\"exportToSVG\",value:function(){this.triggerDownload(this.svgUrl(),this.w.config.chart.toolbar.export.svg.filename,\".svg\")}},{key:\"exportToPng\",value:function(){var t=this;this.dataURI().then((function(e){var i=e.imgURI,a=e.blob;a?navigator.msSaveOrOpenBlob(a,t.w.globals.chartID+\".png\"):t.triggerDownload(i,t.w.config.chart.toolbar.export.png.filename,\".png\")}))}},{key:\"exportToCSV\",value:function(t){var e=this,i=t.series,a=t.fileName,s=t.columnDelimiter,r=void 0===s?\",\":s,o=t.lineDelimiter,n=void 0===o?\"\\n\":o,l=this.w;i||(i=l.config.series);var h=[],c=[],d=\"\",g=l.globals.series.map((function(t,e){return-1===l.globals.collapsedSeriesIndices.indexOf(e)?t:[]})),f=Math.max.apply(Math,u(i.map((function(t){return t.data?t.data.length:0})))),p=new W(this.ctx),b=new B(this.ctx),v=function(t){var i=\"\";if(l.globals.axisCharts){if(\"category\"===l.config.xaxis.type||l.config.xaxis.convertedCatToNumeric)if(l.globals.isBarHorizontal){var a=l.globals.yLabelFormatters[0],s=new N(e.ctx).getActiveConfigSeriesIndex();i=a(l.globals.labels[t],{seriesIndex:s,dataPointIndex:t,w:l})}else i=b.getLabel(l.globals.labels,l.globals.timescaleLabels,0,t).text;\"datetime\"===l.config.xaxis.type&&(l.config.xaxis.categories.length?i=l.config.xaxis.categories[t]:l.config.labels.length&&(i=l.config.labels[t]))}else i=l.config.labels[t];return Array.isArray(i)&&(i=i.join(\" \")),x.isNumber(i)?i:i.split(r).join(\"\")},m=function(t,e){if(h.length&&0===e&&c.push(h.join(r)),t.data){t.data=t.data.length&&t.data||u(Array(f)).map((function(){return\"\"}));for(var a=0;a<t.data.length;a++){h=[];var s=v(a);if(s||(p.isFormatXY()?s=i[e].data[a].x:p.isFormat2DArray()&&(s=i[e].data[a]?i[e].data[a][0]:\"\")),0===e){h.push((n=s,\"datetime\"===l.config.xaxis.type&&String(n).length>=10?l.config.chart.toolbar.export.csv.dateFormatter(s):x.isNumber(s)?s:s.split(r).join(\"\")));for(var o=0;o<l.globals.series.length;o++)p.isFormatXY()?h.push(i[o].data[a].y):h.push(g[o][a])}(\"candlestick\"===l.config.chart.type||t.type&&\"candlestick\"===t.type)&&(h.pop(),h.push(l.globals.seriesCandleO[e][a]),h.push(l.globals.seriesCandleH[e][a]),h.push(l.globals.seriesCandleL[e][a]),h.push(l.globals.seriesCandleC[e][a])),(\"boxPlot\"===l.config.chart.type||t.type&&\"boxPlot\"===t.type)&&(h.pop(),h.push(l.globals.seriesCandleO[e][a]),h.push(l.globals.seriesCandleH[e][a]),h.push(l.globals.seriesCandleM[e][a]),h.push(l.globals.seriesCandleL[e][a]),h.push(l.globals.seriesCandleC[e][a])),\"rangeBar\"===l.config.chart.type&&(h.pop(),h.push(l.globals.seriesRangeStart[e][a]),h.push(l.globals.seriesRangeEnd[e][a])),h.length&&c.push(h.join(r))}}var n};h.push(l.config.chart.toolbar.export.csv.headerCategory),\"boxPlot\"===l.config.chart.type?(h.push(\"minimum\"),h.push(\"q1\"),h.push(\"median\"),h.push(\"q3\"),h.push(\"maximum\")):\"candlestick\"===l.config.chart.type?(h.push(\"open\"),h.push(\"high\"),h.push(\"low\"),h.push(\"close\")):\"rangeBar\"===l.config.chart.type?(h.push(\"minimum\"),h.push(\"maximum\")):i.map((function(t,e){var i=t.name?t.name:\"series-\".concat(e);l.globals.axisCharts&&h.push(i.split(r).join(\"\")?i.split(r).join(\"\"):\"series-\".concat(e))})),l.globals.axisCharts||(h.push(l.config.chart.toolbar.export.csv.headerValue),c.push(h.join(r))),i.map((function(t,e){l.globals.axisCharts?m(t,e):((h=[]).push(l.globals.labels[e].split(r).join(\"\")),h.push(g[e]),c.push(h.join(r)))})),d+=c.join(n),this.triggerDownload(\"data:text/csv; charset=utf-8,\"+encodeURIComponent(\"\\ufeff\"+d),a||l.config.chart.toolbar.export.csv.filename,\".csv\")}},{key:\"triggerDownload\",value:function(t,e,i){var a=document.createElement(\"a\");a.href=t,a.download=(e||this.w.globals.chartID)+i,document.body.appendChild(a),a.click(),document.body.removeChild(a)}}]),t}(),V=function(){function t(e,i){a(this,t),this.ctx=e,this.elgrid=i,this.w=e.w;var s=this.w;this.axesUtils=new B(e),this.xaxisLabels=s.globals.labels.slice(),s.globals.timescaleLabels.length>0&&!s.globals.isBarHorizontal&&(this.xaxisLabels=s.globals.timescaleLabels.slice()),s.config.xaxis.overwriteCategories&&(this.xaxisLabels=s.config.xaxis.overwriteCategories),this.drawnLabels=[],this.drawnLabelsRects=[],\"top\"===s.config.xaxis.position?this.offY=0:this.offY=s.globals.gridHeight+1,this.offY=this.offY+s.config.xaxis.axisBorder.offsetY,this.isCategoryBarHorizontal=\"bar\"===s.config.chart.type&&s.config.plotOptions.bar.horizontal,this.xaxisFontSize=s.config.xaxis.labels.style.fontSize,this.xaxisFontFamily=s.config.xaxis.labels.style.fontFamily,this.xaxisForeColors=s.config.xaxis.labels.style.colors,this.xaxisBorderWidth=s.config.xaxis.axisBorder.width,this.isCategoryBarHorizontal&&(this.xaxisBorderWidth=s.config.yaxis[0].axisBorder.width.toString()),this.xaxisBorderWidth.indexOf(\"%\")>-1?this.xaxisBorderWidth=s.globals.gridWidth*parseInt(this.xaxisBorderWidth,10)/100:this.xaxisBorderWidth=parseInt(this.xaxisBorderWidth,10),this.xaxisBorderHeight=s.config.xaxis.axisBorder.height,this.yaxis=s.config.yaxis[0]}return r(t,[{key:\"drawXaxis\",value:function(){var t=this.w,e=new m(this.ctx),i=e.group({class:\"apexcharts-xaxis\",transform:\"translate(\".concat(t.config.xaxis.offsetX,\", \").concat(t.config.xaxis.offsetY,\")\")}),a=e.group({class:\"apexcharts-xaxis-texts-g\",transform:\"translate(\".concat(t.globals.translateXAxisX,\", \").concat(t.globals.translateXAxisY,\")\")});i.add(a);for(var s=[],r=0;r<this.xaxisLabels.length;r++)s.push(this.xaxisLabels[r]);if(this.drawXAxisLabelAndGroup(!0,e,a,s,t.globals.isXNumeric,(function(t,e){return e})),t.globals.hasGroups){var o=t.globals.groups;s=[];for(var n=0;n<o.length;n++)s.push(o[n].title);var l={};t.config.xaxis.group.style&&(l.xaxisFontSize=t.config.xaxis.group.style.fontSize,l.xaxisFontFamily=t.config.xaxis.group.style.fontFamily,l.xaxisForeColors=t.config.xaxis.group.style.colors,l.fontWeight=t.config.xaxis.group.style.fontWeight,l.cssClass=t.config.xaxis.group.style.cssClass),this.drawXAxisLabelAndGroup(!1,e,a,s,!1,(function(t,e){return o[t].cols*e}),l)}if(void 0!==t.config.xaxis.title.text){var h=e.group({class:\"apexcharts-xaxis-title\"}),c=e.drawText({x:t.globals.gridWidth/2+t.config.xaxis.title.offsetX,y:this.offY+parseFloat(this.xaxisFontSize)+(\"bottom\"===t.config.xaxis.position?t.globals.xAxisLabelsHeight:-t.globals.xAxisLabelsHeight-10)+t.config.xaxis.title.offsetY,text:t.config.xaxis.title.text,textAnchor:\"middle\",fontSize:t.config.xaxis.title.style.fontSize,fontFamily:t.config.xaxis.title.style.fontFamily,fontWeight:t.config.xaxis.title.style.fontWeight,foreColor:t.config.xaxis.title.style.color,cssClass:\"apexcharts-xaxis-title-text \"+t.config.xaxis.title.style.cssClass});h.add(c),i.add(h)}if(t.config.xaxis.axisBorder.show){var d=t.globals.barPadForNumericAxis,g=e.drawLine(t.globals.padHorizontal+t.config.xaxis.axisBorder.offsetX-d,this.offY,this.xaxisBorderWidth+d,this.offY,t.config.xaxis.axisBorder.color,0,this.xaxisBorderHeight);this.elgrid&&this.elgrid.elGridBorders?this.elgrid.elGridBorders.add(g):i.add(g)}return i}},{key:\"drawXAxisLabelAndGroup\",value:function(t,e,i,a,s,r){var o,n=this,l=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{},h=[],c=[],d=this.w,g=l.xaxisFontSize||this.xaxisFontSize,u=l.xaxisFontFamily||this.xaxisFontFamily,f=l.xaxisForeColors||this.xaxisForeColors,p=l.fontWeight||d.config.xaxis.labels.style.fontWeight,x=l.cssClass||d.config.xaxis.labels.style.cssClass,b=d.globals.padHorizontal,v=a.length,m=\"category\"===d.config.xaxis.type?d.globals.dataPoints:v;if(0===m&&v>m&&(m=v),s){var y=m>1?m-1:m;o=d.globals.gridWidth/y,b=b+r(0,o)/2+d.config.xaxis.labels.offsetX}else o=d.globals.gridWidth/m,b=b+r(0,o)+d.config.xaxis.labels.offsetX;for(var w=function(s){var l=b-r(s,o)/2+d.config.xaxis.labels.offsetX;0===s&&1===v&&o/2===b&&1===m&&(l=d.globals.gridWidth/2);var y=n.axesUtils.getLabel(a,d.globals.timescaleLabels,l,s,h,g,t),w=28;d.globals.rotateXLabels&&t&&(w=22),d.config.xaxis.title.text&&\"top\"===d.config.xaxis.position&&(w+=parseFloat(d.config.xaxis.title.style.fontSize)+2),t||(w=w+parseFloat(g)+(d.globals.xAxisLabelsHeight-d.globals.xAxisGroupLabelsHeight)+(d.globals.rotateXLabels?10:0)),y=void 0!==d.config.xaxis.tickAmount&&\"dataPoints\"!==d.config.xaxis.tickAmount&&\"datetime\"!==d.config.xaxis.type?n.axesUtils.checkLabelBasedOnTickamount(s,y,v):n.axesUtils.checkForOverflowingLabels(s,y,v,h,c);if(d.config.xaxis.labels.show){var k=e.drawText({x:y.x,y:n.offY+d.config.xaxis.labels.offsetY+w-(\"top\"===d.config.xaxis.position?d.globals.xAxisHeight+d.config.xaxis.axisTicks.height-2:0),text:y.text,textAnchor:\"middle\",fontWeight:y.isBold?600:p,fontSize:g,fontFamily:u,foreColor:Array.isArray(f)?t&&d.config.xaxis.convertedCatToNumeric?f[d.globals.minX+s-1]:f[s]:f,isPlainText:!1,cssClass:(t?\"apexcharts-xaxis-label \":\"apexcharts-xaxis-group-label \")+x});if(i.add(k),k.on(\"click\",(function(t){if(\"function\"==typeof d.config.chart.events.xAxisLabelClick){var e=Object.assign({},d,{labelIndex:s});d.config.chart.events.xAxisLabelClick(t,n.ctx,e)}})),t){var A=document.createElementNS(d.globals.SVGNS,\"title\");A.textContent=Array.isArray(y.text)?y.text.join(\" \"):y.text,k.node.appendChild(A),\"\"!==y.text&&(h.push(y.text),c.push(y))}}s<v-1&&(b+=r(s+1,o))},k=0;k<=v-1;k++)w(k)}},{key:\"drawXaxisInversed\",value:function(t){var e,i,a=this,s=this.w,r=new m(this.ctx),o=s.config.yaxis[0].opposite?s.globals.translateYAxisX[t]:0,n=r.group({class:\"apexcharts-yaxis apexcharts-xaxis-inversed\",rel:t}),l=r.group({class:\"apexcharts-yaxis-texts-g apexcharts-xaxis-inversed-texts-g\",transform:\"translate(\"+o+\", 0)\"});n.add(l);var h=[];if(s.config.yaxis[t].show)for(var c=0;c<this.xaxisLabels.length;c++)h.push(this.xaxisLabels[c]);e=s.globals.gridHeight/h.length,i=-e/2.2;var d=s.globals.yLabelFormatters[0],g=s.config.yaxis[0].labels;if(g.show)for(var u=function(o){var n=void 0===h[o]?\"\":h[o];n=d(n,{seriesIndex:t,dataPointIndex:o,w:s});var c=a.axesUtils.getYAxisForeColor(g.style.colors,t),u=0;Array.isArray(n)&&(u=n.length/2*parseInt(g.style.fontSize,10));var f=g.offsetX-15,p=\"end\";a.yaxis.opposite&&(p=\"start\"),\"left\"===s.config.yaxis[0].labels.align?(f=g.offsetX,p=\"start\"):\"center\"===s.config.yaxis[0].labels.align?(f=g.offsetX,p=\"middle\"):\"right\"===s.config.yaxis[0].labels.align&&(p=\"end\");var x=r.drawText({x:f,y:i+e+g.offsetY-u,text:n,textAnchor:p,foreColor:Array.isArray(c)?c[o]:c,fontSize:g.style.fontSize,fontFamily:g.style.fontFamily,fontWeight:g.style.fontWeight,isPlainText:!1,cssClass:\"apexcharts-yaxis-label \"+g.style.cssClass,maxWidth:g.maxWidth});l.add(x),x.on(\"click\",(function(t){if(\"function\"==typeof s.config.chart.events.xAxisLabelClick){var e=Object.assign({},s,{labelIndex:o});s.config.chart.events.xAxisLabelClick(t,a.ctx,e)}}));var b=document.createElementNS(s.globals.SVGNS,\"title\");if(b.textContent=Array.isArray(n)?n.join(\" \"):n,x.node.appendChild(b),0!==s.config.yaxis[t].labels.rotate){var v=r.rotateAroundCenter(x.node);x.node.setAttribute(\"transform\",\"rotate(\".concat(s.config.yaxis[t].labels.rotate,\" 0 \").concat(v.y,\")\"))}i+=e},f=0;f<=h.length-1;f++)u(f);if(void 0!==s.config.yaxis[0].title.text){var p=r.group({class:\"apexcharts-yaxis-title apexcharts-xaxis-title-inversed\",transform:\"translate(\"+o+\", 0)\"}),x=r.drawText({x:s.config.yaxis[0].title.offsetX,y:s.globals.gridHeight/2+s.config.yaxis[0].title.offsetY,text:s.config.yaxis[0].title.text,textAnchor:\"middle\",foreColor:s.config.yaxis[0].title.style.color,fontSize:s.config.yaxis[0].title.style.fontSize,fontWeight:s.config.yaxis[0].title.style.fontWeight,fontFamily:s.config.yaxis[0].title.style.fontFamily,cssClass:\"apexcharts-yaxis-title-text \"+s.config.yaxis[0].title.style.cssClass});p.add(x),n.add(p)}var b=0;this.isCategoryBarHorizontal&&s.config.yaxis[0].opposite&&(b=s.globals.gridWidth);var v=s.config.xaxis.axisBorder;if(v.show){var y=r.drawLine(s.globals.padHorizontal+v.offsetX+b,1+v.offsetY,s.globals.padHorizontal+v.offsetX+b,s.globals.gridHeight+v.offsetY,v.color,0);this.elgrid&&this.elgrid.elGridBorders?this.elgrid.elGridBorders.add(y):n.add(y)}return s.config.yaxis[0].axisTicks.show&&this.axesUtils.drawYAxisTicks(b,h.length,s.config.yaxis[0].axisBorder,s.config.yaxis[0].axisTicks,0,e,n),n}},{key:\"drawXaxisTicks\",value:function(t,e,i){var a=this.w,s=t;if(!(t<0||t-2>a.globals.gridWidth)){var r=this.offY+a.config.xaxis.axisTicks.offsetY;if(e=e+r+a.config.xaxis.axisTicks.height,\"top\"===a.config.xaxis.position&&(e=r-a.config.xaxis.axisTicks.height),a.config.xaxis.axisTicks.show){var o=new m(this.ctx).drawLine(t+a.config.xaxis.axisTicks.offsetX,r+a.config.xaxis.offsetY,s+a.config.xaxis.axisTicks.offsetX,e+a.config.xaxis.offsetY,a.config.xaxis.axisTicks.color);i.add(o),o.node.classList.add(\"apexcharts-xaxis-tick\")}}}},{key:\"getXAxisTicksPositions\",value:function(){var t=this.w,e=[],i=this.xaxisLabels.length,a=t.globals.padHorizontal;if(t.globals.timescaleLabels.length>0)for(var s=0;s<i;s++)a=this.xaxisLabels[s].position,e.push(a);else for(var r=i,o=0;o<r;o++){var n=r;t.globals.isXNumeric&&\"bar\"!==t.config.chart.type&&(n-=1),a+=t.globals.gridWidth/n,e.push(a)}return e}},{key:\"xAxisLabelCorrections\",value:function(){var t=this.w,e=new m(this.ctx),i=t.globals.dom.baseEl.querySelector(\".apexcharts-xaxis-texts-g\"),a=t.globals.dom.baseEl.querySelectorAll(\".apexcharts-xaxis-texts-g text:not(.apexcharts-xaxis-group-label)\"),s=t.globals.dom.baseEl.querySelectorAll(\".apexcharts-yaxis-inversed text\"),r=t.globals.dom.baseEl.querySelectorAll(\".apexcharts-xaxis-inversed-texts-g text tspan\");if(t.globals.rotateXLabels||t.config.xaxis.labels.rotateAlways)for(var o=0;o<a.length;o++){var n=e.rotateAroundCenter(a[o]);n.y=n.y-1,n.x=n.x+1,a[o].setAttribute(\"transform\",\"rotate(\".concat(t.config.xaxis.labels.rotate,\" \").concat(n.x,\" \").concat(n.y,\")\")),a[o].setAttribute(\"text-anchor\",\"end\");i.setAttribute(\"transform\",\"translate(0, \".concat(-10,\")\"));var l=a[o].childNodes;t.config.xaxis.labels.trim&&Array.prototype.forEach.call(l,(function(i){e.placeTextWithEllipsis(i,i.textContent,t.globals.xAxisLabelsHeight-(\"bottom\"===t.config.legend.position?20:10))}))}else!function(){for(var i=t.globals.gridWidth/(t.globals.labels.length+1),s=0;s<a.length;s++){var r=a[s].childNodes;t.config.xaxis.labels.trim&&\"datetime\"!==t.config.xaxis.type&&Array.prototype.forEach.call(r,(function(t){e.placeTextWithEllipsis(t,t.textContent,i)}))}}();if(s.length>0){var h=s[s.length-1].getBBox(),c=s[0].getBBox();h.x<-20&&s[s.length-1].parentNode.removeChild(s[s.length-1]),c.x+c.width>t.globals.gridWidth&&!t.globals.isBarHorizontal&&s[0].parentNode.removeChild(s[0]);for(var d=0;d<r.length;d++)e.placeTextWithEllipsis(r[d],r[d].textContent,t.config.yaxis[0].labels.maxWidth-(t.config.yaxis[0].title.text?2*parseFloat(t.config.yaxis[0].title.style.fontSize):0)-15)}}}]),t}(),j=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w;var i=this.w;this.xaxisLabels=i.globals.labels.slice(),this.axesUtils=new B(e),this.isRangeBar=i.globals.seriesRange.length,i.globals.timescaleLabels.length>0&&(this.xaxisLabels=i.globals.timescaleLabels.slice())}return r(t,[{key:\"drawGridArea\",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,e=this.w,i=new m(this.ctx);null===t&&(t=i.group({class:\"apexcharts-grid\"}));var a=i.drawLine(e.globals.padHorizontal,1,e.globals.padHorizontal,e.globals.gridHeight,\"transparent\"),s=i.drawLine(e.globals.padHorizontal,e.globals.gridHeight,e.globals.gridWidth,e.globals.gridHeight,\"transparent\");return t.add(s),t.add(a),t}},{key:\"drawGrid\",value:function(){var t=null;return this.w.globals.axisCharts&&(t=this.renderGrid(),this.drawGridArea(t.el)),t}},{key:\"createGridMask\",value:function(){var t=this.w,e=t.globals,i=new m(this.ctx),a=Array.isArray(t.config.stroke.width)?0:t.config.stroke.width;if(Array.isArray(t.config.stroke.width)){var s=0;t.config.stroke.width.forEach((function(t){s=Math.max(s,t)})),a=s}e.dom.elGridRectMask=document.createElementNS(e.SVGNS,\"clipPath\"),e.dom.elGridRectMask.setAttribute(\"id\",\"gridRectMask\".concat(e.cuid)),e.dom.elGridRectMarkerMask=document.createElementNS(e.SVGNS,\"clipPath\"),e.dom.elGridRectMarkerMask.setAttribute(\"id\",\"gridRectMarkerMask\".concat(e.cuid)),e.dom.elForecastMask=document.createElementNS(e.SVGNS,\"clipPath\"),e.dom.elForecastMask.setAttribute(\"id\",\"forecastMask\".concat(e.cuid)),e.dom.elNonForecastMask=document.createElementNS(e.SVGNS,\"clipPath\"),e.dom.elNonForecastMask.setAttribute(\"id\",\"nonForecastMask\".concat(e.cuid));var r=t.config.chart.type,o=0,n=0;(\"bar\"===r||\"rangeBar\"===r||\"candlestick\"===r||\"boxPlot\"===r||t.globals.comboBarCount>0)&&t.globals.isXNumeric&&!t.globals.isBarHorizontal&&(o=t.config.grid.padding.left,n=t.config.grid.padding.right,e.barPadForNumericAxis>o&&(o=e.barPadForNumericAxis,n=e.barPadForNumericAxis)),e.dom.elGridRect=i.drawRect(-a/2-o-2,-a/2,e.gridWidth+a+n+o+4,e.gridHeight+a,0,\"#fff\");var l=t.globals.markers.largestSize+1;e.dom.elGridRectMarker=i.drawRect(2*-l,2*-l,e.gridWidth+4*l,e.gridHeight+4*l,0,\"#fff\"),e.dom.elGridRectMask.appendChild(e.dom.elGridRect.node),e.dom.elGridRectMarkerMask.appendChild(e.dom.elGridRectMarker.node);var h=e.dom.baseEl.querySelector(\"defs\");h.appendChild(e.dom.elGridRectMask),h.appendChild(e.dom.elForecastMask),h.appendChild(e.dom.elNonForecastMask),h.appendChild(e.dom.elGridRectMarkerMask)}},{key:\"_drawGridLines\",value:function(t){var e=t.i,i=t.x1,a=t.y1,s=t.x2,r=t.y2,o=t.xCount,n=t.parent,l=this.w;if(!(0===e&&l.globals.skipFirstTimelinelabel||e===o-1&&l.globals.skipLastTimelinelabel&&!l.config.xaxis.labels.formatter||\"radar\"===l.config.chart.type)){l.config.grid.xaxis.lines.show&&this._drawGridLine({i:e,x1:i,y1:a,x2:s,y2:r,xCount:o,parent:n});var h=0;if(l.globals.hasGroups&&\"between\"===l.config.xaxis.tickPlacement){var c=l.globals.groups;if(c){for(var d=0,g=0;d<e&&g<c.length;g++)d+=c[g].cols;d===e&&(h=.6*l.globals.xAxisLabelsHeight)}}new V(this.ctx).drawXaxisTicks(i,h,l.globals.dom.elGraphical)}}},{key:\"_drawGridLine\",value:function(t){var e=t.i,i=t.x1,a=t.y1,s=t.x2,r=t.y2,o=t.xCount,n=t.parent,l=this.w,h=!1,c=n.node.classList.contains(\"apexcharts-gridlines-horizontal\"),d=l.config.grid.strokeDashArray,g=l.globals.barPadForNumericAxis;(0===a&&0===r||0===i&&0===s)&&(h=!0),a===l.globals.gridHeight&&r===l.globals.gridHeight&&(h=!0),!l.globals.isBarHorizontal||0!==e&&e!==o-1||(h=!0);var u=new m(this).drawLine(i-(c?g:0),a,s+(c?g:0),r,l.config.grid.borderColor,d);u.node.classList.add(\"apexcharts-gridline\"),h?this.elGridBorders.add(u):n.add(u)}},{key:\"_drawGridBandRect\",value:function(t){var e=t.c,i=t.x1,a=t.y1,s=t.x2,r=t.y2,o=t.type,n=this.w,l=new m(this.ctx),h=n.globals.barPadForNumericAxis;if(\"column\"!==o||\"datetime\"!==n.config.xaxis.type){var c=n.config.grid[o].colors[e],d=l.drawRect(i-(\"row\"===o?h:0),a,s+(\"row\"===o?2*h:0),r,0,c,n.config.grid[o].opacity);this.elg.add(d),d.attr(\"clip-path\",\"url(#gridRectMask\".concat(n.globals.cuid,\")\")),d.node.classList.add(\"apexcharts-grid-\".concat(o))}}},{key:\"_drawXYLines\",value:function(t){var e=this,i=t.xCount,a=t.tickAmount,s=this.w;if(s.config.grid.xaxis.lines.show||s.config.xaxis.axisTicks.show){var r,o=s.globals.padHorizontal,n=s.globals.gridHeight;s.globals.timescaleLabels.length?function(t){for(var a=t.xC,s=t.x1,r=t.y1,o=t.x2,n=t.y2,l=0;l<a;l++)s=e.xaxisLabels[l].position,o=e.xaxisLabels[l].position,e._drawGridLines({i:l,x1:s,y1:r,x2:o,y2:n,xCount:i,parent:e.elgridLinesV})}({xC:i,x1:o,y1:0,x2:r,y2:n}):(s.globals.isXNumeric&&(i=s.globals.xAxisScale.result.length),function(t){for(var a=t.xC,r=t.x1,o=t.y1,n=t.x2,l=t.y2,h=0;h<a+(s.globals.isXNumeric?0:1);h++)0===h&&1===a&&1===s.globals.dataPoints&&(n=r=s.globals.gridWidth/2),e._drawGridLines({i:h,x1:r,y1:o,x2:n,y2:l,xCount:i,parent:e.elgridLinesV}),n=r+=s.globals.gridWidth/(s.globals.isXNumeric?a-1:a)}({xC:i,x1:o,y1:0,x2:r,y2:n}))}if(s.config.grid.yaxis.lines.show){var l=0,h=0,c=s.globals.gridWidth,d=a+1;this.isRangeBar&&(d=s.globals.labels.length);for(var g=0;g<d+(this.isRangeBar?1:0);g++)this._drawGridLine({i:g,xCount:d+(this.isRangeBar?1:0),x1:0,y1:l,x2:c,y2:h,parent:this.elgridLinesH}),h=l+=s.globals.gridHeight/(this.isRangeBar?d:a)}}},{key:\"_drawInvertedXYLines\",value:function(t){var e=t.xCount,i=this.w;if(i.config.grid.xaxis.lines.show||i.config.xaxis.axisTicks.show)for(var a,s=i.globals.padHorizontal,r=i.globals.gridHeight,o=0;o<e+1;o++){i.config.grid.xaxis.lines.show&&this._drawGridLine({i:o,xCount:e+1,x1:s,y1:0,x2:a,y2:r,parent:this.elgridLinesV}),new V(this.ctx).drawXaxisTicks(s,0,i.globals.dom.elGraphical),a=s=s+i.globals.gridWidth/e+.3}if(i.config.grid.yaxis.lines.show)for(var n=0,l=0,h=i.globals.gridWidth,c=0;c<i.globals.dataPoints+1;c++)this._drawGridLine({i:c,xCount:i.globals.dataPoints+1,x1:0,y1:n,x2:h,y2:l,parent:this.elgridLinesH}),l=n+=i.globals.gridHeight/i.globals.dataPoints}},{key:\"renderGrid\",value:function(){var t=this.w,e=new m(this.ctx);this.elg=e.group({class:\"apexcharts-grid\"}),this.elgridLinesH=e.group({class:\"apexcharts-gridlines-horizontal\"}),this.elgridLinesV=e.group({class:\"apexcharts-gridlines-vertical\"}),this.elGridBorders=e.group({class:\"apexcharts-grid-borders\"}),this.elg.add(this.elgridLinesH),this.elg.add(this.elgridLinesV),t.config.grid.show||(this.elgridLinesV.hide(),this.elgridLinesH.hide(),this.elGridBorders.hide());for(var i,a=t.globals.yAxisScale.length?t.globals.yAxisScale[0].result.length-1:5,s=0;s<t.globals.series.length&&(void 0!==t.globals.yAxisScale[s]&&(a=t.globals.yAxisScale[s].result.length-1),!(a>2));s++);return!t.globals.isBarHorizontal||this.isRangeBar?(i=this.xaxisLabels.length,this.isRangeBar&&(a=t.globals.labels.length,t.config.xaxis.tickAmount&&t.config.xaxis.labels.formatter&&(i=t.config.xaxis.tickAmount)),this._drawXYLines({xCount:i,tickAmount:a})):(i=a,a=t.globals.xTickAmount,this._drawInvertedXYLines({xCount:i,tickAmount:a})),this.drawGridBands(i,a),{el:this.elg,elGridBorders:this.elGridBorders,xAxisTickWidth:t.globals.gridWidth/i}}},{key:\"drawGridBands\",value:function(t,e){var i=this.w;if(void 0!==i.config.grid.row.colors&&i.config.grid.row.colors.length>0)for(var a=0,s=i.globals.gridHeight/e,r=i.globals.gridWidth,o=0,n=0;o<e;o++,n++)n>=i.config.grid.row.colors.length&&(n=0),this._drawGridBandRect({c:n,x1:0,y1:a,x2:r,y2:s,type:\"row\"}),a+=i.globals.gridHeight/e;if(void 0!==i.config.grid.column.colors&&i.config.grid.column.colors.length>0)for(var l=i.globals.isBarHorizontal||\"category\"!==i.config.xaxis.type&&!i.config.xaxis.convertedCatToNumeric?t:t-1,h=i.globals.padHorizontal,c=i.globals.padHorizontal+i.globals.gridWidth/l,d=i.globals.gridHeight,g=0,u=0;g<t;g++,u++)u>=i.config.grid.column.colors.length&&(u=0),this._drawGridBandRect({c:u,x1:h,y1:0,x2:c,y2:d,type:\"column\"}),h+=i.globals.gridWidth/l}}]),t}(),_=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:\"niceScale\",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:10,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,s=arguments.length>4?arguments[4]:void 0,r=this.w,o=Math.abs(e-t);if(\"dataPoints\"===(i=this._adjustTicksForSmallRange(i,a,o))&&(i=r.globals.dataPoints-1),t===Number.MIN_VALUE&&0===e||!x.isNumber(t)&&!x.isNumber(e)||t===Number.MIN_VALUE&&e===-Number.MAX_VALUE)return t=0,e=i,this.linearScale(t,e,i);t>e?(console.warn(\"axis.min cannot be greater than axis.max\"),e=t+.1):t===e&&(t=0===t?0:t-.5,e=0===e?2:e+.5);var n=[];o<1&&s&&(\"candlestick\"===r.config.chart.type||\"candlestick\"===r.config.series[a].type||\"boxPlot\"===r.config.chart.type||\"boxPlot\"===r.config.series[a].type||r.globals.isRangeData)&&(e*=1.01);var l=i+1;l<2?l=2:l>2&&(l-=2);var h=o/l,c=Math.floor(x.log10(h)),d=Math.pow(10,c),g=Math.round(h/d);g<1&&(g=1);var u=g*d,f=u*Math.floor(t/u),p=u*Math.ceil(e/u),b=f;if(s&&o>2){for(;n.push(b),!((b+=u)>p););return{result:n,niceMin:n[0],niceMax:n[n.length-1]}}var v=t;(n=[]).push(v);for(var m=Math.abs(e-t)/i,y=0;y<=i;y++)v+=m,n.push(v);return n[n.length-2]>=e&&n.pop(),{result:n,niceMin:n[0],niceMax:n[n.length-1]}}},{key:\"linearScale\",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:10,a=arguments.length>3?arguments[3]:void 0,s=Math.abs(e-t);\"dataPoints\"===(i=this._adjustTicksForSmallRange(i,a,s))&&(i=this.w.globals.dataPoints-1);var r=s/i;i===Number.MAX_VALUE&&(i=10,r=1);for(var o=[],n=t;i>=0;)o.push(n),n+=r,i-=1;return{result:o,niceMin:o[0],niceMax:o[o.length-1]}}},{key:\"logarithmicScaleNice\",value:function(t,e,i){e<=0&&(e=Math.max(t,i)),t<=0&&(t=Math.min(e,i));for(var a=[],s=Math.ceil(Math.log(e)/Math.log(i)+1),r=Math.floor(Math.log(t)/Math.log(i));r<s;r++)a.push(Math.pow(i,r));return{result:a,niceMin:a[0],niceMax:a[a.length-1]}}},{key:\"logarithmicScale\",value:function(t,e,i){e<=0&&(e=Math.max(t,i)),t<=0&&(t=Math.min(e,i));for(var a=[],s=Math.log(e)/Math.log(i),r=Math.log(t)/Math.log(i),o=s-r,n=Math.round(o),l=o/n,h=0,c=r;h<n;h++,c+=l)a.push(Math.pow(i,c));return a.push(Math.pow(i,s)),{result:a,niceMin:t,niceMax:e}}},{key:\"_adjustTicksForSmallRange\",value:function(t,e,i){var a=t;if(void 0!==e&&this.w.config.yaxis[e].labels.formatter&&void 0===this.w.config.yaxis[e].tickAmount){var s=Number(this.w.config.yaxis[e].labels.formatter(1));x.isNumber(s)&&0===this.w.globals.yValueDecimal&&(a=Math.ceil(i))}return a<t?a:t}},{key:\"setYScaleForIndex\",value:function(t,e,i){var a=this.w.globals,s=this.w.config,r=a.isBarHorizontal?s.xaxis:s.yaxis[t];void 0===a.yAxisScale[t]&&(a.yAxisScale[t]=[]);var o=Math.abs(i-e);if(r.logarithmic&&o<=5&&(a.invalidLogScale=!0),r.logarithmic&&o>5)a.allSeriesCollapsed=!1,a.yAxisScale[t]=this.logarithmicScale(e,i,r.logBase),a.yAxisScale[t]=r.forceNiceScale?this.logarithmicScaleNice(e,i,r.logBase):this.logarithmicScale(e,i,r.logBase);else if(i!==-Number.MAX_VALUE&&x.isNumber(i))if(a.allSeriesCollapsed=!1,void 0===r.min&&void 0===r.max||r.forceNiceScale){var n=void 0===s.yaxis[t].max&&void 0===s.yaxis[t].min||s.yaxis[t].forceNiceScale;a.yAxisScale[t]=this.niceScale(e,i,r.tickAmount?r.tickAmount:o<5&&o>1?o+1:5,t,n)}else a.yAxisScale[t]=this.linearScale(e,i,r.tickAmount,t);else a.yAxisScale[t]=this.linearScale(0,5,5)}},{key:\"setXScale\",value:function(t,e){var i=this.w,a=i.globals,s=i.config.xaxis,r=Math.abs(e-t);return e!==-Number.MAX_VALUE&&x.isNumber(e)?a.xAxisScale=this.linearScale(t,e,s.tickAmount?s.tickAmount:r<5&&r>1?r+1:5,0):a.xAxisScale=this.linearScale(0,5,5),a.xAxisScale}},{key:\"setMultipleYScales\",value:function(){var t=this,e=this.w.globals,i=this.w.config,a=e.minYArr.concat([]),s=e.maxYArr.concat([]),r=[];i.yaxis.forEach((function(e,o){var n=o;i.series.forEach((function(t,i){t.name===e.seriesName&&(n=i,o!==i?r.push({index:i,similarIndex:o,alreadyExists:!0}):r.push({index:i}))}));var l=a[n],h=s[n];t.setYScaleForIndex(o,l,h)})),this.sameScaleInMultipleAxes(a,s,r)}},{key:\"sameScaleInMultipleAxes\",value:function(t,e,i){var a=this,s=this.w.config,r=this.w.globals,o=[];i.forEach((function(t){t.alreadyExists&&(void 0===o[t.index]&&(o[t.index]=[]),o[t.index].push(t.index),o[t.index].push(t.similarIndex))})),r.yAxisSameScaleIndices=o,o.forEach((function(t,e){o.forEach((function(i,a){var s,r;e!==a&&(s=t,r=i,s.filter((function(t){return-1!==r.indexOf(t)}))).length>0&&(o[e]=o[e].concat(o[a]))}))}));var n=o.map((function(t){return t.filter((function(e,i){return t.indexOf(e)===i}))})).map((function(t){return t.sort()}));o=o.filter((function(t){return!!t}));var l=n.slice(),h=l.map((function(t){return JSON.stringify(t)}));l=l.filter((function(t,e){return h.indexOf(JSON.stringify(t))===e}));var c=[],d=[];t.forEach((function(t,i){l.forEach((function(a,s){a.indexOf(i)>-1&&(void 0===c[s]&&(c[s]=[],d[s]=[]),c[s].push({key:i,value:t}),d[s].push({key:i,value:e[i]}))}))}));var g=Array.apply(null,Array(l.length)).map(Number.prototype.valueOf,Number.MIN_VALUE),u=Array.apply(null,Array(l.length)).map(Number.prototype.valueOf,-Number.MAX_VALUE);c.forEach((function(t,e){t.forEach((function(t,i){g[e]=Math.min(t.value,g[e])}))})),d.forEach((function(t,e){t.forEach((function(t,i){u[e]=Math.max(t.value,u[e])}))})),t.forEach((function(t,e){d.forEach((function(t,i){var o=g[i],n=u[i];s.chart.stacked&&(n=0,t.forEach((function(t,e){t.value!==-Number.MAX_VALUE&&(n+=t.value),o!==Number.MIN_VALUE&&(o+=c[i][e].value)}))),t.forEach((function(i,l){t[l].key===e&&(void 0!==s.yaxis[e].min&&(o=\"function\"==typeof s.yaxis[e].min?s.yaxis[e].min(r.minY):s.yaxis[e].min),void 0!==s.yaxis[e].max&&(n=\"function\"==typeof s.yaxis[e].max?s.yaxis[e].max(r.maxY):s.yaxis[e].max),a.setYScaleForIndex(e,o,n))}))}))}))}},{key:\"autoScaleY\",value:function(t,e,i){t||(t=this);var a=t.w;if(a.globals.isMultipleYAxis||a.globals.collapsedSeries.length)return console.warn(\"autoScaleYaxis is not supported in a multi-yaxis chart.\"),e;var s=a.globals.seriesX[0],r=a.config.chart.stacked;return e.forEach((function(t,o){for(var n=0,l=0;l<s.length;l++)if(s[l]>=i.xaxis.min){n=l;break}var h,c,d=a.globals.minYArr[o],g=a.globals.maxYArr[o],u=a.globals.stackedSeriesTotals;a.globals.series.forEach((function(o,l){var f=o[n];r?(f=u[n],h=c=f,u.forEach((function(t,e){s[e]<=i.xaxis.max&&s[e]>=i.xaxis.min&&(t>c&&null!==t&&(c=t),o[e]<h&&null!==o[e]&&(h=o[e]))}))):(h=c=f,o.forEach((function(t,e){if(s[e]<=i.xaxis.max&&s[e]>=i.xaxis.min){var r=t,o=t;a.globals.series.forEach((function(i,a){null!==t&&(r=Math.min(i[e],r),o=Math.max(i[e],o))})),o>c&&null!==o&&(c=o),r<h&&null!==r&&(h=r)}}))),void 0===h&&void 0===c&&(h=d,c=g),c*=c<0?.9:1.1,0===(h*=h<0?1.1:.9)&&0===c&&(h=-1,c=1),c<0&&c<g&&(c=g),h<0&&h>d&&(h=d),e.length>1?(e[l].min=void 0===t.min?h:t.min,e[l].max=void 0===t.max?c:t.max):(e[0].min=void 0===t.min?h:t.min,e[0].max=void 0===t.max?c:t.max)}))})),e}}]),t}(),U=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.scales=new _(e)}return r(t,[{key:\"init\",value:function(){this.setYRange(),this.setXRange(),this.setZRange()}},{key:\"getMinYMaxY\",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.MAX_VALUE,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:-Number.MAX_VALUE,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,s=this.w.config,r=this.w.globals,o=-Number.MAX_VALUE,n=Number.MIN_VALUE;null===a&&(a=t+1);var l=r.series,h=l,c=l;\"candlestick\"===s.chart.type?(h=r.seriesCandleL,c=r.seriesCandleH):\"boxPlot\"===s.chart.type?(h=r.seriesCandleO,c=r.seriesCandleC):r.isRangeData&&(h=r.seriesRangeStart,c=r.seriesRangeEnd);for(var d=t;d<a;d++){r.dataPoints=Math.max(r.dataPoints,l[d].length),r.categoryLabels.length&&(r.dataPoints=r.categoryLabels.filter((function(t){return void 0!==t})).length);for(var g=0;g<r.series[d].length;g++){var u=l[d][g];null!==u&&x.isNumber(u)?(void 0!==c[d][g]&&(o=Math.max(o,c[d][g]),e=Math.min(e,c[d][g])),void 0!==h[d][g]&&(e=Math.min(e,h[d][g]),i=Math.max(i,h[d][g])),\"candlestick\"!==this.w.config.chart.type&&\"boxPlot\"!==this.w.config.chart.type&&\"rangeArea\"===this.w.config.chart.type&&\"rangeBar\"===this.w.config.chart.type||(\"candlestick\"!==this.w.config.chart.type&&\"boxPlot\"!==this.w.config.chart.type||void 0!==r.seriesCandleC[d][g]&&(o=Math.max(o,r.seriesCandleO[d][g]),o=Math.max(o,r.seriesCandleH[d][g]),o=Math.max(o,r.seriesCandleL[d][g]),o=Math.max(o,r.seriesCandleC[d][g]),\"boxPlot\"===this.w.config.chart.type&&(o=Math.max(o,r.seriesCandleM[d][g]))),!s.series[d].type||\"candlestick\"===s.series[d].type&&\"boxPlot\"===s.series[d].type&&\"rangeArea\"===s.series[d].type&&\"rangeBar\"===s.series[d].type||(o=Math.max(o,r.series[d][g]),e=Math.min(e,r.series[d][g])),i=o),r.seriesGoals[d]&&r.seriesGoals[d][g]&&Array.isArray(r.seriesGoals[d][g])&&r.seriesGoals[d][g].forEach((function(t){n!==Number.MIN_VALUE&&(n=Math.min(n,t.value),e=n),o=Math.max(o,t.value),i=o})),x.isFloat(u)&&(u=x.noExponents(u),r.yValueDecimal=Math.max(r.yValueDecimal,u.toString().split(\".\")[1].length)),n>h[d][g]&&h[d][g]<0&&(n=h[d][g])):r.hasNullValues=!0}}return\"rangeBar\"===s.chart.type&&r.seriesRangeStart.length&&r.isBarHorizontal&&(n=e),\"bar\"===s.chart.type&&(n<0&&o<0&&(o=0),n===Number.MIN_VALUE&&(n=0)),{minY:n,maxY:o,lowestY:e,highestY:i}}},{key:\"setYRange\",value:function(){var t=this.w.globals,e=this.w.config;t.maxY=-Number.MAX_VALUE,t.minY=Number.MIN_VALUE;var i=Number.MAX_VALUE;if(t.isMultipleYAxis)for(var a=0;a<t.series.length;a++){var s=this.getMinYMaxY(a,i,null,a+1);t.minYArr.push(s.minY),t.maxYArr.push(s.maxY),i=s.lowestY}var r=this.getMinYMaxY(0,i,null,t.series.length);if(t.minY=r.minY,t.maxY=r.maxY,i=r.lowestY,e.chart.stacked&&this._setStackedMinMax(),(\"line\"===e.chart.type||\"area\"===e.chart.type||\"candlestick\"===e.chart.type||\"boxPlot\"===e.chart.type||\"rangeBar\"===e.chart.type&&!t.isBarHorizontal)&&t.minY===Number.MIN_VALUE&&i!==-Number.MAX_VALUE&&i!==t.maxY){var o=t.maxY-i;(i>=0&&i<=10||void 0!==e.yaxis[0].min||void 0!==e.yaxis[0].max)&&(o=0),t.minY=i-5*o/100,i>0&&t.minY<0&&(t.minY=0),t.maxY=t.maxY+5*o/100}if(e.yaxis.forEach((function(e,i){void 0!==e.max&&(\"number\"==typeof e.max?t.maxYArr[i]=e.max:\"function\"==typeof e.max&&(t.maxYArr[i]=e.max(t.isMultipleYAxis?t.maxYArr[i]:t.maxY)),t.maxY=t.maxYArr[i]),void 0!==e.min&&(\"number\"==typeof e.min?t.minYArr[i]=e.min:\"function\"==typeof e.min&&(t.minYArr[i]=e.min(t.isMultipleYAxis?t.minYArr[i]===Number.MIN_VALUE?0:t.minYArr[i]:t.minY)),t.minY=t.minYArr[i])})),t.isBarHorizontal){[\"min\",\"max\"].forEach((function(i){void 0!==e.xaxis[i]&&\"number\"==typeof e.xaxis[i]&&(\"min\"===i?t.minY=e.xaxis[i]:t.maxY=e.xaxis[i])}))}return t.isMultipleYAxis?(this.scales.setMultipleYScales(),t.minY=i,t.yAxisScale.forEach((function(e,i){t.minYArr[i]=e.niceMin,t.maxYArr[i]=e.niceMax}))):(this.scales.setYScaleForIndex(0,t.minY,t.maxY),t.minY=t.yAxisScale[0].niceMin,t.maxY=t.yAxisScale[0].niceMax,t.minYArr[0]=t.yAxisScale[0].niceMin,t.maxYArr[0]=t.yAxisScale[0].niceMax),{minY:t.minY,maxY:t.maxY,minYArr:t.minYArr,maxYArr:t.maxYArr,yAxisScale:t.yAxisScale}}},{key:\"setXRange\",value:function(){var t=this.w.globals,e=this.w.config,i=\"numeric\"===e.xaxis.type||\"datetime\"===e.xaxis.type||\"category\"===e.xaxis.type&&!t.noLabelsProvided||t.noLabelsProvided||t.isXNumeric;if(t.isXNumeric&&function(){for(var e=0;e<t.series.length;e++)if(t.labels[e])for(var i=0;i<t.labels[e].length;i++)null!==t.labels[e][i]&&x.isNumber(t.labels[e][i])&&(t.maxX=Math.max(t.maxX,t.labels[e][i]),t.initialMaxX=Math.max(t.maxX,t.labels[e][i]),t.minX=Math.min(t.minX,t.labels[e][i]),t.initialMinX=Math.min(t.minX,t.labels[e][i]))}(),t.noLabelsProvided&&0===e.xaxis.categories.length&&(t.maxX=t.labels[t.labels.length-1],t.initialMaxX=t.labels[t.labels.length-1],t.minX=1,t.initialMinX=1),t.isXNumeric||t.noLabelsProvided||t.dataFormatXNumeric){var a;if(void 0===e.xaxis.tickAmount?(a=Math.round(t.svgWidth/150),\"numeric\"===e.xaxis.type&&t.dataPoints<30&&(a=t.dataPoints-1),a>t.dataPoints&&0!==t.dataPoints&&(a=t.dataPoints-1)):\"dataPoints\"===e.xaxis.tickAmount?(t.series.length>1&&(a=t.series[t.maxValsInArrayIndex].length-1),t.isXNumeric&&(a=t.maxX-t.minX-1)):a=e.xaxis.tickAmount,t.xTickAmount=a,void 0!==e.xaxis.max&&\"number\"==typeof e.xaxis.max&&(t.maxX=e.xaxis.max),void 0!==e.xaxis.min&&\"number\"==typeof e.xaxis.min&&(t.minX=e.xaxis.min),void 0!==e.xaxis.range&&(t.minX=t.maxX-e.xaxis.range),t.minX!==Number.MAX_VALUE&&t.maxX!==-Number.MAX_VALUE)if(e.xaxis.convertedCatToNumeric&&!t.dataFormatXNumeric){for(var s=[],r=t.minX-1;r<t.maxX;r++)s.push(r+1);t.xAxisScale={result:s,niceMin:s[0],niceMax:s[s.length-1]}}else t.xAxisScale=this.scales.setXScale(t.minX,t.maxX);else t.xAxisScale=this.scales.linearScale(1,a,a),t.noLabelsProvided&&t.labels.length>0&&(t.xAxisScale=this.scales.linearScale(1,t.labels.length,a-1),t.seriesX=t.labels.slice());i&&(t.labels=t.xAxisScale.result.slice())}return t.isBarHorizontal&&t.labels.length&&(t.xTickAmount=t.labels.length),this._handleSingleDataPoint(),this._getMinXDiff(),{minX:t.minX,maxX:t.maxX}}},{key:\"setZRange\",value:function(){var t=this.w.globals;if(t.isDataXYZ)for(var e=0;e<t.series.length;e++)if(void 0!==t.seriesZ[e])for(var i=0;i<t.seriesZ[e].length;i++)null!==t.seriesZ[e][i]&&x.isNumber(t.seriesZ[e][i])&&(t.maxZ=Math.max(t.maxZ,t.seriesZ[e][i]),t.minZ=Math.min(t.minZ,t.seriesZ[e][i]))}},{key:\"_handleSingleDataPoint\",value:function(){var t=this.w.globals,e=this.w.config;if(t.minX===t.maxX){var i=new I(this.ctx);if(\"datetime\"===e.xaxis.type){var a=i.getDate(t.minX);e.xaxis.labels.datetimeUTC?a.setUTCDate(a.getUTCDate()-2):a.setDate(a.getDate()-2),t.minX=new Date(a).getTime();var s=i.getDate(t.maxX);e.xaxis.labels.datetimeUTC?s.setUTCDate(s.getUTCDate()+2):s.setDate(s.getDate()+2),t.maxX=new Date(s).getTime()}else(\"numeric\"===e.xaxis.type||\"category\"===e.xaxis.type&&!t.noLabelsProvided)&&(t.minX=t.minX-2,t.initialMinX=t.minX,t.maxX=t.maxX+2,t.initialMaxX=t.maxX)}}},{key:\"_getMinXDiff\",value:function(){var t=this.w.globals;t.isXNumeric&&t.seriesX.forEach((function(e,i){1===e.length&&e.push(t.seriesX[t.maxValsInArrayIndex][t.seriesX[t.maxValsInArrayIndex].length-1]);var a=e.slice();a.sort((function(t,e){return t-e})),a.forEach((function(e,i){if(i>0){var s=e-a[i-1];s>0&&(t.minXDiff=Math.min(s,t.minXDiff))}})),1!==t.dataPoints&&t.minXDiff!==Number.MAX_VALUE||(t.minXDiff=.5)}))}},{key:\"_setStackedMinMax\",value:function(){var t=this.w.globals,e=[],i=[];if(t.series.length)for(var a=0;a<t.series[t.maxValsInArrayIndex].length;a++)for(var s=0,r=0,o=0;o<t.series.length;o++)null!==t.series[o][a]&&x.isNumber(t.series[o][a])&&(t.series[o][a]>0?s=s+parseFloat(t.series[o][a])+1e-4:r+=parseFloat(t.series[o][a])),o===t.series.length-1&&(e.push(s),i.push(r));for(var n=0;n<e.length;n++)t.maxY=Math.max(t.maxY,e[n]),t.minY=Math.min(t.minY,i[n])}}]),t}(),q=function(){function t(e,i){a(this,t),this.ctx=e,this.elgrid=i,this.w=e.w;var s=this.w;this.xaxisFontSize=s.config.xaxis.labels.style.fontSize,this.axisFontFamily=s.config.xaxis.labels.style.fontFamily,this.xaxisForeColors=s.config.xaxis.labels.style.colors,this.isCategoryBarHorizontal=\"bar\"===s.config.chart.type&&s.config.plotOptions.bar.horizontal,this.xAxisoffX=0,\"bottom\"===s.config.xaxis.position&&(this.xAxisoffX=s.globals.gridHeight),this.drawnLabels=[],this.axesUtils=new B(e)}return r(t,[{key:\"drawYaxis\",value:function(t){var e=this,i=this.w,a=new m(this.ctx),s=i.config.yaxis[t].labels.style,r=s.fontSize,o=s.fontFamily,n=s.fontWeight,l=a.group({class:\"apexcharts-yaxis\",rel:t,transform:\"translate(\"+i.globals.translateYAxisX[t]+\", 0)\"});if(this.axesUtils.isYAxisHidden(t))return l;var h=a.group({class:\"apexcharts-yaxis-texts-g\"});l.add(h);var c=i.globals.yAxisScale[t].result.length-1,d=i.globals.gridHeight/c,g=i.globals.translateY,u=i.globals.yLabelFormatters[t],f=i.globals.yAxisScale[t].result.slice();f=this.axesUtils.checkForReversedLabels(t,f);var p=\"\";if(i.config.yaxis[t].labels.show)for(var x=function(l){var x=f[l];x=u(x,l,i);var b=i.config.yaxis[t].labels.padding;i.config.yaxis[t].opposite&&0!==i.config.yaxis.length&&(b*=-1);var v=\"end\";i.config.yaxis[t].opposite&&(v=\"start\"),\"left\"===i.config.yaxis[t].labels.align?v=\"start\":\"center\"===i.config.yaxis[t].labels.align?v=\"middle\":\"right\"===i.config.yaxis[t].labels.align&&(v=\"end\");var m=e.axesUtils.getYAxisForeColor(s.colors,t),y=a.drawText({x:b,y:g+c/10+i.config.yaxis[t].labels.offsetY+1,text:x,textAnchor:v,fontSize:r,fontFamily:o,fontWeight:n,maxWidth:i.config.yaxis[t].labels.maxWidth,foreColor:Array.isArray(m)?m[l]:m,isPlainText:!1,cssClass:\"apexcharts-yaxis-label \"+s.cssClass});l===c&&(p=y),h.add(y);var w=document.createElementNS(i.globals.SVGNS,\"title\");if(w.textContent=Array.isArray(x)?x.join(\" \"):x,y.node.appendChild(w),0!==i.config.yaxis[t].labels.rotate){var k=a.rotateAroundCenter(p.node),A=a.rotateAroundCenter(y.node);y.node.setAttribute(\"transform\",\"rotate(\".concat(i.config.yaxis[t].labels.rotate,\" \").concat(k.x,\" \").concat(A.y,\")\"))}g+=d},b=c;b>=0;b--)x(b);if(void 0!==i.config.yaxis[t].title.text){var v=a.group({class:\"apexcharts-yaxis-title\"}),y=0;i.config.yaxis[t].opposite&&(y=i.globals.translateYAxisX[t]);var w=a.drawText({x:y,y:i.globals.gridHeight/2+i.globals.translateY+i.config.yaxis[t].title.offsetY,text:i.config.yaxis[t].title.text,textAnchor:\"end\",foreColor:i.config.yaxis[t].title.style.color,fontSize:i.config.yaxis[t].title.style.fontSize,fontWeight:i.config.yaxis[t].title.style.fontWeight,fontFamily:i.config.yaxis[t].title.style.fontFamily,cssClass:\"apexcharts-yaxis-title-text \"+i.config.yaxis[t].title.style.cssClass});v.add(w),l.add(v)}var k=i.config.yaxis[t].axisBorder,A=31+k.offsetX;if(i.config.yaxis[t].opposite&&(A=-31-k.offsetX),k.show){var S=a.drawLine(A,i.globals.translateY+k.offsetY-2,A,i.globals.gridHeight+i.globals.translateY+k.offsetY+2,k.color,0,k.width);l.add(S)}return i.config.yaxis[t].axisTicks.show&&this.axesUtils.drawYAxisTicks(A,c,k,i.config.yaxis[t].axisTicks,t,d,l),l}},{key:\"drawYaxisInversed\",value:function(t){var e=this.w,i=new m(this.ctx),a=i.group({class:\"apexcharts-xaxis apexcharts-yaxis-inversed\"}),s=i.group({class:\"apexcharts-xaxis-texts-g\",transform:\"translate(\".concat(e.globals.translateXAxisX,\", \").concat(e.globals.translateXAxisY,\")\")});a.add(s);var r=e.globals.yAxisScale[t].result.length-1,o=e.globals.gridWidth/r+.1,n=o+e.config.xaxis.labels.offsetX,l=e.globals.xLabelFormatter,h=e.globals.yAxisScale[t].result.slice(),c=e.globals.timescaleLabels;c.length>0&&(this.xaxisLabels=c.slice(),r=(h=c.slice()).length),h=this.axesUtils.checkForReversedLabels(t,h);var d=c.length;if(e.config.xaxis.labels.show)for(var g=d?0:r;d?g<d:g>=0;d?g++:g--){var u=h[g];u=l(u,g,e);var f=e.globals.gridWidth+e.globals.padHorizontal-(n-o+e.config.xaxis.labels.offsetX);if(c.length){var p=this.axesUtils.getLabel(h,c,f,g,this.drawnLabels,this.xaxisFontSize);f=p.x,u=p.text,this.drawnLabels.push(p.text),0===g&&e.globals.skipFirstTimelinelabel&&(u=\"\"),g===h.length-1&&e.globals.skipLastTimelinelabel&&(u=\"\")}var x=i.drawText({x:f,y:this.xAxisoffX+e.config.xaxis.labels.offsetY+30-(\"top\"===e.config.xaxis.position?e.globals.xAxisHeight+e.config.xaxis.axisTicks.height-2:0),text:u,textAnchor:\"middle\",foreColor:Array.isArray(this.xaxisForeColors)?this.xaxisForeColors[t]:this.xaxisForeColors,fontSize:this.xaxisFontSize,fontFamily:this.xaxisFontFamily,fontWeight:e.config.xaxis.labels.style.fontWeight,isPlainText:!1,cssClass:\"apexcharts-xaxis-label \"+e.config.xaxis.labels.style.cssClass});s.add(x),x.tspan(u);var b=document.createElementNS(e.globals.SVGNS,\"title\");b.textContent=u,x.node.appendChild(b),n+=o}return this.inversedYAxisTitleText(a),this.inversedYAxisBorder(a),a}},{key:\"inversedYAxisBorder\",value:function(t){var e=this.w,i=new m(this.ctx),a=e.config.xaxis.axisBorder;if(a.show){var s=0;\"bar\"===e.config.chart.type&&e.globals.isXNumeric&&(s-=15);var r=i.drawLine(e.globals.padHorizontal+s+a.offsetX,this.xAxisoffX,e.globals.gridWidth,this.xAxisoffX,a.color,0,a.height);this.elgrid&&this.elgrid.elGridBorders?this.elgrid.elGridBorders.add(r):t.add(r)}}},{key:\"inversedYAxisTitleText\",value:function(t){var e=this.w,i=new m(this.ctx);if(void 0!==e.config.xaxis.title.text){var a=i.group({class:\"apexcharts-xaxis-title apexcharts-yaxis-title-inversed\"}),s=i.drawText({x:e.globals.gridWidth/2+e.config.xaxis.title.offsetX,y:this.xAxisoffX+parseFloat(this.xaxisFontSize)+parseFloat(e.config.xaxis.title.style.fontSize)+e.config.xaxis.title.offsetY+20,text:e.config.xaxis.title.text,textAnchor:\"middle\",fontSize:e.config.xaxis.title.style.fontSize,fontFamily:e.config.xaxis.title.style.fontFamily,fontWeight:e.config.xaxis.title.style.fontWeight,foreColor:e.config.xaxis.title.style.color,cssClass:\"apexcharts-xaxis-title-text \"+e.config.xaxis.title.style.cssClass});a.add(s),t.add(a)}}},{key:\"yAxisTitleRotate\",value:function(t,e){var i=this.w,a=new m(this.ctx),s={width:0,height:0},r={width:0,height:0},o=i.globals.dom.baseEl.querySelector(\" .apexcharts-yaxis[rel='\".concat(t,\"'] .apexcharts-yaxis-texts-g\"));null!==o&&(s=o.getBoundingClientRect());var n=i.globals.dom.baseEl.querySelector(\".apexcharts-yaxis[rel='\".concat(t,\"'] .apexcharts-yaxis-title text\"));if(null!==n&&(r=n.getBoundingClientRect()),null!==n){var l=this.xPaddingForYAxisTitle(t,s,r,e);n.setAttribute(\"x\",l.xPos-(e?10:0))}if(null!==n){var h=a.rotateAroundCenter(n);n.setAttribute(\"transform\",\"rotate(\".concat(e?-1*i.config.yaxis[t].title.rotate:i.config.yaxis[t].title.rotate,\" \").concat(h.x,\" \").concat(h.y,\")\"))}}},{key:\"xPaddingForYAxisTitle\",value:function(t,e,i,a){var s=this.w,r=0,o=0,n=10;return void 0===s.config.yaxis[t].title.text||t<0?{xPos:o,padd:0}:(a?(o=e.width+s.config.yaxis[t].title.offsetX+i.width/2+n/2,0===(r+=1)&&(o-=n/2)):(o=-1*e.width+s.config.yaxis[t].title.offsetX+n/2+i.width/2,s.globals.isBarHorizontal&&(n=25,o=-1*e.width-s.config.yaxis[t].title.offsetX-n)),{xPos:o,padd:n})}},{key:\"setYAxisXPosition\",value:function(t,e){var i=this.w,a=0,s=0,r=18,o=1;i.config.yaxis.length>1&&(this.multipleYs=!0),i.config.yaxis.map((function(n,l){var h=i.globals.ignoreYAxisIndexes.indexOf(l)>-1||!n.show||n.floating||0===t[l].width,c=t[l].width+e[l].width;n.opposite?i.globals.isBarHorizontal?(s=i.globals.gridWidth+i.globals.translateX-1,i.globals.translateYAxisX[l]=s-n.labels.offsetX):(s=i.globals.gridWidth+i.globals.translateX+o,h||(o=o+c+20),i.globals.translateYAxisX[l]=s-n.labels.offsetX+20):(a=i.globals.translateX-r,h||(r=r+c+20),i.globals.translateYAxisX[l]=a+n.labels.offsetX)}))}},{key:\"setYAxisTextAlignments\",value:function(){var t=this.w,e=t.globals.dom.baseEl.getElementsByClassName(\"apexcharts-yaxis\");(e=x.listToArray(e)).forEach((function(e,i){var a=t.config.yaxis[i];if(a&&!a.floating&&void 0!==a.labels.align){var s=t.globals.dom.baseEl.querySelector(\".apexcharts-yaxis[rel='\".concat(i,\"'] .apexcharts-yaxis-texts-g\")),r=t.globals.dom.baseEl.querySelectorAll(\".apexcharts-yaxis[rel='\".concat(i,\"'] .apexcharts-yaxis-label\"));r=x.listToArray(r);var o=s.getBoundingClientRect();\"left\"===a.labels.align?(r.forEach((function(t,e){t.setAttribute(\"text-anchor\",\"start\")})),a.opposite||s.setAttribute(\"transform\",\"translate(-\".concat(o.width,\", 0)\"))):\"center\"===a.labels.align?(r.forEach((function(t,e){t.setAttribute(\"text-anchor\",\"middle\")})),s.setAttribute(\"transform\",\"translate(\".concat(o.width/2*(a.opposite?1:-1),\", 0)\"))):\"right\"===a.labels.align&&(r.forEach((function(t,e){t.setAttribute(\"text-anchor\",\"end\")})),a.opposite&&s.setAttribute(\"transform\",\"translate(\".concat(o.width,\", 0)\")))}}))}}]),t}(),Z=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.documentEvent=x.bind(this.documentEvent,this)}return r(t,[{key:\"addEventListener\",value:function(t,e){var i=this.w;i.globals.events.hasOwnProperty(t)?i.globals.events[t].push(e):i.globals.events[t]=[e]}},{key:\"removeEventListener\",value:function(t,e){var i=this.w;if(i.globals.events.hasOwnProperty(t)){var a=i.globals.events[t].indexOf(e);-1!==a&&i.globals.events[t].splice(a,1)}}},{key:\"fireEvent\",value:function(t,e){var i=this.w;if(i.globals.events.hasOwnProperty(t)){e&&e.length||(e=[]);for(var a=i.globals.events[t],s=a.length,r=0;r<s;r++)a[r].apply(null,e)}}},{key:\"setupEventHandlers\",value:function(){var t=this,e=this.w,i=this.ctx,a=e.globals.dom.baseEl.querySelector(e.globals.chartClass);this.ctx.eventList.forEach((function(t){a.addEventListener(t,(function(t){var a=Object.assign({},e,{seriesIndex:e.globals.capturedSeriesIndex,dataPointIndex:e.globals.capturedDataPointIndex});\"mousemove\"===t.type||\"touchmove\"===t.type?\"function\"==typeof e.config.chart.events.mouseMove&&e.config.chart.events.mouseMove(t,i,a):\"mouseleave\"===t.type||\"touchleave\"===t.type?\"function\"==typeof e.config.chart.events.mouseLeave&&e.config.chart.events.mouseLeave(t,i,a):(\"mouseup\"===t.type&&1===t.which||\"touchend\"===t.type)&&(\"function\"==typeof e.config.chart.events.click&&e.config.chart.events.click(t,i,a),i.ctx.events.fireEvent(\"click\",[t,i,a]))}),{capture:!1,passive:!0})})),this.ctx.eventList.forEach((function(i){e.globals.dom.baseEl.addEventListener(i,t.documentEvent,{passive:!0})})),this.ctx.core.setupBrushHandler()}},{key:\"documentEvent\",value:function(t){var e=this.w,i=t.target.className;if(\"click\"===t.type){var a=e.globals.dom.baseEl.querySelector(\".apexcharts-menu\");a&&a.classList.contains(\"apexcharts-menu-open\")&&\"apexcharts-menu-icon\"!==i&&a.classList.remove(\"apexcharts-menu-open\")}e.globals.clientX=\"touchmove\"===t.type?t.touches[0].clientX:t.clientX,e.globals.clientY=\"touchmove\"===t.type?t.touches[0].clientY:t.clientY}}]),t}(),$=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:\"setCurrentLocaleValues\",value:function(t){var e=this.w.config.chart.locales;window.Apex.chart&&window.Apex.chart.locales&&window.Apex.chart.locales.length>0&&(e=this.w.config.chart.locales.concat(window.Apex.chart.locales));var i=e.filter((function(e){return e.name===t}))[0];if(!i)throw new Error(\"Wrong locale name provided. Please make sure you set the correct locale name in options\");var a=x.extend(C,i);this.w.globals.locale=a.options}}]),t}(),J=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:\"drawAxis\",value:function(t,e){var i,a,s=this,r=this.w.globals,o=this.w.config,n=new V(this.ctx,e),l=new q(this.ctx,e);r.axisCharts&&\"radar\"!==t&&(r.isBarHorizontal?(a=l.drawYaxisInversed(0),i=n.drawXaxisInversed(0),r.dom.elGraphical.add(i),r.dom.elGraphical.add(a)):(i=n.drawXaxis(),r.dom.elGraphical.add(i),o.yaxis.map((function(t,e){if(-1===r.ignoreYAxisIndexes.indexOf(e)&&(a=l.drawYaxis(e),r.dom.Paper.add(a),\"back\"===s.w.config.grid.position)){var i=r.dom.Paper.children()[1];i.remove(),r.dom.Paper.add(i)}}))))}}]),t}(),Q=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:\"drawXCrosshairs\",value:function(){var t=this.w,e=new m(this.ctx),i=new v(this.ctx),a=t.config.xaxis.crosshairs.fill.gradient,s=t.config.xaxis.crosshairs.dropShadow,r=t.config.xaxis.crosshairs.fill.type,o=a.colorFrom,n=a.colorTo,l=a.opacityFrom,h=a.opacityTo,c=a.stops,d=s.enabled,g=s.left,u=s.top,f=s.blur,p=s.color,b=s.opacity,y=t.config.xaxis.crosshairs.fill.color;if(t.config.xaxis.crosshairs.show){\"gradient\"===r&&(y=e.drawGradient(\"vertical\",o,n,l,h,null,c,null));var w=e.drawRect();1===t.config.xaxis.crosshairs.width&&(w=e.drawLine());var k=t.globals.gridHeight;(!x.isNumber(k)||k<0)&&(k=0);var A=t.config.xaxis.crosshairs.width;(!x.isNumber(A)||A<0)&&(A=0),w.attr({class:\"apexcharts-xcrosshairs\",x:0,y:0,y2:k,width:A,height:k,fill:y,filter:\"none\",\"fill-opacity\":t.config.xaxis.crosshairs.opacity,stroke:t.config.xaxis.crosshairs.stroke.color,\"stroke-width\":t.config.xaxis.crosshairs.stroke.width,\"stroke-dasharray\":t.config.xaxis.crosshairs.stroke.dashArray}),d&&(w=i.dropShadow(w,{left:g,top:u,blur:f,color:p,opacity:b})),t.globals.dom.elGraphical.add(w)}}},{key:\"drawYCrosshairs\",value:function(){var t=this.w,e=new m(this.ctx),i=t.config.yaxis[0].crosshairs,a=t.globals.barPadForNumericAxis;if(t.config.yaxis[0].crosshairs.show){var s=e.drawLine(-a,0,t.globals.gridWidth+a,0,i.stroke.color,i.stroke.dashArray,i.stroke.width);s.attr({class:\"apexcharts-ycrosshairs\"}),t.globals.dom.elGraphical.add(s)}var r=e.drawLine(-a,0,t.globals.gridWidth+a,0,i.stroke.color,0,0);r.attr({class:\"apexcharts-ycrosshairs-hidden\"}),t.globals.dom.elGraphical.add(r)}}]),t}(),K=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:\"checkResponsiveConfig\",value:function(t){var e=this,i=this.w,a=i.config;if(0!==a.responsive.length){var s=a.responsive.slice();s.sort((function(t,e){return t.breakpoint>e.breakpoint?1:e.breakpoint>t.breakpoint?-1:0})).reverse();var r=new E({}),o=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},a=s[0].breakpoint,o=window.innerWidth>0?window.innerWidth:screen.width;if(o>a){var n=y.extendArrayProps(r,i.globals.initialConfig,i);t=x.extend(n,t),t=x.extend(i.config,t),e.overrideResponsiveOptions(t)}else for(var l=0;l<s.length;l++)o<s[l].breakpoint&&(t=y.extendArrayProps(r,s[l].options,i),t=x.extend(i.config,t),e.overrideResponsiveOptions(t))};if(t){var n=y.extendArrayProps(r,t,i);n=x.extend(i.config,n),o(n=x.extend(n,t))}else o({})}}},{key:\"overrideResponsiveOptions\",value:function(t){var e=new E(t).init({responsiveOverride:!0});this.w.config=e}}]),t}(),tt=function(){function t(e){a(this,t),this.ctx=e,this.colors=[],this.w=e.w;var i=this.w;this.isColorFn=!1,this.isHeatmapDistributed=\"treemap\"===i.config.chart.type&&i.config.plotOptions.treemap.distributed||\"heatmap\"===i.config.chart.type&&i.config.plotOptions.heatmap.distributed,this.isBarDistributed=i.config.plotOptions.bar.distributed&&(\"bar\"===i.config.chart.type||\"rangeBar\"===i.config.chart.type)}return r(t,[{key:\"init\",value:function(){this.setDefaultColors()}},{key:\"setDefaultColors\",value:function(){var t=this,e=this.w,i=new x;if(e.globals.dom.elWrap.classList.add(\"apexcharts-theme-\".concat(e.config.theme.mode)),void 0===e.config.colors?e.globals.colors=this.predefined():(e.globals.colors=e.config.colors,Array.isArray(e.config.colors)&&e.config.colors.length>0&&\"function\"==typeof e.config.colors[0]&&(e.globals.colors=e.config.series.map((function(i,a){var s=e.config.colors[a];return s||(s=e.config.colors[0]),\"function\"==typeof s?(t.isColorFn=!0,s({value:e.globals.axisCharts?e.globals.series[a][0]?e.globals.series[a][0]:0:e.globals.series[a],seriesIndex:a,dataPointIndex:a,w:e})):s})))),e.globals.seriesColors.map((function(t,i){t&&(e.globals.colors[i]=t)})),e.config.theme.monochrome.enabled){var a=[],s=e.globals.series.length;(this.isBarDistributed||this.isHeatmapDistributed)&&(s=e.globals.series[0].length*e.globals.series.length);for(var r=e.config.theme.monochrome.color,o=1/(s/e.config.theme.monochrome.shadeIntensity),n=e.config.theme.monochrome.shadeTo,l=0,h=0;h<s;h++){var c=void 0;\"dark\"===n?(c=i.shadeColor(-1*l,r),l+=o):(c=i.shadeColor(l,r),l+=o),a.push(c)}e.globals.colors=a.slice()}var d=e.globals.colors.slice();this.pushExtraColors(e.globals.colors);[\"fill\",\"stroke\"].forEach((function(i){void 0===e.config[i].colors?e.globals[i].colors=t.isColorFn?e.config.colors:d:e.globals[i].colors=e.config[i].colors.slice(),t.pushExtraColors(e.globals[i].colors)})),void 0===e.config.dataLabels.style.colors?e.globals.dataLabels.style.colors=d:e.globals.dataLabels.style.colors=e.config.dataLabels.style.colors.slice(),this.pushExtraColors(e.globals.dataLabels.style.colors,50),void 0===e.config.plotOptions.radar.polygons.fill.colors?e.globals.radarPolygons.fill.colors=[\"dark\"===e.config.theme.mode?\"#424242\":\"none\"]:e.globals.radarPolygons.fill.colors=e.config.plotOptions.radar.polygons.fill.colors.slice(),this.pushExtraColors(e.globals.radarPolygons.fill.colors,20),void 0===e.config.markers.colors?e.globals.markers.colors=d:e.globals.markers.colors=e.config.markers.colors.slice(),this.pushExtraColors(e.globals.markers.colors)}},{key:\"pushExtraColors\",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,a=this.w,s=e||a.globals.series.length;if(null===i&&(i=this.isBarDistributed||this.isHeatmapDistributed||\"heatmap\"===a.config.chart.type&&a.config.plotOptions.heatmap.colorScale.inverse),i&&a.globals.series.length&&(s=a.globals.series[a.globals.maxValsInArrayIndex].length*a.globals.series.length),t.length<s)for(var r=s-t.length,o=0;o<r;o++)t.push(t[o])}},{key:\"updateThemeOptions\",value:function(t){t.chart=t.chart||{},t.tooltip=t.tooltip||{};var e=t.theme.mode||\"light\",i=t.theme.palette?t.theme.palette:\"dark\"===e?\"palette4\":\"palette1\",a=t.chart.foreColor?t.chart.foreColor:\"dark\"===e?\"#f6f7f8\":\"#373d3f\";return t.tooltip.theme=e,t.chart.foreColor=a,t.theme.palette=i,t}},{key:\"predefined\",value:function(){switch(this.w.config.theme.palette){case\"palette1\":default:this.colors=[\"#008FFB\",\"#00E396\",\"#FEB019\",\"#FF4560\",\"#775DD0\"];break;case\"palette2\":this.colors=[\"#3f51b5\",\"#03a9f4\",\"#4caf50\",\"#f9ce1d\",\"#FF9800\"];break;case\"palette3\":this.colors=[\"#33b2df\",\"#546E7A\",\"#d4526e\",\"#13d8aa\",\"#A5978B\"];break;case\"palette4\":this.colors=[\"#4ecdc4\",\"#c7f464\",\"#81D4FA\",\"#fd6a6a\",\"#546E7A\"];break;case\"palette5\":this.colors=[\"#2b908f\",\"#f9a3a4\",\"#90ee7e\",\"#fa4443\",\"#69d2e7\"];break;case\"palette6\":this.colors=[\"#449DD1\",\"#F86624\",\"#EA3546\",\"#662E9B\",\"#C5D86D\"];break;case\"palette7\":this.colors=[\"#D7263D\",\"#1B998B\",\"#2E294E\",\"#F46036\",\"#E2C044\"];break;case\"palette8\":this.colors=[\"#662E9B\",\"#F86624\",\"#F9C80E\",\"#EA3546\",\"#43BCCD\"];break;case\"palette9\":this.colors=[\"#5C4742\",\"#A5978B\",\"#8D5B4C\",\"#5A2A27\",\"#C4BBAF\"];break;case\"palette10\":this.colors=[\"#A300D6\",\"#7D02EB\",\"#5653FE\",\"#2983FF\",\"#00B1F2\"]}return this.colors}}]),t}(),et=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:\"draw\",value:function(){this.drawTitleSubtitle(\"title\"),this.drawTitleSubtitle(\"subtitle\")}},{key:\"drawTitleSubtitle\",value:function(t){var e=this.w,i=\"title\"===t?e.config.title:e.config.subtitle,a=e.globals.svgWidth/2,s=i.offsetY,r=\"middle\";if(\"left\"===i.align?(a=10,r=\"start\"):\"right\"===i.align&&(a=e.globals.svgWidth-10,r=\"end\"),a+=i.offsetX,s=s+parseInt(i.style.fontSize,10)+i.margin/2,void 0!==i.text){var o=new m(this.ctx).drawText({x:a,y:s,text:i.text,textAnchor:r,fontSize:i.style.fontSize,fontFamily:i.style.fontFamily,fontWeight:i.style.fontWeight,foreColor:i.style.color,opacity:1});o.node.setAttribute(\"class\",\"apexcharts-\".concat(t,\"-text\")),e.globals.dom.Paper.add(o)}}}]),t}(),it=function(){function t(e){a(this,t),this.w=e.w,this.dCtx=e}return r(t,[{key:\"getTitleSubtitleCoords\",value:function(t){var e=this.w,i=0,a=0,s=\"title\"===t?e.config.title.floating:e.config.subtitle.floating,r=e.globals.dom.baseEl.querySelector(\".apexcharts-\".concat(t,\"-text\"));if(null!==r&&!s){var o=r.getBoundingClientRect();i=o.width,a=e.globals.axisCharts?o.height+5:o.height}return{width:i,height:a}}},{key:\"getLegendsRect\",value:function(){var t=this.w,e=t.globals.dom.baseEl.querySelector(\".apexcharts-legend\");t.config.legend.height||\"top\"!==t.config.legend.position&&\"bottom\"!==t.config.legend.position||(e.style.maxHeight=t.globals.svgHeight/2+\"px\");var i=Object.assign({},x.getBoundingClientRect(e));return null!==e&&!t.config.legend.floating&&t.config.legend.show?this.dCtx.lgRect={x:i.x,y:i.y,height:i.height,width:0===i.height?0:i.width}:this.dCtx.lgRect={x:0,y:0,height:0,width:0},\"left\"!==t.config.legend.position&&\"right\"!==t.config.legend.position||1.5*this.dCtx.lgRect.width>t.globals.svgWidth&&(this.dCtx.lgRect.width=t.globals.svgWidth/1.5),this.dCtx.lgRect}},{key:\"getLargestStringFromMultiArr\",value:function(t,e){var i=t;if(this.w.globals.isMultiLineX){var a=e.map((function(t,e){return Array.isArray(t)?t.length:1})),s=Math.max.apply(Math,u(a));i=e[a.indexOf(s)]}return i}}]),t}(),at=function(){function t(e){a(this,t),this.w=e.w,this.dCtx=e}return r(t,[{key:\"getxAxisLabelsCoords\",value:function(){var t,e=this.w,i=e.globals.labels.slice();if(e.config.xaxis.convertedCatToNumeric&&0===i.length&&(i=e.globals.categoryLabels),e.globals.timescaleLabels.length>0){var a=this.getxAxisTimeScaleLabelsCoords();t={width:a.width,height:a.height},e.globals.rotateXLabels=!1}else{this.dCtx.lgWidthForSideLegends=\"left\"!==e.config.legend.position&&\"right\"!==e.config.legend.position||e.config.legend.floating?0:this.dCtx.lgRect.width;var s=e.globals.xLabelFormatter,r=x.getLargestStringFromArr(i),o=this.dCtx.dimHelpers.getLargestStringFromMultiArr(r,i);e.globals.isBarHorizontal&&(o=r=e.globals.yAxisScale[0].result.reduce((function(t,e){return t.length>e.length?t:e}),0));var n=new T(this.dCtx.ctx),l=r;r=n.xLabelFormat(s,r,l,{i:void 0,dateFormatter:new I(this.dCtx.ctx).formatDate,w:e}),o=n.xLabelFormat(s,o,l,{i:void 0,dateFormatter:new I(this.dCtx.ctx).formatDate,w:e}),(e.config.xaxis.convertedCatToNumeric&&void 0===r||\"\"===String(r).trim())&&(o=r=\"1\");var h=new m(this.dCtx.ctx),c=h.getTextRects(r,e.config.xaxis.labels.style.fontSize),d=c;if(r!==o&&(d=h.getTextRects(o,e.config.xaxis.labels.style.fontSize)),(t={width:c.width>=d.width?c.width:d.width,height:c.height>=d.height?c.height:d.height}).width*i.length>e.globals.svgWidth-this.dCtx.lgWidthForSideLegends-this.dCtx.yAxisWidth-this.dCtx.gridPad.left-this.dCtx.gridPad.right&&0!==e.config.xaxis.labels.rotate||e.config.xaxis.labels.rotateAlways){if(!e.globals.isBarHorizontal){e.globals.rotateXLabels=!0;var g=function(t){return h.getTextRects(t,e.config.xaxis.labels.style.fontSize,e.config.xaxis.labels.style.fontFamily,\"rotate(\".concat(e.config.xaxis.labels.rotate,\" 0 0)\"),!1)};c=g(r),r!==o&&(d=g(o)),t.height=(c.height>d.height?c.height:d.height)/1.5,t.width=c.width>d.width?c.width:d.width}}else e.globals.rotateXLabels=!1}return e.config.xaxis.labels.show||(t={width:0,height:0}),{width:t.width,height:t.height}}},{key:\"getxAxisGroupLabelsCoords\",value:function(){var t,e=this.w;if(!e.globals.hasGroups)return{width:0,height:0};var i,a=(null===(t=e.config.xaxis.group.style)||void 0===t?void 0:t.fontSize)||e.config.xaxis.labels.style.fontSize,s=e.globals.groups.map((function(t){return t.title})),r=x.getLargestStringFromArr(s),o=this.dCtx.dimHelpers.getLargestStringFromMultiArr(r,s),n=new m(this.dCtx.ctx),l=n.getTextRects(r,a),h=l;return r!==o&&(h=n.getTextRects(o,a)),i={width:l.width>=h.width?l.width:h.width,height:l.height>=h.height?l.height:h.height},e.config.xaxis.labels.show||(i={width:0,height:0}),{width:i.width,height:i.height}}},{key:\"getxAxisTitleCoords\",value:function(){var t=this.w,e=0,i=0;if(void 0!==t.config.xaxis.title.text){var a=new m(this.dCtx.ctx).getTextRects(t.config.xaxis.title.text,t.config.xaxis.title.style.fontSize);e=a.width,i=a.height}return{width:e,height:i}}},{key:\"getxAxisTimeScaleLabelsCoords\",value:function(){var t,e=this.w;this.dCtx.timescaleLabels=e.globals.timescaleLabels.slice();var i=this.dCtx.timescaleLabels.map((function(t){return t.value})),a=i.reduce((function(t,e){return void 0===t?(console.error(\"You have possibly supplied invalid Date format. Please supply a valid JavaScript Date\"),0):t.length>e.length?t:e}),0);return 1.05*(t=new m(this.dCtx.ctx).getTextRects(a,e.config.xaxis.labels.style.fontSize)).width*i.length>e.globals.gridWidth&&0!==e.config.xaxis.labels.rotate&&(e.globals.overlappingXLabels=!0),t}},{key:\"additionalPaddingXLabels\",value:function(t){var e=this,i=this.w,a=i.globals,s=i.config,r=s.xaxis.type,o=t.width;a.skipLastTimelinelabel=!1,a.skipFirstTimelinelabel=!1;var n=i.config.yaxis[0].opposite&&i.globals.isBarHorizontal,l=function(t,n){(function(t){return-1!==a.collapsedSeriesIndices.indexOf(t)})(n)||function(t){if(e.dCtx.timescaleLabels&&e.dCtx.timescaleLabels.length){var n=e.dCtx.timescaleLabels[0],l=e.dCtx.timescaleLabels[e.dCtx.timescaleLabels.length-1].position+o/1.75-e.dCtx.yAxisWidthRight,h=n.position-o/1.75+e.dCtx.yAxisWidthLeft,c=\"right\"===i.config.legend.position&&e.dCtx.lgRect.width>0?e.dCtx.lgRect.width:0;l>a.svgWidth-a.translateX-c&&(a.skipLastTimelinelabel=!0),h<-(t.show&&!t.floating||\"bar\"!==s.chart.type&&\"candlestick\"!==s.chart.type&&\"rangeBar\"!==s.chart.type&&\"boxPlot\"!==s.chart.type?10:o/1.75)&&(a.skipFirstTimelinelabel=!0)}else\"datetime\"===r?e.dCtx.gridPad.right<o&&!a.rotateXLabels&&(a.skipLastTimelinelabel=!0):\"datetime\"!==r&&e.dCtx.gridPad.right<o/2-e.dCtx.yAxisWidthRight&&!a.rotateXLabels&&!i.config.xaxis.labels.trim&&(\"between\"!==i.config.xaxis.tickPlacement||i.globals.isBarHorizontal)&&(e.dCtx.xPadRight=o/2+1)}(t)};s.yaxis.forEach((function(t,i){n?(e.dCtx.gridPad.left<o&&(e.dCtx.xPadLeft=o/2+1),e.dCtx.xPadRight=o/2+1):l(t,i)}))}}]),t}(),st=function(){function t(e){a(this,t),this.w=e.w,this.dCtx=e}return r(t,[{key:\"getyAxisLabelsCoords\",value:function(){var t=this,e=this.w,i=[],a=10,s=new B(this.dCtx.ctx);return e.config.yaxis.map((function(r,o){var n=e.globals.yAxisScale[o],l=0;if(!s.isYAxisHidden(o)&&r.labels.show&&void 0!==r.labels.minWidth&&(l=r.labels.minWidth),!s.isYAxisHidden(o)&&r.labels.show&&n.result.length){var h=e.globals.yLabelFormatters[o],c=n.niceMin===Number.MIN_VALUE?0:n.niceMin,d=String(c).length>String(n.niceMax).length?c:n.niceMax,g=h(d,{seriesIndex:o,dataPointIndex:-1,w:e}),u=g;if(void 0!==g&&0!==g.length||(g=d),e.globals.isBarHorizontal){a=0;var f=e.globals.labels.slice();g=h(g=x.getLargestStringFromArr(f),{seriesIndex:o,dataPointIndex:-1,w:e}),u=t.dCtx.dimHelpers.getLargestStringFromMultiArr(g,f)}var p=new m(t.dCtx.ctx),b=\"rotate(\".concat(r.labels.rotate,\" 0 0)\"),v=p.getTextRects(g,r.labels.style.fontSize,r.labels.style.fontFamily,b,!1),y=v;g!==u&&(y=p.getTextRects(u,r.labels.style.fontSize,r.labels.style.fontFamily,b,!1)),i.push({width:(l>y.width||l>v.width?l:y.width>v.width?y.width:v.width)+a,height:y.height>v.height?y.height:v.height})}else i.push({width:0,height:0})})),i}},{key:\"getyAxisTitleCoords\",value:function(){var t=this,e=this.w,i=[];return e.config.yaxis.map((function(e,a){if(e.show&&void 0!==e.title.text){var s=new m(t.dCtx.ctx),r=\"rotate(\".concat(e.title.rotate,\" 0 0)\"),o=s.getTextRects(e.title.text,e.title.style.fontSize,e.title.style.fontFamily,r,!1);i.push({width:o.width,height:o.height})}else i.push({width:0,height:0})})),i}},{key:\"getTotalYAxisWidth\",value:function(){var t=this.w,e=0,i=0,a=0,s=t.globals.yAxisScale.length>1?10:0,r=new B(this.dCtx.ctx),o=function(o,n){var l=t.config.yaxis[n].floating,h=0;o.width>0&&!l?(h=o.width+s,function(e){return t.globals.ignoreYAxisIndexes.indexOf(e)>-1}(n)&&(h=h-o.width-s)):h=l||r.isYAxisHidden(n)?0:5,t.config.yaxis[n].opposite?a+=h:i+=h,e+=h};return t.globals.yLabelsCoords.map((function(t,e){o(t,e)})),t.globals.yTitleCoords.map((function(t,e){o(t,e)})),t.globals.isBarHorizontal&&!t.config.yaxis[0].floating&&(e=t.globals.yLabelsCoords[0].width+t.globals.yTitleCoords[0].width+15),this.dCtx.yAxisWidthLeft=i,this.dCtx.yAxisWidthRight=a,e}}]),t}(),rt=function(){function t(e){a(this,t),this.w=e.w,this.dCtx=e}return r(t,[{key:\"gridPadForColumnsInNumericAxis\",value:function(t){var e=this.w;if(e.globals.noData||e.globals.allSeriesCollapsed)return 0;var i=function(t){return\"bar\"===t||\"rangeBar\"===t||\"candlestick\"===t||\"boxPlot\"===t},a=e.config.chart.type,s=0,r=i(a)?e.config.series.length:1;if(e.globals.comboBarCount>0&&(r=e.globals.comboBarCount),e.globals.collapsedSeries.forEach((function(t){i(t.type)&&(r-=1)})),e.config.chart.stacked&&(r=1),(i(a)||e.globals.comboBarCount>0)&&e.globals.isXNumeric&&!e.globals.isBarHorizontal&&r>0){var o,n,l=Math.abs(e.globals.initialMaxX-e.globals.initialMinX);l<=3&&(l=e.globals.dataPoints),o=l/t,e.globals.minXDiff&&e.globals.minXDiff/o>0&&(n=e.globals.minXDiff/o),n>t/2&&(n/=2),(s=n/r*parseInt(e.config.plotOptions.bar.columnWidth,10)/100)<1&&(s=1),s=s/(r>1?1:1.5)+5,e.globals.barPadForNumericAxis=s}return s}},{key:\"gridPadFortitleSubtitle\",value:function(){var t=this,e=this.w,i=e.globals,a=this.dCtx.isSparkline||!e.globals.axisCharts?0:10;[\"title\",\"subtitle\"].forEach((function(i){void 0!==e.config[i].text?a+=e.config[i].margin:a+=t.dCtx.isSparkline||!e.globals.axisCharts?0:5})),!e.config.legend.show||\"bottom\"!==e.config.legend.position||e.config.legend.floating||e.globals.axisCharts||(a+=10);var s=this.dCtx.dimHelpers.getTitleSubtitleCoords(\"title\"),r=this.dCtx.dimHelpers.getTitleSubtitleCoords(\"subtitle\");i.gridHeight=i.gridHeight-s.height-r.height-a,i.translateY=i.translateY+s.height+r.height+a}},{key:\"setGridXPosForDualYAxis\",value:function(t,e){var i=this.w,a=new B(this.dCtx.ctx);i.config.yaxis.map((function(s,r){-1!==i.globals.ignoreYAxisIndexes.indexOf(r)||s.floating||a.isYAxisHidden(r)||(s.opposite&&(i.globals.translateX=i.globals.translateX-(e[r].width+t[r].width)-parseInt(i.config.yaxis[r].labels.style.fontSize,10)/1.2-12),i.globals.translateX<2&&(i.globals.translateX=2))}))}}]),t}(),ot=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.lgRect={},this.yAxisWidth=0,this.yAxisWidthLeft=0,this.yAxisWidthRight=0,this.xAxisHeight=0,this.isSparkline=this.w.config.chart.sparkline.enabled,this.dimHelpers=new it(this),this.dimYAxis=new st(this),this.dimXAxis=new at(this),this.dimGrid=new rt(this),this.lgWidthForSideLegends=0,this.gridPad=this.w.config.grid.padding,this.xPadRight=0,this.xPadLeft=0}return r(t,[{key:\"plotCoords\",value:function(){var t=this,e=this.w,i=e.globals;this.lgRect=this.dimHelpers.getLegendsRect(),this.isSparkline&&(e.config.markers.discrete.length>0||e.config.markers.size>0)&&Object.entries(this.gridPad).forEach((function(e){var i=g(e,2),a=i[0],s=i[1];t.gridPad[a]=Math.max(s,t.w.globals.markers.largestSize/1.5)})),i.axisCharts?this.setDimensionsForAxisCharts():this.setDimensionsForNonAxisCharts(),this.dimGrid.gridPadFortitleSubtitle(),i.gridHeight=i.gridHeight-this.gridPad.top-this.gridPad.bottom,i.gridWidth=i.gridWidth-this.gridPad.left-this.gridPad.right-this.xPadRight-this.xPadLeft;var a=this.dimGrid.gridPadForColumnsInNumericAxis(i.gridWidth);i.gridWidth=i.gridWidth-2*a,i.translateX=i.translateX+this.gridPad.left+this.xPadLeft+(a>0?a+4:0),i.translateY=i.translateY+this.gridPad.top}},{key:\"setDimensionsForAxisCharts\",value:function(){var t=this,e=this.w,i=e.globals,a=this.dimYAxis.getyAxisLabelsCoords(),s=this.dimYAxis.getyAxisTitleCoords();e.globals.yLabelsCoords=[],e.globals.yTitleCoords=[],e.config.yaxis.map((function(t,i){e.globals.yLabelsCoords.push({width:a[i].width,index:i}),e.globals.yTitleCoords.push({width:s[i].width,index:i})})),this.yAxisWidth=this.dimYAxis.getTotalYAxisWidth();var r=this.dimXAxis.getxAxisLabelsCoords(),o=this.dimXAxis.getxAxisGroupLabelsCoords(),n=this.dimXAxis.getxAxisTitleCoords();this.conditionalChecksForAxisCoords(r,n,o),i.translateXAxisY=e.globals.rotateXLabels?this.xAxisHeight/8:-4,i.translateXAxisX=e.globals.rotateXLabels&&e.globals.isXNumeric&&e.config.xaxis.labels.rotate<=-45?-this.xAxisWidth/4:0,e.globals.isBarHorizontal&&(i.rotateXLabels=!1,i.translateXAxisY=parseInt(e.config.xaxis.labels.style.fontSize,10)/1.5*-1),i.translateXAxisY=i.translateXAxisY+e.config.xaxis.labels.offsetY,i.translateXAxisX=i.translateXAxisX+e.config.xaxis.labels.offsetX;var l=this.yAxisWidth,h=this.xAxisHeight;i.xAxisLabelsHeight=this.xAxisHeight-n.height,i.xAxisGroupLabelsHeight=i.xAxisLabelsHeight-r.height,i.xAxisLabelsWidth=this.xAxisWidth,i.xAxisHeight=this.xAxisHeight;var c=10;(\"radar\"===e.config.chart.type||this.isSparkline)&&(l=0,h=i.goldenPadding),this.isSparkline&&(this.lgRect={height:0,width:0}),(this.isSparkline||\"treemap\"===e.config.chart.type)&&(l=0,h=0,c=0),this.isSparkline||this.dimXAxis.additionalPaddingXLabels(r);var d=function(){i.translateX=l,i.gridHeight=i.svgHeight-t.lgRect.height-h-(t.isSparkline||\"treemap\"===e.config.chart.type?0:e.globals.rotateXLabels?10:15),i.gridWidth=i.svgWidth-l};switch(\"top\"===e.config.xaxis.position&&(c=i.xAxisHeight-e.config.xaxis.axisTicks.height-5),e.config.legend.position){case\"bottom\":i.translateY=c,d();break;case\"top\":i.translateY=this.lgRect.height+c,d();break;case\"left\":i.translateY=c,i.translateX=this.lgRect.width+l,i.gridHeight=i.svgHeight-h-12,i.gridWidth=i.svgWidth-this.lgRect.width-l;break;case\"right\":i.translateY=c,i.translateX=l,i.gridHeight=i.svgHeight-h-12,i.gridWidth=i.svgWidth-this.lgRect.width-l-5;break;default:throw new Error(\"Legend position not supported\")}this.dimGrid.setGridXPosForDualYAxis(s,a),new q(this.ctx).setYAxisXPosition(a,s)}},{key:\"setDimensionsForNonAxisCharts\",value:function(){var t=this.w,e=t.globals,i=t.config,a=0;t.config.legend.show&&!t.config.legend.floating&&(a=20);var s=\"pie\"===i.chart.type||\"polarArea\"===i.chart.type||\"donut\"===i.chart.type?\"pie\":\"radialBar\",r=i.plotOptions[s].offsetY,o=i.plotOptions[s].offsetX;if(!i.legend.show||i.legend.floating)return e.gridHeight=e.svgHeight-i.grid.padding.left+i.grid.padding.right,e.gridWidth=e.gridHeight,e.translateY=r,void(e.translateX=o+(e.svgWidth-e.gridWidth)/2);switch(i.legend.position){case\"bottom\":e.gridHeight=e.svgHeight-this.lgRect.height-e.goldenPadding,e.gridWidth=e.svgWidth,e.translateY=r-10,e.translateX=o+(e.svgWidth-e.gridWidth)/2;break;case\"top\":e.gridHeight=e.svgHeight-this.lgRect.height-e.goldenPadding,e.gridWidth=e.svgWidth,e.translateY=this.lgRect.height+r+10,e.translateX=o+(e.svgWidth-e.gridWidth)/2;break;case\"left\":e.gridWidth=e.svgWidth-this.lgRect.width-a,e.gridHeight=\"auto\"!==i.chart.height?e.svgHeight:e.gridWidth,e.translateY=r,e.translateX=o+this.lgRect.width+a;break;case\"right\":e.gridWidth=e.svgWidth-this.lgRect.width-a-5,e.gridHeight=\"auto\"!==i.chart.height?e.svgHeight:e.gridWidth,e.translateY=r,e.translateX=o+10;break;default:throw new Error(\"Legend position not supported\")}}},{key:\"conditionalChecksForAxisCoords\",value:function(t,e,i){var a=this.w,s=a.globals.hasGroups?2:1,r=i.height+t.height+e.height,o=a.globals.isMultiLineX?1.2:a.globals.LINE_HEIGHT_RATIO,n=a.globals.rotateXLabels?22:10,l=a.globals.rotateXLabels&&\"bottom\"===a.config.legend.position?10:0;this.xAxisHeight=r*o+s*n+l,this.xAxisWidth=t.width,this.xAxisHeight-e.height>a.config.xaxis.labels.maxHeight&&(this.xAxisHeight=a.config.xaxis.labels.maxHeight),a.config.xaxis.labels.minHeight&&this.xAxisHeight<a.config.xaxis.labels.minHeight&&(this.xAxisHeight=a.config.xaxis.labels.minHeight),a.config.xaxis.floating&&(this.xAxisHeight=0);var h=0,c=0;a.config.yaxis.forEach((function(t){h+=t.labels.minWidth,c+=t.labels.maxWidth})),this.yAxisWidth<h&&(this.yAxisWidth=h),this.yAxisWidth>c&&(this.yAxisWidth=c)}}]),t}(),nt=function(){function t(e){a(this,t),this.w=e.w,this.lgCtx=e}return r(t,[{key:\"getLegendBBox\",value:function(){var t=this.w.globals.dom.baseEl.querySelector(\".apexcharts-legend\").getBoundingClientRect(),e=t.width;return{clwh:t.height,clww:e}}},{key:\"toggleDataSeries\",value:function(t,e){var i=this,a=this.w;if(a.globals.axisCharts||\"radialBar\"===a.config.chart.type){a.globals.resized=!0;var s=null,r=null;if(a.globals.risingSeries=[],a.globals.axisCharts?(s=a.globals.dom.baseEl.querySelector(\".apexcharts-series[data\\\\:realIndex='\".concat(t,\"']\")),r=parseInt(s.getAttribute(\"data:realIndex\"),10)):(s=a.globals.dom.baseEl.querySelector(\".apexcharts-series[rel='\".concat(t+1,\"']\")),r=parseInt(s.getAttribute(\"rel\"),10)-1),e)[{cs:a.globals.collapsedSeries,csi:a.globals.collapsedSeriesIndices},{cs:a.globals.ancillaryCollapsedSeries,csi:a.globals.ancillaryCollapsedSeriesIndices}].forEach((function(t){i.riseCollapsedSeries(t.cs,t.csi,r)}));else this.hideSeries({seriesEl:s,realIndex:r})}else{var o=a.globals.dom.Paper.select(\" .apexcharts-series[rel='\".concat(t+1,\"'] path\")),n=a.config.chart.type;if(\"pie\"===n||\"polarArea\"===n||\"donut\"===n){var l=a.config.plotOptions.pie.donut.labels;new m(this.lgCtx.ctx).pathMouseDown(o.members[0],null),this.lgCtx.ctx.pie.printDataLabelsInner(o.members[0].node,l)}o.fire(\"click\")}}},{key:\"hideSeries\",value:function(t){var e=t.seriesEl,i=t.realIndex,a=this.w,s=x.clone(a.config.series);if(a.globals.axisCharts){var r=!1;if(a.config.yaxis[i]&&a.config.yaxis[i].show&&a.config.yaxis[i].showAlways&&(r=!0,a.globals.ancillaryCollapsedSeriesIndices.indexOf(i)<0&&(a.globals.ancillaryCollapsedSeries.push({index:i,data:s[i].data.slice(),type:e.parentNode.className.baseVal.split(\"-\")[1]}),a.globals.ancillaryCollapsedSeriesIndices.push(i))),!r){a.globals.collapsedSeries.push({index:i,data:s[i].data.slice(),type:e.parentNode.className.baseVal.split(\"-\")[1]}),a.globals.collapsedSeriesIndices.push(i);var o=a.globals.risingSeries.indexOf(i);a.globals.risingSeries.splice(o,1)}}else a.globals.collapsedSeries.push({index:i,data:s[i]}),a.globals.collapsedSeriesIndices.push(i);for(var n=e.childNodes,l=0;l<n.length;l++)n[l].classList.contains(\"apexcharts-series-markers-wrap\")&&(n[l].classList.contains(\"apexcharts-hide\")?n[l].classList.remove(\"apexcharts-hide\"):n[l].classList.add(\"apexcharts-hide\"));a.globals.allSeriesCollapsed=a.globals.collapsedSeries.length===a.config.series.length,s=this._getSeriesBasedOnCollapsedState(s),this.lgCtx.ctx.updateHelpers._updateSeries(s,a.config.chart.animations.dynamicAnimation.enabled)}},{key:\"riseCollapsedSeries\",value:function(t,e,i){var a=this.w,s=x.clone(a.config.series);if(t.length>0){for(var r=0;r<t.length;r++)t[r].index===i&&(a.globals.axisCharts?(s[i].data=t[r].data.slice(),t.splice(r,1),e.splice(r,1),a.globals.risingSeries.push(i)):(s[i]=t[r].data,t.splice(r,1),e.splice(r,1),a.globals.risingSeries.push(i)));s=this._getSeriesBasedOnCollapsedState(s),this.lgCtx.ctx.updateHelpers._updateSeries(s,a.config.chart.animations.dynamicAnimation.enabled)}}},{key:\"_getSeriesBasedOnCollapsedState\",value:function(t){var e=this.w;return e.globals.axisCharts?t.forEach((function(i,a){e.globals.collapsedSeriesIndices.indexOf(a)>-1&&(t[a].data=[])})):t.forEach((function(i,a){e.globals.collapsedSeriesIndices.indexOf(a)>-1&&(t[a]=0)})),t}}]),t}(),lt=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.onLegendClick=this.onLegendClick.bind(this),this.onLegendHovered=this.onLegendHovered.bind(this),this.isBarsDistributed=\"bar\"===this.w.config.chart.type&&this.w.config.plotOptions.bar.distributed&&1===this.w.config.series.length,this.legendHelpers=new nt(this)}return r(t,[{key:\"init\",value:function(){var t=this.w,e=t.globals,i=t.config;if((i.legend.showForSingleSeries&&1===e.series.length||this.isBarsDistributed||e.series.length>1||!e.axisCharts)&&i.legend.show){for(;e.dom.elLegendWrap.firstChild;)e.dom.elLegendWrap.removeChild(e.dom.elLegendWrap.firstChild);this.drawLegends(),\"bottom\"===i.legend.position||\"top\"===i.legend.position?this.legendAlignHorizontal():\"right\"!==i.legend.position&&\"left\"!==i.legend.position||this.legendAlignVertical()}}},{key:\"drawLegends\",value:function(){var t=this,e=this.w,i=e.config.legend.fontFamily,a=e.globals.seriesNames,s=e.globals.colors.slice();if(\"heatmap\"===e.config.chart.type){var r=e.config.plotOptions.heatmap.colorScale.ranges;a=r.map((function(t){return t.name?t.name:t.from+\" - \"+t.to})),s=r.map((function(t){return t.color}))}else this.isBarsDistributed&&(a=e.globals.labels.slice());e.config.legend.customLegendItems.length&&(a=e.config.legend.customLegendItems);for(var o=e.globals.legendFormatter,n=e.config.legend.inverseOrder,l=n?a.length-1:0;n?l>=0:l<=a.length-1;n?l--:l++){var h=o(a[l],{seriesIndex:l,w:e}),c=!1,d=!1;if(e.globals.collapsedSeries.length>0)for(var g=0;g<e.globals.collapsedSeries.length;g++)e.globals.collapsedSeries[g].index===l&&(c=!0);if(e.globals.ancillaryCollapsedSeriesIndices.length>0)for(var u=0;u<e.globals.ancillaryCollapsedSeriesIndices.length;u++)e.globals.ancillaryCollapsedSeriesIndices[u]===l&&(d=!0);var f=document.createElement(\"span\");f.classList.add(\"apexcharts-legend-marker\");var p=e.config.legend.markers.offsetX,b=e.config.legend.markers.offsetY,v=e.config.legend.markers.height,w=e.config.legend.markers.width,k=e.config.legend.markers.strokeWidth,A=e.config.legend.markers.strokeColor,S=e.config.legend.markers.radius,C=f.style;C.background=s[l],C.color=s[l],C.setProperty(\"background\",s[l],\"important\"),e.config.legend.markers.fillColors&&e.config.legend.markers.fillColors[l]&&(C.background=e.config.legend.markers.fillColors[l]),void 0!==e.globals.seriesColors[l]&&(C.background=e.globals.seriesColors[l],C.color=e.globals.seriesColors[l]),C.height=Array.isArray(v)?parseFloat(v[l])+\"px\":parseFloat(v)+\"px\",C.width=Array.isArray(w)?parseFloat(w[l])+\"px\":parseFloat(w)+\"px\",C.left=(Array.isArray(p)?parseFloat(p[l]):parseFloat(p))+\"px\",C.top=(Array.isArray(b)?parseFloat(b[l]):parseFloat(b))+\"px\",C.borderWidth=Array.isArray(k)?k[l]:k,C.borderColor=Array.isArray(A)?A[l]:A,C.borderRadius=Array.isArray(S)?parseFloat(S[l])+\"px\":parseFloat(S)+\"px\",e.config.legend.markers.customHTML&&(Array.isArray(e.config.legend.markers.customHTML)?e.config.legend.markers.customHTML[l]&&(f.innerHTML=e.config.legend.markers.customHTML[l]()):f.innerHTML=e.config.legend.markers.customHTML()),m.setAttrs(f,{rel:l+1,\"data:collapsed\":c||d}),(c||d)&&f.classList.add(\"apexcharts-inactive-legend\");var L=document.createElement(\"div\"),P=document.createElement(\"span\");P.classList.add(\"apexcharts-legend-text\"),P.innerHTML=Array.isArray(h)?h.join(\" \"):h;var I=e.config.legend.labels.useSeriesColors?e.globals.colors[l]:e.config.legend.labels.colors;I||(I=e.config.chart.foreColor),P.style.color=I,P.style.fontSize=parseFloat(e.config.legend.fontSize)+\"px\",P.style.fontWeight=e.config.legend.fontWeight,P.style.fontFamily=i||e.config.chart.fontFamily,m.setAttrs(P,{rel:l+1,i:l,\"data:default-text\":encodeURIComponent(h),\"data:collapsed\":c||d}),L.appendChild(f),L.appendChild(P);var T=new y(this.ctx);if(!e.config.legend.showForZeroSeries)0===T.getSeriesTotalByIndex(l)&&T.seriesHaveSameValues(l)&&!T.isSeriesNull(l)&&-1===e.globals.collapsedSeriesIndices.indexOf(l)&&-1===e.globals.ancillaryCollapsedSeriesIndices.indexOf(l)&&L.classList.add(\"apexcharts-hidden-zero-series\");e.config.legend.showForNullSeries||T.isSeriesNull(l)&&-1===e.globals.collapsedSeriesIndices.indexOf(l)&&-1===e.globals.ancillaryCollapsedSeriesIndices.indexOf(l)&&L.classList.add(\"apexcharts-hidden-null-series\"),e.globals.dom.elLegendWrap.appendChild(L),e.globals.dom.elLegendWrap.classList.add(\"apexcharts-align-\".concat(e.config.legend.horizontalAlign)),e.globals.dom.elLegendWrap.classList.add(\"apx-legend-position-\"+e.config.legend.position),L.classList.add(\"apexcharts-legend-series\"),L.style.margin=\"\".concat(e.config.legend.itemMargin.vertical,\"px \").concat(e.config.legend.itemMargin.horizontal,\"px\"),e.globals.dom.elLegendWrap.style.width=e.config.legend.width?e.config.legend.width+\"px\":\"\",e.globals.dom.elLegendWrap.style.height=e.config.legend.height?e.config.legend.height+\"px\":\"\",m.setAttrs(L,{rel:l+1,seriesName:x.escapeString(a[l]),\"data:collapsed\":c||d}),(c||d)&&L.classList.add(\"apexcharts-inactive-legend\"),e.config.legend.onItemClick.toggleDataSeries||L.classList.add(\"apexcharts-no-click\")}e.globals.dom.elWrap.addEventListener(\"click\",t.onLegendClick,!0),e.globals.dom.elWrap.appendChild(e.globals.dom.elLegendWrap),e.config.legend.onItemHover.highlightDataSeries&&0===e.config.legend.customLegendItems.length&&(e.globals.dom.elWrap.addEventListener(\"mousemove\",t.onLegendHovered,!0),e.globals.dom.elWrap.addEventListener(\"mouseout\",t.onLegendHovered,!0))}},{key:\"setLegendWrapXY\",value:function(t,e){var i=this.w,a=i.globals.dom.elLegendWrap,s=a.getBoundingClientRect(),r=0,o=0;if(\"bottom\"===i.config.legend.position)o+=i.globals.svgHeight-s.height/2;else if(\"top\"===i.config.legend.position){var n=new ot(this.ctx),l=n.dimHelpers.getTitleSubtitleCoords(\"title\").height,h=n.dimHelpers.getTitleSubtitleCoords(\"subtitle\").height;o=o+(l>0?l-10:0)+(h>0?h-10:0)}a.style.position=\"absolute\",r=r+t+i.config.legend.offsetX,o=o+e+i.config.legend.offsetY,a.style.left=r+\"px\",a.style.top=o+\"px\",\"bottom\"===i.config.legend.position?(a.style.top=\"auto\",a.style.bottom=5-i.config.legend.offsetY+\"px\"):\"right\"===i.config.legend.position&&(a.style.left=\"auto\",a.style.right=25+i.config.legend.offsetX+\"px\");[\"width\",\"height\"].forEach((function(t){a.style[t]&&(a.style[t]=parseInt(i.config.legend[t],10)+\"px\")}))}},{key:\"legendAlignHorizontal\",value:function(){var t=this.w;t.globals.dom.elLegendWrap.style.right=0;var e=this.legendHelpers.getLegendBBox(),i=new ot(this.ctx),a=i.dimHelpers.getTitleSubtitleCoords(\"title\"),s=i.dimHelpers.getTitleSubtitleCoords(\"subtitle\"),r=0;\"bottom\"===t.config.legend.position?r=-e.clwh/1.8:\"top\"===t.config.legend.position&&(r=a.height+s.height+t.config.title.margin+t.config.subtitle.margin-10),this.setLegendWrapXY(20,r)}},{key:\"legendAlignVertical\",value:function(){var t=this.w,e=this.legendHelpers.getLegendBBox(),i=0;\"left\"===t.config.legend.position&&(i=20),\"right\"===t.config.legend.position&&(i=t.globals.svgWidth-e.clww-10),this.setLegendWrapXY(i,20)}},{key:\"onLegendHovered\",value:function(t){var e=this.w,i=t.target.classList.contains(\"apexcharts-legend-text\")||t.target.classList.contains(\"apexcharts-legend-marker\");if(\"heatmap\"===e.config.chart.type||this.isBarsDistributed){if(i){var a=parseInt(t.target.getAttribute(\"rel\"),10)-1;this.ctx.events.fireEvent(\"legendHover\",[this.ctx,a,this.w]),new N(this.ctx).highlightRangeInSeries(t,t.target)}}else!t.target.classList.contains(\"apexcharts-inactive-legend\")&&i&&new N(this.ctx).toggleSeriesOnHover(t,t.target)}},{key:\"onLegendClick\",value:function(t){var e=this.w;if(!e.config.legend.customLegendItems.length&&(t.target.classList.contains(\"apexcharts-legend-text\")||t.target.classList.contains(\"apexcharts-legend-marker\"))){var i=parseInt(t.target.getAttribute(\"rel\"),10)-1,a=\"true\"===t.target.getAttribute(\"data:collapsed\"),s=this.w.config.chart.events.legendClick;\"function\"==typeof s&&s(this.ctx,i,this.w),this.ctx.events.fireEvent(\"legendClick\",[this.ctx,i,this.w]);var r=this.w.config.legend.markers.onClick;\"function\"==typeof r&&t.target.classList.contains(\"apexcharts-legend-marker\")&&(r(this.ctx,i,this.w),this.ctx.events.fireEvent(\"legendMarkerClick\",[this.ctx,i,this.w])),\"treemap\"!==e.config.chart.type&&\"heatmap\"!==e.config.chart.type&&!this.isBarsDistributed&&e.config.legend.onItemClick.toggleDataSeries&&this.legendHelpers.toggleDataSeries(i,a)}}}]),t}(),ht=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w;var i=this.w;this.ev=this.w.config.chart.events,this.selectedClass=\"apexcharts-selected\",this.localeValues=this.w.globals.locale.toolbar,this.minX=i.globals.minX,this.maxX=i.globals.maxX}return r(t,[{key:\"createToolbar\",value:function(){var t=this,e=this.w,i=function(){return document.createElement(\"div\")},a=i();if(a.setAttribute(\"class\",\"apexcharts-toolbar\"),a.style.top=e.config.chart.toolbar.offsetY+\"px\",a.style.right=3-e.config.chart.toolbar.offsetX+\"px\",e.globals.dom.elWrap.appendChild(a),this.elZoom=i(),this.elZoomIn=i(),this.elZoomOut=i(),this.elPan=i(),this.elSelection=i(),this.elZoomReset=i(),this.elMenuIcon=i(),this.elMenu=i(),this.elCustomIcons=[],this.t=e.config.chart.toolbar.tools,Array.isArray(this.t.customIcons))for(var s=0;s<this.t.customIcons.length;s++)this.elCustomIcons.push(i());var r=[],o=function(i,a,s){var o=i.toLowerCase();t.t[o]&&e.config.chart.zoom.enabled&&r.push({el:a,icon:\"string\"==typeof t.t[o]?t.t[o]:s,title:t.localeValues[i],class:\"apexcharts-\".concat(o,\"-icon\")})};o(\"zoomIn\",this.elZoomIn,'<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\\n    <path d=\"M0 0h24v24H0z\" fill=\"none\"/>\\n    <path d=\"M13 7h-2v4H7v2h4v4h2v-4h4v-2h-4V7zm-1-5C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/>\\n</svg>\\n'),o(\"zoomOut\",this.elZoomOut,'<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\\n    <path d=\"M0 0h24v24H0z\" fill=\"none\"/>\\n    <path d=\"M7 11v2h10v-2H7zm5-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/>\\n</svg>\\n');var n=function(i){t.t[i]&&e.config.chart[i].enabled&&r.push({el:\"zoom\"===i?t.elZoom:t.elSelection,icon:\"string\"==typeof t.t[i]?t.t[i]:\"zoom\"===i?'<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"#000000\" height=\"24\" viewBox=\"0 0 24 24\" width=\"24\">\\n    <path d=\"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"/>\\n    <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\\n    <path d=\"M12 10h-2v2H9v-2H7V9h2V7h1v2h2v1z\"/>\\n</svg>':'<svg fill=\"#6E8192\" height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\">\\n    <path d=\"M0 0h24v24H0z\" fill=\"none\"/>\\n    <path d=\"M3 5h2V3c-1.1 0-2 .9-2 2zm0 8h2v-2H3v2zm4 8h2v-2H7v2zM3 9h2V7H3v2zm10-6h-2v2h2V3zm6 0v2h2c0-1.1-.9-2-2-2zM5 21v-2H3c0 1.1.9 2 2 2zm-2-4h2v-2H3v2zM9 3H7v2h2V3zm2 18h2v-2h-2v2zm8-8h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2zm0-12h2V7h-2v2zm0 8h2v-2h-2v2zm-4 4h2v-2h-2v2zm0-16h2V3h-2v2z\"/>\\n</svg>',title:t.localeValues[\"zoom\"===i?\"selectionZoom\":\"selection\"],class:e.globals.isTouchDevice?\"apexcharts-element-hidden\":\"apexcharts-\".concat(i,\"-icon\")})};n(\"zoom\"),n(\"selection\"),this.t.pan&&e.config.chart.zoom.enabled&&r.push({el:this.elPan,icon:\"string\"==typeof this.t.pan?this.t.pan:'<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" fill=\"#000000\" height=\"24\" viewBox=\"0 0 24 24\" width=\"24\">\\n    <defs>\\n        <path d=\"M0 0h24v24H0z\" id=\"a\"/>\\n    </defs>\\n    <clipPath id=\"b\">\\n        <use overflow=\"visible\" xlink:href=\"#a\"/>\\n    </clipPath>\\n    <path clip-path=\"url(#b)\" d=\"M23 5.5V20c0 2.2-1.8 4-4 4h-7.3c-1.08 0-2.1-.43-2.85-1.19L1 14.83s1.26-1.23 1.3-1.25c.22-.19.49-.29.79-.29.22 0 .42.06.6.16.04.01 4.31 2.46 4.31 2.46V4c0-.83.67-1.5 1.5-1.5S11 3.17 11 4v7h1V1.5c0-.83.67-1.5 1.5-1.5S15 .67 15 1.5V11h1V2.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5V11h1V5.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5z\"/>\\n</svg>',title:this.localeValues.pan,class:e.globals.isTouchDevice?\"apexcharts-element-hidden\":\"apexcharts-pan-icon\"}),o(\"reset\",this.elZoomReset,'<svg fill=\"#000000\" height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\">\\n    <path d=\"M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z\"/>\\n    <path d=\"M0 0h24v24H0z\" fill=\"none\"/>\\n</svg>'),this.t.download&&r.push({el:this.elMenuIcon,icon:\"string\"==typeof this.t.download?this.t.download:'<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z\"/></svg>',title:this.localeValues.menu,class:\"apexcharts-menu-icon\"});for(var l=0;l<this.elCustomIcons.length;l++)r.push({el:this.elCustomIcons[l],icon:this.t.customIcons[l].icon,title:this.t.customIcons[l].title,index:this.t.customIcons[l].index,class:\"apexcharts-toolbar-custom-icon \"+this.t.customIcons[l].class});r.forEach((function(t,e){t.index&&x.moveIndexInArray(r,e,t.index)}));for(var h=0;h<r.length;h++)m.setAttrs(r[h].el,{class:r[h].class,title:r[h].title}),r[h].el.innerHTML=r[h].icon,a.appendChild(r[h].el);this._createHamburgerMenu(a),e.globals.zoomEnabled?this.elZoom.classList.add(this.selectedClass):e.globals.panEnabled?this.elPan.classList.add(this.selectedClass):e.globals.selectionEnabled&&this.elSelection.classList.add(this.selectedClass),this.addToolbarEventListeners()}},{key:\"_createHamburgerMenu\",value:function(t){this.elMenuItems=[],t.appendChild(this.elMenu),m.setAttrs(this.elMenu,{class:\"apexcharts-menu\"});var e=[{name:\"exportSVG\",title:this.localeValues.exportToSVG},{name:\"exportPNG\",title:this.localeValues.exportToPNG},{name:\"exportCSV\",title:this.localeValues.exportToCSV}];this.w.globals.allSeriesHasEqualX||e.splice(2,1);for(var i=0;i<e.length;i++)this.elMenuItems.push(document.createElement(\"div\")),this.elMenuItems[i].innerHTML=e[i].title,m.setAttrs(this.elMenuItems[i],{class:\"apexcharts-menu-item \".concat(e[i].name),title:e[i].title}),this.elMenu.appendChild(this.elMenuItems[i])}},{key:\"addToolbarEventListeners\",value:function(){var t=this;this.elZoomReset.addEventListener(\"click\",this.handleZoomReset.bind(this)),this.elSelection.addEventListener(\"click\",this.toggleZoomSelection.bind(this,\"selection\")),this.elZoom.addEventListener(\"click\",this.toggleZoomSelection.bind(this,\"zoom\")),this.elZoomIn.addEventListener(\"click\",this.handleZoomIn.bind(this)),this.elZoomOut.addEventListener(\"click\",this.handleZoomOut.bind(this)),this.elPan.addEventListener(\"click\",this.togglePanning.bind(this)),this.elMenuIcon.addEventListener(\"click\",this.toggleMenu.bind(this)),this.elMenuItems.forEach((function(e){e.classList.contains(\"exportSVG\")?e.addEventListener(\"click\",t.handleDownload.bind(t,\"svg\")):e.classList.contains(\"exportPNG\")?e.addEventListener(\"click\",t.handleDownload.bind(t,\"png\")):e.classList.contains(\"exportCSV\")&&e.addEventListener(\"click\",t.handleDownload.bind(t,\"csv\"))}));for(var e=0;e<this.t.customIcons.length;e++)this.elCustomIcons[e].addEventListener(\"click\",this.t.customIcons[e].click.bind(this,this.ctx,this.ctx.w))}},{key:\"toggleZoomSelection\",value:function(t){this.ctx.getSyncedCharts().forEach((function(e){e.ctx.toolbar.toggleOtherControls();var i=\"selection\"===t?e.ctx.toolbar.elSelection:e.ctx.toolbar.elZoom,a=\"selection\"===t?\"selectionEnabled\":\"zoomEnabled\";e.w.globals[a]=!e.w.globals[a],i.classList.contains(e.ctx.toolbar.selectedClass)?i.classList.remove(e.ctx.toolbar.selectedClass):i.classList.add(e.ctx.toolbar.selectedClass)}))}},{key:\"getToolbarIconsReference\",value:function(){var t=this.w;this.elZoom||(this.elZoom=t.globals.dom.baseEl.querySelector(\".apexcharts-zoom-icon\")),this.elPan||(this.elPan=t.globals.dom.baseEl.querySelector(\".apexcharts-pan-icon\")),this.elSelection||(this.elSelection=t.globals.dom.baseEl.querySelector(\".apexcharts-selection-icon\"))}},{key:\"enableZoomPanFromToolbar\",value:function(t){this.toggleOtherControls(),\"pan\"===t?this.w.globals.panEnabled=!0:this.w.globals.zoomEnabled=!0;var e=\"pan\"===t?this.elPan:this.elZoom,i=\"pan\"===t?this.elZoom:this.elPan;e&&e.classList.add(this.selectedClass),i&&i.classList.remove(this.selectedClass)}},{key:\"togglePanning\",value:function(){this.ctx.getSyncedCharts().forEach((function(t){t.ctx.toolbar.toggleOtherControls(),t.w.globals.panEnabled=!t.w.globals.panEnabled,t.ctx.toolbar.elPan.classList.contains(t.ctx.toolbar.selectedClass)?t.ctx.toolbar.elPan.classList.remove(t.ctx.toolbar.selectedClass):t.ctx.toolbar.elPan.classList.add(t.ctx.toolbar.selectedClass)}))}},{key:\"toggleOtherControls\",value:function(){var t=this,e=this.w;e.globals.panEnabled=!1,e.globals.zoomEnabled=!1,e.globals.selectionEnabled=!1,this.getToolbarIconsReference(),[this.elPan,this.elSelection,this.elZoom].forEach((function(e){e&&e.classList.remove(t.selectedClass)}))}},{key:\"handleZoomIn\",value:function(){var t=this.w;t.globals.isRangeBar&&(this.minX=t.globals.minY,this.maxX=t.globals.maxY);var e=(this.minX+this.maxX)/2,i=(this.minX+e)/2,a=(this.maxX+e)/2,s=this._getNewMinXMaxX(i,a);t.globals.disableZoomIn||this.zoomUpdateOptions(s.minX,s.maxX)}},{key:\"handleZoomOut\",value:function(){var t=this.w;if(t.globals.isRangeBar&&(this.minX=t.globals.minY,this.maxX=t.globals.maxY),!(\"datetime\"===t.config.xaxis.type&&new Date(this.minX).getUTCFullYear()<1e3)){var e=(this.minX+this.maxX)/2,i=this.minX-(e-this.minX),a=this.maxX-(e-this.maxX),s=this._getNewMinXMaxX(i,a);t.globals.disableZoomOut||this.zoomUpdateOptions(s.minX,s.maxX)}}},{key:\"_getNewMinXMaxX\",value:function(t,e){var i=this.w.config.xaxis.convertedCatToNumeric;return{minX:i?Math.floor(t):t,maxX:i?Math.floor(e):e}}},{key:\"zoomUpdateOptions\",value:function(t,e){var i=this.w;if(void 0!==t||void 0!==e){if(!(i.config.xaxis.convertedCatToNumeric&&(t<1&&(t=1,e=i.globals.dataPoints),e-t<2))){var a={min:t,max:e},s=this.getBeforeZoomRange(a);s&&(a=s.xaxis);var r={xaxis:a},o=x.clone(i.globals.initialConfig.yaxis);if(i.config.chart.zoom.autoScaleYaxis)o=new _(this.ctx).autoScaleY(this.ctx,o,{xaxis:a});i.config.chart.group||(r.yaxis=o),this.w.globals.zoomed=!0,this.ctx.updateHelpers._updateOptions(r,!1,this.w.config.chart.animations.dynamicAnimation.enabled),this.zoomCallback(a,o)}}else this.handleZoomReset()}},{key:\"zoomCallback\",value:function(t,e){\"function\"==typeof this.ev.zoomed&&this.ev.zoomed(this.ctx,{xaxis:t,yaxis:e})}},{key:\"getBeforeZoomRange\",value:function(t,e){var i=null;return\"function\"==typeof this.ev.beforeZoom&&(i=this.ev.beforeZoom(this,{xaxis:t,yaxis:e})),i}},{key:\"toggleMenu\",value:function(){var t=this;window.setTimeout((function(){t.elMenu.classList.contains(\"apexcharts-menu-open\")?t.elMenu.classList.remove(\"apexcharts-menu-open\"):t.elMenu.classList.add(\"apexcharts-menu-open\")}),0)}},{key:\"handleDownload\",value:function(t){var e=this.w,i=new G(this.ctx);switch(t){case\"svg\":i.exportToSVG(this.ctx);break;case\"png\":i.exportToPng(this.ctx);break;case\"csv\":i.exportToCSV({series:e.config.series,columnDelimiter:e.config.chart.toolbar.export.csv.columnDelimiter})}}},{key:\"handleZoomReset\",value:function(t){this.ctx.getSyncedCharts().forEach((function(t){var e=t.w;if(e.globals.lastXAxis.min=void 0,e.globals.lastXAxis.max=void 0,t.updateHelpers.revertDefaultAxisMinMax(),\"function\"==typeof e.config.chart.events.beforeResetZoom){var i=e.config.chart.events.beforeResetZoom(t,e);i&&t.updateHelpers.revertDefaultAxisMinMax(i)}\"function\"==typeof e.config.chart.events.zoomed&&t.ctx.toolbar.zoomCallback({min:e.config.xaxis.min,max:e.config.xaxis.max}),e.globals.zoomed=!1;var a=t.ctx.series.emptyCollapsedSeries(x.clone(e.globals.initialSeries));t.updateHelpers._updateSeries(a,e.config.chart.animations.dynamicAnimation.enabled)}))}},{key:\"destroy\",value:function(){this.elZoom=null,this.elZoomIn=null,this.elZoomOut=null,this.elPan=null,this.elSelection=null,this.elZoomReset=null,this.elMenuIcon=null}}]),t}(),ct=function(t){n(i,t);var e=d(i);function i(t){var s;return a(this,i),(s=e.call(this,t)).ctx=t,s.w=t.w,s.dragged=!1,s.graphics=new m(s.ctx),s.eventList=[\"mousedown\",\"mouseleave\",\"mousemove\",\"touchstart\",\"touchmove\",\"mouseup\",\"touchend\"],s.clientX=0,s.clientY=0,s.startX=0,s.endX=0,s.dragX=0,s.startY=0,s.endY=0,s.dragY=0,s.moveDirection=\"none\",s}return r(i,[{key:\"init\",value:function(t){var e=this,i=t.xyRatios,a=this.w,s=this;this.xyRatios=i,this.zoomRect=this.graphics.drawRect(0,0,0,0),this.selectionRect=this.graphics.drawRect(0,0,0,0),this.gridRect=a.globals.dom.baseEl.querySelector(\".apexcharts-grid\"),this.zoomRect.node.classList.add(\"apexcharts-zoom-rect\"),this.selectionRect.node.classList.add(\"apexcharts-selection-rect\"),a.globals.dom.elGraphical.add(this.zoomRect),a.globals.dom.elGraphical.add(this.selectionRect),\"x\"===a.config.chart.selection.type?this.slDraggableRect=this.selectionRect.draggable({minX:0,minY:0,maxX:a.globals.gridWidth,maxY:a.globals.gridHeight}).on(\"dragmove\",this.selectionDragging.bind(this,\"dragging\")):\"y\"===a.config.chart.selection.type?this.slDraggableRect=this.selectionRect.draggable({minX:0,maxX:a.globals.gridWidth}).on(\"dragmove\",this.selectionDragging.bind(this,\"dragging\")):this.slDraggableRect=this.selectionRect.draggable().on(\"dragmove\",this.selectionDragging.bind(this,\"dragging\")),this.preselectedSelection(),this.hoverArea=a.globals.dom.baseEl.querySelector(\"\".concat(a.globals.chartClass,\" .apexcharts-svg\")),this.hoverArea.classList.add(\"apexcharts-zoomable\"),this.eventList.forEach((function(t){e.hoverArea.addEventListener(t,s.svgMouseEvents.bind(s,i),{capture:!1,passive:!0})}))}},{key:\"destroy\",value:function(){this.slDraggableRect&&(this.slDraggableRect.draggable(!1),this.slDraggableRect.off(),this.selectionRect.off()),this.selectionRect=null,this.zoomRect=null,this.gridRect=null}},{key:\"svgMouseEvents\",value:function(t,e){var i=this.w,a=this,s=this.ctx.toolbar,r=i.globals.zoomEnabled?i.config.chart.zoom.type:i.config.chart.selection.type,o=i.config.chart.toolbar.autoSelected;if(e.shiftKey?(this.shiftWasPressed=!0,s.enableZoomPanFromToolbar(\"pan\"===o?\"zoom\":\"pan\")):this.shiftWasPressed&&(s.enableZoomPanFromToolbar(o),this.shiftWasPressed=!1),e.target){var n,l=e.target.classList;if(e.target.parentNode&&null!==e.target.parentNode&&(n=e.target.parentNode.classList),!(l.contains(\"apexcharts-selection-rect\")||l.contains(\"apexcharts-legend-marker\")||l.contains(\"apexcharts-legend-text\")||n&&n.contains(\"apexcharts-toolbar\"))){if(a.clientX=\"touchmove\"===e.type||\"touchstart\"===e.type?e.touches[0].clientX:\"touchend\"===e.type?e.changedTouches[0].clientX:e.clientX,a.clientY=\"touchmove\"===e.type||\"touchstart\"===e.type?e.touches[0].clientY:\"touchend\"===e.type?e.changedTouches[0].clientY:e.clientY,\"mousedown\"===e.type&&1===e.which){var h=a.gridRect.getBoundingClientRect();a.startX=a.clientX-h.left,a.startY=a.clientY-h.top,a.dragged=!1,a.w.globals.mousedown=!0}if((\"mousemove\"===e.type&&1===e.which||\"touchmove\"===e.type)&&(a.dragged=!0,i.globals.panEnabled?(i.globals.selection=null,a.w.globals.mousedown&&a.panDragging({context:a,zoomtype:r,xyRatios:t})):(a.w.globals.mousedown&&i.globals.zoomEnabled||a.w.globals.mousedown&&i.globals.selectionEnabled)&&(a.selection=a.selectionDrawing({context:a,zoomtype:r}))),\"mouseup\"===e.type||\"touchend\"===e.type||\"mouseleave\"===e.type){var c=a.gridRect.getBoundingClientRect();a.w.globals.mousedown&&(a.endX=a.clientX-c.left,a.endY=a.clientY-c.top,a.dragX=Math.abs(a.endX-a.startX),a.dragY=Math.abs(a.endY-a.startY),(i.globals.zoomEnabled||i.globals.selectionEnabled)&&a.selectionDrawn({context:a,zoomtype:r}),i.globals.panEnabled&&i.config.xaxis.convertedCatToNumeric&&a.delayedPanScrolled()),i.globals.zoomEnabled&&a.hideSelectionRect(this.selectionRect),a.dragged=!1,a.w.globals.mousedown=!1}this.makeSelectionRectDraggable()}}}},{key:\"makeSelectionRectDraggable\",value:function(){var t=this.w;if(this.selectionRect){var e=this.selectionRect.node.getBoundingClientRect();e.width>0&&e.height>0&&this.slDraggableRect.selectize({points:\"l, r\",pointSize:8,pointType:\"rect\"}).resize({constraint:{minX:0,minY:0,maxX:t.globals.gridWidth,maxY:t.globals.gridHeight}}).on(\"resizing\",this.selectionDragging.bind(this,\"resizing\"))}}},{key:\"preselectedSelection\",value:function(){var t=this.w,e=this.xyRatios;if(!t.globals.zoomEnabled)if(void 0!==t.globals.selection&&null!==t.globals.selection)this.drawSelectionRect(t.globals.selection);else if(void 0!==t.config.chart.selection.xaxis.min&&void 0!==t.config.chart.selection.xaxis.max){var i=(t.config.chart.selection.xaxis.min-t.globals.minX)/e.xRatio,a={x:i,y:0,width:t.globals.gridWidth-(t.globals.maxX-t.config.chart.selection.xaxis.max)/e.xRatio-i,height:t.globals.gridHeight,translateX:0,translateY:0,selectionEnabled:!0};this.drawSelectionRect(a),this.makeSelectionRectDraggable(),\"function\"==typeof t.config.chart.events.selection&&t.config.chart.events.selection(this.ctx,{xaxis:{min:t.config.chart.selection.xaxis.min,max:t.config.chart.selection.xaxis.max},yaxis:{}})}}},{key:\"drawSelectionRect\",value:function(t){var e=t.x,i=t.y,a=t.width,s=t.height,r=t.translateX,o=void 0===r?0:r,n=t.translateY,l=void 0===n?0:n,h=this.w,c=this.zoomRect,d=this.selectionRect;if(this.dragged||null!==h.globals.selection){var g={transform:\"translate(\"+o+\", \"+l+\")\"};h.globals.zoomEnabled&&this.dragged&&(a<0&&(a=1),c.attr({x:e,y:i,width:a,height:s,fill:h.config.chart.zoom.zoomedArea.fill.color,\"fill-opacity\":h.config.chart.zoom.zoomedArea.fill.opacity,stroke:h.config.chart.zoom.zoomedArea.stroke.color,\"stroke-width\":h.config.chart.zoom.zoomedArea.stroke.width,\"stroke-opacity\":h.config.chart.zoom.zoomedArea.stroke.opacity}),m.setAttrs(c.node,g)),h.globals.selectionEnabled&&(d.attr({x:e,y:i,width:a>0?a:0,height:s>0?s:0,fill:h.config.chart.selection.fill.color,\"fill-opacity\":h.config.chart.selection.fill.opacity,stroke:h.config.chart.selection.stroke.color,\"stroke-width\":h.config.chart.selection.stroke.width,\"stroke-dasharray\":h.config.chart.selection.stroke.dashArray,\"stroke-opacity\":h.config.chart.selection.stroke.opacity}),m.setAttrs(d.node,g))}}},{key:\"hideSelectionRect\",value:function(t){t&&t.attr({x:0,y:0,width:0,height:0})}},{key:\"selectionDrawing\",value:function(t){var e=t.context,i=t.zoomtype,a=this.w,s=e,r=this.gridRect.getBoundingClientRect(),o=s.startX-1,n=s.startY,l=!1,h=!1,c=s.clientX-r.left-o,d=s.clientY-r.top-n,g={};return Math.abs(c+o)>a.globals.gridWidth?c=a.globals.gridWidth-o:s.clientX-r.left<0&&(c=o),o>s.clientX-r.left&&(l=!0,c=Math.abs(c)),n>s.clientY-r.top&&(h=!0,d=Math.abs(d)),g=\"x\"===i?{x:l?o-c:o,y:0,width:c,height:a.globals.gridHeight}:\"y\"===i?{x:0,y:h?n-d:n,width:a.globals.gridWidth,height:d}:{x:l?o-c:o,y:h?n-d:n,width:c,height:d},s.drawSelectionRect(g),s.selectionDragging(\"resizing\"),g}},{key:\"selectionDragging\",value:function(t,e){var i=this,a=this.w,s=this.xyRatios,r=this.selectionRect,o=0;\"resizing\"===t&&(o=30);var n=function(t){return parseFloat(r.node.getAttribute(t))},l={x:n(\"x\"),y:n(\"y\"),width:n(\"width\"),height:n(\"height\")};a.globals.selection=l,\"function\"==typeof a.config.chart.events.selection&&a.globals.selectionEnabled&&(clearTimeout(this.w.globals.selectionResizeTimer),this.w.globals.selectionResizeTimer=window.setTimeout((function(){var t=i.gridRect.getBoundingClientRect(),e=r.node.getBoundingClientRect(),o={xaxis:{min:a.globals.xAxisScale.niceMin+(e.left-t.left)*s.xRatio,max:a.globals.xAxisScale.niceMin+(e.right-t.left)*s.xRatio},yaxis:{min:a.globals.yAxisScale[0].niceMin+(t.bottom-e.bottom)*s.yRatio[0],max:a.globals.yAxisScale[0].niceMax-(e.top-t.top)*s.yRatio[0]}};a.config.chart.events.selection(i.ctx,o),a.config.chart.brush.enabled&&void 0!==a.config.chart.events.brushScrolled&&a.config.chart.events.brushScrolled(i.ctx,o)}),o))}},{key:\"selectionDrawn\",value:function(t){var e=t.context,i=t.zoomtype,a=this.w,s=e,r=this.xyRatios,o=this.ctx.toolbar;if(s.startX>s.endX){var n=s.startX;s.startX=s.endX,s.endX=n}if(s.startY>s.endY){var l=s.startY;s.startY=s.endY,s.endY=l}var h=void 0,c=void 0;a.globals.isRangeBar?(h=a.globals.yAxisScale[0].niceMin+s.startX*r.invertedYRatio,c=a.globals.yAxisScale[0].niceMin+s.endX*r.invertedYRatio):(h=a.globals.xAxisScale.niceMin+s.startX*r.xRatio,c=a.globals.xAxisScale.niceMin+s.endX*r.xRatio);var d=[],g=[];if(a.config.yaxis.forEach((function(t,e){d.push(a.globals.yAxisScale[e].niceMax-r.yRatio[e]*s.startY),g.push(a.globals.yAxisScale[e].niceMax-r.yRatio[e]*s.endY)})),s.dragged&&(s.dragX>10||s.dragY>10)&&h!==c)if(a.globals.zoomEnabled){var u=x.clone(a.globals.initialConfig.yaxis),f=x.clone(a.globals.initialConfig.xaxis);if(a.globals.zoomed=!0,a.config.xaxis.convertedCatToNumeric&&(h=Math.floor(h),c=Math.floor(c),h<1&&(h=1,c=a.globals.dataPoints),c-h<2&&(c=h+1)),\"xy\"!==i&&\"x\"!==i||(f={min:h,max:c}),\"xy\"!==i&&\"y\"!==i||u.forEach((function(t,e){u[e].min=g[e],u[e].max=d[e]})),a.config.chart.zoom.autoScaleYaxis){var p=new _(s.ctx);u=p.autoScaleY(s.ctx,u,{xaxis:f})}if(o){var b=o.getBeforeZoomRange(f,u);b&&(f=b.xaxis?b.xaxis:f,u=b.yaxis?b.yaxis:u)}var v={xaxis:f};a.config.chart.group||(v.yaxis=u),s.ctx.updateHelpers._updateOptions(v,!1,s.w.config.chart.animations.dynamicAnimation.enabled),\"function\"==typeof a.config.chart.events.zoomed&&o.zoomCallback(f,u)}else if(a.globals.selectionEnabled){var m,y=null;m={min:h,max:c},\"xy\"!==i&&\"y\"!==i||(y=x.clone(a.config.yaxis)).forEach((function(t,e){y[e].min=g[e],y[e].max=d[e]})),a.globals.selection=s.selection,\"function\"==typeof a.config.chart.events.selection&&a.config.chart.events.selection(s.ctx,{xaxis:m,yaxis:y})}}},{key:\"panDragging\",value:function(t){var e=t.context,i=this.w,a=e;if(void 0!==i.globals.lastClientPosition.x){var s=i.globals.lastClientPosition.x-a.clientX,r=i.globals.lastClientPosition.y-a.clientY;Math.abs(s)>Math.abs(r)&&s>0?this.moveDirection=\"left\":Math.abs(s)>Math.abs(r)&&s<0?this.moveDirection=\"right\":Math.abs(r)>Math.abs(s)&&r>0?this.moveDirection=\"up\":Math.abs(r)>Math.abs(s)&&r<0&&(this.moveDirection=\"down\")}i.globals.lastClientPosition={x:a.clientX,y:a.clientY};var o=i.globals.isRangeBar?i.globals.minY:i.globals.minX,n=i.globals.isRangeBar?i.globals.maxY:i.globals.maxX;i.config.xaxis.convertedCatToNumeric||a.panScrolled(o,n)}},{key:\"delayedPanScrolled\",value:function(){var t=this.w,e=t.globals.minX,i=t.globals.maxX,a=(t.globals.maxX-t.globals.minX)/2;\"left\"===this.moveDirection?(e=t.globals.minX+a,i=t.globals.maxX+a):\"right\"===this.moveDirection&&(e=t.globals.minX-a,i=t.globals.maxX-a),e=Math.floor(e),i=Math.floor(i),this.updateScrolledChart({xaxis:{min:e,max:i}},e,i)}},{key:\"panScrolled\",value:function(t,e){var i=this.w,a=this.xyRatios,s=x.clone(i.globals.initialConfig.yaxis),r=a.xRatio,o=i.globals.minX,n=i.globals.maxX;i.globals.isRangeBar&&(r=a.invertedYRatio,o=i.globals.minY,n=i.globals.maxY),\"left\"===this.moveDirection?(t=o+i.globals.gridWidth/15*r,e=n+i.globals.gridWidth/15*r):\"right\"===this.moveDirection&&(t=o-i.globals.gridWidth/15*r,e=n-i.globals.gridWidth/15*r),i.globals.isRangeBar||(t<i.globals.initialMinX||e>i.globals.initialMaxX)&&(t=o,e=n);var l={min:t,max:e};i.config.chart.zoom.autoScaleYaxis&&(s=new _(this.ctx).autoScaleY(this.ctx,s,{xaxis:l}));var h={xaxis:{min:t,max:e}};i.config.chart.group||(h.yaxis=s),this.updateScrolledChart(h,t,e)}},{key:\"updateScrolledChart\",value:function(t,e,i){var a=this.w;this.ctx.updateHelpers._updateOptions(t,!1,!1),\"function\"==typeof a.config.chart.events.scrolled&&a.config.chart.events.scrolled(this.ctx,{xaxis:{min:e,max:i}})}}]),i}(ht),dt=function(){function t(e){a(this,t),this.w=e.w,this.ttCtx=e,this.ctx=e.ctx}return r(t,[{key:\"getNearestValues\",value:function(t){var e=t.hoverArea,i=t.elGrid,a=t.clientX,s=t.clientY,r=this.w,o=i.getBoundingClientRect(),n=o.width,l=o.height,h=n/(r.globals.dataPoints-1),c=l/r.globals.dataPoints,d=this.hasBars();!r.globals.comboCharts&&!d||r.config.xaxis.convertedCatToNumeric||(h=n/r.globals.dataPoints);var g=a-o.left-r.globals.barPadForNumericAxis,u=s-o.top;g<0||u<0||g>n||u>l?(e.classList.remove(\"hovering-zoom\"),e.classList.remove(\"hovering-pan\")):r.globals.zoomEnabled?(e.classList.remove(\"hovering-pan\"),e.classList.add(\"hovering-zoom\")):r.globals.panEnabled&&(e.classList.remove(\"hovering-zoom\"),e.classList.add(\"hovering-pan\"));var f=Math.round(g/h),p=Math.floor(u/c);d&&!r.config.xaxis.convertedCatToNumeric&&(f=Math.ceil(g/h),f-=1);var b=null,v=null,m=[],y=[];if(r.globals.seriesXvalues.forEach((function(t){m.push([t[0]+1e-6].concat(t))})),r.globals.seriesYvalues.forEach((function(t){y.push([t[0]+1e-6].concat(t))})),m=m.map((function(t){return t.filter((function(t){return x.isNumber(t)}))})),y=y.map((function(t){return t.filter((function(t){return x.isNumber(t)}))})),r.globals.isXNumeric){var w=this.ttCtx.getElGrid().getBoundingClientRect(),k=g*(w.width/n),A=u*(w.height/l);b=(v=this.closestInMultiArray(k,A,m,y)).index,f=v.j,null!==b&&(m=r.globals.seriesXvalues[b],f=(v=this.closestInArray(k,m)).index)}return r.globals.capturedSeriesIndex=null===b?-1:b,(!f||f<1)&&(f=0),r.globals.isBarHorizontal?r.globals.capturedDataPointIndex=p:r.globals.capturedDataPointIndex=f,{capturedSeries:b,j:r.globals.isBarHorizontal?p:f,hoverX:g,hoverY:u}}},{key:\"closestInMultiArray\",value:function(t,e,i,a){var s=this.w,r=0,o=null,n=-1;s.globals.series.length>1?r=this.getFirstActiveXArray(i):o=0;var l=i[r][0],h=Math.abs(t-l);if(i.forEach((function(e){e.forEach((function(e,i){var a=Math.abs(t-e);a<h&&(h=a,n=i)}))})),-1!==n){var c=a[r][n],d=Math.abs(e-c);o=r,a.forEach((function(t,i){var a=Math.abs(e-t[n]);a<d&&(d=a,o=i)}))}return{index:o,j:n}}},{key:\"getFirstActiveXArray\",value:function(t){for(var e=this.w,i=0,a=t.map((function(t,e){return t.length>0?e:-1})),s=0;s<a.length;s++)if(-1!==a[s]&&-1===e.globals.collapsedSeriesIndices.indexOf(s)&&-1===e.globals.ancillaryCollapsedSeriesIndices.indexOf(s)){i=a[s];break}return i}},{key:\"closestInArray\",value:function(t,e){for(var i=e[0],a=null,s=Math.abs(t-i),r=0;r<e.length;r++){var o=Math.abs(t-e[r]);o<s&&(s=o,a=r)}return{index:a}}},{key:\"isXoverlap\",value:function(t){var e=[],i=this.w.globals.seriesX.filter((function(t){return void 0!==t[0]}));if(i.length>0)for(var a=0;a<i.length-1;a++)void 0!==i[a][t]&&void 0!==i[a+1][t]&&i[a][t]!==i[a+1][t]&&e.push(\"unEqual\");return 0===e.length}},{key:\"isInitialSeriesSameLen\",value:function(){for(var t=!0,e=this.w.globals.initialSeries,i=0;i<e.length-1;i++)if(e[i].data.length!==e[i+1].data.length){t=!1;break}return t}},{key:\"getBarsHeight\",value:function(t){return u(t).reduce((function(t,e){return t+e.getBBox().height}),0)}},{key:\"getElMarkers\",value:function(t){return\"number\"==typeof t?this.w.globals.dom.baseEl.querySelectorAll(\".apexcharts-series[data\\\\:realIndex='\".concat(t,\"'] .apexcharts-series-markers-wrap > *\")):this.w.globals.dom.baseEl.querySelectorAll(\".apexcharts-series-markers-wrap > *\")}},{key:\"getAllMarkers\",value:function(){var t=this.w.globals.dom.baseEl.querySelectorAll(\".apexcharts-series-markers-wrap\");(t=u(t)).sort((function(t,e){var i=Number(t.getAttribute(\"data:realIndex\")),a=Number(e.getAttribute(\"data:realIndex\"));return a<i?1:a>i?-1:0}));var e=[];return t.forEach((function(t){e.push(t.querySelector(\".apexcharts-marker\"))})),e}},{key:\"hasMarkers\",value:function(t){return this.getElMarkers(t).length>0}},{key:\"getElBars\",value:function(){return this.w.globals.dom.baseEl.querySelectorAll(\".apexcharts-bar-series,  .apexcharts-candlestick-series, .apexcharts-boxPlot-series, .apexcharts-rangebar-series\")}},{key:\"hasBars\",value:function(){return this.getElBars().length>0}},{key:\"getHoverMarkerSize\",value:function(t){var e=this.w,i=e.config.markers.hover.size;return void 0===i&&(i=e.globals.markers.size[t]+e.config.markers.hover.sizeOffset),i}},{key:\"toggleAllTooltipSeriesGroups\",value:function(t){var e=this.w,i=this.ttCtx;0===i.allTooltipSeriesGroups.length&&(i.allTooltipSeriesGroups=e.globals.dom.baseEl.querySelectorAll(\".apexcharts-tooltip-series-group\"));for(var a=i.allTooltipSeriesGroups,s=0;s<a.length;s++)\"enable\"===t?(a[s].classList.add(\"apexcharts-active\"),a[s].style.display=e.config.tooltip.items.display):(a[s].classList.remove(\"apexcharts-active\"),a[s].style.display=\"none\")}}]),t}(),gt=function(){function t(e){a(this,t),this.w=e.w,this.ctx=e.ctx,this.ttCtx=e,this.tooltipUtil=new dt(e)}return r(t,[{key:\"drawSeriesTexts\",value:function(t){var e=t.shared,i=void 0===e||e,a=t.ttItems,s=t.i,r=void 0===s?0:s,o=t.j,n=void 0===o?null:o,l=t.y1,h=t.y2,c=t.e,d=this.w;void 0!==d.config.tooltip.custom?this.handleCustomTooltip({i:r,j:n,y1:l,y2:h,w:d}):this.toggleActiveInactiveSeries(i);var g=this.getValuesToPrint({i:r,j:n});this.printLabels({i:r,j:n,values:g,ttItems:a,shared:i,e:c});var u=this.ttCtx.getElTooltip();this.ttCtx.tooltipRect.ttWidth=u.getBoundingClientRect().width,this.ttCtx.tooltipRect.ttHeight=u.getBoundingClientRect().height}},{key:\"printLabels\",value:function(t){var i,a=this,s=t.i,r=t.j,o=t.values,n=t.ttItems,l=t.shared,h=t.e,c=this.w,d=[],g=function(t){return c.globals.seriesGoals[t]&&c.globals.seriesGoals[t][r]&&Array.isArray(c.globals.seriesGoals[t][r])},u=o.xVal,f=o.zVal,p=o.xAxisTTVal,x=\"\",b=c.globals.colors[s];null!==r&&c.config.plotOptions.bar.distributed&&(b=c.globals.colors[r]);for(var v=function(t,o){var v=a.getFormatters(s);x=a.getSeriesName({fn:v.yLbTitleFormatter,index:s,seriesIndex:s,j:r}),\"treemap\"===c.config.chart.type&&(x=v.yLbTitleFormatter(String(c.config.series[s].data[r].x),{series:c.globals.series,seriesIndex:s,dataPointIndex:r,w:c}));var m=c.config.tooltip.inverseOrder?o:t;if(c.globals.axisCharts){var y=function(t){var e,i,a,s;return c.globals.isRangeData?v.yLbFormatter(null===(e=c.globals.seriesRangeStart)||void 0===e||null===(i=e[t])||void 0===i?void 0:i[r],{series:c.globals.seriesRangeStart,seriesIndex:t,dataPointIndex:r,w:c})+\" - \"+v.yLbFormatter(null===(a=c.globals.seriesRangeEnd)||void 0===a||null===(s=a[t])||void 0===s?void 0:s[r],{series:c.globals.seriesRangeEnd,seriesIndex:t,dataPointIndex:r,w:c}):v.yLbFormatter(c.globals.series[t][r],{series:c.globals.series,seriesIndex:t,dataPointIndex:r,w:c})};if(l)v=a.getFormatters(m),x=a.getSeriesName({fn:v.yLbTitleFormatter,index:m,seriesIndex:s,j:r}),b=c.globals.colors[m],i=y(m),g(m)&&(d=c.globals.seriesGoals[m][r].map((function(t){return{attrs:t,val:v.yLbFormatter(t.value,{seriesIndex:m,dataPointIndex:r,w:c})}})));else{var w,k=null==h||null===(w=h.target)||void 0===w?void 0:w.getAttribute(\"fill\");k&&(b=-1!==k.indexOf(\"url\")?document.querySelector(k.substr(4).slice(0,-1)).childNodes[0].getAttribute(\"stroke\"):k),i=y(s),g(s)&&Array.isArray(c.globals.seriesGoals[s][r])&&(d=c.globals.seriesGoals[s][r].map((function(t){return{attrs:t,val:v.yLbFormatter(t.value,{seriesIndex:s,dataPointIndex:r,w:c})}})))}}null===r&&(i=v.yLbFormatter(c.globals.series[s],e(e({},c),{},{seriesIndex:s,dataPointIndex:s}))),a.DOMHandling({i:s,t:m,j:r,ttItems:n,values:{val:i,goalVals:d,xVal:u,xAxisTTVal:p,zVal:f},seriesName:x,shared:l,pColor:b})},m=0,y=c.globals.series.length-1;m<c.globals.series.length;m++,y--)v(m,y)}},{key:\"getFormatters\",value:function(t){var e,i=this.w,a=i.globals.yLabelFormatters[t];return void 0!==i.globals.ttVal?Array.isArray(i.globals.ttVal)?(a=i.globals.ttVal[t]&&i.globals.ttVal[t].formatter,e=i.globals.ttVal[t]&&i.globals.ttVal[t].title&&i.globals.ttVal[t].title.formatter):(a=i.globals.ttVal.formatter,\"function\"==typeof i.globals.ttVal.title.formatter&&(e=i.globals.ttVal.title.formatter)):e=i.config.tooltip.y.title.formatter,\"function\"!=typeof a&&(a=i.globals.yLabelFormatters[0]?i.globals.yLabelFormatters[0]:function(t){return t}),\"function\"!=typeof e&&(e=function(t){return t}),{yLbFormatter:a,yLbTitleFormatter:e}}},{key:\"getSeriesName\",value:function(t){var e=t.fn,i=t.index,a=t.seriesIndex,s=t.j,r=this.w;return e(String(r.globals.seriesNames[i]),{series:r.globals.series,seriesIndex:a,dataPointIndex:s,w:r})}},{key:\"DOMHandling\",value:function(t){t.i;var e=t.t,i=t.j,a=t.ttItems,s=t.values,r=t.seriesName,o=t.shared,n=t.pColor,l=this.w,h=this.ttCtx,c=s.val,d=s.goalVals,g=s.xVal,u=s.xAxisTTVal,f=s.zVal,p=null;p=a[e].children,l.config.tooltip.fillSeriesColor&&(a[e].style.backgroundColor=n,p[0].style.display=\"none\"),h.showTooltipTitle&&(null===h.tooltipTitle&&(h.tooltipTitle=l.globals.dom.baseEl.querySelector(\".apexcharts-tooltip-title\")),h.tooltipTitle.innerHTML=g),h.isXAxisTooltipEnabled&&(h.xaxisTooltipText.innerHTML=\"\"!==u?u:g);var x=a[e].querySelector(\".apexcharts-tooltip-text-y-label\");x&&(x.innerHTML=r||\"\");var b=a[e].querySelector(\".apexcharts-tooltip-text-y-value\");b&&(b.innerHTML=void 0!==c?c:\"\"),p[0]&&p[0].classList.contains(\"apexcharts-tooltip-marker\")&&(l.config.tooltip.marker.fillColors&&Array.isArray(l.config.tooltip.marker.fillColors)&&(n=l.config.tooltip.marker.fillColors[e]),p[0].style.backgroundColor=n),l.config.tooltip.marker.show||(p[0].style.display=\"none\");var v=a[e].querySelector(\".apexcharts-tooltip-text-goals-label\"),m=a[e].querySelector(\".apexcharts-tooltip-text-goals-value\");if(d.length&&l.globals.seriesGoals[e]){var y=function(){var t=\"<div >\",e=\"<div>\";d.forEach((function(i,a){t+=' <div style=\"display: flex\"><span class=\"apexcharts-tooltip-marker\" style=\"background-color: '.concat(i.attrs.strokeColor,'; height: 3px; border-radius: 0; top: 5px;\"></span> ').concat(i.attrs.name,\"</div>\"),e+=\"<div>\".concat(i.val,\"</div>\")})),v.innerHTML=t+\"</div>\",m.innerHTML=e+\"</div>\"};o?l.globals.seriesGoals[e][i]&&Array.isArray(l.globals.seriesGoals[e][i])?y():(v.innerHTML=\"\",m.innerHTML=\"\"):y()}else v.innerHTML=\"\",m.innerHTML=\"\";null!==f&&(a[e].querySelector(\".apexcharts-tooltip-text-z-label\").innerHTML=l.config.tooltip.z.title,a[e].querySelector(\".apexcharts-tooltip-text-z-value\").innerHTML=void 0!==f?f:\"\");o&&p[0]&&(null==c||l.globals.ancillaryCollapsedSeriesIndices.indexOf(e)>-1||l.globals.collapsedSeriesIndices.indexOf(e)>-1?p[0].parentNode.style.display=\"none\":p[0].parentNode.style.display=l.config.tooltip.items.display)}},{key:\"toggleActiveInactiveSeries\",value:function(t){var e=this.w;if(t)this.tooltipUtil.toggleAllTooltipSeriesGroups(\"enable\");else{this.tooltipUtil.toggleAllTooltipSeriesGroups(\"disable\");var i=e.globals.dom.baseEl.querySelector(\".apexcharts-tooltip-series-group\");i&&(i.classList.add(\"apexcharts-active\"),i.style.display=e.config.tooltip.items.display)}}},{key:\"getValuesToPrint\",value:function(t){var e=t.i,i=t.j,a=this.w,s=this.ctx.series.filteredSeriesX(),r=\"\",o=\"\",n=null,l=null,h={series:a.globals.series,seriesIndex:e,dataPointIndex:i,w:a},c=a.globals.ttZFormatter;null===i?l=a.globals.series[e]:a.globals.isXNumeric&&\"treemap\"!==a.config.chart.type?(r=s[e][i],0===s[e].length&&(r=s[this.tooltipUtil.getFirstActiveXArray(s)][i])):r=void 0!==a.globals.labels[i]?a.globals.labels[i]:\"\";var d=r;a.globals.isXNumeric&&\"datetime\"===a.config.xaxis.type?r=new T(this.ctx).xLabelFormat(a.globals.ttKeyFormatter,d,d,{i:void 0,dateFormatter:new I(this.ctx).formatDate,w:this.w}):r=a.globals.isBarHorizontal?a.globals.yLabelFormatters[0](d,h):a.globals.xLabelFormatter(d,h);return void 0!==a.config.tooltip.x.formatter&&(r=a.globals.ttKeyFormatter(d,h)),a.globals.seriesZ.length>0&&a.globals.seriesZ[e].length>0&&(n=c(a.globals.seriesZ[e][i],a)),o=\"function\"==typeof a.config.xaxis.tooltip.formatter?a.globals.xaxisTooltipFormatter(d,h):r,{val:Array.isArray(l)?l.join(\" \"):l,xVal:Array.isArray(r)?r.join(\" \"):r,xAxisTTVal:Array.isArray(o)?o.join(\" \"):o,zVal:n}}},{key:\"handleCustomTooltip\",value:function(t){var e=t.i,i=t.j,a=t.y1,s=t.y2,r=t.w,o=this.ttCtx.getElTooltip(),n=r.config.tooltip.custom;Array.isArray(n)&&n[e]&&(n=n[e]),o.innerHTML=n({ctx:this.ctx,series:r.globals.series,seriesIndex:e,dataPointIndex:i,y1:a,y2:s,w:r})}}]),t}(),ut=function(){function t(e){a(this,t),this.ttCtx=e,this.ctx=e.ctx,this.w=e.w}return r(t,[{key:\"moveXCrosshairs\",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,i=this.ttCtx,a=this.w,s=i.getElXCrosshairs(),r=t-i.xcrosshairsWidth/2,o=a.globals.labels.slice().length;if(null!==e&&(r=a.globals.gridWidth/o*e),null===s||a.globals.isBarHorizontal||(s.setAttribute(\"x\",r),s.setAttribute(\"x1\",r),s.setAttribute(\"x2\",r),s.setAttribute(\"y2\",a.globals.gridHeight),s.classList.add(\"apexcharts-active\")),r<0&&(r=0),r>a.globals.gridWidth&&(r=a.globals.gridWidth),i.isXAxisTooltipEnabled){var n=r;\"tickWidth\"!==a.config.xaxis.crosshairs.width&&\"barWidth\"!==a.config.xaxis.crosshairs.width||(n=r+i.xcrosshairsWidth/2),this.moveXAxisTooltip(n)}}},{key:\"moveYCrosshairs\",value:function(t){var e=this.ttCtx;null!==e.ycrosshairs&&m.setAttrs(e.ycrosshairs,{y1:t,y2:t}),null!==e.ycrosshairsHidden&&m.setAttrs(e.ycrosshairsHidden,{y1:t,y2:t})}},{key:\"moveXAxisTooltip\",value:function(t){var e=this.w,i=this.ttCtx;if(null!==i.xaxisTooltip&&0!==i.xcrosshairsWidth){i.xaxisTooltip.classList.add(\"apexcharts-active\");var a=i.xaxisOffY+e.config.xaxis.tooltip.offsetY+e.globals.translateY+1+e.config.xaxis.offsetY;if(t-=i.xaxisTooltip.getBoundingClientRect().width/2,!isNaN(t)){t+=e.globals.translateX;var s;s=new m(this.ctx).getTextRects(i.xaxisTooltipText.innerHTML),i.xaxisTooltipText.style.minWidth=s.width+\"px\",i.xaxisTooltip.style.left=t+\"px\",i.xaxisTooltip.style.top=a+\"px\"}}}},{key:\"moveYAxisTooltip\",value:function(t){var e=this.w,i=this.ttCtx;null===i.yaxisTTEls&&(i.yaxisTTEls=e.globals.dom.baseEl.querySelectorAll(\".apexcharts-yaxistooltip\"));var a=parseInt(i.ycrosshairsHidden.getAttribute(\"y1\"),10),s=e.globals.translateY+a,r=i.yaxisTTEls[t].getBoundingClientRect().height,o=e.globals.translateYAxisX[t]-2;e.config.yaxis[t].opposite&&(o-=26),s-=r/2,-1===e.globals.ignoreYAxisIndexes.indexOf(t)?(i.yaxisTTEls[t].classList.add(\"apexcharts-active\"),i.yaxisTTEls[t].style.top=s+\"px\",i.yaxisTTEls[t].style.left=o+e.config.yaxis[t].tooltip.offsetX+\"px\"):i.yaxisTTEls[t].classList.remove(\"apexcharts-active\")}},{key:\"moveTooltip\",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,a=this.w,s=this.ttCtx,r=s.getElTooltip(),o=s.tooltipRect,n=null!==i?parseFloat(i):1,l=parseFloat(t)+n+5,h=parseFloat(e)+n/2;if(l>a.globals.gridWidth/2&&(l=l-o.ttWidth-n-10),l>a.globals.gridWidth-o.ttWidth-10&&(l=a.globals.gridWidth-o.ttWidth),l<-20&&(l=-20),a.config.tooltip.followCursor){var c=s.getElGrid().getBoundingClientRect();(l=s.e.clientX-c.left)>a.globals.gridWidth/2&&(l-=s.tooltipRect.ttWidth),(h=s.e.clientY+a.globals.translateY-c.top)>a.globals.gridHeight/2&&(h-=s.tooltipRect.ttHeight)}else a.globals.isBarHorizontal||o.ttHeight/2+h>a.globals.gridHeight&&(h=a.globals.gridHeight-o.ttHeight+a.globals.translateY);isNaN(l)||(l+=a.globals.translateX,r.style.left=l+\"px\",r.style.top=h+\"px\")}},{key:\"moveMarkers\",value:function(t,e){var i=this.w,a=this.ttCtx;if(i.globals.markers.size[t]>0)for(var s=i.globals.dom.baseEl.querySelectorAll(\" .apexcharts-series[data\\\\:realIndex='\".concat(t,\"'] .apexcharts-marker\")),r=0;r<s.length;r++)parseInt(s[r].getAttribute(\"rel\"),10)===e&&(a.marker.resetPointsSize(),a.marker.enlargeCurrentPoint(e,s[r]));else a.marker.resetPointsSize(),this.moveDynamicPointOnHover(e,t)}},{key:\"moveDynamicPointOnHover\",value:function(t,e){var i,a,s=this.w,r=this.ttCtx,o=s.globals.pointsArray,n=r.tooltipUtil.getHoverMarkerSize(e),l=s.config.series[e].type;if(!l||\"column\"!==l&&\"candlestick\"!==l&&\"boxPlot\"!==l){i=o[e][t][0],a=o[e][t][1]?o[e][t][1]:0;var h=s.globals.dom.baseEl.querySelector(\".apexcharts-series[data\\\\:realIndex='\".concat(e,\"'] .apexcharts-series-markers circle\"));h&&a<s.globals.gridHeight&&a>0&&(h.setAttribute(\"r\",n),h.setAttribute(\"cx\",i),h.setAttribute(\"cy\",a)),this.moveXCrosshairs(i),r.fixedTooltip||this.moveTooltip(i,a,n)}}},{key:\"moveDynamicPointsOnHover\",value:function(t){var e,i=this.ttCtx,a=i.w,s=0,r=0,o=a.globals.pointsArray;e=new N(this.ctx).getActiveConfigSeriesIndex(\"asc\",[\"line\",\"area\",\"scatter\",\"bubble\"]);var n=i.tooltipUtil.getHoverMarkerSize(e);o[e]&&(s=o[e][t][0],r=o[e][t][1]);var l=i.tooltipUtil.getAllMarkers();if(null!==l)for(var h=0;h<a.globals.series.length;h++){var c=o[h];if(a.globals.comboCharts&&void 0===c&&l.splice(h,0,null),c&&c.length){var d=o[h][t][1],g=void 0;if(l[h].setAttribute(\"cx\",s),\"rangeArea\"===a.config.chart.type&&!a.globals.comboCharts){var u=t+a.globals.series[h].length;g=o[h][u][1],d-=Math.abs(d-g)/2}null!==d&&!isNaN(d)&&d<a.globals.gridHeight+n&&d+n>0?(l[h]&&l[h].setAttribute(\"r\",n),l[h]&&l[h].setAttribute(\"cy\",d)):l[h]&&l[h].setAttribute(\"r\",0)}}this.moveXCrosshairs(s),i.fixedTooltip||this.moveTooltip(s,r||a.globals.gridHeight,n)}},{key:\"moveStickyTooltipOverBars\",value:function(t,e){var i=this.w,a=this.ttCtx,s=i.globals.columnSeries?i.globals.columnSeries.length:i.globals.series.length,r=s>=2&&s%2==0?Math.floor(s/2):Math.floor(s/2)+1;i.globals.isBarHorizontal&&(r=new N(this.ctx).getActiveConfigSeriesIndex(\"desc\")+1);var o=i.globals.dom.baseEl.querySelector(\".apexcharts-bar-series .apexcharts-series[rel='\".concat(r,\"'] path[j='\").concat(t,\"'], .apexcharts-candlestick-series .apexcharts-series[rel='\").concat(r,\"'] path[j='\").concat(t,\"'], .apexcharts-boxPlot-series .apexcharts-series[rel='\").concat(r,\"'] path[j='\").concat(t,\"'], .apexcharts-rangebar-series .apexcharts-series[rel='\").concat(r,\"'] path[j='\").concat(t,\"']\"));o||\"number\"!=typeof e||(o=i.globals.dom.baseEl.querySelector(\".apexcharts-bar-series .apexcharts-series[data\\\\:realIndex='\".concat(e,\"'] path[j='\").concat(t,\"'],\\n        .apexcharts-candlestick-series .apexcharts-series[data\\\\:realIndex='\").concat(e,\"'] path[j='\").concat(t,\"'],\\n        .apexcharts-boxPlot-series .apexcharts-series[data\\\\:realIndex='\").concat(e,\"'] path[j='\").concat(t,\"'],\\n        .apexcharts-rangebar-series .apexcharts-series[data\\\\:realIndex='\").concat(e,\"'] path[j='\").concat(t,\"']\")));var n=o?parseFloat(o.getAttribute(\"cx\")):0,l=o?parseFloat(o.getAttribute(\"cy\")):0,h=o?parseFloat(o.getAttribute(\"barWidth\")):0,c=a.getElGrid().getBoundingClientRect(),d=o&&(o.classList.contains(\"apexcharts-candlestick-area\")||o.classList.contains(\"apexcharts-boxPlot-area\"));i.globals.isXNumeric?(o&&!d&&(n-=s%2!=0?h/2:0),o&&d&&i.globals.comboCharts&&(n-=h/2)):i.globals.isBarHorizontal||(n=a.xAxisTicksPositions[t-1]+a.dataPointsDividedWidth/2,isNaN(n)&&(n=a.xAxisTicksPositions[t]-a.dataPointsDividedWidth/2)),i.globals.isBarHorizontal?l-=a.tooltipRect.ttHeight:i.config.tooltip.followCursor?l=a.e.clientY-c.top-a.tooltipRect.ttHeight/2:l+a.tooltipRect.ttHeight+15>i.globals.gridHeight&&(l=i.globals.gridHeight),i.globals.isBarHorizontal||this.moveXCrosshairs(n),a.fixedTooltip||this.moveTooltip(n,l||i.globals.gridHeight)}}]),t}(),ft=function(){function t(e){a(this,t),this.w=e.w,this.ttCtx=e,this.ctx=e.ctx,this.tooltipPosition=new ut(e)}return r(t,[{key:\"drawDynamicPoints\",value:function(){var t=this.w,e=new m(this.ctx),i=new D(this.ctx),a=t.globals.dom.baseEl.querySelectorAll(\".apexcharts-series\");a=u(a),t.config.chart.stacked&&a.sort((function(t,e){return parseFloat(t.getAttribute(\"data:realIndex\"))-parseFloat(e.getAttribute(\"data:realIndex\"))}));for(var s=0;s<a.length;s++){var r=a[s].querySelector(\".apexcharts-series-markers-wrap\");if(null!==r){var o=void 0,n=\"apexcharts-marker w\".concat((Math.random()+1).toString(36).substring(4));\"line\"!==t.config.chart.type&&\"area\"!==t.config.chart.type||t.globals.comboCharts||t.config.tooltip.intersect||(n+=\" no-pointer-events\");var l=i.getMarkerConfig({cssClass:n,seriesIndex:Number(r.getAttribute(\"data:realIndex\"))});(o=e.drawMarker(0,0,l)).node.setAttribute(\"default-marker-size\",0);var h=document.createElementNS(t.globals.SVGNS,\"g\");h.classList.add(\"apexcharts-series-markers\"),h.appendChild(o.node),r.appendChild(h)}}}},{key:\"enlargeCurrentPoint\",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,s=this.w;\"bubble\"!==s.config.chart.type&&this.newPointSize(t,e);var r=e.getAttribute(\"cx\"),o=e.getAttribute(\"cy\");if(null!==i&&null!==a&&(r=i,o=a),this.tooltipPosition.moveXCrosshairs(r),!this.fixedTooltip){if(\"radar\"===s.config.chart.type){var n=this.ttCtx.getElGrid().getBoundingClientRect();r=this.ttCtx.e.clientX-n.left}this.tooltipPosition.moveTooltip(r,o,s.config.markers.hover.size)}}},{key:\"enlargePoints\",value:function(t){for(var e=this.w,i=this,a=this.ttCtx,s=t,r=e.globals.dom.baseEl.querySelectorAll(\".apexcharts-series:not(.apexcharts-series-collapsed) .apexcharts-marker\"),o=e.config.markers.hover.size,n=0;n<r.length;n++){var l=r[n].getAttribute(\"rel\"),h=r[n].getAttribute(\"index\");if(void 0===o&&(o=e.globals.markers.size[h]+e.config.markers.hover.sizeOffset),s===parseInt(l,10)){i.newPointSize(s,r[n]);var c=r[n].getAttribute(\"cx\"),d=r[n].getAttribute(\"cy\");i.tooltipPosition.moveXCrosshairs(c),a.fixedTooltip||i.tooltipPosition.moveTooltip(c,d,o)}else i.oldPointSize(r[n])}}},{key:\"newPointSize\",value:function(t,e){var i=this.w,a=i.config.markers.hover.size,s=0===t?e.parentNode.firstChild:e.parentNode.lastChild;if(\"0\"!==s.getAttribute(\"default-marker-size\")){var r=parseInt(s.getAttribute(\"index\"),10);void 0===a&&(a=i.globals.markers.size[r]+i.config.markers.hover.sizeOffset),a<0&&(a=0),s.setAttribute(\"r\",a)}}},{key:\"oldPointSize\",value:function(t){var e=parseFloat(t.getAttribute(\"default-marker-size\"));t.setAttribute(\"r\",e)}},{key:\"resetPointsSize\",value:function(){for(var t=this.w.globals.dom.baseEl.querySelectorAll(\".apexcharts-series:not(.apexcharts-series-collapsed) .apexcharts-marker\"),e=0;e<t.length;e++){var i=parseFloat(t[e].getAttribute(\"default-marker-size\"));x.isNumber(i)&&i>=0?t[e].setAttribute(\"r\",i):t[e].setAttribute(\"r\",0)}}}]),t}(),pt=function(){function t(e){a(this,t),this.w=e.w,this.ttCtx=e}return r(t,[{key:\"getAttr\",value:function(t,e){return parseFloat(t.target.getAttribute(e))}},{key:\"handleHeatTreeTooltip\",value:function(t){var e=t.e,i=t.opt,a=t.x,s=t.y,r=t.type,o=this.ttCtx,n=this.w;if(e.target.classList.contains(\"apexcharts-\".concat(r,\"-rect\"))){var l=this.getAttr(e,\"i\"),h=this.getAttr(e,\"j\"),c=this.getAttr(e,\"cx\"),d=this.getAttr(e,\"cy\"),g=this.getAttr(e,\"width\"),u=this.getAttr(e,\"height\");if(o.tooltipLabels.drawSeriesTexts({ttItems:i.ttItems,i:l,j:h,shared:!1,e:e}),n.globals.capturedSeriesIndex=l,n.globals.capturedDataPointIndex=h,a=c+o.tooltipRect.ttWidth/2+g,s=d+o.tooltipRect.ttHeight/2-u/2,o.tooltipPosition.moveXCrosshairs(c+g/2),a>n.globals.gridWidth/2&&(a=c-o.tooltipRect.ttWidth/2+g),o.w.config.tooltip.followCursor){var f=n.globals.dom.elWrap.getBoundingClientRect();a=n.globals.clientX-f.left-(a>n.globals.gridWidth/2?o.tooltipRect.ttWidth:0),s=n.globals.clientY-f.top-(s>n.globals.gridHeight/2?o.tooltipRect.ttHeight:0)}}return{x:a,y:s}}},{key:\"handleMarkerTooltip\",value:function(t){var e,i,a=t.e,s=t.opt,r=t.x,o=t.y,n=this.w,l=this.ttCtx;if(a.target.classList.contains(\"apexcharts-marker\")){var h=parseInt(s.paths.getAttribute(\"cx\"),10),c=parseInt(s.paths.getAttribute(\"cy\"),10),d=parseFloat(s.paths.getAttribute(\"val\"));if(i=parseInt(s.paths.getAttribute(\"rel\"),10),e=parseInt(s.paths.parentNode.parentNode.parentNode.getAttribute(\"rel\"),10)-1,l.intersect){var g=x.findAncestor(s.paths,\"apexcharts-series\");g&&(e=parseInt(g.getAttribute(\"data:realIndex\"),10))}if(l.tooltipLabels.drawSeriesTexts({ttItems:s.ttItems,i:e,j:i,shared:!l.showOnIntersect&&n.config.tooltip.shared,e:a}),\"mouseup\"===a.type&&l.markerClick(a,e,i),n.globals.capturedSeriesIndex=e,n.globals.capturedDataPointIndex=i,r=h,o=c+n.globals.translateY-1.4*l.tooltipRect.ttHeight,l.w.config.tooltip.followCursor){var u=l.getElGrid().getBoundingClientRect();o=l.e.clientY+n.globals.translateY-u.top}d<0&&(o=c),l.marker.enlargeCurrentPoint(i,s.paths,r,o)}return{x:r,y:o}}},{key:\"handleBarTooltip\",value:function(t){var e,i,a=t.e,s=t.opt,r=this.w,o=this.ttCtx,n=o.getElTooltip(),l=0,h=0,c=0,d=this.getBarTooltipXY({e:a,opt:s});e=d.i;var g=d.barHeight,u=d.j;r.globals.capturedSeriesIndex=e,r.globals.capturedDataPointIndex=u,r.globals.isBarHorizontal&&o.tooltipUtil.hasBars()||!r.config.tooltip.shared?(h=d.x,c=d.y,i=Array.isArray(r.config.stroke.width)?r.config.stroke.width[e]:r.config.stroke.width,l=h):r.globals.comboCharts||r.config.tooltip.shared||(l/=2),isNaN(c)&&(c=r.globals.svgHeight-o.tooltipRect.ttHeight);var f=parseInt(s.paths.parentNode.getAttribute(\"data:realIndex\"),10),p=r.globals.isMultipleYAxis?r.config.yaxis[f]&&r.config.yaxis[f].reversed:r.config.yaxis[0].reversed;if(h+o.tooltipRect.ttWidth>r.globals.gridWidth&&!p?h-=o.tooltipRect.ttWidth:h<0&&(h=0),o.w.config.tooltip.followCursor){var x=o.getElGrid().getBoundingClientRect();c=o.e.clientY-x.top}null===o.tooltip&&(o.tooltip=r.globals.dom.baseEl.querySelector(\".apexcharts-tooltip\")),r.config.tooltip.shared||(r.globals.comboBarCount>0?o.tooltipPosition.moveXCrosshairs(l+i/2):o.tooltipPosition.moveXCrosshairs(l)),!o.fixedTooltip&&(!r.config.tooltip.shared||r.globals.isBarHorizontal&&o.tooltipUtil.hasBars())&&(p&&(h-=o.tooltipRect.ttWidth)<0&&(h=0),!p||r.globals.isBarHorizontal&&o.tooltipUtil.hasBars()||(c=c+g-2*(r.globals.series[e][u]<0?g:0)),c=c+r.globals.translateY-o.tooltipRect.ttHeight/2,n.style.left=h+r.globals.translateX+\"px\",n.style.top=c+\"px\")}},{key:\"getBarTooltipXY\",value:function(t){var e=t.e,i=t.opt,a=this.w,s=null,r=this.ttCtx,o=0,n=0,l=0,h=0,c=0,d=e.target.classList;if(d.contains(\"apexcharts-bar-area\")||d.contains(\"apexcharts-candlestick-area\")||d.contains(\"apexcharts-boxPlot-area\")||d.contains(\"apexcharts-rangebar-area\")){var g=e.target,u=g.getBoundingClientRect(),f=i.elGrid.getBoundingClientRect(),p=u.height;c=u.height;var x=u.width,b=parseInt(g.getAttribute(\"cx\"),10),v=parseInt(g.getAttribute(\"cy\"),10);h=parseFloat(g.getAttribute(\"barWidth\"));var m=\"touchmove\"===e.type?e.touches[0].clientX:e.clientX;s=parseInt(g.getAttribute(\"j\"),10),o=parseInt(g.parentNode.getAttribute(\"rel\"),10)-1;var y=g.getAttribute(\"data-range-y1\"),w=g.getAttribute(\"data-range-y2\");a.globals.comboCharts&&(o=parseInt(g.parentNode.getAttribute(\"data:realIndex\"),10)),r.tooltipLabels.drawSeriesTexts({ttItems:i.ttItems,i:o,j:s,y1:y?parseInt(y,10):null,y2:w?parseInt(w,10):null,shared:!r.showOnIntersect&&a.config.tooltip.shared,e:e}),a.config.tooltip.followCursor?a.globals.isBarHorizontal?(n=m-f.left+15,l=v-r.dataPointsDividedHeight+p/2-r.tooltipRect.ttHeight/2):(n=a.globals.isXNumeric?b-x/2:b-r.dataPointsDividedWidth+x/2,l=e.clientY-f.top-r.tooltipRect.ttHeight/2-15):a.globals.isBarHorizontal?((n=b)<r.xyRatios.baseLineInvertedY&&(n=b-r.tooltipRect.ttWidth),l=v-r.dataPointsDividedHeight+p/2-r.tooltipRect.ttHeight/2):(n=a.globals.isXNumeric?b-x/2:b-r.dataPointsDividedWidth+x/2,l=v)}return{x:n,y:l,barHeight:c,barWidth:h,i:o,j:s}}}]),t}(),xt=function(){function t(e){a(this,t),this.w=e.w,this.ttCtx=e}return r(t,[{key:\"drawXaxisTooltip\",value:function(){var t=this.w,e=this.ttCtx,i=\"bottom\"===t.config.xaxis.position;e.xaxisOffY=i?t.globals.gridHeight+1:-t.globals.xAxisHeight-t.config.xaxis.axisTicks.height+3;var a=i?\"apexcharts-xaxistooltip apexcharts-xaxistooltip-bottom\":\"apexcharts-xaxistooltip apexcharts-xaxistooltip-top\",s=t.globals.dom.elWrap;e.isXAxisTooltipEnabled&&(null===t.globals.dom.baseEl.querySelector(\".apexcharts-xaxistooltip\")&&(e.xaxisTooltip=document.createElement(\"div\"),e.xaxisTooltip.setAttribute(\"class\",a+\" apexcharts-theme-\"+t.config.tooltip.theme),s.appendChild(e.xaxisTooltip),e.xaxisTooltipText=document.createElement(\"div\"),e.xaxisTooltipText.classList.add(\"apexcharts-xaxistooltip-text\"),e.xaxisTooltipText.style.fontFamily=t.config.xaxis.tooltip.style.fontFamily||t.config.chart.fontFamily,e.xaxisTooltipText.style.fontSize=t.config.xaxis.tooltip.style.fontSize,e.xaxisTooltip.appendChild(e.xaxisTooltipText)))}},{key:\"drawYaxisTooltip\",value:function(){for(var t=this.w,e=this.ttCtx,i=function(i){var a=t.config.yaxis[i].opposite||t.config.yaxis[i].crosshairs.opposite;e.yaxisOffX=a?t.globals.gridWidth+1:1;var s=\"apexcharts-yaxistooltip apexcharts-yaxistooltip-\".concat(i,a?\" apexcharts-yaxistooltip-right\":\" apexcharts-yaxistooltip-left\");t.globals.yAxisSameScaleIndices.map((function(e,a){e.map((function(e,a){a===i&&(s+=t.config.yaxis[a].show?\" \":\" apexcharts-yaxistooltip-hidden\")}))}));var r=t.globals.dom.elWrap;null===t.globals.dom.baseEl.querySelector(\".apexcharts-yaxistooltip apexcharts-yaxistooltip-\".concat(i))&&(e.yaxisTooltip=document.createElement(\"div\"),e.yaxisTooltip.setAttribute(\"class\",s+\" apexcharts-theme-\"+t.config.tooltip.theme),r.appendChild(e.yaxisTooltip),0===i&&(e.yaxisTooltipText=[]),e.yaxisTooltipText[i]=document.createElement(\"div\"),e.yaxisTooltipText[i].classList.add(\"apexcharts-yaxistooltip-text\"),e.yaxisTooltip.appendChild(e.yaxisTooltipText[i]))},a=0;a<t.config.yaxis.length;a++)i(a)}},{key:\"setXCrosshairWidth\",value:function(){var t=this.w,e=this.ttCtx,i=e.getElXCrosshairs();if(e.xcrosshairsWidth=parseInt(t.config.xaxis.crosshairs.width,10),t.globals.comboCharts){var a=t.globals.dom.baseEl.querySelector(\".apexcharts-bar-area\");if(null!==a&&\"barWidth\"===t.config.xaxis.crosshairs.width){var s=parseFloat(a.getAttribute(\"barWidth\"));e.xcrosshairsWidth=s}else if(\"tickWidth\"===t.config.xaxis.crosshairs.width){var r=t.globals.labels.length;e.xcrosshairsWidth=t.globals.gridWidth/r}}else if(\"tickWidth\"===t.config.xaxis.crosshairs.width){var o=t.globals.labels.length;e.xcrosshairsWidth=t.globals.gridWidth/o}else if(\"barWidth\"===t.config.xaxis.crosshairs.width){var n=t.globals.dom.baseEl.querySelector(\".apexcharts-bar-area\");if(null!==n){var l=parseFloat(n.getAttribute(\"barWidth\"));e.xcrosshairsWidth=l}else e.xcrosshairsWidth=1}t.globals.isBarHorizontal&&(e.xcrosshairsWidth=0),null!==i&&e.xcrosshairsWidth>0&&i.setAttribute(\"width\",e.xcrosshairsWidth)}},{key:\"handleYCrosshair\",value:function(){var t=this.w,e=this.ttCtx;e.ycrosshairs=t.globals.dom.baseEl.querySelector(\".apexcharts-ycrosshairs\"),e.ycrosshairsHidden=t.globals.dom.baseEl.querySelector(\".apexcharts-ycrosshairs-hidden\")}},{key:\"drawYaxisTooltipText\",value:function(t,e,i){var a=this.ttCtx,s=this.w,r=s.globals.yLabelFormatters[t];if(a.yaxisTooltips[t]){var o=a.getElGrid().getBoundingClientRect(),n=(e-o.top)*i.yRatio[t],l=s.globals.maxYArr[t]-s.globals.minYArr[t],h=s.globals.minYArr[t]+(l-n);a.tooltipPosition.moveYCrosshairs(e-o.top),a.yaxisTooltipText[t].innerHTML=r(h),a.tooltipPosition.moveYAxisTooltip(t)}}}]),t}(),bt=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w;var i=this.w;this.tConfig=i.config.tooltip,this.tooltipUtil=new dt(this),this.tooltipLabels=new gt(this),this.tooltipPosition=new ut(this),this.marker=new ft(this),this.intersect=new pt(this),this.axesTooltip=new xt(this),this.showOnIntersect=this.tConfig.intersect,this.showTooltipTitle=this.tConfig.x.show,this.fixedTooltip=this.tConfig.fixed.enabled,this.xaxisTooltip=null,this.yaxisTTEls=null,this.isBarShared=!i.globals.isBarHorizontal&&this.tConfig.shared,this.lastHoverTime=Date.now()}return r(t,[{key:\"getElTooltip\",value:function(t){return t||(t=this),t.w.globals.dom.baseEl?t.w.globals.dom.baseEl.querySelector(\".apexcharts-tooltip\"):null}},{key:\"getElXCrosshairs\",value:function(){return this.w.globals.dom.baseEl.querySelector(\".apexcharts-xcrosshairs\")}},{key:\"getElGrid\",value:function(){return this.w.globals.dom.baseEl.querySelector(\".apexcharts-grid\")}},{key:\"drawTooltip\",value:function(t){var e=this.w;this.xyRatios=t,this.isXAxisTooltipEnabled=e.config.xaxis.tooltip.enabled&&e.globals.axisCharts,this.yaxisTooltips=e.config.yaxis.map((function(t,i){return!!(t.show&&t.tooltip.enabled&&e.globals.axisCharts)})),this.allTooltipSeriesGroups=[],e.globals.axisCharts||(this.showTooltipTitle=!1);var i=document.createElement(\"div\");if(i.classList.add(\"apexcharts-tooltip\"),e.config.tooltip.cssClass&&i.classList.add(e.config.tooltip.cssClass),i.classList.add(\"apexcharts-theme-\".concat(this.tConfig.theme)),e.globals.dom.elWrap.appendChild(i),e.globals.axisCharts){this.axesTooltip.drawXaxisTooltip(),this.axesTooltip.drawYaxisTooltip(),this.axesTooltip.setXCrosshairWidth(),this.axesTooltip.handleYCrosshair();var a=new V(this.ctx);this.xAxisTicksPositions=a.getXAxisTicksPositions()}if(!e.globals.comboCharts&&!this.tConfig.intersect&&\"rangeBar\"!==e.config.chart.type||this.tConfig.shared||(this.showOnIntersect=!0),0!==e.config.markers.size&&0!==e.globals.markers.largestSize||this.marker.drawDynamicPoints(this),e.globals.collapsedSeries.length!==e.globals.series.length){this.dataPointsDividedHeight=e.globals.gridHeight/e.globals.dataPoints,this.dataPointsDividedWidth=e.globals.gridWidth/e.globals.dataPoints,this.showTooltipTitle&&(this.tooltipTitle=document.createElement(\"div\"),this.tooltipTitle.classList.add(\"apexcharts-tooltip-title\"),this.tooltipTitle.style.fontFamily=this.tConfig.style.fontFamily||e.config.chart.fontFamily,this.tooltipTitle.style.fontSize=this.tConfig.style.fontSize,i.appendChild(this.tooltipTitle));var s=e.globals.series.length;(e.globals.xyCharts||e.globals.comboCharts)&&this.tConfig.shared&&(s=this.showOnIntersect?1:e.globals.series.length),this.legendLabels=e.globals.dom.baseEl.querySelectorAll(\".apexcharts-legend-text\"),this.ttItems=this.createTTElements(s),this.addSVGEvents()}}},{key:\"createTTElements\",value:function(t){for(var e=this,i=this.w,a=[],s=this.getElTooltip(),r=function(r){var o=document.createElement(\"div\");o.classList.add(\"apexcharts-tooltip-series-group\"),o.style.order=i.config.tooltip.inverseOrder?t-r:r+1,e.tConfig.shared&&e.tConfig.enabledOnSeries&&Array.isArray(e.tConfig.enabledOnSeries)&&e.tConfig.enabledOnSeries.indexOf(r)<0&&o.classList.add(\"apexcharts-tooltip-series-group-hidden\");var n=document.createElement(\"span\");n.classList.add(\"apexcharts-tooltip-marker\"),n.style.backgroundColor=i.globals.colors[r],o.appendChild(n);var l=document.createElement(\"div\");l.classList.add(\"apexcharts-tooltip-text\"),l.style.fontFamily=e.tConfig.style.fontFamily||i.config.chart.fontFamily,l.style.fontSize=e.tConfig.style.fontSize,[\"y\",\"goals\",\"z\"].forEach((function(t){var e=document.createElement(\"div\");e.classList.add(\"apexcharts-tooltip-\".concat(t,\"-group\"));var i=document.createElement(\"span\");i.classList.add(\"apexcharts-tooltip-text-\".concat(t,\"-label\")),e.appendChild(i);var a=document.createElement(\"span\");a.classList.add(\"apexcharts-tooltip-text-\".concat(t,\"-value\")),e.appendChild(a),l.appendChild(e)})),o.appendChild(l),s.appendChild(o),a.push(o)},o=0;o<t;o++)r(o);return a}},{key:\"addSVGEvents\",value:function(){var t=this.w,e=t.config.chart.type,i=this.getElTooltip(),a=!(\"bar\"!==e&&\"candlestick\"!==e&&\"boxPlot\"!==e&&\"rangeBar\"!==e),s=\"area\"===e||\"line\"===e||\"scatter\"===e||\"bubble\"===e||\"radar\"===e,r=t.globals.dom.Paper.node,o=this.getElGrid();o&&(this.seriesBound=o.getBoundingClientRect());var n,l=[],h=[],c={hoverArea:r,elGrid:o,tooltipEl:i,tooltipY:l,tooltipX:h,ttItems:this.ttItems};if(t.globals.axisCharts&&(s?n=t.globals.dom.baseEl.querySelectorAll(\".apexcharts-series[data\\\\:longestSeries='true'] .apexcharts-marker\"):a?n=t.globals.dom.baseEl.querySelectorAll(\".apexcharts-series .apexcharts-bar-area, .apexcharts-series .apexcharts-candlestick-area, .apexcharts-series .apexcharts-boxPlot-area, .apexcharts-series .apexcharts-rangebar-area\"):\"heatmap\"!==e&&\"treemap\"!==e||(n=t.globals.dom.baseEl.querySelectorAll(\".apexcharts-series .apexcharts-heatmap, .apexcharts-series .apexcharts-treemap\")),n&&n.length))for(var d=0;d<n.length;d++)l.push(n[d].getAttribute(\"cy\")),h.push(n[d].getAttribute(\"cx\"));if(t.globals.xyCharts&&!this.showOnIntersect||t.globals.comboCharts&&!this.showOnIntersect||a&&this.tooltipUtil.hasBars()&&this.tConfig.shared)this.addPathsEventListeners([r],c);else if(a&&!t.globals.comboCharts||s&&this.showOnIntersect)this.addDatapointEventsListeners(c);else if(!t.globals.axisCharts||\"heatmap\"===e||\"treemap\"===e){var g=t.globals.dom.baseEl.querySelectorAll(\".apexcharts-series\");this.addPathsEventListeners(g,c)}if(this.showOnIntersect){var u=t.globals.dom.baseEl.querySelectorAll(\".apexcharts-line-series .apexcharts-marker, .apexcharts-area-series .apexcharts-marker\");u.length>0&&this.addPathsEventListeners(u,c),this.tooltipUtil.hasBars()&&!this.tConfig.shared&&this.addDatapointEventsListeners(c)}}},{key:\"drawFixedTooltipRect\",value:function(){var t=this.w,e=this.getElTooltip(),i=e.getBoundingClientRect(),a=i.width+10,s=i.height+10,r=this.tConfig.fixed.offsetX,o=this.tConfig.fixed.offsetY,n=this.tConfig.fixed.position.toLowerCase();return n.indexOf(\"right\")>-1&&(r=r+t.globals.svgWidth-a+10),n.indexOf(\"bottom\")>-1&&(o=o+t.globals.svgHeight-s-10),e.style.left=r+\"px\",e.style.top=o+\"px\",{x:r,y:o,ttWidth:a,ttHeight:s}}},{key:\"addDatapointEventsListeners\",value:function(t){var e=this.w.globals.dom.baseEl.querySelectorAll(\".apexcharts-series-markers .apexcharts-marker, .apexcharts-bar-area, .apexcharts-candlestick-area, .apexcharts-boxPlot-area, .apexcharts-rangebar-area\");this.addPathsEventListeners(e,t)}},{key:\"addPathsEventListeners\",value:function(t,e){for(var i=this,a=function(a){var s={paths:t[a],tooltipEl:e.tooltipEl,tooltipY:e.tooltipY,tooltipX:e.tooltipX,elGrid:e.elGrid,hoverArea:e.hoverArea,ttItems:e.ttItems};[\"mousemove\",\"mouseup\",\"touchmove\",\"mouseout\",\"touchend\"].map((function(e){return t[a].addEventListener(e,i.onSeriesHover.bind(i,s),{capture:!1,passive:!0})}))},s=0;s<t.length;s++)a(s)}},{key:\"onSeriesHover\",value:function(t,e){var i=this,a=Date.now()-this.lastHoverTime;a>=100?this.seriesHover(t,e):(clearTimeout(this.seriesHoverTimeout),this.seriesHoverTimeout=setTimeout((function(){i.seriesHover(t,e)}),100-a))}},{key:\"seriesHover\",value:function(t,e){var i=this;this.lastHoverTime=Date.now();var a=[],s=this.w;s.config.chart.group&&(a=this.ctx.getGroupedCharts()),s.globals.axisCharts&&(s.globals.minX===-1/0&&s.globals.maxX===1/0||0===s.globals.dataPoints)||(a.length?a.forEach((function(a){var s=i.getElTooltip(a),r={paths:t.paths,tooltipEl:s,tooltipY:t.tooltipY,tooltipX:t.tooltipX,elGrid:t.elGrid,hoverArea:t.hoverArea,ttItems:a.w.globals.tooltip.ttItems};a.w.globals.minX===i.w.globals.minX&&a.w.globals.maxX===i.w.globals.maxX&&a.w.globals.tooltip.seriesHoverByContext({chartCtx:a,ttCtx:a.w.globals.tooltip,opt:r,e:e})})):this.seriesHoverByContext({chartCtx:this.ctx,ttCtx:this.w.globals.tooltip,opt:t,e:e}))}},{key:\"seriesHoverByContext\",value:function(t){var e=t.chartCtx,i=t.ttCtx,a=t.opt,s=t.e,r=e.w,o=this.getElTooltip();if(o){if(i.tooltipRect={x:0,y:0,ttWidth:o.getBoundingClientRect().width,ttHeight:o.getBoundingClientRect().height},i.e=s,i.tooltipUtil.hasBars()&&!r.globals.comboCharts&&!i.isBarShared)if(this.tConfig.onDatasetHover.highlightDataSeries)new N(e).toggleSeriesOnHover(s,s.target.parentNode);i.fixedTooltip&&i.drawFixedTooltipRect(),r.globals.axisCharts?i.axisChartsTooltips({e:s,opt:a,tooltipRect:i.tooltipRect}):i.nonAxisChartsTooltips({e:s,opt:a,tooltipRect:i.tooltipRect})}}},{key:\"axisChartsTooltips\",value:function(t){var e,i,a=t.e,s=t.opt,r=this.w,o=s.elGrid.getBoundingClientRect(),n=\"touchmove\"===a.type?a.touches[0].clientX:a.clientX,l=\"touchmove\"===a.type?a.touches[0].clientY:a.clientY;if(this.clientY=l,this.clientX=n,r.globals.capturedSeriesIndex=-1,r.globals.capturedDataPointIndex=-1,l<o.top||l>o.top+o.height)this.handleMouseOut(s);else{if(Array.isArray(this.tConfig.enabledOnSeries)&&!r.config.tooltip.shared){var h=parseInt(s.paths.getAttribute(\"index\"),10);if(this.tConfig.enabledOnSeries.indexOf(h)<0)return void this.handleMouseOut(s)}var c=this.getElTooltip(),d=this.getElXCrosshairs(),g=r.globals.xyCharts||\"bar\"===r.config.chart.type&&!r.globals.isBarHorizontal&&this.tooltipUtil.hasBars()&&this.tConfig.shared||r.globals.comboCharts&&this.tooltipUtil.hasBars();if(\"mousemove\"===a.type||\"touchmove\"===a.type||\"mouseup\"===a.type){if(r.globals.collapsedSeries.length+r.globals.ancillaryCollapsedSeries.length===r.globals.series.length)return;null!==d&&d.classList.add(\"apexcharts-active\");var u=this.yaxisTooltips.filter((function(t){return!0===t}));if(null!==this.ycrosshairs&&u.length&&this.ycrosshairs.classList.add(\"apexcharts-active\"),g&&!this.showOnIntersect)this.handleStickyTooltip(a,n,l,s);else if(\"heatmap\"===r.config.chart.type||\"treemap\"===r.config.chart.type){var f=this.intersect.handleHeatTreeTooltip({e:a,opt:s,x:e,y:i,type:r.config.chart.type});e=f.x,i=f.y,c.style.left=e+\"px\",c.style.top=i+\"px\"}else this.tooltipUtil.hasBars()&&this.intersect.handleBarTooltip({e:a,opt:s}),this.tooltipUtil.hasMarkers()&&this.intersect.handleMarkerTooltip({e:a,opt:s,x:e,y:i});if(this.yaxisTooltips.length)for(var p=0;p<r.config.yaxis.length;p++)this.axesTooltip.drawYaxisTooltipText(p,l,this.xyRatios);s.tooltipEl.classList.add(\"apexcharts-active\")}else\"mouseout\"!==a.type&&\"touchend\"!==a.type||this.handleMouseOut(s)}}},{key:\"nonAxisChartsTooltips\",value:function(t){var e=t.e,i=t.opt,a=t.tooltipRect,s=this.w,r=i.paths.getAttribute(\"rel\"),o=this.getElTooltip(),n=s.globals.dom.elWrap.getBoundingClientRect();if(\"mousemove\"===e.type||\"touchmove\"===e.type){o.classList.add(\"apexcharts-active\"),this.tooltipLabels.drawSeriesTexts({ttItems:i.ttItems,i:parseInt(r,10)-1,shared:!1});var l=s.globals.clientX-n.left-a.ttWidth/2,h=s.globals.clientY-n.top-a.ttHeight-10;if(o.style.left=l+\"px\",o.style.top=h+\"px\",s.config.legend.tooltipHoverFormatter){var c=r-1,d=(0,s.config.legend.tooltipHoverFormatter)(this.legendLabels[c].getAttribute(\"data:default-text\"),{seriesIndex:c,dataPointIndex:c,w:s});this.legendLabels[c].innerHTML=d}}else\"mouseout\"!==e.type&&\"touchend\"!==e.type||(o.classList.remove(\"apexcharts-active\"),s.config.legend.tooltipHoverFormatter&&this.legendLabels.forEach((function(t){var e=t.getAttribute(\"data:default-text\");t.innerHTML=decodeURIComponent(e)})))}},{key:\"handleStickyTooltip\",value:function(t,e,i,a){var s=this.w,r=this.tooltipUtil.getNearestValues({context:this,hoverArea:a.hoverArea,elGrid:a.elGrid,clientX:e,clientY:i}),o=r.j,n=r.capturedSeries;s.globals.collapsedSeriesIndices.includes(n)&&(n=null);var l=a.elGrid.getBoundingClientRect();if(r.hoverX<0||r.hoverX>l.width)this.handleMouseOut(a);else if(null!==n)this.handleStickyCapturedSeries(t,n,a,o);else if(this.tooltipUtil.isXoverlap(o)||s.globals.isBarHorizontal){var h=s.globals.series.findIndex((function(t,e){return!s.globals.collapsedSeriesIndices.includes(e)}));this.create(t,this,h,o,a.ttItems)}}},{key:\"handleStickyCapturedSeries\",value:function(t,e,i,a){var s=this.w;if(!this.tConfig.shared&&null===s.globals.series[e][a])return void this.handleMouseOut(i);if(void 0!==s.globals.series[e][a])this.tConfig.shared&&this.tooltipUtil.isXoverlap(a)&&this.tooltipUtil.isInitialSeriesSameLen()?this.create(t,this,e,a,i.ttItems):this.create(t,this,e,a,i.ttItems,!1);else if(this.tooltipUtil.isXoverlap(a)){var r=s.globals.series.findIndex((function(t,e){return!s.globals.collapsedSeriesIndices.includes(e)}));this.create(t,this,r,a,i.ttItems)}}},{key:\"deactivateHoverFilter\",value:function(){for(var t=this.w,e=new m(this.ctx),i=t.globals.dom.Paper.select(\".apexcharts-bar-area\"),a=0;a<i.length;a++)e.pathMouseLeave(i[a])}},{key:\"handleMouseOut\",value:function(t){var e=this.w,i=this.getElXCrosshairs();if(t.tooltipEl.classList.remove(\"apexcharts-active\"),this.deactivateHoverFilter(),\"bubble\"!==e.config.chart.type&&this.marker.resetPointsSize(),null!==i&&i.classList.remove(\"apexcharts-active\"),null!==this.ycrosshairs&&this.ycrosshairs.classList.remove(\"apexcharts-active\"),this.isXAxisTooltipEnabled&&this.xaxisTooltip.classList.remove(\"apexcharts-active\"),this.yaxisTooltips.length){null===this.yaxisTTEls&&(this.yaxisTTEls=e.globals.dom.baseEl.querySelectorAll(\".apexcharts-yaxistooltip\"));for(var a=0;a<this.yaxisTTEls.length;a++)this.yaxisTTEls[a].classList.remove(\"apexcharts-active\")}e.config.legend.tooltipHoverFormatter&&this.legendLabels.forEach((function(t){var e=t.getAttribute(\"data:default-text\");t.innerHTML=decodeURIComponent(e)}))}},{key:\"markerClick\",value:function(t,e,i){var a=this.w;\"function\"==typeof a.config.chart.events.markerClick&&a.config.chart.events.markerClick(t,this.ctx,{seriesIndex:e,dataPointIndex:i,w:a}),this.ctx.events.fireEvent(\"markerClick\",[t,this.ctx,{seriesIndex:e,dataPointIndex:i,w:a}])}},{key:\"create\",value:function(t,i,a,s,r){var o,n,l,h,c,d,g,u,f,p,x,b,v,y,w,k,A=arguments.length>5&&void 0!==arguments[5]?arguments[5]:null,S=this.w,C=i;\"mouseup\"===t.type&&this.markerClick(t,a,s),null===A&&(A=this.tConfig.shared);var L=this.tooltipUtil.hasMarkers(a),P=this.tooltipUtil.getElBars();if(S.config.legend.tooltipHoverFormatter){var I=S.config.legend.tooltipHoverFormatter,T=Array.from(this.legendLabels);T.forEach((function(t){var e=t.getAttribute(\"data:default-text\");t.innerHTML=decodeURIComponent(e)}));for(var M=0;M<T.length;M++){var z=T[M],X=parseInt(z.getAttribute(\"i\"),10),E=decodeURIComponent(z.getAttribute(\"data:default-text\")),Y=I(E,{seriesIndex:A?X:a,dataPointIndex:s,w:S});if(A)z.innerHTML=S.globals.collapsedSeriesIndices.indexOf(X)<0?Y:E;else if(z.innerHTML=X===a?Y:E,a===X)break}}var F=e(e({ttItems:r,i:a,j:s},void 0!==(null===(o=S.globals.seriesRange)||void 0===o||null===(n=o[a])||void 0===n||null===(l=n[s])||void 0===l||null===(h=l.y[0])||void 0===h?void 0:h.y1)&&{y1:null===(c=S.globals.seriesRange)||void 0===c||null===(d=c[a])||void 0===d||null===(g=d[s])||void 0===g||null===(u=g.y[0])||void 0===u?void 0:u.y1}),void 0!==(null===(f=S.globals.seriesRange)||void 0===f||null===(p=f[a])||void 0===p||null===(x=p[s])||void 0===x||null===(b=x.y[0])||void 0===b?void 0:b.y2)&&{y2:null===(v=S.globals.seriesRange)||void 0===v||null===(y=v[a])||void 0===y||null===(w=y[s])||void 0===w||null===(k=w.y[0])||void 0===k?void 0:k.y2});if(A){if(C.tooltipLabels.drawSeriesTexts(e(e({},F),{},{shared:!this.showOnIntersect&&this.tConfig.shared})),L)S.globals.markers.largestSize>0?C.marker.enlargePoints(s):C.tooltipPosition.moveDynamicPointsOnHover(s);else if(this.tooltipUtil.hasBars()&&(this.barSeriesHeight=this.tooltipUtil.getBarsHeight(P),this.barSeriesHeight>0)){var R=new m(this.ctx),D=S.globals.dom.Paper.select(\".apexcharts-bar-area[j='\".concat(s,\"']\"));this.deactivateHoverFilter(),this.tooltipPosition.moveStickyTooltipOverBars(s,a);for(var H=0;H<D.length;H++)R.pathMouseEnter(D[H])}}else C.tooltipLabels.drawSeriesTexts(e({shared:!1},F)),this.tooltipUtil.hasBars()&&C.tooltipPosition.moveStickyTooltipOverBars(s,a),L&&C.tooltipPosition.moveMarkers(a,s)}}]),t}(),vt=function(){function t(e){a(this,t),this.w=e.w,this.barCtx=e,this.totalFormatter=this.w.config.plotOptions.bar.dataLabels.total.formatter,this.totalFormatter||(this.totalFormatter=this.w.config.dataLabels.formatter)}return r(t,[{key:\"handleBarDataLabels\",value:function(t){var e=t.x,i=t.y,a=t.y1,s=t.y2,r=t.i,o=t.j,n=t.realIndex,l=t.series,h=t.barHeight,c=t.barWidth,d=t.barYPosition,g=t.visibleSeries,u=t.renderedPath,f=this.w,p=new m(this.barCtx.ctx),x=Array.isArray(this.barCtx.strokeWidth)?this.barCtx.strokeWidth[n]:this.barCtx.strokeWidth,b=e+parseFloat(c*g),v=i+parseFloat(h*g);f.globals.isXNumeric&&!f.globals.isBarHorizontal&&(b=e+parseFloat(c*(g+1)),v=i+parseFloat(h*(g+1))-x);var y,w=null,k=e,A=i,S={},C=f.config.dataLabels,L=this.barCtx.barOptions.dataLabels,P=this.barCtx.barOptions.dataLabels.total;void 0!==d&&this.barCtx.isRangeBar&&(v=d,A=d);var I=C.offsetX,T=C.offsetY,M={width:0,height:0};if(f.config.dataLabels.enabled){var z=this.barCtx.series[r][o];M=p.getTextRects(f.globals.yLabelFormatters[0](z),parseFloat(C.style.fontSize))}var X={x:e,y:i,i:r,j:o,realIndex:n,renderedPath:u,bcx:b,bcy:v,barHeight:h,barWidth:c,textRects:M,strokeWidth:x,dataLabelsX:k,dataLabelsY:A,dataLabelsConfig:C,barDataLabelsConfig:L,barTotalDataLabelsConfig:P,offX:I,offY:T};return S=this.barCtx.isHorizontal?this.calculateBarsDataLabelsPosition(X):this.calculateColumnsDataLabelsPosition(X),u.attr({cy:S.bcy,cx:S.bcx,j:o,val:l[r][o],barHeight:h,barWidth:c}),y=this.drawCalculatedDataLabels({x:S.dataLabelsX,y:S.dataLabelsY,val:this.barCtx.isRangeBar?[a,s]:l[r][o],i:n,j:o,barWidth:c,barHeight:h,textRects:M,dataLabelsConfig:C}),f.config.chart.stacked&&P.enabled&&(w=this.drawTotalDataLabels({x:S.totalDataLabelsX,y:S.totalDataLabelsY,realIndex:n,textAnchor:S.totalDataLabelsAnchor,val:this.getStackedTotalDataLabel({realIndex:n,j:o}),dataLabelsConfig:C,barTotalDataLabelsConfig:P})),{dataLabels:y,totalDataLabels:w}}},{key:\"getStackedTotalDataLabel\",value:function(t){var i=t.realIndex,a=t.j,s=this.w,r=this.barCtx.stackedSeriesTotals[a];return this.totalFormatter&&(r=this.totalFormatter(r,e(e({},s),{},{seriesIndex:i,dataPointIndex:a,w:s}))),r}},{key:\"calculateColumnsDataLabelsPosition\",value:function(t){var e,i,a,s=this.w,r=t.i,o=t.j,n=t.realIndex,l=t.y,h=t.bcx,c=t.barWidth,d=t.barHeight,g=t.textRects,u=t.dataLabelsY,f=t.dataLabelsConfig,p=t.barDataLabelsConfig,x=t.barTotalDataLabelsConfig,b=t.strokeWidth,v=t.offX,y=t.offY;d=Math.abs(d);var w=\"vertical\"===s.config.plotOptions.bar.dataLabels.orientation;h-=b/2;var k=s.globals.gridWidth/s.globals.dataPoints;if(e=s.globals.isXNumeric?h-c/2+v:h-k+c/2+v,w){e=e+g.height/2-b/2-2}var A=this.barCtx.series[r][o]<0,S=l;switch(this.barCtx.isReversed&&(S=l-d+(A?2*d:0),l-=d),p.position){case\"center\":u=w?A?S+d/2+y:S+d/2-y:A?S-d/2+g.height/2+y:S+d/2+g.height/2-y;break;case\"bottom\":u=w?A?S+d+y:S+d-y:A?S-d+g.height+b+y:S+d-g.height/2+b-y;break;case\"top\":u=w?A?S+y:S-y:A?S-g.height/2-y:S+g.height+y}if(this.barCtx.lastActiveBarSerieIndex===n&&x.enabled){var C=new m(this.barCtx.ctx).getTextRects(this.getStackedTotalDataLabel({realIndex:n,j:o}),f.fontSize);i=A?S-C.height/2-y-x.offsetY+18:S+C.height+y+x.offsetY-18,a=e+x.offsetX}return s.config.chart.stacked||(u<0?u=0+b:u+g.height/3>s.globals.gridHeight&&(u=s.globals.gridHeight-b)),{bcx:h,bcy:l,dataLabelsX:e,dataLabelsY:u,totalDataLabelsX:a,totalDataLabelsY:i,totalDataLabelsAnchor:\"middle\"}}},{key:\"calculateBarsDataLabelsPosition\",value:function(t){var e=this.w,i=t.x,a=t.i,s=t.j,r=t.realIndex,o=t.bcy,n=t.barHeight,l=t.barWidth,h=t.textRects,c=t.dataLabelsX,d=t.strokeWidth,g=t.dataLabelsConfig,u=t.barDataLabelsConfig,f=t.barTotalDataLabelsConfig,p=t.offX,x=t.offY,b=e.globals.gridHeight/e.globals.dataPoints;l=Math.abs(l);var v,y,w=o-(this.barCtx.isRangeBar?0:b)+n/2+h.height/2+x-3,k=\"start\",A=this.barCtx.series[a][s]<0,S=i;switch(this.barCtx.isReversed&&(S=i+l-(A?2*l:0),i=e.globals.gridWidth-l),u.position){case\"center\":c=A?S+l/2-p:Math.max(h.width/2,S-l/2)+p;break;case\"bottom\":c=A?S+l-d-Math.round(h.width/2)-p:S-l+d+Math.round(h.width/2)+p;break;case\"top\":c=A?S-d+Math.round(h.width/2)-p:S-d-Math.round(h.width/2)+p}if(this.barCtx.lastActiveBarSerieIndex===r&&f.enabled){var C=new m(this.barCtx.ctx).getTextRects(this.getStackedTotalDataLabel({realIndex:r,j:s}),g.fontSize);A?(v=S-d+Math.round(C.width/2)-p-f.offsetX-15,k=\"end\"):v=S-d-Math.round(C.width/2)+p+f.offsetX+15,y=w+f.offsetY}return e.config.chart.stacked||(c<0?c=c+h.width+d:c+h.width/2>e.globals.gridWidth&&(c=e.globals.gridWidth-h.width-d)),{bcx:i,bcy:o,dataLabelsX:c,dataLabelsY:w,totalDataLabelsX:v,totalDataLabelsY:y,totalDataLabelsAnchor:k}}},{key:\"drawCalculatedDataLabels\",value:function(t){var i=t.x,a=t.y,s=t.val,r=t.i,o=t.j,n=t.textRects,l=t.barHeight,h=t.barWidth,c=t.dataLabelsConfig,d=this.w,g=\"rotate(0)\";\"vertical\"===d.config.plotOptions.bar.dataLabels.orientation&&(g=\"rotate(-90, \".concat(i,\", \").concat(a,\")\"));var u=new O(this.barCtx.ctx),f=new m(this.barCtx.ctx),p=c.formatter,x=null,b=d.globals.collapsedSeriesIndices.indexOf(r)>-1;if(c.enabled&&!b){x=f.group({class:\"apexcharts-data-labels\",transform:g});var v=\"\";void 0!==s&&(v=p(s,e(e({},d),{},{seriesIndex:r,dataPointIndex:o,w:d}))),!s&&d.config.plotOptions.bar.hideZeroBarsWhenGrouped&&(v=\"\");var y=d.globals.series[r][o]<0,w=d.config.plotOptions.bar.dataLabels.position;if(\"vertical\"===d.config.plotOptions.bar.dataLabels.orientation&&(\"top\"===w&&(c.textAnchor=y?\"end\":\"start\"),\"center\"===w&&(c.textAnchor=\"middle\"),\"bottom\"===w&&(c.textAnchor=y?\"end\":\"start\")),this.barCtx.isRangeBar&&this.barCtx.barOptions.dataLabels.hideOverflowingLabels)h<f.getTextRects(v,parseFloat(c.style.fontSize)).width&&(v=\"\");d.config.chart.stacked&&this.barCtx.barOptions.dataLabels.hideOverflowingLabels&&(this.barCtx.isHorizontal?n.width/1.6>Math.abs(h)&&(v=\"\"):n.height/1.6>Math.abs(l)&&(v=\"\"));var k=e({},c);this.barCtx.isHorizontal&&s<0&&(\"start\"===c.textAnchor?k.textAnchor=\"end\":\"end\"===c.textAnchor&&(k.textAnchor=\"start\")),u.plotDataLabelsText({x:i,y:a,text:v,i:r,j:o,parent:x,dataLabelsConfig:k,alwaysDrawDataLabel:!0,offsetCorrection:!0})}return x}},{key:\"drawTotalDataLabels\",value:function(t){var e,i=t.x,a=t.y,s=t.val,r=t.realIndex,o=t.textAnchor,n=t.barTotalDataLabelsConfig,l=new m(this.barCtx.ctx);return n.enabled&&void 0!==i&&void 0!==a&&this.barCtx.lastActiveBarSerieIndex===r&&(e=l.drawText({x:i,y:a,foreColor:n.style.color,text:s,textAnchor:o,fontFamily:n.style.fontFamily,fontSize:n.style.fontSize,fontWeight:n.style.fontWeight})),e}}]),t}(),mt=function(){function t(e){a(this,t),this.w=e.w,this.barCtx=e}return r(t,[{key:\"initVariables\",value:function(t){var e=this.w;this.barCtx.series=t,this.barCtx.totalItems=0,this.barCtx.seriesLen=0,this.barCtx.visibleI=-1,this.barCtx.visibleItems=1;for(var i=0;i<t.length;i++)if(t[i].length>0&&(this.barCtx.seriesLen=this.barCtx.seriesLen+1,this.barCtx.totalItems+=t[i].length),e.globals.isXNumeric)for(var a=0;a<t[i].length;a++)e.globals.seriesX[i][a]>e.globals.minX&&e.globals.seriesX[i][a]<e.globals.maxX&&this.barCtx.visibleItems++;else this.barCtx.visibleItems=e.globals.dataPoints;0===this.barCtx.seriesLen&&(this.barCtx.seriesLen=1),this.barCtx.zeroSerieses=[],this.barCtx.radiusOnSeriesNumber=t.length-1,e.globals.comboCharts||this.checkZeroSeries({series:t})}},{key:\"initialPositions\",value:function(){var t,e,i,a,s,r,o,n,l=this.w,h=l.globals.dataPoints;this.barCtx.isRangeBar&&(h=l.globals.labels.length);var c=this.barCtx.seriesLen;if(l.config.plotOptions.bar.rangeBarGroupRows&&(c=1),this.barCtx.isHorizontal)s=(i=l.globals.gridHeight/h)/c,l.globals.isXNumeric&&(s=(i=l.globals.gridHeight/this.barCtx.totalItems)/this.barCtx.seriesLen),s=s*parseInt(this.barCtx.barOptions.barHeight,10)/100,n=this.barCtx.baseLineInvertedY+l.globals.padHorizontal+(this.barCtx.isReversed?l.globals.gridWidth:0)-(this.barCtx.isReversed?2*this.barCtx.baseLineInvertedY:0),e=(i-s*this.barCtx.seriesLen)/2;else{if(a=l.globals.gridWidth/this.barCtx.visibleItems,l.config.xaxis.convertedCatToNumeric&&(a=l.globals.gridWidth/l.globals.dataPoints),r=a/this.barCtx.seriesLen*parseInt(this.barCtx.barOptions.columnWidth,10)/100,l.globals.isXNumeric){var d=this.barCtx.xRatio;l.config.xaxis.convertedCatToNumeric&&(d=this.barCtx.initialXRatio),l.globals.minXDiff&&.5!==l.globals.minXDiff&&l.globals.minXDiff/d>0&&(a=l.globals.minXDiff/d),(r=a/this.barCtx.seriesLen*parseInt(this.barCtx.barOptions.columnWidth,10)/100)<1&&(r=1)}o=l.globals.gridHeight-this.barCtx.baseLineY[this.barCtx.yaxisIndex]-(this.barCtx.isReversed?l.globals.gridHeight:0)+(this.barCtx.isReversed?2*this.barCtx.baseLineY[this.barCtx.yaxisIndex]:0),t=l.globals.padHorizontal+(a-r*this.barCtx.seriesLen)/2}return{x:t,y:e,yDivision:i,xDivision:a,barHeight:s,barWidth:r,zeroH:o,zeroW:n}}},{key:\"getPathFillColor\",value:function(t,e,i,a){var s,r,o,n,l=this.w,h=new R(this.barCtx.ctx),c=null,d=this.barCtx.barOptions.distributed?i:e;this.barCtx.barOptions.colors.ranges.length>0&&this.barCtx.barOptions.colors.ranges.map((function(a){t[e][i]>=a.from&&t[e][i]<=a.to&&(c=a.color)}));return l.config.series[e].data[i]&&l.config.series[e].data[i].fillColor&&(c=l.config.series[e].data[i].fillColor),h.fillPath({seriesNumber:this.barCtx.barOptions.distributed?d:a,dataPointIndex:i,color:c,value:t[e][i],fillConfig:null===(s=l.config.series[e].data[i])||void 0===s?void 0:s.fill,fillType:null!==(r=l.config.series[e].data[i])&&void 0!==r&&null!==(o=r.fill)&&void 0!==o&&o.type?null===(n=l.config.series[e].data[i])||void 0===n?void 0:n.fill.type:l.config.fill.type})}},{key:\"getStrokeWidth\",value:function(t,e,i){var a=0,s=this.w;return this.barCtx.series[t][e]?this.barCtx.isNullValue=!1:this.barCtx.isNullValue=!0,s.config.stroke.show&&(this.barCtx.isNullValue||(a=Array.isArray(this.barCtx.strokeWidth)?this.barCtx.strokeWidth[i]:this.barCtx.strokeWidth)),a}},{key:\"shouldApplyRadius\",value:function(t){var e=this.w,i=!1;return e.config.plotOptions.bar.borderRadius>0&&(e.config.chart.stacked&&\"last\"===e.config.plotOptions.bar.borderRadiusWhenStacked?this.barCtx.lastActiveBarSerieIndex===t&&(i=!0):i=!0),i}},{key:\"barBackground\",value:function(t){var e=t.j,i=t.i,a=t.x1,s=t.x2,r=t.y1,o=t.y2,n=t.elSeries,l=this.w,h=new m(this.barCtx.ctx),c=new N(this.barCtx.ctx).getActiveConfigSeriesIndex();if(this.barCtx.barOptions.colors.backgroundBarColors.length>0&&c===i){e>=this.barCtx.barOptions.colors.backgroundBarColors.length&&(e%=this.barCtx.barOptions.colors.backgroundBarColors.length);var d=this.barCtx.barOptions.colors.backgroundBarColors[e],g=h.drawRect(void 0!==a?a:0,void 0!==r?r:0,void 0!==s?s:l.globals.gridWidth,void 0!==o?o:l.globals.gridHeight,this.barCtx.barOptions.colors.backgroundBarRadius,d,this.barCtx.barOptions.colors.backgroundBarOpacity);n.add(g),g.node.classList.add(\"apexcharts-backgroundBar\")}}},{key:\"getColumnPaths\",value:function(t){var e,i=t.barWidth,a=t.barXPosition,s=t.y1,r=t.y2,o=t.strokeWidth,n=t.realIndex,l=t.i,h=t.j,c=t.w,d=new m(this.barCtx.ctx);(o=Array.isArray(o)?o[n]:o)||(o=0);var g=i,u=a;null!==(e=c.config.series[n].data[h])&&void 0!==e&&e.columnWidthOffset&&(u=a-c.config.series[n].data[h].columnWidthOffset/2,g=i+c.config.series[n].data[h].columnWidthOffset);var f=u,p=u+g;s+=.001,r+=.001;var x=d.move(f,s),b=d.move(f,s),v=d.line(p-o,s);return c.globals.previousPaths.length>0&&(b=this.barCtx.getPreviousPath(n,h,!1)),x=x+d.line(f,r)+d.line(p-o,r)+d.line(p-o,s)+(\"around\"===c.config.plotOptions.bar.borderRadiusApplication?\" Z\":\" z\"),b=b+d.line(f,s)+v+v+v+v+v+d.line(f,s)+(\"around\"===c.config.plotOptions.bar.borderRadiusApplication?\" Z\":\" z\"),this.shouldApplyRadius(n)&&(x=d.roundPathCorners(x,c.config.plotOptions.bar.borderRadius)),c.config.chart.stacked&&(this.barCtx.yArrj.push(r),this.barCtx.yArrjF.push(Math.abs(s-r)),this.barCtx.yArrjVal.push(this.barCtx.series[l][h])),{pathTo:x,pathFrom:b}}},{key:\"getBarpaths\",value:function(t){var e,i=t.barYPosition,a=t.barHeight,s=t.x1,r=t.x2,o=t.strokeWidth,n=t.realIndex,l=t.i,h=t.j,c=t.w,d=new m(this.barCtx.ctx);(o=Array.isArray(o)?o[n]:o)||(o=0);var g=i,u=a;null!==(e=c.config.series[n].data[h])&&void 0!==e&&e.barHeightOffset&&(g=i-c.config.series[n].data[h].barHeightOffset/2,u=a+c.config.series[n].data[h].barHeightOffset);var f=g,p=g+u;s+=.001,r+=.001;var x=d.move(s,f),b=d.move(s,f);c.globals.previousPaths.length>0&&(b=this.barCtx.getPreviousPath(n,h,!1));var v=d.line(s,p-o);return x=x+d.line(r,f)+d.line(r,p-o)+v+(\"around\"===c.config.plotOptions.bar.borderRadiusApplication?\" Z\":\" z\"),b=b+d.line(s,f)+v+v+v+v+v+d.line(s,f)+(\"around\"===c.config.plotOptions.bar.borderRadiusApplication?\" Z\":\" z\"),this.shouldApplyRadius(n)&&(x=d.roundPathCorners(x,c.config.plotOptions.bar.borderRadius)),c.config.chart.stacked&&(this.barCtx.xArrj.push(r),this.barCtx.xArrjF.push(Math.abs(s-r)),this.barCtx.xArrjVal.push(this.barCtx.series[l][h])),{pathTo:x,pathFrom:b}}},{key:\"checkZeroSeries\",value:function(t){for(var e=t.series,i=this.w,a=0;a<e.length;a++){for(var s=0,r=0;r<e[i.globals.maxValsInArrayIndex].length;r++)s+=e[a][r];0===s&&this.barCtx.zeroSerieses.push(a)}for(var o=e.length-1;o>=0;o--)this.barCtx.zeroSerieses.indexOf(o)>-1&&o===this.radiusOnSeriesNumber&&(this.barCtx.radiusOnSeriesNumber-=1);for(var n=e.length-1;n>=0;n--)i.globals.collapsedSeriesIndices.indexOf(this.barCtx.radiusOnSeriesNumber)>-1&&(this.barCtx.radiusOnSeriesNumber-=1)}},{key:\"getXForValue\",value:function(t,e){var i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2]?e:null;return null!=t&&(i=e+t/this.barCtx.invertedYRatio-2*(this.barCtx.isReversed?t/this.barCtx.invertedYRatio:0)),i}},{key:\"getYForValue\",value:function(t,e){var i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2]?e:null;return null!=t&&(i=e-t/this.barCtx.yRatio[this.barCtx.yaxisIndex]+2*(this.barCtx.isReversed?t/this.barCtx.yRatio[this.barCtx.yaxisIndex]:0)),i}},{key:\"getGoalValues\",value:function(t,e,i,a,s){var r=this,n=this.w,l=[];return n.globals.seriesGoals[a]&&n.globals.seriesGoals[a][s]&&Array.isArray(n.globals.seriesGoals[a][s])&&n.globals.seriesGoals[a][s].forEach((function(a){var s;l.push((o(s={},t,\"x\"===t?r.getXForValue(a.value,e,!1):r.getYForValue(a.value,i,!1)),o(s,\"attrs\",a),s))})),l}},{key:\"drawGoalLine\",value:function(t){var e=t.barXPosition,i=t.barYPosition,a=t.goalX,s=t.goalY,r=t.barWidth,o=t.barHeight,n=new m(this.barCtx.ctx),l=n.group({className:\"apexcharts-bar-goals-groups\"}),h=null;return this.barCtx.isHorizontal?Array.isArray(a)&&a.forEach((function(t){var e=void 0!==t.attrs.strokeHeight?t.attrs.strokeHeight:o/2,a=i+e+o/2;h=n.drawLine(t.x,a-2*e,t.x,a,t.attrs.strokeColor?t.attrs.strokeColor:void 0,t.attrs.strokeDashArray,t.attrs.strokeWidth?t.attrs.strokeWidth:2,t.attrs.strokeLineCap),l.add(h)})):Array.isArray(s)&&s.forEach((function(t){var i=void 0!==t.attrs.strokeWidth?t.attrs.strokeWidth:r/2,a=e+i+r/2;h=n.drawLine(a-2*i,t.y,a,t.y,t.attrs.strokeColor?t.attrs.strokeColor:void 0,t.attrs.strokeDashArray,t.attrs.strokeHeight?t.attrs.strokeHeight:2,t.attrs.strokeLineCap),l.add(h)})),l}}]),t}(),yt=function(){function t(e,i){a(this,t),this.ctx=e,this.w=e.w;var s=this.w;this.barOptions=s.config.plotOptions.bar,this.isHorizontal=this.barOptions.horizontal,this.strokeWidth=s.config.stroke.width,this.isNullValue=!1,this.isRangeBar=s.globals.seriesRange.length&&this.isHorizontal,this.xyRatios=i,null!==this.xyRatios&&(this.xRatio=i.xRatio,this.initialXRatio=i.initialXRatio,this.yRatio=i.yRatio,this.invertedXRatio=i.invertedXRatio,this.invertedYRatio=i.invertedYRatio,this.baseLineY=i.baseLineY,this.baseLineInvertedY=i.baseLineInvertedY),this.yaxisIndex=0,this.seriesLen=0;var r=new N(this.ctx);this.lastActiveBarSerieIndex=r.getActiveConfigSeriesIndex(\"desc\",[\"bar\",\"column\"]);var o=r.getBarSeriesIndices(),n=new y(this.ctx);this.stackedSeriesTotals=n.getStackedSeriesTotals(this.w.config.series.map((function(t,e){return-1===o.indexOf(e)?e:-1})).filter((function(t){return-1!==t}))),this.barHelpers=new mt(this)}return r(t,[{key:\"draw\",value:function(t,i){var a=this.w,s=new m(this.ctx),r=new y(this.ctx,a);t=r.getLogSeries(t),this.series=t,this.yRatio=r.getLogYRatios(this.yRatio),this.barHelpers.initVariables(t);var o=s.group({class:\"apexcharts-bar-series apexcharts-plot-series\"});a.config.dataLabels.enabled&&this.totalItems>this.barOptions.dataLabels.maxItems&&console.warn(\"WARNING: DataLabels are enabled but there are too many to display. This may cause performance issue when rendering.\");for(var n=0,l=0;n<t.length;n++,l++){var h,c,d,g,u=void 0,f=void 0,p=[],b=[],v=a.globals.comboCharts?i[n]:n,w=s.group({class:\"apexcharts-series\",rel:n+1,seriesName:x.escapeString(a.globals.seriesNames[v]),\"data:realIndex\":v});this.ctx.series.addCollapsedClassToSeries(w,v),t[n].length>0&&(this.visibleI=this.visibleI+1);var k=0,A=0;this.yRatio.length>1&&(this.yaxisIndex=v),this.isReversed=a.config.yaxis[this.yaxisIndex]&&a.config.yaxis[this.yaxisIndex].reversed;var S=this.barHelpers.initialPositions();f=S.y,k=S.barHeight,c=S.yDivision,g=S.zeroW,u=S.x,A=S.barWidth,h=S.xDivision,d=S.zeroH,this.horizontal||b.push(u+A/2);for(var C=s.group({class:\"apexcharts-datalabels\",\"data:realIndex\":v}),L=s.group({class:\"apexcharts-bar-goals-markers\",style:\"pointer-events: none\"}),P=0;P<a.globals.dataPoints;P++){var I=this.barHelpers.getStrokeWidth(n,P,v),T=null,M={indexes:{i:n,j:P,realIndex:v,bc:l},x:u,y:f,strokeWidth:I,elSeries:w};this.isHorizontal?(T=this.drawBarPaths(e(e({},M),{},{barHeight:k,zeroW:g,yDivision:c})),A=this.series[n][P]/this.invertedYRatio):(T=this.drawColumnPaths(e(e({},M),{},{xDivision:h,barWidth:A,zeroH:d})),k=this.series[n][P]/this.yRatio[this.yaxisIndex]);var z=this.barHelpers.drawGoalLine({barXPosition:T.barXPosition,barYPosition:T.barYPosition,goalX:T.goalX,goalY:T.goalY,barHeight:k,barWidth:A});z&&L.add(z),f=T.y,u=T.x,P>0&&b.push(u+A/2),p.push(f);var X=this.barHelpers.getPathFillColor(t,n,P,v);this.renderSeries({realIndex:v,pathFill:X,j:P,i:n,pathFrom:T.pathFrom,pathTo:T.pathTo,strokeWidth:I,elSeries:w,x:u,y:f,series:t,barHeight:T.barHeight?T.barHeight:k,barWidth:T.barWidth?T.barWidth:A,elDataLabelsWrap:C,elGoalsMarkers:L,visibleSeries:this.visibleI,type:\"bar\"})}a.globals.seriesXvalues[v]=b,a.globals.seriesYvalues[v]=p,o.add(w)}return o}},{key:\"renderSeries\",value:function(t){var e=t.realIndex,i=t.pathFill,a=t.lineFill,s=t.j,r=t.i,o=t.pathFrom,n=t.pathTo,l=t.strokeWidth,h=t.elSeries,c=t.x,d=t.y,g=t.y1,u=t.y2,f=t.series,p=t.barHeight,x=t.barWidth,b=t.barYPosition,y=t.elDataLabelsWrap,w=t.elGoalsMarkers,k=t.visibleSeries,A=t.type,S=this.w,C=new m(this.ctx);a||(a=this.barOptions.distributed?S.globals.stroke.colors[s]:S.globals.stroke.colors[e]),S.config.series[r].data[s]&&S.config.series[r].data[s].strokeColor&&(a=S.config.series[r].data[s].strokeColor),this.isNullValue&&(i=\"none\");var L=s/S.config.chart.animations.animateGradually.delay*(S.config.chart.animations.speed/S.globals.dataPoints)/2.4,P=C.renderPaths({i:r,j:s,realIndex:e,pathFrom:o,pathTo:n,stroke:a,strokeWidth:l,strokeLineCap:S.config.stroke.lineCap,fill:i,animationDelay:L,initialSpeed:S.config.chart.animations.speed,dataChangeSpeed:S.config.chart.animations.dynamicAnimation.speed,className:\"apexcharts-\".concat(A,\"-area\")});P.attr(\"clip-path\",\"url(#gridRectMask\".concat(S.globals.cuid,\")\"));var I=S.config.forecastDataPoints;I.count>0&&s>=S.globals.dataPoints-I.count&&(P.node.setAttribute(\"stroke-dasharray\",I.dashArray),P.node.setAttribute(\"stroke-width\",I.strokeWidth),P.node.setAttribute(\"fill-opacity\",I.fillOpacity)),void 0!==g&&void 0!==u&&(P.attr(\"data-range-y1\",g),P.attr(\"data-range-y2\",u)),new v(this.ctx).setSelectionFilter(P,e,s),h.add(P);var T=new vt(this).handleBarDataLabels({x:c,y:d,y1:g,y2:u,i:r,j:s,series:f,realIndex:e,barHeight:p,barWidth:x,barYPosition:b,renderedPath:P,visibleSeries:k});return null!==T.dataLabels&&y.add(T.dataLabels),T.totalDataLabels&&y.add(T.totalDataLabels),h.add(y),w&&h.add(w),h}},{key:\"drawBarPaths\",value:function(t){var e,i=t.indexes,a=t.barHeight,s=t.strokeWidth,r=t.zeroW,o=t.x,n=t.y,l=t.yDivision,h=t.elSeries,c=this.w,d=i.i,g=i.j;if(c.globals.isXNumeric)e=(n=(c.globals.seriesX[d][g]-c.globals.minX)/this.invertedXRatio-a)+a*this.visibleI;else if(c.config.plotOptions.bar.hideZeroBarsWhenGrouped){var u=0,f=0;c.globals.seriesPercent.forEach((function(t,e){t[g]&&u++,e<d&&0===t[g]&&f++})),u>0&&(a=this.seriesLen*a/u),e=n+a*this.visibleI,e-=a*f}else e=n+a*this.visibleI;o=this.barHelpers.getXForValue(this.series[d][g],r);var p=this.barHelpers.getBarpaths({barYPosition:e,barHeight:a,x1:r,x2:o,strokeWidth:s,series:this.series,realIndex:i.realIndex,i:d,j:g,w:c});return c.globals.isXNumeric||(n+=l),this.barHelpers.barBackground({j:g,i:d,y1:e-a*this.visibleI,y2:a*this.seriesLen,elSeries:h}),{pathTo:p.pathTo,pathFrom:p.pathFrom,x:o,y:n,goalX:this.barHelpers.getGoalValues(\"x\",r,null,d,g),barYPosition:e,barHeight:a}}},{key:\"drawColumnPaths\",value:function(t){var e,i=t.indexes,a=t.x,s=t.y,r=t.xDivision,o=t.barWidth,n=t.zeroH,l=t.strokeWidth,h=t.elSeries,c=this.w,d=i.realIndex,g=i.i,u=i.j,f=i.bc;if(c.globals.isXNumeric){var p=d;c.globals.seriesX[d].length||(p=c.globals.maxValsInArrayIndex),c.globals.seriesX[p][u]&&(a=(c.globals.seriesX[p][u]-c.globals.minX)/this.xRatio-o*this.seriesLen/2),e=a+o*this.visibleI}else if(c.config.plotOptions.bar.hideZeroBarsWhenGrouped){var x=0,b=0;c.globals.seriesPercent.forEach((function(t,e){t[u]&&x++,e<g&&0===t[u]&&b++})),x>0&&(o=this.seriesLen*o/x),e=a+o*this.visibleI,e-=o*b}else e=a+o*this.visibleI;s=this.barHelpers.getYForValue(this.series[g][u],n);var v=this.barHelpers.getColumnPaths({barXPosition:e,barWidth:o,y1:n,y2:s,strokeWidth:l,series:this.series,realIndex:i.realIndex,i:g,j:u,w:c});return c.globals.isXNumeric||(a+=r),this.barHelpers.barBackground({bc:f,j:u,i:g,x1:e-l/2-o*this.visibleI,x2:o*this.seriesLen+l/2,elSeries:h}),{pathTo:v.pathTo,pathFrom:v.pathFrom,x:a,y:s,goalY:this.barHelpers.getGoalValues(\"y\",null,n,g,u),barXPosition:e,barWidth:o}}},{key:\"getPreviousPath\",value:function(t,e){for(var i,a=this.w,s=0;s<a.globals.previousPaths.length;s++){var r=a.globals.previousPaths[s];r.paths&&r.paths.length>0&&parseInt(r.realIndex,10)===parseInt(t,10)&&void 0!==a.globals.previousPaths[s].paths[e]&&(i=a.globals.previousPaths[s].paths[e].d)}return i}}]),t}(),wt=function(t){n(s,t);var i=d(s);function s(){return a(this,s),i.apply(this,arguments)}return r(s,[{key:\"draw\",value:function(t,i){var a=this,s=this.w;this.graphics=new m(this.ctx),this.bar=new yt(this.ctx,this.xyRatios);var r=new y(this.ctx,s);t=r.getLogSeries(t),this.yRatio=r.getLogYRatios(this.yRatio),this.barHelpers.initVariables(t),\"100%\"===s.config.chart.stackType&&(t=s.globals.seriesPercent.slice()),this.series=t,this.totalItems=0,this.prevY=[],this.prevX=[],this.prevYF=[],this.prevXF=[],this.prevYVal=[],this.prevXVal=[],this.xArrj=[],this.xArrjF=[],this.xArrjVal=[],this.yArrj=[],this.yArrjF=[],this.yArrjVal=[];for(var o=0;o<t.length;o++)t[o].length>0&&(this.totalItems+=t[o].length);for(var n=this.graphics.group({class:\"apexcharts-bar-series apexcharts-plot-series\"}),l=0,h=0,c=function(r,o){var c=void 0,d=void 0,g=void 0,u=void 0,f=[],p=[],b=s.globals.comboCharts?i[r]:r;a.yRatio.length>1&&(a.yaxisIndex=b),a.isReversed=s.config.yaxis[a.yaxisIndex]&&s.config.yaxis[a.yaxisIndex].reversed;var v=a.graphics.group({class:\"apexcharts-series\",seriesName:x.escapeString(s.globals.seriesNames[b]),rel:r+1,\"data:realIndex\":b});a.ctx.series.addCollapsedClassToSeries(v,b);var m=a.graphics.group({class:\"apexcharts-datalabels\",\"data:realIndex\":b}),y=a.graphics.group({class:\"apexcharts-bar-goals-markers\",style:\"pointer-events: none\"}),w=0,k=0,A=a.initialPositions(l,h,c,d,g,u);h=A.y,w=A.barHeight,d=A.yDivision,u=A.zeroW,l=A.x,k=A.barWidth,c=A.xDivision,g=A.zeroH,a.yArrj=[],a.yArrjF=[],a.yArrjVal=[],a.xArrj=[],a.xArrjF=[],a.xArrjVal=[],1===a.prevY.length&&a.prevY[0].every((function(t){return isNaN(t)}))&&(a.prevY[0]=a.prevY[0].map((function(t){return g})),a.prevYF[0]=a.prevYF[0].map((function(t){return 0})));for(var S=0;S<s.globals.dataPoints;S++){var C=a.barHelpers.getStrokeWidth(r,S,b),L={indexes:{i:r,j:S,realIndex:b,bc:o},strokeWidth:C,x:l,y:h,elSeries:v},P=null;a.isHorizontal?(P=a.drawStackedBarPaths(e(e({},L),{},{zeroW:u,barHeight:w,yDivision:d})),k=a.series[r][S]/a.invertedYRatio):(P=a.drawStackedColumnPaths(e(e({},L),{},{xDivision:c,barWidth:k,zeroH:g})),w=a.series[r][S]/a.yRatio[a.yaxisIndex]);var I=a.barHelpers.drawGoalLine({barXPosition:P.barXPosition,barYPosition:P.barYPosition,goalX:P.goalX,goalY:P.goalY,barHeight:w,barWidth:k});I&&y.add(I),h=P.y,l=P.x,f.push(l),p.push(h);var T=a.barHelpers.getPathFillColor(t,r,S,b);v=a.renderSeries({realIndex:b,pathFill:T,j:S,i:r,pathFrom:P.pathFrom,pathTo:P.pathTo,strokeWidth:C,elSeries:v,x:l,y:h,series:t,barHeight:w,barWidth:k,elDataLabelsWrap:m,elGoalsMarkers:y,type:\"bar\",visibleSeries:0})}s.globals.seriesXvalues[b]=f,s.globals.seriesYvalues[b]=p,a.prevY.push(a.yArrj),a.prevYF.push(a.yArrjF),a.prevYVal.push(a.yArrjVal),a.prevX.push(a.xArrj),a.prevXF.push(a.xArrjF),a.prevXVal.push(a.xArrjVal),n.add(v)},d=0,g=0;d<t.length;d++,g++)c(d,g);return n}},{key:\"initialPositions\",value:function(t,e,i,a,s,r){var o,n,l=this.w;return this.isHorizontal?(o=(o=a=l.globals.gridHeight/l.globals.dataPoints)*parseInt(l.config.plotOptions.bar.barHeight,10)/100,r=this.baseLineInvertedY+l.globals.padHorizontal+(this.isReversed?l.globals.gridWidth:0)-(this.isReversed?2*this.baseLineInvertedY:0),e=(a-o)/2):(n=i=l.globals.gridWidth/l.globals.dataPoints,n=l.globals.isXNumeric&&l.globals.dataPoints>1?(i=l.globals.minXDiff/this.xRatio)*parseInt(this.barOptions.columnWidth,10)/100:n*parseInt(l.config.plotOptions.bar.columnWidth,10)/100,s=l.globals.gridHeight-this.baseLineY[this.yaxisIndex]-(this.isReversed?l.globals.gridHeight:0)+(this.isReversed?2*this.baseLineY[this.yaxisIndex]:0),t=l.globals.padHorizontal+(i-n)/2),{x:t,y:e,yDivision:a,xDivision:i,barHeight:o,barWidth:n,zeroH:s,zeroW:r}}},{key:\"drawStackedBarPaths\",value:function(t){for(var e,i=t.indexes,a=t.barHeight,s=t.strokeWidth,r=t.zeroW,o=t.x,n=t.y,l=t.yDivision,h=t.elSeries,c=this.w,d=n,g=i.i,u=i.j,f=0,p=0;p<this.prevXF.length;p++)f+=this.prevXF[p][u];if(g>0){var x=r;this.prevXVal[g-1][u]<0?x=this.series[g][u]>=0?this.prevX[g-1][u]+f-2*(this.isReversed?f:0):this.prevX[g-1][u]:this.prevXVal[g-1][u]>=0&&(x=this.series[g][u]>=0?this.prevX[g-1][u]:this.prevX[g-1][u]-f+2*(this.isReversed?f:0)),e=x}else e=r;o=null===this.series[g][u]?e:e+this.series[g][u]/this.invertedYRatio-2*(this.isReversed?this.series[g][u]/this.invertedYRatio:0);var b=this.barHelpers.getBarpaths({barYPosition:d,barHeight:a,x1:e,x2:o,strokeWidth:s,series:this.series,realIndex:i.realIndex,i:g,j:u,w:c});return this.barHelpers.barBackground({j:u,i:g,y1:d,y2:a,elSeries:h}),n+=l,{pathTo:b.pathTo,pathFrom:b.pathFrom,goalX:this.barHelpers.getGoalValues(\"x\",r,null,g,u),barYPosition:d,x:o,y:n}}},{key:\"drawStackedColumnPaths\",value:function(t){var e=t.indexes,i=t.x,a=t.y,s=t.xDivision,r=t.barWidth,o=t.zeroH;t.strokeWidth;var n=t.elSeries,l=this.w,h=e.i,c=e.j,d=e.bc;if(l.globals.isXNumeric){var g=l.globals.seriesX[h][c];g||(g=0),i=(g-l.globals.minX)/this.xRatio-r/2}for(var u,f=i,p=0,x=0;x<this.prevYF.length;x++)p+=isNaN(this.prevYF[x][c])?0:this.prevYF[x][c];if(h>0&&!l.globals.isXNumeric||h>0&&l.globals.isXNumeric&&l.globals.seriesX[h-1][c]===l.globals.seriesX[h][c]){var b,v,m=Math.min(this.yRatio.length+1,h+1);if(void 0!==this.prevY[h-1])for(var y=1;y<m;y++)if(!isNaN(this.prevY[h-y][c])){v=this.prevY[h-y][c];break}for(var w=1;w<m;w++){if(this.prevYVal[h-w][c]<0){b=this.series[h][c]>=0?v-p+2*(this.isReversed?p:0):v;break}if(this.prevYVal[h-w][c]>=0){b=this.series[h][c]>=0?v:v+p-2*(this.isReversed?p:0);break}}void 0===b&&(b=l.globals.gridHeight),u=this.prevYF[0].every((function(t){return 0===t}))&&this.prevYF.slice(1,h).every((function(t){return t.every((function(t){return isNaN(t)}))}))?o:b}else u=o;a=this.series[h][c]?u-this.series[h][c]/this.yRatio[this.yaxisIndex]+2*(this.isReversed?this.series[h][c]/this.yRatio[this.yaxisIndex]:0):u;var k=this.barHelpers.getColumnPaths({barXPosition:f,barWidth:r,y1:u,y2:a,yRatio:this.yRatio[this.yaxisIndex],strokeWidth:this.strokeWidth,series:this.series,realIndex:e.realIndex,i:h,j:c,w:l});return this.barHelpers.barBackground({bc:d,j:c,i:h,x1:f,x2:r,elSeries:n}),i+=s,{pathTo:k.pathTo,pathFrom:k.pathFrom,goalY:this.barHelpers.getGoalValues(\"y\",null,o,h,c),barXPosition:f,x:l.globals.isXNumeric?i-s:i,y:a}}}]),s}(yt),kt=function(t){n(s,t);var i=d(s);function s(){return a(this,s),i.apply(this,arguments)}return r(s,[{key:\"draw\",value:function(t,i,a){var s=this,r=this.w,o=new m(this.ctx),n=r.globals.comboCharts?i:r.config.chart.type,l=new R(this.ctx);this.candlestickOptions=this.w.config.plotOptions.candlestick,this.boxOptions=this.w.config.plotOptions.boxPlot,this.isHorizontal=r.config.plotOptions.bar.horizontal;var h=new y(this.ctx,r);t=h.getLogSeries(t),this.series=t,this.yRatio=h.getLogYRatios(this.yRatio),this.barHelpers.initVariables(t);for(var c=o.group({class:\"apexcharts-\".concat(n,\"-series apexcharts-plot-series\")}),d=function(i){s.isBoxPlot=\"boxPlot\"===r.config.chart.type||\"boxPlot\"===r.config.series[i].type;var n,h,d,g,u=void 0,f=void 0,p=[],b=[],v=r.globals.comboCharts?a[i]:i,m=o.group({class:\"apexcharts-series\",seriesName:x.escapeString(r.globals.seriesNames[v]),rel:i+1,\"data:realIndex\":v});s.ctx.series.addCollapsedClassToSeries(m,v),t[i].length>0&&(s.visibleI=s.visibleI+1);var y,w;s.yRatio.length>1&&(s.yaxisIndex=v);var k=s.barHelpers.initialPositions();f=k.y,y=k.barHeight,h=k.yDivision,g=k.zeroW,u=k.x,w=k.barWidth,n=k.xDivision,d=k.zeroH,b.push(u+w/2);for(var A=o.group({class:\"apexcharts-datalabels\",\"data:realIndex\":v}),S=function(a){var o=s.barHelpers.getStrokeWidth(i,a,v),c=null,x={indexes:{i:i,j:a,realIndex:v},x:u,y:f,strokeWidth:o,elSeries:m};c=s.isHorizontal?s.drawHorizontalBoxPaths(e(e({},x),{},{yDivision:h,barHeight:y,zeroW:g})):s.drawVerticalBoxPaths(e(e({},x),{},{xDivision:n,barWidth:w,zeroH:d})),f=c.y,u=c.x,a>0&&b.push(u+w/2),p.push(f),c.pathTo.forEach((function(e,n){var h=!s.isBoxPlot&&s.candlestickOptions.wick.useFillColor?c.color[n]:r.globals.stroke.colors[i],d=l.fillPath({seriesNumber:v,dataPointIndex:a,color:c.color[n],value:t[i][a]});s.renderSeries({realIndex:v,pathFill:d,lineFill:h,j:a,i:i,pathFrom:c.pathFrom,pathTo:e,strokeWidth:o,elSeries:m,x:u,y:f,series:t,barHeight:y,barWidth:w,elDataLabelsWrap:A,visibleSeries:s.visibleI,type:r.config.chart.type})}))},C=0;C<r.globals.dataPoints;C++)S(C);r.globals.seriesXvalues[v]=b,r.globals.seriesYvalues[v]=p,c.add(m)},g=0;g<t.length;g++)d(g);return c}},{key:\"drawVerticalBoxPaths\",value:function(t){var e=t.indexes,i=t.x;t.y;var a=t.xDivision,s=t.barWidth,r=t.zeroH,o=t.strokeWidth,n=this.w,l=new m(this.ctx),h=e.i,c=e.j,d=!0,g=n.config.plotOptions.candlestick.colors.upward,u=n.config.plotOptions.candlestick.colors.downward,f=\"\";this.isBoxPlot&&(f=[this.boxOptions.colors.lower,this.boxOptions.colors.upper]);var p=this.yRatio[this.yaxisIndex],x=e.realIndex,b=this.getOHLCValue(x,c),v=r,y=r;b.o>b.c&&(d=!1);var w=Math.min(b.o,b.c),k=Math.max(b.o,b.c),A=b.m;n.globals.isXNumeric&&(i=(n.globals.seriesX[x][c]-n.globals.minX)/this.xRatio-s/2);var S=i+s*this.visibleI;void 0===this.series[h][c]||null===this.series[h][c]?(w=r,k=r):(w=r-w/p,k=r-k/p,v=r-b.h/p,y=r-b.l/p,A=r-b.m/p);var C=l.move(S,r),L=l.move(S+s/2,w);return n.globals.previousPaths.length>0&&(L=this.getPreviousPath(x,c,!0)),C=this.isBoxPlot?[l.move(S,w)+l.line(S+s/2,w)+l.line(S+s/2,v)+l.line(S+s/4,v)+l.line(S+s-s/4,v)+l.line(S+s/2,v)+l.line(S+s/2,w)+l.line(S+s,w)+l.line(S+s,A)+l.line(S,A)+l.line(S,w+o/2),l.move(S,A)+l.line(S+s,A)+l.line(S+s,k)+l.line(S+s/2,k)+l.line(S+s/2,y)+l.line(S+s-s/4,y)+l.line(S+s/4,y)+l.line(S+s/2,y)+l.line(S+s/2,k)+l.line(S,k)+l.line(S,A)+\"z\"]:[l.move(S,k)+l.line(S+s/2,k)+l.line(S+s/2,v)+l.line(S+s/2,k)+l.line(S+s,k)+l.line(S+s,w)+l.line(S+s/2,w)+l.line(S+s/2,y)+l.line(S+s/2,w)+l.line(S,w)+l.line(S,k-o/2)],L+=l.move(S,w),n.globals.isXNumeric||(i+=a),{pathTo:C,pathFrom:L,x:i,y:k,barXPosition:S,color:this.isBoxPlot?f:d?[g]:[u]}}},{key:\"drawHorizontalBoxPaths\",value:function(t){var e=t.indexes;t.x;var i=t.y,a=t.yDivision,s=t.barHeight,r=t.zeroW,o=t.strokeWidth,n=this.w,l=new m(this.ctx),h=e.i,c=e.j,d=this.boxOptions.colors.lower;this.isBoxPlot&&(d=[this.boxOptions.colors.lower,this.boxOptions.colors.upper]);var g=this.invertedYRatio,u=e.realIndex,f=this.getOHLCValue(u,c),p=r,x=r,b=Math.min(f.o,f.c),v=Math.max(f.o,f.c),y=f.m;n.globals.isXNumeric&&(i=(n.globals.seriesX[u][c]-n.globals.minX)/this.invertedXRatio-s/2);var w=i+s*this.visibleI;void 0===this.series[h][c]||null===this.series[h][c]?(b=r,v=r):(b=r+b/g,v=r+v/g,p=r+f.h/g,x=r+f.l/g,y=r+f.m/g);var k=l.move(r,w),A=l.move(b,w+s/2);return n.globals.previousPaths.length>0&&(A=this.getPreviousPath(u,c,!0)),k=[l.move(b,w)+l.line(b,w+s/2)+l.line(p,w+s/2)+l.line(p,w+s/2-s/4)+l.line(p,w+s/2+s/4)+l.line(p,w+s/2)+l.line(b,w+s/2)+l.line(b,w+s)+l.line(y,w+s)+l.line(y,w)+l.line(b+o/2,w),l.move(y,w)+l.line(y,w+s)+l.line(v,w+s)+l.line(v,w+s/2)+l.line(x,w+s/2)+l.line(x,w+s-s/4)+l.line(x,w+s/4)+l.line(x,w+s/2)+l.line(v,w+s/2)+l.line(v,w)+l.line(y,w)+\"z\"],A+=l.move(b,w),n.globals.isXNumeric||(i+=a),{pathTo:k,pathFrom:A,x:v,y:i,barYPosition:w,color:d}}},{key:\"getOHLCValue\",value:function(t,e){var i=this.w;return{o:this.isBoxPlot?i.globals.seriesCandleH[t][e]:i.globals.seriesCandleO[t][e],h:this.isBoxPlot?i.globals.seriesCandleO[t][e]:i.globals.seriesCandleH[t][e],m:i.globals.seriesCandleM[t][e],l:this.isBoxPlot?i.globals.seriesCandleC[t][e]:i.globals.seriesCandleL[t][e],c:this.isBoxPlot?i.globals.seriesCandleL[t][e]:i.globals.seriesCandleC[t][e]}}}]),s}(yt),At=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:\"checkColorRange\",value:function(){var t=this.w,e=!1,i=t.config.plotOptions[t.config.chart.type];return i.colorScale.ranges.length>0&&i.colorScale.ranges.map((function(t,i){t.from<=0&&(e=!0)})),e}},{key:\"getShadeColor\",value:function(t,e,i,a){var s=this.w,r=1,o=s.config.plotOptions[t].shadeIntensity,n=this.determineColor(t,e,i);s.globals.hasNegs||a?r=s.config.plotOptions[t].reverseNegativeShade?n.percent<0?n.percent/100*(1.25*o):(1-n.percent/100)*(1.25*o):n.percent<=0?1-(1+n.percent/100)*o:(1-n.percent/100)*o:(r=1-n.percent/100,\"treemap\"===t&&(r=(1-n.percent/100)*(1.25*o)));var l=n.color,h=new x;return s.config.plotOptions[t].enableShades&&(l=\"dark\"===this.w.config.theme.mode?x.hexToRgba(h.shadeColor(-1*r,n.color),s.config.fill.opacity):x.hexToRgba(h.shadeColor(r,n.color),s.config.fill.opacity)),{color:l,colorProps:n}}},{key:\"determineColor\",value:function(t,e,i){var a=this.w,s=a.globals.series[e][i],r=a.config.plotOptions[t],o=r.colorScale.inverse?i:e;r.distributed&&\"treemap\"===a.config.chart.type&&(o=i);var n=a.globals.colors[o],l=null,h=Math.min.apply(Math,u(a.globals.series[e])),c=Math.max.apply(Math,u(a.globals.series[e]));r.distributed||\"heatmap\"!==t||(h=a.globals.minY,c=a.globals.maxY),void 0!==r.colorScale.min&&(h=r.colorScale.min<a.globals.minY?r.colorScale.min:a.globals.minY,c=r.colorScale.max>a.globals.maxY?r.colorScale.max:a.globals.maxY);var d=Math.abs(c)+Math.abs(h),g=100*s/(0===d?d-1e-6:d);r.colorScale.ranges.length>0&&r.colorScale.ranges.map((function(t,e){if(s>=t.from&&s<=t.to){n=t.color,l=t.foreColor?t.foreColor:null,h=t.from,c=t.to;var i=Math.abs(c)+Math.abs(h);g=100*s/(0===i?i-1e-6:i)}}));return{color:n,foreColor:l,percent:g}}},{key:\"calculateDataLabels\",value:function(t){var e=t.text,i=t.x,a=t.y,s=t.i,r=t.j,o=t.colorProps,n=t.fontSize,l=this.w.config.dataLabels,h=new m(this.ctx),c=new O(this.ctx),d=null;if(l.enabled){d=h.group({class:\"apexcharts-data-labels\"});var g=l.offsetX,u=l.offsetY,f=i+g,p=a+parseFloat(l.style.fontSize)/3+u;c.plotDataLabelsText({x:f,y:p,text:e,i:s,j:r,color:o.foreColor,parent:d,fontSize:n,dataLabelsConfig:l})}return d}},{key:\"addListeners\",value:function(t){var e=new m(this.ctx);t.node.addEventListener(\"mouseenter\",e.pathMouseEnter.bind(this,t)),t.node.addEventListener(\"mouseleave\",e.pathMouseLeave.bind(this,t)),t.node.addEventListener(\"mousedown\",e.pathMouseDown.bind(this,t))}}]),t}(),St=function(){function t(e,i){a(this,t),this.ctx=e,this.w=e.w,this.xRatio=i.xRatio,this.yRatio=i.yRatio,this.dynamicAnim=this.w.config.chart.animations.dynamicAnimation,this.helpers=new At(e),this.rectRadius=this.w.config.plotOptions.heatmap.radius,this.strokeWidth=this.w.config.stroke.show?this.w.config.stroke.width:0}return r(t,[{key:\"draw\",value:function(t){var e=this.w,i=new m(this.ctx),a=i.group({class:\"apexcharts-heatmap\"});a.attr(\"clip-path\",\"url(#gridRectMask\".concat(e.globals.cuid,\")\"));var s=e.globals.gridWidth/e.globals.dataPoints,r=e.globals.gridHeight/e.globals.series.length,o=0,n=!1;this.negRange=this.helpers.checkColorRange();var l=t.slice();e.config.yaxis[0].reversed&&(n=!0,l.reverse());for(var h=n?0:l.length-1;n?h<l.length:h>=0;n?h++:h--){var c=i.group({class:\"apexcharts-series apexcharts-heatmap-series\",seriesName:x.escapeString(e.globals.seriesNames[h]),rel:h+1,\"data:realIndex\":h});if(this.ctx.series.addCollapsedClassToSeries(c,h),e.config.chart.dropShadow.enabled){var d=e.config.chart.dropShadow;new v(this.ctx).dropShadow(c,d,h)}for(var g=0,u=e.config.plotOptions.heatmap.shadeIntensity,f=0;f<l[h].length;f++){var p=this.helpers.getShadeColor(e.config.chart.type,h,f,this.negRange),b=p.color,y=p.colorProps;if(\"image\"===e.config.fill.type)b=new R(this.ctx).fillPath({seriesNumber:h,dataPointIndex:f,opacity:e.globals.hasNegs?y.percent<0?1-(1+y.percent/100):u+y.percent/100:y.percent/100,patternID:x.randomId(),width:e.config.fill.image.width?e.config.fill.image.width:s,height:e.config.fill.image.height?e.config.fill.image.height:r});var w=this.rectRadius,k=i.drawRect(g,o,s,r,w);if(k.attr({cx:g,cy:o}),k.node.classList.add(\"apexcharts-heatmap-rect\"),c.add(k),k.attr({fill:b,i:h,index:h,j:f,val:l[h][f],\"stroke-width\":this.strokeWidth,stroke:e.config.plotOptions.heatmap.useFillColorAsStroke?b:e.globals.stroke.colors[0],color:b}),this.helpers.addListeners(k),e.config.chart.animations.enabled&&!e.globals.dataChanged){var A=1;e.globals.resized||(A=e.config.chart.animations.speed),this.animateHeatMap(k,g,o,s,r,A)}if(e.globals.dataChanged){var S=1;if(this.dynamicAnim.enabled&&e.globals.shouldAnimate){S=this.dynamicAnim.speed;var C=e.globals.previousPaths[h]&&e.globals.previousPaths[h][f]&&e.globals.previousPaths[h][f].color;C||(C=\"rgba(255, 255, 255, 0)\"),this.animateHeatColor(k,x.isColorHex(C)?C:x.rgb2hex(C),x.isColorHex(b)?b:x.rgb2hex(b),S)}}var L=(0,e.config.dataLabels.formatter)(e.globals.series[h][f],{value:e.globals.series[h][f],seriesIndex:h,dataPointIndex:f,w:e}),P=this.helpers.calculateDataLabels({text:L,x:g+s/2,y:o+r/2,i:h,j:f,colorProps:y,series:l});null!==P&&c.add(P),g+=s}o+=r,a.add(c)}var I=e.globals.yAxisScale[0].result.slice();e.config.yaxis[0].reversed?I.unshift(\"\"):I.push(\"\"),e.globals.yAxisScale[0].result=I;var T=e.globals.gridHeight/e.globals.series.length;return e.config.yaxis[0].labels.offsetY=-T/2,a}},{key:\"animateHeatMap\",value:function(t,e,i,a,s,r){var o=new b(this.ctx);o.animateRect(t,{x:e+a/2,y:i+s/2,width:0,height:0},{x:e,y:i,width:a,height:s},r,(function(){o.animationCompleted(t)}))}},{key:\"animateHeatColor\",value:function(t,e,i,a){t.attr({fill:e}).animate(a).attr({fill:i})}}]),t}(),Ct=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:\"drawYAxisTexts\",value:function(t,e,i,a){var s=this.w,r=s.config.yaxis[0],o=s.globals.yLabelFormatters[0];return new m(this.ctx).drawText({x:t+r.labels.offsetX,y:e+r.labels.offsetY,text:o(a,i),textAnchor:\"middle\",fontSize:r.labels.style.fontSize,fontFamily:r.labels.style.fontFamily,foreColor:Array.isArray(r.labels.style.colors)?r.labels.style.colors[i]:r.labels.style.colors})}}]),t}(),Lt=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w;var i=this.w;this.chartType=this.w.config.chart.type,this.initialAnim=this.w.config.chart.animations.enabled,this.dynamicAnim=this.initialAnim&&this.w.config.chart.animations.dynamicAnimation.enabled,this.animBeginArr=[0],this.animDur=0,this.donutDataLabels=this.w.config.plotOptions.pie.donut.labels,this.lineColorArr=void 0!==i.globals.stroke.colors?i.globals.stroke.colors:i.globals.colors,this.defaultSize=Math.min(i.globals.gridWidth,i.globals.gridHeight),this.centerY=this.defaultSize/2,this.centerX=i.globals.gridWidth/2,\"radialBar\"===i.config.chart.type?this.fullAngle=360:this.fullAngle=Math.abs(i.config.plotOptions.pie.endAngle-i.config.plotOptions.pie.startAngle),this.initialAngle=i.config.plotOptions.pie.startAngle%this.fullAngle,i.globals.radialSize=this.defaultSize/2.05-i.config.stroke.width-(i.config.chart.sparkline.enabled?0:i.config.chart.dropShadow.blur),this.donutSize=i.globals.radialSize*parseInt(i.config.plotOptions.pie.donut.size,10)/100,this.maxY=0,this.sliceLabels=[],this.sliceSizes=[],this.prevSectorAngleArr=[]}return r(t,[{key:\"draw\",value:function(t){var e=this,i=this.w,a=new m(this.ctx);if(this.ret=a.group({class:\"apexcharts-pie\"}),i.globals.noData)return this.ret;for(var s=0,r=0;r<t.length;r++)s+=x.negToZero(t[r]);var o=[],n=a.group();0===s&&(s=1e-5),t.forEach((function(t){e.maxY=Math.max(e.maxY,t)})),i.config.yaxis[0].max&&(this.maxY=i.config.yaxis[0].max),\"back\"===i.config.grid.position&&\"polarArea\"===this.chartType&&this.drawPolarElements(this.ret);for(var l=0;l<t.length;l++){var h=this.fullAngle*x.negToZero(t[l])/s;o.push(h),\"polarArea\"===this.chartType?(o[l]=this.fullAngle/t.length,this.sliceSizes.push(i.globals.radialSize*t[l]/this.maxY)):this.sliceSizes.push(i.globals.radialSize)}if(i.globals.dataChanged){for(var c,d=0,g=0;g<i.globals.previousPaths.length;g++)d+=x.negToZero(i.globals.previousPaths[g]);for(var u=0;u<i.globals.previousPaths.length;u++)c=this.fullAngle*x.negToZero(i.globals.previousPaths[u])/d,this.prevSectorAngleArr.push(c)}this.donutSize<0&&(this.donutSize=0);var f=i.config.plotOptions.pie.customScale,p=i.globals.gridWidth/2,b=i.globals.gridHeight/2,v=p-i.globals.gridWidth/2*f,y=b-i.globals.gridHeight/2*f;if(\"donut\"===this.chartType){var w=a.drawCircle(this.donutSize);w.attr({cx:this.centerX,cy:this.centerY,fill:i.config.plotOptions.pie.donut.background?i.config.plotOptions.pie.donut.background:\"transparent\"}),n.add(w)}var k=this.drawArcs(o,t);if(this.sliceLabels.forEach((function(t){k.add(t)})),n.attr({transform:\"translate(\".concat(v,\", \").concat(y,\") scale(\").concat(f,\")\")}),n.add(k),this.ret.add(n),this.donutDataLabels.show){var A=this.renderInnerDataLabels(this.donutDataLabels,{hollowSize:this.donutSize,centerX:this.centerX,centerY:this.centerY,opacity:this.donutDataLabels.show,translateX:v,translateY:y});this.ret.add(A)}return\"front\"===i.config.grid.position&&\"polarArea\"===this.chartType&&this.drawPolarElements(this.ret),this.ret}},{key:\"drawArcs\",value:function(t,e){var i=this.w,a=new v(this.ctx),s=new m(this.ctx),r=new R(this.ctx),o=s.group({class:\"apexcharts-slices\"}),n=this.initialAngle,l=this.initialAngle,h=this.initialAngle,c=this.initialAngle;this.strokeWidth=i.config.stroke.show?i.config.stroke.width:0;for(var d=0;d<t.length;d++){var g=s.group({class:\"apexcharts-series apexcharts-pie-series\",seriesName:x.escapeString(i.globals.seriesNames[d]),rel:d+1,\"data:realIndex\":d});o.add(g),l=c,h=(n=h)+t[d],c=l+this.prevSectorAngleArr[d];var u=h<n?this.fullAngle+h-n:h-n,f=r.fillPath({seriesNumber:d,size:this.sliceSizes[d],value:e[d]}),p=this.getChangedPath(l,c),b=s.drawPath({d:p,stroke:Array.isArray(this.lineColorArr)?this.lineColorArr[d]:this.lineColorArr,strokeWidth:0,fill:f,fillOpacity:i.config.fill.opacity,classes:\"apexcharts-pie-area apexcharts-\".concat(this.chartType.toLowerCase(),\"-slice-\").concat(d)});if(b.attr({index:0,j:d}),a.setSelectionFilter(b,0,d),i.config.chart.dropShadow.enabled){var y=i.config.chart.dropShadow;a.dropShadow(b,y,d)}this.addListeners(b,this.donutDataLabels),m.setAttrs(b.node,{\"data:angle\":u,\"data:startAngle\":n,\"data:strokeWidth\":this.strokeWidth,\"data:value\":e[d]});var w={x:0,y:0};\"pie\"===this.chartType||\"polarArea\"===this.chartType?w=x.polarToCartesian(this.centerX,this.centerY,i.globals.radialSize/1.25+i.config.plotOptions.pie.dataLabels.offset,(n+u/2)%this.fullAngle):\"donut\"===this.chartType&&(w=x.polarToCartesian(this.centerX,this.centerY,(i.globals.radialSize+this.donutSize)/2+i.config.plotOptions.pie.dataLabels.offset,(n+u/2)%this.fullAngle)),g.add(b);var k=0;if(!this.initialAnim||i.globals.resized||i.globals.dataChanged?this.animBeginArr.push(0):(0===(k=u/this.fullAngle*i.config.chart.animations.speed)&&(k=1),this.animDur=k+this.animDur,this.animBeginArr.push(this.animDur)),this.dynamicAnim&&i.globals.dataChanged?this.animatePaths(b,{size:this.sliceSizes[d],endAngle:h,startAngle:n,prevStartAngle:l,prevEndAngle:c,animateStartingPos:!0,i:d,animBeginArr:this.animBeginArr,shouldSetPrevPaths:!0,dur:i.config.chart.animations.dynamicAnimation.speed}):this.animatePaths(b,{size:this.sliceSizes[d],endAngle:h,startAngle:n,i:d,totalItems:t.length-1,animBeginArr:this.animBeginArr,dur:k}),i.config.plotOptions.pie.expandOnClick&&\"polarArea\"!==this.chartType&&b.click(this.pieClicked.bind(this,d)),void 0!==i.globals.selectedDataPoints[0]&&i.globals.selectedDataPoints[0].indexOf(d)>-1&&this.pieClicked(d),i.config.dataLabels.enabled){var A=w.x,S=w.y,C=100*u/this.fullAngle+\"%\";if(0!==u&&i.config.plotOptions.pie.dataLabels.minAngleToShowLabel<t[d]){var L=i.config.dataLabels.formatter;void 0!==L&&(C=L(i.globals.seriesPercent[d][0],{seriesIndex:d,w:i}));var P=i.globals.dataLabels.style.colors[d],I=s.group({class:\"apexcharts-datalabels\"}),T=s.drawText({x:A,y:S,text:C,textAnchor:\"middle\",fontSize:i.config.dataLabels.style.fontSize,fontFamily:i.config.dataLabels.style.fontFamily,fontWeight:i.config.dataLabels.style.fontWeight,foreColor:P});if(I.add(T),i.config.dataLabels.dropShadow.enabled){var M=i.config.dataLabels.dropShadow;a.dropShadow(T,M)}T.node.classList.add(\"apexcharts-pie-label\"),i.config.chart.animations.animate&&!1===i.globals.resized&&(T.node.classList.add(\"apexcharts-pie-label-delay\"),T.node.style.animationDelay=i.config.chart.animations.speed/940+\"s\"),this.sliceLabels.push(I)}}}return o}},{key:\"addListeners\",value:function(t,e){var i=new m(this.ctx);t.node.addEventListener(\"mouseenter\",i.pathMouseEnter.bind(this,t)),t.node.addEventListener(\"mouseleave\",i.pathMouseLeave.bind(this,t)),t.node.addEventListener(\"mouseleave\",this.revertDataLabelsInner.bind(this,t.node,e)),t.node.addEventListener(\"mousedown\",i.pathMouseDown.bind(this,t)),this.donutDataLabels.total.showAlways||(t.node.addEventListener(\"mouseenter\",this.printDataLabelsInner.bind(this,t.node,e)),t.node.addEventListener(\"mousedown\",this.printDataLabelsInner.bind(this,t.node,e)))}},{key:\"animatePaths\",value:function(t,e){var i=this.w,a=e.endAngle<e.startAngle?this.fullAngle+e.endAngle-e.startAngle:e.endAngle-e.startAngle,s=a,r=e.startAngle,o=e.startAngle;void 0!==e.prevStartAngle&&void 0!==e.prevEndAngle&&(r=e.prevEndAngle,s=e.prevEndAngle<e.prevStartAngle?this.fullAngle+e.prevEndAngle-e.prevStartAngle:e.prevEndAngle-e.prevStartAngle),e.i===i.config.series.length-1&&(a+o>this.fullAngle?e.endAngle=e.endAngle-(a+o):a+o<this.fullAngle&&(e.endAngle=e.endAngle+(this.fullAngle-(a+o)))),a===this.fullAngle&&(a=this.fullAngle-.01),this.animateArc(t,r,o,a,s,e)}},{key:\"animateArc\",value:function(t,e,i,a,s,r){var o,n=this,l=this.w,h=new b(this.ctx),c=r.size;(isNaN(e)||isNaN(s))&&(e=i,s=a,r.dur=0);var d=a,g=i,u=e<i?this.fullAngle+e-i:e-i;l.globals.dataChanged&&r.shouldSetPrevPaths&&r.prevEndAngle&&(o=n.getPiePath({me:n,startAngle:r.prevStartAngle,angle:r.prevEndAngle<r.prevStartAngle?this.fullAngle+r.prevEndAngle-r.prevStartAngle:r.prevEndAngle-r.prevStartAngle,size:c}),t.attr({d:o})),0!==r.dur?t.animate(r.dur,l.globals.easing,r.animBeginArr[r.i]).afterAll((function(){\"pie\"!==n.chartType&&\"donut\"!==n.chartType&&\"polarArea\"!==n.chartType||this.animate(l.config.chart.animations.dynamicAnimation.speed).attr({\"stroke-width\":n.strokeWidth}),r.i===l.config.series.length-1&&h.animationCompleted(t)})).during((function(l){d=u+(a-u)*l,r.animateStartingPos&&(d=s+(a-s)*l,g=e-s+(i-(e-s))*l),o=n.getPiePath({me:n,startAngle:g,angle:d,size:c}),t.node.setAttribute(\"data:pathOrig\",o),t.attr({d:o})})):(o=n.getPiePath({me:n,startAngle:g,angle:a,size:c}),r.isTrack||(l.globals.animationEnded=!0),t.node.setAttribute(\"data:pathOrig\",o),t.attr({d:o,\"stroke-width\":n.strokeWidth}))}},{key:\"pieClicked\",value:function(t){var e,i=this.w,a=this,s=a.sliceSizes[t]+(i.config.plotOptions.pie.expandOnClick?4:0),r=i.globals.dom.Paper.select(\".apexcharts-\".concat(a.chartType.toLowerCase(),\"-slice-\").concat(t)).members[0];if(\"true\"!==r.attr(\"data:pieClicked\")){var o=i.globals.dom.baseEl.getElementsByClassName(\"apexcharts-pie-area\");Array.prototype.forEach.call(o,(function(t){t.setAttribute(\"data:pieClicked\",\"false\");var e=t.getAttribute(\"data:pathOrig\");e&&t.setAttribute(\"d\",e)})),r.attr(\"data:pieClicked\",\"true\");var n=parseInt(r.attr(\"data:startAngle\"),10),l=parseInt(r.attr(\"data:angle\"),10);e=a.getPiePath({me:a,startAngle:n,angle:l,size:s}),360!==l&&r.plot(e)}else{r.attr({\"data:pieClicked\":\"false\"}),this.revertDataLabelsInner(r.node,this.donutDataLabels);var h=r.attr(\"data:pathOrig\");r.attr({d:h})}}},{key:\"getChangedPath\",value:function(t,e){var i=\"\";return this.dynamicAnim&&this.w.globals.dataChanged&&(i=this.getPiePath({me:this,startAngle:t,angle:e-t,size:this.size})),i}},{key:\"getPiePath\",value:function(t){var e=t.me,i=t.startAngle,a=t.angle,s=t.size,r=i,o=Math.PI*(r-90)/180,n=a+i;Math.ceil(n)>=this.fullAngle+this.w.config.plotOptions.pie.startAngle%this.fullAngle&&(n=this.fullAngle+this.w.config.plotOptions.pie.startAngle%this.fullAngle-.01),Math.ceil(n)>this.fullAngle&&(n-=this.fullAngle);var l=Math.PI*(n-90)/180,h=e.centerX+s*Math.cos(o),c=e.centerY+s*Math.sin(o),d=e.centerX+s*Math.cos(l),g=e.centerY+s*Math.sin(l),u=x.polarToCartesian(e.centerX,e.centerY,e.donutSize,n),f=x.polarToCartesian(e.centerX,e.centerY,e.donutSize,r),p=a>180?1:0,b=[\"M\",h,c,\"A\",s,s,0,p,1,d,g];return\"donut\"===e.chartType?[].concat(b,[\"L\",u.x,u.y,\"A\",e.donutSize,e.donutSize,0,p,0,f.x,f.y,\"L\",h,c,\"z\"]).join(\" \"):\"pie\"===e.chartType||\"polarArea\"===e.chartType?[].concat(b,[\"L\",e.centerX,e.centerY,\"L\",h,c]).join(\" \"):[].concat(b).join(\" \")}},{key:\"drawPolarElements\",value:function(t){var e=this.w,i=new _(this.ctx),a=new m(this.ctx),s=new Ct(this.ctx),r=a.group(),o=a.group(),n=i.niceScale(0,Math.ceil(this.maxY),e.config.yaxis[0].tickAmount,0,!0),l=n.result.reverse(),h=n.result.length;this.maxY=n.niceMax;for(var c=e.globals.radialSize,d=c/(h-1),g=0;g<h-1;g++){var u=a.drawCircle(c);if(u.attr({cx:this.centerX,cy:this.centerY,fill:\"none\",\"stroke-width\":e.config.plotOptions.polarArea.rings.strokeWidth,stroke:e.config.plotOptions.polarArea.rings.strokeColor}),e.config.yaxis[0].show){var f=s.drawYAxisTexts(this.centerX,this.centerY-c+parseInt(e.config.yaxis[0].labels.style.fontSize,10)/2,g,l[g]);o.add(f)}r.add(u),c-=d}this.drawSpokes(t),t.add(r),t.add(o)}},{key:\"renderInnerDataLabels\",value:function(t,e){var i=this.w,a=new m(this.ctx),s=a.group({class:\"apexcharts-datalabels-group\",transform:\"translate(\".concat(e.translateX?e.translateX:0,\", \").concat(e.translateY?e.translateY:0,\") scale(\").concat(i.config.plotOptions.pie.customScale,\")\")}),r=t.total.show;s.node.style.opacity=e.opacity;var o,n,l=e.centerX,h=e.centerY;o=void 0===t.name.color?i.globals.colors[0]:t.name.color;var c=t.name.fontSize,d=t.name.fontFamily,g=t.name.fontWeight;n=void 0===t.value.color?i.config.chart.foreColor:t.value.color;var u=t.value.formatter,f=\"\",p=\"\";if(r?(o=t.total.color,c=t.total.fontSize,d=t.total.fontFamily,g=t.total.fontWeight,p=t.total.label,f=t.total.formatter(i)):1===i.globals.series.length&&(f=u(i.globals.series[0],i),p=i.globals.seriesNames[0]),p&&(p=t.name.formatter(p,t.total.show,i)),t.name.show){var x=a.drawText({x:l,y:h+parseFloat(t.name.offsetY),text:p,textAnchor:\"middle\",foreColor:o,fontSize:c,fontWeight:g,fontFamily:d});x.node.classList.add(\"apexcharts-datalabel-label\"),s.add(x)}if(t.value.show){var b=t.name.show?parseFloat(t.value.offsetY)+16:t.value.offsetY,v=a.drawText({x:l,y:h+b,text:f,textAnchor:\"middle\",foreColor:n,fontWeight:t.value.fontWeight,fontSize:t.value.fontSize,fontFamily:t.value.fontFamily});v.node.classList.add(\"apexcharts-datalabel-value\"),s.add(v)}return s}},{key:\"printInnerLabels\",value:function(t,e,i,a){var s,r=this.w;a?s=void 0===t.name.color?r.globals.colors[parseInt(a.parentNode.getAttribute(\"rel\"),10)-1]:t.name.color:r.globals.series.length>1&&t.total.show&&(s=t.total.color);var o=r.globals.dom.baseEl.querySelector(\".apexcharts-datalabel-label\"),n=r.globals.dom.baseEl.querySelector(\".apexcharts-datalabel-value\");i=(0,t.value.formatter)(i,r),a||\"function\"!=typeof t.total.formatter||(i=t.total.formatter(r));var l=e===t.total.label;e=t.name.formatter(e,l,r),null!==o&&(o.textContent=e),null!==n&&(n.textContent=i),null!==o&&(o.style.fill=s)}},{key:\"printDataLabelsInner\",value:function(t,e){var i=this.w,a=t.getAttribute(\"data:value\"),s=i.globals.seriesNames[parseInt(t.parentNode.getAttribute(\"rel\"),10)-1];i.globals.series.length>1&&this.printInnerLabels(e,s,a,t);var r=i.globals.dom.baseEl.querySelector(\".apexcharts-datalabels-group\");null!==r&&(r.style.opacity=1)}},{key:\"drawSpokes\",value:function(t){var e=this,i=this.w,a=new m(this.ctx),s=i.config.plotOptions.polarArea.spokes;if(0!==s.strokeWidth){for(var r=[],o=360/i.globals.series.length,n=0;n<i.globals.series.length;n++)r.push(x.polarToCartesian(this.centerX,this.centerY,i.globals.radialSize,i.config.plotOptions.pie.startAngle+o*n));r.forEach((function(i,r){var o=a.drawLine(i.x,i.y,e.centerX,e.centerY,Array.isArray(s.connectorColors)?s.connectorColors[r]:s.connectorColors);t.add(o)}))}}},{key:\"revertDataLabelsInner\",value:function(t,e,i){var a=this,s=this.w,r=s.globals.dom.baseEl.querySelector(\".apexcharts-datalabels-group\"),o=!1,n=s.globals.dom.baseEl.getElementsByClassName(\"apexcharts-pie-area\"),l=function(t){var i=t.makeSliceOut,s=t.printLabel;Array.prototype.forEach.call(n,(function(t){\"true\"===t.getAttribute(\"data:pieClicked\")&&(i&&(o=!0),s&&a.printDataLabelsInner(t,e))}))};if(l({makeSliceOut:!0,printLabel:!1}),e.total.show&&s.globals.series.length>1)o&&!e.total.showAlways?l({makeSliceOut:!1,printLabel:!0}):this.printInnerLabels(e,e.total.label,e.total.formatter(s));else if(l({makeSliceOut:!1,printLabel:!0}),!o)if(s.globals.selectedDataPoints.length&&s.globals.series.length>1)if(s.globals.selectedDataPoints[0].length>0){var h=s.globals.selectedDataPoints[0],c=s.globals.dom.baseEl.querySelector(\".apexcharts-\".concat(this.chartType.toLowerCase(),\"-slice-\").concat(h));this.printDataLabelsInner(c,e)}else r&&s.globals.selectedDataPoints.length&&0===s.globals.selectedDataPoints[0].length&&(r.style.opacity=0);else r&&s.globals.series.length>1&&(r.style.opacity=0)}}]),t}(),Pt=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.chartType=this.w.config.chart.type,this.initialAnim=this.w.config.chart.animations.enabled,this.dynamicAnim=this.initialAnim&&this.w.config.chart.animations.dynamicAnimation.enabled,this.animDur=0;var i=this.w;this.graphics=new m(this.ctx),this.lineColorArr=void 0!==i.globals.stroke.colors?i.globals.stroke.colors:i.globals.colors,this.defaultSize=i.globals.svgHeight<i.globals.svgWidth?i.globals.gridHeight+1.5*i.globals.goldenPadding:i.globals.gridWidth,this.isLog=i.config.yaxis[0].logarithmic,this.coreUtils=new y(this.ctx),this.maxValue=this.isLog?this.coreUtils.getLogVal(i.globals.maxY,0):i.globals.maxY,this.minValue=this.isLog?this.coreUtils.getLogVal(this.w.globals.minY,0):i.globals.minY,this.polygons=i.config.plotOptions.radar.polygons,this.strokeWidth=i.config.stroke.show?i.config.stroke.width:0,this.size=this.defaultSize/2.1-this.strokeWidth-i.config.chart.dropShadow.blur,i.config.xaxis.labels.show&&(this.size=this.size-i.globals.xAxisLabelsWidth/1.75),void 0!==i.config.plotOptions.radar.size&&(this.size=i.config.plotOptions.radar.size),this.dataRadiusOfPercent=[],this.dataRadius=[],this.angleArr=[],this.yaxisLabelsTextsPos=[]}return r(t,[{key:\"draw\",value:function(t){var i=this,a=this.w,s=new R(this.ctx),r=[],o=new O(this.ctx);t.length&&(this.dataPointsLen=t[a.globals.maxValsInArrayIndex].length),this.disAngle=2*Math.PI/this.dataPointsLen;var n=a.globals.gridWidth/2,l=a.globals.gridHeight/2,h=n+a.config.plotOptions.radar.offsetX,c=l+a.config.plotOptions.radar.offsetY,d=this.graphics.group({class:\"apexcharts-radar-series apexcharts-plot-series\",transform:\"translate(\".concat(h||0,\", \").concat(c||0,\")\")}),g=[],u=null,f=null;if(this.yaxisLabels=this.graphics.group({class:\"apexcharts-yaxis\"}),t.forEach((function(t,n){var l=t.length===a.globals.dataPoints,h=i.graphics.group().attr({class:\"apexcharts-series\",\"data:longestSeries\":l,seriesName:x.escapeString(a.globals.seriesNames[n]),rel:n+1,\"data:realIndex\":n});i.dataRadiusOfPercent[n]=[],i.dataRadius[n]=[],i.angleArr[n]=[],t.forEach((function(t,e){var a=Math.abs(i.maxValue-i.minValue);t+=Math.abs(i.minValue),i.isLog&&(t=i.coreUtils.getLogVal(t,0)),i.dataRadiusOfPercent[n][e]=t/a,i.dataRadius[n][e]=i.dataRadiusOfPercent[n][e]*i.size,i.angleArr[n][e]=e*i.disAngle})),g=i.getDataPointsPos(i.dataRadius[n],i.angleArr[n]);var c=i.createPaths(g,{x:0,y:0});u=i.graphics.group({class:\"apexcharts-series-markers-wrap apexcharts-element-hidden\"}),f=i.graphics.group({class:\"apexcharts-datalabels\",\"data:realIndex\":n}),a.globals.delayedElements.push({el:u.node,index:n});var d={i:n,realIndex:n,animationDelay:n,initialSpeed:a.config.chart.animations.speed,dataChangeSpeed:a.config.chart.animations.dynamicAnimation.speed,className:\"apexcharts-radar\",shouldClipToGrid:!1,bindEventsOnPaths:!1,stroke:a.globals.stroke.colors[n],strokeLineCap:a.config.stroke.lineCap},p=null;a.globals.previousPaths.length>0&&(p=i.getPreviousPath(n));for(var b=0;b<c.linePathsTo.length;b++){var m=i.graphics.renderPaths(e(e({},d),{},{pathFrom:null===p?c.linePathsFrom[b]:p,pathTo:c.linePathsTo[b],strokeWidth:Array.isArray(i.strokeWidth)?i.strokeWidth[n]:i.strokeWidth,fill:\"none\",drawShadow:!1}));h.add(m);var y=s.fillPath({seriesNumber:n}),w=i.graphics.renderPaths(e(e({},d),{},{pathFrom:null===p?c.areaPathsFrom[b]:p,pathTo:c.areaPathsTo[b],strokeWidth:0,fill:y,drawShadow:!1}));if(a.config.chart.dropShadow.enabled){var k=new v(i.ctx),A=a.config.chart.dropShadow;k.dropShadow(w,Object.assign({},A,{noUserSpaceOnUse:!0}),n)}h.add(w)}t.forEach((function(t,s){var r=new D(i.ctx).getMarkerConfig({cssClass:\"apexcharts-marker\",seriesIndex:n,dataPointIndex:s}),l=i.graphics.drawMarker(g[s].x,g[s].y,r);l.attr(\"rel\",s),l.attr(\"j\",s),l.attr(\"index\",n),l.node.setAttribute(\"default-marker-size\",r.pSize);var c=i.graphics.group({class:\"apexcharts-series-markers\"});c&&c.add(l),u.add(c),h.add(u);var d=a.config.dataLabels;if(d.enabled){var p=d.formatter(a.globals.series[n][s],{seriesIndex:n,dataPointIndex:s,w:a});o.plotDataLabelsText({x:g[s].x,y:g[s].y,text:p,textAnchor:\"middle\",i:n,j:n,parent:f,offsetCorrection:!1,dataLabelsConfig:e({},d)})}h.add(f)})),r.push(h)})),this.drawPolygons({parent:d}),a.config.xaxis.labels.show){var p=this.drawXAxisTexts();d.add(p)}return r.forEach((function(t){d.add(t)})),d.add(this.yaxisLabels),d}},{key:\"drawPolygons\",value:function(t){for(var e=this,i=this.w,a=t.parent,s=new Ct(this.ctx),r=i.globals.yAxisScale[0].result.reverse(),o=r.length,n=[],l=this.size/(o-1),h=0;h<o;h++)n[h]=l*h;n.reverse();var c=[],d=[];n.forEach((function(t,i){var a=x.getPolygonPos(t,e.dataPointsLen),s=\"\";a.forEach((function(t,a){if(0===i){var r=e.graphics.drawLine(t.x,t.y,0,0,Array.isArray(e.polygons.connectorColors)?e.polygons.connectorColors[a]:e.polygons.connectorColors);d.push(r)}0===a&&e.yaxisLabelsTextsPos.push({x:t.x,y:t.y}),s+=t.x+\",\"+t.y+\" \"})),c.push(s)})),c.forEach((function(t,s){var r=e.polygons.strokeColors,o=e.polygons.strokeWidth,n=e.graphics.drawPolygon(t,Array.isArray(r)?r[s]:r,Array.isArray(o)?o[s]:o,i.globals.radarPolygons.fill.colors[s]);a.add(n)})),d.forEach((function(t){a.add(t)})),i.config.yaxis[0].show&&this.yaxisLabelsTextsPos.forEach((function(t,i){var a=s.drawYAxisTexts(t.x,t.y,i,r[i]);e.yaxisLabels.add(a)}))}},{key:\"drawXAxisTexts\",value:function(){var t=this,i=this.w,a=i.config.xaxis.labels,s=this.graphics.group({class:\"apexcharts-xaxis\"}),r=x.getPolygonPos(this.size,this.dataPointsLen);return i.globals.labels.forEach((function(o,n){var l=i.config.xaxis.labels.formatter,h=new O(t.ctx);if(r[n]){var c=t.getTextPos(r[n],t.size),d=l(o,{seriesIndex:-1,dataPointIndex:n,w:i});h.plotDataLabelsText({x:c.newX,y:c.newY,text:d,textAnchor:c.textAnchor,i:n,j:n,parent:s,color:Array.isArray(a.style.colors)&&a.style.colors[n]?a.style.colors[n]:\"#a8a8a8\",dataLabelsConfig:e({textAnchor:c.textAnchor,dropShadow:{enabled:!1}},a),offsetCorrection:!1})}})),s}},{key:\"createPaths\",value:function(t,e){var i=this,a=[],s=[],r=[],o=[];if(t.length){s=[this.graphics.move(e.x,e.y)],o=[this.graphics.move(e.x,e.y)];var n=this.graphics.move(t[0].x,t[0].y),l=this.graphics.move(t[0].x,t[0].y);t.forEach((function(e,a){n+=i.graphics.line(e.x,e.y),l+=i.graphics.line(e.x,e.y),a===t.length-1&&(n+=\"Z\",l+=\"Z\")})),a.push(n),r.push(l)}return{linePathsFrom:s,linePathsTo:a,areaPathsFrom:o,areaPathsTo:r}}},{key:\"getTextPos\",value:function(t,e){var i=\"middle\",a=t.x,s=t.y;return Math.abs(t.x)>=10?t.x>0?(i=\"start\",a+=10):t.x<0&&(i=\"end\",a-=10):i=\"middle\",Math.abs(t.y)>=e-10&&(t.y<0?s-=10:t.y>0&&(s+=10)),{textAnchor:i,newX:a,newY:s}}},{key:\"getPreviousPath\",value:function(t){for(var e=this.w,i=null,a=0;a<e.globals.previousPaths.length;a++){var s=e.globals.previousPaths[a];s.paths.length>0&&parseInt(s.realIndex,10)===parseInt(t,10)&&void 0!==e.globals.previousPaths[a].paths[0]&&(i=e.globals.previousPaths[a].paths[0].d)}return i}},{key:\"getDataPointsPos\",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.dataPointsLen;t=t||[],e=e||[];for(var a=[],s=0;s<i;s++){var r={};r.x=t[s]*Math.sin(e[s]),r.y=-t[s]*Math.cos(e[s]),a.push(r)}return a}}]),t}(),It=function(t){n(i,t);var e=d(i);function i(t){var s;a(this,i),(s=e.call(this,t)).ctx=t,s.w=t.w,s.animBeginArr=[0],s.animDur=0;var r=s.w;return s.startAngle=r.config.plotOptions.radialBar.startAngle,s.endAngle=r.config.plotOptions.radialBar.endAngle,s.totalAngle=Math.abs(r.config.plotOptions.radialBar.endAngle-r.config.plotOptions.radialBar.startAngle),s.trackStartAngle=r.config.plotOptions.radialBar.track.startAngle,s.trackEndAngle=r.config.plotOptions.radialBar.track.endAngle,s.donutDataLabels=s.w.config.plotOptions.radialBar.dataLabels,s.radialDataLabels=s.donutDataLabels,s.trackStartAngle||(s.trackStartAngle=s.startAngle),s.trackEndAngle||(s.trackEndAngle=s.endAngle),360===s.endAngle&&(s.endAngle=359.99),s.margin=parseInt(r.config.plotOptions.radialBar.track.margin,10),s}return r(i,[{key:\"draw\",value:function(t){var e=this.w,i=new m(this.ctx),a=i.group({class:\"apexcharts-radialbar\"});if(e.globals.noData)return a;var s=i.group(),r=this.defaultSize/2,o=e.globals.gridWidth/2,n=this.defaultSize/2.05;e.config.chart.sparkline.enabled||(n=n-e.config.stroke.width-e.config.chart.dropShadow.blur);var l=e.globals.fill.colors;if(e.config.plotOptions.radialBar.track.show){var h=this.drawTracks({size:n,centerX:o,centerY:r,colorArr:l,series:t});s.add(h)}var c=this.drawArcs({size:n,centerX:o,centerY:r,colorArr:l,series:t}),d=360;e.config.plotOptions.radialBar.startAngle<0&&(d=this.totalAngle);var g=(360-d)/360;if(e.globals.radialSize=n-n*g,this.radialDataLabels.value.show){var u=Math.max(this.radialDataLabels.value.offsetY,this.radialDataLabels.name.offsetY);e.globals.radialSize+=u*g}return s.add(c.g),\"front\"===e.config.plotOptions.radialBar.hollow.position&&(c.g.add(c.elHollow),c.dataLabels&&c.g.add(c.dataLabels)),a.add(s),a}},{key:\"drawTracks\",value:function(t){var e=this.w,i=new m(this.ctx),a=i.group({class:\"apexcharts-tracks\"}),s=new v(this.ctx),r=new R(this.ctx),o=this.getStrokeWidth(t);t.size=t.size-o/2;for(var n=0;n<t.series.length;n++){var l=i.group({class:\"apexcharts-radialbar-track apexcharts-track\"});a.add(l),l.attr({rel:n+1}),t.size=t.size-o-this.margin;var h=e.config.plotOptions.radialBar.track,c=r.fillPath({seriesNumber:0,size:t.size,fillColors:Array.isArray(h.background)?h.background[n]:h.background,solid:!0}),d=this.trackStartAngle,g=this.trackEndAngle;Math.abs(g)+Math.abs(d)>=360&&(g=360-Math.abs(this.startAngle)-.1);var u=i.drawPath({d:\"\",stroke:c,strokeWidth:o*parseInt(h.strokeWidth,10)/100,fill:\"none\",strokeOpacity:h.opacity,classes:\"apexcharts-radialbar-area\"});if(h.dropShadow.enabled){var f=h.dropShadow;s.dropShadow(u,f)}l.add(u),u.attr(\"id\",\"apexcharts-radialbarTrack-\"+n),this.animatePaths(u,{centerX:t.centerX,centerY:t.centerY,endAngle:g,startAngle:d,size:t.size,i:n,totalItems:2,animBeginArr:0,dur:0,isTrack:!0,easing:e.globals.easing})}return a}},{key:\"drawArcs\",value:function(t){var e=this.w,i=new m(this.ctx),a=new R(this.ctx),s=new v(this.ctx),r=i.group(),o=this.getStrokeWidth(t);t.size=t.size-o/2;var n=e.config.plotOptions.radialBar.hollow.background,l=t.size-o*t.series.length-this.margin*t.series.length-o*parseInt(e.config.plotOptions.radialBar.track.strokeWidth,10)/100/2,h=l-e.config.plotOptions.radialBar.hollow.margin;void 0!==e.config.plotOptions.radialBar.hollow.image&&(n=this.drawHollowImage(t,r,l,n));var c=this.drawHollow({size:h,centerX:t.centerX,centerY:t.centerY,fill:n||\"transparent\"});if(e.config.plotOptions.radialBar.hollow.dropShadow.enabled){var d=e.config.plotOptions.radialBar.hollow.dropShadow;s.dropShadow(c,d)}var g=1;!this.radialDataLabels.total.show&&e.globals.series.length>1&&(g=0);var u=null;this.radialDataLabels.show&&(u=this.renderInnerDataLabels(this.radialDataLabels,{hollowSize:l,centerX:t.centerX,centerY:t.centerY,opacity:g})),\"back\"===e.config.plotOptions.radialBar.hollow.position&&(r.add(c),u&&r.add(u));var f=!1;e.config.plotOptions.radialBar.inverseOrder&&(f=!0);for(var p=f?t.series.length-1:0;f?p>=0:p<t.series.length;f?p--:p++){var b=i.group({class:\"apexcharts-series apexcharts-radial-series\",seriesName:x.escapeString(e.globals.seriesNames[p])});r.add(b),b.attr({rel:p+1,\"data:realIndex\":p}),this.ctx.series.addCollapsedClassToSeries(b,p),t.size=t.size-o-this.margin;var y=a.fillPath({seriesNumber:p,size:t.size,value:t.series[p]}),w=this.startAngle,k=void 0,A=x.negToZero(t.series[p]>100?100:t.series[p])/100,S=Math.round(this.totalAngle*A)+this.startAngle,C=void 0;e.globals.dataChanged&&(k=this.startAngle,C=Math.round(this.totalAngle*x.negToZero(e.globals.previousPaths[p])/100)+k),Math.abs(S)+Math.abs(w)>=360&&(S-=.01),Math.abs(C)+Math.abs(k)>=360&&(C-=.01);var L=S-w,P=Array.isArray(e.config.stroke.dashArray)?e.config.stroke.dashArray[p]:e.config.stroke.dashArray,I=i.drawPath({d:\"\",stroke:y,strokeWidth:o,fill:\"none\",fillOpacity:e.config.fill.opacity,classes:\"apexcharts-radialbar-area apexcharts-radialbar-slice-\"+p,strokeDashArray:P});if(m.setAttrs(I.node,{\"data:angle\":L,\"data:value\":t.series[p]}),e.config.chart.dropShadow.enabled){var T=e.config.chart.dropShadow;s.dropShadow(I,T,p)}s.setSelectionFilter(I,0,p),this.addListeners(I,this.radialDataLabels),b.add(I),I.attr({index:0,j:p});var M=0;!this.initialAnim||e.globals.resized||e.globals.dataChanged||(M=e.config.chart.animations.speed),e.globals.dataChanged&&(M=e.config.chart.animations.dynamicAnimation.speed),this.animDur=M/(1.2*t.series.length)+this.animDur,this.animBeginArr.push(this.animDur),this.animatePaths(I,{centerX:t.centerX,centerY:t.centerY,endAngle:S,startAngle:w,prevEndAngle:C,prevStartAngle:k,size:t.size,i:p,totalItems:2,animBeginArr:this.animBeginArr,dur:M,shouldSetPrevPaths:!0,easing:e.globals.easing})}return{g:r,elHollow:c,dataLabels:u}}},{key:\"drawHollow\",value:function(t){var e=new m(this.ctx).drawCircle(2*t.size);return e.attr({class:\"apexcharts-radialbar-hollow\",cx:t.centerX,cy:t.centerY,r:t.size,fill:t.fill}),e}},{key:\"drawHollowImage\",value:function(t,e,i,a){var s=this.w,r=new R(this.ctx),o=x.randomId(),n=s.config.plotOptions.radialBar.hollow.image;if(s.config.plotOptions.radialBar.hollow.imageClipped)r.clippedImgArea({width:i,height:i,image:n,patternID:\"pattern\".concat(s.globals.cuid).concat(o)}),a=\"url(#pattern\".concat(s.globals.cuid).concat(o,\")\");else{var l=s.config.plotOptions.radialBar.hollow.imageWidth,h=s.config.plotOptions.radialBar.hollow.imageHeight;if(void 0===l&&void 0===h){var c=s.globals.dom.Paper.image(n).loaded((function(e){this.move(t.centerX-e.width/2+s.config.plotOptions.radialBar.hollow.imageOffsetX,t.centerY-e.height/2+s.config.plotOptions.radialBar.hollow.imageOffsetY)}));e.add(c)}else{var d=s.globals.dom.Paper.image(n).loaded((function(e){this.move(t.centerX-l/2+s.config.plotOptions.radialBar.hollow.imageOffsetX,t.centerY-h/2+s.config.plotOptions.radialBar.hollow.imageOffsetY),this.size(l,h)}));e.add(d)}}return a}},{key:\"getStrokeWidth\",value:function(t){var e=this.w;return t.size*(100-parseInt(e.config.plotOptions.radialBar.hollow.size,10))/100/(t.series.length+1)-this.margin}}]),i}(Lt),Tt=function(t){n(s,t);var i=d(s);function s(){return a(this,s),i.apply(this,arguments)}return r(s,[{key:\"draw\",value:function(t,i){var a=this.w,s=new m(this.ctx);this.rangeBarOptions=this.w.config.plotOptions.rangeBar,this.series=t,this.seriesRangeStart=a.globals.seriesRangeStart,this.seriesRangeEnd=a.globals.seriesRangeEnd,this.barHelpers.initVariables(t);for(var r=s.group({class:\"apexcharts-rangebar-series apexcharts-plot-series\"}),o=0;o<t.length;o++){var n,l,h,c=void 0,d=void 0,g=void 0,u=a.globals.comboCharts?i[o]:o,f=s.group({class:\"apexcharts-series\",seriesName:x.escapeString(a.globals.seriesNames[u]),rel:o+1,\"data:realIndex\":u});this.ctx.series.addCollapsedClassToSeries(f,u),t[o].length>0&&(this.visibleI=this.visibleI+1);var p=0,b=0;this.yRatio.length>1&&(this.yaxisIndex=u);var v=this.barHelpers.initialPositions();d=v.y,h=v.zeroW,c=v.x,b=v.barWidth,n=v.xDivision,l=v.zeroH;for(var y=s.group({class:\"apexcharts-datalabels\",\"data:realIndex\":u}),w=s.group({class:\"apexcharts-rangebar-goals-markers\",style:\"pointer-events: none\"}),k=0;k<a.globals.dataPoints;k++){var A=this.barHelpers.getStrokeWidth(o,k,u),S=this.seriesRangeStart[o][k],C=this.seriesRangeEnd[o][k],L=null,P=null,I={x:c,y:d,strokeWidth:A,elSeries:f};if(g=v.yDivision,p=v.barHeight,this.isHorizontal){P=d+p*this.visibleI;var T=this.seriesLen;a.config.plotOptions.bar.rangeBarGroupRows&&(T=1);var M=(g-p*T)/2;if(void 0===a.config.series[o].data[k])break;if(a.config.series[o].data[k].x){var z=this.detectOverlappingBars({i:o,j:k,barYPosition:P,srty:M,barHeight:p,yDivision:g,initPositions:v});p=z.barHeight,P=z.barYPosition}b=(L=this.drawRangeBarPaths(e({indexes:{i:o,j:k,realIndex:u},barHeight:p,barYPosition:P,zeroW:h,yDivision:g,y1:S,y2:C},I))).barWidth}else p=(L=this.drawRangeColumnPaths(e({indexes:{i:o,j:k,realIndex:u},zeroH:l,barWidth:b,xDivision:n},I))).barHeight;var X=this.barHelpers.drawGoalLine({barXPosition:L.barXPosition,barYPosition:P,goalX:L.goalX,goalY:L.goalY,barHeight:p,barWidth:b});X&&w.add(X),d=L.y,c=L.x;var E=this.barHelpers.getPathFillColor(t,o,k,u),Y=a.globals.stroke.colors[u];this.renderSeries({realIndex:u,pathFill:E,lineFill:Y,j:k,i:o,x:c,y:d,y1:S,y2:C,pathFrom:L.pathFrom,pathTo:L.pathTo,strokeWidth:A,elSeries:f,series:t,barHeight:p,barYPosition:P,barWidth:b,elDataLabelsWrap:y,elGoalsMarkers:w,visibleSeries:this.visibleI,type:\"rangebar\"})}r.add(f)}return r}},{key:\"detectOverlappingBars\",value:function(t){var e=t.i,i=t.j,a=t.barYPosition,s=t.srty,r=t.barHeight,o=t.yDivision,n=t.initPositions,l=this.w,h=[],c=l.config.series[e].data[i].rangeName,d=l.config.series[e].data[i].x,g=l.globals.labels.indexOf(d),u=l.globals.seriesRange[e].findIndex((function(t){return t.x===d&&t.overlaps.length>0}));return a=l.config.plotOptions.bar.rangeBarGroupRows?s+o*g:s+r*this.visibleI+o*g,u>-1&&!l.config.plotOptions.bar.rangeBarOverlap&&(h=l.globals.seriesRange[e][u].overlaps).indexOf(c)>-1&&(a=(r=n.barHeight/h.length)*this.visibleI+o*(100-parseInt(this.barOptions.barHeight,10))/100/2+r*(this.visibleI+h.indexOf(c))+o*g),{barYPosition:a,barHeight:r}}},{key:\"drawRangeColumnPaths\",value:function(t){var e=t.indexes,i=t.x;t.strokeWidth;var a=t.xDivision,s=t.barWidth,r=t.zeroH,o=this.w,n=e.i,l=e.j,h=this.yRatio[this.yaxisIndex],c=e.realIndex,d=this.getRangeValue(c,l),g=Math.min(d.start,d.end),u=Math.max(d.start,d.end);o.globals.isXNumeric&&(i=(o.globals.seriesX[n][l]-o.globals.minX)/this.xRatio-s/2);var f=i+s*this.visibleI;void 0===this.series[n][l]||null===this.series[n][l]?g=r:(g=r-g/h,u=r-u/h);var p=Math.abs(u-g),x=this.barHelpers.getColumnPaths({barXPosition:f,barWidth:s,y1:g,y2:u,strokeWidth:this.strokeWidth,series:this.seriesRangeEnd,realIndex:e.realIndex,i:c,j:l,w:o});return o.globals.isXNumeric||(i+=a),{pathTo:x.pathTo,pathFrom:x.pathFrom,barHeight:p,x:i,y:u,goalY:this.barHelpers.getGoalValues(\"y\",null,r,n,l),barXPosition:f}}},{key:\"drawRangeBarPaths\",value:function(t){var e=t.indexes,i=t.y,a=t.y1,s=t.y2,r=t.yDivision,o=t.barHeight,n=t.barYPosition,l=t.zeroW,h=this.w,c=l+a/this.invertedYRatio,d=l+s/this.invertedYRatio,g=Math.abs(d-c),u=this.barHelpers.getBarpaths({barYPosition:n,barHeight:o,x1:c,x2:d,strokeWidth:this.strokeWidth,series:this.seriesRangeEnd,i:e.realIndex,realIndex:e.realIndex,j:e.j,w:h});return h.globals.isXNumeric||(i+=r),{pathTo:u.pathTo,pathFrom:u.pathFrom,barWidth:g,x:d,goalX:this.barHelpers.getGoalValues(\"x\",l,null,e.realIndex,e.j),y:i}}},{key:\"getRangeValue\",value:function(t,e){var i=this.w;return{start:i.globals.seriesRangeStart[t][e],end:i.globals.seriesRangeEnd[t][e]}}}]),s}(yt),Mt=function(){function t(e){a(this,t),this.w=e.w,this.lineCtx=e}return r(t,[{key:\"sameValueSeriesFix\",value:function(t,e){var i=this.w;if((\"gradient\"===i.config.fill.type||\"gradient\"===i.config.fill.type[t])&&new y(this.lineCtx.ctx,i).seriesHaveSameValues(t)){var a=e[t].slice();a[a.length-1]=a[a.length-1]+1e-6,e[t]=a}return e}},{key:\"calculatePoints\",value:function(t){var e=t.series,i=t.realIndex,a=t.x,s=t.y,r=t.i,o=t.j,n=t.prevY,l=this.w,h=[],c=[];if(0===o){var d=this.lineCtx.categoryAxisCorrection+l.config.markers.offsetX;l.globals.isXNumeric&&(d=(l.globals.seriesX[i][0]-l.globals.minX)/this.lineCtx.xRatio+l.config.markers.offsetX),h.push(d),c.push(x.isNumber(e[r][0])?n+l.config.markers.offsetY:null),h.push(a+l.config.markers.offsetX),c.push(x.isNumber(e[r][o+1])?s+l.config.markers.offsetY:null)}else h.push(a+l.config.markers.offsetX),c.push(x.isNumber(e[r][o+1])?s+l.config.markers.offsetY:null);return{x:h,y:c}}},{key:\"checkPreviousPaths\",value:function(t){for(var e=t.pathFromLine,i=t.pathFromArea,a=t.realIndex,s=this.w,r=0;r<s.globals.previousPaths.length;r++){var o=s.globals.previousPaths[r];(\"line\"===o.type||\"area\"===o.type)&&o.paths.length>0&&parseInt(o.realIndex,10)===parseInt(a,10)&&(\"line\"===o.type?(this.lineCtx.appendPathFrom=!1,e=s.globals.previousPaths[r].paths[0].d):\"area\"===o.type&&(this.lineCtx.appendPathFrom=!1,i=s.globals.previousPaths[r].paths[0].d,s.config.stroke.show&&s.globals.previousPaths[r].paths[1]&&(e=s.globals.previousPaths[r].paths[1].d)))}return{pathFromLine:e,pathFromArea:i}}},{key:\"determineFirstPrevY\",value:function(t){var e,i=t.i,a=t.series,s=t.prevY,r=t.lineYPosition,o=this.w;if(void 0!==(null===(e=a[i])||void 0===e?void 0:e[0]))s=(r=o.config.chart.stacked&&i>0?this.lineCtx.prevSeriesY[i-1][0]:this.lineCtx.zeroY)-a[i][0]/this.lineCtx.yRatio[this.lineCtx.yaxisIndex]+2*(this.lineCtx.isReversed?a[i][0]/this.lineCtx.yRatio[this.lineCtx.yaxisIndex]:0);else if(o.config.chart.stacked&&i>0&&void 0===a[i][0])for(var n=i-1;n>=0;n--)if(null!==a[n][0]&&void 0!==a[n][0]){s=r=this.lineCtx.prevSeriesY[n][0];break}return{prevY:s,lineYPosition:r}}}]),t}(),zt=function(){function t(e,i,s){a(this,t),this.ctx=e,this.w=e.w,this.xyRatios=i,this.pointsChart=!(\"bubble\"!==this.w.config.chart.type&&\"scatter\"!==this.w.config.chart.type)||s,this.scatter=new H(this.ctx),this.noNegatives=this.w.globals.minX===Number.MAX_VALUE,this.lineHelpers=new Mt(this),this.markers=new D(this.ctx),this.prevSeriesY=[],this.categoryAxisCorrection=0,this.yaxisIndex=0}return r(t,[{key:\"draw\",value:function(t,i,a,s){var r=this.w,o=new m(this.ctx),n=r.globals.comboCharts?i:r.config.chart.type,l=o.group({class:\"apexcharts-\".concat(n,\"-series apexcharts-plot-series\")}),h=new y(this.ctx,r);this.yRatio=this.xyRatios.yRatio,this.zRatio=this.xyRatios.zRatio,this.xRatio=this.xyRatios.xRatio,this.baseLineY=this.xyRatios.baseLineY,t=h.getLogSeries(t),this.yRatio=h.getLogYRatios(this.yRatio);for(var c=[],d=0;d<t.length;d++){t=this.lineHelpers.sameValueSeriesFix(d,t);var g=r.globals.comboCharts?a[d]:d;this._initSerieVariables(t,d,g);var u=[],f=[],p=r.globals.padHorizontal+this.categoryAxisCorrection;this.ctx.series.addCollapsedClassToSeries(this.elSeries,g),r.globals.isXNumeric&&r.globals.seriesX.length>0&&(p=(r.globals.seriesX[g][0]-r.globals.minX)/this.xRatio),f.push(p);var x,b=p,v=void 0,w=b,k=this.zeroY,A=this.zeroY;k=this.lineHelpers.determineFirstPrevY({i:d,series:t,prevY:k,lineYPosition:0}).prevY,u.push(k),x=k;\"rangeArea\"===n&&(v=A=this.lineHelpers.determineFirstPrevY({i:d,series:s,prevY:A,lineYPosition:0}).prevY);var S={type:n,series:t,realIndex:g,i:d,x:p,y:1,pX:b,pY:x,pathsFrom:this._calculatePathsFrom({type:n,series:t,i:d,realIndex:g,prevX:w,prevY:k,prevY2:A}),linePaths:[],areaPaths:[],seriesIndex:a,lineYPosition:0,xArrj:f,yArrj:u,seriesRangeEnd:s},C=this._iterateOverDataPoints(e(e({},S),{},{iterations:\"rangeArea\"===n?t[d].length-1:void 0,isRangeStart:!0}));if(\"rangeArea\"===n){var L=this._calculatePathsFrom({series:s,i:d,realIndex:g,prevX:w,prevY:A}),P=this._iterateOverDataPoints(e(e({},S),{},{series:s,pY:v,pathsFrom:L,iterations:s[d].length-1,isRangeStart:!1}));C.linePaths[0]=P.linePath+C.linePath,C.pathFromLine=P.pathFromLine+C.pathFromLine}this._handlePaths({type:n,realIndex:g,i:d,paths:C}),this.elSeries.add(this.elPointsMain),this.elSeries.add(this.elDataLabelsWrap),c.push(this.elSeries)}if(r.config.chart.stacked)for(var I=c.length;I>0;I--)l.add(c[I-1]);else for(var T=0;T<c.length;T++)l.add(c[T]);return l}},{key:\"_initSerieVariables\",value:function(t,e,i){var a=this.w,s=new m(this.ctx);this.xDivision=a.globals.gridWidth/(a.globals.dataPoints-(\"on\"===a.config.xaxis.tickPlacement?1:0)),this.strokeWidth=Array.isArray(a.config.stroke.width)?a.config.stroke.width[i]:a.config.stroke.width,this.yRatio.length>1&&(this.yaxisIndex=i),this.isReversed=a.config.yaxis[this.yaxisIndex]&&a.config.yaxis[this.yaxisIndex].reversed,this.zeroY=a.globals.gridHeight-this.baseLineY[this.yaxisIndex]-(this.isReversed?a.globals.gridHeight:0)+(this.isReversed?2*this.baseLineY[this.yaxisIndex]:0),this.areaBottomY=this.zeroY,(this.zeroY>a.globals.gridHeight||\"end\"===a.config.plotOptions.area.fillTo)&&(this.areaBottomY=a.globals.gridHeight),this.categoryAxisCorrection=this.xDivision/2,this.elSeries=s.group({class:\"apexcharts-series\",seriesName:x.escapeString(a.globals.seriesNames[i])}),this.elPointsMain=s.group({class:\"apexcharts-series-markers-wrap\",\"data:realIndex\":i}),this.elDataLabelsWrap=s.group({class:\"apexcharts-datalabels\",\"data:realIndex\":i});var r=t[e].length===a.globals.dataPoints;this.elSeries.attr({\"data:longestSeries\":r,rel:e+1,\"data:realIndex\":i}),this.appendPathFrom=!0}},{key:\"_calculatePathsFrom\",value:function(t){var e,i,a,s,r=t.type,o=t.series,n=t.i,l=t.realIndex,h=t.prevX,c=t.prevY,d=t.prevY2,g=this.w,u=new m(this.ctx);if(null===o[n][0]){for(var f=0;f<o[n].length;f++)if(null!==o[n][f]){h=this.xDivision*f,c=this.zeroY-o[n][f]/this.yRatio[this.yaxisIndex],e=u.move(h,c),i=u.move(h,this.areaBottomY);break}}else e=u.move(h,c),\"rangeArea\"===r&&(e=u.move(h,d)+u.line(h,c)),i=u.move(h,this.areaBottomY)+u.line(h,c);if(a=u.move(-1,this.zeroY)+u.line(-1,this.zeroY),s=u.move(-1,this.zeroY)+u.line(-1,this.zeroY),g.globals.previousPaths.length>0){var p=this.lineHelpers.checkPreviousPaths({pathFromLine:a,pathFromArea:s,realIndex:l});a=p.pathFromLine,s=p.pathFromArea}return{prevX:h,prevY:c,linePath:e,areaPath:i,pathFromLine:a,pathFromArea:s}}},{key:\"_handlePaths\",value:function(t){var i=t.type,a=t.realIndex,s=t.i,r=t.paths,o=this.w,n=new m(this.ctx),l=new R(this.ctx);this.prevSeriesY.push(r.yArrj),o.globals.seriesXvalues[a]=r.xArrj,o.globals.seriesYvalues[a]=r.yArrj;var h=o.config.forecastDataPoints;if(h.count>0&&\"rangeArea\"!==i){var c=o.globals.seriesXvalues[a][o.globals.seriesXvalues[a].length-h.count-1],d=n.drawRect(c,0,o.globals.gridWidth,o.globals.gridHeight,0);o.globals.dom.elForecastMask.appendChild(d.node);var g=n.drawRect(0,0,c,o.globals.gridHeight,0);o.globals.dom.elNonForecastMask.appendChild(g.node)}this.pointsChart||o.globals.delayedElements.push({el:this.elPointsMain.node,index:a});var u={i:s,realIndex:a,animationDelay:s,initialSpeed:o.config.chart.animations.speed,dataChangeSpeed:o.config.chart.animations.dynamicAnimation.speed,className:\"apexcharts-\".concat(i)};if(\"area\"===i)for(var f=l.fillPath({seriesNumber:a}),p=0;p<r.areaPaths.length;p++){var x=n.renderPaths(e(e({},u),{},{pathFrom:r.pathFromArea,pathTo:r.areaPaths[p],stroke:\"none\",strokeWidth:0,strokeLineCap:null,fill:f}));this.elSeries.add(x)}if(o.config.stroke.show&&!this.pointsChart){var b=null;if(\"line\"===i)b=l.fillPath({seriesNumber:a,i:s});else if(\"solid\"===o.config.stroke.fill.type)b=o.globals.stroke.colors[a];else{var v=o.config.fill;o.config.fill=o.config.stroke.fill,b=l.fillPath({seriesNumber:a,i:s}),o.config.fill=v}for(var y=0;y<r.linePaths.length;y++){var w=b;\"rangeArea\"===i&&(w=l.fillPath({seriesNumber:a}));var k=e(e({},u),{},{pathFrom:r.pathFromLine,pathTo:r.linePaths[y],stroke:b,strokeWidth:this.strokeWidth,strokeLineCap:o.config.stroke.lineCap,fill:\"rangeArea\"===i?w:\"none\"}),A=n.renderPaths(k);if(this.elSeries.add(A),A.attr(\"fill-rule\",\"evenodd\"),h.count>0&&\"rangeArea\"!==i){var S=n.renderPaths(k);S.node.setAttribute(\"stroke-dasharray\",h.dashArray),h.strokeWidth&&S.node.setAttribute(\"stroke-width\",h.strokeWidth),this.elSeries.add(S),S.attr(\"clip-path\",\"url(#forecastMask\".concat(o.globals.cuid,\")\")),A.attr(\"clip-path\",\"url(#nonForecastMask\".concat(o.globals.cuid,\")\"))}}}}},{key:\"_iterateOverDataPoints\",value:function(t){var e=t.type,i=t.series,a=t.iterations,s=t.realIndex,r=t.i,o=t.x,n=t.y,l=t.pX,h=t.pY,c=t.pathsFrom,d=t.linePaths,g=t.areaPaths,u=t.seriesIndex,f=t.lineYPosition,p=t.xArrj,b=t.yArrj,v=t.isRangeStart,y=t.seriesRangeEnd,w=this.w,k=new m(this.ctx),A=this.yRatio,S=c.prevY,C=c.linePath,L=c.areaPath,P=c.pathFromLine,I=c.pathFromArea,T=x.isNumber(w.globals.minYArr[s])?w.globals.minYArr[s]:w.globals.minY;a||(a=w.globals.dataPoints>1?w.globals.dataPoints-1:w.globals.dataPoints);for(var M=n,z=0;z<a;z++){var X=void 0===i[r][z+1]||null===i[r][z+1];if(w.globals.isXNumeric){var E=w.globals.seriesX[s][z+1];void 0===w.globals.seriesX[s][z+1]&&(E=w.globals.seriesX[s][a-1]),o=(E-w.globals.minX)/this.xRatio}else o+=this.xDivision;if(w.config.chart.stacked)if(r>0&&w.globals.collapsedSeries.length<w.config.series.length-1){f=this.prevSeriesY[function(t){for(var e=t,i=0;i<w.globals.series.length;i++)if(w.globals.collapsedSeriesIndices.indexOf(t)>-1){e--;break}return e>=0?e:0}(r-1)][z+1]}else f=this.zeroY;else f=this.zeroY;X?n=f-T/A[this.yaxisIndex]+2*(this.isReversed?T/A[this.yaxisIndex]:0):(n=f-i[r][z+1]/A[this.yaxisIndex]+2*(this.isReversed?i[r][z+1]/A[this.yaxisIndex]:0),\"rangeArea\"===e&&(M=f-y[r][z+1]/A[this.yaxisIndex]+2*(this.isReversed?y[r][z+1]/A[this.yaxisIndex]:0))),p.push(o),b.push(n);var Y=this.lineHelpers.calculatePoints({series:i,x:o,y:n,realIndex:s,i:r,j:z,prevY:S}),F=this._createPaths({type:e,series:i,i:r,realIndex:s,j:z,x:o,y:n,y2:M,pX:l,pY:h,linePath:C,areaPath:L,linePaths:d,areaPaths:g,seriesIndex:u,isRangeStart:v});g=F.areaPaths,d=F.linePaths,l=F.pX,h=F.pY,L=F.areaPath,C=F.linePath,this.appendPathFrom&&(P+=k.line(o,this.zeroY),I+=k.line(o,this.zeroY)),this.handleNullDataPoints(i,Y,r,z,s),this._handleMarkersAndLabels({type:e,pointsPos:Y,i:r,j:z,realIndex:s,isRangeStart:v})}return{yArrj:b,xArrj:p,pathFromArea:I,areaPaths:g,pathFromLine:P,linePaths:d,linePath:C,areaPath:L}}},{key:\"_handleMarkersAndLabels\",value:function(t){var e=t.type,i=t.pointsPos,a=t.isRangeStart,s=t.i,r=t.j,o=t.realIndex,n=this.w,l=new O(this.ctx);if(this.pointsChart)this.scatter.draw(this.elSeries,r,{realIndex:o,pointsPos:i,zRatio:this.zRatio,elParent:this.elPointsMain});else{n.globals.series[s].length>1&&this.elPointsMain.node.classList.add(\"apexcharts-element-hidden\");var h=this.markers.plotChartMarkers(i,o,r+1);null!==h&&this.elPointsMain.add(h)}var c=l.drawDataLabel({type:e,isRangeStart:a,pos:i,i:o,j:r+1});null!==c&&this.elDataLabelsWrap.add(c)}},{key:\"_createPaths\",value:function(t){var e=t.type,i=t.series,a=t.i,s=t.realIndex,r=t.j,o=t.x,n=t.y,l=t.y2,h=t.pX,c=t.pY,d=t.linePath,g=t.areaPath,u=t.linePaths,f=t.areaPaths,p=t.seriesIndex,x=t.isRangeStart,b=this.w,v=new m(this.ctx),y=b.config.stroke.curve,w=this.areaBottomY;if(Array.isArray(b.config.stroke.curve)&&(y=Array.isArray(p)?b.config.stroke.curve[p[a]]:b.config.stroke.curve[a]),\"smooth\"===y){var k=.35*(o-h);b.globals.hasNullValues?(null!==i[a][r]&&(null!==i[a][r+1]?(d=v.move(h,c)+v.curve(h+k,c,o-k,n,o+1,n),g=v.move(h+1,c)+v.curve(h+k,c,o-k,n,o+1,n)+v.line(o,w)+v.line(h,w)+\"z\"):(d=v.move(h,c),g=v.move(h,c)+\"z\")),u.push(d),f.push(g)):(d+=v.curve(h+k,c,o-k,n,o,n),g+=v.curve(h+k,c,o-k,n,o,n)),h=o,c=n,r===i[a].length-2&&(g=g+v.curve(h,c,o,n,o,w)+v.move(o,n)+\"z\",\"rangeArea\"===e&&x?d=d+v.curve(h,c,o,n,o,l)+v.move(o,l)+\"z\":b.globals.hasNullValues||(u.push(d),f.push(g)))}else{if(null===i[a][r+1]){d+=v.move(o,n);var A=b.globals.isXNumeric?(b.globals.seriesX[s][r]-b.globals.minX)/this.xRatio:o-this.xDivision;g=g+v.line(A,w)+v.move(o,n)+\"z\"}null===i[a][r]&&(d+=v.move(o,n),g+=v.move(o,w)),\"stepline\"===y?(d=d+v.line(o,null,\"H\")+v.line(null,n,\"V\"),g=g+v.line(o,null,\"H\")+v.line(null,n,\"V\")):\"straight\"===y&&(d+=v.line(o,n),g+=v.line(o,n)),r===i[a].length-2&&(g=g+v.line(o,w)+v.move(o,n)+\"z\",\"rangeArea\"===e&&x?d=d+v.line(o,l)+v.move(o,l)+\"z\":(u.push(d),f.push(g)))}return{linePaths:u,areaPaths:f,pX:h,pY:c,linePath:d,areaPath:g}}},{key:\"handleNullDataPoints\",value:function(t,e,i,a,s){var r=this.w;if(null===t[i][a]&&r.config.markers.showNullDataPoints||1===t[i].length){var o=this.markers.plotChartMarkers(e,s,a+1,this.strokeWidth-r.config.markers.strokeWidth/2,!0);null!==o&&this.elPointsMain.add(o)}}}]),t}();window.TreemapSquared={},window.TreemapSquared.generate=function(){function t(e,i,a,s){this.xoffset=e,this.yoffset=i,this.height=s,this.width=a,this.shortestEdge=function(){return Math.min(this.height,this.width)},this.getCoordinates=function(t){var e,i=[],a=this.xoffset,s=this.yoffset,o=r(t)/this.height,n=r(t)/this.width;if(this.width>=this.height)for(e=0;e<t.length;e++)i.push([a,s,a+o,s+t[e]/o]),s+=t[e]/o;else for(e=0;e<t.length;e++)i.push([a,s,a+t[e]/n,s+n]),a+=t[e]/n;return i},this.cutArea=function(e){var i;if(this.width>=this.height){var a=e/this.height,s=this.width-a;i=new t(this.xoffset+a,this.yoffset,s,this.height)}else{var r=e/this.width,o=this.height-r;i=new t(this.xoffset,this.yoffset+r,this.width,o)}return i}}function e(e,a,s,o,n){o=void 0===o?0:o,n=void 0===n?0:n;var l=i(function(t,e){var i,a=[],s=e/r(t);for(i=0;i<t.length;i++)a[i]=t[i]*s;return a}(e,a*s),[],new t(o,n,a,s),[]);return function(t){var e,i,a=[];for(e=0;e<t.length;e++)for(i=0;i<t[e].length;i++)a.push(t[e][i]);return a}(l)}function i(t,e,s,o){var n,l,h;if(0!==t.length)return n=s.shortestEdge(),function(t,e,i){var s;if(0===t.length)return!0;(s=t.slice()).push(e);var r=a(t,i),o=a(s,i);return r>=o}(e,l=t[0],n)?(e.push(l),i(t.slice(1),e,s,o)):(h=s.cutArea(r(e),o),o.push(s.getCoordinates(e)),i(t,[],h,o)),o;o.push(s.getCoordinates(e))}function a(t,e){var i=Math.min.apply(Math,t),a=Math.max.apply(Math,t),s=r(t);return Math.max(Math.pow(e,2)*a/Math.pow(s,2),Math.pow(s,2)/(Math.pow(e,2)*i))}function s(t){return t&&t.constructor===Array}function r(t){var e,i=0;for(e=0;e<t.length;e++)i+=t[e];return i}function o(t){var e,i=0;if(s(t[0]))for(e=0;e<t.length;e++)i+=o(t[e]);else i=r(t);return i}return function t(i,a,r,n,l){n=void 0===n?0:n,l=void 0===l?0:l;var h,c,d=[],g=[];if(s(i[0])){for(c=0;c<i.length;c++)d[c]=o(i[c]);for(h=e(d,a,r,n,l),c=0;c<i.length;c++)g.push(t(i[c],h[c][2]-h[c][0],h[c][3]-h[c][1],h[c][0],h[c][1]))}else g=e(i,a,r,n,l);return g}}();var Xt,Et,Yt=function(){function t(e,i){a(this,t),this.ctx=e,this.w=e.w,this.strokeWidth=this.w.config.stroke.width,this.helpers=new At(e),this.dynamicAnim=this.w.config.chart.animations.dynamicAnimation,this.labels=[]}return r(t,[{key:\"draw\",value:function(t){var e=this,i=this.w,a=new m(this.ctx),s=new R(this.ctx),r=a.group({class:\"apexcharts-treemap\"});if(i.globals.noData)return r;var o=[];return t.forEach((function(t){var e=t.map((function(t){return Math.abs(t)}));o.push(e)})),this.negRange=this.helpers.checkColorRange(),i.config.series.forEach((function(t,i){t.data.forEach((function(t){Array.isArray(e.labels[i])||(e.labels[i]=[]),e.labels[i].push(t.x)}))})),window.TreemapSquared.generate(o,i.globals.gridWidth,i.globals.gridHeight).forEach((function(o,n){var l=a.group({class:\"apexcharts-series apexcharts-treemap-series\",seriesName:x.escapeString(i.globals.seriesNames[n]),rel:n+1,\"data:realIndex\":n});if(i.config.chart.dropShadow.enabled){var h=i.config.chart.dropShadow;new v(e.ctx).dropShadow(r,h,n)}var c=a.group({class:\"apexcharts-data-labels\"});o.forEach((function(r,o){var h=r[0],c=r[1],d=r[2],g=r[3],u=a.drawRect(h,c,d-h,g-c,0,\"#fff\",1,e.strokeWidth,i.config.plotOptions.treemap.useFillColorAsStroke?p:i.globals.stroke.colors[n]);u.attr({cx:h,cy:c,index:n,i:n,j:o,width:d-h,height:g-c});var f=e.helpers.getShadeColor(i.config.chart.type,n,o,e.negRange),p=f.color;void 0!==i.config.series[n].data[o]&&i.config.series[n].data[o].fillColor&&(p=i.config.series[n].data[o].fillColor);var x=s.fillPath({color:p,seriesNumber:n,dataPointIndex:o});u.node.classList.add(\"apexcharts-treemap-rect\"),u.attr({fill:x}),e.helpers.addListeners(u);var b={x:h+(d-h)/2,y:c+(g-c)/2,width:0,height:0},v={x:h,y:c,width:d-h,height:g-c};if(i.config.chart.animations.enabled&&!i.globals.dataChanged){var m=1;i.globals.resized||(m=i.config.chart.animations.speed),e.animateTreemap(u,b,v,m)}if(i.globals.dataChanged){var y=1;e.dynamicAnim.enabled&&i.globals.shouldAnimate&&(y=e.dynamicAnim.speed,i.globals.previousPaths[n]&&i.globals.previousPaths[n][o]&&i.globals.previousPaths[n][o].rect&&(b=i.globals.previousPaths[n][o].rect),e.animateTreemap(u,b,v,y))}var w=e.getFontSize(r),k=i.config.dataLabels.formatter(e.labels[n][o],{value:i.globals.series[n][o],seriesIndex:n,dataPointIndex:o,w:i}),A=e.helpers.calculateDataLabels({text:k,x:(h+d)/2,y:(c+g)/2+e.strokeWidth/2+w/3,i:n,j:o,colorProps:f,fontSize:w,series:t});i.config.dataLabels.enabled&&A&&e.rotateToFitLabel(A,w,k,h,c,d,g),l.add(u),null!==A&&l.add(A)})),l.add(c),r.add(l)})),r}},{key:\"getFontSize\",value:function(t){var e=this.w;var i,a,s,r,o=function t(e){var i,a=0;if(Array.isArray(e[0]))for(i=0;i<e.length;i++)a+=t(e[i]);else for(i=0;i<e.length;i++)a+=e[i].length;return a}(this.labels)/function t(e){var i,a=0;if(Array.isArray(e[0]))for(i=0;i<e.length;i++)a+=t(e[i]);else for(i=0;i<e.length;i++)a+=1;return a}(this.labels);return i=t[2]-t[0],a=t[3]-t[1],s=i*a,r=Math.pow(s,.5),Math.min(r/o,parseInt(e.config.dataLabels.style.fontSize,10))}},{key:\"rotateToFitLabel\",value:function(t,e,i,a,s,r,o){var n=new m(this.ctx),l=n.getTextRects(i,e);if(l.width+this.w.config.stroke.width+5>r-a&&l.width<=o-s){var h=n.rotateAroundCenter(t.node);t.node.setAttribute(\"transform\",\"rotate(-90 \".concat(h.x,\" \").concat(h.y,\")\"))}}},{key:\"animateTreemap\",value:function(t,e,i,a){var s=new b(this.ctx);s.animateRect(t,{x:e.x,y:e.y,width:e.width,height:e.height},{x:i.x,y:i.y,width:i.width,height:i.height},a,(function(){s.animationCompleted(t)}))}}]),t}(),Ft=86400,Rt=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w,this.timeScaleArray=[],this.utc=this.w.config.xaxis.labels.datetimeUTC}return r(t,[{key:\"calculateTimeScaleTicks\",value:function(t,i){var a=this,s=this.w;if(s.globals.allSeriesCollapsed)return s.globals.labels=[],s.globals.timescaleLabels=[],[];var r=new I(this.ctx),o=(i-t)/864e5;this.determineInterval(o),s.globals.disableZoomIn=!1,s.globals.disableZoomOut=!1,o<.00011574074074074075?s.globals.disableZoomIn=!0:o>5e4&&(s.globals.disableZoomOut=!0);var n=r.getTimeUnitsfromTimestamp(t,i,this.utc),l=s.globals.gridWidth/o,h=l/24,c=h/60,d=c/60,g=Math.floor(24*o),u=Math.floor(1440*o),f=Math.floor(o*Ft),p=Math.floor(o),x=Math.floor(o/30),b=Math.floor(o/365),v={minMillisecond:n.minMillisecond,minSecond:n.minSecond,minMinute:n.minMinute,minHour:n.minHour,minDate:n.minDate,minMonth:n.minMonth,minYear:n.minYear},m={firstVal:v,currentMillisecond:v.minMillisecond,currentSecond:v.minSecond,currentMinute:v.minMinute,currentHour:v.minHour,currentMonthDate:v.minDate,currentDate:v.minDate,currentMonth:v.minMonth,currentYear:v.minYear,daysWidthOnXAxis:l,hoursWidthOnXAxis:h,minutesWidthOnXAxis:c,secondsWidthOnXAxis:d,numberOfSeconds:f,numberOfMinutes:u,numberOfHours:g,numberOfDays:p,numberOfMonths:x,numberOfYears:b};switch(this.tickInterval){case\"years\":this.generateYearScale(m);break;case\"months\":case\"half_year\":this.generateMonthScale(m);break;case\"months_days\":case\"months_fortnight\":case\"days\":case\"week_days\":this.generateDayScale(m);break;case\"hours\":this.generateHourScale(m);break;case\"minutes_fives\":case\"minutes\":this.generateMinuteScale(m);break;case\"seconds_tens\":case\"seconds_fives\":case\"seconds\":this.generateSecondScale(m)}var y=this.timeScaleArray.map((function(t){var i={position:t.position,unit:t.unit,year:t.year,day:t.day?t.day:1,hour:t.hour?t.hour:0,month:t.month+1};return\"month\"===t.unit?e(e({},i),{},{day:1,value:t.value+1}):\"day\"===t.unit||\"hour\"===t.unit?e(e({},i),{},{value:t.value}):\"minute\"===t.unit?e(e({},i),{},{value:t.value,minute:t.value}):\"second\"===t.unit?e(e({},i),{},{value:t.value,minute:t.minute,second:t.second}):t}));return y.filter((function(t){var e=1,i=Math.ceil(s.globals.gridWidth/120),r=t.value;void 0!==s.config.xaxis.tickAmount&&(i=s.config.xaxis.tickAmount),y.length>i&&(e=Math.floor(y.length/i));var o=!1,n=!1;switch(a.tickInterval){case\"years\":\"year\"===t.unit&&(o=!0);break;case\"half_year\":e=7,\"year\"===t.unit&&(o=!0);break;case\"months\":e=1,\"year\"===t.unit&&(o=!0);break;case\"months_fortnight\":e=15,\"year\"!==t.unit&&\"month\"!==t.unit||(o=!0),30===r&&(n=!0);break;case\"months_days\":e=10,\"month\"===t.unit&&(o=!0),30===r&&(n=!0);break;case\"week_days\":e=8,\"month\"===t.unit&&(o=!0);break;case\"days\":e=1,\"month\"===t.unit&&(o=!0);break;case\"hours\":\"day\"===t.unit&&(o=!0);break;case\"minutes_fives\":case\"seconds_fives\":r%5!=0&&(n=!0);break;case\"seconds_tens\":r%10!=0&&(n=!0)}if(\"hours\"===a.tickInterval||\"minutes_fives\"===a.tickInterval||\"seconds_tens\"===a.tickInterval||\"seconds_fives\"===a.tickInterval){if(!n)return!0}else if((r%e==0||o)&&!n)return!0}))}},{key:\"recalcDimensionsBasedOnFormat\",value:function(t,e){var i=this.w,a=this.formatDates(t),s=this.removeOverlappingTS(a);i.globals.timescaleLabels=s.slice(),new ot(this.ctx).plotCoords()}},{key:\"determineInterval\",value:function(t){var e=24*t,i=60*e;switch(!0){case t/365>5:this.tickInterval=\"years\";break;case t>800:this.tickInterval=\"half_year\";break;case t>180:this.tickInterval=\"months\";break;case t>90:this.tickInterval=\"months_fortnight\";break;case t>60:this.tickInterval=\"months_days\";break;case t>30:this.tickInterval=\"week_days\";break;case t>2:this.tickInterval=\"days\";break;case e>2.4:this.tickInterval=\"hours\";break;case i>15:this.tickInterval=\"minutes_fives\";break;case i>5:this.tickInterval=\"minutes\";break;case i>1:this.tickInterval=\"seconds_tens\";break;case 60*i>20:this.tickInterval=\"seconds_fives\";break;default:this.tickInterval=\"seconds\"}}},{key:\"generateYearScale\",value:function(t){var e=t.firstVal,i=t.currentMonth,a=t.currentYear,s=t.daysWidthOnXAxis,r=t.numberOfYears,o=e.minYear,n=0,l=new I(this.ctx),h=\"year\";if(e.minDate>1||e.minMonth>0){var c=l.determineRemainingDaysOfYear(e.minYear,e.minMonth,e.minDate);n=(l.determineDaysOfYear(e.minYear)-c+1)*s,o=e.minYear+1,this.timeScaleArray.push({position:n,value:o,unit:h,year:o,month:x.monthMod(i+1)})}else 1===e.minDate&&0===e.minMonth&&this.timeScaleArray.push({position:n,value:o,unit:h,year:a,month:x.monthMod(i+1)});for(var d=o,g=n,u=0;u<r;u++)d++,g=l.determineDaysOfYear(d-1)*s+g,this.timeScaleArray.push({position:g,value:d,unit:h,year:d,month:1})}},{key:\"generateMonthScale\",value:function(t){var e=t.firstVal,i=t.currentMonthDate,a=t.currentMonth,s=t.currentYear,r=t.daysWidthOnXAxis,o=t.numberOfMonths,n=a,l=0,h=new I(this.ctx),c=\"month\",d=0;if(e.minDate>1){l=(h.determineDaysOfMonths(a+1,e.minYear)-i+1)*r,n=x.monthMod(a+1);var g=s+d,u=x.monthMod(n),f=n;0===n&&(c=\"year\",f=g,u=1,g+=d+=1),this.timeScaleArray.push({position:l,value:f,unit:c,year:g,month:u})}else this.timeScaleArray.push({position:l,value:n,unit:c,year:s,month:x.monthMod(a)});for(var p=n+1,b=l,v=0,m=1;v<o;v++,m++){0===(p=x.monthMod(p))?(c=\"year\",d+=1):c=\"month\";var y=this._getYear(s,p,d);b=h.determineDaysOfMonths(p,y)*r+b;var w=0===p?y:p;this.timeScaleArray.push({position:b,value:w,unit:c,year:y,month:0===p?1:p}),p++}}},{key:\"generateDayScale\",value:function(t){var e=t.firstVal,i=t.currentMonth,a=t.currentYear,s=t.hoursWidthOnXAxis,r=t.numberOfDays,o=new I(this.ctx),n=\"day\",l=e.minDate+1,h=l,c=function(t,e,i){return t>o.determineDaysOfMonths(e+1,i)?(h=1,n=\"month\",g=e+=1,e):e},d=(24-e.minHour)*s,g=l,u=c(h,i,a);0===e.minHour&&1===e.minDate?(d=0,g=x.monthMod(e.minMonth),n=\"month\",h=e.minDate,r++):1!==e.minDate&&0===e.minHour&&0===e.minMinute&&(d=0,l=e.minDate,g=l,u=c(h=l,i,a)),this.timeScaleArray.push({position:d,value:g,unit:n,year:this._getYear(a,u,0),month:x.monthMod(u),day:h});for(var f=d,p=0;p<r;p++){n=\"day\",u=c(h+=1,u,this._getYear(a,u,0));var b=this._getYear(a,u,0);f=24*s+f;var v=1===h?x.monthMod(u):h;this.timeScaleArray.push({position:f,value:v,unit:n,year:b,month:x.monthMod(u),day:v})}}},{key:\"generateHourScale\",value:function(t){var e=t.firstVal,i=t.currentDate,a=t.currentMonth,s=t.currentYear,r=t.minutesWidthOnXAxis,o=t.numberOfHours,n=new I(this.ctx),l=\"hour\",h=function(t,e){return t>n.determineDaysOfMonths(e+1,s)&&(p=1,e+=1),{month:e,date:p}},c=function(t,e){return t>n.determineDaysOfMonths(e+1,s)?e+=1:e},d=60-(e.minMinute+e.minSecond/60),g=d*r,u=e.minHour+1,f=u+1;60===d&&(g=0,f=(u=e.minHour)+1);var p=i,b=c(p,a);this.timeScaleArray.push({position:g,value:u,unit:l,day:p,hour:f,year:s,month:x.monthMod(b)});for(var v=g,m=0;m<o;m++){if(l=\"hour\",f>=24)f=0,l=\"day\",b=h(p+=1,b).month,b=c(p,b);var y=this._getYear(s,b,0);v=60*r+v;var w=0===f?p:f;this.timeScaleArray.push({position:v,value:w,unit:l,hour:f,day:p,year:y,month:x.monthMod(b)}),f++}}},{key:\"generateMinuteScale\",value:function(t){for(var e=t.currentMillisecond,i=t.currentSecond,a=t.currentMinute,s=t.currentHour,r=t.currentDate,o=t.currentMonth,n=t.currentYear,l=t.minutesWidthOnXAxis,h=t.secondsWidthOnXAxis,c=t.numberOfMinutes,d=a+1,g=r,u=o,f=n,p=s,b=(60-i-e/1e3)*h,v=0;v<c;v++)d>=60&&(d=0,24===(p+=1)&&(p=0)),this.timeScaleArray.push({position:b,value:d,unit:\"minute\",hour:p,minute:d,day:g,year:this._getYear(f,u,0),month:x.monthMod(u)}),b+=l,d++}},{key:\"generateSecondScale\",value:function(t){for(var e=t.currentMillisecond,i=t.currentSecond,a=t.currentMinute,s=t.currentHour,r=t.currentDate,o=t.currentMonth,n=t.currentYear,l=t.secondsWidthOnXAxis,h=t.numberOfSeconds,c=i+1,d=a,g=r,u=o,f=n,p=s,b=(1e3-e)/1e3*l,v=0;v<h;v++)c>=60&&(c=0,++d>=60&&(d=0,24===++p&&(p=0))),this.timeScaleArray.push({position:b,value:c,unit:\"second\",hour:p,minute:d,second:c,day:g,year:this._getYear(f,u,0),month:x.monthMod(u)}),b+=l,c++}},{key:\"createRawDateString\",value:function(t,e){var i=t.year;return 0===t.month&&(t.month=1),i+=\"-\"+(\"0\"+t.month.toString()).slice(-2),\"day\"===t.unit?i+=\"day\"===t.unit?\"-\"+(\"0\"+e).slice(-2):\"-01\":i+=\"-\"+(\"0\"+(t.day?t.day:\"1\")).slice(-2),\"hour\"===t.unit?i+=\"hour\"===t.unit?\"T\"+(\"0\"+e).slice(-2):\"T00\":i+=\"T\"+(\"0\"+(t.hour?t.hour:\"0\")).slice(-2),\"minute\"===t.unit?i+=\":\"+(\"0\"+e).slice(-2):i+=\":\"+(t.minute?(\"0\"+t.minute).slice(-2):\"00\"),\"second\"===t.unit?i+=\":\"+(\"0\"+e).slice(-2):i+=\":00\",this.utc&&(i+=\".000Z\"),i}},{key:\"formatDates\",value:function(t){var e=this,i=this.w;return t.map((function(t){var a=t.value.toString(),s=new I(e.ctx),r=e.createRawDateString(t,a),o=s.getDate(s.parseDate(r));if(e.utc||(o=s.getDate(s.parseDateWithTimezone(r))),void 0===i.config.xaxis.labels.format){var n=\"dd MMM\",l=i.config.xaxis.labels.datetimeFormatter;\"year\"===t.unit&&(n=l.year),\"month\"===t.unit&&(n=l.month),\"day\"===t.unit&&(n=l.day),\"hour\"===t.unit&&(n=l.hour),\"minute\"===t.unit&&(n=l.minute),\"second\"===t.unit&&(n=l.second),a=s.formatDate(o,n)}else a=s.formatDate(o,i.config.xaxis.labels.format);return{dateString:r,position:t.position,value:a,unit:t.unit,year:t.year,month:t.month}}))}},{key:\"removeOverlappingTS\",value:function(t){var e,i=this,a=new m(this.ctx),s=!1;t.length>0&&t[0].value&&t.every((function(e){return e.value.length===t[0].value.length}))&&(s=!0,e=a.getTextRects(t[0].value).width);var r=0,o=t.map((function(o,n){if(n>0&&i.w.config.xaxis.labels.hideOverlappingLabels){var l=s?e:a.getTextRects(t[r].value).width,h=t[r].position;return o.position>h+l+10?(r=n,o):null}return o}));return o=o.filter((function(t){return null!==t}))}},{key:\"_getYear\",value:function(t,e,i){return t+Math.floor(e/12)+i}}]),t}(),Dt=function(){function t(e,i){a(this,t),this.ctx=i,this.w=i.w,this.el=e}return r(t,[{key:\"setupElements\",value:function(){var t=this.w.globals,e=this.w.config,i=e.chart.type;t.axisCharts=[\"line\",\"area\",\"bar\",\"rangeBar\",\"rangeArea\",\"candlestick\",\"boxPlot\",\"scatter\",\"bubble\",\"radar\",\"heatmap\",\"treemap\"].indexOf(i)>-1,t.xyCharts=[\"line\",\"area\",\"bar\",\"rangeBar\",\"rangeArea\",\"candlestick\",\"boxPlot\",\"scatter\",\"bubble\"].indexOf(i)>-1,t.isBarHorizontal=(\"bar\"===e.chart.type||\"rangeBar\"===e.chart.type||\"boxPlot\"===e.chart.type)&&e.plotOptions.bar.horizontal,t.chartClass=\".apexcharts\"+t.chartID,t.dom.baseEl=this.el,t.dom.elWrap=document.createElement(\"div\"),m.setAttrs(t.dom.elWrap,{id:t.chartClass.substring(1),class:\"apexcharts-canvas \"+t.chartClass.substring(1)}),this.el.appendChild(t.dom.elWrap),t.dom.Paper=new window.SVG.Doc(t.dom.elWrap),t.dom.Paper.attr({class:\"apexcharts-svg\",\"xmlns:data\":\"ApexChartsNS\",transform:\"translate(\".concat(e.chart.offsetX,\", \").concat(e.chart.offsetY,\")\")}),t.dom.Paper.node.style.background=e.chart.background,this.setSVGDimensions(),t.dom.elGraphical=t.dom.Paper.group().attr({class:\"apexcharts-inner apexcharts-graphical\"}),t.dom.elAnnotations=t.dom.Paper.group().attr({class:\"apexcharts-annotations\"}),t.dom.elDefs=t.dom.Paper.defs(),t.dom.elLegendWrap=document.createElement(\"div\"),t.dom.elLegendWrap.classList.add(\"apexcharts-legend\"),t.dom.elWrap.appendChild(t.dom.elLegendWrap),t.dom.Paper.add(t.dom.elGraphical),t.dom.elGraphical.add(t.dom.elDefs)}},{key:\"plotChartType\",value:function(t,e){var i=this.w,a=i.config,s=i.globals,r={series:[],i:[]},o={series:[],i:[]},n={series:[],i:[]},l={series:[],i:[]},h={series:[],i:[]},c={series:[],i:[]},d={series:[],i:[]},g={series:[],i:[]},u={series:[],seriesRangeEnd:[],i:[]};s.series.map((function(e,f){var p=0;void 0!==t[f].type?(\"column\"===t[f].type||\"bar\"===t[f].type?(s.series.length>1&&a.plotOptions.bar.horizontal&&console.warn(\"Horizontal bars are not supported in a mixed/combo chart. Please turn off `plotOptions.bar.horizontal`\"),h.series.push(e),h.i.push(f),p++,i.globals.columnSeries=h.series):\"area\"===t[f].type?(o.series.push(e),o.i.push(f),p++):\"line\"===t[f].type?(r.series.push(e),r.i.push(f),p++):\"scatter\"===t[f].type?(n.series.push(e),n.i.push(f)):\"bubble\"===t[f].type?(l.series.push(e),l.i.push(f),p++):\"candlestick\"===t[f].type?(c.series.push(e),c.i.push(f),p++):\"boxPlot\"===t[f].type?(d.series.push(e),d.i.push(f),p++):\"rangeBar\"===t[f].type?(g.series.push(e),g.i.push(f),p++):\"rangeArea\"===t[f].type?(u.series.push(s.seriesRangeStart[f]),u.seriesRangeEnd.push(s.seriesRangeEnd[f]),u.i.push(f),p++):console.warn(\"You have specified an unrecognized chart type. Available types for this property are line/area/column/bar/scatter/bubble\"),p>1&&(s.comboCharts=!0)):(r.series.push(e),r.i.push(f))}));var f=new zt(this.ctx,e),p=new kt(this.ctx,e);this.ctx.pie=new Lt(this.ctx);var x=new It(this.ctx);this.ctx.rangeBar=new Tt(this.ctx,e);var b=new Pt(this.ctx),v=[];if(s.comboCharts){if(o.series.length>0&&v.push(f.draw(o.series,\"area\",o.i)),h.series.length>0)if(i.config.chart.stacked){var m=new wt(this.ctx,e);v.push(m.draw(h.series,h.i))}else this.ctx.bar=new yt(this.ctx,e),v.push(this.ctx.bar.draw(h.series,h.i));if(u.series.length>0&&v.push(f.draw(u.series,\"rangeArea\",u.i,u.seriesRangeEnd)),r.series.length>0&&v.push(f.draw(r.series,\"line\",r.i)),c.series.length>0&&v.push(p.draw(c.series,\"candlestick\",c.i)),d.series.length>0&&v.push(p.draw(d.series,\"boxPlot\",d.i)),g.series.length>0&&v.push(this.ctx.rangeBar.draw(g.series,g.i)),n.series.length>0){var y=new zt(this.ctx,e,!0);v.push(y.draw(n.series,\"scatter\",n.i))}if(l.series.length>0){var w=new zt(this.ctx,e,!0);v.push(w.draw(l.series,\"bubble\",l.i))}}else switch(a.chart.type){case\"line\":v=f.draw(s.series,\"line\");break;case\"area\":v=f.draw(s.series,\"area\");break;case\"bar\":if(a.chart.stacked)v=new wt(this.ctx,e).draw(s.series);else this.ctx.bar=new yt(this.ctx,e),v=this.ctx.bar.draw(s.series);break;case\"candlestick\":v=new kt(this.ctx,e).draw(s.series,\"candlestick\");break;case\"boxPlot\":v=new kt(this.ctx,e).draw(s.series,\"boxPlot\");break;case\"rangeBar\":v=this.ctx.rangeBar.draw(s.series);break;case\"rangeArea\":v=f.draw(s.seriesRangeStart,\"rangeArea\",void 0,s.seriesRangeEnd);break;case\"heatmap\":v=new St(this.ctx,e).draw(s.series);break;case\"treemap\":v=new Yt(this.ctx,e).draw(s.series);break;case\"pie\":case\"donut\":case\"polarArea\":v=this.ctx.pie.draw(s.series);break;case\"radialBar\":v=x.draw(s.series);break;case\"radar\":v=b.draw(s.series);break;default:v=f.draw(s.series)}return v}},{key:\"setSVGDimensions\",value:function(){var t=this.w.globals,e=this.w.config;t.svgWidth=e.chart.width,t.svgHeight=e.chart.height;var i=x.getDimensions(this.el),a=e.chart.width.toString().split(/[0-9]+/g).pop();\"%\"===a?x.isNumber(i[0])&&(0===i[0].width&&(i=x.getDimensions(this.el.parentNode)),t.svgWidth=i[0]*parseInt(e.chart.width,10)/100):\"px\"!==a&&\"\"!==a||(t.svgWidth=parseInt(e.chart.width,10));var s=e.chart.height.toString().split(/[0-9]+/g).pop();if(\"auto\"!==t.svgHeight&&\"\"!==t.svgHeight)if(\"%\"===s){var r=x.getDimensions(this.el.parentNode);t.svgHeight=r[1]*parseInt(e.chart.height,10)/100}else t.svgHeight=parseInt(e.chart.height,10);else t.axisCharts?t.svgHeight=t.svgWidth/1.61:t.svgHeight=t.svgWidth/1.2;if(t.svgWidth<0&&(t.svgWidth=0),t.svgHeight<0&&(t.svgHeight=0),m.setAttrs(t.dom.Paper.node,{width:t.svgWidth,height:t.svgHeight}),\"%\"!==s){var o=e.chart.sparkline.enabled?0:t.axisCharts?e.chart.parentHeightOffset:0;t.dom.Paper.node.parentNode.parentNode.style.minHeight=t.svgHeight+o+\"px\"}t.dom.elWrap.style.width=t.svgWidth+\"px\",t.dom.elWrap.style.height=t.svgHeight+\"px\"}},{key:\"shiftGraphPosition\",value:function(){var t=this.w.globals,e=t.translateY,i={transform:\"translate(\"+t.translateX+\", \"+e+\")\"};m.setAttrs(t.dom.elGraphical.node,i)}},{key:\"resizeNonAxisCharts\",value:function(){var t=this.w,e=t.globals,i=0,a=t.config.chart.sparkline.enabled?1:15;a+=t.config.grid.padding.bottom,\"top\"!==t.config.legend.position&&\"bottom\"!==t.config.legend.position||!t.config.legend.show||t.config.legend.floating||(i=new lt(this.ctx).legendHelpers.getLegendBBox().clwh+10);var s=t.globals.dom.baseEl.querySelector(\".apexcharts-radialbar, .apexcharts-pie\"),r=2.05*t.globals.radialSize;if(s&&!t.config.chart.sparkline.enabled&&0!==t.config.plotOptions.radialBar.startAngle){var o=x.getBoundingClientRect(s);r=o.bottom;var n=o.bottom-o.top;r=Math.max(2.05*t.globals.radialSize,n)}var l=r+e.translateY+i+a;e.dom.elLegendForeign&&e.dom.elLegendForeign.setAttribute(\"height\",l),t.config.chart.height&&String(t.config.chart.height).indexOf(\"%\")>0||(e.dom.elWrap.style.height=l+\"px\",m.setAttrs(e.dom.Paper.node,{height:l}),e.dom.Paper.node.parentNode.parentNode.style.minHeight=l+\"px\")}},{key:\"coreCalculations\",value:function(){new U(this.ctx).init()}},{key:\"resetGlobals\",value:function(){var t=this,e=function(){return t.w.config.series.map((function(t){return[]}))},i=new Y,a=this.w.globals;i.initGlobalVars(a),a.seriesXvalues=e(),a.seriesYvalues=e()}},{key:\"isMultipleY\",value:function(){if(this.w.config.yaxis.constructor===Array&&this.w.config.yaxis.length>1)return this.w.globals.isMultipleYAxis=!0,!0}},{key:\"xySettings\",value:function(){var t=null,e=this.w;if(e.globals.axisCharts){if(\"back\"===e.config.xaxis.crosshairs.position)new Q(this.ctx).drawXCrosshairs();if(\"back\"===e.config.yaxis[0].crosshairs.position)new Q(this.ctx).drawYCrosshairs();if(\"datetime\"===e.config.xaxis.type&&void 0===e.config.xaxis.labels.formatter){this.ctx.timeScale=new Rt(this.ctx);var i=[];isFinite(e.globals.minX)&&isFinite(e.globals.maxX)&&!e.globals.isBarHorizontal?i=this.ctx.timeScale.calculateTimeScaleTicks(e.globals.minX,e.globals.maxX):e.globals.isBarHorizontal&&(i=this.ctx.timeScale.calculateTimeScaleTicks(e.globals.minY,e.globals.maxY)),this.ctx.timeScale.recalcDimensionsBasedOnFormat(i)}t=new y(this.ctx).getCalculatedRatios()}return t}},{key:\"updateSourceChart\",value:function(t){this.ctx.w.globals.selection=void 0,this.ctx.updateHelpers._updateOptions({chart:{selection:{xaxis:{min:t.w.globals.minX,max:t.w.globals.maxX}}}},!1,!1)}},{key:\"setupBrushHandler\",value:function(){var t=this,i=this.w;if(i.config.chart.brush.enabled&&\"function\"!=typeof i.config.chart.events.selection){var a=i.config.chart.brush.targets||[i.config.chart.brush.target];a.forEach((function(e){var i=ApexCharts.getChartByID(e);i.w.globals.brushSource=t.ctx,\"function\"!=typeof i.w.config.chart.events.zoomed&&(i.w.config.chart.events.zoomed=function(){t.updateSourceChart(i)}),\"function\"!=typeof i.w.config.chart.events.scrolled&&(i.w.config.chart.events.scrolled=function(){t.updateSourceChart(i)})})),i.config.chart.events.selection=function(t,s){a.forEach((function(t){var a=ApexCharts.getChartByID(t),r=x.clone(i.config.yaxis);if(i.config.chart.brush.autoScaleYaxis&&1===a.w.globals.series.length){var o=new _(a);r=o.autoScaleY(a,r,s)}var n=a.w.config.yaxis.reduce((function(t,i,s){return[].concat(u(t),[e(e({},a.w.config.yaxis[s]),{},{min:r[0].min,max:r[0].max})])}),[]);a.ctx.updateHelpers._updateOptions({xaxis:{min:s.xaxis.min,max:s.xaxis.max},yaxis:n},!1,!1,!1,!1)}))}}}}]),t}(),Ht=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:\"_updateOptions\",value:function(t){var e=this,a=arguments.length>1&&void 0!==arguments[1]&&arguments[1],s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],o=arguments.length>4&&void 0!==arguments[4]&&arguments[4];return new Promise((function(n){var l=[e.ctx];r&&(l=e.ctx.getSyncedCharts()),e.ctx.w.globals.isExecCalled&&(l=[e.ctx],e.ctx.w.globals.isExecCalled=!1),l.forEach((function(r,h){var c=r.w;if(c.globals.shouldAnimate=s,a||(c.globals.resized=!0,c.globals.dataChanged=!0,s&&r.series.getPreviousPaths()),t&&\"object\"===i(t)&&(r.config=new E(t),t=y.extendArrayProps(r.config,t,c),r.w.globals.chartID!==e.ctx.w.globals.chartID&&delete t.series,c.config=x.extend(c.config,t),o&&(c.globals.lastXAxis=t.xaxis?x.clone(t.xaxis):[],c.globals.lastYAxis=t.yaxis?x.clone(t.yaxis):[],c.globals.initialConfig=x.extend({},c.config),c.globals.initialSeries=x.clone(c.config.series),t.series))){for(var d=0;d<c.globals.collapsedSeriesIndices.length;d++){var g=c.config.series[c.globals.collapsedSeriesIndices[d]];c.globals.collapsedSeries[d].data=c.globals.axisCharts?g.data.slice():g}for(var u=0;u<c.globals.ancillaryCollapsedSeriesIndices.length;u++){var f=c.config.series[c.globals.ancillaryCollapsedSeriesIndices[u]];c.globals.ancillaryCollapsedSeries[u].data=c.globals.axisCharts?f.data.slice():f}r.series.emptyCollapsedSeries(c.config.series)}return r.update(t).then((function(){h===l.length-1&&n(r)}))}))}))}},{key:\"_updateSeries\",value:function(t,e){var i=this,a=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return new Promise((function(s){var r,o=i.w;return o.globals.shouldAnimate=e,o.globals.dataChanged=!0,e&&i.ctx.series.getPreviousPaths(),o.globals.axisCharts?(0===(r=t.map((function(t,e){return i._extendSeries(t,e)}))).length&&(r=[{data:[]}]),o.config.series=r):o.config.series=t.slice(),a&&(o.globals.initialConfig.series=x.clone(o.config.series),o.globals.initialSeries=x.clone(o.config.series)),i.ctx.update().then((function(){s(i.ctx)}))}))}},{key:\"_extendSeries\",value:function(t,i){var a=this.w,s=a.config.series[i];return e(e({},a.config.series[i]),{},{name:t.name?t.name:s&&s.name,color:t.color?t.color:s&&s.color,type:t.type?t.type:s&&s.type,data:t.data?t.data:s&&s.data})}},{key:\"toggleDataPointSelection\",value:function(t,e){var i=this.w,a=null,s=\".apexcharts-series[data\\\\:realIndex='\".concat(t,\"']\");return i.globals.axisCharts?a=i.globals.dom.Paper.select(\"\".concat(s,\" path[j='\").concat(e,\"'], \").concat(s,\" circle[j='\").concat(e,\"'], \").concat(s,\" rect[j='\").concat(e,\"']\")).members[0]:void 0===e&&(a=i.globals.dom.Paper.select(\"\".concat(s,\" path[j='\").concat(t,\"']\")).members[0],\"pie\"!==i.config.chart.type&&\"polarArea\"!==i.config.chart.type&&\"donut\"!==i.config.chart.type||this.ctx.pie.pieClicked(t)),a?(new m(this.ctx).pathMouseDown(a,null),a.node?a.node:null):(console.warn(\"toggleDataPointSelection: Element not found\"),null)}},{key:\"forceXAxisUpdate\",value:function(t){var e=this.w;if([\"min\",\"max\"].forEach((function(i){void 0!==t.xaxis[i]&&(e.config.xaxis[i]=t.xaxis[i],e.globals.lastXAxis[i]=t.xaxis[i])})),t.xaxis.categories&&t.xaxis.categories.length&&(e.config.xaxis.categories=t.xaxis.categories),e.config.xaxis.convertedCatToNumeric){var i=new X(t);t=i.convertCatToNumericXaxis(t,this.ctx)}return t}},{key:\"forceYAxisUpdate\",value:function(t){return t.chart&&t.chart.stacked&&\"100%\"===t.chart.stackType&&(Array.isArray(t.yaxis)?t.yaxis.forEach((function(e,i){t.yaxis[i].min=0,t.yaxis[i].max=100})):(t.yaxis.min=0,t.yaxis.max=100)),t}},{key:\"revertDefaultAxisMinMax\",value:function(t){var e=this,i=this.w,a=i.globals.lastXAxis,s=i.globals.lastYAxis;t&&t.xaxis&&(a=t.xaxis),t&&t.yaxis&&(s=t.yaxis),i.config.xaxis.min=a.min,i.config.xaxis.max=a.max;var r=function(t){void 0!==s[t]&&(i.config.yaxis[t].min=s[t].min,i.config.yaxis[t].max=s[t].max)};i.config.yaxis.map((function(t,a){i.globals.zoomed||void 0!==s[a]?r(a):void 0!==e.ctx.opts.yaxis[a]&&(t.min=e.ctx.opts.yaxis[a].min,t.max=e.ctx.opts.yaxis[a].max)}))}}]),t}();Xt=\"undefined\"!=typeof window?window:void 0,Et=function(t,e){var a=(void 0!==this?this:t).SVG=function(t){if(a.supported)return t=new a.Doc(t),a.parser.draw||a.prepare(),t};if(a.ns=\"http://www.w3.org/2000/svg\",a.xmlns=\"http://www.w3.org/2000/xmlns/\",a.xlink=\"http://www.w3.org/1999/xlink\",a.svgjs=\"http://svgjs.dev\",a.supported=!0,!a.supported)return!1;a.did=1e3,a.eid=function(t){return\"Svgjs\"+d(t)+a.did++},a.create=function(t){var i=e.createElementNS(this.ns,t);return i.setAttribute(\"id\",this.eid(t)),i},a.extend=function(){var t,e;e=(t=[].slice.call(arguments)).pop();for(var i=t.length-1;i>=0;i--)if(t[i])for(var s in e)t[i].prototype[s]=e[s];a.Set&&a.Set.inherit&&a.Set.inherit()},a.invent=function(t){var e=\"function\"==typeof t.create?t.create:function(){this.constructor.call(this,a.create(t.create))};return t.inherit&&(e.prototype=new t.inherit),t.extend&&a.extend(e,t.extend),t.construct&&a.extend(t.parent||a.Container,t.construct),e},a.adopt=function(e){return e?e.instance?e.instance:((i=\"svg\"==e.nodeName?e.parentNode instanceof t.SVGElement?new a.Nested:new a.Doc:\"linearGradient\"==e.nodeName?new a.Gradient(\"linear\"):\"radialGradient\"==e.nodeName?new a.Gradient(\"radial\"):a[d(e.nodeName)]?new(a[d(e.nodeName)]):new a.Element(e)).type=e.nodeName,i.node=e,e.instance=i,i instanceof a.Doc&&i.namespace().defs(),i.setData(JSON.parse(e.getAttribute(\"svgjs:data\"))||{}),i):null;var i},a.prepare=function(){var t=e.getElementsByTagName(\"body\")[0],i=(t?new a.Doc(t):a.adopt(e.documentElement).nested()).size(2,0);a.parser={body:t||e.documentElement,draw:i.style(\"opacity:0;position:absolute;left:-100%;top:-100%;overflow:hidden\").node,poly:i.polyline().node,path:i.path().node,native:a.create(\"svg\")}},a.parser={native:a.create(\"svg\")},e.addEventListener(\"DOMContentLoaded\",(function(){a.parser.draw||a.prepare()}),!1),a.regex={numberAndUnit:/^([+-]?(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?)([a-z%]*)$/i,hex:/^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i,rgb:/rgb\\((\\d+),(\\d+),(\\d+)\\)/,reference:/#([a-z0-9\\-_]+)/i,transforms:/\\)\\s*,?\\s*/,whitespace:/\\s/g,isHex:/^#[a-f0-9]{3,6}$/i,isRgb:/^rgb\\(/,isCss:/[^:]+:[^;]+;?/,isBlank:/^(\\s+)?$/,isNumber:/^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i,isPercent:/^-?[\\d\\.]+%$/,isImage:/\\.(jpg|jpeg|png|gif|svg)(\\?[^=]+.*)?/i,delimiter:/[\\s,]+/,hyphen:/([^e])\\-/gi,pathLetters:/[MLHVCSQTAZ]/gi,isPathLetter:/[MLHVCSQTAZ]/i,numbersWithDots:/((\\d?\\.\\d+(?:e[+-]?\\d+)?)((?:\\.\\d+(?:e[+-]?\\d+)?)+))+/gi,dots:/\\./g},a.utils={map:function(t,e){for(var i=t.length,a=[],s=0;s<i;s++)a.push(e(t[s]));return a},filter:function(t,e){for(var i=t.length,a=[],s=0;s<i;s++)e(t[s])&&a.push(t[s]);return a},filterSVGElements:function(e){return this.filter(e,(function(e){return e instanceof t.SVGElement}))}},a.defaults={attrs:{\"fill-opacity\":1,\"stroke-opacity\":1,\"stroke-width\":0,\"stroke-linejoin\":\"miter\",\"stroke-linecap\":\"butt\",fill:\"#000000\",stroke:\"#000000\",opacity:1,x:0,y:0,cx:0,cy:0,width:0,height:0,r:0,rx:0,ry:0,offset:0,\"stop-opacity\":1,\"stop-color\":\"#000000\",\"font-size\":16,\"font-family\":\"Helvetica, Arial, sans-serif\",\"text-anchor\":\"start\"}},a.Color=function(t){var e,s;this.r=0,this.g=0,this.b=0,t&&(\"string\"==typeof t?a.regex.isRgb.test(t)?(e=a.regex.rgb.exec(t.replace(a.regex.whitespace,\"\")),this.r=parseInt(e[1]),this.g=parseInt(e[2]),this.b=parseInt(e[3])):a.regex.isHex.test(t)&&(e=a.regex.hex.exec(4==(s=t).length?[\"#\",s.substring(1,2),s.substring(1,2),s.substring(2,3),s.substring(2,3),s.substring(3,4),s.substring(3,4)].join(\"\"):s),this.r=parseInt(e[1],16),this.g=parseInt(e[2],16),this.b=parseInt(e[3],16)):\"object\"===i(t)&&(this.r=t.r,this.g=t.g,this.b=t.b))},a.extend(a.Color,{toString:function(){return this.toHex()},toHex:function(){return\"#\"+g(this.r)+g(this.g)+g(this.b)},toRgb:function(){return\"rgb(\"+[this.r,this.g,this.b].join()+\")\"},brightness:function(){return this.r/255*.3+this.g/255*.59+this.b/255*.11},morph:function(t){return this.destination=new a.Color(t),this},at:function(t){return this.destination?(t=t<0?0:t>1?1:t,new a.Color({r:~~(this.r+(this.destination.r-this.r)*t),g:~~(this.g+(this.destination.g-this.g)*t),b:~~(this.b+(this.destination.b-this.b)*t)})):this}}),a.Color.test=function(t){return t+=\"\",a.regex.isHex.test(t)||a.regex.isRgb.test(t)},a.Color.isRgb=function(t){return t&&\"number\"==typeof t.r&&\"number\"==typeof t.g&&\"number\"==typeof t.b},a.Color.isColor=function(t){return a.Color.isRgb(t)||a.Color.test(t)},a.Array=function(t,e){0==(t=(t||[]).valueOf()).length&&e&&(t=e.valueOf()),this.value=this.parse(t)},a.extend(a.Array,{toString:function(){return this.value.join(\" \")},valueOf:function(){return this.value},parse:function(t){return t=t.valueOf(),Array.isArray(t)?t:this.split(t)}}),a.PointArray=function(t,e){a.Array.call(this,t,e||[[0,0]])},a.PointArray.prototype=new a.Array,a.PointArray.prototype.constructor=a.PointArray;for(var s={M:function(t,e,i){return e.x=i.x=t[0],e.y=i.y=t[1],[\"M\",e.x,e.y]},L:function(t,e){return e.x=t[0],e.y=t[1],[\"L\",t[0],t[1]]},H:function(t,e){return e.x=t[0],[\"H\",t[0]]},V:function(t,e){return e.y=t[0],[\"V\",t[0]]},C:function(t,e){return e.x=t[4],e.y=t[5],[\"C\",t[0],t[1],t[2],t[3],t[4],t[5]]},Q:function(t,e){return e.x=t[2],e.y=t[3],[\"Q\",t[0],t[1],t[2],t[3]]},Z:function(t,e,i){return e.x=i.x,e.y=i.y,[\"Z\"]}},r=\"mlhvqtcsaz\".split(\"\"),o=0,n=r.length;o<n;++o)s[r[o]]=function(t){return function(e,i,a){if(\"H\"==t)e[0]=e[0]+i.x;else if(\"V\"==t)e[0]=e[0]+i.y;else if(\"A\"==t)e[5]=e[5]+i.x,e[6]=e[6]+i.y;else for(var r=0,o=e.length;r<o;++r)e[r]=e[r]+(r%2?i.y:i.x);if(s&&\"function\"==typeof s[t])return s[t](e,i,a)}}(r[o].toUpperCase());a.PathArray=function(t,e){a.Array.call(this,t,e||[[\"M\",0,0]])},a.PathArray.prototype=new a.Array,a.PathArray.prototype.constructor=a.PathArray,a.extend(a.PathArray,{toString:function(){return function(t){for(var e=0,i=t.length,a=\"\";e<i;e++)a+=t[e][0],null!=t[e][1]&&(a+=t[e][1],null!=t[e][2]&&(a+=\" \",a+=t[e][2],null!=t[e][3]&&(a+=\" \",a+=t[e][3],a+=\" \",a+=t[e][4],null!=t[e][5]&&(a+=\" \",a+=t[e][5],a+=\" \",a+=t[e][6],null!=t[e][7]&&(a+=\" \",a+=t[e][7])))));return a+\" \"}(this.value)},move:function(t,e){var i=this.bbox();return i.x,i.y,this},at:function(t){if(!this.destination)return this;for(var e=this.value,i=this.destination.value,s=[],r=new a.PathArray,o=0,n=e.length;o<n;o++){s[o]=[e[o][0]];for(var l=1,h=e[o].length;l<h;l++)s[o][l]=e[o][l]+(i[o][l]-e[o][l])*t;\"A\"===s[o][0]&&(s[o][4]=+(0!=s[o][4]),s[o][5]=+(0!=s[o][5]))}return r.value=s,r},parse:function(t){if(t instanceof a.PathArray)return t.valueOf();var e,i={M:2,L:2,H:1,V:1,C:6,S:4,Q:4,T:2,A:7,Z:0};t=\"string\"==typeof t?t.replace(a.regex.numbersWithDots,h).replace(a.regex.pathLetters,\" $& \").replace(a.regex.hyphen,\"$1 -\").trim().split(a.regex.delimiter):t.reduce((function(t,e){return[].concat.call(t,e)}),[]);var r=[],o=new a.Point,n=new a.Point,l=0,c=t.length;do{a.regex.isPathLetter.test(t[l])?(e=t[l],++l):\"M\"==e?e=\"L\":\"m\"==e&&(e=\"l\"),r.push(s[e].call(null,t.slice(l,l+=i[e.toUpperCase()]).map(parseFloat),o,n))}while(c>l);return r},bbox:function(){return a.parser.draw||a.prepare(),a.parser.path.setAttribute(\"d\",this.toString()),a.parser.path.getBBox()}}),a.Number=a.invent({create:function(t,e){this.value=0,this.unit=e||\"\",\"number\"==typeof t?this.value=isNaN(t)?0:isFinite(t)?t:t<0?-34e37:34e37:\"string\"==typeof t?(e=t.match(a.regex.numberAndUnit))&&(this.value=parseFloat(e[1]),\"%\"==e[5]?this.value/=100:\"s\"==e[5]&&(this.value*=1e3),this.unit=e[5]):t instanceof a.Number&&(this.value=t.valueOf(),this.unit=t.unit)},extend:{toString:function(){return(\"%\"==this.unit?~~(1e8*this.value)/1e6:\"s\"==this.unit?this.value/1e3:this.value)+this.unit},toJSON:function(){return this.toString()},valueOf:function(){return this.value},plus:function(t){return t=new a.Number(t),new a.Number(this+t,this.unit||t.unit)},minus:function(t){return t=new a.Number(t),new a.Number(this-t,this.unit||t.unit)},times:function(t){return t=new a.Number(t),new a.Number(this*t,this.unit||t.unit)},divide:function(t){return t=new a.Number(t),new a.Number(this/t,this.unit||t.unit)},to:function(t){var e=new a.Number(this);return\"string\"==typeof t&&(e.unit=t),e},morph:function(t){return this.destination=new a.Number(t),t.relative&&(this.destination.value+=this.value),this},at:function(t){return this.destination?new a.Number(this.destination).minus(this).times(t).plus(this):this}}}),a.Element=a.invent({create:function(t){this._stroke=a.defaults.attrs.stroke,this._event=null,this.dom={},(this.node=t)&&(this.type=t.nodeName,this.node.instance=this,this._stroke=t.getAttribute(\"stroke\")||this._stroke)},extend:{x:function(t){return this.attr(\"x\",t)},y:function(t){return this.attr(\"y\",t)},cx:function(t){return null==t?this.x()+this.width()/2:this.x(t-this.width()/2)},cy:function(t){return null==t?this.y()+this.height()/2:this.y(t-this.height()/2)},move:function(t,e){return this.x(t).y(e)},center:function(t,e){return this.cx(t).cy(e)},width:function(t){return this.attr(\"width\",t)},height:function(t){return this.attr(\"height\",t)},size:function(t,e){var i=u(this,t,e);return this.width(new a.Number(i.width)).height(new a.Number(i.height))},clone:function(t){this.writeDataToDom();var e=x(this.node.cloneNode(!0));return t?t.add(e):this.after(e),e},remove:function(){return this.parent()&&this.parent().removeElement(this),this},replace:function(t){return this.after(t).remove(),t},addTo:function(t){return t.put(this)},putIn:function(t){return t.add(this)},id:function(t){return this.attr(\"id\",t)},show:function(){return this.style(\"display\",\"\")},hide:function(){return this.style(\"display\",\"none\")},visible:function(){return\"none\"!=this.style(\"display\")},toString:function(){return this.attr(\"id\")},classes:function(){var t=this.attr(\"class\");return null==t?[]:t.trim().split(a.regex.delimiter)},hasClass:function(t){return-1!=this.classes().indexOf(t)},addClass:function(t){if(!this.hasClass(t)){var e=this.classes();e.push(t),this.attr(\"class\",e.join(\" \"))}return this},removeClass:function(t){return this.hasClass(t)&&this.attr(\"class\",this.classes().filter((function(e){return e!=t})).join(\" \")),this},toggleClass:function(t){return this.hasClass(t)?this.removeClass(t):this.addClass(t)},reference:function(t){return a.get(this.attr(t))},parent:function(e){var i=this;if(!i.node.parentNode)return null;if(i=a.adopt(i.node.parentNode),!e)return i;for(;i&&i.node instanceof t.SVGElement;){if(\"string\"==typeof e?i.matches(e):i instanceof e)return i;if(!i.node.parentNode||\"#document\"==i.node.parentNode.nodeName)return null;i=a.adopt(i.node.parentNode)}},doc:function(){return this instanceof a.Doc?this:this.parent(a.Doc)},parents:function(t){var e=[],i=this;do{if(!(i=i.parent(t))||!i.node)break;e.push(i)}while(i.parent);return e},matches:function(t){return function(t,e){return(t.matches||t.matchesSelector||t.msMatchesSelector||t.mozMatchesSelector||t.webkitMatchesSelector||t.oMatchesSelector).call(t,e)}(this.node,t)},native:function(){return this.node},svg:function(t){var i=e.createElement(\"svg\");if(!(t&&this instanceof a.Parent))return i.appendChild(t=e.createElement(\"svg\")),this.writeDataToDom(),t.appendChild(this.node.cloneNode(!0)),i.innerHTML.replace(/^<svg>/,\"\").replace(/<\\/svg>$/,\"\");i.innerHTML=\"<svg>\"+t.replace(/\\n/,\"\").replace(/<([\\w:-]+)([^<]+?)\\/>/g,\"<$1$2></$1>\")+\"</svg>\";for(var s=0,r=i.firstChild.childNodes.length;s<r;s++)this.node.appendChild(i.firstChild.firstChild);return this},writeDataToDom:function(){return(this.each||this.lines)&&(this.each?this:this.lines()).each((function(){this.writeDataToDom()})),this.node.removeAttribute(\"svgjs:data\"),Object.keys(this.dom).length&&this.node.setAttribute(\"svgjs:data\",JSON.stringify(this.dom)),this},setData:function(t){return this.dom=t,this},is:function(t){return function(t,e){return t instanceof e}(this,t)}}}),a.easing={\"-\":function(t){return t},\"<>\":function(t){return-Math.cos(t*Math.PI)/2+.5},\">\":function(t){return Math.sin(t*Math.PI/2)},\"<\":function(t){return 1-Math.cos(t*Math.PI/2)}},a.morph=function(t){return function(e,i){return new a.MorphObj(e,i).at(t)}},a.Situation=a.invent({create:function(t){this.init=!1,this.reversed=!1,this.reversing=!1,this.duration=new a.Number(t.duration).valueOf(),this.delay=new a.Number(t.delay).valueOf(),this.start=+new Date+this.delay,this.finish=this.start+this.duration,this.ease=t.ease,this.loop=0,this.loops=!1,this.animations={},this.attrs={},this.styles={},this.transforms=[],this.once={}}}),a.FX=a.invent({create:function(t){this._target=t,this.situations=[],this.active=!1,this.situation=null,this.paused=!1,this.lastPos=0,this.pos=0,this.absPos=0,this._speed=1},extend:{animate:function(t,e,s){\"object\"===i(t)&&(e=t.ease,s=t.delay,t=t.duration);var r=new a.Situation({duration:t||1e3,delay:s||0,ease:a.easing[e||\"-\"]||e});return this.queue(r),this},target:function(t){return t&&t instanceof a.Element?(this._target=t,this):this._target},timeToAbsPos:function(t){return(t-this.situation.start)/(this.situation.duration/this._speed)},absPosToTime:function(t){return this.situation.duration/this._speed*t+this.situation.start},startAnimFrame:function(){this.stopAnimFrame(),this.animationFrame=t.requestAnimationFrame(function(){this.step()}.bind(this))},stopAnimFrame:function(){t.cancelAnimationFrame(this.animationFrame)},start:function(){return!this.active&&this.situation&&(this.active=!0,this.startCurrent()),this},startCurrent:function(){return this.situation.start=+new Date+this.situation.delay/this._speed,this.situation.finish=this.situation.start+this.situation.duration/this._speed,this.initAnimations().step()},queue:function(t){return(\"function\"==typeof t||t instanceof a.Situation)&&this.situations.push(t),this.situation||(this.situation=this.situations.shift()),this},dequeue:function(){return this.stop(),this.situation=this.situations.shift(),this.situation&&(this.situation instanceof a.Situation?this.start():this.situation.call(this)),this},initAnimations:function(){var t,e=this.situation;if(e.init)return this;for(var i in e.animations){t=this.target()[i](),Array.isArray(t)||(t=[t]),Array.isArray(e.animations[i])||(e.animations[i]=[e.animations[i]]);for(var s=t.length;s--;)e.animations[i][s]instanceof a.Number&&(t[s]=new a.Number(t[s])),e.animations[i][s]=t[s].morph(e.animations[i][s])}for(var i in e.attrs)e.attrs[i]=new a.MorphObj(this.target().attr(i),e.attrs[i]);for(var i in e.styles)e.styles[i]=new a.MorphObj(this.target().style(i),e.styles[i]);return e.initialTransformation=this.target().matrixify(),e.init=!0,this},clearQueue:function(){return this.situations=[],this},clearCurrent:function(){return this.situation=null,this},stop:function(t,e){var i=this.active;return this.active=!1,e&&this.clearQueue(),t&&this.situation&&(!i&&this.startCurrent(),this.atEnd()),this.stopAnimFrame(),this.clearCurrent()},after:function(t){var e=this.last();return this.target().on(\"finished.fx\",(function i(a){a.detail.situation==e&&(t.call(this,e),this.off(\"finished.fx\",i))})),this._callStart()},during:function(t){var e=this.last(),i=function(i){i.detail.situation==e&&t.call(this,i.detail.pos,a.morph(i.detail.pos),i.detail.eased,e)};return this.target().off(\"during.fx\",i).on(\"during.fx\",i),this.after((function(){this.off(\"during.fx\",i)})),this._callStart()},afterAll:function(t){var e=function e(i){t.call(this),this.off(\"allfinished.fx\",e)};return this.target().off(\"allfinished.fx\",e).on(\"allfinished.fx\",e),this._callStart()},last:function(){return this.situations.length?this.situations[this.situations.length-1]:this.situation},add:function(t,e,i){return this.last()[i||\"animations\"][t]=e,this._callStart()},step:function(t){var e,i,a;t||(this.absPos=this.timeToAbsPos(+new Date)),!1!==this.situation.loops?(e=Math.max(this.absPos,0),i=Math.floor(e),!0===this.situation.loops||i<this.situation.loops?(this.pos=e-i,a=this.situation.loop,this.situation.loop=i):(this.absPos=this.situation.loops,this.pos=1,a=this.situation.loop-1,this.situation.loop=this.situation.loops),this.situation.reversing&&(this.situation.reversed=this.situation.reversed!=Boolean((this.situation.loop-a)%2))):(this.absPos=Math.min(this.absPos,1),this.pos=this.absPos),this.pos<0&&(this.pos=0),this.situation.reversed&&(this.pos=1-this.pos);var s=this.situation.ease(this.pos);for(var r in this.situation.once)r>this.lastPos&&r<=s&&(this.situation.once[r].call(this.target(),this.pos,s),delete this.situation.once[r]);return this.active&&this.target().fire(\"during\",{pos:this.pos,eased:s,fx:this,situation:this.situation}),this.situation?(this.eachAt(),1==this.pos&&!this.situation.reversed||this.situation.reversed&&0==this.pos?(this.stopAnimFrame(),this.target().fire(\"finished\",{fx:this,situation:this.situation}),this.situations.length||(this.target().fire(\"allfinished\"),this.situations.length||(this.target().off(\".fx\"),this.active=!1)),this.active?this.dequeue():this.clearCurrent()):!this.paused&&this.active&&this.startAnimFrame(),this.lastPos=s,this):this},eachAt:function(){var t,e=this,i=this.target(),s=this.situation;for(var r in s.animations)t=[].concat(s.animations[r]).map((function(t){return\"string\"!=typeof t&&t.at?t.at(s.ease(e.pos),e.pos):t})),i[r].apply(i,t);for(var r in s.attrs)t=[r].concat(s.attrs[r]).map((function(t){return\"string\"!=typeof t&&t.at?t.at(s.ease(e.pos),e.pos):t})),i.attr.apply(i,t);for(var r in s.styles)t=[r].concat(s.styles[r]).map((function(t){return\"string\"!=typeof t&&t.at?t.at(s.ease(e.pos),e.pos):t})),i.style.apply(i,t);if(s.transforms.length){t=s.initialTransformation,r=0;for(var o=s.transforms.length;r<o;r++){var n=s.transforms[r];n instanceof a.Matrix?t=n.relative?t.multiply((new a.Matrix).morph(n).at(s.ease(this.pos))):t.morph(n).at(s.ease(this.pos)):(n.relative||n.undo(t.extract()),t=t.multiply(n.at(s.ease(this.pos))))}i.matrix(t)}return this},once:function(t,e,i){var a=this.last();return i||(t=a.ease(t)),a.once[t]=e,this},_callStart:function(){return setTimeout(function(){this.start()}.bind(this),0),this}},parent:a.Element,construct:{animate:function(t,e,i){return(this.fx||(this.fx=new a.FX(this))).animate(t,e,i)},delay:function(t){return(this.fx||(this.fx=new a.FX(this))).delay(t)},stop:function(t,e){return this.fx&&this.fx.stop(t,e),this},finish:function(){return this.fx&&this.fx.finish(),this}}}),a.MorphObj=a.invent({create:function(t,e){return a.Color.isColor(e)?new a.Color(t).morph(e):a.regex.delimiter.test(t)?a.regex.pathLetters.test(t)?new a.PathArray(t).morph(e):new a.Array(t).morph(e):a.regex.numberAndUnit.test(e)?new a.Number(t).morph(e):(this.value=t,void(this.destination=e))},extend:{at:function(t,e){return e<1?this.value:this.destination},valueOf:function(){return this.value}}}),a.extend(a.FX,{attr:function(t,e,a){if(\"object\"===i(t))for(var s in t)this.attr(s,t[s]);else this.add(t,e,\"attrs\");return this},plot:function(t,e,i,a){return 4==arguments.length?this.plot([t,e,i,a]):this.add(\"plot\",new(this.target().morphArray)(t))}}),a.Box=a.invent({create:function(t,e,s,r){if(!(\"object\"!==i(t)||t instanceof a.Element))return a.Box.call(this,null!=t.left?t.left:t.x,null!=t.top?t.top:t.y,t.width,t.height);var o;4==arguments.length&&(this.x=t,this.y=e,this.width=s,this.height=r),null==(o=this).x&&(o.x=0,o.y=0,o.width=0,o.height=0),o.w=o.width,o.h=o.height,o.x2=o.x+o.width,o.y2=o.y+o.height,o.cx=o.x+o.width/2,o.cy=o.y+o.height/2}}),a.BBox=a.invent({create:function(t){if(a.Box.apply(this,[].slice.call(arguments)),t instanceof a.Element){var i;try{if(!e.documentElement.contains){for(var s=t.node;s.parentNode;)s=s.parentNode;if(s!=e)throw new Error(\"Element not in the dom\")}i=t.node.getBBox()}catch(e){if(t instanceof a.Shape){a.parser.draw||a.prepare();var r=t.clone(a.parser.draw.instance).show();r&&r.node&&\"function\"==typeof r.node.getBBox&&(i=r.node.getBBox()),r&&\"function\"==typeof r.remove&&r.remove()}else i={x:t.node.clientLeft,y:t.node.clientTop,width:t.node.clientWidth,height:t.node.clientHeight}}a.Box.call(this,i)}},inherit:a.Box,parent:a.Element,construct:{bbox:function(){return new a.BBox(this)}}}),a.BBox.prototype.constructor=a.BBox,a.Matrix=a.invent({create:function(t){var e=p([1,0,0,1,0,0]);t=null===t?e:t instanceof a.Element?t.matrixify():\"string\"==typeof t?p(t.split(a.regex.delimiter).map(parseFloat)):6==arguments.length?p([].slice.call(arguments)):Array.isArray(t)?p(t):t&&\"object\"===i(t)?t:e;for(var s=v.length-1;s>=0;--s)this[v[s]]=null!=t[v[s]]?t[v[s]]:e[v[s]]},extend:{extract:function(){var t=f(this,0,1);f(this,1,0);var e=180/Math.PI*Math.atan2(t.y,t.x)-90;return{x:this.e,y:this.f,transformedX:(this.e*Math.cos(e*Math.PI/180)+this.f*Math.sin(e*Math.PI/180))/Math.sqrt(this.a*this.a+this.b*this.b),transformedY:(this.f*Math.cos(e*Math.PI/180)+this.e*Math.sin(-e*Math.PI/180))/Math.sqrt(this.c*this.c+this.d*this.d),rotation:e,a:this.a,b:this.b,c:this.c,d:this.d,e:this.e,f:this.f,matrix:new a.Matrix(this)}},clone:function(){return new a.Matrix(this)},morph:function(t){return this.destination=new a.Matrix(t),this},multiply:function(t){return new a.Matrix(this.native().multiply(function(t){return t instanceof a.Matrix||(t=new a.Matrix(t)),t}(t).native()))},inverse:function(){return new a.Matrix(this.native().inverse())},translate:function(t,e){return new a.Matrix(this.native().translate(t||0,e||0))},native:function(){for(var t=a.parser.native.createSVGMatrix(),e=v.length-1;e>=0;e--)t[v[e]]=this[v[e]];return t},toString:function(){return\"matrix(\"+b(this.a)+\",\"+b(this.b)+\",\"+b(this.c)+\",\"+b(this.d)+\",\"+b(this.e)+\",\"+b(this.f)+\")\"}},parent:a.Element,construct:{ctm:function(){return new a.Matrix(this.node.getCTM())},screenCTM:function(){if(this instanceof a.Nested){var t=this.rect(1,1),e=t.node.getScreenCTM();return t.remove(),new a.Matrix(e)}return new a.Matrix(this.node.getScreenCTM())}}}),a.Point=a.invent({create:function(t,e){var a;a=Array.isArray(t)?{x:t[0],y:t[1]}:\"object\"===i(t)?{x:t.x,y:t.y}:null!=t?{x:t,y:null!=e?e:t}:{x:0,y:0},this.x=a.x,this.y=a.y},extend:{clone:function(){return new a.Point(this)},morph:function(t,e){return this.destination=new a.Point(t,e),this}}}),a.extend(a.Element,{point:function(t,e){return new a.Point(t,e).transform(this.screenCTM().inverse())}}),a.extend(a.Element,{attr:function(t,e,s){if(null==t){for(t={},s=(e=this.node.attributes).length-1;s>=0;s--)t[e[s].nodeName]=a.regex.isNumber.test(e[s].nodeValue)?parseFloat(e[s].nodeValue):e[s].nodeValue;return t}if(\"object\"===i(t))for(var r in t)this.attr(r,t[r]);else if(null===e)this.node.removeAttribute(t);else{if(null==e)return null==(e=this.node.getAttribute(t))?a.defaults.attrs[t]:a.regex.isNumber.test(e)?parseFloat(e):e;\"stroke-width\"==t?this.attr(\"stroke\",parseFloat(e)>0?this._stroke:null):\"stroke\"==t&&(this._stroke=e),\"fill\"!=t&&\"stroke\"!=t||(a.regex.isImage.test(e)&&(e=this.doc().defs().image(e,0,0)),e instanceof a.Image&&(e=this.doc().defs().pattern(0,0,(function(){this.add(e)})))),\"number\"==typeof e?e=new a.Number(e):a.Color.isColor(e)?e=new a.Color(e):Array.isArray(e)&&(e=new a.Array(e)),\"leading\"==t?this.leading&&this.leading(e):\"string\"==typeof s?this.node.setAttributeNS(s,t,e.toString()):this.node.setAttribute(t,e.toString()),!this.rebuild||\"font-size\"!=t&&\"x\"!=t||this.rebuild(t,e)}return this}}),a.extend(a.Element,{transform:function(t,e){var s;return\"object\"!==i(t)?(s=new a.Matrix(this).extract(),\"string\"==typeof t?s[t]:s):(s=new a.Matrix(this),e=!!e||!!t.relative,null!=t.a&&(s=e?s.multiply(new a.Matrix(t)):new a.Matrix(t)),this.attr(\"transform\",s))}}),a.extend(a.Element,{untransform:function(){return this.attr(\"transform\",null)},matrixify:function(){return(this.attr(\"transform\")||\"\").split(a.regex.transforms).slice(0,-1).map((function(t){var e=t.trim().split(\"(\");return[e[0],e[1].split(a.regex.delimiter).map((function(t){return parseFloat(t)}))]})).reduce((function(t,e){return\"matrix\"==e[0]?t.multiply(p(e[1])):t[e[0]].apply(t,e[1])}),new a.Matrix)},toParent:function(t){if(this==t)return this;var e=this.screenCTM(),i=t.screenCTM().inverse();return this.addTo(t).untransform().transform(i.multiply(e)),this},toDoc:function(){return this.toParent(this.doc())}}),a.Transformation=a.invent({create:function(t,e){if(arguments.length>1&&\"boolean\"!=typeof e)return this.constructor.call(this,[].slice.call(arguments));if(Array.isArray(t))for(var a=0,s=this.arguments.length;a<s;++a)this[this.arguments[a]]=t[a];else if(t&&\"object\"===i(t))for(a=0,s=this.arguments.length;a<s;++a)this[this.arguments[a]]=t[this.arguments[a]];this.inversed=!1,!0===e&&(this.inversed=!0)}}),a.Translate=a.invent({parent:a.Matrix,inherit:a.Transformation,create:function(t,e){this.constructor.apply(this,[].slice.call(arguments))},extend:{arguments:[\"transformedX\",\"transformedY\"],method:\"translate\"}}),a.extend(a.Element,{style:function(t,e){if(0==arguments.length)return this.node.style.cssText||\"\";if(arguments.length<2)if(\"object\"===i(t))for(var s in t)this.style(s,t[s]);else{if(!a.regex.isCss.test(t))return this.node.style[c(t)];for(t=t.split(/\\s*;\\s*/).filter((function(t){return!!t})).map((function(t){return t.split(/\\s*:\\s*/)}));e=t.pop();)this.style(e[0],e[1])}else this.node.style[c(t)]=null===e||a.regex.isBlank.test(e)?\"\":e;return this}}),a.Parent=a.invent({create:function(t){this.constructor.call(this,t)},inherit:a.Element,extend:{children:function(){return a.utils.map(a.utils.filterSVGElements(this.node.childNodes),(function(t){return a.adopt(t)}))},add:function(t,e){return null==e?this.node.appendChild(t.node):t.node!=this.node.childNodes[e]&&this.node.insertBefore(t.node,this.node.childNodes[e]),this},put:function(t,e){return this.add(t,e),t},has:function(t){return this.index(t)>=0},index:function(t){return[].slice.call(this.node.childNodes).indexOf(t.node)},get:function(t){return a.adopt(this.node.childNodes[t])},first:function(){return this.get(0)},last:function(){return this.get(this.node.childNodes.length-1)},each:function(t,e){for(var i=this.children(),s=0,r=i.length;s<r;s++)i[s]instanceof a.Element&&t.apply(i[s],[s,i]),e&&i[s]instanceof a.Container&&i[s].each(t,e);return this},removeElement:function(t){return this.node.removeChild(t.node),this},clear:function(){for(;this.node.hasChildNodes();)this.node.removeChild(this.node.lastChild);return delete this._defs,this},defs:function(){return this.doc().defs()}}}),a.extend(a.Parent,{ungroup:function(t,e){return 0===e||this instanceof a.Defs||this.node==a.parser.draw||(t=t||(this instanceof a.Doc?this:this.parent(a.Parent)),e=e||1/0,this.each((function(){return this instanceof a.Defs?this:this instanceof a.Parent?this.ungroup(t,e-1):this.toParent(t)})),this.node.firstChild||this.remove()),this},flatten:function(t,e){return this.ungroup(t,e)}}),a.Container=a.invent({create:function(t){this.constructor.call(this,t)},inherit:a.Parent}),a.ViewBox=a.invent({parent:a.Container,construct:{}}),[\"click\",\"dblclick\",\"mousedown\",\"mouseup\",\"mouseover\",\"mouseout\",\"mousemove\",\"touchstart\",\"touchmove\",\"touchleave\",\"touchend\",\"touchcancel\"].forEach((function(t){a.Element.prototype[t]=function(e){return a.on(this.node,t,e),this}})),a.listeners=[],a.handlerMap=[],a.listenerId=0,a.on=function(t,e,i,s,r){var o=i.bind(s||t.instance||t),n=(a.handlerMap.indexOf(t)+1||a.handlerMap.push(t))-1,l=e.split(\".\")[0],h=e.split(\".\")[1]||\"*\";a.listeners[n]=a.listeners[n]||{},a.listeners[n][l]=a.listeners[n][l]||{},a.listeners[n][l][h]=a.listeners[n][l][h]||{},i._svgjsListenerId||(i._svgjsListenerId=++a.listenerId),a.listeners[n][l][h][i._svgjsListenerId]=o,t.addEventListener(l,o,r||{passive:!0})},a.off=function(t,e,i){var s=a.handlerMap.indexOf(t),r=e&&e.split(\".\")[0],o=e&&e.split(\".\")[1],n=\"\";if(-1!=s)if(i){if(\"function\"==typeof i&&(i=i._svgjsListenerId),!i)return;a.listeners[s][r]&&a.listeners[s][r][o||\"*\"]&&(t.removeEventListener(r,a.listeners[s][r][o||\"*\"][i],!1),delete a.listeners[s][r][o||\"*\"][i])}else if(o&&r){if(a.listeners[s][r]&&a.listeners[s][r][o]){for(var l in a.listeners[s][r][o])a.off(t,[r,o].join(\".\"),l);delete a.listeners[s][r][o]}}else if(o)for(var h in a.listeners[s])for(var n in a.listeners[s][h])o===n&&a.off(t,[h,o].join(\".\"));else if(r){if(a.listeners[s][r]){for(var n in a.listeners[s][r])a.off(t,[r,n].join(\".\"));delete a.listeners[s][r]}}else{for(var h in a.listeners[s])a.off(t,h);delete a.listeners[s],delete a.handlerMap[s]}},a.extend(a.Element,{on:function(t,e,i,s){return a.on(this.node,t,e,i,s),this},off:function(t,e){return a.off(this.node,t,e),this},fire:function(e,i){return e instanceof t.Event?this.node.dispatchEvent(e):this.node.dispatchEvent(e=new a.CustomEvent(e,{detail:i,cancelable:!0})),this._event=e,this},event:function(){return this._event}}),a.Defs=a.invent({create:\"defs\",inherit:a.Container}),a.G=a.invent({create:\"g\",inherit:a.Container,extend:{x:function(t){return null==t?this.transform(\"x\"):this.transform({x:t-this.x()},!0)}},construct:{group:function(){return this.put(new a.G)}}}),a.Doc=a.invent({create:function(t){t&&(\"svg\"==(t=\"string\"==typeof t?e.getElementById(t):t).nodeName?this.constructor.call(this,t):(this.constructor.call(this,a.create(\"svg\")),t.appendChild(this.node),this.size(\"100%\",\"100%\")),this.namespace().defs())},inherit:a.Container,extend:{namespace:function(){return this.attr({xmlns:a.ns,version:\"1.1\"}).attr(\"xmlns:xlink\",a.xlink,a.xmlns).attr(\"xmlns:svgjs\",a.svgjs,a.xmlns)},defs:function(){var t;return this._defs||((t=this.node.getElementsByTagName(\"defs\")[0])?this._defs=a.adopt(t):this._defs=new a.Defs,this.node.appendChild(this._defs.node)),this._defs},parent:function(){return this.node.parentNode&&\"#document\"!=this.node.parentNode.nodeName?this.node.parentNode:null},remove:function(){return this.parent()&&this.parent().removeChild(this.node),this},clear:function(){for(;this.node.hasChildNodes();)this.node.removeChild(this.node.lastChild);return delete this._defs,a.parser.draw&&!a.parser.draw.parentNode&&this.node.appendChild(a.parser.draw),this},clone:function(t){this.writeDataToDom();var e=this.node,i=x(e.cloneNode(!0));return t?(t.node||t).appendChild(i.node):e.parentNode.insertBefore(i.node,e.nextSibling),i}}}),a.extend(a.Element,{}),a.Gradient=a.invent({create:function(t){this.constructor.call(this,a.create(t+\"Gradient\")),this.type=t},inherit:a.Container,extend:{at:function(t,e,i){return this.put(new a.Stop).update(t,e,i)},update:function(t){return this.clear(),\"function\"==typeof t&&t.call(this,this),this},fill:function(){return\"url(#\"+this.id()+\")\"},toString:function(){return this.fill()},attr:function(t,e,i){return\"transform\"==t&&(t=\"gradientTransform\"),a.Container.prototype.attr.call(this,t,e,i)}},construct:{gradient:function(t,e){return this.defs().gradient(t,e)}}}),a.extend(a.Gradient,a.FX,{from:function(t,e){return\"radial\"==(this._target||this).type?this.attr({fx:new a.Number(t),fy:new a.Number(e)}):this.attr({x1:new a.Number(t),y1:new a.Number(e)})},to:function(t,e){return\"radial\"==(this._target||this).type?this.attr({cx:new a.Number(t),cy:new a.Number(e)}):this.attr({x2:new a.Number(t),y2:new a.Number(e)})}}),a.extend(a.Defs,{gradient:function(t,e){return this.put(new a.Gradient(t)).update(e)}}),a.Stop=a.invent({create:\"stop\",inherit:a.Element,extend:{update:function(t){return(\"number\"==typeof t||t instanceof a.Number)&&(t={offset:arguments[0],color:arguments[1],opacity:arguments[2]}),null!=t.opacity&&this.attr(\"stop-opacity\",t.opacity),null!=t.color&&this.attr(\"stop-color\",t.color),null!=t.offset&&this.attr(\"offset\",new a.Number(t.offset)),this}}}),a.Pattern=a.invent({create:\"pattern\",inherit:a.Container,extend:{fill:function(){return\"url(#\"+this.id()+\")\"},update:function(t){return this.clear(),\"function\"==typeof t&&t.call(this,this),this},toString:function(){return this.fill()},attr:function(t,e,i){return\"transform\"==t&&(t=\"patternTransform\"),a.Container.prototype.attr.call(this,t,e,i)}},construct:{pattern:function(t,e,i){return this.defs().pattern(t,e,i)}}}),a.extend(a.Defs,{pattern:function(t,e,i){return this.put(new a.Pattern).update(i).attr({x:0,y:0,width:t,height:e,patternUnits:\"userSpaceOnUse\"})}}),a.Shape=a.invent({create:function(t){this.constructor.call(this,t)},inherit:a.Element}),a.Symbol=a.invent({create:\"symbol\",inherit:a.Container,construct:{symbol:function(){return this.put(new a.Symbol)}}}),a.Use=a.invent({create:\"use\",inherit:a.Shape,extend:{element:function(t,e){return this.attr(\"href\",(e||\"\")+\"#\"+t,a.xlink)}},construct:{use:function(t,e){return this.put(new a.Use).element(t,e)}}}),a.Rect=a.invent({create:\"rect\",inherit:a.Shape,construct:{rect:function(t,e){return this.put(new a.Rect).size(t,e)}}}),a.Circle=a.invent({create:\"circle\",inherit:a.Shape,construct:{circle:function(t){return this.put(new a.Circle).rx(new a.Number(t).divide(2)).move(0,0)}}}),a.extend(a.Circle,a.FX,{rx:function(t){return this.attr(\"r\",t)},ry:function(t){return this.rx(t)}}),a.Ellipse=a.invent({create:\"ellipse\",inherit:a.Shape,construct:{ellipse:function(t,e){return this.put(new a.Ellipse).size(t,e).move(0,0)}}}),a.extend(a.Ellipse,a.Rect,a.FX,{rx:function(t){return this.attr(\"rx\",t)},ry:function(t){return this.attr(\"ry\",t)}}),a.extend(a.Circle,a.Ellipse,{x:function(t){return null==t?this.cx()-this.rx():this.cx(t+this.rx())},y:function(t){return null==t?this.cy()-this.ry():this.cy(t+this.ry())},cx:function(t){return null==t?this.attr(\"cx\"):this.attr(\"cx\",t)},cy:function(t){return null==t?this.attr(\"cy\"):this.attr(\"cy\",t)},width:function(t){return null==t?2*this.rx():this.rx(new a.Number(t).divide(2))},height:function(t){return null==t?2*this.ry():this.ry(new a.Number(t).divide(2))},size:function(t,e){var i=u(this,t,e);return this.rx(new a.Number(i.width).divide(2)).ry(new a.Number(i.height).divide(2))}}),a.Line=a.invent({create:\"line\",inherit:a.Shape,extend:{array:function(){return new a.PointArray([[this.attr(\"x1\"),this.attr(\"y1\")],[this.attr(\"x2\"),this.attr(\"y2\")]])},plot:function(t,e,i,s){return null==t?this.array():(t=void 0!==e?{x1:t,y1:e,x2:i,y2:s}:new a.PointArray(t).toLine(),this.attr(t))},move:function(t,e){return this.attr(this.array().move(t,e).toLine())},size:function(t,e){var i=u(this,t,e);return this.attr(this.array().size(i.width,i.height).toLine())}},construct:{line:function(t,e,i,s){return a.Line.prototype.plot.apply(this.put(new a.Line),null!=t?[t,e,i,s]:[0,0,0,0])}}}),a.Polyline=a.invent({create:\"polyline\",inherit:a.Shape,construct:{polyline:function(t){return this.put(new a.Polyline).plot(t||new a.PointArray)}}}),a.Polygon=a.invent({create:\"polygon\",inherit:a.Shape,construct:{polygon:function(t){return this.put(new a.Polygon).plot(t||new a.PointArray)}}}),a.extend(a.Polyline,a.Polygon,{array:function(){return this._array||(this._array=new a.PointArray(this.attr(\"points\")))},plot:function(t){return null==t?this.array():this.clear().attr(\"points\",\"string\"==typeof t?t:this._array=new a.PointArray(t))},clear:function(){return delete this._array,this},move:function(t,e){return this.attr(\"points\",this.array().move(t,e))},size:function(t,e){var i=u(this,t,e);return this.attr(\"points\",this.array().size(i.width,i.height))}}),a.extend(a.Line,a.Polyline,a.Polygon,{morphArray:a.PointArray,x:function(t){return null==t?this.bbox().x:this.move(t,this.bbox().y)},y:function(t){return null==t?this.bbox().y:this.move(this.bbox().x,t)},width:function(t){var e=this.bbox();return null==t?e.width:this.size(t,e.height)},height:function(t){var e=this.bbox();return null==t?e.height:this.size(e.width,t)}}),a.Path=a.invent({create:\"path\",inherit:a.Shape,extend:{morphArray:a.PathArray,array:function(){return this._array||(this._array=new a.PathArray(this.attr(\"d\")))},plot:function(t){return null==t?this.array():this.clear().attr(\"d\",\"string\"==typeof t?t:this._array=new a.PathArray(t))},clear:function(){return delete this._array,this}},construct:{path:function(t){return this.put(new a.Path).plot(t||new a.PathArray)}}}),a.Image=a.invent({create:\"image\",inherit:a.Shape,extend:{load:function(e){if(!e)return this;var i=this,s=new t.Image;return a.on(s,\"load\",(function(){a.off(s);var t=i.parent(a.Pattern);null!==t&&(0==i.width()&&0==i.height()&&i.size(s.width,s.height),t&&0==t.width()&&0==t.height()&&t.size(i.width(),i.height()),\"function\"==typeof i._loaded&&i._loaded.call(i,{width:s.width,height:s.height,ratio:s.width/s.height,url:e}))})),a.on(s,\"error\",(function(t){a.off(s),\"function\"==typeof i._error&&i._error.call(i,t)})),this.attr(\"href\",s.src=this.src=e,a.xlink)},loaded:function(t){return this._loaded=t,this},error:function(t){return this._error=t,this}},construct:{image:function(t,e,i){return this.put(new a.Image).load(t).size(e||0,i||e||0)}}}),a.Text=a.invent({create:function(){this.constructor.call(this,a.create(\"text\")),this.dom.leading=new a.Number(1.3),this._rebuild=!0,this._build=!1,this.attr(\"font-family\",a.defaults.attrs[\"font-family\"])},inherit:a.Shape,extend:{x:function(t){return null==t?this.attr(\"x\"):this.attr(\"x\",t)},text:function(t){if(void 0===t){t=\"\";for(var e=this.node.childNodes,i=0,s=e.length;i<s;++i)0!=i&&3!=e[i].nodeType&&1==a.adopt(e[i]).dom.newLined&&(t+=\"\\n\"),t+=e[i].textContent;return t}if(this.clear().build(!0),\"function\"==typeof t)t.call(this,this);else{i=0;for(var r=(t=t.split(\"\\n\")).length;i<r;i++)this.tspan(t[i]).newLine()}return this.build(!1).rebuild()},size:function(t){return this.attr(\"font-size\",t).rebuild()},leading:function(t){return null==t?this.dom.leading:(this.dom.leading=new a.Number(t),this.rebuild())},lines:function(){var t=(this.textPath&&this.textPath()||this).node,e=a.utils.map(a.utils.filterSVGElements(t.childNodes),(function(t){return a.adopt(t)}));return new a.Set(e)},rebuild:function(t){if(\"boolean\"==typeof t&&(this._rebuild=t),this._rebuild){var e=this,i=0,s=this.dom.leading*new a.Number(this.attr(\"font-size\"));this.lines().each((function(){this.dom.newLined&&(e.textPath()||this.attr(\"x\",e.attr(\"x\")),\"\\n\"==this.text()?i+=s:(this.attr(\"dy\",s+i),i=0))})),this.fire(\"rebuild\")}return this},build:function(t){return this._build=!!t,this},setData:function(t){return this.dom=t,this.dom.leading=new a.Number(t.leading||1.3),this}},construct:{text:function(t){return this.put(new a.Text).text(t)},plain:function(t){return this.put(new a.Text).plain(t)}}}),a.Tspan=a.invent({create:\"tspan\",inherit:a.Shape,extend:{text:function(t){return null==t?this.node.textContent+(this.dom.newLined?\"\\n\":\"\"):(\"function\"==typeof t?t.call(this,this):this.plain(t),this)},dx:function(t){return this.attr(\"dx\",t)},dy:function(t){return this.attr(\"dy\",t)},newLine:function(){var t=this.parent(a.Text);return this.dom.newLined=!0,this.dy(t.dom.leading*t.attr(\"font-size\")).attr(\"x\",t.x())}}}),a.extend(a.Text,a.Tspan,{plain:function(t){return!1===this._build&&this.clear(),this.node.appendChild(e.createTextNode(t)),this},tspan:function(t){var e=(this.textPath&&this.textPath()||this).node,i=new a.Tspan;return!1===this._build&&this.clear(),e.appendChild(i.node),i.text(t)},clear:function(){for(var t=(this.textPath&&this.textPath()||this).node;t.hasChildNodes();)t.removeChild(t.lastChild);return this},length:function(){return this.node.getComputedTextLength()}}),a.TextPath=a.invent({create:\"textPath\",inherit:a.Parent,parent:a.Text,construct:{morphArray:a.PathArray,array:function(){var t=this.track();return t?t.array():null},plot:function(t){var e=this.track(),i=null;return e&&(i=e.plot(t)),null==t?i:this},track:function(){var t=this.textPath();if(t)return t.reference(\"href\")},textPath:function(){if(this.node.firstChild&&\"textPath\"==this.node.firstChild.nodeName)return a.adopt(this.node.firstChild)}}}),a.Nested=a.invent({create:function(){this.constructor.call(this,a.create(\"svg\")),this.style(\"overflow\",\"visible\")},inherit:a.Container,construct:{nested:function(){return this.put(new a.Nested)}}});var l={stroke:[\"color\",\"width\",\"opacity\",\"linecap\",\"linejoin\",\"miterlimit\",\"dasharray\",\"dashoffset\"],fill:[\"color\",\"opacity\",\"rule\"],prefix:function(t,e){return\"color\"==e?t:t+\"-\"+e}};function h(t,e,i,s){return i+s.replace(a.regex.dots,\" .\")}function c(t){return t.toLowerCase().replace(/-(.)/g,(function(t,e){return e.toUpperCase()}))}function d(t){return t.charAt(0).toUpperCase()+t.slice(1)}function g(t){var e=t.toString(16);return 1==e.length?\"0\"+e:e}function u(t,e,i){if(null==e||null==i){var a=t.bbox();null==e?e=a.width/a.height*i:null==i&&(i=a.height/a.width*e)}return{width:e,height:i}}function f(t,e,i){return{x:e*t.a+i*t.c+0,y:e*t.b+i*t.d+0}}function p(t){return{a:t[0],b:t[1],c:t[2],d:t[3],e:t[4],f:t[5]}}function x(e){for(var i=e.childNodes.length-1;i>=0;i--)e.childNodes[i]instanceof t.SVGElement&&x(e.childNodes[i]);return a.adopt(e).id(a.eid(e.nodeName))}function b(t){return Math.abs(t)>1e-37?t:0}[\"fill\",\"stroke\"].forEach((function(t){var e={};e[t]=function(e){if(void 0===e)return this;if(\"string\"==typeof e||a.Color.isRgb(e)||e&&\"function\"==typeof e.fill)this.attr(t,e);else for(var i=l[t].length-1;i>=0;i--)null!=e[l[t][i]]&&this.attr(l.prefix(t,l[t][i]),e[l[t][i]]);return this},a.extend(a.Element,a.FX,e)})),a.extend(a.Element,a.FX,{translate:function(t,e){return this.transform({x:t,y:e})},matrix:function(t){return this.attr(\"transform\",new a.Matrix(6==arguments.length?[].slice.call(arguments):t))},opacity:function(t){return this.attr(\"opacity\",t)},dx:function(t){return this.x(new a.Number(t).plus(this instanceof a.FX?0:this.x()),!0)},dy:function(t){return this.y(new a.Number(t).plus(this instanceof a.FX?0:this.y()),!0)}}),a.extend(a.Path,{length:function(){return this.node.getTotalLength()},pointAt:function(t){return this.node.getPointAtLength(t)}}),a.Set=a.invent({create:function(t){Array.isArray(t)?this.members=t:this.clear()},extend:{add:function(){for(var t=[].slice.call(arguments),e=0,i=t.length;e<i;e++)this.members.push(t[e]);return this},remove:function(t){var e=this.index(t);return e>-1&&this.members.splice(e,1),this},each:function(t){for(var e=0,i=this.members.length;e<i;e++)t.apply(this.members[e],[e,this.members]);return this},clear:function(){return this.members=[],this},length:function(){return this.members.length},has:function(t){return this.index(t)>=0},index:function(t){return this.members.indexOf(t)},get:function(t){return this.members[t]},first:function(){return this.get(0)},last:function(){return this.get(this.members.length-1)},valueOf:function(){return this.members}},construct:{set:function(t){return new a.Set(t)}}}),a.FX.Set=a.invent({create:function(t){this.set=t}}),a.Set.inherit=function(){var t=[];for(var e in a.Shape.prototype)\"function\"==typeof a.Shape.prototype[e]&&\"function\"!=typeof a.Set.prototype[e]&&t.push(e);for(var e in t.forEach((function(t){a.Set.prototype[t]=function(){for(var e=0,i=this.members.length;e<i;e++)this.members[e]&&\"function\"==typeof this.members[e][t]&&this.members[e][t].apply(this.members[e],arguments);return\"animate\"==t?this.fx||(this.fx=new a.FX.Set(this)):this}})),t=[],a.FX.prototype)\"function\"==typeof a.FX.prototype[e]&&\"function\"!=typeof a.FX.Set.prototype[e]&&t.push(e);t.forEach((function(t){a.FX.Set.prototype[t]=function(){for(var e=0,i=this.set.members.length;e<i;e++)this.set.members[e].fx[t].apply(this.set.members[e].fx,arguments);return this}}))},a.extend(a.Element,{}),a.extend(a.Element,{remember:function(t,e){if(\"object\"===i(arguments[0]))for(var a in t)this.remember(a,t[a]);else{if(1==arguments.length)return this.memory()[t];this.memory()[t]=e}return this},forget:function(){if(0==arguments.length)this._memory={};else for(var t=arguments.length-1;t>=0;t--)delete this.memory()[arguments[t]];return this},memory:function(){return this._memory||(this._memory={})}}),a.get=function(t){var i=e.getElementById(function(t){var e=(t||\"\").toString().match(a.regex.reference);if(e)return e[1]}(t)||t);return a.adopt(i)},a.select=function(t,i){return new a.Set(a.utils.map((i||e).querySelectorAll(t),(function(t){return a.adopt(t)})))},a.extend(a.Parent,{select:function(t){return a.select(t,this.node)}});var v=\"abcdef\".split(\"\");if(\"function\"!=typeof t.CustomEvent){var m=function(t,i){i=i||{bubbles:!1,cancelable:!1,detail:void 0};var a=e.createEvent(\"CustomEvent\");return a.initCustomEvent(t,i.bubbles,i.cancelable,i.detail),a};m.prototype=t.Event.prototype,a.CustomEvent=m}else a.CustomEvent=t.CustomEvent;return a},\"function\"==typeof define&&define.amd?define((function(){return Et(Xt,Xt.document)})):\"object\"===(\"undefined\"==typeof exports?\"undefined\":i(exports))&&\"undefined\"!=typeof module?module.exports=Xt.document?Et(Xt,Xt.document):function(t){return Et(t,t.document)}:Xt.SVG=Et(Xt,Xt.document),\n/*! svg.filter.js - v2.0.2 - 2016-02-24\n  * https://github.com/wout/svg.filter.js\n  * Copyright (c) 2016 Wout Fierens; Licensed MIT */\nfunction(){SVG.Filter=SVG.invent({create:\"filter\",inherit:SVG.Parent,extend:{source:\"SourceGraphic\",sourceAlpha:\"SourceAlpha\",background:\"BackgroundImage\",backgroundAlpha:\"BackgroundAlpha\",fill:\"FillPaint\",stroke:\"StrokePaint\",autoSetIn:!0,put:function(t,e){return this.add(t,e),!t.attr(\"in\")&&this.autoSetIn&&t.attr(\"in\",this.source),t.attr(\"result\")||t.attr(\"result\",t),t},blend:function(t,e,i){return this.put(new SVG.BlendEffect(t,e,i))},colorMatrix:function(t,e){return this.put(new SVG.ColorMatrixEffect(t,e))},convolveMatrix:function(t){return this.put(new SVG.ConvolveMatrixEffect(t))},componentTransfer:function(t){return this.put(new SVG.ComponentTransferEffect(t))},composite:function(t,e,i){return this.put(new SVG.CompositeEffect(t,e,i))},flood:function(t,e){return this.put(new SVG.FloodEffect(t,e))},offset:function(t,e){return this.put(new SVG.OffsetEffect(t,e))},image:function(t){return this.put(new SVG.ImageEffect(t))},merge:function(){var t=[void 0];for(var e in arguments)t.push(arguments[e]);return this.put(new(SVG.MergeEffect.bind.apply(SVG.MergeEffect,t)))},gaussianBlur:function(t,e){return this.put(new SVG.GaussianBlurEffect(t,e))},morphology:function(t,e){return this.put(new SVG.MorphologyEffect(t,e))},diffuseLighting:function(t,e,i){return this.put(new SVG.DiffuseLightingEffect(t,e,i))},displacementMap:function(t,e,i,a,s){return this.put(new SVG.DisplacementMapEffect(t,e,i,a,s))},specularLighting:function(t,e,i,a){return this.put(new SVG.SpecularLightingEffect(t,e,i,a))},tile:function(){return this.put(new SVG.TileEffect)},turbulence:function(t,e,i,a,s){return this.put(new SVG.TurbulenceEffect(t,e,i,a,s))},toString:function(){return\"url(#\"+this.attr(\"id\")+\")\"}}}),SVG.extend(SVG.Defs,{filter:function(t){var e=this.put(new SVG.Filter);return\"function\"==typeof t&&t.call(e,e),e}}),SVG.extend(SVG.Container,{filter:function(t){return this.defs().filter(t)}}),SVG.extend(SVG.Element,SVG.G,SVG.Nested,{filter:function(t){return this.filterer=t instanceof SVG.Element?t:this.doc().filter(t),this.doc()&&this.filterer.doc()!==this.doc()&&this.doc().defs().add(this.filterer),this.attr(\"filter\",this.filterer),this.filterer},unfilter:function(t){return this.filterer&&!0===t&&this.filterer.remove(),delete this.filterer,this.attr(\"filter\",null)}}),SVG.Effect=SVG.invent({create:function(){this.constructor.call(this)},inherit:SVG.Element,extend:{in:function(t){return null==t?this.parent()&&this.parent().select('[result=\"'+this.attr(\"in\")+'\"]').get(0)||this.attr(\"in\"):this.attr(\"in\",t)},result:function(t){return null==t?this.attr(\"result\"):this.attr(\"result\",t)},toString:function(){return this.result()}}}),SVG.ParentEffect=SVG.invent({create:function(){this.constructor.call(this)},inherit:SVG.Parent,extend:{in:function(t){return null==t?this.parent()&&this.parent().select('[result=\"'+this.attr(\"in\")+'\"]').get(0)||this.attr(\"in\"):this.attr(\"in\",t)},result:function(t){return null==t?this.attr(\"result\"):this.attr(\"result\",t)},toString:function(){return this.result()}}});var t={blend:function(t,e){return this.parent()&&this.parent().blend(this,t,e)},colorMatrix:function(t,e){return this.parent()&&this.parent().colorMatrix(t,e).in(this)},convolveMatrix:function(t){return this.parent()&&this.parent().convolveMatrix(t).in(this)},componentTransfer:function(t){return this.parent()&&this.parent().componentTransfer(t).in(this)},composite:function(t,e){return this.parent()&&this.parent().composite(this,t,e)},flood:function(t,e){return this.parent()&&this.parent().flood(t,e)},offset:function(t,e){return this.parent()&&this.parent().offset(t,e).in(this)},image:function(t){return this.parent()&&this.parent().image(t)},merge:function(){return this.parent()&&this.parent().merge.apply(this.parent(),[this].concat(arguments))},gaussianBlur:function(t,e){return this.parent()&&this.parent().gaussianBlur(t,e).in(this)},morphology:function(t,e){return this.parent()&&this.parent().morphology(t,e).in(this)},diffuseLighting:function(t,e,i){return this.parent()&&this.parent().diffuseLighting(t,e,i).in(this)},displacementMap:function(t,e,i,a){return this.parent()&&this.parent().displacementMap(this,t,e,i,a)},specularLighting:function(t,e,i,a){return this.parent()&&this.parent().specularLighting(t,e,i,a).in(this)},tile:function(){return this.parent()&&this.parent().tile().in(this)},turbulence:function(t,e,i,a,s){return this.parent()&&this.parent().turbulence(t,e,i,a,s).in(this)}};SVG.extend(SVG.Effect,t),SVG.extend(SVG.ParentEffect,t),SVG.ChildEffect=SVG.invent({create:function(){this.constructor.call(this)},inherit:SVG.Element,extend:{in:function(t){this.attr(\"in\",t)}}});var e={blend:function(t,e,i){this.attr({in:t,in2:e,mode:i||\"normal\"})},colorMatrix:function(t,e){\"matrix\"==t&&(e=s(e)),this.attr({type:t,values:void 0===e?null:e})},convolveMatrix:function(t){t=s(t),this.attr({order:Math.sqrt(t.split(\" \").length),kernelMatrix:t})},composite:function(t,e,i){this.attr({in:t,in2:e,operator:i})},flood:function(t,e){this.attr(\"flood-color\",t),null!=e&&this.attr(\"flood-opacity\",e)},offset:function(t,e){this.attr({dx:t,dy:e})},image:function(t){this.attr(\"href\",t,SVG.xlink)},displacementMap:function(t,e,i,a,s){this.attr({in:t,in2:e,scale:i,xChannelSelector:a,yChannelSelector:s})},gaussianBlur:function(t,e){null!=t||null!=e?this.attr(\"stdDeviation\",function(t){if(!Array.isArray(t))return t;for(var e=0,i=t.length,a=[];e<i;e++)a.push(t[e]);return a.join(\" \")}(Array.prototype.slice.call(arguments))):this.attr(\"stdDeviation\",\"0 0\")},morphology:function(t,e){this.attr({operator:t,radius:e})},tile:function(){},turbulence:function(t,e,i,a,s){this.attr({numOctaves:e,seed:i,stitchTiles:a,baseFrequency:t,type:s})}},i={merge:function(){var t;if(arguments[0]instanceof SVG.Set){var e=this;arguments[0].each((function(t){this instanceof SVG.MergeNode?e.put(this):(this instanceof SVG.Effect||this instanceof SVG.ParentEffect)&&e.put(new SVG.MergeNode(this))}))}else{t=Array.isArray(arguments[0])?arguments[0]:arguments;for(var i=0;i<t.length;i++)t[i]instanceof SVG.MergeNode?this.put(t[i]):this.put(new SVG.MergeNode(t[i]))}},componentTransfer:function(t){if(this.rgb=new SVG.Set,[\"r\",\"g\",\"b\",\"a\"].forEach(function(t){this[t]=new(SVG[\"Func\"+t.toUpperCase()])(\"identity\"),this.rgb.add(this[t]),this.node.appendChild(this[t].node)}.bind(this)),t)for(var e in t.rgb&&([\"r\",\"g\",\"b\"].forEach(function(e){this[e].attr(t.rgb)}.bind(this)),delete t.rgb),t)this[e].attr(t[e])},diffuseLighting:function(t,e,i){this.attr({surfaceScale:t,diffuseConstant:e,kernelUnitLength:i})},specularLighting:function(t,e,i,a){this.attr({surfaceScale:t,diffuseConstant:e,specularExponent:i,kernelUnitLength:a})}},a={distantLight:function(t,e){this.attr({azimuth:t,elevation:e})},pointLight:function(t,e,i){this.attr({x:t,y:e,z:i})},spotLight:function(t,e,i,a,s,r){this.attr({x:t,y:e,z:i,pointsAtX:a,pointsAtY:s,pointsAtZ:r})},mergeNode:function(t){this.attr(\"in\",t)}};function s(t){return Array.isArray(t)&&(t=new SVG.Array(t)),t.toString().replace(/^\\s+/,\"\").replace(/\\s+$/,\"\").replace(/\\s+/g,\" \")}function r(){var t=function(){};for(var e in\"function\"==typeof arguments[arguments.length-1]&&(t=arguments[arguments.length-1],Array.prototype.splice.call(arguments,arguments.length-1,1)),arguments)for(var i in arguments[e])t(arguments[e][i],i,arguments[e])}[\"r\",\"g\",\"b\",\"a\"].forEach((function(t){a[\"Func\"+t.toUpperCase()]=function(t){switch(this.attr(\"type\",t),t){case\"table\":this.attr(\"tableValues\",arguments[1]);break;case\"linear\":this.attr(\"slope\",arguments[1]),this.attr(\"intercept\",arguments[2]);break;case\"gamma\":this.attr(\"amplitude\",arguments[1]),this.attr(\"exponent\",arguments[2]),this.attr(\"offset\",arguments[2])}}})),r(e,(function(t,e){var i=e.charAt(0).toUpperCase()+e.slice(1);SVG[i+\"Effect\"]=SVG.invent({create:function(){this.constructor.call(this,SVG.create(\"fe\"+i)),t.apply(this,arguments),this.result(this.attr(\"id\")+\"Out\")},inherit:SVG.Effect,extend:{}})})),r(i,(function(t,e){var i=e.charAt(0).toUpperCase()+e.slice(1);SVG[i+\"Effect\"]=SVG.invent({create:function(){this.constructor.call(this,SVG.create(\"fe\"+i)),t.apply(this,arguments),this.result(this.attr(\"id\")+\"Out\")},inherit:SVG.ParentEffect,extend:{}})})),r(a,(function(t,e){var i=e.charAt(0).toUpperCase()+e.slice(1);SVG[i]=SVG.invent({create:function(){this.constructor.call(this,SVG.create(\"fe\"+i)),t.apply(this,arguments)},inherit:SVG.ChildEffect,extend:{}})})),SVG.extend(SVG.MergeEffect,{in:function(t){return t instanceof SVG.MergeNode?this.add(t,0):this.add(new SVG.MergeNode(t),0),this}}),SVG.extend(SVG.CompositeEffect,SVG.BlendEffect,SVG.DisplacementMapEffect,{in2:function(t){return null==t?this.parent()&&this.parent().select('[result=\"'+this.attr(\"in2\")+'\"]').get(0)||this.attr(\"in2\"):this.attr(\"in2\",t)}}),SVG.filter={sepiatone:[.343,.669,.119,0,0,.249,.626,.13,0,0,.172,.334,.111,0,0,0,0,0,1,0]}}.call(void 0),function(){function t(t,s,r,o,n,l,h){for(var c=t.slice(s,r||h),d=o.slice(n,l||h),g=0,u={pos:[0,0],start:[0,0]},f={pos:[0,0],start:[0,0]};;){if(c[g]=e.call(u,c[g]),d[g]=e.call(f,d[g]),c[g][0]!=d[g][0]||\"M\"==c[g][0]||\"A\"==c[g][0]&&(c[g][4]!=d[g][4]||c[g][5]!=d[g][5])?(Array.prototype.splice.apply(c,[g,1].concat(a.call(u,c[g]))),Array.prototype.splice.apply(d,[g,1].concat(a.call(f,d[g])))):(c[g]=i.call(u,c[g]),d[g]=i.call(f,d[g])),++g==c.length&&g==d.length)break;g==c.length&&c.push([\"C\",u.pos[0],u.pos[1],u.pos[0],u.pos[1],u.pos[0],u.pos[1]]),g==d.length&&d.push([\"C\",f.pos[0],f.pos[1],f.pos[0],f.pos[1],f.pos[0],f.pos[1]])}return{start:c,dest:d}}function e(t){switch(t[0]){case\"z\":case\"Z\":t[0]=\"L\",t[1]=this.start[0],t[2]=this.start[1];break;case\"H\":t[0]=\"L\",t[2]=this.pos[1];break;case\"V\":t[0]=\"L\",t[2]=t[1],t[1]=this.pos[0];break;case\"T\":t[0]=\"Q\",t[3]=t[1],t[4]=t[2],t[1]=this.reflection[1],t[2]=this.reflection[0];break;case\"S\":t[0]=\"C\",t[6]=t[4],t[5]=t[3],t[4]=t[2],t[3]=t[1],t[2]=this.reflection[1],t[1]=this.reflection[0]}return t}function i(t){var e=t.length;return this.pos=[t[e-2],t[e-1]],-1!=\"SCQT\".indexOf(t[0])&&(this.reflection=[2*this.pos[0]-t[e-4],2*this.pos[1]-t[e-3]]),t}function a(t){var e=[t];switch(t[0]){case\"M\":return this.pos=this.start=[t[1],t[2]],e;case\"L\":t[5]=t[3]=t[1],t[6]=t[4]=t[2],t[1]=this.pos[0],t[2]=this.pos[1];break;case\"Q\":t[6]=t[4],t[5]=t[3],t[4]=1*t[4]/3+2*t[2]/3,t[3]=1*t[3]/3+2*t[1]/3,t[2]=1*this.pos[1]/3+2*t[2]/3,t[1]=1*this.pos[0]/3+2*t[1]/3;break;case\"A\":e=function(t,e){var i,a,s,r,o,n,l,h,c,d,g,u,f,p,x,b,v,m,y,w,k,A,S,C,L,P,I=Math.abs(e[1]),T=Math.abs(e[2]),M=e[3]%360,z=e[4],X=e[5],E=e[6],Y=e[7],F=new SVG.Point(t),R=new SVG.Point(E,Y),D=[];if(0===I||0===T||F.x===R.x&&F.y===R.y)return[[\"C\",F.x,F.y,R.x,R.y,R.x,R.y]];i=new SVG.Point((F.x-R.x)/2,(F.y-R.y)/2).transform((new SVG.Matrix).rotate(M)),(a=i.x*i.x/(I*I)+i.y*i.y/(T*T))>1&&(I*=a=Math.sqrt(a),T*=a);s=(new SVG.Matrix).rotate(M).scale(1/I,1/T).rotate(-M),F=F.transform(s),R=R.transform(s),r=[R.x-F.x,R.y-F.y],n=r[0]*r[0]+r[1]*r[1],o=Math.sqrt(n),r[0]/=o,r[1]/=o,l=n<4?Math.sqrt(1-n/4):0,z===X&&(l*=-1);h=new SVG.Point((R.x+F.x)/2+l*-r[1],(R.y+F.y)/2+l*r[0]),c=new SVG.Point(F.x-h.x,F.y-h.y),d=new SVG.Point(R.x-h.x,R.y-h.y),g=Math.acos(c.x/Math.sqrt(c.x*c.x+c.y*c.y)),c.y<0&&(g*=-1);u=Math.acos(d.x/Math.sqrt(d.x*d.x+d.y*d.y)),d.y<0&&(u*=-1);X&&g>u&&(u+=2*Math.PI);!X&&g<u&&(u-=2*Math.PI);for(p=Math.ceil(2*Math.abs(g-u)/Math.PI),b=[],v=g,f=(u-g)/p,x=4*Math.tan(f/4)/3,k=0;k<=p;k++)y=Math.cos(v),m=Math.sin(v),w=new SVG.Point(h.x+y,h.y+m),b[k]=[new SVG.Point(w.x+x*m,w.y-x*y),w,new SVG.Point(w.x-x*m,w.y+x*y)],v+=f;for(b[0][0]=b[0][1].clone(),b[b.length-1][2]=b[b.length-1][1].clone(),s=(new SVG.Matrix).rotate(M).scale(I,T).rotate(-M),k=0,A=b.length;k<A;k++)b[k][0]=b[k][0].transform(s),b[k][1]=b[k][1].transform(s),b[k][2]=b[k][2].transform(s);for(k=1,A=b.length;k<A;k++)S=(w=b[k-1][2]).x,C=w.y,L=(w=b[k][0]).x,P=w.y,E=(w=b[k][1]).x,Y=w.y,D.push([\"C\",S,C,L,P,E,Y]);return D}(this.pos,t),t=e[0]}return t[0]=\"C\",this.pos=[t[5],t[6]],this.reflection=[2*t[5]-t[3],2*t[6]-t[4]],e}function s(t,e){if(!1===e)return!1;for(var i=e,a=t.length;i<a;++i)if(\"M\"==t[i][0])return i;return!1}SVG.extend(SVG.PathArray,{morph:function(e){for(var i=this.value,a=this.parse(e),r=0,o=0,n=!1,l=!1;!1!==r||!1!==o;){var h;n=s(i,!1!==r&&r+1),l=s(a,!1!==o&&o+1),!1===r&&(r=0==(h=new SVG.PathArray(c.start).bbox()).height||0==h.width?i.push(i[0])-1:i.push([\"M\",h.x+h.width/2,h.y+h.height/2])-1),!1===o&&(o=0==(h=new SVG.PathArray(c.dest).bbox()).height||0==h.width?a.push(a[0])-1:a.push([\"M\",h.x+h.width/2,h.y+h.height/2])-1);var c=t(i,r,n,a,o,l);i=i.slice(0,r).concat(c.start,!1===n?[]:i.slice(n)),a=a.slice(0,o).concat(c.dest,!1===l?[]:a.slice(l)),r=!1!==n&&r+c.start.length,o=!1!==l&&o+c.dest.length}return this.value=i,this.destination=new SVG.PathArray,this.destination.value=a,this}})}(),\n/*! svg.draggable.js - v2.2.2 - 2019-01-08\n  * https://github.com/svgdotjs/svg.draggable.js\n  * Copyright (c) 2019 Wout Fierens; Licensed MIT */\nfunction(){function t(t){t.remember(\"_draggable\",this),this.el=t}t.prototype.init=function(t,e){var i=this;this.constraint=t,this.value=e,this.el.on(\"mousedown.drag\",(function(t){i.start(t)})),this.el.on(\"touchstart.drag\",(function(t){i.start(t)}))},t.prototype.transformPoint=function(t,e){var i=(t=t||window.event).changedTouches&&t.changedTouches[0]||t;return this.p.x=i.clientX-(e||0),this.p.y=i.clientY,this.p.matrixTransform(this.m)},t.prototype.getBBox=function(){var t=this.el.bbox();return this.el instanceof SVG.Nested&&(t=this.el.rbox()),(this.el instanceof SVG.G||this.el instanceof SVG.Use||this.el instanceof SVG.Nested)&&(t.x=this.el.x(),t.y=this.el.y()),t},t.prototype.start=function(t){if(\"click\"!=t.type&&\"mousedown\"!=t.type&&\"mousemove\"!=t.type||1==(t.which||t.buttons)){var e=this;if(this.el.fire(\"beforedrag\",{event:t,handler:this}),!this.el.event().defaultPrevented){t.preventDefault(),t.stopPropagation(),this.parent=this.parent||this.el.parent(SVG.Nested)||this.el.parent(SVG.Doc),this.p=this.parent.node.createSVGPoint(),this.m=this.el.node.getScreenCTM().inverse();var i,a=this.getBBox();if(this.el instanceof SVG.Text)switch(i=this.el.node.getComputedTextLength(),this.el.attr(\"text-anchor\")){case\"middle\":i/=2;break;case\"start\":i=0}this.startPoints={point:this.transformPoint(t,i),box:a,transform:this.el.transform()},SVG.on(window,\"mousemove.drag\",(function(t){e.drag(t)})),SVG.on(window,\"touchmove.drag\",(function(t){e.drag(t)})),SVG.on(window,\"mouseup.drag\",(function(t){e.end(t)})),SVG.on(window,\"touchend.drag\",(function(t){e.end(t)})),this.el.fire(\"dragstart\",{event:t,p:this.startPoints.point,m:this.m,handler:this})}}},t.prototype.drag=function(t){var e=this.getBBox(),i=this.transformPoint(t),a=this.startPoints.box.x+i.x-this.startPoints.point.x,s=this.startPoints.box.y+i.y-this.startPoints.point.y,r=this.constraint,o=i.x-this.startPoints.point.x,n=i.y-this.startPoints.point.y;if(this.el.fire(\"dragmove\",{event:t,p:i,m:this.m,handler:this}),this.el.event().defaultPrevented)return i;if(\"function\"==typeof r){var l=r.call(this.el,a,s,this.m);\"boolean\"==typeof l&&(l={x:l,y:l}),!0===l.x?this.el.x(a):!1!==l.x&&this.el.x(l.x),!0===l.y?this.el.y(s):!1!==l.y&&this.el.y(l.y)}else\"object\"==typeof r&&(null!=r.minX&&a<r.minX?o=(a=r.minX)-this.startPoints.box.x:null!=r.maxX&&a>r.maxX-e.width&&(o=(a=r.maxX-e.width)-this.startPoints.box.x),null!=r.minY&&s<r.minY?n=(s=r.minY)-this.startPoints.box.y:null!=r.maxY&&s>r.maxY-e.height&&(n=(s=r.maxY-e.height)-this.startPoints.box.y),null!=r.snapToGrid&&(a-=a%r.snapToGrid,s-=s%r.snapToGrid,o-=o%r.snapToGrid,n-=n%r.snapToGrid),this.el instanceof SVG.G?this.el.matrix(this.startPoints.transform).transform({x:o,y:n},!0):this.el.move(a,s));return i},t.prototype.end=function(t){var e=this.drag(t);this.el.fire(\"dragend\",{event:t,p:e,m:this.m,handler:this}),SVG.off(window,\"mousemove.drag\"),SVG.off(window,\"touchmove.drag\"),SVG.off(window,\"mouseup.drag\"),SVG.off(window,\"touchend.drag\")},SVG.extend(SVG.Element,{draggable:function(e,i){\"function\"!=typeof e&&\"object\"!=typeof e||(i=e,e=!0);var a=this.remember(\"_draggable\")||new t(this);return(e=void 0===e||e)?a.init(i||{},e):(this.off(\"mousedown.drag\"),this.off(\"touchstart.drag\")),this}})}.call(void 0),function(){function t(t){this.el=t,t.remember(\"_selectHandler\",this),this.pointSelection={isSelected:!1},this.rectSelection={isSelected:!1},this.pointsList={lt:[0,0],rt:[\"width\",0],rb:[\"width\",\"height\"],lb:[0,\"height\"],t:[\"width\",0],r:[\"width\",\"height\"],b:[\"width\",\"height\"],l:[0,\"height\"]},this.pointCoord=function(t,e,i){var a=\"string\"!=typeof t?t:e[t];return i?a/2:a},this.pointCoords=function(t,e){var i=this.pointsList[t];return{x:this.pointCoord(i[0],e,\"t\"===t||\"b\"===t),y:this.pointCoord(i[1],e,\"r\"===t||\"l\"===t)}}}t.prototype.init=function(t,e){var i=this.el.bbox();this.options={};var a=this.el.selectize.defaults.points;for(var s in this.el.selectize.defaults)this.options[s]=this.el.selectize.defaults[s],void 0!==e[s]&&(this.options[s]=e[s]);var r=[\"points\",\"pointsExclude\"];for(var s in r){var o=this.options[r[s]];\"string\"==typeof o?o=o.length>0?o.split(/\\s*,\\s*/i):[]:\"boolean\"==typeof o&&\"points\"===r[s]&&(o=o?a:[]),this.options[r[s]]=o}this.options.points=[a,this.options.points].reduce((function(t,e){return t.filter((function(t){return e.indexOf(t)>-1}))})),this.options.points=[this.options.points,this.options.pointsExclude].reduce((function(t,e){return t.filter((function(t){return e.indexOf(t)<0}))})),this.parent=this.el.parent(),this.nested=this.nested||this.parent.group(),this.nested.matrix(new SVG.Matrix(this.el).translate(i.x,i.y)),this.options.deepSelect&&-1!==[\"line\",\"polyline\",\"polygon\"].indexOf(this.el.type)?this.selectPoints(t):this.selectRect(t),this.observe(),this.cleanup()},t.prototype.selectPoints=function(t){return this.pointSelection.isSelected=t,this.pointSelection.set||(this.pointSelection.set=this.parent.set(),this.drawPoints()),this},t.prototype.getPointArray=function(){var t=this.el.bbox();return this.el.array().valueOf().map((function(e){return[e[0]-t.x,e[1]-t.y]}))},t.prototype.drawPoints=function(){for(var t=this,e=this.getPointArray(),i=0,a=e.length;i<a;++i){var s=function(e){return function(i){(i=i||window.event).preventDefault?i.preventDefault():i.returnValue=!1,i.stopPropagation();var a=i.pageX||i.touches[0].pageX,s=i.pageY||i.touches[0].pageY;t.el.fire(\"point\",{x:a,y:s,i:e,event:i})}}(i),r=this.drawPoint(e[i][0],e[i][1]).addClass(this.options.classPoints).addClass(this.options.classPoints+\"_point\").on(\"touchstart\",s).on(\"mousedown\",s);this.pointSelection.set.add(r)}},t.prototype.drawPoint=function(t,e){var i=this.options.pointType;switch(i){case\"circle\":return this.drawCircle(t,e);case\"rect\":return this.drawRect(t,e);default:if(\"function\"==typeof i)return i.call(this,t,e);throw new Error(\"Unknown \"+i+\" point type!\")}},t.prototype.drawCircle=function(t,e){return this.nested.circle(this.options.pointSize).center(t,e)},t.prototype.drawRect=function(t,e){return this.nested.rect(this.options.pointSize,this.options.pointSize).center(t,e)},t.prototype.updatePointSelection=function(){var t=this.getPointArray();this.pointSelection.set.each((function(e){this.cx()===t[e][0]&&this.cy()===t[e][1]||this.center(t[e][0],t[e][1])}))},t.prototype.updateRectSelection=function(){var t=this,e=this.el.bbox();if(this.rectSelection.set.get(0).attr({width:e.width,height:e.height}),this.options.points.length&&this.options.points.map((function(i,a){var s=t.pointCoords(i,e);t.rectSelection.set.get(a+1).center(s.x,s.y)})),this.options.rotationPoint){var i=this.rectSelection.set.length();this.rectSelection.set.get(i-1).center(e.width/2,20)}},t.prototype.selectRect=function(t){var e=this,i=this.el.bbox();function a(t){return function(i){(i=i||window.event).preventDefault?i.preventDefault():i.returnValue=!1,i.stopPropagation();var a=i.pageX||i.touches[0].pageX,s=i.pageY||i.touches[0].pageY;e.el.fire(t,{x:a,y:s,event:i})}}if(this.rectSelection.isSelected=t,this.rectSelection.set=this.rectSelection.set||this.parent.set(),this.rectSelection.set.get(0)||this.rectSelection.set.add(this.nested.rect(i.width,i.height).addClass(this.options.classRect)),this.options.points.length&&this.rectSelection.set.length()<2){this.options.points.map((function(t,s){var r=e.pointCoords(t,i),o=e.drawPoint(r.x,r.y).attr(\"class\",e.options.classPoints+\"_\"+t).on(\"mousedown\",a(t)).on(\"touchstart\",a(t));e.rectSelection.set.add(o)})),this.rectSelection.set.each((function(){this.addClass(e.options.classPoints)}))}if(this.options.rotationPoint&&(this.options.points&&!this.rectSelection.set.get(9)||!this.options.points&&!this.rectSelection.set.get(1))){var s=function(t){(t=t||window.event).preventDefault?t.preventDefault():t.returnValue=!1,t.stopPropagation();var i=t.pageX||t.touches[0].pageX,a=t.pageY||t.touches[0].pageY;e.el.fire(\"rot\",{x:i,y:a,event:t})},r=this.drawPoint(i.width/2,20).attr(\"class\",this.options.classPoints+\"_rot\").on(\"touchstart\",s).on(\"mousedown\",s);this.rectSelection.set.add(r)}},t.prototype.handler=function(){var t=this.el.bbox();this.nested.matrix(new SVG.Matrix(this.el).translate(t.x,t.y)),this.rectSelection.isSelected&&this.updateRectSelection(),this.pointSelection.isSelected&&this.updatePointSelection()},t.prototype.observe=function(){var t=this;if(MutationObserver)if(this.rectSelection.isSelected||this.pointSelection.isSelected)this.observerInst=this.observerInst||new MutationObserver((function(){t.handler()})),this.observerInst.observe(this.el.node,{attributes:!0});else try{this.observerInst.disconnect(),delete this.observerInst}catch(t){}else this.el.off(\"DOMAttrModified.select\"),(this.rectSelection.isSelected||this.pointSelection.isSelected)&&this.el.on(\"DOMAttrModified.select\",(function(){t.handler()}))},t.prototype.cleanup=function(){!this.rectSelection.isSelected&&this.rectSelection.set&&(this.rectSelection.set.each((function(){this.remove()})),this.rectSelection.set.clear(),delete this.rectSelection.set),!this.pointSelection.isSelected&&this.pointSelection.set&&(this.pointSelection.set.each((function(){this.remove()})),this.pointSelection.set.clear(),delete this.pointSelection.set),this.pointSelection.isSelected||this.rectSelection.isSelected||(this.nested.remove(),delete this.nested)},SVG.extend(SVG.Element,{selectize:function(e,i){return\"object\"==typeof e&&(i=e,e=!0),(this.remember(\"_selectHandler\")||new t(this)).init(void 0===e||e,i||{}),this}}),SVG.Element.prototype.selectize.defaults={points:[\"lt\",\"rt\",\"rb\",\"lb\",\"t\",\"r\",\"b\",\"l\"],pointsExclude:[],classRect:\"svg_select_boundingRect\",classPoints:\"svg_select_points\",pointSize:7,rotationPoint:!0,deepSelect:!1,pointType:\"circle\"}}(),function(){(function(){function t(t){t.remember(\"_resizeHandler\",this),this.el=t,this.parameters={},this.lastUpdateCall=null,this.p=t.doc().node.createSVGPoint()}t.prototype.transformPoint=function(t,e,i){return this.p.x=t-(this.offset.x-window.pageXOffset),this.p.y=e-(this.offset.y-window.pageYOffset),this.p.matrixTransform(i||this.m)},t.prototype._extractPosition=function(t){return{x:null!=t.clientX?t.clientX:t.touches[0].clientX,y:null!=t.clientY?t.clientY:t.touches[0].clientY}},t.prototype.init=function(t){var e=this;if(this.stop(),\"stop\"!==t){for(var i in this.options={},this.el.resize.defaults)this.options[i]=this.el.resize.defaults[i],void 0!==t[i]&&(this.options[i]=t[i]);this.el.on(\"lt.resize\",(function(t){e.resize(t||window.event)})),this.el.on(\"rt.resize\",(function(t){e.resize(t||window.event)})),this.el.on(\"rb.resize\",(function(t){e.resize(t||window.event)})),this.el.on(\"lb.resize\",(function(t){e.resize(t||window.event)})),this.el.on(\"t.resize\",(function(t){e.resize(t||window.event)})),this.el.on(\"r.resize\",(function(t){e.resize(t||window.event)})),this.el.on(\"b.resize\",(function(t){e.resize(t||window.event)})),this.el.on(\"l.resize\",(function(t){e.resize(t||window.event)})),this.el.on(\"rot.resize\",(function(t){e.resize(t||window.event)})),this.el.on(\"point.resize\",(function(t){e.resize(t||window.event)})),this.update()}},t.prototype.stop=function(){return this.el.off(\"lt.resize\"),this.el.off(\"rt.resize\"),this.el.off(\"rb.resize\"),this.el.off(\"lb.resize\"),this.el.off(\"t.resize\"),this.el.off(\"r.resize\"),this.el.off(\"b.resize\"),this.el.off(\"l.resize\"),this.el.off(\"rot.resize\"),this.el.off(\"point.resize\"),this},t.prototype.resize=function(t){var e=this;this.m=this.el.node.getScreenCTM().inverse(),this.offset={x:window.pageXOffset,y:window.pageYOffset};var i=this._extractPosition(t.detail.event);if(this.parameters={type:this.el.type,p:this.transformPoint(i.x,i.y),x:t.detail.x,y:t.detail.y,box:this.el.bbox(),rotation:this.el.transform().rotation},\"text\"===this.el.type&&(this.parameters.fontSize=this.el.attr()[\"font-size\"]),void 0!==t.detail.i){var a=this.el.array().valueOf();this.parameters.i=t.detail.i,this.parameters.pointCoords=[a[t.detail.i][0],a[t.detail.i][1]]}switch(t.type){case\"lt\":this.calc=function(t,e){var i=this.snapToGrid(t,e);if(this.parameters.box.width-i[0]>0&&this.parameters.box.height-i[1]>0){if(\"text\"===this.parameters.type)return this.el.move(this.parameters.box.x+i[0],this.parameters.box.y),void this.el.attr(\"font-size\",this.parameters.fontSize-i[0]);i=this.checkAspectRatio(i),this.el.move(this.parameters.box.x+i[0],this.parameters.box.y+i[1]).size(this.parameters.box.width-i[0],this.parameters.box.height-i[1])}};break;case\"rt\":this.calc=function(t,e){var i=this.snapToGrid(t,e,2);if(this.parameters.box.width+i[0]>0&&this.parameters.box.height-i[1]>0){if(\"text\"===this.parameters.type)return this.el.move(this.parameters.box.x-i[0],this.parameters.box.y),void this.el.attr(\"font-size\",this.parameters.fontSize+i[0]);i=this.checkAspectRatio(i,!0),this.el.move(this.parameters.box.x,this.parameters.box.y+i[1]).size(this.parameters.box.width+i[0],this.parameters.box.height-i[1])}};break;case\"rb\":this.calc=function(t,e){var i=this.snapToGrid(t,e,0);if(this.parameters.box.width+i[0]>0&&this.parameters.box.height+i[1]>0){if(\"text\"===this.parameters.type)return this.el.move(this.parameters.box.x-i[0],this.parameters.box.y),void this.el.attr(\"font-size\",this.parameters.fontSize+i[0]);i=this.checkAspectRatio(i),this.el.move(this.parameters.box.x,this.parameters.box.y).size(this.parameters.box.width+i[0],this.parameters.box.height+i[1])}};break;case\"lb\":this.calc=function(t,e){var i=this.snapToGrid(t,e,1);if(this.parameters.box.width-i[0]>0&&this.parameters.box.height+i[1]>0){if(\"text\"===this.parameters.type)return this.el.move(this.parameters.box.x+i[0],this.parameters.box.y),void this.el.attr(\"font-size\",this.parameters.fontSize-i[0]);i=this.checkAspectRatio(i,!0),this.el.move(this.parameters.box.x+i[0],this.parameters.box.y).size(this.parameters.box.width-i[0],this.parameters.box.height+i[1])}};break;case\"t\":this.calc=function(t,e){var i=this.snapToGrid(t,e,2);if(this.parameters.box.height-i[1]>0){if(\"text\"===this.parameters.type)return;this.el.move(this.parameters.box.x,this.parameters.box.y+i[1]).height(this.parameters.box.height-i[1])}};break;case\"r\":this.calc=function(t,e){var i=this.snapToGrid(t,e,0);if(this.parameters.box.width+i[0]>0){if(\"text\"===this.parameters.type)return;this.el.move(this.parameters.box.x,this.parameters.box.y).width(this.parameters.box.width+i[0])}};break;case\"b\":this.calc=function(t,e){var i=this.snapToGrid(t,e,0);if(this.parameters.box.height+i[1]>0){if(\"text\"===this.parameters.type)return;this.el.move(this.parameters.box.x,this.parameters.box.y).height(this.parameters.box.height+i[1])}};break;case\"l\":this.calc=function(t,e){var i=this.snapToGrid(t,e,1);if(this.parameters.box.width-i[0]>0){if(\"text\"===this.parameters.type)return;this.el.move(this.parameters.box.x+i[0],this.parameters.box.y).width(this.parameters.box.width-i[0])}};break;case\"rot\":this.calc=function(t,e){var i=t+this.parameters.p.x,a=e+this.parameters.p.y,s=Math.atan2(this.parameters.p.y-this.parameters.box.y-this.parameters.box.height/2,this.parameters.p.x-this.parameters.box.x-this.parameters.box.width/2),r=Math.atan2(a-this.parameters.box.y-this.parameters.box.height/2,i-this.parameters.box.x-this.parameters.box.width/2),o=this.parameters.rotation+180*(r-s)/Math.PI+this.options.snapToAngle/2;this.el.center(this.parameters.box.cx,this.parameters.box.cy).rotate(o-o%this.options.snapToAngle,this.parameters.box.cx,this.parameters.box.cy)};break;case\"point\":this.calc=function(t,e){var i=this.snapToGrid(t,e,this.parameters.pointCoords[0],this.parameters.pointCoords[1]),a=this.el.array().valueOf();a[this.parameters.i][0]=this.parameters.pointCoords[0]+i[0],a[this.parameters.i][1]=this.parameters.pointCoords[1]+i[1],this.el.plot(a)}}this.el.fire(\"resizestart\",{dx:this.parameters.x,dy:this.parameters.y,event:t}),SVG.on(window,\"touchmove.resize\",(function(t){e.update(t||window.event)})),SVG.on(window,\"touchend.resize\",(function(){e.done()})),SVG.on(window,\"mousemove.resize\",(function(t){e.update(t||window.event)})),SVG.on(window,\"mouseup.resize\",(function(){e.done()}))},t.prototype.update=function(t){if(t){var e=this._extractPosition(t),i=this.transformPoint(e.x,e.y),a=i.x-this.parameters.p.x,s=i.y-this.parameters.p.y;this.lastUpdateCall=[a,s],this.calc(a,s),this.el.fire(\"resizing\",{dx:a,dy:s,event:t})}else this.lastUpdateCall&&this.calc(this.lastUpdateCall[0],this.lastUpdateCall[1])},t.prototype.done=function(){this.lastUpdateCall=null,SVG.off(window,\"mousemove.resize\"),SVG.off(window,\"mouseup.resize\"),SVG.off(window,\"touchmove.resize\"),SVG.off(window,\"touchend.resize\"),this.el.fire(\"resizedone\")},t.prototype.snapToGrid=function(t,e,i,a){var s;return void 0!==a?s=[(i+t)%this.options.snapToGrid,(a+e)%this.options.snapToGrid]:(i=null==i?3:i,s=[(this.parameters.box.x+t+(1&i?0:this.parameters.box.width))%this.options.snapToGrid,(this.parameters.box.y+e+(2&i?0:this.parameters.box.height))%this.options.snapToGrid]),t<0&&(s[0]-=this.options.snapToGrid),e<0&&(s[1]-=this.options.snapToGrid),t-=Math.abs(s[0])<this.options.snapToGrid/2?s[0]:s[0]-(t<0?-this.options.snapToGrid:this.options.snapToGrid),e-=Math.abs(s[1])<this.options.snapToGrid/2?s[1]:s[1]-(e<0?-this.options.snapToGrid:this.options.snapToGrid),this.constraintToBox(t,e,i,a)},t.prototype.constraintToBox=function(t,e,i,a){var s,r,o=this.options.constraint||{};return void 0!==a?(s=i,r=a):(s=this.parameters.box.x+(1&i?0:this.parameters.box.width),r=this.parameters.box.y+(2&i?0:this.parameters.box.height)),void 0!==o.minX&&s+t<o.minX&&(t=o.minX-s),void 0!==o.maxX&&s+t>o.maxX&&(t=o.maxX-s),void 0!==o.minY&&r+e<o.minY&&(e=o.minY-r),void 0!==o.maxY&&r+e>o.maxY&&(e=o.maxY-r),[t,e]},t.prototype.checkAspectRatio=function(t,e){if(!this.options.saveAspectRatio)return t;var i=t.slice(),a=this.parameters.box.width/this.parameters.box.height,s=this.parameters.box.width+t[0],r=this.parameters.box.height-t[1],o=s/r;return o<a?(i[1]=s/a-this.parameters.box.height,e&&(i[1]=-i[1])):o>a&&(i[0]=this.parameters.box.width-r*a,e&&(i[0]=-i[0])),i},SVG.extend(SVG.Element,{resize:function(e){return(this.remember(\"_resizeHandler\")||new t(this)).init(e||{}),this}}),SVG.Element.prototype.resize.defaults={snapToAngle:.1,snapToGrid:1,constraint:{},saveAspectRatio:!1}}).call(this)}(),void 0===window.Apex&&(window.Apex={});var Ot=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:\"initModules\",value:function(){this.ctx.publicMethods=[\"updateOptions\",\"updateSeries\",\"appendData\",\"appendSeries\",\"toggleSeries\",\"showSeries\",\"hideSeries\",\"setLocale\",\"resetSeries\",\"zoomX\",\"toggleDataPointSelection\",\"dataURI\",\"exportToCSV\",\"addXaxisAnnotation\",\"addYaxisAnnotation\",\"addPointAnnotation\",\"clearAnnotations\",\"removeAnnotation\",\"paper\",\"destroy\"],this.ctx.eventList=[\"click\",\"mousedown\",\"mousemove\",\"mouseleave\",\"touchstart\",\"touchmove\",\"touchleave\",\"mouseup\",\"touchend\"],this.ctx.animations=new b(this.ctx),this.ctx.axes=new J(this.ctx),this.ctx.core=new Dt(this.ctx.el,this.ctx),this.ctx.config=new E({}),this.ctx.data=new W(this.ctx),this.ctx.grid=new j(this.ctx),this.ctx.graphics=new m(this.ctx),this.ctx.coreUtils=new y(this.ctx),this.ctx.crosshairs=new Q(this.ctx),this.ctx.events=new Z(this.ctx),this.ctx.exports=new G(this.ctx),this.ctx.localization=new $(this.ctx),this.ctx.options=new L,this.ctx.responsive=new K(this.ctx),this.ctx.series=new N(this.ctx),this.ctx.theme=new tt(this.ctx),this.ctx.formatters=new T(this.ctx),this.ctx.titleSubtitle=new et(this.ctx),this.ctx.legend=new lt(this.ctx),this.ctx.toolbar=new ht(this.ctx),this.ctx.tooltip=new bt(this.ctx),this.ctx.dimensions=new ot(this.ctx),this.ctx.updateHelpers=new Ht(this.ctx),this.ctx.zoomPanSelection=new ct(this.ctx),this.ctx.w.globals.tooltip=new bt(this.ctx)}}]),t}(),Nt=function(){function t(e){a(this,t),this.ctx=e,this.w=e.w}return r(t,[{key:\"clear\",value:function(t){var e=t.isUpdating;this.ctx.zoomPanSelection&&this.ctx.zoomPanSelection.destroy(),this.ctx.toolbar&&this.ctx.toolbar.destroy(),this.ctx.animations=null,this.ctx.axes=null,this.ctx.annotations=null,this.ctx.core=null,this.ctx.data=null,this.ctx.grid=null,this.ctx.series=null,this.ctx.responsive=null,this.ctx.theme=null,this.ctx.formatters=null,this.ctx.titleSubtitle=null,this.ctx.legend=null,this.ctx.dimensions=null,this.ctx.options=null,this.ctx.crosshairs=null,this.ctx.zoomPanSelection=null,this.ctx.updateHelpers=null,this.ctx.toolbar=null,this.ctx.localization=null,this.ctx.w.globals.tooltip=null,this.clearDomElements({isUpdating:e})}},{key:\"killSVG\",value:function(t){t.each((function(t,e){this.removeClass(\"*\"),this.off(),this.stop()}),!0),t.ungroup(),t.clear()}},{key:\"clearDomElements\",value:function(t){var e=this,i=t.isUpdating,a=this.w.globals.dom.Paper.node;a.parentNode&&a.parentNode.parentNode&&!i&&(a.parentNode.parentNode.style.minHeight=\"unset\");var s=this.w.globals.dom.baseEl;s&&this.ctx.eventList.forEach((function(t){s.removeEventListener(t,e.ctx.events.documentEvent)}));var r=this.w.globals.dom;if(null!==this.ctx.el)for(;this.ctx.el.firstChild;)this.ctx.el.removeChild(this.ctx.el.firstChild);this.killSVG(r.Paper),r.Paper.remove(),r.elWrap=null,r.elGraphical=null,r.elAnnotations=null,r.elLegendWrap=null,r.baseEl=null,r.elGridRect=null,r.elGridRectMask=null,r.elGridRectMarkerMask=null,r.elForecastMask=null,r.elNonForecastMask=null,r.elDefs=null}}]),t}(),Wt=new WeakMap;var Bt=function(){function t(e,i){a(this,t),this.opts=i,this.ctx=this,this.w=new F(i).init(),this.el=e,this.w.globals.cuid=x.randomId(),this.w.globals.chartID=this.w.config.chart.id?x.escapeString(this.w.config.chart.id):this.w.globals.cuid,new Ot(this).initModules(),this.create=x.bind(this.create,this),this.windowResizeHandler=this._windowResizeHandler.bind(this),this.parentResizeHandler=this._parentResizeCallback.bind(this)}return r(t,[{key:\"render\",value:function(){var t=this;return new Promise((function(e,i){if(null!==t.el){void 0===Apex._chartInstances&&(Apex._chartInstances=[]),t.w.config.chart.id&&Apex._chartInstances.push({id:t.w.globals.chartID,group:t.w.config.chart.group,chart:t}),t.setLocale(t.w.config.chart.defaultLocale);var a=t.w.config.chart.events.beforeMount;if(\"function\"==typeof a&&a(t,t.w),t.events.fireEvent(\"beforeMount\",[t,t.w]),window.addEventListener(\"resize\",t.windowResizeHandler),function(t,e){var i=!1;if(t.nodeType!==Node.DOCUMENT_FRAGMENT_NODE){var a=t.getBoundingClientRect();\"none\"!==t.style.display&&0!==a.width||(i=!0)}var s=new ResizeObserver((function(a){i&&e.call(t,a),i=!0}));t.nodeType===Node.DOCUMENT_FRAGMENT_NODE?Array.from(t.children).forEach((function(t){return s.observe(t)})):s.observe(t),Wt.set(e,s)}(t.el.parentNode,t.parentResizeHandler),!t.css){var s=t.el.getRootNode&&t.el.getRootNode(),r=x.is(\"ShadowRoot\",s),o=t.el.ownerDocument,n=o.getElementById(\"apexcharts-css\");!r&&n||(t.css=document.createElement(\"style\"),t.css.id=\"apexcharts-css\",t.css.textContent='@keyframes opaque {\\n  0% {\\n      opacity: 0\\n  }\\n\\n  to {\\n      opacity: 1\\n  }\\n}\\n\\n@keyframes resizeanim {\\n  0%,to {\\n      opacity: 0\\n  }\\n}\\n\\n.apexcharts-canvas {\\n  position: relative;\\n  user-select: none\\n}\\n\\n.apexcharts-canvas ::-webkit-scrollbar {\\n  -webkit-appearance: none;\\n  width: 6px\\n}\\n\\n.apexcharts-canvas ::-webkit-scrollbar-thumb {\\n  border-radius: 4px;\\n  background-color: rgba(0,0,0,.5);\\n  box-shadow: 0 0 1px rgba(255,255,255,.5);\\n  -webkit-box-shadow: 0 0 1px rgba(255,255,255,.5)\\n}\\n\\n.apexcharts-inner {\\n  position: relative\\n}\\n\\n.apexcharts-text tspan {\\n  font-family: inherit\\n}\\n\\n.legend-mouseover-inactive {\\n  transition: .15s ease all;\\n  opacity: .2\\n}\\n\\n.apexcharts-legend-text {\\n  padding-left: 15px;\\n  margin-left: -15px;\\n}\\n\\n.apexcharts-series-collapsed {\\n  opacity: 0\\n}\\n\\n.apexcharts-tooltip {\\n  border-radius: 5px;\\n  box-shadow: 2px 2px 6px -4px #999;\\n  cursor: default;\\n  font-size: 14px;\\n  left: 62px;\\n  opacity: 0;\\n  pointer-events: none;\\n  position: absolute;\\n  top: 20px;\\n  display: flex;\\n  flex-direction: column;\\n  overflow: hidden;\\n  white-space: nowrap;\\n  z-index: 12;\\n  transition: .15s ease all\\n}\\n\\n.apexcharts-tooltip.apexcharts-active {\\n  opacity: 1;\\n  transition: .15s ease all\\n}\\n\\n.apexcharts-tooltip.apexcharts-theme-light {\\n  border: 1px solid #e3e3e3;\\n  background: rgba(255,255,255,.96)\\n}\\n\\n.apexcharts-tooltip.apexcharts-theme-dark {\\n  color: #fff;\\n  background: rgba(30,30,30,.8)\\n}\\n\\n.apexcharts-tooltip * {\\n  font-family: inherit\\n}\\n\\n.apexcharts-tooltip-title {\\n  padding: 6px;\\n  font-size: 15px;\\n  margin-bottom: 4px\\n}\\n\\n.apexcharts-tooltip.apexcharts-theme-light .apexcharts-tooltip-title {\\n  background: #eceff1;\\n  border-bottom: 1px solid #ddd\\n}\\n\\n.apexcharts-tooltip.apexcharts-theme-dark .apexcharts-tooltip-title {\\n  background: rgba(0,0,0,.7);\\n  border-bottom: 1px solid #333\\n}\\n\\n.apexcharts-tooltip-text-goals-value,.apexcharts-tooltip-text-y-value,.apexcharts-tooltip-text-z-value {\\n  display: inline-block;\\n  margin-left: 5px;\\n  font-weight: 600\\n}\\n\\n.apexcharts-tooltip-text-goals-label:empty,.apexcharts-tooltip-text-goals-value:empty,.apexcharts-tooltip-text-y-label:empty,.apexcharts-tooltip-text-y-value:empty,.apexcharts-tooltip-text-z-value:empty,.apexcharts-tooltip-title:empty {\\n  display: none\\n}\\n\\n.apexcharts-tooltip-text-goals-label,.apexcharts-tooltip-text-goals-value {\\n  padding: 6px 0 5px\\n}\\n\\n.apexcharts-tooltip-goals-group,.apexcharts-tooltip-text-goals-label,.apexcharts-tooltip-text-goals-value {\\n  display: flex\\n}\\n\\n.apexcharts-tooltip-text-goals-label:not(:empty),.apexcharts-tooltip-text-goals-value:not(:empty) {\\n  margin-top: -6px\\n}\\n\\n.apexcharts-tooltip-marker {\\n  width: 12px;\\n  height: 12px;\\n  position: relative;\\n  top: 0;\\n  margin-right: 10px;\\n  border-radius: 50%\\n}\\n\\n.apexcharts-tooltip-series-group {\\n  padding: 0 10px;\\n  display: none;\\n  text-align: left;\\n  justify-content: left;\\n  align-items: center\\n}\\n\\n.apexcharts-tooltip-series-group.apexcharts-active .apexcharts-tooltip-marker {\\n  opacity: 1\\n}\\n\\n.apexcharts-tooltip-series-group.apexcharts-active,.apexcharts-tooltip-series-group:last-child {\\n  padding-bottom: 4px\\n}\\n\\n.apexcharts-tooltip-series-group-hidden {\\n  opacity: 0;\\n  height: 0;\\n  line-height: 0;\\n  padding: 0!important\\n}\\n\\n.apexcharts-tooltip-y-group {\\n  padding: 6px 0 5px\\n}\\n\\n.apexcharts-custom-tooltip,.apexcharts-tooltip-box {\\n  padding: 4px 8px\\n}\\n\\n.apexcharts-tooltip-boxPlot {\\n  display: flex;\\n  flex-direction: column-reverse\\n}\\n\\n.apexcharts-tooltip-box>div {\\n  margin: 4px 0\\n}\\n\\n.apexcharts-tooltip-box span.value {\\n  font-weight: 700\\n}\\n\\n.apexcharts-tooltip-rangebar {\\n  padding: 5px 8px\\n}\\n\\n.apexcharts-tooltip-rangebar .category {\\n  font-weight: 600;\\n  color: #777\\n}\\n\\n.apexcharts-tooltip-rangebar .series-name {\\n  font-weight: 700;\\n  display: block;\\n  margin-bottom: 5px\\n}\\n\\n.apexcharts-xaxistooltip,.apexcharts-yaxistooltip {\\n  opacity: 0;\\n  pointer-events: none;\\n  color: #373d3f;\\n  font-size: 13px;\\n  text-align: center;\\n  border-radius: 2px;\\n  position: absolute;\\n  z-index: 10;\\n  background: #eceff1;\\n  border: 1px solid #90a4ae\\n}\\n\\n.apexcharts-xaxistooltip {\\n  padding: 9px 10px;\\n  transition: .15s ease all\\n}\\n\\n.apexcharts-xaxistooltip.apexcharts-theme-dark {\\n  background: rgba(0,0,0,.7);\\n  border: 1px solid rgba(0,0,0,.5);\\n  color: #fff\\n}\\n\\n.apexcharts-xaxistooltip:after,.apexcharts-xaxistooltip:before {\\n  left: 50%;\\n  border: solid transparent;\\n  content: \" \";\\n  height: 0;\\n  width: 0;\\n  position: absolute;\\n  pointer-events: none\\n}\\n\\n.apexcharts-xaxistooltip:after {\\n  border-color: transparent;\\n  border-width: 6px;\\n  margin-left: -6px\\n}\\n\\n.apexcharts-xaxistooltip:before {\\n  border-color: transparent;\\n  border-width: 7px;\\n  margin-left: -7px\\n}\\n\\n.apexcharts-xaxistooltip-bottom:after,.apexcharts-xaxistooltip-bottom:before {\\n  bottom: 100%\\n}\\n\\n.apexcharts-xaxistooltip-top:after,.apexcharts-xaxistooltip-top:before {\\n  top: 100%\\n}\\n\\n.apexcharts-xaxistooltip-bottom:after {\\n  border-bottom-color: #eceff1\\n}\\n\\n.apexcharts-xaxistooltip-bottom:before {\\n  border-bottom-color: #90a4ae\\n}\\n\\n.apexcharts-xaxistooltip-bottom.apexcharts-theme-dark:after,.apexcharts-xaxistooltip-bottom.apexcharts-theme-dark:before {\\n  border-bottom-color: rgba(0,0,0,.5)\\n}\\n\\n.apexcharts-xaxistooltip-top:after {\\n  border-top-color: #eceff1\\n}\\n\\n.apexcharts-xaxistooltip-top:before {\\n  border-top-color: #90a4ae\\n}\\n\\n.apexcharts-xaxistooltip-top.apexcharts-theme-dark:after,.apexcharts-xaxistooltip-top.apexcharts-theme-dark:before {\\n  border-top-color: rgba(0,0,0,.5)\\n}\\n\\n.apexcharts-xaxistooltip.apexcharts-active {\\n  opacity: 1;\\n  transition: .15s ease all\\n}\\n\\n.apexcharts-yaxistooltip {\\n  padding: 4px 10px\\n}\\n\\n.apexcharts-yaxistooltip.apexcharts-theme-dark {\\n  background: rgba(0,0,0,.7);\\n  border: 1px solid rgba(0,0,0,.5);\\n  color: #fff\\n}\\n\\n.apexcharts-yaxistooltip:after,.apexcharts-yaxistooltip:before {\\n  top: 50%;\\n  border: solid transparent;\\n  content: \" \";\\n  height: 0;\\n  width: 0;\\n  position: absolute;\\n  pointer-events: none\\n}\\n\\n.apexcharts-yaxistooltip:after {\\n  border-color: transparent;\\n  border-width: 6px;\\n  margin-top: -6px\\n}\\n\\n.apexcharts-yaxistooltip:before {\\n  border-color: transparent;\\n  border-width: 7px;\\n  margin-top: -7px\\n}\\n\\n.apexcharts-yaxistooltip-left:after,.apexcharts-yaxistooltip-left:before {\\n  left: 100%\\n}\\n\\n.apexcharts-yaxistooltip-right:after,.apexcharts-yaxistooltip-right:before {\\n  right: 100%\\n}\\n\\n.apexcharts-yaxistooltip-left:after {\\n  border-left-color: #eceff1\\n}\\n\\n.apexcharts-yaxistooltip-left:before {\\n  border-left-color: #90a4ae\\n}\\n\\n.apexcharts-yaxistooltip-left.apexcharts-theme-dark:after,.apexcharts-yaxistooltip-left.apexcharts-theme-dark:before {\\n  border-left-color: rgba(0,0,0,.5)\\n}\\n\\n.apexcharts-yaxistooltip-right:after {\\n  border-right-color: #eceff1\\n}\\n\\n.apexcharts-yaxistooltip-right:before {\\n  border-right-color: #90a4ae\\n}\\n\\n.apexcharts-yaxistooltip-right.apexcharts-theme-dark:after,.apexcharts-yaxistooltip-right.apexcharts-theme-dark:before {\\n  border-right-color: rgba(0,0,0,.5)\\n}\\n\\n.apexcharts-yaxistooltip.apexcharts-active {\\n  opacity: 1\\n}\\n\\n.apexcharts-yaxistooltip-hidden {\\n  display: none\\n}\\n\\n.apexcharts-xcrosshairs,.apexcharts-ycrosshairs {\\n  pointer-events: none;\\n  opacity: 0;\\n  transition: .15s ease all\\n}\\n\\n.apexcharts-xcrosshairs.apexcharts-active,.apexcharts-ycrosshairs.apexcharts-active {\\n  opacity: 1;\\n  transition: .15s ease all\\n}\\n\\n.apexcharts-ycrosshairs-hidden {\\n  opacity: 0\\n}\\n\\n.apexcharts-selection-rect {\\n  cursor: move\\n}\\n\\n.svg_select_boundingRect,.svg_select_points_rot {\\n  pointer-events: none;\\n  opacity: 0;\\n  visibility: hidden\\n}\\n\\n.apexcharts-selection-rect+g .svg_select_boundingRect,.apexcharts-selection-rect+g .svg_select_points_rot {\\n  opacity: 0;\\n  visibility: hidden\\n}\\n\\n.apexcharts-selection-rect+g .svg_select_points_l,.apexcharts-selection-rect+g .svg_select_points_r {\\n  cursor: ew-resize;\\n  opacity: 1;\\n  visibility: visible\\n}\\n\\n.svg_select_points {\\n  fill: #efefef;\\n  stroke: #333;\\n  rx: 2\\n}\\n\\n.apexcharts-svg.apexcharts-zoomable.hovering-zoom {\\n  cursor: crosshair\\n}\\n\\n.apexcharts-svg.apexcharts-zoomable.hovering-pan {\\n  cursor: move\\n}\\n\\n.apexcharts-menu-icon,.apexcharts-pan-icon,.apexcharts-reset-icon,.apexcharts-selection-icon,.apexcharts-toolbar-custom-icon,.apexcharts-zoom-icon,.apexcharts-zoomin-icon,.apexcharts-zoomout-icon {\\n  cursor: pointer;\\n  width: 20px;\\n  height: 20px;\\n  line-height: 24px;\\n  color: #6e8192;\\n  text-align: center\\n}\\n\\n.apexcharts-menu-icon svg,.apexcharts-reset-icon svg,.apexcharts-zoom-icon svg,.apexcharts-zoomin-icon svg,.apexcharts-zoomout-icon svg {\\n  fill: #6e8192\\n}\\n\\n.apexcharts-selection-icon svg {\\n  fill: #444;\\n  transform: scale(.76)\\n}\\n\\n.apexcharts-theme-dark .apexcharts-menu-icon svg,.apexcharts-theme-dark .apexcharts-pan-icon svg,.apexcharts-theme-dark .apexcharts-reset-icon svg,.apexcharts-theme-dark .apexcharts-selection-icon svg,.apexcharts-theme-dark .apexcharts-toolbar-custom-icon svg,.apexcharts-theme-dark .apexcharts-zoom-icon svg,.apexcharts-theme-dark .apexcharts-zoomin-icon svg,.apexcharts-theme-dark .apexcharts-zoomout-icon svg {\\n  fill: #f3f4f5\\n}\\n\\n.apexcharts-canvas .apexcharts-reset-zoom-icon.apexcharts-selected svg,.apexcharts-canvas .apexcharts-selection-icon.apexcharts-selected svg,.apexcharts-canvas .apexcharts-zoom-icon.apexcharts-selected svg {\\n  fill: #008ffb\\n}\\n\\n.apexcharts-theme-light .apexcharts-menu-icon:hover svg,.apexcharts-theme-light .apexcharts-reset-icon:hover svg,.apexcharts-theme-light .apexcharts-selection-icon:not(.apexcharts-selected):hover svg,.apexcharts-theme-light .apexcharts-zoom-icon:not(.apexcharts-selected):hover svg,.apexcharts-theme-light .apexcharts-zoomin-icon:hover svg,.apexcharts-theme-light .apexcharts-zoomout-icon:hover svg {\\n  fill: #333\\n}\\n\\n.apexcharts-menu-icon,.apexcharts-selection-icon {\\n  position: relative\\n}\\n\\n.apexcharts-reset-icon {\\n  margin-left: 5px\\n}\\n\\n.apexcharts-menu-icon,.apexcharts-reset-icon,.apexcharts-zoom-icon {\\n  transform: scale(.85)\\n}\\n\\n.apexcharts-zoomin-icon,.apexcharts-zoomout-icon {\\n  transform: scale(.7)\\n}\\n\\n.apexcharts-zoomout-icon {\\n  margin-right: 3px\\n}\\n\\n.apexcharts-pan-icon {\\n  transform: scale(.62);\\n  position: relative;\\n  left: 1px;\\n  top: 0\\n}\\n\\n.apexcharts-pan-icon svg {\\n  fill: #fff;\\n  stroke: #6e8192;\\n  stroke-width: 2\\n}\\n\\n.apexcharts-pan-icon.apexcharts-selected svg {\\n  stroke: #008ffb\\n}\\n\\n.apexcharts-pan-icon:not(.apexcharts-selected):hover svg {\\n  stroke: #333\\n}\\n\\n.apexcharts-toolbar {\\n  position: absolute;\\n  z-index: 11;\\n  max-width: 176px;\\n  text-align: right;\\n  border-radius: 3px;\\n  padding: 0 6px 2px;\\n  display: flex;\\n  justify-content: space-between;\\n  align-items: center\\n}\\n\\n.apexcharts-menu {\\n  background: #fff;\\n  position: absolute;\\n  top: 100%;\\n  border: 1px solid #ddd;\\n  border-radius: 3px;\\n  padding: 3px;\\n  right: 10px;\\n  opacity: 0;\\n  min-width: 110px;\\n  transition: .15s ease all;\\n  pointer-events: none\\n}\\n\\n.apexcharts-menu.apexcharts-menu-open {\\n  opacity: 1;\\n  pointer-events: all;\\n  transition: .15s ease all\\n}\\n\\n.apexcharts-menu-item {\\n  padding: 6px 7px;\\n  font-size: 12px;\\n  cursor: pointer\\n}\\n\\n.apexcharts-theme-light .apexcharts-menu-item:hover {\\n  background: #eee\\n}\\n\\n.apexcharts-theme-dark .apexcharts-menu {\\n  background: rgba(0,0,0,.7);\\n  color: #fff\\n}\\n\\n@media screen and (min-width:768px) {\\n  .apexcharts-canvas:hover .apexcharts-toolbar {\\n      opacity: 1\\n  }\\n}\\n\\n.apexcharts-canvas .apexcharts-element-hidden,.apexcharts-datalabel.apexcharts-element-hidden,.apexcharts-hide .apexcharts-series-points {\\n  opacity: 0\\n}\\n\\n.apexcharts-datalabel,.apexcharts-datalabel-label,.apexcharts-datalabel-value,.apexcharts-datalabels,.apexcharts-pie-label {\\n  cursor: default;\\n  pointer-events: none\\n}\\n\\n.apexcharts-pie-label-delay {\\n  opacity: 0;\\n  animation-name: opaque;\\n  animation-duration: .3s;\\n  animation-fill-mode: forwards;\\n  animation-timing-function: ease\\n}\\n\\n.apexcharts-legend {\\t\\n  display: flex;\\t\\n  overflow: auto;\\t\\n  padding: 0 10px;\\t\\n}\\t\\n.apexcharts-legend.apx-legend-position-bottom, .apexcharts-legend.apx-legend-position-top {\\t\\n  flex-wrap: wrap\\t\\n}\\t\\n.apexcharts-legend.apx-legend-position-right, .apexcharts-legend.apx-legend-position-left {\\t\\n  flex-direction: column;\\t\\n  bottom: 0;\\t\\n}\\t\\n.apexcharts-legend.apx-legend-position-bottom.apexcharts-align-left, .apexcharts-legend.apx-legend-position-top.apexcharts-align-left, .apexcharts-legend.apx-legend-position-right, .apexcharts-legend.apx-legend-position-left {\\t\\n  justify-content: flex-start;\\t\\n}\\t\\n.apexcharts-legend.apx-legend-position-bottom.apexcharts-align-center, .apexcharts-legend.apx-legend-position-top.apexcharts-align-center {\\t\\n  justify-content: center;  \\t\\n}\\t\\n.apexcharts-legend.apx-legend-position-bottom.apexcharts-align-right, .apexcharts-legend.apx-legend-position-top.apexcharts-align-right {\\t\\n  justify-content: flex-end;\\t\\n}\\t\\n.apexcharts-legend-series {\\t\\n  cursor: pointer;\\t\\n  line-height: normal;\\t\\n}\\t\\n.apexcharts-legend.apx-legend-position-bottom .apexcharts-legend-series, .apexcharts-legend.apx-legend-position-top .apexcharts-legend-series{\\t\\n  display: flex;\\t\\n  align-items: center;\\t\\n}\\t\\n.apexcharts-legend-text {\\t\\n  position: relative;\\t\\n  font-size: 14px;\\t\\n}\\t\\n.apexcharts-legend-text *, .apexcharts-legend-marker * {\\t\\n  pointer-events: none;\\t\\n}\\t\\n.apexcharts-legend-marker {\\t\\n  position: relative;\\t\\n  display: inline-block;\\t\\n  cursor: pointer;\\t\\n  margin-right: 3px;\\t\\n  border-style: solid;\\n}\\t\\n  \\n.apexcharts-legend.apexcharts-align-right .apexcharts-legend-series, .apexcharts-legend.apexcharts-align-left .apexcharts-legend-series{\\t\\n  display: inline-block;\\t\\n}\\t\\n.apexcharts-legend-series.apexcharts-no-click {\\t\\n  cursor: auto;\\t\\n}\\t\\n.apexcharts-legend .apexcharts-hidden-zero-series, .apexcharts-legend .apexcharts-hidden-null-series {\\t\\n  display: none !important;\\t\\n}\\t\\n.apexcharts-inactive-legend {\\t\\n  opacity: 0.45;\\t\\n}\\n\\n.apexcharts-annotation-rect,.apexcharts-area-series .apexcharts-area,.apexcharts-area-series .apexcharts-series-markers .apexcharts-marker.no-pointer-events,.apexcharts-gridline,.apexcharts-line,.apexcharts-line-series .apexcharts-series-markers .apexcharts-marker.no-pointer-events,.apexcharts-point-annotation-label,.apexcharts-radar-series path,.apexcharts-radar-series polygon,.apexcharts-toolbar svg,.apexcharts-tooltip .apexcharts-marker,.apexcharts-xaxis-annotation-label,.apexcharts-yaxis-annotation-label,.apexcharts-zoom-rect {\\n  pointer-events: none\\n}\\n\\n.apexcharts-marker {\\n  transition: .15s ease all\\n}\\n\\n.resize-triggers {\\n  animation: 1ms resizeanim;\\n  visibility: hidden;\\n  opacity: 0;\\n  height: 100%;\\n  width: 100%;\\n  overflow: hidden\\n}\\n\\n.contract-trigger:before,.resize-triggers,.resize-triggers>div {\\n  content: \" \";\\n  display: block;\\n  position: absolute;\\n  top: 0;\\n  left: 0\\n}\\n\\n.resize-triggers>div {\\n  height: 100%;\\n  width: 100%;\\n  background: #eee;\\n  overflow: auto\\n}\\n\\n.contract-trigger:before {\\n  overflow: hidden;\\n  width: 200%;\\n  height: 200%\\n}\\n',r?s.prepend(t.css):o.head.appendChild(t.css))}var l=t.create(t.w.config.series,{});if(!l)return e(t);t.mount(l).then((function(){\"function\"==typeof t.w.config.chart.events.mounted&&t.w.config.chart.events.mounted(t,t.w),t.events.fireEvent(\"mounted\",[t,t.w]),e(l)})).catch((function(t){i(t)}))}else i(new Error(\"Element not found\"))}))}},{key:\"create\",value:function(t,e){var i=this.w;new Ot(this).initModules();var a=this.w.globals;(a.noData=!1,a.animationEnded=!1,this.responsive.checkResponsiveConfig(e),i.config.xaxis.convertedCatToNumeric)&&new X(i.config).convertCatToNumericXaxis(i.config,this.ctx);if(null===this.el)return a.animationEnded=!0,null;if(this.core.setupElements(),\"treemap\"===i.config.chart.type&&(i.config.grid.show=!1,i.config.yaxis[0].show=!1),0===a.svgWidth)return a.animationEnded=!0,null;var s=y.checkComboSeries(t);a.comboCharts=s.comboCharts,a.comboBarCount=s.comboBarCount;var r=t.every((function(t){return t.data&&0===t.data.length}));(0===t.length||r)&&this.series.handleNoData(),this.events.setupEventHandlers(),this.data.parseData(t),this.theme.init(),new D(this).setGlobalMarkerSize(),this.formatters.setLabelFormatters(),this.titleSubtitle.draw(),a.noData&&a.collapsedSeries.length!==a.series.length&&!i.config.legend.showForSingleSeries||this.legend.init(),this.series.hasAllSeriesEqualX(),a.axisCharts&&(this.core.coreCalculations(),\"category\"!==i.config.xaxis.type&&this.formatters.setLabelFormatters(),this.ctx.toolbar.minX=i.globals.minX,this.ctx.toolbar.maxX=i.globals.maxX),this.formatters.heatmapLabelFormatters(),new y(this).getLargestMarkerSize(),this.dimensions.plotCoords();var o=this.core.xySettings();this.grid.createGridMask();var n=this.core.plotChartType(t,o),l=new O(this);l.bringForward(),i.config.dataLabels.background.enabled&&l.dataLabelsBackground(),this.core.shiftGraphPosition();var h={plot:{left:i.globals.translateX,top:i.globals.translateY,width:i.globals.gridWidth,height:i.globals.gridHeight}};return{elGraph:n,xyRatios:o,elInner:i.globals.dom.elGraphical,dimensions:h}}},{key:\"mount\",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,i=this,a=i.w;return new Promise((function(s,r){if(null===i.el)return r(new Error(\"Not enough data to display or target element not found\"));(null===e||a.globals.allSeriesCollapsed)&&i.series.handleNoData(),i.grid=new j(i);var o=i.grid.drawGrid();if(i.annotations=new P(i),i.annotations.drawImageAnnos(),i.annotations.drawTextAnnos(),\"back\"===a.config.grid.position&&o&&a.globals.dom.elGraphical.add(o.el),Array.isArray(e.elGraph))for(var n=0;n<e.elGraph.length;n++)a.globals.dom.elGraphical.add(e.elGraph[n]);else a.globals.dom.elGraphical.add(e.elGraph);\"front\"===a.config.grid.position&&o&&a.globals.dom.elGraphical.add(o.el),o&&o.elGridBorders&&o.elGridBorders.node&&a.globals.dom.elGraphical.add(o.elGridBorders),\"front\"===a.config.xaxis.crosshairs.position&&i.crosshairs.drawXCrosshairs(),\"front\"===a.config.yaxis[0].crosshairs.position&&i.crosshairs.drawYCrosshairs(),\"treemap\"!==a.config.chart.type&&i.axes.drawAxis(a.config.chart.type,o);var l=new V(t.ctx,o),h=new q(t.ctx,o);if(null!==o&&(l.xAxisLabelCorrections(o.xAxisTickWidth),h.setYAxisTextAlignments(),a.config.yaxis.map((function(t,e){-1===a.globals.ignoreYAxisIndexes.indexOf(e)&&h.yAxisTitleRotate(e,t.opposite)}))),a.globals.dom.Paper.add(a.globals.dom.elAnnotations),i.annotations.drawAxesAnnotations(),!a.globals.noData){if(a.config.tooltip.enabled&&!a.globals.noData&&i.w.globals.tooltip.drawTooltip(e.xyRatios),a.globals.axisCharts&&(a.globals.isXNumeric||a.config.xaxis.convertedCatToNumeric||a.globals.isRangeBar))(a.config.chart.zoom.enabled||a.config.chart.selection&&a.config.chart.selection.enabled||a.config.chart.pan&&a.config.chart.pan.enabled)&&i.zoomPanSelection.init({xyRatios:e.xyRatios});else{var c=a.config.chart.toolbar.tools;[\"zoom\",\"zoomin\",\"zoomout\",\"selection\",\"pan\",\"reset\"].forEach((function(t){c[t]=!1}))}a.config.chart.toolbar.show&&!a.globals.allSeriesCollapsed&&i.toolbar.createToolbar()}a.globals.memory.methodsToExec.length>0&&a.globals.memory.methodsToExec.forEach((function(t){t.method(t.params,!1,t.context)})),a.globals.axisCharts||a.globals.noData||i.core.resizeNonAxisCharts(),s(i)}))}},{key:\"destroy\",value:function(){var t,e;window.removeEventListener(\"resize\",this.windowResizeHandler),this.el.parentNode,t=this.parentResizeHandler,(e=Wt.get(t))&&(e.disconnect(),Wt.delete(t));var i=this.w.config.chart.id;i&&Apex._chartInstances.forEach((function(t,e){t.id===x.escapeString(i)&&Apex._chartInstances.splice(e,1)})),new Nt(this.ctx).clear({isUpdating:!1})}},{key:\"updateOptions\",value:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],a=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],s=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=this.w;return o.globals.selection=void 0,t.series&&(this.series.resetSeries(!1,!0,!1),t.series.length&&t.series[0].data&&(t.series=t.series.map((function(t,i){return e.updateHelpers._extendSeries(t,i)}))),this.updateHelpers.revertDefaultAxisMinMax()),t.xaxis&&(t=this.updateHelpers.forceXAxisUpdate(t)),t.yaxis&&(t=this.updateHelpers.forceYAxisUpdate(t)),o.globals.collapsedSeriesIndices.length>0&&this.series.clearPreviousPaths(),t.theme&&(t=this.theme.updateThemeOptions(t)),this.updateHelpers._updateOptions(t,i,a,s,r)}},{key:\"updateSeries\",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];return this.series.resetSeries(!1),this.updateHelpers.revertDefaultAxisMinMax(),this.updateHelpers._updateSeries(t,e,i)}},{key:\"appendSeries\",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],a=this.w.config.series.slice();return a.push(t),this.series.resetSeries(!1),this.updateHelpers.revertDefaultAxisMinMax(),this.updateHelpers._updateSeries(a,e,i)}},{key:\"appendData\",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=this;i.w.globals.dataChanged=!0,i.series.getPreviousPaths();for(var a=i.w.config.series.slice(),s=0;s<a.length;s++)if(null!==t[s]&&void 0!==t[s])for(var r=0;r<t[s].data.length;r++)a[s].data.push(t[s].data[r]);return i.w.config.series=a,e&&(i.w.globals.initialSeries=x.clone(i.w.config.series)),this.update()}},{key:\"update\",value:function(t){var e=this;return new Promise((function(i,a){new Nt(e.ctx).clear({isUpdating:!0});var s=e.create(e.w.config.series,t);if(!s)return i(e);e.mount(s).then((function(){\"function\"==typeof e.w.config.chart.events.updated&&e.w.config.chart.events.updated(e,e.w),e.events.fireEvent(\"updated\",[e,e.w]),e.w.globals.isDirty=!0,i(e)})).catch((function(t){a(t)}))}))}},{key:\"getSyncedCharts\",value:function(){var t=this.getGroupedCharts(),e=[this];return t.length&&(e=[],t.forEach((function(t){e.push(t)}))),e}},{key:\"getGroupedCharts\",value:function(){var t=this;return Apex._chartInstances.filter((function(t){if(t.group)return!0})).map((function(e){return t.w.config.chart.group===e.group?e.chart:t}))}},{key:\"toggleSeries\",value:function(t){return this.series.toggleSeries(t)}},{key:\"highlightSeriesOnLegendHover\",value:function(t,e){return this.series.toggleSeriesOnHover(t,e)}},{key:\"showSeries\",value:function(t){this.series.showSeries(t)}},{key:\"hideSeries\",value:function(t){this.series.hideSeries(t)}},{key:\"resetSeries\",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.series.resetSeries(t,e)}},{key:\"addEventListener\",value:function(t,e){this.events.addEventListener(t,e)}},{key:\"removeEventListener\",value:function(t,e){this.events.removeEventListener(t,e)}},{key:\"addXaxisAnnotation\",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,a=this;i&&(a=i),a.annotations.addXaxisAnnotationExternal(t,e,a)}},{key:\"addYaxisAnnotation\",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,a=this;i&&(a=i),a.annotations.addYaxisAnnotationExternal(t,e,a)}},{key:\"addPointAnnotation\",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,a=this;i&&(a=i),a.annotations.addPointAnnotationExternal(t,e,a)}},{key:\"clearAnnotations\",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0,e=this;t&&(e=t),e.annotations.clearAnnotations(e)}},{key:\"removeAnnotation\",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0,i=this;e&&(i=e),i.annotations.removeAnnotation(i,t)}},{key:\"getChartArea\",value:function(){return this.w.globals.dom.baseEl.querySelector(\".apexcharts-inner\")}},{key:\"getSeriesTotalXRange\",value:function(t,e){return this.coreUtils.getSeriesTotalsXRange(t,e)}},{key:\"getHighestValueInSeries\",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return new U(this.ctx).getMinYMaxY(t).highestY}},{key:\"getLowestValueInSeries\",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return new U(this.ctx).getMinYMaxY(t).lowestY}},{key:\"getSeriesTotal\",value:function(){return this.w.globals.seriesTotals}},{key:\"toggleDataPointSelection\",value:function(t,e){return this.updateHelpers.toggleDataPointSelection(t,e)}},{key:\"zoomX\",value:function(t,e){this.ctx.toolbar.zoomUpdateOptions(t,e)}},{key:\"setLocale\",value:function(t){this.localization.setCurrentLocaleValues(t)}},{key:\"dataURI\",value:function(t){return new G(this.ctx).dataURI(t)}},{key:\"exportToCSV\",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return new G(this.ctx).exportToCSV(t)}},{key:\"paper\",value:function(){return this.w.globals.dom.Paper}},{key:\"_parentResizeCallback\",value:function(){this.w.globals.animationEnded&&this.w.config.chart.redrawOnParentResize&&this._windowResize()}},{key:\"_windowResize\",value:function(){var t=this;clearTimeout(this.w.globals.resizeTimer),this.w.globals.resizeTimer=window.setTimeout((function(){t.w.globals.resized=!0,t.w.globals.dataChanged=!1,t.ctx.update()}),150)}},{key:\"_windowResizeHandler\",value:function(){var t=this.w.config.chart.redrawOnWindowResize;\"function\"==typeof t&&(t=t()),t&&this._windowResize()}}],[{key:\"getChartByID\",value:function(t){var e=x.escapeString(t),i=Apex._chartInstances.filter((function(t){return t.id===e}))[0];return i&&i.chart}},{key:\"initOnLoad\",value:function(){for(var e=document.querySelectorAll(\"[data-apexcharts]\"),i=0;i<e.length;i++){new t(e[i],JSON.parse(e[i].getAttribute(\"data-options\"))).render()}}},{key:\"exec\",value:function(t,e){var i=this.getChartByID(t);if(i){i.w.globals.isExecCalled=!0;var a=null;if(-1!==i.publicMethods.indexOf(e)){for(var s=arguments.length,r=new Array(s>2?s-2:0),o=2;o<s;o++)r[o-2]=arguments[o];a=i[e].apply(i,r)}return a}}},{key:\"merge\",value:function(t,e){return x.extend(t,e)}}]),t}();return Bt}));\n","/*!\n * Chart.js v4.2.1\n * https://www.chartjs.org\n * (c) 2023 Chart.js Contributors\n * Released under the MIT License\n */\n!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).Chart=e()}(this,(function(){\"use strict\";var t=Object.freeze({__proto__:null,get Colors(){return jo},get Decimation(){return Uo},get Filler(){return ha},get Legend(){return fa},get SubTitle(){return ba},get Title(){return pa},get Tooltip(){return La}});function e(){}const i=(()=>{let t=0;return()=>t++})();function s(t){return null==t}function n(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return\"[object\"===e.slice(0,7)&&\"Array]\"===e.slice(-6)}function o(t){return null!==t&&\"[object Object]\"===Object.prototype.toString.call(t)}function a(t){return(\"number\"==typeof t||t instanceof Number)&&isFinite(+t)}function r(t,e){return a(t)?t:e}function l(t,e){return void 0===t?e:t}const h=(t,e)=>\"string\"==typeof t&&t.endsWith(\"%\")?parseFloat(t)/100:+t/e,c=(t,e)=>\"string\"==typeof t&&t.endsWith(\"%\")?parseFloat(t)/100*e:+t;function d(t,e,i){if(t&&\"function\"==typeof t.call)return t.apply(i,e)}function u(t,e,i,s){let a,r,l;if(n(t))if(r=t.length,s)for(a=r-1;a>=0;a--)e.call(i,t[a],a);else for(a=0;a<r;a++)e.call(i,t[a],a);else if(o(t))for(l=Object.keys(t),r=l.length,a=0;a<r;a++)e.call(i,t[l[a]],l[a])}function f(t,e){let i,s,n,o;if(!t||!e||t.length!==e.length)return!1;for(i=0,s=t.length;i<s;++i)if(n=t[i],o=e[i],n.datasetIndex!==o.datasetIndex||n.index!==o.index)return!1;return!0}function g(t){if(n(t))return t.map(g);if(o(t)){const e=Object.create(null),i=Object.keys(t),s=i.length;let n=0;for(;n<s;++n)e[i[n]]=g(t[i[n]]);return e}return t}function p(t){return-1===[\"__proto__\",\"prototype\",\"constructor\"].indexOf(t)}function m(t,e,i,s){if(!p(t))return;const n=e[t],a=i[t];o(n)&&o(a)?b(n,a,s):e[t]=g(a)}function b(t,e,i){const s=n(e)?e:[e],a=s.length;if(!o(t))return t;const r=(i=i||{}).merger||m;let l;for(let e=0;e<a;++e){if(l=s[e],!o(l))continue;const n=Object.keys(l);for(let e=0,s=n.length;e<s;++e)r(n[e],t,l,i)}return t}function x(t,e){return b(t,e,{merger:_})}function _(t,e,i){if(!p(t))return;const s=e[t],n=i[t];o(s)&&o(n)?x(s,n):Object.prototype.hasOwnProperty.call(e,t)||(e[t]=g(n))}const y={\"\":t=>t,x:t=>t.x,y:t=>t.y};function v(t){const e=t.split(\".\"),i=[];let s=\"\";for(const t of e)s+=t,s.endsWith(\"\\\\\")?s=s.slice(0,-1)+\".\":(i.push(s),s=\"\");return i}function M(t,e){const i=y[e]||(y[e]=function(t){const e=v(t);return t=>{for(const i of e){if(\"\"===i)break;t=t&&t[i]}return t}}(e));return i(t)}function w(t){return t.charAt(0).toUpperCase()+t.slice(1)}const k=t=>void 0!==t,S=t=>\"function\"==typeof t,P=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0};function D(t){return\"mouseup\"===t.type||\"click\"===t.type||\"contextmenu\"===t.type}const C=Math.PI,O=2*C,A=O+C,T=Number.POSITIVE_INFINITY,L=C/180,E=C/2,R=C/4,I=2*C/3,z=Math.log10,F=Math.sign;function V(t,e,i){return Math.abs(t-e)<i}function B(t){const e=Math.round(t);t=V(t,e,t/1e3)?e:t;const i=Math.pow(10,Math.floor(z(t))),s=t/i;return(s<=1?1:s<=2?2:s<=5?5:10)*i}function N(t){const e=[],i=Math.sqrt(t);let s;for(s=1;s<i;s++)t%s==0&&(e.push(s),e.push(t/s));return i===(0|i)&&e.push(i),e.sort(((t,e)=>t-e)).pop(),e}function W(t){return!isNaN(parseFloat(t))&&isFinite(t)}function H(t,e){const i=Math.round(t);return i-e<=t&&i+e>=t}function j(t,e,i){let s,n,o;for(s=0,n=t.length;s<n;s++)o=t[s][i],isNaN(o)||(e.min=Math.min(e.min,o),e.max=Math.max(e.max,o))}function $(t){return t*(C/180)}function Y(t){return t*(180/C)}function U(t){if(!a(t))return;let e=1,i=0;for(;Math.round(t*e)/e!==t;)e*=10,i++;return i}function X(t,e){const i=e.x-t.x,s=e.y-t.y,n=Math.sqrt(i*i+s*s);let o=Math.atan2(s,i);return o<-.5*C&&(o+=O),{angle:o,distance:n}}function q(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function K(t,e){return(t-e+A)%O-C}function G(t){return(t%O+O)%O}function Z(t,e,i,s){const n=G(t),o=G(e),a=G(i),r=G(o-n),l=G(a-n),h=G(n-o),c=G(n-a);return n===o||n===a||s&&o===a||r>l&&h<c}function J(t,e,i){return Math.max(e,Math.min(i,t))}function Q(t){return J(t,-32768,32767)}function tt(t,e,i,s=1e-6){return t>=Math.min(e,i)-s&&t<=Math.max(e,i)+s}function et(t,e,i){i=i||(i=>t[i]<e);let s,n=t.length-1,o=0;for(;n-o>1;)s=o+n>>1,i(s)?o=s:n=s;return{lo:o,hi:n}}const it=(t,e,i,s)=>et(t,i,s?s=>{const n=t[s][e];return n<i||n===i&&t[s+1][e]===i}:s=>t[s][e]<i),st=(t,e,i)=>et(t,i,(s=>t[s][e]>=i));function nt(t,e,i){let s=0,n=t.length;for(;s<n&&t[s]<e;)s++;for(;n>s&&t[n-1]>i;)n--;return s>0||n<t.length?t.slice(s,n):t}const ot=[\"push\",\"pop\",\"shift\",\"splice\",\"unshift\"];function at(t,e){t._chartjs?t._chartjs.listeners.push(e):(Object.defineProperty(t,\"_chartjs\",{configurable:!0,enumerable:!1,value:{listeners:[e]}}),ot.forEach((e=>{const i=\"_onData\"+w(e),s=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...e){const n=s.apply(this,e);return t._chartjs.listeners.forEach((t=>{\"function\"==typeof t[i]&&t[i](...e)})),n}})})))}function rt(t,e){const i=t._chartjs;if(!i)return;const s=i.listeners,n=s.indexOf(e);-1!==n&&s.splice(n,1),s.length>0||(ot.forEach((e=>{delete t[e]})),delete t._chartjs)}function lt(t){const e=new Set;let i,s;for(i=0,s=t.length;i<s;++i)e.add(t[i]);return e.size===s?t:Array.from(e)}const ht=\"undefined\"==typeof window?function(t){return t()}:window.requestAnimationFrame;function ct(t,e){let i=[],s=!1;return function(...n){i=n,s||(s=!0,ht.call(window,(()=>{s=!1,t.apply(e,i)})))}}function dt(t,e){let i;return function(...s){return e?(clearTimeout(i),i=setTimeout(t,e,s)):t.apply(this,s),e}}const ut=t=>\"start\"===t?\"left\":\"end\"===t?\"right\":\"center\",ft=(t,e,i)=>\"start\"===t?e:\"end\"===t?i:(e+i)/2,gt=(t,e,i,s)=>t===(s?\"left\":\"right\")?i:\"center\"===t?(e+i)/2:e;function pt(t,e,i){const s=e.length;let n=0,o=s;if(t._sorted){const{iScale:a,_parsed:r}=t,l=a.axis,{min:h,max:c,minDefined:d,maxDefined:u}=a.getUserBounds();d&&(n=J(Math.min(it(r,a.axis,h).lo,i?s:it(e,l,a.getPixelForValue(h)).lo),0,s-1)),o=u?J(Math.max(it(r,a.axis,c,!0).hi+1,i?0:it(e,l,a.getPixelForValue(c),!0).hi+1),n,s)-n:s-n}return{start:n,count:o}}function mt(t){const{xScale:e,yScale:i,_scaleRanges:s}=t,n={xmin:e.min,xmax:e.max,ymin:i.min,ymax:i.max};if(!s)return t._scaleRanges=n,!0;const o=s.xmin!==e.min||s.xmax!==e.max||s.ymin!==i.min||s.ymax!==i.max;return Object.assign(s,n),o}class bt{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,i,s){const n=e.listeners[s],o=e.duration;n.forEach((s=>s({chart:t,initial:e.initial,numSteps:o,currentStep:Math.min(i-e.start,o)})))}_refresh(){this._request||(this._running=!0,this._request=ht.call(window,(()=>{this._update(),this._request=null,this._running&&this._refresh()})))}_update(t=Date.now()){let e=0;this._charts.forEach(((i,s)=>{if(!i.running||!i.items.length)return;const n=i.items;let o,a=n.length-1,r=!1;for(;a>=0;--a)o=n[a],o._active?(o._total>i.duration&&(i.duration=o._total),o.tick(t),r=!0):(n[a]=n[n.length-1],n.pop());r&&(s.draw(),this._notify(s,i,t,\"progress\")),n.length||(i.running=!1,this._notify(s,i,t,\"complete\"),i.initial=!1),e+=n.length})),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce(((t,e)=>Math.max(t,e._duration)),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const i=e.items;let s=i.length-1;for(;s>=0;--s)i[s].cancel();e.items=[],this._notify(t,e,Date.now(),\"complete\")}remove(t){return this._charts.delete(t)}}var xt=new bt;\n/*!\n * @kurkle/color v0.3.0\n * https://github.com/kurkle/color#readme\n * (c) 2022 Jukka Kurkela\n * Released under the MIT License\n */function _t(t){return t+.5|0}const yt=(t,e,i)=>Math.max(Math.min(t,i),e);function vt(t){return yt(_t(2.55*t),0,255)}function Mt(t){return yt(_t(255*t),0,255)}function wt(t){return yt(_t(t/2.55)/100,0,1)}function kt(t){return yt(_t(100*t),0,100)}const St={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Pt=[...\"0123456789ABCDEF\"],Dt=t=>Pt[15&t],Ct=t=>Pt[(240&t)>>4]+Pt[15&t],Ot=t=>(240&t)>>4==(15&t);function At(t){var e=(t=>Ot(t.r)&&Ot(t.g)&&Ot(t.b)&&Ot(t.a))(t)?Dt:Ct;return t?\"#\"+e(t.r)+e(t.g)+e(t.b)+((t,e)=>t<255?e(t):\"\")(t.a,e):void 0}const Tt=/^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;function Lt(t,e,i){const s=e*Math.min(i,1-i),n=(e,n=(e+t/30)%12)=>i-s*Math.max(Math.min(n-3,9-n,1),-1);return[n(0),n(8),n(4)]}function Et(t,e,i){const s=(s,n=(s+t/60)%6)=>i-i*e*Math.max(Math.min(n,4-n,1),0);return[s(5),s(3),s(1)]}function Rt(t,e,i){const s=Lt(t,1,.5);let n;for(e+i>1&&(n=1/(e+i),e*=n,i*=n),n=0;n<3;n++)s[n]*=1-e-i,s[n]+=e;return s}function It(t){const e=t.r/255,i=t.g/255,s=t.b/255,n=Math.max(e,i,s),o=Math.min(e,i,s),a=(n+o)/2;let r,l,h;return n!==o&&(h=n-o,l=a>.5?h/(2-n-o):h/(n+o),r=function(t,e,i,s,n){return t===n?(e-i)/s+(e<i?6:0):e===n?(i-t)/s+2:(t-e)/s+4}(e,i,s,h,n),r=60*r+.5),[0|r,l||0,a]}function zt(t,e,i,s){return(Array.isArray(e)?t(e[0],e[1],e[2]):t(e,i,s)).map(Mt)}function Ft(t,e,i){return zt(Lt,t,e,i)}function Vt(t){return(t%360+360)%360}function Bt(t){const e=Tt.exec(t);let i,s=255;if(!e)return;e[5]!==i&&(s=e[6]?vt(+e[5]):Mt(+e[5]));const n=Vt(+e[2]),o=+e[3]/100,a=+e[4]/100;return i=\"hwb\"===e[1]?function(t,e,i){return zt(Rt,t,e,i)}(n,o,a):\"hsv\"===e[1]?function(t,e,i){return zt(Et,t,e,i)}(n,o,a):Ft(n,o,a),{r:i[0],g:i[1],b:i[2],a:s}}const Nt={x:\"dark\",Z:\"light\",Y:\"re\",X:\"blu\",W:\"gr\",V:\"medium\",U:\"slate\",A:\"ee\",T:\"ol\",S:\"or\",B:\"ra\",C:\"lateg\",D:\"ights\",R:\"in\",Q:\"turquois\",E:\"hi\",P:\"ro\",O:\"al\",N:\"le\",M:\"de\",L:\"yello\",F:\"en\",K:\"ch\",G:\"arks\",H:\"ea\",I:\"ightg\",J:\"wh\"},Wt={OiceXe:\"f0f8ff\",antiquewEte:\"faebd7\",aqua:\"ffff\",aquamarRe:\"7fffd4\",azuY:\"f0ffff\",beige:\"f5f5dc\",bisque:\"ffe4c4\",black:\"0\",blanKedOmond:\"ffebcd\",Xe:\"ff\",XeviTet:\"8a2be2\",bPwn:\"a52a2a\",burlywood:\"deb887\",caMtXe:\"5f9ea0\",KartYuse:\"7fff00\",KocTate:\"d2691e\",cSO:\"ff7f50\",cSnflowerXe:\"6495ed\",cSnsilk:\"fff8dc\",crimson:\"dc143c\",cyan:\"ffff\",xXe:\"8b\",xcyan:\"8b8b\",xgTMnPd:\"b8860b\",xWay:\"a9a9a9\",xgYF:\"6400\",xgYy:\"a9a9a9\",xkhaki:\"bdb76b\",xmagFta:\"8b008b\",xTivegYF:\"556b2f\",xSange:\"ff8c00\",xScEd:\"9932cc\",xYd:\"8b0000\",xsOmon:\"e9967a\",xsHgYF:\"8fbc8f\",xUXe:\"483d8b\",xUWay:\"2f4f4f\",xUgYy:\"2f4f4f\",xQe:\"ced1\",xviTet:\"9400d3\",dAppRk:\"ff1493\",dApskyXe:\"bfff\",dimWay:\"696969\",dimgYy:\"696969\",dodgerXe:\"1e90ff\",fiYbrick:\"b22222\",flSOwEte:\"fffaf0\",foYstWAn:\"228b22\",fuKsia:\"ff00ff\",gaRsbSo:\"dcdcdc\",ghostwEte:\"f8f8ff\",gTd:\"ffd700\",gTMnPd:\"daa520\",Way:\"808080\",gYF:\"8000\",gYFLw:\"adff2f\",gYy:\"808080\",honeyMw:\"f0fff0\",hotpRk:\"ff69b4\",RdianYd:\"cd5c5c\",Rdigo:\"4b0082\",ivSy:\"fffff0\",khaki:\"f0e68c\",lavFMr:\"e6e6fa\",lavFMrXsh:\"fff0f5\",lawngYF:\"7cfc00\",NmoncEffon:\"fffacd\",ZXe:\"add8e6\",ZcSO:\"f08080\",Zcyan:\"e0ffff\",ZgTMnPdLw:\"fafad2\",ZWay:\"d3d3d3\",ZgYF:\"90ee90\",ZgYy:\"d3d3d3\",ZpRk:\"ffb6c1\",ZsOmon:\"ffa07a\",ZsHgYF:\"20b2aa\",ZskyXe:\"87cefa\",ZUWay:\"778899\",ZUgYy:\"778899\",ZstAlXe:\"b0c4de\",ZLw:\"ffffe0\",lime:\"ff00\",limegYF:\"32cd32\",lRF:\"faf0e6\",magFta:\"ff00ff\",maPon:\"800000\",VaquamarRe:\"66cdaa\",VXe:\"cd\",VScEd:\"ba55d3\",VpurpN:\"9370db\",VsHgYF:\"3cb371\",VUXe:\"7b68ee\",VsprRggYF:\"fa9a\",VQe:\"48d1cc\",VviTetYd:\"c71585\",midnightXe:\"191970\",mRtcYam:\"f5fffa\",mistyPse:\"ffe4e1\",moccasR:\"ffe4b5\",navajowEte:\"ffdead\",navy:\"80\",Tdlace:\"fdf5e6\",Tive:\"808000\",TivedBb:\"6b8e23\",Sange:\"ffa500\",SangeYd:\"ff4500\",ScEd:\"da70d6\",pOegTMnPd:\"eee8aa\",pOegYF:\"98fb98\",pOeQe:\"afeeee\",pOeviTetYd:\"db7093\",papayawEp:\"ffefd5\",pHKpuff:\"ffdab9\",peru:\"cd853f\",pRk:\"ffc0cb\",plum:\"dda0dd\",powMrXe:\"b0e0e6\",purpN:\"800080\",YbeccapurpN:\"663399\",Yd:\"ff0000\",Psybrown:\"bc8f8f\",PyOXe:\"4169e1\",saddNbPwn:\"8b4513\",sOmon:\"fa8072\",sandybPwn:\"f4a460\",sHgYF:\"2e8b57\",sHshell:\"fff5ee\",siFna:\"a0522d\",silver:\"c0c0c0\",skyXe:\"87ceeb\",UXe:\"6a5acd\",UWay:\"708090\",UgYy:\"708090\",snow:\"fffafa\",sprRggYF:\"ff7f\",stAlXe:\"4682b4\",tan:\"d2b48c\",teO:\"8080\",tEstN:\"d8bfd8\",tomato:\"ff6347\",Qe:\"40e0d0\",viTet:\"ee82ee\",JHt:\"f5deb3\",wEte:\"ffffff\",wEtesmoke:\"f5f5f5\",Lw:\"ffff00\",LwgYF:\"9acd32\"};let Ht;function jt(t){Ht||(Ht=function(){const t={},e=Object.keys(Wt),i=Object.keys(Nt);let s,n,o,a,r;for(s=0;s<e.length;s++){for(a=r=e[s],n=0;n<i.length;n++)o=i[n],r=r.replace(o,Nt[o]);o=parseInt(Wt[a],16),t[r]=[o>>16&255,o>>8&255,255&o]}return t}(),Ht.transparent=[0,0,0,0]);const e=Ht[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}const $t=/^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;const Yt=t=>t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055,Ut=t=>t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4);function Xt(t,e,i){if(t){let s=It(t);s[e]=Math.max(0,Math.min(s[e]+s[e]*i,0===e?360:1)),s=Ft(s),t.r=s[0],t.g=s[1],t.b=s[2]}}function qt(t,e){return t?Object.assign(e||{},t):t}function Kt(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=Mt(t[3]))):(e=qt(t,{r:0,g:0,b:0,a:1})).a=Mt(e.a),e}function Gt(t){return\"r\"===t.charAt(0)?function(t){const e=$t.exec(t);let i,s,n,o=255;if(e){if(e[7]!==i){const t=+e[7];o=e[8]?vt(t):yt(255*t,0,255)}return i=+e[1],s=+e[3],n=+e[5],i=255&(e[2]?vt(i):yt(i,0,255)),s=255&(e[4]?vt(s):yt(s,0,255)),n=255&(e[6]?vt(n):yt(n,0,255)),{r:i,g:s,b:n,a:o}}}(t):Bt(t)}class Zt{constructor(t){if(t instanceof Zt)return t;const e=typeof t;let i;var s,n,o;\"object\"===e?i=Kt(t):\"string\"===e&&(o=(s=t).length,\"#\"===s[0]&&(4===o||5===o?n={r:255&17*St[s[1]],g:255&17*St[s[2]],b:255&17*St[s[3]],a:5===o?17*St[s[4]]:255}:7!==o&&9!==o||(n={r:St[s[1]]<<4|St[s[2]],g:St[s[3]]<<4|St[s[4]],b:St[s[5]]<<4|St[s[6]],a:9===o?St[s[7]]<<4|St[s[8]]:255})),i=n||jt(t)||Gt(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=qt(this._rgb);return t&&(t.a=wt(t.a)),t}set rgb(t){this._rgb=Kt(t)}rgbString(){return this._valid?(t=this._rgb)&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${wt(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`):void 0;var t}hexString(){return this._valid?At(this._rgb):void 0}hslString(){return this._valid?function(t){if(!t)return;const e=It(t),i=e[0],s=kt(e[1]),n=kt(e[2]);return t.a<255?`hsla(${i}, ${s}%, ${n}%, ${wt(t.a)})`:`hsl(${i}, ${s}%, ${n}%)`}(this._rgb):void 0}mix(t,e){if(t){const i=this.rgb,s=t.rgb;let n;const o=e===n?.5:e,a=2*o-1,r=i.a-s.a,l=((a*r==-1?a:(a+r)/(1+a*r))+1)/2;n=1-l,i.r=255&l*i.r+n*s.r+.5,i.g=255&l*i.g+n*s.g+.5,i.b=255&l*i.b+n*s.b+.5,i.a=o*i.a+(1-o)*s.a,this.rgb=i}return this}interpolate(t,e){return t&&(this._rgb=function(t,e,i){const s=Ut(wt(t.r)),n=Ut(wt(t.g)),o=Ut(wt(t.b));return{r:Mt(Yt(s+i*(Ut(wt(e.r))-s))),g:Mt(Yt(n+i*(Ut(wt(e.g))-n))),b:Mt(Yt(o+i*(Ut(wt(e.b))-o))),a:t.a+i*(e.a-t.a)}}(this._rgb,t._rgb,e)),this}clone(){return new Zt(this.rgb)}alpha(t){return this._rgb.a=Mt(t),this}clearer(t){return this._rgb.a*=1-t,this}greyscale(){const t=this._rgb,e=_t(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){return this._rgb.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return Xt(this._rgb,2,t),this}darken(t){return Xt(this._rgb,2,-t),this}saturate(t){return Xt(this._rgb,1,t),this}desaturate(t){return Xt(this._rgb,1,-t),this}rotate(t){return function(t,e){var i=It(t);i[0]=Vt(i[0]+e),i=Ft(i),t.r=i[0],t.g=i[1],t.b=i[2]}(this._rgb,t),this}}function Jt(t){if(t&&\"object\"==typeof t){const e=t.toString();return\"[object CanvasPattern]\"===e||\"[object CanvasGradient]\"===e}return!1}function Qt(t){return Jt(t)?t:new Zt(t)}function te(t){return Jt(t)?t:new Zt(t).saturate(.5).darken(.1).hexString()}const ee=[\"x\",\"y\",\"borderWidth\",\"radius\",\"tension\"],ie=[\"color\",\"borderColor\",\"backgroundColor\"];const se=new Map;function ne(t,e,i){return function(t,e){e=e||{};const i=t+JSON.stringify(e);let s=se.get(i);return s||(s=new Intl.NumberFormat(t,e),se.set(i,s)),s}(e,i).format(t)}const oe={values:t=>n(t)?t:\"\"+t,numeric(t,e,i){if(0===t)return\"0\";const s=this.chart.options.locale;let n,o=t;if(i.length>1){const e=Math.max(Math.abs(i[0].value),Math.abs(i[i.length-1].value));(e<1e-4||e>1e15)&&(n=\"scientific\"),o=function(t,e){let i=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;Math.abs(i)>=1&&t!==Math.floor(t)&&(i=t-Math.floor(t));return i}(t,i)}const a=z(Math.abs(o)),r=Math.max(Math.min(-1*Math.floor(a),20),0),l={notation:n,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),ne(t,s,l)},logarithmic(t,e,i){if(0===t)return\"0\";const s=i[e].significand||t/Math.pow(10,Math.floor(z(t)));return[1,2,3,5,10,15].includes(s)||e>.8*i.length?oe.numeric.call(this,t,e,i):\"\"}};var ae={formatters:oe};const re=Object.create(null),le=Object.create(null);function he(t,e){if(!e)return t;const i=e.split(\".\");for(let e=0,s=i.length;e<s;++e){const s=i[e];t=t[s]||(t[s]=Object.create(null))}return t}function ce(t,e,i){return\"string\"==typeof e?b(he(t,e),i):b(he(t,\"\"),e)}class de{constructor(t,e){this.animation=void 0,this.backgroundColor=\"rgba(0,0,0,0.1)\",this.borderColor=\"rgba(0,0,0,0.1)\",this.color=\"#666\",this.datasets={},this.devicePixelRatio=t=>t.chart.platform.getDevicePixelRatio(),this.elements={},this.events=[\"mousemove\",\"mouseout\",\"click\",\"touchstart\",\"touchmove\"],this.font={family:\"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",size:12,style:\"normal\",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(t,e)=>te(e.backgroundColor),this.hoverBorderColor=(t,e)=>te(e.borderColor),this.hoverColor=(t,e)=>te(e.color),this.indexAxis=\"x\",this.interaction={mode:\"nearest\",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t),this.apply(e)}set(t,e){return ce(this,t,e)}get(t){return he(this,t)}describe(t,e){return ce(le,t,e)}override(t,e){return ce(re,t,e)}route(t,e,i,s){const n=he(this,t),a=he(this,i),r=\"_\"+e;Object.defineProperties(n,{[r]:{value:n[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[r],e=a[s];return o(t)?Object.assign({},e,t):l(t,e)},set(t){this[r]=t}}})}apply(t){t.forEach((t=>t(this)))}}var ue=new de({_scriptable:t=>!t.startsWith(\"on\"),_indexable:t=>\"events\"!==t,hover:{_fallback:\"interaction\"},interaction:{_scriptable:!1,_indexable:!1}},[function(t){t.set(\"animation\",{delay:void 0,duration:1e3,easing:\"easeOutQuart\",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),t.describe(\"animation\",{_fallback:!1,_indexable:!1,_scriptable:t=>\"onProgress\"!==t&&\"onComplete\"!==t&&\"fn\"!==t}),t.set(\"animations\",{colors:{type:\"color\",properties:ie},numbers:{type:\"number\",properties:ee}}),t.describe(\"animations\",{_fallback:\"animation\"}),t.set(\"transitions\",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:\"transparent\"},visible:{type:\"boolean\",duration:0}}},hide:{animations:{colors:{to:\"transparent\"},visible:{type:\"boolean\",easing:\"linear\",fn:t=>0|t}}}})},function(t){t.set(\"layout\",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})},function(t){t.set(\"scale\",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:\"ticks\",grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:\"\",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:\"\",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:ae.formatters.values,minor:{},major:{},align:\"center\",crossAlign:\"near\",showLabelBackdrop:!1,backdropColor:\"rgba(255, 255, 255, 0.75)\",backdropPadding:2}}),t.route(\"scale.ticks\",\"color\",\"\",\"color\"),t.route(\"scale.grid\",\"color\",\"\",\"borderColor\"),t.route(\"scale.border\",\"color\",\"\",\"borderColor\"),t.route(\"scale.title\",\"color\",\"\",\"color\"),t.describe(\"scale\",{_fallback:!1,_scriptable:t=>!t.startsWith(\"before\")&&!t.startsWith(\"after\")&&\"callback\"!==t&&\"parser\"!==t,_indexable:t=>\"borderDash\"!==t&&\"tickBorderDash\"!==t&&\"dash\"!==t}),t.describe(\"scales\",{_fallback:\"scale\"}),t.describe(\"scale.ticks\",{_scriptable:t=>\"backdropPadding\"!==t&&\"callback\"!==t,_indexable:t=>\"backdropPadding\"!==t})}]);function fe(){return\"undefined\"!=typeof window&&\"undefined\"!=typeof document}function ge(t){let e=t.parentNode;return e&&\"[object ShadowRoot]\"===e.toString()&&(e=e.host),e}function pe(t,e,i){let s;return\"string\"==typeof t?(s=parseInt(t,10),-1!==t.indexOf(\"%\")&&(s=s/100*e.parentNode[i])):s=t,s}const me=t=>t.ownerDocument.defaultView.getComputedStyle(t,null);function be(t,e){return me(t).getPropertyValue(e)}const xe=[\"top\",\"right\",\"bottom\",\"left\"];function _e(t,e,i){const s={};i=i?\"-\"+i:\"\";for(let n=0;n<4;n++){const o=xe[n];s[o]=parseFloat(t[e+\"-\"+o+i])||0}return s.width=s.left+s.right,s.height=s.top+s.bottom,s}function ye(t,e){if(\"native\"in t)return t;const{canvas:i,currentDevicePixelRatio:s}=e,n=me(i),o=\"border-box\"===n.boxSizing,a=_e(n,\"padding\"),r=_e(n,\"border\",\"width\"),{x:l,y:h,box:c}=function(t,e){const i=t.touches,s=i&&i.length?i[0]:t,{offsetX:n,offsetY:o}=s;let a,r,l=!1;if(((t,e,i)=>(t>0||e>0)&&(!i||!i.shadowRoot))(n,o,t.target))a=n,r=o;else{const t=e.getBoundingClientRect();a=s.clientX-t.left,r=s.clientY-t.top,l=!0}return{x:a,y:r,box:l}}(t,i),d=a.left+(c&&r.left),u=a.top+(c&&r.top);let{width:f,height:g}=e;return o&&(f-=a.width+r.width,g-=a.height+r.height),{x:Math.round((l-d)/f*i.width/s),y:Math.round((h-u)/g*i.height/s)}}const ve=t=>Math.round(10*t)/10;function Me(t,e,i,s){const n=me(t),o=_e(n,\"margin\"),a=pe(n.maxWidth,t,\"clientWidth\")||T,r=pe(n.maxHeight,t,\"clientHeight\")||T,l=function(t,e,i){let s,n;if(void 0===e||void 0===i){const o=ge(t);if(o){const t=o.getBoundingClientRect(),a=me(o),r=_e(a,\"border\",\"width\"),l=_e(a,\"padding\");e=t.width-l.width-r.width,i=t.height-l.height-r.height,s=pe(a.maxWidth,o,\"clientWidth\"),n=pe(a.maxHeight,o,\"clientHeight\")}else e=t.clientWidth,i=t.clientHeight}return{width:e,height:i,maxWidth:s||T,maxHeight:n||T}}(t,e,i);let{width:h,height:c}=l;if(\"content-box\"===n.boxSizing){const t=_e(n,\"border\",\"width\"),e=_e(n,\"padding\");h-=e.width+t.width,c-=e.height+t.height}h=Math.max(0,h-o.width),c=Math.max(0,s?h/s:c-o.height),h=ve(Math.min(h,a,l.maxWidth)),c=ve(Math.min(c,r,l.maxHeight)),h&&!c&&(c=ve(h/2));return(void 0!==e||void 0!==i)&&s&&l.height&&c>l.height&&(c=l.height,h=ve(Math.floor(c*s))),{width:h,height:c}}function we(t,e,i){const s=e||1,n=Math.floor(t.height*s),o=Math.floor(t.width*s);t.height=Math.floor(t.height),t.width=Math.floor(t.width);const a=t.canvas;return a.style&&(i||!a.style.height&&!a.style.width)&&(a.style.height=`${t.height}px`,a.style.width=`${t.width}px`),(t.currentDevicePixelRatio!==s||a.height!==n||a.width!==o)&&(t.currentDevicePixelRatio=s,a.height=n,a.width=o,t.ctx.setTransform(s,0,0,s,0,0),!0)}const ke=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};window.addEventListener(\"test\",null,e),window.removeEventListener(\"test\",null,e)}catch(t){}return t}();function Se(t,e){const i=be(t,e),s=i&&i.match(/^(\\d+)(\\.\\d+)?px$/);return s?+s[1]:void 0}function Pe(t){return!t||s(t.size)||s(t.family)?null:(t.style?t.style+\" \":\"\")+(t.weight?t.weight+\" \":\"\")+t.size+\"px \"+t.family}function De(t,e,i,s,n){let o=e[n];return o||(o=e[n]=t.measureText(n).width,i.push(n)),o>s&&(s=o),s}function Ce(t,e,i,s){let o=(s=s||{}).data=s.data||{},a=s.garbageCollect=s.garbageCollect||[];s.font!==e&&(o=s.data={},a=s.garbageCollect=[],s.font=e),t.save(),t.font=e;let r=0;const l=i.length;let h,c,d,u,f;for(h=0;h<l;h++)if(u=i[h],null!=u&&!0!==n(u))r=De(t,o,a,r,u);else if(n(u))for(c=0,d=u.length;c<d;c++)f=u[c],null==f||n(f)||(r=De(t,o,a,r,f));t.restore();const g=a.length/2;if(g>i.length){for(h=0;h<g;h++)delete o[a[h]];a.splice(0,g)}return r}function Oe(t,e,i){const s=t.currentDevicePixelRatio,n=0!==i?Math.max(i/2,.5):0;return Math.round((e-n)*s)/s+n}function Ae(t,e){(e=e||t.getContext(\"2d\")).save(),e.resetTransform(),e.clearRect(0,0,t.width,t.height),e.restore()}function Te(t,e,i,s){Le(t,e,i,s,null)}function Le(t,e,i,s,n){let o,a,r,l,h,c,d,u;const f=e.pointStyle,g=e.rotation,p=e.radius;let m=(g||0)*L;if(f&&\"object\"==typeof f&&(o=f.toString(),\"[object HTMLImageElement]\"===o||\"[object HTMLCanvasElement]\"===o))return t.save(),t.translate(i,s),t.rotate(m),t.drawImage(f,-f.width/2,-f.height/2,f.width,f.height),void t.restore();if(!(isNaN(p)||p<=0)){switch(t.beginPath(),f){default:n?t.ellipse(i,s,n/2,p,0,0,O):t.arc(i,s,p,0,O),t.closePath();break;case\"triangle\":c=n?n/2:p,t.moveTo(i+Math.sin(m)*c,s-Math.cos(m)*p),m+=I,t.lineTo(i+Math.sin(m)*c,s-Math.cos(m)*p),m+=I,t.lineTo(i+Math.sin(m)*c,s-Math.cos(m)*p),t.closePath();break;case\"rectRounded\":h=.516*p,l=p-h,a=Math.cos(m+R)*l,d=Math.cos(m+R)*(n?n/2-h:l),r=Math.sin(m+R)*l,u=Math.sin(m+R)*(n?n/2-h:l),t.arc(i-d,s-r,h,m-C,m-E),t.arc(i+u,s-a,h,m-E,m),t.arc(i+d,s+r,h,m,m+E),t.arc(i-u,s+a,h,m+E,m+C),t.closePath();break;case\"rect\":if(!g){l=Math.SQRT1_2*p,c=n?n/2:l,t.rect(i-c,s-l,2*c,2*l);break}m+=R;case\"rectRot\":d=Math.cos(m)*(n?n/2:p),a=Math.cos(m)*p,r=Math.sin(m)*p,u=Math.sin(m)*(n?n/2:p),t.moveTo(i-d,s-r),t.lineTo(i+u,s-a),t.lineTo(i+d,s+r),t.lineTo(i-u,s+a),t.closePath();break;case\"crossRot\":m+=R;case\"cross\":d=Math.cos(m)*(n?n/2:p),a=Math.cos(m)*p,r=Math.sin(m)*p,u=Math.sin(m)*(n?n/2:p),t.moveTo(i-d,s-r),t.lineTo(i+d,s+r),t.moveTo(i+u,s-a),t.lineTo(i-u,s+a);break;case\"star\":d=Math.cos(m)*(n?n/2:p),a=Math.cos(m)*p,r=Math.sin(m)*p,u=Math.sin(m)*(n?n/2:p),t.moveTo(i-d,s-r),t.lineTo(i+d,s+r),t.moveTo(i+u,s-a),t.lineTo(i-u,s+a),m+=R,d=Math.cos(m)*(n?n/2:p),a=Math.cos(m)*p,r=Math.sin(m)*p,u=Math.sin(m)*(n?n/2:p),t.moveTo(i-d,s-r),t.lineTo(i+d,s+r),t.moveTo(i+u,s-a),t.lineTo(i-u,s+a);break;case\"line\":a=n?n/2:Math.cos(m)*p,r=Math.sin(m)*p,t.moveTo(i-a,s-r),t.lineTo(i+a,s+r);break;case\"dash\":t.moveTo(i,s),t.lineTo(i+Math.cos(m)*(n?n/2:p),s+Math.sin(m)*p);break;case!1:t.closePath()}t.fill(),e.borderWidth>0&&t.stroke()}}function Ee(t,e,i){return i=i||.5,!e||t&&t.x>e.left-i&&t.x<e.right+i&&t.y>e.top-i&&t.y<e.bottom+i}function Re(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()}function Ie(t){t.restore()}function ze(t,e,i,s,n){if(!e)return t.lineTo(i.x,i.y);if(\"middle\"===n){const s=(e.x+i.x)/2;t.lineTo(s,e.y),t.lineTo(s,i.y)}else\"after\"===n!=!!s?t.lineTo(e.x,i.y):t.lineTo(i.x,e.y);t.lineTo(i.x,i.y)}function Fe(t,e,i,s){if(!e)return t.lineTo(i.x,i.y);t.bezierCurveTo(s?e.cp1x:e.cp2x,s?e.cp1y:e.cp2y,s?i.cp2x:i.cp1x,s?i.cp2y:i.cp1y,i.x,i.y)}function Ve(t,e,i,o,a,r={}){const l=n(e)?e:[e],h=r.strokeWidth>0&&\"\"!==r.strokeColor;let c,d;for(t.save(),t.font=a.string,function(t,e){e.translation&&t.translate(e.translation[0],e.translation[1]);s(e.rotation)||t.rotate(e.rotation);e.color&&(t.fillStyle=e.color);e.textAlign&&(t.textAlign=e.textAlign);e.textBaseline&&(t.textBaseline=e.textBaseline)}(t,r),c=0;c<l.length;++c)d=l[c],r.backdrop&&Ne(t,r.backdrop),h&&(r.strokeColor&&(t.strokeStyle=r.strokeColor),s(r.strokeWidth)||(t.lineWidth=r.strokeWidth),t.strokeText(d,i,o,r.maxWidth)),t.fillText(d,i,o,r.maxWidth),Be(t,i,o,d,r),o+=a.lineHeight;t.restore()}function Be(t,e,i,s,n){if(n.strikethrough||n.underline){const o=t.measureText(s),a=e-o.actualBoundingBoxLeft,r=e+o.actualBoundingBoxRight,l=i-o.actualBoundingBoxAscent,h=i+o.actualBoundingBoxDescent,c=n.strikethrough?(l+h)/2:h;t.strokeStyle=t.fillStyle,t.beginPath(),t.lineWidth=n.decorationWidth||2,t.moveTo(a,c),t.lineTo(r,c),t.stroke()}}function Ne(t,e){const i=t.fillStyle;t.fillStyle=e.color,t.fillRect(e.left,e.top,e.width,e.height),t.fillStyle=i}function We(t,e){const{x:i,y:s,w:n,h:o,radius:a}=e;t.arc(i+a.topLeft,s+a.topLeft,a.topLeft,-E,C,!0),t.lineTo(i,s+o-a.bottomLeft),t.arc(i+a.bottomLeft,s+o-a.bottomLeft,a.bottomLeft,C,E,!0),t.lineTo(i+n-a.bottomRight,s+o),t.arc(i+n-a.bottomRight,s+o-a.bottomRight,a.bottomRight,E,0,!0),t.lineTo(i+n,s+a.topRight),t.arc(i+n-a.topRight,s+a.topRight,a.topRight,0,-E,!0),t.lineTo(i+a.topLeft,s)}function He(t,e=[\"\"],i=t,s,n=(()=>t[0])){k(s)||(s=Qe(\"_fallback\",t));const o={[Symbol.toStringTag]:\"Object\",_cacheable:!0,_scopes:t,_rootScopes:i,_fallback:s,_getTarget:n,override:n=>He([n,...t],e,i,s)};return new Proxy(o,{deleteProperty:(e,i)=>(delete e[i],delete e._keys,delete t[0][i],!0),get:(i,s)=>Xe(i,s,(()=>function(t,e,i,s){let n;for(const o of e)if(n=Qe(Ye(o,t),i),k(n))return Ue(t,n)?Ze(i,s,t,n):n}(s,e,t,i))),getOwnPropertyDescriptor:(t,e)=>Reflect.getOwnPropertyDescriptor(t._scopes[0],e),getPrototypeOf:()=>Reflect.getPrototypeOf(t[0]),has:(t,e)=>ti(t).includes(e),ownKeys:t=>ti(t),set(t,e,i){const s=t._storage||(t._storage=n());return t[e]=s[e]=i,delete t._keys,!0}})}function je(t,e,i,s){const a={_cacheable:!1,_proxy:t,_context:e,_subProxy:i,_stack:new Set,_descriptors:$e(t,s),setContext:e=>je(t,e,i,s),override:n=>je(t.override(n),e,i,s)};return new Proxy(a,{deleteProperty:(e,i)=>(delete e[i],delete t[i],!0),get:(t,e,i)=>Xe(t,e,(()=>function(t,e,i){const{_proxy:s,_context:a,_subProxy:r,_descriptors:l}=t;let h=s[e];S(h)&&l.isScriptable(e)&&(h=function(t,e,i,s){const{_proxy:n,_context:o,_subProxy:a,_stack:r}=i;if(r.has(t))throw new Error(\"Recursion detected: \"+Array.from(r).join(\"->\")+\"->\"+t);r.add(t),e=e(o,a||s),r.delete(t),Ue(t,e)&&(e=Ze(n._scopes,n,t,e));return e}(e,h,t,i));n(h)&&h.length&&(h=function(t,e,i,s){const{_proxy:n,_context:a,_subProxy:r,_descriptors:l}=i;if(k(a.index)&&s(t))e=e[a.index%e.length];else if(o(e[0])){const i=e,s=n._scopes.filter((t=>t!==i));e=[];for(const o of i){const i=Ze(s,n,t,o);e.push(je(i,a,r&&r[t],l))}}return e}(e,h,t,l.isIndexable));Ue(e,h)&&(h=je(h,a,r&&r[e],l));return h}(t,e,i))),getOwnPropertyDescriptor:(e,i)=>e._descriptors.allKeys?Reflect.has(t,i)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,i),getPrototypeOf:()=>Reflect.getPrototypeOf(t),has:(e,i)=>Reflect.has(t,i),ownKeys:()=>Reflect.ownKeys(t),set:(e,i,s)=>(t[i]=s,delete e[i],!0)})}function $e(t,e={scriptable:!0,indexable:!0}){const{_scriptable:i=e.scriptable,_indexable:s=e.indexable,_allKeys:n=e.allKeys}=t;return{allKeys:n,scriptable:i,indexable:s,isScriptable:S(i)?i:()=>i,isIndexable:S(s)?s:()=>s}}const Ye=(t,e)=>t?t+w(e):e,Ue=(t,e)=>o(e)&&\"adapters\"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object);function Xe(t,e,i){if(Object.prototype.hasOwnProperty.call(t,e))return t[e];const s=i();return t[e]=s,s}function qe(t,e,i){return S(t)?t(e,i):t}const Ke=(t,e)=>!0===t?e:\"string\"==typeof t?M(e,t):void 0;function Ge(t,e,i,s,n){for(const o of e){const e=Ke(i,o);if(e){t.add(e);const o=qe(e._fallback,i,n);if(k(o)&&o!==i&&o!==s)return o}else if(!1===e&&k(s)&&i!==s)return null}return!1}function Ze(t,e,i,s){const a=e._rootScopes,r=qe(e._fallback,i,s),l=[...t,...a],h=new Set;h.add(s);let c=Je(h,l,i,r||i,s);return null!==c&&((!k(r)||r===i||(c=Je(h,l,r,c,s),null!==c))&&He(Array.from(h),[\"\"],a,r,(()=>function(t,e,i){const s=t._getTarget();e in s||(s[e]={});const a=s[e];if(n(a)&&o(i))return i;return a||{}}(e,i,s))))}function Je(t,e,i,s,n){for(;i;)i=Ge(t,e,i,s,n);return i}function Qe(t,e){for(const i of e){if(!i)continue;const e=i[t];if(k(e))return e}}function ti(t){let e=t._keys;return e||(e=t._keys=function(t){const e=new Set;for(const i of t)for(const t of Object.keys(i).filter((t=>!t.startsWith(\"_\"))))e.add(t);return Array.from(e)}(t._scopes)),e}function ei(t,e,i,s){const{iScale:n}=t,{key:o=\"r\"}=this._parsing,a=new Array(s);let r,l,h,c;for(r=0,l=s;r<l;++r)h=r+i,c=e[h],a[r]={r:n.parse(M(c,o),h)};return a}const ii=Number.EPSILON||1e-14,si=(t,e)=>e<t.length&&!t[e].skip&&t[e],ni=t=>\"x\"===t?\"y\":\"x\";function oi(t,e,i,s){const n=t.skip?e:t,o=e,a=i.skip?e:i,r=q(o,n),l=q(a,o);let h=r/(r+l),c=l/(r+l);h=isNaN(h)?0:h,c=isNaN(c)?0:c;const d=s*h,u=s*c;return{previous:{x:o.x-d*(a.x-n.x),y:o.y-d*(a.y-n.y)},next:{x:o.x+u*(a.x-n.x),y:o.y+u*(a.y-n.y)}}}function ai(t,e=\"x\"){const i=ni(e),s=t.length,n=Array(s).fill(0),o=Array(s);let a,r,l,h=si(t,0);for(a=0;a<s;++a)if(r=l,l=h,h=si(t,a+1),l){if(h){const t=h[e]-l[e];n[a]=0!==t?(h[i]-l[i])/t:0}o[a]=r?h?F(n[a-1])!==F(n[a])?0:(n[a-1]+n[a])/2:n[a-1]:n[a]}!function(t,e,i){const s=t.length;let n,o,a,r,l,h=si(t,0);for(let c=0;c<s-1;++c)l=h,h=si(t,c+1),l&&h&&(V(e[c],0,ii)?i[c]=i[c+1]=0:(n=i[c]/e[c],o=i[c+1]/e[c],r=Math.pow(n,2)+Math.pow(o,2),r<=9||(a=3/Math.sqrt(r),i[c]=n*a*e[c],i[c+1]=o*a*e[c])))}(t,n,o),function(t,e,i=\"x\"){const s=ni(i),n=t.length;let o,a,r,l=si(t,0);for(let h=0;h<n;++h){if(a=r,r=l,l=si(t,h+1),!r)continue;const n=r[i],c=r[s];a&&(o=(n-a[i])/3,r[`cp1${i}`]=n-o,r[`cp1${s}`]=c-o*e[h]),l&&(o=(l[i]-n)/3,r[`cp2${i}`]=n+o,r[`cp2${s}`]=c+o*e[h])}}(t,o,e)}function ri(t,e,i){return Math.max(Math.min(t,i),e)}function li(t,e,i,s,n){let o,a,r,l;if(e.spanGaps&&(t=t.filter((t=>!t.skip))),\"monotone\"===e.cubicInterpolationMode)ai(t,n);else{let i=s?t[t.length-1]:t[0];for(o=0,a=t.length;o<a;++o)r=t[o],l=oi(i,r,t[Math.min(o+1,a-(s?0:1))%a],e.tension),r.cp1x=l.previous.x,r.cp1y=l.previous.y,r.cp2x=l.next.x,r.cp2y=l.next.y,i=r}e.capBezierPoints&&function(t,e){let i,s,n,o,a,r=Ee(t[0],e);for(i=0,s=t.length;i<s;++i)a=o,o=r,r=i<s-1&&Ee(t[i+1],e),o&&(n=t[i],a&&(n.cp1x=ri(n.cp1x,e.left,e.right),n.cp1y=ri(n.cp1y,e.top,e.bottom)),r&&(n.cp2x=ri(n.cp2x,e.left,e.right),n.cp2y=ri(n.cp2y,e.top,e.bottom)))}(t,i)}const hi=t=>0===t||1===t,ci=(t,e,i)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*O/i),di=(t,e,i)=>Math.pow(2,-10*t)*Math.sin((t-e)*O/i)+1,ui={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2),easeInSine:t=>1-Math.cos(t*E),easeOutSine:t=>Math.sin(t*E),easeInOutSine:t=>-.5*(Math.cos(C*t)-1),easeInExpo:t=>0===t?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>hi(t)?t:t<.5?.5*Math.pow(2,10*(2*t-1)):.5*(2-Math.pow(2,-10*(2*t-1))),easeInCirc:t=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>hi(t)?t:ci(t,.075,.3),easeOutElastic:t=>hi(t)?t:di(t,.075,.3),easeInOutElastic(t){const e=.1125;return hi(t)?t:t<.5?.5*ci(2*t,e,.45):.5+.5*di(2*t-1,e,.45)},easeInBack(t){const e=1.70158;return t*t*((e+1)*t-e)},easeOutBack(t){const e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack(t){let e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:t=>1-ui.easeOutBounce(1-t),easeOutBounce(t){const e=7.5625,i=2.75;return t<1/i?e*t*t:t<2/i?e*(t-=1.5/i)*t+.75:t<2.5/i?e*(t-=2.25/i)*t+.9375:e*(t-=2.625/i)*t+.984375},easeInOutBounce:t=>t<.5?.5*ui.easeInBounce(2*t):.5*ui.easeOutBounce(2*t-1)+.5};function fi(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:t.y+i*(e.y-t.y)}}function gi(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:\"middle\"===s?i<.5?t.y:e.y:\"after\"===s?i<1?t.y:e.y:i>0?e.y:t.y}}function pi(t,e,i,s){const n={x:t.cp2x,y:t.cp2y},o={x:e.cp1x,y:e.cp1y},a=fi(t,n,i),r=fi(n,o,i),l=fi(o,e,i),h=fi(a,r,i),c=fi(r,l,i);return fi(h,c,i)}const mi=/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/,bi=/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;function xi(t,e){const i=(\"\"+t).match(mi);if(!i||\"normal\"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case\"px\":return t;case\"%\":t/=100}return e*t}function _i(t,e){const i={},s=o(e),n=s?Object.keys(e):e,a=o(t)?s?i=>l(t[i],t[e[i]]):e=>t[e]:()=>t;for(const t of n)i[t]=+a(t)||0;return i}function yi(t){return _i(t,{top:\"y\",right:\"x\",bottom:\"y\",left:\"x\"})}function vi(t){return _i(t,[\"topLeft\",\"topRight\",\"bottomLeft\",\"bottomRight\"])}function Mi(t){const e=yi(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function wi(t,e){t=t||{},e=e||ue.font;let i=l(t.size,e.size);\"string\"==typeof i&&(i=parseInt(i,10));let s=l(t.style,e.style);s&&!(\"\"+s).match(bi)&&(console.warn('Invalid font style specified: \"'+s+'\"'),s=void 0);const n={family:l(t.family,e.family),lineHeight:xi(l(t.lineHeight,e.lineHeight),i),size:i,style:s,weight:l(t.weight,e.weight),string:\"\"};return n.string=Pe(n),n}function ki(t,e,i,s){let o,a,r,l=!0;for(o=0,a=t.length;o<a;++o)if(r=t[o],void 0!==r&&(void 0!==e&&\"function\"==typeof r&&(r=r(e),l=!1),void 0!==i&&n(r)&&(r=r[i%r.length],l=!1),void 0!==r))return s&&!l&&(s.cacheable=!1),r}function Si(t,e,i){const{min:s,max:n}=t,o=c(e,(n-s)/2),a=(t,e)=>i&&0===t?0:t+e;return{min:a(s,-Math.abs(o)),max:a(n,o)}}function Pi(t,e){return Object.assign(Object.create(t),e)}function Di(t,e,i){return t?function(t,e){return{x:i=>t+t+e-i,setWidth(t){e=t},textAlign:t=>\"center\"===t?t:\"right\"===t?\"left\":\"right\",xPlus:(t,e)=>t-e,leftForLtr:(t,e)=>t-e}}(e,i):{x:t=>t,setWidth(t){},textAlign:t=>t,xPlus:(t,e)=>t+e,leftForLtr:(t,e)=>t}}function Ci(t,e){let i,s;\"ltr\"!==e&&\"rtl\"!==e||(i=t.canvas.style,s=[i.getPropertyValue(\"direction\"),i.getPropertyPriority(\"direction\")],i.setProperty(\"direction\",e,\"important\"),t.prevTextDirection=s)}function Oi(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty(\"direction\",e[0],e[1]))}function Ai(t){return\"angle\"===t?{between:Z,compare:K,normalize:G}:{between:tt,compare:(t,e)=>t-e,normalize:t=>t}}function Ti({start:t,end:e,count:i,loop:s,style:n}){return{start:t%i,end:e%i,loop:s&&(e-t+1)%i==0,style:n}}function Li(t,e,i){if(!i)return[t];const{property:s,start:n,end:o}=i,a=e.length,{compare:r,between:l,normalize:h}=Ai(s),{start:c,end:d,loop:u,style:f}=function(t,e,i){const{property:s,start:n,end:o}=i,{between:a,normalize:r}=Ai(s),l=e.length;let h,c,{start:d,end:u,loop:f}=t;if(f){for(d+=l,u+=l,h=0,c=l;h<c&&a(r(e[d%l][s]),n,o);++h)d--,u--;d%=l,u%=l}return u<d&&(u+=l),{start:d,end:u,loop:f,style:t.style}}(t,e,i),g=[];let p,m,b,x=!1,_=null;const y=()=>x||l(n,b,p)&&0!==r(n,b),v=()=>!x||0===r(o,p)||l(o,b,p);for(let t=c,i=c;t<=d;++t)m=e[t%a],m.skip||(p=h(m[s]),p!==b&&(x=l(p,n,o),null===_&&y()&&(_=0===r(p,n)?t:i),null!==_&&v()&&(g.push(Ti({start:_,end:t,loop:u,count:a,style:f})),_=null),i=t,b=p));return null!==_&&g.push(Ti({start:_,end:d,loop:u,count:a,style:f})),g}function Ei(t,e){const i=[],s=t.segments;for(let n=0;n<s.length;n++){const o=Li(s[n],t.points,e);o.length&&i.push(...o)}return i}function Ri(t,e){const i=t.points,s=t.options.spanGaps,n=i.length;if(!n)return[];const o=!!t._loop,{start:a,end:r}=function(t,e,i,s){let n=0,o=e-1;if(i&&!s)for(;n<e&&!t[n].skip;)n++;for(;n<e&&t[n].skip;)n++;for(n%=e,i&&(o+=n);o>n&&t[o%e].skip;)o--;return o%=e,{start:n,end:o}}(i,n,o,s);if(!0===s)return Ii(t,[{start:a,end:r,loop:o}],i,e);return Ii(t,function(t,e,i,s){const n=t.length,o=[];let a,r=e,l=t[e];for(a=e+1;a<=i;++a){const i=t[a%n];i.skip||i.stop?l.skip||(s=!1,o.push({start:e%n,end:(a-1)%n,loop:s}),e=r=i.stop?a:null):(r=a,l.skip&&(e=a)),l=i}return null!==r&&o.push({start:e%n,end:r%n,loop:s}),o}(i,a,r<a?r+n:r,!!t._fullLoop&&0===a&&r===n-1),i,e)}function Ii(t,e,i,s){return s&&s.setContext&&i?function(t,e,i,s){const n=t._chart.getContext(),o=zi(t.options),{_datasetIndex:a,options:{spanGaps:r}}=t,l=i.length,h=[];let c=o,d=e[0].start,u=d;function f(t,e,s,n){const o=r?-1:1;if(t!==e){for(t+=l;i[t%l].skip;)t-=o;for(;i[e%l].skip;)e+=o;t%l!=e%l&&(h.push({start:t%l,end:e%l,loop:s,style:n}),c=n,d=e%l)}}for(const t of e){d=r?d:t.start;let e,o=i[d%l];for(u=d+1;u<=t.end;u++){const r=i[u%l];e=zi(s.setContext(Pi(n,{type:\"segment\",p0:o,p1:r,p0DataIndex:(u-1)%l,p1DataIndex:u%l,datasetIndex:a}))),Fi(e,c)&&f(d,u-1,t.loop,c),o=r,c=e}d<u-1&&f(d,u-1,t.loop,c)}return h}(t,e,i,s):e}function zi(t){return{backgroundColor:t.backgroundColor,borderCapStyle:t.borderCapStyle,borderDash:t.borderDash,borderDashOffset:t.borderDashOffset,borderJoinStyle:t.borderJoinStyle,borderWidth:t.borderWidth,borderColor:t.borderColor}}function Fi(t,e){return e&&JSON.stringify(t)!==JSON.stringify(e)}var Vi=Object.freeze({__proto__:null,easingEffects:ui,isPatternOrGradient:Jt,color:Qt,getHoverColor:te,noop:e,uid:i,isNullOrUndef:s,isArray:n,isObject:o,isFinite:a,finiteOrDefault:r,valueOrDefault:l,toPercentage:h,toDimension:c,callback:d,each:u,_elementsEqual:f,clone:g,_merger:m,merge:b,mergeIf:x,_mergerIf:_,_deprecated:function(t,e,i,s){void 0!==e&&console.warn(t+': \"'+i+'\" is deprecated. Please use \"'+s+'\" instead')},_splitKey:v,resolveObjectKey:M,_capitalize:w,defined:k,isFunction:S,setsEqual:P,_isClickEvent:D,toFontString:Pe,_measureText:De,_longestText:Ce,_alignPixel:Oe,clearCanvas:Ae,drawPoint:Te,drawPointLegend:Le,_isPointInArea:Ee,clipArea:Re,unclipArea:Ie,_steppedLineTo:ze,_bezierCurveTo:Fe,renderText:Ve,addRoundedRectPath:We,_lookup:et,_lookupByKey:it,_rlookupByKey:st,_filterBetween:nt,listenArrayEvents:at,unlistenArrayEvents:rt,_arrayUnique:lt,_createResolver:He,_attachContext:je,_descriptors:$e,_parseObjectDataRadialScale:ei,splineCurve:oi,splineCurveMonotone:ai,_updateBezierControlPoints:li,_isDomSupported:fe,_getParentNode:ge,getStyle:be,getRelativePosition:ye,getMaximumSize:Me,retinaScale:we,supportsEventListenerOptions:ke,readUsedSize:Se,fontString:function(t,e,i){return e+\" \"+t+\"px \"+i},requestAnimFrame:ht,throttled:ct,debounce:dt,_toLeftRightCenter:ut,_alignStartEnd:ft,_textX:gt,_getStartAndCountOfVisiblePoints:pt,_scaleRangesChanged:mt,_pointInLine:fi,_steppedInterpolation:gi,_bezierInterpolation:pi,formatNumber:ne,toLineHeight:xi,_readValueToProps:_i,toTRBL:yi,toTRBLCorners:vi,toPadding:Mi,toFont:wi,resolve:ki,_addGrace:Si,createContext:Pi,PI:C,TAU:O,PITAU:A,INFINITY:T,RAD_PER_DEG:L,HALF_PI:E,QUARTER_PI:R,TWO_THIRDS_PI:I,log10:z,sign:F,almostEquals:V,niceNum:B,_factorize:N,isNumber:W,almostWhole:H,_setMinAndMaxByKey:j,toRadians:$,toDegrees:Y,_decimalPlaces:U,getAngleFromPoint:X,distanceBetweenPoints:q,_angleDiff:K,_normalizeAngle:G,_angleBetween:Z,_limitValue:J,_int16Range:Q,_isBetween:tt,getRtlAdapter:Di,overrideTextDirection:Ci,restoreTextDirection:Oi,_boundSegment:Li,_boundSegments:Ei,_computeSegments:Ri});function Bi(t,e,i,s){const{controller:n,data:o,_sorted:a}=t,r=n._cachedMeta.iScale;if(r&&e===r.axis&&\"r\"!==e&&a&&o.length){const t=r._reversePixels?st:it;if(!s)return t(o,e,i);if(n._sharedOptions){const s=o[0],n=\"function\"==typeof s.getRange&&s.getRange(e);if(n){const s=t(o,e,i-n),a=t(o,e,i+n);return{lo:s.lo,hi:a.hi}}}}return{lo:0,hi:o.length-1}}function Ni(t,e,i,s,n){const o=t.getSortedVisibleDatasetMetas(),a=i[e];for(let t=0,i=o.length;t<i;++t){const{index:i,data:r}=o[t],{lo:l,hi:h}=Bi(o[t],e,a,n);for(let t=l;t<=h;++t){const e=r[t];e.skip||s(e,i,t)}}}function Wi(t,e,i,s,n){const o=[];if(!n&&!t.isPointInArea(e))return o;return Ni(t,i,e,(function(i,a,r){(n||Ee(i,t.chartArea,0))&&i.inRange(e.x,e.y,s)&&o.push({element:i,datasetIndex:a,index:r})}),!0),o}function Hi(t,e,i,s,n,o){let a=[];const r=function(t){const e=-1!==t.indexOf(\"x\"),i=-1!==t.indexOf(\"y\");return function(t,s){const n=e?Math.abs(t.x-s.x):0,o=i?Math.abs(t.y-s.y):0;return Math.sqrt(Math.pow(n,2)+Math.pow(o,2))}}(i);let l=Number.POSITIVE_INFINITY;return Ni(t,i,e,(function(i,h,c){const d=i.inRange(e.x,e.y,n);if(s&&!d)return;const u=i.getCenterPoint(n);if(!(!!o||t.isPointInArea(u))&&!d)return;const f=r(e,u);f<l?(a=[{element:i,datasetIndex:h,index:c}],l=f):f===l&&a.push({element:i,datasetIndex:h,index:c})})),a}function ji(t,e,i,s,n,o){return o||t.isPointInArea(e)?\"r\"!==i||s?Hi(t,e,i,s,n,o):function(t,e,i,s){let n=[];return Ni(t,i,e,(function(t,i,o){const{startAngle:a,endAngle:r}=t.getProps([\"startAngle\",\"endAngle\"],s),{angle:l}=X(t,{x:e.x,y:e.y});Z(l,a,r)&&n.push({element:t,datasetIndex:i,index:o})})),n}(t,e,i,n):[]}function $i(t,e,i,s,n){const o=[],a=\"x\"===i?\"inXRange\":\"inYRange\";let r=!1;return Ni(t,i,e,((t,s,l)=>{t[a](e[i],n)&&(o.push({element:t,datasetIndex:s,index:l}),r=r||t.inRange(e.x,e.y,n))})),s&&!r?[]:o}var Yi={evaluateInteractionItems:Ni,modes:{index(t,e,i,s){const n=ye(e,t),o=i.axis||\"x\",a=i.includeInvisible||!1,r=i.intersect?Wi(t,n,o,s,a):ji(t,n,o,!1,s,a),l=[];return r.length?(t.getSortedVisibleDatasetMetas().forEach((t=>{const e=r[0].index,i=t.data[e];i&&!i.skip&&l.push({element:i,datasetIndex:t.index,index:e})})),l):[]},dataset(t,e,i,s){const n=ye(e,t),o=i.axis||\"xy\",a=i.includeInvisible||!1;let r=i.intersect?Wi(t,n,o,s,a):ji(t,n,o,!1,s,a);if(r.length>0){const e=r[0].datasetIndex,i=t.getDatasetMeta(e).data;r=[];for(let t=0;t<i.length;++t)r.push({element:i[t],datasetIndex:e,index:t})}return r},point:(t,e,i,s)=>Wi(t,ye(e,t),i.axis||\"xy\",s,i.includeInvisible||!1),nearest(t,e,i,s){const n=ye(e,t),o=i.axis||\"xy\",a=i.includeInvisible||!1;return ji(t,n,o,i.intersect,s,a)},x:(t,e,i,s)=>$i(t,ye(e,t),\"x\",i.intersect,s),y:(t,e,i,s)=>$i(t,ye(e,t),\"y\",i.intersect,s)}};const Ui=[\"left\",\"top\",\"right\",\"bottom\"];function Xi(t,e){return t.filter((t=>t.pos===e))}function qi(t,e){return t.filter((t=>-1===Ui.indexOf(t.pos)&&t.box.axis===e))}function Ki(t,e){return t.sort(((t,i)=>{const s=e?i:t,n=e?t:i;return s.weight===n.weight?s.index-n.index:s.weight-n.weight}))}function Gi(t,e){const i=function(t){const e={};for(const i of t){const{stack:t,pos:s,stackWeight:n}=i;if(!t||!Ui.includes(s))continue;const o=e[t]||(e[t]={count:0,placed:0,weight:0,size:0});o.count++,o.weight+=n}return e}(t),{vBoxMaxWidth:s,hBoxMaxHeight:n}=e;let o,a,r;for(o=0,a=t.length;o<a;++o){r=t[o];const{fullSize:a}=r.box,l=i[r.stack],h=l&&r.stackWeight/l.weight;r.horizontal?(r.width=h?h*s:a&&e.availableWidth,r.height=n):(r.width=s,r.height=h?h*n:a&&e.availableHeight)}return i}function Zi(t,e,i,s){return Math.max(t[i],e[i])+Math.max(t[s],e[s])}function Ji(t,e){t.top=Math.max(t.top,e.top),t.left=Math.max(t.left,e.left),t.bottom=Math.max(t.bottom,e.bottom),t.right=Math.max(t.right,e.right)}function Qi(t,e,i,s){const{pos:n,box:a}=i,r=t.maxPadding;if(!o(n)){i.size&&(t[n]-=i.size);const e=s[i.stack]||{size:0,count:1};e.size=Math.max(e.size,i.horizontal?a.height:a.width),i.size=e.size/e.count,t[n]+=i.size}a.getPadding&&Ji(r,a.getPadding());const l=Math.max(0,e.outerWidth-Zi(r,t,\"left\",\"right\")),h=Math.max(0,e.outerHeight-Zi(r,t,\"top\",\"bottom\")),c=l!==t.w,d=h!==t.h;return t.w=l,t.h=h,i.horizontal?{same:c,other:d}:{same:d,other:c}}function ts(t,e){const i=e.maxPadding;function s(t){const s={left:0,top:0,right:0,bottom:0};return t.forEach((t=>{s[t]=Math.max(e[t],i[t])})),s}return s(t?[\"left\",\"right\"]:[\"top\",\"bottom\"])}function es(t,e,i,s){const n=[];let o,a,r,l,h,c;for(o=0,a=t.length,h=0;o<a;++o){r=t[o],l=r.box,l.update(r.width||e.w,r.height||e.h,ts(r.horizontal,e));const{same:a,other:d}=Qi(e,i,r,s);h|=a&&n.length,c=c||d,l.fullSize||n.push(r)}return h&&es(n,e,i,s)||c}function is(t,e,i,s,n){t.top=i,t.left=e,t.right=e+s,t.bottom=i+n,t.width=s,t.height=n}function ss(t,e,i,s){const n=i.padding;let{x:o,y:a}=e;for(const r of t){const t=r.box,l=s[r.stack]||{count:1,placed:0,weight:1},h=r.stackWeight/l.weight||1;if(r.horizontal){const s=e.w*h,o=l.size||t.height;k(l.start)&&(a=l.start),t.fullSize?is(t,n.left,a,i.outerWidth-n.right-n.left,o):is(t,e.left+l.placed,a,s,o),l.start=a,l.placed+=s,a=t.bottom}else{const s=e.h*h,a=l.size||t.width;k(l.start)&&(o=l.start),t.fullSize?is(t,o,n.top,a,i.outerHeight-n.bottom-n.top):is(t,o,e.top+l.placed,a,s),l.start=o,l.placed+=s,o=t.right}}e.x=o,e.y=a}var ns={addBox(t,e){t.boxes||(t.boxes=[]),e.fullSize=e.fullSize||!1,e.position=e.position||\"top\",e.weight=e.weight||0,e._layers=e._layers||function(){return[{z:0,draw(t){e.draw(t)}}]},t.boxes.push(e)},removeBox(t,e){const i=t.boxes?t.boxes.indexOf(e):-1;-1!==i&&t.boxes.splice(i,1)},configure(t,e,i){e.fullSize=i.fullSize,e.position=i.position,e.weight=i.weight},update(t,e,i,s){if(!t)return;const n=Mi(t.options.layout.padding),o=Math.max(e-n.width,0),a=Math.max(i-n.height,0),r=function(t){const e=function(t){const e=[];let i,s,n,o,a,r;for(i=0,s=(t||[]).length;i<s;++i)n=t[i],({position:o,options:{stack:a,stackWeight:r=1}}=n),e.push({index:i,box:n,pos:o,horizontal:n.isHorizontal(),weight:n.weight,stack:a&&o+a,stackWeight:r});return e}(t),i=Ki(e.filter((t=>t.box.fullSize)),!0),s=Ki(Xi(e,\"left\"),!0),n=Ki(Xi(e,\"right\")),o=Ki(Xi(e,\"top\"),!0),a=Ki(Xi(e,\"bottom\")),r=qi(e,\"x\"),l=qi(e,\"y\");return{fullSize:i,leftAndTop:s.concat(o),rightAndBottom:n.concat(l).concat(a).concat(r),chartArea:Xi(e,\"chartArea\"),vertical:s.concat(n).concat(l),horizontal:o.concat(a).concat(r)}}(t.boxes),l=r.vertical,h=r.horizontal;u(t.boxes,(t=>{\"function\"==typeof t.beforeLayout&&t.beforeLayout()}));const c=l.reduce(((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1),0)||1,d=Object.freeze({outerWidth:e,outerHeight:i,padding:n,availableWidth:o,availableHeight:a,vBoxMaxWidth:o/2/c,hBoxMaxHeight:a/2}),f=Object.assign({},n);Ji(f,Mi(s));const g=Object.assign({maxPadding:f,w:o,h:a,x:n.left,y:n.top},n),p=Gi(l.concat(h),d);es(r.fullSize,g,d,p),es(l,g,d,p),es(h,g,d,p)&&es(l,g,d,p),function(t){const e=t.maxPadding;function i(i){const s=Math.max(e[i]-t[i],0);return t[i]+=s,s}t.y+=i(\"top\"),t.x+=i(\"left\"),i(\"right\"),i(\"bottom\")}(g),ss(r.leftAndTop,g,d,p),g.x+=g.w,g.y+=g.h,ss(r.rightAndBottom,g,d,p),t.chartArea={left:g.left,top:g.top,right:g.left+g.w,bottom:g.top+g.h,height:g.h,width:g.w},u(r.chartArea,(e=>{const i=e.box;Object.assign(i,t.chartArea),i.update(g.w,g.h,{left:0,top:0,right:0,bottom:0})}))}};class os{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,s){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,s?Math.floor(e/s):i)}}isAttached(t){return!0}updateConfig(t){}}class as extends os{acquireContext(t){return t&&t.getContext&&t.getContext(\"2d\")||null}updateConfig(t){t.options.animation=!1}}const rs={touchstart:\"mousedown\",touchmove:\"mousemove\",touchend:\"mouseup\",pointerenter:\"mouseenter\",pointerdown:\"mousedown\",pointermove:\"mousemove\",pointerup:\"mouseup\",pointerleave:\"mouseout\",pointerout:\"mouseout\"},ls=t=>null===t||\"\"===t;const hs=!!ke&&{passive:!0};function cs(t,e,i){t.canvas.removeEventListener(e,i,hs)}function ds(t,e){for(const i of t)if(i===e||i.contains(e))return!0}function us(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||ds(i.addedNodes,s),e=e&&!ds(i.removedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}function fs(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||ds(i.removedNodes,s),e=e&&!ds(i.addedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}const gs=new Map;let ps=0;function ms(){const t=window.devicePixelRatio;t!==ps&&(ps=t,gs.forEach(((e,i)=>{i.currentDevicePixelRatio!==t&&e()})))}function bs(t,e,i){const s=t.canvas,n=s&&ge(s);if(!n)return;const o=ct(((t,e)=>{const s=n.clientWidth;i(t,e),s<n.clientWidth&&i()}),window),a=new ResizeObserver((t=>{const e=t[0],i=e.contentRect.width,s=e.contentRect.height;0===i&&0===s||o(i,s)}));return a.observe(n),function(t,e){gs.size||window.addEventListener(\"resize\",ms),gs.set(t,e)}(t,o),a}function xs(t,e,i){i&&i.disconnect(),\"resize\"===e&&function(t){gs.delete(t),gs.size||window.removeEventListener(\"resize\",ms)}(t)}function _s(t,e,i){const s=t.canvas,n=ct((e=>{null!==t.ctx&&i(function(t,e){const i=rs[t.type]||t.type,{x:s,y:n}=ye(t,e);return{type:i,chart:e,native:t,x:void 0!==s?s:null,y:void 0!==n?n:null}}(e,t))}),t);return function(t,e,i){t.addEventListener(e,i,hs)}(s,e,n),n}class ys extends os{acquireContext(t,e){const i=t&&t.getContext&&t.getContext(\"2d\");return i&&i.canvas===t?(function(t,e){const i=t.style,s=t.getAttribute(\"height\"),n=t.getAttribute(\"width\");if(t.$chartjs={initial:{height:s,width:n,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||\"block\",i.boxSizing=i.boxSizing||\"border-box\",ls(n)){const e=Se(t,\"width\");void 0!==e&&(t.width=e)}if(ls(s))if(\"\"===t.style.height)t.height=t.width/(e||2);else{const e=Se(t,\"height\");void 0!==e&&(t.height=e)}}(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e.$chartjs)return!1;const i=e.$chartjs.initial;[\"height\",\"width\"].forEach((t=>{const n=i[t];s(n)?e.removeAttribute(t):e.setAttribute(t,n)}));const n=i.style||{};return Object.keys(n).forEach((t=>{e.style[t]=n[t]})),e.width=e.width,delete e.$chartjs,!0}addEventListener(t,e,i){this.removeEventListener(t,e);const s=t.$proxies||(t.$proxies={}),n={attach:us,detach:fs,resize:bs}[e]||_s;s[e]=n(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),s=i[e];if(!s)return;({attach:xs,detach:xs,resize:xs}[e]||cs)(t,e,s),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,s){return Me(t,e,i,s)}isAttached(t){const e=ge(t);return!(!e||!e.isConnected)}}function vs(t){return!fe()||\"undefined\"!=typeof OffscreenCanvas&&t instanceof OffscreenCanvas?as:ys}var Ms=Object.freeze({__proto__:null,_detectPlatform:vs,BasePlatform:os,BasicPlatform:as,DomPlatform:ys});const ws=\"transparent\",ks={boolean:(t,e,i)=>i>.5?e:t,color(t,e,i){const s=Qt(t||ws),n=s.valid&&Qt(e||ws);return n&&n.valid?n.mix(s,i).hexString():e},number:(t,e,i)=>t+(e-t)*i};class Ss{constructor(t,e,i,s){const n=e[i];s=ki([t.to,s,n,t.from]);const o=ki([t.from,n,s]);this._active=!0,this._fn=t.fn||ks[t.type||typeof o],this._easing=ui[t.easing]||ui.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=o,this._to=s,this._promises=void 0}active(){return this._active}update(t,e,i){if(this._active){this._notify(!1);const s=this._target[this._prop],n=i-this._start,o=this._duration-n;this._start=i,this._duration=Math.floor(Math.max(o,t.duration)),this._total+=n,this._loop=!!t.loop,this._to=ki([t.to,e,s,t.from]),this._from=ki([t.from,s,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,i=this._duration,s=this._prop,n=this._from,o=this._loop,a=this._to;let r;if(this._active=n!==a&&(o||e<i),!this._active)return this._target[s]=a,void this._notify(!0);e<0?this._target[s]=n:(r=e/i%2,r=o&&r>1?2-r:r,r=this._easing(Math.min(1,Math.max(0,r))),this._target[s]=this._fn(n,a,r))}wait(){const t=this._promises||(this._promises=[]);return new Promise(((e,i)=>{t.push({res:e,rej:i})}))}_notify(t){const e=t?\"res\":\"rej\",i=this._promises||[];for(let t=0;t<i.length;t++)i[t][e]()}}class Ps{constructor(t,e){this._chart=t,this._properties=new Map,this.configure(e)}configure(t){if(!o(t))return;const e=Object.keys(ue.animation),i=this._properties;Object.getOwnPropertyNames(t).forEach((s=>{const a=t[s];if(!o(a))return;const r={};for(const t of e)r[t]=a[t];(n(a.properties)&&a.properties||[s]).forEach((t=>{t!==s&&i.has(t)||i.set(t,r)}))}))}_animateOptions(t,e){const i=e.options,s=function(t,e){if(!e)return;let i=t.options;if(!i)return void(t.options=e);i.$shared&&(t.options=i=Object.assign({},i,{$shared:!1,$animations:{}}));return i}(t,i);if(!s)return[];const n=this._createAnimations(s,i);return i.$shared&&function(t,e){const i=[],s=Object.keys(e);for(let e=0;e<s.length;e++){const n=t[s[e]];n&&n.active()&&i.push(n.wait())}return Promise.all(i)}(t.options.$animations,i).then((()=>{t.options=i}),(()=>{})),n}_createAnimations(t,e){const i=this._properties,s=[],n=t.$animations||(t.$animations={}),o=Object.keys(e),a=Date.now();let r;for(r=o.length-1;r>=0;--r){const l=o[r];if(\"$\"===l.charAt(0))continue;if(\"options\"===l){s.push(...this._animateOptions(t,e));continue}const h=e[l];let c=n[l];const d=i.get(l);if(c){if(d&&c.active()){c.update(d,h,a);continue}c.cancel()}d&&d.duration?(n[l]=c=new Ss(d,t,l,h),s.push(c)):t[l]=h}return s}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const i=this._createAnimations(t,e);return i.length?(xt.add(this._chart,i),!0):void 0}}function Ds(t,e){const i=t&&t.options||{},s=i.reverse,n=void 0===i.min?e:0,o=void 0===i.max?e:0;return{start:s?o:n,end:s?n:o}}function Cs(t,e){const i=[],s=t._getSortedDatasetMetas(e);let n,o;for(n=0,o=s.length;n<o;++n)i.push(s[n].index);return i}function Os(t,e,i,s={}){const n=t.keys,o=\"single\"===s.mode;let r,l,h,c;if(null!==e){for(r=0,l=n.length;r<l;++r){if(h=+n[r],h===i){if(s.all)continue;break}c=t.values[h],a(c)&&(o||0===e||F(e)===F(c))&&(e+=c)}return e}}function As(t,e){const i=t&&t.options.stacked;return i||void 0===i&&void 0!==e.stack}function Ts(t,e,i){const s=t[e]||(t[e]={});return s[i]||(s[i]={})}function Ls(t,e,i,s){for(const n of e.getMatchingVisibleMetas(s).reverse()){const e=t[n.index];if(i&&e>0||!i&&e<0)return n.index}return null}function Es(t,e){const{chart:i,_cachedMeta:s}=t,n=i._stacks||(i._stacks={}),{iScale:o,vScale:a,index:r}=s,l=o.axis,h=a.axis,c=function(t,e,i){return`${t.id}.${e.id}.${i.stack||i.type}`}(o,a,s),d=e.length;let u;for(let t=0;t<d;++t){const i=e[t],{[l]:o,[h]:d}=i;u=(i._stacks||(i._stacks={}))[h]=Ts(n,c,o),u[r]=d,u._top=Ls(u,a,!0,s.type),u._bottom=Ls(u,a,!1,s.type);(u._visualValues||(u._visualValues={}))[r]=d}}function Rs(t,e){const i=t.scales;return Object.keys(i).filter((t=>i[t].axis===e)).shift()}function Is(t,e){const i=t.controller.index,s=t.vScale&&t.vScale.axis;if(s){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[s]||void 0===e[s][i])return;delete e[s][i],void 0!==e[s]._visualValues&&void 0!==e[s]._visualValues[i]&&delete e[s]._visualValues[i]}}}const zs=t=>\"reset\"===t||\"none\"===t,Fs=(t,e)=>e?t:Object.assign({},t);class Vs{static defaults={};static datasetElementType=null;static dataElementType=null;constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=As(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled(\"filler\")&&console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\")}updateIndex(t){this.index!==t&&Is(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,i=this.getDataset(),s=(t,e,i,s)=>\"x\"===t?e:\"r\"===t?s:i,n=e.xAxisID=l(i.xAxisID,Rs(t,\"x\")),o=e.yAxisID=l(i.yAxisID,Rs(t,\"y\")),a=e.rAxisID=l(i.rAxisID,Rs(t,\"r\")),r=e.indexAxis,h=e.iAxisID=s(r,n,o,a),c=e.vAxisID=s(r,o,n,a);e.xScale=this.getScaleForId(n),e.yScale=this.getScaleForId(o),e.rScale=this.getScaleForId(a),e.iScale=this.getScaleForId(h),e.vScale=this.getScaleForId(c)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update(\"reset\")}_destroy(){const t=this._cachedMeta;this._data&&rt(this._data,this),t._stacked&&Is(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(o(e))this._data=function(t){const e=Object.keys(t),i=new Array(e.length);let s,n,o;for(s=0,n=e.length;s<n;++s)o=e[s],i[s]={x:o,y:t[o]};return i}(e);else if(i!==e){if(i){rt(i,this);const t=this._cachedMeta;Is(t),t._parsed=[]}e&&Object.isExtensible(e)&&at(e,this),this._syncList=[],this._data=e}}addElements(){const t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){const e=this._cachedMeta,i=this.getDataset();let s=!1;this._dataCheck();const n=e._stacked;e._stacked=As(e.vScale,e),e.stack!==i.stack&&(s=!0,Is(e),e.stack=i.stack),this._resyncElements(t),(s||n!==e._stacked)&&Es(this,e._parsed)}configure(){const t=this.chart.config,e=t.datasetScopeKeys(this._type),i=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(i,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){const{_cachedMeta:i,_data:s}=this,{iScale:a,_stacked:r}=i,l=a.axis;let h,c,d,u=0===t&&e===s.length||i._sorted,f=t>0&&i._parsed[t-1];if(!1===this._parsing)i._parsed=s,i._sorted=!0,d=s;else{d=n(s[t])?this.parseArrayData(i,s,t,e):o(s[t])?this.parseObjectData(i,s,t,e):this.parsePrimitiveData(i,s,t,e);const a=()=>null===c[l]||f&&c[l]<f[l];for(h=0;h<e;++h)i._parsed[h+t]=c=d[h],u&&(a()&&(u=!1),f=c);i._sorted=u}r&&Es(this,d)}parsePrimitiveData(t,e,i,s){const{iScale:n,vScale:o}=t,a=n.axis,r=o.axis,l=n.getLabels(),h=n===o,c=new Array(s);let d,u,f;for(d=0,u=s;d<u;++d)f=d+i,c[d]={[a]:h||n.parse(l[f],f),[r]:o.parse(e[f],f)};return c}parseArrayData(t,e,i,s){const{xScale:n,yScale:o}=t,a=new Array(s);let r,l,h,c;for(r=0,l=s;r<l;++r)h=r+i,c=e[h],a[r]={x:n.parse(c[0],h),y:o.parse(c[1],h)};return a}parseObjectData(t,e,i,s){const{xScale:n,yScale:o}=t,{xAxisKey:a=\"x\",yAxisKey:r=\"y\"}=this._parsing,l=new Array(s);let h,c,d,u;for(h=0,c=s;h<c;++h)d=h+i,u=e[d],l[h]={x:n.parse(M(u,a),d),y:o.parse(M(u,r),d)};return l}getParsed(t){return this._cachedMeta._parsed[t]}getDataElement(t){return this._cachedMeta.data[t]}applyStack(t,e,i){const s=this.chart,n=this._cachedMeta,o=e[t.axis];return Os({keys:Cs(s,!0),values:e._stacks[t.axis]._visualValues},o,n.index,{mode:i})}updateRangeFromParsed(t,e,i,s){const n=i[e.axis];let o=null===n?NaN:n;const a=s&&i._stacks[e.axis];s&&a&&(s.values=a,o=Os(s,n,this._cachedMeta.index)),t.min=Math.min(t.min,o),t.max=Math.max(t.max,o)}getMinMax(t,e){const i=this._cachedMeta,s=i._parsed,n=i._sorted&&t===i.iScale,o=s.length,r=this._getOtherScale(t),l=((t,e,i)=>t&&!e.hidden&&e._stacked&&{keys:Cs(i,!0),values:null})(e,i,this.chart),h={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY},{min:c,max:d}=function(t){const{min:e,max:i,minDefined:s,maxDefined:n}=t.getUserBounds();return{min:s?e:Number.NEGATIVE_INFINITY,max:n?i:Number.POSITIVE_INFINITY}}(r);let u,f;function g(){f=s[u];const e=f[r.axis];return!a(f[t.axis])||c>e||d<e}for(u=0;u<o&&(g()||(this.updateRangeFromParsed(h,t,f,l),!n));++u);if(n)for(u=o-1;u>=0;--u)if(!g()){this.updateRangeFromParsed(h,t,f,l);break}return h}getAllParsedValues(t){const e=this._cachedMeta._parsed,i=[];let s,n,o;for(s=0,n=e.length;s<n;++s)o=e[s][t.axis],a(o)&&i.push(o);return i}getMaxOverflow(){return!1}getLabelAndValue(t){const e=this._cachedMeta,i=e.iScale,s=e.vScale,n=this.getParsed(t);return{label:i?\"\"+i.getLabelForValue(n[i.axis]):\"\",value:s?\"\"+s.getLabelForValue(n[s.axis]):\"\"}}_update(t){const e=this._cachedMeta;this.update(t||\"default\"),e._clip=function(t){let e,i,s,n;return o(t)?(e=t.top,i=t.right,s=t.bottom,n=t.left):e=i=s=n=t,{top:e,right:i,bottom:s,left:n,disabled:!1===t}}(l(this.options.clip,function(t,e,i){if(!1===i)return!1;const s=Ds(t,i),n=Ds(e,i);return{top:n.end,right:s.end,bottom:n.start,left:s.start}}(e.xScale,e.yScale,this.getMaxOverflow())))}update(t){}draw(){const t=this._ctx,e=this.chart,i=this._cachedMeta,s=i.data||[],n=e.chartArea,o=[],a=this._drawStart||0,r=this._drawCount||s.length-a,l=this.options.drawActiveElementsOnTop;let h;for(i.dataset&&i.dataset.draw(t,n,a,r),h=a;h<a+r;++h){const e=s[h];e.hidden||(e.active&&l?o.push(e):e.draw(t,n))}for(h=0;h<o.length;++h)o[h].draw(t,n)}getStyle(t,e){const i=e?\"active\":\"default\";return void 0===t&&this._cachedMeta.dataset?this.resolveDatasetElementOptions(i):this.resolveDataElementOptions(t||0,i)}getContext(t,e,i){const s=this.getDataset();let n;if(t>=0&&t<this._cachedMeta.data.length){const e=this._cachedMeta.data[t];n=e.$context||(e.$context=function(t,e,i){return Pi(t,{active:!1,dataIndex:e,parsed:void 0,raw:void 0,element:i,index:e,mode:\"default\",type:\"data\"})}(this.getContext(),t,e)),n.parsed=this.getParsed(t),n.raw=s.data[t],n.index=n.dataIndex=t}else n=this.$context||(this.$context=function(t,e){return Pi(t,{active:!1,dataset:void 0,datasetIndex:e,index:e,mode:\"default\",type:\"dataset\"})}(this.chart.getContext(),this.index)),n.dataset=s,n.index=n.datasetIndex=this.index;return n.active=!!e,n.mode=i,n}resolveDatasetElementOptions(t){return this._resolveElementOptions(this.datasetElementType.id,t)}resolveDataElementOptions(t,e){return this._resolveElementOptions(this.dataElementType.id,e,t)}_resolveElementOptions(t,e=\"default\",i){const s=\"active\"===e,n=this._cachedDataOpts,o=t+\"-\"+e,a=n[o],r=this.enableOptionSharing&&k(i);if(a)return Fs(a,r);const l=this.chart.config,h=l.datasetElementScopeKeys(this._type,t),c=s?[`${t}Hover`,\"hover\",t,\"\"]:[t,\"\"],d=l.getOptionScopes(this.getDataset(),h),u=Object.keys(ue.elements[t]),f=l.resolveNamedOptions(d,u,(()=>this.getContext(i,s,e)),c);return f.$shared&&(f.$shared=r,n[o]=Object.freeze(Fs(f,r))),f}_resolveAnimations(t,e,i){const s=this.chart,n=this._cachedDataOpts,o=`animation-${e}`,a=n[o];if(a)return a;let r;if(!1!==s.options.animation){const s=this.chart.config,n=s.datasetAnimationScopeKeys(this._type,e),o=s.getOptionScopes(this.getDataset(),n);r=s.createResolver(o,this.getContext(t,i,e))}const l=new Ps(s,r&&r.animations);return r&&r._cacheable&&(n[o]=Object.freeze(l)),l}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||zs(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const i=this.resolveDataElementOptions(t,e),s=this._sharedOptions,n=this.getSharedOptions(i),o=this.includeOptions(e,n)||n!==s;return this.updateSharedOptions(n,e,i),{sharedOptions:n,includeOptions:o}}updateElement(t,e,i,s){zs(s)?Object.assign(t,i):this._resolveAnimations(e,s).update(t,i)}updateSharedOptions(t,e,i){t&&!zs(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,s){t.active=s;const n=this.getStyle(e,s);this._resolveAnimations(e,i,s).update(t,{options:!s&&this.getSharedOptions(n)||n})}removeHoverStyle(t,e,i){this._setStyle(t,i,\"active\",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,\"active\",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,\"active\",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,\"active\",!0)}_resyncElements(t){const e=this._data,i=this._cachedMeta.data;for(const[t,e,i]of this._syncList)this[t](e,i);this._syncList=[];const s=i.length,n=e.length,o=Math.min(n,s);o&&this.parse(0,o),n>s?this._insertElements(s,n-s,t):n<s&&this._removeElements(n,s-n)}_insertElements(t,e,i=!0){const s=this._cachedMeta,n=s.data,o=t+e;let a;const r=t=>{for(t.length+=e,a=t.length-1;a>=o;a--)t[a]=t[a-e]};for(r(n),a=t;a<o;++a)n[a]=new this.dataElementType;this._parsing&&r(s._parsed),this.parse(t,e),i&&this.updateElements(n,t,e,\"reset\")}updateElements(t,e,i,s){}_removeElements(t,e){const i=this._cachedMeta;if(this._parsing){const s=i._parsed.splice(t,e);i._stacked&&Is(i,s)}i.data.splice(t,e)}_sync(t){if(this._parsing)this._syncList.push(t);else{const[e,i,s]=t;this[e](i,s)}this.chart._dataChanges.push([this.index,...t])}_onDataPush(){const t=arguments.length;this._sync([\"_insertElements\",this.getDataset().data.length-t,t])}_onDataPop(){this._sync([\"_removeElements\",this._cachedMeta.data.length-1,1])}_onDataShift(){this._sync([\"_removeElements\",0,1])}_onDataSplice(t,e){e&&this._sync([\"_removeElements\",t,e]);const i=arguments.length-2;i&&this._sync([\"_insertElements\",t,i])}_onDataUnshift(){this._sync([\"_insertElements\",0,arguments.length])}}class Bs{static defaults={};static defaultRoutes=void 0;active=!1;tooltipPosition(t){const{x:e,y:i}=this.getProps([\"x\",\"y\"],t);return{x:e,y:i}}hasValue(){return W(this.x)&&W(this.y)}getProps(t,e){const i=this.$animations;if(!e||!i)return this;const s={};return t.forEach((t=>{s[t]=i[t]&&i[t].active()?i[t]._to:this[t]})),s}}function Ns(t,e){const i=t.options.ticks,n=function(t){const e=t.options.offset,i=t._tickSize(),s=t._length/i+(e?0:1),n=t._maxLength/i;return Math.floor(Math.min(s,n))}(t),o=Math.min(i.maxTicksLimit||n,n),a=i.major.enabled?function(t){const e=[];let i,s;for(i=0,s=t.length;i<s;i++)t[i].major&&e.push(i);return e}(e):[],r=a.length,l=a[0],h=a[r-1],c=[];if(r>o)return function(t,e,i,s){let n,o=0,a=i[0];for(s=Math.ceil(s),n=0;n<t.length;n++)n===a&&(e.push(t[n]),o++,a=i[o*s])}(e,c,a,r/o),c;const d=function(t,e,i){const s=function(t){const e=t.length;let i,s;if(e<2)return!1;for(s=t[0],i=1;i<e;++i)if(t[i]-t[i-1]!==s)return!1;return s}(t),n=e.length/i;if(!s)return Math.max(n,1);const o=N(s);for(let t=0,e=o.length-1;t<e;t++){const e=o[t];if(e>n)return e}return Math.max(n,1)}(a,e,o);if(r>0){let t,i;const n=r>1?Math.round((h-l)/(r-1)):null;for(Ws(e,c,d,s(n)?0:l-n,l),t=0,i=r-1;t<i;t++)Ws(e,c,d,a[t],a[t+1]);return Ws(e,c,d,h,s(n)?e.length:h+n),c}return Ws(e,c,d),c}function Ws(t,e,i,s,n){const o=l(s,0),a=Math.min(l(n,t.length),t.length);let r,h,c,d=0;for(i=Math.ceil(i),n&&(r=n-s,i=r/Math.floor(r/i)),c=o;c<0;)d++,c=Math.round(o+d*i);for(h=Math.max(o,0);h<a;h++)h===c&&(e.push(t[h]),d++,c=Math.round(o+d*i))}const Hs=(t,e,i)=>\"top\"===e||\"left\"===e?t[e]+i:t[e]-i,js=(t,e)=>Math.min(e||t,t);function $s(t,e){const i=[],s=t.length/e,n=t.length;let o=0;for(;o<n;o+=s)i.push(t[Math.floor(o)]);return i}function Ys(t,e,i){const s=t.ticks.length,n=Math.min(e,s-1),o=t._startPixel,a=t._endPixel,r=1e-6;let l,h=t.getPixelForTick(n);if(!(i&&(l=1===s?Math.max(h-o,a-h):0===e?(t.getPixelForTick(1)-h)/2:(h-t.getPixelForTick(n-1))/2,h+=n<e?l:-l,h<o-r||h>a+r)))return h}function Us(t){return t.drawTicks?t.tickLength:0}function Xs(t,e){if(!t.display)return 0;const i=wi(t.font,e),s=Mi(t.padding);return(n(t.text)?t.text.length:1)*i.lineHeight+s.height}function qs(t,e,i){let s=ut(t);return(i&&\"right\"!==e||!i&&\"right\"===e)&&(s=(t=>\"left\"===t?\"right\":\"right\"===t?\"left\":t)(s)),s}class Ks extends Bs{constructor(t){super(),this.id=t.id,this.type=t.type,this.options=void 0,this.ctx=t.ctx,this.chart=t.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(t){this.options=t.setContext(this.getContext()),this.axis=t.axis,this._userMin=this.parse(t.min),this._userMax=this.parse(t.max),this._suggestedMin=this.parse(t.suggestedMin),this._suggestedMax=this.parse(t.suggestedMax)}parse(t,e){return t}getUserBounds(){let{_userMin:t,_userMax:e,_suggestedMin:i,_suggestedMax:s}=this;return t=r(t,Number.POSITIVE_INFINITY),e=r(e,Number.NEGATIVE_INFINITY),i=r(i,Number.POSITIVE_INFINITY),s=r(s,Number.NEGATIVE_INFINITY),{min:r(t,i),max:r(e,s),minDefined:a(t),maxDefined:a(e)}}getMinMax(t){let e,{min:i,max:s,minDefined:n,maxDefined:o}=this.getUserBounds();if(n&&o)return{min:i,max:s};const a=this.getMatchingVisibleMetas();for(let r=0,l=a.length;r<l;++r)e=a[r].controller.getMinMax(this,t),n||(i=Math.min(i,e.min)),o||(s=Math.max(s,e.max));return i=o&&i>s?s:i,s=n&&i>s?i:s,{min:r(i,r(s,i)),max:r(s,r(i,s))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(t))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){d(this.options.beforeUpdate,[this])}update(t,e,i){const{beginAtZero:s,grace:n,ticks:o}=this.options,a=o.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+i.left+i.right:this.height+i.top+i.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=Si(this,n,s),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const r=a<this.ticks.length;this._convertTicksToLabels(r?$s(this.ticks,a):this.ticks),this.configure(),this.beforeCalculateLabelRotation(),this.calculateLabelRotation(),this.afterCalculateLabelRotation(),o.display&&(o.autoSkip||\"auto\"===o.source)&&(this.ticks=Ns(this,this.ticks),this._labelSizes=null,this.afterAutoSkip()),r&&this._convertTicksToLabels(this.ticks),this.beforeFit(),this.fit(),this.afterFit(),this.afterUpdate()}configure(){let t,e,i=this.options.reverse;this.isHorizontal()?(t=this.left,e=this.right):(t=this.top,e=this.bottom,i=!i),this._startPixel=t,this._endPixel=e,this._reversePixels=i,this._length=e-t,this._alignToPixels=this.options.alignToPixels}afterUpdate(){d(this.options.afterUpdate,[this])}beforeSetDimensions(){d(this.options.beforeSetDimensions,[this])}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=0,this.right=this.width):(this.height=this.maxHeight,this.top=0,this.bottom=this.height),this.paddingLeft=0,this.paddingTop=0,this.paddingRight=0,this.paddingBottom=0}afterSetDimensions(){d(this.options.afterSetDimensions,[this])}_callHooks(t){this.chart.notifyPlugins(t,this.getContext()),d(this.options[t],[this])}beforeDataLimits(){this._callHooks(\"beforeDataLimits\")}determineDataLimits(){}afterDataLimits(){this._callHooks(\"afterDataLimits\")}beforeBuildTicks(){this._callHooks(\"beforeBuildTicks\")}buildTicks(){return[]}afterBuildTicks(){this._callHooks(\"afterBuildTicks\")}beforeTickToLabelConversion(){d(this.options.beforeTickToLabelConversion,[this])}generateTickLabels(t){const e=this.options.ticks;let i,s,n;for(i=0,s=t.length;i<s;i++)n=t[i],n.label=d(e.callback,[n.value,i,t],this)}afterTickToLabelConversion(){d(this.options.afterTickToLabelConversion,[this])}beforeCalculateLabelRotation(){d(this.options.beforeCalculateLabelRotation,[this])}calculateLabelRotation(){const t=this.options,e=t.ticks,i=js(this.ticks.length,t.ticks.maxTicksLimit),s=e.minRotation||0,n=e.maxRotation;let o,a,r,l=s;if(!this._isVisible()||!e.display||s>=n||i<=1||!this.isHorizontal())return void(this.labelRotation=s);const h=this._getLabelSizes(),c=h.widest.width,d=h.highest.height,u=J(this.chart.width-c,0,this.maxWidth);o=t.offset?this.maxWidth/i:u/(i-1),c+6>o&&(o=u/(i-(t.offset?.5:1)),a=this.maxHeight-Us(t.grid)-e.padding-Xs(t.title,this.chart.options.font),r=Math.sqrt(c*c+d*d),l=Y(Math.min(Math.asin(J((h.highest.height+6)/o,-1,1)),Math.asin(J(a/r,-1,1))-Math.asin(J(d/r,-1,1)))),l=Math.max(s,Math.min(n,l))),this.labelRotation=l}afterCalculateLabelRotation(){d(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){d(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:i,title:s,grid:n}}=this,o=this._isVisible(),a=this.isHorizontal();if(o){const o=Xs(s,e.options.font);if(a?(t.width=this.maxWidth,t.height=Us(n)+o):(t.height=this.maxHeight,t.width=Us(n)+o),i.display&&this.ticks.length){const{first:e,last:s,widest:n,highest:o}=this._getLabelSizes(),r=2*i.padding,l=$(this.labelRotation),h=Math.cos(l),c=Math.sin(l);if(a){const e=i.mirror?0:c*n.width+h*o.height;t.height=Math.min(this.maxHeight,t.height+e+r)}else{const e=i.mirror?0:h*n.width+c*o.height;t.width=Math.min(this.maxWidth,t.width+e+r)}this._calculatePadding(e,s,c,h)}}this._handleMargins(),a?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,i,s){const{ticks:{align:n,padding:o},position:a}=this.options,r=0!==this.labelRotation,l=\"top\"!==a&&\"x\"===this.axis;if(this.isHorizontal()){const a=this.getPixelForTick(0)-this.left,h=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,d=0;r?l?(c=s*t.width,d=i*e.height):(c=i*t.height,d=s*e.width):\"start\"===n?d=e.width:\"end\"===n?c=t.width:\"inner\"!==n&&(c=t.width/2,d=e.width/2),this.paddingLeft=Math.max((c-a+o)*this.width/(this.width-a),0),this.paddingRight=Math.max((d-h+o)*this.width/(this.width-h),0)}else{let i=e.height/2,s=t.height/2;\"start\"===n?(i=0,s=t.height):\"end\"===n&&(i=e.height,s=0),this.paddingTop=i+o,this.paddingBottom=s+o}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){d(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return\"top\"===e||\"bottom\"===e||\"x\"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){let e,i;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,i=t.length;e<i;e++)s(t[e].label)&&(t.splice(e,1),i--,e--);this.afterTickToLabelConversion()}_getLabelSizes(){let t=this._labelSizes;if(!t){const e=this.options.ticks.sampleSize;let i=this.ticks;e<i.length&&(i=$s(i,e)),this._labelSizes=t=this._computeLabelSizes(i,i.length,this.options.ticks.maxTicksLimit)}return t}_computeLabelSizes(t,e,i){const{ctx:o,_longestTextCache:a}=this,r=[],l=[],h=Math.floor(e/js(e,i));let c,d,f,g,p,m,b,x,_,y,v,M=0,w=0;for(c=0;c<e;c+=h){if(g=t[c].label,p=this._resolveTickFontOptions(c),o.font=m=p.string,b=a[m]=a[m]||{data:{},gc:[]},x=p.lineHeight,_=y=0,s(g)||n(g)){if(n(g))for(d=0,f=g.length;d<f;++d)v=g[d],s(v)||n(v)||(_=De(o,b.data,b.gc,_,v),y+=x)}else _=De(o,b.data,b.gc,_,g),y=x;r.push(_),l.push(y),M=Math.max(_,M),w=Math.max(y,w)}!function(t,e){u(t,(t=>{const i=t.gc,s=i.length/2;let n;if(s>e){for(n=0;n<s;++n)delete t.data[i[n]];i.splice(0,s)}}))}(a,e);const k=r.indexOf(M),S=l.indexOf(w),P=t=>({width:r[t]||0,height:l[t]||0});return{first:P(0),last:P(e-1),widest:P(k),highest:P(S),widths:r,heights:l}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return Q(this._alignToPixels?Oe(this.chart,e,0):e)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&t<e.length){const i=e[t];return i.$context||(i.$context=function(t,e,i){return Pi(t,{tick:i,index:e,type:\"tick\"})}(this.getContext(),t,i))}return this.$context||(this.$context=Pi(this.chart.getContext(),{scale:this,type:\"scale\"}))}_tickSize(){const t=this.options.ticks,e=$(this.labelRotation),i=Math.abs(Math.cos(e)),s=Math.abs(Math.sin(e)),n=this._getLabelSizes(),o=t.autoSkipPadding||0,a=n?n.widest.width+o:0,r=n?n.highest.height+o:0;return this.isHorizontal()?r*i>a*s?a/i:r/s:r*s<a*i?r/i:a/s}_isVisible(){const t=this.options.display;return\"auto\"!==t?!!t:this.getMatchingVisibleMetas().length>0}_computeGridLineItems(t){const e=this.axis,i=this.chart,s=this.options,{grid:n,position:a,border:r}=s,h=n.offset,c=this.isHorizontal(),d=this.ticks.length+(h?1:0),u=Us(n),f=[],g=r.setContext(this.getContext()),p=g.display?g.width:0,m=p/2,b=function(t){return Oe(i,t,p)};let x,_,y,v,M,w,k,S,P,D,C,O;if(\"top\"===a)x=b(this.bottom),w=this.bottom-u,S=x-m,D=b(t.top)+m,O=t.bottom;else if(\"bottom\"===a)x=b(this.top),D=t.top,O=b(t.bottom)-m,w=x+m,S=this.top+u;else if(\"left\"===a)x=b(this.right),M=this.right-u,k=x-m,P=b(t.left)+m,C=t.right;else if(\"right\"===a)x=b(this.left),P=t.left,C=b(t.right)-m,M=x+m,k=this.left+u;else if(\"x\"===e){if(\"center\"===a)x=b((t.top+t.bottom)/2+.5);else if(o(a)){const t=Object.keys(a)[0],e=a[t];x=b(this.chart.scales[t].getPixelForValue(e))}D=t.top,O=t.bottom,w=x+m,S=w+u}else if(\"y\"===e){if(\"center\"===a)x=b((t.left+t.right)/2);else if(o(a)){const t=Object.keys(a)[0],e=a[t];x=b(this.chart.scales[t].getPixelForValue(e))}M=x-m,k=M-u,P=t.left,C=t.right}const A=l(s.ticks.maxTicksLimit,d),T=Math.max(1,Math.ceil(d/A));for(_=0;_<d;_+=T){const t=this.getContext(_),e=n.setContext(t),s=r.setContext(t),o=e.lineWidth,a=e.color,l=s.dash||[],d=s.dashOffset,u=e.tickWidth,g=e.tickColor,p=e.tickBorderDash||[],m=e.tickBorderDashOffset;y=Ys(this,_,h),void 0!==y&&(v=Oe(i,y,o),c?M=k=P=C=v:w=S=D=O=v,f.push({tx1:M,ty1:w,tx2:k,ty2:S,x1:P,y1:D,x2:C,y2:O,width:o,color:a,borderDash:l,borderDashOffset:d,tickWidth:u,tickColor:g,tickBorderDash:p,tickBorderDashOffset:m}))}return this._ticksLength=d,this._borderValue=x,f}_computeLabelItems(t){const e=this.axis,i=this.options,{position:s,ticks:a}=i,r=this.isHorizontal(),l=this.ticks,{align:h,crossAlign:c,padding:d,mirror:u}=a,f=Us(i.grid),g=f+d,p=u?-d:g,m=-$(this.labelRotation),b=[];let x,_,y,v,M,w,k,S,P,D,C,O,A=\"middle\";if(\"top\"===s)w=this.bottom-p,k=this._getXAxisLabelAlignment();else if(\"bottom\"===s)w=this.top+p,k=this._getXAxisLabelAlignment();else if(\"left\"===s){const t=this._getYAxisLabelAlignment(f);k=t.textAlign,M=t.x}else if(\"right\"===s){const t=this._getYAxisLabelAlignment(f);k=t.textAlign,M=t.x}else if(\"x\"===e){if(\"center\"===s)w=(t.top+t.bottom)/2+g;else if(o(s)){const t=Object.keys(s)[0],e=s[t];w=this.chart.scales[t].getPixelForValue(e)+g}k=this._getXAxisLabelAlignment()}else if(\"y\"===e){if(\"center\"===s)M=(t.left+t.right)/2-g;else if(o(s)){const t=Object.keys(s)[0],e=s[t];M=this.chart.scales[t].getPixelForValue(e)}k=this._getYAxisLabelAlignment(f).textAlign}\"y\"===e&&(\"start\"===h?A=\"top\":\"end\"===h&&(A=\"bottom\"));const T=this._getLabelSizes();for(x=0,_=l.length;x<_;++x){y=l[x],v=y.label;const t=a.setContext(this.getContext(x));S=this.getPixelForTick(x)+a.labelOffset,P=this._resolveTickFontOptions(x),D=P.lineHeight,C=n(v)?v.length:1;const e=C/2,i=t.color,o=t.textStrokeColor,h=t.textStrokeWidth;let d,f=k;if(r?(M=S,\"inner\"===k&&(f=x===_-1?this.options.reverse?\"left\":\"right\":0===x?this.options.reverse?\"right\":\"left\":\"center\"),O=\"top\"===s?\"near\"===c||0!==m?-C*D+D/2:\"center\"===c?-T.highest.height/2-e*D+D:-T.highest.height+D/2:\"near\"===c||0!==m?D/2:\"center\"===c?T.highest.height/2-e*D:T.highest.height-C*D,u&&(O*=-1),0===m||t.showLabelBackdrop||(M+=D/2*Math.sin(m))):(w=S,O=(1-C)*D/2),t.showLabelBackdrop){const e=Mi(t.backdropPadding),i=T.heights[x],s=T.widths[x];let n=O-e.top,o=0-e.left;switch(A){case\"middle\":n-=i/2;break;case\"bottom\":n-=i}switch(k){case\"center\":o-=s/2;break;case\"right\":o-=s}d={left:o,top:n,width:s+e.width,height:i+e.height,color:t.backdropColor}}b.push({label:v,font:P,textOffset:O,options:{rotation:m,color:i,strokeColor:o,strokeWidth:h,textAlign:f,textBaseline:A,translation:[M,w],backdrop:d}})}return b}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options;if(-$(this.labelRotation))return\"top\"===t?\"left\":\"right\";let i=\"center\";return\"start\"===e.align?i=\"left\":\"end\"===e.align?i=\"right\":\"inner\"===e.align&&(i=\"inner\"),i}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:i,mirror:s,padding:n}}=this.options,o=t+n,a=this._getLabelSizes().widest.width;let r,l;return\"left\"===e?s?(l=this.right+n,\"near\"===i?r=\"left\":\"center\"===i?(r=\"center\",l+=a/2):(r=\"right\",l+=a)):(l=this.right-o,\"near\"===i?r=\"right\":\"center\"===i?(r=\"center\",l-=a/2):(r=\"left\",l=this.left)):\"right\"===e?s?(l=this.left+n,\"near\"===i?r=\"right\":\"center\"===i?(r=\"center\",l-=a/2):(r=\"left\",l-=a)):(l=this.left+o,\"near\"===i?r=\"left\":\"center\"===i?(r=\"center\",l+=a/2):(r=\"right\",l=this.right)):r=\"right\",{textAlign:r,x:l}}_computeLabelArea(){if(this.options.ticks.mirror)return;const t=this.chart,e=this.options.position;return\"left\"===e||\"right\"===e?{top:0,left:this.left,bottom:t.height,right:this.right}:\"top\"===e||\"bottom\"===e?{top:this.top,left:0,bottom:this.bottom,right:t.width}:void 0}drawBackground(){const{ctx:t,options:{backgroundColor:e},left:i,top:s,width:n,height:o}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(i,s,n,o),t.restore())}getLineWidthForValue(t){const e=this.options.grid;if(!this._isVisible()||!e.display)return 0;const i=this.ticks.findIndex((e=>e.value===t));if(i>=0){return e.setContext(this.getContext(i)).lineWidth}return 0}drawGrid(t){const e=this.options.grid,i=this.ctx,s=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let n,o;const a=(t,e,s)=>{s.width&&s.color&&(i.save(),i.lineWidth=s.width,i.strokeStyle=s.color,i.setLineDash(s.borderDash||[]),i.lineDashOffset=s.borderDashOffset,i.beginPath(),i.moveTo(t.x,t.y),i.lineTo(e.x,e.y),i.stroke(),i.restore())};if(e.display)for(n=0,o=s.length;n<o;++n){const t=s[n];e.drawOnChartArea&&a({x:t.x1,y:t.y1},{x:t.x2,y:t.y2},t),e.drawTicks&&a({x:t.tx1,y:t.ty1},{x:t.tx2,y:t.ty2},{color:t.tickColor,width:t.tickWidth,borderDash:t.tickBorderDash,borderDashOffset:t.tickBorderDashOffset})}}drawBorder(){const{chart:t,ctx:e,options:{border:i,grid:s}}=this,n=i.setContext(this.getContext()),o=i.display?n.width:0;if(!o)return;const a=s.setContext(this.getContext(0)).lineWidth,r=this._borderValue;let l,h,c,d;this.isHorizontal()?(l=Oe(t,this.left,o)-o/2,h=Oe(t,this.right,a)+a/2,c=d=r):(c=Oe(t,this.top,o)-o/2,d=Oe(t,this.bottom,a)+a/2,l=h=r),e.save(),e.lineWidth=n.width,e.strokeStyle=n.color,e.beginPath(),e.moveTo(l,c),e.lineTo(h,d),e.stroke(),e.restore()}drawLabels(t){if(!this.options.ticks.display)return;const e=this.ctx,i=this._computeLabelArea();i&&Re(e,i);const s=this.getLabelItems(t);for(const t of s){const i=t.options,s=t.font;Ve(e,t.label,0,t.textOffset,s,i)}i&&Ie(e)}drawTitle(){const{ctx:t,options:{position:e,title:i,reverse:s}}=this;if(!i.display)return;const a=wi(i.font),r=Mi(i.padding),l=i.align;let h=a.lineHeight/2;\"bottom\"===e||\"center\"===e||o(e)?(h+=r.bottom,n(i.text)&&(h+=a.lineHeight*(i.text.length-1))):h+=r.top;const{titleX:c,titleY:d,maxWidth:u,rotation:f}=function(t,e,i,s){const{top:n,left:a,bottom:r,right:l,chart:h}=t,{chartArea:c,scales:d}=h;let u,f,g,p=0;const m=r-n,b=l-a;if(t.isHorizontal()){if(f=ft(s,a,l),o(i)){const t=Object.keys(i)[0],s=i[t];g=d[t].getPixelForValue(s)+m-e}else g=\"center\"===i?(c.bottom+c.top)/2+m-e:Hs(t,i,e);u=l-a}else{if(o(i)){const t=Object.keys(i)[0],s=i[t];f=d[t].getPixelForValue(s)-b+e}else f=\"center\"===i?(c.left+c.right)/2-b+e:Hs(t,i,e);g=ft(s,r,n),p=\"left\"===i?-E:E}return{titleX:f,titleY:g,maxWidth:u,rotation:p}}(this,h,e,l);Ve(t,i.text,0,0,a,{color:i.color,maxWidth:u,rotation:f,textAlign:qs(l,e,s),textBaseline:\"middle\",translation:[c,d]})}draw(t){this._isVisible()&&(this.drawBackground(),this.drawGrid(t),this.drawBorder(),this.drawTitle(),this.drawLabels(t))}_layers(){const t=this.options,e=t.ticks&&t.ticks.z||0,i=l(t.grid&&t.grid.z,-1),s=l(t.border&&t.border.z,0);return this._isVisible()&&this.draw===Ks.prototype.draw?[{z:i,draw:t=>{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:s,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),i=this.axis+\"AxisID\",s=[];let n,o;for(n=0,o=e.length;n<o;++n){const o=e[n];o[i]!==this.id||t&&o.type!==t||s.push(o)}return s}_resolveTickFontOptions(t){return wi(this.options.ticks.setContext(this.getContext(t)).font)}_maxDigits(){const t=this._resolveTickFontOptions(0).lineHeight;return(this.isHorizontal()?this.width:this.height)/t}}class Gs{constructor(t,e,i){this.type=t,this.scope=e,this.override=i,this.items=Object.create(null)}isForType(t){return Object.prototype.isPrototypeOf.call(this.type.prototype,t.prototype)}register(t){const e=Object.getPrototypeOf(t);let i;(function(t){return\"id\"in t&&\"defaults\"in t})(e)&&(i=this.register(e));const s=this.items,n=t.id,o=this.scope+\".\"+n;if(!n)throw new Error(\"class does not have id: \"+t);return n in s||(s[n]=t,function(t,e,i){const s=b(Object.create(null),[i?ue.get(i):{},ue.get(e),t.defaults]);ue.set(e,s),t.defaultRoutes&&function(t,e){Object.keys(e).forEach((i=>{const s=i.split(\".\"),n=s.pop(),o=[t].concat(s).join(\".\"),a=e[i].split(\".\"),r=a.pop(),l=a.join(\".\");ue.route(o,n,l,r)}))}(e,t.defaultRoutes);t.descriptors&&ue.describe(e,t.descriptors)}(t,o,i),this.override&&ue.override(t.id,t.overrides)),o}get(t){return this.items[t]}unregister(t){const e=this.items,i=t.id,s=this.scope;i in e&&delete e[i],s&&i in ue[s]&&(delete ue[s][i],this.override&&delete re[i])}}class Zs{constructor(){this.controllers=new Gs(Vs,\"datasets\",!0),this.elements=new Gs(Bs,\"elements\"),this.plugins=new Gs(Object,\"plugins\"),this.scales=new Gs(Ks,\"scales\"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each(\"register\",t)}remove(...t){this._each(\"unregister\",t)}addControllers(...t){this._each(\"register\",t,this.controllers)}addElements(...t){this._each(\"register\",t,this.elements)}addPlugins(...t){this._each(\"register\",t,this.plugins)}addScales(...t){this._each(\"register\",t,this.scales)}getController(t){return this._get(t,this.controllers,\"controller\")}getElement(t){return this._get(t,this.elements,\"element\")}getPlugin(t){return this._get(t,this.plugins,\"plugin\")}getScale(t){return this._get(t,this.scales,\"scale\")}removeControllers(...t){this._each(\"unregister\",t,this.controllers)}removeElements(...t){this._each(\"unregister\",t,this.elements)}removePlugins(...t){this._each(\"unregister\",t,this.plugins)}removeScales(...t){this._each(\"unregister\",t,this.scales)}_each(t,e,i){[...e].forEach((e=>{const s=i||this._getRegistryForType(e);i||s.isForType(e)||s===this.plugins&&e.id?this._exec(t,s,e):u(e,(e=>{const s=i||this._getRegistryForType(e);this._exec(t,s,e)}))}))}_exec(t,e,i){const s=w(t);d(i[\"before\"+s],[],i),e[t](i),d(i[\"after\"+s],[],i)}_getRegistryForType(t){for(let e=0;e<this._typedRegistries.length;e++){const i=this._typedRegistries[e];if(i.isForType(t))return i}return this.plugins}_get(t,e,i){const s=e.get(t);if(void 0===s)throw new Error('\"'+t+'\" is not a registered '+i+\".\");return s}}var Js=new Zs;class Qs{constructor(){this._init=[]}notify(t,e,i,s){\"beforeInit\"===e&&(this._init=this._createDescriptors(t,!0),this._notify(this._init,t,\"install\"));const n=s?this._descriptors(t).filter(s):this._descriptors(t),o=this._notify(n,t,e,i);return\"afterDestroy\"===e&&(this._notify(n,t,\"stop\"),this._notify(this._init,t,\"uninstall\")),o}_notify(t,e,i,s){s=s||{};for(const n of t){const t=n.plugin;if(!1===d(t[i],[e,s,n.options],t)&&s.cancelable)return!1}return!0}invalidate(){s(this._cache)||(this._oldCache=this._cache,this._cache=void 0)}_descriptors(t){if(this._cache)return this._cache;const e=this._cache=this._createDescriptors(t);return this._notifyStateChanges(t),e}_createDescriptors(t,e){const i=t&&t.config,s=l(i.options&&i.options.plugins,{}),n=function(t){const e={},i=[],s=Object.keys(Js.plugins.items);for(let t=0;t<s.length;t++)i.push(Js.getPlugin(s[t]));const n=t.plugins||[];for(let t=0;t<n.length;t++){const s=n[t];-1===i.indexOf(s)&&(i.push(s),e[s.id]=!0)}return{plugins:i,localIds:e}}(i);return!1!==s||e?function(t,{plugins:e,localIds:i},s,n){const o=[],a=t.getContext();for(const r of e){const e=r.id,l=tn(s[e],n);null!==l&&o.push({plugin:r,options:en(t.config,{plugin:r,local:i[e]},l,a)})}return o}(t,n,s,e):[]}_notifyStateChanges(t){const e=this._oldCache||[],i=this._cache,s=(t,e)=>t.filter((t=>!e.some((e=>t.plugin.id===e.plugin.id))));this._notify(s(e,i),t,\"stop\"),this._notify(s(i,e),t,\"start\")}}function tn(t,e){return e||!1!==t?!0===t?{}:t:null}function en(t,{plugin:e,local:i},s,n){const o=t.pluginScopeKeys(e),a=t.getOptionScopes(s,o);return i&&e.defaults&&a.push(e.defaults),t.createResolver(a,n,[\"\"],{scriptable:!1,indexable:!1,allKeys:!0})}function sn(t,e){const i=ue.datasets[t]||{};return((e.datasets||{})[t]||{}).indexAxis||e.indexAxis||i.indexAxis||\"x\"}function nn(t,e){if(\"x\"===t||\"y\"===t||\"r\"===t)return t;var i;if(t=e.axis||(\"top\"===(i=e.position)||\"bottom\"===i?\"x\":\"left\"===i||\"right\"===i?\"y\":void 0)||t.length>1&&nn(t[0].toLowerCase(),e))return t;throw new Error(`Cannot determine type of '${name}' axis. Please provide 'axis' or 'position' option.`)}function on(t){const e=t.options||(t.options={});e.plugins=l(e.plugins,{}),e.scales=function(t,e){const i=re[t.type]||{scales:{}},s=e.scales||{},n=sn(t.type,e),a=Object.create(null);return Object.keys(s).forEach((t=>{const e=s[t];if(!o(e))return console.error(`Invalid scale configuration for scale: ${t}`);if(e._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${t}`);const r=nn(t,e),l=function(t,e){return t===e?\"_index_\":\"_value_\"}(r,n),h=i.scales||{};a[t]=x(Object.create(null),[{axis:r},e,h[r],h[l]])})),t.data.datasets.forEach((i=>{const n=i.type||t.type,o=i.indexAxis||sn(n,e),r=(re[n]||{}).scales||{};Object.keys(r).forEach((t=>{const e=function(t,e){let i=t;return\"_index_\"===t?i=e:\"_value_\"===t&&(i=\"x\"===e?\"y\":\"x\"),i}(t,o),n=i[e+\"AxisID\"]||e;a[n]=a[n]||Object.create(null),x(a[n],[{axis:e},s[n],r[t]])}))})),Object.keys(a).forEach((t=>{const e=a[t];x(e,[ue.scales[e.type],ue.scale])})),a}(t,e)}function an(t){return(t=t||{}).datasets=t.datasets||[],t.labels=t.labels||[],t}const rn=new Map,ln=new Set;function hn(t,e){let i=rn.get(t);return i||(i=e(),rn.set(t,i),ln.add(i)),i}const cn=(t,e,i)=>{const s=M(e,i);void 0!==s&&t.add(s)};class dn{constructor(t){this._config=function(t){return(t=t||{}).data=an(t.data),on(t),t}(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=an(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),on(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return hn(t,(()=>[[`datasets.${t}`,\"\"]]))}datasetAnimationScopeKeys(t,e){return hn(`${t}.transition.${e}`,(()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,\"\"]]))}datasetElementScopeKeys(t,e){return hn(`${t}-${e}`,(()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,\"\"]]))}pluginScopeKeys(t){const e=t.id;return hn(`${this.type}-plugin-${e}`,(()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]]))}_cachedScopes(t,e){const i=this._scopeCache;let s=i.get(t);return s&&!e||(s=new Map,i.set(t,s)),s}getOptionScopes(t,e,i){const{options:s,type:n}=this,o=this._cachedScopes(t,i),a=o.get(e);if(a)return a;const r=new Set;e.forEach((e=>{t&&(r.add(t),e.forEach((e=>cn(r,t,e)))),e.forEach((t=>cn(r,s,t))),e.forEach((t=>cn(r,re[n]||{},t))),e.forEach((t=>cn(r,ue,t))),e.forEach((t=>cn(r,le,t)))}));const l=Array.from(r);return 0===l.length&&l.push(Object.create(null)),ln.has(e)&&o.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,re[e]||{},ue.datasets[e]||{},{type:e},ue,le]}resolveNamedOptions(t,e,i,s=[\"\"]){const o={$shared:!0},{resolver:a,subPrefixes:r}=un(this._resolverCache,t,s);let l=a;if(function(t,e){const{isScriptable:i,isIndexable:s}=$e(t);for(const o of e){const e=i(o),a=s(o),r=(a||e)&&t[o];if(e&&(S(r)||fn(r))||a&&n(r))return!0}return!1}(a,e)){o.$shared=!1;l=je(a,i=S(i)?i():i,this.createResolver(t,i,r))}for(const t of e)o[t]=l[t];return o}createResolver(t,e,i=[\"\"],s){const{resolver:n}=un(this._resolverCache,t,i);return o(e)?je(n,e,void 0,s):n}}function un(t,e,i){let s=t.get(e);s||(s=new Map,t.set(e,s));const n=i.join();let o=s.get(n);if(!o){o={resolver:He(e,i),subPrefixes:i.filter((t=>!t.toLowerCase().includes(\"hover\")))},s.set(n,o)}return o}const fn=t=>o(t)&&Object.getOwnPropertyNames(t).reduce(((e,i)=>e||S(t[i])),!1);const gn=[\"top\",\"bottom\",\"left\",\"right\",\"chartArea\"];function pn(t,e){return\"top\"===t||\"bottom\"===t||-1===gn.indexOf(t)&&\"x\"===e}function mn(t,e){return function(i,s){return i[t]===s[t]?i[e]-s[e]:i[t]-s[t]}}function bn(t){const e=t.chart,i=e.options.animation;e.notifyPlugins(\"afterRender\"),d(i&&i.onComplete,[t],e)}function xn(t){const e=t.chart,i=e.options.animation;d(i&&i.onProgress,[t],e)}function _n(t){return fe()&&\"string\"==typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const yn={},vn=t=>{const e=_n(t);return Object.values(yn).filter((t=>t.canvas===e)).pop()};function Mn(t,e,i){const s=Object.keys(t);for(const n of s){const s=+n;if(s>=e){const o=t[n];delete t[n],(i>0||s>e)&&(t[s+i]=o)}}}class wn{static defaults=ue;static instances=yn;static overrides=re;static registry=Js;static version=\"4.2.1\";static getChart=vn;static register(...t){Js.add(...t),kn()}static unregister(...t){Js.remove(...t),kn()}constructor(t,e){const s=this.config=new dn(e),n=_n(t),o=vn(n);if(o)throw new Error(\"Canvas is already in use. Chart with ID '\"+o.id+\"' must be destroyed before the canvas with ID '\"+o.canvas.id+\"' can be reused.\");const a=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||vs(n)),this.platform.updateConfig(s);const r=this.platform.acquireContext(n,a.aspectRatio),l=r&&r.canvas,h=l&&l.height,c=l&&l.width;this.id=i(),this.ctx=r,this.canvas=l,this.width=c,this.height=h,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Qs,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=dt((t=>this.update(t)),a.resizeDelay||0),this._dataChanges=[],yn[this.id]=this,r&&l?(xt.listen(this,\"complete\",bn),xt.listen(this,\"progress\",xn),this._initialize(),this.attached&&this.update()):console.error(\"Failed to create chart: can't acquire context from the given item\")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:n,_aspectRatio:o}=this;return s(t)?e&&o?o:n?i/n:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return Js}_initialize(){return this.notifyPlugins(\"beforeInit\"),this.options.responsive?this.resize():we(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins(\"afterInit\"),this}clear(){return Ae(this.canvas,this.ctx),this}stop(){return xt.stop(this),this}resize(t,e){xt.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const i=this.options,s=this.canvas,n=i.maintainAspectRatio&&this.aspectRatio,o=this.platform.getMaximumSize(s,t,e,n),a=i.devicePixelRatio||this.platform.getDevicePixelRatio(),r=this.width?\"resize\":\"attach\";this.width=o.width,this.height=o.height,this._aspectRatio=this.aspectRatio,we(this,a,!0)&&(this.notifyPlugins(\"resize\",{size:o}),d(i.onResize,[this,o],this),this.attached&&this._doResize(r)&&this.render())}ensureScalesHaveIDs(){u(this.options.scales||{},((t,e)=>{t.id=e}))}buildOrUpdateScales(){const t=this.options,e=t.scales,i=this.scales,s=Object.keys(i).reduce(((t,e)=>(t[e]=!1,t)),{});let n=[];e&&(n=n.concat(Object.keys(e).map((t=>{const i=e[t],s=nn(t,i),n=\"r\"===s,o=\"x\"===s;return{options:i,dposition:n?\"chartArea\":o?\"bottom\":\"left\",dtype:n?\"radialLinear\":o?\"category\":\"linear\"}})))),u(n,(e=>{const n=e.options,o=n.id,a=nn(o,n),r=l(n.type,e.dtype);void 0!==n.position&&pn(n.position,a)===pn(e.dposition)||(n.position=e.dposition),s[o]=!0;let h=null;if(o in i&&i[o].type===r)h=i[o];else{h=new(Js.getScale(r))({id:o,type:r,ctx:this.ctx,chart:this}),i[h.id]=h}h.init(n,t)})),u(s,((t,e)=>{t||delete i[e]})),u(i,(t=>{ns.configure(this,t,t.options),ns.addBox(this,t)}))}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort(((t,e)=>t.index-e.index)),i>e){for(let t=e;t<i;++t)this._destroyDatasetMeta(t);t.splice(e,i-e)}this._sortedMetasets=t.slice(0).sort(mn(\"order\",\"index\"))}_removeUnreferencedMetasets(){const{_metasets:t,data:{datasets:e}}=this;t.length>e.length&&delete this._stacks,t.forEach(((t,i)=>{0===e.filter((e=>e===t._dataset)).length&&this._destroyDatasetMeta(i)}))}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let i,s;for(this._removeUnreferencedMetasets(),i=0,s=e.length;i<s;i++){const s=e[i];let n=this.getDatasetMeta(i);const o=s.type||this.config.type;if(n.type&&n.type!==o&&(this._destroyDatasetMeta(i),n=this.getDatasetMeta(i)),n.type=o,n.indexAxis=s.indexAxis||sn(o,this.options),n.order=s.order||0,n.index=i,n.label=\"\"+s.label,n.visible=this.isDatasetVisible(i),n.controller)n.controller.updateIndex(i),n.controller.linkScales();else{const e=Js.getController(o),{datasetElementType:s,dataElementType:a}=ue.datasets[o];Object.assign(e,{dataElementType:Js.getElement(a),datasetElementType:s&&Js.getElement(s)}),n.controller=new e(this,i),t.push(n.controller)}}return this._updateMetasets(),t}_resetElements(){u(this.data.datasets,((t,e)=>{this.getDatasetMeta(e).controller.reset()}),this)}reset(){this._resetElements(),this.notifyPlugins(\"reset\")}update(t){const e=this.config;e.update();const i=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),s=this._animationsDisabled=!i.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins(\"beforeUpdate\",{mode:t,cancelable:!0}))return;const n=this.buildOrUpdateControllers();this.notifyPlugins(\"beforeElementsUpdate\");let o=0;for(let t=0,e=this.data.datasets.length;t<e;t++){const{controller:e}=this.getDatasetMeta(t),i=!s&&-1===n.indexOf(e);e.buildOrUpdateElements(i),o=Math.max(+e.getMaxOverflow(),o)}o=this._minPadding=i.layout.autoPadding?o:0,this._updateLayout(o),s||u(n,(t=>{t.reset()})),this._updateDatasets(t),this.notifyPlugins(\"afterUpdate\",{mode:t}),this._layers.sort(mn(\"z\",\"_idx\"));const{_active:a,_lastEvent:r}=this;r?this._eventHandler(r,!0):a.length&&this._updateHoverStyles(a,a,!0),this.render()}_updateScales(){u(this.scales,(t=>{ns.removeBox(this,t)})),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);P(e,i)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:i,start:s,count:n}of e){Mn(t,s,\"_removeElements\"===i?-n:n)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,i=e=>new Set(t.filter((t=>t[0]===e)).map(((t,e)=>e+\",\"+t.splice(1).join(\",\")))),s=i(0);for(let t=1;t<e;t++)if(!P(s,i(t)))return;return Array.from(s).map((t=>t.split(\",\"))).map((t=>({method:t[1],start:+t[2],count:+t[3]})))}_updateLayout(t){if(!1===this.notifyPlugins(\"beforeLayout\",{cancelable:!0}))return;ns.update(this,this.width,this.height,t);const e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],u(this.boxes,(t=>{i&&\"chartArea\"===t.position||(t.configure&&t.configure(),this._layers.push(...t._layers()))}),this),this._layers.forEach(((t,e)=>{t._idx=e})),this.notifyPlugins(\"afterLayout\")}_updateDatasets(t){if(!1!==this.notifyPlugins(\"beforeDatasetsUpdate\",{mode:t,cancelable:!0})){for(let t=0,e=this.data.datasets.length;t<e;++t)this.getDatasetMeta(t).controller.configure();for(let e=0,i=this.data.datasets.length;e<i;++e)this._updateDataset(e,S(t)?t({datasetIndex:e}):t);this.notifyPlugins(\"afterDatasetsUpdate\",{mode:t})}}_updateDataset(t,e){const i=this.getDatasetMeta(t),s={meta:i,index:t,mode:e,cancelable:!0};!1!==this.notifyPlugins(\"beforeDatasetUpdate\",s)&&(i.controller._update(e),s.cancelable=!1,this.notifyPlugins(\"afterDatasetUpdate\",s))}render(){!1!==this.notifyPlugins(\"beforeRender\",{cancelable:!0})&&(xt.has(this)?this.attached&&!xt.running(this)&&xt.start(this):(this.draw(),bn({chart:this})))}draw(){let t;if(this._resizeBeforeDraw){const{width:t,height:e}=this._resizeBeforeDraw;this._resize(t,e),this._resizeBeforeDraw=null}if(this.clear(),this.width<=0||this.height<=0)return;if(!1===this.notifyPlugins(\"beforeDraw\",{cancelable:!0}))return;const e=this._layers;for(t=0;t<e.length&&e[t].z<=0;++t)e[t].draw(this.chartArea);for(this._drawDatasets();t<e.length;++t)e[t].draw(this.chartArea);this.notifyPlugins(\"afterDraw\")}_getSortedDatasetMetas(t){const e=this._sortedMetasets,i=[];let s,n;for(s=0,n=e.length;s<n;++s){const n=e[s];t&&!n.visible||i.push(n)}return i}getSortedVisibleDatasetMetas(){return this._getSortedDatasetMetas(!0)}_drawDatasets(){if(!1===this.notifyPlugins(\"beforeDatasetsDraw\",{cancelable:!0}))return;const t=this.getSortedVisibleDatasetMetas();for(let e=t.length-1;e>=0;--e)this._drawDataset(t[e]);this.notifyPlugins(\"afterDatasetsDraw\")}_drawDataset(t){const e=this.ctx,i=t._clip,s=!i.disabled,n=function(t){const{xScale:e,yScale:i}=t;if(e&&i)return{left:e.left,right:e.right,top:i.top,bottom:i.bottom}}(t)||this.chartArea,o={meta:t,index:t.index,cancelable:!0};!1!==this.notifyPlugins(\"beforeDatasetDraw\",o)&&(s&&Re(e,{left:!1===i.left?0:n.left-i.left,right:!1===i.right?this.width:n.right+i.right,top:!1===i.top?0:n.top-i.top,bottom:!1===i.bottom?this.height:n.bottom+i.bottom}),t.controller.draw(),s&&Ie(e),o.cancelable=!1,this.notifyPlugins(\"afterDatasetDraw\",o))}isPointInArea(t){return Ee(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,s){const n=Yi.modes[e];return\"function\"==typeof n?n(this,t,i,s):[]}getDatasetMeta(t){const e=this.data.datasets[t],i=this._metasets;let s=i.filter((t=>t&&t._dataset===e)).pop();return s||(s={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(s)),s}getContext(){return this.$context||(this.$context=Pi(null,{chart:this,type:\"chart\"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const i=this.getDatasetMeta(t);return\"boolean\"==typeof i.hidden?!i.hidden:!e.hidden}setDatasetVisibility(t,e){this.getDatasetMeta(t).hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){const s=i?\"show\":\"hide\",n=this.getDatasetMeta(t),o=n.controller._resolveAnimations(void 0,s);k(e)?(n.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),o.update(n,{visible:i}),this.update((e=>e.datasetIndex===t?s:void 0)))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),xt.remove(this),t=0,e=this.data.datasets.length;t<e;++t)this._destroyDatasetMeta(t)}destroy(){this.notifyPlugins(\"beforeDestroy\");const{canvas:t,ctx:e}=this;this._stop(),this.config.clearCache(),t&&(this.unbindEvents(),Ae(t,e),this.platform.releaseContext(e),this.canvas=null,this.ctx=null),delete yn[this.id],this.notifyPlugins(\"afterDestroy\")}toBase64Image(...t){return this.canvas.toDataURL(...t)}bindEvents(){this.bindUserEvents(),this.options.responsive?this.bindResponsiveEvents():this.attached=!0}bindUserEvents(){const t=this._listeners,e=this.platform,i=(i,s)=>{e.addEventListener(this,i,s),t[i]=s},s=(t,e,i)=>{t.offsetX=e,t.offsetY=i,this._eventHandler(t)};u(this.options.events,(t=>i(t,s)))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,i=(i,s)=>{e.addEventListener(this,i,s),t[i]=s},s=(i,s)=>{t[i]&&(e.removeEventListener(this,i,s),delete t[i])},n=(t,e)=>{this.canvas&&this.resize(t,e)};let o;const a=()=>{s(\"attach\",a),this.attached=!0,this.resize(),i(\"resize\",n),i(\"detach\",o)};o=()=>{this.attached=!1,s(\"resize\",n),this._stop(),this._resize(0,0),i(\"attach\",a)},e.isAttached(this.canvas)?a():o()}unbindEvents(){u(this._listeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._listeners={},u(this._responsiveListeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._responsiveListeners=void 0}updateHoverStyle(t,e,i){const s=i?\"set\":\"remove\";let n,o,a,r;for(\"dataset\"===e&&(n=this.getDatasetMeta(t[0].datasetIndex),n.controller[\"_\"+s+\"DatasetHoverStyle\"]()),a=0,r=t.length;a<r;++a){o=t[a];const e=o&&this.getDatasetMeta(o.datasetIndex).controller;e&&e[s+\"HoverStyle\"](o.element,o.datasetIndex,o.index)}}getActiveElements(){return this._active||[]}setActiveElements(t){const e=this._active||[],i=t.map((({datasetIndex:t,index:e})=>{const i=this.getDatasetMeta(t);if(!i)throw new Error(\"No dataset found at index \"+t);return{datasetIndex:t,element:i.data[e],index:e}}));!f(i,e)&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}isPluginEnabled(t){return 1===this._plugins._cache.filter((e=>e.plugin.id===t)).length}_updateHoverStyles(t,e,i){const s=this.options.hover,n=(t,e)=>t.filter((t=>!e.some((e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)))),o=n(e,t),a=i?t:n(t,e);o.length&&this.updateHoverStyle(o,s.mode,!1),a.length&&s.mode&&this.updateHoverStyle(a,s.mode,!0)}_eventHandler(t,e){const i={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},s=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins(\"beforeEvent\",i,s))return;const n=this._handleEvent(t,e,i.inChartArea);return i.cancelable=!1,this.notifyPlugins(\"afterEvent\",i,s),(n||i.changed)&&this.render(),this}_handleEvent(t,e,i){const{_active:s=[],options:n}=this,o=e,a=this._getActiveElements(t,s,i,o),r=D(t),l=function(t,e,i,s){return i&&\"mouseout\"!==t.type?s?e:t:null}(t,this._lastEvent,i,r);i&&(this._lastEvent=null,d(n.onHover,[t,a,this],this),r&&d(n.onClick,[t,a,this],this));const h=!f(a,s);return(h||e)&&(this._active=a,this._updateHoverStyles(a,s,e)),this._lastEvent=l,h}_getActiveElements(t,e,i,s){if(\"mouseout\"===t.type)return[];if(!i)return e;const n=this.options.hover;return this.getElementsAtEventForMode(t,n.mode,n,s)}}function kn(){return u(wn.instances,(t=>t._plugins.invalidate()))}function Sn(){throw new Error(\"This method is not implemented: Check that a complete date adapter is provided.\")}class Pn{static override(t){Object.assign(Pn.prototype,t)}constructor(t){this.options=t||{}}init(){}formats(){return Sn()}parse(){return Sn()}format(){return Sn()}add(){return Sn()}diff(){return Sn()}startOf(){return Sn()}endOf(){return Sn()}}var Dn={_date:Pn};function Cn(t){const e=t.iScale,i=function(t,e){if(!t._cache.$bar){const i=t.getMatchingVisibleMetas(e);let s=[];for(let e=0,n=i.length;e<n;e++)s=s.concat(i[e].controller.getAllParsedValues(t));t._cache.$bar=lt(s.sort(((t,e)=>t-e)))}return t._cache.$bar}(e,t.type);let s,n,o,a,r=e._length;const l=()=>{32767!==o&&-32768!==o&&(k(a)&&(r=Math.min(r,Math.abs(o-a)||r)),a=o)};for(s=0,n=i.length;s<n;++s)o=e.getPixelForValue(i[s]),l();for(a=void 0,s=0,n=e.ticks.length;s<n;++s)o=e.getPixelForTick(s),l();return r}function On(t,e,i,s){return n(t)?function(t,e,i,s){const n=i.parse(t[0],s),o=i.parse(t[1],s),a=Math.min(n,o),r=Math.max(n,o);let l=a,h=r;Math.abs(a)>Math.abs(r)&&(l=r,h=a),e[i.axis]=h,e._custom={barStart:l,barEnd:h,start:n,end:o,min:a,max:r}}(t,e,i,s):e[i.axis]=i.parse(t,s),e}function An(t,e,i,s){const n=t.iScale,o=t.vScale,a=n.getLabels(),r=n===o,l=[];let h,c,d,u;for(h=i,c=i+s;h<c;++h)u=e[h],d={},d[n.axis]=r||n.parse(a[h],h),l.push(On(u,d,o,h));return l}function Tn(t){return t&&void 0!==t.barStart&&void 0!==t.barEnd}function Ln(t,e,i,s){let n=e.borderSkipped;const o={};if(!n)return void(t.borderSkipped=o);if(!0===n)return void(t.borderSkipped={top:!0,right:!0,bottom:!0,left:!0});const{start:a,end:r,reverse:l,top:h,bottom:c}=function(t){let e,i,s,n,o;return t.horizontal?(e=t.base>t.x,i=\"left\",s=\"right\"):(e=t.base<t.y,i=\"bottom\",s=\"top\"),e?(n=\"end\",o=\"start\"):(n=\"start\",o=\"end\"),{start:i,end:s,reverse:e,top:n,bottom:o}}(t);\"middle\"===n&&i&&(t.enableBorderRadius=!0,(i._top||0)===s?n=h:(i._bottom||0)===s?n=c:(o[En(c,a,r,l)]=!0,n=h)),o[En(n,a,r,l)]=!0,t.borderSkipped=o}function En(t,e,i,s){var n,o,a;return s?(a=i,t=Rn(t=(n=t)===(o=e)?a:n===a?o:n,i,e)):t=Rn(t,e,i),t}function Rn(t,e,i){return\"start\"===t?e:\"end\"===t?i:t}function In(t,{inflateAmount:e},i){t.inflateAmount=\"auto\"===e?1===i?.33:0:e}class zn extends Vs{static id=\"doughnut\";static defaults={datasetElementType:!1,dataElementType:\"arc\",animation:{animateRotate:!0,animateScale:!1},animations:{numbers:{type:\"number\",properties:[\"circumference\",\"endAngle\",\"innerRadius\",\"outerRadius\",\"startAngle\",\"x\",\"y\",\"offset\",\"borderWidth\",\"spacing\"]}},cutout:\"50%\",rotation:0,circumference:360,radius:\"100%\",spacing:0,indexAxis:\"r\"};static descriptors={_scriptable:t=>\"spacing\"!==t,_indexable:t=>\"spacing\"!==t};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i,color:s}}=t.legend.options;return e.labels.map(((e,n)=>{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:s,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}}};constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const i=this.getDataset().data,s=this._cachedMeta;if(!1===this._parsing)s._parsed=i;else{let n,a,r=t=>+i[t];if(o(i[t])){const{key:t=\"value\"}=this._parsing;r=e=>+M(i[e],t)}for(n=t,a=t+e;n<a;++n)s._parsed[n]=r(n)}}_getRotation(){return $(this.options.rotation-90)}_getCircumference(){return $(this.options.circumference)}_getRotationExtents(){let t=O,e=-O;for(let i=0;i<this.chart.data.datasets.length;++i)if(this.chart.isDatasetVisible(i)&&this.chart.getDatasetMeta(i).type===this._type){const s=this.chart.getDatasetMeta(i).controller,n=s._getRotation(),o=s._getCircumference();t=Math.min(t,n),e=Math.max(e,n+o)}return{rotation:t,circumference:e-t}}update(t){const e=this.chart,{chartArea:i}=e,s=this._cachedMeta,n=s.data,o=this.getMaxBorderWidth()+this.getMaxOffset(n)+this.options.spacing,a=Math.max((Math.min(i.width,i.height)-o)/2,0),r=Math.min(h(this.options.cutout,a),1),l=this._getRingWeight(this.index),{circumference:d,rotation:u}=this._getRotationExtents(),{ratioX:f,ratioY:g,offsetX:p,offsetY:m}=function(t,e,i){let s=1,n=1,o=0,a=0;if(e<O){const r=t,l=r+e,h=Math.cos(r),c=Math.sin(r),d=Math.cos(l),u=Math.sin(l),f=(t,e,s)=>Z(t,r,l,!0)?1:Math.max(e,e*i,s,s*i),g=(t,e,s)=>Z(t,r,l,!0)?-1:Math.min(e,e*i,s,s*i),p=f(0,h,d),m=f(E,c,u),b=g(C,h,d),x=g(C+E,c,u);s=(p-b)/2,n=(m-x)/2,o=-(p+b)/2,a=-(m+x)/2}return{ratioX:s,ratioY:n,offsetX:o,offsetY:a}}(u,d,r),b=(i.width-o)/f,x=(i.height-o)/g,_=Math.max(Math.min(b,x)/2,0),y=c(this.options.radius,_),v=(y-Math.max(y*r,0))/this._getVisibleDatasetWeightTotal();this.offsetX=p*y,this.offsetY=m*y,s.total=this.calculateTotal(),this.outerRadius=y-v*this._getRingWeightOffset(this.index),this.innerRadius=Math.max(this.outerRadius-v*l,0),this.updateElements(n,0,n.length,t)}_circumference(t,e){const i=this.options,s=this._cachedMeta,n=this._getCircumference();return e&&i.animation.animateRotate||!this.chart.getDataVisibility(t)||null===s._parsed[t]||s.data[t].hidden?0:this.calculateCircumference(s._parsed[t]*n/O)}updateElements(t,e,i,s){const n=\"reset\"===s,o=this.chart,a=o.chartArea,r=o.options.animation,l=(a.left+a.right)/2,h=(a.top+a.bottom)/2,c=n&&r.animateScale,d=c?0:this.innerRadius,u=c?0:this.outerRadius,{sharedOptions:f,includeOptions:g}=this._getSharedOptions(e,s);let p,m=this._getRotation();for(p=0;p<e;++p)m+=this._circumference(p,n);for(p=e;p<e+i;++p){const e=this._circumference(p,n),i=t[p],o={x:l+this.offsetX,y:h+this.offsetY,startAngle:m,endAngle:m+e,circumference:e,outerRadius:u,innerRadius:d};g&&(o.options=f||this.resolveDataElementOptions(p,i.active?\"active\":s)),m+=e,this.updateElement(i,p,o,s)}}calculateTotal(){const t=this._cachedMeta,e=t.data;let i,s=0;for(i=0;i<e.length;i++){const n=t._parsed[i];null===n||isNaN(n)||!this.chart.getDataVisibility(i)||e[i].hidden||(s+=Math.abs(n))}return s}calculateCircumference(t){const e=this._cachedMeta.total;return e>0&&!isNaN(t)?O*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ne(e._parsed[t],i.options.locale);return{label:s[t]||\"\",value:n}}getMaxBorderWidth(t){let e=0;const i=this.chart;let s,n,o,a,r;if(!t)for(s=0,n=i.data.datasets.length;s<n;++s)if(i.isDatasetVisible(s)){o=i.getDatasetMeta(s),t=o.data,a=o.controller;break}if(!t)return 0;for(s=0,n=t.length;s<n;++s)r=a.resolveDataElementOptions(s),\"inner\"!==r.borderAlign&&(e=Math.max(e,r.borderWidth||0,r.hoverBorderWidth||0));return e}getMaxOffset(t){let e=0;for(let i=0,s=t.length;i<s;++i){const t=this.resolveDataElementOptions(i);e=Math.max(e,t.offset||0,t.hoverOffset||0)}return e}_getRingWeightOffset(t){let e=0;for(let i=0;i<t;++i)this.chart.isDatasetVisible(i)&&(e+=this._getRingWeight(i));return e}_getRingWeight(t){return Math.max(l(this.chart.data.datasets[t].weight,1),0)}_getVisibleDatasetWeightTotal(){return this._getRingWeightOffset(this.chart.data.datasets.length)||1}}class Fn extends Vs{static id=\"polarArea\";static defaults={dataElementType:\"arc\",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:\"number\",properties:[\"x\",\"y\",\"startAngle\",\"endAngle\",\"innerRadius\",\"outerRadius\"]}},indexAxis:\"r\",startAngle:0};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i,color:s}}=t.legend.options;return e.labels.map(((e,n)=>{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:s,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}},scales:{r:{type:\"radialLinear\",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ne(e._parsed[t].r,i.options.locale);return{label:s[t]||\"\",value:n}}parseObjectData(t,e,i,s){return ei.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){const t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach(((t,i)=>{const s=this.getParsed(i).r;!isNaN(s)&&this.chart.getDataVisibility(i)&&(s<e.min&&(e.min=s),s>e.max&&(e.max=s))})),e}_updateRadius(){const t=this.chart,e=t.chartArea,i=t.options,s=Math.min(e.right-e.left,e.bottom-e.top),n=Math.max(s/2,0),o=(n-Math.max(i.cutoutPercentage?n/100*i.cutoutPercentage:1,0))/t.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,i,s){const n=\"reset\"===s,o=this.chart,a=o.options.animation,r=this._cachedMeta.rScale,l=r.xCenter,h=r.yCenter,c=r.getIndexAngle(0)-.5*C;let d,u=c;const f=360/this.countVisibleElements();for(d=0;d<e;++d)u+=this._computeAngle(d,s,f);for(d=e;d<e+i;d++){const e=t[d];let i=u,g=u+this._computeAngle(d,s,f),p=o.getDataVisibility(d)?r.getDistanceFromCenterForValue(this.getParsed(d).r):0;u=g,n&&(a.animateScale&&(p=0),a.animateRotate&&(i=g=c));const m={x:l,y:h,innerRadius:0,outerRadius:p,startAngle:i,endAngle:g,options:this.resolveDataElementOptions(d,e.active?\"active\":s)};this.updateElement(e,d,m,s)}}countVisibleElements(){const t=this._cachedMeta;let e=0;return t.data.forEach(((t,i)=>{!isNaN(this.getParsed(i).r)&&this.chart.getDataVisibility(i)&&e++})),e}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?$(this.resolveDataElementOptions(t,e).angle||i):0}}var Vn=Object.freeze({__proto__:null,BarController:class extends Vs{static id=\"bar\";static defaults={datasetElementType:!1,dataElementType:\"bar\",categoryPercentage:.8,barPercentage:.9,grouped:!0,animations:{numbers:{type:\"number\",properties:[\"x\",\"y\",\"base\",\"width\",\"height\"]}}};static overrides={scales:{_index_:{type:\"category\",offset:!0,grid:{offset:!0}},_value_:{type:\"linear\",beginAtZero:!0}}};parsePrimitiveData(t,e,i,s){return An(t,e,i,s)}parseArrayData(t,e,i,s){return An(t,e,i,s)}parseObjectData(t,e,i,s){const{iScale:n,vScale:o}=t,{xAxisKey:a=\"x\",yAxisKey:r=\"y\"}=this._parsing,l=\"x\"===n.axis?a:r,h=\"x\"===o.axis?a:r,c=[];let d,u,f,g;for(d=i,u=i+s;d<u;++d)g=e[d],f={},f[n.axis]=n.parse(M(g,l),d),c.push(On(M(g,h),f,o,d));return c}updateRangeFromParsed(t,e,i,s){super.updateRangeFromParsed(t,e,i,s);const n=i._custom;n&&e===this._cachedMeta.vScale&&(t.min=Math.min(t.min,n.min),t.max=Math.max(t.max,n.max))}getMaxOverflow(){return 0}getLabelAndValue(t){const e=this._cachedMeta,{iScale:i,vScale:s}=e,n=this.getParsed(t),o=n._custom,a=Tn(o)?\"[\"+o.start+\", \"+o.end+\"]\":\"\"+s.getLabelForValue(n[s.axis]);return{label:\"\"+i.getLabelForValue(n[i.axis]),value:a}}initialize(){this.enableOptionSharing=!0,super.initialize();this._cachedMeta.stack=this.getDataset().stack}update(t){const e=this._cachedMeta;this.updateElements(e.data,0,e.data.length,t)}updateElements(t,e,i,n){const o=\"reset\"===n,{index:a,_cachedMeta:{vScale:r}}=this,l=r.getBasePixel(),h=r.isHorizontal(),c=this._getRuler(),{sharedOptions:d,includeOptions:u}=this._getSharedOptions(e,n);for(let f=e;f<e+i;f++){const e=this.getParsed(f),i=o||s(e[r.axis])?{base:l,head:l}:this._calculateBarValuePixels(f),g=this._calculateBarIndexPixels(f,c),p=(e._stacks||{})[r.axis],m={horizontal:h,base:i.base,enableBorderRadius:!p||Tn(e._custom)||a===p._top||a===p._bottom,x:h?i.head:g.center,y:h?g.center:i.head,height:h?g.size:Math.abs(i.size),width:h?Math.abs(i.size):g.size};u&&(m.options=d||this.resolveDataElementOptions(f,t[f].active?\"active\":n));const b=m.options||t[f].options;Ln(m,b,p,a),In(m,b,c.ratio),this.updateElement(t[f],f,m,n)}}_getStacks(t,e){const{iScale:i}=this._cachedMeta,n=i.getMatchingVisibleMetas(this._type).filter((t=>t.controller.options.grouped)),o=i.options.stacked,a=[],r=t=>{const i=t.controller.getParsed(e),n=i&&i[t.vScale.axis];if(s(n)||isNaN(n))return!0};for(const i of n)if((void 0===e||!r(i))&&((!1===o||-1===a.indexOf(i.stack)||void 0===o&&void 0===i.stack)&&a.push(i.stack),i.index===t))break;return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getStackIndex(t,e,i){const s=this._getStacks(t,i),n=void 0!==e?s.indexOf(e):-1;return-1===n?s.length-1:n}_getRuler(){const t=this.options,e=this._cachedMeta,i=e.iScale,s=[];let n,o;for(n=0,o=e.data.length;n<o;++n)s.push(i.getPixelForValue(this.getParsed(n)[i.axis],n));const a=t.barThickness;return{min:a||Cn(e),pixels:s,start:i._startPixel,end:i._endPixel,stackCount:this._getStackCount(),scale:i,grouped:t.grouped,ratio:a?1:t.categoryPercentage*t.barPercentage}}_calculateBarValuePixels(t){const{_cachedMeta:{vScale:e,_stacked:i,index:n},options:{base:o,minBarLength:a}}=this,r=o||0,l=this.getParsed(t),h=l._custom,c=Tn(h);let d,u,f=l[e.axis],g=0,p=i?this.applyStack(e,l,i):f;p!==f&&(g=p-f,p=f),c&&(f=h.barStart,p=h.barEnd-h.barStart,0!==f&&F(f)!==F(h.barEnd)&&(g=0),g+=f);const m=s(o)||c?g:o;let b=e.getPixelForValue(m);if(d=this.chart.getDataVisibility(t)?e.getPixelForValue(g+p):b,u=d-b,Math.abs(u)<a){u=function(t,e,i){return 0!==t?F(t):(e.isHorizontal()?1:-1)*(e.min>=i?1:-1)}(u,e,r)*a,f===r&&(b-=u/2);const t=e.getPixelForDecimal(0),s=e.getPixelForDecimal(1),o=Math.min(t,s),h=Math.max(t,s);b=Math.max(Math.min(b,h),o),d=b+u,i&&!c&&(l._stacks[e.axis]._visualValues[n]=e.getValueForPixel(d)-e.getValueForPixel(b))}if(b===e.getPixelForValue(r)){const t=F(u)*e.getLineWidthForValue(r)/2;b+=t,u-=t}return{size:u,base:b,head:d,center:d+u/2}}_calculateBarIndexPixels(t,e){const i=e.scale,n=this.options,o=n.skipNull,a=l(n.maxBarThickness,1/0);let r,h;if(e.grouped){const i=o?this._getStackCount(t):e.stackCount,l=\"flex\"===n.barThickness?function(t,e,i,s){const n=e.pixels,o=n[t];let a=t>0?n[t-1]:null,r=t<n.length-1?n[t+1]:null;const l=i.categoryPercentage;null===a&&(a=o-(null===r?e.end-e.start:r-o)),null===r&&(r=o+o-a);const h=o-(o-Math.min(a,r))/2*l;return{chunk:Math.abs(r-a)/2*l/s,ratio:i.barPercentage,start:h}}(t,e,n,i):function(t,e,i,n){const o=i.barThickness;let a,r;return s(o)?(a=e.min*i.categoryPercentage,r=i.barPercentage):(a=o*n,r=1),{chunk:a/n,ratio:r,start:e.pixels[t]-a/2}}(t,e,n,i),c=this._getStackIndex(this.index,this._cachedMeta.stack,o?t:void 0);r=l.start+l.chunk*c+l.chunk/2,h=Math.min(a,l.chunk*l.ratio)}else r=i.getPixelForValue(this.getParsed(t)[i.axis],t),h=Math.min(a,e.min*e.ratio);return{base:r-h/2,head:r+h/2,center:r,size:h}}draw(){const t=this._cachedMeta,e=t.vScale,i=t.data,s=i.length;let n=0;for(;n<s;++n)null!==this.getParsed(n)[e.axis]&&i[n].draw(this._ctx)}},BubbleController:class extends Vs{static id=\"bubble\";static defaults={datasetElementType:!1,dataElementType:\"point\",animations:{numbers:{type:\"number\",properties:[\"x\",\"y\",\"borderWidth\",\"radius\"]}}};static overrides={scales:{x:{type:\"linear\"},y:{type:\"linear\"}}};initialize(){this.enableOptionSharing=!0,super.initialize()}parsePrimitiveData(t,e,i,s){const n=super.parsePrimitiveData(t,e,i,s);for(let t=0;t<n.length;t++)n[t]._custom=this.resolveDataElementOptions(t+i).radius;return n}parseArrayData(t,e,i,s){const n=super.parseArrayData(t,e,i,s);for(let t=0;t<n.length;t++){const s=e[i+t];n[t]._custom=l(s[2],this.resolveDataElementOptions(t+i).radius)}return n}parseObjectData(t,e,i,s){const n=super.parseObjectData(t,e,i,s);for(let t=0;t<n.length;t++){const s=e[i+t];n[t]._custom=l(s&&s.r&&+s.r,this.resolveDataElementOptions(t+i).radius)}return n}getMaxOverflow(){const t=this._cachedMeta.data;let e=0;for(let i=t.length-1;i>=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart.data.labels||[],{xScale:s,yScale:n}=e,o=this.getParsed(t),a=s.getLabelForValue(o.x),r=n.getLabelForValue(o.y),l=o._custom;return{label:i[t]||\"\",value:\"(\"+a+\", \"+r+(l?\", \"+l:\"\")+\")\"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,s){const n=\"reset\"===s,{iScale:o,vScale:a}=this._cachedMeta,{sharedOptions:r,includeOptions:l}=this._getSharedOptions(e,s),h=o.axis,c=a.axis;for(let d=e;d<e+i;d++){const e=t[d],i=!n&&this.getParsed(d),u={},f=u[h]=n?o.getPixelForDecimal(.5):o.getPixelForValue(i[h]),g=u[c]=n?a.getBasePixel():a.getPixelForValue(i[c]);u.skip=isNaN(f)||isNaN(g),l&&(u.options=r||this.resolveDataElementOptions(d,e.active?\"active\":s),n&&(u.options.radius=0)),this.updateElement(e,d,u,s)}}resolveDataElementOptions(t,e){const i=this.getParsed(t);let s=super.resolveDataElementOptions(t,e);s.$shared&&(s=Object.assign({},s,{$shared:!1}));const n=s.radius;return\"active\"!==e&&(s.radius=0),s.radius+=l(i&&i._custom,n),s}},DoughnutController:zn,LineController:class extends Vs{static id=\"line\";static defaults={datasetElementType:\"line\",dataElementType:\"point\",showLine:!0,spanGaps:!1};static overrides={scales:{_index_:{type:\"category\"},_value_:{type:\"linear\"}}};initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){const e=this._cachedMeta,{dataset:i,data:s=[],_dataset:n}=e,o=this.chart._animationsDisabled;let{start:a,count:r}=pt(e,s,o);this._drawStart=a,this._drawCount=r,mt(e)&&(a=0,r=s.length),i._chart=this.chart,i._datasetIndex=this.index,i._decimated=!!n._decimated,i.points=s;const l=this.resolveDatasetElementOptions(t);this.options.showLine||(l.borderWidth=0),l.segment=this.options.segment,this.updateElement(i,void 0,{animated:!o,options:l},t),this.updateElements(s,a,r,t)}updateElements(t,e,i,n){const o=\"reset\"===n,{iScale:a,vScale:r,_stacked:l,_dataset:h}=this._cachedMeta,{sharedOptions:c,includeOptions:d}=this._getSharedOptions(e,n),u=a.axis,f=r.axis,{spanGaps:g,segment:p}=this.options,m=W(g)?g:Number.POSITIVE_INFINITY,b=this.chart._animationsDisabled||o||\"none\"===n,x=e+i,_=t.length;let y=e>0&&this.getParsed(e-1);for(let i=0;i<_;++i){const g=t[i],_=b?g:{};if(i<e||i>=x){_.skip=!0;continue}const v=this.getParsed(i),M=s(v[f]),w=_[u]=a.getPixelForValue(v[u],i),k=_[f]=o||M?r.getBasePixel():r.getPixelForValue(l?this.applyStack(r,v,l):v[f],i);_.skip=isNaN(w)||isNaN(k)||M,_.stop=i>0&&Math.abs(v[u]-y[u])>m,p&&(_.parsed=v,_.raw=h.data[i]),d&&(_.options=c||this.resolveDataElementOptions(i,g.active?\"active\":n)),b||this.updateElement(g,i,_,n),y=v}}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,s=t.data||[];if(!s.length)return i;const n=s[0].size(this.resolveDataElementOptions(0)),o=s[s.length-1].size(this.resolveDataElementOptions(s.length-1));return Math.max(i,n,o)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}},PolarAreaController:Fn,PieController:class extends zn{static id=\"pie\";static defaults={cutout:0,rotation:0,circumference:360,radius:\"100%\"}},RadarController:class extends Vs{static id=\"radar\";static defaults={datasetElementType:\"line\",dataElementType:\"point\",indexAxis:\"r\",showLine:!0,elements:{line:{fill:\"start\"}}};static overrides={aspectRatio:1,scales:{r:{type:\"radialLinear\"}}};getLabelAndValue(t){const e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:\"\"+e.getLabelForValue(i[e.axis])}}parseObjectData(t,e,i,s){return ei.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta,i=e.dataset,s=e.data||[],n=e.iScale.getLabels();if(i.points=s,\"resize\"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const o={_loop:!0,_fullLoop:n.length===s.length,options:e};this.updateElement(i,void 0,o,t)}this.updateElements(s,0,s.length,t)}updateElements(t,e,i,s){const n=this._cachedMeta.rScale,o=\"reset\"===s;for(let a=e;a<e+i;a++){const e=t[a],i=this.resolveDataElementOptions(a,e.active?\"active\":s),r=n.getPointPositionForValue(a,this.getParsed(a).r),l=o?n.xCenter:r.x,h=o?n.yCenter:r.y,c={x:l,y:h,angle:r.angle,skip:isNaN(l)||isNaN(h),options:i};this.updateElement(e,a,c,s)}}},ScatterController:class extends Vs{static id=\"scatter\";static defaults={datasetElementType:!1,dataElementType:\"point\",showLine:!1,fill:!1};static overrides={interaction:{mode:\"point\"},scales:{x:{type:\"linear\"},y:{type:\"linear\"}}};getLabelAndValue(t){const e=this._cachedMeta,i=this.chart.data.labels||[],{xScale:s,yScale:n}=e,o=this.getParsed(t),a=s.getLabelForValue(o.x),r=n.getLabelForValue(o.y);return{label:i[t]||\"\",value:\"(\"+a+\", \"+r+\")\"}}update(t){const e=this._cachedMeta,{data:i=[]}=e,s=this.chart._animationsDisabled;let{start:n,count:o}=pt(e,i,s);if(this._drawStart=n,this._drawCount=o,mt(e)&&(n=0,o=i.length),this.options.showLine){const{dataset:n,_dataset:o}=e;n._chart=this.chart,n._datasetIndex=this.index,n._decimated=!!o._decimated,n.points=i;const a=this.resolveDatasetElementOptions(t);a.segment=this.options.segment,this.updateElement(n,void 0,{animated:!s,options:a},t)}this.updateElements(i,n,o,t)}addElements(){const{showLine:t}=this.options;!this.datasetElementType&&t&&(this.datasetElementType=this.chart.registry.getElement(\"line\")),super.addElements()}updateElements(t,e,i,n){const o=\"reset\"===n,{iScale:a,vScale:r,_stacked:l,_dataset:h}=this._cachedMeta,c=this.resolveDataElementOptions(e,n),d=this.getSharedOptions(c),u=this.includeOptions(n,d),f=a.axis,g=r.axis,{spanGaps:p,segment:m}=this.options,b=W(p)?p:Number.POSITIVE_INFINITY,x=this.chart._animationsDisabled||o||\"none\"===n;let _=e>0&&this.getParsed(e-1);for(let c=e;c<e+i;++c){const e=t[c],i=this.getParsed(c),p=x?e:{},y=s(i[g]),v=p[f]=a.getPixelForValue(i[f],c),M=p[g]=o||y?r.getBasePixel():r.getPixelForValue(l?this.applyStack(r,i,l):i[g],c);p.skip=isNaN(v)||isNaN(M)||y,p.stop=c>0&&Math.abs(i[f]-_[f])>b,m&&(p.parsed=i,p.raw=h.data[c]),u&&(p.options=d||this.resolveDataElementOptions(c,e.active?\"active\":n)),x||this.updateElement(e,c,p,n),_=i}this.updateSharedOptions(d,n,c)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let t=0;for(let i=e.length-1;i>=0;--i)t=Math.max(t,e[i].size(this.resolveDataElementOptions(i))/2);return t>0&&t}const i=t.dataset,s=i.options&&i.options.borderWidth||0;if(!e.length)return s;const n=e[0].size(this.resolveDataElementOptions(0)),o=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(s,n,o)/2}}});function Bn(t,e,i,s){const n=_i(t.options.borderRadius,[\"outerStart\",\"outerEnd\",\"innerStart\",\"innerEnd\"]);const o=(i-e)/2,a=Math.min(o,s*e/2),r=t=>{const e=(i-Math.min(o,t))*s/2;return J(t,0,Math.min(o,e))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:J(n.innerStart,0,a),innerEnd:J(n.innerEnd,0,a)}}function Nn(t,e,i,s){return{x:i+t*Math.cos(e),y:s+t*Math.sin(e)}}function Wn(t,e,i,s,n,o){const{x:a,y:r,startAngle:l,pixelMargin:h,innerRadius:c}=e,d=Math.max(e.outerRadius+s+i-h,0),u=c>0?c+s+i+h:0;let f=0;const g=n-l;if(s){const t=((c>0?c-s:0)+(d>0?d-s:0))/2;f=(g-(0!==t?g*t/(t+s):g))/2}const p=(g-Math.max(.001,g*d-i/C)/d)/2,m=l+p+f,b=n-p-f,{outerStart:x,outerEnd:_,innerStart:y,innerEnd:v}=Bn(e,u,d,b-m),M=d-x,w=d-_,k=m+x/M,S=b-_/w,P=u+y,D=u+v,O=m+y/P,A=b-v/D;if(t.beginPath(),o){const e=(k+S)/2;if(t.arc(a,r,d,k,e),t.arc(a,r,d,e,S),_>0){const e=Nn(w,S,a,r);t.arc(e.x,e.y,_,S,b+E)}const i=Nn(D,b,a,r);if(t.lineTo(i.x,i.y),v>0){const e=Nn(D,A,a,r);t.arc(e.x,e.y,v,b+E,A+Math.PI)}const s=(b-v/u+(m+y/u))/2;if(t.arc(a,r,u,b-v/u,s,!0),t.arc(a,r,u,s,m+y/u,!0),y>0){const e=Nn(P,O,a,r);t.arc(e.x,e.y,y,O+Math.PI,m-E)}const n=Nn(M,m,a,r);if(t.lineTo(n.x,n.y),x>0){const e=Nn(M,k,a,r);t.arc(e.x,e.y,x,m-E,k)}}else{t.moveTo(a,r);const e=Math.cos(k)*d+a,i=Math.sin(k)*d+r;t.lineTo(e,i);const s=Math.cos(S)*d+a,n=Math.sin(S)*d+r;t.lineTo(s,n)}t.closePath()}function Hn(t,e,i,s,n){const{fullCircles:o,startAngle:a,circumference:r,options:l}=e,{borderWidth:h,borderJoinStyle:c}=l,d=\"inner\"===l.borderAlign;if(!h)return;d?(t.lineWidth=2*h,t.lineJoin=c||\"round\"):(t.lineWidth=h,t.lineJoin=c||\"bevel\");let u=e.endAngle;if(o){Wn(t,e,i,s,u,n);for(let e=0;e<o;++e)t.stroke();isNaN(r)||(u=a+(r%O||O))}d&&function(t,e,i){const{startAngle:s,pixelMargin:n,x:o,y:a,outerRadius:r,innerRadius:l}=e;let h=n/r;t.beginPath(),t.arc(o,a,r,s-h,i+h),l>n?(h=n/l,t.arc(o,a,l,i+h,s-h,!0)):t.arc(o,a,n,i+E,s-E),t.closePath(),t.clip()}(t,e,u),o||(Wn(t,e,i,s,u,n),t.stroke())}function jn(t,e,i=e){t.lineCap=l(i.borderCapStyle,e.borderCapStyle),t.setLineDash(l(i.borderDash,e.borderDash)),t.lineDashOffset=l(i.borderDashOffset,e.borderDashOffset),t.lineJoin=l(i.borderJoinStyle,e.borderJoinStyle),t.lineWidth=l(i.borderWidth,e.borderWidth),t.strokeStyle=l(i.borderColor,e.borderColor)}function $n(t,e,i){t.lineTo(i.x,i.y)}function Yn(t,e,i={}){const s=t.length,{start:n=0,end:o=s-1}=i,{start:a,end:r}=e,l=Math.max(n,a),h=Math.min(o,r),c=n<a&&o<a||n>r&&o>r;return{count:s,start:l,loop:e.loop,ilen:h<l&&!c?s+h-l:h-l}}function Un(t,e,i,s){const{points:n,options:o}=e,{count:a,start:r,loop:l,ilen:h}=Yn(n,i,s),c=function(t){return t.stepped?ze:t.tension||\"monotone\"===t.cubicInterpolationMode?Fe:$n}(o);let d,u,f,{move:g=!0,reverse:p}=s||{};for(d=0;d<=h;++d)u=n[(r+(p?h-d:d))%a],u.skip||(g?(t.moveTo(u.x,u.y),g=!1):c(t,f,u,p,o.stepped),f=u);return l&&(u=n[(r+(p?h:0))%a],c(t,f,u,p,o.stepped)),!!l}function Xn(t,e,i,s){const n=e.points,{count:o,start:a,ilen:r}=Yn(n,i,s),{move:l=!0,reverse:h}=s||{};let c,d,u,f,g,p,m=0,b=0;const x=t=>(a+(h?r-t:t))%o,_=()=>{f!==g&&(t.lineTo(m,g),t.lineTo(m,f),t.lineTo(m,p))};for(l&&(d=n[x(0)],t.moveTo(d.x,d.y)),c=0;c<=r;++c){if(d=n[x(c)],d.skip)continue;const e=d.x,i=d.y,s=0|e;s===u?(i<f?f=i:i>g&&(g=i),m=(b*m+e)/++b):(_(),t.lineTo(e,i),u=s,b=0,f=g=i),p=i}_()}function qn(t){const e=t.options,i=e.borderDash&&e.borderDash.length;return!(t._decimated||t._loop||e.tension||\"monotone\"===e.cubicInterpolationMode||e.stepped||i)?Xn:Un}const Kn=\"function\"==typeof Path2D;function Gn(t,e,i,s){Kn&&!e.options.segment?function(t,e,i,s){let n=e._path;n||(n=e._path=new Path2D,e.path(n,i,s)&&n.closePath()),jn(t,e.options),t.stroke(n)}(t,e,i,s):function(t,e,i,s){const{segments:n,options:o}=e,a=qn(e);for(const r of n)jn(t,o,r.style),t.beginPath(),a(t,e,r,{start:i,end:i+s-1})&&t.closePath(),t.stroke()}(t,e,i,s)}class Zn extends Bs{static id=\"line\";static defaults={borderCapStyle:\"butt\",borderDash:[],borderDashOffset:0,borderJoinStyle:\"miter\",borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:\"default\",fill:!1,spanGaps:!1,stepped:!1,tension:0};static defaultRoutes={backgroundColor:\"backgroundColor\",borderColor:\"borderColor\"};static descriptors={_scriptable:!0,_indexable:t=>\"borderDash\"!==t&&\"fill\"!==t};constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const i=this.options;if((i.tension||\"monotone\"===i.cubicInterpolationMode)&&!i.stepped&&!this._pointsUpdated){const s=i.spanGaps?this._loop:this._fullLoop;li(this._points,i,t,s,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=Ri(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){const i=this.options,s=t[e],n=this.points,o=Ei(this,{property:e,start:s,end:s});if(!o.length)return;const a=[],r=function(t){return t.stepped?gi:t.tension||\"monotone\"===t.cubicInterpolationMode?pi:fi}(i);let l,h;for(l=0,h=o.length;l<h;++l){const{start:h,end:c}=o[l],d=n[h],u=n[c];if(d===u){a.push(d);continue}const f=r(d,u,Math.abs((s-d[e])/(u[e]-d[e])),i.stepped);f[e]=t[e],a.push(f)}return 1===a.length?a[0]:a}pathSegment(t,e,i){return qn(this)(t,this,e,i)}path(t,e,i){const s=this.segments,n=qn(this);let o=this._loop;e=e||0,i=i||this.points.length-e;for(const a of s)o&=n(t,this,a,{start:e,end:e+i-1});return!!o}draw(t,e,i,s){const n=this.options||{};(this.points||[]).length&&n.borderWidth&&(t.save(),Gn(t,this,i,s),t.restore()),this.animated&&(this._pointsUpdated=!1,this._path=void 0)}}function Jn(t,e,i,s){const n=t.options,{[i]:o}=t.getProps([i],s);return Math.abs(e-o)<n.radius+n.hitRadius}function Qn(t,e){const{x:i,y:s,base:n,width:o,height:a}=t.getProps([\"x\",\"y\",\"base\",\"width\",\"height\"],e);let r,l,h,c,d;return t.horizontal?(d=a/2,r=Math.min(i,n),l=Math.max(i,n),h=s-d,c=s+d):(d=o/2,r=i-d,l=i+d,h=Math.min(s,n),c=Math.max(s,n)),{left:r,top:h,right:l,bottom:c}}function to(t,e,i,s){return t?0:J(e,i,s)}function eo(t){const e=Qn(t),i=e.right-e.left,s=e.bottom-e.top,n=function(t,e,i){const s=t.options.borderWidth,n=t.borderSkipped,o=yi(s);return{t:to(n.top,o.top,0,i),r:to(n.right,o.right,0,e),b:to(n.bottom,o.bottom,0,i),l:to(n.left,o.left,0,e)}}(t,i/2,s/2),a=function(t,e,i){const{enableBorderRadius:s}=t.getProps([\"enableBorderRadius\"]),n=t.options.borderRadius,a=vi(n),r=Math.min(e,i),l=t.borderSkipped,h=s||o(n);return{topLeft:to(!h||l.top||l.left,a.topLeft,0,r),topRight:to(!h||l.top||l.right,a.topRight,0,r),bottomLeft:to(!h||l.bottom||l.left,a.bottomLeft,0,r),bottomRight:to(!h||l.bottom||l.right,a.bottomRight,0,r)}}(t,i/2,s/2);return{outer:{x:e.left,y:e.top,w:i,h:s,radius:a},inner:{x:e.left+n.l,y:e.top+n.t,w:i-n.l-n.r,h:s-n.t-n.b,radius:{topLeft:Math.max(0,a.topLeft-Math.max(n.t,n.l)),topRight:Math.max(0,a.topRight-Math.max(n.t,n.r)),bottomLeft:Math.max(0,a.bottomLeft-Math.max(n.b,n.l)),bottomRight:Math.max(0,a.bottomRight-Math.max(n.b,n.r))}}}}function io(t,e,i,s){const n=null===e,o=null===i,a=t&&!(n&&o)&&Qn(t,s);return a&&(n||tt(e,a.left,a.right))&&(o||tt(i,a.top,a.bottom))}function so(t,e){t.rect(e.x,e.y,e.w,e.h)}function no(t,e,i={}){const s=t.x!==i.x?-e:0,n=t.y!==i.y?-e:0,o=(t.x+t.w!==i.x+i.w?e:0)-s,a=(t.y+t.h!==i.y+i.h?e:0)-n;return{x:t.x+s,y:t.y+n,w:t.w+o,h:t.h+a,radius:t.radius}}var oo=Object.freeze({__proto__:null,ArcElement:class extends Bs{static id=\"arc\";static defaults={borderAlign:\"center\",borderColor:\"#fff\",borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0};static defaultRoutes={backgroundColor:\"backgroundColor\"};constructor(t){super(),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,t&&Object.assign(this,t)}inRange(t,e,i){const s=this.getProps([\"x\",\"y\"],i),{angle:n,distance:o}=X(s,{x:t,y:e}),{startAngle:a,endAngle:r,innerRadius:h,outerRadius:c,circumference:d}=this.getProps([\"startAngle\",\"endAngle\",\"innerRadius\",\"outerRadius\",\"circumference\"],i),u=this.options.spacing/2,f=l(d,r-a)>=O||Z(n,a,r),g=tt(o,h+u,c+u);return f&&g}getCenterPoint(t){const{x:e,y:i,startAngle:s,endAngle:n,innerRadius:o,outerRadius:a}=this.getProps([\"x\",\"y\",\"startAngle\",\"endAngle\",\"innerRadius\",\"outerRadius\"],t),{offset:r,spacing:l}=this.options,h=(s+n)/2,c=(o+a+l+r)/2;return{x:e+Math.cos(h)*c,y:i+Math.sin(h)*c}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:i}=this,s=(e.offset||0)/4,n=(e.spacing||0)/2,o=e.circular;if(this.pixelMargin=\"inner\"===e.borderAlign?.33:0,this.fullCircles=i>O?Math.floor(i/O):0,0===i||this.innerRadius<0||this.outerRadius<0)return;t.save();const a=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(a)*s,Math.sin(a)*s);const r=s*(1-Math.sin(Math.min(C,i||0)));t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,function(t,e,i,s,n){const{fullCircles:o,startAngle:a,circumference:r}=e;let l=e.endAngle;if(o){Wn(t,e,i,s,l,n);for(let e=0;e<o;++e)t.fill();isNaN(r)||(l=a+(r%O||O))}Wn(t,e,i,s,l,n),t.fill()}(t,this,r,n,o),Hn(t,this,r,n,o),t.restore()}},LineElement:Zn,PointElement:class extends Bs{static id=\"point\";static defaults={borderWidth:1,hitRadius:1,hoverBorderWidth:1,hoverRadius:4,pointStyle:\"circle\",radius:3,rotation:0};static defaultRoutes={backgroundColor:\"backgroundColor\",borderColor:\"borderColor\"};constructor(t){super(),this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,t&&Object.assign(this,t)}inRange(t,e,i){const s=this.options,{x:n,y:o}=this.getProps([\"x\",\"y\"],i);return Math.pow(t-n,2)+Math.pow(e-o,2)<Math.pow(s.hitRadius+s.radius,2)}inXRange(t,e){return Jn(this,t,\"x\",e)}inYRange(t,e){return Jn(this,t,\"y\",e)}getCenterPoint(t){const{x:e,y:i}=this.getProps([\"x\",\"y\"],t);return{x:e,y:i}}size(t){let e=(t=t||this.options||{}).radius||0;e=Math.max(e,e&&t.hoverRadius||0);return 2*(e+(e&&t.borderWidth||0))}draw(t,e){const i=this.options;this.skip||i.radius<.1||!Ee(this,e,this.size(i)/2)||(t.strokeStyle=i.borderColor,t.lineWidth=i.borderWidth,t.fillStyle=i.backgroundColor,Te(t,i,this.x,this.y))}getRange(){const t=this.options||{};return t.radius+t.hitRadius}},BarElement:class extends Bs{static id=\"bar\";static defaults={borderSkipped:\"start\",borderWidth:0,borderRadius:0,inflateAmount:\"auto\",pointStyle:void 0};static defaultRoutes={backgroundColor:\"backgroundColor\",borderColor:\"borderColor\"};constructor(t){super(),this.options=void 0,this.horizontal=void 0,this.base=void 0,this.width=void 0,this.height=void 0,this.inflateAmount=void 0,t&&Object.assign(this,t)}draw(t){const{inflateAmount:e,options:{borderColor:i,backgroundColor:s}}=this,{inner:n,outer:o}=eo(this),a=(r=o.radius).topLeft||r.topRight||r.bottomLeft||r.bottomRight?We:so;var r;t.save(),o.w===n.w&&o.h===n.h||(t.beginPath(),a(t,no(o,e,n)),t.clip(),a(t,no(n,-e,o)),t.fillStyle=i,t.fill(\"evenodd\")),t.beginPath(),a(t,no(n,e)),t.fillStyle=s,t.fill(),t.restore()}inRange(t,e,i){return io(this,t,e,i)}inXRange(t,e){return io(this,t,null,e)}inYRange(t,e){return io(this,null,t,e)}getCenterPoint(t){const{x:e,y:i,base:s,horizontal:n}=this.getProps([\"x\",\"y\",\"base\",\"horizontal\"],t);return{x:n?(e+s)/2:e,y:n?i:(i+s)/2}}getRange(t){return\"x\"===t?this.width/2:this.height/2}}});function ao(t,e,i,s){const n=t.indexOf(e);if(-1===n)return((t,e,i,s)=>(\"string\"==typeof e?(i=t.push(e)-1,s.unshift({index:i,label:e})):isNaN(e)&&(i=null),i))(t,e,i,s);return n!==t.lastIndexOf(e)?i:n}function ro(t){const e=this.getLabels();return t>=0&&t<e.length?e[t]:t}function lo(t,e,{horizontal:i,minRotation:s}){const n=$(s),o=(i?Math.sin(n):Math.cos(n))||.001,a=.75*e*(\"\"+t).length;return Math.min(e/o,a)}class ho extends Ks{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return s(t)||(\"number\"==typeof t||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const{beginAtZero:t}=this.options,{minDefined:e,maxDefined:i}=this.getUserBounds();let{min:s,max:n}=this;const o=t=>s=e?s:t,a=t=>n=i?n:t;if(t){const t=F(s),e=F(n);t<0&&e<0?a(0):t>0&&e>0&&o(0)}if(s===n){let e=0===n?1:Math.abs(.05*n);a(n+e),t||o(s-e)}this.min=s,this.max=n}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:i,stepSize:s}=t;return s?(e=Math.ceil(this.max/s)-Math.floor(this.min/s)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${s} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),i=i||11),i&&(e=Math.min(i,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let i=this.getTickLimit();i=Math.max(2,i);const n=function(t,e){const i=[],{bounds:n,step:o,min:a,max:r,precision:l,count:h,maxTicks:c,maxDigits:d,includeBounds:u}=t,f=o||1,g=c-1,{min:p,max:m}=e,b=!s(a),x=!s(r),_=!s(h),y=(m-p)/(d+1);let v,M,w,k,S=B((m-p)/g/f)*f;if(S<1e-14&&!b&&!x)return[{value:p},{value:m}];k=Math.ceil(m/S)-Math.floor(p/S),k>g&&(S=B(k*S/g/f)*f),s(l)||(v=Math.pow(10,l),S=Math.ceil(S*v)/v),\"ticks\"===n?(M=Math.floor(p/S)*S,w=Math.ceil(m/S)*S):(M=p,w=m),b&&x&&o&&H((r-a)/o,S/1e3)?(k=Math.round(Math.min((r-a)/S,c)),S=(r-a)/k,M=a,w=r):_?(M=b?a:M,w=x?r:w,k=h-1,S=(w-M)/k):(k=(w-M)/S,k=V(k,Math.round(k),S/1e3)?Math.round(k):Math.ceil(k));const P=Math.max(U(S),U(M));v=Math.pow(10,s(l)?P:l),M=Math.round(M*v)/v,w=Math.round(w*v)/v;let D=0;for(b&&(u&&M!==a?(i.push({value:a}),M<a&&D++,V(Math.round((M+D*S)*v)/v,a,lo(a,y,t))&&D++):M<a&&D++);D<k;++D)i.push({value:Math.round((M+D*S)*v)/v});return x&&u&&w!==r?i.length&&V(i[i.length-1].value,r,lo(r,y,t))?i[i.length-1].value=r:i.push({value:r}):x&&w!==r||i.push({value:w}),i}({maxTicks:i,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:!1!==e.includeBounds},this._range||this);return\"ticks\"===t.bounds&&j(n,this,\"value\"),t.reverse?(n.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),n}configure(){const t=this.ticks;let e=this.min,i=this.max;if(super.configure(),this.options.offset&&t.length){const s=(i-e)/Math.max(t.length-1,1)/2;e-=s,i+=s}this._startValue=e,this._endValue=i,this._valueRange=i-e}getLabelForValue(t){return ne(t,this.chart.options.locale,this.options.ticks.format)}}class co extends ho{static id=\"linear\";static defaults={ticks:{callback:ae.formatters.numeric}};determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=a(t)?t:0,this.max=a(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,i=$(this.options.ticks.minRotation),s=(t?Math.sin(i):Math.cos(i))||.001,n=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,n.lineHeight/s))}getPixelForValue(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}const uo=t=>Math.floor(z(t)),fo=(t,e)=>Math.pow(10,uo(t)+e);function go(t){return 1===t/Math.pow(10,uo(t))}function po(t,e,i){const s=Math.pow(10,i),n=Math.floor(t/s);return Math.ceil(e/s)-n}function mo(t,{min:e,max:i}){e=r(t.min,e);const s=[],n=uo(e);let o=function(t,e){let i=uo(e-t);for(;po(t,e,i)>10;)i++;for(;po(t,e,i)<10;)i--;return Math.min(i,uo(t))}(e,i),a=o<0?Math.pow(10,Math.abs(o)):1;const l=Math.pow(10,o),h=n>o?Math.pow(10,n):0,c=Math.round((e-h)*a)/a,d=Math.floor((e-h)/l/10)*l*10;let u=Math.floor((c-d)/Math.pow(10,o)),f=r(t.min,Math.round((h+d+u*Math.pow(10,o))*a)/a);for(;f<i;)s.push({value:f,major:go(f),significand:u}),u>=10?u=u<15?15:20:u++,u>=20&&(o++,u=2,a=o>=0?1:a),f=Math.round((h+d+u*Math.pow(10,o))*a)/a;const g=r(t.max,f);return s.push({value:g,major:go(g),significand:u}),s}class bo extends Ks{static id=\"logarithmic\";static defaults={ticks:{callback:ae.formatters.logarithmic,major:{enabled:!0}}};constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const i=ho.prototype.parse.apply(this,[t,e]);if(0!==i)return a(i)&&i>0?i:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=a(t)?Math.max(0,t):null,this.max=a(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!a(this._userMin)&&(this.min=t===fo(this.min,0)?fo(this.min,-1):fo(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let i=this.min,s=this.max;const n=e=>i=t?i:e,o=t=>s=e?s:t;i===s&&(i<=0?(n(1),o(10)):(n(fo(i,-1)),o(fo(s,1)))),i<=0&&n(fo(s,-1)),s<=0&&o(fo(i,1)),this.min=i,this.max=s}buildTicks(){const t=this.options,e=mo({min:this._userMin,max:this._userMax},this);return\"ticks\"===t.bounds&&j(e,this,\"value\"),t.reverse?(e.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),e}getLabelForValue(t){return void 0===t?\"0\":ne(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=z(t),this._valueRange=z(this.max)-z(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(z(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function xo(t){const e=t.ticks;if(e.display&&t.display){const t=Mi(e.backdropPadding);return l(e.font&&e.font.size,ue.font.size)+t.height}return 0}function _o(t,e,i,s,n){return t===s||t===n?{start:e-i/2,end:e+i/2}:t<s||t>n?{start:e-i,end:e}:{start:e,end:e+i}}function yo(t){const e={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},i=Object.assign({},e),s=[],o=[],a=t._pointLabels.length,r=t.options.pointLabels,l=r.centerPointLabels?C/a:0;for(let u=0;u<a;u++){const a=r.setContext(t.getPointLabelContext(u));o[u]=a.padding;const f=t.getPointPosition(u,t.drawingArea+o[u],l),g=wi(a.font),p=(h=t.ctx,c=g,d=n(d=t._pointLabels[u])?d:[d],{w:Ce(h,c.string,d),h:d.length*c.lineHeight});s[u]=p;const m=G(t.getIndexAngle(u)+l),b=Math.round(Y(m));vo(i,e,m,_o(b,f.x,p.w,0,180),_o(b,f.y,p.h,90,270))}var h,c,d;t.setCenterPoint(e.l-i.l,i.r-e.r,e.t-i.t,i.b-e.b),t._pointLabelItems=function(t,e,i){const s=[],n=t._pointLabels.length,o=t.options,a=xo(o)/2,r=t.drawingArea,l=o.pointLabels.centerPointLabels?C/n:0;for(let o=0;o<n;o++){const n=t.getPointPosition(o,r+a+i[o],l),h=Math.round(Y(G(n.angle+E))),c=e[o],d=ko(n.y,c.h,h),u=Mo(h),f=wo(n.x,c.w,u);s.push({x:n.x,y:d,textAlign:u,left:f,top:d,right:f+c.w,bottom:d+c.h})}return s}(t,s,o)}function vo(t,e,i,s,n){const o=Math.abs(Math.sin(i)),a=Math.abs(Math.cos(i));let r=0,l=0;s.start<e.l?(r=(e.l-s.start)/o,t.l=Math.min(t.l,e.l-r)):s.end>e.r&&(r=(s.end-e.r)/o,t.r=Math.max(t.r,e.r+r)),n.start<e.t?(l=(e.t-n.start)/a,t.t=Math.min(t.t,e.t-l)):n.end>e.b&&(l=(n.end-e.b)/a,t.b=Math.max(t.b,e.b+l))}function Mo(t){return 0===t||180===t?\"center\":t<180?\"left\":\"right\"}function wo(t,e,i){return\"right\"===i?t-=e:\"center\"===i&&(t-=e/2),t}function ko(t,e,i){return 90===i||270===i?t-=e/2:(i>270||i<90)&&(t-=e),t}function So(t,e,i,s){const{ctx:n}=t;if(i)n.arc(t.xCenter,t.yCenter,e,0,O);else{let i=t.getPointPosition(0,e);n.moveTo(i.x,i.y);for(let o=1;o<s;o++)i=t.getPointPosition(o,e),n.lineTo(i.x,i.y)}}class Po extends ho{static id=\"radialLinear\";static defaults={display:!0,animate:!0,position:\"chartArea\",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:ae.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback:t=>t,padding:5,centerPointLabels:!1}};static defaultRoutes={\"angleLines.color\":\"borderColor\",\"pointLabels.color\":\"color\",\"ticks.color\":\"color\"};static descriptors={angleLines:{_fallback:\"grid\"}};constructor(t){super(t),this.xCenter=void 0,this.yCenter=void 0,this.drawingArea=void 0,this._pointLabels=[],this._pointLabelItems=[]}setDimensions(){const t=this._padding=Mi(xo(this.options)/2),e=this.width=this.maxWidth-t.width,i=this.height=this.maxHeight-t.height;this.xCenter=Math.floor(this.left+e/2+t.left),this.yCenter=Math.floor(this.top+i/2+t.top),this.drawingArea=Math.floor(Math.min(e,i)/2)}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!1);this.min=a(t)&&!isNaN(t)?t:0,this.max=a(e)&&!isNaN(e)?e:0,this.handleTickRangeOptions()}computeTickLimit(){return Math.ceil(this.drawingArea/xo(this.options))}generateTickLabels(t){ho.prototype.generateTickLabels.call(this,t),this._pointLabels=this.getLabels().map(((t,e)=>{const i=d(this.options.pointLabels.callback,[t,e],this);return i||0===i?i:\"\"})).filter(((t,e)=>this.chart.getDataVisibility(e)))}fit(){const t=this.options;t.display&&t.pointLabels.display?yo(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,i,s){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((i-s)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,i,s))}getIndexAngle(t){return G(t*(O/(this._pointLabels.length||1))+$(this.options.startAngle||0))}getDistanceFromCenterForValue(t){if(s(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(s(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t<e.length){const i=e[t];return function(t,e,i){return Pi(t,{label:i,index:e,type:\"pointLabel\"})}(this.getContext(),t,i)}}getPointPosition(t,e,i=0){const s=this.getIndexAngle(t)-E+i;return{x:Math.cos(s)*e+this.xCenter,y:Math.sin(s)*e+this.yCenter,angle:s}}getPointPositionForValue(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))}getBasePosition(t){return this.getPointPositionForValue(t||0,this.getBaseValue())}getPointLabelPosition(t){const{left:e,top:i,right:s,bottom:n}=this._pointLabelItems[t];return{left:e,top:i,right:s,bottom:n}}drawBackground(){const{backgroundColor:t,grid:{circular:e}}=this.options;if(t){const i=this.ctx;i.save(),i.beginPath(),So(this,this.getDistanceFromCenterForValue(this._endValue),e,this._pointLabels.length),i.closePath(),i.fillStyle=t,i.fill(),i.restore()}}drawGrid(){const t=this.ctx,e=this.options,{angleLines:i,grid:n,border:o}=e,a=this._pointLabels.length;let r,l,h;if(e.pointLabels.display&&function(t,e){const{ctx:i,options:{pointLabels:n}}=t;for(let o=e-1;o>=0;o--){const e=n.setContext(t.getPointLabelContext(o)),a=wi(e.font),{x:r,y:l,textAlign:h,left:c,top:d,right:u,bottom:f}=t._pointLabelItems[o],{backdropColor:g}=e;if(!s(g)){const t=vi(e.borderRadius),s=Mi(e.backdropPadding);i.fillStyle=g;const n=c-s.left,o=d-s.top,a=u-c+s.width,r=f-d+s.height;Object.values(t).some((t=>0!==t))?(i.beginPath(),We(i,{x:n,y:o,w:a,h:r,radius:t}),i.fill()):i.fillRect(n,o,a,r)}Ve(i,t._pointLabels[o],r,l+a.lineHeight/2,a,{color:e.color,textAlign:h,textBaseline:\"middle\"})}}(this,a),n.display&&this.ticks.forEach(((t,e)=>{if(0!==e){l=this.getDistanceFromCenterForValue(t.value);const i=this.getContext(e),s=n.setContext(i),r=o.setContext(i);!function(t,e,i,s,n){const o=t.ctx,a=e.circular,{color:r,lineWidth:l}=e;!a&&!s||!r||!l||i<0||(o.save(),o.strokeStyle=r,o.lineWidth=l,o.setLineDash(n.dash),o.lineDashOffset=n.dashOffset,o.beginPath(),So(t,i,a,s),o.closePath(),o.stroke(),o.restore())}(this,s,l,a,r)}})),i.display){for(t.save(),r=a-1;r>=0;r--){const s=i.setContext(this.getPointLabelContext(r)),{color:n,lineWidth:o}=s;o&&n&&(t.lineWidth=o,t.strokeStyle=n,t.setLineDash(s.borderDash),t.lineDashOffset=s.borderDashOffset,l=this.getDistanceFromCenterForValue(e.ticks.reverse?this.min:this.max),h=this.getPointPosition(r,l),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(h.x,h.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,i=e.ticks;if(!i.display)return;const s=this.getIndexAngle(0);let n,o;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(s),t.textAlign=\"center\",t.textBaseline=\"middle\",this.ticks.forEach(((s,a)=>{if(0===a&&!e.reverse)return;const r=i.setContext(this.getContext(a)),l=wi(r.font);if(n=this.getDistanceFromCenterForValue(this.ticks[a].value),r.showLabelBackdrop){t.font=l.string,o=t.measureText(s.label).width,t.fillStyle=r.backdropColor;const e=Mi(r.backdropPadding);t.fillRect(-o/2-e.left,-n-l.size/2-e.top,o+e.width,l.size+e.height)}Ve(t,s.label,0,-n,l,{color:r.color})})),t.restore()}drawTitle(){}}const Do={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Co=Object.keys(Do);function Oo(t,e){return t-e}function Ao(t,e){if(s(e))return null;const i=t._adapter,{parser:n,round:o,isoWeekday:r}=t._parseOpts;let l=e;return\"function\"==typeof n&&(l=n(l)),a(l)||(l=\"string\"==typeof n?i.parse(l,n):i.parse(l)),null===l?null:(o&&(l=\"week\"!==o||!W(r)&&!0!==r?i.startOf(l,o):i.startOf(l,\"isoWeek\",r)),+l)}function To(t,e,i,s){const n=Co.length;for(let o=Co.indexOf(t);o<n-1;++o){const t=Do[Co[o]],n=t.steps?t.steps:Number.MAX_SAFE_INTEGER;if(t.common&&Math.ceil((i-e)/(n*t.size))<=s)return Co[o]}return Co[n-1]}function Lo(t,e,i){if(i){if(i.length){const{lo:s,hi:n}=et(i,e);t[i[s]>=e?i[s]:i[n]]=!0}}else t[e]=!0}function Eo(t,e,i){const s=[],n={},o=e.length;let a,r;for(a=0;a<o;++a)r=e[a],n[r]=a,s.push({value:r,major:!1});return 0!==o&&i?function(t,e,i,s){const n=t._adapter,o=+n.startOf(e[0].value,s),a=e[e.length-1].value;let r,l;for(r=o;r<=a;r=+n.add(r,1,s))l=i[r],l>=0&&(e[l].major=!0);return e}(t,s,n,i):s}class Ro extends Ks{static id=\"time\";static defaults={bounds:\"data\",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:\"millisecond\",displayFormats:{}},ticks:{source:\"auto\",callback:!1,major:{enabled:!1}}};constructor(t){super(t),this._cache={data:[],labels:[],all:[]},this._unit=\"day\",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(t,e={}){const i=t.time||(t.time={}),s=this._adapter=new Dn._date(t.adapters.date);s.init(e),x(i.displayFormats,s.formats()),this._parseOpts={parser:i.parser,round:i.round,isoWeekday:i.isoWeekday},super.init(t),this._normalized=e.normalized}parse(t,e){return void 0===t?null:Ao(this,t)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const t=this.options,e=this._adapter,i=t.time.unit||\"day\";let{min:s,max:n,minDefined:o,maxDefined:r}=this.getUserBounds();function l(t){o||isNaN(t.min)||(s=Math.min(s,t.min)),r||isNaN(t.max)||(n=Math.max(n,t.max))}o&&r||(l(this._getLabelBounds()),\"ticks\"===t.bounds&&\"labels\"===t.ticks.source||l(this.getMinMax(!1))),s=a(s)&&!isNaN(s)?s:+e.startOf(Date.now(),i),n=a(n)&&!isNaN(n)?n:+e.endOf(Date.now(),i)+1,this.min=Math.min(s,n-1),this.max=Math.max(s+1,n)}_getLabelBounds(){const t=this.getLabelTimestamps();let e=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;return t.length&&(e=t[0],i=t[t.length-1]),{min:e,max:i}}buildTicks(){const t=this.options,e=t.time,i=t.ticks,s=\"labels\"===i.source?this.getLabelTimestamps():this._generate();\"ticks\"===t.bounds&&s.length&&(this.min=this._userMin||s[0],this.max=this._userMax||s[s.length-1]);const n=this.min,o=nt(s,n,this.max);return this._unit=e.unit||(i.autoSkip?To(e.minUnit,this.min,this.max,this._getLabelCapacity(n)):function(t,e,i,s,n){for(let o=Co.length-1;o>=Co.indexOf(i);o--){const i=Co[o];if(Do[i].common&&t._adapter.diff(n,s,i)>=e-1)return i}return Co[i?Co.indexOf(i):0]}(this,o.length,e.minUnit,this.min,this.max)),this._majorUnit=i.major.enabled&&\"year\"!==this._unit?function(t){for(let e=Co.indexOf(t)+1,i=Co.length;e<i;++e)if(Do[Co[e]].common)return Co[e]}(this._unit):void 0,this.initOffsets(s),t.reverse&&o.reverse(),Eo(this,o,this._majorUnit)}afterAutoSkip(){this.options.offsetAfterAutoskip&&this.initOffsets(this.ticks.map((t=>+t.value)))}initOffsets(t=[]){let e,i,s=0,n=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),s=1===t.length?1-e:(this.getDecimalForValue(t[1])-e)/2,i=this.getDecimalForValue(t[t.length-1]),n=1===t.length?i:(i-this.getDecimalForValue(t[t.length-2]))/2);const o=t.length<3?.5:.25;s=J(s,0,o),n=J(n,0,o),this._offsets={start:s,end:n,factor:1/(s+1+n)}}_generate(){const t=this._adapter,e=this.min,i=this.max,s=this.options,n=s.time,o=n.unit||To(n.minUnit,e,i,this._getLabelCapacity(e)),a=l(s.ticks.stepSize,1),r=\"week\"===o&&n.isoWeekday,h=W(r)||!0===r,c={};let d,u,f=e;if(h&&(f=+t.startOf(f,\"isoWeek\",r)),f=+t.startOf(f,h?\"day\":o),t.diff(i,e,o)>1e5*a)throw new Error(e+\" and \"+i+\" are too far apart with stepSize of \"+a+\" \"+o);const g=\"data\"===s.ticks.source&&this.getDataTimestamps();for(d=f,u=0;d<i;d=+t.add(d,a,o),u++)Lo(c,d,g);return d!==i&&\"ticks\"!==s.bounds&&1!==u||Lo(c,d,g),Object.keys(c).sort(((t,e)=>t-e)).map((t=>+t))}getLabelForValue(t){const e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}format(t,e){const i=this.options.time.displayFormats,s=this._unit,n=e||i[s];return this._adapter.format(t,n)}_tickFormatFunction(t,e,i,s){const n=this.options,o=n.ticks.callback;if(o)return d(o,[t,e,i],this);const a=n.time.displayFormats,r=this._unit,l=this._majorUnit,h=r&&a[r],c=l&&a[l],u=i[e],f=l&&c&&u&&u.major;return this._adapter.format(t,s||(f?c:h))}generateTickLabels(t){let e,i,s;for(e=0,i=t.length;e<i;++e)s=t[e],s.label=this._tickFormatFunction(s.value,e,t)}getDecimalForValue(t){return null===t?NaN:(t-this.min)/(this.max-this.min)}getPixelForValue(t){const e=this._offsets,i=this.getDecimalForValue(t);return this.getPixelForDecimal((e.start+i)*e.factor)}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return this.min+i*(this.max-this.min)}_getLabelSize(t){const e=this.options.ticks,i=this.ctx.measureText(t).width,s=$(this.isHorizontal()?e.maxRotation:e.minRotation),n=Math.cos(s),o=Math.sin(s),a=this._resolveTickFontOptions(0).size;return{w:i*n+a*o,h:i*o+a*n}}_getLabelCapacity(t){const e=this.options.time,i=e.displayFormats,s=i[e.unit]||i.millisecond,n=this._tickFormatFunction(t,0,Eo(this,[t],this._majorUnit),s),o=this._getLabelSize(n),a=Math.floor(this.isHorizontal()?this.width/o.w:this.height/o.h)-1;return a>0?a:1}getDataTimestamps(){let t,e,i=this._cache.data||[];if(i.length)return i;const s=this.getMatchingVisibleMetas();if(this._normalized&&s.length)return this._cache.data=s[0].controller.getAllParsedValues(this);for(t=0,e=s.length;t<e;++t)i=i.concat(s[t].controller.getAllParsedValues(this));return this._cache.data=this.normalize(i)}getLabelTimestamps(){const t=this._cache.labels||[];let e,i;if(t.length)return t;const s=this.getLabels();for(e=0,i=s.length;e<i;++e)t.push(Ao(this,s[e]));return this._cache.labels=this._normalized?t:this.normalize(t)}normalize(t){return lt(t.sort(Oo))}}function Io(t,e,i){let s,n,o,a,r=0,l=t.length-1;i?(e>=t[r].pos&&e<=t[l].pos&&({lo:r,hi:l}=it(t,\"pos\",e)),({pos:s,time:o}=t[r]),({pos:n,time:a}=t[l])):(e>=t[r].time&&e<=t[l].time&&({lo:r,hi:l}=it(t,\"time\",e)),({time:s,pos:o}=t[r]),({time:n,pos:a}=t[l]));const h=n-s;return h?o+(a-o)*(e-s)/h:o}var zo=Object.freeze({__proto__:null,CategoryScale:class extends Ks{static id=\"category\";static defaults={ticks:{callback:ro}};constructor(t){super(t),this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(t){const e=this._addedLabels;if(e.length){const t=this.getLabels();for(const{index:i,label:s}of e)t[i]===s&&t.splice(i,1);this._addedLabels=[]}super.init(t)}parse(t,e){if(s(t))return null;const i=this.getLabels();return((t,e)=>null===t?null:J(Math.round(t),0,e))(e=isFinite(e)&&i[e]===t?e:ao(i,t,l(e,t),this._addedLabels),i.length-1)}determineDataLimits(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let{min:i,max:s}=this.getMinMax(!0);\"ticks\"===this.options.bounds&&(t||(i=0),e||(s=this.getLabels().length-1)),this.min=i,this.max=s}buildTicks(){const t=this.min,e=this.max,i=this.options.offset,s=[];let n=this.getLabels();n=0===t&&e===n.length-1?n:n.slice(t,e+1),this._valueRange=Math.max(n.length-(i?0:1),1),this._startValue=this.min-(i?.5:0);for(let i=t;i<=e;i++)s.push({value:i});return s}getLabelForValue(t){return ro.call(this,t)}configure(){super.configure(),this.isHorizontal()||(this._reversePixels=!this._reversePixels)}getPixelForValue(t){return\"number\"!=typeof t&&(t=this.parse(t)),null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}},LinearScale:co,LogarithmicScale:bo,RadialLinearScale:Po,TimeScale:Ro,TimeSeriesScale:class extends Ro{static id=\"timeseries\";static defaults=Ro.defaults;constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=Io(e,this.min),this._tableRange=Io(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:i}=this,s=[],n=[];let o,a,r,l,h;for(o=0,a=t.length;o<a;++o)l=t[o],l>=e&&l<=i&&s.push(l);if(s.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(o=0,a=s.length;o<a;++o)h=s[o+1],r=s[o-1],l=s[o],Math.round((h+r)/2)!==l&&n.push({time:l,pos:o/(a-1)});return n}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const e=this.getDataTimestamps(),i=this.getLabelTimestamps();return t=e.length&&i.length?this.normalize(e.concat(i)):e.length?e:i,t=this._cache.all=t,t}getDecimalForValue(t){return(Io(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return Io(this._table,i*this._tableRange+this._minPos,!0)}}});const Fo=[\"rgb(54, 162, 235)\",\"rgb(255, 99, 132)\",\"rgb(255, 159, 64)\",\"rgb(255, 205, 86)\",\"rgb(75, 192, 192)\",\"rgb(153, 102, 255)\",\"rgb(201, 203, 207)\"],Vo=Fo.map((t=>t.replace(\"rgb(\",\"rgba(\").replace(\")\",\", 0.5)\")));function Bo(t){return Fo[t%Fo.length]}function No(t){return Vo[t%Vo.length]}function Wo(t){let e=0;return(i,s)=>{const n=t.getDatasetMeta(s).controller;n instanceof zn?e=function(t,e){return t.backgroundColor=t.data.map((()=>Bo(e++))),e}(i,e):n instanceof Fn?e=function(t,e){return t.backgroundColor=t.data.map((()=>No(e++))),e}(i,e):n&&(e=function(t,e){return t.borderColor=Bo(e),t.backgroundColor=No(e),++e}(i,e))}}function Ho(t){let e;for(e in t)if(t[e].borderColor||t[e].backgroundColor)return!0;return!1}var jo={id:\"colors\",defaults:{enabled:!0,forceOverride:!1},beforeLayout(t,e,i){if(!i.enabled)return;const{data:{datasets:s},options:n}=t.config,{elements:o}=n;if(!i.forceOverride&&(Ho(s)||(a=n)&&(a.borderColor||a.backgroundColor)||o&&Ho(o)))return;var a;const r=Wo(t);s.forEach(r)}};function $o(t){if(t._decimated){const e=t._data;delete t._decimated,delete t._data,Object.defineProperty(t,\"data\",{configurable:!0,enumerable:!0,writable:!0,value:e})}}function Yo(t){t.data.datasets.forEach((t=>{$o(t)}))}var Uo={id:\"decimation\",defaults:{algorithm:\"min-max\",enabled:!1},beforeElementsUpdate:(t,e,i)=>{if(!i.enabled)return void Yo(t);const n=t.width;t.data.datasets.forEach(((e,o)=>{const{_data:a,indexAxis:r}=e,l=t.getDatasetMeta(o),h=a||e.data;if(\"y\"===ki([r,t.options.indexAxis]))return;if(!l.controller.supportsDecimation)return;const c=t.scales[l.xAxisID];if(\"linear\"!==c.type&&\"time\"!==c.type)return;if(t.options.parsing)return;let{start:d,count:u}=function(t,e){const i=e.length;let s,n=0;const{iScale:o}=t,{min:a,max:r,minDefined:l,maxDefined:h}=o.getUserBounds();return l&&(n=J(it(e,o.axis,a).lo,0,i-1)),s=h?J(it(e,o.axis,r).hi+1,n,i)-n:i-n,{start:n,count:s}}(l,h);if(u<=(i.threshold||4*n))return void $o(e);let f;switch(s(a)&&(e._data=h,delete e.data,Object.defineProperty(e,\"data\",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(t){this._data=t}})),i.algorithm){case\"lttb\":f=function(t,e,i,s,n){const o=n.samples||s;if(o>=i)return t.slice(e,e+i);const a=[],r=(i-2)/(o-2);let l=0;const h=e+i-1;let c,d,u,f,g,p=e;for(a[l++]=t[p],c=0;c<o-2;c++){let s,n=0,o=0;const h=Math.floor((c+1)*r)+1+e,m=Math.min(Math.floor((c+2)*r)+1,i)+e,b=m-h;for(s=h;s<m;s++)n+=t[s].x,o+=t[s].y;n/=b,o/=b;const x=Math.floor(c*r)+1+e,_=Math.min(Math.floor((c+1)*r)+1,i)+e,{x:y,y:v}=t[p];for(u=f=-1,s=x;s<_;s++)f=.5*Math.abs((y-n)*(t[s].y-v)-(y-t[s].x)*(o-v)),f>u&&(u=f,d=t[s],g=s);a[l++]=d,p=g}return a[l++]=t[h],a}(h,d,u,n,i);break;case\"min-max\":f=function(t,e,i,n){let o,a,r,l,h,c,d,u,f,g,p=0,m=0;const b=[],x=e+i-1,_=t[e].x,y=t[x].x-_;for(o=e;o<e+i;++o){a=t[o],r=(a.x-_)/y*n,l=a.y;const e=0|r;if(e===h)l<f?(f=l,c=o):l>g&&(g=l,d=o),p=(m*p+a.x)/++m;else{const i=o-1;if(!s(c)&&!s(d)){const e=Math.min(c,d),s=Math.max(c,d);e!==u&&e!==i&&b.push({...t[e],x:p}),s!==u&&s!==i&&b.push({...t[s],x:p})}o>0&&i!==u&&b.push(t[i]),b.push(a),h=e,m=0,f=g=l,c=d=u=o}}return b}(h,d,u,n);break;default:throw new Error(`Unsupported decimation algorithm '${i.algorithm}'`)}e._decimated=f}))},destroy(t){Yo(t)}};function Xo(t,e,i,s){if(s)return;let n=e[t],o=i[t];return\"angle\"===t&&(n=G(n),o=G(o)),{property:t,start:n,end:o}}function qo(t,e,i){for(;e>t;e--){const t=i[e];if(!isNaN(t.x)&&!isNaN(t.y))break}return e}function Ko(t,e,i,s){return t&&e?s(t[i],e[i]):t?t[i]:e?e[i]:0}function Go(t,e){let i=[],s=!1;return n(t)?(s=!0,i=t):i=function(t,e){const{x:i=null,y:s=null}=t||{},n=e.points,o=[];return e.segments.forEach((({start:t,end:e})=>{e=qo(t,e,n);const a=n[t],r=n[e];null!==s?(o.push({x:a.x,y:s}),o.push({x:r.x,y:s})):null!==i&&(o.push({x:i,y:a.y}),o.push({x:i,y:r.y}))})),o}(t,e),i.length?new Zn({points:i,options:{tension:0},_loop:s,_fullLoop:s}):null}function Zo(t){return t&&!1!==t.fill}function Jo(t,e,i){let s=t[e].fill;const n=[e];let o;if(!i)return s;for(;!1!==s&&-1===n.indexOf(s);){if(!a(s))return s;if(o=t[s],!o)return!1;if(o.visible)return s;n.push(s),s=o.fill}return!1}function Qo(t,e,i){const s=function(t){const e=t.options,i=e.fill;let s=l(i&&i.target,i);void 0===s&&(s=!!e.backgroundColor);if(!1===s||null===s)return!1;if(!0===s)return\"origin\";return s}(t);if(o(s))return!isNaN(s.value)&&s;let n=parseFloat(s);return a(n)&&Math.floor(n)===n?function(t,e,i,s){\"-\"!==t&&\"+\"!==t||(i=e+i);if(i===e||i<0||i>=s)return!1;return i}(s[0],e,n,i):[\"origin\",\"start\",\"end\",\"stack\",\"shape\"].indexOf(s)>=0&&s}function ta(t,e,i){const s=[];for(let n=0;n<i.length;n++){const o=i[n],{first:a,last:r,point:l}=ea(o,e,\"x\");if(!(!l||a&&r))if(a)s.unshift(l);else if(t.push(l),!r)break}t.push(...s)}function ea(t,e,i){const s=t.interpolate(e,i);if(!s)return{};const n=s[i],o=t.segments,a=t.points;let r=!1,l=!1;for(let t=0;t<o.length;t++){const e=o[t],s=a[e.start][i],h=a[e.end][i];if(tt(n,s,h)){r=n===s,l=n===h;break}}return{first:r,last:l,point:s}}class ia{constructor(t){this.x=t.x,this.y=t.y,this.radius=t.radius}pathSegment(t,e,i){const{x:s,y:n,radius:o}=this;return e=e||{start:0,end:O},t.arc(s,n,o,e.end,e.start,!0),!i.bounds}interpolate(t){const{x:e,y:i,radius:s}=this,n=t.angle;return{x:e+Math.cos(n)*s,y:i+Math.sin(n)*s,angle:n}}}function sa(t){const{chart:e,fill:i,line:s}=t;if(a(i))return function(t,e){const i=t.getDatasetMeta(e);return i&&t.isDatasetVisible(e)?i.dataset:null}(e,i);if(\"stack\"===i)return function(t){const{scale:e,index:i,line:s}=t,n=[],o=s.segments,a=s.points,r=function(t,e){const i=[],s=t.getMatchingVisibleMetas(\"line\");for(let t=0;t<s.length;t++){const n=s[t];if(n.index===e)break;n.hidden||i.unshift(n.dataset)}return i}(e,i);r.push(Go({x:null,y:e.bottom},s));for(let t=0;t<o.length;t++){const e=o[t];for(let t=e.start;t<=e.end;t++)ta(n,a[t],r)}return new Zn({points:n,options:{}})}(t);if(\"shape\"===i)return!0;const n=function(t){if((t.scale||{}).getPointPositionForValue)return function(t){const{scale:e,fill:i}=t,s=e.options,n=e.getLabels().length,a=s.reverse?e.max:e.min,r=function(t,e,i){let s;return s=\"start\"===t?i:\"end\"===t?e.options.reverse?e.min:e.max:o(t)?t.value:e.getBaseValue(),s}(i,e,a),l=[];if(s.grid.circular){const t=e.getPointPositionForValue(0,a);return new ia({x:t.x,y:t.y,radius:e.getDistanceFromCenterForValue(r)})}for(let t=0;t<n;++t)l.push(e.getPointPositionForValue(t,r));return l}(t);return function(t){const{scale:e={},fill:i}=t,s=function(t,e){let i=null;return\"start\"===t?i=e.bottom:\"end\"===t?i=e.top:o(t)?i=e.getPixelForValue(t.value):e.getBasePixel&&(i=e.getBasePixel()),i}(i,e);if(a(s)){const t=e.isHorizontal();return{x:t?s:null,y:t?null:s}}return null}(t)}(t);return n instanceof ia?n:Go(n,s)}function na(t,e,i){const s=sa(e),{line:n,scale:o,axis:a}=e,r=n.options,l=r.fill,h=r.backgroundColor,{above:c=h,below:d=h}=l||{};s&&n.points.length&&(Re(t,i),function(t,e){const{line:i,target:s,above:n,below:o,area:a,scale:r}=e,l=i._loop?\"angle\":e.axis;t.save(),\"x\"===l&&o!==n&&(oa(t,s,a.top),aa(t,{line:i,target:s,color:n,scale:r,property:l}),t.restore(),t.save(),oa(t,s,a.bottom));aa(t,{line:i,target:s,color:o,scale:r,property:l}),t.restore()}(t,{line:n,target:s,above:c,below:d,area:i,scale:o,axis:a}),Ie(t))}function oa(t,e,i){const{segments:s,points:n}=e;let o=!0,a=!1;t.beginPath();for(const r of s){const{start:s,end:l}=r,h=n[s],c=n[qo(s,l,n)];o?(t.moveTo(h.x,h.y),o=!1):(t.lineTo(h.x,i),t.lineTo(h.x,h.y)),a=!!e.pathSegment(t,r,{move:a}),a?t.closePath():t.lineTo(c.x,i)}t.lineTo(e.first().x,i),t.closePath(),t.clip()}function aa(t,e){const{line:i,target:s,property:n,color:o,scale:a}=e,r=function(t,e,i){const s=t.segments,n=t.points,o=e.points,a=[];for(const t of s){let{start:s,end:r}=t;r=qo(s,r,n);const l=Xo(i,n[s],n[r],t.loop);if(!e.segments){a.push({source:t,target:l,start:n[s],end:n[r]});continue}const h=Ei(e,l);for(const e of h){const s=Xo(i,o[e.start],o[e.end],e.loop),r=Li(t,n,s);for(const t of r)a.push({source:t,target:e,start:{[i]:Ko(l,s,\"start\",Math.max)},end:{[i]:Ko(l,s,\"end\",Math.min)}})}}return a}(i,s,n);for(const{source:e,target:l,start:h,end:c}of r){const{style:{backgroundColor:r=o}={}}=e,d=!0!==s;t.save(),t.fillStyle=r,ra(t,a,d&&Xo(n,h,c)),t.beginPath();const u=!!i.pathSegment(t,e);let f;if(d){u?t.closePath():la(t,s,c,n);const e=!!s.pathSegment(t,l,{move:u,reverse:!0});f=u&&e,f||la(t,s,h,n)}t.closePath(),t.fill(f?\"evenodd\":\"nonzero\"),t.restore()}}function ra(t,e,i){const{top:s,bottom:n}=e.chart.chartArea,{property:o,start:a,end:r}=i||{};\"x\"===o&&(t.beginPath(),t.rect(a,s,r-a,n-s),t.clip())}function la(t,e,i,s){const n=e.interpolate(i,s);n&&t.lineTo(n.x,n.y)}var ha={id:\"filler\",afterDatasetsUpdate(t,e,i){const s=(t.data.datasets||[]).length,n=[];let o,a,r,l;for(a=0;a<s;++a)o=t.getDatasetMeta(a),r=o.dataset,l=null,r&&r.options&&r instanceof Zn&&(l={visible:t.isDatasetVisible(a),index:a,fill:Qo(r,a,s),chart:t,axis:o.controller.options.indexAxis,scale:o.vScale,line:r}),o.$filler=l,n.push(l);for(a=0;a<s;++a)l=n[a],l&&!1!==l.fill&&(l.fill=Jo(n,a,i.propagate))},beforeDraw(t,e,i){const s=\"beforeDraw\"===i.drawTime,n=t.getSortedVisibleDatasetMetas(),o=t.chartArea;for(let e=n.length-1;e>=0;--e){const i=n[e].$filler;i&&(i.line.updateControlPoints(o,i.axis),s&&i.fill&&na(t.ctx,i,o))}},beforeDatasetsDraw(t,e,i){if(\"beforeDatasetsDraw\"!==i.drawTime)return;const s=t.getSortedVisibleDatasetMetas();for(let e=s.length-1;e>=0;--e){const i=s[e].$filler;Zo(i)&&na(t.ctx,i,t.chartArea)}},beforeDatasetDraw(t,e,i){const s=e.meta.$filler;Zo(s)&&\"beforeDatasetDraw\"===i.drawTime&&na(t.ctx,s,t.chartArea)},defaults:{propagate:!0,drawTime:\"beforeDatasetDraw\"}};const ca=(t,e)=>{let{boxHeight:i=e,boxWidth:s=e}=t;return t.usePointStyle&&(i=Math.min(i,e),s=t.pointStyleWidth||Math.min(s,e)),{boxWidth:s,boxHeight:i,itemHeight:Math.max(e,i)}};class da extends Bs{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=d(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter((e=>t.filter(e,this.chart.data)))),t.sort&&(e=e.sort(((e,i)=>t.sort(e,i,this.chart.data)))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display)return void(this.width=this.height=0);const i=t.labels,s=wi(i.font),n=s.size,o=this._computeTitleHeight(),{boxWidth:a,itemHeight:r}=ca(i,n);let l,h;e.font=s.string,this.isHorizontal()?(l=this.maxWidth,h=this._fitRows(o,n,a,r)+10):(h=this.maxHeight,l=this._fitCols(o,s,a,r)+10),this.width=Math.min(l,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,i,s){const{ctx:n,maxWidth:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.lineWidths=[0],h=s+a;let c=t;n.textAlign=\"left\",n.textBaseline=\"middle\";let d=-1,u=-h;return this.legendItems.forEach(((t,f)=>{const g=i+e/2+n.measureText(t.text).width;(0===f||l[l.length-1]+g+2*a>o)&&(c+=h,l[l.length-(f>0?0:1)]=0,u+=h,d++),r[f]={left:0,top:u,row:d,width:g,height:s},l[l.length-1]+=g+a})),c}_fitCols(t,e,i,s){const{ctx:n,maxHeight:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.columnSizes=[],h=o-t;let c=a,d=0,u=0,f=0,g=0;return this.legendItems.forEach(((t,o)=>{const{itemWidth:p,itemHeight:m}=function(t,e,i,s,n){const o=function(t,e,i,s){let n=t.text;n&&\"string\"!=typeof n&&(n=n.reduce(((t,e)=>t.length>e.length?t:e)));return e+i.size/2+s.measureText(n).width}(s,t,e,i),a=function(t,e,i){let s=t;\"string\"!=typeof e.text&&(s=ua(e,i));return s}(n,s,e.lineHeight);return{itemWidth:o,itemHeight:a}}(i,e,n,t,s);o>0&&u+m+2*a>h&&(c+=d+a,l.push({width:d,height:u}),f+=d+a,g++,d=u=0),r[o]={left:f,top:u,col:g,width:p,height:m},d=Math.max(d,p),u+=m+a})),c+=d,l.push({width:d,height:u}),c}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:i,labels:{padding:s},rtl:n}}=this,o=Di(n,this.left,this.width);if(this.isHorizontal()){let n=0,a=ft(i,this.left+s,this.right-this.lineWidths[n]);for(const r of e)n!==r.row&&(n=r.row,a=ft(i,this.left+s,this.right-this.lineWidths[n])),r.top+=this.top+t+s,r.left=o.leftForLtr(o.x(a),r.width),a+=r.width+s}else{let n=0,a=ft(i,this.top+t+s,this.bottom-this.columnSizes[n].height);for(const r of e)r.col!==n&&(n=r.col,a=ft(i,this.top+t+s,this.bottom-this.columnSizes[n].height)),r.top=a,r.left+=this.left+s,r.left=o.leftForLtr(o.x(r.left),r.width),a+=r.height+s}}isHorizontal(){return\"top\"===this.options.position||\"bottom\"===this.options.position}draw(){if(this.options.display){const t=this.ctx;Re(t,this),this._draw(),Ie(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:i,ctx:s}=this,{align:n,labels:o}=t,a=ue.color,r=Di(t.rtl,this.left,this.width),h=wi(o.font),{padding:c}=o,d=h.size,u=d/2;let f;this.drawTitle(),s.textAlign=r.textAlign(\"left\"),s.textBaseline=\"middle\",s.lineWidth=.5,s.font=h.string;const{boxWidth:g,boxHeight:p,itemHeight:m}=ca(o,d),b=this.isHorizontal(),x=this._computeTitleHeight();f=b?{x:ft(n,this.left+c,this.right-i[0]),y:this.top+c+x,line:0}:{x:this.left+c,y:ft(n,this.top+x+c,this.bottom-e[0].height),line:0},Ci(this.ctx,t.textDirection);const _=m+c;this.legendItems.forEach(((y,v)=>{s.strokeStyle=y.fontColor,s.fillStyle=y.fontColor;const M=s.measureText(y.text).width,w=r.textAlign(y.textAlign||(y.textAlign=o.textAlign)),k=g+u+M;let S=f.x,P=f.y;r.setWidth(this.width),b?v>0&&S+k+c>this.right&&(P=f.y+=_,f.line++,S=f.x=ft(n,this.left+c,this.right-i[f.line])):v>0&&P+_>this.bottom&&(S=f.x=S+e[f.line].width+c,f.line++,P=f.y=ft(n,this.top+x+c,this.bottom-e[f.line].height));if(function(t,e,i){if(isNaN(g)||g<=0||isNaN(p)||p<0)return;s.save();const n=l(i.lineWidth,1);if(s.fillStyle=l(i.fillStyle,a),s.lineCap=l(i.lineCap,\"butt\"),s.lineDashOffset=l(i.lineDashOffset,0),s.lineJoin=l(i.lineJoin,\"miter\"),s.lineWidth=n,s.strokeStyle=l(i.strokeStyle,a),s.setLineDash(l(i.lineDash,[])),o.usePointStyle){const a={radius:p*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},l=r.xPlus(t,g/2);Le(s,a,l,e+u,o.pointStyleWidth&&g)}else{const o=e+Math.max((d-p)/2,0),a=r.leftForLtr(t,g),l=vi(i.borderRadius);s.beginPath(),Object.values(l).some((t=>0!==t))?We(s,{x:a,y:o,w:g,h:p,radius:l}):s.rect(a,o,g,p),s.fill(),0!==n&&s.stroke()}s.restore()}(r.x(S),P,y),S=gt(w,S+g+u,b?S+k:this.right,t.rtl),function(t,e,i){Ve(s,i.text,t,e+m/2,h,{strikethrough:i.hidden,textAlign:r.textAlign(i.textAlign)})}(r.x(S),P,y),b)f.x+=k+c;else if(\"string\"!=typeof y.text){const t=h.lineHeight;f.y+=ua(y,t)}else f.y+=_})),Oi(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,i=wi(e.font),s=Mi(e.padding);if(!e.display)return;const n=Di(t.rtl,this.left,this.width),o=this.ctx,a=e.position,r=i.size/2,l=s.top+r;let h,c=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),h=this.top+l,c=ft(t.align,c,this.right-d);else{const e=this.columnSizes.reduce(((t,e)=>Math.max(t,e.height)),0);h=l+ft(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const u=ft(a,c,c+d);o.textAlign=n.textAlign(ut(a)),o.textBaseline=\"middle\",o.strokeStyle=e.color,o.fillStyle=e.color,o.font=i.string,Ve(o,e.text,u,h,i)}_computeTitleHeight(){const t=this.options.title,e=wi(t.font),i=Mi(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,s,n;if(tt(t,this.left,this.right)&&tt(e,this.top,this.bottom))for(n=this.legendHitBoxes,i=0;i<n.length;++i)if(s=n[i],tt(t,s.left,s.left+s.width)&&tt(e,s.top,s.top+s.height))return this.legendItems[i];return null}handleEvent(t){const e=this.options;if(!function(t,e){if((\"mousemove\"===t||\"mouseout\"===t)&&(e.onHover||e.onLeave))return!0;if(e.onClick&&(\"click\"===t||\"mouseup\"===t))return!0;return!1}(t.type,e))return;const i=this._getLegendItemAt(t.x,t.y);if(\"mousemove\"===t.type||\"mouseout\"===t.type){const o=this._hoveredItem,a=(n=i,null!==(s=o)&&null!==n&&s.datasetIndex===n.datasetIndex&&s.index===n.index);o&&!a&&d(e.onLeave,[t,o,this],this),this._hoveredItem=i,i&&!a&&d(e.onHover,[t,i,this],this)}else i&&d(e.onClick,[t,i,this],this);var s,n}}function ua(t,e){return e*(t.text?t.text.length+.5:0)}var fa={id:\"legend\",_element:da,start(t,e,i){const s=t.legend=new da({ctx:t.ctx,options:i,chart:t});ns.configure(t,s,i),ns.addBox(t,s)},stop(t){ns.removeBox(t,t.legend),delete t.legend},beforeUpdate(t,e,i){const s=t.legend;ns.configure(t,s,i),s.options=i},afterUpdate(t){const e=t.legend;e.buildLabels(),e.adjustHitBoxes()},afterEvent(t,e){e.replay||t.legend.handleEvent(e.event)},defaults:{display:!0,position:\"top\",align:\"center\",fullSize:!0,reverse:!1,weight:1e3,onClick(t,e,i){const s=e.datasetIndex,n=i.chart;n.isDatasetVisible(s)?(n.hide(s),e.hidden=!0):(n.show(s),e.hidden=!1)},onHover:null,onLeave:null,labels:{color:t=>t.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:i,pointStyle:s,textAlign:n,color:o,useBorderRadius:a,borderRadius:r}}=t.legend.options;return t._getSortedDatasetMetas().map((t=>{const l=t.controller.getStyle(i?0:void 0),h=Mi(l.borderWidth);return{text:e[t.index].label,fillStyle:l.backgroundColor,fontColor:o,hidden:!t.visible,lineCap:l.borderCapStyle,lineDash:l.borderDash,lineDashOffset:l.borderDashOffset,lineJoin:l.borderJoinStyle,lineWidth:(h.width+h.height)/4,strokeStyle:l.borderColor,pointStyle:s||l.pointStyle,rotation:l.rotation,textAlign:n||l.textAlign,borderRadius:a&&(r||l.borderRadius),datasetIndex:t.index}}),this)}},title:{color:t=>t.chart.options.color,display:!1,position:\"center\",text:\"\"}},descriptors:{_scriptable:t=>!t.startsWith(\"on\"),labels:{_scriptable:t=>![\"generateLabels\",\"filter\",\"sort\"].includes(t)}}};class ga extends Bs{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){const i=this.options;if(this.left=0,this.top=0,!i.display)return void(this.width=this.height=this.right=this.bottom=0);this.width=this.right=t,this.height=this.bottom=e;const s=n(i.text)?i.text.length:1;this._padding=Mi(i.padding);const o=s*wi(i.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=o:this.width=o}isHorizontal(){const t=this.options.position;return\"top\"===t||\"bottom\"===t}_drawArgs(t){const{top:e,left:i,bottom:s,right:n,options:o}=this,a=o.align;let r,l,h,c=0;return this.isHorizontal()?(l=ft(a,i,n),h=e+t,r=n-i):(\"left\"===o.position?(l=i+t,h=ft(a,s,e),c=-.5*C):(l=n-t,h=ft(a,e,s),c=.5*C),r=s-e),{titleX:l,titleY:h,maxWidth:r,rotation:c}}draw(){const t=this.ctx,e=this.options;if(!e.display)return;const i=wi(e.font),s=i.lineHeight/2+this._padding.top,{titleX:n,titleY:o,maxWidth:a,rotation:r}=this._drawArgs(s);Ve(t,e.text,0,0,i,{color:e.color,maxWidth:a,rotation:r,textAlign:ut(e.align),textBaseline:\"middle\",translation:[n,o]})}}var pa={id:\"title\",_element:ga,start(t,e,i){!function(t,e){const i=new ga({ctx:t.ctx,options:e,chart:t});ns.configure(t,i,e),ns.addBox(t,i),t.titleBlock=i}(t,i)},stop(t){const e=t.titleBlock;ns.removeBox(t,e),delete t.titleBlock},beforeUpdate(t,e,i){const s=t.titleBlock;ns.configure(t,s,i),s.options=i},defaults:{align:\"center\",display:!1,font:{weight:\"bold\"},fullSize:!0,padding:10,position:\"top\",text:\"\",weight:2e3},defaultRoutes:{color:\"color\"},descriptors:{_scriptable:!0,_indexable:!1}};const ma=new WeakMap;var ba={id:\"subtitle\",start(t,e,i){const s=new ga({ctx:t.ctx,options:i,chart:t});ns.configure(t,s,i),ns.addBox(t,s),ma.set(t,s)},stop(t){ns.removeBox(t,ma.get(t)),ma.delete(t)},beforeUpdate(t,e,i){const s=ma.get(t);ns.configure(t,s,i),s.options=i},defaults:{align:\"center\",display:!1,font:{weight:\"normal\"},fullSize:!0,padding:0,position:\"top\",text:\"\",weight:1500},defaultRoutes:{color:\"color\"},descriptors:{_scriptable:!0,_indexable:!1}};const xa={average(t){if(!t.length)return!1;let e,i,s=0,n=0,o=0;for(e=0,i=t.length;e<i;++e){const i=t[e].element;if(i&&i.hasValue()){const t=i.tooltipPosition();s+=t.x,n+=t.y,++o}}return{x:s/o,y:n/o}},nearest(t,e){if(!t.length)return!1;let i,s,n,o=e.x,a=e.y,r=Number.POSITIVE_INFINITY;for(i=0,s=t.length;i<s;++i){const s=t[i].element;if(s&&s.hasValue()){const t=q(e,s.getCenterPoint());t<r&&(r=t,n=s)}}if(n){const t=n.tooltipPosition();o=t.x,a=t.y}return{x:o,y:a}}};function _a(t,e){return e&&(n(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function ya(t){return(\"string\"==typeof t||t instanceof String)&&t.indexOf(\"\\n\")>-1?t.split(\"\\n\"):t}function va(t,e){const{element:i,datasetIndex:s,index:n}=e,o=t.getDatasetMeta(s).controller,{label:a,value:r}=o.getLabelAndValue(n);return{chart:t,label:a,parsed:o.getParsed(n),raw:t.data.datasets[s].data[n],formattedValue:r,dataset:o.getDataset(),dataIndex:n,datasetIndex:s,element:i}}function Ma(t,e){const i=t.chart.ctx,{body:s,footer:n,title:o}=t,{boxWidth:a,boxHeight:r}=e,l=wi(e.bodyFont),h=wi(e.titleFont),c=wi(e.footerFont),d=o.length,f=n.length,g=s.length,p=Mi(e.padding);let m=p.height,b=0,x=s.reduce(((t,e)=>t+e.before.length+e.lines.length+e.after.length),0);if(x+=t.beforeBody.length+t.afterBody.length,d&&(m+=d*h.lineHeight+(d-1)*e.titleSpacing+e.titleMarginBottom),x){m+=g*(e.displayColors?Math.max(r,l.lineHeight):l.lineHeight)+(x-g)*l.lineHeight+(x-1)*e.bodySpacing}f&&(m+=e.footerMarginTop+f*c.lineHeight+(f-1)*e.footerSpacing);let _=0;const y=function(t){b=Math.max(b,i.measureText(t).width+_)};return i.save(),i.font=h.string,u(t.title,y),i.font=l.string,u(t.beforeBody.concat(t.afterBody),y),_=e.displayColors?a+2+e.boxPadding:0,u(s,(t=>{u(t.before,y),u(t.lines,y),u(t.after,y)})),_=0,i.font=c.string,u(t.footer,y),i.restore(),b+=p.width,{width:b,height:m}}function wa(t,e,i,s){const{x:n,width:o}=i,{width:a,chartArea:{left:r,right:l}}=t;let h=\"center\";return\"center\"===s?h=n<=(r+l)/2?\"left\":\"right\":n<=o/2?h=\"left\":n>=a-o/2&&(h=\"right\"),function(t,e,i,s){const{x:n,width:o}=s,a=i.caretSize+i.caretPadding;return\"left\"===t&&n+o+a>e.width||\"right\"===t&&n-o-a<0||void 0}(h,t,e,i)&&(h=\"center\"),h}function ka(t,e,i){const s=i.yAlign||e.yAlign||function(t,e){const{y:i,height:s}=e;return i<s/2?\"top\":i>t.height-s/2?\"bottom\":\"center\"}(t,i);return{xAlign:i.xAlign||e.xAlign||wa(t,e,i,s),yAlign:s}}function Sa(t,e,i,s){const{caretSize:n,caretPadding:o,cornerRadius:a}=t,{xAlign:r,yAlign:l}=i,h=n+o,{topLeft:c,topRight:d,bottomLeft:u,bottomRight:f}=vi(a);let g=function(t,e){let{x:i,width:s}=t;return\"right\"===e?i-=s:\"center\"===e&&(i-=s/2),i}(e,r);const p=function(t,e,i){let{y:s,height:n}=t;return\"top\"===e?s+=i:s-=\"bottom\"===e?n+i:n/2,s}(e,l,h);return\"center\"===l?\"left\"===r?g+=h:\"right\"===r&&(g-=h):\"left\"===r?g-=Math.max(c,u)+n:\"right\"===r&&(g+=Math.max(d,f)+n),{x:J(g,0,s.width-e.width),y:J(p,0,s.height-e.height)}}function Pa(t,e,i){const s=Mi(i.padding);return\"center\"===e?t.x+t.width/2:\"right\"===e?t.x+t.width-s.right:t.x+s.left}function Da(t){return _a([],ya(t))}function Ca(t,e){const i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}const Oa={beforeTitle:e,title(t){if(t.length>0){const e=t[0],i=e.chart.data.labels,s=i?i.length:0;if(this&&this.options&&\"dataset\"===this.options.mode)return e.dataset.label||\"\";if(e.label)return e.label;if(s>0&&e.dataIndex<s)return i[e.dataIndex]}return\"\"},afterTitle:e,beforeBody:e,beforeLabel:e,label(t){if(this&&this.options&&\"dataset\"===this.options.mode)return t.label+\": \"+t.formattedValue||t.formattedValue;let e=t.dataset.label||\"\";e&&(e+=\": \");const i=t.formattedValue;return s(i)||(e+=i),e},labelColor(t){const e=t.chart.getDatasetMeta(t.datasetIndex).controller.getStyle(t.dataIndex);return{borderColor:e.borderColor,backgroundColor:e.backgroundColor,borderWidth:e.borderWidth,borderDash:e.borderDash,borderDashOffset:e.borderDashOffset,borderRadius:0}},labelTextColor(){return this.options.bodyColor},labelPointStyle(t){const e=t.chart.getDatasetMeta(t.datasetIndex).controller.getStyle(t.dataIndex);return{pointStyle:e.pointStyle,rotation:e.rotation}},afterLabel:e,afterBody:e,beforeFooter:e,footer:e,afterFooter:e};function Aa(t,e,i,s){const n=t[e].call(i,s);return void 0===n?Oa[e].call(i,s):n}class Ta extends Bs{static positioners=xa;constructor(t){super(),this.opacity=0,this._active=[],this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.chart=t.chart,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){const t=this._cachedAnimations;if(t)return t;const e=this.chart,i=this.options.setContext(this.getContext()),s=i.enabled&&e.options.animation&&i.animations,n=new Ps(this.chart,s);return s._cacheable&&(this._cachedAnimations=Object.freeze(n)),n}getContext(){return this.$context||(this.$context=(t=this.chart.getContext(),e=this,i=this._tooltipItems,Pi(t,{tooltip:e,tooltipItems:i,type:\"tooltip\"})));var t,e,i}getTitle(t,e){const{callbacks:i}=e,s=Aa(i,\"beforeTitle\",this,t),n=Aa(i,\"title\",this,t),o=Aa(i,\"afterTitle\",this,t);let a=[];return a=_a(a,ya(s)),a=_a(a,ya(n)),a=_a(a,ya(o)),a}getBeforeBody(t,e){return Da(Aa(e.callbacks,\"beforeBody\",this,t))}getBody(t,e){const{callbacks:i}=e,s=[];return u(t,(t=>{const e={before:[],lines:[],after:[]},n=Ca(i,t);_a(e.before,ya(Aa(n,\"beforeLabel\",this,t))),_a(e.lines,Aa(n,\"label\",this,t)),_a(e.after,ya(Aa(n,\"afterLabel\",this,t))),s.push(e)})),s}getAfterBody(t,e){return Da(Aa(e.callbacks,\"afterBody\",this,t))}getFooter(t,e){const{callbacks:i}=e,s=Aa(i,\"beforeFooter\",this,t),n=Aa(i,\"footer\",this,t),o=Aa(i,\"afterFooter\",this,t);let a=[];return a=_a(a,ya(s)),a=_a(a,ya(n)),a=_a(a,ya(o)),a}_createItems(t){const e=this._active,i=this.chart.data,s=[],n=[],o=[];let a,r,l=[];for(a=0,r=e.length;a<r;++a)l.push(va(this.chart,e[a]));return t.filter&&(l=l.filter(((e,s,n)=>t.filter(e,s,n,i)))),t.itemSort&&(l=l.sort(((e,s)=>t.itemSort(e,s,i)))),u(l,(e=>{const i=Ca(t.callbacks,e);s.push(Aa(i,\"labelColor\",this,e)),n.push(Aa(i,\"labelPointStyle\",this,e)),o.push(Aa(i,\"labelTextColor\",this,e))})),this.labelColors=s,this.labelPointStyles=n,this.labelTextColors=o,this.dataPoints=l,l}update(t,e){const i=this.options.setContext(this.getContext()),s=this._active;let n,o=[];if(s.length){const t=xa[i.position].call(this,s,this._eventPosition);o=this._createItems(i),this.title=this.getTitle(o,i),this.beforeBody=this.getBeforeBody(o,i),this.body=this.getBody(o,i),this.afterBody=this.getAfterBody(o,i),this.footer=this.getFooter(o,i);const e=this._size=Ma(this,i),a=Object.assign({},t,e),r=ka(this.chart,i,a),l=Sa(i,a,r,this.chart);this.xAlign=r.xAlign,this.yAlign=r.yAlign,n={opacity:1,x:l.x,y:l.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==this.opacity&&(n={opacity:0});this._tooltipItems=o,this.$context=void 0,n&&this._resolveAnimations().update(this,n),t&&i.external&&i.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,i,s){const n=this.getCaretPosition(t,i,s);e.lineTo(n.x1,n.y1),e.lineTo(n.x2,n.y2),e.lineTo(n.x3,n.y3)}getCaretPosition(t,e,i){const{xAlign:s,yAlign:n}=this,{caretSize:o,cornerRadius:a}=i,{topLeft:r,topRight:l,bottomLeft:h,bottomRight:c}=vi(a),{x:d,y:u}=t,{width:f,height:g}=e;let p,m,b,x,_,y;return\"center\"===n?(_=u+g/2,\"left\"===s?(p=d,m=p-o,x=_+o,y=_-o):(p=d+f,m=p+o,x=_-o,y=_+o),b=p):(m=\"left\"===s?d+Math.max(r,h)+o:\"right\"===s?d+f-Math.max(l,c)-o:this.caretX,\"top\"===n?(x=u,_=x-o,p=m-o,b=m+o):(x=u+g,_=x+o,p=m+o,b=m-o),y=x),{x1:p,x2:m,x3:b,y1:x,y2:_,y3:y}}drawTitle(t,e,i){const s=this.title,n=s.length;let o,a,r;if(n){const l=Di(i.rtl,this.x,this.width);for(t.x=Pa(this,i.titleAlign,i),e.textAlign=l.textAlign(i.titleAlign),e.textBaseline=\"middle\",o=wi(i.titleFont),a=i.titleSpacing,e.fillStyle=i.titleColor,e.font=o.string,r=0;r<n;++r)e.fillText(s[r],l.x(t.x),t.y+o.lineHeight/2),t.y+=o.lineHeight+a,r+1===n&&(t.y+=i.titleMarginBottom-a)}}_drawColorBox(t,e,i,s,n){const a=this.labelColors[i],r=this.labelPointStyles[i],{boxHeight:l,boxWidth:h,boxPadding:c}=n,d=wi(n.bodyFont),u=Pa(this,\"left\",n),f=s.x(u),g=l<d.lineHeight?(d.lineHeight-l)/2:0,p=e.y+g;if(n.usePointStyle){const e={radius:Math.min(h,l)/2,pointStyle:r.pointStyle,rotation:r.rotation,borderWidth:1},i=s.leftForLtr(f,h)+h/2,o=p+l/2;t.strokeStyle=n.multiKeyBackground,t.fillStyle=n.multiKeyBackground,Te(t,e,i,o),t.strokeStyle=a.borderColor,t.fillStyle=a.backgroundColor,Te(t,e,i,o)}else{t.lineWidth=o(a.borderWidth)?Math.max(...Object.values(a.borderWidth)):a.borderWidth||1,t.strokeStyle=a.borderColor,t.setLineDash(a.borderDash||[]),t.lineDashOffset=a.borderDashOffset||0;const e=s.leftForLtr(f,h-c),i=s.leftForLtr(s.xPlus(f,1),h-c-2),r=vi(a.borderRadius);Object.values(r).some((t=>0!==t))?(t.beginPath(),t.fillStyle=n.multiKeyBackground,We(t,{x:e,y:p,w:h,h:l,radius:r}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),We(t,{x:i,y:p+1,w:h-2,h:l-2,radius:r}),t.fill()):(t.fillStyle=n.multiKeyBackground,t.fillRect(e,p,h,l),t.strokeRect(e,p,h,l),t.fillStyle=a.backgroundColor,t.fillRect(i,p+1,h-2,l-2))}t.fillStyle=this.labelTextColors[i]}drawBody(t,e,i){const{body:s}=this,{bodySpacing:n,bodyAlign:o,displayColors:a,boxHeight:r,boxWidth:l,boxPadding:h}=i,c=wi(i.bodyFont);let d=c.lineHeight,f=0;const g=Di(i.rtl,this.x,this.width),p=function(i){e.fillText(i,g.x(t.x+f),t.y+d/2),t.y+=d+n},m=g.textAlign(o);let b,x,_,y,v,M,w;for(e.textAlign=o,e.textBaseline=\"middle\",e.font=c.string,t.x=Pa(this,m,i),e.fillStyle=i.bodyColor,u(this.beforeBody,p),f=a&&\"right\"!==m?\"center\"===o?l/2+h:l+2+h:0,y=0,M=s.length;y<M;++y){for(b=s[y],x=this.labelTextColors[y],e.fillStyle=x,u(b.before,p),_=b.lines,a&&_.length&&(this._drawColorBox(e,t,y,g,i),d=Math.max(c.lineHeight,r)),v=0,w=_.length;v<w;++v)p(_[v]),d=c.lineHeight;u(b.after,p)}f=0,d=c.lineHeight,u(this.afterBody,p),t.y-=n}drawFooter(t,e,i){const s=this.footer,n=s.length;let o,a;if(n){const r=Di(i.rtl,this.x,this.width);for(t.x=Pa(this,i.footerAlign,i),t.y+=i.footerMarginTop,e.textAlign=r.textAlign(i.footerAlign),e.textBaseline=\"middle\",o=wi(i.footerFont),e.fillStyle=i.footerColor,e.font=o.string,a=0;a<n;++a)e.fillText(s[a],r.x(t.x),t.y+o.lineHeight/2),t.y+=o.lineHeight+i.footerSpacing}}drawBackground(t,e,i,s){const{xAlign:n,yAlign:o}=this,{x:a,y:r}=t,{width:l,height:h}=i,{topLeft:c,topRight:d,bottomLeft:u,bottomRight:f}=vi(s.cornerRadius);e.fillStyle=s.backgroundColor,e.strokeStyle=s.borderColor,e.lineWidth=s.borderWidth,e.beginPath(),e.moveTo(a+c,r),\"top\"===o&&this.drawCaret(t,e,i,s),e.lineTo(a+l-d,r),e.quadraticCurveTo(a+l,r,a+l,r+d),\"center\"===o&&\"right\"===n&&this.drawCaret(t,e,i,s),e.lineTo(a+l,r+h-f),e.quadraticCurveTo(a+l,r+h,a+l-f,r+h),\"bottom\"===o&&this.drawCaret(t,e,i,s),e.lineTo(a+u,r+h),e.quadraticCurveTo(a,r+h,a,r+h-u),\"center\"===o&&\"left\"===n&&this.drawCaret(t,e,i,s),e.lineTo(a,r+c),e.quadraticCurveTo(a,r,a+c,r),e.closePath(),e.fill(),s.borderWidth>0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,i=this.$animations,s=i&&i.x,n=i&&i.y;if(s||n){const i=xa[t.position].call(this,this._active,this._eventPosition);if(!i)return;const o=this._size=Ma(this,t),a=Object.assign({},i,this._size),r=ka(e,t,a),l=Sa(t,a,r,e);s._to===l.x&&n._to===l.y||(this.xAlign=r.xAlign,this.yAlign=r.yAlign,this.width=o.width,this.height=o.height,this.caretX=i.x,this.caretY=i.y,this._resolveAnimations().update(this,l))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let i=this.opacity;if(!i)return;this._updateAnimationTarget(e);const s={width:this.width,height:this.height},n={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;const o=Mi(e.padding),a=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&a&&(t.save(),t.globalAlpha=i,this.drawBackground(n,t,s,e),Ci(t,e.textDirection),n.y+=o.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),Oi(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const i=this._active,s=t.map((({datasetIndex:t,index:e})=>{const i=this.chart.getDatasetMeta(t);if(!i)throw new Error(\"Cannot find a dataset at index \"+t);return{datasetIndex:t,element:i.data[e],index:e}})),n=!f(i,s),o=this._positionChanged(s,e);(n||o)&&(this._active=s,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,i=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const s=this.options,n=this._active||[],o=this._getActiveElements(t,n,e,i),a=this._positionChanged(o,t),r=e||!f(o,n)||a;return r&&(this._active=o,(s.enabled||s.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),r}_getActiveElements(t,e,i,s){const n=this.options;if(\"mouseout\"===t.type)return[];if(!s)return e;const o=this.chart.getElementsAtEventForMode(t,n.mode,n,i);return n.reverse&&o.reverse(),o}_positionChanged(t,e){const{caretX:i,caretY:s,options:n}=this,o=xa[n.position].call(this,t,e);return!1!==o&&(i!==o.x||s!==o.y)}}var La={id:\"tooltip\",_element:Ta,positioners:xa,afterInit(t,e,i){i&&(t.tooltip=new Ta({chart:t,options:i}))},beforeUpdate(t,e,i){t.tooltip&&t.tooltip.initialize(i)},reset(t,e,i){t.tooltip&&t.tooltip.initialize(i)},afterDraw(t){const e=t.tooltip;if(e&&e._willRender()){const i={tooltip:e};if(!1===t.notifyPlugins(\"beforeTooltipDraw\",{...i,cancelable:!0}))return;e.draw(t.ctx),t.notifyPlugins(\"afterTooltipDraw\",i)}},afterEvent(t,e){if(t.tooltip){const i=e.replay;t.tooltip.handleEvent(e.event,i,e.inChartArea)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:\"average\",backgroundColor:\"rgba(0,0,0,0.8)\",titleColor:\"#fff\",titleFont:{weight:\"bold\"},titleSpacing:2,titleMarginBottom:6,titleAlign:\"left\",bodyColor:\"#fff\",bodySpacing:2,bodyFont:{},bodyAlign:\"left\",footerColor:\"#fff\",footerSpacing:2,footerMarginTop:6,footerFont:{weight:\"bold\"},footerAlign:\"left\",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:\"#fff\",displayColors:!0,boxPadding:0,borderColor:\"rgba(0,0,0,0)\",borderWidth:0,animation:{duration:400,easing:\"easeOutQuart\"},animations:{numbers:{type:\"number\",properties:[\"x\",\"y\",\"width\",\"height\",\"caretX\",\"caretY\"]},opacity:{easing:\"linear\",duration:200}},callbacks:Oa},defaultRoutes:{bodyFont:\"font\",footerFont:\"font\",titleFont:\"font\"},descriptors:{_scriptable:t=>\"filter\"!==t&&\"itemSort\"!==t&&\"external\"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:\"animation\"}},additionalOptionScopes:[\"interaction\"]};return wn.register(Vn,zo,oo,t),wn.helpers={...Vi},wn._adapters=Dn,wn.Animation=Ss,wn.Animations=Ps,wn.animator=xt,wn.controllers=Js.controllers.items,wn.DatasetController=Vs,wn.Element=Bs,wn.elements=oo,wn.Interaction=Yi,wn.layouts=ns,wn.platforms=Ms,wn.Scale=Ks,wn.Ticks=ae,Object.assign(wn,Vn,zo,oo,t,Ms),wn.Chart=wn,\"undefined\"!=typeof window&&(window.Chart=wn),wn}));\n","(function(document,Math,undefined){(function(factory){if(typeof define===\"function\"&&define.amd){define([\"jquery\"],factory)}else if(jQuery&&!jQuery.fn.sparkline){factory(jQuery)}})(function($){\"use strict\";var UNSET_OPTION={},getDefaults,createClass,SPFormat,clipval,quartile,normalizeValue,normalizeValues,remove,isNumber,all,sum,addCSS,ensureArray,formatNumber,RangeMap,MouseHandler,Tooltip,barHighlightMixin,line,bar,tristate,discrete,bullet,pie,box,defaultStyles,initStyles,VShape,VCanvas_base,VCanvas_canvas,VCanvas_vml,pending,shapeCount=0;getDefaults=function(){return{common:{type:\"line\",lineColor:\"#00f\",fillColor:\"#cdf\",defaultPixelsPerValue:3,width:\"auto\",height:\"auto\",composite:false,tagValuesAttribute:\"values\",tagOptionsPrefix:\"spark\",enableTagOptions:false,enableHighlight:true,highlightLighten:1.4,tooltipSkipNull:true,tooltipPrefix:\"\",tooltipSuffix:\"\",disableHiddenCheck:false,numberFormatter:false,numberDigitGroupCount:3,numberDigitGroupSep:\",\",numberDecimalMark:\".\",disableTooltips:false,disableInteraction:false},line:{spotColor:\"#f80\",highlightSpotColor:\"#5f5\",highlightLineColor:\"#f22\",spotRadius:1.5,minSpotColor:\"#f80\",maxSpotColor:\"#f80\",lineWidth:1,normalRangeMin:undefined,normalRangeMax:undefined,normalRangeColor:\"#ccc\",drawNormalOnTop:false,chartRangeMin:undefined,chartRangeMax:undefined,chartRangeMinX:undefined,chartRangeMaxX:undefined,tooltipFormat:new SPFormat('<span style=\"color: {{color}}\">&#9679;</span> {{prefix}}{{y}}{{suffix}}')},bar:{barColor:\"#3366cc\",negBarColor:\"#f44\",stackedBarColor:[\"#3366cc\",\"#dc3912\",\"#ff9900\",\"#109618\",\"#66aa00\",\"#dd4477\",\"#0099c6\",\"#990099\"],zeroColor:undefined,nullColor:undefined,zeroAxis:true,barWidth:4,barSpacing:1,chartRangeMax:undefined,chartRangeMin:undefined,chartRangeClip:false,colorMap:undefined,tooltipFormat:new SPFormat('<span style=\"color: {{color}}\">&#9679;</span> {{prefix}}{{value}}{{suffix}}')},tristate:{barWidth:4,barSpacing:1,posBarColor:\"#6f6\",negBarColor:\"#f44\",zeroBarColor:\"#999\",colorMap:{},tooltipFormat:new SPFormat('<span style=\"color: {{color}}\">&#9679;</span> {{value:map}}'),tooltipValueLookups:{map:{\"-1\":\"Loss\",0:\"Draw\",1:\"Win\"}}},discrete:{lineHeight:\"auto\",thresholdColor:undefined,thresholdValue:0,chartRangeMax:undefined,chartRangeMin:undefined,chartRangeClip:false,tooltipFormat:new SPFormat(\"{{prefix}}{{value}}{{suffix}}\")},bullet:{targetColor:\"#f33\",targetWidth:3,performanceColor:\"#33f\",rangeColors:[\"#d3dafe\",\"#a8b6ff\",\"#7f94ff\"],base:undefined,tooltipFormat:new SPFormat(\"{{fieldkey:fields}} - {{value}}\"),tooltipValueLookups:{fields:{r:\"Range\",p:\"Performance\",t:\"Target\"}}},pie:{offset:0,sliceColors:[\"#3366cc\",\"#dc3912\",\"#ff9900\",\"#109618\",\"#66aa00\",\"#dd4477\",\"#0099c6\",\"#990099\"],borderWidth:0,borderColor:\"#000\",tooltipFormat:new SPFormat('<span style=\"color: {{color}}\">&#9679;</span> {{value}} ({{percent.1}}%)')},box:{raw:false,boxLineColor:\"#000\",boxFillColor:\"#cdf\",whiskerColor:\"#000\",outlierLineColor:\"#333\",outlierFillColor:\"#fff\",medianColor:\"#f00\",showOutliers:true,outlierIQR:1.5,spotRadius:1.5,target:undefined,targetColor:\"#4a2\",chartRangeMax:undefined,chartRangeMin:undefined,tooltipFormat:new SPFormat(\"{{field:fields}}: {{value}}\"),tooltipFormatFieldlistKey:\"field\",tooltipValueLookups:{fields:{lq:\"Lower Quartile\",med:\"Median\",uq:\"Upper Quartile\",lo:\"Left Outlier\",ro:\"Right Outlier\",lw:\"Left Whisker\",rw:\"Right Whisker\"}}}}};defaultStyles=\".jqstooltip { \"+\"position: absolute;\"+\"left: 0px;\"+\"top: 0px;\"+\"visibility: hidden;\"+\"background: rgb(0, 0, 0) transparent;\"+\"background-color: rgba(0,0,0,0.6);\"+\"filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);\"+'-ms-filter: \"progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)\";'+\"color: white;\"+\"font: 10px arial, san serif;\"+\"text-align: left;\"+\"white-space: nowrap;\"+\"padding: 5px;\"+\"border: 1px solid white;\"+\"box-sizing: content-box;\"+\"z-index: 10000;\"+\"}\"+\".jqsfield { \"+\"color: white;\"+\"font: 10px arial, san serif;\"+\"text-align: left;\"+\"}\";createClass=function(){var Class,args;Class=function(){this.init.apply(this,arguments)};if(arguments.length>1){if(arguments[0]){Class.prototype=$.extend(new arguments[0],arguments[arguments.length-1]);Class._super=arguments[0].prototype}else{Class.prototype=arguments[arguments.length-1]}if(arguments.length>2){args=Array.prototype.slice.call(arguments,1,-1);args.unshift(Class.prototype);$.extend.apply($,args)}}else{Class.prototype=arguments[0]}Class.prototype.cls=Class;return Class};$.SPFormatClass=SPFormat=createClass({fre:/\\{\\{([\\w.]+?)(:(.+?))?\\}\\}/g,precre:/(\\w+)\\.(\\d+)/,init:function(format,fclass){this.format=format;this.fclass=fclass},render:function(fieldset,lookups,options){var self=this,fields=fieldset,match,token,lookupkey,fieldvalue,prec;return this.format.replace(this.fre,function(){var lookup;token=arguments[1];lookupkey=arguments[3];match=self.precre.exec(token);if(match){prec=match[2];token=match[1]}else{prec=false}fieldvalue=fields[token];if(fieldvalue===undefined){return\"\"}if(lookupkey&&lookups&&lookups[lookupkey]){lookup=lookups[lookupkey];if(lookup.get){return lookups[lookupkey].get(fieldvalue)||fieldvalue}else{return lookups[lookupkey][fieldvalue]||fieldvalue}}if(isNumber(fieldvalue)){if(options.get(\"numberFormatter\")){fieldvalue=options.get(\"numberFormatter\")(fieldvalue)}else{fieldvalue=formatNumber(fieldvalue,prec,options.get(\"numberDigitGroupCount\"),options.get(\"numberDigitGroupSep\"),options.get(\"numberDecimalMark\"))}}return fieldvalue})}});$.spformat=function(format,fclass){return new SPFormat(format,fclass)};clipval=function(val,min,max){if(val<min){return min}if(val>max){return max}return val};quartile=function(values,q){var vl;if(q===2){vl=Math.floor(values.length/2);return values.length%2?values[vl]:(values[vl-1]+values[vl])/2}else{if(values.length%2){vl=(values.length*q+q)/4;return vl%1?(values[Math.floor(vl)]+values[Math.floor(vl)-1])/2:values[vl-1]}else{vl=(values.length*q+2)/4;return vl%1?(values[Math.floor(vl)]+values[Math.floor(vl)-1])/2:values[vl-1]}}};normalizeValue=function(val){var nf;switch(val){case\"undefined\":val=undefined;break;case\"null\":val=null;break;case\"true\":val=true;break;case\"false\":val=false;break;default:nf=parseFloat(val);if(val==nf){val=nf}}return val};normalizeValues=function(vals){var i,result=[];for(i=vals.length;i--;){result[i]=normalizeValue(vals[i])}return result};remove=function(vals,filter){var i,vl,result=[];for(i=0,vl=vals.length;i<vl;i++){if(vals[i]!==filter){result.push(vals[i])}}return result};isNumber=function(num){return!isNaN(parseFloat(num))&&isFinite(num)};formatNumber=function(num,prec,groupsize,groupsep,decsep){var p,i;num=(prec===false?parseFloat(num).toString():num.toFixed(prec)).split(\"\");p=(p=$.inArray(\".\",num))<0?num.length:p;if(p<num.length){num[p]=decsep}for(i=p-groupsize;i>0;i-=groupsize){num.splice(i,0,groupsep)}return num.join(\"\")};all=function(val,arr,ignoreNull){var i;for(i=arr.length;i--;){if(ignoreNull&&arr[i]===null)continue;if(arr[i]!==val){return false}}return true};sum=function(vals){var total=0,i;for(i=vals.length;i--;){total+=typeof vals[i]===\"number\"?vals[i]:0}return total};ensureArray=function(val){return $.isArray(val)?val:[val]};addCSS=function(css){var tag,iefail;if(document.createStyleSheet){try{document.createStyleSheet().cssText=css;return}catch(e){iefail=true}}tag=document.createElement(\"style\");tag.type=\"text/css\";document.getElementsByTagName(\"head\")[0].appendChild(tag);if(iefail){document.styleSheets[document.styleSheets.length-1].cssText=css}else{tag[typeof document.body.style.WebkitAppearance==\"string\"?\"innerText\":\"innerHTML\"]=css}};$.fn.simpledraw=function(width,height,useExisting,interact){var target,mhandler;if(useExisting&&(target=this.data(\"_jqs_vcanvas\"))){return target}if($.fn.sparkline.canvas===false){return false}else if($.fn.sparkline.canvas===undefined){var el=document.createElement(\"canvas\");if(!!(el.getContext&&el.getContext(\"2d\"))){$.fn.sparkline.canvas=function(width,height,target,interact){return new VCanvas_canvas(width,height,target,interact)}}else if(document.namespaces&&!document.namespaces.v){document.namespaces.add(\"v\",\"urn:schemas-microsoft-com:vml\",\"#default#VML\");$.fn.sparkline.canvas=function(width,height,target,interact){return new VCanvas_vml(width,height,target)}}else{$.fn.sparkline.canvas=false;return false}}if(width===undefined){width=$(this).innerWidth()}if(height===undefined){height=$(this).innerHeight()}target=$.fn.sparkline.canvas(width,height,this,interact);mhandler=$(this).data(\"_jqs_mhandler\");if(mhandler){mhandler.registerCanvas(target)}return target};$.fn.cleardraw=function(){var target=this.data(\"_jqs_vcanvas\");if(target){target.reset()}};$.RangeMapClass=RangeMap=createClass({init:function(map){var key,range,rangelist=[];for(key in map){if(map.hasOwnProperty(key)&&typeof key===\"string\"&&key.indexOf(\":\")>-1){range=key.split(\":\");range[0]=range[0].length===0?-Infinity:parseFloat(range[0]);range[1]=range[1].length===0?Infinity:parseFloat(range[1]);range[2]=map[key];rangelist.push(range)}}this.map=map;this.rangelist=rangelist||false},get:function(value){var rangelist=this.rangelist,i,range,result;if((result=this.map[value])!==undefined){return result}if(rangelist){for(i=rangelist.length;i--;){range=rangelist[i];if(range[0]<=value&&range[1]>=value){return range[2]}}}return undefined}});$.range_map=function(map){return new RangeMap(map)};MouseHandler=createClass({init:function(el,options){var $el=$(el);this.$el=$el;this.options=options;this.currentPageX=0;this.currentPageY=0;this.el=el;this.splist=[];this.tooltip=null;this.over=false;this.displayTooltips=!options.get(\"disableTooltips\");this.highlightEnabled=!options.get(\"disableHighlight\")},registerSparkline:function(sp){this.splist.push(sp);if(this.over){this.updateDisplay()}},registerCanvas:function(canvas){var $canvas=$(canvas.canvas);this.canvas=canvas;this.$canvas=$canvas;$canvas.mouseenter($.proxy(this.mouseenter,this));$canvas.mouseleave($.proxy(this.mouseleave,this));$canvas.click($.proxy(this.mouseclick,this))},reset:function(removeTooltip){this.splist=[];if(this.tooltip&&removeTooltip){this.tooltip.remove();this.tooltip=undefined}},mouseclick:function(e){var clickEvent=$.Event(\"sparklineClick\");clickEvent.originalEvent=e;clickEvent.sparklines=this.splist;this.$el.trigger(clickEvent)},mouseenter:function(e){$(document.body).unbind(\"mousemove.jqs\");$(document.body).bind(\"mousemove.jqs\",$.proxy(this.mousemove,this));this.over=true;this.currentPageX=e.pageX;this.currentPageY=e.pageY;this.currentEl=e.target;if(!this.tooltip&&this.displayTooltips){this.tooltip=new Tooltip(this.options);this.tooltip.updatePosition(e.pageX,e.pageY)}this.updateDisplay()},mouseleave:function(){$(document.body).unbind(\"mousemove.jqs\");var splist=this.splist,spcount=splist.length,needsRefresh=false,sp,i;this.over=false;this.currentEl=null;if(this.tooltip){this.tooltip.remove();this.tooltip=null}for(i=0;i<spcount;i++){sp=splist[i];if(sp.clearRegionHighlight()){needsRefresh=true}}if(needsRefresh){this.canvas.render()}},mousemove:function(e){this.currentPageX=e.pageX;this.currentPageY=e.pageY;this.currentEl=e.target;if(this.tooltip){this.tooltip.updatePosition(e.pageX,e.pageY)}this.updateDisplay()},updateDisplay:function(){var splist=this.splist,spcount=splist.length,needsRefresh=false,offset=this.$canvas.offset(),localX=this.currentPageX-offset.left,localY=this.currentPageY-offset.top,tooltiphtml,sp,i,result,changeEvent;if(!this.over){return}for(i=0;i<spcount;i++){sp=splist[i];result=sp.setRegionHighlight(this.currentEl,localX,localY);if(result){needsRefresh=true}}if(needsRefresh){changeEvent=$.Event(\"sparklineRegionChange\");changeEvent.sparklines=this.splist;this.$el.trigger(changeEvent);if(this.tooltip){tooltiphtml=\"\";for(i=0;i<spcount;i++){sp=splist[i];tooltiphtml+=sp.getCurrentRegionTooltip()}this.tooltip.setContent(tooltiphtml)}if(!this.disableHighlight){this.canvas.render()}}if(result===null){this.mouseleave()}}});Tooltip=createClass({sizeStyle:\"position: static !important;\"+\"display: block !important;\"+\"visibility: hidden !important;\"+\"float: left !important;\",init:function(options){var tooltipClassname=options.get(\"tooltipClassname\",\"jqstooltip\"),sizetipStyle=this.sizeStyle,offset;this.container=options.get(\"tooltipContainer\")||document.body;this.tooltipOffsetX=options.get(\"tooltipOffsetX\",10);this.tooltipOffsetY=options.get(\"tooltipOffsetY\",12);$(\"#jqssizetip\").remove();$(\"#jqstooltip\").remove();this.sizetip=$(\"<div/>\",{id:\"jqssizetip\",style:sizetipStyle,\"class\":tooltipClassname});this.tooltip=$(\"<div/>\",{id:\"jqstooltip\",\"class\":tooltipClassname}).appendTo(this.container);offset=this.tooltip.offset();this.offsetLeft=offset.left;this.offsetTop=offset.top;this.hidden=true;$(window).unbind(\"resize.jqs scroll.jqs\");$(window).bind(\"resize.jqs scroll.jqs\",$.proxy(this.updateWindowDims,this));this.updateWindowDims()},updateWindowDims:function(){this.scrollTop=$(window).scrollTop();this.scrollLeft=$(window).scrollLeft();this.scrollRight=this.scrollLeft+$(window).width();this.updatePosition()},getSize:function(content){this.sizetip.html(content).appendTo(this.container);this.width=this.sizetip.width()+1;this.height=this.sizetip.height();this.sizetip.remove()},setContent:function(content){if(!content){this.tooltip.css(\"visibility\",\"hidden\");this.hidden=true;return}this.getSize(content);this.tooltip.html(content).css({width:this.width,height:this.height,visibility:\"visible\"});if(this.hidden){this.hidden=false;this.updatePosition()}},updatePosition:function(x,y){if(x===undefined){if(this.mousex===undefined){return}x=this.mousex-this.offsetLeft;y=this.mousey-this.offsetTop}else{this.mousex=x=x-this.offsetLeft;this.mousey=y=y-this.offsetTop}if(!this.height||!this.width||this.hidden){return}y-=this.height+this.tooltipOffsetY;x+=this.tooltipOffsetX;if(y<this.scrollTop){y=this.scrollTop}if(x<this.scrollLeft){x=this.scrollLeft}else if(x+this.width>this.scrollRight){x=this.scrollRight-this.width}this.tooltip.css({left:x,top:y})},remove:function(){this.tooltip.remove();this.sizetip.remove();this.sizetip=this.tooltip=undefined;$(window).unbind(\"resize.jqs scroll.jqs\")}});initStyles=function(){addCSS(defaultStyles)};$(initStyles);pending=[];$.fn.sparkline=function(userValues,userOptions){return this.each(function(){var options=new $.fn.sparkline.options(this,userOptions),$this=$(this),render,i;render=function(){var values,width,height,tmp,mhandler,sp,vals;if(userValues===\"html\"||userValues===undefined){vals=this.getAttribute(options.get(\"tagValuesAttribute\"));if(vals===undefined||vals===null){vals=$this.html()}values=vals.replace(/(^\\s*<!--)|(-->\\s*$)|\\s+/g,\"\").split(\",\")}else{values=userValues}width=options.get(\"width\")===\"auto\"?values.length*options.get(\"defaultPixelsPerValue\"):options.get(\"width\");if(options.get(\"height\")===\"auto\"){if(!options.get(\"composite\")||!$.data(this,\"_jqs_vcanvas\")){tmp=document.createElement(\"span\");tmp.innerHTML=\"a\";$this.html(tmp);height=$(tmp).innerHeight()||$(tmp).height();$(tmp).remove();tmp=null}}else{height=options.get(\"height\")}if(!options.get(\"disableInteraction\")){mhandler=$.data(this,\"_jqs_mhandler\");if(!mhandler){mhandler=new MouseHandler(this,options);$.data(this,\"_jqs_mhandler\",mhandler)}else if(!options.get(\"composite\")){mhandler.reset()}}else{mhandler=false}if(options.get(\"composite\")&&!$.data(this,\"_jqs_vcanvas\")){if(!$.data(this,\"_jqs_errnotify\")){alert(\"Attempted to attach a composite sparkline to an element with no existing sparkline\");$.data(this,\"_jqs_errnotify\",true)}return}sp=new($.fn.sparkline[options.get(\"type\")])(this,values,options,width,height);sp.render();if(mhandler){mhandler.registerSparkline(sp)}};if($(this).html()&&!options.get(\"disableHiddenCheck\")&&$(this).is(\":hidden\")||!$(this).parents(\"body\").length){if(!options.get(\"composite\")&&$.data(this,\"_jqs_pending\")){for(i=pending.length;i;i--){if(pending[i-1][0]==this){pending.splice(i-1,1)}}}pending.push([this,render]);$.data(this,\"_jqs_pending\",true)}else{render.call(this)}})};$.fn.sparkline.defaults=getDefaults();$.sparkline_display_visible=function(){var el,i,pl;var done=[];for(i=0,pl=pending.length;i<pl;i++){el=pending[i][0];if($(el).is(\":visible\")&&!$(el).parents().is(\":hidden\")){pending[i][1].call(el);$.data(pending[i][0],\"_jqs_pending\",false);done.push(i)}else if(!$(el).closest(\"html\").length&&!$.data(el,\"_jqs_pending\")){$.data(pending[i][0],\"_jqs_pending\",false);done.push(i)}}for(i=done.length;i;i--){pending.splice(done[i-1],1)}};$.fn.sparkline.options=createClass({init:function(tag,userOptions){var extendedOptions,defaults,base,tagOptionType;this.userOptions=userOptions=userOptions||{};this.tag=tag;this.tagValCache={};defaults=$.fn.sparkline.defaults;base=defaults.common;this.tagOptionsPrefix=userOptions.enableTagOptions&&(userOptions.tagOptionsPrefix||base.tagOptionsPrefix);tagOptionType=this.getTagSetting(\"type\");if(tagOptionType===UNSET_OPTION){extendedOptions=defaults[userOptions.type||base.type]}else{extendedOptions=defaults[tagOptionType]}this.mergedOptions=$.extend({},base,extendedOptions,userOptions)},getTagSetting:function(key){var prefix=this.tagOptionsPrefix,val,i,pairs,keyval;if(prefix===false||prefix===undefined){return UNSET_OPTION}if(this.tagValCache.hasOwnProperty(key)){val=this.tagValCache.key}else{val=this.tag.getAttribute(prefix+key);if(val===undefined||val===null){val=UNSET_OPTION}else if(val.substr(0,1)===\"[\"){val=val.substr(1,val.length-2).split(\",\");for(i=val.length;i--;){val[i]=normalizeValue(val[i].replace(/(^\\s*)|(\\s*$)/g,\"\"))}}else if(val.substr(0,1)===\"{\"){pairs=val.substr(1,val.length-2).split(\",\");val={};for(i=pairs.length;i--;){keyval=pairs[i].split(\":\",2);val[keyval[0].replace(/(^\\s*)|(\\s*$)/g,\"\")]=normalizeValue(keyval[1].replace(/(^\\s*)|(\\s*$)/g,\"\"))}}else{val=normalizeValue(val)}this.tagValCache.key=val}return val},get:function(key,defaultval){var tagOption=this.getTagSetting(key),result;if(tagOption!==UNSET_OPTION){return tagOption}return(result=this.mergedOptions[key])===undefined?defaultval:result}});$.fn.sparkline._base=createClass({disabled:false,init:function(el,values,options,width,height){this.el=el;this.$el=$(el);this.values=values;this.options=options;this.width=width;this.height=height;this.currentRegion=undefined},initTarget:function(){var interactive=!this.options.get(\"disableInteraction\");if(!(this.target=this.$el.simpledraw(this.width,this.height,this.options.get(\"composite\"),interactive))){this.disabled=true}else{this.canvasWidth=this.target.pixelWidth;this.canvasHeight=this.target.pixelHeight}},render:function(){if(this.disabled){this.el.innerHTML=\"\";return false}return true},getRegion:function(x,y){},setRegionHighlight:function(el,x,y){var currentRegion=this.currentRegion,highlightEnabled=!this.options.get(\"disableHighlight\"),newRegion;if(x>this.canvasWidth||y>this.canvasHeight||x<0||y<0){return null}newRegion=this.getRegion(el,x,y);if(currentRegion!==newRegion){if(currentRegion!==undefined&&highlightEnabled){this.removeHighlight()}this.currentRegion=newRegion;if(newRegion!==undefined&&highlightEnabled){this.renderHighlight()}return true}return false},clearRegionHighlight:function(){if(this.currentRegion!==undefined){this.removeHighlight();this.currentRegion=undefined;return true}return false},renderHighlight:function(){this.changeHighlight(true)},removeHighlight:function(){this.changeHighlight(false)},changeHighlight:function(highlight){},getCurrentRegionTooltip:function(){var options=this.options,header=\"\",entries=[],fields,formats,formatlen,fclass,text,i,showFields,showFieldsKey,newFields,fv,formatter,format,fieldlen,j;if(this.currentRegion===undefined){return\"\"}fields=this.getCurrentRegionFields();formatter=options.get(\"tooltipFormatter\");if(formatter){return formatter(this,options,fields)}if(options.get(\"tooltipChartTitle\")){header+='<div class=\"jqs jqstitle\">'+options.get(\"tooltipChartTitle\")+\"</div>\\n\"}formats=this.options.get(\"tooltipFormat\");if(!formats){return\"\"}if(!$.isArray(formats)){formats=[formats]}if(!$.isArray(fields)){fields=[fields]}showFields=this.options.get(\"tooltipFormatFieldlist\");showFieldsKey=this.options.get(\"tooltipFormatFieldlistKey\");if(showFields&&showFieldsKey){newFields=[];for(i=fields.length;i--;){fv=fields[i][showFieldsKey];if((j=$.inArray(fv,showFields))!=-1){newFields[j]=fields[i]}}fields=newFields}formatlen=formats.length;fieldlen=fields.length;for(i=0;i<formatlen;i++){format=formats[i];if(typeof format===\"string\"){format=new SPFormat(format)}fclass=format.fclass||\"jqsfield\";for(j=0;j<fieldlen;j++){if(!fields[j].isNull||!options.get(\"tooltipSkipNull\")){$.extend(fields[j],{prefix:options.get(\"tooltipPrefix\"),suffix:options.get(\"tooltipSuffix\")});text=format.render(fields[j],options.get(\"tooltipValueLookups\"),options);entries.push('<div class=\"'+fclass+'\">'+text+\"</div>\")}}}if(entries.length){return header+entries.join(\"\\n\")}return\"\"},getCurrentRegionFields:function(){},calcHighlightColor:function(color,options){var highlightColor=options.get(\"highlightColor\"),lighten=options.get(\"highlightLighten\"),parse,mult,rgbnew,i;if(highlightColor){return highlightColor}if(lighten){parse=/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(color)||/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(color);if(parse){rgbnew=[];mult=color.length===4?16:1;for(i=0;i<3;i++){rgbnew[i]=clipval(Math.round(parseInt(parse[i+1],16)*mult*lighten),0,255)}return\"rgb(\"+rgbnew.join(\",\")+\")\"}}return color}});barHighlightMixin={changeHighlight:function(highlight){var currentRegion=this.currentRegion,target=this.target,shapeids=this.regionShapes[currentRegion],newShapes;if(shapeids){newShapes=this.renderRegion(currentRegion,highlight);if($.isArray(newShapes)||$.isArray(shapeids)){target.replaceWithShapes(shapeids,newShapes);this.regionShapes[currentRegion]=$.map(newShapes,function(newShape){return newShape.id})}else{target.replaceWithShape(shapeids,newShapes);this.regionShapes[currentRegion]=newShapes.id}}},render:function(){var values=this.values,target=this.target,regionShapes=this.regionShapes,shapes,ids,i,j;if(!this.cls._super.render.call(this)){return}for(i=values.length;i--;){shapes=this.renderRegion(i);if(shapes){if($.isArray(shapes)){ids=[];for(j=shapes.length;j--;){shapes[j].append();ids.push(shapes[j].id)}regionShapes[i]=ids}else{shapes.append();regionShapes[i]=shapes.id}}else{regionShapes[i]=null}}target.render()}};$.fn.sparkline.line=line=createClass($.fn.sparkline._base,{type:\"line\",init:function(el,values,options,width,height){line._super.init.call(this,el,values,options,width,height);this.vertices=[];this.regionMap=[];this.xvalues=[];this.yvalues=[];this.yminmax=[];this.hightlightSpotId=null;this.lastShapeId=null;this.initTarget()},getRegion:function(el,x,y){var i,regionMap=this.regionMap;for(i=regionMap.length;i--;){if(regionMap[i]!==null&&x>=regionMap[i][0]&&x<=regionMap[i][1]){return regionMap[i][2]}}return undefined},getCurrentRegionFields:function(){var currentRegion=this.currentRegion;return{isNull:this.yvalues[currentRegion]===null,x:this.xvalues[currentRegion],y:this.yvalues[currentRegion],color:this.options.get(\"lineColor\"),fillColor:this.options.get(\"fillColor\"),offset:currentRegion}},renderHighlight:function(){var currentRegion=this.currentRegion,target=this.target,vertex=this.vertices[currentRegion],options=this.options,spotRadius=options.get(\"spotRadius\"),highlightSpotColor=options.get(\"highlightSpotColor\"),highlightLineColor=options.get(\"highlightLineColor\"),highlightSpot,highlightLine;if(!vertex){return}if(spotRadius&&highlightSpotColor){highlightSpot=target.drawCircle(vertex[0],vertex[1],spotRadius,undefined,highlightSpotColor);this.highlightSpotId=highlightSpot.id;target.insertAfterShape(this.lastShapeId,highlightSpot)}if(highlightLineColor){highlightLine=target.drawLine(vertex[0],this.canvasTop,vertex[0],this.canvasTop+this.canvasHeight,highlightLineColor);this.highlightLineId=highlightLine.id;target.insertAfterShape(this.lastShapeId,highlightLine)}},removeHighlight:function(){var target=this.target;if(this.highlightSpotId){target.removeShapeId(this.highlightSpotId);this.highlightSpotId=null}if(this.highlightLineId){target.removeShapeId(this.highlightLineId);this.highlightLineId=null}},scanValues:function(){var values=this.values,valcount=values.length,xvalues=this.xvalues,yvalues=this.yvalues,yminmax=this.yminmax,i,val,isStr,isArray,sp;for(i=0;i<valcount;i++){val=values[i];isStr=typeof values[i]===\"string\";isArray=typeof values[i]===\"object\"&&values[i]instanceof Array;sp=isStr&&values[i].split(\":\");if(isStr&&sp.length===2){xvalues.push(Number(sp[0]));yvalues.push(Number(sp[1]));yminmax.push(Number(sp[1]))}else if(isArray){xvalues.push(val[0]);yvalues.push(val[1]);yminmax.push(val[1])}else{xvalues.push(i);if(values[i]===null||values[i]===\"null\"){yvalues.push(null)}else{yvalues.push(Number(val));yminmax.push(Number(val))}}}if(this.options.get(\"xvalues\")){xvalues=this.options.get(\"xvalues\")}this.maxy=this.maxyorg=Math.max.apply(Math,yminmax);this.miny=this.minyorg=Math.min.apply(Math,yminmax);this.maxx=Math.max.apply(Math,xvalues);this.minx=Math.min.apply(Math,xvalues);this.xvalues=xvalues;this.yvalues=yvalues;this.yminmax=yminmax},processRangeOptions:function(){var options=this.options,normalRangeMin=options.get(\"normalRangeMin\"),normalRangeMax=options.get(\"normalRangeMax\");if(normalRangeMin!==undefined){if(normalRangeMin<this.miny){this.miny=normalRangeMin}if(normalRangeMax>this.maxy){this.maxy=normalRangeMax}}if(options.get(\"chartRangeMin\")!==undefined&&(options.get(\"chartRangeClip\")||options.get(\"chartRangeMin\")<this.miny)){this.miny=options.get(\"chartRangeMin\")}if(options.get(\"chartRangeMax\")!==undefined&&(options.get(\"chartRangeClip\")||options.get(\"chartRangeMax\")>this.maxy)){this.maxy=options.get(\"chartRangeMax\")}if(options.get(\"chartRangeMinX\")!==undefined&&(options.get(\"chartRangeClipX\")||options.get(\"chartRangeMinX\")<this.minx)){this.minx=options.get(\"chartRangeMinX\")}if(options.get(\"chartRangeMaxX\")!==undefined&&(options.get(\"chartRangeClipX\")||options.get(\"chartRangeMaxX\")>this.maxx)){this.maxx=options.get(\"chartRangeMaxX\")}},drawNormalRange:function(canvasLeft,canvasTop,canvasHeight,canvasWidth,rangey){var normalRangeMin=this.options.get(\"normalRangeMin\"),normalRangeMax=this.options.get(\"normalRangeMax\"),ytop=canvasTop+Math.round(canvasHeight-canvasHeight*((normalRangeMax-this.miny)/rangey)),height=Math.round(canvasHeight*(normalRangeMax-normalRangeMin)/rangey);this.target.drawRect(canvasLeft,ytop,canvasWidth,height,undefined,this.options.get(\"normalRangeColor\")).append()},render:function(){var options=this.options,target=this.target,canvasWidth=this.canvasWidth,canvasHeight=this.canvasHeight,vertices=this.vertices,spotRadius=options.get(\"spotRadius\"),regionMap=this.regionMap,rangex,rangey,yvallast,canvasTop,canvasLeft,vertex,path,paths,x,y,xnext,xpos,xposnext,last,next,yvalcount,lineShapes,fillShapes,plen,valueSpots,hlSpotsEnabled,color,xvalues,yvalues,i;if(!line._super.render.call(this)){return}this.scanValues();this.processRangeOptions();xvalues=this.xvalues;yvalues=this.yvalues;if(!this.yminmax.length||this.yvalues.length<2){return}canvasTop=canvasLeft=0;rangex=this.maxx-this.minx===0?1:this.maxx-this.minx;rangey=this.maxy-this.miny===0?1:this.maxy-this.miny;yvallast=this.yvalues.length-1;if(spotRadius&&(canvasWidth<spotRadius*4||canvasHeight<spotRadius*4)){spotRadius=0}if(spotRadius){hlSpotsEnabled=options.get(\"highlightSpotColor\")&&!options.get(\"disableInteraction\");if(hlSpotsEnabled||options.get(\"minSpotColor\")||options.get(\"spotColor\")&&yvalues[yvallast]===this.miny){canvasHeight-=Math.ceil(spotRadius)}if(hlSpotsEnabled||options.get(\"maxSpotColor\")||options.get(\"spotColor\")&&yvalues[yvallast]===this.maxy){canvasHeight-=Math.ceil(spotRadius);canvasTop+=Math.ceil(spotRadius)}if(hlSpotsEnabled||(options.get(\"minSpotColor\")||options.get(\"maxSpotColor\"))&&(yvalues[0]===this.miny||yvalues[0]===this.maxy)){canvasLeft+=Math.ceil(spotRadius);canvasWidth-=Math.ceil(spotRadius)}if(hlSpotsEnabled||options.get(\"spotColor\")||(options.get(\"minSpotColor\")||options.get(\"maxSpotColor\")&&(yvalues[yvallast]===this.miny||yvalues[yvallast]===this.maxy))){canvasWidth-=Math.ceil(spotRadius)}}canvasHeight--;if(options.get(\"normalRangeMin\")!==undefined&&!options.get(\"drawNormalOnTop\")){this.drawNormalRange(canvasLeft,canvasTop,canvasHeight,canvasWidth,rangey)}path=[];paths=[path];last=next=null;yvalcount=yvalues.length;for(i=0;i<yvalcount;i++){x=xvalues[i];xnext=xvalues[i+1];y=yvalues[i];xpos=canvasLeft+Math.round((x-this.minx)*(canvasWidth/rangex));xposnext=i<yvalcount-1?canvasLeft+Math.round((xnext-this.minx)*(canvasWidth/rangex)):canvasWidth;next=xpos+(xposnext-xpos)/2;regionMap[i]=[last||0,next,i];last=next;if(y===null){if(i){if(yvalues[i-1]!==null){path=[];paths.push(path)}vertices.push(null)}}else{if(y<this.miny){y=this.miny}if(y>this.maxy){y=this.maxy}if(!path.length){path.push([xpos,canvasTop+canvasHeight])}vertex=[xpos,canvasTop+Math.round(canvasHeight-canvasHeight*((y-this.miny)/rangey))];path.push(vertex);vertices.push(vertex)}}lineShapes=[];fillShapes=[];plen=paths.length;for(i=0;i<plen;i++){path=paths[i];if(path.length){if(options.get(\"fillColor\")){path.push([path[path.length-1][0],canvasTop+canvasHeight]);fillShapes.push(path.slice(0));path.pop()}if(path.length>2){path[0]=[path[0][0],path[1][1]]}lineShapes.push(path)}}plen=fillShapes.length;for(i=0;i<plen;i++){target.drawShape(fillShapes[i],options.get(\"fillColor\"),options.get(\"fillColor\")).append()}if(options.get(\"normalRangeMin\")!==undefined&&options.get(\"drawNormalOnTop\")){this.drawNormalRange(canvasLeft,canvasTop,canvasHeight,canvasWidth,rangey)}plen=lineShapes.length;for(i=0;i<plen;i++){target.drawShape(lineShapes[i],options.get(\"lineColor\"),undefined,options.get(\"lineWidth\")).append()}if(spotRadius&&options.get(\"valueSpots\")){valueSpots=options.get(\"valueSpots\");if(valueSpots.get===undefined){valueSpots=new RangeMap(valueSpots)}for(i=0;i<yvalcount;i++){color=valueSpots.get(yvalues[i]);if(color){target.drawCircle(canvasLeft+Math.round((xvalues[i]-this.minx)*(canvasWidth/rangex)),canvasTop+Math.round(canvasHeight-canvasHeight*((yvalues[i]-this.miny)/rangey)),spotRadius,undefined,color).append()}}}if(spotRadius&&options.get(\"spotColor\")&&yvalues[yvallast]!==null){target.drawCircle(canvasLeft+Math.round((xvalues[xvalues.length-1]-this.minx)*(canvasWidth/rangex)),canvasTop+Math.round(canvasHeight-canvasHeight*((yvalues[yvallast]-this.miny)/rangey)),spotRadius,undefined,options.get(\"spotColor\")).append()}if(this.maxy!==this.minyorg){if(spotRadius&&options.get(\"minSpotColor\")){x=xvalues[$.inArray(this.minyorg,yvalues)];target.drawCircle(canvasLeft+Math.round((x-this.minx)*(canvasWidth/rangex)),canvasTop+Math.round(canvasHeight-canvasHeight*((this.minyorg-this.miny)/rangey)),spotRadius,undefined,options.get(\"minSpotColor\")).append()}if(spotRadius&&options.get(\"maxSpotColor\")){x=xvalues[$.inArray(this.maxyorg,yvalues)];target.drawCircle(canvasLeft+Math.round((x-this.minx)*(canvasWidth/rangex)),canvasTop+Math.round(canvasHeight-canvasHeight*((this.maxyorg-this.miny)/rangey)),spotRadius,undefined,options.get(\"maxSpotColor\")).append()}}this.lastShapeId=target.getLastShapeId();this.canvasTop=canvasTop;target.render()}});$.fn.sparkline.bar=bar=createClass($.fn.sparkline._base,barHighlightMixin,{type:\"bar\",init:function(el,values,options,width,height){var barWidth=parseInt(options.get(\"barWidth\"),10),barSpacing=parseInt(options.get(\"barSpacing\"),10),chartRangeMin=options.get(\"chartRangeMin\"),chartRangeMax=options.get(\"chartRangeMax\"),chartRangeClip=options.get(\"chartRangeClip\"),stackMin=Infinity,stackMax=-Infinity,isStackString,groupMin,groupMax,stackRanges,numValues,i,vlen,range,zeroAxis,xaxisOffset,min,max,clipMin,clipMax,stacked,vlist,j,slen,svals,val,yoffset,yMaxCalc,canvasHeightEf;bar._super.init.call(this,el,values,options,width,height);for(i=0,vlen=values.length;i<vlen;i++){val=values[i];isStackString=typeof val===\"string\"&&val.indexOf(\":\")>-1;if(isStackString||$.isArray(val)){stacked=true;if(isStackString){val=values[i]=normalizeValues(val.split(\":\"));\n}val=remove(val,null);groupMin=Math.min.apply(Math,val);groupMax=Math.max.apply(Math,val);if(groupMin<stackMin){stackMin=groupMin}if(groupMax>stackMax){stackMax=groupMax}}}this.stacked=stacked;this.regionShapes={};this.barWidth=barWidth;this.barSpacing=barSpacing;this.totalBarWidth=barWidth+barSpacing;this.width=width=values.length*barWidth+(values.length-1)*barSpacing;this.initTarget();if(chartRangeClip){clipMin=chartRangeMin===undefined?-Infinity:chartRangeMin;clipMax=chartRangeMax===undefined?Infinity:chartRangeMax}numValues=[];stackRanges=stacked?[]:numValues;var stackTotals=[];var stackRangesNeg=[];for(i=0,vlen=values.length;i<vlen;i++){if(stacked){vlist=values[i];values[i]=svals=[];stackTotals[i]=0;stackRanges[i]=stackRangesNeg[i]=0;for(j=0,slen=vlist.length;j<slen;j++){val=svals[j]=chartRangeClip?clipval(vlist[j],clipMin,clipMax):vlist[j];if(val!==null){if(val>0){stackTotals[i]+=val}if(stackMin<0&&stackMax>0){if(val<0){stackRangesNeg[i]+=Math.abs(val)}else{stackRanges[i]+=val}}else{stackRanges[i]+=Math.abs(val-(val<0?stackMax:stackMin))}numValues.push(val)}}}else{val=chartRangeClip?clipval(values[i],clipMin,clipMax):values[i];val=values[i]=normalizeValue(val);if(val!==null){numValues.push(val)}}}this.max=max=Math.max.apply(Math,numValues);this.min=min=Math.min.apply(Math,numValues);this.stackMax=stackMax=stacked?Math.max.apply(Math,stackTotals):max;this.stackMin=stackMin=stacked?Math.min.apply(Math,numValues):min;if(options.get(\"chartRangeMin\")!==undefined&&(options.get(\"chartRangeClip\")||options.get(\"chartRangeMin\")<min)){min=options.get(\"chartRangeMin\")}if(options.get(\"chartRangeMax\")!==undefined&&(options.get(\"chartRangeClip\")||options.get(\"chartRangeMax\")>max)){max=options.get(\"chartRangeMax\")}this.zeroAxis=zeroAxis=options.get(\"zeroAxis\",true);if(min<=0&&max>=0&&zeroAxis){xaxisOffset=0}else if(zeroAxis==false){xaxisOffset=min}else if(min>0){xaxisOffset=min}else{xaxisOffset=max}this.xaxisOffset=xaxisOffset;range=stacked?Math.max.apply(Math,stackRanges)+Math.max.apply(Math,stackRangesNeg):max-min;this.canvasHeightEf=zeroAxis&&min<0?this.canvasHeight-2:this.canvasHeight-1;if(min<xaxisOffset){yMaxCalc=stacked&&max>=0?stackMax:max;yoffset=(yMaxCalc-xaxisOffset)/range*this.canvasHeight;if(yoffset!==Math.ceil(yoffset)){this.canvasHeightEf-=2;yoffset=Math.ceil(yoffset)}}else{yoffset=this.canvasHeight}this.yoffset=yoffset;if($.isArray(options.get(\"colorMap\"))){this.colorMapByIndex=options.get(\"colorMap\");this.colorMapByValue=null}else{this.colorMapByIndex=null;this.colorMapByValue=options.get(\"colorMap\");if(this.colorMapByValue&&this.colorMapByValue.get===undefined){this.colorMapByValue=new RangeMap(this.colorMapByValue)}}this.range=range},getRegion:function(el,x,y){var result=Math.floor(x/this.totalBarWidth);return result<0||result>=this.values.length?undefined:result},getCurrentRegionFields:function(){var currentRegion=this.currentRegion,values=ensureArray(this.values[currentRegion]),result=[],value,i;for(i=values.length;i--;){value=values[i];result.push({isNull:value===null,value:value,color:this.calcColor(i,value,currentRegion),offset:currentRegion})}return result},calcColor:function(stacknum,value,valuenum){var colorMapByIndex=this.colorMapByIndex,colorMapByValue=this.colorMapByValue,options=this.options,color,newColor;if(this.stacked){color=options.get(\"stackedBarColor\")}else{color=value<0?options.get(\"negBarColor\"):options.get(\"barColor\")}if(value===0&&options.get(\"zeroColor\")!==undefined){color=options.get(\"zeroColor\")}if(colorMapByValue&&(newColor=colorMapByValue.get(value))){color=newColor}else if(colorMapByIndex&&colorMapByIndex.length>valuenum){color=colorMapByIndex[valuenum]}return $.isArray(color)?color[stacknum%color.length]:color},renderRegion:function(valuenum,highlight){var vals=this.values[valuenum],options=this.options,xaxisOffset=this.xaxisOffset,result=[],range=this.range,stacked=this.stacked,target=this.target,x=valuenum*this.totalBarWidth,canvasHeightEf=this.canvasHeightEf,yoffset=this.yoffset,y,height,color,isNull,yoffsetNeg,i,valcount,val,minPlotted,allMin;vals=$.isArray(vals)?vals:[vals];valcount=vals.length;val=vals[0];isNull=all(null,vals);allMin=all(xaxisOffset,vals,true);if(isNull){if(options.get(\"nullColor\")){color=highlight?options.get(\"nullColor\"):this.calcHighlightColor(options.get(\"nullColor\"),options);y=yoffset>0?yoffset-1:yoffset;return target.drawRect(x,y,this.barWidth-1,0,color,color)}else{return undefined}}yoffsetNeg=yoffset;for(i=0;i<valcount;i++){val=vals[i];if(stacked&&val===xaxisOffset){if(!allMin||minPlotted){continue}minPlotted=true}if(range>0){height=Math.floor(canvasHeightEf*(Math.abs(val-xaxisOffset)/range))+1}else{height=1}if(val<xaxisOffset||val===xaxisOffset&&yoffset===0){y=yoffsetNeg;yoffsetNeg+=height}else{y=yoffset-height;yoffset-=height}color=this.calcColor(i,val,valuenum);if(highlight){color=this.calcHighlightColor(color,options)}result.push(target.drawRect(x,y,this.barWidth-1,height-1,color,color))}if(result.length===1){return result[0]}return result}});$.fn.sparkline.tristate=tristate=createClass($.fn.sparkline._base,barHighlightMixin,{type:\"tristate\",init:function(el,values,options,width,height){var barWidth=parseInt(options.get(\"barWidth\"),10),barSpacing=parseInt(options.get(\"barSpacing\"),10);tristate._super.init.call(this,el,values,options,width,height);this.regionShapes={};this.barWidth=barWidth;this.barSpacing=barSpacing;this.totalBarWidth=barWidth+barSpacing;this.values=$.map(values,Number);this.width=width=values.length*barWidth+(values.length-1)*barSpacing;if($.isArray(options.get(\"colorMap\"))){this.colorMapByIndex=options.get(\"colorMap\");this.colorMapByValue=null}else{this.colorMapByIndex=null;this.colorMapByValue=options.get(\"colorMap\");if(this.colorMapByValue&&this.colorMapByValue.get===undefined){this.colorMapByValue=new RangeMap(this.colorMapByValue)}}this.initTarget()},getRegion:function(el,x,y){return Math.floor(x/this.totalBarWidth)},getCurrentRegionFields:function(){var currentRegion=this.currentRegion;return{isNull:this.values[currentRegion]===undefined,value:this.values[currentRegion],color:this.calcColor(this.values[currentRegion],currentRegion),offset:currentRegion}},calcColor:function(value,valuenum){var values=this.values,options=this.options,colorMapByIndex=this.colorMapByIndex,colorMapByValue=this.colorMapByValue,color,newColor;if(colorMapByValue&&(newColor=colorMapByValue.get(value))){color=newColor}else if(colorMapByIndex&&colorMapByIndex.length>valuenum){color=colorMapByIndex[valuenum]}else if(values[valuenum]<0){color=options.get(\"negBarColor\")}else if(values[valuenum]>0){color=options.get(\"posBarColor\")}else{color=options.get(\"zeroBarColor\")}return color},renderRegion:function(valuenum,highlight){var values=this.values,options=this.options,target=this.target,canvasHeight,height,halfHeight,x,y,color;canvasHeight=target.pixelHeight;halfHeight=Math.round(canvasHeight/2);x=valuenum*this.totalBarWidth;if(values[valuenum]<0){y=halfHeight;height=halfHeight-1}else if(values[valuenum]>0){y=0;height=halfHeight-1}else{y=halfHeight-1;height=2}color=this.calcColor(values[valuenum],valuenum);if(color===null){return}if(highlight){color=this.calcHighlightColor(color,options)}return target.drawRect(x,y,this.barWidth-1,height-1,color,color)}});$.fn.sparkline.discrete=discrete=createClass($.fn.sparkline._base,barHighlightMixin,{type:\"discrete\",init:function(el,values,options,width,height){discrete._super.init.call(this,el,values,options,width,height);this.regionShapes={};this.values=values=$.map(values,Number);this.min=Math.min.apply(Math,values);this.max=Math.max.apply(Math,values);this.range=this.max-this.min;this.width=width=options.get(\"width\")===\"auto\"?values.length*2:this.width;this.interval=Math.floor(width/values.length);this.itemWidth=width/values.length;if(options.get(\"chartRangeMin\")!==undefined&&(options.get(\"chartRangeClip\")||options.get(\"chartRangeMin\")<this.min)){this.min=options.get(\"chartRangeMin\")}if(options.get(\"chartRangeMax\")!==undefined&&(options.get(\"chartRangeClip\")||options.get(\"chartRangeMax\")>this.max)){this.max=options.get(\"chartRangeMax\")}this.initTarget();if(this.target){this.lineHeight=options.get(\"lineHeight\")===\"auto\"?Math.round(this.canvasHeight*.3):options.get(\"lineHeight\")}},getRegion:function(el,x,y){return Math.floor(x/this.itemWidth)},getCurrentRegionFields:function(){var currentRegion=this.currentRegion;return{isNull:this.values[currentRegion]===undefined,value:this.values[currentRegion],offset:currentRegion}},renderRegion:function(valuenum,highlight){var values=this.values,options=this.options,min=this.min,max=this.max,range=this.range,interval=this.interval,target=this.target,canvasHeight=this.canvasHeight,lineHeight=this.lineHeight,pheight=canvasHeight-lineHeight,ytop,val,color,x;val=clipval(values[valuenum],min,max);x=valuenum*interval;ytop=Math.round(pheight-pheight*((val-min)/range));color=options.get(\"thresholdColor\")&&val<options.get(\"thresholdValue\")?options.get(\"thresholdColor\"):options.get(\"lineColor\");if(highlight){color=this.calcHighlightColor(color,options)}return target.drawLine(x,ytop,x,ytop+lineHeight,color)}});$.fn.sparkline.bullet=bullet=createClass($.fn.sparkline._base,{type:\"bullet\",init:function(el,values,options,width,height){var min,max,vals;bullet._super.init.call(this,el,values,options,width,height);this.values=values=normalizeValues(values);vals=values.slice();vals[0]=vals[0]===null?vals[2]:vals[0];vals[1]=values[1]===null?vals[2]:vals[1];min=Math.min.apply(Math,values);max=Math.max.apply(Math,values);if(options.get(\"base\")===undefined){min=min<0?min:0}else{min=options.get(\"base\")}this.min=min;this.max=max;this.range=max-min;this.shapes={};this.valueShapes={};this.regiondata={};this.width=width=options.get(\"width\")===\"auto\"?\"4.0em\":width;this.target=this.$el.simpledraw(width,height,options.get(\"composite\"));if(!values.length){this.disabled=true}this.initTarget()},getRegion:function(el,x,y){var shapeid=this.target.getShapeAt(el,x,y);return shapeid!==undefined&&this.shapes[shapeid]!==undefined?this.shapes[shapeid]:undefined},getCurrentRegionFields:function(){var currentRegion=this.currentRegion;return{fieldkey:currentRegion.substr(0,1),value:this.values[currentRegion.substr(1)],region:currentRegion}},changeHighlight:function(highlight){var currentRegion=this.currentRegion,shapeid=this.valueShapes[currentRegion],shape;delete this.shapes[shapeid];switch(currentRegion.substr(0,1)){case\"r\":shape=this.renderRange(currentRegion.substr(1),highlight);break;case\"p\":shape=this.renderPerformance(highlight);break;case\"t\":shape=this.renderTarget(highlight);break}this.valueShapes[currentRegion]=shape.id;this.shapes[shape.id]=currentRegion;this.target.replaceWithShape(shapeid,shape)},renderRange:function(rn,highlight){var rangeval=this.values[rn],rangewidth=Math.round(this.canvasWidth*((rangeval-this.min)/this.range)),color=this.options.get(\"rangeColors\")[rn-2];if(highlight){color=this.calcHighlightColor(color,this.options)}return this.target.drawRect(0,0,rangewidth-1,this.canvasHeight-1,color,color)},renderPerformance:function(highlight){var perfval=this.values[1],perfwidth=Math.round(this.canvasWidth*((perfval-this.min)/this.range)),color=this.options.get(\"performanceColor\");if(highlight){color=this.calcHighlightColor(color,this.options)}return this.target.drawRect(0,Math.round(this.canvasHeight*.3),perfwidth-1,Math.round(this.canvasHeight*.4)-1,color,color)},renderTarget:function(highlight){var targetval=this.values[0],x=Math.round(this.canvasWidth*((targetval-this.min)/this.range)-this.options.get(\"targetWidth\")/2),targettop=Math.round(this.canvasHeight*.1),targetheight=this.canvasHeight-targettop*2,color=this.options.get(\"targetColor\");if(highlight){color=this.calcHighlightColor(color,this.options)}return this.target.drawRect(x,targettop,this.options.get(\"targetWidth\")-1,targetheight-1,color,color)},render:function(){var vlen=this.values.length,target=this.target,i,shape;if(!bullet._super.render.call(this)){return}for(i=2;i<vlen;i++){shape=this.renderRange(i).append();this.shapes[shape.id]=\"r\"+i;this.valueShapes[\"r\"+i]=shape.id}if(this.values[1]!==null){shape=this.renderPerformance().append();this.shapes[shape.id]=\"p1\";this.valueShapes.p1=shape.id}if(this.values[0]!==null){shape=this.renderTarget().append();this.shapes[shape.id]=\"t0\";this.valueShapes.t0=shape.id}target.render()}});$.fn.sparkline.pie=pie=createClass($.fn.sparkline._base,{type:\"pie\",init:function(el,values,options,width,height){var total=0,i;pie._super.init.call(this,el,values,options,width,height);this.shapes={};this.valueShapes={};this.values=values=$.map(values,Number);if(options.get(\"width\")===\"auto\"){this.width=this.height}if(values.length>0){for(i=values.length;i--;){total+=values[i]}}this.total=total;this.initTarget();this.radius=Math.floor(Math.min(this.canvasWidth,this.canvasHeight)/2)},getRegion:function(el,x,y){var shapeid=this.target.getShapeAt(el,x,y);return shapeid!==undefined&&this.shapes[shapeid]!==undefined?this.shapes[shapeid]:undefined},getCurrentRegionFields:function(){var currentRegion=this.currentRegion;return{isNull:this.values[currentRegion]===undefined,value:this.values[currentRegion],percent:this.values[currentRegion]/this.total*100,color:this.options.get(\"sliceColors\")[currentRegion%this.options.get(\"sliceColors\").length],offset:currentRegion}},changeHighlight:function(highlight){var currentRegion=this.currentRegion,newslice=this.renderSlice(currentRegion,highlight),shapeid=this.valueShapes[currentRegion];delete this.shapes[shapeid];this.target.replaceWithShape(shapeid,newslice);this.valueShapes[currentRegion]=newslice.id;this.shapes[newslice.id]=currentRegion},renderSlice:function(valuenum,highlight){var target=this.target,options=this.options,radius=this.radius,borderWidth=options.get(\"borderWidth\"),offset=options.get(\"offset\"),circle=2*Math.PI,values=this.values,total=this.total,next=offset?2*Math.PI*(offset/360):0,start,end,i,vlen,color;vlen=values.length;for(i=0;i<vlen;i++){start=next;end=next;if(total>0){end=next+circle*(values[i]/total)}if(valuenum===i){color=options.get(\"sliceColors\")[i%options.get(\"sliceColors\").length];if(highlight){color=this.calcHighlightColor(color,options)}return target.drawPieSlice(radius,radius,radius-borderWidth,start,end,undefined,color)}next=end}},render:function(){var target=this.target,values=this.values,options=this.options,radius=this.radius,borderWidth=options.get(\"borderWidth\"),donutWidth=options.get(\"donutWidth\"),shape,i;if(!pie._super.render.call(this)){return}if(borderWidth){target.drawCircle(radius,radius,Math.floor(radius-borderWidth/2),options.get(\"borderColor\"),undefined,borderWidth).append()}for(i=values.length;i--;){if(values[i]){shape=this.renderSlice(i).append();this.valueShapes[i]=shape.id;this.shapes[shape.id]=i}}if(donutWidth){target.drawCircle(radius,radius,radius-donutWidth,options.get(\"donutColor\"),options.get(\"donutColor\"),0).append()}target.render()}});$.fn.sparkline.box=box=createClass($.fn.sparkline._base,{type:\"box\",init:function(el,values,options,width,height){box._super.init.call(this,el,values,options,width,height);this.values=$.map(values,Number);this.width=options.get(\"width\")===\"auto\"?\"4.0em\":width;this.initTarget();if(!this.values.length){this.disabled=1}},getRegion:function(){return 1},getCurrentRegionFields:function(){var result=[{field:\"lq\",value:this.quartiles[0]},{field:\"med\",value:this.quartiles[1]},{field:\"uq\",value:this.quartiles[2]}];if(this.loutlier!==undefined){result.push({field:\"lo\",value:this.loutlier})}if(this.routlier!==undefined){result.push({field:\"ro\",value:this.routlier})}if(this.lwhisker!==undefined){result.push({field:\"lw\",value:this.lwhisker})}if(this.rwhisker!==undefined){result.push({field:\"rw\",value:this.rwhisker})}return result},render:function(){var target=this.target,values=this.values,vlen=values.length,options=this.options,canvasWidth=this.canvasWidth,canvasHeight=this.canvasHeight,minValue=options.get(\"chartRangeMin\")===undefined?Math.min.apply(Math,values):options.get(\"chartRangeMin\"),maxValue=options.get(\"chartRangeMax\")===undefined?Math.max.apply(Math,values):options.get(\"chartRangeMax\"),canvasLeft=0,lwhisker,loutlier,iqr,q1,q2,q3,rwhisker,routlier,i,size,unitSize;if(!box._super.render.call(this)){return}if(options.get(\"raw\")){if(options.get(\"showOutliers\")&&values.length>5){loutlier=values[0];lwhisker=values[1];q1=values[2];q2=values[3];q3=values[4];rwhisker=values[5];routlier=values[6]}else{lwhisker=values[0];q1=values[1];q2=values[2];q3=values[3];rwhisker=values[4]}}else{values.sort(function(a,b){return a-b});q1=quartile(values,1);q2=quartile(values,2);q3=quartile(values,3);iqr=q3-q1;if(options.get(\"showOutliers\")){lwhisker=rwhisker=undefined;for(i=0;i<vlen;i++){if(lwhisker===undefined&&values[i]>q1-iqr*options.get(\"outlierIQR\")){lwhisker=values[i]}if(values[i]<q3+iqr*options.get(\"outlierIQR\")){rwhisker=values[i]}}loutlier=values[0];routlier=values[vlen-1]}else{lwhisker=values[0];rwhisker=values[vlen-1]}}this.quartiles=[q1,q2,q3];this.lwhisker=lwhisker;this.rwhisker=rwhisker;this.loutlier=loutlier;this.routlier=routlier;unitSize=canvasWidth/(maxValue-minValue+1);if(options.get(\"showOutliers\")){canvasLeft=Math.ceil(options.get(\"spotRadius\"));canvasWidth-=2*Math.ceil(options.get(\"spotRadius\"));unitSize=canvasWidth/(maxValue-minValue+1);if(loutlier<lwhisker){target.drawCircle((loutlier-minValue)*unitSize+canvasLeft,canvasHeight/2,options.get(\"spotRadius\"),options.get(\"outlierLineColor\"),options.get(\"outlierFillColor\")).append()}if(routlier>rwhisker){target.drawCircle((routlier-minValue)*unitSize+canvasLeft,canvasHeight/2,options.get(\"spotRadius\"),options.get(\"outlierLineColor\"),options.get(\"outlierFillColor\")).append()}}target.drawRect(Math.round((q1-minValue)*unitSize+canvasLeft),Math.round(canvasHeight*.1),Math.round((q3-q1)*unitSize),Math.round(canvasHeight*.8),options.get(\"boxLineColor\"),options.get(\"boxFillColor\")).append();target.drawLine(Math.round((lwhisker-minValue)*unitSize+canvasLeft),Math.round(canvasHeight/2),Math.round((q1-minValue)*unitSize+canvasLeft),Math.round(canvasHeight/2),options.get(\"lineColor\")).append();target.drawLine(Math.round((lwhisker-minValue)*unitSize+canvasLeft),Math.round(canvasHeight/4),Math.round((lwhisker-minValue)*unitSize+canvasLeft),Math.round(canvasHeight-canvasHeight/4),options.get(\"whiskerColor\")).append();target.drawLine(Math.round((rwhisker-minValue)*unitSize+canvasLeft),Math.round(canvasHeight/2),Math.round((q3-minValue)*unitSize+canvasLeft),Math.round(canvasHeight/2),options.get(\"lineColor\")).append();target.drawLine(Math.round((rwhisker-minValue)*unitSize+canvasLeft),Math.round(canvasHeight/4),Math.round((rwhisker-minValue)*unitSize+canvasLeft),Math.round(canvasHeight-canvasHeight/4),options.get(\"whiskerColor\")).append();target.drawLine(Math.round((q2-minValue)*unitSize+canvasLeft),Math.round(canvasHeight*.1),Math.round((q2-minValue)*unitSize+canvasLeft),Math.round(canvasHeight*.9),options.get(\"medianColor\")).append();if(options.get(\"target\")){size=Math.ceil(options.get(\"spotRadius\"));target.drawLine(Math.round((options.get(\"target\")-minValue)*unitSize+canvasLeft),Math.round(canvasHeight/2-size),Math.round((options.get(\"target\")-minValue)*unitSize+canvasLeft),Math.round(canvasHeight/2+size),options.get(\"targetColor\")).append();target.drawLine(Math.round((options.get(\"target\")-minValue)*unitSize+canvasLeft-size),Math.round(canvasHeight/2),Math.round((options.get(\"target\")-minValue)*unitSize+canvasLeft+size),Math.round(canvasHeight/2),options.get(\"targetColor\")).append()}target.render()}});VShape=createClass({init:function(target,id,type,args){this.target=target;this.id=id;this.type=type;this.args=args},append:function(){this.target.appendShape(this);return this}});VCanvas_base=createClass({_pxregex:/(\\d+)(px)?\\s*$/i,init:function(width,height,target){if(!width){return}this.width=width;this.height=height;this.target=target;this.lastShapeId=null;if(target[0]){target=target[0]}$.data(target,\"_jqs_vcanvas\",this)},drawLine:function(x1,y1,x2,y2,lineColor,lineWidth){return this.drawShape([[x1,y1],[x2,y2]],lineColor,lineWidth)},drawShape:function(path,lineColor,fillColor,lineWidth){return this._genShape(\"Shape\",[path,lineColor,fillColor,lineWidth])},drawCircle:function(x,y,radius,lineColor,fillColor,lineWidth){return this._genShape(\"Circle\",[x,y,radius,lineColor,fillColor,lineWidth])},drawPieSlice:function(x,y,radius,startAngle,endAngle,lineColor,fillColor){return this._genShape(\"PieSlice\",[x,y,radius,startAngle,endAngle,lineColor,fillColor])},drawRect:function(x,y,width,height,lineColor,fillColor){return this._genShape(\"Rect\",[x,y,width,height,lineColor,fillColor])},getElement:function(){return this.canvas},getLastShapeId:function(){return this.lastShapeId},reset:function(){alert(\"reset not implemented\")},_insert:function(el,target){$(target).html(el)},_calculatePixelDims:function(width,height,canvas){var match;match=this._pxregex.exec(height);if(match){this.pixelHeight=match[1]}else{this.pixelHeight=$(canvas).height()}match=this._pxregex.exec(width);if(match){this.pixelWidth=match[1]}else{this.pixelWidth=$(canvas).width()}},_genShape:function(shapetype,shapeargs){var id=shapeCount++;shapeargs.unshift(id);return new VShape(this,id,shapetype,shapeargs)},appendShape:function(shape){alert(\"appendShape not implemented\")},replaceWithShape:function(shapeid,shape){alert(\"replaceWithShape not implemented\")},insertAfterShape:function(shapeid,shape){alert(\"insertAfterShape not implemented\")},removeShapeId:function(shapeid){alert(\"removeShapeId not implemented\")},getShapeAt:function(el,x,y){alert(\"getShapeAt not implemented\")},render:function(){alert(\"render not implemented\")}});VCanvas_canvas=createClass(VCanvas_base,{init:function(width,height,target,interact){VCanvas_canvas._super.init.call(this,width,height,target);this.canvas=document.createElement(\"canvas\");if(target[0]){target=target[0]}$.data(target,\"_jqs_vcanvas\",this);$(this.canvas).css({display:\"inline-block\",width:width,height:height,verticalAlign:\"top\"});this._insert(this.canvas,target);this._calculatePixelDims(width,height,this.canvas);this.canvas.width=this.pixelWidth;this.canvas.height=this.pixelHeight;this.interact=interact;this.shapes={};this.shapeseq=[];this.currentTargetShapeId=undefined;$(this.canvas).css({width:this.pixelWidth,height:this.pixelHeight})},_getContext:function(lineColor,fillColor,lineWidth){var context=this.canvas.getContext(\"2d\");if(lineColor!==undefined){context.strokeStyle=lineColor}context.lineWidth=lineWidth===undefined?1:lineWidth;if(fillColor!==undefined){context.fillStyle=fillColor}return context},reset:function(){var context=this._getContext();context.clearRect(0,0,this.pixelWidth,this.pixelHeight);this.shapes={};this.shapeseq=[];this.currentTargetShapeId=undefined},_drawShape:function(shapeid,path,lineColor,fillColor,lineWidth){var context=this._getContext(lineColor,fillColor,lineWidth),i,plen;context.beginPath();context.moveTo(path[0][0]+.5,path[0][1]+.5);for(i=1,plen=path.length;i<plen;i++){context.lineTo(path[i][0]+.5,path[i][1]+.5)}if(lineColor!==undefined){context.stroke()}if(fillColor!==undefined){context.fill()}if(this.targetX!==undefined&&this.targetY!==undefined&&context.isPointInPath(this.targetX,this.targetY)){this.currentTargetShapeId=shapeid}},_drawCircle:function(shapeid,x,y,radius,lineColor,fillColor,lineWidth){var context=this._getContext(lineColor,fillColor,lineWidth);context.beginPath();context.arc(x,y,radius,0,2*Math.PI,false);if(this.targetX!==undefined&&this.targetY!==undefined&&context.isPointInPath(this.targetX,this.targetY)){this.currentTargetShapeId=shapeid}if(lineColor!==undefined){context.stroke()}if(fillColor!==undefined){context.fill()}},_drawPieSlice:function(shapeid,x,y,radius,startAngle,endAngle,lineColor,fillColor){var context=this._getContext(lineColor,fillColor);context.beginPath();context.moveTo(x,y);context.arc(x,y,radius,startAngle,endAngle,false);context.lineTo(x,y);context.closePath();if(lineColor!==undefined){context.stroke()}if(fillColor){context.fill()}if(this.targetX!==undefined&&this.targetY!==undefined&&context.isPointInPath(this.targetX,this.targetY)){this.currentTargetShapeId=shapeid}},_drawRect:function(shapeid,x,y,width,height,lineColor,fillColor){return this._drawShape(shapeid,[[x,y],[x+width,y],[x+width,y+height],[x,y+height],[x,y]],lineColor,fillColor)},appendShape:function(shape){this.shapes[shape.id]=shape;this.shapeseq.push(shape.id);this.lastShapeId=shape.id;return shape.id},replaceWithShape:function(shapeid,shape){var shapeseq=this.shapeseq,i;this.shapes[shape.id]=shape;for(i=shapeseq.length;i--;){if(shapeseq[i]==shapeid){shapeseq[i]=shape.id}}delete this.shapes[shapeid]},replaceWithShapes:function(shapeids,shapes){var shapeseq=this.shapeseq,shapemap={},sid,i,first;for(i=shapeids.length;i--;){shapemap[shapeids[i]]=true}for(i=shapeseq.length;i--;){sid=shapeseq[i];if(shapemap[sid]){shapeseq.splice(i,1);delete this.shapes[sid];first=i}}for(i=shapes.length;i--;){shapeseq.splice(first,0,shapes[i].id);this.shapes[shapes[i].id]=shapes[i]}},insertAfterShape:function(shapeid,shape){var shapeseq=this.shapeseq,i;for(i=shapeseq.length;i--;){if(shapeseq[i]===shapeid){shapeseq.splice(i+1,0,shape.id);this.shapes[shape.id]=shape;return}}},removeShapeId:function(shapeid){var shapeseq=this.shapeseq,i;for(i=shapeseq.length;i--;){if(shapeseq[i]===shapeid){shapeseq.splice(i,1);break}}delete this.shapes[shapeid]},getShapeAt:function(el,x,y){this.targetX=x;this.targetY=y;this.render();return this.currentTargetShapeId},render:function(){var shapeseq=this.shapeseq,shapes=this.shapes,shapeCount=shapeseq.length,context=this._getContext(),shapeid,shape,i;context.clearRect(0,0,this.pixelWidth,this.pixelHeight);for(i=0;i<shapeCount;i++){shapeid=shapeseq[i];shape=shapes[shapeid];this[\"_draw\"+shape.type].apply(this,shape.args)}if(!this.interact){this.shapes={};this.shapeseq=[]}}});VCanvas_vml=createClass(VCanvas_base,{init:function(width,height,target){var groupel;VCanvas_vml._super.init.call(this,width,height,target);if(target[0]){target=target[0]}$.data(target,\"_jqs_vcanvas\",this);this.canvas=document.createElement(\"span\");$(this.canvas).css({display:\"inline-block\",position:\"relative\",overflow:\"hidden\",width:width,height:height,margin:\"0px\",padding:\"0px\",verticalAlign:\"top\"});this._insert(this.canvas,target);this._calculatePixelDims(width,height,this.canvas);this.canvas.width=this.pixelWidth;this.canvas.height=this.pixelHeight;groupel='<v:group coordorigin=\"0 0\" coordsize=\"'+this.pixelWidth+\" \"+this.pixelHeight+'\"'+' style=\"position:absolute;top:0;left:0;width:'+this.pixelWidth+\"px;height=\"+this.pixelHeight+'px;\"></v:group>';this.canvas.insertAdjacentHTML(\"beforeEnd\",groupel);this.group=$(this.canvas).children()[0];this.rendered=false;this.prerender=\"\"},_drawShape:function(shapeid,path,lineColor,fillColor,lineWidth){var vpath=[],initial,stroke,fill,closed,vel,plen,i;for(i=0,plen=path.length;i<plen;i++){vpath[i]=\"\"+path[i][0]+\",\"+path[i][1]}initial=vpath.splice(0,1);lineWidth=lineWidth===undefined?1:lineWidth;stroke=lineColor===undefined?' stroked=\"false\" ':' strokeWeight=\"'+lineWidth+'px\" strokeColor=\"'+lineColor+'\" ';fill=fillColor===undefined?' filled=\"false\"':' fillColor=\"'+fillColor+'\" filled=\"true\" ';closed=vpath[0]===vpath[vpath.length-1]?\"x \":\"\";vel='<v:shape coordorigin=\"0 0\" coordsize=\"'+this.pixelWidth+\" \"+this.pixelHeight+'\" '+' id=\"jqsshape'+shapeid+'\" '+stroke+fill+' style=\"position:absolute;left:0px;top:0px;height:'+this.pixelHeight+\"px;width:\"+this.pixelWidth+'px;padding:0px;margin:0px;\" '+' path=\"m '+initial+\" l \"+vpath.join(\", \")+\" \"+closed+'e\">'+\" </v:shape>\";return vel},_drawCircle:function(shapeid,x,y,radius,lineColor,fillColor,lineWidth){var stroke,fill,vel;x-=radius;y-=radius;stroke=lineColor===undefined?' stroked=\"false\" ':' strokeWeight=\"'+lineWidth+'px\" strokeColor=\"'+lineColor+'\" ';fill=fillColor===undefined?' filled=\"false\"':' fillColor=\"'+fillColor+'\" filled=\"true\" ';vel=\"<v:oval \"+' id=\"jqsshape'+shapeid+'\" '+stroke+fill+' style=\"position:absolute;top:'+y+\"px; left:\"+x+\"px; width:\"+radius*2+\"px; height:\"+radius*2+'px\"></v:oval>';return vel},_drawPieSlice:function(shapeid,x,y,radius,startAngle,endAngle,lineColor,fillColor){var vpath,startx,starty,endx,endy,stroke,fill,vel;if(startAngle===endAngle){return\"\"}if(endAngle-startAngle===2*Math.PI){startAngle=0;endAngle=2*Math.PI}startx=x+Math.round(Math.cos(startAngle)*radius);starty=y+Math.round(Math.sin(startAngle)*radius);endx=x+Math.round(Math.cos(endAngle)*radius);endy=y+Math.round(Math.sin(endAngle)*radius);if(startx===endx&&starty===endy){if(endAngle-startAngle<Math.PI){return\"\"}startx=endx=x+radius;starty=endy=y}if(startx===endx&&starty===endy&&endAngle-startAngle<Math.PI){return\"\"}vpath=[x-radius,y-radius,x+radius,y+radius,startx,starty,endx,endy];stroke=lineColor===undefined?' stroked=\"false\" ':' strokeWeight=\"1px\" strokeColor=\"'+lineColor+'\" ';fill=fillColor===undefined?' filled=\"false\"':' fillColor=\"'+fillColor+'\" filled=\"true\" ';vel='<v:shape coordorigin=\"0 0\" coordsize=\"'+this.pixelWidth+\" \"+this.pixelHeight+'\" '+' id=\"jqsshape'+shapeid+'\" '+stroke+fill+' style=\"position:absolute;left:0px;top:0px;height:'+this.pixelHeight+\"px;width:\"+this.pixelWidth+'px;padding:0px;margin:0px;\" '+' path=\"m '+x+\",\"+y+\" wa \"+vpath.join(\", \")+' x e\">'+\" </v:shape>\";return vel},_drawRect:function(shapeid,x,y,width,height,lineColor,fillColor){return this._drawShape(shapeid,[[x,y],[x,y+height],[x+width,y+height],[x+width,y],[x,y]],lineColor,fillColor)},reset:function(){this.group.innerHTML=\"\"},appendShape:function(shape){var vel=this[\"_draw\"+shape.type].apply(this,shape.args);if(this.rendered){this.group.insertAdjacentHTML(\"beforeEnd\",vel)}else{this.prerender+=vel}this.lastShapeId=shape.id;return shape.id},replaceWithShape:function(shapeid,shape){var existing=$(\"#jqsshape\"+shapeid),vel=this[\"_draw\"+shape.type].apply(this,shape.args);existing[0].outerHTML=vel},replaceWithShapes:function(shapeids,shapes){var existing=$(\"#jqsshape\"+shapeids[0]),replace=\"\",slen=shapes.length,i;for(i=0;i<slen;i++){replace+=this[\"_draw\"+shapes[i].type].apply(this,shapes[i].args)}existing[0].outerHTML=replace;for(i=1;i<shapeids.length;i++){$(\"#jqsshape\"+shapeids[i]).remove()}},insertAfterShape:function(shapeid,shape){var existing=$(\"#jqsshape\"+shapeid),vel=this[\"_draw\"+shape.type].apply(this,shape.args);existing[0].insertAdjacentHTML(\"afterEnd\",vel)},removeShapeId:function(shapeid){var existing=$(\"#jqsshape\"+shapeid);this.group.removeChild(existing[0])},getShapeAt:function(el,x,y){var shapeid=el.id.substr(8);return shapeid},render:function(){if(!this.rendered){this.group.innerHTML=this.prerender;this.rendered=true}}})})})(document,Math);\n","/*!\r\n * jQuery blockUI plugin\r\n * Version 2.70.0-2014.11.23\r\n * Requires jQuery v1.7 or later\r\n *\r\n * Examples at: http://malsup.com/jquery/block/\r\n * Copyright (c) 2007-2013 M. Alsup\r\n * Dual licensed under the MIT and GPL licenses:\r\n * http://www.opensource.org/licenses/mit-license.php\r\n * http://www.gnu.org/licenses/gpl.html\r\n *\r\n * Thanks to Amir-Hossein Sobhi for some excellent contributions!\r\n */\r\n\r\n;(function() {\r\n/*jshint eqeqeq:false curly:false latedef:false */\r\n\"use strict\";\r\n\r\n\tfunction setup($) {\r\n\t\t$.fn._fadeIn = $.fn.fadeIn;\r\n\r\n\t\tvar noOp = $.noop || function() {};\r\n\r\n\t\t// this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle\r\n\t\t// confusing userAgent strings on Vista)\r\n\t\tvar msie = /MSIE/.test(navigator.userAgent);\r\n\t\tvar ie6  = /MSIE 6.0/.test(navigator.userAgent) && ! /MSIE 8.0/.test(navigator.userAgent);\r\n\t\tvar mode = document.documentMode || 0;\r\n\t\tvar setExpr = $.isFunction( document.createElement('div').style.setExpression );\r\n\r\n\t\t// global $ methods for blocking/unblocking the entire page\r\n\t\t$.blockUI   = function(opts) { install(window, opts); };\r\n\t\t$.unblockUI = function(opts) { remove(window, opts); };\r\n\r\n\t\t// convenience method for quick growl-like notifications  (http://www.google.com/search?q=growl)\r\n\t\t$.growlUI = function(title, message, timeout, onClose) {\r\n\t\t\tvar $m = $('<div class=\"growlUI\"></div>');\r\n\t\t\tif (title) $m.append('<h1>'+title+'</h1>');\r\n\t\t\tif (message) $m.append('<h2>'+message+'</h2>');\r\n\t\t\tif (timeout === undefined) timeout = 3000;\r\n\r\n\t\t\t// Added by konapun: Set timeout to 30 seconds if this growl is moused over, like normal toast notifications\r\n\t\t\tvar callBlock = function(opts) {\r\n\t\t\t\topts = opts || {};\r\n\r\n\t\t\t\t$.blockUI({\r\n\t\t\t\t\tmessage: $m,\r\n\t\t\t\t\tfadeIn : typeof opts.fadeIn  !== 'undefined' ? opts.fadeIn  : 700,\r\n\t\t\t\t\tfadeOut: typeof opts.fadeOut !== 'undefined' ? opts.fadeOut : 1000,\r\n\t\t\t\t\ttimeout: typeof opts.timeout !== 'undefined' ? opts.timeout : timeout,\r\n\t\t\t\t\tcenterY: false,\r\n\t\t\t\t\tshowOverlay: false,\r\n\t\t\t\t\tonUnblock: onClose,\r\n\t\t\t\t\tcss: $.blockUI.defaults.growlCSS\r\n\t\t\t\t});\r\n\t\t\t};\r\n\r\n\t\t\tcallBlock();\r\n\t\t\tvar nonmousedOpacity = $m.css('opacity');\r\n\t\t\t$m.mouseover(function() {\r\n\t\t\t\tcallBlock({\r\n\t\t\t\t\tfadeIn: 0,\r\n\t\t\t\t\ttimeout: 30000\r\n\t\t\t\t});\r\n\r\n\t\t\t\tvar displayBlock = $('.blockMsg');\r\n\t\t\t\tdisplayBlock.stop(); // cancel fadeout if it has started\r\n\t\t\t\tdisplayBlock.fadeTo(300, 1); // make it easier to read the message by removing transparency\r\n\t\t\t}).mouseout(function() {\r\n\t\t\t\t$('.blockMsg').fadeOut(1000);\r\n\t\t\t});\r\n\t\t\t// End konapun additions\r\n\t\t};\r\n\r\n\t\t// plugin method for blocking element content\r\n\t\t$.fn.block = function(opts) {\r\n\t\t\tif ( this[0] === window ) {\r\n\t\t\t\t$.blockUI( opts );\r\n\t\t\t\treturn this;\r\n\t\t\t}\r\n\t\t\tvar fullOpts = $.extend({}, $.blockUI.defaults, opts || {});\r\n\t\t\tthis.each(function() {\r\n\t\t\t\tvar $el = $(this);\r\n\t\t\t\tif (fullOpts.ignoreIfBlocked && $el.data('blockUI.isBlocked'))\r\n\t\t\t\t\treturn;\r\n\t\t\t\t$el.unblock({ fadeOut: 0 });\r\n\t\t\t});\r\n\r\n\t\t\treturn this.each(function() {\r\n\t\t\t\tif ($.css(this,'position') == 'static') {\r\n\t\t\t\t\tthis.style.position = 'relative';\r\n\t\t\t\t\t$(this).data('blockUI.static', true);\r\n\t\t\t\t}\r\n\t\t\t\tthis.style.zoom = 1; // force 'hasLayout' in ie\r\n\t\t\t\tinstall(this, opts);\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\t// plugin method for unblocking element content\r\n\t\t$.fn.unblock = function(opts) {\r\n\t\t\tif ( this[0] === window ) {\r\n\t\t\t\t$.unblockUI( opts );\r\n\t\t\t\treturn this;\r\n\t\t\t}\r\n\t\t\treturn this.each(function() {\r\n\t\t\t\tremove(this, opts);\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\t$.blockUI.version = 2.70; // 2nd generation blocking at no extra cost!\r\n\r\n\t\t// override these in your code to change the default behavior and style\r\n\t\t$.blockUI.defaults = {\r\n\t\t\t// message displayed when blocking (use null for no message)\r\n\t\t\tmessage:  '<h1>Please wait...</h1>',\r\n\r\n\t\t\ttitle: null,\t\t// title string; only used when theme == true\r\n\t\t\tdraggable: true,\t// only used when theme == true (requires jquery-ui.js to be loaded)\r\n\r\n\t\t\ttheme: false, // set to true to use with jQuery UI themes\r\n\r\n\t\t\t// styles for the message when blocking; if you wish to disable\r\n\t\t\t// these and use an external stylesheet then do this in your code:\r\n\t\t\t// $.blockUI.defaults.css = {};\r\n\t\t\tcss: {\r\n\t\t\t\tpadding:\t0,\r\n\t\t\t\tmargin:\t\t0,\r\n\t\t\t\twidth:\t\t'30%',\r\n\t\t\t\ttop:\t\t'40%',\r\n\t\t\t\tleft:\t\t'35%',\r\n\t\t\t\ttextAlign:\t'center',\r\n\t\t\t\tcolor:\t\t'#000',\r\n\t\t\t\tborder:\t\t'3px solid #aaa',\r\n\t\t\t\tbackgroundColor:'#fff',\r\n\t\t\t\tcursor:\t\t'wait'\r\n\t\t\t},\r\n\r\n\t\t\t// minimal style set used when themes are used\r\n\t\t\tthemedCSS: {\r\n\t\t\t\twidth:\t'30%',\r\n\t\t\t\ttop:\t'40%',\r\n\t\t\t\tleft:\t'35%'\r\n\t\t\t},\r\n\r\n\t\t\t// styles for the overlay\r\n\t\t\toverlayCSS:  {\r\n\t\t\t\tbackgroundColor:\t'#000',\r\n\t\t\t\topacity:\t\t\t0.6,\r\n\t\t\t\tcursor:\t\t\t\t'wait'\r\n\t\t\t},\r\n\r\n\t\t\t// style to replace wait cursor before unblocking to correct issue\r\n\t\t\t// of lingering wait cursor\r\n\t\t\tcursorReset: 'default',\r\n\r\n\t\t\t// styles applied when using $.growlUI\r\n\t\t\tgrowlCSS: {\r\n\t\t\t\twidth:\t\t'350px',\r\n\t\t\t\ttop:\t\t'10px',\r\n\t\t\t\tleft:\t\t'',\r\n\t\t\t\tright:\t\t'10px',\r\n\t\t\t\tborder:\t\t'none',\r\n\t\t\t\tpadding:\t'5px',\r\n\t\t\t\topacity:\t0.6,\r\n\t\t\t\tcursor:\t\t'default',\r\n\t\t\t\tcolor:\t\t'#fff',\r\n\t\t\t\tbackgroundColor: '#000',\r\n\t\t\t\t'-webkit-border-radius':'10px',\r\n\t\t\t\t'-moz-border-radius':\t'10px',\r\n\t\t\t\t'border-radius':\t\t'10px'\r\n\t\t\t},\r\n\r\n\t\t\t// IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w\r\n\t\t\t// (hat tip to Jorge H. N. de Vasconcelos)\r\n\t\t\t/*jshint scripturl:true */\r\n\t\t\tiframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank',\r\n\r\n\t\t\t// force usage of iframe in non-IE browsers (handy for blocking applets)\r\n\t\t\tforceIframe: false,\r\n\r\n\t\t\t// z-index for the blocking overlay\r\n\t\t\tbaseZ: 1000,\r\n\r\n\t\t\t// set these to true to have the message automatically centered\r\n\t\t\tcenterX: true, // <-- only effects element blocking (page block controlled via css above)\r\n\t\t\tcenterY: true,\r\n\r\n\t\t\t// allow body element to be stetched in ie6; this makes blocking look better\r\n\t\t\t// on \"short\" pages.  disable if you wish to prevent changes to the body height\r\n\t\t\tallowBodyStretch: true,\r\n\r\n\t\t\t// enable if you want key and mouse events to be disabled for content that is blocked\r\n\t\t\tbindEvents: true,\r\n\r\n\t\t\t// be default blockUI will supress tab navigation from leaving blocking content\r\n\t\t\t// (if bindEvents is true)\r\n\t\t\tconstrainTabKey: true,\r\n\r\n\t\t\t// fadeIn time in millis; set to 0 to disable fadeIn on block\r\n\t\t\tfadeIn:  200,\r\n\r\n\t\t\t// fadeOut time in millis; set to 0 to disable fadeOut on unblock\r\n\t\t\tfadeOut:  400,\r\n\r\n\t\t\t// time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock\r\n\t\t\ttimeout: 0,\r\n\r\n\t\t\t// disable if you don't want to show the overlay\r\n\t\t\tshowOverlay: true,\r\n\r\n\t\t\t// if true, focus will be placed in the first available input field when\r\n\t\t\t// page blocking\r\n\t\t\tfocusInput: true,\r\n\r\n            // elements that can receive focus\r\n            focusableElements: ':input:enabled:visible',\r\n\r\n\t\t\t// suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity)\r\n\t\t\t// no longer needed in 2012\r\n\t\t\t// applyPlatformOpacityRules: true,\r\n\r\n\t\t\t// callback method invoked when fadeIn has completed and blocking message is visible\r\n\t\t\tonBlock: null,\r\n\r\n\t\t\t// callback method invoked when unblocking has completed; the callback is\r\n\t\t\t// passed the element that has been unblocked (which is the window object for page\r\n\t\t\t// blocks) and the options that were passed to the unblock call:\r\n\t\t\t//\tonUnblock(element, options)\r\n\t\t\tonUnblock: null,\r\n\r\n\t\t\t// callback method invoked when the overlay area is clicked.\r\n\t\t\t// setting this will turn the cursor to a pointer, otherwise cursor defined in overlayCss will be used.\r\n\t\t\tonOverlayClick: null,\r\n\r\n\t\t\t// don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493\r\n\t\t\tquirksmodeOffsetHack: 4,\r\n\r\n\t\t\t// class name of the message block\r\n\t\t\tblockMsgClass: 'blockMsg',\r\n\r\n\t\t\t// if it is already blocked, then ignore it (don't unblock and reblock)\r\n\t\t\tignoreIfBlocked: false\r\n\t\t};\r\n\r\n\t\t// private data and functions follow...\r\n\r\n\t\tvar pageBlock = null;\r\n\t\tvar pageBlockEls = [];\r\n\r\n\t\tfunction install(el, opts) {\r\n\t\t\tvar css, themedCSS;\r\n\t\t\tvar full = (el == window);\r\n\t\t\tvar msg = (opts && opts.message !== undefined ? opts.message : undefined);\r\n\t\t\topts = $.extend({}, $.blockUI.defaults, opts || {});\r\n\r\n\t\t\tif (opts.ignoreIfBlocked && $(el).data('blockUI.isBlocked'))\r\n\t\t\t\treturn;\r\n\r\n\t\t\topts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {});\r\n\t\t\tcss = $.extend({}, $.blockUI.defaults.css, opts.css || {});\r\n\t\t\tif (opts.onOverlayClick)\r\n\t\t\t\topts.overlayCSS.cursor = 'pointer';\r\n\r\n\t\t\tthemedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {});\r\n\t\t\tmsg = msg === undefined ? opts.message : msg;\r\n\r\n\t\t\t// remove the current block (if there is one)\r\n\t\t\tif (full && pageBlock)\r\n\t\t\t\tremove(window, {fadeOut:0});\r\n\r\n\t\t\t// if an existing element is being used as the blocking content then we capture\r\n\t\t\t// its current place in the DOM (and current display style) so we can restore\r\n\t\t\t// it when we unblock\r\n\t\t\tif (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) {\r\n\t\t\t\tvar node = msg.jquery ? msg[0] : msg;\r\n\t\t\t\tvar data = {};\r\n\t\t\t\t$(el).data('blockUI.history', data);\r\n\t\t\t\tdata.el = node;\r\n\t\t\t\tdata.parent = node.parentNode;\r\n\t\t\t\tdata.display = node.style.display;\r\n\t\t\t\tdata.position = node.style.position;\r\n\t\t\t\tif (data.parent)\r\n\t\t\t\t\tdata.parent.removeChild(node);\r\n\t\t\t}\r\n\r\n\t\t\t$(el).data('blockUI.onUnblock', opts.onUnblock);\r\n\t\t\tvar z = opts.baseZ;\r\n\r\n\t\t\t// blockUI uses 3 layers for blocking, for simplicity they are all used on every platform;\r\n\t\t\t// layer1 is the iframe layer which is used to supress bleed through of underlying content\r\n\t\t\t// layer2 is the overlay layer which has opacity and a wait cursor (by default)\r\n\t\t\t// layer3 is the message content that is displayed while blocking\r\n\t\t\tvar lyr1, lyr2, lyr3, s;\r\n\t\t\tif (msie || opts.forceIframe)\r\n\t\t\t\tlyr1 = $('<iframe class=\"blockUI\" style=\"z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0\" src=\"'+opts.iframeSrc+'\"></iframe>');\r\n\t\t\telse\r\n\t\t\t\tlyr1 = $('<div class=\"blockUI\" style=\"display:none\"></div>');\r\n\r\n\t\t\tif (opts.theme)\r\n\t\t\t\tlyr2 = $('<div class=\"blockUI blockOverlay ui-widget-overlay\" style=\"z-index:'+ (z++) +';display:none\"></div>');\r\n\t\t\telse\r\n\t\t\t\tlyr2 = $('<div class=\"blockUI blockOverlay\" style=\"z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;width:100%;height:100%;top:0;left:0\"></div>');\r\n\r\n\t\t\tif (opts.theme && full) {\r\n\t\t\t\ts = '<div class=\"blockUI ' + opts.blockMsgClass + ' blockPage ui-dialog ui-widget ui-corner-all\" style=\"z-index:'+(z+10)+';display:none;position:fixed\">';\r\n\t\t\t\tif ( opts.title ) {\r\n\t\t\t\t\ts += '<div class=\"ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle\">'+(opts.title || '&nbsp;')+'</div>';\r\n\t\t\t\t}\r\n\t\t\t\ts += '<div class=\"ui-widget-content ui-dialog-content\"></div>';\r\n\t\t\t\ts += '</div>';\r\n\t\t\t}\r\n\t\t\telse if (opts.theme) {\r\n\t\t\t\ts = '<div class=\"blockUI ' + opts.blockMsgClass + ' blockElement ui-dialog ui-widget ui-corner-all\" style=\"z-index:'+(z+10)+';display:none;position:absolute\">';\r\n\t\t\t\tif ( opts.title ) {\r\n\t\t\t\t\ts += '<div class=\"ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle\">'+(opts.title || '&nbsp;')+'</div>';\r\n\t\t\t\t}\r\n\t\t\t\ts += '<div class=\"ui-widget-content ui-dialog-content\"></div>';\r\n\t\t\t\ts += '</div>';\r\n\t\t\t}\r\n\t\t\telse if (full) {\r\n\t\t\t\ts = '<div class=\"blockUI ' + opts.blockMsgClass + ' blockPage\" style=\"z-index:'+(z+10)+';display:none;position:fixed\"></div>';\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\ts = '<div class=\"blockUI ' + opts.blockMsgClass + ' blockElement\" style=\"z-index:'+(z+10)+';display:none;position:absolute\"></div>';\r\n\t\t\t}\r\n\t\t\tlyr3 = $(s);\r\n\r\n\t\t\t// if we have a message, style it\r\n\t\t\tif (msg) {\r\n\t\t\t\tif (opts.theme) {\r\n\t\t\t\t\tlyr3.css(themedCSS);\r\n\t\t\t\t\tlyr3.addClass('ui-widget-content');\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t\tlyr3.css(css);\r\n\t\t\t}\r\n\r\n\t\t\t// style the overlay\r\n\t\t\tif (!opts.theme /*&& (!opts.applyPlatformOpacityRules)*/)\r\n\t\t\t\tlyr2.css(opts.overlayCSS);\r\n\t\t\tlyr2.css('position', full ? 'fixed' : 'absolute');\r\n\r\n\t\t\t// make iframe layer transparent in IE\r\n\t\t\tif (msie || opts.forceIframe)\r\n\t\t\t\tlyr1.css('opacity',0.0);\r\n\r\n\t\t\t//$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el);\r\n\t\t\tvar layers = [lyr1,lyr2,lyr3], $par = full ? $('body') : $(el);\r\n\t\t\t$.each(layers, function() {\r\n\t\t\t\tthis.appendTo($par);\r\n\t\t\t});\r\n\r\n\t\t\tif (opts.theme && opts.draggable && $.fn.draggable) {\r\n\t\t\t\tlyr3.draggable({\r\n\t\t\t\t\thandle: '.ui-dialog-titlebar',\r\n\t\t\t\t\tcancel: 'li'\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling)\r\n\t\t\tvar expr = setExpr && (!$.support.boxModel || $('object,embed', full ? null : el).length > 0);\r\n\t\t\tif (ie6 || expr) {\r\n\t\t\t\t// give body 100% height\r\n\t\t\t\tif (full && opts.allowBodyStretch && $.support.boxModel)\r\n\t\t\t\t\t$('html,body').css('height','100%');\r\n\r\n\t\t\t\t// fix ie6 issue when blocked element has a border width\r\n\t\t\t\tif ((ie6 || !$.support.boxModel) && !full) {\r\n\t\t\t\t\tvar t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth');\r\n\t\t\t\t\tvar fixT = t ? '(0 - '+t+')' : 0;\r\n\t\t\t\t\tvar fixL = l ? '(0 - '+l+')' : 0;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// simulate fixed position\r\n\t\t\t\t$.each(layers, function(i,o) {\r\n\t\t\t\t\tvar s = o[0].style;\r\n\t\t\t\t\ts.position = 'absolute';\r\n\t\t\t\t\tif (i < 2) {\r\n\t\t\t\t\t\tif (full)\r\n\t\t\t\t\t\t\ts.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:'+opts.quirksmodeOffsetHack+') + \"px\"');\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\ts.setExpression('height','this.parentNode.offsetHeight + \"px\"');\r\n\t\t\t\t\t\tif (full)\r\n\t\t\t\t\t\t\ts.setExpression('width','jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + \"px\"');\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\ts.setExpression('width','this.parentNode.offsetWidth + \"px\"');\r\n\t\t\t\t\t\tif (fixL) s.setExpression('left', fixL);\r\n\t\t\t\t\t\tif (fixT) s.setExpression('top', fixT);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (opts.centerY) {\r\n\t\t\t\t\t\tif (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + \"px\"');\r\n\t\t\t\t\t\ts.marginTop = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (!opts.centerY && full) {\r\n\t\t\t\t\t\tvar top = (opts.css && opts.css.top) ? parseInt(opts.css.top, 10) : 0;\r\n\t\t\t\t\t\tvar expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + \"px\"';\r\n\t\t\t\t\t\ts.setExpression('top',expression);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// show the message\r\n\t\t\tif (msg) {\r\n\t\t\t\tif (opts.theme)\r\n\t\t\t\t\tlyr3.find('.ui-widget-content').append(msg);\r\n\t\t\t\telse\r\n\t\t\t\t\tlyr3.append(msg);\r\n\t\t\t\tif (msg.jquery || msg.nodeType)\r\n\t\t\t\t\t$(msg).show();\r\n\t\t\t}\r\n\r\n\t\t\tif ((msie || opts.forceIframe) && opts.showOverlay)\r\n\t\t\t\tlyr1.show(); // opacity is zero\r\n\t\t\tif (opts.fadeIn) {\r\n\t\t\t\tvar cb = opts.onBlock ? opts.onBlock : noOp;\r\n\t\t\t\tvar cb1 = (opts.showOverlay && !msg) ? cb : noOp;\r\n\t\t\t\tvar cb2 = msg ? cb : noOp;\r\n\t\t\t\tif (opts.showOverlay)\r\n\t\t\t\t\tlyr2._fadeIn(opts.fadeIn, cb1);\r\n\t\t\t\tif (msg)\r\n\t\t\t\t\tlyr3._fadeIn(opts.fadeIn, cb2);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tif (opts.showOverlay)\r\n\t\t\t\t\tlyr2.show();\r\n\t\t\t\tif (msg)\r\n\t\t\t\t\tlyr3.show();\r\n\t\t\t\tif (opts.onBlock)\r\n\t\t\t\t\topts.onBlock.bind(lyr3)();\r\n\t\t\t}\r\n\r\n\t\t\t// bind key and mouse events\r\n\t\t\tbind(1, el, opts);\r\n\r\n\t\t\tif (full) {\r\n\t\t\t\tpageBlock = lyr3[0];\r\n\t\t\t\tpageBlockEls = $(opts.focusableElements,pageBlock);\r\n\t\t\t\tif (opts.focusInput)\r\n\t\t\t\t\tsetTimeout(focus, 20);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t\tcenter(lyr3[0], opts.centerX, opts.centerY);\r\n\r\n\t\t\tif (opts.timeout) {\r\n\t\t\t\t// auto-unblock\r\n\t\t\t\tvar to = setTimeout(function() {\r\n\t\t\t\t\tif (full)\r\n\t\t\t\t\t\t$.unblockUI(opts);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\t$(el).unblock(opts);\r\n\t\t\t\t}, opts.timeout);\r\n\t\t\t\t$(el).data('blockUI.timeout', to);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// remove the block\r\n\t\tfunction remove(el, opts) {\r\n\t\t\tvar count;\r\n\t\t\tvar full = (el == window);\r\n\t\t\tvar $el = $(el);\r\n\t\t\tvar data = $el.data('blockUI.history');\r\n\t\t\tvar to = $el.data('blockUI.timeout');\r\n\t\t\tif (to) {\r\n\t\t\t\tclearTimeout(to);\r\n\t\t\t\t$el.removeData('blockUI.timeout');\r\n\t\t\t}\r\n\t\t\topts = $.extend({}, $.blockUI.defaults, opts || {});\r\n\t\t\tbind(0, el, opts); // unbind events\r\n\r\n\t\t\tif (opts.onUnblock === null) {\r\n\t\t\t\topts.onUnblock = $el.data('blockUI.onUnblock');\r\n\t\t\t\t$el.removeData('blockUI.onUnblock');\r\n\t\t\t}\r\n\r\n\t\t\tvar els;\r\n\t\t\tif (full) // crazy selector to handle odd field errors in ie6/7\r\n\t\t\t\tels = $('body').children().filter('.blockUI').add('body > .blockUI');\r\n\t\t\telse\r\n\t\t\t\tels = $el.find('>.blockUI');\r\n\r\n\t\t\t// fix cursor issue\r\n\t\t\tif ( opts.cursorReset ) {\r\n\t\t\t\tif ( els.length > 1 )\r\n\t\t\t\t\tels[1].style.cursor = opts.cursorReset;\r\n\t\t\t\tif ( els.length > 2 )\r\n\t\t\t\t\tels[2].style.cursor = opts.cursorReset;\r\n\t\t\t}\r\n\r\n\t\t\tif (full)\r\n\t\t\t\tpageBlock = pageBlockEls = null;\r\n\r\n\t\t\tif (opts.fadeOut) {\r\n\t\t\t\tcount = els.length;\r\n\t\t\t\tels.stop().fadeOut(opts.fadeOut, function() {\r\n\t\t\t\t\tif ( --count === 0)\r\n\t\t\t\t\t\treset(els,data,opts,el);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t\treset(els, data, opts, el);\r\n\t\t}\r\n\r\n\t\t// move blocking element back into the DOM where it started\r\n\t\tfunction reset(els,data,opts,el) {\r\n\t\t\tvar $el = $(el);\r\n\t\t\tif ( $el.data('blockUI.isBlocked') )\r\n\t\t\t\treturn;\r\n\r\n\t\t\tels.each(function(i,o) {\r\n\t\t\t\t// remove via DOM calls so we don't lose event handlers\r\n\t\t\t\tif (this.parentNode)\r\n\t\t\t\t\tthis.parentNode.removeChild(this);\r\n\t\t\t});\r\n\r\n\t\t\tif (data && data.el) {\r\n\t\t\t\tdata.el.style.display = data.display;\r\n\t\t\t\tdata.el.style.position = data.position;\r\n\t\t\t\tdata.el.style.cursor = 'default'; // #59\r\n\t\t\t\tif (data.parent)\r\n\t\t\t\t\tdata.parent.appendChild(data.el);\r\n\t\t\t\t$el.removeData('blockUI.history');\r\n\t\t\t}\r\n\r\n\t\t\tif ($el.data('blockUI.static')) {\r\n\t\t\t\t$el.css('position', 'static'); // #22\r\n\t\t\t}\r\n\r\n\t\t\tif (typeof opts.onUnblock == 'function')\r\n\t\t\t\topts.onUnblock(el,opts);\r\n\r\n\t\t\t// fix issue in Safari 6 where block artifacts remain until reflow\r\n\t\t\tvar body = $(document.body), w = body.width(), cssW = body[0].style.width;\r\n\t\t\tbody.width(w-1).width(w);\r\n\t\t\tbody[0].style.width = cssW;\r\n\t\t}\r\n\r\n\t\t// bind/unbind the handler\r\n\t\tfunction bind(b, el, opts) {\r\n\t\t\tvar full = el == window, $el = $(el);\r\n\r\n\t\t\t// don't bother unbinding if there is nothing to unbind\r\n\t\t\tif (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked')))\r\n\t\t\t\treturn;\r\n\r\n\t\t\t$el.data('blockUI.isBlocked', b);\r\n\r\n\t\t\t// don't bind events when overlay is not in use or if bindEvents is false\r\n\t\t\tif (!full || !opts.bindEvents || (b && !opts.showOverlay))\r\n\t\t\t\treturn;\r\n\r\n\t\t\t// bind anchors and inputs for mouse and key events\r\n\t\t\tvar events = 'mousedown mouseup keydown keypress keyup touchstart touchend touchmove';\r\n\t\t\tif (b)\r\n\t\t\t\t$(document).bind(events, opts, handler);\r\n\t\t\telse\r\n\t\t\t\t$(document).unbind(events, handler);\r\n\r\n\t\t// former impl...\r\n\t\t//\t\tvar $e = $('a,:input');\r\n\t\t//\t\tb ? $e.bind(events, opts, handler) : $e.unbind(events, handler);\r\n\t\t}\r\n\r\n\t\t// event handler to suppress keyboard/mouse events when blocking\r\n\t\tfunction handler(e) {\r\n\t\t\t// allow tab navigation (conditionally)\r\n\t\t\tif (e.type === 'keydown' && e.keyCode && e.keyCode == 9) {\r\n\t\t\t\tif (pageBlock && e.data.constrainTabKey) {\r\n\t\t\t\t\tvar els = pageBlockEls;\r\n\t\t\t\t\tvar fwd = !e.shiftKey && e.target === els[els.length-1];\r\n\t\t\t\t\tvar back = e.shiftKey && e.target === els[0];\r\n\t\t\t\t\tif (fwd || back) {\r\n\t\t\t\t\t\tsetTimeout(function(){focus(back);},10);\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tvar opts = e.data;\r\n\t\t\tvar target = $(e.target);\r\n\t\t\tif (target.hasClass('blockOverlay') && opts.onOverlayClick)\r\n\t\t\t\topts.onOverlayClick(e);\r\n\r\n\t\t\t// allow events within the message content\r\n\t\t\tif (target.parents('div.' + opts.blockMsgClass).length > 0)\r\n\t\t\t\treturn true;\r\n\r\n\t\t\t// allow events for content that is not being blocked\r\n\t\t\treturn target.parents().children().filter('div.blockUI').length === 0;\r\n\t\t}\r\n\r\n\t\tfunction focus(back) {\r\n\t\t\tif (!pageBlockEls)\r\n\t\t\t\treturn;\r\n\t\t\tvar e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0];\r\n\t\t\tif (e)\r\n\t\t\t\te.focus();\r\n\t\t}\r\n\r\n\t\tfunction center(el, x, y) {\r\n\t\t\tvar p = el.parentNode, s = el.style;\r\n\t\t\tvar l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth');\r\n\t\t\tvar t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth');\r\n\t\t\tif (x) s.left = l > 0 ? (l+'px') : '0';\r\n\t\t\tif (y) s.top  = t > 0 ? (t+'px') : '0';\r\n\t\t}\r\n\r\n\t\tfunction sz(el, p) {\r\n\t\t\treturn parseInt($.css(el,p),10)||0;\r\n\t\t}\r\n\r\n\t}\r\n\r\n\r\n\t/*global define:true */\r\n\tif (typeof define === 'function' && define.amd) {\r\n\t\t// AMD. Register as an anonymous module.\r\n\t\tdefine(['jquery'], setup);\r\n\t} else if (typeof exports === 'object') {\r\n\t\t// Node/CommonJS\r\n\t\tsetup(require('jquery'));\r\n\t} else {\r\n\t\t// Browser globals\r\n\t\tsetup(jQuery);\r\n\t}\r\n\r\n})();\r\n","/*\\\n|*| ========================================================================\n|*| Bootstrap Toggle: bootstrap4-toggle.js v3.6.1\n|*| https://gitbrent.github.io/bootstrap4-toggle/\n|*| ========================================================================\n|*| Copyright 2018-2019 Brent Ely\n|*| Licensed under MIT\n|*| ========================================================================\n\\*/\n!function(a){\"use strict\";function l(t,e){this.$element=a(t),this.options=a.extend({},this.defaults(),e),this.render()}l.VERSION=\"3.6.0\",l.DEFAULTS={on:\"On\",off:\"Off\",onstyle:\"primary\",offstyle:\"light\",size:\"normal\",style:\"\",width:null,height:null},l.prototype.defaults=function(){return{on:this.$element.attr(\"data-on\")||l.DEFAULTS.on,off:this.$element.attr(\"data-off\")||l.DEFAULTS.off,onstyle:this.$element.attr(\"data-onstyle\")||l.DEFAULTS.onstyle,offstyle:this.$element.attr(\"data-offstyle\")||l.DEFAULTS.offstyle,size:this.$element.attr(\"data-size\")||l.DEFAULTS.size,style:this.$element.attr(\"data-style\")||l.DEFAULTS.style,width:this.$element.attr(\"data-width\")||l.DEFAULTS.width,height:this.$element.attr(\"data-height\")||l.DEFAULTS.height}},l.prototype.render=function(){this._onstyle=\"btn-\"+this.options.onstyle,this._offstyle=\"btn-\"+this.options.offstyle;var t=\"large\"===this.options.size||\"lg\"===this.options.size?\"btn-lg\":\"small\"===this.options.size||\"sm\"===this.options.size?\"btn-sm\":\"mini\"===this.options.size||\"xs\"===this.options.size?\"btn-xs\":\"\",e=a('<label for=\"'+this.$element.prop(\"id\")+'\" class=\"btn\">').html(this.options.on).addClass(this._onstyle+\" \"+t),s=a('<label for=\"'+this.$element.prop(\"id\")+'\" class=\"btn\">').html(this.options.off).addClass(this._offstyle+\" \"+t),o=a('<span class=\"toggle-handle btn btn-light\">').addClass(t),i=a('<div class=\"toggle-group\">').append(e,s,o),l=a('<div class=\"toggle btn\" data-toggle=\"toggle\" role=\"button\">').addClass(this.$element.prop(\"checked\")?this._onstyle:this._offstyle+\" off\").addClass(t).addClass(this.options.style);this.$element.wrap(l),a.extend(this,{$toggle:this.$element.parent(),$toggleOn:e,$toggleOff:s,$toggleGroup:i}),this.$toggle.append(i);var n=this.options.width||Math.max(e.outerWidth(),s.outerWidth())+o.outerWidth()/2,h=this.options.height||Math.max(e.outerHeight(),s.outerHeight());e.addClass(\"toggle-on\"),s.addClass(\"toggle-off\"),this.$toggle.css({width:n,height:h}),this.options.height&&(e.css(\"line-height\",e.height()+\"px\"),s.css(\"line-height\",s.height()+\"px\")),this.update(!0),this.trigger(!0)},l.prototype.toggle=function(){this.$element.prop(\"checked\")?this.off():this.on()},l.prototype.on=function(t){if(this.$element.prop(\"disabled\"))return!1;this.$toggle.removeClass(this._offstyle+\" off\").addClass(this._onstyle),this.$element.prop(\"checked\",!0),t||this.trigger()},l.prototype.off=function(t){if(this.$element.prop(\"disabled\"))return!1;this.$toggle.removeClass(this._onstyle).addClass(this._offstyle+\" off\"),this.$element.prop(\"checked\",!1),t||this.trigger()},l.prototype.enable=function(){this.$toggle.removeClass(\"disabled\"),this.$toggle.removeAttr(\"disabled\"),this.$element.prop(\"disabled\",!1)},l.prototype.disable=function(){this.$toggle.addClass(\"disabled\"),this.$toggle.attr(\"disabled\",\"disabled\"),this.$element.prop(\"disabled\",!0)},l.prototype.update=function(t){this.$element.prop(\"disabled\")?this.disable():this.enable(),this.$element.prop(\"checked\")?this.on(t):this.off(t)},l.prototype.trigger=function(t){this.$element.off(\"change.bs.toggle\"),t||this.$element.change(),this.$element.on(\"change.bs.toggle\",a.proxy(function(){this.update()},this))},l.prototype.destroy=function(){this.$element.off(\"change.bs.toggle\"),this.$toggleGroup.remove(),this.$element.removeData(\"bs.toggle\"),this.$element.unwrap()};var t=a.fn.bootstrapToggle;a.fn.bootstrapToggle=function(o){var i=Array.prototype.slice.call(arguments,1)[0];return this.each(function(){var t=a(this),e=t.data(\"bs.toggle\"),s=\"object\"==typeof o&&o;e||t.data(\"bs.toggle\",e=new l(this,s)),\"string\"==typeof o&&e[o]&&\"boolean\"==typeof i?e[o](i):\"string\"==typeof o&&e[o]&&e[o]()})},a.fn.bootstrapToggle.Constructor=l,a.fn.toggle.noConflict=function(){return a.fn.bootstrapToggle=t,this},a(function(){a(\"input[type=checkbox][data-toggle^=toggle]\").bootstrapToggle()}),a(document).on(\"click.bs.toggle\",\"div[data-toggle^=toggle]\",function(t){a(this).find(\"input[type=checkbox]\").bootstrapToggle(\"toggle\"),t.preventDefault()})}(jQuery);\n",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory();\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\troot.CryptoJS = factory();\n\t}\n}(this, function () {\n\n\t/*globals window, global, require*/\n\n\t/**\n\t * CryptoJS core components.\n\t */\n\tvar CryptoJS = CryptoJS || (function (Math, undefined) {\n\n\t    var crypto;\n\n\t    // Native crypto from window (Browser)\n\t    if (typeof window !== 'undefined' && window.crypto) {\n\t        crypto = window.crypto;\n\t    }\n\n\t    // Native crypto in web worker (Browser)\n\t    if (typeof self !== 'undefined' && self.crypto) {\n\t        crypto = self.crypto;\n\t    }\n\n\t    // Native crypto from worker\n\t    if (typeof globalThis !== 'undefined' && globalThis.crypto) {\n\t        crypto = globalThis.crypto;\n\t    }\n\n\t    // Native (experimental IE 11) crypto from window (Browser)\n\t    if (!crypto && typeof window !== 'undefined' && window.msCrypto) {\n\t        crypto = window.msCrypto;\n\t    }\n\n\t    // Native crypto from global (NodeJS)\n\t    if (!crypto && typeof global !== 'undefined' && global.crypto) {\n\t        crypto = global.crypto;\n\t    }\n\n\t    // Native crypto import via require (NodeJS)\n\t    if (!crypto && typeof require === 'function') {\n\t        try {\n\t            crypto = require('crypto');\n\t        } catch (err) {}\n\t    }\n\n\t    /*\n\t     * Cryptographically secure pseudorandom number generator\n\t     *\n\t     * As Math.random() is cryptographically not safe to use\n\t     */\n\t    var cryptoSecureRandomInt = function () {\n\t        if (crypto) {\n\t            // Use getRandomValues method (Browser)\n\t            if (typeof crypto.getRandomValues === 'function') {\n\t                try {\n\t                    return crypto.getRandomValues(new Uint32Array(1))[0];\n\t                } catch (err) {}\n\t            }\n\n\t            // Use randomBytes method (NodeJS)\n\t            if (typeof crypto.randomBytes === 'function') {\n\t                try {\n\t                    return crypto.randomBytes(4).readInt32LE();\n\t                } catch (err) {}\n\t            }\n\t        }\n\n\t        throw new Error('Native crypto module could not be used to get secure random number.');\n\t    };\n\n\t    /*\n\t     * Local polyfill of Object.create\n\n\t     */\n\t    var create = Object.create || (function () {\n\t        function F() {}\n\n\t        return function (obj) {\n\t            var subtype;\n\n\t            F.prototype = obj;\n\n\t            subtype = new F();\n\n\t            F.prototype = null;\n\n\t            return subtype;\n\t        };\n\t    }());\n\n\t    /**\n\t     * CryptoJS namespace.\n\t     */\n\t    var C = {};\n\n\t    /**\n\t     * Library namespace.\n\t     */\n\t    var C_lib = C.lib = {};\n\n\t    /**\n\t     * Base object for prototypal inheritance.\n\t     */\n\t    var Base = C_lib.Base = (function () {\n\n\n\t        return {\n\t            /**\n\t             * Creates a new object that inherits from this object.\n\t             *\n\t             * @param {Object} overrides Properties to copy into the new object.\n\t             *\n\t             * @return {Object} The new object.\n\t             *\n\t             * @static\n\t             *\n\t             * @example\n\t             *\n\t             *     var MyType = CryptoJS.lib.Base.extend({\n\t             *         field: 'value',\n\t             *\n\t             *         method: function () {\n\t             *         }\n\t             *     });\n\t             */\n\t            extend: function (overrides) {\n\t                // Spawn\n\t                var subtype = create(this);\n\n\t                // Augment\n\t                if (overrides) {\n\t                    subtype.mixIn(overrides);\n\t                }\n\n\t                // Create default initializer\n\t                if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {\n\t                    subtype.init = function () {\n\t                        subtype.$super.init.apply(this, arguments);\n\t                    };\n\t                }\n\n\t                // Initializer's prototype is the subtype object\n\t                subtype.init.prototype = subtype;\n\n\t                // Reference supertype\n\t                subtype.$super = this;\n\n\t                return subtype;\n\t            },\n\n\t            /**\n\t             * Extends this object and runs the init method.\n\t             * Arguments to create() will be passed to init().\n\t             *\n\t             * @return {Object} The new object.\n\t             *\n\t             * @static\n\t             *\n\t             * @example\n\t             *\n\t             *     var instance = MyType.create();\n\t             */\n\t            create: function () {\n\t                var instance = this.extend();\n\t                instance.init.apply(instance, arguments);\n\n\t                return instance;\n\t            },\n\n\t            /**\n\t             * Initializes a newly created object.\n\t             * Override this method to add some logic when your objects are created.\n\t             *\n\t             * @example\n\t             *\n\t             *     var MyType = CryptoJS.lib.Base.extend({\n\t             *         init: function () {\n\t             *             // ...\n\t             *         }\n\t             *     });\n\t             */\n\t            init: function () {\n\t            },\n\n\t            /**\n\t             * Copies properties into this object.\n\t             *\n\t             * @param {Object} properties The properties to mix in.\n\t             *\n\t             * @example\n\t             *\n\t             *     MyType.mixIn({\n\t             *         field: 'value'\n\t             *     });\n\t             */\n\t            mixIn: function (properties) {\n\t                for (var propertyName in properties) {\n\t                    if (properties.hasOwnProperty(propertyName)) {\n\t                        this[propertyName] = properties[propertyName];\n\t                    }\n\t                }\n\n\t                // IE won't copy toString using the loop above\n\t                if (properties.hasOwnProperty('toString')) {\n\t                    this.toString = properties.toString;\n\t                }\n\t            },\n\n\t            /**\n\t             * Creates a copy of this object.\n\t             *\n\t             * @return {Object} The clone.\n\t             *\n\t             * @example\n\t             *\n\t             *     var clone = instance.clone();\n\t             */\n\t            clone: function () {\n\t                return this.init.prototype.extend(this);\n\t            }\n\t        };\n\t    }());\n\n\t    /**\n\t     * An array of 32-bit words.\n\t     *\n\t     * @property {Array} words The array of 32-bit words.\n\t     * @property {number} sigBytes The number of significant bytes in this word array.\n\t     */\n\t    var WordArray = C_lib.WordArray = Base.extend({\n\t        /**\n\t         * Initializes a newly created word array.\n\t         *\n\t         * @param {Array} words (Optional) An array of 32-bit words.\n\t         * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.lib.WordArray.create();\n\t         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n\t         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n\t         */\n\t        init: function (words, sigBytes) {\n\t            words = this.words = words || [];\n\n\t            if (sigBytes != undefined) {\n\t                this.sigBytes = sigBytes;\n\t            } else {\n\t                this.sigBytes = words.length * 4;\n\t            }\n\t        },\n\n\t        /**\n\t         * Converts this word array to a string.\n\t         *\n\t         * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n\t         *\n\t         * @return {string} The stringified word array.\n\t         *\n\t         * @example\n\t         *\n\t         *     var string = wordArray + '';\n\t         *     var string = wordArray.toString();\n\t         *     var string = wordArray.toString(CryptoJS.enc.Utf8);\n\t         */\n\t        toString: function (encoder) {\n\t            return (encoder || Hex).stringify(this);\n\t        },\n\n\t        /**\n\t         * Concatenates a word array to this word array.\n\t         *\n\t         * @param {WordArray} wordArray The word array to append.\n\t         *\n\t         * @return {WordArray} This word array.\n\t         *\n\t         * @example\n\t         *\n\t         *     wordArray1.concat(wordArray2);\n\t         */\n\t        concat: function (wordArray) {\n\t            // Shortcuts\n\t            var thisWords = this.words;\n\t            var thatWords = wordArray.words;\n\t            var thisSigBytes = this.sigBytes;\n\t            var thatSigBytes = wordArray.sigBytes;\n\n\t            // Clamp excess bits\n\t            this.clamp();\n\n\t            // Concat\n\t            if (thisSigBytes % 4) {\n\t                // Copy one byte at a time\n\t                for (var i = 0; i < thatSigBytes; i++) {\n\t                    var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t                    thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n\t                }\n\t            } else {\n\t                // Copy one word at a time\n\t                for (var j = 0; j < thatSigBytes; j += 4) {\n\t                    thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2];\n\t                }\n\t            }\n\t            this.sigBytes += thatSigBytes;\n\n\t            // Chainable\n\t            return this;\n\t        },\n\n\t        /**\n\t         * Removes insignificant bits.\n\t         *\n\t         * @example\n\t         *\n\t         *     wordArray.clamp();\n\t         */\n\t        clamp: function () {\n\t            // Shortcuts\n\t            var words = this.words;\n\t            var sigBytes = this.sigBytes;\n\n\t            // Clamp\n\t            words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n\t            words.length = Math.ceil(sigBytes / 4);\n\t        },\n\n\t        /**\n\t         * Creates a copy of this word array.\n\t         *\n\t         * @return {WordArray} The clone.\n\t         *\n\t         * @example\n\t         *\n\t         *     var clone = wordArray.clone();\n\t         */\n\t        clone: function () {\n\t            var clone = Base.clone.call(this);\n\t            clone.words = this.words.slice(0);\n\n\t            return clone;\n\t        },\n\n\t        /**\n\t         * Creates a word array filled with random bytes.\n\t         *\n\t         * @param {number} nBytes The number of random bytes to generate.\n\t         *\n\t         * @return {WordArray} The random word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.lib.WordArray.random(16);\n\t         */\n\t        random: function (nBytes) {\n\t            var words = [];\n\n\t            for (var i = 0; i < nBytes; i += 4) {\n\t                words.push(cryptoSecureRandomInt());\n\t            }\n\n\t            return new WordArray.init(words, nBytes);\n\t        }\n\t    });\n\n\t    /**\n\t     * Encoder namespace.\n\t     */\n\t    var C_enc = C.enc = {};\n\n\t    /**\n\t     * Hex encoding strategy.\n\t     */\n\t    var Hex = C_enc.Hex = {\n\t        /**\n\t         * Converts a word array to a hex string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The hex string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\n\t            // Convert\n\t            var hexChars = [];\n\t            for (var i = 0; i < sigBytes; i++) {\n\t                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t                hexChars.push((bite >>> 4).toString(16));\n\t                hexChars.push((bite & 0x0f).toString(16));\n\t            }\n\n\t            return hexChars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a hex string to a word array.\n\t         *\n\t         * @param {string} hexStr The hex string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Hex.parse(hexString);\n\t         */\n\t        parse: function (hexStr) {\n\t            // Shortcut\n\t            var hexStrLength = hexStr.length;\n\n\t            // Convert\n\t            var words = [];\n\t            for (var i = 0; i < hexStrLength; i += 2) {\n\t                words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n\t            }\n\n\t            return new WordArray.init(words, hexStrLength / 2);\n\t        }\n\t    };\n\n\t    /**\n\t     * Latin1 encoding strategy.\n\t     */\n\t    var Latin1 = C_enc.Latin1 = {\n\t        /**\n\t         * Converts a word array to a Latin1 string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The Latin1 string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\n\t            // Convert\n\t            var latin1Chars = [];\n\t            for (var i = 0; i < sigBytes; i++) {\n\t                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t                latin1Chars.push(String.fromCharCode(bite));\n\t            }\n\n\t            return latin1Chars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a Latin1 string to a word array.\n\t         *\n\t         * @param {string} latin1Str The Latin1 string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n\t         */\n\t        parse: function (latin1Str) {\n\t            // Shortcut\n\t            var latin1StrLength = latin1Str.length;\n\n\t            // Convert\n\t            var words = [];\n\t            for (var i = 0; i < latin1StrLength; i++) {\n\t                words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n\t            }\n\n\t            return new WordArray.init(words, latin1StrLength);\n\t        }\n\t    };\n\n\t    /**\n\t     * UTF-8 encoding strategy.\n\t     */\n\t    var Utf8 = C_enc.Utf8 = {\n\t        /**\n\t         * Converts a word array to a UTF-8 string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The UTF-8 string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            try {\n\t                return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n\t            } catch (e) {\n\t                throw new Error('Malformed UTF-8 data');\n\t            }\n\t        },\n\n\t        /**\n\t         * Converts a UTF-8 string to a word array.\n\t         *\n\t         * @param {string} utf8Str The UTF-8 string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n\t         */\n\t        parse: function (utf8Str) {\n\t            return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n\t        }\n\t    };\n\n\t    /**\n\t     * Abstract buffered block algorithm template.\n\t     *\n\t     * The property blockSize must be implemented in a concrete subtype.\n\t     *\n\t     * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\n\t     */\n\t    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\n\t        /**\n\t         * Resets this block algorithm's data buffer to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     bufferedBlockAlgorithm.reset();\n\t         */\n\t        reset: function () {\n\t            // Initial values\n\t            this._data = new WordArray.init();\n\t            this._nDataBytes = 0;\n\t        },\n\n\t        /**\n\t         * Adds new data to this block algorithm's buffer.\n\t         *\n\t         * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\n\t         *\n\t         * @example\n\t         *\n\t         *     bufferedBlockAlgorithm._append('data');\n\t         *     bufferedBlockAlgorithm._append(wordArray);\n\t         */\n\t        _append: function (data) {\n\t            // Convert string to WordArray, else assume WordArray already\n\t            if (typeof data == 'string') {\n\t                data = Utf8.parse(data);\n\t            }\n\n\t            // Append\n\t            this._data.concat(data);\n\t            this._nDataBytes += data.sigBytes;\n\t        },\n\n\t        /**\n\t         * Processes available data blocks.\n\t         *\n\t         * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n\t         *\n\t         * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n\t         *\n\t         * @return {WordArray} The processed data.\n\t         *\n\t         * @example\n\t         *\n\t         *     var processedData = bufferedBlockAlgorithm._process();\n\t         *     var processedData = bufferedBlockAlgorithm._process(!!'flush');\n\t         */\n\t        _process: function (doFlush) {\n\t            var processedWords;\n\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\t            var dataSigBytes = data.sigBytes;\n\t            var blockSize = this.blockSize;\n\t            var blockSizeBytes = blockSize * 4;\n\n\t            // Count blocks ready\n\t            var nBlocksReady = dataSigBytes / blockSizeBytes;\n\t            if (doFlush) {\n\t                // Round up to include partial blocks\n\t                nBlocksReady = Math.ceil(nBlocksReady);\n\t            } else {\n\t                // Round down to include only full blocks,\n\t                // less the number of blocks that must remain in the buffer\n\t                nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n\t            }\n\n\t            // Count words ready\n\t            var nWordsReady = nBlocksReady * blockSize;\n\n\t            // Count bytes ready\n\t            var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n\t            // Process blocks\n\t            if (nWordsReady) {\n\t                for (var offset = 0; offset < nWordsReady; offset += blockSize) {\n\t                    // Perform concrete-algorithm logic\n\t                    this._doProcessBlock(dataWords, offset);\n\t                }\n\n\t                // Remove processed words\n\t                processedWords = dataWords.splice(0, nWordsReady);\n\t                data.sigBytes -= nBytesReady;\n\t            }\n\n\t            // Return processed words\n\t            return new WordArray.init(processedWords, nBytesReady);\n\t        },\n\n\t        /**\n\t         * Creates a copy of this object.\n\t         *\n\t         * @return {Object} The clone.\n\t         *\n\t         * @example\n\t         *\n\t         *     var clone = bufferedBlockAlgorithm.clone();\n\t         */\n\t        clone: function () {\n\t            var clone = Base.clone.call(this);\n\t            clone._data = this._data.clone();\n\n\t            return clone;\n\t        },\n\n\t        _minBufferSize: 0\n\t    });\n\n\t    /**\n\t     * Abstract hasher template.\n\t     *\n\t     * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n\t     */\n\t    var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\n\t        /**\n\t         * Configuration options.\n\t         */\n\t        cfg: Base.extend(),\n\n\t        /**\n\t         * Initializes a newly created hasher.\n\t         *\n\t         * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hasher = CryptoJS.algo.SHA256.create();\n\t         */\n\t        init: function (cfg) {\n\t            // Apply config defaults\n\t            this.cfg = this.cfg.extend(cfg);\n\n\t            // Set initial values\n\t            this.reset();\n\t        },\n\n\t        /**\n\t         * Resets this hasher to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     hasher.reset();\n\t         */\n\t        reset: function () {\n\t            // Reset data buffer\n\t            BufferedBlockAlgorithm.reset.call(this);\n\n\t            // Perform concrete-hasher logic\n\t            this._doReset();\n\t        },\n\n\t        /**\n\t         * Updates this hasher with a message.\n\t         *\n\t         * @param {WordArray|string} messageUpdate The message to append.\n\t         *\n\t         * @return {Hasher} This hasher.\n\t         *\n\t         * @example\n\t         *\n\t         *     hasher.update('message');\n\t         *     hasher.update(wordArray);\n\t         */\n\t        update: function (messageUpdate) {\n\t            // Append\n\t            this._append(messageUpdate);\n\n\t            // Update the hash\n\t            this._process();\n\n\t            // Chainable\n\t            return this;\n\t        },\n\n\t        /**\n\t         * Finalizes the hash computation.\n\t         * Note that the finalize operation is effectively a destructive, read-once operation.\n\t         *\n\t         * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t         *\n\t         * @return {WordArray} The hash.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hash = hasher.finalize();\n\t         *     var hash = hasher.finalize('message');\n\t         *     var hash = hasher.finalize(wordArray);\n\t         */\n\t        finalize: function (messageUpdate) {\n\t            // Final message update\n\t            if (messageUpdate) {\n\t                this._append(messageUpdate);\n\t            }\n\n\t            // Perform concrete-hasher logic\n\t            var hash = this._doFinalize();\n\n\t            return hash;\n\t        },\n\n\t        blockSize: 512/32,\n\n\t        /**\n\t         * Creates a shortcut function to a hasher's object interface.\n\t         *\n\t         * @param {Hasher} hasher The hasher to create a helper for.\n\t         *\n\t         * @return {Function} The shortcut function.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n\t         */\n\t        _createHelper: function (hasher) {\n\t            return function (message, cfg) {\n\t                return new hasher.init(cfg).finalize(message);\n\t            };\n\t        },\n\n\t        /**\n\t         * Creates a shortcut function to the HMAC's object interface.\n\t         *\n\t         * @param {Hasher} hasher The hasher to use in this HMAC helper.\n\t         *\n\t         * @return {Function} The shortcut function.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n\t         */\n\t        _createHmacHelper: function (hasher) {\n\t            return function (message, key) {\n\t                return new C_algo.HMAC.init(hasher, key).finalize(message);\n\t            };\n\t        }\n\t    });\n\n\t    /**\n\t     * Algorithm namespace.\n\t     */\n\t    var C_algo = C.algo = {};\n\n\t    return C;\n\t}(Math));\n\n\n\t(function (undefined) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Base = C_lib.Base;\n\t    var X32WordArray = C_lib.WordArray;\n\n\t    /**\n\t     * x64 namespace.\n\t     */\n\t    var C_x64 = C.x64 = {};\n\n\t    /**\n\t     * A 64-bit word.\n\t     */\n\t    var X64Word = C_x64.Word = Base.extend({\n\t        /**\n\t         * Initializes a newly created 64-bit word.\n\t         *\n\t         * @param {number} high The high 32 bits.\n\t         * @param {number} low The low 32 bits.\n\t         *\n\t         * @example\n\t         *\n\t         *     var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);\n\t         */\n\t        init: function (high, low) {\n\t            this.high = high;\n\t            this.low = low;\n\t        }\n\n\t        /**\n\t         * Bitwise NOTs this word.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after negating.\n\t         *\n\t         * @example\n\t         *\n\t         *     var negated = x64Word.not();\n\t         */\n\t        // not: function () {\n\t            // var high = ~this.high;\n\t            // var low = ~this.low;\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Bitwise ANDs this word with the passed word.\n\t         *\n\t         * @param {X64Word} word The x64-Word to AND with this word.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after ANDing.\n\t         *\n\t         * @example\n\t         *\n\t         *     var anded = x64Word.and(anotherX64Word);\n\t         */\n\t        // and: function (word) {\n\t            // var high = this.high & word.high;\n\t            // var low = this.low & word.low;\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Bitwise ORs this word with the passed word.\n\t         *\n\t         * @param {X64Word} word The x64-Word to OR with this word.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after ORing.\n\t         *\n\t         * @example\n\t         *\n\t         *     var ored = x64Word.or(anotherX64Word);\n\t         */\n\t        // or: function (word) {\n\t            // var high = this.high | word.high;\n\t            // var low = this.low | word.low;\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Bitwise XORs this word with the passed word.\n\t         *\n\t         * @param {X64Word} word The x64-Word to XOR with this word.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after XORing.\n\t         *\n\t         * @example\n\t         *\n\t         *     var xored = x64Word.xor(anotherX64Word);\n\t         */\n\t        // xor: function (word) {\n\t            // var high = this.high ^ word.high;\n\t            // var low = this.low ^ word.low;\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Shifts this word n bits to the left.\n\t         *\n\t         * @param {number} n The number of bits to shift.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after shifting.\n\t         *\n\t         * @example\n\t         *\n\t         *     var shifted = x64Word.shiftL(25);\n\t         */\n\t        // shiftL: function (n) {\n\t            // if (n < 32) {\n\t                // var high = (this.high << n) | (this.low >>> (32 - n));\n\t                // var low = this.low << n;\n\t            // } else {\n\t                // var high = this.low << (n - 32);\n\t                // var low = 0;\n\t            // }\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Shifts this word n bits to the right.\n\t         *\n\t         * @param {number} n The number of bits to shift.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after shifting.\n\t         *\n\t         * @example\n\t         *\n\t         *     var shifted = x64Word.shiftR(7);\n\t         */\n\t        // shiftR: function (n) {\n\t            // if (n < 32) {\n\t                // var low = (this.low >>> n) | (this.high << (32 - n));\n\t                // var high = this.high >>> n;\n\t            // } else {\n\t                // var low = this.high >>> (n - 32);\n\t                // var high = 0;\n\t            // }\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Rotates this word n bits to the left.\n\t         *\n\t         * @param {number} n The number of bits to rotate.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after rotating.\n\t         *\n\t         * @example\n\t         *\n\t         *     var rotated = x64Word.rotL(25);\n\t         */\n\t        // rotL: function (n) {\n\t            // return this.shiftL(n).or(this.shiftR(64 - n));\n\t        // },\n\n\t        /**\n\t         * Rotates this word n bits to the right.\n\t         *\n\t         * @param {number} n The number of bits to rotate.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after rotating.\n\t         *\n\t         * @example\n\t         *\n\t         *     var rotated = x64Word.rotR(7);\n\t         */\n\t        // rotR: function (n) {\n\t            // return this.shiftR(n).or(this.shiftL(64 - n));\n\t        // },\n\n\t        /**\n\t         * Adds this word with the passed word.\n\t         *\n\t         * @param {X64Word} word The x64-Word to add with this word.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after adding.\n\t         *\n\t         * @example\n\t         *\n\t         *     var added = x64Word.add(anotherX64Word);\n\t         */\n\t        // add: function (word) {\n\t            // var low = (this.low + word.low) | 0;\n\t            // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;\n\t            // var high = (this.high + word.high + carry) | 0;\n\n\t            // return X64Word.create(high, low);\n\t        // }\n\t    });\n\n\t    /**\n\t     * An array of 64-bit words.\n\t     *\n\t     * @property {Array} words The array of CryptoJS.x64.Word objects.\n\t     * @property {number} sigBytes The number of significant bytes in this word array.\n\t     */\n\t    var X64WordArray = C_x64.WordArray = Base.extend({\n\t        /**\n\t         * Initializes a newly created word array.\n\t         *\n\t         * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.\n\t         * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.x64.WordArray.create();\n\t         *\n\t         *     var wordArray = CryptoJS.x64.WordArray.create([\n\t         *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t         *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t         *     ]);\n\t         *\n\t         *     var wordArray = CryptoJS.x64.WordArray.create([\n\t         *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t         *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t         *     ], 10);\n\t         */\n\t        init: function (words, sigBytes) {\n\t            words = this.words = words || [];\n\n\t            if (sigBytes != undefined) {\n\t                this.sigBytes = sigBytes;\n\t            } else {\n\t                this.sigBytes = words.length * 8;\n\t            }\n\t        },\n\n\t        /**\n\t         * Converts this 64-bit word array to a 32-bit word array.\n\t         *\n\t         * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.\n\t         *\n\t         * @example\n\t         *\n\t         *     var x32WordArray = x64WordArray.toX32();\n\t         */\n\t        toX32: function () {\n\t            // Shortcuts\n\t            var x64Words = this.words;\n\t            var x64WordsLength = x64Words.length;\n\n\t            // Convert\n\t            var x32Words = [];\n\t            for (var i = 0; i < x64WordsLength; i++) {\n\t                var x64Word = x64Words[i];\n\t                x32Words.push(x64Word.high);\n\t                x32Words.push(x64Word.low);\n\t            }\n\n\t            return X32WordArray.create(x32Words, this.sigBytes);\n\t        },\n\n\t        /**\n\t         * Creates a copy of this word array.\n\t         *\n\t         * @return {X64WordArray} The clone.\n\t         *\n\t         * @example\n\t         *\n\t         *     var clone = x64WordArray.clone();\n\t         */\n\t        clone: function () {\n\t            var clone = Base.clone.call(this);\n\n\t            // Clone \"words\" array\n\t            var words = clone.words = this.words.slice(0);\n\n\t            // Clone each X64Word object\n\t            var wordsLength = words.length;\n\t            for (var i = 0; i < wordsLength; i++) {\n\t                words[i] = words[i].clone();\n\t            }\n\n\t            return clone;\n\t        }\n\t    });\n\t}());\n\n\n\t(function () {\n\t    // Check if typed arrays are supported\n\t    if (typeof ArrayBuffer != 'function') {\n\t        return;\n\t    }\n\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\n\t    // Reference original init\n\t    var superInit = WordArray.init;\n\n\t    // Augment WordArray.init to handle typed arrays\n\t    var subInit = WordArray.init = function (typedArray) {\n\t        // Convert buffers to uint8\n\t        if (typedArray instanceof ArrayBuffer) {\n\t            typedArray = new Uint8Array(typedArray);\n\t        }\n\n\t        // Convert other array views to uint8\n\t        if (\n\t            typedArray instanceof Int8Array ||\n\t            (typeof Uint8ClampedArray !== \"undefined\" && typedArray instanceof Uint8ClampedArray) ||\n\t            typedArray instanceof Int16Array ||\n\t            typedArray instanceof Uint16Array ||\n\t            typedArray instanceof Int32Array ||\n\t            typedArray instanceof Uint32Array ||\n\t            typedArray instanceof Float32Array ||\n\t            typedArray instanceof Float64Array\n\t        ) {\n\t            typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);\n\t        }\n\n\t        // Handle Uint8Array\n\t        if (typedArray instanceof Uint8Array) {\n\t            // Shortcut\n\t            var typedArrayByteLength = typedArray.byteLength;\n\n\t            // Extract bytes\n\t            var words = [];\n\t            for (var i = 0; i < typedArrayByteLength; i++) {\n\t                words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);\n\t            }\n\n\t            // Initialize this word array\n\t            superInit.call(this, words, typedArrayByteLength);\n\t        } else {\n\t            // Else call normal init\n\t            superInit.apply(this, arguments);\n\t        }\n\t    };\n\n\t    subInit.prototype = WordArray;\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var C_enc = C.enc;\n\n\t    /**\n\t     * UTF-16 BE encoding strategy.\n\t     */\n\t    var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {\n\t        /**\n\t         * Converts a word array to a UTF-16 BE string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The UTF-16 BE string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\n\t            // Convert\n\t            var utf16Chars = [];\n\t            for (var i = 0; i < sigBytes; i += 2) {\n\t                var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;\n\t                utf16Chars.push(String.fromCharCode(codePoint));\n\t            }\n\n\t            return utf16Chars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a UTF-16 BE string to a word array.\n\t         *\n\t         * @param {string} utf16Str The UTF-16 BE string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Utf16.parse(utf16String);\n\t         */\n\t        parse: function (utf16Str) {\n\t            // Shortcut\n\t            var utf16StrLength = utf16Str.length;\n\n\t            // Convert\n\t            var words = [];\n\t            for (var i = 0; i < utf16StrLength; i++) {\n\t                words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);\n\t            }\n\n\t            return WordArray.create(words, utf16StrLength * 2);\n\t        }\n\t    };\n\n\t    /**\n\t     * UTF-16 LE encoding strategy.\n\t     */\n\t    C_enc.Utf16LE = {\n\t        /**\n\t         * Converts a word array to a UTF-16 LE string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The UTF-16 LE string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\n\t            // Convert\n\t            var utf16Chars = [];\n\t            for (var i = 0; i < sigBytes; i += 2) {\n\t                var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);\n\t                utf16Chars.push(String.fromCharCode(codePoint));\n\t            }\n\n\t            return utf16Chars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a UTF-16 LE string to a word array.\n\t         *\n\t         * @param {string} utf16Str The UTF-16 LE string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);\n\t         */\n\t        parse: function (utf16Str) {\n\t            // Shortcut\n\t            var utf16StrLength = utf16Str.length;\n\n\t            // Convert\n\t            var words = [];\n\t            for (var i = 0; i < utf16StrLength; i++) {\n\t                words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));\n\t            }\n\n\t            return WordArray.create(words, utf16StrLength * 2);\n\t        }\n\t    };\n\n\t    function swapEndian(word) {\n\t        return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);\n\t    }\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var C_enc = C.enc;\n\n\t    /**\n\t     * Base64 encoding strategy.\n\t     */\n\t    var Base64 = C_enc.Base64 = {\n\t        /**\n\t         * Converts a word array to a Base64 string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The Base64 string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var base64String = CryptoJS.enc.Base64.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\t            var map = this._map;\n\n\t            // Clamp excess bits\n\t            wordArray.clamp();\n\n\t            // Convert\n\t            var base64Chars = [];\n\t            for (var i = 0; i < sigBytes; i += 3) {\n\t                var byte1 = (words[i >>> 2]       >>> (24 - (i % 4) * 8))       & 0xff;\n\t                var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;\n\t                var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;\n\n\t                var triplet = (byte1 << 16) | (byte2 << 8) | byte3;\n\n\t                for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {\n\t                    base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));\n\t                }\n\t            }\n\n\t            // Add padding\n\t            var paddingChar = map.charAt(64);\n\t            if (paddingChar) {\n\t                while (base64Chars.length % 4) {\n\t                    base64Chars.push(paddingChar);\n\t                }\n\t            }\n\n\t            return base64Chars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a Base64 string to a word array.\n\t         *\n\t         * @param {string} base64Str The Base64 string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Base64.parse(base64String);\n\t         */\n\t        parse: function (base64Str) {\n\t            // Shortcuts\n\t            var base64StrLength = base64Str.length;\n\t            var map = this._map;\n\t            var reverseMap = this._reverseMap;\n\n\t            if (!reverseMap) {\n\t                    reverseMap = this._reverseMap = [];\n\t                    for (var j = 0; j < map.length; j++) {\n\t                        reverseMap[map.charCodeAt(j)] = j;\n\t                    }\n\t            }\n\n\t            // Ignore padding\n\t            var paddingChar = map.charAt(64);\n\t            if (paddingChar) {\n\t                var paddingIndex = base64Str.indexOf(paddingChar);\n\t                if (paddingIndex !== -1) {\n\t                    base64StrLength = paddingIndex;\n\t                }\n\t            }\n\n\t            // Convert\n\t            return parseLoop(base64Str, base64StrLength, reverseMap);\n\n\t        },\n\n\t        _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n\t    };\n\n\t    function parseLoop(base64Str, base64StrLength, reverseMap) {\n\t      var words = [];\n\t      var nBytes = 0;\n\t      for (var i = 0; i < base64StrLength; i++) {\n\t          if (i % 4) {\n\t              var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);\n\t              var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);\n\t              var bitsCombined = bits1 | bits2;\n\t              words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);\n\t              nBytes++;\n\t          }\n\t      }\n\t      return WordArray.create(words, nBytes);\n\t    }\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var C_enc = C.enc;\n\n\t    /**\n\t     * Base64url encoding strategy.\n\t     */\n\t    var Base64url = C_enc.Base64url = {\n\t        /**\n\t         * Converts a word array to a Base64url string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @param {boolean} urlSafe Whether to use url safe\n\t         *\n\t         * @return {string} The Base64url string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var base64String = CryptoJS.enc.Base64url.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray, urlSafe=true) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\t            var map = urlSafe ? this._safe_map : this._map;\n\n\t            // Clamp excess bits\n\t            wordArray.clamp();\n\n\t            // Convert\n\t            var base64Chars = [];\n\t            for (var i = 0; i < sigBytes; i += 3) {\n\t                var byte1 = (words[i >>> 2]       >>> (24 - (i % 4) * 8))       & 0xff;\n\t                var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;\n\t                var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;\n\n\t                var triplet = (byte1 << 16) | (byte2 << 8) | byte3;\n\n\t                for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {\n\t                    base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));\n\t                }\n\t            }\n\n\t            // Add padding\n\t            var paddingChar = map.charAt(64);\n\t            if (paddingChar) {\n\t                while (base64Chars.length % 4) {\n\t                    base64Chars.push(paddingChar);\n\t                }\n\t            }\n\n\t            return base64Chars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a Base64url string to a word array.\n\t         *\n\t         * @param {string} base64Str The Base64url string.\n\t         *\n\t         * @param {boolean} urlSafe Whether to use url safe\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Base64url.parse(base64String);\n\t         */\n\t        parse: function (base64Str, urlSafe=true) {\n\t            // Shortcuts\n\t            var base64StrLength = base64Str.length;\n\t            var map = urlSafe ? this._safe_map : this._map;\n\t            var reverseMap = this._reverseMap;\n\n\t            if (!reverseMap) {\n\t                reverseMap = this._reverseMap = [];\n\t                for (var j = 0; j < map.length; j++) {\n\t                    reverseMap[map.charCodeAt(j)] = j;\n\t                }\n\t            }\n\n\t            // Ignore padding\n\t            var paddingChar = map.charAt(64);\n\t            if (paddingChar) {\n\t                var paddingIndex = base64Str.indexOf(paddingChar);\n\t                if (paddingIndex !== -1) {\n\t                    base64StrLength = paddingIndex;\n\t                }\n\t            }\n\n\t            // Convert\n\t            return parseLoop(base64Str, base64StrLength, reverseMap);\n\n\t        },\n\n\t        _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n\t        _safe_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',\n\t    };\n\n\t    function parseLoop(base64Str, base64StrLength, reverseMap) {\n\t        var words = [];\n\t        var nBytes = 0;\n\t        for (var i = 0; i < base64StrLength; i++) {\n\t            if (i % 4) {\n\t                var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);\n\t                var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);\n\t                var bitsCombined = bits1 | bits2;\n\t                words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);\n\t                nBytes++;\n\t            }\n\t        }\n\t        return WordArray.create(words, nBytes);\n\t    }\n\t}());\n\n\t(function (Math) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_algo = C.algo;\n\n\t    // Constants table\n\t    var T = [];\n\n\t    // Compute constants\n\t    (function () {\n\t        for (var i = 0; i < 64; i++) {\n\t            T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;\n\t        }\n\t    }());\n\n\t    /**\n\t     * MD5 hash algorithm.\n\t     */\n\t    var MD5 = C_algo.MD5 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash = new WordArray.init([\n\t                0x67452301, 0xefcdab89,\n\t                0x98badcfe, 0x10325476\n\t            ]);\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Swap endian\n\t            for (var i = 0; i < 16; i++) {\n\t                // Shortcuts\n\t                var offset_i = offset + i;\n\t                var M_offset_i = M[offset_i];\n\n\t                M[offset_i] = (\n\t                    (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |\n\t                    (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)\n\t                );\n\t            }\n\n\t            // Shortcuts\n\t            var H = this._hash.words;\n\n\t            var M_offset_0  = M[offset + 0];\n\t            var M_offset_1  = M[offset + 1];\n\t            var M_offset_2  = M[offset + 2];\n\t            var M_offset_3  = M[offset + 3];\n\t            var M_offset_4  = M[offset + 4];\n\t            var M_offset_5  = M[offset + 5];\n\t            var M_offset_6  = M[offset + 6];\n\t            var M_offset_7  = M[offset + 7];\n\t            var M_offset_8  = M[offset + 8];\n\t            var M_offset_9  = M[offset + 9];\n\t            var M_offset_10 = M[offset + 10];\n\t            var M_offset_11 = M[offset + 11];\n\t            var M_offset_12 = M[offset + 12];\n\t            var M_offset_13 = M[offset + 13];\n\t            var M_offset_14 = M[offset + 14];\n\t            var M_offset_15 = M[offset + 15];\n\n\t            // Working varialbes\n\t            var a = H[0];\n\t            var b = H[1];\n\t            var c = H[2];\n\t            var d = H[3];\n\n\t            // Computation\n\t            a = FF(a, b, c, d, M_offset_0,  7,  T[0]);\n\t            d = FF(d, a, b, c, M_offset_1,  12, T[1]);\n\t            c = FF(c, d, a, b, M_offset_2,  17, T[2]);\n\t            b = FF(b, c, d, a, M_offset_3,  22, T[3]);\n\t            a = FF(a, b, c, d, M_offset_4,  7,  T[4]);\n\t            d = FF(d, a, b, c, M_offset_5,  12, T[5]);\n\t            c = FF(c, d, a, b, M_offset_6,  17, T[6]);\n\t            b = FF(b, c, d, a, M_offset_7,  22, T[7]);\n\t            a = FF(a, b, c, d, M_offset_8,  7,  T[8]);\n\t            d = FF(d, a, b, c, M_offset_9,  12, T[9]);\n\t            c = FF(c, d, a, b, M_offset_10, 17, T[10]);\n\t            b = FF(b, c, d, a, M_offset_11, 22, T[11]);\n\t            a = FF(a, b, c, d, M_offset_12, 7,  T[12]);\n\t            d = FF(d, a, b, c, M_offset_13, 12, T[13]);\n\t            c = FF(c, d, a, b, M_offset_14, 17, T[14]);\n\t            b = FF(b, c, d, a, M_offset_15, 22, T[15]);\n\n\t            a = GG(a, b, c, d, M_offset_1,  5,  T[16]);\n\t            d = GG(d, a, b, c, M_offset_6,  9,  T[17]);\n\t            c = GG(c, d, a, b, M_offset_11, 14, T[18]);\n\t            b = GG(b, c, d, a, M_offset_0,  20, T[19]);\n\t            a = GG(a, b, c, d, M_offset_5,  5,  T[20]);\n\t            d = GG(d, a, b, c, M_offset_10, 9,  T[21]);\n\t            c = GG(c, d, a, b, M_offset_15, 14, T[22]);\n\t            b = GG(b, c, d, a, M_offset_4,  20, T[23]);\n\t            a = GG(a, b, c, d, M_offset_9,  5,  T[24]);\n\t            d = GG(d, a, b, c, M_offset_14, 9,  T[25]);\n\t            c = GG(c, d, a, b, M_offset_3,  14, T[26]);\n\t            b = GG(b, c, d, a, M_offset_8,  20, T[27]);\n\t            a = GG(a, b, c, d, M_offset_13, 5,  T[28]);\n\t            d = GG(d, a, b, c, M_offset_2,  9,  T[29]);\n\t            c = GG(c, d, a, b, M_offset_7,  14, T[30]);\n\t            b = GG(b, c, d, a, M_offset_12, 20, T[31]);\n\n\t            a = HH(a, b, c, d, M_offset_5,  4,  T[32]);\n\t            d = HH(d, a, b, c, M_offset_8,  11, T[33]);\n\t            c = HH(c, d, a, b, M_offset_11, 16, T[34]);\n\t            b = HH(b, c, d, a, M_offset_14, 23, T[35]);\n\t            a = HH(a, b, c, d, M_offset_1,  4,  T[36]);\n\t            d = HH(d, a, b, c, M_offset_4,  11, T[37]);\n\t            c = HH(c, d, a, b, M_offset_7,  16, T[38]);\n\t            b = HH(b, c, d, a, M_offset_10, 23, T[39]);\n\t            a = HH(a, b, c, d, M_offset_13, 4,  T[40]);\n\t            d = HH(d, a, b, c, M_offset_0,  11, T[41]);\n\t            c = HH(c, d, a, b, M_offset_3,  16, T[42]);\n\t            b = HH(b, c, d, a, M_offset_6,  23, T[43]);\n\t            a = HH(a, b, c, d, M_offset_9,  4,  T[44]);\n\t            d = HH(d, a, b, c, M_offset_12, 11, T[45]);\n\t            c = HH(c, d, a, b, M_offset_15, 16, T[46]);\n\t            b = HH(b, c, d, a, M_offset_2,  23, T[47]);\n\n\t            a = II(a, b, c, d, M_offset_0,  6,  T[48]);\n\t            d = II(d, a, b, c, M_offset_7,  10, T[49]);\n\t            c = II(c, d, a, b, M_offset_14, 15, T[50]);\n\t            b = II(b, c, d, a, M_offset_5,  21, T[51]);\n\t            a = II(a, b, c, d, M_offset_12, 6,  T[52]);\n\t            d = II(d, a, b, c, M_offset_3,  10, T[53]);\n\t            c = II(c, d, a, b, M_offset_10, 15, T[54]);\n\t            b = II(b, c, d, a, M_offset_1,  21, T[55]);\n\t            a = II(a, b, c, d, M_offset_8,  6,  T[56]);\n\t            d = II(d, a, b, c, M_offset_15, 10, T[57]);\n\t            c = II(c, d, a, b, M_offset_6,  15, T[58]);\n\t            b = II(b, c, d, a, M_offset_13, 21, T[59]);\n\t            a = II(a, b, c, d, M_offset_4,  6,  T[60]);\n\t            d = II(d, a, b, c, M_offset_11, 10, T[61]);\n\t            c = II(c, d, a, b, M_offset_2,  15, T[62]);\n\t            b = II(b, c, d, a, M_offset_9,  21, T[63]);\n\n\t            // Intermediate hash value\n\t            H[0] = (H[0] + a) | 0;\n\t            H[1] = (H[1] + b) | 0;\n\t            H[2] = (H[2] + c) | 0;\n\t            H[3] = (H[3] + d) | 0;\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\n\t            var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);\n\t            var nBitsTotalL = nBitsTotal;\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (\n\t                (((nBitsTotalH << 8)  | (nBitsTotalH >>> 24)) & 0x00ff00ff) |\n\t                (((nBitsTotalH << 24) | (nBitsTotalH >>> 8))  & 0xff00ff00)\n\t            );\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\n\t                (((nBitsTotalL << 8)  | (nBitsTotalL >>> 24)) & 0x00ff00ff) |\n\t                (((nBitsTotalL << 24) | (nBitsTotalL >>> 8))  & 0xff00ff00)\n\t            );\n\n\t            data.sigBytes = (dataWords.length + 1) * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Shortcuts\n\t            var hash = this._hash;\n\t            var H = hash.words;\n\n\t            // Swap endian\n\t            for (var i = 0; i < 4; i++) {\n\t                // Shortcut\n\t                var H_i = H[i];\n\n\t                H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |\n\t                       (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);\n\t            }\n\n\t            // Return final computed hash\n\t            return hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        }\n\t    });\n\n\t    function FF(a, b, c, d, x, s, t) {\n\t        var n = a + ((b & c) | (~b & d)) + x + t;\n\t        return ((n << s) | (n >>> (32 - s))) + b;\n\t    }\n\n\t    function GG(a, b, c, d, x, s, t) {\n\t        var n = a + ((b & d) | (c & ~d)) + x + t;\n\t        return ((n << s) | (n >>> (32 - s))) + b;\n\t    }\n\n\t    function HH(a, b, c, d, x, s, t) {\n\t        var n = a + (b ^ c ^ d) + x + t;\n\t        return ((n << s) | (n >>> (32 - s))) + b;\n\t    }\n\n\t    function II(a, b, c, d, x, s, t) {\n\t        var n = a + (c ^ (b | ~d)) + x + t;\n\t        return ((n << s) | (n >>> (32 - s))) + b;\n\t    }\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.MD5('message');\n\t     *     var hash = CryptoJS.MD5(wordArray);\n\t     */\n\t    C.MD5 = Hasher._createHelper(MD5);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacMD5(message, key);\n\t     */\n\t    C.HmacMD5 = Hasher._createHmacHelper(MD5);\n\t}(Math));\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_algo = C.algo;\n\n\t    // Reusable object\n\t    var W = [];\n\n\t    /**\n\t     * SHA-1 hash algorithm.\n\t     */\n\t    var SHA1 = C_algo.SHA1 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash = new WordArray.init([\n\t                0x67452301, 0xefcdab89,\n\t                0x98badcfe, 0x10325476,\n\t                0xc3d2e1f0\n\t            ]);\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcut\n\t            var H = this._hash.words;\n\n\t            // Working variables\n\t            var a = H[0];\n\t            var b = H[1];\n\t            var c = H[2];\n\t            var d = H[3];\n\t            var e = H[4];\n\n\t            // Computation\n\t            for (var i = 0; i < 80; i++) {\n\t                if (i < 16) {\n\t                    W[i] = M[offset + i] | 0;\n\t                } else {\n\t                    var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\n\t                    W[i] = (n << 1) | (n >>> 31);\n\t                }\n\n\t                var t = ((a << 5) | (a >>> 27)) + e + W[i];\n\t                if (i < 20) {\n\t                    t += ((b & c) | (~b & d)) + 0x5a827999;\n\t                } else if (i < 40) {\n\t                    t += (b ^ c ^ d) + 0x6ed9eba1;\n\t                } else if (i < 60) {\n\t                    t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;\n\t                } else /* if (i < 80) */ {\n\t                    t += (b ^ c ^ d) - 0x359d3e2a;\n\t                }\n\n\t                e = d;\n\t                d = c;\n\t                c = (b << 30) | (b >>> 2);\n\t                b = a;\n\t                a = t;\n\t            }\n\n\t            // Intermediate hash value\n\t            H[0] = (H[0] + a) | 0;\n\t            H[1] = (H[1] + b) | 0;\n\t            H[2] = (H[2] + c) | 0;\n\t            H[3] = (H[3] + d) | 0;\n\t            H[4] = (H[4] + e) | 0;\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n\t            data.sigBytes = dataWords.length * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Return final computed hash\n\t            return this._hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA1('message');\n\t     *     var hash = CryptoJS.SHA1(wordArray);\n\t     */\n\t    C.SHA1 = Hasher._createHelper(SHA1);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA1(message, key);\n\t     */\n\t    C.HmacSHA1 = Hasher._createHmacHelper(SHA1);\n\t}());\n\n\n\t(function (Math) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_algo = C.algo;\n\n\t    // Initialization and round constants tables\n\t    var H = [];\n\t    var K = [];\n\n\t    // Compute constants\n\t    (function () {\n\t        function isPrime(n) {\n\t            var sqrtN = Math.sqrt(n);\n\t            for (var factor = 2; factor <= sqrtN; factor++) {\n\t                if (!(n % factor)) {\n\t                    return false;\n\t                }\n\t            }\n\n\t            return true;\n\t        }\n\n\t        function getFractionalBits(n) {\n\t            return ((n - (n | 0)) * 0x100000000) | 0;\n\t        }\n\n\t        var n = 2;\n\t        var nPrime = 0;\n\t        while (nPrime < 64) {\n\t            if (isPrime(n)) {\n\t                if (nPrime < 8) {\n\t                    H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));\n\t                }\n\t                K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));\n\n\t                nPrime++;\n\t            }\n\n\t            n++;\n\t        }\n\t    }());\n\n\t    // Reusable object\n\t    var W = [];\n\n\t    /**\n\t     * SHA-256 hash algorithm.\n\t     */\n\t    var SHA256 = C_algo.SHA256 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash = new WordArray.init(H.slice(0));\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcut\n\t            var H = this._hash.words;\n\n\t            // Working variables\n\t            var a = H[0];\n\t            var b = H[1];\n\t            var c = H[2];\n\t            var d = H[3];\n\t            var e = H[4];\n\t            var f = H[5];\n\t            var g = H[6];\n\t            var h = H[7];\n\n\t            // Computation\n\t            for (var i = 0; i < 64; i++) {\n\t                if (i < 16) {\n\t                    W[i] = M[offset + i] | 0;\n\t                } else {\n\t                    var gamma0x = W[i - 15];\n\t                    var gamma0  = ((gamma0x << 25) | (gamma0x >>> 7))  ^\n\t                                  ((gamma0x << 14) | (gamma0x >>> 18)) ^\n\t                                   (gamma0x >>> 3);\n\n\t                    var gamma1x = W[i - 2];\n\t                    var gamma1  = ((gamma1x << 15) | (gamma1x >>> 17)) ^\n\t                                  ((gamma1x << 13) | (gamma1x >>> 19)) ^\n\t                                   (gamma1x >>> 10);\n\n\t                    W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];\n\t                }\n\n\t                var ch  = (e & f) ^ (~e & g);\n\t                var maj = (a & b) ^ (a & c) ^ (b & c);\n\n\t                var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));\n\t                var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7)  | (e >>> 25));\n\n\t                var t1 = h + sigma1 + ch + K[i] + W[i];\n\t                var t2 = sigma0 + maj;\n\n\t                h = g;\n\t                g = f;\n\t                f = e;\n\t                e = (d + t1) | 0;\n\t                d = c;\n\t                c = b;\n\t                b = a;\n\t                a = (t1 + t2) | 0;\n\t            }\n\n\t            // Intermediate hash value\n\t            H[0] = (H[0] + a) | 0;\n\t            H[1] = (H[1] + b) | 0;\n\t            H[2] = (H[2] + c) | 0;\n\t            H[3] = (H[3] + d) | 0;\n\t            H[4] = (H[4] + e) | 0;\n\t            H[5] = (H[5] + f) | 0;\n\t            H[6] = (H[6] + g) | 0;\n\t            H[7] = (H[7] + h) | 0;\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n\t            data.sigBytes = dataWords.length * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Return final computed hash\n\t            return this._hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA256('message');\n\t     *     var hash = CryptoJS.SHA256(wordArray);\n\t     */\n\t    C.SHA256 = Hasher._createHelper(SHA256);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA256(message, key);\n\t     */\n\t    C.HmacSHA256 = Hasher._createHmacHelper(SHA256);\n\t}(Math));\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var C_algo = C.algo;\n\t    var SHA256 = C_algo.SHA256;\n\n\t    /**\n\t     * SHA-224 hash algorithm.\n\t     */\n\t    var SHA224 = C_algo.SHA224 = SHA256.extend({\n\t        _doReset: function () {\n\t            this._hash = new WordArray.init([\n\t                0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,\n\t                0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4\n\t            ]);\n\t        },\n\n\t        _doFinalize: function () {\n\t            var hash = SHA256._doFinalize.call(this);\n\n\t            hash.sigBytes -= 4;\n\n\t            return hash;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA224('message');\n\t     *     var hash = CryptoJS.SHA224(wordArray);\n\t     */\n\t    C.SHA224 = SHA256._createHelper(SHA224);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA224(message, key);\n\t     */\n\t    C.HmacSHA224 = SHA256._createHmacHelper(SHA224);\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_x64 = C.x64;\n\t    var X64Word = C_x64.Word;\n\t    var X64WordArray = C_x64.WordArray;\n\t    var C_algo = C.algo;\n\n\t    function X64Word_create() {\n\t        return X64Word.create.apply(X64Word, arguments);\n\t    }\n\n\t    // Constants\n\t    var K = [\n\t        X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),\n\t        X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),\n\t        X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),\n\t        X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),\n\t        X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),\n\t        X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),\n\t        X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),\n\t        X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),\n\t        X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),\n\t        X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),\n\t        X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),\n\t        X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),\n\t        X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),\n\t        X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),\n\t        X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),\n\t        X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),\n\t        X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),\n\t        X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),\n\t        X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),\n\t        X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),\n\t        X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),\n\t        X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),\n\t        X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),\n\t        X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),\n\t        X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),\n\t        X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),\n\t        X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),\n\t        X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),\n\t        X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),\n\t        X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),\n\t        X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),\n\t        X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),\n\t        X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),\n\t        X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),\n\t        X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),\n\t        X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),\n\t        X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),\n\t        X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),\n\t        X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),\n\t        X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)\n\t    ];\n\n\t    // Reusable objects\n\t    var W = [];\n\t    (function () {\n\t        for (var i = 0; i < 80; i++) {\n\t            W[i] = X64Word_create();\n\t        }\n\t    }());\n\n\t    /**\n\t     * SHA-512 hash algorithm.\n\t     */\n\t    var SHA512 = C_algo.SHA512 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash = new X64WordArray.init([\n\t                new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),\n\t                new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),\n\t                new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),\n\t                new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)\n\t            ]);\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcuts\n\t            var H = this._hash.words;\n\n\t            var H0 = H[0];\n\t            var H1 = H[1];\n\t            var H2 = H[2];\n\t            var H3 = H[3];\n\t            var H4 = H[4];\n\t            var H5 = H[5];\n\t            var H6 = H[6];\n\t            var H7 = H[7];\n\n\t            var H0h = H0.high;\n\t            var H0l = H0.low;\n\t            var H1h = H1.high;\n\t            var H1l = H1.low;\n\t            var H2h = H2.high;\n\t            var H2l = H2.low;\n\t            var H3h = H3.high;\n\t            var H3l = H3.low;\n\t            var H4h = H4.high;\n\t            var H4l = H4.low;\n\t            var H5h = H5.high;\n\t            var H5l = H5.low;\n\t            var H6h = H6.high;\n\t            var H6l = H6.low;\n\t            var H7h = H7.high;\n\t            var H7l = H7.low;\n\n\t            // Working variables\n\t            var ah = H0h;\n\t            var al = H0l;\n\t            var bh = H1h;\n\t            var bl = H1l;\n\t            var ch = H2h;\n\t            var cl = H2l;\n\t            var dh = H3h;\n\t            var dl = H3l;\n\t            var eh = H4h;\n\t            var el = H4l;\n\t            var fh = H5h;\n\t            var fl = H5l;\n\t            var gh = H6h;\n\t            var gl = H6l;\n\t            var hh = H7h;\n\t            var hl = H7l;\n\n\t            // Rounds\n\t            for (var i = 0; i < 80; i++) {\n\t                var Wil;\n\t                var Wih;\n\n\t                // Shortcut\n\t                var Wi = W[i];\n\n\t                // Extend message\n\t                if (i < 16) {\n\t                    Wih = Wi.high = M[offset + i * 2]     | 0;\n\t                    Wil = Wi.low  = M[offset + i * 2 + 1] | 0;\n\t                } else {\n\t                    // Gamma0\n\t                    var gamma0x  = W[i - 15];\n\t                    var gamma0xh = gamma0x.high;\n\t                    var gamma0xl = gamma0x.low;\n\t                    var gamma0h  = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);\n\t                    var gamma0l  = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));\n\n\t                    // Gamma1\n\t                    var gamma1x  = W[i - 2];\n\t                    var gamma1xh = gamma1x.high;\n\t                    var gamma1xl = gamma1x.low;\n\t                    var gamma1h  = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);\n\t                    var gamma1l  = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));\n\n\t                    // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]\n\t                    var Wi7  = W[i - 7];\n\t                    var Wi7h = Wi7.high;\n\t                    var Wi7l = Wi7.low;\n\n\t                    var Wi16  = W[i - 16];\n\t                    var Wi16h = Wi16.high;\n\t                    var Wi16l = Wi16.low;\n\n\t                    Wil = gamma0l + Wi7l;\n\t                    Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);\n\t                    Wil = Wil + gamma1l;\n\t                    Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);\n\t                    Wil = Wil + Wi16l;\n\t                    Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);\n\n\t                    Wi.high = Wih;\n\t                    Wi.low  = Wil;\n\t                }\n\n\t                var chh  = (eh & fh) ^ (~eh & gh);\n\t                var chl  = (el & fl) ^ (~el & gl);\n\t                var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);\n\t                var majl = (al & bl) ^ (al & cl) ^ (bl & cl);\n\n\t                var sigma0h = ((ah >>> 28) | (al << 4))  ^ ((ah << 30)  | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));\n\t                var sigma0l = ((al >>> 28) | (ah << 4))  ^ ((al << 30)  | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));\n\t                var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));\n\t                var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));\n\n\t                // t1 = h + sigma1 + ch + K[i] + W[i]\n\t                var Ki  = K[i];\n\t                var Kih = Ki.high;\n\t                var Kil = Ki.low;\n\n\t                var t1l = hl + sigma1l;\n\t                var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);\n\t                var t1l = t1l + chl;\n\t                var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);\n\t                var t1l = t1l + Kil;\n\t                var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);\n\t                var t1l = t1l + Wil;\n\t                var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);\n\n\t                // t2 = sigma0 + maj\n\t                var t2l = sigma0l + majl;\n\t                var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);\n\n\t                // Update working variables\n\t                hh = gh;\n\t                hl = gl;\n\t                gh = fh;\n\t                gl = fl;\n\t                fh = eh;\n\t                fl = el;\n\t                el = (dl + t1l) | 0;\n\t                eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;\n\t                dh = ch;\n\t                dl = cl;\n\t                ch = bh;\n\t                cl = bl;\n\t                bh = ah;\n\t                bl = al;\n\t                al = (t1l + t2l) | 0;\n\t                ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;\n\t            }\n\n\t            // Intermediate hash value\n\t            H0l = H0.low  = (H0l + al);\n\t            H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));\n\t            H1l = H1.low  = (H1l + bl);\n\t            H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));\n\t            H2l = H2.low  = (H2l + cl);\n\t            H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));\n\t            H3l = H3.low  = (H3l + dl);\n\t            H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));\n\t            H4l = H4.low  = (H4l + el);\n\t            H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));\n\t            H5l = H5.low  = (H5l + fl);\n\t            H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));\n\t            H6l = H6.low  = (H6l + gl);\n\t            H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));\n\t            H7l = H7.low  = (H7l + hl);\n\t            H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t            dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);\n\t            dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;\n\t            data.sigBytes = dataWords.length * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Convert hash to 32-bit word array before returning\n\t            var hash = this._hash.toX32();\n\n\t            // Return final computed hash\n\t            return hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        },\n\n\t        blockSize: 1024/32\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA512('message');\n\t     *     var hash = CryptoJS.SHA512(wordArray);\n\t     */\n\t    C.SHA512 = Hasher._createHelper(SHA512);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA512(message, key);\n\t     */\n\t    C.HmacSHA512 = Hasher._createHmacHelper(SHA512);\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_x64 = C.x64;\n\t    var X64Word = C_x64.Word;\n\t    var X64WordArray = C_x64.WordArray;\n\t    var C_algo = C.algo;\n\t    var SHA512 = C_algo.SHA512;\n\n\t    /**\n\t     * SHA-384 hash algorithm.\n\t     */\n\t    var SHA384 = C_algo.SHA384 = SHA512.extend({\n\t        _doReset: function () {\n\t            this._hash = new X64WordArray.init([\n\t                new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507),\n\t                new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939),\n\t                new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511),\n\t                new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4)\n\t            ]);\n\t        },\n\n\t        _doFinalize: function () {\n\t            var hash = SHA512._doFinalize.call(this);\n\n\t            hash.sigBytes -= 16;\n\n\t            return hash;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA384('message');\n\t     *     var hash = CryptoJS.SHA384(wordArray);\n\t     */\n\t    C.SHA384 = SHA512._createHelper(SHA384);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA384(message, key);\n\t     */\n\t    C.HmacSHA384 = SHA512._createHmacHelper(SHA384);\n\t}());\n\n\n\t(function (Math) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_x64 = C.x64;\n\t    var X64Word = C_x64.Word;\n\t    var C_algo = C.algo;\n\n\t    // Constants tables\n\t    var RHO_OFFSETS = [];\n\t    var PI_INDEXES  = [];\n\t    var ROUND_CONSTANTS = [];\n\n\t    // Compute Constants\n\t    (function () {\n\t        // Compute rho offset constants\n\t        var x = 1, y = 0;\n\t        for (var t = 0; t < 24; t++) {\n\t            RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;\n\n\t            var newX = y % 5;\n\t            var newY = (2 * x + 3 * y) % 5;\n\t            x = newX;\n\t            y = newY;\n\t        }\n\n\t        // Compute pi index constants\n\t        for (var x = 0; x < 5; x++) {\n\t            for (var y = 0; y < 5; y++) {\n\t                PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;\n\t            }\n\t        }\n\n\t        // Compute round constants\n\t        var LFSR = 0x01;\n\t        for (var i = 0; i < 24; i++) {\n\t            var roundConstantMsw = 0;\n\t            var roundConstantLsw = 0;\n\n\t            for (var j = 0; j < 7; j++) {\n\t                if (LFSR & 0x01) {\n\t                    var bitPosition = (1 << j) - 1;\n\t                    if (bitPosition < 32) {\n\t                        roundConstantLsw ^= 1 << bitPosition;\n\t                    } else /* if (bitPosition >= 32) */ {\n\t                        roundConstantMsw ^= 1 << (bitPosition - 32);\n\t                    }\n\t                }\n\n\t                // Compute next LFSR\n\t                if (LFSR & 0x80) {\n\t                    // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1\n\t                    LFSR = (LFSR << 1) ^ 0x71;\n\t                } else {\n\t                    LFSR <<= 1;\n\t                }\n\t            }\n\n\t            ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);\n\t        }\n\t    }());\n\n\t    // Reusable objects for temporary values\n\t    var T = [];\n\t    (function () {\n\t        for (var i = 0; i < 25; i++) {\n\t            T[i] = X64Word.create();\n\t        }\n\t    }());\n\n\t    /**\n\t     * SHA-3 hash algorithm.\n\t     */\n\t    var SHA3 = C_algo.SHA3 = Hasher.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {number} outputLength\n\t         *   The desired number of bits in the output hash.\n\t         *   Only values permitted are: 224, 256, 384, 512.\n\t         *   Default: 512\n\t         */\n\t        cfg: Hasher.cfg.extend({\n\t            outputLength: 512\n\t        }),\n\n\t        _doReset: function () {\n\t            var state = this._state = []\n\t            for (var i = 0; i < 25; i++) {\n\t                state[i] = new X64Word.init();\n\t            }\n\n\t            this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcuts\n\t            var state = this._state;\n\t            var nBlockSizeLanes = this.blockSize / 2;\n\n\t            // Absorb\n\t            for (var i = 0; i < nBlockSizeLanes; i++) {\n\t                // Shortcuts\n\t                var M2i  = M[offset + 2 * i];\n\t                var M2i1 = M[offset + 2 * i + 1];\n\n\t                // Swap endian\n\t                M2i = (\n\t                    (((M2i << 8)  | (M2i >>> 24)) & 0x00ff00ff) |\n\t                    (((M2i << 24) | (M2i >>> 8))  & 0xff00ff00)\n\t                );\n\t                M2i1 = (\n\t                    (((M2i1 << 8)  | (M2i1 >>> 24)) & 0x00ff00ff) |\n\t                    (((M2i1 << 24) | (M2i1 >>> 8))  & 0xff00ff00)\n\t                );\n\n\t                // Absorb message into state\n\t                var lane = state[i];\n\t                lane.high ^= M2i1;\n\t                lane.low  ^= M2i;\n\t            }\n\n\t            // Rounds\n\t            for (var round = 0; round < 24; round++) {\n\t                // Theta\n\t                for (var x = 0; x < 5; x++) {\n\t                    // Mix column lanes\n\t                    var tMsw = 0, tLsw = 0;\n\t                    for (var y = 0; y < 5; y++) {\n\t                        var lane = state[x + 5 * y];\n\t                        tMsw ^= lane.high;\n\t                        tLsw ^= lane.low;\n\t                    }\n\n\t                    // Temporary values\n\t                    var Tx = T[x];\n\t                    Tx.high = tMsw;\n\t                    Tx.low  = tLsw;\n\t                }\n\t                for (var x = 0; x < 5; x++) {\n\t                    // Shortcuts\n\t                    var Tx4 = T[(x + 4) % 5];\n\t                    var Tx1 = T[(x + 1) % 5];\n\t                    var Tx1Msw = Tx1.high;\n\t                    var Tx1Lsw = Tx1.low;\n\n\t                    // Mix surrounding columns\n\t                    var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));\n\t                    var tLsw = Tx4.low  ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));\n\t                    for (var y = 0; y < 5; y++) {\n\t                        var lane = state[x + 5 * y];\n\t                        lane.high ^= tMsw;\n\t                        lane.low  ^= tLsw;\n\t                    }\n\t                }\n\n\t                // Rho Pi\n\t                for (var laneIndex = 1; laneIndex < 25; laneIndex++) {\n\t                    var tMsw;\n\t                    var tLsw;\n\n\t                    // Shortcuts\n\t                    var lane = state[laneIndex];\n\t                    var laneMsw = lane.high;\n\t                    var laneLsw = lane.low;\n\t                    var rhoOffset = RHO_OFFSETS[laneIndex];\n\n\t                    // Rotate lanes\n\t                    if (rhoOffset < 32) {\n\t                        tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));\n\t                        tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));\n\t                    } else /* if (rhoOffset >= 32) */ {\n\t                        tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));\n\t                        tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));\n\t                    }\n\n\t                    // Transpose lanes\n\t                    var TPiLane = T[PI_INDEXES[laneIndex]];\n\t                    TPiLane.high = tMsw;\n\t                    TPiLane.low  = tLsw;\n\t                }\n\n\t                // Rho pi at x = y = 0\n\t                var T0 = T[0];\n\t                var state0 = state[0];\n\t                T0.high = state0.high;\n\t                T0.low  = state0.low;\n\n\t                // Chi\n\t                for (var x = 0; x < 5; x++) {\n\t                    for (var y = 0; y < 5; y++) {\n\t                        // Shortcuts\n\t                        var laneIndex = x + 5 * y;\n\t                        var lane = state[laneIndex];\n\t                        var TLane = T[laneIndex];\n\t                        var Tx1Lane = T[((x + 1) % 5) + 5 * y];\n\t                        var Tx2Lane = T[((x + 2) % 5) + 5 * y];\n\n\t                        // Mix rows\n\t                        lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);\n\t                        lane.low  = TLane.low  ^ (~Tx1Lane.low  & Tx2Lane.low);\n\t                    }\n\t                }\n\n\t                // Iota\n\t                var lane = state[0];\n\t                var roundConstant = ROUND_CONSTANTS[round];\n\t                lane.high ^= roundConstant.high;\n\t                lane.low  ^= roundConstant.low;\n\t            }\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\t            var blockSizeBits = this.blockSize * 32;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);\n\t            dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;\n\t            data.sigBytes = dataWords.length * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Shortcuts\n\t            var state = this._state;\n\t            var outputLengthBytes = this.cfg.outputLength / 8;\n\t            var outputLengthLanes = outputLengthBytes / 8;\n\n\t            // Squeeze\n\t            var hashWords = [];\n\t            for (var i = 0; i < outputLengthLanes; i++) {\n\t                // Shortcuts\n\t                var lane = state[i];\n\t                var laneMsw = lane.high;\n\t                var laneLsw = lane.low;\n\n\t                // Swap endian\n\t                laneMsw = (\n\t                    (((laneMsw << 8)  | (laneMsw >>> 24)) & 0x00ff00ff) |\n\t                    (((laneMsw << 24) | (laneMsw >>> 8))  & 0xff00ff00)\n\t                );\n\t                laneLsw = (\n\t                    (((laneLsw << 8)  | (laneLsw >>> 24)) & 0x00ff00ff) |\n\t                    (((laneLsw << 24) | (laneLsw >>> 8))  & 0xff00ff00)\n\t                );\n\n\t                // Squeeze state to retrieve hash\n\t                hashWords.push(laneLsw);\n\t                hashWords.push(laneMsw);\n\t            }\n\n\t            // Return final computed hash\n\t            return new WordArray.init(hashWords, outputLengthBytes);\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\n\t            var state = clone._state = this._state.slice(0);\n\t            for (var i = 0; i < 25; i++) {\n\t                state[i] = state[i].clone();\n\t            }\n\n\t            return clone;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA3('message');\n\t     *     var hash = CryptoJS.SHA3(wordArray);\n\t     */\n\t    C.SHA3 = Hasher._createHelper(SHA3);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA3(message, key);\n\t     */\n\t    C.HmacSHA3 = Hasher._createHmacHelper(SHA3);\n\t}(Math));\n\n\n\t/** @preserve\n\t(c) 2012 by Cédric Mesnil. All rights reserved.\n\n\tRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n\t    - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\t    - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n\tTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t*/\n\n\t(function (Math) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_algo = C.algo;\n\n\t    // Constants table\n\t    var _zl = WordArray.create([\n\t        0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,\n\t        7,  4, 13,  1, 10,  6, 15,  3, 12,  0,  9,  5,  2, 14, 11,  8,\n\t        3, 10, 14,  4,  9, 15,  8,  1,  2,  7,  0,  6, 13, 11,  5, 12,\n\t        1,  9, 11, 10,  0,  8, 12,  4, 13,  3,  7, 15, 14,  5,  6,  2,\n\t        4,  0,  5,  9,  7, 12,  2, 10, 14,  1,  3,  8, 11,  6, 15, 13]);\n\t    var _zr = WordArray.create([\n\t        5, 14,  7,  0,  9,  2, 11,  4, 13,  6, 15,  8,  1, 10,  3, 12,\n\t        6, 11,  3,  7,  0, 13,  5, 10, 14, 15,  8, 12,  4,  9,  1,  2,\n\t        15,  5,  1,  3,  7, 14,  6,  9, 11,  8, 12,  2, 10,  0,  4, 13,\n\t        8,  6,  4,  1,  3, 11, 15,  0,  5, 12,  2, 13,  9,  7, 10, 14,\n\t        12, 15, 10,  4,  1,  5,  8,  7,  6,  2, 13, 14,  0,  3,  9, 11]);\n\t    var _sl = WordArray.create([\n\t         11, 14, 15, 12,  5,  8,  7,  9, 11, 13, 14, 15,  6,  7,  9,  8,\n\t        7, 6,   8, 13, 11,  9,  7, 15,  7, 12, 15,  9, 11,  7, 13, 12,\n\t        11, 13,  6,  7, 14,  9, 13, 15, 14,  8, 13,  6,  5, 12,  7,  5,\n\t          11, 12, 14, 15, 14, 15,  9,  8,  9, 14,  5,  6,  8,  6,  5, 12,\n\t        9, 15,  5, 11,  6,  8, 13, 12,  5, 12, 13, 14, 11,  8,  5,  6 ]);\n\t    var _sr = WordArray.create([\n\t        8,  9,  9, 11, 13, 15, 15,  5,  7,  7,  8, 11, 14, 14, 12,  6,\n\t        9, 13, 15,  7, 12,  8,  9, 11,  7,  7, 12,  7,  6, 15, 13, 11,\n\t        9,  7, 15, 11,  8,  6,  6, 14, 12, 13,  5, 14, 13, 13,  7,  5,\n\t        15,  5,  8, 11, 14, 14,  6, 14,  6,  9, 12,  9, 12,  5, 15,  8,\n\t        8,  5, 12,  9, 12,  5, 14,  6,  8, 13,  6,  5, 15, 13, 11, 11 ]);\n\n\t    var _hl =  WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]);\n\t    var _hr =  WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]);\n\n\t    /**\n\t     * RIPEMD160 hash algorithm.\n\t     */\n\t    var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash  = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\n\t            // Swap endian\n\t            for (var i = 0; i < 16; i++) {\n\t                // Shortcuts\n\t                var offset_i = offset + i;\n\t                var M_offset_i = M[offset_i];\n\n\t                // Swap\n\t                M[offset_i] = (\n\t                    (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |\n\t                    (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)\n\t                );\n\t            }\n\t            // Shortcut\n\t            var H  = this._hash.words;\n\t            var hl = _hl.words;\n\t            var hr = _hr.words;\n\t            var zl = _zl.words;\n\t            var zr = _zr.words;\n\t            var sl = _sl.words;\n\t            var sr = _sr.words;\n\n\t            // Working variables\n\t            var al, bl, cl, dl, el;\n\t            var ar, br, cr, dr, er;\n\n\t            ar = al = H[0];\n\t            br = bl = H[1];\n\t            cr = cl = H[2];\n\t            dr = dl = H[3];\n\t            er = el = H[4];\n\t            // Computation\n\t            var t;\n\t            for (var i = 0; i < 80; i += 1) {\n\t                t = (al +  M[offset+zl[i]])|0;\n\t                if (i<16){\n\t\t            t +=  f1(bl,cl,dl) + hl[0];\n\t                } else if (i<32) {\n\t\t            t +=  f2(bl,cl,dl) + hl[1];\n\t                } else if (i<48) {\n\t\t            t +=  f3(bl,cl,dl) + hl[2];\n\t                } else if (i<64) {\n\t\t            t +=  f4(bl,cl,dl) + hl[3];\n\t                } else {// if (i<80) {\n\t\t            t +=  f5(bl,cl,dl) + hl[4];\n\t                }\n\t                t = t|0;\n\t                t =  rotl(t,sl[i]);\n\t                t = (t+el)|0;\n\t                al = el;\n\t                el = dl;\n\t                dl = rotl(cl, 10);\n\t                cl = bl;\n\t                bl = t;\n\n\t                t = (ar + M[offset+zr[i]])|0;\n\t                if (i<16){\n\t\t            t +=  f5(br,cr,dr) + hr[0];\n\t                } else if (i<32) {\n\t\t            t +=  f4(br,cr,dr) + hr[1];\n\t                } else if (i<48) {\n\t\t            t +=  f3(br,cr,dr) + hr[2];\n\t                } else if (i<64) {\n\t\t            t +=  f2(br,cr,dr) + hr[3];\n\t                } else {// if (i<80) {\n\t\t            t +=  f1(br,cr,dr) + hr[4];\n\t                }\n\t                t = t|0;\n\t                t =  rotl(t,sr[i]) ;\n\t                t = (t+er)|0;\n\t                ar = er;\n\t                er = dr;\n\t                dr = rotl(cr, 10);\n\t                cr = br;\n\t                br = t;\n\t            }\n\t            // Intermediate hash value\n\t            t    = (H[1] + cl + dr)|0;\n\t            H[1] = (H[2] + dl + er)|0;\n\t            H[2] = (H[3] + el + ar)|0;\n\t            H[3] = (H[4] + al + br)|0;\n\t            H[4] = (H[0] + bl + cr)|0;\n\t            H[0] =  t;\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\n\t                (((nBitsTotal << 8)  | (nBitsTotal >>> 24)) & 0x00ff00ff) |\n\t                (((nBitsTotal << 24) | (nBitsTotal >>> 8))  & 0xff00ff00)\n\t            );\n\t            data.sigBytes = (dataWords.length + 1) * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Shortcuts\n\t            var hash = this._hash;\n\t            var H = hash.words;\n\n\t            // Swap endian\n\t            for (var i = 0; i < 5; i++) {\n\t                // Shortcut\n\t                var H_i = H[i];\n\n\t                // Swap\n\t                H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |\n\t                       (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);\n\t            }\n\n\t            // Return final computed hash\n\t            return hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        }\n\t    });\n\n\n\t    function f1(x, y, z) {\n\t        return ((x) ^ (y) ^ (z));\n\n\t    }\n\n\t    function f2(x, y, z) {\n\t        return (((x)&(y)) | ((~x)&(z)));\n\t    }\n\n\t    function f3(x, y, z) {\n\t        return (((x) | (~(y))) ^ (z));\n\t    }\n\n\t    function f4(x, y, z) {\n\t        return (((x) & (z)) | ((y)&(~(z))));\n\t    }\n\n\t    function f5(x, y, z) {\n\t        return ((x) ^ ((y) |(~(z))));\n\n\t    }\n\n\t    function rotl(x,n) {\n\t        return (x<<n) | (x>>>(32-n));\n\t    }\n\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.RIPEMD160('message');\n\t     *     var hash = CryptoJS.RIPEMD160(wordArray);\n\t     */\n\t    C.RIPEMD160 = Hasher._createHelper(RIPEMD160);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacRIPEMD160(message, key);\n\t     */\n\t    C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);\n\t}(Math));\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Base = C_lib.Base;\n\t    var C_enc = C.enc;\n\t    var Utf8 = C_enc.Utf8;\n\t    var C_algo = C.algo;\n\n\t    /**\n\t     * HMAC algorithm.\n\t     */\n\t    var HMAC = C_algo.HMAC = Base.extend({\n\t        /**\n\t         * Initializes a newly created HMAC.\n\t         *\n\t         * @param {Hasher} hasher The hash algorithm to use.\n\t         * @param {WordArray|string} key The secret key.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n\t         */\n\t        init: function (hasher, key) {\n\t            // Init hasher\n\t            hasher = this._hasher = new hasher.init();\n\n\t            // Convert string to WordArray, else assume WordArray already\n\t            if (typeof key == 'string') {\n\t                key = Utf8.parse(key);\n\t            }\n\n\t            // Shortcuts\n\t            var hasherBlockSize = hasher.blockSize;\n\t            var hasherBlockSizeBytes = hasherBlockSize * 4;\n\n\t            // Allow arbitrary length keys\n\t            if (key.sigBytes > hasherBlockSizeBytes) {\n\t                key = hasher.finalize(key);\n\t            }\n\n\t            // Clamp excess bits\n\t            key.clamp();\n\n\t            // Clone key for inner and outer pads\n\t            var oKey = this._oKey = key.clone();\n\t            var iKey = this._iKey = key.clone();\n\n\t            // Shortcuts\n\t            var oKeyWords = oKey.words;\n\t            var iKeyWords = iKey.words;\n\n\t            // XOR keys with pad constants\n\t            for (var i = 0; i < hasherBlockSize; i++) {\n\t                oKeyWords[i] ^= 0x5c5c5c5c;\n\t                iKeyWords[i] ^= 0x36363636;\n\t            }\n\t            oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\n\n\t            // Set initial values\n\t            this.reset();\n\t        },\n\n\t        /**\n\t         * Resets this HMAC to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     hmacHasher.reset();\n\t         */\n\t        reset: function () {\n\t            // Shortcut\n\t            var hasher = this._hasher;\n\n\t            // Reset\n\t            hasher.reset();\n\t            hasher.update(this._iKey);\n\t        },\n\n\t        /**\n\t         * Updates this HMAC with a message.\n\t         *\n\t         * @param {WordArray|string} messageUpdate The message to append.\n\t         *\n\t         * @return {HMAC} This HMAC instance.\n\t         *\n\t         * @example\n\t         *\n\t         *     hmacHasher.update('message');\n\t         *     hmacHasher.update(wordArray);\n\t         */\n\t        update: function (messageUpdate) {\n\t            this._hasher.update(messageUpdate);\n\n\t            // Chainable\n\t            return this;\n\t        },\n\n\t        /**\n\t         * Finalizes the HMAC computation.\n\t         * Note that the finalize operation is effectively a destructive, read-once operation.\n\t         *\n\t         * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t         *\n\t         * @return {WordArray} The HMAC.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hmac = hmacHasher.finalize();\n\t         *     var hmac = hmacHasher.finalize('message');\n\t         *     var hmac = hmacHasher.finalize(wordArray);\n\t         */\n\t        finalize: function (messageUpdate) {\n\t            // Shortcut\n\t            var hasher = this._hasher;\n\n\t            // Compute HMAC\n\t            var innerHash = hasher.finalize(messageUpdate);\n\t            hasher.reset();\n\t            var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n\t            return hmac;\n\t        }\n\t    });\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Base = C_lib.Base;\n\t    var WordArray = C_lib.WordArray;\n\t    var C_algo = C.algo;\n\t    var SHA1 = C_algo.SHA1;\n\t    var HMAC = C_algo.HMAC;\n\n\t    /**\n\t     * Password-Based Key Derivation Function 2 algorithm.\n\t     */\n\t    var PBKDF2 = C_algo.PBKDF2 = Base.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n\t         * @property {Hasher} hasher The hasher to use. Default: SHA1\n\t         * @property {number} iterations The number of iterations to perform. Default: 1\n\t         */\n\t        cfg: Base.extend({\n\t            keySize: 128/32,\n\t            hasher: SHA1,\n\t            iterations: 1\n\t        }),\n\n\t        /**\n\t         * Initializes a newly created key derivation function.\n\t         *\n\t         * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n\t         *\n\t         * @example\n\t         *\n\t         *     var kdf = CryptoJS.algo.PBKDF2.create();\n\t         *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });\n\t         *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });\n\t         */\n\t        init: function (cfg) {\n\t            this.cfg = this.cfg.extend(cfg);\n\t        },\n\n\t        /**\n\t         * Computes the Password-Based Key Derivation Function 2.\n\t         *\n\t         * @param {WordArray|string} password The password.\n\t         * @param {WordArray|string} salt A salt.\n\t         *\n\t         * @return {WordArray} The derived key.\n\t         *\n\t         * @example\n\t         *\n\t         *     var key = kdf.compute(password, salt);\n\t         */\n\t        compute: function (password, salt) {\n\t            // Shortcut\n\t            var cfg = this.cfg;\n\n\t            // Init HMAC\n\t            var hmac = HMAC.create(cfg.hasher, password);\n\n\t            // Initial values\n\t            var derivedKey = WordArray.create();\n\t            var blockIndex = WordArray.create([0x00000001]);\n\n\t            // Shortcuts\n\t            var derivedKeyWords = derivedKey.words;\n\t            var blockIndexWords = blockIndex.words;\n\t            var keySize = cfg.keySize;\n\t            var iterations = cfg.iterations;\n\n\t            // Generate key\n\t            while (derivedKeyWords.length < keySize) {\n\t                var block = hmac.update(salt).finalize(blockIndex);\n\t                hmac.reset();\n\n\t                // Shortcuts\n\t                var blockWords = block.words;\n\t                var blockWordsLength = blockWords.length;\n\n\t                // Iterations\n\t                var intermediate = block;\n\t                for (var i = 1; i < iterations; i++) {\n\t                    intermediate = hmac.finalize(intermediate);\n\t                    hmac.reset();\n\n\t                    // Shortcut\n\t                    var intermediateWords = intermediate.words;\n\n\t                    // XOR intermediate with block\n\t                    for (var j = 0; j < blockWordsLength; j++) {\n\t                        blockWords[j] ^= intermediateWords[j];\n\t                    }\n\t                }\n\n\t                derivedKey.concat(block);\n\t                blockIndexWords[0]++;\n\t            }\n\t            derivedKey.sigBytes = keySize * 4;\n\n\t            return derivedKey;\n\t        }\n\t    });\n\n\t    /**\n\t     * Computes the Password-Based Key Derivation Function 2.\n\t     *\n\t     * @param {WordArray|string} password The password.\n\t     * @param {WordArray|string} salt A salt.\n\t     * @param {Object} cfg (Optional) The configuration options to use for this computation.\n\t     *\n\t     * @return {WordArray} The derived key.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var key = CryptoJS.PBKDF2(password, salt);\n\t     *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });\n\t     *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });\n\t     */\n\t    C.PBKDF2 = function (password, salt, cfg) {\n\t        return PBKDF2.create(cfg).compute(password, salt);\n\t    };\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Base = C_lib.Base;\n\t    var WordArray = C_lib.WordArray;\n\t    var C_algo = C.algo;\n\t    var MD5 = C_algo.MD5;\n\n\t    /**\n\t     * This key derivation function is meant to conform with EVP_BytesToKey.\n\t     * www.openssl.org/docs/crypto/EVP_BytesToKey.html\n\t     */\n\t    var EvpKDF = C_algo.EvpKDF = Base.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n\t         * @property {Hasher} hasher The hash algorithm to use. Default: MD5\n\t         * @property {number} iterations The number of iterations to perform. Default: 1\n\t         */\n\t        cfg: Base.extend({\n\t            keySize: 128/32,\n\t            hasher: MD5,\n\t            iterations: 1\n\t        }),\n\n\t        /**\n\t         * Initializes a newly created key derivation function.\n\t         *\n\t         * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n\t         *\n\t         * @example\n\t         *\n\t         *     var kdf = CryptoJS.algo.EvpKDF.create();\n\t         *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });\n\t         *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });\n\t         */\n\t        init: function (cfg) {\n\t            this.cfg = this.cfg.extend(cfg);\n\t        },\n\n\t        /**\n\t         * Derives a key from a password.\n\t         *\n\t         * @param {WordArray|string} password The password.\n\t         * @param {WordArray|string} salt A salt.\n\t         *\n\t         * @return {WordArray} The derived key.\n\t         *\n\t         * @example\n\t         *\n\t         *     var key = kdf.compute(password, salt);\n\t         */\n\t        compute: function (password, salt) {\n\t            var block;\n\n\t            // Shortcut\n\t            var cfg = this.cfg;\n\n\t            // Init hasher\n\t            var hasher = cfg.hasher.create();\n\n\t            // Initial values\n\t            var derivedKey = WordArray.create();\n\n\t            // Shortcuts\n\t            var derivedKeyWords = derivedKey.words;\n\t            var keySize = cfg.keySize;\n\t            var iterations = cfg.iterations;\n\n\t            // Generate key\n\t            while (derivedKeyWords.length < keySize) {\n\t                if (block) {\n\t                    hasher.update(block);\n\t                }\n\t                block = hasher.update(password).finalize(salt);\n\t                hasher.reset();\n\n\t                // Iterations\n\t                for (var i = 1; i < iterations; i++) {\n\t                    block = hasher.finalize(block);\n\t                    hasher.reset();\n\t                }\n\n\t                derivedKey.concat(block);\n\t            }\n\t            derivedKey.sigBytes = keySize * 4;\n\n\t            return derivedKey;\n\t        }\n\t    });\n\n\t    /**\n\t     * Derives a key from a password.\n\t     *\n\t     * @param {WordArray|string} password The password.\n\t     * @param {WordArray|string} salt A salt.\n\t     * @param {Object} cfg (Optional) The configuration options to use for this computation.\n\t     *\n\t     * @return {WordArray} The derived key.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var key = CryptoJS.EvpKDF(password, salt);\n\t     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });\n\t     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });\n\t     */\n\t    C.EvpKDF = function (password, salt, cfg) {\n\t        return EvpKDF.create(cfg).compute(password, salt);\n\t    };\n\t}());\n\n\n\t/**\n\t * Cipher core components.\n\t */\n\tCryptoJS.lib.Cipher || (function (undefined) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Base = C_lib.Base;\n\t    var WordArray = C_lib.WordArray;\n\t    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;\n\t    var C_enc = C.enc;\n\t    var Utf8 = C_enc.Utf8;\n\t    var Base64 = C_enc.Base64;\n\t    var C_algo = C.algo;\n\t    var EvpKDF = C_algo.EvpKDF;\n\n\t    /**\n\t     * Abstract base cipher template.\n\t     *\n\t     * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\n\t     * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\n\t     * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\n\t     * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\n\t     */\n\t    var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {WordArray} iv The IV to use for this operation.\n\t         */\n\t        cfg: Base.extend(),\n\n\t        /**\n\t         * Creates this cipher in encryption mode.\n\t         *\n\t         * @param {WordArray} key The key.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {Cipher} A cipher instance.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\n\t         */\n\t        createEncryptor: function (key, cfg) {\n\t            return this.create(this._ENC_XFORM_MODE, key, cfg);\n\t        },\n\n\t        /**\n\t         * Creates this cipher in decryption mode.\n\t         *\n\t         * @param {WordArray} key The key.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {Cipher} A cipher instance.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\n\t         */\n\t        createDecryptor: function (key, cfg) {\n\t            return this.create(this._DEC_XFORM_MODE, key, cfg);\n\t        },\n\n\t        /**\n\t         * Initializes a newly created cipher.\n\t         *\n\t         * @param {number} xformMode Either the encryption or decryption transormation mode constant.\n\t         * @param {WordArray} key The key.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });\n\t         */\n\t        init: function (xformMode, key, cfg) {\n\t            // Apply config defaults\n\t            this.cfg = this.cfg.extend(cfg);\n\n\t            // Store transform mode and key\n\t            this._xformMode = xformMode;\n\t            this._key = key;\n\n\t            // Set initial values\n\t            this.reset();\n\t        },\n\n\t        /**\n\t         * Resets this cipher to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     cipher.reset();\n\t         */\n\t        reset: function () {\n\t            // Reset data buffer\n\t            BufferedBlockAlgorithm.reset.call(this);\n\n\t            // Perform concrete-cipher logic\n\t            this._doReset();\n\t        },\n\n\t        /**\n\t         * Adds data to be encrypted or decrypted.\n\t         *\n\t         * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\n\t         *\n\t         * @return {WordArray} The data after processing.\n\t         *\n\t         * @example\n\t         *\n\t         *     var encrypted = cipher.process('data');\n\t         *     var encrypted = cipher.process(wordArray);\n\t         */\n\t        process: function (dataUpdate) {\n\t            // Append\n\t            this._append(dataUpdate);\n\n\t            // Process available blocks\n\t            return this._process();\n\t        },\n\n\t        /**\n\t         * Finalizes the encryption or decryption process.\n\t         * Note that the finalize operation is effectively a destructive, read-once operation.\n\t         *\n\t         * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\n\t         *\n\t         * @return {WordArray} The data after final processing.\n\t         *\n\t         * @example\n\t         *\n\t         *     var encrypted = cipher.finalize();\n\t         *     var encrypted = cipher.finalize('data');\n\t         *     var encrypted = cipher.finalize(wordArray);\n\t         */\n\t        finalize: function (dataUpdate) {\n\t            // Final data update\n\t            if (dataUpdate) {\n\t                this._append(dataUpdate);\n\t            }\n\n\t            // Perform concrete-cipher logic\n\t            var finalProcessedData = this._doFinalize();\n\n\t            return finalProcessedData;\n\t        },\n\n\t        keySize: 128/32,\n\n\t        ivSize: 128/32,\n\n\t        _ENC_XFORM_MODE: 1,\n\n\t        _DEC_XFORM_MODE: 2,\n\n\t        /**\n\t         * Creates shortcut functions to a cipher's object interface.\n\t         *\n\t         * @param {Cipher} cipher The cipher to create a helper for.\n\t         *\n\t         * @return {Object} An object with encrypt and decrypt shortcut functions.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\n\t         */\n\t        _createHelper: (function () {\n\t            function selectCipherStrategy(key) {\n\t                if (typeof key == 'string') {\n\t                    return PasswordBasedCipher;\n\t                } else {\n\t                    return SerializableCipher;\n\t                }\n\t            }\n\n\t            return function (cipher) {\n\t                return {\n\t                    encrypt: function (message, key, cfg) {\n\t                        return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);\n\t                    },\n\n\t                    decrypt: function (ciphertext, key, cfg) {\n\t                        return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);\n\t                    }\n\t                };\n\t            };\n\t        }())\n\t    });\n\n\t    /**\n\t     * Abstract base stream cipher template.\n\t     *\n\t     * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\n\t     */\n\t    var StreamCipher = C_lib.StreamCipher = Cipher.extend({\n\t        _doFinalize: function () {\n\t            // Process partial blocks\n\t            var finalProcessedBlocks = this._process(!!'flush');\n\n\t            return finalProcessedBlocks;\n\t        },\n\n\t        blockSize: 1\n\t    });\n\n\t    /**\n\t     * Mode namespace.\n\t     */\n\t    var C_mode = C.mode = {};\n\n\t    /**\n\t     * Abstract base block cipher mode template.\n\t     */\n\t    var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({\n\t        /**\n\t         * Creates this mode for encryption.\n\t         *\n\t         * @param {Cipher} cipher A block cipher instance.\n\t         * @param {Array} iv The IV words.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\n\t         */\n\t        createEncryptor: function (cipher, iv) {\n\t            return this.Encryptor.create(cipher, iv);\n\t        },\n\n\t        /**\n\t         * Creates this mode for decryption.\n\t         *\n\t         * @param {Cipher} cipher A block cipher instance.\n\t         * @param {Array} iv The IV words.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\n\t         */\n\t        createDecryptor: function (cipher, iv) {\n\t            return this.Decryptor.create(cipher, iv);\n\t        },\n\n\t        /**\n\t         * Initializes a newly created mode.\n\t         *\n\t         * @param {Cipher} cipher A block cipher instance.\n\t         * @param {Array} iv The IV words.\n\t         *\n\t         * @example\n\t         *\n\t         *     var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\n\t         */\n\t        init: function (cipher, iv) {\n\t            this._cipher = cipher;\n\t            this._iv = iv;\n\t        }\n\t    });\n\n\t    /**\n\t     * Cipher Block Chaining mode.\n\t     */\n\t    var CBC = C_mode.CBC = (function () {\n\t        /**\n\t         * Abstract base CBC mode.\n\t         */\n\t        var CBC = BlockCipherMode.extend();\n\n\t        /**\n\t         * CBC encryptor.\n\t         */\n\t        CBC.Encryptor = CBC.extend({\n\t            /**\n\t             * Processes the data block at offset.\n\t             *\n\t             * @param {Array} words The data words to operate on.\n\t             * @param {number} offset The offset where the block starts.\n\t             *\n\t             * @example\n\t             *\n\t             *     mode.processBlock(data.words, offset);\n\t             */\n\t            processBlock: function (words, offset) {\n\t                // Shortcuts\n\t                var cipher = this._cipher;\n\t                var blockSize = cipher.blockSize;\n\n\t                // XOR and encrypt\n\t                xorBlock.call(this, words, offset, blockSize);\n\t                cipher.encryptBlock(words, offset);\n\n\t                // Remember this block to use with next block\n\t                this._prevBlock = words.slice(offset, offset + blockSize);\n\t            }\n\t        });\n\n\t        /**\n\t         * CBC decryptor.\n\t         */\n\t        CBC.Decryptor = CBC.extend({\n\t            /**\n\t             * Processes the data block at offset.\n\t             *\n\t             * @param {Array} words The data words to operate on.\n\t             * @param {number} offset The offset where the block starts.\n\t             *\n\t             * @example\n\t             *\n\t             *     mode.processBlock(data.words, offset);\n\t             */\n\t            processBlock: function (words, offset) {\n\t                // Shortcuts\n\t                var cipher = this._cipher;\n\t                var blockSize = cipher.blockSize;\n\n\t                // Remember this block to use with next block\n\t                var thisBlock = words.slice(offset, offset + blockSize);\n\n\t                // Decrypt and XOR\n\t                cipher.decryptBlock(words, offset);\n\t                xorBlock.call(this, words, offset, blockSize);\n\n\t                // This block becomes the previous block\n\t                this._prevBlock = thisBlock;\n\t            }\n\t        });\n\n\t        function xorBlock(words, offset, blockSize) {\n\t            var block;\n\n\t            // Shortcut\n\t            var iv = this._iv;\n\n\t            // Choose mixing block\n\t            if (iv) {\n\t                block = iv;\n\n\t                // Remove IV for subsequent blocks\n\t                this._iv = undefined;\n\t            } else {\n\t                block = this._prevBlock;\n\t            }\n\n\t            // XOR blocks\n\t            for (var i = 0; i < blockSize; i++) {\n\t                words[offset + i] ^= block[i];\n\t            }\n\t        }\n\n\t        return CBC;\n\t    }());\n\n\t    /**\n\t     * Padding namespace.\n\t     */\n\t    var C_pad = C.pad = {};\n\n\t    /**\n\t     * PKCS #5/7 padding strategy.\n\t     */\n\t    var Pkcs7 = C_pad.Pkcs7 = {\n\t        /**\n\t         * Pads data using the algorithm defined in PKCS #5/7.\n\t         *\n\t         * @param {WordArray} data The data to pad.\n\t         * @param {number} blockSize The multiple that the data should be padded to.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     CryptoJS.pad.Pkcs7.pad(wordArray, 4);\n\t         */\n\t        pad: function (data, blockSize) {\n\t            // Shortcut\n\t            var blockSizeBytes = blockSize * 4;\n\n\t            // Count padding bytes\n\t            var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\n\n\t            // Create padding word\n\t            var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;\n\n\t            // Create padding\n\t            var paddingWords = [];\n\t            for (var i = 0; i < nPaddingBytes; i += 4) {\n\t                paddingWords.push(paddingWord);\n\t            }\n\t            var padding = WordArray.create(paddingWords, nPaddingBytes);\n\n\t            // Add padding\n\t            data.concat(padding);\n\t        },\n\n\t        /**\n\t         * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\n\t         *\n\t         * @param {WordArray} data The data to unpad.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     CryptoJS.pad.Pkcs7.unpad(wordArray);\n\t         */\n\t        unpad: function (data) {\n\t            // Get number of padding bytes from last byte\n\t            var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t            // Remove padding\n\t            data.sigBytes -= nPaddingBytes;\n\t        }\n\t    };\n\n\t    /**\n\t     * Abstract base block cipher template.\n\t     *\n\t     * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\n\t     */\n\t    var BlockCipher = C_lib.BlockCipher = Cipher.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {Mode} mode The block mode to use. Default: CBC\n\t         * @property {Padding} padding The padding strategy to use. Default: Pkcs7\n\t         */\n\t        cfg: Cipher.cfg.extend({\n\t            mode: CBC,\n\t            padding: Pkcs7\n\t        }),\n\n\t        reset: function () {\n\t            var modeCreator;\n\n\t            // Reset cipher\n\t            Cipher.reset.call(this);\n\n\t            // Shortcuts\n\t            var cfg = this.cfg;\n\t            var iv = cfg.iv;\n\t            var mode = cfg.mode;\n\n\t            // Reset block mode\n\t            if (this._xformMode == this._ENC_XFORM_MODE) {\n\t                modeCreator = mode.createEncryptor;\n\t            } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n\t                modeCreator = mode.createDecryptor;\n\t                // Keep at least one block in the buffer for unpadding\n\t                this._minBufferSize = 1;\n\t            }\n\n\t            if (this._mode && this._mode.__creator == modeCreator) {\n\t                this._mode.init(this, iv && iv.words);\n\t            } else {\n\t                this._mode = modeCreator.call(mode, this, iv && iv.words);\n\t                this._mode.__creator = modeCreator;\n\t            }\n\t        },\n\n\t        _doProcessBlock: function (words, offset) {\n\t            this._mode.processBlock(words, offset);\n\t        },\n\n\t        _doFinalize: function () {\n\t            var finalProcessedBlocks;\n\n\t            // Shortcut\n\t            var padding = this.cfg.padding;\n\n\t            // Finalize\n\t            if (this._xformMode == this._ENC_XFORM_MODE) {\n\t                // Pad data\n\t                padding.pad(this._data, this.blockSize);\n\n\t                // Process final blocks\n\t                finalProcessedBlocks = this._process(!!'flush');\n\t            } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n\t                // Process final blocks\n\t                finalProcessedBlocks = this._process(!!'flush');\n\n\t                // Unpad data\n\t                padding.unpad(finalProcessedBlocks);\n\t            }\n\n\t            return finalProcessedBlocks;\n\t        },\n\n\t        blockSize: 128/32\n\t    });\n\n\t    /**\n\t     * A collection of cipher parameters.\n\t     *\n\t     * @property {WordArray} ciphertext The raw ciphertext.\n\t     * @property {WordArray} key The key to this ciphertext.\n\t     * @property {WordArray} iv The IV used in the ciphering operation.\n\t     * @property {WordArray} salt The salt used with a key derivation function.\n\t     * @property {Cipher} algorithm The cipher algorithm.\n\t     * @property {Mode} mode The block mode used in the ciphering operation.\n\t     * @property {Padding} padding The padding scheme used in the ciphering operation.\n\t     * @property {number} blockSize The block size of the cipher.\n\t     * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.\n\t     */\n\t    var CipherParams = C_lib.CipherParams = Base.extend({\n\t        /**\n\t         * Initializes a newly created cipher params object.\n\t         *\n\t         * @param {Object} cipherParams An object with any of the possible cipher parameters.\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipherParams = CryptoJS.lib.CipherParams.create({\n\t         *         ciphertext: ciphertextWordArray,\n\t         *         key: keyWordArray,\n\t         *         iv: ivWordArray,\n\t         *         salt: saltWordArray,\n\t         *         algorithm: CryptoJS.algo.AES,\n\t         *         mode: CryptoJS.mode.CBC,\n\t         *         padding: CryptoJS.pad.PKCS7,\n\t         *         blockSize: 4,\n\t         *         formatter: CryptoJS.format.OpenSSL\n\t         *     });\n\t         */\n\t        init: function (cipherParams) {\n\t            this.mixIn(cipherParams);\n\t        },\n\n\t        /**\n\t         * Converts this cipher params object to a string.\n\t         *\n\t         * @param {Format} formatter (Optional) The formatting strategy to use.\n\t         *\n\t         * @return {string} The stringified cipher params.\n\t         *\n\t         * @throws Error If neither the formatter nor the default formatter is set.\n\t         *\n\t         * @example\n\t         *\n\t         *     var string = cipherParams + '';\n\t         *     var string = cipherParams.toString();\n\t         *     var string = cipherParams.toString(CryptoJS.format.OpenSSL);\n\t         */\n\t        toString: function (formatter) {\n\t            return (formatter || this.formatter).stringify(this);\n\t        }\n\t    });\n\n\t    /**\n\t     * Format namespace.\n\t     */\n\t    var C_format = C.format = {};\n\n\t    /**\n\t     * OpenSSL formatting strategy.\n\t     */\n\t    var OpenSSLFormatter = C_format.OpenSSL = {\n\t        /**\n\t         * Converts a cipher params object to an OpenSSL-compatible string.\n\t         *\n\t         * @param {CipherParams} cipherParams The cipher params object.\n\t         *\n\t         * @return {string} The OpenSSL-compatible string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\n\t         */\n\t        stringify: function (cipherParams) {\n\t            var wordArray;\n\n\t            // Shortcuts\n\t            var ciphertext = cipherParams.ciphertext;\n\t            var salt = cipherParams.salt;\n\n\t            // Format\n\t            if (salt) {\n\t                wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\n\t            } else {\n\t                wordArray = ciphertext;\n\t            }\n\n\t            return wordArray.toString(Base64);\n\t        },\n\n\t        /**\n\t         * Converts an OpenSSL-compatible string to a cipher params object.\n\t         *\n\t         * @param {string} openSSLStr The OpenSSL-compatible string.\n\t         *\n\t         * @return {CipherParams} The cipher params object.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\n\t         */\n\t        parse: function (openSSLStr) {\n\t            var salt;\n\n\t            // Parse base64\n\t            var ciphertext = Base64.parse(openSSLStr);\n\n\t            // Shortcut\n\t            var ciphertextWords = ciphertext.words;\n\n\t            // Test for salt\n\t            if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {\n\t                // Extract salt\n\t                salt = WordArray.create(ciphertextWords.slice(2, 4));\n\n\t                // Remove salt from ciphertext\n\t                ciphertextWords.splice(0, 4);\n\t                ciphertext.sigBytes -= 16;\n\t            }\n\n\t            return CipherParams.create({ ciphertext: ciphertext, salt: salt });\n\t        }\n\t    };\n\n\t    /**\n\t     * A cipher wrapper that returns ciphertext as a serializable cipher params object.\n\t     */\n\t    var SerializableCipher = C_lib.SerializableCipher = Base.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL\n\t         */\n\t        cfg: Base.extend({\n\t            format: OpenSSLFormatter\n\t        }),\n\n\t        /**\n\t         * Encrypts a message.\n\t         *\n\t         * @param {Cipher} cipher The cipher algorithm to use.\n\t         * @param {WordArray|string} message The message to encrypt.\n\t         * @param {WordArray} key The key.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {CipherParams} A cipher params object.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);\n\t         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\n\t         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t         */\n\t        encrypt: function (cipher, message, key, cfg) {\n\t            // Apply config defaults\n\t            cfg = this.cfg.extend(cfg);\n\n\t            // Encrypt\n\t            var encryptor = cipher.createEncryptor(key, cfg);\n\t            var ciphertext = encryptor.finalize(message);\n\n\t            // Shortcut\n\t            var cipherCfg = encryptor.cfg;\n\n\t            // Create and return serializable cipher params\n\t            return CipherParams.create({\n\t                ciphertext: ciphertext,\n\t                key: key,\n\t                iv: cipherCfg.iv,\n\t                algorithm: cipher,\n\t                mode: cipherCfg.mode,\n\t                padding: cipherCfg.padding,\n\t                blockSize: cipher.blockSize,\n\t                formatter: cfg.format\n\t            });\n\t        },\n\n\t        /**\n\t         * Decrypts serialized ciphertext.\n\t         *\n\t         * @param {Cipher} cipher The cipher algorithm to use.\n\t         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n\t         * @param {WordArray} key The key.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {WordArray} The plaintext.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t         */\n\t        decrypt: function (cipher, ciphertext, key, cfg) {\n\t            // Apply config defaults\n\t            cfg = this.cfg.extend(cfg);\n\n\t            // Convert string to CipherParams\n\t            ciphertext = this._parse(ciphertext, cfg.format);\n\n\t            // Decrypt\n\t            var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);\n\n\t            return plaintext;\n\t        },\n\n\t        /**\n\t         * Converts serialized ciphertext to CipherParams,\n\t         * else assumed CipherParams already and returns ciphertext unchanged.\n\t         *\n\t         * @param {CipherParams|string} ciphertext The ciphertext.\n\t         * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\n\t         *\n\t         * @return {CipherParams} The unserialized ciphertext.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);\n\t         */\n\t        _parse: function (ciphertext, format) {\n\t            if (typeof ciphertext == 'string') {\n\t                return format.parse(ciphertext, this);\n\t            } else {\n\t                return ciphertext;\n\t            }\n\t        }\n\t    });\n\n\t    /**\n\t     * Key derivation function namespace.\n\t     */\n\t    var C_kdf = C.kdf = {};\n\n\t    /**\n\t     * OpenSSL key derivation function.\n\t     */\n\t    var OpenSSLKdf = C_kdf.OpenSSL = {\n\t        /**\n\t         * Derives a key and IV from a password.\n\t         *\n\t         * @param {string} password The password to derive from.\n\t         * @param {number} keySize The size in words of the key to generate.\n\t         * @param {number} ivSize The size in words of the IV to generate.\n\t         * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\n\t         *\n\t         * @return {CipherParams} A cipher params object with the key, IV, and salt.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\n\t         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\n\t         */\n\t        execute: function (password, keySize, ivSize, salt) {\n\t            // Generate random salt\n\t            if (!salt) {\n\t                salt = WordArray.random(64/8);\n\t            }\n\n\t            // Derive key and IV\n\t            var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);\n\n\t            // Separate key and IV\n\t            var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\n\t            key.sigBytes = keySize * 4;\n\n\t            // Return params\n\t            return CipherParams.create({ key: key, iv: iv, salt: salt });\n\t        }\n\t    };\n\n\t    /**\n\t     * A serializable cipher wrapper that derives the key from a password,\n\t     * and returns ciphertext as a serializable cipher params object.\n\t     */\n\t    var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL\n\t         */\n\t        cfg: SerializableCipher.cfg.extend({\n\t            kdf: OpenSSLKdf\n\t        }),\n\n\t        /**\n\t         * Encrypts a message using a password.\n\t         *\n\t         * @param {Cipher} cipher The cipher algorithm to use.\n\t         * @param {WordArray|string} message The message to encrypt.\n\t         * @param {string} password The password.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {CipherParams} A cipher params object.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');\n\t         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\n\t         */\n\t        encrypt: function (cipher, message, password, cfg) {\n\t            // Apply config defaults\n\t            cfg = this.cfg.extend(cfg);\n\n\t            // Derive key and other params\n\t            var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);\n\n\t            // Add IV to config\n\t            cfg.iv = derivedParams.iv;\n\n\t            // Encrypt\n\t            var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);\n\n\t            // Mix in derived params\n\t            ciphertext.mixIn(derivedParams);\n\n\t            return ciphertext;\n\t        },\n\n\t        /**\n\t         * Decrypts serialized ciphertext using a password.\n\t         *\n\t         * @param {Cipher} cipher The cipher algorithm to use.\n\t         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n\t         * @param {string} password The password.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {WordArray} The plaintext.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });\n\t         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });\n\t         */\n\t        decrypt: function (cipher, ciphertext, password, cfg) {\n\t            // Apply config defaults\n\t            cfg = this.cfg.extend(cfg);\n\n\t            // Convert string to CipherParams\n\t            ciphertext = this._parse(ciphertext, cfg.format);\n\n\t            // Derive key and other params\n\t            var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);\n\n\t            // Add IV to config\n\t            cfg.iv = derivedParams.iv;\n\n\t            // Decrypt\n\t            var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);\n\n\t            return plaintext;\n\t        }\n\t    });\n\t}());\n\n\n\t/**\n\t * Cipher Feedback block mode.\n\t */\n\tCryptoJS.mode.CFB = (function () {\n\t    var CFB = CryptoJS.lib.BlockCipherMode.extend();\n\n\t    CFB.Encryptor = CFB.extend({\n\t        processBlock: function (words, offset) {\n\t            // Shortcuts\n\t            var cipher = this._cipher;\n\t            var blockSize = cipher.blockSize;\n\n\t            generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);\n\n\t            // Remember this block to use with next block\n\t            this._prevBlock = words.slice(offset, offset + blockSize);\n\t        }\n\t    });\n\n\t    CFB.Decryptor = CFB.extend({\n\t        processBlock: function (words, offset) {\n\t            // Shortcuts\n\t            var cipher = this._cipher;\n\t            var blockSize = cipher.blockSize;\n\n\t            // Remember this block to use with next block\n\t            var thisBlock = words.slice(offset, offset + blockSize);\n\n\t            generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);\n\n\t            // This block becomes the previous block\n\t            this._prevBlock = thisBlock;\n\t        }\n\t    });\n\n\t    function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {\n\t        var keystream;\n\n\t        // Shortcut\n\t        var iv = this._iv;\n\n\t        // Generate keystream\n\t        if (iv) {\n\t            keystream = iv.slice(0);\n\n\t            // Remove IV for subsequent blocks\n\t            this._iv = undefined;\n\t        } else {\n\t            keystream = this._prevBlock;\n\t        }\n\t        cipher.encryptBlock(keystream, 0);\n\n\t        // Encrypt\n\t        for (var i = 0; i < blockSize; i++) {\n\t            words[offset + i] ^= keystream[i];\n\t        }\n\t    }\n\n\t    return CFB;\n\t}());\n\n\n\t/**\n\t * Counter block mode.\n\t */\n\tCryptoJS.mode.CTR = (function () {\n\t    var CTR = CryptoJS.lib.BlockCipherMode.extend();\n\n\t    var Encryptor = CTR.Encryptor = CTR.extend({\n\t        processBlock: function (words, offset) {\n\t            // Shortcuts\n\t            var cipher = this._cipher\n\t            var blockSize = cipher.blockSize;\n\t            var iv = this._iv;\n\t            var counter = this._counter;\n\n\t            // Generate keystream\n\t            if (iv) {\n\t                counter = this._counter = iv.slice(0);\n\n\t                // Remove IV for subsequent blocks\n\t                this._iv = undefined;\n\t            }\n\t            var keystream = counter.slice(0);\n\t            cipher.encryptBlock(keystream, 0);\n\n\t            // Increment counter\n\t            counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0\n\n\t            // Encrypt\n\t            for (var i = 0; i < blockSize; i++) {\n\t                words[offset + i] ^= keystream[i];\n\t            }\n\t        }\n\t    });\n\n\t    CTR.Decryptor = Encryptor;\n\n\t    return CTR;\n\t}());\n\n\n\t/** @preserve\n\t * Counter block mode compatible with  Dr Brian Gladman fileenc.c\n\t * derived from CryptoJS.mode.CTR\n\t * Jan Hruby jhruby.web@gmail.com\n\t */\n\tCryptoJS.mode.CTRGladman = (function () {\n\t    var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();\n\n\t\tfunction incWord(word)\n\t\t{\n\t\t\tif (((word >> 24) & 0xff) === 0xff) { //overflow\n\t\t\tvar b1 = (word >> 16)&0xff;\n\t\t\tvar b2 = (word >> 8)&0xff;\n\t\t\tvar b3 = word & 0xff;\n\n\t\t\tif (b1 === 0xff) // overflow b1\n\t\t\t{\n\t\t\tb1 = 0;\n\t\t\tif (b2 === 0xff)\n\t\t\t{\n\t\t\t\tb2 = 0;\n\t\t\t\tif (b3 === 0xff)\n\t\t\t\t{\n\t\t\t\t\tb3 = 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t++b3;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t++b2;\n\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t++b1;\n\t\t\t}\n\n\t\t\tword = 0;\n\t\t\tword += (b1 << 16);\n\t\t\tword += (b2 << 8);\n\t\t\tword += b3;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\tword += (0x01 << 24);\n\t\t\t}\n\t\t\treturn word;\n\t\t}\n\n\t\tfunction incCounter(counter)\n\t\t{\n\t\t\tif ((counter[0] = incWord(counter[0])) === 0)\n\t\t\t{\n\t\t\t\t// encr_data in fileenc.c from  Dr Brian Gladman's counts only with DWORD j < 8\n\t\t\t\tcounter[1] = incWord(counter[1]);\n\t\t\t}\n\t\t\treturn counter;\n\t\t}\n\n\t    var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({\n\t        processBlock: function (words, offset) {\n\t            // Shortcuts\n\t            var cipher = this._cipher\n\t            var blockSize = cipher.blockSize;\n\t            var iv = this._iv;\n\t            var counter = this._counter;\n\n\t            // Generate keystream\n\t            if (iv) {\n\t                counter = this._counter = iv.slice(0);\n\n\t                // Remove IV for subsequent blocks\n\t                this._iv = undefined;\n\t            }\n\n\t\t\t\tincCounter(counter);\n\n\t\t\t\tvar keystream = counter.slice(0);\n\t            cipher.encryptBlock(keystream, 0);\n\n\t            // Encrypt\n\t            for (var i = 0; i < blockSize; i++) {\n\t                words[offset + i] ^= keystream[i];\n\t            }\n\t        }\n\t    });\n\n\t    CTRGladman.Decryptor = Encryptor;\n\n\t    return CTRGladman;\n\t}());\n\n\n\n\n\t/**\n\t * Output Feedback block mode.\n\t */\n\tCryptoJS.mode.OFB = (function () {\n\t    var OFB = CryptoJS.lib.BlockCipherMode.extend();\n\n\t    var Encryptor = OFB.Encryptor = OFB.extend({\n\t        processBlock: function (words, offset) {\n\t            // Shortcuts\n\t            var cipher = this._cipher\n\t            var blockSize = cipher.blockSize;\n\t            var iv = this._iv;\n\t            var keystream = this._keystream;\n\n\t            // Generate keystream\n\t            if (iv) {\n\t                keystream = this._keystream = iv.slice(0);\n\n\t                // Remove IV for subsequent blocks\n\t                this._iv = undefined;\n\t            }\n\t            cipher.encryptBlock(keystream, 0);\n\n\t            // Encrypt\n\t            for (var i = 0; i < blockSize; i++) {\n\t                words[offset + i] ^= keystream[i];\n\t            }\n\t        }\n\t    });\n\n\t    OFB.Decryptor = Encryptor;\n\n\t    return OFB;\n\t}());\n\n\n\t/**\n\t * Electronic Codebook block mode.\n\t */\n\tCryptoJS.mode.ECB = (function () {\n\t    var ECB = CryptoJS.lib.BlockCipherMode.extend();\n\n\t    ECB.Encryptor = ECB.extend({\n\t        processBlock: function (words, offset) {\n\t            this._cipher.encryptBlock(words, offset);\n\t        }\n\t    });\n\n\t    ECB.Decryptor = ECB.extend({\n\t        processBlock: function (words, offset) {\n\t            this._cipher.decryptBlock(words, offset);\n\t        }\n\t    });\n\n\t    return ECB;\n\t}());\n\n\n\t/**\n\t * ANSI X.923 padding strategy.\n\t */\n\tCryptoJS.pad.AnsiX923 = {\n\t    pad: function (data, blockSize) {\n\t        // Shortcuts\n\t        var dataSigBytes = data.sigBytes;\n\t        var blockSizeBytes = blockSize * 4;\n\n\t        // Count padding bytes\n\t        var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;\n\n\t        // Compute last byte position\n\t        var lastBytePos = dataSigBytes + nPaddingBytes - 1;\n\n\t        // Pad\n\t        data.clamp();\n\t        data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);\n\t        data.sigBytes += nPaddingBytes;\n\t    },\n\n\t    unpad: function (data) {\n\t        // Get number of padding bytes from last byte\n\t        var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t        // Remove padding\n\t        data.sigBytes -= nPaddingBytes;\n\t    }\n\t};\n\n\n\t/**\n\t * ISO 10126 padding strategy.\n\t */\n\tCryptoJS.pad.Iso10126 = {\n\t    pad: function (data, blockSize) {\n\t        // Shortcut\n\t        var blockSizeBytes = blockSize * 4;\n\n\t        // Count padding bytes\n\t        var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\n\n\t        // Pad\n\t        data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).\n\t             concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));\n\t    },\n\n\t    unpad: function (data) {\n\t        // Get number of padding bytes from last byte\n\t        var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t        // Remove padding\n\t        data.sigBytes -= nPaddingBytes;\n\t    }\n\t};\n\n\n\t/**\n\t * ISO/IEC 9797-1 Padding Method 2.\n\t */\n\tCryptoJS.pad.Iso97971 = {\n\t    pad: function (data, blockSize) {\n\t        // Add 0x80 byte\n\t        data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1));\n\n\t        // Zero pad the rest\n\t        CryptoJS.pad.ZeroPadding.pad(data, blockSize);\n\t    },\n\n\t    unpad: function (data) {\n\t        // Remove zero padding\n\t        CryptoJS.pad.ZeroPadding.unpad(data);\n\n\t        // Remove one more byte -- the 0x80 byte\n\t        data.sigBytes--;\n\t    }\n\t};\n\n\n\t/**\n\t * Zero padding strategy.\n\t */\n\tCryptoJS.pad.ZeroPadding = {\n\t    pad: function (data, blockSize) {\n\t        // Shortcut\n\t        var blockSizeBytes = blockSize * 4;\n\n\t        // Pad\n\t        data.clamp();\n\t        data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);\n\t    },\n\n\t    unpad: function (data) {\n\t        // Shortcut\n\t        var dataWords = data.words;\n\n\t        // Unpad\n\t        var i = data.sigBytes - 1;\n\t        for (var i = data.sigBytes - 1; i >= 0; i--) {\n\t            if (((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {\n\t                data.sigBytes = i + 1;\n\t                break;\n\t            }\n\t        }\n\t    }\n\t};\n\n\n\t/**\n\t * A noop padding strategy.\n\t */\n\tCryptoJS.pad.NoPadding = {\n\t    pad: function () {\n\t    },\n\n\t    unpad: function () {\n\t    }\n\t};\n\n\n\t(function (undefined) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var CipherParams = C_lib.CipherParams;\n\t    var C_enc = C.enc;\n\t    var Hex = C_enc.Hex;\n\t    var C_format = C.format;\n\n\t    var HexFormatter = C_format.Hex = {\n\t        /**\n\t         * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.\n\t         *\n\t         * @param {CipherParams} cipherParams The cipher params object.\n\t         *\n\t         * @return {string} The hexadecimally encoded string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var hexString = CryptoJS.format.Hex.stringify(cipherParams);\n\t         */\n\t        stringify: function (cipherParams) {\n\t            return cipherParams.ciphertext.toString(Hex);\n\t        },\n\n\t        /**\n\t         * Converts a hexadecimally encoded ciphertext string to a cipher params object.\n\t         *\n\t         * @param {string} input The hexadecimally encoded string.\n\t         *\n\t         * @return {CipherParams} The cipher params object.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipherParams = CryptoJS.format.Hex.parse(hexString);\n\t         */\n\t        parse: function (input) {\n\t            var ciphertext = Hex.parse(input);\n\t            return CipherParams.create({ ciphertext: ciphertext });\n\t        }\n\t    };\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var BlockCipher = C_lib.BlockCipher;\n\t    var C_algo = C.algo;\n\n\t    // Lookup tables\n\t    var SBOX = [];\n\t    var INV_SBOX = [];\n\t    var SUB_MIX_0 = [];\n\t    var SUB_MIX_1 = [];\n\t    var SUB_MIX_2 = [];\n\t    var SUB_MIX_3 = [];\n\t    var INV_SUB_MIX_0 = [];\n\t    var INV_SUB_MIX_1 = [];\n\t    var INV_SUB_MIX_2 = [];\n\t    var INV_SUB_MIX_3 = [];\n\n\t    // Compute lookup tables\n\t    (function () {\n\t        // Compute double table\n\t        var d = [];\n\t        for (var i = 0; i < 256; i++) {\n\t            if (i < 128) {\n\t                d[i] = i << 1;\n\t            } else {\n\t                d[i] = (i << 1) ^ 0x11b;\n\t            }\n\t        }\n\n\t        // Walk GF(2^8)\n\t        var x = 0;\n\t        var xi = 0;\n\t        for (var i = 0; i < 256; i++) {\n\t            // Compute sbox\n\t            var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\n\t            sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\n\t            SBOX[x] = sx;\n\t            INV_SBOX[sx] = x;\n\n\t            // Compute multiplication\n\t            var x2 = d[x];\n\t            var x4 = d[x2];\n\t            var x8 = d[x4];\n\n\t            // Compute sub bytes, mix columns tables\n\t            var t = (d[sx] * 0x101) ^ (sx * 0x1010100);\n\t            SUB_MIX_0[x] = (t << 24) | (t >>> 8);\n\t            SUB_MIX_1[x] = (t << 16) | (t >>> 16);\n\t            SUB_MIX_2[x] = (t << 8)  | (t >>> 24);\n\t            SUB_MIX_3[x] = t;\n\n\t            // Compute inv sub bytes, inv mix columns tables\n\t            var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\n\t            INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\n\t            INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\n\t            INV_SUB_MIX_2[sx] = (t << 8)  | (t >>> 24);\n\t            INV_SUB_MIX_3[sx] = t;\n\n\t            // Compute next counter\n\t            if (!x) {\n\t                x = xi = 1;\n\t            } else {\n\t                x = x2 ^ d[d[d[x8 ^ x2]]];\n\t                xi ^= d[d[xi]];\n\t            }\n\t        }\n\t    }());\n\n\t    // Precomputed Rcon lookup\n\t    var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\n\n\t    /**\n\t     * AES block cipher algorithm.\n\t     */\n\t    var AES = C_algo.AES = BlockCipher.extend({\n\t        _doReset: function () {\n\t            var t;\n\n\t            // Skip reset of nRounds has been set before and key did not change\n\t            if (this._nRounds && this._keyPriorReset === this._key) {\n\t                return;\n\t            }\n\n\t            // Shortcuts\n\t            var key = this._keyPriorReset = this._key;\n\t            var keyWords = key.words;\n\t            var keySize = key.sigBytes / 4;\n\n\t            // Compute number of rounds\n\t            var nRounds = this._nRounds = keySize + 6;\n\n\t            // Compute number of key schedule rows\n\t            var ksRows = (nRounds + 1) * 4;\n\n\t            // Compute key schedule\n\t            var keySchedule = this._keySchedule = [];\n\t            for (var ksRow = 0; ksRow < ksRows; ksRow++) {\n\t                if (ksRow < keySize) {\n\t                    keySchedule[ksRow] = keyWords[ksRow];\n\t                } else {\n\t                    t = keySchedule[ksRow - 1];\n\n\t                    if (!(ksRow % keySize)) {\n\t                        // Rot word\n\t                        t = (t << 8) | (t >>> 24);\n\n\t                        // Sub word\n\t                        t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n\n\t                        // Mix Rcon\n\t                        t ^= RCON[(ksRow / keySize) | 0] << 24;\n\t                    } else if (keySize > 6 && ksRow % keySize == 4) {\n\t                        // Sub word\n\t                        t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n\t                    }\n\n\t                    keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\n\t                }\n\t            }\n\n\t            // Compute inv key schedule\n\t            var invKeySchedule = this._invKeySchedule = [];\n\t            for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {\n\t                var ksRow = ksRows - invKsRow;\n\n\t                if (invKsRow % 4) {\n\t                    var t = keySchedule[ksRow];\n\t                } else {\n\t                    var t = keySchedule[ksRow - 4];\n\t                }\n\n\t                if (invKsRow < 4 || ksRow <= 4) {\n\t                    invKeySchedule[invKsRow] = t;\n\t                } else {\n\t                    invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^\n\t                                               INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];\n\t                }\n\t            }\n\t        },\n\n\t        encryptBlock: function (M, offset) {\n\t            this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);\n\t        },\n\n\t        decryptBlock: function (M, offset) {\n\t            // Swap 2nd and 4th rows\n\t            var t = M[offset + 1];\n\t            M[offset + 1] = M[offset + 3];\n\t            M[offset + 3] = t;\n\n\t            this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);\n\n\t            // Inv swap 2nd and 4th rows\n\t            var t = M[offset + 1];\n\t            M[offset + 1] = M[offset + 3];\n\t            M[offset + 3] = t;\n\t        },\n\n\t        _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\n\t            // Shortcut\n\t            var nRounds = this._nRounds;\n\n\t            // Get input, add round key\n\t            var s0 = M[offset]     ^ keySchedule[0];\n\t            var s1 = M[offset + 1] ^ keySchedule[1];\n\t            var s2 = M[offset + 2] ^ keySchedule[2];\n\t            var s3 = M[offset + 3] ^ keySchedule[3];\n\n\t            // Key schedule row counter\n\t            var ksRow = 4;\n\n\t            // Rounds\n\t            for (var round = 1; round < nRounds; round++) {\n\t                // Shift rows, sub bytes, mix columns, add round key\n\t                var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];\n\t                var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];\n\t                var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];\n\t                var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];\n\n\t                // Update state\n\t                s0 = t0;\n\t                s1 = t1;\n\t                s2 = t2;\n\t                s3 = t3;\n\t            }\n\n\t            // Shift rows, sub bytes, add round key\n\t            var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];\n\t            var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];\n\t            var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];\n\t            var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];\n\n\t            // Set output\n\t            M[offset]     = t0;\n\t            M[offset + 1] = t1;\n\t            M[offset + 2] = t2;\n\t            M[offset + 3] = t3;\n\t        },\n\n\t        keySize: 256/32\n\t    });\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.AES.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.AES = BlockCipher._createHelper(AES);\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var BlockCipher = C_lib.BlockCipher;\n\t    var C_algo = C.algo;\n\n\t    // Permuted Choice 1 constants\n\t    var PC1 = [\n\t        57, 49, 41, 33, 25, 17, 9,  1,\n\t        58, 50, 42, 34, 26, 18, 10, 2,\n\t        59, 51, 43, 35, 27, 19, 11, 3,\n\t        60, 52, 44, 36, 63, 55, 47, 39,\n\t        31, 23, 15, 7,  62, 54, 46, 38,\n\t        30, 22, 14, 6,  61, 53, 45, 37,\n\t        29, 21, 13, 5,  28, 20, 12, 4\n\t    ];\n\n\t    // Permuted Choice 2 constants\n\t    var PC2 = [\n\t        14, 17, 11, 24, 1,  5,\n\t        3,  28, 15, 6,  21, 10,\n\t        23, 19, 12, 4,  26, 8,\n\t        16, 7,  27, 20, 13, 2,\n\t        41, 52, 31, 37, 47, 55,\n\t        30, 40, 51, 45, 33, 48,\n\t        44, 49, 39, 56, 34, 53,\n\t        46, 42, 50, 36, 29, 32\n\t    ];\n\n\t    // Cumulative bit shift constants\n\t    var BIT_SHIFTS = [1,  2,  4,  6,  8,  10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];\n\n\t    // SBOXes and round permutation constants\n\t    var SBOX_P = [\n\t        {\n\t            0x0: 0x808200,\n\t            0x10000000: 0x8000,\n\t            0x20000000: 0x808002,\n\t            0x30000000: 0x2,\n\t            0x40000000: 0x200,\n\t            0x50000000: 0x808202,\n\t            0x60000000: 0x800202,\n\t            0x70000000: 0x800000,\n\t            0x80000000: 0x202,\n\t            0x90000000: 0x800200,\n\t            0xa0000000: 0x8200,\n\t            0xb0000000: 0x808000,\n\t            0xc0000000: 0x8002,\n\t            0xd0000000: 0x800002,\n\t            0xe0000000: 0x0,\n\t            0xf0000000: 0x8202,\n\t            0x8000000: 0x0,\n\t            0x18000000: 0x808202,\n\t            0x28000000: 0x8202,\n\t            0x38000000: 0x8000,\n\t            0x48000000: 0x808200,\n\t            0x58000000: 0x200,\n\t            0x68000000: 0x808002,\n\t            0x78000000: 0x2,\n\t            0x88000000: 0x800200,\n\t            0x98000000: 0x8200,\n\t            0xa8000000: 0x808000,\n\t            0xb8000000: 0x800202,\n\t            0xc8000000: 0x800002,\n\t            0xd8000000: 0x8002,\n\t            0xe8000000: 0x202,\n\t            0xf8000000: 0x800000,\n\t            0x1: 0x8000,\n\t            0x10000001: 0x2,\n\t            0x20000001: 0x808200,\n\t            0x30000001: 0x800000,\n\t            0x40000001: 0x808002,\n\t            0x50000001: 0x8200,\n\t            0x60000001: 0x200,\n\t            0x70000001: 0x800202,\n\t            0x80000001: 0x808202,\n\t            0x90000001: 0x808000,\n\t            0xa0000001: 0x800002,\n\t            0xb0000001: 0x8202,\n\t            0xc0000001: 0x202,\n\t            0xd0000001: 0x800200,\n\t            0xe0000001: 0x8002,\n\t            0xf0000001: 0x0,\n\t            0x8000001: 0x808202,\n\t            0x18000001: 0x808000,\n\t            0x28000001: 0x800000,\n\t            0x38000001: 0x200,\n\t            0x48000001: 0x8000,\n\t            0x58000001: 0x800002,\n\t            0x68000001: 0x2,\n\t            0x78000001: 0x8202,\n\t            0x88000001: 0x8002,\n\t            0x98000001: 0x800202,\n\t            0xa8000001: 0x202,\n\t            0xb8000001: 0x808200,\n\t            0xc8000001: 0x800200,\n\t            0xd8000001: 0x0,\n\t            0xe8000001: 0x8200,\n\t            0xf8000001: 0x808002\n\t        },\n\t        {\n\t            0x0: 0x40084010,\n\t            0x1000000: 0x4000,\n\t            0x2000000: 0x80000,\n\t            0x3000000: 0x40080010,\n\t            0x4000000: 0x40000010,\n\t            0x5000000: 0x40084000,\n\t            0x6000000: 0x40004000,\n\t            0x7000000: 0x10,\n\t            0x8000000: 0x84000,\n\t            0x9000000: 0x40004010,\n\t            0xa000000: 0x40000000,\n\t            0xb000000: 0x84010,\n\t            0xc000000: 0x80010,\n\t            0xd000000: 0x0,\n\t            0xe000000: 0x4010,\n\t            0xf000000: 0x40080000,\n\t            0x800000: 0x40004000,\n\t            0x1800000: 0x84010,\n\t            0x2800000: 0x10,\n\t            0x3800000: 0x40004010,\n\t            0x4800000: 0x40084010,\n\t            0x5800000: 0x40000000,\n\t            0x6800000: 0x80000,\n\t            0x7800000: 0x40080010,\n\t            0x8800000: 0x80010,\n\t            0x9800000: 0x0,\n\t            0xa800000: 0x4000,\n\t            0xb800000: 0x40080000,\n\t            0xc800000: 0x40000010,\n\t            0xd800000: 0x84000,\n\t            0xe800000: 0x40084000,\n\t            0xf800000: 0x4010,\n\t            0x10000000: 0x0,\n\t            0x11000000: 0x40080010,\n\t            0x12000000: 0x40004010,\n\t            0x13000000: 0x40084000,\n\t            0x14000000: 0x40080000,\n\t            0x15000000: 0x10,\n\t            0x16000000: 0x84010,\n\t            0x17000000: 0x4000,\n\t            0x18000000: 0x4010,\n\t            0x19000000: 0x80000,\n\t            0x1a000000: 0x80010,\n\t            0x1b000000: 0x40000010,\n\t            0x1c000000: 0x84000,\n\t            0x1d000000: 0x40004000,\n\t            0x1e000000: 0x40000000,\n\t            0x1f000000: 0x40084010,\n\t            0x10800000: 0x84010,\n\t            0x11800000: 0x80000,\n\t            0x12800000: 0x40080000,\n\t            0x13800000: 0x4000,\n\t            0x14800000: 0x40004000,\n\t            0x15800000: 0x40084010,\n\t            0x16800000: 0x10,\n\t            0x17800000: 0x40000000,\n\t            0x18800000: 0x40084000,\n\t            0x19800000: 0x40000010,\n\t            0x1a800000: 0x40004010,\n\t            0x1b800000: 0x80010,\n\t            0x1c800000: 0x0,\n\t            0x1d800000: 0x4010,\n\t            0x1e800000: 0x40080010,\n\t            0x1f800000: 0x84000\n\t        },\n\t        {\n\t            0x0: 0x104,\n\t            0x100000: 0x0,\n\t            0x200000: 0x4000100,\n\t            0x300000: 0x10104,\n\t            0x400000: 0x10004,\n\t            0x500000: 0x4000004,\n\t            0x600000: 0x4010104,\n\t            0x700000: 0x4010000,\n\t            0x800000: 0x4000000,\n\t            0x900000: 0x4010100,\n\t            0xa00000: 0x10100,\n\t            0xb00000: 0x4010004,\n\t            0xc00000: 0x4000104,\n\t            0xd00000: 0x10000,\n\t            0xe00000: 0x4,\n\t            0xf00000: 0x100,\n\t            0x80000: 0x4010100,\n\t            0x180000: 0x4010004,\n\t            0x280000: 0x0,\n\t            0x380000: 0x4000100,\n\t            0x480000: 0x4000004,\n\t            0x580000: 0x10000,\n\t            0x680000: 0x10004,\n\t            0x780000: 0x104,\n\t            0x880000: 0x4,\n\t            0x980000: 0x100,\n\t            0xa80000: 0x4010000,\n\t            0xb80000: 0x10104,\n\t            0xc80000: 0x10100,\n\t            0xd80000: 0x4000104,\n\t            0xe80000: 0x4010104,\n\t            0xf80000: 0x4000000,\n\t            0x1000000: 0x4010100,\n\t            0x1100000: 0x10004,\n\t            0x1200000: 0x10000,\n\t            0x1300000: 0x4000100,\n\t            0x1400000: 0x100,\n\t            0x1500000: 0x4010104,\n\t            0x1600000: 0x4000004,\n\t            0x1700000: 0x0,\n\t            0x1800000: 0x4000104,\n\t            0x1900000: 0x4000000,\n\t            0x1a00000: 0x4,\n\t            0x1b00000: 0x10100,\n\t            0x1c00000: 0x4010000,\n\t            0x1d00000: 0x104,\n\t            0x1e00000: 0x10104,\n\t            0x1f00000: 0x4010004,\n\t            0x1080000: 0x4000000,\n\t            0x1180000: 0x104,\n\t            0x1280000: 0x4010100,\n\t            0x1380000: 0x0,\n\t            0x1480000: 0x10004,\n\t            0x1580000: 0x4000100,\n\t            0x1680000: 0x100,\n\t            0x1780000: 0x4010004,\n\t            0x1880000: 0x10000,\n\t            0x1980000: 0x4010104,\n\t            0x1a80000: 0x10104,\n\t            0x1b80000: 0x4000004,\n\t            0x1c80000: 0x4000104,\n\t            0x1d80000: 0x4010000,\n\t            0x1e80000: 0x4,\n\t            0x1f80000: 0x10100\n\t        },\n\t        {\n\t            0x0: 0x80401000,\n\t            0x10000: 0x80001040,\n\t            0x20000: 0x401040,\n\t            0x30000: 0x80400000,\n\t            0x40000: 0x0,\n\t            0x50000: 0x401000,\n\t            0x60000: 0x80000040,\n\t            0x70000: 0x400040,\n\t            0x80000: 0x80000000,\n\t            0x90000: 0x400000,\n\t            0xa0000: 0x40,\n\t            0xb0000: 0x80001000,\n\t            0xc0000: 0x80400040,\n\t            0xd0000: 0x1040,\n\t            0xe0000: 0x1000,\n\t            0xf0000: 0x80401040,\n\t            0x8000: 0x80001040,\n\t            0x18000: 0x40,\n\t            0x28000: 0x80400040,\n\t            0x38000: 0x80001000,\n\t            0x48000: 0x401000,\n\t            0x58000: 0x80401040,\n\t            0x68000: 0x0,\n\t            0x78000: 0x80400000,\n\t            0x88000: 0x1000,\n\t            0x98000: 0x80401000,\n\t            0xa8000: 0x400000,\n\t            0xb8000: 0x1040,\n\t            0xc8000: 0x80000000,\n\t            0xd8000: 0x400040,\n\t            0xe8000: 0x401040,\n\t            0xf8000: 0x80000040,\n\t            0x100000: 0x400040,\n\t            0x110000: 0x401000,\n\t            0x120000: 0x80000040,\n\t            0x130000: 0x0,\n\t            0x140000: 0x1040,\n\t            0x150000: 0x80400040,\n\t            0x160000: 0x80401000,\n\t            0x170000: 0x80001040,\n\t            0x180000: 0x80401040,\n\t            0x190000: 0x80000000,\n\t            0x1a0000: 0x80400000,\n\t            0x1b0000: 0x401040,\n\t            0x1c0000: 0x80001000,\n\t            0x1d0000: 0x400000,\n\t            0x1e0000: 0x40,\n\t            0x1f0000: 0x1000,\n\t            0x108000: 0x80400000,\n\t            0x118000: 0x80401040,\n\t            0x128000: 0x0,\n\t            0x138000: 0x401000,\n\t            0x148000: 0x400040,\n\t            0x158000: 0x80000000,\n\t            0x168000: 0x80001040,\n\t            0x178000: 0x40,\n\t            0x188000: 0x80000040,\n\t            0x198000: 0x1000,\n\t            0x1a8000: 0x80001000,\n\t            0x1b8000: 0x80400040,\n\t            0x1c8000: 0x1040,\n\t            0x1d8000: 0x80401000,\n\t            0x1e8000: 0x400000,\n\t            0x1f8000: 0x401040\n\t        },\n\t        {\n\t            0x0: 0x80,\n\t            0x1000: 0x1040000,\n\t            0x2000: 0x40000,\n\t            0x3000: 0x20000000,\n\t            0x4000: 0x20040080,\n\t            0x5000: 0x1000080,\n\t            0x6000: 0x21000080,\n\t            0x7000: 0x40080,\n\t            0x8000: 0x1000000,\n\t            0x9000: 0x20040000,\n\t            0xa000: 0x20000080,\n\t            0xb000: 0x21040080,\n\t            0xc000: 0x21040000,\n\t            0xd000: 0x0,\n\t            0xe000: 0x1040080,\n\t            0xf000: 0x21000000,\n\t            0x800: 0x1040080,\n\t            0x1800: 0x21000080,\n\t            0x2800: 0x80,\n\t            0x3800: 0x1040000,\n\t            0x4800: 0x40000,\n\t            0x5800: 0x20040080,\n\t            0x6800: 0x21040000,\n\t            0x7800: 0x20000000,\n\t            0x8800: 0x20040000,\n\t            0x9800: 0x0,\n\t            0xa800: 0x21040080,\n\t            0xb800: 0x1000080,\n\t            0xc800: 0x20000080,\n\t            0xd800: 0x21000000,\n\t            0xe800: 0x1000000,\n\t            0xf800: 0x40080,\n\t            0x10000: 0x40000,\n\t            0x11000: 0x80,\n\t            0x12000: 0x20000000,\n\t            0x13000: 0x21000080,\n\t            0x14000: 0x1000080,\n\t            0x15000: 0x21040000,\n\t            0x16000: 0x20040080,\n\t            0x17000: 0x1000000,\n\t            0x18000: 0x21040080,\n\t            0x19000: 0x21000000,\n\t            0x1a000: 0x1040000,\n\t            0x1b000: 0x20040000,\n\t            0x1c000: 0x40080,\n\t            0x1d000: 0x20000080,\n\t            0x1e000: 0x0,\n\t            0x1f000: 0x1040080,\n\t            0x10800: 0x21000080,\n\t            0x11800: 0x1000000,\n\t            0x12800: 0x1040000,\n\t            0x13800: 0x20040080,\n\t            0x14800: 0x20000000,\n\t            0x15800: 0x1040080,\n\t            0x16800: 0x80,\n\t            0x17800: 0x21040000,\n\t            0x18800: 0x40080,\n\t            0x19800: 0x21040080,\n\t            0x1a800: 0x0,\n\t            0x1b800: 0x21000000,\n\t            0x1c800: 0x1000080,\n\t            0x1d800: 0x40000,\n\t            0x1e800: 0x20040000,\n\t            0x1f800: 0x20000080\n\t        },\n\t        {\n\t            0x0: 0x10000008,\n\t            0x100: 0x2000,\n\t            0x200: 0x10200000,\n\t            0x300: 0x10202008,\n\t            0x400: 0x10002000,\n\t            0x500: 0x200000,\n\t            0x600: 0x200008,\n\t            0x700: 0x10000000,\n\t            0x800: 0x0,\n\t            0x900: 0x10002008,\n\t            0xa00: 0x202000,\n\t            0xb00: 0x8,\n\t            0xc00: 0x10200008,\n\t            0xd00: 0x202008,\n\t            0xe00: 0x2008,\n\t            0xf00: 0x10202000,\n\t            0x80: 0x10200000,\n\t            0x180: 0x10202008,\n\t            0x280: 0x8,\n\t            0x380: 0x200000,\n\t            0x480: 0x202008,\n\t            0x580: 0x10000008,\n\t            0x680: 0x10002000,\n\t            0x780: 0x2008,\n\t            0x880: 0x200008,\n\t            0x980: 0x2000,\n\t            0xa80: 0x10002008,\n\t            0xb80: 0x10200008,\n\t            0xc80: 0x0,\n\t            0xd80: 0x10202000,\n\t            0xe80: 0x202000,\n\t            0xf80: 0x10000000,\n\t            0x1000: 0x10002000,\n\t            0x1100: 0x10200008,\n\t            0x1200: 0x10202008,\n\t            0x1300: 0x2008,\n\t            0x1400: 0x200000,\n\t            0x1500: 0x10000000,\n\t            0x1600: 0x10000008,\n\t            0x1700: 0x202000,\n\t            0x1800: 0x202008,\n\t            0x1900: 0x0,\n\t            0x1a00: 0x8,\n\t            0x1b00: 0x10200000,\n\t            0x1c00: 0x2000,\n\t            0x1d00: 0x10002008,\n\t            0x1e00: 0x10202000,\n\t            0x1f00: 0x200008,\n\t            0x1080: 0x8,\n\t            0x1180: 0x202000,\n\t            0x1280: 0x200000,\n\t            0x1380: 0x10000008,\n\t            0x1480: 0x10002000,\n\t            0x1580: 0x2008,\n\t            0x1680: 0x10202008,\n\t            0x1780: 0x10200000,\n\t            0x1880: 0x10202000,\n\t            0x1980: 0x10200008,\n\t            0x1a80: 0x2000,\n\t            0x1b80: 0x202008,\n\t            0x1c80: 0x200008,\n\t            0x1d80: 0x0,\n\t            0x1e80: 0x10000000,\n\t            0x1f80: 0x10002008\n\t        },\n\t        {\n\t            0x0: 0x100000,\n\t            0x10: 0x2000401,\n\t            0x20: 0x400,\n\t            0x30: 0x100401,\n\t            0x40: 0x2100401,\n\t            0x50: 0x0,\n\t            0x60: 0x1,\n\t            0x70: 0x2100001,\n\t            0x80: 0x2000400,\n\t            0x90: 0x100001,\n\t            0xa0: 0x2000001,\n\t            0xb0: 0x2100400,\n\t            0xc0: 0x2100000,\n\t            0xd0: 0x401,\n\t            0xe0: 0x100400,\n\t            0xf0: 0x2000000,\n\t            0x8: 0x2100001,\n\t            0x18: 0x0,\n\t            0x28: 0x2000401,\n\t            0x38: 0x2100400,\n\t            0x48: 0x100000,\n\t            0x58: 0x2000001,\n\t            0x68: 0x2000000,\n\t            0x78: 0x401,\n\t            0x88: 0x100401,\n\t            0x98: 0x2000400,\n\t            0xa8: 0x2100000,\n\t            0xb8: 0x100001,\n\t            0xc8: 0x400,\n\t            0xd8: 0x2100401,\n\t            0xe8: 0x1,\n\t            0xf8: 0x100400,\n\t            0x100: 0x2000000,\n\t            0x110: 0x100000,\n\t            0x120: 0x2000401,\n\t            0x130: 0x2100001,\n\t            0x140: 0x100001,\n\t            0x150: 0x2000400,\n\t            0x160: 0x2100400,\n\t            0x170: 0x100401,\n\t            0x180: 0x401,\n\t            0x190: 0x2100401,\n\t            0x1a0: 0x100400,\n\t            0x1b0: 0x1,\n\t            0x1c0: 0x0,\n\t            0x1d0: 0x2100000,\n\t            0x1e0: 0x2000001,\n\t            0x1f0: 0x400,\n\t            0x108: 0x100400,\n\t            0x118: 0x2000401,\n\t            0x128: 0x2100001,\n\t            0x138: 0x1,\n\t            0x148: 0x2000000,\n\t            0x158: 0x100000,\n\t            0x168: 0x401,\n\t            0x178: 0x2100400,\n\t            0x188: 0x2000001,\n\t            0x198: 0x2100000,\n\t            0x1a8: 0x0,\n\t            0x1b8: 0x2100401,\n\t            0x1c8: 0x100401,\n\t            0x1d8: 0x400,\n\t            0x1e8: 0x2000400,\n\t            0x1f8: 0x100001\n\t        },\n\t        {\n\t            0x0: 0x8000820,\n\t            0x1: 0x20000,\n\t            0x2: 0x8000000,\n\t            0x3: 0x20,\n\t            0x4: 0x20020,\n\t            0x5: 0x8020820,\n\t            0x6: 0x8020800,\n\t            0x7: 0x800,\n\t            0x8: 0x8020000,\n\t            0x9: 0x8000800,\n\t            0xa: 0x20800,\n\t            0xb: 0x8020020,\n\t            0xc: 0x820,\n\t            0xd: 0x0,\n\t            0xe: 0x8000020,\n\t            0xf: 0x20820,\n\t            0x80000000: 0x800,\n\t            0x80000001: 0x8020820,\n\t            0x80000002: 0x8000820,\n\t            0x80000003: 0x8000000,\n\t            0x80000004: 0x8020000,\n\t            0x80000005: 0x20800,\n\t            0x80000006: 0x20820,\n\t            0x80000007: 0x20,\n\t            0x80000008: 0x8000020,\n\t            0x80000009: 0x820,\n\t            0x8000000a: 0x20020,\n\t            0x8000000b: 0x8020800,\n\t            0x8000000c: 0x0,\n\t            0x8000000d: 0x8020020,\n\t            0x8000000e: 0x8000800,\n\t            0x8000000f: 0x20000,\n\t            0x10: 0x20820,\n\t            0x11: 0x8020800,\n\t            0x12: 0x20,\n\t            0x13: 0x800,\n\t            0x14: 0x8000800,\n\t            0x15: 0x8000020,\n\t            0x16: 0x8020020,\n\t            0x17: 0x20000,\n\t            0x18: 0x0,\n\t            0x19: 0x20020,\n\t            0x1a: 0x8020000,\n\t            0x1b: 0x8000820,\n\t            0x1c: 0x8020820,\n\t            0x1d: 0x20800,\n\t            0x1e: 0x820,\n\t            0x1f: 0x8000000,\n\t            0x80000010: 0x20000,\n\t            0x80000011: 0x800,\n\t            0x80000012: 0x8020020,\n\t            0x80000013: 0x20820,\n\t            0x80000014: 0x20,\n\t            0x80000015: 0x8020000,\n\t            0x80000016: 0x8000000,\n\t            0x80000017: 0x8000820,\n\t            0x80000018: 0x8020820,\n\t            0x80000019: 0x8000020,\n\t            0x8000001a: 0x8000800,\n\t            0x8000001b: 0x0,\n\t            0x8000001c: 0x20800,\n\t            0x8000001d: 0x820,\n\t            0x8000001e: 0x20020,\n\t            0x8000001f: 0x8020800\n\t        }\n\t    ];\n\n\t    // Masks that select the SBOX input\n\t    var SBOX_MASK = [\n\t        0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,\n\t        0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f\n\t    ];\n\n\t    /**\n\t     * DES block cipher algorithm.\n\t     */\n\t    var DES = C_algo.DES = BlockCipher.extend({\n\t        _doReset: function () {\n\t            // Shortcuts\n\t            var key = this._key;\n\t            var keyWords = key.words;\n\n\t            // Select 56 bits according to PC1\n\t            var keyBits = [];\n\t            for (var i = 0; i < 56; i++) {\n\t                var keyBitPos = PC1[i] - 1;\n\t                keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1;\n\t            }\n\n\t            // Assemble 16 subkeys\n\t            var subKeys = this._subKeys = [];\n\t            for (var nSubKey = 0; nSubKey < 16; nSubKey++) {\n\t                // Create subkey\n\t                var subKey = subKeys[nSubKey] = [];\n\n\t                // Shortcut\n\t                var bitShift = BIT_SHIFTS[nSubKey];\n\n\t                // Select 48 bits according to PC2\n\t                for (var i = 0; i < 24; i++) {\n\t                    // Select from the left 28 key bits\n\t                    subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6);\n\n\t                    // Select from the right 28 key bits\n\t                    subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6);\n\t                }\n\n\t                // Since each subkey is applied to an expanded 32-bit input,\n\t                // the subkey can be broken into 8 values scaled to 32-bits,\n\t                // which allows the key to be used without expansion\n\t                subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);\n\t                for (var i = 1; i < 7; i++) {\n\t                    subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);\n\t                }\n\t                subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);\n\t            }\n\n\t            // Compute inverse subkeys\n\t            var invSubKeys = this._invSubKeys = [];\n\t            for (var i = 0; i < 16; i++) {\n\t                invSubKeys[i] = subKeys[15 - i];\n\t            }\n\t        },\n\n\t        encryptBlock: function (M, offset) {\n\t            this._doCryptBlock(M, offset, this._subKeys);\n\t        },\n\n\t        decryptBlock: function (M, offset) {\n\t            this._doCryptBlock(M, offset, this._invSubKeys);\n\t        },\n\n\t        _doCryptBlock: function (M, offset, subKeys) {\n\t            // Get input\n\t            this._lBlock = M[offset];\n\t            this._rBlock = M[offset + 1];\n\n\t            // Initial permutation\n\t            exchangeLR.call(this, 4,  0x0f0f0f0f);\n\t            exchangeLR.call(this, 16, 0x0000ffff);\n\t            exchangeRL.call(this, 2,  0x33333333);\n\t            exchangeRL.call(this, 8,  0x00ff00ff);\n\t            exchangeLR.call(this, 1,  0x55555555);\n\n\t            // Rounds\n\t            for (var round = 0; round < 16; round++) {\n\t                // Shortcuts\n\t                var subKey = subKeys[round];\n\t                var lBlock = this._lBlock;\n\t                var rBlock = this._rBlock;\n\n\t                // Feistel function\n\t                var f = 0;\n\t                for (var i = 0; i < 8; i++) {\n\t                    f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];\n\t                }\n\t                this._lBlock = rBlock;\n\t                this._rBlock = lBlock ^ f;\n\t            }\n\n\t            // Undo swap from last round\n\t            var t = this._lBlock;\n\t            this._lBlock = this._rBlock;\n\t            this._rBlock = t;\n\n\t            // Final permutation\n\t            exchangeLR.call(this, 1,  0x55555555);\n\t            exchangeRL.call(this, 8,  0x00ff00ff);\n\t            exchangeRL.call(this, 2,  0x33333333);\n\t            exchangeLR.call(this, 16, 0x0000ffff);\n\t            exchangeLR.call(this, 4,  0x0f0f0f0f);\n\n\t            // Set output\n\t            M[offset] = this._lBlock;\n\t            M[offset + 1] = this._rBlock;\n\t        },\n\n\t        keySize: 64/32,\n\n\t        ivSize: 64/32,\n\n\t        blockSize: 64/32\n\t    });\n\n\t    // Swap bits across the left and right words\n\t    function exchangeLR(offset, mask) {\n\t        var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;\n\t        this._rBlock ^= t;\n\t        this._lBlock ^= t << offset;\n\t    }\n\n\t    function exchangeRL(offset, mask) {\n\t        var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;\n\t        this._lBlock ^= t;\n\t        this._rBlock ^= t << offset;\n\t    }\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.DES.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.DES = BlockCipher._createHelper(DES);\n\n\t    /**\n\t     * Triple-DES block cipher algorithm.\n\t     */\n\t    var TripleDES = C_algo.TripleDES = BlockCipher.extend({\n\t        _doReset: function () {\n\t            // Shortcuts\n\t            var key = this._key;\n\t            var keyWords = key.words;\n\t            // Make sure the key length is valid (64, 128 or >= 192 bit)\n\t            if (keyWords.length !== 2 && keyWords.length !== 4 && keyWords.length < 6) {\n\t                throw new Error('Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192.');\n\t            }\n\n\t            // Extend the key according to the keying options defined in 3DES standard\n\t            var key1 = keyWords.slice(0, 2);\n\t            var key2 = keyWords.length < 4 ? keyWords.slice(0, 2) : keyWords.slice(2, 4);\n\t            var key3 = keyWords.length < 6 ? keyWords.slice(0, 2) : keyWords.slice(4, 6);\n\n\t            // Create DES instances\n\t            this._des1 = DES.createEncryptor(WordArray.create(key1));\n\t            this._des2 = DES.createEncryptor(WordArray.create(key2));\n\t            this._des3 = DES.createEncryptor(WordArray.create(key3));\n\t        },\n\n\t        encryptBlock: function (M, offset) {\n\t            this._des1.encryptBlock(M, offset);\n\t            this._des2.decryptBlock(M, offset);\n\t            this._des3.encryptBlock(M, offset);\n\t        },\n\n\t        decryptBlock: function (M, offset) {\n\t            this._des3.decryptBlock(M, offset);\n\t            this._des2.encryptBlock(M, offset);\n\t            this._des1.decryptBlock(M, offset);\n\t        },\n\n\t        keySize: 192/32,\n\n\t        ivSize: 64/32,\n\n\t        blockSize: 64/32\n\t    });\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.TripleDES = BlockCipher._createHelper(TripleDES);\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var StreamCipher = C_lib.StreamCipher;\n\t    var C_algo = C.algo;\n\n\t    /**\n\t     * RC4 stream cipher algorithm.\n\t     */\n\t    var RC4 = C_algo.RC4 = StreamCipher.extend({\n\t        _doReset: function () {\n\t            // Shortcuts\n\t            var key = this._key;\n\t            var keyWords = key.words;\n\t            var keySigBytes = key.sigBytes;\n\n\t            // Init sbox\n\t            var S = this._S = [];\n\t            for (var i = 0; i < 256; i++) {\n\t                S[i] = i;\n\t            }\n\n\t            // Key setup\n\t            for (var i = 0, j = 0; i < 256; i++) {\n\t                var keyByteIndex = i % keySigBytes;\n\t                var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;\n\n\t                j = (j + S[i] + keyByte) % 256;\n\n\t                // Swap\n\t                var t = S[i];\n\t                S[i] = S[j];\n\t                S[j] = t;\n\t            }\n\n\t            // Counters\n\t            this._i = this._j = 0;\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            M[offset] ^= generateKeystreamWord.call(this);\n\t        },\n\n\t        keySize: 256/32,\n\n\t        ivSize: 0\n\t    });\n\n\t    function generateKeystreamWord() {\n\t        // Shortcuts\n\t        var S = this._S;\n\t        var i = this._i;\n\t        var j = this._j;\n\n\t        // Generate keystream word\n\t        var keystreamWord = 0;\n\t        for (var n = 0; n < 4; n++) {\n\t            i = (i + 1) % 256;\n\t            j = (j + S[i]) % 256;\n\n\t            // Swap\n\t            var t = S[i];\n\t            S[i] = S[j];\n\t            S[j] = t;\n\n\t            keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);\n\t        }\n\n\t        // Update counters\n\t        this._i = i;\n\t        this._j = j;\n\n\t        return keystreamWord;\n\t    }\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.RC4.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.RC4 = StreamCipher._createHelper(RC4);\n\n\t    /**\n\t     * Modified RC4 stream cipher algorithm.\n\t     */\n\t    var RC4Drop = C_algo.RC4Drop = RC4.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {number} drop The number of keystream words to drop. Default 192\n\t         */\n\t        cfg: RC4.cfg.extend({\n\t            drop: 192\n\t        }),\n\n\t        _doReset: function () {\n\t            RC4._doReset.call(this);\n\n\t            // Drop\n\t            for (var i = this.cfg.drop; i > 0; i--) {\n\t                generateKeystreamWord.call(this);\n\t            }\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.RC4Drop = StreamCipher._createHelper(RC4Drop);\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var StreamCipher = C_lib.StreamCipher;\n\t    var C_algo = C.algo;\n\n\t    // Reusable objects\n\t    var S  = [];\n\t    var C_ = [];\n\t    var G  = [];\n\n\t    /**\n\t     * Rabbit stream cipher algorithm\n\t     */\n\t    var Rabbit = C_algo.Rabbit = StreamCipher.extend({\n\t        _doReset: function () {\n\t            // Shortcuts\n\t            var K = this._key.words;\n\t            var iv = this.cfg.iv;\n\n\t            // Swap endian\n\t            for (var i = 0; i < 4; i++) {\n\t                K[i] = (((K[i] << 8)  | (K[i] >>> 24)) & 0x00ff00ff) |\n\t                       (((K[i] << 24) | (K[i] >>> 8))  & 0xff00ff00);\n\t            }\n\n\t            // Generate initial state values\n\t            var X = this._X = [\n\t                K[0], (K[3] << 16) | (K[2] >>> 16),\n\t                K[1], (K[0] << 16) | (K[3] >>> 16),\n\t                K[2], (K[1] << 16) | (K[0] >>> 16),\n\t                K[3], (K[2] << 16) | (K[1] >>> 16)\n\t            ];\n\n\t            // Generate initial counter values\n\t            var C = this._C = [\n\t                (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),\n\t                (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),\n\t                (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),\n\t                (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)\n\t            ];\n\n\t            // Carry bit\n\t            this._b = 0;\n\n\t            // Iterate the system four times\n\t            for (var i = 0; i < 4; i++) {\n\t                nextState.call(this);\n\t            }\n\n\t            // Modify the counters\n\t            for (var i = 0; i < 8; i++) {\n\t                C[i] ^= X[(i + 4) & 7];\n\t            }\n\n\t            // IV setup\n\t            if (iv) {\n\t                // Shortcuts\n\t                var IV = iv.words;\n\t                var IV_0 = IV[0];\n\t                var IV_1 = IV[1];\n\n\t                // Generate four subvectors\n\t                var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);\n\t                var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);\n\t                var i1 = (i0 >>> 16) | (i2 & 0xffff0000);\n\t                var i3 = (i2 << 16)  | (i0 & 0x0000ffff);\n\n\t                // Modify counter values\n\t                C[0] ^= i0;\n\t                C[1] ^= i1;\n\t                C[2] ^= i2;\n\t                C[3] ^= i3;\n\t                C[4] ^= i0;\n\t                C[5] ^= i1;\n\t                C[6] ^= i2;\n\t                C[7] ^= i3;\n\n\t                // Iterate the system four times\n\t                for (var i = 0; i < 4; i++) {\n\t                    nextState.call(this);\n\t                }\n\t            }\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcut\n\t            var X = this._X;\n\n\t            // Iterate the system\n\t            nextState.call(this);\n\n\t            // Generate four keystream words\n\t            S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);\n\t            S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);\n\t            S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);\n\t            S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);\n\n\t            for (var i = 0; i < 4; i++) {\n\t                // Swap endian\n\t                S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |\n\t                       (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);\n\n\t                // Encrypt\n\t                M[offset + i] ^= S[i];\n\t            }\n\t        },\n\n\t        blockSize: 128/32,\n\n\t        ivSize: 64/32\n\t    });\n\n\t    function nextState() {\n\t        // Shortcuts\n\t        var X = this._X;\n\t        var C = this._C;\n\n\t        // Save old counter values\n\t        for (var i = 0; i < 8; i++) {\n\t            C_[i] = C[i];\n\t        }\n\n\t        // Calculate new counter values\n\t        C[0] = (C[0] + 0x4d34d34d + this._b) | 0;\n\t        C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;\n\t        C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;\n\t        C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;\n\t        C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;\n\t        C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;\n\t        C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;\n\t        C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;\n\t        this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;\n\n\t        // Calculate the g-values\n\t        for (var i = 0; i < 8; i++) {\n\t            var gx = X[i] + C[i];\n\n\t            // Construct high and low argument for squaring\n\t            var ga = gx & 0xffff;\n\t            var gb = gx >>> 16;\n\n\t            // Calculate high and low result of squaring\n\t            var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;\n\t            var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);\n\n\t            // High XOR low\n\t            G[i] = gh ^ gl;\n\t        }\n\n\t        // Calculate new state values\n\t        X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;\n\t        X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;\n\t        X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;\n\t        X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;\n\t        X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;\n\t        X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;\n\t        X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;\n\t        X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;\n\t    }\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.Rabbit = StreamCipher._createHelper(Rabbit);\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var StreamCipher = C_lib.StreamCipher;\n\t    var C_algo = C.algo;\n\n\t    // Reusable objects\n\t    var S  = [];\n\t    var C_ = [];\n\t    var G  = [];\n\n\t    /**\n\t     * Rabbit stream cipher algorithm.\n\t     *\n\t     * This is a legacy version that neglected to convert the key to little-endian.\n\t     * This error doesn't affect the cipher's security,\n\t     * but it does affect its compatibility with other implementations.\n\t     */\n\t    var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({\n\t        _doReset: function () {\n\t            // Shortcuts\n\t            var K = this._key.words;\n\t            var iv = this.cfg.iv;\n\n\t            // Generate initial state values\n\t            var X = this._X = [\n\t                K[0], (K[3] << 16) | (K[2] >>> 16),\n\t                K[1], (K[0] << 16) | (K[3] >>> 16),\n\t                K[2], (K[1] << 16) | (K[0] >>> 16),\n\t                K[3], (K[2] << 16) | (K[1] >>> 16)\n\t            ];\n\n\t            // Generate initial counter values\n\t            var C = this._C = [\n\t                (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),\n\t                (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),\n\t                (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),\n\t                (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)\n\t            ];\n\n\t            // Carry bit\n\t            this._b = 0;\n\n\t            // Iterate the system four times\n\t            for (var i = 0; i < 4; i++) {\n\t                nextState.call(this);\n\t            }\n\n\t            // Modify the counters\n\t            for (var i = 0; i < 8; i++) {\n\t                C[i] ^= X[(i + 4) & 7];\n\t            }\n\n\t            // IV setup\n\t            if (iv) {\n\t                // Shortcuts\n\t                var IV = iv.words;\n\t                var IV_0 = IV[0];\n\t                var IV_1 = IV[1];\n\n\t                // Generate four subvectors\n\t                var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);\n\t                var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);\n\t                var i1 = (i0 >>> 16) | (i2 & 0xffff0000);\n\t                var i3 = (i2 << 16)  | (i0 & 0x0000ffff);\n\n\t                // Modify counter values\n\t                C[0] ^= i0;\n\t                C[1] ^= i1;\n\t                C[2] ^= i2;\n\t                C[3] ^= i3;\n\t                C[4] ^= i0;\n\t                C[5] ^= i1;\n\t                C[6] ^= i2;\n\t                C[7] ^= i3;\n\n\t                // Iterate the system four times\n\t                for (var i = 0; i < 4; i++) {\n\t                    nextState.call(this);\n\t                }\n\t            }\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcut\n\t            var X = this._X;\n\n\t            // Iterate the system\n\t            nextState.call(this);\n\n\t            // Generate four keystream words\n\t            S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);\n\t            S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);\n\t            S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);\n\t            S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);\n\n\t            for (var i = 0; i < 4; i++) {\n\t                // Swap endian\n\t                S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |\n\t                       (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);\n\n\t                // Encrypt\n\t                M[offset + i] ^= S[i];\n\t            }\n\t        },\n\n\t        blockSize: 128/32,\n\n\t        ivSize: 64/32\n\t    });\n\n\t    function nextState() {\n\t        // Shortcuts\n\t        var X = this._X;\n\t        var C = this._C;\n\n\t        // Save old counter values\n\t        for (var i = 0; i < 8; i++) {\n\t            C_[i] = C[i];\n\t        }\n\n\t        // Calculate new counter values\n\t        C[0] = (C[0] + 0x4d34d34d + this._b) | 0;\n\t        C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;\n\t        C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;\n\t        C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;\n\t        C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;\n\t        C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;\n\t        C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;\n\t        C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;\n\t        this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;\n\n\t        // Calculate the g-values\n\t        for (var i = 0; i < 8; i++) {\n\t            var gx = X[i] + C[i];\n\n\t            // Construct high and low argument for squaring\n\t            var ga = gx & 0xffff;\n\t            var gb = gx >>> 16;\n\n\t            // Calculate high and low result of squaring\n\t            var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;\n\t            var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);\n\n\t            // High XOR low\n\t            G[i] = gh ^ gl;\n\t        }\n\n\t        // Calculate new state values\n\t        X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;\n\t        X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;\n\t        X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;\n\t        X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;\n\t        X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;\n\t        X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;\n\t        X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;\n\t        X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;\n\t    }\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);\n\t}());\n\n\n\treturn CryptoJS;\n\n}));","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClassicEditor\"] = factory();\n\telse\n\t\troot[\"ClassicEditor\"] = factory();\n})(self, () => {\nreturn ","/* MIT license */\n/* eslint-disable no-mixed-operators */\nconst cssKeywords = require('color-name');\n\n// NOTE: conversions should only return primitive values (i.e. arrays, or\n//       values that give correct `typeof` results).\n//       do not use box values types (i.e. Number(), String(), etc.)\n\nconst reverseKeywords = {};\nfor (const key of Object.keys(cssKeywords)) {\n\treverseKeywords[cssKeywords[key]] = key;\n}\n\nconst convert = {\n\trgb: {channels: 3, labels: 'rgb'},\n\thsl: {channels: 3, labels: 'hsl'},\n\thsv: {channels: 3, labels: 'hsv'},\n\thwb: {channels: 3, labels: 'hwb'},\n\tcmyk: {channels: 4, labels: 'cmyk'},\n\txyz: {channels: 3, labels: 'xyz'},\n\tlab: {channels: 3, labels: 'lab'},\n\tlch: {channels: 3, labels: 'lch'},\n\thex: {channels: 1, labels: ['hex']},\n\tkeyword: {channels: 1, labels: ['keyword']},\n\tansi16: {channels: 1, labels: ['ansi16']},\n\tansi256: {channels: 1, labels: ['ansi256']},\n\thcg: {channels: 3, labels: ['h', 'c', 'g']},\n\tapple: {channels: 3, labels: ['r16', 'g16', 'b16']},\n\tgray: {channels: 1, labels: ['gray']}\n};\n\nmodule.exports = convert;\n\n// Hide .channels and .labels properties\nfor (const model of Object.keys(convert)) {\n\tif (!('channels' in convert[model])) {\n\t\tthrow new Error('missing channels property: ' + model);\n\t}\n\n\tif (!('labels' in convert[model])) {\n\t\tthrow new Error('missing channel labels property: ' + model);\n\t}\n\n\tif (convert[model].labels.length !== convert[model].channels) {\n\t\tthrow new Error('channel and label counts mismatch: ' + model);\n\t}\n\n\tconst {channels, labels} = convert[model];\n\tdelete convert[model].channels;\n\tdelete convert[model].labels;\n\tObject.defineProperty(convert[model], 'channels', {value: channels});\n\tObject.defineProperty(convert[model], 'labels', {value: labels});\n}\n\nconvert.rgb.hsl = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst min = Math.min(r, g, b);\n\tconst max = Math.max(r, g, b);\n\tconst delta = max - min;\n\tlet h;\n\tlet s;\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst l = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t} else if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t} else {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n\nconvert.rgb.hsv = function (rgb) {\n\tlet rdif;\n\tlet gdif;\n\tlet bdif;\n\tlet h;\n\tlet s;\n\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst v = Math.max(r, g, b);\n\tconst diff = v - Math.min(r, g, b);\n\tconst diffc = function (c) {\n\t\treturn (v - c) / 6 / diff + 1 / 2;\n\t};\n\n\tif (diff === 0) {\n\t\th = 0;\n\t\ts = 0;\n\t} else {\n\t\ts = diff / v;\n\t\trdif = diffc(r);\n\t\tgdif = diffc(g);\n\t\tbdif = diffc(b);\n\n\t\tif (r === v) {\n\t\t\th = bdif - gdif;\n\t\t} else if (g === v) {\n\t\t\th = (1 / 3) + rdif - bdif;\n\t\t} else if (b === v) {\n\t\t\th = (2 / 3) + gdif - rdif;\n\t\t}\n\n\t\tif (h < 0) {\n\t\t\th += 1;\n\t\t} else if (h > 1) {\n\t\t\th -= 1;\n\t\t}\n\t}\n\n\treturn [\n\t\th * 360,\n\t\ts * 100,\n\t\tv * 100\n\t];\n};\n\nconvert.rgb.hwb = function (rgb) {\n\tconst r = rgb[0];\n\tconst g = rgb[1];\n\tlet b = rgb[2];\n\tconst h = convert.rgb.hsl(rgb)[0];\n\tconst w = 1 / 255 * Math.min(r, Math.min(g, b));\n\n\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\treturn [h, w * 100, b * 100];\n};\n\nconvert.rgb.cmyk = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\n\tconst k = Math.min(1 - r, 1 - g, 1 - b);\n\tconst c = (1 - r - k) / (1 - k) || 0;\n\tconst m = (1 - g - k) / (1 - k) || 0;\n\tconst y = (1 - b - k) / (1 - k) || 0;\n\n\treturn [c * 100, m * 100, y * 100, k * 100];\n};\n\nfunction comparativeDistance(x, y) {\n\t/*\n\t\tSee https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance\n\t*/\n\treturn (\n\t\t((x[0] - y[0]) ** 2) +\n\t\t((x[1] - y[1]) ** 2) +\n\t\t((x[2] - y[2]) ** 2)\n\t);\n}\n\nconvert.rgb.keyword = function (rgb) {\n\tconst reversed = reverseKeywords[rgb];\n\tif (reversed) {\n\t\treturn reversed;\n\t}\n\n\tlet currentClosestDistance = Infinity;\n\tlet currentClosestKeyword;\n\n\tfor (const keyword of Object.keys(cssKeywords)) {\n\t\tconst value = cssKeywords[keyword];\n\n\t\t// Compute comparative distance\n\t\tconst distance = comparativeDistance(rgb, value);\n\n\t\t// Check if its less, if so set as closest\n\t\tif (distance < currentClosestDistance) {\n\t\t\tcurrentClosestDistance = distance;\n\t\t\tcurrentClosestKeyword = keyword;\n\t\t}\n\t}\n\n\treturn currentClosestKeyword;\n};\n\nconvert.keyword.rgb = function (keyword) {\n\treturn cssKeywords[keyword];\n};\n\nconvert.rgb.xyz = function (rgb) {\n\tlet r = rgb[0] / 255;\n\tlet g = rgb[1] / 255;\n\tlet b = rgb[2] / 255;\n\n\t// Assume sRGB\n\tr = r > 0.04045 ? (((r + 0.055) / 1.055) ** 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? (((g + 0.055) / 1.055) ** 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? (((b + 0.055) / 1.055) ** 2.4) : (b / 12.92);\n\n\tconst x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\tconst y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\tconst z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n\treturn [x * 100, y * 100, z * 100];\n};\n\nconvert.rgb.lab = function (rgb) {\n\tconst xyz = convert.rgb.xyz(rgb);\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.hsl.rgb = function (hsl) {\n\tconst h = hsl[0] / 360;\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\tlet t2;\n\tlet t3;\n\tlet val;\n\n\tif (s === 0) {\n\t\tval = l * 255;\n\t\treturn [val, val, val];\n\t}\n\n\tif (l < 0.5) {\n\t\tt2 = l * (1 + s);\n\t} else {\n\t\tt2 = l + s - l * s;\n\t}\n\n\tconst t1 = 2 * l - t2;\n\n\tconst rgb = [0, 0, 0];\n\tfor (let i = 0; i < 3; i++) {\n\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\tif (t3 < 0) {\n\t\t\tt3++;\n\t\t}\n\n\t\tif (t3 > 1) {\n\t\t\tt3--;\n\t\t}\n\n\t\tif (6 * t3 < 1) {\n\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t} else if (2 * t3 < 1) {\n\t\t\tval = t2;\n\t\t} else if (3 * t3 < 2) {\n\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t} else {\n\t\t\tval = t1;\n\t\t}\n\n\t\trgb[i] = val * 255;\n\t}\n\n\treturn rgb;\n};\n\nconvert.hsl.hsv = function (hsl) {\n\tconst h = hsl[0];\n\tlet s = hsl[1] / 100;\n\tlet l = hsl[2] / 100;\n\tlet smin = s;\n\tconst lmin = Math.max(l, 0.01);\n\n\tl *= 2;\n\ts *= (l <= 1) ? l : 2 - l;\n\tsmin *= lmin <= 1 ? lmin : 2 - lmin;\n\tconst v = (l + s) / 2;\n\tconst sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);\n\n\treturn [h, sv * 100, v * 100];\n};\n\nconvert.hsv.rgb = function (hsv) {\n\tconst h = hsv[0] / 60;\n\tconst s = hsv[1] / 100;\n\tlet v = hsv[2] / 100;\n\tconst hi = Math.floor(h) % 6;\n\n\tconst f = h - Math.floor(h);\n\tconst p = 255 * v * (1 - s);\n\tconst q = 255 * v * (1 - (s * f));\n\tconst t = 255 * v * (1 - (s * (1 - f)));\n\tv *= 255;\n\n\tswitch (hi) {\n\t\tcase 0:\n\t\t\treturn [v, t, p];\n\t\tcase 1:\n\t\t\treturn [q, v, p];\n\t\tcase 2:\n\t\t\treturn [p, v, t];\n\t\tcase 3:\n\t\t\treturn [p, q, v];\n\t\tcase 4:\n\t\t\treturn [t, p, v];\n\t\tcase 5:\n\t\t\treturn [v, p, q];\n\t}\n};\n\nconvert.hsv.hsl = function (hsv) {\n\tconst h = hsv[0];\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\tconst vmin = Math.max(v, 0.01);\n\tlet sl;\n\tlet l;\n\n\tl = (2 - s) * v;\n\tconst lmin = (2 - s) * vmin;\n\tsl = s * vmin;\n\tsl /= (lmin <= 1) ? lmin : 2 - lmin;\n\tsl = sl || 0;\n\tl /= 2;\n\n\treturn [h, sl * 100, l * 100];\n};\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nconvert.hwb.rgb = function (hwb) {\n\tconst h = hwb[0] / 360;\n\tlet wh = hwb[1] / 100;\n\tlet bl = hwb[2] / 100;\n\tconst ratio = wh + bl;\n\tlet f;\n\n\t// Wh + bl cant be > 1\n\tif (ratio > 1) {\n\t\twh /= ratio;\n\t\tbl /= ratio;\n\t}\n\n\tconst i = Math.floor(6 * h);\n\tconst v = 1 - bl;\n\tf = 6 * h - i;\n\n\tif ((i & 0x01) !== 0) {\n\t\tf = 1 - f;\n\t}\n\n\tconst n = wh + f * (v - wh); // Linear interpolation\n\n\tlet r;\n\tlet g;\n\tlet b;\n\t/* eslint-disable max-statements-per-line,no-multi-spaces */\n\tswitch (i) {\n\t\tdefault:\n\t\tcase 6:\n\t\tcase 0: r = v;  g = n;  b = wh; break;\n\t\tcase 1: r = n;  g = v;  b = wh; break;\n\t\tcase 2: r = wh; g = v;  b = n; break;\n\t\tcase 3: r = wh; g = n;  b = v; break;\n\t\tcase 4: r = n;  g = wh; b = v; break;\n\t\tcase 5: r = v;  g = wh; b = n; break;\n\t}\n\t/* eslint-enable max-statements-per-line,no-multi-spaces */\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.cmyk.rgb = function (cmyk) {\n\tconst c = cmyk[0] / 100;\n\tconst m = cmyk[1] / 100;\n\tconst y = cmyk[2] / 100;\n\tconst k = cmyk[3] / 100;\n\n\tconst r = 1 - Math.min(1, c * (1 - k) + k);\n\tconst g = 1 - Math.min(1, m * (1 - k) + k);\n\tconst b = 1 - Math.min(1, y * (1 - k) + k);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.rgb = function (xyz) {\n\tconst x = xyz[0] / 100;\n\tconst y = xyz[1] / 100;\n\tconst z = xyz[2] / 100;\n\tlet r;\n\tlet g;\n\tlet b;\n\n\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n\t// Assume sRGB\n\tr = r > 0.0031308\n\t\t? ((1.055 * (r ** (1.0 / 2.4))) - 0.055)\n\t\t: r * 12.92;\n\n\tg = g > 0.0031308\n\t\t? ((1.055 * (g ** (1.0 / 2.4))) - 0.055)\n\t\t: g * 12.92;\n\n\tb = b > 0.0031308\n\t\t? ((1.055 * (b ** (1.0 / 2.4))) - 0.055)\n\t\t: b * 12.92;\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.lab = function (xyz) {\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.lab.xyz = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet x;\n\tlet y;\n\tlet z;\n\n\ty = (l + 16) / 116;\n\tx = a / 500 + y;\n\tz = y - b / 200;\n\n\tconst y2 = y ** 3;\n\tconst x2 = x ** 3;\n\tconst z2 = z ** 3;\n\ty = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;\n\tx = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;\n\tz = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;\n\n\tx *= 95.047;\n\ty *= 100;\n\tz *= 108.883;\n\n\treturn [x, y, z];\n};\n\nconvert.lab.lch = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet h;\n\n\tconst hr = Math.atan2(b, a);\n\th = hr * 360 / 2 / Math.PI;\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst c = Math.sqrt(a * a + b * b);\n\n\treturn [l, c, h];\n};\n\nconvert.lch.lab = function (lch) {\n\tconst l = lch[0];\n\tconst c = lch[1];\n\tconst h = lch[2];\n\n\tconst hr = h / 360 * 2 * Math.PI;\n\tconst a = c * Math.cos(hr);\n\tconst b = c * Math.sin(hr);\n\n\treturn [l, a, b];\n};\n\nconvert.rgb.ansi16 = function (args, saturation = null) {\n\tconst [r, g, b] = args;\n\tlet value = saturation === null ? convert.rgb.hsv(args)[2] : saturation; // Hsv -> ansi16 optimization\n\n\tvalue = Math.round(value / 50);\n\n\tif (value === 0) {\n\t\treturn 30;\n\t}\n\n\tlet ansi = 30\n\t\t+ ((Math.round(b / 255) << 2)\n\t\t| (Math.round(g / 255) << 1)\n\t\t| Math.round(r / 255));\n\n\tif (value === 2) {\n\t\tansi += 60;\n\t}\n\n\treturn ansi;\n};\n\nconvert.hsv.ansi16 = function (args) {\n\t// Optimization here; we already know the value and don't need to get\n\t// it converted for us.\n\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n};\n\nconvert.rgb.ansi256 = function (args) {\n\tconst r = args[0];\n\tconst g = args[1];\n\tconst b = args[2];\n\n\t// We use the extended greyscale palette here, with the exception of\n\t// black and white. normal palette only has 4 greyscale shades.\n\tif (r === g && g === b) {\n\t\tif (r < 8) {\n\t\t\treturn 16;\n\t\t}\n\n\t\tif (r > 248) {\n\t\t\treturn 231;\n\t\t}\n\n\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t}\n\n\tconst ansi = 16\n\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t+ Math.round(b / 255 * 5);\n\n\treturn ansi;\n};\n\nconvert.ansi16.rgb = function (args) {\n\tlet color = args % 10;\n\n\t// Handle greyscale\n\tif (color === 0 || color === 7) {\n\t\tif (args > 50) {\n\t\t\tcolor += 3.5;\n\t\t}\n\n\t\tcolor = color / 10.5 * 255;\n\n\t\treturn [color, color, color];\n\t}\n\n\tconst mult = (~~(args > 50) + 1) * 0.5;\n\tconst r = ((color & 1) * mult) * 255;\n\tconst g = (((color >> 1) & 1) * mult) * 255;\n\tconst b = (((color >> 2) & 1) * mult) * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.ansi256.rgb = function (args) {\n\t// Handle greyscale\n\tif (args >= 232) {\n\t\tconst c = (args - 232) * 10 + 8;\n\t\treturn [c, c, c];\n\t}\n\n\targs -= 16;\n\n\tlet rem;\n\tconst r = Math.floor(args / 36) / 5 * 255;\n\tconst g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\tconst b = (rem % 6) / 5 * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hex = function (args) {\n\tconst integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t+ (Math.round(args[2]) & 0xFF);\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.hex.rgb = function (args) {\n\tconst match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);\n\tif (!match) {\n\t\treturn [0, 0, 0];\n\t}\n\n\tlet colorString = match[0];\n\n\tif (match[0].length === 3) {\n\t\tcolorString = colorString.split('').map(char => {\n\t\t\treturn char + char;\n\t\t}).join('');\n\t}\n\n\tconst integer = parseInt(colorString, 16);\n\tconst r = (integer >> 16) & 0xFF;\n\tconst g = (integer >> 8) & 0xFF;\n\tconst b = integer & 0xFF;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hcg = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst max = Math.max(Math.max(r, g), b);\n\tconst min = Math.min(Math.min(r, g), b);\n\tconst chroma = (max - min);\n\tlet grayscale;\n\tlet hue;\n\n\tif (chroma < 1) {\n\t\tgrayscale = min / (1 - chroma);\n\t} else {\n\t\tgrayscale = 0;\n\t}\n\n\tif (chroma <= 0) {\n\t\thue = 0;\n\t} else\n\tif (max === r) {\n\t\thue = ((g - b) / chroma) % 6;\n\t} else\n\tif (max === g) {\n\t\thue = 2 + (b - r) / chroma;\n\t} else {\n\t\thue = 4 + (r - g) / chroma;\n\t}\n\n\thue /= 6;\n\thue %= 1;\n\n\treturn [hue * 360, chroma * 100, grayscale * 100];\n};\n\nconvert.hsl.hcg = function (hsl) {\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\n\tconst c = l < 0.5 ? (2.0 * s * l) : (2.0 * s * (1.0 - l));\n\n\tlet f = 0;\n\tif (c < 1.0) {\n\t\tf = (l - 0.5 * c) / (1.0 - c);\n\t}\n\n\treturn [hsl[0], c * 100, f * 100];\n};\n\nconvert.hsv.hcg = function (hsv) {\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\n\tconst c = s * v;\n\tlet f = 0;\n\n\tif (c < 1.0) {\n\t\tf = (v - c) / (1 - c);\n\t}\n\n\treturn [hsv[0], c * 100, f * 100];\n};\n\nconvert.hcg.rgb = function (hcg) {\n\tconst h = hcg[0] / 360;\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tif (c === 0.0) {\n\t\treturn [g * 255, g * 255, g * 255];\n\t}\n\n\tconst pure = [0, 0, 0];\n\tconst hi = (h % 1) * 6;\n\tconst v = hi % 1;\n\tconst w = 1 - v;\n\tlet mg = 0;\n\n\t/* eslint-disable max-statements-per-line */\n\tswitch (Math.floor(hi)) {\n\t\tcase 0:\n\t\t\tpure[0] = 1; pure[1] = v; pure[2] = 0; break;\n\t\tcase 1:\n\t\t\tpure[0] = w; pure[1] = 1; pure[2] = 0; break;\n\t\tcase 2:\n\t\t\tpure[0] = 0; pure[1] = 1; pure[2] = v; break;\n\t\tcase 3:\n\t\t\tpure[0] = 0; pure[1] = w; pure[2] = 1; break;\n\t\tcase 4:\n\t\t\tpure[0] = v; pure[1] = 0; pure[2] = 1; break;\n\t\tdefault:\n\t\t\tpure[0] = 1; pure[1] = 0; pure[2] = w;\n\t}\n\t/* eslint-enable max-statements-per-line */\n\n\tmg = (1.0 - c) * g;\n\n\treturn [\n\t\t(c * pure[0] + mg) * 255,\n\t\t(c * pure[1] + mg) * 255,\n\t\t(c * pure[2] + mg) * 255\n\t];\n};\n\nconvert.hcg.hsv = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst v = c + g * (1.0 - c);\n\tlet f = 0;\n\n\tif (v > 0.0) {\n\t\tf = c / v;\n\t}\n\n\treturn [hcg[0], f * 100, v * 100];\n};\n\nconvert.hcg.hsl = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst l = g * (1.0 - c) + 0.5 * c;\n\tlet s = 0;\n\n\tif (l > 0.0 && l < 0.5) {\n\t\ts = c / (2 * l);\n\t} else\n\tif (l >= 0.5 && l < 1.0) {\n\t\ts = c / (2 * (1 - l));\n\t}\n\n\treturn [hcg[0], s * 100, l * 100];\n};\n\nconvert.hcg.hwb = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\tconst v = c + g * (1.0 - c);\n\treturn [hcg[0], (v - c) * 100, (1 - v) * 100];\n};\n\nconvert.hwb.hcg = function (hwb) {\n\tconst w = hwb[1] / 100;\n\tconst b = hwb[2] / 100;\n\tconst v = 1 - b;\n\tconst c = v - w;\n\tlet g = 0;\n\n\tif (c < 1) {\n\t\tg = (v - c) / (1 - c);\n\t}\n\n\treturn [hwb[0], c * 100, g * 100];\n};\n\nconvert.apple.rgb = function (apple) {\n\treturn [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];\n};\n\nconvert.rgb.apple = function (rgb) {\n\treturn [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];\n};\n\nconvert.gray.rgb = function (args) {\n\treturn [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];\n};\n\nconvert.gray.hsl = function (args) {\n\treturn [0, 0, args[0]];\n};\n\nconvert.gray.hsv = convert.gray.hsl;\n\nconvert.gray.hwb = function (gray) {\n\treturn [0, 100, gray[0]];\n};\n\nconvert.gray.cmyk = function (gray) {\n\treturn [0, 0, 0, gray[0]];\n};\n\nconvert.gray.lab = function (gray) {\n\treturn [gray[0], 0, 0];\n};\n\nconvert.gray.hex = function (gray) {\n\tconst val = Math.round(gray[0] / 100 * 255) & 0xFF;\n\tconst integer = (val << 16) + (val << 8) + val;\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.rgb.gray = function (rgb) {\n\tconst val = (rgb[0] + rgb[1] + rgb[2]) / 3;\n\treturn [val / 255 * 100];\n};\n","const conversions = require('./conversions');\nconst route = require('./route');\n\nconst convert = {};\n\nconst models = Object.keys(conversions);\n\nfunction wrapRaw(fn) {\n\tconst wrappedFn = function (...args) {\n\t\tconst arg0 = args[0];\n\t\tif (arg0 === undefined || arg0 === null) {\n\t\t\treturn arg0;\n\t\t}\n\n\t\tif (arg0.length > 1) {\n\t\t\targs = arg0;\n\t\t}\n\n\t\treturn fn(args);\n\t};\n\n\t// Preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nfunction wrapRounded(fn) {\n\tconst wrappedFn = function (...args) {\n\t\tconst arg0 = args[0];\n\n\t\tif (arg0 === undefined || arg0 === null) {\n\t\t\treturn arg0;\n\t\t}\n\n\t\tif (arg0.length > 1) {\n\t\t\targs = arg0;\n\t\t}\n\n\t\tconst result = fn(args);\n\n\t\t// We're assuming the result is an array here.\n\t\t// see notice in conversions.js; don't use box types\n\t\t// in conversion functions.\n\t\tif (typeof result === 'object') {\n\t\t\tfor (let len = result.length, i = 0; i < len; i++) {\n\t\t\t\tresult[i] = Math.round(result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t// Preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nmodels.forEach(fromModel => {\n\tconvert[fromModel] = {};\n\n\tObject.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});\n\tObject.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});\n\n\tconst routes = route(fromModel);\n\tconst routeModels = Object.keys(routes);\n\n\trouteModels.forEach(toModel => {\n\t\tconst fn = routes[toModel];\n\n\t\tconvert[fromModel][toModel] = wrapRounded(fn);\n\t\tconvert[fromModel][toModel].raw = wrapRaw(fn);\n\t});\n});\n\nmodule.exports = convert;\n","const conversions = require('./conversions');\n\n/*\n\tThis function routes a model to all other models.\n\n\tall functions that are routed have a property `.conversion` attached\n\tto the returned synthetic function. This property is an array\n\tof strings, each with the steps in between the 'from' and 'to'\n\tcolor models (inclusive).\n\n\tconversions that are not possible simply are not included.\n*/\n\nfunction buildGraph() {\n\tconst graph = {};\n\t// https://jsperf.com/object-keys-vs-for-in-with-closure/3\n\tconst models = Object.keys(conversions);\n\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tgraph[models[i]] = {\n\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t// micro-opt, but this is simple.\n\t\t\tdistance: -1,\n\t\t\tparent: null\n\t\t};\n\t}\n\n\treturn graph;\n}\n\n// https://en.wikipedia.org/wiki/Breadth-first_search\nfunction deriveBFS(fromModel) {\n\tconst graph = buildGraph();\n\tconst queue = [fromModel]; // Unshift -> queue -> pop\n\n\tgraph[fromModel].distance = 0;\n\n\twhile (queue.length) {\n\t\tconst current = queue.pop();\n\t\tconst adjacents = Object.keys(conversions[current]);\n\n\t\tfor (let len = adjacents.length, i = 0; i < len; i++) {\n\t\t\tconst adjacent = adjacents[i];\n\t\t\tconst node = graph[adjacent];\n\n\t\t\tif (node.distance === -1) {\n\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\tnode.parent = current;\n\t\t\t\tqueue.unshift(adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn graph;\n}\n\nfunction link(from, to) {\n\treturn function (args) {\n\t\treturn to(from(args));\n\t};\n}\n\nfunction wrapConversion(toModel, graph) {\n\tconst path = [graph[toModel].parent, toModel];\n\tlet fn = conversions[graph[toModel].parent][toModel];\n\n\tlet cur = graph[toModel].parent;\n\twhile (graph[cur].parent) {\n\t\tpath.unshift(graph[cur].parent);\n\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\tcur = graph[cur].parent;\n\t}\n\n\tfn.conversion = path;\n\treturn fn;\n}\n\nmodule.exports = function (fromModel) {\n\tconst graph = deriveBFS(fromModel);\n\tconst conversion = {};\n\n\tconst models = Object.keys(graph);\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tconst toModel = models[i];\n\t\tconst node = graph[toModel];\n\n\t\tif (node.parent === null) {\n\t\t\t// No possible conversion, or this node is the source model.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t}\n\n\treturn conversion;\n};\n\n","'use strict'\r\n\r\nmodule.exports = {\r\n\t\"aliceblue\": [240, 248, 255],\r\n\t\"antiquewhite\": [250, 235, 215],\r\n\t\"aqua\": [0, 255, 255],\r\n\t\"aquamarine\": [127, 255, 212],\r\n\t\"azure\": [240, 255, 255],\r\n\t\"beige\": [245, 245, 220],\r\n\t\"bisque\": [255, 228, 196],\r\n\t\"black\": [0, 0, 0],\r\n\t\"blanchedalmond\": [255, 235, 205],\r\n\t\"blue\": [0, 0, 255],\r\n\t\"blueviolet\": [138, 43, 226],\r\n\t\"brown\": [165, 42, 42],\r\n\t\"burlywood\": [222, 184, 135],\r\n\t\"cadetblue\": [95, 158, 160],\r\n\t\"chartreuse\": [127, 255, 0],\r\n\t\"chocolate\": [210, 105, 30],\r\n\t\"coral\": [255, 127, 80],\r\n\t\"cornflowerblue\": [100, 149, 237],\r\n\t\"cornsilk\": [255, 248, 220],\r\n\t\"crimson\": [220, 20, 60],\r\n\t\"cyan\": [0, 255, 255],\r\n\t\"darkblue\": [0, 0, 139],\r\n\t\"darkcyan\": [0, 139, 139],\r\n\t\"darkgoldenrod\": [184, 134, 11],\r\n\t\"darkgray\": [169, 169, 169],\r\n\t\"darkgreen\": [0, 100, 0],\r\n\t\"darkgrey\": [169, 169, 169],\r\n\t\"darkkhaki\": [189, 183, 107],\r\n\t\"darkmagenta\": [139, 0, 139],\r\n\t\"darkolivegreen\": [85, 107, 47],\r\n\t\"darkorange\": [255, 140, 0],\r\n\t\"darkorchid\": [153, 50, 204],\r\n\t\"darkred\": [139, 0, 0],\r\n\t\"darksalmon\": [233, 150, 122],\r\n\t\"darkseagreen\": [143, 188, 143],\r\n\t\"darkslateblue\": [72, 61, 139],\r\n\t\"darkslategray\": [47, 79, 79],\r\n\t\"darkslategrey\": [47, 79, 79],\r\n\t\"darkturquoise\": [0, 206, 209],\r\n\t\"darkviolet\": [148, 0, 211],\r\n\t\"deeppink\": [255, 20, 147],\r\n\t\"deepskyblue\": [0, 191, 255],\r\n\t\"dimgray\": [105, 105, 105],\r\n\t\"dimgrey\": [105, 105, 105],\r\n\t\"dodgerblue\": [30, 144, 255],\r\n\t\"firebrick\": [178, 34, 34],\r\n\t\"floralwhite\": [255, 250, 240],\r\n\t\"forestgreen\": [34, 139, 34],\r\n\t\"fuchsia\": [255, 0, 255],\r\n\t\"gainsboro\": [220, 220, 220],\r\n\t\"ghostwhite\": [248, 248, 255],\r\n\t\"gold\": [255, 215, 0],\r\n\t\"goldenrod\": [218, 165, 32],\r\n\t\"gray\": [128, 128, 128],\r\n\t\"green\": [0, 128, 0],\r\n\t\"greenyellow\": [173, 255, 47],\r\n\t\"grey\": [128, 128, 128],\r\n\t\"honeydew\": [240, 255, 240],\r\n\t\"hotpink\": [255, 105, 180],\r\n\t\"indianred\": [205, 92, 92],\r\n\t\"indigo\": [75, 0, 130],\r\n\t\"ivory\": [255, 255, 240],\r\n\t\"khaki\": [240, 230, 140],\r\n\t\"lavender\": [230, 230, 250],\r\n\t\"lavenderblush\": [255, 240, 245],\r\n\t\"lawngreen\": [124, 252, 0],\r\n\t\"lemonchiffon\": [255, 250, 205],\r\n\t\"lightblue\": [173, 216, 230],\r\n\t\"lightcoral\": [240, 128, 128],\r\n\t\"lightcyan\": [224, 255, 255],\r\n\t\"lightgoldenrodyellow\": [250, 250, 210],\r\n\t\"lightgray\": [211, 211, 211],\r\n\t\"lightgreen\": [144, 238, 144],\r\n\t\"lightgrey\": [211, 211, 211],\r\n\t\"lightpink\": [255, 182, 193],\r\n\t\"lightsalmon\": [255, 160, 122],\r\n\t\"lightseagreen\": [32, 178, 170],\r\n\t\"lightskyblue\": [135, 206, 250],\r\n\t\"lightslategray\": [119, 136, 153],\r\n\t\"lightslategrey\": [119, 136, 153],\r\n\t\"lightsteelblue\": [176, 196, 222],\r\n\t\"lightyellow\": [255, 255, 224],\r\n\t\"lime\": [0, 255, 0],\r\n\t\"limegreen\": [50, 205, 50],\r\n\t\"linen\": [250, 240, 230],\r\n\t\"magenta\": [255, 0, 255],\r\n\t\"maroon\": [128, 0, 0],\r\n\t\"mediumaquamarine\": [102, 205, 170],\r\n\t\"mediumblue\": [0, 0, 205],\r\n\t\"mediumorchid\": [186, 85, 211],\r\n\t\"mediumpurple\": [147, 112, 219],\r\n\t\"mediumseagreen\": [60, 179, 113],\r\n\t\"mediumslateblue\": [123, 104, 238],\r\n\t\"mediumspringgreen\": [0, 250, 154],\r\n\t\"mediumturquoise\": [72, 209, 204],\r\n\t\"mediumvioletred\": [199, 21, 133],\r\n\t\"midnightblue\": [25, 25, 112],\r\n\t\"mintcream\": [245, 255, 250],\r\n\t\"mistyrose\": [255, 228, 225],\r\n\t\"moccasin\": [255, 228, 181],\r\n\t\"navajowhite\": [255, 222, 173],\r\n\t\"navy\": [0, 0, 128],\r\n\t\"oldlace\": [253, 245, 230],\r\n\t\"olive\": [128, 128, 0],\r\n\t\"olivedrab\": [107, 142, 35],\r\n\t\"orange\": [255, 165, 0],\r\n\t\"orangered\": [255, 69, 0],\r\n\t\"orchid\": [218, 112, 214],\r\n\t\"palegoldenrod\": [238, 232, 170],\r\n\t\"palegreen\": [152, 251, 152],\r\n\t\"paleturquoise\": [175, 238, 238],\r\n\t\"palevioletred\": [219, 112, 147],\r\n\t\"papayawhip\": [255, 239, 213],\r\n\t\"peachpuff\": [255, 218, 185],\r\n\t\"peru\": [205, 133, 63],\r\n\t\"pink\": [255, 192, 203],\r\n\t\"plum\": [221, 160, 221],\r\n\t\"powderblue\": [176, 224, 230],\r\n\t\"purple\": [128, 0, 128],\r\n\t\"rebeccapurple\": [102, 51, 153],\r\n\t\"red\": [255, 0, 0],\r\n\t\"rosybrown\": [188, 143, 143],\r\n\t\"royalblue\": [65, 105, 225],\r\n\t\"saddlebrown\": [139, 69, 19],\r\n\t\"salmon\": [250, 128, 114],\r\n\t\"sandybrown\": [244, 164, 96],\r\n\t\"seagreen\": [46, 139, 87],\r\n\t\"seashell\": [255, 245, 238],\r\n\t\"sienna\": [160, 82, 45],\r\n\t\"silver\": [192, 192, 192],\r\n\t\"skyblue\": [135, 206, 235],\r\n\t\"slateblue\": [106, 90, 205],\r\n\t\"slategray\": [112, 128, 144],\r\n\t\"slategrey\": [112, 128, 144],\r\n\t\"snow\": [255, 250, 250],\r\n\t\"springgreen\": [0, 255, 127],\r\n\t\"steelblue\": [70, 130, 180],\r\n\t\"tan\": [210, 180, 140],\r\n\t\"teal\": [0, 128, 128],\r\n\t\"thistle\": [216, 191, 216],\r\n\t\"tomato\": [255, 99, 71],\r\n\t\"turquoise\": [64, 224, 208],\r\n\t\"violet\": [238, 130, 238],\r\n\t\"wheat\": [245, 222, 179],\r\n\t\"white\": [255, 255, 255],\r\n\t\"whitesmoke\": [245, 245, 245],\r\n\t\"yellow\": [255, 255, 0],\r\n\t\"yellowgreen\": [154, 205, 50]\r\n};\r\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck-content blockquote{border-left:5px solid #ccc;font-style:italic;margin-left:0;margin-right:0;overflow:hidden;padding-left:1.5em;padding-right:1.5em}.ck-content[dir=rtl] blockquote{border-left:0;border-right:5px solid #ccc}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-block-quote/theme/blockquote.css\"],\"names\":[],\"mappings\":\"AAKA,uBAWC,0BAAsC,CADtC,iBAAkB,CAFlB,aAAc,CACd,cAAe,CAPf,eAAgB,CAIhB,kBAAmB,CADnB,mBAOD,CAEA,gCACC,aAAc,CACd,2BACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck-content blockquote {\\n\\t/* See #12 */\\n\\toverflow: hidden;\\n\\n\\t/* https://github.com/ckeditor/ckeditor5-block-quote/issues/15 */\\n\\tpadding-right: 1.5em;\\n\\tpadding-left: 1.5em;\\n\\n\\tmargin-left: 0;\\n\\tmargin-right: 0;\\n\\tfont-style: italic;\\n\\tborder-left: solid 5px hsl(0, 0%, 80%);\\n}\\n\\n.ck-content[dir=\\\"rtl\\\"] blockquote {\\n\\tborder-left: 0;\\n\\tborder-right: solid 5px hsl(0, 0%, 80%);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-editor__editable .ck.ck-clipboard-drop-target-position{display:inline;pointer-events:none;position:relative}.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}.ck.ck-clipboard-drop-target-line{pointer-events:none;position:absolute}: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{background:var(--ck-clipboard-drop-target-color);border:1px solid var(--ck-clipboard-drop-target-color);bottom:calc(var(--ck-clipboard-drop-target-dot-height)*-.5);margin-left:-1px;top:calc(var(--ck-clipboard-drop-target-dot-height)*-.5)}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span:after{border-color:var(--ck-clipboard-drop-target-color) transparent transparent transparent;border-style:solid;border-width:calc(var(--ck-clipboard-drop-target-dot-height)) calc(var(--ck-clipboard-drop-target-dot-width)*.5) 0 calc(var(--ck-clipboard-drop-target-dot-width)*.5);content:\\\"\\\";display:block;height:0;left:50%;position:absolute;top:calc(var(--ck-clipboard-drop-target-dot-height)*-.5);transform:translateX(-50%);width:0}.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}.ck.ck-clipboard-drop-target-line{background:var(--ck-clipboard-drop-target-color);border:1px solid var(--ck-clipboard-drop-target-color);height:0;margin-top:-1px}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-clipboard/theme/clipboard.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-clipboard/clipboard.css\"],\"names\":[],\"mappings\":\"AASC,8DACC,cAAe,CAEf,mBAAoB,CADpB,iBAOD,CAJC,mEACC,iBAAkB,CAClB,OACD,CAWA,qJACC,YACD,CAIF,kCAEC,mBAAoB,CADpB,iBAED,CChCA,MACC,yCAA0C,CAC1C,yCAA0C,CAC1C,6DACD,CAOE,mEAIC,gDAAiD,CADjD,sDAAuD,CAFvD,2DAA8D,CAI9D,gBAAiB,CAHjB,wDAqBD,CAfC,yEAWC,sFAAuF,CAEvF,kBAAmB,CADnB,qKAA0K,CAX1K,UAAW,CAIX,aAAc,CAFd,QAAS,CAIT,QAAS,CADT,iBAAkB,CAElB,wDAA2D,CAE3D,0BAA2B,CAR3B,OAYD,CAOF,kEACC,gGACD,CAKA,gDACC,OAAS,CACT,sBACD,CAGD,kCAGC,gDAAiD,CADjD,sDAAuD,CADvD,QAAS,CAGT,eACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-editor__editable {\\n\\t/*\\n\\t * Vertical drop target (in text).\\n\\t */\\n\\t& .ck.ck-clipboard-drop-target-position {\\n\\t\\tdisplay: inline;\\n\\t\\tposition: relative;\\n\\t\\tpointer-events: none;\\n\\n\\t\\t& span {\\n\\t\\t\\tposition: absolute;\\n\\t\\t\\twidth: 0;\\n\\t\\t}\\n\\t}\\n\\n\\t/*\\n\\t * Styles of the widget being dragged (its preview).\\n\\t */\\n\\t& .ck-widget:-webkit-drag {\\n\\t\\t& > .ck-widget__selection-handle {\\n\\t\\t\\tdisplay: none;\\n\\t\\t}\\n\\n\\t\\t& > .ck-widget__type-around {\\n\\t\\t\\tdisplay: none;\\n\\t\\t}\\n\\t}\\n}\\n\\n.ck.ck-clipboard-drop-target-line {\\n\\tposition: absolute;\\n\\tpointer-events: none;\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-clipboard-drop-target-dot-width: 12px;\\n\\t--ck-clipboard-drop-target-dot-height: 8px;\\n\\t--ck-clipboard-drop-target-color: var(--ck-color-focus-border)\\n}\\n\\n.ck.ck-editor__editable {\\n\\t/*\\n\\t * Vertical drop target (in text).\\n\\t */\\n\\t& .ck.ck-clipboard-drop-target-position {\\n\\t\\t& span {\\n\\t\\t\\tbottom: calc(-.5 * var(--ck-clipboard-drop-target-dot-height));\\n\\t\\t\\ttop: calc(-.5 * var(--ck-clipboard-drop-target-dot-height));\\n\\t\\t\\tborder: 1px solid var(--ck-clipboard-drop-target-color);\\n\\t\\t\\tbackground: var(--ck-clipboard-drop-target-color);\\n\\t\\t\\tmargin-left: -1px;\\n\\n\\t\\t\\t/* The triangle above the marker */\\n\\t\\t\\t&::after {\\n\\t\\t\\t\\tcontent: \\\"\\\";\\n\\t\\t\\t\\twidth: 0;\\n\\t\\t\\t\\theight: 0;\\n\\n\\t\\t\\t\\tdisplay: block;\\n\\t\\t\\t\\tposition: absolute;\\n\\t\\t\\t\\tleft: 50%;\\n\\t\\t\\t\\ttop: calc(var(--ck-clipboard-drop-target-dot-height) * -.5);\\n\\n\\t\\t\\t\\ttransform: translateX(-50%);\\n\\t\\t\\t\\tborder-color: var(--ck-clipboard-drop-target-color) transparent transparent transparent;\\n\\t\\t\\t\\tborder-width: calc(var(--ck-clipboard-drop-target-dot-height)) calc(.5 * var(--ck-clipboard-drop-target-dot-width)) 0 calc(.5 * var(--ck-clipboard-drop-target-dot-width));\\n\\t\\t\\t\\tborder-style: solid;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t/*\\n\\t * Styles of the widget that it a drop target.\\n\\t */\\n\\t& .ck-widget.ck-clipboard-drop-target-range {\\n\\t\\toutline: var(--ck-widget-outline-thickness) solid var(--ck-clipboard-drop-target-color) !important;\\n\\t}\\n\\n\\t/*\\n\\t * Styles of the widget being dragged (its preview).\\n\\t */\\n\\t& .ck-widget:-webkit-drag {\\n\\t\\tzoom: 0.6;\\n\\t\\toutline: none !important;\\n\\t}\\n}\\n\\n.ck.ck-clipboard-drop-target-line {\\n\\theight: 0;\\n\\tborder: 1px solid var(--ck-clipboard-drop-target-color);\\n\\tbackground: var(--ck-clipboard-drop-target-color);\\n\\tmargin-top: -1px;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck-content pre{background:hsla(0,0%,78%,.3);border:1px solid #c4c4c4;border-radius:2px;color:#353535;direction:ltr;font-style:normal;min-width:200px;padding:1em;tab-size:4;text-align:left;white-space:pre-wrap}.ck-content pre code{background:unset;border-radius:0;padding:0}.ck.ck-editor__editable pre{position:relative}.ck.ck-editor__editable pre[data-language]:after{content:attr(data-language);position:absolute}:root{--ck-color-code-block-label-background:#757575}.ck.ck-editor__editable pre[data-language]:after{background:var(--ck-color-code-block-label-background);color:#fff;font-family:var(--ck-font-face);font-size:10px;line-height:16px;padding:var(--ck-spacing-tiny) var(--ck-spacing-medium);right:10px;top:-1px;white-space:nowrap}.ck.ck-code-block-dropdown .ck-dropdown__panel{max-height:250px;overflow-x:hidden;overflow-y:auto}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-code-block/theme/codeblock.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-code-block/codeblock.css\"],\"names\":[],\"mappings\":\"AAKA,gBAGC,4BAAiC,CACjC,wBAAiC,CACjC,iBAAkB,CAHlB,aAAwB,CAOxB,aAAc,CAMd,iBAAkB,CAGlB,eAAgB,CAjBhB,WAAY,CAUZ,UAAW,CAHX,eAAgB,CAIhB,oBAaD,CALC,qBACC,gBAAiB,CAEjB,eAAgB,CADhB,SAED,CAGD,4BACC,iBAMD,CAJC,iDACC,2BAA4B,CAC5B,iBACD,CCjCD,MACC,8CACD,CAEA,iDAGC,sDAAuD,CAMvD,UAAuB,CAHvB,+BAAgC,CADhC,cAAe,CAEf,gBAAiB,CACjB,uDAAwD,CANxD,UAAW,CADX,QAAS,CAST,kBACD,CAEA,+CAEC,gBAAiB,CAEjB,iBAAkB,CADlB,eAED\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck-content pre {\\n\\tpadding: 1em;\\n\\tcolor: hsl(0, 0%, 20.8%);\\n\\tbackground: hsla(0, 0%, 78%, 0.3);\\n\\tborder: 1px solid hsl(0, 0%, 77%);\\n\\tborder-radius: 2px;\\n\\n\\t/* Code block are language direction–agnostic. */\\n\\ttext-align: left;\\n\\tdirection: ltr;\\n\\n\\ttab-size: 4;\\n\\twhite-space: pre-wrap;\\n\\n\\t/* Don't inherit the style, e.g. when in a block quote. */\\n\\tfont-style: normal;\\n\\n\\t/* Don't let the code be squashed e.g. when in a table cell. */\\n\\tmin-width: 200px;\\n\\n\\t& code {\\n\\t\\tbackground: unset;\\n\\t\\tpadding: 0;\\n\\t\\tborder-radius: 0;\\n\\t}\\n}\\n\\n.ck.ck-editor__editable pre {\\n\\tposition: relative;\\n\\n\\t&[data-language]::after {\\n\\t\\tcontent: attr(data-language);\\n\\t\\tposition: absolute;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-color-code-block-label-background: hsl(0, 0%, 46%);\\n}\\n\\n.ck.ck-editor__editable pre[data-language]::after {\\n\\ttop: -1px;\\n\\tright: 10px;\\n\\tbackground: var(--ck-color-code-block-label-background);\\n\\n\\tfont-size: 10px;\\n\\tfont-family: var(--ck-font-face);\\n\\tline-height: 16px;\\n\\tpadding: var(--ck-spacing-tiny) var(--ck-spacing-medium);\\n\\tcolor: hsl(0, 0%, 100%);\\n\\twhite-space: nowrap;\\n}\\n\\n.ck.ck-code-block-dropdown .ck-dropdown__panel {\\n\\t/* There could be dozens of languages available. Use scroll to prevent a 10e6px dropdown. */\\n\\tmax-height: 250px;\\n\\toverflow-y: auto;\\n\\toverflow-x: hidden;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".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)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-editor-classic/theme/classiceditor.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-editor-classic/classiceditor.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css\"],\"names\":[],\"mappings\":\"AAKA,cAIC,iBAMD,CAJC,2DAEC,yBACD,CCLC,gDCED,eDKC,CAPA,uICMA,qCAAsC,CDJpC,2BAA4B,CAC5B,4BAIF,CAPA,gDAMC,qBACD,CAEA,iFACC,uBAAwB,CCR1B,eDaC,CANA,yMCHA,qCAAsC,CDOpC,eAEF,CAKF,yCAEC,0CAA2C,CCpB3C,eD8BD,CAZA,yHCdE,qCAAsC,CDmBtC,wBAAyB,CACzB,yBAMF,CAHC,0DACC,wCACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-editor {\\n\\t/* All the elements within `.ck-editor` are positioned relatively to it.\\n\\t If any element needs to be positioned with respect to the <body>, etc.,\\n\\t it must land outside of the `.ck-editor` in DOM. */\\n\\tposition: relative;\\n\\n\\t& .ck-editor__top .ck-sticky-panel .ck-toolbar {\\n\\t\\t/* https://github.com/ckeditor/ckeditor5-editor-classic/issues/62 */\\n\\t\\tz-index: var(--ck-z-modal);\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"../mixins/_rounded.css\\\";\\n\\n.ck.ck-editor__top {\\n\\t& .ck-sticky-panel {\\n\\t\\t& .ck-toolbar {\\n\\t\\t\\t@mixin ck-rounded-corners {\\n\\t\\t\\t\\tborder-bottom-left-radius: 0;\\n\\t\\t\\t\\tborder-bottom-right-radius: 0;\\n\\t\\t\\t}\\n\\n\\t\\t\\tborder-bottom-width: 0;\\n\\t\\t}\\n\\n\\t\\t& .ck-sticky-panel__content_sticky .ck-toolbar {\\n\\t\\t\\tborder-bottom-width: 1px;\\n\\n\\t\\t\\t@mixin ck-rounded-corners {\\n\\t\\t\\t\\tborder-radius: 0;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\\n/* Note: Use ck-editor__main to make sure these styles don't apply to other editor types */\\n.ck.ck-editor__main > .ck-editor__editable {\\n\\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/113 */\\n\\tbackground: var(--ck-color-base-background);\\n\\n\\t@mixin ck-rounded-corners {\\n\\t\\tborder-top-left-radius: 0;\\n\\t\\tborder-top-right-radius: 0;\\n\\t}\\n\\n\\t&:not(.ck-focused) {\\n\\t\\tborder-color: var(--ck-color-base-border);\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * Implements rounded corner interface for .ck-rounded-corners class.\\n *\\n * @see $ck-border-radius\\n */\\n@define-mixin ck-rounded-corners {\\n\\tborder-radius: 0;\\n\\n\\t@nest .ck-rounded-corners &,\\n\\t&.ck-rounded-corners {\\n\\t\\tborder-radius: var(--ck-border-radius);\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck .ck-placeholder,.ck.ck-placeholder{position:relative}.ck .ck-placeholder:before,.ck.ck-placeholder:before{content:attr(data-placeholder);left:0;pointer-events:none;position:absolute;right:0}.ck.ck-read-only .ck-placeholder:before{display:none}.ck.ck-reset_all .ck-placeholder{position:relative}.ck .ck-placeholder:before,.ck.ck-placeholder:before{color:var(--ck-color-engine-placeholder-text);cursor:text}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-engine/theme/placeholder.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-engine/placeholder.css\"],\"names\":[],\"mappings\":\"AAMA,uCAEC,iBAWD,CATC,qDAIC,8BAA+B,CAF/B,MAAO,CAKP,mBAAoB,CANpB,iBAAkB,CAElB,OAKD,CAKA,wCACC,YACD,CAQD,iCACC,iBACD,CC5BC,qDAEC,6CAA8C,CAD9C,WAED\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/* See ckeditor/ckeditor5#936. */\\n.ck.ck-placeholder,\\n.ck .ck-placeholder {\\n\\tposition: relative;\\n\\n\\t&::before {\\n\\t\\tposition: absolute;\\n\\t\\tleft: 0;\\n\\t\\tright: 0;\\n\\t\\tcontent: attr(data-placeholder);\\n\\n\\t\\t/* See ckeditor/ckeditor5#469. */\\n\\t\\tpointer-events: none;\\n\\t}\\n}\\n\\n/* See ckeditor/ckeditor5#1987. */\\n.ck.ck-read-only .ck-placeholder {\\n\\t&::before {\\n\\t\\tdisplay: none;\\n\\t}\\n}\\n\\n/*\\n * Rules for the `ck-placeholder` are loaded before the rules for `ck-reset_all` in the base CKEditor 5 DLL build.\\n * This fix overwrites the incorrectly set `position: static` from `ck-reset_all`.\\n * See https://github.com/ckeditor/ckeditor5/issues/11418.\\n */\\n.ck.ck-reset_all .ck-placeholder {\\n\\tposition: relative;\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/* See ckeditor/ckeditor5#936. */\\n.ck.ck-placeholder, .ck .ck-placeholder {\\n\\t&::before {\\n\\t\\tcursor: text;\\n\\t\\tcolor: var(--ck-color-engine-placeholder-text);\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-editor__editable span[data-ck-unsafe-element]{display:none}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-engine/theme/renderer.css\"],\"names\":[],\"mappings\":\"AAMA,qDACC,YACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/* Elements marked by the Renderer as hidden should be invisible in the editor. */\\n.ck.ck-editor__editable span[data-ck-unsafe-element] {\\n\\tdisplay: none;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck-find-result{background:var(--ck-color-highlight-background);color:var(--ck-color-text)}.ck-find-result_selected{background:#ff9633}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-find-and-replace/theme/findandreplace.css\"],\"names\":[],\"mappings\":\"AAKA,gBACC,+CAAgD,CAChD,0BACD,CAEA,yBACC,kBACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck-find-result {\\n\\tbackground: var(--ck-color-highlight-background);\\n\\tcolor: var(--ck-color-text);\\n}\\n\\n.ck-find-result_selected {\\n\\tbackground: hsl(29, 100%, 60%);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-find-and-replace-form{max-width:100%}.ck.ck-find-and-replace-form fieldset{display:flex}.ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__find .ck-results-counter{position:absolute}.ck.ck-find-and-replace-form{width:400px}.ck.ck-find-and-replace-form:focus{outline:none}.ck.ck-find-and-replace-form fieldset{align-content:stretch;align-items:center;border:0;flex-direction:row;flex-wrap:nowrap;margin:0;padding:var(--ck-spacing-large)}.ck.ck-find-and-replace-form fieldset>.ck-button{flex:0 0 auto}[dir=ltr] .ck.ck-find-and-replace-form fieldset>*+*{margin-left:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-find-and-replace-form fieldset>*+*{margin-right:var(--ck-spacing-standard)}.ck.ck-find-and-replace-form fieldset .ck-labeled-field-view{flex:1 1 auto}.ck.ck-find-and-replace-form fieldset .ck-labeled-field-view .ck-input{min-width:50px;width:100%}.ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__find{align-items:flex-start}.ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__find>.ck-button-find{font-weight:700}.ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__find>.ck-button-find .ck-button__label{padding-left:var(--ck-spacing-large);padding-right:var(--ck-spacing-large)}.ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__find>.ck-button-prev>.ck-icon{transform:rotate(90deg)}.ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__find>.ck-button-next>.ck-icon{transform:rotate(-90deg)}.ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__find .ck-results-counter{top:50%;transform:translateY(-50%)}[dir=ltr] .ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__find .ck-results-counter{right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__find .ck-results-counter{left:var(--ck-spacing-standard)}.ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__find .ck-results-counter{color:var(--ck-color-base-border)}.ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__replace{flex-wrap:wrap;justify-content:flex-end;margin-top:calc(var(--ck-spacing-large)*-1)}.ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__replace>.ck-labeled-field-view{margin-bottom:var(--ck-spacing-large)}.ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__replace>.ck-options-dropdown{margin-left:0;margin-right:auto}.ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__replace>.ck-labeled-field-view,.ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__replace>.ck-labeled-field-view .ck-input{width:100%}@media screen and (max-width:600px){.ck.ck-find-and-replace-form{width:300px}.ck.ck-find-and-replace-form fieldset{flex-wrap:wrap}.ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__find .ck-labeled-field-view{flex:1 0 auto;margin-bottom:var(--ck-spacing-standard);width:100%}.ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__find>.ck-button{text-align:center}.ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__find>.ck-button:first-of-type{flex:1 1 auto}[dir=ltr] .ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__find>.ck-button:first-of-type{margin-left:0}[dir=rtl] .ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__find>.ck-button:first-of-type{margin-right:0}.ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__find>.ck-button:first-of-type .ck-button__label{text-align:center;width:100%}.ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__replace>:not(.ck-labeled-field-view){flex:1 1 auto}.ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__replace>.ck-dropdown:not(.ck-labeled-field-view){flex-grow:0}.ck.ck-find-and-replace-form fieldset.ck-find-and-replace-form__replace>.ck-button:not(.ck-labeled-field-view)>.ck-button__label{text-align:center;width:100%}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-find-and-replace/theme/findandreplaceform.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-find-and-replace/findandreplaceform.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css\"],\"names\":[],\"mappings\":\"AAKA,6BACC,cAUD,CARC,sCACC,YAMD,CAHC,yFACC,iBACD,CCNF,6BACC,WAyGD,CAnGC,mCACC,YACD,CAEA,sCAIC,qBAAsB,CADtB,kBAAmB,CAInB,QAAS,CANT,kBAAmB,CACnB,gBAAiB,CAMjB,QAAS,CAFT,+BAwFD,CApFC,iDACC,aACD,CAGC,oDACC,sCACD,CAIA,oDACC,uCACD,CAGD,6DACC,aAMD,CAJC,uEAEC,cAAe,CADf,UAED,CAID,qEAEC,sBAkCD,CAhCC,qFACC,eAOD,CAJC,uGACC,oCAAqC,CACrC,qCACD,CAGD,8FACC,uBACD,CAEA,8FACC,wBACD,CAEA,yFACC,OAAQ,CACR,0BAWD,CAbA,mGAKE,gCAQF,CAbA,mGASE,+BAIF,CAbA,yFAYC,iCACD,CAID,wEACC,cAAe,CACf,wBAAyB,CACzB,2CAeD,CAbC,+FACC,qCACD,CAEA,6FAEC,aAAc,CADd,iBAED,CAEA,wMAEC,UACD,CCzGF,oCD+GA,6BACC,WAiDD,CA/CC,sCACC,cA6CD,CAzCE,4FACC,aAAc,CAEd,wCAAyC,CADzC,UAED,CAEA,gFACC,iBAkBD,CAhBC,8FACC,aAcD,CAfA,wGAIE,aAWF,CAfA,wGAQE,cAOF,CAJC,gHAEC,iBAAkB,CADlB,UAED,CAMH,qGACC,aAUD,CARC,iHACC,WACD,CAEA,iIAEC,iBAAkB,CADlB,UAED,CC5JH\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-find-and-replace-form {\\n\\tmax-width: 100%;\\n\\n\\t& fieldset {\\n\\t\\tdisplay: flex;\\n\\n\\t\\t/* The find fieldset */\\n\\t\\t&.ck-find-and-replace-form__find .ck-results-counter {\\n\\t\\t\\tposition: absolute;\\n\\t\\t}\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css\\\";\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_dir.css\\\";\\n\\n.ck.ck-find-and-replace-form {\\n\\twidth: 400px;\\n\\n\\t/*\\n\\t * The <form> needs tabindex=\\\"-1\\\" for proper Esc handling after being clicked\\n\\t * but the side effect is that this creates a nasty focus outline in some browsers.\\n\\t */\\n\\t&:focus {\\n\\t\\toutline: none;\\n\\t}\\n\\n\\t& fieldset {\\n\\t\\tflex-direction: row;\\n\\t\\tflex-wrap: nowrap;\\n\\t\\talign-items: center;\\n\\t\\talign-content: stretch;\\n\\n\\t\\tpadding: var(--ck-spacing-large);\\n\\t\\tborder: 0;\\n\\t\\tmargin: 0;\\n\\n\\t\\t& > .ck-button {\\n\\t\\t\\tflex: 0 0 auto;\\n\\t\\t}\\n\\n\\t\\t@mixin ck-dir ltr {\\n\\t\\t\\t& > * + * {\\n\\t\\t\\t\\tmargin-left: var(--ck-spacing-standard);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t@mixin ck-dir rtl {\\n\\t\\t\\t& > * + * {\\n\\t\\t\\t\\tmargin-right: var(--ck-spacing-standard);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t& .ck-labeled-field-view {\\n\\t\\t\\tflex: 1 1 auto;\\n\\n\\t\\t\\t& .ck-input {\\n\\t\\t\\t\\twidth: 100%;\\n\\t\\t\\t\\tmin-width: 50px;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t/* The find fieldset */\\n\\t\\t&.ck-find-and-replace-form__find {\\n\\t\\t\\t/* To display all controls in line when there's an error under the input */\\n\\t\\t\\talign-items: flex-start;\\n\\n\\t\\t\\t& > .ck-button-find {\\n\\t\\t\\t\\tfont-weight: bold;\\n\\n\\t\\t\\t\\t/* Beef the find button up a little. It's the main action button in the form */\\n\\t\\t\\t\\t& .ck-button__label {\\n\\t\\t\\t\\t\\tpadding-left: var(--ck-spacing-large);\\n\\t\\t\\t\\t\\tpadding-right: var(--ck-spacing-large);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t& > .ck-button-prev > .ck-icon {\\n\\t\\t\\t\\ttransform: rotate(90deg);\\n\\t\\t\\t}\\n\\n\\t\\t\\t& > .ck-button-next > .ck-icon {\\n\\t\\t\\t\\ttransform: rotate(-90deg);\\n\\t\\t\\t}\\n\\n\\t\\t\\t& .ck-results-counter {\\n\\t\\t\\t\\ttop: 50%;\\n\\t\\t\\t\\ttransform: translateY(-50%);\\n\\n\\t\\t\\t\\t@mixin ck-dir ltr {\\n\\t\\t\\t\\t\\tright: var(--ck-spacing-standard);\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t@mixin ck-dir rtl {\\n\\t\\t\\t\\t\\tleft: var(--ck-spacing-standard);\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tcolor: var(--ck-color-base-border);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t/* The replace fieldset */\\n\\t\\t&.ck-find-and-replace-form__replace {\\n\\t\\t\\tflex-wrap: wrap;\\n\\t\\t\\tjustify-content: flex-end;\\n\\t\\t\\tmargin-top: calc( -1 * var(--ck-spacing-large) );\\n\\n\\t\\t\\t& > .ck-labeled-field-view {\\n\\t\\t\\t\\tmargin-bottom: var(--ck-spacing-large);\\n\\t\\t\\t}\\n\\n\\t\\t\\t& > .ck-options-dropdown {\\n\\t\\t\\t\\tmargin-right: auto;\\n\\t\\t\\t\\tmargin-left: 0;\\n\\t\\t\\t}\\n\\n\\t\\t\\t& > .ck-labeled-field-view,\\n\\t\\t\\t& > .ck-labeled-field-view .ck-input {\\n\\t\\t\\t\\twidth: 100%;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\\n@mixin ck-media-phone {\\n\\t.ck.ck-find-and-replace-form {\\n\\t\\twidth: 300px;\\n\\n\\t\\t& fieldset {\\n\\t\\t\\tflex-wrap: wrap;\\n\\n\\t\\t\\t/* The find fieldset */\\n\\t\\t\\t&.ck-find-and-replace-form__find {\\n\\t\\t\\t\\t& .ck-labeled-field-view {\\n\\t\\t\\t\\t\\tflex: 1 0 auto;\\n\\t\\t\\t\\t\\twidth: 100%;\\n\\t\\t\\t\\t\\tmargin-bottom: var(--ck-spacing-standard);\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t& > .ck-button {\\n\\t\\t\\t\\t\\ttext-align: center;\\n\\n\\t\\t\\t\\t\\t&:first-of-type {\\n\\t\\t\\t\\t\\t\\tflex: 1 1 auto;\\n\\n\\t\\t\\t\\t\\t\\t@mixin ck-dir ltr {\\n\\t\\t\\t\\t\\t\\t\\tmargin-left: 0;\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t@mixin ck-dir rtl {\\n\\t\\t\\t\\t\\t\\t\\tmargin-right: 0;\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t& .ck-button__label {\\n\\t\\t\\t\\t\\t\\t\\twidth: 100%;\\n\\t\\t\\t\\t\\t\\t\\ttext-align: center;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t/* The replace fieldset */\\n\\t\\t\\t&.ck-find-and-replace-form__replace > :not(.ck-labeled-field-view) {\\n\\t\\t\\t\\tflex: 1 1 auto;\\n\\n\\t\\t\\t\\t&.ck-dropdown {\\n\\t\\t\\t\\t\\tflex-grow: 0;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t&.ck-button > .ck-button__label {\\n\\t\\t\\t\\t\\twidth: 100%;\\n\\t\\t\\t\\t\\ttext-align: center;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@define-mixin ck-media-phone {\\n\\t@media screen and (max-width: 600px) {\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck .ck-button.ck-color-table__color-picker,.ck .ck-button.ck-color-table__remove-color{align-items:center;display:flex;width:100%}[dir=rtl] .ck .ck-button.ck-color-table__color-picker,[dir=rtl] .ck .ck-button.ck-color-table__remove-color{justify-content:flex-start}.ck .ck-button.ck-color-table__color-picker{border-bottom-left-radius:0;border-bottom-right-radius:0;padding:calc(var(--ck-spacing-standard)/2) var(--ck-spacing-standard)}.ck .ck-button.ck-color-table__color-picker:not(:focus){border-top:1px solid var(--ck-color-base-border)}[dir=ltr] .ck .ck-button.ck-color-table__color-picker .ck.ck-icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck .ck-button.ck-color-table__color-picker .ck.ck-icon{margin-left:var(--ck-spacing-standard)}label.ck.ck-color-grid__label{font-weight:unset}.ck.ck-color-picker{padding:8px}.ck.ck-color-picker .hex-color-picker{height:100px;margin:0 0 var(--ck-spacing-large) 0}.ck.ck-color-picker .hex-color-picker::part(saturation){border-radius:var(--ck-border-radius) var(--ck-border-radius) 0 0}.ck.ck-color-picker .hex-color-picker::part(hue){border-radius:0 0 var(--ck-border-radius) var(--ck-border-radius)}.ck.ck-color-picker .hex-color-picker::part(hue-pointer),.ck.ck-color-picker .hex-color-picker::part(saturation-pointer){height:15px;width:15px}.ck.ck-color-table_action-bar{display:flex;flex-direction:row;justify-content:space-around;padding:0 8px 8px}.ck.ck-color-table_action-bar .ck-button-cancel,.ck.ck-color-table_action-bar .ck-button-save{flex:1}.ck .ck-button.ck-color-table__remove-color{border-bottom-left-radius:0;border-bottom-right-radius:0;padding:calc(var(--ck-spacing-standard)/2) var(--ck-spacing-standard)}.ck .ck-button.ck-color-table__remove-color:not(:focus){border-bottom:1px solid var(--ck-color-base-border)}[dir=ltr] .ck .ck-button.ck-color-table__remove-color .ck.ck-icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck .ck-button.ck-color-table__remove-color .ck.ck-icon{margin-left:var(--ck-spacing-standard)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-font/theme/fontcolor.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-font/fontcolor.css\"],\"names\":[],\"mappings\":\"AAOA,wFAGC,kBAAmB,CADnB,YAAa,CAEb,UAKD,CATA,4GAOE,0BAEF,CAEA,4CAEC,2BAA4B,CAC5B,4BAA6B,CAF7B,qEAiBD,CAbC,wDACC,gDACD,CAEA,kEAEE,uCAMF,CARA,kEAME,sCAEF,CAGD,8BACC,iBACD,CAEA,oBACC,WAmBD,CAjBC,sCACC,YAAa,CACb,oCAcD,CAZC,wDACC,iEACD,CACA,iDACC,iEACD,CAEA,yHAGC,WAAY,CADZ,UAED,CAIF,8BACC,YAAa,CACb,kBAAmB,CACnB,4BAA6B,CAC7B,iBAMD,CAJC,8FAEC,MACD,CClED,4CAEC,2BAA4B,CAC5B,4BAA6B,CAF7B,qEAiBD,CAbC,wDACC,mDACD,CAEA,kEAEE,uCAMF,CARA,kEAME,sCAEF\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_dir.css\\\";\\n\\n.ck .ck-button.ck-color-table__remove-color,\\n.ck .ck-button.ck-color-table__color-picker {\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\twidth: 100%;\\n\\n\\t@mixin ck-dir rtl {\\n\\t\\tjustify-content: flex-start;\\n\\t}\\n}\\n\\n.ck .ck-button.ck-color-table__color-picker {\\n\\tpadding: calc(var(--ck-spacing-standard) / 2 ) var(--ck-spacing-standard);\\n\\tborder-bottom-left-radius: 0;\\n\\tborder-bottom-right-radius: 0;\\n\\n\\t&:not(:focus) {\\n\\t\\tborder-top: 1px solid var(--ck-color-base-border);\\n\\t}\\n\\n\\t& .ck.ck-icon {\\n\\t\\t@mixin ck-dir ltr {\\n\\t\\t\\tmargin-right: var(--ck-spacing-standard);\\n\\t\\t}\\n\\n\\t\\t@mixin ck-dir rtl {\\n\\t\\t\\tmargin-left: var(--ck-spacing-standard);\\n\\t\\t}\\n\\t}\\n}\\n\\nlabel.ck.ck-color-grid__label {\\n\\tfont-weight: unset;\\n}\\n\\n.ck.ck-color-picker {\\n\\tpadding: 8px;\\n\\n\\t& .hex-color-picker {\\n\\t\\theight: 100px;\\n\\t\\tmargin: 0 0 var(--ck-spacing-large) 0;\\n\\n\\t\\t&::part(saturation) {\\n\\t\\t\\tborder-radius: var(--ck-border-radius) var(--ck-border-radius) 0 0;\\n\\t\\t}\\n\\t\\t&::part(hue) {\\n\\t\\t\\tborder-radius: 0 0 var(--ck-border-radius) var(--ck-border-radius);\\n\\t\\t}\\n\\n\\t\\t&::part(saturation-pointer),\\n\\t\\t&::part(hue-pointer) {\\n\\t\\t\\twidth: 15px;\\n\\t\\t\\theight: 15px;\\n\\t\\t}\\n\\t}\\n}\\n\\n.ck.ck-color-table_action-bar {\\n\\tdisplay: flex;\\n\\tflex-direction: row;\\n\\tjustify-content: space-around;\\n\\tpadding: 0 8px 8px;\\n\\n\\t& .ck-button-save,\\n\\t& .ck-button-cancel {\\n\\t\\tflex: 1\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_dir.css\\\";\\n\\n.ck .ck-button.ck-color-table__remove-color {\\n\\tpadding: calc(var(--ck-spacing-standard) / 2 ) var(--ck-spacing-standard);\\n\\tborder-bottom-left-radius: 0;\\n\\tborder-bottom-right-radius: 0;\\n\\n\\t&:not(:focus) {\\n\\t\\tborder-bottom: 1px solid var(--ck-color-base-border);\\n\\t}\\n\\n\\t& .ck.ck-icon {\\n\\t\\t@mixin ck-dir ltr {\\n\\t\\t\\tmargin-right: var(--ck-spacing-standard);\\n\\t\\t}\\n\\n\\t\\t@mixin ck-dir rtl {\\n\\t\\t\\tmargin-left: var(--ck-spacing-standard);\\n\\t\\t}\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck-content .text-tiny{font-size:.7em}.ck-content .text-small{font-size:.85em}.ck-content .text-big{font-size:1.4em}.ck-content .text-huge{font-size:1.8em}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-font/theme/fontsize.css\"],\"names\":[],\"mappings\":\"AAUC,uBACC,cACD,CAEA,wBACC,eACD,CAEA,sBACC,eACD,CAEA,uBACC,eACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/* The values should be synchronized with the \\\"FONT_SIZE_PRESET_UNITS\\\" object in the \\\"/src/fontsize/utils.js\\\" file. */\\n\\n/* Styles should be prefixed with the `.ck-content` class.\\nSee https://github.com/ckeditor/ckeditor5/issues/6636 */\\n.ck-content {\\n\\t& .text-tiny {\\n\\t\\tfont-size: .7em;\\n\\t}\\n\\n\\t& .text-small {\\n\\t\\tfont-size: .85em;\\n\\t}\\n\\n\\t& .text-big {\\n\\t\\tfont-size: 1.4em;\\n\\t}\\n\\n\\t& .text-huge {\\n\\t\\tfont-size: 1.8em;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".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}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-heading/theme/heading.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-heading/heading.css\"],\"names\":[],\"mappings\":\"AAKA,wBACC,cACD,CAEA,wBACC,cACD,CAEA,wBACC,cACD,CAEA,+BACC,eACD,CCZC,2EACC,SACD,CAEA,uEACC,cACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-heading_heading1 {\\n\\tfont-size: 20px;\\n}\\n\\n.ck.ck-heading_heading2 {\\n\\tfont-size: 17px;\\n}\\n\\n.ck.ck-heading_heading3 {\\n\\tfont-size: 14px;\\n}\\n\\n.ck[class*=\\\"ck-heading_heading\\\"] {\\n\\tfont-weight: bold;\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/* Resize dropdown's button label. */\\n.ck.ck-dropdown.ck-heading-dropdown {\\n\\t& .ck-dropdown__button .ck-button__label {\\n\\t\\twidth: 8em;\\n\\t}\\n\\n\\t& .ck-dropdown__panel .ck-list__item {\\n\\t\\tmin-width: 18em;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck-editor__editable .ck-horizontal-line{display:flow-root}.ck-content hr{background:#dedede;border:0;height:4px;margin:15px 0}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-horizontal-line/theme/horizontalline.css\"],\"names\":[],\"mappings\":\"AAMA,yCAEC,iBACD,CAEA,eAGC,kBAA2B,CAC3B,QAAS,CAFT,UAAW,CADX,aAID\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n\\n.ck-editor__editable .ck-horizontal-line {\\n\\t/* Necessary to render properly next to floated objects, e.g. side image case. */\\n\\tdisplay: flow-root;\\n}\\n\\n.ck-content hr {\\n\\tmargin: 15px 0;\\n\\theight: 4px;\\n\\tbackground: hsl(0, 0%, 87%);\\n\\tborder: 0;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck-content .image{clear:both;display:table;margin:.9em auto;min-width:50px;text-align:center}.ck-content .image img{display:block;margin:0 auto;max-width:100%;min-width:100%}.ck-content .image-inline{align-items:flex-start;display:inline-flex;max-width:100%}.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{overflow:hidden;padding-left:inherit;padding-right:inherit;text-overflow:ellipsis;white-space:nowrap}.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}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-image/theme/image.css\"],\"names\":[],\"mappings\":\"AAMC,mBAEC,UAAW,CADX,aAAc,CAOd,gBAAkB,CAGlB,cAAe,CARf,iBAuBD,CAbC,uBAEC,aAAc,CAGd,aAAc,CAGd,cAAe,CAGf,cACD,CAGD,0BAYC,sBAAuB,CANvB,mBAAoB,CAGpB,cAoBD,CAdC,kCACC,YACD,CAGA,gEAGC,WAAY,CACZ,aAAc,CAGd,cACD,CAUD,gEASC,eAAgB,CARhB,oBAAqB,CACrB,qBAAsB,CAQtB,sBAAuB,CAFvB,kBAGD,CAWA,2GACC,SAUD,CAHC,qEACC,YACD,CAOA,0FACC,cACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck-content {\\n\\t& .image {\\n\\t\\tdisplay: table;\\n\\t\\tclear: both;\\n\\t\\ttext-align: center;\\n\\n\\t\\t/* Make sure there is some space between the content and the image. Center image by default. */\\n\\t\\t/* The first value should be equal to --ck-spacing-large variable if used in the editor context\\n\\t \\tto avoid the content jumping (See https://github.com/ckeditor/ckeditor5/issues/9825). */\\n\\t\\tmargin: 0.9em auto;\\n\\n\\t\\t/* Make sure the caption will be displayed properly (See: https://github.com/ckeditor/ckeditor5/issues/1870). */\\n\\t\\tmin-width: 50px;\\n\\n\\t\\t& img {\\n\\t\\t\\t/* Prevent unnecessary margins caused by line-height (see #44). */\\n\\t\\t\\tdisplay: block;\\n\\n\\t\\t\\t/* Center the image if its width is smaller than the content's width. */\\n\\t\\t\\tmargin: 0 auto;\\n\\n\\t\\t\\t/* Make sure the image never exceeds the size of the parent container (ckeditor/ckeditor5-ui#67). */\\n\\t\\t\\tmax-width: 100%;\\n\\n\\t\\t\\t/* Make sure the image is never smaller than the parent container (See: https://github.com/ckeditor/ckeditor5/issues/9300). */\\n\\t\\t\\tmin-width: 100%\\n\\t\\t}\\n\\t}\\n\\n\\t& .image-inline {\\n\\t\\t/*\\n\\t\\t * Normally, the .image-inline would have \\\"display: inline-block\\\" and \\\"img { width: 100% }\\\" (to follow the wrapper while resizing).\\n\\t\\t * Unfortunately, together with \\\"srcset\\\", it gets automatically stretched up to the width of the editing root.\\n\\t\\t * This strange behavior does not happen with inline-flex.\\n\\t\\t */\\n\\t\\tdisplay: inline-flex;\\n\\n\\t\\t/* While being resized, don't allow the image to exceed the width of the editing root. */\\n\\t\\tmax-width: 100%;\\n\\n\\t\\t/* This is required by Safari to resize images in a sensible way. Without this, the browser breaks the ratio. */\\n\\t\\talign-items: flex-start;\\n\\n\\t\\t/* When the picture is present it must act as a flex container to let the img resize properly */\\n\\t\\t& picture {\\n\\t\\t\\tdisplay: flex;\\n\\t\\t}\\n\\n\\t\\t/* When the picture is present, it must act like a resizable img. */\\n\\t\\t& picture,\\n\\t\\t& img {\\n\\t\\t\\t/* This is necessary for the img to span the entire .image-inline wrapper and to resize properly. */\\n\\t\\t\\tflex-grow: 1;\\n\\t\\t\\tflex-shrink: 1;\\n\\n\\t\\t\\t/* Prevents overflowing the editing root boundaries when an inline image is very wide. */\\n\\t\\t\\tmax-width: 100%;\\n\\t\\t}\\n\\t}\\n}\\n\\n.ck.ck-editor__editable {\\n\\t/*\\n\\t * Inhertit the content styles padding of the <figcaption> in case the integration overrides `text-align: center`\\n\\t * of `.image` (e.g. to the left/right). This ensures the placeholder stays at the padding just like the native\\n\\t * caret does, and not at the edge of <figcaption>.\\n\\t */\\n\\t& .image > figcaption.ck-placeholder::before {\\n\\t\\tpadding-left: inherit;\\n\\t\\tpadding-right: inherit;\\n\\n\\t\\t/*\\n\\t\\t * Make sure the image caption placeholder doesn't overflow the placeholder area.\\n\\t\\t * See https://github.com/ckeditor/ckeditor5/issues/9162.\\n\\t\\t */\\n\\t\\twhite-space: nowrap;\\n\\t\\toverflow: hidden;\\n\\t\\ttext-overflow: ellipsis;\\n\\t}\\n\\n\\n\\t/*\\n\\t * Make sure the selected inline image always stays on top of its siblings.\\n\\t * See https://github.com/ckeditor/ckeditor5/issues/9108.\\n\\t */\\n\\t& .image.ck-widget_selected {\\n\\t\\tz-index: 1;\\n\\t}\\n\\n\\t& .image-inline.ck-widget_selected {\\n\\t\\tz-index: 1;\\n\\n\\t\\t/*\\n\\t\\t * Make sure the native browser selection style is not displayed.\\n\\t\\t * Inline image widgets have their own styles for the selected state and\\n\\t\\t * leaving this up to the browser is asking for a visual collision.\\n\\t\\t */\\n\\t\\t& ::selection {\\n\\t\\t\\tdisplay: none;\\n\\t\\t}\\n\\t}\\n\\n\\t/* The inline image nested in the table should have its original size if not resized.\\n\\tSee https://github.com/ckeditor/ckeditor5/issues/9117. */\\n\\t& td,\\n\\t& th {\\n\\t\\t& .image-inline img {\\n\\t\\t\\tmax-width: none;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root{--ck-color-image-caption-background:#f7f7f7;--ck-color-image-caption-text:#333;--ck-color-image-caption-highligted-background:#fd0}.ck-content .image>figcaption{background-color:var(--ck-color-image-caption-background);caption-side:bottom;color:var(--ck-color-image-caption-text);display:table-caption;font-size:.75em;outline-offset:-1px;padding:.6em;word-break:break-word}.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)}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imagecaption.css\"],\"names\":[],\"mappings\":\"AAKA,MACC,2CAAoD,CACpD,kCAA8C,CAC9C,mDACD,CAGA,8BAKC,yDAA0D,CAH1D,mBAAoB,CAEpB,wCAAyC,CAHzC,qBAAsB,CAMtB,eAAgB,CAChB,mBAAoB,CAFpB,YAAa,CAHb,qBAMD,CAGA,qEACC,iDACD,CAEA,sCACC,GACC,oEACD,CAEA,GACC,yDACD,CACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-color-image-caption-background: hsl(0, 0%, 97%);\\n\\t--ck-color-image-caption-text: hsl(0, 0%, 20%);\\n\\t--ck-color-image-caption-highligted-background: hsl(52deg 100% 50%);\\n}\\n\\n/* Content styles */\\n.ck-content .image > figcaption {\\n\\tdisplay: table-caption;\\n\\tcaption-side: bottom;\\n\\tword-break: break-word;\\n\\tcolor: var(--ck-color-image-caption-text);\\n\\tbackground-color: var(--ck-color-image-caption-background);\\n\\tpadding: .6em;\\n\\tfont-size: .75em;\\n\\toutline-offset: -1px;\\n}\\n\\n/* Editing styles */\\n.ck.ck-editor__editable .image > figcaption.image__caption_highlighted {\\n\\tanimation: ck-image-caption-highlight .6s ease-out;\\n}\\n\\n@keyframes ck-image-caption-highlight {\\n\\t0% {\\n\\t\\tbackground-color: var(--ck-color-image-caption-highligted-background);\\n\\t}\\n\\n\\t100% {\\n\\t\\tbackground-color: var(--ck-color-image-caption-background);\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-image-insert__panel{padding:var(--ck-spacing-large)}.ck.ck-image-insert__ck-finder-button{border:1px solid #ccc;border-radius:var(--ck-border-radius);display:block;margin:var(--ck-spacing-standard) auto;width:100%}.ck.ck-splitbutton>.ck-file-dialog-button.ck-button{border:none;margin:0;padding:0}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imageinsert.css\"],\"names\":[],\"mappings\":\"AAKA,2BACC,+BACD,CAEA,sCAIC,qBAAiC,CACjC,qCAAsC,CAJtC,aAAc,CAEd,sCAAuC,CADvC,UAID,CAGA,oDAGC,WAAY,CADZ,QAAS,CADT,SAGD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-image-insert__panel {\\n\\tpadding: var(--ck-spacing-large);\\n}\\n\\n.ck.ck-image-insert__ck-finder-button {\\n\\tdisplay: block;\\n\\twidth: 100%;\\n\\tmargin: var(--ck-spacing-standard) auto;\\n\\tborder: 1px solid hsl(0, 0%, 80%);\\n\\tborder-radius: var(--ck-border-radius);\\n}\\n\\n/* https://github.com/ckeditor/ckeditor5/issues/7986 */\\n.ck.ck-splitbutton > .ck-file-dialog-button.ck-button {\\n\\tpadding: 0;\\n\\tmargin: 0;\\n\\tborder: none;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".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)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imageinsertformrowview.css\"],\"names\":[],\"mappings\":\"AAMC,+BAEC,YACD,CAGD,iBACC,YAAa,CACb,kBAAmB,CACnB,gBAAiB,CACjB,6BAmBD,CAhBC,iCACC,WACD,CAEA,kDACC,qCAUD,CARC,sIAEC,sBACD,CAEA,+EACC,0BACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-image-insert-form {\\n\\t&:focus {\\n\\t\\t/* See: https://github.com/ckeditor/ckeditor5/issues/4773 */\\n\\t\\toutline: none;\\n\\t}\\n}\\n\\n.ck.ck-form__row {\\n\\tdisplay: flex;\\n\\tflex-direction: row;\\n\\tflex-wrap: nowrap;\\n\\tjustify-content: space-between;\\n\\n\\t/* Ignore labels that work as fieldset legends */\\n\\t& > *:not(.ck-label) {\\n\\t\\tflex-grow: 1;\\n\\t}\\n\\n\\t&.ck-image-insert-form__action-row {\\n\\t\\tmargin-top: var(--ck-spacing-standard);\\n\\n\\t\\t& .ck-button-save,\\n\\t\\t& .ck-button-cancel {\\n\\t\\t\\tjustify-content: center;\\n\\t\\t}\\n\\n\\t\\t& .ck-button .ck-button__label {\\n\\t\\t\\tcolor: var(--ck-color-text);\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck-content .image.image_resized{box-sizing:border-box;display:block;max-width:100%}.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}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imageresize.css\"],\"names\":[],\"mappings\":\"AAKA,iCAQC,qBAAsB,CADtB,aAAc,CANd,cAkBD,CATC,qCAEC,UACD,CAEA,4CAEC,aACD,CAQC,sHACC,cACD,CAIF,oFACC,uCACD,CAEA,oFACC,sCACD,CAEA,oEACC,SACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck-content .image.image_resized {\\n\\tmax-width: 100%;\\n\\t/*\\n\\tThe `<figure>` element for resized images must not use `display:table` as browsers do not support `max-width` for it well.\\n\\tSee https://stackoverflow.com/questions/4019604/chrome-safari-ignoring-max-width-in-table/14420691#14420691 for more.\\n\\tFortunately, since we control the width, there is no risk that the image will look bad.\\n\\t*/\\n\\tdisplay: block;\\n\\tbox-sizing: border-box;\\n\\n\\t& img {\\n\\t\\t/* For resized images it is the `<figure>` element that determines the image width. */\\n\\t\\twidth: 100%;\\n\\t}\\n\\n\\t& > figcaption {\\n\\t\\t/* The `<figure>` element uses `display:block`, so `<figcaption>` also has to. */\\n\\t\\tdisplay: block;\\n\\t}\\n}\\n\\n.ck.ck-editor__editable {\\n\\t/* The resized inline image nested in the table should respect its parent size.\\n\\tSee https://github.com/ckeditor/ckeditor5/issues/9117. */\\n\\t& td,\\n\\t& th {\\n\\t\\t& .image-inline.image_resized img {\\n\\t\\t\\tmax-width: 100%;\\n\\t\\t}\\n\\t}\\n}\\n\\n[dir=\\\"ltr\\\"] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon {\\n\\tmargin-right: var(--ck-spacing-standard);\\n}\\n\\n[dir=\\\"rtl\\\"] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon {\\n\\tmargin-left: var(--ck-spacing-standard);\\n}\\n\\n.ck.ck-dropdown .ck-button.ck-resize-image-button .ck-button__label {\\n\\twidth: 4em;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":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-left:auto;margin-right:0}.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-bottom:var(--ck-inline-image-style-spacing);margin-top: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)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imagestyle.css\"],\"names\":[],\"mappings\":\"AAKA,MACC,8BAA+B,CAC/B,qEACD,CAMC,qFAEC,oDACD,CAIA,yEAEC,UACD,CAEA,8BACC,WAAY,CACZ,yCAA0C,CAC1C,aACD,CAEA,oCACC,UAAW,CACX,0CACD,CAEA,sCACC,gBAAiB,CACjB,iBACD,CAEA,qCACC,WAAY,CACZ,yCACD,CAEA,2CAEC,gBAAiB,CADjB,cAED,CAEA,0CACC,aAAc,CACd,iBACD,CAGA,6GAGC,YACD,CAGC,mGAGC,kDAAmD,CADnD,+CAED,CAEA,iDACC,iDACD,CAEA,kDACC,gDACD,CAUC,0lBAGC,qDAKD,CAHC,8nBACC,YACD,CAKD,oVAGC,2DACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-image-style-spacing: 1.5em;\\n\\t--ck-inline-image-style-spacing: calc(var(--ck-image-style-spacing) / 2);\\n}\\n\\n.ck-content {\\n\\t/* Provides a minimal side margin for the left and right aligned images, so that the user has a visual feedback\\n\\tconfirming successful application of the style if image width exceeds the editor's size.\\n\\tSee https://github.com/ckeditor/ckeditor5/issues/9342 */\\n\\t& .image-style-block-align-left,\\n\\t& .image-style-block-align-right {\\n\\t\\tmax-width: calc(100% - var(--ck-image-style-spacing));\\n\\t}\\n\\n\\t/* Allows displaying multiple floating images in the same line.\\n\\tSee https://github.com/ckeditor/ckeditor5/issues/9183#issuecomment-804988132 */\\n\\t& .image-style-align-left,\\n\\t& .image-style-align-right {\\n\\t\\tclear: none;\\n\\t}\\n\\n\\t& .image-style-side {\\n\\t\\tfloat: right;\\n\\t\\tmargin-left: var(--ck-image-style-spacing);\\n\\t\\tmax-width: 50%;\\n\\t}\\n\\n\\t& .image-style-align-left {\\n\\t\\tfloat: left;\\n\\t\\tmargin-right: var(--ck-image-style-spacing);\\n\\t}\\n\\n\\t& .image-style-align-center {\\n\\t\\tmargin-left: auto;\\n\\t\\tmargin-right: auto;\\n\\t}\\n\\n\\t& .image-style-align-right {\\n\\t\\tfloat: right;\\n\\t\\tmargin-left: var(--ck-image-style-spacing);\\n\\t}\\n\\n\\t& .image-style-block-align-right {\\n\\t\\tmargin-right: 0;\\n\\t\\tmargin-left: auto;\\n\\t}\\n\\n\\t& .image-style-block-align-left {\\n\\t\\tmargin-left: 0;\\n\\t\\tmargin-right: auto;\\n\\t}\\n\\n\\t/* Simulates margin collapsing with the preceding paragraph, which does not work for the floating elements. */\\n\\t& p + .image-style-align-left,\\n\\t& p + .image-style-align-right,\\n\\t& p + .image-style-side {\\n\\t\\tmargin-top: 0;\\n\\t}\\n\\n\\t& .image-inline {\\n\\t\\t&.image-style-align-left,\\n\\t\\t&.image-style-align-right {\\n\\t\\t\\tmargin-top: var(--ck-inline-image-style-spacing);\\n\\t\\t\\tmargin-bottom: var(--ck-inline-image-style-spacing);\\n\\t\\t}\\n\\n\\t\\t&.image-style-align-left {\\n\\t\\t\\tmargin-right: var(--ck-inline-image-style-spacing);\\n\\t\\t}\\n\\n\\t\\t&.image-style-align-right {\\n\\t\\t\\tmargin-left: var(--ck-inline-image-style-spacing);\\n\\t\\t}\\n\\t}\\n}\\n\\n.ck.ck-splitbutton {\\n\\t/* The button should display as a regular drop-down if the action button\\n\\tis forced to fire the same action as the arrow button. */\\n\\t&.ck-splitbutton_flatten {\\n\\t\\t&:hover,\\n\\t\\t&.ck-splitbutton_open {\\n\\t\\t\\t& > .ck-splitbutton__action:not(.ck-disabled),\\n\\t\\t\\t& > .ck-splitbutton__arrow:not(.ck-disabled),\\n\\t\\t\\t& > .ck-splitbutton__arrow:not(.ck-disabled):not(:hover) {\\n\\t\\t\\t\\tbackground-color: var(--ck-color-button-on-background);\\n\\n\\t\\t\\t\\t&::after {\\n\\t\\t\\t\\t\\tdisplay: none;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t&.ck-splitbutton_open:hover {\\n\\t\\t\\t& > .ck-splitbutton__action:not(.ck-disabled),\\n\\t\\t\\t& > .ck-splitbutton__arrow:not(.ck-disabled),\\n\\t\\t\\t& > .ck-splitbutton__arrow:not(.ck-disabled):not(:hover) {\\n\\t\\t\\t\\tbackground-color: var(--ck-color-button-on-hover-background);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck-image-upload-complete-icon{border-radius:50%;display:block;position:absolute;right:min(var(--ck-spacing-medium),6%);top:min(var(--ck-spacing-medium),6%);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{animation-delay:0ms,3s;animation-duration:.5s,.5s;animation-fill-mode:forwards,forwards;animation-name:ck-upload-complete-icon-show,ck-upload-complete-icon-hide;background:var(--ck-color-image-upload-icon-background);font-size:calc(1px*var(--ck-image-upload-icon-size));height:calc(var(--ck-image-upload-icon-is-visible)*var(--ck-image-upload-icon-size));opacity:0;overflow:hidden;width:calc(var(--ck-image-upload-icon-is-visible)*var(--ck-image-upload-icon-size))}.ck-image-upload-complete-icon:after{animation-delay:.5s;animation-duration:.5s;animation-fill-mode:forwards;animation-name:ck-upload-complete-icon-check;border-right:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);border-top:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);box-sizing:border-box;height:0;left:25%;opacity:0;top:50%;transform:scaleX(-1) rotate(135deg);transform-origin:left top;width:0}@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%{height:0;opacity:1;width:0}33%{height:0;width:.3em}to{height:.45em;opacity:1;width:.3em}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imageuploadicon.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-image/imageuploadicon.css\"],\"names\":[],\"mappings\":\"AAKA,+BAUC,iBAAkB,CATlB,aAAc,CACd,iBAAkB,CAOlB,sCAAwC,CADxC,oCAAsC,CAGtC,SAMD,CAJC,qCACC,UAAW,CACX,iBACD,CChBD,MACC,iCAA8C,CAC9C,+CAA4D,CAG5D,8BAA+B,CAC/B,gCAAiC,CACjC,4DACD,CAEA,+BAWC,sBAA4B,CAN5B,0BAAgC,CADhC,qCAAuC,CADvC,wEAA0E,CAD1E,uDAAwD,CAMxD,oDAAuD,CAWvD,oFAAuF,CAlBvF,SAAU,CAgBV,eAAgB,CAChB,mFA0BD,CAtBC,qCAgBC,mBAAsB,CADtB,sBAAyB,CAEzB,4BAA6B,CAH7B,4CAA6C,CAF7C,sFAAuF,CADvF,oFAAqF,CASrF,qBAAsB,CAdtB,QAAS,CAJT,QAAS,CAGT,SAAU,CADV,OAAQ,CAKR,mCAAoC,CACpC,yBAA0B,CAH1B,OAcD,CAGD,wCACC,GACC,SACD,CAEA,GACC,SACD,CACD,CAEA,wCACC,GACC,SACD,CAEA,GACC,SACD,CACD,CAEA,yCACC,GAGC,QAAS,CAFT,SAAU,CACV,OAED,CACA,IAEC,QAAS,CADT,UAED,CACA,GAGC,YAAc,CAFd,SAAU,CACV,UAED,CACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck-image-upload-complete-icon {\\n\\tdisplay: block;\\n\\tposition: absolute;\\n\\n\\t/*\\n\\t * Smaller images should have the icon closer to the border.\\n\\t * Match the icon position with the linked image indicator brought by the link image feature.\\n\\t */\\n\\ttop: min(var(--ck-spacing-medium), 6%);\\n\\tright: min(var(--ck-spacing-medium), 6%);\\n\\tborder-radius: 50%;\\n\\tz-index: 1;\\n\\n\\t&::after {\\n\\t\\tcontent: \\\"\\\";\\n\\t\\tposition: absolute;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-color-image-upload-icon: hsl(0, 0%, 100%);\\n\\t--ck-color-image-upload-icon-background: hsl(120, 100%, 27%);\\n\\n\\t/* Match the icon size with the linked image indicator brought by the link image feature. */\\n\\t--ck-image-upload-icon-size: 20;\\n\\t--ck-image-upload-icon-width: 2px;\\n\\t--ck-image-upload-icon-is-visible: clamp(0px, 100% - 50px, 1px);\\n}\\n\\n.ck-image-upload-complete-icon {\\n\\topacity: 0;\\n\\tbackground: var(--ck-color-image-upload-icon-background);\\n\\tanimation-name: ck-upload-complete-icon-show, ck-upload-complete-icon-hide;\\n\\tanimation-fill-mode: forwards, forwards;\\n\\tanimation-duration: 500ms, 500ms;\\n\\n\\t/* To make animation scalable. */\\n\\tfont-size: calc(1px * var(--ck-image-upload-icon-size));\\n\\n\\t/* Hide completed upload icon after 3 seconds. */\\n\\tanimation-delay: 0ms, 3000ms;\\n\\n\\t/*\\n\\t * Use CSS math to simulate container queries.\\n\\t * https://css-tricks.com/the-raven-technique-one-step-closer-to-container-queries/#what-about-showing-and-hiding-things\\n\\t */\\n\\toverflow: hidden;\\n\\twidth: calc(var(--ck-image-upload-icon-is-visible) * var(--ck-image-upload-icon-size));\\n\\theight: calc(var(--ck-image-upload-icon-is-visible) * var(--ck-image-upload-icon-size));\\n\\n\\t/* This is check icon element made from border-width mixed with animations. */\\n\\t&::after {\\n\\t\\t/* Because of border transformation we need to \\\"hard code\\\" left position. */\\n\\t\\tleft: 25%;\\n\\n\\t\\ttop: 50%;\\n\\t\\topacity: 0;\\n\\t\\theight: 0;\\n\\t\\twidth: 0;\\n\\n\\t\\ttransform: scaleX(-1) rotate(135deg);\\n\\t\\ttransform-origin: left top;\\n\\t\\tborder-top: var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);\\n\\t\\tborder-right: var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);\\n\\n\\t\\tanimation-name: ck-upload-complete-icon-check;\\n\\t\\tanimation-duration: 500ms;\\n\\t\\tanimation-delay: 500ms;\\n\\t\\tanimation-fill-mode: forwards;\\n\\n\\t\\t/* #1095. While reset is not providing proper box-sizing for pseudoelements, we need to handle it. */\\n\\t\\tbox-sizing: border-box;\\n\\t}\\n}\\n\\n@keyframes ck-upload-complete-icon-show {\\n\\tfrom {\\n\\t\\topacity: 0;\\n\\t}\\n\\n\\tto {\\n\\t\\topacity: 1;\\n\\t}\\n}\\n\\n@keyframes ck-upload-complete-icon-hide {\\n\\tfrom {\\n\\t\\topacity: 1;\\n\\t}\\n\\n\\tto {\\n\\t\\topacity: 0;\\n\\t}\\n}\\n\\n@keyframes ck-upload-complete-icon-check {\\n\\t0% {\\n\\t\\topacity: 1;\\n\\t\\twidth: 0;\\n\\t\\theight: 0;\\n\\t}\\n\\t33% {\\n\\t\\twidth: 0.3em;\\n\\t\\theight: 0;\\n\\t}\\n\\t100% {\\n\\t\\topacity: 1;\\n\\t\\twidth: 0.3em;\\n\\t\\theight: 0.45em;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck .ck-upload-placeholder-loader{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:0}.ck .ck-upload-placeholder-loader:before{content:\\\"\\\";position:relative}:root{--ck-color-upload-placeholder-loader:#b3b3b3;--ck-upload-placeholder-loader-size:32px;--ck-upload-placeholder-image-aspect-ratio:2.8}.ck .ck-image-upload-placeholder{margin:0;width:100%}.ck .ck-image-upload-placeholder.image-inline{width:calc(var(--ck-upload-placeholder-loader-size)*2*var(--ck-upload-placeholder-image-aspect-ratio))}.ck .ck-image-upload-placeholder img{aspect-ratio:var(--ck-upload-placeholder-image-aspect-ratio)}.ck .ck-upload-placeholder-loader{height:100%;width:100%}.ck .ck-upload-placeholder-loader:before{animation:ck-upload-placeholder-loader 1s linear infinite;border-radius:50%;border-right:2px solid transparent;border-top:3px solid var(--ck-color-upload-placeholder-loader);height:var(--ck-upload-placeholder-loader-size);width:var(--ck-upload-placeholder-loader-size)}@keyframes ck-upload-placeholder-loader{to{transform:rotate(1turn)}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imageuploadloader.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-image/imageuploadloader.css\"],\"names\":[],\"mappings\":\"AAKA,kCAGC,kBAAmB,CADnB,YAAa,CAEb,sBAAuB,CAEvB,MAAO,CALP,iBAAkB,CAIlB,KAOD,CAJC,yCACC,UAAW,CACX,iBACD,CCXD,MACC,4CAAqD,CACrD,wCAAyC,CACzC,8CACD,CAEA,iCAGC,QAAS,CADT,UAgBD,CAbC,8CACC,sGACD,CAEA,qCAOC,4DACD,CAGD,kCAEC,WAAY,CADZ,UAWD,CARC,yCAMC,yDAA0D,CAH1D,iBAAkB,CAElB,kCAAmC,CADnC,8DAA+D,CAF/D,+CAAgD,CADhD,8CAMD,CAGD,wCACC,GACC,uBACD,CACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck .ck-upload-placeholder-loader {\\n\\tposition: absolute;\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n\\ttop: 0;\\n\\tleft: 0;\\n\\n\\t&::before {\\n\\t\\tcontent: '';\\n\\t\\tposition: relative;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-color-upload-placeholder-loader: hsl(0, 0%, 70%);\\n\\t--ck-upload-placeholder-loader-size: 32px;\\n\\t--ck-upload-placeholder-image-aspect-ratio: 2.8;\\n}\\n\\n.ck .ck-image-upload-placeholder {\\n\\t/* We need to control the full width of the SVG gray background. */\\n\\twidth: 100%;\\n\\tmargin: 0;\\n\\n\\t&.image-inline {\\n\\t\\twidth: calc( 2 * var(--ck-upload-placeholder-loader-size) * var(--ck-upload-placeholder-image-aspect-ratio) );\\n\\t}\\n\\n\\t& img {\\n\\t\\t/*\\n\\t\\t * This is an arbitrary aspect for a 1x1 px GIF to display to the user. Not too tall, not too short.\\n\\t\\t * There's nothing special about this number except that it should make the image placeholder look like\\n\\t\\t * a real image during this short period after the upload started and before the image was read from the\\n\\t\\t * file system (and a rich preview was loaded).\\n\\t\\t */\\n\\t\\taspect-ratio: var(--ck-upload-placeholder-image-aspect-ratio);\\n\\t}\\n}\\n\\n.ck .ck-upload-placeholder-loader {\\n\\twidth: 100%;\\n\\theight: 100%;\\n\\n\\t&::before {\\n\\t\\twidth: var(--ck-upload-placeholder-loader-size);\\n\\t\\theight: var(--ck-upload-placeholder-loader-size);\\n\\t\\tborder-radius: 50%;\\n\\t\\tborder-top: 3px solid var(--ck-color-upload-placeholder-loader);\\n\\t\\tborder-right: 2px solid transparent;\\n\\t\\tanimation: ck-upload-placeholder-loader 1s linear infinite;\\n\\t}\\n}\\n\\n@keyframes ck-upload-placeholder-loader {\\n\\tto {\\n\\t\\ttransform: rotate( 360deg );\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-editor__editable .image,.ck.ck-editor__editable .image-inline{position:relative}.ck.ck-editor__editable .image .ck-progress-bar,.ck.ck-editor__editable .image-inline .ck-progress-bar{left:0;position:absolute;top:0}.ck.ck-editor__editable .image-inline.ck-appear,.ck.ck-editor__editable .image.ck-appear{animation:fadeIn .7s}.ck.ck-editor__editable .image .ck-progress-bar,.ck.ck-editor__editable .image-inline .ck-progress-bar{background:var(--ck-color-upload-bar-background);height:2px;transition:width .1s;width:0}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-image/theme/imageuploadprogress.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-image/imageuploadprogress.css\"],\"names\":[],\"mappings\":\"AAMC,qEAEC,iBACD,CAGA,uGAIC,MAAO,CAFP,iBAAkB,CAClB,KAED,CCRC,yFACC,oBACD,CAID,uGAIC,gDAAiD,CAFjD,UAAW,CAGX,oBAAuB,CAFvB,OAGD,CAGD,kBACC,GAAO,SAAY,CACnB,GAAO,SAAY,CACpB\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-editor__editable {\\n\\t& .image,\\n\\t& .image-inline {\\n\\t\\tposition: relative;\\n\\t}\\n\\n\\t/* Upload progress bar. */\\n\\t& .image .ck-progress-bar,\\n\\t& .image-inline .ck-progress-bar {\\n\\t\\tposition: absolute;\\n\\t\\ttop: 0;\\n\\t\\tleft: 0;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-editor__editable {\\n\\t& .image,\\n\\t& .image-inline {\\n\\t\\t/* Showing animation. */\\n\\t\\t&.ck-appear {\\n\\t\\t\\tanimation: fadeIn 700ms;\\n\\t\\t}\\n\\t}\\n\\n\\t/* Upload progress bar. */\\n\\t& .image .ck-progress-bar,\\n\\t& .image-inline .ck-progress-bar {\\n\\t\\theight: 2px;\\n\\t\\twidth: 0;\\n\\t\\tbackground: var(--ck-color-upload-bar-background);\\n\\t\\ttransition: width 100ms;\\n\\t}\\n}\\n\\n@keyframes fadeIn {\\n\\tfrom { opacity: 0; }\\n\\tto   { opacity: 1; }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".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%}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-image/theme/textalternativeform.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css\"],\"names\":[],\"mappings\":\"AAOA,6BACC,YAAa,CACb,kBAAmB,CACnB,gBAqBD,CAnBC,oDACC,oBACD,CAEA,uCACC,YACD,CCZA,oCDCD,6BAcE,cAUF,CARE,oDACC,eACD,CAEA,wCACC,cACD,CCrBD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css\\\";\\n\\n.ck.ck-text-alternative-form {\\n\\tdisplay: flex;\\n\\tflex-direction: row;\\n\\tflex-wrap: nowrap;\\n\\n\\t& .ck-labeled-field-view {\\n\\t\\tdisplay: inline-block;\\n\\t}\\n\\n\\t& .ck-label {\\n\\t\\tdisplay: none;\\n\\t}\\n\\n\\t@mixin ck-media-phone {\\n\\t\\tflex-wrap: wrap;\\n\\n\\t\\t& .ck-labeled-field-view {\\n\\t\\t\\tflex-basis: 100%;\\n\\t\\t}\\n\\n\\t\\t& .ck-button {\\n\\t\\t\\tflex-basis: 50%;\\n\\t\\t}\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@define-mixin ck-media-phone {\\n\\t@media screen and (max-width: 600px) {\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".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{border-right:1px solid var(--ck-color-base-text);height:100%;margin-right:-1px;outline:1px solid hsla(0,0%,100%,.5)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-link/link.css\"],\"names\":[],\"mappings\":\"AAMA,sBACC,mDAMD,CAHC,wCACC,yFACD,CAOD,4BACC,8CACD,CAGA,sCAEC,gDAAiD,CADjD,WAAY,CAEZ,iBAAkB,CAClB,oCACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/* Class added to span element surrounding currently selected link. */\\n.ck .ck-link_selected {\\n\\tbackground: var(--ck-color-link-selected-background);\\n\\n\\t/* Give linked inline images some outline to let the user know they are also part of the link. */\\n\\t& span.image-inline {\\n\\t\\toutline: var(--ck-widget-outline-thickness) solid var(--ck-color-link-selected-background);\\n\\t}\\n}\\n\\n/*\\n * Classes used by the \\\"fake visual selection\\\" displayed in the content when an input\\n * in the link UI has focus (the browser does not render the native selection in this state).\\n */\\n.ck .ck-fake-link-selection {\\n\\tbackground: var(--ck-color-link-fake-selection);\\n}\\n\\n/* A collapsed fake visual selection. */\\n.ck .ck-fake-link-selection_collapsed {\\n\\theight: 100%;\\n\\tborder-right: 1px solid var(--ck-color-base-text);\\n\\tmargin-right: -1px;\\n\\toutline: solid 1px hsla(0, 0%, 100%, .5);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".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{color:var(--ck-color-link-default);cursor:pointer;max-width:var(--ck-input-width);min-width:3em;padding:0 var(--ck-spacing-medium);text-align:center;text-overflow:ellipsis}.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{max-width:100%;min-width:0}[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}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-link/theme/linkactions.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-link/linkactions.css\"],\"names\":[],\"mappings\":\"AAOA,oBACC,YAAa,CACb,kBAAmB,CACnB,gBAqBD,CAnBC,8CACC,oBAKD,CAHC,gEACC,eACD,CCXD,oCDCD,oBAcE,cAUF,CARE,8CACC,eACD,CAEA,8DACC,cACD,CCrBD,CCIA,wDACC,cAAe,CACf,eAmCD,CAjCC,0EAEC,kCAAmC,CAEnC,cAAe,CAIf,+BAAgC,CAChC,aAAc,CARd,kCAAmC,CASnC,iBAAkB,CAPlB,sBAYD,CAHC,gFACC,yBACD,CAGD,mPAIC,eACD,CAEA,+DACC,eACD,CAGC,gFACC,yBACD,CAWD,qHACC,sCACD,CDtDD,oCC0DC,wDACC,8DAMD,CAJC,0EAEC,cAAe,CADf,WAED,CAGD,gJAME,aAEF,CDzED\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css\\\";\\n\\n.ck.ck-link-actions {\\n\\tdisplay: flex;\\n\\tflex-direction: row;\\n\\tflex-wrap: nowrap;\\n\\n\\t& .ck-link-actions__preview {\\n\\t\\tdisplay: inline-block;\\n\\n\\t\\t& .ck-button__label {\\n\\t\\t\\toverflow: hidden;\\n\\t\\t}\\n\\t}\\n\\n\\t@mixin ck-media-phone {\\n\\t\\tflex-wrap: wrap;\\n\\n\\t\\t& .ck-link-actions__preview {\\n\\t\\t\\tflex-basis: 100%;\\n\\t\\t}\\n\\n\\t\\t& .ck-button:not(.ck-link-actions__preview) {\\n\\t\\t\\tflex-basis: 50%;\\n\\t\\t}\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@define-mixin ck-media-phone {\\n\\t@media screen and (max-width: 600px) {\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_unselectable.css\\\";\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_dir.css\\\";\\n@import \\\"../mixins/_focus.css\\\";\\n@import \\\"../mixins/_shadow.css\\\";\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css\\\";\\n\\n.ck.ck-link-actions {\\n\\t& .ck-button.ck-link-actions__preview {\\n\\t\\tpadding-left: 0;\\n\\t\\tpadding-right: 0;\\n\\n\\t\\t& .ck-button__label {\\n\\t\\t\\tpadding: 0 var(--ck-spacing-medium);\\n\\t\\t\\tcolor: var(--ck-color-link-default);\\n\\t\\t\\ttext-overflow: ellipsis;\\n\\t\\t\\tcursor: pointer;\\n\\n\\t\\t\\t/* Match the box model of the link editor form's input so the balloon\\n\\t\\t\\tdoes not change width when moving between actions and the form. */\\n\\t\\t\\tmax-width: var(--ck-input-width);\\n\\t\\t\\tmin-width: 3em;\\n\\t\\t\\ttext-align: center;\\n\\n\\t\\t\\t&:hover {\\n\\t\\t\\t\\ttext-decoration: underline;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t&,\\n\\t\\t&:hover,\\n\\t\\t&:focus,\\n\\t\\t&:active {\\n\\t\\t\\tbackground: none;\\n\\t\\t}\\n\\n\\t\\t&:active {\\n\\t\\t\\tbox-shadow: none;\\n\\t\\t}\\n\\n\\t\\t&:focus {\\n\\t\\t\\t& .ck-button__label {\\n\\t\\t\\t\\ttext-decoration: underline;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t@mixin ck-dir ltr {\\n\\t\\t& .ck-button:not(:first-child) {\\n\\t\\t\\tmargin-left: var(--ck-spacing-standard);\\n\\t\\t}\\n\\t}\\n\\n\\t@mixin ck-dir rtl {\\n\\t\\t& .ck-button:not(:last-child) {\\n\\t\\t\\tmargin-left: var(--ck-spacing-standard);\\n\\t\\t}\\n\\t}\\n\\n\\t@mixin ck-media-phone {\\n\\t\\t& .ck-button.ck-link-actions__preview {\\n\\t\\t\\tmargin: var(--ck-spacing-standard) var(--ck-spacing-standard) 0;\\n\\n\\t\\t\\t& .ck-button__label {\\n\\t\\t\\t\\tmin-width: 0;\\n\\t\\t\\t\\tmax-width: 100%;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t& .ck-button:not(.ck-link-actions__preview) {\\n\\t\\t\\t@mixin ck-dir ltr {\\n\\t\\t\\t\\tmargin-left: 0;\\n\\t\\t\\t}\\n\\n\\t\\t\\t@mixin ck-dir rtl {\\n\\t\\t\\t\\tmargin-left: 0;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".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{min-width:var(--ck-input-width);padding:0}.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{border-radius:0;margin:0;padding:var(--ck-spacing-standard);width:50%}.ck.ck-link-form_layout-vertical>.ck-button:not(:focus){border-top:1px solid var(--ck-color-base-border)}[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{padding:0;width:100%}.ck.ck-link-form_layout-vertical .ck.ck-list .ck-button.ck-switchbutton:hover{background:none}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-link/theme/linkform.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-link/linkform.css\"],\"names\":[],\"mappings\":\"AAOA,iBACC,YAiBD,CAfC,2BACC,YACD,CCNA,oCDCD,iBAQE,cAUF,CARE,wCACC,eACD,CAEA,4BACC,cACD,CCfD,CDuBD,iCACC,aAYD,CALE,wHAEC,mCACD,CE/BF,iCAEC,+BAAgC,CADhC,SAgDD,CA7CC,wDACC,8EAMD,CAJC,uEACC,WAAY,CACZ,UACD,CAGD,4CAIC,eAAgB,CAFhB,QAAS,CADT,kCAAmC,CAEnC,SAkBD,CAfC,wDACC,gDACD,CARD,4GAeE,aAMF,CAJE,mEACC,kDACD,CAKF,6CACC,yDAUD,CARC,wEACC,SAAU,CACV,UAKD,CAHC,8EACC,eACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css\\\";\\n\\n.ck.ck-link-form {\\n\\tdisplay: flex;\\n\\n\\t& .ck-label {\\n\\t\\tdisplay: none;\\n\\t}\\n\\n\\t@mixin ck-media-phone {\\n\\t\\tflex-wrap: wrap;\\n\\n\\t\\t& .ck-labeled-field-view {\\n\\t\\t\\tflex-basis: 100%;\\n\\t\\t}\\n\\n\\t\\t& .ck-button {\\n\\t\\t\\tflex-basis: 50%;\\n\\t\\t}\\n\\t}\\n}\\n\\n/*\\n * Style link form differently when manual decorators are available.\\n * See: https://github.com/ckeditor/ckeditor5-link/issues/186.\\n */\\n.ck.ck-link-form_layout-vertical {\\n\\tdisplay: block;\\n\\n\\t/*\\n\\t * Whether the form is in the responsive mode or not, if there are decorator buttons\\n\\t * keep the top margin of action buttons medium.\\n\\t */\\n\\t& .ck-button {\\n\\t\\t&.ck-button-save,\\n\\t\\t&.ck-button-cancel {\\n\\t\\t\\tmargin-top: var(--ck-spacing-medium);\\n\\t\\t}\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@define-mixin ck-media-phone {\\n\\t@media screen and (max-width: 600px) {\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_dir.css\\\";\\n\\n/*\\n * Style link form differently when manual decorators are available.\\n * See: https://github.com/ckeditor/ckeditor5-link/issues/186.\\n */\\n.ck.ck-link-form_layout-vertical {\\n\\tpadding: 0;\\n\\tmin-width: var(--ck-input-width);\\n\\n\\t& .ck-labeled-field-view {\\n\\t\\tmargin: var(--ck-spacing-large) var(--ck-spacing-large) var(--ck-spacing-small);\\n\\n\\t\\t& .ck-input-text {\\n\\t\\t\\tmin-width: 0;\\n\\t\\t\\twidth: 100%;\\n\\t\\t}\\n\\t}\\n\\n\\t& > .ck-button {\\n\\t\\tpadding: var(--ck-spacing-standard);\\n\\t\\tmargin: 0;\\n\\t\\twidth: 50%;\\n\\t\\tborder-radius: 0;\\n\\n\\t\\t&:not(:focus) {\\n\\t\\t\\tborder-top: 1px solid var(--ck-color-base-border);\\n\\t\\t}\\n\\n\\t\\t@mixin ck-dir ltr {\\n\\t\\t\\tmargin-left: 0;\\n\\t\\t}\\n\\n\\t\\t@mixin ck-dir rtl {\\n\\t\\t\\tmargin-left: 0;\\n\\n\\t\\t\\t&:last-of-type {\\n\\t\\t\\t\\tborder-right: 1px solid var(--ck-color-base-border);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t/* Using additional `.ck` class for stronger CSS specificity than `.ck.ck-link-form > :not(:first-child)`. */\\n\\t& .ck.ck-list {\\n\\t\\tmargin: var(--ck-spacing-standard) var(--ck-spacing-large);\\n\\n\\t\\t& .ck-button.ck-switchbutton {\\n\\t\\t\\tpadding: 0;\\n\\t\\t\\twidth: 100%;\\n\\n\\t\\t\\t&:hover {\\n\\t\\t\\t\\tbackground: none;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".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{background-color:rgba(0,0,0,.4);background-image:url(\\\"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTExLjA3NyAxNSAuOTkxLTEuNDE2YS43NS43NSAwIDEgMSAxLjIyOS44NmwtMS4xNDggMS42NGEuNzQ4Ljc0OCAwIDAgMS0uMjE3LjIwNiA1LjI1MSA1LjI1MSAwIDAgMS04LjUwMy01Ljk1NS43NDEuNzQxIDAgMCAxIC4xMi0uMjc0bDEuMTQ3LTEuNjM5YS43NS43NSAwIDEgMSAxLjIyOC44Nkw0LjkzMyAxMC43bC4wMDYuMDAzYTMuNzUgMy43NSAwIDAgMCA2LjEzMiA0LjI5NGwuMDA2LjAwNHptNS40OTQtNS4zMzVhLjc0OC43NDggMCAwIDEtLjEyLjI3NGwtMS4xNDcgMS42MzlhLjc1Ljc1IDAgMSAxLTEuMjI4LS44NmwuODYtMS4yM2EzLjc1IDMuNzUgMCAwIDAtNi4xNDQtNC4zMDFsLS44NiAxLjIyOWEuNzUuNzUgMCAwIDEtMS4yMjktLjg2bDEuMTQ4LTEuNjRhLjc0OC43NDggMCAwIDEgLjIxNy0uMjA2IDUuMjUxIDUuMjUxIDAgMCAxIDguNTAzIDUuOTU1em0tNC41NjMtMi41MzJhLjc1Ljc1IDAgMCAxIC4xODQgMS4wNDVsLTMuMTU1IDQuNTA1YS43NS43NSAwIDEgMS0xLjIyOS0uODZsMy4xNTUtNC41MDZhLjc1Ljc1IDAgMCAxIDEuMDQ1LS4xODR6Ii8+PC9zdmc+\\\");background-position:50%;background-repeat:no-repeat;background-size:14px;border-radius:100%;content:\\\"\\\";height:calc(var(--ck-link-image-indicator-icon-is-visible)*var(--ck-link-image-indicator-icon-size));overflow:hidden;right:min(var(--ck-spacing-medium),6%);top:min(var(--ck-spacing-medium),6%);width:calc(var(--ck-link-image-indicator-icon-is-visible)*var(--ck-link-image-indicator-icon-size))}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-link/theme/linkimage.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-link/linkimage.css\"],\"names\":[],\"mappings\":\"AASE,+FACC,aAAc,CACd,iBACD,CCPF,MAEC,sCAAuC,CACvC,oEACD,CAME,+FAUC,+BAAqC,CACrC,83BAA+3B,CAG/3B,uBAA2B,CAD3B,2BAA4B,CAD5B,oBAAqB,CAGrB,kBAAmB,CAdnB,UAAW,CAsBX,oGAAuG,CAFvG,eAAgB,CAbhB,sCAAwC,CADxC,oCAAsC,CAetC,mGAED\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-editor__editable {\\n\\t/* Linked image indicator */\\n\\t& figure.image > a,\\n\\t& a span.image-inline {\\n\\t\\t&::after {\\n\\t\\t\\tdisplay: block;\\n\\t\\t\\tposition: absolute;\\n\\t\\t}\\n\\t}\\n}\\n\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t/* Match the icon size with the upload indicator brought by the image upload feature. */\\n\\t--ck-link-image-indicator-icon-size: 20;\\n\\t--ck-link-image-indicator-icon-is-visible: clamp(0px, 100% - 50px, 1px);\\n}\\n\\n.ck.ck-editor__editable {\\n\\t/* Linked image indicator */\\n\\t& figure.image > a,\\n\\t& a span.image-inline {\\n\\t\\t&::after {\\n\\t\\t\\tcontent: \\\"\\\";\\n\\n\\t\\t\\t/*\\n\\t\\t\\t * Smaller images should have the icon closer to the border.\\n\\t\\t\\t * Match the icon position with the upload indicator brought by the image upload feature.\\n\\t\\t\\t */\\n\\t\\t\\ttop: min(var(--ck-spacing-medium), 6%);\\n\\t\\t\\tright: min(var(--ck-spacing-medium), 6%);\\n\\n\\t\\t\\tbackground-color: hsla(0, 0%, 0%, .4);\\n\\t\\t\\tbackground-image: url(\\\"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTExLjA3NyAxNSAuOTkxLTEuNDE2YS43NS43NSAwIDEgMSAxLjIyOS44NmwtMS4xNDggMS42NGEuNzQ4Ljc0OCAwIDAgMS0uMjE3LjIwNiA1LjI1MSA1LjI1MSAwIDAgMS04LjUwMy01Ljk1NS43NDEuNzQxIDAgMCAxIC4xMi0uMjc0bDEuMTQ3LTEuNjM5YS43NS43NSAwIDEgMSAxLjIyOC44Nkw0LjkzMyAxMC43bC4wMDYuMDAzYTMuNzUgMy43NSAwIDAgMCA2LjEzMiA0LjI5NGwuMDA2LjAwNHptNS40OTQtNS4zMzVhLjc0OC43NDggMCAwIDEtLjEyLjI3NGwtMS4xNDcgMS42MzlhLjc1Ljc1IDAgMSAxLTEuMjI4LS44NmwuODYtMS4yM2EzLjc1IDMuNzUgMCAwIDAtNi4xNDQtNC4zMDFsLS44NiAxLjIyOWEuNzUuNzUgMCAwIDEtMS4yMjktLjg2bDEuMTQ4LTEuNjRhLjc0OC43NDggMCAwIDEgLjIxNy0uMjA2IDUuMjUxIDUuMjUxIDAgMCAxIDguNTAzIDUuOTU1em0tNC41NjMtMi41MzJhLjc1Ljc1IDAgMCAxIC4xODQgMS4wNDVsLTMuMTU1IDQuNTA1YS43NS43NSAwIDEgMS0xLjIyOS0uODZsMy4xNTUtNC41MDZhLjc1Ljc1IDAgMCAxIDEuMDQ1LS4xODR6Ii8+PC9zdmc+\\\");\\n\\t\\t\\tbackground-size: 14px;\\n\\t\\t\\tbackground-repeat: no-repeat;\\n\\t\\t\\tbackground-position: center;\\n\\t\\t\\tborder-radius: 100%;\\n\\n\\t\\t\\t/*\\n\\t\\t\\t* Use CSS math to simulate container queries.\\n\\t\\t\\t* https://css-tricks.com/the-raven-technique-one-step-closer-to-container-queries/#what-about-showing-and-hiding-things\\n\\t\\t\\t*/\\n\\t\\t\\toverflow: hidden;\\n\\t\\t\\twidth: calc(var(--ck-link-image-indicator-icon-is-visible) * var(--ck-link-image-indicator-icon-size));\\n\\t\\t\\theight: calc(var(--ck-link-image-indicator-icon-is-visible) * var(--ck-link-image-indicator-icon-size));\\n\\t\\t}\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-collapsible.ck-collapsible_collapsed>.ck-collapsible__children{display:none}:root{--ck-collapsible-arrow-size:calc(var(--ck-icon-size)*0.5)}.ck.ck-collapsible>.ck.ck-button{border-radius:0;color:inherit;font-weight:700;padding:var(--ck-spacing-medium) var(--ck-spacing-large);width:100%}.ck.ck-collapsible>.ck.ck-button:focus{background:transparent}.ck.ck-collapsible>.ck.ck-button:active,.ck.ck-collapsible>.ck.ck-button:hover:not(:focus),.ck.ck-collapsible>.ck.ck-button:not(:focus){background:transparent;border-color:transparent;box-shadow:none}.ck.ck-collapsible>.ck.ck-button>.ck-icon{margin-right:var(--ck-spacing-medium);width:var(--ck-collapsible-arrow-size)}.ck.ck-collapsible>.ck-collapsible__children{padding:0 var(--ck-spacing-large) var(--ck-spacing-large)}.ck.ck-collapsible.ck-collapsible_collapsed>.ck.ck-button .ck-icon{transform:rotate(-90deg)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-list/theme/collapsible.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-list/collapsible.css\"],\"names\":[],\"mappings\":\"AAMC,sEACC,YACD,CCHD,MACC,yDACD,CAGC,iCAIC,eAAgB,CAChB,aAAc,CAHd,eAAiB,CACjB,wDAAyD,CAFzD,UAoBD,CAdC,uCACC,sBACD,CAEA,wIACC,sBAAuB,CACvB,wBAAyB,CACzB,eACD,CAEA,0CACC,qCAAsC,CACtC,sCACD,CAGD,6CACC,yDACD,CAGC,mEACC,wBACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-collapsible.ck-collapsible_collapsed {\\n\\t& > .ck-collapsible__children {\\n\\t\\tdisplay: none;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-collapsible-arrow-size: calc(0.5 * var(--ck-icon-size));\\n}\\n\\n.ck.ck-collapsible {\\n\\t& > .ck.ck-button {\\n\\t\\twidth: 100%;\\n\\t\\tfont-weight: bold;\\n\\t\\tpadding: var(--ck-spacing-medium) var(--ck-spacing-large);\\n\\t\\tborder-radius: 0;\\n\\t\\tcolor: inherit;\\n\\n\\t\\t&:focus {\\n\\t\\t\\tbackground: transparent;\\n\\t\\t}\\n\\n\\t\\t&:active, &:not(:focus), &:hover:not(:focus) {\\n\\t\\t\\tbackground: transparent;\\n\\t\\t\\tborder-color: transparent;\\n\\t\\t\\tbox-shadow: none;\\n\\t\\t}\\n\\n\\t\\t& > .ck-icon {\\n\\t\\t\\tmargin-right: var(--ck-spacing-medium);\\n\\t\\t\\twidth: var(--ck-collapsible-arrow-size);\\n\\t\\t}\\n\\t}\\n\\n\\t& > .ck-collapsible__children {\\n\\t\\tpadding: 0 var(--ck-spacing-large) var(--ck-spacing-large);\\n\\t}\\n\\n\\t&.ck-collapsible_collapsed {\\n\\t\\t& > .ck.ck-button .ck-icon {\\n\\t\\t\\ttransform: rotate(-90deg);\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck-content ol{list-style-type:decimal}.ck-content ol ol{list-style-type:lower-latin}.ck-content ol ol ol{list-style-type:lower-roman}.ck-content ol ol ol ol{list-style-type:upper-latin}.ck-content ol ol ol ol ol{list-style-type:upper-roman}.ck-content ul{list-style-type:disc}.ck-content ul ul{list-style-type:circle}.ck-content ul ul ul,.ck-content ul ul ul ul{list-style-type:square}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-list/theme/list.css\"],\"names\":[],\"mappings\":\"AAKA,eACC,uBAiBD,CAfC,kBACC,2BAaD,CAXC,qBACC,2BASD,CAPC,wBACC,2BAKD,CAHC,2BACC,2BACD,CAMJ,eACC,oBAaD,CAXC,kBACC,sBASD,CAJE,6CACC,sBACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck-content ol {\\n\\tlist-style-type: decimal;\\n\\n\\t& ol {\\n\\t\\tlist-style-type: lower-latin;\\n\\n\\t\\t& ol {\\n\\t\\t\\tlist-style-type: lower-roman;\\n\\n\\t\\t\\t& ol {\\n\\t\\t\\t\\tlist-style-type: upper-latin;\\n\\n\\t\\t\\t\\t& ol {\\n\\t\\t\\t\\t\\tlist-style-type: upper-roman;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\\n.ck-content ul {\\n\\tlist-style-type: disc;\\n\\n\\t& ul {\\n\\t\\tlist-style-type: circle;\\n\\n\\t\\t& ul {\\n\\t\\t\\tlist-style-type: square;\\n\\n\\t\\t\\t& ul {\\n\\t\\t\\t\\tlist-style-type: square;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-list-properties.ck-list-properties_without-styles{padding:var(--ck-spacing-large)}.ck.ck-list-properties.ck-list-properties_without-styles>*{min-width:14em}.ck.ck-list-properties.ck-list-properties_without-styles>*+*{margin-top:var(--ck-spacing-standard)}.ck.ck-list-properties.ck-list-properties_with-numbered-properties>.ck-list-styles-list{grid-template-columns:repeat(4,auto)}.ck.ck-list-properties.ck-list-properties_with-numbered-properties>.ck-collapsible{border-top:1px solid var(--ck-color-base-border)}.ck.ck-list-properties.ck-list-properties_with-numbered-properties>.ck-collapsible>.ck-collapsible__children>*{width:100%}.ck.ck-list-properties.ck-list-properties_with-numbered-properties>.ck-collapsible>.ck-collapsible__children>*+*{margin-top:var(--ck-spacing-standard)}.ck.ck-list-properties .ck.ck-numbered-list-properties__start-index .ck-input{min-width:auto;width:100%}.ck.ck-list-properties .ck.ck-numbered-list-properties__reversed-order{background:transparent;margin-bottom:calc(var(--ck-spacing-tiny)*-1);padding-left:0;padding-right:0}.ck.ck-list-properties .ck.ck-numbered-list-properties__reversed-order:active,.ck.ck-list-properties .ck.ck-numbered-list-properties__reversed-order:hover{background:none;border-color:transparent;box-shadow:none}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-list/listproperties.css\"],\"names\":[],\"mappings\":\"AAOC,yDACC,+BASD,CAPC,2DACC,cAKD,CAHC,6DACC,qCACD,CASD,wFACC,oCACD,CAGA,mFACC,gDAWD,CARE,+GACC,UAKD,CAHC,iHACC,qCACD,CAMJ,8EACC,cAAe,CACf,UACD,CAEA,uEACC,sBAAuB,CAGvB,6CAAgD,CAFhD,cAAe,CACf,eAQD,CALC,2JAGC,eAAgB,CADhB,wBAAyB,CADzB,eAGD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-list-properties {\\n\\t/* When there are no list styles and there is no collapsible. */\\n\\t&.ck-list-properties_without-styles {\\n\\t\\tpadding: var(--ck-spacing-large);\\n\\n\\t\\t& > * {\\n\\t\\t\\tmin-width: 14em;\\n\\n\\t\\t\\t& + * {\\n\\t\\t\\t\\tmargin-top: var(--ck-spacing-standard);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t/*\\n\\t * When the numbered list property fields (start at, reversed) should be displayed,\\n\\t * more horizontal space is needed. Reconfigure the style grid to create that space.\\n\\t */\\n\\t&.ck-list-properties_with-numbered-properties {\\n\\t\\t& > .ck-list-styles-list {\\n\\t\\t\\tgrid-template-columns: repeat( 4, auto );\\n\\t\\t}\\n\\n\\t\\t/* When list styles are rendered and property fields are in a collapsible. */\\n\\t\\t& > .ck-collapsible {\\n\\t\\t\\tborder-top: 1px solid var(--ck-color-base-border);\\n\\n\\t\\t\\t& > .ck-collapsible__children {\\n\\t\\t\\t\\t& > * {\\n\\t\\t\\t\\t\\twidth: 100%;\\n\\n\\t\\t\\t\\t\\t& + * {\\n\\t\\t\\t\\t\\t\\tmargin-top: var(--ck-spacing-standard);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t& .ck.ck-numbered-list-properties__start-index .ck-input {\\n\\t\\tmin-width: auto;\\n\\t\\twidth: 100%;\\n\\t}\\n\\n\\t& .ck.ck-numbered-list-properties__reversed-order {\\n\\t\\tbackground: transparent;\\n\\t\\tpadding-left: 0;\\n\\t\\tpadding-right: 0;\\n\\t\\tmargin-bottom: calc(-1 * var(--ck-spacing-tiny));\\n\\n\\t\\t&:active, &:hover {\\n\\t\\t\\tbox-shadow: none;\\n\\t\\t\\tborder-color: transparent;\\n\\t\\t\\tbackground: none;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-list-styles-list{display:grid}:root{--ck-list-style-button-size:44px}.ck.ck-list-styles-list{column-gap:var(--ck-spacing-medium);grid-template-columns:repeat(3,auto);padding:var(--ck-spacing-large);row-gap:var(--ck-spacing-medium)}.ck.ck-list-styles-list .ck-button{box-sizing:content-box;margin:0;padding:0}.ck.ck-list-styles-list .ck-button,.ck.ck-list-styles-list .ck-button .ck-icon{height:var(--ck-list-style-button-size);width:var(--ck-list-style-button-size)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-list/theme/liststyles.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-list/liststyles.css\"],\"names\":[],\"mappings\":\"AAKA,wBACC,YACD,CCFA,MACC,gCACD,CAEA,wBAGC,mCAAoC,CAFpC,oCAAwC,CAGxC,+BAAgC,CAFhC,gCA4BD,CAxBC,mCAiBC,sBAAuB,CAPvB,QAAS,CANT,SAmBD,CAJC,+EAhBA,uCAAwC,CADxC,sCAoBA\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-list-styles-list {\\n\\tdisplay: grid;\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-list-style-button-size: 44px;\\n}\\n\\n.ck.ck-list-styles-list {\\n\\tgrid-template-columns: repeat( 3, auto );\\n\\trow-gap: var(--ck-spacing-medium);\\n\\tcolumn-gap: var(--ck-spacing-medium);\\n\\tpadding: var(--ck-spacing-large);\\n\\n\\t& .ck-button {\\n\\t\\t/* Make the button look like a thumbnail (the icon \\\"takes it all\\\"). */\\n\\t\\twidth: var(--ck-list-style-button-size);\\n\\t\\theight: var(--ck-list-style-button-size);\\n\\t\\tpadding: 0;\\n\\n\\t\\t/*\\n\\t\\t * Buttons are aligned by the grid so disable default button margins to not collide with the\\n\\t\\t * gaps in the grid.\\n\\t\\t */\\n\\t\\tmargin: 0;\\n\\n\\t\\t/*\\n\\t\\t * Make sure the button border (which is displayed on focus, BTW) does not steal pixels\\n\\t\\t * from the button dimensions and, as a result, decrease the size of the icon\\n\\t\\t * (which becomes blurry as it scales down).\\n\\t\\t */\\n\\t\\tbox-sizing: content-box;\\n\\n\\t\\t& .ck-icon {\\n\\t\\t\\twidth: var(--ck-list-style-button-size);\\n\\t\\t\\theight: var(--ck-list-style-button-size);\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck-content .media{clear:both;display:block;margin:.9em 0;min-width:15em}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaembed.css\"],\"names\":[],\"mappings\":\"AAKA,mBAGC,UAAW,CASX,aAAc,CAJd,aAAe,CAQf,cACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck-content .media {\\n\\t/* Don't allow floated content overlap the media.\\n\\thttps://github.com/ckeditor/ckeditor5-media-embed/issues/53 */\\n\\tclear: both;\\n\\n\\t/* Make sure there is some space between the content and the media. */\\n\\t/* The first value should be equal to --ck-spacing-large variable if used in the editor context\\n\\tto avoid the content jumping (See https://github.com/ckeditor/ckeditor5/issues/9825). */\\n\\tmargin: 0.9em 0;\\n\\n\\t/* Make sure media is not overriden with Bootstrap default `flex` value.\\n\\tSee: https://github.com/ckeditor/ckeditor5/issues/1373. */\\n\\tdisplay: block;\\n\\n\\t/* Give the media some minimal width in the content to prevent them\\n\\tfrom being \\\"squashed\\\" in tight spaces, e.g. in table cells (#44) */\\n\\tmin-width: 15em;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck-media__wrapper .ck-media__placeholder{align-items:center;display:flex;flex-direction:column}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url{max-width:100%;position:relative}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url .ck-media__placeholder__url__text{display:block;overflow:hidden}.ck-media__wrapper[data-oembed-url*=\\\"facebook.com\\\"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*=\\\"goo.gl/maps\\\"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*=\\\"google.com/maps\\\"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*=\\\"instagram.com\\\"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*=\\\"maps.app.goo.gl\\\"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*=\\\"maps.google.com\\\"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*=\\\"twitter.com\\\"] .ck-media__placeholder__icon *{display:none}.ck-editor__editable:not(.ck-read-only) .ck-media__wrapper>:not(.ck-media__placeholder),.ck-editor__editable:not(.ck-read-only) .ck-widget:not(.ck-widget_selected) .ck-media__placeholder{pointer-events:none}:root{--ck-media-embed-placeholder-icon-size:3em;--ck-color-media-embed-placeholder-url-text:#757575;--ck-color-media-embed-placeholder-url-text-hover:var(--ck-color-base-text)}.ck-media__wrapper{margin:0 auto}.ck-media__wrapper .ck-media__placeholder{background:var(--ck-color-base-foreground);padding:calc(var(--ck-spacing-standard)*3)}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__icon{background-position:50%;background-size:cover;height:var(--ck-media-embed-placeholder-icon-size);margin-bottom:var(--ck-spacing-large);min-width:var(--ck-media-embed-placeholder-icon-size)}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__icon .ck-icon{height:100%;width:100%}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url__text{color:var(--ck-color-media-embed-placeholder-url-text);font-style:italic;text-align:center;text-overflow:ellipsis;white-space:nowrap}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url__text:hover{color:var(--ck-color-media-embed-placeholder-url-text-hover);cursor:pointer;text-decoration:underline}.ck-media__wrapper[data-oembed-url*=\\\"open.spotify.com\\\"]{max-height:380px;max-width:300px}.ck-media__wrapper[data-oembed-url*=\\\"goo.gl/maps\\\"] .ck-media__placeholder__icon,.ck-media__wrapper[data-oembed-url*=\\\"google.com/maps\\\"] .ck-media__placeholder__icon,.ck-media__wrapper[data-oembed-url*=\\\"maps.app.goo.gl\\\"] .ck-media__placeholder__icon,.ck-media__wrapper[data-oembed-url*=\\\"maps.google.com\\\"] .ck-media__placeholder__icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTAuMzc4IiBoZWlnaHQ9IjI1NC4xNjciIHZpZXdCb3g9IjAgMCA2Ni4yNDYgNjcuMjQ4Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjUzMSAtMjE4LjQ1NSkgc2NhbGUoLjk4MDEyKSI+PHJlY3Qgcnk9IjUuMjM4IiByeD0iNS4yMzgiIHk9IjIzMS4zOTkiIHg9IjE3Ni4wMzEiIGhlaWdodD0iNjAuMDk5IiB3aWR0aD0iNjAuMDk5IiBmaWxsPSIjMzRhNjY4IiBwYWludC1vcmRlcj0ibWFya2VycyBzdHJva2UgZmlsbCIvPjxwYXRoIGQ9Im0yMDYuNDc3IDI2MC45LTI4Ljk4NyAyOC45ODdhNS4yMTggNS4yMTggMCAwIDAgMy43OCAxLjYxaDQ5LjYyMWMxLjY5NCAwIDMuMTktLjc5OCA0LjE0Ni0yLjAzN3oiIGZpbGw9IiM1Yzg4YzUiLz48cGF0aCBkPSJNMjI2Ljc0MiAyMjIuOTg4Yy05LjI2NiAwLTE2Ljc3NyA3LjE3LTE2Ljc3NyAxNi4wMTQuMDA3IDIuNzYyLjY2MyA1LjQ3NCAyLjA5MyA3Ljg3NS40My43MDMuODMgMS40MDggMS4xOSAyLjEwNy4zMzMuNTAyLjY1IDEuMDA1Ljk1IDEuNTA4LjM0My40NzcuNjczLjk1Ny45ODggMS40NCAxLjMxIDEuNzY5IDIuNSAzLjUwMiAzLjYzNyA1LjE2OC43OTMgMS4yNzUgMS42ODMgMi42NCAyLjQ2NiAzLjk5IDIuMzYzIDQuMDk0IDQuMDA3IDguMDkyIDQuNiAxMy45MTR2LjAxMmMuMTgyLjQxMi41MTYuNjY2Ljg3OS42NjcuNDAzLS4wMDEuNzY4LS4zMTQuOTMtLjc5OS42MDMtNS43NTYgMi4yMzgtOS43MjkgNC41ODUtMTMuNzk0Ljc4Mi0xLjM1IDEuNjczLTIuNzE1IDIuNDY1LTMuOTkgMS4xMzctMS42NjYgMi4zMjgtMy40IDMuNjM4LTUuMTY5LjMxNS0uNDgyLjY0NS0uOTYyLjk4OC0xLjQzOS4zLS41MDMuNjE3LTEuMDA2Ljk1LTEuNTA4LjM1OS0uNy43Ni0xLjQwNCAxLjE5LTIuMTA3IDEuNDI2LTIuNDAyIDItNS4xMTQgMi4wMDQtNy44NzUgMC04Ljg0NC03LjUxMS0xNi4wMTQtMTYuNzc2LTE2LjAxNHoiIGZpbGw9IiNkZDRiM2UiIHBhaW50LW9yZGVyPSJtYXJrZXJzIHN0cm9rZSBmaWxsIi8+PGVsbGlwc2Ugcnk9IjUuNTY0IiByeD0iNS44MjgiIGN5PSIyMzkuMDAyIiBjeD0iMjI2Ljc0MiIgZmlsbD0iIzgwMmQyNyIgcGFpbnQtb3JkZXI9Im1hcmtlcnMgc3Ryb2tlIGZpbGwiLz48cGF0aCBkPSJNMTkwLjMwMSAyMzcuMjgzYy00LjY3IDAtOC40NTcgMy44NTMtOC40NTcgOC42MDZzMy43ODYgOC42MDcgOC40NTcgOC42MDdjMy4wNDMgMCA0LjgwNi0uOTU4IDYuMzM3LTIuNTE2IDEuNTMtMS41NTcgMi4wODctMy45MTMgMi4wODctNi4yOSAwLS4zNjItLjAyMy0uNzIyLS4wNjQtMS4wNzloLTguMjU3djMuMDQzaDQuODVjLS4xOTcuNzU5LS41MzEgMS40NS0xLjA1OCAxLjk4Ni0uOTQyLjk1OC0yLjAyOCAxLjU0OC0zLjkwMSAxLjU0OC0yLjg3NiAwLTUuMjA4LTIuMzcyLTUuMjA4LTUuMjk5IDAtMi45MjYgMi4zMzItNS4yOTkgNS4yMDgtNS4yOTkgMS4zOTkgMCAyLjYxOC40MDcgMy41ODQgMS4yOTNsMi4zODEtMi4zOGMwLS4wMDItLjAwMy0uMDA0LS4wMDQtLjAwNS0xLjU4OC0xLjUyNC0zLjYyLTIuMjE1LTUuOTU1LTIuMjE1em00LjQzIDUuNjYuMDAzLjAwNnYtLjAwM3oiIGZpbGw9IiNmZmYiIHBhaW50LW9yZGVyPSJtYXJrZXJzIHN0cm9rZSBmaWxsIi8+PHBhdGggZD0ibTIxNS4xODQgMjUxLjkyOS03Ljk4IDcuOTc5IDI4LjQ3NyAyOC40NzVhNS4yMzMgNS4yMzMgMCAwIDAgLjQ0OS0yLjEyM3YtMzEuMTY1Yy0uNDY5LjY3NS0uOTM0IDEuMzQ5LTEuMzgyIDIuMDA1LS43OTIgMS4yNzUtMS42ODIgMi42NC0yLjQ2NSAzLjk5LTIuMzQ3IDQuMDY1LTMuOTgyIDguMDM4LTQuNTg1IDEzLjc5NC0uMTYyLjQ4NS0uNTI3Ljc5OC0uOTMuNzk5LS4zNjMtLjAwMS0uNjk3LS4yNTUtLjg3OS0uNjY3di0uMDEyYy0uNTkzLTUuODIyLTIuMjM3LTkuODItNC42LTEzLjkxNC0uNzgzLTEuMzUtMS42NzMtMi43MTUtMi40NjYtMy45OS0xLjEzNy0xLjY2Ni0yLjMyNy0zLjQtMy42MzctNS4xNjlsLS4wMDItLjAwM3oiIGZpbGw9IiNjM2MzYzMiLz48cGF0aCBkPSJtMjEyLjk4MyAyNDguNDk1LTM2Ljk1MiAzNi45NTN2LjgxMmE1LjIyNyA1LjIyNyAwIDAgMCA1LjIzOCA1LjIzOGgxLjAxNWwzNS42NjYtMzUuNjY2YTEzNi4yNzUgMTM2LjI3NSAwIDAgMC0yLjc2NC0zLjkgMzcuNTc1IDM3LjU3NSAwIDAgMC0uOTg5LTEuNDQgMzUuMTI3IDM1LjEyNyAwIDAgMC0uOTUtMS41MDhjLS4wODMtLjE2Mi0uMTc2LS4zMjYtLjI2NC0uNDg5eiIgZmlsbD0iI2ZkZGM0ZiIgcGFpbnQtb3JkZXI9Im1hcmtlcnMgc3Ryb2tlIGZpbGwiLz48cGF0aCBkPSJtMjExLjk5OCAyNjEuMDgzLTYuMTUyIDYuMTUxIDI0LjI2NCAyNC4yNjRoLjc4MWE1LjIyNyA1LjIyNyAwIDAgMCA1LjIzOS01LjIzOHYtMS4wNDV6IiBmaWxsPSIjZmZmIiBwYWludC1vcmRlcj0ibWFya2VycyBzdHJva2UgZmlsbCIvPjwvZz48L3N2Zz4=)}.ck-media__wrapper[data-oembed-url*=\\\"facebook.com\\\"] .ck-media__placeholder{background:#4268b3}.ck-media__wrapper[data-oembed-url*=\\\"facebook.com\\\"] .ck-media__placeholder .ck-media__placeholder__icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAyNCIgaGVpZ2h0PSIxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik05NjcuNDg0IDBINTYuNTE3QzI1LjMwNCAwIDAgMjUuMzA0IDAgNTYuNTE3djkxMC45NjZDMCA5OTguNjk0IDI1LjI5NyAxMDI0IDU2LjUyMiAxMDI0SDU0N1Y2MjhINDE0VjQ3M2gxMzNWMzU5LjAyOWMwLTEzMi4yNjIgODAuNzczLTIwNC4yODIgMTk4Ljc1Ni0yMDQuMjgyIDU2LjUxMyAwIDEwNS4wODYgNC4yMDggMTE5LjI0NCA2LjA4OVYyOTlsLTgxLjYxNi4wMzdjLTYzLjk5MyAwLTc2LjM4NCAzMC40OTItNzYuMzg0IDc1LjIzNlY0NzNoMTUzLjQ4N2wtMTkuOTg2IDE1NUg3MDd2Mzk2aDI2MC40ODRjMzEuMjEzIDAgNTYuNTE2LTI1LjMwMyA1Ni41MTYtNTYuNTE2VjU2LjUxNUMxMDI0IDI1LjMwMyA5OTguNjk3IDAgOTY3LjQ4NCAwIiBmaWxsPSIjRkZGRkZFIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48L3N2Zz4=)}.ck-media__wrapper[data-oembed-url*=\\\"facebook.com\\\"] .ck-media__placeholder .ck-media__placeholder__url__text{color:#cdf}.ck-media__wrapper[data-oembed-url*=\\\"facebook.com\\\"] .ck-media__placeholder .ck-media__placeholder__url__text:hover{color:#fff}.ck-media__wrapper[data-oembed-url*=\\\"instagram.com\\\"] .ck-media__placeholder{background:linear-gradient(-135deg,#1400c7,#b800b1,#f50000)}.ck-media__wrapper[data-oembed-url*=\\\"instagram.com\\\"] .ck-media__placeholder .ck-media__placeholder__icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTA0IiBoZWlnaHQ9IjUwNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PGRlZnM+PHBhdGggaWQ9ImEiIGQ9Ik0wIC4xNTloNTAzLjg0MVY1MDMuOTRIMHoiLz48L2RlZnM+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48bWFzayBpZD0iYiIgZmlsbD0iI2ZmZiI+PHVzZSB4bGluazpocmVmPSIjYSIvPjwvbWFzaz48cGF0aCBkPSJNMjUxLjkyMS4xNTljLTY4LjQxOCAwLTc2Ljk5Ny4yOS0xMDMuODY3IDEuNTE2LTI2LjgxNCAxLjIyMy00NS4xMjcgNS40ODItNjEuMTUxIDExLjcxLTE2LjU2NiA2LjQzNy0zMC42MTUgMTUuMDUxLTQ0LjYyMSAyOS4wNTYtMTQuMDA1IDE0LjAwNi0yMi42MTkgMjguMDU1LTI5LjA1NiA0NC42MjEtNi4yMjggMTYuMDI0LTEwLjQ4NyAzNC4zMzctMTEuNzEgNjEuMTUxQy4yOSAxNzUuMDgzIDAgMTgzLjY2MiAwIDI1Mi4wOGMwIDY4LjQxNy4yOSA3Ni45OTYgMS41MTYgMTAzLjg2NiAxLjIyMyAyNi44MTQgNS40ODIgNDUuMTI3IDExLjcxIDYxLjE1MSA2LjQzNyAxNi41NjYgMTUuMDUxIDMwLjYxNSAyOS4wNTYgNDQuNjIxIDE0LjAwNiAxNC4wMDUgMjguMDU1IDIyLjYxOSA0NC42MjEgMjkuMDU3IDE2LjAyNCA2LjIyNyAzNC4zMzcgMTAuNDg2IDYxLjE1MSAxMS43MDkgMjYuODcgMS4yMjYgMzUuNDQ5IDEuNTE2IDEwMy44NjcgMS41MTYgNjguNDE3IDAgNzYuOTk2LS4yOSAxMDMuODY2LTEuNTE2IDI2LjgxNC0xLjIyMyA0NS4xMjctNS40ODIgNjEuMTUxLTExLjcwOSAxNi41NjYtNi40MzggMzAuNjE1LTE1LjA1MiA0NC42MjEtMjkuMDU3IDE0LjAwNS0xNC4wMDYgMjIuNjE5LTI4LjA1NSAyOS4wNTctNDQuNjIxIDYuMjI3LTE2LjAyNCAxMC40ODYtMzQuMzM3IDExLjcwOS02MS4xNTEgMS4yMjYtMjYuODcgMS41MTYtMzUuNDQ5IDEuNTE2LTEwMy44NjYgMC02OC40MTgtLjI5LTc2Ljk5Ny0xLjUxNi0xMDMuODY3LTEuMjIzLTI2LjgxNC01LjQ4Mi00NS4xMjctMTEuNzA5LTYxLjE1MS02LjQzOC0xNi41NjYtMTUuMDUyLTMwLjYxNS0yOS4wNTctNDQuNjIxLTE0LjAwNi0xNC4wMDUtMjguMDU1LTIyLjYxOS00NC42MjEtMjkuMDU2LTE2LjAyNC02LjIyOC0zNC4zMzctMTAuNDg3LTYxLjE1MS0xMS43MUMzMjguOTE3LjQ0OSAzMjAuMzM4LjE1OSAyNTEuOTIxLjE1OVptMCA0NS4zOTFjNjcuMjY1IDAgNzUuMjMzLjI1NyAxMDEuNzk3IDEuNDY5IDI0LjU2MiAxLjEyIDM3LjkwMSA1LjIyNCA0Ni43NzggOC42NzQgMTEuNzU5IDQuNTcgMjAuMTUxIDEwLjAyOSAyOC45NjYgMTguODQ1IDguODE2IDguODE1IDE0LjI3NSAxNy4yMDcgMTguODQ1IDI4Ljk2NiAzLjQ1IDguODc3IDcuNTU0IDIyLjIxNiA4LjY3NCA0Ni43NzggMS4yMTIgMjYuNTY0IDEuNDY5IDM0LjUzMiAxLjQ2OSAxMDEuNzk4IDAgNjcuMjY1LS4yNTcgNzUuMjMzLTEuNDY5IDEwMS43OTctMS4xMiAyNC41NjItNS4yMjQgMzcuOTAxLTguNjc0IDQ2Ljc3OC00LjU3IDExLjc1OS0xMC4wMjkgMjAuMTUxLTE4Ljg0NSAyOC45NjYtOC44MTUgOC44MTYtMTcuMjA3IDE0LjI3NS0yOC45NjYgMTguODQ1LTguODc3IDMuNDUtMjIuMjE2IDcuNTU0LTQ2Ljc3OCA4LjY3NC0yNi41NiAxLjIxMi0zNC41MjcgMS40NjktMTAxLjc5NyAxLjQ2OS02Ny4yNzEgMC03NS4yMzctLjI1Ny0xMDEuNzk4LTEuNDY5LTI0LjU2Mi0xLjEyLTM3LjkwMS01LjIyNC00Ni43NzgtOC42NzQtMTEuNzU5LTQuNTctMjAuMTUxLTEwLjAyOS0yOC45NjYtMTguODQ1LTguODE1LTguODE1LTE0LjI3NS0xNy4yMDctMTguODQ1LTI4Ljk2Ni0zLjQ1LTguODc3LTcuNTU0LTIyLjIxNi04LjY3NC00Ni43NzgtMS4yMTItMjYuNTY0LTEuNDY5LTM0LjUzMi0xLjQ2OS0xMDEuNzk3IDAtNjcuMjY2LjI1Ny03NS4yMzQgMS40NjktMTAxLjc5OCAxLjEyLTI0LjU2MiA1LjIyNC0zNy45MDEgOC42NzQtNDYuNzc4IDQuNTctMTEuNzU5IDEwLjAyOS0yMC4xNTEgMTguODQ1LTI4Ljk2NiA4LjgxNS04LjgxNiAxNy4yMDctMTQuMjc1IDI4Ljk2Ni0xOC44NDUgOC44NzctMy40NSAyMi4yMTYtNy41NTQgNDYuNzc4LTguNjc0IDI2LjU2NC0xLjIxMiAzNC41MzItMS40NjkgMTAxLjc5OC0xLjQ2OVoiIGZpbGw9IiNGRkYiIG1hc2s9InVybCgjYikiLz48cGF0aCBkPSJNMjUxLjkyMSAzMzYuMDUzYy00Ni4zNzggMC04My45NzQtMzcuNTk2LTgzLjk3NC04My45NzMgMC00Ni4zNzggMzcuNTk2LTgzLjk3NCA4My45NzQtODMuOTc0IDQ2LjM3NyAwIDgzLjk3MyAzNy41OTYgODMuOTczIDgzLjk3NCAwIDQ2LjM3Ny0zNy41OTYgODMuOTczLTgzLjk3MyA4My45NzNabTAtMjEzLjMzOGMtNzEuNDQ3IDAtMTI5LjM2NSA1Ny45MTgtMTI5LjM2NSAxMjkuMzY1IDAgNzEuNDQ2IDU3LjkxOCAxMjkuMzY0IDEyOS4zNjUgMTI5LjM2NCA3MS40NDYgMCAxMjkuMzY0LTU3LjkxOCAxMjkuMzY0LTEyOS4zNjQgMC03MS40NDctNTcuOTE4LTEyOS4zNjUtMTI5LjM2NC0xMjkuMzY1Wk00MTYuNjI3IDExNy42MDRjMCAxNi42OTYtMTMuNTM1IDMwLjIzLTMwLjIzMSAzMC4yMy0xNi42OTUgMC0zMC4yMy0xMy41MzQtMzAuMjMtMzAuMjMgMC0xNi42OTYgMTMuNTM1LTMwLjIzMSAzMC4yMy0zMC4yMzEgMTYuNjk2IDAgMzAuMjMxIDEzLjUzNSAzMC4yMzEgMzAuMjMxIiBmaWxsPSIjRkZGIi8+PC9nPjwvc3ZnPg==)}.ck-media__wrapper[data-oembed-url*=\\\"instagram.com\\\"] .ck-media__placeholder .ck-media__placeholder__url__text{color:#ffe0fe}.ck-media__wrapper[data-oembed-url*=\\\"instagram.com\\\"] .ck-media__placeholder .ck-media__placeholder__url__text:hover{color:#fff}.ck-media__wrapper[data-oembed-url*=\\\"twitter.com\\\"] .ck.ck-media__placeholder{background:linear-gradient(90deg,#71c6f4,#0d70a5)}.ck-media__wrapper[data-oembed-url*=\\\"twitter.com\\\"] .ck.ck-media__placeholder .ck-media__placeholder__icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0MDAgNDAwIiB4bWw6c3BhY2U9InByZXNlcnZlIj48cGF0aCBkPSJNNDAwIDIwMGMwIDExMC41LTg5LjUgMjAwLTIwMCAyMDBTMCAzMTAuNSAwIDIwMCA4OS41IDAgMjAwIDBzMjAwIDg5LjUgMjAwIDIwMHpNMTYzLjQgMzA1LjVjODguNyAwIDEzNy4yLTczLjUgMTM3LjItMTM3LjIgMC0yLjEgMC00LjItLjEtNi4yIDkuNC02LjggMTcuNi0xNS4zIDI0LjEtMjUtOC42IDMuOC0xNy45IDYuNC0yNy43IDcuNiAxMC02IDE3LjYtMTUuNCAyMS4yLTI2LjctOS4zIDUuNS0xOS42IDkuNS0zMC42IDExLjctOC44LTkuNC0yMS4zLTE1LjItMzUuMi0xNS4yLTI2LjYgMC00OC4yIDIxLjYtNDguMiA0OC4yIDAgMy44LjQgNy41IDEuMyAxMS00MC4xLTItNzUuNi0yMS4yLTk5LjQtNTAuNC00LjEgNy4xLTYuNSAxNS40LTYuNSAyNC4yIDAgMTYuNyA4LjUgMzEuNSAyMS41IDQwLjEtNy45LS4yLTE1LjMtMi40LTIxLjgtNnYuNmMwIDIzLjQgMTYuNiA0Mi44IDM4LjcgNDcuMy00IDEuMS04LjMgMS43LTEyLjcgMS43LTMuMSAwLTYuMS0uMy05LjEtLjkgNi4xIDE5LjIgMjMuOSAzMy4xIDQ1IDMzLjUtMTYuNSAxMi45LTM3LjMgMjAuNi01OS45IDIwLjYtMy45IDAtNy43LS4yLTExLjUtLjcgMjEuMSAxMy44IDQ2LjUgMjEuOCA3My43IDIxLjgiIHN0eWxlPSJmaWxsOiNmZmYiLz48L3N2Zz4=)}.ck-media__wrapper[data-oembed-url*=\\\"twitter.com\\\"] .ck.ck-media__placeholder .ck-media__placeholder__url__text{color:#b8e6ff}.ck-media__wrapper[data-oembed-url*=\\\"twitter.com\\\"] .ck.ck-media__placeholder .ck-media__placeholder__url__text:hover{color:#fff}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaembedediting.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-media-embed/mediaembedediting.css\"],\"names\":[],\"mappings\":\"AAMC,0CAGC,kBAAmB,CAFnB,YAAa,CACb,qBAcD,CAXC,sEAEC,cAAe,CAEf,iBAMD,CAJC,wGAEC,aAAc,CADd,eAED,CAWD,6kBACC,YACD,CAYF,2LACC,mBACD,CC1CA,MACC,0CAA2C,CAE3C,mDAA4D,CAC5D,2EACD,CAEA,mBACC,aA+FD,CA7FC,0CAEC,0CAA2C,CAD3C,0CA6BD,CA1BC,uEAIC,uBAA2B,CAC3B,qBAAsB,CAHtB,kDAAmD,CACnD,qCAAsC,CAFtC,qDAUD,CAJC,gFAEC,WAAY,CADZ,UAED,CAGD,4EACC,sDAAuD,CAGvD,iBAAkB,CADlB,iBAAkB,CAElB,sBAAuB,CAHvB,kBAUD,CALC,kFACC,4DAA6D,CAC7D,cAAe,CACf,yBACD,CAIF,wDAEC,gBAAiB,CADjB,eAED,CAEA,4UAIC,wvGACD,CAEA,2EACC,kBAaD,CAXC,wGACC,orBACD,CAEA,6GACC,UAKD,CAHC,mHACC,UACD,CAIF,4EACC,2DAcD,CAZC,yGACC,4jHACD,CAGA,8GACC,aAKD,CAHC,oHACC,UACD,CAIF,6EAEC,iDAaD,CAXC,0GACC,wiCACD,CAEA,+GACC,aAKD,CAHC,qHACC,UACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck-media__wrapper {\\n\\t& .ck-media__placeholder {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-direction: column;\\n\\t\\talign-items: center;\\n\\n\\t\\t& .ck-media__placeholder__url {\\n\\t\\t\\t/* Otherwise the URL will overflow when the content is very narrow. */\\n\\t\\t\\tmax-width: 100%;\\n\\n\\t\\t\\tposition: relative;\\n\\n\\t\\t\\t& .ck-media__placeholder__url__text {\\n\\t\\t\\t\\toverflow: hidden;\\n\\t\\t\\t\\tdisplay: block;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t&[data-oembed-url*=\\\"twitter.com\\\"],\\n\\t&[data-oembed-url*=\\\"google.com/maps\\\"],\\n\\t&[data-oembed-url*=\\\"goo.gl/maps\\\"],\\n\\t&[data-oembed-url*=\\\"maps.google.com\\\"],\\n\\t&[data-oembed-url*=\\\"maps.app.goo.gl\\\"],\\n\\t&[data-oembed-url*=\\\"facebook.com\\\"],\\n\\t&[data-oembed-url*=\\\"instagram.com\\\"] {\\n\\t\\t& .ck-media__placeholder__icon * {\\n\\t\\t\\tdisplay: none;\\n\\t\\t}\\n\\t}\\n}\\n\\n/* Disable all mouse interaction as long as the editor is not read–only.\\n   https://github.com/ckeditor/ckeditor5-media-embed/issues/58 */\\n.ck-editor__editable:not(.ck-read-only) .ck-media__wrapper > *:not(.ck-media__placeholder) {\\n\\tpointer-events: none;\\n}\\n\\n/* Disable all mouse interaction when the widget is not selected (e.g. to avoid opening links by accident).\\n   https://github.com/ckeditor/ckeditor5-media-embed/issues/18 */\\n.ck-editor__editable:not(.ck-read-only) .ck-widget:not(.ck-widget_selected) .ck-media__placeholder {\\n\\tpointer-events: none;\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-media-embed-placeholder-icon-size: 3em;\\n\\n\\t--ck-color-media-embed-placeholder-url-text: hsl(0, 0%, 46%);\\n\\t--ck-color-media-embed-placeholder-url-text-hover: var(--ck-color-base-text);\\n}\\n\\n.ck-media__wrapper {\\n\\tmargin: 0 auto;\\n\\n\\t& .ck-media__placeholder {\\n\\t\\tpadding: calc( 3 * var(--ck-spacing-standard) );\\n\\t\\tbackground: var(--ck-color-base-foreground);\\n\\n\\t\\t& .ck-media__placeholder__icon {\\n\\t\\t\\tmin-width: var(--ck-media-embed-placeholder-icon-size);\\n\\t\\t\\theight: var(--ck-media-embed-placeholder-icon-size);\\n\\t\\t\\tmargin-bottom: var(--ck-spacing-large);\\n\\t\\t\\tbackground-position: center;\\n\\t\\t\\tbackground-size: cover;\\n\\n\\t\\t\\t& .ck-icon {\\n\\t\\t\\t\\twidth: 100%;\\n\\t\\t\\t\\theight: 100%;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t& .ck-media__placeholder__url__text {\\n\\t\\t\\tcolor: var(--ck-color-media-embed-placeholder-url-text);\\n\\t\\t\\twhite-space: nowrap;\\n\\t\\t\\ttext-align: center;\\n\\t\\t\\tfont-style: italic;\\n\\t\\t\\ttext-overflow: ellipsis;\\n\\n\\t\\t\\t&:hover {\\n\\t\\t\\t\\tcolor: var(--ck-color-media-embed-placeholder-url-text-hover);\\n\\t\\t\\t\\tcursor: pointer;\\n\\t\\t\\t\\ttext-decoration: underline;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t&[data-oembed-url*=\\\"open.spotify.com\\\"] {\\n\\t\\tmax-width: 300px;\\n\\t\\tmax-height: 380px;\\n\\t}\\n\\n\\t&[data-oembed-url*=\\\"google.com/maps\\\"] .ck-media__placeholder__icon,\\n\\t&[data-oembed-url*=\\\"goo.gl/maps\\\"] .ck-media__placeholder__icon,\\n\\t&[data-oembed-url*=\\\"maps.google.com\\\"] .ck-media__placeholder__icon,\\n\\t&[data-oembed-url*=\\\"maps.app.goo.gl\\\"] .ck-media__placeholder__icon {\\n\\t\\tbackground-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTAuMzc4IiBoZWlnaHQ9IjI1NC4xNjciIHZpZXdCb3g9IjAgMCA2Ni4yNDYgNjcuMjQ4Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjUzMSAtMjE4LjQ1NSkgc2NhbGUoLjk4MDEyKSI+PHJlY3Qgcnk9IjUuMjM4IiByeD0iNS4yMzgiIHk9IjIzMS4zOTkiIHg9IjE3Ni4wMzEiIGhlaWdodD0iNjAuMDk5IiB3aWR0aD0iNjAuMDk5IiBmaWxsPSIjMzRhNjY4IiBwYWludC1vcmRlcj0ibWFya2VycyBzdHJva2UgZmlsbCIvPjxwYXRoIGQ9Ik0yMDYuNDc3IDI2MC45bC0yOC45ODcgMjguOTg3YTUuMjE4IDUuMjE4IDAgMCAwIDMuNzggMS42MWg0OS42MjFjMS42OTQgMCAzLjE5LS43OTggNC4xNDYtMi4wMzd6IiBmaWxsPSIjNWM4OGM1Ii8+PHBhdGggZD0iTTIyNi43NDIgMjIyLjk4OGMtOS4yNjYgMC0xNi43NzcgNy4xNy0xNi43NzcgMTYuMDE0LjAwNyAyLjc2Mi42NjMgNS40NzQgMi4wOTMgNy44NzUuNDMuNzAzLjgzIDEuNDA4IDEuMTkgMi4xMDcuMzMzLjUwMi42NSAxLjAwNS45NSAxLjUwOC4zNDMuNDc3LjY3My45NTcuOTg4IDEuNDQgMS4zMSAxLjc2OSAyLjUgMy41MDIgMy42MzcgNS4xNjguNzkzIDEuMjc1IDEuNjgzIDIuNjQgMi40NjYgMy45OSAyLjM2MyA0LjA5NCA0LjAwNyA4LjA5MiA0LjYgMTMuOTE0di4wMTJjLjE4Mi40MTIuNTE2LjY2Ni44NzkuNjY3LjQwMy0uMDAxLjc2OC0uMzE0LjkzLS43OTkuNjAzLTUuNzU2IDIuMjM4LTkuNzI5IDQuNTg1LTEzLjc5NC43ODItMS4zNSAxLjY3My0yLjcxNSAyLjQ2NS0zLjk5IDEuMTM3LTEuNjY2IDIuMzI4LTMuNCAzLjYzOC01LjE2OS4zMTUtLjQ4Mi42NDUtLjk2Mi45ODgtMS40MzkuMy0uNTAzLjYxNy0xLjAwNi45NS0xLjUwOC4zNTktLjcuNzYtMS40MDQgMS4xOS0yLjEwNyAxLjQyNi0yLjQwMiAyLTUuMTE0IDIuMDA0LTcuODc1IDAtOC44NDQtNy41MTEtMTYuMDE0LTE2Ljc3Ni0xNi4wMTR6IiBmaWxsPSIjZGQ0YjNlIiBwYWludC1vcmRlcj0ibWFya2VycyBzdHJva2UgZmlsbCIvPjxlbGxpcHNlIHJ5PSI1LjU2NCIgcng9IjUuODI4IiBjeT0iMjM5LjAwMiIgY3g9IjIyNi43NDIiIGZpbGw9IiM4MDJkMjciIHBhaW50LW9yZGVyPSJtYXJrZXJzIHN0cm9rZSBmaWxsIi8+PHBhdGggZD0iTTE5MC4zMDEgMjM3LjI4M2MtNC42NyAwLTguNDU3IDMuODUzLTguNDU3IDguNjA2czMuNzg2IDguNjA3IDguNDU3IDguNjA3YzMuMDQzIDAgNC44MDYtLjk1OCA2LjMzNy0yLjUxNiAxLjUzLTEuNTU3IDIuMDg3LTMuOTEzIDIuMDg3LTYuMjkgMC0uMzYyLS4wMjMtLjcyMi0uMDY0LTEuMDc5aC04LjI1N3YzLjA0M2g0Ljg1Yy0uMTk3Ljc1OS0uNTMxIDEuNDUtMS4wNTggMS45ODYtLjk0Mi45NTgtMi4wMjggMS41NDgtMy45MDEgMS41NDgtMi44NzYgMC01LjIwOC0yLjM3Mi01LjIwOC01LjI5OSAwLTIuOTI2IDIuMzMyLTUuMjk5IDUuMjA4LTUuMjk5IDEuMzk5IDAgMi42MTguNDA3IDMuNTg0IDEuMjkzbDIuMzgxLTIuMzhjMC0uMDAyLS4wMDMtLjAwNC0uMDA0LS4wMDUtMS41ODgtMS41MjQtMy42Mi0yLjIxNS01Ljk1NS0yLjIxNXptNC40MyA1LjY2bC4wMDMuMDA2di0uMDAzeiIgZmlsbD0iI2ZmZiIgcGFpbnQtb3JkZXI9Im1hcmtlcnMgc3Ryb2tlIGZpbGwiLz48cGF0aCBkPSJNMjE1LjE4NCAyNTEuOTI5bC03Ljk4IDcuOTc5IDI4LjQ3NyAyOC40NzVjLjI4Ny0uNjQ5LjQ0OS0xLjM2Ni40NDktMi4xMjN2LTMxLjE2NWMtLjQ2OS42NzUtLjkzNCAxLjM0OS0xLjM4MiAyLjAwNS0uNzkyIDEuMjc1LTEuNjgyIDIuNjQtMi40NjUgMy45OS0yLjM0NyA0LjA2NS0zLjk4MiA4LjAzOC00LjU4NSAxMy43OTQtLjE2Mi40ODUtLjUyNy43OTgtLjkzLjc5OS0uMzYzLS4wMDEtLjY5Ny0uMjU1LS44NzktLjY2N3YtLjAxMmMtLjU5My01LjgyMi0yLjIzNy05LjgyLTQuNi0xMy45MTQtLjc4My0xLjM1LTEuNjczLTIuNzE1LTIuNDY2LTMuOTktMS4xMzctMS42NjYtMi4zMjctMy40LTMuNjM3LTUuMTY5bC0uMDAyLS4wMDN6IiBmaWxsPSIjYzNjM2MzIi8+PHBhdGggZD0iTTIxMi45ODMgMjQ4LjQ5NWwtMzYuOTUyIDM2Ljk1M3YuODEyYTUuMjI3IDUuMjI3IDAgMCAwIDUuMjM4IDUuMjM4aDEuMDE1bDM1LjY2Ni0zNS42NjZhMTM2LjI3NSAxMzYuMjc1IDAgMCAwLTIuNzY0LTMuOSAzNy41NzUgMzcuNTc1IDAgMCAwLS45ODktMS40NGMtLjI5OS0uNTAzLS42MTYtMS4wMDYtLjk1LTEuNTA4LS4wODMtLjE2Mi0uMTc2LS4zMjYtLjI2NC0uNDg5eiIgZmlsbD0iI2ZkZGM0ZiIgcGFpbnQtb3JkZXI9Im1hcmtlcnMgc3Ryb2tlIGZpbGwiLz48cGF0aCBkPSJNMjExLjk5OCAyNjEuMDgzbC02LjE1MiA2LjE1MSAyNC4yNjQgMjQuMjY0aC43ODFhNS4yMjcgNS4yMjcgMCAwIDAgNS4yMzktNS4yMzh2LTEuMDQ1eiIgZmlsbD0iI2ZmZiIgcGFpbnQtb3JkZXI9Im1hcmtlcnMgc3Ryb2tlIGZpbGwiLz48L2c+PC9zdmc+);\\n\\t}\\n\\n\\t&[data-oembed-url*=\\\"facebook.com\\\"] .ck-media__placeholder {\\n\\t\\tbackground: hsl(220, 46%, 48%);\\n\\n\\t\\t& .ck-media__placeholder__icon {\\n\\t\\t\\tbackground-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMDI0cHgiIGhlaWdodD0iMTAyNHB4IiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPiAgICAgICAgPHRpdGxlPkZpbGwgMTwvdGl0bGU+ICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPiAgICA8ZGVmcz48L2RlZnM+ICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImZMb2dvX1doaXRlIiBmaWxsPSIjRkZGRkZFIj4gICAgICAgICAgICA8cGF0aCBkPSJNOTY3LjQ4NCwwIEw1Ni41MTcsMCBDMjUuMzA0LDAgMCwyNS4zMDQgMCw1Ni41MTcgTDAsOTY3LjQ4MyBDMCw5OTguNjk0IDI1LjI5NywxMDI0IDU2LjUyMiwxMDI0IEw1NDcsMTAyNCBMNTQ3LDYyOCBMNDE0LDYyOCBMNDE0LDQ3MyBMNTQ3LDQ3MyBMNTQ3LDM1OS4wMjkgQzU0NywyMjYuNzY3IDYyNy43NzMsMTU0Ljc0NyA3NDUuNzU2LDE1NC43NDcgQzgwMi4yNjksMTU0Ljc0NyA4NTAuODQyLDE1OC45NTUgODY1LDE2MC44MzYgTDg2NSwyOTkgTDc4My4zODQsMjk5LjAzNyBDNzE5LjM5MSwyOTkuMDM3IDcwNywzMjkuNTI5IDcwNywzNzQuMjczIEw3MDcsNDczIEw4NjAuNDg3LDQ3MyBMODQwLjUwMSw2MjggTDcwNyw2MjggTDcwNywxMDI0IEw5NjcuNDg0LDEwMjQgQzk5OC42OTcsMTAyNCAxMDI0LDk5OC42OTcgMTAyNCw5NjcuNDg0IEwxMDI0LDU2LjUxNSBDMTAyNCwyNS4zMDMgOTk4LjY5NywwIDk2Ny40ODQsMCIgaWQ9IkZpbGwtMSI+PC9wYXRoPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+);\\n\\t\\t}\\n\\n\\t\\t& .ck-media__placeholder__url__text {\\n\\t\\t\\tcolor: hsl(220, 100%, 90%);\\n\\n\\t\\t\\t&:hover {\\n\\t\\t\\t\\tcolor: hsl(0, 0%, 100%);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t&[data-oembed-url*=\\\"instagram.com\\\"] .ck-media__placeholder {\\n\\t\\tbackground: linear-gradient(-135deg,hsl(246, 100%, 39%),hsl(302, 100%, 36%),hsl(0, 100%, 48%));\\n\\n\\t\\t& .ck-media__placeholder__icon {\\n\\t\\t\\tbackground-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSI1MDRweCIgaGVpZ2h0PSI1MDRweCIgdmlld0JveD0iMCAwIDUwNCA1MDQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+ICAgICAgICA8dGl0bGU+Z2x5cGgtbG9nb19NYXkyMDE2PC90aXRsZT4gICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+ICAgIDxkZWZzPiAgICAgICAgPHBvbHlnb24gaWQ9InBhdGgtMSIgcG9pbnRzPSIwIDAuMTU5IDUwMy44NDEgMC4xNTkgNTAzLjg0MSA1MDMuOTQgMCA1MDMuOTQiPjwvcG9seWdvbj4gICAgPC9kZWZzPiAgICA8ZyBpZD0iZ2x5cGgtbG9nb19NYXkyMDE2IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4gICAgICAgIDxnIGlkPSJHcm91cC0zIj4gICAgICAgICAgICA8bWFzayBpZD0ibWFzay0yIiBmaWxsPSJ3aGl0ZSI+ICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3BhdGgtMSI+PC91c2U+ICAgICAgICAgICAgPC9tYXNrPiAgICAgICAgICAgIDxnIGlkPSJDbGlwLTIiPjwvZz4gICAgICAgICAgICA8cGF0aCBkPSJNMjUxLjkyMSwwLjE1OSBDMTgzLjUwMywwLjE1OSAxNzQuOTI0LDAuNDQ5IDE0OC4wNTQsMS42NzUgQzEyMS4yNCwyLjg5OCAxMDIuOTI3LDcuMTU3IDg2LjkwMywxMy4zODUgQzcwLjMzNywxOS44MjIgNTYuMjg4LDI4LjQzNiA0Mi4yODIsNDIuNDQxIEMyOC4yNzcsNTYuNDQ3IDE5LjY2Myw3MC40OTYgMTMuMjI2LDg3LjA2MiBDNi45OTgsMTAzLjA4NiAyLjczOSwxMjEuMzk5IDEuNTE2LDE0OC4yMTMgQzAuMjksMTc1LjA4MyAwLDE4My42NjIgMCwyNTIuMDggQzAsMzIwLjQ5NyAwLjI5LDMyOS4wNzYgMS41MTYsMzU1Ljk0NiBDMi43MzksMzgyLjc2IDYuOTk4LDQwMS4wNzMgMTMuMjI2LDQxNy4wOTcgQzE5LjY2Myw0MzMuNjYzIDI4LjI3Nyw0NDcuNzEyIDQyLjI4Miw0NjEuNzE4IEM1Ni4yODgsNDc1LjcyMyA3MC4zMzcsNDg0LjMzNyA4Ni45MDMsNDkwLjc3NSBDMTAyLjkyNyw0OTcuMDAyIDEyMS4yNCw1MDEuMjYxIDE0OC4wNTQsNTAyLjQ4NCBDMTc0LjkyNCw1MDMuNzEgMTgzLjUwMyw1MDQgMjUxLjkyMSw1MDQgQzMyMC4zMzgsNTA0IDMyOC45MTcsNTAzLjcxIDM1NS43ODcsNTAyLjQ4NCBDMzgyLjYwMSw1MDEuMjYxIDQwMC45MTQsNDk3LjAwMiA0MTYuOTM4LDQ5MC43NzUgQzQzMy41MDQsNDg0LjMzNyA0NDcuNTUzLDQ3NS43MjMgNDYxLjU1OSw0NjEuNzE4IEM0NzUuNTY0LDQ0Ny43MTIgNDg0LjE3OCw0MzMuNjYzIDQ5MC42MTYsNDE3LjA5NyBDNDk2Ljg0Myw0MDEuMDczIDUwMS4xMDIsMzgyLjc2IDUwMi4zMjUsMzU1Ljk0NiBDNTAzLjU1MSwzMjkuMDc2IDUwMy44NDEsMzIwLjQ5NyA1MDMuODQxLDI1Mi4wOCBDNTAzLjg0MSwxODMuNjYyIDUwMy41NTEsMTc1LjA4MyA1MDIuMzI1LDE0OC4yMTMgQzUwMS4xMDIsMTIxLjM5OSA0OTYuODQzLDEwMy4wODYgNDkwLjYxNiw4Ny4wNjIgQzQ4NC4xNzgsNzAuNDk2IDQ3NS41NjQsNTYuNDQ3IDQ2MS41NTksNDIuNDQxIEM0NDcuNTUzLDI4LjQzNiA0MzMuNTA0LDE5LjgyMiA0MTYuOTM4LDEzLjM4NSBDNDAwLjkxNCw3LjE1NyAzODIuNjAxLDIuODk4IDM1NS43ODcsMS42NzUgQzMyOC45MTcsMC40NDkgMzIwLjMzOCwwLjE1OSAyNTEuOTIxLDAuMTU5IFogTTI1MS45MjEsNDUuNTUgQzMxOS4xODYsNDUuNTUgMzI3LjE1NCw0NS44MDcgMzUzLjcxOCw0Ny4wMTkgQzM3OC4yOCw0OC4xMzkgMzkxLjYxOSw1Mi4yNDMgNDAwLjQ5Niw1NS42OTMgQzQxMi4yNTUsNjAuMjYzIDQyMC42NDcsNjUuNzIyIDQyOS40NjIsNzQuNTM4IEM0MzguMjc4LDgzLjM1MyA0NDMuNzM3LDkxLjc0NSA0NDguMzA3LDEwMy41MDQgQzQ1MS43NTcsMTEyLjM4MSA0NTUuODYxLDEyNS43MiA0NTYuOTgxLDE1MC4yODIgQzQ1OC4xOTMsMTc2Ljg0NiA0NTguNDUsMTg0LjgxNCA0NTguNDUsMjUyLjA4IEM0NTguNDUsMzE5LjM0NSA0NTguMTkzLDMyNy4zMTMgNDU2Ljk4MSwzNTMuODc3IEM0NTUuODYxLDM3OC40MzkgNDUxLjc1NywzOTEuNzc4IDQ0OC4zMDcsNDAwLjY1NSBDNDQzLjczNyw0MTIuNDE0IDQzOC4yNzgsNDIwLjgwNiA0MjkuNDYyLDQyOS42MjEgQzQyMC42NDcsNDM4LjQzNyA0MTIuMjU1LDQ0My44OTYgNDAwLjQ5Niw0NDguNDY2IEMzOTEuNjE5LDQ1MS45MTYgMzc4LjI4LDQ1Ni4wMiAzNTMuNzE4LDQ1Ny4xNCBDMzI3LjE1OCw0NTguMzUyIDMxOS4xOTEsNDU4LjYwOSAyNTEuOTIxLDQ1OC42MDkgQzE4NC42NSw0NTguNjA5IDE3Ni42ODQsNDU4LjM1MiAxNTAuMTIzLDQ1Ny4xNCBDMTI1LjU2MSw0NTYuMDIgMTEyLjIyMiw0NTEuOTE2IDEwMy4zNDUsNDQ4LjQ2NiBDOTEuNTg2LDQ0My44OTYgODMuMTk0LDQzOC40MzcgNzQuMzc5LDQyOS42MjEgQzY1LjU2NCw0MjAuODA2IDYwLjEwNCw0MTIuNDE0IDU1LjUzNCw0MDAuNjU1IEM1Mi4wODQsMzkxLjc3OCA0Ny45OCwzNzguNDM5IDQ2Ljg2LDM1My44NzcgQzQ1LjY0OCwzMjcuMzEzIDQ1LjM5MSwzMTkuMzQ1IDQ1LjM5MSwyNTIuMDggQzQ1LjM5MSwxODQuODE0IDQ1LjY0OCwxNzYuODQ2IDQ2Ljg2LDE1MC4yODIgQzQ3Ljk4LDEyNS43MiA1Mi4wODQsMTEyLjM4MSA1NS41MzQsMTAzLjUwNCBDNjAuMTA0LDkxLjc0NSA2NS41NjMsODMuMzUzIDc0LjM3OSw3NC41MzggQzgzLjE5NCw2NS43MjIgOTEuNTg2LDYwLjI2MyAxMDMuMzQ1LDU1LjY5MyBDMTEyLjIyMiw1Mi4yNDMgMTI1LjU2MSw0OC4xMzkgMTUwLjEyMyw0Ny4wMTkgQzE3Ni42ODcsNDUuODA3IDE4NC42NTUsNDUuNTUgMjUxLjkyMSw0NS41NSBaIiBpZD0iRmlsbC0xIiBmaWxsPSIjRkZGRkZGIiBtYXNrPSJ1cmwoI21hc2stMikiPjwvcGF0aD4gICAgICAgIDwvZz4gICAgICAgIDxwYXRoIGQ9Ik0yNTEuOTIxLDMzNi4wNTMgQzIwNS41NDMsMzM2LjA1MyAxNjcuOTQ3LDI5OC40NTcgMTY3Ljk0NywyNTIuMDggQzE2Ny45NDcsMjA1LjcwMiAyMDUuNTQzLDE2OC4xMDYgMjUxLjkyMSwxNjguMTA2IEMyOTguMjk4LDE2OC4xMDYgMzM1Ljg5NCwyMDUuNzAyIDMzNS44OTQsMjUyLjA4IEMzMzUuODk0LDI5OC40NTcgMjk4LjI5OCwzMzYuMDUzIDI1MS45MjEsMzM2LjA1MyBaIE0yNTEuOTIxLDEyMi43MTUgQzE4MC40NzQsMTIyLjcxNSAxMjIuNTU2LDE4MC42MzMgMTIyLjU1NiwyNTIuMDggQzEyMi41NTYsMzIzLjUyNiAxODAuNDc0LDM4MS40NDQgMjUxLjkyMSwzODEuNDQ0IEMzMjMuMzY3LDM4MS40NDQgMzgxLjI4NSwzMjMuNTI2IDM4MS4yODUsMjUyLjA4IEMzODEuMjg1LDE4MC42MzMgMzIzLjM2NywxMjIuNzE1IDI1MS45MjEsMTIyLjcxNSBaIiBpZD0iRmlsbC00IiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+ICAgICAgICA8cGF0aCBkPSJNNDE2LjYyNywxMTcuNjA0IEM0MTYuNjI3LDEzNC4zIDQwMy4wOTIsMTQ3LjgzNCAzODYuMzk2LDE0Ny44MzQgQzM2OS43MDEsMTQ3LjgzNCAzNTYuMTY2LDEzNC4zIDM1Ni4xNjYsMTE3LjYwNCBDMzU2LjE2NiwxMDAuOTA4IDM2OS43MDEsODcuMzczIDM4Ni4zOTYsODcuMzczIEM0MDMuMDkyLDg3LjM3MyA0MTYuNjI3LDEwMC45MDggNDE2LjYyNywxMTcuNjA0IiBpZD0iRmlsbC01IiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+ICAgIDwvZz48L3N2Zz4=);\\n\\t\\t}\\n\\n\\t\\t/* stylelint-disable-next-line no-descending-specificity */\\n\\t\\t& .ck-media__placeholder__url__text {\\n\\t\\t\\tcolor: hsl(302, 100%, 94%);\\n\\n\\t\\t\\t&:hover {\\n\\t\\t\\t\\tcolor: hsl(0, 0%, 100%);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t&[data-oembed-url*=\\\"twitter.com\\\"] .ck.ck-media__placeholder {\\n\\t\\t/* Use gradient to contrast with focused widget (ckeditor/ckeditor5-media-embed#22). */\\n\\t\\tbackground: linear-gradient( to right, hsl(201, 85%, 70%), hsl(201, 85%, 35%) );\\n\\n\\t\\t& .ck-media__placeholder__icon {\\n\\t\\t\\tbackground-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgaWQ9IldoaXRlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDQwMCA0MDAiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQwMCA0MDA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5zdDB7ZmlsbDojRkZGRkZGO308L3N0eWxlPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik00MDAsMjAwYzAsMTEwLjUtODkuNSwyMDAtMjAwLDIwMFMwLDMxMC41LDAsMjAwUzg5LjUsMCwyMDAsMFM0MDAsODkuNSw0MDAsMjAweiBNMTYzLjQsMzA1LjVjODguNywwLDEzNy4yLTczLjUsMTM3LjItMTM3LjJjMC0yLjEsMC00LjItMC4xLTYuMmM5LjQtNi44LDE3LjYtMTUuMywyNC4xLTI1Yy04LjYsMy44LTE3LjksNi40LTI3LjcsNy42YzEwLTYsMTcuNi0xNS40LDIxLjItMjYuN2MtOS4zLDUuNS0xOS42LDkuNS0zMC42LDExLjdjLTguOC05LjQtMjEuMy0xNS4yLTM1LjItMTUuMmMtMjYuNiwwLTQ4LjIsMjEuNi00OC4yLDQ4LjJjMCwzLjgsMC40LDcuNSwxLjMsMTFjLTQwLjEtMi03NS42LTIxLjItOTkuNC01MC40Yy00LjEsNy4xLTYuNSwxNS40LTYuNSwyNC4yYzAsMTYuNyw4LjUsMzEuNSwyMS41LDQwLjFjLTcuOS0wLjItMTUuMy0yLjQtMjEuOC02YzAsMC4yLDAsMC40LDAsMC42YzAsMjMuNCwxNi42LDQyLjgsMzguNyw0Ny4zYy00LDEuMS04LjMsMS43LTEyLjcsMS43Yy0zLjEsMC02LjEtMC4zLTkuMS0wLjljNi4xLDE5LjIsMjMuOSwzMy4xLDQ1LDMzLjVjLTE2LjUsMTIuOS0zNy4zLDIwLjYtNTkuOSwyMC42Yy0zLjksMC03LjctMC4yLTExLjUtMC43QzExMC44LDI5Ny41LDEzNi4yLDMwNS41LDE2My40LDMwNS41Ii8+PC9zdmc+);\\n\\t\\t}\\n\\n\\t\\t& .ck-media__placeholder__url__text {\\n\\t\\t\\tcolor: hsl(201, 100%, 86%);\\n\\n\\t\\t\\t&:hover {\\n\\t\\t\\t\\tcolor: hsl(0, 0%, 100%);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-media-form{align-items:flex-start;display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-media-form .ck-labeled-field-view{display:inline-block}.ck.ck-media-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-media-form{flex-wrap:wrap}.ck.ck-media-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-media-form .ck-button{flex-basis:50%}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaform.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css\"],\"names\":[],\"mappings\":\"AAOA,kBAEC,sBAAuB,CADvB,YAAa,CAEb,kBAAmB,CACnB,gBAqBD,CAnBC,yCACC,oBACD,CAEA,4BACC,YACD,CCbA,oCDCD,kBAeE,cAUF,CARE,yCACC,eACD,CAEA,6BACC,cACD,CCtBD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css\\\";\\n\\n.ck.ck-media-form {\\n\\tdisplay: flex;\\n\\talign-items: flex-start;\\n\\tflex-direction: row;\\n\\tflex-wrap: nowrap;\\n\\n\\t& .ck-labeled-field-view {\\n\\t\\tdisplay: inline-block;\\n\\t}\\n\\n\\t& .ck-label {\\n\\t\\tdisplay: none;\\n\\t}\\n\\n\\t@mixin ck-media-phone {\\n\\t\\tflex-wrap: wrap;\\n\\n\\t\\t& .ck-labeled-field-view {\\n\\t\\t\\tflex-basis: 100%;\\n\\t\\t}\\n\\n\\t\\t& .ck-button {\\n\\t\\t\\tflex-basis: 50%;\\n\\t\\t}\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@define-mixin ck-media-phone {\\n\\t@media screen and (max-width: 600px) {\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root{--ck-color-mention-background:rgba(153,0,48,.1);--ck-color-mention-text:#990030}.ck-content .mention{background:var(--ck-color-mention-background);color:var(--ck-color-mention-text)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-mention/mention.css\"],\"names\":[],\"mappings\":\"AAKA,MACC,+CAAwD,CACxD,+BACD,CAEA,qBACC,6CAA8C,CAC9C,kCACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-color-mention-background: hsla(341, 100%, 30%, 0.1);\\n\\t--ck-color-mention-text: hsl(341, 100%, 30%);\\n}\\n\\n.ck-content .mention {\\n\\tbackground: var(--ck-color-mention-background);\\n\\tcolor: var(--ck-color-mention-text);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root{--ck-mention-list-max-height:300px}.ck.ck-mentions{max-height:var(--ck-mention-list-max-height);overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.ck.ck-mentions>.ck-list__item{flex-shrink:0;overflow:hidden}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-mention/theme/mentionui.css\"],\"names\":[],\"mappings\":\"AAKA,MACC,kCACD,CAEA,gBACC,4CAA6C,CAM7C,iBAAkB,CAJlB,eAAgB,CAMhB,2BAQD,CAJC,+BAEC,aAAc,CADd,eAED\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-mention-list-max-height: 300px;\\n}\\n\\n.ck.ck-mentions {\\n\\tmax-height: var(--ck-mention-list-max-height);\\n\\n\\toverflow-y: auto;\\n\\n\\t/* Prevent unnecessary horizontal scrollbar in Safari\\n\\thttps://github.com/ckeditor/ckeditor5-mention/issues/41 */\\n\\toverflow-x: hidden;\\n\\n\\toverscroll-behavior: contain;\\n\\n\\t/* Prevent unnecessary vertical scrollbar in Safari\\n\\thttps://github.com/ckeditor/ckeditor5-mention/issues/41 */\\n\\t& > .ck-list__item {\\n\\t\\toverflow: hidden;\\n\\t\\tflex-shrink: 0;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck-content .page-break{align-items:center;clear:both;display:flex;justify-content:center;padding:5px 0;position:relative}.ck-content .page-break:after{border-bottom:2px dashed #c4c4c4;content:\\\"\\\";position:absolute;width:100%}.ck-content .page-break__label{background:#fff;border:1px solid #c4c4c4;border-radius:2px;box-shadow:2px 2px 1px rgba(0,0,0,.15);color:#333;display:block;font-family:Helvetica,Arial,Tahoma,Verdana,Sans-Serif;font-size:.75em;font-weight:700;padding:.3em .6em;position:relative;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:1}@media print{.ck-content .page-break{padding:0}.ck-content .page-break:after{display:none}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-page-break/theme/pagebreak.css\"],\"names\":[],\"mappings\":\"AAKA,wBAKC,kBAAmB,CAHnB,UAAW,CAEX,YAAa,CAEb,sBAAuB,CAHvB,aAAc,CAFd,iBAaD,CANC,8BAGC,gCAAyC,CAFzC,UAAW,CACX,iBAAkB,CAElB,UACD,CAGD,+BAYC,eAA4B,CAN5B,wBAAiC,CACjC,iBAAkB,CAMlB,sCAA6C,CAF7C,UAAsB,CAPtB,aAAc,CAId,qDAA0D,CAC1D,eAAiB,CACjB,eAAiB,CAPjB,iBAAkB,CAFlB,iBAAkB,CAIlB,wBAAyB,CAWzB,wBAAyB,CACzB,qBAAsB,CACtB,oBAAqB,CACrB,gBAAiB,CAjBjB,SAkBD,CAGA,aACC,wBACC,SAKD,CAHC,8BACC,YACD,CAEF\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck-content .page-break {\\n\\tposition: relative;\\n\\tclear: both;\\n\\tpadding: 5px 0;\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n\\n\\t&::after {\\n\\t\\tcontent: '';\\n\\t\\tposition: absolute;\\n\\t\\tborder-bottom: 2px dashed hsl(0, 0%, 77%);\\n\\t\\twidth: 100%;\\n\\t}\\n}\\n\\n.ck-content .page-break__label {\\n\\tposition: relative;\\n\\tz-index: 1;\\n\\tpadding: .3em .6em;\\n\\tdisplay: block;\\n\\ttext-transform: uppercase;\\n\\tborder: 1px solid hsl(0, 0%, 77%);\\n\\tborder-radius: 2px;\\n\\tfont-family: Helvetica, Arial, Tahoma, Verdana, Sans-Serif;\\n\\tfont-size: 0.75em;\\n\\tfont-weight: bold;\\n\\tcolor: hsl(0, 0%, 20%);\\n\\tbackground: hsl(0, 0%, 100%);\\n\\tbox-shadow: 2px 2px 1px hsla(0, 0%, 0%, 0.15);\\n\\n\\t/* Disable the possibility to select the label text by the user. */\\n\\t-webkit-user-select: none;\\n\\t-moz-user-select: none;\\n\\t-ms-user-select: none;\\n\\tuser-select: none;\\n}\\n\\n/* Do not show the page break element inside the print preview window. */\\n@media print {\\n\\t.ck-content .page-break {\\n\\t\\tpadding: 0;\\n\\n\\t\\t&::after {\\n\\t\\t\\tdisplay: none;\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root{--ck-color-restricted-editing-exception-background:rgba(255,169,77,.2);--ck-color-restricted-editing-exception-hover-background:rgba(255,169,77,.35);--ck-color-restricted-editing-exception-brackets:rgba(204,105,0,.4);--ck-color-restricted-editing-selected-exception-background:rgba(255,169,77,.5);--ck-color-restricted-editing-selected-exception-brackets:rgba(204,105,0,.6)}.ck-editor__editable .restricted-editing-exception{background-color:var(--ck-color-restricted-editing-exception-background);border:1px solid;border-image:linear-gradient(to right,var(--ck-color-restricted-editing-exception-brackets) 0,var(--ck-color-restricted-editing-exception-brackets) 5px,transparent 6px,transparent calc(100% - 6px),var(--ck-color-restricted-editing-exception-brackets) calc(100% - 5px),var(--ck-color-restricted-editing-exception-brackets) 100%) 1;transition:background .2s ease-in-out}.ck-editor__editable .restricted-editing-exception.restricted-editing-exception_selected{background-color:var(--ck-color-restricted-editing-selected-exception-background);border-image:linear-gradient(to right,var(--ck-color-restricted-editing-selected-exception-brackets) 0,var(--ck-color-restricted-editing-selected-exception-brackets) 5px,var(--ck-color-restricted-editing-selected-exception-brackets) calc(100% - 5px),var(--ck-color-restricted-editing-selected-exception-brackets) 100%) 1}.ck-editor__editable .restricted-editing-exception.restricted-editing-exception_collapsed{padding-left:1ch}.ck-restricted-editing_mode_restricted,.ck-restricted-editing_mode_restricted *{cursor:default}.ck-restricted-editing_mode_restricted .restricted-editing-exception,.ck-restricted-editing_mode_restricted .restricted-editing-exception *{cursor:text}.ck-restricted-editing_mode_restricted .restricted-editing-exception:hover{background:var(--ck-color-restricted-editing-exception-hover-background)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-restricted-editing/restrictedediting.css\"],\"names\":[],\"mappings\":\"AAKA,MACC,sEAA2E,CAC3E,6EAAkF,CAClF,mEAAyE,CACzE,+EAAoF,CACpF,4EACD,CAEA,mDAEC,wEAAyE,CACzE,gBAAiB,CACjB,yUAQG,CAXH,qCA4BD,CAfC,yFACC,iFAAkF,CAClF,gUAOD,CAEA,0FAEC,gBACD,CAQA,gFACC,cACD,CAKC,4IACC,WACD,CAEA,2EACC,wEACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-color-restricted-editing-exception-background: hsla(31, 100%, 65%, .2);\\n\\t--ck-color-restricted-editing-exception-hover-background: hsla(31, 100%, 65%, .35);\\n\\t--ck-color-restricted-editing-exception-brackets: hsla(31, 100%, 40%, .4);\\n\\t--ck-color-restricted-editing-selected-exception-background: hsla(31, 100%, 65%, .5);\\n\\t--ck-color-restricted-editing-selected-exception-brackets: hsla(31, 100%, 40%, .6);\\n}\\n\\n.ck-editor__editable .restricted-editing-exception {\\n\\ttransition: .2s ease-in-out background;\\n\\tbackground-color: var(--ck-color-restricted-editing-exception-background);\\n\\tborder: 1px solid;\\n\\tborder-image: linear-gradient(\\n\\t\\tto right,\\n\\t\\tvar(--ck-color-restricted-editing-exception-brackets) 0%,\\n\\t\\tvar(--ck-color-restricted-editing-exception-brackets) 5px,\\n\\t\\thsla(0, 0%, 0%, 0) 6px,\\n\\t\\thsla(0, 0%, 0%, 0) calc(100% - 6px),\\n\\t\\tvar(--ck-color-restricted-editing-exception-brackets) calc(100% - 5px),\\n\\t\\tvar(--ck-color-restricted-editing-exception-brackets) 100%\\n\\t) 1;\\n\\n\\t&.restricted-editing-exception_selected {\\n\\t\\tbackground-color: var(--ck-color-restricted-editing-selected-exception-background);\\n\\t\\tborder-image: linear-gradient(\\n\\t\\t\\tto right,\\n\\t\\t\\tvar(--ck-color-restricted-editing-selected-exception-brackets) 0%,\\n\\t\\t\\tvar(--ck-color-restricted-editing-selected-exception-brackets) 5px,\\n\\t\\t\\tvar(--ck-color-restricted-editing-selected-exception-brackets) calc(100% - 5px),\\n\\t\\t\\tvar(--ck-color-restricted-editing-selected-exception-brackets) 100%\\n\\t\\t) 1;\\n\\t}\\n\\n\\t&.restricted-editing-exception_collapsed {\\n\\t\\t/* Empty exception should have the same width as exception with at least 1 char */\\n\\t\\tpadding-left: 1ch;\\n\\t}\\n}\\n\\n.ck-restricted-editing_mode_restricted {\\n\\tcursor: default;\\n\\n\\t/* We also have to override all elements inside the restricted editable to prevent cursor switching between default and text\\n\\tduring the pointer movement. */\\n\\t& * {\\n\\t\\tcursor: default;\\n\\t}\\n\\n\\t& .restricted-editing-exception {\\n\\t\\tcursor: text;\\n\\n\\t\\t& * {\\n\\t\\t\\tcursor: text;\\n\\t\\t}\\n\\n\\t\\t&:hover {\\n\\t\\t\\tbackground: var(--ck-color-restricted-editing-exception-hover-background);\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck-source-editing-area{overflow:hidden;position:relative}.ck-source-editing-area textarea,.ck-source-editing-area:after{border:1px solid transparent;font-family:monospace;font-size:var(--ck-font-size-normal);line-height:var(--ck-line-height-base);margin:0;padding:var(--ck-spacing-large);white-space:pre-wrap}.ck-source-editing-area:after{content:attr(data-value) \\\" \\\";display:block;visibility:hidden}.ck-source-editing-area textarea{border-color:var(--ck-color-base-border);border-radius:0;box-sizing:border-box;height:100%;outline:none;overflow:hidden;position:absolute;resize:none;width:100%}.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{border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow),0 0;outline:none}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-source-editing/theme/sourceediting.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_focus.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css\"],\"names\":[],\"mappings\":\"AASA,wBAEC,eAAgB,CADhB,iBAED,CAEA,+DAIC,4BAA6B,CAG7B,qBAAsB,CADtB,oCAAqC,CADrC,sCAAuC,CAFvC,QAAS,CADT,+BAAgC,CAMhC,oBACD,CAEA,8BACC,4BAA6B,CAE7B,aAAc,CADd,iBAED,CAEA,iCASC,wCAAyC,CC7BzC,eAAgB,CD2BhB,qBAAsB,CAJtB,WAAY,CAEZ,YAAa,CACb,eAAgB,CALhB,iBAAkB,CAGlB,WAAY,CAFZ,UAkBD,CApBA,yGChBE,qCAAsC,CD4BtC,wBAAyB,CACzB,yBAOF,CAJC,uDEpCA,2BAA2B,CCF3B,qCAA8B,CDC9B,YFwCA\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css\\\";\\n@import \\\"@ckeditor/ckeditor5-theme-lark/theme/mixins/_focus.css\\\";\\n@import \\\"@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css\\\";\\n\\n.ck-source-editing-area {\\n\\tposition: relative;\\n\\toverflow: hidden;\\n}\\n\\n.ck-source-editing-area::after,\\n.ck-source-editing-area textarea {\\n\\tpadding: var(--ck-spacing-large);\\n\\tmargin: 0;\\n\\tborder: 1px solid transparent;\\n\\tline-height: var(--ck-line-height-base);\\n\\tfont-size: var(--ck-font-size-normal);\\n\\tfont-family: monospace;\\n\\twhite-space: pre-wrap;\\n}\\n\\n.ck-source-editing-area::after {\\n\\tcontent: attr(data-value) \\\" \\\";\\n\\tvisibility: hidden;\\n\\tdisplay: block;\\n}\\n\\n.ck-source-editing-area textarea {\\n\\tposition: absolute;\\n\\twidth: 100%;\\n\\theight: 100%;\\n\\tresize: none;\\n\\toutline: none;\\n\\toverflow: hidden;\\n\\tbox-sizing: border-box;\\n\\n\\tborder-color: var(--ck-color-base-border);\\n\\n\\t@mixin ck-rounded-corners {\\n\\t\\tborder-top-left-radius: 0;\\n\\t\\tborder-top-right-radius: 0;\\n\\t}\\n\\n\\t&:not([readonly]):focus {\\n\\t\\t@mixin ck-focus-ring;\\n\\t\\t@mixin ck-box-shadow var(--ck-inner-shadow);\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * Implements rounded corner interface for .ck-rounded-corners class.\\n *\\n * @see $ck-border-radius\\n */\\n@define-mixin ck-rounded-corners {\\n\\tborder-radius: 0;\\n\\n\\t@nest .ck-rounded-corners &,\\n\\t&.ck-rounded-corners {\\n\\t\\tborder-radius: var(--ck-border-radius);\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * A visual style of focused element's border.\\n */\\n@define-mixin ck-focus-ring {\\n\\t/* Disable native outline. */\\n\\toutline: none;\\n\\tborder: var(--ck-focus-ring)\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * A helper to combine multiple shadows.\\n */\\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\\n\\tbox-shadow: $shadowA, $shadowB;\\n}\\n\\n/**\\n * Gives an element a drop shadow so it looks like a floating panel.\\n */\\n@define-mixin ck-drop-shadow {\\n\\t@mixin ck-box-shadow var(--ck-drop-shadow);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-character-grid{max-width:100%}.ck.ck-character-grid .ck-character-grid__tiles{display:grid}:root{--ck-character-grid-tile-size:24px}.ck.ck-character-grid{max-height:200px;overflow-x:hidden;overflow-y:auto;width:350px}@media screen and (max-width:600px){.ck.ck-character-grid{width:190px}}.ck.ck-character-grid .ck-character-grid__tiles{grid-gap:var(--ck-spacing-standard);grid-template-columns:repeat(10,1fr);margin:var(--ck-spacing-standard) var(--ck-spacing-large)}@media screen and (max-width:600px){.ck.ck-character-grid .ck-character-grid__tiles{grid-template-columns:repeat(5,1fr)}}.ck.ck-character-grid .ck-character-grid__tile{border:0;font-size:1.2em;height:var(--ck-character-grid-tile-size);min-height:var(--ck-character-grid-tile-size);min-width:var(--ck-character-grid-tile-size);padding:0;transition:box-shadow .2s ease;width:var(--ck-character-grid-tile-size)}.ck.ck-character-grid .ck-character-grid__tile:focus:not(.ck-disabled),.ck.ck-character-grid .ck-character-grid__tile:hover:not(.ck-disabled){border:0;box-shadow:inset 0 0 0 1px var(--ck-color-base-background),0 0 0 2px var(--ck-color-focus-border)}.ck.ck-character-grid .ck-character-grid__tile .ck-button__label{line-height:var(--ck-character-grid-tile-size);text-align:center;width:100%}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-special-characters/theme/charactergrid.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-special-characters/charactergrid.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css\"],\"names\":[],\"mappings\":\"AAKA,sBACC,cAKD,CAHC,gDACC,YACD,CCFD,MACC,kCACD,CAEA,sBAIC,gBAAiB,CAFjB,iBAAkB,CADlB,eAAgB,CAEhB,WAyCD,CClDC,oCDMD,sBAOE,WAqCF,CChDC,CDcA,gDAGC,mCAAoC,CAFpC,oCAAsC,CACtC,yDAMD,CCxBA,oCDgBA,gDAME,mCAEF,CCtBA,CDwBA,+CAQC,QAAS,CAHT,eAAgB,CAHhB,yCAA0C,CAE1C,6CAA8C,CAD9C,4CAA6C,CAG7C,SAAU,CACV,8BAA+B,CAN/B,wCAsBD,CAbC,8IAGC,QAAS,CACT,iGACD,CAGA,iEACC,8CAA+C,CAE/C,iBAAkB,CADlB,UAED\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-character-grid {\\n\\tmax-width: 100%;\\n\\t\\n\\t& .ck-character-grid__tiles {\\n\\t\\tdisplay: grid;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css\\\";\\n@import \\\"../mixins/_rounded.css\\\";\\n\\n:root {\\n\\t--ck-character-grid-tile-size: 24px;\\n}\\n\\n.ck.ck-character-grid {\\n\\toverflow-y: auto;\\n\\toverflow-x: hidden;\\n\\twidth: 350px;\\n\\tmax-height: 200px;\\n\\n\\t@mixin ck-media-phone {\\n\\t\\twidth: 190px;\\n\\t}\\n\\n\\t& .ck-character-grid__tiles {\\n\\t\\tgrid-template-columns: repeat(10, 1fr);\\n\\t\\tmargin: var(--ck-spacing-standard) var(--ck-spacing-large);\\n\\t\\tgrid-gap: var(--ck-spacing-standard);\\n\\n\\t\\t@mixin ck-media-phone {\\n\\t\\t\\tgrid-template-columns: repeat(5, 1fr);\\n\\t\\t}\\n\\t}\\n\\n\\t& .ck-character-grid__tile {\\n\\t\\twidth: var(--ck-character-grid-tile-size);\\n\\t\\theight: var(--ck-character-grid-tile-size);\\n\\t\\tmin-width: var(--ck-character-grid-tile-size);\\n\\t\\tmin-height: var(--ck-character-grid-tile-size);\\n\\t\\tfont-size: 1.2em;\\n\\t\\tpadding: 0;\\n\\t\\ttransition: .2s ease box-shadow;\\n\\t\\tborder: 0;\\n\\n\\t\\t&:focus:not( .ck-disabled ),\\n\\t\\t&:hover:not( .ck-disabled ) {\\n\\t\\t\\t/* Disable the default .ck-button's border ring. */\\n\\t\\t\\tborder: 0;\\n\\t\\t\\tbox-shadow: inset 0 0 0 1px var(--ck-color-base-background), 0 0 0 2px var(--ck-color-focus-border);\\n\\t\\t}\\n\\n\\t\\t/* Make sure the glyph is rendered in the center of the button */\\n\\t\\t& .ck-button__label {\\n\\t\\t\\tline-height: var(--ck-character-grid-tile-size);\\n\\t\\t\\twidth: 100%;\\n\\t\\t\\ttext-align: center;\\n\\t\\t}\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@define-mixin ck-media-phone {\\n\\t@media screen and (max-width: 600px) {\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-character-info{border-top:1px solid var(--ck-color-base-border);display:flex;justify-content:space-between;padding:var(--ck-spacing-small) var(--ck-spacing-large)}.ck.ck-character-info>*{font-size:var(--ck-font-size-small);text-transform:uppercase}.ck.ck-character-info .ck-character-info__name{max-width:280px;overflow:hidden;text-overflow:ellipsis}.ck.ck-character-info .ck-character-info__code{opacity:.6}@media screen and (max-width:600px){.ck.ck-character-info{max-width:190px}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-special-characters/theme/characterinfo.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-special-characters/characterinfo.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css\"],\"names\":[],\"mappings\":\"AAKA,sBCIC,gDAAiD,CDHjD,YAAa,CACb,6BAA8B,CCC9B,uDDAD,CCGC,wBAEC,mCAAoC,CADpC,wBAED,CAEA,+CACC,eAAgB,CAEhB,eAAgB,CADhB,sBAED,CAEA,+CACC,UACD,CClBA,oCDCD,sBAoBE,eAEF,CCrBC\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-character-info {\\n\\tdisplay: flex;\\n\\tjustify-content: space-between;\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css\\\";\\n\\n.ck.ck-character-info {\\n\\tpadding: var(--ck-spacing-small) var(--ck-spacing-large);\\n\\tborder-top: 1px solid var(--ck-color-base-border);\\n\\n\\t& > * {\\n\\t\\ttext-transform: uppercase;\\n\\t\\tfont-size: var(--ck-font-size-small);\\n\\t}\\n\\n\\t& .ck-character-info__name {\\n\\t\\tmax-width: 280px;\\n\\t\\ttext-overflow: ellipsis;\\n\\t\\toverflow: hidden;\\n\\t}\\n\\n\\t& .ck-character-info__code {\\n\\t\\topacity: .6;\\n\\t}\\n\\n\\t@mixin ck-media-phone {\\n\\t\\tmax-width: 190px;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@define-mixin ck-media-phone {\\n\\t@media screen and (max-width: 600px) {\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-special-characters-navigation>.ck-label{max-width:160px;overflow:hidden;text-overflow:ellipsis}.ck.ck-special-characters-navigation>.ck-dropdown .ck-dropdown__panel{max-height:250px;overflow-x:hidden;overflow-y:auto}@media screen and (max-width:600px){.ck.ck-special-characters-navigation{max-width:190px}.ck.ck-special-characters-navigation>.ck-form__header__label{overflow:hidden;text-overflow:ellipsis}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-special-characters/specialcharacters.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css\"],\"names\":[],\"mappings\":\"AAUC,+CACC,eAAgB,CAEhB,eAAgB,CADhB,sBAED,CAEA,sEAEC,gBAAiB,CAEjB,iBAAkB,CADlB,eAED,CCfA,oCDED,qCAgBE,eAOF,CALE,6DAEC,eAAgB,CADhB,sBAED,CCrBD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_dir.css\\\";\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css\\\";\\n\\n.ck.ck-special-characters-navigation {\\n\\n\\t& > .ck-label {\\n\\t\\tmax-width: 160px;\\n\\t\\ttext-overflow: ellipsis;\\n\\t\\toverflow: hidden;\\n\\t}\\n\\n\\t& > .ck-dropdown .ck-dropdown__panel {\\n\\t\\t/* There could be dozens of categories available. Use scroll to prevent a 10e6px dropdown. */\\n\\t\\tmax-height: 250px;\\n\\t\\toverflow-y: auto;\\n\\t\\toverflow-x: hidden;\\n\\t}\\n\\n\\t@mixin ck-media-phone {\\n\\t\\tmax-width: 190px;\\n\\n\\t\\t& > .ck-form__header__label {\\n\\t\\t\\ttext-overflow: ellipsis;\\n\\t\\t\\toverflow: hidden;\\n\\t\\t}\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@define-mixin ck-media-phone {\\n\\t@media screen and (max-width: 600px) {\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-input-color{display:flex;flex-direction:row-reverse;width:100%}.ck.ck-input-color>input.ck.ck-input-text{flex-grow:1;min-width:auto}.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{display:flex}.ck.ck-input-color .ck.ck-input-color__button .ck.ck-input-color__button__preview{overflow:hidden;position:relative}.ck.ck-input-color .ck.ck-input-color__button .ck.ck-input-color__button__preview>.ck.ck-input-color__button__preview__no-color-indicator{display:block;position:absolute}[dir=ltr] .ck.ck-input-color>.ck.ck-input-text{border-bottom-right-radius:0;border-top-right-radius:0}[dir=rtl] .ck.ck-input-color>.ck.ck-input-text{border-bottom-left-radius:0;border-top-left-radius:0}.ck.ck-input-color>.ck.ck-input-text:focus{z-index: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-bottom-left-radius:0;border-top-left-radius:0}[dir=ltr] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button:not(:focus){border-left:1px solid transparent}[dir=rtl] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{border-bottom-right-radius:0;border-top-right-radius:0}[dir=rtl] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button:not(:focus){border-right:1px solid transparent}.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{border:1px solid var(--ck-color-input-border);height:20px;width:20px}.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{background:red;border-radius:2px;height:150%;left:50%;top:-30%;transform:rotate(45deg);transform-origin:50%;width:8%}.ck.ck-input-color .ck.ck-input-color__remove-color{border-bottom-left-radius:0;border-bottom-right-radius:0;padding:calc(var(--ck-spacing-standard)/2) var(--ck-spacing-standard);width:100%}.ck.ck-input-color .ck.ck-input-color__remove-color:not(:focus){border-bottom:1px solid var(--ck-color-input-border)}[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-left:var(--ck-spacing-standard);margin-right:0}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-table/theme/colorinput.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/colorinput.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css\"],\"names\":[],\"mappings\":\"AAKA,mBAEC,YAAa,CACb,0BAA2B,CAF3B,UAgCD,CA5BC,0CAEC,WAAY,CADZ,cAED,CAEA,sCACC,cAMD,CAHC,kFACC,YACD,CAGD,8CAEC,YAWD,CATC,kFAEC,eAAgB,CADhB,iBAOD,CAJC,0IAEC,aAAc,CADd,iBAED,CC1BF,+CAGE,4BAA6B,CAD7B,yBAcF,CAhBA,+CAQE,2BAA4B,CAD5B,wBASF,CAHC,2CACC,SACD,CAIA,wEACC,SA0CD,CA3CA,kFAKE,2BAA4B,CAD5B,wBAuCF,CApCE,8FACC,iCACD,CATF,kFAcE,4BAA6B,CAD7B,yBA8BF,CA3BE,8FACC,kCACD,CAGD,oFACC,oDACD,CAEA,4GC1CF,eD2DE,CAjBA,+PCtCD,qCDuDC,CAjBA,4GAKC,6CAA8C,CAD9C,WAAY,CADZ,UAcD,CAVC,oKAKC,cAA6B,CAC7B,iBAAkB,CAHlB,WAAY,CADZ,QAAS,CADT,QAAS,CAMT,uBAAwB,CACxB,oBAAqB,CAJrB,QAKD,CAKH,oDAIC,2BAA4B,CAC5B,4BAA6B,CAH7B,qEAAwE,CADxE,UA0BD,CApBC,gEACC,oDACD,CATD,8DAYE,yBAeF,CA3BA,8DAgBE,wBAWF,CARC,gEACC,uCAMD,CAPA,0EAKE,sCAAuC,CADvC,cAGF\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-input-color {\\n\\twidth: 100%;\\n\\tdisplay: flex;\\n\\tflex-direction: row-reverse;\\n\\n\\t& > input.ck.ck-input-text {\\n\\t\\tmin-width: auto;\\n\\t\\tflex-grow: 1;\\n\\t}\\n\\n\\t& > div.ck.ck-dropdown {\\n\\t\\tmin-width: auto;\\n\\n\\t\\t/* This dropdown has no arrow but a color preview instead. */\\n\\t\\t& > .ck-input-color__button .ck-dropdown__arrow {\\n\\t\\t\\tdisplay: none;\\n\\t\\t}\\n\\t}\\n\\n\\t& .ck.ck-input-color__button {\\n\\t\\t/* Resolving issue with misaligned buttons on Safari (see #10589) */\\n\\t\\tdisplay: flex;\\n\\n\\t\\t& .ck.ck-input-color__button__preview {\\n\\t\\t\\tposition: relative;\\n\\t\\t\\toverflow: hidden;\\n\\n\\t\\t\\t& > .ck.ck-input-color__button__preview__no-color-indicator {\\n\\t\\t\\t\\tposition: absolute;\\n\\t\\t\\t\\tdisplay: block;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_dir.css\\\";\\n@import \\\"../mixins/_rounded.css\\\";\\n\\n.ck.ck-input-color {\\n\\t& > .ck.ck-input-text {\\n\\t\\t@mixin ck-dir ltr {\\n\\t\\t\\tborder-top-right-radius: 0;\\n\\t\\t\\tborder-bottom-right-radius: 0;\\n\\t\\t}\\n\\n\\t\\t@mixin ck-dir rtl {\\n\\t\\t\\tborder-top-left-radius: 0;\\n\\t\\t\\tborder-bottom-left-radius: 0;\\n\\t\\t}\\n\\n\\t\\t/* Make sure the focused input is always on top of the dropdown button so its\\n\\t\\t   outline and border are never cropped (also when the input is read-only). */\\n\\t\\t&:focus {\\n\\t\\t\\tz-index: 0;\\n\\t\\t}\\n\\t}\\n\\n\\t& > .ck.ck-dropdown {\\n\\t\\t& > .ck.ck-button.ck-input-color__button {\\n\\t\\t\\tpadding: 0;\\n\\n\\t\\t\\t@mixin ck-dir ltr {\\n\\t\\t\\t\\tborder-top-left-radius: 0;\\n\\t\\t\\t\\tborder-bottom-left-radius: 0;\\n\\n\\t\\t\\t\\t&:not(:focus) {\\n\\t\\t\\t\\t\\tborder-left: 1px solid transparent;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t@mixin ck-dir rtl {\\n\\t\\t\\t\\tborder-top-right-radius: 0;\\n\\t\\t\\t\\tborder-bottom-right-radius: 0;\\n\\n\\t\\t\\t\\t&:not(:focus) {\\n\\t\\t\\t\\t\\tborder-right: 1px solid transparent;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t&.ck-disabled {\\n\\t\\t\\t\\tbackground: var(--ck-color-input-disabled-background);\\n\\t\\t\\t}\\n\\n\\t\\t\\t& > .ck.ck-input-color__button__preview {\\n\\t\\t\\t\\t@mixin ck-rounded-corners;\\n\\n\\t\\t\\t\\twidth: 20px;\\n\\t\\t\\t\\theight: 20px;\\n\\t\\t\\t\\tborder: 1px solid var(--ck-color-input-border);\\n\\n\\t\\t\\t\\t& > .ck.ck-input-color__button__preview__no-color-indicator {\\n\\t\\t\\t\\t\\ttop: -30%;\\n\\t\\t\\t\\t\\tleft: 50%;\\n\\t\\t\\t\\t\\theight: 150%;\\n\\t\\t\\t\\t\\twidth: 8%;\\n\\t\\t\\t\\t\\tbackground: hsl(0, 100%, 50%);\\n\\t\\t\\t\\t\\tborder-radius: 2px;\\n\\t\\t\\t\\t\\ttransform: rotate(45deg);\\n\\t\\t\\t\\t\\ttransform-origin: 50%;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t& .ck.ck-input-color__remove-color {\\n\\t\\twidth: 100%;\\n\\t\\tpadding: calc(var(--ck-spacing-standard) / 2) var(--ck-spacing-standard);\\n\\n\\t\\tborder-bottom-left-radius: 0;\\n\\t\\tborder-bottom-right-radius: 0;\\n\\n\\t\\t&:not(:focus) {\\n\\t\\t\\tborder-bottom: 1px solid var(--ck-color-input-border);\\n\\t\\t}\\n\\n\\t\\t@mixin ck-dir ltr {\\n\\t\\t\\tborder-top-right-radius: 0;\\n\\t\\t}\\n\\n\\t\\t@mixin ck-dir rtl {\\n\\t\\t\\tborder-top-left-radius: 0;\\n\\t\\t}\\n\\n\\t\\t& .ck.ck-icon {\\n\\t\\t\\tmargin-right: var(--ck-spacing-standard);\\n\\n\\t\\t\\t@mixin ck-dir rtl {\\n\\t\\t\\t\\tmargin-right: 0;\\n\\t\\t\\t\\tmargin-left: var(--ck-spacing-standard);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * Implements rounded corner interface for .ck-rounded-corners class.\\n *\\n * @see $ck-border-radius\\n */\\n@define-mixin ck-rounded-corners {\\n\\tborder-radius: 0;\\n\\n\\t@nest .ck-rounded-corners &,\\n\\t&.ck-rounded-corners {\\n\\t\\tborder-radius: var(--ck-border-radius);\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".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%}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/form.css\"],\"names\":[],\"mappings\":\"AAKA,YACC,mCAyBD,CAvBC,kBAEC,YACD,CAEA,8BACC,cAAe,CACf,OACD,CAEA,4BACC,cAWD,CARE,6DACC,4CACD,CAEA,mEACC,UACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-form {\\n\\tpadding: 0 0 var(--ck-spacing-large);\\n\\n\\t&:focus {\\n\\t\\t/* See: https://github.com/ckeditor/ckeditor5/issues/4773 */\\n\\t\\toutline: none;\\n\\t}\\n\\n\\t& .ck.ck-input-text {\\n\\t\\tmin-width: 100%;\\n\\t\\twidth: 0;\\n\\t}\\n\\n\\t& .ck.ck-dropdown {\\n\\t\\tmin-width: 100%;\\n\\n\\t\\t& .ck-dropdown__button {\\n\\t\\t\\t&:not(:focus) {\\n\\t\\t\\t\\tborder: 1px solid var(--ck-color-base-border);\\n\\t\\t\\t}\\n\\n\\t\\t\\t& .ck-button__label {\\n\\t\\t\\t\\twidth: 100%;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".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{min-width:100%;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)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-table/theme/formrow.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/formrow.css\"],\"names\":[],\"mappings\":\"AAKA,iBACC,YAAa,CACb,kBAAmB,CACnB,gBAAiB,CACjB,6BAaD,CAVC,iCACC,WACD,CAGC,wHAEC,sBACD,CCbF,iBACC,4DA2BD,CAvBE,6CAEE,mCAMF,CARA,6CAME,oCAEF,CAGD,2BAEC,cAAe,CADf,UAED,CAEA,2CACC,kCAKD,CAHC,wEACC,0BACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-form__row {\\n\\tdisplay: flex;\\n\\tflex-direction: row;\\n\\tflex-wrap: nowrap;\\n\\tjustify-content: space-between;\\n\\n\\t/* Ignore labels that work as fieldset legends */\\n\\t& > *:not(.ck-label) {\\n\\t\\tflex-grow: 1;\\n\\t}\\n\\n\\t&.ck-table-form__action-row {\\n\\t\\t& .ck-button-save,\\n\\t\\t& .ck-button-cancel {\\n\\t\\t\\tjustify-content: center;\\n\\t\\t}\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_dir.css\\\";\\n\\n.ck.ck-form__row {\\n\\tpadding: var(--ck-spacing-standard) var(--ck-spacing-large) 0;\\n\\n\\t/* Ignore labels that work as fieldset legends */\\n\\t& > *:not(.ck-label) {\\n\\t\\t& + * {\\n\\t\\t\\t@mixin ck-dir ltr {\\n\\t\\t\\t\\tmargin-left: var(--ck-spacing-large);\\n\\t\\t\\t}\\n\\n\\t\\t\\t@mixin ck-dir rtl {\\n\\t\\t\\t\\tmargin-right: var(--ck-spacing-large);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t& > .ck-label {\\n\\t\\twidth: 100%;\\n\\t\\tmin-width: 100%;\\n\\t}\\n\\n\\t&.ck-table-form__action-row {\\n\\t\\tmargin-top: var(--ck-spacing-large);\\n\\n\\t\\t& .ck-button .ck-button__label {\\n\\t\\t\\tcolor: var(--ck-color-text);\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".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{padding:var(--ck-insert-table-dropdown-padding) var(--ck-insert-table-dropdown-padding) 0;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)}.ck .ck-insert-table-dropdown__label,.ck[dir=rtl] .ck-insert-table-dropdown__label{text-align:center}.ck .ck-insert-table-dropdown-grid-box{border:1px solid var(--ck-color-base-border);border-radius:1px;margin:var(--ck-insert-table-dropdown-box-margin);min-height:var(--ck-insert-table-dropdown-box-height);min-width:var(--ck-insert-table-dropdown-box-width);outline:none;transition:none}.ck .ck-insert-table-dropdown-grid-box:focus{box-shadow:none}.ck .ck-insert-table-dropdown-grid-box.ck-on{background:var(--ck-color-focus-outer-shadow);border-color:var(--ck-color-focus-border)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-table/theme/inserttable.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/inserttable.css\"],\"names\":[],\"mappings\":\"AAKA,oCACC,YAAa,CACb,kBAAmB,CACnB,cACD,CCJA,MACC,uCAAwC,CACxC,0CAA2C,CAC3C,yCAA0C,CAC1C,yCACD,CAEA,oCAGC,yFAA0F,CAD1F,oJAED,CAEA,mFAEC,iBACD,CAEA,uCAIC,4CAA6C,CAC7C,iBAAkB,CAFlB,iDAAkD,CADlD,qDAAsD,CADtD,mDAAoD,CAKpD,YAAa,CACb,eAUD,CARC,6CACC,eACD,CAEA,6CAEC,6CAA8C,CAD9C,yCAED\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck .ck-insert-table-dropdown__grid {\\n\\tdisplay: flex;\\n\\tflex-direction: row;\\n\\tflex-wrap: wrap;\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-insert-table-dropdown-padding: 10px;\\n\\t--ck-insert-table-dropdown-box-height: 11px;\\n\\t--ck-insert-table-dropdown-box-width: 12px;\\n\\t--ck-insert-table-dropdown-box-margin: 1px;\\n}\\n\\n.ck .ck-insert-table-dropdown__grid {\\n\\t/* The width of a container should match 10 items in a row so there will be a 10x10 grid. */\\n\\twidth: calc(var(--ck-insert-table-dropdown-box-width) * 10 + var(--ck-insert-table-dropdown-box-margin) * 20 + var(--ck-insert-table-dropdown-padding) * 2);\\n\\tpadding: var(--ck-insert-table-dropdown-padding) var(--ck-insert-table-dropdown-padding) 0;\\n}\\n\\n.ck .ck-insert-table-dropdown__label,\\n.ck[dir=rtl] .ck-insert-table-dropdown__label {\\n\\ttext-align: center;\\n}\\n\\n.ck .ck-insert-table-dropdown-grid-box {\\n\\tmin-width: var(--ck-insert-table-dropdown-box-width);\\n\\tmin-height: var(--ck-insert-table-dropdown-box-height);\\n\\tmargin: var(--ck-insert-table-dropdown-box-margin);\\n\\tborder: 1px solid var(--ck-color-base-border);\\n\\tborder-radius: 1px;\\n\\toutline: none;\\n\\ttransition: none;\\n\\n\\t&:focus {\\n\\t\\tbox-shadow: none;\\n\\t}\\n\\n\\t&.ck-on {\\n\\t\\tborder-color: var(--ck-color-focus-border);\\n\\t\\tbackground: var(--ck-color-focus-outer-shadow);\\n\\t}\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck-content .table{display:table;margin:.9em auto}.ck-content .table table{border:1px double #b3b3b3;border-collapse:collapse;border-spacing:0;height:100%;width:100%}.ck-content .table table td,.ck-content .table table th{border:1px solid #bfbfbf;min-width:2em;padding:.4em}.ck-content .table table th{background:rgba(0,0,0,.05);font-weight:700}.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%}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-table/theme/table.css\"],\"names\":[],\"mappings\":\"AAKA,mBAKC,aAAc,CADd,gBAiCD,CA9BC,yBAYC,yBAAkC,CAVlC,wBAAyB,CACzB,gBAAiB,CAKjB,WAAY,CADZ,UAsBD,CAfC,wDAQC,wBAAiC,CANjC,aAAc,CACd,YAMD,CAEA,4BAEC,0BAA+B,CAD/B,eAED,CAMF,+BACC,gBACD,CAEA,+BACC,eACD,CAEA,+CAKC,oBAAqB,CAMrB,UACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck-content .table {\\n\\t/* Give the table widget some air and center it horizontally */\\n\\t/* The first value should be equal to --ck-spacing-large variable if used in the editor context\\n\\tto avoid the content jumping (See https://github.com/ckeditor/ckeditor5/issues/9825). */\\n\\tmargin: 0.9em auto;\\n\\tdisplay: table;\\n\\n\\t& table {\\n\\t\\t/* The table cells should have slight borders */\\n\\t\\tborder-collapse: collapse;\\n\\t\\tborder-spacing: 0;\\n\\n\\t\\t/* Table width and height are set on the parent <figure>. Make sure the table inside stretches\\n\\t\\tto the full dimensions of the container (https://github.com/ckeditor/ckeditor5/issues/6186). */\\n\\t\\twidth: 100%;\\n\\t\\theight: 100%;\\n\\n\\t\\t/* The outer border of the table should be slightly darker than the inner lines.\\n\\t\\tAlso see https://github.com/ckeditor/ckeditor5-table/issues/50. */\\n\\t\\tborder: 1px double hsl(0, 0%, 70%);\\n\\n\\t\\t& td,\\n\\t\\t& th {\\n\\t\\t\\tmin-width: 2em;\\n\\t\\t\\tpadding: .4em;\\n\\n\\t\\t\\t/* The border is inherited from .ck-editor__nested-editable styles, so theoretically it's not necessary here.\\n\\t\\t\\tHowever, the border is a content style, so it should use .ck-content (so it works outside the editor).\\n\\t\\t\\tHence, the duplication. See https://github.com/ckeditor/ckeditor5/issues/6314 */\\n\\t\\t\\tborder: 1px solid hsl(0, 0%, 75%);\\n\\t\\t}\\n\\n\\t\\t& th {\\n\\t\\t\\tfont-weight: bold;\\n\\t\\t\\tbackground: hsla(0, 0%, 0%, 5%);\\n\\t\\t}\\n\\t}\\n}\\n\\n/* Text alignment of the table header should match the editor settings and override the native browser styling,\\nwhen content is available outside the editor. See https://github.com/ckeditor/ckeditor5/issues/6638 */\\n.ck-content[dir=\\\"rtl\\\"] .table th {\\n\\ttext-align: right;\\n}\\n\\n.ck-content[dir=\\\"ltr\\\"] .table th {\\n\\ttext-align: left;\\n}\\n\\n.ck-editor__editable .ck-table-bogus-paragraph {\\n\\t/*\\n\\t * Use display:inline-block to force Chrome/Safari to limit text mutations to this element.\\n\\t * See https://github.com/ckeditor/ckeditor5/issues/6062.\\n\\t */\\n\\tdisplay: inline-block;\\n\\n\\t/*\\n\\t * Inline HTML elements nested in the span should always be dimensioned in relation to the whole cell width.\\n\\t * See https://github.com/ckeditor/ckeditor5/issues/9117.\\n\\t */\\n\\twidth: 100%;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".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)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-table/theme/tablecellproperties.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/tablecellproperties.css\"],\"names\":[],\"mappings\":\"AAOE,6FACC,cAiBD,CAdE,0HAEC,cACD,CAEA,yHAEC,cACD,CAEA,uHACC,WACD,CClBJ,kCACC,WAkBD,CAfE,2FACC,mBAAoB,CACpB,SAAU,CACV,SACD,CAGC,4GACC,eAAgB,CAGhB,qCACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-table-cell-properties-form {\\n\\t& .ck-form__row {\\n\\t\\t&.ck-table-cell-properties-form__alignment-row {\\n\\t\\t\\tflex-wrap: wrap;\\n\\n\\t\\t\\t& .ck.ck-toolbar {\\n\\t\\t\\t\\t&:first-of-type {\\n\\t\\t\\t\\t\\t/* 4 buttons out of 7 (h-alignment + v-alignment) = 0.57 */\\n\\t\\t\\t\\t\\tflex-grow: 0.57;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t&:last-of-type {\\n\\t\\t\\t\\t\\t/* 3 buttons out of 7 (h-alignment + v-alignment) = 0.43 */\\n\\t\\t\\t\\t\\tflex-grow: 0.43;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t& .ck-button {\\n\\t\\t\\t\\t\\tflex-grow: 1;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-table-cell-properties-form {\\n\\twidth: 320px;\\n\\n\\t& .ck-form__row {\\n\\t\\t&.ck-table-cell-properties-form__padding-row {\\n\\t\\t\\talign-self: flex-end;\\n\\t\\t\\tpadding: 0;\\n\\t\\t\\twidth: 25%;\\n\\t\\t}\\n\\n\\t\\t&.ck-table-cell-properties-form__alignment-row {\\n\\t\\t\\t& .ck.ck-toolbar {\\n\\t\\t\\t\\tbackground: none;\\n\\n\\t\\t\\t\\t/* Compensate for missing input label that would push the margin (toolbar has no inputs). */\\n\\t\\t\\t\\tmargin-top: var(--ck-spacing-standard);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root{--ck-color-table-column-resizer-hover:var(--ck-color-base-active);--ck-table-column-resizer-width:7px;--ck-table-column-resizer-position-offset:calc(var(--ck-table-column-resizer-width)*-0.5 - 0.5px)}.ck-content .table .ck-table-resized{table-layout:fixed}.ck-content .table table{overflow:hidden}.ck-content .table td,.ck-content .table th{overflow-wrap:break-word;position:relative}.ck.ck-editor__editable .table .ck-table-column-resizer{bottom:-999999px;cursor:col-resize;position:absolute;right:var(--ck-table-column-resizer-position-offset);top:-999999px;user-select:none;width:var(--ck-table-column-resizer-width);z-index:var(--ck-z-default)}.ck.ck-editor__editable .table[draggable] .ck-table-column-resizer,.ck.ck-editor__editable.ck-column-resize_disabled .table .ck-table-column-resizer{display:none}.ck.ck-editor__editable .table .ck-table-column-resizer:hover,.ck.ck-editor__editable .table .ck-table-column-resizer__active{background-color:var(--ck-color-table-column-resizer-hover);opacity:.25}.ck.ck-editor__editable[dir=rtl] .table .ck-table-column-resizer{left:var(--ck-table-column-resizer-position-offset);right:unset}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-table/theme/tablecolumnresize.css\"],\"names\":[],\"mappings\":\"AAKA,MACC,iEAAkE,CAClE,mCAAoC,CAIpC,iGACD,CAEA,qCACC,kBACD,CAEA,yBACC,eACD,CAEA,4CAIC,wBAAyB,CACzB,iBACD,CAEA,wDAOC,gBAAiB,CAGjB,iBAAkB,CATlB,iBAAkB,CAOlB,oDAAqD,CAFrD,aAAc,CAKd,gBAAiB,CAFjB,0CAA2C,CAG3C,2BACD,CAQA,qJACC,YACD,CAEA,8HAEC,2DAA4D,CAC5D,WACD,CAEA,iEACC,mDAAoD,CACpD,WACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-color-table-column-resizer-hover: var(--ck-color-base-active);\\n\\t--ck-table-column-resizer-width: 7px;\\n\\n\\t/* The offset used for absolute positioning of the resizer element, so that it is placed exactly above the cell border.\\n\\t   The value is: minus half the width of the resizer decreased additionaly by the half the width of the border (0.5px). */\\n\\t--ck-table-column-resizer-position-offset: calc(var(--ck-table-column-resizer-width) * -0.5 - 0.5px);\\n}\\n\\n.ck-content .table .ck-table-resized {\\n\\ttable-layout: fixed;\\n}\\n\\n.ck-content .table table {\\n\\toverflow: hidden;\\n}\\n\\n.ck-content .table td,\\n.ck-content .table th {\\n\\t/* To prevent text overflowing beyond its cell when columns are resized by resize handler\\n\\t(https://github.com/ckeditor/ckeditor5/pull/14379#issuecomment-1589460978). */\\n\\toverflow-wrap: break-word;\\n\\tposition: relative;\\n}\\n\\n.ck.ck-editor__editable .table .ck-table-column-resizer {\\n\\tposition: absolute;\\n\\t/* The resizer element resides in each cell so to occupy the entire height of the table, which is unknown from a CSS point of view,\\n\\t   it is extended to an extremely high height. Even for screens with a very high pixel density, the resizer will fulfill its role as\\n\\t   it should, i.e. for a screen of 476 ppi the total height of the resizer will take over 350 sheets of A4 format, which is totally\\n\\t   unrealistic height for a single table. */\\n\\ttop: -999999px;\\n\\tbottom: -999999px;\\n\\tright: var(--ck-table-column-resizer-position-offset);\\n\\twidth: var(--ck-table-column-resizer-width);\\n\\tcursor: col-resize;\\n\\tuser-select: none;\\n\\tz-index: var(--ck-z-default);\\n}\\n\\n.ck.ck-editor__editable.ck-column-resize_disabled .table .ck-table-column-resizer {\\n\\tdisplay: none;\\n}\\n\\n/* The resizer elements, which are extended to an extremely high height, break the drag & drop feature in Chrome. To make it work again,\\n   all resizers must be hidden while the table is dragged. */\\n.ck.ck-editor__editable .table[draggable] .ck-table-column-resizer {\\n\\tdisplay: none;\\n}\\n\\n.ck.ck-editor__editable .table .ck-table-column-resizer:hover,\\n.ck.ck-editor__editable .table .ck-table-column-resizer__active {\\n\\tbackground-color: var(--ck-color-table-column-resizer-hover);\\n\\topacity: 0.25;\\n}\\n\\n.ck.ck-editor__editable[dir=rtl] .table .ck-table-column-resizer {\\n\\tleft: var(--ck-table-column-resizer-position-offset);\\n\\tright: unset;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root{--ck-color-table-focused-cell-background:rgba(158,201,250,.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}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/tableediting.css\"],\"names\":[],\"mappings\":\"AAKA,MACC,6DACD,CAKE,8QAGC,wDAAyD,CAKzD,iBAAkB,CAClB,8CAA+C,CAC/C,mBACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-color-table-focused-cell-background: hsla(212, 90%, 80%, .3);\\n}\\n\\n.ck-widget.table {\\n\\t& td,\\n\\t& th {\\n\\t\\t&.ck-editor__nested-editable.ck-editor__nested-editable_focused,\\n\\t\\t&.ck-editor__nested-editable:focus {\\n\\t\\t\\t/* A very slight background to highlight the focused cell */\\n\\t\\t\\tbackground: var(--ck-color-table-focused-cell-background);\\n\\n\\t\\t\\t/* Fixes the problem where surrounding cells cover the focused cell's border.\\n\\t\\t\\tIt does not fix the problem in all places but the UX is improved.\\n\\t\\t\\tSee https://github.com/ckeditor/ckeditor5-table/issues/29. */\\n\\t\\t\\tborder-style: none;\\n\\t\\t\\toutline: 1px solid var(--ck-color-focus-border);\\n\\t\\t\\toutline-offset: -1px; /* progressive enhancement - no IE support */\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".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{align-items:center;flex-wrap:wrap}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-labeled-field-view{align-items:center;display:flex;flex-direction:column-reverse}.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{bottom:calc(var(--ck-table-properties-error-arrow-size)*-1);left:50%;position:absolute;transform:translate(-50%,100%);z-index:1}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status:after{content:\\\"\\\";left:50%;position:absolute;top:calc(var(--ck-table-properties-error-arrow-size)*-1);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{max-width:80px;min-width:80px;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);min-width:var(--ck-table-properties-min-error-width);padding:var(--ck-spacing-small) var(--ck-spacing-medium);text-align:center}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status:after{border-color:transparent transparent var(--ck-color-base-error) transparent;border-style:solid;border-width:0 var(--ck-table-properties-error-arrow-size) var(--ck-table-properties-error-arrow-size) var(--ck-table-properties-error-arrow-size)}.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}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-table/theme/tableform.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/tableform.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css\"],\"names\":[],\"mappings\":\"AAWE,wHACC,cACD,CAEA,8DAEC,kBAAmB,CADnB,cAgBD,CAbC,qFAGC,kBAAmB,CAFnB,YAAa,CACb,6BAMD,CAEA,sMACC,WACD,CAIF,4CAEC,iBAoBD,CAlBC,8EAGC,2DAAgE,CADhE,QAAS,CADT,iBAAkB,CAGlB,8BAA+B,CAG/B,SAUD,CAPC,oFACC,UAAW,CAGX,QAAS,CAFT,iBAAkB,CAClB,wDAA6D,CAE7D,0BACD,CChDH,MACC,0CAA2C,CAC3C,2CACD,CAMI,2FACC,kCAAmC,CACnC,iBACD,CAGD,8KAIC,cAAe,CADf,cAAe,CADf,UAGD,CAGD,8DACC,SAcD,CAZC,yMAEC,QACD,CAEA,iGACC,mBAAoB,CACpB,oBAAqB,CACrB,wCAAyC,CACzC,6CAA8C,CAC9C,gCACD,CAIF,4CACC,sCAyBD,CAvBC,8ECxCD,eDyDC,CAjBA,mMCpCA,qCDqDA,CAjBA,8EAGC,qCAAsC,CACtC,qCAAsC,CAEtC,oDAAqD,CADrD,wDAAyD,CAEzD,iBAUD,CAPC,oFACC,2EAA4E,CAE5E,kBAAmB,CADnB,kJAED,CAdD,8EAgBC,iEACD,CAGA,6GACC,YACD,CAIF,oDACC,GACC,SACD,CAEA,GACC,SACD,CACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-table-form {\\n\\t& .ck-form__row {\\n\\t\\t&.ck-table-form__border-row {\\n\\t\\t\\tflex-wrap: wrap;\\n\\t\\t}\\n\\n\\t\\t&.ck-table-form__background-row {\\n\\t\\t\\tflex-wrap: wrap;\\n\\t\\t}\\n\\n\\t\\t&.ck-table-form__dimensions-row {\\n\\t\\t\\tflex-wrap: wrap;\\n\\t\\t\\talign-items: center;\\n\\n\\t\\t\\t& .ck-labeled-field-view {\\n\\t\\t\\t\\tdisplay: flex;\\n\\t\\t\\t\\tflex-direction: column-reverse;\\n\\t\\t\\t\\talign-items: center;\\n\\n\\t\\t\\t\\t& .ck.ck-dropdown {\\n\\t\\t\\t\\t\\tflex-grow: 0;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t& .ck-table-form__dimension-operator {\\n\\t\\t\\t\\tflex-grow: 0;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t& .ck.ck-labeled-field-view {\\n\\t\\t/* Allow absolute positioning of the status (error) balloons. */\\n\\t\\tposition: relative;\\n\\n\\t\\t& .ck.ck-labeled-field-view__status {\\n\\t\\t\\tposition: absolute;\\n\\t\\t\\tleft: 50%;\\n\\t\\t\\tbottom: calc( -1 * var(--ck-table-properties-error-arrow-size) );\\n\\t\\t\\ttransform: translate(-50%,100%);\\n\\n\\t\\t\\t/* Make sure the balloon status stays on top of other form elements. */\\n\\t\\t\\tz-index: 1;\\n\\n\\t\\t\\t/* The arrow pointing towards the field. */\\n\\t\\t\\t&::after {\\n\\t\\t\\t\\tcontent: \\\"\\\";\\n\\t\\t\\t\\tposition: absolute;\\n\\t\\t\\t\\ttop: calc( -1 * var(--ck-table-properties-error-arrow-size) );\\n\\t\\t\\t\\tleft: 50%;\\n\\t\\t\\t\\ttransform: translateX( -50% );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"../mixins/_rounded.css\\\";\\n\\n:root {\\n\\t--ck-table-properties-error-arrow-size: 6px;\\n\\t--ck-table-properties-min-error-width: 150px;\\n}\\n\\n.ck.ck-table-form {\\n\\t& .ck-form__row {\\n\\t\\t&.ck-table-form__border-row {\\n\\t\\t\\t& .ck-labeled-field-view {\\n\\t\\t\\t\\t& > .ck-label {\\n\\t\\t\\t\\t\\tfont-size: var(--ck-font-size-tiny);\\n\\t\\t\\t\\t\\ttext-align: center;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t& .ck-table-form__border-style,\\n\\t\\t\\t& .ck-table-form__border-width {\\n\\t\\t\\t\\twidth: 80px;\\n\\t\\t\\t\\tmin-width: 80px;\\n\\t\\t\\t\\tmax-width: 80px;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t&.ck-table-form__dimensions-row {\\n\\t\\t\\tpadding: 0;\\n\\n\\t\\t\\t& .ck-table-form__dimensions-row__width,\\n\\t\\t\\t& .ck-table-form__dimensions-row__height {\\n\\t\\t\\t\\tmargin: 0\\n\\t\\t\\t}\\n\\n\\t\\t\\t& .ck-table-form__dimension-operator {\\n\\t\\t\\t\\talign-self: flex-end;\\n\\t\\t\\t\\tdisplay: inline-block;\\n\\t\\t\\t\\theight: var(--ck-ui-component-min-height);\\n\\t\\t\\t\\tline-height: var(--ck-ui-component-min-height);\\n\\t\\t\\t\\tmargin: 0 var(--ck-spacing-small);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t& .ck.ck-labeled-field-view {\\n\\t\\tpadding-top: var(--ck-spacing-standard);\\n\\n\\t\\t& .ck.ck-labeled-field-view__status {\\n\\t\\t\\t@mixin ck-rounded-corners;\\n\\n\\t\\t\\tbackground: var(--ck-color-base-error);\\n\\t\\t\\tcolor: var(--ck-color-base-background);\\n\\t\\t\\tpadding: var(--ck-spacing-small) var(--ck-spacing-medium);\\n\\t\\t\\tmin-width: var(--ck-table-properties-min-error-width);\\n\\t\\t\\ttext-align: center;\\n\\n\\t\\t\\t/* The arrow pointing towards the field. */\\n\\t\\t\\t&::after {\\n\\t\\t\\t\\tborder-color: transparent transparent var(--ck-color-base-error) transparent;\\n\\t\\t\\t\\tborder-width: 0 var(--ck-table-properties-error-arrow-size) var(--ck-table-properties-error-arrow-size) var(--ck-table-properties-error-arrow-size);\\n\\t\\t\\t\\tborder-style: solid;\\n\\t\\t\\t}\\n\\n\\t\\t\\tanimation: ck-table-form-labeled-view-status-appear .15s ease both;\\n\\t\\t}\\n\\n\\t\\t/* Hide the error balloon when the field is blurred. Makes the experience much more clear. */\\n\\t\\t& .ck-input.ck-error:not(:focus) + .ck.ck-labeled-field-view__status {\\n\\t\\t\\tdisplay: none;\\n\\t\\t}\\n\\t}\\n}\\n\\n@keyframes ck-table-form-labeled-view-status-appear {\\n\\t0% {\\n\\t\\topacity: 0;\\n\\t}\\n\\n\\t100% {\\n\\t\\topacity: 1;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * Implements rounded corner interface for .ck-rounded-corners class.\\n *\\n * @see $ck-border-radius\\n */\\n@define-mixin ck-rounded-corners {\\n\\tborder-radius: 0;\\n\\n\\t@nest .ck-rounded-corners &,\\n\\t&.ck-rounded-corners {\\n\\t\\tborder-radius: var(--ck-border-radius);\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root{--ck-table-selected-cell-background:rgba(158,207,250,.3)}.ck.ck-editor__editable .table table td.ck-editor__editable_selected,.ck.ck-editor__editable .table table th.ck-editor__editable_selected{box-shadow:unset;caret-color:transparent;outline:unset;position:relative}.ck.ck-editor__editable .table table td.ck-editor__editable_selected:after,.ck.ck-editor__editable .table table th.ck-editor__editable_selected:after{background-color:var(--ck-table-selected-cell-background);bottom:0;content:\\\"\\\";left:0;pointer-events:none;position:absolute;right:0;top: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,.ck.ck-editor__editable .table table th.ck-editor__editable_selected .ck-widget{outline:unset}.ck.ck-editor__editable .table table td.ck-editor__editable_selected .ck-widget>.ck-widget__selection-handle,.ck.ck-editor__editable .table table th.ck-editor__editable_selected .ck-widget>.ck-widget__selection-handle{display:none}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-table/tableselection.css\"],\"names\":[],\"mappings\":\"AAKA,MACC,wDACD,CAGC,0IAKC,gBAAiB,CAFjB,uBAAwB,CACxB,aAAc,CAFd,iBAiCD,CA3BC,sJAGC,yDAA0D,CAK1D,QAAS,CAPT,UAAW,CAKX,MAAO,CAJP,mBAAoB,CAEpB,iBAAkB,CAGlB,OAAQ,CAFR,KAID,CAEA,wTAEC,4BACD,CAMA,gKACC,aAKD,CAHC,0NACC,YACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-table-selected-cell-background: hsla(208, 90%, 80%, .3);\\n}\\n\\n.ck.ck-editor__editable .table table {\\n\\t& td.ck-editor__editable_selected,\\n\\t& th.ck-editor__editable_selected {\\n\\t\\tposition: relative;\\n\\t\\tcaret-color: transparent;\\n\\t\\toutline: unset;\\n\\t\\tbox-shadow: unset;\\n\\n\\t\\t/* https://github.com/ckeditor/ckeditor5/issues/6446 */\\n\\t\\t&:after {\\n\\t\\t\\tcontent: '';\\n\\t\\t\\tpointer-events: none;\\n\\t\\t\\tbackground-color: var(--ck-table-selected-cell-background);\\n\\t\\t\\tposition: absolute;\\n\\t\\t\\ttop: 0;\\n\\t\\t\\tleft: 0;\\n\\t\\t\\tright: 0;\\n\\t\\t\\tbottom: 0;\\n\\t\\t}\\n\\n\\t\\t& ::selection,\\n\\t\\t&:focus {\\n\\t\\t\\tbackground-color: transparent;\\n\\t\\t}\\n\\n\\t\\t/*\\n\\t\\t * To reduce the amount of noise, all widgets in the table selection have no outline and no selection handle.\\n\\t\\t * See https://github.com/ckeditor/ckeditor5/issues/9491.\\n\\t\\t */\\n\\t\\t& .ck-widget {\\n\\t\\t\\toutline: unset;\\n\\n\\t\\t\\t& > .ck-widget__selection-handle {\\n\\t\\t\\t\\tdisplay: none;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-button,a.ck.ck-button{align-items:center;display:inline-flex;justify-content:left;position:relative;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.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,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)}.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{-webkit-appearance:none;border:1px solid transparent;cursor:default;font-size:inherit;line-height:1;min-height:var(--ck-ui-component-min-height);min-width:var(--ck-ui-component-min-height);padding:var(--ck-spacing-tiny);text-align:center;transition:box-shadow .2s ease-in-out,border .2s ease-in-out;vertical-align:middle;white-space:nowrap}.ck.ck-button:active,.ck.ck-button:focus,a.ck.ck-button:active,a.ck.ck-button:focus{border:var(--ck-focus-ring);box-shadow:var(--ck-focus-outer-shadow),0 0;outline:none}.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{color:inherit;cursor:inherit;font-size:inherit;font-weight: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,.ck.ck-button.ck-disabled .ck-button__label,a.ck.ck-button.ck-disabled .ck-button__icon,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-left:var(--ck-spacing-small);margin-right:calc(var(--ck-spacing-small)*-1)}.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)}.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-on,a.ck.ck-button.ck-on{color:var(--ck-color-button-on-color)}.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)}.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}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/button/button.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_unselectable.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/button/button.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/mixins/_button.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_focus.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_disabled.css\"],\"names\":[],\"mappings\":\"AAOA,6BAMC,kBAAmB,CADnB,mBAAoB,CAEpB,oBAAqB,CAHrB,iBAAkB,CCFlB,qBAAsB,CACtB,wBAAyB,CACzB,oBAAqB,CACrB,gBDkBD,CAdC,iEACC,YACD,CAGC,yGACC,oBACD,CAID,iFACC,sBACD,CEjBD,6BCAC,oDD4ID,CCzIE,6EACC,0DACD,CAEA,+EACC,2DACD,CAID,qDACC,6DACD,CDfD,6BEDC,eF6ID,CA5IA,wIEGE,qCFyIF,CA5IA,6BA6BC,uBAAwB,CANxB,4BAA6B,CAjB7B,cAAe,CAcf,iBAAkB,CAHlB,aAAc,CAJd,4CAA6C,CAD7C,2CAA4C,CAJ5C,8BAA+B,CAC/B,iBAAkB,CAiBlB,4DAA8D,CAnB9D,qBAAsB,CAFtB,kBAuID,CA7GC,oFGhCA,2BAA2B,CCF3B,2CAA8B,CDC9B,YHqCA,CAIC,kJAEC,aACD,CAGD,iEAIC,aAAc,CACd,cAAe,CAHf,iBAAkB,CAClB,mBAAoB,CAMpB,qBASD,CAlBA,qFAYE,eAMF,CAlBA,qFAgBE,gBAEF,CAEA,yEACC,aAYD,CAbA,6FAIE,mCASF,CAbA,6FAQE,oCAKF,CAbA,yEAWC,eAAiB,CACjB,UACD,CAIC,oIIrFD,oDJyFC,CAOA,gLKhGD,kCLkGC,CAEA,iGACC,UACD,CAGD,qEACC,yDAcD,CAXC,2HAEE,4CAA+C,CAC/C,oCAOF,CAVA,2HAQE,mCAAoC,CADpC,6CAGF,CAKA,mHACC,WACD,CAID,yCC/HA,+CDmIA,CChIC,yFACC,qDACD,CAEA,2FACC,sDACD,CAID,iEACC,wDACD,CDgHA,yCAGC,qCACD,CAEA,2DACC,iCACD,CAEA,+DACC,mCACD,CAID,2CC/IC,mDDoJD,CCjJE,2FACC,yDACD,CAEA,6FACC,0DACD,CAID,mEACC,4DACD,CDgID,2CAIC,wCACD,CAEA,uCAEC,eACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"../../mixins/_unselectable.css\\\";\\n\\n.ck.ck-button,\\na.ck.ck-button {\\n\\t@mixin ck-unselectable;\\n\\n\\tposition: relative;\\n\\tdisplay: inline-flex;\\n\\talign-items: center;\\n\\tjustify-content: left;\\n\\n\\t& .ck-button__label {\\n\\t\\tdisplay: none;\\n\\t}\\n\\n\\t&.ck-button_with-text {\\n\\t\\t& .ck-button__label {\\n\\t\\t\\tdisplay: inline-block;\\n\\t\\t}\\n\\t}\\n\\n\\t/* Center the icon horizontally in a button without text. */\\n\\t&:not(.ck-button_with-text)  {\\n\\t\\tjustify-content: center;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * Makes element unselectable.\\n */\\n@define-mixin ck-unselectable {\\n\\t-moz-user-select: none;\\n\\t-webkit-user-select: none;\\n\\t-ms-user-select: none;\\n\\tuser-select: none\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"../../../mixins/_focus.css\\\";\\n@import \\\"../../../mixins/_shadow.css\\\";\\n@import \\\"../../../mixins/_disabled.css\\\";\\n@import \\\"../../../mixins/_rounded.css\\\";\\n@import \\\"../../mixins/_button.css\\\";\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_dir.css\\\";\\n\\n.ck.ck-button,\\na.ck.ck-button {\\n\\t@mixin ck-button-colors --ck-color-button-default;\\n\\t@mixin ck-rounded-corners;\\n\\n\\twhite-space: nowrap;\\n\\tcursor: default;\\n\\tvertical-align: middle;\\n\\tpadding: var(--ck-spacing-tiny);\\n\\ttext-align: center;\\n\\n\\t/* A very important piece of styling. Go to variable declaration to learn more. */\\n\\tmin-width: var(--ck-ui-component-min-height);\\n\\tmin-height: var(--ck-ui-component-min-height);\\n\\n\\t/* Normalize the height of the line. Removing this will break consistent height\\n\\tamong text and text-less buttons (with icons). */\\n\\tline-height: 1;\\n\\n\\t/* Enable font size inheritance, which allows fluid UI scaling. */\\n\\tfont-size: inherit;\\n\\n\\t/* Avoid flickering when the foucs border shows up. */\\n\\tborder: 1px solid transparent;\\n\\n\\t/* Apply some smooth transition to the box-shadow and border. */\\n\\ttransition: box-shadow .2s ease-in-out, border .2s ease-in-out;\\n\\n\\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/189 */\\n\\t-webkit-appearance: none;\\n\\n\\t&:active,\\n\\t&:focus {\\n\\t\\t@mixin ck-focus-ring;\\n\\t\\t@mixin ck-box-shadow var(--ck-focus-outer-shadow);\\n\\t}\\n\\n\\t/* Allow icon coloring using the text \\\"color\\\" property. */\\n\\t& .ck-button__icon {\\n\\t\\t& use,\\n\\t\\t& use * {\\n\\t\\t\\tcolor: inherit;\\n\\t\\t}\\n\\t}\\n\\n\\t& .ck-button__label {\\n\\t\\t/* Enable font size inheritance, which allows fluid UI scaling. */\\n\\t\\tfont-size: inherit;\\n\\t\\tfont-weight: inherit;\\n\\t\\tcolor: inherit;\\n\\t\\tcursor: inherit;\\n\\n\\t\\t/* Must be consistent with .ck-icon's vertical align. Otherwise, buttons with and\\n\\t\\twithout labels (but with icons) have different sizes in Chrome */\\n\\t\\tvertical-align: middle;\\n\\n\\t\\t@mixin ck-dir ltr {\\n\\t\\t\\ttext-align: left;\\n\\t\\t}\\n\\n\\t\\t@mixin ck-dir rtl {\\n\\t\\t\\ttext-align: right;\\n\\t\\t}\\n\\t}\\n\\n\\t& .ck-button__keystroke {\\n\\t\\tcolor: inherit;\\n\\n\\t\\t@mixin ck-dir ltr {\\n\\t\\t\\tmargin-left: var(--ck-spacing-large);\\n\\t\\t}\\n\\n\\t\\t@mixin ck-dir rtl {\\n\\t\\t\\tmargin-right: var(--ck-spacing-large);\\n\\t\\t}\\n\\n\\t\\tfont-weight: bold;\\n\\t\\topacity: .7;\\n\\t}\\n\\n\\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/70 */\\n\\t&.ck-disabled {\\n\\t\\t&:active,\\n\\t\\t&:focus {\\n\\t\\t\\t/* The disabled button should have a slightly less visible shadow when focused. */\\n\\t\\t\\t@mixin ck-box-shadow var(--ck-focus-disabled-outer-shadow);\\n\\t\\t}\\n\\n\\t\\t& .ck-button__icon {\\n\\t\\t\\t@mixin ck-disabled;\\n\\t\\t}\\n\\n\\t\\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/98 */\\n\\t\\t& .ck-button__label {\\n\\t\\t\\t@mixin ck-disabled;\\n\\t\\t}\\n\\n\\t\\t& .ck-button__keystroke {\\n\\t\\t\\topacity: .3;\\n\\t\\t}\\n\\t}\\n\\n\\t&.ck-button_with-text {\\n\\t\\tpadding: var(--ck-spacing-tiny) var(--ck-spacing-standard);\\n\\n\\t\\t/* stylelint-disable-next-line no-descending-specificity */\\n\\t\\t& .ck-button__icon {\\n\\t\\t\\t@mixin ck-dir ltr {\\n\\t\\t\\t\\tmargin-left: calc(-1 * var(--ck-spacing-small));\\n\\t\\t\\t\\tmargin-right: var(--ck-spacing-small);\\n\\t\\t\\t}\\n\\n\\t\\t\\t@mixin ck-dir rtl {\\n\\t\\t\\t\\tmargin-right: calc(-1 * var(--ck-spacing-small));\\n\\t\\t\\t\\tmargin-left: var(--ck-spacing-small);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t&.ck-button_with-keystroke {\\n\\t\\t/* stylelint-disable-next-line no-descending-specificity */\\n\\t\\t& .ck-button__label {\\n\\t\\t\\tflex-grow: 1;\\n\\t\\t}\\n\\t}\\n\\n\\t/* A style of the button which is currently on, e.g. its feature is active. */\\n\\t&.ck-on {\\n\\t\\t@mixin ck-button-colors --ck-color-button-on;\\n\\n\\t\\tcolor: var(--ck-color-button-on-color);\\n\\t}\\n\\n\\t&.ck-button-save {\\n\\t\\tcolor: var(--ck-color-button-save);\\n\\t}\\n\\n\\t&.ck-button-cancel {\\n\\t\\tcolor: var(--ck-color-button-cancel);\\n\\t}\\n}\\n\\n/* A style of the button which handles the primary action. */\\n.ck.ck-button-action,\\na.ck.ck-button-action {\\n\\t@mixin ck-button-colors --ck-color-button-action;\\n\\n\\tcolor: var(--ck-color-button-action-text);\\n}\\n\\n.ck.ck-button-bold,\\na.ck.ck-button-bold {\\n\\tfont-weight: bold;\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * Implements a button of given background color.\\n *\\n * @param {String} $background - Background color of the button.\\n * @param {String} $border - Border color of the button.\\n */\\n@define-mixin ck-button-colors $prefix {\\n\\tbackground: var($(prefix)-background);\\n\\n\\t&:not(.ck-disabled) {\\n\\t\\t&:hover {\\n\\t\\t\\tbackground: var($(prefix)-hover-background);\\n\\t\\t}\\n\\n\\t\\t&:active {\\n\\t\\t\\tbackground: var($(prefix)-active-background);\\n\\t\\t}\\n\\t}\\n\\n\\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/98 */\\n\\t&.ck-disabled {\\n\\t\\tbackground: var($(prefix)-disabled-background);\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * Implements rounded corner interface for .ck-rounded-corners class.\\n *\\n * @see $ck-border-radius\\n */\\n@define-mixin ck-rounded-corners {\\n\\tborder-radius: 0;\\n\\n\\t@nest .ck-rounded-corners &,\\n\\t&.ck-rounded-corners {\\n\\t\\tborder-radius: var(--ck-border-radius);\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * A visual style of focused element's border.\\n */\\n@define-mixin ck-focus-ring {\\n\\t/* Disable native outline. */\\n\\toutline: none;\\n\\tborder: var(--ck-focus-ring)\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * A helper to combine multiple shadows.\\n */\\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\\n\\tbox-shadow: $shadowA, $shadowB;\\n}\\n\\n/**\\n * Gives an element a drop shadow so it looks like a floating panel.\\n */\\n@define-mixin ck-drop-shadow {\\n\\t@mixin ck-box-shadow var(--ck-drop-shadow);\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * A class which indicates that an element holding it is disabled.\\n */\\n@define-mixin ck-disabled {\\n\\topacity: var(--ck-disabled-opacity);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".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:calc(1.07692em + 1px);--ck-switch-button-translation:calc(var(--ck-switch-button-toggle-width) - var(--ck-switch-button-toggle-inner-size) - 2px);--ck-switch-button-inner-hover-shadow:0 0 0 5px var(--ck-color-switch-button-inner-shadow)}.ck.ck-button.ck-switchbutton,.ck.ck-button.ck-switchbutton.ck-on:active,.ck.ck-button.ck-switchbutton.ck-on:focus,.ck.ck-button.ck-switchbutton.ck-on:hover,.ck.ck-button.ck-switchbutton:active,.ck.ck-button.ck-switchbutton:focus,.ck.ck-button.ck-switchbutton:hover{background:transparent;color:inherit}[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{background:var(--ck-color-switch-button-off-background);border:1px solid transparent;transition:background .4s ease,box-shadow .2s ease-in-out,outline .2s ease-in-out;width:var(--ck-switch-button-toggle-width)}.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)*.5)}.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner{background:var(--ck-color-switch-button-inner-background);height:var(--ck-switch-button-toggle-inner-size);transition:all .3s ease;width:var(--ck-switch-button-toggle-inner-size)}.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:var(--ck-switch-button-inner-hover-shadow)}.ck.ck-button.ck-switchbutton.ck-disabled .ck-button__toggle{opacity:var(--ck-disabled-opacity)}.ck.ck-button.ck-switchbutton:focus{border-color:transparent;box-shadow:none;outline:none}.ck.ck-button.ck-switchbutton:focus .ck-button__toggle{box-shadow:0 0 0 1px var(--ck-color-base-background),0 0 0 5px var(--ck-color-focus-outer-shadow);outline:var(--ck-focus-ring);outline-offset:1px}.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))}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/button/switchbutton.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/button/switchbutton.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_disabled.css\"],\"names\":[],\"mappings\":\"AASE,4HACC,aACD,CCCF,MAEC,8CAA+C,CAE/C,0DAAgE,CAChE,2HAIC,CACD,0FACD,CAOC,0QAEC,sBAAuB,CADvB,aAED,CAEA,0DAGE,4CAOF,CAVA,0DAQE,2CAEF,CAEA,iDCpCA,eD4EA,CAxCA,yIChCC,qCDwED,CAxCA,2DAKE,gBAmCF,CAxCA,2DAUE,iBA8BF,CAxCA,iDAkBC,uDAAwD,CAFxD,4BAA6B,CAD7B,iFAAsF,CAEtF,0CAuBD,CApBC,2ECxDD,eDmEC,CAXA,6LCpDA,qCAAsC,CDsDpC,8CASF,CAXA,2EAOC,yDAA0D,CAD1D,gDAAiD,CAIjD,uBAA0B,CAL1B,+CAMD,CAEA,uDACC,6DAKD,CAHC,iFACC,qDACD,CAIF,6DEhFA,kCFkFA,CAGA,oCACC,wBAAyB,CAEzB,eAAgB,CADhB,YAQD,CALC,uDACC,iGAAmG,CAEnG,4BAA6B,CAD7B,kBAED,CAKA,uDACC,sDAkBD,CAhBC,6DACC,4DACD,CAEA,2FAKE,2DAMF,CAXA,2FASE,oEAEF\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-button.ck-switchbutton {\\n\\t& .ck-button__toggle {\\n\\t\\tdisplay: block;\\n\\n\\t\\t& .ck-button__toggle__inner {\\n\\t\\t\\tdisplay: block;\\n\\t\\t}\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"../../../mixins/_rounded.css\\\";\\n@import \\\"../../../mixins/_disabled.css\\\";\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_dir.css\\\";\\n\\n/* Note: To avoid rendering issues (aliasing) but to preserve the responsive nature\\nof the component, floating–point numbers have been used which, for the default font size\\n(see: --ck-font-size-base), will generate simple integers. */\\n:root {\\n\\t/* 34px at 13px font-size */\\n\\t--ck-switch-button-toggle-width: 2.6153846154em;\\n\\t/* 14px at 13px font-size */\\n\\t--ck-switch-button-toggle-inner-size: calc(1.0769230769em + 1px);\\n\\t--ck-switch-button-translation: calc(\\n\\t\\tvar(--ck-switch-button-toggle-width) -\\n\\t\\tvar(--ck-switch-button-toggle-inner-size) -\\n\\t\\t2px /* Border */\\n\\t);\\n\\t--ck-switch-button-inner-hover-shadow: 0 0 0 5px var(--ck-color-switch-button-inner-shadow);\\n}\\n\\n.ck.ck-button.ck-switchbutton {\\n\\t/* Unlike a regular button, the switch button text color and background should never change.\\n\\t * Changing toggle switch (background, outline) is enough to carry the information about the\\n\\t * state of the entire component (https://github.com/ckeditor/ckeditor5/issues/12519)\\n\\t */\\n\\t&, &:hover, &:focus, &:active, &.ck-on:hover, &.ck-on:focus, &.ck-on:active {\\n\\t\\tcolor: inherit;\\n\\t\\tbackground: transparent;\\n\\t}\\n\\n\\t& .ck-button__label {\\n\\t\\t@mixin ck-dir ltr {\\n\\t\\t\\t/* Separate the label from the switch */\\n\\t\\t\\tmargin-right: calc(2 * var(--ck-spacing-large));\\n\\t\\t}\\n\\n\\t\\t@mixin ck-dir rtl {\\n\\t\\t\\t/* Separate the label from the switch */\\n\\t\\t\\tmargin-left: calc(2 * var(--ck-spacing-large));\\n\\t\\t}\\n\\t}\\n\\n\\t& .ck-button__toggle {\\n\\t\\t@mixin ck-rounded-corners;\\n\\n\\t\\t@mixin ck-dir ltr {\\n\\t\\t\\t/* Make sure the toggle is always to the right as far as possible. */\\n\\t\\t\\tmargin-left: auto;\\n\\t\\t}\\n\\n\\t\\t@mixin ck-dir rtl {\\n\\t\\t\\t/* Make sure the toggle is always to the left as far as possible. */\\n\\t\\t\\tmargin-right: auto;\\n\\t\\t}\\n\\n\\t\\t/* Apply some smooth transition to the box-shadow and border. */\\n\\t\\t/* Gently animate the background color of the toggle switch */\\n\\t\\ttransition: background 400ms ease, box-shadow .2s ease-in-out, outline .2s ease-in-out;\\n\\t\\tborder: 1px solid transparent;\\n\\t\\twidth: var(--ck-switch-button-toggle-width);\\n\\t\\tbackground: var(--ck-color-switch-button-off-background);\\n\\n\\t\\t& .ck-button__toggle__inner {\\n\\t\\t\\t@mixin ck-rounded-corners {\\n\\t\\t\\t\\tborder-radius: calc(.5 * var(--ck-border-radius));\\n\\t\\t\\t}\\n\\n\\t\\t\\twidth: var(--ck-switch-button-toggle-inner-size);\\n\\t\\t\\theight: var(--ck-switch-button-toggle-inner-size);\\n\\t\\t\\tbackground: var(--ck-color-switch-button-inner-background);\\n\\n\\t\\t\\t/* Gently animate the inner part of the toggle switch */\\n\\t\\t\\ttransition: all 300ms ease;\\n\\t\\t}\\n\\n\\t\\t&:hover {\\n\\t\\t\\tbackground: var(--ck-color-switch-button-off-hover-background);\\n\\n\\t\\t\\t& .ck-button__toggle__inner {\\n\\t\\t\\t\\tbox-shadow: var(--ck-switch-button-inner-hover-shadow);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t&.ck-disabled .ck-button__toggle {\\n\\t\\t@mixin ck-disabled;\\n\\t}\\n\\n\\t/* Overriding default .ck-button:focus styles + an outline around the toogle */\\n\\t&:focus {\\n\\t\\tborder-color: transparent;\\n\\t\\toutline: none;\\n\\t\\tbox-shadow: none;\\n\\n\\t\\t& .ck-button__toggle {\\n\\t\\t\\tbox-shadow: 0 0 0 1px var(--ck-color-base-background), 0 0 0 5px var(--ck-color-focus-outer-shadow);\\n\\t\\t\\toutline-offset: 1px;\\n\\t\\t\\toutline: var(--ck-focus-ring);\\n\\t\\t}\\n\\t}\\n\\n\\t/* stylelint-disable-next-line no-descending-specificity */\\n\\t&.ck-on {\\n\\t\\t& .ck-button__toggle {\\n\\t\\t\\tbackground: var(--ck-color-switch-button-on-background);\\n\\n\\t\\t\\t&:hover {\\n\\t\\t\\t\\tbackground: var(--ck-color-switch-button-on-hover-background);\\n\\t\\t\\t}\\n\\n\\t\\t\\t& .ck-button__toggle__inner {\\n\\t\\t\\t\\t/*\\n\\t\\t\\t\\t* Move the toggle switch to the right. It will be animated.\\n\\t\\t\\t\\t*/\\n\\t\\t\\t\\t@mixin ck-dir ltr {\\n\\t\\t\\t\\t\\ttransform: translateX( var( --ck-switch-button-translation ) );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t@mixin ck-dir rtl {\\n\\t\\t\\t\\t\\ttransform: translateX( calc( -1 * var( --ck-switch-button-translation ) ) );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * Implements rounded corner interface for .ck-rounded-corners class.\\n *\\n * @see $ck-border-radius\\n */\\n@define-mixin ck-rounded-corners {\\n\\tborder-radius: 0;\\n\\n\\t@nest .ck-rounded-corners &,\\n\\t&.ck-rounded-corners {\\n\\t\\tborder-radius: var(--ck-border-radius);\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * A class which indicates that an element holding it is disabled.\\n */\\n@define-mixin ck-disabled {\\n\\topacity: var(--ck-disabled-opacity);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-color-grid{display:grid}:root{--ck-color-grid-tile-size:24px;--ck-color-color-grid-check-icon:#166fd4}.ck.ck-color-grid{grid-gap:5px;padding:8px}.ck.ck-color-grid__tile{border:0;height:var(--ck-color-grid-tile-size);min-height:var(--ck-color-grid-tile-size);min-width:var(--ck-color-grid-tile-size);padding:0;transition:box-shadow .2s ease;width:var(--ck-color-grid-tile-size)}.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{color:var(--ck-color-color-grid-check-icon);display:none}.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)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/colorgrid/colorgrid.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/colorgrid/colorgrid.css\"],\"names\":[],\"mappings\":\"AAKA,kBACC,YACD,CCAA,MACC,8BAA+B,CAK/B,wCACD,CAEA,kBACC,YAAa,CACb,WACD,CAEA,wBAOC,QAAS,CALT,qCAAsC,CAEtC,yCAA0C,CAD1C,wCAAyC,CAEzC,SAAU,CACV,8BAA+B,CAL/B,oCAyCD,CAjCC,oCACC,YAAa,CACb,gBACD,CAEA,4DACC,gDACD,CAEA,oCAEC,2CAA4C,CAD5C,YAED,CAEA,8BACC,8FAKD,CAHC,0CACC,aACD,CAGD,8HAIC,QACD,CAEA,gGAEC,iGACD,CAGD,yBACC,oCACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-color-grid {\\n\\tdisplay: grid;\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"../../../mixins/_rounded.css\\\";\\n\\n:root {\\n\\t--ck-color-grid-tile-size: 24px;\\n\\n\\t/* Not using global colors here because these may change but some colors in a pallette\\n\\t * require special treatment. For instance, this ensures no matter what the UI text color is,\\n\\t * the check icon will look good on the black color tile. */\\n\\t--ck-color-color-grid-check-icon: hsl(212, 81%, 46%);\\n}\\n\\n.ck.ck-color-grid {\\n\\tgrid-gap: 5px;\\n\\tpadding: 8px;\\n}\\n\\n.ck.ck-color-grid__tile {\\n\\twidth: var(--ck-color-grid-tile-size);\\n\\theight: var(--ck-color-grid-tile-size);\\n\\tmin-width: var(--ck-color-grid-tile-size);\\n\\tmin-height: var(--ck-color-grid-tile-size);\\n\\tpadding: 0;\\n\\ttransition: .2s ease box-shadow;\\n\\tborder: 0;\\n\\n\\t&.ck-disabled {\\n\\t\\tcursor: unset;\\n\\t\\ttransition: unset;\\n\\t}\\n\\n\\t&.ck-color-table__color-tile_bordered {\\n\\t\\tbox-shadow: 0 0 0 1px var(--ck-color-base-border);\\n\\t}\\n\\n\\t& .ck.ck-icon {\\n\\t\\tdisplay: none;\\n\\t\\tcolor: var(--ck-color-color-grid-check-icon);\\n\\t}\\n\\n\\t&.ck-on {\\n\\t\\tbox-shadow: inset 0 0 0 1px var(--ck-color-base-background), 0 0 0 2px var(--ck-color-base-text);\\n\\n\\t\\t& .ck.ck-icon {\\n\\t\\t\\tdisplay: block;\\n\\t\\t}\\n\\t}\\n\\n\\t&.ck-on,\\n\\t&:focus:not( .ck-disabled ),\\n\\t&:hover:not( .ck-disabled ) {\\n\\t\\t/* Disable the default .ck-button's border ring. */\\n\\t\\tborder: 0;\\n\\t}\\n\\n\\t&:focus:not( .ck-disabled ),\\n\\t&:hover:not( .ck-disabled ) {\\n\\t\\tbox-shadow: inset 0 0 0 1px var(--ck-color-base-background), 0 0 0 2px var(--ck-color-focus-border);\\n\\t}\\n}\\n\\n.ck.ck-color-grid__label {\\n\\tpadding: 0 var(--ck-spacing-standard);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".color-picker-hex-input{width:max-content}.color-picker-hex-input .ck.ck-input{min-width:unset}.ck.ck-color-picker__row{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}.ck.ck-color-picker__row .ck-color-picker__hash-view{padding-right:var(--ck-spacing-medium);padding-top:var(--ck-spacing-tiny)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/colorpicker/colorpicker.css\"],\"names\":[],\"mappings\":\"AAKA,wBACC,iBAKD,CAHC,qCACC,eACD,CAGD,yBACC,YAAa,CACb,kBAAmB,CACnB,gBAAiB,CACjB,6BAMD,CAJC,qDAEC,sCAAuC,CADvC,kCAED\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.color-picker-hex-input {\\n\\twidth: max-content;\\n\\n\\t& .ck.ck-input {\\n\\t\\tmin-width: unset;\\n\\t}\\n}\\n\\n.ck.ck-color-picker__row {\\n\\tdisplay: flex;\\n\\tflex-direction: row;\\n\\tflex-wrap: nowrap;\\n\\tjustify-content: space-between;\\n\\n\\t& .ck-color-picker__hash-view {\\n\\t\\tpadding-top: var(--ck-spacing-tiny);\\n\\t\\tpadding-right: var(--ck-spacing-medium);\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":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-dropdown__panel{display:none;max-width:var(--ck-dropdown-max-width);position:absolute;z-index:var(--ck-z-modal)}.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{bottom:auto;top:100%}.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{margin-left:var(--ck-spacing-standard);right: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{overflow:hidden;text-overflow:ellipsis;width:7em}.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{background:var(--ck-color-dropdown-panel-background);border:1px solid var(--ck-color-dropdown-panel-border);bottom:0;box-shadow:var(--ck-drop-shadow),0 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}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/dropdown.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/dropdown.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_disabled.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css\"],\"names\":[],\"mappings\":\"AAKA,MACC,4BACD,CAEA,gBACC,oBAAqB,CACrB,iBA2ED,CAzEC,oCACC,mBAAoB,CACpB,2BACD,CAGA,+CACC,UACD,CAEA,oCACC,YAAa,CAEb,sCAAuC,CAEvC,iBAAkB,CAHlB,yBA4DD,CAvDC,+DACC,oBACD,CAEA,mSAKC,WACD,CAEA,mSAUC,WAAY,CADZ,QAED,CAEA,oHAEC,MACD,CAEA,oHAEC,OACD,CAEA,kHAGC,QAAS,CACT,0BACD,CAEA,sHAGC,QAAS,CACT,0BACD,CAEA,sHAGC,QAAS,CACT,0BACD,CAQF,mCACC,mCACD,CCpFA,MACC,sDACD,CAEA,gBAEC,iBA2ED,CAzEC,oCACC,mCACD,CAGC,8CAIC,sCAAuC,CAHvC,gCAID,CAIA,8CACC,+BAAgC,CAGhC,oCACD,CAGD,gDC/BA,kCDiCA,CAIE,mFAEC,oCACD,CAIA,mFAEC,qCACD,CAID,iEAEC,eAAgB,CAChB,sBAAuB,CAFvB,SAGD,CAGA,6EC1DD,kCD4DC,CAGA,qDACC,2BAA4B,CAC5B,4BACD,CAEA,sGACC,UACD,CAGA,yHAEC,eAKD,CAHC,qIE7EF,2CF+EE,CAKH,uBGlFC,eH8GD,CA5BA,qFG9EE,qCH0GF,CA5BA,uBAIC,oDAAqD,CACrD,sDAAuD,CACvD,QAAS,CE1FT,oCAA8B,CF6F9B,cAmBD,CAfC,6CACC,wBACD,CAEA,6CACC,yBACD,CAEA,6CACC,2BACD,CAEA,6CACC,4BACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-dropdown-max-width: 75vw;\\n}\\n\\n.ck.ck-dropdown {\\n\\tdisplay: inline-block;\\n\\tposition: relative;\\n\\n\\t& .ck-dropdown__arrow {\\n\\t\\tpointer-events: none;\\n\\t\\tz-index: var(--ck-z-default);\\n\\t}\\n\\n\\t/* Dropdown button should span horizontally, e.g. in vertical toolbars */\\n\\t& .ck-button.ck-dropdown__button {\\n\\t\\twidth: 100%;\\n\\t}\\n\\n\\t& .ck-dropdown__panel {\\n\\t\\tdisplay: none;\\n\\t\\tz-index: var(--ck-z-modal);\\n\\t\\tmax-width: var(--ck-dropdown-max-width);\\n\\n\\t\\tposition: absolute;\\n\\n\\t\\t&.ck-dropdown__panel-visible {\\n\\t\\t\\tdisplay: inline-block;\\n\\t\\t}\\n\\n\\t\\t&.ck-dropdown__panel_ne,\\n\\t\\t&.ck-dropdown__panel_nw,\\n\\t\\t&.ck-dropdown__panel_n,\\n\\t\\t&.ck-dropdown__panel_nmw,\\n\\t\\t&.ck-dropdown__panel_nme {\\n\\t\\t\\tbottom: 100%;\\n\\t\\t}\\n\\n\\t\\t&.ck-dropdown__panel_se,\\n\\t\\t&.ck-dropdown__panel_sw,\\n\\t\\t&.ck-dropdown__panel_smw,\\n\\t\\t&.ck-dropdown__panel_sme,\\n\\t\\t&.ck-dropdown__panel_s {\\n\\t\\t\\t/*\\n\\t\\t\\t * Using transform: translate3d( 0, 100%, 0 ) causes blurry dropdown on Chrome 67-78+ on non-retina displays.\\n\\t\\t\\t * See https://github.com/ckeditor/ckeditor5/issues/1053.\\n\\t\\t\\t */\\n\\t\\t\\ttop: 100%;\\n\\t\\t\\tbottom: auto;\\n\\t\\t}\\n\\n\\t\\t&.ck-dropdown__panel_ne,\\n\\t\\t&.ck-dropdown__panel_se {\\n\\t\\t\\tleft: 0px;\\n\\t\\t}\\n\\n\\t\\t&.ck-dropdown__panel_nw,\\n\\t\\t&.ck-dropdown__panel_sw {\\n\\t\\t\\tright: 0px;\\n\\t\\t}\\n\\n\\t\\t&.ck-dropdown__panel_s,\\n\\t\\t&.ck-dropdown__panel_n {\\n\\t\\t\\t/* Positioning panels relative to the center of the button */\\n\\t\\t\\tleft: 50%;\\n\\t\\t\\ttransform: translateX(-50%);\\n\\t\\t}\\n\\n\\t\\t&.ck-dropdown__panel_nmw,\\n\\t\\t&.ck-dropdown__panel_smw {\\n\\t\\t\\t/* Positioning panels relative to the middle-west of the button */\\n\\t\\t\\tleft: 75%;\\n\\t\\t\\ttransform: translateX(-75%);\\n\\t\\t}\\n\\n\\t\\t&.ck-dropdown__panel_nme,\\n\\t\\t&.ck-dropdown__panel_sme {\\n\\t\\t\\t/* Positioning panels relative to the middle-east of the button */\\n\\t\\t\\tleft: 25%;\\n\\t\\t\\ttransform: translateX(-25%);\\n\\t\\t}\\n\\t}\\n}\\n\\n/*\\n * Toolbar dropdown panels should be always above the UI (eg. other dropdown panels) from the editor's content.\\n * See https://github.com/ckeditor/ckeditor5/issues/7874\\n */\\n.ck.ck-toolbar .ck-dropdown__panel {\\n\\tz-index: calc( var(--ck-z-modal) + 1 );\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"../../../mixins/_rounded.css\\\";\\n@import \\\"../../../mixins/_disabled.css\\\";\\n@import \\\"../../../mixins/_shadow.css\\\";\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_dir.css\\\";\\n\\n:root {\\n\\t--ck-dropdown-arrow-size: calc(0.5 * var(--ck-icon-size));\\n}\\n\\n.ck.ck-dropdown {\\n\\t/* Enable font size inheritance, which allows fluid UI scaling. */\\n\\tfont-size: inherit;\\n\\n\\t& .ck-dropdown__arrow {\\n\\t\\twidth: var(--ck-dropdown-arrow-size);\\n\\t}\\n\\n\\t@mixin ck-dir ltr {\\n\\t\\t& .ck-dropdown__arrow {\\n\\t\\t\\tright: var(--ck-spacing-standard);\\n\\n\\t\\t\\t/* A space to accommodate the triangle. */\\n\\t\\t\\tmargin-left: var(--ck-spacing-standard);\\n\\t\\t}\\n\\t}\\n\\n\\t@mixin ck-dir rtl {\\n\\t\\t& .ck-dropdown__arrow {\\n\\t\\t\\tleft: var(--ck-spacing-standard);\\n\\n\\t\\t\\t/* A space to accommodate the triangle. */\\n\\t\\t\\tmargin-right: var(--ck-spacing-small);\\n\\t\\t}\\n\\t}\\n\\n\\t&.ck-disabled .ck-dropdown__arrow {\\n\\t\\t@mixin ck-disabled;\\n\\t}\\n\\n\\t& .ck-button.ck-dropdown__button {\\n\\t\\t@mixin ck-dir ltr {\\n\\t\\t\\t&:not(.ck-button_with-text) {\\n\\t\\t\\t\\t/* Make sure dropdowns with just an icon have the right inner spacing */\\n\\t\\t\\t\\tpadding-left: var(--ck-spacing-small);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t@mixin ck-dir rtl {\\n\\t\\t\\t&:not(.ck-button_with-text) {\\n\\t\\t\\t\\t/* Make sure dropdowns with just an icon have the right inner spacing */\\n\\t\\t\\t\\tpadding-right: var(--ck-spacing-small);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t/* #23 */\\n\\t\\t& .ck-button__label {\\n\\t\\t\\twidth: 7em;\\n\\t\\t\\toverflow: hidden;\\n\\t\\t\\ttext-overflow: ellipsis;\\n\\t\\t}\\n\\n\\t\\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/70 */\\n\\t\\t&.ck-disabled .ck-button__label {\\n\\t\\t\\t@mixin ck-disabled;\\n\\t\\t}\\n\\n\\t\\t/* https://github.com/ckeditor/ckeditor5/issues/816 */\\n\\t\\t&.ck-on {\\n\\t\\t\\tborder-bottom-left-radius: 0;\\n\\t\\t\\tborder-bottom-right-radius: 0;\\n\\t\\t}\\n\\n\\t\\t&.ck-dropdown__button_label-width_auto .ck-button__label {\\n\\t\\t\\twidth: auto;\\n\\t\\t}\\n\\n\\t\\t/* https://github.com/ckeditor/ckeditor5/issues/8699 */\\n\\t\\t&.ck-off:active,\\n\\t\\t&.ck-on:active {\\n\\t\\t\\tbox-shadow: none;\\n\\t\\t\\t\\n\\t\\t\\t&:focus {\\n\\t\\t\\t\\t@mixin ck-box-shadow var(--ck-focus-outer-shadow);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\\n.ck.ck-dropdown__panel {\\n\\t@mixin ck-rounded-corners;\\n\\t@mixin ck-drop-shadow;\\n\\n\\tbackground: var(--ck-color-dropdown-panel-background);\\n\\tborder: 1px solid var(--ck-color-dropdown-panel-border);\\n\\tbottom: 0;\\n\\n\\t/* Make sure the panel is at least as wide as the drop-down's button. */\\n\\tmin-width: 100%;\\n\\n\\t/* Disabled corner border radius to be consistent with the .dropdown__button\\n\\thttps://github.com/ckeditor/ckeditor5/issues/816 */\\n\\t&.ck-dropdown__panel_se {\\n\\t\\tborder-top-left-radius: 0;\\n\\t}\\n\\n\\t&.ck-dropdown__panel_sw {\\n\\t\\tborder-top-right-radius: 0;\\n\\t}\\n\\n\\t&.ck-dropdown__panel_ne {\\n\\t\\tborder-bottom-left-radius: 0;\\n\\t}\\n\\n\\t&.ck-dropdown__panel_nw {\\n\\t\\tborder-bottom-right-radius: 0;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * A class which indicates that an element holding it is disabled.\\n */\\n@define-mixin ck-disabled {\\n\\topacity: var(--ck-disabled-opacity);\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * A helper to combine multiple shadows.\\n */\\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\\n\\tbox-shadow: $shadowA, $shadowB;\\n}\\n\\n/**\\n * Gives an element a drop shadow so it looks like a floating panel.\\n */\\n@define-mixin ck-drop-shadow {\\n\\t@mixin ck-box-shadow var(--ck-drop-shadow);\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * Implements rounded corner interface for .ck-rounded-corners class.\\n *\\n * @see $ck-border-radius\\n */\\n@define-mixin ck-rounded-corners {\\n\\tborder-radius: 0;\\n\\n\\t@nest .ck-rounded-corners &,\\n\\t&.ck-rounded-corners {\\n\\t\\tborder-radius: var(--ck-border-radius);\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".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-bottom-left-radius:0;border-bottom-right-radius:0;border-top-left-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}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/listdropdown.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css\"],\"names\":[],\"mappings\":\"AAOA,6CCIC,eDqBD,CAzBA,iICQE,qCAAsC,CDJtC,wBAqBF,CAfE,mFCND,eDYC,CANA,6MCFA,qCAAsC,CDKpC,2BAA4B,CAC5B,4BAA6B,CAF7B,wBAIF,CAEA,kFCdD,eDmBC,CALA,2MCVA,qCAAsC,CDYpC,wBAAyB,CACzB,yBAEF\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"../../../mixins/_rounded.css\\\";\\n\\n.ck.ck-dropdown .ck-dropdown__panel .ck-list {\\n\\t/* Disabled radius of top-left border to be consistent with .dropdown__button\\n\\thttps://github.com/ckeditor/ckeditor5/issues/816 */\\n\\t@mixin ck-rounded-corners {\\n\\t\\tborder-top-left-radius: 0;\\n\\t}\\n\\n\\t/* Make sure the button belonging to the first/last child of the list goes well with the\\n\\tborder radius of the entire panel. */\\n\\t& .ck-list__item {\\n\\t\\t&:first-child .ck-button {\\n\\t\\t\\t@mixin ck-rounded-corners {\\n\\t\\t\\t\\tborder-top-left-radius: 0;\\n\\t\\t\\t\\tborder-bottom-left-radius: 0;\\n\\t\\t\\t\\tborder-bottom-right-radius: 0;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t&:last-child .ck-button {\\n\\t\\t\\t@mixin ck-rounded-corners {\\n\\t\\t\\t\\tborder-top-left-radius: 0;\\n\\t\\t\\t\\tborder-top-right-radius: 0;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * Implements rounded corner interface for .ck-rounded-corners class.\\n *\\n * @see $ck-border-radius\\n */\\n@define-mixin ck-rounded-corners {\\n\\tborder-radius: 0;\\n\\n\\t@nest .ck-rounded-corners &,\\n\\t&.ck-rounded-corners {\\n\\t\\tborder-radius: var(--ck-border-radius);\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-splitbutton{font-size:inherit}.ck.ck-splitbutton .ck-splitbutton__action:focus{z-index:calc(var(--ck-z-default) + 1)}: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-bottom-right-radius:unset;border-top-right-radius:unset}[dir=rtl] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__action,[dir=rtl] .ck.ck-splitbutton:hover>.ck-splitbutton__action{border-bottom-left-radius:unset;border-top-left-radius:unset}.ck.ck-splitbutton>.ck-splitbutton__arrow{min-width:unset}[dir=ltr] .ck.ck-splitbutton>.ck-splitbutton__arrow{border-bottom-left-radius:unset;border-top-left-radius:unset}[dir=rtl] .ck.ck-splitbutton>.ck-splitbutton__arrow{border-bottom-right-radius:unset;border-top-right-radius:unset}.ck.ck-splitbutton>.ck-splitbutton__arrow svg{width:var(--ck-dropdown-arrow-size)}.ck.ck-splitbutton>.ck-splitbutton__arrow:not(:focus){border-bottom-width:0;border-top-width:0}.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{background-color:var(--ck-color-split-button-hover-border);content:\\\"\\\";height:100%;position:absolute;width:1px}.ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow:focus:after,.ck.ck-splitbutton:hover>.ck-splitbutton__arrow:focus:after{--ck-color-split-button-hover-border:var(--ck-color-focus-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}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/splitbutton.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/splitbutton.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css\"],\"names\":[],\"mappings\":\"AAKA,mBAEC,iBAKD,CAHC,iDACC,qCACD,CCJD,MACC,gDAAyD,CACzD,4CACD,CAMC,oIAKE,gCAAiC,CADjC,6BASF,CAbA,oIAWE,+BAAgC,CADhC,4BAGF,CAEA,0CAGC,eAiBD,CApBA,oDAQE,+BAAgC,CADhC,4BAaF,CApBA,oDAcE,gCAAiC,CADjC,6BAOF,CAHC,8CACC,mCACD,CAKD,sDAEC,qBAAwB,CADxB,kBAED,CAQC,0KACC,wDACD,CAIA,8JAKC,0DAA2D,CAJ3D,UAAW,CAGX,WAAY,CAFZ,iBAAkB,CAClB,SAGD,CAGA,sIACC,iEACD,CAGC,kLACC,SACD,CAIA,kLACC,UACD,CAMF,uCCzFA,eDmGA,CAVA,qHCrFC,qCD+FD,CARE,qKACC,2BACD,CAEA,mKACC,4BACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-splitbutton {\\n\\t/* Enable font size inheritance, which allows fluid UI scaling. */\\n\\tfont-size: inherit;\\n\\n\\t& .ck-splitbutton__action:focus {\\n\\t\\tz-index: calc(var(--ck-z-default) + 1);\\n\\t}\\n}\\n\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"../../../mixins/_rounded.css\\\";\\n\\n:root {\\n\\t--ck-color-split-button-hover-background: hsl(0, 0%, 92%);\\n\\t--ck-color-split-button-hover-border: hsl(0, 0%, 70%);\\n}\\n\\n.ck.ck-splitbutton {\\n\\t/*\\n\\t * Note: ck-rounded and ck-dir mixins don't go together (because they both use @nest).\\n\\t */\\n\\t&:hover > .ck-splitbutton__action,\\n\\t&.ck-splitbutton_open > .ck-splitbutton__action {\\n\\t\\t@nest [dir=\\\"ltr\\\"] & {\\n\\t\\t\\t/* Don't round the action button on the right side */\\n\\t\\t\\tborder-top-right-radius: unset;\\n\\t\\t\\tborder-bottom-right-radius: unset;\\n\\t\\t}\\n\\n\\t\\t@nest [dir=\\\"rtl\\\"] & {\\n\\t\\t\\t/* Don't round the action button on the left side */\\n\\t\\t\\tborder-top-left-radius: unset;\\n\\t\\t\\tborder-bottom-left-radius: unset;\\n\\t\\t}\\n\\t}\\n\\n\\t& > .ck-splitbutton__arrow {\\n\\t\\t/* It's a text-less button and since the icon is positioned absolutely in such situation,\\n\\t\\tit must get some arbitrary min-width. */\\n\\t\\tmin-width: unset;\\n\\n\\t\\t@nest [dir=\\\"ltr\\\"] & {\\n\\t\\t\\t/* Don't round the arrow button on the left side */\\n\\t\\t\\tborder-top-left-radius: unset;\\n\\t\\t\\tborder-bottom-left-radius: unset;\\n\\t\\t}\\n\\n\\t\\t@nest [dir=\\\"rtl\\\"] & {\\n\\t\\t\\t/* Don't round the arrow button on the right side */\\n\\t\\t\\tborder-top-right-radius: unset;\\n\\t\\t\\tborder-bottom-right-radius: unset;\\n\\t\\t}\\n\\n\\t\\t& svg {\\n\\t\\t\\twidth: var(--ck-dropdown-arrow-size);\\n\\t\\t}\\n\\t}\\n\\n\\t/* Make sure the divider stretches 100% height of the button\\n\\thttps://github.com/ckeditor/ckeditor5/issues/10936 */\\n\\t& > .ck-splitbutton__arrow:not(:focus) {\\n\\t\\tborder-top-width: 0px;\\n\\t\\tborder-bottom-width: 0px;\\n\\t}\\n\\n\\t/* When the split button is \\\"open\\\" (the arrow is on) or being hovered, it should get some styling\\n\\tas a whole. The background of both buttons should stand out and there should be a visual\\n\\tseparation between both buttons. */\\n\\t&.ck-splitbutton_open,\\n\\t&:hover {\\n\\t\\t/* When the split button hovered as a whole, not as individual buttons. */\\n\\t\\t& > .ck-button:not(.ck-on):not(.ck-disabled):not(:hover) {\\n\\t\\t\\tbackground: var(--ck-color-split-button-hover-background);\\n\\t\\t}\\n\\n\\t\\t/* Splitbutton separator needs to be set with the ::after pseudoselector\\n\\t\\tto display properly the borders on focus */\\n\\t\\t& > .ck-splitbutton__arrow:not(.ck-disabled)::after {\\n\\t\\t\\tcontent: '';\\n\\t\\t\\tposition: absolute;\\n\\t\\t\\twidth: 1px;\\n\\t\\t\\theight: 100%;\\n\\t\\t\\tbackground-color: var(--ck-color-split-button-hover-border);\\n\\t\\t}\\n\\n\\t\\t/* Make sure the divider between the buttons looks fine when the button is focused */\\n\\t\\t& > .ck-splitbutton__arrow:focus::after {\\n\\t\\t\\t--ck-color-split-button-hover-border: var(--ck-color-focus-border);\\n\\t\\t}\\n\\n\\t\\t@nest [dir=\\\"ltr\\\"] & {\\n\\t\\t\\t& > .ck-splitbutton__arrow:not(.ck-disabled)::after {\\n\\t\\t\\t\\tleft: -1px;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t@nest [dir=\\\"rtl\\\"] & {\\n\\t\\t\\t& > .ck-splitbutton__arrow:not(.ck-disabled)::after {\\n\\t\\t\\t\\tright: -1px;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t/* Don't round the bottom left and right corners of the buttons when \\\"open\\\"\\n\\thttps://github.com/ckeditor/ckeditor5/issues/816 */\\n\\t&.ck-splitbutton_open {\\n\\t\\t@mixin ck-rounded-corners {\\n\\t\\t\\t& > .ck-splitbutton__action {\\n\\t\\t\\t\\tborder-bottom-left-radius: 0;\\n\\t\\t\\t}\\n\\n\\t\\t\\t& > .ck-splitbutton__arrow {\\n\\t\\t\\t\\tborder-bottom-right-radius: 0;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * Implements rounded corner interface for .ck-rounded-corners class.\\n *\\n * @see $ck-border-radius\\n */\\n@define-mixin ck-rounded-corners {\\n\\tborder-radius: 0;\\n\\n\\t@nest .ck-rounded-corners &,\\n\\t&.ck-rounded-corners {\\n\\t\\tborder-radius: var(--ck-border-radius);\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root{--ck-toolbar-dropdown-max-width:60vw}.ck.ck-toolbar-dropdown>.ck-dropdown__panel{max-width:var(--ck-toolbar-dropdown-max-width);width:max-content}.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}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/toolbardropdown.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/toolbardropdown.css\"],\"names\":[],\"mappings\":\"AAKA,MACC,oCACD,CAEA,4CAGC,8CAA+C,CAD/C,iBAQD,CAJE,6DACC,qCACD,CCZF,oCACC,QACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-toolbar-dropdown-max-width: 60vw;\\n}\\n\\n.ck.ck-toolbar-dropdown > .ck-dropdown__panel {\\n\\t/* https://github.com/ckeditor/ckeditor5/issues/5586 */\\n\\twidth: max-content;\\n\\tmax-width: var(--ck-toolbar-dropdown-max-width);\\n\\n\\t& .ck-button {\\n\\t\\t&:focus {\\n\\t\\t\\tz-index: calc(var(--ck-z-default) + 1);\\n\\t\\t}\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-toolbar-dropdown .ck-toolbar {\\n\\tborder: 0;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":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.ck-rounded-corners:not(.ck-editor__nested-editable){border-radius:var(--ck-border-radius)}.ck.ck-editor__editable.ck-focused:not(.ck-editor__nested-editable){border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow),0 0;outline:none}.ck.ck-editor__editable_inline{border:1px solid transparent;overflow:auto;padding:0 var(--ck-spacing-standard)}.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)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/editorui/editorui.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_focus.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css\"],\"names\":[],\"mappings\":\"AAWA,MACC,0CACD,CAEA,yDCJC,eDWD,CAPA,yJCAE,qCDOF,CAJC,oEEPA,2BAA2B,CCF3B,qCAA8B,CDC9B,YFWA,CAGD,+BAGC,4BAA6B,CAF7B,aAAc,CACd,oCA6BD,CA1BC,wCACC,eACD,CAEA,wCACC,gBACD,CAGA,4CACC,kCACD,CAGA,2CAKC,qCACD,CAGA,sDACC,kDACD,CAKA,gEACC,mDACD,CAIA,gEACC,gDACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"../../../mixins/_rounded.css\\\";\\n@import \\\"../../../mixins/_disabled.css\\\";\\n@import \\\"../../../mixins/_shadow.css\\\";\\n@import \\\"../../../mixins/_focus.css\\\";\\n@import \\\"../../mixins/_button.css\\\";\\n\\n:root {\\n\\t--ck-color-editable-blur-selection: hsl(0, 0%, 85%);\\n}\\n\\n.ck.ck-editor__editable:not(.ck-editor__nested-editable) {\\n\\t@mixin ck-rounded-corners;\\n\\n\\t&.ck-focused {\\n\\t\\t@mixin ck-focus-ring;\\n\\t\\t@mixin ck-box-shadow var(--ck-inner-shadow);\\n\\t}\\n}\\n\\n.ck.ck-editor__editable_inline {\\n\\toverflow: auto;\\n\\tpadding: 0 var(--ck-spacing-standard);\\n\\tborder: 1px solid transparent;\\n\\n\\t&[dir=\\\"ltr\\\"] {\\n\\t\\ttext-align: left;\\n\\t}\\n\\n\\t&[dir=\\\"rtl\\\"] {\\n\\t\\ttext-align: right;\\n\\t}\\n\\n\\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/116 */\\n\\t& > *:first-child {\\n\\t\\tmargin-top: var(--ck-spacing-large);\\n\\t}\\n\\n\\t/* https://github.com/ckeditor/ckeditor5/issues/847 */\\n\\t& > *:last-child {\\n\\t\\t/*\\n\\t\\t * This value should match with the default margins of the block elements (like .media or .image)\\n\\t\\t * to avoid a content jumping when the fake selection container shows up (See https://github.com/ckeditor/ckeditor5/issues/9825).\\n\\t\\t */\\n\\t\\tmargin-bottom: var(--ck-spacing-large);\\n\\t}\\n\\n\\t/* https://github.com/ckeditor/ckeditor5/issues/6517 */\\n\\t&.ck-blurred ::selection {\\n\\t\\tbackground: var(--ck-color-editable-blur-selection);\\n\\t}\\n}\\n\\n/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/111 */\\n.ck.ck-balloon-panel.ck-toolbar-container[class*=\\\"arrow_n\\\"] {\\n\\t&::after {\\n\\t\\tborder-bottom-color: var(--ck-color-base-foreground);\\n\\t}\\n}\\n\\n.ck.ck-balloon-panel.ck-toolbar-container[class*=\\\"arrow_s\\\"] {\\n\\t&::after {\\n\\t\\tborder-top-color: var(--ck-color-base-foreground);\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * Implements rounded corner interface for .ck-rounded-corners class.\\n *\\n * @see $ck-border-radius\\n */\\n@define-mixin ck-rounded-corners {\\n\\tborder-radius: 0;\\n\\n\\t@nest .ck-rounded-corners &,\\n\\t&.ck-rounded-corners {\\n\\t\\tborder-radius: var(--ck-border-radius);\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * A visual style of focused element's border.\\n */\\n@define-mixin ck-focus-ring {\\n\\t/* Disable native outline. */\\n\\toutline: none;\\n\\tborder: var(--ck-focus-ring)\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * A helper to combine multiple shadows.\\n */\\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\\n\\tbox-shadow: $shadowA, $shadowB;\\n}\\n\\n/**\\n * Gives an element a drop shadow so it looks like a floating panel.\\n */\\n@define-mixin ck-drop-shadow {\\n\\t@mixin ck-box-shadow var(--ck-drop-shadow);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-form__header{align-items:center;display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}:root{--ck-form-header-height:38px}.ck.ck-form__header{border-bottom:1px solid var(--ck-color-base-border);height:var(--ck-form-header-height);line-height:var(--ck-form-header-height);padding:var(--ck-spacing-small) var(--ck-spacing-large)}.ck.ck-form__header .ck-form__header__label{font-weight:700}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/formheader/formheader.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/formheader/formheader.css\"],\"names\":[],\"mappings\":\"AAKA,oBAIC,kBAAmB,CAHnB,YAAa,CACb,kBAAmB,CACnB,gBAAiB,CAEjB,6BACD,CCNA,MACC,4BACD,CAEA,oBAIC,mDAAoD,CAFpD,mCAAoC,CACpC,wCAAyC,CAFzC,uDAQD,CAHC,4CACC,eACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-form__header {\\n\\tdisplay: flex;\\n\\tflex-direction: row;\\n\\tflex-wrap: nowrap;\\n\\talign-items: center;\\n\\tjustify-content: space-between;\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-form-header-height: 38px;\\n}\\n\\n.ck.ck-form__header {\\n\\tpadding: var(--ck-spacing-small) var(--ck-spacing-large);\\n\\theight: var(--ck-form-header-height);\\n\\tline-height: var(--ck-form-header-height);\\n\\tborder-bottom: 1px solid var(--ck-color-base-border);\\n\\n\\t& .ck-form__header__label {\\n\\t\\tfont-weight: bold;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-icon{vertical-align:middle}:root{--ck-icon-size:calc(var(--ck-line-height-base)*var(--ck-font-size-normal))}.ck.ck-icon{font-size:.8333350694em;height:var(--ck-icon-size);width:var(--ck-icon-size);will-change:transform}.ck.ck-icon,.ck.ck-icon *{cursor:inherit}.ck.ck-icon.ck-icon_inherit-color,.ck.ck-icon.ck-icon_inherit-color *{color:inherit}.ck.ck-icon.ck-icon_inherit-color :not([fill]){fill:currentColor}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/icon/icon.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/icon/icon.css\"],\"names\":[],\"mappings\":\"AAKA,YACC,qBACD,CCFA,MACC,0EACD,CAEA,YAKC,uBAAwB,CAHxB,0BAA2B,CAD3B,yBAA0B,CAU1B,qBAoBD,CAlBC,0BALA,cAQA,CAMC,sEACC,aAMD,CAJC,+CAEC,iBACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-icon {\\n\\tvertical-align: middle;\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-icon-size: calc(var(--ck-line-height-base) * var(--ck-font-size-normal));\\n}\\n\\n.ck.ck-icon {\\n\\twidth: var(--ck-icon-size);\\n\\theight: var(--ck-icon-size);\\n\\n\\t/* Multiplied by the height of the line in \\\"px\\\" should give SVG \\\"viewport\\\" dimensions */\\n\\tfont-size: .8333350694em;\\n\\n\\t/* Inherit cursor style (#5). */\\n\\tcursor: inherit;\\n\\n\\t/* This will prevent blurry icons on Firefox. See #340. */\\n\\twill-change: transform;\\n\\n\\t& * {\\n\\t\\t/* Inherit cursor style (#5). */\\n\\t\\tcursor: inherit;\\n\\t}\\n\\n\\t/* Allows dynamic coloring of an icon by inheriting its color from the parent. */\\n\\t&.ck-icon_inherit-color {\\n\\t\\tcolor: inherit;\\n\\n\\t\\t& * {\\n\\t\\t\\tcolor: inherit;\\n\\n\\t\\t\\t&:not([fill]) {\\n\\t\\t\\t\\t/* Needed by FF. */\\n\\t\\t\\t\\tfill: currentColor;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root{--ck-input-width:18em;--ck-input-text-width:var(--ck-input-width)}.ck.ck-input{border-radius:0}.ck-rounded-corners .ck.ck-input,.ck.ck-input.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-input{background:var(--ck-color-input-background);border:1px solid var(--ck-color-input-border);min-height:var(--ck-ui-component-min-height);min-width:var(--ck-input-width);padding:var(--ck-spacing-extra-tiny) var(--ck-spacing-medium);transition:box-shadow .1s ease-in-out,border .1s ease-in-out}.ck.ck-input:focus{border:var(--ck-focus-ring);box-shadow:var(--ck-focus-outer-shadow),0 0;outline:none}.ck.ck-input[readonly]{background:var(--ck-color-input-disabled-background);border:1px solid var(--ck-color-input-disabled-border);color:var(--ck-color-input-disabled-text)}.ck.ck-input[readonly]:focus{box-shadow:var(--ck-focus-disabled-outer-shadow),0 0}.ck.ck-input.ck-error{animation:ck-input-shake .3s ease both;border-color:var(--ck-color-input-error-border)}.ck.ck-input.ck-error:focus{box-shadow:var(--ck-focus-error-outer-shadow),0 0}@keyframes ck-input-shake{20%{transform:translateX(-2px)}40%{transform:translateX(2px)}60%{transform:translateX(-1px)}80%{transform:translateX(1px)}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/input/input.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_focus.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css\"],\"names\":[],\"mappings\":\"AASA,MACC,qBAAsB,CAGtB,2CACD,CAEA,aCLC,eD2CD,CAtCA,iECDE,qCDuCF,CAtCA,aAGC,2CAA4C,CAC5C,6CAA8C,CAK9C,4CAA6C,CAH7C,+BAAgC,CADhC,6DAA8D,CAO9D,4DA0BD,CAxBC,mBEnBA,2BAA2B,CCF3B,2CAA8B,CDC9B,YFuBA,CAEA,uBAEC,oDAAqD,CADrD,sDAAuD,CAEvD,yCAMD,CAJC,6BG/BD,oDHkCC,CAGD,sBAEC,sCAAuC,CADvC,+CAMD,CAHC,4BGzCD,iDH2CC,CAIF,0BACC,IACC,0BACD,CAEA,IACC,yBACD,CAEA,IACC,0BACD,CAEA,IACC,yBACD,CACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"../../../mixins/_rounded.css\\\";\\n@import \\\"../../../mixins/_focus.css\\\";\\n@import \\\"../../../mixins/_shadow.css\\\";\\n\\n:root {\\n\\t--ck-input-width: 18em;\\n\\n\\t/* Backward compatibility. */\\n\\t--ck-input-text-width: var(--ck-input-width);\\n}\\n\\n.ck.ck-input {\\n\\t@mixin ck-rounded-corners;\\n\\n\\tbackground: var(--ck-color-input-background);\\n\\tborder: 1px solid var(--ck-color-input-border);\\n\\tpadding: var(--ck-spacing-extra-tiny) var(--ck-spacing-medium);\\n\\tmin-width: var(--ck-input-width);\\n\\n\\t/* This is important to stay of the same height as surrounding buttons */\\n\\tmin-height: var(--ck-ui-component-min-height);\\n\\n\\t/* Apply some smooth transition to the box-shadow and border. */\\n\\ttransition: box-shadow .1s ease-in-out, border .1s ease-in-out;\\n\\n\\t&:focus {\\n\\t\\t@mixin ck-focus-ring;\\n\\t\\t@mixin ck-box-shadow var(--ck-focus-outer-shadow);\\n\\t}\\n\\n\\t&[readonly] {\\n\\t\\tborder: 1px solid var(--ck-color-input-disabled-border);\\n\\t\\tbackground: var(--ck-color-input-disabled-background);\\n\\t\\tcolor: var(--ck-color-input-disabled-text);\\n\\n\\t\\t&:focus {\\n\\t\\t\\t/* The read-only input should have a slightly less visible shadow when focused. */\\n\\t\\t\\t@mixin ck-box-shadow var(--ck-focus-disabled-outer-shadow);\\n\\t\\t}\\n\\t}\\n\\n\\t&.ck-error {\\n\\t\\tborder-color: var(--ck-color-input-error-border);\\n\\t\\tanimation: ck-input-shake .3s ease both;\\n\\n\\t\\t&:focus {\\n\\t\\t\\t@mixin ck-box-shadow var(--ck-focus-error-outer-shadow);\\n\\t\\t}\\n\\t}\\n}\\n\\n@keyframes ck-input-shake {\\n\\t20% {\\n\\t\\ttransform: translateX(-2px);\\n\\t}\\n\\n\\t40% {\\n\\t\\ttransform: translateX(2px);\\n\\t}\\n\\n\\t60% {\\n\\t\\ttransform: translateX(-1px);\\n\\t}\\n\\n\\t80% {\\n\\t\\ttransform: translateX(1px);\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * Implements rounded corner interface for .ck-rounded-corners class.\\n *\\n * @see $ck-border-radius\\n */\\n@define-mixin ck-rounded-corners {\\n\\tborder-radius: 0;\\n\\n\\t@nest .ck-rounded-corners &,\\n\\t&.ck-rounded-corners {\\n\\t\\tborder-radius: var(--ck-border-radius);\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * A visual style of focused element's border.\\n */\\n@define-mixin ck-focus-ring {\\n\\t/* Disable native outline. */\\n\\toutline: none;\\n\\tborder: var(--ck-focus-ring)\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * A helper to combine multiple shadows.\\n */\\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\\n\\tbox-shadow: $shadowA, $shadowB;\\n}\\n\\n/**\\n * Gives an element a drop shadow so it looks like a floating panel.\\n */\\n@define-mixin ck-drop-shadow {\\n\\t@mixin ck-box-shadow var(--ck-drop-shadow);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-label{display:block}.ck.ck-voice-label{display:none}.ck.ck-label{font-weight:700}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/label/label.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/label/label.css\"],\"names\":[],\"mappings\":\"AAKA,aACC,aACD,CAEA,mBACC,YACD,CCNA,aACC,eACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-label {\\n\\tdisplay: block;\\n}\\n\\n.ck.ck-voice-label {\\n\\tdisplay: none;\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-label {\\n\\tfont-weight: bold;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".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-labeled-field-label-default-position-x:var(--ck-spacing-medium);--ck-labeled-field-label-default-position-y:calc(var(--ck-font-size-base)*0.6);--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{background:var(--ck-color-labeled-field-label-background);font-weight:400;line-height:normal;max-width:100%;overflow:hidden;padding:0 calc(var(--ck-font-size-tiny)*.5);pointer-events:none;text-overflow:ellipsis;transform:translate(var(--ck-spacing-medium),-6px) scale(.75);transform-origin:0 0;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-labeled-field-label-default-position-x),var(--ck-labeled-field-label-default-position-y)) 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-labeled-field-label-default-position-x)*-1),var(--ck-labeled-field-label-default-position-y)) 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{background:transparent;max-width:calc(var(--ck-labeled-field-empty-unfocused-max-width));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))}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/labeledfield/labeledfieldview.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/labeledfield/labeledfieldview.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css\"],\"names\":[],\"mappings\":\"AAMC,mEACC,YAAa,CACb,iBACD,CAEA,uCACC,aAAc,CACd,iBACD,CCND,MACC,kEAAsE,CACtE,gFAAiF,CACjF,oEAAqE,CACrE,8EAAiF,CACjF,yEACD,CAEA,0BCLC,eD8GD,CAzGA,2FCDE,qCD0GF,CAtGC,mEACC,UAmCD,CAjCC,gFACC,KA+BD,CAhCA,0FAIE,MA4BF,CAhCA,0FAQE,OAwBF,CAhCA,gFAiBC,yDAA0D,CAG1D,eAAmB,CADnB,kBAAoB,CAOpB,cAAe,CAFf,eAAgB,CANhB,2CAA8C,CAP9C,mBAAoB,CAYpB,sBAAuB,CARvB,6DAA+D,CAH/D,oBAAqB,CAgBrB,+JAID,CAQA,mKACC,gCACD,CAGD,yDACC,mCAAoC,CACpC,kCAAmC,CAInC,kBAKD,CAHC,6FACC,gCACD,CAID,4OAEC,yCACD,CAIA,oUAGE,+HAYF,CAfA,oUAOE,wIAQF,CAfA,gTAaC,sBAAuB,CAFvB,iEAAkE,CAGlE,SACD,CAKA,8FACC,sBACD,CAGA,yIACC,SACD,CAGA,kMACC,8HACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-labeled-field-view {\\n\\t& > .ck.ck-labeled-field-view__input-wrapper {\\n\\t\\tdisplay: flex;\\n\\t\\tposition: relative;\\n\\t}\\n\\n\\t& .ck.ck-label {\\n\\t\\tdisplay: block;\\n\\t\\tposition: absolute;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_dir.css\\\";\\n@import \\\"../../../mixins/_rounded.css\\\";\\n\\n:root {\\n\\t--ck-labeled-field-view-transition: .1s cubic-bezier(0, 0, 0.24, 0.95);\\n\\t--ck-labeled-field-empty-unfocused-max-width: 100% - 2 * var(--ck-spacing-medium);\\n\\t--ck-labeled-field-label-default-position-x: var(--ck-spacing-medium);\\n\\t--ck-labeled-field-label-default-position-y: calc(0.6 * var(--ck-font-size-base));\\n\\t--ck-color-labeled-field-label-background: var(--ck-color-base-background);\\n}\\n\\n.ck.ck-labeled-field-view {\\n\\t@mixin ck-rounded-corners;\\n\\n\\t& > .ck.ck-labeled-field-view__input-wrapper {\\n\\t\\twidth: 100%;\\n\\n\\t\\t& > .ck.ck-label {\\n\\t\\t\\ttop: 0px;\\n\\n\\t\\t\\t@mixin ck-dir ltr {\\n\\t\\t\\t\\tleft: 0px;\\n\\t\\t\\t}\\n\\n\\t\\t\\t@mixin ck-dir rtl {\\n\\t\\t\\t\\tright: 0px;\\n\\t\\t\\t}\\n\\n\\t\\t\\tpointer-events: none;\\n\\t\\t\\ttransform-origin: 0 0;\\n\\n\\t\\t\\t/* By default, display the label scaled down above the field. */\\n\\t\\t\\ttransform: translate(var(--ck-spacing-medium), -6px) scale(.75);\\n\\n\\t\\t\\tbackground: var(--ck-color-labeled-field-label-background);\\n\\t\\t\\tpadding: 0 calc(.5 * var(--ck-font-size-tiny));\\n\\t\\t\\tline-height: initial;\\n\\t\\t\\tfont-weight: normal;\\n\\n\\t\\t\\t/* Prevent overflow when the label is longer than the input */\\n\\t\\t\\ttext-overflow: ellipsis;\\n\\t\\t\\toverflow: hidden;\\n\\n\\t\\t\\tmax-width: 100%;\\n\\n\\t\\t\\ttransition:\\n\\t\\t\\t\\ttransform var(--ck-labeled-field-view-transition),\\n\\t\\t\\t\\tpadding var(--ck-labeled-field-view-transition),\\n\\t\\t\\t\\tbackground var(--ck-labeled-field-view-transition);\\n\\t\\t}\\n\\t}\\n\\n\\t&.ck-error {\\n\\t\\t& > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label {\\n\\t\\t\\tcolor: var(--ck-color-base-error);\\n\\t\\t}\\n\\n\\t\\t& .ck-input:not([readonly]) + .ck.ck-label {\\n\\t\\t\\tcolor: var(--ck-color-base-error);\\n\\t\\t}\\n\\t}\\n\\n\\t& .ck-labeled-field-view__status {\\n\\t\\tfont-size: var(--ck-font-size-small);\\n\\t\\tmargin-top: var(--ck-spacing-small);\\n\\n\\t\\t/* Let the info wrap to the next line to avoid stretching the layout horizontally.\\n\\t\\tThe status could be very long. */\\n\\t\\twhite-space: normal;\\n\\n\\t\\t&.ck-labeled-field-view__status_error {\\n\\t\\t\\tcolor: var(--ck-color-base-error);\\n\\t\\t}\\n\\t}\\n\\n\\t/* Disabled fields and fields that have no focus should fade out. */\\n\\t&.ck-disabled > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label,\\n\\t&.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused) > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label {\\n\\t\\tcolor: var(--ck-color-input-disabled-text);\\n\\t}\\n\\n\\t/* Fields that are disabled or not focused and without a placeholder should have full-sized labels. */\\n\\t/* stylelint-disable-next-line no-descending-specificity */\\n\\t&.ck-disabled.ck-labeled-field-view_empty > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label,\\n\\t&.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 {\\n\\t\\t@mixin ck-dir ltr {\\n\\t\\t\\ttransform: translate(var(--ck-labeled-field-label-default-position-x), var(--ck-labeled-field-label-default-position-y)) scale(1);\\n\\t\\t}\\n\\n\\t\\t@mixin ck-dir rtl {\\n\\t\\t\\ttransform: translate(calc(-1 * var(--ck-labeled-field-label-default-position-x)), var(--ck-labeled-field-label-default-position-y)) scale(1);\\n\\t\\t}\\n\\n\\t\\t/* Compensate for the default translate position. */\\n\\t\\tmax-width: calc(var(--ck-labeled-field-empty-unfocused-max-width));\\n\\n\\t\\tbackground: transparent;\\n\\t\\tpadding: 0;\\n\\t}\\n\\n\\t/*------ DropdownView integration ----------------------------------------------------------------------------------- */\\n\\n\\t/* Make sure dropdown' background color in any of dropdown's state does not collide with labeled field. */\\n\\t& > .ck.ck-labeled-field-view__input-wrapper > .ck-dropdown > .ck.ck-button {\\n\\t\\tbackground: transparent;\\n\\t}\\n\\n\\t/* When the dropdown is \\\"empty\\\", the labeled field label replaces its label. */\\n\\t&.ck-labeled-field-view_empty > .ck.ck-labeled-field-view__input-wrapper > .ck-dropdown > .ck-button > .ck-button__label {\\n\\t\\topacity: 0;\\n\\t}\\n\\n\\t/* Make sure the label of the empty, unfocused input does not cover the dropdown arrow. */\\n\\t&.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 {\\n\\t\\tmax-width: calc(var(--ck-labeled-field-empty-unfocused-max-width) - var(--ck-dropdown-arrow-size) - var(--ck-spacing-standard));\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * Implements rounded corner interface for .ck-rounded-corners class.\\n *\\n * @see $ck-border-radius\\n */\\n@define-mixin ck-rounded-corners {\\n\\tborder-radius: 0;\\n\\n\\t@nest .ck-rounded-corners &,\\n\\t&.ck-rounded-corners {\\n\\t\\tborder-radius: var(--ck-border-radius);\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-list{display:flex;flex-direction:column;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.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{background:var(--ck-color-list-background);list-style-type:none}.ck.ck-list__item{cursor:default;min-width:12em}.ck.ck-list__item .ck-button{border-radius:0;min-height:unset;padding:calc(var(--ck-line-height-base)*.2*var(--ck-font-size-base)) calc(var(--ck-line-height-base)*.4*var(--ck-font-size-base));text-align:left;width:100%}.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-switchbutton):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{background:var(--ck-color-base-border);height:1px;width:100%}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/list/list.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_unselectable.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/list/list.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css\"],\"names\":[],\"mappings\":\"AAOA,YAGC,YAAa,CACb,qBAAsB,CCFtB,qBAAsB,CACtB,wBAAyB,CACzB,oBAAqB,CACrB,gBDaD,CAZC,2DAEC,aACD,CAKA,kCACC,iBAAkB,CAClB,2BACD,CEfD,YCEC,eDGD,CALA,+DCME,qCDDF,CALA,YAIC,0CAA2C,CAD3C,oBAED,CAEA,kBACC,cAAe,CACf,cA2DD,CAzDC,6BAIC,eAAgB,CAHhB,gBAAiB,CAQjB,iIAEiE,CARjE,eAAgB,CADhB,UAwCD,CA7BC,+CAEC,yEACD,CAEA,oCACC,eACD,CAEA,mCACC,oDAAqD,CACrD,yCAaD,CAXC,0CACC,eACD,CAEA,2DACC,0DACD,CAEA,iFACC,4CACD,CAGD,qDACC,uDACD,CAMA,yCACC,0CAA2C,CAC3C,aAMD,CAJC,iEACC,uDAAwD,CACxD,aACD,CAKH,uBAGC,sCAAuC,CAFvC,UAAW,CACX,UAED\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"../../mixins/_unselectable.css\\\";\\n\\n.ck.ck-list {\\n\\t@mixin ck-unselectable;\\n\\n\\tdisplay: flex;\\n\\tflex-direction: column;\\n\\n\\t& .ck-list__item,\\n\\t& .ck-list__separator {\\n\\t\\tdisplay: block;\\n\\t}\\n\\n\\t/* Make sure that whatever child of the list item gets focus, it remains on the\\n\\ttop. Thanks to that, styles like box-shadow, outline, etc. are not masked by\\n\\tadjacent list items. */\\n\\t& .ck-list__item > *:focus {\\n\\t\\tposition: relative;\\n\\t\\tz-index: var(--ck-z-default);\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * Makes element unselectable.\\n */\\n@define-mixin ck-unselectable {\\n\\t-moz-user-select: none;\\n\\t-webkit-user-select: none;\\n\\t-ms-user-select: none;\\n\\tuser-select: none\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"../../../mixins/_disabled.css\\\";\\n@import \\\"../../../mixins/_rounded.css\\\";\\n@import \\\"../../../mixins/_shadow.css\\\";\\n\\n.ck.ck-list {\\n\\t@mixin ck-rounded-corners;\\n\\n\\tlist-style-type: none;\\n\\tbackground: var(--ck-color-list-background);\\n}\\n\\n.ck.ck-list__item {\\n\\tcursor: default;\\n\\tmin-width: 12em;\\n\\n\\t& .ck-button {\\n\\t\\tmin-height: unset;\\n\\t\\twidth: 100%;\\n\\t\\ttext-align: left;\\n\\t\\tborder-radius: 0;\\n\\n\\t\\t/* List items should have the same height. Use absolute units to make sure it is so\\n\\t\\t   because e.g. different heading styles may have different height\\n\\t\\t   https://github.com/ckeditor/ckeditor5-heading/issues/63 */\\n\\t\\tpadding:\\n\\t\\t\\tcalc(.2 * var(--ck-line-height-base) * var(--ck-font-size-base))\\n\\t\\t\\tcalc(.4 * var(--ck-line-height-base) * var(--ck-font-size-base));\\n\\n\\t\\t& .ck-button__label {\\n\\t\\t\\t/* https://github.com/ckeditor/ckeditor5-heading/issues/63 */\\n\\t\\t\\tline-height: calc(1.2 * var(--ck-line-height-base) * var(--ck-font-size-base));\\n\\t\\t}\\n\\n\\t\\t&:active {\\n\\t\\t\\tbox-shadow: none;\\n\\t\\t}\\n\\n\\t\\t&.ck-on {\\n\\t\\t\\tbackground: var(--ck-color-list-button-on-background);\\n\\t\\t\\tcolor: var(--ck-color-list-button-on-text);\\n\\n\\t\\t\\t&:active {\\n\\t\\t\\t\\tbox-shadow: none;\\n\\t\\t\\t}\\n\\n\\t\\t\\t&:hover:not(.ck-disabled) {\\n\\t\\t\\t\\tbackground: var(--ck-color-list-button-on-background-focus);\\n\\t\\t\\t}\\n\\n\\t\\t\\t&:focus:not(.ck-switchbutton):not(.ck-disabled) {\\n\\t\\t\\t\\tborder-color: var(--ck-color-base-background);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t&:hover:not(.ck-disabled) {\\n\\t\\t\\tbackground: var(--ck-color-list-button-hover-background);\\n\\t\\t}\\n\\t}\\n\\n\\t/* It's unnecessary to change the background/text of a switch toggle; it has different ways\\n\\tof conveying its state (like the switcher) */\\n\\t& .ck-switchbutton {\\n\\t\\t&.ck-on {\\n\\t\\t\\tbackground: var(--ck-color-list-background);\\n\\t\\t\\tcolor: inherit;\\n\\n\\t\\t\\t&:hover:not(.ck-disabled) {\\n\\t\\t\\t\\tbackground: var(--ck-color-list-button-hover-background);\\n\\t\\t\\t\\tcolor: inherit;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\\n.ck.ck-list__separator {\\n\\theight: 1px;\\n\\twidth: 100%;\\n\\tbackground: var(--ck-color-base-border);\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * Implements rounded corner interface for .ck-rounded-corners class.\\n *\\n * @see $ck-border-radius\\n */\\n@define-mixin ck-rounded-corners {\\n\\tborder-radius: 0;\\n\\n\\t@nest .ck-rounded-corners &,\\n\\t&.ck-rounded-corners {\\n\\t\\tborder-radius: var(--ck-border-radius);\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":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-border-width:1px;--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{background:var(--ck-color-panel-background);border:var(--ck-balloon-border-width) solid var(--ck-color-panel-border);box-shadow:var(--ck-drop-shadow),0 0;min-height:15px}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after,.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{border-style:solid;height:0;width:0}.ck.ck-balloon-panel[class*=arrow_n]:after,.ck.ck-balloon-panel[class*=arrow_n]:before{border-width:0 var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width)}.ck.ck-balloon-panel[class*=arrow_n]:before{border-color:transparent transparent var(--ck-color-panel-border) transparent;margin-top:calc(var(--ck-balloon-border-width)*-1)}.ck.ck-balloon-panel[class*=arrow_n]:after{border-color:transparent transparent var(--ck-color-panel-background) transparent;margin-top:calc(var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width))}.ck.ck-balloon-panel[class*=arrow_s]:after,.ck.ck-balloon-panel[class*=arrow_s]:before{border-width:var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width) 0 var(--ck-balloon-arrow-half-width)}.ck.ck-balloon-panel[class*=arrow_s]:before{border-color:var(--ck-color-panel-border) transparent transparent;filter:drop-shadow(var(--ck-balloon-arrow-drop-shadow));margin-bottom:calc(var(--ck-balloon-border-width)*-1)}.ck.ck-balloon-panel[class*=arrow_s]:after{border-color:var(--ck-color-panel-background) transparent transparent transparent;margin-bottom:calc(var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width))}.ck.ck-balloon-panel[class*=arrow_e]:after,.ck.ck-balloon-panel[class*=arrow_e]:before{border-width:var(--ck-balloon-arrow-half-width) 0 var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height)}.ck.ck-balloon-panel[class*=arrow_e]:before{border-color:transparent transparent transparent var(--ck-color-panel-border);margin-right:calc(var(--ck-balloon-border-width)*-1)}.ck.ck-balloon-panel[class*=arrow_e]:after{border-color:transparent transparent transparent var(--ck-color-panel-background);margin-right:calc(var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width))}.ck.ck-balloon-panel[class*=arrow_w]:after,.ck.ck-balloon-panel[class*=arrow_w]:before{border-width:var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width) 0}.ck.ck-balloon-panel[class*=arrow_w]:before{border-color:transparent var(--ck-color-panel-border) transparent transparent;margin-left:calc(var(--ck-balloon-border-width)*-1)}.ck.ck-balloon-panel[class*=arrow_w]:after{border-color:transparent var(--ck-color-panel-background) transparent transparent;margin-left:calc(var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width))}.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{bottom:calc(var(--ck-balloon-arrow-height)*-1);left:50%;margin-left:calc(var(--ck-balloon-arrow-half-width)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_sw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_sw:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);left:calc(var(--ck-balloon-arrow-half-width)*2)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_se:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_se:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);right:calc(var(--ck-balloon-arrow-half-width)*2)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_sme:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_sme:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);margin-right:calc(var(--ck-balloon-arrow-half-width)*2);right:25%}.ck.ck-balloon-panel.ck-balloon-panel_arrow_smw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_smw:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);left:25%;margin-left:calc(var(--ck-balloon-arrow-half-width)*2)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nme:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nme:before{margin-right:calc(var(--ck-balloon-arrow-half-width)*2);right:25%;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)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_e:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_e:before{margin-top:calc(var(--ck-balloon-arrow-half-width)*-1);right:calc(var(--ck-balloon-arrow-height)*-1);top:50%}.ck.ck-balloon-panel.ck-balloon-panel_arrow_w:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_w:before{left:calc(var(--ck-balloon-arrow-height)*-1);margin-top:calc(var(--ck-balloon-arrow-half-width)*-1);top:50%}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/balloonpanel.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/balloonpanel.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css\"],\"names\":[],\"mappings\":\"AAKA,MAEC,8DACD,CAEA,qBACC,YAAa,CACb,iBAAkB,CAElB,yBAyCD,CAtCE,+GAEC,UAAW,CACX,iBACD,CAEA,wDACC,6CACD,CAEA,uDACC,uDACD,CAIA,4CACC,6CACD,CAEA,2CACC,uDACD,CAIA,4CACC,6CACD,CAEA,2CACC,uDACD,CAGD,8CACC,aACD,CC9CD,MACC,6BAA8B,CAC9B,6BAA8B,CAC9B,8BAA+B,CAC/B,iCAAkC,CAClC,oEACD,CAEA,qBCLC,eDmMD,CA9LA,iFCDE,qCD+LF,CA9LA,qBAMC,2CAA4C,CAC5C,wEAAyE,CEdzE,oCAA8B,CFW9B,eA0LD,CApLE,+GAIC,kBAAmB,CADnB,QAAS,CADT,OAGD,CAIA,uFAEC,mHACD,CAEA,4CACC,6EAA8E,CAC9E,kDACD,CAEA,2CACC,iFAAkF,CAClF,gFACD,CAIA,uFAEC,mHACD,CAEA,4CACC,iEAAkE,CAClE,uDAAwD,CACxD,qDACD,CAEA,2CACC,iFAAkF,CAClF,mFACD,CAIA,uFAEC,mHACD,CAEA,4CACC,6EAA8E,CAC9E,oDACD,CAEA,2CACC,iFAAkF,CAClF,kFACD,CAIA,uFAEC,mHACD,CAEA,4CACC,6EAA8E,CAC9E,mDACD,CAEA,2CACC,iFAAkF,CAClF,iFACD,CAIA,yGAEC,QAAS,CACT,uDAA0D,CAC1D,2CACD,CAIA,2GAEC,+CAAkD,CAClD,2CACD,CAIA,2GAEC,gDAAmD,CACnD,2CACD,CAIA,yGAIC,8CAAiD,CAFjD,QAAS,CACT,uDAED,CAIA,2GAGC,8CAAiD,CADjD,+CAED,CAIA,2GAGC,8CAAiD,CADjD,gDAED,CAIA,6GAIC,8CAAiD,CADjD,uDAA0D,CAD1D,SAGD,CAIA,6GAIC,8CAAiD,CAFjD,QAAS,CACT,sDAED,CAIA,6GAGC,uDAA0D,CAD1D,SAAU,CAEV,2CACD,CAIA,6GAEC,QAAS,CACT,sDAAyD,CACzD,2CACD,CAIA,yGAGC,sDAAyD,CADzD,6CAAgD,CAEhD,OACD,CAIA,yGAEC,4CAA+C,CAC/C,sDAAyD,CACzD,OACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t/* Make sure the balloon arrow does not float over its children. */\\n\\t--ck-balloon-panel-arrow-z-index: calc(var(--ck-z-default) - 3);\\n}\\n\\n.ck.ck-balloon-panel {\\n\\tdisplay: none;\\n\\tposition: absolute;\\n\\n\\tz-index: var(--ck-z-modal);\\n\\n\\t&.ck-balloon-panel_with-arrow {\\n\\t\\t&::before,\\n\\t\\t&::after {\\n\\t\\t\\tcontent: \\\"\\\";\\n\\t\\t\\tposition: absolute;\\n\\t\\t}\\n\\n\\t\\t&::before {\\n\\t\\t\\tz-index: var(--ck-balloon-panel-arrow-z-index);\\n\\t\\t}\\n\\n\\t\\t&::after {\\n\\t\\t\\tz-index: calc(var(--ck-balloon-panel-arrow-z-index) + 1);\\n\\t\\t}\\n\\t}\\n\\n\\t&[class*=\\\"arrow_n\\\"] {\\n\\t\\t&::before {\\n\\t\\t\\tz-index: var(--ck-balloon-panel-arrow-z-index);\\n\\t\\t}\\n\\n\\t\\t&::after {\\n\\t\\t\\tz-index: calc(var(--ck-balloon-panel-arrow-z-index) + 1);\\n\\t\\t}\\n\\t}\\n\\n\\t&[class*=\\\"arrow_s\\\"] {\\n\\t\\t&::before {\\n\\t\\t\\tz-index: var(--ck-balloon-panel-arrow-z-index);\\n\\t\\t}\\n\\n\\t\\t&::after {\\n\\t\\t\\tz-index: calc(var(--ck-balloon-panel-arrow-z-index) + 1);\\n\\t\\t}\\n\\t}\\n\\n\\t&.ck-balloon-panel_visible {\\n\\t\\tdisplay: block;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"../../../mixins/_rounded.css\\\";\\n@import \\\"../../../mixins/_shadow.css\\\";\\n\\n:root {\\n\\t--ck-balloon-border-width: 1px;\\n\\t--ck-balloon-arrow-offset: 2px;\\n\\t--ck-balloon-arrow-height: 10px;\\n\\t--ck-balloon-arrow-half-width: 8px;\\n\\t--ck-balloon-arrow-drop-shadow: 0 2px 2px var(--ck-color-shadow-drop);\\n}\\n\\n.ck.ck-balloon-panel {\\n\\t@mixin ck-rounded-corners;\\n\\t@mixin ck-drop-shadow;\\n\\n\\tmin-height: 15px;\\n\\n\\tbackground: var(--ck-color-panel-background);\\n\\tborder: var(--ck-balloon-border-width) solid var(--ck-color-panel-border);\\n\\n\\t&.ck-balloon-panel_with-arrow {\\n\\t\\t&::before,\\n\\t\\t&::after {\\n\\t\\t\\twidth: 0;\\n\\t\\t\\theight: 0;\\n\\t\\t\\tborder-style: solid;\\n\\t\\t}\\n\\t}\\n\\n\\t&[class*=\\\"arrow_n\\\"] {\\n\\t\\t&::before,\\n\\t\\t&::after {\\n\\t\\t\\tborder-width: 0 var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width);\\n\\t\\t}\\n\\n\\t\\t&::before {\\n\\t\\t\\tborder-color: transparent transparent var(--ck-color-panel-border) transparent;\\n\\t\\t\\tmargin-top: calc( -1 * var(--ck-balloon-border-width) );\\n\\t\\t}\\n\\n\\t\\t&::after {\\n\\t\\t\\tborder-color: transparent transparent var(--ck-color-panel-background) transparent;\\n\\t\\t\\tmargin-top: calc( var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width) );\\n\\t\\t}\\n\\t}\\n\\n\\t&[class*=\\\"arrow_s\\\"] {\\n\\t\\t&::before,\\n\\t\\t&::after {\\n\\t\\t\\tborder-width: var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width) 0 var(--ck-balloon-arrow-half-width);\\n\\t\\t}\\n\\n\\t\\t&::before {\\n\\t\\t\\tborder-color: var(--ck-color-panel-border) transparent transparent;\\n\\t\\t\\tfilter: drop-shadow(var(--ck-balloon-arrow-drop-shadow));\\n\\t\\t\\tmargin-bottom: calc( -1 * var(--ck-balloon-border-width) );\\n\\t\\t}\\n\\n\\t\\t&::after {\\n\\t\\t\\tborder-color: var(--ck-color-panel-background) transparent transparent transparent;\\n\\t\\t\\tmargin-bottom: calc( var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width) );\\n\\t\\t}\\n\\t}\\n\\n\\t&[class*=\\\"arrow_e\\\"] {\\n\\t\\t&::before,\\n\\t\\t&::after {\\n\\t\\t\\tborder-width: var(--ck-balloon-arrow-half-width) 0 var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height);\\n\\t\\t}\\n\\n\\t\\t&::before {\\n\\t\\t\\tborder-color: transparent transparent transparent var(--ck-color-panel-border);\\n\\t\\t\\tmargin-right: calc( -1 * var(--ck-balloon-border-width) );\\n\\t\\t}\\n\\n\\t\\t&::after {\\n\\t\\t\\tborder-color: transparent transparent transparent var(--ck-color-panel-background);\\n\\t\\t\\tmargin-right: calc( var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width) );\\n\\t\\t}\\n\\t}\\n\\n\\t&[class*=\\\"arrow_w\\\"] {\\n\\t\\t&::before,\\n\\t\\t&::after {\\n\\t\\t\\tborder-width: var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width) 0;\\n\\t\\t}\\n\\n\\t\\t&::before {\\n\\t\\t\\tborder-color: transparent var(--ck-color-panel-border) transparent transparent;\\n\\t\\t\\tmargin-left: calc( -1 * var(--ck-balloon-border-width) );\\n\\t\\t}\\n\\n\\t\\t&::after {\\n\\t\\t\\tborder-color: transparent var(--ck-color-panel-background) transparent transparent;\\n\\t\\t\\tmargin-left: calc( var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width) );\\n\\t\\t}\\n\\t}\\n\\n\\t&.ck-balloon-panel_arrow_n {\\n\\t\\t&::before,\\n\\t\\t&::after {\\n\\t\\t\\tleft: 50%;\\n\\t\\t\\tmargin-left: calc(-1 * var(--ck-balloon-arrow-half-width));\\n\\t\\t\\ttop: calc(-1 * var(--ck-balloon-arrow-height));\\n\\t\\t}\\n\\t}\\n\\n\\t&.ck-balloon-panel_arrow_nw {\\n\\t\\t&::before,\\n\\t\\t&::after {\\n\\t\\t\\tleft: calc(2 * var(--ck-balloon-arrow-half-width));\\n\\t\\t\\ttop: calc(-1 * var(--ck-balloon-arrow-height));\\n\\t\\t}\\n\\t}\\n\\n\\t&.ck-balloon-panel_arrow_ne {\\n\\t\\t&::before,\\n\\t\\t&::after {\\n\\t\\t\\tright: calc(2 * var(--ck-balloon-arrow-half-width));\\n\\t\\t\\ttop: calc(-1 * var(--ck-balloon-arrow-height));\\n\\t\\t}\\n\\t}\\n\\n\\t&.ck-balloon-panel_arrow_s {\\n\\t\\t&::before,\\n\\t\\t&::after {\\n\\t\\t\\tleft: 50%;\\n\\t\\t\\tmargin-left: calc(-1 * var(--ck-balloon-arrow-half-width));\\n\\t\\t\\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\\n\\t\\t}\\n\\t}\\n\\n\\t&.ck-balloon-panel_arrow_sw {\\n\\t\\t&::before,\\n\\t\\t&::after {\\n\\t\\t\\tleft: calc(2 * var(--ck-balloon-arrow-half-width));\\n\\t\\t\\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\\n\\t\\t}\\n\\t}\\n\\n\\t&.ck-balloon-panel_arrow_se {\\n\\t\\t&::before,\\n\\t\\t&::after {\\n\\t\\t\\tright: calc(2 * var(--ck-balloon-arrow-half-width));\\n\\t\\t\\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\\n\\t\\t}\\n\\t}\\n\\n\\t&.ck-balloon-panel_arrow_sme {\\n\\t\\t&::before,\\n\\t\\t&::after {\\n\\t\\t\\tright: 25%;\\n\\t\\t\\tmargin-right: calc(2 * var(--ck-balloon-arrow-half-width));\\n\\t\\t\\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\\n\\t\\t}\\n\\t}\\n\\n\\t&.ck-balloon-panel_arrow_smw {\\n\\t\\t&::before,\\n\\t\\t&::after {\\n\\t\\t\\tleft: 25%;\\n\\t\\t\\tmargin-left: calc(2 * var(--ck-balloon-arrow-half-width));\\n\\t\\t\\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\\n\\t\\t}\\n\\t}\\n\\n\\t&.ck-balloon-panel_arrow_nme {\\n\\t\\t&::before,\\n\\t\\t&::after {\\n\\t\\t\\tright: 25%;\\n\\t\\t\\tmargin-right: calc(2 * var(--ck-balloon-arrow-half-width));\\n\\t\\t\\ttop: calc(-1 * var(--ck-balloon-arrow-height));\\n\\t\\t}\\n\\t}\\n\\n\\t&.ck-balloon-panel_arrow_nmw {\\n\\t\\t&::before,\\n\\t\\t&::after {\\n\\t\\t\\tleft: 25%;\\n\\t\\t\\tmargin-left: calc(2 * var(--ck-balloon-arrow-half-width));\\n\\t\\t\\ttop: calc(-1 * var(--ck-balloon-arrow-height));\\n\\t\\t}\\n\\t}\\n\\n\\t&.ck-balloon-panel_arrow_e {\\n\\t\\t&::before,\\n\\t\\t&::after {\\n\\t\\t\\tright: calc(-1 * var(--ck-balloon-arrow-height));\\n\\t\\t\\tmargin-top: calc(-1 * var(--ck-balloon-arrow-half-width));\\n\\t\\t\\ttop: 50%;\\n\\t\\t}\\n\\t}\\n\\n\\t&.ck-balloon-panel_arrow_w {\\n\\t\\t&::before,\\n\\t\\t&::after {\\n\\t\\t\\tleft: calc(-1 * var(--ck-balloon-arrow-height));\\n\\t\\t\\tmargin-top: calc(-1 * var(--ck-balloon-arrow-half-width));\\n\\t\\t\\ttop: 50%;\\n\\t\\t}\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * Implements rounded corner interface for .ck-rounded-corners class.\\n *\\n * @see $ck-border-radius\\n */\\n@define-mixin ck-rounded-corners {\\n\\tborder-radius: 0;\\n\\n\\t@nest .ck-rounded-corners &,\\n\\t&.ck-rounded-corners {\\n\\t\\tborder-radius: var(--ck-border-radius);\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * A helper to combine multiple shadows.\\n */\\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\\n\\tbox-shadow: $shadowA, $shadowB;\\n}\\n\\n/**\\n * Gives an element a drop shadow so it looks like a floating panel.\\n */\\n@define-mixin ck-drop-shadow {\\n\\t@mixin ck-box-shadow var(--ck-drop-shadow);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck .ck-balloon-rotator__navigation{align-items:center;display:flex;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-bottom:var(--ck-spacing-small);margin-right:var(--ck-spacing-small);margin-top:var(--ck-spacing-small)}.ck .ck-balloon-rotator__navigation .ck-balloon-rotator__counter{margin-left:var(--ck-spacing-small);margin-right:var(--ck-spacing-standard)}.ck .ck-balloon-rotator__content .ck.ck-annotation-wrapper{box-shadow:none}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/balloonrotator.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/balloonrotator.css\"],\"names\":[],\"mappings\":\"AAKA,oCAEC,kBAAmB,CADnB,YAAa,CAEb,sBACD,CAKA,6CACC,sBACD,CCXA,oCACC,6CAA8C,CAC9C,sDAAuD,CACvD,iCAgBD,CAbC,sCAGC,qCAAsC,CAFtC,oCAAqC,CACrC,kCAED,CAGA,iEAIC,mCAAoC,CAHpC,uCAID,CAMA,2DACC,eACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck .ck-balloon-rotator__navigation {\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n}\\n\\n/* Buttons inside a toolbar should be centered when rotator bar is wider.\\n * See: https://github.com/ckeditor/ckeditor5-ui/issues/495\\n */\\n.ck .ck-balloon-rotator__content .ck-toolbar {\\n\\tjustify-content: center;\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck .ck-balloon-rotator__navigation {\\n\\tbackground: var(--ck-color-toolbar-background);\\n\\tborder-bottom: 1px solid var(--ck-color-toolbar-border);\\n\\tpadding: 0 var(--ck-spacing-small);\\n\\n\\t/* Let's keep similar appearance to `ck-toolbar`. */\\n\\t& > * {\\n\\t\\tmargin-right: var(--ck-spacing-small);\\n\\t\\tmargin-top: var(--ck-spacing-small);\\n\\t\\tmargin-bottom: var(--ck-spacing-small);\\n\\t}\\n\\n\\t/* Gives counter more breath than buttons. */\\n\\t& .ck-balloon-rotator__counter {\\n\\t\\tmargin-right: var(--ck-spacing-standard);\\n\\n\\t\\t/* We need to use smaller margin because of previous button's right margin. */\\n\\t\\tmargin-left: var(--ck-spacing-small);\\n\\t}\\n}\\n\\n.ck .ck-balloon-rotator__content {\\n\\n\\t/* Disable default annotation shadow inside rotator with fake panels. */\\n\\t& .ck.ck-annotation-wrapper {\\n\\t\\tbox-shadow: none;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".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{background:var(--ck-color-panel-background);border:1px solid var(--ck-color-panel-border);border-radius:var(--ck-border-radius);box-shadow:var(--ck-drop-shadow),0 0;height:100%;min-height:15px;width: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}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/fakepanel.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/fakepanel.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css\"],\"names\":[],\"mappings\":\"AAKA,mBACC,iBAAkB,CAGlB,mCACD,CAEA,uBACC,iBACD,CAEA,mCACC,SACD,CAEA,oCACC,SACD,CCfA,MACC,6CAA8C,CAC9C,2CACD,CAGA,uBAKC,2CAA4C,CAC5C,6CAA8C,CAC9C,qCAAsC,CCXtC,oCAA8B,CDc9B,WAAY,CAPZ,eAAgB,CAMhB,UAED,CAEA,mCACC,0DAA2D,CAC3D,uDACD,CAEA,oCACC,kEAAqE,CACrE,+DACD,CACA,oCACC,kEAAqE,CACrE,+DACD,CAGA,yIAGC,4CACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck .ck-fake-panel {\\n\\tposition: absolute;\\n\\n\\t/* Fake panels should be placed under main balloon content. */\\n\\tz-index: calc(var(--ck-z-modal) - 1);\\n}\\n\\n.ck .ck-fake-panel div {\\n\\tposition: absolute;\\n}\\n\\n.ck .ck-fake-panel div:nth-child( 1 ) {\\n\\tz-index: 2;\\n}\\n\\n.ck .ck-fake-panel div:nth-child( 2 ) {\\n\\tz-index: 1;\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"../../../mixins/_shadow.css\\\";\\n\\n:root {\\n\\t--ck-balloon-fake-panel-offset-horizontal: 6px;\\n\\t--ck-balloon-fake-panel-offset-vertical: 6px;\\n}\\n\\n/* Let's use `.ck-balloon-panel` appearance. See: balloonpanel.css. */\\n.ck .ck-fake-panel div {\\n\\t@mixin ck-drop-shadow;\\n\\n\\tmin-height: 15px;\\n\\n\\tbackground: var(--ck-color-panel-background);\\n\\tborder: 1px solid var(--ck-color-panel-border);\\n\\tborder-radius: var(--ck-border-radius);\\n\\n\\twidth: 100%;\\n\\theight: 100%;\\n}\\n\\n.ck .ck-fake-panel div:nth-child( 1 ) {\\n\\tmargin-left: var(--ck-balloon-fake-panel-offset-horizontal);\\n\\tmargin-top: var(--ck-balloon-fake-panel-offset-vertical);\\n}\\n\\n.ck .ck-fake-panel div:nth-child( 2 ) {\\n\\tmargin-left: calc(var(--ck-balloon-fake-panel-offset-horizontal) * 2);\\n\\tmargin-top: calc(var(--ck-balloon-fake-panel-offset-vertical) * 2);\\n}\\n.ck .ck-fake-panel div:nth-child( 3 ) {\\n\\tmargin-left: calc(var(--ck-balloon-fake-panel-offset-horizontal) * 3);\\n\\tmargin-top: calc(var(--ck-balloon-fake-panel-offset-vertical) * 3);\\n}\\n\\n/* If balloon is positioned above element, we need to move fake panel to the top. */\\n.ck .ck-balloon-panel_arrow_s + .ck-fake-panel,\\n.ck .ck-balloon-panel_arrow_se + .ck-fake-panel,\\n.ck .ck-balloon-panel_arrow_sw + .ck-fake-panel {\\n\\t--ck-balloon-fake-panel-offset-vertical: -6px;\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * A helper to combine multiple shadows.\\n */\\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\\n\\tbox-shadow: $shadowA, $shadowB;\\n}\\n\\n/**\\n * Gives an element a drop shadow so it looks like a floating panel.\\n */\\n@define-mixin ck-drop-shadow {\\n\\t@mixin ck-box-shadow var(--ck-drop-shadow);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-sticky-panel .ck-sticky-panel__content_sticky{position:fixed;top:0;z-index:var(--ck-z-modal)}.ck.ck-sticky-panel .ck-sticky-panel__content_sticky_bottom-limit{position:absolute;top:auto}.ck.ck-sticky-panel .ck-sticky-panel__content_sticky{border-top-left-radius:0;border-top-right-radius:0;border-width:0 1px 1px;box-shadow:var(--ck-drop-shadow),0 0}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/stickypanel.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/stickypanel.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css\"],\"names\":[],\"mappings\":\"AAMC,qDAEC,cAAe,CACf,KAAM,CAFN,yBAGD,CAEA,kEAEC,iBAAkB,CADlB,QAED,CCPA,qDAIC,wBAAyB,CACzB,yBAA0B,CAF1B,sBAAuB,CCFxB,oCDKA\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-sticky-panel {\\n\\t& .ck-sticky-panel__content_sticky {\\n\\t\\tz-index: var(--ck-z-modal); /* #315 */\\n\\t\\tposition: fixed;\\n\\t\\ttop: 0;\\n\\t}\\n\\n\\t& .ck-sticky-panel__content_sticky_bottom-limit {\\n\\t\\ttop: auto;\\n\\t\\tposition: absolute;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"../../../mixins/_shadow.css\\\";\\n\\n.ck.ck-sticky-panel {\\n\\t& .ck-sticky-panel__content_sticky {\\n\\t\\t@mixin ck-drop-shadow;\\n\\n\\t\\tborder-width: 0 1px 1px;\\n\\t\\tborder-top-left-radius: 0;\\n\\t\\tborder-top-right-radius: 0;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * A helper to combine multiple shadows.\\n */\\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\\n\\tbox-shadow: $shadowA, $shadowB;\\n}\\n\\n/**\\n * Gives an element a drop shadow so it looks like a floating panel.\\n */\\n@define-mixin ck-drop-shadow {\\n\\t@mixin ck-box-shadow var(--ck-drop-shadow);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck-vertical-form .ck-button:after{bottom:-1px;content:\\\"\\\";position:absolute;right:-1px;top:-1px;width:0;z-index:1}.ck-vertical-form .ck-button:focus:after{display:none}@media screen and (max-width:600px){.ck.ck-responsive-form .ck-button:after{bottom:-1px;content:\\\"\\\";position:absolute;right:-1px;top:-1px;width:0;z-index:1}.ck.ck-responsive-form .ck-button:focus:after{display:none}}.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-width)*.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:nth-last-child(2):after{border-right:1px solid var(--ck-color-base-border)}.ck.ck-responsive-form>.ck-button:last-child,.ck.ck-responsive-form>.ck-button:nth-last-child(2){border-radius:0;margin-top:var(--ck-spacing-large);padding:var(--ck-spacing-standard)}.ck.ck-responsive-form>.ck-button:last-child:not(:focus),.ck.ck-responsive-form>.ck-button:nth-last-child(2):not(:focus){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}[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)}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/responsive-form/responsiveform.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/responsive-form/responsiveform.css\"],\"names\":[],\"mappings\":\"AAQC,mCAMC,WAAY,CALZ,UAAW,CAEX,iBAAkB,CAClB,UAAW,CACX,QAAS,CAHT,OAAQ,CAKR,SACD,CAEA,yCACC,YACD,CCdA,oCDoBE,wCAMC,WAAY,CALZ,UAAW,CAEX,iBAAkB,CAClB,UAAW,CACX,QAAS,CAHT,OAAQ,CAKR,SACD,CAEA,8CACC,YACD,CC9BF,CCAD,qDACC,kDACD,CAEA,uBACC,+BAmED,CAjEC,6BAEC,YACD,CASC,uGACC,sCACD,CDvBD,oCCMD,uBAqBE,SAAU,CACV,oCA8CF,CA5CE,8CACC,wDAWD,CATC,6DACC,WAAY,CACZ,UACD,CAGA,4EACC,kBACD,CAKA,0DACC,kDACD,CAGD,iGAIC,eAAgB,CADhB,kCAAmC,CADnC,kCAmBD,CAfC,yHACC,gDACD,CARD,0OAeE,aAMF,CAJE,+IACC,kDACD,CDpEH\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css\\\";\\n\\n.ck-vertical-form .ck-button {\\n\\t&::after {\\n\\t\\tcontent: \\\"\\\";\\n\\t\\twidth: 0;\\n\\t\\tposition: absolute;\\n\\t\\tright: -1px;\\n\\t\\ttop: -1px;\\n\\t\\tbottom: -1px;\\n\\t\\tz-index: 1;\\n\\t}\\n\\n\\t&:focus::after {\\n\\t\\tdisplay: none;\\n\\t}\\n}\\n\\n.ck.ck-responsive-form {\\n\\t@mixin ck-media-phone {\\n\\t\\t& .ck-button {\\n\\t\\t\\t&::after {\\n\\t\\t\\t\\tcontent: \\\"\\\";\\n\\t\\t\\t\\twidth: 0;\\n\\t\\t\\t\\tposition: absolute;\\n\\t\\t\\t\\tright: -1px;\\n\\t\\t\\t\\ttop: -1px;\\n\\t\\t\\t\\tbottom: -1px;\\n\\t\\t\\t\\tz-index: 1;\\n\\t\\t\\t}\\n\\n\\t\\t\\t&:focus::after {\\n\\t\\t\\t\\tdisplay: none;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@define-mixin ck-media-phone {\\n\\t@media screen and (max-width: 600px) {\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css\\\";\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_dir.css\\\";\\n\\n.ck-vertical-form > .ck-button:nth-last-child(2)::after {\\n\\tborder-right: 1px solid var(--ck-color-base-border);\\n}\\n\\n.ck.ck-responsive-form {\\n\\tpadding: var(--ck-spacing-large);\\n\\n\\t&:focus {\\n\\t\\t/* See: https://github.com/ckeditor/ckeditor5/issues/4773 */\\n\\t\\toutline: none;\\n\\t}\\n\\n\\t@mixin ck-dir ltr {\\n\\t\\t& > :not(:first-child) {\\n\\t\\t\\tmargin-left: var(--ck-spacing-standard);\\n\\t\\t}\\n\\t}\\n\\n\\t@mixin ck-dir rtl {\\n\\t\\t& > :not(:last-child) {\\n\\t\\t\\tmargin-left: var(--ck-spacing-standard);\\n\\t\\t}\\n\\t}\\n\\n\\t@mixin ck-media-phone {\\n\\t\\tpadding: 0;\\n\\t\\twidth: calc(.8 * var(--ck-input-width));\\n\\n\\t\\t& .ck-labeled-field-view {\\n\\t\\t\\tmargin: var(--ck-spacing-large) var(--ck-spacing-large) 0;\\n\\n\\t\\t\\t& .ck-input-text {\\n\\t\\t\\t\\tmin-width: 0;\\n\\t\\t\\t\\twidth: 100%;\\n\\t\\t\\t}\\n\\n\\t\\t\\t/* Let the long error messages wrap in the narrow form. */\\n\\t\\t\\t& .ck-labeled-field-view__error {\\n\\t\\t\\t\\twhite-space: normal;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t/* Styles for two last buttons in the form (save&cancel, edit&unlink, etc.). */\\n\\t\\t& > .ck-button:nth-last-child(2) {\\n\\t\\t\\t&::after {\\n\\t\\t\\t\\tborder-right: 1px solid var(--ck-color-base-border);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t& > .ck-button:nth-last-child(1),\\n\\t\\t& > .ck-button:nth-last-child(2) {\\n\\t\\t\\tpadding: var(--ck-spacing-standard);\\n\\t\\t\\tmargin-top: var(--ck-spacing-large);\\n\\t\\t\\tborder-radius: 0;\\n\\n\\t\\t\\t&:not(:focus) {\\n\\t\\t\\t\\tborder-top: 1px solid var(--ck-color-base-border);\\n\\t\\t\\t}\\n\\n\\t\\t\\t@mixin ck-dir ltr {\\n\\t\\t\\t\\tmargin-left: 0;\\n\\t\\t\\t}\\n\\n\\t\\t\\t@mixin ck-dir rtl {\\n\\t\\t\\t\\tmargin-left: 0;\\n\\n\\t\\t\\t\\t&:last-of-type {\\n\\t\\t\\t\\t\\tborder-right: 1px solid var(--ck-color-base-border);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".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)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/toolbar/blocktoolbar.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/toolbar/blocktoolbar.css\"],\"names\":[],\"mappings\":\"AAKA,4BACC,iBAAkB,CAClB,2BACD,CCHA,MACC,oDAAqD,CACrD,yDACD,CAEA,4BACC,0CAA2C,CAC3C,sCACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-block-toolbar-button {\\n\\tposition: absolute;\\n\\tz-index: var(--ck-z-default);\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-color-block-toolbar-button: var(--ck-color-text);\\n\\t--ck-block-toolbar-button-size: var(--ck-font-size-normal);\\n}\\n\\n.ck.ck-block-toolbar-button {\\n\\tcolor: var(--ck-color-block-toolbar-button);\\n\\tfont-size: var(--ck-block-toolbar-size);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-toolbar{align-items:center;display:flex;flex-flow:row nowrap;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.ck.ck-toolbar>.ck-toolbar__items{align-items:center;display:flex;flex-flow:row wrap;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);border:1px solid var(--ck-color-toolbar-border);padding:0 var(--ck-spacing-small)}.ck.ck-toolbar .ck.ck-toolbar__separator{align-self:stretch;background:var(--ck-color-toolbar-border);margin-bottom:var(--ck-spacing-small);margin-top:var(--ck-spacing-small);min-width:1px;width:1px}.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-bottom:var(--ck-spacing-small);margin-top:var(--ck-spacing-small)}.ck.ck-toolbar.ck-toolbar_vertical{padding:0}.ck.ck-toolbar.ck-toolbar_vertical>.ck-toolbar__items>.ck{border-radius:0;margin:0;width:100%}.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.ck-toolbar .ck-toolbar__nested-toolbar-dropdown>.ck-dropdown__panel{min-width:auto}.ck.ck-toolbar .ck-toolbar__nested-toolbar-dropdown>.ck-button>.ck-button__label{max-width:7em;width:auto}.ck.ck-toolbar:focus{outline:none}.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.ck-toolbar_compact[dir=rtl]>.ck-toolbar__items>.ck:first-child,[dir=rtl] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.ck.ck-toolbar.ck-toolbar_compact[dir=rtl]>.ck-toolbar__items>.ck:last-child,[dir=rtl] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:last-child{border-bottom-right-radius:0;border-top-right-radius:0}.ck.ck-toolbar.ck-toolbar_grouping[dir=rtl]>.ck-toolbar__items:not(:empty):not(:only-child),.ck.ck-toolbar[dir=rtl]>.ck.ck-toolbar__separator,[dir=rtl] .ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child),[dir=rtl] .ck.ck-toolbar>.ck.ck-toolbar__separator{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.ck-toolbar_compact[dir=ltr]>.ck-toolbar__items>.ck:first-child,[dir=ltr] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:first-child{border-bottom-right-radius:0;border-top-right-radius:0}.ck.ck-toolbar.ck-toolbar_compact[dir=ltr]>.ck-toolbar__items>.ck:last-child,[dir=ltr] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:last-child{border-bottom-left-radius:0;border-top-left-radius:0}.ck.ck-toolbar.ck-toolbar_grouping[dir=ltr]>.ck-toolbar__items:not(:empty):not(:only-child),.ck.ck-toolbar[dir=ltr]>.ck.ck-toolbar__separator,[dir=ltr] .ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child),[dir=ltr] .ck.ck-toolbar>.ck.ck-toolbar__separator{margin-right:var(--ck-spacing-small)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/toolbar/toolbar.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_unselectable.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/toolbar/toolbar.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css\"],\"names\":[],\"mappings\":\"AAOA,eAKC,kBAAmB,CAFnB,YAAa,CACb,oBAAqB,CCFrB,qBAAsB,CACtB,wBAAyB,CACzB,oBAAqB,CACrB,gBD6CD,CA3CC,kCAGC,kBAAmB,CAFnB,YAAa,CACb,kBAAmB,CAEnB,WAED,CAEA,yCACC,oBAWD,CAJC,yGAEC,YACD,CAGD,uCACC,eACD,CAEA,sDACC,gBACD,CAEA,sDACC,qBACD,CAEA,sDACC,gBACD,CAGC,yFACC,YACD,CE/CF,eCGC,eDwGD,CA3GA,qECOE,qCDoGF,CA3GA,eAGC,6CAA8C,CAE9C,+CAAgD,CADhD,iCAuGD,CApGC,yCACC,kBAAmB,CAGnB,yCAA0C,CAO1C,qCAAsC,CADtC,kCAAmC,CAPnC,aAAc,CADd,SAUD,CAEA,uCACC,QACD,CAGC,gEAEC,oCACD,CAIA,kEACC,YACD,CAGD,gHAIC,qCAAsC,CADtC,kCAED,CAEA,mCAEC,SAaD,CAVC,0DAQC,eAAgB,CAHhB,QAAS,CAHT,UAOD,CAGD,kCAEC,SAWD,CATC,uDAEC,QAMD,CAHC,yFACC,eACD,CASD,kFACC,mCACD,CAMA,wEACC,cACD,CAEA,iFACC,aAAc,CACd,UACD,CAGD,qBACC,YACD,CAtGD,qCAyGE,QAEF,CAYC,+FACC,cACD,CAEA,iJAEC,mCACD,CAEA,qHACC,aACD,CAIC,6JAEC,2BAA4B,CAD5B,wBAED,CAGA,2JAEC,4BAA6B,CAD7B,yBAED,CASD,8RACC,mCACD,CAWA,qHACC,cACD,CAIC,6JAEC,4BAA6B,CAD7B,yBAED,CAGA,2JAEC,2BAA4B,CAD5B,wBAED,CASD,8RACC,oCACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"../../mixins/_unselectable.css\\\";\\n\\n.ck.ck-toolbar {\\n\\t@mixin ck-unselectable;\\n\\n\\tdisplay: flex;\\n\\tflex-flow: row nowrap;\\n\\talign-items: center;\\n\\n\\t& > .ck-toolbar__items {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-flow: row wrap;\\n\\t\\talign-items: center;\\n\\t\\tflex-grow: 1;\\n\\n\\t}\\n\\n\\t& .ck.ck-toolbar__separator {\\n\\t\\tdisplay: inline-block;\\n\\n\\t\\t/*\\n\\t\\t * A leading or trailing separator makes no sense (separates from nothing on one side).\\n\\t\\t * For instance, it can happen when toolbar items (also separators) are getting grouped one by one and\\n\\t\\t * moved to another toolbar in the dropdown.\\n\\t\\t */\\n\\t\\t&:first-child,\\n\\t\\t&:last-child {\\n\\t\\t\\tdisplay: none;\\n\\t\\t}\\n\\t}\\n\\n\\t& .ck-toolbar__line-break {\\n\\t\\tflex-basis: 100%;\\n\\t}\\n\\n\\t&.ck-toolbar_grouping > .ck-toolbar__items {\\n\\t\\tflex-wrap: nowrap;\\n\\t}\\n\\n\\t&.ck-toolbar_vertical > .ck-toolbar__items {\\n\\t\\tflex-direction: column;\\n\\t}\\n\\n\\t&.ck-toolbar_floating > .ck-toolbar__items {\\n\\t\\tflex-wrap: nowrap;\\n\\t}\\n\\n\\t& > .ck.ck-toolbar__grouped-dropdown {\\n\\t\\t& > .ck-dropdown__button .ck-dropdown__arrow {\\n\\t\\t\\tdisplay: none;\\n\\t\\t}\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * Makes element unselectable.\\n */\\n@define-mixin ck-unselectable {\\n\\t-moz-user-select: none;\\n\\t-webkit-user-select: none;\\n\\t-ms-user-select: none;\\n\\tuser-select: none\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"../../../mixins/_rounded.css\\\";\\n@import \\\"@ckeditor/ckeditor5-ui/theme/mixins/_dir.css\\\";\\n\\n.ck.ck-toolbar {\\n\\t@mixin ck-rounded-corners;\\n\\n\\tbackground: var(--ck-color-toolbar-background);\\n\\tpadding: 0 var(--ck-spacing-small);\\n\\tborder: 1px solid var(--ck-color-toolbar-border);\\n\\n\\t& .ck.ck-toolbar__separator {\\n\\t\\talign-self: stretch;\\n\\t\\twidth: 1px;\\n\\t\\tmin-width: 1px;\\n\\t\\tbackground: var(--ck-color-toolbar-border);\\n\\n\\t\\t/*\\n\\t\\t * These margins make the separators look better in balloon toolbars (when aligned with the \\\"tip\\\").\\n\\t\\t * See https://github.com/ckeditor/ckeditor5/issues/7493.\\n\\t\\t */\\n\\t\\tmargin-top: var(--ck-spacing-small);\\n\\t\\tmargin-bottom: var(--ck-spacing-small);\\n\\t}\\n\\n\\t& .ck-toolbar__line-break {\\n\\t\\theight: 0;\\n\\t}\\n\\n\\t& > .ck-toolbar__items {\\n\\t\\t& > *:not(.ck-toolbar__line-break) {\\n\\t\\t\\t/* (#11) Separate toolbar items. */\\n\\t\\t\\tmargin-right: var(--ck-spacing-small);\\n\\t\\t}\\n\\n\\t\\t/* Don't display a separator after an empty items container, for instance,\\n\\t\\twhen all items were grouped */\\n\\t\\t&:empty + .ck.ck-toolbar__separator {\\n\\t\\t\\tdisplay: none;\\n\\t\\t}\\n\\t}\\n\\n\\t& > .ck-toolbar__items > *:not(.ck-toolbar__line-break),\\n\\t& > .ck.ck-toolbar__grouped-dropdown {\\n\\t\\t/* Make sure items wrapped to the next line have v-spacing */\\n\\t\\tmargin-top: var(--ck-spacing-small);\\n\\t\\tmargin-bottom: var(--ck-spacing-small);\\n\\t}\\n\\n\\t&.ck-toolbar_vertical {\\n\\t\\t/* Items in a vertical toolbar span the entire width. */\\n\\t\\tpadding: 0;\\n\\n\\t\\t/* Specificity matters here. See https://github.com/ckeditor/ckeditor5-theme-lark/issues/168. */\\n\\t\\t& > .ck-toolbar__items > .ck {\\n\\t\\t\\t/* Items in a vertical toolbar should span the horizontal space. */\\n\\t\\t\\twidth: 100%;\\n\\n\\t\\t\\t/* Items in a vertical toolbar should have no margin. */\\n\\t\\t\\tmargin: 0;\\n\\n\\t\\t\\t/* Items in a vertical toolbar span the entire width so rounded corners are pointless. */\\n\\t\\t\\tborder-radius: 0;\\n\\t\\t}\\n\\t}\\n\\n\\t&.ck-toolbar_compact {\\n\\t\\t/* No spacing around items. */\\n\\t\\tpadding: 0;\\n\\n\\t\\t& > .ck-toolbar__items > * {\\n\\t\\t\\t/* Compact toolbar items have no spacing between them. */\\n\\t\\t\\tmargin: 0;\\n\\n\\t\\t\\t/* \\\"Middle\\\" children should have no rounded corners. */\\n\\t\\t\\t&:not(:first-child):not(:last-child) {\\n\\t\\t\\t\\tborder-radius: 0;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t& > .ck.ck-toolbar__grouped-dropdown {\\n\\t\\t/*\\n\\t\\t * Dropdown button has asymmetric padding to fit the arrow.\\n\\t\\t * This button has no arrow so let's revert that padding back to normal.\\n\\t\\t */\\n\\t\\t& > .ck.ck-button.ck-dropdown__button {\\n\\t\\t\\tpadding-left: var(--ck-spacing-tiny);\\n\\t\\t}\\n\\t}\\n\\n\\t/* A drop-down containing the nested toolbar with configured items. */\\n\\t& .ck-toolbar__nested-toolbar-dropdown {\\n\\t\\t/* Prevent empty space in the panel when the dropdown label is visible and long but the toolbar has few items. */\\n\\t\\t& > .ck-dropdown__panel {\\n\\t\\t\\tmin-width: auto;\\n\\t\\t}\\n\\n\\t\\t& > .ck-button > .ck-button__label {\\n\\t\\t\\tmax-width: 7em;\\n\\t\\t\\twidth: auto;\\n\\t\\t}\\n\\t}\\n\\n\\t&:focus {\\n\\t\\toutline: none;\\n\\t}\\n\\n\\t@nest .ck-toolbar-container & {\\n\\t\\tborder: 0;\\n\\t}\\n}\\n\\n/* stylelint-disable */\\n\\n/*\\n * Styles for RTL toolbars.\\n *\\n * Note: In some cases (e.g. a decoupled editor), the toolbar has its own \\\"dir\\\"\\n * because its parent is not controlled by the editor framework.\\n */\\n[dir=\\\"rtl\\\"] .ck.ck-toolbar,\\n.ck.ck-toolbar[dir=\\\"rtl\\\"] {\\n\\t& > .ck-toolbar__items > .ck {\\n\\t\\tmargin-right: 0;\\n\\t}\\n\\n\\t&:not(.ck-toolbar_compact) > .ck-toolbar__items > .ck {\\n\\t\\t/* (#11) Separate toolbar items. */\\n\\t\\tmargin-left: var(--ck-spacing-small);\\n\\t}\\n\\n\\t& > .ck-toolbar__items > .ck:last-child {\\n\\t\\tmargin-left: 0;\\n\\t}\\n\\n\\t&.ck-toolbar_compact > .ck-toolbar__items > .ck {\\n\\t\\t/* No rounded corners on the right side of the first child. */\\n\\t\\t&:first-child {\\n\\t\\t\\tborder-top-left-radius: 0;\\n\\t\\t\\tborder-bottom-left-radius: 0;\\n\\t\\t}\\n\\n\\t\\t/* No rounded corners on the left side of the last child. */\\n\\t\\t&:last-child {\\n\\t\\t\\tborder-top-right-radius: 0;\\n\\t\\t\\tborder-bottom-right-radius: 0;\\n\\t\\t}\\n\\t}\\n\\n\\t/* Separate the the separator form the grouping dropdown when some items are grouped. */\\n\\t& > .ck.ck-toolbar__separator {\\n\\t\\tmargin-left: var(--ck-spacing-small);\\n\\t}\\n\\n\\t/* Some spacing between the items and the separator before the grouped items dropdown. */\\n\\t&.ck-toolbar_grouping > .ck-toolbar__items:not(:empty):not(:only-child) {\\n\\t\\tmargin-left: var(--ck-spacing-small);\\n\\t}\\n}\\n\\n/*\\n * Styles for LTR toolbars.\\n *\\n * Note: In some cases (e.g. a decoupled editor), the toolbar has its own \\\"dir\\\"\\n * because its parent is not controlled by the editor framework.\\n */\\n[dir=\\\"ltr\\\"] .ck.ck-toolbar,\\n.ck.ck-toolbar[dir=\\\"ltr\\\"] {\\n\\t& > .ck-toolbar__items > .ck:last-child {\\n\\t\\tmargin-right: 0;\\n\\t}\\n\\n\\t&.ck-toolbar_compact > .ck-toolbar__items > .ck {\\n\\t\\t/* No rounded corners on the right side of the first child. */\\n\\t\\t&:first-child {\\n\\t\\t\\tborder-top-right-radius: 0;\\n\\t\\t\\tborder-bottom-right-radius: 0;\\n\\t\\t}\\n\\n\\t\\t/* No rounded corners on the left side of the last child. */\\n\\t\\t&:last-child {\\n\\t\\t\\tborder-top-left-radius: 0;\\n\\t\\t\\tborder-bottom-left-radius: 0;\\n\\t\\t}\\n\\t}\\n\\n\\t/* Separate the the separator form the grouping dropdown when some items are grouped. */\\n\\t& > .ck.ck-toolbar__separator {\\n\\t\\tmargin-right: var(--ck-spacing-small);\\n\\t}\\n\\n\\t/* Some spacing between the items and the separator before the grouped items dropdown. */\\n\\t&.ck-toolbar_grouping > .ck-toolbar__items:not(:empty):not(:only-child) {\\n\\t\\tmargin-right: var(--ck-spacing-small);\\n\\t}\\n}\\n\\n/* stylelint-enable */\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * Implements rounded corner interface for .ck-rounded-corners class.\\n *\\n * @see $ck-border-radius\\n */\\n@define-mixin ck-rounded-corners {\\n\\tborder-radius: 0;\\n\\n\\t@nest .ck-rounded-corners &,\\n\\t&.ck-rounded-corners {\\n\\t\\tborder-radius: var(--ck-border-radius);\\n\\t\\t@mixin-content;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck.ck-balloon-panel.ck-tooltip{--ck-balloon-border-width:0px;--ck-balloon-arrow-offset:0px;--ck-balloon-arrow-half-width:4px;--ck-balloon-arrow-height:4px;--ck-color-panel-background:var(--ck-color-tooltip-background);padding:0 var(--ck-spacing-medium);pointer-events:none;z-index:calc(var(--ck-z-modal) + 100)}.ck.ck-balloon-panel.ck-tooltip .ck-tooltip__text{color:var(--ck-color-tooltip-text);font-size:.9em;line-height:1.5}.ck.ck-balloon-panel.ck-tooltip{box-shadow:none}.ck.ck-balloon-panel.ck-tooltip:before{display:none}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/components/tooltip/tooltip.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/components/tooltip/tooltip.css\"],\"names\":[],\"mappings\":\"AAKA,gCCGC,6BAA8B,CAC9B,6BAA8B,CAC9B,iCAAkC,CAClC,6BAA8B,CAC9B,8DAA+D,CAE/D,kCAAmC,CDPnC,mBAAoB,CAEpB,qCACD,CCMC,kDAGC,kCAAmC,CAFnC,cAAe,CACf,eAED,CAbD,gCAgBC,eAMD,CAHC,uCACC,YACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-balloon-panel.ck-tooltip {\\n\\t/* Keep tooltips transparent for any interactions. */\\n\\tpointer-events: none;\\n\\n\\tz-index: calc( var(--ck-z-modal) + 100 );\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"../../../mixins/_rounded.css\\\";\\n\\n.ck.ck-balloon-panel.ck-tooltip {\\n\\t--ck-balloon-border-width: 0px;\\n\\t--ck-balloon-arrow-offset: 0px;\\n\\t--ck-balloon-arrow-half-width: 4px;\\n\\t--ck-balloon-arrow-height: 4px;\\n\\t--ck-color-panel-background: var(--ck-color-tooltip-background);\\n\\n\\tpadding: 0 var(--ck-spacing-medium);\\n\\n\\t& .ck-tooltip__text {\\n\\t\\tfont-size: .9em;\\n\\t\\tline-height: 1.5;\\n\\t\\tcolor: var(--ck-color-tooltip-text);\\n\\t}\\n\\n\\t/* Reset balloon panel styles */\\n\\tbox-shadow: none;\\n\\n\\t/* Hide the default shadow of the .ck-balloon-panel tip */\\n\\t&::before {\\n\\t\\tdisplay: none;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck-hidden{display:none!important}.ck-reset_all :not(.ck-reset_all-excluded *),.ck.ck-reset,.ck.ck-reset_all{box-sizing:border-box;height:auto;position:static;width:auto}: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-powered-by-line-height:10px;--ck-powered-by-padding-vertical:2px;--ck-powered-by-padding-horizontal:4px;--ck-powered-by-text-color:#4f4f4f;--ck-powered-by-border-radius:var(--ck-border-radius);--ck-powered-by-background:#fff;--ck-powered-by-border-color:var(--ck-color-focus-border)}.ck.ck-balloon-panel.ck-powered-by-balloon{--ck-border-radius:var(--ck-powered-by-border-radius);background:var(--ck-powered-by-background);box-shadow:none;min-height:unset;z-index:calc(var(--ck-z-modal) - 1)}.ck.ck-balloon-panel.ck-powered-by-balloon .ck.ck-powered-by{line-height:var(--ck-powered-by-line-height)}.ck.ck-balloon-panel.ck-powered-by-balloon .ck.ck-powered-by a{align-items:center;cursor:pointer;display:flex;filter:grayscale(80%);line-height:var(--ck-powered-by-line-height);opacity:.66;padding:var(--ck-powered-by-padding-vertical) var(--ck-powered-by-padding-horizontal)}.ck.ck-balloon-panel.ck-powered-by-balloon .ck.ck-powered-by .ck-powered-by__label{color:var(--ck-powered-by-text-color);cursor:pointer;font-size:7.5px;font-weight:700;letter-spacing:-.2px;line-height:normal;margin-right:4px;padding-left:2px;text-transform:uppercase}.ck.ck-balloon-panel.ck-powered-by-balloon .ck.ck-powered-by .ck-icon{cursor:pointer;display:block}.ck.ck-balloon-panel.ck-powered-by-balloon .ck.ck-powered-by:hover a{filter:grayscale(0);opacity:1}.ck.ck-balloon-panel.ck-powered-by-balloon[class*=position_inside]{border-color:transparent}.ck.ck-balloon-panel.ck-powered-by-balloon[class*=position_border]{border:var(--ck-focus-ring);border-color:var(--ck-powered-by-border-color)}:root{--ck-color-base-foreground:#fafafa;--ck-color-base-background:#fff;--ck-color-base-border:#ccced1;--ck-color-base-action:#53a336;--ck-color-base-focus:#6cb5f9;--ck-color-base-text:#333;--ck-color-base-active:#2977ff;--ck-color-base-active-focus:#0d65ff;--ck-color-base-error:#db3700;--ck-color-focus-border-coordinates:218,81.8%,56.9%;--ck-color-focus-border:hsl(var(--ck-color-focus-border-coordinates));--ck-color-focus-outer-shadow:#cae1fc;--ck-color-focus-disabled-shadow:rgba(119,186,248,.3);--ck-color-focus-error-shadow:rgba(255,64,31,.3);--ck-color-text:var(--ck-color-base-text);--ck-color-shadow-drop:rgba(0,0,0,.15);--ck-color-shadow-drop-active:rgba(0,0,0,.2);--ck-color-shadow-inner:rgba(0,0,0,.1);--ck-color-button-default-background:transparent;--ck-color-button-default-hover-background:#f0f0f0;--ck-color-button-default-active-background:#f0f0f0;--ck-color-button-default-disabled-background:transparent;--ck-color-button-on-background:#f0f7ff;--ck-color-button-on-hover-background:#dbecff;--ck-color-button-on-active-background:#dbecff;--ck-color-button-on-disabled-background:#f0f2f4;--ck-color-button-on-color:#2977ff;--ck-color-button-action-background:var(--ck-color-base-action);--ck-color-button-action-hover-background:#4d9d30;--ck-color-button-action-active-background:#4d9d30;--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:#939393;--ck-color-switch-button-off-hover-background:#7d7d7d;--ck-color-switch-button-on-background:var(--ck-color-button-action-background);--ck-color-switch-button-on-hover-background:#4d9d30;--ck-color-switch-button-inner-background:var(--ck-color-base-background);--ck-color-switch-button-inner-shadow:rgba(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:var(--ck-color-base-border);--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:var(--ck-color-base-border);--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-button-on-color);--ck-color-list-button-on-background-focus:var(--ck-color-button-on-color);--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-background);--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,176,255,.1);--ck-color-link-fake-selection:rgba(31,176,255,.3);--ck-color-highlight-background:#ff0;--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-reset_all :not(.ck-reset_all-excluded *),.ck.ck-reset,.ck.ck-reset_all{word-wrap:break-word;background:transparent;border:0;margin:0;padding:0;text-decoration:none;transition:none;vertical-align:middle}.ck-reset_all :not(.ck-reset_all-excluded *),.ck.ck-reset_all{border-collapse:collapse;color:var(--ck-color-text);cursor:auto;float:none;font:normal normal normal var(--ck-font-size-base)/var(--ck-line-height-base) var(--ck-font-face);text-align:left;white-space:nowrap}.ck-reset_all .ck-rtl :not(.ck-reset_all-excluded *){text-align:right}.ck-reset_all iframe:not(.ck-reset_all-excluded *){vertical-align:inherit}.ck-reset_all textarea:not(.ck-reset_all-excluded *){white-space:pre-wrap}.ck-reset_all input[type=password]:not(.ck-reset_all-excluded *),.ck-reset_all input[type=text]:not(.ck-reset_all-excluded *),.ck-reset_all textarea:not(.ck-reset_all-excluded *){cursor:text}.ck-reset_all input[type=password][disabled]:not(.ck-reset_all-excluded *),.ck-reset_all input[type=text][disabled]:not(.ck-reset_all-excluded *),.ck-reset_all textarea[disabled]:not(.ck-reset_all-excluded *){cursor:default}.ck-reset_all fieldset:not(.ck-reset_all-excluded *){border:2px groove #dfdee3;padding:10px}.ck-reset_all button:not(.ck-reset_all-excluded *)::-moz-focus-inner{border:0;padding: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)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/globals/_hidden.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/globals/_reset.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/globals/_zindex.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/globals/_transition.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-ui/theme/globals/_poweredby.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_colors.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_disabled.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_focus.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_fonts.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_reset.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_rounded.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_shadow.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_spacing.css\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * A class which hides an element in DOM.\\n */\\n.ck-hidden {\\n\\t/* Override selector specificity. Otherwise, all elements with some display\\n\\tstyle defined will override this one, which is not a desired result. */\\n\\tdisplay: none !important;\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck.ck-reset,\\n.ck.ck-reset_all,\\n.ck-reset_all *:not(.ck-reset_all-excluded *) {\\n\\tbox-sizing: border-box;\\n\\twidth: auto;\\n\\theight: auto;\\n\\tposition: static;\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-z-default: 1;\\n\\t--ck-z-modal: calc( var(--ck-z-default) + 999 );\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * A class that disables all transitions of the element and its children.\\n */\\n.ck-transitions-disabled,\\n.ck-transitions-disabled * {\\n\\ttransition: none !important;\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-powered-by-line-height: 10px;\\n\\t--ck-powered-by-padding-vertical: 2px;\\n\\t--ck-powered-by-padding-horizontal: 4px;\\n\\t--ck-powered-by-text-color: hsl(0, 0%, 31%);\\n\\t--ck-powered-by-border-radius: var(--ck-border-radius);\\n\\t--ck-powered-by-background: hsl(0, 0%, 100%);\\n\\t--ck-powered-by-border-color: var(--ck-color-focus-border);\\n}\\n\\n.ck.ck-balloon-panel.ck-powered-by-balloon {\\n\\t--ck-border-radius: var(--ck-powered-by-border-radius);\\n\\n\\tbox-shadow: none;\\n\\tbackground: var(--ck-powered-by-background);\\n\\tmin-height: unset;\\n\\tz-index: calc( var(--ck-z-modal) - 1 );\\n\\n\\t& .ck.ck-powered-by {\\n\\t\\tline-height: var(--ck-powered-by-line-height);\\n\\n\\t\\t& a {\\n\\t\\t\\tcursor: pointer;\\n\\t\\t\\tdisplay: flex;\\n\\t\\t\\talign-items: center;\\n\\t\\t\\topacity: .66;\\n\\t\\t\\tfilter: grayscale(80%);\\n\\t\\t\\tline-height: var(--ck-powered-by-line-height);\\n\\t\\t\\tpadding: var(--ck-powered-by-padding-vertical) var(--ck-powered-by-padding-horizontal);\\n\\t\\t}\\n\\n\\t\\t& .ck-powered-by__label {\\n\\t\\t\\tfont-size: 7.5px;\\n\\t\\t\\tletter-spacing: -.2px;\\n\\t\\t\\tpadding-left: 2px;\\n\\t\\t\\ttext-transform: uppercase;\\n\\t\\t\\tfont-weight: bold;\\n\\t\\t\\tmargin-right: 4px;\\n\\t\\t\\tcursor: pointer;\\n\\t\\t\\tline-height: normal;\\n\\t\\t\\tcolor: var(--ck-powered-by-text-color);\\n\\n\\t\\t}\\n\\n\\t\\t& .ck-icon {\\n\\t\\t\\tdisplay: block;\\n\\t\\t\\tcursor: pointer;\\n\\t\\t}\\n\\n\\t\\t&:hover {\\n\\t\\t\\t& a {\\n\\t\\t\\t\\tfilter: grayscale(0%);\\n\\t\\t\\t\\topacity: 1;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t&[class*=\\\"position_inside\\\"] {\\n\\t\\tborder-color: transparent;\\n\\t}\\n\\n\\t&[class*=\\\"position_border\\\"] {\\n\\t\\tborder: var(--ck-focus-ring);\\n\\t\\tborder-color: var(--ck-powered-by-border-color);\\n\\t}\\n}\\n\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-color-base-foreground: \\t\\t\\t\\t\\t\\t\\t\\thsl(0, 0%, 98%);\\n\\t--ck-color-base-background: \\t\\t\\t\\t\\t\\t\\t\\thsl(0, 0%, 100%);\\n\\t--ck-color-base-border: \\t\\t\\t\\t\\t\\t\\t\\t\\thsl(220, 6%, 81%);\\n\\t--ck-color-base-action: \\t\\t\\t\\t\\t\\t\\t\\t\\thsl(104, 50.2%, 42.5%);\\n\\t--ck-color-base-focus: \\t\\t\\t\\t\\t\\t\\t\\t\\t\\thsl(209, 92%, 70%);\\n\\t--ck-color-base-text: \\t\\t\\t\\t\\t\\t\\t\\t\\t\\thsl(0, 0%, 20%);\\n\\t--ck-color-base-active: \\t\\t\\t\\t\\t\\t\\t\\t\\thsl(218.1, 100%, 58%);\\n\\t--ck-color-base-active-focus:\\t\\t\\t\\t\\t\\t\\t\\thsl(218.2, 100%, 52.5%);\\n\\t--ck-color-base-error:\\t\\t\\t\\t\\t\\t\\t\\t\\t\\thsl(15, 100%, 43%);\\n\\n\\t/* -- Generic colors ------------------------------------------------------------------------ */\\n\\n\\t--ck-color-focus-border-coordinates: \\t\\t\\t\\t\\t\\t218, 81.8%, 56.9%;\\n\\t--ck-color-focus-border: \\t\\t\\t\\t\\t\\t\\t\\t\\thsl(var(--ck-color-focus-border-coordinates));\\n\\t--ck-color-focus-outer-shadow:\\t\\t\\t\\t\\t\\t\\t\\thsl(212.4, 89.3%, 89%);\\n\\t--ck-color-focus-disabled-shadow:\\t\\t\\t\\t\\t\\t\\thsla(209, 90%, 72%,.3);\\n\\t--ck-color-focus-error-shadow:\\t\\t\\t\\t\\t\\t\\t\\thsla(9,100%,56%,.3);\\n\\t--ck-color-text: \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tvar(--ck-color-base-text);\\n\\t--ck-color-shadow-drop: \\t\\t\\t\\t\\t\\t\\t\\t\\thsla(0, 0%, 0%, 0.15);\\n\\t--ck-color-shadow-drop-active:\\t\\t\\t\\t\\t\\t\\t\\thsla(0, 0%, 0%, 0.2);\\n\\t--ck-color-shadow-inner: \\t\\t\\t\\t\\t\\t\\t\\t\\thsla(0, 0%, 0%, 0.1);\\n\\n\\t/* -- Buttons ------------------------------------------------------------------------------- */\\n\\n\\t--ck-color-button-default-background: \\t\\t\\t\\t\\t\\ttransparent;\\n\\t--ck-color-button-default-hover-background: \\t\\t\\t\\thsl(0, 0%, 94.1%);\\n\\t--ck-color-button-default-active-background: \\t\\t\\t\\thsl(0, 0%, 94.1%);\\n\\t--ck-color-button-default-disabled-background: \\t\\t\\t\\ttransparent;\\n\\n\\t--ck-color-button-on-background: \\t\\t\\t\\t\\t\\t\\thsl(212, 100%, 97.1%);\\n\\t--ck-color-button-on-hover-background: \\t\\t\\t\\t\\t\\thsl(211.7, 100%, 92.9%);\\n\\t--ck-color-button-on-active-background: \\t\\t\\t\\t\\thsl(211.7, 100%, 92.9%);\\n\\t--ck-color-button-on-disabled-background: \\t\\t\\t\\t\\thsl(211, 15%, 95%);\\n\\t--ck-color-button-on-color:\\t\\t\\t\\t\\t\\t\\t\\t\\thsl(218.1, 100%, 58%);\\n\\n\\n\\t--ck-color-button-action-background: \\t\\t\\t\\t\\t\\tvar(--ck-color-base-action);\\n\\t--ck-color-button-action-hover-background: \\t\\t\\t\\t\\thsl(104, 53.2%, 40.2%);\\n\\t--ck-color-button-action-active-background: \\t\\t\\t\\thsl(104, 53.2%, 40.2%);\\n\\t--ck-color-button-action-disabled-background: \\t\\t\\t\\thsl(104, 44%, 58%);\\n\\t--ck-color-button-action-text: \\t\\t\\t\\t\\t\\t\\t\\tvar(--ck-color-base-background);\\n\\n\\t--ck-color-button-save: \\t\\t\\t\\t\\t\\t\\t\\t\\thsl(120, 100%, 27%);\\n\\t--ck-color-button-cancel: \\t\\t\\t\\t\\t\\t\\t\\t\\thsl(15, 100%, 43%);\\n\\n\\t--ck-color-switch-button-off-background:\\t\\t\\t\\t\\thsl(0, 0%, 57.6%);\\n\\t--ck-color-switch-button-off-hover-background:\\t\\t\\t\\thsl(0, 0%, 49%);\\n\\t--ck-color-switch-button-on-background:\\t\\t\\t\\t\\t\\tvar(--ck-color-button-action-background);\\n\\t--ck-color-switch-button-on-hover-background:\\t\\t\\t\\thsl(104, 53.2%, 40.2%);\\n\\t--ck-color-switch-button-inner-background:\\t\\t\\t\\t\\tvar(--ck-color-base-background);\\n\\t--ck-color-switch-button-inner-shadow:\\t\\t\\t\\t\\t\\thsla(0, 0%, 0%, 0.1);\\n\\n\\t/* -- Dropdown ------------------------------------------------------------------------------ */\\n\\n\\t--ck-color-dropdown-panel-background: \\t\\t\\t\\t\\t\\tvar(--ck-color-base-background);\\n\\t--ck-color-dropdown-panel-border: \\t\\t\\t\\t\\t\\t\\tvar(--ck-color-base-border);\\n\\n\\t/* -- Input --------------------------------------------------------------------------------- */\\n\\n\\t--ck-color-input-background: \\t\\t\\t\\t\\t\\t\\t\\tvar(--ck-color-base-background);\\n\\t--ck-color-input-border: \\t\\t\\t\\t\\t\\t\\t\\t\\tvar(--ck-color-base-border);\\n\\t--ck-color-input-error-border:\\t\\t\\t\\t\\t\\t\\t\\tvar(--ck-color-base-error);\\n\\t--ck-color-input-text: \\t\\t\\t\\t\\t\\t\\t\\t\\t\\tvar(--ck-color-base-text);\\n\\t--ck-color-input-disabled-background: \\t\\t\\t\\t\\t\\thsl(0, 0%, 95%);\\n\\t--ck-color-input-disabled-border: \\t\\t\\t\\t\\t\\t\\tvar(--ck-color-base-border);\\n\\t--ck-color-input-disabled-text: \\t\\t\\t\\t\\t\\t\\thsl(0, 0%, 46%);\\n\\n\\t/* -- List ---------------------------------------------------------------------------------- */\\n\\n\\t--ck-color-list-background: \\t\\t\\t\\t\\t\\t\\t\\tvar(--ck-color-base-background);\\n\\t--ck-color-list-button-hover-background: \\t\\t\\t\\t\\tvar(--ck-color-button-default-hover-background);\\n\\t--ck-color-list-button-on-background: \\t\\t\\t\\t\\t\\tvar(--ck-color-button-on-color);\\n\\t--ck-color-list-button-on-background-focus: \\t\\t\\t\\tvar(--ck-color-button-on-color);\\n\\t--ck-color-list-button-on-text:\\t\\t\\t\\t\\t\\t\\t\\tvar(--ck-color-base-background);\\n\\n\\t/* -- Panel --------------------------------------------------------------------------------- */\\n\\n\\t--ck-color-panel-background: \\t\\t\\t\\t\\t\\t\\t\\tvar(--ck-color-base-background);\\n\\t--ck-color-panel-border: \\t\\t\\t\\t\\t\\t\\t\\t\\tvar(--ck-color-base-border);\\n\\n\\t/* -- Toolbar ------------------------------------------------------------------------------- */\\n\\n\\t--ck-color-toolbar-background: \\t\\t\\t\\t\\t\\t\\t\\tvar(--ck-color-base-background);\\n\\t--ck-color-toolbar-border: \\t\\t\\t\\t\\t\\t\\t\\t\\tvar(--ck-color-base-border);\\n\\n\\t/* -- Tooltip ------------------------------------------------------------------------------- */\\n\\n\\t--ck-color-tooltip-background: \\t\\t\\t\\t\\t\\t\\t\\tvar(--ck-color-base-text);\\n\\t--ck-color-tooltip-text: \\t\\t\\t\\t\\t\\t\\t\\t\\tvar(--ck-color-base-background);\\n\\n\\t/* -- Engine -------------------------------------------------------------------------------- */\\n\\n\\t--ck-color-engine-placeholder-text: \\t\\t\\t\\t\\t\\thsl(0, 0%, 44%);\\n\\n\\t/* -- Upload -------------------------------------------------------------------------------- */\\n\\n\\t--ck-color-upload-bar-background:\\t\\t \\t\\t\\t\\t\\thsl(209, 92%, 70%);\\n\\n\\t/* -- Link -------------------------------------------------------------------------------- */\\n\\n\\t--ck-color-link-default:\\t\\t\\t\\t\\t\\t\\t\\t\\thsl(240, 100%, 47%);\\n\\t--ck-color-link-selected-background:\\t\\t\\t\\t\\t\\thsla(201, 100%, 56%, 0.1);\\n\\t--ck-color-link-fake-selection:\\t\\t\\t\\t\\t\\t\\t\\thsla(201, 100%, 56%, 0.3);\\n\\n\\t/* -- Search result highlight ---------------------------------------------------------------- */\\n\\n\\t--ck-color-highlight-background:\\t\\t\\t\\t\\t\\t\\thsl(60, 100%, 50%)\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t/**\\n\\t * An opacity value of disabled UI item.\\n\\t */\\n\\t--ck-disabled-opacity: .5;\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t/**\\n\\t * The geometry of the of focused element's outer shadow.\\n\\t */\\n\\t--ck-focus-outer-shadow-geometry: 0 0 0 3px;\\n\\n\\t/**\\n\\t * A visual style of focused element's outer shadow.\\n\\t */\\n\\t--ck-focus-outer-shadow: var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-outer-shadow);\\n\\n\\t/**\\n\\t * A visual style of focused element's outer shadow (when disabled).\\n\\t */\\n\\t--ck-focus-disabled-outer-shadow: var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-disabled-shadow);\\n\\n\\t/**\\n\\t * A visual style of focused element's outer shadow (when has errors).\\n\\t */\\n\\t--ck-focus-error-outer-shadow: var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-error-shadow);\\n\\n\\t/**\\n\\t * A visual style of focused element's border or outline.\\n\\t */\\n\\t--ck-focus-ring: 1px solid var(--ck-color-focus-border);\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-font-size-base: 13px;\\n\\t--ck-line-height-base: 1.84615;\\n\\t--ck-font-face: Helvetica, Arial, Tahoma, Verdana, Sans-Serif;\\n\\n\\t--ck-font-size-tiny: 0.7em;\\n\\t--ck-font-size-small: 0.75em;\\n\\t--ck-font-size-normal: 1em;\\n\\t--ck-font-size-big: 1.4em;\\n\\t--ck-font-size-large: 1.8em;\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t/* This is super-important. This is **manually** adjusted so a button without an icon\\n\\tis never smaller than a button with icon, additionally making sure that text-less buttons\\n\\tare perfect squares. The value is also shared by other components which should stay \\\"in-line\\\"\\n\\twith buttons. */\\n\\t--ck-ui-component-min-height: 2.3em;\\n}\\n\\n/**\\n * Resets an element, ignoring its children.\\n */\\n.ck.ck-reset,\\n.ck.ck-reset_all,\\n.ck-reset_all *:not(.ck-reset_all-excluded *) {\\n\\t/* Do not include inheritable rules here. */\\n\\tmargin: 0;\\n\\tpadding: 0;\\n\\tborder: 0;\\n\\tbackground: transparent;\\n\\ttext-decoration: none;\\n\\tvertical-align: middle;\\n\\ttransition: none;\\n\\n\\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/105 */\\n\\tword-wrap: break-word;\\n}\\n\\n/**\\n * Resets an element AND its children.\\n */\\n.ck.ck-reset_all,\\n.ck-reset_all *:not(.ck-reset_all-excluded *) {\\n\\t/* These are rule inherited by all children elements. */\\n\\tborder-collapse: collapse;\\n\\tfont: normal normal normal var(--ck-font-size-base)/var(--ck-line-height-base) var(--ck-font-face);\\n\\tcolor: var(--ck-color-text);\\n\\ttext-align: left;\\n\\twhite-space: nowrap;\\n\\tcursor: auto;\\n\\tfloat: none;\\n}\\n\\n.ck-reset_all {\\n\\t& .ck-rtl *:not(.ck-reset_all-excluded *) {\\n\\t\\ttext-align: right;\\n\\t}\\n\\n\\t& iframe:not(.ck-reset_all-excluded *) {\\n\\t\\t/* For IE */\\n\\t\\tvertical-align: inherit;\\n\\t}\\n\\n\\t& textarea:not(.ck-reset_all-excluded *) {\\n\\t\\twhite-space: pre-wrap;\\n\\t}\\n\\n\\t& textarea:not(.ck-reset_all-excluded *),\\n\\t& input[type=\\\"text\\\"]:not(.ck-reset_all-excluded *),\\n\\t& input[type=\\\"password\\\"]:not(.ck-reset_all-excluded *) {\\n\\t\\tcursor: text;\\n\\t}\\n\\n\\t& textarea[disabled]:not(.ck-reset_all-excluded *),\\n\\t& input[type=\\\"text\\\"][disabled]:not(.ck-reset_all-excluded *),\\n\\t& input[type=\\\"password\\\"][disabled]:not(.ck-reset_all-excluded *) {\\n\\t\\tcursor: default;\\n\\t}\\n\\n\\t& fieldset:not(.ck-reset_all-excluded *) {\\n\\t\\tpadding: 10px;\\n\\t\\tborder: 2px groove hsl(255, 7%, 88%);\\n\\t}\\n\\n\\t& button:not(.ck-reset_all-excluded *)::-moz-focus-inner {\\n\\t\\t/* See http://stackoverflow.com/questions/5517744/remove-extra-button-spacing-padding-in-firefox */\\n\\t\\tpadding: 0;\\n\\t\\tborder: 0\\n\\t}\\n}\\n\\n/**\\n * Default UI rules for RTL languages.\\n */\\n.ck[dir=\\\"rtl\\\"],\\n.ck[dir=\\\"rtl\\\"] .ck {\\n\\ttext-align: right;\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * Default border-radius value.\\n */\\n:root{\\n\\t--ck-border-radius: 2px;\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t/**\\n\\t * A visual style of element's inner shadow (i.e. input).\\n\\t */\\n\\t--ck-inner-shadow: 2px 2px 3px var(--ck-color-shadow-inner) inset;\\n\\n\\t/**\\n\\t * A visual style of element's drop shadow (i.e. panel).\\n\\t */\\n\\t--ck-drop-shadow: 0 1px 2px 1px var(--ck-color-shadow-drop);\\n\\n\\t/**\\n\\t * A visual style of element's active shadow (i.e. comment or suggestion).\\n\\t */\\n\\t--ck-drop-shadow-active: 0 3px 6px 1px var(--ck-color-shadow-drop-active);\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-spacing-unit: \\t\\t\\t\\t\\t\\t0.6em;\\n\\t--ck-spacing-large: \\t\\t\\t\\t\\tcalc(var(--ck-spacing-unit) * 1.5);\\n\\t--ck-spacing-standard: \\t\\t\\t\\t\\tvar(--ck-spacing-unit);\\n\\t--ck-spacing-medium: \\t\\t\\t\\t\\tcalc(var(--ck-spacing-unit) * 0.8);\\n\\t--ck-spacing-small: \\t\\t\\t\\t\\tcalc(var(--ck-spacing-unit) * 0.5);\\n\\t--ck-spacing-tiny: \\t\\t\\t\\t\\t\\tcalc(var(--ck-spacing-unit) * 0.3);\\n\\t--ck-spacing-extra-tiny: \\t\\t\\t\\tcalc(var(--ck-spacing-unit) * 0.16);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":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);border:1px solid var(--ck-color-resizer-tooltip-text);border-radius:var(--ck-resizer-border-radius);color:var(--ck-color-resizer-tooltip-text);display:block;font-size:var(--ck-font-size-tiny);height:var(--ck-resizer-tooltip-height);line-height:var(--ck-resizer-tooltip-height);padding:0 var(--ck-spacing-small)}.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{left:var(--ck-resizer-tooltip-offset);top:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-top-right{right:var(--ck-resizer-tooltip-offset);top: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{left:50%;top:calc(var(--ck-resizer-tooltip-height)*-1);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-color:transparent;outline-style:solid;outline-width:var(--ck-widget-outline-thickness);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{background-color:var(--ck-color-widget-editable-focus-background);border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow),0 0;outline:none}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{background-color:transparent;border-radius:var(--ck-border-radius) var(--ck-border-radius) 0 0;box-sizing:border-box;left:calc(0px - var(--ck-widget-outline-thickness));opacity:0;padding:4px;top:0;transform:translateY(-100%);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)}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon{color:var(--ck-color-widget-drag-handler-icon-color);height:var(--ck-widget-handler-icon-size);width:var(--ck-widget-handler-icon-size)}.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{background-color:var(--ck-color-widget-hover-border);opacity:1}.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{background-color:var(--ck-color-focus-border);opacity:1}.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:hover>.ck-widget__selection-handle,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle:hover>.ck-widget__selection-handle:hover,.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{background:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable blockquote>.ck-widget.ck-widget_with-selection-handle:first-child,.ck.ck-editor__editable>.ck-widget.ck-widget_with-selection-handle:first-child{margin-top:calc(1em + var(--ck-widget-handler-icon-size))}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-widget/theme/widget.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-widget/widget.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_focus.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css\"],\"names\":[],\"mappings\":\"AAKA,MACC,+CAAgD,CAChD,6CAAsD,CACtD,uCAAgD,CAEhD,kDAAmD,CACnD,gCAAiC,CACjC,kEACD,CAOA,8DAEC,iBAqBD,CAnBC,4EACC,iBAOD,CALC,qFAGC,aACD,CASD,iLACC,kBACD,CAGD,kBACC,qDAAsD,CAEtD,qDAAsD,CACtD,6CAA8C,CAF9C,0CAA2C,CAI3C,aAAc,CADd,kCAAmC,CAGnC,uCAAwC,CACxC,4CAA6C,CAF7C,iCAsCD,CAlCC,8NAKC,iBACD,CAEA,0CAEC,qCAAsC,CADtC,oCAED,CAEA,2CAEC,sCAAuC,CADvC,oCAED,CAEA,8CACC,uCAAwC,CACxC,sCACD,CAEA,6CACC,uCAAwC,CACxC,qCACD,CAGA,8CAEC,QAAS,CADT,6CAAgD,CAEhD,yBACD,CCjFD,MACC,iCAAkC,CAClC,kCAAmC,CACnC,4CAA6C,CAC7C,wCAAyC,CAEzC,wCAAiD,CACjD,sCAAkD,CAClD,2EAA4E,CAC5E,yEACD,CAEA,eAGC,yBAA0B,CAD1B,mBAAoB,CADpB,gDAAiD,CAGjD,6GAUD,CARC,0EAEC,6EACD,CAEA,qBACC,iDACD,CAGD,gCACC,4BAWD,CAPC,yGAKC,iEAAkE,CCnCnE,2BAA2B,CCF3B,qCAA8B,CDC9B,YDqCA,CAIA,4EAKC,4BAA6B,CAa7B,iEAAkE,CAhBlE,qBAAsB,CAoBtB,mDAAoD,CAhBpD,SAAU,CALV,WAAY,CAsBZ,KAAM,CAFN,2BAA4B,CAT5B,6SAgCD,CAnBC,qFAIC,oDAAqD,CADrD,yCAA0C,CAD1C,wCAWD,CANC,kHACC,SAAU,CAGV,+DACD,CAID,wHACC,SACD,CAID,kFAEC,oDAAqD,CADrD,SAED,CAKC,oMAEC,6CAA8C,CAD9C,SAOD,CAHC,gRACC,SACD,CAOH,qFACC,SAAU,CACV,oDACD,CAGA,gDAEC,eAkBD,CAhBC,yEAOC,iCACD,CAGC,gOAEC,gDACD,CAOD,wIAEC,mDAQD,CALE,ghBAEC,gDACD,CAKH,yKAOC,yDACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-color-resizer: var(--ck-color-focus-border);\\n\\t--ck-color-resizer-tooltip-background: hsl(0, 0%, 15%);\\n\\t--ck-color-resizer-tooltip-text: hsl(0, 0%, 95%);\\n\\n\\t--ck-resizer-border-radius: var(--ck-border-radius);\\n\\t--ck-resizer-tooltip-offset: 10px;\\n\\t--ck-resizer-tooltip-height: calc(var(--ck-spacing-small) * 2 + 10px);\\n}\\n\\n.ck .ck-widget {\\n\\t/* This is neccessary for type around UI to be positioned properly. */\\n\\tposition: relative;\\n}\\n\\n.ck .ck-widget.ck-widget_with-selection-handle {\\n\\t/* Make the widget wrapper a relative positioning container for the drag handle. */\\n\\tposition: relative;\\n\\n\\t& .ck-widget__selection-handle {\\n\\t\\tposition: absolute;\\n\\n\\t\\t& .ck-icon {\\n\\t\\t\\t/* Make sure the icon in not a subject to font-size or line-height to avoid\\n\\t\\t\\tunnecessary spacing around it. */\\n\\t\\t\\tdisplay: block;\\n\\t\\t}\\n\\t}\\n\\n\\t/* Show the selection handle on mouse hover over the widget, but not for nested widgets. */\\n\\t&:hover > .ck-widget__selection-handle {\\n\\t\\tvisibility: visible;\\n\\t}\\n\\n\\t/* Show the selection handle when the widget is selected, but not for nested widgets. */\\n\\t&.ck-widget_selected > .ck-widget__selection-handle {\\n\\t\\tvisibility: visible;\\n\\t}\\n}\\n\\n.ck .ck-size-view {\\n\\tbackground: var(--ck-color-resizer-tooltip-background);\\n\\tcolor: var(--ck-color-resizer-tooltip-text);\\n\\tborder: 1px solid var(--ck-color-resizer-tooltip-text);\\n\\tborder-radius: var(--ck-resizer-border-radius);\\n\\tfont-size: var(--ck-font-size-tiny);\\n\\tdisplay: block;\\n\\tpadding: 0 var(--ck-spacing-small);\\n\\theight: var(--ck-resizer-tooltip-height);\\n\\tline-height: var(--ck-resizer-tooltip-height);\\n\\n\\t&.ck-orientation-top-left,\\n\\t&.ck-orientation-top-right,\\n\\t&.ck-orientation-bottom-right,\\n\\t&.ck-orientation-bottom-left,\\n\\t&.ck-orientation-above-center {\\n\\t\\tposition: absolute;\\n\\t}\\n\\n\\t&.ck-orientation-top-left {\\n\\t\\ttop: var(--ck-resizer-tooltip-offset);\\n\\t\\tleft: var(--ck-resizer-tooltip-offset);\\n\\t}\\n\\n\\t&.ck-orientation-top-right {\\n\\t\\ttop: var(--ck-resizer-tooltip-offset);\\n\\t\\tright: var(--ck-resizer-tooltip-offset);\\n\\t}\\n\\n\\t&.ck-orientation-bottom-right {\\n\\t\\tbottom: var(--ck-resizer-tooltip-offset);\\n\\t\\tright: var(--ck-resizer-tooltip-offset);\\n\\t}\\n\\n\\t&.ck-orientation-bottom-left {\\n\\t\\tbottom: var(--ck-resizer-tooltip-offset);\\n\\t\\tleft: var(--ck-resizer-tooltip-offset);\\n\\t}\\n\\n\\t/* Class applied if the widget is too small to contain the size label */\\n\\t&.ck-orientation-above-center {\\n\\t\\ttop: calc(var(--ck-resizer-tooltip-height) * -1);\\n\\t\\tleft: 50%;\\n\\t\\ttransform: translate(-50%);\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n@import \\\"../mixins/_focus.css\\\";\\n@import \\\"../mixins/_shadow.css\\\";\\n\\n:root {\\n\\t--ck-widget-outline-thickness: 3px;\\n\\t--ck-widget-handler-icon-size: 16px;\\n\\t--ck-widget-handler-animation-duration: 200ms;\\n\\t--ck-widget-handler-animation-curve: ease;\\n\\n\\t--ck-color-widget-blurred-border: hsl(0, 0%, 87%);\\n\\t--ck-color-widget-hover-border: hsl(43, 100%, 62%);\\n\\t--ck-color-widget-editable-focus-background: var(--ck-color-base-background);\\n\\t--ck-color-widget-drag-handler-icon-color: var(--ck-color-base-background);\\n}\\n\\n.ck .ck-widget {\\n\\toutline-width: var(--ck-widget-outline-thickness);\\n\\toutline-style: solid;\\n\\toutline-color: transparent;\\n\\ttransition: outline-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);\\n\\n\\t&.ck-widget_selected,\\n\\t&.ck-widget_selected:hover {\\n\\t\\toutline: var(--ck-widget-outline-thickness) solid var(--ck-color-focus-border);\\n\\t}\\n\\n\\t&:hover {\\n\\t\\toutline-color: var(--ck-color-widget-hover-border);\\n\\t}\\n}\\n\\n.ck .ck-editor__nested-editable {\\n\\tborder: 1px solid transparent;\\n\\n\\t/* The :focus style is applied before .ck-editor__nested-editable_focused class is rendered in the view.\\n\\tThese styles show a different border for a blink of an eye, so `:focus` need to have same styles applied. */\\n\\t&.ck-editor__nested-editable_focused,\\n\\t&:focus {\\n\\t\\t@mixin ck-focus-ring;\\n\\t\\t@mixin ck-box-shadow var(--ck-inner-shadow);\\n\\n\\t\\tbackground-color: var(--ck-color-widget-editable-focus-background);\\n\\t}\\n}\\n\\n.ck .ck-widget.ck-widget_with-selection-handle {\\n\\t& .ck-widget__selection-handle {\\n\\t\\tpadding: 4px;\\n\\t\\tbox-sizing: border-box;\\n\\n\\t\\t/* Background and opacity will be animated as the handler shows up or the widget gets selected. */\\n\\t\\tbackground-color: transparent;\\n\\t\\topacity: 0;\\n\\n\\t\\t/* Transition:\\n\\t\\t   * background-color for the .ck-widget_selected state change,\\n\\t\\t   * visibility for hiding the handler,\\n\\t\\t   * opacity for the proper look of the icon when the handler disappears. */\\n\\t\\ttransition:\\n\\t\\t\\tbackground-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),\\n\\t\\t\\tvisibility var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),\\n\\t\\t\\topacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);\\n\\n\\t\\t/* Make only top corners round. */\\n\\t\\tborder-radius: var(--ck-border-radius) var(--ck-border-radius) 0 0;\\n\\n\\t\\t/* Place the drag handler outside the widget wrapper. */\\n\\t\\ttransform: translateY(-100%);\\n\\t\\tleft: calc(0px - var(--ck-widget-outline-thickness));\\n\\t\\ttop: 0;\\n\\n\\t\\t& .ck-icon {\\n\\t\\t\\t/* Make sure the dimensions of the icon are independent of the fon-size of the content. */\\n\\t\\t\\twidth: var(--ck-widget-handler-icon-size);\\n\\t\\t\\theight: var(--ck-widget-handler-icon-size);\\n\\t\\t\\tcolor: var(--ck-color-widget-drag-handler-icon-color);\\n\\n\\t\\t\\t/* The \\\"selected\\\" part of the icon is invisible by default */\\n\\t\\t\\t& .ck-icon__selected-indicator {\\n\\t\\t\\t\\topacity: 0;\\n\\n\\t\\t\\t\\t/* Note: The animation is longer on purpose. Simply feels better. */\\n\\t\\t\\t\\ttransition: opacity 300ms var(--ck-widget-handler-animation-curve);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t/* Advertise using the look of the icon that once clicked the handler, the widget will be selected. */\\n\\t\\t&:hover .ck-icon .ck-icon__selected-indicator {\\n\\t\\t\\topacity: 1;\\n\\t\\t}\\n\\t}\\n\\n\\t/* Show the selection handler on mouse hover over the widget, but not for nested widgets. */\\n\\t&:hover > .ck-widget__selection-handle {\\n\\t\\topacity: 1;\\n\\t\\tbackground-color: var(--ck-color-widget-hover-border);\\n\\t}\\n\\n\\t/* Show the selection handler when the widget is selected, but not for nested widgets. */\\n\\t&.ck-widget_selected,\\n\\t&.ck-widget_selected:hover {\\n\\t\\t& > .ck-widget__selection-handle {\\n\\t\\t\\topacity: 1;\\n\\t\\t\\tbackground-color: var(--ck-color-focus-border);\\n\\n\\t\\t\\t/* When the widget is selected, notify the user using the proper look of the icon. */\\n\\t\\t\\t& .ck-icon .ck-icon__selected-indicator {\\n\\t\\t\\t\\topacity: 1;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\\n/* In a RTL environment, align the selection handler to the right side of the widget */\\n/* stylelint-disable-next-line no-descending-specificity */\\n.ck[dir=\\\"rtl\\\"] .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle {\\n\\tleft: auto;\\n\\tright: calc(0px - var(--ck-widget-outline-thickness));\\n}\\n\\n/* https://github.com/ckeditor/ckeditor5/issues/6415 */\\n.ck.ck-editor__editable.ck-read-only .ck-widget {\\n\\t/* Prevent the :hover outline from showing up because of the used outline-color transition. */\\n\\ttransition: none;\\n\\n\\t&:not(.ck-widget_selected) {\\n\\t\\t/* Disable visual effects of hover/active widget when CKEditor is in readOnly mode.\\n\\t\\t * See: https://github.com/ckeditor/ckeditor5/issues/1261\\n\\t\\t *\\n\\t\\t * Leave the unit because this custom property is used in calc() by other features.\\n\\t\\t * See: https://github.com/ckeditor/ckeditor5/issues/6775\\n\\t\\t */\\n\\t\\t--ck-widget-outline-thickness: 0px;\\n\\t}\\n\\n\\t&.ck-widget_with-selection-handle {\\n\\t\\t& .ck-widget__selection-handle,\\n\\t\\t& .ck-widget__selection-handle:hover {\\n\\t\\t\\tbackground: var(--ck-color-widget-blurred-border);\\n\\t\\t}\\n\\t}\\n}\\n\\n/* Style the widget when it's selected but the editable it belongs to lost focus. */\\n/* stylelint-disable-next-line no-descending-specificity */\\n.ck.ck-editor__editable.ck-blurred .ck-widget {\\n\\t&.ck-widget_selected,\\n\\t&.ck-widget_selected:hover {\\n\\t\\toutline-color: var(--ck-color-widget-blurred-border);\\n\\n\\t\\t&.ck-widget_with-selection-handle {\\n\\t\\t\\t& > .ck-widget__selection-handle,\\n\\t\\t\\t& > .ck-widget__selection-handle:hover {\\n\\t\\t\\t\\tbackground: var(--ck-color-widget-blurred-border);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\\n.ck.ck-editor__editable > .ck-widget.ck-widget_with-selection-handle:first-child,\\n.ck.ck-editor__editable blockquote > .ck-widget.ck-widget_with-selection-handle:first-child {\\n\\t/* Do not crop selection handler if a widget is a first-child in the blockquote or in the root editable.\\n\\tIn fact, anything with overflow: hidden.\\n\\thttps://github.com/ckeditor/ckeditor5-block-quote/issues/28\\n\\thttps://github.com/ckeditor/ckeditor5-widget/issues/44\\n\\thttps://github.com/ckeditor/ckeditor5-widget/issues/66 */\\n\\tmargin-top: calc(1em + var(--ck-widget-handler-icon-size));\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * A visual style of focused element's border.\\n */\\n@define-mixin ck-focus-ring {\\n\\t/* Disable native outline. */\\n\\toutline: none;\\n\\tborder: var(--ck-focus-ring)\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n/**\\n * A helper to combine multiple shadows.\\n */\\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\\n\\tbox-shadow: $shadowA, $shadowB;\\n}\\n\\n/**\\n * Gives an element a drop shadow so it looks like a floating panel.\\n */\\n@define-mixin ck-drop-shadow {\\n\\t@mixin ck-box-shadow var(--ck-drop-shadow);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck .ck-widget_with-resizer{position:relative}.ck .ck-widget__resizer{display:none;left:0;pointer-events:none;position:absolute;top:0}.ck-focused .ck-widget_with-resizer.ck-widget_selected>.ck-widget__resizer{display:block}.ck .ck-widget__resizer__handle{pointer-events:all;position:absolute}.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{background:var(--ck-color-focus-border);border:var(--ck-resizer-border-width) solid #fff;border-radius:var(--ck-resizer-border-radius);height:var(--ck-resizer-size);width:var(--ck-resizer-size)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-left{left:var(--ck-resizer-offset);top:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-right{right:var(--ck-resizer-offset);top: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)}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-widget/theme/widgetresize.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-widget/widgetresize.css\"],\"names\":[],\"mappings\":\"AAKA,4BAEC,iBACD,CAEA,wBACC,YAAa,CAMb,MAAO,CAFP,mBAAoB,CAHpB,iBAAkB,CAMlB,KACD,CAGC,2EACC,aACD,CAGD,gCAIC,kBAAmB,CAHnB,iBAcD,CATC,4IAEC,kBACD,CAEA,4IAEC,kBACD,CCpCD,MACC,sBAAuB,CAGvB,yDAAiE,CACjE,6BACD,CAEA,wBACC,yCACD,CAEA,gCAGC,uCAAwC,CACxC,gDAA6D,CAC7D,6CAA8C,CAH9C,6BAA8B,CAD9B,4BAyBD,CAnBC,oEAEC,6BAA8B,CAD9B,4BAED,CAEA,qEAEC,8BAA+B,CAD/B,4BAED,CAEA,wEACC,+BAAgC,CAChC,8BACD,CAEA,uEACC,+BAAgC,CAChC,6BACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck .ck-widget_with-resizer {\\n\\t/* Make the widget wrapper a relative positioning container for the drag handle. */\\n\\tposition: relative;\\n}\\n\\n.ck .ck-widget__resizer {\\n\\tdisplay: none;\\n\\tposition: absolute;\\n\\n\\t/* The wrapper itself should not interfere with the pointer device, only the handles should. */\\n\\tpointer-events: none;\\n\\n\\tleft: 0;\\n\\ttop: 0;\\n}\\n\\n.ck-focused .ck-widget_with-resizer.ck-widget_selected {\\n\\t& > .ck-widget__resizer {\\n\\t\\tdisplay: block;\\n\\t}\\n}\\n\\n.ck .ck-widget__resizer__handle {\\n\\tposition: absolute;\\n\\n\\t/* Resizers are the only UI elements that should interfere with a pointer device. */\\n\\tpointer-events: all;\\n\\n\\t&.ck-widget__resizer__handle-top-left,\\n\\t&.ck-widget__resizer__handle-bottom-right {\\n\\t\\tcursor: nwse-resize;\\n\\t}\\n\\n\\t&.ck-widget__resizer__handle-top-right,\\n\\t&.ck-widget__resizer__handle-bottom-left {\\n\\t\\tcursor: nesw-resize;\\n\\t}\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-resizer-size: 10px;\\n\\n\\t/* Set the resizer with a 50% offset. */\\n\\t--ck-resizer-offset: calc( ( var(--ck-resizer-size) / -2 ) - 2px);\\n\\t--ck-resizer-border-width: 1px;\\n}\\n\\n.ck .ck-widget__resizer {\\n\\toutline: 1px solid var(--ck-color-resizer);\\n}\\n\\n.ck .ck-widget__resizer__handle {\\n\\twidth: var(--ck-resizer-size);\\n\\theight: var(--ck-resizer-size);\\n\\tbackground: var(--ck-color-focus-border);\\n\\tborder: var(--ck-resizer-border-width) solid hsl(0, 0%, 100%);\\n\\tborder-radius: var(--ck-resizer-border-radius);\\n\\n\\t&.ck-widget__resizer__handle-top-left {\\n\\t\\ttop: var(--ck-resizer-offset);\\n\\t\\tleft: var(--ck-resizer-offset);\\n\\t}\\n\\n\\t&.ck-widget__resizer__handle-top-right {\\n\\t\\ttop: var(--ck-resizer-offset);\\n\\t\\tright: var(--ck-resizer-offset);\\n\\t}\\n\\n\\t&.ck-widget__resizer__handle-bottom-right {\\n\\t\\tbottom: var(--ck-resizer-offset);\\n\\t\\tright: var(--ck-resizer-offset);\\n\\t}\\n\\n\\t&.ck-widget__resizer__handle-bottom-left {\\n\\t\\tbottom: var(--ck-resizer-offset);\\n\\t\\tleft: var(--ck-resizer-offset);\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ck .ck-widget .ck-widget__type-around__button{display:block;overflow:hidden;position:absolute;z-index:var(--ck-z-default)}.ck .ck-widget .ck-widget__type-around__button svg{left:50%;position:absolute;top:50%;z-index:calc(var(--ck-z-default) + 2)}.ck .ck-widget .ck-widget__type-around__button.ck-widget__type-around__button_before{left:min(10%,30px);top:calc(var(--ck-widget-outline-thickness)*-.5);transform:translateY(-50%)}.ck .ck-widget .ck-widget__type-around__button.ck-widget__type-around__button_after{bottom:calc(var(--ck-widget-outline-thickness)*-.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;left:1px;position:absolute;top:1px;z-index:calc(var(--ck-z-default) + 1)}.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__fake-caret{display:none;left:0;position:absolute;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{display:block;top:calc(var(--ck-widget-outline-thickness)*-1 - 1px)}.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{background:var(--ck-color-widget-type-around-button);border-radius:100px;height:var(--ck-widget-type-around-button-size);opacity:0;pointer-events:none;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);width:var(--ck-widget-type-around-button-size)}.ck .ck-widget .ck-widget__type-around__button svg{height:8px;margin-top:1px;transform:translate(-50%,-50%);transition:transform .5s ease;width:10px}.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{background:linear-gradient(135deg,hsla(0,0%,100%,0),hsla(0,0%,100%,.3));border-radius:100px;height:calc(var(--ck-widget-type-around-button-size) - 2px);width:calc(var(--ck-widget-type-around-button-size) - 2px)}.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{animation:ck-widget-type-around-fake-caret-pulse 1s linear infinite normal forwards;background:var(--ck-color-base-text);height:1px;outline:1px solid hsla(0,0%,100%,.5);pointer-events:none}.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_selected.ck-widget_with-resizer>.ck-widget__resizer,.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_selected.ck-widget_with-resizer>.ck-widget__resizer,.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[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}}\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@ckeditor/ckeditor5-widget/theme/widgettypearound.css\",\"webpack://./node_modules/@ckeditor/ckeditor5-theme-lark/theme/ckeditor5-widget/widgettypearound.css\"],\"names\":[],\"mappings\":\"AASC,+CACC,aAAc,CAEd,eAAgB,CADhB,iBAAkB,CAElB,2BAwBD,CAtBC,mDAGC,QAAS,CAFT,iBAAkB,CAClB,OAAQ,CAER,qCACD,CAEA,qFAGC,kBAAoB,CADpB,gDAAoD,CAGpD,0BACD,CAEA,oFAEC,mDAAuD,CACvD,mBAAqB,CAErB,yBACD,CAUA,mLACC,UAAW,CACX,aAAc,CAGd,QAAS,CAFT,iBAAkB,CAClB,OAAQ,CAER,qCACD,CAMD,2EACC,YAAa,CAEb,MAAO,CADP,iBAAkB,CAElB,OACD,CAOA,iFACC,gDAAqD,CACrD,iDACD,CAKA,wHAEC,aAAc,CADd,qDAED,CAKA,uHACC,wDAA6D,CAC7D,aACD,CAoBD,mOACC,YACD,CC3GA,MACC,wCAAyC,CACzC,wEAAyE,CACzE,8EAA+E,CAC/E,2FAA4F,CAC5F,wDAAyD,CACzD,uDAAwD,CACxD,yEACD,CAgBC,+CAGC,oDAAqD,CACrD,mBAAoB,CAFpB,+CAAgD,CAVjD,SAAU,CACV,mBAAoB,CAYnB,uMAAyM,CAJzM,8CAkDD,CA1CC,mDAEC,UAAW,CAGX,cAAe,CAFf,8BAA+B,CAC/B,6BAA8B,CAH9B,UAoBD,CAdC,qDACC,mBAAoB,CACpB,mBAAoB,CAEpB,SAAU,CACV,qDAAsD,CACtD,kBAAmB,CACnB,oBAAqB,CACrB,qBACD,CAEA,wDACC,kBACD,CAGD,qDAIC,6DAcD,CARE,kEACC,oDACD,CAEA,8DACC,wDACD,CAUF,uKAvED,SAAU,CACV,mBAwEC,CAOD,gGACC,0DACD,CAOA,uKAEC,2DAQD,CANC,mLAIC,uEAAkF,CADlF,mBAAoB,CADpB,2DAA4D,CAD5D,0DAID,CAOD,8GACC,gBACD,CAKA,mDAGC,mFAAoF,CAOpF,oCAAqC,CARrC,UAAW,CAOX,oCAAwC,CARxC,mBAUD,CAOC,6JAEC,yBACD,CAUA,yKACC,iDACD,CAMA,uOAlJD,SAAU,CACV,mBAmJC,CAoBA,6yBACC,SACD,CASF,uHACC,aAAc,CACd,iBACD,CAYG,iRAlMF,SAAU,CACV,mBAmME,CAQH,kIACC,qEAKD,CAHC,wIACC,WACD,CAGD,4CACC,GACC,oBACD,CACA,OACC,mBACD,CACD,CAEA,gDACC,OACC,mBACD,CACA,OACC,mBACD,CACD,CAEA,8CACC,GACC,6HACD,CACA,IACC,6HACD,CACA,GACC,+HACD,CACD,CAEA,kDACC,GACC,SACD,CACA,IACC,SACD,CACA,IACC,SACD,CACA,IACC,SACD,CACA,GACC,SACD,CACD\",\"sourcesContent\":[\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n.ck .ck-widget {\\n\\t/*\\n\\t * Styles of the type around buttons\\n\\t */\\n\\t& .ck-widget__type-around__button {\\n\\t\\tdisplay: block;\\n\\t\\tposition: absolute;\\n\\t\\toverflow: hidden;\\n\\t\\tz-index: var(--ck-z-default);\\n\\n\\t\\t& svg {\\n\\t\\t\\tposition: absolute;\\n\\t\\t\\ttop: 50%;\\n\\t\\t\\tleft: 50%;\\n\\t\\t\\tz-index: calc(var(--ck-z-default) + 2);\\n\\t\\t}\\n\\n\\t\\t&.ck-widget__type-around__button_before {\\n\\t\\t\\t/* Place it in the middle of the outline */\\n\\t\\t\\ttop: calc(-0.5 * var(--ck-widget-outline-thickness));\\n\\t\\t\\tleft: min(10%, 30px);\\n\\n\\t\\t\\ttransform: translateY(-50%);\\n\\t\\t}\\n\\n\\t\\t&.ck-widget__type-around__button_after {\\n\\t\\t\\t/* Place it in the middle of the outline */\\n\\t\\t\\tbottom: calc(-0.5 * var(--ck-widget-outline-thickness));\\n\\t\\t\\tright: min(10%, 30px);\\n\\n\\t\\t\\ttransform: translateY(50%);\\n\\t\\t}\\n\\t}\\n\\n\\t/*\\n\\t * Styles for the buttons when:\\n\\t * - the widget is selected,\\n\\t * - or the button is being hovered (regardless of the widget state).\\n\\t */\\n\\t&.ck-widget_selected > .ck-widget__type-around > .ck-widget__type-around__button,\\n\\t& > .ck-widget__type-around > .ck-widget__type-around__button:hover {\\n\\t\\t&::after {\\n\\t\\t\\tcontent: \\\"\\\";\\n\\t\\t\\tdisplay: block;\\n\\t\\t\\tposition: absolute;\\n\\t\\t\\ttop: 1px;\\n\\t\\t\\tleft: 1px;\\n\\t\\t\\tz-index: calc(var(--ck-z-default) + 1);\\n\\t\\t}\\n\\t}\\n\\n\\t/*\\n\\t * Styles for the horizontal \\\"fake caret\\\" which is displayed when the user navigates using the keyboard.\\n\\t */\\n\\t& > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\\n\\t\\tdisplay: none;\\n\\t\\tposition: absolute;\\n\\t\\tleft: 0;\\n\\t\\tright: 0;\\n\\t}\\n\\n\\t/*\\n\\t * When the widget is hovered the \\\"fake caret\\\" would normally be narrower than the\\n\\t * extra outline displayed around the widget. Let's extend the \\\"fake caret\\\" to match\\n\\t * the full width of the widget.\\n\\t */\\n\\t&:hover > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\\n\\t\\tleft: calc( -1 * var(--ck-widget-outline-thickness) );\\n\\t\\tright: calc( -1 * var(--ck-widget-outline-thickness) );\\n\\t}\\n\\n\\t/*\\n\\t * Styles for the horizontal \\\"fake caret\\\" when it should be displayed before the widget (backward keyboard navigation).\\n\\t */\\n\\t&.ck-widget_type-around_show-fake-caret_before > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\\n\\t\\ttop: calc( -1 * var(--ck-widget-outline-thickness) - 1px );\\n\\t\\tdisplay: block;\\n\\t}\\n\\n\\t/*\\n\\t * Styles for the horizontal \\\"fake caret\\\" when it should be displayed after the widget (forward keyboard navigation).\\n\\t */\\n\\t&.ck-widget_type-around_show-fake-caret_after > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\\n\\t\\tbottom: calc( -1 * var(--ck-widget-outline-thickness) - 1px );\\n\\t\\tdisplay: block;\\n\\t}\\n}\\n\\n/*\\n * Integration with the read-only mode of the editor.\\n */\\n.ck.ck-editor__editable.ck-read-only .ck-widget__type-around {\\n\\tdisplay: none;\\n}\\n\\n/*\\n * Integration with the restricted editing mode (feature) of the editor.\\n */\\n.ck.ck-editor__editable.ck-restricted-editing_mode_restricted .ck-widget__type-around {\\n\\tdisplay: none;\\n}\\n\\n/*\\n * Integration with the #isEnabled property of the WidgetTypeAround plugin.\\n */\\n.ck.ck-editor__editable.ck-widget__type-around_disabled .ck-widget__type-around {\\n\\tdisplay: none;\\n}\\n\",\"/*\\n * Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\\n */\\n\\n:root {\\n\\t--ck-widget-type-around-button-size: 20px;\\n\\t--ck-color-widget-type-around-button-active: var(--ck-color-focus-border);\\n\\t--ck-color-widget-type-around-button-hover: var(--ck-color-widget-hover-border);\\n\\t--ck-color-widget-type-around-button-blurred-editable: var(--ck-color-widget-blurred-border);\\n\\t--ck-color-widget-type-around-button-radar-start-alpha: 0;\\n\\t--ck-color-widget-type-around-button-radar-end-alpha: .3;\\n\\t--ck-color-widget-type-around-button-icon: var(--ck-color-base-background);\\n}\\n\\n@define-mixin ck-widget-type-around-button-visible {\\n\\topacity: 1;\\n\\tpointer-events: auto;\\n}\\n\\n@define-mixin ck-widget-type-around-button-hidden {\\n\\topacity: 0;\\n\\tpointer-events: none;\\n}\\n\\n.ck .ck-widget {\\n\\t/*\\n\\t * Styles of the type around buttons\\n\\t */\\n\\t& .ck-widget__type-around__button {\\n\\t\\twidth: var(--ck-widget-type-around-button-size);\\n\\t\\theight: var(--ck-widget-type-around-button-size);\\n\\t\\tbackground: var(--ck-color-widget-type-around-button);\\n\\t\\tborder-radius: 100px;\\n\\t\\ttransition: 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);\\n\\n\\t\\t@mixin ck-widget-type-around-button-hidden;\\n\\n\\t\\t& svg {\\n\\t\\t\\twidth: 10px;\\n\\t\\t\\theight: 8px;\\n\\t\\t\\ttransform: translate(-50%,-50%);\\n\\t\\t\\ttransition: transform .5s ease;\\n\\t\\t\\tmargin-top: 1px;\\n\\n\\t\\t\\t& * {\\n\\t\\t\\t\\tstroke-dasharray: 10;\\n\\t\\t\\t\\tstroke-dashoffset: 0;\\n\\n\\t\\t\\t\\tfill: none;\\n\\t\\t\\t\\tstroke: var(--ck-color-widget-type-around-button-icon);\\n\\t\\t\\t\\tstroke-width: 1.5px;\\n\\t\\t\\t\\tstroke-linecap: round;\\n\\t\\t\\t\\tstroke-linejoin: round;\\n\\t\\t\\t}\\n\\n\\t\\t\\t& line {\\n\\t\\t\\t\\tstroke-dasharray: 7;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t&:hover {\\n\\t\\t\\t/*\\n\\t\\t\\t * Display the \\\"sonar\\\" around the button when hovered.\\n\\t\\t\\t */\\n\\t\\t\\tanimation: ck-widget-type-around-button-sonar 1s ease infinite;\\n\\n\\t\\t\\t/*\\n\\t\\t\\t * Animate active button's icon.\\n\\t\\t\\t */\\n\\t\\t\\t& svg {\\n\\t\\t\\t\\t& polyline {\\n\\t\\t\\t\\t\\tanimation: ck-widget-type-around-arrow-dash 2s linear;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t& line {\\n\\t\\t\\t\\t\\tanimation: ck-widget-type-around-arrow-tip-dash 2s linear;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t/*\\n\\t * Show type around buttons when the widget gets selected or being hovered.\\n\\t */\\n\\t&.ck-widget_selected,\\n\\t&:hover {\\n\\t\\t& > .ck-widget__type-around > .ck-widget__type-around__button {\\n\\t\\t\\t@mixin ck-widget-type-around-button-visible;\\n\\t\\t}\\n\\t}\\n\\n\\t/*\\n\\t * Styles for the buttons when the widget is NOT selected (but the buttons are visible\\n\\t * and still can be hovered).\\n\\t */\\n\\t&:not(.ck-widget_selected) > .ck-widget__type-around > .ck-widget__type-around__button {\\n\\t\\tbackground: var(--ck-color-widget-type-around-button-hover);\\n\\t}\\n\\n\\t/*\\n\\t * Styles for the buttons when:\\n\\t * - the widget is selected,\\n\\t * - or the button is being hovered (regardless of the widget state).\\n\\t */\\n\\t&.ck-widget_selected > .ck-widget__type-around > .ck-widget__type-around__button,\\n\\t& > .ck-widget__type-around > .ck-widget__type-around__button:hover {\\n\\t\\tbackground: var(--ck-color-widget-type-around-button-active);\\n\\n\\t\\t&::after {\\n\\t\\t\\twidth: calc(var(--ck-widget-type-around-button-size) - 2px);\\n\\t\\t\\theight: calc(var(--ck-widget-type-around-button-size) - 2px);\\n\\t\\t\\tborder-radius: 100px;\\n\\t\\t\\tbackground: linear-gradient(135deg, hsla(0,0%,100%,0) 0%, hsla(0,0%,100%,.3) 100%);\\n\\t\\t}\\n\\t}\\n\\n\\t/*\\n\\t * Styles for the \\\"before\\\" button when the widget has a selection handle. Because some space\\n\\t * is consumed by the handle, the button must be moved slightly to the right to let it breathe.\\n\\t */\\n\\t&.ck-widget_with-selection-handle > .ck-widget__type-around > .ck-widget__type-around__button_before {\\n\\t\\tmargin-left: 20px;\\n\\t}\\n\\n\\t/*\\n\\t * Styles for the horizontal \\\"fake caret\\\" which is displayed when the user navigates using the keyboard.\\n\\t */\\n\\t& .ck-widget__type-around__fake-caret {\\n\\t\\tpointer-events: none;\\n\\t\\theight: 1px;\\n\\t\\tanimation: ck-widget-type-around-fake-caret-pulse linear 1s infinite normal forwards;\\n\\n\\t\\t/*\\n\\t\\t * The semi-transparent-outline+background combo improves the contrast\\n\\t\\t * when the background underneath the fake caret is dark.\\n\\t\\t */\\n\\t\\toutline: solid 1px hsla(0, 0%, 100%, .5);\\n\\t\\tbackground: var(--ck-color-base-text);\\n\\t}\\n\\n\\t/*\\n\\t * Styles of the widget when the \\\"fake caret\\\" is blinking (e.g. upon keyboard navigation).\\n\\t * Despite the widget being physically selected in the model, its outline should disappear.\\n\\t */\\n\\t&.ck-widget_selected {\\n\\t\\t&.ck-widget_type-around_show-fake-caret_before,\\n\\t\\t&.ck-widget_type-around_show-fake-caret_after {\\n\\t\\t\\toutline-color: transparent;\\n\\t\\t}\\n\\t}\\n\\n\\t&.ck-widget_type-around_show-fake-caret_before,\\n\\t&.ck-widget_type-around_show-fake-caret_after {\\n\\t\\t/*\\n\\t\\t * When the \\\"fake caret\\\" is visible we simulate that the widget is not selected\\n\\t\\t * (despite being physically selected), so the outline color should be for the\\n\\t\\t * unselected widget.\\n\\t\\t */\\n\\t\\t&.ck-widget_selected:hover {\\n\\t\\t\\toutline-color: var(--ck-color-widget-hover-border);\\n\\t\\t}\\n\\n\\t\\t/*\\n\\t\\t * Styles of the type around buttons when the \\\"fake caret\\\" is blinking (e.g. upon keyboard navigation).\\n\\t\\t * In this state, the type around buttons would collide with the fake carets so they should disappear.\\n\\t\\t */\\n\\t\\t& > .ck-widget__type-around > .ck-widget__type-around__button {\\n\\t\\t\\t@mixin ck-widget-type-around-button-hidden;\\n\\t\\t}\\n\\n\\t\\t/*\\n\\t\\t * Fake horizontal caret integration with the selection handle. When the caret is visible, simply\\n\\t\\t * hide the handle because it intersects with the caret (and does not make much sense anyway).\\n\\t\\t */\\n\\t\\t&.ck-widget_with-selection-handle {\\n\\t\\t\\t&.ck-widget_selected,\\n\\t\\t\\t&.ck-widget_selected:hover {\\n\\t\\t\\t\\t& > .ck-widget__selection-handle {\\n\\t\\t\\t\\t\\topacity: 0\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t/*\\n\\t\\t * Fake horizontal caret integration with the resize UI. When the caret is visible, simply\\n\\t\\t * hide the resize UI because it creates too much noise. It can be visible when the user\\n\\t\\t * hovers the widget, though.\\n\\t\\t */\\n\\t\\t&.ck-widget_selected.ck-widget_with-resizer > .ck-widget__resizer {\\n\\t\\t\\topacity: 0\\n\\t\\t}\\n\\t}\\n}\\n\\n/*\\n * Styles for the \\\"before\\\" button when the widget has a selection handle in an RTL environment.\\n * The selection handler is aligned to the right side of the widget so there is no need to create\\n * additional space for it next to the \\\"before\\\" button.\\n */\\n.ck[dir=\\\"rtl\\\"] .ck-widget.ck-widget_with-selection-handle .ck-widget__type-around > .ck-widget__type-around__button_before {\\n\\tmargin-left: 0;\\n\\tmargin-right: 20px;\\n}\\n\\n/*\\n * Hide type around buttons when the widget is selected as a child of a selected\\n * nested editable (e.g. mulit-cell table selection).\\n *\\n * See https://github.com/ckeditor/ckeditor5/issues/7263.\\n */\\n.ck-editor__nested-editable.ck-editor__editable_selected {\\n\\t& .ck-widget {\\n\\t\\t&.ck-widget_selected,\\n\\t\\t&:hover {\\n\\t\\t\\t& > .ck-widget__type-around > .ck-widget__type-around__button {\\n\\t\\t\\t\\t@mixin ck-widget-type-around-button-hidden;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\\n/*\\n * Styles for the buttons when the widget is selected but the user clicked outside of the editor (blurred the editor).\\n */\\n.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected > .ck-widget__type-around > .ck-widget__type-around__button:not(:hover) {\\n\\tbackground: var(--ck-color-widget-type-around-button-blurred-editable);\\n\\n\\t& svg * {\\n\\t\\tstroke: hsl(0,0%,60%);\\n\\t}\\n}\\n\\n@keyframes ck-widget-type-around-arrow-dash {\\n\\t0% {\\n\\t\\tstroke-dashoffset: 10;\\n\\t}\\n\\t20%, 100% {\\n\\t\\tstroke-dashoffset: 0;\\n\\t}\\n}\\n\\n@keyframes ck-widget-type-around-arrow-tip-dash {\\n\\t0%, 20% {\\n\\t\\tstroke-dashoffset: 7;\\n\\t}\\n\\t40%, 100% {\\n\\t\\tstroke-dashoffset: 0;\\n\\t}\\n}\\n\\n@keyframes ck-widget-type-around-button-sonar {\\n\\t0% {\\n\\t\\tbox-shadow: 0 0 0 0 hsla(var(--ck-color-focus-border-coordinates), var(--ck-color-widget-type-around-button-radar-start-alpha));\\n\\t}\\n\\t50% {\\n\\t\\tbox-shadow: 0 0 0 5px hsla(var(--ck-color-focus-border-coordinates), var(--ck-color-widget-type-around-button-radar-end-alpha));\\n\\t}\\n\\t100% {\\n\\t\\tbox-shadow: 0 0 0 5px hsla(var(--ck-color-focus-border-coordinates), var(--ck-color-widget-type-around-button-radar-start-alpha));\\n\\t}\\n}\\n\\n@keyframes ck-widget-type-around-fake-caret-pulse {\\n\\t0% {\\n\\t\\topacity: 1;\\n\\t}\\n\\t49% {\\n\\t\\topacity: 1;\\n\\t}\\n\\t50% {\\n\\t\\topacity: 0;\\n\\t}\\n\\t99% {\\n\\t\\topacity: 0;\\n\\t}\\n\\t100% {\\n\\t\\topacity: 1;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\", \"\",{\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".placeholder{background:#ff0;line-height:1em;margin:0 1px;outline-offset:-2px;padding:4px 2px}.placeholder::selection{display:none}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/plugins/placeholder/theme/placeholder.css\"],\"names\":[],\"mappings\":\"AAAA,aACE,eAAmB,CAGnB,eAAgB,CAChB,YAAa,CAFb,mBAAoB,CADpB,eAIF,CAEA,wBACE,YACF\",\"sourcesContent\":[\".placeholder {\\n  background: #ffff00;\\n  padding: 4px 2px;\\n  outline-offset: -2px;\\n  line-height: 1em;\\n  margin: 0 1px;\\n}\\n\\n.placeholder::selection {\\n  display: none;\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n  MIT License http://www.opensource.org/licenses/mit-license.php\n  Author Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\n// eslint-disable-next-line func-names\nmodule.exports = function (cssWithMappingToString) {\n  var list = []; // return the list of modules as css string\n\n  list.toString = function toString() {\n    return this.map(function (item) {\n      var content = cssWithMappingToString(item);\n\n      if (item[2]) {\n        return \"@media \".concat(item[2], \" {\").concat(content, \"}\");\n      }\n\n      return content;\n    }).join(\"\");\n  }; // import a list of modules into the list\n  // eslint-disable-next-line func-names\n\n\n  list.i = function (modules, mediaQuery, dedupe) {\n    if (typeof modules === \"string\") {\n      // eslint-disable-next-line no-param-reassign\n      modules = [[null, modules, \"\"]];\n    }\n\n    var alreadyImportedModules = {};\n\n    if (dedupe) {\n      for (var i = 0; i < this.length; i++) {\n        // eslint-disable-next-line prefer-destructuring\n        var id = this[i][0];\n\n        if (id != null) {\n          alreadyImportedModules[id] = true;\n        }\n      }\n    }\n\n    for (var _i = 0; _i < modules.length; _i++) {\n      var item = [].concat(modules[_i]);\n\n      if (dedupe && alreadyImportedModules[item[0]]) {\n        // eslint-disable-next-line no-continue\n        continue;\n      }\n\n      if (mediaQuery) {\n        if (!item[2]) {\n          item[2] = mediaQuery;\n        } else {\n          item[2] = \"\".concat(mediaQuery, \" and \").concat(item[2]);\n        }\n      }\n\n      list.push(item);\n    }\n  };\n\n  return list;\n};","\"use strict\";\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _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.\"); }\n\nfunction _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); }\n\nfunction _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; }\n\nfunction _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; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nmodule.exports = function cssWithMappingToString(item) {\n  var _item = _slicedToArray(item, 4),\n      content = _item[1],\n      cssMapping = _item[3];\n\n  if (!cssMapping) {\n    return content;\n  }\n\n  if (typeof btoa === \"function\") {\n    // eslint-disable-next-line no-undef\n    var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n    var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n    var sourceMapping = \"/*# \".concat(data, \" */\");\n    var sourceURLs = cssMapping.sources.map(function (source) {\n      return \"/*# sourceURL=\".concat(cssMapping.sourceRoot || \"\").concat(source, \" */\");\n    });\n    return [content].concat(sourceURLs).concat([sourceMapping]).join(\"\\n\");\n  }\n\n  return [content].join(\"\\n\");\n};","\"use strict\";\n\nvar isOldIE = function isOldIE() {\n  var memo;\n  return function memorize() {\n    if (typeof memo === 'undefined') {\n      // Test for IE <= 9 as proposed by Browserhacks\n      // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805\n      // Tests for existence of standard globals is to allow style-loader\n      // to operate correctly into non-standard environments\n      // @see https://github.com/webpack-contrib/style-loader/issues/177\n      memo = Boolean(window && document && document.all && !window.atob);\n    }\n\n    return memo;\n  };\n}();\n\nvar getTarget = function getTarget() {\n  var memo = {};\n  return function memorize(target) {\n    if (typeof memo[target] === 'undefined') {\n      var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself\n\n      if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n        try {\n          // This will throw an exception if access to iframe is blocked\n          // due to cross-origin restrictions\n          styleTarget = styleTarget.contentDocument.head;\n        } catch (e) {\n          // istanbul ignore next\n          styleTarget = null;\n        }\n      }\n\n      memo[target] = styleTarget;\n    }\n\n    return memo[target];\n  };\n}();\n\nvar stylesInDom = [];\n\nfunction getIndexByIdentifier(identifier) {\n  var result = -1;\n\n  for (var i = 0; i < stylesInDom.length; i++) {\n    if (stylesInDom[i].identifier === identifier) {\n      result = i;\n      break;\n    }\n  }\n\n  return result;\n}\n\nfunction modulesToDom(list, options) {\n  var idCountMap = {};\n  var identifiers = [];\n\n  for (var i = 0; i < list.length; i++) {\n    var item = list[i];\n    var id = options.base ? item[0] + options.base : item[0];\n    var count = idCountMap[id] || 0;\n    var identifier = \"\".concat(id, \" \").concat(count);\n    idCountMap[id] = count + 1;\n    var index = getIndexByIdentifier(identifier);\n    var obj = {\n      css: item[1],\n      media: item[2],\n      sourceMap: item[3]\n    };\n\n    if (index !== -1) {\n      stylesInDom[index].references++;\n      stylesInDom[index].updater(obj);\n    } else {\n      stylesInDom.push({\n        identifier: identifier,\n        updater: addStyle(obj, options),\n        references: 1\n      });\n    }\n\n    identifiers.push(identifier);\n  }\n\n  return identifiers;\n}\n\nfunction insertStyleElement(options) {\n  var style = document.createElement('style');\n  var attributes = options.attributes || {};\n\n  if (typeof attributes.nonce === 'undefined') {\n    var nonce = typeof __webpack_nonce__ !== 'undefined' ? __webpack_nonce__ : null;\n\n    if (nonce) {\n      attributes.nonce = nonce;\n    }\n  }\n\n  Object.keys(attributes).forEach(function (key) {\n    style.setAttribute(key, attributes[key]);\n  });\n\n  if (typeof options.insert === 'function') {\n    options.insert(style);\n  } else {\n    var target = getTarget(options.insert || 'head');\n\n    if (!target) {\n      throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n    }\n\n    target.appendChild(style);\n  }\n\n  return style;\n}\n\nfunction removeStyleElement(style) {\n  // istanbul ignore if\n  if (style.parentNode === null) {\n    return false;\n  }\n\n  style.parentNode.removeChild(style);\n}\n/* istanbul ignore next  */\n\n\nvar replaceText = function replaceText() {\n  var textStore = [];\n  return function replace(index, replacement) {\n    textStore[index] = replacement;\n    return textStore.filter(Boolean).join('\\n');\n  };\n}();\n\nfunction applyToSingletonTag(style, index, remove, obj) {\n  var css = remove ? '' : obj.media ? \"@media \".concat(obj.media, \" {\").concat(obj.css, \"}\") : obj.css; // For old IE\n\n  /* istanbul ignore if  */\n\n  if (style.styleSheet) {\n    style.styleSheet.cssText = replaceText(index, css);\n  } else {\n    var cssNode = document.createTextNode(css);\n    var childNodes = style.childNodes;\n\n    if (childNodes[index]) {\n      style.removeChild(childNodes[index]);\n    }\n\n    if (childNodes.length) {\n      style.insertBefore(cssNode, childNodes[index]);\n    } else {\n      style.appendChild(cssNode);\n    }\n  }\n}\n\nfunction applyToTag(style, options, obj) {\n  var css = obj.css;\n  var media = obj.media;\n  var sourceMap = obj.sourceMap;\n\n  if (media) {\n    style.setAttribute('media', media);\n  } else {\n    style.removeAttribute('media');\n  }\n\n  if (sourceMap && typeof btoa !== 'undefined') {\n    css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n  } // For old IE\n\n  /* istanbul ignore if  */\n\n\n  if (style.styleSheet) {\n    style.styleSheet.cssText = css;\n  } else {\n    while (style.firstChild) {\n      style.removeChild(style.firstChild);\n    }\n\n    style.appendChild(document.createTextNode(css));\n  }\n}\n\nvar singleton = null;\nvar singletonCounter = 0;\n\nfunction addStyle(obj, options) {\n  var style;\n  var update;\n  var remove;\n\n  if (options.singleton) {\n    var styleIndex = singletonCounter++;\n    style = singleton || (singleton = insertStyleElement(options));\n    update = applyToSingletonTag.bind(null, style, styleIndex, false);\n    remove = applyToSingletonTag.bind(null, style, styleIndex, true);\n  } else {\n    style = insertStyleElement(options);\n    update = applyToTag.bind(null, style, options);\n\n    remove = function remove() {\n      removeStyleElement(style);\n    };\n  }\n\n  update(obj);\n  return function updateStyle(newObj) {\n    if (newObj) {\n      if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) {\n        return;\n      }\n\n      update(obj = newObj);\n    } else {\n      remove();\n    }\n  };\n}\n\nmodule.exports = function (list, options) {\n  options = options || {}; // Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n  // tags it will allow on a page\n\n  if (!options.singleton && typeof options.singleton !== 'boolean') {\n    options.singleton = isOldIE();\n  }\n\n  list = list || [];\n  var lastIdentifiers = modulesToDom(list, options);\n  return function update(newList) {\n    newList = newList || [];\n\n    if (Object.prototype.toString.call(newList) !== '[object Array]') {\n      return;\n    }\n\n    for (var i = 0; i < lastIdentifiers.length; i++) {\n      var identifier = lastIdentifiers[i];\n      var index = getIndexByIdentifier(identifier);\n      stylesInDom[index].references--;\n    }\n\n    var newLastIdentifiers = modulesToDom(newList, options);\n\n    for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n      var _identifier = lastIdentifiers[_i];\n\n      var _index = getIndexByIdentifier(_identifier);\n\n      if (stylesInDom[_index].references === 0) {\n        stylesInDom[_index].updater();\n\n        stylesInDom.splice(_index, 1);\n      }\n    }\n\n    lastIdentifiers = newLastIdentifiers;\n  };\n};","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","__webpack_require__.nc = undefined;","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/* globals navigator:false */\r\n/**\r\n * @module utils/env\r\n */\r\n/**\r\n * Safely returns `userAgent` from browser's navigator API in a lower case.\r\n * If navigator API is not available it will return an empty string.\r\n */\r\nexport function getUserAgent() {\r\n    // In some environments navigator API might not be available.\r\n    try {\r\n        return navigator.userAgent.toLowerCase();\r\n    }\r\n    catch (e) {\r\n        return '';\r\n    }\r\n}\r\nconst userAgent = getUserAgent();\r\n/**\r\n * A namespace containing environment and browser information.\r\n */\r\nconst env = {\r\n    isMac: isMac(userAgent),\r\n    isWindows: isWindows(userAgent),\r\n    isGecko: isGecko(userAgent),\r\n    isSafari: isSafari(userAgent),\r\n    isiOS: isiOS(userAgent),\r\n    isAndroid: isAndroid(userAgent),\r\n    isBlink: isBlink(userAgent),\r\n    features: {\r\n        isRegExpUnicodePropertySupported: isRegExpUnicodePropertySupported()\r\n    }\r\n};\r\nexport default env;\r\n/**\r\n * Checks if User Agent represented by the string is running on Macintosh.\r\n *\r\n * @param userAgent **Lowercase** `navigator.userAgent` string.\r\n * @returns Whether User Agent is running on Macintosh or not.\r\n */\r\nexport function isMac(userAgent) {\r\n    return userAgent.indexOf('macintosh') > -1;\r\n}\r\n/**\r\n * Checks if User Agent represented by the string is running on Windows.\r\n *\r\n * @param userAgent **Lowercase** `navigator.userAgent` string.\r\n * @returns Whether User Agent is running on Windows or not.\r\n */\r\nexport function isWindows(userAgent) {\r\n    return userAgent.indexOf('windows') > -1;\r\n}\r\n/**\r\n * Checks if User Agent represented by the string is Firefox (Gecko).\r\n *\r\n * @param userAgent **Lowercase** `navigator.userAgent` string.\r\n * @returns Whether User Agent is Firefox or not.\r\n */\r\nexport function isGecko(userAgent) {\r\n    return !!userAgent.match(/gecko\\/\\d+/);\r\n}\r\n/**\r\n * Checks if User Agent represented by the string is Safari.\r\n *\r\n * @param userAgent **Lowercase** `navigator.userAgent` string.\r\n * @returns Whether User Agent is Safari or not.\r\n */\r\nexport function isSafari(userAgent) {\r\n    return userAgent.indexOf(' applewebkit/') > -1 && userAgent.indexOf('chrome') === -1;\r\n}\r\n/**\r\n * Checks if User Agent represented by the string is running in iOS.\r\n *\r\n * @param userAgent **Lowercase** `navigator.userAgent` string.\r\n * @returns Whether User Agent is running in iOS or not.\r\n */\r\nexport function isiOS(userAgent) {\r\n    // \"Request mobile site\" || \"Request desktop site\".\r\n    return !!userAgent.match(/iphone|ipad/i) || (isMac(userAgent) && navigator.maxTouchPoints > 0);\r\n}\r\n/**\r\n * Checks if User Agent represented by the string is Android mobile device.\r\n *\r\n * @param userAgent **Lowercase** `navigator.userAgent` string.\r\n * @returns Whether User Agent is Safari or not.\r\n */\r\nexport function isAndroid(userAgent) {\r\n    return userAgent.indexOf('android') > -1;\r\n}\r\n/**\r\n * Checks if User Agent represented by the string is Blink engine.\r\n *\r\n * @param userAgent **Lowercase** `navigator.userAgent` string.\r\n * @returns Whether User Agent is Blink engine or not.\r\n */\r\nexport function isBlink(userAgent) {\r\n    // The Edge browser before switching to the Blink engine used to report itself as Chrome (and \"Edge/\")\r\n    // but after switching to the Blink it replaced \"Edge/\" with \"Edg/\".\r\n    return userAgent.indexOf('chrome/') > -1 && userAgent.indexOf('edge/') < 0;\r\n}\r\n/**\r\n * Checks if the current environment supports ES2018 Unicode properties like `\\p{P}` or `\\p{L}`.\r\n * More information about unicode properties might be found\r\n * [in Unicode Standard Annex #44](https://www.unicode.org/reports/tr44/#GC_Values_Table).\r\n */\r\nexport function isRegExpUnicodePropertySupported() {\r\n    let isSupported = false;\r\n    // Feature detection for Unicode properties. Added in ES2018. Currently Firefox does not support it.\r\n    // See https://github.com/ckeditor/ckeditor5-mention/issues/44#issuecomment-487002174.\r\n    try {\r\n        // Usage of regular expression literal cause error during build (ckeditor/ckeditor5-dev#534).\r\n        isSupported = 'ć'.search(new RegExp('[\\\\p{L}]', 'u')) === 0;\r\n    }\r\n    catch (error) {\r\n        // Firefox throws a SyntaxError when the group is unsupported.\r\n    }\r\n    return isSupported;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/fastdiff\r\n */\r\n/**\r\n * Finds positions of the first and last change in the given string/array and generates a set of changes:\r\n *\r\n * ```ts\r\n * fastDiff( '12a', '12xyza' );\r\n * // [ { index: 2, type: 'insert', values: [ 'x', 'y', 'z' ] } ]\r\n *\r\n * fastDiff( '12a', '12aa' );\r\n * // [ { index: 3, type: 'insert', values: [ 'a' ] } ]\r\n *\r\n * fastDiff( '12xyza', '12a' );\r\n * // [ { index: 2, type: 'delete', howMany: 3 } ]\r\n *\r\n * fastDiff( [ '1', '2', 'a', 'a' ], [ '1', '2', 'a' ] );\r\n * // [ { index: 3, type: 'delete', howMany: 1 } ]\r\n *\r\n * fastDiff( [ '1', '2', 'a', 'b', 'c', '3' ], [ '2', 'a', 'b' ] );\r\n * // [ { index: 0, type: 'insert', values: [ '2', 'a', 'b' ] }, { index: 3, type: 'delete', howMany: 6 } ]\r\n * ```\r\n *\r\n * Passed arrays can contain any type of data, however to compare them correctly custom comparator function\r\n * should be passed as a third parameter:\r\n *\r\n * ```ts\r\n * fastDiff( [ { value: 1 }, { value: 2 } ], [ { value: 1 }, { value: 3 } ], ( a, b ) => {\r\n * \treturn a.value === b.value;\r\n * } );\r\n * // [ { index: 1, type: 'insert', values: [ { value: 3 } ] }, { index: 2, type: 'delete', howMany: 1 } ]\r\n * ```\r\n *\r\n * The resulted set of changes can be applied to the input in order to transform it into the output, for example:\r\n *\r\n * ```ts\r\n * let input = '12abc3';\r\n * const output = '2ab';\r\n * const changes = fastDiff( input, output );\r\n *\r\n * changes.forEach( change => {\r\n * \tif ( change.type == 'insert' ) {\r\n * \t\tinput = input.substring( 0, change.index ) + change.values.join( '' ) + input.substring( change.index );\r\n * \t} else if ( change.type == 'delete' ) {\r\n * \t\tinput = input.substring( 0, change.index ) + input.substring( change.index + change.howMany );\r\n * \t}\r\n * } );\r\n *\r\n * // input equals output now\r\n * ```\r\n *\r\n * or in case of arrays:\r\n *\r\n * ```ts\r\n * let input = [ '1', '2', 'a', 'b', 'c', '3' ];\r\n * const output = [ '2', 'a', 'b' ];\r\n * const changes = fastDiff( input, output );\r\n *\r\n * changes.forEach( change => {\r\n * \tif ( change.type == 'insert' ) {\r\n * \t\tinput = input.slice( 0, change.index ).concat( change.values, input.slice( change.index ) );\r\n * \t} else if ( change.type == 'delete' ) {\r\n * \t\tinput = input.slice( 0, change.index ).concat( input.slice( change.index + change.howMany ) );\r\n * \t}\r\n * } );\r\n *\r\n * // input equals output now\r\n * ```\r\n *\r\n * By passing `true` as the fourth parameter (`atomicChanges`) the output of this function will become compatible with\r\n * the {@link module:utils/diff~diff `diff()`} function:\r\n *\r\n * ```ts\r\n * fastDiff( '12a', '12xyza', undefined, true );\r\n * // [ 'equal', 'equal', 'insert', 'insert', 'insert', 'equal' ]\r\n * ```\r\n *\r\n * The default output format of this function is compatible with the output format of\r\n * {@link module:utils/difftochanges~diffToChanges `diffToChanges()`}. The `diffToChanges()` input format is, in turn,\r\n * compatible with the output of {@link module:utils/diff~diff `diff()`}:\r\n *\r\n * ```ts\r\n * const a = '1234';\r\n * const b = '12xyz34';\r\n *\r\n * // Both calls will return the same results (grouped changes format).\r\n * fastDiff( a, b );\r\n * diffToChanges( diff( a, b ) );\r\n *\r\n * // Again, both calls will return the same results (atomic changes format).\r\n * fastDiff( a, b, undefined, true );\r\n * diff( a, b );\r\n * ```\r\n *\r\n * @typeParam T The type of array elements.\r\n * @typeParam AtomicChanges The type of `atomicChanges` parameter (selects the result type).\r\n * @param a Input array or string.\r\n * @param b Input array or string.\r\n * @param cmp Optional function used to compare array values, by default `===` (strict equal operator) is used.\r\n * @param atomicChanges Whether an array of `inset|delete|equal` operations should\r\n * be returned instead of changes set. This makes this function compatible with {@link module:utils/diff~diff `diff()`}.\r\n * Defaults to `false`.\r\n * @returns Array of changes. The elements are either {@link module:utils/diff~DiffResult} or {@link module:utils/difftochanges~Change},\r\n * depending on `atomicChanges` parameter.\r\n */\r\nexport default function fastDiff(a, b, cmp, atomicChanges) {\r\n    // Set the comparator function.\r\n    cmp = cmp || function (a, b) {\r\n        return a === b;\r\n    };\r\n    // Convert the string (or any array-like object - eg. NodeList) to an array by using the slice() method because,\r\n    // unlike Array.from(), it returns array of UTF-16 code units instead of the code points of a string.\r\n    // One code point might be a surrogate pair of two code units. All text offsets are expected to be in code units.\r\n    // See ckeditor/ckeditor5#3147.\r\n    //\r\n    // We need to make sure here that fastDiff() works identical to diff().\r\n    const arrayA = Array.isArray(a) ? a : Array.prototype.slice.call(a);\r\n    const arrayB = Array.isArray(b) ? b : Array.prototype.slice.call(b);\r\n    // Find first and last change.\r\n    const changeIndexes = findChangeBoundaryIndexes(arrayA, arrayB, cmp);\r\n    // Transform into changes array.\r\n    const result = atomicChanges ?\r\n        changeIndexesToAtomicChanges(changeIndexes, arrayB.length) :\r\n        changeIndexesToChanges(arrayB, changeIndexes);\r\n    return result;\r\n}\r\n/**\r\n * Finds position of the first and last change in the given arrays. For example:\r\n *\r\n * ```ts\r\n * const indexes = findChangeBoundaryIndexes( [ '1', '2', '3', '4' ], [ '1', '3', '4', '2', '4' ] );\r\n * console.log( indexes ); // { firstIndex: 1, lastIndexOld: 3, lastIndexNew: 4 }\r\n * ```\r\n *\r\n * The above indexes means that in the first array the modified part is `1[23]4` and in the second array it is `1[342]4`.\r\n * Based on such indexes, array with `insert`/`delete` operations which allows transforming first value into the second one\r\n * can be generated.\r\n */\r\nfunction findChangeBoundaryIndexes(arr1, arr2, cmp) {\r\n    // Find the first difference between passed values.\r\n    const firstIndex = findFirstDifferenceIndex(arr1, arr2, cmp);\r\n    // If arrays are equal return -1 indexes object.\r\n    if (firstIndex === -1) {\r\n        return { firstIndex: -1, lastIndexOld: -1, lastIndexNew: -1 };\r\n    }\r\n    // Remove the common part of each value and reverse them to make it simpler to find the last difference between them.\r\n    const oldArrayReversed = cutAndReverse(arr1, firstIndex);\r\n    const newArrayReversed = cutAndReverse(arr2, firstIndex);\r\n    // Find the first difference between reversed values.\r\n    // It should be treated as \"how many elements from the end the last difference occurred\".\r\n    //\r\n    // For example:\r\n    //\r\n    // \t\t\t\tinitial\t->\tafter cut\t-> reversed:\r\n    // oldValue:\t'321ba'\t->\t'21ba'\t\t-> 'ab12'\r\n    // newValue:\t'31xba'\t->\t'1xba'\t\t-> 'abx1'\r\n    // lastIndex:\t\t\t\t\t\t\t-> 2\r\n    //\r\n    // So the last change occurred two characters from the end of the arrays.\r\n    const lastIndex = findFirstDifferenceIndex(oldArrayReversed, newArrayReversed, cmp);\r\n    // Use `lastIndex` to calculate proper offset, starting from the beginning (`lastIndex` kind of starts from the end).\r\n    const lastIndexOld = arr1.length - lastIndex;\r\n    const lastIndexNew = arr2.length - lastIndex;\r\n    return { firstIndex, lastIndexOld, lastIndexNew };\r\n}\r\n/**\r\n * Returns a first index on which given arrays differ. If both arrays are the same, -1 is returned.\r\n */\r\nfunction findFirstDifferenceIndex(arr1, arr2, cmp) {\r\n    for (let i = 0; i < Math.max(arr1.length, arr2.length); i++) {\r\n        if (arr1[i] === undefined || arr2[i] === undefined || !cmp(arr1[i], arr2[i])) {\r\n            return i;\r\n        }\r\n    }\r\n    return -1; // Return -1 if arrays are equal.\r\n}\r\n/**\r\n * Returns a copy of the given array with `howMany` elements removed starting from the beginning and in reversed order.\r\n *\r\n * @param arr Array to be processed.\r\n * @param howMany How many elements from array beginning to remove.\r\n * @returns Shortened and reversed array.\r\n */\r\nfunction cutAndReverse(arr, howMany) {\r\n    return arr.slice(howMany).reverse();\r\n}\r\n/**\r\n * Generates changes array based on change indexes from `findChangeBoundaryIndexes` function. This function will\r\n * generate array with 0 (no changes), 1 (deletion or insertion) or 2 records (insertion and deletion).\r\n *\r\n * @param newArray New array for which change indexes were calculated.\r\n * @param changeIndexes Change indexes object from `findChangeBoundaryIndexes` function.\r\n * @returns Array of changes compatible with {@link module:utils/difftochanges~diffToChanges} format.\r\n */\r\nfunction changeIndexesToChanges(newArray, changeIndexes) {\r\n    const result = [];\r\n    const { firstIndex, lastIndexOld, lastIndexNew } = changeIndexes;\r\n    // Order operations as 'insert', 'delete' array to keep compatibility with {@link module:utils/difftochanges~diffToChanges}\r\n    // in most cases. However, 'diffToChanges' does not stick to any order so in some cases\r\n    // (for example replacing '12345' with 'abcd') it will generate 'delete', 'insert' order.\r\n    if (lastIndexNew - firstIndex > 0) {\r\n        result.push({\r\n            index: firstIndex,\r\n            type: 'insert',\r\n            values: newArray.slice(firstIndex, lastIndexNew)\r\n        });\r\n    }\r\n    if (lastIndexOld - firstIndex > 0) {\r\n        result.push({\r\n            index: firstIndex + (lastIndexNew - firstIndex),\r\n            type: 'delete',\r\n            howMany: lastIndexOld - firstIndex\r\n        });\r\n    }\r\n    return result;\r\n}\r\n/**\r\n * Generates array with set `equal|insert|delete` operations based on change indexes from `findChangeBoundaryIndexes` function.\r\n *\r\n * @param changeIndexes Change indexes object from `findChangeBoundaryIndexes` function.\r\n * @param newLength Length of the new array on which `findChangeBoundaryIndexes` calculated change indexes.\r\n * @returns Array of changes compatible with {@link module:utils/diff~diff} format.\r\n */\r\nfunction changeIndexesToAtomicChanges(changeIndexes, newLength) {\r\n    const { firstIndex, lastIndexOld, lastIndexNew } = changeIndexes;\r\n    // No changes.\r\n    if (firstIndex === -1) {\r\n        return Array(newLength).fill('equal');\r\n    }\r\n    let result = [];\r\n    if (firstIndex > 0) {\r\n        result = result.concat(Array(firstIndex).fill('equal'));\r\n    }\r\n    if (lastIndexNew - firstIndex > 0) {\r\n        result = result.concat(Array(lastIndexNew - firstIndex).fill('insert'));\r\n    }\r\n    if (lastIndexOld - firstIndex > 0) {\r\n        result = result.concat(Array(lastIndexOld - firstIndex).fill('delete'));\r\n    }\r\n    if (lastIndexNew < newLength) {\r\n        result = result.concat(Array(newLength - lastIndexNew).fill('equal'));\r\n    }\r\n    return result;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/diff\r\n */\r\nimport fastDiff from './fastdiff';\r\n// The following code is based on the \"O(NP) Sequence Comparison Algorithm\"\r\n// by Sun Wu, Udi Manber, Gene Myers, Webb Miller.\r\n/**\r\n * Calculates the difference between two arrays or strings producing an array containing a list of changes\r\n * necessary to transform input into output.\r\n *\r\n * ```ts\r\n * diff( 'aba', 'acca' ); // [ 'equal', 'insert', 'insert', 'delete', 'equal' ]\r\n * ```\r\n *\r\n * This function is based on the \"O(NP) Sequence Comparison Algorithm\" by Sun Wu, Udi Manber, Gene Myers, Webb Miller.\r\n * Unfortunately, while it gives the most precise results, its to complex for longer strings/arrow (above 200 items).\r\n * Therefore, `diff()` automatically switches to {@link module:utils/fastdiff~fastDiff `fastDiff()`} when detecting\r\n * such a scenario. The return formats of both functions are identical.\r\n *\r\n * @param a Input array or string.\r\n * @param b Output array or string.\r\n * @param cmp Optional function used to compare array values, by default === is used.\r\n * @returns Array of changes.\r\n */\r\nexport default function diff(a, b, cmp) {\r\n    // Set the comparator function.\r\n    cmp = cmp || function (a, b) {\r\n        return a === b;\r\n    };\r\n    const aLength = a.length;\r\n    const bLength = b.length;\r\n    // Perform `fastDiff` for longer strings/arrays (see #269).\r\n    if (aLength > 200 || bLength > 200 || aLength + bLength > 300) {\r\n        return diff.fastDiff(a, b, cmp, true);\r\n    }\r\n    // Temporary action type statics.\r\n    let _insert, _delete;\r\n    // Swapped the arrays to use the shorter one as the first one.\r\n    if (bLength < aLength) {\r\n        const tmp = a;\r\n        a = b;\r\n        b = tmp;\r\n        // We swap the action types as well.\r\n        _insert = 'delete';\r\n        _delete = 'insert';\r\n    }\r\n    else {\r\n        _insert = 'insert';\r\n        _delete = 'delete';\r\n    }\r\n    const m = a.length;\r\n    const n = b.length;\r\n    const delta = n - m;\r\n    // Edit scripts, for each diagonal.\r\n    const es = {};\r\n    // Furthest points, the furthest y we can get on each diagonal.\r\n    const fp = {};\r\n    function snake(k) {\r\n        // We use -1 as an alternative below to handle initial values ( instead of filling the fp with -1 first ).\r\n        // Furthest points (y) on the diagonal below k.\r\n        const y1 = (fp[k - 1] !== undefined ? fp[k - 1] : -1) + 1;\r\n        // Furthest points (y) on the diagonal above k.\r\n        const y2 = fp[k + 1] !== undefined ? fp[k + 1] : -1;\r\n        // The way we should go to get further.\r\n        const dir = y1 > y2 ? -1 : 1;\r\n        // Clone previous changes array (if any).\r\n        if (es[k + dir]) {\r\n            es[k] = es[k + dir].slice(0);\r\n        }\r\n        // Create changes array.\r\n        if (!es[k]) {\r\n            es[k] = [];\r\n        }\r\n        // Push the action.\r\n        es[k].push(y1 > y2 ? _insert : _delete);\r\n        // Set the beginning coordinates.\r\n        let y = Math.max(y1, y2);\r\n        let x = y - k;\r\n        // Traverse the diagonal as long as the values match.\r\n        while (x < m && y < n && cmp(a[x], b[y])) {\r\n            x++;\r\n            y++;\r\n            // Push no change action.\r\n            es[k].push('equal');\r\n        }\r\n        return y;\r\n    }\r\n    let p = 0;\r\n    let k;\r\n    // Traverse the graph until we reach the end of the longer string.\r\n    do {\r\n        // Updates furthest points and edit scripts for diagonals below delta.\r\n        for (k = -p; k < delta; k++) {\r\n            fp[k] = snake(k);\r\n        }\r\n        // Updates furthest points and edit scripts for diagonals above delta.\r\n        for (k = delta + p; k > delta; k--) {\r\n            fp[k] = snake(k);\r\n        }\r\n        // Updates furthest point and edit script for the delta diagonal.\r\n        // note that the delta diagonal is the one which goes through the sink (m, n).\r\n        fp[delta] = snake(delta);\r\n        p++;\r\n    } while (fp[delta] !== n);\r\n    // Return the final list of edit changes.\r\n    // We remove the first item that represents the action for the injected nulls.\r\n    return es[delta].slice(1);\r\n}\r\n// Store the API in static property to easily overwrite it in tests.\r\n// Too bad dependency injection does not work in Webpack + ES 6 (const) + Babel.\r\ndiff.fastDiff = fastDiff;\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/spy\r\n */\r\n/**\r\n * Creates a spy function (ala Sinon.js) that can be used to inspect call to it.\r\n *\r\n * The following are the present features:\r\n *\r\n * * spy.called: property set to `true` if the function has been called at least once.\r\n *\r\n * @returns The spy function.\r\n */\r\nfunction spy() {\r\n    return function spy() {\r\n        spy.called = true;\r\n    };\r\n}\r\nexport default spy;\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/eventinfo\r\n */\r\nimport spy from './spy';\r\n/**\r\n * The event object passed to event callbacks. It is used to provide information about the event as well as a tool to\r\n * manipulate it.\r\n */\r\nexport default class EventInfo {\r\n    /**\r\n     * @param source The emitter.\r\n     * @param name The event name.\r\n     */\r\n    constructor(source, name) {\r\n        this.source = source;\r\n        this.name = name;\r\n        this.path = [];\r\n        // The following methods are defined in the constructor because they must be re-created per instance.\r\n        this.stop = spy();\r\n        this.off = spy();\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/uid\r\n */\r\n/**\r\n * A hash table of hex numbers to avoid using toString() in uid() which is costly.\r\n * [ '00', '01', '02', ..., 'fe', 'ff' ]\r\n */\r\nconst HEX_NUMBERS = new Array(256).fill('')\r\n    .map((_, index) => ('0' + (index).toString(16)).slice(-2));\r\n/**\r\n * Returns a unique id. The id starts with an \"e\" character and a randomly generated string of\r\n * 32 alphanumeric characters.\r\n *\r\n * **Note**: The characters the unique id is built from correspond to the hex number notation\r\n * (from \"0\" to \"9\", from \"a\" to \"f\"). In other words, each id corresponds to an \"e\" followed\r\n * by 16 8-bit numbers next to each other.\r\n *\r\n * @returns An unique id string.\r\n */\r\nexport default function uid() {\r\n    // Let's create some positive random 32bit integers first.\r\n    //\r\n    // 1. Math.random() is a float between 0 and 1.\r\n    // 2. 0x100000000 is 2^32 = 4294967296.\r\n    // 3. >>> 0 enforces integer (in JS all numbers are floating point).\r\n    //\r\n    // For instance:\r\n    //\t\tMath.random() * 0x100000000 = 3366450031.853859\r\n    // but\r\n    //\t\tMath.random() * 0x100000000 >>> 0 = 3366450031.\r\n    const r1 = Math.random() * 0x100000000 >>> 0;\r\n    const r2 = Math.random() * 0x100000000 >>> 0;\r\n    const r3 = Math.random() * 0x100000000 >>> 0;\r\n    const r4 = Math.random() * 0x100000000 >>> 0;\r\n    // Make sure that id does not start with number.\r\n    return 'e' +\r\n        HEX_NUMBERS[r1 >> 0 & 0xFF] +\r\n        HEX_NUMBERS[r1 >> 8 & 0xFF] +\r\n        HEX_NUMBERS[r1 >> 16 & 0xFF] +\r\n        HEX_NUMBERS[r1 >> 24 & 0xFF] +\r\n        HEX_NUMBERS[r2 >> 0 & 0xFF] +\r\n        HEX_NUMBERS[r2 >> 8 & 0xFF] +\r\n        HEX_NUMBERS[r2 >> 16 & 0xFF] +\r\n        HEX_NUMBERS[r2 >> 24 & 0xFF] +\r\n        HEX_NUMBERS[r3 >> 0 & 0xFF] +\r\n        HEX_NUMBERS[r3 >> 8 & 0xFF] +\r\n        HEX_NUMBERS[r3 >> 16 & 0xFF] +\r\n        HEX_NUMBERS[r3 >> 24 & 0xFF] +\r\n        HEX_NUMBERS[r4 >> 0 & 0xFF] +\r\n        HEX_NUMBERS[r4 >> 8 & 0xFF] +\r\n        HEX_NUMBERS[r4 >> 16 & 0xFF] +\r\n        HEX_NUMBERS[r4 >> 24 & 0xFF];\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * Provides group of constants to use instead of hardcoding numeric priority values.\r\n */\r\nconst priorities = {\r\n    get(priority = 'normal') {\r\n        if (typeof priority != 'number') {\r\n            return this[priority] || this.normal;\r\n        }\r\n        else {\r\n            return priority;\r\n        }\r\n    },\r\n    highest: 100000,\r\n    high: 1000,\r\n    normal: 0,\r\n    low: -1000,\r\n    lowest: -100000\r\n};\r\nexport default priorities;\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport priorities from './priorities';\r\n/**\r\n * Inserts any object with priority at correct index by priority so registered objects are always sorted from highest to lowest priority.\r\n *\r\n * @param objects Array of objects with priority to insert object to.\r\n * @param objectToInsert Object with `priority` property.\r\n */\r\nexport default function insertToPriorityArray(objects, objectToInsert) {\r\n    const priority = priorities.get(objectToInsert.priority);\r\n    for (let i = 0; i < objects.length; i++) {\r\n        if (priorities.get(objects[i].priority) < priority) {\r\n            objects.splice(i, 0, objectToInsert);\r\n            return;\r\n        }\r\n    }\r\n    objects.push(objectToInsert);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/ckeditorerror\r\n */\r\n/* globals console */\r\n/**\r\n * URL to the documentation with error codes.\r\n */\r\nexport const DOCUMENTATION_URL = 'https://ckeditor.com/docs/ckeditor5/latest/support/error-codes.html';\r\n/**\r\n * The CKEditor error class.\r\n *\r\n * You should throw `CKEditorError` when:\r\n *\r\n * * An unexpected situation occurred and the editor (most probably) will not work properly. Such exception will be handled\r\n * by the {@link module:watchdog/watchdog~Watchdog watchdog} (if it is integrated),\r\n * * If the editor is incorrectly integrated or the editor API is used in the wrong way. This way you will give\r\n * feedback to the developer as soon as possible. Keep in mind that for common integration issues which should not\r\n * stop editor initialization (like missing upload adapter, wrong name of a toolbar component) we use\r\n * {@link module:utils/ckeditorerror~logWarning `logWarning()`} and\r\n * {@link module:utils/ckeditorerror~logError `logError()`}\r\n * to improve developers experience and let them see the a working editor as soon as possible.\r\n *\r\n * ```ts\r\n * /**\r\n *  * Error thrown when a plugin cannot be loaded due to JavaScript errors, lack of plugins with a given name, etc.\r\n *  *\r\n *  * @error plugin-load\r\n *  * @param pluginName The name of the plugin that could not be loaded.\r\n *  * @param moduleName The name of the module which tried to load this plugin.\r\n *  *\\/\r\n * throw new CKEditorError( 'plugin-load', {\r\n * \tpluginName: 'foo',\r\n * \tmoduleName: 'bar'\r\n * } );\r\n * ```\r\n */\r\nexport default class CKEditorError extends Error {\r\n    /**\r\n     * Creates an instance of the CKEditorError class.\r\n     *\r\n     * @param errorName The error id in an `error-name` format. A link to this error documentation page will be added\r\n     * to the thrown error's `message`.\r\n     * @param context A context of the error by which the {@link module:watchdog/watchdog~Watchdog watchdog}\r\n     * is able to determine which editor crashed. It should be an editor instance or a property connected to it. It can be also\r\n     * a `null` value if the editor should not be restarted in case of the error (e.g. during the editor initialization).\r\n     * The error context should be checked using the `areConnectedThroughProperties( editor, context )` utility\r\n     * to check if the object works as the context.\r\n     * @param data Additional data describing the error. A stringified version of this object\r\n     * will be appended to the error message, so the data are quickly visible in the console. The original\r\n     * data object will also be later available under the {@link #data} property.\r\n     */\r\n    constructor(errorName, context, data) {\r\n        super(getErrorMessage(errorName, data));\r\n        this.name = 'CKEditorError';\r\n        this.context = context;\r\n        this.data = data;\r\n    }\r\n    /**\r\n     * Checks if the error is of the `CKEditorError` type.\r\n     */\r\n    is(type) {\r\n        return type === 'CKEditorError';\r\n    }\r\n    /**\r\n     * A utility that ensures that the thrown error is a {@link module:utils/ckeditorerror~CKEditorError} one.\r\n     * It is useful when combined with the {@link module:watchdog/watchdog~Watchdog} feature, which can restart the editor in case\r\n     * of a {@link module:utils/ckeditorerror~CKEditorError} error.\r\n     *\r\n     * @param err The error to rethrow.\r\n     * @param context An object connected through properties with the editor instance. This context will be used\r\n     * by the watchdog to verify which editor should be restarted.\r\n     */\r\n    static rethrowUnexpectedError(err, context) {\r\n        if (err.is && err.is('CKEditorError')) {\r\n            throw err;\r\n        }\r\n        /**\r\n         * An unexpected error occurred inside the CKEditor 5 codebase. This error will look like the original one\r\n         * to make the debugging easier.\r\n         *\r\n         * This error is only useful when the editor is initialized using the {@link module:watchdog/watchdog~Watchdog} feature.\r\n         * In case of such error (or any {@link module:utils/ckeditorerror~CKEditorError} error) the watchdog should restart the editor.\r\n         *\r\n         * @error unexpected-error\r\n         */\r\n        const error = new CKEditorError(err.message, context);\r\n        // Restore the original stack trace to make the error look like the original one.\r\n        // See https://github.com/ckeditor/ckeditor5/issues/5595 for more details.\r\n        error.stack = err.stack;\r\n        throw error;\r\n    }\r\n}\r\n/**\r\n * Logs a warning to the console with a properly formatted message and adds a link to the documentation.\r\n * Use whenever you want to log a warning to the console.\r\n *\r\n * ```ts\r\n * /**\r\n *  * There was a problem processing the configuration of the toolbar. The item with the given\r\n *  * name does not exist, so it was omitted when rendering the toolbar.\r\n *  *\r\n *  * @error toolbarview-item-unavailable\r\n *  * @param {String} name The name of the component.\r\n *  *\\/\r\n * logWarning( 'toolbarview-item-unavailable', { name } );\r\n * ```\r\n *\r\n * See also {@link module:utils/ckeditorerror~CKEditorError} for an explanation when to throw an error and when to log\r\n * a warning or an error to the console.\r\n *\r\n * @param errorName The error name to be logged.\r\n * @param data Additional data to be logged.\r\n */\r\nexport function logWarning(errorName, data) {\r\n    console.warn(...formatConsoleArguments(errorName, data));\r\n}\r\n/**\r\n * Logs an error to the console with a properly formatted message and adds a link to the documentation.\r\n * Use whenever you want to log an error to the console.\r\n *\r\n * ```ts\r\n * /**\r\n *  * There was a problem processing the configuration of the toolbar. The item with the given\r\n *  * name does not exist, so it was omitted when rendering the toolbar.\r\n *  *\r\n *  * @error toolbarview-item-unavailable\r\n *  * @param {String} name The name of the component.\r\n *  *\\/\r\n *  logError( 'toolbarview-item-unavailable', { name } );\r\n * ```\r\n *\r\n * **Note**: In most cases logging a warning using {@link module:utils/ckeditorerror~logWarning} is enough.\r\n *\r\n * See also {@link module:utils/ckeditorerror~CKEditorError} for an explanation when to use each method.\r\n *\r\n * @param errorName The error name to be logged.\r\n * @param data Additional data to be logged.\r\n */\r\nexport function logError(errorName, data) {\r\n    console.error(...formatConsoleArguments(errorName, data));\r\n}\r\n/**\r\n * Returns formatted link to documentation message.\r\n */\r\nfunction getLinkToDocumentationMessage(errorName) {\r\n    return `\\nRead more: ${DOCUMENTATION_URL}#error-${errorName}`;\r\n}\r\n/**\r\n * Returns formatted error message.\r\n */\r\nfunction getErrorMessage(errorName, data) {\r\n    const processedObjects = new WeakSet();\r\n    const circularReferencesReplacer = (key, value) => {\r\n        if (typeof value === 'object' && value !== null) {\r\n            if (processedObjects.has(value)) {\r\n                return `[object ${value.constructor.name}]`;\r\n            }\r\n            processedObjects.add(value);\r\n        }\r\n        return value;\r\n    };\r\n    const stringifiedData = data ? ` ${JSON.stringify(data, circularReferencesReplacer)}` : '';\r\n    const documentationLink = getLinkToDocumentationMessage(errorName);\r\n    return errorName + stringifiedData + documentationLink;\r\n}\r\n/**\r\n * Returns formatted console error arguments.\r\n */\r\nfunction formatConsoleArguments(errorName, data) {\r\n    const documentationMessage = getLinkToDocumentationMessage(errorName);\r\n    return data ? [errorName, data, documentationMessage] : [errorName, documentationMessage];\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/version\r\n */\r\n/* globals window, global */\r\nimport CKEditorError from './ckeditorerror';\r\nconst version = '38.1.1';\r\nexport default version;\r\n// The second argument is not a month. It is `monthIndex` and starts from `0`.\r\nexport const releaseDate = new Date(2023, 6, 11);\r\n/* istanbul ignore next -- @preserve */\r\nconst windowOrGlobal = typeof window === 'object' ? window : global;\r\n/* istanbul ignore next -- @preserve */\r\nif (windowOrGlobal.CKEDITOR_VERSION) {\r\n    /**\r\n     * This error is thrown when due to a mistake in how CKEditor 5 was installed or initialized, some\r\n     * of its modules were duplicated (evaluated and executed twice). Module duplication leads to inevitable runtime\r\n     * errors.\r\n     *\r\n     * There are many situations in which some modules can be loaded twice. In the worst case scenario,\r\n     * you may need to check your project for each of these issues and fix them all.\r\n     *\r\n     * # Trying to add a plugin to an existing build\r\n     *\r\n     * If you import an existing CKEditor 5 build and a plugin like this:\r\n     *\r\n     * ```ts\r\n     * import ClassicEditor from '@ckeditor/ckeditor5-build-classic';\r\n     * import Highlight from '@ckeditor/ckeditor5-highlight/src/highlight';\r\n     * ```\r\n     *\r\n     * Then your project loads some CKEditor 5 packages twice. How does it happen?\r\n     *\r\n     * The build package contains a file which is already compiled with webpack. This means\r\n     * that it contains all the necessary code from e.g. `@ckeditor/ckeditor5-engine` and `@ckeditor/ckeditor5-utils`.\r\n     *\r\n     * However, the `Highlight` plugin imports some of the modules from these packages, too. If you ask webpack to\r\n     * build such a project, you will end up with the modules being included (and run) twice &mdash; first, because they are\r\n     * included inside the build package, and second, because they are required by the `Highlight` plugin.\r\n     *\r\n     * Therefore, **you must never add plugins to an existing build** unless your plugin has no dependencies.\r\n     *\r\n     * Adding plugins to a build is done by taking the source version of this build (so, before it was built with webpack)\r\n     * and adding plugins there. In this situation, webpack will know that it only needs to load each plugin once.\r\n     *\r\n     * Read more in the {@glink installation/plugins/installing-plugins Installing plugins} guide.\r\n     *\r\n     * # Confused an editor build with an editor implementation\r\n     *\r\n     * This scenario is very similar to the previous one, but has a different origin.\r\n     *\r\n     * Let's assume that you wanted to use CKEditor 5 from source, as explained in the\r\n     * {@glink installation/advanced/alternative-setups/integrating-from-source-webpack \"Building from source\"} section\r\n     * or in the {@glink framework/quick-start \"Quick start\"} guide of CKEditor 5 Framework.\r\n     *\r\n     * The correct way to do so is to import an editor and plugins and run them together like this:\r\n     *\r\n     * ```ts\r\n     * import ClassicEditor from '@ckeditor/ckeditor5-editor-classic/src/classiceditor';\r\n     * import Essentials from '@ckeditor/ckeditor5-essentials/src/essentials';\r\n     * import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph';\r\n     * import Bold from '@ckeditor/ckeditor5-basic-styles/src/bold';\r\n     * import Italic from '@ckeditor/ckeditor5-basic-styles/src/italic';\r\n     *\r\n     * ClassicEditor\r\n     * \t.create( document.querySelector( '#editor' ), {\r\n     * \t\tplugins: [ Essentials, Paragraph, Bold, Italic ],\r\n     * \t\ttoolbar: [ 'bold', 'italic' ]\r\n     * \t} )\r\n     * \t.then( editor => {\r\n     * \t\tconsole.log( 'Editor was initialized', editor );\r\n     * \t} )\r\n     * \t.catch( error => {\r\n     * \t\tconsole.error( error.stack );\r\n     * \t} );\r\n     * ```\r\n     *\r\n     * However, you might have mistakenly imported a build instead of the source `ClassicEditor`. In this case\r\n     * your imports will look like this:\r\n     *\r\n     * ```ts\r\n     * import ClassicEditor from '@ckeditor/ckeditor5-build-classic';\r\n     * import Essentials from '@ckeditor/ckeditor5-essentials/src/essentials';\r\n     * import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph';\r\n     * import Bold from '@ckeditor/ckeditor5-basic-styles/src/bold';\r\n     * import Italic from '@ckeditor/ckeditor5-basic-styles/src/italic';\r\n     * ```\r\n     *\r\n     * This creates the same situation as in the previous section because you use a build together with source plugins.\r\n     *\r\n     * Remember: `@ckeditor/ckeditor5-build-*` packages contain editor builds and `@ckeditor/ckeditor5-editor-*` contain source editors.\r\n     *\r\n     * # Loading two or more builds on one page\r\n     *\r\n     * If you use CKEditor 5 builds, you might have loaded two (or more) `ckeditor.js` files on one web page.\r\n     * Check your web page for duplicated `<script>` elements or make sure your page builder/bundler includes CKEditor only once.\r\n     *\r\n     * If you want to use two different types of editors at once, see the\r\n     * {@glink installation/advanced/using-two-editors \"Using two different editors\"}\r\n     * section.\r\n     *\r\n     * # Using outdated packages\r\n     *\r\n     * Building CKEditor 5 from source requires using multiple npm packages. These packages have their dependencies\r\n     * to other packages. If you use the latest version of, for example, `@ckeditor/ckeditor5-editor-classic` with\r\n     * an outdated version of `@ckeditor/ckeditor5-image`, npm or yarn will need to install two different versions of\r\n     * `@ckeditor/ckeditor5-core` because `@ckeditor/ckeditor5-editor-classic` and `@ckeditor/ckeditor5-image` may require\r\n     * different versions of the core package.\r\n     *\r\n     * The solution to this issue is to update all packages to their latest version. We recommend\r\n     * using tools like [`npm-check-updates`](https://www.npmjs.com/package/npm-check-updates) which simplify this process.\r\n     *\r\n     * # Conflicting version of dependencies\r\n     *\r\n     * This is a special case of the previous scenario. If you use CKEditor 5 with some third-party plugins,\r\n     * it may happen that even if you use the latest versions of the official packages and the latest version of\r\n     * these third-party packages, there will be a conflict between some of their dependencies.\r\n     *\r\n     * Such a problem can be resolved by either downgrading CKEditor 5 packages (which we do not recommend) or\r\n     * asking the author of the third-party package to upgrade its depdendencies (or forking their project and doing this yourself).\r\n     *\r\n     * **Note:** All official CKEditor 5 packages (excluding integrations and `ckeditor5-dev-*` packages) are released in the\r\n     * same major version. This is &mdash; in the `x.y.z`, the `x` is the same for all packages. This is the simplest way to check\r\n     * whether you use packages coming from the same CKEditor 5 version. You can read more about versioning in the\r\n     * {@glink updating/versioning-policy Versioning policy} guide.\r\n     *\r\n     * # Packages were duplicated in `node_modules`\r\n     *\r\n     * In some situations, especially when calling `npm install` multiple times, it may happen\r\n     * that npm will not correctly \"deduplicate\" packages.\r\n     *\r\n     * Normally, npm deduplicates all packages so, for example, `@ckeditor/ckeditor5-core` is installed only once in `node_modules/`.\r\n     * However, it is known to fail to do so from time to time.\r\n     *\r\n     * We recommend checking if any of the steps listed below help:\r\n     *\r\n     * * `rm -rf node_modules && npm install` to make sure you have a clean `node_modules/` directory. This step\r\n     * is known to help in most cases.\r\n     * * If you use `yarn.lock` or `package-lock.json`, remove it before `npm install`.\r\n     * * Check whether all CKEditor 5 packages are up to date and reinstall them\r\n     * if you changed anything (`rm -rf node_modules && npm install`).\r\n     *\r\n     * If all packages are correct and compatible with each other, the steps above are known to help. If not, you may\r\n     * try to check with `npm ls` how many times packages like `@ckeditor/ckeditor5-core`, `@ckeditor/ckeditor5-engine` and\r\n     *`@ckeditor/ckeditor5-utils` are installed. If more than once, verify which package causes that.\r\n     *\r\n     * @error ckeditor-duplicated-modules\r\n     */\r\n    throw new CKEditorError('ckeditor-duplicated-modules', null);\r\n}\r\nelse {\r\n    windowOrGlobal.CKEDITOR_VERSION = version;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/emittermixin\r\n */\r\nimport EventInfo from './eventinfo';\r\nimport uid from './uid';\r\nimport priorities from './priorities';\r\nimport insertToPriorityArray from './inserttopriorityarray';\r\n// To check if component is loaded more than once.\r\nimport './version';\r\nimport CKEditorError from './ckeditorerror';\r\nconst _listeningTo = Symbol('listeningTo');\r\nconst _emitterId = Symbol('emitterId');\r\nconst _delegations = Symbol('delegations');\r\nconst defaultEmitterClass = EmitterMixin(Object);\r\nexport default function EmitterMixin(base) {\r\n    if (!base) {\r\n        return defaultEmitterClass;\r\n    }\r\n    class Mixin extends base {\r\n        on(event, callback, options) {\r\n            this.listenTo(this, event, callback, options);\r\n        }\r\n        once(event, callback, options) {\r\n            let wasFired = false;\r\n            const onceCallback = (event, ...args) => {\r\n                // Ensure the callback is called only once even if the callback itself leads to re-firing the event\r\n                // (which would call the callback again).\r\n                if (!wasFired) {\r\n                    wasFired = true;\r\n                    // Go off() at the first call.\r\n                    event.off();\r\n                    // Go with the original callback.\r\n                    callback.call(this, event, ...args);\r\n                }\r\n            };\r\n            // Make a similar on() call, simply replacing the callback.\r\n            this.listenTo(this, event, onceCallback, options);\r\n        }\r\n        off(event, callback) {\r\n            this.stopListening(this, event, callback);\r\n        }\r\n        listenTo(emitter, event, callback, options = {}) {\r\n            let emitterInfo, eventCallbacks;\r\n            // _listeningTo contains a list of emitters that this object is listening to.\r\n            // This list has the following format:\r\n            //\r\n            // _listeningTo: {\r\n            //     emitterId: {\r\n            //         emitter: emitter,\r\n            //         callbacks: {\r\n            //             event1: [ callback1, callback2, ... ]\r\n            //             ....\r\n            //         }\r\n            //     },\r\n            //     ...\r\n            // }\r\n            if (!this[_listeningTo]) {\r\n                this[_listeningTo] = {};\r\n            }\r\n            const emitters = this[_listeningTo];\r\n            if (!_getEmitterId(emitter)) {\r\n                _setEmitterId(emitter);\r\n            }\r\n            const emitterId = _getEmitterId(emitter);\r\n            if (!(emitterInfo = emitters[emitterId])) {\r\n                emitterInfo = emitters[emitterId] = {\r\n                    emitter,\r\n                    callbacks: {}\r\n                };\r\n            }\r\n            if (!(eventCallbacks = emitterInfo.callbacks[event])) {\r\n                eventCallbacks = emitterInfo.callbacks[event] = [];\r\n            }\r\n            eventCallbacks.push(callback);\r\n            // Finally register the callback to the event.\r\n            addEventListener(this, emitter, event, callback, options);\r\n        }\r\n        stopListening(emitter, event, callback) {\r\n            const emitters = this[_listeningTo];\r\n            let emitterId = emitter && _getEmitterId(emitter);\r\n            const emitterInfo = (emitters && emitterId) ? emitters[emitterId] : undefined;\r\n            const eventCallbacks = (emitterInfo && event) ? emitterInfo.callbacks[event] : undefined;\r\n            // Stop if nothing has been listened.\r\n            if (!emitters || (emitter && !emitterInfo) || (event && !eventCallbacks)) {\r\n                return;\r\n            }\r\n            // All params provided. off() that single callback.\r\n            if (callback) {\r\n                removeEventListener(this, emitter, event, callback);\r\n                // We must remove callbacks as well in order to prevent memory leaks.\r\n                // See https://github.com/ckeditor/ckeditor5/pull/8480\r\n                const index = eventCallbacks.indexOf(callback);\r\n                if (index !== -1) {\r\n                    if (eventCallbacks.length === 1) {\r\n                        delete emitterInfo.callbacks[event];\r\n                    }\r\n                    else {\r\n                        removeEventListener(this, emitter, event, callback);\r\n                    }\r\n                }\r\n            }\r\n            // Only `emitter` and `event` provided. off() all callbacks for that event.\r\n            else if (eventCallbacks) {\r\n                while ((callback = eventCallbacks.pop())) {\r\n                    removeEventListener(this, emitter, event, callback);\r\n                }\r\n                delete emitterInfo.callbacks[event];\r\n            }\r\n            // Only `emitter` provided. off() all events for that emitter.\r\n            else if (emitterInfo) {\r\n                for (event in emitterInfo.callbacks) {\r\n                    this.stopListening(emitter, event);\r\n                }\r\n                delete emitters[emitterId];\r\n            }\r\n            // No params provided. off() all emitters.\r\n            else {\r\n                for (emitterId in emitters) {\r\n                    this.stopListening(emitters[emitterId].emitter);\r\n                }\r\n                delete this[_listeningTo];\r\n            }\r\n        }\r\n        fire(eventOrInfo, ...args) {\r\n            try {\r\n                const eventInfo = eventOrInfo instanceof EventInfo ? eventOrInfo : new EventInfo(this, eventOrInfo);\r\n                const event = eventInfo.name;\r\n                let callbacks = getCallbacksForEvent(this, event);\r\n                // Record that the event passed this emitter on its path.\r\n                eventInfo.path.push(this);\r\n                // Handle event listener callbacks first.\r\n                if (callbacks) {\r\n                    // Arguments passed to each callback.\r\n                    const callbackArgs = [eventInfo, ...args];\r\n                    // Copying callbacks array is the easiest and most secure way of preventing infinite loops, when event callbacks\r\n                    // are added while processing other callbacks. Previous solution involved adding counters (unique ids) but\r\n                    // failed if callbacks were added to the queue before currently processed callback.\r\n                    // If this proves to be too inefficient, another method is to change `.on()` so callbacks are stored if same\r\n                    // event is currently processed. Then, `.fire()` at the end, would have to add all stored events.\r\n                    callbacks = Array.from(callbacks);\r\n                    for (let i = 0; i < callbacks.length; i++) {\r\n                        callbacks[i].callback.apply(this, callbackArgs);\r\n                        // Remove the callback from future requests if off() has been called.\r\n                        if (eventInfo.off.called) {\r\n                            // Remove the called mark for the next calls.\r\n                            delete eventInfo.off.called;\r\n                            this._removeEventListener(event, callbacks[i].callback);\r\n                        }\r\n                        // Do not execute next callbacks if stop() was called.\r\n                        if (eventInfo.stop.called) {\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n                // Delegate event to other emitters if needed.\r\n                const delegations = this[_delegations];\r\n                if (delegations) {\r\n                    const destinations = delegations.get(event);\r\n                    const passAllDestinations = delegations.get('*');\r\n                    if (destinations) {\r\n                        fireDelegatedEvents(destinations, eventInfo, args);\r\n                    }\r\n                    if (passAllDestinations) {\r\n                        fireDelegatedEvents(passAllDestinations, eventInfo, args);\r\n                    }\r\n                }\r\n                return eventInfo.return;\r\n            }\r\n            catch (err) {\r\n                // @if CK_DEBUG // throw err;\r\n                /* istanbul ignore next -- @preserve */\r\n                CKEditorError.rethrowUnexpectedError(err, this);\r\n            }\r\n        }\r\n        delegate(...events) {\r\n            return {\r\n                to: (emitter, nameOrFunction) => {\r\n                    if (!this[_delegations]) {\r\n                        this[_delegations] = new Map();\r\n                    }\r\n                    // Originally there was a for..of loop which unfortunately caused an error in Babel that didn't allow\r\n                    // build an application. See: https://github.com/ckeditor/ckeditor5-react/issues/40.\r\n                    events.forEach(eventName => {\r\n                        const destinations = this[_delegations].get(eventName);\r\n                        if (!destinations) {\r\n                            this[_delegations].set(eventName, new Map([[emitter, nameOrFunction]]));\r\n                        }\r\n                        else {\r\n                            destinations.set(emitter, nameOrFunction);\r\n                        }\r\n                    });\r\n                }\r\n            };\r\n        }\r\n        stopDelegating(event, emitter) {\r\n            if (!this[_delegations]) {\r\n                return;\r\n            }\r\n            if (!event) {\r\n                this[_delegations].clear();\r\n            }\r\n            else if (!emitter) {\r\n                this[_delegations].delete(event);\r\n            }\r\n            else {\r\n                const destinations = this[_delegations].get(event);\r\n                if (destinations) {\r\n                    destinations.delete(emitter);\r\n                }\r\n            }\r\n        }\r\n        _addEventListener(event, callback, options) {\r\n            createEventNamespace(this, event);\r\n            const lists = getCallbacksListsForNamespace(this, event);\r\n            const priority = priorities.get(options.priority);\r\n            const callbackDefinition = {\r\n                callback,\r\n                priority\r\n            };\r\n            // Add the callback to all callbacks list.\r\n            for (const callbacks of lists) {\r\n                // Add the callback to the list in the right priority position.\r\n                insertToPriorityArray(callbacks, callbackDefinition);\r\n            }\r\n        }\r\n        _removeEventListener(event, callback) {\r\n            const lists = getCallbacksListsForNamespace(this, event);\r\n            for (const callbacks of lists) {\r\n                for (let i = 0; i < callbacks.length; i++) {\r\n                    if (callbacks[i].callback == callback) {\r\n                        // Remove the callback from the list (fixing the next index).\r\n                        callbacks.splice(i, 1);\r\n                        i--;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n    return Mixin;\r\n}\r\n// Backward compatibility with `mix`\r\n([\r\n    'on', 'once', 'off', 'listenTo',\r\n    'stopListening', 'fire', 'delegate', 'stopDelegating',\r\n    '_addEventListener', '_removeEventListener'\r\n]).forEach(key => {\r\n    EmitterMixin[key] = defaultEmitterClass.prototype[key];\r\n});\r\n/**\r\n * Checks if `listeningEmitter` listens to an emitter with given `listenedToEmitterId` and if so, returns that emitter.\r\n * If not, returns `null`.\r\n *\r\n * @internal\r\n * @param listeningEmitter An emitter that listens.\r\n * @param listenedToEmitterId Unique emitter id of emitter listened to.\r\n */\r\nexport function _getEmitterListenedTo(listeningEmitter, listenedToEmitterId) {\r\n    const listeningTo = listeningEmitter[_listeningTo];\r\n    if (listeningTo && listeningTo[listenedToEmitterId]) {\r\n        return listeningTo[listenedToEmitterId].emitter;\r\n    }\r\n    return null;\r\n}\r\n/**\r\n * Sets emitter's unique id.\r\n *\r\n * **Note:** `_emitterId` can be set only once.\r\n *\r\n * @internal\r\n * @param emitter An emitter for which id will be set.\r\n * @param id Unique id to set. If not passed, random unique id will be set.\r\n */\r\nexport function _setEmitterId(emitter, id) {\r\n    if (!emitter[_emitterId]) {\r\n        emitter[_emitterId] = id || uid();\r\n    }\r\n}\r\n/**\r\n * Returns emitter's unique id.\r\n *\r\n * @internal\r\n * @param emitter An emitter which id will be returned.\r\n */\r\nexport function _getEmitterId(emitter) {\r\n    return emitter[_emitterId];\r\n}\r\n/**\r\n * Gets the internal `_events` property of the given object.\r\n * `_events` property store all lists with callbacks for registered event names.\r\n * If there were no events registered on the object, empty `_events` object is created.\r\n */\r\nfunction getEvents(source) {\r\n    if (!source._events) {\r\n        Object.defineProperty(source, '_events', {\r\n            value: {}\r\n        });\r\n    }\r\n    return source._events;\r\n}\r\n/**\r\n * Creates event node for generic-specific events relation architecture.\r\n */\r\nfunction makeEventNode() {\r\n    return {\r\n        callbacks: [],\r\n        childEvents: []\r\n    };\r\n}\r\n/**\r\n * Creates an architecture for generic-specific events relation.\r\n * If needed, creates all events for given eventName, i.e. if the first registered event\r\n * is foo:bar:abc, it will create foo:bar:abc, foo:bar and foo event and tie them together.\r\n * It also copies callbacks from more generic events to more specific events when\r\n * specific events are created.\r\n */\r\nfunction createEventNamespace(source, eventName) {\r\n    const events = getEvents(source);\r\n    // First, check if the event we want to add to the structure already exists.\r\n    if (events[eventName]) {\r\n        // If it exists, we don't have to do anything.\r\n        return;\r\n    }\r\n    // In other case, we have to create the structure for the event.\r\n    // Note, that we might need to create intermediate events too.\r\n    // I.e. if foo:bar:abc is being registered and we only have foo in the structure,\r\n    // we need to also register foo:bar.\r\n    // Currently processed event name.\r\n    let name = eventName;\r\n    // Name of the event that is a child event for currently processed event.\r\n    let childEventName = null;\r\n    // Array containing all newly created specific events.\r\n    const newEventNodes = [];\r\n    // While loop can't check for ':' index because we have to handle generic events too.\r\n    // In each loop, we truncate event name, going from the most specific name to the generic one.\r\n    // I.e. foo:bar:abc -> foo:bar -> foo.\r\n    while (name !== '') {\r\n        if (events[name]) {\r\n            // If the currently processed event name is already registered, we can be sure\r\n            // that it already has all the structure created, so we can break the loop here\r\n            // as no more events need to be registered.\r\n            break;\r\n        }\r\n        // If this event is not yet registered, create a new object for it.\r\n        events[name] = makeEventNode();\r\n        // Add it to the array with newly created events.\r\n        newEventNodes.push(events[name]);\r\n        // Add previously processed event name as a child of this event.\r\n        if (childEventName) {\r\n            events[name].childEvents.push(childEventName);\r\n        }\r\n        childEventName = name;\r\n        // If `.lastIndexOf()` returns -1, `.substr()` will return '' which will break the loop.\r\n        name = name.substr(0, name.lastIndexOf(':'));\r\n    }\r\n    if (name !== '') {\r\n        // If name is not empty, we found an already registered event that was a parent of the\r\n        // event we wanted to register.\r\n        // Copy that event's callbacks to newly registered events.\r\n        for (const node of newEventNodes) {\r\n            node.callbacks = events[name].callbacks.slice();\r\n        }\r\n        // Add last newly created event to the already registered event.\r\n        events[name].childEvents.push(childEventName);\r\n    }\r\n}\r\n/**\r\n * Gets an array containing callbacks list for a given event and it's more specific events.\r\n * I.e. if given event is foo:bar and there is also foo:bar:abc event registered, this will\r\n * return callback list of foo:bar and foo:bar:abc (but not foo).\r\n */\r\nfunction getCallbacksListsForNamespace(source, eventName) {\r\n    const eventNode = getEvents(source)[eventName];\r\n    if (!eventNode) {\r\n        return [];\r\n    }\r\n    let callbacksLists = [eventNode.callbacks];\r\n    for (let i = 0; i < eventNode.childEvents.length; i++) {\r\n        const childCallbacksLists = getCallbacksListsForNamespace(source, eventNode.childEvents[i]);\r\n        callbacksLists = callbacksLists.concat(childCallbacksLists);\r\n    }\r\n    return callbacksLists;\r\n}\r\n/**\r\n * Get the list of callbacks for a given event, but only if there any callbacks have been registered.\r\n * If there are no callbacks registered for given event, it checks if this is a specific event and looks\r\n * for callbacks for it's more generic version.\r\n */\r\nfunction getCallbacksForEvent(source, eventName) {\r\n    let event;\r\n    if (!source._events || !(event = source._events[eventName]) || !event.callbacks.length) {\r\n        // There are no callbacks registered for specified eventName.\r\n        // But this could be a specific-type event that is in a namespace.\r\n        if (eventName.indexOf(':') > -1) {\r\n            // If the eventName is specific, try to find callback lists for more generic event.\r\n            return getCallbacksForEvent(source, eventName.substr(0, eventName.lastIndexOf(':')));\r\n        }\r\n        else {\r\n            // If this is a top-level generic event, return null;\r\n            return null;\r\n        }\r\n    }\r\n    return event.callbacks;\r\n}\r\n/**\r\n * Fires delegated events for given map of destinations.\r\n *\r\n * @param destinations A map containing `[ {@link module:utils/emittermixin~Emitter}, \"event name\" ]` pair destinations.\r\n * @param eventInfo The original event info object.\r\n * @param fireArgs Arguments the original event was fired with.\r\n */\r\nfunction fireDelegatedEvents(destinations, eventInfo, fireArgs) {\r\n    for (let [emitter, name] of destinations) {\r\n        if (!name) {\r\n            name = eventInfo.name;\r\n        }\r\n        else if (typeof name == 'function') {\r\n            name = name(eventInfo.name);\r\n        }\r\n        const delegatedInfo = new EventInfo(eventInfo.source, name);\r\n        delegatedInfo.path = [...eventInfo.path];\r\n        emitter.fire(delegatedInfo, ...fireArgs);\r\n    }\r\n}\r\n/**\r\n * Helper for registering event callback on the emitter.\r\n */\r\nfunction addEventListener(listener, emitter, event, callback, options) {\r\n    if (emitter._addEventListener) {\r\n        emitter._addEventListener(event, callback, options);\r\n    }\r\n    else {\r\n        // Allow listening on objects that do not implement Emitter interface.\r\n        // This is needed in some tests that are using mocks instead of the real objects with EmitterMixin mixed.\r\n        (listener._addEventListener).call(emitter, event, callback, options);\r\n    }\r\n}\r\n/**\r\n * Helper for removing event callback from the emitter.\r\n */\r\nfunction removeEventListener(listener, emitter, event, callback) {\r\n    if (emitter._removeEventListener) {\r\n        emitter._removeEventListener(event, callback);\r\n    }\r\n    else {\r\n        // Allow listening on objects that do not implement Emitter interface.\r\n        // This is needed in some tests that are using mocks instead of the real objects with EmitterMixin mixed.\r\n        listener._removeEventListener.call(emitter, event, callback);\r\n    }\r\n}\r\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/* eslint-disable @typescript-eslint/unified-signatures */\r\n/**\r\n * @module utils/observablemixin\r\n */\r\nimport EmitterMixin from './emittermixin';\r\nimport CKEditorError from './ckeditorerror';\r\nimport { isObject } from 'lodash-es';\r\nconst observablePropertiesSymbol = Symbol('observableProperties');\r\nconst boundObservablesSymbol = Symbol('boundObservables');\r\nconst boundPropertiesSymbol = Symbol('boundProperties');\r\nconst decoratedMethods = Symbol('decoratedMethods');\r\nconst decoratedOriginal = Symbol('decoratedOriginal');\r\nconst defaultObservableClass = ObservableMixin(EmitterMixin());\r\nexport default function ObservableMixin(base) {\r\n    if (!base) {\r\n        return defaultObservableClass;\r\n    }\r\n    class Mixin extends base {\r\n        set(name, value) {\r\n            // If the first parameter is an Object, iterate over its properties.\r\n            if (isObject(name)) {\r\n                Object.keys(name).forEach(property => {\r\n                    this.set(property, name[property]);\r\n                }, this);\r\n                return;\r\n            }\r\n            initObservable(this);\r\n            const properties = this[observablePropertiesSymbol];\r\n            if ((name in this) && !properties.has(name)) {\r\n                /**\r\n                 * Cannot override an existing property.\r\n                 *\r\n                 * This error is thrown when trying to {@link module:utils/observablemixin~Observable#set set} a property with\r\n                 * a name of an already existing property. For example:\r\n                 *\r\n                 * ```ts\r\n                 * let observable = new Model();\r\n                 * observable.property = 1;\r\n                 * observable.set( 'property', 2 );\t\t\t// throws\r\n                 *\r\n                 * observable.set( 'property', 1 );\r\n                 * observable.set( 'property', 2 );\t\t\t// ok, because this is an existing property.\r\n                 * ```\r\n                 *\r\n                 * @error observable-set-cannot-override\r\n                 */\r\n                throw new CKEditorError('observable-set-cannot-override', this);\r\n            }\r\n            Object.defineProperty(this, name, {\r\n                enumerable: true,\r\n                configurable: true,\r\n                get() {\r\n                    return properties.get(name);\r\n                },\r\n                set(value) {\r\n                    const oldValue = properties.get(name);\r\n                    // Fire `set` event before the new value will be set to make it possible\r\n                    // to override observable property without affecting `change` event.\r\n                    // See https://github.com/ckeditor/ckeditor5-utils/issues/171.\r\n                    let newValue = this.fire(`set:${name}`, name, value, oldValue);\r\n                    if (newValue === undefined) {\r\n                        newValue = value;\r\n                    }\r\n                    // Allow undefined as an initial value like A.define( 'x', undefined ) (#132).\r\n                    // Note: When properties map has no such own property, then its value is undefined.\r\n                    if (oldValue !== newValue || !properties.has(name)) {\r\n                        properties.set(name, newValue);\r\n                        this.fire(`change:${name}`, name, newValue, oldValue);\r\n                    }\r\n                }\r\n            });\r\n            this[name] = value;\r\n        }\r\n        bind(...bindProperties) {\r\n            if (!bindProperties.length || !isStringArray(bindProperties)) {\r\n                /**\r\n                 * All properties must be strings.\r\n                 *\r\n                 * @error observable-bind-wrong-properties\r\n                 */\r\n                throw new CKEditorError('observable-bind-wrong-properties', this);\r\n            }\r\n            if ((new Set(bindProperties)).size !== bindProperties.length) {\r\n                /**\r\n                 * Properties must be unique.\r\n                 *\r\n                 * @error observable-bind-duplicate-properties\r\n                 */\r\n                throw new CKEditorError('observable-bind-duplicate-properties', this);\r\n            }\r\n            initObservable(this);\r\n            const boundProperties = this[boundPropertiesSymbol];\r\n            bindProperties.forEach(propertyName => {\r\n                if (boundProperties.has(propertyName)) {\r\n                    /**\r\n                     * Cannot bind the same property more than once.\r\n                     *\r\n                     * @error observable-bind-rebind\r\n                     */\r\n                    throw new CKEditorError('observable-bind-rebind', this);\r\n                }\r\n            });\r\n            const bindings = new Map();\r\n            bindProperties.forEach(a => {\r\n                const binding = { property: a, to: [] };\r\n                boundProperties.set(a, binding);\r\n                bindings.set(a, binding);\r\n            });\r\n            return {\r\n                to: bindTo,\r\n                toMany: bindToMany,\r\n                _observable: this,\r\n                _bindProperties: bindProperties,\r\n                _to: [],\r\n                _bindings: bindings\r\n            };\r\n        }\r\n        unbind(...unbindProperties) {\r\n            // Nothing to do here if not inited yet.\r\n            if (!(this[observablePropertiesSymbol])) {\r\n                return;\r\n            }\r\n            const boundProperties = this[boundPropertiesSymbol];\r\n            const boundObservables = this[boundObservablesSymbol];\r\n            if (unbindProperties.length) {\r\n                if (!isStringArray(unbindProperties)) {\r\n                    /**\r\n                     * Properties must be strings.\r\n                     *\r\n                     * @error observable-unbind-wrong-properties\r\n                     */\r\n                    throw new CKEditorError('observable-unbind-wrong-properties', this);\r\n                }\r\n                unbindProperties.forEach(propertyName => {\r\n                    const binding = boundProperties.get(propertyName);\r\n                    // Nothing to do if the binding is not defined\r\n                    if (!binding) {\r\n                        return;\r\n                    }\r\n                    binding.to.forEach(([toObservable, toProperty]) => {\r\n                        const toProperties = boundObservables.get(toObservable);\r\n                        const toPropertyBindings = toProperties[toProperty];\r\n                        toPropertyBindings.delete(binding);\r\n                        if (!toPropertyBindings.size) {\r\n                            delete toProperties[toProperty];\r\n                        }\r\n                        if (!Object.keys(toProperties).length) {\r\n                            boundObservables.delete(toObservable);\r\n                            this.stopListening(toObservable, 'change');\r\n                        }\r\n                    });\r\n                    boundProperties.delete(propertyName);\r\n                });\r\n            }\r\n            else {\r\n                boundObservables.forEach((bindings, boundObservable) => {\r\n                    this.stopListening(boundObservable, 'change');\r\n                });\r\n                boundObservables.clear();\r\n                boundProperties.clear();\r\n            }\r\n        }\r\n        decorate(methodName) {\r\n            initObservable(this);\r\n            const originalMethod = this[methodName];\r\n            if (!originalMethod) {\r\n                /**\r\n                 * Cannot decorate an undefined method.\r\n                 *\r\n                 * @error observablemixin-cannot-decorate-undefined\r\n                 * @param {Object} object The object which method should be decorated.\r\n                 * @param {String} methodName Name of the method which does not exist.\r\n                 */\r\n                throw new CKEditorError('observablemixin-cannot-decorate-undefined', this, { object: this, methodName });\r\n            }\r\n            this.on(methodName, (evt, args) => {\r\n                evt.return = originalMethod.apply(this, args);\r\n            });\r\n            this[methodName] = function (...args) {\r\n                return this.fire(methodName, args);\r\n            };\r\n            this[methodName][decoratedOriginal] = originalMethod;\r\n            if (!this[decoratedMethods]) {\r\n                this[decoratedMethods] = [];\r\n            }\r\n            this[decoratedMethods].push(methodName);\r\n        }\r\n        // Override the EmitterMixin stopListening method to be able to clean (and restore) decorated methods.\r\n        // This is needed in case of:\r\n        //  1. Have x.foo() decorated.\r\n        //  2. Call x.stopListening()\r\n        //  3. Call x.foo(). Problem: nothing happens (the original foo() method is not executed)\r\n        stopListening(emitter, event, callback) {\r\n            // Removing all listeners so let's clean the decorated methods to the original state.\r\n            if (!emitter && this[decoratedMethods]) {\r\n                for (const methodName of this[decoratedMethods]) {\r\n                    this[methodName] = this[methodName][decoratedOriginal];\r\n                }\r\n                delete this[decoratedMethods];\r\n            }\r\n            super.stopListening(emitter, event, callback);\r\n        }\r\n    }\r\n    return Mixin;\r\n}\r\n// Backward compatibility with `mix`\r\n([\r\n    'set', 'bind', 'unbind', 'decorate',\r\n    'on', 'once', 'off', 'listenTo',\r\n    'stopListening', 'fire', 'delegate', 'stopDelegating',\r\n    '_addEventListener', '_removeEventListener'\r\n]).forEach(key => {\r\n    ObservableMixin[key] = defaultObservableClass.prototype[key];\r\n});\r\n// Init symbol properties needed for the observable mechanism to work.\r\nfunction initObservable(observable) {\r\n    // Do nothing if already inited.\r\n    if (observable[observablePropertiesSymbol]) {\r\n        return;\r\n    }\r\n    // The internal hash containing the observable's state.\r\n    Object.defineProperty(observable, observablePropertiesSymbol, {\r\n        value: new Map()\r\n    });\r\n    // Map containing bindings to external observables. It shares the binding objects\r\n    // (`{ observable: A, property: 'a', to: ... }`) with {@link module:utils/observablemixin~Observable#_boundProperties} and\r\n    // it is used to observe external observables to update own properties accordingly.\r\n    // See {@link module:utils/observablemixin~Observable#bind}.\r\n    //\r\n    //\t\tA.bind( 'a', 'b', 'c' ).to( B, 'x', 'y', 'x' );\r\n    //\t\tconsole.log( A._boundObservables );\r\n    //\r\n    //\t\t\tMap( {\r\n    //\t\t\t\tB: {\r\n    //\t\t\t\t\tx: Set( [\r\n    //\t\t\t\t\t\t{ observable: A, property: 'a', to: [ [ B, 'x' ] ] },\r\n    //\t\t\t\t\t\t{ observable: A, property: 'c', to: [ [ B, 'x' ] ] }\r\n    //\t\t\t\t\t] ),\r\n    //\t\t\t\t\ty: Set( [\r\n    //\t\t\t\t\t\t{ observable: A, property: 'b', to: [ [ B, 'y' ] ] },\r\n    //\t\t\t\t\t] )\r\n    //\t\t\t\t}\r\n    //\t\t\t} )\r\n    //\r\n    //\t\tA.bind( 'd' ).to( B, 'z' ).to( C, 'w' ).as( callback );\r\n    //\t\tconsole.log( A._boundObservables );\r\n    //\r\n    //\t\t\tMap( {\r\n    //\t\t\t\tB: {\r\n    //\t\t\t\t\tx: Set( [\r\n    //\t\t\t\t\t\t{ observable: A, property: 'a', to: [ [ B, 'x' ] ] },\r\n    //\t\t\t\t\t\t{ observable: A, property: 'c', to: [ [ B, 'x' ] ] }\r\n    //\t\t\t\t\t] ),\r\n    //\t\t\t\t\ty: Set( [\r\n    //\t\t\t\t\t\t{ observable: A, property: 'b', to: [ [ B, 'y' ] ] },\r\n    //\t\t\t\t\t] ),\r\n    //\t\t\t\t\tz: Set( [\r\n    //\t\t\t\t\t\t{ observable: A, property: 'd', to: [ [ B, 'z' ], [ C, 'w' ] ], callback: callback }\r\n    //\t\t\t\t\t] )\r\n    //\t\t\t\t},\r\n    //\t\t\t\tC: {\r\n    //\t\t\t\t\tw: Set( [\r\n    //\t\t\t\t\t\t{ observable: A, property: 'd', to: [ [ B, 'z' ], [ C, 'w' ] ], callback: callback }\r\n    //\t\t\t\t\t] )\r\n    //\t\t\t\t}\r\n    //\t\t\t} )\r\n    //\r\n    Object.defineProperty(observable, boundObservablesSymbol, {\r\n        value: new Map()\r\n    });\r\n    // Object that stores which properties of this observable are bound and how. It shares\r\n    // the binding objects (`{ observable: A, property: 'a', to: ... }`) with\r\n    // {@link module:utils/observablemixin~Observable#_boundObservables}. This data structure is\r\n    // a reverse of {@link module:utils/observablemixin~Observable#_boundObservables} and it is helpful for\r\n    // {@link module:utils/observablemixin~Observable#unbind}.\r\n    //\r\n    // See {@link module:utils/observablemixin~Observable#bind}.\r\n    //\r\n    //\t\tA.bind( 'a', 'b', 'c' ).to( B, 'x', 'y', 'x' );\r\n    //\t\tconsole.log( A._boundProperties );\r\n    //\r\n    //\t\t\tMap( {\r\n    //\t\t\t\ta: { observable: A, property: 'a', to: [ [ B, 'x' ] ] },\r\n    //\t\t\t\tb: { observable: A, property: 'b', to: [ [ B, 'y' ] ] },\r\n    //\t\t\t\tc: { observable: A, property: 'c', to: [ [ B, 'x' ] ] }\r\n    //\t\t\t} )\r\n    //\r\n    //\t\tA.bind( 'd' ).to( B, 'z' ).to( C, 'w' ).as( callback );\r\n    //\t\tconsole.log( A._boundProperties );\r\n    //\r\n    //\t\t\tMap( {\r\n    //\t\t\t\ta: { observable: A, property: 'a', to: [ [ B, 'x' ] ] },\r\n    //\t\t\t\tb: { observable: A, property: 'b', to: [ [ B, 'y' ] ] },\r\n    //\t\t\t\tc: { observable: A, property: 'c', to: [ [ B, 'x' ] ] },\r\n    //\t\t\t\td: { observable: A, property: 'd', to: [ [ B, 'z' ], [ C, 'w' ] ], callback: callback }\r\n    //\t\t\t} )\r\n    Object.defineProperty(observable, boundPropertiesSymbol, {\r\n        value: new Map()\r\n    });\r\n}\r\n/**\r\n * A chaining for {@link module:utils/observablemixin~Observable#bind} providing `.to()` interface.\r\n *\r\n * @param args Arguments of the `.to( args )` binding.\r\n */\r\nfunction bindTo(...args) {\r\n    const parsedArgs = parseBindToArgs(...args);\r\n    const bindingsKeys = Array.from(this._bindings.keys());\r\n    const numberOfBindings = bindingsKeys.length;\r\n    // Eliminate A.bind( 'x' ).to( B, C )\r\n    if (!parsedArgs.callback && parsedArgs.to.length > 1) {\r\n        /**\r\n         * Binding multiple observables only possible with callback.\r\n         *\r\n         * @error observable-bind-to-no-callback\r\n         */\r\n        throw new CKEditorError('observable-bind-to-no-callback', this);\r\n    }\r\n    // Eliminate A.bind( 'x', 'y' ).to( B, callback )\r\n    if (numberOfBindings > 1 && parsedArgs.callback) {\r\n        /**\r\n         * Cannot bind multiple properties and use a callback in one binding.\r\n         *\r\n         * @error observable-bind-to-extra-callback\r\n         */\r\n        throw new CKEditorError('observable-bind-to-extra-callback', this);\r\n    }\r\n    parsedArgs.to.forEach(to => {\r\n        // Eliminate A.bind( 'x', 'y' ).to( B, 'a' )\r\n        if (to.properties.length && to.properties.length !== numberOfBindings) {\r\n            /**\r\n             * The number of properties must match.\r\n             *\r\n             * @error observable-bind-to-properties-length\r\n             */\r\n            throw new CKEditorError('observable-bind-to-properties-length', this);\r\n        }\r\n        // When no to.properties specified, observing source properties instead i.e.\r\n        // A.bind( 'x', 'y' ).to( B ) -> Observe B.x and B.y\r\n        if (!to.properties.length) {\r\n            to.properties = this._bindProperties;\r\n        }\r\n    });\r\n    this._to = parsedArgs.to;\r\n    // Fill {@link BindChain#_bindings} with callback. When the callback is set there's only one binding.\r\n    if (parsedArgs.callback) {\r\n        this._bindings.get(bindingsKeys[0]).callback = parsedArgs.callback;\r\n    }\r\n    attachBindToListeners(this._observable, this._to);\r\n    // Update observable._boundProperties and observable._boundObservables.\r\n    updateBindToBound(this);\r\n    // Set initial values of bound properties.\r\n    this._bindProperties.forEach(propertyName => {\r\n        updateBoundObservableProperty(this._observable, propertyName);\r\n    });\r\n}\r\n/**\r\n * Binds to an attribute in a set of iterable observables.\r\n */\r\nfunction bindToMany(observables, attribute, callback) {\r\n    if (this._bindings.size > 1) {\r\n        /**\r\n         * Binding one attribute to many observables only possible with one attribute.\r\n         *\r\n         * @error observable-bind-to-many-not-one-binding\r\n         */\r\n        throw new CKEditorError('observable-bind-to-many-not-one-binding', this);\r\n    }\r\n    this.to(\r\n    // Bind to #attribute of each observable...\r\n    ...getBindingTargets(observables, attribute), \r\n    // ...using given callback to parse attribute values.\r\n    callback);\r\n}\r\n/**\r\n * Returns an array of binding components for\r\n * {@link Observable#bind} from a set of iterable observables.\r\n */\r\nfunction getBindingTargets(observables, attribute) {\r\n    const observableAndAttributePairs = observables.map(observable => [observable, attribute]);\r\n    // Merge pairs to one-dimension array of observables and attributes.\r\n    return Array.prototype.concat.apply([], observableAndAttributePairs);\r\n}\r\n/**\r\n * Check if all entries of the array are of `String` type.\r\n */\r\nfunction isStringArray(arr) {\r\n    return arr.every(a => typeof a == 'string');\r\n}\r\n/**\r\n * Parses and validates {@link Observable#bind}`.to( args )` arguments and returns\r\n * an object with a parsed structure. For example\r\n *\r\n * ```ts\r\n * A.bind( 'x' ).to( B, 'a', C, 'b', call );\r\n * ```\r\n *\r\n * becomes\r\n *\r\n * ```ts\r\n * {\r\n * \tto: [\r\n * \t\t{ observable: B, properties: [ 'a' ] },\r\n * \t\t{ observable: C, properties: [ 'b' ] },\r\n * \t],\r\n * \tcallback: call\r\n * }\r\n *\r\n * @param args Arguments of {@link Observable#bind}`.to( args )`.\r\n */\r\nfunction parseBindToArgs(...args) {\r\n    // Eliminate A.bind( 'x' ).to()\r\n    if (!args.length) {\r\n        /**\r\n         * Invalid argument syntax in `to()`.\r\n         *\r\n         * @error observable-bind-to-parse-error\r\n         */\r\n        throw new CKEditorError('observable-bind-to-parse-error', null);\r\n    }\r\n    const parsed = { to: [] };\r\n    let lastObservable;\r\n    if (typeof args[args.length - 1] == 'function') {\r\n        parsed.callback = args.pop();\r\n    }\r\n    args.forEach(a => {\r\n        if (typeof a == 'string') {\r\n            lastObservable.properties.push(a);\r\n        }\r\n        else if (typeof a == 'object') {\r\n            lastObservable = { observable: a, properties: [] };\r\n            parsed.to.push(lastObservable);\r\n        }\r\n        else {\r\n            throw new CKEditorError('observable-bind-to-parse-error', null);\r\n        }\r\n    });\r\n    return parsed;\r\n}\r\n/**\r\n * Synchronizes {@link module:utils/observable#_boundObservables} with {@link Binding}.\r\n *\r\n * @param binding A binding to store in {@link Observable#_boundObservables}.\r\n * @param toObservable A observable, which is a new component of `binding`.\r\n * @param toPropertyName A name of `toObservable`'s property, a new component of the `binding`.\r\n */\r\nfunction updateBoundObservables(observable, binding, toObservable, toPropertyName) {\r\n    const boundObservables = observable[boundObservablesSymbol];\r\n    const bindingsToObservable = boundObservables.get(toObservable);\r\n    const bindings = bindingsToObservable || {};\r\n    if (!bindings[toPropertyName]) {\r\n        bindings[toPropertyName] = new Set();\r\n    }\r\n    // Pass the binding to a corresponding Set in `observable._boundObservables`.\r\n    bindings[toPropertyName].add(binding);\r\n    if (!bindingsToObservable) {\r\n        boundObservables.set(toObservable, bindings);\r\n    }\r\n}\r\n/**\r\n * Synchronizes {@link Observable#_boundProperties} and {@link Observable#_boundObservables}\r\n * with {@link BindChain}.\r\n *\r\n * Assuming the following binding being created\r\n *\r\n * ```ts\r\n * A.bind( 'a', 'b' ).to( B, 'x', 'y' );\r\n * ```\r\n *\r\n * the following bindings were initialized by {@link Observable#bind} in {@link BindChain#_bindings}:\r\n *\r\n * ```ts\r\n * {\r\n * \ta: { observable: A, property: 'a', to: [] },\r\n * \tb: { observable: A, property: 'b', to: [] },\r\n * }\r\n * ```\r\n *\r\n * Iterate over all bindings in this chain and fill their `to` properties with\r\n * corresponding to( ... ) arguments (components of the binding), so\r\n *\r\n * ```ts\r\n * {\r\n * \ta: { observable: A, property: 'a', to: [ B, 'x' ] },\r\n * \tb: { observable: A, property: 'b', to: [ B, 'y' ] },\r\n * }\r\n * ```\r\n *\r\n * Then update the structure of {@link Observable#_boundObservables} with updated\r\n * binding, so it becomes:\r\n *\r\n * ```ts\r\n * Map( {\r\n * \tB: {\r\n * \t\tx: Set( [\r\n * \t\t\t{ observable: A, property: 'a', to: [ [ B, 'x' ] ] }\r\n * \t\t] ),\r\n * \t\ty: Set( [\r\n * \t\t\t{ observable: A, property: 'b', to: [ [ B, 'y' ] ] },\r\n * \t\t] )\r\n * \t}\r\n * } )\r\n * ```\r\n *\r\n * @param chain The binding initialized by {@link Observable#bind}.\r\n */\r\nfunction updateBindToBound(chain) {\r\n    let toProperty;\r\n    chain._bindings.forEach((binding, propertyName) => {\r\n        // Note: For a binding without a callback, this will run only once\r\n        // like in A.bind( 'x', 'y' ).to( B, 'a', 'b' )\r\n        // TODO: ES6 destructuring.\r\n        chain._to.forEach(to => {\r\n            toProperty = to.properties[binding.callback ? 0 : chain._bindProperties.indexOf(propertyName)];\r\n            binding.to.push([to.observable, toProperty]);\r\n            updateBoundObservables(chain._observable, binding, to.observable, toProperty);\r\n        });\r\n    });\r\n}\r\n/**\r\n * Updates an property of a {@link Observable} with a value\r\n * determined by an entry in {@link Observable#_boundProperties}.\r\n *\r\n * @param observable A observable which property is to be updated.\r\n * @param propertyName An property to be updated.\r\n */\r\nfunction updateBoundObservableProperty(observable, propertyName) {\r\n    const boundProperties = observable[boundPropertiesSymbol];\r\n    const binding = boundProperties.get(propertyName);\r\n    let propertyValue;\r\n    // When a binding with callback is created like\r\n    //\r\n    // \t\tA.bind( 'a' ).to( B, 'b', C, 'c', callback );\r\n    //\r\n    // collect B.b and C.c, then pass them to callback to set A.a.\r\n    if (binding.callback) {\r\n        propertyValue = binding.callback.apply(observable, binding.to.map(to => to[0][to[1]]));\r\n    }\r\n    else {\r\n        propertyValue = binding.to[0];\r\n        propertyValue = propertyValue[0][propertyValue[1]];\r\n    }\r\n    if (Object.prototype.hasOwnProperty.call(observable, propertyName)) {\r\n        observable[propertyName] = propertyValue;\r\n    }\r\n    else {\r\n        observable.set(propertyName, propertyValue);\r\n    }\r\n}\r\n/**\r\n * Starts listening to changes in {@link BindChain._to} observables to update\r\n * {@link BindChain._observable} {@link BindChain._bindProperties}. Also sets the\r\n * initial state of {@link BindChain._observable}.\r\n *\r\n * @param chain The chain initialized by {@link Observable#bind}.\r\n */\r\nfunction attachBindToListeners(observable, toBindings) {\r\n    toBindings.forEach(to => {\r\n        const boundObservables = observable[boundObservablesSymbol];\r\n        let bindings;\r\n        // If there's already a chain between the observables (`observable` listens to\r\n        // `to.observable`), there's no need to create another `change` event listener.\r\n        if (!boundObservables.get(to.observable)) {\r\n            observable.listenTo(to.observable, 'change', (evt, propertyName) => {\r\n                bindings = boundObservables.get(to.observable)[propertyName];\r\n                // Note: to.observable will fire for any property change, react\r\n                // to changes of properties which are bound only.\r\n                if (bindings) {\r\n                    bindings.forEach(binding => {\r\n                        updateBoundObservableProperty(observable, binding.property);\r\n                    });\r\n                }\r\n            });\r\n        }\r\n    });\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/elementreplacer\r\n */\r\n/**\r\n * Utility class allowing to hide existing HTML elements or replace them with given ones in a way that doesn't remove\r\n * the original elements from the DOM.\r\n */\r\nexport default class ElementReplacer {\r\n    constructor() {\r\n        this._replacedElements = [];\r\n    }\r\n    /**\r\n     * Hides the `element` and, if specified, inserts the the given element next to it.\r\n     *\r\n     * The effect of this method can be reverted by {@link #restore}.\r\n     *\r\n     * @param element The element to replace.\r\n     * @param newElement The replacement element. If not passed, then the `element` will just be hidden.\r\n     */\r\n    replace(element, newElement) {\r\n        this._replacedElements.push({ element, newElement });\r\n        element.style.display = 'none';\r\n        if (newElement) {\r\n            element.parentNode.insertBefore(newElement, element.nextSibling);\r\n        }\r\n    }\r\n    /**\r\n     * Restores what {@link #replace} did.\r\n     */\r\n    restore() {\r\n        this._replacedElements.forEach(({ element, newElement }) => {\r\n            element.style.display = '';\r\n            if (newElement) {\r\n                newElement.remove();\r\n            }\r\n        });\r\n        this._replacedElements = [];\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/count\r\n */\r\n/**\r\n * Returns the number of items return by the iterator.\r\n *\r\n * ```ts\r\n * count( [ 1, 2, 3, 4, 5 ] ); // 5;\r\n * ```\r\n *\r\n * @param iterable Any iterable.\r\n * @returns Number of items returned by that iterable.\r\n */\r\nexport default function count(iterable) {\r\n    let count = 0;\r\n    for (const _ of iterable) { // eslint-disable-line no-unused-vars\r\n        count++;\r\n    }\r\n    return count;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/comparearrays\r\n */\r\n/**\r\n * Compares how given arrays relate to each other. One array can be: same as another array, prefix of another array\r\n * or completely different. If arrays are different, first index at which they differ is returned. Otherwise,\r\n * a flag specifying the relation is returned. Flags are negative numbers, so whenever a number >= 0 is returned\r\n * it means that arrays differ.\r\n *\r\n * ```ts\r\n * compareArrays( [ 0, 2 ], [ 0, 2 ] );\t\t// 'same'\r\n * compareArrays( [ 0, 2 ], [ 0, 2, 1 ] );\t\t// 'prefix'\r\n * compareArrays( [ 0, 2 ], [ 0 ] );\t\t\t// 'extension'\r\n * compareArrays( [ 0, 2 ], [ 1, 2 ] );\t\t// 0\r\n * compareArrays( [ 0, 2 ], [ 0, 1 ] );\t\t// 1\r\n * ```\r\n *\r\n * @param a Array that is compared.\r\n * @param b Array to compare with.\r\n * @returns How array `a` is related to `b`.\r\n */\r\nexport default function compareArrays(a, b) {\r\n    const minLen = Math.min(a.length, b.length);\r\n    for (let i = 0; i < minLen; i++) {\r\n        if (a[i] != b[i]) {\r\n            // The arrays are different.\r\n            return i;\r\n        }\r\n    }\r\n    // Both arrays were same at all points.\r\n    if (a.length == b.length) {\r\n        // If their length is also same, they are the same.\r\n        return 'same';\r\n    }\r\n    else if (a.length < b.length) {\r\n        // Compared array is shorter so it is a prefix of the other array.\r\n        return 'prefix';\r\n    }\r\n    else {\r\n        // Compared array is longer so it is an extension of the other array.\r\n        return 'extension';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/isiterable\r\n */\r\n/**\r\n * Checks if value implements iterator interface.\r\n *\r\n * @param value The value to check.\r\n * @returns True if value implements iterator interface.\r\n */\r\nexport default function isIterable(value) {\r\n    return !!(value && value[Symbol.iterator]);\r\n}\r\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nexport default baseGetTag;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","import baseGetTag from './_baseGetTag.js';\nimport isArray from './isArray.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n  return typeof value == 'string' ||\n    (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nexport default isString;\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/dom/createelement\r\n */\r\nimport isIterable from '../isiterable';\r\nimport { isString } from 'lodash-es';\r\n/**\r\n * Creates an HTML or SVG element with attributes and children elements.\r\n *\r\n * ```ts\r\n * createElement( document, 'p' ); // <p>\r\n * createElement( document, 'mask', { xmlns: 'http://www.w3.org/2000/svg' } ); // <mask>\r\n * ```\r\n *\r\n * @param doc Document used to create the element.\r\n * @param name Name of the element.\r\n * @param attributes Object where keys represent attribute keys and values represent attribute values.\r\n * @param children Child or any iterable of children. Strings will be automatically turned into Text nodes.\r\n * @returns HTML or SVG element.\r\n */\r\nexport default function createElement(doc, name, attributes = {}, children = []) {\r\n    const namespace = attributes && attributes.xmlns;\r\n    const element = namespace ? doc.createElementNS(namespace, name) : doc.createElement(name);\r\n    for (const key in attributes) {\r\n        element.setAttribute(key, attributes[key]);\r\n    }\r\n    if (isString(children) || !isIterable(children)) {\r\n        children = [children];\r\n    }\r\n    for (let child of children) {\r\n        if (isString(child)) {\r\n            child = doc.createTextNode(child);\r\n        }\r\n        element.appendChild(child);\r\n    }\r\n    return element;\r\n}\r\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\nexport default overArg;\n","import overArg from './_overArg.js';\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nexport default getPrototype;\n","import baseGetTag from './_baseGetTag.js';\nimport getPrototype from './_getPrototype.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n  if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n    return false;\n  }\n  var proto = getPrototype(value);\n  if (proto === null) {\n    return true;\n  }\n  var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n  return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n    funcToString.call(Ctor) == objectCtorString;\n}\n\nexport default isPlainObject;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n  this.__data__ = [];\n  this.size = 0;\n}\n\nexport default listCacheClear;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n  return value === other || (value !== value && other !== other);\n}\n\nexport default eq;\n","import eq from './eq.js';\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n  var length = array.length;\n  while (length--) {\n    if (eq(array[length][0], key)) {\n      return length;\n    }\n  }\n  return -1;\n}\n\nexport default assocIndexOf;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    return false;\n  }\n  var lastIndex = data.length - 1;\n  if (index == lastIndex) {\n    data.pop();\n  } else {\n    splice.call(data, index, 1);\n  }\n  --this.size;\n  return true;\n}\n\nexport default listCacheDelete;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  return index < 0 ? undefined : data[index][1];\n}\n\nexport default listCacheGet;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n  return assocIndexOf(this.__data__, key) > -1;\n}\n\nexport default listCacheHas;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    ++this.size;\n    data.push([key, value]);\n  } else {\n    data[index][1] = value;\n  }\n  return this;\n}\n\nexport default listCacheSet;\n","import listCacheClear from './_listCacheClear.js';\nimport listCacheDelete from './_listCacheDelete.js';\nimport listCacheGet from './_listCacheGet.js';\nimport listCacheHas from './_listCacheHas.js';\nimport listCacheSet from './_listCacheSet.js';\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nexport default ListCache;\n","import ListCache from './_ListCache.js';\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n  this.__data__ = new ListCache;\n  this.size = 0;\n}\n\nexport default stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n  var data = this.__data__,\n      result = data['delete'](key);\n\n  this.size = data.size;\n  return result;\n}\n\nexport default stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n  return this.__data__.get(key);\n}\n\nexport default stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n  return this.__data__.has(key);\n}\n\nexport default stackHas;\n","import baseGetTag from './_baseGetTag.js';\nimport isObject from './isObject.js';\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  if (!isObject(value)) {\n    return false;\n  }\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 9 which returns 'object' for typed arrays and other constructors.\n  var tag = baseGetTag(value);\n  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nexport default isFunction;\n","import root from './_root.js';\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nexport default coreJsData;\n","import coreJsData from './_coreJsData.js';\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\nexport default isMasked;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\nexport default toSource;\n","import isFunction from './isFunction.js';\nimport isMasked from './_isMasked.js';\nimport isObject from './isObject.js';\nimport toSource from './_toSource.js';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\nexport default baseIsNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\nexport default getValue;\n","import baseIsNative from './_baseIsNative.js';\nimport getValue from './_getValue.js';\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\nexport default getNative;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nexport default Map;\n","import getNative from './_getNative.js';\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nexport default nativeCreate;\n","import nativeCreate from './_nativeCreate.js';\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n  this.__data__ = nativeCreate ? nativeCreate(null) : {};\n  this.size = 0;\n}\n\nexport default hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n  var result = this.has(key) && delete this.__data__[key];\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nexport default hashDelete;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n  var data = this.__data__;\n  if (nativeCreate) {\n    var result = data[key];\n    return result === HASH_UNDEFINED ? undefined : result;\n  }\n  return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nexport default hashGet;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n  var data = this.__data__;\n  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nexport default hashHas;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n  var data = this.__data__;\n  this.size += this.has(key) ? 0 : 1;\n  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n  return this;\n}\n\nexport default hashSet;\n","import hashClear from './_hashClear.js';\nimport hashDelete from './_hashDelete.js';\nimport hashGet from './_hashGet.js';\nimport hashHas from './_hashHas.js';\nimport hashSet from './_hashSet.js';\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nexport default Hash;\n","import Hash from './_Hash.js';\nimport ListCache from './_ListCache.js';\nimport Map from './_Map.js';\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n  this.size = 0;\n  this.__data__ = {\n    'hash': new Hash,\n    'map': new (Map || ListCache),\n    'string': new Hash\n  };\n}\n\nexport default mapCacheClear;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n  var type = typeof value;\n  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n    ? (value !== '__proto__')\n    : (value === null);\n}\n\nexport default isKeyable;\n","import isKeyable from './_isKeyable.js';\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n  var data = map.__data__;\n  return isKeyable(key)\n    ? data[typeof key == 'string' ? 'string' : 'hash']\n    : data.map;\n}\n\nexport default getMapData;\n","import getMapData from './_getMapData.js';\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n  var result = getMapData(this, key)['delete'](key);\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nexport default mapCacheDelete;\n","import getMapData from './_getMapData.js';\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n  return getMapData(this, key).get(key);\n}\n\nexport default mapCacheGet;\n","import getMapData from './_getMapData.js';\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n  return getMapData(this, key).has(key);\n}\n\nexport default mapCacheHas;\n","import getMapData from './_getMapData.js';\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n  var data = getMapData(this, key),\n      size = data.size;\n\n  data.set(key, value);\n  this.size += data.size == size ? 0 : 1;\n  return this;\n}\n\nexport default mapCacheSet;\n","import mapCacheClear from './_mapCacheClear.js';\nimport mapCacheDelete from './_mapCacheDelete.js';\nimport mapCacheGet from './_mapCacheGet.js';\nimport mapCacheHas from './_mapCacheHas.js';\nimport mapCacheSet from './_mapCacheSet.js';\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nexport default MapCache;\n","import ListCache from './_ListCache.js';\nimport Map from './_Map.js';\nimport MapCache from './_MapCache.js';\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n  var data = this.__data__;\n  if (data instanceof ListCache) {\n    var pairs = data.__data__;\n    if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n      pairs.push([key, value]);\n      this.size = ++data.size;\n      return this;\n    }\n    data = this.__data__ = new MapCache(pairs);\n  }\n  data.set(key, value);\n  this.size = data.size;\n  return this;\n}\n\nexport default stackSet;\n","import ListCache from './_ListCache.js';\nimport stackClear from './_stackClear.js';\nimport stackDelete from './_stackDelete.js';\nimport stackGet from './_stackGet.js';\nimport stackHas from './_stackHas.js';\nimport stackSet from './_stackSet.js';\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n  var data = this.__data__ = new ListCache(entries);\n  this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nexport default Stack;\n","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (iteratee(array[index], index, array) === false) {\n      break;\n    }\n  }\n  return array;\n}\n\nexport default arrayEach;\n","import getNative from './_getNative.js';\n\nvar defineProperty = (function() {\n  try {\n    var func = getNative(Object, 'defineProperty');\n    func({}, '', {});\n    return func;\n  } catch (e) {}\n}());\n\nexport default defineProperty;\n","import defineProperty from './_defineProperty.js';\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n  if (key == '__proto__' && defineProperty) {\n    defineProperty(object, key, {\n      'configurable': true,\n      'enumerable': true,\n      'value': value,\n      'writable': true\n    });\n  } else {\n    object[key] = value;\n  }\n}\n\nexport default baseAssignValue;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n  var objValue = object[key];\n  if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n      (value === undefined && !(key in object))) {\n    baseAssignValue(object, key, value);\n  }\n}\n\nexport default assignValue;\n","import assignValue from './_assignValue.js';\nimport baseAssignValue from './_baseAssignValue.js';\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n  var isNew = !object;\n  object || (object = {});\n\n  var index = -1,\n      length = props.length;\n\n  while (++index < length) {\n    var key = props[index];\n\n    var newValue = customizer\n      ? customizer(object[key], source[key], key, object, source)\n      : undefined;\n\n    if (newValue === undefined) {\n      newValue = source[key];\n    }\n    if (isNew) {\n      baseAssignValue(object, key, newValue);\n    } else {\n      assignValue(object, key, newValue);\n    }\n  }\n  return object;\n}\n\nexport default copyObject;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n  var index = -1,\n      result = Array(n);\n\n  while (++index < n) {\n    result[index] = iteratee(index);\n  }\n  return result;\n}\n\nexport default baseTimes;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n  return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nexport default baseIsArguments;\n","import baseIsArguments from './_baseIsArguments.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n    !propertyIsEnumerable.call(value, 'callee');\n};\n\nexport default isArguments;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n  return false;\n}\n\nexport default stubFalse;\n","import root from './_root.js';\nimport stubFalse from './stubFalse.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nexport default isBuffer;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  var type = typeof value;\n  length = length == null ? MAX_SAFE_INTEGER : length;\n\n  return !!length &&\n    (type == 'number' ||\n      (type != 'symbol' && reIsUint.test(value))) &&\n        (value > -1 && value % 1 == 0 && value < length);\n}\n\nexport default isIndex;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport default isLength;\n","import baseGetTag from './_baseGetTag.js';\nimport isLength from './isLength.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n  return isObjectLike(value) &&\n    isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nexport default baseIsTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n  return function(value) {\n    return func(value);\n  };\n}\n\nexport default baseUnary;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n  try {\n    // Use `util.types` for Node.js 10+.\n    var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n    if (types) {\n      return types;\n    }\n\n    // Legacy `process.binding('util')` for Node.js < 10.\n    return freeProcess && freeProcess.binding && freeProcess.binding('util');\n  } catch (e) {}\n}());\n\nexport default nodeUtil;\n","import baseIsTypedArray from './_baseIsTypedArray.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nexport default isTypedArray;\n","import baseTimes from './_baseTimes.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isIndex from './_isIndex.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n  var isArr = isArray(value),\n      isArg = !isArr && isArguments(value),\n      isBuff = !isArr && !isArg && isBuffer(value),\n      isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n      skipIndexes = isArr || isArg || isBuff || isType,\n      result = skipIndexes ? baseTimes(value.length, String) : [],\n      length = result.length;\n\n  for (var key in value) {\n    if ((inherited || hasOwnProperty.call(value, key)) &&\n        !(skipIndexes && (\n           // Safari 9 has enumerable `arguments.length` in strict mode.\n           key == 'length' ||\n           // Node.js 0.10 has enumerable non-index properties on buffers.\n           (isBuff && (key == 'offset' || key == 'parent')) ||\n           // PhantomJS 2 has enumerable non-index properties on typed arrays.\n           (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n           // Skip index properties.\n           isIndex(key, length)\n        ))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nexport default arrayLikeKeys;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n  var Ctor = value && value.constructor,\n      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n  return value === proto;\n}\n\nexport default isPrototype;\n","import overArg from './_overArg.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nexport default nativeKeys;\n","import isPrototype from './_isPrototype.js';\nimport nativeKeys from './_nativeKeys.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n  if (!isPrototype(object)) {\n    return nativeKeys(object);\n  }\n  var result = [];\n  for (var key in Object(object)) {\n    if (hasOwnProperty.call(object, key) && key != 'constructor') {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nexport default baseKeys;\n","import isFunction from './isFunction.js';\nimport isLength from './isLength.js';\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport default isArrayLike;\n","import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeys from './_baseKeys.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nexport default keys;\n","import copyObject from './_copyObject.js';\nimport keys from './keys.js';\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n  return object && copyObject(source, keys(source), object);\n}\n\nexport default baseAssign;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n  var result = [];\n  if (object != null) {\n    for (var key in Object(object)) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nexport default nativeKeysIn;\n","import isObject from './isObject.js';\nimport isPrototype from './_isPrototype.js';\nimport nativeKeysIn from './_nativeKeysIn.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n  if (!isObject(object)) {\n    return nativeKeysIn(object);\n  }\n  var isProto = isPrototype(object),\n      result = [];\n\n  for (var key in object) {\n    if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nexport default baseKeysIn;\n","import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeysIn from './_baseKeysIn.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nexport default keysIn;\n","import copyObject from './_copyObject.js';\nimport keysIn from './keysIn.js';\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n  return object && copyObject(source, keysIn(source), object);\n}\n\nexport default baseAssignIn;\n","import root from './_root.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n    allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of  `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n  if (isDeep) {\n    return buffer.slice();\n  }\n  var length = buffer.length,\n      result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n  buffer.copy(result);\n  return result;\n}\n\nexport default cloneBuffer;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n  var index = -1,\n      length = source.length;\n\n  array || (array = Array(length));\n  while (++index < length) {\n    array[index] = source[index];\n  }\n  return array;\n}\n\nexport default copyArray;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      resIndex = 0,\n      result = [];\n\n  while (++index < length) {\n    var value = array[index];\n    if (predicate(value, index, array)) {\n      result[resIndex++] = value;\n    }\n  }\n  return result;\n}\n\nexport default arrayFilter;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n  return [];\n}\n\nexport default stubArray;\n","import arrayFilter from './_arrayFilter.js';\nimport stubArray from './stubArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n  if (object == null) {\n    return [];\n  }\n  object = Object(object);\n  return arrayFilter(nativeGetSymbols(object), function(symbol) {\n    return propertyIsEnumerable.call(object, symbol);\n  });\n};\n\nexport default getSymbols;\n","import copyObject from './_copyObject.js';\nimport getSymbols from './_getSymbols.js';\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n  return copyObject(source, getSymbols(source), object);\n}\n\nexport default copySymbols;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n  var index = -1,\n      length = values.length,\n      offset = array.length;\n\n  while (++index < length) {\n    array[offset + index] = values[index];\n  }\n  return array;\n}\n\nexport default arrayPush;\n","import arrayPush from './_arrayPush.js';\nimport getPrototype from './_getPrototype.js';\nimport getSymbols from './_getSymbols.js';\nimport stubArray from './stubArray.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n  var result = [];\n  while (object) {\n    arrayPush(result, getSymbols(object));\n    object = getPrototype(object);\n  }\n  return result;\n};\n\nexport default getSymbolsIn;\n","import copyObject from './_copyObject.js';\nimport getSymbolsIn from './_getSymbolsIn.js';\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n  return copyObject(source, getSymbolsIn(source), object);\n}\n\nexport default copySymbolsIn;\n","import arrayPush from './_arrayPush.js';\nimport isArray from './isArray.js';\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n  var result = keysFunc(object);\n  return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nexport default baseGetAllKeys;\n","import baseGetAllKeys from './_baseGetAllKeys.js';\nimport getSymbols from './_getSymbols.js';\nimport keys from './keys.js';\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n  return baseGetAllKeys(object, keys, getSymbols);\n}\n\nexport default getAllKeys;\n","import baseGetAllKeys from './_baseGetAllKeys.js';\nimport getSymbolsIn from './_getSymbolsIn.js';\nimport keysIn from './keysIn.js';\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n  return baseGetAllKeys(object, keysIn, getSymbolsIn);\n}\n\nexport default getAllKeysIn;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nexport default DataView;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nexport default Promise;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nexport default Set;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nexport default WeakMap;\n","import DataView from './_DataView.js';\nimport Map from './_Map.js';\nimport Promise from './_Promise.js';\nimport Set from './_Set.js';\nimport WeakMap from './_WeakMap.js';\nimport baseGetTag from './_baseGetTag.js';\nimport toSource from './_toSource.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    objectTag = '[object Object]',\n    promiseTag = '[object Promise]',\n    setTag = '[object Set]',\n    weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n    mapCtorString = toSource(Map),\n    promiseCtorString = toSource(Promise),\n    setCtorString = toSource(Set),\n    weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n    (Map && getTag(new Map) != mapTag) ||\n    (Promise && getTag(Promise.resolve()) != promiseTag) ||\n    (Set && getTag(new Set) != setTag) ||\n    (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n  getTag = function(value) {\n    var result = baseGetTag(value),\n        Ctor = result == objectTag ? value.constructor : undefined,\n        ctorString = Ctor ? toSource(Ctor) : '';\n\n    if (ctorString) {\n      switch (ctorString) {\n        case dataViewCtorString: return dataViewTag;\n        case mapCtorString: return mapTag;\n        case promiseCtorString: return promiseTag;\n        case setCtorString: return setTag;\n        case weakMapCtorString: return weakMapTag;\n      }\n    }\n    return result;\n  };\n}\n\nexport default getTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n  var length = array.length,\n      result = new array.constructor(length);\n\n  // Add properties assigned by `RegExp#exec`.\n  if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n    result.index = array.index;\n    result.input = array.input;\n  }\n  return result;\n}\n\nexport default initCloneArray;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nexport default Uint8Array;\n","import Uint8Array from './_Uint8Array.js';\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n  var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n  new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n  return result;\n}\n\nexport default cloneArrayBuffer;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n  var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n  return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nexport default cloneDataView;\n","/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n  var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n  result.lastIndex = regexp.lastIndex;\n  return result;\n}\n\nexport default cloneRegExp;\n","import Symbol from './_Symbol.js';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n  return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nexport default cloneSymbol;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n  var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n  return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nexport default cloneTypedArray;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\nimport cloneDataView from './_cloneDataView.js';\nimport cloneRegExp from './_cloneRegExp.js';\nimport cloneSymbol from './_cloneSymbol.js';\nimport cloneTypedArray from './_cloneTypedArray.js';\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n  var Ctor = object.constructor;\n  switch (tag) {\n    case arrayBufferTag:\n      return cloneArrayBuffer(object);\n\n    case boolTag:\n    case dateTag:\n      return new Ctor(+object);\n\n    case dataViewTag:\n      return cloneDataView(object, isDeep);\n\n    case float32Tag: case float64Tag:\n    case int8Tag: case int16Tag: case int32Tag:\n    case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n      return cloneTypedArray(object, isDeep);\n\n    case mapTag:\n      return new Ctor;\n\n    case numberTag:\n    case stringTag:\n      return new Ctor(object);\n\n    case regexpTag:\n      return cloneRegExp(object);\n\n    case setTag:\n      return new Ctor;\n\n    case symbolTag:\n      return cloneSymbol(object);\n  }\n}\n\nexport default initCloneByTag;\n","import isObject from './isObject.js';\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n  function object() {}\n  return function(proto) {\n    if (!isObject(proto)) {\n      return {};\n    }\n    if (objectCreate) {\n      return objectCreate(proto);\n    }\n    object.prototype = proto;\n    var result = new object;\n    object.prototype = undefined;\n    return result;\n  };\n}());\n\nexport default baseCreate;\n","import baseCreate from './_baseCreate.js';\nimport getPrototype from './_getPrototype.js';\nimport isPrototype from './_isPrototype.js';\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n  return (typeof object.constructor == 'function' && !isPrototype(object))\n    ? baseCreate(getPrototype(object))\n    : {};\n}\n\nexport default initCloneObject;\n","import getTag from './_getTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n  return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nexport default baseIsMap;\n","import baseIsMap from './_baseIsMap.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nexport default isMap;\n","import getTag from './_getTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n  return isObjectLike(value) && getTag(value) == setTag;\n}\n\nexport default baseIsSet;\n","import baseIsSet from './_baseIsSet.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nexport default isSet;\n","import Stack from './_Stack.js';\nimport arrayEach from './_arrayEach.js';\nimport assignValue from './_assignValue.js';\nimport baseAssign from './_baseAssign.js';\nimport baseAssignIn from './_baseAssignIn.js';\nimport cloneBuffer from './_cloneBuffer.js';\nimport copyArray from './_copyArray.js';\nimport copySymbols from './_copySymbols.js';\nimport copySymbolsIn from './_copySymbolsIn.js';\nimport getAllKeys from './_getAllKeys.js';\nimport getAllKeysIn from './_getAllKeysIn.js';\nimport getTag from './_getTag.js';\nimport initCloneArray from './_initCloneArray.js';\nimport initCloneByTag from './_initCloneByTag.js';\nimport initCloneObject from './_initCloneObject.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isMap from './isMap.js';\nimport isObject from './isObject.js';\nimport isSet from './isSet.js';\nimport keys from './keys.js';\nimport keysIn from './keysIn.js';\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n    CLONE_FLAT_FLAG = 2,\n    CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n *  1 - Deep clone\n *  2 - Flatten inherited properties\n *  4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n  var result,\n      isDeep = bitmask & CLONE_DEEP_FLAG,\n      isFlat = bitmask & CLONE_FLAT_FLAG,\n      isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n  if (customizer) {\n    result = object ? customizer(value, key, object, stack) : customizer(value);\n  }\n  if (result !== undefined) {\n    return result;\n  }\n  if (!isObject(value)) {\n    return value;\n  }\n  var isArr = isArray(value);\n  if (isArr) {\n    result = initCloneArray(value);\n    if (!isDeep) {\n      return copyArray(value, result);\n    }\n  } else {\n    var tag = getTag(value),\n        isFunc = tag == funcTag || tag == genTag;\n\n    if (isBuffer(value)) {\n      return cloneBuffer(value, isDeep);\n    }\n    if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n      result = (isFlat || isFunc) ? {} : initCloneObject(value);\n      if (!isDeep) {\n        return isFlat\n          ? copySymbolsIn(value, baseAssignIn(result, value))\n          : copySymbols(value, baseAssign(result, value));\n      }\n    } else {\n      if (!cloneableTags[tag]) {\n        return object ? value : {};\n      }\n      result = initCloneByTag(value, tag, isDeep);\n    }\n  }\n  // Check for circular references and return its corresponding clone.\n  stack || (stack = new Stack);\n  var stacked = stack.get(value);\n  if (stacked) {\n    return stacked;\n  }\n  stack.set(value, result);\n\n  if (isSet(value)) {\n    value.forEach(function(subValue) {\n      result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n    });\n  } else if (isMap(value)) {\n    value.forEach(function(subValue, key) {\n      result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n    });\n  }\n\n  var keysFunc = isFull\n    ? (isFlat ? getAllKeysIn : getAllKeys)\n    : (isFlat ? keysIn : keys);\n\n  var props = isArr ? undefined : keysFunc(value);\n  arrayEach(props || value, function(subValue, key) {\n    if (props) {\n      key = subValue;\n      subValue = value[key];\n    }\n    // Recursively populate clone (susceptible to call stack limits).\n    assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n  });\n  return result;\n}\n\nexport default baseClone;\n","import baseClone from './_baseClone.js';\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n    CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.cloneWith` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the deep cloned value.\n * @see _.cloneWith\n * @example\n *\n * function customizer(value) {\n *   if (_.isElement(value)) {\n *     return value.cloneNode(true);\n *   }\n * }\n *\n * var el = _.cloneDeepWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => 'BODY'\n * console.log(el.childNodes.length);\n * // => 20\n */\nfunction cloneDeepWith(value, customizer) {\n  customizer = typeof customizer == 'function' ? customizer : undefined;\n  return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n}\n\nexport default cloneDeepWith;\n","import isObjectLike from './isObjectLike.js';\nimport isPlainObject from './isPlainObject.js';\n\n/**\n * Checks if `value` is likely a DOM element.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n * @example\n *\n * _.isElement(document.body);\n * // => true\n *\n * _.isElement('<body>');\n * // => false\n */\nfunction isElement(value) {\n  return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n}\n\nexport default isElement;\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/config\r\n */\r\nimport { isPlainObject, isElement, cloneDeepWith } from 'lodash-es';\r\n/**\r\n * Handles a configuration dictionary.\r\n *\r\n * @typeParam Cfg A type of the configuration dictionary.\r\n */\r\nexport default class Config {\r\n    /**\r\n     * Creates an instance of the {@link ~Config} class.\r\n     *\r\n     * @param configurations The initial configurations to be set. Usually, provided by the user.\r\n     * @param defaultConfigurations The default configurations. Usually, provided by the system.\r\n     */\r\n    constructor(configurations, defaultConfigurations) {\r\n        this._config = {};\r\n        // Set default configuration.\r\n        if (defaultConfigurations) {\r\n            // Clone the configuration to make sure that the properties will not be shared\r\n            // between editors and make the watchdog feature work correctly.\r\n            this.define(cloneConfig(defaultConfigurations));\r\n        }\r\n        // Set initial configuration.\r\n        if (configurations) {\r\n            this._setObjectToTarget(this._config, configurations);\r\n        }\r\n    }\r\n    set(name, value) {\r\n        this._setToTarget(this._config, name, value);\r\n    }\r\n    define(name, value) {\r\n        const isDefine = true;\r\n        this._setToTarget(this._config, name, value, isDefine);\r\n    }\r\n    /**\r\n     * Gets the value for a configuration entry.\r\n     *\r\n     * ```ts\r\n     * config.get( 'name' );\r\n     * ```\r\n     *\r\n     * Deep configurations can be retrieved by separating each part with a dot.\r\n     *\r\n     * ```ts\r\n     * config.get( 'toolbar.collapsed' );\r\n     * ```\r\n     *\r\n     * @param name The configuration name. Configuration names are case-sensitive.\r\n     * @returns The configuration value or `undefined` if the configuration entry was not found.\r\n     */\r\n    get(name) {\r\n        return this._getFromSource(this._config, name);\r\n    }\r\n    /**\r\n     * Iterates over all top level configuration names.\r\n     */\r\n    *names() {\r\n        for (const name of Object.keys(this._config)) {\r\n            yield name;\r\n        }\r\n    }\r\n    /**\r\n     * Saves passed configuration to the specified target (nested object).\r\n     *\r\n     * @param target Nested config object.\r\n     * @param name The configuration name or an object from which take properties as\r\n     * configuration entries. Configuration names are case-sensitive.\r\n     * @param value The configuration value. Used if a name is passed.\r\n     * @param isDefine Define if passed configuration should overwrite existing one.\r\n     */\r\n    _setToTarget(target, name, value, isDefine = false) {\r\n        // In case of an object, iterate through it and call `_setToTarget` again for each property.\r\n        if (isPlainObject(name)) {\r\n            this._setObjectToTarget(target, name, isDefine);\r\n            return;\r\n        }\r\n        // The configuration name should be split into parts if it has dots. E.g. `resize.width` -> [`resize`, `width`].\r\n        const parts = name.split('.');\r\n        // Take the name of the configuration out of the parts. E.g. `resize.width` -> `width`.\r\n        name = parts.pop();\r\n        // Iterate over parts to check if currently stored configuration has proper structure.\r\n        for (const part of parts) {\r\n            // If there is no object for specified part then create one.\r\n            if (!isPlainObject(target[part])) {\r\n                target[part] = {};\r\n            }\r\n            // Nested object becomes a target.\r\n            target = target[part];\r\n        }\r\n        // In case of value is an object.\r\n        if (isPlainObject(value)) {\r\n            // We take care of proper config structure.\r\n            if (!isPlainObject(target[name])) {\r\n                target[name] = {};\r\n            }\r\n            target = target[name];\r\n            // And iterate through this object calling `_setToTarget` again for each property.\r\n            this._setObjectToTarget(target, value, isDefine);\r\n            return;\r\n        }\r\n        // Do nothing if we are defining configuration for non empty name.\r\n        if (isDefine && typeof target[name] != 'undefined') {\r\n            return;\r\n        }\r\n        target[name] = value;\r\n    }\r\n    /**\r\n     * Get specified configuration from specified source (nested object).\r\n     *\r\n     * @param source level of nested object.\r\n     * @param name The configuration name. Configuration names are case-sensitive.\r\n     * @returns The configuration value or `undefined` if the configuration entry was not found.\r\n     */\r\n    _getFromSource(source, name) {\r\n        // The configuration name should be split into parts if it has dots. E.g. `resize.width` -> [`resize`, `width`].\r\n        const parts = name.split('.');\r\n        // Take the name of the configuration out of the parts. E.g. `resize.width` -> `width`.\r\n        name = parts.pop();\r\n        // Iterate over parts to check if currently stored configuration has proper structure.\r\n        for (const part of parts) {\r\n            if (!isPlainObject(source[part])) {\r\n                source = null;\r\n                break;\r\n            }\r\n            // Nested object becomes a source.\r\n            source = source[part];\r\n        }\r\n        // Always returns undefined for non existing configuration.\r\n        return source ? cloneConfig(source[name]) : undefined;\r\n    }\r\n    /**\r\n     * Iterates through passed object and calls {@link #_setToTarget} method with object key and value for each property.\r\n     *\r\n     * @param target Nested config object.\r\n     * @param configuration Configuration data set\r\n     * @param isDefine Defines if passed configuration is default configuration or not.\r\n     */\r\n    _setObjectToTarget(target, configuration, isDefine) {\r\n        Object.keys(configuration).forEach(key => {\r\n            this._setToTarget(target, key, configuration[key], isDefine);\r\n        });\r\n    }\r\n}\r\n/**\r\n * Clones configuration object or value.\r\n */\r\nfunction cloneConfig(source) {\r\n    return cloneDeepWith(source, leaveDOMReferences);\r\n}\r\n/**\r\n * A customized function for cloneDeepWith.\r\n * It will leave references to DOM Elements instead of cloning them.\r\n */\r\nfunction leaveDOMReferences(value) {\r\n    return isElement(value) ? value : undefined;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/dom/isnode\r\n */\r\n/**\r\n * Checks if the object is a native DOM Node.\r\n */\r\nexport default function isNode(obj) {\r\n    if (obj) {\r\n        if (obj.defaultView) {\r\n            return obj instanceof obj.defaultView.Document;\r\n        }\r\n        else if (obj.ownerDocument && obj.ownerDocument.defaultView) {\r\n            return obj instanceof obj.ownerDocument.defaultView.Node;\r\n        }\r\n    }\r\n    return false;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/dom/iswindow\r\n */\r\n/**\r\n * Checks if the object is a native DOM Window.\r\n */\r\nexport default function isWindow(obj) {\r\n    const stringifiedObject = Object.prototype.toString.apply(obj);\r\n    // Returns `true` for the `window` object in browser environments.\r\n    if (stringifiedObject == '[object Window]') {\r\n        return true;\r\n    }\r\n    // Returns `true` for the `window` object in the Electron environment.\r\n    if (stringifiedObject == '[object global]') {\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/dom/emittermixin\r\n */\r\nimport EmitterMixin, { _getEmitterListenedTo, _setEmitterId } from '../emittermixin';\r\nimport uid from '../uid';\r\nimport isNode from './isnode';\r\nimport isWindow from './iswindow';\r\nconst defaultEmitterClass = DomEmitterMixin(EmitterMixin());\r\nexport default function DomEmitterMixin(base) {\r\n    if (!base) {\r\n        return defaultEmitterClass;\r\n    }\r\n    class Mixin extends base {\r\n        listenTo(emitter, event, callback, options = {}) {\r\n            // Check if emitter is an instance of DOM Node. If so, use corresponding ProxyEmitter (or create one if not existing).\r\n            if (isNode(emitter) || isWindow(emitter)) {\r\n                const proxyOptions = {\r\n                    capture: !!options.useCapture,\r\n                    passive: !!options.usePassive\r\n                };\r\n                const proxyEmitter = this._getProxyEmitter(emitter, proxyOptions) || new ProxyEmitter(emitter, proxyOptions);\r\n                this.listenTo(proxyEmitter, event, callback, options);\r\n            }\r\n            else {\r\n                // Execute parent class method with Emitter (or ProxyEmitter) instance.\r\n                super.listenTo(emitter, event, callback, options);\r\n            }\r\n        }\r\n        stopListening(emitter, event, callback) {\r\n            // Check if the emitter is an instance of DOM Node. If so, forward the call to the corresponding ProxyEmitters.\r\n            if (isNode(emitter) || isWindow(emitter)) {\r\n                const proxyEmitters = this._getAllProxyEmitters(emitter);\r\n                for (const proxy of proxyEmitters) {\r\n                    this.stopListening(proxy, event, callback);\r\n                }\r\n            }\r\n            else {\r\n                // Execute parent class method with Emitter (or ProxyEmitter) instance.\r\n                super.stopListening(emitter, event, callback);\r\n            }\r\n        }\r\n        /**\r\n         * Retrieves ProxyEmitter instance for given DOM Node residing in this Host and given options.\r\n         *\r\n         * @param node DOM Node of the ProxyEmitter.\r\n         * @param options Additional options.\r\n         * @param options.useCapture Indicates that events of this type will be dispatched to the registered\r\n         * listener before being dispatched to any EventTarget beneath it in the DOM tree.\r\n         * @param options.usePassive Indicates that the function specified by listener will never call preventDefault()\r\n         * and prevents blocking browser's main thread by this event handler.\r\n         * @returns ProxyEmitter instance bound to the DOM Node.\r\n         */\r\n        _getProxyEmitter(node, options) {\r\n            return _getEmitterListenedTo(this, getProxyEmitterId(node, options));\r\n        }\r\n        /**\r\n         * Retrieves all the ProxyEmitter instances for given DOM Node residing in this Host.\r\n         *\r\n         * @param node DOM Node of the ProxyEmitter.\r\n         */\r\n        _getAllProxyEmitters(node) {\r\n            return [\r\n                { capture: false, passive: false },\r\n                { capture: false, passive: true },\r\n                { capture: true, passive: false },\r\n                { capture: true, passive: true }\r\n            ].map(options => this._getProxyEmitter(node, options)).filter(proxy => !!proxy);\r\n        }\r\n    }\r\n    return Mixin;\r\n}\r\n// Backward compatibility with `mix`\r\n([\r\n    '_getProxyEmitter', '_getAllProxyEmitters',\r\n    'on', 'once', 'off', 'listenTo',\r\n    'stopListening', 'fire', 'delegate', 'stopDelegating',\r\n    '_addEventListener', '_removeEventListener'\r\n]).forEach(key => {\r\n    DomEmitterMixin[key] = defaultEmitterClass.prototype[key];\r\n});\r\n/**\r\n * Creates a ProxyEmitter instance. Such an instance is a bridge between a DOM Node firing events\r\n * and any Host listening to them. It is backwards compatible with {@link module:utils/emittermixin~Emitter#on}.\r\n * There is a separate instance for each combination of modes (useCapture & usePassive). The mode is concatenated with\r\n * UID stored in HTMLElement to give each instance unique identifier.\r\n *\r\n *                                  listenTo( click, ... )\r\n *                    +-----------------------------------------+\r\n *                    |              stopListening( ... )       |\r\n *     +----------------------------+                           |             addEventListener( click, ... )\r\n *     | Host                       |                           |   +---------------------------------------------+\r\n *     +----------------------------+                           |   |       removeEventListener( click, ... )     |\r\n *     | _listeningTo: {            |                +----------v-------------+                                   |\r\n *     |   UID+mode: {              |                | ProxyEmitter           |                                   |\r\n *     |     emitter: ProxyEmitter, |                +------------------------+                      +------------v----------+\r\n *     |     callbacks: {           |                | events: {              |                      | Node (HTMLElement)    |\r\n *     |       click: [ callbacks ] |                |   click: [ callbacks ] |                      +-----------------------+\r\n *     |     }                      |                | },                     |                      | data-ck-expando: UID  |\r\n *     |   }                        |                | _domNode: Node,        |                      +-----------------------+\r\n *     | }                          |                | _domListeners: {},     |                                   |\r\n *     | +------------------------+ |                | _emitterId: UID+mode   |                                   |\r\n *     | | DomEmitterMixin        | |                +--------------^---------+                                   |\r\n *     | +------------------------+ |                           |   |                                             |\r\n *     +--------------^-------------+                           |   +---------------------------------------------+\r\n *                    |                                         |                  click (DOM Event)\r\n *                    +-----------------------------------------+\r\n *                                fire( click, DOM Event )\r\n */\r\nclass ProxyEmitter extends EmitterMixin() {\r\n    /**\r\n     * @param node DOM Node that fires events.\r\n     * @param options Additional options.\r\n     * @param options.useCapture Indicates that events of this type will be dispatched to the registered\r\n     * listener before being dispatched to any EventTarget beneath it in the DOM tree.\r\n     * @param options.usePassive Indicates that the function specified by listener will never call preventDefault()\r\n     * and prevents blocking browser's main thread by this event handler.\r\n     */\r\n    constructor(node, options) {\r\n        super();\r\n        // Set emitter ID to match DOM Node \"expando\" property.\r\n        _setEmitterId(this, getProxyEmitterId(node, options));\r\n        // Remember the DOM Node this ProxyEmitter is bound to.\r\n        this._domNode = node;\r\n        // And given options.\r\n        this._options = options;\r\n    }\r\n    /**\r\n     * Registers a callback function to be executed when an event is fired.\r\n     *\r\n     * It attaches a native DOM listener to the DOM Node. When fired,\r\n     * a corresponding Emitter event will also fire with DOM Event object as an argument.\r\n     *\r\n     * **Note**: This is automatically called by the\r\n     * {@link module:utils/emittermixin~Emitter#listenTo `Emitter#listenTo()`}.\r\n     *\r\n     * @param event The name of the event.\r\n     */\r\n    attach(event) {\r\n        // If the DOM Listener for given event already exist it is pointless\r\n        // to attach another one.\r\n        if (this._domListeners && this._domListeners[event]) {\r\n            return;\r\n        }\r\n        const domListener = this._createDomListener(event);\r\n        // Attach the native DOM listener to DOM Node.\r\n        this._domNode.addEventListener(event, domListener, this._options);\r\n        if (!this._domListeners) {\r\n            this._domListeners = {};\r\n        }\r\n        // Store the native DOM listener in this ProxyEmitter. It will be helpful\r\n        // when stopping listening to the event.\r\n        this._domListeners[event] = domListener;\r\n    }\r\n    /**\r\n     * Stops executing the callback on the given event.\r\n     *\r\n     * **Note**: This is automatically called by the\r\n     * {@link module:utils/emittermixin~Emitter#stopListening `Emitter#stopListening()`}.\r\n     *\r\n     * @param event The name of the event.\r\n     */\r\n    detach(event) {\r\n        let events;\r\n        // Remove native DOM listeners which are orphans. If no callbacks\r\n        // are awaiting given event, detach native DOM listener from DOM Node.\r\n        // See: {@link attach}.\r\n        if (this._domListeners[event] && (!(events = this._events[event]) || !events.callbacks.length)) {\r\n            this._domListeners[event].removeListener();\r\n        }\r\n    }\r\n    /**\r\n     * Adds callback to emitter for given event.\r\n     *\r\n     * @internal\r\n     * @param event The name of the event.\r\n     * @param callback The function to be called on event.\r\n     * @param options Additional options.\r\n     */\r\n    _addEventListener(event, callback, options) {\r\n        this.attach(event);\r\n        EmitterMixin().prototype._addEventListener.call(this, event, callback, options);\r\n    }\r\n    /**\r\n     * Removes callback from emitter for given event.\r\n     *\r\n     * @internal\r\n     * @param event The name of the event.\r\n     * @param callback The function to stop being called.\r\n     */\r\n    _removeEventListener(event, callback) {\r\n        EmitterMixin().prototype._removeEventListener.call(this, event, callback);\r\n        this.detach(event);\r\n    }\r\n    /**\r\n     * Creates a native DOM listener callback. When the native DOM event\r\n     * is fired it will fire corresponding event on this ProxyEmitter.\r\n     * Note: A native DOM Event is passed as an argument.\r\n     *\r\n     * @param event The name of the event.\r\n     * @returns The DOM listener callback.\r\n     */\r\n    _createDomListener(event) {\r\n        const domListener = (domEvt) => {\r\n            this.fire(event, domEvt);\r\n        };\r\n        // Supply the DOM listener callback with a function that will help\r\n        // detach it from the DOM Node, when it is no longer necessary.\r\n        // See: {@link detach}.\r\n        domListener.removeListener = () => {\r\n            this._domNode.removeEventListener(event, domListener, this._options);\r\n            delete this._domListeners[event];\r\n        };\r\n        return domListener;\r\n    }\r\n}\r\n/**\r\n * Gets an unique DOM Node identifier. The identifier will be set if not defined.\r\n *\r\n * @returns UID for given DOM Node.\r\n */\r\nfunction getNodeUID(node) {\r\n    return node['data-ck-expando'] || (node['data-ck-expando'] = uid());\r\n}\r\n/**\r\n * Gets id of the ProxyEmitter for the given node.\r\n */\r\nfunction getProxyEmitterId(node, options) {\r\n    let id = getNodeUID(node);\r\n    for (const option of Object.keys(options).sort()) {\r\n        if (options[option]) {\r\n            id += '-' + option;\r\n        }\r\n    }\r\n    return id;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * A helper (module) giving an access to the global DOM objects such as `window` and\r\n * `document`. Accessing these objects using this helper allows easy and bulletproof\r\n * testing, i.e. stubbing native properties:\r\n *\r\n * ```ts\r\n * import { global } from 'ckeditor5/utils';\r\n *\r\n * // This stub will work for any code using global module.\r\n * testUtils.sinon.stub( global, 'window', {\r\n * \tinnerWidth: 10000\r\n * } );\r\n *\r\n * console.log( global.window.innerWidth );\r\n * ```\r\n */\r\nlet globalVar; // named globalVar instead of global: https://github.com/ckeditor/ckeditor5/issues/12971\r\n// In some environments window and document API might not be available.\r\ntry {\r\n    globalVar = { window, document };\r\n}\r\ncatch (e) {\r\n    // It's not possible to mock a window object to simulate lack of a window object without writing extremely convoluted code.\r\n    /* istanbul ignore next -- @preserve */\r\n    // Let's cast it to not change module's API.\r\n    // We only handle this so loading editor in environments without window and document doesn't fail.\r\n    // For better DX we shouldn't introduce mixed types and require developers to check the type manually.\r\n    // This module should not be used on purpose in any environment outside browser.\r\n    globalVar = { window: {}, document: {} };\r\n}\r\nexport default globalVar;\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/* globals Node */\r\n/**\r\n * @module utils/dom/getancestors\r\n */\r\n/**\r\n * Returns all ancestors of given DOM node, starting from the top-most (root). Includes the given node itself. If the\r\n * node is a part of `DocumentFragment` that `DocumentFragment` will be returned. In contrary, if the node is\r\n * appended to a `Document`, that `Document` will not be returned (algorithms operating on DOM tree care for `Document#documentElement`\r\n * at most, which will be returned).\r\n *\r\n * @param node DOM node.\r\n * @returns Array of given `node` parents.\r\n */\r\nexport default function getAncestors(node) {\r\n    const nodes = [];\r\n    let currentNode = node;\r\n    // We are interested in `Node`s `DocumentFragment`s only.\r\n    while (currentNode && currentNode.nodeType != Node.DOCUMENT_NODE) {\r\n        nodes.unshift(currentNode);\r\n        currentNode = currentNode.parentNode;\r\n    }\r\n    return nodes;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/dom/istext\r\n */\r\n/**\r\n * Checks if the object is a native DOM Text node.\r\n */\r\nexport default function isText(obj) {\r\n    return Object.prototype.toString.call(obj) == '[object Text]';\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/dom/isrange\r\n */\r\n/**\r\n * Checks if the object is a native DOM Range.\r\n */\r\nexport default function isRange(obj) {\r\n    return Object.prototype.toString.apply(obj) == '[object Range]';\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/dom/getborderwidths\r\n */\r\n/**\r\n * Returns an object containing CSS border widths of a specified HTML element.\r\n *\r\n * @param element An element which has CSS borders.\r\n * @returns An object containing `top`, `left`, `right` and `bottom` properties\r\n * with numerical values of the `border-[top,left,right,bottom]-width` CSS styles.\r\n */\r\nexport default function getBorderWidths(element) {\r\n    // Call getComputedStyle on the window the element document belongs to.\r\n    const style = element.ownerDocument.defaultView.getComputedStyle(element);\r\n    return {\r\n        top: parseInt(style.borderTopWidth, 10),\r\n        right: parseInt(style.borderRightWidth, 10),\r\n        bottom: parseInt(style.borderBottomWidth, 10),\r\n        left: parseInt(style.borderLeftWidth, 10)\r\n    };\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/dom/rect\r\n */\r\nimport isRange from './isrange';\r\nimport isWindow from './iswindow';\r\nimport getBorderWidths from './getborderwidths';\r\nimport isText from './istext';\r\nconst rectProperties = ['top', 'right', 'bottom', 'left', 'width', 'height'];\r\n/**\r\n * A helper class representing a `ClientRect` object, e.g. value returned by\r\n * the native `object.getBoundingClientRect()` method. Provides a set of methods\r\n * to manipulate the rect and compare it against other rect instances.\r\n */\r\nexport default class Rect {\r\n    /**\r\n     * Creates an instance of rect.\r\n     *\r\n     * ```ts\r\n     * // Rect of an HTMLElement.\r\n     * const rectA = new Rect( document.body );\r\n     *\r\n     * // Rect of a DOM Range.\r\n     * const rectB = new Rect( document.getSelection().getRangeAt( 0 ) );\r\n     *\r\n     * // Rect of a window (web browser viewport).\r\n     * const rectC = new Rect( window );\r\n     *\r\n     * // Rect out of an object.\r\n     * const rectD = new Rect( { top: 0, right: 10, bottom: 10, left: 0, width: 10, height: 10 } );\r\n     *\r\n     * // Rect out of another Rect instance.\r\n     * const rectE = new Rect( rectD );\r\n     *\r\n     * // Rect out of a ClientRect.\r\n     * const rectF = new Rect( document.body.getClientRects().item( 0 ) );\r\n     * ```\r\n     *\r\n     * **Note**: By default a rect of an HTML element includes its CSS borders and scrollbars (if any)\r\n     * ant the rect of a `window` includes scrollbars too. Use {@link #excludeScrollbarsAndBorders}\r\n     * to get the inner part of the rect.\r\n     *\r\n     * @param source A source object to create the rect.\r\n     */\r\n    constructor(source) {\r\n        const isSourceRange = isRange(source);\r\n        Object.defineProperty(this, '_source', {\r\n            // If the source is a Rect instance, copy it's #_source.\r\n            value: source._source || source,\r\n            writable: true,\r\n            enumerable: false\r\n        });\r\n        if (isDomElement(source) || isSourceRange) {\r\n            // The `Rect` class depends on `getBoundingClientRect` and `getClientRects` DOM methods. If the source\r\n            // of a rect in an HTML element or a DOM range but it does not belong to any rendered DOM tree, these methods\r\n            // will fail to obtain the geometry and the rect instance makes little sense to the features using it.\r\n            // To get rid of this warning make sure the source passed to the constructor is a descendant of `window.document.body`.\r\n            // @if CK_DEBUG // const sourceNode = isSourceRange ? source.startContainer : source;\r\n            // @if CK_DEBUG // if ( !sourceNode.ownerDocument || !sourceNode.ownerDocument.body.contains( sourceNode ) ) {\r\n            // @if CK_DEBUG // \tconsole.warn(\r\n            // @if CK_DEBUG // \t\t'rect-source-not-in-dom: The source of this rect does not belong to any rendered DOM tree.',\r\n            // @if CK_DEBUG // \t\t{ source } );\r\n            // @if CK_DEBUG // }\r\n            if (isSourceRange) {\r\n                const rangeRects = Rect.getDomRangeRects(source);\r\n                copyRectProperties(this, Rect.getBoundingRect(rangeRects));\r\n            }\r\n            else {\r\n                copyRectProperties(this, source.getBoundingClientRect());\r\n            }\r\n        }\r\n        else if (isWindow(source)) {\r\n            const { innerWidth, innerHeight } = source;\r\n            copyRectProperties(this, {\r\n                top: 0,\r\n                right: innerWidth,\r\n                bottom: innerHeight,\r\n                left: 0,\r\n                width: innerWidth,\r\n                height: innerHeight\r\n            });\r\n        }\r\n        else {\r\n            copyRectProperties(this, source);\r\n        }\r\n    }\r\n    /**\r\n     * Returns a clone of the rect.\r\n     *\r\n     * @returns A cloned rect.\r\n     */\r\n    clone() {\r\n        return new Rect(this);\r\n    }\r\n    /**\r\n     * Moves the rect so that its upper–left corner lands in desired `[ x, y ]` location.\r\n     *\r\n     * @param x Desired horizontal location.\r\n     * @param y Desired vertical location.\r\n     * @returns A rect which has been moved.\r\n     */\r\n    moveTo(x, y) {\r\n        this.top = y;\r\n        this.right = x + this.width;\r\n        this.bottom = y + this.height;\r\n        this.left = x;\r\n        return this;\r\n    }\r\n    /**\r\n     * Moves the rect in–place by a dedicated offset.\r\n     *\r\n     * @param x A horizontal offset.\r\n     * @param y A vertical offset\r\n     * @returns A rect which has been moved.\r\n     */\r\n    moveBy(x, y) {\r\n        this.top += y;\r\n        this.right += x;\r\n        this.left += x;\r\n        this.bottom += y;\r\n        return this;\r\n    }\r\n    /**\r\n     * Returns a new rect a a result of intersection with another rect.\r\n     */\r\n    getIntersection(anotherRect) {\r\n        const rect = {\r\n            top: Math.max(this.top, anotherRect.top),\r\n            right: Math.min(this.right, anotherRect.right),\r\n            bottom: Math.min(this.bottom, anotherRect.bottom),\r\n            left: Math.max(this.left, anotherRect.left),\r\n            width: 0,\r\n            height: 0\r\n        };\r\n        rect.width = rect.right - rect.left;\r\n        rect.height = rect.bottom - rect.top;\r\n        if (rect.width < 0 || rect.height < 0) {\r\n            return null;\r\n        }\r\n        else {\r\n            return new Rect(rect);\r\n        }\r\n    }\r\n    /**\r\n     * Returns the area of intersection with another rect.\r\n     *\r\n     * @returns Area of intersection.\r\n     */\r\n    getIntersectionArea(anotherRect) {\r\n        const rect = this.getIntersection(anotherRect);\r\n        if (rect) {\r\n            return rect.getArea();\r\n        }\r\n        else {\r\n            return 0;\r\n        }\r\n    }\r\n    /**\r\n     * Returns the area of the rect.\r\n     */\r\n    getArea() {\r\n        return this.width * this.height;\r\n    }\r\n    /**\r\n     * Returns a new rect, a part of the original rect, which is actually visible to the user,\r\n     * e.g. an original rect cropped by parent element rects which have `overflow` set in CSS\r\n     * other than `\"visible\"`.\r\n     *\r\n     * If there's no such visible rect, which is when the rect is limited by one or many of\r\n     * the ancestors, `null` is returned.\r\n     *\r\n     * **Note**: This method does not consider the boundaries of the viewport (window).\r\n     * To get a rect cropped by all ancestors and the viewport, use an intersection such as:\r\n     *\r\n     * ```ts\r\n     * const visibleInViewportRect = new Rect( window ).getIntersection( new Rect( source ).getVisible() );\r\n     * ```\r\n     *\r\n     * @returns A visible rect instance or `null`, if there's none.\r\n     */\r\n    getVisible() {\r\n        const source = this._source;\r\n        let visibleRect = this.clone();\r\n        // There's no ancestor to crop <body> with the overflow.\r\n        if (isBody(source)) {\r\n            return visibleRect;\r\n        }\r\n        let child = source;\r\n        let parent = source.parentNode || source.commonAncestorContainer;\r\n        let absolutelyPositionedChildElement;\r\n        // Check the ancestors all the way up to the <body>.\r\n        while (parent && !isBody(parent)) {\r\n            if (child instanceof HTMLElement && getElementPosition(child) === 'absolute') {\r\n                absolutelyPositionedChildElement = child;\r\n            }\r\n            // The child will be cropped only if it has `position: absolute` and the parent has `position: relative` + some overflow.\r\n            // Otherwise there's no chance of visual clipping and the parent can be skipped\r\n            // https://github.com/ckeditor/ckeditor5/issues/14107.\r\n            if (absolutelyPositionedChildElement &&\r\n                (getElementPosition(parent) !== 'relative' || getElementOverflow(parent) === 'visible')) {\r\n                child = parent;\r\n                parent = parent.parentNode;\r\n                continue;\r\n            }\r\n            const parentRect = new Rect(parent);\r\n            const intersectionRect = visibleRect.getIntersection(parentRect);\r\n            if (intersectionRect) {\r\n                if (intersectionRect.getArea() < visibleRect.getArea()) {\r\n                    // Reduce the visible rect to the intersection.\r\n                    visibleRect = intersectionRect;\r\n                }\r\n            }\r\n            else {\r\n                // There's no intersection, the rect is completely invisible.\r\n                return null;\r\n            }\r\n            child = parent;\r\n            parent = parent.parentNode;\r\n        }\r\n        return visibleRect;\r\n    }\r\n    /**\r\n     * Checks if all property values ({@link #top}, {@link #left}, {@link #right},\r\n     * {@link #bottom}, {@link #width} and {@link #height}) are the equal in both rect\r\n     * instances.\r\n     *\r\n     * @param anotherRect A rect instance to compare with.\r\n     * @returns `true` when Rects are equal. `false` otherwise.\r\n     */\r\n    isEqual(anotherRect) {\r\n        for (const prop of rectProperties) {\r\n            if (this[prop] !== anotherRect[prop]) {\r\n                return false;\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n    /**\r\n     * Checks whether a rect fully contains another rect instance.\r\n     *\r\n     * @param anotherRect\r\n     * @returns `true` if contains, `false` otherwise.\r\n     */\r\n    contains(anotherRect) {\r\n        const intersectRect = this.getIntersection(anotherRect);\r\n        return !!(intersectRect && intersectRect.isEqual(anotherRect));\r\n    }\r\n    /**\r\n     * Excludes scrollbars and CSS borders from the rect.\r\n     *\r\n     * * Borders are removed when {@link #_source} is an HTML element.\r\n     * * Scrollbars are excluded from HTML elements and the `window`.\r\n     *\r\n     * @returns A rect which has been updated.\r\n     */\r\n    excludeScrollbarsAndBorders() {\r\n        const source = this._source;\r\n        let scrollBarWidth, scrollBarHeight, direction;\r\n        if (isWindow(source)) {\r\n            scrollBarWidth = source.innerWidth - source.document.documentElement.clientWidth;\r\n            scrollBarHeight = source.innerHeight - source.document.documentElement.clientHeight;\r\n            direction = source.getComputedStyle(source.document.documentElement).direction;\r\n        }\r\n        else {\r\n            const borderWidths = getBorderWidths(source);\r\n            scrollBarWidth = source.offsetWidth - source.clientWidth - borderWidths.left - borderWidths.right;\r\n            scrollBarHeight = source.offsetHeight - source.clientHeight - borderWidths.top - borderWidths.bottom;\r\n            direction = source.ownerDocument.defaultView.getComputedStyle(source).direction;\r\n            this.left += borderWidths.left;\r\n            this.top += borderWidths.top;\r\n            this.right -= borderWidths.right;\r\n            this.bottom -= borderWidths.bottom;\r\n            this.width = this.right - this.left;\r\n            this.height = this.bottom - this.top;\r\n        }\r\n        this.width -= scrollBarWidth;\r\n        if (direction === 'ltr') {\r\n            this.right -= scrollBarWidth;\r\n        }\r\n        else {\r\n            this.left += scrollBarWidth;\r\n        }\r\n        this.height -= scrollBarHeight;\r\n        this.bottom -= scrollBarHeight;\r\n        return this;\r\n    }\r\n    /**\r\n     * Returns an array of rects of the given native DOM Range.\r\n     *\r\n     * @param range A native DOM range.\r\n     * @returns DOM Range rects.\r\n     */\r\n    static getDomRangeRects(range) {\r\n        const rects = [];\r\n        // Safari does not iterate over ClientRectList using for...of loop.\r\n        const clientRects = Array.from(range.getClientRects());\r\n        if (clientRects.length) {\r\n            for (const rect of clientRects) {\r\n                rects.push(new Rect(rect));\r\n            }\r\n        }\r\n        // If there's no client rects for the Range, use parent container's bounding rect\r\n        // instead and adjust rect's width to simulate the actual geometry of such range.\r\n        // https://github.com/ckeditor/ckeditor5-utils/issues/153\r\n        // https://github.com/ckeditor/ckeditor5-ui/issues/317\r\n        else {\r\n            let startContainer = range.startContainer;\r\n            if (isText(startContainer)) {\r\n                startContainer = startContainer.parentNode;\r\n            }\r\n            const rect = new Rect(startContainer.getBoundingClientRect());\r\n            rect.right = rect.left;\r\n            rect.width = 0;\r\n            rects.push(rect);\r\n        }\r\n        return rects;\r\n    }\r\n    /**\r\n     * Returns a bounding rectangle that contains all the given `rects`.\r\n     *\r\n     * @param rects A list of rectangles that should be contained in the result rectangle.\r\n     * @returns Bounding rectangle or `null` if no `rects` were given.\r\n     */\r\n    static getBoundingRect(rects) {\r\n        const boundingRectData = {\r\n            left: Number.POSITIVE_INFINITY,\r\n            top: Number.POSITIVE_INFINITY,\r\n            right: Number.NEGATIVE_INFINITY,\r\n            bottom: Number.NEGATIVE_INFINITY,\r\n            width: 0,\r\n            height: 0\r\n        };\r\n        let rectangleCount = 0;\r\n        for (const rect of rects) {\r\n            rectangleCount++;\r\n            boundingRectData.left = Math.min(boundingRectData.left, rect.left);\r\n            boundingRectData.top = Math.min(boundingRectData.top, rect.top);\r\n            boundingRectData.right = Math.max(boundingRectData.right, rect.right);\r\n            boundingRectData.bottom = Math.max(boundingRectData.bottom, rect.bottom);\r\n        }\r\n        if (rectangleCount == 0) {\r\n            return null;\r\n        }\r\n        boundingRectData.width = boundingRectData.right - boundingRectData.left;\r\n        boundingRectData.height = boundingRectData.bottom - boundingRectData.top;\r\n        return new Rect(boundingRectData);\r\n    }\r\n}\r\n/**\r\n * Acquires all the rect properties from the passed source.\r\n */\r\nfunction copyRectProperties(rect, source) {\r\n    for (const p of rectProperties) {\r\n        rect[p] = source[p];\r\n    }\r\n}\r\n/**\r\n * Checks if provided object is a <body> HTML element.\r\n */\r\nfunction isBody(value) {\r\n    if (!isDomElement(value)) {\r\n        return false;\r\n    }\r\n    return value === value.ownerDocument.body;\r\n}\r\n/**\r\n * Checks if provided object \"looks like\" a DOM Element and has API required by `Rect` class.\r\n */\r\nfunction isDomElement(value) {\r\n    // Note: earlier we used `isElement()` from lodash library, however that function is less performant because\r\n    // it makes complicated checks to make sure that given value is a DOM element.\r\n    return value !== null && typeof value === 'object' && value.nodeType === 1 && typeof value.getBoundingClientRect === 'function';\r\n}\r\n/**\r\n * Returns the value of the `position` style of an `HTMLElement`.\r\n */\r\nfunction getElementPosition(element) {\r\n    return element.ownerDocument.defaultView.getComputedStyle(element).position;\r\n}\r\n/**\r\n * Returns the value of the `overflow` style of an `HTMLElement`.\r\n */\r\nfunction getElementOverflow(element) {\r\n    return element.ownerDocument.defaultView.getComputedStyle(element).overflow;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/dom/resizeobserver\r\n */\r\nimport global from './global';\r\n/**\r\n * A helper class which instances allow performing custom actions when native DOM elements are resized.\r\n *\r\n * ```ts\r\n * const editableElement = editor.editing.view.getDomRoot();\r\n *\r\n * const observer = new ResizeObserver( editableElement, entry => {\r\n * \tconsole.log( 'The editable element has been resized in DOM.' );\r\n * \tconsole.log( entry.target ); // -> editableElement\r\n * \tconsole.log( entry.contentRect.width ); // -> e.g. '423px'\r\n * } );\r\n * ```\r\n *\r\n * It uses the [native DOM resize observer](https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver)\r\n * under the hood.\r\n */\r\nexport default class ResizeObserver {\r\n    /**\r\n     * Creates an instance of the `ResizeObserver` class.\r\n     *\r\n     * @param element A DOM element that is to be observed for resizing. Note that\r\n     * the element must be visible (i.e. not detached from DOM) for the observer to work.\r\n     * @param callback A function called when the observed element was resized. It passes\r\n     * the [`ResizeObserverEntry`](https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserverEntry)\r\n     * object with information about the resize event.\r\n     */\r\n    constructor(element, callback) {\r\n        // **Note**: For the maximum performance, this class ensures only a single instance of the native\r\n        // observer is used no matter how many instances of this class were created.\r\n        if (!ResizeObserver._observerInstance) {\r\n            ResizeObserver._createObserver();\r\n        }\r\n        this._element = element;\r\n        this._callback = callback;\r\n        ResizeObserver._addElementCallback(element, callback);\r\n        ResizeObserver._observerInstance.observe(element);\r\n    }\r\n    /**\r\n     * The element observed by this observer.\r\n     */\r\n    get element() {\r\n        return this._element;\r\n    }\r\n    /**\r\n     * Destroys the observer which disables the `callback` passed to the {@link #constructor}.\r\n     */\r\n    destroy() {\r\n        ResizeObserver._deleteElementCallback(this._element, this._callback);\r\n    }\r\n    /**\r\n     * Registers a new resize callback for the DOM element.\r\n     */\r\n    static _addElementCallback(element, callback) {\r\n        if (!ResizeObserver._elementCallbacks) {\r\n            ResizeObserver._elementCallbacks = new Map();\r\n        }\r\n        let callbacks = ResizeObserver._elementCallbacks.get(element);\r\n        if (!callbacks) {\r\n            callbacks = new Set();\r\n            ResizeObserver._elementCallbacks.set(element, callbacks);\r\n        }\r\n        callbacks.add(callback);\r\n    }\r\n    /**\r\n     * Removes a resize callback from the DOM element. If no callbacks are left\r\n     * for the element, it removes the element from the native observer.\r\n     */\r\n    static _deleteElementCallback(element, callback) {\r\n        const callbacks = ResizeObserver._getElementCallbacks(element);\r\n        // Remove the element callback. Check if exist first in case someone\r\n        // called destroy() twice.\r\n        if (callbacks) {\r\n            callbacks.delete(callback);\r\n            // If no callbacks left for the element, also remove the element.\r\n            if (!callbacks.size) {\r\n                ResizeObserver._elementCallbacks.delete(element);\r\n                ResizeObserver._observerInstance.unobserve(element);\r\n            }\r\n        }\r\n        if (ResizeObserver._elementCallbacks && !ResizeObserver._elementCallbacks.size) {\r\n            ResizeObserver._observerInstance = null;\r\n            ResizeObserver._elementCallbacks = null;\r\n        }\r\n    }\r\n    /**\r\n     * Returns are registered resize callbacks for the DOM element.\r\n     */\r\n    static _getElementCallbacks(element) {\r\n        if (!ResizeObserver._elementCallbacks) {\r\n            return null;\r\n        }\r\n        return ResizeObserver._elementCallbacks.get(element);\r\n    }\r\n    /**\r\n     * Creates the single native observer shared across all `ResizeObserver` instances.\r\n     */\r\n    static _createObserver() {\r\n        ResizeObserver._observerInstance = new global.window.ResizeObserver(entries => {\r\n            for (const entry of entries) {\r\n                const callbacks = ResizeObserver._getElementCallbacks(entry.target);\r\n                if (callbacks) {\r\n                    for (const callback of callbacks) {\r\n                        callback(entry);\r\n                    }\r\n                }\r\n            }\r\n        });\r\n    }\r\n}\r\n/**\r\n * The single native observer instance shared across all {@link module:utils/dom/resizeobserver~ResizeObserver} instances.\r\n */\r\nResizeObserver._observerInstance = null;\r\n/**\r\n * A mapping of native DOM elements and their callbacks shared across all\r\n * {@link module:utils/dom/resizeobserver~ResizeObserver} instances.\r\n */\r\nResizeObserver._elementCallbacks = null;\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/dom/setdatainelement\r\n */\r\n/* globals HTMLTextAreaElement */\r\n/**\r\n * Sets data in a given element.\r\n *\r\n * @param el The element in which the data will be set.\r\n * @param data The data string.\r\n */\r\nexport default function setDataInElement(el, data) {\r\n    if (el instanceof HTMLTextAreaElement) {\r\n        el.value = data;\r\n    }\r\n    el.innerHTML = data;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/dom/tounit\r\n */\r\n/**\r\n * Returns a helper function, which adds a desired trailing\r\n * `unit` to the passed value.\r\n *\r\n * @param unit An unit like \"px\" or \"em\".\r\n */\r\nexport default function toUnit(unit) {\r\n    return value => value + unit;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/dom/indexof\r\n */\r\n/**\r\n * Returns index of the node in the parent element.\r\n *\r\n * @param node Node which index is tested.\r\n * @returns Index of the node in the parent element. Returns 0 if node has no parent.\r\n */\r\nexport default function indexOf(node) {\r\n    let index = 0;\r\n    while (node.previousSibling) {\r\n        node = node.previousSibling;\r\n        index++;\r\n    }\r\n    return index;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/dom/insertat\r\n */\r\n/**\r\n * Inserts node to the parent at given index.\r\n *\r\n * @param parentElement Parent element.\r\n * @param index Insertions index.\r\n * @param nodeToInsert Node to insert.\r\n */\r\nexport default function insertAt(parentElement, index, nodeToInsert) {\r\n    parentElement.insertBefore(nodeToInsert, parentElement.childNodes[index] || null);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/* globals Node */\r\n/**\r\n * @module utils/dom/iscomment\r\n */\r\n/**\r\n * Checks whether the object is a native DOM Comment node.\r\n */\r\nexport default function isComment(obj) {\r\n    return obj && obj.nodeType === Node.COMMENT_NODE;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/dom/isvisible\r\n */\r\n/**\r\n * Checks whether the element is visible to the user in DOM:\r\n *\r\n * * connected to the root of the document,\r\n * * has no `display: none`,\r\n * * has no ancestors with `display: none`.\r\n *\r\n * **Note**: This helper does not check whether the element is hidden by cropping, overflow, etc..\r\n * To check that, use {@link module:utils/dom/rect~Rect} instead.\r\n */\r\nexport default function isVisible(element) {\r\n    return !!(element && element.getClientRects && element.getClientRects().length);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/dom/position\r\n */\r\nimport global from './global';\r\nimport Rect from './rect';\r\nimport getPositionedAncestor from './getpositionedancestor';\r\nimport getBorderWidths from './getborderwidths';\r\nimport { isFunction } from 'lodash-es';\r\n// @if CK_DEBUG_POSITION // const RectDrawer = require( '@ckeditor/ckeditor5-utils/tests/_utils/rectdrawer' ).default\r\n/**\r\n * Calculates the `position: absolute` coordinates of a given element so it can be positioned with respect to the\r\n * target in the visually most efficient way, taking various restrictions like viewport or limiter geometry\r\n * into consideration.\r\n *\r\n * ```ts\r\n * // The element which is to be positioned.\r\n * const element = document.body.querySelector( '#toolbar' );\r\n *\r\n * // A target to which the element is positioned relatively.\r\n * const target = document.body.querySelector( '#container' );\r\n *\r\n * // Finding the optimal coordinates for the positioning.\r\n * const { left, top, name } = getOptimalPosition( {\r\n * \telement: element,\r\n * \ttarget: target,\r\n *\r\n * \t// The algorithm will chose among these positions to meet the requirements such\r\n * \t// as \"limiter\" element or \"fitInViewport\", set below. The positions are considered\r\n * \t// in the order of the array.\r\n * \tpositions: [\r\n * \t\t//\r\n * \t \t//\t[ Target ]\r\n * \t\t//\t+-----------------+\r\n * \t\t//\t|     Element     |\r\n * \t\t//\t+-----------------+\r\n * \t\t//\r\n * \t\ttargetRect => ( {\r\n * \t\t\ttop: targetRect.bottom,\r\n * \t\t\tleft: targetRect.left,\r\n * \t\t\tname: 'mySouthEastPosition'\r\n * \t\t} ),\r\n *\r\n * \t\t//\r\n * \t\t//\t+-----------------+\r\n * \t\t//\t|     Element     |\r\n * \t\t//\t+-----------------+\r\n * \t\t//\t[ Target ]\r\n * \t\t//\r\n * \t\t( targetRect, elementRect ) => ( {\r\n * \t\t\ttop: targetRect.top - elementRect.height,\r\n * \t\t\tleft: targetRect.left,\r\n * \t\t\tname: 'myNorthEastPosition'\r\n * \t\t} )\r\n * \t],\r\n *\r\n * \t// Find a position such guarantees the element remains within visible boundaries of <body>.\r\n * \tlimiter: document.body,\r\n *\r\n * \t// Find a position such guarantees the element remains within visible boundaries of the browser viewport.\r\n * \tfitInViewport: true\r\n * } );\r\n *\r\n * // The best position which fits into document.body and the viewport. May be useful\r\n * // to set proper class on the `element`.\r\n * console.log( name ); // -> \"myNorthEastPosition\"\r\n *\r\n * // Using the absolute coordinates which has been found to position the element\r\n * // as in the diagram depicting the \"myNorthEastPosition\" position.\r\n * element.style.top = top;\r\n * element.style.left = left;\r\n * ```\r\n *\r\n * @param options The input data and configuration of the helper.\r\n */\r\nexport function getOptimalPosition({ element, target, positions, limiter, fitInViewport, viewportOffsetConfig }) {\r\n    // If the {@link module:utils/dom/position~Options#target} is a function, use what it returns.\r\n    // https://github.com/ckeditor/ckeditor5-utils/issues/157\r\n    if (isFunction(target)) {\r\n        target = target();\r\n    }\r\n    // If the {@link module:utils/dom/position~Options#limiter} is a function, use what it returns.\r\n    // https://github.com/ckeditor/ckeditor5-ui/issues/260\r\n    if (isFunction(limiter)) {\r\n        limiter = limiter();\r\n    }\r\n    const positionedElementAncestor = getPositionedAncestor(element);\r\n    const elementRect = new Rect(element);\r\n    const targetRect = new Rect(target);\r\n    let bestPosition;\r\n    // @if CK_DEBUG_POSITION // RectDrawer.clear();\r\n    // @if CK_DEBUG_POSITION // RectDrawer.draw( targetRect, { outlineWidth: '5px' }, 'Target' );\r\n    const viewportRect = fitInViewport && getConstrainedViewportRect(viewportOffsetConfig) || null;\r\n    const positionOptions = { targetRect, elementRect, positionedElementAncestor, viewportRect };\r\n    // If there are no limits, just grab the very first position and be done with that drama.\r\n    if (!limiter && !fitInViewport) {\r\n        bestPosition = new PositionObject(positions[0], positionOptions);\r\n    }\r\n    else {\r\n        const limiterRect = limiter && new Rect(limiter).getVisible();\r\n        // @if CK_DEBUG_POSITION // if ( viewportRect ) {\r\n        // @if CK_DEBUG_POSITION //\t\tRectDrawer.draw( viewportRect, { outlineWidth: '5px' }, 'Viewport' );\r\n        // @if CK_DEBUG_POSITION // }\r\n        // @if CK_DEBUG_POSITION // if ( limiter ) {\r\n        // @if CK_DEBUG_POSITION // \tRectDrawer.draw( limiterRect, { outlineWidth: '5px', outlineColor: 'green' }, 'Visible limiter' );\r\n        // @if CK_DEBUG_POSITION // }\r\n        Object.assign(positionOptions, { limiterRect, viewportRect });\r\n        // If there's no best position found, i.e. when all intersections have no area because\r\n        // rects have no width or height, then just use the first available position.\r\n        bestPosition = getBestPosition(positions, positionOptions) || new PositionObject(positions[0], positionOptions);\r\n    }\r\n    return bestPosition;\r\n}\r\n/**\r\n * Returns a viewport `Rect` shrunk by the viewport offset config from all sides.\r\n */\r\nfunction getConstrainedViewportRect(viewportOffsetConfig) {\r\n    viewportOffsetConfig = Object.assign({ top: 0, bottom: 0, left: 0, right: 0 }, viewportOffsetConfig);\r\n    const viewportRect = new Rect(global.window);\r\n    viewportRect.top += viewportOffsetConfig.top;\r\n    viewportRect.height -= viewportOffsetConfig.top;\r\n    viewportRect.bottom -= viewportOffsetConfig.bottom;\r\n    viewportRect.height -= viewportOffsetConfig.bottom;\r\n    return viewportRect;\r\n}\r\n/**\r\n * For a given array of positioning functions, returns such that provides the best\r\n * fit of the `elementRect` into the `limiterRect` and `viewportRect`.\r\n */\r\nfunction getBestPosition(positions, options) {\r\n    const { elementRect } = options;\r\n    // This is when element is fully visible.\r\n    const elementRectArea = elementRect.getArea();\r\n    const positionInstances = positions\r\n        .map(positioningFunction => new PositionObject(positioningFunction, options))\r\n        // Some positioning functions may return `null` if they don't want to participate.\r\n        .filter(position => !!position.name);\r\n    let maxFitFactor = 0;\r\n    let bestPosition = null;\r\n    for (const position of positionInstances) {\r\n        const { limiterIntersectionArea, viewportIntersectionArea } = position;\r\n        // If a such position is found that element is fully contained by the limiter then, obviously,\r\n        // there will be no better one, so finishing.\r\n        if (limiterIntersectionArea === elementRectArea) {\r\n            return position;\r\n        }\r\n        // To maximize both viewport and limiter intersection areas we use distance on _viewportIntersectionArea\r\n        // and _limiterIntersectionArea plane (without sqrt because we are looking for max value).\r\n        const fitFactor = viewportIntersectionArea ** 2 + limiterIntersectionArea ** 2;\r\n        if (fitFactor > maxFitFactor) {\r\n            maxFitFactor = fitFactor;\r\n            bestPosition = position;\r\n        }\r\n    }\r\n    return bestPosition;\r\n}\r\n/**\r\n * For a given absolute Rect coordinates object and a positioned element ancestor, it updates its\r\n * coordinates that make up for the position and the scroll of the ancestor.\r\n *\r\n * This is necessary because while Rects (and DOMRects) are relative to the browser's viewport, their coordinates\r\n * are used in real–life to position elements with `position: absolute`, which are scoped by any positioned\r\n * (and scrollable) ancestors.\r\n */\r\nfunction shiftRectToCompensatePositionedAncestor(rect, positionedElementAncestor) {\r\n    const ancestorPosition = getRectForAbsolutePositioning(new Rect(positionedElementAncestor));\r\n    const ancestorBorderWidths = getBorderWidths(positionedElementAncestor);\r\n    let moveX = 0;\r\n    let moveY = 0;\r\n    // (https://github.com/ckeditor/ckeditor5-ui-default/issues/126)\r\n    // If there's some positioned ancestor of the panel, then its `Rect` must be taken into\r\n    // consideration. `Rect` is always relative to the viewport while `position: absolute` works\r\n    // with respect to that positioned ancestor.\r\n    moveX -= ancestorPosition.left;\r\n    moveY -= ancestorPosition.top;\r\n    // (https://github.com/ckeditor/ckeditor5-utils/issues/139)\r\n    // If there's some positioned ancestor of the panel, not only its position must be taken into\r\n    // consideration (see above) but also its internal scrolls. Scroll have an impact here because `Rect`\r\n    // is relative to the viewport (it doesn't care about scrolling), while `position: absolute`\r\n    // must compensate that scrolling.\r\n    moveX += positionedElementAncestor.scrollLeft;\r\n    moveY += positionedElementAncestor.scrollTop;\r\n    // (https://github.com/ckeditor/ckeditor5-utils/issues/139)\r\n    // If there's some positioned ancestor of the panel, then its `Rect` includes its CSS `borderWidth`\r\n    // while `position: absolute` positioning does not consider it.\r\n    // E.g. `{ position: absolute, top: 0, left: 0 }` means upper left corner of the element,\r\n    // not upper-left corner of its border.\r\n    moveX -= ancestorBorderWidths.left;\r\n    moveY -= ancestorBorderWidths.top;\r\n    rect.moveBy(moveX, moveY);\r\n}\r\n/**\r\n * DOMRect (also Rect) works in a scroll–independent geometry but `position: absolute` doesn't.\r\n * This function converts Rect to `position: absolute` coordinates.\r\n */\r\nfunction getRectForAbsolutePositioning(rect) {\r\n    const { scrollX, scrollY } = global.window;\r\n    return rect.clone().moveBy(scrollX, scrollY);\r\n}\r\n/**\r\n * A position class which instances are created and used by the {@link module:utils/dom/position~getOptimalPosition} helper.\r\n *\r\n * {@link module:utils/dom/position~Position#top} and {@link module:utils/dom/position~Position#left} properties of the position instance\r\n * translate directly to the `top` and `left` properties in CSS \"`position: absolute` coordinate system\". If set on the positioned element\r\n * in DOM, they will make it display it in the right place in the viewport.\r\n */\r\nclass PositionObject {\r\n    /**\r\n     * Creates an instance of the {@link module:utils/dom/position~PositionObject} class.\r\n     *\r\n     * @param positioningFunction function The function that defines the expected\r\n     * coordinates the positioned element should move to.\r\n     * @param options options object.\r\n     * @param options.elementRect The positioned element rect.\r\n     * @param options.targetRect The target element rect.\r\n     * @param options.viewportRect The viewport rect.\r\n     * @param options.limiterRect The limiter rect.\r\n     * @param options.positionedElementAncestor Nearest element ancestor element which CSS position is not \"static\".\r\n     */\r\n    constructor(positioningFunction, options) {\r\n        const positioningFunctionOutput = positioningFunction(options.targetRect, options.elementRect, options.viewportRect);\r\n        // Nameless position for a function that didn't participate.\r\n        if (!positioningFunctionOutput) {\r\n            return;\r\n        }\r\n        const { left, top, name, config } = positioningFunctionOutput;\r\n        this.name = name;\r\n        this.config = config;\r\n        this._positioningFunctionCorrdinates = { left, top };\r\n        this._options = options;\r\n    }\r\n    /**\r\n     * The left value in pixels in the CSS `position: absolute` coordinate system.\r\n     * Set it on the positioned element in DOM to move it to the position.\r\n     */\r\n    get left() {\r\n        return this._absoluteRect.left;\r\n    }\r\n    /**\r\n     * The top value in pixels in the CSS `position: absolute` coordinate system.\r\n     * Set it on the positioned element in DOM to move it to the position.\r\n     */\r\n    get top() {\r\n        return this._absoluteRect.top;\r\n    }\r\n    /**\r\n     * An intersection area between positioned element and limiter within viewport constraints.\r\n     */\r\n    get limiterIntersectionArea() {\r\n        const limiterRect = this._options.limiterRect;\r\n        if (limiterRect) {\r\n            const viewportRect = this._options.viewportRect;\r\n            if (viewportRect) {\r\n                // Consider only the part of the limiter which is visible in the viewport. So the limiter is getting limited.\r\n                const limiterViewportIntersectRect = limiterRect.getIntersection(viewportRect);\r\n                if (limiterViewportIntersectRect) {\r\n                    // If the limiter is within the viewport, then check the intersection between that part of the\r\n                    // limiter and actual position.\r\n                    return limiterViewportIntersectRect.getIntersectionArea(this._rect);\r\n                }\r\n            }\r\n            else {\r\n                return limiterRect.getIntersectionArea(this._rect);\r\n            }\r\n        }\r\n        return 0;\r\n    }\r\n    /**\r\n     * An intersection area between positioned element and viewport.\r\n     */\r\n    get viewportIntersectionArea() {\r\n        const viewportRect = this._options.viewportRect;\r\n        if (viewportRect) {\r\n            return viewportRect.getIntersectionArea(this._rect);\r\n        }\r\n        return 0;\r\n    }\r\n    /**\r\n     * An already positioned element rect. A clone of the element rect passed to the constructor\r\n     * but placed in the viewport according to the positioning function.\r\n     */\r\n    get _rect() {\r\n        if (this._cachedRect) {\r\n            return this._cachedRect;\r\n        }\r\n        this._cachedRect = this._options.elementRect.clone().moveTo(this._positioningFunctionCorrdinates.left, this._positioningFunctionCorrdinates.top);\r\n        return this._cachedRect;\r\n    }\r\n    /**\r\n     * An already absolutely positioned element rect. See ({@link #_rect}).\r\n     */\r\n    get _absoluteRect() {\r\n        if (this._cachedAbsoluteRect) {\r\n            return this._cachedAbsoluteRect;\r\n        }\r\n        this._cachedAbsoluteRect = getRectForAbsolutePositioning(this._rect);\r\n        if (this._options.positionedElementAncestor) {\r\n            shiftRectToCompensatePositionedAncestor(this._cachedAbsoluteRect, this._options.positionedElementAncestor);\r\n        }\r\n        return this._cachedAbsoluteRect;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/dom/getpositionedancestor\r\n */\r\nimport global from './global';\r\n/**\r\n * For a given element, returns the nearest ancestor element which CSS position is not \"static\".\r\n *\r\n * @param element The native DOM element to be checked.\r\n */\r\nexport default function getPositionedAncestor(element) {\r\n    if (!element || !element.parentNode) {\r\n        return null;\r\n    }\r\n    if (element.offsetParent === global.document.body) {\r\n        return null;\r\n    }\r\n    return element.offsetParent;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/dom/remove\r\n */\r\n/**\r\n * Removes given node from parent.\r\n *\r\n * @param node Node to remove.\r\n */\r\nexport default function remove(node) {\r\n    const parent = node.parentNode;\r\n    if (parent) {\r\n        parent.removeChild(node);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/dom/scroll\r\n */\r\nimport isRange from './isrange';\r\nimport Rect from './rect';\r\nimport isText from './istext';\r\n/**\r\n * Makes any page `HTMLElement` or `Range` (`target`) visible inside the browser viewport.\r\n * This helper will scroll all `target` ancestors and the web browser viewport to reveal the target to\r\n * the user. If the `target` is already visible, nothing will happen.\r\n *\r\n * @param options Additional configuration of the scrolling behavior.\r\n * @param options.target A target, which supposed to become visible to the user.\r\n * @param options.viewportOffset An offset from the edge of the viewport (in pixels)\r\n * the `target` will be moved by if the viewport is scrolled. It enhances the user experience\r\n * by keeping the `target` some distance from the edge of the viewport and thus making it easier to\r\n * read or edit by the user.\r\n * @param options.ancestorOffset An offset from the boundary of scrollable ancestors (if any)\r\n * the `target` will be moved by if the viewport is scrolled. It enhances the user experience\r\n * by keeping the `target` some distance from the edge of the ancestors and thus making it easier to\r\n * read or edit by the user.\r\n * @param options.alignToTop When set `true`, the helper will make sure the `target` is scrolled up\r\n * to the top boundary of the viewport and/or scrollable ancestors if scrolled up. When not set\r\n * (default), the `target` will be revealed by scrolling as little as possible. This option will\r\n * not affect `targets` that must be scrolled down because they will appear at the top of the boundary\r\n * anyway.\r\n *\r\n * ```\r\n *                                             scrollViewportToShowTarget() with            scrollViewportToShowTarget() with\r\n *          Initial state                        alignToTop unset (default)                        alignToTop = true\r\n *\r\n * ┌────────────────────────────────┬─┐       ┌────────────────────────────────┬─┐        ┌────────────────────────────────┬─┐\r\n * │                                │▲│       │                                │▲│        │   [ Target to be revealed ]    │▲│\r\n * │                                │ │       │                                │ │        │                                │ │\r\n * │                                │█│       │                                │ │        │                                │ │\r\n * │                                │█│       │                                │ │        │                                │ │\r\n * │                                │ │       │                                │█│        │                                │ │\r\n * │                                │ │       │                                │█│        │                                │█│\r\n * │                                │ │       │                                │ │        │                                │█│\r\n * │                                │▼│       │   [ Target to be revealed ]    │▼│        │                                │▼│\r\n * └────────────────────────────────┴─┘       └────────────────────────────────┴─┘        └────────────────────────────────┴─┘\r\n *\r\n *\r\n *     [ Target to be revealed ]\r\n *```\r\n *\r\n * @param options.forceScroll When set `true`, the `target` will be aligned to the top of the viewport\r\n * and scrollable ancestors whether it is already visible or not. This option will only work when `alignToTop`\r\n * is `true`\r\n */\r\nexport function scrollViewportToShowTarget({ target, viewportOffset = 0, ancestorOffset = 0, alignToTop, forceScroll }) {\r\n    const targetWindow = getWindow(target);\r\n    let currentWindow = targetWindow;\r\n    let currentFrame = null;\r\n    viewportOffset = normalizeViewportOffset(viewportOffset);\r\n    // Iterate over all windows, starting from target's parent window up to window#top.\r\n    while (currentWindow) {\r\n        let firstAncestorToScroll;\r\n        // Let's scroll target's ancestors first to reveal it. Then, once the ancestor scrolls\r\n        // settled down, the algorithm can eventually scroll the viewport of the current window.\r\n        //\r\n        // Note: If the current window is target's **original** window (e.g. the first one),\r\n        // start scrolling the closest parent of the target. If not, scroll the closest parent\r\n        // of an iframe that resides in the current window.\r\n        if (currentWindow == targetWindow) {\r\n            firstAncestorToScroll = getParentElement(target);\r\n        }\r\n        else {\r\n            firstAncestorToScroll = getParentElement(currentFrame);\r\n        }\r\n        // Scroll the target's ancestors first. Once done, scrolling the viewport is easy.\r\n        scrollAncestorsToShowRect({\r\n            parent: firstAncestorToScroll,\r\n            getRect: () => {\r\n                // Note: If the target does not belong to the current window **directly**,\r\n                // i.e. it resides in an iframe belonging to the window, obtain the target's rect\r\n                // in the coordinates of the current window. By default, a Rect returns geometry\r\n                // relative to the current window's viewport. To make it work in a parent window,\r\n                // it must be shifted.\r\n                return getRectRelativeToWindow(target, currentWindow);\r\n            },\r\n            alignToTop,\r\n            ancestorOffset,\r\n            forceScroll\r\n        });\r\n        // Obtain the rect of the target after it has been scrolled within its ancestors.\r\n        // It's time to scroll the viewport.\r\n        const targetRect = getRectRelativeToWindow(target, currentWindow);\r\n        scrollWindowToShowRect({\r\n            window: currentWindow,\r\n            rect: targetRect,\r\n            viewportOffset,\r\n            alignToTop,\r\n            forceScroll\r\n        });\r\n        if (currentWindow.parent != currentWindow) {\r\n            // Keep the reference to the <iframe> element the \"previous current window\" was\r\n            // rendered within. It will be useful to re–calculate the rect of the target\r\n            // in the parent window's relative geometry. The target's rect must be shifted\r\n            // by it's iframe's position.\r\n            currentFrame = currentWindow.frameElement;\r\n            currentWindow = currentWindow.parent;\r\n            // If the current window has some parent but frameElement is inaccessible, then they have\r\n            // different domains/ports and, due to security reasons, accessing and scrolling\r\n            // the parent window won't be possible.\r\n            // See https://github.com/ckeditor/ckeditor5/issues/930.\r\n            if (!currentFrame) {\r\n                return;\r\n            }\r\n        }\r\n        else {\r\n            currentWindow = null;\r\n        }\r\n    }\r\n}\r\n/**\r\n * Makes any page `HTMLElement` or `Range` (target) visible within its scrollable ancestors,\r\n * e.g. if they have `overflow: scroll` CSS style.\r\n *\r\n * @param target A target, which supposed to become visible to the user.\r\n * @param ancestorOffset An offset between the target and the boundary of scrollable ancestors\r\n * to be maintained while scrolling.\r\n */\r\nexport function scrollAncestorsToShowTarget(target, ancestorOffset) {\r\n    const targetParent = getParentElement(target);\r\n    scrollAncestorsToShowRect({\r\n        parent: targetParent,\r\n        getRect: () => new Rect(target),\r\n        ancestorOffset\r\n    });\r\n}\r\n/**\r\n * Makes a given rect visible within its parent window.\r\n *\r\n * Note: Avoid the situation where the caret is still in the viewport, but totally\r\n * at the edge of it. In such situation, if it moved beyond the viewport in the next\r\n * action e.g. after paste, the scrolling would move it to the viewportOffset level\r\n * and it all would look like the caret visually moved up/down:\r\n *\r\n * 1.\r\n * ```\r\n * | foo[]\r\n * |                                    <--- N px of space below the caret\r\n * +---------------------------------...\r\n * ```\r\n *\r\n * 2. *paste*\r\n * 3.\r\n * ```\r\n * |\r\n * |\r\n * +-foo-----------------------------...\r\n *   bar[]                              <--- caret below viewport, scrolling...\r\n * ```\r\n *\r\n * 4. *scrolling*\r\n * 5.\r\n * ```\r\n * |\r\n * | foo\r\n * | bar[]                              <--- caret precisely at the edge\r\n * +---------------------------------...\r\n * ```\r\n *\r\n * To prevent this, this method checks the rects moved by the viewportOffset to cover\r\n * the upper/lower edge of the viewport. It makes sure if the action repeats, there's\r\n * no twitching – it's a purely visual improvement:\r\n *\r\n * 5. (after fix)\r\n * ```\r\n * |\r\n * | foo\r\n * | bar[]\r\n * |                                    <--- N px of space below the caret\r\n * +---------------------------------...\r\n * ```\r\n *\r\n * @param options Additional configuration of the scrolling behavior.\r\n * @param options.window A window which is scrolled to reveal the rect.\r\n * @param options.rect A rect which is to be revealed.\r\n * @param options.viewportOffset An offset from the edge of the viewport (in pixels) the `rect` will be\r\n * moved by if the viewport is scrolled.\r\n * @param options.alignToTop When set `true`, the helper will make sure the `rect` is scrolled up\r\n * to the top boundary of the viewport if scrolled up. When not set (default), the `rect` will be\r\n * revealed by scrolling as little as possible. This option will not affect rects that must be scrolled\r\n * down because they will appear at the top of the boundary anyway.\r\n * @param options.forceScroll When set `true`, the `rect` will be aligned to the top of the viewport\r\n * whether it is already visible or not. This option will only work when `alignToTop` is `true`\r\n */\r\nfunction scrollWindowToShowRect({ window, rect, alignToTop, forceScroll, viewportOffset }) {\r\n    const targetShiftedDownRect = rect.clone().moveBy(0, viewportOffset.bottom);\r\n    const targetShiftedUpRect = rect.clone().moveBy(0, -viewportOffset.top);\r\n    const viewportRect = new Rect(window).excludeScrollbarsAndBorders();\r\n    const rects = [targetShiftedUpRect, targetShiftedDownRect];\r\n    const forceScrollToTop = alignToTop && forceScroll;\r\n    const allRectsFitInViewport = rects.every(rect => viewportRect.contains(rect));\r\n    let { scrollX, scrollY } = window;\r\n    const initialScrollX = scrollX;\r\n    const initialScrollY = scrollY;\r\n    if (forceScrollToTop) {\r\n        scrollY -= (viewportRect.top - rect.top) + viewportOffset.top;\r\n    }\r\n    else if (!allRectsFitInViewport) {\r\n        if (isAbove(targetShiftedUpRect, viewportRect)) {\r\n            scrollY -= viewportRect.top - rect.top + viewportOffset.top;\r\n        }\r\n        else if (isBelow(targetShiftedDownRect, viewportRect)) {\r\n            if (alignToTop) {\r\n                scrollY += rect.top - viewportRect.top - viewportOffset.top;\r\n            }\r\n            else {\r\n                scrollY += rect.bottom - viewportRect.bottom + viewportOffset.bottom;\r\n            }\r\n        }\r\n    }\r\n    if (!allRectsFitInViewport) {\r\n        // TODO: Web browsers scroll natively to place the target in the middle\r\n        // of the viewport. It's not a very popular case, though.\r\n        if (isLeftOf(rect, viewportRect)) {\r\n            scrollX -= viewportRect.left - rect.left + viewportOffset.left;\r\n        }\r\n        else if (isRightOf(rect, viewportRect)) {\r\n            scrollX += rect.right - viewportRect.right + viewportOffset.right;\r\n        }\r\n    }\r\n    if (scrollX != initialScrollX || scrollY !== initialScrollY) {\r\n        window.scrollTo(scrollX, scrollY);\r\n    }\r\n}\r\n/**\r\n * Recursively scrolls element ancestors to visually reveal a rect.\r\n *\r\n * @param options Additional configuration of the scrolling behavior.\r\n * @param options.parent The first parent ancestor to start scrolling.\r\n * @param options.getRect A function which returns the Rect, which is to be revealed.\r\n * @param options.ancestorOffset An offset from the boundary of scrollable ancestors (if any)\r\n * the `Rect` instance will be moved by if the viewport is scrolled.\r\n * @param options.alignToTop When set `true`, the helper will make sure the `Rect` instance is scrolled up\r\n * to the top boundary of the scrollable ancestors if scrolled up. When not set (default), the `rect`\r\n * will be revealed by scrolling as little as possible. This option will not affect rects that must be\r\n * scrolled down because they will appear at the top of the boundary\r\n * anyway.\r\n * @param options.forceScroll When set `true`, the `rect` will be aligned to the top of scrollable ancestors\r\n * whether it is already visible or not. This option will only work when `alignToTop` is `true`\r\n */\r\nfunction scrollAncestorsToShowRect({ parent, getRect, alignToTop, forceScroll, ancestorOffset = 0 }) {\r\n    const parentWindow = getWindow(parent);\r\n    const forceScrollToTop = alignToTop && forceScroll;\r\n    let parentRect, targetRect, targetFitsInTarget;\r\n    while (parent != parentWindow.document.body) {\r\n        targetRect = getRect();\r\n        parentRect = new Rect(parent).excludeScrollbarsAndBorders();\r\n        targetFitsInTarget = parentRect.contains(targetRect);\r\n        if (forceScrollToTop) {\r\n            parent.scrollTop -= (parentRect.top - targetRect.top) + ancestorOffset;\r\n        }\r\n        else if (!targetFitsInTarget) {\r\n            if (isAbove(targetRect, parentRect)) {\r\n                parent.scrollTop -= parentRect.top - targetRect.top + ancestorOffset;\r\n            }\r\n            else if (isBelow(targetRect, parentRect)) {\r\n                if (alignToTop) {\r\n                    parent.scrollTop += targetRect.top - parentRect.top - ancestorOffset;\r\n                }\r\n                else {\r\n                    parent.scrollTop += targetRect.bottom - parentRect.bottom + ancestorOffset;\r\n                }\r\n            }\r\n        }\r\n        if (!targetFitsInTarget) {\r\n            if (isLeftOf(targetRect, parentRect)) {\r\n                parent.scrollLeft -= parentRect.left - targetRect.left + ancestorOffset;\r\n            }\r\n            else if (isRightOf(targetRect, parentRect)) {\r\n                parent.scrollLeft += targetRect.right - parentRect.right + ancestorOffset;\r\n            }\r\n        }\r\n        parent = parent.parentNode;\r\n    }\r\n}\r\n/**\r\n * Determines if a given `Rect` extends beyond the bottom edge of the second `Rect`.\r\n */\r\nfunction isBelow(firstRect, secondRect) {\r\n    return firstRect.bottom > secondRect.bottom;\r\n}\r\n/**\r\n * Determines if a given `Rect` extends beyond the top edge of the second `Rect`.\r\n */\r\nfunction isAbove(firstRect, secondRect) {\r\n    return firstRect.top < secondRect.top;\r\n}\r\n/**\r\n * Determines if a given `Rect` extends beyond the left edge of the second `Rect`.\r\n */\r\nfunction isLeftOf(firstRect, secondRect) {\r\n    return firstRect.left < secondRect.left;\r\n}\r\n/**\r\n * Determines if a given `Rect` extends beyond the right edge of the second `Rect`.\r\n */\r\nfunction isRightOf(firstRect, secondRect) {\r\n    return firstRect.right > secondRect.right;\r\n}\r\n/**\r\n * Returns the closest window of an element or range.\r\n */\r\nfunction getWindow(elementOrRange) {\r\n    if (isRange(elementOrRange)) {\r\n        return elementOrRange.startContainer.ownerDocument.defaultView;\r\n    }\r\n    else {\r\n        return elementOrRange.ownerDocument.defaultView;\r\n    }\r\n}\r\n/**\r\n * Returns the closest parent of an element or DOM range.\r\n */\r\nfunction getParentElement(elementOrRange) {\r\n    if (isRange(elementOrRange)) {\r\n        let parent = elementOrRange.commonAncestorContainer;\r\n        // If a Range is attached to the Text, use the closest element ancestor.\r\n        if (isText(parent)) {\r\n            parent = parent.parentNode;\r\n        }\r\n        return parent;\r\n    }\r\n    else {\r\n        return elementOrRange.parentNode;\r\n    }\r\n}\r\n/**\r\n * Returns the rect of an element or range residing in an iframe.\r\n * The result rect is relative to the geometry of the passed window instance.\r\n *\r\n * @param target Element or range which rect should be returned.\r\n * @param relativeWindow A window the rect should be relative to.\r\n */\r\nfunction getRectRelativeToWindow(target, relativeWindow) {\r\n    const targetWindow = getWindow(target);\r\n    const rect = new Rect(target);\r\n    if (targetWindow === relativeWindow) {\r\n        return rect;\r\n    }\r\n    else {\r\n        let currentWindow = targetWindow;\r\n        while (currentWindow != relativeWindow) {\r\n            const frame = currentWindow.frameElement;\r\n            const frameRect = new Rect(frame).excludeScrollbarsAndBorders();\r\n            rect.moveBy(frameRect.left, frameRect.top);\r\n            currentWindow = currentWindow.parent;\r\n        }\r\n    }\r\n    return rect;\r\n}\r\n/**\r\n * A helper that explodes the `viewportOffset` configuration if defined as a plain number into an object\r\n * with `top`, `bottom`, `left`, and `right` properties.\r\n *\r\n * If an object value is passed, this helper will pass it through.\r\n *\r\n * @param viewportOffset Viewport offset to be normalized.\r\n */\r\nfunction normalizeViewportOffset(viewportOffset) {\r\n    if (typeof viewportOffset === 'number') {\r\n        return {\r\n            top: viewportOffset,\r\n            bottom: viewportOffset,\r\n            left: viewportOffset,\r\n            right: viewportOffset\r\n        };\r\n    }\r\n    return viewportOffset;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport CKEditorError from './ckeditorerror';\r\nimport env from './env';\r\nconst modifiersToGlyphsMac = {\r\n    ctrl: '⌃',\r\n    cmd: '⌘',\r\n    alt: '⌥',\r\n    shift: '⇧'\r\n};\r\nconst modifiersToGlyphsNonMac = {\r\n    ctrl: 'Ctrl+',\r\n    alt: 'Alt+',\r\n    shift: 'Shift+'\r\n};\r\n/**\r\n * An object with `keyName => keyCode` pairs for a set of known keys.\r\n *\r\n * Contains:\r\n *\r\n * * `a-z`,\r\n * * `0-9`,\r\n * * `f1-f12`,\r\n * * `` ` ``, `-`, `=`, `[`, `]`, `;`, `'`, `,`, `.`, `/`, `\\`,\r\n * * `arrow(left|up|right|bottom)`,\r\n * * `backspace`, `delete`, `enter`, `esc`, `tab`,\r\n * * `ctrl`, `cmd`, `shift`, `alt`.\r\n */\r\nexport const keyCodes = generateKnownKeyCodes();\r\nconst keyCodeNames = Object.fromEntries(Object.entries(keyCodes).map(([name, code]) => [code, name.charAt(0).toUpperCase() + name.slice(1)]));\r\n/**\r\n * Converts a key name or {@link module:utils/keyboard~KeystrokeInfo keystroke info} into a key code.\r\n *\r\n * Note: Key names are matched with {@link module:utils/keyboard#keyCodes} in a case-insensitive way.\r\n *\r\n * @param key A key name (see {@link module:utils/keyboard#keyCodes}) or a keystroke data object.\r\n * @returns Key or keystroke code.\r\n */\r\nexport function getCode(key) {\r\n    let keyCode;\r\n    if (typeof key == 'string') {\r\n        keyCode = keyCodes[key.toLowerCase()];\r\n        if (!keyCode) {\r\n            /**\r\n             * Unknown key name. Only key names included in the {@link module:utils/keyboard#keyCodes} can be used.\r\n             *\r\n             * @error keyboard-unknown-key\r\n             * @param {String} key\r\n             */\r\n            throw new CKEditorError('keyboard-unknown-key', null, { key });\r\n        }\r\n    }\r\n    else {\r\n        keyCode = key.keyCode +\r\n            (key.altKey ? keyCodes.alt : 0) +\r\n            (key.ctrlKey ? keyCodes.ctrl : 0) +\r\n            (key.shiftKey ? keyCodes.shift : 0) +\r\n            (key.metaKey ? keyCodes.cmd : 0);\r\n    }\r\n    return keyCode;\r\n}\r\n/**\r\n * Parses the keystroke and returns a keystroke code that will match the code returned by\r\n * {@link module:utils/keyboard~getCode} for the corresponding {@link module:utils/keyboard~KeystrokeInfo keystroke info}.\r\n *\r\n * The keystroke can be passed in two formats:\r\n *\r\n * * as a single string – e.g. `ctrl + A`,\r\n * * as an array of {@link module:utils/keyboard~keyCodes known key names} and key codes – e.g.:\r\n *   * `[ 'ctrl', 32 ]` (ctrl + space),\r\n *   * `[ 'ctrl', 'a' ]` (ctrl + A).\r\n *\r\n * Note: Key names are matched with {@link module:utils/keyboard#keyCodes} in a case-insensitive way.\r\n *\r\n * Note: Only keystrokes with a single non-modifier key are supported (e.g. `ctrl+A` is OK, but `ctrl+A+B` is not).\r\n *\r\n * Note: On macOS, keystroke handling is translating the `Ctrl` key to the `Cmd` key and handling only that keystroke.\r\n * For example, a registered keystroke `Ctrl+A` will be translated to `Cmd+A` on macOS. To disable the translation of some keystroke,\r\n * use the forced modifier: `Ctrl!+A` (note the exclamation mark).\r\n *\r\n * @param keystroke The keystroke definition.\r\n * @returns Keystroke code.\r\n */\r\nexport function parseKeystroke(keystroke) {\r\n    if (typeof keystroke == 'string') {\r\n        keystroke = splitKeystrokeText(keystroke);\r\n    }\r\n    return keystroke\r\n        .map(key => (typeof key == 'string') ? getEnvKeyCode(key) : key)\r\n        .reduce((key, sum) => sum + key, 0);\r\n}\r\n/**\r\n * Translates any keystroke string text like `\"Ctrl+A\"` to an\r\n * environment–specific keystroke, i.e. `\"⌘A\"` on macOS.\r\n *\r\n * @param keystroke The keystroke text.\r\n * @returns The keystroke text specific for the environment.\r\n */\r\nexport function getEnvKeystrokeText(keystroke) {\r\n    let keystrokeCode = parseKeystroke(keystroke);\r\n    const modifiersToGlyphs = Object.entries(env.isMac ? modifiersToGlyphsMac : modifiersToGlyphsNonMac);\r\n    const modifiers = modifiersToGlyphs.reduce((modifiers, [name, glyph]) => {\r\n        // Modifier keys are stored as a bit mask so extract those from the keystroke code.\r\n        if ((keystrokeCode & keyCodes[name]) != 0) {\r\n            keystrokeCode &= ~keyCodes[name];\r\n            modifiers += glyph;\r\n        }\r\n        return modifiers;\r\n    }, '');\r\n    return modifiers + (keystrokeCode ? keyCodeNames[keystrokeCode] : '');\r\n}\r\n/**\r\n * Returns `true` if the provided key code represents one of the arrow keys.\r\n *\r\n * @param keyCode A key code as in {@link module:utils/keyboard~KeystrokeInfo#keyCode}.\r\n */\r\nexport function isArrowKeyCode(keyCode) {\r\n    return keyCode == keyCodes.arrowright ||\r\n        keyCode == keyCodes.arrowleft ||\r\n        keyCode == keyCodes.arrowup ||\r\n        keyCode == keyCodes.arrowdown;\r\n}\r\n/**\r\n * Returns the direction in which the {@link module:engine/model/documentselection~DocumentSelection selection}\r\n * will move when the provided arrow key code is pressed considering the language direction of the editor content.\r\n *\r\n * For instance, in right–to–left (RTL) content languages, pressing the left arrow means moving the selection right (forward)\r\n * in the model structure. Similarly, pressing the right arrow moves the selection left (backward).\r\n *\r\n * @param keyCode A key code as in {@link module:utils/keyboard~KeystrokeInfo#keyCode}.\r\n * @param contentLanguageDirection The content language direction, corresponding to\r\n * {@link module:utils/locale~Locale#contentLanguageDirection}.\r\n * @returns Localized arrow direction or `undefined` for non-arrow key codes.\r\n */\r\nexport function getLocalizedArrowKeyCodeDirection(keyCode, contentLanguageDirection) {\r\n    const isLtrContent = contentLanguageDirection === 'ltr';\r\n    switch (keyCode) {\r\n        case keyCodes.arrowleft:\r\n            return isLtrContent ? 'left' : 'right';\r\n        case keyCodes.arrowright:\r\n            return isLtrContent ? 'right' : 'left';\r\n        case keyCodes.arrowup:\r\n            return 'up';\r\n        case keyCodes.arrowdown:\r\n            return 'down';\r\n    }\r\n}\r\n/**\r\n * Converts a key name to the key code with mapping based on the env.\r\n *\r\n * See: {@link module:utils/keyboard~getCode}.\r\n *\r\n * @param key The key name (see {@link module:utils/keyboard#keyCodes}).\r\n * @returns Key code.\r\n */\r\nfunction getEnvKeyCode(key) {\r\n    // Don't remap modifier key for forced modifiers.\r\n    if (key.endsWith('!')) {\r\n        return getCode(key.slice(0, -1));\r\n    }\r\n    const code = getCode(key);\r\n    return env.isMac && code == keyCodes.ctrl ? keyCodes.cmd : code;\r\n}\r\n/**\r\n * Determines if the provided key code moves the {@link module:engine/model/documentselection~DocumentSelection selection}\r\n * forward or backward considering the language direction of the editor content.\r\n *\r\n * For instance, in right–to–left (RTL) languages, pressing the left arrow means moving forward\r\n * in the model structure. Similarly, pressing the right arrow moves the selection backward.\r\n *\r\n * @param keyCode A key code as in {@link module:utils/keyboard~KeystrokeInfo#keyCode}.\r\n * @param contentLanguageDirection The content language direction, corresponding to\r\n * {@link module:utils/locale~Locale#contentLanguageDirection}.\r\n */\r\nexport function isForwardArrowKeyCode(keyCode, contentLanguageDirection) {\r\n    const localizedKeyCodeDirection = getLocalizedArrowKeyCodeDirection(keyCode, contentLanguageDirection);\r\n    return localizedKeyCodeDirection === 'down' || localizedKeyCodeDirection === 'right';\r\n}\r\nfunction generateKnownKeyCodes() {\r\n    const keyCodes = {\r\n        arrowleft: 37,\r\n        arrowup: 38,\r\n        arrowright: 39,\r\n        arrowdown: 40,\r\n        backspace: 8,\r\n        delete: 46,\r\n        enter: 13,\r\n        space: 32,\r\n        esc: 27,\r\n        tab: 9,\r\n        // The idea about these numbers is that they do not collide with any real key codes, so we can use them\r\n        // like bit masks.\r\n        ctrl: 0x110000,\r\n        shift: 0x220000,\r\n        alt: 0x440000,\r\n        cmd: 0x880000\r\n    };\r\n    // a-z\r\n    for (let code = 65; code <= 90; code++) {\r\n        const letter = String.fromCharCode(code);\r\n        keyCodes[letter.toLowerCase()] = code;\r\n    }\r\n    // 0-9\r\n    for (let code = 48; code <= 57; code++) {\r\n        keyCodes[code - 48] = code;\r\n    }\r\n    // F1-F12\r\n    for (let code = 112; code <= 123; code++) {\r\n        keyCodes['f' + (code - 111)] = code;\r\n    }\r\n    // other characters\r\n    for (const char of '`-=[];\\',./\\\\') {\r\n        keyCodes[char] = char.charCodeAt(0);\r\n    }\r\n    return keyCodes;\r\n}\r\nfunction splitKeystrokeText(keystroke) {\r\n    return keystroke.split('+').map(key => key.trim());\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nexport default function toArray(data) {\r\n    return Array.isArray(data) ? data : [data];\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/* eslint-disable no-var */\r\n/**\r\n * @module utils/translation-service\r\n */\r\nimport CKEditorError from './ckeditorerror';\r\nimport global from './dom/global';\r\n/* istanbul ignore else -- @preserve */\r\nif (!global.window.CKEDITOR_TRANSLATIONS) {\r\n    global.window.CKEDITOR_TRANSLATIONS = {};\r\n}\r\n/**\r\n * Adds translations to existing ones or overrides the existing translations. These translations will later\r\n * be available for the {@link module:utils/locale~Locale#t `t()`} function.\r\n *\r\n * The `translations` is an object which consists of `messageId: translation` pairs. Note that the message ID can be\r\n * either constructed from the message string or from the message ID if it was passed\r\n * (this happens rarely and mostly for short messages or messages with placeholders).\r\n * Since the editor displays only the message string, the message ID can be found either in the source code or in the\r\n * built translations for another language.\r\n *\r\n * ```ts\r\n * add( 'pl', {\r\n * \t'Cancel': 'Anuluj',\r\n * \t'IMAGE': 'obraz', // Note that the `IMAGE` comes from the message ID, while the string can be `image`.\r\n * } );\r\n * ```\r\n *\r\n * If the message is supposed to support various plural forms, make sure to provide an array with the singular form and all plural forms:\r\n *\r\n * ```ts\r\n * add( 'pl', {\r\n * \t'Add space': [ 'Dodaj spację', 'Dodaj %0 spacje', 'Dodaj %0 spacji' ]\r\n * } );\r\n * ```\r\n *\r\n * You should also specify the third argument (the `getPluralForm()` function) that will be used to determine the plural form if no\r\n * language file was loaded for that language. All language files coming from CKEditor 5 sources will have this option set, so\r\n * these plural form rules will be reused by other translations added to the registered languages. The `getPluralForm()` function\r\n * can return either a Boolean or a number.\r\n *\r\n * ```ts\r\n * add( 'en', {\r\n * \t// ... Translations.\r\n * }, n => n !== 1 );\r\n * add( 'pl', {\r\n * \t// ... Translations.\r\n * }, n => n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && ( n % 100 < 10 || n % 100 >= 20 ) ? 1 : 2 );\r\n * ```\r\n *\r\n * All translations extend the global `window.CKEDITOR_TRANSLATIONS` object. An example of this object can be found below:\r\n *\r\n * ```ts\r\n * {\r\n * \tpl: {\r\n * \t\tdictionary: {\r\n * \t\t\t'Cancel': 'Anuluj',\r\n * \t\t\t'Add space': [ 'Dodaj spację', 'Dodaj %0 spacje', 'Dodaj %0 spacji' ]\r\n * \t\t},\r\n * \t\t// A function that returns the plural form index.\r\n * \t\tgetPluralForm: n => n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && ( n % 100 < 10 || n % 100 >= 20 ) ? 1 : 2 );\r\n * \t}\r\n * \t// Other languages.\r\n * \t}\r\n * ```\r\n *\r\n * If you cannot import this function from this module (e.g. because you use a CKEditor 5 build), you can\r\n * still add translations by extending the global `window.CKEDITOR_TRANSLATIONS` object by using a function like\r\n * the one below:\r\n *\r\n * ```ts\r\n * function addTranslations( language, translations, getPluralForm ) {\r\n * \tif ( !global.window.CKEDITOR_TRANSLATIONS ) {\r\n * \t\tglobal.window.CKEDITOR_TRANSLATIONS = {};\r\n * \t}\r\n\r\n * \tif ( !global.window.CKEDITOR_TRANSLATIONS[ language ] ) {\r\n * \t\tglobal.window.CKEDITOR_TRANSLATIONS[ language ] = {};\r\n * \t}\r\n *\r\n * \tconst languageTranslations = global.window.CKEDITOR_TRANSLATIONS[ language ];\r\n *\r\n * \tlanguageTranslations.dictionary = languageTranslations.dictionary || {};\r\n * \tlanguageTranslations.getPluralForm = getPluralForm || languageTranslations.getPluralForm;\r\n *\r\n * \t// Extend the dictionary for the given language.\r\n * \tObject.assign( languageTranslations.dictionary, translations );\r\n * }\r\n * ```\r\n *\r\n * @param language Target language.\r\n * @param translations An object with translations which will be added to the dictionary.\r\n * For each message ID the value should be either a translation or an array of translations if the message\r\n * should support plural forms.\r\n * @param getPluralForm A function that returns the plural form index (a number).\r\n */\r\nexport function add(language, translations, getPluralForm) {\r\n    if (!global.window.CKEDITOR_TRANSLATIONS[language]) {\r\n        global.window.CKEDITOR_TRANSLATIONS[language] = {};\r\n    }\r\n    const languageTranslations = global.window.CKEDITOR_TRANSLATIONS[language];\r\n    languageTranslations.dictionary = languageTranslations.dictionary || {};\r\n    languageTranslations.getPluralForm = getPluralForm || languageTranslations.getPluralForm;\r\n    Object.assign(languageTranslations.dictionary, translations);\r\n}\r\n/**\r\n * **Note:** This method is internal, use {@link module:utils/locale~Locale#t the `t()` function} instead to translate\r\n * the editor UI parts.\r\n *\r\n * This function is responsible for translating messages to the specified language. It uses translations added perviously\r\n * by {@link module:utils/translation-service~add} (a translations dictionary and the `getPluralForm()` function\r\n * to provide accurate translations of plural forms).\r\n *\r\n * When no translation is defined in the dictionary or the dictionary does not exist, this function returns\r\n * the original message string or the message plural depending on the number of elements.\r\n *\r\n * ```ts\r\n * translate( 'pl', { string: 'Cancel' } ); // 'Cancel'\r\n * ```\r\n *\r\n * The third optional argument is the number of elements, based on which the single form or one of the plural forms\r\n * should be picked when the message is supposed to support various plural forms.\r\n *\r\n * ```ts\r\n * translate( 'en', { string: 'Add a space', plural: 'Add %0 spaces' }, 1 ); // 'Add a space'\r\n * translate( 'en', { string: 'Add a space', plural: 'Add %0 spaces' }, 3 ); // 'Add %0 spaces'\r\n * ```\r\n *\r\n * The message should provide an ID using the `id` property when the message strings are not unique and their\r\n * translations should be different.\r\n *\r\n * ```ts\r\n * translate( 'en', { string: 'image', id: 'ADD_IMAGE' } );\r\n * translate( 'en', { string: 'image', id: 'AN_IMAGE' } );\r\n * ```\r\n *\r\n * @internal\r\n * @param language Target language.\r\n * @param message A message that will be translated.\r\n * @param quantity The number of elements for which a plural form should be picked from the target language dictionary.\r\n * @returns Translated sentence.\r\n */\r\nexport function _translate(language, message, quantity = 1) {\r\n    if (typeof quantity !== 'number') {\r\n        /**\r\n         * An incorrect value was passed to the translation function. This was probably caused\r\n         * by an incorrect message interpolation of a plural form. Note that for messages supporting plural forms\r\n         * the second argument of the `t()` function should always be a number or an array with a number as the first element.\r\n         *\r\n         * @error translation-service-quantity-not-a-number\r\n         */\r\n        throw new CKEditorError('translation-service-quantity-not-a-number', null, { quantity });\r\n    }\r\n    const numberOfLanguages = getNumberOfLanguages();\r\n    if (numberOfLanguages === 1) {\r\n        // Override the language to the only supported one.\r\n        // This can't be done in the `Locale` class, because the translations comes after the `Locale` class initialization.\r\n        language = Object.keys(global.window.CKEDITOR_TRANSLATIONS)[0];\r\n    }\r\n    const messageId = message.id || message.string;\r\n    if (numberOfLanguages === 0 || !hasTranslation(language, messageId)) {\r\n        if (quantity !== 1) {\r\n            // Return the default plural form that was passed in the `message.plural` parameter.\r\n            return message.plural;\r\n        }\r\n        return message.string;\r\n    }\r\n    const dictionary = global.window.CKEDITOR_TRANSLATIONS[language].dictionary;\r\n    const getPluralForm = global.window.CKEDITOR_TRANSLATIONS[language].getPluralForm || (n => n === 1 ? 0 : 1);\r\n    const translation = dictionary[messageId];\r\n    if (typeof translation === 'string') {\r\n        return translation;\r\n    }\r\n    const pluralFormIndex = Number(getPluralForm(quantity));\r\n    // Note: The `translate` function is not responsible for replacing `%0, %1, ...` with values.\r\n    return translation[pluralFormIndex];\r\n}\r\n/**\r\n * Clears dictionaries for test purposes.\r\n *\r\n * @internal\r\n */\r\nexport function _clear() {\r\n    global.window.CKEDITOR_TRANSLATIONS = {};\r\n}\r\n/**\r\n * Checks whether the dictionary exists and translation in that dictionary exists.\r\n */\r\nfunction hasTranslation(language, messageId) {\r\n    return (!!global.window.CKEDITOR_TRANSLATIONS[language] &&\r\n        !!global.window.CKEDITOR_TRANSLATIONS[language].dictionary[messageId]);\r\n}\r\nfunction getNumberOfLanguages() {\r\n    return Object.keys(global.window.CKEDITOR_TRANSLATIONS).length;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nconst RTL_LANGUAGE_CODES = [\r\n    'ar', 'ara',\r\n    'fa', 'per', 'fas',\r\n    'he', 'heb',\r\n    'ku', 'kur',\r\n    'ug', 'uig' // Uighur, Uyghur\r\n];\r\n/**\r\n * Helps determine whether a language text direction is LTR or RTL.\r\n *\r\n * @param languageCode The ISO 639-1 or ISO 639-2 language code.\r\n */\r\nexport function getLanguageDirection(languageCode) {\r\n    return RTL_LANGUAGE_CODES.includes(languageCode) ? 'rtl' : 'ltr';\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/locale\r\n */\r\n/* globals console */\r\nimport toArray from './toarray';\r\nimport { _translate } from './translation-service';\r\nimport { getLanguageDirection } from './language';\r\n/**\r\n * Represents the localization services.\r\n */\r\nexport default class Locale {\r\n    /**\r\n     * Creates a new instance of the locale class. Learn more about\r\n     * {@glink features/ui-language configuring the language of the editor}.\r\n     *\r\n     * @param options Locale configuration.\r\n     * @param options.uiLanguage The editor UI language code in the\r\n     * [ISO 639-1](https://en.wikipedia.org/wiki/ISO_639-1) format. See {@link #uiLanguage}.\r\n     * @param options.contentLanguage The editor content language code in the\r\n     * [ISO 639-1](https://en.wikipedia.org/wiki/ISO_639-1) format. If not specified, the same as `options.language`.\r\n     * See {@link #contentLanguage}.\r\n     */\r\n    constructor({ uiLanguage = 'en', contentLanguage } = {}) {\r\n        this.uiLanguage = uiLanguage;\r\n        this.contentLanguage = contentLanguage || this.uiLanguage;\r\n        this.uiLanguageDirection = getLanguageDirection(this.uiLanguage);\r\n        this.contentLanguageDirection = getLanguageDirection(this.contentLanguage);\r\n        this.t = (message, values) => this._t(message, values);\r\n    }\r\n    /**\r\n     * The editor UI language code in the [ISO 639-1](https://en.wikipedia.org/wiki/ISO_639-1) format.\r\n     *\r\n     * **Note**: This property was deprecated. Please use {@link #uiLanguage} and {@link #contentLanguage}\r\n     * properties instead.\r\n     *\r\n     * @deprecated\r\n     */\r\n    get language() {\r\n        /**\r\n         * The {@link module:utils/locale~Locale#language `Locale#language`} property was deprecated and will\r\n         * be removed in the near future. Please use the {@link module:utils/locale~Locale#uiLanguage `Locale#uiLanguage`} and\r\n         * {@link module:utils/locale~Locale#contentLanguage `Locale#contentLanguage`} properties instead.\r\n         *\r\n         * @error locale-deprecated-language-property\r\n         */\r\n        console.warn('locale-deprecated-language-property: ' +\r\n            'The Locale#language property has been deprecated and will be removed in the near future. ' +\r\n            'Please use #uiLanguage and #contentLanguage properties instead.');\r\n        return this.uiLanguage;\r\n    }\r\n    /**\r\n     * An unbound version of the {@link #t} method.\r\n     */\r\n    _t(message, values = []) {\r\n        values = toArray(values);\r\n        if (typeof message === 'string') {\r\n            message = { string: message };\r\n        }\r\n        const hasPluralForm = !!message.plural;\r\n        const quantity = hasPluralForm ? values[0] : 1;\r\n        const translatedString = _translate(this.uiLanguage, message, quantity);\r\n        return interpolateString(translatedString, values);\r\n    }\r\n}\r\n/**\r\n * Fills the `%0, %1, ...` string placeholders with values.\r\n */\r\nfunction interpolateString(string, values) {\r\n    return string.replace(/%(\\d+)/g, (match, index) => {\r\n        return (index < values.length) ? values[index] : match;\r\n    });\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/collection\r\n */\r\nimport EmitterMixin from './emittermixin';\r\nimport CKEditorError from './ckeditorerror';\r\nimport uid from './uid';\r\nimport isIterable from './isiterable';\r\n/**\r\n * Collections are ordered sets of objects. Items in the collection can be retrieved by their indexes\r\n * in the collection (like in an array) or by their ids.\r\n *\r\n * If an object without an `id` property is being added to the collection, the `id` property will be generated\r\n * automatically. Note that the automatically generated id is unique only within this single collection instance.\r\n *\r\n * By default an item in the collection is identified by its `id` property. The name of the identifier can be\r\n * configured through the constructor of the collection.\r\n *\r\n * @typeParam T The type of the collection element.\r\n */\r\nexport default class Collection extends EmitterMixin() {\r\n    constructor(initialItemsOrOptions = {}, options = {}) {\r\n        super();\r\n        const hasInitialItems = isIterable(initialItemsOrOptions);\r\n        if (!hasInitialItems) {\r\n            options = initialItemsOrOptions;\r\n        }\r\n        this._items = [];\r\n        this._itemMap = new Map();\r\n        this._idProperty = options.idProperty || 'id';\r\n        this._bindToExternalToInternalMap = new WeakMap();\r\n        this._bindToInternalToExternalMap = new WeakMap();\r\n        this._skippedIndexesFromExternal = [];\r\n        // Set the initial content of the collection (if provided in the constructor).\r\n        if (hasInitialItems) {\r\n            for (const item of initialItemsOrOptions) {\r\n                this._items.push(item);\r\n                this._itemMap.set(this._getItemIdBeforeAdding(item), item);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * The number of items available in the collection.\r\n     */\r\n    get length() {\r\n        return this._items.length;\r\n    }\r\n    /**\r\n     * Returns the first item from the collection or null when collection is empty.\r\n     */\r\n    get first() {\r\n        return this._items[0] || null;\r\n    }\r\n    /**\r\n     * Returns the last item from the collection or null when collection is empty.\r\n     */\r\n    get last() {\r\n        return this._items[this.length - 1] || null;\r\n    }\r\n    /**\r\n     * Adds an item into the collection.\r\n     *\r\n     * If the item does not have an id, then it will be automatically generated and set on the item.\r\n     *\r\n     * @param item\r\n     * @param index The position of the item in the collection. The item\r\n     * is pushed to the collection when `index` not specified.\r\n     * @fires add\r\n     * @fires change\r\n     */\r\n    add(item, index) {\r\n        return this.addMany([item], index);\r\n    }\r\n    /**\r\n     * Adds multiple items into the collection.\r\n     *\r\n     * Any item not containing an id will get an automatically generated one.\r\n     *\r\n     * @param items\r\n     * @param index The position of the insertion. Items will be appended if no `index` is specified.\r\n     * @fires add\r\n     * @fires change\r\n     */\r\n    addMany(items, index) {\r\n        if (index === undefined) {\r\n            index = this._items.length;\r\n        }\r\n        else if (index > this._items.length || index < 0) {\r\n            /**\r\n             * The `index` passed to {@link module:utils/collection~Collection#addMany `Collection#addMany()`}\r\n             * is invalid. It must be a number between 0 and the collection's length.\r\n             *\r\n             * @error collection-add-item-invalid-index\r\n             */\r\n            throw new CKEditorError('collection-add-item-invalid-index', this);\r\n        }\r\n        let offset = 0;\r\n        for (const item of items) {\r\n            const itemId = this._getItemIdBeforeAdding(item);\r\n            const currentItemIndex = index + offset;\r\n            this._items.splice(currentItemIndex, 0, item);\r\n            this._itemMap.set(itemId, item);\r\n            this.fire('add', item, currentItemIndex);\r\n            offset++;\r\n        }\r\n        this.fire('change', {\r\n            added: items,\r\n            removed: [],\r\n            index\r\n        });\r\n        return this;\r\n    }\r\n    /**\r\n     * Gets an item by its ID or index.\r\n     *\r\n     * @param idOrIndex The item ID or index in the collection.\r\n     * @returns The requested item or `null` if such item does not exist.\r\n     */\r\n    get(idOrIndex) {\r\n        let item;\r\n        if (typeof idOrIndex == 'string') {\r\n            item = this._itemMap.get(idOrIndex);\r\n        }\r\n        else if (typeof idOrIndex == 'number') {\r\n            item = this._items[idOrIndex];\r\n        }\r\n        else {\r\n            /**\r\n             * An index or ID must be given.\r\n             *\r\n             * @error collection-get-invalid-arg\r\n             */\r\n            throw new CKEditorError('collection-get-invalid-arg', this);\r\n        }\r\n        return item || null;\r\n    }\r\n    /**\r\n     * Returns a Boolean indicating whether the collection contains an item.\r\n     *\r\n     * @param itemOrId The item or its ID in the collection.\r\n     * @returns `true` if the collection contains the item, `false` otherwise.\r\n     */\r\n    has(itemOrId) {\r\n        if (typeof itemOrId == 'string') {\r\n            return this._itemMap.has(itemOrId);\r\n        }\r\n        else { // Object\r\n            const idProperty = this._idProperty;\r\n            const id = itemOrId[idProperty];\r\n            return id && this._itemMap.has(id);\r\n        }\r\n    }\r\n    /**\r\n     * Gets an index of an item in the collection.\r\n     * When an item is not defined in the collection, the index will equal -1.\r\n     *\r\n     * @param itemOrId The item or its ID in the collection.\r\n     * @returns The index of a given item.\r\n     */\r\n    getIndex(itemOrId) {\r\n        let item;\r\n        if (typeof itemOrId == 'string') {\r\n            item = this._itemMap.get(itemOrId);\r\n        }\r\n        else {\r\n            item = itemOrId;\r\n        }\r\n        return item ? this._items.indexOf(item) : -1;\r\n    }\r\n    /**\r\n     * Removes an item from the collection.\r\n     *\r\n     * @param subject The item to remove, its ID or index in the collection.\r\n     * @returns The removed item.\r\n     * @fires remove\r\n     * @fires change\r\n     */\r\n    remove(subject) {\r\n        const [item, index] = this._remove(subject);\r\n        this.fire('change', {\r\n            added: [],\r\n            removed: [item],\r\n            index\r\n        });\r\n        return item;\r\n    }\r\n    /**\r\n     * Executes the callback for each item in the collection and composes an array or values returned by this callback.\r\n     *\r\n     * @typeParam U The result type of the callback.\r\n     * @param callback\r\n     * @param ctx Context in which the `callback` will be called.\r\n     * @returns The result of mapping.\r\n     */\r\n    map(callback, ctx) {\r\n        return this._items.map(callback, ctx);\r\n    }\r\n    /**\r\n     * Finds the first item in the collection for which the `callback` returns a true value.\r\n     *\r\n     * @param callback\r\n     * @param ctx Context in which the `callback` will be called.\r\n     * @returns The item for which `callback` returned a true value.\r\n     */\r\n    find(callback, ctx) {\r\n        return this._items.find(callback, ctx);\r\n    }\r\n    /**\r\n     * Returns an array with items for which the `callback` returned a true value.\r\n     *\r\n     * @param callback\r\n     * @param ctx Context in which the `callback` will be called.\r\n     * @returns The array with matching items.\r\n     */\r\n    filter(callback, ctx) {\r\n        return this._items.filter(callback, ctx);\r\n    }\r\n    /**\r\n     * Removes all items from the collection and destroys the binding created using\r\n     * {@link #bindTo}.\r\n     *\r\n     * @fires remove\r\n     * @fires change\r\n     */\r\n    clear() {\r\n        if (this._bindToCollection) {\r\n            this.stopListening(this._bindToCollection);\r\n            this._bindToCollection = null;\r\n        }\r\n        const removedItems = Array.from(this._items);\r\n        while (this.length) {\r\n            this._remove(0);\r\n        }\r\n        this.fire('change', {\r\n            added: [],\r\n            removed: removedItems,\r\n            index: 0\r\n        });\r\n    }\r\n    /**\r\n     * Binds and synchronizes the collection with another one.\r\n     *\r\n     * The binding can be a simple factory:\r\n     *\r\n     * ```ts\r\n     * class FactoryClass {\r\n     * \tpublic label: string;\r\n     *\r\n     * \tconstructor( data: { label: string } ) {\r\n     * \t\tthis.label = data.label;\r\n     * \t}\r\n     * }\r\n     *\r\n     * const source = new Collection<{ label: string }>( { idProperty: 'label' } );\r\n     * const target = new Collection<FactoryClass>();\r\n     *\r\n     * target.bindTo( source ).as( FactoryClass );\r\n     *\r\n     * source.add( { label: 'foo' } );\r\n     * source.add( { label: 'bar' } );\r\n     *\r\n     * console.log( target.length ); // 2\r\n     * console.log( target.get( 1 ).label ); // 'bar'\r\n     *\r\n     * source.remove( 0 );\r\n     * console.log( target.length ); // 1\r\n     * console.log( target.get( 0 ).label ); // 'bar'\r\n     * ```\r\n     *\r\n     * or the factory driven by a custom callback:\r\n     *\r\n     * ```ts\r\n     * class FooClass {\r\n     * \tpublic label: string;\r\n     *\r\n     * \tconstructor( data: { label: string } ) {\r\n     * \t\tthis.label = data.label;\r\n     * \t}\r\n     * }\r\n     *\r\n     * class BarClass {\r\n     * \tpublic label: string;\r\n     *\r\n     * \tconstructor( data: { label: string } ) {\r\n     * \t\tthis.label = data.label;\r\n     * \t}\r\n     * }\r\n     *\r\n     * const source = new Collection<{ label: string }>( { idProperty: 'label' } );\r\n     * const target = new Collection<FooClass | BarClass>();\r\n     *\r\n     * target.bindTo( source ).using( ( item ) => {\r\n     * \tif ( item.label == 'foo' ) {\r\n     * \t\treturn new FooClass( item );\r\n     * \t} else {\r\n     * \t\treturn new BarClass( item );\r\n     * \t}\r\n     * } );\r\n     *\r\n     * source.add( { label: 'foo' } );\r\n     * source.add( { label: 'bar' } );\r\n     *\r\n     * console.log( target.length ); // 2\r\n     * console.log( target.get( 0 ) instanceof FooClass ); // true\r\n     * console.log( target.get( 1 ) instanceof BarClass ); // true\r\n     * ```\r\n     *\r\n     * or the factory out of property name:\r\n     *\r\n     * ```ts\r\n     * const source = new Collection<{ nested: { value: string } }>();\r\n     * const target = new Collection<{ value: string }>();\r\n     *\r\n     * target.bindTo( source ).using( 'nested' );\r\n     *\r\n     * source.add( { nested: { value: 'foo' } } );\r\n     * source.add( { nested: { value: 'bar' } } );\r\n     *\r\n     * console.log( target.length ); // 2\r\n     * console.log( target.get( 0 ).value ); // 'foo'\r\n     * console.log( target.get( 1 ).value ); // 'bar'\r\n     * ```\r\n     *\r\n     * It's possible to skip specified items by returning null value:\r\n     *\r\n     * ```ts\r\n     * const source = new Collection<{ hidden: boolean }>();\r\n     * const target = new Collection<{ hidden: boolean }>();\r\n     *\r\n     * target.bindTo( source ).using( item => {\r\n     * \tif ( item.hidden ) {\r\n     * \t\treturn null;\r\n     * \t}\r\n     *\r\n     * \treturn item;\r\n     * } );\r\n     *\r\n     * source.add( { hidden: true } );\r\n     * source.add( { hidden: false } );\r\n     *\r\n     * console.log( source.length ); // 2\r\n     * console.log( target.length ); // 1\r\n     * ```\r\n     *\r\n     * **Note**: {@link #clear} can be used to break the binding.\r\n     *\r\n     * @typeParam S The type of `externalCollection` element.\r\n     * @param externalCollection A collection to be bound.\r\n     * @returns The binding chain object.\r\n     */\r\n    bindTo(externalCollection) {\r\n        if (this._bindToCollection) {\r\n            /**\r\n             * The collection cannot be bound more than once.\r\n             *\r\n             * @error collection-bind-to-rebind\r\n             */\r\n            throw new CKEditorError('collection-bind-to-rebind', this);\r\n        }\r\n        this._bindToCollection = externalCollection;\r\n        return {\r\n            as: Class => {\r\n                this._setUpBindToBinding(item => new Class(item));\r\n            },\r\n            using: callbackOrProperty => {\r\n                if (typeof callbackOrProperty == 'function') {\r\n                    this._setUpBindToBinding(callbackOrProperty);\r\n                }\r\n                else {\r\n                    this._setUpBindToBinding(item => item[callbackOrProperty]);\r\n                }\r\n            }\r\n        };\r\n    }\r\n    /**\r\n     * Finalizes and activates a binding initiated by {@link #bindTo}.\r\n     *\r\n     * @param factory A function which produces collection items.\r\n     */\r\n    _setUpBindToBinding(factory) {\r\n        const externalCollection = this._bindToCollection;\r\n        // Adds the item to the collection once a change has been done to the external collection.\r\n        const addItem = (evt, externalItem, index) => {\r\n            const isExternalBoundToThis = externalCollection._bindToCollection == this;\r\n            const externalItemBound = externalCollection._bindToInternalToExternalMap.get(externalItem);\r\n            // If an external collection is bound to this collection, which makes it a 2–way binding,\r\n            // and the particular external collection item is already bound, don't add it here.\r\n            // The external item has been created **out of this collection's item** and (re)adding it will\r\n            // cause a loop.\r\n            if (isExternalBoundToThis && externalItemBound) {\r\n                this._bindToExternalToInternalMap.set(externalItem, externalItemBound);\r\n                this._bindToInternalToExternalMap.set(externalItemBound, externalItem);\r\n            }\r\n            else {\r\n                const item = factory(externalItem);\r\n                // When there is no item we need to remember skipped index first and then we can skip this item.\r\n                if (!item) {\r\n                    this._skippedIndexesFromExternal.push(index);\r\n                    return;\r\n                }\r\n                // Lets try to put item at the same index as index in external collection\r\n                // but when there are a skipped items in one or both collections we need to recalculate this index.\r\n                let finalIndex = index;\r\n                // When we try to insert item after some skipped items from external collection we need\r\n                // to include this skipped items and decrease index.\r\n                //\r\n                // For the following example:\r\n                // external -> [ 'A', 'B - skipped for internal', 'C - skipped for internal' ]\r\n                // internal -> [ A ]\r\n                //\r\n                // Another item is been added at the end of external collection:\r\n                // external.add( 'D' )\r\n                // external -> [ 'A', 'B - skipped for internal', 'C - skipped for internal', 'D' ]\r\n                //\r\n                // We can't just add 'D' to internal at the same index as index in external because\r\n                // this will produce empty indexes what is invalid:\r\n                // internal -> [ 'A', empty, empty, 'D' ]\r\n                //\r\n                // So we need to include skipped items and decrease index\r\n                // internal -> [ 'A', 'D' ]\r\n                for (const skipped of this._skippedIndexesFromExternal) {\r\n                    if (index > skipped) {\r\n                        finalIndex--;\r\n                    }\r\n                }\r\n                // We need to take into consideration that external collection could skip some items from\r\n                // internal collection.\r\n                //\r\n                // For the following example:\r\n                // internal -> [ 'A', 'B - skipped for external', 'C - skipped for external' ]\r\n                // external -> [ A ]\r\n                //\r\n                // Another item is been added at the end of external collection:\r\n                // external.add( 'D' )\r\n                // external -> [ 'A', 'D' ]\r\n                //\r\n                // We need to include skipped items and place new item after them:\r\n                // internal -> [ 'A', 'B - skipped for external', 'C - skipped for external', 'D' ]\r\n                for (const skipped of externalCollection._skippedIndexesFromExternal) {\r\n                    if (finalIndex >= skipped) {\r\n                        finalIndex++;\r\n                    }\r\n                }\r\n                this._bindToExternalToInternalMap.set(externalItem, item);\r\n                this._bindToInternalToExternalMap.set(item, externalItem);\r\n                this.add(item, finalIndex);\r\n                // After adding new element to internal collection we need update indexes\r\n                // of skipped items in external collection.\r\n                for (let i = 0; i < externalCollection._skippedIndexesFromExternal.length; i++) {\r\n                    if (finalIndex <= externalCollection._skippedIndexesFromExternal[i]) {\r\n                        externalCollection._skippedIndexesFromExternal[i]++;\r\n                    }\r\n                }\r\n            }\r\n        };\r\n        // Load the initial content of the collection.\r\n        for (const externalItem of externalCollection) {\r\n            addItem(null, externalItem, externalCollection.getIndex(externalItem));\r\n        }\r\n        // Synchronize the with collection as new items are added.\r\n        this.listenTo(externalCollection, 'add', addItem);\r\n        // Synchronize the with collection as new items are removed.\r\n        this.listenTo(externalCollection, 'remove', (evt, externalItem, index) => {\r\n            const item = this._bindToExternalToInternalMap.get(externalItem);\r\n            if (item) {\r\n                this.remove(item);\r\n            }\r\n            // After removing element from external collection we need update/remove indexes\r\n            // of skipped items in internal collection.\r\n            this._skippedIndexesFromExternal = this._skippedIndexesFromExternal.reduce((result, skipped) => {\r\n                if (index < skipped) {\r\n                    result.push(skipped - 1);\r\n                }\r\n                if (index > skipped) {\r\n                    result.push(skipped);\r\n                }\r\n                return result;\r\n            }, []);\r\n        });\r\n    }\r\n    /**\r\n     * Returns an unique id property for a given `item`.\r\n     *\r\n     * The method will generate new id and assign it to the `item` if it doesn't have any.\r\n     *\r\n     * @param item Item to be added.\r\n     */\r\n    _getItemIdBeforeAdding(item) {\r\n        const idProperty = this._idProperty;\r\n        let itemId;\r\n        if ((idProperty in item)) {\r\n            itemId = item[idProperty];\r\n            if (typeof itemId != 'string') {\r\n                /**\r\n                 * This item's ID should be a string.\r\n                 *\r\n                 * @error collection-add-invalid-id\r\n                 */\r\n                throw new CKEditorError('collection-add-invalid-id', this);\r\n            }\r\n            if (this.get(itemId)) {\r\n                /**\r\n                 * This item already exists in the collection.\r\n                 *\r\n                 * @error collection-add-item-already-exists\r\n                 */\r\n                throw new CKEditorError('collection-add-item-already-exists', this);\r\n            }\r\n        }\r\n        else {\r\n            item[idProperty] = itemId = uid();\r\n        }\r\n        return itemId;\r\n    }\r\n    /**\r\n     * Core {@link #remove} method implementation shared in other functions.\r\n     *\r\n     * In contrast this method **does not** fire the {@link #event:change} event.\r\n     *\r\n     * @param subject The item to remove, its id or index in the collection.\r\n     * @returns Returns an array with the removed item and its index.\r\n     * @fires remove\r\n     */\r\n    _remove(subject) {\r\n        let index, id, item;\r\n        let itemDoesNotExist = false;\r\n        const idProperty = this._idProperty;\r\n        if (typeof subject == 'string') {\r\n            id = subject;\r\n            item = this._itemMap.get(id);\r\n            itemDoesNotExist = !item;\r\n            if (item) {\r\n                index = this._items.indexOf(item);\r\n            }\r\n        }\r\n        else if (typeof subject == 'number') {\r\n            index = subject;\r\n            item = this._items[index];\r\n            itemDoesNotExist = !item;\r\n            if (item) {\r\n                id = item[idProperty];\r\n            }\r\n        }\r\n        else {\r\n            item = subject;\r\n            id = item[idProperty];\r\n            index = this._items.indexOf(item);\r\n            itemDoesNotExist = (index == -1 || !this._itemMap.get(id));\r\n        }\r\n        if (itemDoesNotExist) {\r\n            /**\r\n             * Item not found.\r\n             *\r\n             * @error collection-remove-404\r\n             */\r\n            throw new CKEditorError('collection-remove-404', this);\r\n        }\r\n        this._items.splice(index, 1);\r\n        this._itemMap.delete(id);\r\n        const externalItem = this._bindToInternalToExternalMap.get(item);\r\n        this._bindToInternalToExternalMap.delete(item);\r\n        this._bindToExternalToInternalMap.delete(externalItem);\r\n        this.fire('remove', item, index);\r\n        return [item, index];\r\n    }\r\n    /**\r\n     * Iterable interface.\r\n     */\r\n    [Symbol.iterator]() {\r\n        return this._items[Symbol.iterator]();\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/first\r\n */\r\n/**\r\n * Returns first item of the given `iterator`.\r\n */\r\nexport default function first(iterator) {\r\n    const iteratorItem = iterator.next();\r\n    if (iteratorItem.done) {\r\n        return null;\r\n    }\r\n    return iteratorItem.value;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/* global setTimeout, clearTimeout */\r\n/**\r\n * @module utils/focustracker\r\n */\r\nimport DomEmitterMixin from './dom/emittermixin';\r\nimport ObservableMixin from './observablemixin';\r\nimport CKEditorError from './ckeditorerror';\r\n/**\r\n * Allows observing a group of `Element`s whether at least one of them is focused.\r\n *\r\n * Used by the {@link module:core/editor/editor~Editor} in order to track whether the focus is still within the application,\r\n * or were used outside of its UI.\r\n *\r\n * **Note** `focus` and `blur` listeners use event capturing, so it is only needed to register wrapper `Element`\r\n * which contain other `focusable` elements. But note that this wrapper element has to be focusable too\r\n * (have e.g. `tabindex=\"-1\"`).\r\n *\r\n * Check out the {@glink framework/deep-dive/ui/focus-tracking \"Deep dive into focus tracking\"} guide to learn more.\r\n */\r\nexport default class FocusTracker extends DomEmitterMixin(ObservableMixin()) {\r\n    constructor() {\r\n        super();\r\n        /**\r\n         * List of registered elements.\r\n         */\r\n        this._elements = new Set();\r\n        /**\r\n         * Event loop timeout.\r\n         */\r\n        this._nextEventLoopTimeout = null;\r\n        this.set('isFocused', false);\r\n        this.set('focusedElement', null);\r\n    }\r\n    /**\r\n     * Starts tracking the specified element.\r\n     */\r\n    add(element) {\r\n        if (this._elements.has(element)) {\r\n            /**\r\n             * This element is already tracked by {@link module:utils/focustracker~FocusTracker}.\r\n             *\r\n             * @error focustracker-add-element-already-exist\r\n             */\r\n            throw new CKEditorError('focustracker-add-element-already-exist', this);\r\n        }\r\n        this.listenTo(element, 'focus', () => this._focus(element), { useCapture: true });\r\n        this.listenTo(element, 'blur', () => this._blur(), { useCapture: true });\r\n        this._elements.add(element);\r\n    }\r\n    /**\r\n     * Stops tracking the specified element and stops listening on this element.\r\n     */\r\n    remove(element) {\r\n        if (element === this.focusedElement) {\r\n            this._blur();\r\n        }\r\n        if (this._elements.has(element)) {\r\n            this.stopListening(element);\r\n            this._elements.delete(element);\r\n        }\r\n    }\r\n    /**\r\n     * Destroys the focus tracker by:\r\n     * - Disabling all event listeners attached to tracked elements.\r\n     * - Removing all tracked elements that were previously added.\r\n     */\r\n    destroy() {\r\n        this.stopListening();\r\n    }\r\n    /**\r\n     * Stores currently focused element and set {@link #isFocused} as `true`.\r\n     */\r\n    _focus(element) {\r\n        clearTimeout(this._nextEventLoopTimeout);\r\n        this.focusedElement = element;\r\n        this.isFocused = true;\r\n    }\r\n    /**\r\n     * Clears currently focused element and set {@link #isFocused} as `false`.\r\n     * This method uses `setTimeout` to change order of fires `blur` and `focus` events.\r\n     */\r\n    _blur() {\r\n        clearTimeout(this._nextEventLoopTimeout);\r\n        this._nextEventLoopTimeout = setTimeout(() => {\r\n            this.focusedElement = null;\r\n            this.isFocused = false;\r\n        }, 0);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/keystrokehandler\r\n */\r\nimport DomEmitterMixin from './dom/emittermixin';\r\nimport { getCode, parseKeystroke } from './keyboard';\r\n/**\r\n * Keystroke handler allows registering callbacks for given keystrokes.\r\n *\r\n * The most frequent use of this class is through the {@link module:core/editor/editor~Editor#keystrokes `editor.keystrokes`}\r\n * property. It allows listening to keystrokes executed in the editing view:\r\n *\r\n * ```ts\r\n * editor.keystrokes.set( 'Ctrl+A', ( keyEvtData, cancel ) => {\r\n * \tconsole.log( 'Ctrl+A has been pressed' );\r\n * \tcancel();\r\n * } );\r\n * ```\r\n *\r\n * However, this utility class can be used in various part of the UI. For instance, a certain {@link module:ui/view~View}\r\n * can use it like this:\r\n *\r\n * ```ts\r\n * class MyView extends View {\r\n * \tconstructor() {\r\n * \t\tthis.keystrokes = new KeystrokeHandler();\r\n *\r\n * \t\tthis.keystrokes.set( 'tab', handleTabKey );\r\n * \t}\r\n *\r\n * \trender() {\r\n * \t\tsuper.render();\r\n *\r\n * \t\tthis.keystrokes.listenTo( this.element );\r\n * \t}\r\n * }\r\n * ```\r\n *\r\n * That keystroke handler will listen to `keydown` events fired in this view's main element.\r\n *\r\n */\r\nexport default class KeystrokeHandler {\r\n    /**\r\n     * Creates an instance of the keystroke handler.\r\n     */\r\n    constructor() {\r\n        this._listener = new (DomEmitterMixin())();\r\n    }\r\n    /**\r\n     * Starts listening for `keydown` events from a given emitter.\r\n     */\r\n    listenTo(emitter) {\r\n        // The #_listener works here as a kind of dispatcher. It groups the events coming from the same\r\n        // keystroke so the listeners can be attached to them with different priorities.\r\n        //\r\n        // E.g. all the keystrokes with the `keyCode` of 42 coming from the `emitter` are propagated\r\n        // as a `_keydown:42` event by the `_listener`. If there's a callback created by the `set`\r\n        // method for this 42 keystroke, it listens to the `_listener#_keydown:42` event only and interacts\r\n        // only with other listeners of this particular event, thus making it possible to prioritize\r\n        // the listeners and safely cancel execution, when needed. Instead of duplicating the Emitter logic,\r\n        // the KeystrokeHandler re–uses it to do its job.\r\n        this._listener.listenTo(emitter, 'keydown', (evt, keyEvtData) => {\r\n            this._listener.fire('_keydown:' + getCode(keyEvtData), keyEvtData);\r\n        });\r\n    }\r\n    /**\r\n     * Registers a handler for the specified keystroke.\r\n     *\r\n     * @param keystroke Keystroke defined in a format accepted by\r\n     * the {@link module:utils/keyboard~parseKeystroke} function.\r\n     * @param callback A function called with the\r\n     * {@link module:engine/view/observer/keyobserver~KeyEventData key event data} object and\r\n     * a helper function to call both `preventDefault()` and `stopPropagation()` on the underlying event.\r\n     * @param options Additional options.\r\n     * @param options.priority The priority of the keystroke\r\n     * callback. The higher the priority value the sooner the callback will be executed. Keystrokes having the same priority\r\n     * are called in the order they were added.\r\n     */\r\n    set(keystroke, callback, options = {}) {\r\n        const keyCode = parseKeystroke(keystroke);\r\n        const priority = options.priority;\r\n        // Execute the passed callback on KeystrokeHandler#_keydown.\r\n        // TODO: https://github.com/ckeditor/ckeditor5-utils/issues/144\r\n        this._listener.listenTo(this._listener, '_keydown:' + keyCode, (evt, keyEvtData) => {\r\n            callback(keyEvtData, () => {\r\n                // Stop the event in the DOM: no listener in the web page\r\n                // will be triggered by this event.\r\n                keyEvtData.preventDefault();\r\n                keyEvtData.stopPropagation();\r\n                // Stop the event in the KeystrokeHandler: no more callbacks\r\n                // will be executed for this keystroke.\r\n                evt.stop();\r\n            });\r\n            // Mark this keystroke as handled by the callback. See: #press.\r\n            evt.return = true;\r\n        }, { priority });\r\n    }\r\n    /**\r\n     * Triggers a keystroke handler for a specified key combination, if such a keystroke was {@link #set defined}.\r\n     *\r\n     * @param keyEvtData Key event data.\r\n     * @returns Whether the keystroke was handled.\r\n     */\r\n    press(keyEvtData) {\r\n        return !!this._listener.fire('_keydown:' + getCode(keyEvtData), keyEvtData);\r\n    }\r\n    /**\r\n     * Stops listening to `keydown` events from the given emitter.\r\n     */\r\n    stopListening(emitter) {\r\n        this._listener.stopListening(emitter);\r\n    }\r\n    /**\r\n     * Destroys the keystroke handler.\r\n     */\r\n    destroy() {\r\n        this.stopListening();\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/tomap\r\n */\r\nimport objectToMap from './objecttomap';\r\nimport isIterable from './isiterable';\r\n/**\r\n * Transforms object or iterable to map. Iterable needs to be in the format acceptable by the `Map` constructor.\r\n *\r\n * ```ts\r\n * map = toMap( { 'foo': 1, 'bar': 2 } );\r\n * map = toMap( [ [ 'foo', 1 ], [ 'bar', 2 ] ] );\r\n * map = toMap( anotherMap );\r\n * ```\r\n *\r\n * @param data Object or iterable to transform.\r\n * @returns Map created from data.\r\n */\r\nexport default function toMap(data) {\r\n    if (isIterable(data)) {\r\n        return new Map(data);\r\n    }\r\n    else {\r\n        return objectToMap(data);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/objecttomap\r\n */\r\n/**\r\n * Transforms object to map.\r\n *\r\n * ```ts\r\n * const map = objectToMap( { 'foo': 1, 'bar': 2 } );\r\n * map.get( 'foo' ); // 1\r\n * ```\r\n *\r\n * **Note**: For mixed data (`Object` or `Iterable`) there's a dedicated {@link module:utils/tomap~toMap} function.\r\n *\r\n * @param obj Object to transform.\r\n * @returns Map created from object.\r\n */\r\nexport default function objectToMap(obj) {\r\n    const map = new Map();\r\n    for (const key in obj) {\r\n        map.set(key, obj[key]);\r\n    }\r\n    return map;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/delay\r\n */\r\n/* globals setTimeout, clearTimeout */\r\n/**\r\n * Returns a function wrapper that will trigger a function after a specified wait time.\r\n * The timeout can be canceled by calling the cancel function on the returned wrapped function.\r\n *\r\n * @param func The function to wrap.\r\n * @param wait The timeout in ms.\r\n */\r\nexport default function delay(func, wait) {\r\n    let timer;\r\n    function delayed(...args) {\r\n        delayed.cancel();\r\n        timer = setTimeout(() => func(...args), wait);\r\n    }\r\n    delayed.cancel = () => {\r\n        clearTimeout(timer);\r\n    };\r\n    return delayed;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * Set of utils to handle unicode characters.\r\n *\r\n * @module utils/unicode\r\n */\r\n/**\r\n * Checks whether given `character` is a combining mark.\r\n *\r\n * @param character Character to check.\r\n */\r\nexport function isCombiningMark(character) {\r\n    // eslint-disable-next-line no-misleading-character-class\r\n    return !!character && character.length == 1 && /[\\u0300-\\u036f\\u1ab0-\\u1aff\\u1dc0-\\u1dff\\u20d0-\\u20ff\\ufe20-\\ufe2f]/.test(character);\r\n}\r\n/**\r\n * Checks whether given `character` is a high half of surrogate pair.\r\n *\r\n * Using UTF-16 terminology, a surrogate pair denotes UTF-16 character using two UTF-8 characters. The surrogate pair\r\n * consist of high surrogate pair character followed by low surrogate pair character.\r\n *\r\n * @param character Character to check.\r\n */\r\nexport function isHighSurrogateHalf(character) {\r\n    return !!character && character.length == 1 && /[\\ud800-\\udbff]/.test(character);\r\n}\r\n/**\r\n * Checks whether given `character` is a low half of surrogate pair.\r\n *\r\n * Using UTF-16 terminology, a surrogate pair denotes UTF-16 character using two UTF-8 characters. The surrogate pair\r\n * consist of high surrogate pair character followed by low surrogate pair character.\r\n *\r\n * @param character Character to check.\r\n */\r\nexport function isLowSurrogateHalf(character) {\r\n    return !!character && character.length == 1 && /[\\udc00-\\udfff]/.test(character);\r\n}\r\n/**\r\n * Checks whether given offset in a string is inside a surrogate pair (between two surrogate halves).\r\n *\r\n * @param string String to check.\r\n * @param offset Offset to check.\r\n */\r\nexport function isInsideSurrogatePair(string, offset) {\r\n    return isHighSurrogateHalf(string.charAt(offset - 1)) && isLowSurrogateHalf(string.charAt(offset));\r\n}\r\n/**\r\n * Checks whether given offset in a string is between base character and combining mark or between two combining marks.\r\n *\r\n * @param string String to check.\r\n * @param offset Offset to check.\r\n */\r\nexport function isInsideCombinedSymbol(string, offset) {\r\n    return isCombiningMark(string.charAt(offset));\r\n}\r\nconst EMOJI_PATTERN = buildEmojiRegexp();\r\n/**\r\n * Checks whether given offset in a string is inside multi-character emoji sequence.\r\n *\r\n * @param string String to check.\r\n * @param offset Offset to check.\r\n */\r\nexport function isInsideEmojiSequence(string, offset) {\r\n    const matches = String(string).matchAll(EMOJI_PATTERN);\r\n    return Array.from(matches).some(match => match.index < offset && offset < match.index + match[0].length);\r\n}\r\nfunction buildEmojiRegexp() {\r\n    const parts = [\r\n        // Emoji Tag Sequence (ETS)\r\n        /\\p{Emoji}[\\u{E0020}-\\u{E007E}]+\\u{E007F}/u,\r\n        // Emoji Keycap Sequence\r\n        /\\p{Emoji}\\u{FE0F}?\\u{20E3}/u,\r\n        // Emoji Presentation Sequence\r\n        /\\p{Emoji}\\u{FE0F}/u,\r\n        // Single-Character Emoji / Emoji Modifier Sequence\r\n        /(?=\\p{General_Category=Other_Symbol})\\p{Emoji}\\p{Emoji_Modifier}*/u\r\n    ];\r\n    const flagSequence = /\\p{Regional_Indicator}{2}/u.source;\r\n    const emoji = '(?:' + parts.map(part => part.source).join('|') + ')';\r\n    const sequence = `${flagSequence}|${emoji}(?:\\u{200D}${emoji})*`;\r\n    return new RegExp(sequence, 'ug');\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module core/plugin\r\n */\r\n/* eslint-disable @typescript-eslint/no-invalid-void-type */\r\nimport { ObservableMixin } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * The base class for CKEditor plugin classes.\r\n */\r\nexport default class Plugin extends ObservableMixin() {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super();\r\n        /**\r\n         * Holds identifiers for {@link #forceDisabled} mechanism.\r\n         */\r\n        this._disableStack = new Set();\r\n        this.editor = editor;\r\n        this.set('isEnabled', true);\r\n    }\r\n    /**\r\n     * Disables the plugin.\r\n     *\r\n     * Plugin may be disabled by multiple features or algorithms (at once). When disabling a plugin, unique id should be passed\r\n     * (e.g. feature name). The same identifier should be used when {@link #clearForceDisabled enabling back} the plugin.\r\n     * The plugin becomes enabled only after all features {@link #clearForceDisabled enabled it back}.\r\n     *\r\n     * Disabling and enabling a plugin:\r\n     *\r\n     * ```ts\r\n     * plugin.isEnabled; // -> true\r\n     * plugin.forceDisabled( 'MyFeature' );\r\n     * plugin.isEnabled; // -> false\r\n     * plugin.clearForceDisabled( 'MyFeature' );\r\n     * plugin.isEnabled; // -> true\r\n     * ```\r\n     *\r\n     * Plugin disabled by multiple features:\r\n     *\r\n     * ```ts\r\n     * plugin.forceDisabled( 'MyFeature' );\r\n     * plugin.forceDisabled( 'OtherFeature' );\r\n     * plugin.clearForceDisabled( 'MyFeature' );\r\n     * plugin.isEnabled; // -> false\r\n     * plugin.clearForceDisabled( 'OtherFeature' );\r\n     * plugin.isEnabled; // -> true\r\n     * ```\r\n     *\r\n     * Multiple disabling with the same identifier is redundant:\r\n     *\r\n     * ```ts\r\n     * plugin.forceDisabled( 'MyFeature' );\r\n     * plugin.forceDisabled( 'MyFeature' );\r\n     * plugin.clearForceDisabled( 'MyFeature' );\r\n     * plugin.isEnabled; // -> true\r\n     * ```\r\n     *\r\n     * **Note:** some plugins or algorithms may have more complex logic when it comes to enabling or disabling certain plugins,\r\n     * so the plugin might be still disabled after {@link #clearForceDisabled} was used.\r\n     *\r\n     * @param id Unique identifier for disabling. Use the same id when {@link #clearForceDisabled enabling back} the plugin.\r\n     */\r\n    forceDisabled(id) {\r\n        this._disableStack.add(id);\r\n        if (this._disableStack.size == 1) {\r\n            this.on('set:isEnabled', forceDisable, { priority: 'highest' });\r\n            this.isEnabled = false;\r\n        }\r\n    }\r\n    /**\r\n     * Clears forced disable previously set through {@link #forceDisabled}. See {@link #forceDisabled}.\r\n     *\r\n     * @param id Unique identifier, equal to the one passed in {@link #forceDisabled} call.\r\n     */\r\n    clearForceDisabled(id) {\r\n        this._disableStack.delete(id);\r\n        if (this._disableStack.size == 0) {\r\n            this.off('set:isEnabled', forceDisable);\r\n            this.isEnabled = true;\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        this.stopListening();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get isContextPlugin() {\r\n        return false;\r\n    }\r\n}\r\n/**\r\n * Helper function that forces plugin to be disabled.\r\n */\r\nfunction forceDisable(evt) {\r\n    evt.return = false;\r\n    evt.stop();\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/viewcollection\r\n */\r\nimport { CKEditorError, Collection } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Collects {@link module:ui/view~View} instances.\r\n *\r\n * ```ts\r\n * const parentView = new ParentView( locale );\r\n * const collection = new ViewCollection( locale );\r\n *\r\n * collection.setParent( parentView.element );\r\n *\r\n * const viewA = new ChildView( locale );\r\n * const viewB = new ChildView( locale );\r\n * ```\r\n *\r\n * View collection renders and manages view {@link module:ui/view~View#element elements}:\r\n *\r\n * ```ts\r\n * collection.add( viewA );\r\n * collection.add( viewB );\r\n *\r\n * console.log( parentView.element.firsChild ); // -> viewA.element\r\n * console.log( parentView.element.lastChild ); // -> viewB.element\r\n * ```\r\n *\r\n * It {@link module:ui/viewcollection~ViewCollection#delegate propagates} DOM events too:\r\n *\r\n * ```ts\r\n * // Delegate #click and #keydown events from viewA and viewB to the parentView.\r\n * collection.delegate( 'click' ).to( parentView );\r\n *\r\n * parentView.on( 'click', ( evt ) => {\r\n * \tconsole.log( `${ evt.source } has been clicked.` );\r\n * } );\r\n *\r\n * // This event will be delegated to the parentView.\r\n * viewB.fire( 'click' );\r\n * ```\r\n *\r\n * **Note**: A view collection can be used directly in the {@link module:ui/template~TemplateDefinition definition}\r\n * of a {@link module:ui/template~Template template}.\r\n */\r\nexport default class ViewCollection extends Collection {\r\n    /**\r\n     * Creates a new instance of the {@link module:ui/viewcollection~ViewCollection}.\r\n     *\r\n     * @param initialItems The initial items of the collection.\r\n     */\r\n    constructor(initialItems = []) {\r\n        super(initialItems, {\r\n            // An #id Number attribute should be legal and not break the `ViewCollection` instance.\r\n            // https://github.com/ckeditor/ckeditor5-ui/issues/93\r\n            idProperty: 'viewUid'\r\n        });\r\n        // Handle {@link module:ui/view~View#element} in DOM when a new view is added to the collection.\r\n        this.on('add', (evt, view, index) => {\r\n            this._renderViewIntoCollectionParent(view, index);\r\n        });\r\n        // Handle {@link module:ui/view~View#element} in DOM when a view is removed from the collection.\r\n        this.on('remove', (evt, view) => {\r\n            if (view.element && this._parentElement) {\r\n                view.element.remove();\r\n            }\r\n        });\r\n        this._parentElement = null;\r\n    }\r\n    /**\r\n     * Destroys the view collection along with child views.\r\n     * See the view {@link module:ui/view~View#destroy} method.\r\n     */\r\n    destroy() {\r\n        this.map(view => view.destroy());\r\n    }\r\n    /**\r\n     * Sets the parent HTML element of this collection. When parent is set, {@link #add adding} and\r\n     * {@link #remove removing} views in the collection synchronizes their\r\n     * {@link module:ui/view~View#element elements} in the parent element.\r\n     *\r\n     * @param element A new parent element.\r\n     */\r\n    setParent(elementOrDocFragment) {\r\n        this._parentElement = elementOrDocFragment;\r\n        // Take care of the initial collection items passed to the constructor.\r\n        for (const view of this) {\r\n            this._renderViewIntoCollectionParent(view);\r\n        }\r\n    }\r\n    /**\r\n     * Delegates selected events coming from within views in the collection to any\r\n     * {@link module:utils/emittermixin~Emitter}.\r\n     *\r\n     * For the following views and collection:\r\n     *\r\n     * ```ts\r\n     * const viewA = new View();\r\n     * const viewB = new View();\r\n     * const viewC = new View();\r\n     *\r\n     * const views = parentView.createCollection();\r\n     *\r\n     * views.delegate( 'eventX' ).to( viewB );\r\n     * views.delegate( 'eventX', 'eventY' ).to( viewC );\r\n     *\r\n     * views.add( viewA );\r\n     * ```\r\n     *\r\n     * the `eventX` is delegated (fired by) `viewB` and `viewC` along with `customData`:\r\n     *\r\n     * ```ts\r\n     * viewA.fire( 'eventX', customData );\r\n     * ```\r\n     *\r\n     * and `eventY` is delegated (fired by) `viewC` along with `customData`:\r\n     *\r\n     * ```ts\r\n     * viewA.fire( 'eventY', customData );\r\n     * ```\r\n     *\r\n     * See {@link module:utils/emittermixin~Emitter#delegate}.\r\n     *\r\n     * @param events {@link module:ui/view~View} event names to be delegated to another\r\n     * {@link module:utils/emittermixin~Emitter}.\r\n     * @returns Object with `to` property, a function which accepts the destination\r\n     * of {@link module:utils/emittermixin~Emitter#delegate delegated} events.\r\n     */\r\n    delegate(...events) {\r\n        if (!events.length || !isStringArray(events)) {\r\n            /**\r\n             * All event names must be strings.\r\n             *\r\n             * @error ui-viewcollection-delegate-wrong-events\r\n             */\r\n            throw new CKEditorError('ui-viewcollection-delegate-wrong-events', this);\r\n        }\r\n        return {\r\n            to: dest => {\r\n                // Activate delegating on existing views in this collection.\r\n                for (const view of this) {\r\n                    for (const evtName of events) {\r\n                        view.delegate(evtName).to(dest);\r\n                    }\r\n                }\r\n                // Activate delegating on future views in this collection.\r\n                this.on('add', (evt, view) => {\r\n                    for (const evtName of events) {\r\n                        view.delegate(evtName).to(dest);\r\n                    }\r\n                });\r\n                // Deactivate delegating when view is removed from this collection.\r\n                this.on('remove', (evt, view) => {\r\n                    for (const evtName of events) {\r\n                        view.stopDelegating(evtName, dest);\r\n                    }\r\n                });\r\n            }\r\n        };\r\n    }\r\n    /**\r\n     * This method {@link module:ui/view~View#render renders} a new view added to the collection.\r\n     *\r\n     * If the {@link #_parentElement parent element} of the collection is set, this method also adds\r\n     * the view's {@link module:ui/view~View#element} as a child of the parent in DOM at a specified index.\r\n     *\r\n     * **Note**: If index is not specified, the view's element is pushed as the last child\r\n     * of the parent element.\r\n     *\r\n     * @param view A new view added to the collection.\r\n     * @param index An index the view holds in the collection. When not specified,\r\n     * the view is added at the end.\r\n     */\r\n    _renderViewIntoCollectionParent(view, index) {\r\n        if (!view.isRendered) {\r\n            view.render();\r\n        }\r\n        if (view.element && this._parentElement) {\r\n            this._parentElement.insertBefore(view.element, this._parentElement.children[index]);\r\n        }\r\n    }\r\n    /**\r\n     * Removes a child view from the collection. If the {@link #setParent parent element} of the\r\n     * collection has been set, the {@link module:ui/view~View#element element} of the view is also removed\r\n     * in DOM, reflecting the order of the collection.\r\n     *\r\n     * See the {@link #add} method.\r\n     *\r\n     * @param subject The view to remove, its id or index in the collection.\r\n     * @returns The removed view.\r\n     */\r\n    remove(subject) {\r\n        return super.remove(subject);\r\n    }\r\n}\r\n/**\r\n * Check if all entries of the array are of `String` type.\r\n *\r\n * @param arr An array to be checked.\r\n */\r\nfunction isStringArray(arr) {\r\n    return arr.every(a => typeof a == 'string');\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/template\r\n */\r\n/* global document */\r\nimport View from './view';\r\nimport ViewCollection from './viewcollection';\r\nimport { CKEditorError, EmitterMixin, isNode, toArray } from '@ckeditor/ckeditor5-utils';\r\nimport { isObject, cloneDeepWith } from 'lodash-es';\r\nconst xhtmlNs = 'http://www.w3.org/1999/xhtml';\r\n/**\r\n * A basic Template class. It renders a DOM HTML element or text from a\r\n * {@link module:ui/template~TemplateDefinition definition} and supports element attributes, children,\r\n * bindings to {@link module:utils/observablemixin~Observable observables} and DOM event propagation.\r\n *\r\n * A simple template can look like this:\r\n *\r\n * ```ts\r\n * const bind = Template.bind( observable, emitter );\r\n *\r\n * new Template( {\r\n * \ttag: 'p',\r\n * \tattributes: {\r\n * \t\tclass: 'foo',\r\n * \t\tstyle: {\r\n * \t\t\tbackgroundColor: 'yellow'\r\n * \t\t}\r\n * \t},\r\n * \ton: {\r\n * \t\tclick: bind.to( 'clicked' )\r\n * \t},\r\n * \tchildren: [\r\n * \t\t'A paragraph.'\r\n * \t]\r\n * } ).render();\r\n * ```\r\n *\r\n * and it will render the following HTML element:\r\n *\r\n * ```html\r\n * <p class=\"foo\" style=\"background-color: yellow;\">A paragraph.</p>\r\n * ```\r\n *\r\n * Additionally, the `observable` will always fire `clicked` upon clicking `<p>` in the DOM.\r\n *\r\n * See {@link module:ui/template~TemplateDefinition} to know more about templates and complex\r\n * template definitions.\r\n */\r\nexport default class Template extends EmitterMixin() {\r\n    /**\r\n     * Creates an instance of the {@link ~Template} class.\r\n     *\r\n     * @param def The definition of the template.\r\n     */\r\n    constructor(def) {\r\n        super();\r\n        Object.assign(this, normalize(clone(def)));\r\n        this._isRendered = false;\r\n        this._revertData = null;\r\n    }\r\n    /**\r\n     * Renders a DOM Node (an HTML element or text) out of the template.\r\n     *\r\n     * ```ts\r\n     * const domNode = new Template( { ... } ).render();\r\n     * ```\r\n     *\r\n     * See: {@link #apply}.\r\n     */\r\n    render() {\r\n        const node = this._renderNode({\r\n            intoFragment: true\r\n        });\r\n        this._isRendered = true;\r\n        return node;\r\n    }\r\n    /**\r\n     * Applies the template to an existing DOM Node, either HTML element or text.\r\n     *\r\n     * **Note:** No new DOM nodes will be created. Applying extends:\r\n     *\r\n     * {@link module:ui/template~TemplateDefinition attributes},\r\n     * {@link module:ui/template~TemplateDefinition event listeners}, and\r\n     * `textContent` of {@link module:ui/template~TemplateDefinition children} only.\r\n     *\r\n     * **Note:** Existing `class` and `style` attributes are extended when a template\r\n     * is applied to an HTML element, while other attributes and `textContent` are overridden.\r\n     *\r\n     * **Note:** The process of applying a template can be easily reverted using the\r\n     * {@link module:ui/template~Template#revert} method.\r\n     *\r\n     * ```ts\r\n     * const element = document.createElement( 'div' );\r\n     * const observable = new Model( { divClass: 'my-div' } );\r\n     * const emitter = Object.create( EmitterMixin );\r\n     * const bind = Template.bind( observable, emitter );\r\n     *\r\n     * new Template( {\r\n     * \tattributes: {\r\n     * \t\tid: 'first-div',\r\n     * \t\tclass: bind.to( 'divClass' )\r\n     * \t},\r\n     * \ton: {\r\n     * \t\tclick: bind( 'elementClicked' ) // Will be fired by the observable.\r\n     * \t},\r\n     * \tchildren: [\r\n     * \t\t'Div text.'\r\n     * \t]\r\n     * } ).apply( element );\r\n     *\r\n     * console.log( element.outerHTML ); // -> '<div id=\"first-div\" class=\"my-div\"></div>'\r\n     * ```\r\n     *\r\n     * @see module:ui/template~Template#render\r\n     * @see module:ui/template~Template#revert\r\n     * @param node Root node for the template to apply.\r\n     */\r\n    apply(node) {\r\n        this._revertData = getEmptyRevertData();\r\n        this._renderNode({\r\n            node,\r\n            intoFragment: false,\r\n            isApplying: true,\r\n            revertData: this._revertData\r\n        });\r\n        return node;\r\n    }\r\n    /**\r\n     * Reverts a template {@link module:ui/template~Template#apply applied} to a DOM node.\r\n     *\r\n     * @param node The root node for the template to revert. In most of the cases, it is the\r\n     * same node used by {@link module:ui/template~Template#apply}.\r\n     */\r\n    revert(node) {\r\n        if (!this._revertData) {\r\n            /**\r\n             * Attempting to revert a template which has not been applied yet.\r\n             *\r\n             * @error ui-template-revert-not-applied\r\n             */\r\n            throw new CKEditorError('ui-template-revert-not-applied', [this, node]);\r\n        }\r\n        this._revertTemplateFromNode(node, this._revertData);\r\n    }\r\n    /**\r\n     * Returns an iterator which traverses the template in search of {@link module:ui/view~View}\r\n     * instances and returns them one by one.\r\n     *\r\n     * ```ts\r\n     * const viewFoo = new View();\r\n     * const viewBar = new View();\r\n     * const viewBaz = new View();\r\n     * const template = new Template( {\r\n     * \ttag: 'div',\r\n     * \tchildren: [\r\n     * \t\tviewFoo,\r\n     * \t\t{\r\n     * \t\t\ttag: 'div',\r\n     * \t\t\tchildren: [\r\n     * \t\t\t\tviewBar\r\n     * \t\t\t]\r\n     * \t\t},\r\n     * \t\tviewBaz\r\n     * \t]\r\n     * } );\r\n     *\r\n     * // Logs: viewFoo, viewBar, viewBaz\r\n     * for ( const view of template.getViews() ) {\r\n     * \tconsole.log( view );\r\n     * }\r\n     * ```\r\n     */\r\n    *getViews() {\r\n        function* search(def) {\r\n            if (def.children) {\r\n                for (const child of def.children) {\r\n                    if (isView(child)) {\r\n                        yield child;\r\n                    }\r\n                    else if (isTemplate(child)) {\r\n                        yield* search(child);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        yield* search(this);\r\n    }\r\n    /**\r\n     * An entry point to the interface which binds DOM nodes to\r\n     * {@link module:utils/observablemixin~Observable observables}.\r\n     * There are two types of bindings:\r\n     *\r\n     * * HTML element attributes or text `textContent` synchronized with attributes of an\r\n     * {@link module:utils/observablemixin~Observable}. Learn more about {@link module:ui/template~BindChain#to}\r\n     * and {@link module:ui/template~BindChain#if}.\r\n     *\r\n     * ```ts\r\n     * const bind = Template.bind( observable, emitter );\r\n     *\r\n     * new Template( {\r\n     * \tattributes: {\r\n     * \t\t// Binds the element \"class\" attribute to observable#classAttribute.\r\n     * \t\tclass: bind.to( 'classAttribute' )\r\n     * \t}\r\n     * } ).render();\r\n     * ```\r\n     *\r\n     * * DOM events fired on HTML element propagated through\r\n     * {@link module:utils/observablemixin~Observable}. Learn more about {@link module:ui/template~BindChain#to}.\r\n     *\r\n     * ```ts\r\n     * const bind = Template.bind( observable, emitter );\r\n     *\r\n     * new Template( {\r\n     * \ton: {\r\n     * \t\t// Will be fired by the observable.\r\n     * \t\tclick: bind( 'elementClicked' )\r\n     * \t}\r\n     * } ).render();\r\n     * ```\r\n     *\r\n     * Also see {@link module:ui/view~View#bindTemplate}.\r\n     *\r\n     * @param observable An observable which provides boundable attributes.\r\n     * @param emitter An emitter that listens to observable attribute\r\n     * changes or DOM Events (depending on the kind of the binding). Usually, a {@link module:ui/view~View} instance.\r\n     */\r\n    static bind(observable, emitter) {\r\n        return {\r\n            to(eventNameOrFunctionOrAttribute, callback) {\r\n                return new TemplateToBinding({\r\n                    eventNameOrFunction: eventNameOrFunctionOrAttribute,\r\n                    attribute: eventNameOrFunctionOrAttribute,\r\n                    observable, emitter, callback\r\n                });\r\n            },\r\n            if(attribute, valueIfTrue, callback) {\r\n                return new TemplateIfBinding({\r\n                    observable, emitter, attribute, valueIfTrue, callback\r\n                });\r\n            }\r\n        };\r\n    }\r\n    /**\r\n     * Extends an existing {@link module:ui/template~Template} instance with some additional content\r\n     * from another {@link module:ui/template~TemplateDefinition}.\r\n     *\r\n     * ```ts\r\n     * const bind = Template.bind( observable, emitter );\r\n     *\r\n     * const template = new Template( {\r\n     * \ttag: 'p',\r\n     * \tattributes: {\r\n     * \t\tclass: 'a',\r\n     * \t\tdata-x: bind.to( 'foo' )\r\n     * \t},\r\n     * \tchildren: [\r\n     * \t\t{\r\n     * \t\t\ttag: 'span',\r\n     * \t\t\tattributes: {\r\n     * \t\t\t\tclass: 'b'\r\n     * \t\t\t},\r\n     * \t\t\tchildren: [\r\n     * \t\t\t\t'Span'\r\n     * \t\t\t]\r\n     * \t\t}\r\n     * \t]\r\n     *  } );\r\n     *\r\n     * // Instance-level extension.\r\n     * Template.extend( template, {\r\n     * \tattributes: {\r\n     * \t\tclass: 'b',\r\n     * \t\tdata-x: bind.to( 'bar' )\r\n     * \t},\r\n     * \tchildren: [\r\n     * \t\t{\r\n     * \t\t\tattributes: {\r\n     * \t\t\t\tclass: 'c'\r\n     * \t\t\t}\r\n     * \t\t}\r\n     * \t]\r\n     * } );\r\n     *\r\n     * // Child extension.\r\n     * Template.extend( template.children[ 0 ], {\r\n     * \tattributes: {\r\n     * \t\tclass: 'd'\r\n     * \t}\r\n     * } );\r\n     * ```\r\n     *\r\n     * the `outerHTML` of `template.render()` is:\r\n     *\r\n     * ```html\r\n     * <p class=\"a b\" data-x=\"{ observable.foo } { observable.bar }\">\r\n     * \t<span class=\"b c d\">Span</span>\r\n     * </p>\r\n     * ```\r\n     *\r\n     * @param template An existing template instance to be extended.\r\n     * @param def Additional definition to be applied to a template.\r\n     */\r\n    static extend(template, def) {\r\n        if (template._isRendered) {\r\n            /**\r\n             * Extending a template after rendering may not work as expected. To make sure\r\n             * the {@link module:ui/template~Template.extend extending} works for an element,\r\n             * make sure it happens before {@link module:ui/template~Template#render} is called.\r\n             *\r\n             * @error template-extend-render\r\n             */\r\n            throw new CKEditorError('template-extend-render', [this, template]);\r\n        }\r\n        extendTemplate(template, normalize(clone(def)));\r\n    }\r\n    /**\r\n     * Renders a DOM Node (either an HTML element or text) out of the template.\r\n     *\r\n     * @param data Rendering data.\r\n     */\r\n    _renderNode(data) {\r\n        let isInvalid;\r\n        if (data.node) {\r\n            // When applying, a definition cannot have \"tag\" and \"text\" at the same time.\r\n            isInvalid = this.tag && this.text;\r\n        }\r\n        else {\r\n            // When rendering, a definition must have either \"tag\" or \"text\": XOR( this.tag, this.text ).\r\n            isInvalid = this.tag ? this.text : !this.text;\r\n        }\r\n        if (isInvalid) {\r\n            /**\r\n             * Node definition cannot have the \"tag\" and \"text\" properties at the same time.\r\n             * Node definition must have either \"tag\" or \"text\" when rendering a new Node.\r\n             *\r\n             * @error ui-template-wrong-syntax\r\n             */\r\n            throw new CKEditorError('ui-template-wrong-syntax', this);\r\n        }\r\n        if (this.text) {\r\n            return this._renderText(data);\r\n        }\r\n        else {\r\n            return this._renderElement(data);\r\n        }\r\n    }\r\n    /**\r\n     * Renders an HTML element out of the template.\r\n     *\r\n     * @param data Rendering data.\r\n     */\r\n    _renderElement(data) {\r\n        let node = data.node;\r\n        if (!node) {\r\n            node = data.node = document.createElementNS(this.ns || xhtmlNs, this.tag);\r\n        }\r\n        this._renderAttributes(data);\r\n        this._renderElementChildren(data);\r\n        this._setUpListeners(data);\r\n        return node;\r\n    }\r\n    /**\r\n     * Renders a text node out of {@link module:ui/template~Template#text}.\r\n     *\r\n     * @param data Rendering data.\r\n     */\r\n    _renderText(data) {\r\n        let node = data.node;\r\n        // Save the original textContent to revert it in #revert().\r\n        if (node) {\r\n            data.revertData.text = node.textContent;\r\n        }\r\n        else {\r\n            node = data.node = document.createTextNode('');\r\n        }\r\n        // Check if this Text Node is bound to Observable. Cases:\r\n        //\r\n        //\t\ttext: [ Template.bind( ... ).to( ... ) ]\r\n        //\r\n        //\t\ttext: [\r\n        //\t\t\t'foo',\r\n        //\t\t\tTemplate.bind( ... ).to( ... ),\r\n        //\t\t\t...\r\n        //\t\t]\r\n        //\r\n        if (hasTemplateBinding(this.text)) {\r\n            this._bindToObservable({\r\n                schema: this.text,\r\n                updater: getTextUpdater(node),\r\n                data\r\n            });\r\n        }\r\n        // Simply set text. Cases:\r\n        //\r\n        //\t\ttext: [ 'all', 'are', 'static' ]\r\n        //\r\n        //\t\ttext: [ 'foo' ]\r\n        //\r\n        else {\r\n            node.textContent = this.text.join('');\r\n        }\r\n        return node;\r\n    }\r\n    /**\r\n     * Renders HTML element attributes out of {@link module:ui/template~Template#attributes}.\r\n     *\r\n     * @param data Rendering data.\r\n     */\r\n    _renderAttributes(data) {\r\n        if (!this.attributes) {\r\n            return;\r\n        }\r\n        const node = data.node;\r\n        const revertData = data.revertData;\r\n        for (const attrName in this.attributes) {\r\n            // Current attribute value in DOM.\r\n            const domAttrValue = node.getAttribute(attrName);\r\n            // The value to be set.\r\n            const attrValue = this.attributes[attrName];\r\n            // Save revert data.\r\n            if (revertData) {\r\n                revertData.attributes[attrName] = domAttrValue;\r\n            }\r\n            // Detect custom namespace:\r\n            //\r\n            //\t\tclass: {\r\n            //\t\t\tns: 'abc',\r\n            //\t\t\tvalue: Template.bind( ... ).to( ... )\r\n            //\t\t}\r\n            //\r\n            const attrNs = isNamespaced(attrValue) ? attrValue[0].ns : null;\r\n            // Activate binding if one is found. Cases:\r\n            //\r\n            //\t\tclass: [\r\n            //\t\t\tTemplate.bind( ... ).to( ... )\r\n            //\t\t]\r\n            //\r\n            //\t\tclass: [\r\n            //\t\t\t'bar',\r\n            //\t\t\tTemplate.bind( ... ).to( ... ),\r\n            //\t\t\t'baz'\r\n            //\t\t]\r\n            //\r\n            //\t\tclass: {\r\n            //\t\t\tns: 'abc',\r\n            //\t\t\tvalue: Template.bind( ... ).to( ... )\r\n            //\t\t}\r\n            //\r\n            if (hasTemplateBinding(attrValue)) {\r\n                // Normalize attributes with additional data like namespace:\r\n                //\r\n                //\t\tclass: {\r\n                //\t\t\tns: 'abc',\r\n                //\t\t\tvalue: [ ... ]\r\n                //\t\t}\r\n                //\r\n                const valueToBind = isNamespaced(attrValue) ? attrValue[0].value : attrValue;\r\n                // Extend the original value of attributes like \"style\" and \"class\",\r\n                // don't override them.\r\n                if (revertData && shouldExtend(attrName)) {\r\n                    valueToBind.unshift(domAttrValue);\r\n                }\r\n                this._bindToObservable({\r\n                    schema: valueToBind,\r\n                    updater: getAttributeUpdater(node, attrName, attrNs),\r\n                    data\r\n                });\r\n            }\r\n            // Style attribute could be an Object so it needs to be parsed in a specific way.\r\n            //\r\n            //\t\tstyle: {\r\n            //\t\t\twidth: '100px',\r\n            //\t\t\theight: Template.bind( ... ).to( ... )\r\n            //\t\t}\r\n            //\r\n            else if (attrName == 'style' && typeof attrValue[0] !== 'string') {\r\n                this._renderStyleAttribute(attrValue[0], data);\r\n            }\r\n            // Otherwise simply set the static attribute:\r\n            //\r\n            //\t\tclass: [ 'foo' ]\r\n            //\r\n            //\t\tclass: [ 'all', 'are', 'static' ]\r\n            //\r\n            //\t\tclass: [\r\n            //\t\t\t{\r\n            //\t\t\t\tns: 'abc',\r\n            //\t\t\t\tvalue: [ 'foo' ]\r\n            //\t\t\t}\r\n            //\t\t]\r\n            //\r\n            else {\r\n                // Extend the original value of attributes like \"style\" and \"class\",\r\n                // don't override them.\r\n                if (revertData && domAttrValue && shouldExtend(attrName)) {\r\n                    attrValue.unshift(domAttrValue);\r\n                }\r\n                const value = attrValue\r\n                    // Retrieve \"values\" from:\r\n                    //\r\n                    //\t\tclass: [\r\n                    //\t\t\t{\r\n                    //\t\t\t\tns: 'abc',\r\n                    //\t\t\t\tvalue: [ ... ]\r\n                    //\t\t\t}\r\n                    //\t\t]\r\n                    //\r\n                    .map((val) => val ? (val.value || val) : val)\r\n                    // Flatten the array.\r\n                    .reduce((prev, next) => prev.concat(next), [])\r\n                    // Convert into string.\r\n                    .reduce(arrayValueReducer, '');\r\n                if (!isFalsy(value)) {\r\n                    node.setAttributeNS(attrNs, attrName, value);\r\n                }\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Renders the `style` attribute of an HTML element based on\r\n     * {@link module:ui/template~Template#attributes}.\r\n     *\r\n     * A style attribute is an object with static values:\r\n     *\r\n     * ```ts\r\n     * attributes: {\r\n     * \tstyle: {\r\n     * \t\tcolor: 'red'\r\n     * \t}\r\n     * }\r\n     * ```\r\n     *\r\n     * or values bound to {@link module:ui/model~Model} properties:\r\n     *\r\n     * ```ts\r\n     * attributes: {\r\n     * \tstyle: {\r\n     * \t\tcolor: bind.to( ... )\r\n     * \t}\r\n     * }\r\n     * ```\r\n     *\r\n     * Note: The `style` attribute is rendered without setting the namespace. It does not seem to be\r\n     * needed.\r\n     *\r\n     * @param styles Styles located in `attributes.style` of {@link module:ui/template~TemplateDefinition}.\r\n     * @param data Rendering data.\r\n     */\r\n    _renderStyleAttribute(styles, data) {\r\n        const node = data.node;\r\n        for (const styleName in styles) {\r\n            const styleValue = styles[styleName];\r\n            // Cases:\r\n            //\r\n            //\t\tstyle: {\r\n            //\t\t\tcolor: bind.to( 'attribute' )\r\n            //\t\t}\r\n            //\r\n            if (hasTemplateBinding(styleValue)) {\r\n                this._bindToObservable({\r\n                    schema: [styleValue],\r\n                    updater: getStyleUpdater(node, styleName),\r\n                    data\r\n                });\r\n            }\r\n            // Cases:\r\n            //\r\n            //\t\tstyle: {\r\n            //\t\t\tcolor: 'red'\r\n            //\t\t}\r\n            //\r\n            else {\r\n                node.style[styleName] = styleValue;\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Recursively renders HTML element's children from {@link module:ui/template~Template#children}.\r\n     *\r\n     * @param data Rendering data.\r\n     */\r\n    _renderElementChildren(data) {\r\n        const node = data.node;\r\n        const container = data.intoFragment ? document.createDocumentFragment() : node;\r\n        const isApplying = data.isApplying;\r\n        let childIndex = 0;\r\n        for (const child of this.children) {\r\n            if (isViewCollection(child)) {\r\n                if (!isApplying) {\r\n                    child.setParent(node);\r\n                    // Note: ViewCollection renders its children.\r\n                    for (const view of child) {\r\n                        container.appendChild(view.element);\r\n                    }\r\n                }\r\n            }\r\n            else if (isView(child)) {\r\n                if (!isApplying) {\r\n                    if (!child.isRendered) {\r\n                        child.render();\r\n                    }\r\n                    container.appendChild(child.element);\r\n                }\r\n            }\r\n            else if (isNode(child)) {\r\n                container.appendChild(child);\r\n            }\r\n            else {\r\n                if (isApplying) {\r\n                    const revertData = data.revertData;\r\n                    const childRevertData = getEmptyRevertData();\r\n                    revertData.children.push(childRevertData);\r\n                    child._renderNode({\r\n                        intoFragment: false,\r\n                        node: container.childNodes[childIndex++],\r\n                        isApplying: true,\r\n                        revertData: childRevertData\r\n                    });\r\n                }\r\n                else {\r\n                    container.appendChild(child.render());\r\n                }\r\n            }\r\n        }\r\n        if (data.intoFragment) {\r\n            node.appendChild(container);\r\n        }\r\n    }\r\n    /**\r\n     * Activates `on` event listeners from the {@link module:ui/template~TemplateDefinition}\r\n     * on an HTML element.\r\n     *\r\n     * @param data Rendering data.\r\n     */\r\n    _setUpListeners(data) {\r\n        if (!this.eventListeners) {\r\n            return;\r\n        }\r\n        for (const key in this.eventListeners) {\r\n            const revertBindings = this.eventListeners[key].map(schemaItem => {\r\n                const [domEvtName, domSelector] = key.split('@');\r\n                return schemaItem.activateDomEventListener(domEvtName, domSelector, data);\r\n            });\r\n            if (data.revertData) {\r\n                data.revertData.bindings.push(revertBindings);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * For a given {@link module:ui/template~TemplateValueSchema} containing {@link module:ui/template~TemplateBinding}\r\n     * activates the binding and sets its initial value.\r\n     *\r\n     * Note: {@link module:ui/template~TemplateValueSchema} can be for HTML element attributes or\r\n     * text node `textContent`.\r\n     *\r\n     * @param options Binding options.\r\n     * @param options.updater A function which updates the DOM (like attribute or text).\r\n     * @param options.data Rendering data.\r\n     */\r\n    _bindToObservable({ schema, updater, data }) {\r\n        const revertData = data.revertData;\r\n        // Set initial values.\r\n        syncValueSchemaValue(schema, updater, data);\r\n        const revertBindings = schema\r\n            // Filter \"falsy\" (false, undefined, null, '') value schema components out.\r\n            .filter(item => !isFalsy(item))\r\n            // Filter inactive bindings from schema, like static strings ('foo'), numbers (42), etc.\r\n            .filter((item) => item.observable)\r\n            // Once only the actual binding are left, let the emitter listen to observable change:attribute event.\r\n            // TODO: Reduce the number of listeners attached as many bindings may listen\r\n            // to the same observable attribute.\r\n            .map(templateBinding => templateBinding.activateAttributeListener(schema, updater, data));\r\n        if (revertData) {\r\n            revertData.bindings.push(revertBindings);\r\n        }\r\n    }\r\n    /**\r\n     * Reverts {@link module:ui/template~RenderData#revertData template data} from a node to\r\n     * return it to the original state.\r\n     *\r\n     * @param node A node to be reverted.\r\n     * @param revertData An object that stores information about what changes have been made by\r\n     * {@link #apply} to the node. See {@link module:ui/template~RenderData#revertData} for more information.\r\n     */\r\n    _revertTemplateFromNode(node, revertData) {\r\n        for (const binding of revertData.bindings) {\r\n            // Each binding may consist of several observable+observable#attribute.\r\n            // like the following has 2:\r\n            //\r\n            //\t\tclass: [\r\n            //\t\t\t'x',\r\n            //\t\t\tbind.to( 'foo' ),\r\n            //\t\t\t'y',\r\n            //\t\t\tbind.to( 'bar' )\r\n            //\t\t]\r\n            //\r\n            for (const revertBinding of binding) {\r\n                revertBinding();\r\n            }\r\n        }\r\n        if (revertData.text) {\r\n            node.textContent = revertData.text;\r\n            return;\r\n        }\r\n        const element = node;\r\n        for (const attrName in revertData.attributes) {\r\n            const attrValue = revertData.attributes[attrName];\r\n            // When the attribute has **not** been set before #apply().\r\n            if (attrValue === null) {\r\n                element.removeAttribute(attrName);\r\n            }\r\n            else {\r\n                element.setAttribute(attrName, attrValue);\r\n            }\r\n        }\r\n        for (let i = 0; i < revertData.children.length; ++i) {\r\n            this._revertTemplateFromNode(element.childNodes[i], revertData.children[i]);\r\n        }\r\n    }\r\n}\r\n/**\r\n * Describes a binding created by the {@link module:ui/template~Template.bind} interface.\r\n *\r\n * @internal\r\n */\r\nexport class TemplateBinding {\r\n    /**\r\n     * Creates an instance of the {@link module:ui/template~TemplateBinding} class.\r\n     *\r\n     * @param def The definition of the binding.\r\n     */\r\n    constructor(def) {\r\n        this.attribute = def.attribute;\r\n        this.observable = def.observable;\r\n        this.emitter = def.emitter;\r\n        this.callback = def.callback;\r\n    }\r\n    /**\r\n     * Returns the value of the binding. It is the value of the {@link module:ui/template~TemplateBinding#attribute} in\r\n     * {@link module:ui/template~TemplateBinding#observable}. The value may be processed by the\r\n     * {@link module:ui/template~TemplateBinding#callback}, if such has been passed to the binding.\r\n     *\r\n     * @param node A native DOM node, passed to the custom {@link module:ui/template~TemplateBinding#callback}.\r\n     * @returns The value of {@link module:ui/template~TemplateBinding#attribute} in\r\n     * {@link module:ui/template~TemplateBinding#observable}.\r\n     */\r\n    getValue(node) {\r\n        const value = this.observable[this.attribute];\r\n        return this.callback ? this.callback(value, node) : value;\r\n    }\r\n    /**\r\n     * Activates the listener which waits for changes of the {@link module:ui/template~TemplateBinding#attribute} in\r\n     * {@link module:ui/template~TemplateBinding#observable}, then updates the DOM with the aggregated\r\n     * value of {@link module:ui/template~TemplateValueSchema}.\r\n     *\r\n     * @param schema A full schema to generate an attribute or text in the DOM.\r\n     * @param updater A DOM updater function used to update the native DOM attribute or text.\r\n     * @param data Rendering data.\r\n     * @returns A function to sever the listener binding.\r\n     */\r\n    activateAttributeListener(schema, updater, data) {\r\n        const callback = () => syncValueSchemaValue(schema, updater, data);\r\n        this.emitter.listenTo(this.observable, `change:${this.attribute}`, callback);\r\n        // Allows revert of the listener.\r\n        return () => {\r\n            this.emitter.stopListening(this.observable, `change:${this.attribute}`, callback);\r\n        };\r\n    }\r\n}\r\n/**\r\n * Describes either:\r\n *\r\n * * a binding to an {@link module:utils/observablemixin~Observable},\r\n * * or a native DOM event binding.\r\n *\r\n * It is created by the {@link module:ui/template~BindChain#to} method.\r\n *\r\n * @internal\r\n */\r\nexport class TemplateToBinding extends TemplateBinding {\r\n    constructor(def) {\r\n        super(def);\r\n        this.eventNameOrFunction = def.eventNameOrFunction;\r\n    }\r\n    /**\r\n     * Activates the listener for the native DOM event, which when fired, is propagated by\r\n     * the {@link module:ui/template~TemplateBinding#emitter}.\r\n     *\r\n     * @param domEvtName The name of the native DOM event.\r\n     * @param domSelector The selector in the DOM to filter delegated events.\r\n     * @param data Rendering data.\r\n     * @returns A function to sever the listener binding.\r\n     */\r\n    activateDomEventListener(domEvtName, domSelector, data) {\r\n        const callback = (evt, domEvt) => {\r\n            if (!domSelector || domEvt.target.matches(domSelector)) {\r\n                if (typeof this.eventNameOrFunction == 'function') {\r\n                    this.eventNameOrFunction(domEvt);\r\n                }\r\n                else {\r\n                    this.observable.fire(this.eventNameOrFunction, domEvt);\r\n                }\r\n            }\r\n        };\r\n        this.emitter.listenTo(data.node, domEvtName, callback);\r\n        // Allows revert of the listener.\r\n        return () => {\r\n            this.emitter.stopListening(data.node, domEvtName, callback);\r\n        };\r\n    }\r\n}\r\n/**\r\n * Describes a binding to {@link module:utils/observablemixin~Observable} created by the {@link module:ui/template~BindChain#if}\r\n * method.\r\n *\r\n * @internal\r\n */\r\nexport class TemplateIfBinding extends TemplateBinding {\r\n    constructor(def) {\r\n        super(def);\r\n        this.valueIfTrue = def.valueIfTrue;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    getValue(node) {\r\n        const value = super.getValue(node);\r\n        return isFalsy(value) ? false : (this.valueIfTrue || true);\r\n    }\r\n}\r\n/**\r\n * Checks whether given {@link module:ui/template~TemplateValueSchema} contains a\r\n * {@link module:ui/template~TemplateBinding}.\r\n */\r\nfunction hasTemplateBinding(schema) {\r\n    if (!schema) {\r\n        return false;\r\n    }\r\n    // Normalize attributes with additional data like namespace:\r\n    //\r\n    //\t\tclass: {\r\n    //\t\t\tns: 'abc',\r\n    //\t\t\tvalue: [ ... ]\r\n    //\t\t}\r\n    //\r\n    if (schema.value) {\r\n        schema = schema.value;\r\n    }\r\n    if (Array.isArray(schema)) {\r\n        return schema.some(hasTemplateBinding);\r\n    }\r\n    else if (schema instanceof TemplateBinding) {\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\n/**\r\n * Assembles the value using {@link module:ui/template~TemplateValueSchema} and stores it in a form of\r\n * an Array. Each entry of the Array corresponds to one of {@link module:ui/template~TemplateValueSchema}\r\n * items.\r\n *\r\n * @param node DOM Node updated when {@link module:utils/observablemixin~Observable} changes.\r\n */\r\nfunction getValueSchemaValue(schema, node) {\r\n    return schema.map(schemaItem => {\r\n        // Process {@link module:ui/template~TemplateBinding} bindings.\r\n        if (schemaItem instanceof TemplateBinding) {\r\n            return schemaItem.getValue(node);\r\n        }\r\n        // All static values like strings, numbers, and \"falsy\" values (false, null, undefined, '', etc.) just pass.\r\n        return schemaItem;\r\n    });\r\n}\r\n/**\r\n * A function executed each time the bound Observable attribute changes, which updates the DOM with a value\r\n * constructed from {@link module:ui/template~TemplateValueSchema}.\r\n *\r\n * @param updater A function which updates the DOM (like attribute or text).\r\n * @param node DOM Node updated when {@link module:utils/observablemixin~Observable} changes.\r\n */\r\nfunction syncValueSchemaValue(schema, updater, { node }) {\r\n    const values = getValueSchemaValue(schema, node);\r\n    let value;\r\n    // Check if schema is a single Template.bind.if, like:\r\n    //\r\n    //\t\tclass: Template.bind.if( 'foo' )\r\n    //\r\n    if (schema.length == 1 && schema[0] instanceof TemplateIfBinding) {\r\n        value = values[0];\r\n    }\r\n    else {\r\n        value = values.reduce(arrayValueReducer, '');\r\n    }\r\n    if (isFalsy(value)) {\r\n        updater.remove();\r\n    }\r\n    else {\r\n        updater.set(value);\r\n    }\r\n}\r\n/**\r\n * Returns an object consisting of `set` and `remove` functions, which\r\n * can be used in the context of DOM Node to set or reset `textContent`.\r\n * @see module:ui/view~View#_bindToObservable\r\n *\r\n * @param node DOM Node to be modified.\r\n */\r\nfunction getTextUpdater(node) {\r\n    return {\r\n        set(value) {\r\n            node.textContent = value;\r\n        },\r\n        remove() {\r\n            node.textContent = '';\r\n        }\r\n    };\r\n}\r\n/**\r\n * Returns an object consisting of `set` and `remove` functions, which\r\n * can be used in the context of DOM Node to set or reset an attribute.\r\n * @see module:ui/view~View#_bindToObservable\r\n *\r\n * @param el DOM Node to be modified.\r\n * @param attrName Name of the attribute to be modified.\r\n * @param ns Namespace to use.\r\n */\r\nfunction getAttributeUpdater(el, attrName, ns) {\r\n    return {\r\n        set(value) {\r\n            el.setAttributeNS(ns, attrName, value);\r\n        },\r\n        remove() {\r\n            el.removeAttributeNS(ns, attrName);\r\n        }\r\n    };\r\n}\r\n/**\r\n * Returns an object consisting of `set` and `remove` functions, which\r\n * can be used in the context of CSSStyleDeclaration to set or remove a style.\r\n * @see module:ui/view~View#_bindToObservable\r\n *\r\n * @param el DOM Node to be modified.\r\n * @param styleName Name of the style to be modified.\r\n */\r\nfunction getStyleUpdater(el, styleName) {\r\n    return {\r\n        set(value) {\r\n            el.style[styleName] = value;\r\n        },\r\n        remove() {\r\n            el.style[styleName] = null;\r\n        }\r\n    };\r\n}\r\n/**\r\n * Clones definition of the template.\r\n */\r\nfunction clone(def) {\r\n    const clone = cloneDeepWith(def, value => {\r\n        // Don't clone the `Template.bind`* bindings because of the references to Observable\r\n        // and DomEmitterMixin instances inside, which would also be traversed and cloned by greedy\r\n        // cloneDeepWith algorithm. There's no point in cloning Observable/DomEmitterMixins\r\n        // along with the definition.\r\n        //\r\n        // Don't clone Template instances if provided as a child. They're simply #render()ed\r\n        // and nothing should interfere.\r\n        //\r\n        // Also don't clone View instances if provided as a child of the Template. The template\r\n        // instance will be extracted from the View during the normalization and there's no need\r\n        // to clone it.\r\n        if (value && (value instanceof TemplateBinding || isTemplate(value) || isView(value) || isViewCollection(value))) {\r\n            return value;\r\n        }\r\n    });\r\n    return clone;\r\n}\r\n/**\r\n * Normalizes given {@link module:ui/template~TemplateDefinition}.\r\n *\r\n * See:\r\n *  * {@link normalizeAttributes}\r\n *  * {@link normalizeListeners}\r\n *  * {@link normalizePlainTextDefinition}\r\n *  * {@link normalizeTextDefinition}\r\n *\r\n * @param def A template definition.\r\n * @returns Normalized definition.\r\n */\r\nfunction normalize(def) {\r\n    if (typeof def == 'string') {\r\n        def = normalizePlainTextDefinition(def);\r\n    }\r\n    else if (def.text) {\r\n        normalizeTextDefinition(def);\r\n    }\r\n    if (def.on) {\r\n        def.eventListeners = normalizeListeners(def.on);\r\n        // Template mixes EmitterMixin, so delete #on to avoid collision.\r\n        delete def.on;\r\n    }\r\n    if (!def.text) {\r\n        if (def.attributes) {\r\n            normalizeAttributes(def.attributes);\r\n        }\r\n        const children = [];\r\n        if (def.children) {\r\n            if (isViewCollection(def.children)) {\r\n                children.push(def.children);\r\n            }\r\n            else {\r\n                for (const child of def.children) {\r\n                    if (isTemplate(child) || isView(child) || isNode(child)) {\r\n                        children.push(child);\r\n                    }\r\n                    else {\r\n                        children.push(new Template(child));\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        def.children = children;\r\n    }\r\n    return def;\r\n}\r\n/**\r\n * Normalizes \"attributes\" section of {@link module:ui/template~TemplateDefinition}.\r\n *\r\n * ```\r\n * attributes: {\r\n * \ta: 'bar',\r\n * \tb: {@link module:ui/template~TemplateBinding},\r\n * \tc: {\r\n * \t\tvalue: 'bar'\r\n * \t}\r\n * }\r\n * ```\r\n *\r\n * becomes\r\n *\r\n * ```\r\n * attributes: {\r\n * \ta: [ 'bar' ],\r\n * \tb: [ {@link module:ui/template~TemplateBinding} ],\r\n * \tc: {\r\n * \t\tvalue: [ 'bar' ]\r\n * \t}\r\n * }\r\n * ```\r\n */\r\nfunction normalizeAttributes(attributes) {\r\n    for (const a in attributes) {\r\n        if (attributes[a].value) {\r\n            attributes[a].value = toArray(attributes[a].value);\r\n        }\r\n        arrayify(attributes, a);\r\n    }\r\n}\r\n/**\r\n * Normalizes \"on\" section of {@link module:ui/template~TemplateDefinition}.\r\n *\r\n * ```\r\n * on: {\r\n * \ta: 'bar',\r\n * \tb: {@link module:ui/template~TemplateBinding},\r\n * \tc: [ {@link module:ui/template~TemplateBinding}, () => { ... } ]\r\n * }\r\n * ```\r\n *\r\n * becomes\r\n *\r\n * ```\r\n * on: {\r\n * \ta: [ 'bar' ],\r\n * \tb: [ {@link module:ui/template~TemplateBinding} ],\r\n * \tc: [ {@link module:ui/template~TemplateBinding}, () => { ... } ]\r\n * }\r\n * ```\r\n *\r\n * @returns Object containing normalized listeners.\r\n */\r\nfunction normalizeListeners(listeners) {\r\n    for (const l in listeners) {\r\n        arrayify(listeners, l);\r\n    }\r\n    return listeners;\r\n}\r\n/**\r\n * Normalizes \"string\" {@link module:ui/template~TemplateDefinition}.\r\n *\r\n * ```\r\n * \"foo\"\r\n * ```\r\n *\r\n * becomes\r\n *\r\n * ```\r\n * { text: [ 'foo' ] },\r\n * ```\r\n *\r\n * @returns Normalized template definition.\r\n */\r\nfunction normalizePlainTextDefinition(def) {\r\n    return {\r\n        text: [def]\r\n    };\r\n}\r\n/**\r\n * Normalizes text {@link module:ui/template~TemplateDefinition}.\r\n *\r\n * ```\r\n * children: [\r\n * \t{ text: 'def' },\r\n * \t{ text: {@link module:ui/template~TemplateBinding} }\r\n * ]\r\n * ```\r\n *\r\n * becomes\r\n *\r\n * ```\r\n * children: [\r\n * \t{ text: [ 'def' ] },\r\n * \t{ text: [ {@link module:ui/template~TemplateBinding} ] }\r\n * ]\r\n * ```\r\n */\r\nfunction normalizeTextDefinition(def) {\r\n    def.text = toArray(def.text);\r\n}\r\n/**\r\n * Wraps an entry in Object in an Array, if not already one.\r\n *\r\n * ```\r\n * {\r\n * \tx: 'y',\r\n * \ta: [ 'b' ]\r\n * }\r\n * ```\r\n *\r\n * becomes\r\n *\r\n * ```\r\n * {\r\n * \tx: [ 'y' ],\r\n * \ta: [ 'b' ]\r\n * }\r\n * ```\r\n */\r\nfunction arrayify(obj, key) {\r\n    obj[key] = toArray(obj[key]);\r\n}\r\n/**\r\n * A helper which concatenates the value avoiding unwanted\r\n * leading white spaces.\r\n */\r\nfunction arrayValueReducer(prev, cur) {\r\n    if (isFalsy(cur)) {\r\n        return prev;\r\n    }\r\n    else if (isFalsy(prev)) {\r\n        return cur;\r\n    }\r\n    else {\r\n        return `${prev} ${cur}`;\r\n    }\r\n}\r\n/**\r\n * Extends one object defined in the following format:\r\n *\r\n * ```\r\n * {\r\n * \tkey1: [Array1],\r\n * \tkey2: [Array2],\r\n * \t...\r\n * \tkeyN: [ArrayN]\r\n * }\r\n * ```\r\n *\r\n * with another object of the same data format.\r\n *\r\n * @param obj Base object.\r\n * @param ext Object extending base.\r\n */\r\nfunction extendObjectValueArray(obj, ext) {\r\n    for (const a in ext) {\r\n        if (obj[a]) {\r\n            obj[a].push(...ext[a]);\r\n        }\r\n        else {\r\n            obj[a] = ext[a];\r\n        }\r\n    }\r\n}\r\n/**\r\n * A helper for {@link module:ui/template~Template#extend}. Recursively extends {@link module:ui/template~Template} instance\r\n * with content from {@link module:ui/template~TemplateDefinition}. See {@link module:ui/template~Template#extend} to learn more.\r\n *\r\n * @param def A template instance to be extended.\r\n * @param def A definition which is to extend the template instance.\r\n * @param Error context.\r\n */\r\nfunction extendTemplate(template, def) {\r\n    if (def.attributes) {\r\n        if (!template.attributes) {\r\n            template.attributes = {};\r\n        }\r\n        extendObjectValueArray(template.attributes, def.attributes);\r\n    }\r\n    if (def.eventListeners) {\r\n        if (!template.eventListeners) {\r\n            template.eventListeners = {};\r\n        }\r\n        extendObjectValueArray(template.eventListeners, def.eventListeners);\r\n    }\r\n    if (def.text) {\r\n        template.text.push(...def.text);\r\n    }\r\n    if (def.children && def.children.length) {\r\n        if (template.children.length != def.children.length) {\r\n            /**\r\n             * The number of children in extended definition does not match.\r\n             *\r\n             * @error ui-template-extend-children-mismatch\r\n             */\r\n            throw new CKEditorError('ui-template-extend-children-mismatch', template);\r\n        }\r\n        let childIndex = 0;\r\n        for (const childDef of def.children) {\r\n            extendTemplate(template.children[childIndex++], childDef);\r\n        }\r\n    }\r\n}\r\n/**\r\n * Checks if value is \"falsy\".\r\n * Note: 0 (Number) is not \"falsy\" in this context.\r\n *\r\n * @param value Value to be checked.\r\n */\r\nfunction isFalsy(value) {\r\n    return !value && value !== 0;\r\n}\r\n/**\r\n * Checks if the item is an instance of {@link module:ui/view~View}\r\n *\r\n * @param value Value to be checked.\r\n */\r\nfunction isView(item) {\r\n    return item instanceof View;\r\n}\r\n/**\r\n * Checks if the item is an instance of {@link module:ui/template~Template}\r\n *\r\n * @param value Value to be checked.\r\n */\r\nfunction isTemplate(item) {\r\n    return item instanceof Template;\r\n}\r\n/**\r\n * Checks if the item is an instance of {@link module:ui/viewcollection~ViewCollection}\r\n *\r\n * @param value Value to be checked.\r\n */\r\nfunction isViewCollection(item) {\r\n    return item instanceof ViewCollection;\r\n}\r\n/**\r\n * Checks if value array contains the one with namespace.\r\n */\r\nfunction isNamespaced(attrValue) {\r\n    return isObject(attrValue[0]) && attrValue[0].ns;\r\n}\r\n/**\r\n * Creates an empty skeleton for {@link module:ui/template~Template#revert}\r\n * data.\r\n */\r\nfunction getEmptyRevertData() {\r\n    return {\r\n        children: [],\r\n        bindings: [],\r\n        attributes: {}\r\n    };\r\n}\r\n/**\r\n * Checks whether an attribute should be extended when\r\n * {@link module:ui/template~Template#apply} is called.\r\n *\r\n * @param attrName Attribute name to check.\r\n */\r\nfunction shouldExtend(attrName) {\r\n    return attrName == 'class' || attrName == 'style';\r\n}\r\n","import api from \"!../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../css-loader/dist/cjs.js!../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./globals.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/* eslint-disable @typescript-eslint/no-invalid-void-type */\r\n/**\r\n * @module ui/view\r\n */\r\nimport ViewCollection from './viewcollection';\r\nimport Template from './template';\r\nimport { CKEditorError, Collection, DomEmitterMixin, ObservableMixin, isIterable } from '@ckeditor/ckeditor5-utils';\r\nimport '../theme/globals/globals.css';\r\n/**\r\n * The basic view class, which represents an HTML element created out of a\r\n * {@link module:ui/view~View#template}. Views are building blocks of the user interface and handle\r\n * interaction\r\n *\r\n * Views {@link module:ui/view~View#registerChild aggregate} children in\r\n * {@link module:ui/view~View#createCollection collections} and manage the life cycle of DOM\r\n * listeners e.g. by handling rendering and destruction.\r\n *\r\n * See the {@link module:ui/template~TemplateDefinition} syntax to learn more about shaping view\r\n * elements, attributes and listeners.\r\n *\r\n * ```ts\r\n * class SampleView extends View {\r\n * \tconstructor( locale ) {\r\n * \t\tsuper( locale );\r\n *\r\n * \t\tconst bind = this.bindTemplate;\r\n *\r\n * \t\t// Views define their interface (state) using observable attributes.\r\n * \t\tthis.set( 'elementClass', 'bar' );\r\n *\r\n * \t\tthis.setTemplate( {\r\n * \t\t\ttag: 'p',\r\n *\r\n * \t\t\t// The element of the view can be defined with its children.\r\n * \t\t\tchildren: [\r\n * \t\t\t\t'Hello',\r\n * \t\t\t\t{\r\n * \t\t\t\t\ttag: 'b',\r\n * \t\t\t\t\tchildren: [ 'world!' ]\r\n * \t\t\t\t}\r\n * \t\t\t],\r\n * \t\t\tattributes: {\r\n * \t\t\t\tclass: [\r\n * \t\t\t\t\t'foo',\r\n *\r\n * \t\t\t\t\t// Observable attributes control the state of the view in DOM.\r\n * \t\t\t\t\tbind.to( 'elementClass' )\r\n * \t\t\t\t]\r\n * \t\t\t},\r\n * \t\t\ton: {\r\n * \t\t\t\t// Views listen to DOM events and propagate them.\r\n * \t\t\t\tclick: bind.to( 'clicked' )\r\n * \t\t\t}\r\n * \t\t} );\r\n * \t}\r\n * }\r\n *\r\n * const view = new SampleView( locale );\r\n *\r\n * view.render();\r\n *\r\n * // Append <p class=\"foo bar\">Hello<b>world</b></p> to the <body>\r\n * document.body.appendChild( view.element );\r\n *\r\n * // Change the class attribute to <p class=\"foo baz\">Hello<b>world</b></p>\r\n * view.elementClass = 'baz';\r\n *\r\n * // Respond to the \"click\" event in DOM by executing a custom action.\r\n * view.on( 'clicked', () => {\r\n * \tconsole.log( 'The view has been clicked!' );\r\n * } );\r\n * ```\r\n */\r\nexport default class View extends DomEmitterMixin(ObservableMixin()) {\r\n    /**\r\n     * Creates an instance of the {@link module:ui/view~View} class.\r\n     *\r\n     * Also see {@link #render}.\r\n     *\r\n     * @param locale The localization services instance.\r\n     */\r\n    constructor(locale) {\r\n        super();\r\n        this.element = null;\r\n        this.isRendered = false;\r\n        this.locale = locale;\r\n        this.t = locale && locale.t;\r\n        this._viewCollections = new Collection();\r\n        this._unboundChildren = this.createCollection();\r\n        // Pass parent locale to its children.\r\n        this._viewCollections.on('add', (evt, collection) => {\r\n            collection.locale = locale;\r\n            collection.t = locale && locale.t;\r\n        });\r\n        this.decorate('render');\r\n    }\r\n    /**\r\n     * Shorthand for {@link module:ui/template~Template.bind}, a binding\r\n     * {@link module:ui/template~BindChain interface} pre–configured for the view instance.\r\n     *\r\n     * It provides {@link module:ui/template~BindChain#to `to()`} and\r\n     * {@link module:ui/template~BindChain#if `if()`} methods that initialize bindings with\r\n     * observable attributes and attach DOM listeners.\r\n     *\r\n     * ```ts\r\n     * class SampleView extends View {\r\n     * \tconstructor( locale ) {\r\n     * \t\tsuper( locale );\r\n     *\r\n     * \t\tconst bind = this.bindTemplate;\r\n     *\r\n     * \t\t// These {@link module:utils/observablemixin~Observable observable} attributes will control\r\n     * \t\t// the state of the view in DOM.\r\n     * \t\tthis.set( {\r\n     * \t\t\telementClass: 'foo',\r\n     * \t\t \tisEnabled: true\r\n     * \t\t } );\r\n     *\r\n     * \t\tthis.setTemplate( {\r\n     * \t\t\ttag: 'p',\r\n     *\r\n     * \t\t\tattributes: {\r\n     * \t\t\t\t// The class HTML attribute will follow elementClass\r\n     * \t\t\t\t// and isEnabled view attributes.\r\n     * \t\t\t\tclass: [\r\n     * \t\t\t\t\tbind.to( 'elementClass' )\r\n     * \t\t\t\t\tbind.if( 'isEnabled', 'present-when-enabled' )\r\n     * \t\t\t\t]\r\n     * \t\t\t},\r\n     *\r\n     * \t\t\ton: {\r\n     * \t\t\t\t// The view will fire the \"clicked\" event upon clicking <p> in DOM.\r\n     * \t\t\t\tclick: bind.to( 'clicked' )\r\n     * \t\t\t}\r\n     * \t\t} );\r\n     * \t}\r\n     * }\r\n     * ```\r\n     */\r\n    get bindTemplate() {\r\n        if (this._bindTemplate) {\r\n            return this._bindTemplate;\r\n        }\r\n        return (this._bindTemplate = Template.bind(this, this));\r\n    }\r\n    /**\r\n     * Creates a new collection of views, which can be used as\r\n     * {@link module:ui/template~Template#children} of this view.\r\n     *\r\n     * ```ts\r\n     * class SampleView extends View {\r\n     * \tconstructor( locale ) {\r\n     * \t\tsuper( locale );\r\n     *\r\n     * \t\tconst child = new ChildView( locale );\r\n     * \t\tthis.items = this.createCollection( [ child ] );\r\n     *\r\n     * \t\tthis.setTemplate( {\r\n     * \t\t\ttag: 'p',\r\n     *\r\n     * \t\t\t// `items` collection will render here.\r\n     * \t\t\tchildren: this.items\r\n     * \t\t} );\r\n     * \t}\r\n     * }\r\n     *\r\n     * const view = new SampleView( locale );\r\n     * view.render();\r\n     *\r\n     * // It will append <p><child#element></p> to the <body>.\r\n     * document.body.appendChild( view.element );\r\n     * ```\r\n     *\r\n     * @param views Initial views of the collection.\r\n     * @returns A new collection of view instances.\r\n     */\r\n    createCollection(views) {\r\n        const collection = new ViewCollection(views);\r\n        this._viewCollections.add(collection);\r\n        return collection;\r\n    }\r\n    /**\r\n     * Registers a new child view under the view instance. Once registered, a child\r\n     * view is managed by its parent, including {@link #render rendering}\r\n     * and {@link #destroy destruction}.\r\n     *\r\n     * To revert this, use {@link #deregisterChild}.\r\n     *\r\n     * ```ts\r\n     * class SampleView extends View {\r\n     * \tconstructor( locale ) {\r\n     * \t\tsuper( locale );\r\n     *\r\n     * \t\tthis.childA = new SomeChildView( locale );\r\n     * \t\tthis.childB = new SomeChildView( locale );\r\n     *\r\n     * \t\tthis.setTemplate( { tag: 'p' } );\r\n     *\r\n     * \t\t// Register the children.\r\n     * \t\tthis.registerChild( [ this.childA, this.childB ] );\r\n     * \t}\r\n     *\r\n     * \trender() {\r\n     * \t\tsuper.render();\r\n     *\r\n     * \t\tthis.element.appendChild( this.childA.element );\r\n     * \t\tthis.element.appendChild( this.childB.element );\r\n     * \t}\r\n     * }\r\n     *\r\n     * const view = new SampleView( locale );\r\n     *\r\n     * view.render();\r\n     *\r\n     * // Will append <p><childA#element><b></b><childB#element></p>.\r\n     * document.body.appendChild( view.element );\r\n     * ```\r\n     *\r\n     * **Note**: There's no need to add child views if they're already referenced in the\r\n     * {@link #template}:\r\n     *\r\n     * ```ts\r\n     * class SampleView extends View {\r\n     * \tconstructor( locale ) {\r\n     * \t\tsuper( locale );\r\n     *\r\n     * \t\tthis.childA = new SomeChildView( locale );\r\n     * \t\tthis.childB = new SomeChildView( locale );\r\n     *\r\n     * \t\tthis.setTemplate( {\r\n     * \t\t\ttag: 'p',\r\n     *\r\n     * \t\t\t// These children will be added automatically. There's no\r\n     * \t\t\t// need to call {@link #registerChild} for any of them.\r\n     * \t\t\tchildren: [ this.childA, this.childB ]\r\n     * \t\t} );\r\n     * \t}\r\n     *\r\n     * \t// ...\r\n     * }\r\n     * ```\r\n     *\r\n     * @param children Children views to be registered.\r\n     */\r\n    registerChild(children) {\r\n        if (!isIterable(children)) {\r\n            children = [children];\r\n        }\r\n        for (const child of children) {\r\n            this._unboundChildren.add(child);\r\n        }\r\n    }\r\n    /**\r\n     * The opposite of {@link #registerChild}. Removes a child view from this view instance.\r\n     * Once removed, the child is no longer managed by its parent, e.g. it can safely\r\n     * become a child of another parent view.\r\n     *\r\n     * @see #registerChild\r\n     * @param children Child views to be removed.\r\n     */\r\n    deregisterChild(children) {\r\n        if (!isIterable(children)) {\r\n            children = [children];\r\n        }\r\n        for (const child of children) {\r\n            this._unboundChildren.remove(child);\r\n        }\r\n    }\r\n    /**\r\n     * Sets the {@link #template} of the view with with given definition.\r\n     *\r\n     * A shorthand for:\r\n     *\r\n     * ```ts\r\n     * view.setTemplate( definition );\r\n     * ```\r\n     *\r\n     * @param definition Definition of view's template.\r\n     */\r\n    setTemplate(definition) {\r\n        this.template = new Template(definition);\r\n    }\r\n    /**\r\n     * {@link module:ui/template~Template.extend Extends} the {@link #template} of the view with\r\n     * with given definition.\r\n     *\r\n     * A shorthand for:\r\n     *\r\n     * ```ts\r\n     * Template.extend( view.template, definition );\r\n     * ```\r\n     *\r\n     * **Note**: Is requires the {@link #template} to be already set. See {@link #setTemplate}.\r\n     *\r\n     * @param definition Definition which extends the {@link #template}.\r\n     */\r\n    extendTemplate(definition) {\r\n        Template.extend(this.template, definition);\r\n    }\r\n    /**\r\n     * Recursively renders the view.\r\n     *\r\n     * Once the view is rendered:\r\n     * * the {@link #element} becomes an HTML element out of {@link #template},\r\n     * * the {@link #isRendered} flag is set `true`.\r\n     *\r\n     * **Note**: The children of the view:\r\n     * * defined directly in the {@link #template}\r\n     * * residing in collections created by the {@link #createCollection} method,\r\n     * * and added by {@link #registerChild}\r\n     * are also rendered in the process.\r\n     *\r\n     * In general, `render()` method is the right place to keep the code which refers to the\r\n     * {@link #element} and should be executed at the very beginning of the view's life cycle.\r\n     *\r\n     * It is possible to {@link module:ui/template~Template.extend} the {@link #template} before\r\n     * the view is rendered. To allow an early customization of the view (e.g. by its parent),\r\n     * such references should be done in `render()`.\r\n     *\r\n     * ```ts\r\n     * class SampleView extends View {\r\n     * \tconstructor() {\r\n     * \t\tthis.setTemplate( {\r\n     * \t\t\t// ...\r\n     * \t\t} );\r\n     * \t},\r\n     *\r\n     * \trender() {\r\n     * \t\t// View#element becomes available.\r\n     * \t\tsuper.render();\r\n     *\r\n     * \t\t// The \"scroll\" listener depends on #element.\r\n     * \t\tthis.listenTo( window, 'scroll', () => {\r\n     * \t\t\t// A reference to #element would render the #template and make it non-extendable.\r\n     * \t\t\tif ( window.scrollY > 0 ) {\r\n     * \t\t\t\tthis.element.scrollLeft = 100;\r\n     * \t\t\t} else {\r\n     * \t\t\t\tthis.element.scrollLeft = 0;\r\n     * \t\t\t}\r\n     * \t\t} );\r\n     * \t}\r\n     * }\r\n     *\r\n     * const view = new SampleView();\r\n     *\r\n     * // Let's customize the view before it gets rendered.\r\n     * view.extendTemplate( {\r\n     * \tattributes: {\r\n     * \t\tclass: [\r\n     * \t\t\t'additional-class'\r\n     * \t\t]\r\n     * \t}\r\n     * } );\r\n     *\r\n     * // Late rendering allows customization of the view.\r\n     * view.render();\r\n     * ```\r\n     */\r\n    render() {\r\n        if (this.isRendered) {\r\n            /**\r\n             * This View has already been rendered.\r\n             *\r\n             * @error ui-view-render-already-rendered\r\n             */\r\n            throw new CKEditorError('ui-view-render-already-rendered', this);\r\n        }\r\n        // Render #element of the view.\r\n        if (this.template) {\r\n            this.element = this.template.render();\r\n            // Auto–register view children from #template.\r\n            this.registerChild(this.template.getViews());\r\n        }\r\n        this.isRendered = true;\r\n    }\r\n    /**\r\n     * Recursively destroys the view instance and child views added by {@link #registerChild} and\r\n     * residing in collections created by the {@link #createCollection}.\r\n     *\r\n     * Destruction disables all event listeners:\r\n     * * created on the view, e.g. `view.on( 'event', () => {} )`,\r\n     * * defined in the {@link #template} for DOM events.\r\n     */\r\n    destroy() {\r\n        this.stopListening();\r\n        this._viewCollections.map(c => c.destroy());\r\n        // Template isn't obligatory for views.\r\n        if (this.template && this.template._revertData) {\r\n            this.template.revert(this.element);\r\n        }\r\n    }\r\n}\r\n","import api from \"!../../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../../css-loader/dist/cjs.js!../../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./icon.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/* global DOMParser */\r\n/**\r\n * @module ui/icon/iconview\r\n */\r\nimport View from '../view';\r\nimport '../../theme/components/icon/icon.css';\r\n/**\r\n * The icon view class.\r\n */\r\nexport default class IconView extends View {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor() {\r\n        super();\r\n        const bind = this.bindTemplate;\r\n        this.set('content', '');\r\n        this.set('viewBox', '0 0 20 20');\r\n        this.set('fillColor', '');\r\n        this.set('isColorInherited', true);\r\n        this.setTemplate({\r\n            tag: 'svg',\r\n            ns: 'http://www.w3.org/2000/svg',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-icon',\r\n                    // Exclude icon internals from the CSS reset to allow rich (non-monochromatic) icons\r\n                    // (https://github.com/ckeditor/ckeditor5/issues/12599).\r\n                    'ck-reset_all-excluded',\r\n                    // The class to remove the dynamic color inheritance is toggleable\r\n                    // (https://github.com/ckeditor/ckeditor5/issues/12599).\r\n                    bind.if('isColorInherited', 'ck-icon_inherit-color')\r\n                ],\r\n                viewBox: bind.to('viewBox')\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        this._updateXMLContent();\r\n        this._colorFillPaths();\r\n        // This is a hack for lack of innerHTML binding.\r\n        // See: https://github.com/ckeditor/ckeditor5-ui/issues/99.\r\n        this.on('change:content', () => {\r\n            this._updateXMLContent();\r\n            this._colorFillPaths();\r\n        });\r\n        this.on('change:fillColor', () => {\r\n            this._colorFillPaths();\r\n        });\r\n    }\r\n    /**\r\n     * Updates the {@link #element} with the value of {@link #content}.\r\n     */\r\n    _updateXMLContent() {\r\n        if (this.content) {\r\n            const parsed = new DOMParser().parseFromString(this.content.trim(), 'image/svg+xml');\r\n            const svg = parsed.querySelector('svg');\r\n            const viewBox = svg.getAttribute('viewBox');\r\n            if (viewBox) {\r\n                this.viewBox = viewBox;\r\n            }\r\n            // Preserve presentational attributes of the <svg> element from the source.\r\n            // They can affect rendering of the entire icon (https://github.com/ckeditor/ckeditor5/issues/12597).\r\n            for (const { name, value } of Array.from(svg.attributes)) {\r\n                if (IconView.presentationalAttributeNames.includes(name)) {\r\n                    this.element.setAttribute(name, value);\r\n                }\r\n            }\r\n            while (this.element.firstChild) {\r\n                this.element.removeChild(this.element.firstChild);\r\n            }\r\n            while (svg.childNodes.length > 0) {\r\n                this.element.appendChild(svg.childNodes[0]);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Fills all child `path.ck-icon__fill` with the `#fillColor`.\r\n     */\r\n    _colorFillPaths() {\r\n        if (this.fillColor) {\r\n            this.element.querySelectorAll('.ck-icon__fill').forEach(path => {\r\n                path.style.fill = this.fillColor;\r\n            });\r\n        }\r\n    }\r\n}\r\n/**\r\n * A list of presentational attributes that can be set on the `<svg>` element and should be preserved\r\n * when the icon {@link module:ui/icon/iconview~IconView#content content} is loaded.\r\n *\r\n * See the [specification](https://www.w3.org/TR/SVG/styling.html#TermPresentationAttribute) to learn more.\r\n */\r\nIconView.presentationalAttributeNames = [\r\n    'alignment-baseline', 'baseline-shift', 'clip-path', 'clip-rule', 'color', 'color-interpolation',\r\n    'color-interpolation-filters', 'color-rendering', 'cursor', 'direction', 'display', 'dominant-baseline', 'fill', 'fill-opacity',\r\n    'fill-rule', 'filter', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style',\r\n    'font-variant', 'font-weight', 'image-rendering', 'letter-spacing', 'lighting-color', 'marker-end', 'marker-mid', 'marker-start',\r\n    'mask', 'opacity', 'overflow', 'paint-order', 'pointer-events', 'shape-rendering', 'stop-color', 'stop-opacity', 'stroke',\r\n    'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width',\r\n    'text-anchor', 'text-decoration', 'text-overflow', 'text-rendering', 'transform', 'unicode-bidi', 'vector-effect',\r\n    'visibility', 'white-space', 'word-spacing', 'writing-mode'\r\n];\r\n","import api from \"!../../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../../css-loader/dist/cjs.js!../../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./button.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/button/buttonview\r\n */\r\nimport View from '../view';\r\nimport IconView from '../icon/iconview';\r\nimport { env, getEnvKeystrokeText, uid, delay } from '@ckeditor/ckeditor5-utils';\r\nimport '../../theme/components/button/button.css';\r\n/**\r\n * The button view class.\r\n *\r\n * ```ts\r\n * const view = new ButtonView();\r\n *\r\n * view.set( {\r\n * \tlabel: 'A button',\r\n * \tkeystroke: 'Ctrl+B',\r\n * \ttooltip: true,\r\n * \twithText: true\r\n * } );\r\n *\r\n * view.render();\r\n *\r\n * document.body.append( view.element );\r\n * ```\r\n */\r\nexport default class ButtonView extends View {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        /**\r\n         * Delayed focus function for focus handling in Safari.\r\n         */\r\n        this._focusDelayed = null;\r\n        const bind = this.bindTemplate;\r\n        const ariaLabelUid = uid();\r\n        // Implement the Button interface.\r\n        this.set('ariaChecked', undefined);\r\n        this.set('ariaLabel', undefined);\r\n        this.set('ariaLabelledBy', `ck-editor__aria-label_${ariaLabelUid}`);\r\n        this.set('class', undefined);\r\n        this.set('labelStyle', undefined);\r\n        this.set('icon', undefined);\r\n        this.set('isEnabled', true);\r\n        this.set('isOn', false);\r\n        this.set('isVisible', true);\r\n        this.set('isToggleable', false);\r\n        this.set('keystroke', undefined);\r\n        this.set('label', undefined);\r\n        this.set('role', undefined);\r\n        this.set('tabindex', -1);\r\n        this.set('tooltip', false);\r\n        this.set('tooltipPosition', 's');\r\n        this.set('type', 'button');\r\n        this.set('withText', false);\r\n        this.set('withKeystroke', false);\r\n        this.children = this.createCollection();\r\n        this.labelView = this._createLabelView();\r\n        this.iconView = new IconView();\r\n        this.iconView.extendTemplate({\r\n            attributes: {\r\n                class: 'ck-button__icon'\r\n            }\r\n        });\r\n        this.keystrokeView = this._createKeystrokeView();\r\n        this.bind('_tooltipString').to(this, 'tooltip', this, 'label', this, 'keystroke', this._getTooltipString.bind(this));\r\n        const template = {\r\n            tag: 'button',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-button',\r\n                    bind.to('class'),\r\n                    bind.if('isEnabled', 'ck-disabled', value => !value),\r\n                    bind.if('isVisible', 'ck-hidden', value => !value),\r\n                    bind.to('isOn', value => value ? 'ck-on' : 'ck-off'),\r\n                    bind.if('withText', 'ck-button_with-text'),\r\n                    bind.if('withKeystroke', 'ck-button_with-keystroke')\r\n                ],\r\n                role: bind.to('role'),\r\n                type: bind.to('type', value => value ? value : 'button'),\r\n                tabindex: bind.to('tabindex'),\r\n                'aria-label': bind.to('ariaLabel'),\r\n                'aria-labelledby': bind.to('ariaLabelledBy'),\r\n                'aria-disabled': bind.if('isEnabled', true, value => !value),\r\n                'aria-checked': bind.to('isOn'),\r\n                'aria-pressed': bind.to('isOn', value => this.isToggleable ? String(!!value) : false),\r\n                'data-cke-tooltip-text': bind.to('_tooltipString'),\r\n                'data-cke-tooltip-position': bind.to('tooltipPosition')\r\n            },\r\n            children: this.children,\r\n            on: {\r\n                click: bind.to(evt => {\r\n                    // We can't make the button disabled using the disabled attribute, because it won't be focusable.\r\n                    // Though, shouldn't this condition be moved to the button controller?\r\n                    if (this.isEnabled) {\r\n                        this.fire('execute');\r\n                    }\r\n                    else {\r\n                        // Prevent the default when button is disabled, to block e.g.\r\n                        // automatic form submitting. See ckeditor/ckeditor5-link#74.\r\n                        evt.preventDefault();\r\n                    }\r\n                })\r\n            }\r\n        };\r\n        // On Safari we have to force the focus on a button on click as it's the only browser\r\n        // that doesn't do that automatically. See #12115.\r\n        if (env.isSafari) {\r\n            if (!this._focusDelayed) {\r\n                this._focusDelayed = delay(() => this.focus(), 0);\r\n            }\r\n            template.on.mousedown = bind.to(() => {\r\n                this._focusDelayed();\r\n            });\r\n            template.on.mouseup = bind.to(() => {\r\n                this._focusDelayed.cancel();\r\n            });\r\n        }\r\n        this.setTemplate(template);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        if (this.icon) {\r\n            this.iconView.bind('content').to(this, 'icon');\r\n            this.children.add(this.iconView);\r\n        }\r\n        this.children.add(this.labelView);\r\n        if (this.withKeystroke && this.keystroke) {\r\n            this.children.add(this.keystrokeView);\r\n        }\r\n    }\r\n    /**\r\n     * Focuses the {@link #element} of the button.\r\n     */\r\n    focus() {\r\n        this.element.focus();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        if (this._focusDelayed) {\r\n            this._focusDelayed.cancel();\r\n        }\r\n        super.destroy();\r\n    }\r\n    /**\r\n     * Creates a label view instance and binds it with button attributes.\r\n     */\r\n    _createLabelView() {\r\n        const labelView = new View();\r\n        const bind = this.bindTemplate;\r\n        labelView.setTemplate({\r\n            tag: 'span',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-button__label'\r\n                ],\r\n                style: bind.to('labelStyle'),\r\n                id: this.ariaLabelledBy\r\n            },\r\n            children: [\r\n                {\r\n                    text: bind.to('label')\r\n                }\r\n            ]\r\n        });\r\n        return labelView;\r\n    }\r\n    /**\r\n     * Creates a view that displays a keystroke next to a {@link #labelView label }\r\n     * and binds it with button attributes.\r\n     */\r\n    _createKeystrokeView() {\r\n        const keystrokeView = new View();\r\n        keystrokeView.setTemplate({\r\n            tag: 'span',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-button__keystroke'\r\n                ]\r\n            },\r\n            children: [\r\n                {\r\n                    text: this.bindTemplate.to('keystroke', text => getEnvKeystrokeText(text))\r\n                }\r\n            ]\r\n        });\r\n        return keystrokeView;\r\n    }\r\n    /**\r\n     * Gets the text for the tooltip from the combination of\r\n     * {@link #tooltip}, {@link #label} and {@link #keystroke} attributes.\r\n     *\r\n     * @see #tooltip\r\n     * @see #_tooltipString\r\n     * @param tooltip Button tooltip.\r\n     * @param label Button label.\r\n     * @param keystroke Button keystroke.\r\n     */\r\n    _getTooltipString(tooltip, label, keystroke) {\r\n        if (tooltip) {\r\n            if (typeof tooltip == 'string') {\r\n                return tooltip;\r\n            }\r\n            else {\r\n                if (keystroke) {\r\n                    keystroke = getEnvKeystrokeText(keystroke);\r\n                }\r\n                if (tooltip instanceof Function) {\r\n                    return tooltip(label, keystroke);\r\n                }\r\n                else {\r\n                    return `${label}${keystroke ? ` (${keystroke})` : ''}`;\r\n                }\r\n            }\r\n        }\r\n        return '';\r\n    }\r\n}\r\n","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./fullscreen.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/* global document */\r\n/**\r\n * Handles clicking **outside** of a specified set of elements, then fires an action.\r\n *\r\n * **Note**: Actually, the action is executed upon `mousedown`, not `click`. It prevents\r\n * certain issues when the user keeps holding the mouse button and the UI cannot react\r\n * properly.\r\n *\r\n * @param options Configuration options.\r\n * @param options.emitter The emitter to which this behavior should be added.\r\n * @param options.activator Function returning a `Boolean`, to determine whether the handler is active.\r\n * @param options.contextElements Array of HTML elements or a callback returning an array of HTML elements\r\n * that determine the scope of the handler. Clicking any of them or their descendants will **not** fire the callback.\r\n * @param options.callback An action executed by the handler.\r\n */\r\nexport default function clickOutsideHandler({ emitter, activator, callback, contextElements }) {\r\n    emitter.listenTo(document, 'mousedown', (evt, domEvt) => {\r\n        if (!activator()) {\r\n            return;\r\n        }\r\n        // Check if `composedPath` is `undefined` in case the browser does not support native shadow DOM.\r\n        // Can be removed when all supported browsers support native shadow DOM.\r\n        const path = typeof domEvt.composedPath == 'function' ? domEvt.composedPath() : [];\r\n        const contextElementsList = typeof contextElements == 'function' ? contextElements() : contextElements;\r\n        for (const contextElement of contextElementsList) {\r\n            if (contextElement.contains(domEvt.target) || path.includes(contextElement)) {\r\n                return;\r\n            }\r\n        }\r\n        callback();\r\n    });\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * A mixin that brings the possibility to temporarily disable CSS transitions using\r\n * {@link module:ui/view~View} methods. It is helpful when, for instance, the transitions should not happen\r\n * when the view is first displayed but they should work normal in other cases.\r\n *\r\n * The methods to control the CSS transitions are:\r\n * * `disableCssTransitions()` – Adds the `.ck-transitions-disabled` class to the\r\n * {@link module:ui/view~View#element view element}.\r\n * * `enableCssTransitions()` – Removes the `.ck-transitions-disabled` class from the\r\n * {@link module:ui/view~View#element view element}.\r\n *\r\n * The usage comes down to:\r\n *\r\n * ```ts\r\n * const MyViewWithCssTransitionDisabler = CssTransitionDisablerMixin( MyView );\r\n * const view = new MyViewWithCssTransitionDisabler();\r\n *\r\n * // ...\r\n *\r\n * view.disableCssTransitions();\r\n * view.show();\r\n * view.enableCssTransitions();\r\n * ```\r\n *\r\n * @param view View instance that should get this functionality.\r\n */\r\nexport default function CssTransitionDisablerMixin(view) {\r\n    class Mixin extends view {\r\n        disableCssTransitions() {\r\n            this._isCssTransitionsDisabled = true;\r\n        }\r\n        enableCssTransitions() {\r\n            this._isCssTransitionsDisabled = false;\r\n        }\r\n        constructor(...args) {\r\n            super(...args);\r\n            this.set('_isCssTransitionsDisabled', false);\r\n            this.initializeCssTransitionDisablerMixin();\r\n        }\r\n        initializeCssTransitionDisablerMixin() {\r\n            this.extendTemplate({\r\n                attributes: {\r\n                    class: [\r\n                        this.bindTemplate.if('_isCssTransitionsDisabled', 'ck-transitions-disabled')\r\n                    ]\r\n                }\r\n            });\r\n        }\r\n    }\r\n    return Mixin;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * A handler useful for {@link module:ui/view~View views} working as HTML forms. It intercepts a native DOM\r\n * `submit` event, prevents the default web browser behavior (navigation and page reload) and\r\n * fires the `submit` event on a view instead. Such a custom event can be then used by any\r\n * {@link module:utils/dom/emittermixin~DomEmitter emitter}, e.g. to serialize the form data.\r\n *\r\n * ```ts\r\n * import submitHandler from '@ckeditor/ckeditor5-ui/src/bindings/submithandler';\r\n *\r\n * // ...\r\n *\r\n * class AnyFormView extends View {\r\n * \tconstructor() {\r\n * \t\tsuper();\r\n *\r\n * \t\t// ...\r\n *\r\n * \t\tsubmitHandler( {\r\n * \t\t\tview: this\r\n * \t\t} );\r\n * \t}\r\n * }\r\n *\r\n * // ...\r\n *\r\n * const view = new AnyFormView();\r\n *\r\n * // A sample listener attached by an emitter working with the view.\r\n * this.listenTo( view, 'submit', () => {\r\n * \tsaveTheFormData();\r\n * \thideTheForm();\r\n * } );\r\n * ```\r\n *\r\n * @param options Configuration options.\r\n * @param options.view The view which DOM `submit` events should be handled.\r\n */\r\nexport default function submitHandler({ view }) {\r\n    view.listenTo(view.element, 'submit', (evt, domEvt) => {\r\n        domEvt.preventDefault();\r\n        view.fire('submit');\r\n    }, { useCapture: true });\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * A helper that adds a keyboard navigation support (arrow up/down/left/right) for grids.\r\n *\r\n * @param options Configuration options.\r\n * @param options.keystrokeHandler Keystroke handler to register navigation with arrow keys.\r\n * @param options.focusTracker A focus tracker for grid elements.\r\n * @param options.gridItems A collection of grid items.\r\n * @param options.numberOfColumns Number of columns in the grid. Can be specified as a function that returns\r\n * the number (e.g. for responsive grids).\r\n * @param options.uiLanguageDirection String of ui language direction.\r\n */\r\nexport default function addKeyboardHandlingForGrid({ keystrokeHandler, focusTracker, gridItems, numberOfColumns, uiLanguageDirection }) {\r\n    const getNumberOfColumns = typeof numberOfColumns === 'number' ? () => numberOfColumns : numberOfColumns;\r\n    keystrokeHandler.set('arrowright', getGridItemFocuser((focusedElementIndex, gridItems) => {\r\n        return uiLanguageDirection === 'rtl' ?\r\n            getLeftElementIndex(focusedElementIndex, gridItems.length) :\r\n            getRightElementIndex(focusedElementIndex, gridItems.length);\r\n    }));\r\n    keystrokeHandler.set('arrowleft', getGridItemFocuser((focusedElementIndex, gridItems) => {\r\n        return uiLanguageDirection === 'rtl' ?\r\n            getRightElementIndex(focusedElementIndex, gridItems.length) :\r\n            getLeftElementIndex(focusedElementIndex, gridItems.length);\r\n    }));\r\n    keystrokeHandler.set('arrowup', getGridItemFocuser((focusedElementIndex, gridItems) => {\r\n        let nextIndex = focusedElementIndex - getNumberOfColumns();\r\n        if (nextIndex < 0) {\r\n            nextIndex = focusedElementIndex + getNumberOfColumns() * Math.floor(gridItems.length / getNumberOfColumns());\r\n            if (nextIndex > gridItems.length - 1) {\r\n                nextIndex -= getNumberOfColumns();\r\n            }\r\n        }\r\n        return nextIndex;\r\n    }));\r\n    keystrokeHandler.set('arrowdown', getGridItemFocuser((focusedElementIndex, gridItems) => {\r\n        let nextIndex = focusedElementIndex + getNumberOfColumns();\r\n        if (nextIndex > gridItems.length - 1) {\r\n            nextIndex = focusedElementIndex % getNumberOfColumns();\r\n        }\r\n        return nextIndex;\r\n    }));\r\n    function getGridItemFocuser(getIndexToFocus) {\r\n        return (evt) => {\r\n            const focusedElement = gridItems.find(item => item.element === focusTracker.focusedElement);\r\n            const focusedElementIndex = gridItems.getIndex(focusedElement);\r\n            const nextIndexToFocus = getIndexToFocus(focusedElementIndex, gridItems);\r\n            gridItems.get(nextIndexToFocus).focus();\r\n            evt.stopPropagation();\r\n            evt.preventDefault();\r\n        };\r\n    }\r\n    /**\r\n     * Function returning the next index.\r\n     *\r\n     * ```\r\n     * before: [ ][x][ ]\tafter: [ ][ ][x]\r\n     * index = 1            index = 2\r\n     * ```\r\n     *\r\n     * If current index is last, function returns first index.\r\n     *\r\n     * ```\r\n     * before: [ ][ ][x]\tafter: [x][ ][ ]\r\n     * index = 2            index = 0\r\n     * ```\r\n     *\r\n     * @param elementIndex Number of current index.\r\n     * @param collectionLength A count of collection items.\r\n     */\r\n    function getRightElementIndex(elementIndex, collectionLength) {\r\n        if (elementIndex === collectionLength - 1) {\r\n            return 0;\r\n        }\r\n        else {\r\n            return elementIndex + 1;\r\n        }\r\n    }\r\n    /**\r\n     * Function returning the previous index.\r\n     *\r\n     * ```\r\n     * before: [ ][x][ ]\tafter: [x][ ][ ]\r\n     * index = 1            index = 0\r\n     * ```\r\n     *\r\n     * If current index is first, function returns last index.\r\n     *\r\n     * ```\r\n     * before: [x][ ][ ]\tafter: [ ][ ][x]\r\n     * index = 0            index = 2\r\n     * ```\r\n     *\r\n     * @param elementIndex Number of current index.\r\n     * @param collectionLength A count of collection items.\r\n     */\r\n    function getLeftElementIndex(elementIndex, collectionLength) {\r\n        if (elementIndex === 0) {\r\n            return collectionLength - 1;\r\n        }\r\n        else {\r\n            return elementIndex - 1;\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/editorui/bodycollection\r\n */\r\n/* globals document */\r\nimport Template from '../template';\r\nimport ViewCollection from '../viewcollection';\r\nimport { createElement } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * This is a special {@link module:ui/viewcollection~ViewCollection} dedicated to elements that are detached\r\n * from the DOM structure of the editor, like panels, icons, etc.\r\n *\r\n * The body collection is available in the {@link module:ui/editorui/editoruiview~EditorUIView#body `editor.ui.view.body`} property.\r\n * Any plugin can add a {@link module:ui/view~View view} to this collection.\r\n * These views will render in a container placed directly in the `<body>` element.\r\n * The editor will detach and destroy this collection when the editor will be {@link module:core/editor/editor~Editor#destroy destroyed}.\r\n *\r\n * If you need to control the life cycle of the body collection on your own, you can create your own instance of this class.\r\n *\r\n * A body collection will render itself automatically in the DOM body element as soon as you call {@link ~BodyCollection#attachToDom}.\r\n * If you create multiple body collections, this class will create a special wrapper element in the DOM to limit the number of\r\n * elements created directly in the body and remove it when the last body collection will be\r\n * {@link ~BodyCollection#detachFromDom detached}.\r\n */\r\nexport default class BodyCollection extends ViewCollection {\r\n    /**\r\n     * Creates a new instance of the {@link module:ui/editorui/bodycollection~BodyCollection}.\r\n     *\r\n     * @param locale The {@link module:core/editor/editor~Editor editor's locale} instance.\r\n     * @param initialItems The initial items of the collection.\r\n     */\r\n    constructor(locale, initialItems = []) {\r\n        super(initialItems);\r\n        this.locale = locale;\r\n    }\r\n    /**\r\n     * The element holding elements of the body region.\r\n     */\r\n    get bodyCollectionContainer() {\r\n        return this._bodyCollectionContainer;\r\n    }\r\n    /**\r\n     * Attaches the body collection to the DOM body element. You need to execute this method to render the content of\r\n     * the body collection.\r\n     */\r\n    attachToDom() {\r\n        this._bodyCollectionContainer = new Template({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-reset_all',\r\n                    'ck-body',\r\n                    'ck-rounded-corners'\r\n                ],\r\n                dir: this.locale.uiLanguageDirection\r\n            },\r\n            children: this\r\n        }).render();\r\n        let wrapper = document.querySelector('.ck-body-wrapper');\r\n        if (!wrapper) {\r\n            wrapper = createElement(document, 'div', { class: 'ck-body-wrapper' });\r\n            document.body.appendChild(wrapper);\r\n        }\r\n        wrapper.appendChild(this._bodyCollectionContainer);\r\n    }\r\n    /**\r\n     * Detaches the collection from the DOM structure. Use this method when you do not need to use the body collection\r\n     * anymore to clean-up the DOM structure.\r\n     */\r\n    detachFromDom() {\r\n        super.destroy();\r\n        if (this._bodyCollectionContainer) {\r\n            this._bodyCollectionContainer.remove();\r\n        }\r\n        const wrapper = document.querySelector('.ck-body-wrapper');\r\n        if (wrapper && wrapper.childElementCount == 0) {\r\n            wrapper.remove();\r\n        }\r\n    }\r\n}\r\n","import api from \"!../../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../../css-loader/dist/cjs.js!../../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./switchbutton.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/button/switchbuttonview\r\n */\r\nimport View from '../view';\r\nimport ButtonView from './buttonview';\r\nimport '../../theme/components/button/switchbutton.css';\r\n/**\r\n * The switch button view class.\r\n *\r\n * ```ts\r\n * const view = new SwitchButtonView();\r\n *\r\n * view.set( {\r\n * \twithText: true,\r\n * \tlabel: 'Switch me!'\r\n * } );\r\n *\r\n * view.render();\r\n *\r\n * document.body.append( view.element );\r\n * ```\r\n */\r\nexport default class SwitchButtonView extends ButtonView {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        this.isToggleable = true;\r\n        this.toggleSwitchView = this._createToggleView();\r\n        this.extendTemplate({\r\n            attributes: {\r\n                class: 'ck-switchbutton'\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        this.children.add(this.toggleSwitchView);\r\n    }\r\n    /**\r\n     * Creates a toggle child view.\r\n     */\r\n    _createToggleView() {\r\n        const toggleSwitchView = new View();\r\n        toggleSwitchView.setTemplate({\r\n            tag: 'span',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-button__toggle'\r\n                ]\r\n            },\r\n            children: [\r\n                {\r\n                    tag: 'span',\r\n                    attributes: {\r\n                        class: [\r\n                            'ck',\r\n                            'ck-button__toggle__inner'\r\n                        ]\r\n                    }\r\n                }\r\n            ]\r\n        });\r\n        return toggleSwitchView;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * Returns color configuration options as defined in `editor.config.(fontColor|fontBackgroundColor).colors` or\r\n * `editor.config.table.(tableProperties|tableCellProperties).(background|border).colors\r\n * but processed to account for editor localization in the correct language.\r\n *\r\n * Note: The reason behind this method is that there is no way to use {@link module:utils/locale~Locale#t}\r\n * when the user configuration is defined because the editor does not exist yet.\r\n *\r\n * @param locale The {@link module:core/editor/editor~Editor#locale} instance.\r\n */\r\nexport function getLocalizedColorOptions(locale, options) {\r\n    const t = locale.t;\r\n    const localizedColorNames = {\r\n        Black: t('Black'),\r\n        'Dim grey': t('Dim grey'),\r\n        Grey: t('Grey'),\r\n        'Light grey': t('Light grey'),\r\n        White: t('White'),\r\n        Red: t('Red'),\r\n        Orange: t('Orange'),\r\n        Yellow: t('Yellow'),\r\n        'Light green': t('Light green'),\r\n        Green: t('Green'),\r\n        Aquamarine: t('Aquamarine'),\r\n        Turquoise: t('Turquoise'),\r\n        'Light blue': t('Light blue'),\r\n        Blue: t('Blue'),\r\n        Purple: t('Purple')\r\n    };\r\n    return options.map(colorOption => {\r\n        const label = localizedColorNames[colorOption.label];\r\n        if (label && label != colorOption.label) {\r\n            colorOption.label = label;\r\n        }\r\n        return colorOption;\r\n    });\r\n}\r\n/**\r\n * Creates a unified color definition object from color configuration options.\r\n * The object contains the information necessary to both render the UI and initialize the conversion.\r\n */\r\nexport function normalizeColorOptions(options) {\r\n    return options\r\n        .map(normalizeSingleColorDefinition)\r\n        .filter(option => !!option);\r\n}\r\n/**\r\n * Creates a normalized color definition from the user-defined configuration.\r\n * The \"normalization\" means it will create full\r\n * {@link module:ui/colorgrid/colorgridview~ColorDefinition `ColorDefinition-like`}\r\n * object for string values, and add a `view` property, for each definition.\r\n */\r\nexport function normalizeSingleColorDefinition(color) {\r\n    if (typeof color === 'string') {\r\n        return {\r\n            model: color,\r\n            label: color,\r\n            hasBorder: false,\r\n            view: {\r\n                name: 'span',\r\n                styles: {\r\n                    color\r\n                }\r\n            }\r\n        };\r\n    }\r\n    else {\r\n        return {\r\n            model: color.color,\r\n            label: color.label || color.color,\r\n            hasBorder: color.hasBorder === undefined ? false : color.hasBorder,\r\n            view: {\r\n                name: 'span',\r\n                styles: {\r\n                    color: `${color.color}`\r\n                }\r\n            }\r\n        };\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/colorgrid/colortileview\r\n */\r\nimport ButtonView from '../button/buttonview';\r\nimport checkIcon from '../../theme/icons/color-tile-check.svg';\r\n/**\r\n * This class represents a single color tile in the {@link module:ui/colorgrid/colorgridview~ColorGridView}.\r\n */\r\nexport default class ColorTileView extends ButtonView {\r\n    constructor(locale) {\r\n        super(locale);\r\n        const bind = this.bindTemplate;\r\n        this.set('color', undefined);\r\n        this.set('hasBorder', false);\r\n        this.icon = checkIcon;\r\n        this.extendTemplate({\r\n            attributes: {\r\n                style: {\r\n                    backgroundColor: bind.to('color')\r\n                },\r\n                class: [\r\n                    'ck',\r\n                    'ck-color-grid__tile',\r\n                    bind.if('hasBorder', 'ck-color-table__color-tile_bordered')\r\n                ]\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        this.iconView.fillColor = 'hsl(0, 0%, 100%)';\r\n    }\r\n}\r\n","export default \"<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>\";","import api from \"!../../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../../css-loader/dist/cjs.js!../../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./colorgrid.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/colorgrid/colorgridview\r\n */\r\nimport View from '../view';\r\nimport ColorTileView from './colortileview';\r\nimport addKeyboardHandlingForGrid from '../bindings/addkeyboardhandlingforgrid';\r\nimport { FocusTracker, KeystrokeHandler } from '@ckeditor/ckeditor5-utils';\r\nimport '../../theme/components/colorgrid/colorgrid.css';\r\n/**\r\n * A grid of {@link module:ui/colorgrid/colortileview~ColorTileView color tiles}.\r\n */\r\nexport default class ColorGridView extends View {\r\n    /**\r\n     * Creates an instance of a color grid containing {@link module:ui/colorgrid/colortileview~ColorTileView tiles}.\r\n     *\r\n     * @fires execute\r\n     * @param locale The localization services instance.\r\n     * @param options Component configuration\r\n     * @param options.colorDefinitions Array with definitions\r\n     * required to create the {@link module:ui/colorgrid/colortileview~ColorTileView tiles}.\r\n     * @param options.columns A number of columns to display the tiles.\r\n     */\r\n    constructor(locale, options) {\r\n        super(locale);\r\n        const colorDefinitions = options && options.colorDefinitions ? options.colorDefinitions : [];\r\n        this.columns = options && options.columns ? options.columns : 5;\r\n        const viewStyleAttribute = {\r\n            gridTemplateColumns: `repeat( ${this.columns}, 1fr)`\r\n        };\r\n        this.set('selectedColor', undefined);\r\n        this.items = this.createCollection();\r\n        this.focusTracker = new FocusTracker();\r\n        this.keystrokes = new KeystrokeHandler();\r\n        this.items.on('add', (evt, colorTile) => {\r\n            colorTile.isOn = colorTile.color === this.selectedColor;\r\n        });\r\n        colorDefinitions.forEach(color => {\r\n            const colorTile = new ColorTileView();\r\n            colorTile.set({\r\n                color: color.color,\r\n                label: color.label,\r\n                tooltip: true,\r\n                hasBorder: color.options.hasBorder\r\n            });\r\n            colorTile.on('execute', () => {\r\n                this.fire('execute', {\r\n                    value: color.color,\r\n                    hasBorder: color.options.hasBorder,\r\n                    label: color.label\r\n                });\r\n            });\r\n            this.items.add(colorTile);\r\n        });\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            children: this.items,\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-color-grid'\r\n                ],\r\n                style: viewStyleAttribute\r\n            }\r\n        });\r\n        this.on('change:selectedColor', (evt, name, selectedColor) => {\r\n            for (const item of this.items) {\r\n                item.isOn = item.color === selectedColor;\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Focuses the first focusable in {@link #items}.\r\n     */\r\n    focus() {\r\n        if (this.items.length) {\r\n            this.items.first.focus();\r\n        }\r\n    }\r\n    /**\r\n     * Focuses the last focusable in {@link #items}.\r\n     */\r\n    focusLast() {\r\n        if (this.items.length) {\r\n            this.items.last.focus();\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        // Items added before rendering should be known to the #focusTracker.\r\n        for (const item of this.items) {\r\n            this.focusTracker.add(item.element);\r\n        }\r\n        this.items.on('add', (evt, item) => {\r\n            this.focusTracker.add(item.element);\r\n        });\r\n        this.items.on('remove', (evt, item) => {\r\n            this.focusTracker.remove(item.element);\r\n        });\r\n        // Start listening for the keystrokes coming from #element.\r\n        this.keystrokes.listenTo(this.element);\r\n        addKeyboardHandlingForGrid({\r\n            keystrokeHandler: this.keystrokes,\r\n            focusTracker: this.focusTracker,\r\n            gridItems: this.items,\r\n            numberOfColumns: this.columns,\r\n            uiLanguageDirection: this.locale && this.locale.uiLanguageDirection\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        this.focusTracker.destroy();\r\n        this.keystrokes.destroy();\r\n    }\r\n}\r\n","/**\r\n * @module color-parse\r\n */\r\nimport names from 'color-name'\r\n\r\nexport default parse\r\n\r\n/**\r\n * Base hues\r\n * http://dev.w3.org/csswg/css-color/#typedef-named-hue\r\n */\r\n//FIXME: use external hue detector\r\nvar baseHues = {\r\n\tred: 0,\r\n\torange: 60,\r\n\tyellow: 120,\r\n\tgreen: 180,\r\n\tblue: 240,\r\n\tpurple: 300\r\n}\r\n\r\n/**\r\n * Parse color from the string passed\r\n *\r\n * @return {Object} A space indicator `space`, an array `values` and `alpha`\r\n */\r\nfunction parse (cstr) {\r\n\tvar m, parts = [], alpha = 1, space\r\n\r\n\tif (typeof cstr === 'string') {\r\n\t\t//keyword\r\n\t\tif (names[cstr]) {\r\n\t\t\tparts = names[cstr].slice()\r\n\t\t\tspace = 'rgb'\r\n\t\t}\r\n\r\n\t\t//reserved words\r\n\t\telse if (cstr === 'transparent') {\r\n\t\t\talpha = 0\r\n\t\t\tspace = 'rgb'\r\n\t\t\tparts = [0,0,0]\r\n\t\t}\r\n\r\n\t\t//hex\r\n\t\telse if (/^#[A-Fa-f0-9]+$/.test(cstr)) {\r\n\t\t\tvar base = cstr.slice(1)\r\n\t\t\tvar size = base.length\r\n\t\t\tvar isShort = size <= 4\r\n\t\t\talpha = 1\r\n\r\n\t\t\tif (isShort) {\r\n\t\t\t\tparts = [\r\n\t\t\t\t\tparseInt(base[0] + base[0], 16),\r\n\t\t\t\t\tparseInt(base[1] + base[1], 16),\r\n\t\t\t\t\tparseInt(base[2] + base[2], 16)\r\n\t\t\t\t]\r\n\t\t\t\tif (size === 4) {\r\n\t\t\t\t\talpha = parseInt(base[3] + base[3], 16) / 255\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tparts = [\r\n\t\t\t\t\tparseInt(base[0] + base[1], 16),\r\n\t\t\t\t\tparseInt(base[2] + base[3], 16),\r\n\t\t\t\t\tparseInt(base[4] + base[5], 16)\r\n\t\t\t\t]\r\n\t\t\t\tif (size === 8) {\r\n\t\t\t\t\talpha = parseInt(base[6] + base[7], 16) / 255\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (!parts[0]) parts[0] = 0\r\n\t\t\tif (!parts[1]) parts[1] = 0\r\n\t\t\tif (!parts[2]) parts[2] = 0\r\n\r\n\t\t\tspace = 'rgb'\r\n\t\t}\r\n\r\n\t\t//color space\r\n\t\telse if (m = /^((?:rgb|hs[lvb]|hwb|cmyk?|xy[zy]|gray|lab|lchu?v?|[ly]uv|lms)a?)\\s*\\(([^\\)]*)\\)/.exec(cstr)) {\r\n\t\t\tvar name = m[1]\r\n\t\t\tvar isRGB = name === 'rgb'\r\n\t\t\tvar base = name.replace(/a$/, '')\r\n\t\t\tspace = base\r\n\t\t\tvar size = base === 'cmyk' ? 4 : base === 'gray' ? 1 : 3\r\n\t\t\tparts = m[2].trim()\r\n\t\t\t\t.split(/\\s*[,\\/]\\s*|\\s+/)\r\n\t\t\t\t.map(function (x, i) {\r\n\t\t\t\t\t//<percentage>\r\n\t\t\t\t\tif (/%$/.test(x)) {\r\n\t\t\t\t\t\t//alpha\r\n\t\t\t\t\t\tif (i === size)\treturn parseFloat(x) / 100\r\n\t\t\t\t\t\t//rgb\r\n\t\t\t\t\t\tif (base === 'rgb') return parseFloat(x) * 255 / 100\r\n\t\t\t\t\t\treturn parseFloat(x)\r\n\t\t\t\t\t}\r\n\t\t\t\t\t//hue\r\n\t\t\t\t\telse if (base[i] === 'h') {\r\n\t\t\t\t\t\t//<deg>\r\n\t\t\t\t\t\tif (/deg$/.test(x)) {\r\n\t\t\t\t\t\t\treturn parseFloat(x)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t//<base-hue>\r\n\t\t\t\t\t\telse if (baseHues[x] !== undefined) {\r\n\t\t\t\t\t\t\treturn baseHues[x]\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn parseFloat(x)\r\n\t\t\t\t})\r\n\r\n\t\t\tif (name === base) parts.push(1)\r\n\t\t\talpha = (isRGB) ? 1 : (parts[size] === undefined) ? 1 : parts[size]\r\n\t\t\tparts = parts.slice(0, size)\r\n\t\t}\r\n\r\n\t\t//named channels case\r\n\t\telse if (cstr.length > 10 && /[0-9](?:\\s|\\/)/.test(cstr)) {\r\n\t\t\tparts = cstr.match(/([0-9]+)/g).map(function (value) {\r\n\t\t\t\treturn parseFloat(value)\r\n\t\t\t})\r\n\r\n\t\t\tspace = cstr.match(/([a-z])/ig).join('').toLowerCase()\r\n\t\t}\r\n\t}\r\n\r\n\t//numeric case\r\n\telse if (!isNaN(cstr)) {\r\n\t\tspace = 'rgb'\r\n\t\tparts = [cstr >>> 16, (cstr & 0x00ff00) >>> 8, cstr & 0x0000ff]\r\n\t}\r\n\r\n\t//array-like\r\n\telse if (Array.isArray(cstr) || cstr.length) {\r\n\t\tparts = [cstr[0], cstr[1], cstr[2]]\r\n\t\tspace = 'rgb'\r\n\t\talpha = cstr.length === 4 ? cstr[3] : 1\r\n\t}\r\n\r\n\t//object case - detects css cases of rgb and hsl\r\n\telse if (cstr instanceof Object) {\r\n\t\tif (cstr.r != null || cstr.red != null || cstr.R != null) {\r\n\t\t\tspace = 'rgb'\r\n\t\t\tparts = [\r\n\t\t\t\tcstr.r || cstr.red || cstr.R || 0,\r\n\t\t\t\tcstr.g || cstr.green || cstr.G || 0,\r\n\t\t\t\tcstr.b || cstr.blue || cstr.B || 0\r\n\t\t\t]\r\n\t\t}\r\n\t\telse {\r\n\t\t\tspace = 'hsl'\r\n\t\t\tparts = [\r\n\t\t\t\tcstr.h || cstr.hue || cstr.H || 0,\r\n\t\t\t\tcstr.s || cstr.saturation || cstr.S || 0,\r\n\t\t\t\tcstr.l || cstr.lightness || cstr.L || cstr.b || cstr.brightness\r\n\t\t\t]\r\n\t\t}\r\n\r\n\t\talpha = cstr.a || cstr.alpha || cstr.opacity || 1\r\n\r\n\t\tif (cstr.opacity != null) alpha /= 100\r\n\t}\r\n\r\n\treturn {\r\n\t\tspace: space,\r\n\t\tvalues: parts,\r\n\t\talpha: alpha\r\n\t}\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/colorpicker/utils\r\n */\r\n/* eslint-disable @typescript-eslint/ban-ts-comment */\r\n// There are no available types for 'color-parse' module.\r\n// @ts-ignore\r\nimport { default as parse } from 'color-parse';\r\nimport * as convert from 'color-convert';\r\n/**\r\n * Parses and converts the color string to requested format. Handles variety of color spaces\r\n * like `hsl`, `hex` or `rgb`.\r\n *\r\n * @param color\r\n * @returns A color string.\r\n */\r\nexport function convertColor(color, outputFormat) {\r\n    if (!color) {\r\n        return '';\r\n    }\r\n    const colorObject = parseColorString(color);\r\n    if (!colorObject) {\r\n        return '';\r\n    }\r\n    if (colorObject.space === outputFormat) {\r\n        return color;\r\n    }\r\n    if (!canConvertParsedColor(colorObject)) {\r\n        return '';\r\n    }\r\n    const fromColorSpace = convert[colorObject.space];\r\n    const toColorSpace = fromColorSpace[outputFormat];\r\n    if (!toColorSpace) {\r\n        return '';\r\n    }\r\n    const convertedColorChannels = toColorSpace(colorObject.space === 'hex' ? colorObject.hexValue : colorObject.values);\r\n    return formatColorOutput(convertedColorChannels, outputFormat);\r\n}\r\n/**\r\n * Converts a color string to hex format.\r\n *\r\n * @param color\r\n * @returns A color string.\r\n */\r\nexport function convertToHex(color) {\r\n    if (!color) {\r\n        return '';\r\n    }\r\n    const colorObject = parseColorString(color);\r\n    if (!colorObject) {\r\n        return '#000';\r\n    }\r\n    if (colorObject.space === 'hex') {\r\n        return colorObject.hexValue;\r\n    }\r\n    return convertColor(color, 'hex');\r\n}\r\n/**\r\n * Formats the passed color channels according to the requested format.\r\n *\r\n * @param values\r\n * @param format\r\n * @returns A color string.\r\n */\r\nfunction formatColorOutput(values, format) {\r\n    switch (format) {\r\n        case 'hex': return `#${values}`;\r\n        case 'rgb': return `rgb( ${values[0]}, ${values[1]}, ${values[2]} )`;\r\n        case 'hsl': return `hsl( ${values[0]}, ${values[1]}%, ${values[2]}% )`;\r\n        case 'hwb': return `hwb( ${values[0]}, ${values[1]}, ${values[2]} )`;\r\n        case 'lab': return `lab( ${values[0]}% ${values[1]} ${values[2]} )`;\r\n        case 'lch': return `lch( ${values[0]}% ${values[1]} ${values[2]} )`;\r\n        default: return '';\r\n    }\r\n}\r\nfunction parseColorString(colorString) {\r\n    // Parser library treats `hex` format as belonging to `rgb` space | which messes up further conversion.\r\n    // Let's parse such strings on our own.\r\n    if (colorString.startsWith('#')) {\r\n        const parsedHex = parse(colorString);\r\n        return {\r\n            space: 'hex',\r\n            values: parsedHex.values,\r\n            hexValue: colorString,\r\n            alpha: parsedHex.alpha\r\n        };\r\n    }\r\n    const parsed = parse(colorString);\r\n    if (!parsed.space) {\r\n        return null;\r\n    }\r\n    return parsed;\r\n}\r\nfunction canConvertParsedColor(parsedColor) {\r\n    return Object.keys(convert).includes(parsedColor.space);\r\n}\r\n","import root from './_root.js';\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n *   console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n  return root.Date.now();\n};\n\nexport default now;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n  var index = string.length;\n\n  while (index-- && reWhitespace.test(string.charAt(index))) {}\n  return index;\n}\n\nexport default trimmedEndIndex;\n","import trimmedEndIndex from './_trimmedEndIndex.js';\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n  return string\n    ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n    : string;\n}\n\nexport default baseTrim;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nexport default isSymbol;\n","import baseTrim from './_baseTrim.js';\nimport isObject from './isObject.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n  if (typeof value == 'number') {\n    return value;\n  }\n  if (isSymbol(value)) {\n    return NAN;\n  }\n  if (isObject(value)) {\n    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n    value = isObject(other) ? (other + '') : other;\n  }\n  if (typeof value != 'string') {\n    return value === 0 ? value : +value;\n  }\n  value = baseTrim(value);\n  var isBinary = reIsBinary.test(value);\n  return (isBinary || reIsOctal.test(value))\n    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n    : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nexport default toNumber;\n","import isObject from './isObject.js';\nimport now from './now.js';\nimport toNumber from './toNumber.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n    nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n *  Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n *  The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n *  Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n *   'leading': true,\n *   'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n  var lastArgs,\n      lastThis,\n      maxWait,\n      result,\n      timerId,\n      lastCallTime,\n      lastInvokeTime = 0,\n      leading = false,\n      maxing = false,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  wait = toNumber(wait) || 0;\n  if (isObject(options)) {\n    leading = !!options.leading;\n    maxing = 'maxWait' in options;\n    maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n\n  function invokeFunc(time) {\n    var args = lastArgs,\n        thisArg = lastThis;\n\n    lastArgs = lastThis = undefined;\n    lastInvokeTime = time;\n    result = func.apply(thisArg, args);\n    return result;\n  }\n\n  function leadingEdge(time) {\n    // Reset any `maxWait` timer.\n    lastInvokeTime = time;\n    // Start the timer for the trailing edge.\n    timerId = setTimeout(timerExpired, wait);\n    // Invoke the leading edge.\n    return leading ? invokeFunc(time) : result;\n  }\n\n  function remainingWait(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime,\n        timeWaiting = wait - timeSinceLastCall;\n\n    return maxing\n      ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n      : timeWaiting;\n  }\n\n  function shouldInvoke(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime;\n\n    // Either this is the first call, activity has stopped and we're at the\n    // trailing edge, the system time has gone backwards and we're treating\n    // it as the trailing edge, or we've hit the `maxWait` limit.\n    return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n      (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n  }\n\n  function timerExpired() {\n    var time = now();\n    if (shouldInvoke(time)) {\n      return trailingEdge(time);\n    }\n    // Restart the timer.\n    timerId = setTimeout(timerExpired, remainingWait(time));\n  }\n\n  function trailingEdge(time) {\n    timerId = undefined;\n\n    // Only invoke if we have `lastArgs` which means `func` has been\n    // debounced at least once.\n    if (trailing && lastArgs) {\n      return invokeFunc(time);\n    }\n    lastArgs = lastThis = undefined;\n    return result;\n  }\n\n  function cancel() {\n    if (timerId !== undefined) {\n      clearTimeout(timerId);\n    }\n    lastInvokeTime = 0;\n    lastArgs = lastCallTime = lastThis = timerId = undefined;\n  }\n\n  function flush() {\n    return timerId === undefined ? result : trailingEdge(now());\n  }\n\n  function debounced() {\n    var time = now(),\n        isInvoking = shouldInvoke(time);\n\n    lastArgs = arguments;\n    lastThis = this;\n    lastCallTime = time;\n\n    if (isInvoking) {\n      if (timerId === undefined) {\n        return leadingEdge(lastCallTime);\n      }\n      if (maxing) {\n        // Handle invocations in a tight loop.\n        clearTimeout(timerId);\n        timerId = setTimeout(timerExpired, wait);\n        return invokeFunc(lastCallTime);\n      }\n    }\n    if (timerId === undefined) {\n      timerId = setTimeout(timerExpired, wait);\n    }\n    return result;\n  }\n  debounced.cancel = cancel;\n  debounced.flush = flush;\n  return debounced;\n}\n\nexport default debounce;\n","import api from \"!../../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../../css-loader/dist/cjs.js!../../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./label.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/label/labelview\r\n */\r\nimport View from '../view';\r\nimport { uid } from '@ckeditor/ckeditor5-utils';\r\nimport '../../theme/components/label/label.css';\r\n/**\r\n * The label view class.\r\n */\r\nexport default class LabelView extends View {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        this.set('text', undefined);\r\n        this.set('for', undefined);\r\n        this.id = `ck-editor__label_${uid()}`;\r\n        const bind = this.bindTemplate;\r\n        this.setTemplate({\r\n            tag: 'label',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-label'\r\n                ],\r\n                id: this.id,\r\n                for: bind.to('for')\r\n            },\r\n            children: [\r\n                {\r\n                    text: bind.to('text')\r\n                }\r\n            ]\r\n        });\r\n    }\r\n}\r\n","import api from \"!../../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../../css-loader/dist/cjs.js!../../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./labeledfieldview.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/labeledfield/labeledfieldview\r\n */\r\nimport View from '../view';\r\nimport LabelView from '../label/labelview';\r\nimport { uid } from '@ckeditor/ckeditor5-utils';\r\nimport '../../theme/components/labeledfield/labeledfieldview.css';\r\n/**\r\n * The labeled field view class. It can be used to enhance any view with the following features:\r\n *\r\n * * a label,\r\n * * (optional) an error message,\r\n * * (optional) an info (status) text,\r\n *\r\n * all bound logically by proper DOM attributes for UX and accessibility.  It also provides an interface\r\n * (e.g. observable properties) that allows controlling those additional features.\r\n *\r\n * The constructor of this class requires a callback that returns a view to be labeled. The callback\r\n * is called with unique ids that allow binding of DOM properties:\r\n *\r\n * ```ts\r\n * const labeledInputView = new LabeledFieldView( locale, ( labeledFieldView, viewUid, statusUid ) => {\r\n * \tconst inputView = new InputTextView( labeledFieldView.locale );\r\n *\r\n * \tinputView.set( {\r\n * \t\tid: viewUid,\r\n * \t\tariaDescribedById: statusUid\r\n * \t} );\r\n *\r\n * \tinputView.bind( 'isReadOnly' ).to( labeledFieldView, 'isEnabled', value => !value );\r\n * \tinputView.bind( 'hasError' ).to( labeledFieldView, 'errorText', value => !!value );\r\n *\r\n * \treturn inputView;\r\n * } );\r\n *\r\n * labeledInputView.label = 'User name';\r\n * labeledInputView.infoText = 'Full name like for instance, John Doe.';\r\n * labeledInputView.render();\r\n *\r\n * document.body.append( labeledInputView.element );\r\n * ```\r\n *\r\n * See {@link module:ui/labeledfield/utils} to discover ready–to–use labeled input helpers for common\r\n * UI components.\r\n */\r\nexport default class LabeledFieldView extends View {\r\n    /**\r\n     * Creates an instance of the labeled field view class using a provided creator function\r\n     * that provides the view to be labeled.\r\n     *\r\n     * @param locale The locale instance.\r\n     * @param viewCreator A function that returns a {@link module:ui/view~View}\r\n     * that will be labeled. The following arguments are passed to the creator function:\r\n     *\r\n     * * an instance of the `LabeledFieldView` to allow binding observable properties,\r\n     * * an UID string that connects the {@link #labelView label} and the labeled field view in DOM,\r\n     * * an UID string that connects the {@link #statusView status} and the labeled field view in DOM.\r\n     */\r\n    constructor(locale, viewCreator) {\r\n        super(locale);\r\n        const viewUid = `ck-labeled-field-view-${uid()}`;\r\n        const statusUid = `ck-labeled-field-view-status-${uid()}`;\r\n        this.fieldView = viewCreator(this, viewUid, statusUid);\r\n        this.set('label', undefined);\r\n        this.set('isEnabled', true);\r\n        this.set('isEmpty', true);\r\n        this.set('isFocused', false);\r\n        this.set('errorText', null);\r\n        this.set('infoText', null);\r\n        this.set('class', undefined);\r\n        this.set('placeholder', undefined);\r\n        this.labelView = this._createLabelView(viewUid);\r\n        this.statusView = this._createStatusView(statusUid);\r\n        this.fieldWrapperChildren = this.createCollection([this.fieldView, this.labelView]);\r\n        this.bind('_statusText').to(this, 'errorText', this, 'infoText', (errorText, infoText) => errorText || infoText);\r\n        const bind = this.bindTemplate;\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-labeled-field-view',\r\n                    bind.to('class'),\r\n                    bind.if('isEnabled', 'ck-disabled', value => !value),\r\n                    bind.if('isEmpty', 'ck-labeled-field-view_empty'),\r\n                    bind.if('isFocused', 'ck-labeled-field-view_focused'),\r\n                    bind.if('placeholder', 'ck-labeled-field-view_placeholder'),\r\n                    bind.if('errorText', 'ck-error')\r\n                ]\r\n            },\r\n            children: [\r\n                {\r\n                    tag: 'div',\r\n                    attributes: {\r\n                        class: [\r\n                            'ck',\r\n                            'ck-labeled-field-view__input-wrapper'\r\n                        ]\r\n                    },\r\n                    children: this.fieldWrapperChildren\r\n                },\r\n                this.statusView\r\n            ]\r\n        });\r\n    }\r\n    /**\r\n     * Creates label view class instance and bind with view.\r\n     *\r\n     * @param id Unique id to set as labelView#for attribute.\r\n     */\r\n    _createLabelView(id) {\r\n        const labelView = new LabelView(this.locale);\r\n        labelView.for = id;\r\n        labelView.bind('text').to(this, 'label');\r\n        return labelView;\r\n    }\r\n    /**\r\n     * Creates the status view instance. It displays {@link #errorText} and {@link #infoText}\r\n     * next to the {@link #fieldView}. See {@link #_statusText}.\r\n     *\r\n     * @param statusUid Unique id of the status, shared with the {@link #fieldView view's}\r\n     * `aria-describedby` attribute.\r\n     */\r\n    _createStatusView(statusUid) {\r\n        const statusView = new View(this.locale);\r\n        const bind = this.bindTemplate;\r\n        statusView.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-labeled-field-view__status',\r\n                    bind.if('errorText', 'ck-labeled-field-view__status_error'),\r\n                    bind.if('_statusText', 'ck-hidden', value => !value)\r\n                ],\r\n                id: statusUid,\r\n                role: bind.if('errorText', 'alert')\r\n            },\r\n            children: [\r\n                {\r\n                    text: bind.to('_statusText')\r\n                }\r\n            ]\r\n        });\r\n        return statusView;\r\n    }\r\n    /**\r\n     * Focuses the {@link #fieldView}.\r\n     */\r\n    focus() {\r\n        this.fieldView.focus();\r\n    }\r\n}\r\n","import api from \"!../../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../../css-loader/dist/cjs.js!../../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./input.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/input/inputview\r\n */\r\nimport View from '../view';\r\nimport { FocusTracker } from '@ckeditor/ckeditor5-utils';\r\nimport '../../theme/components/input/input.css';\r\n/**\r\n * The base input view class.\r\n */\r\nexport default class InputView extends View {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        this.set('value', undefined);\r\n        this.set('id', undefined);\r\n        this.set('placeholder', undefined);\r\n        this.set('isReadOnly', false);\r\n        this.set('hasError', false);\r\n        this.set('ariaDescribedById', undefined);\r\n        this.focusTracker = new FocusTracker();\r\n        this.bind('isFocused').to(this.focusTracker);\r\n        this.set('isEmpty', true);\r\n        this.set('inputMode', 'text');\r\n        const bind = this.bindTemplate;\r\n        this.setTemplate({\r\n            tag: 'input',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-input',\r\n                    bind.if('isFocused', 'ck-input_focused'),\r\n                    bind.if('isEmpty', 'ck-input-text_empty'),\r\n                    bind.if('hasError', 'ck-error')\r\n                ],\r\n                id: bind.to('id'),\r\n                placeholder: bind.to('placeholder'),\r\n                readonly: bind.to('isReadOnly'),\r\n                inputmode: bind.to('inputMode'),\r\n                'aria-invalid': bind.if('hasError', true),\r\n                'aria-describedby': bind.to('ariaDescribedById')\r\n            },\r\n            on: {\r\n                input: bind.to((...args) => {\r\n                    this.fire('input', ...args);\r\n                    this._updateIsEmpty();\r\n                }),\r\n                change: bind.to(this._updateIsEmpty.bind(this))\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        this.focusTracker.add(this.element);\r\n        this._setDomElementValue(this.value);\r\n        this._updateIsEmpty();\r\n        // Bind `this.value` to the DOM element's value.\r\n        // We cannot use `value` DOM attribute because removing it on Edge does not clear the DOM element's value property.\r\n        this.on('change:value', (evt, name, value) => {\r\n            this._setDomElementValue(value);\r\n            this._updateIsEmpty();\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        this.focusTracker.destroy();\r\n    }\r\n    /**\r\n     * Moves the focus to the input and selects the value.\r\n     */\r\n    select() {\r\n        this.element.select();\r\n    }\r\n    /**\r\n     * Focuses the input.\r\n     */\r\n    focus() {\r\n        this.element.focus();\r\n    }\r\n    /**\r\n     * Updates the {@link #isEmpty} property value on demand.\r\n     */\r\n    _updateIsEmpty() {\r\n        this.isEmpty = isInputElementEmpty(this.element);\r\n    }\r\n    /**\r\n     * Sets the `value` property of the {@link #element DOM element} on demand.\r\n     */\r\n    _setDomElementValue(value) {\r\n        this.element.value = (!value && value !== 0) ? '' : value;\r\n    }\r\n}\r\nfunction isInputElementEmpty(domElement) {\r\n    return !domElement.value;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/inputtext/inputtextview\r\n */\r\nimport InputView from '../input/inputview';\r\n/**\r\n * The text input view class.\r\n */\r\nexport default class InputTextView extends InputView {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        this.extendTemplate({\r\n            attributes: {\r\n                type: 'text',\r\n                class: [\r\n                    'ck-input-text'\r\n                ]\r\n            }\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/inputnumber/inputnumberview\r\n */\r\nimport InputView from '../input/inputview';\r\n/**\r\n * The number input view class.\r\n */\r\nexport default class InputNumberView extends InputView {\r\n    /**\r\n     * Creates an instance of the input number view.\r\n     *\r\n     * @param locale The {@link module:core/editor/editor~Editor#locale} instance.\r\n     * @param options The options of the input.\r\n     * @param options.min The value of the `min` DOM attribute (the lowest accepted value).\r\n     * @param options.max The value of the `max` DOM attribute (the highest accepted value).\r\n     * @param options.step The value of the `step` DOM attribute.\r\n     */\r\n    constructor(locale, { min, max, step } = {}) {\r\n        super(locale);\r\n        const bind = this.bindTemplate;\r\n        this.set('min', min);\r\n        this.set('max', max);\r\n        this.set('step', step);\r\n        this.extendTemplate({\r\n            attributes: {\r\n                type: 'number',\r\n                class: [\r\n                    'ck-input-number'\r\n                ],\r\n                min: bind.to('min'),\r\n                max: bind.to('max'),\r\n                step: bind.to('step')\r\n            }\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/dropdown/dropdownpanelview\r\n */\r\nimport View from '../view';\r\nimport { logWarning } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * The dropdown panel view class.\r\n *\r\n * See {@link module:ui/dropdown/dropdownview~DropdownView} to learn about the common usage.\r\n */\r\nexport default class DropdownPanelView extends View {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        const bind = this.bindTemplate;\r\n        this.set('isVisible', false);\r\n        this.set('position', 'se');\r\n        this.children = this.createCollection();\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-reset',\r\n                    'ck-dropdown__panel',\r\n                    bind.to('position', value => `ck-dropdown__panel_${value}`),\r\n                    bind.if('isVisible', 'ck-dropdown__panel-visible')\r\n                ]\r\n            },\r\n            children: this.children,\r\n            on: {\r\n                // Drag and drop in the panel should not break the selection in the editor.\r\n                // https://github.com/ckeditor/ckeditor5-ui/issues/228\r\n                selectstart: bind.to(evt => {\r\n                    if (evt.target.tagName.toLocaleLowerCase() === 'input') {\r\n                        return;\r\n                    }\r\n                    evt.preventDefault();\r\n                })\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Focuses the first view in the {@link #children} collection.\r\n     *\r\n     * See also {@link module:ui/dropdown/dropdownpanelfocusable~DropdownPanelFocusable}.\r\n     */\r\n    focus() {\r\n        if (this.children.length) {\r\n            const firstChild = this.children.first;\r\n            if (typeof firstChild.focus === 'function') {\r\n                firstChild.focus();\r\n            }\r\n            else {\r\n                /**\r\n                 * The child view of a dropdown could not be focused because it is missing the `focus()` method.\r\n                 *\r\n                 * This warning appears when a dropdown {@link module:ui/dropdown/dropdownview~DropdownView#isOpen gets open} and it\r\n                 * attempts to focus the {@link module:ui/dropdown/dropdownpanelview~DropdownPanelView#children first child} of its panel\r\n                 * but the child does not implement the\r\n                 * {@link module:ui/dropdown/dropdownpanelfocusable~DropdownPanelFocusable focusable interface}.\r\n                 *\r\n                 * Focusing the content of a dropdown on open greatly improves the accessibility. Please make sure the view instance\r\n                 * provides the `focus()` method for the best user experience.\r\n                 *\r\n                 * @error ui-dropdown-panel-focus-child-missing-focus\r\n                 * @param childView\r\n                 * @param dropdownPanel\r\n                 */\r\n                logWarning('ui-dropdown-panel-focus-child-missing-focus', { childView: this.children.first, dropdownPanel: this });\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Focuses the view element or last item in view collection on opening dropdown's panel.\r\n     *\r\n     * See also {@link module:ui/dropdown/dropdownpanelfocusable~DropdownPanelFocusable}.\r\n     */\r\n    focusLast() {\r\n        if (this.children.length) {\r\n            const lastChild = this.children.last;\r\n            if (typeof lastChild.focusLast === 'function') {\r\n                lastChild.focusLast();\r\n            }\r\n            else {\r\n                lastChild.focus();\r\n            }\r\n        }\r\n    }\r\n}\r\n","import api from \"!../../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../../css-loader/dist/cjs.js!../../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./dropdown.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/dropdown/dropdownview\r\n */\r\nimport View from '../view';\r\nimport { KeystrokeHandler, FocusTracker, getOptimalPosition } from '@ckeditor/ckeditor5-utils';\r\nimport '../../theme/components/dropdown/dropdown.css';\r\n/**\r\n * The dropdown view class. It manages the dropdown button and dropdown panel.\r\n *\r\n * In most cases, the easiest way to create a dropdown is by using the {@link module:ui/dropdown/utils~createDropdown}\r\n * util:\r\n *\r\n * ```ts\r\n * const dropdown = createDropdown( locale );\r\n *\r\n * // Configure dropdown's button properties:\r\n * dropdown.buttonView.set( {\r\n * \tlabel: 'A dropdown',\r\n * \twithText: true\r\n * } );\r\n *\r\n * dropdown.render();\r\n *\r\n * dropdown.panelView.element.textContent = 'Content of the panel';\r\n *\r\n * // Will render a dropdown with a panel containing a \"Content of the panel\" text.\r\n * document.body.appendChild( dropdown.element );\r\n * ```\r\n *\r\n * If you want to add a richer content to the dropdown panel, you can use the {@link module:ui/dropdown/utils~addListToDropdown}\r\n * and {@link module:ui/dropdown/utils~addToolbarToDropdown} helpers. See more examples in\r\n * {@link module:ui/dropdown/utils~createDropdown} documentation.\r\n *\r\n * If you want to create a completely custom dropdown, then you can compose it manually:\r\n *\r\n * ```ts\r\n * const button = new DropdownButtonView( locale );\r\n * const panel = new DropdownPanelView( locale );\r\n * const dropdown = new DropdownView( locale, button, panel );\r\n *\r\n * button.set( {\r\n * \tlabel: 'A dropdown',\r\n * \twithText: true\r\n * } );\r\n *\r\n * dropdown.render();\r\n *\r\n * panel.element.textContent = 'Content of the panel';\r\n *\r\n * // Will render a dropdown with a panel containing a \"Content of the panel\" text.\r\n * document.body.appendChild( dropdown.element );\r\n * ```\r\n *\r\n * However, dropdown created this way will contain little behavior. You will need to implement handlers for actions\r\n * such as {@link module:ui/bindings/clickoutsidehandler~clickOutsideHandler clicking outside an open dropdown}\r\n * (which should close it) and support for arrow keys inside the panel. Therefore, unless you really know what\r\n * you do and you really need to do it, it is recommended to use the {@link module:ui/dropdown/utils~createDropdown} helper.\r\n */\r\nexport default class DropdownView extends View {\r\n    /**\r\n     * Creates an instance of the dropdown.\r\n     *\r\n     * Also see {@link #render}.\r\n     *\r\n     * @param locale The localization services instance.\r\n     */\r\n    constructor(locale, buttonView, panelView) {\r\n        super(locale);\r\n        const bind = this.bindTemplate;\r\n        this.buttonView = buttonView;\r\n        this.panelView = panelView;\r\n        this.set('isOpen', false);\r\n        this.set('isEnabled', true);\r\n        this.set('class', undefined);\r\n        this.set('id', undefined);\r\n        this.set('panelPosition', 'auto');\r\n        this.keystrokes = new KeystrokeHandler();\r\n        this.focusTracker = new FocusTracker();\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-dropdown',\r\n                    bind.to('class'),\r\n                    bind.if('isEnabled', 'ck-disabled', value => !value)\r\n                ],\r\n                id: bind.to('id'),\r\n                'aria-describedby': bind.to('ariaDescribedById')\r\n            },\r\n            children: [\r\n                buttonView,\r\n                panelView\r\n            ]\r\n        });\r\n        buttonView.extendTemplate({\r\n            attributes: {\r\n                class: [\r\n                    'ck-dropdown__button'\r\n                ],\r\n                'data-cke-tooltip-disabled': bind.to('isOpen')\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        this.focusTracker.add(this.buttonView.element);\r\n        this.focusTracker.add(this.panelView.element);\r\n        // Toggle the dropdown when its button has been clicked.\r\n        this.listenTo(this.buttonView, 'open', () => {\r\n            this.isOpen = !this.isOpen;\r\n        });\r\n        // Toggle the visibility of the panel when the dropdown becomes open.\r\n        this.panelView.bind('isVisible').to(this, 'isOpen');\r\n        // Let the dropdown control the position of the panel. The position must\r\n        // be updated every time the dropdown is open.\r\n        this.on('change:isOpen', (evt, name, isOpen) => {\r\n            if (!isOpen) {\r\n                return;\r\n            }\r\n            // If \"auto\", find the best position of the panel to fit into the viewport.\r\n            // Otherwise, simply assign the static position.\r\n            if (this.panelPosition === 'auto') {\r\n                this.panelView.position = DropdownView._getOptimalPosition({\r\n                    element: this.panelView.element,\r\n                    target: this.buttonView.element,\r\n                    fitInViewport: true,\r\n                    positions: this._panelPositions\r\n                }).name;\r\n            }\r\n            else {\r\n                this.panelView.position = this.panelPosition;\r\n            }\r\n        });\r\n        // Listen for keystrokes coming from within #element.\r\n        this.keystrokes.listenTo(this.element);\r\n        const closeDropdown = (data, cancel) => {\r\n            if (this.isOpen) {\r\n                this.isOpen = false;\r\n                cancel();\r\n            }\r\n        };\r\n        // Open the dropdown panel using the arrow down key, just like with return or space.\r\n        this.keystrokes.set('arrowdown', (data, cancel) => {\r\n            // Don't open if the dropdown is disabled or already open.\r\n            if (this.buttonView.isEnabled && !this.isOpen) {\r\n                this.isOpen = true;\r\n                cancel();\r\n            }\r\n        });\r\n        // Block the right arrow key (until nested dropdowns are implemented).\r\n        this.keystrokes.set('arrowright', (data, cancel) => {\r\n            if (this.isOpen) {\r\n                cancel();\r\n            }\r\n        });\r\n        // Close the dropdown using the arrow left/escape key.\r\n        this.keystrokes.set('arrowleft', closeDropdown);\r\n        this.keystrokes.set('esc', closeDropdown);\r\n    }\r\n    /**\r\n     * Focuses the {@link #buttonView}.\r\n     */\r\n    focus() {\r\n        this.buttonView.focus();\r\n    }\r\n    /**\r\n     * Returns {@link #panelView panel} positions to be used by the\r\n     * {@link module:utils/dom/position~getOptimalPosition `getOptimalPosition()`}\r\n     * utility considering the direction of the language the UI of the editor is displayed in.\r\n     */\r\n    get _panelPositions() {\r\n        const { south, north, southEast, southWest, northEast, northWest, southMiddleEast, southMiddleWest, northMiddleEast, northMiddleWest } = DropdownView.defaultPanelPositions;\r\n        if (this.locale.uiLanguageDirection !== 'rtl') {\r\n            return [\r\n                southEast, southWest, southMiddleEast, southMiddleWest, south,\r\n                northEast, northWest, northMiddleEast, northMiddleWest, north\r\n            ];\r\n        }\r\n        else {\r\n            return [\r\n                southWest, southEast, southMiddleWest, southMiddleEast, south,\r\n                northWest, northEast, northMiddleWest, northMiddleEast, north\r\n            ];\r\n        }\r\n    }\r\n}\r\n/**\r\n * A set of positioning functions used by the dropdown view to determine\r\n * the optimal position (i.e. fitting into the browser viewport) of its\r\n * {@link module:ui/dropdown/dropdownview~DropdownView#panelView panel} when\r\n * {@link module:ui/dropdown/dropdownview~DropdownView#panelPosition} is set to 'auto'`.\r\n *\r\n * The available positioning functions are as follow:\r\n *\r\n * **South**\r\n *\r\n * * `south`\r\n *\r\n * ```\r\n *\t\t\t[ Button ]\r\n *\t\t+-----------------+\r\n *\t\t|      Panel      |\r\n *\t\t+-----------------+\r\n * ```\r\n *\r\n * * `southEast`\r\n *\r\n * ```\r\n *\t\t[ Button ]\r\n *\t\t+-----------------+\r\n *\t\t|      Panel      |\r\n *\t\t+-----------------+\r\n * ```\r\n *\r\n * * `southWest`\r\n *\r\n * ```\r\n *\t\t         [ Button ]\r\n *\t\t+-----------------+\r\n *\t\t|      Panel      |\r\n *\t\t+-----------------+\r\n * ```\r\n *\r\n * * `southMiddleEast`\r\n *\r\n * ```\r\n *\t\t  [ Button ]\r\n *\t\t+-----------------+\r\n *\t\t|      Panel      |\r\n *\t\t+-----------------+\r\n * ```\r\n *\r\n * * `southMiddleWest`\r\n *\r\n * ```\r\n *\t\t       [ Button ]\r\n *\t\t+-----------------+\r\n *\t\t|      Panel      |\r\n *\t\t+-----------------+\r\n * ```\r\n *\r\n * **North**\r\n *\r\n * * `north`\r\n *\r\n * ```\r\n *\t\t+-----------------+\r\n *\t\t|      Panel      |\r\n *\t\t+-----------------+\r\n *\t\t    [ Button ]\r\n * ```\r\n *\r\n * * `northEast`\r\n *\r\n * ```\r\n *\t\t+-----------------+\r\n *\t\t|      Panel      |\r\n *\t\t+-----------------+\r\n *\t\t[ Button ]\r\n * ```\r\n *\r\n * * `northWest`\r\n *\r\n * ```\r\n *\t\t+-----------------+\r\n *\t\t|      Panel      |\r\n *\t\t+-----------------+\r\n *\t\t         [ Button ]\r\n * ```\r\n *\r\n * * `northMiddleEast`\r\n *\r\n * ```\r\n *\t\t+-----------------+\r\n *\t\t|      Panel      |\r\n *\t\t+-----------------+\r\n *\t\t  [ Button ]\r\n * ```\r\n *\r\n * * `northMiddleWest`\r\n *\r\n * ```\r\n *\t\t+-----------------+\r\n *\t\t|      Panel      |\r\n *\t\t+-----------------+\r\n *\t\t       [ Button ]\r\n * ```\r\n *\r\n * Positioning functions are compatible with {@link module:utils/dom/position~Position}.\r\n *\r\n * The name that position function returns will be reflected in dropdown panel's class that\r\n * controls its placement. See {@link module:ui/dropdown/dropdownview~DropdownView#panelPosition}\r\n * to learn more.\r\n */\r\nDropdownView.defaultPanelPositions = {\r\n    south: (buttonRect, panelRect) => {\r\n        return {\r\n            top: buttonRect.bottom,\r\n            left: buttonRect.left - (panelRect.width - buttonRect.width) / 2,\r\n            name: 's'\r\n        };\r\n    },\r\n    southEast: buttonRect => {\r\n        return {\r\n            top: buttonRect.bottom,\r\n            left: buttonRect.left,\r\n            name: 'se'\r\n        };\r\n    },\r\n    southWest: (buttonRect, panelRect) => {\r\n        return {\r\n            top: buttonRect.bottom,\r\n            left: buttonRect.left - panelRect.width + buttonRect.width,\r\n            name: 'sw'\r\n        };\r\n    },\r\n    southMiddleEast: (buttonRect, panelRect) => {\r\n        return {\r\n            top: buttonRect.bottom,\r\n            left: buttonRect.left - (panelRect.width - buttonRect.width) / 4,\r\n            name: 'sme'\r\n        };\r\n    },\r\n    southMiddleWest: (buttonRect, panelRect) => {\r\n        return {\r\n            top: buttonRect.bottom,\r\n            left: buttonRect.left - (panelRect.width - buttonRect.width) * 3 / 4,\r\n            name: 'smw'\r\n        };\r\n    },\r\n    north: (buttonRect, panelRect) => {\r\n        return {\r\n            top: buttonRect.top - panelRect.height,\r\n            left: buttonRect.left - (panelRect.width - buttonRect.width) / 2,\r\n            name: 'n'\r\n        };\r\n    },\r\n    northEast: (buttonRect, panelRect) => {\r\n        return {\r\n            top: buttonRect.top - panelRect.height,\r\n            left: buttonRect.left,\r\n            name: 'ne'\r\n        };\r\n    },\r\n    northWest: (buttonRect, panelRect) => {\r\n        return {\r\n            top: buttonRect.top - panelRect.height,\r\n            left: buttonRect.left - panelRect.width + buttonRect.width,\r\n            name: 'nw'\r\n        };\r\n    },\r\n    northMiddleEast: (buttonRect, panelRect) => {\r\n        return {\r\n            top: buttonRect.top - panelRect.height,\r\n            left: buttonRect.left - (panelRect.width - buttonRect.width) / 4,\r\n            name: 'nme'\r\n        };\r\n    },\r\n    northMiddleWest: (buttonRect, panelRect) => {\r\n        return {\r\n            top: buttonRect.top - panelRect.height,\r\n            left: buttonRect.left - (panelRect.width - buttonRect.width) * 3 / 4,\r\n            name: 'nmw'\r\n        };\r\n    }\r\n};\r\n/**\r\n * A function used to calculate the optimal position for the dropdown panel.\r\n */\r\nDropdownView._getOptimalPosition = getOptimalPosition;\r\n","export default \"<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>\";","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/dropdown/button/dropdownbuttonview\r\n */\r\nimport ButtonView from '../../button/buttonview';\r\nimport IconView from '../../icon/iconview';\r\nimport dropdownArrowIcon from '../../../theme/icons/dropdown-arrow.svg';\r\n/**\r\n * The default dropdown button view class.\r\n *\r\n * ```ts\r\n * const view = new DropdownButtonView();\r\n *\r\n * view.set( {\r\n * \tlabel: 'A button',\r\n * \tkeystroke: 'Ctrl+B',\r\n * \ttooltip: true\r\n * } );\r\n *\r\n * view.render();\r\n *\r\n * document.body.append( view.element );\r\n * ```\r\n *\r\n * Also see the {@link module:ui/dropdown/utils~createDropdown `createDropdown()` util}.\r\n */\r\nexport default class DropdownButtonView extends ButtonView {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        this.arrowView = this._createArrowView();\r\n        this.extendTemplate({\r\n            attributes: {\r\n                'aria-haspopup': true,\r\n                'aria-expanded': this.bindTemplate.to('isOn', value => String(value))\r\n            }\r\n        });\r\n        // The DropdownButton interface expects the open event upon which will open the dropdown.\r\n        this.delegate('execute').to(this, 'open');\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        this.children.add(this.arrowView);\r\n    }\r\n    /**\r\n     * Creates a {@link module:ui/icon/iconview~IconView} instance as {@link #arrowView}.\r\n     */\r\n    _createArrowView() {\r\n        const arrowView = new IconView();\r\n        arrowView.content = dropdownArrowIcon;\r\n        arrowView.extendTemplate({\r\n            attributes: {\r\n                class: 'ck-dropdown__arrow'\r\n            }\r\n        });\r\n        return arrowView;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/focuscycler\r\n */\r\nimport { isVisible } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * A utility class that helps cycling over focusable {@link module:ui/view~View views} in a\r\n * {@link module:ui/viewcollection~ViewCollection} when the focus is tracked by the\r\n * {@link module:utils/focustracker~FocusTracker} instance. It helps implementing keyboard\r\n * navigation in HTML forms, toolbars, lists and the like.\r\n *\r\n * To work properly it requires:\r\n * * a collection of focusable (HTML `tabindex` attribute) views that implement the `focus()` method,\r\n * * an associated focus tracker to determine which view is focused.\r\n *\r\n * A simple cycler setup can look like this:\r\n *\r\n * ```ts\r\n * const focusables = new ViewCollection();\r\n * const focusTracker = new FocusTracker();\r\n *\r\n * // Add focusable views to the focus tracker.\r\n * focusTracker.add( ... );\r\n * ```\r\n *\r\n * Then, the cycler can be used manually:\r\n *\r\n * ```ts\r\n * const cycler = new FocusCycler( { focusables, focusTracker } );\r\n *\r\n * // Will focus the first focusable view in #focusables.\r\n * cycler.focusFirst();\r\n *\r\n * // Will log the next focusable item in #focusables.\r\n * console.log( cycler.next );\r\n * ```\r\n *\r\n * Alternatively, it can work side by side with the {@link module:utils/keystrokehandler~KeystrokeHandler}:\r\n *\r\n * ```ts\r\n * const keystrokeHandler = new KeystrokeHandler();\r\n *\r\n * // Activate the keystroke handler.\r\n * keystrokeHandler.listenTo( sourceOfEvents );\r\n *\r\n * const cycler = new FocusCycler( {\r\n * \tfocusables, focusTracker, keystrokeHandler,\r\n * \tactions: {\r\n * \t\t// When arrowup of arrowleft is detected by the #keystrokeHandler,\r\n * \t\t// focusPrevious() will be called on the cycler.\r\n * \t\tfocusPrevious: [ 'arrowup', 'arrowleft' ],\r\n * \t}\r\n * } );\r\n * ```\r\n *\r\n * Check out the {@glink framework/deep-dive/ui/focus-tracking \"Deep dive into focus tracking\"} guide to learn more.\r\n */\r\nexport default class FocusCycler {\r\n    /**\r\n     * Creates an instance of the focus cycler utility.\r\n     *\r\n     * @param options Configuration options.\r\n     */\r\n    constructor(options) {\r\n        this.focusables = options.focusables;\r\n        this.focusTracker = options.focusTracker;\r\n        this.keystrokeHandler = options.keystrokeHandler;\r\n        this.actions = options.actions;\r\n        if (options.actions && options.keystrokeHandler) {\r\n            for (const methodName in options.actions) {\r\n                let actions = options.actions[methodName];\r\n                if (typeof actions == 'string') {\r\n                    actions = [actions];\r\n                }\r\n                for (const keystroke of actions) {\r\n                    options.keystrokeHandler.set(keystroke, (data, cancel) => {\r\n                        this[methodName]();\r\n                        cancel();\r\n                    });\r\n                }\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Returns the first focusable view in {@link #focusables}.\r\n     * Returns `null` if there is none.\r\n     *\r\n     * **Note**: Hidden views (e.g. with `display: none`) are ignored.\r\n     */\r\n    get first() {\r\n        return (this.focusables.find(isFocusable) || null);\r\n    }\r\n    /**\r\n     * Returns the last focusable view in {@link #focusables}.\r\n     * Returns `null` if there is none.\r\n     *\r\n     * **Note**: Hidden views (e.g. with `display: none`) are ignored.\r\n     */\r\n    get last() {\r\n        return (this.focusables.filter(isFocusable).slice(-1)[0] || null);\r\n    }\r\n    /**\r\n     * Returns the next focusable view in {@link #focusables} based on {@link #current}.\r\n     * Returns `null` if there is none.\r\n     *\r\n     * **Note**: Hidden views (e.g. with `display: none`) are ignored.\r\n     */\r\n    get next() {\r\n        return this._getFocusableItem(1);\r\n    }\r\n    /**\r\n     * Returns the previous focusable view in {@link #focusables} based on {@link #current}.\r\n     * Returns `null` if there is none.\r\n     *\r\n     * **Note**: Hidden views (e.g. with `display: none`) are ignored.\r\n     */\r\n    get previous() {\r\n        return this._getFocusableItem(-1);\r\n    }\r\n    /**\r\n     * An index of the view in the {@link #focusables} which is focused according\r\n     * to {@link #focusTracker}. Returns `null` when there is no such view.\r\n     */\r\n    get current() {\r\n        let index = null;\r\n        // There's no focused view in the focusables.\r\n        if (this.focusTracker.focusedElement === null) {\r\n            return null;\r\n        }\r\n        this.focusables.find((view, viewIndex) => {\r\n            const focused = view.element === this.focusTracker.focusedElement;\r\n            if (focused) {\r\n                index = viewIndex;\r\n            }\r\n            return focused;\r\n        });\r\n        return index;\r\n    }\r\n    /**\r\n     * Focuses the {@link #first} item in {@link #focusables}.\r\n     *\r\n     * **Note**: Hidden views (e.g. with `display: none`) are ignored.\r\n     */\r\n    focusFirst() {\r\n        this._focus(this.first);\r\n    }\r\n    /**\r\n     * Focuses the {@link #last} item in {@link #focusables}.\r\n     *\r\n     * **Note**: Hidden views (e.g. with `display: none`) are ignored.\r\n     */\r\n    focusLast() {\r\n        this._focus(this.last);\r\n    }\r\n    /**\r\n     * Focuses the {@link #next} item in {@link #focusables}.\r\n     *\r\n     * **Note**: Hidden views (e.g. with `display: none`) are ignored.\r\n     */\r\n    focusNext() {\r\n        this._focus(this.next);\r\n    }\r\n    /**\r\n     * Focuses the {@link #previous} item in {@link #focusables}.\r\n     *\r\n     * **Note**: Hidden views (e.g. with `display: none`) are ignored.\r\n     */\r\n    focusPrevious() {\r\n        this._focus(this.previous);\r\n    }\r\n    /**\r\n     * Focuses the given view if it exists.\r\n     */\r\n    _focus(view) {\r\n        if (view) {\r\n            view.focus();\r\n        }\r\n    }\r\n    /**\r\n     * Returns the next or previous focusable view in {@link #focusables} with respect\r\n     * to {@link #current}.\r\n     *\r\n     * @param step Either `1` for checking forward from {@link #current} or `-1` for checking backwards.\r\n     */\r\n    _getFocusableItem(step) {\r\n        // Cache for speed.\r\n        const current = this.current;\r\n        const collectionLength = this.focusables.length;\r\n        if (!collectionLength) {\r\n            return null;\r\n        }\r\n        // Start from the beginning if no view is focused.\r\n        // https://github.com/ckeditor/ckeditor5-ui/issues/206\r\n        if (current === null) {\r\n            return this[step === 1 ? 'first' : 'last'];\r\n        }\r\n        // Cycle in both directions.\r\n        let index = (current + collectionLength + step) % collectionLength;\r\n        do {\r\n            const view = this.focusables.get(index);\r\n            if (isFocusable(view)) {\r\n                return view;\r\n            }\r\n            // Cycle in both directions.\r\n            index = (index + collectionLength + step) % collectionLength;\r\n        } while (index !== current);\r\n        return null;\r\n    }\r\n}\r\n/**\r\n * Checks whether a view is focusable.\r\n *\r\n * @param view A view to be checked.\r\n */\r\nfunction isFocusable(view) {\r\n    return !!(view.focus && isVisible(view.element));\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/toolbar/toolbarseparatorview\r\n */\r\nimport View from '../view';\r\n/**\r\n * The toolbar separator view class.\r\n */\r\nexport default class ToolbarSeparatorView extends View {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        this.setTemplate({\r\n            tag: 'span',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-toolbar__separator'\r\n                ]\r\n            }\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/toolbar/toolbarlinebreakview\r\n */\r\nimport View from '../view';\r\n/**\r\n * The toolbar line break view class.\r\n */\r\nexport default class ToolbarLineBreakView extends View {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        this.setTemplate({\r\n            tag: 'span',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-toolbar__line-break'\r\n                ]\r\n            }\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/toolbar/normalizetoolbarconfig\r\n */\r\n/**\r\n * Normalizes the toolbar configuration (`config.toolbar`), which:\r\n *\r\n * * may be defined as an `Array`:\r\n *\r\n * ```\r\n * toolbar: [ 'heading', 'bold', 'italic', 'link', ... ]\r\n * ```\r\n *\r\n * * or an `Object`:\r\n *\r\n * ```\r\n * toolbar: {\r\n * \titems: [ 'heading', 'bold', 'italic', 'link', ... ],\r\n * \tremoveItems: [ 'bold' ],\r\n * \t...\r\n * }\r\n * ```\r\n *\r\n * * or may not be defined at all (`undefined`)\r\n *\r\n * and returns it in the object form.\r\n *\r\n * @param config The value of `config.toolbar`.\r\n * @returns A normalized toolbar config object.\r\n */\r\nexport default function normalizeToolbarConfig(config) {\r\n    if (Array.isArray(config)) {\r\n        return {\r\n            items: config,\r\n            removeItems: []\r\n        };\r\n    }\r\n    if (!config) {\r\n        return {\r\n            items: [],\r\n            removeItems: []\r\n        };\r\n    }\r\n    return Object.assign({\r\n        items: [],\r\n        removeItems: []\r\n    }, config);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module core/command\r\n */\r\nimport { ObservableMixin } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Base class for the CKEditor commands.\r\n *\r\n * Commands are the main way to manipulate the editor contents and state. They are mostly used by UI elements (or by other\r\n * commands) to make changes in the model. Commands are available in every part of the code that has access to\r\n * the {@link module:core/editor/editor~Editor editor} instance.\r\n *\r\n * Instances of registered commands can be retrieved from {@link module:core/editor/editor~Editor#commands `editor.commands`}.\r\n * The easiest way to execute a command is through {@link module:core/editor/editor~Editor#execute `editor.execute()`}.\r\n *\r\n * By default, commands are disabled when the editor is in the {@link module:core/editor/editor~Editor#isReadOnly read-only} mode\r\n * but commands with the {@link module:core/command~Command#affectsData `affectsData`} flag set to `false` will not be disabled.\r\n */\r\nexport default class Command extends ObservableMixin() {\r\n    /**\r\n     * Creates a new `Command` instance.\r\n     *\r\n     * @param editor The editor on which this command will be used.\r\n     */\r\n    constructor(editor) {\r\n        super();\r\n        this.editor = editor;\r\n        this.set('value', undefined);\r\n        this.set('isEnabled', false);\r\n        this._affectsData = true;\r\n        this._isEnabledBasedOnSelection = true;\r\n        this._disableStack = new Set();\r\n        this.decorate('execute');\r\n        // By default, every command is refreshed when changes are applied to the model.\r\n        this.listenTo(this.editor.model.document, 'change', () => {\r\n            this.refresh();\r\n        });\r\n        this.listenTo(editor, 'change:isReadOnly', () => {\r\n            this.refresh();\r\n        });\r\n        // By default, commands are disabled if the selection is in non-editable place or editor is in read-only mode.\r\n        this.on('set:isEnabled', evt => {\r\n            if (!this.affectsData) {\r\n                return;\r\n            }\r\n            // Checking `editor.isReadOnly` is needed for all commands that have `_isEnabledBasedOnSelection == false`.\r\n            // E.g. undo does not base on selection, but affects data and should be disabled when the editor is in read-only mode.\r\n            if (editor.isReadOnly || this._isEnabledBasedOnSelection && !editor.model.canEditAt(editor.model.document.selection)) {\r\n                evt.return = false;\r\n                evt.stop();\r\n            }\r\n        }, { priority: 'highest' });\r\n        this.on('execute', evt => {\r\n            if (!this.isEnabled) {\r\n                evt.stop();\r\n            }\r\n        }, { priority: 'high' });\r\n    }\r\n    /**\r\n     * A flag indicating whether a command execution changes the editor data or not.\r\n     *\r\n     * Commands with `affectsData` set to `false` will not be automatically disabled in\r\n     * the {@link module:core/editor/editor~Editor#isReadOnly read-only mode} and\r\n     * {@glink features/read-only#related-features other editor modes} with restricted user write permissions.\r\n     *\r\n     * **Note:** You do not have to set it for your every command. It is `true` by default.\r\n     *\r\n     * @default true\r\n     */\r\n    get affectsData() {\r\n        return this._affectsData;\r\n    }\r\n    set affectsData(affectsData) {\r\n        this._affectsData = affectsData;\r\n    }\r\n    /**\r\n     * Refreshes the command. The command should update its {@link #isEnabled} and {@link #value} properties\r\n     * in this method.\r\n     *\r\n     * This method is automatically called when\r\n     * {@link module:engine/model/document~Document#event:change any changes are applied to the document}.\r\n     */\r\n    refresh() {\r\n        this.isEnabled = true;\r\n    }\r\n    /**\r\n     * Disables the command.\r\n     *\r\n     * Command may be disabled by multiple features or algorithms (at once). When disabling a command, unique id should be passed\r\n     * (e.g. the feature name). The same identifier should be used when {@link #clearForceDisabled enabling back} the command.\r\n     * The command becomes enabled only after all features {@link #clearForceDisabled enabled it back}.\r\n     *\r\n     * Disabling and enabling a command:\r\n     *\r\n     * ```ts\r\n     * command.isEnabled; // -> true\r\n     * command.forceDisabled( 'MyFeature' );\r\n     * command.isEnabled; // -> false\r\n     * command.clearForceDisabled( 'MyFeature' );\r\n     * command.isEnabled; // -> true\r\n     * ```\r\n     *\r\n     * Command disabled by multiple features:\r\n     *\r\n     * ```ts\r\n     * command.forceDisabled( 'MyFeature' );\r\n     * command.forceDisabled( 'OtherFeature' );\r\n     * command.clearForceDisabled( 'MyFeature' );\r\n     * command.isEnabled; // -> false\r\n     * command.clearForceDisabled( 'OtherFeature' );\r\n     * command.isEnabled; // -> true\r\n     * ```\r\n     *\r\n     * Multiple disabling with the same identifier is redundant:\r\n     *\r\n     * ```ts\r\n     * command.forceDisabled( 'MyFeature' );\r\n     * command.forceDisabled( 'MyFeature' );\r\n     * command.clearForceDisabled( 'MyFeature' );\r\n     * command.isEnabled; // -> true\r\n     * ```\r\n     *\r\n     * **Note:** some commands or algorithms may have more complex logic when it comes to enabling or disabling certain commands,\r\n     * so the command might be still disabled after {@link #clearForceDisabled} was used.\r\n     *\r\n     * @param id Unique identifier for disabling. Use the same id when {@link #clearForceDisabled enabling back} the command.\r\n     */\r\n    forceDisabled(id) {\r\n        this._disableStack.add(id);\r\n        if (this._disableStack.size == 1) {\r\n            this.on('set:isEnabled', forceDisable, { priority: 'highest' });\r\n            this.isEnabled = false;\r\n        }\r\n    }\r\n    /**\r\n     * Clears forced disable previously set through {@link #forceDisabled}. See {@link #forceDisabled}.\r\n     *\r\n     * @param id Unique identifier, equal to the one passed in {@link #forceDisabled} call.\r\n     */\r\n    clearForceDisabled(id) {\r\n        this._disableStack.delete(id);\r\n        if (this._disableStack.size == 0) {\r\n            this.off('set:isEnabled', forceDisable);\r\n            this.refresh();\r\n        }\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * A command may accept parameters. They will be passed from {@link module:core/editor/editor~Editor#execute `editor.execute()`}\r\n     * to the command.\r\n     *\r\n     * The `execute()` method will automatically abort when the command is disabled ({@link #isEnabled} is `false`).\r\n     * This behavior is implemented by a high priority listener to the {@link #event:execute} event.\r\n     *\r\n     * In order to see how to disable a command from \"outside\" see the {@link #isEnabled} documentation.\r\n     *\r\n     * This method may return a value, which would be forwarded all the way down to the\r\n     * {@link module:core/editor/editor~Editor#execute `editor.execute()`}.\r\n     *\r\n     * @fires execute\r\n     */\r\n    execute(...args) { return undefined; }\r\n    /**\r\n     * Destroys the command.\r\n     */\r\n    destroy() {\r\n        this.stopListening();\r\n    }\r\n}\r\n/**\r\n * Helper function that forces command to be disabled.\r\n */\r\nfunction forceDisable(evt) {\r\n    evt.return = false;\r\n    evt.stop();\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module core/multicommand\r\n */\r\nimport Command from './command';\r\nimport { insertToPriorityArray } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * A CKEditor command that aggregates other commands.\r\n *\r\n * This command is used to proxy multiple commands. The multi-command is enabled when\r\n * at least one of its registered child commands is enabled.\r\n * When executing a multi-command, the first enabled command with highest priority will be executed.\r\n *\r\n * ```ts\r\n * const multiCommand = new MultiCommand( editor );\r\n *\r\n * const commandFoo = new Command( editor );\r\n * const commandBar = new Command( editor );\r\n *\r\n * // Register a child command.\r\n * multiCommand.registerChildCommand( commandFoo );\r\n * // Register a child command with a low priority.\r\n * multiCommand.registerChildCommand( commandBar, { priority: 'low' } );\r\n *\r\n * // Enable one of the commands.\r\n * commandBar.isEnabled = true;\r\n *\r\n * multiCommand.execute(); // Will execute commandBar.\r\n * ```\r\n */\r\nexport default class MultiCommand extends Command {\r\n    constructor() {\r\n        super(...arguments);\r\n        /**\r\n         * Registered child commands definitions.\r\n         */\r\n        this._childCommandsDefinitions = [];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        // Override base command refresh(): the command's state is changed when one of child commands changes states.\r\n    }\r\n    /**\r\n     * Executes the first enabled command which has the highest priority of all registered child commands.\r\n     *\r\n     * @returns The value returned by the {@link module:core/command~Command#execute `command.execute()`}.\r\n     */\r\n    execute(...args) {\r\n        const command = this._getFirstEnabledCommand();\r\n        return !!command && command.execute(args);\r\n    }\r\n    /**\r\n     * Registers a child command.\r\n     *\r\n     * @param options An object with configuration options.\r\n     * @param options.priority Priority of a command to register.\r\n     */\r\n    registerChildCommand(command, options = {}) {\r\n        insertToPriorityArray(this._childCommandsDefinitions, { command, priority: options.priority || 'normal' });\r\n        // Change multi-command enabled state when one of registered commands changes state.\r\n        command.on('change:isEnabled', () => this._checkEnabled());\r\n        this._checkEnabled();\r\n    }\r\n    /**\r\n     * Checks if any of child commands is enabled.\r\n     */\r\n    _checkEnabled() {\r\n        this.isEnabled = !!this._getFirstEnabledCommand();\r\n    }\r\n    /**\r\n     * Returns a first enabled command with the highest priority or `undefined` if none of them is enabled.\r\n     */\r\n    _getFirstEnabledCommand() {\r\n        const commandDefinition = this._childCommandsDefinitions.find(({ command }) => command.isEnabled);\r\n        return commandDefinition && commandDefinition.command;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module core/plugincollection\r\n */\r\nimport { CKEditorError, EmitterMixin } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Manages a list of CKEditor plugins, including loading, resolving dependencies and initialization.\r\n */\r\nexport default class PluginCollection extends EmitterMixin() {\r\n    /**\r\n     * Creates an instance of the plugin collection class.\r\n     * Allows loading and initializing plugins and their dependencies.\r\n     * Allows providing a list of already loaded plugins. These plugins will not be destroyed along with this collection.\r\n     *\r\n     * @param availablePlugins Plugins (constructors) which the collection will be able to use\r\n     * when {@link module:core/plugincollection~PluginCollection#init} is used with the plugin names (strings, instead of constructors).\r\n     * Usually, the editor will pass its built-in plugins to the collection so they can later be\r\n     * used in `config.plugins` or `config.removePlugins` by names.\r\n     * @param contextPlugins A list of already initialized plugins represented by a `[ PluginConstructor, pluginInstance ]` pair.\r\n     */\r\n    constructor(context, availablePlugins = [], contextPlugins = []) {\r\n        super();\r\n        this._plugins = new Map();\r\n        this._context = context;\r\n        this._availablePlugins = new Map();\r\n        for (const PluginConstructor of availablePlugins) {\r\n            if (PluginConstructor.pluginName) {\r\n                this._availablePlugins.set(PluginConstructor.pluginName, PluginConstructor);\r\n            }\r\n        }\r\n        this._contextPlugins = new Map();\r\n        for (const [PluginConstructor, pluginInstance] of contextPlugins) {\r\n            this._contextPlugins.set(PluginConstructor, pluginInstance);\r\n            this._contextPlugins.set(pluginInstance, PluginConstructor);\r\n            // To make it possible to require a plugin by its name.\r\n            if (PluginConstructor.pluginName) {\r\n                this._availablePlugins.set(PluginConstructor.pluginName, PluginConstructor);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Iterable interface.\r\n     *\r\n     * Returns `[ PluginConstructor, pluginInstance ]` pairs.\r\n     */\r\n    *[Symbol.iterator]() {\r\n        for (const entry of this._plugins) {\r\n            if (typeof entry[0] == 'function') {\r\n                yield entry;\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Gets the plugin instance by its constructor or name.\r\n     *\r\n     * ```ts\r\n     * // Check if 'Clipboard' plugin was loaded.\r\n     * if ( editor.plugins.has( 'ClipboardPipeline' ) ) {\r\n     * \t// Get clipboard plugin instance\r\n     * \tconst clipboard = editor.plugins.get( 'ClipboardPipeline' );\r\n     *\r\n     * \tthis.listenTo( clipboard, 'inputTransformation', ( evt, data ) => {\r\n     * \t\t// Do something on clipboard input.\r\n     * \t} );\r\n     * }\r\n     * ```\r\n     *\r\n     * **Note**: This method will throw an error if a plugin is not loaded. Use `{@link #has editor.plugins.has()}`\r\n     * to check if a plugin is available.\r\n     *\r\n     * @param key The plugin constructor or {@link module:core/plugin~PluginStaticMembers#pluginName name}.\r\n     */\r\n    get(key) {\r\n        const plugin = this._plugins.get(key);\r\n        if (!plugin) {\r\n            let pluginName = key;\r\n            if (typeof key == 'function') {\r\n                pluginName = key.pluginName || key.name;\r\n            }\r\n            /**\r\n             * The plugin is not loaded and could not be obtained.\r\n             *\r\n             * Plugin classes (constructors) need to be provided to the editor and must be loaded before they can be obtained from\r\n             * the plugin collection.\r\n             * This is usually done in CKEditor 5 builds by setting the {@link module:core/editor/editor~Editor.builtinPlugins}\r\n             * property.\r\n             *\r\n             * **Note**: You can use `{@link module:core/plugincollection~PluginCollection#has editor.plugins.has()}`\r\n             * to check if a plugin was loaded.\r\n             *\r\n             * @error plugincollection-plugin-not-loaded\r\n             * @param plugin The name of the plugin which is not loaded.\r\n             */\r\n            throw new CKEditorError('plugincollection-plugin-not-loaded', this._context, { plugin: pluginName });\r\n        }\r\n        return plugin;\r\n    }\r\n    /**\r\n     * Checks if a plugin is loaded.\r\n     *\r\n     * ```ts\r\n     * // Check if the 'Clipboard' plugin was loaded.\r\n     * if ( editor.plugins.has( 'ClipboardPipeline' ) ) {\r\n     * \t// Now use the clipboard plugin instance:\r\n     * \tconst clipboard = editor.plugins.get( 'ClipboardPipeline' );\r\n     *\r\n     * \t// ...\r\n     * }\r\n     * ```\r\n     *\r\n     * @param key The plugin constructor or {@link module:core/plugin~PluginStaticMembers#pluginName name}.\r\n     */\r\n    has(key) {\r\n        return this._plugins.has(key);\r\n    }\r\n    /**\r\n     * Initializes a set of plugins and adds them to the collection.\r\n     *\r\n     * @param plugins An array of {@link module:core/plugin~PluginInterface plugin constructors}\r\n     * or {@link module:core/plugin~PluginStaticMembers#pluginName plugin names}.\r\n     * @param pluginsToRemove Names of the plugins or plugin constructors\r\n     * that should not be loaded (despite being specified in the `plugins` array).\r\n     * @param pluginsSubstitutions An array of {@link module:core/plugin~PluginInterface plugin constructors}\r\n     * that will be used to replace plugins of the same names that were passed in `plugins` or that are in their dependency tree.\r\n     * A useful option for replacing built-in plugins while creating tests (for mocking their APIs). Plugins that will be replaced\r\n     * must follow these rules:\r\n     *   * The new plugin must be a class.\r\n     *   * The new plugin must be named.\r\n     *   * Both plugins must not depend on other plugins.\r\n     * @returns A promise which gets resolved once all plugins are loaded and available in the collection.\r\n     */\r\n    init(plugins, pluginsToRemove = [], pluginsSubstitutions = []) {\r\n        // Plugin initialization procedure consists of 2 main steps:\r\n        // 1) collecting all available plugin constructors,\r\n        // 2) verification whether all required plugins can be instantiated.\r\n        //\r\n        // In the first step, all plugin constructors, available in the provided `plugins` array and inside\r\n        // plugin's dependencies (from the `Plugin.requires` array), are recursively collected and added to the existing\r\n        // `this._availablePlugins` map, but without any verification at the given moment. Performing the verification\r\n        // at this point (during the plugin constructor searching) would cause false errors to occur, that some plugin\r\n        // is missing but in fact it may be defined further in the array as the dependency of other plugin. After\r\n        // traversing the entire dependency tree, it will be checked if all required \"top level\" plugins are available.\r\n        //\r\n        // In the second step, the list of plugins that have not been explicitly removed is traversed to get all the\r\n        // plugin constructors to be instantiated in the correct order and to validate against some rules. Finally, if\r\n        // no plugin is missing and no other error has been found, they all will be instantiated.\r\n        // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n        const that = this;\r\n        const context = this._context;\r\n        findAvailablePluginConstructors(plugins);\r\n        validatePlugins(plugins);\r\n        const pluginsToLoad = plugins.filter(plugin => !isPluginRemoved(plugin, pluginsToRemove));\r\n        const pluginConstructors = [...getPluginConstructors(pluginsToLoad)];\r\n        substitutePlugins(pluginConstructors, pluginsSubstitutions);\r\n        const pluginInstances = loadPlugins(pluginConstructors);\r\n        return initPlugins(pluginInstances, 'init')\r\n            .then(() => initPlugins(pluginInstances, 'afterInit'))\r\n            .then(() => pluginInstances);\r\n        function isPluginConstructor(plugin) {\r\n            return typeof plugin === 'function';\r\n        }\r\n        function isContextPlugin(plugin) {\r\n            return isPluginConstructor(plugin) && !!plugin.isContextPlugin;\r\n        }\r\n        function isPluginRemoved(plugin, pluginsToRemove) {\r\n            return pluginsToRemove.some(removedPlugin => {\r\n                if (removedPlugin === plugin) {\r\n                    return true;\r\n                }\r\n                if (getPluginName(plugin) === removedPlugin) {\r\n                    return true;\r\n                }\r\n                if (getPluginName(removedPlugin) === plugin) {\r\n                    return true;\r\n                }\r\n                return false;\r\n            });\r\n        }\r\n        function getPluginName(plugin) {\r\n            return isPluginConstructor(plugin) ?\r\n                plugin.pluginName || plugin.name :\r\n                plugin;\r\n        }\r\n        function findAvailablePluginConstructors(plugins, processed = new Set()) {\r\n            plugins.forEach(plugin => {\r\n                if (!isPluginConstructor(plugin)) {\r\n                    return;\r\n                }\r\n                if (processed.has(plugin)) {\r\n                    return;\r\n                }\r\n                processed.add(plugin);\r\n                if (plugin.pluginName && !that._availablePlugins.has(plugin.pluginName)) {\r\n                    that._availablePlugins.set(plugin.pluginName, plugin);\r\n                }\r\n                if (plugin.requires) {\r\n                    findAvailablePluginConstructors(plugin.requires, processed);\r\n                }\r\n            });\r\n        }\r\n        function getPluginConstructors(plugins, processed = new Set()) {\r\n            return plugins\r\n                .map(plugin => {\r\n                return isPluginConstructor(plugin) ?\r\n                    plugin :\r\n                    that._availablePlugins.get(plugin);\r\n            })\r\n                .reduce((result, plugin) => {\r\n                if (processed.has(plugin)) {\r\n                    return result;\r\n                }\r\n                processed.add(plugin);\r\n                if (plugin.requires) {\r\n                    validatePlugins(plugin.requires, plugin);\r\n                    getPluginConstructors(plugin.requires, processed).forEach(plugin => result.add(plugin));\r\n                }\r\n                return result.add(plugin);\r\n            }, new Set());\r\n        }\r\n        function validatePlugins(plugins, parentPluginConstructor = null) {\r\n            plugins\r\n                .map(plugin => {\r\n                return isPluginConstructor(plugin) ?\r\n                    plugin :\r\n                    that._availablePlugins.get(plugin) || plugin;\r\n            })\r\n                .forEach(plugin => {\r\n                checkMissingPlugin(plugin, parentPluginConstructor);\r\n                checkContextPlugin(plugin, parentPluginConstructor);\r\n                checkRemovedPlugin(plugin, parentPluginConstructor);\r\n            });\r\n        }\r\n        function checkMissingPlugin(plugin, parentPluginConstructor) {\r\n            if (isPluginConstructor(plugin)) {\r\n                return;\r\n            }\r\n            if (parentPluginConstructor) {\r\n                /**\r\n                 * A required \"soft\" dependency was not found on the plugin list.\r\n                 *\r\n                 * When configuring the editor, either prior to building (via\r\n                 * {@link module:core/editor/editor~Editor.builtinPlugins `Editor.builtinPlugins`}) or when\r\n                 * creating a new instance of the editor (e.g. via\r\n                 * {@link module:core/editor/editorconfig~EditorConfig#plugins `config.plugins`}), you need to provide\r\n                 * some of the dependencies for other plugins that you used.\r\n                 *\r\n                 * This error is thrown when one of these dependencies was not provided. The name of the missing plugin\r\n                 * can be found in `missingPlugin` and the plugin that required it in `requiredBy`.\r\n                 *\r\n                 * In order to resolve it, you need to import the missing plugin and add it to the\r\n                 * current list of plugins (`Editor.builtinPlugins` or `config.plugins`/`config.extraPlugins`).\r\n                 *\r\n                 * Soft requirements were introduced in version 26.0.0. If you happen to stumble upon this error\r\n                 * when upgrading to version 26.0.0, read also the\r\n                 * {@glink updating/guides/update-to-26 Migration to 26.0.0} guide.\r\n                 *\r\n                 * @error plugincollection-soft-required\r\n                 * @param missingPlugin The name of the required plugin.\r\n                 * @param requiredBy The name of the plugin that requires the other plugin.\r\n                 */\r\n                throw new CKEditorError('plugincollection-soft-required', context, { missingPlugin: plugin, requiredBy: getPluginName(parentPluginConstructor) });\r\n            }\r\n            /**\r\n             * A plugin is not available and could not be loaded.\r\n             *\r\n             * Plugin classes (constructors) need to be provided to the editor before they can be loaded by name.\r\n             * This is usually done in CKEditor 5 builds by setting the {@link module:core/editor/editor~Editor.builtinPlugins}\r\n             * property.\r\n             *\r\n             * **If you see this warning when using one of the {@glink installation/getting-started/predefined-builds\r\n             * CKEditor 5 Builds}**,\r\n             * it means that you try to enable a plugin which was not included in that build. This may be due to a typo\r\n             * in the plugin name or simply because that plugin is not a part of this build. In the latter scenario,\r\n             * read more about {@glink installation/getting-started/quick-start custom builds}.\r\n             *\r\n             * **If you see this warning when using one of the editor creators directly** (not a build), then it means\r\n             * that you tried loading plugins by name. However, unlike CKEditor 4, CKEditor 5 does not implement a \"plugin loader\".\r\n             * This means that CKEditor 5 does not know where to load the plugin modules from. Therefore, you need to\r\n             * provide each plugin through a reference (as a constructor function). Check out the examples in\r\n             * {@glink installation/advanced/alternative-setups/integrating-from-source-webpack \"Building from source\"}.\r\n             *\r\n             * @error plugincollection-plugin-not-found\r\n             * @param plugin The name of the plugin which could not be loaded.\r\n             */\r\n            throw new CKEditorError('plugincollection-plugin-not-found', context, { plugin });\r\n        }\r\n        function checkContextPlugin(plugin, parentPluginConstructor) {\r\n            if (!isContextPlugin(parentPluginConstructor)) {\r\n                return;\r\n            }\r\n            if (isContextPlugin(plugin)) {\r\n                return;\r\n            }\r\n            /**\r\n             * If a plugin is a context plugin, all plugins it requires should also be context plugins\r\n             * instead of plugins. In other words, if one plugin can be used in the context,\r\n             * all its requirements should also be ready to be used in the context. Note that the context\r\n             * provides only a part of the API provided by the editor. If one plugin needs a full\r\n             * editor API, all plugins which require it are considered as plugins that need a full\r\n             * editor API.\r\n             *\r\n             * @error plugincollection-context-required\r\n             * @param plugin The name of the required plugin.\r\n             * @param requiredBy The name of the parent plugin.\r\n             */\r\n            throw new CKEditorError('plugincollection-context-required', context, { plugin: getPluginName(plugin), requiredBy: getPluginName(parentPluginConstructor) });\r\n        }\r\n        function checkRemovedPlugin(plugin, parentPluginConstructor) {\r\n            if (!parentPluginConstructor) {\r\n                return;\r\n            }\r\n            if (!isPluginRemoved(plugin, pluginsToRemove)) {\r\n                return;\r\n            }\r\n            /**\r\n             * Cannot load a plugin because one of its dependencies is listed in the `removePlugins` option.\r\n             *\r\n             * @error plugincollection-required\r\n             * @param plugin The name of the required plugin.\r\n             * @param requiredBy The name of the parent plugin.\r\n             */\r\n            throw new CKEditorError('plugincollection-required', context, { plugin: getPluginName(plugin), requiredBy: getPluginName(parentPluginConstructor) });\r\n        }\r\n        function loadPlugins(pluginConstructors) {\r\n            return pluginConstructors.map(PluginConstructor => {\r\n                let pluginInstance = that._contextPlugins.get(PluginConstructor);\r\n                pluginInstance = pluginInstance || new PluginConstructor(context);\r\n                that._add(PluginConstructor, pluginInstance);\r\n                return pluginInstance;\r\n            });\r\n        }\r\n        function initPlugins(pluginInstances, method) {\r\n            return pluginInstances.reduce((promise, plugin) => {\r\n                if (!plugin[method]) {\r\n                    return promise;\r\n                }\r\n                if (that._contextPlugins.has(plugin)) {\r\n                    return promise;\r\n                }\r\n                return promise.then(plugin[method].bind(plugin));\r\n            }, Promise.resolve());\r\n        }\r\n        /**\r\n         * Replaces plugin constructors with the specified set of plugins.\r\n         */\r\n        function substitutePlugins(pluginConstructors, pluginsSubstitutions) {\r\n            for (const pluginItem of pluginsSubstitutions) {\r\n                if (typeof pluginItem != 'function') {\r\n                    /**\r\n                     * The plugin replacing an existing plugin must be a function.\r\n                     *\r\n                     * @error plugincollection-replace-plugin-invalid-type\r\n                     */\r\n                    throw new CKEditorError('plugincollection-replace-plugin-invalid-type', null, { pluginItem });\r\n                }\r\n                const pluginName = pluginItem.pluginName;\r\n                if (!pluginName) {\r\n                    /**\r\n                     * The plugin replacing an existing plugin must have a name.\r\n                     *\r\n                     * @error plugincollection-replace-plugin-missing-name\r\n                     */\r\n                    throw new CKEditorError('plugincollection-replace-plugin-missing-name', null, { pluginItem });\r\n                }\r\n                if (pluginItem.requires && pluginItem.requires.length) {\r\n                    /**\r\n                     * The plugin replacing an existing plugin cannot depend on other plugins.\r\n                     *\r\n                     * @error plugincollection-plugin-for-replacing-cannot-have-dependencies\r\n                     */\r\n                    throw new CKEditorError('plugincollection-plugin-for-replacing-cannot-have-dependencies', null, { pluginName });\r\n                }\r\n                const pluginToReplace = that._availablePlugins.get(pluginName);\r\n                if (!pluginToReplace) {\r\n                    /**\r\n                     * The replaced plugin does not exist in the\r\n                     * {@link module:core/plugincollection~PluginCollection available plugins} collection.\r\n                     *\r\n                     * @error plugincollection-plugin-for-replacing-not-exist\r\n                     */\r\n                    throw new CKEditorError('plugincollection-plugin-for-replacing-not-exist', null, { pluginName });\r\n                }\r\n                const indexInPluginConstructors = pluginConstructors.indexOf(pluginToReplace);\r\n                if (indexInPluginConstructors === -1) {\r\n                    // The Context feature can substitute plugins as well.\r\n                    // It may happen that the editor will be created with the given context, where the plugin for substitute\r\n                    // was already replaced. In such a case, we don't want to do it again.\r\n                    if (that._contextPlugins.has(pluginToReplace)) {\r\n                        return;\r\n                    }\r\n                    /**\r\n                     * The replaced plugin will not be loaded so it cannot be replaced.\r\n                     *\r\n                     * @error plugincollection-plugin-for-replacing-not-loaded\r\n                     */\r\n                    throw new CKEditorError('plugincollection-plugin-for-replacing-not-loaded', null, { pluginName });\r\n                }\r\n                if (pluginToReplace.requires && pluginToReplace.requires.length) {\r\n                    /**\r\n                     * The replaced plugin cannot depend on other plugins.\r\n                     *\r\n                     * @error plugincollection-replaced-plugin-cannot-have-dependencies\r\n                     */\r\n                    throw new CKEditorError('plugincollection-replaced-plugin-cannot-have-dependencies', null, { pluginName });\r\n                }\r\n                pluginConstructors.splice(indexInPluginConstructors, 1, pluginItem);\r\n                that._availablePlugins.set(pluginName, pluginItem);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Destroys all loaded plugins.\r\n     */\r\n    destroy() {\r\n        const promises = [];\r\n        for (const [, pluginInstance] of this) {\r\n            if (typeof pluginInstance.destroy == 'function' && !this._contextPlugins.has(pluginInstance)) {\r\n                promises.push(pluginInstance.destroy());\r\n            }\r\n        }\r\n        return Promise.all(promises);\r\n    }\r\n    /**\r\n     * Adds the plugin to the collection. Exposed mainly for testing purposes.\r\n     *\r\n     * @param PluginConstructor The plugin constructor.\r\n     * @param plugin The instance of the plugin.\r\n     */\r\n    _add(PluginConstructor, plugin) {\r\n        this._plugins.set(PluginConstructor, plugin);\r\n        const pluginName = PluginConstructor.pluginName;\r\n        if (!pluginName) {\r\n            return;\r\n        }\r\n        if (this._plugins.has(pluginName)) {\r\n            /**\r\n             * Two plugins with the same {@link module:core/plugin~PluginStaticMembers#pluginName} were loaded.\r\n             * This will lead to runtime conflicts between these plugins.\r\n             *\r\n             * In practice, this warning usually means that new plugins were added to an existing CKEditor 5 build.\r\n             * Plugins should always be added to a source version of the editor (`@ckeditor/ckeditor5-editor-*`),\r\n             * not to an editor imported from one of the `@ckeditor/ckeditor5-build-*` packages.\r\n             *\r\n             * Check your import paths and the list of plugins passed to\r\n             * {@link module:core/editor/editor~Editor.create `Editor.create()`}\r\n             * or specified in {@link module:core/editor/editor~Editor.builtinPlugins `Editor.builtinPlugins`}.\r\n             *\r\n             * The second option is that your `node_modules/` directory contains duplicated versions of the same\r\n             * CKEditor 5 packages. Normally, on clean installations, npm deduplicates packages in `node_modules/`, so\r\n             * it may be enough to call `rm -rf node_modules && npm i`. However, if you installed conflicting versions\r\n             * of some packages, their dependencies may need to be installed in more than one version which may lead to this\r\n             * warning.\r\n             *\r\n             * Technically speaking, this error occurs because after adding a plugin to an existing editor build\r\n             * the dependencies of this plugin are being duplicated.\r\n             * They are already built into that editor build and now get added for the second time as dependencies\r\n             * of the plugin you are installing.\r\n             *\r\n             * Read more about {@glink installation/plugins/installing-plugins Installing plugins}.\r\n             *\r\n             * @error plugincollection-plugin-name-conflict\r\n             * @param pluginName The duplicated plugin name.\r\n             * @param plugin1 The first plugin constructor.\r\n             * @param plugin2 The second plugin constructor.\r\n             */\r\n            throw new CKEditorError('plugincollection-plugin-name-conflict', null, { pluginName, plugin1: this._plugins.get(pluginName).constructor, plugin2: PluginConstructor });\r\n        }\r\n        this._plugins.set(pluginName, plugin);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module core/context\r\n */\r\nimport { Config, Collection, CKEditorError, Locale } from '@ckeditor/ckeditor5-utils';\r\nimport PluginCollection from './plugincollection';\r\n/**\r\n * Provides a common, higher-level environment for solutions that use multiple {@link module:core/editor/editor~Editor editors}\r\n * or plugins that work outside the editor. Use it instead of {@link module:core/editor/editor~Editor.create `Editor.create()`}\r\n * in advanced application integrations.\r\n *\r\n * All configuration options passed to a context will be used as default options for the editor instances initialized in that context.\r\n *\r\n * {@link module:core/contextplugin~ContextPlugin Context plugins} passed to a context instance will be shared among all\r\n * editor instances initialized in this context. These will be the same plugin instances for all the editors.\r\n *\r\n * **Note:** The context can only be initialized with {@link module:core/contextplugin~ContextPlugin context plugins}\r\n * (e.g. [comments](https://ckeditor.com/collaboration/comments/)). Regular {@link module:core/plugin~Plugin plugins} require an\r\n * editor instance to work and cannot be added to a context.\r\n *\r\n * **Note:** You can add a context plugin to an editor instance, though.\r\n *\r\n * If you are using multiple editor instances on one page and use any context plugins, create a context to share the configuration and\r\n * plugins among these editors. Some plugins will use the information about all existing editors to better integrate between them.\r\n *\r\n * If you are using plugins that do not require an editor to work (e.g. [comments](https://ckeditor.com/collaboration/comments/)),\r\n * enable and configure them using the context.\r\n *\r\n * If you are using only a single editor on each page, use {@link module:core/editor/editor~Editor.create `Editor.create()`} instead.\r\n * In such a case, a context instance will be created by the editor instance in a transparent way.\r\n *\r\n * See {@link ~Context.create `Context.create()`} for usage examples.\r\n */\r\nexport default class Context {\r\n    /**\r\n     * Creates a context instance with a given configuration.\r\n     *\r\n     * Usually not to be used directly. See the static {@link module:core/context~Context.create `create()`} method.\r\n     *\r\n     * @param config The context configuration.\r\n     */\r\n    constructor(config) {\r\n        /**\r\n         * Reference to the editor which created the context.\r\n         * Null when the context was created outside of the editor.\r\n         *\r\n         * It is used to destroy the context when removing the editor that has created the context.\r\n         */\r\n        this._contextOwner = null;\r\n        this.config = new Config(config, this.constructor.defaultConfig);\r\n        const availablePlugins = this.constructor.builtinPlugins;\r\n        this.config.define('plugins', availablePlugins);\r\n        this.plugins = new PluginCollection(this, availablePlugins);\r\n        const languageConfig = this.config.get('language') || {};\r\n        this.locale = new Locale({\r\n            uiLanguage: typeof languageConfig === 'string' ? languageConfig : languageConfig.ui,\r\n            contentLanguage: this.config.get('language.content')\r\n        });\r\n        this.t = this.locale.t;\r\n        this.editors = new Collection();\r\n    }\r\n    /**\r\n     * Loads and initializes plugins specified in the configuration.\r\n     *\r\n     * @returns A promise which resolves once the initialization is completed, providing an array of loaded plugins.\r\n     */\r\n    initPlugins() {\r\n        const plugins = this.config.get('plugins') || [];\r\n        const substitutePlugins = this.config.get('substitutePlugins') || [];\r\n        // Plugins for substitution should be checked as well.\r\n        for (const Plugin of plugins.concat(substitutePlugins)) {\r\n            if (typeof Plugin != 'function') {\r\n                /**\r\n                 * Only a constructor function is allowed as a {@link module:core/contextplugin~ContextPlugin context plugin}.\r\n                 *\r\n                 * @error context-initplugins-constructor-only\r\n                 */\r\n                throw new CKEditorError('context-initplugins-constructor-only', null, { Plugin });\r\n            }\r\n            if (Plugin.isContextPlugin !== true) {\r\n                /**\r\n                 * Only a plugin marked as a {@link module:core/contextplugin~ContextPlugin.isContextPlugin context plugin}\r\n                 * is allowed to be used with a context.\r\n                 *\r\n                 * @error context-initplugins-invalid-plugin\r\n                 */\r\n                throw new CKEditorError('context-initplugins-invalid-plugin', null, { Plugin });\r\n            }\r\n        }\r\n        return this.plugins.init(plugins, [], substitutePlugins);\r\n    }\r\n    /**\r\n     * Destroys the context instance and all editors used with the context,\r\n     * releasing all resources used by the context.\r\n     *\r\n     * @returns A promise that resolves once the context instance is fully destroyed.\r\n     */\r\n    destroy() {\r\n        return Promise.all(Array.from(this.editors, editor => editor.destroy()))\r\n            .then(() => this.plugins.destroy());\r\n    }\r\n    /**\r\n     * Adds a reference to the editor which is used with this context.\r\n     *\r\n     * When the given editor has created the context, the reference to this editor will be stored\r\n     * as a {@link ~Context#_contextOwner}.\r\n     *\r\n     * This method should only be used by the editor.\r\n     *\r\n     * @internal\r\n     * @param isContextOwner Stores the given editor as a context owner.\r\n     */\r\n    _addEditor(editor, isContextOwner) {\r\n        if (this._contextOwner) {\r\n            /**\r\n             * Cannot add multiple editors to the context which is created by the editor.\r\n             *\r\n             * @error context-addeditor-private-context\r\n             */\r\n            throw new CKEditorError('context-addeditor-private-context');\r\n        }\r\n        this.editors.add(editor);\r\n        if (isContextOwner) {\r\n            this._contextOwner = editor;\r\n        }\r\n    }\r\n    /**\r\n     * Removes a reference to the editor which was used with this context.\r\n     * When the context was created by the given editor, the context will be destroyed.\r\n     *\r\n     * This method should only be used by the editor.\r\n     *\r\n     * @internal\r\n     * @return A promise that resolves once the editor is removed from the context or when the context was destroyed.\r\n     */\r\n    _removeEditor(editor) {\r\n        if (this.editors.has(editor)) {\r\n            this.editors.remove(editor);\r\n        }\r\n        if (this._contextOwner === editor) {\r\n            return this.destroy();\r\n        }\r\n        return Promise.resolve();\r\n    }\r\n    /**\r\n     * Returns the context configuration which will be copied to the editors created using this context.\r\n     *\r\n     * The configuration returned by this method has the plugins configuration removed &mdash; plugins are shared with all editors\r\n     * through another mechanism.\r\n     *\r\n     * This method should only be used by the editor.\r\n     *\r\n     * @internal\r\n     * @returns Configuration as a plain object.\r\n     */\r\n    _getEditorConfig() {\r\n        const result = {};\r\n        for (const name of this.config.names()) {\r\n            if (!['plugins', 'removePlugins', 'extraPlugins'].includes(name)) {\r\n                result[name] = this.config.get(name);\r\n            }\r\n        }\r\n        return result;\r\n    }\r\n    /**\r\n     * Creates and initializes a new context instance.\r\n     *\r\n     * ```ts\r\n     * const commonConfig = { ... }; // Configuration for all the plugins and editors.\r\n     * const editorPlugins = [ ... ]; // Regular plugins here.\r\n     *\r\n     * Context\r\n     * \t.create( {\r\n     * \t\t// Only context plugins here.\r\n     * \t\tplugins: [ ... ],\r\n     *\r\n     * \t\t// Configure the language for all the editors (it cannot be overwritten).\r\n     * \t\tlanguage: { ... },\r\n     *\r\n     * \t\t// Configuration for context plugins.\r\n     * \t\tcomments: { ... },\r\n     * \t\t...\r\n     *\r\n     * \t\t// Default configuration for editor plugins.\r\n     * \t\ttoolbar: { ... },\r\n     * \t\timage: { ... },\r\n     * \t\t...\r\n     * \t} )\r\n     * \t.then( context => {\r\n     * \t\tconst promises = [];\r\n     *\r\n     * \t\tpromises.push( ClassicEditor.create(\r\n     * \t\t\tdocument.getElementById( 'editor1' ),\r\n     * \t\t\t{\r\n     * \t\t\t\teditorPlugins,\r\n     * \t\t\t\tcontext\r\n     * \t\t\t}\r\n     * \t\t) );\r\n     *\r\n     * \t\tpromises.push( ClassicEditor.create(\r\n     * \t\t\tdocument.getElementById( 'editor2' ),\r\n     * \t\t\t{\r\n     * \t\t\t\teditorPlugins,\r\n     * \t\t\t\tcontext,\r\n     * \t\t\t\ttoolbar: { ... } // You can overwrite the configuration of the context.\r\n     * \t\t\t}\r\n     * \t\t) );\r\n     *\r\n     * \t\treturn Promise.all( promises );\r\n     * \t} );\r\n     * ```\r\n     *\r\n     * @param config The context configuration.\r\n     * @returns A promise resolved once the context is ready. The promise resolves with the created context instance.\r\n     */\r\n    static create(config) {\r\n        return new Promise(resolve => {\r\n            const context = new this(config);\r\n            resolve(context.initPlugins().then(() => context));\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module core/contextplugin\r\n */\r\nimport { ObservableMixin } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * The base class for {@link module:core/context~Context} plugin classes.\r\n *\r\n * A context plugin can either be initialized for an {@link module:core/editor/editor~Editor editor} or for\r\n * a {@link module:core/context~Context context}. In other words, it can either\r\n * work within one editor instance or with one or more editor instances that use a single context.\r\n * It is the context plugin's role to implement handling for both modes.\r\n *\r\n * There are a few rules for interaction between the editor plugins and context plugins:\r\n *\r\n * * A context plugin can require another context plugin.\r\n * * An {@link module:core/plugin~Plugin editor plugin} can require a context plugin.\r\n * * A context plugin MUST NOT require an {@link module:core/plugin~Plugin editor plugin}.\r\n */\r\nexport default class ContextPlugin extends ObservableMixin() {\r\n    /**\r\n     * Creates a new plugin instance.\r\n     */\r\n    constructor(context) {\r\n        super();\r\n        this.context = context;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        this.stopListening();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get isContextPlugin() {\r\n        return true;\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./placeholder.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/placeholder\r\n */\r\nimport '../../theme/placeholder.css';\r\n// Each document stores information about its placeholder elements and check functions.\r\nconst documentPlaceholders = new WeakMap();\r\n/**\r\n * A helper that enables a placeholder on the provided view element (also updates its visibility).\r\n * The placeholder is a CSS pseudo–element (with a text content) attached to the element.\r\n *\r\n * To change the placeholder text, simply call this method again with new options.\r\n *\r\n * To disable the placeholder, use {@link module:engine/view/placeholder~disablePlaceholder `disablePlaceholder()`} helper.\r\n *\r\n * @param options Configuration options of the placeholder.\r\n * @param options.view Editing view instance.\r\n * @param options.element Element that will gain a placeholder. See `options.isDirectHost` to learn more.\r\n * @param options.text Placeholder text.\r\n * @param options.isDirectHost If set `false`, the placeholder will not be enabled directly\r\n * in the passed `element` but in one of its children (selected automatically, i.e. a first empty child element).\r\n * Useful when attaching placeholders to elements that can host other elements (not just text), for instance,\r\n * editable root elements.\r\n * @param options.keepOnFocus If set `true`, the placeholder stay visible when the host element is focused.\r\n */\r\nexport function enablePlaceholder({ view, element, text, isDirectHost = true, keepOnFocus = false }) {\r\n    const doc = view.document;\r\n    // Use a single a single post fixer per—document to update all placeholders.\r\n    if (!documentPlaceholders.has(doc)) {\r\n        documentPlaceholders.set(doc, new Map());\r\n        // If a post-fixer callback makes a change, it should return `true` so other post–fixers\r\n        // can re–evaluate the document again.\r\n        doc.registerPostFixer(writer => updateDocumentPlaceholders(doc, writer));\r\n        // Update placeholders on isComposing state change since rendering is disabled while in composition mode.\r\n        doc.on('change:isComposing', () => {\r\n            view.change(writer => updateDocumentPlaceholders(doc, writer));\r\n        }, { priority: 'high' });\r\n    }\r\n    // Store information about the element placeholder under its document.\r\n    documentPlaceholders.get(doc).set(element, {\r\n        text,\r\n        isDirectHost,\r\n        keepOnFocus,\r\n        hostElement: isDirectHost ? element : null\r\n    });\r\n    // Update the placeholders right away.\r\n    view.change(writer => updateDocumentPlaceholders(doc, writer));\r\n}\r\n/**\r\n * Disables the placeholder functionality from a given element.\r\n *\r\n * See {@link module:engine/view/placeholder~enablePlaceholder `enablePlaceholder()`} to learn more.\r\n */\r\nexport function disablePlaceholder(view, element) {\r\n    const doc = element.document;\r\n    if (!documentPlaceholders.has(doc)) {\r\n        return;\r\n    }\r\n    view.change(writer => {\r\n        const placeholders = documentPlaceholders.get(doc);\r\n        const config = placeholders.get(element);\r\n        writer.removeAttribute('data-placeholder', config.hostElement);\r\n        hidePlaceholder(writer, config.hostElement);\r\n        placeholders.delete(element);\r\n    });\r\n}\r\n/**\r\n * Shows a placeholder in the provided element by changing related attributes and CSS classes.\r\n *\r\n * **Note**: This helper will not update the placeholder visibility nor manage the\r\n * it in any way in the future. What it does is a one–time state change of an element. Use\r\n * {@link module:engine/view/placeholder~enablePlaceholder `enablePlaceholder()`} and\r\n * {@link module:engine/view/placeholder~disablePlaceholder `disablePlaceholder()`} for full\r\n * placeholder functionality.\r\n *\r\n * **Note**: This helper will blindly show the placeholder directly in the root editable element if\r\n * one is passed, which could result in a visual clash if the editable element has some children\r\n * (for instance, an empty paragraph). Use {@link module:engine/view/placeholder~enablePlaceholder `enablePlaceholder()`}\r\n * in that case or make sure the correct element is passed to the helper.\r\n *\r\n * @returns `true`, if any changes were made to the `element`.\r\n */\r\nexport function showPlaceholder(writer, element) {\r\n    if (!element.hasClass('ck-placeholder')) {\r\n        writer.addClass('ck-placeholder', element);\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\n/**\r\n * Hides a placeholder in the element by changing related attributes and CSS classes.\r\n *\r\n * **Note**: This helper will not update the placeholder visibility nor manage the\r\n * it in any way in the future. What it does is a one–time state change of an element. Use\r\n * {@link module:engine/view/placeholder~enablePlaceholder `enablePlaceholder()`} and\r\n * {@link module:engine/view/placeholder~disablePlaceholder `disablePlaceholder()`} for full\r\n * placeholder functionality.\r\n *\r\n * @returns `true`, if any changes were made to the `element`.\r\n */\r\nexport function hidePlaceholder(writer, element) {\r\n    if (element.hasClass('ck-placeholder')) {\r\n        writer.removeClass('ck-placeholder', element);\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\n/**\r\n * Checks if a placeholder should be displayed in the element.\r\n *\r\n * **Note**: This helper will blindly check the possibility of showing a placeholder directly in the\r\n * root editable element if one is passed, which may not be the expected result. If an element can\r\n * host other elements (not just text), most likely one of its children should be checked instead\r\n * because it will be the final host for the placeholder. Use\r\n * {@link module:engine/view/placeholder~enablePlaceholder `enablePlaceholder()`} in that case or make\r\n * sure the correct element is passed to the helper.\r\n *\r\n * @param element Element that holds the placeholder.\r\n * @param keepOnFocus Focusing the element will keep the placeholder visible.\r\n */\r\nexport function needsPlaceholder(element, keepOnFocus) {\r\n    if (!element.isAttached()) {\r\n        return false;\r\n    }\r\n    // Anything but uiElement(s) counts as content.\r\n    const hasContent = Array.from(element.getChildren())\r\n        .some(element => !element.is('uiElement'));\r\n    if (hasContent) {\r\n        return false;\r\n    }\r\n    const doc = element.document;\r\n    const viewSelection = doc.selection;\r\n    const selectionAnchor = viewSelection.anchor;\r\n    if (doc.isComposing && selectionAnchor && selectionAnchor.parent === element) {\r\n        return false;\r\n    }\r\n    // Skip the focus check and make the placeholder visible already regardless of document focus state.\r\n    if (keepOnFocus) {\r\n        return true;\r\n    }\r\n    // If the document is blurred.\r\n    if (!doc.isFocused) {\r\n        return true;\r\n    }\r\n    // If document is focused and the element is empty but the selection is not anchored inside it.\r\n    return !!selectionAnchor && selectionAnchor.parent !== element;\r\n}\r\n/**\r\n * Updates all placeholders associated with a document in a post–fixer callback.\r\n *\r\n * @returns True if any changes were made to the view document.\r\n */\r\nfunction updateDocumentPlaceholders(doc, writer) {\r\n    const placeholders = documentPlaceholders.get(doc);\r\n    const directHostElements = [];\r\n    let wasViewModified = false;\r\n    // First set placeholders on the direct hosts.\r\n    for (const [element, config] of placeholders) {\r\n        if (config.isDirectHost) {\r\n            directHostElements.push(element);\r\n            if (updatePlaceholder(writer, element, config)) {\r\n                wasViewModified = true;\r\n            }\r\n        }\r\n    }\r\n    // Then set placeholders on the indirect hosts but only on those that does not already have an direct host placeholder.\r\n    for (const [element, config] of placeholders) {\r\n        if (config.isDirectHost) {\r\n            continue;\r\n        }\r\n        const hostElement = getChildPlaceholderHostSubstitute(element);\r\n        // When not a direct host, it could happen that there is no child element\r\n        // capable of displaying a placeholder.\r\n        if (!hostElement) {\r\n            continue;\r\n        }\r\n        // Don't override placeholder if the host element already has some direct placeholder.\r\n        if (directHostElements.includes(hostElement)) {\r\n            continue;\r\n        }\r\n        // Update the host element (used for setting and removing the placeholder).\r\n        config.hostElement = hostElement;\r\n        if (updatePlaceholder(writer, element, config)) {\r\n            wasViewModified = true;\r\n        }\r\n    }\r\n    return wasViewModified;\r\n}\r\n/**\r\n * Updates a single placeholder in a post–fixer callback.\r\n *\r\n * @returns True if any changes were made to the view document.\r\n */\r\nfunction updatePlaceholder(writer, element, config) {\r\n    const { text, isDirectHost, hostElement } = config;\r\n    let wasViewModified = false;\r\n    // This may be necessary when updating the placeholder text to something else.\r\n    if (hostElement.getAttribute('data-placeholder') !== text) {\r\n        writer.setAttribute('data-placeholder', text, hostElement);\r\n        wasViewModified = true;\r\n    }\r\n    // If the host element is not a direct host then placeholder is needed only when there is only one element.\r\n    const isOnlyChild = isDirectHost || element.childCount == 1;\r\n    if (isOnlyChild && needsPlaceholder(hostElement, config.keepOnFocus)) {\r\n        if (showPlaceholder(writer, hostElement)) {\r\n            wasViewModified = true;\r\n        }\r\n    }\r\n    else if (hidePlaceholder(writer, hostElement)) {\r\n        wasViewModified = true;\r\n    }\r\n    return wasViewModified;\r\n}\r\n/**\r\n * Gets a child element capable of displaying a placeholder if a parent element can host more\r\n * than just text (for instance, when it is a root editable element). The child element\r\n * can then be used in other placeholder helpers as a substitute of its parent.\r\n */\r\nfunction getChildPlaceholderHostSubstitute(parent) {\r\n    if (parent.childCount) {\r\n        const firstChild = parent.getChild(0);\r\n        if (firstChild.is('element') && !firstChild.is('uiElement') && !firstChild.is('attributeElement')) {\r\n            return firstChild;\r\n        }\r\n    }\r\n    return null;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/typecheckable\r\n */\r\nexport default class TypeCheckable {\r\n    /* istanbul ignore next -- @preserve */\r\n    is() {\r\n        // There are a lot of overloads above.\r\n        // Overriding method in derived classes remove them and only `is( type: string ): boolean` is visible which we don't want.\r\n        // One option would be to copy them all to all classes, but that's ugly.\r\n        // It's best when TypeScript compiler doesn't see those overloads, except the one in the top base class.\r\n        // To overload a method, but not let the compiler see it, do after class definition:\r\n        // `MyClass.prototype.is = function( type: string ) {...}`\r\n        throw new Error('is() method is abstract');\r\n    }\r\n}\r\n","import baseClone from './_baseClone.js';\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeep\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */\nfunction clone(value) {\n  return baseClone(value, CLONE_SYMBOLS_FLAG);\n}\n\nexport default clone;\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/node\r\n */\r\nimport TypeCheckable from './typecheckable';\r\nimport { CKEditorError, EmitterMixin, compareArrays } from '@ckeditor/ckeditor5-utils';\r\nimport { clone } from 'lodash-es';\r\n// To check if component is loaded more than once.\r\nimport '@ckeditor/ckeditor5-utils/src/version';\r\n/**\r\n * Abstract view node class.\r\n *\r\n * This is an abstract class. Its constructor should not be used directly.\r\n * Use the {@link module:engine/view/downcastwriter~DowncastWriter} or {@link module:engine/view/upcastwriter~UpcastWriter}\r\n * to create new instances of view nodes.\r\n */\r\nexport default class Node extends EmitterMixin(TypeCheckable) {\r\n    /**\r\n     * Creates a tree view node.\r\n     *\r\n     * @param document The document instance to which this node belongs.\r\n     */\r\n    constructor(document) {\r\n        super();\r\n        this.document = document;\r\n        this.parent = null;\r\n    }\r\n    /**\r\n     * Index of the node in the parent element or null if the node has no parent.\r\n     *\r\n     * Accessing this property throws an error if this node's parent element does not contain it.\r\n     * This means that view tree got broken.\r\n     */\r\n    get index() {\r\n        let pos;\r\n        if (!this.parent) {\r\n            return null;\r\n        }\r\n        // No parent or child doesn't exist in parent's children.\r\n        if ((pos = this.parent.getChildIndex(this)) == -1) {\r\n            /**\r\n             * The node's parent does not contain this node. It means that the document tree is corrupted.\r\n             *\r\n             * @error view-node-not-found-in-parent\r\n             */\r\n            throw new CKEditorError('view-node-not-found-in-parent', this);\r\n        }\r\n        return pos;\r\n    }\r\n    /**\r\n     * Node's next sibling, or `null` if it is the last child.\r\n     */\r\n    get nextSibling() {\r\n        const index = this.index;\r\n        return (index !== null && this.parent.getChild(index + 1)) || null;\r\n    }\r\n    /**\r\n     * Node's previous sibling, or `null` if it is the first child.\r\n     */\r\n    get previousSibling() {\r\n        const index = this.index;\r\n        return (index !== null && this.parent.getChild(index - 1)) || null;\r\n    }\r\n    /**\r\n     * Top-most ancestor of the node. If the node has no parent it is the root itself.\r\n     */\r\n    get root() {\r\n        // eslint-disable-next-line @typescript-eslint/no-this-alias, consistent-this\r\n        let root = this;\r\n        while (root.parent) {\r\n            root = root.parent;\r\n        }\r\n        return root;\r\n    }\r\n    /**\r\n     * Returns true if the node is in a tree rooted in the document (is a descendant of one of its roots).\r\n     */\r\n    isAttached() {\r\n        return this.root.is('rootElement');\r\n    }\r\n    /**\r\n     * Gets a path to the node. The path is an array containing indices of consecutive ancestors of this node,\r\n     * beginning from {@link module:engine/view/node~Node#root root}, down to this node's index.\r\n     *\r\n     * ```ts\r\n     * const abc = downcastWriter.createText( 'abc' );\r\n     * const foo = downcastWriter.createText( 'foo' );\r\n     * const h1 = downcastWriter.createElement( 'h1', null, downcastWriter.createText( 'header' ) );\r\n     * const p = downcastWriter.createElement( 'p', null, [ abc, foo ] );\r\n     * const div = downcastWriter.createElement( 'div', null, [ h1, p ] );\r\n     * foo.getPath(); // Returns [ 1, 3 ]. `foo` is in `p` which is in `div`. `p` starts at offset 1, while `foo` at 3.\r\n     * h1.getPath(); // Returns [ 0 ].\r\n     * div.getPath(); // Returns [].\r\n     * ```\r\n     *\r\n     * @returns The path.\r\n     */\r\n    getPath() {\r\n        const path = [];\r\n        // eslint-disable-next-line @typescript-eslint/no-this-alias, consistent-this\r\n        let node = this;\r\n        while (node.parent) {\r\n            path.unshift(node.index);\r\n            node = node.parent;\r\n        }\r\n        return path;\r\n    }\r\n    /**\r\n     * Returns ancestors array of this node.\r\n     *\r\n     * @param options Options object.\r\n     * @param options.includeSelf When set to `true` this node will be also included in parent's array.\r\n     * @param options.parentFirst When set to `true`, array will be sorted from node's parent to root element,\r\n     * otherwise root element will be the first item in the array.\r\n     * @returns Array with ancestors.\r\n     */\r\n    getAncestors(options = {}) {\r\n        const ancestors = [];\r\n        let parent = options.includeSelf ? this : this.parent;\r\n        while (parent) {\r\n            ancestors[options.parentFirst ? 'push' : 'unshift'](parent);\r\n            parent = parent.parent;\r\n        }\r\n        return ancestors;\r\n    }\r\n    /**\r\n     * Returns a {@link module:engine/view/element~Element} or {@link module:engine/view/documentfragment~DocumentFragment}\r\n     * which is a common ancestor of both nodes.\r\n     *\r\n     * @param node The second node.\r\n     * @param options Options object.\r\n     * @param options.includeSelf When set to `true` both nodes will be considered \"ancestors\" too.\r\n     * Which means that if e.g. node A is inside B, then their common ancestor will be B.\r\n     */\r\n    getCommonAncestor(node, options = {}) {\r\n        const ancestorsA = this.getAncestors(options);\r\n        const ancestorsB = node.getAncestors(options);\r\n        let i = 0;\r\n        while (ancestorsA[i] == ancestorsB[i] && ancestorsA[i]) {\r\n            i++;\r\n        }\r\n        return i === 0 ? null : ancestorsA[i - 1];\r\n    }\r\n    /**\r\n     * Returns whether this node is before given node. `false` is returned if nodes are in different trees (for example,\r\n     * in different {@link module:engine/view/documentfragment~DocumentFragment}s).\r\n     *\r\n     * @param node Node to compare with.\r\n     */\r\n    isBefore(node) {\r\n        // Given node is not before this node if they are same.\r\n        if (this == node) {\r\n            return false;\r\n        }\r\n        // Return `false` if it is impossible to compare nodes.\r\n        if (this.root !== node.root) {\r\n            return false;\r\n        }\r\n        const thisPath = this.getPath();\r\n        const nodePath = node.getPath();\r\n        const result = compareArrays(thisPath, nodePath);\r\n        switch (result) {\r\n            case 'prefix':\r\n                return true;\r\n            case 'extension':\r\n                return false;\r\n            default:\r\n                return thisPath[result] < nodePath[result];\r\n        }\r\n    }\r\n    /**\r\n     * Returns whether this node is after given node. `false` is returned if nodes are in different trees (for example,\r\n     * in different {@link module:engine/view/documentfragment~DocumentFragment}s).\r\n     *\r\n     * @param node Node to compare with.\r\n     */\r\n    isAfter(node) {\r\n        // Given node is not before this node if they are same.\r\n        if (this == node) {\r\n            return false;\r\n        }\r\n        // Return `false` if it is impossible to compare nodes.\r\n        if (this.root !== node.root) {\r\n            return false;\r\n        }\r\n        // In other cases, just check if the `node` is before, and return the opposite.\r\n        return !this.isBefore(node);\r\n    }\r\n    /**\r\n     * Removes node from parent.\r\n     *\r\n     * @internal\r\n     */\r\n    _remove() {\r\n        this.parent._removeChildren(this.index);\r\n    }\r\n    /**\r\n     * @internal\r\n     * @param type Type of the change.\r\n     * @param node Changed node.\r\n     * @fires change\r\n     */\r\n    _fireChange(type, node) {\r\n        this.fire(`change:${type}`, node);\r\n        if (this.parent) {\r\n            this.parent._fireChange(type, node);\r\n        }\r\n    }\r\n    /**\r\n     * Custom toJSON method to solve child-parent circular dependencies.\r\n     *\r\n     * @returns Clone of this object with the parent property removed.\r\n     */\r\n    toJSON() {\r\n        const json = clone(this);\r\n        // Due to circular references we need to remove parent reference.\r\n        delete json.parent;\r\n        return json;\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nNode.prototype.is = function (type) {\r\n    return type === 'node' || type === 'view:node';\r\n};\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/text\r\n */\r\nimport Node from './node';\r\n/**\r\n * Tree view text node.\r\n *\r\n * The constructor of this class should not be used directly. To create a new text node instance\r\n * use the {@link module:engine/view/downcastwriter~DowncastWriter#createText `DowncastWriter#createText()`}\r\n * method when working on data downcasted from the model or the\r\n * {@link module:engine/view/upcastwriter~UpcastWriter#createText `UpcastWriter#createText()`}\r\n * method when working on non-semantic views.\r\n */\r\nexport default class Text extends Node {\r\n    /**\r\n     * Creates a tree view text node.\r\n     *\r\n     * @see module:engine/view/downcastwriter~DowncastWriter#createText\r\n     * @internal\r\n     * @param document The document instance to which this text node belongs.\r\n     * @param data The text's data.\r\n     */\r\n    constructor(document, data) {\r\n        super(document);\r\n        this._textData = data;\r\n    }\r\n    /**\r\n     * The text content.\r\n     */\r\n    get data() {\r\n        return this._textData;\r\n    }\r\n    /**\r\n     * The `_data` property is controlled by a getter and a setter.\r\n     *\r\n     * The getter is required when using the addition assignment operator on protected property:\r\n     *\r\n     * ```ts\r\n     * const foo = downcastWriter.createText( 'foo' );\r\n     * const bar = downcastWriter.createText( 'bar' );\r\n     *\r\n     * foo._data += bar.data;   // executes: `foo._data = foo._data + bar.data`\r\n     * console.log( foo.data ); // prints: 'foobar'\r\n     * ```\r\n     *\r\n     * If the protected getter didn't exist, `foo._data` will return `undefined` and result of the merge will be invalid.\r\n     *\r\n     * The setter sets data and fires the {@link module:engine/view/node~Node#event:change:text change event}.\r\n     *\r\n     * @internal\r\n     */\r\n    get _data() {\r\n        return this.data;\r\n    }\r\n    set _data(data) {\r\n        this._fireChange('text', this);\r\n        this._textData = data;\r\n    }\r\n    /**\r\n     * Checks if this text node is similar to other text node.\r\n     * Both nodes should have the same data to be considered as similar.\r\n     *\r\n     * @param otherNode Node to check if it is same as this node.\r\n     */\r\n    isSimilar(otherNode) {\r\n        if (!(otherNode instanceof Text)) {\r\n            return false;\r\n        }\r\n        return this === otherNode || this.data === otherNode.data;\r\n    }\r\n    /**\r\n     * Clones this node.\r\n     *\r\n     * @internal\r\n     * @returns Text node that is a clone of this node.\r\n     */\r\n    _clone() {\r\n        return new Text(this.document, this.data);\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nText.prototype.is = function (type) {\r\n    return type === '$text' || type === 'view:$text' ||\r\n        // This are legacy values kept for backward compatibility.\r\n        type === 'text' || type === 'view:text' ||\r\n        // From super.is(). This is highly utilised method and cannot call super. See ckeditor/ckeditor5#6529.\r\n        type === 'node' || type === 'view:node';\r\n};\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/textproxy\r\n */\r\nimport TypeCheckable from './typecheckable';\r\nimport { CKEditorError } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * TextProxy is a wrapper for substring of {@link module:engine/view/text~Text}. Instance of this class is created by\r\n * {@link module:engine/view/treewalker~TreeWalker} when only a part of {@link module:engine/view/text~Text} needs to be returned.\r\n *\r\n * `TextProxy` has an API similar to {@link module:engine/view/text~Text Text} and allows to do most of the common tasks performed\r\n * on view nodes.\r\n *\r\n * **Note:** Some `TextProxy` instances may represent whole text node, not just a part of it.\r\n * See {@link module:engine/view/textproxy~TextProxy#isPartial}.\r\n *\r\n * **Note:** `TextProxy` is a readonly interface.\r\n *\r\n * **Note:** `TextProxy` instances are created on the fly basing on the current state of parent {@link module:engine/view/text~Text}.\r\n * Because of this it is highly unrecommended to store references to `TextProxy instances because they might get\r\n * invalidated due to operations on Document. Also TextProxy is not a {@link module:engine/view/node~Node} so it can not be\r\n * inserted as a child of {@link module:engine/view/element~Element}.\r\n *\r\n * `TextProxy` instances are created by {@link module:engine/view/treewalker~TreeWalker view tree walker}. You should not need to create\r\n * an instance of this class by your own.\r\n */\r\nexport default class TextProxy extends TypeCheckable {\r\n    /**\r\n     * Creates a text proxy.\r\n     *\r\n     * @internal\r\n     * @param textNode Text node which part is represented by this text proxy.\r\n     * @param offsetInText Offset in {@link module:engine/view/textproxy~TextProxy#textNode text node}\r\n     * from which the text proxy starts.\r\n     * @param length Text proxy length, that is how many text node's characters, starting from `offsetInText` it represents.\r\n     * @constructor\r\n     */\r\n    constructor(textNode, offsetInText, length) {\r\n        super();\r\n        this.textNode = textNode;\r\n        if (offsetInText < 0 || offsetInText > textNode.data.length) {\r\n            /**\r\n             * Given offsetInText value is incorrect.\r\n             *\r\n             * @error view-textproxy-wrong-offsetintext\r\n             */\r\n            throw new CKEditorError('view-textproxy-wrong-offsetintext', this);\r\n        }\r\n        if (length < 0 || offsetInText + length > textNode.data.length) {\r\n            /**\r\n             * Given length value is incorrect.\r\n             *\r\n             * @error view-textproxy-wrong-length\r\n             */\r\n            throw new CKEditorError('view-textproxy-wrong-length', this);\r\n        }\r\n        this.data = textNode.data.substring(offsetInText, offsetInText + length);\r\n        this.offsetInText = offsetInText;\r\n    }\r\n    /**\r\n     * Offset size of this node.\r\n     */\r\n    get offsetSize() {\r\n        return this.data.length;\r\n    }\r\n    /**\r\n     * Flag indicating whether `TextProxy` instance covers only part of the original {@link module:engine/view/text~Text text node}\r\n     * (`true`) or the whole text node (`false`).\r\n     *\r\n     * This is `false` when text proxy starts at the very beginning of {@link module:engine/view/textproxy~TextProxy#textNode textNode}\r\n     * ({@link module:engine/view/textproxy~TextProxy#offsetInText offsetInText} equals `0`) and text proxy sizes is equal to\r\n     * text node size.\r\n     */\r\n    get isPartial() {\r\n        return this.data.length !== this.textNode.data.length;\r\n    }\r\n    /**\r\n     * Parent of this text proxy, which is same as parent of text node represented by this text proxy.\r\n     */\r\n    get parent() {\r\n        return this.textNode.parent;\r\n    }\r\n    /**\r\n     * Root of this text proxy, which is same as root of text node represented by this text proxy.\r\n     */\r\n    get root() {\r\n        return this.textNode.root;\r\n    }\r\n    /**\r\n     * {@link module:engine/view/document~Document View document} that owns this text proxy, or `null` if the text proxy is inside\r\n     * {@link module:engine/view/documentfragment~DocumentFragment document fragment}.\r\n     */\r\n    get document() {\r\n        return this.textNode.document;\r\n    }\r\n    /**\r\n     * Returns ancestors array of this text proxy.\r\n     *\r\n     * @param options Options object.\r\n     * @param options.includeSelf When set to `true`, textNode will be also included in parent's array.\r\n     * @param options.parentFirst When set to `true`, array will be sorted from text proxy parent to\r\n     * root element, otherwise root element will be the first item in the array.\r\n     * @returns Array with ancestors.\r\n     */\r\n    getAncestors(options = {}) {\r\n        const ancestors = [];\r\n        let parent = options.includeSelf ? this.textNode : this.parent;\r\n        while (parent !== null) {\r\n            ancestors[options.parentFirst ? 'push' : 'unshift'](parent);\r\n            parent = parent.parent;\r\n        }\r\n        return ancestors;\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nTextProxy.prototype.is = function (type) {\r\n    return type === '$textProxy' || type === 'view:$textProxy' ||\r\n        // This are legacy values kept for backward compatibility.\r\n        type === 'textProxy' || type === 'view:textProxy';\r\n};\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { isPlainObject } from 'lodash-es';\r\nimport { logWarning } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * View matcher class.\r\n * Instance of this class can be used to find {@link module:engine/view/element~Element elements} that match given pattern.\r\n */\r\nexport default class Matcher {\r\n    /**\r\n     * Creates new instance of Matcher.\r\n     *\r\n     * @param pattern Match patterns. See {@link module:engine/view/matcher~Matcher#add add method} for more information.\r\n     */\r\n    constructor(...pattern) {\r\n        this._patterns = [];\r\n        this.add(...pattern);\r\n    }\r\n    /**\r\n     * Adds pattern or patterns to matcher instance.\r\n     *\r\n     * ```ts\r\n     * // String.\r\n     * matcher.add( 'div' );\r\n     *\r\n     * // Regular expression.\r\n     * matcher.add( /^\\w/ );\r\n     *\r\n     * // Single class.\r\n     * matcher.add( {\r\n     * \tclasses: 'foobar'\r\n     * } );\r\n     * ```\r\n     *\r\n     * See {@link module:engine/view/matcher~MatcherPattern} for more examples.\r\n     *\r\n     * Multiple patterns can be added in one call:\r\n     *\r\n     * ```ts\r\n     * matcher.add( 'div', { classes: 'foobar' } );\r\n     * ```\r\n     *\r\n     * @param pattern Object describing pattern details. If string or regular expression\r\n     * is provided it will be used to match element's name. Pattern can be also provided in a form\r\n     * of a function - then this function will be called with each {@link module:engine/view/element~Element element} as a parameter.\r\n     * Function's return value will be stored under `match` key of the object returned from\r\n     * {@link module:engine/view/matcher~Matcher#match match} or {@link module:engine/view/matcher~Matcher#matchAll matchAll} methods.\r\n     */\r\n    add(...pattern) {\r\n        for (let item of pattern) {\r\n            // String or RegExp pattern is used as element's name.\r\n            if (typeof item == 'string' || item instanceof RegExp) {\r\n                item = { name: item };\r\n            }\r\n            this._patterns.push(item);\r\n        }\r\n    }\r\n    /**\r\n     * Matches elements for currently stored patterns. Returns match information about first found\r\n     * {@link module:engine/view/element~Element element}, otherwise returns `null`.\r\n     *\r\n     * Example of returned object:\r\n     *\r\n     * ```ts\r\n     * {\r\n     * \telement: <instance of found element>,\r\n     * \tpattern: <pattern used to match found element>,\r\n     * \tmatch: {\r\n     * \t\tname: true,\r\n     * \t\tattributes: [ 'title', 'href' ],\r\n     * \t\tclasses: [ 'foo' ],\r\n     * \t\tstyles: [ 'color', 'position' ]\r\n     * \t}\r\n     * }\r\n     * ```\r\n     *\r\n     * @see module:engine/view/matcher~Matcher#add\r\n     * @see module:engine/view/matcher~Matcher#matchAll\r\n     * @param element View element to match against stored patterns.\r\n     */\r\n    match(...element) {\r\n        for (const singleElement of element) {\r\n            for (const pattern of this._patterns) {\r\n                const match = isElementMatching(singleElement, pattern);\r\n                if (match) {\r\n                    return {\r\n                        element: singleElement,\r\n                        pattern,\r\n                        match\r\n                    };\r\n                }\r\n            }\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Matches elements for currently stored patterns. Returns array of match information with all found\r\n     * {@link module:engine/view/element~Element elements}. If no element is found - returns `null`.\r\n     *\r\n     * @see module:engine/view/matcher~Matcher#add\r\n     * @see module:engine/view/matcher~Matcher#match\r\n     * @param element View element to match against stored patterns.\r\n     * @returns Array with match information about found elements or `null`. For more information\r\n     * see {@link module:engine/view/matcher~Matcher#match match method} description.\r\n     */\r\n    matchAll(...element) {\r\n        const results = [];\r\n        for (const singleElement of element) {\r\n            for (const pattern of this._patterns) {\r\n                const match = isElementMatching(singleElement, pattern);\r\n                if (match) {\r\n                    results.push({\r\n                        element: singleElement,\r\n                        pattern,\r\n                        match\r\n                    });\r\n                }\r\n            }\r\n        }\r\n        return results.length > 0 ? results : null;\r\n    }\r\n    /**\r\n     * Returns the name of the element to match if there is exactly one pattern added to the matcher instance\r\n     * and it matches element name defined by `string` (not `RegExp`). Otherwise, returns `null`.\r\n     *\r\n     * @returns Element name trying to match.\r\n     */\r\n    getElementName() {\r\n        if (this._patterns.length !== 1) {\r\n            return null;\r\n        }\r\n        const pattern = this._patterns[0];\r\n        const name = pattern.name;\r\n        return (typeof pattern != 'function' && name && !(name instanceof RegExp)) ? name : null;\r\n    }\r\n}\r\n/**\r\n * Returns match information if {@link module:engine/view/element~Element element} is matching provided pattern.\r\n * If element cannot be matched to provided pattern - returns `null`.\r\n *\r\n * @returns Returns object with match information or null if element is not matching.\r\n */\r\nfunction isElementMatching(element, pattern) {\r\n    // If pattern is provided as function - return result of that function;\r\n    if (typeof pattern == 'function') {\r\n        return pattern(element);\r\n    }\r\n    const match = {};\r\n    // Check element's name.\r\n    if (pattern.name) {\r\n        match.name = matchName(pattern.name, element.name);\r\n        if (!match.name) {\r\n            return null;\r\n        }\r\n    }\r\n    // Check element's attributes.\r\n    if (pattern.attributes) {\r\n        match.attributes = matchAttributes(pattern.attributes, element);\r\n        if (!match.attributes) {\r\n            return null;\r\n        }\r\n    }\r\n    // Check element's classes.\r\n    if (pattern.classes) {\r\n        match.classes = matchClasses(pattern.classes, element);\r\n        if (!match.classes) {\r\n            return null;\r\n        }\r\n    }\r\n    // Check element's styles.\r\n    if (pattern.styles) {\r\n        match.styles = matchStyles(pattern.styles, element);\r\n        if (!match.styles) {\r\n            return null;\r\n        }\r\n    }\r\n    return match;\r\n}\r\n/**\r\n * Checks if name can be matched by provided pattern.\r\n *\r\n * @returns Returns `true` if name can be matched, `false` otherwise.\r\n */\r\nfunction matchName(pattern, name) {\r\n    // If pattern is provided as RegExp - test against this regexp.\r\n    if (pattern instanceof RegExp) {\r\n        return !!name.match(pattern);\r\n    }\r\n    return pattern === name;\r\n}\r\n/**\r\n * Checks if an array of key/value pairs can be matched against provided patterns.\r\n *\r\n * Patterns can be provided in a following ways:\r\n * - a boolean value matches any attribute with any value (or no value):\r\n *\r\n * ```ts\r\n * pattern: true\r\n * ```\r\n *\r\n * - a RegExp expression or object matches any attribute name:\r\n *\r\n * ```ts\r\n * pattern: /h[1-6]/\r\n * ```\r\n *\r\n * - an object matches any attribute that has the same name as the object item's key, where object item's value is:\r\n * \t- equal to `true`, which matches any attribute value:\r\n *\r\n * ```ts\r\n * pattern: {\r\n * \trequired: true\r\n * }\r\n * ```\r\n *\r\n * \t- a string that is equal to attribute value:\r\n *\r\n * ```ts\r\n * pattern: {\r\n * \trel: 'nofollow'\r\n * }\r\n * ```\r\n *\r\n * \t- a regular expression that matches attribute value,\r\n *\r\n * ```ts\r\n * pattern: {\r\n * \tsrc: /^https/\r\n * }\r\n * ```\r\n *\r\n * - an array with items, where the item is:\r\n * \t- a string that is equal to attribute value:\r\n *\r\n * ```ts\r\n * pattern: [ 'data-property-1', 'data-property-2' ],\r\n * ```\r\n *\r\n * \t- an object with `key` and `value` property, where `key` is a regular expression matching attribute name and\r\n * \t\t`value` is either regular expression matching attribute value or a string equal to attribute value:\r\n *\r\n * ```ts\r\n * pattern: [\r\n * \t{ key: /^data-property-/, value: true },\r\n * \t// or:\r\n * \t{ key: /^data-property-/, value: 'foobar' },\r\n * \t// or:\r\n * \t{ key: /^data-property-/, value: /^foo/ }\r\n * ]\r\n * ```\r\n *\r\n * @param patterns Object with information about attributes to match.\r\n * @param keys Attribute, style or class keys.\r\n * @param valueGetter A function providing value for a given item key.\r\n * @returns Returns array with matched attribute names or `null` if no attributes were matched.\r\n */\r\nfunction matchPatterns(patterns, keys, valueGetter) {\r\n    const normalizedPatterns = normalizePatterns(patterns);\r\n    const normalizedItems = Array.from(keys);\r\n    const match = [];\r\n    normalizedPatterns.forEach(([patternKey, patternValue]) => {\r\n        normalizedItems.forEach(itemKey => {\r\n            if (isKeyMatched(patternKey, itemKey) &&\r\n                isValueMatched(patternValue, itemKey, valueGetter)) {\r\n                match.push(itemKey);\r\n            }\r\n        });\r\n    });\r\n    // Return matches only if there are at least as many of them as there are patterns.\r\n    // The RegExp pattern can match more than one item.\r\n    if (!normalizedPatterns.length || match.length < normalizedPatterns.length) {\r\n        return undefined;\r\n    }\r\n    return match;\r\n}\r\n/**\r\n * Bring all the possible pattern forms to an array of arrays where first item is a key and second is a value.\r\n *\r\n * Examples:\r\n *\r\n * Boolean pattern value:\r\n *\r\n * ```ts\r\n * true\r\n * ```\r\n *\r\n * to\r\n *\r\n * ```ts\r\n * [ [ true, true ] ]\r\n * ```\r\n *\r\n * Textual pattern value:\r\n *\r\n * ```ts\r\n * 'attribute-name-or-class-or-style'\r\n * ```\r\n *\r\n * to\r\n *\r\n * ```ts\r\n * [ [ 'attribute-name-or-class-or-style', true ] ]\r\n * ```\r\n *\r\n * Regular expression:\r\n *\r\n * ```ts\r\n * /^data-.*$/\r\n * ```\r\n *\r\n * to\r\n *\r\n * ```ts\r\n * [ [ /^data-.*$/, true ] ]\r\n * ```\r\n *\r\n * Objects (plain or with `key` and `value` specified explicitly):\r\n *\r\n * ```ts\r\n * {\r\n * \tsrc: /^https:.*$/\r\n * }\r\n * ```\r\n *\r\n * or\r\n *\r\n * ```ts\r\n * [ {\r\n * \tkey: 'src',\r\n * \tvalue: /^https:.*$/\r\n * } ]\r\n * ```\r\n *\r\n * to:\r\n *\r\n * ```ts\r\n * [ [ 'src', /^https:.*$/ ] ]\r\n * ```\r\n *\r\n * @returns Returns an array of objects or null if provided patterns were not in an expected form.\r\n */\r\nfunction normalizePatterns(patterns) {\r\n    if (Array.isArray(patterns)) {\r\n        return patterns.map((pattern) => {\r\n            if (isPlainObject(pattern)) {\r\n                if (pattern.key === undefined || pattern.value === undefined) {\r\n                    // Documented at the end of matcher.js.\r\n                    logWarning('matcher-pattern-missing-key-or-value', pattern);\r\n                }\r\n                return [pattern.key, pattern.value];\r\n            }\r\n            // Assume the pattern is either String or RegExp.\r\n            return [pattern, true];\r\n        });\r\n    }\r\n    if (isPlainObject(patterns)) {\r\n        return Object.entries(patterns);\r\n    }\r\n    // Other cases (true, string or regexp).\r\n    return [[patterns, true]];\r\n}\r\n/**\r\n * @param patternKey A pattern representing a key we want to match.\r\n * @param itemKey An actual item key (e.g. `'src'`, `'background-color'`, `'ck-widget'`) we're testing against pattern.\r\n */\r\nfunction isKeyMatched(patternKey, itemKey) {\r\n    return patternKey === true ||\r\n        patternKey === itemKey ||\r\n        patternKey instanceof RegExp && itemKey.match(patternKey);\r\n}\r\n/**\r\n * @param patternValue A pattern representing a value we want to match.\r\n * @param itemKey An item key, e.g. `background`, `href`, 'rel', etc.\r\n * @param valueGetter A function used to provide a value for a given `itemKey`.\r\n */\r\nfunction isValueMatched(patternValue, itemKey, valueGetter) {\r\n    if (patternValue === true) {\r\n        return true;\r\n    }\r\n    const itemValue = valueGetter(itemKey);\r\n    // For now, the reducers are not returning the full tree of properties.\r\n    // Casting to string preserves the old behavior until the root cause is fixed.\r\n    // More can be found in https://github.com/ckeditor/ckeditor5/issues/10399.\r\n    return patternValue === itemValue ||\r\n        patternValue instanceof RegExp && !!String(itemValue).match(patternValue);\r\n}\r\n/**\r\n * Checks if attributes of provided element can be matched against provided patterns.\r\n *\r\n * @param patterns Object with information about attributes to match. Each key of the object will be\r\n * used as attribute name. Value of each key can be a string or regular expression to match against attribute value.\r\n * @param  element Element which attributes will be tested.\r\n * @returns Returns array with matched attribute names or `null` if no attributes were matched.\r\n */\r\nfunction matchAttributes(patterns, element) {\r\n    const attributeKeys = new Set(element.getAttributeKeys());\r\n    // `style` and `class` attribute keys are deprecated. Only allow them in object pattern\r\n    // for backward compatibility.\r\n    if (isPlainObject(patterns)) {\r\n        if (patterns.style !== undefined) {\r\n            // Documented at the end of matcher.js.\r\n            logWarning('matcher-pattern-deprecated-attributes-style-key', patterns);\r\n        }\r\n        if (patterns.class !== undefined) {\r\n            // Documented at the end of matcher.js.\r\n            logWarning('matcher-pattern-deprecated-attributes-class-key', patterns);\r\n        }\r\n    }\r\n    else {\r\n        attributeKeys.delete('style');\r\n        attributeKeys.delete('class');\r\n    }\r\n    return matchPatterns(patterns, attributeKeys, key => element.getAttribute(key));\r\n}\r\n/**\r\n * Checks if classes of provided element can be matched against provided patterns.\r\n *\r\n * @param patterns Array of strings or regular expressions to match against element's classes.\r\n * @param element Element which classes will be tested.\r\n * @returns Returns array with matched class names or `null` if no classes were matched.\r\n */\r\nfunction matchClasses(patterns, element) {\r\n    // We don't need `getter` here because patterns for classes are always normalized to `[ className, true ]`.\r\n    return matchPatterns(patterns, element.getClassNames(), /* istanbul ignore next -- @preserve */ () => { });\r\n}\r\n/**\r\n * Checks if styles of provided element can be matched against provided patterns.\r\n *\r\n * @param patterns Object with information about styles to match. Each key of the object will be\r\n * used as style name. Value of each key can be a string or regular expression to match against style value.\r\n * @param element Element which styles will be tested.\r\n * @returns Returns array with matched style names or `null` if no styles were matched.\r\n */\r\nfunction matchStyles(patterns, element) {\r\n    return matchPatterns(patterns, element.getStyleNames(true), key => element.getStyle(key));\r\n}\r\n/**\r\n * The key-value matcher pattern is missing key or value. Both must be present.\r\n * Refer the documentation: {@link module:engine/view/matcher~MatcherPattern}.\r\n *\r\n * @param pattern Pattern with missing properties.\r\n * @error matcher-pattern-missing-key-or-value\r\n */\r\n/**\r\n * The key-value matcher pattern for `attributes` option is using deprecated `style` key.\r\n *\r\n * Use `styles` matcher pattern option instead:\r\n *\r\n * ```ts\r\n * // Instead of:\r\n * const pattern = {\r\n * \tattributes: {\r\n * \t\tkey1: 'value1',\r\n * \t\tkey2: 'value2',\r\n * \t\tstyle: /^border.*$/\r\n * \t}\r\n * }\r\n *\r\n * // Use:\r\n * const pattern = {\r\n * \tattributes: {\r\n * \t\tkey1: 'value1',\r\n * \t\tkey2: 'value2'\r\n * \t},\r\n * \tstyles: /^border.*$/\r\n * }\r\n * ```\r\n *\r\n * Refer to the {@glink updating/guides/update-to-29##update-to-ckeditor-5-v2910 Migration to v29.1.0} guide\r\n * and {@link module:engine/view/matcher~MatcherPattern} documentation.\r\n *\r\n * @param pattern Pattern with missing properties.\r\n * @error matcher-pattern-deprecated-attributes-style-key\r\n */\r\n/**\r\n * The key-value matcher pattern for `attributes` option is using deprecated `class` key.\r\n *\r\n * Use `classes` matcher pattern option instead:\r\n *\r\n * ```ts\r\n * // Instead of:\r\n * const pattern = {\r\n * \tattributes: {\r\n * \t\tkey1: 'value1',\r\n * \t\tkey2: 'value2',\r\n * \t\tclass: 'foobar'\r\n * \t}\r\n * }\r\n *\r\n * // Use:\r\n * const pattern = {\r\n * \tattributes: {\r\n * \t\tkey1: 'value1',\r\n * \t\tkey2: 'value2'\r\n * \t},\r\n * \tclasses: 'foobar'\r\n * }\r\n * ```\r\n *\r\n * Refer to the {@glink updating/guides/update-to-29##update-to-ckeditor-5-v2910 Migration to v29.1.0} guide\r\n * and the {@link module:engine/view/matcher~MatcherPattern} documentation.\r\n *\r\n * @param pattern Pattern with missing properties.\r\n * @error matcher-pattern-deprecated-attributes-class-key\r\n */\r\n","import isArray from './isArray.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n    reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n  if (isArray(value)) {\n    return false;\n  }\n  var type = typeof value;\n  if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n      value == null || isSymbol(value)) {\n    return true;\n  }\n  return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n    (object != null && value in Object(object));\n}\n\nexport default isKey;\n","import MapCache from './_MapCache.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n  if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  var memoized = function() {\n    var args = arguments,\n        key = resolver ? resolver.apply(this, args) : args[0],\n        cache = memoized.cache;\n\n    if (cache.has(key)) {\n      return cache.get(key);\n    }\n    var result = func.apply(this, args);\n    memoized.cache = cache.set(key, result) || cache;\n    return result;\n  };\n  memoized.cache = new (memoize.Cache || MapCache);\n  return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nexport default memoize;\n","import memoize from './memoize.js';\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n  var result = memoize(func, function(key) {\n    if (cache.size === MAX_MEMOIZE_SIZE) {\n      cache.clear();\n    }\n    return key;\n  });\n\n  var cache = result.cache;\n  return result;\n}\n\nexport default memoizeCapped;\n","import memoizeCapped from './_memoizeCapped.js';\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n  var result = [];\n  if (string.charCodeAt(0) === 46 /* . */) {\n    result.push('');\n  }\n  string.replace(rePropName, function(match, number, quote, subString) {\n    result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n  });\n  return result;\n});\n\nexport default stringToPath;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      result = Array(length);\n\n  while (++index < length) {\n    result[index] = iteratee(array[index], index, array);\n  }\n  return result;\n}\n\nexport default arrayMap;\n","import Symbol from './_Symbol.js';\nimport arrayMap from './_arrayMap.js';\nimport isArray from './isArray.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n  // Exit early for strings to avoid a performance hit in some environments.\n  if (typeof value == 'string') {\n    return value;\n  }\n  if (isArray(value)) {\n    // Recursively convert values (susceptible to call stack limits).\n    return arrayMap(value, baseToString) + '';\n  }\n  if (isSymbol(value)) {\n    return symbolToString ? symbolToString.call(value) : '';\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nexport default baseToString;\n","import baseToString from './_baseToString.js';\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n  return value == null ? '' : baseToString(value);\n}\n\nexport default toString;\n","import isArray from './isArray.js';\nimport isKey from './_isKey.js';\nimport stringToPath from './_stringToPath.js';\nimport toString from './toString.js';\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n  if (isArray(value)) {\n    return value;\n  }\n  return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nexport default castPath;\n","/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n  var length = array == null ? 0 : array.length;\n  return length ? array[length - 1] : undefined;\n}\n\nexport default last;\n","import isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n  if (typeof value == 'string' || isSymbol(value)) {\n    return value;\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nexport default toKey;\n","import castPath from './_castPath.js';\nimport toKey from './_toKey.js';\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n  path = castPath(path, object);\n\n  var index = 0,\n      length = path.length;\n\n  while (object != null && index < length) {\n    object = object[toKey(path[index++])];\n  }\n  return (index && index == length) ? object : undefined;\n}\n\nexport default baseGet;\n","/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n  var index = -1,\n      length = array.length;\n\n  if (start < 0) {\n    start = -start > length ? 0 : (length + start);\n  }\n  end = end > length ? length : end;\n  if (end < 0) {\n    end += length;\n  }\n  length = start > end ? 0 : ((end - start) >>> 0);\n  start >>>= 0;\n\n  var result = Array(length);\n  while (++index < length) {\n    result[index] = array[index + start];\n  }\n  return result;\n}\n\nexport default baseSlice;\n","import baseGet from './_baseGet.js';\nimport baseSlice from './_baseSlice.js';\n\n/**\n * Gets the parent value at `path` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path to get the parent value of.\n * @returns {*} Returns the parent value.\n */\nfunction parent(object, path) {\n  return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n}\n\nexport default parent;\n","import castPath from './_castPath.js';\nimport last from './last.js';\nimport parent from './_parent.js';\nimport toKey from './_toKey.js';\n\n/**\n * The base implementation of `_.unset`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The property path to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n */\nfunction baseUnset(object, path) {\n  path = castPath(path, object);\n  object = parent(object, path);\n  return object == null || delete object[toKey(last(path))];\n}\n\nexport default baseUnset;\n","import baseUnset from './_baseUnset.js';\n\n/**\n * Removes the property at `path` of `object`.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n * _.unset(object, 'a[0].b.c');\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n *\n * _.unset(object, ['a', '0', 'b', 'c']);\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n */\nfunction unset(object, path) {\n  return object == null ? true : baseUnset(object, path);\n}\n\nexport default unset;\n","import baseGet from './_baseGet.js';\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n  var result = object == null ? undefined : baseGet(object, path);\n  return result === undefined ? defaultValue : result;\n}\n\nexport default get;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignMergeValue(object, key, value) {\n  if ((value !== undefined && !eq(object[key], value)) ||\n      (value === undefined && !(key in object))) {\n    baseAssignValue(object, key, value);\n  }\n}\n\nexport default assignMergeValue;\n","import createBaseFor from './_createBaseFor.js';\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nexport default baseFor;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n  return function(object, iteratee, keysFunc) {\n    var index = -1,\n        iterable = Object(object),\n        props = keysFunc(object),\n        length = props.length;\n\n    while (length--) {\n      var key = props[fromRight ? length : ++index];\n      if (iteratee(iterable[key], key, iterable) === false) {\n        break;\n      }\n    }\n    return object;\n  };\n}\n\nexport default createBaseFor;\n","import isArrayLike from './isArrayLike.js';\nimport isObjectLike from './isObjectLike.js';\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n *  else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n  return isObjectLike(value) && isArrayLike(value);\n}\n\nexport default isArrayLikeObject;\n","/**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction safeGet(object, key) {\n  if (key === 'constructor' && typeof object[key] === 'function') {\n    return;\n  }\n\n  if (key == '__proto__') {\n    return;\n  }\n\n  return object[key];\n}\n\nexport default safeGet;\n","import copyObject from './_copyObject.js';\nimport keysIn from './keysIn.js';\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n  return copyObject(value, keysIn(value));\n}\n\nexport default toPlainObject;\n","import assignMergeValue from './_assignMergeValue.js';\nimport cloneBuffer from './_cloneBuffer.js';\nimport cloneTypedArray from './_cloneTypedArray.js';\nimport copyArray from './_copyArray.js';\nimport initCloneObject from './_initCloneObject.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isArrayLikeObject from './isArrayLikeObject.js';\nimport isBuffer from './isBuffer.js';\nimport isFunction from './isFunction.js';\nimport isObject from './isObject.js';\nimport isPlainObject from './isPlainObject.js';\nimport isTypedArray from './isTypedArray.js';\nimport safeGet from './_safeGet.js';\nimport toPlainObject from './toPlainObject.js';\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n *  counterparts.\n */\nfunction baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n  var objValue = safeGet(object, key),\n      srcValue = safeGet(source, key),\n      stacked = stack.get(srcValue);\n\n  if (stacked) {\n    assignMergeValue(object, key, stacked);\n    return;\n  }\n  var newValue = customizer\n    ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n    : undefined;\n\n  var isCommon = newValue === undefined;\n\n  if (isCommon) {\n    var isArr = isArray(srcValue),\n        isBuff = !isArr && isBuffer(srcValue),\n        isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n    newValue = srcValue;\n    if (isArr || isBuff || isTyped) {\n      if (isArray(objValue)) {\n        newValue = objValue;\n      }\n      else if (isArrayLikeObject(objValue)) {\n        newValue = copyArray(objValue);\n      }\n      else if (isBuff) {\n        isCommon = false;\n        newValue = cloneBuffer(srcValue, true);\n      }\n      else if (isTyped) {\n        isCommon = false;\n        newValue = cloneTypedArray(srcValue, true);\n      }\n      else {\n        newValue = [];\n      }\n    }\n    else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n      newValue = objValue;\n      if (isArguments(objValue)) {\n        newValue = toPlainObject(objValue);\n      }\n      else if (!isObject(objValue) || isFunction(objValue)) {\n        newValue = initCloneObject(srcValue);\n      }\n    }\n    else {\n      isCommon = false;\n    }\n  }\n  if (isCommon) {\n    // Recursively merge objects and arrays (susceptible to call stack limits).\n    stack.set(srcValue, newValue);\n    mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n    stack['delete'](srcValue);\n  }\n  assignMergeValue(object, key, newValue);\n}\n\nexport default baseMergeDeep;\n","import Stack from './_Stack.js';\nimport assignMergeValue from './_assignMergeValue.js';\nimport baseFor from './_baseFor.js';\nimport baseMergeDeep from './_baseMergeDeep.js';\nimport isObject from './isObject.js';\nimport keysIn from './keysIn.js';\nimport safeGet from './_safeGet.js';\n\n/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n *  counterparts.\n */\nfunction baseMerge(object, source, srcIndex, customizer, stack) {\n  if (object === source) {\n    return;\n  }\n  baseFor(source, function(srcValue, key) {\n    stack || (stack = new Stack);\n    if (isObject(srcValue)) {\n      baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n    }\n    else {\n      var newValue = customizer\n        ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n        : undefined;\n\n      if (newValue === undefined) {\n        newValue = srcValue;\n      }\n      assignMergeValue(object, key, newValue);\n    }\n  }, keysIn);\n}\n\nexport default baseMerge;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\nexport default identity;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n  switch (args.length) {\n    case 0: return func.call(thisArg);\n    case 1: return func.call(thisArg, args[0]);\n    case 2: return func.call(thisArg, args[0], args[1]);\n    case 3: return func.call(thisArg, args[0], args[1], args[2]);\n  }\n  return func.apply(thisArg, args);\n}\n\nexport default apply;\n","import apply from './_apply.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n  start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n  return function() {\n    var args = arguments,\n        index = -1,\n        length = nativeMax(args.length - start, 0),\n        array = Array(length);\n\n    while (++index < length) {\n      array[index] = args[start + index];\n    }\n    index = -1;\n    var otherArgs = Array(start + 1);\n    while (++index < start) {\n      otherArgs[index] = args[index];\n    }\n    otherArgs[start] = transform(array);\n    return apply(func, this, otherArgs);\n  };\n}\n\nexport default overRest;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n  return function() {\n    return value;\n  };\n}\n\nexport default constant;\n","import constant from './constant.js';\nimport defineProperty from './_defineProperty.js';\nimport identity from './identity.js';\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n  return defineProperty(func, 'toString', {\n    'configurable': true,\n    'enumerable': false,\n    'value': constant(string),\n    'writable': true\n  });\n};\n\nexport default baseSetToString;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n    HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n  var count = 0,\n      lastCalled = 0;\n\n  return function() {\n    var stamp = nativeNow(),\n        remaining = HOT_SPAN - (stamp - lastCalled);\n\n    lastCalled = stamp;\n    if (remaining > 0) {\n      if (++count >= HOT_COUNT) {\n        return arguments[0];\n      }\n    } else {\n      count = 0;\n    }\n    return func.apply(undefined, arguments);\n  };\n}\n\nexport default shortOut;\n","import baseSetToString from './_baseSetToString.js';\nimport shortOut from './_shortOut.js';\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nexport default setToString;\n","import identity from './identity.js';\nimport overRest from './_overRest.js';\nimport setToString from './_setToString.js';\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n  return setToString(overRest(func, start, identity), func + '');\n}\n\nexport default baseRest;\n","import eq from './eq.js';\nimport isArrayLike from './isArrayLike.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n *  else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n  if (!isObject(object)) {\n    return false;\n  }\n  var type = typeof index;\n  if (type == 'number'\n        ? (isArrayLike(object) && isIndex(index, object.length))\n        : (type == 'string' && index in object)\n      ) {\n    return eq(object[index], value);\n  }\n  return false;\n}\n\nexport default isIterateeCall;\n","import baseRest from './_baseRest.js';\nimport isIterateeCall from './_isIterateeCall.js';\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n  return baseRest(function(object, sources) {\n    var index = -1,\n        length = sources.length,\n        customizer = length > 1 ? sources[length - 1] : undefined,\n        guard = length > 2 ? sources[2] : undefined;\n\n    customizer = (assigner.length > 3 && typeof customizer == 'function')\n      ? (length--, customizer)\n      : undefined;\n\n    if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n      customizer = length < 3 ? undefined : customizer;\n      length = 1;\n    }\n    object = Object(object);\n    while (++index < length) {\n      var source = sources[index];\n      if (source) {\n        assigner(object, source, index, customizer);\n      }\n    }\n    return object;\n  });\n}\n\nexport default createAssigner;\n","import baseMerge from './_baseMerge.js';\nimport createAssigner from './_createAssigner.js';\n\n/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n *   'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n *   'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\nvar merge = createAssigner(function(object, source, srcIndex) {\n  baseMerge(object, source, srcIndex);\n});\n\nexport default merge;\n","import assignValue from './_assignValue.js';\nimport castPath from './_castPath.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\nimport toKey from './_toKey.js';\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n  if (!isObject(object)) {\n    return object;\n  }\n  path = castPath(path, object);\n\n  var index = -1,\n      length = path.length,\n      lastIndex = length - 1,\n      nested = object;\n\n  while (nested != null && ++index < length) {\n    var key = toKey(path[index]),\n        newValue = value;\n\n    if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n      return object;\n    }\n\n    if (index != lastIndex) {\n      var objValue = nested[key];\n      newValue = customizer ? customizer(objValue, key, nested) : undefined;\n      if (newValue === undefined) {\n        newValue = isObject(objValue)\n          ? objValue\n          : (isIndex(path[index + 1]) ? [] : {});\n      }\n    }\n    assignValue(nested, key, newValue);\n    nested = nested[key];\n  }\n  return object;\n}\n\nexport default baseSet;\n","import baseSet from './_baseSet.js';\n\n/**\n * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n * it's created. Arrays are created for missing index properties while objects\n * are created for all other missing properties. Use `_.setWith` to customize\n * `path` creation.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.set(object, 'a[0].b.c', 4);\n * console.log(object.a[0].b.c);\n * // => 4\n *\n * _.set(object, ['x', '0', 'y', 'z'], 5);\n * console.log(object.x[0].y.z);\n * // => 5\n */\nfunction set(object, path, value) {\n  return object == null ? object : baseSet(object, path, value);\n}\n\nexport default set;\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/stylesmap\r\n */\r\nimport { get, isObject, merge, set, unset } from 'lodash-es';\r\n/**\r\n * Styles map. Allows handling (adding, removing, retrieving) a set of style rules (usually, of an element).\r\n *\r\n * The styles map is capable of normalizing style names so e.g. the following operations are possible:\r\n */\r\nexport default class StylesMap {\r\n    /**\r\n     * Creates Styles instance.\r\n     */\r\n    constructor(styleProcessor) {\r\n        this._styles = {};\r\n        this._styleProcessor = styleProcessor;\r\n    }\r\n    /**\r\n     * Returns true if style map has no styles set.\r\n     */\r\n    get isEmpty() {\r\n        const entries = Object.entries(this._styles);\r\n        const from = Array.from(entries);\r\n        return !from.length;\r\n    }\r\n    /**\r\n     * Number of styles defined.\r\n     */\r\n    get size() {\r\n        if (this.isEmpty) {\r\n            return 0;\r\n        }\r\n        return this.getStyleNames().length;\r\n    }\r\n    /**\r\n     * Set styles map to a new value.\r\n     *\r\n     * ```ts\r\n     * styles.setTo( 'border:1px solid blue;margin-top:1px;' );\r\n     * ```\r\n     */\r\n    setTo(inlineStyle) {\r\n        this.clear();\r\n        const parsedStyles = Array.from(parseInlineStyles(inlineStyle).entries());\r\n        for (const [key, value] of parsedStyles) {\r\n            this._styleProcessor.toNormalizedForm(key, value, this._styles);\r\n        }\r\n    }\r\n    /**\r\n     * Checks if a given style is set.\r\n     *\r\n     * ```ts\r\n     * styles.setTo( 'margin-left:1px;' );\r\n     *\r\n     * styles.has( 'margin-left' );    // -> true\r\n     * styles.has( 'padding' );        // -> false\r\n     * ```\r\n     *\r\n     * **Note**: This check supports normalized style names.\r\n     *\r\n     * ```ts\r\n     * // Enable 'margin' shorthand processing:\r\n     * editor.data.addStyleProcessorRules( addMarginRules );\r\n     *\r\n     * styles.setTo( 'margin:2px;' );\r\n     *\r\n     * styles.has( 'margin' );         // -> true\r\n     * styles.has( 'margin-top' );     // -> true\r\n     * styles.has( 'margin-left' );    // -> true\r\n     *\r\n     * styles.remove( 'margin-top' );\r\n     *\r\n     * styles.has( 'margin' );         // -> false\r\n     * styles.has( 'margin-top' );     // -> false\r\n     * styles.has( 'margin-left' );    // -> true\r\n     * ```\r\n     *\r\n     * @param name Style name.\r\n     */\r\n    has(name) {\r\n        if (this.isEmpty) {\r\n            return false;\r\n        }\r\n        const styles = this._styleProcessor.getReducedForm(name, this._styles);\r\n        const propertyDescriptor = styles.find(([property]) => property === name);\r\n        // Only return a value if it is set;\r\n        return Array.isArray(propertyDescriptor);\r\n    }\r\n    set(nameOrObject, valueOrObject) {\r\n        if (isObject(nameOrObject)) {\r\n            for (const [key, value] of Object.entries(nameOrObject)) {\r\n                this._styleProcessor.toNormalizedForm(key, value, this._styles);\r\n            }\r\n        }\r\n        else {\r\n            this._styleProcessor.toNormalizedForm(nameOrObject, valueOrObject, this._styles);\r\n        }\r\n    }\r\n    /**\r\n     * Removes given style.\r\n     *\r\n     * ```ts\r\n     * styles.setTo( 'background:#f00;margin-right:2px;' );\r\n     *\r\n     * styles.remove( 'background' );\r\n     *\r\n     * styles.toString();   // -> 'margin-right:2px;'\r\n     * ```\r\n     *\r\n     * ***Note**:* This method uses {@link module:engine/controller/datacontroller~DataController#addStyleProcessorRules\r\n     * enabled style processor rules} to normalize passed values.\r\n     *\r\n     * ```ts\r\n     * // Enable 'margin' shorthand processing:\r\n     * editor.data.addStyleProcessorRules( addMarginRules );\r\n     *\r\n     * styles.setTo( 'margin:1px' );\r\n     *\r\n     * styles.remove( 'margin-top' );\r\n     * styles.remove( 'margin-right' );\r\n     *\r\n     * styles.toString(); // -> 'margin-bottom:1px;margin-left:1px;'\r\n     * ```\r\n     *\r\n     * @param name Style name.\r\n     */\r\n    remove(name) {\r\n        const path = toPath(name);\r\n        unset(this._styles, path);\r\n        delete this._styles[name];\r\n        this._cleanEmptyObjectsOnPath(path);\r\n    }\r\n    /**\r\n     * Returns a normalized style object or a single value.\r\n     *\r\n     * ```ts\r\n     * // Enable 'margin' shorthand processing:\r\n     * editor.data.addStyleProcessorRules( addMarginRules );\r\n     *\r\n     * const styles = new Styles();\r\n     * styles.setTo( 'margin:1px 2px 3em;' );\r\n     *\r\n     * styles.getNormalized( 'margin' );\r\n     * // will log:\r\n     * // {\r\n     * //     top: '1px',\r\n     * //     right: '2px',\r\n     * //     bottom: '3em',\r\n     * //     left: '2px'     // normalized value from margin shorthand\r\n     * // }\r\n     *\r\n     * styles.getNormalized( 'margin-left' ); // -> '2px'\r\n     * ```\r\n     *\r\n     * **Note**: This method will only return normalized styles if a style processor was defined.\r\n     *\r\n     * @param name Style name.\r\n     */\r\n    getNormalized(name) {\r\n        return this._styleProcessor.getNormalized(name, this._styles);\r\n    }\r\n    /**\r\n     * Returns a normalized style string. Styles are sorted by name.\r\n     *\r\n     * ```ts\r\n     * styles.set( 'margin' , '1px' );\r\n     * styles.set( 'background', '#f00' );\r\n     *\r\n     * styles.toString(); // -> 'background:#f00;margin:1px;'\r\n     * ```\r\n     *\r\n     * **Note**: This method supports normalized styles if defined.\r\n     *\r\n     * ```ts\r\n     * // Enable 'margin' shorthand processing:\r\n     * editor.data.addStyleProcessorRules( addMarginRules );\r\n     *\r\n     * styles.set( 'margin' , '1px' );\r\n     * styles.set( 'background', '#f00' );\r\n     * styles.remove( 'margin-top' );\r\n     * styles.remove( 'margin-right' );\r\n     *\r\n     * styles.toString(); // -> 'background:#f00;margin-bottom:1px;margin-left:1px;'\r\n     * ```\r\n     */\r\n    toString() {\r\n        if (this.isEmpty) {\r\n            return '';\r\n        }\r\n        return this._getStylesEntries()\r\n            .map(arr => arr.join(':'))\r\n            .sort()\r\n            .join(';') + ';';\r\n    }\r\n    /**\r\n     * Returns property as a value string or undefined if property is not set.\r\n     *\r\n     * ```ts\r\n     * // Enable 'margin' shorthand processing:\r\n     * editor.data.addStyleProcessorRules( addMarginRules );\r\n     *\r\n     * const styles = new Styles();\r\n     * styles.setTo( 'margin:1px;' );\r\n     * styles.set( 'margin-bottom', '3em' );\r\n     *\r\n     * styles.getAsString( 'margin' ); // -> 'margin: 1px 1px 3em;'\r\n     * ```\r\n     *\r\n     * Note, however, that all sub-values must be set for the longhand property name to return a value:\r\n     *\r\n     * ```ts\r\n     * const styles = new Styles();\r\n     * styles.setTo( 'margin:1px;' );\r\n     * styles.remove( 'margin-bottom' );\r\n     *\r\n     * styles.getAsString( 'margin' ); // -> undefined\r\n     * ```\r\n     *\r\n     * In the above scenario, it is not possible to return a `margin` value, so `undefined` is returned.\r\n     * Instead, you should use:\r\n     *\r\n     * ```ts\r\n     * const styles = new Styles();\r\n     * styles.setTo( 'margin:1px;' );\r\n     * styles.remove( 'margin-bottom' );\r\n     *\r\n     * for ( const styleName of styles.getStyleNames() ) {\r\n     * \tconsole.log( styleName, styles.getAsString( styleName ) );\r\n     * }\r\n     * // 'margin-top', '1px'\r\n     * // 'margin-right', '1px'\r\n     * // 'margin-left', '1px'\r\n     * ```\r\n     *\r\n     * In general, it is recommend to iterate over style names like in the example above. This way, you will always get all\r\n     * the currently set style values. So, if all the 4 margin values would be set\r\n     * the for-of loop above would yield only `'margin'`, `'1px'`:\r\n     *\r\n     * ```ts\r\n     * const styles = new Styles();\r\n     * styles.setTo( 'margin:1px;' );\r\n     *\r\n     * for ( const styleName of styles.getStyleNames() ) {\r\n     * \tconsole.log( styleName, styles.getAsString( styleName ) );\r\n     * }\r\n     * // 'margin', '1px'\r\n     * ```\r\n     *\r\n     * **Note**: To get a normalized version of a longhand property use the {@link #getNormalized `#getNormalized()`} method.\r\n     */\r\n    getAsString(propertyName) {\r\n        if (this.isEmpty) {\r\n            return;\r\n        }\r\n        if (this._styles[propertyName] && !isObject(this._styles[propertyName])) {\r\n            // Try return styles set directly - values that are not parsed.\r\n            return this._styles[propertyName];\r\n        }\r\n        const styles = this._styleProcessor.getReducedForm(propertyName, this._styles);\r\n        const propertyDescriptor = styles.find(([property]) => property === propertyName);\r\n        // Only return a value if it is set;\r\n        if (Array.isArray(propertyDescriptor)) {\r\n            return propertyDescriptor[1];\r\n        }\r\n    }\r\n    /**\r\n     * Returns all style properties names as they would appear when using {@link #toString `#toString()`}.\r\n     *\r\n     * When `expand` is set to true and there's a shorthand style property set, it will also return all equivalent styles:\r\n     *\r\n     * ```ts\r\n     * stylesMap.setTo( 'margin: 1em' )\r\n     * ```\r\n     *\r\n     * will be expanded to:\r\n     *\r\n     * ```ts\r\n     * [ 'margin', 'margin-top', 'margin-right', 'margin-bottom', 'margin-left' ]\r\n     * ```\r\n     *\r\n     * @param expand Expand shorthand style properties and all return equivalent style representations.\r\n     */\r\n    getStyleNames(expand = false) {\r\n        if (this.isEmpty) {\r\n            return [];\r\n        }\r\n        if (expand) {\r\n            return this._styleProcessor.getStyleNames(this._styles);\r\n        }\r\n        const entries = this._getStylesEntries();\r\n        return entries.map(([key]) => key);\r\n    }\r\n    /**\r\n     * Removes all styles.\r\n     */\r\n    clear() {\r\n        this._styles = {};\r\n    }\r\n    /**\r\n     * Returns normalized styles entries for further processing.\r\n     */\r\n    _getStylesEntries() {\r\n        const parsed = [];\r\n        const keys = Object.keys(this._styles);\r\n        for (const key of keys) {\r\n            parsed.push(...this._styleProcessor.getReducedForm(key, this._styles));\r\n        }\r\n        return parsed;\r\n    }\r\n    /**\r\n     * Removes empty objects upon removing an entry from internal object.\r\n     */\r\n    _cleanEmptyObjectsOnPath(path) {\r\n        const pathParts = path.split('.');\r\n        const isChildPath = pathParts.length > 1;\r\n        if (!isChildPath) {\r\n            return;\r\n        }\r\n        const parentPath = pathParts.splice(0, pathParts.length - 1).join('.');\r\n        const parentObject = get(this._styles, parentPath);\r\n        if (!parentObject) {\r\n            return;\r\n        }\r\n        const isParentEmpty = !Array.from(Object.keys(parentObject)).length;\r\n        if (isParentEmpty) {\r\n            this.remove(parentPath);\r\n        }\r\n    }\r\n}\r\n/**\r\n * Style processor is responsible for writing and reading a normalized styles object.\r\n */\r\nexport class StylesProcessor {\r\n    /**\r\n     * Creates StylesProcessor instance.\r\n     *\r\n     * @internal\r\n     */\r\n    constructor() {\r\n        this._normalizers = new Map();\r\n        this._extractors = new Map();\r\n        this._reducers = new Map();\r\n        this._consumables = new Map();\r\n    }\r\n    /**\r\n     * Parse style string value to a normalized object and appends it to styles object.\r\n     *\r\n     * ```ts\r\n     * const styles = {};\r\n     *\r\n     * stylesProcessor.toNormalizedForm( 'margin', '1px', styles );\r\n     *\r\n     * // styles will consist: { margin: { top: '1px', right: '1px', bottom: '1px', left: '1px; } }\r\n     * ```\r\n     *\r\n     * **Note**: To define normalizer callbacks use {@link #setNormalizer}.\r\n     *\r\n     * @param name Name of style property.\r\n     * @param propertyValue Value of style property.\r\n     * @param styles Object holding normalized styles.\r\n     */\r\n    toNormalizedForm(name, propertyValue, styles) {\r\n        if (isObject(propertyValue)) {\r\n            appendStyleValue(styles, toPath(name), propertyValue);\r\n            return;\r\n        }\r\n        if (this._normalizers.has(name)) {\r\n            const normalizer = this._normalizers.get(name);\r\n            const { path, value } = normalizer(propertyValue);\r\n            appendStyleValue(styles, path, value);\r\n        }\r\n        else {\r\n            appendStyleValue(styles, name, propertyValue);\r\n        }\r\n    }\r\n    /**\r\n     * Returns a normalized version of a style property.\r\n     *\r\n     * ```ts\r\n     * const styles = {\r\n     * \tmargin: { top: '1px', right: '1px', bottom: '1px', left: '1px; },\r\n     * \tbackground: { color: '#f00' }\r\n     * };\r\n     *\r\n     * stylesProcessor.getNormalized( 'background' );\r\n     * // will return: { color: '#f00' }\r\n     *\r\n     * stylesProcessor.getNormalized( 'margin-top' );\r\n     * // will return: '1px'\r\n     * ```\r\n     *\r\n     * **Note**: In some cases extracting single value requires defining an extractor callback {@link #setExtractor}.\r\n     *\r\n     * @param name Name of style property.\r\n     * @param styles Object holding normalized styles.\r\n     */\r\n    getNormalized(name, styles) {\r\n        if (!name) {\r\n            return merge({}, styles);\r\n        }\r\n        // Might be empty string.\r\n        if (styles[name] !== undefined) {\r\n            return styles[name];\r\n        }\r\n        if (this._extractors.has(name)) {\r\n            const extractor = this._extractors.get(name);\r\n            if (typeof extractor === 'string') {\r\n                return get(styles, extractor);\r\n            }\r\n            const value = extractor(name, styles);\r\n            if (value) {\r\n                return value;\r\n            }\r\n        }\r\n        return get(styles, toPath(name));\r\n    }\r\n    /**\r\n     * Returns a reduced form of style property form normalized object.\r\n     *\r\n     * For default margin reducer, the below code:\r\n     *\r\n     * ```ts\r\n     * stylesProcessor.getReducedForm( 'margin', {\r\n     * \tmargin: { top: '1px', right: '1px', bottom: '2px', left: '1px; }\r\n     * } );\r\n     * ```\r\n     *\r\n     * will return:\r\n     *\r\n     * ```ts\r\n     * [\r\n     * \t[ 'margin', '1px 1px 2px' ]\r\n     * ]\r\n     * ```\r\n     *\r\n     * because it might be represented as a shorthand 'margin' value. However if one of margin long hand values is missing it should return:\r\n     *\r\n     * ```ts\r\n     * [\r\n     * \t[ 'margin-top', '1px' ],\r\n     * \t[ 'margin-right', '1px' ],\r\n     * \t[ 'margin-bottom', '2px' ]\r\n     * \t// the 'left' value is missing - cannot use 'margin' shorthand.\r\n     * ]\r\n     * ```\r\n     *\r\n     * **Note**: To define reducer callbacks use {@link #setReducer}.\r\n     *\r\n     * @param name Name of style property.\r\n     */\r\n    getReducedForm(name, styles) {\r\n        const normalizedValue = this.getNormalized(name, styles);\r\n        // Might be empty string.\r\n        if (normalizedValue === undefined) {\r\n            return [];\r\n        }\r\n        if (this._reducers.has(name)) {\r\n            const reducer = this._reducers.get(name);\r\n            return reducer(normalizedValue);\r\n        }\r\n        return [[name, normalizedValue]];\r\n    }\r\n    /**\r\n     * Return all style properties. Also expand shorthand properties (e.g. `margin`, `background`) if respective extractor is available.\r\n     *\r\n     * @param styles Object holding normalized styles.\r\n     */\r\n    getStyleNames(styles) {\r\n        // Find all extractable styles that have a value.\r\n        const expandedStyleNames = Array.from(this._consumables.keys()).filter(name => {\r\n            const style = this.getNormalized(name, styles);\r\n            if (style && typeof style == 'object') {\r\n                return Object.keys(style).length;\r\n            }\r\n            return style;\r\n        });\r\n        // For simple styles (for example `color`) we don't have a map of those styles\r\n        // but they are 1 to 1 with normalized object keys.\r\n        const styleNamesKeysSet = new Set([\r\n            ...expandedStyleNames,\r\n            ...Object.keys(styles)\r\n        ]);\r\n        return Array.from(styleNamesKeysSet.values());\r\n    }\r\n    /**\r\n     * Returns related style names.\r\n     *\r\n     * ```ts\r\n     * stylesProcessor.getRelatedStyles( 'margin' );\r\n     * // will return: [ 'margin-top', 'margin-right', 'margin-bottom', 'margin-left' ];\r\n     *\r\n     * stylesProcessor.getRelatedStyles( 'margin-top' );\r\n     * // will return: [ 'margin' ];\r\n     * ```\r\n     *\r\n     * **Note**: To define new style relations load an existing style processor or use\r\n     * {@link module:engine/view/stylesmap~StylesProcessor#setStyleRelation `StylesProcessor.setStyleRelation()`}.\r\n     */\r\n    getRelatedStyles(name) {\r\n        return this._consumables.get(name) || [];\r\n    }\r\n    /**\r\n     * Adds a normalizer method for a style property.\r\n     *\r\n     * A normalizer returns describing how the value should be normalized.\r\n     *\r\n     * For instance 'margin' style is a shorthand for four margin values:\r\n     *\r\n     * - 'margin-top'\r\n     * - 'margin-right'\r\n     * - 'margin-bottom'\r\n     * - 'margin-left'\r\n     *\r\n     * and can be written in various ways if some values are equal to others. For instance `'margin: 1px 2em;'` is a shorthand for\r\n     * `'margin-top: 1px;margin-right: 2em;margin-bottom: 1px;margin-left: 2em'`.\r\n     *\r\n     * A normalizer should parse various margin notations as a single object:\r\n     *\r\n     * ```ts\r\n     * const styles = {\r\n     * \tmargin: {\r\n     * \t\ttop: '1px',\r\n     * \t\tright: '2em',\r\n     * \t\tbottom: '1px',\r\n     * \t\tleft: '2em'\r\n     * \t}\r\n     * };\r\n     * ```\r\n     *\r\n     * Thus a normalizer for 'margin' style should return an object defining style path and value to store:\r\n     *\r\n     * ```ts\r\n     * const returnValue = {\r\n     * \tpath: 'margin',\r\n     * \tvalue: {\r\n     * \t\ttop: '1px',\r\n     * \t\tright: '2em',\r\n     * \t\tbottom: '1px',\r\n     * \t\tleft: '2em'\r\n     * \t}\r\n     * };\r\n     * ```\r\n     *\r\n     * Additionally to fully support all margin notations there should be also defined 4 normalizers for longhand margin notations. Below\r\n     * is an example for 'margin-top' style property normalizer:\r\n     *\r\n     * ```ts\r\n     * stylesProcessor.setNormalizer( 'margin-top', valueString => {\r\n     * \treturn {\r\n     * \t\tpath: 'margin.top',\r\n     * \t\tvalue: valueString\r\n     * \t}\r\n     * } );\r\n     * ```\r\n     */\r\n    setNormalizer(name, callback) {\r\n        this._normalizers.set(name, callback);\r\n    }\r\n    /**\r\n     * Adds a extractor callback for a style property.\r\n     *\r\n     * Most normalized style values are stored as one level objects. It is assumed that `'margin-top'` style will be stored as:\r\n     *\r\n     * ```ts\r\n     * const styles = {\r\n     * \tmargin: {\r\n     * \t\ttop: 'value'\r\n     * \t}\r\n     * }\r\n     * ```\r\n     *\r\n     * However, some styles can have conflicting notations and thus it might be harder to extract a style value from shorthand. For instance\r\n     * the 'border-top-style' can be defined using `'border-top:solid'`, `'border-style:solid none none none'` or by `'border:solid'`\r\n     * shorthands. The default border styles processors stores styles as:\r\n     *\r\n     * ```ts\r\n     * const styles = {\r\n     * \tborder: {\r\n     * \t\tstyle: {\r\n     * \t\t\ttop: 'solid'\r\n     * \t\t}\r\n     * \t}\r\n     * }\r\n     * ```\r\n     *\r\n     * as it is better to modify border style independently from other values. On the other part the output of the border might be\r\n     * desired as `border-top`, `border-left`, etc notation.\r\n     *\r\n     * In the above example an extractor should return a side border value that combines style, color and width:\r\n     *\r\n     * ```ts\r\n     * styleProcessor.setExtractor( 'border-top', styles => {\r\n     * \treturn {\r\n     * \t\tcolor: styles.border.color.top,\r\n     * \t\tstyle: styles.border.style.top,\r\n     * \t\twidth: styles.border.width.top\r\n     * \t}\r\n     * } );\r\n     * ```\r\n     *\r\n     * @param callbackOrPath Callback that return a requested value or path string for single values.\r\n     */\r\n    setExtractor(name, callbackOrPath) {\r\n        this._extractors.set(name, callbackOrPath);\r\n    }\r\n    /**\r\n     * Adds a reducer callback for a style property.\r\n     *\r\n     * Reducer returns a minimal notation for given style name. For longhand properties it is not required to write a reducer as\r\n     * by default the direct value from style path is taken.\r\n     *\r\n     * For shorthand styles a reducer should return minimal style notation either by returning single name-value tuple or multiple tuples\r\n     * if a shorthand cannot be used. For instance for a margin shorthand a reducer might return:\r\n     *\r\n     * ```ts\r\n     * const marginShortHandTuple = [\r\n     * \t[ 'margin', '1px 1px 2px' ]\r\n     * ];\r\n     * ```\r\n     *\r\n     * or a longhand tuples for defined values:\r\n     *\r\n     * ```ts\r\n     * // Considering margin.bottom and margin.left are undefined.\r\n     * const marginLonghandsTuples = [\r\n     * \t[ 'margin-top', '1px' ],\r\n     * \t[ 'margin-right', '1px' ]\r\n     * ];\r\n     * ```\r\n     *\r\n     * A reducer obtains a normalized style value:\r\n     *\r\n     * ```ts\r\n     * // Simplified reducer that always outputs 4 values which are always present:\r\n     * stylesProcessor.setReducer( 'margin', margin => {\r\n     * \treturn [\r\n     * \t\t[ 'margin', `${ margin.top } ${ margin.right } ${ margin.bottom } ${ margin.left }` ]\r\n     * \t]\r\n     * } );\r\n     * ```\r\n     */\r\n    setReducer(name, callback) {\r\n        this._reducers.set(name, callback);\r\n    }\r\n    /**\r\n     * Defines a style shorthand relation to other style notations.\r\n     *\r\n     * ```ts\r\n     * stylesProcessor.setStyleRelation( 'margin', [\r\n     * \t'margin-top',\r\n     * \t'margin-right',\r\n     * \t'margin-bottom',\r\n     * \t'margin-left'\r\n     * ] );\r\n     * ```\r\n     *\r\n     * This enables expanding of style names for shorthands. For instance, if defined,\r\n     * {@link module:engine/conversion/viewconsumable~ViewConsumable view consumable} items are automatically created\r\n     * for long-hand margin style notation alongside the `'margin'` item.\r\n     *\r\n     * This means that when an element being converted has a style `margin`, a converter for `margin-left` will work just\r\n     * fine since the view consumable will contain a consumable `margin-left` item (thanks to the relation) and\r\n     * `element.getStyle( 'margin-left' )` will work as well assuming that the style processor was correctly configured.\r\n     * However, once `margin-left` is consumed, `margin` will not be consumable anymore.\r\n     */\r\n    setStyleRelation(shorthandName, styleNames) {\r\n        this._mapStyleNames(shorthandName, styleNames);\r\n        for (const alsoName of styleNames) {\r\n            this._mapStyleNames(alsoName, [shorthandName]);\r\n        }\r\n    }\r\n    /**\r\n     * Set two-way binding of style names.\r\n     */\r\n    _mapStyleNames(name, styleNames) {\r\n        if (!this._consumables.has(name)) {\r\n            this._consumables.set(name, []);\r\n        }\r\n        this._consumables.get(name).push(...styleNames);\r\n    }\r\n}\r\n/**\r\n * Parses inline styles and puts property - value pairs into styles map.\r\n *\r\n * @param stylesString Styles to parse.\r\n * @returns Map of parsed properties and values.\r\n */\r\nfunction parseInlineStyles(stylesString) {\r\n    // `null` if no quote was found in input string or last found quote was a closing quote. See below.\r\n    let quoteType = null;\r\n    let propertyNameStart = 0;\r\n    let propertyValueStart = 0;\r\n    let propertyName = null;\r\n    const stylesMap = new Map();\r\n    // Do not set anything if input string is empty.\r\n    if (stylesString === '') {\r\n        return stylesMap;\r\n    }\r\n    // Fix inline styles that do not end with `;` so they are compatible with algorithm below.\r\n    if (stylesString.charAt(stylesString.length - 1) != ';') {\r\n        stylesString = stylesString + ';';\r\n    }\r\n    // Seek the whole string for \"special characters\".\r\n    for (let i = 0; i < stylesString.length; i++) {\r\n        const char = stylesString.charAt(i);\r\n        if (quoteType === null) {\r\n            // No quote found yet or last found quote was a closing quote.\r\n            switch (char) {\r\n                case ':':\r\n                    // Most of time colon means that property name just ended.\r\n                    // Sometimes however `:` is found inside property value (for example in background image url).\r\n                    if (!propertyName) {\r\n                        // Treat this as end of property only if property name is not already saved.\r\n                        // Save property name.\r\n                        propertyName = stylesString.substr(propertyNameStart, i - propertyNameStart);\r\n                        // Save this point as the start of property value.\r\n                        propertyValueStart = i + 1;\r\n                    }\r\n                    break;\r\n                case '\"':\r\n                case '\\'':\r\n                    // Opening quote found (this is an opening quote, because `quoteType` is `null`).\r\n                    quoteType = char;\r\n                    break;\r\n                case ';': {\r\n                    // Property value just ended.\r\n                    // Use previously stored property value start to obtain property value.\r\n                    const propertyValue = stylesString.substr(propertyValueStart, i - propertyValueStart);\r\n                    if (propertyName) {\r\n                        // Save parsed part.\r\n                        stylesMap.set(propertyName.trim(), propertyValue.trim());\r\n                    }\r\n                    propertyName = null;\r\n                    // Save this point as property name start. Property name starts immediately after previous property value ends.\r\n                    propertyNameStart = i + 1;\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        else if (char === quoteType) {\r\n            // If a quote char is found and it is a closing quote, mark this fact by `null`-ing `quoteType`.\r\n            quoteType = null;\r\n        }\r\n    }\r\n    return stylesMap;\r\n}\r\n/**\r\n * Return lodash compatible path from style name.\r\n */\r\nfunction toPath(name) {\r\n    return name.replace('-', '.');\r\n}\r\n/**\r\n * Appends style definition to the styles object.\r\n */\r\nfunction appendStyleValue(stylesObject, nameOrPath, valueOrObject) {\r\n    let valueToSet = valueOrObject;\r\n    if (isObject(valueOrObject)) {\r\n        valueToSet = merge({}, get(stylesObject, nameOrPath), valueOrObject);\r\n    }\r\n    set(stylesObject, nameOrPath, valueToSet);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/element\r\n */\r\nimport Node from './node';\r\nimport Text from './text';\r\nimport TextProxy from './textproxy';\r\nimport { isIterable, toArray, toMap } from '@ckeditor/ckeditor5-utils';\r\nimport { default as Matcher } from './matcher';\r\nimport { default as StylesMap } from './stylesmap';\r\n// @if CK_DEBUG_ENGINE // const { convertMapToTags } = require( '../dev-utils/utils' );\r\n/**\r\n * View element.\r\n *\r\n * The editing engine does not define a fixed semantics of its elements (it is \"DTD-free\").\r\n * This is why the type of the {@link module:engine/view/element~Element} need to\r\n * be defined by the feature developer. When creating an element you should use one of the following methods:\r\n *\r\n * * {@link module:engine/view/downcastwriter~DowncastWriter#createContainerElement `downcastWriter#createContainerElement()`}\r\n * in order to create a {@link module:engine/view/containerelement~ContainerElement},\r\n * * {@link module:engine/view/downcastwriter~DowncastWriter#createAttributeElement `downcastWriter#createAttributeElement()`}\r\n * in order to create a {@link module:engine/view/attributeelement~AttributeElement},\r\n * * {@link module:engine/view/downcastwriter~DowncastWriter#createEmptyElement `downcastWriter#createEmptyElement()`}\r\n * in order to create a {@link module:engine/view/emptyelement~EmptyElement}.\r\n * * {@link module:engine/view/downcastwriter~DowncastWriter#createUIElement `downcastWriter#createUIElement()`}\r\n * in order to create a {@link module:engine/view/uielement~UIElement}.\r\n * * {@link module:engine/view/downcastwriter~DowncastWriter#createEditableElement `downcastWriter#createEditableElement()`}\r\n * in order to create a {@link module:engine/view/editableelement~EditableElement}.\r\n *\r\n * Note that for view elements which are not created from the model, like elements from mutations, paste or\r\n * {@link module:engine/controller/datacontroller~DataController#set data.set} it is not possible to define the type of the element.\r\n * In such cases the {@link module:engine/view/upcastwriter~UpcastWriter#createElement `UpcastWriter#createElement()`} method\r\n * should be used to create generic view elements.\r\n */\r\nexport default class Element extends Node {\r\n    /**\r\n     * Creates a view element.\r\n     *\r\n     * Attributes can be passed in various formats:\r\n     *\r\n     * ```ts\r\n     * new Element( viewDocument, 'div', { class: 'editor', contentEditable: 'true' } ); // object\r\n     * new Element( viewDocument, 'div', [ [ 'class', 'editor' ], [ 'contentEditable', 'true' ] ] ); // map-like iterator\r\n     * new Element( viewDocument, 'div', mapOfAttributes ); // map\r\n     * ```\r\n     *\r\n     * @internal\r\n     * @param document The document instance to which this element belongs.\r\n     * @param name Node name.\r\n     * @param attrs Collection of attributes.\r\n     * @param children A list of nodes to be inserted into created element.\r\n     */\r\n    constructor(document, name, attrs, children) {\r\n        super(document);\r\n        /**\r\n         * A list of attribute names that should be rendered in the editing pipeline even though filtering mechanisms\r\n         * implemented in the {@link module:engine/view/domconverter~DomConverter} (for instance,\r\n         * {@link module:engine/view/domconverter~DomConverter#shouldRenderAttribute}) would filter them out.\r\n         *\r\n         * These attributes can be specified as an option when the element is created by\r\n         * the {@link module:engine/view/downcastwriter~DowncastWriter}. To check whether an unsafe an attribute should\r\n         * be permitted, use the {@link #shouldRenderUnsafeAttribute} method.\r\n         *\r\n         * @internal\r\n         */\r\n        this._unsafeAttributesToRender = [];\r\n        /**\r\n         * Map of custom properties.\r\n         * Custom properties can be added to element instance, will be cloned but not rendered into DOM.\r\n         */\r\n        this._customProperties = new Map();\r\n        this.name = name;\r\n        this._attrs = parseAttributes(attrs);\r\n        this._children = [];\r\n        if (children) {\r\n            this._insertChild(0, children);\r\n        }\r\n        this._classes = new Set();\r\n        if (this._attrs.has('class')) {\r\n            // Remove class attribute and handle it by class set.\r\n            const classString = this._attrs.get('class');\r\n            parseClasses(this._classes, classString);\r\n            this._attrs.delete('class');\r\n        }\r\n        this._styles = new StylesMap(this.document.stylesProcessor);\r\n        if (this._attrs.has('style')) {\r\n            // Remove style attribute and handle it by styles map.\r\n            this._styles.setTo(this._attrs.get('style'));\r\n            this._attrs.delete('style');\r\n        }\r\n    }\r\n    /**\r\n     * Number of element's children.\r\n     */\r\n    get childCount() {\r\n        return this._children.length;\r\n    }\r\n    /**\r\n     * Is `true` if there are no nodes inside this element, `false` otherwise.\r\n     */\r\n    get isEmpty() {\r\n        return this._children.length === 0;\r\n    }\r\n    /**\r\n     * Gets child at the given index.\r\n     *\r\n     * @param index Index of child.\r\n     * @returns Child node.\r\n     */\r\n    getChild(index) {\r\n        return this._children[index];\r\n    }\r\n    /**\r\n     * Gets index of the given child node. Returns `-1` if child node is not found.\r\n     *\r\n     * @param node Child node.\r\n     * @returns Index of the child node.\r\n     */\r\n    getChildIndex(node) {\r\n        return this._children.indexOf(node);\r\n    }\r\n    /**\r\n     * Gets child nodes iterator.\r\n     *\r\n     * @returns Child nodes iterator.\r\n     */\r\n    getChildren() {\r\n        return this._children[Symbol.iterator]();\r\n    }\r\n    /**\r\n     * Returns an iterator that contains the keys for attributes. Order of inserting attributes is not preserved.\r\n     *\r\n     * @returns Keys for attributes.\r\n     */\r\n    *getAttributeKeys() {\r\n        if (this._classes.size > 0) {\r\n            yield 'class';\r\n        }\r\n        if (!this._styles.isEmpty) {\r\n            yield 'style';\r\n        }\r\n        yield* this._attrs.keys();\r\n    }\r\n    /**\r\n     * Returns iterator that iterates over this element's attributes.\r\n     *\r\n     * Attributes are returned as arrays containing two items. First one is attribute key and second is attribute value.\r\n     * This format is accepted by native `Map` object and also can be passed in `Node` constructor.\r\n     */\r\n    *getAttributes() {\r\n        yield* this._attrs.entries();\r\n        if (this._classes.size > 0) {\r\n            yield ['class', this.getAttribute('class')];\r\n        }\r\n        if (!this._styles.isEmpty) {\r\n            yield ['style', this.getAttribute('style')];\r\n        }\r\n    }\r\n    /**\r\n     * Gets attribute by key. If attribute is not present - returns undefined.\r\n     *\r\n     * @param key Attribute key.\r\n     * @returns Attribute value.\r\n     */\r\n    getAttribute(key) {\r\n        if (key == 'class') {\r\n            if (this._classes.size > 0) {\r\n                return [...this._classes].join(' ');\r\n            }\r\n            return undefined;\r\n        }\r\n        if (key == 'style') {\r\n            const inlineStyle = this._styles.toString();\r\n            return inlineStyle == '' ? undefined : inlineStyle;\r\n        }\r\n        return this._attrs.get(key);\r\n    }\r\n    /**\r\n     * Returns a boolean indicating whether an attribute with the specified key exists in the element.\r\n     *\r\n     * @param key Attribute key.\r\n     * @returns `true` if attribute with the specified key exists in the element, `false` otherwise.\r\n     */\r\n    hasAttribute(key) {\r\n        if (key == 'class') {\r\n            return this._classes.size > 0;\r\n        }\r\n        if (key == 'style') {\r\n            return !this._styles.isEmpty;\r\n        }\r\n        return this._attrs.has(key);\r\n    }\r\n    /**\r\n     * Checks if this element is similar to other element.\r\n     * Both elements should have the same name and attributes to be considered as similar. Two similar elements\r\n     * can contain different set of children nodes.\r\n     */\r\n    isSimilar(otherElement) {\r\n        if (!(otherElement instanceof Element)) {\r\n            return false;\r\n        }\r\n        // If exactly the same Element is provided - return true immediately.\r\n        if (this === otherElement) {\r\n            return true;\r\n        }\r\n        // Check element name.\r\n        if (this.name != otherElement.name) {\r\n            return false;\r\n        }\r\n        // Check number of attributes, classes and styles.\r\n        if (this._attrs.size !== otherElement._attrs.size || this._classes.size !== otherElement._classes.size ||\r\n            this._styles.size !== otherElement._styles.size) {\r\n            return false;\r\n        }\r\n        // Check if attributes are the same.\r\n        for (const [key, value] of this._attrs) {\r\n            if (!otherElement._attrs.has(key) || otherElement._attrs.get(key) !== value) {\r\n                return false;\r\n            }\r\n        }\r\n        // Check if classes are the same.\r\n        for (const className of this._classes) {\r\n            if (!otherElement._classes.has(className)) {\r\n                return false;\r\n            }\r\n        }\r\n        // Check if styles are the same.\r\n        for (const property of this._styles.getStyleNames()) {\r\n            if (!otherElement._styles.has(property) ||\r\n                otherElement._styles.getAsString(property) !== this._styles.getAsString(property)) {\r\n                return false;\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n    /**\r\n     * Returns true if class is present.\r\n     * If more then one class is provided - returns true only when all classes are present.\r\n     *\r\n     * ```ts\r\n     * element.hasClass( 'foo' ); // Returns true if 'foo' class is present.\r\n     * element.hasClass( 'foo', 'bar' ); // Returns true if 'foo' and 'bar' classes are both present.\r\n     * ```\r\n     */\r\n    hasClass(...className) {\r\n        for (const name of className) {\r\n            if (!this._classes.has(name)) {\r\n                return false;\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n    /**\r\n     * Returns iterator that contains all class names.\r\n     */\r\n    getClassNames() {\r\n        return this._classes.keys();\r\n    }\r\n    /**\r\n     * Returns style value for the given property mae.\r\n     * If the style does not exist `undefined` is returned.\r\n     *\r\n     * **Note**: This method can work with normalized style names if\r\n     * {@link module:engine/controller/datacontroller~DataController#addStyleProcessorRules a particular style processor rule is enabled}.\r\n     * See {@link module:engine/view/stylesmap~StylesMap#getAsString `StylesMap#getAsString()`} for details.\r\n     *\r\n     * For an element with style set to `'margin:1px'`:\r\n     *\r\n     * ```ts\r\n     * // Enable 'margin' shorthand processing:\r\n     * editor.data.addStyleProcessorRules( addMarginRules );\r\n     *\r\n     * const element = view.change( writer => {\r\n     * \tconst element = writer.createElement();\r\n     * \twriter.setStyle( 'margin', '1px' );\r\n     * \twriter.setStyle( 'margin-bottom', '3em' );\r\n     *\r\n     * \treturn element;\r\n     * } );\r\n     *\r\n     * element.getStyle( 'margin' ); // -> 'margin: 1px 1px 3em;'\r\n     * ```\r\n     */\r\n    getStyle(property) {\r\n        return this._styles.getAsString(property);\r\n    }\r\n    /**\r\n     * Returns a normalized style object or single style value.\r\n     *\r\n     * For an element with style set to: margin:1px 2px 3em;\r\n     *\r\n     * ```ts\r\n     * element.getNormalizedStyle( 'margin' ) );\r\n     * ```\r\n     *\r\n     * will return:\r\n     *\r\n     * ```ts\r\n     * {\r\n     * \ttop: '1px',\r\n     * \tright: '2px',\r\n     * \tbottom: '3em',\r\n     * \tleft: '2px'    // a normalized value from margin shorthand\r\n     * }\r\n     * ```\r\n     *\r\n     * and reading for single style value:\r\n     *\r\n     * ```ts\r\n     * styles.getNormalizedStyle( 'margin-left' );\r\n     * ```\r\n     *\r\n     * Will return a `2px` string.\r\n     *\r\n     * **Note**: This method will return normalized values only if\r\n     * {@link module:engine/controller/datacontroller~DataController#addStyleProcessorRules a particular style processor rule is enabled}.\r\n     * See {@link module:engine/view/stylesmap~StylesMap#getNormalized `StylesMap#getNormalized()`} for details.\r\n     *\r\n     * @param property Name of CSS property\r\n     */\r\n    getNormalizedStyle(property) {\r\n        return this._styles.getNormalized(property);\r\n    }\r\n    /**\r\n     * Returns iterator that contains all style names.\r\n     *\r\n     * @param expand Expand shorthand style properties and return all equivalent style representations.\r\n     */\r\n    getStyleNames(expand) {\r\n        return this._styles.getStyleNames(expand);\r\n    }\r\n    /**\r\n     * Returns true if style keys are present.\r\n     * If more then one style property is provided - returns true only when all properties are present.\r\n     *\r\n     * ```ts\r\n     * element.hasStyle( 'color' ); // Returns true if 'border-top' style is present.\r\n     * element.hasStyle( 'color', 'border-top' ); // Returns true if 'color' and 'border-top' styles are both present.\r\n     * ```\r\n     */\r\n    hasStyle(...property) {\r\n        for (const name of property) {\r\n            if (!this._styles.has(name)) {\r\n                return false;\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n    /**\r\n     * Returns ancestor element that match specified pattern.\r\n     * Provided patterns should be compatible with {@link module:engine/view/matcher~Matcher Matcher} as it is used internally.\r\n     *\r\n     * @see module:engine/view/matcher~Matcher\r\n     * @param patterns Patterns used to match correct ancestor. See {@link module:engine/view/matcher~Matcher}.\r\n     * @returns Found element or `null` if no matching ancestor was found.\r\n     */\r\n    findAncestor(...patterns) {\r\n        const matcher = new Matcher(...patterns);\r\n        let parent = this.parent;\r\n        while (parent && !parent.is('documentFragment')) {\r\n            if (matcher.match(parent)) {\r\n                return parent;\r\n            }\r\n            parent = parent.parent;\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Returns the custom property value for the given key.\r\n     */\r\n    getCustomProperty(key) {\r\n        return this._customProperties.get(key);\r\n    }\r\n    /**\r\n     * Returns an iterator which iterates over this element's custom properties.\r\n     * Iterator provides `[ key, value ]` pairs for each stored property.\r\n     */\r\n    *getCustomProperties() {\r\n        yield* this._customProperties.entries();\r\n    }\r\n    /**\r\n     * Returns identity string based on element's name, styles, classes and other attributes.\r\n     * Two elements that {@link #isSimilar are similar} will have same identity string.\r\n     * It has the following format:\r\n     *\r\n     * ```ts\r\n     * 'name class=\"class1,class2\" style=\"style1:value1;style2:value2\" attr1=\"val1\" attr2=\"val2\"'\r\n     * ```\r\n     *\r\n     * For example:\r\n     *\r\n     * ```ts\r\n     * const element = writer.createContainerElement( 'foo', {\r\n     * \tbanana: '10',\r\n     * \tapple: '20',\r\n     * \tstyle: 'color: red; border-color: white;',\r\n     * \tclass: 'baz'\r\n     * } );\r\n     *\r\n     * // returns 'foo class=\"baz\" style=\"border-color:white;color:red\" apple=\"20\" banana=\"10\"'\r\n     * element.getIdentity();\r\n     * ```\r\n     *\r\n     * **Note**: Classes, styles and other attributes are sorted alphabetically.\r\n     */\r\n    getIdentity() {\r\n        const classes = Array.from(this._classes).sort().join(',');\r\n        const styles = this._styles.toString();\r\n        const attributes = Array.from(this._attrs).map(i => `${i[0]}=\"${i[1]}\"`).sort().join(' ');\r\n        return this.name +\r\n            (classes == '' ? '' : ` class=\"${classes}\"`) +\r\n            (!styles ? '' : ` style=\"${styles}\"`) +\r\n            (attributes == '' ? '' : ` ${attributes}`);\r\n    }\r\n    /**\r\n     * Decides whether an unsafe attribute is whitelisted and should be rendered in the editing pipeline even though filtering mechanisms\r\n     * like {@link module:engine/view/domconverter~DomConverter#shouldRenderAttribute} say it should not.\r\n     *\r\n     * Unsafe attribute names can be specified when creating an element via {@link module:engine/view/downcastwriter~DowncastWriter}.\r\n     *\r\n     * @param attributeName The name of the attribute to be checked.\r\n     */\r\n    shouldRenderUnsafeAttribute(attributeName) {\r\n        return this._unsafeAttributesToRender.includes(attributeName);\r\n    }\r\n    /**\r\n     * Clones provided element.\r\n     *\r\n     * @internal\r\n     * @param deep If set to `true` clones element and all its children recursively. When set to `false`,\r\n     * element will be cloned without any children.\r\n     * @returns Clone of this element.\r\n     */\r\n    _clone(deep = false) {\r\n        const childrenClone = [];\r\n        if (deep) {\r\n            for (const child of this.getChildren()) {\r\n                childrenClone.push(child._clone(deep));\r\n            }\r\n        }\r\n        // ContainerElement and AttributeElement should be also cloned properly.\r\n        const cloned = new this.constructor(this.document, this.name, this._attrs, childrenClone);\r\n        // Classes and styles are cloned separately - this solution is faster than adding them back to attributes and\r\n        // parse once again in constructor.\r\n        cloned._classes = new Set(this._classes);\r\n        cloned._styles.set(this._styles.getNormalized());\r\n        // Clone custom properties.\r\n        cloned._customProperties = new Map(this._customProperties);\r\n        // Clone filler offset method.\r\n        // We can't define this method in a prototype because it's behavior which\r\n        // is changed by e.g. toWidget() function from ckeditor5-widget. Perhaps this should be one of custom props.\r\n        cloned.getFillerOffset = this.getFillerOffset;\r\n        // Clone unsafe attributes list.\r\n        cloned._unsafeAttributesToRender = this._unsafeAttributesToRender;\r\n        return cloned;\r\n    }\r\n    /**\r\n     * {@link module:engine/view/element~Element#_insertChild Insert} a child node or a list of child nodes at the end of this node\r\n     * and sets the parent of these nodes to this element.\r\n     *\r\n     * @see module:engine/view/downcastwriter~DowncastWriter#insert\r\n     * @internal\r\n     * @param items Items to be inserted.\r\n     * @fires change\r\n     * @returns Number of appended nodes.\r\n     */\r\n    _appendChild(items) {\r\n        return this._insertChild(this.childCount, items);\r\n    }\r\n    /**\r\n     * Inserts a child node or a list of child nodes on the given index and sets the parent of these nodes to\r\n     * this element.\r\n     *\r\n     * @internal\r\n     * @see module:engine/view/downcastwriter~DowncastWriter#insert\r\n     * @param index Position where nodes should be inserted.\r\n     * @param items Items to be inserted.\r\n     * @fires change\r\n     * @returns Number of inserted nodes.\r\n     */\r\n    _insertChild(index, items) {\r\n        this._fireChange('children', this);\r\n        let count = 0;\r\n        const nodes = normalize(this.document, items);\r\n        for (const node of nodes) {\r\n            // If node that is being added to this element is already inside another element, first remove it from the old parent.\r\n            if (node.parent !== null) {\r\n                node._remove();\r\n            }\r\n            node.parent = this;\r\n            node.document = this.document;\r\n            this._children.splice(index, 0, node);\r\n            index++;\r\n            count++;\r\n        }\r\n        return count;\r\n    }\r\n    /**\r\n     * Removes number of child nodes starting at the given index and set the parent of these nodes to `null`.\r\n     *\r\n     * @see module:engine/view/downcastwriter~DowncastWriter#remove\r\n     * @internal\r\n     * @param index Number of the first node to remove.\r\n     * @param howMany Number of nodes to remove.\r\n     * @fires change\r\n     * @returns The array of removed nodes.\r\n     */\r\n    _removeChildren(index, howMany = 1) {\r\n        this._fireChange('children', this);\r\n        for (let i = index; i < index + howMany; i++) {\r\n            this._children[i].parent = null;\r\n        }\r\n        return this._children.splice(index, howMany);\r\n    }\r\n    /**\r\n     * Adds or overwrite attribute with a specified key and value.\r\n     *\r\n     * @see module:engine/view/downcastwriter~DowncastWriter#setAttribute\r\n     * @internal\r\n     * @param key Attribute key.\r\n     * @param value Attribute value.\r\n     * @fires change\r\n     */\r\n    _setAttribute(key, value) {\r\n        const stringValue = String(value);\r\n        this._fireChange('attributes', this);\r\n        if (key == 'class') {\r\n            parseClasses(this._classes, stringValue);\r\n        }\r\n        else if (key == 'style') {\r\n            this._styles.setTo(stringValue);\r\n        }\r\n        else {\r\n            this._attrs.set(key, stringValue);\r\n        }\r\n    }\r\n    /**\r\n     * Removes attribute from the element.\r\n     *\r\n     * @see module:engine/view/downcastwriter~DowncastWriter#removeAttribute\r\n     * @internal\r\n     * @param key Attribute key.\r\n     * @returns Returns true if an attribute existed and has been removed.\r\n     * @fires change\r\n     */\r\n    _removeAttribute(key) {\r\n        this._fireChange('attributes', this);\r\n        // Remove class attribute.\r\n        if (key == 'class') {\r\n            if (this._classes.size > 0) {\r\n                this._classes.clear();\r\n                return true;\r\n            }\r\n            return false;\r\n        }\r\n        // Remove style attribute.\r\n        if (key == 'style') {\r\n            if (!this._styles.isEmpty) {\r\n                this._styles.clear();\r\n                return true;\r\n            }\r\n            return false;\r\n        }\r\n        // Remove other attributes.\r\n        return this._attrs.delete(key);\r\n    }\r\n    /**\r\n     * Adds specified class.\r\n     *\r\n     * ```ts\r\n     * element._addClass( 'foo' ); // Adds 'foo' class.\r\n     * element._addClass( [ 'foo', 'bar' ] ); // Adds 'foo' and 'bar' classes.\r\n     * ```\r\n     *\r\n     * @see module:engine/view/downcastwriter~DowncastWriter#addClass\r\n     * @internal\r\n     * @fires change\r\n     */\r\n    _addClass(className) {\r\n        this._fireChange('attributes', this);\r\n        for (const name of toArray(className)) {\r\n            this._classes.add(name);\r\n        }\r\n    }\r\n    /**\r\n     * Removes specified class.\r\n     *\r\n     * ```ts\r\n     * element._removeClass( 'foo' );  // Removes 'foo' class.\r\n     * element._removeClass( [ 'foo', 'bar' ] ); // Removes both 'foo' and 'bar' classes.\r\n     * ```\r\n     *\r\n     * @see module:engine/view/downcastwriter~DowncastWriter#removeClass\r\n     * @internal\r\n     * @fires change\r\n     */\r\n    _removeClass(className) {\r\n        this._fireChange('attributes', this);\r\n        for (const name of toArray(className)) {\r\n            this._classes.delete(name);\r\n        }\r\n    }\r\n    _setStyle(property, value) {\r\n        this._fireChange('attributes', this);\r\n        if (typeof property != 'string') {\r\n            this._styles.set(property);\r\n        }\r\n        else {\r\n            this._styles.set(property, value);\r\n        }\r\n    }\r\n    /**\r\n     * Removes specified style.\r\n     *\r\n     * ```ts\r\n     * element._removeStyle( 'color' );  // Removes 'color' style.\r\n     * element._removeStyle( [ 'color', 'border-top' ] ); // Removes both 'color' and 'border-top' styles.\r\n     * ```\r\n     *\r\n     * **Note**: This method can work with normalized style names if\r\n     * {@link module:engine/controller/datacontroller~DataController#addStyleProcessorRules a particular style processor rule is enabled}.\r\n     * See {@link module:engine/view/stylesmap~StylesMap#remove `StylesMap#remove()`} for details.\r\n     *\r\n     * @see module:engine/view/downcastwriter~DowncastWriter#removeStyle\r\n     * @internal\r\n     * @fires change\r\n     */\r\n    _removeStyle(property) {\r\n        this._fireChange('attributes', this);\r\n        for (const name of toArray(property)) {\r\n            this._styles.remove(name);\r\n        }\r\n    }\r\n    /**\r\n     * Sets a custom property. Unlike attributes, custom properties are not rendered to the DOM,\r\n     * so they can be used to add special data to elements.\r\n     *\r\n     * @see module:engine/view/downcastwriter~DowncastWriter#setCustomProperty\r\n     * @internal\r\n     */\r\n    _setCustomProperty(key, value) {\r\n        this._customProperties.set(key, value);\r\n    }\r\n    /**\r\n     * Removes the custom property stored under the given key.\r\n     *\r\n     * @see module:engine/view/downcastwriter~DowncastWriter#removeCustomProperty\r\n     * @internal\r\n     * @returns Returns true if property was removed.\r\n     */\r\n    _removeCustomProperty(key) {\r\n        return this._customProperties.delete(key);\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nElement.prototype.is = function (type, name) {\r\n    if (!name) {\r\n        return type === 'element' || type === 'view:element' ||\r\n            // From super.is(). This is highly utilised method and cannot call super. See ckeditor/ckeditor5#6529.\r\n            type === 'node' || type === 'view:node';\r\n    }\r\n    else {\r\n        return name === this.name && (type === 'element' || type === 'view:element');\r\n    }\r\n};\r\n/**\r\n * Parses attributes provided to the element constructor before they are applied to an element. If attributes are passed\r\n * as an object (instead of `Iterable`), the object is transformed to the map. Attributes with `null` value are removed.\r\n * Attributes with non-`String` value are converted to `String`.\r\n *\r\n * @param attrs Attributes to parse.\r\n * @returns Parsed attributes.\r\n */\r\nfunction parseAttributes(attrs) {\r\n    const attrsMap = toMap(attrs);\r\n    for (const [key, value] of attrsMap) {\r\n        if (value === null) {\r\n            attrsMap.delete(key);\r\n        }\r\n        else if (typeof value != 'string') {\r\n            attrsMap.set(key, String(value));\r\n        }\r\n    }\r\n    return attrsMap;\r\n}\r\n/**\r\n * Parses class attribute and puts all classes into classes set.\r\n * Classes set s cleared before insertion.\r\n *\r\n * @param classesSet Set to insert parsed classes.\r\n * @param classesString String with classes to parse.\r\n */\r\nfunction parseClasses(classesSet, classesString) {\r\n    const classArray = classesString.split(/\\s+/);\r\n    classesSet.clear();\r\n    classArray.forEach(name => classesSet.add(name));\r\n}\r\n/**\r\n * Converts strings to Text and non-iterables to arrays.\r\n */\r\nfunction normalize(document, nodes) {\r\n    // Separate condition because string is iterable.\r\n    if (typeof nodes == 'string') {\r\n        return [new Text(document, nodes)];\r\n    }\r\n    if (!isIterable(nodes)) {\r\n        nodes = [nodes];\r\n    }\r\n    // Array.from to enable .map() on non-arrays.\r\n    return Array.from(nodes)\r\n        .map(node => {\r\n        if (typeof node == 'string') {\r\n            return new Text(document, node);\r\n        }\r\n        if (node instanceof TextProxy) {\r\n            return new Text(document, node.data);\r\n        }\r\n        return node;\r\n    });\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/containerelement\r\n */\r\nimport Element from './element';\r\n/**\r\n * Containers are elements which define document structure. They define boundaries for\r\n * {@link module:engine/view/attributeelement~AttributeElement attributes}. They are mostly used for block elements like `<p>` or `<div>`.\r\n *\r\n * Editing engine does not define a fixed HTML DTD. This is why a feature developer needs to choose between various\r\n * types (container element, {@link module:engine/view/attributeelement~AttributeElement attribute element},\r\n * {@link module:engine/view/emptyelement~EmptyElement empty element}, etc) when developing a feature.\r\n *\r\n * The container element should be your default choice when writing a converter, unless:\r\n *\r\n * * this element represents a model text attribute (then use {@link module:engine/view/attributeelement~AttributeElement}),\r\n * * this is an empty element like `<img>` (then use {@link module:engine/view/emptyelement~EmptyElement}),\r\n * * this is a root element,\r\n * * this is a nested editable element (then use  {@link module:engine/view/editableelement~EditableElement}).\r\n *\r\n * To create a new container element instance use the\r\n * {@link module:engine/view/downcastwriter~DowncastWriter#createContainerElement `DowncastWriter#createContainerElement()`}\r\n * method.\r\n */\r\nexport default class ContainerElement extends Element {\r\n    /**\r\n     * Creates a container element.\r\n     *\r\n     * @see module:engine/view/downcastwriter~DowncastWriter#createContainerElement\r\n     * @see module:engine/view/element~Element\r\n     * @internal\r\n     * @param document The document instance to which this element belongs.\r\n     * @param name Node name.\r\n     * @param attrs Collection of attributes.\r\n     * @param children A list of nodes to be inserted into created element.\r\n     */\r\n    constructor(document, name, attrs, children) {\r\n        super(document, name, attrs, children);\r\n        this.getFillerOffset = getFillerOffset;\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nContainerElement.prototype.is = function (type, name) {\r\n    if (!name) {\r\n        return type === 'containerElement' || type === 'view:containerElement' ||\r\n            // From super.is(). This is highly utilised method and cannot call super. See ckeditor/ckeditor5#6529.\r\n            type === 'element' || type === 'view:element' ||\r\n            type === 'node' || type === 'view:node';\r\n    }\r\n    else {\r\n        return name === this.name && (type === 'containerElement' || type === 'view:containerElement' ||\r\n            // From super.is(). This is highly utilised method and cannot call super. See ckeditor/ckeditor5#6529.\r\n            type === 'element' || type === 'view:element');\r\n    }\r\n};\r\n/**\r\n * Returns block {@link module:engine/view/filler filler} offset or `null` if block filler is not needed.\r\n *\r\n * @returns Block filler offset or `null` if block filler is not needed.\r\n */\r\nexport function getFillerOffset() {\r\n    const children = [...this.getChildren()];\r\n    const lastChild = children[this.childCount - 1];\r\n    // Block filler is required after a `<br>` if it's the last element in its container. See #1422.\r\n    if (lastChild && lastChild.is('element', 'br')) {\r\n        return this.childCount;\r\n    }\r\n    for (const child of children) {\r\n        // If there's any non-UI element – don't render the bogus.\r\n        if (!child.is('uiElement')) {\r\n            return null;\r\n        }\r\n    }\r\n    // If there are only UI elements – render the bogus at the end of the element.\r\n    return this.childCount;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/editableelement\r\n */\r\nimport ContainerElement from './containerelement';\r\nimport { ObservableMixin } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Editable element which can be a {@link module:engine/view/rooteditableelement~RootEditableElement root}\r\n * or nested editable area in the editor.\r\n *\r\n * Editable is automatically read-only when its {@link module:engine/view/document~Document Document} is read-only.\r\n *\r\n * The constructor of this class shouldn't be used directly. To create new `EditableElement` use the\r\n * {@link module:engine/view/downcastwriter~DowncastWriter#createEditableElement `downcastWriter#createEditableElement()`} method.\r\n */\r\nexport default class EditableElement extends ObservableMixin(ContainerElement) {\r\n    /**\r\n     * Creates an editable element.\r\n     *\r\n     * @see module:engine/view/downcastwriter~DowncastWriter#createEditableElement\r\n     * @internal\r\n     * @param document The document instance to which this element belongs.\r\n     * @param name Node name.\r\n     * @param attrs Collection of attributes.\r\n     * @param children A list of nodes to be inserted into created element.\r\n     */\r\n    constructor(document, name, attributes, children) {\r\n        super(document, name, attributes, children);\r\n        this.set('isReadOnly', false);\r\n        this.set('isFocused', false);\r\n        this.bind('isReadOnly').to(document);\r\n        this.bind('isFocused').to(document, 'isFocused', isFocused => isFocused && document.selection.editableElement == this);\r\n        // Update focus state based on selection changes.\r\n        this.listenTo(document.selection, 'change', () => {\r\n            this.isFocused = document.isFocused && document.selection.editableElement == this;\r\n        });\r\n    }\r\n    destroy() {\r\n        this.stopListening();\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nEditableElement.prototype.is = function (type, name) {\r\n    if (!name) {\r\n        return type === 'editableElement' || type === 'view:editableElement' ||\r\n            // From super.is(). This is highly utilised method and cannot call super. See ckeditor/ckeditor5#6529.\r\n            type === 'containerElement' || type === 'view:containerElement' ||\r\n            type === 'element' || type === 'view:element' ||\r\n            type === 'node' || type === 'view:node';\r\n    }\r\n    else {\r\n        return name === this.name && (type === 'editableElement' || type === 'view:editableElement' ||\r\n            // From super.is(). This is highly utilised method and cannot call super. See ckeditor/ckeditor5#6529.\r\n            type === 'containerElement' || type === 'view:containerElement' ||\r\n            type === 'element' || type === 'view:element');\r\n    }\r\n};\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/rooteditableelement\r\n */\r\nimport EditableElement from './editableelement';\r\nconst rootNameSymbol = Symbol('rootName');\r\n/**\r\n * Class representing a single root in the data view. A root can be either {@link ~RootEditableElement#isReadOnly editable or read-only},\r\n * but in both cases it is called \"an editable\". Roots can contain other {@link module:engine/view/editableelement~EditableElement\r\n * editable elements} making them \"nested editables\".\r\n */\r\nexport default class RootEditableElement extends EditableElement {\r\n    /**\r\n     * Creates root editable element.\r\n     *\r\n     * @param document The document instance to which this element belongs.\r\n     * @param name Node name.\r\n     */\r\n    constructor(document, name) {\r\n        super(document, name);\r\n        this.rootName = 'main';\r\n    }\r\n    /**\r\n     * Name of this root inside {@link module:engine/view/document~Document} that is an owner of this root. If no\r\n     * other name is set, `main` name is used.\r\n     *\r\n     * @readonly\r\n     */\r\n    get rootName() {\r\n        return this.getCustomProperty(rootNameSymbol);\r\n    }\r\n    set rootName(rootName) {\r\n        this._setCustomProperty(rootNameSymbol, rootName);\r\n    }\r\n    /**\r\n     * Overrides old element name and sets new one.\r\n     * This is needed because view roots are created before they are attached to the DOM.\r\n     * The name of the root element is temporary at this stage. It has to be changed when the\r\n     * view root element is attached to the DOM element.\r\n     *\r\n     * @internal\r\n     * @param name The new name of element.\r\n     */\r\n    set _name(name) {\r\n        this.name = name;\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nRootEditableElement.prototype.is = function (type, name) {\r\n    if (!name) {\r\n        return type === 'rootElement' || type === 'view:rootElement' ||\r\n            // From super.is(). This is highly utilised method and cannot call super. See ckeditor/ckeditor5#6529.\r\n            type === 'editableElement' || type === 'view:editableElement' ||\r\n            type === 'containerElement' || type === 'view:containerElement' ||\r\n            type === 'element' || type === 'view:element' ||\r\n            type === 'node' || type === 'view:node';\r\n    }\r\n    else {\r\n        return name === this.name && (type === 'rootElement' || type === 'view:rootElement' ||\r\n            // From super.is(). This is highly utilised method and cannot call super. See ckeditor/ckeditor5#6529.\r\n            type === 'editableElement' || type === 'view:editableElement' ||\r\n            type === 'containerElement' || type === 'view:containerElement' ||\r\n            type === 'element' || type === 'view:element');\r\n    }\r\n};\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/treewalker\r\n */\r\nimport Element from './element';\r\nimport Text from './text';\r\nimport TextProxy from './textproxy';\r\nimport Position from './position';\r\nimport { CKEditorError } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Position iterator class. It allows to iterate forward and backward over the document.\r\n */\r\nexport default class TreeWalker {\r\n    /**\r\n     * Creates a range iterator. All parameters are optional, but you have to specify either `boundaries` or `startPosition`.\r\n     *\r\n     * @param options Object with configuration.\r\n     */\r\n    constructor(options = {}) {\r\n        if (!options.boundaries && !options.startPosition) {\r\n            /**\r\n             * Neither boundaries nor starting position have been defined.\r\n             *\r\n             * @error view-tree-walker-no-start-position\r\n             */\r\n            throw new CKEditorError('view-tree-walker-no-start-position', null);\r\n        }\r\n        if (options.direction && options.direction != 'forward' && options.direction != 'backward') {\r\n            /**\r\n             * Only `backward` and `forward` direction allowed.\r\n             *\r\n             * @error view-tree-walker-unknown-direction\r\n             */\r\n            throw new CKEditorError('view-tree-walker-unknown-direction', options.startPosition, { direction: options.direction });\r\n        }\r\n        this.boundaries = options.boundaries || null;\r\n        if (options.startPosition) {\r\n            this._position = Position._createAt(options.startPosition);\r\n        }\r\n        else {\r\n            this._position = Position._createAt(options.boundaries[options.direction == 'backward' ? 'end' : 'start']);\r\n        }\r\n        this.direction = options.direction || 'forward';\r\n        this.singleCharacters = !!options.singleCharacters;\r\n        this.shallow = !!options.shallow;\r\n        this.ignoreElementEnd = !!options.ignoreElementEnd;\r\n        this._boundaryStartParent = this.boundaries ? this.boundaries.start.parent : null;\r\n        this._boundaryEndParent = this.boundaries ? this.boundaries.end.parent : null;\r\n    }\r\n    /**\r\n     * Iterable interface.\r\n     */\r\n    [Symbol.iterator]() {\r\n        return this;\r\n    }\r\n    /**\r\n     * Iterator position. If start position is not defined then position depends on {@link #direction}. If direction is\r\n     * `'forward'` position starts form the beginning, when direction is `'backward'` position starts from the end.\r\n     */\r\n    get position() {\r\n        return this._position;\r\n    }\r\n    /**\r\n     * Moves {@link #position} in the {@link #direction} skipping values as long as the callback function returns `true`.\r\n     *\r\n     * For example:\r\n     *\r\n     * ```ts\r\n     * walker.skip( value => value.type == 'text' ); // <p>{}foo</p> -> <p>foo[]</p>\r\n     * walker.skip( value => true ); // Move the position to the end: <p>{}foo</p> -> <p>foo</p>[]\r\n     * walker.skip( value => false ); // Do not move the position.\r\n     * ```\r\n     *\r\n     * @param skip Callback function. Gets {@link module:engine/view/treewalker~TreeWalkerValue} and should\r\n     * return `true` if the value should be skipped or `false` if not.\r\n     */\r\n    skip(skip) {\r\n        let nextResult;\r\n        let prevPosition;\r\n        do {\r\n            prevPosition = this.position;\r\n            nextResult = this.next();\r\n        } while (!nextResult.done && skip(nextResult.value));\r\n        if (!nextResult.done) {\r\n            this._position = prevPosition;\r\n        }\r\n    }\r\n    /**\r\n     * Gets the next tree walker's value.\r\n     *\r\n     * @returns Object implementing iterator interface, returning\r\n     * information about taken step.\r\n     */\r\n    next() {\r\n        if (this.direction == 'forward') {\r\n            return this._next();\r\n        }\r\n        else {\r\n            return this._previous();\r\n        }\r\n    }\r\n    /**\r\n     * Makes a step forward in view. Moves the {@link #position} to the next position and returns the encountered value.\r\n     */\r\n    _next() {\r\n        let position = this.position.clone();\r\n        const previousPosition = this.position;\r\n        const parent = position.parent;\r\n        // We are at the end of the root.\r\n        if (parent.parent === null && position.offset === parent.childCount) {\r\n            return { done: true, value: undefined };\r\n        }\r\n        // We reached the walker boundary.\r\n        if (parent === this._boundaryEndParent && position.offset == this.boundaries.end.offset) {\r\n            return { done: true, value: undefined };\r\n        }\r\n        // Get node just after current position.\r\n        let node;\r\n        // Text is a specific parent because it contains string instead of child nodes.\r\n        if (parent instanceof Text) {\r\n            if (position.isAtEnd) {\r\n                // Prevent returning \"elementEnd\" for Text node. Skip that value and return the next walker step.\r\n                this._position = Position._createAfter(parent);\r\n                return this._next();\r\n            }\r\n            node = parent.data[position.offset];\r\n        }\r\n        else {\r\n            node = parent.getChild(position.offset);\r\n        }\r\n        if (node instanceof Element) {\r\n            if (!this.shallow) {\r\n                position = new Position(node, 0);\r\n            }\r\n            else {\r\n                // We are past the walker boundaries.\r\n                if (this.boundaries && this.boundaries.end.isBefore(position)) {\r\n                    return { done: true, value: undefined };\r\n                }\r\n                position.offset++;\r\n            }\r\n            this._position = position;\r\n            return this._formatReturnValue('elementStart', node, previousPosition, position, 1);\r\n        }\r\n        if (node instanceof Text) {\r\n            if (this.singleCharacters) {\r\n                position = new Position(node, 0);\r\n                this._position = position;\r\n                return this._next();\r\n            }\r\n            let charactersCount = node.data.length;\r\n            let item;\r\n            // If text stick out of walker range, we need to cut it and wrap in TextProxy.\r\n            if (node == this._boundaryEndParent) {\r\n                charactersCount = this.boundaries.end.offset;\r\n                item = new TextProxy(node, 0, charactersCount);\r\n                position = Position._createAfter(item);\r\n            }\r\n            else {\r\n                item = new TextProxy(node, 0, node.data.length);\r\n                // If not just keep moving forward.\r\n                position.offset++;\r\n            }\r\n            this._position = position;\r\n            return this._formatReturnValue('text', item, previousPosition, position, charactersCount);\r\n        }\r\n        if (typeof node == 'string') {\r\n            let textLength;\r\n            if (this.singleCharacters) {\r\n                textLength = 1;\r\n            }\r\n            else {\r\n                // Check if text stick out of walker range.\r\n                const endOffset = parent === this._boundaryEndParent ? this.boundaries.end.offset : parent.data.length;\r\n                textLength = endOffset - position.offset;\r\n            }\r\n            const textProxy = new TextProxy(parent, position.offset, textLength);\r\n            position.offset += textLength;\r\n            this._position = position;\r\n            return this._formatReturnValue('text', textProxy, previousPosition, position, textLength);\r\n        }\r\n        // `node` is not set, we reached the end of current `parent`.\r\n        position = Position._createAfter(parent);\r\n        this._position = position;\r\n        if (this.ignoreElementEnd) {\r\n            return this._next();\r\n        }\r\n        return this._formatReturnValue('elementEnd', parent, previousPosition, position);\r\n    }\r\n    /**\r\n     * Makes a step backward in view. Moves the {@link #position} to the previous position and returns the encountered value.\r\n     */\r\n    _previous() {\r\n        let position = this.position.clone();\r\n        const previousPosition = this.position;\r\n        const parent = position.parent;\r\n        // We are at the beginning of the root.\r\n        if (parent.parent === null && position.offset === 0) {\r\n            return { done: true, value: undefined };\r\n        }\r\n        // We reached the walker boundary.\r\n        if (parent == this._boundaryStartParent && position.offset == this.boundaries.start.offset) {\r\n            return { done: true, value: undefined };\r\n        }\r\n        // Get node just before current position.\r\n        let node;\r\n        // Text {@link module:engine/view/text~Text} element is a specific parent because contains string instead of child nodes.\r\n        if (parent instanceof Text) {\r\n            if (position.isAtStart) {\r\n                // Prevent returning \"elementStart\" for Text node. Skip that value and return the next walker step.\r\n                this._position = Position._createBefore(parent);\r\n                return this._previous();\r\n            }\r\n            node = parent.data[position.offset - 1];\r\n        }\r\n        else {\r\n            node = parent.getChild(position.offset - 1);\r\n        }\r\n        if (node instanceof Element) {\r\n            if (this.shallow) {\r\n                position.offset--;\r\n                this._position = position;\r\n                return this._formatReturnValue('elementStart', node, previousPosition, position, 1);\r\n            }\r\n            position = new Position(node, node.childCount);\r\n            this._position = position;\r\n            if (this.ignoreElementEnd) {\r\n                return this._previous();\r\n            }\r\n            return this._formatReturnValue('elementEnd', node, previousPosition, position);\r\n        }\r\n        if (node instanceof Text) {\r\n            if (this.singleCharacters) {\r\n                position = new Position(node, node.data.length);\r\n                this._position = position;\r\n                return this._previous();\r\n            }\r\n            let charactersCount = node.data.length;\r\n            let item;\r\n            // If text stick out of walker range, we need to cut it and wrap in TextProxy.\r\n            if (node == this._boundaryStartParent) {\r\n                const offset = this.boundaries.start.offset;\r\n                item = new TextProxy(node, offset, node.data.length - offset);\r\n                charactersCount = item.data.length;\r\n                position = Position._createBefore(item);\r\n            }\r\n            else {\r\n                item = new TextProxy(node, 0, node.data.length);\r\n                // If not just keep moving backward.\r\n                position.offset--;\r\n            }\r\n            this._position = position;\r\n            return this._formatReturnValue('text', item, previousPosition, position, charactersCount);\r\n        }\r\n        if (typeof node == 'string') {\r\n            let textLength;\r\n            if (!this.singleCharacters) {\r\n                // Check if text stick out of walker range.\r\n                const startOffset = parent === this._boundaryStartParent ? this.boundaries.start.offset : 0;\r\n                textLength = position.offset - startOffset;\r\n            }\r\n            else {\r\n                textLength = 1;\r\n            }\r\n            position.offset -= textLength;\r\n            const textProxy = new TextProxy(parent, position.offset, textLength);\r\n            this._position = position;\r\n            return this._formatReturnValue('text', textProxy, previousPosition, position, textLength);\r\n        }\r\n        // `node` is not set, we reached the beginning of current `parent`.\r\n        position = Position._createBefore(parent);\r\n        this._position = position;\r\n        return this._formatReturnValue('elementStart', parent, previousPosition, position, 1);\r\n    }\r\n    /**\r\n     * Format returned data and adjust `previousPosition` and `nextPosition` if reach the bound of the {@link module:engine/view/text~Text}.\r\n     *\r\n     * @param type Type of step.\r\n     * @param item Item between old and new position.\r\n     * @param previousPosition Previous position of iterator.\r\n     * @param nextPosition Next position of iterator.\r\n     * @param length Length of the item.\r\n     */\r\n    _formatReturnValue(type, item, previousPosition, nextPosition, length) {\r\n        // Text is a specific parent, because contains string instead of children.\r\n        // Walker doesn't enter to the Text except situations when walker is iterating over every single character,\r\n        // or the bound starts/ends inside the Text. So when the position is at the beginning or at the end of the Text\r\n        // we move it just before or just after Text.\r\n        if (item instanceof TextProxy) {\r\n            // Position is at the end of Text.\r\n            if (item.offsetInText + item.data.length == item.textNode.data.length) {\r\n                if (this.direction == 'forward' && !(this.boundaries && this.boundaries.end.isEqual(this.position))) {\r\n                    nextPosition = Position._createAfter(item.textNode);\r\n                    // When we change nextPosition of returned value we need also update walker current position.\r\n                    this._position = nextPosition;\r\n                }\r\n                else {\r\n                    previousPosition = Position._createAfter(item.textNode);\r\n                }\r\n            }\r\n            // Position is at the begining ot the text.\r\n            if (item.offsetInText === 0) {\r\n                if (this.direction == 'backward' && !(this.boundaries && this.boundaries.start.isEqual(this.position))) {\r\n                    nextPosition = Position._createBefore(item.textNode);\r\n                    // When we change nextPosition of returned value we need also update walker current position.\r\n                    this._position = nextPosition;\r\n                }\r\n                else {\r\n                    previousPosition = Position._createBefore(item.textNode);\r\n                }\r\n            }\r\n        }\r\n        return {\r\n            done: false,\r\n            value: {\r\n                type,\r\n                item,\r\n                previousPosition,\r\n                nextPosition,\r\n                length\r\n            }\r\n        };\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/position\r\n */\r\nimport TypeCheckable from './typecheckable';\r\nimport { CKEditorError, compareArrays } from '@ckeditor/ckeditor5-utils';\r\nimport EditableElement from './editableelement';\r\n// To check if component is loaded more than once.\r\nimport '@ckeditor/ckeditor5-utils/src/version';\r\nimport { default as TreeWalker } from './treewalker';\r\n/**\r\n * Position in the view tree. Position is represented by its parent node and an offset in this parent.\r\n *\r\n * In order to create a new position instance use the `createPosition*()` factory methods available in:\r\n *\r\n * * {@link module:engine/view/view~View}\r\n * * {@link module:engine/view/downcastwriter~DowncastWriter}\r\n * * {@link module:engine/view/upcastwriter~UpcastWriter}\r\n */\r\nexport default class Position extends TypeCheckable {\r\n    /**\r\n     * Creates a position.\r\n     *\r\n     * @param parent Position parent.\r\n     * @param offset Position offset.\r\n     */\r\n    constructor(parent, offset) {\r\n        super();\r\n        this.parent = parent;\r\n        this.offset = offset;\r\n    }\r\n    /**\r\n     * Node directly after the position. Equals `null` when there is no node after position or position is located\r\n     * inside text node.\r\n     */\r\n    get nodeAfter() {\r\n        if (this.parent.is('$text')) {\r\n            return null;\r\n        }\r\n        return this.parent.getChild(this.offset) || null;\r\n    }\r\n    /**\r\n     * Node directly before the position. Equals `null` when there is no node before position or position is located\r\n     * inside text node.\r\n     */\r\n    get nodeBefore() {\r\n        if (this.parent.is('$text')) {\r\n            return null;\r\n        }\r\n        return this.parent.getChild(this.offset - 1) || null;\r\n    }\r\n    /**\r\n     * Is `true` if position is at the beginning of its {@link module:engine/view/position~Position#parent parent}, `false` otherwise.\r\n     */\r\n    get isAtStart() {\r\n        return this.offset === 0;\r\n    }\r\n    /**\r\n     * Is `true` if position is at the end of its {@link module:engine/view/position~Position#parent parent}, `false` otherwise.\r\n     */\r\n    get isAtEnd() {\r\n        const endOffset = this.parent.is('$text') ? this.parent.data.length : this.parent.childCount;\r\n        return this.offset === endOffset;\r\n    }\r\n    /**\r\n     * Position's root, that is the root of the position's parent element.\r\n     */\r\n    get root() {\r\n        return this.parent.root;\r\n    }\r\n    /**\r\n     * {@link module:engine/view/editableelement~EditableElement EditableElement} instance that contains this position, or `null` if\r\n     * position is not inside an editable element.\r\n     */\r\n    get editableElement() {\r\n        let editable = this.parent;\r\n        while (!(editable instanceof EditableElement)) {\r\n            if (editable.parent) {\r\n                editable = editable.parent;\r\n            }\r\n            else {\r\n                return null;\r\n            }\r\n        }\r\n        return editable;\r\n    }\r\n    /**\r\n     * Returns a new instance of Position with offset incremented by `shift` value.\r\n     *\r\n     * @param shift How position offset should get changed. Accepts negative values.\r\n     * @returns Shifted position.\r\n     */\r\n    getShiftedBy(shift) {\r\n        const shifted = Position._createAt(this);\r\n        const offset = shifted.offset + shift;\r\n        shifted.offset = offset < 0 ? 0 : offset;\r\n        return shifted;\r\n    }\r\n    /**\r\n     * Gets the farthest position which matches the callback using\r\n     * {@link module:engine/view/treewalker~TreeWalker TreeWalker}.\r\n     *\r\n     * For example:\r\n     *\r\n     * ```ts\r\n     * getLastMatchingPosition( value => value.type == 'text' ); // <p>{}foo</p> -> <p>foo[]</p>\r\n     * getLastMatchingPosition( value => value.type == 'text', { direction: 'backward' } ); // <p>foo[]</p> -> <p>{}foo</p>\r\n     * getLastMatchingPosition( value => false ); // Do not move the position.\r\n     * ```\r\n     *\r\n     * @param skip Callback function. Gets {@link module:engine/view/treewalker~TreeWalkerValue} and should\r\n     * return `true` if the value should be skipped or `false` if not.\r\n     * @param options Object with configuration options. See {@link module:engine/view/treewalker~TreeWalker}.\r\n     * @returns The position after the last item which matches the `skip` callback test.\r\n     */\r\n    getLastMatchingPosition(skip, options = {}) {\r\n        options.startPosition = this;\r\n        const treeWalker = new TreeWalker(options);\r\n        treeWalker.skip(skip);\r\n        return treeWalker.position;\r\n    }\r\n    /**\r\n     * Returns ancestors array of this position, that is this position's parent and it's ancestors.\r\n     *\r\n     * @returns Array with ancestors.\r\n     */\r\n    getAncestors() {\r\n        if (this.parent.is('documentFragment')) {\r\n            return [this.parent];\r\n        }\r\n        else {\r\n            return this.parent.getAncestors({ includeSelf: true });\r\n        }\r\n    }\r\n    /**\r\n     * Returns a {@link module:engine/view/node~Node} or {@link module:engine/view/documentfragment~DocumentFragment}\r\n     * which is a common ancestor of both positions.\r\n     */\r\n    getCommonAncestor(position) {\r\n        const ancestorsA = this.getAncestors();\r\n        const ancestorsB = position.getAncestors();\r\n        let i = 0;\r\n        while (ancestorsA[i] == ancestorsB[i] && ancestorsA[i]) {\r\n            i++;\r\n        }\r\n        return i === 0 ? null : ancestorsA[i - 1];\r\n    }\r\n    /**\r\n     * Checks whether this position equals given position.\r\n     *\r\n     * @param otherPosition Position to compare with.\r\n     * @returns True if positions are same.\r\n     */\r\n    isEqual(otherPosition) {\r\n        return (this.parent == otherPosition.parent && this.offset == otherPosition.offset);\r\n    }\r\n    /**\r\n     * Checks whether this position is located before given position. When method returns `false` it does not mean that\r\n     * this position is after give one. Two positions may be located inside separate roots and in that situation this\r\n     * method will still return `false`.\r\n     *\r\n     * @see module:engine/view/position~Position#isAfter\r\n     * @see module:engine/view/position~Position#compareWith\r\n     * @param otherPosition Position to compare with.\r\n     * @returns Returns `true` if this position is before given position.\r\n     */\r\n    isBefore(otherPosition) {\r\n        return this.compareWith(otherPosition) == 'before';\r\n    }\r\n    /**\r\n     * Checks whether this position is located after given position. When method returns `false` it does not mean that\r\n     * this position is before give one. Two positions may be located inside separate roots and in that situation this\r\n     * method will still return `false`.\r\n     *\r\n     * @see module:engine/view/position~Position#isBefore\r\n     * @see module:engine/view/position~Position#compareWith\r\n     * @param otherPosition Position to compare with.\r\n     * @returns Returns `true` if this position is after given position.\r\n     */\r\n    isAfter(otherPosition) {\r\n        return this.compareWith(otherPosition) == 'after';\r\n    }\r\n    /**\r\n     * Checks whether this position is before, after or in same position that other position. Two positions may be also\r\n     * different when they are located in separate roots.\r\n     *\r\n     * @param otherPosition Position to compare with.\r\n     */\r\n    compareWith(otherPosition) {\r\n        if (this.root !== otherPosition.root) {\r\n            return 'different';\r\n        }\r\n        if (this.isEqual(otherPosition)) {\r\n            return 'same';\r\n        }\r\n        // Get path from root to position's parent element.\r\n        const thisPath = this.parent.is('node') ? this.parent.getPath() : [];\r\n        const otherPath = otherPosition.parent.is('node') ? otherPosition.parent.getPath() : [];\r\n        // Add the positions' offsets to the parents offsets.\r\n        thisPath.push(this.offset);\r\n        otherPath.push(otherPosition.offset);\r\n        // Compare both path arrays to find common ancestor.\r\n        const result = compareArrays(thisPath, otherPath);\r\n        switch (result) {\r\n            case 'prefix':\r\n                return 'before';\r\n            case 'extension':\r\n                return 'after';\r\n            default:\r\n                // Cast to number to avoid having 'same' as a type of `result`.\r\n                return thisPath[result] < otherPath[result] ? 'before' : 'after';\r\n        }\r\n    }\r\n    /**\r\n     * Creates a {@link module:engine/view/treewalker~TreeWalker TreeWalker} instance with this positions as a start position.\r\n     *\r\n     * @param options Object with configuration options. See {@link module:engine/view/treewalker~TreeWalker}\r\n     */\r\n    getWalker(options = {}) {\r\n        options.startPosition = this;\r\n        return new TreeWalker(options);\r\n    }\r\n    /**\r\n     * Clones this position.\r\n     */\r\n    clone() {\r\n        return new Position(this.parent, this.offset);\r\n    }\r\n    /**\r\n     * Creates position at the given location. The location can be specified as:\r\n     *\r\n     * * a {@link module:engine/view/position~Position position},\r\n     * * parent element and offset (offset defaults to `0`),\r\n     * * parent element and `'end'` (sets position at the end of that element),\r\n     * * {@link module:engine/view/item~Item view item} and `'before'` or `'after'` (sets position before or after given view item).\r\n     *\r\n     * This method is a shortcut to other constructors such as:\r\n     *\r\n     * * {@link module:engine/view/position~Position._createBefore},\r\n     * * {@link module:engine/view/position~Position._createAfter}.\r\n     *\r\n     * @internal\r\n     * @param offset Offset or one of the flags. Used only when first parameter is a {@link module:engine/view/item~Item view item}.\r\n     */\r\n    static _createAt(itemOrPosition, offset) {\r\n        if (itemOrPosition instanceof Position) {\r\n            return new this(itemOrPosition.parent, itemOrPosition.offset);\r\n        }\r\n        else {\r\n            const node = itemOrPosition;\r\n            if (offset == 'end') {\r\n                offset = node.is('$text') ? node.data.length : node.childCount;\r\n            }\r\n            else if (offset == 'before') {\r\n                return this._createBefore(node);\r\n            }\r\n            else if (offset == 'after') {\r\n                return this._createAfter(node);\r\n            }\r\n            else if (offset !== 0 && !offset) {\r\n                /**\r\n                 * {@link module:engine/view/view~View#createPositionAt `View#createPositionAt()`}\r\n                 * requires the offset to be specified when the first parameter is a view item.\r\n                 *\r\n                 * @error view-createpositionat-offset-required\r\n                 */\r\n                throw new CKEditorError('view-createpositionat-offset-required', node);\r\n            }\r\n            return new Position(node, offset);\r\n        }\r\n    }\r\n    /**\r\n     * Creates a new position after given view item.\r\n     *\r\n     * @internal\r\n     * @param item View item after which the position should be located.\r\n     */\r\n    static _createAfter(item) {\r\n        // TextProxy is not a instance of Node so we need do handle it in specific way.\r\n        if (item.is('$textProxy')) {\r\n            return new Position(item.textNode, item.offsetInText + item.data.length);\r\n        }\r\n        if (!item.parent) {\r\n            /**\r\n             * You can not make a position after a root.\r\n             *\r\n             * @error view-position-after-root\r\n             * @param {module:engine/view/node~Node} root\r\n             */\r\n            throw new CKEditorError('view-position-after-root', item, { root: item });\r\n        }\r\n        return new Position(item.parent, item.index + 1);\r\n    }\r\n    /**\r\n     * Creates a new position before given view item.\r\n     *\r\n     * @internal\r\n     * @param item View item before which the position should be located.\r\n     */\r\n    static _createBefore(item) {\r\n        // TextProxy is not a instance of Node so we need do handle it in specific way.\r\n        if (item.is('$textProxy')) {\r\n            return new Position(item.textNode, item.offsetInText);\r\n        }\r\n        if (!item.parent) {\r\n            /**\r\n             * You cannot make a position before a root.\r\n             *\r\n             * @error view-position-before-root\r\n             * @param {module:engine/view/node~Node} root\r\n             */\r\n            throw new CKEditorError('view-position-before-root', item, { root: item });\r\n        }\r\n        return new Position(item.parent, item.index);\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nPosition.prototype.is = function (type) {\r\n    return type === 'position' || type === 'view:position';\r\n};\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/range\r\n */\r\nimport TypeCheckable from './typecheckable';\r\nimport Position from './position';\r\nimport { default as TreeWalker } from './treewalker';\r\n/**\r\n * Range in the view tree. A range is represented by its start and end {@link module:engine/view/position~Position positions}.\r\n *\r\n * In order to create a new position instance use the `createPosition*()` factory methods available in:\r\n *\r\n * * {@link module:engine/view/view~View}\r\n * * {@link module:engine/view/downcastwriter~DowncastWriter}\r\n * * {@link module:engine/view/upcastwriter~UpcastWriter}\r\n */\r\nexport default class Range extends TypeCheckable {\r\n    /**\r\n     * Creates a range spanning from `start` position to `end` position.\r\n     *\r\n     * **Note:** Constructor creates it's own {@link module:engine/view/position~Position} instances basing on passed values.\r\n     *\r\n     * @param start Start position.\r\n     * @param end End position. If not set, range will be collapsed at the `start` position.\r\n     */\r\n    constructor(start, end = null) {\r\n        super();\r\n        this.start = start.clone();\r\n        this.end = end ? end.clone() : start.clone();\r\n    }\r\n    /**\r\n     * Iterable interface.\r\n     *\r\n     * Iterates over all {@link module:engine/view/item~Item view items} that are in this range and returns\r\n     * them together with additional information like length or {@link module:engine/view/position~Position positions},\r\n     * grouped as {@link module:engine/view/treewalker~TreeWalkerValue}.\r\n     *\r\n     * This iterator uses {@link module:engine/view/treewalker~TreeWalker TreeWalker} with `boundaries` set to this range and\r\n     * `ignoreElementEnd` option\r\n     * set to `true`.\r\n     */\r\n    *[Symbol.iterator]() {\r\n        yield* new TreeWalker({ boundaries: this, ignoreElementEnd: true });\r\n    }\r\n    /**\r\n     * Returns whether the range is collapsed, that is it start and end positions are equal.\r\n     */\r\n    get isCollapsed() {\r\n        return this.start.isEqual(this.end);\r\n    }\r\n    /**\r\n     * Returns whether this range is flat, that is if {@link module:engine/view/range~Range#start start} position and\r\n     * {@link module:engine/view/range~Range#end end} position are in the same {@link module:engine/view/position~Position#parent parent}.\r\n     */\r\n    get isFlat() {\r\n        return this.start.parent === this.end.parent;\r\n    }\r\n    /**\r\n     * Range root element.\r\n     */\r\n    get root() {\r\n        return this.start.root;\r\n    }\r\n    /**\r\n     * Creates a maximal range that has the same content as this range but is expanded in both ways (at the beginning\r\n     * and at the end).\r\n     *\r\n     * For example:\r\n     *\r\n     * ```html\r\n     * <p>Foo</p><p><b>{Bar}</b></p> -> <p>Foo</p>[<p><b>Bar</b>]</p>\r\n     * <p><b>foo</b>{bar}<span></span></p> -> <p><b>foo[</b>bar<span></span>]</p>\r\n     * ```\r\n     *\r\n     * Note that in the sample above:\r\n     *\r\n     * - `<p>` have type of {@link module:engine/view/containerelement~ContainerElement},\r\n     * - `<b>` have type of {@link module:engine/view/attributeelement~AttributeElement},\r\n     * - `<span>` have type of {@link module:engine/view/uielement~UIElement}.\r\n     *\r\n     * @returns Enlarged range.\r\n     */\r\n    getEnlarged() {\r\n        let start = this.start.getLastMatchingPosition(enlargeTrimSkip, { direction: 'backward' });\r\n        let end = this.end.getLastMatchingPosition(enlargeTrimSkip);\r\n        // Fix positions, in case if they are in Text node.\r\n        if (start.parent.is('$text') && start.isAtStart) {\r\n            start = Position._createBefore(start.parent);\r\n        }\r\n        if (end.parent.is('$text') && end.isAtEnd) {\r\n            end = Position._createAfter(end.parent);\r\n        }\r\n        return new Range(start, end);\r\n    }\r\n    /**\r\n     * Creates a minimum range that has the same content as this range but is trimmed in both ways (at the beginning\r\n     * and at the end).\r\n     *\r\n     * For example:\r\n     *\r\n     * ```html\r\n     * <p>Foo</p>[<p><b>Bar</b>]</p> -> <p>Foo</p><p><b>{Bar}</b></p>\r\n     * <p><b>foo[</b>bar<span></span>]</p> -> <p><b>foo</b>{bar}<span></span></p>\r\n     * ```\r\n     *\r\n     * Note that in the sample above:\r\n     *\r\n     * - `<p>` have type of {@link module:engine/view/containerelement~ContainerElement},\r\n     * - `<b>` have type of {@link module:engine/view/attributeelement~AttributeElement},\r\n     * - `<span>` have type of {@link module:engine/view/uielement~UIElement}.\r\n     *\r\n     * @returns Shrunk range.\r\n     */\r\n    getTrimmed() {\r\n        let start = this.start.getLastMatchingPosition(enlargeTrimSkip);\r\n        if (start.isAfter(this.end) || start.isEqual(this.end)) {\r\n            return new Range(start, start);\r\n        }\r\n        let end = this.end.getLastMatchingPosition(enlargeTrimSkip, { direction: 'backward' });\r\n        const nodeAfterStart = start.nodeAfter;\r\n        const nodeBeforeEnd = end.nodeBefore;\r\n        // Because TreeWalker prefers positions next to text node, we need to move them manually into these text nodes.\r\n        if (nodeAfterStart && nodeAfterStart.is('$text')) {\r\n            start = new Position(nodeAfterStart, 0);\r\n        }\r\n        if (nodeBeforeEnd && nodeBeforeEnd.is('$text')) {\r\n            end = new Position(nodeBeforeEnd, nodeBeforeEnd.data.length);\r\n        }\r\n        return new Range(start, end);\r\n    }\r\n    /**\r\n     * Two ranges are equal if their start and end positions are equal.\r\n     *\r\n     * @param otherRange Range to compare with.\r\n     * @returns `true` if ranges are equal, `false` otherwise\r\n     */\r\n    isEqual(otherRange) {\r\n        return this == otherRange || (this.start.isEqual(otherRange.start) && this.end.isEqual(otherRange.end));\r\n    }\r\n    /**\r\n     * Checks whether this range contains given {@link module:engine/view/position~Position position}.\r\n     *\r\n     * @param position Position to check.\r\n     * @returns `true` if given {@link module:engine/view/position~Position position} is contained in this range, `false` otherwise.\r\n     */\r\n    containsPosition(position) {\r\n        return position.isAfter(this.start) && position.isBefore(this.end);\r\n    }\r\n    /**\r\n     * Checks whether this range contains given {@link module:engine/view/range~Range range}.\r\n     *\r\n     * @param otherRange Range to check.\r\n     * @param loose Whether the check is loose or strict. If the check is strict (`false`), compared range cannot\r\n     * start or end at the same position as this range boundaries. If the check is loose (`true`), compared range can start, end or\r\n     * even be equal to this range. Note that collapsed ranges are always compared in strict mode.\r\n     * @returns `true` if given {@link module:engine/view/range~Range range} boundaries are contained by this range, `false`\r\n     * otherwise.\r\n     */\r\n    containsRange(otherRange, loose = false) {\r\n        if (otherRange.isCollapsed) {\r\n            loose = false;\r\n        }\r\n        const containsStart = this.containsPosition(otherRange.start) || (loose && this.start.isEqual(otherRange.start));\r\n        const containsEnd = this.containsPosition(otherRange.end) || (loose && this.end.isEqual(otherRange.end));\r\n        return containsStart && containsEnd;\r\n    }\r\n    /**\r\n     * Computes which part(s) of this {@link module:engine/view/range~Range range} is not a part of given\r\n     * {@link module:engine/view/range~Range range}.\r\n     * Returned array contains zero, one or two {@link module:engine/view/range~Range ranges}.\r\n     *\r\n     * Examples:\r\n     *\r\n     * ```ts\r\n     * let foo = downcastWriter.createText( 'foo' );\r\n     * let img = downcastWriter.createContainerElement( 'img' );\r\n     * let bar = downcastWriter.createText( 'bar' );\r\n     * let p = downcastWriter.createContainerElement( 'p', null, [ foo, img, bar ] );\r\n     *\r\n     * let range = view.createRange( view.createPositionAt( foo, 2 ), view.createPositionAt( bar, 1 ); // \"o\", img, \"b\" are in range.\r\n     * let otherRange = view.createRange( // \"oo\", img, \"ba\" are in range.\r\n     * \tview.createPositionAt( foo, 1 ),\r\n     * \tview.createPositionAt( bar, 2 )\r\n     * );\r\n     * let transformed = range.getDifference( otherRange );\r\n     * // transformed array has no ranges because `otherRange` contains `range`\r\n     *\r\n     * otherRange = view.createRange( view.createPositionAt( foo, 1 ), view.createPositionAt( p, 2 ); // \"oo\", img are in range.\r\n     * transformed = range.getDifference( otherRange );\r\n     * // transformed array has one range: from ( p, 2 ) to ( bar, 1 )\r\n     *\r\n     * otherRange = view.createRange( view.createPositionAt( p, 1 ), view.createPositionAt( p, 2 ) ); // img is in range.\r\n     * transformed = range.getDifference( otherRange );\r\n     * // transformed array has two ranges: from ( foo, 1 ) to ( p, 1 ) and from ( p, 2 ) to ( bar, 1 )\r\n     * ```\r\n     *\r\n     * @param otherRange Range to differentiate against.\r\n     * @returns The difference between ranges.\r\n     */\r\n    getDifference(otherRange) {\r\n        const ranges = [];\r\n        if (this.isIntersecting(otherRange)) {\r\n            // Ranges intersect.\r\n            if (this.containsPosition(otherRange.start)) {\r\n                // Given range start is inside this range. This means that we have to\r\n                // add shrunken range - from the start to the middle of this range.\r\n                ranges.push(new Range(this.start, otherRange.start));\r\n            }\r\n            if (this.containsPosition(otherRange.end)) {\r\n                // Given range end is inside this range. This means that we have to\r\n                // add shrunken range - from the middle of this range to the end.\r\n                ranges.push(new Range(otherRange.end, this.end));\r\n            }\r\n        }\r\n        else {\r\n            // Ranges do not intersect, return the original range.\r\n            ranges.push(this.clone());\r\n        }\r\n        return ranges;\r\n    }\r\n    /**\r\n     * Returns an intersection of this {@link module:engine/view/range~Range range} and given {@link module:engine/view/range~Range range}.\r\n     * Intersection is a common part of both of those ranges. If ranges has no common part, returns `null`.\r\n     *\r\n     * Examples:\r\n     *\r\n     * ```ts\r\n     * let foo = downcastWriter.createText( 'foo' );\r\n     * let img = downcastWriter.createContainerElement( 'img' );\r\n     * let bar = downcastWriter.createText( 'bar' );\r\n     * let p = downcastWriter.createContainerElement( 'p', null, [ foo, img, bar ] );\r\n     *\r\n     * let range = view.createRange( view.createPositionAt( foo, 2 ), view.createPositionAt( bar, 1 ); // \"o\", img, \"b\" are in range.\r\n     * let otherRange = view.createRange( view.createPositionAt( foo, 1 ), view.createPositionAt( p, 2 ); // \"oo\", img are in range.\r\n     * let transformed = range.getIntersection( otherRange ); // range from ( foo, 1 ) to ( p, 2 ).\r\n     *\r\n     * otherRange = view.createRange( view.createPositionAt( bar, 1 ), view.createPositionAt( bar, 3 ); \"ar\" is in range.\r\n     * transformed = range.getIntersection( otherRange ); // null - no common part.\r\n     * ```\r\n     *\r\n     * @param otherRange Range to check for intersection.\r\n     * @returns A common part of given ranges or `null` if ranges have no common part.\r\n     */\r\n    getIntersection(otherRange) {\r\n        if (this.isIntersecting(otherRange)) {\r\n            // Ranges intersect, so a common range will be returned.\r\n            // At most, it will be same as this range.\r\n            let commonRangeStart = this.start;\r\n            let commonRangeEnd = this.end;\r\n            if (this.containsPosition(otherRange.start)) {\r\n                // Given range start is inside this range. This means thaNt we have to\r\n                // shrink common range to the given range start.\r\n                commonRangeStart = otherRange.start;\r\n            }\r\n            if (this.containsPosition(otherRange.end)) {\r\n                // Given range end is inside this range. This means that we have to\r\n                // shrink common range to the given range end.\r\n                commonRangeEnd = otherRange.end;\r\n            }\r\n            return new Range(commonRangeStart, commonRangeEnd);\r\n        }\r\n        // Ranges do not intersect, so they do not have common part.\r\n        return null;\r\n    }\r\n    /**\r\n     * Creates a {@link module:engine/view/treewalker~TreeWalker TreeWalker} instance with this range as a boundary.\r\n     *\r\n     * @param options Object with configuration options. See {@link module:engine/view/treewalker~TreeWalker}.\r\n     */\r\n    getWalker(options = {}) {\r\n        options.boundaries = this;\r\n        return new TreeWalker(options);\r\n    }\r\n    /**\r\n     * Returns a {@link module:engine/view/node~Node} or {@link module:engine/view/documentfragment~DocumentFragment}\r\n     * which is a common ancestor of range's both ends (in which the entire range is contained).\r\n     */\r\n    getCommonAncestor() {\r\n        return this.start.getCommonAncestor(this.end);\r\n    }\r\n    /**\r\n     * Returns an {@link module:engine/view/element~Element Element} contained by the range.\r\n     * The element will be returned when it is the **only** node within the range and **fully–contained**\r\n     * at the same time.\r\n     */\r\n    getContainedElement() {\r\n        if (this.isCollapsed) {\r\n            return null;\r\n        }\r\n        let nodeAfterStart = this.start.nodeAfter;\r\n        let nodeBeforeEnd = this.end.nodeBefore;\r\n        // Handle the situation when the range position is at the beginning / at the end of a text node.\r\n        // In such situation `.nodeAfter` and `.nodeBefore` are `null` but the range still might be spanning\r\n        // over one element.\r\n        //\r\n        // <p>Foo{<span class=\"widget\"></span>}bar</p> vs <p>Foo[<span class=\"widget\"></span>]bar</p>\r\n        //\r\n        // These are basically the same range, only the difference is if the range position is at\r\n        // at the end/at the beginning of a text node or just before/just after the text node.\r\n        //\r\n        if (this.start.parent.is('$text') && this.start.isAtEnd && this.start.parent.nextSibling) {\r\n            nodeAfterStart = this.start.parent.nextSibling;\r\n        }\r\n        if (this.end.parent.is('$text') && this.end.isAtStart && this.end.parent.previousSibling) {\r\n            nodeBeforeEnd = this.end.parent.previousSibling;\r\n        }\r\n        if (nodeAfterStart && nodeAfterStart.is('element') && nodeAfterStart === nodeBeforeEnd) {\r\n            return nodeAfterStart;\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Clones this range.\r\n     */\r\n    clone() {\r\n        return new Range(this.start, this.end);\r\n    }\r\n    /**\r\n     * Returns an iterator that iterates over all {@link module:engine/view/item~Item view items} that are in this range and returns\r\n     * them.\r\n     *\r\n     * This method uses {@link module:engine/view/treewalker~TreeWalker} with `boundaries` set to this range and `ignoreElementEnd` option\r\n     * set to `true`. However it returns only {@link module:engine/view/item~Item items},\r\n     * not {@link module:engine/view/treewalker~TreeWalkerValue}.\r\n     *\r\n     * You may specify additional options for the tree walker. See {@link module:engine/view/treewalker~TreeWalker} for\r\n     * a full list of available options.\r\n     *\r\n     * @param options Object with configuration options. See {@link module:engine/view/treewalker~TreeWalker}.\r\n     */\r\n    *getItems(options = {}) {\r\n        options.boundaries = this;\r\n        options.ignoreElementEnd = true;\r\n        const treeWalker = new TreeWalker(options);\r\n        for (const value of treeWalker) {\r\n            yield value.item;\r\n        }\r\n    }\r\n    /**\r\n     * Returns an iterator that iterates over all {@link module:engine/view/position~Position positions} that are boundaries or\r\n     * contained in this range.\r\n     *\r\n     * This method uses {@link module:engine/view/treewalker~TreeWalker} with `boundaries` set to this range. However it returns only\r\n     * {@link module:engine/view/position~Position positions}, not {@link module:engine/view/treewalker~TreeWalkerValue}.\r\n     *\r\n     * You may specify additional options for the tree walker. See {@link module:engine/view/treewalker~TreeWalker} for\r\n     * a full list of available options.\r\n     *\r\n     * @param options Object with configuration options. See {@link module:engine/view/treewalker~TreeWalker}.\r\n     */\r\n    *getPositions(options = {}) {\r\n        options.boundaries = this;\r\n        const treeWalker = new TreeWalker(options);\r\n        yield treeWalker.position;\r\n        for (const value of treeWalker) {\r\n            yield value.nextPosition;\r\n        }\r\n    }\r\n    /**\r\n     * Checks and returns whether this range intersects with the given range.\r\n     *\r\n     * @param otherRange Range to compare with.\r\n     * @returns True if ranges intersect.\r\n     */\r\n    isIntersecting(otherRange) {\r\n        return this.start.isBefore(otherRange.end) && this.end.isAfter(otherRange.start);\r\n    }\r\n    /**\r\n     * Creates a range from the given parents and offsets.\r\n     *\r\n     * @internal\r\n     * @param startElement Start position parent element.\r\n     * @param startOffset Start position offset.\r\n     * @param endElement End position parent element.\r\n     * @param endOffset End position offset.\r\n     * @returns Created range.\r\n     */\r\n    static _createFromParentsAndOffsets(startElement, startOffset, endElement, endOffset) {\r\n        return new this(new Position(startElement, startOffset), new Position(endElement, endOffset));\r\n    }\r\n    /**\r\n     * Creates a new range, spreading from specified {@link module:engine/view/position~Position position} to a position moved by\r\n     * given `shift`. If `shift` is a negative value, shifted position is treated as the beginning of the range.\r\n     *\r\n     * @internal\r\n     * @param position Beginning of the range.\r\n     * @param shift How long the range should be.\r\n     */\r\n    static _createFromPositionAndShift(position, shift) {\r\n        const start = position;\r\n        const end = position.getShiftedBy(shift);\r\n        return shift > 0 ? new this(start, end) : new this(end, start);\r\n    }\r\n    /**\r\n     * Creates a range inside an {@link module:engine/view/element~Element element} which starts before the first child of\r\n     * that element and ends after the last child of that element.\r\n     *\r\n     * @internal\r\n     * @param element Element which is a parent for the range.\r\n     */\r\n    static _createIn(element) {\r\n        return this._createFromParentsAndOffsets(element, 0, element, element.childCount);\r\n    }\r\n    /**\r\n     * Creates a range that starts before given {@link module:engine/view/item~Item view item} and ends after it.\r\n     *\r\n     * @internal\r\n     */\r\n    static _createOn(item) {\r\n        const size = item.is('$textProxy') ? item.offsetSize : 1;\r\n        return this._createFromPositionAndShift(Position._createBefore(item), size);\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nRange.prototype.is = function (type) {\r\n    return type === 'range' || type === 'view:range';\r\n};\r\n/**\r\n * Function used by getEnlarged and getTrimmed methods.\r\n */\r\nfunction enlargeTrimSkip(value) {\r\n    if (value.item.is('attributeElement') || value.item.is('uiElement')) {\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/selection\r\n */\r\nimport TypeCheckable from './typecheckable';\r\nimport Range from './range';\r\nimport Position from './position';\r\nimport Node from './node';\r\nimport DocumentSelection from './documentselection';\r\nimport { CKEditorError, EmitterMixin, count, isIterable } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Class representing an arbirtary selection in the view.\r\n * See also {@link module:engine/view/documentselection~DocumentSelection}.\r\n *\r\n * New selection instances can be created via the constructor or one these methods:\r\n *\r\n * * {@link module:engine/view/view~View#createSelection `View#createSelection()`},\r\n * * {@link module:engine/view/upcastwriter~UpcastWriter#createSelection `UpcastWriter#createSelection()`}.\r\n *\r\n * A selection can consist of {@link module:engine/view/range~Range ranges} that can be set by using\r\n * the {@link module:engine/view/selection~Selection#setTo `Selection#setTo()`} method.\r\n */\r\nexport default class Selection extends EmitterMixin(TypeCheckable) {\r\n    /**\r\n     * Creates new selection instance.\r\n     *\r\n     * **Note**: The selection constructor is available as a factory method:\r\n     *\r\n     * * {@link module:engine/view/view~View#createSelection `View#createSelection()`},\r\n     * * {@link module:engine/view/upcastwriter~UpcastWriter#createSelection `UpcastWriter#createSelection()`}.\r\n     *\r\n     * ```ts\r\n     * // Creates empty selection without ranges.\r\n     * const selection = writer.createSelection();\r\n     *\r\n     * // Creates selection at the given range.\r\n     * const range = writer.createRange( start, end );\r\n     * const selection = writer.createSelection( range );\r\n     *\r\n     * // Creates selection at the given ranges\r\n     * const ranges = [ writer.createRange( start1, end2 ), writer.createRange( star2, end2 ) ];\r\n     * const selection = writer.createSelection( ranges );\r\n     *\r\n     * // Creates selection from the other selection.\r\n     * const otherSelection = writer.createSelection();\r\n     * const selection = writer.createSelection( otherSelection );\r\n     *\r\n     * // Creates selection from the document selection.\r\n     * const selection = writer.createSelection( editor.editing.view.document.selection );\r\n     *\r\n     * // Creates selection at the given position.\r\n     * const position = writer.createPositionFromPath( root, path );\r\n     * const selection = writer.createSelection( position );\r\n     *\r\n     * // Creates collapsed selection at the position of given item and offset.\r\n     * const paragraph = writer.createContainerElement( 'paragraph' );\r\n     * const selection = writer.createSelection( paragraph, offset );\r\n     *\r\n     * // Creates a range inside an {@link module:engine/view/element~Element element} which starts before the\r\n     * // first child of that element and ends after the last child of that element.\r\n     * const selection = writer.createSelection( paragraph, 'in' );\r\n     *\r\n     * // Creates a range on an {@link module:engine/view/item~Item item} which starts before the item and ends\r\n     * // just after the item.\r\n     * const selection = writer.createSelection( paragraph, 'on' );\r\n     * ```\r\n     *\r\n     * `Selection`'s constructor allow passing additional options (`backward`, `fake` and `label`) as the last argument.\r\n     *\r\n     * ```ts\r\n     * // Creates backward selection.\r\n     * const selection = writer.createSelection( range, { backward: true } );\r\n     * ```\r\n     *\r\n     * Fake selection does not render as browser native selection over selected elements and is hidden to the user.\r\n     * This way, no native selection UI artifacts are displayed to the user and selection over elements can be\r\n     * represented in other way, for example by applying proper CSS class.\r\n     *\r\n     * Additionally fake's selection label can be provided. It will be used to describe fake selection in DOM\r\n     * (and be  properly handled by screen readers).\r\n     *\r\n     * ```ts\r\n     * // Creates fake selection with label.\r\n     * const selection = writer.createSelection( range, { fake: true, label: 'foo' } );\r\n     * ```\r\n     *\r\n     * @internal\r\n     */\r\n    constructor(...args) {\r\n        super();\r\n        this._ranges = [];\r\n        this._lastRangeBackward = false;\r\n        this._isFake = false;\r\n        this._fakeSelectionLabel = '';\r\n        if (args.length) {\r\n            this.setTo(...args);\r\n        }\r\n    }\r\n    /**\r\n     * Returns true if selection instance is marked as `fake`.\r\n     *\r\n     * @see #setTo\r\n     */\r\n    get isFake() {\r\n        return this._isFake;\r\n    }\r\n    /**\r\n     * Returns fake selection label.\r\n     *\r\n     * @see #setTo\r\n     */\r\n    get fakeSelectionLabel() {\r\n        return this._fakeSelectionLabel;\r\n    }\r\n    /**\r\n     * Selection anchor. Anchor may be described as a position where the selection starts. Together with\r\n     * {@link #focus focus} they define the direction of selection, which is important\r\n     * when expanding/shrinking selection. Anchor is always the start or end of the most recent added range.\r\n     * It may be a bit unintuitive when there are multiple ranges in selection.\r\n     *\r\n     * @see #focus\r\n     */\r\n    get anchor() {\r\n        if (!this._ranges.length) {\r\n            return null;\r\n        }\r\n        const range = this._ranges[this._ranges.length - 1];\r\n        const anchor = this._lastRangeBackward ? range.end : range.start;\r\n        return anchor.clone();\r\n    }\r\n    /**\r\n     * Selection focus. Focus is a position where the selection ends.\r\n     *\r\n     * @see #anchor\r\n     */\r\n    get focus() {\r\n        if (!this._ranges.length) {\r\n            return null;\r\n        }\r\n        const range = this._ranges[this._ranges.length - 1];\r\n        const focus = this._lastRangeBackward ? range.start : range.end;\r\n        return focus.clone();\r\n    }\r\n    /**\r\n     * Returns whether the selection is collapsed. Selection is collapsed when there is exactly one range which is\r\n     * collapsed.\r\n     */\r\n    get isCollapsed() {\r\n        return this.rangeCount === 1 && this._ranges[0].isCollapsed;\r\n    }\r\n    /**\r\n     * Returns number of ranges in selection.\r\n     */\r\n    get rangeCount() {\r\n        return this._ranges.length;\r\n    }\r\n    /**\r\n     * Specifies whether the {@link #focus} precedes {@link #anchor}.\r\n     */\r\n    get isBackward() {\r\n        return !this.isCollapsed && this._lastRangeBackward;\r\n    }\r\n    /**\r\n     * {@link module:engine/view/editableelement~EditableElement EditableElement} instance that contains this selection, or `null`\r\n     * if the selection is not inside an editable element.\r\n     */\r\n    get editableElement() {\r\n        if (this.anchor) {\r\n            return this.anchor.editableElement;\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Returns an iterable that contains copies of all ranges added to the selection.\r\n     */\r\n    *getRanges() {\r\n        for (const range of this._ranges) {\r\n            yield range.clone();\r\n        }\r\n    }\r\n    /**\r\n     * Returns copy of the first range in the selection. First range is the one which\r\n     * {@link module:engine/view/range~Range#start start} position {@link module:engine/view/position~Position#isBefore is before} start\r\n     * position of all other ranges (not to confuse with the first range added to the selection).\r\n     * Returns `null` if no ranges are added to selection.\r\n     */\r\n    getFirstRange() {\r\n        let first = null;\r\n        for (const range of this._ranges) {\r\n            if (!first || range.start.isBefore(first.start)) {\r\n                first = range;\r\n            }\r\n        }\r\n        return first ? first.clone() : null;\r\n    }\r\n    /**\r\n     * Returns copy of the last range in the selection. Last range is the one which {@link module:engine/view/range~Range#end end}\r\n     * position {@link module:engine/view/position~Position#isAfter is after} end position of all other ranges (not to confuse\r\n     * with the last range added to the selection). Returns `null` if no ranges are added to selection.\r\n     */\r\n    getLastRange() {\r\n        let last = null;\r\n        for (const range of this._ranges) {\r\n            if (!last || range.end.isAfter(last.end)) {\r\n                last = range;\r\n            }\r\n        }\r\n        return last ? last.clone() : null;\r\n    }\r\n    /**\r\n     * Returns copy of the first position in the selection. First position is the position that\r\n     * {@link module:engine/view/position~Position#isBefore is before} any other position in the selection ranges.\r\n     * Returns `null` if no ranges are added to selection.\r\n     */\r\n    getFirstPosition() {\r\n        const firstRange = this.getFirstRange();\r\n        return firstRange ? firstRange.start.clone() : null;\r\n    }\r\n    /**\r\n     * Returns copy of the last position in the selection. Last position is the position that\r\n     * {@link module:engine/view/position~Position#isAfter is after} any other position in the selection ranges.\r\n     * Returns `null` if no ranges are added to selection.\r\n     */\r\n    getLastPosition() {\r\n        const lastRange = this.getLastRange();\r\n        return lastRange ? lastRange.end.clone() : null;\r\n    }\r\n    /**\r\n     * Checks whether, this selection is equal to given selection. Selections are equal if they have same directions,\r\n     * same number of ranges and all ranges from one selection equal to a range from other selection.\r\n     *\r\n     * @param otherSelection Selection to compare with.\r\n     * @returns `true` if selections are equal, `false` otherwise.\r\n     */\r\n    isEqual(otherSelection) {\r\n        if (this.isFake != otherSelection.isFake) {\r\n            return false;\r\n        }\r\n        if (this.isFake && this.fakeSelectionLabel != otherSelection.fakeSelectionLabel) {\r\n            return false;\r\n        }\r\n        if (this.rangeCount != otherSelection.rangeCount) {\r\n            return false;\r\n        }\r\n        else if (this.rangeCount === 0) {\r\n            return true;\r\n        }\r\n        if (!this.anchor.isEqual(otherSelection.anchor) || !this.focus.isEqual(otherSelection.focus)) {\r\n            return false;\r\n        }\r\n        for (const thisRange of this._ranges) {\r\n            let found = false;\r\n            for (const otherRange of otherSelection._ranges) {\r\n                if (thisRange.isEqual(otherRange)) {\r\n                    found = true;\r\n                    break;\r\n                }\r\n            }\r\n            if (!found) {\r\n                return false;\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n    /**\r\n     * Checks whether this selection is similar to given selection. Selections are similar if they have same directions, same\r\n     * number of ranges, and all {@link module:engine/view/range~Range#getTrimmed trimmed} ranges from one selection are\r\n     * equal to any trimmed range from other selection.\r\n     *\r\n     * @param otherSelection Selection to compare with.\r\n     * @returns `true` if selections are similar, `false` otherwise.\r\n     */\r\n    isSimilar(otherSelection) {\r\n        if (this.isBackward != otherSelection.isBackward) {\r\n            return false;\r\n        }\r\n        const numOfRangesA = count(this.getRanges());\r\n        const numOfRangesB = count(otherSelection.getRanges());\r\n        // If selections have different number of ranges, they cannot be similar.\r\n        if (numOfRangesA != numOfRangesB) {\r\n            return false;\r\n        }\r\n        // If both selections have no ranges, they are similar.\r\n        if (numOfRangesA == 0) {\r\n            return true;\r\n        }\r\n        // Check if each range in one selection has a similar range in other selection.\r\n        for (let rangeA of this.getRanges()) {\r\n            rangeA = rangeA.getTrimmed();\r\n            let found = false;\r\n            for (let rangeB of otherSelection.getRanges()) {\r\n                rangeB = rangeB.getTrimmed();\r\n                if (rangeA.start.isEqual(rangeB.start) && rangeA.end.isEqual(rangeB.end)) {\r\n                    found = true;\r\n                    break;\r\n                }\r\n            }\r\n            // For `rangeA`, neither range in `otherSelection` was similar. So selections are not similar.\r\n            if (!found) {\r\n                return false;\r\n            }\r\n        }\r\n        // There were no ranges that weren't matched. Selections are similar.\r\n        return true;\r\n    }\r\n    /**\r\n     * Returns the selected element. {@link module:engine/view/element~Element Element} is considered as selected if there is only\r\n     * one range in the selection, and that range contains exactly one element.\r\n     * Returns `null` if there is no selected element.\r\n     */\r\n    getSelectedElement() {\r\n        if (this.rangeCount !== 1) {\r\n            return null;\r\n        }\r\n        return this.getFirstRange().getContainedElement();\r\n    }\r\n    /**\r\n     * Sets this selection's ranges and direction to the specified location based on the given\r\n     * {@link module:engine/view/selection~Selectable selectable}.\r\n     *\r\n     * ```ts\r\n     * // Sets selection to the given range.\r\n     * const range = writer.createRange( start, end );\r\n     * selection.setTo( range );\r\n     *\r\n     * // Sets selection to given ranges.\r\n     * const ranges = [ writer.createRange( start1, end2 ), writer.createRange( star2, end2 ) ];\r\n     * selection.setTo( range );\r\n     *\r\n     * // Sets selection to the other selection.\r\n     * const otherSelection = writer.createSelection();\r\n     * selection.setTo( otherSelection );\r\n     *\r\n     * // Sets selection to contents of DocumentSelection.\r\n     * selection.setTo( editor.editing.view.document.selection );\r\n     *\r\n     * // Sets collapsed selection at the given position.\r\n     * const position = writer.createPositionAt( root, path );\r\n     * selection.setTo( position );\r\n     *\r\n     * // Sets collapsed selection at the position of given item and offset.\r\n     * selection.setTo( paragraph, offset );\r\n     * ```\r\n     *\r\n     * Creates a range inside an {@link module:engine/view/element~Element element} which starts before the first child of\r\n     * that element and ends after the last child of that element.\r\n     *\r\n     * ```ts\r\n     * selection.setTo( paragraph, 'in' );\r\n     * ```\r\n     *\r\n     * Creates a range on an {@link module:engine/view/item~Item item} which starts before the item and ends just after the item.\r\n     *\r\n     * ```ts\r\n     * selection.setTo( paragraph, 'on' );\r\n     *\r\n     * // Clears selection. Removes all ranges.\r\n     * selection.setTo( null );\r\n     * ```\r\n     *\r\n     * `Selection#setTo()` method allow passing additional options (`backward`, `fake` and `label`) as the last argument.\r\n     *\r\n     * ```ts\r\n     * // Sets selection as backward.\r\n     * selection.setTo( range, { backward: true } );\r\n     * ```\r\n     *\r\n     * Fake selection does not render as browser native selection over selected elements and is hidden to the user.\r\n     * This way, no native selection UI artifacts are displayed to the user and selection over elements can be\r\n     * represented in other way, for example by applying proper CSS class.\r\n     *\r\n     * Additionally fake's selection label can be provided. It will be used to describe fake selection in DOM\r\n     * (and be  properly handled by screen readers).\r\n     *\r\n     * ```ts\r\n     * // Creates fake selection with label.\r\n     * selection.setTo( range, { fake: true, label: 'foo' } );\r\n     * ```\r\n     *\r\n     * @fires change\r\n     */\r\n    setTo(...args) {\r\n        let [selectable, placeOrOffset, options] = args;\r\n        if (typeof placeOrOffset == 'object') {\r\n            options = placeOrOffset;\r\n            placeOrOffset = undefined;\r\n        }\r\n        if (selectable === null) {\r\n            this._setRanges([]);\r\n            this._setFakeOptions(options);\r\n        }\r\n        else if (selectable instanceof Selection || selectable instanceof DocumentSelection) {\r\n            this._setRanges(selectable.getRanges(), selectable.isBackward);\r\n            this._setFakeOptions({ fake: selectable.isFake, label: selectable.fakeSelectionLabel });\r\n        }\r\n        else if (selectable instanceof Range) {\r\n            this._setRanges([selectable], options && options.backward);\r\n            this._setFakeOptions(options);\r\n        }\r\n        else if (selectable instanceof Position) {\r\n            this._setRanges([new Range(selectable)]);\r\n            this._setFakeOptions(options);\r\n        }\r\n        else if (selectable instanceof Node) {\r\n            const backward = !!options && !!options.backward;\r\n            let range;\r\n            if (placeOrOffset === undefined) {\r\n                /**\r\n                 * selection.setTo requires the second parameter when the first parameter is a node.\r\n                 *\r\n                 * @error view-selection-setto-required-second-parameter\r\n                 */\r\n                throw new CKEditorError('view-selection-setto-required-second-parameter', this);\r\n            }\r\n            else if (placeOrOffset == 'in') {\r\n                range = Range._createIn(selectable);\r\n            }\r\n            else if (placeOrOffset == 'on') {\r\n                range = Range._createOn(selectable);\r\n            }\r\n            else {\r\n                range = new Range(Position._createAt(selectable, placeOrOffset));\r\n            }\r\n            this._setRanges([range], backward);\r\n            this._setFakeOptions(options);\r\n        }\r\n        else if (isIterable(selectable)) {\r\n            // We assume that the selectable is an iterable of ranges.\r\n            // Array.from() is used to prevent setting ranges to the old iterable\r\n            this._setRanges(selectable, options && options.backward);\r\n            this._setFakeOptions(options);\r\n        }\r\n        else {\r\n            /**\r\n             * Cannot set selection to given place.\r\n             *\r\n             * @error view-selection-setto-not-selectable\r\n             */\r\n            throw new CKEditorError('view-selection-setto-not-selectable', this);\r\n        }\r\n        this.fire('change');\r\n    }\r\n    /**\r\n     * Moves {@link #focus} to the specified location.\r\n     *\r\n     * The location can be specified in the same form as {@link module:engine/view/view~View#createPositionAt view.createPositionAt()}\r\n     * parameters.\r\n     *\r\n     * @fires change\r\n     * @param offset Offset or one of the flags. Used only when first parameter is a {@link module:engine/view/item~Item view item}.\r\n     */\r\n    setFocus(itemOrPosition, offset) {\r\n        if (this.anchor === null) {\r\n            /**\r\n             * Cannot set selection focus if there are no ranges in selection.\r\n             *\r\n             * @error view-selection-setfocus-no-ranges\r\n             */\r\n            throw new CKEditorError('view-selection-setfocus-no-ranges', this);\r\n        }\r\n        const newFocus = Position._createAt(itemOrPosition, offset);\r\n        if (newFocus.compareWith(this.focus) == 'same') {\r\n            return;\r\n        }\r\n        const anchor = this.anchor;\r\n        this._ranges.pop();\r\n        if (newFocus.compareWith(anchor) == 'before') {\r\n            this._addRange(new Range(newFocus, anchor), true);\r\n        }\r\n        else {\r\n            this._addRange(new Range(anchor, newFocus));\r\n        }\r\n        this.fire('change');\r\n    }\r\n    /**\r\n     * Replaces all ranges that were added to the selection with given array of ranges. Last range of the array\r\n     * is treated like the last added range and is used to set {@link #anchor anchor} and {@link #focus focus}.\r\n     * Accepts a flag describing in which way the selection is made.\r\n     *\r\n     * @param newRanges Iterable object of ranges to set.\r\n     * @param isLastBackward Flag describing if last added range was selected forward - from start to end\r\n     * (`false`) or backward - from end to start (`true`). Defaults to `false`.\r\n     */\r\n    _setRanges(newRanges, isLastBackward = false) {\r\n        // New ranges should be copied to prevent removing them by setting them to `[]` first.\r\n        // Only applies to situations when selection is set to the same selection or same selection's ranges.\r\n        newRanges = Array.from(newRanges);\r\n        this._ranges = [];\r\n        for (const range of newRanges) {\r\n            this._addRange(range);\r\n        }\r\n        this._lastRangeBackward = !!isLastBackward;\r\n    }\r\n    /**\r\n     * Sets this selection instance to be marked as `fake`. A fake selection does not render as browser native selection\r\n     * over selected elements and is hidden to the user. This way, no native selection UI artifacts are displayed to\r\n     * the user and selection over elements can be represented in other way, for example by applying proper CSS class.\r\n     *\r\n     * Additionally fake's selection label can be provided. It will be used to describe fake selection in DOM (and be\r\n     * properly handled by screen readers).\r\n     */\r\n    _setFakeOptions(options = {}) {\r\n        this._isFake = !!options.fake;\r\n        this._fakeSelectionLabel = options.fake ? options.label || '' : '';\r\n    }\r\n    /**\r\n     * Adds a range to the selection. Added range is copied. This means that passed range is not saved in the\r\n     * selection instance and you can safely operate on it.\r\n     *\r\n     * Accepts a flag describing in which way the selection is made - passed range might be selected from\r\n     * {@link module:engine/view/range~Range#start start} to {@link module:engine/view/range~Range#end end}\r\n     * or from {@link module:engine/view/range~Range#end end} to {@link module:engine/view/range~Range#start start}.\r\n     * The flag is used to set {@link #anchor anchor} and {@link #focus focus} properties.\r\n     *\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-selection-range-intersects` if added range intersects\r\n     * with ranges already stored in Selection instance.\r\n     */\r\n    _addRange(range, isBackward = false) {\r\n        if (!(range instanceof Range)) {\r\n            /**\r\n             * Selection range set to an object that is not an instance of {@link module:engine/view/range~Range}.\r\n             *\r\n             * @error view-selection-add-range-not-range\r\n             */\r\n            throw new CKEditorError('view-selection-add-range-not-range', this);\r\n        }\r\n        this._pushRange(range);\r\n        this._lastRangeBackward = !!isBackward;\r\n    }\r\n    /**\r\n     * Adds range to selection - creates copy of given range so it can be safely used and modified.\r\n     *\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-selection-range-intersects` if added range intersects\r\n     * with ranges already stored in selection instance.\r\n     */\r\n    _pushRange(range) {\r\n        for (const storedRange of this._ranges) {\r\n            if (range.isIntersecting(storedRange)) {\r\n                /**\r\n                 * Trying to add a range that intersects with another range from selection.\r\n                 *\r\n                 * @error view-selection-range-intersects\r\n                 * @param {module:engine/view/range~Range} addedRange Range that was added to the selection.\r\n                 * @param {module:engine/view/range~Range} intersectingRange Range from selection that intersects with `addedRange`.\r\n                 */\r\n                throw new CKEditorError('view-selection-range-intersects', this, { addedRange: range, intersectingRange: storedRange });\r\n            }\r\n        }\r\n        this._ranges.push(new Range(range.start, range.end));\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nSelection.prototype.is = function (type) {\r\n    return type === 'selection' || type === 'view:selection';\r\n};\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/documentselection\r\n */\r\nimport TypeCheckable from './typecheckable';\r\nimport Selection from './selection';\r\nimport { EmitterMixin } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Class representing the document selection in the view.\r\n *\r\n * Its instance is available in {@link module:engine/view/document~Document#selection `Document#selection`}.\r\n *\r\n * It is similar to {@link module:engine/view/selection~Selection} but\r\n * it has a read-only API and can be modified only by the writer available in\r\n * the {@link module:engine/view/view~View#change `View#change()`} block\r\n * (so via {@link module:engine/view/downcastwriter~DowncastWriter#setSelection `DowncastWriter#setSelection()`}).\r\n */\r\nexport default class DocumentSelection extends EmitterMixin(TypeCheckable) {\r\n    constructor(...args) {\r\n        super();\r\n        this._selection = new Selection();\r\n        // Delegate change event to be fired on DocumentSelection instance.\r\n        this._selection.delegate('change').to(this);\r\n        // Set selection data.\r\n        if (args.length) {\r\n            this._selection.setTo(...args);\r\n        }\r\n    }\r\n    /**\r\n     * Returns true if selection instance is marked as `fake`.\r\n     *\r\n     * @see #_setTo\r\n     */\r\n    get isFake() {\r\n        return this._selection.isFake;\r\n    }\r\n    /**\r\n     * Returns fake selection label.\r\n     *\r\n     * @see #_setTo\r\n     */\r\n    get fakeSelectionLabel() {\r\n        return this._selection.fakeSelectionLabel;\r\n    }\r\n    /**\r\n     * Selection anchor. Anchor may be described as a position where the selection starts. Together with\r\n     * {@link #focus focus} they define the direction of selection, which is important\r\n     * when expanding/shrinking selection. Anchor is always the start or end of the most recent added range.\r\n     * It may be a bit unintuitive when there are multiple ranges in selection.\r\n     *\r\n     * @see #focus\r\n     */\r\n    get anchor() {\r\n        return this._selection.anchor;\r\n    }\r\n    /**\r\n     * Selection focus. Focus is a position where the selection ends.\r\n     *\r\n     * @see #anchor\r\n     */\r\n    get focus() {\r\n        return this._selection.focus;\r\n    }\r\n    /**\r\n     * Returns whether the selection is collapsed. Selection is collapsed when there is exactly one range which is\r\n     * collapsed.\r\n     */\r\n    get isCollapsed() {\r\n        return this._selection.isCollapsed;\r\n    }\r\n    /**\r\n     * Returns number of ranges in selection.\r\n     */\r\n    get rangeCount() {\r\n        return this._selection.rangeCount;\r\n    }\r\n    /**\r\n     * Specifies whether the {@link #focus} precedes {@link #anchor}.\r\n     */\r\n    get isBackward() {\r\n        return this._selection.isBackward;\r\n    }\r\n    /**\r\n     * {@link module:engine/view/editableelement~EditableElement EditableElement} instance that contains this selection, or `null`\r\n     * if the selection is not inside an editable element.\r\n     */\r\n    get editableElement() {\r\n        return this._selection.editableElement;\r\n    }\r\n    /**\r\n     * Used for the compatibility with the {@link module:engine/view/selection~Selection#isEqual} method.\r\n     *\r\n     * @internal\r\n     */\r\n    get _ranges() {\r\n        return this._selection._ranges;\r\n    }\r\n    /**\r\n     * Returns an iterable that contains copies of all ranges added to the selection.\r\n     */\r\n    *getRanges() {\r\n        yield* this._selection.getRanges();\r\n    }\r\n    /**\r\n     * Returns copy of the first range in the selection. First range is the one which\r\n     * {@link module:engine/view/range~Range#start start} position {@link module:engine/view/position~Position#isBefore is before} start\r\n     * position of all other ranges (not to confuse with the first range added to the selection).\r\n     * Returns `null` if no ranges are added to selection.\r\n     */\r\n    getFirstRange() {\r\n        return this._selection.getFirstRange();\r\n    }\r\n    /**\r\n     * Returns copy of the last range in the selection. Last range is the one which {@link module:engine/view/range~Range#end end}\r\n     * position {@link module:engine/view/position~Position#isAfter is after} end position of all other ranges (not to confuse\r\n     * with the last range added to the selection). Returns `null` if no ranges are added to selection.\r\n     */\r\n    getLastRange() {\r\n        return this._selection.getLastRange();\r\n    }\r\n    /**\r\n     * Returns copy of the first position in the selection. First position is the position that\r\n     * {@link module:engine/view/position~Position#isBefore is before} any other position in the selection ranges.\r\n     * Returns `null` if no ranges are added to selection.\r\n     */\r\n    getFirstPosition() {\r\n        return this._selection.getFirstPosition();\r\n    }\r\n    /**\r\n     * Returns copy of the last position in the selection. Last position is the position that\r\n     * {@link module:engine/view/position~Position#isAfter is after} any other position in the selection ranges.\r\n     * Returns `null` if no ranges are added to selection.\r\n     */\r\n    getLastPosition() {\r\n        return this._selection.getLastPosition();\r\n    }\r\n    /**\r\n     * Returns the selected element. {@link module:engine/view/element~Element Element} is considered as selected if there is only\r\n     * one range in the selection, and that range contains exactly one element.\r\n     * Returns `null` if there is no selected element.\r\n     */\r\n    getSelectedElement() {\r\n        return this._selection.getSelectedElement();\r\n    }\r\n    /**\r\n     * Checks whether, this selection is equal to given selection. Selections are equal if they have same directions,\r\n     * same number of ranges and all ranges from one selection equal to a range from other selection.\r\n     *\r\n     * @param otherSelection Selection to compare with.\r\n     * @returns `true` if selections are equal, `false` otherwise.\r\n     */\r\n    isEqual(otherSelection) {\r\n        return this._selection.isEqual(otherSelection);\r\n    }\r\n    /**\r\n     * Checks whether this selection is similar to given selection. Selections are similar if they have same directions, same\r\n     * number of ranges, and all {@link module:engine/view/range~Range#getTrimmed trimmed} ranges from one selection are\r\n     * equal to any trimmed range from other selection.\r\n     *\r\n     * @param otherSelection Selection to compare with.\r\n     * @returns `true` if selections are similar, `false` otherwise.\r\n     */\r\n    isSimilar(otherSelection) {\r\n        return this._selection.isSimilar(otherSelection);\r\n    }\r\n    /**\r\n     * Sets this selection's ranges and direction to the specified location based on the given\r\n     * {@link module:engine/view/selection~Selectable selectable}.\r\n     *\r\n     * ```ts\r\n     * // Sets selection to the given range.\r\n     * const range = writer.createRange( start, end );\r\n     * documentSelection._setTo( range );\r\n     *\r\n     * // Sets selection to given ranges.\r\n     * const ranges = [ writer.createRange( start1, end2 ), writer.createRange( start2, end2 ) ];\r\n     * documentSelection._setTo( range );\r\n     *\r\n     * // Sets selection to the other selection.\r\n     * const otherSelection = writer.createSelection();\r\n     * documentSelection._setTo( otherSelection );\r\n     *\r\n     * // Sets collapsed selection at the given position.\r\n     * const position = writer.createPositionAt( root, offset );\r\n     * documentSelection._setTo( position );\r\n     *\r\n     * // Sets collapsed selection at the position of given item and offset.\r\n     * documentSelection._setTo( paragraph, offset );\r\n     * ```\r\n     *\r\n     * Creates a range inside an {@link module:engine/view/element~Element element} which starts before the first child of\r\n     * that element and ends after the last child of that element.\r\n     *\r\n     * ```ts\r\n     * documentSelection._setTo( paragraph, 'in' );\r\n     * ```\r\n     *\r\n     * Creates a range on an {@link module:engine/view/item~Item item} which starts before the item and ends just after the item.\r\n     *\r\n     * ```ts\r\n     * documentSelection._setTo( paragraph, 'on' );\r\n     *\r\n     * // Clears selection. Removes all ranges.\r\n     * documentSelection._setTo( null );\r\n     * ```\r\n     *\r\n     * `Selection#_setTo()` method allow passing additional options (`backward`, `fake` and `label`) as the last argument.\r\n     *\r\n     * ```ts\r\n     * // Sets selection as backward.\r\n     * documentSelection._setTo( range, { backward: true } );\r\n     * ```\r\n     *\r\n     * Fake selection does not render as browser native selection over selected elements and is hidden to the user.\r\n     * This way, no native selection UI artifacts are displayed to the user and selection over elements can be\r\n     * represented in other way, for example by applying proper CSS class.\r\n     *\r\n     * Additionally fake's selection label can be provided. It will be used to des cribe fake selection in DOM\r\n     * (and be  properly handled by screen readers).\r\n     *\r\n     * ```ts\r\n     * // Creates fake selection with label.\r\n     * documentSelection._setTo( range, { fake: true, label: 'foo' } );\r\n     * ```\r\n     *\r\n     * @internal\r\n     * @fires change\r\n     */\r\n    _setTo(...args) {\r\n        this._selection.setTo(...args);\r\n    }\r\n    /**\r\n     * Moves {@link #focus} to the specified location.\r\n     *\r\n     * The location can be specified in the same form as {@link module:engine/view/view~View#createPositionAt view.createPositionAt()}\r\n     * parameters.\r\n     *\r\n     * @internal\r\n     * @fires change\r\n     * @param offset Offset or one of the flags. Used only when first parameter is a {@link module:engine/view/item~Item view item}.\r\n     */\r\n    _setFocus(itemOrPosition, offset) {\r\n        this._selection.setFocus(itemOrPosition, offset);\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nDocumentSelection.prototype.is = function (type) {\r\n    return type === 'selection' ||\r\n        type == 'documentSelection' ||\r\n        type == 'view:selection' ||\r\n        type == 'view:documentSelection';\r\n};\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/observer/bubblingeventinfo\r\n */\r\nimport { EventInfo } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * The event object passed to bubbling event callbacks. It is used to provide information about the event as well as a tool to\r\n * manipulate it.\r\n */\r\nexport default class BubblingEventInfo extends EventInfo {\r\n    /**\r\n     * @param source The emitter.\r\n     * @param name The event name.\r\n     * @param startRange The view range that the bubbling should start from.\r\n     */\r\n    constructor(source, name, startRange) {\r\n        super(source, name);\r\n        this.startRange = startRange;\r\n        this._eventPhase = 'none';\r\n        this._currentTarget = null;\r\n    }\r\n    /**\r\n     * The current event phase.\r\n     */\r\n    get eventPhase() {\r\n        return this._eventPhase;\r\n    }\r\n    /**\r\n     * The current bubbling target.\r\n     */\r\n    get currentTarget() {\r\n        return this._currentTarget;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/observer/bubblingemittermixin\r\n */\r\nimport { CKEditorError, EmitterMixin, EventInfo, toArray } from '@ckeditor/ckeditor5-utils';\r\nimport BubblingEventInfo from './bubblingeventinfo';\r\nconst contextsSymbol = Symbol('bubbling contexts');\r\n/**\r\n * Bubbling emitter mixin for the view document as described in the {@link ~BubblingEmitter} interface.\r\n *\r\n * This function creates a class that inherits from the provided `base` and implements `Emitter` interface.\r\n * The base class must implement {@link module:utils/emittermixin~Emitter} interface.\r\n *\r\n * ```ts\r\n * class BaseClass extends EmitterMixin() {\r\n * \t// ...\r\n * }\r\n *\r\n * class MyClass extends BubblingEmitterMixin( BaseClass ) {\r\n * \t// This class derives from `BaseClass` and implements the `BubblingEmitter` interface.\r\n * }\r\n * ```\r\n */\r\nexport default function BubblingEmitterMixin(base) {\r\n    class Mixin extends base {\r\n        fire(eventOrInfo, ...eventArgs) {\r\n            try {\r\n                const eventInfo = eventOrInfo instanceof EventInfo ? eventOrInfo : new EventInfo(this, eventOrInfo);\r\n                const eventContexts = getBubblingContexts(this);\r\n                if (!eventContexts.size) {\r\n                    return;\r\n                }\r\n                updateEventInfo(eventInfo, 'capturing', this);\r\n                // The capture phase of the event.\r\n                if (fireListenerFor(eventContexts, '$capture', eventInfo, ...eventArgs)) {\r\n                    return eventInfo.return;\r\n                }\r\n                const startRange = eventInfo.startRange || this.selection.getFirstRange();\r\n                const selectedElement = startRange ? startRange.getContainedElement() : null;\r\n                const isCustomContext = selectedElement ? Boolean(getCustomContext(eventContexts, selectedElement)) : false;\r\n                let node = selectedElement || getDeeperRangeParent(startRange);\r\n                updateEventInfo(eventInfo, 'atTarget', node);\r\n                // For the not yet bubbling event trigger for $text node if selection can be there and it's not a custom context selected.\r\n                if (!isCustomContext) {\r\n                    if (fireListenerFor(eventContexts, '$text', eventInfo, ...eventArgs)) {\r\n                        return eventInfo.return;\r\n                    }\r\n                    updateEventInfo(eventInfo, 'bubbling', node);\r\n                }\r\n                while (node) {\r\n                    // Root node handling.\r\n                    if (node.is('rootElement')) {\r\n                        if (fireListenerFor(eventContexts, '$root', eventInfo, ...eventArgs)) {\r\n                            return eventInfo.return;\r\n                        }\r\n                    }\r\n                    // Element node handling.\r\n                    else if (node.is('element')) {\r\n                        if (fireListenerFor(eventContexts, node.name, eventInfo, ...eventArgs)) {\r\n                            return eventInfo.return;\r\n                        }\r\n                    }\r\n                    // Check custom contexts (i.e., a widget).\r\n                    if (fireListenerFor(eventContexts, node, eventInfo, ...eventArgs)) {\r\n                        return eventInfo.return;\r\n                    }\r\n                    node = node.parent;\r\n                    updateEventInfo(eventInfo, 'bubbling', node);\r\n                }\r\n                updateEventInfo(eventInfo, 'bubbling', this);\r\n                // Document context.\r\n                fireListenerFor(eventContexts, '$document', eventInfo, ...eventArgs);\r\n                return eventInfo.return;\r\n            }\r\n            catch (err) {\r\n                // @if CK_DEBUG // throw err;\r\n                /* istanbul ignore next -- @preserve */\r\n                CKEditorError.rethrowUnexpectedError(err, this);\r\n            }\r\n        }\r\n        _addEventListener(event, callback, options) {\r\n            const contexts = toArray(options.context || '$document');\r\n            const eventContexts = getBubblingContexts(this);\r\n            for (const context of contexts) {\r\n                let emitter = eventContexts.get(context);\r\n                if (!emitter) {\r\n                    emitter = new (EmitterMixin())();\r\n                    eventContexts.set(context, emitter);\r\n                }\r\n                this.listenTo(emitter, event, callback, options);\r\n            }\r\n        }\r\n        _removeEventListener(event, callback) {\r\n            const eventContexts = getBubblingContexts(this);\r\n            for (const emitter of eventContexts.values()) {\r\n                this.stopListening(emitter, event, callback);\r\n            }\r\n        }\r\n    }\r\n    return Mixin;\r\n}\r\n// Backward compatibility with `mix`.\r\n{\r\n    const mixin = BubblingEmitterMixin(Object);\r\n    ['fire', '_addEventListener', '_removeEventListener'].forEach(key => {\r\n        BubblingEmitterMixin[key] = mixin.prototype[key];\r\n    });\r\n}\r\n/**\r\n * Update the event info bubbling fields.\r\n *\r\n * @param eventInfo The event info object to update.\r\n * @param eventPhase The current event phase.\r\n * @param currentTarget The current bubbling target.\r\n */\r\nfunction updateEventInfo(eventInfo, eventPhase, currentTarget) {\r\n    if (eventInfo instanceof BubblingEventInfo) {\r\n        eventInfo._eventPhase = eventPhase;\r\n        eventInfo._currentTarget = currentTarget;\r\n    }\r\n}\r\n/**\r\n * Fires the listener for the specified context. Returns `true` if event was stopped.\r\n *\r\n * @param eventInfo The `EventInfo` object.\r\n * @param eventArgs Additional arguments to be passed to the callbacks.\r\n * @returns True if event stop was called.\r\n */\r\nfunction fireListenerFor(eventContexts, context, eventInfo, ...eventArgs) {\r\n    const emitter = typeof context == 'string' ? eventContexts.get(context) : getCustomContext(eventContexts, context);\r\n    if (!emitter) {\r\n        return false;\r\n    }\r\n    emitter.fire(eventInfo, ...eventArgs);\r\n    return eventInfo.stop.called;\r\n}\r\n/**\r\n * Returns an emitter for a specified view node.\r\n */\r\nfunction getCustomContext(eventContexts, node) {\r\n    for (const [context, emitter] of eventContexts) {\r\n        if (typeof context == 'function' && context(node)) {\r\n            return emitter;\r\n        }\r\n    }\r\n    return null;\r\n}\r\n/**\r\n * Returns bubbling contexts map for the source (emitter).\r\n */\r\nfunction getBubblingContexts(source) {\r\n    if (!source[contextsSymbol]) {\r\n        source[contextsSymbol] = new Map();\r\n    }\r\n    return source[contextsSymbol];\r\n}\r\n/**\r\n * Returns the deeper parent element for the range.\r\n */\r\nfunction getDeeperRangeParent(range) {\r\n    if (!range) {\r\n        return null;\r\n    }\r\n    const startParent = range.start.parent;\r\n    const endParent = range.end.parent;\r\n    const startPath = startParent.getPath();\r\n    const endPath = endParent.getPath();\r\n    return startPath.length > endPath.length ? startParent : endParent;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/document\r\n */\r\nimport DocumentSelection from './documentselection';\r\nimport BubblingEmitterMixin from './observer/bubblingemittermixin';\r\nimport { Collection, ObservableMixin } from '@ckeditor/ckeditor5-utils';\r\n// @if CK_DEBUG_ENGINE // const { logDocument } = require( '../dev-utils/utils' );\r\n/**\r\n * Document class creates an abstract layer over the content editable area, contains a tree of view elements and\r\n * {@link module:engine/view/documentselection~DocumentSelection view selection} associated with this document.\r\n */\r\nexport default class Document extends BubblingEmitterMixin(ObservableMixin()) {\r\n    /**\r\n     * Creates a Document instance.\r\n     *\r\n     * @param stylesProcessor The styles processor instance.\r\n     */\r\n    constructor(stylesProcessor) {\r\n        super();\r\n        /**\r\n         * Post-fixer callbacks registered to the view document.\r\n         */\r\n        this._postFixers = new Set();\r\n        this.selection = new DocumentSelection();\r\n        this.roots = new Collection({ idProperty: 'rootName' });\r\n        this.stylesProcessor = stylesProcessor;\r\n        this.set('isReadOnly', false);\r\n        this.set('isFocused', false);\r\n        this.set('isSelecting', false);\r\n        this.set('isComposing', false);\r\n    }\r\n    /**\r\n     * Gets a {@link module:engine/view/document~Document#roots view root element} with the specified name. If the name is not\r\n     * specific \"main\" root is returned.\r\n     *\r\n     * @param name Name of the root.\r\n     * @returns The view root element with the specified name or null when there is no root of given name.\r\n     */\r\n    getRoot(name = 'main') {\r\n        return this.roots.get(name);\r\n    }\r\n    /**\r\n     * Allows registering post-fixer callbacks. A post-fixers mechanism allows to update the view tree just before it is rendered\r\n     * to the DOM.\r\n     *\r\n     * Post-fixers are executed right after all changes from the outermost change block were applied but\r\n     * before the {@link module:engine/view/view~View#event:render render event} is fired. If a post-fixer callback made\r\n     * a change, it should return `true`. When this happens, all post-fixers are fired again to check if something else should\r\n     * not be fixed in the new document tree state.\r\n     *\r\n     * View post-fixers are useful when you want to apply some fixes whenever the view structure changes. Keep in mind that\r\n     * changes executed in a view post-fixer should not break model-view mapping.\r\n     *\r\n     * The types of changes which should be safe:\r\n     *\r\n     * * adding or removing attribute from elements,\r\n     * * changes inside of {@link module:engine/view/uielement~UIElement UI elements},\r\n     * * {@link module:engine/controller/editingcontroller~EditingController#reconvertItem marking some of the model elements to be\r\n     * re-converted}.\r\n     *\r\n     * Try to avoid changes which touch view structure:\r\n     *\r\n     * * you should not add or remove nor wrap or unwrap any view elements,\r\n     * * you should not change the editor data model in a view post-fixer.\r\n     *\r\n     * As a parameter, a post-fixer callback receives a {@link module:engine/view/downcastwriter~DowncastWriter downcast writer}.\r\n     *\r\n     * Typically, a post-fixer will look like this:\r\n     *\r\n     * ```ts\r\n     * editor.editing.view.document.registerPostFixer( writer => {\r\n     * \tif ( checkSomeCondition() ) {\r\n     * \t\twriter.doSomething();\r\n     *\r\n     * \t\t// Let other post-fixers know that something changed.\r\n     * \t\treturn true;\r\n     * \t}\r\n     * } );\r\n     * ```\r\n     *\r\n     * Note that nothing happens right after you register a post-fixer (e.g. execute such a code in the console).\r\n     * That is because adding a post-fixer does not execute it.\r\n     * The post-fixer will be executed as soon as any change in the document needs to cause its rendering.\r\n     * If you want to re-render the editor's view after registering the post-fixer then you should do it manually by calling\r\n     * {@link module:engine/view/view~View#forceRender `view.forceRender()`}.\r\n     *\r\n     * If you need to register a callback which is executed when DOM elements are already updated,\r\n     * use {@link module:engine/view/view~View#event:render render event}.\r\n     */\r\n    registerPostFixer(postFixer) {\r\n        this._postFixers.add(postFixer);\r\n    }\r\n    /**\r\n     * Destroys this instance. Makes sure that all observers are destroyed and listeners removed.\r\n     */\r\n    destroy() {\r\n        this.roots.map(root => root.destroy());\r\n        this.stopListening();\r\n    }\r\n    /**\r\n     * Performs post-fixer loops. Executes post-fixer callbacks as long as none of them has done any changes to the model.\r\n     *\r\n     * @internal\r\n     */\r\n    _callPostFixers(writer) {\r\n        let wasFixed = false;\r\n        do {\r\n            for (const callback of this._postFixers) {\r\n                wasFixed = callback(writer);\r\n                if (wasFixed) {\r\n                    break;\r\n                }\r\n            }\r\n        } while (wasFixed);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/attributeelement\r\n */\r\nimport Element from './element';\r\nimport { CKEditorError } from '@ckeditor/ckeditor5-utils';\r\n// Default attribute priority.\r\nconst DEFAULT_PRIORITY = 10;\r\n/**\r\n * Attribute elements are used to represent formatting elements in the view (think – `<b>`, `<span style=\"font-size: 2em\">`, etc.).\r\n * Most often they are created when downcasting model text attributes.\r\n *\r\n * Editing engine does not define a fixed HTML DTD. This is why a feature developer needs to choose between various\r\n * types (container element, {@link module:engine/view/attributeelement~AttributeElement attribute element},\r\n * {@link module:engine/view/emptyelement~EmptyElement empty element}, etc) when developing a feature.\r\n *\r\n * To create a new attribute element instance use the\r\n * {@link module:engine/view/downcastwriter~DowncastWriter#createAttributeElement `DowncastWriter#createAttributeElement()`} method.\r\n */\r\nexport default class AttributeElement extends Element {\r\n    /**\r\n     * Creates an attribute element.\r\n     *\r\n     * @see module:engine/view/downcastwriter~DowncastWriter#createAttributeElement\r\n     * @see module:engine/view/element~Element\r\n     * @protected\r\n     * @param document The document instance to which this element belongs.\r\n     * @param name Node name.\r\n     * @param attrs Collection of attributes.\r\n     * @param children A list of nodes to be inserted into created element.\r\n     */\r\n    constructor(document, name, attrs, children) {\r\n        super(document, name, attrs, children);\r\n        /**\r\n         * Element priority. Decides in what order elements are wrapped by {@link module:engine/view/downcastwriter~DowncastWriter}.\r\n         *\r\n         * @internal\r\n         * @readonly\r\n         */\r\n        this._priority = DEFAULT_PRIORITY;\r\n        /**\r\n         * Element identifier. If set, it is used by {@link module:engine/view/element~Element#isSimilar},\r\n         * and then two elements are considered similar if, and only if they have the same `_id`.\r\n         *\r\n         * @internal\r\n         * @readonly\r\n         */\r\n        this._id = null;\r\n        /**\r\n         * Keeps all the attribute elements that have the same {@link module:engine/view/attributeelement~AttributeElement#id ids}\r\n         * and still exist in the view tree.\r\n         *\r\n         * This property is managed by {@link module:engine/view/downcastwriter~DowncastWriter}.\r\n         */\r\n        this._clonesGroup = null;\r\n        this.getFillerOffset = getFillerOffset;\r\n    }\r\n    /**\r\n     * Element priority. Decides in what order elements are wrapped by {@link module:engine/view/downcastwriter~DowncastWriter}.\r\n     */\r\n    get priority() {\r\n        return this._priority;\r\n    }\r\n    /**\r\n     * Element identifier. If set, it is used by {@link module:engine/view/element~Element#isSimilar},\r\n     * and then two elements are considered similar if, and only if they have the same `id`.\r\n     */\r\n    get id() {\r\n        return this._id;\r\n    }\r\n    /**\r\n     * Returns all {@link module:engine/view/attributeelement~AttributeElement attribute elements} that has the\r\n     * same {@link module:engine/view/attributeelement~AttributeElement#id id} and are in the view tree (were not removed).\r\n     *\r\n     * Note: If this element has been removed from the tree, returned set will not include it.\r\n     *\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError attribute-element-get-elements-with-same-id-no-id}\r\n     * if this element has no `id`.\r\n     *\r\n     * @returns Set containing all the attribute elements\r\n     * with the same `id` that were added and not removed from the view tree.\r\n     */\r\n    getElementsWithSameId() {\r\n        if (this.id === null) {\r\n            /**\r\n             * Cannot get elements with the same id for an attribute element without id.\r\n             *\r\n             * @error attribute-element-get-elements-with-same-id-no-id\r\n             */\r\n            throw new CKEditorError('attribute-element-get-elements-with-same-id-no-id', this);\r\n        }\r\n        return new Set(this._clonesGroup);\r\n    }\r\n    /**\r\n     * Checks if this element is similar to other element.\r\n     *\r\n     * If none of elements has set {@link module:engine/view/attributeelement~AttributeElement#id}, then both elements\r\n     * should have the same name, attributes and priority to be considered as similar. Two similar elements can contain\r\n     * different set of children nodes.\r\n     *\r\n     * If at least one element has {@link module:engine/view/attributeelement~AttributeElement#id} set, then both\r\n     * elements have to have the same {@link module:engine/view/attributeelement~AttributeElement#id} value to be\r\n     * considered similar.\r\n     *\r\n     * Similarity is important for {@link module:engine/view/downcastwriter~DowncastWriter}. For example:\r\n     *\r\n     * * two following similar elements can be merged together into one, longer element,\r\n     * * {@link module:engine/view/downcastwriter~DowncastWriter#unwrap} checks similarity of passed element and processed element to\r\n     * decide whether processed element should be unwrapped,\r\n     * * etc.\r\n     */\r\n    isSimilar(otherElement) {\r\n        // If any element has an `id` set, just compare the ids.\r\n        if (this.id !== null || otherElement.id !== null) {\r\n            return this.id === otherElement.id;\r\n        }\r\n        return super.isSimilar(otherElement) && this.priority == otherElement.priority;\r\n    }\r\n    /**\r\n     * Clones provided element with priority.\r\n     *\r\n     * @internal\r\n     * @param deep If set to `true` clones element and all its children recursively. When set to `false`,\r\n     * element will be cloned without any children.\r\n     * @returns Clone of this element.\r\n     */\r\n    _clone(deep = false) {\r\n        const cloned = super._clone(deep);\r\n        // Clone priority too.\r\n        cloned._priority = this._priority;\r\n        // And id too.\r\n        cloned._id = this._id;\r\n        return cloned;\r\n    }\r\n}\r\nAttributeElement.DEFAULT_PRIORITY = DEFAULT_PRIORITY;\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nAttributeElement.prototype.is = function (type, name) {\r\n    if (!name) {\r\n        return type === 'attributeElement' || type === 'view:attributeElement' ||\r\n            // From super.is(). This is highly utilised method and cannot call super. See ckeditor/ckeditor5#6529.\r\n            type === 'element' || type === 'view:element' ||\r\n            type === 'node' || type === 'view:node';\r\n    }\r\n    else {\r\n        return name === this.name && (type === 'attributeElement' || type === 'view:attributeElement' ||\r\n            // From super.is(). This is highly utilised method and cannot call super. See ckeditor/ckeditor5#6529.\r\n            type === 'element' || type === 'view:element');\r\n    }\r\n};\r\n/**\r\n * Returns block {@link module:engine/view/filler~Filler filler} offset or `null` if block filler is not needed.\r\n *\r\n * @returns Block filler offset or `null` if block filler is not needed.\r\n */\r\nfunction getFillerOffset() {\r\n    // <b>foo</b> does not need filler.\r\n    if (nonUiChildrenCount(this)) {\r\n        return null;\r\n    }\r\n    let element = this.parent;\r\n    // <p><b></b></p> needs filler -> <p><b><br></b></p>\r\n    while (element && element.is('attributeElement')) {\r\n        if (nonUiChildrenCount(element) > 1) {\r\n            return null;\r\n        }\r\n        element = element.parent;\r\n    }\r\n    if (!element || nonUiChildrenCount(element) > 1) {\r\n        return null;\r\n    }\r\n    // Render block filler at the end of element (after all ui elements).\r\n    return this.childCount;\r\n}\r\n/**\r\n * Returns total count of children that are not {@link module:engine/view/uielement~UIElement UIElements}.\r\n */\r\nfunction nonUiChildrenCount(element) {\r\n    return Array.from(element.getChildren()).filter(element => !element.is('uiElement')).length;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/emptyelement\r\n */\r\nimport Element from './element';\r\nimport Node from './node';\r\nimport { CKEditorError } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Empty element class. It is used to represent elements that cannot contain any child nodes (for example `<img>` elements).\r\n *\r\n * To create a new empty element use the\r\n * {@link module:engine/view/downcastwriter~DowncastWriter#createEmptyElement `downcastWriter#createEmptyElement()`} method.\r\n */\r\nexport default class EmptyElement extends Element {\r\n    /**\r\n     * Creates new instance of EmptyElement.\r\n     *\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-emptyelement-cannot-add` when third parameter is passed,\r\n     * to inform that usage of EmptyElement is incorrect (adding child nodes to EmptyElement is forbidden).\r\n     *\r\n     * @see module:engine/view/downcastwriter~DowncastWriter#createEmptyElement\r\n     * @internal\r\n     * @param document The document instance to which this element belongs.\r\n     * @param name Node name.\r\n     * @param attrs Collection of attributes.\r\n     * @param children A list of nodes to be inserted into created element.\r\n     */\r\n    constructor(document, name, attributes, children) {\r\n        super(document, name, attributes, children);\r\n        this.getFillerOffset = getFillerOffset;\r\n    }\r\n    /**\r\n     * Overrides {@link module:engine/view/element~Element#_insertChild} method.\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-emptyelement-cannot-add` to prevent\r\n     * adding any child nodes to EmptyElement.\r\n     *\r\n     * @internal\r\n     */\r\n    _insertChild(index, items) {\r\n        if (items && (items instanceof Node || Array.from(items).length > 0)) {\r\n            /**\r\n             * Cannot add children to {@link module:engine/view/emptyelement~EmptyElement}.\r\n             *\r\n             * @error view-emptyelement-cannot-add\r\n             */\r\n            throw new CKEditorError('view-emptyelement-cannot-add', [this, items]);\r\n        }\r\n        return 0;\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nEmptyElement.prototype.is = function (type, name) {\r\n    if (!name) {\r\n        return type === 'emptyElement' || type === 'view:emptyElement' ||\r\n            // From super.is(). This is highly utilised method and cannot call super. See ckeditor/ckeditor5#6529.\r\n            type === 'element' || type === 'view:element' ||\r\n            type === 'node' || type === 'view:node';\r\n    }\r\n    else {\r\n        return name === this.name && (type === 'emptyElement' || type === 'view:emptyElement' ||\r\n            type === 'element' || type === 'view:element');\r\n    }\r\n};\r\n/**\r\n * Returns `null` because block filler is not needed for EmptyElements.\r\n */\r\nfunction getFillerOffset() {\r\n    return null;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/uielement\r\n */\r\nimport Element from './element';\r\nimport Node from './node';\r\nimport { CKEditorError, keyCodes } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * UI element class. It should be used to represent editing UI which needs to be injected into the editing view\r\n * If possible, you should keep your UI outside the editing view. However, if that is not possible,\r\n * UI elements can be used.\r\n *\r\n * How a UI element is rendered is in your control (you pass a callback to\r\n * {@link module:engine/view/downcastwriter~DowncastWriter#createUIElement `downcastWriter#createUIElement()`}).\r\n * The editor will ignore your UI element – the selection cannot be placed in it, it is skipped (invisible) when\r\n * the user modifies the selection by using arrow keys and the editor does not listen to any mutations which\r\n * happen inside your UI elements.\r\n *\r\n * The limitation is that you cannot convert a model element to a UI element. UI elements need to be\r\n * created for {@link module:engine/model/markercollection~Marker markers} or as additinal elements\r\n * inside normal {@link module:engine/view/containerelement~ContainerElement container elements}.\r\n *\r\n * To create a new UI element use the\r\n * {@link module:engine/view/downcastwriter~DowncastWriter#createUIElement `downcastWriter#createUIElement()`} method.\r\n */\r\nexport default class UIElement extends Element {\r\n    /**\r\n     * Creates new instance of UIElement.\r\n     *\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-uielement-cannot-add` when third parameter is passed,\r\n     * to inform that usage of UIElement is incorrect (adding child nodes to UIElement is forbidden).\r\n     *\r\n     * @see module:engine/view/downcastwriter~DowncastWriter#createUIElement\r\n     * @internal\r\n     * @param document The document instance to which this element belongs.\r\n     * @param name Node name.\r\n     * @param attrs Collection of attributes.\r\n     * @param children A list of nodes to be inserted into created element.\r\n     */\r\n    constructor(document, name, attrs, children) {\r\n        super(document, name, attrs, children);\r\n        this.getFillerOffset = getFillerOffset;\r\n    }\r\n    /**\r\n     * Overrides {@link module:engine/view/element~Element#_insertChild} method.\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-uielement-cannot-add` to prevent adding any child nodes\r\n     * to UIElement.\r\n     *\r\n     * @internal\r\n     */\r\n    _insertChild(index, items) {\r\n        if (items && (items instanceof Node || Array.from(items).length > 0)) {\r\n            /**\r\n             * Cannot add children to {@link module:engine/view/uielement~UIElement}.\r\n             *\r\n             * @error view-uielement-cannot-add\r\n             */\r\n            throw new CKEditorError('view-uielement-cannot-add', [this, items]);\r\n        }\r\n        return 0;\r\n    }\r\n    /**\r\n     * Renders this {@link module:engine/view/uielement~UIElement} to DOM. This method is called by\r\n     * {@link module:engine/view/domconverter~DomConverter}.\r\n     * Do not use inheritance to create custom rendering method, replace `render()` method instead:\r\n     *\r\n     * ```ts\r\n     * const myUIElement = downcastWriter.createUIElement( 'span' );\r\n     * myUIElement.render = function( domDocument, domConverter ) {\r\n     * \tconst domElement = this.toDomElement( domDocument );\r\n     *\r\n     * \tdomConverter.setContentOf( domElement, '<b>this is ui element</b>' );\r\n     *\r\n     * \treturn domElement;\r\n     * };\r\n     * ```\r\n     *\r\n     * If changes in your UI element should trigger some editor UI update you should call\r\n     * the {@link module:ui/editorui/editorui~EditorUI#update `editor.ui.update()`} method\r\n     * after rendering your UI element.\r\n     *\r\n     * @param domConverter Instance of the DomConverter used to optimize the output.\r\n     */\r\n    render(domDocument, domConverter) {\r\n        // Provide basic, default output.\r\n        return this.toDomElement(domDocument);\r\n    }\r\n    /**\r\n     * Creates DOM element based on this view UIElement.\r\n     * Note that each time this method is called new DOM element is created.\r\n     */\r\n    toDomElement(domDocument) {\r\n        const domElement = domDocument.createElement(this.name);\r\n        for (const key of this.getAttributeKeys()) {\r\n            domElement.setAttribute(key, this.getAttribute(key));\r\n        }\r\n        return domElement;\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nUIElement.prototype.is = function (type, name) {\r\n    if (!name) {\r\n        return type === 'uiElement' || type === 'view:uiElement' ||\r\n            // From super.is(). This is highly utilised method and cannot call super. See ckeditor/ckeditor5#6529.\r\n            type === 'element' || type === 'view:element' ||\r\n            type === 'node' || type === 'view:node';\r\n    }\r\n    else {\r\n        return name === this.name && (type === 'uiElement' || type === 'view:uiElement' ||\r\n            type === 'element' || type === 'view:element');\r\n    }\r\n};\r\n/**\r\n * This function injects UI element handling to the given {@link module:engine/view/document~Document document}.\r\n *\r\n * A callback is added to {@link module:engine/view/document~Document#event:keydown document keydown event}.\r\n * The callback handles the situation when right arrow key is pressed and selection is collapsed before a UI element.\r\n * Without this handler, it would be impossible to \"jump over\" UI element using right arrow key.\r\n *\r\n * @param view View controller to which the quirks handling will be injected.\r\n */\r\nexport function injectUiElementHandling(view) {\r\n    view.document.on('arrowKey', (evt, data) => jumpOverUiElement(evt, data, view.domConverter), { priority: 'low' });\r\n}\r\n/**\r\n * Returns `null` because block filler is not needed for UIElements.\r\n */\r\nfunction getFillerOffset() {\r\n    return null;\r\n}\r\n/**\r\n * Selection cannot be placed in a `UIElement`. Whenever it is placed there, it is moved before it. This\r\n * causes a situation when it is impossible to jump over `UIElement` using right arrow key, because the selection\r\n * ends up in ui element (in DOM) and is moved back to the left. This handler fixes this situation.\r\n */\r\nfunction jumpOverUiElement(evt, data, domConverter) {\r\n    if (data.keyCode == keyCodes.arrowright) {\r\n        const domSelection = data.domTarget.ownerDocument.defaultView.getSelection();\r\n        const domSelectionCollapsed = domSelection.rangeCount == 1 && domSelection.getRangeAt(0).collapsed;\r\n        // Jump over UI element if selection is collapsed or shift key is pressed. These are the cases when selection would extend.\r\n        if (domSelectionCollapsed || data.shiftKey) {\r\n            const domParent = domSelection.focusNode;\r\n            const domOffset = domSelection.focusOffset;\r\n            const viewPosition = domConverter.domPositionToView(domParent, domOffset);\r\n            // In case if dom element is not converted to view or is not mapped or something. Happens for example in some tests.\r\n            if (viewPosition === null) {\r\n                return;\r\n            }\r\n            // Skip all following ui elements.\r\n            let jumpedOverAnyUiElement = false;\r\n            const nextViewPosition = viewPosition.getLastMatchingPosition(value => {\r\n                if (value.item.is('uiElement')) {\r\n                    // Remember that there was at least one ui element.\r\n                    jumpedOverAnyUiElement = true;\r\n                }\r\n                // Jump over ui elements, jump over empty attribute elements, move up from inside of attribute element.\r\n                if (value.item.is('uiElement') || value.item.is('attributeElement')) {\r\n                    return true;\r\n                }\r\n                // Don't jump over text or don't get out of container element.\r\n                return false;\r\n            });\r\n            // If anything has been skipped, fix position.\r\n            // This `if` could be possibly omitted but maybe it is better not to mess with DOM selection if not needed.\r\n            if (jumpedOverAnyUiElement) {\r\n                const newDomPosition = domConverter.viewPositionToDom(nextViewPosition);\r\n                if (domSelectionCollapsed) {\r\n                    // Selection was collapsed, so collapse it at further position.\r\n                    domSelection.collapse(newDomPosition.parent, newDomPosition.offset);\r\n                }\r\n                else {\r\n                    // Selection was not collapse, so extend it instead of collapsing.\r\n                    domSelection.extend(newDomPosition.parent, newDomPosition.offset);\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/**\r\n * @module engine/view/rawelement\r\n */\r\nimport Element from './element';\r\nimport Node from './node';\r\nimport { CKEditorError } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * The raw element class.\r\n *\r\n * The raw elements work as data containers (\"wrappers\", \"sandboxes\") but their children are not managed or\r\n * even recognized by the editor. This encapsulation allows integrations to maintain custom DOM structures\r\n * in the editor content without, for instance, worrying about compatibility with other editor features.\r\n * Raw elements are a perfect tool for integration with external frameworks and data sources.\r\n *\r\n * Unlike {@link module:engine/view/uielement~UIElement UI elements}, raw elements act like real editor\r\n * content (similar to {@link module:engine/view/containerelement~ContainerElement} or\r\n * {@link module:engine/view/emptyelement~EmptyElement}), they are considered by the editor selection and\r\n * {@link module:widget/utils~toWidget they can work as widgets}.\r\n *\r\n * To create a new raw element, use the\r\n * {@link module:engine/view/downcastwriter~DowncastWriter#createRawElement `downcastWriter#createRawElement()`} method.\r\n */\r\nexport default class RawElement extends Element {\r\n    /**\r\n     * Creates a new instance of a raw element.\r\n     *\r\n     * Throws the `view-rawelement-cannot-add` {@link module:utils/ckeditorerror~CKEditorError CKEditorError} when the `children`\r\n     * parameter is passed to inform that the usage of `RawElement` is incorrect (adding child nodes to `RawElement` is forbidden).\r\n     *\r\n     * @see module:engine/view/downcastwriter~DowncastWriter#createRawElement\r\n     * @internal\r\n     * @param document The document instance to which this element belongs.\r\n     * @param name Node name.\r\n     * @param attrs Collection of attributes.\r\n     * @param children A list of nodes to be inserted into created element.\r\n     */\r\n    constructor(document, name, attrs, children) {\r\n        super(document, name, attrs, children);\r\n        // Returns `null` because filler is not needed for raw elements.\r\n        this.getFillerOffset = getFillerOffset;\r\n    }\r\n    /**\r\n     * Overrides the {@link module:engine/view/element~Element#_insertChild} method.\r\n     * Throws the `view-rawelement-cannot-add` {@link module:utils/ckeditorerror~CKEditorError CKEditorError} to prevent\r\n     * adding any child nodes to a raw element.\r\n     *\r\n     * @internal\r\n     */\r\n    _insertChild(index, items) {\r\n        if (items && (items instanceof Node || Array.from(items).length > 0)) {\r\n            /**\r\n             * Cannot add children to a {@link module:engine/view/rawelement~RawElement} instance.\r\n             *\r\n             * @error view-rawelement-cannot-add\r\n             */\r\n            throw new CKEditorError('view-rawelement-cannot-add', [this, items]);\r\n        }\r\n        return 0;\r\n    }\r\n    /**\r\n     * This allows rendering the children of a {@link module:engine/view/rawelement~RawElement} on the DOM level.\r\n     * This method is called by the {@link module:engine/view/domconverter~DomConverter} with the raw DOM element\r\n     * passed as an argument, leaving the number and shape of the children up to the integrator.\r\n     *\r\n     * This method **must be defined** for the raw element to work:\r\n     *\r\n     * ```ts\r\n     * const myRawElement = downcastWriter.createRawElement( 'div' );\r\n     *\r\n     * myRawElement.render = function( domElement, domConverter ) {\r\n     * \tdomConverter.setContentOf( domElement, '<b>This is the raw content of myRawElement.</b>' );\r\n     * };\r\n     * ```\r\n     *\r\n     * @param domElement The native DOM element representing the raw view element.\r\n     * @param domConverter Instance of the DomConverter used to optimize the output.\r\n     */\r\n    render(domElement, domConverter) { }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nRawElement.prototype.is = function (type, name) {\r\n    if (!name) {\r\n        return type === 'rawElement' || type === 'view:rawElement' ||\r\n            // From super.is(). This is highly utilised method and cannot call super. See ckeditor/ckeditor5#6529.\r\n            type === this.name || type === 'view:' + this.name ||\r\n            type === 'element' || type === 'view:element' ||\r\n            type === 'node' || type === 'view:node';\r\n    }\r\n    else {\r\n        return name === this.name && (type === 'rawElement' || type === 'view:rawElement' ||\r\n            type === 'element' || type === 'view:element');\r\n    }\r\n};\r\n/**\r\n * Returns `null` because block filler is not needed for raw elements.\r\n */\r\nfunction getFillerOffset() {\r\n    return null;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/documentfragment\r\n */\r\nimport TypeCheckable from './typecheckable';\r\nimport Text from './text';\r\nimport TextProxy from './textproxy';\r\nimport { EmitterMixin, isIterable } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Document fragment.\r\n *\r\n * To create a new document fragment instance use the\r\n * {@link module:engine/view/upcastwriter~UpcastWriter#createDocumentFragment `UpcastWriter#createDocumentFragment()`}\r\n * method.\r\n */\r\nexport default class DocumentFragment extends EmitterMixin(TypeCheckable) {\r\n    /**\r\n     * Creates new DocumentFragment instance.\r\n     *\r\n     * @internal\r\n     * @param document The document to which this document fragment belongs.\r\n     * @param children A list of nodes to be inserted into the created document fragment.\r\n     */\r\n    constructor(document, children) {\r\n        super();\r\n        /**\r\n         * Array of child nodes.\r\n         */\r\n        this._children = [];\r\n        /**\r\n         * Map of custom properties.\r\n         * Custom properties can be added to document fragment instance.\r\n         */\r\n        this._customProperties = new Map();\r\n        this.document = document;\r\n        if (children) {\r\n            this._insertChild(0, children);\r\n        }\r\n    }\r\n    /**\r\n     * Iterable interface.\r\n     *\r\n     * Iterates over nodes added to this document fragment.\r\n     */\r\n    [Symbol.iterator]() {\r\n        return this._children[Symbol.iterator]();\r\n    }\r\n    /**\r\n     * Number of child nodes in this document fragment.\r\n     */\r\n    get childCount() {\r\n        return this._children.length;\r\n    }\r\n    /**\r\n     * Is `true` if there are no nodes inside this document fragment, `false` otherwise.\r\n     */\r\n    get isEmpty() {\r\n        return this.childCount === 0;\r\n    }\r\n    /**\r\n     * Artificial root of `DocumentFragment`. Returns itself. Added for compatibility reasons.\r\n     */\r\n    get root() {\r\n        return this;\r\n    }\r\n    /**\r\n     * Artificial parent of `DocumentFragment`. Returns `null`. Added for compatibility reasons.\r\n     */\r\n    get parent() {\r\n        return null;\r\n    }\r\n    /**\r\n     * Artificial element name. Returns `undefined`. Added for compatibility reasons.\r\n     */\r\n    get name() {\r\n        return undefined;\r\n    }\r\n    /**\r\n     * Returns the custom property value for the given key.\r\n     */\r\n    getCustomProperty(key) {\r\n        return this._customProperties.get(key);\r\n    }\r\n    /**\r\n     * Returns an iterator which iterates over this document fragment's custom properties.\r\n     * Iterator provides `[ key, value ]` pairs for each stored property.\r\n     */\r\n    *getCustomProperties() {\r\n        yield* this._customProperties.entries();\r\n    }\r\n    /**\r\n     * {@link module:engine/view/documentfragment~DocumentFragment#_insertChild Insert} a child node or a list of child nodes at the end\r\n     * and sets the parent of these nodes to this fragment.\r\n     *\r\n     * @internal\r\n     * @param items Items to be inserted.\r\n     * @returns Number of appended nodes.\r\n     */\r\n    _appendChild(items) {\r\n        return this._insertChild(this.childCount, items);\r\n    }\r\n    /**\r\n     * Gets child at the given index.\r\n     *\r\n     * @param index Index of child.\r\n     * @returns Child node.\r\n     */\r\n    getChild(index) {\r\n        return this._children[index];\r\n    }\r\n    /**\r\n     * Gets index of the given child node. Returns `-1` if child node is not found.\r\n     *\r\n     * @param node Child node.\r\n     * @returns Index of the child node.\r\n     */\r\n    getChildIndex(node) {\r\n        return this._children.indexOf(node);\r\n    }\r\n    /**\r\n     * Gets child nodes iterator.\r\n     *\r\n     * @returns Child nodes iterator.\r\n     */\r\n    getChildren() {\r\n        return this._children[Symbol.iterator]();\r\n    }\r\n    /**\r\n     * Inserts a child node or a list of child nodes on the given index and sets the parent of these nodes to\r\n     * this fragment.\r\n     *\r\n     * @internal\r\n     * @param index Position where nodes should be inserted.\r\n     * @param items Items to be inserted.\r\n     * @returns Number of inserted nodes.\r\n     */\r\n    _insertChild(index, items) {\r\n        this._fireChange('children', this);\r\n        let count = 0;\r\n        const nodes = normalize(this.document, items);\r\n        for (const node of nodes) {\r\n            // If node that is being added to this element is already inside another element, first remove it from the old parent.\r\n            if (node.parent !== null) {\r\n                node._remove();\r\n            }\r\n            node.parent = this;\r\n            this._children.splice(index, 0, node);\r\n            index++;\r\n            count++;\r\n        }\r\n        return count;\r\n    }\r\n    /**\r\n     * Removes number of child nodes starting at the given index and set the parent of these nodes to `null`.\r\n     *\r\n     * @internal\r\n     * @param index Number of the first node to remove.\r\n     * @param howMany Number of nodes to remove.\r\n     * @returns The array of removed nodes.\r\n     */\r\n    _removeChildren(index, howMany = 1) {\r\n        this._fireChange('children', this);\r\n        for (let i = index; i < index + howMany; i++) {\r\n            this._children[i].parent = null;\r\n        }\r\n        return this._children.splice(index, howMany);\r\n    }\r\n    /**\r\n     * Fires `change` event with given type of the change.\r\n     *\r\n     * @internal\r\n     * @param type Type of the change.\r\n     * @param node Changed node.\r\n     */\r\n    _fireChange(type, node) {\r\n        this.fire('change:' + type, node);\r\n    }\r\n    /**\r\n     * Sets a custom property. They can be used to add special data to elements.\r\n     *\r\n     * @see module:engine/view/downcastwriter~DowncastWriter#setCustomProperty\r\n     * @internal\r\n     */\r\n    _setCustomProperty(key, value) {\r\n        this._customProperties.set(key, value);\r\n    }\r\n    /**\r\n     * Removes the custom property stored under the given key.\r\n     *\r\n     * @see module:engine/view/downcastwriter~DowncastWriter#removeCustomProperty\r\n     * @internal\r\n     * @returns Returns true if property was removed.\r\n     */\r\n    _removeCustomProperty(key) {\r\n        return this._customProperties.delete(key);\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nDocumentFragment.prototype.is = function (type) {\r\n    return type === 'documentFragment' || type === 'view:documentFragment';\r\n};\r\n/**\r\n * Converts strings to Text and non-iterables to arrays.\r\n */\r\nfunction normalize(document, nodes) {\r\n    // Separate condition because string is iterable.\r\n    if (typeof nodes == 'string') {\r\n        return [new Text(document, nodes)];\r\n    }\r\n    if (!isIterable(nodes)) {\r\n        nodes = [nodes];\r\n    }\r\n    // Array.from to enable .map() on non-arrays.\r\n    return Array.from(nodes)\r\n        .map(node => {\r\n        if (typeof node == 'string') {\r\n            return new Text(document, node);\r\n        }\r\n        if (node instanceof TextProxy) {\r\n            return new Text(document, node.data);\r\n        }\r\n        return node;\r\n    });\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/downcastwriter\r\n */\r\nimport Position from './position';\r\nimport Range from './range';\r\nimport Selection from './selection';\r\nimport ContainerElement from './containerelement';\r\nimport AttributeElement from './attributeelement';\r\nimport EmptyElement from './emptyelement';\r\nimport UIElement from './uielement';\r\nimport RawElement from './rawelement';\r\nimport { CKEditorError, isIterable } from '@ckeditor/ckeditor5-utils';\r\nimport DocumentFragment from './documentfragment';\r\nimport Text from './text';\r\nimport EditableElement from './editableelement';\r\nimport { isPlainObject } from 'lodash-es';\r\n/**\r\n * View downcast writer.\r\n *\r\n * It provides a set of methods used to manipulate view nodes.\r\n *\r\n * Do not create an instance of this writer manually. To modify a view structure, use\r\n * the {@link module:engine/view/view~View#change `View#change()`} block.\r\n *\r\n * The `DowncastWriter` is designed to work with semantic views which are the views that were/are being downcasted from the model.\r\n * To work with ordinary views (e.g. parsed from a pasted content) use the\r\n * {@link module:engine/view/upcastwriter~UpcastWriter upcast writer}.\r\n *\r\n * Read more about changing the view in the {@glink framework/architecture/editing-engine#changing-the-view Changing the view}\r\n * section of the {@glink framework/architecture/editing-engine Editing engine architecture} guide.\r\n */\r\nexport default class DowncastWriter {\r\n    /**\r\n     * @param document The view document instance.\r\n     */\r\n    constructor(document) {\r\n        /**\r\n         * Holds references to the attribute groups that share the same {@link module:engine/view/attributeelement~AttributeElement#id id}.\r\n         * The keys are `id`s, the values are `Set`s holding {@link module:engine/view/attributeelement~AttributeElement}s.\r\n         */\r\n        this._cloneGroups = new Map();\r\n        /**\r\n         * The slot factory used by the `elementToStructure` downcast helper.\r\n         */\r\n        this._slotFactory = null;\r\n        this.document = document;\r\n    }\r\n    setSelection(...args) {\r\n        this.document.selection._setTo(...args);\r\n    }\r\n    /**\r\n     * Moves {@link module:engine/view/documentselection~DocumentSelection#focus selection's focus} to the specified location.\r\n     *\r\n     * The location can be specified in the same form as {@link module:engine/view/view~View#createPositionAt view.createPositionAt()}\r\n     * parameters.\r\n     *\r\n     * @param Offset or one of the flags. Used only when the first parameter is a {@link module:engine/view/item~Item view item}.\r\n     */\r\n    setSelectionFocus(itemOrPosition, offset) {\r\n        this.document.selection._setFocus(itemOrPosition, offset);\r\n    }\r\n    /**\r\n     * Creates a new {@link module:engine/view/documentfragment~DocumentFragment} instance.\r\n     *\r\n     * @param children A list of nodes to be inserted into the created document fragment.\r\n     * @returns The created document fragment.\r\n     */\r\n    createDocumentFragment(children) {\r\n        return new DocumentFragment(this.document, children);\r\n    }\r\n    /**\r\n     * Creates a new {@link module:engine/view/text~Text text node}.\r\n     *\r\n     * ```ts\r\n     * writer.createText( 'foo' );\r\n     * ```\r\n     *\r\n     * @param data The text's data.\r\n     * @returns The created text node.\r\n     */\r\n    createText(data) {\r\n        return new Text(this.document, data);\r\n    }\r\n    /**\r\n     * Creates a new {@link module:engine/view/attributeelement~AttributeElement}.\r\n     *\r\n     * ```ts\r\n     * writer.createAttributeElement( 'strong' );\r\n     * writer.createAttributeElement( 'a', { href: 'foo.bar' } );\r\n     *\r\n     * // Make `<a>` element contain other attributes element so the `<a>` element is not broken.\r\n     * writer.createAttributeElement( 'a', { href: 'foo.bar' }, { priority: 5 } );\r\n     *\r\n     * // Set `id` of a marker element so it is not joined or merged with \"normal\" elements.\r\n     * writer.createAttributeElement( 'span', { class: 'my-marker' }, { id: 'marker:my' } );\r\n     * ```\r\n     *\r\n     * @param name Name of the element.\r\n     * @param attributes Element's attributes.\r\n     * @param options Element's options.\r\n     * @param options.priority Element's {@link module:engine/view/attributeelement~AttributeElement#priority priority}.\r\n     * @param options.id Element's {@link module:engine/view/attributeelement~AttributeElement#id id}.\r\n     * @param options.renderUnsafeAttributes A list of attribute names that should be rendered in the editing\r\n     * pipeline even though they would normally be filtered out by unsafe attribute detection mechanisms.\r\n     * @returns Created element.\r\n     */\r\n    createAttributeElement(name, attributes, options = {}) {\r\n        const attributeElement = new AttributeElement(this.document, name, attributes);\r\n        if (typeof options.priority === 'number') {\r\n            attributeElement._priority = options.priority;\r\n        }\r\n        if (options.id) {\r\n            attributeElement._id = options.id;\r\n        }\r\n        if (options.renderUnsafeAttributes) {\r\n            attributeElement._unsafeAttributesToRender.push(...options.renderUnsafeAttributes);\r\n        }\r\n        return attributeElement;\r\n    }\r\n    createContainerElement(name, attributes, childrenOrOptions = {}, options = {}) {\r\n        let children = null;\r\n        if (isPlainObject(childrenOrOptions)) {\r\n            options = childrenOrOptions;\r\n        }\r\n        else {\r\n            children = childrenOrOptions;\r\n        }\r\n        const containerElement = new ContainerElement(this.document, name, attributes, children);\r\n        if (options.renderUnsafeAttributes) {\r\n            containerElement._unsafeAttributesToRender.push(...options.renderUnsafeAttributes);\r\n        }\r\n        return containerElement;\r\n    }\r\n    /**\r\n     * Creates a new {@link module:engine/view/editableelement~EditableElement}.\r\n     *\r\n     * ```ts\r\n     * writer.createEditableElement( 'div' );\r\n     * writer.createEditableElement( 'div', { id: 'foo-1234' } );\r\n     * ```\r\n     *\r\n     * Note: The editable element is to be used in the editing pipeline. Usually, together with\r\n     * {@link module:widget/utils~toWidgetEditable `toWidgetEditable()`}.\r\n     *\r\n     * @param name Name of the element.\r\n     * @param attributes Elements attributes.\r\n     * @param options Element's options.\r\n     * @param options.renderUnsafeAttributes A list of attribute names that should be rendered in the editing\r\n     * pipeline even though they would normally be filtered out by unsafe attribute detection mechanisms.\r\n     * @returns Created element.\r\n     */\r\n    createEditableElement(name, attributes, options = {}) {\r\n        const editableElement = new EditableElement(this.document, name, attributes);\r\n        if (options.renderUnsafeAttributes) {\r\n            editableElement._unsafeAttributesToRender.push(...options.renderUnsafeAttributes);\r\n        }\r\n        return editableElement;\r\n    }\r\n    /**\r\n     * Creates a new {@link module:engine/view/emptyelement~EmptyElement}.\r\n     *\r\n     * ```ts\r\n     * writer.createEmptyElement( 'img' );\r\n     * writer.createEmptyElement( 'img', { id: 'foo-1234' } );\r\n     * ```\r\n     *\r\n     * @param name Name of the element.\r\n     * @param attributes Elements attributes.\r\n     * @param options Element's options.\r\n     * @param options.renderUnsafeAttributes A list of attribute names that should be rendered in the editing\r\n     * pipeline even though they would normally be filtered out by unsafe attribute detection mechanisms.\r\n     * @returns Created element.\r\n     */\r\n    createEmptyElement(name, attributes, options = {}) {\r\n        const emptyElement = new EmptyElement(this.document, name, attributes);\r\n        if (options.renderUnsafeAttributes) {\r\n            emptyElement._unsafeAttributesToRender.push(...options.renderUnsafeAttributes);\r\n        }\r\n        return emptyElement;\r\n    }\r\n    /**\r\n     * Creates a new {@link module:engine/view/uielement~UIElement}.\r\n     *\r\n     * ```ts\r\n     * writer.createUIElement( 'span' );\r\n     * writer.createUIElement( 'span', { id: 'foo-1234' } );\r\n     * ```\r\n     *\r\n     * A custom render function can be provided as the third parameter:\r\n     *\r\n     * ```ts\r\n     * writer.createUIElement( 'span', null, function( domDocument ) {\r\n     * \tconst domElement = this.toDomElement( domDocument );\r\n     * \tdomElement.innerHTML = '<b>this is ui element</b>';\r\n     *\r\n     * \treturn domElement;\r\n     * } );\r\n     * ```\r\n     *\r\n     * Unlike {@link #createRawElement raw elements}, UI elements are by no means editor content, for instance,\r\n     * they are ignored by the editor selection system.\r\n     *\r\n     * You should not use UI elements as data containers. Check out {@link #createRawElement} instead.\r\n     *\r\n     * @param name The name of the element.\r\n     * @param attributes Element attributes.\r\n     * @param renderFunction A custom render function.\r\n     * @returns The created element.\r\n     */\r\n    createUIElement(name, attributes, renderFunction) {\r\n        const uiElement = new UIElement(this.document, name, attributes);\r\n        if (renderFunction) {\r\n            uiElement.render = renderFunction;\r\n        }\r\n        return uiElement;\r\n    }\r\n    /**\r\n     * Creates a new {@link module:engine/view/rawelement~RawElement}.\r\n     *\r\n     * ```ts\r\n     * writer.createRawElement( 'span', { id: 'foo-1234' }, function( domElement ) {\r\n     * \tdomElement.innerHTML = '<b>This is the raw content of the raw element.</b>';\r\n     * } );\r\n     * ```\r\n     *\r\n     * Raw elements work as data containers (\"wrappers\", \"sandboxes\") but their children are not managed or\r\n     * even recognized by the editor. This encapsulation allows integrations to maintain custom DOM structures\r\n     * in the editor content without, for instance, worrying about compatibility with other editor features.\r\n     * Raw elements are a perfect tool for integration with external frameworks and data sources.\r\n     *\r\n     * Unlike {@link #createUIElement UI elements}, raw elements act like \"real\" editor content (similar to\r\n     * {@link module:engine/view/containerelement~ContainerElement} or {@link module:engine/view/emptyelement~EmptyElement}),\r\n     * and they are considered by the editor selection.\r\n     *\r\n     * You should not use raw elements to render the UI in the editor content. Check out {@link #createUIElement `#createUIElement()`}\r\n     * instead.\r\n     *\r\n     * @param name The name of the element.\r\n     * @param attributes Element attributes.\r\n     * @param renderFunction A custom render function.\r\n     * @param options Element's options.\r\n     * @param options.renderUnsafeAttributes A list of attribute names that should be rendered in the editing\r\n     * pipeline even though they would normally be filtered out by unsafe attribute detection mechanisms.\r\n     * @returns The created element.\r\n     */\r\n    createRawElement(name, attributes, renderFunction, options = {}) {\r\n        const rawElement = new RawElement(this.document, name, attributes);\r\n        if (renderFunction) {\r\n            rawElement.render = renderFunction;\r\n        }\r\n        if (options.renderUnsafeAttributes) {\r\n            rawElement._unsafeAttributesToRender.push(...options.renderUnsafeAttributes);\r\n        }\r\n        return rawElement;\r\n    }\r\n    /**\r\n     * Adds or overwrites the element's attribute with a specified key and value.\r\n     *\r\n     * ```ts\r\n     * writer.setAttribute( 'href', 'http://ckeditor.com', linkElement );\r\n     * ```\r\n     *\r\n     * @param key The attribute key.\r\n     * @param value The attribute value.\r\n     */\r\n    setAttribute(key, value, element) {\r\n        element._setAttribute(key, value);\r\n    }\r\n    /**\r\n     * Removes attribute from the element.\r\n     *\r\n     * ```ts\r\n     * writer.removeAttribute( 'href', linkElement );\r\n     * ```\r\n     *\r\n     * @param key Attribute key.\r\n     */\r\n    removeAttribute(key, element) {\r\n        element._removeAttribute(key);\r\n    }\r\n    /**\r\n     * Adds specified class to the element.\r\n     *\r\n     * ```ts\r\n     * writer.addClass( 'foo', linkElement );\r\n     * writer.addClass( [ 'foo', 'bar' ], linkElement );\r\n     * ```\r\n     */\r\n    addClass(className, element) {\r\n        element._addClass(className);\r\n    }\r\n    /**\r\n     * Removes specified class from the element.\r\n     *\r\n     * ```ts\r\n     * writer.removeClass( 'foo', linkElement );\r\n     * writer.removeClass( [ 'foo', 'bar' ], linkElement );\r\n     * ```\r\n     */\r\n    removeClass(className, element) {\r\n        element._removeClass(className);\r\n    }\r\n    setStyle(property, value, element) {\r\n        if (isPlainObject(property) && element === undefined) {\r\n            value._setStyle(property);\r\n        }\r\n        else {\r\n            element._setStyle(property, value);\r\n        }\r\n    }\r\n    /**\r\n     * Removes specified style from the element.\r\n     *\r\n     * ```ts\r\n     * writer.removeStyle( 'color', element ); // Removes 'color' style.\r\n     * writer.removeStyle( [ 'color', 'border-top' ], element ); // Removes both 'color' and 'border-top' styles.\r\n     * ```\r\n     *\r\n     * **Note**: This method can work with normalized style names if\r\n     * {@link module:engine/controller/datacontroller~DataController#addStyleProcessorRules a particular style processor rule is enabled}.\r\n     * See {@link module:engine/view/stylesmap~StylesMap#remove `StylesMap#remove()`} for details.\r\n     */\r\n    removeStyle(property, element) {\r\n        element._removeStyle(property);\r\n    }\r\n    /**\r\n     * Sets a custom property on element. Unlike attributes, custom properties are not rendered to the DOM,\r\n     * so they can be used to add special data to elements.\r\n     */\r\n    setCustomProperty(key, value, element) {\r\n        element._setCustomProperty(key, value);\r\n    }\r\n    /**\r\n     * Removes a custom property stored under the given key.\r\n     *\r\n     * @returns Returns true if property was removed.\r\n     */\r\n    removeCustomProperty(key, element) {\r\n        return element._removeCustomProperty(key);\r\n    }\r\n    /**\r\n     * Breaks attribute elements at the provided position or at the boundaries of a provided range. It breaks attribute elements\r\n     * up to their first ancestor that is a container element.\r\n     *\r\n     * In following examples `<p>` is a container, `<b>` and `<u>` are attribute elements:\r\n     *\r\n     * ```html\r\n     * <p>foo<b><u>bar{}</u></b></p> -> <p>foo<b><u>bar</u></b>[]</p>\r\n     * <p>foo<b><u>{}bar</u></b></p> -> <p>foo{}<b><u>bar</u></b></p>\r\n     * <p>foo<b><u>b{}ar</u></b></p> -> <p>foo<b><u>b</u></b>[]<b><u>ar</u></b></p>\r\n     * <p><b>fo{o</b><u>ba}r</u></p> -> <p><b>fo</b><b>o</b><u>ba</u><u>r</u></b></p>\r\n     * ```\r\n     *\r\n     * **Note:** {@link module:engine/view/documentfragment~DocumentFragment DocumentFragment} is treated like a container.\r\n     *\r\n     * **Note:** The difference between {@link module:engine/view/downcastwriter~DowncastWriter#breakAttributes breakAttributes()} and\r\n     * {@link module:engine/view/downcastwriter~DowncastWriter#breakContainer breakContainer()} is that `breakAttributes()` breaks all\r\n     * {@link module:engine/view/attributeelement~AttributeElement attribute elements} that are ancestors of a given `position`,\r\n     * up to the first encountered {@link module:engine/view/containerelement~ContainerElement container element}.\r\n     * `breakContainer()` assumes that a given `position` is directly in the container element and breaks that container element.\r\n     *\r\n     * Throws the `view-writer-invalid-range-container` {@link module:utils/ckeditorerror~CKEditorError CKEditorError}\r\n     * when the {@link module:engine/view/range~Range#start start}\r\n     * and {@link module:engine/view/range~Range#end end} positions of a passed range are not placed inside same parent container.\r\n     *\r\n     * Throws the `view-writer-cannot-break-empty-element` {@link module:utils/ckeditorerror~CKEditorError CKEditorError}\r\n     * when trying to break attributes inside an {@link module:engine/view/emptyelement~EmptyElement EmptyElement}.\r\n     *\r\n     * Throws the `view-writer-cannot-break-ui-element` {@link module:utils/ckeditorerror~CKEditorError CKEditorError}\r\n     * when trying to break attributes inside a {@link module:engine/view/uielement~UIElement UIElement}.\r\n     *\r\n     * @see module:engine/view/attributeelement~AttributeElement\r\n     * @see module:engine/view/containerelement~ContainerElement\r\n     * @see module:engine/view/downcastwriter~DowncastWriter#breakContainer\r\n     * @param positionOrRange The position where to break attribute elements.\r\n     * @returns The new position or range, after breaking the attribute elements.\r\n     */\r\n    breakAttributes(positionOrRange) {\r\n        if (positionOrRange instanceof Position) {\r\n            return this._breakAttributes(positionOrRange);\r\n        }\r\n        else {\r\n            return this._breakAttributesRange(positionOrRange);\r\n        }\r\n    }\r\n    /**\r\n     * Breaks a {@link module:engine/view/containerelement~ContainerElement container view element} into two, at the given position.\r\n     * The position has to be directly inside the container element and cannot be in the root. It does not break the conrainer view element\r\n     * if the position is at the beginning or at the end of its parent element.\r\n     *\r\n     * ```html\r\n     * <p>foo^bar</p> -> <p>foo</p><p>bar</p>\r\n     * <div><p>foo</p>^<p>bar</p></div> -> <div><p>foo</p></div><div><p>bar</p></div>\r\n     * <p>^foobar</p> -> ^<p>foobar</p>\r\n     * <p>foobar^</p> -> <p>foobar</p>^\r\n     * ```\r\n     *\r\n     * **Note:** The difference between {@link module:engine/view/downcastwriter~DowncastWriter#breakAttributes breakAttributes()} and\r\n     * {@link module:engine/view/downcastwriter~DowncastWriter#breakContainer breakContainer()} is that `breakAttributes()` breaks all\r\n     * {@link module:engine/view/attributeelement~AttributeElement attribute elements} that are ancestors of a given `position`,\r\n     * up to the first encountered {@link module:engine/view/containerelement~ContainerElement container element}.\r\n     * `breakContainer()` assumes that the given `position` is directly in the container element and breaks that container element.\r\n     *\r\n     * @see module:engine/view/attributeelement~AttributeElement\r\n     * @see module:engine/view/containerelement~ContainerElement\r\n     * @see module:engine/view/downcastwriter~DowncastWriter#breakAttributes\r\n     * @param position The position where to break the element.\r\n     * @returns The position between broken elements. If an element has not been broken,\r\n     * the returned position is placed either before or after it.\r\n     */\r\n    breakContainer(position) {\r\n        const element = position.parent;\r\n        if (!(element.is('containerElement'))) {\r\n            /**\r\n             * Trying to break an element which is not a container element.\r\n             *\r\n             * @error view-writer-break-non-container-element\r\n             */\r\n            throw new CKEditorError('view-writer-break-non-container-element', this.document);\r\n        }\r\n        if (!element.parent) {\r\n            /**\r\n             * Trying to break root element.\r\n             *\r\n             * @error view-writer-break-root\r\n             */\r\n            throw new CKEditorError('view-writer-break-root', this.document);\r\n        }\r\n        if (position.isAtStart) {\r\n            return Position._createBefore(element);\r\n        }\r\n        else if (!position.isAtEnd) {\r\n            const newElement = element._clone(false);\r\n            this.insert(Position._createAfter(element), newElement);\r\n            const sourceRange = new Range(position, Position._createAt(element, 'end'));\r\n            const targetPosition = new Position(newElement, 0);\r\n            this.move(sourceRange, targetPosition);\r\n        }\r\n        return Position._createAfter(element);\r\n    }\r\n    /**\r\n     * Merges {@link module:engine/view/attributeelement~AttributeElement attribute elements}. It also merges text nodes if needed.\r\n     * Only {@link module:engine/view/attributeelement~AttributeElement#isSimilar similar} attribute elements can be merged.\r\n     *\r\n     * In following examples `<p>` is a container and `<b>` is an attribute element:\r\n     *\r\n     * ```html\r\n     * <p>foo[]bar</p> -> <p>foo{}bar</p>\r\n     * <p><b>foo</b>[]<b>bar</b></p> -> <p><b>foo{}bar</b></p>\r\n     * <p><b foo=\"bar\">a</b>[]<b foo=\"baz\">b</b></p> -> <p><b foo=\"bar\">a</b>[]<b foo=\"baz\">b</b></p>\r\n     * ```\r\n     *\r\n     * It will also take care about empty attributes when merging:\r\n     *\r\n     * ```html\r\n     * <p><b>[]</b></p> -> <p>[]</p>\r\n     * <p><b>foo</b><i>[]</i><b>bar</b></p> -> <p><b>foo{}bar</b></p>\r\n     * ```\r\n     *\r\n     * **Note:** Difference between {@link module:engine/view/downcastwriter~DowncastWriter#mergeAttributes mergeAttributes} and\r\n     * {@link module:engine/view/downcastwriter~DowncastWriter#mergeContainers mergeContainers} is that `mergeAttributes` merges two\r\n     * {@link module:engine/view/attributeelement~AttributeElement attribute elements} or {@link module:engine/view/text~Text text nodes}\r\n     * while `mergeContainer` merges two {@link module:engine/view/containerelement~ContainerElement container elements}.\r\n     *\r\n     * @see module:engine/view/attributeelement~AttributeElement\r\n     * @see module:engine/view/containerelement~ContainerElement\r\n     * @see module:engine/view/downcastwriter~DowncastWriter#mergeContainers\r\n     * @param position Merge position.\r\n     * @returns Position after merge.\r\n     */\r\n    mergeAttributes(position) {\r\n        const positionOffset = position.offset;\r\n        const positionParent = position.parent;\r\n        // When inside text node - nothing to merge.\r\n        if (positionParent.is('$text')) {\r\n            return position;\r\n        }\r\n        // When inside empty attribute - remove it.\r\n        if (positionParent.is('attributeElement') && positionParent.childCount === 0) {\r\n            const parent = positionParent.parent;\r\n            const offset = positionParent.index;\r\n            positionParent._remove();\r\n            this._removeFromClonedElementsGroup(positionParent);\r\n            return this.mergeAttributes(new Position(parent, offset));\r\n        }\r\n        const nodeBefore = positionParent.getChild(positionOffset - 1);\r\n        const nodeAfter = positionParent.getChild(positionOffset);\r\n        // Position should be placed between two nodes.\r\n        if (!nodeBefore || !nodeAfter) {\r\n            return position;\r\n        }\r\n        // When position is between two text nodes.\r\n        if (nodeBefore.is('$text') && nodeAfter.is('$text')) {\r\n            return mergeTextNodes(nodeBefore, nodeAfter);\r\n        }\r\n        // When position is between two same attribute elements.\r\n        else if (nodeBefore.is('attributeElement') && nodeAfter.is('attributeElement') && nodeBefore.isSimilar(nodeAfter)) {\r\n            // Move all children nodes from node placed after selection and remove that node.\r\n            const count = nodeBefore.childCount;\r\n            nodeBefore._appendChild(nodeAfter.getChildren());\r\n            nodeAfter._remove();\r\n            this._removeFromClonedElementsGroup(nodeAfter);\r\n            // New position is located inside the first node, before new nodes.\r\n            // Call this method recursively to merge again if needed.\r\n            return this.mergeAttributes(new Position(nodeBefore, count));\r\n        }\r\n        return position;\r\n    }\r\n    /**\r\n     * Merges two {@link module:engine/view/containerelement~ContainerElement container elements} that are before and after given position.\r\n     * Precisely, the element after the position is removed and it's contents are moved to element before the position.\r\n     *\r\n     * ```html\r\n     * <p>foo</p>^<p>bar</p> -> <p>foo^bar</p>\r\n     * <div>foo</div>^<p>bar</p> -> <div>foo^bar</div>\r\n     * ```\r\n     *\r\n     * **Note:** Difference between {@link module:engine/view/downcastwriter~DowncastWriter#mergeAttributes mergeAttributes} and\r\n     * {@link module:engine/view/downcastwriter~DowncastWriter#mergeContainers mergeContainers} is that `mergeAttributes` merges two\r\n     * {@link module:engine/view/attributeelement~AttributeElement attribute elements} or {@link module:engine/view/text~Text text nodes}\r\n     * while `mergeContainer` merges two {@link module:engine/view/containerelement~ContainerElement container elements}.\r\n     *\r\n     * @see module:engine/view/attributeelement~AttributeElement\r\n     * @see module:engine/view/containerelement~ContainerElement\r\n     * @see module:engine/view/downcastwriter~DowncastWriter#mergeAttributes\r\n     * @param position Merge position.\r\n     * @returns Position after merge.\r\n     */\r\n    mergeContainers(position) {\r\n        const prev = position.nodeBefore;\r\n        const next = position.nodeAfter;\r\n        if (!prev || !next || !prev.is('containerElement') || !next.is('containerElement')) {\r\n            /**\r\n             * Element before and after given position cannot be merged.\r\n             *\r\n             * @error view-writer-merge-containers-invalid-position\r\n             */\r\n            throw new CKEditorError('view-writer-merge-containers-invalid-position', this.document);\r\n        }\r\n        const lastChild = prev.getChild(prev.childCount - 1);\r\n        const newPosition = lastChild instanceof Text ? Position._createAt(lastChild, 'end') : Position._createAt(prev, 'end');\r\n        this.move(Range._createIn(next), Position._createAt(prev, 'end'));\r\n        this.remove(Range._createOn(next));\r\n        return newPosition;\r\n    }\r\n    /**\r\n     * Inserts a node or nodes at specified position. Takes care about breaking attributes before insertion\r\n     * and merging them afterwards.\r\n     *\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-insert-invalid-node` when nodes to insert\r\n     * contains instances that are not {@link module:engine/view/text~Text Texts},\r\n     * {@link module:engine/view/attributeelement~AttributeElement AttributeElements},\r\n     * {@link module:engine/view/containerelement~ContainerElement ContainerElements},\r\n     * {@link module:engine/view/emptyelement~EmptyElement EmptyElements},\r\n     * {@link module:engine/view/rawelement~RawElement RawElements} or\r\n     * {@link module:engine/view/uielement~UIElement UIElements}.\r\n     *\r\n     * @param position Insertion position.\r\n     * @param nodes Node or nodes to insert.\r\n     * @returns Range around inserted nodes.\r\n     */\r\n    insert(position, nodes) {\r\n        nodes = isIterable(nodes) ? [...nodes] : [nodes];\r\n        // Check if nodes to insert are instances of AttributeElements, ContainerElements, EmptyElements, UIElements or Text.\r\n        validateNodesToInsert(nodes, this.document);\r\n        // Group nodes in batches of nodes that require or do not require breaking an AttributeElements.\r\n        const nodeGroups = nodes.reduce((groups, node) => {\r\n            const lastGroup = groups[groups.length - 1];\r\n            // Break attributes on nodes that do exist in the model tree so they can have attributes, other elements\r\n            // can't have an attribute in model and won't get wrapped with an AttributeElement while down-casted.\r\n            const breakAttributes = !node.is('uiElement');\r\n            if (!lastGroup || lastGroup.breakAttributes != breakAttributes) {\r\n                groups.push({\r\n                    breakAttributes,\r\n                    nodes: [node]\r\n                });\r\n            }\r\n            else {\r\n                lastGroup.nodes.push(node);\r\n            }\r\n            return groups;\r\n        }, []);\r\n        // Insert nodes in batches.\r\n        let start = null;\r\n        let end = position;\r\n        for (const { nodes, breakAttributes } of nodeGroups) {\r\n            const range = this._insertNodes(end, nodes, breakAttributes);\r\n            if (!start) {\r\n                start = range.start;\r\n            }\r\n            end = range.end;\r\n        }\r\n        // When no nodes were inserted - return collapsed range.\r\n        if (!start) {\r\n            return new Range(position);\r\n        }\r\n        return new Range(start, end);\r\n    }\r\n    /**\r\n     * Removes provided range from the container.\r\n     *\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-invalid-range-container` when\r\n     * {@link module:engine/view/range~Range#start start} and {@link module:engine/view/range~Range#end end} positions are not placed inside\r\n     * same parent container.\r\n     *\r\n     * @param rangeOrItem Range to remove from container\r\n     * or an {@link module:engine/view/item~Item item} to remove. If range is provided, after removing, it will be updated\r\n     * to a collapsed range showing the new position.\r\n     * @returns Document fragment containing removed nodes.\r\n     */\r\n    remove(rangeOrItem) {\r\n        const range = rangeOrItem instanceof Range ? rangeOrItem : Range._createOn(rangeOrItem);\r\n        validateRangeContainer(range, this.document);\r\n        // If range is collapsed - nothing to remove.\r\n        if (range.isCollapsed) {\r\n            return new DocumentFragment(this.document);\r\n        }\r\n        // Break attributes at range start and end.\r\n        const { start: breakStart, end: breakEnd } = this._breakAttributesRange(range, true);\r\n        const parentContainer = breakStart.parent;\r\n        const count = breakEnd.offset - breakStart.offset;\r\n        // Remove nodes in range.\r\n        const removed = parentContainer._removeChildren(breakStart.offset, count);\r\n        for (const node of removed) {\r\n            this._removeFromClonedElementsGroup(node);\r\n        }\r\n        // Merge after removing.\r\n        const mergePosition = this.mergeAttributes(breakStart);\r\n        range.start = mergePosition;\r\n        range.end = mergePosition.clone();\r\n        // Return removed nodes.\r\n        return new DocumentFragment(this.document, removed);\r\n    }\r\n    /**\r\n     * Removes matching elements from given range.\r\n     *\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-invalid-range-container` when\r\n     * {@link module:engine/view/range~Range#start start} and {@link module:engine/view/range~Range#end end} positions are not placed inside\r\n     * same parent container.\r\n     *\r\n     * @param range Range to clear.\r\n     * @param element Element to remove.\r\n     */\r\n    clear(range, element) {\r\n        validateRangeContainer(range, this.document);\r\n        // Create walker on given range.\r\n        // We walk backward because when we remove element during walk it modifies range end position.\r\n        const walker = range.getWalker({\r\n            direction: 'backward',\r\n            ignoreElementEnd: true\r\n        });\r\n        // Let's walk.\r\n        for (const current of walker) {\r\n            const item = current.item;\r\n            let rangeToRemove;\r\n            // When current item matches to the given element.\r\n            if (item.is('element') && element.isSimilar(item)) {\r\n                // Create range on this element.\r\n                rangeToRemove = Range._createOn(item);\r\n                // When range starts inside Text or TextProxy element.\r\n            }\r\n            else if (!current.nextPosition.isAfter(range.start) && item.is('$textProxy')) {\r\n                // We need to check if parent of this text matches to given element.\r\n                const parentElement = item.getAncestors().find(ancestor => {\r\n                    return ancestor.is('element') && element.isSimilar(ancestor);\r\n                });\r\n                // If it is then create range inside this element.\r\n                if (parentElement) {\r\n                    rangeToRemove = Range._createIn(parentElement);\r\n                }\r\n            }\r\n            // If we have found element to remove.\r\n            if (rangeToRemove) {\r\n                // We need to check if element range stick out of the given range and truncate if it is.\r\n                if (rangeToRemove.end.isAfter(range.end)) {\r\n                    rangeToRemove.end = range.end;\r\n                }\r\n                if (rangeToRemove.start.isBefore(range.start)) {\r\n                    rangeToRemove.start = range.start;\r\n                }\r\n                // At the end we remove range with found element.\r\n                this.remove(rangeToRemove);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Moves nodes from provided range to target position.\r\n     *\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-invalid-range-container` when\r\n     * {@link module:engine/view/range~Range#start start} and {@link module:engine/view/range~Range#end end} positions are not placed inside\r\n     * same parent container.\r\n     *\r\n     * @param sourceRange Range containing nodes to move.\r\n     * @param targetPosition Position to insert.\r\n     * @returns Range in target container. Inserted nodes are placed between\r\n     * {@link module:engine/view/range~Range#start start} and {@link module:engine/view/range~Range#end end} positions.\r\n     */\r\n    move(sourceRange, targetPosition) {\r\n        let nodes;\r\n        if (targetPosition.isAfter(sourceRange.end)) {\r\n            targetPosition = this._breakAttributes(targetPosition, true);\r\n            const parent = targetPosition.parent;\r\n            const countBefore = parent.childCount;\r\n            sourceRange = this._breakAttributesRange(sourceRange, true);\r\n            nodes = this.remove(sourceRange);\r\n            targetPosition.offset += (parent.childCount - countBefore);\r\n        }\r\n        else {\r\n            nodes = this.remove(sourceRange);\r\n        }\r\n        return this.insert(targetPosition, nodes);\r\n    }\r\n    /**\r\n     * Wraps elements within range with provided {@link module:engine/view/attributeelement~AttributeElement AttributeElement}.\r\n     * If a collapsed range is provided, it will be wrapped only if it is equal to view selection.\r\n     *\r\n     * If a collapsed range was passed and is same as selection, the selection\r\n     * will be moved to the inside of the wrapped attribute element.\r\n     *\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError} `view-writer-invalid-range-container`\r\n     * when {@link module:engine/view/range~Range#start}\r\n     * and {@link module:engine/view/range~Range#end} positions are not placed inside same parent container.\r\n     *\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError} `view-writer-wrap-invalid-attribute` when passed attribute element is not\r\n     * an instance of {@link module:engine/view/attributeelement~AttributeElement AttributeElement}.\r\n     *\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError} `view-writer-wrap-nonselection-collapsed-range` when passed range\r\n     * is collapsed and different than view selection.\r\n     *\r\n     * @param range Range to wrap.\r\n     * @param attribute Attribute element to use as wrapper.\r\n     * @returns range Range after wrapping, spanning over wrapping attribute element.\r\n     */\r\n    wrap(range, attribute) {\r\n        if (!(attribute instanceof AttributeElement)) {\r\n            throw new CKEditorError('view-writer-wrap-invalid-attribute', this.document);\r\n        }\r\n        validateRangeContainer(range, this.document);\r\n        if (!range.isCollapsed) {\r\n            // Non-collapsed range. Wrap it with the attribute element.\r\n            return this._wrapRange(range, attribute);\r\n        }\r\n        else {\r\n            // Collapsed range. Wrap position.\r\n            let position = range.start;\r\n            if (position.parent.is('element') && !_hasNonUiChildren(position.parent)) {\r\n                position = position.getLastMatchingPosition(value => value.item.is('uiElement'));\r\n            }\r\n            position = this._wrapPosition(position, attribute);\r\n            const viewSelection = this.document.selection;\r\n            // If wrapping position is equal to view selection, move view selection inside wrapping attribute element.\r\n            if (viewSelection.isCollapsed && viewSelection.getFirstPosition().isEqual(range.start)) {\r\n                this.setSelection(position);\r\n            }\r\n            return new Range(position);\r\n        }\r\n    }\r\n    /**\r\n     * Unwraps nodes within provided range from attribute element.\r\n     *\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-invalid-range-container` when\r\n     * {@link module:engine/view/range~Range#start start} and {@link module:engine/view/range~Range#end end} positions are not placed inside\r\n     * same parent container.\r\n     */\r\n    unwrap(range, attribute) {\r\n        if (!(attribute instanceof AttributeElement)) {\r\n            /**\r\n             * The `attribute` passed to {@link module:engine/view/downcastwriter~DowncastWriter#unwrap `DowncastWriter#unwrap()`}\r\n             * must be an instance of {@link module:engine/view/attributeelement~AttributeElement `AttributeElement`}.\r\n             *\r\n             * @error view-writer-unwrap-invalid-attribute\r\n             */\r\n            throw new CKEditorError('view-writer-unwrap-invalid-attribute', this.document);\r\n        }\r\n        validateRangeContainer(range, this.document);\r\n        // If range is collapsed - nothing to unwrap.\r\n        if (range.isCollapsed) {\r\n            return range;\r\n        }\r\n        // Break attributes at range start and end.\r\n        const { start: breakStart, end: breakEnd } = this._breakAttributesRange(range, true);\r\n        const parentContainer = breakStart.parent;\r\n        // Unwrap children located between break points.\r\n        const newRange = this._unwrapChildren(parentContainer, breakStart.offset, breakEnd.offset, attribute);\r\n        // Merge attributes at the both ends and return a new range.\r\n        const start = this.mergeAttributes(newRange.start);\r\n        // If start position was merged - move end position back.\r\n        if (!start.isEqual(newRange.start)) {\r\n            newRange.end.offset--;\r\n        }\r\n        const end = this.mergeAttributes(newRange.end);\r\n        return new Range(start, end);\r\n    }\r\n    /**\r\n     * Renames element by creating a copy of renamed element but with changed name and then moving contents of the\r\n     * old element to the new one. Keep in mind that this will invalidate all {@link module:engine/view/position~Position positions} which\r\n     * has renamed element as {@link module:engine/view/position~Position#parent a parent}.\r\n     *\r\n     * New element has to be created because `Element#tagName` property in DOM is readonly.\r\n     *\r\n     * Since this function creates a new element and removes the given one, the new element is returned to keep reference.\r\n     *\r\n     * @param newName New name for element.\r\n     * @param viewElement Element to be renamed.\r\n     * @returns Element created due to rename.\r\n     */\r\n    rename(newName, viewElement) {\r\n        const newElement = new ContainerElement(this.document, newName, viewElement.getAttributes());\r\n        this.insert(Position._createAfter(viewElement), newElement);\r\n        this.move(Range._createIn(viewElement), Position._createAt(newElement, 0));\r\n        this.remove(Range._createOn(viewElement));\r\n        return newElement;\r\n    }\r\n    /**\r\n     * Cleans up memory by removing obsolete cloned elements group from the writer.\r\n     *\r\n     * Should be used whenever all {@link module:engine/view/attributeelement~AttributeElement attribute elements}\r\n     * with the same {@link module:engine/view/attributeelement~AttributeElement#id id} are going to be removed from the view and\r\n     * the group will no longer be needed.\r\n     *\r\n     * Cloned elements group are not removed automatically in case if the group is still needed after all its elements\r\n     * were removed from the view.\r\n     *\r\n     * Keep in mind that group names are equal to the `id` property of the attribute element.\r\n     *\r\n     * @param groupName Name of the group to clear.\r\n     */\r\n    clearClonedElementsGroup(groupName) {\r\n        this._cloneGroups.delete(groupName);\r\n    }\r\n    /**\r\n     * Creates position at the given location. The location can be specified as:\r\n     *\r\n     * * a {@link module:engine/view/position~Position position},\r\n     * * parent element and offset (offset defaults to `0`),\r\n     * * parent element and `'end'` (sets position at the end of that element),\r\n     * * {@link module:engine/view/item~Item view item} and `'before'` or `'after'` (sets position before or after given view item).\r\n     *\r\n     * This method is a shortcut to other constructors such as:\r\n     *\r\n     * * {@link #createPositionBefore},\r\n     * * {@link #createPositionAfter},\r\n     *\r\n     * @param offset Offset or one of the flags. Used only when the first parameter is a {@link module:engine/view/item~Item view item}.\r\n     */\r\n    createPositionAt(itemOrPosition, offset) {\r\n        return Position._createAt(itemOrPosition, offset);\r\n    }\r\n    /**\r\n     * Creates a new position after given view item.\r\n     *\r\n     * @param item View item after which the position should be located.\r\n     */\r\n    createPositionAfter(item) {\r\n        return Position._createAfter(item);\r\n    }\r\n    /**\r\n     * Creates a new position before given view item.\r\n     *\r\n     * @param item View item before which the position should be located.\r\n     */\r\n    createPositionBefore(item) {\r\n        return Position._createBefore(item);\r\n    }\r\n    /**\r\n     * Creates a range spanning from `start` position to `end` position.\r\n     *\r\n     * **Note:** This factory method creates its own {@link module:engine/view/position~Position} instances basing on passed values.\r\n     *\r\n     * @param start Start position.\r\n     * @param end End position. If not set, range will be collapsed at `start` position.\r\n     */\r\n    createRange(start, end) {\r\n        return new Range(start, end);\r\n    }\r\n    /**\r\n     * Creates a range that starts before given {@link module:engine/view/item~Item view item} and ends after it.\r\n     */\r\n    createRangeOn(item) {\r\n        return Range._createOn(item);\r\n    }\r\n    /**\r\n     * Creates a range inside an {@link module:engine/view/element~Element element} which starts before the first child of\r\n     * that element and ends after the last child of that element.\r\n     *\r\n     * @param element Element which is a parent for the range.\r\n     */\r\n    createRangeIn(element) {\r\n        return Range._createIn(element);\r\n    }\r\n    createSelection(...args) {\r\n        return new Selection(...args);\r\n    }\r\n    /**\r\n     * Creates placeholders for child elements of the {@link module:engine/conversion/downcasthelpers~DowncastHelpers#elementToStructure\r\n     * `elementToStructure()`} conversion helper.\r\n     *\r\n     * ```ts\r\n     * const viewSlot = conversionApi.writer.createSlot();\r\n     * const viewPosition = conversionApi.writer.createPositionAt( viewElement, 0 );\r\n     *\r\n     * conversionApi.writer.insert( viewPosition, viewSlot );\r\n     * ```\r\n     *\r\n     * It could be filtered down to a specific subset of children (only `<foo>` model elements in this case):\r\n     *\r\n     * ```ts\r\n     * const viewSlot = conversionApi.writer.createSlot( node => node.is( 'element', 'foo' ) );\r\n     * const viewPosition = conversionApi.writer.createPositionAt( viewElement, 0 );\r\n     *\r\n     * conversionApi.writer.insert( viewPosition, viewSlot );\r\n     * ```\r\n     *\r\n     * While providing a filtered slot, make sure to provide slots for all child nodes. A single node can not be downcasted into\r\n     * multiple slots.\r\n     *\r\n     * **Note**: You should not change the order of nodes. View elements should be in the same order as model nodes.\r\n     *\r\n     * @param modeOrFilter The filter for child nodes.\r\n     * @returns The slot element to be placed in to the view structure while processing\r\n     * {@link module:engine/conversion/downcasthelpers~DowncastHelpers#elementToStructure `elementToStructure()`}.\r\n     */\r\n    createSlot(modeOrFilter = 'children') {\r\n        if (!this._slotFactory) {\r\n            /**\r\n             * The `createSlot()` method is only allowed inside the `elementToStructure` downcast helper callback.\r\n             *\r\n             * @error view-writer-invalid-create-slot-context\r\n             */\r\n            throw new CKEditorError('view-writer-invalid-create-slot-context', this.document);\r\n        }\r\n        return this._slotFactory(this, modeOrFilter);\r\n    }\r\n    /**\r\n     * Registers a slot factory.\r\n     *\r\n     * @internal\r\n     * @param slotFactory The slot factory.\r\n     */\r\n    _registerSlotFactory(slotFactory) {\r\n        this._slotFactory = slotFactory;\r\n    }\r\n    /**\r\n     * Clears the registered slot factory.\r\n     *\r\n     * @internal\r\n     */\r\n    _clearSlotFactory() {\r\n        this._slotFactory = null;\r\n    }\r\n    /**\r\n     * Inserts a node or nodes at the specified position. Takes care of breaking attributes before insertion\r\n     * and merging them afterwards if requested by the breakAttributes param.\r\n     *\r\n     * @param position Insertion position.\r\n     * @param nodes Node or nodes to insert.\r\n     * @param breakAttributes Whether attributes should be broken.\r\n     * @returns Range around inserted nodes.\r\n     */\r\n    _insertNodes(position, nodes, breakAttributes) {\r\n        let parentElement;\r\n        // Break attributes on nodes that do exist in the model tree so they can have attributes, other elements\r\n        // can't have an attribute in model and won't get wrapped with an AttributeElement while down-casted.\r\n        if (breakAttributes) {\r\n            parentElement = getParentContainer(position);\r\n        }\r\n        else {\r\n            parentElement = position.parent.is('$text') ? position.parent.parent : position.parent;\r\n        }\r\n        if (!parentElement) {\r\n            /**\r\n             * Position's parent container cannot be found.\r\n             *\r\n             * @error view-writer-invalid-position-container\r\n             */\r\n            throw new CKEditorError('view-writer-invalid-position-container', this.document);\r\n        }\r\n        let insertionPosition;\r\n        if (breakAttributes) {\r\n            insertionPosition = this._breakAttributes(position, true);\r\n        }\r\n        else {\r\n            insertionPosition = position.parent.is('$text') ? breakTextNode(position) : position;\r\n        }\r\n        const length = parentElement._insertChild(insertionPosition.offset, nodes);\r\n        for (const node of nodes) {\r\n            this._addToClonedElementsGroup(node);\r\n        }\r\n        const endPosition = insertionPosition.getShiftedBy(length);\r\n        const start = this.mergeAttributes(insertionPosition);\r\n        // If start position was merged - move end position.\r\n        if (!start.isEqual(insertionPosition)) {\r\n            endPosition.offset--;\r\n        }\r\n        const end = this.mergeAttributes(endPosition);\r\n        return new Range(start, end);\r\n    }\r\n    /**\r\n     * Wraps children with provided `wrapElement`. Only children contained in `parent` element between\r\n     * `startOffset` and `endOffset` will be wrapped.\r\n     */\r\n    _wrapChildren(parent, startOffset, endOffset, wrapElement) {\r\n        let i = startOffset;\r\n        const wrapPositions = [];\r\n        while (i < endOffset) {\r\n            const child = parent.getChild(i);\r\n            const isText = child.is('$text');\r\n            const isAttribute = child.is('attributeElement');\r\n            //\r\n            // (In all examples, assume that `wrapElement` is `<span class=\"foo\">` element.)\r\n            //\r\n            // Check if `wrapElement` can be joined with the wrapped element. One of requirements is having same name.\r\n            // If possible, join elements.\r\n            //\r\n            // <p><span class=\"bar\">abc</span></p>  -->  <p><span class=\"foo bar\">abc</span></p>\r\n            //\r\n            if (isAttribute && this._wrapAttributeElement(wrapElement, child)) {\r\n                wrapPositions.push(new Position(parent, i));\r\n            }\r\n            //\r\n            // Wrap the child if it is not an attribute element or if it is an attribute element that should be inside\r\n            // `wrapElement` (due to priority).\r\n            //\r\n            // <p>abc</p>                   -->  <p><span class=\"foo\">abc</span></p>\r\n            // <p><strong>abc</strong></p>  -->  <p><span class=\"foo\"><strong>abc</strong></span></p>\r\n            else if (isText || !isAttribute || shouldABeOutsideB(wrapElement, child)) {\r\n                // Clone attribute.\r\n                const newAttribute = wrapElement._clone();\r\n                // Wrap current node with new attribute.\r\n                child._remove();\r\n                newAttribute._appendChild(child);\r\n                parent._insertChild(i, newAttribute);\r\n                this._addToClonedElementsGroup(newAttribute);\r\n                wrapPositions.push(new Position(parent, i));\r\n            }\r\n            //\r\n            // If other nested attribute is found and it wasn't wrapped (see above), continue wrapping inside it.\r\n            //\r\n            // <p><a href=\"foo.html\">abc</a></p>  -->  <p><a href=\"foo.html\"><span class=\"foo\">abc</span></a></p>\r\n            //\r\n            else /* if ( isAttribute ) */ {\r\n                this._wrapChildren(child, 0, child.childCount, wrapElement);\r\n            }\r\n            i++;\r\n        }\r\n        // Merge at each wrap.\r\n        let offsetChange = 0;\r\n        for (const position of wrapPositions) {\r\n            position.offset -= offsetChange;\r\n            // Do not merge with elements outside selected children.\r\n            if (position.offset == startOffset) {\r\n                continue;\r\n            }\r\n            const newPosition = this.mergeAttributes(position);\r\n            // If nodes were merged - other merge offsets will change.\r\n            if (!newPosition.isEqual(position)) {\r\n                offsetChange++;\r\n                endOffset--;\r\n            }\r\n        }\r\n        return Range._createFromParentsAndOffsets(parent, startOffset, parent, endOffset);\r\n    }\r\n    /**\r\n     * Unwraps children from provided `unwrapElement`. Only children contained in `parent` element between\r\n     * `startOffset` and `endOffset` will be unwrapped.\r\n     */\r\n    _unwrapChildren(parent, startOffset, endOffset, unwrapElement) {\r\n        let i = startOffset;\r\n        const unwrapPositions = [];\r\n        // Iterate over each element between provided offsets inside parent.\r\n        // We don't use tree walker or range iterator because we will be removing and merging potentially multiple nodes,\r\n        // so it could get messy. It is safer to it manually in this case.\r\n        while (i < endOffset) {\r\n            const child = parent.getChild(i);\r\n            // Skip all text nodes. There should be no container element's here either.\r\n            if (!child.is('attributeElement')) {\r\n                i++;\r\n                continue;\r\n            }\r\n            //\r\n            // (In all examples, assume that `unwrapElement` is `<span class=\"foo\">` element.)\r\n            //\r\n            // If the child is similar to the given attribute element, unwrap it - it will be completely removed.\r\n            //\r\n            // <p><span class=\"foo\">abc</span>xyz</p>  -->  <p>abcxyz</p>\r\n            //\r\n            if (child.isSimilar(unwrapElement)) {\r\n                const unwrapped = child.getChildren();\r\n                const count = child.childCount;\r\n                // Replace wrapper element with its children\r\n                child._remove();\r\n                parent._insertChild(i, unwrapped);\r\n                this._removeFromClonedElementsGroup(child);\r\n                // Save start and end position of moved items.\r\n                unwrapPositions.push(new Position(parent, i), new Position(parent, i + count));\r\n                // Skip elements that were unwrapped. Assuming there won't be another element to unwrap in child elements.\r\n                i += count;\r\n                endOffset += count - 1;\r\n                continue;\r\n            }\r\n            //\r\n            // If the child is not similar but is an attribute element, try partial unwrapping - remove the same attributes/styles/classes.\r\n            // Partial unwrapping will happen only if the elements have the same name.\r\n            //\r\n            // <p><span class=\"foo bar\">abc</span>xyz</p>  -->  <p><span class=\"bar\">abc</span>xyz</p>\r\n            // <p><i class=\"foo\">abc</i>xyz</p>            -->  <p><i class=\"foo\">abc</i>xyz</p>\r\n            //\r\n            if (this._unwrapAttributeElement(unwrapElement, child)) {\r\n                unwrapPositions.push(new Position(parent, i), new Position(parent, i + 1));\r\n                i++;\r\n                continue;\r\n            }\r\n            //\r\n            // If other nested attribute is found, look through it's children for elements to unwrap.\r\n            //\r\n            // <p><i><span class=\"foo\">abc</span></i><p>  -->  <p><i>abc</i><p>\r\n            //\r\n            this._unwrapChildren(child, 0, child.childCount, unwrapElement);\r\n            i++;\r\n        }\r\n        // Merge at each unwrap.\r\n        let offsetChange = 0;\r\n        for (const position of unwrapPositions) {\r\n            position.offset -= offsetChange;\r\n            // Do not merge with elements outside selected children.\r\n            if (position.offset == startOffset || position.offset == endOffset) {\r\n                continue;\r\n            }\r\n            const newPosition = this.mergeAttributes(position);\r\n            // If nodes were merged - other merge offsets will change.\r\n            if (!newPosition.isEqual(position)) {\r\n                offsetChange++;\r\n                endOffset--;\r\n            }\r\n        }\r\n        return Range._createFromParentsAndOffsets(parent, startOffset, parent, endOffset);\r\n    }\r\n    /**\r\n     * Helper function for `view.writer.wrap`. Wraps range with provided attribute element.\r\n     * This method will also merge newly added attribute element with its siblings whenever possible.\r\n     *\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError} `view-writer-wrap-invalid-attribute` when passed attribute element is not\r\n     * an instance of {@link module:engine/view/attributeelement~AttributeElement AttributeElement}.\r\n     *\r\n     * @returns New range after wrapping, spanning over wrapping attribute element.\r\n     */\r\n    _wrapRange(range, attribute) {\r\n        // Break attributes at range start and end.\r\n        const { start: breakStart, end: breakEnd } = this._breakAttributesRange(range, true);\r\n        const parentContainer = breakStart.parent;\r\n        // Wrap all children with attribute.\r\n        const newRange = this._wrapChildren(parentContainer, breakStart.offset, breakEnd.offset, attribute);\r\n        // Merge attributes at the both ends and return a new range.\r\n        const start = this.mergeAttributes(newRange.start);\r\n        // If start position was merged - move end position back.\r\n        if (!start.isEqual(newRange.start)) {\r\n            newRange.end.offset--;\r\n        }\r\n        const end = this.mergeAttributes(newRange.end);\r\n        return new Range(start, end);\r\n    }\r\n    /**\r\n     * Helper function for {@link #wrap}. Wraps position with provided attribute element.\r\n     * This method will also merge newly added attribute element with its siblings whenever possible.\r\n     *\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError} `view-writer-wrap-invalid-attribute` when passed attribute element is not\r\n     * an instance of {@link module:engine/view/attributeelement~AttributeElement AttributeElement}.\r\n     *\r\n     * @returns New position after wrapping.\r\n     */\r\n    _wrapPosition(position, attribute) {\r\n        // Return same position when trying to wrap with attribute similar to position parent.\r\n        if (attribute.isSimilar(position.parent)) {\r\n            return movePositionToTextNode(position.clone());\r\n        }\r\n        // When position is inside text node - break it and place new position between two text nodes.\r\n        if (position.parent.is('$text')) {\r\n            position = breakTextNode(position);\r\n        }\r\n        // Create fake element that will represent position, and will not be merged with other attributes.\r\n        const fakeElement = this.createAttributeElement('_wrapPosition-fake-element');\r\n        fakeElement._priority = Number.POSITIVE_INFINITY;\r\n        fakeElement.isSimilar = () => false;\r\n        // Insert fake element in position location.\r\n        position.parent._insertChild(position.offset, fakeElement);\r\n        // Range around inserted fake attribute element.\r\n        const wrapRange = new Range(position, position.getShiftedBy(1));\r\n        // Wrap fake element with attribute (it will also merge if possible).\r\n        this.wrap(wrapRange, attribute);\r\n        // Remove fake element and place new position there.\r\n        const newPosition = new Position(fakeElement.parent, fakeElement.index);\r\n        fakeElement._remove();\r\n        // If position is placed between text nodes - merge them and return position inside.\r\n        const nodeBefore = newPosition.nodeBefore;\r\n        const nodeAfter = newPosition.nodeAfter;\r\n        if (nodeBefore instanceof Text && nodeAfter instanceof Text) {\r\n            return mergeTextNodes(nodeBefore, nodeAfter);\r\n        }\r\n        // If position is next to text node - move position inside.\r\n        return movePositionToTextNode(newPosition);\r\n    }\r\n    /**\r\n     * Wraps one {@link module:engine/view/attributeelement~AttributeElement AttributeElement} into another by\r\n     * merging them if possible. When merging is possible - all attributes, styles and classes are moved from wrapper\r\n     * element to element being wrapped.\r\n     *\r\n     * @param wrapper Wrapper AttributeElement.\r\n     * @param toWrap AttributeElement to wrap using wrapper element.\r\n     * @returns Returns `true` if elements are merged.\r\n     */\r\n    _wrapAttributeElement(wrapper, toWrap) {\r\n        if (!canBeJoined(wrapper, toWrap)) {\r\n            return false;\r\n        }\r\n        // Can't merge if name or priority differs.\r\n        if (wrapper.name !== toWrap.name || wrapper.priority !== toWrap.priority) {\r\n            return false;\r\n        }\r\n        // Check if attributes can be merged.\r\n        for (const key of wrapper.getAttributeKeys()) {\r\n            // Classes and styles should be checked separately.\r\n            if (key === 'class' || key === 'style') {\r\n                continue;\r\n            }\r\n            // If some attributes are different we cannot wrap.\r\n            if (toWrap.hasAttribute(key) && toWrap.getAttribute(key) !== wrapper.getAttribute(key)) {\r\n                return false;\r\n            }\r\n        }\r\n        // Check if styles can be merged.\r\n        for (const key of wrapper.getStyleNames()) {\r\n            if (toWrap.hasStyle(key) && toWrap.getStyle(key) !== wrapper.getStyle(key)) {\r\n                return false;\r\n            }\r\n        }\r\n        // Move all attributes/classes/styles from wrapper to wrapped AttributeElement.\r\n        for (const key of wrapper.getAttributeKeys()) {\r\n            // Classes and styles should be checked separately.\r\n            if (key === 'class' || key === 'style') {\r\n                continue;\r\n            }\r\n            // Move only these attributes that are not present - other are similar.\r\n            if (!toWrap.hasAttribute(key)) {\r\n                this.setAttribute(key, wrapper.getAttribute(key), toWrap);\r\n            }\r\n        }\r\n        for (const key of wrapper.getStyleNames()) {\r\n            if (!toWrap.hasStyle(key)) {\r\n                this.setStyle(key, wrapper.getStyle(key), toWrap);\r\n            }\r\n        }\r\n        for (const key of wrapper.getClassNames()) {\r\n            if (!toWrap.hasClass(key)) {\r\n                this.addClass(key, toWrap);\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n    /**\r\n     * Unwraps {@link module:engine/view/attributeelement~AttributeElement AttributeElement} from another by removing\r\n     * corresponding attributes, classes and styles. All attributes, classes and styles from wrapper should be present\r\n     * inside element being unwrapped.\r\n     *\r\n     * @param wrapper Wrapper AttributeElement.\r\n     * @param toUnwrap AttributeElement to unwrap using wrapper element.\r\n     * @returns Returns `true` if elements are unwrapped.\r\n     **/\r\n    _unwrapAttributeElement(wrapper, toUnwrap) {\r\n        if (!canBeJoined(wrapper, toUnwrap)) {\r\n            return false;\r\n        }\r\n        // Can't unwrap if name or priority differs.\r\n        if (wrapper.name !== toUnwrap.name || wrapper.priority !== toUnwrap.priority) {\r\n            return false;\r\n        }\r\n        // Check if AttributeElement has all wrapper attributes.\r\n        for (const key of wrapper.getAttributeKeys()) {\r\n            // Classes and styles should be checked separately.\r\n            if (key === 'class' || key === 'style') {\r\n                continue;\r\n            }\r\n            // If some attributes are missing or different we cannot unwrap.\r\n            if (!toUnwrap.hasAttribute(key) || toUnwrap.getAttribute(key) !== wrapper.getAttribute(key)) {\r\n                return false;\r\n            }\r\n        }\r\n        // Check if AttributeElement has all wrapper classes.\r\n        if (!toUnwrap.hasClass(...wrapper.getClassNames())) {\r\n            return false;\r\n        }\r\n        // Check if AttributeElement has all wrapper styles.\r\n        for (const key of wrapper.getStyleNames()) {\r\n            // If some styles are missing or different we cannot unwrap.\r\n            if (!toUnwrap.hasStyle(key) || toUnwrap.getStyle(key) !== wrapper.getStyle(key)) {\r\n                return false;\r\n            }\r\n        }\r\n        // Remove all wrapper's attributes from unwrapped element.\r\n        for (const key of wrapper.getAttributeKeys()) {\r\n            // Classes and styles should be checked separately.\r\n            if (key === 'class' || key === 'style') {\r\n                continue;\r\n            }\r\n            this.removeAttribute(key, toUnwrap);\r\n        }\r\n        // Remove all wrapper's classes from unwrapped element.\r\n        this.removeClass(Array.from(wrapper.getClassNames()), toUnwrap);\r\n        // Remove all wrapper's styles from unwrapped element.\r\n        this.removeStyle(Array.from(wrapper.getStyleNames()), toUnwrap);\r\n        return true;\r\n    }\r\n    /**\r\n     * Helper function used by other `DowncastWriter` methods. Breaks attribute elements at the boundaries of given range.\r\n     *\r\n     * @param range Range which `start` and `end` positions will be used to break attributes.\r\n     * @param forceSplitText If set to `true`, will break text nodes even if they are directly in container element.\r\n     * This behavior will result in incorrect view state, but is needed by other view writing methods which then fixes view state.\r\n     * @returns New range with located at break positions.\r\n     */\r\n    _breakAttributesRange(range, forceSplitText = false) {\r\n        const rangeStart = range.start;\r\n        const rangeEnd = range.end;\r\n        validateRangeContainer(range, this.document);\r\n        // Break at the collapsed position. Return new collapsed range.\r\n        if (range.isCollapsed) {\r\n            const position = this._breakAttributes(range.start, forceSplitText);\r\n            return new Range(position, position);\r\n        }\r\n        const breakEnd = this._breakAttributes(rangeEnd, forceSplitText);\r\n        const count = breakEnd.parent.childCount;\r\n        const breakStart = this._breakAttributes(rangeStart, forceSplitText);\r\n        // Calculate new break end offset.\r\n        breakEnd.offset += breakEnd.parent.childCount - count;\r\n        return new Range(breakStart, breakEnd);\r\n    }\r\n    /**\r\n     * Helper function used by other `DowncastWriter` methods. Breaks attribute elements at given position.\r\n     *\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-cannot-break-empty-element` when break position\r\n     * is placed inside {@link module:engine/view/emptyelement~EmptyElement EmptyElement}.\r\n     *\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-cannot-break-ui-element` when break position\r\n     * is placed inside {@link module:engine/view/uielement~UIElement UIElement}.\r\n     *\r\n     * @param position Position where to break attributes.\r\n     * @param forceSplitText If set to `true`, will break text nodes even if they are directly in container element.\r\n     * This behavior will result in incorrect view state, but is needed by other view writing methods which then fixes view state.\r\n     * @returns New position after breaking the attributes.\r\n     */\r\n    _breakAttributes(position, forceSplitText = false) {\r\n        const positionOffset = position.offset;\r\n        const positionParent = position.parent;\r\n        // If position is placed inside EmptyElement - throw an exception as we cannot break inside.\r\n        if (position.parent.is('emptyElement')) {\r\n            /**\r\n             * Cannot break an `EmptyElement` instance.\r\n             *\r\n             * This error is thrown if\r\n             * {@link module:engine/view/downcastwriter~DowncastWriter#breakAttributes `DowncastWriter#breakAttributes()`}\r\n             * was executed in an incorrect position.\r\n             *\r\n             * @error view-writer-cannot-break-empty-element\r\n             */\r\n            throw new CKEditorError('view-writer-cannot-break-empty-element', this.document);\r\n        }\r\n        // If position is placed inside UIElement - throw an exception as we cannot break inside.\r\n        if (position.parent.is('uiElement')) {\r\n            /**\r\n             * Cannot break a `UIElement` instance.\r\n             *\r\n             * This error is thrown if\r\n             * {@link module:engine/view/downcastwriter~DowncastWriter#breakAttributes `DowncastWriter#breakAttributes()`}\r\n             * was executed in an incorrect position.\r\n             *\r\n             * @error view-writer-cannot-break-ui-element\r\n             */\r\n            throw new CKEditorError('view-writer-cannot-break-ui-element', this.document);\r\n        }\r\n        // If position is placed inside RawElement - throw an exception as we cannot break inside.\r\n        if (position.parent.is('rawElement')) {\r\n            /**\r\n             * Cannot break a `RawElement` instance.\r\n             *\r\n             * This error is thrown if\r\n             * {@link module:engine/view/downcastwriter~DowncastWriter#breakAttributes `DowncastWriter#breakAttributes()`}\r\n             * was executed in an incorrect position.\r\n             *\r\n             * @error view-writer-cannot-break-raw-element\r\n             */\r\n            throw new CKEditorError('view-writer-cannot-break-raw-element', this.document);\r\n        }\r\n        // There are no attributes to break and text nodes breaking is not forced.\r\n        if (!forceSplitText && positionParent.is('$text') && isContainerOrFragment(positionParent.parent)) {\r\n            return position.clone();\r\n        }\r\n        // Position's parent is container, so no attributes to break.\r\n        if (isContainerOrFragment(positionParent)) {\r\n            return position.clone();\r\n        }\r\n        // Break text and start again in new position.\r\n        if (positionParent.is('$text')) {\r\n            return this._breakAttributes(breakTextNode(position), forceSplitText);\r\n        }\r\n        const length = positionParent.childCount;\r\n        // <p>foo<b><u>bar{}</u></b></p>\r\n        // <p>foo<b><u>bar</u>[]</b></p>\r\n        // <p>foo<b><u>bar</u></b>[]</p>\r\n        if (positionOffset == length) {\r\n            const newPosition = new Position(positionParent.parent, positionParent.index + 1);\r\n            return this._breakAttributes(newPosition, forceSplitText);\r\n        }\r\n        else {\r\n            // <p>foo<b><u>{}bar</u></b></p>\r\n            // <p>foo<b>[]<u>bar</u></b></p>\r\n            // <p>foo{}<b><u>bar</u></b></p>\r\n            if (positionOffset === 0) {\r\n                const newPosition = new Position(positionParent.parent, positionParent.index);\r\n                return this._breakAttributes(newPosition, forceSplitText);\r\n            }\r\n            // <p>foo<b><u>b{}ar</u></b></p>\r\n            // <p>foo<b><u>b[]ar</u></b></p>\r\n            // <p>foo<b><u>b</u>[]<u>ar</u></b></p>\r\n            // <p>foo<b><u>b</u></b>[]<b><u>ar</u></b></p>\r\n            else {\r\n                const offsetAfter = positionParent.index + 1;\r\n                // Break element.\r\n                const clonedNode = positionParent._clone();\r\n                // Insert cloned node to position's parent node.\r\n                positionParent.parent._insertChild(offsetAfter, clonedNode);\r\n                this._addToClonedElementsGroup(clonedNode);\r\n                // Get nodes to move.\r\n                const count = positionParent.childCount - positionOffset;\r\n                const nodesToMove = positionParent._removeChildren(positionOffset, count);\r\n                // Move nodes to cloned node.\r\n                clonedNode._appendChild(nodesToMove);\r\n                // Create new position to work on.\r\n                const newPosition = new Position(positionParent.parent, offsetAfter);\r\n                return this._breakAttributes(newPosition, forceSplitText);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Stores the information that an {@link module:engine/view/attributeelement~AttributeElement attribute element} was\r\n     * added to the tree. Saves the reference to the group in the given element and updates the group, so other elements\r\n     * from the group now keep a reference to the given attribute element.\r\n     *\r\n     * The clones group can be obtained using {@link module:engine/view/attributeelement~AttributeElement#getElementsWithSameId}.\r\n     *\r\n     * Does nothing if added element has no {@link module:engine/view/attributeelement~AttributeElement#id id}.\r\n     *\r\n     * @param element Attribute element to save.\r\n     */\r\n    _addToClonedElementsGroup(element) {\r\n        // Add only if the element is in document tree.\r\n        if (!element.root.is('rootElement')) {\r\n            return;\r\n        }\r\n        // Traverse the element's children recursively to find other attribute elements that also might got inserted.\r\n        // The loop is at the beginning so we can make fast returns later in the code.\r\n        if (element.is('element')) {\r\n            for (const child of element.getChildren()) {\r\n                this._addToClonedElementsGroup(child);\r\n            }\r\n        }\r\n        const id = element.id;\r\n        if (!id) {\r\n            return;\r\n        }\r\n        let group = this._cloneGroups.get(id);\r\n        if (!group) {\r\n            group = new Set();\r\n            this._cloneGroups.set(id, group);\r\n        }\r\n        group.add(element);\r\n        element._clonesGroup = group;\r\n    }\r\n    /**\r\n     * Removes all the information about the given {@link module:engine/view/attributeelement~AttributeElement attribute element}\r\n     * from its clones group.\r\n     *\r\n     * Keep in mind, that the element will still keep a reference to the group (but the group will not keep a reference to it).\r\n     * This allows to reference the whole group even if the element was already removed from the tree.\r\n     *\r\n     * Does nothing if the element has no {@link module:engine/view/attributeelement~AttributeElement#id id}.\r\n     *\r\n     * @param element Attribute element to remove.\r\n     */\r\n    _removeFromClonedElementsGroup(element) {\r\n        // Traverse the element's children recursively to find other attribute elements that also got removed.\r\n        // The loop is at the beginning so we can make fast returns later in the code.\r\n        if (element.is('element')) {\r\n            for (const child of element.getChildren()) {\r\n                this._removeFromClonedElementsGroup(child);\r\n            }\r\n        }\r\n        const id = element.id;\r\n        if (!id) {\r\n            return;\r\n        }\r\n        const group = this._cloneGroups.get(id);\r\n        if (!group) {\r\n            return;\r\n        }\r\n        group.delete(element);\r\n        // Not removing group from element on purpose!\r\n        // If other parts of code have reference to this element, they will be able to get references to other elements from the group.\r\n    }\r\n}\r\n// Helper function for `view.writer.wrap`. Checks if given element has any children that are not ui elements.\r\nfunction _hasNonUiChildren(parent) {\r\n    return Array.from(parent.getChildren()).some(child => !child.is('uiElement'));\r\n}\r\n/**\r\n * The `attribute` passed to {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#wrap()`}\r\n * must be an instance of {@link module:engine/view/attributeelement~AttributeElement `AttributeElement`}.\r\n *\r\n * @error view-writer-wrap-invalid-attribute\r\n */\r\n/**\r\n * Returns first parent container of specified {@link module:engine/view/position~Position Position}.\r\n * Position's parent node is checked as first, then next parents are checked.\r\n * Note that {@link module:engine/view/documentfragment~DocumentFragment DocumentFragment} is treated like a container.\r\n *\r\n * @param position Position used as a start point to locate parent container.\r\n * @returns Parent container element or `undefined` if container is not found.\r\n */\r\nfunction getParentContainer(position) {\r\n    let parent = position.parent;\r\n    while (!isContainerOrFragment(parent)) {\r\n        if (!parent) {\r\n            return undefined;\r\n        }\r\n        parent = parent.parent;\r\n    }\r\n    return parent;\r\n}\r\n/**\r\n * Checks if first {@link module:engine/view/attributeelement~AttributeElement AttributeElement} provided to the function\r\n * can be wrapped outside second element. It is done by comparing elements'\r\n * {@link module:engine/view/attributeelement~AttributeElement#priority priorities}, if both have same priority\r\n * {@link module:engine/view/element~Element#getIdentity identities} are compared.\r\n */\r\nfunction shouldABeOutsideB(a, b) {\r\n    if (a.priority < b.priority) {\r\n        return true;\r\n    }\r\n    else if (a.priority > b.priority) {\r\n        return false;\r\n    }\r\n    // When priorities are equal and names are different - use identities.\r\n    return a.getIdentity() < b.getIdentity();\r\n}\r\n/**\r\n * Returns new position that is moved to near text node. Returns same position if there is no text node before of after\r\n * specified position.\r\n *\r\n * ```html\r\n * <p>foo[]</p>  ->  <p>foo{}</p>\r\n * <p>[]foo</p>  ->  <p>{}foo</p>\r\n * ```\r\n *\r\n * @returns Position located inside text node or same position if there is no text nodes\r\n * before or after position location.\r\n */\r\nfunction movePositionToTextNode(position) {\r\n    const nodeBefore = position.nodeBefore;\r\n    if (nodeBefore && nodeBefore.is('$text')) {\r\n        return new Position(nodeBefore, nodeBefore.data.length);\r\n    }\r\n    const nodeAfter = position.nodeAfter;\r\n    if (nodeAfter && nodeAfter.is('$text')) {\r\n        return new Position(nodeAfter, 0);\r\n    }\r\n    return position;\r\n}\r\n/**\r\n * Breaks text node into two text nodes when possible.\r\n *\r\n * ```html\r\n * <p>foo{}bar</p> -> <p>foo[]bar</p>\r\n * <p>{}foobar</p> -> <p>[]foobar</p>\r\n * <p>foobar{}</p> -> <p>foobar[]</p>\r\n * ```\r\n *\r\n * @param position Position that need to be placed inside text node.\r\n * @returns New position after breaking text node.\r\n */\r\nfunction breakTextNode(position) {\r\n    if (position.offset == position.parent.data.length) {\r\n        return new Position(position.parent.parent, position.parent.index + 1);\r\n    }\r\n    if (position.offset === 0) {\r\n        return new Position(position.parent.parent, position.parent.index);\r\n    }\r\n    // Get part of the text that need to be moved.\r\n    const textToMove = position.parent.data.slice(position.offset);\r\n    // Leave rest of the text in position's parent.\r\n    position.parent._data = position.parent.data.slice(0, position.offset);\r\n    // Insert new text node after position's parent text node.\r\n    position.parent.parent._insertChild(position.parent.index + 1, new Text(position.root.document, textToMove));\r\n    // Return new position between two newly created text nodes.\r\n    return new Position(position.parent.parent, position.parent.index + 1);\r\n}\r\n/**\r\n * Merges two text nodes into first node. Removes second node and returns merge position.\r\n *\r\n * @param t1 First text node to merge. Data from second text node will be moved at the end of this text node.\r\n * @param t2 Second text node to merge. This node will be removed after merging.\r\n * @returns Position after merging text nodes.\r\n */\r\nfunction mergeTextNodes(t1, t2) {\r\n    // Merge text data into first text node and remove second one.\r\n    const nodeBeforeLength = t1.data.length;\r\n    t1._data += t2.data;\r\n    t2._remove();\r\n    return new Position(t1, nodeBeforeLength);\r\n}\r\nconst validNodesToInsert = [Text, AttributeElement, ContainerElement, EmptyElement, RawElement, UIElement];\r\n/**\r\n * Checks if provided nodes are valid to insert.\r\n *\r\n * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-insert-invalid-node` when nodes to insert\r\n * contains instances that are not supported ones (see error description for valid ones.\r\n */\r\nfunction validateNodesToInsert(nodes, errorContext) {\r\n    for (const node of nodes) {\r\n        if (!validNodesToInsert.some((validNode => node instanceof validNode))) { // eslint-disable-line no-use-before-define\r\n            /**\r\n             * One of the nodes to be inserted is of an invalid type.\r\n             *\r\n             * Nodes to be inserted with {@link module:engine/view/downcastwriter~DowncastWriter#insert `DowncastWriter#insert()`} should be\r\n             * of the following types:\r\n             *\r\n             * * {@link module:engine/view/attributeelement~AttributeElement AttributeElement},\r\n             * * {@link module:engine/view/containerelement~ContainerElement ContainerElement},\r\n             * * {@link module:engine/view/emptyelement~EmptyElement EmptyElement},\r\n             * * {@link module:engine/view/uielement~UIElement UIElement},\r\n             * * {@link module:engine/view/rawelement~RawElement RawElement},\r\n             * * {@link module:engine/view/text~Text Text}.\r\n             *\r\n             * @error view-writer-insert-invalid-node-type\r\n             */\r\n            throw new CKEditorError('view-writer-insert-invalid-node-type', errorContext);\r\n        }\r\n        if (!node.is('$text')) {\r\n            validateNodesToInsert(node.getChildren(), errorContext);\r\n        }\r\n    }\r\n}\r\n/**\r\n * Checks if node is ContainerElement or DocumentFragment, because in most cases they should be treated the same way.\r\n *\r\n * @returns Returns `true` if node is instance of ContainerElement or DocumentFragment.\r\n */\r\nfunction isContainerOrFragment(node) {\r\n    return node && (node.is('containerElement') || node.is('documentFragment'));\r\n}\r\n/**\r\n * Checks if {@link module:engine/view/range~Range#start range start} and {@link module:engine/view/range~Range#end range end} are placed\r\n * inside same {@link module:engine/view/containerelement~ContainerElement container element}.\r\n * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-invalid-range-container` when validation fails.\r\n */\r\nfunction validateRangeContainer(range, errorContext) {\r\n    const startContainer = getParentContainer(range.start);\r\n    const endContainer = getParentContainer(range.end);\r\n    if (!startContainer || !endContainer || startContainer !== endContainer) {\r\n        /**\r\n         * The container of the given range is invalid.\r\n         *\r\n         * This may happen if {@link module:engine/view/range~Range#start range start} and\r\n         * {@link module:engine/view/range~Range#end range end} positions are not placed inside the same container element or\r\n         * a parent container for these positions cannot be found.\r\n         *\r\n         * Methods like {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#remove()`},\r\n         * {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#clean()`},\r\n         * {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#wrap()`},\r\n         * {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#unwrap()`} need to be called\r\n         * on a range that has its start and end positions located in the same container element. Both positions can be\r\n         * nested within other elements (e.g. an attribute element) but the closest container ancestor must be the same.\r\n         *\r\n         * @error view-writer-invalid-range-container\r\n         */\r\n        throw new CKEditorError('view-writer-invalid-range-container', errorContext);\r\n    }\r\n}\r\n/**\r\n * Checks if two attribute elements can be joined together. Elements can be joined together if, and only if\r\n * they do not have ids specified.\r\n */\r\nfunction canBeJoined(a, b) {\r\n    return a.id === null && b.id === null;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { keyCodes, isText } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Set of utilities related to handling block and inline fillers.\r\n *\r\n * Browsers do not allow to put caret in elements which does not have height. Because of it, we need to fill all\r\n * empty elements which should be selectable with elements or characters called \"fillers\". Unfortunately there is no one\r\n * universal filler, this is why two types are uses:\r\n *\r\n * * Block filler is an element which fill block elements, like `<p>`. CKEditor uses `<br>` as a block filler during the editing,\r\n * as browsers do natively. So instead of an empty `<p>` there will be `<p><br></p>`. The advantage of block filler is that\r\n * it is transparent for the selection, so when the caret is before the `<br>` and user presses right arrow he will be\r\n * moved to the next paragraph, not after the `<br>`. The disadvantage is that it breaks a block, so it can not be used\r\n * in the middle of a line of text. The {@link module:engine/view/filler~BR_FILLER `<br>` filler} can be replaced with any other\r\n * character in the data output, for instance {@link module:engine/view/filler~NBSP_FILLER non-breaking space} or\r\n * {@link module:engine/view/filler~MARKED_NBSP_FILLER marked non-breaking space}.\r\n *\r\n * * Inline filler is a filler which does not break a line of text, so it can be used inside the text, for instance in the empty\r\n * `<b>` surrendered by text: `foo<b></b>bar`, if we want to put the caret there. CKEditor uses a sequence of the zero-width\r\n * spaces as an {@link module:engine/view/filler~INLINE_FILLER inline filler} having the predetermined\r\n * {@link module:engine/view/filler~INLINE_FILLER_LENGTH length}. A sequence is used, instead of a single character to\r\n * avoid treating random zero-width spaces as the inline filler. Disadvantage of the inline filler is that it is not\r\n * transparent for the selection. The arrow key moves the caret between zero-width spaces characters, so the additional\r\n * code is needed to handle the caret.\r\n *\r\n * Both inline and block fillers are handled by the {@link module:engine/view/renderer~Renderer renderer} and are not present in the\r\n * view.\r\n *\r\n * @module engine/view/filler\r\n */\r\n/**\r\n * Non-breaking space filler creator. This function creates the `&nbsp;` text node.\r\n * It defines how the filler is created.\r\n *\r\n * @see module:engine/view/filler~MARKED_NBSP_FILLER\r\n * @see module:engine/view/filler~BR_FILLER\r\n */\r\nexport const NBSP_FILLER = (domDocument) => domDocument.createTextNode('\\u00A0');\r\n/**\r\n * Marked non-breaking space filler creator. This function creates the `<span data-cke-filler=\"true\">&nbsp;</span>` element.\r\n * It defines how the filler is created.\r\n *\r\n * @see module:engine/view/filler~NBSP_FILLER\r\n * @see module:engine/view/filler~BR_FILLER\r\n */\r\nexport const MARKED_NBSP_FILLER = (domDocument) => {\r\n    const span = domDocument.createElement('span');\r\n    span.dataset.ckeFiller = 'true';\r\n    span.innerText = '\\u00A0';\r\n    return span;\r\n};\r\n/**\r\n * `<br>` filler creator. This function creates the `<br data-cke-filler=\"true\">` element.\r\n * It defines how the filler is created.\r\n *\r\n * @see module:engine/view/filler~NBSP_FILLER\r\n * @see module:engine/view/filler~MARKED_NBSP_FILLER\r\n */\r\nexport const BR_FILLER = (domDocument) => {\r\n    const fillerBr = domDocument.createElement('br');\r\n    fillerBr.dataset.ckeFiller = 'true';\r\n    return fillerBr;\r\n};\r\n/**\r\n * Length of the {@link module:engine/view/filler~INLINE_FILLER INLINE_FILLER}.\r\n */\r\nexport const INLINE_FILLER_LENGTH = 7;\r\n/**\r\n * Inline filler which is a sequence of the word joiners.\r\n */\r\nexport const INLINE_FILLER = '\\u2060'.repeat(INLINE_FILLER_LENGTH);\r\n/**\r\n * Checks if the node is a text node which starts with the {@link module:engine/view/filler~INLINE_FILLER inline filler}.\r\n *\r\n * ```ts\r\n * startsWithFiller( document.createTextNode( INLINE_FILLER ) ); // true\r\n * startsWithFiller( document.createTextNode( INLINE_FILLER + 'foo' ) ); // true\r\n * startsWithFiller( document.createTextNode( 'foo' ) ); // false\r\n * startsWithFiller( document.createElement( 'p' ) ); // false\r\n * ```\r\n *\r\n * @param domNode DOM node.\r\n * @returns True if the text node starts with the {@link module:engine/view/filler~INLINE_FILLER inline filler}.\r\n */\r\nexport function startsWithFiller(domNode) {\r\n    return isText(domNode) && (domNode.data.substr(0, INLINE_FILLER_LENGTH) === INLINE_FILLER);\r\n}\r\n/**\r\n * Checks if the text node contains only the {@link module:engine/view/filler~INLINE_FILLER inline filler}.\r\n *\r\n * ```ts\r\n * isInlineFiller( document.createTextNode( INLINE_FILLER ) ); // true\r\n * isInlineFiller( document.createTextNode( INLINE_FILLER + 'foo' ) ); // false\r\n * ```\r\n *\r\n * @param domText DOM text node.\r\n * @returns True if the text node contains only the {@link module:engine/view/filler~INLINE_FILLER inline filler}.\r\n */\r\nexport function isInlineFiller(domText) {\r\n    return domText.data.length == INLINE_FILLER_LENGTH && startsWithFiller(domText);\r\n}\r\n/**\r\n * Get string data from the text node, removing an {@link module:engine/view/filler~INLINE_FILLER inline filler} from it,\r\n * if text node contains it.\r\n *\r\n * ```ts\r\n * getDataWithoutFiller( document.createTextNode( INLINE_FILLER + 'foo' ) ) == 'foo' // true\r\n * getDataWithoutFiller( document.createTextNode( 'foo' ) ) == 'foo' // true\r\n * ```\r\n *\r\n * @param domText DOM text node, possible with inline filler.\r\n * @returns Data without filler.\r\n */\r\nexport function getDataWithoutFiller(domText) {\r\n    if (startsWithFiller(domText)) {\r\n        return domText.data.slice(INLINE_FILLER_LENGTH);\r\n    }\r\n    else {\r\n        return domText.data;\r\n    }\r\n}\r\n/**\r\n * Assign key observer which move cursor from the end of the inline filler to the beginning of it when\r\n * the left arrow is pressed, so the filler does not break navigation.\r\n *\r\n * @param view View controller instance we should inject quirks handling on.\r\n */\r\nexport function injectQuirksHandling(view) {\r\n    view.document.on('arrowKey', jumpOverInlineFiller, { priority: 'low' });\r\n}\r\n/**\r\n * Move cursor from the end of the inline filler to the beginning of it when, so the filler does not break navigation.\r\n */\r\nfunction jumpOverInlineFiller(evt, data) {\r\n    if (data.keyCode == keyCodes.arrowleft) {\r\n        const domSelection = data.domTarget.ownerDocument.defaultView.getSelection();\r\n        if (domSelection.rangeCount == 1 && domSelection.getRangeAt(0).collapsed) {\r\n            const domParent = domSelection.getRangeAt(0).startContainer;\r\n            const domOffset = domSelection.getRangeAt(0).startOffset;\r\n            if (startsWithFiller(domParent) && domOffset <= INLINE_FILLER_LENGTH) {\r\n                domSelection.collapse(domParent, 0);\r\n            }\r\n        }\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./renderer.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/renderer\r\n */\r\nimport ViewText from './text';\r\nimport ViewPosition from './position';\r\nimport { INLINE_FILLER, INLINE_FILLER_LENGTH, startsWithFiller, isInlineFiller } from './filler';\r\nimport { CKEditorError, ObservableMixin, diff, env, fastDiff, insertAt, isComment, isNode, isText, remove } from '@ckeditor/ckeditor5-utils';\r\nimport '../../theme/renderer.css';\r\n/**\r\n * Renderer is responsible for updating the DOM structure and the DOM selection based on\r\n * the {@link module:engine/view/renderer~Renderer#markToSync information about updated view nodes}.\r\n * In other words, it renders the view to the DOM.\r\n *\r\n * Its main responsibility is to make only the necessary, minimal changes to the DOM. However, unlike in many\r\n * virtual DOM implementations, the primary reason for doing minimal changes is not the performance but ensuring\r\n * that native editing features such as text composition, autocompletion, spell checking, selection's x-index are\r\n * affected as little as possible.\r\n *\r\n * Renderer uses {@link module:engine/view/domconverter~DomConverter} to transform view nodes and positions\r\n * to and from the DOM.\r\n */\r\nexport default class Renderer extends ObservableMixin() {\r\n    /**\r\n     * Creates a renderer instance.\r\n     *\r\n     * @param domConverter Converter instance.\r\n     * @param selection View selection.\r\n     */\r\n    constructor(domConverter, selection) {\r\n        super();\r\n        /**\r\n         * Set of DOM Documents instances.\r\n         */\r\n        this.domDocuments = new Set();\r\n        /**\r\n         * Set of nodes which attributes changed and may need to be rendered.\r\n         */\r\n        this.markedAttributes = new Set();\r\n        /**\r\n         * Set of elements which child lists changed and may need to be rendered.\r\n         */\r\n        this.markedChildren = new Set();\r\n        /**\r\n         * Set of text nodes which text data changed and may need to be rendered.\r\n         */\r\n        this.markedTexts = new Set();\r\n        /**\r\n         * The text node in which the inline filler was rendered.\r\n         */\r\n        this._inlineFiller = null;\r\n        /**\r\n         * DOM element containing fake selection.\r\n         */\r\n        this._fakeSelectionContainer = null;\r\n        this.domConverter = domConverter;\r\n        this.selection = selection;\r\n        this.set('isFocused', false);\r\n        this.set('isSelecting', false);\r\n        // Rendering the selection and inline filler manipulation should be postponed in (non-Android) Blink until the user finishes\r\n        // creating the selection in DOM to avoid accidental selection collapsing\r\n        // (https://github.com/ckeditor/ckeditor5/issues/10562, https://github.com/ckeditor/ckeditor5/issues/10723).\r\n        // When the user stops selecting, all pending changes should be rendered ASAP, though.\r\n        if (env.isBlink && !env.isAndroid) {\r\n            this.on('change:isSelecting', () => {\r\n                if (!this.isSelecting) {\r\n                    this.render();\r\n                }\r\n            });\r\n        }\r\n        this.set('isComposing', false);\r\n        this.on('change:isComposing', () => {\r\n            if (!this.isComposing) {\r\n                this.render();\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Marks a view node to be updated in the DOM by {@link #render `render()`}.\r\n     *\r\n     * Note that only view nodes whose parents have corresponding DOM elements need to be marked to be synchronized.\r\n     *\r\n     * @see #markedAttributes\r\n     * @see #markedChildren\r\n     * @see #markedTexts\r\n     *\r\n     * @param type Type of the change.\r\n     * @param node ViewNode to be marked.\r\n     */\r\n    markToSync(type, node) {\r\n        if (type === 'text') {\r\n            if (this.domConverter.mapViewToDom(node.parent)) {\r\n                this.markedTexts.add(node);\r\n            }\r\n        }\r\n        else {\r\n            // If the node has no DOM element it is not rendered yet,\r\n            // its children/attributes do not need to be marked to be sync.\r\n            if (!this.domConverter.mapViewToDom(node)) {\r\n                return;\r\n            }\r\n            if (type === 'attributes') {\r\n                this.markedAttributes.add(node);\r\n            }\r\n            else if (type === 'children') {\r\n                this.markedChildren.add(node);\r\n            }\r\n            else {\r\n                // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n                const unreachable = type;\r\n                /**\r\n                 * Unknown type passed to Renderer.markToSync.\r\n                 *\r\n                 * @error view-renderer-unknown-type\r\n                 */\r\n                throw new CKEditorError('view-renderer-unknown-type', this);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Renders all buffered changes ({@link #markedAttributes}, {@link #markedChildren} and {@link #markedTexts}) and\r\n     * the current view selection (if needed) to the DOM by applying a minimal set of changes to it.\r\n     *\r\n     * Renderer tries not to break the text composition (e.g. IME) and x-index of the selection,\r\n     * so it does as little as it is needed to update the DOM.\r\n     *\r\n     * Renderer also handles {@link module:engine/view/filler fillers}. Especially, it checks if the inline filler is needed\r\n     * at the selection position and adds or removes it. To prevent breaking text composition inline filler will not be\r\n     * removed as long as the selection is in the text node which needed it at first.\r\n     */\r\n    render() {\r\n        // Ignore rendering while in the composition mode. Composition events are not cancellable and browser will modify the DOM tree.\r\n        // All marked elements, attributes, etc. will wait until next render after the composition ends.\r\n        // On Android composition events are immediately applied to the model, so we don't need to skip rendering,\r\n        // and we should not do it because the difference between view and DOM could lead to position mapping problems.\r\n        if (this.isComposing && !env.isAndroid) {\r\n            // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n            // @if CK_DEBUG_TYPING // \tconsole.info( '%c[Renderer]%c Rendering aborted while isComposing',\r\n            // @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', ''\r\n            // @if CK_DEBUG_TYPING // \t);\r\n            // @if CK_DEBUG_TYPING // }\r\n            return;\r\n        }\r\n        // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n        // @if CK_DEBUG_TYPING // \tconsole.group( '%c[Renderer]%c Rendering',\r\n        // @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', ''\r\n        // @if CK_DEBUG_TYPING // \t);\r\n        // @if CK_DEBUG_TYPING // }\r\n        let inlineFillerPosition = null;\r\n        const isInlineFillerRenderingPossible = env.isBlink && !env.isAndroid ? !this.isSelecting : true;\r\n        // Refresh mappings.\r\n        for (const element of this.markedChildren) {\r\n            this._updateChildrenMappings(element);\r\n        }\r\n        // Don't manipulate inline fillers while the selection is being made in (non-Android) Blink to prevent accidental\r\n        // DOM selection collapsing\r\n        // (https://github.com/ckeditor/ckeditor5/issues/10562, https://github.com/ckeditor/ckeditor5/issues/10723).\r\n        if (isInlineFillerRenderingPossible) {\r\n            // There was inline filler rendered in the DOM but it's not\r\n            // at the selection position any more, so we can remove it\r\n            // (cause even if it's needed, it must be placed in another location).\r\n            if (this._inlineFiller && !this._isSelectionInInlineFiller()) {\r\n                this._removeInlineFiller();\r\n            }\r\n            // If we've got the filler, let's try to guess its position in the view.\r\n            if (this._inlineFiller) {\r\n                inlineFillerPosition = this._getInlineFillerPosition();\r\n            }\r\n            // Otherwise, if it's needed, create it at the selection position.\r\n            else if (this._needsInlineFillerAtSelection()) {\r\n                inlineFillerPosition = this.selection.getFirstPosition();\r\n                // Do not use `markToSync` so it will be added even if the parent is already added.\r\n                this.markedChildren.add(inlineFillerPosition.parent);\r\n            }\r\n        }\r\n        // Make sure the inline filler has any parent, so it can be mapped to view position by DomConverter.\r\n        else if (this._inlineFiller && this._inlineFiller.parentNode) {\r\n            // While the user is making selection, preserve the inline filler at its original position.\r\n            inlineFillerPosition = this.domConverter.domPositionToView(this._inlineFiller);\r\n            // While down-casting the document selection attributes, all existing empty\r\n            // attribute elements (for selection position) are removed from the view and DOM,\r\n            // so make sure that we were able to map filler position.\r\n            // https://github.com/ckeditor/ckeditor5/issues/12026\r\n            if (inlineFillerPosition && inlineFillerPosition.parent.is('$text')) {\r\n                // The inline filler position is expected to be before the text node.\r\n                inlineFillerPosition = ViewPosition._createBefore(inlineFillerPosition.parent);\r\n            }\r\n        }\r\n        for (const element of this.markedAttributes) {\r\n            this._updateAttrs(element);\r\n        }\r\n        for (const element of this.markedChildren) {\r\n            this._updateChildren(element, { inlineFillerPosition });\r\n        }\r\n        for (const node of this.markedTexts) {\r\n            if (!this.markedChildren.has(node.parent) && this.domConverter.mapViewToDom(node.parent)) {\r\n                this._updateText(node, { inlineFillerPosition });\r\n            }\r\n        }\r\n        // * Check whether the inline filler is required and where it really is in the DOM.\r\n        //   At this point in most cases it will be in the DOM, but there are exceptions.\r\n        //   For example, if the inline filler was deep in the created DOM structure, it will not be created.\r\n        //   Similarly, if it was removed at the beginning of this function and then neither text nor children were updated,\r\n        //   it will not be present. Fix those and similar scenarios.\r\n        // * Don't manipulate inline fillers while the selection is being made in (non-Android) Blink to prevent accidental\r\n        //   DOM selection collapsing\r\n        //   (https://github.com/ckeditor/ckeditor5/issues/10562, https://github.com/ckeditor/ckeditor5/issues/10723).\r\n        if (isInlineFillerRenderingPossible) {\r\n            if (inlineFillerPosition) {\r\n                const fillerDomPosition = this.domConverter.viewPositionToDom(inlineFillerPosition);\r\n                const domDocument = fillerDomPosition.parent.ownerDocument;\r\n                if (!startsWithFiller(fillerDomPosition.parent)) {\r\n                    // Filler has not been created at filler position. Create it now.\r\n                    this._inlineFiller = addInlineFiller(domDocument, fillerDomPosition.parent, fillerDomPosition.offset);\r\n                }\r\n                else {\r\n                    // Filler has been found, save it.\r\n                    this._inlineFiller = fillerDomPosition.parent;\r\n                }\r\n            }\r\n            else {\r\n                // There is no filler needed.\r\n                this._inlineFiller = null;\r\n            }\r\n        }\r\n        // First focus the new editing host, then update the selection.\r\n        // Otherwise, FF may throw an error (https://github.com/ckeditor/ckeditor5/issues/721).\r\n        this._updateFocus();\r\n        this._updateSelection();\r\n        this.markedTexts.clear();\r\n        this.markedAttributes.clear();\r\n        this.markedChildren.clear();\r\n        // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n        // @if CK_DEBUG_TYPING // \tconsole.groupEnd();\r\n        // @if CK_DEBUG_TYPING // }\r\n    }\r\n    /**\r\n     * Updates mappings of view element's children.\r\n     *\r\n     * Children that were replaced in the view structure by similar elements (same tag name) are treated as 'replaced'.\r\n     * This means that their mappings can be updated so the new view elements are mapped to the existing DOM elements.\r\n     * Thanks to that these elements do not need to be re-rendered completely.\r\n     *\r\n     * @param viewElement The view element whose children mappings will be updated.\r\n     */\r\n    _updateChildrenMappings(viewElement) {\r\n        const domElement = this.domConverter.mapViewToDom(viewElement);\r\n        if (!domElement) {\r\n            // If there is no `domElement` it means that it was already removed from DOM and there is no need to process it.\r\n            return;\r\n        }\r\n        // Removing nodes from the DOM as we iterate can cause `actualDomChildren`\r\n        // (which is a live-updating `NodeList`) to get out of sync with the\r\n        // indices that we compute as we iterate over `actions`.\r\n        // This would produce incorrect element mappings.\r\n        //\r\n        // Converting live list to an array to make the list static.\r\n        const actualDomChildren = Array.from(this.domConverter.mapViewToDom(viewElement).childNodes);\r\n        const expectedDomChildren = Array.from(this.domConverter.viewChildrenToDom(viewElement, { withChildren: false }));\r\n        const diff = this._diffNodeLists(actualDomChildren, expectedDomChildren);\r\n        const actions = this._findUpdateActions(diff, actualDomChildren, expectedDomChildren, areSimilarElements);\r\n        if (actions.indexOf('update') !== -1) {\r\n            const counter = { equal: 0, insert: 0, delete: 0 };\r\n            for (const action of actions) {\r\n                if (action === 'update') {\r\n                    const insertIndex = counter.equal + counter.insert;\r\n                    const deleteIndex = counter.equal + counter.delete;\r\n                    const viewChild = viewElement.getChild(insertIndex);\r\n                    // UIElement and RawElement are special cases. Their children are not stored in a view (#799)\r\n                    // so we cannot use them with replacing flow (since they use view children during rendering\r\n                    // which will always result in rendering empty elements).\r\n                    if (viewChild && !(viewChild.is('uiElement') || viewChild.is('rawElement'))) {\r\n                        this._updateElementMappings(viewChild, actualDomChildren[deleteIndex]);\r\n                    }\r\n                    remove(expectedDomChildren[insertIndex]);\r\n                    counter.equal++;\r\n                }\r\n                else {\r\n                    counter[action]++;\r\n                }\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Updates mappings of a given view element.\r\n     *\r\n     * @param viewElement The view element whose mappings will be updated.\r\n     * @param domElement The DOM element representing the given view element.\r\n     */\r\n    _updateElementMappings(viewElement, domElement) {\r\n        // Remap 'DomConverter' bindings.\r\n        this.domConverter.unbindDomElement(domElement);\r\n        this.domConverter.bindElements(domElement, viewElement);\r\n        // View element may have children which needs to be updated, but are not marked, mark them to update.\r\n        this.markedChildren.add(viewElement);\r\n        // Because we replace new view element mapping with the existing one, the corresponding DOM element\r\n        // will not be rerendered. The new view element may have different attributes than the previous one.\r\n        // Since its corresponding DOM element will not be rerendered, new attributes will not be added\r\n        // to the DOM, so we need to mark it here to make sure its attributes gets updated. See #1427 for more\r\n        // detailed case study.\r\n        // Also there are cases where replaced element is removed from the view structure and then has\r\n        // its attributes changed or removed. In such cases the element will not be present in `markedAttributes`\r\n        // and also may be the same (`element.isSimilar()`) as the reused element not having its attributes updated.\r\n        // To prevent such situations we always mark reused element to have its attributes rerenderd (#1560).\r\n        this.markedAttributes.add(viewElement);\r\n    }\r\n    /**\r\n     * Gets the position of the inline filler based on the current selection.\r\n     * Here, we assume that we know that the filler is needed and\r\n     * {@link #_isSelectionInInlineFiller is at the selection position}, and, since it is needed,\r\n     * it is somewhere at the selection position.\r\n     *\r\n     * Note: The filler position cannot be restored based on the filler's DOM text node, because\r\n     * when this method is called (before rendering), the bindings will often be broken. View-to-DOM\r\n     * bindings are only dependable after rendering.\r\n     */\r\n    _getInlineFillerPosition() {\r\n        const firstPos = this.selection.getFirstPosition();\r\n        if (firstPos.parent.is('$text')) {\r\n            return ViewPosition._createBefore(firstPos.parent);\r\n        }\r\n        else {\r\n            return firstPos;\r\n        }\r\n    }\r\n    /**\r\n     * Returns `true` if the selection has not left the inline filler's text node.\r\n     * If it is `true`, it means that the filler had been added for a reason and the selection did not\r\n     * leave the filler's text node. For example, the user can be in the middle of a composition so it should not be touched.\r\n     *\r\n     * @returns `true` if the inline filler and selection are in the same place.\r\n     */\r\n    _isSelectionInInlineFiller() {\r\n        if (this.selection.rangeCount != 1 || !this.selection.isCollapsed) {\r\n            return false;\r\n        }\r\n        // Note, we can't check if selection's position equals position of the\r\n        // this._inlineFiller node, because of #663. We may not be able to calculate\r\n        // the filler's position in the view at this stage.\r\n        // Instead, we check it the other way – whether selection is anchored in\r\n        // that text node or next to it.\r\n        // Possible options are:\r\n        // \"FILLER{}\"\r\n        // \"FILLERadded-text{}\"\r\n        const selectionPosition = this.selection.getFirstPosition();\r\n        const position = this.domConverter.viewPositionToDom(selectionPosition);\r\n        if (position && isText(position.parent) && startsWithFiller(position.parent)) {\r\n            return true;\r\n        }\r\n        return false;\r\n    }\r\n    /**\r\n     * Removes the inline filler.\r\n     */\r\n    _removeInlineFiller() {\r\n        const domFillerNode = this._inlineFiller;\r\n        // Something weird happened and the stored node doesn't contain the filler's text.\r\n        if (!startsWithFiller(domFillerNode)) {\r\n            /**\r\n             * The inline filler node was lost. Most likely, something overwrote the filler text node\r\n             * in the DOM.\r\n             *\r\n             * @error view-renderer-filler-was-lost\r\n             */\r\n            throw new CKEditorError('view-renderer-filler-was-lost', this);\r\n        }\r\n        if (isInlineFiller(domFillerNode)) {\r\n            domFillerNode.remove();\r\n        }\r\n        else {\r\n            domFillerNode.data = domFillerNode.data.substr(INLINE_FILLER_LENGTH);\r\n        }\r\n        this._inlineFiller = null;\r\n    }\r\n    /**\r\n     * Checks if the inline {@link module:engine/view/filler filler} should be added.\r\n     *\r\n     * @returns `true` if the inline filler should be added.\r\n     */\r\n    _needsInlineFillerAtSelection() {\r\n        if (this.selection.rangeCount != 1 || !this.selection.isCollapsed) {\r\n            return false;\r\n        }\r\n        const selectionPosition = this.selection.getFirstPosition();\r\n        const selectionParent = selectionPosition.parent;\r\n        const selectionOffset = selectionPosition.offset;\r\n        // If there is no DOM root we do not care about fillers.\r\n        if (!this.domConverter.mapViewToDom(selectionParent.root)) {\r\n            return false;\r\n        }\r\n        if (!(selectionParent.is('element'))) {\r\n            return false;\r\n        }\r\n        // Prevent adding inline filler inside elements with contenteditable=false.\r\n        // https://github.com/ckeditor/ckeditor5-engine/issues/1170\r\n        if (!isEditable(selectionParent)) {\r\n            return false;\r\n        }\r\n        // We have block filler, we do not need inline one.\r\n        if (selectionOffset === selectionParent.getFillerOffset()) {\r\n            return false;\r\n        }\r\n        const nodeBefore = selectionPosition.nodeBefore;\r\n        const nodeAfter = selectionPosition.nodeAfter;\r\n        if (nodeBefore instanceof ViewText || nodeAfter instanceof ViewText) {\r\n            return false;\r\n        }\r\n        // Do not use inline filler while typing outside inline elements on Android.\r\n        // The deleteContentBackward would remove part of the inline filler instead of removing last letter in a link.\r\n        if (env.isAndroid && (nodeBefore || nodeAfter)) {\r\n            return false;\r\n        }\r\n        return true;\r\n    }\r\n    /**\r\n     * Checks if text needs to be updated and possibly updates it.\r\n     *\r\n     * @param viewText View text to update.\r\n     * @param options.inlineFillerPosition The position where the inline filler should be rendered.\r\n     */\r\n    _updateText(viewText, options) {\r\n        const domText = this.domConverter.findCorrespondingDomText(viewText);\r\n        const newDomText = this.domConverter.viewToDom(viewText);\r\n        let expectedText = newDomText.data;\r\n        const filler = options.inlineFillerPosition;\r\n        if (filler && filler.parent == viewText.parent && filler.offset == viewText.index) {\r\n            expectedText = INLINE_FILLER + expectedText;\r\n        }\r\n        // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n        // @if CK_DEBUG_TYPING // \tconsole.group( '%c[Renderer]%c Update text',\r\n        // @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', ''\r\n        // @if CK_DEBUG_TYPING // \t);\r\n        // @if CK_DEBUG_TYPING // }\r\n        updateTextNode(domText, expectedText);\r\n        // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n        // @if CK_DEBUG_TYPING // \tconsole.groupEnd();\r\n        // @if CK_DEBUG_TYPING // }\r\n    }\r\n    /**\r\n     * Checks if attribute list needs to be updated and possibly updates it.\r\n     *\r\n     * @param viewElement The view element to update.\r\n     */\r\n    _updateAttrs(viewElement) {\r\n        const domElement = this.domConverter.mapViewToDom(viewElement);\r\n        if (!domElement) {\r\n            // If there is no `domElement` it means that 'viewElement' is outdated as its mapping was updated\r\n            // in 'this._updateChildrenMappings()'. There is no need to process it as new view element which\r\n            // replaced old 'viewElement' mapping was also added to 'this.markedAttributes'\r\n            // in 'this._updateChildrenMappings()' so it will be processed separately.\r\n            return;\r\n        }\r\n        const domAttrKeys = Array.from(domElement.attributes).map(attr => attr.name);\r\n        const viewAttrKeys = viewElement.getAttributeKeys();\r\n        // Add or overwrite attributes.\r\n        for (const key of viewAttrKeys) {\r\n            this.domConverter.setDomElementAttribute(domElement, key, viewElement.getAttribute(key), viewElement);\r\n        }\r\n        // Remove from DOM attributes which do not exists in the view.\r\n        for (const key of domAttrKeys) {\r\n            // All other attributes not present in the DOM should be removed.\r\n            if (!viewElement.hasAttribute(key)) {\r\n                this.domConverter.removeDomElementAttribute(domElement, key);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Checks if elements child list needs to be updated and possibly updates it.\r\n     *\r\n     * Note that on Android, to reduce the risk of composition breaks, it tries to update data of an existing\r\n     * child text nodes instead of replacing them completely.\r\n     *\r\n     * @param viewElement View element to update.\r\n     * @param options.inlineFillerPosition The position where the inline filler should be rendered.\r\n     */\r\n    _updateChildren(viewElement, options) {\r\n        const domElement = this.domConverter.mapViewToDom(viewElement);\r\n        if (!domElement) {\r\n            // If there is no `domElement` it means that it was already removed from DOM.\r\n            // There is no need to process it. It will be processed when re-inserted.\r\n            return;\r\n        }\r\n        // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n        // @if CK_DEBUG_TYPING // \tconsole.group( '%c[Renderer]%c Update children',\r\n        // @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', ''\r\n        // @if CK_DEBUG_TYPING // \t);\r\n        // @if CK_DEBUG_TYPING // }\r\n        // IME on Android inserts a new text node while typing after a link\r\n        // instead of updating an existing text node that follows the link.\r\n        // We must normalize those text nodes so the diff won't get confused.\r\n        // https://github.com/ckeditor/ckeditor5/issues/12574.\r\n        if (env.isAndroid) {\r\n            let previousDomNode = null;\r\n            for (const domNode of Array.from(domElement.childNodes)) {\r\n                if (previousDomNode && isText(previousDomNode) && isText(domNode)) {\r\n                    domElement.normalize();\r\n                    break;\r\n                }\r\n                previousDomNode = domNode;\r\n            }\r\n        }\r\n        const inlineFillerPosition = options.inlineFillerPosition;\r\n        const actualDomChildren = domElement.childNodes;\r\n        const expectedDomChildren = Array.from(this.domConverter.viewChildrenToDom(viewElement, { bind: true }));\r\n        // Inline filler element has to be created as it is present in the DOM, but not in the view. It is required\r\n        // during diffing so text nodes could be compared correctly and also during rendering to maintain\r\n        // proper order and indexes while updating the DOM.\r\n        if (inlineFillerPosition && inlineFillerPosition.parent === viewElement) {\r\n            addInlineFiller(domElement.ownerDocument, expectedDomChildren, inlineFillerPosition.offset);\r\n        }\r\n        const diff = this._diffNodeLists(actualDomChildren, expectedDomChildren);\r\n        // We need to make sure that we update the existing text node and not replace it with another one.\r\n        // The composition and different \"language\" browser extensions are fragile to text node being completely replaced.\r\n        const actions = this._findUpdateActions(diff, actualDomChildren, expectedDomChildren, areTextNodes);\r\n        let i = 0;\r\n        const nodesToUnbind = new Set();\r\n        // Handle deletions first.\r\n        // This is to prevent a situation where an element that already exists in `actualDomChildren` is inserted at a different\r\n        // index in `actualDomChildren`. Since `actualDomChildren` is a `NodeList`, this works like move, not like an insert,\r\n        // and it disrupts the whole algorithm. See https://github.com/ckeditor/ckeditor5/issues/6367.\r\n        //\r\n        // It doesn't matter in what order we remove or add nodes, as long as we remove and add correct nodes at correct indexes.\r\n        for (const action of actions) {\r\n            if (action === 'delete') {\r\n                // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n                // @if CK_DEBUG_TYPING // \tconsole.info( '%c[Renderer]%c Remove node',\r\n                // @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', '', actualDomChildren[ i ]\r\n                // @if CK_DEBUG_TYPING // \t);\r\n                // @if CK_DEBUG_TYPING // }\r\n                nodesToUnbind.add(actualDomChildren[i]);\r\n                remove(actualDomChildren[i]);\r\n            }\r\n            else if (action === 'equal' || action === 'update') {\r\n                i++;\r\n            }\r\n        }\r\n        i = 0;\r\n        for (const action of actions) {\r\n            if (action === 'insert') {\r\n                // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n                // @if CK_DEBUG_TYPING // \tconsole.info( '%c[Renderer]%c Insert node',\r\n                // @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', '', expectedDomChildren[ i ]\r\n                // @if CK_DEBUG_TYPING // \t);\r\n                // @if CK_DEBUG_TYPING // }\r\n                insertAt(domElement, i, expectedDomChildren[i]);\r\n                i++;\r\n            }\r\n            // Update the existing text node data. Note that replace action is generated only for Android for now.\r\n            else if (action === 'update') {\r\n                // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n                // @if CK_DEBUG_TYPING // \tconsole.group( '%c[Renderer]%c Update text node',\r\n                // @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', ''\r\n                // @if CK_DEBUG_TYPING // \t);\r\n                // @if CK_DEBUG_TYPING // }\r\n                updateTextNode(actualDomChildren[i], expectedDomChildren[i].data);\r\n                i++;\r\n                // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n                // @if CK_DEBUG_TYPING // \tconsole.groupEnd();\r\n                // @if CK_DEBUG_TYPING // }\r\n            }\r\n            else if (action === 'equal') {\r\n                // Force updating text nodes inside elements which did not change and do not need to be re-rendered (#1125).\r\n                // Do it here (not in the loop above) because only after insertions the `i` index is correct.\r\n                this._markDescendantTextToSync(this.domConverter.domToView(expectedDomChildren[i]));\r\n                i++;\r\n            }\r\n        }\r\n        // Unbind removed nodes. When node does not have a parent it means that it was removed from DOM tree during\r\n        // comparison with the expected DOM. We don't need to check child nodes, because if child node was reinserted,\r\n        // it was moved to DOM tree out of the removed node.\r\n        for (const node of nodesToUnbind) {\r\n            if (!node.parentNode) {\r\n                this.domConverter.unbindDomElement(node);\r\n            }\r\n        }\r\n        // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n        // @if CK_DEBUG_TYPING // \tconsole.groupEnd();\r\n        // @if CK_DEBUG_TYPING // }\r\n    }\r\n    /**\r\n     * Shorthand for diffing two arrays or node lists of DOM nodes.\r\n     *\r\n     * @param actualDomChildren Actual DOM children\r\n     * @param expectedDomChildren Expected DOM children.\r\n     * @returns The list of actions based on the {@link module:utils/diff~diff} function.\r\n     */\r\n    _diffNodeLists(actualDomChildren, expectedDomChildren) {\r\n        actualDomChildren = filterOutFakeSelectionContainer(actualDomChildren, this._fakeSelectionContainer);\r\n        return diff(actualDomChildren, expectedDomChildren, sameNodes.bind(null, this.domConverter));\r\n    }\r\n    /**\r\n     * Finds DOM nodes that were replaced with the similar nodes (same tag name) in the view. All nodes are compared\r\n     * within one `insert`/`delete` action group, for example:\r\n     *\r\n     * ```\r\n     * Actual DOM:\t\t<p><b>Foo</b>Bar<i>Baz</i><b>Bax</b></p>\r\n     * Expected DOM:\t<p>Bar<b>123</b><i>Baz</i><b>456</b></p>\r\n     * Input actions:\t[ insert, insert, delete, delete, equal, insert, delete ]\r\n     * Output actions:\t[ insert, replace, delete, equal, replace ]\r\n     * ```\r\n     *\r\n     * @param actions Actions array which is a result of the {@link module:utils/diff~diff} function.\r\n     * @param actualDom Actual DOM children\r\n     * @param expectedDom Expected DOM children.\r\n     * @param comparator A comparator function that should return `true` if the given node should be reused\r\n     * (either by the update of a text node data or an element children list for similar elements).\r\n     * @returns Actions array modified with the `update` actions.\r\n     */\r\n    _findUpdateActions(actions, actualDom, expectedDom, comparator) {\r\n        // If there is no both 'insert' and 'delete' actions, no need to check for replaced elements.\r\n        if (actions.indexOf('insert') === -1 || actions.indexOf('delete') === -1) {\r\n            return actions;\r\n        }\r\n        let newActions = [];\r\n        let actualSlice = [];\r\n        let expectedSlice = [];\r\n        const counter = { equal: 0, insert: 0, delete: 0 };\r\n        for (const action of actions) {\r\n            if (action === 'insert') {\r\n                expectedSlice.push(expectedDom[counter.equal + counter.insert]);\r\n            }\r\n            else if (action === 'delete') {\r\n                actualSlice.push(actualDom[counter.equal + counter.delete]);\r\n            }\r\n            else { // equal\r\n                newActions = newActions.concat(diff(actualSlice, expectedSlice, comparator)\r\n                    .map(action => action === 'equal' ? 'update' : action));\r\n                newActions.push('equal');\r\n                // Reset stored elements on 'equal'.\r\n                actualSlice = [];\r\n                expectedSlice = [];\r\n            }\r\n            counter[action]++;\r\n        }\r\n        return newActions.concat(diff(actualSlice, expectedSlice, comparator)\r\n            .map(action => action === 'equal' ? 'update' : action));\r\n    }\r\n    /**\r\n     * Marks text nodes to be synchronized.\r\n     *\r\n     * If a text node is passed, it will be marked. If an element is passed, all descendant text nodes inside it will be marked.\r\n     *\r\n     * @param viewNode View node to sync.\r\n     */\r\n    _markDescendantTextToSync(viewNode) {\r\n        if (!viewNode) {\r\n            return;\r\n        }\r\n        if (viewNode.is('$text')) {\r\n            this.markedTexts.add(viewNode);\r\n        }\r\n        else if (viewNode.is('element')) {\r\n            for (const child of viewNode.getChildren()) {\r\n                this._markDescendantTextToSync(child);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Checks if the selection needs to be updated and possibly updates it.\r\n     */\r\n    _updateSelection() {\r\n        // Block updating DOM selection in (non-Android) Blink while the user is selecting to prevent accidental selection collapsing.\r\n        // Note: Structural changes in DOM must trigger selection rendering, though. Nodes the selection was anchored\r\n        // to, may disappear in DOM which would break the selection (e.g. in real-time collaboration scenarios).\r\n        // https://github.com/ckeditor/ckeditor5/issues/10562, https://github.com/ckeditor/ckeditor5/issues/10723\r\n        if (env.isBlink && !env.isAndroid && this.isSelecting && !this.markedChildren.size) {\r\n            return;\r\n        }\r\n        // If there is no selection - remove DOM and fake selections.\r\n        if (this.selection.rangeCount === 0) {\r\n            this._removeDomSelection();\r\n            this._removeFakeSelection();\r\n            return;\r\n        }\r\n        const domRoot = this.domConverter.mapViewToDom(this.selection.editableElement);\r\n        // Do nothing if there is no focus, or there is no DOM element corresponding to selection's editable element.\r\n        if (!this.isFocused || !domRoot) {\r\n            return;\r\n        }\r\n        // Render fake selection - create the fake selection container (if needed) and move DOM selection to it.\r\n        if (this.selection.isFake) {\r\n            this._updateFakeSelection(domRoot);\r\n        }\r\n        // There was a fake selection so remove it and update the DOM selection.\r\n        // This is especially important on Android because otherwise IME will try to compose over the fake selection container.\r\n        else if (this._fakeSelectionContainer && this._fakeSelectionContainer.isConnected) {\r\n            this._removeFakeSelection();\r\n            this._updateDomSelection(domRoot);\r\n        }\r\n        // Update the DOM selection in case of a plain selection change (no fake selection is involved).\r\n        // On non-Android the whole rendering is disabled in composition mode (including DOM selection update),\r\n        // but updating DOM selection should be also disabled on Android if in the middle of the composition\r\n        // (to not interrupt it).\r\n        else if (!(this.isComposing && env.isAndroid)) {\r\n            this._updateDomSelection(domRoot);\r\n        }\r\n    }\r\n    /**\r\n     * Updates the fake selection.\r\n     *\r\n     * @param domRoot A valid DOM root where the fake selection container should be added.\r\n     */\r\n    _updateFakeSelection(domRoot) {\r\n        const domDocument = domRoot.ownerDocument;\r\n        if (!this._fakeSelectionContainer) {\r\n            this._fakeSelectionContainer = createFakeSelectionContainer(domDocument);\r\n        }\r\n        const container = this._fakeSelectionContainer;\r\n        // Bind fake selection container with the current selection *position*.\r\n        this.domConverter.bindFakeSelection(container, this.selection);\r\n        if (!this._fakeSelectionNeedsUpdate(domRoot)) {\r\n            return;\r\n        }\r\n        if (!container.parentElement || container.parentElement != domRoot) {\r\n            domRoot.appendChild(container);\r\n        }\r\n        container.textContent = this.selection.fakeSelectionLabel || '\\u00A0';\r\n        const domSelection = domDocument.getSelection();\r\n        const domRange = domDocument.createRange();\r\n        domSelection.removeAllRanges();\r\n        domRange.selectNodeContents(container);\r\n        domSelection.addRange(domRange);\r\n    }\r\n    /**\r\n     * Updates the DOM selection.\r\n     *\r\n     * @param domRoot A valid DOM root where the DOM selection should be rendered.\r\n     */\r\n    _updateDomSelection(domRoot) {\r\n        const domSelection = domRoot.ownerDocument.defaultView.getSelection();\r\n        // Let's check whether DOM selection needs updating at all.\r\n        if (!this._domSelectionNeedsUpdate(domSelection)) {\r\n            return;\r\n        }\r\n        // Multi-range selection is not available in most browsers, and, at least in Chrome, trying to\r\n        // set such selection, that is not continuous, throws an error. Because of that, we will just use anchor\r\n        // and focus of view selection.\r\n        // Since we are not supporting multi-range selection, we also do not need to check if proper editable is\r\n        // selected. If there is any editable selected, it is okay (editable is taken from selection anchor).\r\n        const anchor = this.domConverter.viewPositionToDom(this.selection.anchor);\r\n        const focus = this.domConverter.viewPositionToDom(this.selection.focus);\r\n        // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n        // @if CK_DEBUG_TYPING // \tconsole.info( '%c[Renderer]%c Update DOM selection:',\r\n        // @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', '', anchor, focus\r\n        // @if CK_DEBUG_TYPING // \t);\r\n        // @if CK_DEBUG_TYPING // }\r\n        domSelection.collapse(anchor.parent, anchor.offset);\r\n        domSelection.extend(focus.parent, focus.offset);\r\n        // Firefox–specific hack (https://github.com/ckeditor/ckeditor5-engine/issues/1439).\r\n        if (env.isGecko) {\r\n            fixGeckoSelectionAfterBr(focus, domSelection);\r\n        }\r\n    }\r\n    /**\r\n     * Checks whether a given DOM selection needs to be updated.\r\n     *\r\n     * @param domSelection The DOM selection to check.\r\n     */\r\n    _domSelectionNeedsUpdate(domSelection) {\r\n        if (!this.domConverter.isDomSelectionCorrect(domSelection)) {\r\n            // Current DOM selection is in incorrect position. We need to update it.\r\n            return true;\r\n        }\r\n        const oldViewSelection = domSelection && this.domConverter.domSelectionToView(domSelection);\r\n        if (oldViewSelection && this.selection.isEqual(oldViewSelection)) {\r\n            return false;\r\n        }\r\n        // If selection is not collapsed, it does not need to be updated if it is similar.\r\n        if (!this.selection.isCollapsed && this.selection.isSimilar(oldViewSelection)) {\r\n            // Selection did not changed and is correct, do not update.\r\n            return false;\r\n        }\r\n        // Selections are not similar.\r\n        return true;\r\n    }\r\n    /**\r\n     * Checks whether the fake selection needs to be updated.\r\n     *\r\n     * @param domRoot A valid DOM root where a new fake selection container should be added.\r\n     */\r\n    _fakeSelectionNeedsUpdate(domRoot) {\r\n        const container = this._fakeSelectionContainer;\r\n        const domSelection = domRoot.ownerDocument.getSelection();\r\n        // Fake selection needs to be updated if there's no fake selection container, or the container currently sits\r\n        // in a different root.\r\n        if (!container || container.parentElement !== domRoot) {\r\n            return true;\r\n        }\r\n        // Make sure that the selection actually is within the fake selection.\r\n        if (domSelection.anchorNode !== container && !container.contains(domSelection.anchorNode)) {\r\n            return true;\r\n        }\r\n        return container.textContent !== this.selection.fakeSelectionLabel;\r\n    }\r\n    /**\r\n     * Removes the DOM selection.\r\n     */\r\n    _removeDomSelection() {\r\n        for (const doc of this.domDocuments) {\r\n            const domSelection = doc.getSelection();\r\n            if (domSelection.rangeCount) {\r\n                const activeDomElement = doc.activeElement;\r\n                const viewElement = this.domConverter.mapDomToView(activeDomElement);\r\n                if (activeDomElement && viewElement) {\r\n                    domSelection.removeAllRanges();\r\n                }\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Removes the fake selection.\r\n     */\r\n    _removeFakeSelection() {\r\n        const container = this._fakeSelectionContainer;\r\n        if (container) {\r\n            container.remove();\r\n        }\r\n    }\r\n    /**\r\n     * Checks if focus needs to be updated and possibly updates it.\r\n     */\r\n    _updateFocus() {\r\n        if (this.isFocused) {\r\n            const editable = this.selection.editableElement;\r\n            if (editable) {\r\n                this.domConverter.focus(editable);\r\n            }\r\n        }\r\n    }\r\n}\r\n/**\r\n * Checks if provided element is editable.\r\n */\r\nfunction isEditable(element) {\r\n    if (element.getAttribute('contenteditable') == 'false') {\r\n        return false;\r\n    }\r\n    const parent = element.findAncestor(element => element.hasAttribute('contenteditable'));\r\n    return !parent || parent.getAttribute('contenteditable') == 'true';\r\n}\r\n/**\r\n * Adds inline filler at a given position.\r\n *\r\n * The position can be given as an array of DOM nodes and an offset in that array,\r\n * or a DOM parent element and an offset in that element.\r\n *\r\n * @returns The DOM text node that contains an inline filler.\r\n */\r\nfunction addInlineFiller(domDocument, domParentOrArray, offset) {\r\n    const childNodes = domParentOrArray instanceof Array ? domParentOrArray : domParentOrArray.childNodes;\r\n    const nodeAfterFiller = childNodes[offset];\r\n    if (isText(nodeAfterFiller)) {\r\n        nodeAfterFiller.data = INLINE_FILLER + nodeAfterFiller.data;\r\n        return nodeAfterFiller;\r\n    }\r\n    else {\r\n        const fillerNode = domDocument.createTextNode(INLINE_FILLER);\r\n        if (Array.isArray(domParentOrArray)) {\r\n            childNodes.splice(offset, 0, fillerNode);\r\n        }\r\n        else {\r\n            insertAt(domParentOrArray, offset, fillerNode);\r\n        }\r\n        return fillerNode;\r\n    }\r\n}\r\n/**\r\n * Whether two DOM nodes should be considered as similar.\r\n * Nodes are considered similar if they have the same tag name.\r\n */\r\nfunction areSimilarElements(node1, node2) {\r\n    return isNode(node1) && isNode(node2) &&\r\n        !isText(node1) && !isText(node2) &&\r\n        !isComment(node1) && !isComment(node2) &&\r\n        node1.tagName.toLowerCase() === node2.tagName.toLowerCase();\r\n}\r\n/**\r\n * Whether two DOM nodes are text nodes.\r\n */\r\nfunction areTextNodes(node1, node2) {\r\n    return isNode(node1) && isNode(node2) &&\r\n        isText(node1) && isText(node2);\r\n}\r\n/**\r\n * Whether two dom nodes should be considered as the same.\r\n * Two nodes which are considered the same are:\r\n *\r\n * * Text nodes with the same text.\r\n * * Element nodes represented by the same object.\r\n * * Two block filler elements.\r\n *\r\n * @param blockFillerMode Block filler mode, see {@link module:engine/view/domconverter~DomConverter#blockFillerMode}.\r\n */\r\nfunction sameNodes(domConverter, actualDomChild, expectedDomChild) {\r\n    // Elements.\r\n    if (actualDomChild === expectedDomChild) {\r\n        return true;\r\n    }\r\n    // Texts.\r\n    else if (isText(actualDomChild) && isText(expectedDomChild)) {\r\n        return actualDomChild.data === expectedDomChild.data;\r\n    }\r\n    // Block fillers.\r\n    else if (domConverter.isBlockFiller(actualDomChild) &&\r\n        domConverter.isBlockFiller(expectedDomChild)) {\r\n        return true;\r\n    }\r\n    // Not matching types.\r\n    return false;\r\n}\r\n/**\r\n * The following is a Firefox–specific hack (https://github.com/ckeditor/ckeditor5-engine/issues/1439).\r\n * When the native DOM selection is at the end of the block and preceded by <br /> e.g.\r\n *\r\n * ```html\r\n * <p>foo<br/>[]</p>\r\n * ```\r\n *\r\n * which happens a lot when using the soft line break, the browser fails to (visually) move the\r\n * caret to the new line. A quick fix is as simple as force–refreshing the selection with the same range.\r\n */\r\nfunction fixGeckoSelectionAfterBr(focus, domSelection) {\r\n    const parent = focus.parent;\r\n    // This fix works only when the focus point is at the very end of an element.\r\n    // There is no point in running it in cases unrelated to the browser bug.\r\n    if (parent.nodeType != Node.ELEMENT_NODE || focus.offset != parent.childNodes.length - 1) {\r\n        return;\r\n    }\r\n    const childAtOffset = parent.childNodes[focus.offset];\r\n    // To stay on the safe side, the fix being as specific as possible, it targets only the\r\n    // selection which is at the very end of the element and preceded by <br />.\r\n    if (childAtOffset && childAtOffset.tagName == 'BR') {\r\n        domSelection.addRange(domSelection.getRangeAt(0));\r\n    }\r\n}\r\nfunction filterOutFakeSelectionContainer(domChildList, fakeSelectionContainer) {\r\n    const childList = Array.from(domChildList);\r\n    if (childList.length == 0 || !fakeSelectionContainer) {\r\n        return childList;\r\n    }\r\n    const last = childList[childList.length - 1];\r\n    if (last == fakeSelectionContainer) {\r\n        childList.pop();\r\n    }\r\n    return childList;\r\n}\r\n/**\r\n * Creates a fake selection container for a given document.\r\n */\r\nfunction createFakeSelectionContainer(domDocument) {\r\n    const container = domDocument.createElement('div');\r\n    container.className = 'ck-fake-selection-container';\r\n    Object.assign(container.style, {\r\n        position: 'fixed',\r\n        top: 0,\r\n        left: '-9999px',\r\n        // See https://github.com/ckeditor/ckeditor5/issues/752.\r\n        width: '42px'\r\n    });\r\n    // Fill it with a text node so we can update it later.\r\n    container.textContent = '\\u00A0';\r\n    return container;\r\n}\r\n/**\r\n * Checks if text needs to be updated and possibly updates it by removing and inserting only parts\r\n * of the data from the existing text node to reduce impact on the IME composition.\r\n *\r\n * @param domText DOM text node to update.\r\n * @param expectedText The expected data of a text node.\r\n */\r\nfunction updateTextNode(domText, expectedText) {\r\n    const actualText = domText.data;\r\n    if (actualText == expectedText) {\r\n        // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n        // @if CK_DEBUG_TYPING // \tconsole.info( '%c[Renderer]%c Text node does not need update:',\r\n        // @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', '',\r\n        // @if CK_DEBUG_TYPING // \t\t`\"${ domText.data }\" (${ domText.data.length })`\r\n        // @if CK_DEBUG_TYPING // \t);\r\n        // @if CK_DEBUG_TYPING // }\r\n        return;\r\n    }\r\n    // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n    // @if CK_DEBUG_TYPING // \tconsole.info( '%c[Renderer]%c Update text node:',\r\n    // @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', '',\r\n    // @if CK_DEBUG_TYPING // \t\t`\"${ domText.data }\" (${ domText.data.length }) -> \"${ expectedText }\" (${ expectedText.length })`\r\n    // @if CK_DEBUG_TYPING // \t);\r\n    // @if CK_DEBUG_TYPING // }\r\n    const actions = fastDiff(actualText, expectedText);\r\n    for (const action of actions) {\r\n        if (action.type === 'insert') {\r\n            domText.insertData(action.index, action.values.join(''));\r\n        }\r\n        else { // 'delete'\r\n            domText.deleteData(action.index, action.howMany);\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/domconverter\r\n */\r\n/* globals Node, NodeFilter, DOMParser, Text */\r\nimport ViewText from './text';\r\nimport ViewElement from './element';\r\nimport ViewUIElement from './uielement';\r\nimport ViewPosition from './position';\r\nimport ViewRange from './range';\r\nimport ViewSelection from './selection';\r\nimport ViewDocumentFragment from './documentfragment';\r\nimport ViewTreeWalker from './treewalker';\r\nimport { default as Matcher } from './matcher';\r\nimport { BR_FILLER, INLINE_FILLER_LENGTH, NBSP_FILLER, MARKED_NBSP_FILLER, getDataWithoutFiller, isInlineFiller, startsWithFiller } from './filler';\r\nimport { global, logWarning, indexOf, getAncestors, isText, isComment, isValidAttributeName, first } from '@ckeditor/ckeditor5-utils';\r\nconst BR_FILLER_REF = BR_FILLER(global.document); // eslint-disable-line new-cap\r\nconst NBSP_FILLER_REF = NBSP_FILLER(global.document); // eslint-disable-line new-cap\r\nconst MARKED_NBSP_FILLER_REF = MARKED_NBSP_FILLER(global.document); // eslint-disable-line new-cap\r\nconst UNSAFE_ATTRIBUTE_NAME_PREFIX = 'data-ck-unsafe-attribute-';\r\nconst UNSAFE_ELEMENT_REPLACEMENT_ATTRIBUTE = 'data-ck-unsafe-element';\r\n/**\r\n * `DomConverter` is a set of tools to do transformations between DOM nodes and view nodes. It also handles\r\n * {@link module:engine/view/domconverter~DomConverter#bindElements bindings} between these nodes.\r\n *\r\n * An instance of the DOM converter is available under\r\n * {@link module:engine/view/view~View#domConverter `editor.editing.view.domConverter`}.\r\n *\r\n * The DOM converter does not check which nodes should be rendered (use {@link module:engine/view/renderer~Renderer}), does not keep the\r\n * state of a tree nor keeps the synchronization between the tree view and the DOM tree (use {@link module:engine/view/document~Document}).\r\n *\r\n * The DOM converter keeps DOM elements to view element bindings, so when the converter gets destroyed, the bindings are lost.\r\n * Two converters will keep separate binding maps, so one tree view can be bound with two DOM trees.\r\n */\r\nexport default class DomConverter {\r\n    /**\r\n     * Creates a DOM converter.\r\n     *\r\n     * @param document The view document instance.\r\n     * @param options An object with configuration options.\r\n     * @param options.blockFillerMode The type of the block filler to use.\r\n     * Default value depends on the options.renderingMode:\r\n     *  'nbsp' when options.renderingMode == 'data',\r\n     *  'br' when options.renderingMode == 'editing'.\r\n     * @param options.renderingMode Whether to leave the View-to-DOM conversion result unchanged\r\n     * or improve editing experience by filtering out interactive data.\r\n     */\r\n    constructor(document, { blockFillerMode, renderingMode = 'editing' } = {}) {\r\n        /**\r\n         * The DOM-to-view mapping.\r\n         */\r\n        this._domToViewMapping = new WeakMap();\r\n        /**\r\n         * The view-to-DOM mapping.\r\n         */\r\n        this._viewToDomMapping = new WeakMap();\r\n        /**\r\n         * Holds the mapping between fake selection containers and corresponding view selections.\r\n         */\r\n        this._fakeSelectionMapping = new WeakMap();\r\n        /**\r\n         * Matcher for view elements whose content should be treated as raw data\r\n         * and not processed during the conversion from DOM nodes to view elements.\r\n         */\r\n        this._rawContentElementMatcher = new Matcher();\r\n        /**\r\n         * A set of encountered raw content DOM nodes. It is used for preventing left trimming of the following text node.\r\n         */\r\n        this._encounteredRawContentDomNodes = new WeakSet();\r\n        this.document = document;\r\n        this.renderingMode = renderingMode;\r\n        this.blockFillerMode = blockFillerMode || (renderingMode === 'editing' ? 'br' : 'nbsp');\r\n        this.preElements = ['pre'];\r\n        this.blockElements = [\r\n            'address', 'article', 'aside', 'blockquote', 'caption', 'center', 'dd', 'details', 'dir', 'div',\r\n            'dl', 'dt', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header',\r\n            'hgroup', 'legend', 'li', 'main', 'menu', 'nav', 'ol', 'p', 'pre', 'section', 'summary', 'table', 'tbody',\r\n            'td', 'tfoot', 'th', 'thead', 'tr', 'ul'\r\n        ];\r\n        this.inlineObjectElements = [\r\n            'object', 'iframe', 'input', 'button', 'textarea', 'select', 'option', 'video', 'embed', 'audio', 'img', 'canvas'\r\n        ];\r\n        this.unsafeElements = ['script', 'style'];\r\n        this._domDocument = this.renderingMode === 'editing' ? global.document : global.document.implementation.createHTMLDocument('');\r\n    }\r\n    /**\r\n     * Binds a given DOM element that represents fake selection to a **position** of a\r\n     * {@link module:engine/view/documentselection~DocumentSelection document selection}.\r\n     * Document selection copy is stored and can be retrieved by the\r\n     * {@link module:engine/view/domconverter~DomConverter#fakeSelectionToView} method.\r\n     */\r\n    bindFakeSelection(domElement, viewDocumentSelection) {\r\n        this._fakeSelectionMapping.set(domElement, new ViewSelection(viewDocumentSelection));\r\n    }\r\n    /**\r\n     * Returns a {@link module:engine/view/selection~Selection view selection} instance corresponding to a given\r\n     * DOM element that represents fake selection. Returns `undefined` if binding to the given DOM element does not exist.\r\n     */\r\n    fakeSelectionToView(domElement) {\r\n        return this._fakeSelectionMapping.get(domElement);\r\n    }\r\n    /**\r\n     * Binds DOM and view elements, so it will be possible to get corresponding elements using\r\n     * {@link module:engine/view/domconverter~DomConverter#mapDomToView} and\r\n     * {@link module:engine/view/domconverter~DomConverter#mapViewToDom}.\r\n     *\r\n     * @param domElement The DOM element to bind.\r\n     * @param viewElement The view element to bind.\r\n     */\r\n    bindElements(domElement, viewElement) {\r\n        this._domToViewMapping.set(domElement, viewElement);\r\n        this._viewToDomMapping.set(viewElement, domElement);\r\n    }\r\n    /**\r\n     * Unbinds a given DOM element from the view element it was bound to. Unbinding is deep, meaning that all children of\r\n     * the DOM element will be unbound too.\r\n     *\r\n     * @param domElement The DOM element to unbind.\r\n     */\r\n    unbindDomElement(domElement) {\r\n        const viewElement = this._domToViewMapping.get(domElement);\r\n        if (viewElement) {\r\n            this._domToViewMapping.delete(domElement);\r\n            this._viewToDomMapping.delete(viewElement);\r\n            for (const child of Array.from(domElement.children)) {\r\n                this.unbindDomElement(child);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Binds DOM and view document fragments, so it will be possible to get corresponding document fragments using\r\n     * {@link module:engine/view/domconverter~DomConverter#mapDomToView} and\r\n     * {@link module:engine/view/domconverter~DomConverter#mapViewToDom}.\r\n     *\r\n     * @param domFragment The DOM document fragment to bind.\r\n     * @param viewFragment The view document fragment to bind.\r\n     */\r\n    bindDocumentFragments(domFragment, viewFragment) {\r\n        this._domToViewMapping.set(domFragment, viewFragment);\r\n        this._viewToDomMapping.set(viewFragment, domFragment);\r\n    }\r\n    /**\r\n     * Decides whether a given pair of attribute key and value should be passed further down the pipeline.\r\n     *\r\n     * @param elementName Element name in lower case.\r\n     */\r\n    shouldRenderAttribute(attributeKey, attributeValue, elementName) {\r\n        if (this.renderingMode === 'data') {\r\n            return true;\r\n        }\r\n        attributeKey = attributeKey.toLowerCase();\r\n        if (attributeKey.startsWith('on')) {\r\n            return false;\r\n        }\r\n        if (attributeKey === 'srcdoc' &&\r\n            attributeValue.match(/\\bon\\S+\\s*=|javascript:|<\\s*\\/*script/i)) {\r\n            return false;\r\n        }\r\n        if (elementName === 'img' &&\r\n            (attributeKey === 'src' || attributeKey === 'srcset')) {\r\n            return true;\r\n        }\r\n        if (elementName === 'source' && attributeKey === 'srcset') {\r\n            return true;\r\n        }\r\n        if (attributeValue.match(/^\\s*(javascript:|data:(image\\/svg|text\\/x?html))/i)) {\r\n            return false;\r\n        }\r\n        return true;\r\n    }\r\n    /**\r\n     * Set `domElement`'s content using provided `html` argument. Apply necessary filtering for the editing pipeline.\r\n     *\r\n     * @param domElement DOM element that should have `html` set as its content.\r\n     * @param html Textual representation of the HTML that will be set on `domElement`.\r\n     */\r\n    setContentOf(domElement, html) {\r\n        // For data pipeline we pass the HTML as-is.\r\n        if (this.renderingMode === 'data') {\r\n            domElement.innerHTML = html;\r\n            return;\r\n        }\r\n        const document = new DOMParser().parseFromString(html, 'text/html');\r\n        const fragment = document.createDocumentFragment();\r\n        const bodyChildNodes = document.body.childNodes;\r\n        while (bodyChildNodes.length > 0) {\r\n            fragment.appendChild(bodyChildNodes[0]);\r\n        }\r\n        const treeWalker = document.createTreeWalker(fragment, NodeFilter.SHOW_ELEMENT);\r\n        const nodes = [];\r\n        let currentNode;\r\n        // eslint-disable-next-line no-cond-assign\r\n        while (currentNode = treeWalker.nextNode()) {\r\n            nodes.push(currentNode);\r\n        }\r\n        for (const currentNode of nodes) {\r\n            // Go through nodes to remove those that are prohibited in editing pipeline.\r\n            for (const attributeName of currentNode.getAttributeNames()) {\r\n                this.setDomElementAttribute(currentNode, attributeName, currentNode.getAttribute(attributeName));\r\n            }\r\n            const elementName = currentNode.tagName.toLowerCase();\r\n            // There are certain nodes, that should be renamed to <span> in editing pipeline.\r\n            if (this._shouldRenameElement(elementName)) {\r\n                _logUnsafeElement(elementName);\r\n                currentNode.replaceWith(this._createReplacementDomElement(elementName, currentNode));\r\n            }\r\n        }\r\n        // Empty the target element.\r\n        while (domElement.firstChild) {\r\n            domElement.firstChild.remove();\r\n        }\r\n        domElement.append(fragment);\r\n    }\r\n    /**\r\n     * Converts the view to the DOM. For all text nodes, not bound elements and document fragments new items will\r\n     * be created. For bound elements and document fragments the method will return corresponding items.\r\n     *\r\n     * @param viewNode View node or document fragment to transform.\r\n     * @param options Conversion options.\r\n     * @param options.bind Determines whether new elements will be bound.\r\n     * @param options.withChildren If `false`, node's and document fragment's children will not be converted.\r\n     * @returns Converted node or DocumentFragment.\r\n     */\r\n    viewToDom(viewNode, options = {}) {\r\n        if (viewNode.is('$text')) {\r\n            const textData = this._processDataFromViewText(viewNode);\r\n            return this._domDocument.createTextNode(textData);\r\n        }\r\n        else {\r\n            if (this.mapViewToDom(viewNode)) {\r\n                return this.mapViewToDom(viewNode);\r\n            }\r\n            let domElement;\r\n            if (viewNode.is('documentFragment')) {\r\n                // Create DOM document fragment.\r\n                domElement = this._domDocument.createDocumentFragment();\r\n                if (options.bind) {\r\n                    this.bindDocumentFragments(domElement, viewNode);\r\n                }\r\n            }\r\n            else if (viewNode.is('uiElement')) {\r\n                if (viewNode.name === '$comment') {\r\n                    domElement = this._domDocument.createComment(viewNode.getCustomProperty('$rawContent'));\r\n                }\r\n                else {\r\n                    // UIElement has its own render() method (see #799).\r\n                    domElement = viewNode.render(this._domDocument, this);\r\n                }\r\n                if (options.bind) {\r\n                    this.bindElements(domElement, viewNode);\r\n                }\r\n                return domElement;\r\n            }\r\n            else {\r\n                // Create DOM element.\r\n                if (this._shouldRenameElement(viewNode.name)) {\r\n                    _logUnsafeElement(viewNode.name);\r\n                    domElement = this._createReplacementDomElement(viewNode.name);\r\n                }\r\n                else if (viewNode.hasAttribute('xmlns')) {\r\n                    domElement = this._domDocument.createElementNS(viewNode.getAttribute('xmlns'), viewNode.name);\r\n                }\r\n                else {\r\n                    domElement = this._domDocument.createElement(viewNode.name);\r\n                }\r\n                // RawElement take care of their children in RawElement#render() method which can be customized\r\n                // (see https://github.com/ckeditor/ckeditor5/issues/4469).\r\n                if (viewNode.is('rawElement')) {\r\n                    viewNode.render(domElement, this);\r\n                }\r\n                if (options.bind) {\r\n                    this.bindElements(domElement, viewNode);\r\n                }\r\n                // Copy element's attributes.\r\n                for (const key of viewNode.getAttributeKeys()) {\r\n                    this.setDomElementAttribute(domElement, key, viewNode.getAttribute(key), viewNode);\r\n                }\r\n            }\r\n            if (options.withChildren !== false) {\r\n                for (const child of this.viewChildrenToDom(viewNode, options)) {\r\n                    domElement.appendChild(child);\r\n                }\r\n            }\r\n            return domElement;\r\n        }\r\n    }\r\n    /**\r\n     * Sets the attribute on a DOM element.\r\n     *\r\n     * **Note**: To remove the attribute, use {@link #removeDomElementAttribute}.\r\n     *\r\n     * @param domElement The DOM element the attribute should be set on.\r\n     * @param key The name of the attribute.\r\n     * @param value The value of the attribute.\r\n     * @param relatedViewElement The view element related to the `domElement` (if there is any).\r\n     * It helps decide whether the attribute set is unsafe. For instance, view elements created via the\r\n     * {@link module:engine/view/downcastwriter~DowncastWriter} methods can allow certain attributes that would normally be filtered out.\r\n     */\r\n    setDomElementAttribute(domElement, key, value, relatedViewElement) {\r\n        const shouldRenderAttribute = this.shouldRenderAttribute(key, value, domElement.tagName.toLowerCase()) ||\r\n            relatedViewElement && relatedViewElement.shouldRenderUnsafeAttribute(key);\r\n        if (!shouldRenderAttribute) {\r\n            logWarning('domconverter-unsafe-attribute-detected', { domElement, key, value });\r\n        }\r\n        if (!isValidAttributeName(key)) {\r\n            /**\r\n             * Invalid attribute name was ignored during rendering.\r\n             *\r\n             * @error domconverter-invalid-attribute-detected\r\n             */\r\n            logWarning('domconverter-invalid-attribute-detected', { domElement, key, value });\r\n            return;\r\n        }\r\n        // The old value was safe but the new value is unsafe.\r\n        if (domElement.hasAttribute(key) && !shouldRenderAttribute) {\r\n            domElement.removeAttribute(key);\r\n        }\r\n        // The old value was unsafe (but prefixed) but the new value will be safe (will be unprefixed).\r\n        else if (domElement.hasAttribute(UNSAFE_ATTRIBUTE_NAME_PREFIX + key) && shouldRenderAttribute) {\r\n            domElement.removeAttribute(UNSAFE_ATTRIBUTE_NAME_PREFIX + key);\r\n        }\r\n        // If the attribute should not be rendered, rename it (instead of removing) to give developers some idea of what\r\n        // is going on (https://github.com/ckeditor/ckeditor5/issues/10801).\r\n        domElement.setAttribute(shouldRenderAttribute ? key : UNSAFE_ATTRIBUTE_NAME_PREFIX + key, value);\r\n    }\r\n    /**\r\n     * Removes an attribute from a DOM element.\r\n     *\r\n     * **Note**: To set the attribute, use {@link #setDomElementAttribute}.\r\n     *\r\n     * @param domElement The DOM element the attribute should be removed from.\r\n     * @param key The name of the attribute.\r\n     */\r\n    removeDomElementAttribute(domElement, key) {\r\n        // See #_createReplacementDomElement() to learn what this is.\r\n        if (key == UNSAFE_ELEMENT_REPLACEMENT_ATTRIBUTE) {\r\n            return;\r\n        }\r\n        domElement.removeAttribute(key);\r\n        // See setDomElementAttribute() to learn what this is.\r\n        domElement.removeAttribute(UNSAFE_ATTRIBUTE_NAME_PREFIX + key);\r\n    }\r\n    /**\r\n     * Converts children of the view element to DOM using the\r\n     * {@link module:engine/view/domconverter~DomConverter#viewToDom} method.\r\n     * Additionally, this method adds block {@link module:engine/view/filler filler} to the list of children, if needed.\r\n     *\r\n     * @param viewElement Parent view element.\r\n     * @param options See {@link module:engine/view/domconverter~DomConverter#viewToDom} options parameter.\r\n     * @returns DOM nodes.\r\n     */\r\n    *viewChildrenToDom(viewElement, options = {}) {\r\n        const fillerPositionOffset = viewElement.getFillerOffset && viewElement.getFillerOffset();\r\n        let offset = 0;\r\n        for (const childView of viewElement.getChildren()) {\r\n            if (fillerPositionOffset === offset) {\r\n                yield this._getBlockFiller();\r\n            }\r\n            const transparentRendering = childView.is('element') &&\r\n                !!childView.getCustomProperty('dataPipeline:transparentRendering') &&\r\n                !first(childView.getAttributes());\r\n            if (transparentRendering && this.renderingMode == 'data') {\r\n                yield* this.viewChildrenToDom(childView, options);\r\n            }\r\n            else {\r\n                if (transparentRendering) {\r\n                    /**\r\n                     * The `dataPipeline:transparentRendering` flag is supported only in the data pipeline.\r\n                     *\r\n                     * @error domconverter-transparent-rendering-unsupported-in-editing-pipeline\r\n                     */\r\n                    logWarning('domconverter-transparent-rendering-unsupported-in-editing-pipeline', { viewElement: childView });\r\n                }\r\n                yield this.viewToDom(childView, options);\r\n            }\r\n            offset++;\r\n        }\r\n        if (fillerPositionOffset === offset) {\r\n            yield this._getBlockFiller();\r\n        }\r\n    }\r\n    /**\r\n     * Converts view {@link module:engine/view/range~Range} to DOM range.\r\n     * Inline and block {@link module:engine/view/filler fillers} are handled during the conversion.\r\n     *\r\n     * @param viewRange View range.\r\n     * @returns DOM range.\r\n     */\r\n    viewRangeToDom(viewRange) {\r\n        const domStart = this.viewPositionToDom(viewRange.start);\r\n        const domEnd = this.viewPositionToDom(viewRange.end);\r\n        const domRange = this._domDocument.createRange();\r\n        domRange.setStart(domStart.parent, domStart.offset);\r\n        domRange.setEnd(domEnd.parent, domEnd.offset);\r\n        return domRange;\r\n    }\r\n    /**\r\n     * Converts view {@link module:engine/view/position~Position} to DOM parent and offset.\r\n     *\r\n     * Inline and block {@link module:engine/view/filler fillers} are handled during the conversion.\r\n     * If the converted position is directly before inline filler it is moved inside the filler.\r\n     *\r\n     * @param viewPosition View position.\r\n     * @returns DOM position or `null` if view position could not be converted to DOM.\r\n     * DOM position has two properties:\r\n     * * `parent` - DOM position parent.\r\n     * * `offset` - DOM position offset.\r\n     */\r\n    viewPositionToDom(viewPosition) {\r\n        const viewParent = viewPosition.parent;\r\n        if (viewParent.is('$text')) {\r\n            const domParent = this.findCorrespondingDomText(viewParent);\r\n            if (!domParent) {\r\n                // Position is in a view text node that has not been rendered to DOM yet.\r\n                return null;\r\n            }\r\n            let offset = viewPosition.offset;\r\n            if (startsWithFiller(domParent)) {\r\n                offset += INLINE_FILLER_LENGTH;\r\n            }\r\n            return { parent: domParent, offset };\r\n        }\r\n        else {\r\n            // viewParent is instance of ViewElement.\r\n            let domParent, domBefore, domAfter;\r\n            if (viewPosition.offset === 0) {\r\n                domParent = this.mapViewToDom(viewParent);\r\n                if (!domParent) {\r\n                    // Position is in a view element that has not been rendered to DOM yet.\r\n                    return null;\r\n                }\r\n                domAfter = domParent.childNodes[0];\r\n            }\r\n            else {\r\n                const nodeBefore = viewPosition.nodeBefore;\r\n                domBefore = nodeBefore.is('$text') ?\r\n                    this.findCorrespondingDomText(nodeBefore) :\r\n                    this.mapViewToDom(nodeBefore);\r\n                if (!domBefore) {\r\n                    // Position is after a view element that has not been rendered to DOM yet.\r\n                    return null;\r\n                }\r\n                domParent = domBefore.parentNode;\r\n                domAfter = domBefore.nextSibling;\r\n            }\r\n            // If there is an inline filler at position return position inside the filler. We should never return\r\n            // the position before the inline filler.\r\n            if (isText(domAfter) && startsWithFiller(domAfter)) {\r\n                return { parent: domAfter, offset: INLINE_FILLER_LENGTH };\r\n            }\r\n            const offset = domBefore ? indexOf(domBefore) + 1 : 0;\r\n            return { parent: domParent, offset };\r\n        }\r\n    }\r\n    /**\r\n     * Converts DOM to view. For all text nodes, not bound elements and document fragments new items will\r\n     * be created. For bound elements and document fragments function will return corresponding items. For\r\n     * {@link module:engine/view/filler fillers} `null` will be returned.\r\n     * For all DOM elements rendered by {@link module:engine/view/uielement~UIElement} that UIElement will be returned.\r\n     *\r\n     * @param domNode DOM node or document fragment to transform.\r\n     * @param options Conversion options.\r\n     * @param options.bind Determines whether new elements will be bound. False by default.\r\n     * @param options.withChildren If `true`, node's and document fragment's children will be converted too. True by default.\r\n     * @param options.keepOriginalCase If `false`, node's tag name will be converted to lower case. False by default.\r\n     * @param options.skipComments If `false`, comment nodes will be converted to `$comment`\r\n     * {@link module:engine/view/uielement~UIElement view UI elements}. False by default.\r\n     * @returns Converted node or document fragment or `null` if DOM node is a {@link module:engine/view/filler filler}\r\n     * or the given node is an empty text node.\r\n     */\r\n    domToView(domNode, options = {}) {\r\n        if (this.isBlockFiller(domNode)) {\r\n            return null;\r\n        }\r\n        // When node is inside a UIElement or a RawElement return that parent as it's view representation.\r\n        const hostElement = this.getHostViewElement(domNode);\r\n        if (hostElement) {\r\n            return hostElement;\r\n        }\r\n        if (isComment(domNode) && options.skipComments) {\r\n            return null;\r\n        }\r\n        if (isText(domNode)) {\r\n            if (isInlineFiller(domNode)) {\r\n                return null;\r\n            }\r\n            else {\r\n                const textData = this._processDataFromDomText(domNode);\r\n                return textData === '' ? null : new ViewText(this.document, textData);\r\n            }\r\n        }\r\n        else {\r\n            if (this.mapDomToView(domNode)) {\r\n                return this.mapDomToView(domNode);\r\n            }\r\n            let viewElement;\r\n            if (this.isDocumentFragment(domNode)) {\r\n                // Create view document fragment.\r\n                viewElement = new ViewDocumentFragment(this.document);\r\n                if (options.bind) {\r\n                    this.bindDocumentFragments(domNode, viewElement);\r\n                }\r\n            }\r\n            else {\r\n                // Create view element.\r\n                viewElement = this._createViewElement(domNode, options);\r\n                if (options.bind) {\r\n                    this.bindElements(domNode, viewElement);\r\n                }\r\n                // Copy element's attributes.\r\n                const attrs = domNode.attributes;\r\n                if (attrs) {\r\n                    for (let l = attrs.length, i = 0; i < l; i++) {\r\n                        viewElement._setAttribute(attrs[i].name, attrs[i].value);\r\n                    }\r\n                }\r\n                // Treat this element's content as a raw data if it was registered as such.\r\n                // Comment node is also treated as an element with raw data.\r\n                if (this._isViewElementWithRawContent(viewElement, options) || isComment(domNode)) {\r\n                    const rawContent = isComment(domNode) ? domNode.data : domNode.innerHTML;\r\n                    viewElement._setCustomProperty('$rawContent', rawContent);\r\n                    // Store a DOM node to prevent left trimming of the following text node.\r\n                    this._encounteredRawContentDomNodes.add(domNode);\r\n                    return viewElement;\r\n                }\r\n            }\r\n            if (options.withChildren !== false) {\r\n                for (const child of this.domChildrenToView(domNode, options)) {\r\n                    viewElement._appendChild(child);\r\n                }\r\n            }\r\n            return viewElement;\r\n        }\r\n    }\r\n    /**\r\n     * Converts children of the DOM element to view nodes using\r\n     * the {@link module:engine/view/domconverter~DomConverter#domToView} method.\r\n     * Additionally this method omits block {@link module:engine/view/filler filler}, if it exists in the DOM parent.\r\n     *\r\n     * @param domElement Parent DOM element.\r\n     * @param options See {@link module:engine/view/domconverter~DomConverter#domToView} options parameter.\r\n     * @returns View nodes.\r\n     */\r\n    *domChildrenToView(domElement, options) {\r\n        for (let i = 0; i < domElement.childNodes.length; i++) {\r\n            const domChild = domElement.childNodes[i];\r\n            const viewChild = this.domToView(domChild, options);\r\n            if (viewChild !== null) {\r\n                yield viewChild;\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Converts DOM selection to view {@link module:engine/view/selection~Selection}.\r\n     * Ranges which cannot be converted will be omitted.\r\n     *\r\n     * @param domSelection DOM selection.\r\n     * @returns View selection.\r\n     */\r\n    domSelectionToView(domSelection) {\r\n        // DOM selection might be placed in fake selection container.\r\n        // If container contains fake selection - return corresponding view selection.\r\n        if (domSelection.rangeCount === 1) {\r\n            let container = domSelection.getRangeAt(0).startContainer;\r\n            // The DOM selection might be moved to the text node inside the fake selection container.\r\n            if (isText(container)) {\r\n                container = container.parentNode;\r\n            }\r\n            const viewSelection = this.fakeSelectionToView(container);\r\n            if (viewSelection) {\r\n                return viewSelection;\r\n            }\r\n        }\r\n        const isBackward = this.isDomSelectionBackward(domSelection);\r\n        const viewRanges = [];\r\n        for (let i = 0; i < domSelection.rangeCount; i++) {\r\n            // DOM Range have correct start and end, no matter what is the DOM Selection direction. So we don't have to fix anything.\r\n            const domRange = domSelection.getRangeAt(i);\r\n            const viewRange = this.domRangeToView(domRange);\r\n            if (viewRange) {\r\n                viewRanges.push(viewRange);\r\n            }\r\n        }\r\n        return new ViewSelection(viewRanges, { backward: isBackward });\r\n    }\r\n    /**\r\n     * Converts DOM Range to view {@link module:engine/view/range~Range}.\r\n     * If the start or end position can not be converted `null` is returned.\r\n     *\r\n     * @param domRange DOM range.\r\n     * @returns View range.\r\n     */\r\n    domRangeToView(domRange) {\r\n        const viewStart = this.domPositionToView(domRange.startContainer, domRange.startOffset);\r\n        const viewEnd = this.domPositionToView(domRange.endContainer, domRange.endOffset);\r\n        if (viewStart && viewEnd) {\r\n            return new ViewRange(viewStart, viewEnd);\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Converts DOM parent and offset to view {@link module:engine/view/position~Position}.\r\n     *\r\n     * If the position is inside a {@link module:engine/view/filler filler} which has no corresponding view node,\r\n     * position of the filler will be converted and returned.\r\n     *\r\n     * If the position is inside DOM element rendered by {@link module:engine/view/uielement~UIElement}\r\n     * that position will be converted to view position before that UIElement.\r\n     *\r\n     * If structures are too different and it is not possible to find corresponding position then `null` will be returned.\r\n     *\r\n     * @param domParent DOM position parent.\r\n     * @param domOffset DOM position offset. You can skip it when converting the inline filler node.\r\n     * @returns View position.\r\n     */\r\n    domPositionToView(domParent, domOffset = 0) {\r\n        if (this.isBlockFiller(domParent)) {\r\n            return this.domPositionToView(domParent.parentNode, indexOf(domParent));\r\n        }\r\n        // If position is somewhere inside UIElement or a RawElement - return position before that element.\r\n        const viewElement = this.mapDomToView(domParent);\r\n        if (viewElement && (viewElement.is('uiElement') || viewElement.is('rawElement'))) {\r\n            return ViewPosition._createBefore(viewElement);\r\n        }\r\n        if (isText(domParent)) {\r\n            if (isInlineFiller(domParent)) {\r\n                return this.domPositionToView(domParent.parentNode, indexOf(domParent));\r\n            }\r\n            const viewParent = this.findCorrespondingViewText(domParent);\r\n            let offset = domOffset;\r\n            if (!viewParent) {\r\n                return null;\r\n            }\r\n            if (startsWithFiller(domParent)) {\r\n                offset -= INLINE_FILLER_LENGTH;\r\n                offset = offset < 0 ? 0 : offset;\r\n            }\r\n            return new ViewPosition(viewParent, offset);\r\n        }\r\n        // domParent instanceof HTMLElement.\r\n        else {\r\n            if (domOffset === 0) {\r\n                const viewParent = this.mapDomToView(domParent);\r\n                if (viewParent) {\r\n                    return new ViewPosition(viewParent, 0);\r\n                }\r\n            }\r\n            else {\r\n                const domBefore = domParent.childNodes[domOffset - 1];\r\n                // Jump over an inline filler (and also on Firefox jump over a block filler while pressing backspace in an empty paragraph).\r\n                if (isText(domBefore) && isInlineFiller(domBefore) || domBefore && this.isBlockFiller(domBefore)) {\r\n                    return this.domPositionToView(domBefore.parentNode, indexOf(domBefore));\r\n                }\r\n                const viewBefore = isText(domBefore) ?\r\n                    this.findCorrespondingViewText(domBefore) :\r\n                    this.mapDomToView(domBefore);\r\n                // TODO #663\r\n                if (viewBefore && viewBefore.parent) {\r\n                    return new ViewPosition(viewBefore.parent, viewBefore.index + 1);\r\n                }\r\n            }\r\n            return null;\r\n        }\r\n    }\r\n    /**\r\n     * Returns corresponding view {@link module:engine/view/element~Element Element} or\r\n     * {@link module:engine/view/documentfragment~DocumentFragment} for provided DOM element or\r\n     * document fragment. If there is no view item {@link module:engine/view/domconverter~DomConverter#bindElements bound}\r\n     * to the given DOM - `undefined` is returned.\r\n     *\r\n     * For all DOM elements rendered by a {@link module:engine/view/uielement~UIElement} or\r\n     * a {@link module:engine/view/rawelement~RawElement}, the parent `UIElement` or `RawElement` will be returned.\r\n     *\r\n     * @param domElementOrDocumentFragment DOM element or document fragment.\r\n     * @returns Corresponding view element, document fragment or `undefined` if no element was bound.\r\n     */\r\n    mapDomToView(domElementOrDocumentFragment) {\r\n        const hostElement = this.getHostViewElement(domElementOrDocumentFragment);\r\n        return hostElement || this._domToViewMapping.get(domElementOrDocumentFragment);\r\n    }\r\n    /**\r\n     * Finds corresponding text node. Text nodes are not {@link module:engine/view/domconverter~DomConverter#bindElements bound},\r\n     * corresponding text node is returned based on the sibling or parent.\r\n     *\r\n     * If the directly previous sibling is a {@link module:engine/view/domconverter~DomConverter#bindElements bound} element, it is used\r\n     * to find the corresponding text node.\r\n     *\r\n     * If this is a first child in the parent and the parent is a {@link module:engine/view/domconverter~DomConverter#bindElements bound}\r\n     * element, it is used to find the corresponding text node.\r\n     *\r\n     * For all text nodes rendered by a {@link module:engine/view/uielement~UIElement} or\r\n     * a {@link module:engine/view/rawelement~RawElement}, the parent `UIElement` or `RawElement` will be returned.\r\n     *\r\n     * Otherwise `null` is returned.\r\n     *\r\n     * Note that for the block or inline {@link module:engine/view/filler filler} this method returns `null`.\r\n     *\r\n     * @param domText DOM text node.\r\n     * @returns Corresponding view text node or `null`, if it was not possible to find a corresponding node.\r\n     */\r\n    findCorrespondingViewText(domText) {\r\n        if (isInlineFiller(domText)) {\r\n            return null;\r\n        }\r\n        // If DOM text was rendered by a UIElement or a RawElement - return this parent element.\r\n        const hostElement = this.getHostViewElement(domText);\r\n        if (hostElement) {\r\n            return hostElement;\r\n        }\r\n        const previousSibling = domText.previousSibling;\r\n        // Try to use previous sibling to find the corresponding text node.\r\n        if (previousSibling) {\r\n            if (!(this.isElement(previousSibling))) {\r\n                // The previous is text or comment.\r\n                return null;\r\n            }\r\n            const viewElement = this.mapDomToView(previousSibling);\r\n            if (viewElement) {\r\n                const nextSibling = viewElement.nextSibling;\r\n                // It might be filler which has no corresponding view node.\r\n                if (nextSibling instanceof ViewText) {\r\n                    return nextSibling;\r\n                }\r\n                else {\r\n                    return null;\r\n                }\r\n            }\r\n        }\r\n        // Try to use parent to find the corresponding text node.\r\n        else {\r\n            const viewElement = this.mapDomToView(domText.parentNode);\r\n            if (viewElement) {\r\n                const firstChild = viewElement.getChild(0);\r\n                // It might be filler which has no corresponding view node.\r\n                if (firstChild instanceof ViewText) {\r\n                    return firstChild;\r\n                }\r\n                else {\r\n                    return null;\r\n                }\r\n            }\r\n        }\r\n        return null;\r\n    }\r\n    mapViewToDom(documentFragmentOrElement) {\r\n        return this._viewToDomMapping.get(documentFragmentOrElement);\r\n    }\r\n    /**\r\n     * Finds corresponding text node. Text nodes are not {@link module:engine/view/domconverter~DomConverter#bindElements bound},\r\n     * corresponding text node is returned based on the sibling or parent.\r\n     *\r\n     * If the directly previous sibling is a {@link module:engine/view/domconverter~DomConverter#bindElements bound} element, it is used\r\n     * to find the corresponding text node.\r\n     *\r\n     * If this is a first child in the parent and the parent is a {@link module:engine/view/domconverter~DomConverter#bindElements bound}\r\n     * element, it is used to find the corresponding text node.\r\n     *\r\n     * Otherwise `null` is returned.\r\n     *\r\n     * @param viewText View text node.\r\n     * @returns Corresponding DOM text node or `null`, if it was not possible to find a corresponding node.\r\n     */\r\n    findCorrespondingDomText(viewText) {\r\n        const previousSibling = viewText.previousSibling;\r\n        // Try to use previous sibling to find the corresponding text node.\r\n        if (previousSibling && this.mapViewToDom(previousSibling)) {\r\n            return this.mapViewToDom(previousSibling).nextSibling;\r\n        }\r\n        // If this is a first node, try to use parent to find the corresponding text node.\r\n        if (!previousSibling && viewText.parent && this.mapViewToDom(viewText.parent)) {\r\n            return this.mapViewToDom(viewText.parent).childNodes[0];\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Focuses DOM editable that is corresponding to provided {@link module:engine/view/editableelement~EditableElement}.\r\n     */\r\n    focus(viewEditable) {\r\n        const domEditable = this.mapViewToDom(viewEditable);\r\n        if (domEditable && domEditable.ownerDocument.activeElement !== domEditable) {\r\n            // Save the scrollX and scrollY positions before the focus.\r\n            const { scrollX, scrollY } = global.window;\r\n            const scrollPositions = [];\r\n            // Save all scrollLeft and scrollTop values starting from domEditable up to\r\n            // document#documentElement.\r\n            forEachDomElementAncestor(domEditable, node => {\r\n                const { scrollLeft, scrollTop } = node;\r\n                scrollPositions.push([scrollLeft, scrollTop]);\r\n            });\r\n            domEditable.focus();\r\n            // Restore scrollLeft and scrollTop values starting from domEditable up to\r\n            // document#documentElement.\r\n            // https://github.com/ckeditor/ckeditor5-engine/issues/951\r\n            // https://github.com/ckeditor/ckeditor5-engine/issues/957\r\n            forEachDomElementAncestor(domEditable, node => {\r\n                const [scrollLeft, scrollTop] = scrollPositions.shift();\r\n                node.scrollLeft = scrollLeft;\r\n                node.scrollTop = scrollTop;\r\n            });\r\n            // Restore the scrollX and scrollY positions after the focus.\r\n            // https://github.com/ckeditor/ckeditor5-engine/issues/951\r\n            global.window.scrollTo(scrollX, scrollY);\r\n        }\r\n    }\r\n    /**\r\n     * Returns `true` when `node.nodeType` equals `Node.ELEMENT_NODE`.\r\n     *\r\n     * @param node Node to check.\r\n     */\r\n    isElement(node) {\r\n        return node && node.nodeType == Node.ELEMENT_NODE;\r\n    }\r\n    /**\r\n     * Returns `true` when `node.nodeType` equals `Node.DOCUMENT_FRAGMENT_NODE`.\r\n     *\r\n     * @param node Node to check.\r\n     */\r\n    isDocumentFragment(node) {\r\n        return node && node.nodeType == Node.DOCUMENT_FRAGMENT_NODE;\r\n    }\r\n    /**\r\n     * Checks if the node is an instance of the block filler for this DOM converter.\r\n     *\r\n     * ```ts\r\n     * const converter = new DomConverter( viewDocument, { blockFillerMode: 'br' } );\r\n     *\r\n     * converter.isBlockFiller( BR_FILLER( document ) ); // true\r\n     * converter.isBlockFiller( NBSP_FILLER( document ) ); // false\r\n     * ```\r\n     *\r\n     * **Note:**: For the `'nbsp'` mode the method also checks context of a node so it cannot be a detached node.\r\n     *\r\n     * **Note:** A special case in the `'nbsp'` mode exists where the `<br>` in `<p><br></p>` is treated as a block filler.\r\n     *\r\n     * @param domNode DOM node to check.\r\n     * @returns True if a node is considered a block filler for given mode.\r\n     */\r\n    isBlockFiller(domNode) {\r\n        if (this.blockFillerMode == 'br') {\r\n            return domNode.isEqualNode(BR_FILLER_REF);\r\n        }\r\n        // Special case for <p><br></p> in which <br> should be treated as filler even when we are not in the 'br' mode. See ckeditor5#5564.\r\n        if (domNode.tagName === 'BR' &&\r\n            hasBlockParent(domNode, this.blockElements) &&\r\n            domNode.parentNode.childNodes.length === 1) {\r\n            return true;\r\n        }\r\n        // If not in 'br' mode, try recognizing both marked and regular nbsp block fillers.\r\n        return domNode.isEqualNode(MARKED_NBSP_FILLER_REF) || isNbspBlockFiller(domNode, this.blockElements);\r\n    }\r\n    /**\r\n     * Returns `true` if given selection is a backward selection, that is, if it's `focus` is before `anchor`.\r\n     *\r\n     * @param DOM Selection instance to check.\r\n     */\r\n    isDomSelectionBackward(selection) {\r\n        if (selection.isCollapsed) {\r\n            return false;\r\n        }\r\n        // Since it takes multiple lines of code to check whether a \"DOM Position\" is before/after another \"DOM Position\",\r\n        // we will use the fact that range will collapse if it's end is before it's start.\r\n        const range = this._domDocument.createRange();\r\n        try {\r\n            range.setStart(selection.anchorNode, selection.anchorOffset);\r\n            range.setEnd(selection.focusNode, selection.focusOffset);\r\n        }\r\n        catch (e) {\r\n            // Safari sometimes gives us a selection that makes Range.set{Start,End} throw.\r\n            // See https://github.com/ckeditor/ckeditor5/issues/12375.\r\n            return false;\r\n        }\r\n        const backward = range.collapsed;\r\n        range.detach();\r\n        return backward;\r\n    }\r\n    /**\r\n     * Returns a parent {@link module:engine/view/uielement~UIElement} or {@link module:engine/view/rawelement~RawElement}\r\n     * that hosts the provided DOM node. Returns `null` if there is no such parent.\r\n     */\r\n    getHostViewElement(domNode) {\r\n        const ancestors = getAncestors(domNode);\r\n        // Remove domNode from the list.\r\n        ancestors.pop();\r\n        while (ancestors.length) {\r\n            const domNode = ancestors.pop();\r\n            const viewNode = this._domToViewMapping.get(domNode);\r\n            if (viewNode && (viewNode.is('uiElement') || viewNode.is('rawElement'))) {\r\n                return viewNode;\r\n            }\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Checks if the given selection's boundaries are at correct places.\r\n     *\r\n     * The following places are considered as incorrect for selection boundaries:\r\n     *\r\n     * * before or in the middle of an inline filler sequence,\r\n     * * inside a DOM element which represents {@link module:engine/view/uielement~UIElement a view UI element},\r\n     * * inside a DOM element which represents {@link module:engine/view/rawelement~RawElement a view raw element}.\r\n     *\r\n     * @param domSelection The DOM selection object to be checked.\r\n     * @returns `true` if the given selection is at a correct place, `false` otherwise.\r\n     */\r\n    isDomSelectionCorrect(domSelection) {\r\n        return this._isDomSelectionPositionCorrect(domSelection.anchorNode, domSelection.anchorOffset) &&\r\n            this._isDomSelectionPositionCorrect(domSelection.focusNode, domSelection.focusOffset);\r\n    }\r\n    /**\r\n     * Registers a {@link module:engine/view/matcher~MatcherPattern} for view elements whose content should be treated as raw data\r\n     * and not processed during the conversion from DOM nodes to view elements.\r\n     *\r\n     * This is affecting how {@link module:engine/view/domconverter~DomConverter#domToView} and\r\n     * {@link module:engine/view/domconverter~DomConverter#domChildrenToView} process DOM nodes.\r\n     *\r\n     * The raw data can be later accessed by a\r\n     * {@link module:engine/view/element~Element#getCustomProperty custom property of a view element} called `\"$rawContent\"`.\r\n     *\r\n     * @param pattern Pattern matching a view element whose content should\r\n     * be treated as raw data.\r\n     */\r\n    registerRawContentMatcher(pattern) {\r\n        this._rawContentElementMatcher.add(pattern);\r\n    }\r\n    /**\r\n     * Returns the block {@link module:engine/view/filler filler} node based on the current {@link #blockFillerMode} setting.\r\n     */\r\n    _getBlockFiller() {\r\n        switch (this.blockFillerMode) {\r\n            case 'nbsp':\r\n                return NBSP_FILLER(this._domDocument); // eslint-disable-line new-cap\r\n            case 'markedNbsp':\r\n                return MARKED_NBSP_FILLER(this._domDocument); // eslint-disable-line new-cap\r\n            case 'br':\r\n                return BR_FILLER(this._domDocument); // eslint-disable-line new-cap\r\n        }\r\n    }\r\n    /**\r\n     * Checks if the given DOM position is a correct place for selection boundary. See {@link #isDomSelectionCorrect}.\r\n     *\r\n     * @param domParent Position parent.\r\n     * @param offset Position offset.\r\n     * @returns `true` if given position is at a correct place for selection boundary, `false` otherwise.\r\n     */\r\n    _isDomSelectionPositionCorrect(domParent, offset) {\r\n        // If selection is before or in the middle of inline filler string, it is incorrect.\r\n        if (isText(domParent) && startsWithFiller(domParent) && offset < INLINE_FILLER_LENGTH) {\r\n            // Selection in a text node, at wrong position (before or in the middle of filler).\r\n            return false;\r\n        }\r\n        if (this.isElement(domParent) && startsWithFiller(domParent.childNodes[offset])) {\r\n            // Selection in an element node, before filler text node.\r\n            return false;\r\n        }\r\n        const viewParent = this.mapDomToView(domParent);\r\n        // The position is incorrect when anchored inside a UIElement or a RawElement.\r\n        // Note: In case of UIElement and RawElement, mapDomToView() returns a parent element for any DOM child\r\n        // so there's no need to perform any additional checks.\r\n        if (viewParent && (viewParent.is('uiElement') || viewParent.is('rawElement'))) {\r\n            return false;\r\n        }\r\n        return true;\r\n    }\r\n    /**\r\n     * Takes text data from a given {@link module:engine/view/text~Text#data} and processes it so\r\n     * it is correctly displayed in the DOM.\r\n     *\r\n     * Following changes are done:\r\n     *\r\n     * * a space at the beginning is changed to `&nbsp;` if this is the first text node in its container\r\n     * element or if a previous text node ends with a space character,\r\n     * * space at the end of the text node is changed to `&nbsp;` if there are two spaces at the end of a node or if next node\r\n     * starts with a space or if it is the last text node in its container,\r\n     * * remaining spaces are replaced to a chain of spaces and `&nbsp;` (e.g. `'x   x'` becomes `'x &nbsp; x'`).\r\n     *\r\n     * Content of {@link #preElements} is not processed.\r\n     *\r\n     * @param node View text node to process.\r\n     * @returns Processed text data.\r\n     */\r\n    _processDataFromViewText(node) {\r\n        let data = node.data;\r\n        // If any of node ancestors has a name which is in `preElements` array, then currently processed\r\n        // view text node is (will be) in preformatted element. We should not change whitespaces then.\r\n        if (node.getAncestors().some(parent => this.preElements.includes(parent.name))) {\r\n            return data;\r\n        }\r\n        // 1. Replace the first space with a nbsp if the previous node ends with a space or there is no previous node\r\n        // (container element boundary).\r\n        if (data.charAt(0) == ' ') {\r\n            const prevNode = this._getTouchingInlineViewNode(node, false);\r\n            const prevEndsWithSpace = prevNode && prevNode.is('$textProxy') && this._nodeEndsWithSpace(prevNode);\r\n            if (prevEndsWithSpace || !prevNode) {\r\n                data = '\\u00A0' + data.substr(1);\r\n            }\r\n        }\r\n        // 2. Replace the last space with nbsp if there are two spaces at the end or if the next node starts with space or there is no\r\n        // next node (container element boundary).\r\n        //\r\n        // Keep in mind that Firefox prefers $nbsp; before tag, not inside it:\r\n        //\r\n        // Foo <span>&nbsp;bar</span>  <-- bad.\r\n        // Foo&nbsp;<span> bar</span>  <-- good.\r\n        //\r\n        // More here: https://github.com/ckeditor/ckeditor5-engine/issues/1747.\r\n        if (data.charAt(data.length - 1) == ' ') {\r\n            const nextNode = this._getTouchingInlineViewNode(node, true);\r\n            const nextStartsWithSpace = nextNode && nextNode.is('$textProxy') && nextNode.data.charAt(0) == ' ';\r\n            if (data.charAt(data.length - 2) == ' ' || !nextNode || nextStartsWithSpace) {\r\n                data = data.substr(0, data.length - 1) + '\\u00A0';\r\n            }\r\n        }\r\n        // 3. Create space+nbsp pairs.\r\n        return data.replace(/ {2}/g, ' \\u00A0');\r\n    }\r\n    /**\r\n     * Checks whether given node ends with a space character after changing appropriate space characters to `&nbsp;`s.\r\n     *\r\n     * @param  node Node to check.\r\n     * @returns `true` if given `node` ends with space, `false` otherwise.\r\n     */\r\n    _nodeEndsWithSpace(node) {\r\n        if (node.getAncestors().some(parent => this.preElements.includes(parent.name))) {\r\n            return false;\r\n        }\r\n        const data = this._processDataFromViewText(node);\r\n        return data.charAt(data.length - 1) == ' ';\r\n    }\r\n    /**\r\n     * Takes text data from native `Text` node and processes it to a correct {@link module:engine/view/text~Text view text node} data.\r\n     *\r\n     * Following changes are done:\r\n     *\r\n     * * multiple whitespaces are replaced to a single space,\r\n     * * space at the beginning of a text node is removed if it is the first text node in its container\r\n     * element or if the previous text node ends with a space character,\r\n     * * space at the end of the text node is removed if there are two spaces at the end of a node or if next node\r\n     * starts with a space or if it is the last text node in its container\r\n     * * nbsps are converted to spaces.\r\n     *\r\n     * @param node DOM text node to process.\r\n     * @returns Processed data.\r\n     */\r\n    _processDataFromDomText(node) {\r\n        let data = node.data;\r\n        if (_hasDomParentOfType(node, this.preElements)) {\r\n            return getDataWithoutFiller(node);\r\n        }\r\n        // Change all consecutive whitespace characters (from the [ \\n\\t\\r] set –\r\n        // see https://github.com/ckeditor/ckeditor5-engine/issues/822#issuecomment-311670249) to a single space character.\r\n        // That's how multiple whitespaces are treated when rendered, so we normalize those whitespaces.\r\n        // We're replacing 1+ (and not 2+) to also normalize singular \\n\\t\\r characters (#822).\r\n        data = data.replace(/[ \\n\\t\\r]{1,}/g, ' ');\r\n        const prevNode = this._getTouchingInlineDomNode(node, false);\r\n        const nextNode = this._getTouchingInlineDomNode(node, true);\r\n        const shouldLeftTrim = this._checkShouldLeftTrimDomText(node, prevNode);\r\n        const shouldRightTrim = this._checkShouldRightTrimDomText(node, nextNode);\r\n        // If the previous dom text node does not exist or it ends by whitespace character, remove space character from the beginning\r\n        // of this text node. Such space character is treated as a whitespace.\r\n        if (shouldLeftTrim) {\r\n            data = data.replace(/^ /, '');\r\n        }\r\n        // If the next text node does not exist remove space character from the end of this text node.\r\n        if (shouldRightTrim) {\r\n            data = data.replace(/ $/, '');\r\n        }\r\n        // At the beginning and end of a block element, Firefox inserts normal space + <br> instead of non-breaking space.\r\n        // This means that the text node starts/end with normal space instead of non-breaking space.\r\n        // This causes a problem because the normal space would be removed in `.replace` calls above. To prevent that,\r\n        // the inline filler is removed only after the data is initially processed (by the `.replace` above). See ckeditor5#692.\r\n        data = getDataWithoutFiller(new Text(data));\r\n        // At this point we should have removed all whitespaces from DOM text data.\r\n        //\r\n        // Now, We will reverse the process that happens in `_processDataFromViewText`.\r\n        //\r\n        // We have to change &nbsp; chars, that were in DOM text data because of rendering reasons, to spaces.\r\n        // First, change all ` \\u00A0` pairs (space + &nbsp;) to two spaces. DOM converter changes two spaces from model/view to\r\n        // ` \\u00A0` to ensure proper rendering. Since here we convert back, we recognize those pairs and change them back to `  `.\r\n        data = data.replace(/ \\u00A0/g, '  ');\r\n        const isNextNodeInlineObjectElement = nextNode && this.isElement(nextNode) && nextNode.tagName != 'BR';\r\n        const isNextNodeStartingWithSpace = nextNode && isText(nextNode) && nextNode.data.charAt(0) == ' ';\r\n        // Then, let's change the last nbsp to a space.\r\n        if (/( |\\u00A0)\\u00A0$/.test(data) || !nextNode || isNextNodeInlineObjectElement || isNextNodeStartingWithSpace) {\r\n            data = data.replace(/\\u00A0$/, ' ');\r\n        }\r\n        // Then, change &nbsp; character that is at the beginning of the text node to space character.\r\n        // We do that replacement only if this is the first node or the previous node ends on whitespace character.\r\n        if (shouldLeftTrim || prevNode && this.isElement(prevNode) && prevNode.tagName != 'BR') {\r\n            data = data.replace(/^\\u00A0/, ' ');\r\n        }\r\n        // At this point, all whitespaces should be removed and all &nbsp; created for rendering reasons should be\r\n        // changed to normal space. All left &nbsp; are &nbsp; inserted intentionally.\r\n        return data;\r\n    }\r\n    /**\r\n     * Helper function which checks if a DOM text node, preceded by the given `prevNode` should\r\n     * be trimmed from the left side.\r\n     *\r\n     * @param prevNode Either DOM text or `<br>` or one of `#inlineObjectElements`.\r\n     */\r\n    _checkShouldLeftTrimDomText(node, prevNode) {\r\n        if (!prevNode) {\r\n            return true;\r\n        }\r\n        if (this.isElement(prevNode)) {\r\n            return prevNode.tagName === 'BR';\r\n        }\r\n        // Shouldn't left trim if previous node is a node that was encountered as a raw content node.\r\n        if (this._encounteredRawContentDomNodes.has(node.previousSibling)) {\r\n            return false;\r\n        }\r\n        return /[^\\S\\u00A0]/.test(prevNode.data.charAt(prevNode.data.length - 1));\r\n    }\r\n    /**\r\n     * Helper function which checks if a DOM text node, succeeded by the given `nextNode` should\r\n     * be trimmed from the right side.\r\n     *\r\n     * @param nextNode Either DOM text or `<br>` or one of `#inlineObjectElements`.\r\n     */\r\n    _checkShouldRightTrimDomText(node, nextNode) {\r\n        if (nextNode) {\r\n            return false;\r\n        }\r\n        return !startsWithFiller(node);\r\n    }\r\n    /**\r\n     * Helper function. For given {@link module:engine/view/text~Text view text node}, it finds previous or next sibling\r\n     * that is contained in the same container element. If there is no such sibling, `null` is returned.\r\n     *\r\n     * @param node Reference node.\r\n     * @returns Touching text node, an inline object\r\n     * or `null` if there is no next or previous touching text node.\r\n     */\r\n    _getTouchingInlineViewNode(node, getNext) {\r\n        const treeWalker = new ViewTreeWalker({\r\n            startPosition: getNext ? ViewPosition._createAfter(node) : ViewPosition._createBefore(node),\r\n            direction: getNext ? 'forward' : 'backward'\r\n        });\r\n        for (const value of treeWalker) {\r\n            // Found an inline object (for example an image).\r\n            if (value.item.is('element') && this.inlineObjectElements.includes(value.item.name)) {\r\n                return value.item;\r\n            }\r\n            // ViewContainerElement is found on a way to next ViewText node, so given `node` was first/last\r\n            // text node in its container element.\r\n            else if (value.item.is('containerElement')) {\r\n                return null;\r\n            }\r\n            // <br> found – it works like a block boundary, so do not scan further.\r\n            else if (value.item.is('element', 'br')) {\r\n                return null;\r\n            }\r\n            // Found a text node in the same container element.\r\n            else if (value.item.is('$textProxy')) {\r\n                return value.item;\r\n            }\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Helper function. For the given text node, it finds the closest touching node which is either\r\n     * a text, `<br>` or an {@link #inlineObjectElements inline object}.\r\n     *\r\n     * If no such node is found, `null` is returned.\r\n     *\r\n     * For instance, in the following DOM structure:\r\n     *\r\n     * ```html\r\n     * <p>foo<b>bar</b><br>bom</p>\r\n     * ```\r\n     *\r\n     * * `foo` doesn't have its previous touching inline node (`null` is returned),\r\n     * * `foo`'s next touching inline node is `bar`\r\n     * * `bar`'s next touching inline node is `<br>`\r\n     *\r\n     * This method returns text nodes and `<br>` elements because these types of nodes affect how\r\n     * spaces in the given text node need to be converted.\r\n     */\r\n    _getTouchingInlineDomNode(node, getNext) {\r\n        if (!node.parentNode) {\r\n            return null;\r\n        }\r\n        const stepInto = getNext ? 'firstChild' : 'lastChild';\r\n        const stepOver = getNext ? 'nextSibling' : 'previousSibling';\r\n        let skipChildren = true;\r\n        let returnNode = node;\r\n        do {\r\n            if (!skipChildren && returnNode[stepInto]) {\r\n                returnNode = returnNode[stepInto];\r\n            }\r\n            else if (returnNode[stepOver]) {\r\n                returnNode = returnNode[stepOver];\r\n                skipChildren = false;\r\n            }\r\n            else {\r\n                returnNode = returnNode.parentNode;\r\n                skipChildren = true;\r\n            }\r\n            if (!returnNode || this._isBlockElement(returnNode)) {\r\n                return null;\r\n            }\r\n        } while (!(isText(returnNode) || returnNode.tagName == 'BR' || this._isInlineObjectElement(returnNode)));\r\n        return returnNode;\r\n    }\r\n    /**\r\n     * Returns `true` if a DOM node belongs to {@link #blockElements}. `false` otherwise.\r\n     */\r\n    _isBlockElement(node) {\r\n        return this.isElement(node) && this.blockElements.includes(node.tagName.toLowerCase());\r\n    }\r\n    /**\r\n     * Returns `true` if a DOM node belongs to {@link #inlineObjectElements}. `false` otherwise.\r\n     */\r\n    _isInlineObjectElement(node) {\r\n        return this.isElement(node) && this.inlineObjectElements.includes(node.tagName.toLowerCase());\r\n    }\r\n    /**\r\n     * Creates view element basing on the node type.\r\n     *\r\n     * @param node DOM node to check.\r\n     * @param options Conversion options. See {@link module:engine/view/domconverter~DomConverter#domToView} options parameter.\r\n     */\r\n    _createViewElement(node, options) {\r\n        if (isComment(node)) {\r\n            return new ViewUIElement(this.document, '$comment');\r\n        }\r\n        const viewName = options.keepOriginalCase ? node.tagName : node.tagName.toLowerCase();\r\n        return new ViewElement(this.document, viewName);\r\n    }\r\n    /**\r\n     * Checks if view element's content should be treated as a raw data.\r\n     *\r\n     * @param viewElement View element to check.\r\n     * @param options Conversion options. See {@link module:engine/view/domconverter~DomConverter#domToView} options parameter.\r\n     */\r\n    _isViewElementWithRawContent(viewElement, options) {\r\n        return options.withChildren !== false && !!this._rawContentElementMatcher.match(viewElement);\r\n    }\r\n    /**\r\n     * Checks whether a given element name should be renamed in a current rendering mode.\r\n     *\r\n     * @param elementName The name of view element.\r\n     */\r\n    _shouldRenameElement(elementName) {\r\n        const name = elementName.toLowerCase();\r\n        return this.renderingMode === 'editing' && this.unsafeElements.includes(name);\r\n    }\r\n    /**\r\n     * Return a <span> element with a special attribute holding the name of the original element.\r\n     * Optionally, copy all the attributes of the original element if that element is provided.\r\n     *\r\n     * @param elementName The name of view element.\r\n     * @param originalDomElement The original DOM element to copy attributes and content from.\r\n     */\r\n    _createReplacementDomElement(elementName, originalDomElement) {\r\n        const newDomElement = this._domDocument.createElement('span');\r\n        // Mark the span replacing a script as hidden.\r\n        newDomElement.setAttribute(UNSAFE_ELEMENT_REPLACEMENT_ATTRIBUTE, elementName);\r\n        if (originalDomElement) {\r\n            while (originalDomElement.firstChild) {\r\n                newDomElement.appendChild(originalDomElement.firstChild);\r\n            }\r\n            for (const attributeName of originalDomElement.getAttributeNames()) {\r\n                newDomElement.setAttribute(attributeName, originalDomElement.getAttribute(attributeName));\r\n            }\r\n        }\r\n        return newDomElement;\r\n    }\r\n}\r\n/**\r\n * Helper function.\r\n * Used to check if given native `Element` or `Text` node has parent with tag name from `types` array.\r\n *\r\n * @returns`true` if such parent exists or `false` if it does not.\r\n */\r\nfunction _hasDomParentOfType(node, types) {\r\n    const parents = getAncestors(node);\r\n    return parents.some(parent => parent.tagName && types.includes(parent.tagName.toLowerCase()));\r\n}\r\n/**\r\n * A helper that executes given callback for each DOM node's ancestor, starting from the given node\r\n * and ending in document#documentElement.\r\n *\r\n * @param callback A callback to be executed for each ancestor.\r\n */\r\nfunction forEachDomElementAncestor(element, callback) {\r\n    let node = element;\r\n    while (node) {\r\n        callback(node);\r\n        node = node.parentElement;\r\n    }\r\n}\r\n/**\r\n * Checks if given node is a nbsp block filler.\r\n *\r\n * A &nbsp; is a block filler only if it is a single child of a block element.\r\n *\r\n * @param domNode DOM node.\r\n */\r\nfunction isNbspBlockFiller(domNode, blockElements) {\r\n    const isNBSP = domNode.isEqualNode(NBSP_FILLER_REF);\r\n    return isNBSP && hasBlockParent(domNode, blockElements) && domNode.parentNode.childNodes.length === 1;\r\n}\r\n/**\r\n * Checks if domNode has block parent.\r\n *\r\n * @param domNode DOM node.\r\n */\r\nfunction hasBlockParent(domNode, blockElements) {\r\n    const parent = domNode.parentNode;\r\n    return !!parent && !!parent.tagName && blockElements.includes(parent.tagName.toLowerCase());\r\n}\r\n/**\r\n * Log to console the information about element that was replaced.\r\n * Check UNSAFE_ELEMENTS for all recognized unsafe elements.\r\n *\r\n * @param elementName The name of the view element.\r\n */\r\nfunction _logUnsafeElement(elementName) {\r\n    if (elementName === 'script') {\r\n        logWarning('domconverter-unsafe-script-element-detected');\r\n    }\r\n    if (elementName === 'style') {\r\n        logWarning('domconverter-unsafe-style-element-detected');\r\n    }\r\n}\r\n/**\r\n * While rendering the editor content, the {@link module:engine/view/domconverter~DomConverter} detected a `<script>` element that may\r\n * disrupt the editing experience. To avoid this, the `<script>` element was replaced with `<span data-ck-unsafe-element=\"script\"></span>`.\r\n *\r\n * @error domconverter-unsafe-script-element-detected\r\n */\r\n/**\r\n * While rendering the editor content, the {@link module:engine/view/domconverter~DomConverter} detected a `<style>` element that may affect\r\n * the editing experience. To avoid this, the `<style>` element was replaced with `<span data-ck-unsafe-element=\"style\"></span>`.\r\n *\r\n * @error domconverter-unsafe-style-element-detected\r\n */\r\n/**\r\n * The {@link module:engine/view/domconverter~DomConverter} detected an interactive attribute in the\r\n * {@glink framework/architecture/editing-engine#editing-pipeline editing pipeline}. For the best\r\n * editing experience, the attribute was renamed to `data-ck-unsafe-attribute-[original attribute name]`.\r\n *\r\n * If you are the author of the plugin that generated this attribute and you want it to be preserved\r\n * in the editing pipeline, you can configure this when creating the element\r\n * using {@link module:engine/view/downcastwriter~DowncastWriter} during the\r\n * {@glink framework/architecture/editing-engine#conversion model–view conversion}. Methods such as\r\n * {@link module:engine/view/downcastwriter~DowncastWriter#createContainerElement},\r\n * {@link module:engine/view/downcastwriter~DowncastWriter#createAttributeElement}, or\r\n * {@link module:engine/view/downcastwriter~DowncastWriter#createEmptyElement}\r\n * accept an option that will disable filtering of specific attributes:\r\n *\r\n * ```ts\r\n * const paragraph = writer.createContainerElement( 'p',\r\n * \t{\r\n * \t\tclass: 'clickable-paragraph',\r\n * \t\tonclick: 'alert( \"Paragraph clicked!\" )'\r\n * \t},\r\n * \t{\r\n * \t\t// Make sure the \"onclick\" attribute will pass through.\r\n * \t\trenderUnsafeAttributes: [ 'onclick' ]\r\n * \t}\r\n * );\r\n * ```\r\n *\r\n * @error domconverter-unsafe-attribute-detected\r\n * @param domElement The DOM element the attribute was set on.\r\n * @param key The original name of the attribute\r\n * @param value The value of the original attribute\r\n */\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/dom/isvalidattributename\r\n */\r\nimport global from './global';\r\n/**\r\n * Checks if the given attribute name is valid in terms of HTML.\r\n *\r\n * @param name Attribute name.\r\n */\r\nexport default function isValidAttributeName(name) {\r\n    try {\r\n        global.document.createAttribute(name);\r\n    }\r\n    catch (error) {\r\n        return false;\r\n    }\r\n    return true;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/observer/observer\r\n */\r\nimport { DomEmitterMixin } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Abstract base observer class. Observers are classes which listen to DOM events, do the preliminary\r\n * processing and fire events on the {@link module:engine/view/document~Document} objects.\r\n * Observers can also add features to the view, for instance by updating its status or marking elements\r\n * which need a refresh on DOM events.\r\n */\r\nexport default class Observer extends DomEmitterMixin() {\r\n    /**\r\n     * Creates an instance of the observer.\r\n     */\r\n    constructor(view) {\r\n        super();\r\n        /**\r\n         * The state of the observer. If it is disabled, no events will be fired.\r\n         */\r\n        this._isEnabled = false;\r\n        this.view = view;\r\n        this.document = view.document;\r\n    }\r\n    /**\r\n     * The state of the observer. If it is disabled, no events will be fired.\r\n     */\r\n    get isEnabled() {\r\n        return this._isEnabled;\r\n    }\r\n    /**\r\n     * Enables the observer. This method is called when the observer is registered to the\r\n     * {@link module:engine/view/view~View} and after {@link module:engine/view/view~View#forceRender rendering}\r\n     * (all observers are {@link #disable disabled} before rendering).\r\n     *\r\n     * A typical use case for disabling observers is that mutation observers need to be disabled for the rendering.\r\n     * However, a child class may not need to be disabled, so it can implement an empty method.\r\n     *\r\n     * @see module:engine/view/observer/observer~Observer#disable\r\n     */\r\n    enable() {\r\n        this._isEnabled = true;\r\n    }\r\n    /**\r\n     * Disables the observer. This method is called before\r\n     * {@link module:engine/view/view~View#forceRender rendering} to prevent firing events during rendering.\r\n     *\r\n     * @see module:engine/view/observer/observer~Observer#enable\r\n     */\r\n    disable() {\r\n        this._isEnabled = false;\r\n    }\r\n    /**\r\n     * Disables and destroys the observer, among others removes event listeners created by the observer.\r\n     */\r\n    destroy() {\r\n        this.disable();\r\n        this.stopListening();\r\n    }\r\n    /**\r\n     * Checks whether a given DOM event should be ignored (should not be turned into a synthetic view document event).\r\n     *\r\n     * Currently, an event will be ignored only if its target or any of its ancestors has the `data-cke-ignore-events` attribute.\r\n     * This attribute can be used inside the structures generated by\r\n     * {@link module:engine/view/downcastwriter~DowncastWriter#createUIElement `DowncastWriter#createUIElement()`} to ignore events\r\n     * fired within a UI that should be excluded from CKEditor 5's realms.\r\n     *\r\n     * @param domTarget The DOM event target to check (usually an element, sometimes a text node and\r\n     * potentially sometimes a document, too).\r\n     * @returns Whether this event should be ignored by the observer.\r\n     */\r\n    checkShouldIgnoreEventFromTarget(domTarget) {\r\n        if (domTarget && domTarget.nodeType === 3) {\r\n            domTarget = domTarget.parentNode;\r\n        }\r\n        if (!domTarget || domTarget.nodeType !== 1) {\r\n            return false;\r\n        }\r\n        return domTarget.matches('[data-cke-ignore-events], [data-cke-ignore-events] *');\r\n    }\r\n}\r\n","import copyObject from './_copyObject.js';\nimport createAssigner from './_createAssigner.js';\nimport keysIn from './keysIn.js';\n\n/**\n * This method is like `_.assign` except that it iterates over own and\n * inherited source properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extend\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assign\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n * }\n *\n * function Bar() {\n *   this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n */\nvar assignIn = createAssigner(function(object, source) {\n  copyObject(source, keysIn(source), object);\n});\n\nexport default assignIn;\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/observer/domeventdata\r\n */\r\nimport { extend } from 'lodash-es';\r\n/**\r\n * Information about a DOM event in context of the {@link module:engine/view/document~Document}.\r\n * It wraps the native event, which usually should not be used as the wrapper contains\r\n * additional data (like key code for keyboard events).\r\n *\r\n * @typeParam TEvent The type of DOM Event that this class represents.\r\n */\r\nexport default class DomEventData {\r\n    /**\r\n     * @param view The instance of the view controller.\r\n     * @param domEvent The DOM event.\r\n     * @param additionalData Additional properties that the instance should contain.\r\n     */\r\n    constructor(view, domEvent, additionalData) {\r\n        this.view = view;\r\n        this.document = view.document;\r\n        this.domEvent = domEvent;\r\n        this.domTarget = domEvent.target;\r\n        extend(this, additionalData);\r\n    }\r\n    /**\r\n     * The tree view element representing the target.\r\n     */\r\n    get target() {\r\n        return this.view.domConverter.mapDomToView(this.domTarget);\r\n    }\r\n    /**\r\n     * Prevents the native's event default action.\r\n     */\r\n    preventDefault() {\r\n        this.domEvent.preventDefault();\r\n    }\r\n    /**\r\n     * Stops native event propagation.\r\n     */\r\n    stopPropagation() {\r\n        this.domEvent.stopPropagation();\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/observer/domeventobserver\r\n */\r\nimport Observer from './observer';\r\nimport DomEventData from './domeventdata';\r\n/**\r\n * Base class for DOM event observers. This class handles\r\n * {@link module:engine/view/observer/observer~Observer#observe adding} listeners to DOM elements,\r\n * {@link module:engine/view/observer/observer~Observer#disable disabling} and\r\n * {@link module:engine/view/observer/observer~Observer#enable re-enabling} events.\r\n * Child class needs to define\r\n * {@link module:engine/view/observer/domeventobserver~DomEventObserver#domEventType DOM event type} and\r\n * {@link module:engine/view/observer/domeventobserver~DomEventObserver#onDomEvent callback}.\r\n *\r\n * For instance:\r\n *\r\n * ```ts\r\n * class ClickObserver extends DomEventObserver<'click'> {\r\n * \t// It can also be defined as a normal property in the constructor.\r\n * \tget domEventType(): 'click' {\r\n * \t\treturn 'click';\r\n * \t}\r\n *\r\n * \tonDomEvent( domEvent: MouseEvent ): void {\r\n * \t\tthis.fire( 'click', domEvent );\r\n * \t}\r\n * }\r\n * ```\r\n *\r\n * @typeParam EventType DOM Event type name or an union of those.\r\n * @typeParam AdditionalData Additional data passed along with the event.\r\n */\r\nexport default class DomEventObserver extends Observer {\r\n    constructor() {\r\n        super(...arguments);\r\n        /**\r\n         * If set to `true` DOM events will be listened on the capturing phase.\r\n         * Default value is `false`.\r\n         */\r\n        this.useCapture = false;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    observe(domElement) {\r\n        const types = typeof this.domEventType == 'string' ? [this.domEventType] : this.domEventType;\r\n        types.forEach(type => {\r\n            this.listenTo(domElement, type, (eventInfo, domEvent) => {\r\n                if (this.isEnabled && !this.checkShouldIgnoreEventFromTarget(domEvent.target)) {\r\n                    this.onDomEvent(domEvent);\r\n                }\r\n            }, { useCapture: this.useCapture });\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    stopObserving(domElement) {\r\n        this.stopListening(domElement);\r\n    }\r\n    /**\r\n     * Calls `Document#fire()` if observer {@link #isEnabled is enabled}.\r\n     *\r\n     * @see module:utils/emittermixin~Emitter#fire\r\n     * @param eventType The event type (name).\r\n     * @param domEvent The DOM event.\r\n     * @param additionalData The additional data which should extend the\r\n     * {@link module:engine/view/observer/domeventdata~DomEventData event data} object.\r\n     */\r\n    fire(eventType, domEvent, additionalData) {\r\n        if (this.isEnabled) {\r\n            this.document.fire(eventType, new DomEventData(this.view, domEvent, additionalData));\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/observer/keyobserver\r\n */\r\nimport DomEventObserver from './domeventobserver';\r\nimport { getCode } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Observer for events connected with pressing keyboard keys.\r\n *\r\n * Note that this observer is attached by the {@link module:engine/view/view~View} and is available by default.\r\n */\r\nexport default class KeyObserver extends DomEventObserver {\r\n    constructor() {\r\n        super(...arguments);\r\n        /**\r\n         * @inheritDoc\r\n         */\r\n        this.domEventType = ['keydown', 'keyup'];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    onDomEvent(domEvt) {\r\n        const data = {\r\n            keyCode: domEvt.keyCode,\r\n            altKey: domEvt.altKey,\r\n            ctrlKey: domEvt.ctrlKey,\r\n            shiftKey: domEvt.shiftKey,\r\n            metaKey: domEvt.metaKey,\r\n            get keystroke() {\r\n                return getCode(this);\r\n            }\r\n        };\r\n        this.fire(domEvt.type, domEvt, data);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/observer/fakeselectionobserver\r\n */\r\nimport Observer from './observer';\r\nimport ViewSelection from '../selection';\r\nimport { keyCodes } from '@ckeditor/ckeditor5-utils';\r\nimport { debounce } from 'lodash-es';\r\n/**\r\n * Fake selection observer class. If view selection is fake it is placed in dummy DOM container. This observer listens\r\n * on {@link module:engine/view/document~Document#event:keydown keydown} events and handles moving fake view selection to the correct place\r\n * if arrow keys are pressed.\r\n * Fires {@link module:engine/view/document~Document#event:selectionChange selectionChange event} simulating natural behaviour of\r\n * {@link module:engine/view/observer/selectionobserver~SelectionObserver SelectionObserver}.\r\n */\r\nexport default class FakeSelectionObserver extends Observer {\r\n    /**\r\n     * Creates new FakeSelectionObserver instance.\r\n     */\r\n    constructor(view) {\r\n        super(view);\r\n        this._fireSelectionChangeDoneDebounced = debounce(data => {\r\n            this.document.fire('selectionChangeDone', data);\r\n        }, 200);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    observe() {\r\n        const document = this.document;\r\n        document.on('arrowKey', (eventInfo, data) => {\r\n            const selection = document.selection;\r\n            if (selection.isFake && this.isEnabled) {\r\n                // Prevents default key down handling - no selection change will occur.\r\n                data.preventDefault();\r\n            }\r\n        }, { context: '$capture' });\r\n        document.on('arrowKey', (eventInfo, data) => {\r\n            const selection = document.selection;\r\n            if (selection.isFake && this.isEnabled) {\r\n                this._handleSelectionMove(data.keyCode);\r\n            }\r\n        }, { priority: 'lowest' });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    stopObserving() { }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        this._fireSelectionChangeDoneDebounced.cancel();\r\n    }\r\n    /**\r\n     * Handles collapsing view selection according to given key code. If left or up key is provided - new selection will be\r\n     * collapsed to left. If right or down key is pressed - new selection will be collapsed to right.\r\n     *\r\n     * This method fires {@link module:engine/view/document~Document#event:selectionChange} and\r\n     * {@link module:engine/view/document~Document#event:selectionChangeDone} events imitating behaviour of\r\n     * {@link module:engine/view/observer/selectionobserver~SelectionObserver}.\r\n     */\r\n    _handleSelectionMove(keyCode) {\r\n        const selection = this.document.selection;\r\n        const newSelection = new ViewSelection(selection.getRanges(), { backward: selection.isBackward, fake: false });\r\n        // Left or up arrow pressed - move selection to start.\r\n        if (keyCode == keyCodes.arrowleft || keyCode == keyCodes.arrowup) {\r\n            newSelection.setTo(newSelection.getFirstPosition());\r\n        }\r\n        // Right or down arrow pressed - move selection to end.\r\n        if (keyCode == keyCodes.arrowright || keyCode == keyCodes.arrowdown) {\r\n            newSelection.setTo(newSelection.getLastPosition());\r\n        }\r\n        const data = {\r\n            oldSelection: selection,\r\n            newSelection,\r\n            domSelection: null\r\n        };\r\n        // Fire dummy selection change event.\r\n        this.document.fire('selectionChange', data);\r\n        // Call` #_fireSelectionChangeDoneDebounced` every time when `selectionChange` event is fired.\r\n        // This function is debounced what means that `selectionChangeDone` event will be fired only when\r\n        // defined int the function time will elapse since the last time the function was called.\r\n        // So `selectionChangeDone` will be fired when selection will stop changing.\r\n        this._fireSelectionChangeDoneDebounced(data);\r\n    }\r\n}\r\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n  this.__data__.set(value, HASH_UNDEFINED);\n  return this;\n}\n\nexport default setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n  return this.__data__.has(value);\n}\n\nexport default setCacheHas;\n","import MapCache from './_MapCache.js';\nimport setCacheAdd from './_setCacheAdd.js';\nimport setCacheHas from './_setCacheHas.js';\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n  var index = -1,\n      length = values == null ? 0 : values.length;\n\n  this.__data__ = new MapCache;\n  while (++index < length) {\n    this.add(values[index]);\n  }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nexport default SetCache;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n *  else `false`.\n */\nfunction arraySome(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nexport default arraySome;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n  return cache.has(key);\n}\n\nexport default cacheHas;\n","import SetCache from './_SetCache.js';\nimport arraySome from './_arraySome.js';\nimport cacheHas from './_cacheHas.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n    return false;\n  }\n  // Check that cyclic values are equal.\n  var arrStacked = stack.get(array);\n  var othStacked = stack.get(other);\n  if (arrStacked && othStacked) {\n    return arrStacked == other && othStacked == array;\n  }\n  var index = -1,\n      result = true,\n      seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n  stack.set(array, other);\n  stack.set(other, array);\n\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, arrValue, index, other, array, stack)\n        : customizer(arrValue, othValue, index, array, other, stack);\n    }\n    if (compared !== undefined) {\n      if (compared) {\n        continue;\n      }\n      result = false;\n      break;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (seen) {\n      if (!arraySome(other, function(othValue, othIndex) {\n            if (!cacheHas(seen, othIndex) &&\n                (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n              return seen.push(othIndex);\n            }\n          })) {\n        result = false;\n        break;\n      }\n    } else if (!(\n          arrValue === othValue ||\n            equalFunc(arrValue, othValue, bitmask, customizer, stack)\n        )) {\n      result = false;\n      break;\n    }\n  }\n  stack['delete'](array);\n  stack['delete'](other);\n  return result;\n}\n\nexport default equalArrays;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n  var index = -1,\n      result = Array(map.size);\n\n  map.forEach(function(value, key) {\n    result[++index] = [key, value];\n  });\n  return result;\n}\n\nexport default mapToArray;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = value;\n  });\n  return result;\n}\n\nexport default setToArray;\n","import Symbol from './_Symbol.js';\nimport Uint8Array from './_Uint8Array.js';\nimport eq from './eq.js';\nimport equalArrays from './_equalArrays.js';\nimport mapToArray from './_mapToArray.js';\nimport setToArray from './_setToArray.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n  switch (tag) {\n    case dataViewTag:\n      if ((object.byteLength != other.byteLength) ||\n          (object.byteOffset != other.byteOffset)) {\n        return false;\n      }\n      object = object.buffer;\n      other = other.buffer;\n\n    case arrayBufferTag:\n      if ((object.byteLength != other.byteLength) ||\n          !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n        return false;\n      }\n      return true;\n\n    case boolTag:\n    case dateTag:\n    case numberTag:\n      // Coerce booleans to `1` or `0` and dates to milliseconds.\n      // Invalid dates are coerced to `NaN`.\n      return eq(+object, +other);\n\n    case errorTag:\n      return object.name == other.name && object.message == other.message;\n\n    case regexpTag:\n    case stringTag:\n      // Coerce regexes to strings and treat strings, primitives and objects,\n      // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n      // for more details.\n      return object == (other + '');\n\n    case mapTag:\n      var convert = mapToArray;\n\n    case setTag:\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n      convert || (convert = setToArray);\n\n      if (object.size != other.size && !isPartial) {\n        return false;\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(object);\n      if (stacked) {\n        return stacked == other;\n      }\n      bitmask |= COMPARE_UNORDERED_FLAG;\n\n      // Recursively compare objects (susceptible to call stack limits).\n      stack.set(object, other);\n      var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n      stack['delete'](object);\n      return result;\n\n    case symbolTag:\n      if (symbolValueOf) {\n        return symbolValueOf.call(object) == symbolValueOf.call(other);\n      }\n  }\n  return false;\n}\n\nexport default equalByTag;\n","import getAllKeys from './_getAllKeys.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      objProps = getAllKeys(object),\n      objLength = objProps.length,\n      othProps = getAllKeys(other),\n      othLength = othProps.length;\n\n  if (objLength != othLength && !isPartial) {\n    return false;\n  }\n  var index = objLength;\n  while (index--) {\n    var key = objProps[index];\n    if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  // Check that cyclic values are equal.\n  var objStacked = stack.get(object);\n  var othStacked = stack.get(other);\n  if (objStacked && othStacked) {\n    return objStacked == other && othStacked == object;\n  }\n  var result = true;\n  stack.set(object, other);\n  stack.set(other, object);\n\n  var skipCtor = isPartial;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, objValue, key, other, object, stack)\n        : customizer(objValue, othValue, key, object, other, stack);\n    }\n    // Recursively compare objects (susceptible to call stack limits).\n    if (!(compared === undefined\n          ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n          : compared\n        )) {\n      result = false;\n      break;\n    }\n    skipCtor || (skipCtor = key == 'constructor');\n  }\n  if (result && !skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    // Non `Object` object instances with different constructors are not equal.\n    if (objCtor != othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n          typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n      result = false;\n    }\n  }\n  stack['delete'](object);\n  stack['delete'](other);\n  return result;\n}\n\nexport default equalObjects;\n","import Stack from './_Stack.js';\nimport equalArrays from './_equalArrays.js';\nimport equalByTag from './_equalByTag.js';\nimport equalObjects from './_equalObjects.js';\nimport getTag from './_getTag.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = objIsArr ? arrayTag : getTag(object),\n      othTag = othIsArr ? arrayTag : getTag(other);\n\n  objTag = objTag == argsTag ? objectTag : objTag;\n  othTag = othTag == argsTag ? objectTag : othTag;\n\n  var objIsObj = objTag == objectTag,\n      othIsObj = othTag == objectTag,\n      isSameTag = objTag == othTag;\n\n  if (isSameTag && isBuffer(object)) {\n    if (!isBuffer(other)) {\n      return false;\n    }\n    objIsArr = true;\n    objIsObj = false;\n  }\n  if (isSameTag && !objIsObj) {\n    stack || (stack = new Stack);\n    return (objIsArr || isTypedArray(object))\n      ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n      : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n  }\n  if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      var objUnwrapped = objIsWrapped ? object.value() : object,\n          othUnwrapped = othIsWrapped ? other.value() : other;\n\n      stack || (stack = new Stack);\n      return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  stack || (stack = new Stack);\n  return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nexport default baseIsEqualDeep;\n","import baseIsEqualDeep from './_baseIsEqualDeep.js';\nimport isObjectLike from './isObjectLike.js';\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n *  1 - Unordered comparison\n *  2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nexport default baseIsEqual;\n","import baseIsEqual from './_baseIsEqual.js';\n\n/**\n * This method is like `_.isEqual` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with up to\n * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * function isGreeting(value) {\n *   return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, othValue) {\n *   if (isGreeting(objValue) && isGreeting(othValue)) {\n *     return true;\n *   }\n * }\n *\n * var array = ['hello', 'goodbye'];\n * var other = ['hi', 'goodbye'];\n *\n * _.isEqualWith(array, other, customizer);\n * // => true\n */\nfunction isEqualWith(value, other, customizer) {\n  customizer = typeof customizer == 'function' ? customizer : undefined;\n  var result = customizer ? customizer(value, other) : undefined;\n  return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n}\n\nexport default isEqualWith;\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/observer/mutationobserver\r\n */\r\n/* globals window */\r\nimport Observer from './observer';\r\nimport { startsWithFiller } from '../filler';\r\nimport { isEqualWith } from 'lodash-es';\r\n/**\r\n * Mutation observer's role is to watch for any DOM changes inside the editor that weren't\r\n * done by the editor's {@link module:engine/view/renderer~Renderer} itself and reverting these changes.\r\n *\r\n * It does this by observing all mutations in the DOM, marking related view elements as changed and calling\r\n * {@link module:engine/view/renderer~Renderer#render}. Because all mutated nodes are marked as\r\n * \"to be rendered\" and the {@link module:engine/view/renderer~Renderer#render `render()`} method is called,\r\n * all changes are reverted in the DOM (the DOM is synced with the editor's view structure).\r\n *\r\n * Note that this observer is attached by the {@link module:engine/view/view~View} and is available by default.\r\n */\r\nexport default class MutationObserver extends Observer {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(view) {\r\n        super(view);\r\n        this._config = {\r\n            childList: true,\r\n            characterData: true,\r\n            subtree: true\r\n        };\r\n        this.domConverter = view.domConverter;\r\n        this.renderer = view._renderer;\r\n        this._domElements = new Set();\r\n        this._mutationObserver = new window.MutationObserver(this._onMutations.bind(this));\r\n    }\r\n    /**\r\n     * Synchronously handles mutations and empties the queue.\r\n     */\r\n    flush() {\r\n        this._onMutations(this._mutationObserver.takeRecords());\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    observe(domElement) {\r\n        this._domElements.add(domElement);\r\n        if (this.isEnabled) {\r\n            this._mutationObserver.observe(domElement, this._config);\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    stopObserving(domElement) {\r\n        this._domElements.delete(domElement);\r\n        if (this.isEnabled) {\r\n            // Unfortunately, it is not possible to stop observing particular DOM element.\r\n            // In order to stop observing one of multiple DOM elements, we need to re-connect the mutation observer.\r\n            this._mutationObserver.disconnect();\r\n            for (const domElement of this._domElements) {\r\n                this._mutationObserver.observe(domElement, this._config);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    enable() {\r\n        super.enable();\r\n        for (const domElement of this._domElements) {\r\n            this._mutationObserver.observe(domElement, this._config);\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    disable() {\r\n        super.disable();\r\n        this._mutationObserver.disconnect();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        this._mutationObserver.disconnect();\r\n    }\r\n    /**\r\n     * Handles mutations. Mark view elements to sync and call render.\r\n     *\r\n     * @param domMutations Array of native mutations.\r\n     */\r\n    _onMutations(domMutations) {\r\n        // As a result of this.flush() we can have an empty collection.\r\n        if (domMutations.length === 0) {\r\n            return;\r\n        }\r\n        const domConverter = this.domConverter;\r\n        // Use map and set for deduplication.\r\n        const mutatedTextNodes = new Set();\r\n        const elementsWithMutatedChildren = new Set();\r\n        // Handle `childList` mutations first, so we will be able to check if the `characterData` mutation is in the\r\n        // element with changed structure anyway.\r\n        for (const mutation of domMutations) {\r\n            const element = domConverter.mapDomToView(mutation.target);\r\n            if (!element) {\r\n                continue;\r\n            }\r\n            // Do not collect mutations from UIElements and RawElements.\r\n            if (element.is('uiElement') || element.is('rawElement')) {\r\n                continue;\r\n            }\r\n            if (mutation.type === 'childList' && !this._isBogusBrMutation(mutation)) {\r\n                elementsWithMutatedChildren.add(element);\r\n            }\r\n        }\r\n        // Handle `characterData` mutations later, when we have the full list of nodes which changed structure.\r\n        for (const mutation of domMutations) {\r\n            const element = domConverter.mapDomToView(mutation.target);\r\n            // Do not collect mutations from UIElements and RawElements.\r\n            if (element && (element.is('uiElement') || element.is('rawElement'))) {\r\n                continue;\r\n            }\r\n            if (mutation.type === 'characterData') {\r\n                const text = domConverter.findCorrespondingViewText(mutation.target);\r\n                if (text && !elementsWithMutatedChildren.has(text.parent)) {\r\n                    mutatedTextNodes.add(text);\r\n                }\r\n                // When we added first letter to the text node which had only inline filler, for the DOM it is mutation\r\n                // on text, but for the view, where filler text node did not exist, new text node was created, so we\r\n                // need to handle it as a 'children' mutation instead of 'text'.\r\n                else if (!text && startsWithFiller(mutation.target)) {\r\n                    elementsWithMutatedChildren.add(domConverter.mapDomToView(mutation.target.parentNode));\r\n                }\r\n            }\r\n        }\r\n        // Now we build the list of mutations to mark elements. We did not do it earlier to avoid marking the\r\n        // same node multiple times in case of duplication.\r\n        let hasMutations = false;\r\n        for (const textNode of mutatedTextNodes) {\r\n            hasMutations = true;\r\n            this.renderer.markToSync('text', textNode);\r\n        }\r\n        for (const viewElement of elementsWithMutatedChildren) {\r\n            const domElement = domConverter.mapViewToDom(viewElement);\r\n            const viewChildren = Array.from(viewElement.getChildren());\r\n            const newViewChildren = Array.from(domConverter.domChildrenToView(domElement, { withChildren: false }));\r\n            // It may happen that as a result of many changes (sth was inserted and then removed),\r\n            // both elements haven't really changed. #1031\r\n            if (!isEqualWith(viewChildren, newViewChildren, sameNodes)) {\r\n                hasMutations = true;\r\n                this.renderer.markToSync('children', viewElement);\r\n            }\r\n        }\r\n        // In case only non-relevant mutations were recorded it skips the event and force render (#5600).\r\n        if (hasMutations) {\r\n            // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n            // @if CK_DEBUG_TYPING // \tconsole.group( '%c[MutationObserver]%c Mutations detected',\r\n            // @if CK_DEBUG_TYPING // \t\t'font-weight:bold;color:green', ''\r\n            // @if CK_DEBUG_TYPING // \t);\r\n            // @if CK_DEBUG_TYPING // }\r\n            // At this point we have \"dirty DOM\" (changed) and de-synched view (which has not been changed).\r\n            // In order to \"reset DOM\" we render the view again.\r\n            this.view.forceRender();\r\n            // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n            // @if CK_DEBUG_TYPING // \tconsole.groupEnd();\r\n            // @if CK_DEBUG_TYPING // }\r\n        }\r\n    }\r\n    /**\r\n     * Checks if mutation was generated by the browser inserting bogus br on the end of the block element.\r\n     * Such mutations are generated while pressing space or performing native spellchecker correction\r\n     * on the end of the block element in Firefox browser.\r\n     *\r\n     * @param mutation Native mutation object.\r\n     */\r\n    _isBogusBrMutation(mutation) {\r\n        let addedNode = null;\r\n        // Check if mutation added only one node on the end of its parent.\r\n        if (mutation.nextSibling === null && mutation.removedNodes.length === 0 && mutation.addedNodes.length == 1) {\r\n            addedNode = this.domConverter.domToView(mutation.addedNodes[0], {\r\n                withChildren: false\r\n            });\r\n        }\r\n        return addedNode && addedNode.is('element', 'br');\r\n    }\r\n}\r\nfunction sameNodes(child1, child2) {\r\n    // First level of comparison (array of children vs array of children) – use the Lodash's default behavior.\r\n    if (Array.isArray(child1)) {\r\n        return;\r\n    }\r\n    // Elements.\r\n    if (child1 === child2) {\r\n        return true;\r\n    }\r\n    // Texts.\r\n    else if (child1.is('$text') && child2.is('$text')) {\r\n        return child1.data === child2.data;\r\n    }\r\n    // Not matching types.\r\n    return false;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/observer/focusobserver\r\n */\r\n/* globals setTimeout, clearTimeout */\r\nimport DomEventObserver from './domeventobserver';\r\n/**\r\n * {@link module:engine/view/document~Document#event:focus Focus}\r\n * and {@link module:engine/view/document~Document#event:blur blur} events observer.\r\n * Focus observer handle also {@link module:engine/view/rooteditableelement~RootEditableElement#isFocused isFocused} property of the\r\n * {@link module:engine/view/rooteditableelement~RootEditableElement root elements}.\r\n *\r\n * Note that this observer is attached by the {@link module:engine/view/view~View} and is available by default.\r\n */\r\nexport default class FocusObserver extends DomEventObserver {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(view) {\r\n        super(view);\r\n        /**\r\n         * Set to `true` if the document is in the process of setting the focus.\r\n         *\r\n         * The flag is used to indicate that setting the focus is in progress.\r\n         */\r\n        this._isFocusChanging = false;\r\n        /**\r\n         * @inheritDoc\r\n         */\r\n        this.domEventType = ['focus', 'blur'];\r\n        this.useCapture = true;\r\n        const document = this.document;\r\n        document.on('focus', () => {\r\n            this._isFocusChanging = true;\r\n            // Unfortunately native `selectionchange` event is fired asynchronously.\r\n            // We need to wait until `SelectionObserver` handle the event and then render. Otherwise rendering will\r\n            // overwrite new DOM selection with selection from the view.\r\n            // See https://github.com/ckeditor/ckeditor5-engine/issues/795 for more details.\r\n            // Long timeout is needed to solve #676 and https://github.com/ckeditor/ckeditor5-engine/issues/1157 issues.\r\n            //\r\n            // Using `view.change()` instead of `view.forceRender()` to prevent double rendering\r\n            // in a situation where `selectionchange` already caused selection change.\r\n            this._renderTimeoutId = setTimeout(() => {\r\n                this.flush();\r\n                view.change(() => { });\r\n            }, 50);\r\n        });\r\n        document.on('blur', (evt, data) => {\r\n            const selectedEditable = document.selection.editableElement;\r\n            if (selectedEditable === null || selectedEditable === data.target) {\r\n                document.isFocused = false;\r\n                this._isFocusChanging = false;\r\n                // Re-render the document to update view elements\r\n                // (changing document.isFocused already marked view as changed since last rendering).\r\n                view.change(() => { });\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Finishes setting the document focus state.\r\n     */\r\n    flush() {\r\n        if (this._isFocusChanging) {\r\n            this._isFocusChanging = false;\r\n            this.document.isFocused = true;\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    onDomEvent(domEvent) {\r\n        this.fire(domEvent.type, domEvent);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        if (this._renderTimeoutId) {\r\n            clearTimeout(this._renderTimeoutId);\r\n        }\r\n        super.destroy();\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/observer/selectionobserver\r\n */\r\n/* global setInterval, clearInterval */\r\nimport Observer from './observer';\r\nimport MutationObserver from './mutationobserver';\r\nimport { env } from '@ckeditor/ckeditor5-utils';\r\nimport { debounce } from 'lodash-es';\r\nimport FocusObserver from './focusobserver';\r\n/**\r\n * Selection observer class observes selection changes in the document. If a selection changes on the document this\r\n * observer checks if the DOM selection is different from the {@link module:engine/view/document~Document#selection view selection}.\r\n * The selection observer fires {@link module:engine/view/document~Document#event:selectionChange} event only if\r\n * a selection change was the only change in the document and the DOM selection is different from the view selection.\r\n *\r\n * This observer also manages the {@link module:engine/view/document~Document#isSelecting} property of the view document.\r\n *\r\n * Note that this observer is attached by the {@link module:engine/view/view~View} and is available by default.\r\n */\r\nexport default class SelectionObserver extends Observer {\r\n    constructor(view) {\r\n        super(view);\r\n        this.mutationObserver = view.getObserver(MutationObserver);\r\n        this.focusObserver = view.getObserver(FocusObserver);\r\n        this.selection = this.document.selection;\r\n        this.domConverter = view.domConverter;\r\n        this._documents = new WeakSet();\r\n        this._fireSelectionChangeDoneDebounced = debounce(data => {\r\n            this.document.fire('selectionChangeDone', data);\r\n        }, 200);\r\n        this._clearInfiniteLoopInterval = setInterval(() => this._clearInfiniteLoop(), 1000);\r\n        this._documentIsSelectingInactivityTimeoutDebounced = debounce(() => (this.document.isSelecting = false), 5000);\r\n        this._loopbackCounter = 0;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    observe(domElement) {\r\n        const domDocument = domElement.ownerDocument;\r\n        const startDocumentIsSelecting = () => {\r\n            this.document.isSelecting = true;\r\n            // Let's activate the safety timeout each time the document enters the \"is selecting\" state.\r\n            this._documentIsSelectingInactivityTimeoutDebounced();\r\n        };\r\n        const endDocumentIsSelecting = () => {\r\n            if (!this.document.isSelecting) {\r\n                return;\r\n            }\r\n            // Make sure that model selection is up-to-date at the end of selecting process.\r\n            // Sometimes `selectionchange` events could arrive after the `mouseup` event and that selection could be already outdated.\r\n            this._handleSelectionChange(null, domDocument);\r\n            this.document.isSelecting = false;\r\n            // The safety timeout can be canceled when the document leaves the \"is selecting\" state.\r\n            this._documentIsSelectingInactivityTimeoutDebounced.cancel();\r\n        };\r\n        // The document has the \"is selecting\" state while the user keeps making (extending) the selection\r\n        // (e.g. by holding the mouse button and moving the cursor). The state resets when they either released\r\n        // the mouse button or interrupted the process by pressing or releasing any key.\r\n        this.listenTo(domElement, 'selectstart', startDocumentIsSelecting, { priority: 'highest' });\r\n        this.listenTo(domElement, 'keydown', endDocumentIsSelecting, { priority: 'highest', useCapture: true });\r\n        this.listenTo(domElement, 'keyup', endDocumentIsSelecting, { priority: 'highest', useCapture: true });\r\n        // Add document-wide listeners only once. This method could be called for multiple editing roots.\r\n        if (this._documents.has(domDocument)) {\r\n            return;\r\n        }\r\n        // This listener is using capture mode to make sure that selection is upcasted before any other\r\n        // handler would like to check it and update (for example table multi cell selection).\r\n        this.listenTo(domDocument, 'mouseup', endDocumentIsSelecting, { priority: 'highest', useCapture: true });\r\n        this.listenTo(domDocument, 'selectionchange', (evt, domEvent) => {\r\n            // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n            // @if CK_DEBUG_TYPING // \tconst domSelection = domDocument.defaultView!.getSelection();\r\n            // @if CK_DEBUG_TYPING // \tconsole.group( '%c[SelectionObserver]%c selectionchange', 'color:green', ''\r\n            // @if CK_DEBUG_TYPING // \t);\r\n            // @if CK_DEBUG_TYPING // \tconsole.info( '%c[SelectionObserver]%c DOM Selection:', 'font-weight:bold;color:green', '',\r\n            // @if CK_DEBUG_TYPING // \t\t{ node: domSelection!.anchorNode, offset: domSelection!.anchorOffset },\r\n            // @if CK_DEBUG_TYPING // \t\t{ node: domSelection!.focusNode, offset: domSelection!.focusOffset }\r\n            // @if CK_DEBUG_TYPING // \t);\r\n            // @if CK_DEBUG_TYPING // }\r\n            // The Renderer is disabled while composing on non-android browsers, so we can't update the view selection\r\n            // because the DOM and view tree drifted apart. Position mapping could fail because of it.\r\n            if (this.document.isComposing && !env.isAndroid) {\r\n                // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n                // @if CK_DEBUG_TYPING // \tconsole.info( '%c[SelectionObserver]%c Selection change ignored (isComposing)',\r\n                // @if CK_DEBUG_TYPING // \t\t'font-weight:bold;color:green', ''\r\n                // @if CK_DEBUG_TYPING // \t);\r\n                // @if CK_DEBUG_TYPING // \tconsole.groupEnd();\r\n                // @if CK_DEBUG_TYPING // }\r\n                return;\r\n            }\r\n            this._handleSelectionChange(domEvent, domDocument);\r\n            // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n            // @if CK_DEBUG_TYPING // \tconsole.groupEnd();\r\n            // @if CK_DEBUG_TYPING // }\r\n            // Defer the safety timeout when the selection changes (e.g. the user keeps extending the selection\r\n            // using their mouse).\r\n            this._documentIsSelectingInactivityTimeoutDebounced();\r\n        });\r\n        this._documents.add(domDocument);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    stopObserving(domElement) {\r\n        this.stopListening(domElement);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        clearInterval(this._clearInfiniteLoopInterval);\r\n        this._fireSelectionChangeDoneDebounced.cancel();\r\n        this._documentIsSelectingInactivityTimeoutDebounced.cancel();\r\n    }\r\n    /* istanbul ignore next -- @preserve */\r\n    _reportInfiniteLoop() {\r\n        // @if CK_DEBUG //\t\tthrow new Error(\r\n        // @if CK_DEBUG //\t\t\t'Selection change observer detected an infinite rendering loop.\\n\\n' +\r\n        // @if CK_DEBUG //\t \t\t'⚠️⚠️ Report this error on https://github.com/ckeditor/ckeditor5/issues/11658.'\r\n        // @if CK_DEBUG //\t\t);\r\n    }\r\n    /**\r\n     * Selection change listener. {@link module:engine/view/observer/mutationobserver~MutationObserver#flush Flush} mutations, check if\r\n     * a selection changes and fires {@link module:engine/view/document~Document#event:selectionChange} event on every change\r\n     * and {@link module:engine/view/document~Document#event:selectionChangeDone} when a selection stop changing.\r\n     *\r\n     * @param domEvent DOM event.\r\n     * @param domDocument DOM document.\r\n     */\r\n    _handleSelectionChange(domEvent, domDocument) {\r\n        if (!this.isEnabled) {\r\n            return;\r\n        }\r\n        const domSelection = domDocument.defaultView.getSelection();\r\n        if (this.checkShouldIgnoreEventFromTarget(domSelection.anchorNode)) {\r\n            return;\r\n        }\r\n        // Ensure the mutation event will be before selection event on all browsers.\r\n        this.mutationObserver.flush();\r\n        const newViewSelection = this.domConverter.domSelectionToView(domSelection);\r\n        // Do not convert selection change if the new view selection has no ranges in it.\r\n        //\r\n        // It means that the DOM selection is in some way incorrect. Ranges that were in the DOM selection could not be\r\n        // converted to the view. This happens when the DOM selection was moved outside of the editable element.\r\n        if (newViewSelection.rangeCount == 0) {\r\n            this.view.hasDomSelection = false;\r\n            return;\r\n        }\r\n        this.view.hasDomSelection = true;\r\n        if (this.selection.isEqual(newViewSelection) && this.domConverter.isDomSelectionCorrect(domSelection)) {\r\n            return;\r\n        }\r\n        // Ensure we are not in the infinite loop (#400).\r\n        // This counter is reset each second. 60 selection changes in 1 second is enough high number\r\n        // to be very difficult (impossible) to achieve using just keyboard keys (during normal editor use).\r\n        if (++this._loopbackCounter > 60) {\r\n            // Selection change observer detected an infinite rendering loop.\r\n            // Most probably you try to put the selection in the position which is not allowed\r\n            // by the browser and browser fixes it automatically what causes `selectionchange` event on\r\n            // which a loopback through a model tries to re-render the wrong selection and again.\r\n            this._reportInfiniteLoop();\r\n            return;\r\n        }\r\n        // Mark the latest focus change as complete (we got new selection after the focus so the selection is in the focused element).\r\n        this.focusObserver.flush();\r\n        if (this.selection.isSimilar(newViewSelection)) {\r\n            // If selection was equal and we are at this point of algorithm, it means that it was incorrect.\r\n            // Just re-render it, no need to fire any events, etc.\r\n            this.view.forceRender();\r\n        }\r\n        else {\r\n            const data = {\r\n                oldSelection: this.selection,\r\n                newSelection: newViewSelection,\r\n                domSelection\r\n            };\r\n            // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n            // @if CK_DEBUG_TYPING // \tconsole.info( '%c[SelectionObserver]%c Fire selection change:',\r\n            // @if CK_DEBUG_TYPING // \t\t'font-weight:bold;color:green', '',\r\n            // @if CK_DEBUG_TYPING // \t\tnewViewSelection.getFirstRange()\r\n            // @if CK_DEBUG_TYPING // \t);\r\n            // @if CK_DEBUG_TYPING // }\r\n            // Prepare data for new selection and fire appropriate events.\r\n            this.document.fire('selectionChange', data);\r\n            // Call `#_fireSelectionChangeDoneDebounced` every time when `selectionChange` event is fired.\r\n            // This function is debounced what means that `selectionChangeDone` event will be fired only when\r\n            // defined int the function time will elapse since the last time the function was called.\r\n            // So `selectionChangeDone` will be fired when selection will stop changing.\r\n            this._fireSelectionChangeDoneDebounced(data);\r\n        }\r\n    }\r\n    /**\r\n     * Clears `SelectionObserver` internal properties connected with preventing infinite loop.\r\n     */\r\n    _clearInfiniteLoop() {\r\n        this._loopbackCounter = 0;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/observer/compositionobserver\r\n */\r\nimport DomEventObserver from './domeventobserver';\r\n/**\r\n * {@link module:engine/view/document~Document#event:compositionstart Compositionstart},\r\n * {@link module:engine/view/document~Document#event:compositionupdate compositionupdate} and\r\n * {@link module:engine/view/document~Document#event:compositionend compositionend} events observer.\r\n *\r\n * Note that this observer is attached by the {@link module:engine/view/view~View} and is available by default.\r\n */\r\nexport default class CompositionObserver extends DomEventObserver {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(view) {\r\n        super(view);\r\n        /**\r\n         * @inheritDoc\r\n         */\r\n        this.domEventType = ['compositionstart', 'compositionupdate', 'compositionend'];\r\n        const document = this.document;\r\n        document.on('compositionstart', () => {\r\n            // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n            // @if CK_DEBUG_TYPING // \tconsole.log( '%c[CompositionObserver] ' +\r\n            // @if CK_DEBUG_TYPING // \t\t'┌───────────────────────────── isComposing = true ─────────────────────────────┐',\r\n            // @if CK_DEBUG_TYPING // \t\t'font-weight: bold; color: green'\r\n            // @if CK_DEBUG_TYPING // \t);\r\n            // @if CK_DEBUG_TYPING // }\r\n            document.isComposing = true;\r\n        }, { priority: 'low' });\r\n        document.on('compositionend', () => {\r\n            // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n            // @if CK_DEBUG_TYPING // \tconsole.log( '%c[CompositionObserver] ' +\r\n            // @if CK_DEBUG_TYPING // \t\t'└───────────────────────────── isComposing = false ─────────────────────────────┘',\r\n            // @if CK_DEBUG_TYPING // \t\t'font-weight: bold; color: green'\r\n            // @if CK_DEBUG_TYPING // \t);\r\n            // @if CK_DEBUG_TYPING // }\r\n            document.isComposing = false;\r\n        }, { priority: 'low' });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    onDomEvent(domEvent) {\r\n        // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n        // @if CK_DEBUG_TYPING // \tconsole.group( `%c[CompositionObserver]%c ${ domEvent.type }`, 'color: green', '' );\r\n        // @if CK_DEBUG_TYPING // }\r\n        this.fire(domEvent.type, domEvent, {\r\n            data: domEvent.data\r\n        });\r\n        // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n        // @if CK_DEBUG_TYPING // \tconsole.groupEnd();\r\n        // @if CK_DEBUG_TYPING // }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * A facade over the native [`DataTransfer`](https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer) object.\r\n */\r\nexport default class DataTransfer {\r\n    /**\r\n     * @param nativeDataTransfer The native [`DataTransfer`](https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer) object.\r\n     * @param options.cacheFiles Whether `files` list should be initialized in the constructor.\r\n     */\r\n    constructor(nativeDataTransfer, options = {}) {\r\n        // We should store references to the File instances in case someone would like to process this files\r\n        // outside the event handler. Files are stored only for `drop` and `paste` events because they are not usable\r\n        // in other events and are generating a huge delay on Firefox while dragging.\r\n        // See https://github.com/ckeditor/ckeditor5/issues/13366.\r\n        this._files = options.cacheFiles ? getFiles(nativeDataTransfer) : null;\r\n        this._native = nativeDataTransfer;\r\n    }\r\n    /**\r\n     * The array of files created from the native `DataTransfer#files` or `DataTransfer#items`.\r\n     */\r\n    get files() {\r\n        if (!this._files) {\r\n            this._files = getFiles(this._native);\r\n        }\r\n        return this._files;\r\n    }\r\n    /**\r\n     * Returns an array of available native content types.\r\n     */\r\n    get types() {\r\n        return this._native.types;\r\n    }\r\n    /**\r\n     * Gets the data from the data transfer by its MIME type.\r\n     *\r\n     * ```ts\r\n     * dataTransfer.getData( 'text/plain' );\r\n     * ```\r\n     *\r\n     * @param type The MIME type. E.g. `text/html` or `text/plain`.\r\n     */\r\n    getData(type) {\r\n        return this._native.getData(type);\r\n    }\r\n    /**\r\n     * Sets the data in the data transfer.\r\n     *\r\n     * @param type The MIME type. E.g. `text/html` or `text/plain`.\r\n     */\r\n    setData(type, data) {\r\n        this._native.setData(type, data);\r\n    }\r\n    /**\r\n     * The effect that is allowed for a drag operation.\r\n     */\r\n    set effectAllowed(value) {\r\n        this._native.effectAllowed = value;\r\n    }\r\n    get effectAllowed() {\r\n        return this._native.effectAllowed;\r\n    }\r\n    /**\r\n     * The actual drop effect.\r\n     */\r\n    set dropEffect(value) {\r\n        this._native.dropEffect = value;\r\n    }\r\n    get dropEffect() {\r\n        return this._native.dropEffect;\r\n    }\r\n    /**\r\n     * Set a preview image of the dragged content.\r\n     */\r\n    setDragImage(image, x, y) {\r\n        this._native.setDragImage(image, x, y);\r\n    }\r\n    /**\r\n     * Whether the dragging operation was canceled.\r\n     */\r\n    get isCanceled() {\r\n        return this._native.dropEffect == 'none' || !!this._native.mozUserCancelled;\r\n    }\r\n}\r\nfunction getFiles(nativeDataTransfer) {\r\n    // DataTransfer.files and items are array-like and might not have an iterable interface.\r\n    const files = Array.from(nativeDataTransfer.files || []);\r\n    const items = Array.from(nativeDataTransfer.items || []);\r\n    if (files.length) {\r\n        return files;\r\n    }\r\n    // Chrome has empty DataTransfer.files, but allows getting files through the items interface.\r\n    return items\r\n        .filter(item => item.kind === 'file')\r\n        .map(item => item.getAsFile());\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/observer/inputobserver\r\n */\r\nimport DomEventObserver from './domeventobserver';\r\nimport DataTransfer from '../datatransfer';\r\nimport { env } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Observer for events connected with data input.\r\n *\r\n * **Note**: This observer is attached by {@link module:engine/view/view~View} and available by default in all\r\n * editor instances.\r\n */\r\nexport default class InputObserver extends DomEventObserver {\r\n    constructor() {\r\n        super(...arguments);\r\n        /**\r\n         * @inheritDoc\r\n         */\r\n        this.domEventType = 'beforeinput';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    onDomEvent(domEvent) {\r\n        // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n        // @if CK_DEBUG_TYPING // \tconsole.group( `%c[InputObserver]%c ${ domEvent.type }: ${ domEvent.inputType }`,\r\n        // @if CK_DEBUG_TYPING // \t\t'color: green', 'color: default'\r\n        // @if CK_DEBUG_TYPING // \t);\r\n        // @if CK_DEBUG_TYPING // }\r\n        const domTargetRanges = domEvent.getTargetRanges();\r\n        const view = this.view;\r\n        const viewDocument = view.document;\r\n        let dataTransfer = null;\r\n        let data = null;\r\n        let targetRanges = [];\r\n        if (domEvent.dataTransfer) {\r\n            dataTransfer = new DataTransfer(domEvent.dataTransfer);\r\n        }\r\n        if (domEvent.data !== null) {\r\n            data = domEvent.data;\r\n            // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n            // @if CK_DEBUG_TYPING // \tconsole.info( `%c[InputObserver]%c event data: %c${ JSON.stringify( data ) }`,\r\n            // @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', 'font-weight:bold', 'color: blue;'\r\n            // @if CK_DEBUG_TYPING // \t);\r\n            // @if CK_DEBUG_TYPING // }\r\n        }\r\n        else if (dataTransfer) {\r\n            data = dataTransfer.getData('text/plain');\r\n            // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n            // @if CK_DEBUG_TYPING // \tconsole.info( `%c[InputObserver]%c event data transfer: %c${ JSON.stringify( data ) }`,\r\n            // @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', 'font-weight:bold', 'color: blue;'\r\n            // @if CK_DEBUG_TYPING // \t);\r\n            // @if CK_DEBUG_TYPING // }\r\n        }\r\n        // If the editor selection is fake (an object is selected), the DOM range does not make sense because it is anchored\r\n        // in the fake selection container.\r\n        if (viewDocument.selection.isFake) {\r\n            // Future-proof: in case of multi-range fake selections being possible.\r\n            targetRanges = Array.from(viewDocument.selection.getRanges());\r\n            // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n            // @if CK_DEBUG_TYPING // \tconsole.info( '%c[InputObserver]%c using fake selection:',\r\n            // @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', 'font-weight:bold', targetRanges,\r\n            // @if CK_DEBUG_TYPING // \t\tviewDocument.selection.isFake ? 'fake view selection' : 'fake DOM parent'\r\n            // @if CK_DEBUG_TYPING // \t);\r\n            // @if CK_DEBUG_TYPING // }\r\n        }\r\n        else if (domTargetRanges.length) {\r\n            targetRanges = domTargetRanges.map(domRange => {\r\n                // Sometimes browser provides range that starts before editable node.\r\n                // We try to fall back to collapsed range at the valid end position.\r\n                // See https://github.com/ckeditor/ckeditor5/issues/14411.\r\n                // See https://github.com/ckeditor/ckeditor5/issues/14050.\r\n                const viewStart = view.domConverter.domPositionToView(domRange.startContainer, domRange.startOffset);\r\n                const viewEnd = view.domConverter.domPositionToView(domRange.endContainer, domRange.endOffset);\r\n                if (viewStart) {\r\n                    return view.createRange(viewStart, viewEnd);\r\n                }\r\n                else if (viewEnd) {\r\n                    return view.createRange(viewEnd);\r\n                }\r\n            }).filter((range) => !!range);\r\n            // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n            // @if CK_DEBUG_TYPING // \tconsole.info( '%c[InputObserver]%c using target ranges:',\r\n            // @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', 'font-weight:bold', targetRanges\r\n            // @if CK_DEBUG_TYPING // \t);\r\n            // @if CK_DEBUG_TYPING // }\r\n        }\r\n        // For Android devices we use a fallback to the current DOM selection, Android modifies it according\r\n        // to the expected target ranges of input event.\r\n        else if (env.isAndroid) {\r\n            const domSelection = domEvent.target.ownerDocument.defaultView.getSelection();\r\n            targetRanges = Array.from(view.domConverter.domSelectionToView(domSelection).getRanges());\r\n            // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n            // @if CK_DEBUG_TYPING // \tconsole.info( '%c[InputObserver]%c using selection ranges:',\r\n            // @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', 'font-weight:bold', targetRanges\r\n            // @if CK_DEBUG_TYPING // \t);\r\n            // @if CK_DEBUG_TYPING // }\r\n        }\r\n        // Android sometimes fires insertCompositionText with a new-line character at the end of the data\r\n        // instead of firing insertParagraph beforeInput event.\r\n        // Fire the correct type of beforeInput event and ignore the replaced fragment of text because\r\n        // it wants to replace \"test\" with \"test\\n\".\r\n        // https://github.com/ckeditor/ckeditor5/issues/12368.\r\n        if (env.isAndroid && domEvent.inputType == 'insertCompositionText' && data && data.endsWith('\\n')) {\r\n            this.fire(domEvent.type, domEvent, {\r\n                inputType: 'insertParagraph',\r\n                targetRanges: [view.createRange(targetRanges[0].end)]\r\n            });\r\n            // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n            // @if CK_DEBUG_TYPING // \tconsole.groupEnd();\r\n            // @if CK_DEBUG_TYPING // }\r\n            return;\r\n        }\r\n        // Normalize the insertText data that includes new-line characters.\r\n        // https://github.com/ckeditor/ckeditor5/issues/2045.\r\n        if (domEvent.inputType == 'insertText' && data && data.includes('\\n')) {\r\n            // There might be a single new-line or double for new paragraph, but we translate\r\n            // it to paragraphs as it is our default action for enter handling.\r\n            const parts = data.split(/\\n{1,2}/g);\r\n            let partTargetRanges = targetRanges;\r\n            for (let i = 0; i < parts.length; i++) {\r\n                const dataPart = parts[i];\r\n                if (dataPart != '') {\r\n                    this.fire(domEvent.type, domEvent, {\r\n                        data: dataPart,\r\n                        dataTransfer,\r\n                        targetRanges: partTargetRanges,\r\n                        inputType: domEvent.inputType,\r\n                        isComposing: domEvent.isComposing\r\n                    });\r\n                    // Use the result view selection so following events will be added one after another.\r\n                    partTargetRanges = [viewDocument.selection.getFirstRange()];\r\n                }\r\n                if (i + 1 < parts.length) {\r\n                    this.fire(domEvent.type, domEvent, {\r\n                        inputType: 'insertParagraph',\r\n                        targetRanges: partTargetRanges\r\n                    });\r\n                    // Use the result view selection so following events will be added one after another.\r\n                    partTargetRanges = [viewDocument.selection.getFirstRange()];\r\n                }\r\n            }\r\n            // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n            // @if CK_DEBUG_TYPING // \tconsole.groupEnd();\r\n            // @if CK_DEBUG_TYPING // }\r\n            return;\r\n        }\r\n        // Fire the normalized beforeInput event.\r\n        this.fire(domEvent.type, domEvent, {\r\n            data,\r\n            dataTransfer,\r\n            targetRanges,\r\n            inputType: domEvent.inputType,\r\n            isComposing: domEvent.isComposing\r\n        });\r\n        // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n        // @if CK_DEBUG_TYPING // \tconsole.groupEnd();\r\n        // @if CK_DEBUG_TYPING // }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/observer/arrowkeysobserver\r\n */\r\nimport Observer from './observer';\r\nimport BubblingEventInfo from './bubblingeventinfo';\r\nimport { isArrowKeyCode } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Arrow keys observer introduces the {@link module:engine/view/document~Document#event:arrowKey `Document#arrowKey`} event.\r\n *\r\n * Note that this observer is attached by the {@link module:engine/view/view~View} and is available by default.\r\n */\r\nexport default class ArrowKeysObserver extends Observer {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(view) {\r\n        super(view);\r\n        this.document.on('keydown', (event, data) => {\r\n            if (this.isEnabled && isArrowKeyCode(data.keyCode)) {\r\n                const eventInfo = new BubblingEventInfo(this.document, 'arrowKey', this.document.selection.getFirstRange());\r\n                this.document.fire(eventInfo, data);\r\n                if (eventInfo.stop.called) {\r\n                    event.stop();\r\n                }\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    observe() { }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    stopObserving() { }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport Observer from './observer';\r\nimport BubblingEventInfo from './bubblingeventinfo';\r\nimport { keyCodes } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Tab observer introduces the {@link module:engine/view/document~Document#event:tab `Document#tab`} event.\r\n *\r\n * Note that because {@link module:engine/view/observer/tabobserver~TabObserver} is attached by the\r\n * {@link module:engine/view/view~View}, this event is available by default.\r\n */\r\nexport default class TabObserver extends Observer {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(view) {\r\n        super(view);\r\n        const doc = this.document;\r\n        doc.on('keydown', (evt, data) => {\r\n            if (!this.isEnabled ||\r\n                data.keyCode != keyCodes.tab ||\r\n                data.ctrlKey) {\r\n                return;\r\n            }\r\n            const event = new BubblingEventInfo(doc, 'tab', doc.selection.getFirstRange());\r\n            doc.fire(event, data);\r\n            if (event.stop.called) {\r\n                evt.stop();\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    observe() { }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    stopObserving() { }\r\n}\r\n","import baseClone from './_baseClone.js';\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n    CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n  return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nexport default cloneDeep;\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/view\r\n */\r\nimport Document from './document';\r\nimport DowncastWriter from './downcastwriter';\r\nimport Renderer from './renderer';\r\nimport DomConverter from './domconverter';\r\nimport Position from './position';\r\nimport Range from './range';\r\nimport Selection from './selection';\r\nimport KeyObserver from './observer/keyobserver';\r\nimport FakeSelectionObserver from './observer/fakeselectionobserver';\r\nimport MutationObserver from './observer/mutationobserver';\r\nimport SelectionObserver from './observer/selectionobserver';\r\nimport FocusObserver from './observer/focusobserver';\r\nimport CompositionObserver from './observer/compositionobserver';\r\nimport InputObserver from './observer/inputobserver';\r\nimport ArrowKeysObserver from './observer/arrowkeysobserver';\r\nimport TabObserver from './observer/tabobserver';\r\nimport { CKEditorError, ObservableMixin, scrollViewportToShowTarget } from '@ckeditor/ckeditor5-utils';\r\nimport { injectUiElementHandling } from './uielement';\r\nimport { injectQuirksHandling } from './filler';\r\nimport { cloneDeep } from 'lodash-es';\r\n/**\r\n * Editor's view controller class. Its main responsibility is DOM - View management for editing purposes, to provide\r\n * abstraction over the DOM structure and events and hide all browsers quirks.\r\n *\r\n * View controller renders view document to DOM whenever view structure changes. To determine when view can be rendered,\r\n * all changes need to be done using the {@link module:engine/view/view~View#change} method, using\r\n * {@link module:engine/view/downcastwriter~DowncastWriter}:\r\n *\r\n * ```ts\r\n * view.change( writer => {\r\n * \twriter.insert( position, writer.createText( 'foo' ) );\r\n * } );\r\n * ```\r\n *\r\n * View controller also register {@link module:engine/view/observer/observer~Observer observers} which observes changes\r\n * on DOM and fire events on the {@link module:engine/view/document~Document Document}.\r\n * Note that the following observers are added by the class constructor and are always available:\r\n *\r\n * * {@link module:engine/view/observer/selectionobserver~SelectionObserver},\r\n * * {@link module:engine/view/observer/focusobserver~FocusObserver},\r\n * * {@link module:engine/view/observer/keyobserver~KeyObserver},\r\n * * {@link module:engine/view/observer/fakeselectionobserver~FakeSelectionObserver}.\r\n * * {@link module:engine/view/observer/compositionobserver~CompositionObserver}.\r\n * * {@link module:engine/view/observer/inputobserver~InputObserver}.\r\n * * {@link module:engine/view/observer/arrowkeysobserver~ArrowKeysObserver}.\r\n * * {@link module:engine/view/observer/tabobserver~TabObserver}.\r\n *\r\n * This class also {@link module:engine/view/view~View#attachDomRoot binds the DOM and the view elements}.\r\n *\r\n * If you do not need full a DOM - view management, and only want to transform a tree of view elements to a tree of DOM\r\n * elements you do not need this controller. You can use the {@link module:engine/view/domconverter~DomConverter DomConverter} instead.\r\n */\r\nexport default class View extends ObservableMixin() {\r\n    /**\r\n     * @param stylesProcessor The styles processor instance.\r\n     */\r\n    constructor(stylesProcessor) {\r\n        super();\r\n        /**\r\n         * Roots of the DOM tree. Map on the `HTMLElement`s with roots names as keys.\r\n         */\r\n        this.domRoots = new Map();\r\n        /**\r\n         * A DOM root attributes cache. It saves the initial values of DOM root attributes before the DOM element\r\n         * is {@link module:engine/view/view~View#attachDomRoot attached} to the view so later on, when\r\n         * the view is destroyed ({@link module:engine/view/view~View#detachDomRoot}), they can be easily restored.\r\n         * This way, the DOM element can go back to the (clean) state as if the editing view never used it.\r\n         */\r\n        this._initialDomRootAttributes = new WeakMap();\r\n        /**\r\n         * Map of registered {@link module:engine/view/observer/observer~Observer observers}.\r\n         */\r\n        this._observers = new Map();\r\n        /**\r\n         * Is set to `true` when {@link #change view changes} are currently in progress.\r\n         */\r\n        this._ongoingChange = false;\r\n        /**\r\n         * Used to prevent calling {@link #forceRender} and {@link #change} during rendering view to the DOM.\r\n         */\r\n        this._postFixersInProgress = false;\r\n        /**\r\n         * Internal flag to temporary disable rendering. See the usage in the {@link #_disableRendering}.\r\n         */\r\n        this._renderingDisabled = false;\r\n        /**\r\n         * Internal flag that disables rendering when there are no changes since the last rendering.\r\n         * It stores information about changed selection and changed elements from attached document roots.\r\n         */\r\n        this._hasChangedSinceTheLastRendering = false;\r\n        this.document = new Document(stylesProcessor);\r\n        this.domConverter = new DomConverter(this.document);\r\n        this.set('isRenderingInProgress', false);\r\n        this.set('hasDomSelection', false);\r\n        this._renderer = new Renderer(this.domConverter, this.document.selection);\r\n        this._renderer.bind('isFocused', 'isSelecting', 'isComposing')\r\n            .to(this.document, 'isFocused', 'isSelecting', 'isComposing');\r\n        this._writer = new DowncastWriter(this.document);\r\n        // Add default observers.\r\n        this.addObserver(MutationObserver);\r\n        this.addObserver(FocusObserver);\r\n        this.addObserver(SelectionObserver);\r\n        this.addObserver(KeyObserver);\r\n        this.addObserver(FakeSelectionObserver);\r\n        this.addObserver(CompositionObserver);\r\n        this.addObserver(ArrowKeysObserver);\r\n        this.addObserver(InputObserver);\r\n        this.addObserver(TabObserver);\r\n        // Inject quirks handlers.\r\n        injectQuirksHandling(this);\r\n        injectUiElementHandling(this);\r\n        // Use 'normal' priority so that rendering is performed as first when using that priority.\r\n        this.on('render', () => {\r\n            this._render();\r\n            // Informs that layout has changed after render.\r\n            this.document.fire('layoutChanged');\r\n            // Reset the `_hasChangedSinceTheLastRendering` flag after rendering.\r\n            this._hasChangedSinceTheLastRendering = false;\r\n        });\r\n        // Listen to the document selection changes directly.\r\n        this.listenTo(this.document.selection, 'change', () => {\r\n            this._hasChangedSinceTheLastRendering = true;\r\n        });\r\n        // Trigger re-render if only the focus changed.\r\n        this.listenTo(this.document, 'change:isFocused', () => {\r\n            this._hasChangedSinceTheLastRendering = true;\r\n        });\r\n    }\r\n    /**\r\n     * Attaches a DOM root element to the view element and enable all observers on that element.\r\n     * Also {@link module:engine/view/renderer~Renderer#markToSync mark element} to be synchronized\r\n     * with the view what means that all child nodes will be removed and replaced with content of the view root.\r\n     *\r\n     * This method also will change view element name as the same as tag name of given dom root.\r\n     * Name is always transformed to lower case.\r\n     *\r\n     * **Note:** Use {@link #detachDomRoot `detachDomRoot()`} to revert this action.\r\n     *\r\n     * @param domRoot DOM root element.\r\n     * @param name Name of the root.\r\n     */\r\n    attachDomRoot(domRoot, name = 'main') {\r\n        const viewRoot = this.document.getRoot(name);\r\n        // Set view root name the same as DOM root tag name.\r\n        viewRoot._name = domRoot.tagName.toLowerCase();\r\n        const initialDomRootAttributes = {};\r\n        // 1. Copy and cache the attributes to remember the state of the element before attaching.\r\n        //    The cached attributes will be restored in detachDomRoot() so the element goes to the\r\n        //    clean state as if the editing view never used it.\r\n        // 2. Apply the attributes using the view writer, so they all go under the control of the engine.\r\n        //    The editing view takes over the attribute management completely because various\r\n        //    features (e.g. addPlaceholder()) require dynamic changes of those attributes and they\r\n        //    cannot be managed by the engine and the UI library at the same time.\r\n        for (const { name, value } of Array.from(domRoot.attributes)) {\r\n            initialDomRootAttributes[name] = value;\r\n            // Do not use writer.setAttribute() for the class attribute. The EditableUIView class\r\n            // and its descendants could have already set some using the writer.addClass() on the view\r\n            // document root. They haven't been rendered yet so they are not present in the DOM root.\r\n            // Using writer.setAttribute( 'class', ... ) would override them completely.\r\n            if (name === 'class') {\r\n                this._writer.addClass(value.split(' '), viewRoot);\r\n            }\r\n            else {\r\n                this._writer.setAttribute(name, value, viewRoot);\r\n            }\r\n        }\r\n        this._initialDomRootAttributes.set(domRoot, initialDomRootAttributes);\r\n        const updateContenteditableAttribute = () => {\r\n            this._writer.setAttribute('contenteditable', (!viewRoot.isReadOnly).toString(), viewRoot);\r\n            if (viewRoot.isReadOnly) {\r\n                this._writer.addClass('ck-read-only', viewRoot);\r\n            }\r\n            else {\r\n                this._writer.removeClass('ck-read-only', viewRoot);\r\n            }\r\n        };\r\n        // Set initial value.\r\n        updateContenteditableAttribute();\r\n        this.domRoots.set(name, domRoot);\r\n        this.domConverter.bindElements(domRoot, viewRoot);\r\n        this._renderer.markToSync('children', viewRoot);\r\n        this._renderer.markToSync('attributes', viewRoot);\r\n        this._renderer.domDocuments.add(domRoot.ownerDocument);\r\n        viewRoot.on('change:children', (evt, node) => this._renderer.markToSync('children', node));\r\n        viewRoot.on('change:attributes', (evt, node) => this._renderer.markToSync('attributes', node));\r\n        viewRoot.on('change:text', (evt, node) => this._renderer.markToSync('text', node));\r\n        viewRoot.on('change:isReadOnly', () => this.change(updateContenteditableAttribute));\r\n        viewRoot.on('change', () => {\r\n            this._hasChangedSinceTheLastRendering = true;\r\n        });\r\n        for (const observer of this._observers.values()) {\r\n            observer.observe(domRoot, name);\r\n        }\r\n    }\r\n    /**\r\n     * Detaches a DOM root element from the view element and restores its attributes to the state before\r\n     * {@link #attachDomRoot `attachDomRoot()`}.\r\n     *\r\n     * @param name Name of the root to detach.\r\n     */\r\n    detachDomRoot(name) {\r\n        const domRoot = this.domRoots.get(name);\r\n        // Remove all root attributes so the DOM element is \"bare\".\r\n        Array.from(domRoot.attributes).forEach(({ name }) => domRoot.removeAttribute(name));\r\n        const initialDomRootAttributes = this._initialDomRootAttributes.get(domRoot);\r\n        // Revert all view root attributes back to the state before attachDomRoot was called.\r\n        for (const attribute in initialDomRootAttributes) {\r\n            domRoot.setAttribute(attribute, initialDomRootAttributes[attribute]);\r\n        }\r\n        this.domRoots.delete(name);\r\n        this.domConverter.unbindDomElement(domRoot);\r\n        for (const observer of this._observers.values()) {\r\n            observer.stopObserving(domRoot);\r\n        }\r\n    }\r\n    /**\r\n     * Gets DOM root element.\r\n     *\r\n     * @param name  Name of the root.\r\n     * @returns DOM root element instance.\r\n     */\r\n    getDomRoot(name = 'main') {\r\n        return this.domRoots.get(name);\r\n    }\r\n    /**\r\n     * Creates observer of the given type if not yet created, {@link module:engine/view/observer/observer~Observer#enable enables} it\r\n     * and {@link module:engine/view/observer/observer~Observer#observe attaches} to all existing and future\r\n     * {@link #domRoots DOM roots}.\r\n     *\r\n     * Note: Observers are recognized by their constructor (classes). A single observer will be instantiated and used only\r\n     * when registered for the first time. This means that features and other components can register a single observer\r\n     * multiple times without caring whether it has been already added or not.\r\n     *\r\n     * @param ObserverConstructor The constructor of an observer to add.\r\n     * Should create an instance inheriting from {@link module:engine/view/observer/observer~Observer}.\r\n     * @returns Added observer instance.\r\n     */\r\n    addObserver(ObserverConstructor) {\r\n        let observer = this._observers.get(ObserverConstructor);\r\n        if (observer) {\r\n            return observer;\r\n        }\r\n        observer = new ObserverConstructor(this);\r\n        this._observers.set(ObserverConstructor, observer);\r\n        for (const [name, domElement] of this.domRoots) {\r\n            observer.observe(domElement, name);\r\n        }\r\n        observer.enable();\r\n        return observer;\r\n    }\r\n    /**\r\n     * Returns observer of the given type or `undefined` if such observer has not been added yet.\r\n     *\r\n     * @param ObserverConstructor The constructor of an observer to get.\r\n     * @returns Observer instance or undefined.\r\n     */\r\n    getObserver(ObserverConstructor) {\r\n        return this._observers.get(ObserverConstructor);\r\n    }\r\n    /**\r\n     * Disables all added observers.\r\n     */\r\n    disableObservers() {\r\n        for (const observer of this._observers.values()) {\r\n            observer.disable();\r\n        }\r\n    }\r\n    /**\r\n     * Enables all added observers.\r\n     */\r\n    enableObservers() {\r\n        for (const observer of this._observers.values()) {\r\n            observer.enable();\r\n        }\r\n    }\r\n    /**\r\n     * Scrolls the page viewport and {@link #domRoots} with their ancestors to reveal the\r\n     * caret, **if not already visible to the user**.\r\n     *\r\n     * **Note**: Calling this method fires the {@link module:engine/view/view~ViewScrollToTheSelectionEvent} event that\r\n     * allows custom behaviors.\r\n     *\r\n     * @param options Additional configuration of the scrolling behavior.\r\n     * @param options.viewportOffset A distance between the DOM selection and the viewport boundary to be maintained\r\n     * while scrolling to the selection (default is 20px). Setting this value to `0` will reveal the selection precisely at\r\n     * the viewport boundary.\r\n     * @param options.ancestorOffset A distance between the DOM selection and scrollable DOM root ancestor(s) to be maintained\r\n     * while scrolling to the selection (default is 20px). Setting this value to `0` will reveal the selection precisely at\r\n     * the scrollable ancestor(s) boundary.\r\n     * @param options.alignToTop When set `true`, the DOM selection will be aligned to the top of the viewport if not already visible\r\n     * (see `forceScroll` to learn more).\r\n     * @param options.forceScroll When set `true`, the DOM selection will be aligned to the top of the viewport and scrollable ancestors\r\n     * whether it is already visible or not. This option will only work when `alignToTop` is `true`.\r\n     */\r\n    scrollToTheSelection({ alignToTop, forceScroll, viewportOffset = 20, ancestorOffset = 20 } = {}) {\r\n        const range = this.document.selection.getFirstRange();\r\n        if (!range) {\r\n            return;\r\n        }\r\n        // Clone to make sure properties like `viewportOffset` are not mutated in the event listeners.\r\n        const originalArgs = cloneDeep({ alignToTop, forceScroll, viewportOffset, ancestorOffset });\r\n        if (typeof viewportOffset === 'number') {\r\n            viewportOffset = {\r\n                top: viewportOffset,\r\n                bottom: viewportOffset,\r\n                left: viewportOffset,\r\n                right: viewportOffset\r\n            };\r\n        }\r\n        const options = {\r\n            target: this.domConverter.viewRangeToDom(range),\r\n            viewportOffset,\r\n            ancestorOffset,\r\n            alignToTop,\r\n            forceScroll\r\n        };\r\n        this.fire('scrollToTheSelection', options, originalArgs);\r\n        scrollViewportToShowTarget(options);\r\n    }\r\n    /**\r\n     * It will focus DOM element representing {@link module:engine/view/editableelement~EditableElement EditableElement}\r\n     * that is currently having selection inside.\r\n     */\r\n    focus() {\r\n        if (!this.document.isFocused) {\r\n            const editable = this.document.selection.editableElement;\r\n            if (editable) {\r\n                this.domConverter.focus(editable);\r\n                this.forceRender();\r\n            }\r\n            else {\r\n                // Before focusing view document, selection should be placed inside one of the view's editables.\r\n                // Normally its selection will be converted from model document (which have default selection), but\r\n                // when using view document on its own, we need to manually place selection before focusing it.\r\n                //\r\n                // @if CK_DEBUG // console.warn( 'There is no selection in any editable to focus.' );\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * The `change()` method is the primary way of changing the view. You should use it to modify any node in the view tree.\r\n     * It makes sure that after all changes are made the view is rendered to the DOM (assuming that the view will be changed\r\n     * inside the callback). It prevents situations when the DOM is updated when the view state is not yet correct. It allows\r\n     * to nest calls one inside another and still performs a single rendering after all those changes are made.\r\n     * It also returns the return value of its callback.\r\n     *\r\n     * ```ts\r\n     * const text = view.change( writer => {\r\n     * \tconst newText = writer.createText( 'foo' );\r\n     * \twriter.insert( position1, newText );\r\n     *\r\n     * \tview.change( writer => {\r\n     * \t\twriter.insert( position2, writer.createText( 'bar' ) );\r\n     * \t} );\r\n     *\r\n     * \twriter.remove( range );\r\n     *\r\n     * \treturn newText;\r\n     * } );\r\n     * ```\r\n     *\r\n     * When the outermost change block is done and rendering to the DOM is over the\r\n     * {@link module:engine/view/view~View#event:render `View#render`} event is fired.\r\n     *\r\n     * This method throws a `applying-view-changes-on-rendering` error when\r\n     * the change block is used after rendering to the DOM has started.\r\n     *\r\n     * @param callback Callback function which may modify the view.\r\n     * @returns Value returned by the callback.\r\n     */\r\n    change(callback) {\r\n        if (this.isRenderingInProgress || this._postFixersInProgress) {\r\n            /**\r\n             * Thrown when there is an attempt to make changes to the view tree when it is in incorrect state. This may\r\n             * cause some unexpected behaviour and inconsistency between the DOM and the view.\r\n             * This may be caused by:\r\n             *\r\n             * * calling {@link module:engine/view/view~View#change} or {@link module:engine/view/view~View#forceRender} during rendering\r\n             * process,\r\n             * * calling {@link module:engine/view/view~View#change} or {@link module:engine/view/view~View#forceRender} inside of\r\n             *   {@link module:engine/view/document~Document#registerPostFixer post-fixer function}.\r\n             *\r\n             * @error cannot-change-view-tree\r\n             */\r\n            throw new CKEditorError('cannot-change-view-tree', this);\r\n        }\r\n        try {\r\n            // Recursive call to view.change() method - execute listener immediately.\r\n            if (this._ongoingChange) {\r\n                return callback(this._writer);\r\n            }\r\n            // This lock will assure that all recursive calls to view.change() will end up in same block - one \"render\"\r\n            // event for all nested calls.\r\n            this._ongoingChange = true;\r\n            const callbackResult = callback(this._writer);\r\n            this._ongoingChange = false;\r\n            // This lock is used by editing controller to render changes from outer most model.change() once. As plugins might call\r\n            // view.change() inside model.change() block - this will ensures that postfixers and rendering are called once after all\r\n            // changes. Also, we don't need to render anything if there're no changes since last rendering.\r\n            if (!this._renderingDisabled && this._hasChangedSinceTheLastRendering) {\r\n                this._postFixersInProgress = true;\r\n                this.document._callPostFixers(this._writer);\r\n                this._postFixersInProgress = false;\r\n                this.fire('render');\r\n            }\r\n            return callbackResult;\r\n        }\r\n        catch (err) {\r\n            // @if CK_DEBUG // throw err;\r\n            /* istanbul ignore next -- @preserve */\r\n            CKEditorError.rethrowUnexpectedError(err, this);\r\n        }\r\n    }\r\n    /**\r\n     * Forces rendering {@link module:engine/view/document~Document view document} to DOM. If any view changes are\r\n     * currently in progress, rendering will start after all {@link #change change blocks} are processed.\r\n     *\r\n     * Note that this method is dedicated for special cases. All view changes should be wrapped in the {@link #change}\r\n     * block and the view will automatically check whether it needs to render DOM or not.\r\n     *\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `applying-view-changes-on-rendering` when\r\n     * trying to re-render when rendering to DOM has already started.\r\n     */\r\n    forceRender() {\r\n        this._hasChangedSinceTheLastRendering = true;\r\n        this.getObserver(FocusObserver).flush();\r\n        this.change(() => { });\r\n    }\r\n    /**\r\n     * Destroys this instance. Makes sure that all observers are destroyed and listeners removed.\r\n     */\r\n    destroy() {\r\n        for (const observer of this._observers.values()) {\r\n            observer.destroy();\r\n        }\r\n        this.document.destroy();\r\n        this.stopListening();\r\n    }\r\n    /**\r\n     * Creates position at the given location. The location can be specified as:\r\n     *\r\n     * * a {@link module:engine/view/position~Position position},\r\n     * * parent element and offset (offset defaults to `0`),\r\n     * * parent element and `'end'` (sets position at the end of that element),\r\n     * * {@link module:engine/view/item~Item view item} and `'before'` or `'after'` (sets position before or after given view item).\r\n     *\r\n     * This method is a shortcut to other constructors such as:\r\n     *\r\n     * * {@link #createPositionBefore},\r\n     * * {@link #createPositionAfter},\r\n     *\r\n     * @param offset Offset or one of the flags. Used only when first parameter is a {@link module:engine/view/item~Item view item}.\r\n     */\r\n    createPositionAt(itemOrPosition, offset) {\r\n        return Position._createAt(itemOrPosition, offset);\r\n    }\r\n    /**\r\n     * Creates a new position after given view item.\r\n     *\r\n     * @param item View item after which the position should be located.\r\n     */\r\n    createPositionAfter(item) {\r\n        return Position._createAfter(item);\r\n    }\r\n    /**\r\n     * Creates a new position before given view item.\r\n     *\r\n     * @param item View item before which the position should be located.\r\n     */\r\n    createPositionBefore(item) {\r\n        return Position._createBefore(item);\r\n    }\r\n    /**\r\n     * Creates a range spanning from `start` position to `end` position.\r\n     *\r\n     * **Note:** This factory method creates it's own {@link module:engine/view/position~Position} instances basing on passed values.\r\n     *\r\n     * @param start Start position.\r\n     * @param end End position. If not set, range will be collapsed at `start` position.\r\n     */\r\n    createRange(start, end) {\r\n        return new Range(start, end);\r\n    }\r\n    /**\r\n     * Creates a range that starts before given {@link module:engine/view/item~Item view item} and ends after it.\r\n     */\r\n    createRangeOn(item) {\r\n        return Range._createOn(item);\r\n    }\r\n    /**\r\n     * Creates a range inside an {@link module:engine/view/element~Element element} which starts before the first child of\r\n     * that element and ends after the last child of that element.\r\n     *\r\n     * @param element Element which is a parent for the range.\r\n     */\r\n    createRangeIn(element) {\r\n        return Range._createIn(element);\r\n    }\r\n    createSelection(...args) {\r\n        return new Selection(...args);\r\n    }\r\n    /**\r\n     * Disables or enables rendering. If the flag is set to `true` then the rendering will be disabled.\r\n     * If the flag is set to `false` and if there was some change in the meantime, then the rendering action will be performed.\r\n     *\r\n     * @internal\r\n     * @param flag A flag indicates whether the rendering should be disabled.\r\n     */\r\n    _disableRendering(flag) {\r\n        this._renderingDisabled = flag;\r\n        if (flag == false) {\r\n            // Render when you stop blocking rendering.\r\n            this.change(() => { });\r\n        }\r\n    }\r\n    /**\r\n     * Renders all changes. In order to avoid triggering the observers (e.g. selection) all observers are disabled\r\n     * before rendering and re-enabled after that.\r\n     */\r\n    _render() {\r\n        this.isRenderingInProgress = true;\r\n        this.disableObservers();\r\n        this._renderer.render();\r\n        this.enableObservers();\r\n        this.isRenderingInProgress = false;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nexport default class TypeCheckable {\r\n    /* istanbul ignore next -- @preserve */\r\n    is() {\r\n        // There are a lot of overloads above.\r\n        // Overriding method in derived classes remove them and only `is( type: string ): boolean` is visible which we don't want.\r\n        // One option would be to copy them all to all classes, but that's ugly.\r\n        // It's best when TypeScript compiler doesn't see those overloads, except the one in the top base class.\r\n        // To overload a method, but not let the compiler see it, do after class definition:\r\n        // `MyClass.prototype.is = function( type: string ) {...}`\r\n        throw new Error('is() method is abstract');\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/**\r\n * @module engine/model/node\r\n */\r\nimport TypeCheckable from './typecheckable';\r\nimport { CKEditorError, compareArrays, toMap } from '@ckeditor/ckeditor5-utils';\r\n// To check if component is loaded more than once.\r\nimport '@ckeditor/ckeditor5-utils/src/version';\r\n/**\r\n * Model node. Most basic structure of model tree.\r\n *\r\n * This is an abstract class that is a base for other classes representing different nodes in model.\r\n *\r\n * **Note:** If a node is detached from the model tree, you can manipulate it using it's API.\r\n * However, it is **very important** that nodes already attached to model tree should be only changed through\r\n * {@link module:engine/model/writer~Writer Writer API}.\r\n *\r\n * Changes done by `Node` methods, like {@link module:engine/model/element~Element#_insertChild _insertChild} or\r\n * {@link module:engine/model/node~Node#_setAttribute _setAttribute}\r\n * do not generate {@link module:engine/model/operation/operation~Operation operations}\r\n * which are essential for correct editor work if you modify nodes in {@link module:engine/model/document~Document document} root.\r\n *\r\n * The flow of working on `Node` (and classes that inherits from it) is as such:\r\n * 1. You can create a `Node` instance, modify it using it's API.\r\n * 2. Add `Node` to the model using `Batch` API.\r\n * 3. Change `Node` that was already added to the model using `Batch` API.\r\n *\r\n * Similarly, you cannot use `Batch` API on a node that has not been added to the model tree, with the exception\r\n * of {@link module:engine/model/writer~Writer#insert inserting} that node to the model tree.\r\n *\r\n * Be aware that using {@link module:engine/model/writer~Writer#remove remove from Batch API} does not allow to use `Node` API because\r\n * the information about `Node` is still kept in model document.\r\n *\r\n * In case of {@link module:engine/model/element~Element element node}, adding and removing children also counts as changing a node and\r\n * follows same rules.\r\n */\r\nexport default class Node extends TypeCheckable {\r\n    /**\r\n     * Creates a model node.\r\n     *\r\n     * This is an abstract class, so this constructor should not be used directly.\r\n     *\r\n     * @param attrs Node's attributes. See {@link module:utils/tomap~toMap} for a list of accepted values.\r\n     */\r\n    constructor(attrs) {\r\n        super();\r\n        /**\r\n         * Parent of this node. It could be {@link module:engine/model/element~Element}\r\n         * or {@link module:engine/model/documentfragment~DocumentFragment}.\r\n         * Equals to `null` if the node has no parent.\r\n         */\r\n        this.parent = null;\r\n        this._attrs = toMap(attrs);\r\n    }\r\n    /**\r\n     * {@link module:engine/model/document~Document Document} that owns this root element.\r\n     */\r\n    get document() {\r\n        return null;\r\n    }\r\n    /**\r\n     * Index of this node in its parent or `null` if the node has no parent.\r\n     *\r\n     * Accessing this property throws an error if this node's parent element does not contain it.\r\n     * This means that model tree got broken.\r\n     */\r\n    get index() {\r\n        let pos;\r\n        if (!this.parent) {\r\n            return null;\r\n        }\r\n        if ((pos = this.parent.getChildIndex(this)) === null) {\r\n            throw new CKEditorError('model-node-not-found-in-parent', this);\r\n        }\r\n        return pos;\r\n    }\r\n    /**\r\n     * Offset at which this node starts in its parent. It is equal to the sum of {@link #offsetSize offsetSize}\r\n     * of all its previous siblings. Equals to `null` if node has no parent.\r\n     *\r\n     * Accessing this property throws an error if this node's parent element does not contain it.\r\n     * This means that model tree got broken.\r\n     */\r\n    get startOffset() {\r\n        let pos;\r\n        if (!this.parent) {\r\n            return null;\r\n        }\r\n        if ((pos = this.parent.getChildStartOffset(this)) === null) {\r\n            throw new CKEditorError('model-node-not-found-in-parent', this);\r\n        }\r\n        return pos;\r\n    }\r\n    /**\r\n     * Offset size of this node. Represents how much \"offset space\" is occupied by the node in it's parent.\r\n     * It is important for {@link module:engine/model/position~Position position}. When node has `offsetSize` greater than `1`, position\r\n     * can be placed between that node start and end. `offsetSize` greater than `1` is for nodes that represents more\r\n     * than one entity, i.e. {@link module:engine/model/text~Text text node}.\r\n     */\r\n    get offsetSize() {\r\n        return 1;\r\n    }\r\n    /**\r\n     * Offset at which this node ends in it's parent. It is equal to the sum of this node's\r\n     * {@link module:engine/model/node~Node#startOffset start offset} and {@link #offsetSize offset size}.\r\n     * Equals to `null` if the node has no parent.\r\n     */\r\n    get endOffset() {\r\n        if (!this.parent) {\r\n            return null;\r\n        }\r\n        return this.startOffset + this.offsetSize;\r\n    }\r\n    /**\r\n     * Node's next sibling or `null` if the node is a last child of it's parent or if the node has no parent.\r\n     */\r\n    get nextSibling() {\r\n        const index = this.index;\r\n        return (index !== null && this.parent.getChild(index + 1)) || null;\r\n    }\r\n    /**\r\n     * Node's previous sibling or `null` if the node is a first child of it's parent or if the node has no parent.\r\n     */\r\n    get previousSibling() {\r\n        const index = this.index;\r\n        return (index !== null && this.parent.getChild(index - 1)) || null;\r\n    }\r\n    /**\r\n     * The top-most ancestor of the node. If node has no parent it is the root itself. If the node is a part\r\n     * of {@link module:engine/model/documentfragment~DocumentFragment}, it's `root` is equal to that `DocumentFragment`.\r\n     */\r\n    get root() {\r\n        // eslint-disable-next-line @typescript-eslint/no-this-alias, consistent-this\r\n        let root = this;\r\n        while (root.parent) {\r\n            root = root.parent;\r\n        }\r\n        return root;\r\n    }\r\n    /**\r\n     * Returns `true` if the node is inside a document root that is attached to the document.\r\n     */\r\n    isAttached() {\r\n        // If the node has no parent it means that it is a root.\r\n        // But this is not a `RootElement`, so it means that it is not attached.\r\n        //\r\n        // If this is not the root, check if this element's root is attached.\r\n        return this.parent === null ? false : this.root.isAttached();\r\n    }\r\n    /**\r\n     * Gets path to the node. The path is an array containing starting offsets of consecutive ancestors of this node,\r\n     * beginning from {@link module:engine/model/node~Node#root root}, down to this node's starting offset. The path can be used to\r\n     * create {@link module:engine/model/position~Position Position} instance.\r\n     *\r\n     * ```ts\r\n     * const abc = new Text( 'abc' );\r\n     * const foo = new Text( 'foo' );\r\n     * const h1 = new Element( 'h1', null, new Text( 'header' ) );\r\n     * const p = new Element( 'p', null, [ abc, foo ] );\r\n     * const div = new Element( 'div', null, [ h1, p ] );\r\n     * foo.getPath(); // Returns [ 1, 3 ]. `foo` is in `p` which is in `div`. `p` starts at offset 1, while `foo` at 3.\r\n     * h1.getPath(); // Returns [ 0 ].\r\n     * div.getPath(); // Returns [].\r\n     * ```\r\n     */\r\n    getPath() {\r\n        const path = [];\r\n        // eslint-disable-next-line @typescript-eslint/no-this-alias, consistent-this\r\n        let node = this;\r\n        while (node.parent) {\r\n            path.unshift(node.startOffset);\r\n            node = node.parent;\r\n        }\r\n        return path;\r\n    }\r\n    /**\r\n     * Returns ancestors array of this node.\r\n     *\r\n     * @param options Options object.\r\n     * @param options.includeSelf When set to `true` this node will be also included in parent's array.\r\n     * @param options.parentFirst When set to `true`, array will be sorted from node's parent to root element,\r\n     * otherwise root element will be the first item in the array.\r\n     * @returns Array with ancestors.\r\n     */\r\n    getAncestors(options = {}) {\r\n        const ancestors = [];\r\n        let parent = options.includeSelf ? this : this.parent;\r\n        while (parent) {\r\n            ancestors[options.parentFirst ? 'push' : 'unshift'](parent);\r\n            parent = parent.parent;\r\n        }\r\n        return ancestors;\r\n    }\r\n    /**\r\n     * Returns a {@link module:engine/model/element~Element} or {@link module:engine/model/documentfragment~DocumentFragment}\r\n     * which is a common ancestor of both nodes.\r\n     *\r\n     * @param node The second node.\r\n     * @param options Options object.\r\n     * @param options.includeSelf When set to `true` both nodes will be considered \"ancestors\" too.\r\n     * Which means that if e.g. node A is inside B, then their common ancestor will be B.\r\n     */\r\n    getCommonAncestor(node, options = {}) {\r\n        const ancestorsA = this.getAncestors(options);\r\n        const ancestorsB = node.getAncestors(options);\r\n        let i = 0;\r\n        while (ancestorsA[i] == ancestorsB[i] && ancestorsA[i]) {\r\n            i++;\r\n        }\r\n        return i === 0 ? null : ancestorsA[i - 1];\r\n    }\r\n    /**\r\n     * Returns whether this node is before given node. `false` is returned if nodes are in different trees (for example,\r\n     * in different {@link module:engine/model/documentfragment~DocumentFragment}s).\r\n     *\r\n     * @param node Node to compare with.\r\n     */\r\n    isBefore(node) {\r\n        // Given node is not before this node if they are same.\r\n        if (this == node) {\r\n            return false;\r\n        }\r\n        // Return `false` if it is impossible to compare nodes.\r\n        if (this.root !== node.root) {\r\n            return false;\r\n        }\r\n        const thisPath = this.getPath();\r\n        const nodePath = node.getPath();\r\n        const result = compareArrays(thisPath, nodePath);\r\n        switch (result) {\r\n            case 'prefix':\r\n                return true;\r\n            case 'extension':\r\n                return false;\r\n            default:\r\n                return thisPath[result] < nodePath[result];\r\n        }\r\n    }\r\n    /**\r\n     * Returns whether this node is after given node. `false` is returned if nodes are in different trees (for example,\r\n     * in different {@link module:engine/model/documentfragment~DocumentFragment}s).\r\n     *\r\n     * @param node Node to compare with.\r\n     */\r\n    isAfter(node) {\r\n        // Given node is not before this node if they are same.\r\n        if (this == node) {\r\n            return false;\r\n        }\r\n        // Return `false` if it is impossible to compare nodes.\r\n        if (this.root !== node.root) {\r\n            return false;\r\n        }\r\n        // In other cases, just check if the `node` is before, and return the opposite.\r\n        return !this.isBefore(node);\r\n    }\r\n    /**\r\n     * Checks if the node has an attribute with given key.\r\n     *\r\n     * @param key Key of attribute to check.\r\n     * @returns `true` if attribute with given key is set on node, `false` otherwise.\r\n     */\r\n    hasAttribute(key) {\r\n        return this._attrs.has(key);\r\n    }\r\n    /**\r\n     * Gets an attribute value for given key or `undefined` if that attribute is not set on node.\r\n     *\r\n     * @param key Key of attribute to look for.\r\n     * @returns Attribute value or `undefined`.\r\n     */\r\n    getAttribute(key) {\r\n        return this._attrs.get(key);\r\n    }\r\n    /**\r\n     * Returns iterator that iterates over this node's attributes.\r\n     *\r\n     * Attributes are returned as arrays containing two items. First one is attribute key and second is attribute value.\r\n     * This format is accepted by native `Map` object and also can be passed in `Node` constructor.\r\n     */\r\n    getAttributes() {\r\n        return this._attrs.entries();\r\n    }\r\n    /**\r\n     * Returns iterator that iterates over this node's attribute keys.\r\n     */\r\n    getAttributeKeys() {\r\n        return this._attrs.keys();\r\n    }\r\n    /**\r\n     * Converts `Node` to plain object and returns it.\r\n     *\r\n     * @returns `Node` converted to plain object.\r\n     */\r\n    toJSON() {\r\n        const json = {};\r\n        // Serializes attributes to the object.\r\n        // attributes = { a: 'foo', b: 1, c: true }.\r\n        if (this._attrs.size) {\r\n            json.attributes = Array.from(this._attrs).reduce((result, attr) => {\r\n                result[attr[0]] = attr[1];\r\n                return result;\r\n            }, {});\r\n        }\r\n        return json;\r\n    }\r\n    /**\r\n     * Creates a copy of this node, that is a node with exactly same attributes, and returns it.\r\n     *\r\n     * @internal\r\n     * @returns Node with same attributes as this node.\r\n     */\r\n    _clone(_deep) {\r\n        return new this.constructor(this._attrs);\r\n    }\r\n    /**\r\n     * Removes this node from it's parent.\r\n     *\r\n     * @internal\r\n     * @see module:engine/model/writer~Writer#remove\r\n     */\r\n    _remove() {\r\n        this.parent._removeChildren(this.index);\r\n    }\r\n    /**\r\n     * Sets attribute on the node. If attribute with the same key already is set, it's value is overwritten.\r\n     *\r\n     * @see module:engine/model/writer~Writer#setAttribute\r\n     * @internal\r\n     * @param key Key of attribute to set.\r\n     * @param value Attribute value.\r\n     */\r\n    _setAttribute(key, value) {\r\n        this._attrs.set(key, value);\r\n    }\r\n    /**\r\n     * Removes all attributes from the node and sets given attributes.\r\n     *\r\n     * @see module:engine/model/writer~Writer#setAttributes\r\n     * @internal\r\n     * @param attrs Attributes to set. See {@link module:utils/tomap~toMap} for a list of accepted values.\r\n     */\r\n    _setAttributesTo(attrs) {\r\n        this._attrs = toMap(attrs);\r\n    }\r\n    /**\r\n     * Removes an attribute with given key from the node.\r\n     *\r\n     * @see module:engine/model/writer~Writer#removeAttribute\r\n     * @internal\r\n     * @param key Key of attribute to remove.\r\n     * @returns `true` if the attribute was set on the element, `false` otherwise.\r\n     */\r\n    _removeAttribute(key) {\r\n        return this._attrs.delete(key);\r\n    }\r\n    /**\r\n     * Removes all attributes from the node.\r\n     *\r\n     * @see module:engine/model/writer~Writer#clearAttributes\r\n     * @internal\r\n     */\r\n    _clearAttributes() {\r\n        this._attrs.clear();\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nNode.prototype.is = function (type) {\r\n    return type === 'node' || type === 'model:node';\r\n};\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/nodelist\r\n */\r\nimport Node from './node';\r\nimport { CKEditorError, spliceArray } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Provides an interface to operate on a list of {@link module:engine/model/node~Node nodes}. `NodeList` is used internally\r\n * in classes like {@link module:engine/model/element~Element Element}\r\n * or {@link module:engine/model/documentfragment~DocumentFragment DocumentFragment}.\r\n */\r\nexport default class NodeList {\r\n    /**\r\n     * Creates an empty node list.\r\n     *\r\n     * @internal\r\n     * @param nodes Nodes contained in this node list.\r\n     */\r\n    constructor(nodes) {\r\n        /**\r\n         * Nodes contained in this node list.\r\n         */\r\n        this._nodes = [];\r\n        if (nodes) {\r\n            this._insertNodes(0, nodes);\r\n        }\r\n    }\r\n    /**\r\n     * Iterable interface.\r\n     *\r\n     * Iterates over all nodes contained inside this node list.\r\n     */\r\n    [Symbol.iterator]() {\r\n        return this._nodes[Symbol.iterator]();\r\n    }\r\n    /**\r\n     * Number of nodes contained inside this node list.\r\n     */\r\n    get length() {\r\n        return this._nodes.length;\r\n    }\r\n    /**\r\n     * Sum of {@link module:engine/model/node~Node#offsetSize offset sizes} of all nodes contained inside this node list.\r\n     */\r\n    get maxOffset() {\r\n        return this._nodes.reduce((sum, node) => sum + node.offsetSize, 0);\r\n    }\r\n    /**\r\n     * Gets the node at the given index. Returns `null` if incorrect index was passed.\r\n     */\r\n    getNode(index) {\r\n        return this._nodes[index] || null;\r\n    }\r\n    /**\r\n     * Returns an index of the given node. Returns `null` if given node is not inside this node list.\r\n     */\r\n    getNodeIndex(node) {\r\n        const index = this._nodes.indexOf(node);\r\n        return index == -1 ? null : index;\r\n    }\r\n    /**\r\n     * Returns the starting offset of given node. Starting offset is equal to the sum of\r\n     * {@link module:engine/model/node~Node#offsetSize offset sizes} of all nodes that are before this node in this node list.\r\n     */\r\n    getNodeStartOffset(node) {\r\n        const index = this.getNodeIndex(node);\r\n        return index === null ? null : this._nodes.slice(0, index).reduce((sum, node) => sum + node.offsetSize, 0);\r\n    }\r\n    /**\r\n     * Converts index to offset in node list.\r\n     *\r\n     * Returns starting offset of a node that is at given index. Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError}\r\n     * `model-nodelist-index-out-of-bounds` if given index is less than `0` or more than {@link #length}.\r\n     */\r\n    indexToOffset(index) {\r\n        if (index == this._nodes.length) {\r\n            return this.maxOffset;\r\n        }\r\n        const node = this._nodes[index];\r\n        if (!node) {\r\n            /**\r\n             * Given index cannot be found in the node list.\r\n             *\r\n             * @error model-nodelist-index-out-of-bounds\r\n             */\r\n            throw new CKEditorError('model-nodelist-index-out-of-bounds', this);\r\n        }\r\n        return this.getNodeStartOffset(node);\r\n    }\r\n    /**\r\n     * Converts offset in node list to index.\r\n     *\r\n     * Returns index of a node that occupies given offset. Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError}\r\n     * `model-nodelist-offset-out-of-bounds` if given offset is less than `0` or more than {@link #maxOffset}.\r\n     */\r\n    offsetToIndex(offset) {\r\n        let totalOffset = 0;\r\n        for (const node of this._nodes) {\r\n            if (offset >= totalOffset && offset < totalOffset + node.offsetSize) {\r\n                return this.getNodeIndex(node);\r\n            }\r\n            totalOffset += node.offsetSize;\r\n        }\r\n        if (totalOffset != offset) {\r\n            /**\r\n             * Given offset cannot be found in the node list.\r\n             *\r\n             * @error model-nodelist-offset-out-of-bounds\r\n             * @param offset\r\n             * @param nodeList Stringified node list.\r\n             */\r\n            throw new CKEditorError('model-nodelist-offset-out-of-bounds', this, {\r\n                offset,\r\n                nodeList: this\r\n            });\r\n        }\r\n        return this.length;\r\n    }\r\n    /**\r\n     * Inserts given nodes at given index.\r\n     *\r\n     * @internal\r\n     * @param index Index at which nodes should be inserted.\r\n     * @param nodes Nodes to be inserted.\r\n     */\r\n    _insertNodes(index, nodes) {\r\n        // Validation.\r\n        for (const node of nodes) {\r\n            if (!(node instanceof Node)) {\r\n                /**\r\n                 * Trying to insert an object which is not a Node instance.\r\n                 *\r\n                 * @error model-nodelist-insertnodes-not-node\r\n                 */\r\n                throw new CKEditorError('model-nodelist-insertnodes-not-node', this);\r\n            }\r\n        }\r\n        this._nodes = spliceArray(this._nodes, Array.from(nodes), index, 0);\r\n    }\r\n    /**\r\n     * Removes one or more nodes starting at the given index.\r\n     *\r\n     * @internal\r\n     * @param indexStart Index of the first node to remove.\r\n     * @param howMany Number of nodes to remove.\r\n     * @returns Array containing removed nodes.\r\n     */\r\n    _removeNodes(indexStart, howMany = 1) {\r\n        return this._nodes.splice(indexStart, howMany);\r\n    }\r\n    /**\r\n     * Converts `NodeList` instance to an array containing nodes that were inserted in the node list. Nodes\r\n     * are also converted to their plain object representation.\r\n     *\r\n     * @returns `NodeList` instance converted to `Array`.\r\n     */\r\n    toJSON() {\r\n        return this._nodes.map(node => node.toJSON());\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/splicearray\r\n */\r\nconst BIG_CHUNK_SIZE = 10000;\r\n/**\r\n * Splices one array into another. To be used instead of `Array.prototype.splice` as the latter may\r\n * throw \"Maximum call stack size exceeded\" when passed huge number of items to insert.\r\n *\r\n * Note: in contrary to Array.splice, this function does not modify the original `target`.\r\n *\r\n * ```ts\r\n * spliceArray( [ 1, 2 ], [ 3, 4 ], 0, 0 );\t// [ 3, 4, 1, 2 ]\r\n * spliceArray( [ 1, 2 ], [ 3, 4 ], 1, 1 );\t// [ 1, 3, 4 ]\r\n * spliceArray( [ 1, 2 ], [ 3, 4 ], 1, 0 );\t// [ 1, 3, 4, 2 ]\r\n * spliceArray( [ 1, 2 ], [ 3, 4 ], 2, 0 );\t// [ 1, 2, 3, 4 ]\r\n * spliceArray( [ 1, 2 ], [],       0, 1 );\t// [ 2 ]\r\n * ```\r\n *\r\n * @param target Array to be spliced.\r\n * @param source Array of elements to be inserted to target.\r\n * @param start Index at which nodes should be inserted/removed.\r\n * @param count Number of items.\r\n *\r\n * @returns New spliced array.\r\n */\r\nexport default function spliceArray(target, source, start, count) {\r\n    // In case of performance problems, see: https://github.com/ckeditor/ckeditor5/pull/12429/files#r965850568\r\n    if (Math.max(source.length, target.length) > BIG_CHUNK_SIZE) {\r\n        return target.slice(0, start).concat(source).concat(target.slice(start + count, target.length));\r\n    }\r\n    else {\r\n        const newTarget = Array.from(target);\r\n        newTarget.splice(start, count, ...source);\r\n        return newTarget;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/text\r\n */\r\nimport Node from './node';\r\n// @if CK_DEBUG_ENGINE // const { convertMapToStringifiedObject } = require( '../dev-utils/utils' );\r\n/**\r\n * Model text node. Type of {@link module:engine/model/node~Node node} that contains {@link module:engine/model/text~Text#data text data}.\r\n *\r\n * **Important:** see {@link module:engine/model/node~Node} to read about restrictions using `Text` and `Node` API.\r\n *\r\n * **Note:** keep in mind that `Text` instances might indirectly got removed from model tree when model is changed.\r\n * This happens when {@link module:engine/model/writer~Writer model writer} is used to change model and the text node is merged with\r\n * another text node. Then, both text nodes are removed and a new text node is inserted into the model. Because of\r\n * this behavior, keeping references to `Text` is not recommended. Instead, consider creating\r\n * {@link module:engine/model/liveposition~LivePosition live position} placed before the text node.\r\n */\r\nexport default class Text extends Node {\r\n    /**\r\n     * Creates a text node.\r\n     *\r\n     * **Note:** Constructor of this class shouldn't be used directly in the code.\r\n     * Use the {@link module:engine/model/writer~Writer#createText} method instead.\r\n     *\r\n     * @internal\r\n     * @param data Node's text.\r\n     * @param attrs Node's attributes. See {@link module:utils/tomap~toMap} for a list of accepted values.\r\n     */\r\n    constructor(data, attrs) {\r\n        super(attrs);\r\n        this._data = data || '';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    get offsetSize() {\r\n        return this.data.length;\r\n    }\r\n    /**\r\n     * Returns a text data contained in the node.\r\n     */\r\n    get data() {\r\n        return this._data;\r\n    }\r\n    /**\r\n     * Converts `Text` instance to plain object and returns it.\r\n     *\r\n     * @returns`Text` instance converted to plain object.\r\n     */\r\n    toJSON() {\r\n        const json = super.toJSON();\r\n        json.data = this.data;\r\n        return json;\r\n    }\r\n    /**\r\n     * Creates a copy of this text node and returns it. Created text node has same text data and attributes as original text node.\r\n     *\r\n     * @internal\r\n     * @returns `Text` instance created using given plain object.\r\n     */\r\n    _clone() {\r\n        return new Text(this.data, this.getAttributes());\r\n    }\r\n    /**\r\n     * Creates a `Text` instance from given plain object (i.e. parsed JSON string).\r\n     *\r\n     * @param json Plain object to be converted to `Text`.\r\n     * @returns `Text` instance created using given plain object.\r\n     */\r\n    static fromJSON(json) {\r\n        return new Text(json.data, json.attributes);\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nText.prototype.is = function (type) {\r\n    return type === '$text' || type === 'model:$text' ||\r\n        // This are legacy values kept for backward compatibility.\r\n        type === 'text' || type === 'model:text' ||\r\n        // From super.is(). This is highly utilised method and cannot call super. See ckeditor/ckeditor5#6529.\r\n        type === 'node' || type === 'model:node';\r\n};\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/textproxy\r\n */\r\nimport TypeCheckable from './typecheckable';\r\nimport { CKEditorError } from '@ckeditor/ckeditor5-utils';\r\n// @if CK_DEBUG_ENGINE // const { convertMapToStringifiedObject } = require( '../dev-utils/utils' );\r\n/**\r\n * `TextProxy` represents a part of {@link module:engine/model/text~Text text node}.\r\n *\r\n * Since {@link module:engine/model/position~Position positions} can be placed between characters of a text node,\r\n * {@link module:engine/model/range~Range ranges} may contain only parts of text nodes. When {@link module:engine/model/range~Range#getItems\r\n * getting items}\r\n * contained in such range, we need to represent a part of that text node, since returning the whole text node would be incorrect.\r\n * `TextProxy` solves this issue.\r\n *\r\n * `TextProxy` has an API similar to {@link module:engine/model/text~Text Text} and allows to do most of the common tasks performed\r\n * on model nodes.\r\n *\r\n * **Note:** Some `TextProxy` instances may represent whole text node, not just a part of it.\r\n * See {@link module:engine/model/textproxy~TextProxy#isPartial}.\r\n *\r\n * **Note:** `TextProxy` is not an instance of {@link module:engine/model/node~Node node}. Keep this in mind when using it as a\r\n * parameter of methods.\r\n *\r\n * **Note:** `TextProxy` is a readonly interface. If you want to perform changes on model data represented by a `TextProxy`\r\n * use {@link module:engine/model/writer~Writer model writer API}.\r\n *\r\n * **Note:** `TextProxy` instances are created on the fly, basing on the current state of model. Because of this, it is\r\n * highly unrecommended to store references to `TextProxy` instances. `TextProxy` instances are not refreshed when\r\n * model changes, so they might get invalidated. Instead, consider creating {@link module:engine/model/liveposition~LivePosition live\r\n * position}.\r\n *\r\n * `TextProxy` instances are created by {@link module:engine/model/treewalker~TreeWalker model tree walker}. You should not need to create\r\n * an instance of this class by your own.\r\n */\r\nexport default class TextProxy extends TypeCheckable {\r\n    /**\r\n     * Creates a text proxy.\r\n     *\r\n     * @internal\r\n     * @param textNode Text node which part is represented by this text proxy.\r\n     * @param offsetInText Offset in {@link module:engine/model/textproxy~TextProxy#textNode text node} from which the text proxy\r\n     * starts.\r\n     * @param length Text proxy length, that is how many text node's characters, starting from `offsetInText` it represents.\r\n     */\r\n    constructor(textNode, offsetInText, length) {\r\n        super();\r\n        this.textNode = textNode;\r\n        if (offsetInText < 0 || offsetInText > textNode.offsetSize) {\r\n            /**\r\n             * Given `offsetInText` value is incorrect.\r\n             *\r\n             * @error model-textproxy-wrong-offsetintext\r\n             */\r\n            throw new CKEditorError('model-textproxy-wrong-offsetintext', this);\r\n        }\r\n        if (length < 0 || offsetInText + length > textNode.offsetSize) {\r\n            /**\r\n             * Given `length` value is incorrect.\r\n             *\r\n             * @error model-textproxy-wrong-length\r\n             */\r\n            throw new CKEditorError('model-textproxy-wrong-length', this);\r\n        }\r\n        this.data = textNode.data.substring(offsetInText, offsetInText + length);\r\n        this.offsetInText = offsetInText;\r\n    }\r\n    /**\r\n     * Offset at which this text proxy starts in it's parent.\r\n     *\r\n     * @see module:engine/model/node~Node#startOffset\r\n     */\r\n    get startOffset() {\r\n        return this.textNode.startOffset !== null ? this.textNode.startOffset + this.offsetInText : null;\r\n    }\r\n    /**\r\n     * Offset size of this text proxy. Equal to the number of characters represented by the text proxy.\r\n     *\r\n     * @see module:engine/model/node~Node#offsetSize\r\n     */\r\n    get offsetSize() {\r\n        return this.data.length;\r\n    }\r\n    /**\r\n     * Offset at which this text proxy ends in it's parent.\r\n     *\r\n     * @see module:engine/model/node~Node#endOffset\r\n     */\r\n    get endOffset() {\r\n        return this.startOffset !== null ? this.startOffset + this.offsetSize : null;\r\n    }\r\n    /**\r\n     * Flag indicating whether `TextProxy` instance covers only part of the original {@link module:engine/model/text~Text text node}\r\n     * (`true`) or the whole text node (`false`).\r\n     *\r\n     * This is `false` when text proxy starts at the very beginning of {@link module:engine/model/textproxy~TextProxy#textNode textNode}\r\n     * ({@link module:engine/model/textproxy~TextProxy#offsetInText offsetInText} equals `0`) and text proxy sizes is equal to\r\n     * text node size.\r\n     */\r\n    get isPartial() {\r\n        return this.offsetSize !== this.textNode.offsetSize;\r\n    }\r\n    /**\r\n     * Parent of this text proxy, which is same as parent of text node represented by this text proxy.\r\n     */\r\n    get parent() {\r\n        return this.textNode.parent;\r\n    }\r\n    /**\r\n     * Root of this text proxy, which is same as root of text node represented by this text proxy.\r\n     */\r\n    get root() {\r\n        return this.textNode.root;\r\n    }\r\n    /**\r\n     * Gets path to this text proxy.\r\n     *\r\n     * @see module:engine/model/node~Node#getPath\r\n     */\r\n    getPath() {\r\n        const path = this.textNode.getPath();\r\n        if (path.length > 0) {\r\n            path[path.length - 1] += this.offsetInText;\r\n        }\r\n        return path;\r\n    }\r\n    /**\r\n     * Returns ancestors array of this text proxy.\r\n     *\r\n     * @param options Options object.\r\n     * @param options.includeSelf When set to `true` this text proxy will be also included in parent's array.\r\n     * @param options.parentFirst When set to `true`, array will be sorted from text proxy parent to root element,\r\n     * otherwise root element will be the first item in the array.\r\n     * @returns Array with ancestors.\r\n     */\r\n    getAncestors(options = {}) {\r\n        const ancestors = [];\r\n        let parent = options.includeSelf ? this : this.parent;\r\n        while (parent) {\r\n            ancestors[options.parentFirst ? 'push' : 'unshift'](parent);\r\n            parent = parent.parent;\r\n        }\r\n        return ancestors;\r\n    }\r\n    /**\r\n     * Checks if this text proxy has an attribute for given key.\r\n     *\r\n     * @param key Key of attribute to check.\r\n     * @returns `true` if attribute with given key is set on text proxy, `false` otherwise.\r\n     */\r\n    hasAttribute(key) {\r\n        return this.textNode.hasAttribute(key);\r\n    }\r\n    /**\r\n     * Gets an attribute value for given key or `undefined` if that attribute is not set on text proxy.\r\n     *\r\n     * @param key Key of attribute to look for.\r\n     * @returns Attribute value or `undefined`.\r\n     */\r\n    getAttribute(key) {\r\n        return this.textNode.getAttribute(key);\r\n    }\r\n    /**\r\n     * Returns iterator that iterates over this node's attributes. Attributes are returned as arrays containing two\r\n     * items. First one is attribute key and second is attribute value.\r\n     *\r\n     * This format is accepted by native `Map` object and also can be passed in `Node` constructor.\r\n     */\r\n    getAttributes() {\r\n        return this.textNode.getAttributes();\r\n    }\r\n    /**\r\n     * Returns iterator that iterates over this node's attribute keys.\r\n     */\r\n    getAttributeKeys() {\r\n        return this.textNode.getAttributeKeys();\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nTextProxy.prototype.is = function (type) {\r\n    return type === '$textProxy' || type === 'model:$textProxy' ||\r\n        // This are legacy values kept for backward compatibility.\r\n        type === 'textProxy' || type === 'model:textProxy';\r\n};\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/element\r\n */\r\nimport Node from './node';\r\nimport NodeList from './nodelist';\r\nimport Text from './text';\r\nimport TextProxy from './textproxy';\r\nimport { isIterable } from '@ckeditor/ckeditor5-utils';\r\n// @if CK_DEBUG_ENGINE // const { stringifyMap, convertMapToStringifiedObject, convertMapToTags } = require( '../dev-utils/utils' );\r\n/**\r\n * Model element. Type of {@link module:engine/model/node~Node node} that has a {@link module:engine/model/element~Element#name name} and\r\n * {@link module:engine/model/element~Element#getChildren child nodes}.\r\n *\r\n * **Important**: see {@link module:engine/model/node~Node} to read about restrictions using `Element` and `Node` API.\r\n */\r\nexport default class Element extends Node {\r\n    /**\r\n     * Creates a model element.\r\n     *\r\n     * **Note:** Constructor of this class shouldn't be used directly in the code.\r\n     * Use the {@link module:engine/model/writer~Writer#createElement} method instead.\r\n     *\r\n     * @internal\r\n     * @param name Element's name.\r\n     * @param attrs Element's attributes. See {@link module:utils/tomap~toMap} for a list of accepted values.\r\n     * @param children One or more nodes to be inserted as children of created element.\r\n     */\r\n    constructor(name, attrs, children) {\r\n        super(attrs);\r\n        /**\r\n         * List of children nodes.\r\n         */\r\n        this._children = new NodeList();\r\n        this.name = name;\r\n        if (children) {\r\n            this._insertChild(0, children);\r\n        }\r\n    }\r\n    /**\r\n     * Number of this element's children.\r\n     */\r\n    get childCount() {\r\n        return this._children.length;\r\n    }\r\n    /**\r\n     * Sum of {@link module:engine/model/node~Node#offsetSize offset sizes} of all of this element's children.\r\n     */\r\n    get maxOffset() {\r\n        return this._children.maxOffset;\r\n    }\r\n    /**\r\n     * Is `true` if there are no nodes inside this element, `false` otherwise.\r\n     */\r\n    get isEmpty() {\r\n        return this.childCount === 0;\r\n    }\r\n    /**\r\n     * Gets the child at the given index.\r\n     */\r\n    getChild(index) {\r\n        return this._children.getNode(index);\r\n    }\r\n    /**\r\n     * Returns an iterator that iterates over all of this element's children.\r\n     */\r\n    getChildren() {\r\n        return this._children[Symbol.iterator]();\r\n    }\r\n    /**\r\n     * Returns an index of the given child node. Returns `null` if given node is not a child of this element.\r\n     *\r\n     * @param node Child node to look for.\r\n     * @returns Child node's index in this element.\r\n     */\r\n    getChildIndex(node) {\r\n        return this._children.getNodeIndex(node);\r\n    }\r\n    /**\r\n     * Returns the starting offset of given child. Starting offset is equal to the sum of\r\n     * {@link module:engine/model/node~Node#offsetSize offset sizes} of all node's siblings that are before it. Returns `null` if\r\n     * given node is not a child of this element.\r\n     *\r\n     * @param node Child node to look for.\r\n     * @returns Child node's starting offset.\r\n     */\r\n    getChildStartOffset(node) {\r\n        return this._children.getNodeStartOffset(node);\r\n    }\r\n    /**\r\n     * Returns index of a node that occupies given offset. If given offset is too low, returns `0`. If given offset is\r\n     * too high, returns {@link module:engine/model/element~Element#getChildIndex index after last child}.\r\n     *\r\n     * ```ts\r\n     * const textNode = new Text( 'foo' );\r\n     * const pElement = new Element( 'p' );\r\n     * const divElement = new Element( [ textNode, pElement ] );\r\n     * divElement.offsetToIndex( -1 ); // Returns 0, because offset is too low.\r\n     * divElement.offsetToIndex( 0 ); // Returns 0, because offset 0 is taken by `textNode` which is at index 0.\r\n     * divElement.offsetToIndex( 1 ); // Returns 0, because `textNode` has `offsetSize` equal to 3, so it occupies offset 1 too.\r\n     * divElement.offsetToIndex( 2 ); // Returns 0.\r\n     * divElement.offsetToIndex( 3 ); // Returns 1.\r\n     * divElement.offsetToIndex( 4 ); // Returns 2. There are no nodes at offset 4, so last available index is returned.\r\n     * ```\r\n     */\r\n    offsetToIndex(offset) {\r\n        return this._children.offsetToIndex(offset);\r\n    }\r\n    /**\r\n     * Returns a descendant node by its path relative to this element.\r\n     *\r\n     * ```ts\r\n     * // <this>a<b>c</b></this>\r\n     * this.getNodeByPath( [ 0 ] );     // -> \"a\"\r\n     * this.getNodeByPath( [ 1 ] );     // -> <b>\r\n     * this.getNodeByPath( [ 1, 0 ] );  // -> \"c\"\r\n     * ```\r\n     *\r\n     * @param relativePath Path of the node to find, relative to this element.\r\n     */\r\n    getNodeByPath(relativePath) {\r\n        // eslint-disable-next-line @typescript-eslint/no-this-alias, consistent-this\r\n        let node = this;\r\n        for (const index of relativePath) {\r\n            node = node.getChild(node.offsetToIndex(index));\r\n        }\r\n        return node;\r\n    }\r\n    /**\r\n     * Returns the parent element of the given name. Returns null if the element is not inside the desired parent.\r\n     *\r\n     * @param parentName The name of the parent element to find.\r\n     * @param options Options object.\r\n     * @param options.includeSelf When set to `true` this node will be also included while searching.\r\n     */\r\n    findAncestor(parentName, options = {}) {\r\n        let parent = options.includeSelf ? this : this.parent;\r\n        while (parent) {\r\n            if (parent.name === parentName) {\r\n                return parent;\r\n            }\r\n            parent = parent.parent;\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Converts `Element` instance to plain object and returns it. Takes care of converting all of this element's children.\r\n     *\r\n     * @returns `Element` instance converted to plain object.\r\n     */\r\n    toJSON() {\r\n        const json = super.toJSON();\r\n        json.name = this.name;\r\n        if (this._children.length > 0) {\r\n            json.children = [];\r\n            for (const node of this._children) {\r\n                json.children.push(node.toJSON());\r\n            }\r\n        }\r\n        return json;\r\n    }\r\n    /**\r\n     * Creates a copy of this element and returns it. Created element has the same name and attributes as the original element.\r\n     * If clone is deep, the original element's children are also cloned. If not, then empty element is returned.\r\n     *\r\n     * @internal\r\n     * @param deep If set to `true` clones element and all its children recursively. When set to `false`,\r\n     * element will be cloned without any child.\r\n     */\r\n    _clone(deep = false) {\r\n        const children = deep ? Array.from(this._children).map(node => node._clone(true)) : undefined;\r\n        return new Element(this.name, this.getAttributes(), children);\r\n    }\r\n    /**\r\n     * {@link module:engine/model/element~Element#_insertChild Inserts} one or more nodes at the end of this element.\r\n     *\r\n     * @see module:engine/model/writer~Writer#append\r\n     * @internal\r\n     * @param nodes Nodes to be inserted.\r\n     */\r\n    _appendChild(nodes) {\r\n        this._insertChild(this.childCount, nodes);\r\n    }\r\n    /**\r\n     * Inserts one or more nodes at the given index and sets {@link module:engine/model/node~Node#parent parent} of these nodes\r\n     * to this element.\r\n     *\r\n     * @see module:engine/model/writer~Writer#insert\r\n     * @internal\r\n     * @param index Index at which nodes should be inserted.\r\n     * @param items Items to be inserted.\r\n     */\r\n    _insertChild(index, items) {\r\n        const nodes = normalize(items);\r\n        for (const node of nodes) {\r\n            // If node that is being added to this element is already inside another element, first remove it from the old parent.\r\n            if (node.parent !== null) {\r\n                node._remove();\r\n            }\r\n            node.parent = this;\r\n        }\r\n        this._children._insertNodes(index, nodes);\r\n    }\r\n    /**\r\n     * Removes one or more nodes starting at the given index and sets\r\n     * {@link module:engine/model/node~Node#parent parent} of these nodes to `null`.\r\n     *\r\n     * @see module:engine/model/writer~Writer#remove\r\n     * @internal\r\n     * @param index Index of the first node to remove.\r\n     * @param howMany Number of nodes to remove.\r\n     * @returns Array containing removed nodes.\r\n     */\r\n    _removeChildren(index, howMany = 1) {\r\n        const nodes = this._children._removeNodes(index, howMany);\r\n        for (const node of nodes) {\r\n            node.parent = null;\r\n        }\r\n        return nodes;\r\n    }\r\n    /**\r\n     * Creates an `Element` instance from given plain object (i.e. parsed JSON string).\r\n     * Converts `Element` children to proper nodes.\r\n     *\r\n     * @param json Plain object to be converted to `Element`.\r\n     * @returns `Element` instance created using given plain object.\r\n     */\r\n    static fromJSON(json) {\r\n        let children;\r\n        if (json.children) {\r\n            children = [];\r\n            for (const child of json.children) {\r\n                if (child.name) {\r\n                    // If child has name property, it is an Element.\r\n                    children.push(Element.fromJSON(child));\r\n                }\r\n                else {\r\n                    // Otherwise, it is a Text node.\r\n                    children.push(Text.fromJSON(child));\r\n                }\r\n            }\r\n        }\r\n        return new Element(json.name, json.attributes, children);\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nElement.prototype.is = function (type, name) {\r\n    if (!name) {\r\n        return type === 'element' || type === 'model:element' ||\r\n            // From super.is(). This is highly utilised method and cannot call super. See ckeditor/ckeditor5#6529.\r\n            type === 'node' || type === 'model:node';\r\n    }\r\n    return name === this.name && (type === 'element' || type === 'model:element');\r\n};\r\n/**\r\n * Converts strings to Text and non-iterables to arrays.\r\n */\r\nfunction normalize(nodes) {\r\n    // Separate condition because string is iterable.\r\n    if (typeof nodes == 'string') {\r\n        return [new Text(nodes)];\r\n    }\r\n    if (!isIterable(nodes)) {\r\n        nodes = [nodes];\r\n    }\r\n    // Array.from to enable .map() on non-arrays.\r\n    return Array.from(nodes)\r\n        .map(node => {\r\n        if (typeof node == 'string') {\r\n            return new Text(node);\r\n        }\r\n        if (node instanceof TextProxy) {\r\n            return new Text(node.data, node.getAttributes());\r\n        }\r\n        return node;\r\n    });\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/treewalker\r\n */\r\nimport Element from './element';\r\nimport { default as Position, getTextNodeAtPosition, getNodeAfterPosition, getNodeBeforePosition } from './position';\r\nimport Text from './text';\r\nimport TextProxy from './textproxy';\r\nimport { CKEditorError } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Position iterator class. It allows to iterate forward and backward over the document.\r\n */\r\nexport default class TreeWalker {\r\n    /**\r\n     * Creates a range iterator. All parameters are optional, but you have to specify either `boundaries` or `startPosition`.\r\n     *\r\n     * @param options Object with configuration.\r\n     */\r\n    constructor(options) {\r\n        if (!options || (!options.boundaries && !options.startPosition)) {\r\n            /**\r\n             * Neither boundaries nor starting position of a `TreeWalker` have been defined.\r\n             *\r\n             * @error model-tree-walker-no-start-position\r\n             */\r\n            throw new CKEditorError('model-tree-walker-no-start-position', null);\r\n        }\r\n        const direction = options.direction || 'forward';\r\n        if (direction != 'forward' && direction != 'backward') {\r\n            /**\r\n             * Only `backward` and `forward` direction allowed.\r\n             *\r\n             * @error model-tree-walker-unknown-direction\r\n             */\r\n            throw new CKEditorError('model-tree-walker-unknown-direction', options, { direction });\r\n        }\r\n        this.direction = direction;\r\n        this.boundaries = options.boundaries || null;\r\n        if (options.startPosition) {\r\n            this._position = options.startPosition.clone();\r\n        }\r\n        else {\r\n            this._position = Position._createAt(this.boundaries[this.direction == 'backward' ? 'end' : 'start']);\r\n        }\r\n        // Reset position stickiness in case it was set to other value, as the stickiness is kept after cloning.\r\n        this.position.stickiness = 'toNone';\r\n        this.singleCharacters = !!options.singleCharacters;\r\n        this.shallow = !!options.shallow;\r\n        this.ignoreElementEnd = !!options.ignoreElementEnd;\r\n        this._boundaryStartParent = this.boundaries ? this.boundaries.start.parent : null;\r\n        this._boundaryEndParent = this.boundaries ? this.boundaries.end.parent : null;\r\n        this._visitedParent = this.position.parent;\r\n    }\r\n    /**\r\n     * Iterable interface.\r\n     *\r\n     * @returns {Iterable.<module:engine/model/treewalker~TreeWalkerValue>}\r\n     */\r\n    [Symbol.iterator]() {\r\n        return this;\r\n    }\r\n    /**\r\n     * Iterator position. This is always static position, even if the initial position was a\r\n     * {@link module:engine/model/liveposition~LivePosition live position}. If start position is not defined then position depends\r\n     * on {@link #direction}. If direction is `'forward'` position starts form the beginning, when direction\r\n     * is `'backward'` position starts from the end.\r\n     */\r\n    get position() {\r\n        return this._position;\r\n    }\r\n    /**\r\n     * Moves {@link #position} in the {@link #direction} skipping values as long as the callback function returns `true`.\r\n     *\r\n     * For example:\r\n     *\r\n     * ```ts\r\n     * walker.skip( value => value.type == 'text' ); // <paragraph>[]foo</paragraph> -> <paragraph>foo[]</paragraph>\r\n     * walker.skip( () => true ); // Move the position to the end: <paragraph>[]foo</paragraph> -> <paragraph>foo</paragraph>[]\r\n     * walker.skip( () => false ); // Do not move the position.\r\n     * ```\r\n     *\r\n     * @param skip Callback function. Gets {@link module:engine/model/treewalker~TreeWalkerValue} and should\r\n     * return `true` if the value should be skipped or `false` if not.\r\n     */\r\n    skip(skip) {\r\n        let done, value, prevPosition, prevVisitedParent;\r\n        do {\r\n            prevPosition = this.position;\r\n            prevVisitedParent = this._visitedParent;\r\n            ({ done, value } = this.next());\r\n        } while (!done && skip(value));\r\n        if (!done) {\r\n            this._position = prevPosition;\r\n            this._visitedParent = prevVisitedParent;\r\n        }\r\n    }\r\n    /**\r\n     * Gets the next tree walker's value.\r\n     */\r\n    next() {\r\n        if (this.direction == 'forward') {\r\n            return this._next();\r\n        }\r\n        else {\r\n            return this._previous();\r\n        }\r\n    }\r\n    /**\r\n     * Makes a step forward in model. Moves the {@link #position} to the next position and returns the encountered value.\r\n     */\r\n    _next() {\r\n        const previousPosition = this.position;\r\n        const position = this.position.clone();\r\n        const parent = this._visitedParent;\r\n        // We are at the end of the root.\r\n        if (parent.parent === null && position.offset === parent.maxOffset) {\r\n            return { done: true, value: undefined };\r\n        }\r\n        // We reached the walker boundary.\r\n        if (parent === this._boundaryEndParent && position.offset == this.boundaries.end.offset) {\r\n            return { done: true, value: undefined };\r\n        }\r\n        // Get node just after the current position.\r\n        // Use a highly optimized version instead of checking the text node first and then getting the node after. See #6582.\r\n        const textNodeAtPosition = getTextNodeAtPosition(position, parent);\r\n        const node = textNodeAtPosition || getNodeAfterPosition(position, parent, textNodeAtPosition);\r\n        if (node instanceof Element) {\r\n            if (!this.shallow) {\r\n                // Manual operations on path internals for optimization purposes. Here and in the rest of the method.\r\n                position.path.push(0);\r\n                this._visitedParent = node;\r\n            }\r\n            else {\r\n                // We are past the walker boundaries.\r\n                if (this.boundaries && this.boundaries.end.isBefore(position)) {\r\n                    return { done: true, value: undefined };\r\n                }\r\n                position.offset++;\r\n            }\r\n            this._position = position;\r\n            return formatReturnValue('elementStart', node, previousPosition, position, 1);\r\n        }\r\n        if (node instanceof Text) {\r\n            let charactersCount;\r\n            if (this.singleCharacters) {\r\n                charactersCount = 1;\r\n            }\r\n            else {\r\n                let offset = node.endOffset;\r\n                if (this._boundaryEndParent == parent && this.boundaries.end.offset < offset) {\r\n                    offset = this.boundaries.end.offset;\r\n                }\r\n                charactersCount = offset - position.offset;\r\n            }\r\n            const offsetInTextNode = position.offset - node.startOffset;\r\n            const item = new TextProxy(node, offsetInTextNode, charactersCount);\r\n            position.offset += charactersCount;\r\n            this._position = position;\r\n            return formatReturnValue('text', item, previousPosition, position, charactersCount);\r\n        }\r\n        // `node` is not set, we reached the end of current `parent`.\r\n        position.path.pop();\r\n        position.offset++;\r\n        this._position = position;\r\n        this._visitedParent = parent.parent;\r\n        if (this.ignoreElementEnd) {\r\n            return this._next();\r\n        }\r\n        return formatReturnValue('elementEnd', parent, previousPosition, position);\r\n    }\r\n    /**\r\n     * Makes a step backward in model. Moves the {@link #position} to the previous position and returns the encountered value.\r\n     */\r\n    _previous() {\r\n        const previousPosition = this.position;\r\n        const position = this.position.clone();\r\n        const parent = this._visitedParent;\r\n        // We are at the beginning of the root.\r\n        if (parent.parent === null && position.offset === 0) {\r\n            return { done: true, value: undefined };\r\n        }\r\n        // We reached the walker boundary.\r\n        if (parent == this._boundaryStartParent && position.offset == this.boundaries.start.offset) {\r\n            return { done: true, value: undefined };\r\n        }\r\n        // Get node just before the current position.\r\n        // Use a highly optimized version instead of checking the text node first and then getting the node before. See #6582.\r\n        const positionParent = position.parent;\r\n        const textNodeAtPosition = getTextNodeAtPosition(position, positionParent);\r\n        const node = textNodeAtPosition || getNodeBeforePosition(position, positionParent, textNodeAtPosition);\r\n        if (node instanceof Element) {\r\n            position.offset--;\r\n            if (this.shallow) {\r\n                this._position = position;\r\n                return formatReturnValue('elementStart', node, previousPosition, position, 1);\r\n            }\r\n            position.path.push(node.maxOffset);\r\n            this._position = position;\r\n            this._visitedParent = node;\r\n            if (this.ignoreElementEnd) {\r\n                return this._previous();\r\n            }\r\n            return formatReturnValue('elementEnd', node, previousPosition, position);\r\n        }\r\n        if (node instanceof Text) {\r\n            let charactersCount;\r\n            if (this.singleCharacters) {\r\n                charactersCount = 1;\r\n            }\r\n            else {\r\n                let offset = node.startOffset;\r\n                if (this._boundaryStartParent == parent && this.boundaries.start.offset > offset) {\r\n                    offset = this.boundaries.start.offset;\r\n                }\r\n                charactersCount = position.offset - offset;\r\n            }\r\n            const offsetInTextNode = position.offset - node.startOffset;\r\n            const item = new TextProxy(node, offsetInTextNode - charactersCount, charactersCount);\r\n            position.offset -= charactersCount;\r\n            this._position = position;\r\n            return formatReturnValue('text', item, previousPosition, position, charactersCount);\r\n        }\r\n        // `node` is not set, we reached the beginning of current `parent`.\r\n        position.path.pop();\r\n        this._position = position;\r\n        this._visitedParent = parent.parent;\r\n        return formatReturnValue('elementStart', parent, previousPosition, position, 1);\r\n    }\r\n}\r\nfunction formatReturnValue(type, item, previousPosition, nextPosition, length) {\r\n    return {\r\n        done: false,\r\n        value: {\r\n            type,\r\n            item,\r\n            previousPosition,\r\n            nextPosition,\r\n            length\r\n        }\r\n    };\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/position\r\n */\r\nimport TypeCheckable from './typecheckable';\r\nimport TreeWalker from './treewalker';\r\nimport { CKEditorError, compareArrays } from '@ckeditor/ckeditor5-utils';\r\n// To check if component is loaded more than once.\r\nimport '@ckeditor/ckeditor5-utils/src/version';\r\n/**\r\n * Represents a position in the model tree.\r\n *\r\n * A position is represented by its {@link module:engine/model/position~Position#root} and\r\n * a {@link module:engine/model/position~Position#path} in that root.\r\n *\r\n * You can create position instances via its constructor or the `createPosition*()` factory methods of\r\n * {@link module:engine/model/model~Model} and {@link module:engine/model/writer~Writer}.\r\n *\r\n * **Note:** Position is based on offsets, not indexes. This means that a position between two text nodes\r\n * `foo` and `bar` has offset `3`, not `1`. See {@link module:engine/model/position~Position#path} for more information.\r\n *\r\n * Since a position in the model is represented by a {@link module:engine/model/position~Position#root position root} and\r\n * {@link module:engine/model/position~Position#path position path} it is possible to create positions placed in non-existing places.\r\n * This requirement is important for operational transformation algorithms.\r\n *\r\n * Also, {@link module:engine/model/operation/operation~Operation operations}\r\n * kept in the {@link module:engine/model/document~Document#history document history}\r\n * are storing positions (and ranges) which were correct when those operations were applied, but may not be correct\r\n * after the document has changed.\r\n *\r\n * When changes are applied to the model, it may also happen that {@link module:engine/model/position~Position#parent position parent}\r\n * will change even if position path has not changed. Keep in mind, that if a position leads to non-existing element,\r\n * {@link module:engine/model/position~Position#parent} and some other properties and methods will throw errors.\r\n *\r\n * In most cases, position with wrong path is caused by an error in code, but it is sometimes needed, as described above.\r\n */\r\nexport default class Position extends TypeCheckable {\r\n    /**\r\n     * Creates a position.\r\n     *\r\n     * @param root Root of the position.\r\n     * @param path Position path. See {@link module:engine/model/position~Position#path}.\r\n     * @param stickiness Position stickiness. See {@link module:engine/model/position~PositionStickiness}.\r\n     */\r\n    constructor(root, path, stickiness = 'toNone') {\r\n        super();\r\n        if (!root.is('element') && !root.is('documentFragment')) {\r\n            /**\r\n             * Position root is invalid.\r\n             *\r\n             * Positions can only be anchored in elements or document fragments.\r\n             *\r\n             * @error model-position-root-invalid\r\n             */\r\n            throw new CKEditorError('model-position-root-invalid', root);\r\n        }\r\n        if (!(path instanceof Array) || path.length === 0) {\r\n            /**\r\n             * Position path must be an array with at least one item.\r\n             *\r\n             * @error model-position-path-incorrect-format\r\n             * @param path\r\n             */\r\n            throw new CKEditorError('model-position-path-incorrect-format', root, { path });\r\n        }\r\n        // Normalize the root and path when element (not root) is passed.\r\n        if (root.is('rootElement')) {\r\n            path = path.slice();\r\n        }\r\n        else {\r\n            path = [...root.getPath(), ...path];\r\n            root = root.root;\r\n        }\r\n        this.root = root;\r\n        this.path = path;\r\n        this.stickiness = stickiness;\r\n    }\r\n    /**\r\n     * Offset at which this position is located in its {@link module:engine/model/position~Position#parent parent}. It is equal\r\n     * to the last item in position {@link module:engine/model/position~Position#path path}.\r\n     *\r\n     * @type {Number}\r\n     */\r\n    get offset() {\r\n        return this.path[this.path.length - 1];\r\n    }\r\n    set offset(newOffset) {\r\n        this.path[this.path.length - 1] = newOffset;\r\n    }\r\n    /**\r\n     * Parent element of this position.\r\n     *\r\n     * Keep in mind that `parent` value is calculated when the property is accessed.\r\n     * If {@link module:engine/model/position~Position#path position path}\r\n     * leads to a non-existing element, `parent` property will throw error.\r\n     *\r\n     * Also it is a good idea to cache `parent` property if it is used frequently in an algorithm (i.e. in a long loop).\r\n     */\r\n    get parent() {\r\n        let parent = this.root;\r\n        for (let i = 0; i < this.path.length - 1; i++) {\r\n            parent = parent.getChild(parent.offsetToIndex(this.path[i]));\r\n            if (!parent) {\r\n                /**\r\n                 * The position's path is incorrect. This means that a position does not point to\r\n                 * a correct place in the tree and hence, some of its methods and getters cannot work correctly.\r\n                 *\r\n                 * **Note**: Unlike DOM and view positions, in the model, the\r\n                 * {@link module:engine/model/position~Position#parent position's parent} is always an element or a document fragment.\r\n                 * The last offset in the {@link module:engine/model/position~Position#path position's path} is the point in this element\r\n                 * where this position points.\r\n                 *\r\n                 * Read more about model positions and offsets in\r\n                 * the {@glink framework/architecture/editing-engine#indexes-and-offsets Editing engine architecture} guide.\r\n                 *\r\n                 * @error model-position-path-incorrect\r\n                 * @param position The incorrect position.\r\n                 */\r\n                throw new CKEditorError('model-position-path-incorrect', this, { position: this });\r\n            }\r\n        }\r\n        if (parent.is('$text')) {\r\n            throw new CKEditorError('model-position-path-incorrect', this, { position: this });\r\n        }\r\n        return parent;\r\n    }\r\n    /**\r\n     * Position {@link module:engine/model/position~Position#offset offset} converted to an index in position's parent node. It is\r\n     * equal to the {@link module:engine/model/node~Node#index index} of a node after this position. If position is placed\r\n     * in text node, position index is equal to the index of that text node.\r\n     */\r\n    get index() {\r\n        return this.parent.offsetToIndex(this.offset);\r\n    }\r\n    /**\r\n     * Returns {@link module:engine/model/text~Text text node} instance in which this position is placed or `null` if this\r\n     * position is not in a text node.\r\n     */\r\n    get textNode() {\r\n        return getTextNodeAtPosition(this, this.parent);\r\n    }\r\n    /**\r\n     * Node directly after this position or `null` if this position is in text node.\r\n     */\r\n    get nodeAfter() {\r\n        // Cache the parent and reuse for performance reasons. See #6579 and #6582.\r\n        const parent = this.parent;\r\n        return getNodeAfterPosition(this, parent, getTextNodeAtPosition(this, parent));\r\n    }\r\n    /**\r\n     * Node directly before this position or `null` if this position is in text node.\r\n     */\r\n    get nodeBefore() {\r\n        // Cache the parent and reuse for performance reasons. See #6579 and #6582.\r\n        const parent = this.parent;\r\n        return getNodeBeforePosition(this, parent, getTextNodeAtPosition(this, parent));\r\n    }\r\n    /**\r\n     * Is `true` if position is at the beginning of its {@link module:engine/model/position~Position#parent parent}, `false` otherwise.\r\n     */\r\n    get isAtStart() {\r\n        return this.offset === 0;\r\n    }\r\n    /**\r\n     * Is `true` if position is at the end of its {@link module:engine/model/position~Position#parent parent}, `false` otherwise.\r\n     */\r\n    get isAtEnd() {\r\n        return this.offset == this.parent.maxOffset;\r\n    }\r\n    /**\r\n     * Checks whether this position is before or after given position.\r\n     *\r\n     * This method is safe to use it on non-existing positions (for example during operational transformation).\r\n     */\r\n    compareWith(otherPosition) {\r\n        if (this.root != otherPosition.root) {\r\n            return 'different';\r\n        }\r\n        const result = compareArrays(this.path, otherPosition.path);\r\n        switch (result) {\r\n            case 'same':\r\n                return 'same';\r\n            case 'prefix':\r\n                return 'before';\r\n            case 'extension':\r\n                return 'after';\r\n            default:\r\n                return this.path[result] < otherPosition.path[result] ? 'before' : 'after';\r\n        }\r\n    }\r\n    /**\r\n     * Gets the farthest position which matches the callback using\r\n     * {@link module:engine/model/treewalker~TreeWalker TreeWalker}.\r\n     *\r\n     * For example:\r\n     *\r\n     * ```ts\r\n     * getLastMatchingPosition( value => value.type == 'text' );\r\n     * // <paragraph>[]foo</paragraph> -> <paragraph>foo[]</paragraph>\r\n     *\r\n     * getLastMatchingPosition( value => value.type == 'text', { direction: 'backward' } );\r\n     * // <paragraph>foo[]</paragraph> -> <paragraph>[]foo</paragraph>\r\n     *\r\n     * getLastMatchingPosition( value => false );\r\n     * // Do not move the position.\r\n     * ```\r\n     *\r\n     * @param skip Callback function. Gets {@link module:engine/model/treewalker~TreeWalkerValue} and should\r\n     * return `true` if the value should be skipped or `false` if not.\r\n     * @param options Object with configuration options. See {@link module:engine/model/treewalker~TreeWalker}.\r\n     *\r\n     * @returns The position after the last item which matches the `skip` callback test.\r\n     */\r\n    getLastMatchingPosition(skip, options = {}) {\r\n        options.startPosition = this;\r\n        const treeWalker = new TreeWalker(options);\r\n        treeWalker.skip(skip);\r\n        return treeWalker.position;\r\n    }\r\n    /**\r\n     * Returns a path to this position's parent. Parent path is equal to position {@link module:engine/model/position~Position#path path}\r\n     * but without the last item.\r\n     *\r\n     * This method is safe to use it on non-existing positions (for example during operational transformation).\r\n     *\r\n     * @returns Path to the parent.\r\n     */\r\n    getParentPath() {\r\n        return this.path.slice(0, -1);\r\n    }\r\n    /**\r\n     * Returns ancestors array of this position, that is this position's parent and its ancestors.\r\n     *\r\n     * @returns Array with ancestors.\r\n     */\r\n    getAncestors() {\r\n        const parent = this.parent;\r\n        if (parent.is('documentFragment')) {\r\n            return [parent];\r\n        }\r\n        else {\r\n            return parent.getAncestors({ includeSelf: true });\r\n        }\r\n    }\r\n    /**\r\n     * Returns the parent element of the given name. Returns null if the position is not inside the desired parent.\r\n     *\r\n     * @param parentName The name of the parent element to find.\r\n     */\r\n    findAncestor(parentName) {\r\n        const parent = this.parent;\r\n        if (parent.is('element')) {\r\n            return parent.findAncestor(parentName, { includeSelf: true });\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Returns the slice of two position {@link #path paths} which is identical. The {@link #root roots}\r\n     * of these two paths must be identical.\r\n     *\r\n     * This method is safe to use it on non-existing positions (for example during operational transformation).\r\n     *\r\n     * @param position The second position.\r\n     * @returns The common path.\r\n     */\r\n    getCommonPath(position) {\r\n        if (this.root != position.root) {\r\n            return [];\r\n        }\r\n        // We find on which tree-level start and end have the lowest common ancestor\r\n        const cmp = compareArrays(this.path, position.path);\r\n        // If comparison returned string it means that arrays are same.\r\n        const diffAt = (typeof cmp == 'string') ? Math.min(this.path.length, position.path.length) : cmp;\r\n        return this.path.slice(0, diffAt);\r\n    }\r\n    /**\r\n     * Returns an {@link module:engine/model/element~Element} or {@link module:engine/model/documentfragment~DocumentFragment}\r\n     * which is a common ancestor of both positions. The {@link #root roots} of these two positions must be identical.\r\n     *\r\n     * @param position The second position.\r\n     */\r\n    getCommonAncestor(position) {\r\n        const ancestorsA = this.getAncestors();\r\n        const ancestorsB = position.getAncestors();\r\n        let i = 0;\r\n        while (ancestorsA[i] == ancestorsB[i] && ancestorsA[i]) {\r\n            i++;\r\n        }\r\n        return i === 0 ? null : ancestorsA[i - 1];\r\n    }\r\n    /**\r\n     * Returns a new instance of `Position`, that has same {@link #parent parent} but it's offset\r\n     * is shifted by `shift` value (can be a negative value).\r\n     *\r\n     * This method is safe to use it on non-existing positions (for example during operational transformation).\r\n     *\r\n     * @param shift Offset shift. Can be a negative value.\r\n     * @returns Shifted position.\r\n     */\r\n    getShiftedBy(shift) {\r\n        const shifted = this.clone();\r\n        const offset = shifted.offset + shift;\r\n        shifted.offset = offset < 0 ? 0 : offset;\r\n        return shifted;\r\n    }\r\n    /**\r\n     * Checks whether this position is after given position.\r\n     *\r\n     * This method is safe to use it on non-existing positions (for example during operational transformation).\r\n     *\r\n     * @see module:engine/model/position~Position#isBefore\r\n     * @param  otherPosition Position to compare with.\r\n     * @returns True if this position is after given position.\r\n     */\r\n    isAfter(otherPosition) {\r\n        return this.compareWith(otherPosition) == 'after';\r\n    }\r\n    /**\r\n     * Checks whether this position is before given position.\r\n     *\r\n     * **Note:** watch out when using negation of the value returned by this method, because the negation will also\r\n     * be `true` if positions are in different roots and you might not expect this. You should probably use\r\n     * `a.isAfter( b ) || a.isEqual( b )` or `!a.isBefore( p ) && a.root == b.root` in most scenarios. If your\r\n     * condition uses multiple `isAfter` and `isBefore` checks, build them so they do not use negated values, i.e.:\r\n     *\r\n     * ```ts\r\n     * if ( a.isBefore( b ) && c.isAfter( d ) ) {\r\n     * \t// do A.\r\n     * } else {\r\n     * \t// do B.\r\n     * }\r\n     * ```\r\n     *\r\n     * or, if you have only one if-branch:\r\n     *\r\n     * ```ts\r\n     * if ( !( a.isBefore( b ) && c.isAfter( d ) ) {\r\n     * \t// do B.\r\n     * }\r\n     * ```\r\n     *\r\n     * rather than:\r\n     *\r\n     * ```ts\r\n     * if ( !a.isBefore( b ) || && !c.isAfter( d ) ) {\r\n     * \t// do B.\r\n     * } else {\r\n     * \t// do A.\r\n     * }\r\n     * ```\r\n     *\r\n     * This method is safe to use it on non-existing positions (for example during operational transformation).\r\n     *\r\n     * @param otherPosition Position to compare with.\r\n     * @returns True if this position is before given position.\r\n     */\r\n    isBefore(otherPosition) {\r\n        return this.compareWith(otherPosition) == 'before';\r\n    }\r\n    /**\r\n     * Checks whether this position is equal to given position.\r\n     *\r\n     * This method is safe to use it on non-existing positions (for example during operational transformation).\r\n     *\r\n     * @param otherPosition Position to compare with.\r\n     * @returns True if positions are same.\r\n     */\r\n    isEqual(otherPosition) {\r\n        return this.compareWith(otherPosition) == 'same';\r\n    }\r\n    /**\r\n     * Checks whether this position is touching given position. Positions touch when there are no text nodes\r\n     * or empty nodes in a range between them. Technically, those positions are not equal but in many cases\r\n     * they are very similar or even indistinguishable.\r\n     *\r\n     * @param otherPosition Position to compare with.\r\n     * @returns True if positions touch.\r\n     */\r\n    isTouching(otherPosition) {\r\n        if (this.root !== otherPosition.root) {\r\n            return false;\r\n        }\r\n        const commonLevel = Math.min(this.path.length, otherPosition.path.length);\r\n        for (let level = 0; level < commonLevel; level++) {\r\n            const diff = this.path[level] - otherPosition.path[level];\r\n            // Positions are spread by a node, so they are not touching.\r\n            if (diff < -1 || diff > 1) {\r\n                return false;\r\n            }\r\n            else if (diff === 1) {\r\n                // `otherPosition` is on the left.\r\n                // `this` is on the right.\r\n                return checkTouchingBranch(otherPosition, this, level);\r\n            }\r\n            else if (diff === -1) {\r\n                // `this` is on the left.\r\n                // `otherPosition` is on the right.\r\n                return checkTouchingBranch(this, otherPosition, level);\r\n            }\r\n            // `diff === 0`.\r\n            // Positions are inside the same element on this level, compare deeper.\r\n        }\r\n        // If we ended up here, it means that positions paths have the same beginning.\r\n        // If the paths have the same length, then it means that they are identical, so the positions are same.\r\n        if (this.path.length === otherPosition.path.length) {\r\n            return true;\r\n        }\r\n        // If positions have different length of paths, then the common part is the same.\r\n        // In this case, the \"shorter\" position is on the left, the \"longer\" position is on the right.\r\n        //\r\n        // If the positions are touching, the \"longer\" position must have only zeroes. For example:\r\n        // [ 1, 2 ] vs [ 1, 2, 0 ]\r\n        // [ 1, 2 ] vs [ 1, 2, 0, 0, 0 ]\r\n        else if (this.path.length > otherPosition.path.length) {\r\n            return checkOnlyZeroes(this.path, commonLevel);\r\n        }\r\n        else {\r\n            return checkOnlyZeroes(otherPosition.path, commonLevel);\r\n        }\r\n    }\r\n    /**\r\n     * Checks if two positions are in the same parent.\r\n     *\r\n     * This method is safe to use it on non-existing positions (for example during operational transformation).\r\n     *\r\n     * @param position Position to compare with.\r\n     * @returns `true` if positions have the same parent, `false` otherwise.\r\n     */\r\n    hasSameParentAs(position) {\r\n        if (this.root !== position.root) {\r\n            return false;\r\n        }\r\n        const thisParentPath = this.getParentPath();\r\n        const posParentPath = position.getParentPath();\r\n        return compareArrays(thisParentPath, posParentPath) == 'same';\r\n    }\r\n    /**\r\n     * Returns a copy of this position that is transformed by given `operation`.\r\n     *\r\n     * The new position's parameters are updated accordingly to the effect of the `operation`.\r\n     *\r\n     * For example, if `n` nodes are inserted before the position, the returned position {@link ~Position#offset} will be\r\n     * increased by `n`. If the position was in a merged element, it will be accordingly moved to the new element, etc.\r\n     *\r\n     * This method is safe to use it on non-existing positions (for example during operational transformation).\r\n     *\r\n     * @param operation Operation to transform by.\r\n     * @returns Transformed position.\r\n     */\r\n    getTransformedByOperation(operation) {\r\n        let result;\r\n        switch (operation.type) {\r\n            case 'insert':\r\n                result = this._getTransformedByInsertOperation(operation);\r\n                break;\r\n            case 'move':\r\n            case 'remove':\r\n            case 'reinsert':\r\n                result = this._getTransformedByMoveOperation(operation);\r\n                break;\r\n            case 'split':\r\n                result = this._getTransformedBySplitOperation(operation);\r\n                break;\r\n            case 'merge':\r\n                result = this._getTransformedByMergeOperation(operation);\r\n                break;\r\n            default:\r\n                result = Position._createAt(this);\r\n                break;\r\n        }\r\n        return result;\r\n    }\r\n    /**\r\n     * Returns a copy of this position transformed by an insert operation.\r\n     *\r\n     * @internal\r\n     */\r\n    _getTransformedByInsertOperation(operation) {\r\n        return this._getTransformedByInsertion(operation.position, operation.howMany);\r\n    }\r\n    /**\r\n     * Returns a copy of this position transformed by a move operation.\r\n     *\r\n     * @internal\r\n     */\r\n    _getTransformedByMoveOperation(operation) {\r\n        return this._getTransformedByMove(operation.sourcePosition, operation.targetPosition, operation.howMany);\r\n    }\r\n    /**\r\n     * Returns a copy of this position transformed by a split operation.\r\n     *\r\n     * @internal\r\n     */\r\n    _getTransformedBySplitOperation(operation) {\r\n        const movedRange = operation.movedRange;\r\n        const isContained = movedRange.containsPosition(this) ||\r\n            (movedRange.start.isEqual(this) && this.stickiness == 'toNext');\r\n        if (isContained) {\r\n            return this._getCombined(operation.splitPosition, operation.moveTargetPosition);\r\n        }\r\n        else {\r\n            if (operation.graveyardPosition) {\r\n                return this._getTransformedByMove(operation.graveyardPosition, operation.insertionPosition, 1);\r\n            }\r\n            else {\r\n                return this._getTransformedByInsertion(operation.insertionPosition, 1);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Returns a copy of this position transformed by merge operation.\r\n     *\r\n     * @internal\r\n     */\r\n    _getTransformedByMergeOperation(operation) {\r\n        const movedRange = operation.movedRange;\r\n        const isContained = movedRange.containsPosition(this) || movedRange.start.isEqual(this);\r\n        let pos;\r\n        if (isContained) {\r\n            pos = this._getCombined(operation.sourcePosition, operation.targetPosition);\r\n            if (operation.sourcePosition.isBefore(operation.targetPosition)) {\r\n                // Above happens during OT when the merged element is moved before the merged-to element.\r\n                pos = pos._getTransformedByDeletion(operation.deletionPosition, 1);\r\n            }\r\n        }\r\n        else if (this.isEqual(operation.deletionPosition)) {\r\n            pos = Position._createAt(operation.deletionPosition);\r\n        }\r\n        else {\r\n            pos = this._getTransformedByMove(operation.deletionPosition, operation.graveyardPosition, 1);\r\n        }\r\n        return pos;\r\n    }\r\n    /**\r\n     * Returns a copy of this position that is updated by removing `howMany` nodes starting from `deletePosition`.\r\n     * It may happen that this position is in a removed node. If that is the case, `null` is returned instead.\r\n     *\r\n     * @internal\r\n     * @param deletePosition Position before the first removed node.\r\n     * @param howMany How many nodes are removed.\r\n     * @returns Transformed position or `null`.\r\n     */\r\n    _getTransformedByDeletion(deletePosition, howMany) {\r\n        const transformed = Position._createAt(this);\r\n        // This position can't be affected if deletion was in a different root.\r\n        if (this.root != deletePosition.root) {\r\n            return transformed;\r\n        }\r\n        if (compareArrays(deletePosition.getParentPath(), this.getParentPath()) == 'same') {\r\n            // If nodes are removed from the node that is pointed by this position...\r\n            if (deletePosition.offset < this.offset) {\r\n                // And are removed from before an offset of that position...\r\n                if (deletePosition.offset + howMany > this.offset) {\r\n                    // Position is in removed range, it's no longer in the tree.\r\n                    return null;\r\n                }\r\n                else {\r\n                    // Decrement the offset accordingly.\r\n                    transformed.offset -= howMany;\r\n                }\r\n            }\r\n        }\r\n        else if (compareArrays(deletePosition.getParentPath(), this.getParentPath()) == 'prefix') {\r\n            // If nodes are removed from a node that is on a path to this position...\r\n            const i = deletePosition.path.length - 1;\r\n            if (deletePosition.offset <= this.path[i]) {\r\n                // And are removed from before next node of that path...\r\n                if (deletePosition.offset + howMany > this.path[i]) {\r\n                    // If the next node of that path is removed return null\r\n                    // because the node containing this position got removed.\r\n                    return null;\r\n                }\r\n                else {\r\n                    // Otherwise, decrement index on that path.\r\n                    transformed.path[i] -= howMany;\r\n                }\r\n            }\r\n        }\r\n        return transformed;\r\n    }\r\n    /**\r\n     * Returns a copy of this position that is updated by inserting `howMany` nodes at `insertPosition`.\r\n     *\r\n     * @internal\r\n     * @param insertPosition Position where nodes are inserted.\r\n     * @param howMany How many nodes are inserted.\r\n     * @returns Transformed position.\r\n     */\r\n    _getTransformedByInsertion(insertPosition, howMany) {\r\n        const transformed = Position._createAt(this);\r\n        // This position can't be affected if insertion was in a different root.\r\n        if (this.root != insertPosition.root) {\r\n            return transformed;\r\n        }\r\n        if (compareArrays(insertPosition.getParentPath(), this.getParentPath()) == 'same') {\r\n            // If nodes are inserted in the node that is pointed by this position...\r\n            if (insertPosition.offset < this.offset || (insertPosition.offset == this.offset && this.stickiness != 'toPrevious')) {\r\n                // And are inserted before an offset of that position...\r\n                // \"Push\" this positions offset.\r\n                transformed.offset += howMany;\r\n            }\r\n        }\r\n        else if (compareArrays(insertPosition.getParentPath(), this.getParentPath()) == 'prefix') {\r\n            // If nodes are inserted in a node that is on a path to this position...\r\n            const i = insertPosition.path.length - 1;\r\n            if (insertPosition.offset <= this.path[i]) {\r\n                // And are inserted before next node of that path...\r\n                // \"Push\" the index on that path.\r\n                transformed.path[i] += howMany;\r\n            }\r\n        }\r\n        return transformed;\r\n    }\r\n    /**\r\n     * Returns a copy of this position that is updated by moving `howMany` nodes from `sourcePosition` to `targetPosition`.\r\n     *\r\n     * @internal\r\n     * @param sourcePosition Position before the first element to move.\r\n     * @param targetPosition Position where moved elements will be inserted.\r\n     * @param howMany How many consecutive nodes to move, starting from `sourcePosition`.\r\n     * @returns Transformed position.\r\n     */\r\n    _getTransformedByMove(sourcePosition, targetPosition, howMany) {\r\n        // Update target position, as it could be affected by nodes removal.\r\n        targetPosition = targetPosition._getTransformedByDeletion(sourcePosition, howMany);\r\n        if (sourcePosition.isEqual(targetPosition)) {\r\n            // If `targetPosition` is equal to `sourcePosition` this isn't really any move. Just return position as it is.\r\n            return Position._createAt(this);\r\n        }\r\n        // Moving a range removes nodes from their original position. We acknowledge this by proper transformation.\r\n        const transformed = this._getTransformedByDeletion(sourcePosition, howMany);\r\n        const isMoved = transformed === null ||\r\n            (sourcePosition.isEqual(this) && this.stickiness == 'toNext') ||\r\n            (sourcePosition.getShiftedBy(howMany).isEqual(this) && this.stickiness == 'toPrevious');\r\n        if (isMoved) {\r\n            // This position is inside moved range (or sticks to it).\r\n            // In this case, we calculate a combination of this position, move source position and target position.\r\n            return this._getCombined(sourcePosition, targetPosition);\r\n        }\r\n        else {\r\n            // This position is not inside a removed range.\r\n            //\r\n            // In next step, we simply reflect inserting `howMany` nodes, which might further affect the position.\r\n            return transformed._getTransformedByInsertion(targetPosition, howMany);\r\n        }\r\n    }\r\n    /**\r\n     * Returns a new position that is a combination of this position and given positions.\r\n     *\r\n     * The combined position is a copy of this position transformed by moving a range starting at `source` position\r\n     * to the `target` position. It is expected that this position is inside the moved range.\r\n     *\r\n     * Example:\r\n     *\r\n     * ```ts\r\n     * let original = model.createPositionFromPath( root, [ 2, 3, 1 ] );\r\n     * let source = model.createPositionFromPath( root, [ 2, 2 ] );\r\n     * let target = model.createPositionFromPath( otherRoot, [ 1, 1, 3 ] );\r\n     * original._getCombined( source, target ); // path is [ 1, 1, 4, 1 ], root is `otherRoot`\r\n     * ```\r\n     *\r\n     * Explanation:\r\n     *\r\n     * We have a position `[ 2, 3, 1 ]` and move some nodes from `[ 2, 2 ]` to `[ 1, 1, 3 ]`. The original position\r\n     * was inside moved nodes and now should point to the new place. The moved nodes will be after\r\n     * positions `[ 1, 1, 3 ]`, `[ 1, 1, 4 ]`, `[ 1, 1, 5 ]`. Since our position was in the second moved node,\r\n     * the transformed position will be in a sub-tree of a node at `[ 1, 1, 4 ]`. Looking at original path, we\r\n     * took care of `[ 2, 3 ]` part of it. Now we have to add the rest of the original path to the transformed path.\r\n     * Finally, the transformed position will point to `[ 1, 1, 4, 1 ]`.\r\n     *\r\n     * @internal\r\n     * @param source Beginning of the moved range.\r\n     * @param target Position where the range is moved.\r\n     * @returns Combined position.\r\n     */\r\n    _getCombined(source, target) {\r\n        const i = source.path.length - 1;\r\n        // The first part of a path to combined position is a path to the place where nodes were moved.\r\n        const combined = Position._createAt(target);\r\n        combined.stickiness = this.stickiness;\r\n        // Then we have to update the rest of the path.\r\n        // Fix the offset because this position might be after `from` position and we have to reflect that.\r\n        combined.offset = combined.offset + this.path[i] - source.offset;\r\n        // Then, add the rest of the path.\r\n        // If this position is at the same level as `from` position nothing will get added.\r\n        combined.path = [...combined.path, ...this.path.slice(i + 1)];\r\n        return combined;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    toJSON() {\r\n        return {\r\n            root: this.root.toJSON(),\r\n            path: Array.from(this.path),\r\n            stickiness: this.stickiness\r\n        };\r\n    }\r\n    /**\r\n     * Returns a new position that is equal to current position.\r\n     */\r\n    clone() {\r\n        return new this.constructor(this.root, this.path, this.stickiness);\r\n    }\r\n    /**\r\n     * Creates position at the given location. The location can be specified as:\r\n     *\r\n     * * a {@link module:engine/model/position~Position position},\r\n     * * parent element and offset (offset defaults to `0`),\r\n     * * parent element and `'end'` (sets position at the end of that element),\r\n     * * {@link module:engine/model/item~Item model item} and `'before'` or `'after'` (sets position before or after given model item).\r\n     *\r\n     * This method is a shortcut to other factory methods such as:\r\n     *\r\n     * * {@link module:engine/model/position~Position._createBefore},\r\n     * * {@link module:engine/model/position~Position._createAfter}.\r\n     *\r\n     * @internal\r\n     * @param offset Offset or one of the flags. Used only when the first parameter is a {@link module:engine/model/item~Item model item}.\r\n     * @param stickiness Position stickiness. Used only when the first parameter is a {@link module:engine/model/item~Item model item}.\r\n     */\r\n    static _createAt(itemOrPosition, offset, stickiness = 'toNone') {\r\n        if (itemOrPosition instanceof Position) {\r\n            return new Position(itemOrPosition.root, itemOrPosition.path, itemOrPosition.stickiness);\r\n        }\r\n        else {\r\n            const node = itemOrPosition;\r\n            if (offset == 'end') {\r\n                offset = node.maxOffset;\r\n            }\r\n            else if (offset == 'before') {\r\n                return this._createBefore(node, stickiness);\r\n            }\r\n            else if (offset == 'after') {\r\n                return this._createAfter(node, stickiness);\r\n            }\r\n            else if (offset !== 0 && !offset) {\r\n                /**\r\n                 * {@link module:engine/model/model~Model#createPositionAt `Model#createPositionAt()`}\r\n                 * requires the offset to be specified when the first parameter is a model item.\r\n                 *\r\n                 * @error model-createpositionat-offset-required\r\n                 */\r\n                throw new CKEditorError('model-createpositionat-offset-required', [this, itemOrPosition]);\r\n            }\r\n            if (!node.is('element') && !node.is('documentFragment')) {\r\n                /**\r\n                 * Position parent have to be a model element or model document fragment.\r\n                 *\r\n                 * @error model-position-parent-incorrect\r\n                 */\r\n                throw new CKEditorError('model-position-parent-incorrect', [this, itemOrPosition]);\r\n            }\r\n            const path = node.getPath();\r\n            path.push(offset);\r\n            return new this(node.root, path, stickiness);\r\n        }\r\n    }\r\n    /**\r\n     * Creates a new position, after given {@link module:engine/model/item~Item model item}.\r\n     *\r\n     * @internal\r\n     * @param item Item after which the position should be placed.\r\n     * @param stickiness Position stickiness.\r\n     */\r\n    static _createAfter(item, stickiness) {\r\n        if (!item.parent) {\r\n            /**\r\n             * You can not make a position after a root element.\r\n             *\r\n             * @error model-position-after-root\r\n             * @param root\r\n             */\r\n            throw new CKEditorError('model-position-after-root', [this, item], { root: item });\r\n        }\r\n        return this._createAt(item.parent, item.endOffset, stickiness);\r\n    }\r\n    /**\r\n     * Creates a new position, before the given {@link module:engine/model/item~Item model item}.\r\n     *\r\n     * @internal\r\n     * @param item Item before which the position should be placed.\r\n     * @param stickiness Position stickiness.\r\n     */\r\n    static _createBefore(item, stickiness) {\r\n        if (!item.parent) {\r\n            /**\r\n             * You can not make a position before a root element.\r\n             *\r\n             * @error model-position-before-root\r\n             * @param root\r\n             */\r\n            throw new CKEditorError('model-position-before-root', item, { root: item });\r\n        }\r\n        return this._createAt(item.parent, item.startOffset, stickiness);\r\n    }\r\n    /**\r\n     * Creates a `Position` instance from given plain object (i.e. parsed JSON string).\r\n     *\r\n     * @param json Plain object to be converted to `Position`.\r\n     * @param doc Document object that will be position owner.\r\n     * @returns `Position` instance created using given plain object.\r\n     */\r\n    static fromJSON(json, doc) {\r\n        if (json.root === '$graveyard') {\r\n            const pos = new Position(doc.graveyard, json.path);\r\n            pos.stickiness = json.stickiness;\r\n            return pos;\r\n        }\r\n        if (!doc.getRoot(json.root)) {\r\n            /**\r\n             * Cannot create position for document. Root with specified name does not exist.\r\n             *\r\n             * @error model-position-fromjson-no-root\r\n             * @param rootName\r\n             */\r\n            throw new CKEditorError('model-position-fromjson-no-root', doc, { rootName: json.root });\r\n        }\r\n        return new Position(doc.getRoot(json.root), json.path, json.stickiness);\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nPosition.prototype.is = function (type) {\r\n    return type === 'position' || type === 'model:position';\r\n};\r\n/**\r\n * Returns a text node at the given position.\r\n *\r\n * This is a helper function optimized to reuse the position parent instance for performance reasons.\r\n *\r\n * Normally, you should use {@link module:engine/model/position~Position#textNode `Position#textNode`}.\r\n * If you start hitting performance issues with {@link module:engine/model/position~Position#parent `Position#parent`}\r\n * check if your algorithm does not access it multiple times (which can happen directly or indirectly via other position properties).\r\n *\r\n * See https://github.com/ckeditor/ckeditor5/issues/6579.\r\n *\r\n * See also:\r\n *\r\n * * {@link module:engine/model/position~getNodeAfterPosition}\r\n * * {@link module:engine/model/position~getNodeBeforePosition}\r\n *\r\n * @param positionParent The parent of the given position.\r\n */\r\nexport function getTextNodeAtPosition(position, positionParent) {\r\n    const node = positionParent.getChild(positionParent.offsetToIndex(position.offset));\r\n    if (node && node.is('$text') && node.startOffset < position.offset) {\r\n        return node;\r\n    }\r\n    return null;\r\n}\r\n/**\r\n * Returns the node after the given position.\r\n *\r\n * This is a helper function optimized to reuse the position parent instance and the calculation of the text node at the\r\n * specific position for performance reasons.\r\n *\r\n * Normally, you should use {@link module:engine/model/position~Position#nodeAfter `Position#nodeAfter`}.\r\n * If you start hitting performance issues with {@link module:engine/model/position~Position#parent `Position#parent`} and/or\r\n * {@link module:engine/model/position~Position#textNode `Position#textNode`}\r\n * check if your algorithm does not access those properties multiple times\r\n * (which can happen directly or indirectly via other position properties).\r\n *\r\n * See https://github.com/ckeditor/ckeditor5/issues/6579 and https://github.com/ckeditor/ckeditor5/issues/6582.\r\n *\r\n * See also:\r\n *\r\n * * {@link module:engine/model/position~getTextNodeAtPosition}\r\n * * {@link module:engine/model/position~getNodeBeforePosition}\r\n *\r\n * @param positionParent The parent of the given position.\r\n * @param textNode Text node at the given position.\r\n */\r\nexport function getNodeAfterPosition(position, positionParent, textNode) {\r\n    if (textNode !== null) {\r\n        return null;\r\n    }\r\n    return positionParent.getChild(positionParent.offsetToIndex(position.offset));\r\n}\r\n/**\r\n * Returns the node before the given position.\r\n *\r\n * Refer to {@link module:engine/model/position~getNodeBeforePosition} for documentation on when to use this util method.\r\n *\r\n * See also:\r\n *\r\n * * {@link module:engine/model/position~getTextNodeAtPosition}\r\n * * {@link module:engine/model/position~getNodeAfterPosition}\r\n *\r\n * @param positionParent The parent of the given position.\r\n * @param textNode Text node at the given position.\r\n */\r\nexport function getNodeBeforePosition(position, positionParent, textNode) {\r\n    if (textNode !== null) {\r\n        return null;\r\n    }\r\n    return positionParent.getChild(positionParent.offsetToIndex(position.offset) - 1);\r\n}\r\n/**\r\n * This is a helper function for `Position#isTouching()`.\r\n *\r\n * It checks whether to given positions are touching, considering that they have the same root and paths\r\n * until given level, and at given level they differ by 1 (so they are branching at `level` point).\r\n *\r\n * The exact requirements for touching positions are described in `Position#isTouching()` and also\r\n * in the body of this function.\r\n *\r\n * @param left Position \"on the left\" (it is before `right`).\r\n * @param right Position \"on the right\" (it is after `left`).\r\n * @param level Level on which the positions are different.\r\n */\r\nfunction checkTouchingBranch(left, right, level) {\r\n    if (level + 1 === left.path.length) {\r\n        // Left position does not have any more entries after the point where the positions differ.\r\n        // [ 2 ] vs [ 3 ]\r\n        // [ 2 ] vs [ 3, 0, 0 ]\r\n        // The positions are spread by node at [ 2 ].\r\n        return false;\r\n    }\r\n    if (!checkOnlyZeroes(right.path, level + 1)) {\r\n        // Right position does not have only zeroes, so we have situation like:\r\n        // [ 2, maxOffset ] vs [ 3, 1 ]\r\n        // [ 2, maxOffset ] vs [ 3, 1, 0, 0 ]\r\n        // The positions are spread by node at [ 3, 0 ].\r\n        return false;\r\n    }\r\n    if (!checkOnlyMaxOffset(left, level + 1)) {\r\n        // Left position does not have only max offsets, so we have situation like:\r\n        // [ 2, 4 ] vs [ 3 ]\r\n        // [ 2, 4 ] vs [ 3, 0, 0 ]\r\n        // The positions are spread by node at [ 2, 5 ].\r\n        return false;\r\n    }\r\n    // Left position has only max offsets and right position has only zeroes or nothing.\r\n    // [ 2, maxOffset ] vs [ 3 ]\r\n    // [ 2, maxOffset, maxOffset ] vs [ 3, 0 ]\r\n    // There are not elements between positions. The positions are touching.\r\n    return true;\r\n}\r\n/**\r\n * Checks whether for given array, starting from given index until the end of the array, all items are `0`s.\r\n *\r\n * This is a helper function for `Position#isTouching()`.\r\n */\r\nfunction checkOnlyZeroes(arr, idx) {\r\n    while (idx < arr.length) {\r\n        if (arr[idx] !== 0) {\r\n            return false;\r\n        }\r\n        idx++;\r\n    }\r\n    return true;\r\n}\r\n/**\r\n * Checks whether for given position, starting from given path level, whether the position is at the end of\r\n * its parent and whether each element on the path to the position is also at at the end of its parent.\r\n *\r\n * This is a helper function for `Position#isTouching()`.\r\n */\r\nfunction checkOnlyMaxOffset(pos, level) {\r\n    let parent = pos.parent;\r\n    let idx = pos.path.length - 1;\r\n    let add = 0;\r\n    while (idx >= level) {\r\n        if (pos.path[idx] + add !== parent.maxOffset) {\r\n            return false;\r\n        }\r\n        // After the first check, we \"go up\", and check whether the position's parent-parent is the last element.\r\n        // However, we need to add 1 to the value in the path to \"simulate\" moving the path after the parent.\r\n        // It happens just once.\r\n        add = 1;\r\n        idx--;\r\n        parent = parent.parent;\r\n    }\r\n    return true;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/range\r\n */\r\nimport TypeCheckable from './typecheckable';\r\nimport Position from './position';\r\nimport TreeWalker from './treewalker';\r\nimport { CKEditorError, compareArrays } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Represents a range in the model tree.\r\n *\r\n * A range is defined by its {@link module:engine/model/range~Range#start} and {@link module:engine/model/range~Range#end}\r\n * positions.\r\n *\r\n * You can create range instances via its constructor or the `createRange*()` factory methods of\r\n * {@link module:engine/model/model~Model} and {@link module:engine/model/writer~Writer}.\r\n */\r\nexport default class Range extends TypeCheckable {\r\n    /**\r\n     * Creates a range spanning from `start` position to `end` position.\r\n     *\r\n     * @param start The start position.\r\n     * @param end The end position. If not set, the range will be collapsed at the `start` position.\r\n     */\r\n    constructor(start, end) {\r\n        super();\r\n        this.start = Position._createAt(start);\r\n        this.end = end ? Position._createAt(end) : Position._createAt(start);\r\n        // If the range is collapsed, treat in a similar way as a position and set its boundaries stickiness to 'toNone'.\r\n        // In other case, make the boundaries stick to the \"inside\" of the range.\r\n        this.start.stickiness = this.isCollapsed ? 'toNone' : 'toNext';\r\n        this.end.stickiness = this.isCollapsed ? 'toNone' : 'toPrevious';\r\n    }\r\n    /**\r\n     * Iterable interface.\r\n     *\r\n     * Iterates over all {@link module:engine/model/item~Item items} that are in this range and returns\r\n     * them together with additional information like length or {@link module:engine/model/position~Position positions},\r\n     * grouped as {@link module:engine/model/treewalker~TreeWalkerValue}.\r\n     * It iterates over all {@link module:engine/model/textproxy~TextProxy text contents} that are inside the range\r\n     * and all the {@link module:engine/model/element~Element}s that are entered into when iterating over this range.\r\n     *\r\n     * This iterator uses {@link module:engine/model/treewalker~TreeWalker} with `boundaries` set to this range\r\n     * and `ignoreElementEnd` option set to `true`.\r\n     */\r\n    *[Symbol.iterator]() {\r\n        yield* new TreeWalker({ boundaries: this, ignoreElementEnd: true });\r\n    }\r\n    /**\r\n     * Describes whether the range is collapsed, that is if {@link #start} and\r\n     * {@link #end} positions are equal.\r\n     */\r\n    get isCollapsed() {\r\n        return this.start.isEqual(this.end);\r\n    }\r\n    /**\r\n     * Describes whether this range is flat, that is if {@link #start} position and\r\n     * {@link #end} position are in the same {@link module:engine/model/position~Position#parent}.\r\n     */\r\n    get isFlat() {\r\n        const startParentPath = this.start.getParentPath();\r\n        const endParentPath = this.end.getParentPath();\r\n        return compareArrays(startParentPath, endParentPath) == 'same';\r\n    }\r\n    /**\r\n     * Range root element.\r\n     */\r\n    get root() {\r\n        return this.start.root;\r\n    }\r\n    /**\r\n     * Checks whether this range contains given {@link module:engine/model/position~Position position}.\r\n     *\r\n     * @param position Position to check.\r\n     * @returns `true` if given {@link module:engine/model/position~Position position} is contained\r\n     * in this range,`false` otherwise.\r\n     */\r\n    containsPosition(position) {\r\n        return position.isAfter(this.start) && position.isBefore(this.end);\r\n    }\r\n    /**\r\n     * Checks whether this range contains given {@link ~Range range}.\r\n     *\r\n     * @param otherRange Range to check.\r\n     * @param loose Whether the check is loose or strict. If the check is strict (`false`), compared range cannot\r\n     * start or end at the same position as this range boundaries. If the check is loose (`true`), compared range can start, end or\r\n     * even be equal to this range. Note that collapsed ranges are always compared in strict mode.\r\n     * @returns {Boolean} `true` if given {@link ~Range range} boundaries are contained by this range, `false` otherwise.\r\n     */\r\n    containsRange(otherRange, loose = false) {\r\n        if (otherRange.isCollapsed) {\r\n            loose = false;\r\n        }\r\n        const containsStart = this.containsPosition(otherRange.start) || (loose && this.start.isEqual(otherRange.start));\r\n        const containsEnd = this.containsPosition(otherRange.end) || (loose && this.end.isEqual(otherRange.end));\r\n        return containsStart && containsEnd;\r\n    }\r\n    /**\r\n     * Checks whether given {@link module:engine/model/item~Item} is inside this range.\r\n     */\r\n    containsItem(item) {\r\n        const pos = Position._createBefore(item);\r\n        return this.containsPosition(pos) || this.start.isEqual(pos);\r\n    }\r\n    /**\r\n     * Two ranges are equal if their {@link #start} and {@link #end} positions are equal.\r\n     *\r\n     * @param otherRange Range to compare with.\r\n     * @returns `true` if ranges are equal, `false` otherwise.\r\n     */\r\n    isEqual(otherRange) {\r\n        return this.start.isEqual(otherRange.start) && this.end.isEqual(otherRange.end);\r\n    }\r\n    /**\r\n     * Checks and returns whether this range intersects with given range.\r\n     *\r\n     * @param otherRange Range to compare with.\r\n     * @returns `true` if ranges intersect, `false` otherwise.\r\n     */\r\n    isIntersecting(otherRange) {\r\n        return this.start.isBefore(otherRange.end) && this.end.isAfter(otherRange.start);\r\n    }\r\n    /**\r\n     * Computes which part(s) of this {@link ~Range range} is not a part of given {@link ~Range range}.\r\n     * Returned array contains zero, one or two {@link ~Range ranges}.\r\n     *\r\n     * Examples:\r\n     *\r\n     * ```ts\r\n     * let range = model.createRange(\r\n     * \tmodel.createPositionFromPath( root, [ 2, 7 ] ),\r\n     * \tmodel.createPositionFromPath( root, [ 4, 0, 1 ] )\r\n     * );\r\n     * let otherRange = model.createRange( model.createPositionFromPath( root, [ 1 ] ), model.createPositionFromPath( root, [ 5 ] ) );\r\n     * let transformed = range.getDifference( otherRange );\r\n     * // transformed array has no ranges because `otherRange` contains `range`\r\n     *\r\n     * otherRange = model.createRange( model.createPositionFromPath( root, [ 1 ] ), model.createPositionFromPath( root, [ 3 ] ) );\r\n     * transformed = range.getDifference( otherRange );\r\n     * // transformed array has one range: from [ 3 ] to [ 4, 0, 1 ]\r\n     *\r\n     * otherRange = model.createRange( model.createPositionFromPath( root, [ 3 ] ), model.createPositionFromPath( root, [ 4 ] ) );\r\n     * transformed = range.getDifference( otherRange );\r\n     * // transformed array has two ranges: from [ 2, 7 ] to [ 3 ] and from [ 4 ] to [ 4, 0, 1 ]\r\n     * ```\r\n     *\r\n     * @param otherRange Range to differentiate against.\r\n     * @returns The difference between ranges.\r\n     */\r\n    getDifference(otherRange) {\r\n        const ranges = [];\r\n        if (this.isIntersecting(otherRange)) {\r\n            // Ranges intersect.\r\n            if (this.containsPosition(otherRange.start)) {\r\n                // Given range start is inside this range. This means that we have to\r\n                // add shrunken range - from the start to the middle of this range.\r\n                ranges.push(new Range(this.start, otherRange.start));\r\n            }\r\n            if (this.containsPosition(otherRange.end)) {\r\n                // Given range end is inside this range. This means that we have to\r\n                // add shrunken range - from the middle of this range to the end.\r\n                ranges.push(new Range(otherRange.end, this.end));\r\n            }\r\n        }\r\n        else {\r\n            // Ranges do not intersect, return the original range.\r\n            ranges.push(new Range(this.start, this.end));\r\n        }\r\n        return ranges;\r\n    }\r\n    /**\r\n     * Returns an intersection of this {@link ~Range range} and given {@link ~Range range}.\r\n     * Intersection is a common part of both of those ranges. If ranges has no common part, returns `null`.\r\n     *\r\n     * Examples:\r\n     *\r\n     * ```ts\r\n     * let range = model.createRange(\r\n     * \tmodel.createPositionFromPath( root, [ 2, 7 ] ),\r\n     * \tmodel.createPositionFromPath( root, [ 4, 0, 1 ] )\r\n     * );\r\n     * let otherRange = model.createRange( model.createPositionFromPath( root, [ 1 ] ), model.createPositionFromPath( root, [ 2 ] ) );\r\n     * let transformed = range.getIntersection( otherRange ); // null - ranges have no common part\r\n     *\r\n     * otherRange = model.createRange( model.createPositionFromPath( root, [ 3 ] ), model.createPositionFromPath( root, [ 5 ] ) );\r\n     * transformed = range.getIntersection( otherRange ); // range from [ 3 ] to [ 4, 0, 1 ]\r\n     * ```\r\n     *\r\n     * @param otherRange Range to check for intersection.\r\n     * @returns A common part of given ranges or `null` if ranges have no common part.\r\n     */\r\n    getIntersection(otherRange) {\r\n        if (this.isIntersecting(otherRange)) {\r\n            // Ranges intersect, so a common range will be returned.\r\n            // At most, it will be same as this range.\r\n            let commonRangeStart = this.start;\r\n            let commonRangeEnd = this.end;\r\n            if (this.containsPosition(otherRange.start)) {\r\n                // Given range start is inside this range. This means thaNt we have to\r\n                // shrink common range to the given range start.\r\n                commonRangeStart = otherRange.start;\r\n            }\r\n            if (this.containsPosition(otherRange.end)) {\r\n                // Given range end is inside this range. This means that we have to\r\n                // shrink common range to the given range end.\r\n                commonRangeEnd = otherRange.end;\r\n            }\r\n            return new Range(commonRangeStart, commonRangeEnd);\r\n        }\r\n        // Ranges do not intersect, so they do not have common part.\r\n        return null;\r\n    }\r\n    /**\r\n     * Returns a range created by joining this {@link ~Range range} with the given {@link ~Range range}.\r\n     * If ranges have no common part, returns `null`.\r\n     *\r\n     * Examples:\r\n     *\r\n     * ```ts\r\n     * let range = model.createRange(\r\n     * \tmodel.createPositionFromPath( root, [ 2, 7 ] ),\r\n     * \tmodel.createPositionFromPath( root, [ 4, 0, 1 ] )\r\n     * );\r\n     * let otherRange = model.createRange(\r\n     * \tmodel.createPositionFromPath( root, [ 1 ] ),\r\n     * \tmodel.createPositionFromPath( root, [ 2 ] )\r\n     * );\r\n     * let transformed = range.getJoined( otherRange ); // null - ranges have no common part\r\n     *\r\n     * otherRange = model.createRange(\r\n     * \tmodel.createPositionFromPath( root, [ 3 ] ),\r\n     * \tmodel.createPositionFromPath( root, [ 5 ] )\r\n     * );\r\n     * transformed = range.getJoined( otherRange ); // range from [ 2, 7 ] to [ 5 ]\r\n     * ```\r\n     *\r\n     * @param otherRange Range to be joined.\r\n     * @param loose Whether the intersection check is loose or strict. If the check is strict (`false`),\r\n     * ranges are tested for intersection or whether start/end positions are equal. If the check is loose (`true`),\r\n     * compared range is also checked if it's {@link module:engine/model/position~Position#isTouching touching} current range.\r\n     * @returns A sum of given ranges or `null` if ranges have no common part.\r\n     */\r\n    getJoined(otherRange, loose = false) {\r\n        let shouldJoin = this.isIntersecting(otherRange);\r\n        if (!shouldJoin) {\r\n            if (this.start.isBefore(otherRange.start)) {\r\n                shouldJoin = loose ? this.end.isTouching(otherRange.start) : this.end.isEqual(otherRange.start);\r\n            }\r\n            else {\r\n                shouldJoin = loose ? otherRange.end.isTouching(this.start) : otherRange.end.isEqual(this.start);\r\n            }\r\n        }\r\n        if (!shouldJoin) {\r\n            return null;\r\n        }\r\n        let startPosition = this.start;\r\n        let endPosition = this.end;\r\n        if (otherRange.start.isBefore(startPosition)) {\r\n            startPosition = otherRange.start;\r\n        }\r\n        if (otherRange.end.isAfter(endPosition)) {\r\n            endPosition = otherRange.end;\r\n        }\r\n        return new Range(startPosition, endPosition);\r\n    }\r\n    /**\r\n     * Computes and returns the smallest set of {@link #isFlat flat} ranges, that covers this range in whole.\r\n     *\r\n     * See an example of a model structure (`[` and `]` are range boundaries):\r\n     *\r\n     * ```\r\n     * root                                                            root\r\n     *  |- element DIV                         DIV             P2              P3             DIV\r\n     *  |   |- element H                   H        P1        f o o           b a r       H         P4\r\n     *  |   |   |- \"fir[st\"             fir[st     lorem                               se]cond     ipsum\r\n     *  |   |- element P1\r\n     *  |   |   |- \"lorem\"                                              ||\r\n     *  |- element P2                                                   ||\r\n     *  |   |- \"foo\"                                                    VV\r\n     *  |- element P3\r\n     *  |   |- \"bar\"                                                   root\r\n     *  |- element DIV                         DIV             [P2             P3]             DIV\r\n     *  |   |- element H                   H       [P1]       f o o           b a r        H         P4\r\n     *  |   |   |- \"se]cond\"            fir[st]    lorem                               [se]cond     ipsum\r\n     *  |   |- element P4\r\n     *  |   |   |- \"ipsum\"\r\n     * ```\r\n     *\r\n     * As it can be seen, letters contained in the range are: `stloremfoobarse`, spread across different parents.\r\n     * We are looking for minimal set of flat ranges that contains the same nodes.\r\n     *\r\n     * Minimal flat ranges for above range `( [ 0, 0, 3 ], [ 3, 0, 2 ] )` will be:\r\n     *\r\n     * ```\r\n     * ( [ 0, 0, 3 ], [ 0, 0, 5 ] ) = \"st\"\r\n     * ( [ 0, 1 ], [ 0, 2 ] ) = element P1 (\"lorem\")\r\n     * ( [ 1 ], [ 3 ] ) = element P2, element P3 (\"foobar\")\r\n     * ( [ 3, 0, 0 ], [ 3, 0, 2 ] ) = \"se\"\r\n     * ```\r\n     *\r\n     * **Note:** if an {@link module:engine/model/element~Element element} is not wholly contained in this range, it won't be returned\r\n     * in any of the returned flat ranges. See in the example how `H` elements at the beginning and at the end of the range\r\n     * were omitted. Only their parts that were wholly in the range were returned.\r\n     *\r\n     * **Note:** this method is not returning flat ranges that contain no nodes.\r\n     *\r\n     * @returns Array of flat ranges covering this range.\r\n     */\r\n    getMinimalFlatRanges() {\r\n        const ranges = [];\r\n        const diffAt = this.start.getCommonPath(this.end).length;\r\n        const pos = Position._createAt(this.start);\r\n        let posParent = pos.parent;\r\n        // Go up.\r\n        while (pos.path.length > diffAt + 1) {\r\n            const howMany = posParent.maxOffset - pos.offset;\r\n            if (howMany !== 0) {\r\n                ranges.push(new Range(pos, pos.getShiftedBy(howMany)));\r\n            }\r\n            pos.path = pos.path.slice(0, -1);\r\n            pos.offset++;\r\n            posParent = posParent.parent;\r\n        }\r\n        // Go down.\r\n        while (pos.path.length <= this.end.path.length) {\r\n            const offset = this.end.path[pos.path.length - 1];\r\n            const howMany = offset - pos.offset;\r\n            if (howMany !== 0) {\r\n                ranges.push(new Range(pos, pos.getShiftedBy(howMany)));\r\n            }\r\n            pos.offset = offset;\r\n            pos.path.push(0);\r\n        }\r\n        return ranges;\r\n    }\r\n    /**\r\n     * Creates a {@link module:engine/model/treewalker~TreeWalker TreeWalker} instance with this range as a boundary.\r\n     *\r\n     * For example, to iterate over all items in the entire document root:\r\n     *\r\n     * ```ts\r\n     * // Create a range spanning over the entire root content:\r\n     * const range = editor.model.createRangeIn( editor.model.document.getRoot() );\r\n     *\r\n     * // Iterate over all items in this range:\r\n     * for ( const value of range.getWalker() ) {\r\n     * \tconsole.log( value.item );\r\n     * }\r\n     * ```\r\n     *\r\n     * @param options Object with configuration options. See {@link module:engine/model/treewalker~TreeWalker}.\r\n     */\r\n    getWalker(options = {}) {\r\n        options.boundaries = this;\r\n        return new TreeWalker(options);\r\n    }\r\n    /**\r\n     * Returns an iterator that iterates over all {@link module:engine/model/item~Item items} that are in this range and returns\r\n     * them.\r\n     *\r\n     * This method uses {@link module:engine/model/treewalker~TreeWalker} with `boundaries` set to this range and `ignoreElementEnd` option\r\n     * set to `true`. However it returns only {@link module:engine/model/item~Item model items},\r\n     * not {@link module:engine/model/treewalker~TreeWalkerValue}.\r\n     *\r\n     * You may specify additional options for the tree walker. See {@link module:engine/model/treewalker~TreeWalker} for\r\n     * a full list of available options.\r\n     *\r\n     * @param options Object with configuration options. See {@link module:engine/model/treewalker~TreeWalker}.\r\n     */\r\n    *getItems(options = {}) {\r\n        options.boundaries = this;\r\n        options.ignoreElementEnd = true;\r\n        const treeWalker = new TreeWalker(options);\r\n        for (const value of treeWalker) {\r\n            yield value.item;\r\n        }\r\n    }\r\n    /**\r\n     * Returns an iterator that iterates over all {@link module:engine/model/position~Position positions} that are boundaries or\r\n     * contained in this range.\r\n     *\r\n     * This method uses {@link module:engine/model/treewalker~TreeWalker} with `boundaries` set to this range. However it returns only\r\n     * {@link module:engine/model/position~Position positions}, not {@link module:engine/model/treewalker~TreeWalkerValue}.\r\n     *\r\n     * You may specify additional options for the tree walker. See {@link module:engine/model/treewalker~TreeWalker} for\r\n     * a full list of available options.\r\n     *\r\n     * @param options Object with configuration options. See {@link module:engine/model/treewalker~TreeWalker}.\r\n     */\r\n    *getPositions(options = {}) {\r\n        options.boundaries = this;\r\n        const treeWalker = new TreeWalker(options);\r\n        yield treeWalker.position;\r\n        for (const value of treeWalker) {\r\n            yield value.nextPosition;\r\n        }\r\n    }\r\n    /**\r\n     * Returns a range that is a result of transforming this range by given `operation`.\r\n     *\r\n     * **Note:** transformation may break one range into multiple ranges (for example, when a part of the range is\r\n     * moved to a different part of document tree). For this reason, an array is returned by this method and it\r\n     * may contain one or more `Range` instances.\r\n     *\r\n     * @param operation Operation to transform range by.\r\n     * @returns Range which is the result of transformation.\r\n     */\r\n    getTransformedByOperation(operation) {\r\n        switch (operation.type) {\r\n            case 'insert':\r\n                return this._getTransformedByInsertOperation(operation);\r\n            case 'move':\r\n            case 'remove':\r\n            case 'reinsert':\r\n                return this._getTransformedByMoveOperation(operation);\r\n            case 'split':\r\n                return [this._getTransformedBySplitOperation(operation)];\r\n            case 'merge':\r\n                return [this._getTransformedByMergeOperation(operation)];\r\n        }\r\n        return [new Range(this.start, this.end)];\r\n    }\r\n    /**\r\n     * Returns a range that is a result of transforming this range by multiple `operations`.\r\n     *\r\n     * @see ~Range#getTransformedByOperation\r\n     * @param operations Operations to transform the range by.\r\n     * @returns Range which is the result of transformation.\r\n     */\r\n    getTransformedByOperations(operations) {\r\n        const ranges = [new Range(this.start, this.end)];\r\n        for (const operation of operations) {\r\n            for (let i = 0; i < ranges.length; i++) {\r\n                const result = ranges[i].getTransformedByOperation(operation);\r\n                ranges.splice(i, 1, ...result);\r\n                i += result.length - 1;\r\n            }\r\n        }\r\n        // It may happen that a range is split into two, and then the part of second \"piece\" is moved into first\r\n        // \"piece\". In this case we will have incorrect third range, which should not be included in the result --\r\n        // because it is already included in the first \"piece\". In this loop we are looking for all such ranges that\r\n        // are inside other ranges and we simply remove them.\r\n        for (let i = 0; i < ranges.length; i++) {\r\n            const range = ranges[i];\r\n            for (let j = i + 1; j < ranges.length; j++) {\r\n                const next = ranges[j];\r\n                if (range.containsRange(next) || next.containsRange(range) || range.isEqual(next)) {\r\n                    ranges.splice(j, 1);\r\n                }\r\n            }\r\n        }\r\n        return ranges;\r\n    }\r\n    /**\r\n     * Returns an {@link module:engine/model/element~Element} or {@link module:engine/model/documentfragment~DocumentFragment}\r\n     * which is a common ancestor of the range's both ends (in which the entire range is contained).\r\n     */\r\n    getCommonAncestor() {\r\n        return this.start.getCommonAncestor(this.end);\r\n    }\r\n    /**\r\n     * Returns an {@link module:engine/model/element~Element Element} contained by the range.\r\n     * The element will be returned when it is the **only** node within the range and **fully–contained**\r\n     * at the same time.\r\n     */\r\n    getContainedElement() {\r\n        if (this.isCollapsed) {\r\n            return null;\r\n        }\r\n        const nodeAfterStart = this.start.nodeAfter;\r\n        const nodeBeforeEnd = this.end.nodeBefore;\r\n        if (nodeAfterStart && nodeAfterStart.is('element') && nodeAfterStart === nodeBeforeEnd) {\r\n            return nodeAfterStart;\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Converts `Range` to plain object and returns it.\r\n     *\r\n     * @returns `Node` converted to plain object.\r\n     */\r\n    toJSON() {\r\n        return {\r\n            start: this.start.toJSON(),\r\n            end: this.end.toJSON()\r\n        };\r\n    }\r\n    /**\r\n     * Returns a new range that is equal to current range.\r\n     */\r\n    clone() {\r\n        return new this.constructor(this.start, this.end);\r\n    }\r\n    /**\r\n     * Returns a result of transforming a copy of this range by insert operation.\r\n     *\r\n     * One or more ranges may be returned as a result of this transformation.\r\n     *\r\n     * @internal\r\n     */\r\n    _getTransformedByInsertOperation(operation, spread = false) {\r\n        return this._getTransformedByInsertion(operation.position, operation.howMany, spread);\r\n    }\r\n    /**\r\n     * Returns a result of transforming a copy of this range by move operation.\r\n     *\r\n     * One or more ranges may be returned as a result of this transformation.\r\n     *\r\n     * @internal\r\n     */\r\n    _getTransformedByMoveOperation(operation, spread = false) {\r\n        const sourcePosition = operation.sourcePosition;\r\n        const howMany = operation.howMany;\r\n        const targetPosition = operation.targetPosition;\r\n        return this._getTransformedByMove(sourcePosition, targetPosition, howMany, spread);\r\n    }\r\n    /**\r\n     * Returns a result of transforming a copy of this range by split operation.\r\n     *\r\n     * Always one range is returned. The transformation is done in a way to not break the range.\r\n     *\r\n     * @internal\r\n     */\r\n    _getTransformedBySplitOperation(operation) {\r\n        const start = this.start._getTransformedBySplitOperation(operation);\r\n        let end = this.end._getTransformedBySplitOperation(operation);\r\n        if (this.end.isEqual(operation.insertionPosition)) {\r\n            end = this.end.getShiftedBy(1);\r\n        }\r\n        // Below may happen when range contains graveyard element used by split operation.\r\n        if (start.root != end.root) {\r\n            // End position was next to the moved graveyard element and was moved with it.\r\n            // Fix it by using old `end` which has proper `root`.\r\n            end = this.end.getShiftedBy(-1);\r\n        }\r\n        return new Range(start, end);\r\n    }\r\n    /**\r\n     * Returns a result of transforming a copy of this range by merge operation.\r\n     *\r\n     * Always one range is returned. The transformation is done in a way to not break the range.\r\n     *\r\n     * @internal\r\n     */\r\n    _getTransformedByMergeOperation(operation) {\r\n        // Special case when the marker is set on \"the closing tag\" of an element. Marker can be set like that during\r\n        // transformations, especially when a content of a few block elements were removed. For example:\r\n        //\r\n        // {} is the transformed range, [] is the removed range.\r\n        // <p>F[o{o</p><p>B}ar</p><p>Xy]z</p>\r\n        //\r\n        // <p>Fo{o</p><p>B}ar</p><p>z</p>\r\n        // <p>F{</p><p>B}ar</p><p>z</p>\r\n        // <p>F{</p>}<p>z</p>\r\n        // <p>F{}z</p>\r\n        //\r\n        if (this.start.isEqual(operation.targetPosition) && this.end.isEqual(operation.deletionPosition)) {\r\n            return new Range(this.start);\r\n        }\r\n        let start = this.start._getTransformedByMergeOperation(operation);\r\n        let end = this.end._getTransformedByMergeOperation(operation);\r\n        if (start.root != end.root) {\r\n            // This happens when the end position was next to the merged (deleted) element.\r\n            // Then, the end position was moved to the graveyard root. In this case we need to fix\r\n            // the range cause its boundaries would be in different roots.\r\n            end = this.end.getShiftedBy(-1);\r\n        }\r\n        if (start.isAfter(end)) {\r\n            // This happens in three following cases:\r\n            //\r\n            // Case 1: Merge operation source position is before the target position (due to some transformations, OT, etc.)\r\n            //         This means that start can be moved before the end of the range.\r\n            //\r\n            // Before: <p>a{a</p><p>b}b</p><p>cc</p>\r\n            // Merge:  <p>b}b</p><p>cca{a</p>\r\n            // Fix:    <p>{b}b</p><p>ccaa</p>\r\n            //\r\n            // Case 2: Range start is before merged node but not directly.\r\n            //         Result should include all nodes that were in the original range.\r\n            //\r\n            // Before: <p>aa</p>{<p>cc</p><p>b}b</p>\r\n            // Merge:  <p>aab}b</p>{<p>cc</p>\r\n            // Fix:    <p>aa{bb</p><p>cc</p>}\r\n            //\r\n            //         The range is expanded by an additional `b` letter but it is better than dropping the whole `cc` paragraph.\r\n            //\r\n            // Case 3: Range start is directly before merged node.\r\n            //         Resulting range should include only nodes from the merged element:\r\n            //\r\n            // Before: <p>aa</p>{<p>b}b</p><p>cc</p>\r\n            // Merge:  <p>aab}b</p>{<p>cc</p>\r\n            // Fix:    <p>aa{b}b</p><p>cc</p>\r\n            //\r\n            if (operation.sourcePosition.isBefore(operation.targetPosition)) {\r\n                // Case 1.\r\n                start = Position._createAt(end);\r\n                start.offset = 0;\r\n            }\r\n            else {\r\n                if (!operation.deletionPosition.isEqual(start)) {\r\n                    // Case 2.\r\n                    end = operation.deletionPosition;\r\n                }\r\n                // In both case 2 and 3 start is at the end of the merge-to element.\r\n                start = operation.targetPosition;\r\n            }\r\n            return new Range(start, end);\r\n        }\r\n        return new Range(start, end);\r\n    }\r\n    /**\r\n     * Returns an array containing one or two {@link ~Range ranges} that are a result of transforming this\r\n     * {@link ~Range range} by inserting `howMany` nodes at `insertPosition`. Two {@link ~Range ranges} are\r\n     * returned if the insertion was inside this {@link ~Range range} and `spread` is set to `true`.\r\n     *\r\n     * Examples:\r\n     *\r\n     * ```ts\r\n     * let range = model.createRange(\r\n     * \tmodel.createPositionFromPath( root, [ 2, 7 ] ),\r\n     * \tmodel.createPositionFromPath( root, [ 4, 0, 1 ] )\r\n     * );\r\n     * let transformed = range._getTransformedByInsertion( model.createPositionFromPath( root, [ 1 ] ), 2 );\r\n     * // transformed array has one range from [ 4, 7 ] to [ 6, 0, 1 ]\r\n     *\r\n     * transformed = range._getTransformedByInsertion( model.createPositionFromPath( root, [ 4, 0, 0 ] ), 4 );\r\n     * // transformed array has one range from [ 2, 7 ] to [ 4, 0, 5 ]\r\n     *\r\n     * transformed = range._getTransformedByInsertion( model.createPositionFromPath( root, [ 3, 2 ] ), 4 );\r\n     * // transformed array has one range, which is equal to original range\r\n     *\r\n     * transformed = range._getTransformedByInsertion( model.createPositionFromPath( root, [ 3, 2 ] ), 4, true );\r\n     * // transformed array has two ranges: from [ 2, 7 ] to [ 3, 2 ] and from [ 3, 6 ] to [ 4, 0, 1 ]\r\n     * ```\r\n     *\r\n     * @internal\r\n     * @param insertPosition Position where nodes are inserted.\r\n     * @param howMany How many nodes are inserted.\r\n     * @param spread Flag indicating whether this range should be spread if insertion\r\n     * was inside the range. Defaults to `false`.\r\n     * @returns Result of the transformation.\r\n     */\r\n    _getTransformedByInsertion(insertPosition, howMany, spread = false) {\r\n        if (spread && this.containsPosition(insertPosition)) {\r\n            // Range has to be spread. The first part is from original start to the spread point.\r\n            // The other part is from spread point to the original end, but transformed by\r\n            // insertion to reflect insertion changes.\r\n            return [\r\n                new Range(this.start, insertPosition),\r\n                new Range(insertPosition.getShiftedBy(howMany), this.end._getTransformedByInsertion(insertPosition, howMany))\r\n            ];\r\n        }\r\n        else {\r\n            const range = new Range(this.start, this.end);\r\n            range.start = range.start._getTransformedByInsertion(insertPosition, howMany);\r\n            range.end = range.end._getTransformedByInsertion(insertPosition, howMany);\r\n            return [range];\r\n        }\r\n    }\r\n    /**\r\n     * Returns an array containing {@link ~Range ranges} that are a result of transforming this\r\n     * {@link ~Range range} by moving `howMany` nodes from `sourcePosition` to `targetPosition`.\r\n     *\r\n     * @internal\r\n     * @param sourcePosition Position from which nodes are moved.\r\n     * @param targetPosition Position to where nodes are moved.\r\n     * @param howMany How many nodes are moved.\r\n     * @param spread Whether the range should be spread if the move points inside the range.\r\n     * @returns  Result of the transformation.\r\n     */\r\n    _getTransformedByMove(sourcePosition, targetPosition, howMany, spread = false) {\r\n        // Special case for transforming a collapsed range. Just transform it like a position.\r\n        if (this.isCollapsed) {\r\n            const newPos = this.start._getTransformedByMove(sourcePosition, targetPosition, howMany);\r\n            return [new Range(newPos)];\r\n        }\r\n        // Special case for transformation when a part of the range is moved towards the range.\r\n        //\r\n        // Examples:\r\n        //\r\n        // <div><p>ab</p><p>c[d</p></div><p>e]f</p> --> <div><p>ab</p></div><p>c[d</p><p>e]f</p>\r\n        // <p>e[f</p><div><p>a]b</p><p>cd</p></div> --> <p>e[f</p><p>a]b</p><div><p>cd</p></div>\r\n        //\r\n        // Without this special condition, the default algorithm leaves an \"artifact\" range from one of `differenceSet` parts:\r\n        //\r\n        // <div><p>ab</p><p>c[d</p></div><p>e]f</p> --> <div><p>ab</p>{</div>}<p>c[d</p><p>e]f</p>\r\n        //\r\n        // This special case is applied only if the range is to be kept together (not spread).\r\n        const moveRange = Range._createFromPositionAndShift(sourcePosition, howMany);\r\n        const insertPosition = targetPosition._getTransformedByDeletion(sourcePosition, howMany);\r\n        if (this.containsPosition(targetPosition) && !spread) {\r\n            if (moveRange.containsPosition(this.start) || moveRange.containsPosition(this.end)) {\r\n                const start = this.start._getTransformedByMove(sourcePosition, targetPosition, howMany);\r\n                const end = this.end._getTransformedByMove(sourcePosition, targetPosition, howMany);\r\n                return [new Range(start, end)];\r\n            }\r\n        }\r\n        // Default algorithm.\r\n        let result;\r\n        const differenceSet = this.getDifference(moveRange);\r\n        let difference = null;\r\n        const common = this.getIntersection(moveRange);\r\n        if (differenceSet.length == 1) {\r\n            // `moveRange` and this range may intersect but may be separate.\r\n            difference = new Range(differenceSet[0].start._getTransformedByDeletion(sourcePosition, howMany), differenceSet[0].end._getTransformedByDeletion(sourcePosition, howMany));\r\n        }\r\n        else if (differenceSet.length == 2) {\r\n            // `moveRange` is inside this range.\r\n            difference = new Range(this.start, this.end._getTransformedByDeletion(sourcePosition, howMany));\r\n        } // else, `moveRange` contains this range.\r\n        if (difference) {\r\n            result = difference._getTransformedByInsertion(insertPosition, howMany, common !== null || spread);\r\n        }\r\n        else {\r\n            result = [];\r\n        }\r\n        if (common) {\r\n            const transformedCommon = new Range(common.start._getCombined(moveRange.start, insertPosition), common.end._getCombined(moveRange.start, insertPosition));\r\n            if (result.length == 2) {\r\n                result.splice(1, 0, transformedCommon);\r\n            }\r\n            else {\r\n                result.push(transformedCommon);\r\n            }\r\n        }\r\n        return result;\r\n    }\r\n    /**\r\n     * Returns a copy of this range that is transformed by deletion of `howMany` nodes from `deletePosition`.\r\n     *\r\n     * If the deleted range is intersecting with the transformed range, the transformed range will be shrank.\r\n     *\r\n     * If the deleted range contains transformed range, `null` will be returned.\r\n     *\r\n     * @internal\r\n     * @param deletionPosition Position from which nodes are removed.\r\n     * @param howMany How many nodes are removed.\r\n     * @returns Result of the transformation.\r\n     */\r\n    _getTransformedByDeletion(deletePosition, howMany) {\r\n        let newStart = this.start._getTransformedByDeletion(deletePosition, howMany);\r\n        let newEnd = this.end._getTransformedByDeletion(deletePosition, howMany);\r\n        if (newStart == null && newEnd == null) {\r\n            return null;\r\n        }\r\n        if (newStart == null) {\r\n            newStart = deletePosition;\r\n        }\r\n        if (newEnd == null) {\r\n            newEnd = deletePosition;\r\n        }\r\n        return new Range(newStart, newEnd);\r\n    }\r\n    /**\r\n     * Creates a new range, spreading from specified {@link module:engine/model/position~Position position} to a position moved by\r\n     * given `shift`. If `shift` is a negative value, shifted position is treated as the beginning of the range.\r\n     *\r\n     * @internal\r\n     * @param position Beginning of the range.\r\n     * @param shift How long the range should be.\r\n     */\r\n    static _createFromPositionAndShift(position, shift) {\r\n        const start = position;\r\n        const end = position.getShiftedBy(shift);\r\n        return shift > 0 ? new this(start, end) : new this(end, start);\r\n    }\r\n    /**\r\n     * Creates a range inside an {@link module:engine/model/element~Element element} which starts before the first child of\r\n     * that element and ends after the last child of that element.\r\n     *\r\n     * @internal\r\n     * @param element Element which is a parent for the range.\r\n     */\r\n    static _createIn(element) {\r\n        return new this(Position._createAt(element, 0), Position._createAt(element, element.maxOffset));\r\n    }\r\n    /**\r\n     * Creates a range that starts before given {@link module:engine/model/item~Item model item} and ends after it.\r\n     *\r\n     * @internal\r\n     */\r\n    static _createOn(item) {\r\n        return this._createFromPositionAndShift(Position._createBefore(item), item.offsetSize);\r\n    }\r\n    /**\r\n     * Combines all ranges from the passed array into a one range. At least one range has to be passed.\r\n     * Passed ranges must not have common parts.\r\n     *\r\n     * The first range from the array is a reference range. If other ranges start or end on the exactly same position where\r\n     * the reference range, they get combined into one range.\r\n     *\r\n     * ```\r\n     * [  ][]  [    ][ ][             ][ ][]  [  ]  // Passed ranges, shown sorted\r\n     * [    ]                                       // The result of the function if the first range was a reference range.\r\n     *         [                           ]        // The result of the function if the third-to-seventh range was a reference range.\r\n     *                                        [  ]  // The result of the function if the last range was a reference range.\r\n     * ```\r\n     *\r\n     * @internal\r\n     * @param ranges Ranges to combine.\r\n     * @returns Combined range.\r\n     */\r\n    static _createFromRanges(ranges) {\r\n        if (ranges.length === 0) {\r\n            /**\r\n             * At least one range has to be passed to\r\n             * {@link module:engine/model/range~Range._createFromRanges `Range._createFromRanges()`}.\r\n             *\r\n             * @error range-create-from-ranges-empty-array\r\n             */\r\n            throw new CKEditorError('range-create-from-ranges-empty-array', null);\r\n        }\r\n        else if (ranges.length == 1) {\r\n            return ranges[0].clone();\r\n        }\r\n        // 1. Set the first range in `ranges` array as a reference range.\r\n        // If we are going to return just a one range, one of the ranges need to be the reference one.\r\n        // Other ranges will be stuck to that range, if possible.\r\n        const ref = ranges[0];\r\n        // 2. Sort all the ranges so it's easier to process them.\r\n        ranges.sort((a, b) => {\r\n            return a.start.isAfter(b.start) ? 1 : -1;\r\n        });\r\n        // 3. Check at which index the reference range is now.\r\n        const refIndex = ranges.indexOf(ref);\r\n        // 4. At this moment we don't need the original range.\r\n        // We are going to modify the result and we need to return a new instance of Range.\r\n        // We have to create a copy of the reference range.\r\n        const result = new this(ref.start, ref.end);\r\n        // 5. Ranges should be checked and glued starting from the range that is closest to the reference range.\r\n        // Since ranges are sorted, start with the range with index that is closest to reference range index.\r\n        if (refIndex > 0) {\r\n            // eslint-disable-next-line no-constant-condition\r\n            for (let i = refIndex - 1; true; i++) {\r\n                if (ranges[i].end.isEqual(result.start)) {\r\n                    result.start = Position._createAt(ranges[i].start);\r\n                }\r\n                else {\r\n                    // If ranges are not starting/ending at the same position there is no point in looking further.\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        // 6. Ranges should be checked and glued starting from the range that is closest to the reference range.\r\n        // Since ranges are sorted, start with the range with index that is closest to reference range index.\r\n        for (let i = refIndex + 1; i < ranges.length; i++) {\r\n            if (ranges[i].start.isEqual(result.end)) {\r\n                result.end = Position._createAt(ranges[i].end);\r\n            }\r\n            else {\r\n                // If ranges are not starting/ending at the same position there is no point in looking further.\r\n                break;\r\n            }\r\n        }\r\n        return result;\r\n    }\r\n    /**\r\n     * Creates a `Range` instance from given plain object (i.e. parsed JSON string).\r\n     *\r\n     * @param json Plain object to be converted to `Range`.\r\n     * @param doc Document object that will be range owner.\r\n     * @returns `Range` instance created using given plain object.\r\n     */\r\n    static fromJSON(json, doc) {\r\n        return new this(Position.fromJSON(json.start, doc), Position.fromJSON(json.end, doc));\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nRange.prototype.is = function (type) {\r\n    return type === 'range' || type === 'model:range';\r\n};\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/conversion/mapper\r\n */\r\nimport ModelPosition from '../model/position';\r\nimport ModelRange from '../model/range';\r\nimport ViewPosition from '../view/position';\r\nimport ViewRange from '../view/range';\r\nimport ViewText from '../view/text';\r\nimport { CKEditorError, EmitterMixin } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Maps elements, positions and markers between the {@link module:engine/view/document~Document view} and\r\n * the {@link module:engine/model/model model}.\r\n *\r\n * The instance of the Mapper used for the editing pipeline is available in\r\n * {@link module:engine/controller/editingcontroller~EditingController#mapper `editor.editing.mapper`}.\r\n *\r\n * Mapper uses bound elements to find corresponding elements and positions, so, to get proper results,\r\n * all model elements should be {@link module:engine/conversion/mapper~Mapper#bindElements bound}.\r\n *\r\n * To map the complex model to/from view relations, you may provide custom callbacks for the\r\n * {@link module:engine/conversion/mapper~Mapper#event:modelToViewPosition modelToViewPosition event} and\r\n * {@link module:engine/conversion/mapper~Mapper#event:viewToModelPosition viewToModelPosition event} that are fired whenever\r\n * a position mapping request occurs.\r\n * Those events are fired by the {@link module:engine/conversion/mapper~Mapper#toViewPosition toViewPosition}\r\n * and {@link module:engine/conversion/mapper~Mapper#toModelPosition toModelPosition} methods. `Mapper` adds its own default callbacks\r\n * with `'lowest'` priority. To override default `Mapper` mapping, add custom callback with higher priority and\r\n * stop the event.\r\n */\r\nexport default class Mapper extends EmitterMixin() {\r\n    /**\r\n     * Creates an instance of the mapper.\r\n     */\r\n    constructor() {\r\n        super();\r\n        /**\r\n         * Model element to view element mapping.\r\n         */\r\n        this._modelToViewMapping = new WeakMap();\r\n        /**\r\n         * View element to model element mapping.\r\n         */\r\n        this._viewToModelMapping = new WeakMap();\r\n        /**\r\n         * A map containing callbacks between view element names and functions evaluating length of view elements\r\n         * in model.\r\n         */\r\n        this._viewToModelLengthCallbacks = new Map();\r\n        /**\r\n         * Model marker name to view elements mapping.\r\n         *\r\n         * Keys are `String`s while values are `Set`s with {@link module:engine/view/element~Element view elements}.\r\n         * One marker (name) can be mapped to multiple elements.\r\n         */\r\n        this._markerNameToElements = new Map();\r\n        /**\r\n         * View element to model marker names mapping.\r\n         *\r\n         * This is reverse to {@link ~Mapper#_markerNameToElements} map.\r\n         */\r\n        this._elementToMarkerNames = new Map();\r\n        /**\r\n         * The map of removed view elements with their current root (used for deferred unbinding).\r\n         */\r\n        this._deferredBindingRemovals = new Map();\r\n        /**\r\n         * Stores marker names of markers which have changed due to unbinding a view element (so it is assumed that the view element\r\n         * has been removed, moved or renamed).\r\n         */\r\n        this._unboundMarkerNames = new Set();\r\n        // Default mapper algorithm for mapping model position to view position.\r\n        this.on('modelToViewPosition', (evt, data) => {\r\n            if (data.viewPosition) {\r\n                return;\r\n            }\r\n            const viewContainer = this._modelToViewMapping.get(data.modelPosition.parent);\r\n            if (!viewContainer) {\r\n                /**\r\n                 * A model position could not be mapped to the view because the parent of the model position\r\n                 * does not have a mapped view element (might have not been converted yet or it has no converter).\r\n                 *\r\n                 * Make sure that the model element is correctly converted to the view.\r\n                 *\r\n                 * @error mapping-model-position-view-parent-not-found\r\n                 */\r\n                throw new CKEditorError('mapping-model-position-view-parent-not-found', this, { modelPosition: data.modelPosition });\r\n            }\r\n            data.viewPosition = this.findPositionIn(viewContainer, data.modelPosition.offset);\r\n        }, { priority: 'low' });\r\n        // Default mapper algorithm for mapping view position to model position.\r\n        this.on('viewToModelPosition', (evt, data) => {\r\n            if (data.modelPosition) {\r\n                return;\r\n            }\r\n            const viewBlock = this.findMappedViewAncestor(data.viewPosition);\r\n            const modelParent = this._viewToModelMapping.get(viewBlock);\r\n            const modelOffset = this._toModelOffset(data.viewPosition.parent, data.viewPosition.offset, viewBlock);\r\n            data.modelPosition = ModelPosition._createAt(modelParent, modelOffset);\r\n        }, { priority: 'low' });\r\n    }\r\n    /**\r\n     * Marks model and view elements as corresponding. Corresponding elements can be retrieved by using\r\n     * the {@link module:engine/conversion/mapper~Mapper#toModelElement toModelElement} and\r\n     * {@link module:engine/conversion/mapper~Mapper#toViewElement toViewElement} methods.\r\n     * The information that elements are bound is also used to translate positions.\r\n     *\r\n     * @param modelElement Model element.\r\n     * @param viewElement View element.\r\n     */\r\n    bindElements(modelElement, viewElement) {\r\n        this._modelToViewMapping.set(modelElement, viewElement);\r\n        this._viewToModelMapping.set(viewElement, modelElement);\r\n    }\r\n    /**\r\n     * Unbinds the given {@link module:engine/view/element~Element view element} from the map.\r\n     *\r\n     * **Note:** view-to-model binding will be removed, if it existed. However, corresponding model-to-view binding\r\n     * will be removed only if model element is still bound to the passed `viewElement`.\r\n     *\r\n     * This behavior allows for re-binding model element to another view element without fear of losing the new binding\r\n     * when the previously bound view element is unbound.\r\n     *\r\n     * @param viewElement View element to unbind.\r\n     * @param options The options object.\r\n     * @param options.defer Controls whether the binding should be removed immediately or deferred until a\r\n     * {@link #flushDeferredBindings `flushDeferredBindings()`} call.\r\n     */\r\n    unbindViewElement(viewElement, options = {}) {\r\n        const modelElement = this.toModelElement(viewElement);\r\n        if (this._elementToMarkerNames.has(viewElement)) {\r\n            for (const markerName of this._elementToMarkerNames.get(viewElement)) {\r\n                this._unboundMarkerNames.add(markerName);\r\n            }\r\n        }\r\n        if (options.defer) {\r\n            this._deferredBindingRemovals.set(viewElement, viewElement.root);\r\n        }\r\n        else {\r\n            this._viewToModelMapping.delete(viewElement);\r\n            if (this._modelToViewMapping.get(modelElement) == viewElement) {\r\n                this._modelToViewMapping.delete(modelElement);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Unbinds the given {@link module:engine/model/element~Element model element} from the map.\r\n     *\r\n     * **Note:** the model-to-view binding will be removed, if it existed. However, the corresponding view-to-model binding\r\n     * will be removed only if the view element is still bound to the passed `modelElement`.\r\n     *\r\n     * This behavior lets for re-binding view element to another model element without fear of losing the new binding\r\n     * when the previously bound model element is unbound.\r\n     *\r\n     * @param modelElement Model element to unbind.\r\n     */\r\n    unbindModelElement(modelElement) {\r\n        const viewElement = this.toViewElement(modelElement);\r\n        this._modelToViewMapping.delete(modelElement);\r\n        if (this._viewToModelMapping.get(viewElement) == modelElement) {\r\n            this._viewToModelMapping.delete(viewElement);\r\n        }\r\n    }\r\n    /**\r\n     * Binds the given marker name with the given {@link module:engine/view/element~Element view element}. The element\r\n     * will be added to the current set of elements bound with the given marker name.\r\n     *\r\n     * @param element Element to bind.\r\n     * @param name Marker name.\r\n     */\r\n    bindElementToMarker(element, name) {\r\n        const elements = this._markerNameToElements.get(name) || new Set();\r\n        elements.add(element);\r\n        const names = this._elementToMarkerNames.get(element) || new Set();\r\n        names.add(name);\r\n        this._markerNameToElements.set(name, elements);\r\n        this._elementToMarkerNames.set(element, names);\r\n    }\r\n    /**\r\n     * Unbinds an element from given marker name.\r\n     *\r\n     * @param element Element to unbind.\r\n     * @param name Marker name.\r\n     */\r\n    unbindElementFromMarkerName(element, name) {\r\n        const nameToElements = this._markerNameToElements.get(name);\r\n        if (nameToElements) {\r\n            nameToElements.delete(element);\r\n            if (nameToElements.size == 0) {\r\n                this._markerNameToElements.delete(name);\r\n            }\r\n        }\r\n        const elementToNames = this._elementToMarkerNames.get(element);\r\n        if (elementToNames) {\r\n            elementToNames.delete(name);\r\n            if (elementToNames.size == 0) {\r\n                this._elementToMarkerNames.delete(element);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Returns all marker names of markers which have changed due to unbinding a view element (so it is assumed that the view element\r\n     * has been removed, moved or renamed) since the last flush. After returning, the marker names list is cleared.\r\n     */\r\n    flushUnboundMarkerNames() {\r\n        const markerNames = Array.from(this._unboundMarkerNames);\r\n        this._unboundMarkerNames.clear();\r\n        return markerNames;\r\n    }\r\n    /**\r\n     * Unbinds all deferred binding removals of view elements that in the meantime were not re-attached to some root or document fragment.\r\n     *\r\n     * See: {@link #unbindViewElement `unbindViewElement()`}.\r\n     */\r\n    flushDeferredBindings() {\r\n        for (const [viewElement, root] of this._deferredBindingRemovals) {\r\n            // Unbind it only if it wasn't re-attached to some root or document fragment.\r\n            if (viewElement.root == root) {\r\n                this.unbindViewElement(viewElement);\r\n            }\r\n        }\r\n        this._deferredBindingRemovals = new Map();\r\n    }\r\n    /**\r\n     * Removes all model to view and view to model bindings.\r\n     */\r\n    clearBindings() {\r\n        this._modelToViewMapping = new WeakMap();\r\n        this._viewToModelMapping = new WeakMap();\r\n        this._markerNameToElements = new Map();\r\n        this._elementToMarkerNames = new Map();\r\n        this._unboundMarkerNames = new Set();\r\n        this._deferredBindingRemovals = new Map();\r\n    }\r\n    toModelElement(viewElement) {\r\n        return this._viewToModelMapping.get(viewElement);\r\n    }\r\n    toViewElement(modelElement) {\r\n        return this._modelToViewMapping.get(modelElement);\r\n    }\r\n    /**\r\n     * Gets the corresponding model range.\r\n     *\r\n     * @param viewRange View range.\r\n     * @returns Corresponding model range.\r\n     */\r\n    toModelRange(viewRange) {\r\n        return new ModelRange(this.toModelPosition(viewRange.start), this.toModelPosition(viewRange.end));\r\n    }\r\n    /**\r\n     * Gets the corresponding view range.\r\n     *\r\n     * @param modelRange Model range.\r\n     * @returns Corresponding view range.\r\n     */\r\n    toViewRange(modelRange) {\r\n        return new ViewRange(this.toViewPosition(modelRange.start), this.toViewPosition(modelRange.end));\r\n    }\r\n    /**\r\n     * Gets the corresponding model position.\r\n     *\r\n     * @fires viewToModelPosition\r\n     * @param viewPosition View position.\r\n     * @returns Corresponding model position.\r\n     */\r\n    toModelPosition(viewPosition) {\r\n        const data = {\r\n            viewPosition,\r\n            mapper: this\r\n        };\r\n        this.fire('viewToModelPosition', data);\r\n        return data.modelPosition;\r\n    }\r\n    /**\r\n     * Gets the corresponding view position.\r\n     *\r\n     * @fires modelToViewPosition\r\n     * @param modelPosition Model position.\r\n     * @param options Additional options for position mapping process.\r\n     * @param options.isPhantom Should be set to `true` if the model position to map is pointing to a place\r\n     * in model tree which no longer exists. For example, it could be an end of a removed model range.\r\n     * @returns Corresponding view position.\r\n     */\r\n    toViewPosition(modelPosition, options = {}) {\r\n        const data = {\r\n            modelPosition,\r\n            mapper: this,\r\n            isPhantom: options.isPhantom\r\n        };\r\n        this.fire('modelToViewPosition', data);\r\n        return data.viewPosition;\r\n    }\r\n    /**\r\n     * Gets all view elements bound to the given marker name.\r\n     *\r\n     * @param name Marker name.\r\n     * @returns View elements bound with the given marker name or `null`\r\n     * if no elements are bound to the given marker name.\r\n     */\r\n    markerNameToElements(name) {\r\n        const boundElements = this._markerNameToElements.get(name);\r\n        if (!boundElements) {\r\n            return null;\r\n        }\r\n        const elements = new Set();\r\n        for (const element of boundElements) {\r\n            if (element.is('attributeElement')) {\r\n                for (const clone of element.getElementsWithSameId()) {\r\n                    elements.add(clone);\r\n                }\r\n            }\r\n            else {\r\n                elements.add(element);\r\n            }\r\n        }\r\n        return elements;\r\n    }\r\n    /**\r\n     * Registers a callback that evaluates the length in the model of a view element with the given name.\r\n     *\r\n     * The callback is fired with one argument, which is a view element instance. The callback is expected to return\r\n     * a number representing the length of the view element in the model.\r\n     *\r\n     * ```ts\r\n     * // List item in view may contain nested list, which have other list items. In model though,\r\n     * // the lists are represented by flat structure. Because of those differences, length of list view element\r\n     * // may be greater than one. In the callback it's checked how many nested list items are in evaluated list item.\r\n     *\r\n     * function getViewListItemLength( element ) {\r\n     * \tlet length = 1;\r\n     *\r\n     * \tfor ( let child of element.getChildren() ) {\r\n     * \t\tif ( child.name == 'ul' || child.name == 'ol' ) {\r\n     * \t\t\tfor ( let item of child.getChildren() ) {\r\n     * \t\t\t\tlength += getViewListItemLength( item );\r\n     * \t\t\t}\r\n     * \t\t}\r\n     * \t}\r\n     *\r\n     * \treturn length;\r\n     * }\r\n     *\r\n     * mapper.registerViewToModelLength( 'li', getViewListItemLength );\r\n     * ```\r\n     *\r\n     * @param viewElementName Name of view element for which callback is registered.\r\n     * @param lengthCallback Function return a length of view element instance in model.\r\n     */\r\n    registerViewToModelLength(viewElementName, lengthCallback) {\r\n        this._viewToModelLengthCallbacks.set(viewElementName, lengthCallback);\r\n    }\r\n    /**\r\n     * For the given `viewPosition`, finds and returns the closest ancestor of this position that has a mapping to\r\n     * the model.\r\n     *\r\n     * @param viewPosition Position for which a mapped ancestor should be found.\r\n     */\r\n    findMappedViewAncestor(viewPosition) {\r\n        let parent = viewPosition.parent;\r\n        while (!this._viewToModelMapping.has(parent)) {\r\n            parent = parent.parent;\r\n        }\r\n        return parent;\r\n    }\r\n    /**\r\n     * Calculates model offset based on the view position and the block element.\r\n     *\r\n     * Example:\r\n     *\r\n     * ```html\r\n     * <p>foo<b>ba|r</b></p> // _toModelOffset( b, 2, p ) -> 5\r\n     * ```\r\n     *\r\n     * Is a sum of:\r\n     *\r\n     * ```html\r\n     * <p>foo|<b>bar</b></p> // _toModelOffset( p, 3, p ) -> 3\r\n     * <p>foo<b>ba|r</b></p> // _toModelOffset( b, 2, b ) -> 2\r\n     * ```\r\n     *\r\n     * @param viewParent Position parent.\r\n     * @param viewOffset Position offset.\r\n     * @param viewBlock Block used as a base to calculate offset.\r\n     * @returns Offset in the model.\r\n     */\r\n    _toModelOffset(viewParent, viewOffset, viewBlock) {\r\n        if (viewBlock != viewParent) {\r\n            // See example.\r\n            const offsetToParentStart = this._toModelOffset(viewParent.parent, viewParent.index, viewBlock);\r\n            const offsetInParent = this._toModelOffset(viewParent, viewOffset, viewParent);\r\n            return offsetToParentStart + offsetInParent;\r\n        }\r\n        // viewBlock == viewParent, so we need to calculate the offset in the parent element.\r\n        // If the position is a text it is simple (\"ba|r\" -> 2).\r\n        if (viewParent.is('$text')) {\r\n            return viewOffset;\r\n        }\r\n        // If the position is in an element we need to sum lengths of siblings ( <b> bar </b> foo | -> 3 + 3 = 6 ).\r\n        let modelOffset = 0;\r\n        for (let i = 0; i < viewOffset; i++) {\r\n            modelOffset += this.getModelLength(viewParent.getChild(i));\r\n        }\r\n        return modelOffset;\r\n    }\r\n    /**\r\n     * Gets the length of the view element in the model.\r\n     *\r\n     * The length is calculated as follows:\r\n     * * if a {@link #registerViewToModelLength length mapping callback} is provided for the given `viewNode`, it is used to\r\n     * evaluate the model length (`viewNode` is used as first and only parameter passed to the callback),\r\n     * * length of a {@link module:engine/view/text~Text text node} is equal to the length of its\r\n     * {@link module:engine/view/text~Text#data data},\r\n     * * length of a {@link module:engine/view/uielement~UIElement ui element} is equal to 0,\r\n     * * length of a mapped {@link module:engine/view/element~Element element} is equal to 1,\r\n     * * length of a non-mapped {@link module:engine/view/element~Element element} is equal to the length of its children.\r\n     *\r\n     * Examples:\r\n     *\r\n     * ```\r\n     * foo                          -> 3 // Text length is equal to its data length.\r\n     * <p>foo</p>                   -> 1 // Length of an element which is mapped is by default equal to 1.\r\n     * <b>foo</b>                   -> 3 // Length of an element which is not mapped is a length of its children.\r\n     * <div><p>x</p><p>y</p></div>  -> 2 // Assuming that <div> is not mapped and <p> are mapped.\r\n     * ```\r\n     *\r\n     * @param viewNode View node.\r\n     * @returns Length of the node in the tree model.\r\n     */\r\n    getModelLength(viewNode) {\r\n        if (this._viewToModelLengthCallbacks.get(viewNode.name)) {\r\n            const callback = this._viewToModelLengthCallbacks.get(viewNode.name);\r\n            return callback(viewNode);\r\n        }\r\n        else if (this._viewToModelMapping.has(viewNode)) {\r\n            return 1;\r\n        }\r\n        else if (viewNode.is('$text')) {\r\n            return viewNode.data.length;\r\n        }\r\n        else if (viewNode.is('uiElement')) {\r\n            return 0;\r\n        }\r\n        else {\r\n            let len = 0;\r\n            for (const child of viewNode.getChildren()) {\r\n                len += this.getModelLength(child);\r\n            }\r\n            return len;\r\n        }\r\n    }\r\n    /**\r\n     * Finds the position in the view node (or in its children) with the expected model offset.\r\n     *\r\n     * Example:\r\n     *\r\n     * ```\r\n     * <p>fo<b>bar</b>bom</p> -> expected offset: 4\r\n     *\r\n     * findPositionIn( p, 4 ):\r\n     * <p>|fo<b>bar</b>bom</p> -> expected offset: 4, actual offset: 0\r\n     * <p>fo|<b>bar</b>bom</p> -> expected offset: 4, actual offset: 2\r\n     * <p>fo<b>bar</b>|bom</p> -> expected offset: 4, actual offset: 5 -> we are too far\r\n     *\r\n     * findPositionIn( b, 4 - ( 5 - 3 ) ):\r\n     * <p>fo<b>|bar</b>bom</p> -> expected offset: 2, actual offset: 0\r\n     * <p>fo<b>bar|</b>bom</p> -> expected offset: 2, actual offset: 3 -> we are too far\r\n     *\r\n     * findPositionIn( bar, 2 - ( 3 - 3 ) ):\r\n     * We are in the text node so we can simple find the offset.\r\n     * <p>fo<b>ba|r</b>bom</p> -> expected offset: 2, actual offset: 2 -> position found\r\n     * ```\r\n     *\r\n     * @param viewParent Tree view element in which we are looking for the position.\r\n     * @param expectedOffset Expected offset.\r\n     * @returns Found position.\r\n     */\r\n    findPositionIn(viewParent, expectedOffset) {\r\n        // Last scanned view node.\r\n        let viewNode;\r\n        // Length of the last scanned view node.\r\n        let lastLength = 0;\r\n        let modelOffset = 0;\r\n        let viewOffset = 0;\r\n        // In the text node it is simple: the offset in the model equals the offset in the text.\r\n        if (viewParent.is('$text')) {\r\n            return new ViewPosition(viewParent, expectedOffset);\r\n        }\r\n        // In other cases we add lengths of child nodes to find the proper offset.\r\n        // If it is smaller we add the length.\r\n        while (modelOffset < expectedOffset) {\r\n            viewNode = viewParent.getChild(viewOffset);\r\n            lastLength = this.getModelLength(viewNode);\r\n            modelOffset += lastLength;\r\n            viewOffset++;\r\n        }\r\n        // If it equals we found the position.\r\n        if (modelOffset == expectedOffset) {\r\n            return this._moveViewPositionToTextNode(new ViewPosition(viewParent, viewOffset));\r\n        }\r\n        // If it is higher we need to enter last child.\r\n        else {\r\n            // ( modelOffset - lastLength ) is the offset to the child we enter,\r\n            // so we subtract it from the expected offset to fine the offset in the child.\r\n            return this.findPositionIn(viewNode, expectedOffset - (modelOffset - lastLength));\r\n        }\r\n    }\r\n    /**\r\n     * Because we prefer positions in the text nodes over positions next to text nodes, if the view position was next to a text node,\r\n     * it moves it into the text node instead.\r\n     *\r\n     * ```\r\n     * <p>[]<b>foo</b></p> -> <p>[]<b>foo</b></p> // do not touch if position is not directly next to text\r\n     * <p>foo[]<b>foo</b></p> -> <p>foo{}<b>foo</b></p> // move to text node\r\n     * <p><b>[]foo</b></p> -> <p><b>{}foo</b></p> // move to text node\r\n     * ```\r\n     *\r\n     * @param viewPosition Position potentially next to the text node.\r\n     * @returns Position in the text node if possible.\r\n     */\r\n    _moveViewPositionToTextNode(viewPosition) {\r\n        // If the position is just after a text node, put it at the end of that text node.\r\n        // If the position is just before a text node, put it at the beginning of that text node.\r\n        const nodeBefore = viewPosition.nodeBefore;\r\n        const nodeAfter = viewPosition.nodeAfter;\r\n        if (nodeBefore instanceof ViewText) {\r\n            return new ViewPosition(nodeBefore, nodeBefore.data.length);\r\n        }\r\n        else if (nodeAfter instanceof ViewText) {\r\n            return new ViewPosition(nodeAfter, 0);\r\n        }\r\n        // Otherwise, just return the given position.\r\n        return viewPosition;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/conversion/modelconsumable\r\n */\r\nimport TextProxy from '../model/textproxy';\r\nimport { CKEditorError } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Manages a list of consumable values for the {@link module:engine/model/item~Item model items}.\r\n *\r\n * Consumables are various aspects of the model. A model item can be broken down into separate, single properties that might be\r\n * taken into consideration when converting that item.\r\n *\r\n * `ModelConsumable` is used by {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher} while analyzing the changed\r\n * parts of {@link module:engine/model/document~Document the document}. The added / changed / removed model items are broken down\r\n * into singular properties (the item itself and its attributes). All those parts are saved in `ModelConsumable`. Then,\r\n * during conversion, when the given part of a model item is converted (i.e. the view element has been inserted into the view,\r\n * but without attributes), the consumable value is removed from `ModelConsumable`.\r\n *\r\n * For model items, `ModelConsumable` stores consumable values of one of following types: `insert`, `addattribute:<attributeKey>`,\r\n * `changeattributes:<attributeKey>`, `removeattributes:<attributeKey>`.\r\n *\r\n * In most cases, it is enough to let th {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher}\r\n * gather consumable values, so there is no need to use\r\n * the {@link module:engine/conversion/modelconsumable~ModelConsumable#add add method} directly.\r\n * However, it is important to understand how consumable values can be\r\n * {@link module:engine/conversion/modelconsumable~ModelConsumable#consume consumed}.\r\n * See {@link module:engine/conversion/downcasthelpers default downcast converters} for more information.\r\n *\r\n * Keep in mind that one conversion event may have multiple callbacks (converters) attached to it. Each of those is\r\n * able to convert one or more parts of the model. However, when one of those callbacks actually converts\r\n * something, the others should not, because they would duplicate the results. Using `ModelConsumable` helps to avoid\r\n * this situation, because callbacks should only convert these values that were not yet consumed from `ModelConsumable`.\r\n *\r\n * Consuming multiple values in a single callback:\r\n *\r\n * ```ts\r\n * // Converter for custom `imageBlock` element that might have a `caption` element inside which changes\r\n * // how the image is displayed in the view:\r\n * //\r\n * // Model:\r\n * //\r\n * // [imageBlock]\r\n * //   └─ [caption]\r\n * //       └─ foo\r\n * //\r\n * // View:\r\n * //\r\n * // <figure>\r\n * //   ├─ <img />\r\n * //   └─ <caption>\r\n * //       └─ foo\r\n * modelConversionDispatcher.on( 'insert:imageBlock', ( evt, data, conversionApi ) => {\r\n * \t// First, consume the `imageBlock` element.\r\n * \tconversionApi.consumable.consume( data.item, 'insert' );\r\n *\r\n * \t// Just create normal image element for the view.\r\n * \t// Maybe it will be \"decorated\" later.\r\n * \tconst viewImage = new ViewElement( 'img' );\r\n * \tconst insertPosition = conversionApi.mapper.toViewPosition( data.range.start );\r\n * \tconst viewWriter = conversionApi.writer;\r\n *\r\n * \t// Check if the `imageBlock` element has children.\r\n * \tif ( data.item.childCount > 0 ) {\r\n * \t\tconst modelCaption = data.item.getChild( 0 );\r\n *\r\n * \t\t// `modelCaption` insertion change is consumed from consumable values.\r\n * \t\t// It will not be converted by other converters, but it's children (probably some text) will be.\r\n * \t\t// Through mapping, converters for text will know where to insert contents of `modelCaption`.\r\n * \t\tif ( conversionApi.consumable.consume( modelCaption, 'insert' ) ) {\r\n * \t\t\tconst viewCaption = new ViewElement( 'figcaption' );\r\n *\r\n * \t\t\tconst viewImageHolder = new ViewElement( 'figure', null, [ viewImage, viewCaption ] );\r\n *\r\n * \t\t\tconversionApi.mapper.bindElements( modelCaption, viewCaption );\r\n * \t\t\tconversionApi.mapper.bindElements( data.item, viewImageHolder );\r\n * \t\t\tviewWriter.insert( insertPosition, viewImageHolder );\r\n * \t\t}\r\n * \t} else {\r\n * \t\tconversionApi.mapper.bindElements( data.item, viewImage );\r\n * \t\tviewWriter.insert( insertPosition, viewImage );\r\n * \t}\r\n *\r\n * \tevt.stop();\r\n * } );\r\n * ```\r\n */\r\nexport default class ModelConsumable {\r\n    constructor() {\r\n        /**\r\n         * Contains list of consumable values.\r\n         */\r\n        this._consumable = new Map();\r\n        /**\r\n         * For each {@link module:engine/model/textproxy~TextProxy} added to `ModelConsumable`, this registry holds a parent\r\n         * of that `TextProxy` and the start and end indices of that `TextProxy`. This allows identification of the `TextProxy`\r\n         * instances that point to the same part of the model but are different instances. Each distinct `TextProxy`\r\n         * is given a unique `Symbol` which is then registered as consumable. This process is transparent for the `ModelConsumable`\r\n         * API user because whenever `TextProxy` is added, tested, consumed or reverted, the internal mechanisms of\r\n         * `ModelConsumable` translate `TextProxy` to that unique `Symbol`.\r\n         */\r\n        this._textProxyRegistry = new Map();\r\n    }\r\n    /**\r\n     * Adds a consumable value to the consumables list and links it with a given model item.\r\n     *\r\n     * ```ts\r\n     * modelConsumable.add( modelElement, 'insert' ); // Add `modelElement` insertion change to consumable values.\r\n     * modelConsumable.add( modelElement, 'addAttribute:bold' ); // Add `bold` attribute insertion on `modelElement` change.\r\n     * modelConsumable.add( modelElement, 'removeAttribute:bold' ); // Add `bold` attribute removal on `modelElement` change.\r\n     * modelConsumable.add( modelSelection, 'selection' ); // Add `modelSelection` to consumable values.\r\n     * modelConsumable.add( modelRange, 'range' ); // Add `modelRange` to consumable values.\r\n     * ```\r\n     *\r\n     * @param item Model item, range or selection that has the consumable.\r\n     * @param type Consumable type. Will be normalized to a proper form, that is either `<word>` or `<part>:<part>`.\r\n     * Second colon and everything after will be cut. Passing event name is a safe and good practice.\r\n     */\r\n    add(item, type) {\r\n        type = _normalizeConsumableType(type);\r\n        if (item instanceof TextProxy) {\r\n            item = this._getSymbolForTextProxy(item);\r\n        }\r\n        if (!this._consumable.has(item)) {\r\n            this._consumable.set(item, new Map());\r\n        }\r\n        this._consumable.get(item).set(type, true);\r\n    }\r\n    /**\r\n     * Removes a given consumable value from a given model item.\r\n     *\r\n     * ```ts\r\n     * modelConsumable.consume( modelElement, 'insert' ); // Remove `modelElement` insertion change from consumable values.\r\n     * modelConsumable.consume( modelElement, 'addAttribute:bold' ); // Remove `bold` attribute insertion on `modelElement` change.\r\n     * modelConsumable.consume( modelElement, 'removeAttribute:bold' ); // Remove `bold` attribute removal on `modelElement` change.\r\n     * modelConsumable.consume( modelSelection, 'selection' ); // Remove `modelSelection` from consumable values.\r\n     * modelConsumable.consume( modelRange, 'range' ); // Remove 'modelRange' from consumable values.\r\n     * ```\r\n     *\r\n     * @param item Model item, range or selection from which consumable will be consumed.\r\n     * @param type Consumable type. Will be normalized to a proper form, that is either `<word>` or `<part>:<part>`.\r\n     * Second colon and everything after will be cut. Passing event name is a safe and good practice.\r\n     * @returns `true` if consumable value was available and was consumed, `false` otherwise.\r\n     */\r\n    consume(item, type) {\r\n        type = _normalizeConsumableType(type);\r\n        if (item instanceof TextProxy) {\r\n            item = this._getSymbolForTextProxy(item);\r\n        }\r\n        if (this.test(item, type)) {\r\n            this._consumable.get(item).set(type, false);\r\n            return true;\r\n        }\r\n        else {\r\n            return false;\r\n        }\r\n    }\r\n    /**\r\n     * Tests whether there is a consumable value of a given type connected with a given model item.\r\n     *\r\n     * ```ts\r\n     * modelConsumable.test( modelElement, 'insert' ); // Check for `modelElement` insertion change.\r\n     * modelConsumable.test( modelElement, 'addAttribute:bold' ); // Check for `bold` attribute insertion on `modelElement` change.\r\n     * modelConsumable.test( modelElement, 'removeAttribute:bold' ); // Check for `bold` attribute removal on `modelElement` change.\r\n     * modelConsumable.test( modelSelection, 'selection' ); // Check if `modelSelection` is consumable.\r\n     * modelConsumable.test( modelRange, 'range' ); // Check if `modelRange` is consumable.\r\n     * ```\r\n     *\r\n     * @param item Model item, range or selection to be tested.\r\n     * @param type Consumable type. Will be normalized to a proper form, that is either `<word>` or `<part>:<part>`.\r\n     * Second colon and everything after will be cut. Passing event name is a safe and good practice.\r\n     * @returns `null` if such consumable was never added, `false` if the consumable values was\r\n     * already consumed or `true` if it was added and not consumed yet.\r\n     */\r\n    test(item, type) {\r\n        type = _normalizeConsumableType(type);\r\n        if (item instanceof TextProxy) {\r\n            item = this._getSymbolForTextProxy(item);\r\n        }\r\n        const itemConsumables = this._consumable.get(item);\r\n        if (itemConsumables === undefined) {\r\n            return null;\r\n        }\r\n        const value = itemConsumables.get(type);\r\n        if (value === undefined) {\r\n            return null;\r\n        }\r\n        return value;\r\n    }\r\n    /**\r\n     * Reverts consuming of a consumable value.\r\n     *\r\n     * ```ts\r\n     * modelConsumable.revert( modelElement, 'insert' ); // Revert consuming `modelElement` insertion change.\r\n     * modelConsumable.revert( modelElement, 'addAttribute:bold' ); // Revert consuming `bold` attribute insert from `modelElement`.\r\n     * modelConsumable.revert( modelElement, 'removeAttribute:bold' ); // Revert consuming `bold` attribute remove from `modelElement`.\r\n     * modelConsumable.revert( modelSelection, 'selection' ); // Revert consuming `modelSelection`.\r\n     * modelConsumable.revert( modelRange, 'range' ); // Revert consuming `modelRange`.\r\n     * ```\r\n     *\r\n     * @param item Model item, range or selection to be reverted.\r\n     * @param type Consumable type.\r\n     * @returns `true` if consumable has been reversed, `false` otherwise. `null` if the consumable has\r\n     * never been added.\r\n     */\r\n    revert(item, type) {\r\n        type = _normalizeConsumableType(type);\r\n        if (item instanceof TextProxy) {\r\n            item = this._getSymbolForTextProxy(item);\r\n        }\r\n        const test = this.test(item, type);\r\n        if (test === false) {\r\n            this._consumable.get(item).set(type, true);\r\n            return true;\r\n        }\r\n        else if (test === true) {\r\n            return false;\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Verifies if all events from the specified group were consumed.\r\n     *\r\n     * @param eventGroup The events group to verify.\r\n     */\r\n    verifyAllConsumed(eventGroup) {\r\n        const items = [];\r\n        for (const [item, consumables] of this._consumable) {\r\n            for (const [event, canConsume] of consumables) {\r\n                const eventPrefix = event.split(':')[0];\r\n                if (canConsume && eventGroup == eventPrefix) {\r\n                    items.push({\r\n                        event,\r\n                        item: item.name || item.description\r\n                    });\r\n                }\r\n            }\r\n        }\r\n        if (items.length) {\r\n            /**\r\n             * Some of the {@link module:engine/model/item~Item model items} were not consumed while downcasting the model to view.\r\n             *\r\n             * This might be the effect of:\r\n             *\r\n             * * A missing converter for some model elements. Make sure that you registered downcast converters for all model elements.\r\n             * * A custom converter that does not consume converted items. Make sure that you\r\n             * {@link module:engine/conversion/modelconsumable~ModelConsumable#consume consumed} all model elements that you converted\r\n             * from the model to the view.\r\n             * * A custom converter that called `event.stop()`. When providing a custom converter, keep in mind that you should not stop\r\n             * the event. If you stop it then the default converter at the `lowest` priority will not trigger the conversion of this node's\r\n             * attributes and child nodes.\r\n             *\r\n             * @error conversion-model-consumable-not-consumed\r\n             * @param {Array.<module:engine/model/item~Item>} items Items that were not consumed.\r\n             */\r\n            throw new CKEditorError('conversion-model-consumable-not-consumed', null, { items });\r\n        }\r\n    }\r\n    /**\r\n     * Gets a unique symbol for the passed {@link module:engine/model/textproxy~TextProxy} instance. All `TextProxy` instances that\r\n     * have same parent, same start index and same end index will get the same symbol.\r\n     *\r\n     * Used internally to correctly consume `TextProxy` instances.\r\n     *\r\n     * @internal\r\n     * @param textProxy `TextProxy` instance to get a symbol for.\r\n     * @returns Symbol representing all equal instances of `TextProxy`.\r\n     */\r\n    _getSymbolForTextProxy(textProxy) {\r\n        let symbol = null;\r\n        const startMap = this._textProxyRegistry.get(textProxy.startOffset);\r\n        if (startMap) {\r\n            const endMap = startMap.get(textProxy.endOffset);\r\n            if (endMap) {\r\n                symbol = endMap.get(textProxy.parent);\r\n            }\r\n        }\r\n        if (!symbol) {\r\n            symbol = this._addSymbolForTextProxy(textProxy);\r\n        }\r\n        return symbol;\r\n    }\r\n    /**\r\n     * Adds a symbol for the given {@link module:engine/model/textproxy~TextProxy} instance.\r\n     *\r\n     * Used internally to correctly consume `TextProxy` instances.\r\n     *\r\n     * @param textProxy Text proxy instance.\r\n     * @returns Symbol generated for given `TextProxy`.\r\n     */\r\n    _addSymbolForTextProxy(textProxy) {\r\n        const start = textProxy.startOffset;\r\n        const end = textProxy.endOffset;\r\n        const parent = textProxy.parent;\r\n        const symbol = Symbol('$textProxy:' + textProxy.data);\r\n        let startMap;\r\n        let endMap;\r\n        startMap = this._textProxyRegistry.get(start);\r\n        if (!startMap) {\r\n            startMap = new Map();\r\n            this._textProxyRegistry.set(start, startMap);\r\n        }\r\n        endMap = startMap.get(end);\r\n        if (!endMap) {\r\n            endMap = new Map();\r\n            startMap.set(end, endMap);\r\n        }\r\n        endMap.set(parent, symbol);\r\n        return symbol;\r\n    }\r\n}\r\n/**\r\n * Returns a normalized consumable type name from the given string. A normalized consumable type name is a string that has\r\n * at most one colon, for example: `insert` or `addMarker:highlight`. If a string to normalize has more \"parts\" (more colons),\r\n * the further parts are dropped, for example: `addattribute:bold:$text` -> `addattributes:bold`.\r\n *\r\n * @param type Consumable type.\r\n * @returns Normalized consumable type.\r\n */\r\nfunction _normalizeConsumableType(type) {\r\n    const parts = type.split(':');\r\n    // For inserts allow passing event name, it's stored in the context of a specified element so the element name is not needed.\r\n    if (parts[0] == 'insert') {\r\n        return parts[0];\r\n    }\r\n    // Markers are identified by the whole name (otherwise we would consume the whole markers group).\r\n    if (parts[0] == 'addMarker' || parts[0] == 'removeMarker') {\r\n        return type;\r\n    }\r\n    return parts.length > 1 ? parts[0] + ':' + parts[1] : parts[0];\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/conversion/downcastdispatcher\r\n */\r\nimport Consumable from './modelconsumable';\r\nimport Range from '../model/range';\r\nimport { EmitterMixin } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * The downcast dispatcher is a central point of downcasting (conversion from the model to the view), which is a process of reacting\r\n * to changes in the model and firing a set of events. The callbacks listening to these events are called converters. The\r\n * converters' role is to convert the model changes to changes in view (for example, adding view nodes or\r\n * changing attributes on view elements).\r\n *\r\n * During the conversion process, downcast dispatcher fires events basing on the state of the model and prepares\r\n * data for these events. It is important to understand that the events are connected with the changes done on the model,\r\n * for example: \"a node has been inserted\" or \"an attribute has changed\". This is in contrary to upcasting (a view-to-model conversion)\r\n * where you convert the view state (view nodes) to a model tree.\r\n *\r\n * The events are prepared basing on a diff created by the {@link module:engine/model/differ~Differ Differ}, which buffers them\r\n * and then passes to the downcast dispatcher as a diff between the old model state and the new model state.\r\n *\r\n * Note that because the changes are converted, there is a need to have a mapping between the model structure and the view structure.\r\n * To map positions and elements during the downcast (a model-to-view conversion), use {@link module:engine/conversion/mapper~Mapper}.\r\n *\r\n * Downcast dispatcher fires the following events for model tree changes:\r\n *\r\n * * {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:insert `insert`} &ndash;\r\n * If a range of nodes was inserted to the model tree.\r\n * * {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:remove `remove`} &ndash;\r\n * If a range of nodes was removed from the model tree.\r\n * * {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:attribute `attribute`} &ndash;\r\n * If an attribute was added, changed or removed from a model node.\r\n *\r\n * For {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:insert `insert`}\r\n * and {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:attribute `attribute`},\r\n * the downcast dispatcher generates {@link module:engine/conversion/modelconsumable~ModelConsumable consumables}.\r\n * These are used to have control over which changes have already been consumed. It is useful when some converters\r\n * overwrite others or convert multiple changes (for example, it converts an insertion of an element and also converts that\r\n * element's attributes during the insertion).\r\n *\r\n * Additionally, downcast dispatcher fires events for {@link module:engine/model/markercollection~Marker marker} changes:\r\n *\r\n * * {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:addMarker `addMarker`} &ndash; If a marker was added.\r\n * * {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:removeMarker `removeMarker`} &ndash; If a marker was\r\n * removed.\r\n *\r\n * Note that changing a marker is done through removing the marker from the old range and adding it to the new range,\r\n * so both of these events are fired.\r\n *\r\n * Finally, a downcast dispatcher also handles firing events for the {@link module:engine/model/selection model selection}\r\n * conversion:\r\n *\r\n * * {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:selection `selection`}\r\n * &ndash; Converts the selection from the model to the view.\r\n * * {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:attribute `attribute`}\r\n * &ndash; Fired for every selection attribute.\r\n * * {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:addMarker `addMarker`}\r\n * &ndash; Fired for every marker that contains a selection.\r\n *\r\n * Unlike the model tree and the markers, the events for selection are not fired for changes but for a selection state.\r\n *\r\n * When providing custom listeners for a downcast dispatcher, remember to check whether a given change has not been\r\n * {@link module:engine/conversion/modelconsumable~ModelConsumable#consume consumed} yet.\r\n *\r\n * When providing custom listeners for a downcast dispatcher, keep in mind that you **should not** stop the event. If you stop it,\r\n * then the default converter at the `lowest` priority will not trigger the conversion of this node's attributes and child nodes.\r\n *\r\n * When providing custom listeners for a downcast dispatcher, remember to use the provided\r\n * {@link module:engine/view/downcastwriter~DowncastWriter view downcast writer} to apply changes to the view document.\r\n *\r\n * You can read more about conversion in the following guide:\r\n *\r\n * * {@glink framework/deep-dive/conversion/downcast Downcast conversion}\r\n *\r\n * An example of a custom converter for the downcast dispatcher:\r\n *\r\n * ```ts\r\n * // You will convert inserting a \"paragraph\" model element into the model.\r\n * downcastDispatcher.on( 'insert:paragraph', ( evt, data, conversionApi ) => {\r\n * \t// Remember to check whether the change has not been consumed yet and consume it.\r\n * \tif ( !conversionApi.consumable.consume( data.item, 'insert' ) ) {\r\n * \t\treturn;\r\n * \t}\r\n *\r\n * \t// Translate the position in the model to a position in the view.\r\n * \tconst viewPosition = conversionApi.mapper.toViewPosition( data.range.start );\r\n *\r\n * \t// Create a <p> element that will be inserted into the view at the `viewPosition`.\r\n * \tconst viewElement = conversionApi.writer.createContainerElement( 'p' );\r\n *\r\n * \t// Bind the newly created view element to the model element so positions will map accordingly in the future.\r\n * \tconversionApi.mapper.bindElements( data.item, viewElement );\r\n *\r\n * \t// Add the newly created view element to the view.\r\n * \tconversionApi.writer.insert( viewPosition, viewElement );\r\n * } );\r\n * ```\r\n */\r\nexport default class DowncastDispatcher extends EmitterMixin() {\r\n    /**\r\n     * Creates a downcast dispatcher instance.\r\n     *\r\n     * @see module:engine/conversion/downcastdispatcher~DowncastConversionApi\r\n     *\r\n     * @param conversionApi Additional properties for an interface that will be passed to events fired\r\n     * by the downcast dispatcher.\r\n     */\r\n    constructor(conversionApi) {\r\n        super();\r\n        this._conversionApi = { dispatcher: this, ...conversionApi };\r\n        this._firedEventsMap = new WeakMap();\r\n    }\r\n    /**\r\n     * Converts changes buffered in the given {@link module:engine/model/differ~Differ model differ}\r\n     * and fires conversion events based on it.\r\n     *\r\n     * @fires insert\r\n     * @fires remove\r\n     * @fires attribute\r\n     * @fires addMarker\r\n     * @fires removeMarker\r\n     * @fires reduceChanges\r\n     * @param differ The differ object with buffered changes.\r\n     * @param markers Markers related to the model fragment to convert.\r\n     * @param writer The view writer that should be used to modify the view document.\r\n     */\r\n    convertChanges(differ, markers, writer) {\r\n        const conversionApi = this._createConversionApi(writer, differ.getRefreshedItems());\r\n        // Before the view is updated, remove markers which have changed.\r\n        for (const change of differ.getMarkersToRemove()) {\r\n            this._convertMarkerRemove(change.name, change.range, conversionApi);\r\n        }\r\n        // Let features modify the change list (for example to allow reconversion).\r\n        const changes = this._reduceChanges(differ.getChanges());\r\n        // Convert changes that happened on model tree.\r\n        for (const entry of changes) {\r\n            if (entry.type === 'insert') {\r\n                this._convertInsert(Range._createFromPositionAndShift(entry.position, entry.length), conversionApi);\r\n            }\r\n            else if (entry.type === 'reinsert') {\r\n                this._convertReinsert(Range._createFromPositionAndShift(entry.position, entry.length), conversionApi);\r\n            }\r\n            else if (entry.type === 'remove') {\r\n                this._convertRemove(entry.position, entry.length, entry.name, conversionApi);\r\n            }\r\n            else {\r\n                // Defaults to 'attribute' change.\r\n                this._convertAttribute(entry.range, entry.attributeKey, entry.attributeOldValue, entry.attributeNewValue, conversionApi);\r\n            }\r\n        }\r\n        for (const markerName of conversionApi.mapper.flushUnboundMarkerNames()) {\r\n            const markerRange = markers.get(markerName).getRange();\r\n            this._convertMarkerRemove(markerName, markerRange, conversionApi);\r\n            this._convertMarkerAdd(markerName, markerRange, conversionApi);\r\n        }\r\n        // After the view is updated, convert markers which have changed.\r\n        for (const change of differ.getMarkersToAdd()) {\r\n            this._convertMarkerAdd(change.name, change.range, conversionApi);\r\n        }\r\n        // Remove mappings for all removed view elements.\r\n        conversionApi.mapper.flushDeferredBindings();\r\n        // Verify if all insert consumables were consumed.\r\n        conversionApi.consumable.verifyAllConsumed('insert');\r\n    }\r\n    /**\r\n     * Starts a conversion of a model range and the provided markers.\r\n     *\r\n     * @fires insert\r\n     * @fires attribute\r\n     * @fires addMarker\r\n     * @param range The inserted range.\r\n     * @param markers The map of markers that should be down-casted.\r\n     * @param writer The view writer that should be used to modify the view document.\r\n     * @param options Optional options object passed to `convertionApi.options`.\r\n     */\r\n    convert(range, markers, writer, options = {}) {\r\n        const conversionApi = this._createConversionApi(writer, undefined, options);\r\n        this._convertInsert(range, conversionApi);\r\n        for (const [name, range] of markers) {\r\n            this._convertMarkerAdd(name, range, conversionApi);\r\n        }\r\n        // Verify if all insert consumables were consumed.\r\n        conversionApi.consumable.verifyAllConsumed('insert');\r\n    }\r\n    /**\r\n     * Starts the model selection conversion.\r\n     *\r\n     * Fires events for a given {@link module:engine/model/selection~Selection selection} to start the selection conversion.\r\n     *\r\n     * @fires selection\r\n     * @fires addMarker\r\n     * @fires attribute\r\n     * @param selection The selection to convert.\r\n     * @param markers Markers connected with the converted model.\r\n     * @param writer View writer that should be used to modify the view document.\r\n     */\r\n    convertSelection(selection, markers, writer) {\r\n        const markersAtSelection = Array.from(markers.getMarkersAtPosition(selection.getFirstPosition()));\r\n        const conversionApi = this._createConversionApi(writer);\r\n        this._addConsumablesForSelection(conversionApi.consumable, selection, markersAtSelection);\r\n        this.fire('selection', { selection }, conversionApi);\r\n        if (!selection.isCollapsed) {\r\n            return;\r\n        }\r\n        for (const marker of markersAtSelection) {\r\n            const markerRange = marker.getRange();\r\n            if (!shouldMarkerChangeBeConverted(selection.getFirstPosition(), marker, conversionApi.mapper)) {\r\n                continue;\r\n            }\r\n            const data = {\r\n                item: selection,\r\n                markerName: marker.name,\r\n                markerRange\r\n            };\r\n            if (conversionApi.consumable.test(selection, 'addMarker:' + marker.name)) {\r\n                this.fire(`addMarker:${marker.name}`, data, conversionApi);\r\n            }\r\n        }\r\n        for (const key of selection.getAttributeKeys()) {\r\n            const data = {\r\n                item: selection,\r\n                range: selection.getFirstRange(),\r\n                attributeKey: key,\r\n                attributeOldValue: null,\r\n                attributeNewValue: selection.getAttribute(key)\r\n            };\r\n            // Do not fire event if the attribute has been consumed.\r\n            if (conversionApi.consumable.test(selection, 'attribute:' + data.attributeKey)) {\r\n                this.fire(`attribute:${data.attributeKey}:$text`, data, conversionApi);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Fires insertion conversion of a range of nodes.\r\n     *\r\n     * For each node in the range, {@link #event:insert `insert` event is fired}. For each attribute on each node,\r\n     * {@link #event:attribute `attribute` event is fired}.\r\n     *\r\n     * @fires insert\r\n     * @fires attribute\r\n     * @param range The inserted range.\r\n     * @param conversionApi The conversion API object.\r\n     * @param options.doNotAddConsumables Whether the ModelConsumable should not get populated\r\n     * for items in the provided range.\r\n     */\r\n    _convertInsert(range, conversionApi, options = {}) {\r\n        if (!options.doNotAddConsumables) {\r\n            // Collect a list of things that can be consumed, consisting of nodes and their attributes.\r\n            this._addConsumablesForInsert(conversionApi.consumable, Array.from(range));\r\n        }\r\n        // Fire a separate insert event for each node and text fragment contained in the range.\r\n        for (const data of Array.from(range.getWalker({ shallow: true })).map(walkerValueToEventData)) {\r\n            this._testAndFire('insert', data, conversionApi);\r\n        }\r\n    }\r\n    /**\r\n     * Fires conversion of a single node removal. Fires {@link #event:remove remove event} with provided data.\r\n     *\r\n     * @param position Position from which node was removed.\r\n     * @param length Offset size of removed node.\r\n     * @param name Name of removed node.\r\n     * @param conversionApi The conversion API object.\r\n     */\r\n    _convertRemove(position, length, name, conversionApi) {\r\n        this.fire(`remove:${name}`, { position, length }, conversionApi);\r\n    }\r\n    /**\r\n     * Starts a conversion of an attribute change on a given `range`.\r\n     *\r\n     * For each node in the given `range`, {@link #event:attribute attribute event} is fired with the passed data.\r\n     *\r\n     * @fires attribute\r\n     * @param range Changed range.\r\n     * @param key Key of the attribute that has changed.\r\n     * @param oldValue Attribute value before the change or `null` if the attribute has not been set before.\r\n     * @param newValue New attribute value or `null` if the attribute has been removed.\r\n     * @param conversionApi The conversion API object.\r\n     */\r\n    _convertAttribute(range, key, oldValue, newValue, conversionApi) {\r\n        // Create a list with attributes to consume.\r\n        this._addConsumablesForRange(conversionApi.consumable, range, `attribute:${key}`);\r\n        // Create a separate attribute event for each node in the range.\r\n        for (const value of range) {\r\n            const data = {\r\n                item: value.item,\r\n                range: Range._createFromPositionAndShift(value.previousPosition, value.length),\r\n                attributeKey: key,\r\n                attributeOldValue: oldValue,\r\n                attributeNewValue: newValue\r\n            };\r\n            this._testAndFire(`attribute:${key}`, data, conversionApi);\r\n        }\r\n    }\r\n    /**\r\n     * Fires re-insertion conversion (with a `reconversion` flag passed to `insert` events)\r\n     * of a range of elements (only elements on the range depth, without children).\r\n     *\r\n     * For each node in the range on its depth (without children), {@link #event:insert `insert` event} is fired.\r\n     * For each attribute on each node, {@link #event:attribute `attribute` event} is fired.\r\n     *\r\n     * @fires insert\r\n     * @fires attribute\r\n     * @param range The range to reinsert.\r\n     * @param conversionApi The conversion API object.\r\n     */\r\n    _convertReinsert(range, conversionApi) {\r\n        // Convert the elements - without converting children.\r\n        const walkerValues = Array.from(range.getWalker({ shallow: true }));\r\n        // Collect a list of things that can be consumed, consisting of nodes and their attributes.\r\n        this._addConsumablesForInsert(conversionApi.consumable, walkerValues);\r\n        // Fire a separate insert event for each node and text fragment contained shallowly in the range.\r\n        for (const data of walkerValues.map(walkerValueToEventData)) {\r\n            this._testAndFire('insert', { ...data, reconversion: true }, conversionApi);\r\n        }\r\n    }\r\n    /**\r\n     * Converts the added marker. Fires the {@link #event:addMarker `addMarker`} event for each item\r\n     * in the marker's range. If the range is collapsed, a single event is dispatched. See the event description for more details.\r\n     *\r\n     * @fires addMarker\r\n     * @param markerName Marker name.\r\n     * @param markerRange The marker range.\r\n     * @param conversionApi The conversion API object.\r\n     */\r\n    _convertMarkerAdd(markerName, markerRange, conversionApi) {\r\n        // Do not convert if range is in graveyard.\r\n        if (markerRange.root.rootName == '$graveyard') {\r\n            return;\r\n        }\r\n        // In markers' case, event name == consumable name.\r\n        const eventName = `addMarker:${markerName}`;\r\n        //\r\n        // First, fire an event for the whole marker.\r\n        //\r\n        conversionApi.consumable.add(markerRange, eventName);\r\n        this.fire(eventName, { markerName, markerRange }, conversionApi);\r\n        //\r\n        // Do not fire events for each item inside the range if the range got consumed.\r\n        // Also consume the whole marker consumable if it wasn't consumed.\r\n        //\r\n        if (!conversionApi.consumable.consume(markerRange, eventName)) {\r\n            return;\r\n        }\r\n        //\r\n        // Then, fire an event for each item inside the marker range.\r\n        //\r\n        this._addConsumablesForRange(conversionApi.consumable, markerRange, eventName);\r\n        for (const item of markerRange.getItems()) {\r\n            // Do not fire event for already consumed items.\r\n            if (!conversionApi.consumable.test(item, eventName)) {\r\n                continue;\r\n            }\r\n            const data = { item, range: Range._createOn(item), markerName, markerRange };\r\n            this.fire(eventName, data, conversionApi);\r\n        }\r\n    }\r\n    /**\r\n     * Fires the conversion of the marker removal. Fires the {@link #event:removeMarker `removeMarker`} event with the provided data.\r\n     *\r\n     * @fires removeMarker\r\n     * @param markerName Marker name.\r\n     * @param markerRange The marker range.\r\n     * @param conversionApi The conversion API object.\r\n     */\r\n    _convertMarkerRemove(markerName, markerRange, conversionApi) {\r\n        // Do not convert if range is in graveyard.\r\n        if (markerRange.root.rootName == '$graveyard') {\r\n            return;\r\n        }\r\n        this.fire(`removeMarker:${markerName}`, { markerName, markerRange }, conversionApi);\r\n    }\r\n    /**\r\n     * Fires the reduction of changes buffered in the {@link module:engine/model/differ~Differ `Differ`}.\r\n     *\r\n     * Features can replace selected {@link module:engine/model/differ~DiffItem `DiffItem`}s with `reinsert` entries to trigger\r\n     * reconversion. The {@link module:engine/conversion/downcasthelpers~DowncastHelpers#elementToStructure\r\n     * `DowncastHelpers.elementToStructure()`} is using this event to trigger reconversion.\r\n     *\r\n     * @fires reduceChanges\r\n     */\r\n    _reduceChanges(changes) {\r\n        const data = { changes };\r\n        this.fire('reduceChanges', data);\r\n        return data.changes;\r\n    }\r\n    /**\r\n     * Populates provided {@link module:engine/conversion/modelconsumable~ModelConsumable} with values to consume from a given range,\r\n     * assuming that the range has just been inserted to the model.\r\n     *\r\n     * @param consumable The consumable.\r\n     * @param walkerValues The walker values for the inserted range.\r\n     * @returns The values to consume.\r\n     */\r\n    _addConsumablesForInsert(consumable, walkerValues) {\r\n        for (const value of walkerValues) {\r\n            const item = value.item;\r\n            // Add consumable if it wasn't there yet.\r\n            if (consumable.test(item, 'insert') === null) {\r\n                consumable.add(item, 'insert');\r\n                for (const key of item.getAttributeKeys()) {\r\n                    consumable.add(item, 'attribute:' + key);\r\n                }\r\n            }\r\n        }\r\n        return consumable;\r\n    }\r\n    /**\r\n     * Populates provided {@link module:engine/conversion/modelconsumable~ModelConsumable} with values to consume for a given range.\r\n     *\r\n     * @param consumable The consumable.\r\n     * @param range The affected range.\r\n     * @param type Consumable type.\r\n     * @returns The values to consume.\r\n     */\r\n    _addConsumablesForRange(consumable, range, type) {\r\n        for (const item of range.getItems()) {\r\n            consumable.add(item, type);\r\n        }\r\n        return consumable;\r\n    }\r\n    /**\r\n     * Populates provided {@link module:engine/conversion/modelconsumable~ModelConsumable} with selection consumable values.\r\n     *\r\n     * @param consumable The consumable.\r\n     * @param selection The selection to create the consumable from.\r\n     * @param markers Markers that contain the selection.\r\n     * @returns The values to consume.\r\n     */\r\n    _addConsumablesForSelection(consumable, selection, markers) {\r\n        consumable.add(selection, 'selection');\r\n        for (const marker of markers) {\r\n            consumable.add(selection, 'addMarker:' + marker.name);\r\n        }\r\n        for (const key of selection.getAttributeKeys()) {\r\n            consumable.add(selection, 'attribute:' + key);\r\n        }\r\n        return consumable;\r\n    }\r\n    /**\r\n     * Tests whether given event wasn't already fired and if so, fires it.\r\n     *\r\n     * @fires insert\r\n     * @fires attribute\r\n     * @param type Event type.\r\n     * @param data Event data.\r\n     * @param conversionApi The conversion API object.\r\n     */\r\n    _testAndFire(type, data, conversionApi) {\r\n        const eventName = getEventName(type, data);\r\n        const itemKey = data.item.is('$textProxy') ? conversionApi.consumable._getSymbolForTextProxy(data.item) : data.item;\r\n        const eventsFiredForConversion = this._firedEventsMap.get(conversionApi);\r\n        const eventsFiredForItem = eventsFiredForConversion.get(itemKey);\r\n        if (!eventsFiredForItem) {\r\n            eventsFiredForConversion.set(itemKey, new Set([eventName]));\r\n        }\r\n        else if (!eventsFiredForItem.has(eventName)) {\r\n            eventsFiredForItem.add(eventName);\r\n        }\r\n        else {\r\n            return;\r\n        }\r\n        this.fire(eventName, data, conversionApi);\r\n    }\r\n    /**\r\n     * Fires not already fired events for setting attributes on just inserted item.\r\n     *\r\n     * @param item The model item to convert attributes for.\r\n     * @param conversionApi The conversion API object.\r\n     */\r\n    _testAndFireAddAttributes(item, conversionApi) {\r\n        const data = {\r\n            item,\r\n            range: Range._createOn(item)\r\n        };\r\n        for (const key of data.item.getAttributeKeys()) {\r\n            data.attributeKey = key;\r\n            data.attributeOldValue = null;\r\n            data.attributeNewValue = data.item.getAttribute(key);\r\n            this._testAndFire(`attribute:${key}`, data, conversionApi);\r\n        }\r\n    }\r\n    /**\r\n     * Builds an instance of the {@link module:engine/conversion/downcastdispatcher~DowncastConversionApi} from a template and a given\r\n     * {@link module:engine/view/downcastwriter~DowncastWriter `DowncastWriter`} and options object.\r\n     *\r\n     * @param writer View writer that should be used to modify the view document.\r\n     * @param refreshedItems A set of model elements that should not reuse their\r\n     * previous view representations.\r\n     * @param options Optional options passed to `convertionApi.options`.\r\n     * @return The conversion API object.\r\n     */\r\n    _createConversionApi(writer, refreshedItems = new Set(), options = {}) {\r\n        const conversionApi = {\r\n            ...this._conversionApi,\r\n            consumable: new Consumable(),\r\n            writer,\r\n            options,\r\n            convertItem: item => this._convertInsert(Range._createOn(item), conversionApi),\r\n            convertChildren: element => this._convertInsert(Range._createIn(element), conversionApi, { doNotAddConsumables: true }),\r\n            convertAttributes: item => this._testAndFireAddAttributes(item, conversionApi),\r\n            canReuseView: viewElement => !refreshedItems.has(conversionApi.mapper.toModelElement(viewElement))\r\n        };\r\n        this._firedEventsMap.set(conversionApi, new Map());\r\n        return conversionApi;\r\n    }\r\n}\r\n/**\r\n * Helper function, checks whether change of `marker` at `modelPosition` should be converted. Marker changes are not\r\n * converted if they happen inside an element with custom conversion method.\r\n */\r\nfunction shouldMarkerChangeBeConverted(modelPosition, marker, mapper) {\r\n    const range = marker.getRange();\r\n    const ancestors = Array.from(modelPosition.getAncestors());\r\n    ancestors.shift(); // Remove root element. It cannot be passed to `model.Range#containsItem`.\r\n    ancestors.reverse();\r\n    const hasCustomHandling = ancestors.some(element => {\r\n        if (range.containsItem(element)) {\r\n            const viewElement = mapper.toViewElement(element);\r\n            return !!viewElement.getCustomProperty('addHighlight');\r\n        }\r\n    });\r\n    return !hasCustomHandling;\r\n}\r\nfunction getEventName(type, data) {\r\n    const name = data.item.is('element') ? data.item.name : '$text';\r\n    return `${type}:${name}`;\r\n}\r\nfunction walkerValueToEventData(value) {\r\n    const item = value.item;\r\n    const itemRange = Range._createFromPositionAndShift(value.previousPosition, value.length);\r\n    return {\r\n        item,\r\n        range: itemRange\r\n    };\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/selection\r\n */\r\nimport TypeCheckable from './typecheckable';\r\nimport Node from './node';\r\nimport Position from './position';\r\nimport Range from './range';\r\nimport { CKEditorError, EmitterMixin, isIterable } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Selection is a set of {@link module:engine/model/range~Range ranges}. It has a direction specified by its\r\n * {@link module:engine/model/selection~Selection#anchor anchor} and {@link module:engine/model/selection~Selection#focus focus}\r\n * (it can be {@link module:engine/model/selection~Selection#isBackward forward or backward}).\r\n * Additionally, selection may have its own attributes (think – whether text typed in in this selection\r\n * should have those attributes – e.g. whether you type a bolded text).\r\n */\r\nexport default class Selection extends EmitterMixin(TypeCheckable) {\r\n    /**\r\n     * Creates a new selection instance based on the given {@link module:engine/model/selection~Selectable selectable}\r\n     * or creates an empty selection if no arguments were passed.\r\n     *\r\n     * ```ts\r\n     * // Creates empty selection without ranges.\r\n     * const selection = writer.createSelection();\r\n     *\r\n     * // Creates selection at the given range.\r\n     * const range = writer.createRange( start, end );\r\n     * const selection = writer.createSelection( range );\r\n     *\r\n     * // Creates selection at the given ranges\r\n     * const ranges = [ writer.createRange( start1, end2 ), writer.createRange( star2, end2 ) ];\r\n     * const selection = writer.createSelection( ranges );\r\n     *\r\n     * // Creates selection from the other selection.\r\n     * // Note: It doesn't copy selection attributes.\r\n     * const otherSelection = writer.createSelection();\r\n     * const selection = writer.createSelection( otherSelection );\r\n     *\r\n     * // Creates selection from the given document selection.\r\n     * // Note: It doesn't copy selection attributes.\r\n     * const documentSelection = model.document.selection;\r\n     * const selection = writer.createSelection( documentSelection );\r\n     *\r\n     * // Creates selection at the given position.\r\n     * const position = writer.createPositionFromPath( root, path );\r\n     * const selection = writer.createSelection( position );\r\n     *\r\n     * // Creates selection at the given offset in the given element.\r\n     * const paragraph = writer.createElement( 'paragraph' );\r\n     * const selection = writer.createSelection( paragraph, offset );\r\n     *\r\n     * // Creates a range inside an {@link module:engine/model/element~Element element} which starts before the\r\n     * // first child of that element and ends after the last child of that element.\r\n     * const selection = writer.createSelection( paragraph, 'in' );\r\n     *\r\n     * // Creates a range on an {@link module:engine/model/item~Item item} which starts before the item and ends\r\n     * // just after the item.\r\n     * const selection = writer.createSelection( paragraph, 'on' );\r\n     * ```\r\n     *\r\n     * Selection's constructor allow passing additional options (`'backward'`) as the last argument.\r\n     *\r\n     * ```ts\r\n     * // Creates backward selection.\r\n     * const selection = writer.createSelection( range, { backward: true } );\r\n     * ```\r\n     *\r\n     * @internal\r\n     */\r\n    constructor(...args) {\r\n        super();\r\n        /**\r\n         * Specifies whether the last added range was added as a backward or forward range.\r\n         */\r\n        this._lastRangeBackward = false;\r\n        /**\r\n         * List of attributes set on current selection.\r\n         */\r\n        this._attrs = new Map();\r\n        /** @internal */\r\n        this._ranges = [];\r\n        if (args.length) {\r\n            this.setTo(...args);\r\n        }\r\n    }\r\n    /**\r\n     * Selection anchor. Anchor is the position from which the selection was started. If a user is making a selection\r\n     * by dragging the mouse, the anchor is where the user pressed the mouse button (the beginning of the selection).\r\n     *\r\n     * Anchor and {@link #focus} define the direction of the selection, which is important\r\n     * when expanding/shrinking selection. The focus moves, while the anchor should remain in the same place.\r\n     *\r\n     * Anchor is always set to the {@link module:engine/model/range~Range#start start} or\r\n     * {@link module:engine/model/range~Range#end end} position of the last of selection's ranges. Whether it is\r\n     * the `start` or `end` depends on the specified `options.backward`. See the {@link #setTo `setTo()`} method.\r\n     *\r\n     * May be set to `null` if there are no ranges in the selection.\r\n     *\r\n     * @see #focus\r\n     */\r\n    get anchor() {\r\n        if (this._ranges.length > 0) {\r\n            const range = this._ranges[this._ranges.length - 1];\r\n            return this._lastRangeBackward ? range.end : range.start;\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Selection focus. Focus is the position where the selection ends. If a user is making a selection\r\n     * by dragging the mouse, the focus is where the mouse cursor is.\r\n     *\r\n     * May be set to `null` if there are no ranges in the selection.\r\n     *\r\n     * @see #anchor\r\n     */\r\n    get focus() {\r\n        if (this._ranges.length > 0) {\r\n            const range = this._ranges[this._ranges.length - 1];\r\n            return this._lastRangeBackward ? range.start : range.end;\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Whether the selection is collapsed. Selection is collapsed when there is exactly one range in it\r\n     * and it is collapsed.\r\n     */\r\n    get isCollapsed() {\r\n        const length = this._ranges.length;\r\n        if (length === 1) {\r\n            return this._ranges[0].isCollapsed;\r\n        }\r\n        else {\r\n            return false;\r\n        }\r\n    }\r\n    /**\r\n     * Returns the number of ranges in the selection.\r\n     */\r\n    get rangeCount() {\r\n        return this._ranges.length;\r\n    }\r\n    /**\r\n     * Specifies whether the selection's {@link #focus} precedes the selection's {@link #anchor}.\r\n     */\r\n    get isBackward() {\r\n        return !this.isCollapsed && this._lastRangeBackward;\r\n    }\r\n    /**\r\n     * Checks whether this selection is equal to the given selection. Selections are equal if they have the same directions,\r\n     * the same number of ranges and all ranges from one selection equal to ranges from the another selection.\r\n     *\r\n     * @param otherSelection Selection to compare with.\r\n     * @returns `true` if selections are equal, `false` otherwise.\r\n     */\r\n    isEqual(otherSelection) {\r\n        if (this.rangeCount != otherSelection.rangeCount) {\r\n            return false;\r\n        }\r\n        else if (this.rangeCount === 0) {\r\n            return true;\r\n        }\r\n        if (!this.anchor.isEqual(otherSelection.anchor) || !this.focus.isEqual(otherSelection.focus)) {\r\n            return false;\r\n        }\r\n        for (const thisRange of this._ranges) {\r\n            let found = false;\r\n            for (const otherRange of otherSelection._ranges) {\r\n                if (thisRange.isEqual(otherRange)) {\r\n                    found = true;\r\n                    break;\r\n                }\r\n            }\r\n            if (!found) {\r\n                return false;\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n    /**\r\n     * Returns an iterable object that iterates over copies of selection ranges.\r\n     */\r\n    *getRanges() {\r\n        for (const range of this._ranges) {\r\n            yield new Range(range.start, range.end);\r\n        }\r\n    }\r\n    /**\r\n     * Returns a copy of the first range in the selection.\r\n     * First range is the one which {@link module:engine/model/range~Range#start start} position\r\n     * {@link module:engine/model/position~Position#isBefore is before} start position of all other ranges\r\n     * (not to confuse with the first range added to the selection).\r\n     *\r\n     * Returns `null` if there are no ranges in selection.\r\n     */\r\n    getFirstRange() {\r\n        let first = null;\r\n        for (const range of this._ranges) {\r\n            if (!first || range.start.isBefore(first.start)) {\r\n                first = range;\r\n            }\r\n        }\r\n        return first ? new Range(first.start, first.end) : null;\r\n    }\r\n    /**\r\n     * Returns a copy of the last range in the selection.\r\n     * Last range is the one which {@link module:engine/model/range~Range#end end} position\r\n     * {@link module:engine/model/position~Position#isAfter is after} end position of all other ranges (not to confuse with the range most\r\n     * recently added to the selection).\r\n     *\r\n     * Returns `null` if there are no ranges in selection.\r\n     */\r\n    getLastRange() {\r\n        let last = null;\r\n        for (const range of this._ranges) {\r\n            if (!last || range.end.isAfter(last.end)) {\r\n                last = range;\r\n            }\r\n        }\r\n        return last ? new Range(last.start, last.end) : null;\r\n    }\r\n    /**\r\n     * Returns the first position in the selection.\r\n     * First position is the position that {@link module:engine/model/position~Position#isBefore is before}\r\n     * any other position in the selection.\r\n     *\r\n     * Returns `null` if there are no ranges in selection.\r\n     */\r\n    getFirstPosition() {\r\n        const first = this.getFirstRange();\r\n        return first ? first.start.clone() : null;\r\n    }\r\n    /**\r\n     * Returns the last position in the selection.\r\n     * Last position is the position that {@link module:engine/model/position~Position#isAfter is after}\r\n     * any other position in the selection.\r\n     *\r\n     * Returns `null` if there are no ranges in selection.\r\n     */\r\n    getLastPosition() {\r\n        const lastRange = this.getLastRange();\r\n        return lastRange ? lastRange.end.clone() : null;\r\n    }\r\n    /**\r\n     * Sets this selection's ranges and direction to the specified location based on the given\r\n     * {@link module:engine/model/selection~Selectable selectable}.\r\n     *\r\n     * ```ts\r\n     * // Removes all selection's ranges.\r\n     * selection.setTo( null );\r\n     *\r\n     * // Sets selection to the given range.\r\n     * const range = writer.createRange( start, end );\r\n     * selection.setTo( range );\r\n     *\r\n     * // Sets selection to given ranges.\r\n     * const ranges = [ writer.createRange( start1, end2 ), writer.createRange( star2, end2 ) ];\r\n     * selection.setTo( ranges );\r\n     *\r\n     * // Sets selection to other selection.\r\n     * // Note: It doesn't copy selection attributes.\r\n     * const otherSelection = writer.createSelection();\r\n     * selection.setTo( otherSelection );\r\n     *\r\n     * // Sets selection to the given document selection.\r\n     * // Note: It doesn't copy selection attributes.\r\n     * const documentSelection = new DocumentSelection( doc );\r\n     * selection.setTo( documentSelection );\r\n     *\r\n     * // Sets collapsed selection at the given position.\r\n     * const position = writer.createPositionFromPath( root, path );\r\n     * selection.setTo( position );\r\n     *\r\n     * // Sets collapsed selection at the position of the given node and an offset.\r\n     * selection.setTo( paragraph, offset );\r\n     * ```\r\n     *\r\n     * Creates a range inside an {@link module:engine/model/element~Element element} which starts before the first child of\r\n     * that element and ends after the last child of that element.\r\n     *\r\n     * ```ts\r\n     * selection.setTo( paragraph, 'in' );\r\n     * ```\r\n     *\r\n     * Creates a range on an {@link module:engine/model/item~Item item} which starts before the item and ends just after the item.\r\n     *\r\n     * ```ts\r\n     * selection.setTo( paragraph, 'on' );\r\n     * ```\r\n     *\r\n     * `Selection#setTo()`' method allow passing additional options (`backward`) as the last argument.\r\n     *\r\n     * ```ts\r\n     * // Sets backward selection.\r\n     * const selection = writer.createSelection( range, { backward: true } );\r\n     * ```\r\n     */\r\n    setTo(...args) {\r\n        let [selectable, placeOrOffset, options] = args;\r\n        if (typeof placeOrOffset == 'object') {\r\n            options = placeOrOffset;\r\n            placeOrOffset = undefined;\r\n        }\r\n        if (selectable === null) {\r\n            this._setRanges([]);\r\n        }\r\n        else if (selectable instanceof Selection) {\r\n            this._setRanges(selectable.getRanges(), selectable.isBackward);\r\n        }\r\n        else if (selectable && typeof selectable.getRanges == 'function') {\r\n            // We assume that the selectable is a DocumentSelection.\r\n            // It can't be imported here, because it would lead to circular imports.\r\n            this._setRanges(selectable.getRanges(), selectable.isBackward);\r\n        }\r\n        else if (selectable instanceof Range) {\r\n            this._setRanges([selectable], !!options && !!options.backward);\r\n        }\r\n        else if (selectable instanceof Position) {\r\n            this._setRanges([new Range(selectable)]);\r\n        }\r\n        else if (selectable instanceof Node) {\r\n            const backward = !!options && !!options.backward;\r\n            let range;\r\n            if (placeOrOffset == 'in') {\r\n                range = Range._createIn(selectable);\r\n            }\r\n            else if (placeOrOffset == 'on') {\r\n                range = Range._createOn(selectable);\r\n            }\r\n            else if (placeOrOffset !== undefined) {\r\n                range = new Range(Position._createAt(selectable, placeOrOffset));\r\n            }\r\n            else {\r\n                /**\r\n                 * selection.setTo requires the second parameter when the first parameter is a node.\r\n                 *\r\n                 * @error model-selection-setto-required-second-parameter\r\n                 */\r\n                throw new CKEditorError('model-selection-setto-required-second-parameter', [this, selectable]);\r\n            }\r\n            this._setRanges([range], backward);\r\n        }\r\n        else if (isIterable(selectable)) {\r\n            // We assume that the selectable is an iterable of ranges.\r\n            this._setRanges(selectable, options && !!options.backward);\r\n        }\r\n        else {\r\n            /**\r\n             * Cannot set the selection to the given place.\r\n             *\r\n             * Invalid parameters were specified when setting the selection. Common issues:\r\n             *\r\n             * * A {@link module:engine/model/textproxy~TextProxy} instance was passed instead of\r\n             * a real {@link module:engine/model/text~Text}.\r\n             * * View nodes were passed instead of model nodes.\r\n             * * `null`/`undefined` was passed.\r\n             *\r\n             * @error model-selection-setto-not-selectable\r\n             */\r\n            throw new CKEditorError('model-selection-setto-not-selectable', [this, selectable]);\r\n        }\r\n    }\r\n    /**\r\n     * Replaces all ranges that were added to the selection with given array of ranges. Last range of the array\r\n     * is treated like the last added range and is used to set {@link module:engine/model/selection~Selection#anchor} and\r\n     * {@link module:engine/model/selection~Selection#focus}. Accepts a flag describing in which direction the selection is made.\r\n     *\r\n     * @fires change:range\r\n     * @param newRanges Ranges to set.\r\n     * @param isLastBackward Flag describing if last added range was selected forward - from start to end (`false`)\r\n     * or backward - from end to start (`true`).\r\n     */\r\n    _setRanges(newRanges, isLastBackward = false) {\r\n        const ranges = Array.from(newRanges);\r\n        // Check whether there is any range in new ranges set that is different than all already added ranges.\r\n        const anyNewRange = ranges.some(newRange => {\r\n            if (!(newRange instanceof Range)) {\r\n                /**\r\n                 * Selection range set to an object that is not an instance of {@link module:engine/model/range~Range}.\r\n                 *\r\n                 * Only {@link module:engine/model/range~Range} instances can be used to set a selection.\r\n                 * Common mistakes leading to this error are:\r\n                 *\r\n                 * * using DOM `Range` object,\r\n                 * * incorrect CKEditor 5 installation with multiple `ckeditor5-engine` packages having different versions.\r\n                 *\r\n                 * @error model-selection-set-ranges-not-range\r\n                 */\r\n                throw new CKEditorError('model-selection-set-ranges-not-range', [this, newRanges]);\r\n            }\r\n            return this._ranges.every(oldRange => {\r\n                return !oldRange.isEqual(newRange);\r\n            });\r\n        });\r\n        // Don't do anything if nothing changed.\r\n        if (ranges.length === this._ranges.length && !anyNewRange) {\r\n            return;\r\n        }\r\n        this._replaceAllRanges(ranges);\r\n        this._lastRangeBackward = !!isLastBackward;\r\n        this.fire('change:range', { directChange: true });\r\n    }\r\n    /**\r\n     * Moves {@link module:engine/model/selection~Selection#focus} to the specified location.\r\n     *\r\n     * The location can be specified in the same form as\r\n     * {@link module:engine/model/writer~Writer#createPositionAt writer.createPositionAt()} parameters.\r\n     *\r\n     * @fires change:range\r\n     * @param offset Offset or one of the flags. Used only when first parameter is a {@link module:engine/model/item~Item model item}.\r\n     */\r\n    setFocus(itemOrPosition, offset) {\r\n        if (this.anchor === null) {\r\n            /**\r\n             * Cannot set selection focus if there are no ranges in selection.\r\n             *\r\n             * @error model-selection-setfocus-no-ranges\r\n             */\r\n            throw new CKEditorError('model-selection-setfocus-no-ranges', [this, itemOrPosition]);\r\n        }\r\n        const newFocus = Position._createAt(itemOrPosition, offset);\r\n        if (newFocus.compareWith(this.focus) == 'same') {\r\n            return;\r\n        }\r\n        const anchor = this.anchor;\r\n        if (this._ranges.length) {\r\n            this._popRange();\r\n        }\r\n        if (newFocus.compareWith(anchor) == 'before') {\r\n            this._pushRange(new Range(newFocus, anchor));\r\n            this._lastRangeBackward = true;\r\n        }\r\n        else {\r\n            this._pushRange(new Range(anchor, newFocus));\r\n            this._lastRangeBackward = false;\r\n        }\r\n        this.fire('change:range', { directChange: true });\r\n    }\r\n    /**\r\n     * Gets an attribute value for given key or `undefined` if that attribute is not set on the selection.\r\n     *\r\n     * @param key Key of attribute to look for.\r\n     * @returns Attribute value or `undefined`.\r\n     */\r\n    getAttribute(key) {\r\n        return this._attrs.get(key);\r\n    }\r\n    /**\r\n     * Returns iterable that iterates over this selection's attributes.\r\n     *\r\n     * Attributes are returned as arrays containing two items. First one is attribute key and second is attribute value.\r\n     * This format is accepted by native `Map` object and also can be passed in `Node` constructor.\r\n     */\r\n    getAttributes() {\r\n        return this._attrs.entries();\r\n    }\r\n    /**\r\n     * Returns iterable that iterates over this selection's attribute keys.\r\n     */\r\n    getAttributeKeys() {\r\n        return this._attrs.keys();\r\n    }\r\n    /**\r\n     * Checks if the selection has an attribute for given key.\r\n     *\r\n     * @param key Key of attribute to check.\r\n     * @returns `true` if attribute with given key is set on selection, `false` otherwise.\r\n     */\r\n    hasAttribute(key) {\r\n        return this._attrs.has(key);\r\n    }\r\n    /**\r\n     * Removes an attribute with given key from the selection.\r\n     *\r\n     * If given attribute was set on the selection, fires the {@link #event:change:range} event with\r\n     * removed attribute key.\r\n     *\r\n     * @fires change:attribute\r\n     * @param key Key of attribute to remove.\r\n     */\r\n    removeAttribute(key) {\r\n        if (this.hasAttribute(key)) {\r\n            this._attrs.delete(key);\r\n            this.fire('change:attribute', { attributeKeys: [key], directChange: true });\r\n        }\r\n    }\r\n    /**\r\n     * Sets attribute on the selection. If attribute with the same key already is set, it's value is overwritten.\r\n     *\r\n     * If the attribute value has changed, fires the {@link #event:change:range} event with\r\n     * the attribute key.\r\n     *\r\n     * @fires change:attribute\r\n     * @param key Key of attribute to set.\r\n     * @param value Attribute value.\r\n     */\r\n    setAttribute(key, value) {\r\n        if (this.getAttribute(key) !== value) {\r\n            this._attrs.set(key, value);\r\n            this.fire('change:attribute', { attributeKeys: [key], directChange: true });\r\n        }\r\n    }\r\n    /**\r\n     * Returns the selected element. {@link module:engine/model/element~Element Element} is considered as selected if there is only\r\n     * one range in the selection, and that range contains exactly one element.\r\n     * Returns `null` if there is no selected element.\r\n     */\r\n    getSelectedElement() {\r\n        if (this.rangeCount !== 1) {\r\n            return null;\r\n        }\r\n        return this.getFirstRange().getContainedElement();\r\n    }\r\n    /**\r\n     * Gets elements of type {@link module:engine/model/schema~Schema#isBlock \"block\"} touched by the selection.\r\n     *\r\n     * This method's result can be used for example to apply block styling to all blocks covered by this selection.\r\n     *\r\n     * **Note:** `getSelectedBlocks()` returns blocks that are nested in other non-block elements\r\n     * but will not return blocks nested in other blocks.\r\n     *\r\n     * In this case the function will return exactly all 3 paragraphs (note: `<blockQuote>` is not a block itself):\r\n     *\r\n     * ```xml\r\n     * <paragraph>[a</paragraph>\r\n     * <blockQuote>\r\n     * \t<paragraph>b</paragraph>\r\n     * </blockQuote>\r\n     * <paragraph>c]d</paragraph>\r\n     * ```\r\n     *\r\n     * In this case the paragraph will also be returned, despite the collapsed selection:\r\n     *\r\n     * ```xml\r\n     * <paragraph>[]a</paragraph>\r\n     * ```\r\n     *\r\n     * In such a scenario, however, only blocks A, B & E will be returned as blocks C & D are nested in block B:\r\n     *\r\n     * ```xml\r\n     * [<blockA></blockA>\r\n     * <blockB>\r\n     * \t<blockC></blockC>\r\n     * \t<blockD></blockD>\r\n     * </blockB>\r\n     * <blockE></blockE>]\r\n     * ```\r\n     *\r\n     * If the selection is inside a block all the inner blocks (A & B) are returned:\r\n     *\r\n     * ```xml\r\n     * <block>\r\n     * \t<blockA>[a</blockA>\r\n     * \t<blockB>b]</blockB>\r\n     * </block>\r\n     * ```\r\n     *\r\n     * **Special case**: Selection ignores first and/or last blocks if nothing (from user perspective) is selected in them.\r\n     *\r\n     * ```xml\r\n     * // Selection ends and the beginning of the last block.\r\n     * <paragraph>[a</paragraph>\r\n     * <paragraph>b</paragraph>\r\n     * <paragraph>]c</paragraph> // This block will not be returned\r\n     *\r\n     * // Selection begins at the end of the first block.\r\n     * <paragraph>a[</paragraph> // This block will not be returned\r\n     * <paragraph>b</paragraph>\r\n     * <paragraph>c]</paragraph>\r\n     *\r\n     * // Selection begings at the end of the first block and ends at the beginning of the last block.\r\n     * <paragraph>a[</paragraph> // This block will not be returned\r\n     * <paragraph>b</paragraph>\r\n     * <paragraph>]c</paragraph> // This block will not be returned\r\n     * ```\r\n     */\r\n    *getSelectedBlocks() {\r\n        const visited = new WeakSet();\r\n        for (const range of this.getRanges()) {\r\n            // Get start block of range in case of a collapsed range.\r\n            const startBlock = getParentBlock(range.start, visited);\r\n            if (isStartBlockSelected(startBlock, range)) {\r\n                yield startBlock;\r\n            }\r\n            for (const value of range.getWalker()) {\r\n                const block = value.item;\r\n                if (value.type == 'elementEnd' && isUnvisitedTopBlock(block, visited, range)) {\r\n                    yield block;\r\n                }\r\n            }\r\n            const endBlock = getParentBlock(range.end, visited);\r\n            if (isEndBlockSelected(endBlock, range)) {\r\n                yield endBlock;\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Checks whether the selection contains the entire content of the given element. This means that selection must start\r\n     * at a position {@link module:engine/model/position~Position#isTouching touching} the element's start and ends at position\r\n     * touching the element's end.\r\n     *\r\n     * By default, this method will check whether the entire content of the selection's current root is selected.\r\n     * Useful to check if e.g. the user has just pressed <kbd>Ctrl</kbd> + <kbd>A</kbd>.\r\n     */\r\n    containsEntireContent(element = this.anchor.root) {\r\n        const limitStartPosition = Position._createAt(element, 0);\r\n        const limitEndPosition = Position._createAt(element, 'end');\r\n        return limitStartPosition.isTouching(this.getFirstPosition()) &&\r\n            limitEndPosition.isTouching(this.getLastPosition());\r\n    }\r\n    /**\r\n     * Adds given range to internal {@link #_ranges ranges array}. Throws an error\r\n     * if given range is intersecting with any range that is already stored in this selection.\r\n     */\r\n    _pushRange(range) {\r\n        this._checkRange(range);\r\n        this._ranges.push(new Range(range.start, range.end));\r\n    }\r\n    /**\r\n     * Checks if given range intersects with ranges that are already in the selection. Throws an error if it does.\r\n     */\r\n    _checkRange(range) {\r\n        for (let i = 0; i < this._ranges.length; i++) {\r\n            if (range.isIntersecting(this._ranges[i])) {\r\n                /**\r\n                 * Trying to add a range that intersects with another range in the selection.\r\n                 *\r\n                 * @error model-selection-range-intersects\r\n                 * @param addedRange Range that was added to the selection.\r\n                 * @param intersectingRange Range in the selection that intersects with `addedRange`.\r\n                 */\r\n                throw new CKEditorError('model-selection-range-intersects', [this, range], { addedRange: range, intersectingRange: this._ranges[i] });\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Replaces all the ranges by the given ones.\r\n     * Uses {@link #_popRange _popRange} and {@link #_pushRange _pushRange} to ensure proper ranges removal and addition.\r\n     */\r\n    _replaceAllRanges(ranges) {\r\n        this._removeAllRanges();\r\n        for (const range of ranges) {\r\n            this._pushRange(range);\r\n        }\r\n    }\r\n    /**\r\n     * Deletes ranges from internal range array. Uses {@link #_popRange _popRange} to\r\n     * ensure proper ranges removal.\r\n     */\r\n    _removeAllRanges() {\r\n        while (this._ranges.length > 0) {\r\n            this._popRange();\r\n        }\r\n    }\r\n    /**\r\n     * Removes most recently added range from the selection.\r\n     */\r\n    _popRange() {\r\n        this._ranges.pop();\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nSelection.prototype.is = function (type) {\r\n    return type === 'selection' || type === 'model:selection';\r\n};\r\n/**\r\n * Checks whether the given element extends $block in the schema and has a parent (is not a root).\r\n * Marks it as already visited.\r\n */\r\nfunction isUnvisitedBlock(element, visited) {\r\n    if (visited.has(element)) {\r\n        return false;\r\n    }\r\n    visited.add(element);\r\n    return element.root.document.model.schema.isBlock(element) && !!element.parent;\r\n}\r\n/**\r\n * Checks if the given element is a $block was not previously visited and is a top block in a range.\r\n */\r\nfunction isUnvisitedTopBlock(element, visited, range) {\r\n    return isUnvisitedBlock(element, visited) && isTopBlockInRange(element, range);\r\n}\r\n/**\r\n * Finds the lowest element in position's ancestors which is a block.\r\n * It will search until first ancestor that is a limit element.\r\n * Marks all ancestors as already visited to not include any of them later on.\r\n */\r\nfunction getParentBlock(position, visited) {\r\n    const element = position.parent;\r\n    const schema = element.root.document.model.schema;\r\n    const ancestors = position.parent.getAncestors({ parentFirst: true, includeSelf: true });\r\n    let hasParentLimit = false;\r\n    const block = ancestors.find((element) => {\r\n        // Stop searching after first parent node that is limit element.\r\n        if (hasParentLimit) {\r\n            return false;\r\n        }\r\n        hasParentLimit = schema.isLimit(element);\r\n        return !hasParentLimit && isUnvisitedBlock(element, visited);\r\n    });\r\n    // Mark all ancestors of this position's parent, because find() might've stopped early and\r\n    // the found block may be a child of another block.\r\n    ancestors.forEach(element => visited.add(element));\r\n    return block;\r\n}\r\n/**\r\n * Checks if the blocks is not nested in other block inside a range.\r\n */\r\nfunction isTopBlockInRange(block, range) {\r\n    const parentBlock = findAncestorBlock(block);\r\n    if (!parentBlock) {\r\n        return true;\r\n    }\r\n    // Add loose flag to check as parentRange can be equal to range.\r\n    const isParentInRange = range.containsRange(Range._createOn(parentBlock), true);\r\n    return !isParentInRange;\r\n}\r\n/**\r\n * If a selection starts at the end of a block, that block is not returned as from the user's perspective this block wasn't selected.\r\n * See [#11585](https://github.com/ckeditor/ckeditor5/issues/11585) for more details.\r\n *\r\n * ```xml\r\n * <paragraph>a[</paragraph> // This block will not be returned\r\n * <paragraph>b</paragraph>\r\n * <paragraph>c]</paragraph>\r\n * ```\r\n *\r\n * Collapsed selection is not affected by it:\r\n *\r\n * ```xml\r\n * <paragraph>a[]</paragraph> // This block will be returned\r\n * ```\r\n */\r\nfunction isStartBlockSelected(startBlock, range) {\r\n    if (!startBlock) {\r\n        return false;\r\n    }\r\n    if (range.isCollapsed || startBlock.isEmpty) {\r\n        return true;\r\n    }\r\n    if (range.start.isTouching(Position._createAt(startBlock, startBlock.maxOffset))) {\r\n        return false;\r\n    }\r\n    return isTopBlockInRange(startBlock, range);\r\n}\r\n/**\r\n * If a selection ends at the beginning of a block, that block is not returned as from the user's perspective this block wasn't selected.\r\n * See [#984](https://github.com/ckeditor/ckeditor5-engine/issues/984) for more details.\r\n *\r\n * ```xml\r\n * <paragraph>[a</paragraph>\r\n * <paragraph>b</paragraph>\r\n * <paragraph>]c</paragraph> // this block will not be returned\r\n * ```\r\n *\r\n * Collapsed selection is not affected by it:\r\n *\r\n * ```xml\r\n * <paragraph>[]a</paragraph> // this block will be returned\r\n * ```\r\n */\r\nfunction isEndBlockSelected(endBlock, range) {\r\n    if (!endBlock) {\r\n        return false;\r\n    }\r\n    if (range.isCollapsed || endBlock.isEmpty) {\r\n        return true;\r\n    }\r\n    if (range.end.isTouching(Position._createAt(endBlock, 0))) {\r\n        return false;\r\n    }\r\n    return isTopBlockInRange(endBlock, range);\r\n}\r\n/**\r\n * Returns first ancestor block of a node.\r\n */\r\nfunction findAncestorBlock(node) {\r\n    const schema = node.root.document.model.schema;\r\n    let parent = node.parent;\r\n    while (parent) {\r\n        if (schema.isBlock(parent)) {\r\n            return parent;\r\n        }\r\n        parent = parent.parent;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/liverange\r\n */\r\nimport Range from './range';\r\nimport { EmitterMixin } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * `LiveRange` is a type of {@link module:engine/model/range~Range Range}\r\n * that updates itself as {@link module:engine/model/document~Document document}\r\n * is changed through operations. It may be used as a bookmark.\r\n *\r\n * **Note:** Be very careful when dealing with `LiveRange`. Each `LiveRange` instance bind events that might\r\n * have to be unbound. Use {@link module:engine/model/liverange~LiveRange#detach detach} whenever you don't need `LiveRange` anymore.\r\n */\r\nexport default class LiveRange extends EmitterMixin(Range) {\r\n    /**\r\n     * Creates a live range.\r\n     *\r\n     * @see module:engine/model/range~Range\r\n     */\r\n    constructor(start, end) {\r\n        super(start, end);\r\n        bindWithDocument.call(this);\r\n    }\r\n    /**\r\n     * Unbinds all events previously bound by `LiveRange`. Use it whenever you don't need `LiveRange` instance\r\n     * anymore (i.e. when leaving scope in which it was declared or before re-assigning variable that was\r\n     * referring to it).\r\n     */\r\n    detach() {\r\n        this.stopListening();\r\n    }\r\n    /**\r\n     * Creates a {@link module:engine/model/range~Range range instance} that is equal to this live range.\r\n     */\r\n    toRange() {\r\n        return new Range(this.start, this.end);\r\n    }\r\n    /**\r\n     * Creates a `LiveRange` instance that is equal to the given range.\r\n     */\r\n    static fromRange(range) {\r\n        return new LiveRange(range.start, range.end);\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nLiveRange.prototype.is = function (type) {\r\n    return type === 'liveRange' || type === 'model:liveRange' ||\r\n        // From super.is(). This is highly utilised method and cannot call super. See ckeditor/ckeditor5#6529.\r\n        type == 'range' || type === 'model:range';\r\n};\r\n/**\r\n * Binds this `LiveRange` to the {@link module:engine/model/document~Document document}\r\n * that owns this range's {@link module:engine/model/range~Range#root root}.\r\n */\r\nfunction bindWithDocument() {\r\n    this.listenTo(this.root.document.model, 'applyOperation', (event, args) => {\r\n        const operation = args[0];\r\n        if (!operation.isDocumentOperation) {\r\n            return;\r\n        }\r\n        transform.call(this, operation);\r\n    }, { priority: 'low' });\r\n}\r\n/**\r\n * Updates this range accordingly to the updates applied to the model. Bases on change events.\r\n */\r\nfunction transform(operation) {\r\n    // Transform the range by the operation. Join the result ranges if needed.\r\n    const ranges = this.getTransformedByOperation(operation);\r\n    const result = Range._createFromRanges(ranges);\r\n    const boundariesChanged = !result.isEqual(this);\r\n    const contentChanged = doesOperationChangeRangeContent(this, operation);\r\n    let deletionPosition = null;\r\n    if (boundariesChanged) {\r\n        // If range boundaries have changed, fire `change:range` event.\r\n        //\r\n        if (result.root.rootName == '$graveyard') {\r\n            // If the range was moved to the graveyard root, set `deletionPosition`.\r\n            if (operation.type == 'remove') {\r\n                deletionPosition = operation.sourcePosition;\r\n            }\r\n            else {\r\n                // Merge operation.\r\n                deletionPosition = operation.deletionPosition;\r\n            }\r\n        }\r\n        const oldRange = this.toRange();\r\n        this.start = result.start;\r\n        this.end = result.end;\r\n        this.fire('change:range', oldRange, { deletionPosition });\r\n    }\r\n    else if (contentChanged) {\r\n        // If range boundaries have not changed, but there was change inside the range, fire `change:content` event.\r\n        this.fire('change:content', this.toRange(), { deletionPosition });\r\n    }\r\n}\r\n/**\r\n * Checks whether given operation changes something inside the range (even if it does not change boundaries).\r\n */\r\nfunction doesOperationChangeRangeContent(range, operation) {\r\n    switch (operation.type) {\r\n        case 'insert':\r\n            return range.containsPosition(operation.position);\r\n        case 'move':\r\n        case 'remove':\r\n        case 'reinsert':\r\n        case 'merge':\r\n            return range.containsPosition(operation.sourcePosition) ||\r\n                range.start.isEqual(operation.sourcePosition) ||\r\n                range.containsPosition(operation.targetPosition);\r\n        case 'split':\r\n            return range.containsPosition(operation.splitPosition) || range.containsPosition(operation.insertionPosition);\r\n    }\r\n    return false;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/documentselection\r\n */\r\nimport TypeCheckable from './typecheckable';\r\nimport LiveRange from './liverange';\r\nimport Selection from './selection';\r\nimport Text from './text';\r\nimport TextProxy from './textproxy';\r\nimport { CKEditorError, Collection, EmitterMixin, toMap, uid } from '@ckeditor/ckeditor5-utils';\r\nconst storePrefix = 'selection:';\r\n/**\r\n * `DocumentSelection` is a special selection which is used as the\r\n * {@link module:engine/model/document~Document#selection document's selection}.\r\n * There can be only one instance of `DocumentSelection` per document.\r\n *\r\n * Document selection can only be changed by using the {@link module:engine/model/writer~Writer} instance\r\n * inside the {@link module:engine/model/model~Model#change `change()`} block, as it provides a secure way to modify model.\r\n *\r\n * `DocumentSelection` is automatically updated upon changes in the {@link module:engine/model/document~Document document}\r\n * to always contain valid ranges. Its attributes are inherited from the text unless set explicitly.\r\n *\r\n * Differences between {@link module:engine/model/selection~Selection} and `DocumentSelection` are:\r\n * * there is always a range in `DocumentSelection` - even if no ranges were added there is a \"default range\"\r\n * present in the selection,\r\n * * ranges added to this selection updates automatically when the document changes,\r\n * * attributes of `DocumentSelection` are updated automatically according to selection ranges.\r\n *\r\n * Since `DocumentSelection` uses {@link module:engine/model/liverange~LiveRange live ranges}\r\n * and is updated when {@link module:engine/model/document~Document document}\r\n * changes, it cannot be set on {@link module:engine/model/node~Node nodes}\r\n * that are inside {@link module:engine/model/documentfragment~DocumentFragment document fragment}.\r\n * If you need to represent a selection in document fragment,\r\n * use {@link module:engine/model/selection~Selection Selection class} instead.\r\n */\r\nexport default class DocumentSelection extends EmitterMixin(TypeCheckable) {\r\n    /**\r\n     * Creates an empty live selection for given {@link module:engine/model/document~Document}.\r\n     *\r\n     * @param doc Document which owns this selection.\r\n     */\r\n    constructor(doc) {\r\n        super();\r\n        this._selection = new LiveSelection(doc);\r\n        this._selection.delegate('change:range').to(this);\r\n        this._selection.delegate('change:attribute').to(this);\r\n        this._selection.delegate('change:marker').to(this);\r\n    }\r\n    /**\r\n     * Describes whether the selection is collapsed. Selection is collapsed when there is exactly one range which is\r\n     * collapsed.\r\n     */\r\n    get isCollapsed() {\r\n        return this._selection.isCollapsed;\r\n    }\r\n    /**\r\n     * Selection anchor. Anchor may be described as a position where the most recent part of the selection starts.\r\n     * Together with {@link #focus} they define the direction of selection, which is important\r\n     * when expanding/shrinking selection. Anchor is always {@link module:engine/model/range~Range#start start} or\r\n     * {@link module:engine/model/range~Range#end end} position of the most recently added range.\r\n     *\r\n     * Is set to `null` if there are no ranges in selection.\r\n     *\r\n     * @see #focus\r\n     */\r\n    get anchor() {\r\n        return this._selection.anchor;\r\n    }\r\n    /**\r\n     * Selection focus. Focus is a position where the selection ends.\r\n     *\r\n     * Is set to `null` if there are no ranges in selection.\r\n     *\r\n     * @see #anchor\r\n     */\r\n    get focus() {\r\n        return this._selection.focus;\r\n    }\r\n    /**\r\n     * Number of ranges in selection.\r\n     */\r\n    get rangeCount() {\r\n        return this._selection.rangeCount;\r\n    }\r\n    /**\r\n     * Describes whether `Documentselection` has own range(s) set, or if it is defaulted to\r\n     * {@link module:engine/model/document~Document#_getDefaultRange document's default range}.\r\n     */\r\n    get hasOwnRange() {\r\n        return this._selection.hasOwnRange;\r\n    }\r\n    /**\r\n     * Specifies whether the {@link #focus}\r\n     * precedes {@link #anchor}.\r\n     *\r\n     * @readonly\r\n     * @type {Boolean}\r\n     */\r\n    get isBackward() {\r\n        return this._selection.isBackward;\r\n    }\r\n    /**\r\n     * Describes whether the gravity is overridden (using {@link module:engine/model/writer~Writer#overrideSelectionGravity}) or not.\r\n     *\r\n     * Note that the gravity remains overridden as long as will not be restored the same number of times as it was overridden.\r\n     */\r\n    get isGravityOverridden() {\r\n        return this._selection.isGravityOverridden;\r\n    }\r\n    /**\r\n     * A collection of selection {@link module:engine/model/markercollection~Marker markers}.\r\n     * Marker is a selection marker when selection range is inside the marker range.\r\n     *\r\n     * **Note**: Only markers from {@link ~DocumentSelection#observeMarkers observed markers groups} are collected.\r\n     */\r\n    get markers() {\r\n        return this._selection.markers;\r\n    }\r\n    /**\r\n     * Used for the compatibility with the {@link module:engine/model/selection~Selection#isEqual} method.\r\n     *\r\n     * @internal\r\n     */\r\n    get _ranges() {\r\n        return this._selection._ranges;\r\n    }\r\n    /**\r\n     * Returns an iterable that iterates over copies of selection ranges.\r\n     */\r\n    getRanges() {\r\n        return this._selection.getRanges();\r\n    }\r\n    /**\r\n     * Returns the first position in the selection.\r\n     * First position is the position that {@link module:engine/model/position~Position#isBefore is before}\r\n     * any other position in the selection.\r\n     *\r\n     * Returns `null` if there are no ranges in selection.\r\n     */\r\n    getFirstPosition() {\r\n        return this._selection.getFirstPosition();\r\n    }\r\n    /**\r\n     * Returns the last position in the selection.\r\n     * Last position is the position that {@link module:engine/model/position~Position#isAfter is after}\r\n     * any other position in the selection.\r\n     *\r\n     * Returns `null` if there are no ranges in selection.\r\n     */\r\n    getLastPosition() {\r\n        return this._selection.getLastPosition();\r\n    }\r\n    /**\r\n     * Returns a copy of the first range in the selection.\r\n     * First range is the one which {@link module:engine/model/range~Range#start start} position\r\n     * {@link module:engine/model/position~Position#isBefore is before} start position of all other ranges\r\n     * (not to confuse with the first range added to the selection).\r\n     *\r\n     * Returns `null` if there are no ranges in selection.\r\n     */\r\n    getFirstRange() {\r\n        return this._selection.getFirstRange();\r\n    }\r\n    /**\r\n     * Returns a copy of the last range in the selection.\r\n     * Last range is the one which {@link module:engine/model/range~Range#end end} position\r\n     * {@link module:engine/model/position~Position#isAfter is after} end position of all other ranges (not to confuse with the range most\r\n     * recently added to the selection).\r\n     *\r\n     * Returns `null` if there are no ranges in selection.\r\n     */\r\n    getLastRange() {\r\n        return this._selection.getLastRange();\r\n    }\r\n    /**\r\n     * Gets elements of type {@link module:engine/model/schema~Schema#isBlock \"block\"} touched by the selection.\r\n     *\r\n     * This method's result can be used for example to apply block styling to all blocks covered by this selection.\r\n     *\r\n     * **Note:** `getSelectedBlocks()` returns blocks that are nested in other non-block elements\r\n     * but will not return blocks nested in other blocks.\r\n     *\r\n     * In this case the function will return exactly all 3 paragraphs (note: `<blockQuote>` is not a block itself):\r\n     *\r\n     * ```\r\n     * <paragraph>[a</paragraph>\r\n     * <blockQuote>\r\n     * \t<paragraph>b</paragraph>\r\n     * </blockQuote>\r\n     * <paragraph>c]d</paragraph>\r\n     * ```\r\n     *\r\n     * In this case the paragraph will also be returned, despite the collapsed selection:\r\n     *\r\n     * ```\r\n     * <paragraph>[]a</paragraph>\r\n     * ```\r\n     *\r\n     * In such a scenario, however, only blocks A, B & E will be returned as blocks C & D are nested in block B:\r\n     *\r\n     * ```\r\n     * [<blockA></blockA>\r\n     * <blockB>\r\n     * \t<blockC></blockC>\r\n     * \t<blockD></blockD>\r\n     * </blockB>\r\n     * <blockE></blockE>]\r\n     * ```\r\n     *\r\n     * If the selection is inside a block all the inner blocks (A & B) are returned:\r\n     *\r\n     * ```\r\n     * <block>\r\n     * \t<blockA>[a</blockA>\r\n     * \t<blockB>b]</blockB>\r\n     * </block>\r\n     * ```\r\n     *\r\n     * **Special case**: If a selection ends at the beginning of a block, that block is not returned as from user perspective\r\n     * this block wasn't selected. See [#984](https://github.com/ckeditor/ckeditor5-engine/issues/984) for more details.\r\n     *\r\n     * ```\r\n     * <paragraph>[a</paragraph>\r\n     * <paragraph>b</paragraph>\r\n     * <paragraph>]c</paragraph> // this block will not be returned\r\n     * ```\r\n     */\r\n    getSelectedBlocks() {\r\n        return this._selection.getSelectedBlocks();\r\n    }\r\n    /**\r\n     * Returns the selected element. {@link module:engine/model/element~Element Element} is considered as selected if there is only\r\n     * one range in the selection, and that range contains exactly one element.\r\n     * Returns `null` if there is no selected element.\r\n     */\r\n    getSelectedElement() {\r\n        return this._selection.getSelectedElement();\r\n    }\r\n    /**\r\n     * Checks whether the selection contains the entire content of the given element. This means that selection must start\r\n     * at a position {@link module:engine/model/position~Position#isTouching touching} the element's start and ends at position\r\n     * touching the element's end.\r\n     *\r\n     * By default, this method will check whether the entire content of the selection's current root is selected.\r\n     * Useful to check if e.g. the user has just pressed <kbd>Ctrl</kbd> + <kbd>A</kbd>.\r\n     */\r\n    containsEntireContent(element) {\r\n        return this._selection.containsEntireContent(element);\r\n    }\r\n    /**\r\n     * Unbinds all events previously bound by document selection.\r\n     */\r\n    destroy() {\r\n        this._selection.destroy();\r\n    }\r\n    /**\r\n     * Returns iterable that iterates over this selection's attribute keys.\r\n     */\r\n    getAttributeKeys() {\r\n        return this._selection.getAttributeKeys();\r\n    }\r\n    /**\r\n     * Returns iterable that iterates over this selection's attributes.\r\n     *\r\n     * Attributes are returned as arrays containing two items. First one is attribute key and second is attribute value.\r\n     * This format is accepted by native `Map` object and also can be passed in `Node` constructor.\r\n     */\r\n    getAttributes() {\r\n        return this._selection.getAttributes();\r\n    }\r\n    /**\r\n     * Gets an attribute value for given key or `undefined` if that attribute is not set on the selection.\r\n     *\r\n     * @param key Key of attribute to look for.\r\n     * @returns Attribute value or `undefined`.\r\n     */\r\n    getAttribute(key) {\r\n        return this._selection.getAttribute(key);\r\n    }\r\n    /**\r\n     * Checks if the selection has an attribute for given key.\r\n     *\r\n     * @param key Key of attribute to check.\r\n     * @returns `true` if attribute with given key is set on selection, `false` otherwise.\r\n     */\r\n    hasAttribute(key) {\r\n        return this._selection.hasAttribute(key);\r\n    }\r\n    /**\r\n     * Refreshes selection attributes and markers according to the current position in the model.\r\n     */\r\n    refresh() {\r\n        this._selection.updateMarkers();\r\n        this._selection._updateAttributes(false);\r\n    }\r\n    /**\r\n     * Registers a marker group prefix or a marker name to be collected in the\r\n     * {@link ~DocumentSelection#markers selection markers collection}.\r\n     *\r\n     * See also {@link module:engine/model/markercollection~MarkerCollection#getMarkersGroup `MarkerCollection#getMarkersGroup()`}.\r\n     *\r\n     * @param prefixOrName The marker group prefix or marker name.\r\n     */\r\n    observeMarkers(prefixOrName) {\r\n        this._selection.observeMarkers(prefixOrName);\r\n    }\r\n    /**\r\n     * Moves {@link module:engine/model/documentselection~DocumentSelection#focus} to the specified location.\r\n     * Should be used only within the {@link module:engine/model/writer~Writer#setSelectionFocus} method.\r\n     *\r\n     * The location can be specified in the same form as\r\n     * {@link module:engine/model/writer~Writer#createPositionAt writer.createPositionAt()} parameters.\r\n     *\r\n     * @see module:engine/model/writer~Writer#setSelectionFocus\r\n     * @internal\r\n     * @param offset Offset or one of the flags. Used only when\r\n     * first parameter is a {@link module:engine/model/item~Item model item}.\r\n     */\r\n    _setFocus(itemOrPosition, offset) {\r\n        this._selection.setFocus(itemOrPosition, offset);\r\n    }\r\n    /**\r\n     * Sets this selection's ranges and direction to the specified location based on the given\r\n     * {@link module:engine/model/selection~Selectable selectable}.\r\n     * Should be used only within the {@link module:engine/model/writer~Writer#setSelection} method.\r\n     *\r\n     * @see module:engine/model/writer~Writer#setSelection\r\n     * @internal\r\n     */\r\n    _setTo(...args) {\r\n        this._selection.setTo(...args);\r\n    }\r\n    /**\r\n     * Sets attribute on the selection. If attribute with the same key already is set, it's value is overwritten.\r\n     * Should be used only within the {@link module:engine/model/writer~Writer#setSelectionAttribute} method.\r\n     *\r\n     * @see module:engine/model/writer~Writer#setSelectionAttribute\r\n     * @internal\r\n     * @param key Key of the attribute to set.\r\n     * @param value Attribute value.\r\n     */\r\n    _setAttribute(key, value) {\r\n        this._selection.setAttribute(key, value);\r\n    }\r\n    /**\r\n     * Removes an attribute with given key from the selection.\r\n     * If the given attribute was set on the selection, fires the {@link module:engine/model/selection~Selection#event:change:range}\r\n     * event with removed attribute key.\r\n     * Should be used only within the {@link module:engine/model/writer~Writer#removeSelectionAttribute} method.\r\n     *\r\n     * @see module:engine/model/writer~Writer#removeSelectionAttribute\r\n     * @internal\r\n     * @param key Key of the attribute to remove.\r\n     */\r\n    _removeAttribute(key) {\r\n        this._selection.removeAttribute(key);\r\n    }\r\n    /**\r\n     * Returns an iterable that iterates through all selection attributes stored in current selection's parent.\r\n     *\r\n     * @internal\r\n     */\r\n    _getStoredAttributes() {\r\n        return this._selection.getStoredAttributes();\r\n    }\r\n    /**\r\n     * Temporarily changes the gravity of the selection from the left to the right.\r\n     *\r\n     * The gravity defines from which direction the selection inherits its attributes. If it's the default left\r\n     * gravity, the selection (after being moved by the the user) inherits attributes from its left hand side.\r\n     * This method allows to temporarily override this behavior by forcing the gravity to the right.\r\n     *\r\n     * It returns an unique identifier which is required to restore the gravity. It guarantees the symmetry\r\n     * of the process.\r\n     *\r\n     * @see module:engine/model/writer~Writer#overrideSelectionGravity\r\n     * @internal\r\n     * @returns The unique id which allows restoring the gravity.\r\n     */\r\n    _overrideGravity() {\r\n        return this._selection.overrideGravity();\r\n    }\r\n    /**\r\n     * Restores the {@link ~DocumentSelection#_overrideGravity overridden gravity}.\r\n     *\r\n     * Restoring the gravity is only possible using the unique identifier returned by\r\n     * {@link ~DocumentSelection#_overrideGravity}. Note that the gravity remains overridden as long as won't be restored\r\n     * the same number of times it was overridden.\r\n     *\r\n     * @see module:engine/model/writer~Writer#restoreSelectionGravity\r\n     * @internal\r\n     * @param uid The unique id returned by {@link #_overrideGravity}.\r\n     */\r\n    _restoreGravity(uid) {\r\n        this._selection.restoreGravity(uid);\r\n    }\r\n    /**\r\n     * Generates and returns an attribute key for selection attributes store, basing on original attribute key.\r\n     *\r\n     * @internal\r\n     * @param key Attribute key to convert.\r\n     * @returns Converted attribute key, applicable for selection store.\r\n     */\r\n    static _getStoreAttributeKey(key) {\r\n        return storePrefix + key;\r\n    }\r\n    /**\r\n     * Checks whether the given attribute key is an attribute stored on an element.\r\n     *\r\n     * @internal\r\n     */\r\n    static _isStoreAttributeKey(key) {\r\n        return key.startsWith(storePrefix);\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nDocumentSelection.prototype.is = function (type) {\r\n    return type === 'selection' ||\r\n        type == 'model:selection' ||\r\n        type == 'documentSelection' ||\r\n        type == 'model:documentSelection';\r\n};\r\n/**\r\n * `LiveSelection` is used internally by {@link module:engine/model/documentselection~DocumentSelection} and shouldn't be used directly.\r\n *\r\n * LiveSelection` is automatically updated upon changes in the {@link module:engine/model/document~Document document}\r\n * to always contain valid ranges. Its attributes are inherited from the text unless set explicitly.\r\n *\r\n * Differences between {@link module:engine/model/selection~Selection} and `LiveSelection` are:\r\n * * there is always a range in `LiveSelection` - even if no ranges were added there is a \"default range\"\r\n * present in the selection,\r\n * * ranges added to this selection updates automatically when the document changes,\r\n * * attributes of `LiveSelection` are updated automatically according to selection ranges.\r\n */\r\nclass LiveSelection extends Selection {\r\n    /**\r\n     * Creates an empty live selection for given {@link module:engine/model/document~Document}.\r\n     *\r\n     * @param doc Document which owns this selection.\r\n     */\r\n    constructor(doc) {\r\n        super();\r\n        /**\r\n         * List of selection markers.\r\n         * Marker is a selection marker when selection range is inside the marker range.\r\n         */\r\n        this.markers = new Collection({ idProperty: 'name' });\r\n        /**\r\n         * Keeps mapping of attribute name to priority with which the attribute got modified (added/changed/removed)\r\n         * last time. Possible values of priority are: `'low'` and `'normal'`.\r\n         *\r\n         * Priorities are used by internal `LiveSelection` mechanisms. All attributes set using `LiveSelection`\r\n         * attributes API are set with `'normal'` priority.\r\n         */\r\n        this._attributePriority = new Map();\r\n        /**\r\n         * Position to which the selection should be set if the last selection range was moved to the graveyard.\r\n         */\r\n        this._selectionRestorePosition = null;\r\n        /**\r\n         * Flag that informs whether the selection ranges have changed. It is changed on true when `LiveRange#change:range` event is fired.\r\n         */\r\n        this._hasChangedRange = false;\r\n        /**\r\n         * Each overriding gravity adds an UID to the set and each removal removes it.\r\n         * Gravity is overridden when there's at least one UID in the set.\r\n         * Gravity is restored when the set is empty.\r\n         * This is to prevent conflicts when gravity is overridden by more than one feature at the same time.\r\n         */\r\n        this._overriddenGravityRegister = new Set();\r\n        /**\r\n         * Prefixes of marker names that should affect `LiveSelection#markers` collection.\r\n         */\r\n        this._observedMarkers = new Set();\r\n        this._model = doc.model;\r\n        this._document = doc;\r\n        // Ensure selection is correct after each operation.\r\n        this.listenTo(this._model, 'applyOperation', (evt, args) => {\r\n            const operation = args[0];\r\n            if (!operation.isDocumentOperation || operation.type == 'marker' || operation.type == 'rename' || operation.type == 'noop') {\r\n                return;\r\n            }\r\n            // Fix selection if the last range was removed from it and we have a position to which we can restore the selection.\r\n            if (this._ranges.length == 0 && this._selectionRestorePosition) {\r\n                this._fixGraveyardSelection(this._selectionRestorePosition);\r\n            }\r\n            // \"Forget\" the restore position even if it was not \"used\".\r\n            this._selectionRestorePosition = null;\r\n            if (this._hasChangedRange) {\r\n                this._hasChangedRange = false;\r\n                this.fire('change:range', { directChange: false });\r\n            }\r\n        }, { priority: 'lowest' });\r\n        // Ensure selection is correct and up to date after each range change.\r\n        this.on('change:range', () => {\r\n            this._validateSelectionRanges(this.getRanges());\r\n        });\r\n        // Update markers data stored by the selection after each marker change.\r\n        // This handles only marker changes done through marker operations (not model tree changes).\r\n        this.listenTo(this._model.markers, 'update', (evt, marker, oldRange, newRange) => {\r\n            this._updateMarker(marker, newRange);\r\n        });\r\n        // Ensure selection is up to date after each change block.\r\n        this.listenTo(this._document, 'change', (evt, batch) => {\r\n            clearAttributesStoredInElement(this._model, batch);\r\n        });\r\n    }\r\n    get isCollapsed() {\r\n        const length = this._ranges.length;\r\n        return length === 0 ? this._document._getDefaultRange().isCollapsed : super.isCollapsed;\r\n    }\r\n    get anchor() {\r\n        return super.anchor || this._document._getDefaultRange().start;\r\n    }\r\n    get focus() {\r\n        return super.focus || this._document._getDefaultRange().end;\r\n    }\r\n    get rangeCount() {\r\n        return this._ranges.length ? this._ranges.length : 1;\r\n    }\r\n    /**\r\n     * Describes whether `LiveSelection` has own range(s) set, or if it is defaulted to\r\n     * {@link module:engine/model/document~Document#_getDefaultRange document's default range}.\r\n     */\r\n    get hasOwnRange() {\r\n        return this._ranges.length > 0;\r\n    }\r\n    /**\r\n     * When set to `true` then selection attributes on node before the caret won't be taken\r\n     * into consideration while updating selection attributes.\r\n     */\r\n    get isGravityOverridden() {\r\n        return !!this._overriddenGravityRegister.size;\r\n    }\r\n    /**\r\n     * Unbinds all events previously bound by live selection.\r\n     */\r\n    destroy() {\r\n        for (let i = 0; i < this._ranges.length; i++) {\r\n            this._ranges[i].detach();\r\n        }\r\n        this.stopListening();\r\n    }\r\n    *getRanges() {\r\n        if (this._ranges.length) {\r\n            yield* super.getRanges();\r\n        }\r\n        else {\r\n            yield this._document._getDefaultRange();\r\n        }\r\n    }\r\n    getFirstRange() {\r\n        return super.getFirstRange() || this._document._getDefaultRange();\r\n    }\r\n    getLastRange() {\r\n        return super.getLastRange() || this._document._getDefaultRange();\r\n    }\r\n    setTo(...args) {\r\n        super.setTo(...args);\r\n        this._updateAttributes(true);\r\n        this.updateMarkers();\r\n    }\r\n    setFocus(itemOrPosition, offset) {\r\n        super.setFocus(itemOrPosition, offset);\r\n        this._updateAttributes(true);\r\n        this.updateMarkers();\r\n    }\r\n    setAttribute(key, value) {\r\n        if (this._setAttribute(key, value)) {\r\n            // Fire event with exact data.\r\n            const attributeKeys = [key];\r\n            this.fire('change:attribute', { attributeKeys, directChange: true });\r\n        }\r\n    }\r\n    removeAttribute(key) {\r\n        if (this._removeAttribute(key)) {\r\n            // Fire event with exact data.\r\n            const attributeKeys = [key];\r\n            this.fire('change:attribute', { attributeKeys, directChange: true });\r\n        }\r\n    }\r\n    overrideGravity() {\r\n        const overrideUid = uid();\r\n        // Remember that another overriding has been requested. It will need to be removed\r\n        // before the gravity is to be restored.\r\n        this._overriddenGravityRegister.add(overrideUid);\r\n        if (this._overriddenGravityRegister.size === 1) {\r\n            this._updateAttributes(true);\r\n        }\r\n        return overrideUid;\r\n    }\r\n    restoreGravity(uid) {\r\n        if (!this._overriddenGravityRegister.has(uid)) {\r\n            /**\r\n             * Restoring gravity for an unknown UID is not possible. Make sure you are using a correct\r\n             * UID obtained from the {@link module:engine/model/writer~Writer#overrideSelectionGravity} to restore.\r\n             *\r\n             * @error document-selection-gravity-wrong-restore\r\n             * @param uid The unique identifier returned by\r\n             * {@link module:engine/model/documentselection~DocumentSelection#_overrideGravity}.\r\n             */\r\n            throw new CKEditorError('document-selection-gravity-wrong-restore', this, { uid });\r\n        }\r\n        this._overriddenGravityRegister.delete(uid);\r\n        // Restore gravity only when all overriding have been restored.\r\n        if (!this.isGravityOverridden) {\r\n            this._updateAttributes(true);\r\n        }\r\n    }\r\n    observeMarkers(prefixOrName) {\r\n        this._observedMarkers.add(prefixOrName);\r\n        this.updateMarkers();\r\n    }\r\n    _replaceAllRanges(ranges) {\r\n        this._validateSelectionRanges(ranges);\r\n        super._replaceAllRanges(ranges);\r\n    }\r\n    _popRange() {\r\n        this._ranges.pop().detach();\r\n    }\r\n    _pushRange(range) {\r\n        const liveRange = this._prepareRange(range);\r\n        // `undefined` is returned when given `range` is in graveyard root.\r\n        if (liveRange) {\r\n            this._ranges.push(liveRange);\r\n        }\r\n    }\r\n    _validateSelectionRanges(ranges) {\r\n        for (const range of ranges) {\r\n            if (!this._document._validateSelectionRange(range)) {\r\n                /**\r\n                 * Range from {@link module:engine/model/documentselection~DocumentSelection document selection}\r\n                 * starts or ends at incorrect position.\r\n                 *\r\n                 * @error document-selection-wrong-position\r\n                 * @param range\r\n                 */\r\n                throw new CKEditorError('document-selection-wrong-position', this, { range });\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Prepares given range to be added to selection. Checks if it is correct,\r\n     * converts it to {@link module:engine/model/liverange~LiveRange LiveRange}\r\n     * and sets listeners listening to the range's change event.\r\n     */\r\n    _prepareRange(range) {\r\n        this._checkRange(range);\r\n        if (range.root == this._document.graveyard) {\r\n            // @if CK_DEBUG // console.warn( 'Trying to add a Range that is in the graveyard root. Range rejected.' );\r\n            return;\r\n        }\r\n        const liveRange = LiveRange.fromRange(range);\r\n        // If selection range is moved to the graveyard remove it from the selection object.\r\n        // Also, save some data that can be used to restore selection later, on `Model#applyOperation` event.\r\n        liveRange.on('change:range', (evt, oldRange, data) => {\r\n            this._hasChangedRange = true;\r\n            if (liveRange.root == this._document.graveyard) {\r\n                this._selectionRestorePosition = data.deletionPosition;\r\n                const index = this._ranges.indexOf(liveRange);\r\n                this._ranges.splice(index, 1);\r\n                liveRange.detach();\r\n            }\r\n        });\r\n        return liveRange;\r\n    }\r\n    updateMarkers() {\r\n        if (!this._observedMarkers.size) {\r\n            return;\r\n        }\r\n        const markers = [];\r\n        let changed = false;\r\n        for (const marker of this._model.markers) {\r\n            const markerGroup = marker.name.split(':', 1)[0];\r\n            if (!this._observedMarkers.has(markerGroup)) {\r\n                continue;\r\n            }\r\n            const markerRange = marker.getRange();\r\n            for (const selectionRange of this.getRanges()) {\r\n                if (markerRange.containsRange(selectionRange, !selectionRange.isCollapsed)) {\r\n                    markers.push(marker);\r\n                }\r\n            }\r\n        }\r\n        const oldMarkers = Array.from(this.markers);\r\n        for (const marker of markers) {\r\n            if (!this.markers.has(marker)) {\r\n                this.markers.add(marker);\r\n                changed = true;\r\n            }\r\n        }\r\n        for (const marker of Array.from(this.markers)) {\r\n            if (!markers.includes(marker)) {\r\n                this.markers.remove(marker);\r\n                changed = true;\r\n            }\r\n        }\r\n        if (changed) {\r\n            this.fire('change:marker', { oldMarkers, directChange: false });\r\n        }\r\n    }\r\n    _updateMarker(marker, markerRange) {\r\n        const markerGroup = marker.name.split(':', 1)[0];\r\n        if (!this._observedMarkers.has(markerGroup)) {\r\n            return;\r\n        }\r\n        let changed = false;\r\n        const oldMarkers = Array.from(this.markers);\r\n        const hasMarker = this.markers.has(marker);\r\n        if (!markerRange) {\r\n            if (hasMarker) {\r\n                this.markers.remove(marker);\r\n                changed = true;\r\n            }\r\n        }\r\n        else {\r\n            let contained = false;\r\n            for (const selectionRange of this.getRanges()) {\r\n                if (markerRange.containsRange(selectionRange, !selectionRange.isCollapsed)) {\r\n                    contained = true;\r\n                    break;\r\n                }\r\n            }\r\n            if (contained && !hasMarker) {\r\n                this.markers.add(marker);\r\n                changed = true;\r\n            }\r\n            else if (!contained && hasMarker) {\r\n                this.markers.remove(marker);\r\n                changed = true;\r\n            }\r\n        }\r\n        if (changed) {\r\n            this.fire('change:marker', { oldMarkers, directChange: false });\r\n        }\r\n    }\r\n    /**\r\n     * Updates this selection attributes according to its ranges and the {@link module:engine/model/document~Document model document}.\r\n     */\r\n    _updateAttributes(clearAll) {\r\n        const newAttributes = toMap(this._getSurroundingAttributes());\r\n        const oldAttributes = toMap(this.getAttributes());\r\n        if (clearAll) {\r\n            // If `clearAll` remove all attributes and reset priorities.\r\n            this._attributePriority = new Map();\r\n            this._attrs = new Map();\r\n        }\r\n        else {\r\n            // If not, remove only attributes added with `low` priority.\r\n            for (const [key, priority] of this._attributePriority) {\r\n                if (priority == 'low') {\r\n                    this._attrs.delete(key);\r\n                    this._attributePriority.delete(key);\r\n                }\r\n            }\r\n        }\r\n        this._setAttributesTo(newAttributes);\r\n        // Let's evaluate which attributes really changed.\r\n        const changed = [];\r\n        // First, loop through all attributes that are set on selection right now.\r\n        // Check which of them are different than old attributes.\r\n        for (const [newKey, newValue] of this.getAttributes()) {\r\n            if (!oldAttributes.has(newKey) || oldAttributes.get(newKey) !== newValue) {\r\n                changed.push(newKey);\r\n            }\r\n        }\r\n        // Then, check which of old attributes got removed.\r\n        for (const [oldKey] of oldAttributes) {\r\n            if (!this.hasAttribute(oldKey)) {\r\n                changed.push(oldKey);\r\n            }\r\n        }\r\n        // Fire event with exact data (fire only if anything changed).\r\n        if (changed.length > 0) {\r\n            this.fire('change:attribute', { attributeKeys: changed, directChange: false });\r\n        }\r\n    }\r\n    /**\r\n     * Internal method for setting `LiveSelection` attribute. Supports attribute priorities (through `directChange`\r\n     * parameter).\r\n     */\r\n    _setAttribute(key, value, directChange = true) {\r\n        const priority = directChange ? 'normal' : 'low';\r\n        if (priority == 'low' && this._attributePriority.get(key) == 'normal') {\r\n            // Priority too low.\r\n            return false;\r\n        }\r\n        const oldValue = super.getAttribute(key);\r\n        // Don't do anything if value has not changed.\r\n        if (oldValue === value) {\r\n            return false;\r\n        }\r\n        this._attrs.set(key, value);\r\n        // Update priorities map.\r\n        this._attributePriority.set(key, priority);\r\n        return true;\r\n    }\r\n    /**\r\n     * Internal method for removing `LiveSelection` attribute. Supports attribute priorities (through `directChange`\r\n     * parameter).\r\n     *\r\n     * NOTE: Even if attribute is not present in the selection but is provided to this method, it's priority will\r\n     * be changed according to `directChange` parameter.\r\n     */\r\n    _removeAttribute(key, directChange = true) {\r\n        const priority = directChange ? 'normal' : 'low';\r\n        if (priority == 'low' && this._attributePriority.get(key) == 'normal') {\r\n            // Priority too low.\r\n            return false;\r\n        }\r\n        // Update priorities map.\r\n        this._attributePriority.set(key, priority);\r\n        // Don't do anything if value has not changed.\r\n        if (!super.hasAttribute(key)) {\r\n            return false;\r\n        }\r\n        this._attrs.delete(key);\r\n        return true;\r\n    }\r\n    /**\r\n     * Internal method for setting multiple `LiveSelection` attributes. Supports attribute priorities (through\r\n     * `directChange` parameter).\r\n     */\r\n    _setAttributesTo(attrs) {\r\n        const changed = new Set();\r\n        for (const [oldKey, oldValue] of this.getAttributes()) {\r\n            // Do not remove attribute if attribute with same key and value is about to be set.\r\n            if (attrs.get(oldKey) === oldValue) {\r\n                continue;\r\n            }\r\n            // All rest attributes will be removed so changed attributes won't change .\r\n            this._removeAttribute(oldKey, false);\r\n        }\r\n        for (const [key, value] of attrs) {\r\n            // Attribute may not be set because of attributes or because same key/value is already added.\r\n            const gotAdded = this._setAttribute(key, value, false);\r\n            if (gotAdded) {\r\n                changed.add(key);\r\n            }\r\n        }\r\n        return changed;\r\n    }\r\n    /**\r\n     * Returns an iterable that iterates through all selection attributes stored in current selection's parent.\r\n     */\r\n    *getStoredAttributes() {\r\n        const selectionParent = this.getFirstPosition().parent;\r\n        if (this.isCollapsed && selectionParent.isEmpty) {\r\n            for (const key of selectionParent.getAttributeKeys()) {\r\n                if (key.startsWith(storePrefix)) {\r\n                    const realKey = key.substr(storePrefix.length);\r\n                    yield [realKey, selectionParent.getAttribute(key)];\r\n                }\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Checks model text nodes that are closest to the selection's first position and returns attributes of first\r\n     * found element. If there are no text nodes in selection's first position parent, it returns selection\r\n     * attributes stored in that parent.\r\n     */\r\n    _getSurroundingAttributes() {\r\n        const position = this.getFirstPosition();\r\n        const schema = this._model.schema;\r\n        let attrs = null;\r\n        if (!this.isCollapsed) {\r\n            // 1. If selection is a range...\r\n            const range = this.getFirstRange();\r\n            // ...look for a first character node in that range and take attributes from it.\r\n            for (const value of range) {\r\n                // If the item is an object, we don't want to get attributes from its children.\r\n                if (value.item.is('element') && schema.isObject(value.item)) {\r\n                    break;\r\n                }\r\n                if (value.type == 'text') {\r\n                    attrs = value.item.getAttributes();\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            // 2. If the selection is a caret or the range does not contain a character node...\r\n            const nodeBefore = position.textNode ? position.textNode : position.nodeBefore;\r\n            const nodeAfter = position.textNode ? position.textNode : position.nodeAfter;\r\n            // When gravity is overridden then don't take node before into consideration.\r\n            if (!this.isGravityOverridden) {\r\n                // ...look at the node before caret and take attributes from it if it is a character node.\r\n                attrs = getTextAttributes(nodeBefore, schema);\r\n            }\r\n            // 3. If not, look at the node after caret...\r\n            if (!attrs) {\r\n                attrs = getTextAttributes(nodeAfter, schema);\r\n            }\r\n            // 4. If not, try to find the first character on the left, that is in the same node.\r\n            // When gravity is overridden then don't take node before into consideration.\r\n            if (!this.isGravityOverridden && !attrs) {\r\n                let node = nodeBefore;\r\n                while (node && !attrs) {\r\n                    node = node.previousSibling;\r\n                    attrs = getTextAttributes(node, schema);\r\n                }\r\n            }\r\n            // 5. If not found, try to find the first character on the right, that is in the same node.\r\n            if (!attrs) {\r\n                let node = nodeAfter;\r\n                while (node && !attrs) {\r\n                    node = node.nextSibling;\r\n                    attrs = getTextAttributes(node, schema);\r\n                }\r\n            }\r\n            // 6. If not found, selection should retrieve attributes from parent.\r\n            if (!attrs) {\r\n                attrs = this.getStoredAttributes();\r\n            }\r\n        }\r\n        return attrs;\r\n    }\r\n    /**\r\n     * Fixes the selection after all its ranges got removed.\r\n     * @param deletionPosition Position where the deletion happened.\r\n     */\r\n    _fixGraveyardSelection(deletionPosition) {\r\n        // Find a range that is a correct selection range and is closest to the position where the deletion happened.\r\n        const selectionRange = this._model.schema.getNearestSelectionRange(deletionPosition);\r\n        // If nearest valid selection range has been found - add it in the place of old range.\r\n        if (selectionRange) {\r\n            // Check the range, convert it to live range, bind events, etc.\r\n            this._pushRange(selectionRange);\r\n        }\r\n        // If nearest valid selection range cannot be found don't add any range. Selection will be set to the default range.\r\n    }\r\n}\r\n/**\r\n * Helper function for {@link module:engine/model/liveselection~LiveSelection#_updateAttributes}.\r\n *\r\n * It checks if the passed model item is a text node (or text proxy) and, if so, returns it's attributes.\r\n * If not, it checks if item is an inline object and does the same. Otherwise it returns `null`.\r\n */\r\nfunction getTextAttributes(node, schema) {\r\n    if (!node) {\r\n        return null;\r\n    }\r\n    if (node instanceof TextProxy || node instanceof Text) {\r\n        return node.getAttributes();\r\n    }\r\n    if (!schema.isInline(node)) {\r\n        return null;\r\n    }\r\n    // Stop on inline elements (such as `<softBreak>`) that are not objects (such as `<imageInline>` or `<mathml>`).\r\n    if (!schema.isObject(node)) {\r\n        return [];\r\n    }\r\n    const attributes = [];\r\n    // Collect all attributes that can be applied to the text node.\r\n    for (const [key, value] of node.getAttributes()) {\r\n        if (schema.checkAttribute('$text', key)) {\r\n            attributes.push([key, value]);\r\n        }\r\n    }\r\n    return attributes;\r\n}\r\n/**\r\n * Removes selection attributes from element which is not empty anymore.\r\n */\r\nfunction clearAttributesStoredInElement(model, batch) {\r\n    const differ = model.document.differ;\r\n    for (const entry of differ.getChanges()) {\r\n        if (entry.type != 'insert') {\r\n            continue;\r\n        }\r\n        const changeParent = entry.position.parent;\r\n        const isNoLongerEmpty = entry.length === changeParent.maxOffset;\r\n        if (isNoLongerEmpty) {\r\n            model.enqueueChange(batch, writer => {\r\n                const storedAttributes = Array.from(changeParent.getAttributeKeys())\r\n                    .filter(key => key.startsWith(storePrefix));\r\n                for (const key of storedAttributes) {\r\n                    writer.removeAttribute(key, changeParent);\r\n                }\r\n            });\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/conversion/conversionhelpers\r\n */\r\n/**\r\n * Base class for conversion helpers.\r\n */\r\nexport default class ConversionHelpers {\r\n    /**\r\n     * Creates a conversion helpers instance.\r\n     */\r\n    constructor(dispatchers) {\r\n        this._dispatchers = dispatchers;\r\n    }\r\n    /**\r\n     * Registers a conversion helper.\r\n     *\r\n     * **Note**: See full usage example in the `{@link module:engine/conversion/conversion~Conversion#for conversion.for()}`\r\n     * method description.\r\n     *\r\n     * @param conversionHelper The function to be called on event.\r\n     */\r\n    add(conversionHelper) {\r\n        for (const dispatcher of this._dispatchers) {\r\n            conversionHelper(dispatcher);\r\n        }\r\n        return this;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * Contains downcast (model-to-view) converters for {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher}.\r\n *\r\n * @module engine/conversion/downcasthelpers\r\n */\r\nimport ModelRange from '../model/range';\r\nimport ModelSelection from '../model/selection';\r\nimport ModelDocumentSelection from '../model/documentselection';\r\nimport ModelElement from '../model/element';\r\nimport ModelPosition from '../model/position';\r\nimport ViewAttributeElement from '../view/attributeelement';\r\nimport ConversionHelpers from './conversionhelpers';\r\nimport { CKEditorError, toArray } from '@ckeditor/ckeditor5-utils';\r\nimport { cloneDeep } from 'lodash-es';\r\n/**\r\n * Downcast conversion helper functions.\r\n *\r\n * Learn more about {@glink framework/deep-dive/conversion/downcast downcast helpers}.\r\n *\r\n * @extends module:engine/conversion/conversionhelpers~ConversionHelpers\r\n */\r\nexport default class DowncastHelpers extends ConversionHelpers {\r\n    /**\r\n     * Model element to view element conversion helper.\r\n     *\r\n     * This conversion results in creating a view element. For example, model `<paragraph>Foo</paragraph>` becomes `<p>Foo</p>` in the view.\r\n     *\r\n     * ```ts\r\n     * editor.conversion.for( 'downcast' ).elementToElement( {\r\n     * \tmodel: 'paragraph',\r\n     * \tview: 'p'\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'downcast' ).elementToElement( {\r\n     * \tmodel: 'paragraph',\r\n     * \tview: 'div',\r\n     * \tconverterPriority: 'high'\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'downcast' ).elementToElement( {\r\n     * \tmodel: 'fancyParagraph',\r\n     * \tview: {\r\n     * \t\tname: 'p',\r\n     * \t\tclasses: 'fancy'\r\n     * \t}\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'downcast' ).elementToElement( {\r\n     * \tmodel: 'heading',\r\n     * \tview: ( modelElement, conversionApi ) => {\r\n     * \t\tconst { writer } = conversionApi;\r\n     *\r\n     * \t\treturn writer.createContainerElement( 'h' + modelElement.getAttribute( 'level' ) );\r\n     * \t}\r\n     * } );\r\n     * ```\r\n     *\r\n     * The element-to-element conversion supports the reconversion mechanism. It can be enabled by using either the `attributes` or\r\n     * the `children` props on a model description. You will find a couple examples below.\r\n     *\r\n     * In order to reconvert an element if any of its direct children have been added or removed, use the `children` property on a `model`\r\n     * description. For example, this model:\r\n     *\r\n     * ```xml\r\n     * <box>\r\n     * \t<paragraph>Some text.</paragraph>\r\n     * </box>\r\n     * ```\r\n     *\r\n     * will be converted into this structure in the view:\r\n     *\r\n     * ```html\r\n     * <div class=\"box\" data-type=\"single\">\r\n     * \t<p>Some text.</p>\r\n     * </div>\r\n     * ```\r\n     *\r\n     * But if more items were inserted in the model:\r\n     *\r\n     * ```xml\r\n     * <box>\r\n     * \t<paragraph>Some text.</paragraph>\r\n     * \t<paragraph>Other item.</paragraph>\r\n     * </box>\r\n     * ```\r\n     *\r\n     * it will be converted into this structure in the view (note the element `data-type` change):\r\n     *\r\n     * ```html\r\n     * <div class=\"box\" data-type=\"multiple\">\r\n     * \t<p>Some text.</p>\r\n     * \t<p>Other item.</p>\r\n     * </div>\r\n     * ```\r\n     *\r\n     * Such a converter would look like this (note that the `paragraph` elements are converted separately):\r\n     *\r\n     * ```ts\r\n     * editor.conversion.for( 'downcast' ).elementToElement( {\r\n     * \tmodel: {\r\n     * \t\tname: 'box',\r\n     * \t\tchildren: true\r\n     * \t},\r\n     * \tview: ( modelElement, conversionApi ) => {\r\n     * \t\tconst { writer } = conversionApi;\r\n     *\r\n     * \t\treturn writer.createContainerElement( 'div', {\r\n     * \t\t\tclass: 'box',\r\n     * \t\t\t'data-type': modelElement.childCount == 1 ? 'single' : 'multiple'\r\n     * \t\t} );\r\n     * \t}\r\n     * } );\r\n     * ```\r\n     *\r\n     * In order to reconvert element if any of its attributes have been updated, use the `attributes` property on a `model`\r\n     * description. For example, this model:\r\n     *\r\n     * ```xml\r\n     * <heading level=\"2\">Some text.</heading>\r\n     * ```\r\n     *\r\n     * will be converted into this structure in the view:\r\n     *\r\n     * ```html\r\n     * <h2>Some text.</h2>\r\n     * ```\r\n     *\r\n     * But if the `heading` element's `level` attribute has been updated to `3` for example, then\r\n     * it will be converted into this structure in the view:\r\n     *\r\n     * ```html\r\n     * <h3>Some text.</h3>\r\n     * ```\r\n     *\r\n     * Such a converter would look as follows:\r\n     *\r\n     * ```ts\r\n     * editor.conversion.for( 'downcast' ).elementToElement( {\r\n     * \tmodel: {\r\n     * \t\tname: 'heading',\r\n     * \t\tattributes: 'level'\r\n     * \t},\r\n     * \tview: ( modelElement, conversionApi ) => {\r\n     * \t\tconst { writer } = conversionApi;\r\n     *\r\n     * \t\treturn writer.createContainerElement( 'h' + modelElement.getAttribute( 'level' ) );\r\n     * \t}\r\n     * } );\r\n     * ```\r\n     *\r\n     * See {@link module:engine/conversion/conversion~Conversion#for `conversion.for()`} to learn how to add a converter\r\n     * to the conversion process.\r\n     *\r\n     * You can read more about the element-to-element conversion in the\r\n     * {@glink framework/deep-dive/conversion/downcast downcast conversion} guide.\r\n     *\r\n     * @param config Conversion configuration.\r\n     * @param config.model The description or a name of the model element to convert.\r\n     * @param config.model.attributes The list of attribute names that should be consumed while creating\r\n     * the view element. Note that the view will be reconverted if any of the listed attributes changes.\r\n     * @param config.model.children Specifies whether the view element requires reconversion if the list\r\n     * of the model child nodes changed.\r\n     * @param config.view A view element definition or a function that takes the model element and\r\n     * {@link module:engine/conversion/downcastdispatcher~DowncastConversionApi downcast conversion API}\r\n     * as parameters and returns a view container element.\r\n     */\r\n    elementToElement(config) {\r\n        return this.add(downcastElementToElement(config));\r\n    }\r\n    /**\r\n     * The model element to view structure (several elements) conversion helper.\r\n     *\r\n     * This conversion results in creating a view structure with one or more slots defined for the child nodes.\r\n     * For example, a model `<table>` may become this structure in the view:\r\n     *\r\n     * ```html\r\n     * <figure class=\"table\">\r\n     * \t<table>\r\n     * \t\t<tbody>${ slot for table rows }</tbody>\r\n     * \t</table>\r\n     * </figure>\r\n     * ```\r\n     *\r\n     * The children of the model's `<table>` element will be inserted into the `<tbody>` element.\r\n     * If the `elementToElement()` helper was used, the children would be inserted into the `<figure>`.\r\n     *\r\n     * An example converter that converts the following model structure:\r\n     *\r\n     * ```xml\r\n     * <wrappedParagraph>Some text.</wrappedParagraph>\r\n     * ```\r\n     *\r\n     * into this structure in the view:\r\n     *\r\n     * ```html\r\n     * <div class=\"wrapper\">\r\n     * \t<p>Some text.</p>\r\n     * </div>\r\n     * ```\r\n     *\r\n     * would look like this:\r\n     *\r\n     * ```ts\r\n     * editor.conversion.for( 'downcast' ).elementToStructure( {\r\n     * \tmodel: 'wrappedParagraph',\r\n     * \tview: ( modelElement, conversionApi ) => {\r\n     * \t\tconst { writer } = conversionApi;\r\n     *\r\n     * \t\tconst wrapperViewElement = writer.createContainerElement( 'div', { class: 'wrapper' } );\r\n     * \t\tconst paragraphViewElement = writer.createContainerElement( 'p' );\r\n     *\r\n     * \t\twriter.insert( writer.createPositionAt( wrapperViewElement, 0 ), paragraphViewElement );\r\n     * \t\twriter.insert( writer.createPositionAt( paragraphViewElement, 0 ), writer.createSlot() );\r\n     *\r\n     * \t\treturn wrapperViewElement;\r\n     * \t}\r\n     * } );\r\n     * ```\r\n     *\r\n     * The `createSlot()` function can also take a callback that allows filtering which children of the model element\r\n     * should be converted into this slot.\r\n     *\r\n     * Imagine a table feature where for this model structure:\r\n     *\r\n     * ```xml\r\n     * <table headingRows=\"1\">\r\n     * \t<tableRow> ... table cells 1 ... </tableRow>\r\n     * \t<tableRow> ... table cells 2 ... </tableRow>\r\n     * \t<tableRow> ... table cells 3 ... </tableRow>\r\n     * \t<caption>Caption text</caption>\r\n     * </table>\r\n     * ```\r\n     *\r\n     * we want to generate this view structure:\r\n     *\r\n     * ```html\r\n     * <figure class=\"table\">\r\n     * \t<table>\r\n     * \t\t<thead>\r\n     * \t\t\t<tr> ... table cells 1 ... </tr>\r\n     * \t\t</thead>\r\n     * \t\t<tbody>\r\n     * \t\t\t<tr> ... table cells 2 ... </tr>\r\n     * \t\t\t<tr> ... table cells 3 ... </tr>\r\n     * \t\t</tbody>\r\n     * \t</table>\r\n     * \t<figcaption>Caption text</figcaption>\r\n     * </figure>\r\n     * ```\r\n     *\r\n     * The converter has to take the `headingRows` attribute into consideration when allocating the `<tableRow>` elements\r\n     * into the `<tbody>` and `<thead>` elements. Hence, we need two slots and need to define proper filter callbacks for them.\r\n     *\r\n     * Additionally, all elements other than `<tableRow>` should be placed outside the `<table>` tag.\r\n     * In the example above, this will handle the table caption.\r\n     *\r\n     * Such a converter would look like this:\r\n     *\r\n     * ```ts\r\n     * editor.conversion.for( 'downcast' ).elementToStructure( {\r\n     * \tmodel: {\r\n     * \t\tname: 'table',\r\n     * \t\tattributes: [ 'headingRows' ]\r\n     * \t},\r\n     * \tview: ( modelElement, conversionApi ) => {\r\n     * \t\tconst { writer } = conversionApi;\r\n     *\r\n     * \t\tconst figureElement = writer.createContainerElement( 'figure', { class: 'table' } );\r\n     * \t\tconst tableElement = writer.createContainerElement( 'table' );\r\n     *\r\n     * \t\twriter.insert( writer.createPositionAt( figureElement, 0 ), tableElement );\r\n     *\r\n     * \t\tconst headingRows = modelElement.getAttribute( 'headingRows' ) || 0;\r\n     *\r\n     * \t\tif ( headingRows > 0 ) {\r\n     * \t\t\tconst tableHead = writer.createContainerElement( 'thead' );\r\n     *\r\n     * \t\t\tconst headSlot = writer.createSlot( node => node.is( 'element', 'tableRow' ) && node.index < headingRows );\r\n     *\r\n     * \t\t\twriter.insert( writer.createPositionAt( tableElement, 'end' ), tableHead );\r\n     * \t\t\twriter.insert( writer.createPositionAt( tableHead, 0 ), headSlot );\r\n     * \t\t}\r\n     *\r\n     * \t\tif ( headingRows < tableUtils.getRows( table ) ) {\r\n     * \t\t\tconst tableBody = writer.createContainerElement( 'tbody' );\r\n     *\r\n     * \t\t\tconst bodySlot = writer.createSlot( node => node.is( 'element', 'tableRow' ) && node.index >= headingRows );\r\n     *\r\n     * \t\t\twriter.insert( writer.createPositionAt( tableElement, 'end' ), tableBody );\r\n     * \t\t\twriter.insert( writer.createPositionAt( tableBody, 0 ), bodySlot );\r\n     * \t\t}\r\n     *\r\n     * \t\tconst restSlot = writer.createSlot( node => !node.is( 'element', 'tableRow' ) );\r\n     *\r\n     * \t\twriter.insert( writer.createPositionAt( figureElement, 'end' ), restSlot );\r\n     *\r\n     * \t\treturn figureElement;\r\n     * \t}\r\n     * } );\r\n     * ```\r\n     *\r\n     * Note: The children of a model element that's being converted must be allocated in the same order in the view\r\n     * in which they are placed in the model.\r\n     *\r\n     * See {@link module:engine/conversion/conversion~Conversion#for `conversion.for()`} to learn how to add a converter\r\n     * to the conversion process.\r\n     *\r\n     * @param config Conversion configuration.\r\n     * @param config.model The description or a name of the model element to convert.\r\n     * @param config.model.name The name of the model element to convert.\r\n     * @param config.model.attributes The list of attribute names that should be consumed while creating\r\n     * the view structure. Note that the view will be reconverted if any of the listed attributes will change.\r\n     * @param config.view A function that takes the model element and\r\n     * {@link module:engine/conversion/downcastdispatcher~DowncastConversionApi downcast conversion API} as parameters\r\n     * and returns a view container element with slots for model child nodes to be converted into.\r\n     */\r\n    elementToStructure(config) {\r\n        return this.add(downcastElementToStructure(config));\r\n    }\r\n    /**\r\n     * Model attribute to view element conversion helper.\r\n     *\r\n     * This conversion results in wrapping view nodes with a view attribute element. For example, a model text node with\r\n     * `\"Foo\"` as data and the `bold` attribute becomes `<strong>Foo</strong>` in the view.\r\n     *\r\n     * ```ts\r\n     * editor.conversion.for( 'downcast' ).attributeToElement( {\r\n     * \tmodel: 'bold',\r\n     * \tview: 'strong'\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'downcast' ).attributeToElement( {\r\n     * \tmodel: 'bold',\r\n     * \tview: 'b',\r\n     * \tconverterPriority: 'high'\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'downcast' ).attributeToElement( {\r\n     * \tmodel: 'invert',\r\n     * \tview: {\r\n     * \t\tname: 'span',\r\n     * \t\tclasses: [ 'font-light', 'bg-dark' ]\r\n     * \t}\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'downcast' ).attributeToElement( {\r\n     * \tmodel: {\r\n     * \t\tkey: 'fontSize',\r\n     * \t\tvalues: [ 'big', 'small' ]\r\n     * \t},\r\n     * \tview: {\r\n     * \t\tbig: {\r\n     * \t\t\tname: 'span',\r\n     * \t\t\tstyles: {\r\n     * \t\t\t\t'font-size': '1.2em'\r\n     * \t\t\t}\r\n     * \t\t},\r\n     * \t\tsmall: {\r\n     * \t\t\tname: 'span',\r\n     * \t\t\tstyles: {\r\n     * \t\t\t\t'font-size': '0.8em'\r\n     * \t\t\t}\r\n     * \t\t}\r\n     * \t}\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'downcast' ).attributeToElement( {\r\n     * \tmodel: 'bold',\r\n     * \tview: ( modelAttributeValue, conversionApi ) => {\r\n     * \t\tconst { writer } = conversionApi;\r\n     *\r\n     * \t\treturn writer.createAttributeElement( 'span', {\r\n     * \t\t\tstyle: 'font-weight:' + modelAttributeValue\r\n     * \t\t} );\r\n     * \t}\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'downcast' ).attributeToElement( {\r\n     * \tmodel: {\r\n     * \t\tkey: 'color',\r\n     * \t\tname: '$text'\r\n     * \t},\r\n     * \tview: ( modelAttributeValue, conversionApi ) => {\r\n     * \t\tconst { writer } = conversionApi;\r\n     *\r\n     * \t\treturn writer.createAttributeElement( 'span', {\r\n     * \t\t\tstyle: 'color:' + modelAttributeValue\r\n     * \t\t} );\r\n     * \t}\r\n     * } );\r\n     * ```\r\n     *\r\n     * See {@link module:engine/conversion/conversion~Conversion#for `conversion.for()`} to learn how to add a converter\r\n     * to the conversion process.\r\n     *\r\n     * @param config Conversion configuration.\r\n     * @param config.model The key of the attribute to convert from or a `{ key, values }` object. `values` is an array\r\n     * of `String`s with possible values if the model attribute is an enumerable.\r\n     * @param config.view A view element definition or a function\r\n     * that takes the model attribute value and\r\n     * {@link module:engine/conversion/downcastdispatcher~DowncastConversionApi downcast conversion API} as parameters and returns a view\r\n     * attribute element. If `config.model.values` is given, `config.view` should be an object assigning values from `config.model.values`\r\n     * to view element definitions or functions.\r\n     * @param config.converterPriority Converter priority.\r\n     */\r\n    attributeToElement(config) {\r\n        return this.add(downcastAttributeToElement(config));\r\n    }\r\n    /**\r\n     * Model attribute to view attribute conversion helper.\r\n     *\r\n     * This conversion results in adding an attribute to a view node, basing on an attribute from a model node. For example,\r\n     * `<imageInline src='foo.jpg'></imageInline>` is converted to `<img src='foo.jpg'></img>`.\r\n     *\r\n     * ```ts\r\n     * editor.conversion.for( 'downcast' ).attributeToAttribute( {\r\n     * \tmodel: 'source',\r\n     * \tview: 'src'\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'downcast' ).attributeToAttribute( {\r\n     * \tmodel: 'source',\r\n     * \tview: 'href',\r\n     * \tconverterPriority: 'high'\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'downcast' ).attributeToAttribute( {\r\n     * \tmodel: {\r\n     * \t\tname: 'imageInline',\r\n     * \t\tkey: 'source'\r\n     * \t},\r\n     * \tview: 'src'\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'downcast' ).attributeToAttribute( {\r\n     * \tmodel: {\r\n     * \t\tname: 'styled',\r\n     * \t\tvalues: [ 'dark', 'light' ]\r\n     * \t},\r\n     * \tview: {\r\n     * \t\tdark: {\r\n     * \t\t\tkey: 'class',\r\n     * \t\t\tvalue: [ 'styled', 'styled-dark' ]\r\n     * \t\t},\r\n     * \t\tlight: {\r\n     * \t\t\tkey: 'class',\r\n     * \t\t\tvalue: [ 'styled', 'styled-light' ]\r\n     * \t\t}\r\n     * \t}\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'downcast' ).attributeToAttribute( {\r\n     * \tmodel: 'styled',\r\n     * \tview: modelAttributeValue => ( {\r\n     * \t\tkey: 'class',\r\n     * \t\tvalue: 'styled-' + modelAttributeValue\r\n     * \t} )\r\n     * } );\r\n     * ```\r\n     *\r\n     * **Note**: Downcasting to a style property requires providing `value` as an object:\r\n     *\r\n     * ```ts\r\n     * editor.conversion.for( 'downcast' ).attributeToAttribute( {\r\n     * \tmodel: 'lineHeight',\r\n     * \tview: modelAttributeValue => ( {\r\n     * \t\tkey: 'style',\r\n     * \t\tvalue: {\r\n     * \t\t\t'line-height': modelAttributeValue,\r\n     * \t\t\t'border-bottom': '1px dotted #ba2'\r\n     * \t\t}\r\n     * \t} )\r\n     * } );\r\n     * ```\r\n     *\r\n     * See {@link module:engine/conversion/conversion~Conversion#for `conversion.for()`} to learn how to add a converter\r\n     * to the conversion process.\r\n     *\r\n     * @param config Conversion configuration.\r\n     * @param config.model The key of the attribute to convert from or a `{ key, values, [ name ] }` object describing\r\n     * the attribute key, possible values and, optionally, an element name to convert from.\r\n     * @param config.view A view attribute key, or a `{ key, value }` object or a function that takes the model attribute value and\r\n     * {@link module:engine/conversion/downcastdispatcher~DowncastConversionApi downcast conversion API}\r\n     * as parameters and returns a `{ key, value }` object. If the `key` is `'class'`, the `value` can be a `String` or an\r\n     * array of `String`s. If the `key` is `'style'`, the `value` is an object with key-value pairs. In other cases, `value` is a `String`.\r\n     * If `config.model.values` is set, `config.view` should be an object assigning values from `config.model.values` to\r\n     * `{ key, value }` objects or a functions.\r\n     * @param config.converterPriority Converter priority.\r\n     */\r\n    attributeToAttribute(config) {\r\n        return this.add(downcastAttributeToAttribute(config));\r\n    }\r\n    /**\r\n     * Model marker to view element conversion helper.\r\n     *\r\n     * **Note**: This method should be used mainly for editing the downcast and it is recommended\r\n     * to use the {@link #markerToData `#markerToData()`} helper instead.\r\n     *\r\n     * This helper may produce invalid HTML code (e.g. a span between table cells).\r\n     * It should only be used when you are sure that the produced HTML will be semantically correct.\r\n     *\r\n     * This conversion results in creating a view element on the boundaries of the converted marker. If the converted marker\r\n     * is collapsed, only one element is created. For example, a model marker set like this: `<paragraph>F[oo b]ar</paragraph>`\r\n     * becomes `<p>F<span data-marker=\"search\"></span>oo b<span data-marker=\"search\"></span>ar</p>` in the view.\r\n     *\r\n     * ```ts\r\n     * editor.conversion.for( 'editingDowncast' ).markerToElement( {\r\n     * \tmodel: 'search',\r\n     * \tview: 'marker-search'\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'editingDowncast' ).markerToElement( {\r\n     * \tmodel: 'search',\r\n     * \tview: 'search-result',\r\n     * \tconverterPriority: 'high'\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'editingDowncast' ).markerToElement( {\r\n     * \tmodel: 'search',\r\n     * \tview: {\r\n     * \t\tname: 'span',\r\n     * \t\tattributes: {\r\n     * \t\t\t'data-marker': 'search'\r\n     * \t\t}\r\n     * \t}\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'editingDowncast' ).markerToElement( {\r\n     * \tmodel: 'search',\r\n     * \tview: ( markerData, conversionApi ) => {\r\n     * \t\tconst { writer } = conversionApi;\r\n     *\r\n     * \t\treturn writer.createUIElement( 'span', {\r\n     * \t\t\t'data-marker': 'search',\r\n     * \t\t\t'data-start': markerData.isOpening\r\n     * \t\t} );\r\n     * \t}\r\n     * } );\r\n     * ```\r\n     *\r\n     * If a function is passed as the `config.view` parameter, it will be used to generate both boundary elements. The function\r\n     * receives the `data` object and {@link module:engine/conversion/downcastdispatcher~DowncastConversionApi downcast conversion API}\r\n     * as a parameters and should return an instance of the\r\n     * {@link module:engine/view/uielement~UIElement view UI element}. The `data` object and\r\n     * {@link module:engine/conversion/downcastdispatcher~DowncastConversionApi `conversionApi`} are passed from\r\n     * {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:addMarker}. Additionally,\r\n     * the `data.isOpening` parameter is passed, which is set to `true` for the marker start boundary element, and `false` for\r\n     * the marker end boundary element.\r\n     *\r\n     * See {@link module:engine/conversion/conversion~Conversion#for `conversion.for()`} to learn how to add a converter\r\n     * to the conversion process.\r\n     *\r\n     * @param config Conversion configuration.\r\n     * @param config.model The name of the model marker (or model marker group) to convert.\r\n     * @param config.view A view element definition or a function that takes the model marker data and\r\n     * {@link module:engine/conversion/downcastdispatcher~DowncastConversionApi downcast conversion API} as a parameters\r\n     * and returns a view UI element.\r\n     * @param config.converterPriority Converter priority.\r\n     */\r\n    markerToElement(config) {\r\n        return this.add(downcastMarkerToElement(config));\r\n    }\r\n    /**\r\n     * Model marker to highlight conversion helper.\r\n     *\r\n     * This conversion results in creating a highlight on view nodes. For this kind of conversion,\r\n     * the {@link module:engine/conversion/downcasthelpers~HighlightDescriptor} should be provided.\r\n     *\r\n     * For text nodes, a `<span>` {@link module:engine/view/attributeelement~AttributeElement} is created and it wraps all text nodes\r\n     * in the converted marker range. For example, a model marker set like this: `<paragraph>F[oo b]ar</paragraph>` becomes\r\n     * `<p>F<span class=\"comment\">oo b</span>ar</p>` in the view.\r\n     *\r\n     * {@link module:engine/view/containerelement~ContainerElement} may provide a custom way of handling highlight. Most often,\r\n     * the element itself is given classes and attributes described in the highlight descriptor (instead of being wrapped in `<span>`).\r\n     * For example, a model marker set like this:\r\n     * `[<imageInline src=\"foo.jpg\"></imageInline>]` becomes `<img src=\"foo.jpg\" class=\"comment\"></img>` in the view.\r\n     *\r\n     * For container elements, the conversion is two-step. While the converter processes the highlight descriptor and passes it\r\n     * to a container element, it is the container element instance itself that applies values from the highlight descriptor.\r\n     * So, in a sense, the converter takes care of stating what should be applied on what, while the element decides how to apply that.\r\n     *\r\n     * ```ts\r\n     * editor.conversion.for( 'downcast' ).markerToHighlight( { model: 'comment', view: { classes: 'comment' } } );\r\n     *\r\n     * editor.conversion.for( 'downcast' ).markerToHighlight( {\r\n     * \tmodel: 'comment',\r\n     * \tview: { classes: 'comment' },\r\n     * \tconverterPriority: 'high'\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'downcast' ).markerToHighlight( {\r\n     * \tmodel: 'comment',\r\n     * \tview: ( data, conversionApi ) => {\r\n     * \t\t// Assuming that the marker name is in a form of comment:commentType:commentId.\r\n     * \t\tconst [ , commentType, commentId ] = data.markerName.split( ':' );\r\n     *\r\n     * \t\treturn {\r\n     * \t\t\tclasses: [ 'comment', 'comment-' + commentType ],\r\n     * \t\t\tattributes: { 'data-comment-id': commentId }\r\n     * \t\t};\r\n     * \t}\r\n     * } );\r\n     * ```\r\n     *\r\n     * If a function is passed as the `config.view` parameter, it will be used to generate the highlight descriptor. The function\r\n     * receives the `data` object and {@link module:engine/conversion/downcastdispatcher~DowncastConversionApi downcast conversion API}\r\n     * as the parameters and should return a\r\n     * {@link module:engine/conversion/downcasthelpers~HighlightDescriptor highlight descriptor}.\r\n     * The `data` object properties are passed from {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:addMarker}.\r\n     *\r\n     * See {@link module:engine/conversion/conversion~Conversion#for `conversion.for()`} to learn how to add a converter\r\n     * to the conversion process.\r\n     *\r\n     * @param config Conversion configuration.\r\n     * @param config.model The name of the model marker (or model marker group) to convert.\r\n     * @param config.view A highlight descriptor that will be used for highlighting or a function that takes the model marker data and\r\n     * {@link module:engine/conversion/downcastdispatcher~DowncastConversionApi downcast conversion API} as a parameters\r\n     * and returns a highlight descriptor.\r\n     * @param config.converterPriority Converter priority.\r\n     */\r\n    markerToHighlight(config) {\r\n        return this.add(downcastMarkerToHighlight(config));\r\n    }\r\n    /**\r\n     * Model marker converter for data downcast.\r\n     *\r\n     * This conversion creates a representation for model marker boundaries in the view:\r\n     *\r\n     * * If the marker boundary is before or after a model element, a view attribute is set on a corresponding view element.\r\n     * * In other cases, a view element with the specified tag name is inserted at the corresponding view position.\r\n     *\r\n     * Typically, the marker names use the `group:uniqueId:otherData` convention. For example: `comment:e34zfk9k2n459df53sjl34:zx32c`.\r\n     * The default configuration for this conversion is that the first part is the `group` part and the rest of\r\n     * the marker name becomes the `name` part.\r\n     *\r\n     * Tag and attribute names and values are generated from the marker name:\r\n     *\r\n     * * The templates for attributes are `data-[group]-start-before=\"[name]\"`, `data-[group]-start-after=\"[name]\"`,\r\n     * `data-[group]-end-before=\"[name]\"` and `data-[group]-end-after=\"[name]\"`.\r\n     * * The templates for view elements are `<[group]-start name=\"[name]\">` and `<[group]-end name=\"[name]\">`.\r\n     *\r\n     * Attributes mark whether the given marker's start or end boundary is before or after the given element.\r\n     * The `data-[group]-start-before` and `data-[group]-end-after` attributes are favored.\r\n     * The other two are used when the former two cannot be used.\r\n     *\r\n     * The conversion configuration can take a function that will generate different group and name parts.\r\n     * If such a function is set as the `config.view` parameter, it is passed a marker name and it is expected to return an object with two\r\n     * properties: `group` and `name`. If the function returns a falsy value, the conversion will not take place.\r\n     *\r\n     * Basic usage:\r\n     *\r\n     * ```ts\r\n     * // Using the default conversion.\r\n     * // In this case, all markers with names starting with 'comment:' will be converted.\r\n     * // The `group` parameter will be set to `comment`.\r\n     * // The `name` parameter will be the rest of the marker name (without the `:`).\r\n     * editor.conversion.for( 'dataDowncast' ).markerToData( {\r\n     * \tmodel: 'comment'\r\n     * } );\r\n     * ```\r\n     *\r\n     * An example of a view that may be generated by this conversion (assuming a marker with the name `comment:commentId:uid` marked\r\n     * by `[]`):\r\n     *\r\n     * ```\r\n     * // Model:\r\n     * <paragraph>Foo[bar</paragraph>\r\n     * <imageBlock src=\"abc.jpg\"></imageBlock>]\r\n     *\r\n     * // View:\r\n     * <p>Foo<comment-start name=\"commentId:uid\"></comment-start>bar</p>\r\n     * <figure data-comment-end-after=\"commentId:uid\" class=\"image\"><img src=\"abc.jpg\" /></figure>\r\n     * ```\r\n     *\r\n     * In the example above, the comment starts before \"bar\" and ends after the image.\r\n     *\r\n     * If the `name` part is empty, the following view may be generated:\r\n     *\r\n     * ```html\r\n     * <p>Foo <myMarker-start></myMarker-start>bar</p>\r\n     * <figure data-myMarker-end-after=\"\" class=\"image\"><img src=\"abc.jpg\" /></figure>\r\n     * ```\r\n     *\r\n     * **Note:** A situation where some markers have the `name` part and some do not, is incorrect and should be avoided.\r\n     *\r\n     * Examples where `data-group-start-after` and `data-group-end-before` are used:\r\n     *\r\n     * ```\r\n     * // Model:\r\n     * <blockQuote>[]<paragraph>Foo</paragraph></blockQuote>\r\n     *\r\n     * // View:\r\n     * <blockquote><p data-group-end-before=\"name\" data-group-start-before=\"name\">Foo</p></blockquote>\r\n     * ```\r\n     *\r\n     * Similarly, when a marker is collapsed after the last element:\r\n     *\r\n     * ```\r\n     * // Model:\r\n     * <blockQuote><paragraph>Foo</paragraph>[]</blockQuote>\r\n     *\r\n     * // View:\r\n     * <blockquote><p data-group-end-after=\"name\" data-group-start-after=\"name\">Foo</p></blockquote>\r\n     * ```\r\n     *\r\n     * When there are multiple markers from the same group stored in the same attribute of the same element, their\r\n     * name parts are put together in the attribute value, for example: `data-group-start-before=\"name1,name2,name3\"`.\r\n     *\r\n     * Other examples of usage:\r\n     *\r\n     * ```ts\r\n     * // Using a custom function which is the same as the default conversion:\r\n     * editor.conversion.for( 'dataDowncast' ).markerToData( {\r\n     * \tmodel: 'comment'\r\n     * \tview: markerName => ( {\r\n     * \t\tgroup: 'comment',\r\n     * \t\tname: markerName.substr( 8 ) // Removes 'comment:' part.\r\n     * \t} )\r\n     * } );\r\n     *\r\n     * // Using the converter priority:\r\n     * editor.conversion.for( 'dataDowncast' ).markerToData( {\r\n     * \tmodel: 'comment'\r\n     * \tview: markerName => ( {\r\n     * \t\tgroup: 'comment',\r\n     * \t\tname: markerName.substr( 8 ) // Removes 'comment:' part.\r\n     * \t} ),\r\n     * \tconverterPriority: 'high'\r\n     * } );\r\n     * ```\r\n     *\r\n     * This kind of conversion is useful for saving data into the database, so it should be used in the data conversion pipeline.\r\n     *\r\n     * See the {@link module:engine/conversion/conversion~Conversion#for `conversion.for()`} API guide to learn how to\r\n     * add a converter to the conversion process.\r\n     *\r\n     * @param config Conversion configuration.\r\n     * @param config.model The name of the model marker (or the model marker group) to convert.\r\n     * @param config.view A function that takes the model marker name and\r\n     * {@link module:engine/conversion/downcastdispatcher~DowncastConversionApi downcast conversion API} as the parameters\r\n     * and returns an object with the `group` and `name` properties.\r\n     * @param config.converterPriority Converter priority.\r\n     */\r\n    markerToData(config) {\r\n        return this.add(downcastMarkerToData(config));\r\n    }\r\n}\r\n/**\r\n * Function factory that creates a default downcast converter for text insertion changes.\r\n *\r\n * The converter automatically consumes the corresponding value from the consumables list and stops the event (see\r\n * {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher}).\r\n *\r\n * ```ts\r\n * modelDispatcher.on( 'insert:$text', insertText() );\r\n * ```\r\n *\r\n * @returns Insert text event converter.\r\n */\r\nexport function insertText() {\r\n    return (evt, data, conversionApi) => {\r\n        if (!conversionApi.consumable.consume(data.item, evt.name)) {\r\n            return;\r\n        }\r\n        const viewWriter = conversionApi.writer;\r\n        const viewPosition = conversionApi.mapper.toViewPosition(data.range.start);\r\n        const viewText = viewWriter.createText(data.item.data);\r\n        viewWriter.insert(viewPosition, viewText);\r\n    };\r\n}\r\n/**\r\n * Function factory that creates a default downcast converter for triggering attributes and children conversion.\r\n *\r\n * @returns The converter.\r\n */\r\nexport function insertAttributesAndChildren() {\r\n    return (evt, data, conversionApi) => {\r\n        conversionApi.convertAttributes(data.item);\r\n        // Start converting children of the current item.\r\n        // In case of reconversion children were already re-inserted or converted separately.\r\n        if (!data.reconversion && data.item.is('element') && !data.item.isEmpty) {\r\n            conversionApi.convertChildren(data.item);\r\n        }\r\n    };\r\n}\r\n/**\r\n * Function factory that creates a default downcast converter for node remove changes.\r\n *\r\n * ```ts\r\n * modelDispatcher.on( 'remove', remove() );\r\n * ```\r\n *\r\n * @returns Remove event converter.\r\n */\r\nexport function remove() {\r\n    return (evt, data, conversionApi) => {\r\n        // Find the view range start position by mapping the model position at which the remove happened.\r\n        const viewStart = conversionApi.mapper.toViewPosition(data.position);\r\n        const modelEnd = data.position.getShiftedBy(data.length);\r\n        const viewEnd = conversionApi.mapper.toViewPosition(modelEnd, { isPhantom: true });\r\n        const viewRange = conversionApi.writer.createRange(viewStart, viewEnd);\r\n        // Trim the range to remove in case some UI elements are on the view range boundaries.\r\n        const removed = conversionApi.writer.remove(viewRange.getTrimmed());\r\n        // After the range is removed, unbind all view elements from the model.\r\n        // Range inside view document fragment is used to unbind deeply.\r\n        for (const child of conversionApi.writer.createRangeIn(removed).getItems()) {\r\n            conversionApi.mapper.unbindViewElement(child, { defer: true });\r\n        }\r\n    };\r\n}\r\n/**\r\n * Creates a `<span>` {@link module:engine/view/attributeelement~AttributeElement view attribute element} from the information\r\n * provided by the {@link module:engine/conversion/downcasthelpers~HighlightDescriptor highlight descriptor} object. If the priority\r\n * is not provided in the descriptor, the default priority will be used.\r\n */\r\nexport function createViewElementFromHighlightDescriptor(writer, descriptor) {\r\n    const viewElement = writer.createAttributeElement('span', descriptor.attributes);\r\n    if (descriptor.classes) {\r\n        viewElement._addClass(descriptor.classes);\r\n    }\r\n    if (typeof descriptor.priority === 'number') {\r\n        viewElement._priority = descriptor.priority;\r\n    }\r\n    viewElement._id = descriptor.id;\r\n    return viewElement;\r\n}\r\n/**\r\n * Function factory that creates a converter which converts a non-collapsed {@link module:engine/model/selection~Selection model selection}\r\n * to a {@link module:engine/view/documentselection~DocumentSelection view selection}. The converter consumes appropriate\r\n * value from the `consumable` object and maps model positions from the selection to view positions.\r\n *\r\n * ```ts\r\n * modelDispatcher.on( 'selection', convertRangeSelection() );\r\n * ```\r\n *\r\n * @returns Selection converter.\r\n */\r\nexport function convertRangeSelection() {\r\n    return (evt, data, conversionApi) => {\r\n        const selection = data.selection;\r\n        if (selection.isCollapsed) {\r\n            return;\r\n        }\r\n        if (!conversionApi.consumable.consume(selection, 'selection')) {\r\n            return;\r\n        }\r\n        const viewRanges = [];\r\n        for (const range of selection.getRanges()) {\r\n            viewRanges.push(conversionApi.mapper.toViewRange(range));\r\n        }\r\n        conversionApi.writer.setSelection(viewRanges, { backward: selection.isBackward });\r\n    };\r\n}\r\n/**\r\n * Function factory that creates a converter which converts a collapsed {@link module:engine/model/selection~Selection model selection} to\r\n * a {@link module:engine/view/documentselection~DocumentSelection view selection}. The converter consumes appropriate\r\n * value from the `consumable` object, maps the model selection position to the view position and breaks\r\n * {@link module:engine/view/attributeelement~AttributeElement attribute elements} at the selection position.\r\n *\r\n * ```ts\r\n * modelDispatcher.on( 'selection', convertCollapsedSelection() );\r\n * ```\r\n *\r\n * An example of the view state before and after converting the collapsed selection:\r\n *\r\n * ```\r\n *    <p><strong>f^oo<strong>bar</p>\r\n * -> <p><strong>f</strong>^<strong>oo</strong>bar</p>\r\n * ```\r\n *\r\n * By breaking attribute elements like `<strong>`, the selection is in a correct element. Then, when the selection attribute is\r\n * converted, broken attributes might be merged again, or the position where the selection is may be wrapped\r\n * with different, appropriate attribute elements.\r\n *\r\n * See also {@link module:engine/conversion/downcasthelpers~clearAttributes} which does a clean-up\r\n * by merging attributes.\r\n *\r\n * @returns Selection converter.\r\n */\r\nexport function convertCollapsedSelection() {\r\n    return (evt, data, conversionApi) => {\r\n        const selection = data.selection;\r\n        if (!selection.isCollapsed) {\r\n            return;\r\n        }\r\n        if (!conversionApi.consumable.consume(selection, 'selection')) {\r\n            return;\r\n        }\r\n        const viewWriter = conversionApi.writer;\r\n        const modelPosition = selection.getFirstPosition();\r\n        const viewPosition = conversionApi.mapper.toViewPosition(modelPosition);\r\n        const brokenPosition = viewWriter.breakAttributes(viewPosition);\r\n        viewWriter.setSelection(brokenPosition);\r\n    };\r\n}\r\n/**\r\n * Function factory that creates a converter which clears artifacts after the previous\r\n * {@link module:engine/model/selection~Selection model selection} conversion. It removes all empty\r\n * {@link module:engine/view/attributeelement~AttributeElement view attribute elements} and merges sibling attributes at all start and end\r\n * positions of all ranges.\r\n *\r\n * ```\r\n *    <p><strong>^</strong></p>\r\n * -> <p>^</p>\r\n *\r\n *    <p><strong>foo</strong>^<strong>bar</strong>bar</p>\r\n * -> <p><strong>foo^bar<strong>bar</p>\r\n *\r\n *    <p><strong>foo</strong><em>^</em><strong>bar</strong>bar</p>\r\n * -> <p><strong>foo^bar<strong>bar</p>\r\n * ```\r\n *\r\n * This listener should be assigned before any converter for the new selection:\r\n *\r\n * ```ts\r\n * modelDispatcher.on( 'selection', clearAttributes() );\r\n * ```\r\n *\r\n * See {@link module:engine/conversion/downcasthelpers~convertCollapsedSelection}\r\n * which does the opposite by breaking attributes in the selection position.\r\n *\r\n * @returns Selection converter.\r\n */\r\nexport function clearAttributes() {\r\n    return (evt, data, conversionApi) => {\r\n        const viewWriter = conversionApi.writer;\r\n        const viewSelection = viewWriter.document.selection;\r\n        for (const range of viewSelection.getRanges()) {\r\n            // Not collapsed selection should not have artifacts.\r\n            if (range.isCollapsed) {\r\n                // Position might be in the node removed by the view writer.\r\n                if (range.end.parent.isAttached()) {\r\n                    conversionApi.writer.mergeAttributes(range.start);\r\n                }\r\n            }\r\n        }\r\n        viewWriter.setSelection(null);\r\n    };\r\n}\r\n/**\r\n * Function factory that creates a converter which converts the set/change/remove attribute changes from the model to the view.\r\n * It can also be used to convert selection attributes. In that case, an empty attribute element will be created and the\r\n * selection will be put inside it.\r\n *\r\n * Attributes from the model are converted to a view element that will be wrapping these view nodes that are bound to\r\n * model elements having the given attribute. This is useful for attributes like `bold` that may be set on text nodes in the model\r\n * but are represented as an element in the view:\r\n *\r\n * ```\r\n * [paragraph]              MODEL ====> VIEW        <p>\r\n * \t|- a {bold: true}                             |- <b>\r\n * \t|- b {bold: true}                             |   |- ab\r\n * \t|- c                                          |- c\r\n * \t```\r\n *\r\n * Passed `Function` will be provided with the attribute value and then all the parameters of the\r\n * {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:attribute `attribute` event}.\r\n * It is expected that the function returns an {@link module:engine/view/element~Element}.\r\n * The result of the function will be the wrapping element.\r\n * When the provided `Function` does not return any element, no conversion will take place.\r\n *\r\n * The converter automatically consumes the corresponding value from the consumables list and stops the event (see\r\n * {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher}).\r\n *\r\n * ```ts\r\n * modelDispatcher.on( 'attribute:bold', wrap( ( modelAttributeValue, { writer } ) => {\r\n * \treturn writer.createAttributeElement( 'strong' );\r\n * } );\r\n * ```\r\n *\r\n * @internal\r\n * @param elementCreator Function returning a view element that will be used for wrapping.\r\n * @returns Set/change attribute converter.\r\n */\r\nexport function wrap(elementCreator) {\r\n    return (evt, data, conversionApi) => {\r\n        if (!conversionApi.consumable.test(data.item, evt.name)) {\r\n            return;\r\n        }\r\n        // Recreate current wrapping node. It will be used to unwrap view range if the attribute value has changed\r\n        // or the attribute was removed.\r\n        const oldViewElement = elementCreator(data.attributeOldValue, conversionApi, data);\r\n        // Create node to wrap with.\r\n        const newViewElement = elementCreator(data.attributeNewValue, conversionApi, data);\r\n        if (!oldViewElement && !newViewElement) {\r\n            return;\r\n        }\r\n        conversionApi.consumable.consume(data.item, evt.name);\r\n        const viewWriter = conversionApi.writer;\r\n        const viewSelection = viewWriter.document.selection;\r\n        if (data.item instanceof ModelSelection || data.item instanceof ModelDocumentSelection) {\r\n            // Selection attribute conversion.\r\n            viewWriter.wrap(viewSelection.getFirstRange(), newViewElement);\r\n        }\r\n        else {\r\n            // Node attribute conversion.\r\n            let viewRange = conversionApi.mapper.toViewRange(data.range);\r\n            // First, unwrap the range from current wrapper.\r\n            if (data.attributeOldValue !== null && oldViewElement) {\r\n                viewRange = viewWriter.unwrap(viewRange, oldViewElement);\r\n            }\r\n            if (data.attributeNewValue !== null && newViewElement) {\r\n                viewWriter.wrap(viewRange, newViewElement);\r\n            }\r\n        }\r\n    };\r\n}\r\n/**\r\n * Function factory that creates a converter which converts node insertion changes from the model to the view.\r\n * The function passed will be provided with all the parameters of the dispatcher's\r\n * {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:insert `insert` event}.\r\n * It is expected that the function returns an {@link module:engine/view/element~Element}.\r\n * The result of the function will be inserted into the view.\r\n *\r\n * The converter automatically consumes the corresponding value from the consumables list and binds the model and view elements.\r\n *\r\n * ```ts\r\n * downcastDispatcher.on(\r\n * \t'insert:myElem',\r\n * \tinsertElement( ( modelItem, { writer } ) => {\r\n * \t\tconst text = writer.createText( 'myText' );\r\n * \t\tconst myElem = writer.createElement( 'myElem', { myAttr: 'my-' + modelItem.getAttribute( 'myAttr' ) }, text );\r\n *\r\n * \t\t// Do something fancy with `myElem` using `modelItem` or other parameters.\r\n *\r\n * \t\treturn myElem;\r\n * \t}\r\n * ) );\r\n * ```\r\n *\r\n * @internal\r\n * @param  elementCreator Function returning a view element, which will be inserted.\r\n * @param consumer Function defining element consumption process.\r\n * By default this function just consume passed item insertion.\r\n * @returns Insert element event converter.\r\n */\r\nexport function insertElement(elementCreator, consumer = defaultConsumer) {\r\n    return (evt, data, conversionApi) => {\r\n        if (!consumer(data.item, conversionApi.consumable, { preflight: true })) {\r\n            return;\r\n        }\r\n        const viewElement = elementCreator(data.item, conversionApi, data);\r\n        if (!viewElement) {\r\n            return;\r\n        }\r\n        // Consume an element insertion and all present attributes that are specified as a reconversion triggers.\r\n        consumer(data.item, conversionApi.consumable);\r\n        const viewPosition = conversionApi.mapper.toViewPosition(data.range.start);\r\n        conversionApi.mapper.bindElements(data.item, viewElement);\r\n        conversionApi.writer.insert(viewPosition, viewElement);\r\n        // Convert attributes before converting children.\r\n        conversionApi.convertAttributes(data.item);\r\n        // Convert children or reinsert previous view elements.\r\n        reinsertOrConvertNodes(viewElement, data.item.getChildren(), conversionApi, { reconversion: data.reconversion });\r\n    };\r\n}\r\n/**\r\n * Function factory that creates a converter which converts a single model node insertion to a view structure.\r\n *\r\n * It is expected that the passed element creator function returns an {@link module:engine/view/element~Element} with attached slots\r\n * created with `writer.createSlot()` to indicate where child nodes should be converted.\r\n *\r\n * @see module:engine/conversion/downcasthelpers~DowncastHelpers#elementToStructure\r\n *\r\n * @internal\r\n * @param elementCreator Function returning a view structure, which will be inserted.\r\n * @param consumer A callback that is expected to consume all the consumables\r\n * that were used by the element creator.\r\n * @returns Insert element event converter.\r\n*/\r\nexport function insertStructure(elementCreator, consumer) {\r\n    return (evt, data, conversionApi) => {\r\n        if (!consumer(data.item, conversionApi.consumable, { preflight: true })) {\r\n            return;\r\n        }\r\n        const slotsMap = new Map();\r\n        conversionApi.writer._registerSlotFactory(createSlotFactory(data.item, slotsMap, conversionApi));\r\n        // View creation.\r\n        const viewElement = elementCreator(data.item, conversionApi, data);\r\n        conversionApi.writer._clearSlotFactory();\r\n        if (!viewElement) {\r\n            return;\r\n        }\r\n        // Check if all children are covered by slots and there is no child that landed in multiple slots.\r\n        validateSlotsChildren(data.item, slotsMap, conversionApi);\r\n        // Consume an element insertion and all present attributes that are specified as a reconversion triggers.\r\n        consumer(data.item, conversionApi.consumable);\r\n        const viewPosition = conversionApi.mapper.toViewPosition(data.range.start);\r\n        conversionApi.mapper.bindElements(data.item, viewElement);\r\n        conversionApi.writer.insert(viewPosition, viewElement);\r\n        // Convert attributes before converting children.\r\n        conversionApi.convertAttributes(data.item);\r\n        // Fill view slots with previous view elements or create new ones.\r\n        fillSlots(viewElement, slotsMap, conversionApi, { reconversion: data.reconversion });\r\n    };\r\n}\r\n/**\r\n * Function factory that creates a converter which converts marker adding change to the\r\n * {@link module:engine/view/uielement~UIElement view UI element}.\r\n *\r\n * The view UI element that will be added to the view depends on the passed parameter. See {@link ~insertElement}.\r\n * In case of a non-collapsed range, the UI element will not wrap nodes but separate elements will be placed at the beginning\r\n * and at the end of the range.\r\n *\r\n * This converter binds created UI elements with the marker name using {@link module:engine/conversion/mapper~Mapper#bindElementToMarker}.\r\n *\r\n * @internal\r\n * @param elementCreator A view UI element or a function returning the view element that will be inserted.\r\n * @returns Insert element event converter.\r\n */\r\nexport function insertUIElement(elementCreator) {\r\n    return (evt, data, conversionApi) => {\r\n        // Create two view elements. One will be inserted at the beginning of marker, one at the end.\r\n        // If marker is collapsed, only \"opening\" element will be inserted.\r\n        data.isOpening = true;\r\n        const viewStartElement = elementCreator(data, conversionApi);\r\n        data.isOpening = false;\r\n        const viewEndElement = elementCreator(data, conversionApi);\r\n        if (!viewStartElement || !viewEndElement) {\r\n            return;\r\n        }\r\n        const markerRange = data.markerRange;\r\n        // Marker that is collapsed has consumable build differently that non-collapsed one.\r\n        // For more information see `addMarker` event description.\r\n        // If marker's range is collapsed - check if it can be consumed.\r\n        if (markerRange.isCollapsed && !conversionApi.consumable.consume(markerRange, evt.name)) {\r\n            return;\r\n        }\r\n        // If marker's range is not collapsed - consume all items inside.\r\n        for (const value of markerRange) {\r\n            if (!conversionApi.consumable.consume(value.item, evt.name)) {\r\n                return;\r\n            }\r\n        }\r\n        const mapper = conversionApi.mapper;\r\n        const viewWriter = conversionApi.writer;\r\n        // Add \"opening\" element.\r\n        viewWriter.insert(mapper.toViewPosition(markerRange.start), viewStartElement);\r\n        conversionApi.mapper.bindElementToMarker(viewStartElement, data.markerName);\r\n        // Add \"closing\" element only if range is not collapsed.\r\n        if (!markerRange.isCollapsed) {\r\n            viewWriter.insert(mapper.toViewPosition(markerRange.end), viewEndElement);\r\n            conversionApi.mapper.bindElementToMarker(viewEndElement, data.markerName);\r\n        }\r\n        evt.stop();\r\n    };\r\n}\r\n/**\r\n * Function factory that returns a default downcast converter for removing a {@link module:engine/view/uielement~UIElement UI element}\r\n * based on marker remove change.\r\n *\r\n * This converter unbinds elements from the marker name.\r\n *\r\n * @returns Removed UI element converter.\r\n */\r\nfunction removeUIElement() {\r\n    return (evt, data, conversionApi) => {\r\n        const elements = conversionApi.mapper.markerNameToElements(data.markerName);\r\n        if (!elements) {\r\n            return;\r\n        }\r\n        for (const element of elements) {\r\n            conversionApi.mapper.unbindElementFromMarkerName(element, data.markerName);\r\n            conversionApi.writer.clear(conversionApi.writer.createRangeOn(element), element);\r\n        }\r\n        conversionApi.writer.clearClonedElementsGroup(data.markerName);\r\n        evt.stop();\r\n    };\r\n}\r\n/**\r\n * Function factory that creates a default converter for model markers.\r\n *\r\n * See {@link DowncastHelpers#markerToData} for more information what type of view is generated.\r\n *\r\n * This converter binds created UI elements and affected view elements with the marker name\r\n * using {@link module:engine/conversion/mapper~Mapper#bindElementToMarker}.\r\n *\r\n * @returns Add marker converter.\r\n */\r\nfunction insertMarkerData(viewCreator) {\r\n    return (evt, data, conversionApi) => {\r\n        const viewMarkerData = viewCreator(data.markerName, conversionApi);\r\n        if (!viewMarkerData) {\r\n            return;\r\n        }\r\n        const markerRange = data.markerRange;\r\n        if (!conversionApi.consumable.consume(markerRange, evt.name)) {\r\n            return;\r\n        }\r\n        // Adding closing data first to keep the proper order in the view.\r\n        handleMarkerBoundary(markerRange, false, conversionApi, data, viewMarkerData);\r\n        handleMarkerBoundary(markerRange, true, conversionApi, data, viewMarkerData);\r\n        evt.stop();\r\n    };\r\n}\r\n/**\r\n * Helper function for `insertMarkerData()` that marks a marker boundary at the beginning or end of given `range`.\r\n */\r\nfunction handleMarkerBoundary(range, isStart, conversionApi, data, viewMarkerData) {\r\n    const modelPosition = isStart ? range.start : range.end;\r\n    const elementAfter = modelPosition.nodeAfter && modelPosition.nodeAfter.is('element') ? modelPosition.nodeAfter : null;\r\n    const elementBefore = modelPosition.nodeBefore && modelPosition.nodeBefore.is('element') ? modelPosition.nodeBefore : null;\r\n    if (elementAfter || elementBefore) {\r\n        let modelElement;\r\n        let isBefore;\r\n        // If possible, we want to add `data-group-start-before` and `data-group-end-after` attributes.\r\n        if (isStart && elementAfter || !isStart && !elementBefore) {\r\n            // [<elementAfter>...</elementAfter> -> <elementAfter data-group-start-before=\"...\">...</elementAfter>\r\n            // <parent>]<elementAfter> -> <parent><elementAfter data-group-end-before=\"...\">\r\n            modelElement = elementAfter;\r\n            isBefore = true;\r\n        }\r\n        else {\r\n            // <elementBefore>...</elementBefore>] -> <elementBefore data-group-end-after=\"...\">...</elementBefore>\r\n            // </elementBefore>[</parent> -> </elementBefore data-group-start-after=\"...\"></parent>\r\n            modelElement = elementBefore;\r\n            isBefore = false;\r\n        }\r\n        const viewElement = conversionApi.mapper.toViewElement(modelElement);\r\n        // In rare circumstances, the model element may be not mapped to any view element and that would cause an error.\r\n        // One of those situations is a soft break inside code block.\r\n        if (viewElement) {\r\n            insertMarkerAsAttribute(viewElement, isStart, isBefore, conversionApi, data, viewMarkerData);\r\n            return;\r\n        }\r\n    }\r\n    const viewPosition = conversionApi.mapper.toViewPosition(modelPosition);\r\n    insertMarkerAsElement(viewPosition, isStart, conversionApi, data, viewMarkerData);\r\n}\r\n/**\r\n * Helper function for `insertMarkerData()` that marks a marker boundary in the view as an attribute on a view element.\r\n */\r\nfunction insertMarkerAsAttribute(viewElement, isStart, isBefore, conversionApi, data, viewMarkerData) {\r\n    const attributeName = `data-${viewMarkerData.group}-${isStart ? 'start' : 'end'}-${isBefore ? 'before' : 'after'}`;\r\n    const markerNames = viewElement.hasAttribute(attributeName) ? viewElement.getAttribute(attributeName).split(',') : [];\r\n    // Adding marker name at the beginning to have the same order in the attribute as there is with marker elements.\r\n    markerNames.unshift(viewMarkerData.name);\r\n    conversionApi.writer.setAttribute(attributeName, markerNames.join(','), viewElement);\r\n    conversionApi.mapper.bindElementToMarker(viewElement, data.markerName);\r\n}\r\n/**\r\n * Helper function for `insertMarkerData()` that marks a marker boundary in the view as a separate view ui element.\r\n */\r\nfunction insertMarkerAsElement(position, isStart, conversionApi, data, viewMarkerData) {\r\n    const viewElementName = `${viewMarkerData.group}-${isStart ? 'start' : 'end'}`;\r\n    const attrs = viewMarkerData.name ? { 'name': viewMarkerData.name } : null;\r\n    const viewElement = conversionApi.writer.createUIElement(viewElementName, attrs);\r\n    conversionApi.writer.insert(position, viewElement);\r\n    conversionApi.mapper.bindElementToMarker(viewElement, data.markerName);\r\n}\r\n/**\r\n * Function factory that creates a converter for removing a model marker data added by the {@link #insertMarkerData} converter.\r\n *\r\n * @returns Remove marker converter.\r\n */\r\nfunction removeMarkerData(viewCreator) {\r\n    return (evt, data, conversionApi) => {\r\n        const viewData = viewCreator(data.markerName, conversionApi);\r\n        if (!viewData) {\r\n            return;\r\n        }\r\n        const elements = conversionApi.mapper.markerNameToElements(data.markerName);\r\n        if (!elements) {\r\n            return;\r\n        }\r\n        for (const element of elements) {\r\n            conversionApi.mapper.unbindElementFromMarkerName(element, data.markerName);\r\n            if (element.is('containerElement')) {\r\n                removeMarkerFromAttribute(`data-${viewData.group}-start-before`, element);\r\n                removeMarkerFromAttribute(`data-${viewData.group}-start-after`, element);\r\n                removeMarkerFromAttribute(`data-${viewData.group}-end-before`, element);\r\n                removeMarkerFromAttribute(`data-${viewData.group}-end-after`, element);\r\n            }\r\n            else {\r\n                conversionApi.writer.clear(conversionApi.writer.createRangeOn(element), element);\r\n            }\r\n        }\r\n        conversionApi.writer.clearClonedElementsGroup(data.markerName);\r\n        evt.stop();\r\n        function removeMarkerFromAttribute(attributeName, element) {\r\n            if (element.hasAttribute(attributeName)) {\r\n                const markerNames = new Set(element.getAttribute(attributeName).split(','));\r\n                markerNames.delete(viewData.name);\r\n                if (markerNames.size == 0) {\r\n                    conversionApi.writer.removeAttribute(attributeName, element);\r\n                }\r\n                else {\r\n                    conversionApi.writer.setAttribute(attributeName, Array.from(markerNames).join(','), element);\r\n                }\r\n            }\r\n        }\r\n    };\r\n}\r\n/**\r\n * Function factory that creates a converter which converts the set/change/remove attribute changes from the model to the view.\r\n *\r\n * Attributes from the model are converted to the view element attributes in the view. You may provide a custom function to generate\r\n * a key-value attribute pair to add/change/remove. If not provided, model attributes will be converted to view element\r\n * attributes on a one-to-one basis.\r\n *\r\n * *Note:** The provided attribute creator should always return the same `key` for a given attribute from the model.\r\n *\r\n * The converter automatically consumes the corresponding value from the consumables list and stops the event (see\r\n * {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher}).\r\n *\r\n * ```ts\r\n * modelDispatcher.on( 'attribute:customAttr:myElem', changeAttribute( ( value, data ) => {\r\n * \t// Change attribute key from `customAttr` to `class` in the view.\r\n * \tconst key = 'class';\r\n * \tlet value = data.attributeNewValue;\r\n *\r\n * \t// Force attribute value to 'empty' if the model element is empty.\r\n * \tif ( data.item.childCount === 0 ) {\r\n * \t\tvalue = 'empty';\r\n * \t}\r\n *\r\n * \t// Return the key-value pair.\r\n * \treturn { key, value };\r\n * } ) );\r\n * ```\r\n *\r\n * @param attributeCreator Function returning an object with two properties: `key` and `value`, which\r\n * represent the attribute key and attribute value to be set on a {@link module:engine/view/element~Element view element}.\r\n * The function is passed the model attribute value as the first parameter and additional data about the change as the second parameter.\r\n * @returns Set/change attribute converter.\r\n */\r\nfunction changeAttribute(attributeCreator) {\r\n    return (evt, data, conversionApi) => {\r\n        if (!conversionApi.consumable.test(data.item, evt.name)) {\r\n            return;\r\n        }\r\n        const oldAttribute = attributeCreator(data.attributeOldValue, conversionApi, data);\r\n        const newAttribute = attributeCreator(data.attributeNewValue, conversionApi, data);\r\n        if (!oldAttribute && !newAttribute) {\r\n            return;\r\n        }\r\n        conversionApi.consumable.consume(data.item, evt.name);\r\n        const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n        const viewWriter = conversionApi.writer;\r\n        // If model item cannot be mapped to a view element, it means item is not an `Element` instance but a `TextProxy` node.\r\n        // Only elements can have attributes in a view so do not proceed for anything else (#1587).\r\n        if (!viewElement) {\r\n            /**\r\n             * This error occurs when a {@link module:engine/model/textproxy~TextProxy text node's} attribute is to be downcasted\r\n             * by an {@link module:engine/conversion/conversion~Conversion#attributeToAttribute `Attribute to Attribute converter`}.\r\n             * In most cases it is caused by converters misconfiguration when only \"generic\" converter is defined:\r\n             *\r\n             * ```ts\r\n             * editor.conversion.for( 'downcast' ).attributeToAttribute( {\r\n             * \tmodel: 'attribute-name',\r\n             * \tview: 'attribute-name'\r\n             * } ) );\r\n             * ```\r\n             *\r\n             * and given attribute is used on text node, for example:\r\n             *\r\n             * ```ts\r\n             * model.change( writer => {\r\n             * \twriter.insertText( 'Foo', { 'attribute-name': 'bar' }, parent, 0 );\r\n             * } );\r\n             * ```\r\n             *\r\n             * In such cases, to convert the same attribute for both {@link module:engine/model/element~Element}\r\n             * and {@link module:engine/model/textproxy~TextProxy `Text`} nodes, text specific\r\n             * {@link module:engine/conversion/conversion~Conversion#attributeToElement `Attribute to Element converter`}\r\n             * with higher {@link module:utils/priorities~PriorityString priority} must also be defined:\r\n             *\r\n             * ```ts\r\n             * editor.conversion.for( 'downcast' ).attributeToElement( {\r\n             * \tmodel: {\r\n             * \t\tkey: 'attribute-name',\r\n             * \t\tname: '$text'\r\n             * \t},\r\n             * \tview: ( value, { writer } ) => {\r\n             * \t\treturn writer.createAttributeElement( 'span', { 'attribute-name': value } );\r\n             * \t},\r\n             * \tconverterPriority: 'high'\r\n             * } ) );\r\n             * ```\r\n             *\r\n             * @error conversion-attribute-to-attribute-on-text\r\n             */\r\n            throw new CKEditorError('conversion-attribute-to-attribute-on-text', conversionApi.dispatcher, data);\r\n        }\r\n        // First remove the old attribute if there was one.\r\n        if (data.attributeOldValue !== null && oldAttribute) {\r\n            if (oldAttribute.key == 'class') {\r\n                const classes = toArray(oldAttribute.value);\r\n                for (const className of classes) {\r\n                    viewWriter.removeClass(className, viewElement);\r\n                }\r\n            }\r\n            else if (oldAttribute.key == 'style') {\r\n                const keys = Object.keys(oldAttribute.value);\r\n                for (const key of keys) {\r\n                    viewWriter.removeStyle(key, viewElement);\r\n                }\r\n            }\r\n            else {\r\n                viewWriter.removeAttribute(oldAttribute.key, viewElement);\r\n            }\r\n        }\r\n        // Then set the new attribute.\r\n        if (data.attributeNewValue !== null && newAttribute) {\r\n            if (newAttribute.key == 'class') {\r\n                const classes = toArray(newAttribute.value);\r\n                for (const className of classes) {\r\n                    viewWriter.addClass(className, viewElement);\r\n                }\r\n            }\r\n            else if (newAttribute.key == 'style') {\r\n                const keys = Object.keys(newAttribute.value);\r\n                for (const key of keys) {\r\n                    viewWriter.setStyle(key, newAttribute.value[key], viewElement);\r\n                }\r\n            }\r\n            else {\r\n                viewWriter.setAttribute(newAttribute.key, newAttribute.value, viewElement);\r\n            }\r\n        }\r\n    };\r\n}\r\n/**\r\n * Function factory that creates a converter which converts the text inside marker's range. The converter wraps the text with\r\n * {@link module:engine/view/attributeelement~AttributeElement} created from the provided descriptor.\r\n * See {link module:engine/conversion/downcasthelpers~createViewElementFromHighlightDescriptor}.\r\n *\r\n * It can also be used to convert the selection that is inside a marker. In that case, an empty attribute element will be\r\n * created and the selection will be put inside it.\r\n *\r\n * If the highlight descriptor does not provide the `priority` property, `10` will be used.\r\n *\r\n * If the highlight descriptor does not provide the `id` property, the name of the marker will be used.\r\n *\r\n * This converter binds the created {@link module:engine/view/attributeelement~AttributeElement attribute elemens} with the marker name\r\n * using the {@link module:engine/conversion/mapper~Mapper#bindElementToMarker} method.\r\n */\r\nfunction highlightText(highlightDescriptor) {\r\n    return (evt, data, conversionApi) => {\r\n        if (!data.item) {\r\n            return;\r\n        }\r\n        if (!(data.item instanceof ModelSelection || data.item instanceof ModelDocumentSelection) && !data.item.is('$textProxy')) {\r\n            return;\r\n        }\r\n        const descriptor = prepareDescriptor(highlightDescriptor, data, conversionApi);\r\n        if (!descriptor) {\r\n            return;\r\n        }\r\n        if (!conversionApi.consumable.consume(data.item, evt.name)) {\r\n            return;\r\n        }\r\n        const viewWriter = conversionApi.writer;\r\n        const viewElement = createViewElementFromHighlightDescriptor(viewWriter, descriptor);\r\n        const viewSelection = viewWriter.document.selection;\r\n        if (data.item instanceof ModelSelection || data.item instanceof ModelDocumentSelection) {\r\n            viewWriter.wrap(viewSelection.getFirstRange(), viewElement);\r\n        }\r\n        else {\r\n            const viewRange = conversionApi.mapper.toViewRange(data.range);\r\n            const rangeAfterWrap = viewWriter.wrap(viewRange, viewElement);\r\n            for (const element of rangeAfterWrap.getItems()) {\r\n                if (element.is('attributeElement') && element.isSimilar(viewElement)) {\r\n                    conversionApi.mapper.bindElementToMarker(element, data.markerName);\r\n                    // One attribute element is enough, because all of them are bound together by the view writer.\r\n                    // Mapper uses this binding to get all the elements no matter how many of them are registered in the mapper.\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n    };\r\n}\r\n/**\r\n * Converter function factory. It creates a function which applies the marker's highlight to an element inside the marker's range.\r\n *\r\n * The converter checks if an element has the `addHighlight` function stored as a\r\n * {@link module:engine/view/element~Element#_setCustomProperty custom property} and, if so, uses it to apply the highlight.\r\n * In such case the converter will consume all element's children, assuming that they were handled by the element itself.\r\n *\r\n * When the `addHighlight` custom property is not present, the element is not converted in any special way.\r\n * This means that converters will proceed to convert the element's child nodes.\r\n *\r\n * If the highlight descriptor does not provide the `priority` property, `10` will be used.\r\n *\r\n * If the highlight descriptor does not provide the `id` property, the name of the marker will be used.\r\n *\r\n * This converter binds altered {@link module:engine/view/containerelement~ContainerElement container elements} with the marker name using\r\n * the {@link module:engine/conversion/mapper~Mapper#bindElementToMarker} method.\r\n */\r\nfunction highlightElement(highlightDescriptor) {\r\n    return (evt, data, conversionApi) => {\r\n        if (!data.item) {\r\n            return;\r\n        }\r\n        if (!(data.item instanceof ModelElement)) {\r\n            return;\r\n        }\r\n        const descriptor = prepareDescriptor(highlightDescriptor, data, conversionApi);\r\n        if (!descriptor) {\r\n            return;\r\n        }\r\n        if (!conversionApi.consumable.test(data.item, evt.name)) {\r\n            return;\r\n        }\r\n        const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n        if (viewElement && viewElement.getCustomProperty('addHighlight')) {\r\n            // Consume element itself.\r\n            conversionApi.consumable.consume(data.item, evt.name);\r\n            // Consume all children nodes.\r\n            for (const value of ModelRange._createIn(data.item)) {\r\n                conversionApi.consumable.consume(value.item, evt.name);\r\n            }\r\n            const addHighlightCallback = viewElement.getCustomProperty('addHighlight');\r\n            addHighlightCallback(viewElement, descriptor, conversionApi.writer);\r\n            conversionApi.mapper.bindElementToMarker(viewElement, data.markerName);\r\n        }\r\n    };\r\n}\r\n/**\r\n * Function factory that creates a converter which converts the removing model marker to the view.\r\n *\r\n * Both text nodes and elements are handled by this converter but they are handled a bit differently.\r\n *\r\n * Text nodes are unwrapped using the {@link module:engine/view/attributeelement~AttributeElement attribute element} created from the\r\n * provided highlight descriptor. See {link module:engine/conversion/downcasthelpers~HighlightDescriptor}.\r\n *\r\n * For elements, the converter checks if an element has the `removeHighlight` function stored as a\r\n * {@link module:engine/view/element~Element#_setCustomProperty custom property}. If so, it uses it to remove the highlight.\r\n * In such case, the children of that element will not be converted.\r\n *\r\n * When `removeHighlight` is not present, the element is not converted in any special way.\r\n * The converter will proceed to convert the element's child nodes instead.\r\n *\r\n * If the highlight descriptor does not provide the `priority` property, `10` will be used.\r\n *\r\n * If the highlight descriptor does not provide the `id` property, the name of the marker will be used.\r\n *\r\n * This converter unbinds elements from the marker name.\r\n */\r\nfunction removeHighlight(highlightDescriptor) {\r\n    return (evt, data, conversionApi) => {\r\n        // This conversion makes sense only for non-collapsed range.\r\n        if (data.markerRange.isCollapsed) {\r\n            return;\r\n        }\r\n        const descriptor = prepareDescriptor(highlightDescriptor, data, conversionApi);\r\n        if (!descriptor) {\r\n            return;\r\n        }\r\n        // View element that will be used to unwrap `AttributeElement`s.\r\n        const viewHighlightElement = createViewElementFromHighlightDescriptor(conversionApi.writer, descriptor);\r\n        // Get all elements bound with given marker name.\r\n        const elements = conversionApi.mapper.markerNameToElements(data.markerName);\r\n        if (!elements) {\r\n            return;\r\n        }\r\n        for (const element of elements) {\r\n            conversionApi.mapper.unbindElementFromMarkerName(element, data.markerName);\r\n            if (element.is('attributeElement')) {\r\n                conversionApi.writer.unwrap(conversionApi.writer.createRangeOn(element), viewHighlightElement);\r\n            }\r\n            else {\r\n                // if element.is( 'containerElement' ).\r\n                const removeHighlightCallback = element.getCustomProperty('removeHighlight');\r\n                removeHighlightCallback(element, descriptor.id, conversionApi.writer);\r\n            }\r\n        }\r\n        conversionApi.writer.clearClonedElementsGroup(data.markerName);\r\n        evt.stop();\r\n    };\r\n}\r\n/**\r\n * Model element to view element conversion helper.\r\n *\r\n * See {@link ~DowncastHelpers#elementToElement `.elementToElement()` downcast helper} for examples and config params description.\r\n *\r\n * @param config Conversion configuration.\r\n * @param config.model The description or a name of the model element to convert.\r\n * @param config.model.attributes List of attributes triggering element reconversion.\r\n * @param config.model.children Should reconvert element if the list of model child nodes changed.\r\n * @returns Conversion helper.\r\n */\r\nfunction downcastElementToElement(config) {\r\n    const model = normalizeModelElementConfig(config.model);\r\n    const view = normalizeToElementConfig(config.view, 'container');\r\n    // Trigger reconversion on children list change if element is a subject to any reconversion.\r\n    // This is required to be able to trigger Differ#refreshItem() on a direct child of the reconverted element.\r\n    if (model.attributes.length) {\r\n        model.children = true;\r\n    }\r\n    return (dispatcher) => {\r\n        dispatcher.on(`insert:${model.name}`, insertElement(view, createConsumer(model)), { priority: config.converterPriority || 'normal' });\r\n        if (model.children || model.attributes.length) {\r\n            dispatcher.on('reduceChanges', createChangeReducer(model), { priority: 'low' });\r\n        }\r\n    };\r\n}\r\n/**\r\n * Model element to view structure conversion helper.\r\n *\r\n * See {@link ~DowncastHelpers#elementToStructure `.elementToStructure()` downcast helper} for examples and config params description.\r\n *\r\n * @param config Conversion configuration.\r\n * @returns Conversion helper.\r\n */\r\nfunction downcastElementToStructure(config) {\r\n    const model = normalizeModelElementConfig(config.model);\r\n    const view = normalizeToElementConfig(config.view, 'container');\r\n    // Trigger reconversion on children list change because it always needs to use slots to put children in proper places.\r\n    // This is required to be able to trigger Differ#refreshItem() on a direct child of the reconverted element.\r\n    model.children = true;\r\n    return (dispatcher) => {\r\n        if (dispatcher._conversionApi.schema.checkChild(model.name, '$text')) {\r\n            /**\r\n             * This error occurs when a {@link module:engine/model/element~Element model element} is downcasted\r\n             * via {@link module:engine/conversion/downcasthelpers~DowncastHelpers#elementToStructure} helper but the element was\r\n             * allowed to host `$text` by the {@link module:engine/model/schema~Schema model schema}.\r\n             *\r\n             * For instance, this may be the result of `myElement` allowing the content of\r\n             * {@glink framework/deep-dive/schema#generic-items `$block`} in its schema definition:\r\n             *\r\n             * ```ts\r\n             * // Element definition in schema.\r\n             * schema.register( 'myElement', {\r\n             * \tallowContentOf: '$block',\r\n             *\r\n             * \t// ...\r\n             * } );\r\n             *\r\n             * // ...\r\n             *\r\n             * // Conversion of myElement with the use of elementToStructure().\r\n             * editor.conversion.for( 'downcast' ).elementToStructure( {\r\n             * \tmodel: 'myElement',\r\n             * \tview: ( modelElement, { writer } ) => {\r\n             * \t\t// ...\r\n             * \t}\r\n             * } );\r\n             * ```\r\n             *\r\n             * In such case, {@link module:engine/conversion/downcasthelpers~DowncastHelpers#elementToElement `elementToElement()`} helper\r\n             * can be used instead to get around this problem:\r\n             *\r\n             * ```ts\r\n             * editor.conversion.for( 'downcast' ).elementToElement( {\r\n             * \tmodel: 'myElement',\r\n             * \tview: ( modelElement, { writer } ) => {\r\n             * \t\t// ...\r\n             * \t}\r\n             * } );\r\n             * ```\r\n             *\r\n             * @error conversion-element-to-structure-disallowed-text\r\n             * @param {String} elementName The name of the element the structure is to be created for.\r\n             */\r\n            throw new CKEditorError('conversion-element-to-structure-disallowed-text', dispatcher, { elementName: model.name });\r\n        }\r\n        dispatcher.on(`insert:${model.name}`, insertStructure(view, createConsumer(model)), { priority: config.converterPriority || 'normal' });\r\n        dispatcher.on('reduceChanges', createChangeReducer(model), { priority: 'low' });\r\n    };\r\n}\r\n/**\r\n * Model attribute to view element conversion helper.\r\n *\r\n * See {@link ~DowncastHelpers#attributeToElement `.attributeToElement()` downcast helper} for examples.\r\n *\r\n * @param config Conversion configuration.\r\n * @param config.model The key of the attribute to convert from or a `{ key, values }` object. `values` is an array\r\n * of `String`s with possible values if the model attribute is an enumerable.\r\n * @param config.view A view element definition or a function that takes the model attribute value and\r\n * {@link module:engine/view/downcastwriter~DowncastWriter view downcast writer} as parameters and returns a view attribute element.\r\n * If `config.model.values` is given, `config.view` should be an object assigning values from `config.model.values` to view element\r\n * definitions or functions.\r\n * @param config.converterPriority Converter priority.\r\n * @returns Conversion helper.\r\n */\r\nfunction downcastAttributeToElement(config) {\r\n    config = cloneDeep(config);\r\n    let model = config.model;\r\n    if (typeof model == 'string') {\r\n        model = { key: model };\r\n    }\r\n    let eventName = `attribute:${model.key}`;\r\n    if (model.name) {\r\n        eventName += ':' + model.name;\r\n    }\r\n    if (model.values) {\r\n        for (const modelValue of model.values) {\r\n            config.view[modelValue] = normalizeToElementConfig(config.view[modelValue], 'attribute');\r\n        }\r\n    }\r\n    else {\r\n        config.view = normalizeToElementConfig(config.view, 'attribute');\r\n    }\r\n    const elementCreator = getFromAttributeCreator(config);\r\n    return (dispatcher) => {\r\n        dispatcher.on(eventName, wrap(elementCreator), { priority: config.converterPriority || 'normal' });\r\n    };\r\n}\r\n/**\r\n * Model attribute to view attribute conversion helper.\r\n *\r\n * See {@link ~DowncastHelpers#attributeToAttribute `.attributeToAttribute()` downcast helper} for examples.\r\n *\r\n * @param config Conversion configuration.\r\n * @param config.model The key of the attribute to convert from or a `{ key, values, [ name ] }` object describing\r\n * the attribute key, possible values and, optionally, an element name to convert from.\r\n * @param config.view A view attribute key, or a `{ key, value }` object or a function that takes the model attribute value and returns\r\n * a `{ key, value }` object.\r\n * If `key` is `'class'`, `value` can be a `String` or an array of `String`s. If `key` is `'style'`, `value` is an object with\r\n * key-value pairs. In other cases, `value` is a `String`.\r\n * If `config.model.values` is set, `config.view` should be an object assigning values from `config.model.values` to\r\n * `{ key, value }` objects or a functions.\r\n * @param config.converterPriority Converter priority.\r\n * @returns Conversion helper.\r\n */\r\nfunction downcastAttributeToAttribute(config) {\r\n    config = cloneDeep(config);\r\n    let model = config.model;\r\n    if (typeof model == 'string') {\r\n        model = { key: model };\r\n    }\r\n    let eventName = `attribute:${model.key}`;\r\n    if (model.name) {\r\n        eventName += ':' + model.name;\r\n    }\r\n    if (model.values) {\r\n        for (const modelValue of model.values) {\r\n            config.view[modelValue] = normalizeToAttributeConfig(config.view[modelValue]);\r\n        }\r\n    }\r\n    else {\r\n        config.view = normalizeToAttributeConfig(config.view);\r\n    }\r\n    const elementCreator = getFromAttributeCreator(config);\r\n    return (dispatcher) => {\r\n        dispatcher.on(eventName, changeAttribute(elementCreator), { priority: config.converterPriority || 'normal' });\r\n    };\r\n}\r\n/**\r\n * Model marker to view element conversion helper.\r\n *\r\n * See {@link ~DowncastHelpers#markerToElement `.markerToElement()` downcast helper} for examples.\r\n *\r\n * @param config Conversion configuration.\r\n * @param config.model The name of the model marker (or model marker group) to convert.\r\n * @param config.view A view element definition or a function that takes the model marker data as a parameter and returns a view UI element.\r\n * @param config.converterPriority Converter priority.\r\n * @returns Conversion helper.\r\n */\r\nfunction downcastMarkerToElement(config) {\r\n    const view = normalizeToElementConfig(config.view, 'ui');\r\n    return (dispatcher) => {\r\n        dispatcher.on(`addMarker:${config.model}`, insertUIElement(view), { priority: config.converterPriority || 'normal' });\r\n        dispatcher.on(`removeMarker:${config.model}`, removeUIElement(), { priority: config.converterPriority || 'normal' });\r\n    };\r\n}\r\n/**\r\n * Model marker to view data conversion helper.\r\n *\r\n * See {@link ~DowncastHelpers#markerToData `markerToData()` downcast helper} to learn more.\r\n *\r\n * @returns Conversion helper.\r\n */\r\nfunction downcastMarkerToData(config) {\r\n    config = cloneDeep(config);\r\n    const group = config.model;\r\n    let view = config.view;\r\n    // Default conversion.\r\n    if (!view) {\r\n        view = markerName => ({\r\n            group,\r\n            name: markerName.substr(config.model.length + 1)\r\n        });\r\n    }\r\n    return (dispatcher) => {\r\n        dispatcher.on(`addMarker:${group}`, insertMarkerData(view), { priority: config.converterPriority || 'normal' });\r\n        dispatcher.on(`removeMarker:${group}`, removeMarkerData(view), { priority: config.converterPriority || 'normal' });\r\n    };\r\n}\r\n/**\r\n * Model marker to highlight conversion helper.\r\n *\r\n * See {@link ~DowncastHelpers#markerToElement `.markerToElement()` downcast helper} for examples.\r\n *\r\n * @param config Conversion configuration.\r\n * @param config.model The name of the model marker (or model marker group) to convert.\r\n * @param config.view A highlight descriptor that will be used for highlighting or a function that takes\r\n * the model marker data as a parameter and returns a highlight descriptor.\r\n * @param config.converterPriority Converter priority.\r\n * @returns Conversion helper.\r\n */\r\nfunction downcastMarkerToHighlight(config) {\r\n    return (dispatcher) => {\r\n        dispatcher.on(`addMarker:${config.model}`, highlightText(config.view), { priority: config.converterPriority || 'normal' });\r\n        dispatcher.on(`addMarker:${config.model}`, highlightElement(config.view), { priority: config.converterPriority || 'normal' });\r\n        dispatcher.on(`removeMarker:${config.model}`, removeHighlight(config.view), { priority: config.converterPriority || 'normal' });\r\n    };\r\n}\r\n/**\r\n * Takes `config.model`, and converts it to an object with normalized structure.\r\n *\r\n * @param model Model configuration or element name.\r\n */\r\nfunction normalizeModelElementConfig(model) {\r\n    if (typeof model == 'string') {\r\n        model = { name: model };\r\n    }\r\n    // List of attributes that should trigger reconversion.\r\n    if (!model.attributes) {\r\n        model.attributes = [];\r\n    }\r\n    else if (!Array.isArray(model.attributes)) {\r\n        model.attributes = [model.attributes];\r\n    }\r\n    // Whether a children insertion/deletion should trigger reconversion.\r\n    model.children = !!model.children;\r\n    return model;\r\n}\r\n/**\r\n * Takes `config.view`, and if it is an {@link module:engine/view/elementdefinition~ElementDefinition}, converts it\r\n * to a function (because lower level converters accept only element creator functions).\r\n *\r\n * @param view View configuration.\r\n * @param viewElementType View element type to create.\r\n * @returns Element creator function to use in lower level converters.\r\n */\r\nfunction normalizeToElementConfig(view, viewElementType) {\r\n    if (typeof view == 'function') {\r\n        // If `view` is already a function, don't do anything.\r\n        return view;\r\n    }\r\n    return ((modelData, conversionApi) => createViewElementFromDefinition(view, conversionApi, viewElementType));\r\n}\r\n/**\r\n * Creates a view element instance from the provided {@link module:engine/view/elementdefinition~ElementDefinition} and class.\r\n */\r\nfunction createViewElementFromDefinition(viewElementDefinition, conversionApi, viewElementType) {\r\n    if (typeof viewElementDefinition == 'string') {\r\n        // If `viewElementDefinition` is given as a `String`, normalize it to an object with `name` property.\r\n        viewElementDefinition = { name: viewElementDefinition };\r\n    }\r\n    let element;\r\n    const viewWriter = conversionApi.writer;\r\n    const attributes = Object.assign({}, viewElementDefinition.attributes);\r\n    if (viewElementType == 'container') {\r\n        element = viewWriter.createContainerElement(viewElementDefinition.name, attributes);\r\n    }\r\n    else if (viewElementType == 'attribute') {\r\n        const options = {\r\n            priority: viewElementDefinition.priority || ViewAttributeElement.DEFAULT_PRIORITY\r\n        };\r\n        element = viewWriter.createAttributeElement(viewElementDefinition.name, attributes, options);\r\n    }\r\n    else {\r\n        // 'ui'.\r\n        element = viewWriter.createUIElement(viewElementDefinition.name, attributes);\r\n    }\r\n    if (viewElementDefinition.styles) {\r\n        const keys = Object.keys(viewElementDefinition.styles);\r\n        for (const key of keys) {\r\n            viewWriter.setStyle(key, viewElementDefinition.styles[key], element);\r\n        }\r\n    }\r\n    if (viewElementDefinition.classes) {\r\n        const classes = viewElementDefinition.classes;\r\n        if (typeof classes == 'string') {\r\n            viewWriter.addClass(classes, element);\r\n        }\r\n        else {\r\n            for (const className of classes) {\r\n                viewWriter.addClass(className, element);\r\n            }\r\n        }\r\n    }\r\n    return element;\r\n}\r\nfunction getFromAttributeCreator(config) {\r\n    if (config.model.values) {\r\n        return ((modelAttributeValue, conversionApi, data) => {\r\n            const view = config.view[modelAttributeValue];\r\n            if (view) {\r\n                return view(modelAttributeValue, conversionApi, data);\r\n            }\r\n            return null;\r\n        });\r\n    }\r\n    else {\r\n        return config.view;\r\n    }\r\n}\r\n/**\r\n * Takes the configuration, adds default parameters if they do not exist and normalizes other parameters to be used in downcast converters\r\n * for generating a view attribute.\r\n *\r\n * @param view View configuration.\r\n */\r\nfunction normalizeToAttributeConfig(view) {\r\n    if (typeof view == 'string') {\r\n        return modelAttributeValue => ({ key: view, value: modelAttributeValue });\r\n    }\r\n    else if (typeof view == 'object') {\r\n        // { key, value, ... }\r\n        if (view.value) {\r\n            return () => view;\r\n        }\r\n        // { key, ... }\r\n        else {\r\n            return modelAttributeValue => ({ key: view.key, value: modelAttributeValue });\r\n        }\r\n    }\r\n    else {\r\n        // function.\r\n        return view;\r\n    }\r\n}\r\n/**\r\n * Helper function for `highlight`. Prepares the actual descriptor object using value passed to the converter.\r\n */\r\nfunction prepareDescriptor(highlightDescriptor, data, conversionApi) {\r\n    // If passed descriptor is a creator function, call it. If not, just use passed value.\r\n    const descriptor = typeof highlightDescriptor == 'function' ?\r\n        highlightDescriptor(data, conversionApi) :\r\n        highlightDescriptor;\r\n    if (!descriptor) {\r\n        return null;\r\n    }\r\n    // Apply default descriptor priority.\r\n    if (!descriptor.priority) {\r\n        descriptor.priority = 10;\r\n    }\r\n    // Default descriptor id is marker name.\r\n    if (!descriptor.id) {\r\n        descriptor.id = data.markerName;\r\n    }\r\n    return descriptor;\r\n}\r\n/**\r\n * Creates a function that checks a single differ diff item whether it should trigger reconversion.\r\n *\r\n * @param model A normalized `config.model` converter configuration.\r\n * @param model.name The name of element.\r\n * @param model.attributes The list of attribute names that should trigger reconversion.\r\n * @param model.children Whether the child list change should trigger reconversion.\r\n */\r\nfunction createChangeReducerCallback(model) {\r\n    return (node, change) => {\r\n        if (!node.is('element', model.name)) {\r\n            return false;\r\n        }\r\n        if (change.type == 'attribute') {\r\n            if (model.attributes.includes(change.attributeKey)) {\r\n                return true;\r\n            }\r\n        }\r\n        else {\r\n            /* istanbul ignore else: This is always true because otherwise it would not register a reducer callback. -- @preserve */\r\n            if (model.children) {\r\n                return true;\r\n            }\r\n        }\r\n        return false;\r\n    };\r\n}\r\n/**\r\n * Creates a `reduceChanges` event handler for reconversion.\r\n *\r\n * @param model A normalized `config.model` converter configuration.\r\n * @param model.name The name of element.\r\n * @param model.attributes The list of attribute names that should trigger reconversion.\r\n * @param model.children Whether the child list change should trigger reconversion.\r\n */\r\nfunction createChangeReducer(model) {\r\n    const shouldReplace = createChangeReducerCallback(model);\r\n    return (evt, data) => {\r\n        const reducedChanges = [];\r\n        if (!data.reconvertedElements) {\r\n            data.reconvertedElements = new Set();\r\n        }\r\n        for (const change of data.changes) {\r\n            // For attribute use node affected by the change.\r\n            // For insert or remove use parent element because we need to check if it's added/removed child.\r\n            const node = change.type == 'attribute' ? change.range.start.nodeAfter : change.position.parent;\r\n            if (!node || !shouldReplace(node, change)) {\r\n                reducedChanges.push(change);\r\n                continue;\r\n            }\r\n            // If it's already marked for reconversion, so skip this change, otherwise add the diff items.\r\n            if (!data.reconvertedElements.has(node)) {\r\n                data.reconvertedElements.add(node);\r\n                const position = ModelPosition._createBefore(node);\r\n                let changeIndex = reducedChanges.length;\r\n                // We need to insert remove+reinsert before any other change on and inside the re-converted element.\r\n                // This is important because otherwise we would remove element that had already been modified by the previous change.\r\n                // Note that there could be some element removed before the re-converted element, so we must not break this behavior.\r\n                for (let i = reducedChanges.length - 1; i >= 0; i--) {\r\n                    const change = reducedChanges[i];\r\n                    const changePosition = change.type == 'attribute' ? change.range.start : change.position;\r\n                    const positionRelation = changePosition.compareWith(position);\r\n                    if (positionRelation == 'before' || change.type == 'remove' && positionRelation == 'same') {\r\n                        break;\r\n                    }\r\n                    changeIndex = i;\r\n                }\r\n                reducedChanges.splice(changeIndex, 0, {\r\n                    type: 'remove',\r\n                    name: node.name,\r\n                    position,\r\n                    length: 1\r\n                }, {\r\n                    type: 'reinsert',\r\n                    name: node.name,\r\n                    position,\r\n                    length: 1\r\n                });\r\n            }\r\n        }\r\n        data.changes = reducedChanges;\r\n    };\r\n}\r\n/**\r\n * Creates a function that checks if an element and its watched attributes can be consumed and consumes them.\r\n *\r\n * @param model A normalized `config.model` converter configuration.\r\n * @param model.name The name of element.\r\n * @param model.attributes The list of attribute names that should trigger reconversion.\r\n * @param model.children Whether the child list change should trigger reconversion.\r\n */\r\nfunction createConsumer(model) {\r\n    return (node, consumable, options = {}) => {\r\n        const events = ['insert'];\r\n        // Collect all set attributes that are triggering conversion.\r\n        for (const attributeName of model.attributes) {\r\n            if (node.hasAttribute(attributeName)) {\r\n                events.push(`attribute:${attributeName}`);\r\n            }\r\n        }\r\n        if (!events.every(event => consumable.test(node, event))) {\r\n            return false;\r\n        }\r\n        if (!options.preflight) {\r\n            events.forEach(event => consumable.consume(node, event));\r\n        }\r\n        return true;\r\n    };\r\n}\r\n/**\r\n * Creates a function that create view slots.\r\n *\r\n * @returns Function exposed by writer as createSlot().\r\n */\r\nfunction createSlotFactory(element, slotsMap, conversionApi) {\r\n    return (writer, modeOrFilter) => {\r\n        const slot = writer.createContainerElement('$slot');\r\n        let children = null;\r\n        if (modeOrFilter === 'children') {\r\n            children = Array.from(element.getChildren());\r\n        }\r\n        else if (typeof modeOrFilter == 'function') {\r\n            children = Array.from(element.getChildren()).filter(element => modeOrFilter(element));\r\n        }\r\n        else {\r\n            /**\r\n             * Unknown slot mode was provided to `writer.createSlot()` in downcast converter.\r\n             *\r\n             * @error conversion-slot-mode-unknown\r\n             */\r\n            throw new CKEditorError('conversion-slot-mode-unknown', conversionApi.dispatcher, { modeOrFilter });\r\n        }\r\n        slotsMap.set(slot, children);\r\n        return slot;\r\n    };\r\n}\r\n/**\r\n * Checks if all children are covered by slots and there is no child that landed in multiple slots.\r\n */\r\nfunction validateSlotsChildren(element, slotsMap, conversionApi) {\r\n    const childrenInSlots = Array.from(slotsMap.values()).flat();\r\n    const uniqueChildrenInSlots = new Set(childrenInSlots);\r\n    if (uniqueChildrenInSlots.size != childrenInSlots.length) {\r\n        /**\r\n         * Filters provided to `writer.createSlot()` overlap (at least two filters accept the same child element).\r\n         *\r\n         * @error conversion-slot-filter-overlap\r\n         * @param {module:engine/model/element~Element} element The element of which children would not be properly\r\n         * allocated to multiple slots.\r\n         */\r\n        throw new CKEditorError('conversion-slot-filter-overlap', conversionApi.dispatcher, { element });\r\n    }\r\n    if (uniqueChildrenInSlots.size != element.childCount) {\r\n        /**\r\n         * Filters provided to `writer.createSlot()` are incomplete and exclude at least one children element (one of\r\n         * the children elements would not be assigned to any of the slots).\r\n         *\r\n         * @error conversion-slot-filter-incomplete\r\n         * @param {module:engine/model/element~Element} element The element of which children would not be properly\r\n         * allocated to multiple slots.\r\n         */\r\n        throw new CKEditorError('conversion-slot-filter-incomplete', conversionApi.dispatcher, { element });\r\n    }\r\n}\r\n/**\r\n * Fill slots with appropriate view elements.\r\n */\r\nfunction fillSlots(viewElement, slotsMap, conversionApi, options) {\r\n    // Set temporary position mapping to redirect child view elements into a proper slots.\r\n    conversionApi.mapper.on('modelToViewPosition', toViewPositionMapping, { priority: 'highest' });\r\n    let currentSlot = null;\r\n    let currentSlotNodes = null;\r\n    // Fill slots with nested view nodes.\r\n    for ([currentSlot, currentSlotNodes] of slotsMap) {\r\n        reinsertOrConvertNodes(viewElement, currentSlotNodes, conversionApi, options);\r\n        conversionApi.writer.move(conversionApi.writer.createRangeIn(currentSlot), conversionApi.writer.createPositionBefore(currentSlot));\r\n        conversionApi.writer.remove(currentSlot);\r\n    }\r\n    conversionApi.mapper.off('modelToViewPosition', toViewPositionMapping);\r\n    function toViewPositionMapping(evt, data) {\r\n        const element = data.modelPosition.nodeAfter;\r\n        // Find the proper offset within the slot.\r\n        const index = currentSlotNodes.indexOf(element);\r\n        if (index < 0) {\r\n            return;\r\n        }\r\n        data.viewPosition = data.mapper.findPositionIn(currentSlot, index);\r\n    }\r\n}\r\n/**\r\n * Inserts view representation of `nodes` into the `viewElement` either by bringing back just removed view nodes\r\n * or by triggering conversion for them.\r\n */\r\nfunction reinsertOrConvertNodes(viewElement, modelNodes, conversionApi, options) {\r\n    // Fill with nested view nodes.\r\n    for (const modelChildNode of modelNodes) {\r\n        // Try reinserting the view node for the specified model node...\r\n        if (!reinsertNode(viewElement.root, modelChildNode, conversionApi, options)) {\r\n            // ...or else convert the model element to the view.\r\n            conversionApi.convertItem(modelChildNode);\r\n        }\r\n    }\r\n}\r\n/**\r\n * Checks if the view for the given model element could be reused and reinserts it to the view.\r\n *\r\n * @returns `false` if view element can't be reused.\r\n */\r\nfunction reinsertNode(viewRoot, modelNode, conversionApi, options) {\r\n    const { writer, mapper } = conversionApi;\r\n    // Don't reinsert if this is not a reconversion...\r\n    if (!options.reconversion) {\r\n        return false;\r\n    }\r\n    const viewChildNode = mapper.toViewElement(modelNode);\r\n    // ...or there is no view to reinsert or it was already inserted to the view structure...\r\n    if (!viewChildNode || viewChildNode.root == viewRoot) {\r\n        return false;\r\n    }\r\n    // ...or it was strictly marked as not to be reused.\r\n    if (!conversionApi.canReuseView(viewChildNode)) {\r\n        return false;\r\n    }\r\n    // Otherwise reinsert the view node.\r\n    writer.move(writer.createRangeOn(viewChildNode), mapper.toViewPosition(ModelPosition._createBefore(modelNode)));\r\n    return true;\r\n}\r\n/**\r\n * The default consumer for insert events.\r\n *\r\n * @param item Model item.\r\n * @param consumable The model consumable.\r\n * @param options.preflight Whether should consume or just check if can be consumed.\r\n */\r\nfunction defaultConsumer(item, consumable, { preflight } = {}) {\r\n    if (preflight) {\r\n        return consumable.test(item, 'insert');\r\n    }\r\n    else {\r\n        return consumable.consume(item, 'insert');\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/utils/autoparagraphing\r\n */\r\n/**\r\n * Fixes all empty roots.\r\n *\r\n * @internal\r\n * @param writer The model writer.\r\n * @returns `true` if any change has been applied, `false` otherwise.\r\n */\r\nexport function autoParagraphEmptyRoots(writer) {\r\n    const { schema, document } = writer.model;\r\n    for (const rootName of document.getRootNames()) {\r\n        const root = document.getRoot(rootName);\r\n        if (root.isEmpty && !schema.checkChild(root, '$text')) {\r\n            // If paragraph element is allowed in the root, create paragraph element.\r\n            if (schema.checkChild(root, 'paragraph')) {\r\n                writer.insertElement('paragraph', root);\r\n                // Other roots will get fixed in the next post-fixer round. Those will be triggered\r\n                // in the same batch no matter if this method was triggered by the post-fixing or not\r\n                // (the above insertElement call will trigger the post-fixers).\r\n                return true;\r\n            }\r\n        }\r\n    }\r\n    return false;\r\n}\r\n/**\r\n * Checks if the given node wrapped with a paragraph would be accepted by the schema in the given position.\r\n *\r\n * @internal\r\n * @param position The position at which to check.\r\n * @param nodeOrType The child node or child type to check.\r\n * @param schema A schema instance used for element validation.\r\n */\r\nexport function isParagraphable(position, nodeOrType, schema) {\r\n    const context = schema.createContext(position);\r\n    // When paragraph is allowed in this context...\r\n    if (!schema.checkChild(context, 'paragraph')) {\r\n        return false;\r\n    }\r\n    // And a node would be allowed in this paragraph...\r\n    if (!schema.checkChild(context.push('paragraph'), nodeOrType)) {\r\n        return false;\r\n    }\r\n    return true;\r\n}\r\n/**\r\n * Inserts a new paragraph at the given position and returns a position inside that paragraph.\r\n *\r\n * @internal\r\n * @param position The position where a paragraph should be inserted.\r\n * @param writer The model writer.\r\n * @returns  Position inside the created paragraph.\r\n */\r\nexport function wrapInParagraph(position, writer) {\r\n    const paragraph = writer.createElement('paragraph');\r\n    writer.insert(paragraph, position);\r\n    return writer.createPositionAt(paragraph, 0);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport Matcher from '../view/matcher';\r\nimport ConversionHelpers from './conversionhelpers';\r\nimport { isParagraphable, wrapInParagraph } from '../model/utils/autoparagraphing';\r\nimport { priorities } from '@ckeditor/ckeditor5-utils';\r\nimport { cloneDeep } from 'lodash-es';\r\n/**\r\n * Contains the {@link module:engine/view/view view} to {@link module:engine/model/model model} converters for\r\n * {@link module:engine/conversion/upcastdispatcher~UpcastDispatcher}.\r\n *\r\n * @module engine/conversion/upcasthelpers\r\n */\r\n/**\r\n * Upcast conversion helper functions.\r\n *\r\n * Learn more about {@glink framework/deep-dive/conversion/upcast upcast helpers}.\r\n *\r\n * @extends module:engine/conversion/conversionhelpers~ConversionHelpers\r\n */\r\nexport default class UpcastHelpers extends ConversionHelpers {\r\n    /**\r\n     * View element to model element conversion helper.\r\n     *\r\n     * This conversion results in creating a model element. For example,\r\n     * view `<p>Foo</p>` becomes `<paragraph>Foo</paragraph>` in the model.\r\n     *\r\n     * Keep in mind that the element will be inserted only if it is allowed\r\n     * by {@link module:engine/model/schema~Schema schema} configuration.\r\n     *\r\n     * ```ts\r\n     * editor.conversion.for( 'upcast' ).elementToElement( {\r\n     * \tview: 'p',\r\n     * \tmodel: 'paragraph'\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'upcast' ).elementToElement( {\r\n     * \tview: 'p',\r\n     * \tmodel: 'paragraph',\r\n     * \tconverterPriority: 'high'\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'upcast' ).elementToElement( {\r\n     * \tview: {\r\n     * \t\tname: 'p',\r\n     * \t\tclasses: 'fancy'\r\n     * \t},\r\n     * \tmodel: 'fancyParagraph'\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'upcast' ).elementToElement( {\r\n     * \tview: {\r\n     * \t\tname: 'p',\r\n     * \t\tclasses: 'heading'\r\n     * \t},\r\n     * \tmodel: ( viewElement, conversionApi ) => {\r\n     * \t\tconst modelWriter = conversionApi.writer;\r\n     *\r\n     * \t\treturn modelWriter.createElement( 'heading', { level: viewElement.getAttribute( 'data-level' ) } );\r\n     * \t}\r\n     * } );\r\n     * ```\r\n     *\r\n     * See {@link module:engine/conversion/conversion~Conversion#for `conversion.for()`} to learn how to add a converter\r\n     * to the conversion process.\r\n     *\r\n     * @param config Conversion configuration.\r\n     * @param config.view Pattern matching all view elements which should be converted. If not set, the converter\r\n     * will fire for every view element.\r\n     * @param config.model Name of the model element, a model element instance or a function that takes a view element\r\n     * and {@link module:engine/conversion/upcastdispatcher~UpcastConversionApi upcast conversion API}\r\n     * and returns a model element. The model element will be inserted in the model.\r\n     * @param config.converterPriority Converter priority.\r\n     */\r\n    elementToElement(config) {\r\n        return this.add(upcastElementToElement(config));\r\n    }\r\n    /**\r\n     * View element to model attribute conversion helper.\r\n     *\r\n     * This conversion results in setting an attribute on a model node. For example, view `<strong>Foo</strong>` becomes\r\n     * `Foo` {@link module:engine/model/text~Text model text node} with `bold` attribute set to `true`.\r\n     *\r\n     * This helper is meant to set a model attribute on all the elements that are inside the converted element:\r\n     *\r\n     * ```\r\n     * <strong>Foo</strong>   -->   <strong><p>Foo</p></strong>   -->   <paragraph><$text bold=\"true\">Foo</$text></paragraph>\r\n     * ```\r\n     *\r\n     * Above is a sample of HTML code, that goes through autoparagraphing (first step) and then is converted (second step).\r\n     * Even though `<strong>` is over `<p>` element, `bold=\"true\"` was added to the text. See\r\n     * {@link module:engine/conversion/upcasthelpers~UpcastHelpers#attributeToAttribute} for comparison.\r\n     *\r\n     * Keep in mind that the attribute will be set only if it is allowed by {@link module:engine/model/schema~Schema schema} configuration.\r\n     *\r\n     * ```ts\r\n     * editor.conversion.for( 'upcast' ).elementToAttribute( {\r\n     * \tview: 'strong',\r\n     * \tmodel: 'bold'\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'upcast' ).elementToAttribute( {\r\n     * \tview: 'strong',\r\n     * \tmodel: 'bold',\r\n     * \tconverterPriority: 'high'\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'upcast' ).elementToAttribute( {\r\n     * \tview: {\r\n     * \t\tname: 'span',\r\n     * \t\tclasses: 'bold'\r\n     * \t},\r\n     * \tmodel: 'bold'\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'upcast' ).elementToAttribute( {\r\n     * \tview: {\r\n     * \t\tname: 'span',\r\n     * \t\tclasses: [ 'styled', 'styled-dark' ]\r\n     * \t},\r\n     * \tmodel: {\r\n     * \t\tkey: 'styled',\r\n     * \t\tvalue: 'dark'\r\n     * \t}\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'upcast' ).elementToAttribute( {\r\n     * \tview: {\r\n     * \t\tname: 'span',\r\n     * \t\tstyles: {\r\n     * \t\t\t'font-size': /[\\s\\S]+/\r\n     * \t\t}\r\n     * \t},\r\n     * \tmodel: {\r\n     * \t\tkey: 'fontSize',\r\n     * \t\tvalue: ( viewElement, conversionApi ) => {\r\n     * \t\t\tconst fontSize = viewElement.getStyle( 'font-size' );\r\n     * \t\t\tconst value = fontSize.substr( 0, fontSize.length - 2 );\r\n     *\r\n     * \t\t\tif ( value <= 10 ) {\r\n     * \t\t\t\treturn 'small';\r\n     * \t\t\t} else if ( value > 12 ) {\r\n     * \t\t\t\treturn 'big';\r\n     * \t\t\t}\r\n     *\r\n     * \t\t\treturn null;\r\n     * \t\t}\r\n     * \t}\r\n     * } );\r\n     * ```\r\n     *\r\n     * See {@link module:engine/conversion/conversion~Conversion#for `conversion.for()`} to learn how to add a converter\r\n     * to the conversion process.\r\n     *\r\n     * @param config Conversion configuration.\r\n     * @param config.view Pattern matching all view elements which should be converted.\r\n     * @param config.model Model attribute key or an object with `key` and `value` properties, describing\r\n     * the model attribute. `value` property may be set as a function that takes a view element and\r\n     * {@link module:engine/conversion/upcastdispatcher~UpcastConversionApi upcast conversion API} and returns the value.\r\n     * If `String` is given, the model attribute value will be set to `true`.\r\n     * @param config.converterPriority Converter priority. Defaults to `low`.\r\n     */\r\n    elementToAttribute(config) {\r\n        return this.add(upcastElementToAttribute(config));\r\n    }\r\n    /**\r\n     * View attribute to model attribute conversion helper.\r\n     *\r\n     * This conversion results in setting an attribute on a model node. For example, view `<img src=\"foo.jpg\"></img>` becomes\r\n     * `<imageBlock source=\"foo.jpg\"></imageBlock>` in the model.\r\n     *\r\n     * This helper is meant to convert view attributes from view elements which got converted to the model, so the view attribute\r\n     * is set only on the corresponding model node:\r\n     *\r\n     * ```\r\n     * <div class=\"dark\"><div>foo</div></div>    -->    <div dark=\"true\"><div>foo</div></div>\r\n     * ```\r\n     *\r\n     * Above, `class=\"dark\"` attribute is added only to the `<div>` elements that has it. This is in contrary to\r\n     * {@link module:engine/conversion/upcasthelpers~UpcastHelpers#elementToAttribute} which sets attributes for\r\n     * all the children in the model:\r\n     *\r\n     * ```\r\n     * <strong>Foo</strong>   -->   <strong><p>Foo</p></strong>   -->   <paragraph><$text bold=\"true\">Foo</$text></paragraph>\r\n     * ```\r\n     *\r\n     * Above is a sample of HTML code, that goes through autoparagraphing (first step) and then is converted (second step).\r\n     * Even though `<strong>` is over `<p>` element, `bold=\"true\"` was added to the text.\r\n     *\r\n     * Keep in mind that the attribute will be set only if it is allowed by {@link module:engine/model/schema~Schema schema} configuration.\r\n     *\r\n     * ```ts\r\n     * editor.conversion.for( 'upcast' ).attributeToAttribute( {\r\n     * \tview: 'src',\r\n     * \tmodel: 'source'\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'upcast' ).attributeToAttribute( {\r\n     * \tview: { key: 'src' },\r\n     * \tmodel: 'source'\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'upcast' ).attributeToAttribute( {\r\n     * \tview: { key: 'src' },\r\n     * \tmodel: 'source',\r\n     * \tconverterPriority: 'normal'\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'upcast' ).attributeToAttribute( {\r\n     * \tview: {\r\n     * \t\tkey: 'data-style',\r\n     * \t\tvalue: /[\\s\\S]+/\r\n     * \t},\r\n     * \tmodel: 'styled'\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'upcast' ).attributeToAttribute( {\r\n     * \tview: {\r\n     * \t\tname: 'img',\r\n     * \t\tkey: 'class',\r\n     * \t\tvalue: 'styled-dark'\r\n     * \t},\r\n     * \tmodel: {\r\n     * \t\tkey: 'styled',\r\n     * \t\tvalue: 'dark'\r\n     * \t}\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'upcast' ).attributeToAttribute( {\r\n     * \tview: {\r\n     * \t\tkey: 'class',\r\n     * \t\tvalue: /styled-[\\S]+/\r\n     * \t},\r\n     * \tmodel: {\r\n     * \t\tkey: 'styled'\r\n     * \t\tvalue: ( viewElement, conversionApi ) => {\r\n     * \t\t\tconst regexp = /styled-([\\S]+)/;\r\n     * \t\t\tconst match = viewElement.getAttribute( 'class' ).match( regexp );\r\n     *\r\n     * \t\t\treturn match[ 1 ];\r\n     * \t\t}\r\n     * \t}\r\n     * } );\r\n     * ```\r\n     *\r\n     * Converting styles works a bit differently as it requires `view.styles` to be an object and by default\r\n     * a model attribute will be set to `true` by such a converter. You can set the model attribute to any value by providing the `value`\r\n     * callback that returns the desired value.\r\n     *\r\n     * ```ts\r\n     * // Default conversion of font-weight style will result in setting bold attribute to true.\r\n     * editor.conversion.for( 'upcast' ).attributeToAttribute( {\r\n     * \tview: {\r\n     * \t\tstyles: {\r\n     * \t\t\t'font-weight': 'bold'\r\n     * \t\t}\r\n     * \t},\r\n     * \tmodel: 'bold'\r\n     * } );\r\n     *\r\n     * // This converter will pass any style value to the `lineHeight` model attribute.\r\n     * editor.conversion.for( 'upcast' ).attributeToAttribute( {\r\n     * \tview: {\r\n     * \t\tstyles: {\r\n     * \t\t\t'line-height': /[\\s\\S]+/\r\n     * \t\t}\r\n     * \t},\r\n     * \tmodel: {\r\n     * \t\tkey: 'lineHeight',\r\n     * \t\tvalue: ( viewElement, conversionApi ) => viewElement.getStyle( 'line-height' )\r\n     * \t}\r\n     * } );\r\n     * ```\r\n     *\r\n     * See {@link module:engine/conversion/conversion~Conversion#for `conversion.for()`} to learn how to add a converter\r\n     * to the conversion process.\r\n     *\r\n     * @param config Conversion configuration.\r\n     * @param config.view Specifies which view attribute will be converted. If a `String` is passed,\r\n     * attributes with given key will be converted. If an `Object` is passed, it must have a required `key` property,\r\n     * specifying view attribute key, and may have an optional `value` property, specifying view attribute value and optional `name`\r\n     * property specifying a view element name from/on which the attribute should be converted. `value` can be given as a `String`,\r\n     * a `RegExp` or a function callback, that takes view attribute value as the only parameter and returns `Boolean`.\r\n     * @param config.model Model attribute key or an object with `key` and `value` properties, describing\r\n     * the model attribute. `value` property may be set as a function that takes a view element and\r\n     * {@link module:engine/conversion/upcastdispatcher~UpcastConversionApi upcast conversion API} and returns the value.\r\n     * If `String` is given, the model attribute value will be same as view attribute value.\r\n     * @param config.converterPriority Converter priority. Defaults to `low`.\r\n     */\r\n    attributeToAttribute(config) {\r\n        return this.add(upcastAttributeToAttribute(config));\r\n    }\r\n    /**\r\n     * View element to model marker conversion helper.\r\n     *\r\n     * This conversion results in creating a model marker. For example, if the marker was stored in a view as an element:\r\n     * `<p>Fo<span data-marker=\"comment\" data-comment-id=\"7\"></span>o</p><p>B<span data-marker=\"comment\" data-comment-id=\"7\"></span>ar</p>`,\r\n     * after the conversion is done, the marker will be available in\r\n     * {@link module:engine/model/model~Model#markers model document markers}.\r\n     *\r\n     * **Note**: When this helper is used in the data upcast in combination with\r\n     * {@link module:engine/conversion/downcasthelpers~DowncastHelpers#markerToData `#markerToData()`} in the data downcast,\r\n     * then invalid HTML code (e.g. a span between table cells) may be produced by the latter converter.\r\n     *\r\n     * In most of the cases, the {@link #dataToMarker} should be used instead.\r\n     *\r\n     * ```ts\r\n     * editor.conversion.for( 'upcast' ).elementToMarker( {\r\n     * \tview: 'marker-search',\r\n     * \tmodel: 'search'\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'upcast' ).elementToMarker( {\r\n     * \tview: 'marker-search',\r\n     * \tmodel: 'search',\r\n     * \tconverterPriority: 'high'\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'upcast' ).elementToMarker( {\r\n     * \tview: 'marker-search',\r\n     * \tmodel: ( viewElement, conversionApi ) => 'comment:' + viewElement.getAttribute( 'data-comment-id' )\r\n     * } );\r\n     *\r\n     * editor.conversion.for( 'upcast' ).elementToMarker( {\r\n     * \tview: {\r\n     * \t\tname: 'span',\r\n     * \t\tattributes: {\r\n     * \t\t\t'data-marker': 'search'\r\n     * \t\t}\r\n     * \t},\r\n     * \tmodel: 'search'\r\n     * } );\r\n     * ```\r\n     *\r\n     * See {@link module:engine/conversion/conversion~Conversion#for `conversion.for()`} to learn how to add a converter\r\n     * to the conversion process.\r\n     *\r\n     * @param config Conversion configuration.\r\n     * @param config.view Pattern matching all view elements which should be converted.\r\n     * @param config.model Name of the model marker, or a function that takes a view element and returns\r\n     * a model marker name.\r\n     * @param config.converterPriority Converter priority.\r\n     */\r\n    elementToMarker(config) {\r\n        return this.add(upcastElementToMarker(config));\r\n    }\r\n    /**\r\n     * View-to-model marker conversion helper.\r\n     *\r\n     * Converts view data created by {@link module:engine/conversion/downcasthelpers~DowncastHelpers#markerToData `#markerToData()`}\r\n     * back to a model marker.\r\n     *\r\n     * This converter looks for specific view elements and view attributes that mark marker boundaries. See\r\n     * {@link module:engine/conversion/downcasthelpers~DowncastHelpers#markerToData `#markerToData()`} to learn what view data\r\n     * is expected by this converter.\r\n     *\r\n     * The `config.view` property is equal to the marker group name to convert.\r\n     *\r\n     * By default, this converter creates markers with the `group:name` name convention (to match the default `markerToData` conversion).\r\n     *\r\n     * The conversion configuration can take a function that will generate a marker name.\r\n     * If such function is set as the `config.model` parameter, it is passed the `name` part from the view element or attribute and it is\r\n     * expected to return a string with the marker name.\r\n     *\r\n     * Basic usage:\r\n     *\r\n     * ```ts\r\n     * // Using the default conversion.\r\n     * // In this case, all markers from the `comment` group will be converted.\r\n     * // The conversion will look for `<comment-start>` and `<comment-end>` tags and\r\n     * // `data-comment-start-before`, `data-comment-start-after`,\r\n     * // `data-comment-end-before` and `data-comment-end-after` attributes.\r\n     * editor.conversion.for( 'upcast' ).dataToMarker( {\r\n     * \tview: 'comment'\r\n     * } );\r\n     * ```\r\n     *\r\n     * An example of a model that may be generated by this conversion:\r\n     *\r\n     * ```\r\n     * // View:\r\n     * <p>Foo<comment-start name=\"commentId:uid\"></comment-start>bar</p>\r\n     * <figure data-comment-end-after=\"commentId:uid\" class=\"image\"><img src=\"abc.jpg\" /></figure>\r\n     *\r\n     * // Model:\r\n     * <paragraph>Foo[bar</paragraph>\r\n     * <imageBlock src=\"abc.jpg\"></imageBlock>]\r\n     * ```\r\n     *\r\n     * Where `[]` are boundaries of a marker that will receive the `comment:commentId:uid` name.\r\n     *\r\n     * Other examples of usage:\r\n     *\r\n     * ```ts\r\n     * // Using a custom function which is the same as the default conversion:\r\n     * editor.conversion.for( 'upcast' ).dataToMarker( {\r\n     * \tview: 'comment',\r\n     * \tmodel: ( name, conversionApi ) => 'comment:' + name,\r\n     * } );\r\n     *\r\n     * // Using the converter priority:\r\n     * editor.conversion.for( 'upcast' ).dataToMarker( {\r\n     * \tview: 'comment',\r\n     * \tmodel: ( name, conversionApi ) => 'comment:' + name,\r\n     * \tconverterPriority: 'high'\r\n     * } );\r\n     * ```\r\n     *\r\n     * See {@link module:engine/conversion/conversion~Conversion#for `conversion.for()`} to learn how to add a converter\r\n     * to the conversion process.\r\n     *\r\n     * @param config Conversion configuration.\r\n     * @param config.view The marker group name to convert.\r\n     * @param config.model A function that takes the `name` part from the view element or attribute and\r\n     * {@link module:engine/conversion/upcastdispatcher~UpcastConversionApi upcast conversion API} and returns the marker name.\r\n     * @param config.converterPriority Converter priority.\r\n     */\r\n    dataToMarker(config) {\r\n        return this.add(upcastDataToMarker(config));\r\n    }\r\n}\r\n/**\r\n * Function factory, creates a converter that converts {@link module:engine/view/documentfragment~DocumentFragment view document fragment}\r\n * or all children of {@link module:engine/view/element~Element} into\r\n * {@link module:engine/model/documentfragment~DocumentFragment model document fragment}.\r\n * This is the \"entry-point\" converter for upcast (view to model conversion). This converter starts the conversion of all children\r\n * of passed view document fragment. Those children {@link module:engine/view/node~Node view nodes} are then handled by other converters.\r\n *\r\n * This also a \"default\", last resort converter for all view elements that has not been converted by other converters.\r\n * When a view element is being converted to the model but it does not have converter specified, that view element\r\n * will be converted to {@link module:engine/model/documentfragment~DocumentFragment model document fragment} and returned.\r\n *\r\n * @returns Universal converter for view {@link module:engine/view/documentfragment~DocumentFragment fragments} and\r\n * {@link module:engine/view/element~Element elements} that returns\r\n * {@link module:engine/model/documentfragment~DocumentFragment model fragment} with children of converted view item.\r\n */\r\nexport function convertToModelFragment() {\r\n    return (evt, data, conversionApi) => {\r\n        // Second argument in `consumable.consume` is discarded for ViewDocumentFragment but is needed for ViewElement.\r\n        if (!data.modelRange && conversionApi.consumable.consume(data.viewItem, { name: true })) {\r\n            const { modelRange, modelCursor } = conversionApi.convertChildren(data.viewItem, data.modelCursor);\r\n            data.modelRange = modelRange;\r\n            data.modelCursor = modelCursor;\r\n        }\r\n    };\r\n}\r\n/**\r\n * Function factory, creates a converter that converts {@link module:engine/view/text~Text} to {@link module:engine/model/text~Text}.\r\n *\r\n * @returns {@link module:engine/view/text~Text View text} converter.\r\n */\r\nexport function convertText() {\r\n    return (evt, data, { schema, consumable, writer }) => {\r\n        let position = data.modelCursor;\r\n        // When node is already converted then do nothing.\r\n        if (!consumable.test(data.viewItem)) {\r\n            return;\r\n        }\r\n        if (!schema.checkChild(position, '$text')) {\r\n            if (!isParagraphable(position, '$text', schema)) {\r\n                return;\r\n            }\r\n            // Do not auto-paragraph whitespaces.\r\n            if (data.viewItem.data.trim().length == 0) {\r\n                return;\r\n            }\r\n            // Wrap `$text` in paragraph and include any marker that is directly before `$text`. See #13053.\r\n            const nodeBefore = position.nodeBefore;\r\n            position = wrapInParagraph(position, writer);\r\n            if (nodeBefore && nodeBefore.is('element', '$marker')) {\r\n                // Move `$marker` to the paragraph.\r\n                writer.move(writer.createRangeOn(nodeBefore), position);\r\n                position = writer.createPositionAfter(nodeBefore);\r\n            }\r\n        }\r\n        consumable.consume(data.viewItem);\r\n        const text = writer.createText(data.viewItem.data);\r\n        writer.insert(text, position);\r\n        data.modelRange = writer.createRange(position, position.getShiftedBy(text.offsetSize));\r\n        data.modelCursor = data.modelRange.end;\r\n    };\r\n}\r\n/**\r\n * Function factory, creates a callback function which converts a {@link module:engine/view/selection~Selection\r\n * view selection} taken from the {@link module:engine/view/document~Document#event:selectionChange} event\r\n * and sets in on the {@link module:engine/model/document~Document#selection model}.\r\n *\r\n * **Note**: because there is no view selection change dispatcher nor any other advanced view selection to model\r\n * conversion mechanism, the callback should be set directly on view document.\r\n *\r\n * ```ts\r\n * view.document.on( 'selectionChange', convertSelectionChange( modelDocument, mapper ) );\r\n * ```\r\n *\r\n * @param model Data model.\r\n * @param mapper Conversion mapper.\r\n * @returns {@link module:engine/view/document~Document#event:selectionChange} callback function.\r\n */\r\nexport function convertSelectionChange(model, mapper) {\r\n    return (evt, data) => {\r\n        const viewSelection = data.newSelection;\r\n        const ranges = [];\r\n        for (const viewRange of viewSelection.getRanges()) {\r\n            ranges.push(mapper.toModelRange(viewRange));\r\n        }\r\n        const modelSelection = model.createSelection(ranges, { backward: viewSelection.isBackward });\r\n        if (!modelSelection.isEqual(model.document.selection)) {\r\n            model.change(writer => {\r\n                writer.setSelection(modelSelection);\r\n            });\r\n        }\r\n    };\r\n}\r\n/**\r\n * View element to model element conversion helper.\r\n *\r\n * See {@link ~UpcastHelpers#elementToElement `.elementToElement()` upcast helper} for examples.\r\n *\r\n * @param config Conversion configuration.\r\n * @param config.view Pattern matching all view elements which should be converted. If not\r\n * set, the converter will fire for every view element.\r\n * @param config.model Name of the model element, a model element\r\n * instance or a function that takes a view element and returns a model element. The model element will be inserted in the model.\r\n * @param config.converterPriority Converter priority.\r\n * @returns Conversion helper.\r\n */\r\nfunction upcastElementToElement(config) {\r\n    config = cloneDeep(config);\r\n    const converter = prepareToElementConverter(config);\r\n    const elementName = getViewElementNameFromConfig(config.view);\r\n    const eventName = elementName ? `element:${elementName}` : 'element';\r\n    return (dispatcher) => {\r\n        dispatcher.on(eventName, converter, { priority: config.converterPriority || 'normal' });\r\n    };\r\n}\r\n/**\r\n * View element to model attribute conversion helper.\r\n *\r\n * See {@link ~UpcastHelpers#elementToAttribute `.elementToAttribute()` upcast helper} for examples.\r\n *\r\n * @param config Conversion configuration.\r\n * @param config.view Pattern matching all view elements which should be converted.\r\n * @param config.model Model attribute key or an object with `key` and `value` properties, describing\r\n * the model attribute. `value` property may be set as a function that takes a view element and returns the value.\r\n * If `String` is given, the model attribute value will be set to `true`.\r\n * @param config.converterPriority Converter priority. Defaults to `low`.\r\n * @returns Conversion helper.\r\n */\r\nfunction upcastElementToAttribute(config) {\r\n    config = cloneDeep(config);\r\n    normalizeModelAttributeConfig(config);\r\n    const converter = prepareToAttributeConverter(config, false);\r\n    const elementName = getViewElementNameFromConfig(config.view);\r\n    const eventName = elementName ? `element:${elementName}` : 'element';\r\n    return (dispatcher) => {\r\n        dispatcher.on(eventName, converter, { priority: config.converterPriority || 'low' });\r\n    };\r\n}\r\n/**\r\n * View attribute to model attribute conversion helper.\r\n *\r\n * See {@link ~UpcastHelpers#attributeToAttribute `.attributeToAttribute()` upcast helper} for examples.\r\n *\r\n * @param config Conversion configuration.\r\n * @param config.view Specifies which view attribute will be converted. If a `String` is passed,\r\n * attributes with given key will be converted. If an `Object` is passed, it must have a required `key` property,\r\n * specifying view attribute key, and may have an optional `value` property, specifying view attribute value and optional `name`\r\n * property specifying a view element name from/on which the attribute should be converted. `value` can be given as a `String`,\r\n * a `RegExp` or a function callback, that takes view attribute value as the only parameter and returns `Boolean`.\r\n * @param config.model Model attribute key or an object with `key` and `value` properties, describing\r\n * the model attribute. `value` property may be set as a function that takes a view element and returns the value.\r\n * If `String` is given, the model attribute value will be same as view attribute value.\r\n * @param config.converterPriority Converter priority. Defaults to `low`.\r\n * @returns Conversion helper.\r\n */\r\nfunction upcastAttributeToAttribute(config) {\r\n    config = cloneDeep(config);\r\n    let viewKey = null;\r\n    if (typeof config.view == 'string' || config.view.key) {\r\n        viewKey = normalizeViewAttributeKeyValueConfig(config);\r\n    }\r\n    normalizeModelAttributeConfig(config, viewKey);\r\n    const converter = prepareToAttributeConverter(config, true);\r\n    return (dispatcher) => {\r\n        dispatcher.on('element', converter, { priority: config.converterPriority || 'low' });\r\n    };\r\n}\r\n/**\r\n * View element to model marker conversion helper.\r\n *\r\n * See {@link ~UpcastHelpers#elementToMarker `.elementToMarker()` upcast helper} for examples.\r\n *\r\n * @param config Conversion configuration.\r\n * @param config.view Pattern matching all view elements which should be converted.\r\n * @param config.model Name of the model marker, or a function that takes a view element and returns\r\n * a model marker name.\r\n * @param config.converterPriority Converter priority.\r\n * @returns Conversion helper.\r\n */\r\nfunction upcastElementToMarker(config) {\r\n    const model = normalizeElementToMarkerModelConfig(config.model);\r\n    return upcastElementToElement({ ...config, model });\r\n}\r\n/**\r\n * View data to model marker conversion helper.\r\n *\r\n * See {@link ~UpcastHelpers#dataToMarker} to learn more.\r\n *\r\n * @returns Conversion helper.\r\n */\r\nfunction upcastDataToMarker(config) {\r\n    config = cloneDeep(config);\r\n    // Default conversion.\r\n    if (!config.model) {\r\n        config.model = name => {\r\n            return name ? config.view + ':' + name : config.view;\r\n        };\r\n    }\r\n    const normalizedConfig = {\r\n        view: config.view,\r\n        model: config.model\r\n    };\r\n    const converterStart = prepareToElementConverter(normalizeDataToMarkerConfig(normalizedConfig, 'start'));\r\n    const converterEnd = prepareToElementConverter(normalizeDataToMarkerConfig(normalizedConfig, 'end'));\r\n    return (dispatcher) => {\r\n        dispatcher.on(`element:${config.view}-start`, converterStart, { priority: config.converterPriority || 'normal' });\r\n        dispatcher.on(`element:${config.view}-end`, converterEnd, { priority: config.converterPriority || 'normal' });\r\n        // Below is a hack that is needed to properly handle `converterPriority` for both elements and attributes.\r\n        // Attribute conversion needs to be performed *after* element conversion.\r\n        // This converter handles both element conversion and attribute conversion, which means that if a single\r\n        // `config.converterPriority` is used, it will lead to problems. For example, if the `'high'` priority is used,\r\n        // the attribute conversion will be performed before a lot of element upcast converters.\r\n        // On the other hand, we want to support `config.converterPriority` and converter overwriting.\r\n        //\r\n        // To make it work, we need to do some extra processing for priority for attribute converter.\r\n        // Priority `'low'` value should be the base value and then we will change it depending on `config.converterPriority` value.\r\n        //\r\n        // This hack probably would not be needed if attributes are upcasted separately.\r\n        //\r\n        const basePriority = priorities.low;\r\n        const maxPriority = priorities.highest;\r\n        const priorityFactor = priorities.get(config.converterPriority) / maxPriority; // Number in range [ -1, 1 ].\r\n        dispatcher.on('element', upcastAttributeToMarker(normalizedConfig), { priority: basePriority + priorityFactor });\r\n    };\r\n}\r\n/**\r\n * Function factory, returns a callback function which converts view attributes to a model marker.\r\n *\r\n * The converter looks for elements with `data-group-start-before`, `data-group-start-after`, `data-group-end-before`\r\n * and `data-group-end-after` attributes and inserts `$marker` model elements before/after those elements.\r\n * `group` part is specified in `config.view`.\r\n *\r\n * @returns Marker converter.\r\n */\r\nfunction upcastAttributeToMarker(config) {\r\n    return (evt, data, conversionApi) => {\r\n        const attrName = `data-${config.view}`;\r\n        // Check if any attribute for the given view item can be consumed before changing the conversion data\r\n        // and consuming view items with these attributes.\r\n        if (!conversionApi.consumable.test(data.viewItem, { attributes: attrName + '-end-after' }) &&\r\n            !conversionApi.consumable.test(data.viewItem, { attributes: attrName + '-start-after' }) &&\r\n            !conversionApi.consumable.test(data.viewItem, { attributes: attrName + '-end-before' }) &&\r\n            !conversionApi.consumable.test(data.viewItem, { attributes: attrName + '-start-before' })) {\r\n            return;\r\n        }\r\n        // This converter wants to add a model element, marking a marker, before/after an element (or maybe even group of elements).\r\n        // To do that, we can use `data.modelRange` which is set on an element (or a group of elements) that has been upcasted.\r\n        // But, if the processed view element has not been upcasted yet (it does not have been converted), we need to\r\n        // fire conversion for its children first, then we will have `data.modelRange` available.\r\n        if (!data.modelRange) {\r\n            Object.assign(data, conversionApi.convertChildren(data.viewItem, data.modelCursor));\r\n        }\r\n        if (conversionApi.consumable.consume(data.viewItem, { attributes: attrName + '-end-after' })) {\r\n            addMarkerElements(data.modelRange.end, data.viewItem.getAttribute(attrName + '-end-after').split(','));\r\n        }\r\n        if (conversionApi.consumable.consume(data.viewItem, { attributes: attrName + '-start-after' })) {\r\n            addMarkerElements(data.modelRange.end, data.viewItem.getAttribute(attrName + '-start-after').split(','));\r\n        }\r\n        if (conversionApi.consumable.consume(data.viewItem, { attributes: attrName + '-end-before' })) {\r\n            addMarkerElements(data.modelRange.start, data.viewItem.getAttribute(attrName + '-end-before').split(','));\r\n        }\r\n        if (conversionApi.consumable.consume(data.viewItem, { attributes: attrName + '-start-before' })) {\r\n            addMarkerElements(data.modelRange.start, data.viewItem.getAttribute(attrName + '-start-before').split(','));\r\n        }\r\n        function addMarkerElements(position, markerViewNames) {\r\n            for (const markerViewName of markerViewNames) {\r\n                const markerName = config.model(markerViewName, conversionApi);\r\n                const element = conversionApi.writer.createElement('$marker', { 'data-name': markerName });\r\n                conversionApi.writer.insert(element, position);\r\n                if (data.modelCursor.isEqual(position)) {\r\n                    data.modelCursor = data.modelCursor.getShiftedBy(1);\r\n                }\r\n                else {\r\n                    data.modelCursor = data.modelCursor._getTransformedByInsertion(position, 1);\r\n                }\r\n                data.modelRange = data.modelRange._getTransformedByInsertion(position, 1)[0];\r\n            }\r\n        }\r\n    };\r\n}\r\n/**\r\n * Helper function for from-view-element conversion. Checks if `config.view` directly specifies converted view element's name\r\n * and if so, returns it.\r\n *\r\n * @param config Conversion view config.\r\n * @returns View element name or `null` if name is not directly set.\r\n */\r\nfunction getViewElementNameFromConfig(viewConfig) {\r\n    if (typeof viewConfig == 'string') {\r\n        return viewConfig;\r\n    }\r\n    if (typeof viewConfig == 'object' && typeof viewConfig.name == 'string') {\r\n        return viewConfig.name;\r\n    }\r\n    return null;\r\n}\r\n/**\r\n * Helper for to-model-element conversion. Takes a config object and returns a proper converter function.\r\n *\r\n * @param config Conversion configuration.\r\n * @returns View to model converter.\r\n */\r\nfunction prepareToElementConverter(config) {\r\n    const matcher = new Matcher(config.view);\r\n    return (evt, data, conversionApi) => {\r\n        const matcherResult = matcher.match(data.viewItem);\r\n        if (!matcherResult) {\r\n            return;\r\n        }\r\n        const match = matcherResult.match;\r\n        // Force consuming element's name.\r\n        match.name = true;\r\n        if (!conversionApi.consumable.test(data.viewItem, match)) {\r\n            return;\r\n        }\r\n        const modelElement = getModelElement(config.model, data.viewItem, conversionApi);\r\n        if (!modelElement) {\r\n            return;\r\n        }\r\n        if (!conversionApi.safeInsert(modelElement, data.modelCursor)) {\r\n            return;\r\n        }\r\n        conversionApi.consumable.consume(data.viewItem, match);\r\n        conversionApi.convertChildren(data.viewItem, modelElement);\r\n        conversionApi.updateConversionResult(modelElement, data);\r\n    };\r\n}\r\n/**\r\n * Helper function for upcasting-to-element converter. Takes the model configuration, the converted view element\r\n * and a writer instance and returns a model element instance to be inserted in the model.\r\n *\r\n * @param model Model conversion configuration.\r\n * @param input The converted view node.\r\n * @param conversionApi The upcast conversion API.\r\n */\r\nfunction getModelElement(model, input, conversionApi) {\r\n    if (model instanceof Function) {\r\n        return model(input, conversionApi);\r\n    }\r\n    else {\r\n        return conversionApi.writer.createElement(model);\r\n    }\r\n}\r\n/**\r\n * Helper function view-attribute-to-model-attribute helper. Normalizes `config.view` which was set as `String` or\r\n * as an `Object` with `key`, `value` and `name` properties. Normalized `config.view` has is compatible with\r\n * {@link module:engine/view/matcher~MatcherPattern}.\r\n *\r\n * @param config Conversion config.\r\n * @returns Key of the converted view attribute.\r\n */\r\nfunction normalizeViewAttributeKeyValueConfig(config) {\r\n    if (typeof config.view == 'string') {\r\n        config.view = { key: config.view };\r\n    }\r\n    const key = config.view.key;\r\n    let normalized;\r\n    if (key == 'class' || key == 'style') {\r\n        const keyName = key == 'class' ? 'classes' : 'styles';\r\n        normalized = {\r\n            [keyName]: config.view.value\r\n        };\r\n    }\r\n    else {\r\n        const value = typeof config.view.value == 'undefined' ? /[\\s\\S]*/ : config.view.value;\r\n        normalized = {\r\n            attributes: {\r\n                [key]: value\r\n            }\r\n        };\r\n    }\r\n    if (config.view.name) {\r\n        normalized.name = config.view.name;\r\n    }\r\n    config.view = normalized;\r\n    return key;\r\n}\r\n/**\r\n * Helper function that normalizes `config.model` in from-model-attribute conversion. `config.model` can be set\r\n * as a `String`, an `Object` with only `key` property or an `Object` with `key` and `value` properties. Normalized\r\n * `config.model` is an `Object` with `key` and `value` properties.\r\n *\r\n * @param config Conversion config.\r\n * @param viewAttributeKeyToCopy Key of the converted view attribute. If it is set, model attribute value\r\n * will be equal to view attribute value.\r\n */\r\nfunction normalizeModelAttributeConfig(config, viewAttributeKeyToCopy = null) {\r\n    const defaultModelValue = viewAttributeKeyToCopy === null ? true :\r\n        (viewElement) => viewElement.getAttribute(viewAttributeKeyToCopy);\r\n    const key = typeof config.model != 'object' ? config.model : config.model.key;\r\n    const value = typeof config.model != 'object' || typeof config.model.value == 'undefined' ? defaultModelValue : config.model.value;\r\n    config.model = { key, value };\r\n}\r\n/**\r\n * Helper for to-model-attribute conversion. Takes the model attribute name and conversion configuration and returns\r\n * a proper converter function.\r\n *\r\n * @param config Conversion configuration. It is possible to provide multiple configurations in an array.\r\n * @param shallow If set to `true` the attribute will be set only on top-level nodes. Otherwise, it will be set\r\n * on all elements in the range.\r\n */\r\nfunction prepareToAttributeConverter(config, shallow) {\r\n    const matcher = new Matcher(config.view);\r\n    return (evt, data, conversionApi) => {\r\n        // Converting an attribute of an element that has not been converted to anything does not make sense\r\n        // because there will be nowhere to set that attribute on. At this stage, the element should've already\r\n        // been converted (https://github.com/ckeditor/ckeditor5/issues/11000).\r\n        if (!data.modelRange && shallow) {\r\n            return;\r\n        }\r\n        const match = matcher.match(data.viewItem);\r\n        // If there is no match, this callback should not do anything.\r\n        if (!match) {\r\n            return;\r\n        }\r\n        if (onlyViewNameIsDefined(config.view, data.viewItem)) {\r\n            match.match.name = true;\r\n        }\r\n        else {\r\n            // Do not test `name` consumable because it could get consumed already while upcasting some other attribute\r\n            // on the same element (for example <span class=\"big\" style=\"color: red\">foo</span>).\r\n            delete match.match.name;\r\n        }\r\n        // Try to consume appropriate values from consumable values list.\r\n        if (!conversionApi.consumable.test(data.viewItem, match.match)) {\r\n            return;\r\n        }\r\n        const modelKey = config.model.key;\r\n        const modelValue = typeof config.model.value == 'function' ?\r\n            config.model.value(data.viewItem, conversionApi) : config.model.value;\r\n        // Do not convert if attribute building function returned falsy value.\r\n        if (modelValue === null) {\r\n            return;\r\n        }\r\n        // Since we are converting to attribute we need a range on which we will set the attribute.\r\n        // If the range is not created yet, let's create it by converting children of the current node first.\r\n        if (!data.modelRange) {\r\n            // Convert children and set conversion result as a current data.\r\n            Object.assign(data, conversionApi.convertChildren(data.viewItem, data.modelCursor));\r\n        }\r\n        // Set attribute on current `output`. `Schema` is checked inside this helper function.\r\n        const attributeWasSet = setAttributeOn(data.modelRange, { key: modelKey, value: modelValue }, shallow, conversionApi);\r\n        // It may happen that a converter will try to set an attribute that is not allowed in the given context.\r\n        // In such a situation we cannot consume the attribute. See: https://github.com/ckeditor/ckeditor5/pull/9249#issuecomment-815658459.\r\n        if (attributeWasSet) {\r\n            // Verify if the element itself wasn't consumed yet. It could be consumed already while upcasting some other attribute\r\n            // on the same element (for example <span class=\"big\" style=\"color: red\">foo</span>).\r\n            // We need to consume it so other features (especially GHS) won't try to convert it.\r\n            // Note that it's not tested by the other element-to-attribute converters whether an element was consumed before\r\n            // (in case of converters that the element itself is just a context and not the primary information to convert).\r\n            if (conversionApi.consumable.test(data.viewItem, { name: true })) {\r\n                match.match.name = true;\r\n            }\r\n            conversionApi.consumable.consume(data.viewItem, match.match);\r\n        }\r\n    };\r\n}\r\n/**\r\n * Helper function that checks if element name should be consumed in attribute converters.\r\n *\r\n * @param viewConfig Conversion view config.\r\n */\r\nfunction onlyViewNameIsDefined(viewConfig, viewItem) {\r\n    // https://github.com/ckeditor/ckeditor5-engine/issues/1786\r\n    const configToTest = typeof viewConfig == 'function' ? viewConfig(viewItem) : viewConfig;\r\n    if (typeof configToTest == 'object' && !getViewElementNameFromConfig(configToTest)) {\r\n        return false;\r\n    }\r\n    return !configToTest.classes && !configToTest.attributes && !configToTest.styles;\r\n}\r\n/**\r\n * Helper function for to-model-attribute converter. Sets model attribute on given range. Checks {@link module:engine/model/schema~Schema}\r\n * to ensure proper model structure.\r\n *\r\n * If any node on the given range has already defined an attribute with the same name, its value will not be updated.\r\n *\r\n * @param modelRange Model range on which attribute should be set.\r\n * @param modelAttribute Model attribute to set.\r\n * @param conversionApi Conversion API.\r\n * @param shallow If set to `true` the attribute will be set only on top-level nodes. Otherwise, it will be set\r\n * on all elements in the range.\r\n * @returns `true` if attribute was set on at least one node from given `modelRange`.\r\n */\r\nfunction setAttributeOn(modelRange, modelAttribute, shallow, conversionApi) {\r\n    let result = false;\r\n    // Set attribute on each item in range according to Schema.\r\n    for (const node of Array.from(modelRange.getItems({ shallow }))) {\r\n        // Skip if not allowed.\r\n        if (!conversionApi.schema.checkAttribute(node, modelAttribute.key)) {\r\n            continue;\r\n        }\r\n        // Mark the node as consumed even if the attribute will not be updated because it's in a valid context (schema)\r\n        // and would be converted if the attribute wouldn't be present. See #8921.\r\n        result = true;\r\n        // Do not override the attribute if it's already present.\r\n        if (node.hasAttribute(modelAttribute.key)) {\r\n            continue;\r\n        }\r\n        conversionApi.writer.setAttribute(modelAttribute.key, modelAttribute.value, node);\r\n    }\r\n    return result;\r\n}\r\n/**\r\n * Helper function for upcasting-to-marker conversion. Takes the config in a format requested by `upcastElementToMarker()`\r\n * function and converts it to a format that is supported by `upcastElementToElement()` function.\r\n */\r\nfunction normalizeElementToMarkerModelConfig(model) {\r\n    return (viewElement, conversionApi) => {\r\n        const markerName = typeof model == 'string' ? model : model(viewElement, conversionApi);\r\n        return conversionApi.writer.createElement('$marker', { 'data-name': markerName });\r\n    };\r\n}\r\n/**\r\n * Helper function for upcasting-to-marker conversion. Takes the config in a format requested by `upcastDataToMarker()`\r\n * function and converts it to a format that is supported by `upcastElementToElement()` function.\r\n */\r\nfunction normalizeDataToMarkerConfig(config, type) {\r\n    const elementCreatorFunction = (viewElement, conversionApi) => {\r\n        const viewName = viewElement.getAttribute('name');\r\n        const markerName = config.model(viewName, conversionApi);\r\n        return conversionApi.writer.createElement('$marker', { 'data-name': markerName });\r\n    };\r\n    return {\r\n        // Upcast <markerGroup-start> and <markerGroup-end> elements.\r\n        view: `${config.view}-${type}`,\r\n        model: elementCreatorFunction\r\n    };\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/utils/selection-post-fixer\r\n */\r\nimport Position from '../position';\r\nimport Range from '../range';\r\n/**\r\n * Injects selection post-fixer to the model.\r\n *\r\n * The role of the selection post-fixer is to ensure that the selection is in a correct place\r\n * after a {@link module:engine/model/model~Model#change `change()`} block was executed.\r\n *\r\n * The correct position means that:\r\n *\r\n * * All collapsed selection ranges are in a place where the {@link module:engine/model/schema~Schema}\r\n * allows a `$text`.\r\n * * None of the selection's non-collapsed ranges crosses a {@link module:engine/model/schema~Schema#isLimit limit element}\r\n * boundary (a range must be rooted within one limit element).\r\n * * Only {@link module:engine/model/schema~Schema#isSelectable selectable elements} can be selected from the outside\r\n * (e.g. `[<paragraph>foo</paragraph>]` is invalid). This rule applies independently to both selection ends, so this\r\n * selection is correct: `<paragraph>f[oo</paragraph><imageBlock></imageBlock>]`.\r\n *\r\n * If the position is not correct, the post-fixer will automatically correct it.\r\n *\r\n * ## Fixing a non-collapsed selection\r\n *\r\n * See as an example a selection that starts in a P1 element and ends inside the text of a TD element\r\n * (`[` and `]` are range boundaries and `(l)` denotes an element defined as `isLimit=true`):\r\n *\r\n * ```\r\n * root\r\n *  |- element P1\r\n *  |   |- \"foo\"                                      root\r\n *  |- element TABLE (l)                   P1         TABLE             P2\r\n *  |   |- element TR (l)                 f o[o     TR      TR         b a r\r\n *  |   |   |- element TD (l)                       TD      TD\r\n *  |   |       |- \"aaa\"                          a]a a    b b b\r\n *  |   |- element TR (l)\r\n *  |   |   |- element TD (l)                           ||\r\n *  |   |       |- \"bbb\"                                ||\r\n *  |- element P2                                       VV\r\n *  |   |- \"bar\"\r\n *                                                    root\r\n *                                         P1         TABLE]            P2\r\n *                                        f o[o     TR      TR         b a r\r\n *                                                  TD      TD\r\n *                                                a a a    b b b\r\n * ```\r\n *\r\n * In the example above, the TABLE, TR and TD are defined as `isLimit=true` in the schema. The range which is not contained within\r\n * a single limit element must be expanded to select the outermost limit element. The range end is inside the text node of the TD element.\r\n * As the TD element is a child of the TR and TABLE elements, where both are defined as `isLimit=true` in the schema, the range must be\r\n * expanded to select the whole TABLE element.\r\n *\r\n * **Note** If the selection contains multiple ranges, the method returns a minimal set of ranges that are not intersecting after expanding\r\n * them to select `isLimit=true` elements.\r\n */\r\nexport function injectSelectionPostFixer(model) {\r\n    model.document.registerPostFixer(writer => selectionPostFixer(writer, model));\r\n}\r\n/**\r\n * The selection post-fixer.\r\n */\r\nfunction selectionPostFixer(writer, model) {\r\n    const selection = model.document.selection;\r\n    const schema = model.schema;\r\n    const ranges = [];\r\n    let wasFixed = false;\r\n    for (const modelRange of selection.getRanges()) {\r\n        // Go through all ranges in selection and try fixing each of them.\r\n        // Those ranges might overlap but will be corrected later.\r\n        const correctedRange = tryFixingRange(modelRange, schema);\r\n        // \"Selection fixing\" algorithms sometimes get lost. In consequence, it may happen\r\n        // that a new range is returned but, in fact, it has the same positions as the original\r\n        // range anyway. If this range is not discarded, a new selection will be set and that,\r\n        // for instance, would destroy the selection attributes. Let's make sure that the post-fixer\r\n        // actually worked first before setting a new selection.\r\n        //\r\n        // https://github.com/ckeditor/ckeditor5/issues/6693\r\n        if (correctedRange && !correctedRange.isEqual(modelRange)) {\r\n            ranges.push(correctedRange);\r\n            wasFixed = true;\r\n        }\r\n        else {\r\n            ranges.push(modelRange);\r\n        }\r\n    }\r\n    // If any of ranges were corrected update the selection.\r\n    if (wasFixed) {\r\n        writer.setSelection(mergeIntersectingRanges(ranges), { backward: selection.isBackward });\r\n    }\r\n    return false;\r\n}\r\n/**\r\n * Tries fixing a range if it's incorrect.\r\n *\r\n * **Note:** This helper is used by the selection post-fixer and to fix the `beforeinput` target ranges.\r\n *\r\n * @returns Returns fixed range or null if range is valid.\r\n */\r\nexport function tryFixingRange(range, schema) {\r\n    if (range.isCollapsed) {\r\n        return tryFixingCollapsedRange(range, schema);\r\n    }\r\n    return tryFixingNonCollapsedRage(range, schema);\r\n}\r\n/**\r\n * Tries to fix collapsed ranges.\r\n *\r\n * * Fixes situation when a range is in a place where $text is not allowed\r\n *\r\n * @param range Collapsed range to fix.\r\n * @returns Returns fixed range or null if range is valid.\r\n */\r\nfunction tryFixingCollapsedRange(range, schema) {\r\n    const originalPosition = range.start;\r\n    const nearestSelectionRange = schema.getNearestSelectionRange(originalPosition);\r\n    // This might be null, i.e. when the editor data is empty or the selection is inside a limit element\r\n    // that doesn't allow text inside.\r\n    // In the first case, there is no need to fix the selection range.\r\n    // In the second, let's go up to the outer selectable element\r\n    if (!nearestSelectionRange) {\r\n        const ancestorObject = originalPosition.getAncestors().reverse().find((item) => schema.isObject(item));\r\n        if (ancestorObject) {\r\n            return Range._createOn(ancestorObject);\r\n        }\r\n        return null;\r\n    }\r\n    if (!nearestSelectionRange.isCollapsed) {\r\n        return nearestSelectionRange;\r\n    }\r\n    const fixedPosition = nearestSelectionRange.start;\r\n    // Fixed position is the same as original - no need to return corrected range.\r\n    if (originalPosition.isEqual(fixedPosition)) {\r\n        return null;\r\n    }\r\n    return new Range(fixedPosition);\r\n}\r\n/**\r\n * Tries to fix an expanded range.\r\n *\r\n * @param range Expanded range to fix.\r\n * @returns Returns fixed range or null if range is valid.\r\n */\r\nfunction tryFixingNonCollapsedRage(range, schema) {\r\n    const { start, end } = range;\r\n    const isTextAllowedOnStart = schema.checkChild(start, '$text');\r\n    const isTextAllowedOnEnd = schema.checkChild(end, '$text');\r\n    const startLimitElement = schema.getLimitElement(start);\r\n    const endLimitElement = schema.getLimitElement(end);\r\n    // Ranges which both end are inside the same limit element (or root) might needs only minor fix.\r\n    if (startLimitElement === endLimitElement) {\r\n        // Range is valid when both position allows to place a text:\r\n        // - <block>f[oobarba]z</block>\r\n        // This would be \"fixed\" by a next check but as it will be the same it's better to return null so the selection stays the same.\r\n        if (isTextAllowedOnStart && isTextAllowedOnEnd) {\r\n            return null;\r\n        }\r\n        // Range that is on non-limit element (or is partially) must be fixed so it is placed inside the block around $text:\r\n        // - [<block>foo</block>]    ->    <block>[foo]</block>\r\n        // - [<block>foo]</block>    ->    <block>[foo]</block>\r\n        // - <block>f[oo</block>]    ->    <block>f[oo]</block>\r\n        // - [<block>foo</block><selectable></selectable>]    ->    <block>[foo</block><selectable></selectable>]\r\n        if (checkSelectionOnNonLimitElements(start, end, schema)) {\r\n            const isStartBeforeSelectable = start.nodeAfter && schema.isSelectable(start.nodeAfter);\r\n            const fixedStart = isStartBeforeSelectable ? null : schema.getNearestSelectionRange(start, 'forward');\r\n            const isEndAfterSelectable = end.nodeBefore && schema.isSelectable(end.nodeBefore);\r\n            const fixedEnd = isEndAfterSelectable ? null : schema.getNearestSelectionRange(end, 'backward');\r\n            // The schema.getNearestSelectionRange might return null - if that happens use original position.\r\n            const rangeStart = fixedStart ? fixedStart.start : start;\r\n            const rangeEnd = fixedEnd ? fixedEnd.end : end;\r\n            return new Range(rangeStart, rangeEnd);\r\n        }\r\n    }\r\n    const isStartInLimit = startLimitElement && !startLimitElement.is('rootElement');\r\n    const isEndInLimit = endLimitElement && !endLimitElement.is('rootElement');\r\n    // At this point we eliminated valid positions on text nodes so if one of range positions is placed inside a limit element\r\n    // then the range crossed limit element boundaries and needs to be fixed.\r\n    if (isStartInLimit || isEndInLimit) {\r\n        const bothInSameParent = (start.nodeAfter && end.nodeBefore) && start.nodeAfter.parent === end.nodeBefore.parent;\r\n        const expandStart = isStartInLimit && (!bothInSameParent || !isSelectable(start.nodeAfter, schema));\r\n        const expandEnd = isEndInLimit && (!bothInSameParent || !isSelectable(end.nodeBefore, schema));\r\n        // Although we've already found limit element on start/end positions we must find the outer-most limit element.\r\n        // as limit elements might be nested directly inside (ie table > tableRow > tableCell).\r\n        let fixedStart = start;\r\n        let fixedEnd = end;\r\n        if (expandStart) {\r\n            fixedStart = Position._createBefore(findOutermostLimitAncestor(startLimitElement, schema));\r\n        }\r\n        if (expandEnd) {\r\n            fixedEnd = Position._createAfter(findOutermostLimitAncestor(endLimitElement, schema));\r\n        }\r\n        return new Range(fixedStart, fixedEnd);\r\n    }\r\n    // Range was not fixed at this point so it is valid - ie it was placed around limit element already.\r\n    return null;\r\n}\r\n/**\r\n * Finds the outer-most ancestor.\r\n */\r\nfunction findOutermostLimitAncestor(startingNode, schema) {\r\n    let isLimitNode = startingNode;\r\n    let parent = isLimitNode;\r\n    // Find outer most isLimit block as such blocks might be nested (ie. in tables).\r\n    while (schema.isLimit(parent) && parent.parent) {\r\n        isLimitNode = parent;\r\n        parent = parent.parent;\r\n    }\r\n    return isLimitNode;\r\n}\r\n/**\r\n * Checks whether any of range boundaries is placed around non-limit elements.\r\n */\r\nfunction checkSelectionOnNonLimitElements(start, end, schema) {\r\n    const startIsOnBlock = (start.nodeAfter && !schema.isLimit(start.nodeAfter)) || schema.checkChild(start, '$text');\r\n    const endIsOnBlock = (end.nodeBefore && !schema.isLimit(end.nodeBefore)) || schema.checkChild(end, '$text');\r\n    // We should fix such selection when one of those nodes needs fixing.\r\n    return startIsOnBlock || endIsOnBlock;\r\n}\r\n/**\r\n * Returns a minimal non-intersecting array of ranges without duplicates.\r\n *\r\n * @param ranges Ranges to merge.\r\n * @returns Array of unique and non-intersecting ranges.\r\n */\r\nexport function mergeIntersectingRanges(ranges) {\r\n    const rangesToMerge = [...ranges];\r\n    const rangeIndexesToRemove = new Set();\r\n    let currentRangeIndex = 1;\r\n    while (currentRangeIndex < rangesToMerge.length) {\r\n        const currentRange = rangesToMerge[currentRangeIndex];\r\n        const previousRanges = rangesToMerge.slice(0, currentRangeIndex);\r\n        for (const [previousRangeIndex, previousRange] of previousRanges.entries()) {\r\n            if (rangeIndexesToRemove.has(previousRangeIndex)) {\r\n                continue;\r\n            }\r\n            if (currentRange.isEqual(previousRange)) {\r\n                rangeIndexesToRemove.add(previousRangeIndex);\r\n            }\r\n            else if (currentRange.isIntersecting(previousRange)) {\r\n                rangeIndexesToRemove.add(previousRangeIndex);\r\n                rangeIndexesToRemove.add(currentRangeIndex);\r\n                const mergedRange = currentRange.getJoined(previousRange);\r\n                rangesToMerge.push(mergedRange);\r\n            }\r\n        }\r\n        currentRangeIndex++;\r\n    }\r\n    const nonIntersectingRanges = rangesToMerge.filter((_, index) => !rangeIndexesToRemove.has(index));\r\n    return nonIntersectingRanges;\r\n}\r\n/**\r\n * Checks if node exists and if it's a selectable.\r\n */\r\nfunction isSelectable(node, schema) {\r\n    return node && schema.isSelectable(node);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/controller/editingcontroller\r\n */\r\nimport { CKEditorError, ObservableMixin, env } from '@ckeditor/ckeditor5-utils';\r\nimport RootEditableElement from '../view/rooteditableelement';\r\nimport View from '../view/view';\r\nimport Mapper from '../conversion/mapper';\r\nimport DowncastDispatcher from '../conversion/downcastdispatcher';\r\nimport { clearAttributes, convertCollapsedSelection, convertRangeSelection, insertAttributesAndChildren, insertText, remove } from '../conversion/downcasthelpers';\r\nimport { convertSelectionChange } from '../conversion/upcasthelpers';\r\nimport { tryFixingRange } from '../model/utils/selection-post-fixer';\r\n// @if CK_DEBUG_ENGINE // const { dumpTrees, initDocumentDumping } = require( '../dev-utils/utils' );\r\n/**\r\n * A controller for the editing pipeline. The editing pipeline controls the {@link ~EditingController#model model} rendering,\r\n * including selection handling. It also creates the {@link ~EditingController#view view} which builds a\r\n * browser-independent virtualization over the DOM elements. The editing controller also attaches default converters.\r\n */\r\nexport default class EditingController extends ObservableMixin() {\r\n    /**\r\n     * Creates an editing controller instance.\r\n     *\r\n     * @param model Editing model.\r\n     * @param stylesProcessor The styles processor instance.\r\n     */\r\n    constructor(model, stylesProcessor) {\r\n        super();\r\n        this.model = model;\r\n        this.view = new View(stylesProcessor);\r\n        this.mapper = new Mapper();\r\n        this.downcastDispatcher = new DowncastDispatcher({\r\n            mapper: this.mapper,\r\n            schema: model.schema\r\n        });\r\n        const doc = this.model.document;\r\n        const selection = doc.selection;\r\n        const markers = this.model.markers;\r\n        // When plugins listen on model changes (on selection change, post fixers, etc.) and change the view as a result of\r\n        // the model's change, they might trigger view rendering before the conversion is completed (e.g. before the selection\r\n        // is converted). We disable rendering for the length of the outermost model change() block to prevent that.\r\n        //\r\n        // See https://github.com/ckeditor/ckeditor5-engine/issues/1528\r\n        this.listenTo(this.model, '_beforeChanges', () => {\r\n            this.view._disableRendering(true);\r\n        }, { priority: 'highest' });\r\n        this.listenTo(this.model, '_afterChanges', () => {\r\n            this.view._disableRendering(false);\r\n        }, { priority: 'lowest' });\r\n        // Whenever model document is changed, convert those changes to the view (using model.Document#differ).\r\n        // Do it on 'low' priority, so changes are converted after other listeners did their job.\r\n        // Also convert model selection.\r\n        this.listenTo(doc, 'change', () => {\r\n            this.view.change(writer => {\r\n                this.downcastDispatcher.convertChanges(doc.differ, markers, writer);\r\n                this.downcastDispatcher.convertSelection(selection, markers, writer);\r\n            });\r\n        }, { priority: 'low' });\r\n        // Convert selection from the view to the model when it changes in the view.\r\n        this.listenTo(this.view.document, 'selectionChange', convertSelectionChange(this.model, this.mapper));\r\n        // Fix `beforeinput` target ranges so that they map to the valid model ranges.\r\n        this.listenTo(this.view.document, 'beforeinput', fixTargetRanges(this.mapper, this.model.schema, this.view), { priority: 'high' });\r\n        // Attach default model converters.\r\n        this.downcastDispatcher.on('insert:$text', insertText(), { priority: 'lowest' });\r\n        this.downcastDispatcher.on('insert', insertAttributesAndChildren(), { priority: 'lowest' });\r\n        this.downcastDispatcher.on('remove', remove(), { priority: 'low' });\r\n        // Attach default model selection converters.\r\n        this.downcastDispatcher.on('selection', clearAttributes(), { priority: 'high' });\r\n        this.downcastDispatcher.on('selection', convertRangeSelection(), { priority: 'low' });\r\n        this.downcastDispatcher.on('selection', convertCollapsedSelection(), { priority: 'low' });\r\n        // Binds {@link module:engine/view/document~Document#roots view roots collection} to\r\n        // {@link module:engine/model/document~Document#roots model roots collection} so creating\r\n        // model root automatically creates corresponding view root.\r\n        this.view.document.roots.bindTo(this.model.document.roots).using(root => {\r\n            // $graveyard is a special root that has no reflection in the view.\r\n            if (root.rootName == '$graveyard') {\r\n                return null;\r\n            }\r\n            const viewRoot = new RootEditableElement(this.view.document, root.name);\r\n            viewRoot.rootName = root.rootName;\r\n            this.mapper.bindElements(root, viewRoot);\r\n            return viewRoot;\r\n        });\r\n        // @if CK_DEBUG_ENGINE // initDocumentDumping( this.model.document );\r\n        // @if CK_DEBUG_ENGINE // initDocumentDumping( this.view.document );\r\n        // @if CK_DEBUG_ENGINE // dumpTrees( this.model.document, this.model.document.version );\r\n        // @if CK_DEBUG_ENGINE // dumpTrees( this.view.document, this.model.document.version );\r\n        // @if CK_DEBUG_ENGINE // this.model.document.on( 'change', () => {\r\n        // @if CK_DEBUG_ENGINE //\tdumpTrees( this.view.document, this.model.document.version );\r\n        // @if CK_DEBUG_ENGINE // }, { priority: 'lowest' } );\r\n    }\r\n    /**\r\n     * Removes all event listeners attached to the `EditingController`. Destroys all objects created\r\n     * by `EditingController` that need to be destroyed.\r\n     */\r\n    destroy() {\r\n        this.view.destroy();\r\n        this.stopListening();\r\n    }\r\n    /**\r\n     * Calling this method will refresh the marker by triggering the downcast conversion for it.\r\n     *\r\n     * Reconverting the marker is useful when you want to change its {@link module:engine/view/element~Element view element}\r\n     * without changing any marker data. For instance:\r\n     *\r\n     * ```ts\r\n     * let isCommentActive = false;\r\n     *\r\n     * model.conversion.markerToHighlight( {\r\n     * \tmodel: 'comment',\r\n     * \tview: data => {\r\n     * \t\tconst classes = [ 'comment-marker' ];\r\n     *\r\n     * \t\tif ( isCommentActive ) {\r\n     * \t\t\tclasses.push( 'comment-marker--active' );\r\n     * \t\t}\r\n     *\r\n     * \t\treturn { classes };\r\n     * \t}\r\n     * } );\r\n     *\r\n     * // ...\r\n     *\r\n     * // Change the property that indicates if marker is displayed as active or not.\r\n     * isCommentActive = true;\r\n     *\r\n     * // Reconverting will downcast and synchronize the marker with the new isCommentActive state value.\r\n     * editor.editing.reconvertMarker( 'comment' );\r\n     * ```\r\n     *\r\n     * **Note**: If you want to reconvert a model item, use {@link #reconvertItem} instead.\r\n     *\r\n     * @param markerOrName Name of a marker to update, or a marker instance.\r\n     */\r\n    reconvertMarker(markerOrName) {\r\n        const markerName = typeof markerOrName == 'string' ? markerOrName : markerOrName.name;\r\n        const currentMarker = this.model.markers.get(markerName);\r\n        if (!currentMarker) {\r\n            /**\r\n             * The marker with the provided name does not exist and cannot be reconverted.\r\n             *\r\n             * @error editingcontroller-reconvertmarker-marker-not-exist\r\n             * @param {String} markerName The name of the reconverted marker.\r\n             */\r\n            throw new CKEditorError('editingcontroller-reconvertmarker-marker-not-exist', this, { markerName });\r\n        }\r\n        this.model.change(() => {\r\n            this.model.markers._refresh(currentMarker);\r\n        });\r\n    }\r\n    /**\r\n     * Calling this method will downcast a model item on demand (by requesting a refresh in the {@link module:engine/model/differ~Differ}).\r\n     *\r\n     * You can use it if you want the view representation of a specific item updated as a response to external modifications. For instance,\r\n     * when the view structure depends not only on the associated model data but also on some external state.\r\n     *\r\n     * **Note**: If you want to reconvert a model marker, use {@link #reconvertMarker} instead.\r\n     *\r\n     * @param item Item to refresh.\r\n     */\r\n    reconvertItem(item) {\r\n        this.model.change(() => {\r\n            this.model.document.differ._refreshItem(item);\r\n        });\r\n    }\r\n}\r\n/**\r\n * Checks whether the target ranges provided by the `beforeInput` event can be properly mapped to model ranges and fixes them if needed.\r\n *\r\n * This is using the same logic as the selection post-fixer.\r\n */\r\nfunction fixTargetRanges(mapper, schema, view) {\r\n    return (evt, data) => {\r\n        // The Renderer is disabled while composing on non-android browsers, so we can't be sure that target ranges\r\n        // could be properly mapped to view and model because the DOM and view tree drifted apart.\r\n        if (view.document.isComposing && !env.isAndroid) {\r\n            return;\r\n        }\r\n        for (let i = 0; i < data.targetRanges.length; i++) {\r\n            const viewRange = data.targetRanges[i];\r\n            const modelRange = mapper.toModelRange(viewRange);\r\n            const correctedRange = tryFixingRange(modelRange, schema);\r\n            if (!correctedRange || correctedRange.isEqual(modelRange)) {\r\n                continue;\r\n            }\r\n            data.targetRanges[i] = mapper.toViewRange(correctedRange);\r\n        }\r\n    };\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/conversion/viewconsumable\r\n */\r\nimport { CKEditorError } from '@ckeditor/ckeditor5-utils';\r\nimport { isArray } from 'lodash-es';\r\n/**\r\n * Class used for handling consumption of view {@link module:engine/view/element~Element elements},\r\n * {@link module:engine/view/text~Text text nodes} and {@link module:engine/view/documentfragment~DocumentFragment document fragments}.\r\n * Element's name and its parts (attributes, classes and styles) can be consumed separately. Consuming an element's name\r\n * does not consume its attributes, classes and styles.\r\n * To add items for consumption use {@link module:engine/conversion/viewconsumable~ViewConsumable#add add method}.\r\n * To test items use {@link module:engine/conversion/viewconsumable~ViewConsumable#test test method}.\r\n * To consume items use {@link module:engine/conversion/viewconsumable~ViewConsumable#consume consume method}.\r\n * To revert already consumed items use {@link module:engine/conversion/viewconsumable~ViewConsumable#revert revert method}.\r\n *\r\n * ```ts\r\n * viewConsumable.add( element, { name: true } ); // Adds element's name as ready to be consumed.\r\n * viewConsumable.add( textNode ); // Adds text node for consumption.\r\n * viewConsumable.add( docFragment ); // Adds document fragment for consumption.\r\n * viewConsumable.test( element, { name: true }  ); // Tests if element's name can be consumed.\r\n * viewConsumable.test( textNode ); // Tests if text node can be consumed.\r\n * viewConsumable.test( docFragment ); // Tests if document fragment can be consumed.\r\n * viewConsumable.consume( element, { name: true }  ); // Consume element's name.\r\n * viewConsumable.consume( textNode ); // Consume text node.\r\n * viewConsumable.consume( docFragment ); // Consume document fragment.\r\n * viewConsumable.revert( element, { name: true }  ); // Revert already consumed element's name.\r\n * viewConsumable.revert( textNode ); // Revert already consumed text node.\r\n * viewConsumable.revert( docFragment ); // Revert already consumed document fragment.\r\n * ```\r\n */\r\nexport default class ViewConsumable {\r\n    constructor() {\r\n        /**\r\n         * Map of consumable elements. If {@link module:engine/view/element~Element element} is used as a key,\r\n         * {@link module:engine/conversion/viewconsumable~ViewElementConsumables ViewElementConsumables} instance is stored as value.\r\n         * For {@link module:engine/view/text~Text text nodes} and\r\n         * {@link module:engine/view/documentfragment~DocumentFragment document fragments} boolean value is stored as value.\r\n         */\r\n        this._consumables = new Map();\r\n    }\r\n    add(element, consumables) {\r\n        let elementConsumables;\r\n        // For text nodes and document fragments just mark them as consumable.\r\n        if (element.is('$text') || element.is('documentFragment')) {\r\n            this._consumables.set(element, true);\r\n            return;\r\n        }\r\n        // For elements create new ViewElementConsumables or update already existing one.\r\n        if (!this._consumables.has(element)) {\r\n            elementConsumables = new ViewElementConsumables(element);\r\n            this._consumables.set(element, elementConsumables);\r\n        }\r\n        else {\r\n            elementConsumables = this._consumables.get(element);\r\n        }\r\n        elementConsumables.add(consumables);\r\n    }\r\n    /**\r\n     * Tests if {@link module:engine/view/element~Element view element}, {@link module:engine/view/text~Text text node} or\r\n     * {@link module:engine/view/documentfragment~DocumentFragment document fragment} can be consumed.\r\n     * It returns `true` when all items included in method's call can be consumed. Returns `false` when\r\n     * first already consumed item is found and `null` when first non-consumable item is found.\r\n     *\r\n     * ```ts\r\n     * viewConsumable.test( p, { name: true } ); // Tests element's name.\r\n     * viewConsumable.test( p, { attributes: 'name' } ); // Tests attribute.\r\n     * viewConsumable.test( p, { classes: 'foobar' } ); // Tests class.\r\n     * viewConsumable.test( p, { styles: 'color' } ); // Tests style.\r\n     * viewConsumable.test( p, { attributes: 'name', styles: 'color' } ); // Tests attribute and style.\r\n     * viewConsumable.test( p, { classes: [ 'baz', 'bar' ] } ); // Multiple consumables can be tested.\r\n     * viewConsumable.test( textNode ); // Tests text node.\r\n     * viewConsumable.test( docFragment ); // Tests document fragment.\r\n     * ```\r\n     *\r\n     * Testing classes and styles as attribute will test if all added classes/styles can be consumed.\r\n     *\r\n     * ```ts\r\n     * viewConsumable.test( p, { attributes: 'class' } ); // Tests if all added classes can be consumed.\r\n     * viewConsumable.test( p, { attributes: 'style' } ); // Tests if all added styles can be consumed.\r\n     * ```\r\n     *\r\n     * @param consumables Used only if first parameter is {@link module:engine/view/element~Element view element} instance.\r\n     * @param consumables.name If set to true element's name will be included.\r\n     * @param consumables.attributes Attribute name or array of attribute names.\r\n     * @param consumables.classes Class name or array of class names.\r\n     * @param consumables.styles Style name or array of style names.\r\n     * @returns Returns `true` when all items included in method's call can be consumed. Returns `false`\r\n     * when first already consumed item is found and `null` when first non-consumable item is found.\r\n     */\r\n    test(element, consumables) {\r\n        const elementConsumables = this._consumables.get(element);\r\n        if (elementConsumables === undefined) {\r\n            return null;\r\n        }\r\n        // For text nodes and document fragments return stored boolean value.\r\n        if (element.is('$text') || element.is('documentFragment')) {\r\n            return elementConsumables;\r\n        }\r\n        // For elements test consumables object.\r\n        return elementConsumables.test(consumables);\r\n    }\r\n    /**\r\n     * Consumes {@link module:engine/view/element~Element view element}, {@link module:engine/view/text~Text text node} or\r\n     * {@link module:engine/view/documentfragment~DocumentFragment document fragment}.\r\n     * It returns `true` when all items included in method's call can be consumed, otherwise returns `false`.\r\n     *\r\n     * ```ts\r\n     * viewConsumable.consume( p, { name: true } ); // Consumes element's name.\r\n     * viewConsumable.consume( p, { attributes: 'name' } ); // Consumes element's attribute.\r\n     * viewConsumable.consume( p, { classes: 'foobar' } ); // Consumes element's class.\r\n     * viewConsumable.consume( p, { styles: 'color' } ); // Consumes element's style.\r\n     * viewConsumable.consume( p, { attributes: 'name', styles: 'color' } ); // Consumes attribute and style.\r\n     * viewConsumable.consume( p, { classes: [ 'baz', 'bar' ] } ); // Multiple consumables can be consumed.\r\n     * viewConsumable.consume( textNode ); // Consumes text node.\r\n     * viewConsumable.consume( docFragment ); // Consumes document fragment.\r\n     * ```\r\n     *\r\n     * Consuming classes and styles as attribute will test if all added classes/styles can be consumed.\r\n     *\r\n     * ```ts\r\n     * viewConsumable.consume( p, { attributes: 'class' } ); // Consume only if all added classes can be consumed.\r\n     * viewConsumable.consume( p, { attributes: 'style' } ); // Consume only if all added styles can be consumed.\r\n     * ```\r\n     *\r\n     * @param consumables Used only if first parameter is {@link module:engine/view/element~Element view element} instance.\r\n     * @param consumables.name If set to true element's name will be included.\r\n     * @param consumables.attributes Attribute name or array of attribute names.\r\n     * @param consumables.classes Class name or array of class names.\r\n     * @param consumables.styles Style name or array of style names.\r\n     * @returns Returns `true` when all items included in method's call can be consumed,\r\n     * otherwise returns `false`.\r\n     */\r\n    consume(element, consumables) {\r\n        if (this.test(element, consumables)) {\r\n            if (element.is('$text') || element.is('documentFragment')) {\r\n                // For text nodes and document fragments set value to false.\r\n                this._consumables.set(element, false);\r\n            }\r\n            else {\r\n                // For elements - consume consumables object.\r\n                this._consumables.get(element).consume(consumables);\r\n            }\r\n            return true;\r\n        }\r\n        return false;\r\n    }\r\n    /**\r\n     * Reverts {@link module:engine/view/element~Element view element}, {@link module:engine/view/text~Text text node} or\r\n     * {@link module:engine/view/documentfragment~DocumentFragment document fragment} so they can be consumed once again.\r\n     * Method does not revert items that were never previously added for consumption, even if they are included in\r\n     * method's call.\r\n     *\r\n     * ```ts\r\n     * viewConsumable.revert( p, { name: true } ); // Reverts element's name.\r\n     * viewConsumable.revert( p, { attributes: 'name' } ); // Reverts element's attribute.\r\n     * viewConsumable.revert( p, { classes: 'foobar' } ); // Reverts element's class.\r\n     * viewConsumable.revert( p, { styles: 'color' } ); // Reverts element's style.\r\n     * viewConsumable.revert( p, { attributes: 'name', styles: 'color' } ); // Reverts attribute and style.\r\n     * viewConsumable.revert( p, { classes: [ 'baz', 'bar' ] } ); // Multiple names can be reverted.\r\n     * viewConsumable.revert( textNode ); // Reverts text node.\r\n     * viewConsumable.revert( docFragment ); // Reverts document fragment.\r\n     * ```\r\n     *\r\n     * Reverting classes and styles as attribute will revert all classes/styles that were previously added for\r\n     * consumption.\r\n     *\r\n     * ```ts\r\n     * viewConsumable.revert( p, { attributes: 'class' } ); // Reverts all classes added for consumption.\r\n     * viewConsumable.revert( p, { attributes: 'style' } ); // Reverts all styles added for consumption.\r\n     * ```\r\n     *\r\n     * @param consumables Used only if first parameter is {@link module:engine/view/element~Element view element} instance.\r\n     * @param consumables.name If set to true element's name will be included.\r\n     * @param consumables.attributes Attribute name or array of attribute names.\r\n     * @param consumables.classes Class name or array of class names.\r\n     * @param consumables.styles Style name or array of style names.\r\n     */\r\n    revert(element, consumables) {\r\n        const elementConsumables = this._consumables.get(element);\r\n        if (elementConsumables !== undefined) {\r\n            if (element.is('$text') || element.is('documentFragment')) {\r\n                // For text nodes and document fragments - set consumable to true.\r\n                this._consumables.set(element, true);\r\n            }\r\n            else {\r\n                // For elements - revert items from consumables object.\r\n                elementConsumables.revert(consumables);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Creates consumable object from {@link module:engine/view/element~Element view element}. Consumable object will include\r\n     * element's name and all its attributes, classes and styles.\r\n     */\r\n    static consumablesFromElement(element) {\r\n        const consumables = {\r\n            element,\r\n            name: true,\r\n            attributes: [],\r\n            classes: [],\r\n            styles: []\r\n        };\r\n        const attributes = element.getAttributeKeys();\r\n        for (const attribute of attributes) {\r\n            // Skip classes and styles - will be added separately.\r\n            if (attribute == 'style' || attribute == 'class') {\r\n                continue;\r\n            }\r\n            consumables.attributes.push(attribute);\r\n        }\r\n        const classes = element.getClassNames();\r\n        for (const className of classes) {\r\n            consumables.classes.push(className);\r\n        }\r\n        const styles = element.getStyleNames();\r\n        for (const style of styles) {\r\n            consumables.styles.push(style);\r\n        }\r\n        return consumables;\r\n    }\r\n    /**\r\n     * Creates {@link module:engine/conversion/viewconsumable~ViewConsumable ViewConsumable} instance from\r\n     * {@link module:engine/view/node~Node node} or {@link module:engine/view/documentfragment~DocumentFragment document fragment}.\r\n     * Instance will contain all elements, child nodes, attributes, styles and classes added for consumption.\r\n     *\r\n     * @param from View node or document fragment from which `ViewConsumable` will be created.\r\n     * @param instance If provided, given `ViewConsumable` instance will be used\r\n     * to add all consumables. It will be returned instead of a new instance.\r\n     */\r\n    static createFrom(from, instance) {\r\n        if (!instance) {\r\n            instance = new ViewConsumable();\r\n        }\r\n        if (from.is('$text')) {\r\n            instance.add(from);\r\n            return instance;\r\n        }\r\n        // Add `from` itself, if it is an element.\r\n        if (from.is('element')) {\r\n            instance.add(from, ViewConsumable.consumablesFromElement(from));\r\n        }\r\n        if (from.is('documentFragment')) {\r\n            instance.add(from);\r\n        }\r\n        for (const child of from.getChildren()) {\r\n            instance = ViewConsumable.createFrom(child, instance);\r\n        }\r\n        return instance;\r\n    }\r\n}\r\nconst CONSUMABLE_TYPES = ['attributes', 'classes', 'styles'];\r\n/**\r\n * This is a private helper-class for {@link module:engine/conversion/viewconsumable~ViewConsumable}.\r\n * It represents and manipulates consumable parts of a single {@link module:engine/view/element~Element}.\r\n */\r\nexport class ViewElementConsumables {\r\n    /**\r\n     * Creates ViewElementConsumables instance.\r\n     *\r\n     * @param from View node or document fragment from which `ViewElementConsumables` is being created.\r\n     */\r\n    constructor(from) {\r\n        this.element = from;\r\n        this._canConsumeName = null;\r\n        this._consumables = {\r\n            attributes: new Map(),\r\n            styles: new Map(),\r\n            classes: new Map()\r\n        };\r\n    }\r\n    /**\r\n     * Adds consumable parts of the {@link module:engine/view/element~Element view element}.\r\n     * Element's name itself can be marked to be consumed (when element's name is consumed its attributes, classes and\r\n     * styles still could be consumed):\r\n     *\r\n     * ```ts\r\n     * consumables.add( { name: true } );\r\n     * ```\r\n     *\r\n     * Attributes classes and styles:\r\n     *\r\n     * ```ts\r\n     * consumables.add( { attributes: 'title', classes: 'foo', styles: 'color' } );\r\n     * consumables.add( { attributes: [ 'title', 'name' ], classes: [ 'foo', 'bar' ] );\r\n     * ```\r\n     *\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `viewconsumable-invalid-attribute` when `class` or `style`\r\n     * attribute is provided - it should be handled separately by providing `style` and `class` in consumables object.\r\n     *\r\n     * @param consumables Object describing which parts of the element can be consumed.\r\n     * @param consumables.name If set to `true` element's name will be added as consumable.\r\n     * @param consumables.attributes Attribute name or array of attribute names to add as consumable.\r\n     * @param consumables.classes Class name or array of class names to add as consumable.\r\n     * @param consumables.styles Style name or array of style names to add as consumable.\r\n     */\r\n    add(consumables) {\r\n        if (consumables.name) {\r\n            this._canConsumeName = true;\r\n        }\r\n        for (const type of CONSUMABLE_TYPES) {\r\n            if (type in consumables) {\r\n                this._add(type, consumables[type]);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Tests if parts of the {@link module:engine/view/node~Node view node} can be consumed.\r\n     *\r\n     * Element's name can be tested:\r\n     *\r\n     * ```ts\r\n     * consumables.test( { name: true } );\r\n     * ```\r\n     *\r\n     * Attributes classes and styles:\r\n     *\r\n     * ```ts\r\n     * consumables.test( { attributes: 'title', classes: 'foo', styles: 'color' } );\r\n     * consumables.test( { attributes: [ 'title', 'name' ], classes: [ 'foo', 'bar' ] );\r\n     * ```\r\n     *\r\n     * @param consumables Object describing which parts of the element should be tested.\r\n     * @param consumables.name If set to `true` element's name will be tested.\r\n     * @param consumables.attributes Attribute name or array of attribute names to test.\r\n     * @param consumables.classes Class name or array of class names to test.\r\n     * @param consumables.styles Style name or array of style names to test.\r\n     * @returns `true` when all tested items can be consumed, `null` when even one of the items\r\n     * was never marked for consumption and `false` when even one of the items was already consumed.\r\n     */\r\n    test(consumables) {\r\n        // Check if name can be consumed.\r\n        if (consumables.name && !this._canConsumeName) {\r\n            return this._canConsumeName;\r\n        }\r\n        for (const type of CONSUMABLE_TYPES) {\r\n            if (type in consumables) {\r\n                const value = this._test(type, consumables[type]);\r\n                if (value !== true) {\r\n                    return value;\r\n                }\r\n            }\r\n        }\r\n        // Return true only if all can be consumed.\r\n        return true;\r\n    }\r\n    /**\r\n     * Consumes parts of {@link module:engine/view/element~Element view element}. This function does not check if consumable item\r\n     * is already consumed - it consumes all consumable items provided.\r\n     * Element's name can be consumed:\r\n     *\r\n     * ```ts\r\n     * consumables.consume( { name: true } );\r\n     * ```\r\n     *\r\n     * Attributes classes and styles:\r\n     *\r\n     * ```ts\r\n     * consumables.consume( { attributes: 'title', classes: 'foo', styles: 'color' } );\r\n     * consumables.consume( { attributes: [ 'title', 'name' ], classes: [ 'foo', 'bar' ] );\r\n     * ```\r\n     *\r\n     * @param consumables Object describing which parts of the element should be consumed.\r\n     * @param consumables.name If set to `true` element's name will be consumed.\r\n     * @param consumables.attributes Attribute name or array of attribute names to consume.\r\n     * @param consumables.classes Class name or array of class names to consume.\r\n     * @param consumables.styles Style name or array of style names to consume.\r\n     */\r\n    consume(consumables) {\r\n        if (consumables.name) {\r\n            this._canConsumeName = false;\r\n        }\r\n        for (const type of CONSUMABLE_TYPES) {\r\n            if (type in consumables) {\r\n                this._consume(type, consumables[type]);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Revert already consumed parts of {@link module:engine/view/element~Element view Element}, so they can be consumed once again.\r\n     * Element's name can be reverted:\r\n     *\r\n     * ```ts\r\n     * consumables.revert( { name: true } );\r\n     * ```\r\n     *\r\n     * Attributes classes and styles:\r\n     *\r\n     * ```ts\r\n     * consumables.revert( { attributes: 'title', classes: 'foo', styles: 'color' } );\r\n     * consumables.revert( { attributes: [ 'title', 'name' ], classes: [ 'foo', 'bar' ] );\r\n     * ```\r\n     *\r\n     * @param consumables Object describing which parts of the element should be reverted.\r\n     * @param consumables.name If set to `true` element's name will be reverted.\r\n     * @param consumables.attributes Attribute name or array of attribute names to revert.\r\n     * @param consumables.classes Class name or array of class names to revert.\r\n     * @param consumables.styles Style name or array of style names to revert.\r\n     */\r\n    revert(consumables) {\r\n        if (consumables.name) {\r\n            this._canConsumeName = true;\r\n        }\r\n        for (const type of CONSUMABLE_TYPES) {\r\n            if (type in consumables) {\r\n                this._revert(type, consumables[type]);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Helper method that adds consumables of a given type: attribute, class or style.\r\n     *\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `viewconsumable-invalid-attribute` when `class` or `style`\r\n     * type is provided - it should be handled separately by providing actual style/class type.\r\n     *\r\n     * @param type Type of the consumable item: `attributes`, `classes` or `styles`.\r\n     * @param item Consumable item or array of items.\r\n     */\r\n    _add(type, item) {\r\n        const items = isArray(item) ? item : [item];\r\n        const consumables = this._consumables[type];\r\n        for (const name of items) {\r\n            if (type === 'attributes' && (name === 'class' || name === 'style')) {\r\n                /**\r\n                 * Class and style attributes should be handled separately in\r\n                 * {@link module:engine/conversion/viewconsumable~ViewConsumable#add `ViewConsumable#add()`}.\r\n                 *\r\n                 * What you have done is trying to use:\r\n                 *\r\n                 *\t\tconsumables.add( { attributes: [ 'class', 'style' ] } );\r\n                 *\r\n                 * While each class and style should be registered separately:\r\n                 *\r\n                 *\t\tconsumables.add( { classes: 'some-class', styles: 'font-weight' } );\r\n                 *\r\n                 * @error viewconsumable-invalid-attribute\r\n                 */\r\n                throw new CKEditorError('viewconsumable-invalid-attribute', this);\r\n            }\r\n            consumables.set(name, true);\r\n            if (type === 'styles') {\r\n                for (const alsoName of this.element.document.stylesProcessor.getRelatedStyles(name)) {\r\n                    consumables.set(alsoName, true);\r\n                }\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Helper method that tests consumables of a given type: attribute, class or style.\r\n     *\r\n     * @param type Type of the consumable item: `attributes`, `classes` or `styles`.\r\n     * @param item Consumable item or array of items.\r\n     * @returns Returns `true` if all items can be consumed, `null` when one of the items cannot be\r\n     * consumed and `false` when one of the items is already consumed.\r\n     */\r\n    _test(type, item) {\r\n        const items = isArray(item) ? item : [item];\r\n        const consumables = this._consumables[type];\r\n        for (const name of items) {\r\n            if (type === 'attributes' && (name === 'class' || name === 'style')) {\r\n                const consumableName = name == 'class' ? 'classes' : 'styles';\r\n                // Check all classes/styles if class/style attribute is tested.\r\n                const value = this._test(consumableName, [...this._consumables[consumableName].keys()]);\r\n                if (value !== true) {\r\n                    return value;\r\n                }\r\n            }\r\n            else {\r\n                const value = consumables.get(name);\r\n                // Return null if attribute is not found.\r\n                if (value === undefined) {\r\n                    return null;\r\n                }\r\n                if (!value) {\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n    /**\r\n     * Helper method that consumes items of a given type: attribute, class or style.\r\n     *\r\n     * @param type Type of the consumable item: `attributes`, `classes` or `styles`.\r\n     * @param item Consumable item or array of items.\r\n     */\r\n    _consume(type, item) {\r\n        const items = isArray(item) ? item : [item];\r\n        const consumables = this._consumables[type];\r\n        for (const name of items) {\r\n            if (type === 'attributes' && (name === 'class' || name === 'style')) {\r\n                const consumableName = name == 'class' ? 'classes' : 'styles';\r\n                // If class or style is provided for consumption - consume them all.\r\n                this._consume(consumableName, [...this._consumables[consumableName].keys()]);\r\n            }\r\n            else {\r\n                consumables.set(name, false);\r\n                if (type == 'styles') {\r\n                    for (const toConsume of this.element.document.stylesProcessor.getRelatedStyles(name)) {\r\n                        consumables.set(toConsume, false);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Helper method that reverts items of a given type: attribute, class or style.\r\n     *\r\n     * @param type Type of the consumable item: `attributes`, `classes` or , `styles`.\r\n     * @param item Consumable item or array of items.\r\n     */\r\n    _revert(type, item) {\r\n        const items = isArray(item) ? item : [item];\r\n        const consumables = this._consumables[type];\r\n        for (const name of items) {\r\n            if (type === 'attributes' && (name === 'class' || name === 'style')) {\r\n                const consumableName = name == 'class' ? 'classes' : 'styles';\r\n                // If class or style is provided for reverting - revert them all.\r\n                this._revert(consumableName, [...this._consumables[consumableName].keys()]);\r\n            }\r\n            else {\r\n                const value = consumables.get(name);\r\n                if (value === false) {\r\n                    consumables.set(name, true);\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/schema\r\n */\r\nimport Element from './element';\r\nimport Position from './position';\r\nimport Range from './range';\r\nimport Text from './text';\r\nimport TreeWalker from './treewalker';\r\nimport { CKEditorError, ObservableMixin } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * The model's schema. It defines the allowed and disallowed structures of nodes as well as nodes' attributes.\r\n * The schema is usually defined by the features and based on them, the editing framework and features\r\n * make decisions on how to change and process the model.\r\n *\r\n * The instance of schema is available in {@link module:engine/model/model~Model#schema `editor.model.schema`}.\r\n *\r\n * Read more about the schema in:\r\n *\r\n * * The {@glink framework/architecture/editing-engine#schema schema section} of the\r\n * {@glink framework/architecture/editing-engine Introduction to the Editing engine architecture} guide.\r\n * * The {@glink framework/deep-dive/schema Schema deep-dive} guide.\r\n */\r\nexport default class Schema extends ObservableMixin() {\r\n    /**\r\n     * Creates a schema instance.\r\n     */\r\n    constructor() {\r\n        super();\r\n        this._sourceDefinitions = {};\r\n        /**\r\n         * A dictionary containing attribute properties.\r\n         */\r\n        this._attributeProperties = {};\r\n        this.decorate('checkChild');\r\n        this.decorate('checkAttribute');\r\n        this.on('checkAttribute', (evt, args) => {\r\n            args[0] = new SchemaContext(args[0]);\r\n        }, { priority: 'highest' });\r\n        this.on('checkChild', (evt, args) => {\r\n            args[0] = new SchemaContext(args[0]);\r\n            args[1] = this.getDefinition(args[1]);\r\n        }, { priority: 'highest' });\r\n    }\r\n    /**\r\n     * Registers a schema item. Can only be called once for every item name.\r\n     *\r\n     * ```ts\r\n     * schema.register( 'paragraph', {\r\n     * \tinheritAllFrom: '$block'\r\n     * } );\r\n     * ```\r\n     */\r\n    register(itemName, definition) {\r\n        if (this._sourceDefinitions[itemName]) {\r\n            /**\r\n             * A single item cannot be registered twice in the schema.\r\n             *\r\n             * This situation may happen when:\r\n             *\r\n             * * Two or more plugins called {@link module:engine/model/schema~Schema#register `register()`} with the same name.\r\n             * This will usually mean that there is a collision between plugins which try to use the same element in the model.\r\n             * Unfortunately, the only way to solve this is by modifying one of these plugins to use a unique model element name.\r\n             * * A single plugin was loaded twice. This happens when it is installed by npm/yarn in two versions\r\n             * and usually means one or more of the following issues:\r\n             *     * a version mismatch (two of your dependencies require two different versions of this plugin),\r\n             *     * incorrect imports (this plugin is somehow imported twice in a way which confuses webpack),\r\n             *     * mess in `node_modules/` (`rm -rf node_modules/` may help).\r\n             *\r\n             * **Note:** Check the logged `itemName` to better understand which plugin was duplicated/conflicting.\r\n             *\r\n             * @param itemName The name of the model element that is being registered twice.\r\n             * @error schema-cannot-register-item-twice\r\n             */\r\n            throw new CKEditorError('schema-cannot-register-item-twice', this, {\r\n                itemName\r\n            });\r\n        }\r\n        this._sourceDefinitions[itemName] = [\r\n            Object.assign({}, definition)\r\n        ];\r\n        this._clearCache();\r\n    }\r\n    /**\r\n     * Extends a {@link #register registered} item's definition.\r\n     *\r\n     * Extending properties such as `allowIn` will add more items to the existing properties,\r\n     * while redefining properties such as `isBlock` will override the previously defined ones.\r\n     *\r\n     * ```ts\r\n     * schema.register( 'foo', {\r\n     * \tallowIn: '$root',\r\n     * \tisBlock: true;\r\n     * } );\r\n     * schema.extend( 'foo', {\r\n     * \tallowIn: 'blockQuote',\r\n     * \tisBlock: false\r\n     * } );\r\n     *\r\n     * schema.getDefinition( 'foo' );\r\n     * //\t{\r\n     * //\t\tallowIn: [ '$root', 'blockQuote' ],\r\n     * // \t\tisBlock: false\r\n     * //\t}\r\n     * ```\r\n     */\r\n    extend(itemName, definition) {\r\n        if (!this._sourceDefinitions[itemName]) {\r\n            /**\r\n             * Cannot extend an item which was not registered yet.\r\n             *\r\n             * This error happens when a plugin tries to extend the schema definition of an item which was not\r\n             * {@link module:engine/model/schema~Schema#register registered} yet.\r\n             *\r\n             * @param itemName The name of the model element which is being extended.\r\n             * @error schema-cannot-extend-missing-item\r\n             */\r\n            throw new CKEditorError('schema-cannot-extend-missing-item', this, {\r\n                itemName\r\n            });\r\n        }\r\n        this._sourceDefinitions[itemName].push(Object.assign({}, definition));\r\n        this._clearCache();\r\n    }\r\n    /**\r\n     * Returns data of all registered items.\r\n     *\r\n     * This method should normally be used for reflection purposes (e.g. defining a clone of a certain element,\r\n     * checking a list of all block elements, etc).\r\n     * Use specific methods (such as {@link #checkChild `checkChild()`} or {@link #isLimit `isLimit()`})\r\n     * in other cases.\r\n     */\r\n    getDefinitions() {\r\n        if (!this._compiledDefinitions) {\r\n            this._compile();\r\n        }\r\n        return this._compiledDefinitions;\r\n    }\r\n    /**\r\n     * Returns a definition of the given item or `undefined` if an item is not registered.\r\n     *\r\n     * This method should normally be used for reflection purposes (e.g. defining a clone of a certain element,\r\n     * checking a list of all block elements, etc).\r\n     * Use specific methods (such as {@link #checkChild `checkChild()`} or {@link #isLimit `isLimit()`})\r\n     * in other cases.\r\n     */\r\n    getDefinition(item) {\r\n        let itemName;\r\n        if (typeof item == 'string') {\r\n            itemName = item;\r\n        }\r\n        else if ('is' in item && (item.is('$text') || item.is('$textProxy'))) {\r\n            itemName = '$text';\r\n        }\r\n        // Element or module:engine/model/schema~SchemaContextItem.\r\n        else {\r\n            itemName = item.name;\r\n        }\r\n        return this.getDefinitions()[itemName];\r\n    }\r\n    /**\r\n     * Returns `true` if the given item is registered in the schema.\r\n     *\r\n     * ```ts\r\n     * schema.isRegistered( 'paragraph' ); // -> true\r\n     * schema.isRegistered( editor.model.document.getRoot() ); // -> true\r\n     * schema.isRegistered( 'foo' ); // -> false\r\n     * ```\r\n     */\r\n    isRegistered(item) {\r\n        return !!this.getDefinition(item);\r\n    }\r\n    /**\r\n     * Returns `true` if the given item is defined to be\r\n     * a block by the {@link module:engine/model/schema~SchemaItemDefinition}'s `isBlock` property.\r\n     *\r\n     * ```ts\r\n     * schema.isBlock( 'paragraph' ); // -> true\r\n     * schema.isBlock( '$root' ); // -> false\r\n     *\r\n     * const paragraphElement = writer.createElement( 'paragraph' );\r\n     * schema.isBlock( paragraphElement ); // -> true\r\n     * ```\r\n     *\r\n     * See the {@glink framework/deep-dive/schema#block-elements Block elements} section of\r\n     * the {@glink framework/deep-dive/schema Schema deep-dive} guide for more details.\r\n     */\r\n    isBlock(item) {\r\n        const def = this.getDefinition(item);\r\n        return !!(def && def.isBlock);\r\n    }\r\n    /**\r\n     * Returns `true` if the given item should be treated as a limit element.\r\n     *\r\n     * It considers an item to be a limit element if its\r\n     * {@link module:engine/model/schema~SchemaItemDefinition}'s\r\n     * {@link module:engine/model/schema~SchemaItemDefinition#isLimit `isLimit`} or\r\n     * {@link module:engine/model/schema~SchemaItemDefinition#isObject `isObject`} property\r\n     * was set to `true`.\r\n     *\r\n     * ```ts\r\n     * schema.isLimit( 'paragraph' ); // -> false\r\n     * schema.isLimit( '$root' ); // -> true\r\n     * schema.isLimit( editor.model.document.getRoot() ); // -> true\r\n     * schema.isLimit( 'imageBlock' ); // -> true\r\n     * ```\r\n     *\r\n     * See the {@glink framework/deep-dive/schema#limit-elements Limit elements} section of\r\n     * the {@glink framework/deep-dive/schema Schema deep-dive} guide for more details.\r\n     */\r\n    isLimit(item) {\r\n        const def = this.getDefinition(item);\r\n        if (!def) {\r\n            return false;\r\n        }\r\n        return !!(def.isLimit || def.isObject);\r\n    }\r\n    /**\r\n     * Returns `true` if the given item should be treated as an object element.\r\n     *\r\n     * It considers an item to be an object element if its\r\n     * {@link module:engine/model/schema~SchemaItemDefinition}'s\r\n     * {@link module:engine/model/schema~SchemaItemDefinition#isObject `isObject`} property\r\n     * was set to `true`.\r\n     *\r\n     * ```ts\r\n     * schema.isObject( 'paragraph' ); // -> false\r\n     * schema.isObject( 'imageBlock' ); // -> true\r\n     *\r\n     * const imageElement = writer.createElement( 'imageBlock' );\r\n     * schema.isObject( imageElement ); // -> true\r\n     * ```\r\n     *\r\n     * See the {@glink framework/deep-dive/schema#object-elements Object elements} section of\r\n     * the {@glink framework/deep-dive/schema Schema deep-dive} guide for more details.\r\n     */\r\n    isObject(item) {\r\n        const def = this.getDefinition(item);\r\n        if (!def) {\r\n            return false;\r\n        }\r\n        // Note: Check out the implementation of #isLimit(), #isSelectable(), and #isContent()\r\n        // to understand why these three constitute an object.\r\n        return !!(def.isObject || (def.isLimit && def.isSelectable && def.isContent));\r\n    }\r\n    /**\r\n     * Returns `true` if the given item is defined to be\r\n     * an inline element by the {@link module:engine/model/schema~SchemaItemDefinition}'s `isInline` property.\r\n     *\r\n     * ```ts\r\n     * schema.isInline( 'paragraph' ); // -> false\r\n     * schema.isInline( 'softBreak' ); // -> true\r\n     *\r\n     * const text = writer.createText( 'foo' );\r\n     * schema.isInline( text ); // -> true\r\n     * ```\r\n     *\r\n     * See the {@glink framework/deep-dive/schema#inline-elements Inline elements} section of\r\n     * the {@glink framework/deep-dive/schema Schema deep-dive} guide for more details.\r\n     */\r\n    isInline(item) {\r\n        const def = this.getDefinition(item);\r\n        return !!(def && def.isInline);\r\n    }\r\n    /**\r\n     * Returns `true` if the given item is defined to be\r\n     * a selectable element by the {@link module:engine/model/schema~SchemaItemDefinition}'s `isSelectable` property.\r\n     *\r\n     * ```ts\r\n     * schema.isSelectable( 'paragraph' ); // -> false\r\n     * schema.isSelectable( 'heading1' ); // -> false\r\n     * schema.isSelectable( 'imageBlock' ); // -> true\r\n     * schema.isSelectable( 'tableCell' ); // -> true\r\n     *\r\n     * const text = writer.createText( 'foo' );\r\n     * schema.isSelectable( text ); // -> false\r\n     * ```\r\n     *\r\n     * See the {@glink framework/deep-dive/schema#selectable-elements Selectable elements section} of\r\n     * the {@glink framework/deep-dive/schema Schema deep-dive} guide for more details.\r\n     */\r\n    isSelectable(item) {\r\n        const def = this.getDefinition(item);\r\n        if (!def) {\r\n            return false;\r\n        }\r\n        return !!(def.isSelectable || def.isObject);\r\n    }\r\n    /**\r\n     * Returns `true` if the given item is defined to be\r\n     * a content by the {@link module:engine/model/schema~SchemaItemDefinition}'s `isContent` property.\r\n     *\r\n     * ```ts\r\n     * schema.isContent( 'paragraph' ); // -> false\r\n     * schema.isContent( 'heading1' ); // -> false\r\n     * schema.isContent( 'imageBlock' ); // -> true\r\n     * schema.isContent( 'horizontalLine' ); // -> true\r\n     *\r\n     * const text = writer.createText( 'foo' );\r\n     * schema.isContent( text ); // -> true\r\n     * ```\r\n     *\r\n     * See the {@glink framework/deep-dive/schema#content-elements Content elements section} of\r\n     * the {@glink framework/deep-dive/schema Schema deep-dive} guide for more details.\r\n     */\r\n    isContent(item) {\r\n        const def = this.getDefinition(item);\r\n        if (!def) {\r\n            return false;\r\n        }\r\n        return !!(def.isContent || def.isObject);\r\n    }\r\n    /**\r\n     * Checks whether the given node (`child`) can be a child of the given context.\r\n     *\r\n     * ```ts\r\n     * schema.checkChild( model.document.getRoot(), paragraph ); // -> false\r\n     *\r\n     * schema.register( 'paragraph', {\r\n     * \tallowIn: '$root'\r\n     * } );\r\n     * schema.checkChild( model.document.getRoot(), paragraph ); // -> true\r\n     * ```\r\n     *\r\n     * Note: When verifying whether the given node can be a child of the given context, the\r\n     * schema also verifies the entire context &mdash; from its root to its last element. Therefore, it is possible\r\n     * for `checkChild()` to return `false` even though the context's last element can contain the checked child.\r\n     * It happens if one of the context's elements does not allow its child.\r\n     *\r\n     * @fires checkChild\r\n     * @param context The context in which the child will be checked.\r\n     * @param def The child to check.\r\n     */\r\n    checkChild(context, def) {\r\n        // Note: context and child are already normalized here to a SchemaContext and SchemaCompiledItemDefinition.\r\n        if (!def) {\r\n            return false;\r\n        }\r\n        return this._checkContextMatch(def, context);\r\n    }\r\n    /**\r\n     * Checks whether the given attribute can be applied in the given context (on the last\r\n     * item of the context).\r\n     *\r\n     * ```ts\r\n     * schema.checkAttribute( textNode, 'bold' ); // -> false\r\n     *\r\n     * schema.extend( '$text', {\r\n     * \tallowAttributes: 'bold'\r\n     * } );\r\n     * schema.checkAttribute( textNode, 'bold' ); // -> true\r\n     * ```\r\n     *\r\n     * @fires checkAttribute\r\n     * @param context The context in which the attribute will be checked.\r\n     */\r\n    checkAttribute(context, attributeName) {\r\n        const def = this.getDefinition(context.last);\r\n        if (!def) {\r\n            return false;\r\n        }\r\n        return def.allowAttributes.includes(attributeName);\r\n    }\r\n    /**\r\n     * Checks whether the given element (`elementToMerge`) can be merged with the specified base element (`positionOrBaseElement`).\r\n     *\r\n     * In other words &mdash; whether `elementToMerge`'s children {@link #checkChild are allowed} in the `positionOrBaseElement`.\r\n     *\r\n     * This check ensures that elements merged with {@link module:engine/model/writer~Writer#merge `Writer#merge()`}\r\n     * will be valid.\r\n     *\r\n     * Instead of elements, you can pass the instance of the {@link module:engine/model/position~Position} class as the\r\n     * `positionOrBaseElement`. It means that the elements before and after the position will be checked whether they can be merged.\r\n     *\r\n     * @param positionOrBaseElement The position or base element to which the `elementToMerge` will be merged.\r\n     * @param elementToMerge The element to merge. Required if `positionOrBaseElement` is an element.\r\n     */\r\n    checkMerge(positionOrBaseElement, elementToMerge) {\r\n        if (positionOrBaseElement instanceof Position) {\r\n            const nodeBefore = positionOrBaseElement.nodeBefore;\r\n            const nodeAfter = positionOrBaseElement.nodeAfter;\r\n            if (!(nodeBefore instanceof Element)) {\r\n                /**\r\n                 * The node before the merge position must be an element.\r\n                 *\r\n                 * @error schema-check-merge-no-element-before\r\n                 */\r\n                throw new CKEditorError('schema-check-merge-no-element-before', this);\r\n            }\r\n            if (!(nodeAfter instanceof Element)) {\r\n                /**\r\n                 * The node after the merge position must be an element.\r\n                 *\r\n                 * @error schema-check-merge-no-element-after\r\n                 */\r\n                throw new CKEditorError('schema-check-merge-no-element-after', this);\r\n            }\r\n            return this.checkMerge(nodeBefore, nodeAfter);\r\n        }\r\n        for (const child of elementToMerge.getChildren()) {\r\n            if (!this.checkChild(positionOrBaseElement, child)) {\r\n                return false;\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n    /**\r\n     * Allows registering a callback to the {@link #checkChild} method calls.\r\n     *\r\n     * Callbacks allow you to implement rules which are not otherwise possible to achieve\r\n     * by using the declarative API of {@link module:engine/model/schema~SchemaItemDefinition}.\r\n     * For example, by using this method you can disallow elements in specific contexts.\r\n     *\r\n     * This method is a shorthand for using the {@link #event:checkChild} event. For even better control,\r\n     * you can use that event instead.\r\n     *\r\n     * Example:\r\n     *\r\n     * ```ts\r\n     * // Disallow heading1 directly inside a blockQuote.\r\n     * schema.addChildCheck( ( context, childDefinition ) => {\r\n     * \tif ( context.endsWith( 'blockQuote' ) && childDefinition.name == 'heading1' ) {\r\n     * \t\treturn false;\r\n     * \t}\r\n     * } );\r\n     * ```\r\n     *\r\n     * Which translates to:\r\n     *\r\n     * ```ts\r\n     * schema.on( 'checkChild', ( evt, args ) => {\r\n     * \tconst context = args[ 0 ];\r\n     * \tconst childDefinition = args[ 1 ];\r\n     *\r\n     * \tif ( context.endsWith( 'blockQuote' ) && childDefinition && childDefinition.name == 'heading1' ) {\r\n     * \t\t// Prevent next listeners from being called.\r\n     * \t\tevt.stop();\r\n     * \t\t// Set the checkChild()'s return value.\r\n     * \t\tevt.return = false;\r\n     * \t}\r\n     * }, { priority: 'high' } );\r\n     * ```\r\n     *\r\n     * @param callback The callback to be called. It is called with two parameters:\r\n     * {@link module:engine/model/schema~SchemaContext} (context) instance and\r\n     * {@link module:engine/model/schema~SchemaCompiledItemDefinition} (child-to-check definition).\r\n     * The callback may return `true/false` to override `checkChild()`'s return value. If it does not return\r\n     * a boolean value, the default algorithm (or other callbacks) will define `checkChild()`'s return value.\r\n     */\r\n    addChildCheck(callback) {\r\n        this.on('checkChild', (evt, [ctx, childDef]) => {\r\n            // checkChild() was called with a non-registered child.\r\n            // In 99% cases such check should return false, so not to overcomplicate all callbacks\r\n            // don't even execute them.\r\n            if (!childDef) {\r\n                return;\r\n            }\r\n            const retValue = callback(ctx, childDef);\r\n            if (typeof retValue == 'boolean') {\r\n                evt.stop();\r\n                evt.return = retValue;\r\n            }\r\n        }, { priority: 'high' });\r\n    }\r\n    /**\r\n     * Allows registering a callback to the {@link #checkAttribute} method calls.\r\n     *\r\n     * Callbacks allow you to implement rules which are not otherwise possible to achieve\r\n     * by using the declarative API of {@link module:engine/model/schema~SchemaItemDefinition}.\r\n     * For example, by using this method you can disallow attribute if node to which it is applied\r\n     * is contained within some other element (e.g. you want to disallow `bold` on `$text` within `heading1`).\r\n     *\r\n     * This method is a shorthand for using the {@link #event:checkAttribute} event. For even better control,\r\n     * you can use that event instead.\r\n     *\r\n     * Example:\r\n     *\r\n     * ```ts\r\n     * // Disallow bold on $text inside heading1.\r\n     * schema.addAttributeCheck( ( context, attributeName ) => {\r\n     * \tif ( context.endsWith( 'heading1 $text' ) && attributeName == 'bold' ) {\r\n     * \t\treturn false;\r\n     * \t}\r\n     * } );\r\n     * ```\r\n     *\r\n     * Which translates to:\r\n     *\r\n     * ```ts\r\n     * schema.on( 'checkAttribute', ( evt, args ) => {\r\n     * \tconst context = args[ 0 ];\r\n     * \tconst attributeName = args[ 1 ];\r\n     *\r\n     * \tif ( context.endsWith( 'heading1 $text' ) && attributeName == 'bold' ) {\r\n     * \t\t// Prevent next listeners from being called.\r\n     * \t\tevt.stop();\r\n     * \t\t// Set the checkAttribute()'s return value.\r\n     * \t\tevt.return = false;\r\n     * \t}\r\n     * }, { priority: 'high' } );\r\n     * ```\r\n     *\r\n     * @param callback The callback to be called. It is called with two parameters:\r\n     * {@link module:engine/model/schema~SchemaContext} (context) instance and attribute name.\r\n     * The callback may return `true/false` to override `checkAttribute()`'s return value. If it does not return\r\n     * a boolean value, the default algorithm (or other callbacks) will define `checkAttribute()`'s return value.\r\n     */\r\n    addAttributeCheck(callback) {\r\n        this.on('checkAttribute', (evt, [ctx, attributeName]) => {\r\n            const retValue = callback(ctx, attributeName);\r\n            if (typeof retValue == 'boolean') {\r\n                evt.stop();\r\n                evt.return = retValue;\r\n            }\r\n        }, { priority: 'high' });\r\n    }\r\n    /**\r\n     * This method allows assigning additional metadata to the model attributes. For example,\r\n     * {@link module:engine/model/schema~AttributeProperties `AttributeProperties#isFormatting` property} is\r\n     * used to mark formatting attributes (like `bold` or `italic`).\r\n     *\r\n     * ```ts\r\n     * // Mark bold as a formatting attribute.\r\n     * schema.setAttributeProperties( 'bold', {\r\n     * \tisFormatting: true\r\n     * } );\r\n     *\r\n     * // Override code not to be considered a formatting markup.\r\n     * schema.setAttributeProperties( 'code', {\r\n     * \tisFormatting: false\r\n     * } );\r\n     * ```\r\n     *\r\n     * Properties are not limited to members defined in the\r\n     * {@link module:engine/model/schema~AttributeProperties `AttributeProperties` type} and you can also use custom properties:\r\n     *\r\n     * ```ts\r\n     * schema.setAttributeProperties( 'blockQuote', {\r\n     * \tcustomProperty: 'value'\r\n     * } );\r\n     * ```\r\n     *\r\n     * Subsequent calls with the same attribute will extend its custom properties:\r\n     *\r\n     * ```ts\r\n     * schema.setAttributeProperties( 'blockQuote', {\r\n     * \tone: 1\r\n     * } );\r\n     *\r\n     * schema.setAttributeProperties( 'blockQuote', {\r\n     * \ttwo: 2\r\n     * } );\r\n     *\r\n     * console.log( schema.getAttributeProperties( 'blockQuote' ) );\r\n     * // Logs: { one: 1, two: 2 }\r\n     * ```\r\n     *\r\n     * @param attributeName A name of the attribute to receive the properties.\r\n     * @param properties A dictionary of properties.\r\n     */\r\n    setAttributeProperties(attributeName, properties) {\r\n        this._attributeProperties[attributeName] = Object.assign(this.getAttributeProperties(attributeName), properties);\r\n    }\r\n    /**\r\n     * Returns properties associated with a given model attribute. See {@link #setAttributeProperties `setAttributeProperties()`}.\r\n     *\r\n     * @param attributeName A name of the attribute.\r\n     */\r\n    getAttributeProperties(attributeName) {\r\n        return this._attributeProperties[attributeName] || {};\r\n    }\r\n    /**\r\n     * Returns the lowest {@link module:engine/model/schema~Schema#isLimit limit element} containing the entire\r\n     * selection/range/position or the root otherwise.\r\n     *\r\n     * @param selectionOrRangeOrPosition The selection/range/position to check.\r\n     * @returns The lowest limit element containing the entire `selectionOrRangeOrPosition`.\r\n     */\r\n    getLimitElement(selectionOrRangeOrPosition) {\r\n        let element;\r\n        if (selectionOrRangeOrPosition instanceof Position) {\r\n            element = selectionOrRangeOrPosition.parent;\r\n        }\r\n        else {\r\n            const ranges = selectionOrRangeOrPosition instanceof Range ?\r\n                [selectionOrRangeOrPosition] :\r\n                Array.from(selectionOrRangeOrPosition.getRanges());\r\n            // Find the common ancestor for all selection's ranges.\r\n            element = ranges\r\n                .reduce((element, range) => {\r\n                const rangeCommonAncestor = range.getCommonAncestor();\r\n                if (!element) {\r\n                    return rangeCommonAncestor;\r\n                }\r\n                return element.getCommonAncestor(rangeCommonAncestor, { includeSelf: true });\r\n            }, null);\r\n        }\r\n        while (!this.isLimit(element)) {\r\n            if (element.parent) {\r\n                element = element.parent;\r\n            }\r\n            else {\r\n                break;\r\n            }\r\n        }\r\n        return element;\r\n    }\r\n    /**\r\n     * Checks whether the attribute is allowed in selection:\r\n     *\r\n     * * if the selection is not collapsed, then checks if the attribute is allowed on any of nodes in that range,\r\n     * * if the selection is collapsed, then checks if on the selection position there's a text with the\r\n     * specified attribute allowed.\r\n     *\r\n     * @param selection Selection which will be checked.\r\n     * @param attribute The name of the attribute to check.\r\n     */\r\n    checkAttributeInSelection(selection, attribute) {\r\n        if (selection.isCollapsed) {\r\n            const firstPosition = selection.getFirstPosition();\r\n            const context = [\r\n                ...firstPosition.getAncestors(),\r\n                new Text('', selection.getAttributes())\r\n            ];\r\n            // Check whether schema allows for a text with the attribute in the selection.\r\n            return this.checkAttribute(context, attribute);\r\n        }\r\n        else {\r\n            const ranges = selection.getRanges();\r\n            // For all ranges, check nodes in them until you find a node that is allowed to have the attribute.\r\n            for (const range of ranges) {\r\n                for (const value of range) {\r\n                    if (this.checkAttribute(value.item, attribute)) {\r\n                        // If we found a node that is allowed to have the attribute, return true.\r\n                        return true;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        // If we haven't found such node, return false.\r\n        return false;\r\n    }\r\n    /**\r\n     * Transforms the given set of ranges into a set of ranges where the given attribute is allowed (and can be applied).\r\n     *\r\n     * @param ranges Ranges to be validated.\r\n     * @param attribute The name of the attribute to check.\r\n     * @returns Ranges in which the attribute is allowed.\r\n     */\r\n    *getValidRanges(ranges, attribute) {\r\n        ranges = convertToMinimalFlatRanges(ranges);\r\n        for (const range of ranges) {\r\n            yield* this._getValidRangesForRange(range, attribute);\r\n        }\r\n    }\r\n    /**\r\n     * Basing on given `position`, finds and returns a {@link module:engine/model/range~Range range} which is\r\n     * nearest to that `position` and is a correct range for selection.\r\n     *\r\n     * The correct selection range might be collapsed when it is located in a position where the text node can be placed.\r\n     * Non-collapsed range is returned when selection can be placed around element marked as an \"object\" in\r\n     * the {@link module:engine/model/schema~Schema schema}.\r\n     *\r\n     * Direction of searching for the nearest correct selection range can be specified as:\r\n     *\r\n     * * `both` - searching will be performed in both ways,\r\n     * * `forward` - searching will be performed only forward,\r\n     * * `backward` - searching will be performed only backward.\r\n     *\r\n     * When valid selection range cannot be found, `null` is returned.\r\n     *\r\n     * @param position Reference position where new selection range should be looked for.\r\n     * @param direction Search direction.\r\n     * @returns Nearest selection range or `null` if one cannot be found.\r\n     */\r\n    getNearestSelectionRange(position, direction = 'both') {\r\n        // Return collapsed range if provided position is valid.\r\n        if (this.checkChild(position, '$text')) {\r\n            return new Range(position);\r\n        }\r\n        let backwardWalker, forwardWalker;\r\n        // Never leave a limit element.\r\n        const limitElement = position.getAncestors().reverse().find(item => this.isLimit(item)) ||\r\n            position.root;\r\n        if (direction == 'both' || direction == 'backward') {\r\n            backwardWalker = new TreeWalker({\r\n                boundaries: Range._createIn(limitElement),\r\n                startPosition: position,\r\n                direction: 'backward'\r\n            });\r\n        }\r\n        if (direction == 'both' || direction == 'forward') {\r\n            forwardWalker = new TreeWalker({\r\n                boundaries: Range._createIn(limitElement),\r\n                startPosition: position\r\n            });\r\n        }\r\n        for (const data of combineWalkers(backwardWalker, forwardWalker)) {\r\n            const type = (data.walker == backwardWalker ? 'elementEnd' : 'elementStart');\r\n            const value = data.value;\r\n            if (value.type == type && this.isObject(value.item)) {\r\n                return Range._createOn(value.item);\r\n            }\r\n            if (this.checkChild(value.nextPosition, '$text')) {\r\n                return new Range(value.nextPosition);\r\n            }\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Tries to find position ancestors that allow to insert a given node.\r\n     * It starts searching from the given position and goes node by node to the top of the model tree\r\n     * as long as a {@link module:engine/model/schema~Schema#isLimit limit element}, an\r\n     * {@link module:engine/model/schema~Schema#isObject object element} or a topmost ancestor is not reached.\r\n     *\r\n     * @param position The position that the search will start from.\r\n     * @param node The node for which an allowed parent should be found or its name.\r\n     * @returns Allowed parent or null if nothing was found.\r\n     */\r\n    findAllowedParent(position, node) {\r\n        let parent = position.parent;\r\n        while (parent) {\r\n            if (this.checkChild(parent, node)) {\r\n                return parent;\r\n            }\r\n            // Do not split limit elements.\r\n            if (this.isLimit(parent)) {\r\n                return null;\r\n            }\r\n            parent = parent.parent;\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Sets attributes allowed by the schema on a given node.\r\n     *\r\n     * @param node A node to set attributes on.\r\n     * @param attributes Attributes keys and values.\r\n     * @param writer An instance of the model writer.\r\n     */\r\n    setAllowedAttributes(node, attributes, writer) {\r\n        const model = writer.model;\r\n        for (const [attributeName, attributeValue] of Object.entries(attributes)) {\r\n            if (model.schema.checkAttribute(node, attributeName)) {\r\n                writer.setAttribute(attributeName, attributeValue, node);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Removes attributes disallowed by the schema.\r\n     *\r\n     * @param nodes Nodes that will be filtered.\r\n     */\r\n    removeDisallowedAttributes(nodes, writer) {\r\n        for (const node of nodes) {\r\n            // When node is a `Text` it has no children, so just filter it out.\r\n            if (node.is('$text')) {\r\n                removeDisallowedAttributeFromNode(this, node, writer);\r\n            }\r\n            // In a case of `Element` iterates through positions between nodes inside this element\r\n            // and filter out node before the current position, or position parent when position\r\n            // is at start of an element. Using positions prevent from omitting merged nodes\r\n            // see https://github.com/ckeditor/ckeditor5-engine/issues/1789.\r\n            else {\r\n                const rangeInNode = Range._createIn(node);\r\n                const positionsInRange = rangeInNode.getPositions();\r\n                for (const position of positionsInRange) {\r\n                    const item = position.nodeBefore || position.parent;\r\n                    removeDisallowedAttributeFromNode(this, item, writer);\r\n                }\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Gets attributes of a node that have a given property.\r\n     *\r\n     * @param node Node to get attributes from.\r\n     * @param propertyName Name of the property that attribute must have to return it.\r\n     * @param propertyValue Desired value of the property that we want to check.\r\n     * When `undefined` attributes will be returned if they have set a given property no matter what the value is. If specified it will\r\n     * return attributes which given property's value is equal to this parameter.\r\n     * @returns Object with attributes' names as key and attributes' values as value.\r\n     */\r\n    getAttributesWithProperty(node, propertyName, propertyValue) {\r\n        const attributes = {};\r\n        for (const [attributeName, attributeValue] of node.getAttributes()) {\r\n            const attributeProperties = this.getAttributeProperties(attributeName);\r\n            if (attributeProperties[propertyName] === undefined) {\r\n                continue;\r\n            }\r\n            if (propertyValue === undefined || propertyValue === attributeProperties[propertyName]) {\r\n                attributes[attributeName] = attributeValue;\r\n            }\r\n        }\r\n        return attributes;\r\n    }\r\n    /**\r\n     * Creates an instance of the schema context.\r\n     */\r\n    createContext(context) {\r\n        return new SchemaContext(context);\r\n    }\r\n    _clearCache() {\r\n        this._compiledDefinitions = null;\r\n    }\r\n    _compile() {\r\n        const compiledDefinitions = {};\r\n        const sourceRules = this._sourceDefinitions;\r\n        const itemNames = Object.keys(sourceRules);\r\n        for (const itemName of itemNames) {\r\n            compiledDefinitions[itemName] = compileBaseItemRule(sourceRules[itemName], itemName);\r\n        }\r\n        for (const itemName of itemNames) {\r\n            compileAllowChildren(compiledDefinitions, itemName);\r\n        }\r\n        for (const itemName of itemNames) {\r\n            compileAllowContentOf(compiledDefinitions, itemName);\r\n        }\r\n        for (const itemName of itemNames) {\r\n            compileAllowWhere(compiledDefinitions, itemName);\r\n        }\r\n        for (const itemName of itemNames) {\r\n            compileAllowAttributesOf(compiledDefinitions, itemName);\r\n            compileInheritPropertiesFrom(compiledDefinitions, itemName);\r\n        }\r\n        for (const itemName of itemNames) {\r\n            cleanUpAllowIn(compiledDefinitions, itemName);\r\n            setupAllowChildren(compiledDefinitions, itemName);\r\n            cleanUpAllowAttributes(compiledDefinitions, itemName);\r\n        }\r\n        this._compiledDefinitions = compiledDefinitions;\r\n    }\r\n    _checkContextMatch(def, context, contextItemIndex = context.length - 1) {\r\n        const contextItem = context.getItem(contextItemIndex);\r\n        if (def.allowIn.includes(contextItem.name)) {\r\n            if (contextItemIndex == 0) {\r\n                return true;\r\n            }\r\n            else {\r\n                const parentRule = this.getDefinition(contextItem);\r\n                return this._checkContextMatch(parentRule, context, contextItemIndex - 1);\r\n            }\r\n        }\r\n        else {\r\n            return false;\r\n        }\r\n    }\r\n    /**\r\n     * Takes a flat range and an attribute name. Traverses the range recursively and deeply to find and return all ranges\r\n     * inside the given range on which the attribute can be applied.\r\n     *\r\n     * This is a helper function for {@link ~Schema#getValidRanges}.\r\n     *\r\n     * @param range The range to process.\r\n     * @param attribute The name of the attribute to check.\r\n     * @returns Ranges in which the attribute is allowed.\r\n     */\r\n    *_getValidRangesForRange(range, attribute) {\r\n        let start = range.start;\r\n        let end = range.start;\r\n        for (const item of range.getItems({ shallow: true })) {\r\n            if (item.is('element')) {\r\n                yield* this._getValidRangesForRange(Range._createIn(item), attribute);\r\n            }\r\n            if (!this.checkAttribute(item, attribute)) {\r\n                if (!start.isEqual(end)) {\r\n                    yield new Range(start, end);\r\n                }\r\n                start = Position._createAfter(item);\r\n            }\r\n            end = Position._createAfter(item);\r\n        }\r\n        if (!start.isEqual(end)) {\r\n            yield new Range(start, end);\r\n        }\r\n    }\r\n}\r\n/**\r\n * A schema context &mdash; a list of ancestors of a given position in the document.\r\n *\r\n * Considering such position:\r\n *\r\n * ```xml\r\n * <$root>\r\n * \t<blockQuote>\r\n * \t\t<paragraph>\r\n * \t\t\t^\r\n * \t\t</paragraph>\r\n * \t</blockQuote>\r\n * </$root>\r\n * ```\r\n *\r\n * The context of this position is its {@link module:engine/model/position~Position#getAncestors lists of ancestors}:\r\n *\r\n *\t\t[ rootElement, blockQuoteElement, paragraphElement ]\r\n *\r\n * Contexts are used in the {@link module:engine/model/schema~Schema#event:checkChild `Schema#checkChild`} and\r\n * {@link module:engine/model/schema~Schema#event:checkAttribute `Schema#checkAttribute`} events as a definition\r\n * of a place in the document where the check occurs. The context instances are created based on the first arguments\r\n * of the {@link module:engine/model/schema~Schema#checkChild `Schema#checkChild()`} and\r\n * {@link module:engine/model/schema~Schema#checkAttribute `Schema#checkAttribute()`} methods so when\r\n * using these methods you need to use {@link module:engine/model/schema~SchemaContextDefinition}s.\r\n */\r\nexport class SchemaContext {\r\n    /**\r\n     * Creates an instance of the context.\r\n     */\r\n    constructor(context) {\r\n        if (context instanceof SchemaContext) {\r\n            return context;\r\n        }\r\n        let items;\r\n        if (typeof context == 'string') {\r\n            items = [context];\r\n        }\r\n        else if (!Array.isArray(context)) {\r\n            // `context` is item or position.\r\n            // Position#getAncestors() doesn't accept any parameters but it works just fine here.\r\n            items = context.getAncestors({ includeSelf: true });\r\n        }\r\n        else {\r\n            items = context;\r\n        }\r\n        this._items = items.map(mapContextItem);\r\n    }\r\n    /**\r\n     * The number of items.\r\n     */\r\n    get length() {\r\n        return this._items.length;\r\n    }\r\n    /**\r\n     * The last item (the lowest node).\r\n     */\r\n    get last() {\r\n        return this._items[this._items.length - 1];\r\n    }\r\n    /**\r\n     * Iterable interface.\r\n     *\r\n     * Iterates over all context items.\r\n     */\r\n    [Symbol.iterator]() {\r\n        return this._items[Symbol.iterator]();\r\n    }\r\n    /**\r\n     * Returns a new schema context instance with an additional item.\r\n     *\r\n     * Item can be added as:\r\n     *\r\n     * ```ts\r\n     * const context = new SchemaContext( [ '$root' ] );\r\n     *\r\n     * // An element.\r\n     * const fooElement = writer.createElement( 'fooElement' );\r\n     * const newContext = context.push( fooElement ); // [ '$root', 'fooElement' ]\r\n     *\r\n     * // A text node.\r\n     * const text = writer.createText( 'foobar' );\r\n     * const newContext = context.push( text ); // [ '$root', '$text' ]\r\n     *\r\n     * // A string (element name).\r\n     * const newContext = context.push( 'barElement' ); // [ '$root', 'barElement' ]\r\n     * ```\r\n     *\r\n     * **Note** {@link module:engine/model/node~Node} that is already in the model tree will be added as the only item\r\n     * (without ancestors).\r\n     *\r\n     * @param item An item that will be added to the current context.\r\n     * @returns A new schema context instance with an additional item.\r\n     */\r\n    push(item) {\r\n        const ctx = new SchemaContext([item]);\r\n        ctx._items = [...this._items, ...ctx._items];\r\n        return ctx;\r\n    }\r\n    /**\r\n     * Gets an item on the given index.\r\n     */\r\n    getItem(index) {\r\n        return this._items[index];\r\n    }\r\n    /**\r\n     * Returns the names of items.\r\n     */\r\n    *getNames() {\r\n        yield* this._items.map(item => item.name);\r\n    }\r\n    /**\r\n     * Checks whether the context ends with the given nodes.\r\n     *\r\n     * ```ts\r\n     * const ctx = new SchemaContext( [ rootElement, paragraphElement, textNode ] );\r\n     *\r\n     * ctx.endsWith( '$text' ); // -> true\r\n     * ctx.endsWith( 'paragraph $text' ); // -> true\r\n     * ctx.endsWith( '$root' ); // -> false\r\n     * ctx.endsWith( 'paragraph' ); // -> false\r\n     * ```\r\n     */\r\n    endsWith(query) {\r\n        return Array.from(this.getNames()).join(' ').endsWith(query);\r\n    }\r\n    /**\r\n     * Checks whether the context starts with the given nodes.\r\n     *\r\n     * ```ts\r\n     * const ctx = new SchemaContext( [ rootElement, paragraphElement, textNode ] );\r\n     *\r\n     * ctx.endsWith( '$root' ); // -> true\r\n     * ctx.endsWith( '$root paragraph' ); // -> true\r\n     * ctx.endsWith( '$text' ); // -> false\r\n     * ctx.endsWith( 'paragraph' ); // -> false\r\n     * ```\r\n     */\r\n    startsWith(query) {\r\n        return Array.from(this.getNames()).join(' ').startsWith(query);\r\n    }\r\n}\r\nfunction compileBaseItemRule(sourceItemRules, itemName) {\r\n    const itemRule = {\r\n        name: itemName,\r\n        allowIn: [],\r\n        allowContentOf: [],\r\n        allowWhere: [],\r\n        allowAttributes: [],\r\n        allowAttributesOf: [],\r\n        allowChildren: [],\r\n        inheritTypesFrom: []\r\n    };\r\n    copyTypes(sourceItemRules, itemRule);\r\n    copyProperty(sourceItemRules, itemRule, 'allowIn');\r\n    copyProperty(sourceItemRules, itemRule, 'allowContentOf');\r\n    copyProperty(sourceItemRules, itemRule, 'allowWhere');\r\n    copyProperty(sourceItemRules, itemRule, 'allowAttributes');\r\n    copyProperty(sourceItemRules, itemRule, 'allowAttributesOf');\r\n    copyProperty(sourceItemRules, itemRule, 'allowChildren');\r\n    copyProperty(sourceItemRules, itemRule, 'inheritTypesFrom');\r\n    makeInheritAllWork(sourceItemRules, itemRule);\r\n    return itemRule;\r\n}\r\nfunction compileAllowChildren(compiledDefinitions, itemName) {\r\n    const item = compiledDefinitions[itemName];\r\n    for (const allowChildrenItem of item.allowChildren) {\r\n        const allowedChildren = compiledDefinitions[allowChildrenItem];\r\n        // The allowChildren property may point to an unregistered element.\r\n        if (!allowedChildren) {\r\n            continue;\r\n        }\r\n        allowedChildren.allowIn.push(itemName);\r\n    }\r\n    // The allowIn property already includes correct items, reset the allowChildren property\r\n    // to avoid duplicates later when setting up compilation results.\r\n    item.allowChildren.length = 0;\r\n}\r\nfunction compileAllowContentOf(compiledDefinitions, itemName) {\r\n    for (const allowContentOfItemName of compiledDefinitions[itemName].allowContentOf) {\r\n        // The allowContentOf property may point to an unregistered element.\r\n        if (compiledDefinitions[allowContentOfItemName]) {\r\n            const allowedChildren = getAllowedChildren(compiledDefinitions, allowContentOfItemName);\r\n            allowedChildren.forEach(allowedItem => {\r\n                allowedItem.allowIn.push(itemName);\r\n            });\r\n        }\r\n    }\r\n    delete compiledDefinitions[itemName].allowContentOf;\r\n}\r\nfunction compileAllowWhere(compiledDefinitions, itemName) {\r\n    for (const allowWhereItemName of compiledDefinitions[itemName].allowWhere) {\r\n        const inheritFrom = compiledDefinitions[allowWhereItemName];\r\n        // The allowWhere property may point to an unregistered element.\r\n        if (inheritFrom) {\r\n            const allowedIn = inheritFrom.allowIn;\r\n            compiledDefinitions[itemName].allowIn.push(...allowedIn);\r\n        }\r\n    }\r\n    delete compiledDefinitions[itemName].allowWhere;\r\n}\r\nfunction compileAllowAttributesOf(compiledDefinitions, itemName) {\r\n    for (const allowAttributeOfItem of compiledDefinitions[itemName].allowAttributesOf) {\r\n        const inheritFrom = compiledDefinitions[allowAttributeOfItem];\r\n        if (inheritFrom) {\r\n            const inheritAttributes = inheritFrom.allowAttributes;\r\n            compiledDefinitions[itemName].allowAttributes.push(...inheritAttributes);\r\n        }\r\n    }\r\n    delete compiledDefinitions[itemName].allowAttributesOf;\r\n}\r\nfunction compileInheritPropertiesFrom(compiledDefinitions, itemName) {\r\n    const item = compiledDefinitions[itemName];\r\n    for (const inheritPropertiesOfItem of item.inheritTypesFrom) {\r\n        const inheritFrom = compiledDefinitions[inheritPropertiesOfItem];\r\n        if (inheritFrom) {\r\n            const typeNames = Object.keys(inheritFrom).filter(name => name.startsWith('is'));\r\n            for (const name of typeNames) {\r\n                if (!(name in item)) {\r\n                    item[name] = inheritFrom[name];\r\n                }\r\n            }\r\n        }\r\n    }\r\n    delete item.inheritTypesFrom;\r\n}\r\n// Remove items which weren't registered (because it may break some checks or we'd need to complicate them).\r\n// Make sure allowIn doesn't contain repeated values.\r\nfunction cleanUpAllowIn(compiledDefinitions, itemName) {\r\n    const itemRule = compiledDefinitions[itemName];\r\n    const existingItems = itemRule.allowIn.filter(itemToCheck => compiledDefinitions[itemToCheck]);\r\n    itemRule.allowIn = Array.from(new Set(existingItems));\r\n}\r\n// Setup allowChildren items based on allowIn.\r\nfunction setupAllowChildren(compiledDefinitions, itemName) {\r\n    const itemRule = compiledDefinitions[itemName];\r\n    for (const allowedParentItemName of itemRule.allowIn) {\r\n        const allowedParentItem = compiledDefinitions[allowedParentItemName];\r\n        allowedParentItem.allowChildren.push(itemName);\r\n    }\r\n}\r\nfunction cleanUpAllowAttributes(compiledDefinitions, itemName) {\r\n    const itemRule = compiledDefinitions[itemName];\r\n    itemRule.allowAttributes = Array.from(new Set(itemRule.allowAttributes));\r\n}\r\nfunction copyTypes(sourceItemRules, itemRule) {\r\n    for (const sourceItemRule of sourceItemRules) {\r\n        const typeNames = Object.keys(sourceItemRule).filter(name => name.startsWith('is'));\r\n        for (const name of typeNames) {\r\n            itemRule[name] = !!sourceItemRule[name];\r\n        }\r\n    }\r\n}\r\nfunction copyProperty(sourceItemRules, itemRule, propertyName) {\r\n    for (const sourceItemRule of sourceItemRules) {\r\n        const value = sourceItemRule[propertyName];\r\n        if (typeof value == 'string') {\r\n            itemRule[propertyName].push(value);\r\n        }\r\n        else if (Array.isArray(value)) {\r\n            itemRule[propertyName].push(...value);\r\n        }\r\n    }\r\n}\r\nfunction makeInheritAllWork(sourceItemRules, itemRule) {\r\n    for (const sourceItemRule of sourceItemRules) {\r\n        const inheritFrom = sourceItemRule.inheritAllFrom;\r\n        if (inheritFrom) {\r\n            itemRule.allowContentOf.push(inheritFrom);\r\n            itemRule.allowWhere.push(inheritFrom);\r\n            itemRule.allowAttributesOf.push(inheritFrom);\r\n            itemRule.inheritTypesFrom.push(inheritFrom);\r\n        }\r\n    }\r\n}\r\nfunction getAllowedChildren(compiledDefinitions, itemName) {\r\n    const itemRule = compiledDefinitions[itemName];\r\n    return getValues(compiledDefinitions).filter(def => def.allowIn.includes(itemRule.name));\r\n}\r\nfunction getValues(obj) {\r\n    return Object.keys(obj).map(key => obj[key]);\r\n}\r\nfunction mapContextItem(ctxItem) {\r\n    if (typeof ctxItem == 'string' || ctxItem.is('documentFragment')) {\r\n        return {\r\n            name: typeof ctxItem == 'string' ? ctxItem : '$documentFragment',\r\n            *getAttributeKeys() { },\r\n            getAttribute() { }\r\n        };\r\n    }\r\n    else {\r\n        return {\r\n            // '$text' means text nodes and text proxies.\r\n            name: ctxItem.is('element') ? ctxItem.name : '$text',\r\n            *getAttributeKeys() {\r\n                yield* ctxItem.getAttributeKeys();\r\n            },\r\n            getAttribute(key) {\r\n                return ctxItem.getAttribute(key);\r\n            }\r\n        };\r\n    }\r\n}\r\n/**\r\n * Generator function returning values from provided walkers, switching between them at each iteration. If only one walker\r\n * is provided it will return data only from that walker.\r\n *\r\n * @param backward Walker iterating in backward direction.\r\n * @param forward Walker iterating in forward direction.\r\n * @returns Object returned at each iteration contains `value` and `walker` (informing which walker returned\r\n * given value) fields.\r\n */\r\nfunction* combineWalkers(backward, forward) {\r\n    let done = false;\r\n    while (!done) {\r\n        done = true;\r\n        if (backward) {\r\n            const step = backward.next();\r\n            if (!step.done) {\r\n                done = false;\r\n                yield {\r\n                    walker: backward,\r\n                    value: step.value\r\n                };\r\n            }\r\n        }\r\n        if (forward) {\r\n            const step = forward.next();\r\n            if (!step.done) {\r\n                done = false;\r\n                yield {\r\n                    walker: forward,\r\n                    value: step.value\r\n                };\r\n            }\r\n        }\r\n    }\r\n}\r\n/**\r\n * Takes an array of non-intersecting ranges. For each of them gets minimal flat ranges covering that range and returns\r\n * all those minimal flat ranges.\r\n *\r\n * @param ranges Ranges to process.\r\n * @returns Minimal flat ranges of given `ranges`.\r\n */\r\nfunction* convertToMinimalFlatRanges(ranges) {\r\n    for (const range of ranges) {\r\n        yield* range.getMinimalFlatRanges();\r\n    }\r\n}\r\nfunction removeDisallowedAttributeFromNode(schema, node, writer) {\r\n    for (const attribute of node.getAttributeKeys()) {\r\n        if (!schema.checkAttribute(node, attribute)) {\r\n            writer.removeAttribute(attribute, node);\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/conversion/upcastdispatcher\r\n */\r\nimport ViewConsumable from './viewconsumable';\r\nimport ModelRange from '../model/range';\r\nimport ModelPosition from '../model/position';\r\nimport { SchemaContext } from '../model/schema'; // eslint-disable-line no-duplicate-imports\r\nimport { isParagraphable, wrapInParagraph } from '../model/utils/autoparagraphing';\r\nimport { CKEditorError, EmitterMixin } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Upcast dispatcher is a central point of the view-to-model conversion, which is a process of\r\n * converting a given {@link module:engine/view/documentfragment~DocumentFragment view document fragment} or\r\n * {@link module:engine/view/element~Element view element} into a correct model structure.\r\n *\r\n * During the conversion process, the dispatcher fires events for all {@link module:engine/view/node~Node view nodes}\r\n * from the converted view document fragment.\r\n * Special callbacks called \"converters\" should listen to these events in order to convert the view nodes.\r\n *\r\n * The second parameter of the callback is the `data` object with the following properties:\r\n *\r\n * * `data.viewItem` contains a {@link module:engine/view/node~Node view node} or a\r\n * {@link module:engine/view/documentfragment~DocumentFragment view document fragment}\r\n * that is converted at the moment and might be handled by the callback.\r\n * * `data.modelRange` is used to point to the result\r\n * of the current conversion (e.g. the element that is being inserted)\r\n * and is always a {@link module:engine/model/range~Range} when the conversion succeeds.\r\n * * `data.modelCursor` is a {@link module:engine/model/position~Position position} on which the converter should insert\r\n * the newly created items.\r\n *\r\n * The third parameter of the callback is an instance of {@link module:engine/conversion/upcastdispatcher~UpcastConversionApi}\r\n * which provides additional tools for converters.\r\n *\r\n * You can read more about conversion in the {@glink framework/deep-dive/conversion/upcast Upcast conversion} guide.\r\n *\r\n * Examples of event-based converters:\r\n *\r\n * ```ts\r\n * // A converter for links (<a>).\r\n * editor.data.upcastDispatcher.on( 'element:a', ( evt, data, conversionApi ) => {\r\n * \tif ( conversionApi.consumable.consume( data.viewItem, { name: true, attributes: [ 'href' ] } ) ) {\r\n * \t\t// The <a> element is inline and is represented by an attribute in the model.\r\n * \t\t// This is why you need to convert only children.\r\n * \t\tconst { modelRange } = conversionApi.convertChildren( data.viewItem, data.modelCursor );\r\n *\r\n * \t\tfor ( let item of modelRange.getItems() ) {\r\n * \t\t\tif ( conversionApi.schema.checkAttribute( item, 'linkHref' ) ) {\r\n * \t\t\t\tconversionApi.writer.setAttribute( 'linkHref', data.viewItem.getAttribute( 'href' ), item );\r\n * \t\t\t}\r\n * \t\t}\r\n * \t}\r\n * } );\r\n *\r\n * // Convert <p> element's font-size style.\r\n * // Note: You should use a low-priority observer in order to ensure that\r\n * // it is executed after the element-to-element converter.\r\n * editor.data.upcastDispatcher.on( 'element:p', ( evt, data, conversionApi ) => {\r\n * \tconst { consumable, schema, writer } = conversionApi;\r\n *\r\n * \tif ( !consumable.consume( data.viewItem, { style: 'font-size' } ) ) {\r\n * \t\treturn;\r\n * \t}\r\n *\r\n * \tconst fontSize = data.viewItem.getStyle( 'font-size' );\r\n *\r\n * \t// Do not go for the model element after data.modelCursor because it might happen\r\n * \t// that a single view element was converted to multiple model elements. Get all of them.\r\n * \tfor ( const item of data.modelRange.getItems( { shallow: true } ) ) {\r\n * \t\tif ( schema.checkAttribute( item, 'fontSize' ) ) {\r\n * \t\t\twriter.setAttribute( 'fontSize', fontSize, item );\r\n * \t\t}\r\n * \t}\r\n * }, { priority: 'low' } );\r\n *\r\n * // Convert all elements which have no custom converter into a paragraph (autoparagraphing).\r\n * editor.data.upcastDispatcher.on( 'element', ( evt, data, conversionApi ) => {\r\n * \t// Check if an element can be converted.\r\n * \tif ( !conversionApi.consumable.test( data.viewItem, { name: data.viewItem.name } ) ) {\r\n * \t\t// When an element is already consumed by higher priority converters, do nothing.\r\n * \t\treturn;\r\n * \t}\r\n *\r\n * \tconst paragraph = conversionApi.writer.createElement( 'paragraph' );\r\n *\r\n * \t// Try to safely insert a paragraph at the model cursor - it will find an allowed parent for the current element.\r\n * \tif ( !conversionApi.safeInsert( paragraph, data.modelCursor ) ) {\r\n * \t\t// When an element was not inserted, it means that you cannot insert a paragraph at this position.\r\n * \t\treturn;\r\n * \t}\r\n *\r\n * \t// Consume the inserted element.\r\n * \tconversionApi.consumable.consume( data.viewItem, { name: data.viewItem.name } ) );\r\n *\r\n * \t// Convert the children to a paragraph.\r\n * \tconst { modelRange } = conversionApi.convertChildren( data.viewItem,  paragraph ) );\r\n *\r\n * \t// Update `modelRange` and `modelCursor` in the `data` as a conversion result.\r\n * \tconversionApi.updateConversionResult( paragraph, data );\r\n * }, { priority: 'low' } );\r\n * ```\r\n *\r\n * @fires viewCleanup\r\n * @fires element\r\n * @fires text\r\n * @fires documentFragment\r\n */\r\nexport default class UpcastDispatcher extends EmitterMixin() {\r\n    /**\r\n     * Creates an upcast dispatcher that operates using the passed API.\r\n     *\r\n     * @see module:engine/conversion/upcastdispatcher~UpcastConversionApi\r\n     * @param conversionApi Additional properties for an interface that will be passed to events fired\r\n     * by the upcast dispatcher.\r\n     */\r\n    constructor(conversionApi) {\r\n        super();\r\n        /**\r\n         * The list of elements that were created during splitting.\r\n         *\r\n         * After the conversion process, the list is cleared.\r\n         */\r\n        this._splitParts = new Map();\r\n        /**\r\n         * The list of cursor parent elements that were created during splitting.\r\n         *\r\n         * After the conversion process the list is cleared.\r\n         */\r\n        this._cursorParents = new Map();\r\n        /**\r\n         * The position in the temporary structure where the converted content is inserted. The structure reflects the context of\r\n         * the target position where the content will be inserted. This property is built based on the context parameter of the\r\n         * convert method.\r\n         */\r\n        this._modelCursor = null;\r\n        /**\r\n         * The list of elements that were created during the splitting but should not get removed on conversion end even if they are empty.\r\n         *\r\n         * The list is cleared after the conversion process.\r\n         */\r\n        this._emptyElementsToKeep = new Set();\r\n        this.conversionApi = {\r\n            ...conversionApi,\r\n            consumable: null,\r\n            writer: null,\r\n            store: null,\r\n            convertItem: (viewItem, modelCursor) => this._convertItem(viewItem, modelCursor),\r\n            convertChildren: (viewElement, positionOrElement) => this._convertChildren(viewElement, positionOrElement),\r\n            safeInsert: (modelNode, position) => this._safeInsert(modelNode, position),\r\n            updateConversionResult: (modelElement, data) => this._updateConversionResult(modelElement, data),\r\n            // Advanced API - use only if custom position handling is needed.\r\n            splitToAllowedParent: (modelNode, modelCursor) => this._splitToAllowedParent(modelNode, modelCursor),\r\n            getSplitParts: modelElement => this._getSplitParts(modelElement),\r\n            keepEmptyElement: modelElement => this._keepEmptyElement(modelElement)\r\n        };\r\n    }\r\n    /**\r\n     * Starts the conversion process. The entry point for the conversion.\r\n     *\r\n     * @fires element\r\n     * @fires text\r\n     * @fires documentFragment\r\n     * @param viewElement The part of the view to be converted.\r\n     * @param writer An instance of the model writer.\r\n     * @param context Elements will be converted according to this context.\r\n     * @returns Model data that is the result of the conversion process\r\n     * wrapped in `DocumentFragment`. Converted marker elements will be set as the document fragment's\r\n     * {@link module:engine/model/documentfragment~DocumentFragment#markers static markers map}.\r\n     */\r\n    convert(viewElement, writer, context = ['$root']) {\r\n        this.fire('viewCleanup', viewElement);\r\n        // Create context tree and set position in the top element.\r\n        // Items will be converted according to this position.\r\n        this._modelCursor = createContextTree(context, writer);\r\n        // Store writer in conversion as a conversion API\r\n        // to be sure that conversion process will use the same batch.\r\n        this.conversionApi.writer = writer;\r\n        // Create consumable values list for conversion process.\r\n        this.conversionApi.consumable = ViewConsumable.createFrom(viewElement);\r\n        // Custom data stored by converter for conversion process.\r\n        this.conversionApi.store = {};\r\n        // Do the conversion.\r\n        const { modelRange } = this._convertItem(viewElement, this._modelCursor);\r\n        // Conversion result is always a document fragment so let's create it.\r\n        const documentFragment = writer.createDocumentFragment();\r\n        // When there is a conversion result.\r\n        if (modelRange) {\r\n            // Remove all empty elements that were create while splitting.\r\n            this._removeEmptyElements();\r\n            // Move all items that were converted in context tree to the document fragment.\r\n            for (const item of Array.from(this._modelCursor.parent.getChildren())) {\r\n                writer.append(item, documentFragment);\r\n            }\r\n            // Extract temporary markers elements from model and set as static markers collection.\r\n            documentFragment.markers = extractMarkersFromModelFragment(documentFragment, writer);\r\n        }\r\n        // Clear context position.\r\n        this._modelCursor = null;\r\n        // Clear split elements & parents lists.\r\n        this._splitParts.clear();\r\n        this._cursorParents.clear();\r\n        this._emptyElementsToKeep.clear();\r\n        // Clear conversion API.\r\n        this.conversionApi.writer = null;\r\n        this.conversionApi.store = null;\r\n        // Return fragment as conversion result.\r\n        return documentFragment;\r\n    }\r\n    /**\r\n     * @see module:engine/conversion/upcastdispatcher~UpcastConversionApi#convertItem\r\n     */\r\n    _convertItem(viewItem, modelCursor) {\r\n        const data = { viewItem, modelCursor, modelRange: null };\r\n        if (viewItem.is('element')) {\r\n            this.fire(`element:${viewItem.name}`, data, this.conversionApi);\r\n        }\r\n        else if (viewItem.is('$text')) {\r\n            this.fire('text', data, this.conversionApi);\r\n        }\r\n        else {\r\n            this.fire('documentFragment', data, this.conversionApi);\r\n        }\r\n        // Handle incorrect conversion result.\r\n        if (data.modelRange && !(data.modelRange instanceof ModelRange)) {\r\n            /**\r\n             * Incorrect conversion result was dropped.\r\n             *\r\n             * {@link module:engine/model/range~Range Model range} should be a conversion result.\r\n             *\r\n             * @error view-conversion-dispatcher-incorrect-result\r\n             */\r\n            throw new CKEditorError('view-conversion-dispatcher-incorrect-result', this);\r\n        }\r\n        return { modelRange: data.modelRange, modelCursor: data.modelCursor };\r\n    }\r\n    /**\r\n     * @see module:engine/conversion/upcastdispatcher~UpcastConversionApi#convertChildren\r\n     */\r\n    _convertChildren(viewItem, elementOrModelCursor) {\r\n        let nextModelCursor = elementOrModelCursor.is('position') ?\r\n            elementOrModelCursor : ModelPosition._createAt(elementOrModelCursor, 0);\r\n        const modelRange = new ModelRange(nextModelCursor);\r\n        for (const viewChild of Array.from(viewItem.getChildren())) {\r\n            const result = this._convertItem(viewChild, nextModelCursor);\r\n            if (result.modelRange instanceof ModelRange) {\r\n                modelRange.end = result.modelRange.end;\r\n                nextModelCursor = result.modelCursor;\r\n            }\r\n        }\r\n        return { modelRange, modelCursor: nextModelCursor };\r\n    }\r\n    /**\r\n     * @see module:engine/conversion/upcastdispatcher~UpcastConversionApi#safeInsert\r\n     */\r\n    _safeInsert(modelNode, position) {\r\n        // Find allowed parent for element that we are going to insert.\r\n        // If current parent does not allow to insert element but one of the ancestors does\r\n        // then split nodes to allowed parent.\r\n        const splitResult = this._splitToAllowedParent(modelNode, position);\r\n        // When there is no split result it means that we can't insert element to model tree, so let's skip it.\r\n        if (!splitResult) {\r\n            return false;\r\n        }\r\n        // Insert element on allowed position.\r\n        this.conversionApi.writer.insert(modelNode, splitResult.position);\r\n        return true;\r\n    }\r\n    /**\r\n     * @see module:engine/conversion/upcastdispatcher~UpcastConversionApi#updateConversionResult\r\n     */\r\n    _updateConversionResult(modelElement, data) {\r\n        const parts = this._getSplitParts(modelElement);\r\n        const writer = this.conversionApi.writer;\r\n        // Set conversion result range - only if not set already.\r\n        if (!data.modelRange) {\r\n            data.modelRange = writer.createRange(writer.createPositionBefore(modelElement), writer.createPositionAfter(parts[parts.length - 1]));\r\n        }\r\n        const savedCursorParent = this._cursorParents.get(modelElement);\r\n        // Now we need to check where the `modelCursor` should be.\r\n        if (savedCursorParent) {\r\n            // If we split parent to insert our element then we want to continue conversion in the new part of the split parent.\r\n            //\r\n            // before: <allowed><notAllowed>foo[]</notAllowed></allowed>\r\n            // after:  <allowed><notAllowed>foo</notAllowed> <converted></converted> <notAllowed>[]</notAllowed></allowed>\r\n            data.modelCursor = writer.createPositionAt(savedCursorParent, 0);\r\n        }\r\n        else {\r\n            // Otherwise just continue after inserted element.\r\n            data.modelCursor = data.modelRange.end;\r\n        }\r\n    }\r\n    /**\r\n     * @see module:engine/conversion/upcastdispatcher~UpcastConversionApi#splitToAllowedParent\r\n     */\r\n    _splitToAllowedParent(node, modelCursor) {\r\n        const { schema, writer } = this.conversionApi;\r\n        // Try to find allowed parent.\r\n        let allowedParent = schema.findAllowedParent(modelCursor, node);\r\n        if (allowedParent) {\r\n            // When current position parent allows to insert node then return this position.\r\n            if (allowedParent === modelCursor.parent) {\r\n                return { position: modelCursor };\r\n            }\r\n            // When allowed parent is in context tree (it's outside the converted tree).\r\n            if (this._modelCursor.parent.getAncestors().includes(allowedParent)) {\r\n                allowedParent = null;\r\n            }\r\n        }\r\n        if (!allowedParent) {\r\n            // Check if the node wrapped with a paragraph would be accepted by the schema.\r\n            if (!isParagraphable(modelCursor, node, schema)) {\r\n                return null;\r\n            }\r\n            return {\r\n                position: wrapInParagraph(modelCursor, writer)\r\n            };\r\n        }\r\n        // Split element to allowed parent.\r\n        const splitResult = this.conversionApi.writer.split(modelCursor, allowedParent);\r\n        // Using the range returned by `model.Writer#split`, we will pair original elements with their split parts.\r\n        //\r\n        // The range returned from the writer spans \"over the split\" or, precisely saying, from the end of the original element (the one\r\n        // that got split) to the beginning of the other part of that element:\r\n        //\r\n        // <limit><a><b><c>X[]Y</c></b><a></limit> ->\r\n        // <limit><a><b><c>X[</c></b></a><a><b><c>]Y</c></b></a>\r\n        //\r\n        // After the split there cannot be any full node between the positions in `splitRange`. The positions are touching.\r\n        // Also, because of how splitting works, it is easy to notice, that \"closing tags\" are in the reverse order than \"opening tags\".\r\n        // Also, since we split all those elements, each of them has to have the other part.\r\n        //\r\n        // With those observations in mind, we will pair the original elements with their split parts by saving \"closing tags\" and matching\r\n        // them with \"opening tags\" in the reverse order. For that we can use a stack.\r\n        const stack = [];\r\n        for (const treeWalkerValue of splitResult.range.getWalker()) {\r\n            if (treeWalkerValue.type == 'elementEnd') {\r\n                stack.push(treeWalkerValue.item);\r\n            }\r\n            else {\r\n                // There should not be any text nodes after the element is split, so the only other value is `elementStart`.\r\n                const originalPart = stack.pop();\r\n                const splitPart = treeWalkerValue.item;\r\n                this._registerSplitPair(originalPart, splitPart);\r\n            }\r\n        }\r\n        const cursorParent = splitResult.range.end.parent;\r\n        this._cursorParents.set(node, cursorParent);\r\n        return {\r\n            position: splitResult.position,\r\n            cursorParent\r\n        };\r\n    }\r\n    /**\r\n     * Registers that a `splitPart` element is a split part of the `originalPart` element.\r\n     *\r\n     * The data set by this method is used by {@link #_getSplitParts} and {@link #_removeEmptyElements}.\r\n     */\r\n    _registerSplitPair(originalPart, splitPart) {\r\n        if (!this._splitParts.has(originalPart)) {\r\n            this._splitParts.set(originalPart, [originalPart]);\r\n        }\r\n        const list = this._splitParts.get(originalPart);\r\n        this._splitParts.set(splitPart, list);\r\n        list.push(splitPart);\r\n    }\r\n    /**\r\n     * @see module:engine/conversion/upcastdispatcher~UpcastConversionApi#getSplitParts\r\n     */\r\n    _getSplitParts(element) {\r\n        let parts;\r\n        if (!this._splitParts.has(element)) {\r\n            parts = [element];\r\n        }\r\n        else {\r\n            parts = this._splitParts.get(element);\r\n        }\r\n        return parts;\r\n    }\r\n    /**\r\n     * Mark an element that were created during the splitting to not get removed on conversion end even if it is empty.\r\n     */\r\n    _keepEmptyElement(element) {\r\n        this._emptyElementsToKeep.add(element);\r\n    }\r\n    /**\r\n     * Checks if there are any empty elements created while splitting and removes them.\r\n     *\r\n     * This method works recursively to re-check empty elements again after at least one element was removed in the initial call,\r\n     * as some elements might have become empty after other empty elements were removed from them.\r\n     */\r\n    _removeEmptyElements() {\r\n        let anyRemoved = false;\r\n        for (const element of this._splitParts.keys()) {\r\n            if (element.isEmpty && !this._emptyElementsToKeep.has(element)) {\r\n                this.conversionApi.writer.remove(element);\r\n                this._splitParts.delete(element);\r\n                anyRemoved = true;\r\n            }\r\n        }\r\n        if (anyRemoved) {\r\n            this._removeEmptyElements();\r\n        }\r\n    }\r\n}\r\n/**\r\n * Traverses given model item and searches elements which marks marker range. Found element is removed from\r\n * DocumentFragment but path of this element is stored in a Map which is then returned.\r\n *\r\n * @param modelItem Fragment of model.\r\n * @returns List of static markers.\r\n */\r\nfunction extractMarkersFromModelFragment(modelItem, writer) {\r\n    const markerElements = new Set();\r\n    const markers = new Map();\r\n    // Create ModelTreeWalker.\r\n    const range = ModelRange._createIn(modelItem).getItems();\r\n    // Walk through DocumentFragment and collect marker elements.\r\n    for (const item of range) {\r\n        // Check if current element is a marker.\r\n        if (item.is('element', '$marker')) {\r\n            markerElements.add(item);\r\n        }\r\n    }\r\n    // Walk through collected marker elements store its path and remove its from the DocumentFragment.\r\n    for (const markerElement of markerElements) {\r\n        const markerName = markerElement.getAttribute('data-name');\r\n        const currentPosition = writer.createPositionBefore(markerElement);\r\n        // When marker of given name is not stored it means that we have found the beginning of the range.\r\n        if (!markers.has(markerName)) {\r\n            markers.set(markerName, new ModelRange(currentPosition.clone()));\r\n            // Otherwise is means that we have found end of the marker range.\r\n        }\r\n        else {\r\n            markers.get(markerName).end = currentPosition.clone();\r\n        }\r\n        // Remove marker element from DocumentFragment.\r\n        writer.remove(markerElement);\r\n    }\r\n    return markers;\r\n}\r\n/**\r\n * Creates model fragment according to given context and returns position in the bottom (the deepest) element.\r\n */\r\nfunction createContextTree(contextDefinition, writer) {\r\n    let position;\r\n    for (const item of new SchemaContext(contextDefinition)) {\r\n        const attributes = {};\r\n        for (const key of item.getAttributeKeys()) {\r\n            attributes[key] = item.getAttribute(key);\r\n        }\r\n        const current = writer.createElement(item.name, attributes);\r\n        if (position) {\r\n            writer.insert(current, position);\r\n        }\r\n        position = ModelPosition._createAt(current, 0);\r\n    }\r\n    return position;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * Basic HTML writer. It uses the native `innerHTML` property for basic conversion\r\n * from a document fragment to an HTML string.\r\n */\r\nexport default class BasicHtmlWriter {\r\n    /**\r\n     * Returns an HTML string created from the document fragment.\r\n     */\r\n    getHtml(fragment) {\r\n        const doc = document.implementation.createHTMLDocument('');\r\n        const container = doc.createElement('div');\r\n        container.appendChild(fragment);\r\n        return container.innerHTML;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/dataprocessor/htmldataprocessor\r\n */\r\n/* globals DOMParser */\r\nimport BasicHtmlWriter from './basichtmlwriter';\r\nimport DomConverter from '../view/domconverter';\r\n/**\r\n * The HTML data processor class.\r\n * This data processor implementation uses HTML as input and output data.\r\n */\r\nexport default class HtmlDataProcessor {\r\n    /**\r\n     * Creates a new instance of the HTML data processor class.\r\n     *\r\n     * @param document The view document instance.\r\n     */\r\n    constructor(document) {\r\n        this.skipComments = true;\r\n        this.domParser = new DOMParser();\r\n        this.domConverter = new DomConverter(document, { renderingMode: 'data' });\r\n        this.htmlWriter = new BasicHtmlWriter();\r\n    }\r\n    /**\r\n     * Converts a provided {@link module:engine/view/documentfragment~DocumentFragment document fragment}\r\n     * to data format &mdash; in this case to an HTML string.\r\n     *\r\n     * @returns HTML string.\r\n     */\r\n    toData(viewFragment) {\r\n        // Convert view DocumentFragment to DOM DocumentFragment.\r\n        const domFragment = this.domConverter.viewToDom(viewFragment);\r\n        // Convert DOM DocumentFragment to HTML output.\r\n        return this.htmlWriter.getHtml(domFragment);\r\n    }\r\n    /**\r\n     * Converts the provided HTML string to a view tree.\r\n     *\r\n     * @param data An HTML string.\r\n     * @returns A converted view element.\r\n     */\r\n    toView(data) {\r\n        // Convert input HTML data to DOM DocumentFragment.\r\n        const domFragment = this._toDom(data);\r\n        // Convert DOM DocumentFragment to view DocumentFragment.\r\n        return this.domConverter.domToView(domFragment, { skipComments: this.skipComments });\r\n    }\r\n    /**\r\n     * Registers a {@link module:engine/view/matcher~MatcherPattern} for view elements whose content should be treated as raw data\r\n     * and not processed during the conversion from the DOM to the view elements.\r\n     *\r\n     * The raw data can be later accessed by a\r\n     * {@link module:engine/view/element~Element#getCustomProperty custom property of a view element} called `\"$rawContent\"`.\r\n     *\r\n     * @param pattern Pattern matching all view elements whose content should be treated as raw data.\r\n     */\r\n    registerRawContentMatcher(pattern) {\r\n        this.domConverter.registerRawContentMatcher(pattern);\r\n    }\r\n    /**\r\n     * If the processor is set to use marked fillers, it will insert `&nbsp;` fillers wrapped in `<span>` elements\r\n     * (`<span data-cke-filler=\"true\">&nbsp;</span>`) instead of regular `&nbsp;` characters.\r\n     *\r\n     * This mode allows for a more precise handling of the block fillers (so they do not leak into the editor content) but\r\n     * bloats the editor data with additional markup.\r\n     *\r\n     * This mode may be required by some features and will be turned on by them automatically.\r\n     *\r\n     * @param type Whether to use the default or the marked `&nbsp;` block fillers.\r\n     */\r\n    useFillerType(type) {\r\n        this.domConverter.blockFillerMode = type == 'marked' ? 'markedNbsp' : 'nbsp';\r\n    }\r\n    /**\r\n     * Converts an HTML string to its DOM representation. Returns a document fragment containing nodes parsed from\r\n     * the provided data.\r\n     */\r\n    _toDom(data) {\r\n        // Wrap data with a <body> tag so leading non-layout nodes (like <script>, <style>, HTML comment)\r\n        // will be preserved in the body collection.\r\n        // Do it only for data that is not a full HTML document.\r\n        if (!data.match(/<(?:html|body|head|meta)(?:\\s[^>]*)?>/i)) {\r\n            data = `<body>${data}</body>`;\r\n        }\r\n        const document = this.domParser.parseFromString(data, 'text/html');\r\n        const fragment = document.createDocumentFragment();\r\n        const bodyChildNodes = document.body.childNodes;\r\n        while (bodyChildNodes.length > 0) {\r\n            fragment.appendChild(bodyChildNodes[0]);\r\n        }\r\n        return fragment;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/controller/datacontroller\r\n */\r\nimport { CKEditorError, EmitterMixin, ObservableMixin, logWarning } from '@ckeditor/ckeditor5-utils';\r\nimport Mapper from '../conversion/mapper';\r\nimport DowncastDispatcher from '../conversion/downcastdispatcher';\r\nimport { insertAttributesAndChildren, insertText } from '../conversion/downcasthelpers';\r\nimport UpcastDispatcher from '../conversion/upcastdispatcher';\r\nimport { convertText, convertToModelFragment } from '../conversion/upcasthelpers';\r\nimport ViewDocumentFragment from '../view/documentfragment';\r\nimport ViewDocument from '../view/document';\r\nimport ViewDowncastWriter from '../view/downcastwriter';\r\nimport ModelRange from '../model/range';\r\nimport { autoParagraphEmptyRoots } from '../model/utils/autoparagraphing';\r\nimport HtmlDataProcessor from '../dataprocessor/htmldataprocessor';\r\n/**\r\n * Controller for the data pipeline. The data pipeline controls how data is retrieved from the document\r\n * and set inside it. Hence, the controller features two methods which allow to {@link ~DataController#get get}\r\n * and {@link ~DataController#set set} data of the {@link ~DataController#model model}\r\n * using the given:\r\n *\r\n * * {@link module:engine/dataprocessor/dataprocessor~DataProcessor data processor},\r\n * * downcast converters,\r\n * * upcast converters.\r\n *\r\n * An instance of the data controller is always available in the {@link module:core/editor/editor~Editor#data `editor.data`}\r\n * property:\r\n *\r\n * ```ts\r\n * editor.data.get( { rootName: 'customRoot' } ); // -> '<p>Hello!</p>'\r\n * ```\r\n */\r\nexport default class DataController extends EmitterMixin() {\r\n    /**\r\n     * Creates a data controller instance.\r\n     *\r\n     * @param model Data model.\r\n     * @param stylesProcessor The styles processor instance.\r\n     */\r\n    constructor(model, stylesProcessor) {\r\n        super();\r\n        this.model = model;\r\n        this.mapper = new Mapper();\r\n        this.downcastDispatcher = new DowncastDispatcher({\r\n            mapper: this.mapper,\r\n            schema: model.schema\r\n        });\r\n        this.downcastDispatcher.on('insert:$text', insertText(), { priority: 'lowest' });\r\n        this.downcastDispatcher.on('insert', insertAttributesAndChildren(), { priority: 'lowest' });\r\n        this.upcastDispatcher = new UpcastDispatcher({\r\n            schema: model.schema\r\n        });\r\n        this.viewDocument = new ViewDocument(stylesProcessor);\r\n        this.stylesProcessor = stylesProcessor;\r\n        this.htmlProcessor = new HtmlDataProcessor(this.viewDocument);\r\n        this.processor = this.htmlProcessor;\r\n        this._viewWriter = new ViewDowncastWriter(this.viewDocument);\r\n        // Define default converters for text and elements.\r\n        //\r\n        // Note that if there is no default converter for the element it will be skipped, for instance `<b>foo</b>` will be\r\n        // converted to nothing. We therefore add `convertToModelFragment` as a last converter so it converts children of that\r\n        // element to the document fragment so `<b>foo</b>` will still be converted to `foo` even if there is no converter for `<b>`.\r\n        this.upcastDispatcher.on('text', convertText(), { priority: 'lowest' });\r\n        this.upcastDispatcher.on('element', convertToModelFragment(), { priority: 'lowest' });\r\n        this.upcastDispatcher.on('documentFragment', convertToModelFragment(), { priority: 'lowest' });\r\n        ObservableMixin().prototype.decorate.call(this, 'init');\r\n        ObservableMixin().prototype.decorate.call(this, 'set');\r\n        ObservableMixin().prototype.decorate.call(this, 'get');\r\n        ObservableMixin().prototype.decorate.call(this, 'toView');\r\n        ObservableMixin().prototype.decorate.call(this, 'toModel');\r\n        // Fire the `ready` event when the initialization has completed. Such low-level listener offers the possibility\r\n        // to plug into the initialization pipeline without interrupting the initialization flow.\r\n        this.on('init', () => {\r\n            this.fire('ready');\r\n        }, { priority: 'lowest' });\r\n        // Fix empty roots after DataController is 'ready' (note that the init method could be decorated and stopped).\r\n        // We need to handle this event because initial data could be empty and the post-fixer would not get triggered.\r\n        this.on('ready', () => {\r\n            this.model.enqueueChange({ isUndoable: false }, autoParagraphEmptyRoots);\r\n        }, { priority: 'lowest' });\r\n    }\r\n    /**\r\n     * Returns the model's data converted by downcast dispatchers attached to {@link #downcastDispatcher} and\r\n     * formatted by the {@link #processor data processor}.\r\n     *\r\n     * A warning is logged when you try to retrieve data for a detached root, as most probably this is a mistake. A detached root should\r\n     * be treated like it is removed, and you should not save its data. Note, that the detached root data is always an empty string.\r\n     *\r\n     * @fires get\r\n     * @param options Additional configuration for the retrieved data. `DataController` provides two optional\r\n     * properties: `rootName` and `trim`. Other properties of this object are specified by various editor features.\r\n     * @param options.rootName Root name. Default 'main'.\r\n     * @param options.trim Whether returned data should be trimmed. This option is set to `empty` by default,\r\n     * which means whenever editor content is considered empty, an empty string will be returned. To turn off trimming completely\r\n     * use `'none'`. In such cases the exact content will be returned (for example a `<p>&nbsp;</p>` for an empty editor).\r\n     * @returns Output data.\r\n     */\r\n    get(options = {}) {\r\n        const { rootName = 'main', trim = 'empty' } = options;\r\n        if (!this._checkIfRootsExists([rootName])) {\r\n            /**\r\n             * Cannot get data from a non-existing root. This error is thrown when\r\n             * {@link module:engine/controller/datacontroller~DataController#get `DataController#get()` method}\r\n             * is called with a non-existent root name. For example, if there is an editor instance with only `main` root,\r\n             * calling {@link module:engine/controller/datacontroller~DataController#get} like:\r\n             *\r\n             * ```ts\r\n             * data.get( { rootName: 'root2' } );\r\n             * ```\r\n             *\r\n             * will throw this error.\r\n             *\r\n             * @error datacontroller-get-non-existent-root\r\n             */\r\n            throw new CKEditorError('datacontroller-get-non-existent-root', this);\r\n        }\r\n        const root = this.model.document.getRoot(rootName);\r\n        if (!root.isAttached()) {\r\n            /**\r\n             * Retrieving document data for a detached root.\r\n             *\r\n             * This usually indicates an error as a detached root should be considered \"removed\" and should not be included in the\r\n             * document data.\r\n             *\r\n             * @error datacontroller-get-detached-root\r\n             */\r\n            logWarning('datacontroller-get-detached-root', this);\r\n        }\r\n        if (trim === 'empty' && !this.model.hasContent(root, { ignoreWhitespaces: true })) {\r\n            return '';\r\n        }\r\n        return this.stringify(root, options);\r\n    }\r\n    /**\r\n     * Returns the content of the given {@link module:engine/model/element~Element model's element} or\r\n     * {@link module:engine/model/documentfragment~DocumentFragment model document fragment} converted by the downcast converters\r\n     * attached to the {@link #downcastDispatcher} and formatted by the {@link #processor data processor}.\r\n     *\r\n     * @param modelElementOrFragment The element whose content will be stringified.\r\n     * @param options Additional configuration passed to the conversion process.\r\n     * @returns Output data.\r\n     */\r\n    stringify(modelElementOrFragment, options = {}) {\r\n        // Model -> view.\r\n        const viewDocumentFragment = this.toView(modelElementOrFragment, options);\r\n        // View -> data.\r\n        return this.processor.toData(viewDocumentFragment);\r\n    }\r\n    /**\r\n     * Returns the content of the given {@link module:engine/model/element~Element model element} or\r\n     * {@link module:engine/model/documentfragment~DocumentFragment model document fragment} converted by the downcast\r\n     * converters attached to {@link #downcastDispatcher} into a\r\n     * {@link module:engine/view/documentfragment~DocumentFragment view document fragment}.\r\n     *\r\n     * @fires toView\r\n     * @param modelElementOrFragment Element or document fragment whose content will be converted.\r\n     * @param options Additional configuration that will be available through the\r\n     * {@link module:engine/conversion/downcastdispatcher~DowncastConversionApi#options} during the conversion process.\r\n     * @returns Output view DocumentFragment.\r\n     */\r\n    toView(modelElementOrFragment, options = {}) {\r\n        const viewDocument = this.viewDocument;\r\n        const viewWriter = this._viewWriter;\r\n        // Clear bindings so the call to this method returns correct results.\r\n        this.mapper.clearBindings();\r\n        // First, convert elements.\r\n        const modelRange = ModelRange._createIn(modelElementOrFragment);\r\n        const viewDocumentFragment = new ViewDocumentFragment(viewDocument);\r\n        this.mapper.bindElements(modelElementOrFragment, viewDocumentFragment);\r\n        // Prepare list of markers.\r\n        // For document fragment, simply take the markers assigned to this document fragment.\r\n        // For model root, all markers in that root will be taken.\r\n        // For model element, we need to check which markers are intersecting with this element and relatively modify the markers' ranges.\r\n        // Collapsed markers at element boundary, although considered as not intersecting with the element, will also be returned.\r\n        const markers = modelElementOrFragment.is('documentFragment') ?\r\n            modelElementOrFragment.markers :\r\n            _getMarkersRelativeToElement(modelElementOrFragment);\r\n        this.downcastDispatcher.convert(modelRange, markers, viewWriter, options);\r\n        return viewDocumentFragment;\r\n    }\r\n    /**\r\n     * Sets the initial input data parsed by the {@link #processor data processor} and\r\n     * converted by the {@link #upcastDispatcher view-to-model converters}.\r\n     * Initial data can be only set to a document whose {@link module:engine/model/document~Document#version} is equal 0.\r\n     *\r\n     * **Note** This method is {@link module:utils/observablemixin~Observable#decorate decorated} which is\r\n     * used by e.g. collaborative editing plugin that syncs remote data on init.\r\n     *\r\n     * When data is passed as a string, it is initialized on the default `main` root:\r\n     *\r\n     * ```ts\r\n     * dataController.init( '<p>Foo</p>' ); // Initializes data on the `main` root only, as no other is specified.\r\n     * ```\r\n     *\r\n     * To initialize data on a different root or multiple roots at once, an object containing `rootName` - `data` pairs should be passed:\r\n     *\r\n     * ```ts\r\n     * dataController.init( { main: '<p>Foo</p>', title: '<h1>Bar</h1>' } ); // Initializes data on both the `main` and `title` roots.\r\n     * ```\r\n     *\r\n     * @fires init\r\n     * @param data Input data as a string or an object containing the `rootName` - `data`\r\n     * pairs to initialize data on multiple roots at once.\r\n     * @returns Promise that is resolved after the data is set on the editor.\r\n     */\r\n    init(data) {\r\n        if (this.model.document.version) {\r\n            /**\r\n             * Cannot set initial data to a non-empty {@link module:engine/model/document~Document}.\r\n             * Initial data should be set once, during the {@link module:core/editor/editor~Editor} initialization,\r\n             * when the {@link module:engine/model/document~Document#version} is equal 0.\r\n             *\r\n             * @error datacontroller-init-document-not-empty\r\n             */\r\n            throw new CKEditorError('datacontroller-init-document-not-empty', this);\r\n        }\r\n        let initialData = {};\r\n        if (typeof data === 'string') {\r\n            initialData.main = data; // Default root is 'main'. To initiate data on a different root, object should be passed.\r\n        }\r\n        else {\r\n            initialData = data;\r\n        }\r\n        if (!this._checkIfRootsExists(Object.keys(initialData))) {\r\n            /**\r\n             * Cannot init data on a non-existent root. This error is thrown when\r\n             * {@link module:engine/controller/datacontroller~DataController#init DataController#init() method}\r\n             * is called with non-existent root name. For example, if there is an editor instance with only `main` root,\r\n             * calling {@link module:engine/controller/datacontroller~DataController#init} like:\r\n             *\r\n             * ```ts\r\n             * data.init( { main: '<p>Foo</p>', root2: '<p>Bar</p>' } );\r\n             * ```\r\n             *\r\n             * will throw this error.\r\n             *\r\n             * @error datacontroller-init-non-existent-root\r\n             */\r\n            throw new CKEditorError('datacontroller-init-non-existent-root', this);\r\n        }\r\n        this.model.enqueueChange({ isUndoable: false }, writer => {\r\n            for (const rootName of Object.keys(initialData)) {\r\n                const modelRoot = this.model.document.getRoot(rootName);\r\n                writer.insert(this.parse(initialData[rootName], modelRoot), modelRoot, 0);\r\n            }\r\n        });\r\n        return Promise.resolve();\r\n    }\r\n    /**\r\n     * Sets the input data parsed by the {@link #processor data processor} and\r\n     * converted by the {@link #upcastDispatcher view-to-model converters}.\r\n     * This method can be used any time to replace existing editor data with the new one without clearing the\r\n     * {@link module:engine/model/document~Document#history document history}.\r\n     *\r\n     * This method also creates a batch with all the changes applied. If all you need is to parse data, use\r\n     * the {@link #parse} method.\r\n     *\r\n     * When data is passed as a string it is set on the default `main` root:\r\n     *\r\n     * ```ts\r\n     * dataController.set( '<p>Foo</p>' ); // Sets data on the `main` root, as no other is specified.\r\n     * ```\r\n     *\r\n     * To set data on a different root or multiple roots at once, an object containing `rootName` - `data` pairs should be passed:\r\n     *\r\n     * ```ts\r\n     * dataController.set( { main: '<p>Foo</p>', title: '<h1>Bar</h1>' } ); // Sets data on the `main` and `title` roots as specified.\r\n     * ```\r\n     *\r\n     * To set the data with a preserved undo stack and add the change to the undo stack, set `{ isUndoable: true }` as a `batchType` option.\r\n     *\r\n     * ```ts\r\n     * dataController.set( '<p>Foo</p>', { batchType: { isUndoable: true } } );\r\n     * ```\r\n     *\r\n     * @fires set\r\n     * @param data Input data as a string or an object containing the `rootName` - `data`\r\n     * pairs to set data on multiple roots at once.\r\n     * @param options Options for setting data.\r\n     * @param options.batchType The batch type that will be used to create a batch for the changes applied by this method.\r\n     * By default, the batch will be set as {@link module:engine/model/batch~Batch#isUndoable not undoable} and the undo stack will be\r\n     * cleared after the new data is applied (all undo steps will be removed). If the batch type `isUndoable` flag is be set to `true`,\r\n     * the undo stack will be preserved instead and not cleared when new data is applied.\r\n     */\r\n    set(data, options = {}) {\r\n        let newData = {};\r\n        if (typeof data === 'string') {\r\n            newData.main = data; // The default root is 'main'. To set data on a different root, an object should be passed.\r\n        }\r\n        else {\r\n            newData = data;\r\n        }\r\n        if (!this._checkIfRootsExists(Object.keys(newData))) {\r\n            /**\r\n             * Cannot set data on a non-existent root. This error is thrown when the\r\n             * {@link module:engine/controller/datacontroller~DataController#set DataController#set() method}\r\n             * is called with non-existent root name. For example, if there is an editor instance with only the default `main` root,\r\n             * calling {@link module:engine/controller/datacontroller~DataController#set} like:\r\n             *\r\n             * ```ts\r\n             * data.set( { main: '<p>Foo</p>', root2: '<p>Bar</p>' } );\r\n             * ```\r\n             *\r\n             * will throw this error.\r\n             *\r\n             * @error datacontroller-set-non-existent-root\r\n             */\r\n            throw new CKEditorError('datacontroller-set-non-existent-root', this);\r\n        }\r\n        this.model.enqueueChange(options.batchType || {}, writer => {\r\n            writer.setSelection(null);\r\n            writer.removeSelectionAttribute(this.model.document.selection.getAttributeKeys());\r\n            for (const rootName of Object.keys(newData)) {\r\n                // Save to model.\r\n                const modelRoot = this.model.document.getRoot(rootName);\r\n                writer.remove(writer.createRangeIn(modelRoot));\r\n                writer.insert(this.parse(newData[rootName], modelRoot), modelRoot, 0);\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Returns the data parsed by the {@link #processor data processor} and then converted by upcast converters\r\n     * attached to the {@link #upcastDispatcher}.\r\n     *\r\n     * @see #set\r\n     * @param data Data to parse.\r\n     * @param context Base context in which the view will be converted to the model.\r\n     * See: {@link module:engine/conversion/upcastdispatcher~UpcastDispatcher#convert}.\r\n     * @returns Parsed data.\r\n     */\r\n    parse(data, context = '$root') {\r\n        // data -> view\r\n        const viewDocumentFragment = this.processor.toView(data);\r\n        // view -> model\r\n        return this.toModel(viewDocumentFragment, context);\r\n    }\r\n    /**\r\n     * Returns the result of the given {@link module:engine/view/element~Element view element} or\r\n     * {@link module:engine/view/documentfragment~DocumentFragment view document fragment} converted by the\r\n     * {@link #upcastDispatcher view-to-model converters}, wrapped by {@link module:engine/model/documentfragment~DocumentFragment}.\r\n     *\r\n     * When marker elements were converted during the conversion process, it will be set as a document fragment's\r\n     * {@link module:engine/model/documentfragment~DocumentFragment#markers static markers map}.\r\n     *\r\n     * @fires toModel\r\n     * @param viewElementOrFragment The element or document fragment whose content will be converted.\r\n     * @param context Base context in which the view will be converted to the model.\r\n     * See: {@link module:engine/conversion/upcastdispatcher~UpcastDispatcher#convert}.\r\n     * @returns Output document fragment.\r\n     */\r\n    toModel(viewElementOrFragment, context = '$root') {\r\n        return this.model.change(writer => {\r\n            return this.upcastDispatcher.convert(viewElementOrFragment, writer, context);\r\n        });\r\n    }\r\n    /**\r\n     * Adds the style processor normalization rules.\r\n     *\r\n     * You can implement your own rules as well as use one of the available processor rules:\r\n     *\r\n     * * background: {@link module:engine/view/styles/background~addBackgroundRules}\r\n     * * border: {@link module:engine/view/styles/border~addBorderRules}\r\n     * * margin: {@link module:engine/view/styles/margin~addMarginRules}\r\n     * * padding: {@link module:engine/view/styles/padding~addPaddingRules}\r\n     */\r\n    addStyleProcessorRules(callback) {\r\n        callback(this.stylesProcessor);\r\n    }\r\n    /**\r\n     * Registers a {@link module:engine/view/matcher~MatcherPattern} on an {@link #htmlProcessor htmlProcessor}\r\n     * and a {@link #processor processor} for view elements whose content should be treated as raw data\r\n     * and not processed during the conversion from DOM to view elements.\r\n     *\r\n     * The raw data can be later accessed by the {@link module:engine/view/element~Element#getCustomProperty view element custom property}\r\n     * `\"$rawContent\"`.\r\n     *\r\n     * @param pattern Pattern matching all view elements whose content should be treated as a raw data.\r\n     */\r\n    registerRawContentMatcher(pattern) {\r\n        // No need to register the pattern if both the `htmlProcessor` and `processor` are the same instances.\r\n        if (this.processor && this.processor !== this.htmlProcessor) {\r\n            this.processor.registerRawContentMatcher(pattern);\r\n        }\r\n        this.htmlProcessor.registerRawContentMatcher(pattern);\r\n    }\r\n    /**\r\n     * Removes all event listeners set by the DataController.\r\n     */\r\n    destroy() {\r\n        this.stopListening();\r\n    }\r\n    /**\r\n     * Checks whether all provided root names are actually existing editor roots.\r\n     *\r\n     * @param rootNames Root names to check.\r\n     * @returns Whether all provided root names are existing editor roots.\r\n     */\r\n    _checkIfRootsExists(rootNames) {\r\n        for (const rootName of rootNames) {\r\n            if (!this.model.document.getRoot(rootName)) {\r\n                return false;\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n}\r\n/**\r\n * Helper function for downcast conversion.\r\n *\r\n * Takes a document element (element that is added to a model document) and checks which markers are inside it. If the marker is collapsed\r\n * at element boundary, it is considered as contained inside the element and marker range is returned. Otherwise, if the marker is\r\n * intersecting with the element, the intersection is returned.\r\n */\r\nfunction _getMarkersRelativeToElement(element) {\r\n    const result = [];\r\n    const doc = element.root.document;\r\n    if (!doc) {\r\n        return new Map();\r\n    }\r\n    const elementRange = ModelRange._createIn(element);\r\n    for (const marker of doc.model.markers) {\r\n        const markerRange = marker.getRange();\r\n        const isMarkerCollapsed = markerRange.isCollapsed;\r\n        const isMarkerAtElementBoundary = markerRange.start.isEqual(elementRange.start) || markerRange.end.isEqual(elementRange.end);\r\n        if (isMarkerCollapsed && isMarkerAtElementBoundary) {\r\n            result.push([marker.name, markerRange]);\r\n        }\r\n        else {\r\n            const updatedMarkerRange = elementRange.getIntersection(markerRange);\r\n            if (updatedMarkerRange) {\r\n                result.push([marker.name, updatedMarkerRange]);\r\n            }\r\n        }\r\n    }\r\n    // Sort the markers in a stable fashion to ensure that the order in which they are\r\n    // added to the model's marker collection does not affect how they are\r\n    // downcast. One particular use case that we are targeting here, is one where\r\n    // two markers are adjacent but not overlapping, such as an insertion/deletion\r\n    // suggestion pair representing the replacement of a range of text. In this\r\n    // case, putting the markers in DOM order causes the first marker's end to be\r\n    // serialized right after the second marker's start, while putting the markers\r\n    // in reverse DOM order causes it to be right before the second marker's\r\n    // start. So, we sort these in a way that ensures non-intersecting ranges are in\r\n    // reverse DOM order, and intersecting ranges are in something approximating\r\n    // reverse DOM order (since reverse DOM order doesn't have a precise meaning\r\n    // when working with intersecting ranges).\r\n    result.sort(([n1, r1], [n2, r2]) => {\r\n        if (r1.end.compareWith(r2.start) !== 'after') {\r\n            // m1.end <= m2.start -- m1 is entirely <= m2\r\n            return 1;\r\n        }\r\n        else if (r1.start.compareWith(r2.end) !== 'before') {\r\n            // m1.start >= m2.end -- m1 is entirely >= m2\r\n            return -1;\r\n        }\r\n        else {\r\n            // they overlap, so use their start positions as the primary sort key and\r\n            // end positions as the secondary sort key\r\n            switch (r1.start.compareWith(r2.start)) {\r\n                case 'before':\r\n                    return 1;\r\n                case 'after':\r\n                    return -1;\r\n                default:\r\n                    switch (r1.end.compareWith(r2.end)) {\r\n                        case 'before':\r\n                            return 1;\r\n                        case 'after':\r\n                            return -1;\r\n                        default:\r\n                            return n2.localeCompare(n1);\r\n                    }\r\n            }\r\n        }\r\n    });\r\n    return new Map(result);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/conversion/conversion\r\n */\r\nimport { CKEditorError, toArray } from '@ckeditor/ckeditor5-utils';\r\nimport UpcastHelpers from './upcasthelpers';\r\nimport DowncastHelpers from './downcasthelpers';\r\n/**\r\n * A utility class that helps add converters to upcast and downcast dispatchers.\r\n *\r\n * We recommend reading the {@glink framework/deep-dive/conversion/intro editor conversion} guide first to\r\n * understand the core concepts of the conversion mechanisms.\r\n *\r\n * An instance of the conversion manager is available in the\r\n * {@link module:core/editor/editor~Editor#conversion `editor.conversion`} property\r\n * and by default has the following groups of dispatchers (i.e. directions of conversion):\r\n *\r\n * * `downcast` (editing and data downcasts)\r\n * * `editingDowncast`\r\n * * `dataDowncast`\r\n * * `upcast`\r\n *\r\n * # One-way converters\r\n *\r\n * To add a converter to a specific group, use the {@link module:engine/conversion/conversion~Conversion#for `for()`}\r\n * method:\r\n *\r\n * ```ts\r\n * // Add a converter to editing downcast and data downcast.\r\n * editor.conversion.for( 'downcast' ).elementToElement( config ) );\r\n *\r\n * // Add a converter to the data pipepline only:\r\n * editor.conversion.for( 'dataDowncast' ).elementToElement( dataConversionConfig ) );\r\n *\r\n * // And a slightly different one for the editing pipeline:\r\n * editor.conversion.for( 'editingDowncast' ).elementToElement( editingConversionConfig ) );\r\n * ```\r\n *\r\n * See {@link module:engine/conversion/conversion~Conversion#for `for()`} method documentation to learn more about\r\n * available conversion helpers and how to use your custom ones.\r\n *\r\n * # Two-way converters\r\n *\r\n * Besides using one-way converters via the `for()` method, you can also use other methods available in this\r\n * class to add two-way converters (upcast and downcast):\r\n *\r\n * * {@link module:engine/conversion/conversion~Conversion#elementToElement `elementToElement()`} &ndash;\r\n * Model element to view element and vice versa.\r\n * * {@link module:engine/conversion/conversion~Conversion#attributeToElement `attributeToElement()`} &ndash;\r\n * Model attribute to view element and vice versa.\r\n * * {@link module:engine/conversion/conversion~Conversion#attributeToAttribute `attributeToAttribute()`} &ndash;\r\n * Model attribute to view attribute and vice versa.\r\n */\r\nexport default class Conversion {\r\n    /**\r\n     * Creates a new conversion instance.\r\n     */\r\n    constructor(downcastDispatchers, upcastDispatchers) {\r\n        /**\r\n         * Maps dispatchers group name to ConversionHelpers instances.\r\n         */\r\n        this._helpers = new Map();\r\n        // Define default 'downcast' & 'upcast' dispatchers groups. Those groups are always available as two-way converters needs them.\r\n        this._downcast = toArray(downcastDispatchers);\r\n        this._createConversionHelpers({ name: 'downcast', dispatchers: this._downcast, isDowncast: true });\r\n        this._upcast = toArray(upcastDispatchers);\r\n        this._createConversionHelpers({ name: 'upcast', dispatchers: this._upcast, isDowncast: false });\r\n    }\r\n    /**\r\n     * Define an alias for registered dispatcher.\r\n     *\r\n     * ```ts\r\n     * const conversion = new Conversion(\r\n     * \t[ dataDowncastDispatcher, editingDowncastDispatcher ],\r\n     * \tupcastDispatcher\r\n     * );\r\n     *\r\n     * conversion.addAlias( 'dataDowncast', dataDowncastDispatcher );\r\n     * ```\r\n     *\r\n     * @param alias An alias of a dispatcher.\r\n     * @param dispatcher Dispatcher which should have an alias.\r\n     */\r\n    addAlias(alias, dispatcher) {\r\n        const isDowncast = this._downcast.includes(dispatcher);\r\n        const isUpcast = this._upcast.includes(dispatcher);\r\n        if (!isUpcast && !isDowncast) {\r\n            /**\r\n             * Trying to register an alias for a dispatcher that nas not been registered.\r\n             *\r\n             * @error conversion-add-alias-dispatcher-not-registered\r\n             */\r\n            throw new CKEditorError('conversion-add-alias-dispatcher-not-registered', this);\r\n        }\r\n        this._createConversionHelpers({ name: alias, dispatchers: [dispatcher], isDowncast });\r\n    }\r\n    /**\r\n     * Provides a chainable API to assign converters to a conversion dispatchers group.\r\n     *\r\n     * If the given group name has not been registered, the\r\n     * {@link module:utils/ckeditorerror~CKEditorError `conversion-for-unknown-group` error} is thrown.\r\n     *\r\n     * You can use conversion helpers available directly in the `for()` chain or your custom ones via\r\n     * the {@link module:engine/conversion/conversionhelpers~ConversionHelpers#add `add()`} method.\r\n     *\r\n     * # Using built-in conversion helpers\r\n     *\r\n     * The `for()` chain comes with a set of conversion helpers which you can use like this:\r\n     *\r\n     * ```ts\r\n     * editor.conversion.for( 'downcast' )\r\n     * \t.elementToElement( config1 )        // Adds an element-to-element downcast converter.\r\n     * \t.attributeToElement( config2 );     // Adds an attribute-to-element downcast converter.\r\n     *\r\n     * editor.conversion.for( 'upcast' )\r\n     * \t.elementToAttribute( config3 );     // Adds an element-to-attribute upcast converter.\r\n     * ```\r\n     *\r\n     * Refer to the documentation of built-in conversion helpers to learn about their configuration options.\r\n     *\r\n     * * downcast (model-to-view) conversion helpers:\r\n     *\r\n     *\t* {@link module:engine/conversion/downcasthelpers~DowncastHelpers#elementToElement `elementToElement()`},\r\n     *\t* {@link module:engine/conversion/downcasthelpers~DowncastHelpers#attributeToElement `attributeToElement()`},\r\n     *\t* {@link module:engine/conversion/downcasthelpers~DowncastHelpers#attributeToAttribute `attributeToAttribute()`}.\r\n     *\t* {@link module:engine/conversion/downcasthelpers~DowncastHelpers#markerToElement `markerToElement()`}.\r\n     *\t* {@link module:engine/conversion/downcasthelpers~DowncastHelpers#markerToHighlight `markerToHighlight()`}.\r\n     *\r\n     * * upcast (view-to-model) conversion helpers:\r\n     *\r\n     *\t* {@link module:engine/conversion/upcasthelpers~UpcastHelpers#elementToElement `elementToElement()`},\r\n     *\t* {@link module:engine/conversion/upcasthelpers~UpcastHelpers#elementToAttribute `elementToAttribute()`},\r\n     *\t* {@link module:engine/conversion/upcasthelpers~UpcastHelpers#attributeToAttribute `attributeToAttribute()`}.\r\n     *\t* {@link module:engine/conversion/upcasthelpers~UpcastHelpers#elementToMarker `elementToMarker()`}.\r\n     *\r\n     * # Using custom conversion helpers\r\n     *\r\n     * If you need to implement an atypical converter, you can do so by calling:\r\n     *\r\n     * ```ts\r\n     * editor.conversion.for( direction ).add( customHelper );\r\n     * ```\r\n     *\r\n     * The `.add()` method takes exactly one parameter, which is a function. This function should accept one parameter that\r\n     * is a dispatcher instance. The function should add an actual converter to the passed dispatcher instance.\r\n     *\r\n     * Example:\r\n     *\r\n     * ```ts\r\n     * editor.conversion.for( 'upcast' ).add( dispatcher => {\r\n     * \tdispatcher.on( 'element:a',  ( evt, data, conversionApi ) => {\r\n     * \t\t// Do something with a view <a> element.\r\n     * \t} );\r\n     * } );\r\n     * ```\r\n     *\r\n     * Refer to the documentation of {@link module:engine/conversion/upcastdispatcher~UpcastDispatcher}\r\n     * and {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher} to learn how to write\r\n     * custom converters.\r\n     *\r\n     * @param groupName The name of dispatchers group to add the converters to.\r\n     */\r\n    for(groupName) {\r\n        if (!this._helpers.has(groupName)) {\r\n            /**\r\n             * Trying to add a converter to an unknown dispatchers group.\r\n             *\r\n             * @error conversion-for-unknown-group\r\n             */\r\n            throw new CKEditorError('conversion-for-unknown-group', this);\r\n        }\r\n        return this._helpers.get(groupName);\r\n    }\r\n    /**\r\n     * Sets up converters between the model and the view that convert a model element to a view element (and vice versa).\r\n     * For example, the model `<paragraph>Foo</paragraph>` is turned into `<p>Foo</p>` in the view.\r\n     *\r\n     * ```ts\r\n     * // A simple conversion from the `paragraph` model element to the `<p>` view element (and vice versa).\r\n     * editor.conversion.elementToElement( { model: 'paragraph', view: 'p' } );\r\n     *\r\n     * // Override other converters by specifying a converter definition with a higher priority.\r\n     * editor.conversion.elementToElement( { model: 'paragraph', view: 'div', converterPriority: 'high' } );\r\n     *\r\n     * // View specified as an object instead of a string.\r\n     * editor.conversion.elementToElement( {\r\n     * \tmodel: 'fancyParagraph',\r\n     * \tview: {\r\n     * \t\tname: 'p',\r\n     * \t\tclasses: 'fancy'\r\n     * \t}\r\n     * } );\r\n     *\r\n     * // Use `upcastAlso` to define other view elements that should also be converted to a `paragraph` element.\r\n     * editor.conversion.elementToElement( {\r\n     * \tmodel: 'paragraph',\r\n     * \tview: 'p',\r\n     * \tupcastAlso: [\r\n     * \t\t'div',\r\n     * \t\t{\r\n     * \t\t\t// Any element with the `display: block` style.\r\n     * \t\t\tstyles: {\r\n     * \t\t\t\tdisplay: 'block'\r\n     * \t\t\t}\r\n     * \t\t}\r\n     * \t]\r\n     * } );\r\n     *\r\n     * // `upcastAlso` set as callback enables a conversion of a wide range of different view elements.\r\n     * editor.conversion.elementToElement( {\r\n     * \tmodel: 'heading',\r\n     * \tview: 'h2',\r\n     * \t// Convert \"heading-like\" paragraphs to headings.\r\n     * \tupcastAlso: viewElement => {\r\n     * \t\tconst fontSize = viewElement.getStyle( 'font-size' );\r\n     *\r\n     * \t\tif ( !fontSize ) {\r\n     * \t\t\treturn null;\r\n     * \t\t}\r\n     *\r\n     * \t\tconst match = fontSize.match( /(\\d+)\\s*px/ );\r\n     *\r\n     * \t\tif ( !match ) {\r\n     * \t\t\treturn null;\r\n     * \t\t}\r\n     *\r\n     * \t\tconst size = Number( match[ 1 ] );\r\n     *\r\n     * \t\tif ( size > 26 ) {\r\n     * \t\t\t// Returned value can be an object with the matched properties.\r\n     * \t\t\t// These properties will be \"consumed\" during the conversion.\r\n     * \t\t\t// See `engine.view.Matcher~MatcherPattern` and `engine.view.Matcher#match` for more details.\r\n     *\r\n     * \t\t\treturn { name: true, styles: [ 'font-size' ] };\r\n     * \t\t}\r\n     *\r\n     * \t\treturn null;\r\n     * \t}\r\n     * } );\r\n     * ```\r\n     *\r\n     * `definition.model` is a `String` with a model element name to convert from or to.\r\n     *\r\n     * @param definition The converter definition.\r\n     */\r\n    elementToElement(definition) {\r\n        // Set up downcast converter.\r\n        this.for('downcast').elementToElement(definition);\r\n        // Set up upcast converter.\r\n        for (const { model, view } of _getAllUpcastDefinitions(definition)) {\r\n            this.for('upcast')\r\n                .elementToElement({\r\n                model,\r\n                view,\r\n                converterPriority: definition.converterPriority\r\n            });\r\n        }\r\n    }\r\n    /**\r\n     * Sets up converters between the model and the view that convert a model attribute to a view element (and vice versa).\r\n     * For example, a model text node with `\"Foo\"` as data and the `bold` attribute will be turned to `<strong>Foo</strong>` in the view.\r\n     *\r\n     * ```ts\r\n     * // A simple conversion from the `bold=true` attribute to the `<strong>` view element (and vice versa).\r\n     * editor.conversion.attributeToElement( { model: 'bold', view: 'strong' } );\r\n     *\r\n     * // Override other converters by specifying a converter definition with a higher priority.\r\n     * editor.conversion.attributeToElement( { model: 'bold', view: 'b', converterPriority: 'high' } );\r\n     *\r\n     * // View specified as an object instead of a string.\r\n     * editor.conversion.attributeToElement( {\r\n     * \tmodel: 'bold',\r\n     * \tview: {\r\n     * \t\tname: 'span',\r\n     * \t\tclasses: 'bold'\r\n     * \t}\r\n     * } );\r\n     *\r\n     * // Use `config.model.name` to define the conversion only from a given node type, `$text` in this case.\r\n     * // The same attribute on different elements may then be handled by a different converter.\r\n     * editor.conversion.attributeToElement( {\r\n     * \tmodel: {\r\n     * \t\tkey: 'textDecoration',\r\n     * \t\tvalues: [ 'underline', 'lineThrough' ],\r\n     * \t\tname: '$text'\r\n     * \t},\r\n     * \tview: {\r\n     * \t\tunderline: {\r\n     * \t\t\tname: 'span',\r\n     * \t\t\tstyles: {\r\n     * \t\t\t\t'text-decoration': 'underline'\r\n     * \t\t\t}\r\n     * \t\t},\r\n     * \t\tlineThrough: {\r\n     * \t\t\tname: 'span',\r\n     * \t\t\tstyles: {\r\n     * \t\t\t\t'text-decoration': 'line-through'\r\n     * \t\t\t}\r\n     * \t\t}\r\n     * \t}\r\n     * } );\r\n     *\r\n     * // Use `upcastAlso` to define other view elements that should also be converted to the `bold` attribute.\r\n     * editor.conversion.attributeToElement( {\r\n     * \tmodel: 'bold',\r\n     * \tview: 'strong',\r\n     * \tupcastAlso: [\r\n     * \t\t'b',\r\n     * \t\t{\r\n     * \t\t\tname: 'span',\r\n     * \t\t\tclasses: 'bold'\r\n     * \t\t},\r\n     * \t\t{\r\n     * \t\t\tname: 'span',\r\n     * \t\t\tstyles: {\r\n     * \t\t\t\t'font-weight': 'bold'\r\n     * \t\t\t}\r\n     * \t\t},\r\n     * \t\tviewElement => {\r\n     * \t\t\tconst fontWeight = viewElement.getStyle( 'font-weight' );\r\n     *\r\n     * \t\t\tif ( viewElement.is( 'element', 'span' ) && fontWeight && /\\d+/.test() && Number( fontWeight ) > 500 ) {\r\n     * \t\t\t\t// Returned value can be an object with the matched properties.\r\n     * \t\t\t\t// These properties will be \"consumed\" during the conversion.\r\n     * \t\t\t\t// See `engine.view.Matcher~MatcherPattern` and `engine.view.Matcher#match` for more details.\r\n     *\r\n     * \t\t\t\treturn {\r\n     * \t\t\t\t\tname: true,\r\n     * \t\t\t\t\tstyles: [ 'font-weight' ]\r\n     * \t\t\t\t};\r\n     * \t\t\t}\r\n     * \t\t}\r\n     * \t]\r\n     * } );\r\n     *\r\n     * // Conversion from and to a model attribute key whose value is an enum (`fontSize=big|small`).\r\n     * // `upcastAlso` set as callback enables a conversion of a wide range of different view elements.\r\n     * editor.conversion.attributeToElement( {\r\n     * \tmodel: {\r\n     * \t\tkey: 'fontSize',\r\n     * \t\tvalues: [ 'big', 'small' ]\r\n     * \t},\r\n     * \tview: {\r\n     * \t\tbig: {\r\n     * \t\t\tname: 'span',\r\n     * \t\t\tstyles: {\r\n     * \t\t\t\t'font-size': '1.2em'\r\n     * \t\t\t}\r\n     * \t\t},\r\n     * \t\tsmall: {\r\n     * \t\t\tname: 'span',\r\n     * \t\t\tstyles: {\r\n     * \t\t\t\t'font-size': '0.8em'\r\n     * \t\t\t}\r\n     * \t\t}\r\n     * \t},\r\n     * \tupcastAlso: {\r\n     * \t\tbig: viewElement => {\r\n     * \t\t\tconst fontSize = viewElement.getStyle( 'font-size' );\r\n     *\r\n     * \t\t\tif ( !fontSize ) {\r\n     * \t\t\t\treturn null;\r\n     * \t\t\t}\r\n     *\r\n     * \t\t\tconst match = fontSize.match( /(\\d+)\\s*px/ );\r\n     *\r\n     * \t\t\tif ( !match ) {\r\n     * \t\t\t\treturn null;\r\n     * \t\t\t}\r\n     *\r\n     * \t\t\tconst size = Number( match[ 1 ] );\r\n     *\r\n     * \t\t\tif ( viewElement.is( 'element', 'span' ) && size > 10 ) {\r\n     * \t\t\t\t// Returned value can be an object with the matched properties.\r\n     * \t\t\t\t// These properties will be \"consumed\" during the conversion.\r\n     * \t\t\t\t// See `engine.view.Matcher~MatcherPattern` and `engine.view.Matcher#match` for more details.\r\n     *\r\n     * \t\t\t\treturn { name: true, styles: [ 'font-size' ] };\r\n     * \t\t\t}\r\n     *\r\n     * \t\t\treturn null;\r\n     * \t\t},\r\n     * \t\tsmall: viewElement => {\r\n     * \t\t\tconst fontSize = viewElement.getStyle( 'font-size' );\r\n     *\r\n     * \t\t\tif ( !fontSize ) {\r\n     * \t\t\t\treturn null;\r\n     * \t\t\t}\r\n     *\r\n     * \t\t\tconst match = fontSize.match( /(\\d+)\\s*px/ );\r\n     *\r\n     * \t\t\tif ( !match ) {\r\n     * \t\t\t\treturn null;\r\n     * \t\t\t}\r\n     *\r\n     * \t\t\tconst size = Number( match[ 1 ] );\r\n     *\r\n     * \t\t\tif ( viewElement.is( 'element', 'span' ) && size < 10 ) {\r\n     * \t\t\t\t// Returned value can be an object with the matched properties.\r\n     * \t\t\t\t// These properties will be \"consumed\" during the conversion.\r\n     * \t\t\t\t// See `engine.view.Matcher~MatcherPattern` and `engine.view.Matcher#match` for more details.\r\n     *\r\n     * \t\t\t\treturn { name: true, styles: [ 'font-size' ] };\r\n     * \t\t\t}\r\n     *\r\n     * \t\t\treturn null;\r\n     * \t\t}\r\n     * \t}\r\n     * } );\r\n     * ```\r\n     *\r\n     * The `definition.model` parameter specifies which model attribute should be converted from or to. It can be a `{ key, value }` object\r\n     * describing the attribute key and value to convert or a `String` specifying just the attribute key (in such a case\r\n     * `value` is set to `true`).\r\n     *\r\n     * @param definition The converter definition.\r\n     */\r\n    attributeToElement(definition) {\r\n        // Set up downcast converter.\r\n        this.for('downcast').attributeToElement(definition);\r\n        // Set up upcast converter.\r\n        for (const { model, view } of _getAllUpcastDefinitions(definition)) {\r\n            this.for('upcast')\r\n                .elementToAttribute({\r\n                view,\r\n                model,\r\n                converterPriority: definition.converterPriority\r\n            });\r\n        }\r\n    }\r\n    /**\r\n     * Sets up converters between the model and the view that convert a model attribute to a view attribute (and vice versa). For example,\r\n     * `<imageBlock src='foo.jpg'></imageBlock>` is converted to `<img src='foo.jpg'></img>` (the same attribute key and value).\r\n     * This type of converters is intended to be used with {@link module:engine/model/element~Element model element} nodes.\r\n     * To convert the text attributes,\r\n     * the {@link module:engine/conversion/conversion~Conversion#attributeToElement `attributeToElement converter`}should be set up.\r\n     *\r\n     * ```ts\r\n     * // A simple conversion from the `source` model attribute to the `src` view attribute (and vice versa).\r\n     * editor.conversion.attributeToAttribute( { model: 'source', view: 'src' } );\r\n     *\r\n     * // Attribute values are strictly specified.\r\n     * editor.conversion.attributeToAttribute( {\r\n     * \tmodel: {\r\n     * \t\tname: 'imageInline',\r\n     * \t\tkey: 'aside',\r\n     * \t\tvalues: [ 'aside' ]\r\n     * \t},\r\n     * \tview: {\r\n     * \t\taside: {\r\n     * \t\t\tname: 'img',\r\n     * \t\t\tkey: 'class',\r\n     * \t\t\tvalue: [ 'aside', 'half-size' ]\r\n     * \t\t}\r\n     * \t}\r\n     * } );\r\n     *\r\n     * // Set the style attribute.\r\n     * editor.conversion.attributeToAttribute( {\r\n     * \tmodel: {\r\n     * \t\tname: 'imageInline',\r\n     * \t\tkey: 'aside',\r\n     * \t\tvalues: [ 'aside' ]\r\n     * \t},\r\n     * \tview: {\r\n     * \t\taside: {\r\n     * \t\t\tname: 'img',\r\n     * \t\t\tkey: 'style',\r\n     * \t\t\tvalue: {\r\n     * \t\t\t\tfloat: 'right',\r\n     * \t\t\t\twidth: '50%',\r\n     * \t\t\t\tmargin: '5px'\r\n     * \t\t\t}\r\n     * \t\t}\r\n     * \t}\r\n     * } );\r\n     *\r\n     * // Conversion from and to a model attribute key whose value is an enum (`align=right|center`).\r\n     * // Use `upcastAlso` to define other view elements that should also be converted to the `align=right` attribute.\r\n     * editor.conversion.attributeToAttribute( {\r\n     * \tmodel: {\r\n     * \t\tkey: 'align',\r\n     * \t\tvalues: [ 'right', 'center' ]\r\n     * \t},\r\n     * \tview: {\r\n     * \t\tright: {\r\n     * \t\t\tkey: 'class',\r\n     * \t\t\tvalue: 'align-right'\r\n     * \t\t},\r\n     * \t\tcenter: {\r\n     * \t\t\tkey: 'class',\r\n     * \t\t\tvalue: 'align-center'\r\n     * \t\t}\r\n     * \t},\r\n     * \tupcastAlso: {\r\n     * \t\tright: {\r\n     * \t\t\tstyles: {\r\n     * \t\t\t\t'text-align': 'right'\r\n     * \t\t\t}\r\n     * \t\t},\r\n     * \t\tcenter: {\r\n     * \t\t\tstyles: {\r\n     * \t\t\t\t'text-align': 'center'\r\n     * \t\t\t}\r\n     * \t\t}\r\n     * \t}\r\n     * } );\r\n     * ```\r\n     *\r\n     * The `definition.model` parameter specifies which model attribute should be converted from and to.\r\n     * It can be a `{ key, [ values ], [ name ] }` object or a `String`, which will be treated like `{ key: definition.model }`.\r\n     * The `key` property is the model attribute key to convert from and to.\r\n     * The `values` are the possible model attribute values. If the `values` parameter is not set, the model attribute value\r\n     * will be the same as the view attribute value.\r\n     * If `name` is set, the conversion will be set up only for model elements with the given name.\r\n     *\r\n     * The `definition.view` parameter specifies which view attribute should be converted from and to.\r\n     * It can be a `{ key, value, [ name ] }` object or a `String`, which will be treated like `{ key: definition.view }`.\r\n     * The `key` property is the view attribute key to convert from and to.\r\n     * The `value` is the view attribute value to convert from and to. If `definition.value` is not set, the view attribute value will be\r\n     * the same as the model attribute value.\r\n     * If `key` is `'class'`, `value` can be a `String` or an array of `String`s.\r\n     * If `key` is `'style'`, `value` is an object with key-value pairs.\r\n     * In other cases, `value` is a `String`.\r\n     * If `name` is set, the conversion will be set up only for model elements with the given name.\r\n     * If `definition.model.values` is set, `definition.view` is an object that assigns values from `definition.model.values`\r\n     * to `{ key, value, [ name ] }` objects.\r\n     *\r\n     * `definition.upcastAlso` specifies which other matching view elements should also be upcast to the given model configuration.\r\n     * If `definition.model.values` is set, `definition.upcastAlso` should be an object assigning values from `definition.model.values`\r\n     * to {@link module:engine/view/matcher~MatcherPattern}s or arrays of {@link module:engine/view/matcher~MatcherPattern}s.\r\n     *\r\n     * **Note:** `definition.model` and `definition.view` form should be mirrored, so the same types of parameters should\r\n     * be given in both parameters.\r\n     *\r\n     * @param definition The converter definition.\r\n     * @param definition.model The model attribute to convert from and to.\r\n     * @param definition.view The view attribute to convert from and to.\r\n     * @param definition.upcastAlso Any view element matching `definition.upcastAlso` will also be converted to the given model attribute.\r\n     * `definition.upcastAlso` is used only if `config.model.values` is specified.\r\n     */\r\n    attributeToAttribute(definition) {\r\n        // Set up downcast converter.\r\n        this.for('downcast').attributeToAttribute(definition);\r\n        // Set up upcast converter.\r\n        for (const { model, view } of _getAllUpcastDefinitions(definition)) {\r\n            this.for('upcast')\r\n                .attributeToAttribute({\r\n                view,\r\n                model\r\n            });\r\n        }\r\n    }\r\n    /**\r\n     * Creates and caches conversion helpers for given dispatchers group.\r\n     *\r\n     * @param options.name Group name.\r\n     */\r\n    _createConversionHelpers({ name, dispatchers, isDowncast }) {\r\n        if (this._helpers.has(name)) {\r\n            /**\r\n             * Trying to register a group name that has already been registered.\r\n             *\r\n             * @error conversion-group-exists\r\n             */\r\n            throw new CKEditorError('conversion-group-exists', this);\r\n        }\r\n        const helpers = isDowncast ?\r\n            new DowncastHelpers(dispatchers) :\r\n            new UpcastHelpers(dispatchers);\r\n        this._helpers.set(name, helpers);\r\n    }\r\n}\r\n/**\r\n * Helper function that creates a joint array out of an item passed in `definition.view` and items passed in\r\n * `definition.upcastAlso`.\r\n */\r\nfunction* _getAllUpcastDefinitions(definition) {\r\n    if (definition.model.values) {\r\n        for (const value of definition.model.values) {\r\n            const model = { key: definition.model.key, value };\r\n            const view = definition.view[value];\r\n            const upcastAlso = definition.upcastAlso ? definition.upcastAlso[value] : undefined;\r\n            yield* _getUpcastDefinition(model, view, upcastAlso);\r\n        }\r\n    }\r\n    else {\r\n        yield* _getUpcastDefinition(definition.model, definition.view, definition.upcastAlso);\r\n    }\r\n}\r\nfunction* _getUpcastDefinition(model, view, upcastAlso) {\r\n    yield { model, view };\r\n    if (upcastAlso) {\r\n        for (const upcastAlsoItem of toArray(upcastAlso)) {\r\n            yield { model, view: upcastAlsoItem };\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/operation/operation\r\n */\r\n/**\r\n * Abstract base operation class.\r\n */\r\nexport default class Operation {\r\n    /**\r\n     * Base operation constructor.\r\n     *\r\n     * @param baseVersion Document {@link module:engine/model/document~Document#version} on which operation\r\n     * can be applied or `null` if the operation operates on detached (non-document) tree.\r\n     */\r\n    constructor(baseVersion) {\r\n        this.baseVersion = baseVersion;\r\n        this.isDocumentOperation = this.baseVersion !== null;\r\n        this.batch = null;\r\n    }\r\n    /**\r\n     * Checks whether the operation's parameters are correct and the operation can be correctly executed. Throws\r\n     * an error if operation is not valid.\r\n     *\r\n     * @internal\r\n     */\r\n    _validate() {\r\n    }\r\n    /**\r\n     * Custom toJSON method to solve child-parent circular dependencies.\r\n     *\r\n     * @returns Clone of this object with the operation property replaced with string.\r\n     */\r\n    toJSON() {\r\n        // This method creates only a shallow copy, all nested objects should be defined separately.\r\n        // See https://github.com/ckeditor/ckeditor5-engine/issues/1477.\r\n        const json = Object.assign({}, this);\r\n        json.__className = this.constructor.className;\r\n        // Remove reference to the parent `Batch` to avoid circular dependencies.\r\n        delete json.batch;\r\n        // Only document operations are shared with other clients so it is not necessary to keep this information.\r\n        delete json.isDocumentOperation;\r\n        return json;\r\n    }\r\n    /**\r\n     * Name of the operation class used for serialization.\r\n     */\r\n    static get className() {\r\n        return 'Operation';\r\n    }\r\n    /**\r\n     * Creates `Operation` object from deserialized object, i.e. from parsed JSON string.\r\n     *\r\n     * @param json Deserialized JSON object.\r\n     * @param doc Document on which this operation will be applied.\r\n     */\r\n    static fromJSON(json, document) {\r\n        return new this(json.baseVersion);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/operation/utils\r\n */\r\nimport Node from '../node';\r\nimport Range from '../range';\r\nimport Text from '../text';\r\nimport TextProxy from '../textproxy';\r\nimport { CKEditorError, isIterable } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Inserts given nodes at given position.\r\n *\r\n * @internal\r\n * @param position Position at which nodes should be inserted.\r\n * @param normalizedNodes Nodes to insert.\r\n * @returns Range spanning over inserted elements.\r\n */\r\nexport function _insert(position, nodes) {\r\n    const normalizedNodes = _normalizeNodes(nodes);\r\n    // We have to count offset before inserting nodes because they can get merged and we would get wrong offsets.\r\n    const offset = normalizedNodes.reduce((sum, node) => sum + node.offsetSize, 0);\r\n    const parent = position.parent;\r\n    // Insertion might be in a text node, we should split it if that's the case.\r\n    _splitNodeAtPosition(position);\r\n    const index = position.index;\r\n    // Insert nodes at given index. After splitting we have a proper index and insertion is between nodes,\r\n    // using basic `Element` API.\r\n    parent._insertChild(index, normalizedNodes);\r\n    // Merge text nodes, if possible. Merging is needed only at points where inserted nodes \"touch\" \"old\" nodes.\r\n    _mergeNodesAtIndex(parent, index + normalizedNodes.length);\r\n    _mergeNodesAtIndex(parent, index);\r\n    return new Range(position, position.getShiftedBy(offset));\r\n}\r\n/**\r\n * Removed nodes in given range. Only {@link module:engine/model/range~Range#isFlat flat} ranges are accepted.\r\n *\r\n * @internal\r\n * @param range Range containing nodes to remove.\r\n */\r\nexport function _remove(range) {\r\n    if (!range.isFlat) {\r\n        /**\r\n         * Trying to remove a range which starts and ends in different element.\r\n         *\r\n         * @error operation-utils-remove-range-not-flat\r\n         */\r\n        throw new CKEditorError('operation-utils-remove-range-not-flat', this);\r\n    }\r\n    const parent = range.start.parent;\r\n    // Range may be inside text nodes, we have to split them if that's the case.\r\n    _splitNodeAtPosition(range.start);\r\n    _splitNodeAtPosition(range.end);\r\n    // Remove the text nodes using basic `Element` API.\r\n    const removed = parent._removeChildren(range.start.index, range.end.index - range.start.index);\r\n    // Merge text nodes, if possible. After some nodes were removed, node before and after removed range will be\r\n    // touching at the position equal to the removed range beginning. We check merging possibility there.\r\n    _mergeNodesAtIndex(parent, range.start.index);\r\n    return removed;\r\n}\r\n/**\r\n * Moves nodes in given range to given target position. Only {@link module:engine/model/range~Range#isFlat flat} ranges are accepted.\r\n *\r\n * @internal\r\n * @param sourceRange Range containing nodes to move.\r\n * @param targetPosition Position to which nodes should be moved.\r\n * @returns Range containing moved nodes.\r\n */\r\nexport function _move(sourceRange, targetPosition) {\r\n    if (!sourceRange.isFlat) {\r\n        /**\r\n         * Trying to move a range which starts and ends in different element.\r\n         *\r\n         * @error operation-utils-move-range-not-flat\r\n         */\r\n        throw new CKEditorError('operation-utils-move-range-not-flat', this);\r\n    }\r\n    const nodes = _remove(sourceRange);\r\n    // We have to fix `targetPosition` because model changed after nodes from `sourceRange` got removed and\r\n    // that change might have an impact on `targetPosition`.\r\n    targetPosition = targetPosition._getTransformedByDeletion(sourceRange.start, sourceRange.end.offset - sourceRange.start.offset);\r\n    return _insert(targetPosition, nodes);\r\n}\r\n/**\r\n * Sets given attribute on nodes in given range. The attributes are only set on top-level nodes of the range, not on its children.\r\n *\r\n * @internal\r\n * @param range Range containing nodes that should have the attribute set. Must be a flat range.\r\n * @param key Key of attribute to set.\r\n * @param value Attribute value.\r\n */\r\nexport function _setAttribute(range, key, value) {\r\n    // Range might start or end in text nodes, so we have to split them.\r\n    _splitNodeAtPosition(range.start);\r\n    _splitNodeAtPosition(range.end);\r\n    // Iterate over all items in the range.\r\n    for (const item of range.getItems({ shallow: true })) {\r\n        // Iterator will return `TextProxy` instances but we know that those text proxies will\r\n        // always represent full text nodes (this is guaranteed thanks to splitting we did before).\r\n        // So, we can operate on those text proxies' text nodes.\r\n        const node = item.is('$textProxy') ? item.textNode : item;\r\n        if (value !== null) {\r\n            node._setAttribute(key, value);\r\n        }\r\n        else {\r\n            node._removeAttribute(key);\r\n        }\r\n        // After attributes changing it may happen that some text nodes can be merged. Try to merge with previous node.\r\n        _mergeNodesAtIndex(node.parent, node.index);\r\n    }\r\n    // Try to merge last changed node with it's previous sibling (not covered by the loop above).\r\n    _mergeNodesAtIndex(range.end.parent, range.end.index);\r\n}\r\n/**\r\n * Normalizes given object or an array of objects to an array of {@link module:engine/model/node~Node nodes}. See\r\n * {@link ~NodeSet NodeSet} for details on how normalization is performed.\r\n *\r\n * @internal\r\n * @param nodes Objects to normalize.\r\n * @returns Normalized nodes.\r\n */\r\nexport function _normalizeNodes(nodes) {\r\n    const normalized = [];\r\n    function convert(nodes) {\r\n        if (typeof nodes == 'string') {\r\n            normalized.push(new Text(nodes));\r\n        }\r\n        else if (nodes instanceof TextProxy) {\r\n            normalized.push(new Text(nodes.data, nodes.getAttributes()));\r\n        }\r\n        else if (nodes instanceof Node) {\r\n            normalized.push(nodes);\r\n        }\r\n        else if (isIterable(nodes)) {\r\n            for (const node of nodes) {\r\n                convert(node);\r\n            }\r\n        }\r\n        // Skip unrecognized type.\r\n    }\r\n    convert(nodes);\r\n    // Merge text nodes.\r\n    for (let i = 1; i < normalized.length; i++) {\r\n        const node = normalized[i];\r\n        const prev = normalized[i - 1];\r\n        if (node instanceof Text && prev instanceof Text && _haveSameAttributes(node, prev)) {\r\n            // Doing this instead changing `prev.data` because `data` is readonly.\r\n            normalized.splice(i - 1, 2, new Text(prev.data + node.data, prev.getAttributes()));\r\n            i--;\r\n        }\r\n    }\r\n    return normalized;\r\n}\r\n/**\r\n * Checks if nodes before and after given index in given element are {@link module:engine/model/text~Text text nodes} and\r\n * merges them into one node if they have same attributes.\r\n *\r\n * Merging is done by removing two text nodes and inserting a new text node containing data from both merged text nodes.\r\n *\r\n * @param element Parent element of nodes to merge.\r\n * @param index Index between nodes to merge.\r\n */\r\nfunction _mergeNodesAtIndex(element, index) {\r\n    const nodeBefore = element.getChild(index - 1);\r\n    const nodeAfter = element.getChild(index);\r\n    // Check if both of those nodes are text objects with same attributes.\r\n    if (nodeBefore && nodeAfter && nodeBefore.is('$text') && nodeAfter.is('$text') && _haveSameAttributes(nodeBefore, nodeAfter)) {\r\n        // Append text of text node after index to the before one.\r\n        const mergedNode = new Text(nodeBefore.data + nodeAfter.data, nodeBefore.getAttributes());\r\n        // Remove separate text nodes.\r\n        element._removeChildren(index - 1, 2);\r\n        // Insert merged text node.\r\n        element._insertChild(index - 1, mergedNode);\r\n    }\r\n}\r\n/**\r\n * Checks if given position is in a text node, and if so, splits the text node in two text nodes, each of them\r\n * containing a part of original text node.\r\n *\r\n * @param position Position at which node should be split.\r\n */\r\nfunction _splitNodeAtPosition(position) {\r\n    const textNode = position.textNode;\r\n    const element = position.parent;\r\n    if (textNode) {\r\n        const offsetDiff = position.offset - textNode.startOffset;\r\n        const index = textNode.index;\r\n        element._removeChildren(index, 1);\r\n        const firstPart = new Text(textNode.data.substr(0, offsetDiff), textNode.getAttributes());\r\n        const secondPart = new Text(textNode.data.substr(offsetDiff), textNode.getAttributes());\r\n        element._insertChild(index, [firstPart, secondPart]);\r\n    }\r\n}\r\n/**\r\n * Checks whether two given nodes have same attributes.\r\n *\r\n * @param nodeA Node to check.\r\n * @param nodeB Node to check.\r\n * @returns `true` if nodes have same attributes, `false` otherwise.\r\n */\r\nfunction _haveSameAttributes(nodeA, nodeB) {\r\n    const iteratorA = nodeA.getAttributes();\r\n    const iteratorB = nodeB.getAttributes();\r\n    for (const attr of iteratorA) {\r\n        if (attr[1] !== nodeB.getAttribute(attr[0])) {\r\n            return false;\r\n        }\r\n        iteratorB.next();\r\n    }\r\n    return iteratorB.next().done;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/operation/moveoperation\r\n */\r\nimport Operation from './operation';\r\nimport Position from '../position';\r\nimport Range from '../range';\r\nimport { _move } from './utils';\r\nimport { CKEditorError, compareArrays } from '@ckeditor/ckeditor5-utils';\r\n// @if CK_DEBUG_ENGINE // const ModelRange = require( '../range' ).default;\r\n/**\r\n * Operation to move a range of {@link module:engine/model/item~Item model items}\r\n * to given {@link module:engine/model/position~Position target position}.\r\n */\r\nexport default class MoveOperation extends Operation {\r\n    /**\r\n     * Creates a move operation.\r\n     *\r\n     * @param sourcePosition Position before the first {@link module:engine/model/item~Item model item} to move.\r\n     * @param howMany Offset size of moved range. Moved range will start from `sourcePosition` and end at\r\n     * `sourcePosition` with offset shifted by `howMany`.\r\n     * @param targetPosition Position at which moved nodes will be inserted.\r\n     * @param baseVersion Document {@link module:engine/model/document~Document#version} on which operation\r\n     * can be applied or `null` if the operation operates on detached (non-document) tree.\r\n     */\r\n    constructor(sourcePosition, howMany, targetPosition, baseVersion) {\r\n        super(baseVersion);\r\n        this.sourcePosition = sourcePosition.clone();\r\n        // `'toNext'` because `sourcePosition` is a bit like a start of the moved range.\r\n        this.sourcePosition.stickiness = 'toNext';\r\n        this.howMany = howMany;\r\n        this.targetPosition = targetPosition.clone();\r\n        this.targetPosition.stickiness = 'toNone';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    get type() {\r\n        if (this.targetPosition.root.rootName == '$graveyard') {\r\n            return 'remove';\r\n        }\r\n        else if (this.sourcePosition.root.rootName == '$graveyard') {\r\n            return 'reinsert';\r\n        }\r\n        return 'move';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    get affectedSelectable() {\r\n        return [\r\n            Range._createFromPositionAndShift(this.sourcePosition, this.howMany),\r\n            Range._createFromPositionAndShift(this.targetPosition, 0)\r\n        ];\r\n    }\r\n    /**\r\n     * Creates and returns an operation that has the same parameters as this operation.\r\n     */\r\n    clone() {\r\n        return new MoveOperation(this.sourcePosition, this.howMany, this.targetPosition, this.baseVersion);\r\n    }\r\n    /**\r\n     * Returns the start position of the moved range after it got moved. This may be different than\r\n     * {@link module:engine/model/operation/moveoperation~MoveOperation#targetPosition} in some cases, i.e. when a range is moved\r\n     * inside the same parent but {@link module:engine/model/operation/moveoperation~MoveOperation#targetPosition targetPosition}\r\n     * is after {@link module:engine/model/operation/moveoperation~MoveOperation#sourcePosition sourcePosition}.\r\n     *\r\n     * ```\r\n     *  vv              vv\r\n     * abcdefg ===> adefbcg\r\n     *      ^          ^\r\n     *      targetPos  movedRangeStart\r\n     *      offset 6   offset 4\r\n     *```\r\n     */\r\n    getMovedRangeStart() {\r\n        return this.targetPosition._getTransformedByDeletion(this.sourcePosition, this.howMany);\r\n    }\r\n    /**\r\n     * See {@link module:engine/model/operation/operation~Operation#getReversed `Operation#getReversed()`}.\r\n     */\r\n    getReversed() {\r\n        const newTargetPosition = this.sourcePosition._getTransformedByInsertion(this.targetPosition, this.howMany);\r\n        return new MoveOperation(this.getMovedRangeStart(), this.howMany, newTargetPosition, this.baseVersion + 1);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     * @internal\r\n     */\r\n    _validate() {\r\n        const sourceElement = this.sourcePosition.parent;\r\n        const targetElement = this.targetPosition.parent;\r\n        const sourceOffset = this.sourcePosition.offset;\r\n        const targetOffset = this.targetPosition.offset;\r\n        // Validate whether move operation has correct parameters.\r\n        // Validation is pretty complex but move operation is one of the core ways to manipulate the document state.\r\n        // We expect that many errors might be connected with one of scenarios described below.\r\n        if (sourceOffset + this.howMany > sourceElement.maxOffset) {\r\n            /**\r\n             * The nodes which should be moved do not exist.\r\n             *\r\n             * @error move-operation-nodes-do-not-exist\r\n             */\r\n            throw new CKEditorError('move-operation-nodes-do-not-exist', this);\r\n        }\r\n        else if (sourceElement === targetElement && sourceOffset < targetOffset && targetOffset < sourceOffset + this.howMany) {\r\n            /**\r\n             * Trying to move a range of nodes into the middle of that range.\r\n             *\r\n             * @error move-operation-range-into-itself\r\n             */\r\n            throw new CKEditorError('move-operation-range-into-itself', this);\r\n        }\r\n        else if (this.sourcePosition.root == this.targetPosition.root) {\r\n            if (compareArrays(this.sourcePosition.getParentPath(), this.targetPosition.getParentPath()) == 'prefix') {\r\n                const i = this.sourcePosition.path.length - 1;\r\n                if (this.targetPosition.path[i] >= sourceOffset && this.targetPosition.path[i] < sourceOffset + this.howMany) {\r\n                    /**\r\n                     * Trying to move a range of nodes into one of nodes from that range.\r\n                     *\r\n                     * @error move-operation-node-into-itself\r\n                     */\r\n                    throw new CKEditorError('move-operation-node-into-itself', this);\r\n                }\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     * @internal\r\n     */\r\n    _execute() {\r\n        _move(Range._createFromPositionAndShift(this.sourcePosition, this.howMany), this.targetPosition);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    toJSON() {\r\n        const json = super.toJSON();\r\n        json.sourcePosition = this.sourcePosition.toJSON();\r\n        json.targetPosition = this.targetPosition.toJSON();\r\n        return json;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get className() {\r\n        return 'MoveOperation';\r\n    }\r\n    /**\r\n     * Creates `MoveOperation` object from deserialized object, i.e. from parsed JSON string.\r\n     *\r\n     * @param json Deserialized JSON object.\r\n     * @param document Document on which this operation will be applied.\r\n     */\r\n    static fromJSON(json, document) {\r\n        const sourcePosition = Position.fromJSON(json.sourcePosition, document);\r\n        const targetPosition = Position.fromJSON(json.targetPosition, document);\r\n        return new this(sourcePosition, json.howMany, targetPosition, json.baseVersion);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/operation/insertoperation\r\n */\r\nimport Operation from './operation';\r\nimport Position from '../position';\r\nimport NodeList from '../nodelist';\r\nimport MoveOperation from './moveoperation';\r\nimport { _insert, _normalizeNodes } from './utils';\r\nimport Text from '../text';\r\nimport Element from '../element';\r\nimport { CKEditorError } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Operation to insert one or more nodes at given position in the model.\r\n */\r\nexport default class InsertOperation extends Operation {\r\n    /**\r\n     * Creates an insert operation.\r\n     *\r\n     * @param position Position of insertion.\r\n     * @param nodes The list of nodes to be inserted.\r\n     * @param baseVersion Document {@link module:engine/model/document~Document#version} on which operation\r\n     * can be applied or `null` if the operation operates on detached (non-document) tree.\r\n     */\r\n    constructor(position, nodes, baseVersion) {\r\n        super(baseVersion);\r\n        this.position = position.clone();\r\n        this.position.stickiness = 'toNone';\r\n        this.nodes = new NodeList(_normalizeNodes(nodes));\r\n        this.shouldReceiveAttributes = false;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    get type() {\r\n        return 'insert';\r\n    }\r\n    /**\r\n     * Total offset size of inserted nodes.\r\n     */\r\n    get howMany() {\r\n        return this.nodes.maxOffset;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    get affectedSelectable() {\r\n        return this.position.clone();\r\n    }\r\n    /**\r\n     * Creates and returns an operation that has the same parameters as this operation.\r\n     */\r\n    clone() {\r\n        const nodes = new NodeList([...this.nodes].map(node => node._clone(true)));\r\n        const insert = new InsertOperation(this.position, nodes, this.baseVersion);\r\n        insert.shouldReceiveAttributes = this.shouldReceiveAttributes;\r\n        return insert;\r\n    }\r\n    /**\r\n     * See {@link module:engine/model/operation/operation~Operation#getReversed `Operation#getReversed()`}.\r\n     */\r\n    getReversed() {\r\n        const graveyard = this.position.root.document.graveyard;\r\n        const gyPosition = new Position(graveyard, [0]);\r\n        return new MoveOperation(this.position, this.nodes.maxOffset, gyPosition, this.baseVersion + 1);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     * @internal\r\n     */\r\n    _validate() {\r\n        const targetElement = this.position.parent;\r\n        if (!targetElement || targetElement.maxOffset < this.position.offset) {\r\n            /**\r\n             * Insertion position is invalid.\r\n             *\r\n             * @error insert-operation-position-invalid\r\n             */\r\n            throw new CKEditorError('insert-operation-position-invalid', this);\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     * @internal\r\n     */\r\n    _execute() {\r\n        // What happens here is that we want original nodes be passed to writer because we want original nodes\r\n        // to be inserted to the model. But in InsertOperation, we want to keep those nodes as they were added\r\n        // to the operation, not modified. For example, text nodes can get merged or cropped while Elements can\r\n        // get children. It is important that InsertOperation has the copy of original nodes in intact state.\r\n        const originalNodes = this.nodes;\r\n        this.nodes = new NodeList([...originalNodes].map(node => node._clone(true)));\r\n        _insert(this.position, originalNodes);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    toJSON() {\r\n        const json = super.toJSON();\r\n        json.position = this.position.toJSON();\r\n        json.nodes = this.nodes.toJSON();\r\n        return json;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get className() {\r\n        return 'InsertOperation';\r\n    }\r\n    /**\r\n     * Creates `InsertOperation` object from deserialized object, i.e. from parsed JSON string.\r\n     *\r\n     * @param json Deserialized JSON object.\r\n     * @param document Document on which this operation will be applied.\r\n     */\r\n    static fromJSON(json, document) {\r\n        const children = [];\r\n        for (const child of json.nodes) {\r\n            if (child.name) {\r\n                // If child has name property, it is an Element.\r\n                children.push(Element.fromJSON(child));\r\n            }\r\n            else {\r\n                // Otherwise, it is a Text node.\r\n                children.push(Text.fromJSON(child));\r\n            }\r\n        }\r\n        const insert = new InsertOperation(Position.fromJSON(json.position, document), children, json.baseVersion);\r\n        insert.shouldReceiveAttributes = json.shouldReceiveAttributes;\r\n        return insert;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/operation/splitoperation\r\n */\r\nimport Operation from './operation';\r\nimport MergeOperation from './mergeoperation';\r\nimport Position from '../position';\r\nimport Range from '../range';\r\nimport { _insert, _move } from './utils';\r\nimport { CKEditorError } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Operation to split {@link module:engine/model/element~Element an element} at given\r\n * {@link module:engine/model/operation/splitoperation~SplitOperation#splitPosition split position} into two elements,\r\n * both containing a part of the element's original content.\r\n */\r\nexport default class SplitOperation extends Operation {\r\n    /**\r\n     * Creates a split operation.\r\n     *\r\n     * @param splitPosition Position at which an element should be split.\r\n     * @param howMany Total offset size of elements that are in the split element after `position`.\r\n     * @param insertionPosition Position at which the clone of split element (or element from graveyard) will be inserted.\r\n     * @param graveyardPosition Position in the graveyard root before the element which\r\n     * should be used as a parent of the nodes after `position`. If it is not set, a copy of the the `position` parent will be used.\r\n     * @param baseVersion Document {@link module:engine/model/document~Document#version} on which operation\r\n     * can be applied or `null` if the operation operates on detached (non-document) tree.\r\n     */\r\n    constructor(splitPosition, howMany, insertionPosition, graveyardPosition, baseVersion) {\r\n        super(baseVersion);\r\n        this.splitPosition = splitPosition.clone();\r\n        // Keep position sticking to the next node. This way any new content added at the place where the element is split\r\n        // will be left in the original element.\r\n        this.splitPosition.stickiness = 'toNext';\r\n        this.howMany = howMany;\r\n        this.insertionPosition = insertionPosition;\r\n        this.graveyardPosition = graveyardPosition ? graveyardPosition.clone() : null;\r\n        if (this.graveyardPosition) {\r\n            this.graveyardPosition.stickiness = 'toNext';\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    get type() {\r\n        return 'split';\r\n    }\r\n    /**\r\n     * Position inside the new clone of a split element.\r\n     *\r\n     * This is a position where nodes that are after the split position will be moved to.\r\n     */\r\n    get moveTargetPosition() {\r\n        const path = this.insertionPosition.path.slice();\r\n        path.push(0);\r\n        return new Position(this.insertionPosition.root, path);\r\n    }\r\n    /**\r\n     * Artificial range that contains all the nodes from the split element that will be moved to the new element.\r\n     * The range starts at {@link #splitPosition} and ends in the same parent, at `POSITIVE_INFINITY` offset.\r\n     */\r\n    get movedRange() {\r\n        const end = this.splitPosition.getShiftedBy(Number.POSITIVE_INFINITY);\r\n        return new Range(this.splitPosition, end);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    get affectedSelectable() {\r\n        // These could be positions but `Selectable` type only supports `Iterable<Range>`.\r\n        const ranges = [\r\n            Range._createFromPositionAndShift(this.splitPosition, 0),\r\n            Range._createFromPositionAndShift(this.insertionPosition, 0)\r\n        ];\r\n        if (this.graveyardPosition) {\r\n            ranges.push(Range._createFromPositionAndShift(this.graveyardPosition, 0));\r\n        }\r\n        return ranges;\r\n    }\r\n    /**\r\n     * Creates and returns an operation that has the same parameters as this operation.\r\n     *\r\n     * @returns Clone of this operation.\r\n     */\r\n    clone() {\r\n        return new SplitOperation(this.splitPosition, this.howMany, this.insertionPosition, this.graveyardPosition, this.baseVersion);\r\n    }\r\n    /**\r\n     * See {@link module:engine/model/operation/operation~Operation#getReversed `Operation#getReversed()`}.\r\n     */\r\n    getReversed() {\r\n        const graveyard = this.splitPosition.root.document.graveyard;\r\n        const graveyardPosition = new Position(graveyard, [0]);\r\n        return new MergeOperation(this.moveTargetPosition, this.howMany, this.splitPosition, graveyardPosition, this.baseVersion + 1);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     * @internal\r\n     */\r\n    _validate() {\r\n        const element = this.splitPosition.parent;\r\n        const offset = this.splitPosition.offset;\r\n        // Validate whether split operation has correct parameters.\r\n        if (!element || element.maxOffset < offset) {\r\n            /**\r\n             * Split position is invalid.\r\n             *\r\n             * @error split-operation-position-invalid\r\n             */\r\n            throw new CKEditorError('split-operation-position-invalid', this);\r\n        }\r\n        else if (!element.parent) {\r\n            /**\r\n             * Cannot split root element.\r\n             *\r\n             * @error split-operation-split-in-root\r\n             */\r\n            throw new CKEditorError('split-operation-split-in-root', this);\r\n        }\r\n        else if (this.howMany != element.maxOffset - this.splitPosition.offset) {\r\n            /**\r\n             * Split operation specifies wrong number of nodes to move.\r\n             *\r\n             * @error split-operation-how-many-invalid\r\n             */\r\n            throw new CKEditorError('split-operation-how-many-invalid', this);\r\n        }\r\n        else if (this.graveyardPosition && !this.graveyardPosition.nodeAfter) {\r\n            /**\r\n             * Graveyard position invalid.\r\n             *\r\n             * @error split-operation-graveyard-position-invalid\r\n             */\r\n            throw new CKEditorError('split-operation-graveyard-position-invalid', this);\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     * @internal\r\n     */\r\n    _execute() {\r\n        const splitElement = this.splitPosition.parent;\r\n        if (this.graveyardPosition) {\r\n            _move(Range._createFromPositionAndShift(this.graveyardPosition, 1), this.insertionPosition);\r\n        }\r\n        else {\r\n            const newElement = splitElement._clone();\r\n            _insert(this.insertionPosition, newElement);\r\n        }\r\n        const sourceRange = new Range(Position._createAt(splitElement, this.splitPosition.offset), Position._createAt(splitElement, splitElement.maxOffset));\r\n        _move(sourceRange, this.moveTargetPosition);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    toJSON() {\r\n        const json = super.toJSON();\r\n        json.splitPosition = this.splitPosition.toJSON();\r\n        json.insertionPosition = this.insertionPosition.toJSON();\r\n        if (this.graveyardPosition) {\r\n            json.graveyardPosition = this.graveyardPosition.toJSON();\r\n        }\r\n        return json;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get className() {\r\n        return 'SplitOperation';\r\n    }\r\n    /**\r\n     * Helper function that returns a default insertion position basing on given `splitPosition`. The default insertion\r\n     * position is after the split element.\r\n     */\r\n    static getInsertionPosition(splitPosition) {\r\n        const path = splitPosition.path.slice(0, -1);\r\n        path[path.length - 1]++;\r\n        return new Position(splitPosition.root, path, 'toPrevious');\r\n    }\r\n    /**\r\n     * Creates `SplitOperation` object from deserialized object, i.e. from parsed JSON string.\r\n     *\r\n     * @param json Deserialized JSON object.\r\n     * @param document Document on which this operation will be applied.\r\n     */\r\n    static fromJSON(json, document) {\r\n        const splitPosition = Position.fromJSON(json.splitPosition, document);\r\n        const insertionPosition = Position.fromJSON(json.insertionPosition, document);\r\n        const graveyardPosition = json.graveyardPosition ? Position.fromJSON(json.graveyardPosition, document) : null;\r\n        return new this(splitPosition, json.howMany, insertionPosition, graveyardPosition, json.baseVersion);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/operation/mergeoperation\r\n */\r\nimport Operation from './operation';\r\nimport SplitOperation from './splitoperation';\r\nimport Position from '../position';\r\nimport Range from '../range';\r\nimport { _move } from './utils';\r\nimport { CKEditorError } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Operation to merge two {@link module:engine/model/element~Element elements}.\r\n *\r\n * The merged element is the parent of {@link ~MergeOperation#sourcePosition} and it is merged into the parent of\r\n * {@link ~MergeOperation#targetPosition}. All nodes from the merged element are moved to {@link ~MergeOperation#targetPosition}.\r\n *\r\n * The merged element is moved to the graveyard at {@link ~MergeOperation#graveyardPosition}.\r\n */\r\nexport default class MergeOperation extends Operation {\r\n    /**\r\n     * Creates a merge operation.\r\n     *\r\n     * @param sourcePosition Position inside the merged element. All nodes from that\r\n     * element after that position will be moved to {@link #targetPosition}.\r\n     * @param howMany Summary offset size of nodes which will be moved from the merged element to the new parent.\r\n     * @param targetPosition Position which the nodes from the merged elements will be moved to.\r\n     * @param graveyardPosition Position in graveyard to which the merged element will be moved.\r\n     * @param baseVersion Document {@link module:engine/model/document~Document#version} on which operation\r\n     * can be applied or `null` if the operation operates on detached (non-document) tree.\r\n     */\r\n    constructor(sourcePosition, howMany, targetPosition, graveyardPosition, baseVersion) {\r\n        super(baseVersion);\r\n        this.sourcePosition = sourcePosition.clone();\r\n        // This is, and should always remain, the first position in its parent.\r\n        this.sourcePosition.stickiness = 'toPrevious';\r\n        this.howMany = howMany;\r\n        this.targetPosition = targetPosition.clone();\r\n        // Except of a rare scenario in `MergeOperation` x `MergeOperation` transformation,\r\n        // this is, and should always remain, the last position in its parent.\r\n        this.targetPosition.stickiness = 'toNext';\r\n        this.graveyardPosition = graveyardPosition.clone();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    get type() {\r\n        return 'merge';\r\n    }\r\n    /**\r\n     * Position before the merged element (which will be deleted).\r\n     */\r\n    get deletionPosition() {\r\n        return new Position(this.sourcePosition.root, this.sourcePosition.path.slice(0, -1));\r\n    }\r\n    /**\r\n     * Artificial range that contains all the nodes from the merged element that will be moved to {@link ~MergeOperation#sourcePosition}.\r\n     * The range starts at {@link ~MergeOperation#sourcePosition} and ends in the same parent, at `POSITIVE_INFINITY` offset.\r\n     */\r\n    get movedRange() {\r\n        const end = this.sourcePosition.getShiftedBy(Number.POSITIVE_INFINITY);\r\n        return new Range(this.sourcePosition, end);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    get affectedSelectable() {\r\n        const mergedElement = this.sourcePosition.parent;\r\n        return [\r\n            Range._createOn(mergedElement),\r\n            // These could be positions but `Selectable` type only supports `Iterable<Range>`.\r\n            Range._createFromPositionAndShift(this.targetPosition, 0),\r\n            Range._createFromPositionAndShift(this.graveyardPosition, 0)\r\n        ];\r\n    }\r\n    /**\r\n     * Creates and returns an operation that has the same parameters as this operation.\r\n     */\r\n    clone() {\r\n        return new MergeOperation(this.sourcePosition, this.howMany, this.targetPosition, this.graveyardPosition, this.baseVersion);\r\n    }\r\n    /**\r\n     * See {@link module:engine/model/operation/operation~Operation#getReversed `Operation#getReversed()`}.\r\n     */\r\n    getReversed() {\r\n        // Positions in this method are transformed by this merge operation because the split operation bases on\r\n        // the context after this merge operation happened (because split operation reverses it).\r\n        // So we need to acknowledge that the merge operation happened and those positions changed a little.\r\n        const targetPosition = this.targetPosition._getTransformedByMergeOperation(this);\r\n        const path = this.sourcePosition.path.slice(0, -1);\r\n        const insertionPosition = new Position(this.sourcePosition.root, path)._getTransformedByMergeOperation(this);\r\n        return new SplitOperation(targetPosition, this.howMany, insertionPosition, this.graveyardPosition, this.baseVersion + 1);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     * @internal\r\n     */\r\n    _validate() {\r\n        const sourceElement = this.sourcePosition.parent;\r\n        const targetElement = this.targetPosition.parent;\r\n        // Validate whether merge operation has correct parameters.\r\n        if (!sourceElement.parent) {\r\n            /**\r\n             * Merge source position is invalid. The element to be merged must have a parent node.\r\n             *\r\n             * @error merge-operation-source-position-invalid\r\n             */\r\n            throw new CKEditorError('merge-operation-source-position-invalid', this);\r\n        }\r\n        else if (!targetElement.parent) {\r\n            /**\r\n             * Merge target position is invalid. The element to be merged must have a parent node.\r\n             *\r\n             * @error merge-operation-target-position-invalid\r\n             */\r\n            throw new CKEditorError('merge-operation-target-position-invalid', this);\r\n        }\r\n        else if (this.howMany != sourceElement.maxOffset) {\r\n            /**\r\n             * Merge operation specifies wrong number of nodes to move.\r\n             *\r\n             * @error merge-operation-how-many-invalid\r\n             */\r\n            throw new CKEditorError('merge-operation-how-many-invalid', this);\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     * @internal\r\n     */\r\n    _execute() {\r\n        const mergedElement = this.sourcePosition.parent;\r\n        const sourceRange = Range._createIn(mergedElement);\r\n        _move(sourceRange, this.targetPosition);\r\n        _move(Range._createOn(mergedElement), this.graveyardPosition);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    toJSON() {\r\n        const json = super.toJSON();\r\n        json.sourcePosition = json.sourcePosition.toJSON();\r\n        json.targetPosition = json.targetPosition.toJSON();\r\n        json.graveyardPosition = json.graveyardPosition.toJSON();\r\n        return json;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get className() {\r\n        return 'MergeOperation';\r\n    }\r\n    /**\r\n     * Creates `MergeOperation` object from deserialized object, i.e. from parsed JSON string.\r\n     *\r\n     * @param json Deserialized JSON object.\r\n     * @param document Document on which this operation will be applied.\r\n     */\r\n    static fromJSON(json, document) {\r\n        const sourcePosition = Position.fromJSON(json.sourcePosition, document);\r\n        const targetPosition = Position.fromJSON(json.targetPosition, document);\r\n        const graveyardPosition = Position.fromJSON(json.graveyardPosition, document);\r\n        return new this(sourcePosition, json.howMany, targetPosition, graveyardPosition, json.baseVersion);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/operation/markeroperation\r\n */\r\nimport Operation from './operation';\r\nimport Range from '../range';\r\nexport default class MarkerOperation extends Operation {\r\n    /**\r\n     * @param name Marker name.\r\n     * @param oldRange Marker range before the change.\r\n     * @param newRange Marker range after the change.\r\n     * @param markers Marker collection on which change should be executed.\r\n     * @param affectsData Specifies whether the marker operation affects the data produced by the data pipeline\r\n     * (is persisted in the editor's data).\r\n     * @param baseVersion Document {@link module:engine/model/document~Document#version} on which operation\r\n     * can be applied or `null` if the operation operates on detached (non-document) tree.\r\n     */\r\n    constructor(name, oldRange, newRange, markers, affectsData, baseVersion) {\r\n        super(baseVersion);\r\n        this.name = name;\r\n        this.oldRange = oldRange ? oldRange.clone() : null;\r\n        this.newRange = newRange ? newRange.clone() : null;\r\n        this.affectsData = affectsData;\r\n        this._markers = markers;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    get type() {\r\n        return 'marker';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    get affectedSelectable() {\r\n        const ranges = [];\r\n        if (this.oldRange) {\r\n            ranges.push(this.oldRange.clone());\r\n        }\r\n        if (this.newRange) {\r\n            if (this.oldRange) {\r\n                ranges.push(...this.newRange.getDifference(this.oldRange));\r\n            }\r\n            else {\r\n                ranges.push(this.newRange.clone());\r\n            }\r\n        }\r\n        return ranges;\r\n    }\r\n    /**\r\n     * Creates and returns an operation that has the same parameters as this operation.\r\n     */\r\n    clone() {\r\n        return new MarkerOperation(this.name, this.oldRange, this.newRange, this._markers, this.affectsData, this.baseVersion);\r\n    }\r\n    /**\r\n     * See {@link module:engine/model/operation/operation~Operation#getReversed `Operation#getReversed()`}.\r\n     */\r\n    getReversed() {\r\n        return new MarkerOperation(this.name, this.newRange, this.oldRange, this._markers, this.affectsData, this.baseVersion + 1);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     * @internal\r\n     */\r\n    _execute() {\r\n        if (this.newRange) {\r\n            this._markers._set(this.name, this.newRange, true, this.affectsData);\r\n        }\r\n        else {\r\n            this._markers._remove(this.name);\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     * @internal\r\n     */\r\n    toJSON() {\r\n        const json = super.toJSON();\r\n        if (this.oldRange) {\r\n            json.oldRange = this.oldRange.toJSON();\r\n        }\r\n        if (this.newRange) {\r\n            json.newRange = this.newRange.toJSON();\r\n        }\r\n        delete json._markers;\r\n        return json;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get className() {\r\n        return 'MarkerOperation';\r\n    }\r\n    /**\r\n     * Creates `MarkerOperation` object from deserialized object, i.e. from parsed JSON string.\r\n     *\r\n     * @param json Deserialized JSON object.\r\n     * @param document Document on which this operation will be applied.\r\n     */\r\n    static fromJSON(json, document) {\r\n        return new MarkerOperation(json.name, json.oldRange ? Range.fromJSON(json.oldRange, document) : null, json.newRange ? Range.fromJSON(json.newRange, document) : null, document.model.markers, json.affectsData, json.baseVersion);\r\n    }\r\n}\r\n","import baseIsEqual from './_baseIsEqual.js';\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\nfunction isEqual(value, other) {\n  return baseIsEqual(value, other);\n}\n\nexport default isEqual;\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/operation/attributeoperation\r\n */\r\nimport Operation from './operation';\r\nimport { _setAttribute } from './utils';\r\nimport Range from '../range';\r\nimport { CKEditorError } from '@ckeditor/ckeditor5-utils';\r\nimport { isEqual } from 'lodash-es';\r\n/**\r\n * Operation to change nodes' attribute.\r\n *\r\n * Using this class you can add, remove or change value of the attribute.\r\n */\r\nexport default class AttributeOperation extends Operation {\r\n    /**\r\n     * Creates an operation that changes, removes or adds attributes.\r\n     *\r\n     * If only `newValue` is set, attribute will be added on a node. Note that all nodes in operation's range must not\r\n     * have an attribute with the same key as the added attribute.\r\n     *\r\n     * If only `oldValue` is set, then attribute with given key will be removed. Note that all nodes in operation's range\r\n     * must have an attribute with that key added.\r\n     *\r\n     * If both `newValue` and `oldValue` are set, then the operation will change the attribute value. Note that all nodes in\r\n     * operation's ranges must already have an attribute with given key and `oldValue` as value\r\n     *\r\n     * @param range Range on which the operation should be applied. Must be a flat range.\r\n     * @param key Key of an attribute to change or remove.\r\n     * @param oldValue Old value of the attribute with given key or `null`, if attribute was not set before.\r\n     * @param newValue New value of the attribute with given key or `null`, if operation should remove attribute.\r\n     * @param baseVersion Document {@link module:engine/model/document~Document#version} on which operation\r\n     * can be applied or `null` if the operation operates on detached (non-document) tree.\r\n     */\r\n    constructor(range, key, oldValue, newValue, baseVersion) {\r\n        super(baseVersion);\r\n        this.range = range.clone();\r\n        this.key = key;\r\n        this.oldValue = oldValue === undefined ? null : oldValue;\r\n        this.newValue = newValue === undefined ? null : newValue;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    get type() {\r\n        if (this.oldValue === null) {\r\n            return 'addAttribute';\r\n        }\r\n        else if (this.newValue === null) {\r\n            return 'removeAttribute';\r\n        }\r\n        else {\r\n            return 'changeAttribute';\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    get affectedSelectable() {\r\n        return this.range.clone();\r\n    }\r\n    /**\r\n     * Creates and returns an operation that has the same parameters as this operation.\r\n     */\r\n    clone() {\r\n        return new AttributeOperation(this.range, this.key, this.oldValue, this.newValue, this.baseVersion);\r\n    }\r\n    /**\r\n     * See {@link module:engine/model/operation/operation~Operation#getReversed `Operation#getReversed()`}.\r\n     */\r\n    getReversed() {\r\n        return new AttributeOperation(this.range, this.key, this.newValue, this.oldValue, this.baseVersion + 1);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    toJSON() {\r\n        const json = super.toJSON();\r\n        json.range = this.range.toJSON();\r\n        return json;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     * @internal\r\n     */\r\n    _validate() {\r\n        if (!this.range.isFlat) {\r\n            /**\r\n             * The range to change is not flat.\r\n             *\r\n             * @error attribute-operation-range-not-flat\r\n             */\r\n            throw new CKEditorError('attribute-operation-range-not-flat', this);\r\n        }\r\n        for (const item of this.range.getItems({ shallow: true })) {\r\n            if (this.oldValue !== null && !isEqual(item.getAttribute(this.key), this.oldValue)) {\r\n                /**\r\n                 * Changed node has different attribute value than operation's old attribute value.\r\n                 *\r\n                 * @error attribute-operation-wrong-old-value\r\n                 * @param item\r\n                 * @param key\r\n                 * @param value\r\n                 */\r\n                throw new CKEditorError('attribute-operation-wrong-old-value', this, { item, key: this.key, value: this.oldValue });\r\n            }\r\n            if (this.oldValue === null && this.newValue !== null && item.hasAttribute(this.key)) {\r\n                /**\r\n                 * The attribute with given key already exists for the given node.\r\n                 *\r\n                 * @error attribute-operation-attribute-exists\r\n                 * @param node\r\n                 * @param key\r\n                 */\r\n                throw new CKEditorError('attribute-operation-attribute-exists', this, { node: item, key: this.key });\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     * @internal\r\n     */\r\n    _execute() {\r\n        // If value to set is same as old value, don't do anything.\r\n        if (!isEqual(this.oldValue, this.newValue)) {\r\n            // Execution.\r\n            _setAttribute(this.range, this.key, this.newValue);\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get className() {\r\n        return 'AttributeOperation';\r\n    }\r\n    /**\r\n     * Creates `AttributeOperation` object from deserialized object, i.e. from parsed JSON string.\r\n     *\r\n     * @param json Deserialized JSON object.\r\n     * @param document Document on which this operation will be applied.\r\n     */\r\n    static fromJSON(json, document) {\r\n        return new AttributeOperation(Range.fromJSON(json.range, document), json.key, json.oldValue, json.newValue, json.baseVersion);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/operation/nooperation\r\n */\r\nimport Operation from './operation';\r\n/**\r\n * Operation which is doing nothing (\"empty operation\", \"do-nothing operation\", \"noop\"). This is an operation,\r\n * which when executed does not change the tree model. It still has some parameters defined for transformation purposes.\r\n *\r\n * In most cases this operation is a result of transforming operations. When transformation returns\r\n * {@link module:engine/model/operation/nooperation~NoOperation} it means that changes done by the transformed operation\r\n * have already been applied.\r\n */\r\nexport default class NoOperation extends Operation {\r\n    get type() {\r\n        return 'noop';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    get affectedSelectable() {\r\n        return null;\r\n    }\r\n    /**\r\n     * Creates and returns an operation that has the same parameters as this operation.\r\n     */\r\n    clone() {\r\n        return new NoOperation(this.baseVersion);\r\n    }\r\n    /**\r\n     * See {@link module:engine/model/operation/operation~Operation#getReversed `Operation#getReversed()`}.\r\n     */\r\n    getReversed() {\r\n        return new NoOperation(this.baseVersion + 1);\r\n    }\r\n    /** @internal */\r\n    _execute() {\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get className() {\r\n        return 'NoOperation';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/operation/renameoperation\r\n */\r\nimport Operation from './operation';\r\nimport Element from '../element';\r\nimport Position from '../position';\r\nimport { CKEditorError } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Operation to change element's name.\r\n *\r\n * Using this class you can change element's name.\r\n */\r\nexport default class RenameOperation extends Operation {\r\n    /**\r\n     * Creates an operation that changes element's name.\r\n     *\r\n     * @param position Position before an element to change.\r\n     * @param oldName Current name of the element.\r\n     * @param newName New name for the element.\r\n     * @param baseVersion Document {@link module:engine/model/document~Document#version} on which operation\r\n     * can be applied or `null` if the operation operates on detached (non-document) tree.\r\n     */\r\n    constructor(position, oldName, newName, baseVersion) {\r\n        super(baseVersion);\r\n        this.position = position;\r\n        // This position sticks to the next node because it is a position before the node that we want to change.\r\n        this.position.stickiness = 'toNext';\r\n        this.oldName = oldName;\r\n        this.newName = newName;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    get type() {\r\n        return 'rename';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    get affectedSelectable() {\r\n        return this.position.nodeAfter;\r\n    }\r\n    /**\r\n     * Creates and returns an operation that has the same parameters as this operation.\r\n     *\r\n     * @returns Clone of this operation.\r\n     */\r\n    clone() {\r\n        return new RenameOperation(this.position.clone(), this.oldName, this.newName, this.baseVersion);\r\n    }\r\n    /**\r\n     * See {@link module:engine/model/operation/operation~Operation#getReversed `Operation#getReversed()`}.\r\n     */\r\n    getReversed() {\r\n        return new RenameOperation(this.position.clone(), this.newName, this.oldName, this.baseVersion + 1);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     * @internal\r\n     */\r\n    _validate() {\r\n        const element = this.position.nodeAfter;\r\n        if (!(element instanceof Element)) {\r\n            /**\r\n             * Given position is invalid or node after it is not instance of Element.\r\n             *\r\n             * @error rename-operation-wrong-position\r\n             */\r\n            throw new CKEditorError('rename-operation-wrong-position', this);\r\n        }\r\n        else if (element.name !== this.oldName) {\r\n            /**\r\n             * Element to change has different name than operation's old name.\r\n             *\r\n             * @error rename-operation-wrong-name\r\n             */\r\n            throw new CKEditorError('rename-operation-wrong-name', this);\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     * @internal\r\n     */\r\n    _execute() {\r\n        const element = this.position.nodeAfter;\r\n        element.name = this.newName;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    toJSON() {\r\n        const json = super.toJSON();\r\n        json.position = this.position.toJSON();\r\n        return json;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get className() {\r\n        return 'RenameOperation';\r\n    }\r\n    /**\r\n     * Creates `RenameOperation` object from deserialized object, i.e. from parsed JSON string.\r\n     *\r\n     * @param json Deserialized JSON object.\r\n     * @param document Document on which this operation will be applied.\r\n     */\r\n    static fromJSON(json, document) {\r\n        return new RenameOperation(Position.fromJSON(json.position, document), json.oldName, json.newName, json.baseVersion);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/operation/rootattributeoperation\r\n */\r\nimport Operation from './operation';\r\nimport { CKEditorError } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Operation to change root element's attribute. Using this class you can add, remove or change value of the attribute.\r\n *\r\n * This operation is needed, because root elements can't be changed through\r\n * {@link module:engine/model/operation/attributeoperation~AttributeOperation}.\r\n * It is because {@link module:engine/model/operation/attributeoperation~AttributeOperation}\r\n * requires a range to change and root element can't\r\n * be a part of range because every {@link module:engine/model/position~Position} has to be inside a root.\r\n * {@link module:engine/model/position~Position} can't be created before a root element.\r\n */\r\nexport default class RootAttributeOperation extends Operation {\r\n    /**\r\n     * Creates an operation that changes, removes or adds attributes on root element.\r\n     *\r\n     * @see module:engine/model/operation/attributeoperation~AttributeOperation\r\n     * @param root Root element to change.\r\n     * @param key Key of an attribute to change or remove.\r\n     * @param oldValue Old value of the attribute with given key or `null`, if attribute was not set before.\r\n     * @param newValue New value of the attribute with given key or `null`, if operation should remove attribute.\r\n     * @param baseVersion Document {@link module:engine/model/document~Document#version} on which operation\r\n     * can be applied or `null` if the operation operates on detached (non-document) tree.\r\n     */\r\n    constructor(root, key, oldValue, newValue, baseVersion) {\r\n        super(baseVersion);\r\n        this.root = root;\r\n        this.key = key;\r\n        this.oldValue = oldValue === undefined ? null : oldValue;\r\n        this.newValue = newValue === undefined ? null : newValue;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    get type() {\r\n        if (this.oldValue === null) {\r\n            return 'addRootAttribute';\r\n        }\r\n        else if (this.newValue === null) {\r\n            return 'removeRootAttribute';\r\n        }\r\n        else {\r\n            return 'changeRootAttribute';\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    get affectedSelectable() {\r\n        return this.root;\r\n    }\r\n    /**\r\n     * Creates and returns an operation that has the same parameters as this operation.\r\n     *\r\n     * @returns Clone of this operation.\r\n     */\r\n    clone() {\r\n        return new RootAttributeOperation(this.root, this.key, this.oldValue, this.newValue, this.baseVersion);\r\n    }\r\n    /**\r\n     * See {@link module:engine/model/operation/operation~Operation#getReversed `Operation#getReversed()`}.\r\n     */\r\n    getReversed() {\r\n        return new RootAttributeOperation(this.root, this.key, this.newValue, this.oldValue, this.baseVersion + 1);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     * @internal\r\n     */\r\n    _validate() {\r\n        if (this.root != this.root.root || this.root.is('documentFragment')) {\r\n            /**\r\n             * The element to change is not a root element.\r\n             *\r\n             * @error rootattribute-operation-not-a-root\r\n             * @param root\r\n             * @param key\r\n             * @param value\r\n             */\r\n            throw new CKEditorError('rootattribute-operation-not-a-root', this, { root: this.root, key: this.key });\r\n        }\r\n        if (this.oldValue !== null && this.root.getAttribute(this.key) !== this.oldValue) {\r\n            /**\r\n             * The attribute which should be removed does not exist for the given node.\r\n             *\r\n             * @error rootattribute-operation-wrong-old-value\r\n             * @param root\r\n             * @param key\r\n             * @param value\r\n             */\r\n            throw new CKEditorError('rootattribute-operation-wrong-old-value', this, { root: this.root, key: this.key });\r\n        }\r\n        if (this.oldValue === null && this.newValue !== null && this.root.hasAttribute(this.key)) {\r\n            /**\r\n             * The attribute with given key already exists for the given node.\r\n             *\r\n             * @error rootattribute-operation-attribute-exists\r\n             * @param root\r\n             * @param key\r\n             */\r\n            throw new CKEditorError('rootattribute-operation-attribute-exists', this, { root: this.root, key: this.key });\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     * @internal\r\n     */\r\n    _execute() {\r\n        if (this.newValue !== null) {\r\n            this.root._setAttribute(this.key, this.newValue);\r\n        }\r\n        else {\r\n            this.root._removeAttribute(this.key);\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    toJSON() {\r\n        const json = super.toJSON();\r\n        json.root = this.root.toJSON();\r\n        return json;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get className() {\r\n        return 'RootAttributeOperation';\r\n    }\r\n    /**\r\n     * Creates `RootAttributeOperation` object from deserialized object, i.e. from parsed JSON string.\r\n     *\r\n     * @param json Deserialized JSON object.\r\n     * @param document Document on which this operation will be applied.\r\n     */\r\n    static fromJSON(json, document) {\r\n        if (!document.getRoot(json.root)) {\r\n            /**\r\n             * Cannot create RootAttributeOperation for document. Root with specified name does not exist.\r\n             *\r\n             * @error rootattribute-operation-fromjson-no-root\r\n             * @param rootName\r\n             */\r\n            throw new CKEditorError('rootattribute-operation-fromjson-no-root', this, { rootName: json.root });\r\n        }\r\n        return new RootAttributeOperation(document.getRoot(json.root), json.key, json.oldValue, json.newValue, json.baseVersion);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/operation/rootoperation\r\n */\r\nimport Operation from './operation';\r\nimport { CKEditorError } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Operation that creates (or attaches) or detaches a root element.\r\n */\r\nexport default class RootOperation extends Operation {\r\n    /**\r\n     * Creates an operation that creates or removes a root element.\r\n     *\r\n     * @param rootName Root name to create or detach.\r\n     * @param elementName Root element name.\r\n     * @param isAdd Specifies whether the operation adds (`true`) or detaches the root (`false`).\r\n     * @param document Document which owns the root.\r\n     * @param baseVersion Document {@link module:engine/model/document~Document#version} on which operation can be applied.\r\n     */\r\n    constructor(rootName, elementName, isAdd, document, baseVersion) {\r\n        super(baseVersion);\r\n        this.rootName = rootName;\r\n        this.elementName = elementName;\r\n        this.isAdd = isAdd;\r\n        this._document = document;\r\n        // Make sure that the root exists ASAP, this is important for RTC.\r\n        // If the root was dynamically added, there will be more operations that operate on/in this root.\r\n        // These operations will require root element instance (in operation property or in position instance).\r\n        // If the root is not created ahead of time, instantiating such operations may fail.\r\n        if (!this._document.getRoot(this.rootName)) {\r\n            const root = this._document.createRoot(this.elementName, this.rootName);\r\n            root._isAttached = false;\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    get type() {\r\n        return this.isAdd ? 'addRoot' : 'detachRoot';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    get affectedSelectable() {\r\n        return this._document.getRoot(this.rootName);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    clone() {\r\n        return new RootOperation(this.rootName, this.elementName, this.isAdd, this._document, this.baseVersion);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    getReversed() {\r\n        return new RootOperation(this.rootName, this.elementName, !this.isAdd, this._document, this.baseVersion + 1);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    _validate() {\r\n        // Keep in mind that at this point the root will always exist as it was created in the `constructor()`, even for detach operation.\r\n        const root = this._document.getRoot(this.rootName);\r\n        if (root.isAttached() && this.isAdd) {\r\n            /**\r\n             * Trying to attach a root that is already attached.\r\n             *\r\n             * @error root-operation-root-attached\r\n             */\r\n            throw new CKEditorError('root-operation-root-attached', this);\r\n        }\r\n        else if (!root.isAttached() && !this.isAdd) {\r\n            /**\r\n             * Trying to detach a root that is already detached.\r\n             *\r\n             * @error root-operation-root-detached\r\n             */\r\n            throw new CKEditorError('root-operation-root-detached', this);\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    _execute() {\r\n        this._document.getRoot(this.rootName)._isAttached = this.isAdd;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    toJSON() {\r\n        const json = super.toJSON();\r\n        delete json._document;\r\n        return json;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get className() {\r\n        return 'RootOperation';\r\n    }\r\n    /**\r\n     * Creates `RootOperation` object from deserialized object, i.e. from parsed JSON string.\r\n     *\r\n     * @param json Deserialized JSON object.\r\n     * @param document Document on which this operation will be applied.\r\n     */\r\n    static fromJSON(json, document) {\r\n        return new RootOperation(json.rootName, json.elementName, json.isAdd, document, json.baseVersion);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/operation/operationfactory\r\n */\r\nimport AttributeOperation from './attributeoperation';\r\nimport InsertOperation from './insertoperation';\r\nimport MarkerOperation from './markeroperation';\r\nimport MoveOperation from './moveoperation';\r\nimport NoOperation from './nooperation';\r\nimport Operation from './operation';\r\nimport RenameOperation from './renameoperation';\r\nimport RootAttributeOperation from './rootattributeoperation';\r\nimport RootOperation from './rootoperation';\r\nimport SplitOperation from './splitoperation';\r\nimport MergeOperation from './mergeoperation';\r\nconst operations = {};\r\noperations[AttributeOperation.className] = AttributeOperation;\r\noperations[InsertOperation.className] = InsertOperation;\r\noperations[MarkerOperation.className] = MarkerOperation;\r\noperations[MoveOperation.className] = MoveOperation;\r\noperations[NoOperation.className] = NoOperation;\r\noperations[Operation.className] = Operation;\r\noperations[RenameOperation.className] = RenameOperation;\r\noperations[RootAttributeOperation.className] = RootAttributeOperation;\r\noperations[RootOperation.className] = RootOperation;\r\noperations[SplitOperation.className] = SplitOperation;\r\noperations[MergeOperation.className] = MergeOperation;\r\n/**\r\n * A factory class for creating operations.\r\n */\r\nexport default class OperationFactory {\r\n    /**\r\n     * Creates an operation instance from a JSON object (parsed JSON string).\r\n     *\r\n     * @param json Deserialized JSON object.\r\n     * @param document Document on which this operation will be applied.\r\n     */\r\n    static fromJSON(json, document) {\r\n        return operations[json.__className].fromJSON(json, document);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport InsertOperation from './insertoperation';\r\nimport AttributeOperation from './attributeoperation';\r\nimport RenameOperation from './renameoperation';\r\nimport MarkerOperation from './markeroperation';\r\nimport MoveOperation from './moveoperation';\r\nimport RootAttributeOperation from './rootattributeoperation';\r\nimport RootOperation from './rootoperation';\r\nimport MergeOperation from './mergeoperation';\r\nimport SplitOperation from './splitoperation';\r\nimport NoOperation from './nooperation';\r\nimport Range from '../range';\r\nimport Position from '../position';\r\nimport { compareArrays } from '@ckeditor/ckeditor5-utils';\r\nconst transformations = new Map();\r\n/**\r\n * @module engine/model/operation/transform\r\n */\r\n/**\r\n * Sets a transformation function to be be used to transform instances of class `OperationA` by instances of class `OperationB`.\r\n *\r\n * The `transformationFunction` is passed three parameters:\r\n *\r\n * * `a` - operation to be transformed, an instance of `OperationA`,\r\n * * `b` - operation to be transformed by, an instance of `OperationB`,\r\n * * {@link module:engine/model/operation/transform~TransformationContext `context`} - object with additional information about\r\n * transformation context.\r\n *\r\n * The `transformationFunction` should return transformation result, which is an array with one or multiple\r\n * {@link module:engine/model/operation/operation~Operation operation} instances.\r\n *\r\n * @param transformationFunction Function to use for transforming.\r\n */\r\nfunction setTransformation(OperationA, OperationB, transformationFunction) {\r\n    let aGroup = transformations.get(OperationA);\r\n    if (!aGroup) {\r\n        aGroup = new Map();\r\n        transformations.set(OperationA, aGroup);\r\n    }\r\n    aGroup.set(OperationB, transformationFunction);\r\n}\r\n/**\r\n * Returns a previously set transformation function for transforming an instance of `OperationA` by an instance of `OperationB`.\r\n *\r\n * If no transformation was set for given pair of operations, {@link module:engine/model/operation/transform~noUpdateTransformation}\r\n * is returned. This means that if no transformation was set, the `OperationA` instance will not change when transformed\r\n * by the `OperationB` instance.\r\n *\r\n * @returns Function set to transform an instance of `OperationA` by an instance of `OperationB`.\r\n */\r\nfunction getTransformation(OperationA, OperationB) {\r\n    const aGroup = transformations.get(OperationA);\r\n    if (aGroup && aGroup.has(OperationB)) {\r\n        return aGroup.get(OperationB);\r\n    }\r\n    return noUpdateTransformation;\r\n}\r\n/**\r\n * A transformation function that only clones operation to transform, without changing it.\r\n */\r\nfunction noUpdateTransformation(a) {\r\n    return [a];\r\n}\r\n/**\r\n * Transforms operation `a` by operation `b`.\r\n *\r\n * @param a Operation to be transformed.\r\n * @param b Operation to transform by.\r\n * @param context Transformation context for this transformation.\r\n * @returns Transformation result.\r\n */\r\nexport function transform(a, b, context = {}) {\r\n    const transformationFunction = getTransformation(a.constructor, b.constructor);\r\n    /* eslint-disable no-useless-catch */\r\n    try {\r\n        a = a.clone();\r\n        return transformationFunction(a, b, context);\r\n    }\r\n    catch (e) {\r\n        // @if CK_DEBUG // console.warn( 'Error during operation transformation!', e.message );\r\n        // @if CK_DEBUG // console.warn( 'Transformed operation', a );\r\n        // @if CK_DEBUG // console.warn( 'Operation transformed by', b );\r\n        // @if CK_DEBUG // console.warn( 'context.aIsStrong', context.aIsStrong );\r\n        // @if CK_DEBUG // console.warn( 'context.aWasUndone', context.aWasUndone );\r\n        // @if CK_DEBUG // console.warn( 'context.bWasUndone', context.bWasUndone );\r\n        // @if CK_DEBUG // console.warn( 'context.abRelation', context.abRelation );\r\n        // @if CK_DEBUG // console.warn( 'context.baRelation', context.baRelation );\r\n        throw e;\r\n    }\r\n    /* eslint-enable no-useless-catch */\r\n}\r\n/**\r\n * Performs a transformation of two sets of operations - `operationsA` and `operationsB`. The transformation is two-way -\r\n * both transformed `operationsA` and transformed `operationsB` are returned.\r\n *\r\n * Note, that the first operation in each set should base on the same document state (\r\n * {@link module:engine/model/document~Document#version document version}).\r\n *\r\n * It is assumed that `operationsA` are \"more important\" during conflict resolution between two operations.\r\n *\r\n * New copies of both passed arrays and operations inside them are returned. Passed arguments are not altered.\r\n *\r\n * Base versions of the transformed operations sets are updated accordingly. For example, assume that base versions are `4`\r\n * and there are `3` operations in `operationsA` and `5` operations in `operationsB`. Then:\r\n *\r\n * * transformed `operationsA` will start from base version `9` (`4` base version + `5` operations B),\r\n * * transformed `operationsB` will start from base version `7` (`4` base version + `3` operations A).\r\n *\r\n * If no operation was broken into two during transformation, then both sets will end up with an operation that bases on version `11`:\r\n *\r\n * * transformed `operationsA` start from `9` and there are `3` of them, so the last will have `baseVersion` equal to `11`,\r\n * * transformed `operationsB` start from `7` and there are `5` of them, so the last will have `baseVersion` equal to `11`.\r\n *\r\n * @param operationsA\r\n * @param operationsB\r\n * @param options Additional transformation options.\r\n * @param options.document Document which the operations change.\r\n * @param options.useRelations Whether during transformation relations should be used (used during undo for better conflict resolution).\r\n * @param options.padWithNoOps Whether additional {@link module:engine/model/operation/nooperation~NoOperation}s\r\n * should be added to the transformation results to force the same last base version for both transformed sets (in case\r\n * if some operations got broken into multiple operations during transformation).\r\n * @param options.forceWeakRemove If set to `false`, remove operation will be always stronger than move operation,\r\n * so the removed nodes won't end up back in the document root. When set to `true`, context data will be used.\r\n * @returns Transformation result.\r\n */\r\nexport function transformSets(operationsA, operationsB, options) {\r\n    // Create new arrays so the originally passed arguments are not changed.\r\n    // No need to clone operations, they are cloned as they are transformed.\r\n    operationsA = operationsA.slice();\r\n    operationsB = operationsB.slice();\r\n    const contextFactory = new ContextFactory(options.document, options.useRelations, options.forceWeakRemove);\r\n    contextFactory.setOriginalOperations(operationsA);\r\n    contextFactory.setOriginalOperations(operationsB);\r\n    const originalOperations = contextFactory.originalOperations;\r\n    // If one of sets is empty there is simply nothing to transform, so return sets as they are.\r\n    if (operationsA.length == 0 || operationsB.length == 0) {\r\n        return { operationsA, operationsB, originalOperations };\r\n    }\r\n    //\r\n    // Following is a description of transformation process:\r\n    //\r\n    // There are `operationsA` and `operationsB` to be transformed, both by both.\r\n    //\r\n    // So, suppose we have sets of two operations each: `operationsA` = `[ a1, a2 ]`, `operationsB` = `[ b1, b2 ]`.\r\n    //\r\n    // Remember, that we can only transform operations that base on the same context. We assert that `a1` and `b1` base on\r\n    // the same context and we transform them. Then, we get `a1'` and `b1'`. `a2` bases on a context with `a1` -- `a2`\r\n    // is an operation that followed `a1`. Similarly, `b2` bases on a context with `b1`.\r\n    //\r\n    // However, since `a1'` is a result of transformation by `b1`, `a1'` now also has a context with `b1`. This means that\r\n    // we can safely transform `a1'` by `b2`. As we finish transforming `a1`, we also transformed all `operationsB`.\r\n    // All `operationsB` also have context including `a1`. Now, we can properly transform `a2` by those operations.\r\n    //\r\n    // The transformation process can be visualized on a transformation diagram (\"diamond diagram\"):\r\n    //\r\n    //          [the initial state]\r\n    //         [common for a1 and b1]\r\n    //\r\n    //                   *\r\n    //                  / \\\r\n    //                 /   \\\r\n    //               b1     a1\r\n    //               /       \\\r\n    //              /         \\\r\n    //             *           *\r\n    //            / \\         / \\\r\n    //           /   \\       /   \\\r\n    //         b2    a1'   b1'    a2\r\n    //         /       \\   /       \\\r\n    //        /         \\ /         \\\r\n    //       *           *           *\r\n    //        \\         / \\         /\r\n    //         \\       /   \\       /\r\n    //        a1''   b2'   a2'   b1''\r\n    //           \\   /       \\   /\r\n    //            \\ /         \\ /\r\n    //             *           *\r\n    //              \\         /\r\n    //               \\       /\r\n    //              a2''   b2''\r\n    //                 \\   /\r\n    //                  \\ /\r\n    //                   *\r\n    //\r\n    //           [the final state]\r\n    //\r\n    // The final state can be reached from the initial state by applying `a1`, `a2`, `b1''` and `b2''`, as well as by\r\n    // applying `b1`, `b2`, `a1''`, `a2''`. Note how the operations get to a proper common state before each pair is\r\n    // transformed.\r\n    //\r\n    // Another thing to consider is that an operation during transformation can be broken into multiple operations.\r\n    // Suppose that `a1` * `b1` = `[ a11', a12' ]` (instead of `a1'` that we considered previously).\r\n    //\r\n    // In that case, we leave `a12'` for later and we continue transforming `a11'` until it is transformed by all `operationsB`\r\n    // (in our case it is just `b2`). At this point, `b1` is transformed by \"whole\" `a1`, while `b2` is only transformed\r\n    // by `a11'`. Similarly, `a12'` is only transformed by `b1`. This leads to a conclusion that we need to start transforming `a12'`\r\n    // from the moment just after it was broken. So, `a12'` is transformed by `b2`. Now, \"the whole\" `a1` is transformed\r\n    // by `operationsB`, while all `operationsB` are transformed by \"the whole\" `a1`. This means that we can continue with\r\n    // following `operationsA` (in our case it is just `a2`).\r\n    //\r\n    // Of course, also `operationsB` can be broken. However, since we focus on transforming operation `a` to the end,\r\n    // the only thing to do is to store both pieces of operation `b`, so that the next transformed operation `a` will\r\n    // be transformed by both of them.\r\n    //\r\n    //                       *\r\n    //                      / \\\r\n    //                     /   \\\r\n    //                    /     \\\r\n    //                  b1       a1\r\n    //                  /         \\\r\n    //                 /           \\\r\n    //                /             \\\r\n    //               *               *\r\n    //              / \\             / \\\r\n    //             /  a11'         /   \\\r\n    //            /     \\         /     \\\r\n    //          b2       *      b1'      a2\r\n    //          /       / \\     /         \\\r\n    //         /       /  a12' /           \\\r\n    //        /       /     \\ /             \\\r\n    //       *       b2'     *               *\r\n    //        \\     /       / \\             /\r\n    //       a11'' /     b21'' \\           /\r\n    //          \\ /       /     \\         /\r\n    //           *       *      a2'     b1''\r\n    //            \\     / \\       \\     /\r\n    //          a12'' b22''\\       \\   /\r\n    //              \\ /     \\       \\ /\r\n    //               *      a2''     *\r\n    //                \\       \\     /\r\n    //                 \\       \\  b21'''\r\n    //                  \\       \\ /\r\n    //                a2'''      *\r\n    //                    \\     /\r\n    //                     \\  b22'''\r\n    //                      \\ /\r\n    //                       *\r\n    //\r\n    // Note, how `a1` is broken and transformed into `a11'` and `a12'`, while `b2'` got broken and transformed into `b21''` and `b22''`.\r\n    //\r\n    // Having all that on mind, here is an outline for the transformation process algorithm:\r\n    //\r\n    // 1. We have `operationsA` and `operationsB` array, which we dynamically update as the transformation process goes.\r\n    //\r\n    // 2. We take next (or first) operation from `operationsA` and check from which operation `b` we need to start transforming it.\r\n    // All original `operationsA` are set to be transformed starting from the first operation `b`.\r\n    //\r\n    // 3. We take operations from `operationsB`, one by one, starting from the correct one, and transform operation `a`\r\n    // by operation `b` (and vice versa). We update `operationsA` and `operationsB` by replacing the original operations\r\n    // with the transformation results.\r\n    //\r\n    // 4. If operation is broken into multiple operations, we save all the new operations in the place of the\r\n    // original operation.\r\n    //\r\n    // 5. Additionally, if operation `a` was broken, for the \"new\" operation, we remember from which operation `b` it should\r\n    // be transformed by.\r\n    //\r\n    // 6. We continue transforming \"current\" operation `a` until it is transformed by all `operationsB`. Then, go to 2.\r\n    // unless the last operation `a` was transformed.\r\n    //\r\n    // The actual implementation of the above algorithm is slightly different, as only one loop (while) is used.\r\n    // The difference is that we have \"current\" `a` operation to transform and we store the index of the next `b` operation\r\n    // to transform by. Each loop operates on two indexes then: index pointing to currently processed `a` operation and\r\n    // index pointing to next `b` operation. Each loop is just one `a * b` + `b * a` transformation. After each loop\r\n    // operation `b` index is updated. If all `b` operations were visited for the current `a` operation, we change\r\n    // current `a` operation index to the next one.\r\n    //\r\n    // For each operation `a`, keeps information what is the index in `operationsB` from which the transformation should start.\r\n    const nextTransformIndex = new WeakMap();\r\n    // For all the original `operationsA`, set that they should be transformed starting from the first of `operationsB`.\r\n    for (const op of operationsA) {\r\n        nextTransformIndex.set(op, 0);\r\n    }\r\n    // Additional data that is used for some postprocessing after the main transformation process is done.\r\n    const data = {\r\n        nextBaseVersionA: operationsA[operationsA.length - 1].baseVersion + 1,\r\n        nextBaseVersionB: operationsB[operationsB.length - 1].baseVersion + 1,\r\n        originalOperationsACount: operationsA.length,\r\n        originalOperationsBCount: operationsB.length\r\n    };\r\n    // Index of currently transformed operation `a`.\r\n    let i = 0;\r\n    // While not all `operationsA` are transformed...\r\n    while (i < operationsA.length) {\r\n        // Get \"current\" operation `a`.\r\n        const opA = operationsA[i];\r\n        // For the \"current\" operation `a`, get the index of the next operation `b` to transform by.\r\n        const indexB = nextTransformIndex.get(opA);\r\n        // If operation `a` was already transformed by every operation `b`, change \"current\" operation `a` to the next one.\r\n        if (indexB == operationsB.length) {\r\n            i++;\r\n            continue;\r\n        }\r\n        const opB = operationsB[indexB];\r\n        // Transform `a` by `b` and `b` by `a`.\r\n        const newOpsA = transform(opA, opB, contextFactory.getContext(opA, opB, true));\r\n        const newOpsB = transform(opB, opA, contextFactory.getContext(opB, opA, false));\r\n        // As a result we get one or more `newOpsA` and one or more `newOpsB` operations.\r\n        // Update contextual information about operations.\r\n        contextFactory.updateRelation(opA, opB);\r\n        contextFactory.setOriginalOperations(newOpsA, opA);\r\n        contextFactory.setOriginalOperations(newOpsB, opB);\r\n        // For new `a` operations, update their index of the next operation `b` to transform them by.\r\n        //\r\n        // This is needed even if there was only one result (`a` was not broken) because that information is used\r\n        // at the beginning of this loop every time.\r\n        for (const newOpA of newOpsA) {\r\n            // Acknowledge, that operation `b` also might be broken into multiple operations.\r\n            //\r\n            // This is why we raise `indexB` not just by 1. If `newOpsB` are multiple operations, they will be\r\n            // spliced in the place of `opB`. So we need to change `transformBy` accordingly, so that an operation won't\r\n            // be transformed by the same operation (part of it) again.\r\n            nextTransformIndex.set(newOpA, indexB + newOpsB.length);\r\n        }\r\n        // Update `operationsA` and `operationsB` with the transformed versions.\r\n        operationsA.splice(i, 1, ...newOpsA);\r\n        operationsB.splice(indexB, 1, ...newOpsB);\r\n    }\r\n    if (options.padWithNoOps) {\r\n        // If no-operations padding is enabled, count how many extra `a` and `b` operations were generated.\r\n        const brokenOperationsACount = operationsA.length - data.originalOperationsACount;\r\n        const brokenOperationsBCount = operationsB.length - data.originalOperationsBCount;\r\n        // Then, if that number is not the same, pad `operationsA` or `operationsB` with correct number of no-ops so\r\n        // that the base versions are equalled.\r\n        //\r\n        // Note that only one array will be updated, as only one of those subtractions can be greater than zero.\r\n        padWithNoOps(operationsA, brokenOperationsBCount - brokenOperationsACount);\r\n        padWithNoOps(operationsB, brokenOperationsACount - brokenOperationsBCount);\r\n    }\r\n    // Finally, update base versions of transformed operations.\r\n    updateBaseVersions(operationsA, data.nextBaseVersionB);\r\n    updateBaseVersions(operationsB, data.nextBaseVersionA);\r\n    return { operationsA, operationsB, originalOperations };\r\n}\r\n/**\r\n * Gathers additional data about operations processed during transformation. Can be used to obtain contextual information\r\n * about two operations that are about to be transformed. This contextual information can be used for better conflict resolution.\r\n */\r\nclass ContextFactory {\r\n    /**\r\n     * Creates `ContextFactory` instance.\r\n     *\r\n     * @param document Document which the operations change.\r\n     * @param useRelations Whether during transformation relations should be used (used during undo for\r\n     * better conflict resolution).\r\n     * @param forceWeakRemove If set to `false`, remove operation will be always stronger than move operation,\r\n     * so the removed nodes won't end up back in the document root. When set to `true`, context data will be used.\r\n     */\r\n    constructor(document, useRelations, forceWeakRemove = false) {\r\n        // For each operation that is created during transformation process, we keep a reference to the original operation\r\n        // which it comes from. The original operation works as a kind of \"identifier\". Every contextual information\r\n        // gathered during transformation that we want to save for given operation, is actually saved for the original operation.\r\n        // This way no matter if operation `a` is cloned, then transformed, even breaks, we still have access to the previously\r\n        // gathered data through original operation reference.\r\n        this.originalOperations = new Map();\r\n        // `model.History` instance which information about undone operations will be taken from.\r\n        this._history = document.history;\r\n        // Whether additional context should be used.\r\n        this._useRelations = useRelations;\r\n        this._forceWeakRemove = !!forceWeakRemove;\r\n        // Relations is a double-map structure (maps in map) where for two operations we store how those operations were related\r\n        // to each other. Those relations are evaluated during transformation process. For every transformated pair of operations\r\n        // we keep relations between them.\r\n        this._relations = new Map();\r\n    }\r\n    /**\r\n     * Sets \"original operation\" for given operations.\r\n     *\r\n     * During transformation process, operations are cloned, then changed, then processed again, sometimes broken into two\r\n     * or multiple operations. When gathering additional data it is important that all operations can be somehow linked\r\n     * so a cloned and transformed \"version\" still kept track of the data assigned earlier to it.\r\n     *\r\n     * The original operation object will be used as such an universal linking id. Throughout the transformation process\r\n     * all cloned operations will refer to \"the original operation\" when storing and reading additional data.\r\n     *\r\n     * If `takeFrom` is not set, each operation from `operations` array will be assigned itself as \"the original operation\".\r\n     * This should be used as an initialization step.\r\n     *\r\n     * If `takeFrom` is set, each operation from `operations` will be assigned the same original operation as assigned\r\n     * for `takeFrom` operation. This should be used to update original operations. It should be used in a way that\r\n     * `operations` are the result of `takeFrom` transformation to ensure proper \"original operation propagation\".\r\n     */\r\n    setOriginalOperations(operations, takeFrom = null) {\r\n        const originalOperation = takeFrom ? this.originalOperations.get(takeFrom) : null;\r\n        for (const operation of operations) {\r\n            this.originalOperations.set(operation, originalOperation || operation);\r\n        }\r\n    }\r\n    /**\r\n     * Saves a relation between operations `opA` and `opB`.\r\n     *\r\n     * Relations are then later used to help solve conflicts when operations are transformed.\r\n     */\r\n    updateRelation(opA, opB) {\r\n        // The use of relations is described in a bigger detail in transformation functions.\r\n        //\r\n        // In brief, this function, for specified pairs of operation types, checks how positions defined in those operations relate.\r\n        // Then those relations are saved. For example, for two move operations, it is saved if one of those operations target\r\n        // position is before the other operation source position. This kind of information gives contextual information when\r\n        // transformation is used during undo. Similar checks are done for other pairs of operations.\r\n        //\r\n        if (opA instanceof MoveOperation) {\r\n            if (opB instanceof MergeOperation) {\r\n                if (opA.targetPosition.isEqual(opB.sourcePosition) || opB.movedRange.containsPosition(opA.targetPosition)) {\r\n                    this._setRelation(opA, opB, 'insertAtSource');\r\n                }\r\n                else if (opA.targetPosition.isEqual(opB.deletionPosition)) {\r\n                    this._setRelation(opA, opB, 'insertBetween');\r\n                }\r\n                else if (opA.targetPosition.isAfter(opB.sourcePosition)) {\r\n                    this._setRelation(opA, opB, 'moveTargetAfter');\r\n                }\r\n            }\r\n            else if (opB instanceof MoveOperation) {\r\n                if (opA.targetPosition.isEqual(opB.sourcePosition) || opA.targetPosition.isBefore(opB.sourcePosition)) {\r\n                    this._setRelation(opA, opB, 'insertBefore');\r\n                }\r\n                else {\r\n                    this._setRelation(opA, opB, 'insertAfter');\r\n                }\r\n            }\r\n        }\r\n        else if (opA instanceof SplitOperation) {\r\n            if (opB instanceof MergeOperation) {\r\n                if (opA.splitPosition.isBefore(opB.sourcePosition)) {\r\n                    this._setRelation(opA, opB, 'splitBefore');\r\n                }\r\n            }\r\n            else if (opB instanceof MoveOperation) {\r\n                if (opA.splitPosition.isEqual(opB.sourcePosition) || opA.splitPosition.isBefore(opB.sourcePosition)) {\r\n                    this._setRelation(opA, opB, 'splitBefore');\r\n                }\r\n                else {\r\n                    const range = Range._createFromPositionAndShift(opB.sourcePosition, opB.howMany);\r\n                    if (opA.splitPosition.hasSameParentAs(opB.sourcePosition) && range.containsPosition(opA.splitPosition)) {\r\n                        const howMany = range.end.offset - opA.splitPosition.offset;\r\n                        const offset = opA.splitPosition.offset - range.start.offset;\r\n                        this._setRelation(opA, opB, { howMany, offset });\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else if (opA instanceof MergeOperation) {\r\n            if (opB instanceof MergeOperation) {\r\n                if (!opA.targetPosition.isEqual(opB.sourcePosition)) {\r\n                    this._setRelation(opA, opB, 'mergeTargetNotMoved');\r\n                }\r\n                if (opA.sourcePosition.isEqual(opB.targetPosition)) {\r\n                    this._setRelation(opA, opB, 'mergeSourceNotMoved');\r\n                }\r\n                if (opA.sourcePosition.isEqual(opB.sourcePosition)) {\r\n                    this._setRelation(opA, opB, 'mergeSameElement');\r\n                }\r\n            }\r\n            else if (opB instanceof SplitOperation) {\r\n                if (opA.sourcePosition.isEqual(opB.splitPosition)) {\r\n                    this._setRelation(opA, opB, 'splitAtSource');\r\n                }\r\n            }\r\n        }\r\n        else if (opA instanceof MarkerOperation) {\r\n            const markerRange = opA.newRange;\r\n            if (!markerRange) {\r\n                return;\r\n            }\r\n            if (opB instanceof MoveOperation) {\r\n                const movedRange = Range._createFromPositionAndShift(opB.sourcePosition, opB.howMany);\r\n                const affectedLeft = movedRange.containsPosition(markerRange.start) ||\r\n                    movedRange.start.isEqual(markerRange.start);\r\n                const affectedRight = movedRange.containsPosition(markerRange.end) ||\r\n                    movedRange.end.isEqual(markerRange.end);\r\n                if ((affectedLeft || affectedRight) && !movedRange.containsRange(markerRange)) {\r\n                    this._setRelation(opA, opB, {\r\n                        side: affectedLeft ? 'left' : 'right',\r\n                        path: affectedLeft ? markerRange.start.path.slice() : markerRange.end.path.slice()\r\n                    });\r\n                }\r\n            }\r\n            else if (opB instanceof MergeOperation) {\r\n                const wasInLeftElement = markerRange.start.isEqual(opB.targetPosition);\r\n                const wasStartBeforeMergedElement = markerRange.start.isEqual(opB.deletionPosition);\r\n                const wasEndBeforeMergedElement = markerRange.end.isEqual(opB.deletionPosition);\r\n                const wasInRightElement = markerRange.end.isEqual(opB.sourcePosition);\r\n                if (wasInLeftElement || wasStartBeforeMergedElement || wasEndBeforeMergedElement || wasInRightElement) {\r\n                    this._setRelation(opA, opB, {\r\n                        wasInLeftElement,\r\n                        wasStartBeforeMergedElement,\r\n                        wasEndBeforeMergedElement,\r\n                        wasInRightElement\r\n                    });\r\n                }\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Evaluates and returns contextual information about two given operations `opA` and `opB` which are about to be transformed.\r\n     */\r\n    getContext(opA, opB, aIsStrong) {\r\n        return {\r\n            aIsStrong,\r\n            aWasUndone: this._wasUndone(opA),\r\n            bWasUndone: this._wasUndone(opB),\r\n            abRelation: this._useRelations ? this._getRelation(opA, opB) : null,\r\n            baRelation: this._useRelations ? this._getRelation(opB, opA) : null,\r\n            forceWeakRemove: this._forceWeakRemove\r\n        };\r\n    }\r\n    /**\r\n     * Returns whether given operation `op` has already been undone.\r\n     *\r\n     * Information whether an operation was undone gives more context when making a decision when two operations are in conflict.\r\n     */\r\n    _wasUndone(op) {\r\n        // For `op`, get its original operation. After all, if `op` is a clone (or even transformed clone) of another\r\n        // operation, literally `op` couldn't be undone. It was just generated. If anything, it was the operation it origins\r\n        // from which was undone. So get that original operation.\r\n        const originalOp = this.originalOperations.get(op);\r\n        // And check with the document if the original operation was undone.\r\n        return originalOp.wasUndone || this._history.isUndoneOperation(originalOp);\r\n    }\r\n    /**\r\n     * Returns a relation between `opA` and an operation which is undone by `opB`. This can be `String` value if a relation\r\n     * was set earlier or `null` if there was no relation between those operations.\r\n     *\r\n     * This is a little tricky to understand, so let's compare it to `ContextFactory#_wasUndone`.\r\n     *\r\n     * When `wasUndone( opB )` is used, we check if the `opB` has already been undone. It is obvious, that the\r\n     * undoing operation must happen after the undone operation. So, essentially, we have `opB`, we take document history,\r\n     * we look forward in the future and ask if in that future `opB` was undone.\r\n     *\r\n     * Relations is a backward process to `wasUndone()`.\r\n     *\r\n     * Long story short - using relations is asking what happened in the past. Looking back. This time we have an undoing\r\n     * operation `opB` which has undone some other operation. When there is a transformation `opA` x `opB` and there is\r\n     * a conflict to solve and `opB` is an undoing operation, we can look back in the history and see what was a relation\r\n     * between `opA` and the operation which `opB` undone. Basing on that relation from the past, we can now make\r\n     * a better decision when resolving a conflict between two operations, because we know more about the context of\r\n     * those two operations.\r\n     *\r\n     * This is why this function does not return a relation directly between `opA` and `opB` because we need to look\r\n     * back to search for a meaningful contextual information.\r\n     */\r\n    _getRelation(opA, opB) {\r\n        // Get the original operation. Similarly as in `wasUndone()` it is used as an universal identifier for stored data.\r\n        const origB = this.originalOperations.get(opB);\r\n        const undoneB = this._history.getUndoneOperation(origB);\r\n        // If `opB` is not undoing any operation, there is no relation.\r\n        if (!undoneB) {\r\n            return null;\r\n        }\r\n        const origA = this.originalOperations.get(opA);\r\n        const relationsA = this._relations.get(origA);\r\n        // Get all relations for `opA`, and check if there is a relation with `opB`-undone-counterpart. If so, return it.\r\n        if (relationsA) {\r\n            return relationsA.get(undoneB) || null;\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Helper function for `ContextFactory#updateRelations`.\r\n     */\r\n    _setRelation(opA, opB, relation) {\r\n        // As always, setting is for original operations, not the clones/transformed operations.\r\n        const origA = this.originalOperations.get(opA);\r\n        const origB = this.originalOperations.get(opB);\r\n        let relationsA = this._relations.get(origA);\r\n        if (!relationsA) {\r\n            relationsA = new Map();\r\n            this._relations.set(origA, relationsA);\r\n        }\r\n        relationsA.set(origB, relation);\r\n    }\r\n}\r\n/**\r\n * An utility function that updates {@link module:engine/model/operation/operation~Operation#baseVersion base versions}\r\n * of passed operations.\r\n *\r\n * The function simply sets `baseVersion` as a base version of the first passed operation and then increments it for\r\n * each following operation in `operations`.\r\n *\r\n * @param operations Operations to update.\r\n * @param baseVersion Base version to set for the first operation in `operations`.\r\n */\r\nfunction updateBaseVersions(operations, baseVersion) {\r\n    for (const operation of operations) {\r\n        operation.baseVersion = baseVersion++;\r\n    }\r\n}\r\n/**\r\n * Adds `howMany` instances of {@link module:engine/model/operation/nooperation~NoOperation} to `operations` set.\r\n */\r\nfunction padWithNoOps(operations, howMany) {\r\n    for (let i = 0; i < howMany; i++) {\r\n        operations.push(new NoOperation(0));\r\n    }\r\n}\r\n// -----------------------\r\nsetTransformation(AttributeOperation, AttributeOperation, (a, b, context) => {\r\n    // If operations in conflict, check if their ranges intersect and manage them properly.\r\n    //\r\n    // Operations can be in conflict only if:\r\n    //\r\n    // * their key is the same (they change the same attribute), and\r\n    // * they are in the same parent (operations for ranges [ 1 ] - [ 3 ] and [ 2, 0 ] - [ 2, 5 ] change different\r\n    // elements and can't be in conflict).\r\n    if (a.key === b.key && a.range.start.hasSameParentAs(b.range.start)) {\r\n        // First, we want to apply change to the part of a range that has not been changed by the other operation.\r\n        const operations = a.range.getDifference(b.range).map(range => {\r\n            return new AttributeOperation(range, a.key, a.oldValue, a.newValue, 0);\r\n        });\r\n        // Then we take care of the common part of ranges.\r\n        const common = a.range.getIntersection(b.range);\r\n        if (common) {\r\n            // If this operation is more important, we also want to apply change to the part of the\r\n            // original range that has already been changed by the other operation. Since that range\r\n            // got changed we also have to update `oldValue`.\r\n            if (context.aIsStrong) {\r\n                operations.push(new AttributeOperation(common, b.key, b.newValue, a.newValue, 0));\r\n            }\r\n        }\r\n        if (operations.length == 0) {\r\n            return [new NoOperation(0)];\r\n        }\r\n        return operations;\r\n    }\r\n    else {\r\n        // If operations don't conflict, simply return an array containing just a clone of this operation.\r\n        return [a];\r\n    }\r\n});\r\nsetTransformation(AttributeOperation, InsertOperation, (a, b) => {\r\n    // Case 1:\r\n    //\r\n    // The attribute operation range includes the position where nodes were inserted.\r\n    // There are two possible scenarios: the inserted nodes were text and they should receive attributes or\r\n    // the inserted nodes were elements and they should not receive attributes.\r\n    //\r\n    if (a.range.start.hasSameParentAs(b.position) && a.range.containsPosition(b.position)) {\r\n        // If new nodes should not receive attributes, two separated ranges will be returned.\r\n        // Otherwise, one expanded range will be returned.\r\n        const range = a.range._getTransformedByInsertion(b.position, b.howMany, !b.shouldReceiveAttributes);\r\n        const result = range.map(r => {\r\n            return new AttributeOperation(r, a.key, a.oldValue, a.newValue, a.baseVersion);\r\n        });\r\n        if (b.shouldReceiveAttributes) {\r\n            // `AttributeOperation#range` includes some newly inserted text.\r\n            // The operation should also change the attribute of that text. An example:\r\n            //\r\n            // Bold should be applied on the following range:\r\n            // <p>Fo[zb]ar</p>\r\n            //\r\n            // In meantime, new text is typed:\r\n            // <p>Fozxxbar</p>\r\n            //\r\n            // Bold should be applied also on the new text:\r\n            // <p>Fo[zxxb]ar</p>\r\n            // <p>Fo<$text bold=\"true\">zxxb</$text>ar</p>\r\n            //\r\n            // There is a special case to consider here to consider.\r\n            //\r\n            // Consider setting an attribute with multiple possible values, for example `highlight`. The inserted text might\r\n            // have already an attribute value applied and the `oldValue` property of the attribute operation might be wrong:\r\n            //\r\n            // Attribute `highlight=\"yellow\"` should be applied on the following range:\r\n            // <p>Fo[zb]ar<p>\r\n            //\r\n            // In meantime, character `x` with `highlight=\"red\"` is typed:\r\n            // <p>Fo[z<$text highlight=\"red\">x</$text>b]ar</p>\r\n            //\r\n            // In this case we cannot simply apply operation changing the attribute value from `null` to `\"yellow\"` for the whole range\r\n            // because that would lead to an exception (`oldValue` is incorrect for `x`).\r\n            //\r\n            // We also cannot break the original range as this would mess up a scenario when there are multiple following\r\n            // insert operations, because then only the first inserted character is included in those ranges:\r\n            // <p>Fo[z][x][b]ar</p>   -->   <p>Fo[z][x]x[b]ar</p>   -->   <p>Fo[z][x]xx[b]ar</p>\r\n            //\r\n            // So, the attribute range needs be expanded, no matter what attributes are set on the inserted nodes:\r\n            //\r\n            // <p>Fo[z<$text highlight=\"red\">x</$text>b]ar</p>      <--- Change from `null` to `yellow`, throwing an exception.\r\n            //\r\n            // But before that operation would be applied, we will add an additional attribute operation that will change\r\n            // attributes on the inserted nodes in a way which would make the original operation correct:\r\n            //\r\n            // <p>Fo[z{<$text highlight=\"red\">}x</$text>b]ar</p>    <--- Change range `{}` from `red` to `null`.\r\n            // <p>Fo[zxb]ar</p>                                     <--- Now change from `null` to `yellow` is completely fine.\r\n            //\r\n            // Generate complementary attribute operation. Be sure to add it before the original operation.\r\n            const op = _getComplementaryAttributeOperations(b, a.key, a.oldValue);\r\n            if (op) {\r\n                result.unshift(op);\r\n            }\r\n        }\r\n        // If nodes should not receive new attribute, we are done here.\r\n        return result;\r\n    }\r\n    // If insert operation is not expanding the attribute operation range, simply transform the range.\r\n    a.range = a.range._getTransformedByInsertion(b.position, b.howMany, false)[0];\r\n    return [a];\r\n});\r\n/**\r\n * Helper function for `AttributeOperation` x `InsertOperation` (and reverse) transformation.\r\n *\r\n * For given `insertOperation` it checks the inserted node if it has an attribute `key` set to a value different\r\n * than `newValue`. If so, it generates an `AttributeOperation` which changes the value of `key` attribute to `newValue`.\r\n */\r\nfunction _getComplementaryAttributeOperations(insertOperation, key, newValue) {\r\n    const nodes = insertOperation.nodes;\r\n    // At the beginning we store the attribute value from the first node.\r\n    const insertValue = nodes.getNode(0).getAttribute(key);\r\n    if (insertValue == newValue) {\r\n        return null;\r\n    }\r\n    const range = new Range(insertOperation.position, insertOperation.position.getShiftedBy(insertOperation.howMany));\r\n    return new AttributeOperation(range, key, insertValue, newValue, 0);\r\n}\r\nsetTransformation(AttributeOperation, MergeOperation, (a, b) => {\r\n    const ranges = [];\r\n    // Case 1:\r\n    //\r\n    // Attribute change on the merged element. In this case, the merged element was moved to the graveyard.\r\n    // An additional attribute operation that will change the (re)moved element needs to be generated.\r\n    //\r\n    if (a.range.start.hasSameParentAs(b.deletionPosition)) {\r\n        if (a.range.containsPosition(b.deletionPosition) || a.range.start.isEqual(b.deletionPosition)) {\r\n            ranges.push(Range._createFromPositionAndShift(b.graveyardPosition, 1));\r\n        }\r\n    }\r\n    const range = a.range._getTransformedByMergeOperation(b);\r\n    // Do not add empty (collapsed) ranges to the result. `range` may be collapsed if it contained only the merged element.\r\n    if (!range.isCollapsed) {\r\n        ranges.push(range);\r\n    }\r\n    // Create `AttributeOperation`s out of the ranges.\r\n    return ranges.map(range => {\r\n        return new AttributeOperation(range, a.key, a.oldValue, a.newValue, a.baseVersion);\r\n    });\r\n});\r\nsetTransformation(AttributeOperation, MoveOperation, (a, b) => {\r\n    const ranges = _breakRangeByMoveOperation(a.range, b);\r\n    // Create `AttributeOperation`s out of the ranges.\r\n    return ranges.map(range => new AttributeOperation(range, a.key, a.oldValue, a.newValue, a.baseVersion));\r\n});\r\n/**\r\n * Helper function for `AttributeOperation` x `MoveOperation` transformation.\r\n *\r\n * Takes the passed `range` and transforms it by move operation `moveOp` in a specific way. Only top-level nodes of `range`\r\n * are considered to be in the range. If move operation moves nodes deep from inside of the range, those nodes won't\r\n * be included in the result. In other words, top-level nodes of the ranges from the result are exactly the same as\r\n * top-level nodes of the original `range`.\r\n *\r\n * This is important for `AttributeOperation` because, for its range, it changes only the top-level nodes. So we need to\r\n * track only how those nodes have been affected by `MoveOperation`.\r\n */\r\nfunction _breakRangeByMoveOperation(range, moveOp) {\r\n    const moveRange = Range._createFromPositionAndShift(moveOp.sourcePosition, moveOp.howMany);\r\n    // We are transforming `range` (original range) by `moveRange` (range moved by move operation). As usual when it comes to\r\n    // transforming a ranges, we may have a common part of the ranges and we may have a difference part (zero to two ranges).\r\n    let common = null;\r\n    let difference = [];\r\n    // Let's compare the ranges.\r\n    if (moveRange.containsRange(range, true)) {\r\n        // If the whole original range is moved, treat it whole as a common part. There's also no difference part.\r\n        common = range;\r\n    }\r\n    else if (range.start.hasSameParentAs(moveRange.start)) {\r\n        // If the ranges are \"on the same level\" (in the same parent) then move operation may move exactly those nodes\r\n        // that are changed by the attribute operation. In this case we get common part and difference part in the usual way.\r\n        difference = range.getDifference(moveRange);\r\n        common = range.getIntersection(moveRange);\r\n    }\r\n    else {\r\n        // In any other situation we assume that original range is different than move range, that is that move operation\r\n        // moves other nodes that attribute operation change. Even if the moved range is deep inside in the original range.\r\n        //\r\n        // Note that this is different than in `.getIntersection` (we would get a common part in that case) and different\r\n        // than `.getDifference` (we would get two ranges).\r\n        difference = [range];\r\n    }\r\n    const result = [];\r\n    // The default behaviour of `_getTransformedByMove` might get wrong results for difference part, though, so\r\n    // we do it by hand.\r\n    for (let diff of difference) {\r\n        // First, transform the range by removing moved nodes. Since this is a difference, this is safe, `null` won't be returned\r\n        // as the range is different than the moved range.\r\n        diff = diff._getTransformedByDeletion(moveOp.sourcePosition, moveOp.howMany);\r\n        // Transform also `targetPosition`.\r\n        const targetPosition = moveOp.getMovedRangeStart();\r\n        // Spread the range only if moved nodes are inserted only between the top-level nodes of the `diff` range.\r\n        const spread = diff.start.hasSameParentAs(targetPosition);\r\n        // Transform by insertion of moved nodes.\r\n        const diffs = diff._getTransformedByInsertion(targetPosition, moveOp.howMany, spread);\r\n        result.push(...diffs);\r\n    }\r\n    // Common part can be simply transformed by the move operation. This is because move operation will not target to\r\n    // that common part (the operation would have to target inside its own moved range).\r\n    if (common) {\r\n        result.push(common._getTransformedByMove(moveOp.sourcePosition, moveOp.targetPosition, moveOp.howMany, false)[0]);\r\n    }\r\n    return result;\r\n}\r\nsetTransformation(AttributeOperation, SplitOperation, (a, b) => {\r\n    // Case 1:\r\n    //\r\n    // Split node is the last node in `AttributeOperation#range`.\r\n    // `AttributeOperation#range` needs to be expanded to include the new (split) node.\r\n    //\r\n    // Attribute `type` to be changed to `numbered` but the `listItem` is split.\r\n    // <listItem type=\"bulleted\">foobar</listItem>\r\n    //\r\n    // After split:\r\n    // <listItem type=\"bulleted\">foo</listItem><listItem type=\"bulleted\">bar</listItem>\r\n    //\r\n    // After attribute change:\r\n    // <listItem type=\"numbered\">foo</listItem><listItem type=\"numbered\">foo</listItem>\r\n    //\r\n    if (a.range.end.isEqual(b.insertionPosition)) {\r\n        if (!b.graveyardPosition) {\r\n            a.range.end.offset++;\r\n        }\r\n        return [a];\r\n    }\r\n    // Case 2:\r\n    //\r\n    // Split position is inside `AttributeOperation#range`, at the same level, so the nodes to change are\r\n    // not going to make a flat range.\r\n    //\r\n    // Content with range-to-change and split position:\r\n    // <p>Fo[zb^a]r</p>\r\n    //\r\n    // After split:\r\n    // <p>Fozb</p><p>ar</p>\r\n    //\r\n    // Make two separate ranges containing all nodes to change:\r\n    // <p>Fo[zb]</p><p>[a]r</p>\r\n    //\r\n    if (a.range.start.hasSameParentAs(b.splitPosition) && a.range.containsPosition(b.splitPosition)) {\r\n        const secondPart = a.clone();\r\n        secondPart.range = new Range(b.moveTargetPosition.clone(), a.range.end._getCombined(b.splitPosition, b.moveTargetPosition));\r\n        a.range.end = b.splitPosition.clone();\r\n        a.range.end.stickiness = 'toPrevious';\r\n        return [a, secondPart];\r\n    }\r\n    // The default case.\r\n    //\r\n    a.range = a.range._getTransformedBySplitOperation(b);\r\n    return [a];\r\n});\r\nsetTransformation(InsertOperation, AttributeOperation, (a, b) => {\r\n    const result = [a];\r\n    // Case 1:\r\n    //\r\n    // The attribute operation range includes the position where nodes were inserted.\r\n    // There are two possible scenarios: the inserted nodes were text and they should receive attributes or\r\n    // the inserted nodes were elements and they should not receive attributes.\r\n    //\r\n    // This is a mirror scenario to the one described in `AttributeOperation` x `InsertOperation` transformation,\r\n    // although this case is a little less complicated. In this case we simply need to change attributes of the\r\n    // inserted nodes and that's it.\r\n    //\r\n    if (a.shouldReceiveAttributes && a.position.hasSameParentAs(b.range.start) && b.range.containsPosition(a.position)) {\r\n        const op = _getComplementaryAttributeOperations(a, b.key, b.newValue);\r\n        if (op) {\r\n            result.push(op);\r\n        }\r\n    }\r\n    // The default case is: do nothing.\r\n    // `AttributeOperation` does not change the model tree structure so `InsertOperation` does not need to be changed.\r\n    //\r\n    return result;\r\n});\r\nsetTransformation(InsertOperation, InsertOperation, (a, b, context) => {\r\n    // Case 1:\r\n    //\r\n    // Two insert operations insert nodes at the same position. Since they are the same, it needs to be decided\r\n    // what will be the order of inserted nodes. However, there is no additional information to help in that\r\n    // decision. Also, when `b` will be transformed by `a`, the same order must be maintained.\r\n    //\r\n    // To achieve that, we will check if the operation is strong.\r\n    // If it is, it won't get transformed. If it is not, it will be moved.\r\n    //\r\n    if (a.position.isEqual(b.position) && context.aIsStrong) {\r\n        return [a];\r\n    }\r\n    // The default case.\r\n    //\r\n    a.position = a.position._getTransformedByInsertOperation(b);\r\n    return [a];\r\n});\r\nsetTransformation(InsertOperation, MoveOperation, (a, b) => {\r\n    // The default case.\r\n    //\r\n    a.position = a.position._getTransformedByMoveOperation(b);\r\n    return [a];\r\n});\r\nsetTransformation(InsertOperation, SplitOperation, (a, b) => {\r\n    // The default case.\r\n    //\r\n    a.position = a.position._getTransformedBySplitOperation(b);\r\n    return [a];\r\n});\r\nsetTransformation(InsertOperation, MergeOperation, (a, b) => {\r\n    a.position = a.position._getTransformedByMergeOperation(b);\r\n    return [a];\r\n});\r\n// -----------------------\r\nsetTransformation(MarkerOperation, InsertOperation, (a, b) => {\r\n    if (a.oldRange) {\r\n        a.oldRange = a.oldRange._getTransformedByInsertOperation(b)[0];\r\n    }\r\n    if (a.newRange) {\r\n        a.newRange = a.newRange._getTransformedByInsertOperation(b)[0];\r\n    }\r\n    return [a];\r\n});\r\nsetTransformation(MarkerOperation, MarkerOperation, (a, b, context) => {\r\n    if (a.name == b.name) {\r\n        if (context.aIsStrong) {\r\n            a.oldRange = b.newRange ? b.newRange.clone() : null;\r\n        }\r\n        else {\r\n            return [new NoOperation(0)];\r\n        }\r\n    }\r\n    return [a];\r\n});\r\nsetTransformation(MarkerOperation, MergeOperation, (a, b) => {\r\n    if (a.oldRange) {\r\n        a.oldRange = a.oldRange._getTransformedByMergeOperation(b);\r\n    }\r\n    if (a.newRange) {\r\n        a.newRange = a.newRange._getTransformedByMergeOperation(b);\r\n    }\r\n    return [a];\r\n});\r\nsetTransformation(MarkerOperation, MoveOperation, (a, b, context) => {\r\n    if (a.oldRange) {\r\n        a.oldRange = Range._createFromRanges(a.oldRange._getTransformedByMoveOperation(b));\r\n    }\r\n    if (a.newRange) {\r\n        if (context.abRelation) {\r\n            const aNewRange = Range._createFromRanges(a.newRange._getTransformedByMoveOperation(b));\r\n            if (context.abRelation.side == 'left' && b.targetPosition.isEqual(a.newRange.start)) {\r\n                a.newRange.end = aNewRange.end;\r\n                a.newRange.start.path = context.abRelation.path;\r\n                return [a];\r\n            }\r\n            else if (context.abRelation.side == 'right' && b.targetPosition.isEqual(a.newRange.end)) {\r\n                a.newRange.start = aNewRange.start;\r\n                a.newRange.end.path = context.abRelation.path;\r\n                return [a];\r\n            }\r\n        }\r\n        a.newRange = Range._createFromRanges(a.newRange._getTransformedByMoveOperation(b));\r\n    }\r\n    return [a];\r\n});\r\nsetTransformation(MarkerOperation, SplitOperation, (a, b, context) => {\r\n    if (a.oldRange) {\r\n        a.oldRange = a.oldRange._getTransformedBySplitOperation(b);\r\n    }\r\n    if (a.newRange) {\r\n        if (context.abRelation) {\r\n            const aNewRange = a.newRange._getTransformedBySplitOperation(b);\r\n            if (a.newRange.start.isEqual(b.splitPosition) && context.abRelation.wasStartBeforeMergedElement) {\r\n                a.newRange.start = Position._createAt(b.insertionPosition);\r\n            }\r\n            else if (a.newRange.start.isEqual(b.splitPosition) && !context.abRelation.wasInLeftElement) {\r\n                a.newRange.start = Position._createAt(b.moveTargetPosition);\r\n            }\r\n            if (a.newRange.end.isEqual(b.splitPosition) && context.abRelation.wasInRightElement) {\r\n                a.newRange.end = Position._createAt(b.moveTargetPosition);\r\n            }\r\n            else if (a.newRange.end.isEqual(b.splitPosition) && context.abRelation.wasEndBeforeMergedElement) {\r\n                a.newRange.end = Position._createAt(b.insertionPosition);\r\n            }\r\n            else {\r\n                a.newRange.end = aNewRange.end;\r\n            }\r\n            return [a];\r\n        }\r\n        a.newRange = a.newRange._getTransformedBySplitOperation(b);\r\n    }\r\n    return [a];\r\n});\r\n// -----------------------\r\nsetTransformation(MergeOperation, InsertOperation, (a, b) => {\r\n    if (a.sourcePosition.hasSameParentAs(b.position)) {\r\n        a.howMany += b.howMany;\r\n    }\r\n    a.sourcePosition = a.sourcePosition._getTransformedByInsertOperation(b);\r\n    a.targetPosition = a.targetPosition._getTransformedByInsertOperation(b);\r\n    return [a];\r\n});\r\nsetTransformation(MergeOperation, MergeOperation, (a, b, context) => {\r\n    // Case 1:\r\n    //\r\n    // Same merge operations.\r\n    //\r\n    // Both operations have same source and target positions. So the element already got merged and there is\r\n    // theoretically nothing to do.\r\n    //\r\n    if (a.sourcePosition.isEqual(b.sourcePosition) && a.targetPosition.isEqual(b.targetPosition)) {\r\n        // There are two ways that we can provide a do-nothing operation.\r\n        //\r\n        // First is simply a NoOperation instance. We will use it if `b` operation was not undone.\r\n        //\r\n        // Second is a merge operation that has the source operation in the merged element - in the graveyard -\r\n        // same target position and `howMany` equal to `0`. So it is basically merging an empty element from graveyard\r\n        // which is almost the same as NoOperation.\r\n        //\r\n        // This way the merge operation can be later transformed by split operation\r\n        // to provide correct undo. This will be used if `b` operation was undone (only then it is correct).\r\n        //\r\n        if (!context.bWasUndone) {\r\n            return [new NoOperation(0)];\r\n        }\r\n        else {\r\n            const path = b.graveyardPosition.path.slice();\r\n            path.push(0);\r\n            a.sourcePosition = new Position(b.graveyardPosition.root, path);\r\n            a.howMany = 0;\r\n            return [a];\r\n        }\r\n    }\r\n    // Case 2:\r\n    //\r\n    // Same merge source position but different target position.\r\n    //\r\n    // This can happen during collaboration. For example, if one client merged a paragraph to the previous paragraph\r\n    // and the other person removed that paragraph and merged the same paragraph to something before:\r\n    //\r\n    // Client A:\r\n    // <p>Foo</p><p>Bar</p><p>[]Xyz</p>\r\n    // <p>Foo</p><p>BarXyz</p>\r\n    //\r\n    // Client B:\r\n    // <p>Foo</p>[<p>Bar</p>]<p>Xyz</p>\r\n    // <p>Foo</p><p>[]Xyz</p>\r\n    // <p>FooXyz</p>\r\n    //\r\n    // In this case we need to decide where finally \"Xyz\" will land:\r\n    //\r\n    // <p>FooXyz</p>               graveyard: <p>Bar</p>\r\n    // <p>Foo</p>                  graveyard: <p>BarXyz</p>\r\n    //\r\n    // Let's move it in a way so that a merge operation that does not target to graveyard is more important so that\r\n    // nodes does not end up in the graveyard. It makes sense. Both for Client A and for Client B \"Xyz\" finally did not\r\n    // end up in the graveyard (see above).\r\n    //\r\n    // If neither or both operations point to graveyard, then let `aIsStrong` decide.\r\n    //\r\n    if (a.sourcePosition.isEqual(b.sourcePosition) && !a.targetPosition.isEqual(b.targetPosition) &&\r\n        !context.bWasUndone && context.abRelation != 'splitAtSource') {\r\n        const aToGraveyard = a.targetPosition.root.rootName == '$graveyard';\r\n        const bToGraveyard = b.targetPosition.root.rootName == '$graveyard';\r\n        // If `aIsWeak` it means that `a` points to graveyard while `b` doesn't. Don't move nodes then.\r\n        const aIsWeak = aToGraveyard && !bToGraveyard;\r\n        // If `bIsWeak` it means that `b` points to graveyard while `a` doesn't. Force moving nodes then.\r\n        const bIsWeak = bToGraveyard && !aToGraveyard;\r\n        // Force move if `b` is weak or neither operation is weak but `a` is stronger through `context.aIsStrong`.\r\n        const forceMove = bIsWeak || (!aIsWeak && context.aIsStrong);\r\n        if (forceMove) {\r\n            const sourcePosition = b.targetPosition._getTransformedByMergeOperation(b);\r\n            const targetPosition = a.targetPosition._getTransformedByMergeOperation(b);\r\n            return [new MoveOperation(sourcePosition, a.howMany, targetPosition, 0)];\r\n        }\r\n        else {\r\n            return [new NoOperation(0)];\r\n        }\r\n    }\r\n    // The default case.\r\n    //\r\n    if (a.sourcePosition.hasSameParentAs(b.targetPosition)) {\r\n        a.howMany += b.howMany;\r\n    }\r\n    a.sourcePosition = a.sourcePosition._getTransformedByMergeOperation(b);\r\n    a.targetPosition = a.targetPosition._getTransformedByMergeOperation(b);\r\n    // Handle positions in graveyard.\r\n    // If graveyard positions are same and `a` operation is strong - do not transform.\r\n    if (!a.graveyardPosition.isEqual(b.graveyardPosition) || !context.aIsStrong) {\r\n        a.graveyardPosition = a.graveyardPosition._getTransformedByMergeOperation(b);\r\n    }\r\n    return [a];\r\n});\r\nsetTransformation(MergeOperation, MoveOperation, (a, b, context) => {\r\n    // Case 1:\r\n    //\r\n    // The element to merge got removed.\r\n    //\r\n    // Merge operation does support merging elements which are not siblings. So it would not be a problem\r\n    // from technical point of view. However, if the element was removed, the intention of the user deleting it\r\n    // was to have it all deleted, together with its children. From user experience point of view, moving back the\r\n    // removed nodes might be unexpected. This means that in this scenario we will block the merging.\r\n    //\r\n    // The exception of this rule would be if the remove operation was later undone.\r\n    //\r\n    const removedRange = Range._createFromPositionAndShift(b.sourcePosition, b.howMany);\r\n    if (b.type == 'remove' && !context.bWasUndone && !context.forceWeakRemove) {\r\n        if (a.deletionPosition.hasSameParentAs(b.sourcePosition) && removedRange.containsPosition(a.sourcePosition)) {\r\n            return [new NoOperation(0)];\r\n        }\r\n    }\r\n    // The default case.\r\n    //\r\n    if (a.sourcePosition.hasSameParentAs(b.targetPosition)) {\r\n        a.howMany += b.howMany;\r\n    }\r\n    if (a.sourcePosition.hasSameParentAs(b.sourcePosition)) {\r\n        a.howMany -= b.howMany;\r\n    }\r\n    a.sourcePosition = a.sourcePosition._getTransformedByMoveOperation(b);\r\n    a.targetPosition = a.targetPosition._getTransformedByMoveOperation(b);\r\n    // `MergeOperation` graveyard position is like `MoveOperation` target position. It is a position where element(s) will\r\n    // be moved. Like in other similar cases, we need to consider the scenario when those positions are same.\r\n    // Here, we will treat `MergeOperation` like it is always strong (see `InsertOperation` x `InsertOperation` for comparison).\r\n    // This means that we won't transform graveyard position if it is equal to move operation target position.\r\n    if (!a.graveyardPosition.isEqual(b.targetPosition)) {\r\n        a.graveyardPosition = a.graveyardPosition._getTransformedByMoveOperation(b);\r\n    }\r\n    return [a];\r\n});\r\nsetTransformation(MergeOperation, SplitOperation, (a, b, context) => {\r\n    if (b.graveyardPosition) {\r\n        // If `b` operation defines graveyard position, a node from graveyard will be moved. This means that we need to\r\n        // transform `a.graveyardPosition` accordingly.\r\n        a.graveyardPosition = a.graveyardPosition._getTransformedByDeletion(b.graveyardPosition, 1);\r\n        // This is a scenario foreseen in `MergeOperation` x `MergeOperation`, with two identical merge operations.\r\n        //\r\n        // So, there was `MergeOperation` x `MergeOperation` transformation earlier. Now, `a` is a merge operation which\r\n        // source position is in graveyard. Interestingly, split operation wants to use the node to be merged by `a`. This\r\n        // means that `b` is undoing that merge operation from earlier, which caused `a` to be in graveyard.\r\n        //\r\n        // If that's the case, at this point, we will only \"fix\" `a.howMany`. It was earlier set to `0` in\r\n        // `MergeOperation` x `MergeOperation` transformation. Later transformations in this function will change other\r\n        // properties.\r\n        //\r\n        if (a.deletionPosition.isEqual(b.graveyardPosition)) {\r\n            a.howMany = b.howMany;\r\n        }\r\n    }\r\n    // Case 1:\r\n    //\r\n    // Merge operation moves nodes to the place where split happens.\r\n    // This is a classic situation when there are two paragraphs, and there is a split (enter) after the first\r\n    // paragraph and there is a merge (delete) at the beginning of the second paragraph:\r\n    //\r\n    // <p>Foo{}</p><p>[]Bar</p>.\r\n    //\r\n    // Split is after `Foo`, while merge is from `Bar` to the end of `Foo`.\r\n    //\r\n    // State after split:\r\n    // <p>Foo</p><p></p><p>Bar</p>\r\n    //\r\n    // Now, `Bar` should be merged to the new paragraph:\r\n    // <p>Foo</p><p>Bar</p>\r\n    //\r\n    // Instead of merging it to the original paragraph:\r\n    // <p>FooBar</p><p></p>\r\n    //\r\n    // This means that `targetPosition` needs to be transformed. This is the default case though.\r\n    // For example, if the split would be after `F`, `targetPosition` should also be transformed.\r\n    //\r\n    // There are three exceptions, though, when we want to keep `targetPosition` as it was.\r\n    //\r\n    // First exception is when the merge target position is inside an element (not at the end, as usual). This\r\n    // happens when the merge operation earlier was transformed by \"the same\" merge operation. If merge operation\r\n    // targets inside the element we want to keep the original target position (and not transform it) because\r\n    // we have additional context telling us that we want to merge to the original element. We can check if the\r\n    // merge operation points inside element by checking what is `SplitOperation#howMany`. Since merge target position\r\n    // is same as split position, if `howMany` is non-zero, it means that the merge target position is inside an element.\r\n    //\r\n    // Second exception is when the element to merge is in the graveyard and split operation uses it. In that case\r\n    // if target position would be transformed, the merge operation would target at the source position:\r\n    //\r\n    // root: <p>Foo</p>\t\t\t\tgraveyard: <p></p>\r\n    //\r\n    // SplitOperation: root [ 0, 3 ] using graveyard [ 0 ] (howMany = 0)\r\n    // MergeOperation: graveyard [ 0, 0 ] -> root [ 0, 3 ] (howMany = 0)\r\n    //\r\n    // Since split operation moves the graveyard node back to the root, the merge operation source position changes.\r\n    // We would like to merge from the empty <p> to the \"Foo\" <p>:\r\n    //\r\n    // root: <p>Foo</p><p></p>\t\t\tgraveyard:\r\n    //\r\n    // MergeOperation#sourcePosition = root [ 1, 0 ]\r\n    //\r\n    // If `targetPosition` is transformed, it would become root [ 1, 0 ] as well. It has to be kept as it was.\r\n    //\r\n    // Third exception is connected with relations. If this happens during undo and we have explicit information\r\n    // that target position has not been affected by the operation which is undone by this split then this split should\r\n    // not move the target position either.\r\n    //\r\n    if (a.targetPosition.isEqual(b.splitPosition)) {\r\n        const mergeInside = b.howMany != 0;\r\n        const mergeSplittingElement = b.graveyardPosition && a.deletionPosition.isEqual(b.graveyardPosition);\r\n        if (mergeInside || mergeSplittingElement || context.abRelation == 'mergeTargetNotMoved') {\r\n            a.sourcePosition = a.sourcePosition._getTransformedBySplitOperation(b);\r\n            return [a];\r\n        }\r\n    }\r\n    // Case 2:\r\n    //\r\n    // Merge source is at the same position as split position. This sometimes happen, mostly during undo.\r\n    // The decision here is mostly to choose whether merge source position should stay where it is (so it will be at the end of the\r\n    // split element) or should be move to the beginning of the new element.\r\n    //\r\n    if (a.sourcePosition.isEqual(b.splitPosition)) {\r\n        // Use context to check if `SplitOperation` is not undoing a merge operation, that didn't change the `a` operation.\r\n        // This scenario happens the undone merge operation moved nodes at the source position of `a` operation.\r\n        // In that case `a` operation source position should stay where it is.\r\n        if (context.abRelation == 'mergeSourceNotMoved') {\r\n            a.howMany = 0;\r\n            a.targetPosition = a.targetPosition._getTransformedBySplitOperation(b);\r\n            return [a];\r\n        }\r\n        // This merge operation might have been earlier transformed by a merge operation which both merged the same element.\r\n        // See that case in `MergeOperation` x `MergeOperation` transformation. In that scenario, if the merge operation has been undone,\r\n        // the special case is not applied.\r\n        //\r\n        // Now, the merge operation is transformed by the split which has undone that previous merge operation.\r\n        // So now we are fixing situation which was skipped in `MergeOperation` x `MergeOperation` case.\r\n        //\r\n        if (context.abRelation == 'mergeSameElement' || a.sourcePosition.offset > 0) {\r\n            a.sourcePosition = b.moveTargetPosition.clone();\r\n            a.targetPosition = a.targetPosition._getTransformedBySplitOperation(b);\r\n            return [a];\r\n        }\r\n    }\r\n    // The default case.\r\n    //\r\n    if (a.sourcePosition.hasSameParentAs(b.splitPosition)) {\r\n        a.howMany = b.splitPosition.offset;\r\n    }\r\n    a.sourcePosition = a.sourcePosition._getTransformedBySplitOperation(b);\r\n    a.targetPosition = a.targetPosition._getTransformedBySplitOperation(b);\r\n    return [a];\r\n});\r\n// -----------------------\r\nsetTransformation(MoveOperation, InsertOperation, (a, b) => {\r\n    const moveRange = Range._createFromPositionAndShift(a.sourcePosition, a.howMany);\r\n    const transformed = moveRange._getTransformedByInsertOperation(b, false)[0];\r\n    a.sourcePosition = transformed.start;\r\n    a.howMany = transformed.end.offset - transformed.start.offset;\r\n    // See `InsertOperation` x `MoveOperation` transformation for details on this case.\r\n    //\r\n    // In summary, both operations point to the same place, so the order of nodes needs to be decided.\r\n    // `MoveOperation` is considered weaker, so it is always transformed, unless there was a certain relation\r\n    // between operations.\r\n    //\r\n    if (!a.targetPosition.isEqual(b.position)) {\r\n        a.targetPosition = a.targetPosition._getTransformedByInsertOperation(b);\r\n    }\r\n    return [a];\r\n});\r\nsetTransformation(MoveOperation, MoveOperation, (a, b, context) => {\r\n    //\r\n    // Setting and evaluating some variables that will be used in special cases and default algorithm.\r\n    //\r\n    // Create ranges from `MoveOperations` properties.\r\n    const rangeA = Range._createFromPositionAndShift(a.sourcePosition, a.howMany);\r\n    const rangeB = Range._createFromPositionAndShift(b.sourcePosition, b.howMany);\r\n    // Assign `context.aIsStrong` to a different variable, because the value may change during execution of\r\n    // this algorithm and we do not want to override original `context.aIsStrong` that will be used in later transformations.\r\n    let aIsStrong = context.aIsStrong;\r\n    // This will be used to decide the order of nodes if both operations target at the same position.\r\n    // By default, use strong/weak operation mechanism.\r\n    let insertBefore = !context.aIsStrong;\r\n    // If the relation is set, then use it to decide nodes order.\r\n    if (context.abRelation == 'insertBefore' || context.baRelation == 'insertAfter') {\r\n        insertBefore = true;\r\n    }\r\n    else if (context.abRelation == 'insertAfter' || context.baRelation == 'insertBefore') {\r\n        insertBefore = false;\r\n    }\r\n    // `a.targetPosition` could be affected by the `b` operation. We will transform it.\r\n    let newTargetPosition;\r\n    if (a.targetPosition.isEqual(b.targetPosition) && insertBefore) {\r\n        newTargetPosition = a.targetPosition._getTransformedByDeletion(b.sourcePosition, b.howMany);\r\n    }\r\n    else {\r\n        newTargetPosition = a.targetPosition._getTransformedByMove(b.sourcePosition, b.targetPosition, b.howMany);\r\n    }\r\n    //\r\n    // Special case #1 + mirror.\r\n    //\r\n    // Special case when both move operations' target positions are inside nodes that are\r\n    // being moved by the other move operation. So in other words, we move ranges into inside of each other.\r\n    // This case can't be solved reasonably (on the other hand, it should not happen often).\r\n    if (_moveTargetIntoMovedRange(a, b) && _moveTargetIntoMovedRange(b, a)) {\r\n        // Instead of transforming operation, we return a reverse of the operation that we transform by.\r\n        // So when the results of this \"transformation\" will be applied, `b` MoveOperation will get reversed.\r\n        return [b.getReversed()];\r\n    }\r\n    //\r\n    // End of special case #1.\r\n    //\r\n    //\r\n    // Special case #2.\r\n    //\r\n    // Check if `b` operation targets inside `rangeA`.\r\n    const bTargetsToA = rangeA.containsPosition(b.targetPosition);\r\n    // If `b` targets to `rangeA` and `rangeA` contains `rangeB`, `b` operation has no influence on `a` operation.\r\n    // You might say that operation `b` is captured inside operation `a`.\r\n    if (bTargetsToA && rangeA.containsRange(rangeB, true)) {\r\n        // There is a mini-special case here, where `rangeB` is on other level than `rangeA`. That's why\r\n        // we need to transform `a` operation anyway.\r\n        rangeA.start = rangeA.start._getTransformedByMove(b.sourcePosition, b.targetPosition, b.howMany);\r\n        rangeA.end = rangeA.end._getTransformedByMove(b.sourcePosition, b.targetPosition, b.howMany);\r\n        return _makeMoveOperationsFromRanges([rangeA], newTargetPosition);\r\n    }\r\n    //\r\n    // Special case #2 mirror.\r\n    //\r\n    const aTargetsToB = rangeB.containsPosition(a.targetPosition);\r\n    if (aTargetsToB && rangeB.containsRange(rangeA, true)) {\r\n        // `a` operation is \"moved together\" with `b` operation.\r\n        // Here, just move `rangeA` \"inside\" `rangeB`.\r\n        rangeA.start = rangeA.start._getCombined(b.sourcePosition, b.getMovedRangeStart());\r\n        rangeA.end = rangeA.end._getCombined(b.sourcePosition, b.getMovedRangeStart());\r\n        return _makeMoveOperationsFromRanges([rangeA], newTargetPosition);\r\n    }\r\n    //\r\n    // End of special case #2.\r\n    //\r\n    //\r\n    // Special case #3 + mirror.\r\n    //\r\n    // `rangeA` has a node which is an ancestor of `rangeB`. In other words, `rangeB` is inside `rangeA`\r\n    // but not on the same tree level. In such case ranges have common part but we have to treat it\r\n    // differently, because in such case those ranges are not really conflicting and should be treated like\r\n    // two separate ranges. Also we have to discard two difference parts.\r\n    const aCompB = compareArrays(a.sourcePosition.getParentPath(), b.sourcePosition.getParentPath());\r\n    if (aCompB == 'prefix' || aCompB == 'extension') {\r\n        // Transform `rangeA` by `b` operation and make operation out of it, and that's all.\r\n        // Note that this is a simplified version of default case, but here we treat the common part (whole `rangeA`)\r\n        // like a one difference part.\r\n        rangeA.start = rangeA.start._getTransformedByMove(b.sourcePosition, b.targetPosition, b.howMany);\r\n        rangeA.end = rangeA.end._getTransformedByMove(b.sourcePosition, b.targetPosition, b.howMany);\r\n        return _makeMoveOperationsFromRanges([rangeA], newTargetPosition);\r\n    }\r\n    //\r\n    // End of special case #3.\r\n    //\r\n    //\r\n    // Default case - ranges are on the same level or are not connected with each other.\r\n    //\r\n    // Modifier for default case.\r\n    // Modifies `aIsStrong` flag in certain conditions.\r\n    //\r\n    // If only one of operations is a remove operation, we force remove operation to be the \"stronger\" one\r\n    // to provide more expected results.\r\n    if (a.type == 'remove' && b.type != 'remove' && !context.aWasUndone && !context.forceWeakRemove) {\r\n        aIsStrong = true;\r\n    }\r\n    else if (a.type != 'remove' && b.type == 'remove' && !context.bWasUndone && !context.forceWeakRemove) {\r\n        aIsStrong = false;\r\n    }\r\n    // Handle operation's source ranges - check how `rangeA` is affected by `b` operation.\r\n    // This will aggregate transformed ranges.\r\n    const ranges = [];\r\n    // Get the \"difference part\" of `a` operation source range.\r\n    // This is an array with one or two ranges. Two ranges if `rangeB` is inside `rangeA`.\r\n    const difference = rangeA.getDifference(rangeB);\r\n    for (const range of difference) {\r\n        // Transform those ranges by `b` operation. For example if `b` moved range from before those ranges, fix those ranges.\r\n        range.start = range.start._getTransformedByDeletion(b.sourcePosition, b.howMany);\r\n        range.end = range.end._getTransformedByDeletion(b.sourcePosition, b.howMany);\r\n        // If `b` operation targets into `rangeA` on the same level, spread `rangeA` into two ranges.\r\n        const shouldSpread = compareArrays(range.start.getParentPath(), b.getMovedRangeStart().getParentPath()) == 'same';\r\n        const newRanges = range._getTransformedByInsertion(b.getMovedRangeStart(), b.howMany, shouldSpread);\r\n        ranges.push(...newRanges);\r\n    }\r\n    // Then, we have to manage the \"common part\" of both move ranges.\r\n    const common = rangeA.getIntersection(rangeB);\r\n    if (common !== null && aIsStrong) {\r\n        // Calculate the new position of that part of original range.\r\n        common.start = common.start._getCombined(b.sourcePosition, b.getMovedRangeStart());\r\n        common.end = common.end._getCombined(b.sourcePosition, b.getMovedRangeStart());\r\n        // Take care of proper range order.\r\n        //\r\n        // Put `common` at appropriate place. Keep in mind that we are interested in original order.\r\n        // Basically there are only three cases: there is zero, one or two difference ranges.\r\n        //\r\n        // If there is zero difference ranges, just push `common` in the array.\r\n        if (ranges.length === 0) {\r\n            ranges.push(common);\r\n        }\r\n        // If there is one difference range, we need to check whether common part was before it or after it.\r\n        else if (ranges.length == 1) {\r\n            if (rangeB.start.isBefore(rangeA.start) || rangeB.start.isEqual(rangeA.start)) {\r\n                ranges.unshift(common);\r\n            }\r\n            else {\r\n                ranges.push(common);\r\n            }\r\n        }\r\n        // If there are more ranges (which means two), put common part between them. This is the only scenario\r\n        // where there could be two difference ranges so we don't have to make any comparisons.\r\n        else {\r\n            ranges.splice(1, 0, common);\r\n        }\r\n    }\r\n    if (ranges.length === 0) {\r\n        // If there are no \"source ranges\", nothing should be changed.\r\n        // Note that this can happen only if `aIsStrong == false` and `rangeA.isEqual( rangeB )`.\r\n        return [new NoOperation(a.baseVersion)];\r\n    }\r\n    return _makeMoveOperationsFromRanges(ranges, newTargetPosition);\r\n});\r\nsetTransformation(MoveOperation, SplitOperation, (a, b, context) => {\r\n    let newTargetPosition = a.targetPosition.clone();\r\n    // Do not transform if target position is same as split insertion position and this split comes from undo.\r\n    // This should be done on relations but it is too much work for now as it would require relations working in collaboration.\r\n    // We need to make a decision how we will resolve such conflict and this is less harmful way.\r\n    if (!a.targetPosition.isEqual(b.insertionPosition) || !b.graveyardPosition || context.abRelation == 'moveTargetAfter') {\r\n        newTargetPosition = a.targetPosition._getTransformedBySplitOperation(b);\r\n    }\r\n    // Case 1:\r\n    //\r\n    // Last element in the moved range got split.\r\n    //\r\n    // In this case the default range transformation will not work correctly as the element created by\r\n    // split operation would be outside the range. The range to move needs to be fixed manually.\r\n    //\r\n    const moveRange = Range._createFromPositionAndShift(a.sourcePosition, a.howMany);\r\n    if (moveRange.end.isEqual(b.insertionPosition)) {\r\n        // Do it only if this is a \"natural\" split, not a one that comes from undo.\r\n        // If this is undo split, only `targetPosition` needs to be changed (if the move is a remove).\r\n        if (!b.graveyardPosition) {\r\n            a.howMany++;\r\n        }\r\n        a.targetPosition = newTargetPosition;\r\n        return [a];\r\n    }\r\n    // Case 2:\r\n    //\r\n    // Split happened between the moved nodes. In this case two ranges to move need to be generated.\r\n    //\r\n    // Characters `ozba` are moved to the end of paragraph `Xyz` but split happened.\r\n    // <p>F[oz|ba]r</p><p>Xyz</p>\r\n    //\r\n    // After split:\r\n    // <p>F[oz</p><p>ba]r</p><p>Xyz</p>\r\n    //\r\n    // Correct ranges:\r\n    // <p>F[oz]</p><p>[ba]r</p><p>Xyz</p>\r\n    //\r\n    // After move:\r\n    // <p>F</p><p>r</p><p>Xyzozba</p>\r\n    //\r\n    if (moveRange.start.hasSameParentAs(b.splitPosition) && moveRange.containsPosition(b.splitPosition)) {\r\n        let rightRange = new Range(b.splitPosition, moveRange.end);\r\n        rightRange = rightRange._getTransformedBySplitOperation(b);\r\n        const ranges = [\r\n            new Range(moveRange.start, b.splitPosition),\r\n            rightRange\r\n        ];\r\n        return _makeMoveOperationsFromRanges(ranges, newTargetPosition);\r\n    }\r\n    // Case 3:\r\n    //\r\n    // Move operation targets at the split position. We need to decide if the nodes should be inserted\r\n    // at the end of the split element or at the beginning of the new element.\r\n    //\r\n    if (a.targetPosition.isEqual(b.splitPosition) && context.abRelation == 'insertAtSource') {\r\n        newTargetPosition = b.moveTargetPosition;\r\n    }\r\n    // Case 4:\r\n    //\r\n    // Move operation targets just after the split element. We need to decide if the nodes should be inserted\r\n    // between two parts of split element, or after the new element.\r\n    //\r\n    // Split at `|`, while move operation moves `<p>Xyz</p>` and targets at `^`:\r\n    // <p>Foo|bar</p>^<p>baz</p>\r\n    // <p>Foo</p>^<p>bar</p><p>baz</p> or <p>Foo</p><p>bar</p>^<p>baz</p>?\r\n    //\r\n    // If there is no contextual information between operations (for example, they come from collaborative\r\n    // editing), we don't want to put some unrelated content (move) between parts of related content (split parts).\r\n    // However, if the split is from undo, in the past, the moved content might be targeting between the\r\n    // split parts, meaning that was exactly user's intention:\r\n    //\r\n    // <p>Foo</p>^<p>bar</p>\t\t<--- original situation, in \"past\".\r\n    // <p>Foobar</p>^\t\t\t\t<--- after merge target position is transformed.\r\n    // <p>Foo|bar</p>^\t\t\t\t<--- then the merge is undone, and split happens, which leads us to current situation.\r\n    //\r\n    // In this case it is pretty clear that the intention was to put new paragraph between those nodes,\r\n    // so we need to transform accordingly. We can detect this scenario thanks to relations.\r\n    //\r\n    if (a.targetPosition.isEqual(b.insertionPosition) && context.abRelation == 'insertBetween') {\r\n        newTargetPosition = a.targetPosition;\r\n    }\r\n    // The default case.\r\n    //\r\n    const transformed = moveRange._getTransformedBySplitOperation(b);\r\n    const ranges = [transformed];\r\n    // Case 5:\r\n    //\r\n    // Moved range contains graveyard element used by split operation. Add extra move operation to the result.\r\n    //\r\n    if (b.graveyardPosition) {\r\n        const movesGraveyardElement = moveRange.start.isEqual(b.graveyardPosition) || moveRange.containsPosition(b.graveyardPosition);\r\n        if (a.howMany > 1 && movesGraveyardElement && !context.aWasUndone) {\r\n            ranges.push(Range._createFromPositionAndShift(b.insertionPosition, 1));\r\n        }\r\n    }\r\n    return _makeMoveOperationsFromRanges(ranges, newTargetPosition);\r\n});\r\nsetTransformation(MoveOperation, MergeOperation, (a, b, context) => {\r\n    const movedRange = Range._createFromPositionAndShift(a.sourcePosition, a.howMany);\r\n    if (b.deletionPosition.hasSameParentAs(a.sourcePosition) && movedRange.containsPosition(b.sourcePosition)) {\r\n        if (a.type == 'remove' && !context.forceWeakRemove) {\r\n            // Case 1:\r\n            //\r\n            // The element to remove got merged.\r\n            //\r\n            // Merge operation does support merging elements which are not siblings. So it would not be a problem\r\n            // from technical point of view. However, if the element was removed, the intention of the user\r\n            // deleting it was to have it all deleted. From user experience point of view, moving back the\r\n            // removed nodes might be unexpected. This means that in this scenario we will reverse merging and remove the element.\r\n            //\r\n            if (!context.aWasUndone) {\r\n                const results = [];\r\n                let gyMoveSource = b.graveyardPosition.clone();\r\n                let splitNodesMoveSource = b.targetPosition._getTransformedByMergeOperation(b);\r\n                if (a.howMany > 1) {\r\n                    results.push(new MoveOperation(a.sourcePosition, a.howMany - 1, a.targetPosition, 0));\r\n                    gyMoveSource = gyMoveSource._getTransformedByMove(a.sourcePosition, a.targetPosition, a.howMany - 1);\r\n                    splitNodesMoveSource = splitNodesMoveSource._getTransformedByMove(a.sourcePosition, a.targetPosition, a.howMany - 1);\r\n                }\r\n                const gyMoveTarget = b.deletionPosition._getCombined(a.sourcePosition, a.targetPosition);\r\n                const gyMove = new MoveOperation(gyMoveSource, 1, gyMoveTarget, 0);\r\n                const splitNodesMoveTargetPath = gyMove.getMovedRangeStart().path.slice();\r\n                splitNodesMoveTargetPath.push(0);\r\n                const splitNodesMoveTarget = new Position(gyMove.targetPosition.root, splitNodesMoveTargetPath);\r\n                splitNodesMoveSource = splitNodesMoveSource._getTransformedByMove(gyMoveSource, gyMoveTarget, 1);\r\n                const splitNodesMove = new MoveOperation(splitNodesMoveSource, b.howMany, splitNodesMoveTarget, 0);\r\n                results.push(gyMove);\r\n                results.push(splitNodesMove);\r\n                return results;\r\n            }\r\n        }\r\n        else {\r\n            // Case 2:\r\n            //\r\n            // The element to move got merged and it was the only element to move.\r\n            // In this case just don't do anything, leave the node in the graveyard. Without special case\r\n            // it would be a move operation that moves 0 nodes, so maybe it is better just to return no-op.\r\n            //\r\n            if (a.howMany == 1) {\r\n                if (!context.bWasUndone) {\r\n                    return [new NoOperation(0)];\r\n                }\r\n                else {\r\n                    a.sourcePosition = b.graveyardPosition.clone();\r\n                    a.targetPosition = a.targetPosition._getTransformedByMergeOperation(b);\r\n                    return [a];\r\n                }\r\n            }\r\n        }\r\n    }\r\n    // The default case.\r\n    //\r\n    const moveRange = Range._createFromPositionAndShift(a.sourcePosition, a.howMany);\r\n    const transformed = moveRange._getTransformedByMergeOperation(b);\r\n    a.sourcePosition = transformed.start;\r\n    a.howMany = transformed.end.offset - transformed.start.offset;\r\n    a.targetPosition = a.targetPosition._getTransformedByMergeOperation(b);\r\n    return [a];\r\n});\r\n// -----------------------\r\nsetTransformation(RenameOperation, InsertOperation, (a, b) => {\r\n    a.position = a.position._getTransformedByInsertOperation(b);\r\n    return [a];\r\n});\r\nsetTransformation(RenameOperation, MergeOperation, (a, b) => {\r\n    // Case 1:\r\n    //\r\n    // Element to rename got merged, so it was moved to `b.graveyardPosition`.\r\n    //\r\n    if (a.position.isEqual(b.deletionPosition)) {\r\n        a.position = b.graveyardPosition.clone();\r\n        a.position.stickiness = 'toNext';\r\n        return [a];\r\n    }\r\n    a.position = a.position._getTransformedByMergeOperation(b);\r\n    return [a];\r\n});\r\nsetTransformation(RenameOperation, MoveOperation, (a, b) => {\r\n    a.position = a.position._getTransformedByMoveOperation(b);\r\n    return [a];\r\n});\r\nsetTransformation(RenameOperation, RenameOperation, (a, b, context) => {\r\n    if (a.position.isEqual(b.position)) {\r\n        if (context.aIsStrong) {\r\n            a.oldName = b.newName;\r\n        }\r\n        else {\r\n            return [new NoOperation(0)];\r\n        }\r\n    }\r\n    return [a];\r\n});\r\nsetTransformation(RenameOperation, SplitOperation, (a, b) => {\r\n    // Case 1:\r\n    //\r\n    // The element to rename has been split. In this case, the new element should be also renamed.\r\n    //\r\n    // User decides to change the paragraph to a list item:\r\n    // <paragraph>Foobar</paragraph>\r\n    //\r\n    // However, in meantime, split happens:\r\n    // <paragraph>Foo</paragraph><paragraph>bar</paragraph>\r\n    //\r\n    // As a result, rename both elements:\r\n    // <listItem>Foo</listItem><listItem>bar</listItem>\r\n    //\r\n    const renamePath = a.position.path;\r\n    const splitPath = b.splitPosition.getParentPath();\r\n    if (compareArrays(renamePath, splitPath) == 'same' && !b.graveyardPosition) {\r\n        const extraRename = new RenameOperation(a.position.getShiftedBy(1), a.oldName, a.newName, 0);\r\n        return [a, extraRename];\r\n    }\r\n    // The default case.\r\n    //\r\n    a.position = a.position._getTransformedBySplitOperation(b);\r\n    return [a];\r\n});\r\n// -----------------------\r\nsetTransformation(RootAttributeOperation, RootAttributeOperation, (a, b, context) => {\r\n    if (a.root === b.root && a.key === b.key) {\r\n        if (!context.aIsStrong || a.newValue === b.newValue) {\r\n            return [new NoOperation(0)];\r\n        }\r\n        else {\r\n            a.oldValue = b.newValue;\r\n        }\r\n    }\r\n    return [a];\r\n});\r\n// -----------------------\r\nsetTransformation(RootOperation, RootOperation, (a, b, context) => {\r\n    if (a.rootName === b.rootName && a.isAdd === b.isAdd && !context.bWasUndone) {\r\n        return [new NoOperation(0)];\r\n    }\r\n    return [a];\r\n});\r\n// -----------------------\r\nsetTransformation(SplitOperation, InsertOperation, (a, b) => {\r\n    // The default case.\r\n    //\r\n    if (a.splitPosition.hasSameParentAs(b.position) && a.splitPosition.offset < b.position.offset) {\r\n        a.howMany += b.howMany;\r\n    }\r\n    a.splitPosition = a.splitPosition._getTransformedByInsertOperation(b);\r\n    a.insertionPosition = a.insertionPosition._getTransformedByInsertOperation(b);\r\n    return [a];\r\n});\r\nsetTransformation(SplitOperation, MergeOperation, (a, b, context) => {\r\n    // Case 1:\r\n    //\r\n    // Split element got merged. If two different elements were merged, clients will have different content.\r\n    //\r\n    // Example. Merge at `{}`, split at `[]`:\r\n    // <heading>Foo</heading>{}<paragraph>B[]ar</paragraph>\r\n    //\r\n    // On merge side it will look like this:\r\n    // <heading>FooB[]ar</heading>\r\n    // <heading>FooB</heading><heading>ar</heading>\r\n    //\r\n    // On split side it will look like this:\r\n    // <heading>Foo</heading>{}<paragraph>B</paragraph><paragraph>ar</paragraph>\r\n    // <heading>FooB</heading><paragraph>ar</paragraph>\r\n    //\r\n    // Clearly, the second element is different for both clients.\r\n    //\r\n    // We could use the removed merge element from graveyard as a split element but then clients would have a different\r\n    // model state (in graveyard), because the split side client would still have an element in graveyard (removed by merge).\r\n    //\r\n    // To overcome this, in `SplitOperation` x `MergeOperation` transformation we will add additional `SplitOperation`\r\n    // in the graveyard, which will actually clone the merged-and-deleted element. Then, that cloned element will be\r\n    // used for splitting. Example below.\r\n    //\r\n    // Original state:\r\n    // <heading>Foo</heading>{}<paragraph>B[]ar</paragraph>\r\n    //\r\n    // Merge side client:\r\n    //\r\n    // After merge:\r\n    // <heading>FooB[]ar</heading>                                 graveyard: <paragraph></paragraph>\r\n    //\r\n    // Extra split:\r\n    // <heading>FooB[]ar</heading>                                 graveyard: <paragraph></paragraph><paragraph></paragraph>\r\n    //\r\n    // Use the \"cloned\" element from graveyard:\r\n    // <heading>FooB</heading><paragraph>ar</paragraph>            graveyard: <paragraph></paragraph>\r\n    //\r\n    // Split side client:\r\n    //\r\n    // After split:\r\n    // <heading>Foo</heading>{}<paragraph>B</paragraph><paragraph>ar</paragraph>\r\n    //\r\n    // After merge:\r\n    // <heading>FooB</heading><paragraph>ar</paragraph>            graveyard: <paragraph></paragraph>\r\n    //\r\n    // This special case scenario only applies if the original split operation clones the split element.\r\n    // If the original split operation has `graveyardPosition` set, it all doesn't have sense because split operation\r\n    // knows exactly which element it should use. So there would be no original problem with different contents.\r\n    //\r\n    // Additionally, the special case applies only if the merge wasn't already undone.\r\n    //\r\n    if (!a.graveyardPosition && !context.bWasUndone && a.splitPosition.hasSameParentAs(b.sourcePosition)) {\r\n        const splitPath = b.graveyardPosition.path.slice();\r\n        splitPath.push(0);\r\n        const splitPosition = new Position(b.graveyardPosition.root, splitPath);\r\n        const insertionPosition = SplitOperation.getInsertionPosition(new Position(b.graveyardPosition.root, splitPath));\r\n        const additionalSplit = new SplitOperation(splitPosition, 0, insertionPosition, null, 0);\r\n        a.splitPosition = a.splitPosition._getTransformedByMergeOperation(b);\r\n        a.insertionPosition = SplitOperation.getInsertionPosition(a.splitPosition);\r\n        a.graveyardPosition = additionalSplit.insertionPosition.clone();\r\n        a.graveyardPosition.stickiness = 'toNext';\r\n        return [additionalSplit, a];\r\n    }\r\n    // The default case.\r\n    //\r\n    if (a.splitPosition.hasSameParentAs(b.deletionPosition) && !a.splitPosition.isAfter(b.deletionPosition)) {\r\n        a.howMany--;\r\n    }\r\n    if (a.splitPosition.hasSameParentAs(b.targetPosition)) {\r\n        a.howMany += b.howMany;\r\n    }\r\n    a.splitPosition = a.splitPosition._getTransformedByMergeOperation(b);\r\n    a.insertionPosition = SplitOperation.getInsertionPosition(a.splitPosition);\r\n    if (a.graveyardPosition) {\r\n        a.graveyardPosition = a.graveyardPosition._getTransformedByMergeOperation(b);\r\n    }\r\n    return [a];\r\n});\r\nsetTransformation(SplitOperation, MoveOperation, (a, b, context) => {\r\n    const rangeToMove = Range._createFromPositionAndShift(b.sourcePosition, b.howMany);\r\n    if (a.graveyardPosition) {\r\n        // Case 1:\r\n        //\r\n        // Split operation graveyard node was moved. In this case move operation is stronger. Since graveyard element\r\n        // is already moved to the correct position, we need to only move the nodes after the split position.\r\n        // This will be done by `MoveOperation` instead of `SplitOperation`.\r\n        //\r\n        const gyElementMoved = rangeToMove.start.isEqual(a.graveyardPosition) || rangeToMove.containsPosition(a.graveyardPosition);\r\n        if (!context.bWasUndone && gyElementMoved) {\r\n            const sourcePosition = a.splitPosition._getTransformedByMoveOperation(b);\r\n            const newParentPosition = a.graveyardPosition._getTransformedByMoveOperation(b);\r\n            const newTargetPath = newParentPosition.path.slice();\r\n            newTargetPath.push(0);\r\n            const newTargetPosition = new Position(newParentPosition.root, newTargetPath);\r\n            const moveOp = new MoveOperation(sourcePosition, a.howMany, newTargetPosition, 0);\r\n            return [moveOp];\r\n        }\r\n        a.graveyardPosition = a.graveyardPosition._getTransformedByMoveOperation(b);\r\n    }\r\n    // Case 2:\r\n    //\r\n    // Split is at a position where nodes were moved.\r\n    //\r\n    // This is a scenario described in `MoveOperation` x `SplitOperation` transformation but from the\r\n    // \"split operation point of view\".\r\n    //\r\n    const splitAtTarget = a.splitPosition.isEqual(b.targetPosition);\r\n    if (splitAtTarget && (context.baRelation == 'insertAtSource' || context.abRelation == 'splitBefore')) {\r\n        a.howMany += b.howMany;\r\n        a.splitPosition = a.splitPosition._getTransformedByDeletion(b.sourcePosition, b.howMany);\r\n        a.insertionPosition = SplitOperation.getInsertionPosition(a.splitPosition);\r\n        return [a];\r\n    }\r\n    if (splitAtTarget && context.abRelation && context.abRelation.howMany) {\r\n        const { howMany, offset } = context.abRelation;\r\n        a.howMany += howMany;\r\n        a.splitPosition = a.splitPosition.getShiftedBy(offset);\r\n        return [a];\r\n    }\r\n    // Case 3:\r\n    //\r\n    // If the split position is inside the moved range, we need to shift the split position to a proper place.\r\n    // The position cannot be moved together with moved range because that would result in splitting of an incorrect element.\r\n    //\r\n    // Characters `bc` should be moved to the second paragraph while split position is between them:\r\n    // <paragraph>A[b|c]d</paragraph><paragraph>Xyz</paragraph>\r\n    //\r\n    // After move, new split position is incorrect:\r\n    // <paragraph>Ad</paragraph><paragraph>Xb|cyz</paragraph>\r\n    //\r\n    // Correct split position:\r\n    // <paragraph>A|d</paragraph><paragraph>Xbcyz</paragraph>\r\n    //\r\n    // After split:\r\n    // <paragraph>A</paragraph><paragraph>d</paragraph><paragraph>Xbcyz</paragraph>\r\n    //\r\n    if (a.splitPosition.hasSameParentAs(b.sourcePosition) && rangeToMove.containsPosition(a.splitPosition)) {\r\n        const howManyRemoved = b.howMany - (a.splitPosition.offset - b.sourcePosition.offset);\r\n        a.howMany -= howManyRemoved;\r\n        if (a.splitPosition.hasSameParentAs(b.targetPosition) && a.splitPosition.offset < b.targetPosition.offset) {\r\n            a.howMany += b.howMany;\r\n        }\r\n        a.splitPosition = b.sourcePosition.clone();\r\n        a.insertionPosition = SplitOperation.getInsertionPosition(a.splitPosition);\r\n        return [a];\r\n    }\r\n    // The default case.\r\n    // Don't change `howMany` if move operation does not really move anything.\r\n    //\r\n    if (!b.sourcePosition.isEqual(b.targetPosition)) {\r\n        if (a.splitPosition.hasSameParentAs(b.sourcePosition) && a.splitPosition.offset <= b.sourcePosition.offset) {\r\n            a.howMany -= b.howMany;\r\n        }\r\n        if (a.splitPosition.hasSameParentAs(b.targetPosition) && a.splitPosition.offset < b.targetPosition.offset) {\r\n            a.howMany += b.howMany;\r\n        }\r\n    }\r\n    // Change position stickiness to force a correct transformation.\r\n    a.splitPosition.stickiness = 'toNone';\r\n    a.splitPosition = a.splitPosition._getTransformedByMoveOperation(b);\r\n    a.splitPosition.stickiness = 'toNext';\r\n    if (a.graveyardPosition) {\r\n        a.insertionPosition = a.insertionPosition._getTransformedByMoveOperation(b);\r\n    }\r\n    else {\r\n        a.insertionPosition = SplitOperation.getInsertionPosition(a.splitPosition);\r\n    }\r\n    return [a];\r\n});\r\nsetTransformation(SplitOperation, SplitOperation, (a, b, context) => {\r\n    // Case 1:\r\n    //\r\n    // Split at the same position.\r\n    //\r\n    // If there already was a split at the same position as in `a` operation, it means that the intention\r\n    // conveyed by `a` operation has already been fulfilled and `a` should not do anything (to avoid double split).\r\n    //\r\n    // However, there is a difference if these are new splits or splits created by undo. These have different\r\n    // intentions. Also splits moving back different elements from graveyard have different intentions. They\r\n    // are just different operations.\r\n    //\r\n    // So we cancel split operation only if it was really identical.\r\n    //\r\n    // Also, there is additional case, where split operations aren't identical and should not be cancelled, however the\r\n    // default transformation is incorrect too.\r\n    //\r\n    if (a.splitPosition.isEqual(b.splitPosition)) {\r\n        if (!a.graveyardPosition && !b.graveyardPosition) {\r\n            return [new NoOperation(0)];\r\n        }\r\n        if (a.graveyardPosition && b.graveyardPosition && a.graveyardPosition.isEqual(b.graveyardPosition)) {\r\n            return [new NoOperation(0)];\r\n        }\r\n        // Use context to know that the `a.splitPosition` should stay where it is.\r\n        // This happens during undo when first a merge operation moved nodes to `a.splitPosition` and now `b` operation undoes that merge.\r\n        if (context.abRelation == 'splitBefore') {\r\n            // Since split is at the same position, there are no nodes left to split.\r\n            a.howMany = 0;\r\n            // Note: there was `if ( a.graveyardPosition )` here but it was uncovered in tests and I couldn't find any scenarios for now.\r\n            // That would have to be a `SplitOperation` that didn't come from undo but is transformed by operations that were undone.\r\n            // It could happen if `context` is enabled in collaboration.\r\n            a.graveyardPosition = a.graveyardPosition._getTransformedBySplitOperation(b);\r\n            return [a];\r\n        }\r\n    }\r\n    // Case 2:\r\n    //\r\n    // Same node is using to split different elements. This happens in undo when previously same element was merged to\r\n    // two different elements. This is described in `MergeOperation` x `MergeOperation` transformation.\r\n    //\r\n    // In this case we will follow the same logic. We will assume that `insertionPosition` is same for both\r\n    // split operations. This might not always be true but in the real cases that were experienced it was. After all,\r\n    // if these splits are reverses of merge operations that were merging the same element, then the `insertionPosition`\r\n    // should be same for both of those splits.\r\n    //\r\n    // Again, we will decide which operation is stronger by checking if split happens in graveyard or in non-graveyard root.\r\n    //\r\n    if (a.graveyardPosition && b.graveyardPosition && a.graveyardPosition.isEqual(b.graveyardPosition)) {\r\n        const aInGraveyard = a.splitPosition.root.rootName == '$graveyard';\r\n        const bInGraveyard = b.splitPosition.root.rootName == '$graveyard';\r\n        // If `aIsWeak` it means that `a` points to graveyard while `b` doesn't. Don't move nodes then.\r\n        const aIsWeak = aInGraveyard && !bInGraveyard;\r\n        // If `bIsWeak` it means that `b` points to graveyard while `a` doesn't. Force moving nodes then.\r\n        const bIsWeak = bInGraveyard && !aInGraveyard;\r\n        // Force move if `b` is weak or neither operation is weak but `a` is stronger through `context.aIsStrong`.\r\n        const forceMove = bIsWeak || (!aIsWeak && context.aIsStrong);\r\n        if (forceMove) {\r\n            const result = [];\r\n            // First we need to move any nodes split by `b` back to where they were.\r\n            // Do it only if `b` actually moved something.\r\n            if (b.howMany) {\r\n                result.push(new MoveOperation(b.moveTargetPosition, b.howMany, b.splitPosition, 0));\r\n            }\r\n            // Then we need to move nodes from `a` split position to their new element.\r\n            // Do it only if `a` actually should move something.\r\n            if (a.howMany) {\r\n                result.push(new MoveOperation(a.splitPosition, a.howMany, a.moveTargetPosition, 0));\r\n            }\r\n            return result;\r\n        }\r\n        else {\r\n            return [new NoOperation(0)];\r\n        }\r\n    }\r\n    if (a.graveyardPosition) {\r\n        a.graveyardPosition = a.graveyardPosition._getTransformedBySplitOperation(b);\r\n    }\r\n    // Case 3:\r\n    //\r\n    // Position where operation `b` inserted a new node after split is the same as the operation `a` split position.\r\n    // As in similar cases, there is ambiguity if the split should be before the new node (created by `b`) or after.\r\n    //\r\n    if (a.splitPosition.isEqual(b.insertionPosition) && context.abRelation == 'splitBefore') {\r\n        a.howMany++;\r\n        return [a];\r\n    }\r\n    // Case 4:\r\n    //\r\n    // This is a mirror to the case 2. above.\r\n    //\r\n    if (b.splitPosition.isEqual(a.insertionPosition) && context.baRelation == 'splitBefore') {\r\n        const newPositionPath = b.insertionPosition.path.slice();\r\n        newPositionPath.push(0);\r\n        const newPosition = new Position(b.insertionPosition.root, newPositionPath);\r\n        const moveOp = new MoveOperation(a.insertionPosition, 1, newPosition, 0);\r\n        return [a, moveOp];\r\n    }\r\n    // The default case.\r\n    //\r\n    if (a.splitPosition.hasSameParentAs(b.splitPosition) && a.splitPosition.offset < b.splitPosition.offset) {\r\n        a.howMany -= b.howMany;\r\n    }\r\n    a.splitPosition = a.splitPosition._getTransformedBySplitOperation(b);\r\n    a.insertionPosition = SplitOperation.getInsertionPosition(a.splitPosition);\r\n    return [a];\r\n});\r\n/**\r\n * Checks whether `MoveOperation` `targetPosition` is inside a node from the moved range of the other `MoveOperation`.\r\n */\r\nfunction _moveTargetIntoMovedRange(a, b) {\r\n    return a.targetPosition._getTransformedByDeletion(b.sourcePosition, b.howMany) === null;\r\n}\r\n/**\r\n * Helper function for `MoveOperation` x `MoveOperation` transformation. Converts given ranges and target position to\r\n * move operations and returns them.\r\n *\r\n * Ranges and target position will be transformed on-the-fly when generating operations.\r\n *\r\n * Given `ranges` should be in the order of how they were in the original transformed operation.\r\n *\r\n * Given `targetPosition` is the target position of the first range from `ranges`.\r\n */\r\nfunction _makeMoveOperationsFromRanges(ranges, targetPosition) {\r\n    // At this moment we have some ranges and a target position, to which those ranges should be moved.\r\n    // Order in `ranges` array is the go-to order of after transformation.\r\n    //\r\n    // We are almost done. We have `ranges` and `targetPosition` to make operations from.\r\n    // Unfortunately, those operations may affect each other. Precisely, first operation after move\r\n    // may affect source range and target position of second and third operation. Same with second\r\n    // operation affecting third.\r\n    //\r\n    // We need to fix those source ranges and target positions once again, before converting `ranges` to operations.\r\n    const operations = [];\r\n    // Keep in mind that nothing will be transformed if there is just one range in `ranges`.\r\n    for (let i = 0; i < ranges.length; i++) {\r\n        // Create new operation out of a range and target position.\r\n        const range = ranges[i];\r\n        const op = new MoveOperation(range.start, range.end.offset - range.start.offset, targetPosition, 0);\r\n        operations.push(op);\r\n        // Transform other ranges by the generated operation.\r\n        for (let j = i + 1; j < ranges.length; j++) {\r\n            // All ranges in `ranges` array should be:\r\n            //\r\n            // * non-intersecting (these are part of original operation source range), and\r\n            // * `targetPosition` does not target into them (opposite would mean that transformed operation targets \"inside itself\").\r\n            //\r\n            // This means that the transformation will be \"clean\" and always return one result.\r\n            ranges[j] = ranges[j]._getTransformedByMove(op.sourcePosition, op.targetPosition, op.howMany)[0];\r\n        }\r\n        targetPosition = targetPosition._getTransformedByMove(op.sourcePosition, op.targetPosition, op.howMany);\r\n    }\r\n    return operations;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/liveposition\r\n */\r\nimport Position from './position';\r\nimport { CKEditorError, EmitterMixin } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * `LivePosition` is a type of {@link module:engine/model/position~Position Position}\r\n * that updates itself as {@link module:engine/model/document~Document document}\r\n * is changed through operations. It may be used as a bookmark.\r\n *\r\n * **Note:** Contrary to {@link module:engine/model/position~Position}, `LivePosition` works only in roots that are\r\n * {@link module:engine/model/rootelement~RootElement}.\r\n * If {@link module:engine/model/documentfragment~DocumentFragment} is passed, error will be thrown.\r\n *\r\n * **Note:** Be very careful when dealing with `LivePosition`. Each `LivePosition` instance bind events that might\r\n * have to be unbound.\r\n * Use {@link module:engine/model/liveposition~LivePosition#detach} whenever you don't need `LivePosition` anymore.\r\n */\r\nexport default class LivePosition extends EmitterMixin(Position) {\r\n    /**\r\n     * Creates a live position.\r\n     *\r\n     * @see module:engine/model/position~Position\r\n     */\r\n    constructor(root, path, stickiness = 'toNone') {\r\n        super(root, path, stickiness);\r\n        if (!this.root.is('rootElement')) {\r\n            /**\r\n             * LivePosition's root has to be an instance of RootElement.\r\n             *\r\n             * @error model-liveposition-root-not-rootelement\r\n             */\r\n            throw new CKEditorError('model-liveposition-root-not-rootelement', root);\r\n        }\r\n        bindWithDocument.call(this);\r\n    }\r\n    /**\r\n     * Unbinds all events previously bound by `LivePosition`. Use it whenever you don't need `LivePosition` instance\r\n     * anymore (i.e. when leaving scope in which it was declared or before re-assigning variable that was\r\n     * referring to it).\r\n     */\r\n    detach() {\r\n        this.stopListening();\r\n    }\r\n    /**\r\n     * Creates a {@link module:engine/model/position~Position position instance}, which is equal to this live position.\r\n     */\r\n    toPosition() {\r\n        return new Position(this.root, this.path.slice(), this.stickiness);\r\n    }\r\n    /**\r\n     * Creates a `LivePosition` instance that is equal to position.\r\n     */\r\n    static fromPosition(position, stickiness) {\r\n        return new this(position.root, position.path.slice(), stickiness ? stickiness : position.stickiness);\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nLivePosition.prototype.is = function (type) {\r\n    return type === 'livePosition' || type === 'model:livePosition' ||\r\n        // From super.is(). This is highly utilised method and cannot call super. See ckeditor/ckeditor5#6529.\r\n        type == 'position' || type === 'model:position';\r\n};\r\n/**\r\n * Binds this `LivePosition` to the {@link module:engine/model/document~Document document} that owns\r\n * this position's {@link module:engine/model/position~Position#root root}.\r\n */\r\nfunction bindWithDocument() {\r\n    this.listenTo(this.root.document.model, 'applyOperation', (event, args) => {\r\n        const operation = args[0];\r\n        if (!operation.isDocumentOperation) {\r\n            return;\r\n        }\r\n        transform.call(this, operation);\r\n    }, { priority: 'low' });\r\n}\r\n/**\r\n * Updates this position accordingly to the updates applied to the model. Bases on change events.\r\n */\r\nfunction transform(operation) {\r\n    const result = this.getTransformedByOperation(operation);\r\n    if (!this.isEqual(result)) {\r\n        const oldPosition = this.toPosition();\r\n        this.path = result.path;\r\n        this.root = result.root;\r\n        this.fire('change', oldPosition);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/batch\r\n */\r\nimport { logWarning } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * A batch instance groups model changes ({@link module:engine/model/operation/operation~Operation operations}). All operations\r\n * grouped in a single batch can be reverted together, so you can also think about a batch as of a single undo step. If you want\r\n * to extend a given undo step, you can add more changes to the batch using {@link module:engine/model/model~Model#enqueueChange}:\r\n *\r\n * ```ts\r\n * model.enqueueChange( batch, writer => {\r\n * \twriter.insertText( 'foo', paragraph, 'end' );\r\n * } );\r\n * ```\r\n *\r\n * @see module:engine/model/model~Model#enqueueChange\r\n * @see module:engine/model/model~Model#change\r\n */\r\nexport default class Batch {\r\n    /**\r\n     * Creates a batch instance.\r\n     *\r\n     * @see module:engine/model/model~Model#enqueueChange\r\n     * @see module:engine/model/model~Model#change\r\n     * @param type A set of flags that specify the type of the batch. Batch type can alter how some of the features work\r\n     * when encountering a given `Batch` instance (for example, when a feature listens to applied operations).\r\n     */\r\n    constructor(type = {}) {\r\n        if (typeof type === 'string') {\r\n            type = type === 'transparent' ? { isUndoable: false } : {};\r\n            /**\r\n             * The string value for a `type` property of the `Batch` constructor has been deprecated and will be removed in the near future.\r\n             * Please refer to the {@link module:engine/model/batch~Batch#constructor `Batch` constructor API documentation} for more\r\n             * information.\r\n             *\r\n             * @error batch-constructor-deprecated-string-type\r\n             */\r\n            logWarning('batch-constructor-deprecated-string-type');\r\n        }\r\n        const { isUndoable = true, isLocal = true, isUndo = false, isTyping = false } = type;\r\n        this.operations = [];\r\n        this.isUndoable = isUndoable;\r\n        this.isLocal = isLocal;\r\n        this.isUndo = isUndo;\r\n        this.isTyping = isTyping;\r\n    }\r\n    /**\r\n     * The type of the batch.\r\n     *\r\n     * **This property has been deprecated and is always set to the `'default'` value.**\r\n     *\r\n     * It can be one of the following values:\r\n     * * `'default'` &ndash; All \"normal\" batches. This is the most commonly used type.\r\n     * * `'transparent'` &ndash; A batch that should be ignored by other features, i.e. an initial batch or collaborative editing\r\n     * changes.\r\n     *\r\n     * @deprecated\r\n     */\r\n    get type() {\r\n        /**\r\n         * The {@link module:engine/model/batch~Batch#type `Batch#type` } property has been deprecated and will be removed in the near\r\n         * future. Use `Batch#isLocal`, `Batch#isUndoable`, `Batch#isUndo` and `Batch#isTyping` instead.\r\n         *\r\n         * @error batch-type-deprecated\r\n         */\r\n        logWarning('batch-type-deprecated');\r\n        return 'default';\r\n    }\r\n    /**\r\n     * Returns the base version of this batch, which is equal to the base version of the first operation in the batch.\r\n     * If there are no operations in the batch or neither operation has the base version set, it returns `null`.\r\n     */\r\n    get baseVersion() {\r\n        for (const op of this.operations) {\r\n            if (op.baseVersion !== null) {\r\n                return op.baseVersion;\r\n            }\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Adds an operation to the batch instance.\r\n     *\r\n     * @param operation An operation to add.\r\n     * @returns The added operation.\r\n     */\r\n    addOperation(operation) {\r\n        operation.batch = this;\r\n        this.operations.push(operation);\r\n        return operation;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/differ\r\n */\r\nimport Position from './position';\r\nimport Range from './range';\r\n/**\r\n * Calculates the difference between two model states.\r\n *\r\n * Receives operations that are to be applied on the model document. Marks parts of the model document tree which\r\n * are changed and saves the state of these elements before the change. Then, it compares saved elements with the\r\n * changed elements, after all changes are applied on the model document. Calculates the diff between saved\r\n * elements and new ones and returns a change set.\r\n */\r\nexport default class Differ {\r\n    /**\r\n     * Creates a `Differ` instance.\r\n     *\r\n     * @param markerCollection Model's marker collection.\r\n     */\r\n    constructor(markerCollection) {\r\n        /**\r\n         * A map that stores changes that happened in a given element.\r\n         *\r\n         * The keys of the map are references to the model elements.\r\n         * The values of the map are arrays with changes that were done on this element.\r\n         */\r\n        this._changesInElement = new Map();\r\n        /**\r\n         * A map that stores \"element's children snapshots\". A snapshot is representing children of a given element before\r\n         * the first change was applied on that element. Snapshot items are objects with two properties: `name`,\r\n         * containing the element name (or `'$text'` for a text node) and `attributes` which is a map of the node's attributes.\r\n         */\r\n        this._elementSnapshots = new Map();\r\n        /**\r\n         * A map that stores all changed markers.\r\n         *\r\n         * The keys of the map are marker names.\r\n         * The values of the map are objects with the following properties:\r\n         * - `oldMarkerData`,\r\n         * - `newMarkerData`.\r\n         */\r\n        this._changedMarkers = new Map();\r\n        /**\r\n         * A map that stores all roots that have been changed.\r\n         *\r\n         * The keys are the names of the roots while value represents the changes.\r\n         */\r\n        this._changedRoots = new Map();\r\n        /**\r\n         * Stores the number of changes that were processed. Used to order the changes chronologically. It is important\r\n         * when changes are sorted.\r\n         */\r\n        this._changeCount = 0;\r\n        /**\r\n         * For efficiency purposes, `Differ` stores the change set returned by the differ after {@link #getChanges} call.\r\n         * Cache is reset each time a new operation is buffered. If the cache has not been reset, {@link #getChanges} will\r\n         * return the cached value instead of calculating it again.\r\n         *\r\n         * This property stores those changes that did not take place in graveyard root.\r\n         */\r\n        this._cachedChanges = null;\r\n        /**\r\n         * For efficiency purposes, `Differ` stores the change set returned by the differ after the {@link #getChanges} call.\r\n         * The cache is reset each time a new operation is buffered. If the cache has not been reset, {@link #getChanges} will\r\n         * return the cached value instead of calculating it again.\r\n         *\r\n         * This property stores all changes evaluated by `Differ`, including those that took place in the graveyard.\r\n         */\r\n        this._cachedChangesWithGraveyard = null;\r\n        /**\r\n         * Set of model items that were marked to get refreshed in {@link #_refreshItem}.\r\n         */\r\n        this._refreshedItems = new Set();\r\n        this._markerCollection = markerCollection;\r\n    }\r\n    /**\r\n     * Informs whether there are any changes buffered in `Differ`.\r\n     */\r\n    get isEmpty() {\r\n        return this._changesInElement.size == 0 && this._changedMarkers.size == 0 && this._changedRoots.size == 0;\r\n    }\r\n    /**\r\n     * Buffers the given operation. An operation has to be buffered before it is executed.\r\n     *\r\n     * @param operationToBuffer An operation to buffer.\r\n     */\r\n    bufferOperation(operationToBuffer) {\r\n        // Below we take an operation, check its type, then use its parameters in marking (private) methods.\r\n        // The general rule is to not mark elements inside inserted element. All inserted elements are re-rendered.\r\n        // Marking changes in them would cause a \"double\" changing then.\r\n        //\r\n        const operation = operationToBuffer;\r\n        switch (operation.type) {\r\n            case 'insert': {\r\n                if (this._isInInsertedElement(operation.position.parent)) {\r\n                    return;\r\n                }\r\n                this._markInsert(operation.position.parent, operation.position.offset, operation.nodes.maxOffset);\r\n                break;\r\n            }\r\n            case 'addAttribute':\r\n            case 'removeAttribute':\r\n            case 'changeAttribute': {\r\n                for (const item of operation.range.getItems({ shallow: true })) {\r\n                    if (this._isInInsertedElement(item.parent)) {\r\n                        continue;\r\n                    }\r\n                    this._markAttribute(item);\r\n                }\r\n                break;\r\n            }\r\n            case 'remove':\r\n            case 'move':\r\n            case 'reinsert': {\r\n                // When range is moved to the same position then not mark it as a change.\r\n                // See: https://github.com/ckeditor/ckeditor5-engine/issues/1664.\r\n                if (operation.sourcePosition.isEqual(operation.targetPosition) ||\r\n                    operation.sourcePosition.getShiftedBy(operation.howMany).isEqual(operation.targetPosition)) {\r\n                    return;\r\n                }\r\n                const sourceParentInserted = this._isInInsertedElement(operation.sourcePosition.parent);\r\n                const targetParentInserted = this._isInInsertedElement(operation.targetPosition.parent);\r\n                if (!sourceParentInserted) {\r\n                    this._markRemove(operation.sourcePosition.parent, operation.sourcePosition.offset, operation.howMany);\r\n                }\r\n                if (!targetParentInserted) {\r\n                    this._markInsert(operation.targetPosition.parent, operation.getMovedRangeStart().offset, operation.howMany);\r\n                }\r\n                break;\r\n            }\r\n            case 'rename': {\r\n                if (this._isInInsertedElement(operation.position.parent)) {\r\n                    return;\r\n                }\r\n                this._markRemove(operation.position.parent, operation.position.offset, 1);\r\n                this._markInsert(operation.position.parent, operation.position.offset, 1);\r\n                const range = Range._createFromPositionAndShift(operation.position, 1);\r\n                for (const marker of this._markerCollection.getMarkersIntersectingRange(range)) {\r\n                    const markerData = marker.getData();\r\n                    this.bufferMarkerChange(marker.name, markerData, markerData);\r\n                }\r\n                break;\r\n            }\r\n            case 'split': {\r\n                const splitElement = operation.splitPosition.parent;\r\n                // Mark that children of the split element were removed.\r\n                if (!this._isInInsertedElement(splitElement)) {\r\n                    this._markRemove(splitElement, operation.splitPosition.offset, operation.howMany);\r\n                }\r\n                // Mark that the new element (split copy) was inserted.\r\n                if (!this._isInInsertedElement(operation.insertionPosition.parent)) {\r\n                    this._markInsert(operation.insertionPosition.parent, operation.insertionPosition.offset, 1);\r\n                }\r\n                // If the split took the element from the graveyard, mark that the element from the graveyard was removed.\r\n                if (operation.graveyardPosition) {\r\n                    this._markRemove(operation.graveyardPosition.parent, operation.graveyardPosition.offset, 1);\r\n                }\r\n                break;\r\n            }\r\n            case 'merge': {\r\n                // Mark that the merged element was removed.\r\n                const mergedElement = operation.sourcePosition.parent;\r\n                if (!this._isInInsertedElement(mergedElement.parent)) {\r\n                    this._markRemove(mergedElement.parent, mergedElement.startOffset, 1);\r\n                }\r\n                // Mark that the merged element was inserted into graveyard.\r\n                const graveyardParent = operation.graveyardPosition.parent;\r\n                this._markInsert(graveyardParent, operation.graveyardPosition.offset, 1);\r\n                // Mark that children of merged element were inserted at new parent.\r\n                const mergedIntoElement = operation.targetPosition.parent;\r\n                if (!this._isInInsertedElement(mergedIntoElement)) {\r\n                    this._markInsert(mergedIntoElement, operation.targetPosition.offset, mergedElement.maxOffset);\r\n                }\r\n                break;\r\n            }\r\n            case 'detachRoot':\r\n            case 'addRoot': {\r\n                this._bufferRootStateChange(operation.rootName, operation.isAdd);\r\n                break;\r\n            }\r\n            case 'addRootAttribute':\r\n            case 'removeRootAttribute':\r\n            case 'changeRootAttribute': {\r\n                const rootName = operation.root.rootName;\r\n                this._bufferRootAttributeChange(rootName, operation.key, operation.oldValue, operation.newValue);\r\n                break;\r\n            }\r\n        }\r\n        // Clear cache after each buffered operation as it is no longer valid.\r\n        this._cachedChanges = null;\r\n    }\r\n    /**\r\n     * Buffers a marker change.\r\n     *\r\n     * @param markerName The name of the marker that changed.\r\n     * @param oldMarkerData Marker data before the change.\r\n     * @param newMarkerData Marker data after the change.\r\n     */\r\n    bufferMarkerChange(markerName, oldMarkerData, newMarkerData) {\r\n        const buffered = this._changedMarkers.get(markerName);\r\n        if (!buffered) {\r\n            this._changedMarkers.set(markerName, {\r\n                newMarkerData,\r\n                oldMarkerData\r\n            });\r\n        }\r\n        else {\r\n            buffered.newMarkerData = newMarkerData;\r\n            if (buffered.oldMarkerData.range == null && newMarkerData.range == null) {\r\n                // The marker is going to be removed (`newMarkerData.range == null`) but it did not exist before the first buffered change\r\n                // (`buffered.oldMarkerData.range == null`). In this case, do not keep the marker in buffer at all.\r\n                this._changedMarkers.delete(markerName);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Returns all markers that should be removed as a result of buffered changes.\r\n     *\r\n     * @returns Markers to remove. Each array item is an object containing the `name` and `range` properties.\r\n     */\r\n    getMarkersToRemove() {\r\n        const result = [];\r\n        for (const [name, change] of this._changedMarkers) {\r\n            if (change.oldMarkerData.range != null) {\r\n                result.push({ name, range: change.oldMarkerData.range });\r\n            }\r\n        }\r\n        return result;\r\n    }\r\n    /**\r\n     * Returns all markers which should be added as a result of buffered changes.\r\n     *\r\n     * @returns Markers to add. Each array item is an object containing the `name` and `range` properties.\r\n     */\r\n    getMarkersToAdd() {\r\n        const result = [];\r\n        for (const [name, change] of this._changedMarkers) {\r\n            if (change.newMarkerData.range != null) {\r\n                result.push({ name, range: change.newMarkerData.range });\r\n            }\r\n        }\r\n        return result;\r\n    }\r\n    /**\r\n     * Returns all markers which changed.\r\n     */\r\n    getChangedMarkers() {\r\n        return Array.from(this._changedMarkers).map(([name, change]) => ({\r\n            name,\r\n            data: {\r\n                oldRange: change.oldMarkerData.range,\r\n                newRange: change.newMarkerData.range\r\n            }\r\n        }));\r\n    }\r\n    /**\r\n     * Checks whether some of the buffered changes affect the editor data.\r\n     *\r\n     * Types of changes which affect the editor data:\r\n     *\r\n     * * model structure changes,\r\n     * * attribute changes,\r\n     * * a root is added or detached,\r\n     * * changes of markers which were defined as `affectsData`,\r\n     * * changes of markers' `affectsData` property.\r\n     */\r\n    hasDataChanges() {\r\n        if (this._changesInElement.size > 0) {\r\n            return true;\r\n        }\r\n        if (this._changedRoots.size > 0) {\r\n            return true;\r\n        }\r\n        for (const { newMarkerData, oldMarkerData } of this._changedMarkers.values()) {\r\n            if (newMarkerData.affectsData !== oldMarkerData.affectsData) {\r\n                return true;\r\n            }\r\n            if (newMarkerData.affectsData) {\r\n                const markerAdded = newMarkerData.range && !oldMarkerData.range;\r\n                const markerRemoved = !newMarkerData.range && oldMarkerData.range;\r\n                const markerChanged = newMarkerData.range && oldMarkerData.range && !newMarkerData.range.isEqual(oldMarkerData.range);\r\n                if (markerAdded || markerRemoved || markerChanged) {\r\n                    return true;\r\n                }\r\n            }\r\n        }\r\n        return false;\r\n    }\r\n    /**\r\n     * Calculates the diff between the old model tree state (the state before the first buffered operations since the last {@link #reset}\r\n     * call) and the new model tree state (actual one). It should be called after all buffered operations are executed.\r\n     *\r\n     * The diff set is returned as an array of {@link module:engine/model/differ~DiffItem diff items}, each describing a change done\r\n     * on the model. The items are sorted by the position on which the change happened. If a position\r\n     * {@link module:engine/model/position~Position#isBefore is before} another one, it will be on an earlier index in the diff set.\r\n     *\r\n     * **Note**: Elements inside inserted element will not have a separate diff item, only the top most element change will be reported.\r\n     *\r\n     * Because calculating the diff is a costly operation, the result is cached. If no new operation was buffered since the\r\n     * previous {@link #getChanges} call, the next call will return the cached value.\r\n     *\r\n     * @param options Additional options.\r\n     * @param options.includeChangesInGraveyard If set to `true`, also changes that happened\r\n     * in the graveyard root will be returned. By default, changes in the graveyard root are not returned.\r\n     * @returns Diff between the old and the new model tree state.\r\n     */\r\n    getChanges(options = {}) {\r\n        // If there are cached changes, just return them instead of calculating changes again.\r\n        if (this._cachedChanges) {\r\n            if (options.includeChangesInGraveyard) {\r\n                return this._cachedChangesWithGraveyard.slice();\r\n            }\r\n            else {\r\n                return this._cachedChanges.slice();\r\n            }\r\n        }\r\n        // Will contain returned results.\r\n        let diffSet = [];\r\n        // Check all changed elements.\r\n        for (const element of this._changesInElement.keys()) {\r\n            // Get changes for this element and sort them.\r\n            const changes = this._changesInElement.get(element).sort((a, b) => {\r\n                if (a.offset === b.offset) {\r\n                    if (a.type != b.type) {\r\n                        // If there are multiple changes at the same position, \"remove\" change should be first.\r\n                        // If the order is different, for example, we would first add some nodes and then removed them\r\n                        // (instead of the nodes that we should remove).\r\n                        return a.type == 'remove' ? -1 : 1;\r\n                    }\r\n                    return 0;\r\n                }\r\n                return a.offset < b.offset ? -1 : 1;\r\n            });\r\n            // Get children of this element before any change was applied on it.\r\n            const snapshotChildren = this._elementSnapshots.get(element);\r\n            // Get snapshot of current element's children.\r\n            const elementChildren = _getChildrenSnapshot(element.getChildren());\r\n            // Generate actions basing on changes done on element.\r\n            const actions = _generateActionsFromChanges(snapshotChildren.length, changes);\r\n            let i = 0; // Iterator in `elementChildren` array -- iterates through current children of element.\r\n            let j = 0; // Iterator in `snapshotChildren` array -- iterates through old children of element.\r\n            // Process every action.\r\n            for (const action of actions) {\r\n                if (action === 'i') {\r\n                    // Generate diff item for this element and insert it into the diff set.\r\n                    diffSet.push(this._getInsertDiff(element, i, elementChildren[i]));\r\n                    i++;\r\n                }\r\n                else if (action === 'r') {\r\n                    // Generate diff item for this element and insert it into the diff set.\r\n                    diffSet.push(this._getRemoveDiff(element, i, snapshotChildren[j]));\r\n                    j++;\r\n                }\r\n                else if (action === 'a') {\r\n                    // Take attributes from saved and current children.\r\n                    const elementAttributes = elementChildren[i].attributes;\r\n                    const snapshotAttributes = snapshotChildren[j].attributes;\r\n                    let range;\r\n                    if (elementChildren[i].name == '$text') {\r\n                        range = new Range(Position._createAt(element, i), Position._createAt(element, i + 1));\r\n                    }\r\n                    else {\r\n                        const index = element.offsetToIndex(i);\r\n                        range = new Range(Position._createAt(element, i), Position._createAt(element.getChild(index), 0));\r\n                    }\r\n                    // Generate diff items for this change (there might be multiple attributes changed and\r\n                    // there is a single diff for each of them) and insert them into the diff set.\r\n                    diffSet.push(...this._getAttributesDiff(range, snapshotAttributes, elementAttributes));\r\n                    i++;\r\n                    j++;\r\n                }\r\n                else {\r\n                    // `action` is 'equal'. Child not changed.\r\n                    i++;\r\n                    j++;\r\n                }\r\n            }\r\n        }\r\n        // Then, sort the changes by the position (change at position before other changes is first).\r\n        diffSet.sort((a, b) => {\r\n            // If the change is in different root, we don't care much, but we'd like to have all changes in given\r\n            // root \"together\" in the array. So let's just sort them by the root name. It does not matter which root\r\n            // will be processed first.\r\n            if (a.position.root != b.position.root) {\r\n                return a.position.root.rootName < b.position.root.rootName ? -1 : 1;\r\n            }\r\n            // If change happens at the same position...\r\n            if (a.position.isEqual(b.position)) {\r\n                // Keep chronological order of operations.\r\n                return a.changeCount - b.changeCount;\r\n            }\r\n            // If positions differ, position \"on the left\" should be earlier in the result.\r\n            return a.position.isBefore(b.position) ? -1 : 1;\r\n        });\r\n        // Glue together multiple changes (mostly on text nodes).\r\n        for (let i = 1, prevIndex = 0; i < diffSet.length; i++) {\r\n            const prevDiff = diffSet[prevIndex];\r\n            const thisDiff = diffSet[i];\r\n            // Glue remove changes if they happen on text on same position.\r\n            const isConsecutiveTextRemove = prevDiff.type == 'remove' && thisDiff.type == 'remove' &&\r\n                prevDiff.name == '$text' && thisDiff.name == '$text' &&\r\n                prevDiff.position.isEqual(thisDiff.position);\r\n            // Glue insert changes if they happen on text on consecutive fragments.\r\n            const isConsecutiveTextAdd = prevDiff.type == 'insert' && thisDiff.type == 'insert' &&\r\n                prevDiff.name == '$text' && thisDiff.name == '$text' &&\r\n                prevDiff.position.parent == thisDiff.position.parent &&\r\n                prevDiff.position.offset + prevDiff.length == thisDiff.position.offset;\r\n            // Glue attribute changes if they happen on consecutive fragments and have same key, old value and new value.\r\n            const isConsecutiveAttributeChange = prevDiff.type == 'attribute' && thisDiff.type == 'attribute' &&\r\n                prevDiff.position.parent == thisDiff.position.parent &&\r\n                prevDiff.range.isFlat && thisDiff.range.isFlat &&\r\n                (prevDiff.position.offset + prevDiff.length) == thisDiff.position.offset &&\r\n                prevDiff.attributeKey == thisDiff.attributeKey &&\r\n                prevDiff.attributeOldValue == thisDiff.attributeOldValue &&\r\n                prevDiff.attributeNewValue == thisDiff.attributeNewValue;\r\n            if (isConsecutiveTextRemove || isConsecutiveTextAdd || isConsecutiveAttributeChange) {\r\n                prevDiff.length++;\r\n                if (isConsecutiveAttributeChange) {\r\n                    prevDiff.range.end = prevDiff.range.end.getShiftedBy(1);\r\n                }\r\n                diffSet[i] = null;\r\n            }\r\n            else {\r\n                prevIndex = i;\r\n            }\r\n        }\r\n        diffSet = diffSet.filter(v => v);\r\n        // Remove `changeCount` property from diff items. It is used only for sorting and is internal thing.\r\n        for (const item of diffSet) {\r\n            delete item.changeCount;\r\n            if (item.type == 'attribute') {\r\n                delete item.position;\r\n                delete item.length;\r\n            }\r\n        }\r\n        this._changeCount = 0;\r\n        // Cache changes.\r\n        this._cachedChangesWithGraveyard = diffSet;\r\n        this._cachedChanges = diffSet.filter(_changesInGraveyardFilter);\r\n        if (options.includeChangesInGraveyard) {\r\n            return this._cachedChangesWithGraveyard.slice();\r\n        }\r\n        else {\r\n            return this._cachedChanges.slice();\r\n        }\r\n    }\r\n    /**\r\n     * Returns all roots that have changed (either were attached, or detached, or their attributes changed).\r\n     *\r\n     * @returns Diff between the old and the new roots state.\r\n     */\r\n    getChangedRoots() {\r\n        return Array.from(this._changedRoots.values()).map(diffItem => {\r\n            const entry = { ...diffItem };\r\n            if (entry.state !== undefined) {\r\n                // The root was attached or detached -- do not return its attributes changes.\r\n                // If the root was attached, it should be handled as a whole, together with its attributes, the same way as model nodes.\r\n                // If the root was detached, its attributes should be discarded anyway.\r\n                //\r\n                // Keep in mind that filtering must happen on this stage (when retrieving changes). If filtering happens on-the-fly as\r\n                // the attributes change, it may lead to incorrect situation, e.g.: detach root, change attribute, re-attach root.\r\n                // In this case, attribute change cannot be filtered. After the root is re-attached, the attribute change must be kept.\r\n                delete entry.attributes;\r\n            }\r\n            return entry;\r\n        });\r\n    }\r\n    /**\r\n     * Returns a set of model items that were marked to get refreshed.\r\n     */\r\n    getRefreshedItems() {\r\n        return new Set(this._refreshedItems);\r\n    }\r\n    /**\r\n     * Resets `Differ`. Removes all buffered changes.\r\n     */\r\n    reset() {\r\n        this._changesInElement.clear();\r\n        this._elementSnapshots.clear();\r\n        this._changedMarkers.clear();\r\n        this._changedRoots.clear();\r\n        this._refreshedItems = new Set();\r\n        this._cachedChanges = null;\r\n    }\r\n    /**\r\n     * Buffers the root state change after the root was attached or detached\r\n     */\r\n    _bufferRootStateChange(rootName, isAttached) {\r\n        if (!this._changedRoots.has(rootName)) {\r\n            this._changedRoots.set(rootName, { name: rootName, state: isAttached ? 'attached' : 'detached' });\r\n            return;\r\n        }\r\n        const diffItem = this._changedRoots.get(rootName);\r\n        if (diffItem.state !== undefined) {\r\n            // Root `state` can only toggle between of the values ('attached' or 'detached') and no value. It cannot be any other way,\r\n            // because if the root was originally attached it can only become detached. Then, if it is re-attached in the same batch of\r\n            // changes, it gets back to \"no change\" (which means no value). Same if the root was originally detached.\r\n            delete diffItem.state;\r\n            if (diffItem.attributes === undefined) {\r\n                // If there is no `state` change and no `attributes` change, remove the entry.\r\n                this._changedRoots.delete(rootName);\r\n            }\r\n        }\r\n        else {\r\n            diffItem.state = isAttached ? 'attached' : 'detached';\r\n        }\r\n    }\r\n    /**\r\n     * Buffers a root attribute change.\r\n     */\r\n    _bufferRootAttributeChange(rootName, key, oldValue, newValue) {\r\n        const diffItem = this._changedRoots.get(rootName) || { name: rootName };\r\n        const attrs = diffItem.attributes || {};\r\n        if (attrs[key]) {\r\n            // If this attribute or metadata was already changed earlier and is changed again, check to what value it is changed.\r\n            const attrEntry = attrs[key];\r\n            if (newValue === attrEntry.oldValue) {\r\n                // If it was changed back to the old value, remove the entry.\r\n                delete attrs[key];\r\n            }\r\n            else {\r\n                // If it was changed to a different value, update the entry.\r\n                attrEntry.newValue = newValue;\r\n            }\r\n        }\r\n        else {\r\n            // If this attribute or metadata was not set earlier, add an entry.\r\n            attrs[key] = { oldValue, newValue };\r\n        }\r\n        if (Object.entries(attrs).length === 0) {\r\n            // If attributes or metadata changes set became empty, remove it from the diff item.\r\n            delete diffItem.attributes;\r\n            if (diffItem.state === undefined) {\r\n                // If there is no `state` change and no `attributes` change, remove the entry.\r\n                this._changedRoots.delete(rootName);\r\n            }\r\n        }\r\n        else {\r\n            // Make sure that, if a new object in the structure was created, it gets set.\r\n            diffItem.attributes = attrs;\r\n            this._changedRoots.set(rootName, diffItem);\r\n        }\r\n    }\r\n    /**\r\n     * Marks the given `item` in differ to be \"refreshed\". It means that the item will be marked as removed and inserted\r\n     * in the differ changes set, so it will be effectively re-converted when the differ changes are handled by a dispatcher.\r\n     *\r\n     * @internal\r\n     * @param item Item to refresh.\r\n     */\r\n    _refreshItem(item) {\r\n        if (this._isInInsertedElement(item.parent)) {\r\n            return;\r\n        }\r\n        this._markRemove(item.parent, item.startOffset, item.offsetSize);\r\n        this._markInsert(item.parent, item.startOffset, item.offsetSize);\r\n        this._refreshedItems.add(item);\r\n        const range = Range._createOn(item);\r\n        for (const marker of this._markerCollection.getMarkersIntersectingRange(range)) {\r\n            const markerData = marker.getData();\r\n            this.bufferMarkerChange(marker.name, markerData, markerData);\r\n        }\r\n        // Clear cache after each buffered operation as it is no longer valid.\r\n        this._cachedChanges = null;\r\n    }\r\n    /**\r\n     * Saves and handles an insert change.\r\n     */\r\n    _markInsert(parent, offset, howMany) {\r\n        const changeItem = { type: 'insert', offset, howMany, count: this._changeCount++ };\r\n        this._markChange(parent, changeItem);\r\n    }\r\n    /**\r\n     * Saves and handles a remove change.\r\n     */\r\n    _markRemove(parent, offset, howMany) {\r\n        const changeItem = { type: 'remove', offset, howMany, count: this._changeCount++ };\r\n        this._markChange(parent, changeItem);\r\n        this._removeAllNestedChanges(parent, offset, howMany);\r\n    }\r\n    /**\r\n     * Saves and handles an attribute change.\r\n     */\r\n    _markAttribute(item) {\r\n        const changeItem = { type: 'attribute', offset: item.startOffset, howMany: item.offsetSize, count: this._changeCount++ };\r\n        this._markChange(item.parent, changeItem);\r\n    }\r\n    /**\r\n     * Saves and handles a model change.\r\n     */\r\n    _markChange(parent, changeItem) {\r\n        // First, make a snapshot of this parent's children (it will be made only if it was not made before).\r\n        this._makeSnapshot(parent);\r\n        // Then, get all changes that already were done on the element (empty array if this is the first change).\r\n        const changes = this._getChangesForElement(parent);\r\n        // Then, look through all the changes, and transform them or the new change.\r\n        this._handleChange(changeItem, changes);\r\n        // Add the new change.\r\n        changes.push(changeItem);\r\n        // Remove incorrect changes. During transformation some change might be, for example, included in another.\r\n        // In that case, the change will have `howMany` property set to `0` or less. We need to remove those changes.\r\n        for (let i = 0; i < changes.length; i++) {\r\n            if (changes[i].howMany < 1) {\r\n                changes.splice(i, 1);\r\n                i--;\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Gets an array of changes that have already been saved for a given element.\r\n     */\r\n    _getChangesForElement(element) {\r\n        let changes;\r\n        if (this._changesInElement.has(element)) {\r\n            changes = this._changesInElement.get(element);\r\n        }\r\n        else {\r\n            changes = [];\r\n            this._changesInElement.set(element, changes);\r\n        }\r\n        return changes;\r\n    }\r\n    /**\r\n     * Saves a children snapshot for a given element.\r\n     */\r\n    _makeSnapshot(element) {\r\n        if (!this._elementSnapshots.has(element)) {\r\n            this._elementSnapshots.set(element, _getChildrenSnapshot(element.getChildren()));\r\n        }\r\n    }\r\n    /**\r\n     * For a given newly saved change, compares it with a change already done on the element and modifies the incoming\r\n     * change and/or the old change.\r\n     *\r\n     * @param inc Incoming (new) change.\r\n     * @param changes An array containing all the changes done on that element.\r\n     */\r\n    _handleChange(inc, changes) {\r\n        // We need a helper variable that will store how many nodes are to be still handled for this change item.\r\n        // `nodesToHandle` (how many nodes still need to be handled) and `howMany` (how many nodes were affected)\r\n        // needs to be differentiated.\r\n        //\r\n        // This comes up when there are multiple changes that are affected by `inc` change item.\r\n        //\r\n        // For example: assume two insert changes: `{ offset: 2, howMany: 1 }` and `{ offset: 5, howMany: 1 }`.\r\n        // Assume that `inc` change is remove `{ offset: 2, howMany: 2, nodesToHandle: 2 }`.\r\n        //\r\n        // Then, we:\r\n        // - \"forget\" about first insert change (it is \"eaten\" by remove),\r\n        // - because of that, at the end we will want to remove only one node (`nodesToHandle = 1`),\r\n        // - but still we have to change offset of the second insert change from `5` to `3`!\r\n        //\r\n        // So, `howMany` does not change throughout items transformation and keeps information about how many nodes were affected,\r\n        // while `nodesToHandle` means how many nodes need to be handled after the change item is transformed by other changes.\r\n        inc.nodesToHandle = inc.howMany;\r\n        for (const old of changes) {\r\n            const incEnd = inc.offset + inc.howMany;\r\n            const oldEnd = old.offset + old.howMany;\r\n            if (inc.type == 'insert') {\r\n                if (old.type == 'insert') {\r\n                    if (inc.offset <= old.offset) {\r\n                        old.offset += inc.howMany;\r\n                    }\r\n                    else if (inc.offset < oldEnd) {\r\n                        old.howMany += inc.nodesToHandle;\r\n                        inc.nodesToHandle = 0;\r\n                    }\r\n                }\r\n                if (old.type == 'remove') {\r\n                    if (inc.offset < old.offset) {\r\n                        old.offset += inc.howMany;\r\n                    }\r\n                }\r\n                if (old.type == 'attribute') {\r\n                    if (inc.offset <= old.offset) {\r\n                        old.offset += inc.howMany;\r\n                    }\r\n                    else if (inc.offset < oldEnd) {\r\n                        // This case is more complicated, because attribute change has to be split into two.\r\n                        // Example (assume that uppercase and lowercase letters mean different attributes):\r\n                        //\r\n                        // initial state:\t\tabcxyz\r\n                        // attribute change:\taBCXYz\r\n                        // incoming insert:\t\taBCfooXYz\r\n                        //\r\n                        // Change ranges cannot intersect because each item has to be described exactly (it was either\r\n                        // not changed, inserted, removed, or its attribute was changed). That's why old attribute\r\n                        // change has to be split and both parts has to be handled separately from now on.\r\n                        const howMany = old.howMany;\r\n                        old.howMany = inc.offset - old.offset;\r\n                        // Add the second part of attribute change to the beginning of processed array so it won't\r\n                        // be processed again in this loop.\r\n                        changes.unshift({\r\n                            type: 'attribute',\r\n                            offset: incEnd,\r\n                            howMany: howMany - old.howMany,\r\n                            count: this._changeCount++\r\n                        });\r\n                    }\r\n                }\r\n            }\r\n            if (inc.type == 'remove') {\r\n                if (old.type == 'insert') {\r\n                    if (incEnd <= old.offset) {\r\n                        old.offset -= inc.howMany;\r\n                    }\r\n                    else if (incEnd <= oldEnd) {\r\n                        if (inc.offset < old.offset) {\r\n                            const intersectionLength = incEnd - old.offset;\r\n                            old.offset = inc.offset;\r\n                            old.howMany -= intersectionLength;\r\n                            inc.nodesToHandle -= intersectionLength;\r\n                        }\r\n                        else {\r\n                            old.howMany -= inc.nodesToHandle;\r\n                            inc.nodesToHandle = 0;\r\n                        }\r\n                    }\r\n                    else {\r\n                        if (inc.offset <= old.offset) {\r\n                            inc.nodesToHandle -= old.howMany;\r\n                            old.howMany = 0;\r\n                        }\r\n                        else if (inc.offset < oldEnd) {\r\n                            const intersectionLength = oldEnd - inc.offset;\r\n                            old.howMany -= intersectionLength;\r\n                            inc.nodesToHandle -= intersectionLength;\r\n                        }\r\n                    }\r\n                }\r\n                if (old.type == 'remove') {\r\n                    if (incEnd <= old.offset) {\r\n                        old.offset -= inc.howMany;\r\n                    }\r\n                    else if (inc.offset < old.offset) {\r\n                        inc.nodesToHandle += old.howMany;\r\n                        old.howMany = 0;\r\n                    }\r\n                }\r\n                if (old.type == 'attribute') {\r\n                    if (incEnd <= old.offset) {\r\n                        old.offset -= inc.howMany;\r\n                    }\r\n                    else if (inc.offset < old.offset) {\r\n                        const intersectionLength = incEnd - old.offset;\r\n                        old.offset = inc.offset;\r\n                        old.howMany -= intersectionLength;\r\n                    }\r\n                    else if (inc.offset < oldEnd) {\r\n                        if (incEnd <= oldEnd) {\r\n                            // On first sight in this case we don't need to split attribute operation into two.\r\n                            // However the changes set is later converted to actions (see `_generateActionsFromChanges`).\r\n                            // For that reason, no two changes may intersect.\r\n                            // So we cannot have an attribute change that \"contains\" remove change.\r\n                            // Attribute change needs to be split.\r\n                            const howMany = old.howMany;\r\n                            old.howMany = inc.offset - old.offset;\r\n                            const howManyAfter = howMany - old.howMany - inc.nodesToHandle;\r\n                            // Add the second part of attribute change to the beginning of processed array so it won't\r\n                            // be processed again in this loop.\r\n                            changes.unshift({\r\n                                type: 'attribute',\r\n                                offset: inc.offset,\r\n                                howMany: howManyAfter,\r\n                                count: this._changeCount++\r\n                            });\r\n                        }\r\n                        else {\r\n                            old.howMany -= oldEnd - inc.offset;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            if (inc.type == 'attribute') {\r\n                // In case of attribute change, `howMany` should be kept same as `nodesToHandle`. It's not an error.\r\n                if (old.type == 'insert') {\r\n                    if (inc.offset < old.offset && incEnd > old.offset) {\r\n                        if (incEnd > oldEnd) {\r\n                            // This case is similar to a case described when incoming change was insert and old change was attribute.\r\n                            // See comment above.\r\n                            //\r\n                            // This time incoming change is attribute. We need to split incoming change in this case too.\r\n                            // However this time, the second part of the attribute change needs to be processed further\r\n                            // because there might be other changes that it collides with.\r\n                            const attributePart = {\r\n                                type: 'attribute',\r\n                                offset: oldEnd,\r\n                                howMany: incEnd - oldEnd,\r\n                                count: this._changeCount++\r\n                            };\r\n                            this._handleChange(attributePart, changes);\r\n                            changes.push(attributePart);\r\n                        }\r\n                        inc.nodesToHandle = old.offset - inc.offset;\r\n                        inc.howMany = inc.nodesToHandle;\r\n                    }\r\n                    else if (inc.offset >= old.offset && inc.offset < oldEnd) {\r\n                        if (incEnd > oldEnd) {\r\n                            inc.nodesToHandle = incEnd - oldEnd;\r\n                            inc.offset = oldEnd;\r\n                        }\r\n                        else {\r\n                            inc.nodesToHandle = 0;\r\n                        }\r\n                    }\r\n                }\r\n                if (old.type == 'remove') {\r\n                    // This is a case when attribute change \"contains\" remove change.\r\n                    // The attribute change needs to be split into two because changes cannot intersect.\r\n                    if (inc.offset < old.offset && incEnd > old.offset) {\r\n                        const attributePart = {\r\n                            type: 'attribute',\r\n                            offset: old.offset,\r\n                            howMany: incEnd - old.offset,\r\n                            count: this._changeCount++\r\n                        };\r\n                        this._handleChange(attributePart, changes);\r\n                        changes.push(attributePart);\r\n                        inc.nodesToHandle = old.offset - inc.offset;\r\n                        inc.howMany = inc.nodesToHandle;\r\n                    }\r\n                }\r\n                if (old.type == 'attribute') {\r\n                    // There are only two conflicting scenarios possible here:\r\n                    if (inc.offset >= old.offset && incEnd <= oldEnd) {\r\n                        // `old` change includes `inc` change, or they are the same.\r\n                        inc.nodesToHandle = 0;\r\n                        inc.howMany = 0;\r\n                        inc.offset = 0;\r\n                    }\r\n                    else if (inc.offset <= old.offset && incEnd >= oldEnd) {\r\n                        // `inc` change includes `old` change.\r\n                        old.howMany = 0;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        inc.howMany = inc.nodesToHandle;\r\n        delete inc.nodesToHandle;\r\n    }\r\n    /**\r\n     * Returns an object with a single insert change description.\r\n     *\r\n     * @param parent The element in which the change happened.\r\n     * @param offset The offset at which change happened.\r\n     * @param elementSnapshot The snapshot of the removed element a character.\r\n     * @returns The diff item.\r\n     */\r\n    _getInsertDiff(parent, offset, elementSnapshot) {\r\n        return {\r\n            type: 'insert',\r\n            position: Position._createAt(parent, offset),\r\n            name: elementSnapshot.name,\r\n            attributes: new Map(elementSnapshot.attributes),\r\n            length: 1,\r\n            changeCount: this._changeCount++\r\n        };\r\n    }\r\n    /**\r\n     * Returns an object with a single remove change description.\r\n     *\r\n     * @param parent The element in which change happened.\r\n     * @param offset The offset at which change happened.\r\n     * @param elementSnapshot The snapshot of the removed element a character.\r\n     * @returns The diff item.\r\n     */\r\n    _getRemoveDiff(parent, offset, elementSnapshot) {\r\n        return {\r\n            type: 'remove',\r\n            position: Position._createAt(parent, offset),\r\n            name: elementSnapshot.name,\r\n            attributes: new Map(elementSnapshot.attributes),\r\n            length: 1,\r\n            changeCount: this._changeCount++\r\n        };\r\n    }\r\n    /**\r\n     * Returns an array of objects where each one is a single attribute change description.\r\n     *\r\n     * @param range The range where the change happened.\r\n     * @param oldAttributes A map, map iterator or compatible object that contains attributes before the change.\r\n     * @param newAttributes A map, map iterator or compatible object that contains attributes after the change.\r\n     * @returns An array containing one or more diff items.\r\n     */\r\n    _getAttributesDiff(range, oldAttributes, newAttributes) {\r\n        // Results holder.\r\n        const diffs = [];\r\n        // Clone new attributes as we will be performing changes on this object.\r\n        newAttributes = new Map(newAttributes);\r\n        // Look through old attributes.\r\n        for (const [key, oldValue] of oldAttributes) {\r\n            // Check what is the new value of the attribute (or if it was removed).\r\n            const newValue = newAttributes.has(key) ? newAttributes.get(key) : null;\r\n            // If values are different (or attribute was removed)...\r\n            if (newValue !== oldValue) {\r\n                // Add diff item.\r\n                diffs.push({\r\n                    type: 'attribute',\r\n                    position: range.start,\r\n                    range: range.clone(),\r\n                    length: 1,\r\n                    attributeKey: key,\r\n                    attributeOldValue: oldValue,\r\n                    attributeNewValue: newValue,\r\n                    changeCount: this._changeCount++\r\n                });\r\n            }\r\n            // Prevent returning two diff items for the same change.\r\n            newAttributes.delete(key);\r\n        }\r\n        // Look through new attributes that weren't handled above.\r\n        for (const [key, newValue] of newAttributes) {\r\n            // Each of them is a new attribute. Add diff item.\r\n            diffs.push({\r\n                type: 'attribute',\r\n                position: range.start,\r\n                range: range.clone(),\r\n                length: 1,\r\n                attributeKey: key,\r\n                attributeOldValue: null,\r\n                attributeNewValue: newValue,\r\n                changeCount: this._changeCount++\r\n            });\r\n        }\r\n        return diffs;\r\n    }\r\n    /**\r\n     * Checks whether given element or any of its parents is an element that is buffered as an inserted element.\r\n     */\r\n    _isInInsertedElement(element) {\r\n        const parent = element.parent;\r\n        if (!parent) {\r\n            return false;\r\n        }\r\n        const changes = this._changesInElement.get(parent);\r\n        const offset = element.startOffset;\r\n        if (changes) {\r\n            for (const change of changes) {\r\n                if (change.type == 'insert' && offset >= change.offset && offset < change.offset + change.howMany) {\r\n                    return true;\r\n                }\r\n            }\r\n        }\r\n        return this._isInInsertedElement(parent);\r\n    }\r\n    /**\r\n     * Removes deeply all buffered changes that are registered in elements from range specified by `parent`, `offset`\r\n     * and `howMany`.\r\n     */\r\n    _removeAllNestedChanges(parent, offset, howMany) {\r\n        const range = new Range(Position._createAt(parent, offset), Position._createAt(parent, offset + howMany));\r\n        for (const item of range.getItems({ shallow: true })) {\r\n            if (item.is('element')) {\r\n                this._elementSnapshots.delete(item);\r\n                this._changesInElement.delete(item);\r\n                this._removeAllNestedChanges(item, 0, item.maxOffset);\r\n            }\r\n        }\r\n    }\r\n}\r\n/**\r\n * Returns an array that is a copy of passed child list with the exception that text nodes are split to one or more\r\n * objects, each representing one character and attributes set on that character.\r\n */\r\nfunction _getChildrenSnapshot(children) {\r\n    const snapshot = [];\r\n    for (const child of children) {\r\n        if (child.is('$text')) {\r\n            for (let i = 0; i < child.data.length; i++) {\r\n                snapshot.push({\r\n                    name: '$text',\r\n                    attributes: new Map(child.getAttributes())\r\n                });\r\n            }\r\n        }\r\n        else {\r\n            snapshot.push({\r\n                name: child.name,\r\n                attributes: new Map(child.getAttributes())\r\n            });\r\n        }\r\n    }\r\n    return snapshot;\r\n}\r\n/**\r\n * Generates array of actions for given changes set.\r\n * It simulates what `diff` function does.\r\n * Generated actions are:\r\n * - 'e' for 'equal' - when item at that position did not change,\r\n * - 'i' for 'insert' - when item at that position was inserted,\r\n * - 'r' for 'remove' - when item at that position was removed,\r\n * - 'a' for 'attribute' - when item at that position has it attributes changed.\r\n *\r\n * Example (assume that uppercase letters have bold attribute, compare with function code):\r\n *\r\n * children before:\tfooBAR\r\n * children after:\tfoxybAR\r\n *\r\n * changes: type: remove, offset: 1, howMany: 1\r\n *\t\t\ttype: insert, offset: 2, howMany: 2\r\n *\t\t\ttype: attribute, offset: 4, howMany: 1\r\n *\r\n * expected actions: equal (f), remove (o), equal (o), insert (x), insert (y), attribute (b), equal (A), equal (R)\r\n *\r\n * steps taken by th script:\r\n *\r\n * 1. change = \"type: remove, offset: 1, howMany: 1\"; offset = 0; oldChildrenHandled = 0\r\n *    1.1 between this change and the beginning is one not-changed node, fill with one equal action, one old child has been handled\r\n *    1.2 this change removes one node, add one remove action\r\n *    1.3 change last visited `offset` to 1\r\n *    1.4 since an old child has been removed, one more old child has been handled\r\n *    1.5 actions at this point are: equal, remove\r\n *\r\n * 2. change = \"type: insert, offset: 2, howMany: 2\"; offset = 1; oldChildrenHandled = 2\r\n *    2.1 between this change and previous change is one not-changed node, add equal action, another one old children has been handled\r\n *    2.2 this change inserts two nodes, add two insert actions\r\n *    2.3 change last visited offset to the end of the inserted range, that is 4\r\n *    2.4 actions at this point are: equal, remove, equal, insert, insert\r\n *\r\n * 3. change = \"type: attribute, offset: 4, howMany: 1\"; offset = 4, oldChildrenHandled = 3\r\n *    3.1 between this change and previous change are no not-changed nodes\r\n *    3.2 this change changes one node, add one attribute action\r\n *    3.3 change last visited `offset` to the end of change range, that is 5\r\n *    3.4 since an old child has been changed, one more old child has been handled\r\n *    3.5 actions at this point are: equal, remove, equal, insert, insert, attribute\r\n *\r\n * 4. after loop oldChildrenHandled = 4, oldChildrenLength = 6 (fooBAR is 6 characters)\r\n *    4.1 fill up with two equal actions\r\n *\r\n * The result actions are: equal, remove, equal, insert, insert, attribute, equal, equal.\r\n */\r\nfunction _generateActionsFromChanges(oldChildrenLength, changes) {\r\n    const actions = [];\r\n    let offset = 0;\r\n    let oldChildrenHandled = 0;\r\n    // Go through all buffered changes.\r\n    for (const change of changes) {\r\n        // First, fill \"holes\" between changes with \"equal\" actions.\r\n        if (change.offset > offset) {\r\n            for (let i = 0; i < change.offset - offset; i++) {\r\n                actions.push('e');\r\n            }\r\n            oldChildrenHandled += change.offset - offset;\r\n        }\r\n        // Then, fill up actions accordingly to change type.\r\n        if (change.type == 'insert') {\r\n            for (let i = 0; i < change.howMany; i++) {\r\n                actions.push('i');\r\n            }\r\n            // The last handled offset is after inserted range.\r\n            offset = change.offset + change.howMany;\r\n        }\r\n        else if (change.type == 'remove') {\r\n            for (let i = 0; i < change.howMany; i++) {\r\n                actions.push('r');\r\n            }\r\n            // The last handled offset is at the position where the nodes were removed.\r\n            offset = change.offset;\r\n            // We removed `howMany` old nodes, update `oldChildrenHandled`.\r\n            oldChildrenHandled += change.howMany;\r\n        }\r\n        else {\r\n            actions.push(...'a'.repeat(change.howMany).split(''));\r\n            // The last handled offset is at the position after the changed range.\r\n            offset = change.offset + change.howMany;\r\n            // We changed `howMany` old nodes, update `oldChildrenHandled`.\r\n            oldChildrenHandled += change.howMany;\r\n        }\r\n    }\r\n    // Fill \"equal\" actions at the end of actions set. Use `oldChildrenHandled` to see how many children\r\n    // has not been changed / removed at the end of their parent.\r\n    if (oldChildrenHandled < oldChildrenLength) {\r\n        for (let i = 0; i < oldChildrenLength - oldChildrenHandled - offset; i++) {\r\n            actions.push('e');\r\n        }\r\n    }\r\n    return actions;\r\n}\r\n/**\r\n * Filter callback for Array.filter that filters out change entries that are in graveyard.\r\n */\r\nfunction _changesInGraveyardFilter(entry) {\r\n    const posInGy = 'position' in entry && entry.position.root.rootName == '$graveyard';\r\n    const rangeInGy = 'range' in entry && entry.range.root.rootName == '$graveyard';\r\n    return !posInGy && !rangeInGy;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { CKEditorError } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * @module engine/model/history\r\n */\r\n/**\r\n * `History` keeps the track of all the operations applied to the {@link module:engine/model/document~Document document}.\r\n */\r\nexport default class History {\r\n    constructor() {\r\n        /**\r\n         * Operations added to the history.\r\n         */\r\n        this._operations = [];\r\n        /**\r\n         * Holds an information which {@link module:engine/model/operation/operation~Operation operation} undoes which\r\n         * {@link module:engine/model/operation/operation~Operation operation}.\r\n         *\r\n         * Keys of the map are \"undoing operations\", that is operations that undone some other operations. For each key, the\r\n         * value is an operation that has been undone by the \"undoing operation\".\r\n         */\r\n        this._undoPairs = new Map();\r\n        /**\r\n         * Holds all undone operations.\r\n         */\r\n        this._undoneOperations = new Set();\r\n        /**\r\n         * A map that allows retrieving the operations fast based on the given base version.\r\n         */\r\n        this._baseVersionToOperationIndex = new Map();\r\n        /**\r\n         * The history version.\r\n         */\r\n        this._version = 0;\r\n        /**\r\n         * The gap pairs kept in the <from,to> format.\r\n         *\r\n         * Anytime the `history.version` is set to a version larger than `history.version + 1`,\r\n         * a new <lastHistoryVersion, newHistoryVersion> entry is added to the map.\r\n         */\r\n        this._gaps = new Map();\r\n    }\r\n    /**\r\n     * The version of the last operation in the history.\r\n     *\r\n     * The history version is incremented automatically when a new operation is added to the history.\r\n     * Setting the version manually should be done only in rare circumstances when a gap is planned\r\n     * between history versions. When doing so, a gap will be created and the history will accept adding\r\n     * an operation with base version equal to the new history version.\r\n     */\r\n    get version() {\r\n        return this._version;\r\n    }\r\n    set version(version) {\r\n        // Store a gap if there are some operations already in the history and the\r\n        // new version does not increment the latest one.\r\n        if (this._operations.length && version > this._version + 1) {\r\n            this._gaps.set(this._version, version);\r\n        }\r\n        this._version = version;\r\n    }\r\n    /**\r\n     * The last history operation.\r\n     */\r\n    get lastOperation() {\r\n        return this._operations[this._operations.length - 1];\r\n    }\r\n    /**\r\n     * Adds an operation to the history and increments the history version.\r\n     *\r\n     * The operation's base version should be equal to the history version. Otherwise an error is thrown.\r\n     */\r\n    addOperation(operation) {\r\n        if (operation.baseVersion !== this.version) {\r\n            /**\r\n             * Only operations with matching versions can be added to the history.\r\n             *\r\n             * @error model-document-history-addoperation-incorrect-version\r\n             * @param errorData The operation and the current document history version.\r\n             */\r\n            throw new CKEditorError('model-document-history-addoperation-incorrect-version', this, {\r\n                operation,\r\n                historyVersion: this.version\r\n            });\r\n        }\r\n        this._operations.push(operation);\r\n        this._version++;\r\n        this._baseVersionToOperationIndex.set(operation.baseVersion, this._operations.length - 1);\r\n    }\r\n    /**\r\n     * Returns operations from the given range of operation base versions that were added to the history.\r\n     *\r\n     * Note that there may be gaps in operations base versions.\r\n     *\r\n     * @param fromBaseVersion Base version from which operations should be returned (inclusive).\r\n     * @param toBaseVersion Base version up to which operations should be returned (exclusive).\r\n     * @returns History operations for the given range, in chronological order.\r\n     */\r\n    getOperations(fromBaseVersion, toBaseVersion = this.version) {\r\n        // When there is no operation in the history, return an empty array.\r\n        // After that we can be sure that `firstOperation`, `lastOperation` are not nullish.\r\n        if (!this._operations.length) {\r\n            return [];\r\n        }\r\n        const firstOperation = this._operations[0];\r\n        if (fromBaseVersion === undefined) {\r\n            fromBaseVersion = firstOperation.baseVersion;\r\n        }\r\n        // Change exclusive `toBaseVersion` to inclusive, so it will refer to the actual index.\r\n        // Thanks to that mapping from base versions to operation indexes are possible.\r\n        let inclusiveTo = toBaseVersion - 1;\r\n        // Check if \"from\" or \"to\" point to a gap between versions.\r\n        // If yes, then change the incorrect position to the proper side of the gap.\r\n        // Thanks to it, it will be possible to get index of the operation.\r\n        for (const [gapFrom, gapTo] of this._gaps) {\r\n            if (fromBaseVersion > gapFrom && fromBaseVersion < gapTo) {\r\n                fromBaseVersion = gapTo;\r\n            }\r\n            if (inclusiveTo > gapFrom && inclusiveTo < gapTo) {\r\n                inclusiveTo = gapFrom - 1;\r\n            }\r\n        }\r\n        // If the whole range is outside of the operation versions, then return an empty array.\r\n        if (inclusiveTo < firstOperation.baseVersion || fromBaseVersion > this.lastOperation.baseVersion) {\r\n            return [];\r\n        }\r\n        let fromIndex = this._baseVersionToOperationIndex.get(fromBaseVersion);\r\n        // If the range starts before the first operation, then use the first operation as the range's start.\r\n        if (fromIndex === undefined) {\r\n            fromIndex = 0;\r\n        }\r\n        let toIndex = this._baseVersionToOperationIndex.get(inclusiveTo);\r\n        // If the range ends after the last operation, then use the last operation as the range's end.\r\n        if (toIndex === undefined) {\r\n            toIndex = this._operations.length - 1;\r\n        }\r\n        // Return the part of the history operations based on the calculated start index and end index.\r\n        return this._operations.slice(fromIndex, \r\n        // The `toIndex` should be included in the returned operations, so add `1`.\r\n        toIndex + 1);\r\n    }\r\n    /**\r\n     * Returns operation from the history that bases on given `baseVersion`.\r\n     *\r\n     * @param baseVersion Base version of the operation to get.\r\n     * @returns Operation with given base version or `undefined` if there is no such operation in history.\r\n     */\r\n    getOperation(baseVersion) {\r\n        const operationIndex = this._baseVersionToOperationIndex.get(baseVersion);\r\n        if (operationIndex === undefined) {\r\n            return;\r\n        }\r\n        return this._operations[operationIndex];\r\n    }\r\n    /**\r\n     * Marks in history that one operation is an operation that is undoing the other operation. By marking operation this way,\r\n     * history is keeping more context information about operations, which helps in operational transformation.\r\n     *\r\n     * @param undoneOperation Operation which is undone by `undoingOperation`.\r\n     * @param undoingOperation Operation which undoes `undoneOperation`.\r\n     */\r\n    setOperationAsUndone(undoneOperation, undoingOperation) {\r\n        this._undoPairs.set(undoingOperation, undoneOperation);\r\n        this._undoneOperations.add(undoneOperation);\r\n    }\r\n    /**\r\n     * Checks whether given `operation` is undoing any other operation.\r\n     *\r\n     * @param operation Operation to check.\r\n     * @returns `true` if given `operation` is undoing any other operation, `false` otherwise.\r\n     */\r\n    isUndoingOperation(operation) {\r\n        return this._undoPairs.has(operation);\r\n    }\r\n    /**\r\n     * Checks whether given `operation` has been undone by any other operation.\r\n     *\r\n     * @param operation Operation to check.\r\n     * @returns `true` if given `operation` has been undone any other operation, `false` otherwise.\r\n     */\r\n    isUndoneOperation(operation) {\r\n        return this._undoneOperations.has(operation);\r\n    }\r\n    /**\r\n     * For given `undoingOperation`, returns the operation which has been undone by it.\r\n     *\r\n     * @returns Operation that has been undone by given `undoingOperation` or `undefined`\r\n     * if given `undoingOperation` is not undoing any other operation.\r\n     */\r\n    getUndoneOperation(undoingOperation) {\r\n        return this._undoPairs.get(undoingOperation);\r\n    }\r\n    /**\r\n     * Resets the history of operations.\r\n     */\r\n    reset() {\r\n        this._version = 0;\r\n        this._undoPairs = new Map();\r\n        this._operations = [];\r\n        this._undoneOperations = new Set();\r\n        this._gaps = new Map();\r\n        this._baseVersionToOperationIndex = new Map();\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/rootelement\r\n */\r\nimport Element from './element';\r\n/**\r\n * Type of {@link module:engine/model/element~Element} that is a root of a model tree.\r\n */\r\nexport default class RootElement extends Element {\r\n    /**\r\n     * Creates root element.\r\n     *\r\n     * @param document Document that is an owner of this root.\r\n     * @param name Node name.\r\n     * @param rootName Unique root name used to identify this root element by {@link module:engine/model/document~Document}.\r\n     */\r\n    constructor(document, name, rootName = 'main') {\r\n        super(name);\r\n        /**\r\n         * @internal\r\n         */\r\n        this._isAttached = true;\r\n        this._document = document;\r\n        this.rootName = rootName;\r\n    }\r\n    /**\r\n     * {@link module:engine/model/document~Document Document} that owns this root element.\r\n     */\r\n    get document() {\r\n        return this._document;\r\n    }\r\n    /**\r\n     * Informs if the root element is currently attached to the document, or not.\r\n     *\r\n     * A detached root is equivalent to being removed and cannot contain any children or markers.\r\n     *\r\n     * By default, a newly added root is attached. It can be detached using\r\n     * {@link module:engine/model/writer~Writer#detachRoot `Writer#detachRoot`}. A detached root can be re-attached again using\r\n     * {@link module:engine/model/writer~Writer#addRoot `Writer#addRoot`}.\r\n     */\r\n    isAttached() {\r\n        return this._isAttached;\r\n    }\r\n    /**\r\n     * Converts `RootElement` instance to `string` containing its name.\r\n     *\r\n     * @returns `RootElement` instance converted to `string`.\r\n     */\r\n    toJSON() {\r\n        return this.rootName;\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nRootElement.prototype.is = function (type, name) {\r\n    if (!name) {\r\n        return type === 'rootElement' || type === 'model:rootElement' ||\r\n            // From super.is(). This is highly utilised method and cannot call super. See ckeditor/ckeditor5#6529.\r\n            type === 'element' || type === 'model:element' ||\r\n            type === 'node' || type === 'model:node';\r\n    }\r\n    return name === this.name && (type === 'rootElement' || type === 'model:rootElement' ||\r\n        // From super.is(). This is highly utilised method and cannot call super. See ckeditor/ckeditor5#6529.\r\n        type === 'element' || type === 'model:element');\r\n};\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/document\r\n */\r\nimport Differ from './differ';\r\nimport DocumentSelection from './documentselection';\r\nimport History from './history';\r\nimport RootElement from './rootelement';\r\nimport { CKEditorError, Collection, EmitterMixin, isInsideSurrogatePair, isInsideCombinedSymbol } from '@ckeditor/ckeditor5-utils';\r\nimport { clone } from 'lodash-es';\r\n// @if CK_DEBUG_ENGINE // const { logDocument } = require( '../dev-utils/utils' );\r\nconst graveyardName = '$graveyard';\r\n/**\r\n * Data model's document. It contains the model's structure, its selection and the history of changes.\r\n *\r\n * Read more about working with the model in\r\n * {@glink framework/architecture/editing-engine#model introduction to the the editing engine's architecture}.\r\n *\r\n * Usually, the document contains just one {@link module:engine/model/document~Document#roots root element}, so\r\n * you can retrieve it by just calling {@link module:engine/model/document~Document#getRoot} without specifying its name:\r\n *\r\n * ```ts\r\n * model.document.getRoot(); // -> returns the main root\r\n * ```\r\n *\r\n * However, the document may contain multiple roots – e.g. when the editor has multiple editable areas\r\n * (e.g. a title and a body of a message).\r\n */\r\nexport default class Document extends EmitterMixin() {\r\n    /**\r\n     * Creates an empty document instance with no {@link #roots} (other than\r\n     * the {@link #graveyard graveyard root}).\r\n     */\r\n    constructor(model) {\r\n        super();\r\n        this.model = model;\r\n        this.history = new History();\r\n        this.selection = new DocumentSelection(this);\r\n        this.roots = new Collection({ idProperty: 'rootName' });\r\n        this.differ = new Differ(model.markers);\r\n        this.isReadOnly = false;\r\n        this._postFixers = new Set();\r\n        this._hasSelectionChangedFromTheLastChangeBlock = false;\r\n        // Graveyard tree root. Document always have a graveyard root, which stores removed nodes.\r\n        this.createRoot('$root', graveyardName);\r\n        // Then, still before an operation is applied on model, buffer the change in differ.\r\n        this.listenTo(model, 'applyOperation', (evt, args) => {\r\n            const operation = args[0];\r\n            if (operation.isDocumentOperation) {\r\n                this.differ.bufferOperation(operation);\r\n            }\r\n        }, { priority: 'high' });\r\n        // After the operation is applied, bump document's version and add the operation to the history.\r\n        this.listenTo(model, 'applyOperation', (evt, args) => {\r\n            const operation = args[0];\r\n            if (operation.isDocumentOperation) {\r\n                this.history.addOperation(operation);\r\n            }\r\n        }, { priority: 'low' });\r\n        // Listen to selection changes. If selection changed, mark it.\r\n        this.listenTo(this.selection, 'change', () => {\r\n            this._hasSelectionChangedFromTheLastChangeBlock = true;\r\n        });\r\n        // Buffer marker changes.\r\n        // This is not covered in buffering operations because markers may change outside of them (when they\r\n        // are modified using `model.markers` collection, not through `MarkerOperation`).\r\n        this.listenTo(model.markers, 'update', (evt, marker, oldRange, newRange, oldMarkerData) => {\r\n            // Copy the `newRange` to the new marker data as during the marker removal the range is not updated.\r\n            const newMarkerData = { ...marker.getData(), range: newRange };\r\n            // Whenever marker is updated, buffer that change.\r\n            this.differ.bufferMarkerChange(marker.name, oldMarkerData, newMarkerData);\r\n            if (oldRange === null) {\r\n                // If this is a new marker, add a listener that will buffer change whenever marker changes.\r\n                marker.on('change', (evt, oldRange) => {\r\n                    const markerData = marker.getData();\r\n                    this.differ.bufferMarkerChange(marker.name, { ...markerData, range: oldRange }, markerData);\r\n                });\r\n            }\r\n        });\r\n        // This is a solution for a problem that may occur during real-time editing. If one client detached a root and another added\r\n        // something there at the same moment, the OT does not solve this problem currently. In such situation, the added elements would\r\n        // stay in the detached root.\r\n        //\r\n        // This is incorrect, a detached root should be empty and all elements from it should be removed. To solve this, the post-fixer will\r\n        // remove any element that is left in a detached root.\r\n        //\r\n        // Similarly, markers that are created at the beginning or at the end of the detached root will not be removed as well.\r\n        //\r\n        // The drawback of this solution over the OT solution is that the elements removed by the post-fixer will never be brought back.\r\n        // If the root detachment gets undone (and the root is brought back), the removed elements will not be there.\r\n        this.registerPostFixer(writer => {\r\n            let result = false;\r\n            for (const root of this.roots) {\r\n                if (!root.isAttached() && !root.isEmpty) {\r\n                    writer.remove(writer.createRangeIn(root));\r\n                    result = true;\r\n                }\r\n            }\r\n            for (const marker of this.model.markers) {\r\n                if (!marker.getRange().root.isAttached()) {\r\n                    writer.removeMarker(marker);\r\n                    result = true;\r\n                }\r\n            }\r\n            return result;\r\n        });\r\n    }\r\n    /**\r\n     * The document version. Every applied operation increases the version number. It is used to\r\n     * ensure that operations are applied on a proper document version.\r\n     *\r\n     * This property is equal to {@link module:engine/model/history~History#version `model.Document#history#version`}.\r\n     *\r\n     * If the {@link module:engine/model/operation/operation~Operation#baseVersion base version} does not match the document version,\r\n     * a {@link module:utils/ckeditorerror~CKEditorError model-document-applyoperation-wrong-version} error is thrown.\r\n     */\r\n    get version() {\r\n        return this.history.version;\r\n    }\r\n    set version(version) {\r\n        this.history.version = version;\r\n    }\r\n    /**\r\n     * The graveyard tree root. A document always has a graveyard root that stores removed nodes.\r\n     */\r\n    get graveyard() {\r\n        return this.getRoot(graveyardName);\r\n    }\r\n    /**\r\n     * Creates a new root.\r\n     *\r\n     * **Note:** do not use this method after the editor has been initialized! If you want to dynamically add a root, use\r\n     * {@link module:engine/model/writer~Writer#addRoot `model.Writer#addRoot`} instead.\r\n     *\r\n     * @param elementName The element name. Defaults to `'$root'` which also has some basic schema defined\r\n     * (e.g. `$block` elements are allowed inside the `$root`). Make sure to define a proper schema if you use a different name.\r\n     * @param rootName A unique root name.\r\n     * @returns The created root.\r\n     */\r\n    createRoot(elementName = '$root', rootName = 'main') {\r\n        if (this.roots.get(rootName)) {\r\n            /**\r\n             * A root with the specified name already exists.\r\n             *\r\n             * @error model-document-createroot-name-exists\r\n             */\r\n            throw new CKEditorError('model-document-createroot-name-exists', this, { name: rootName });\r\n        }\r\n        const root = new RootElement(this, elementName, rootName);\r\n        this.roots.add(root);\r\n        return root;\r\n    }\r\n    /**\r\n     * Removes all event listeners set by the document instance.\r\n     */\r\n    destroy() {\r\n        this.selection.destroy();\r\n        this.stopListening();\r\n    }\r\n    /**\r\n     * Returns a root by its name.\r\n     *\r\n     * Detached roots are returned by this method. This is to be able to operate on the detached root (for example, to be able to create\r\n     * a position inside such a root for undo feature purposes).\r\n     *\r\n     * @param name The root name of the root to return.\r\n     * @returns The root registered under a given name or `null` when there is no root with the given name.\r\n     */\r\n    getRoot(name = 'main') {\r\n        return this.roots.get(name);\r\n    }\r\n    /**\r\n     * Returns an array with names of all roots added to the document (except the {@link #graveyard graveyard root}).\r\n     *\r\n     * Detached roots **are not** returned by this method by default. This is to make sure that all features or algorithms that operate\r\n     * on the document data know which roots are still a part of the document and should be processed.\r\n     *\r\n     * @param includeDetached Specified whether detached roots should be returned as well.\r\n     * @returns Roots names.\r\n     */\r\n    getRootNames(includeDetached = false) {\r\n        return Array.from(this.roots)\r\n            .filter(root => root.rootName != graveyardName && (includeDetached || root.isAttached()))\r\n            .map(root => root.rootName);\r\n    }\r\n    /**\r\n     * Used to register a post-fixer callback. A post-fixer mechanism guarantees that the features\r\n     * will operate on a correct model state.\r\n     *\r\n     * An execution of a feature may lead to an incorrect document tree state. The callbacks are used to fix the document tree after\r\n     * it has changed. Post-fixers are fired just after all changes from the outermost change block were applied but\r\n     * before the {@link module:engine/model/document~Document#event:change change event} is fired. If a post-fixer callback made\r\n     * a change, it should return `true`. When this happens, all post-fixers are fired again to check if something else should\r\n     * not be fixed in the new document tree state.\r\n     *\r\n     * As a parameter, a post-fixer callback receives a {@link module:engine/model/writer~Writer writer} instance connected with the\r\n     * executed changes block. Thanks to that, all changes done by the callback will be added to the same\r\n     * {@link module:engine/model/batch~Batch batch} (and undo step) as the original changes. This makes post-fixer changes transparent\r\n     * for the user.\r\n     *\r\n     * An example of a post-fixer is a callback that checks if all the data were removed from the editor. If so, the\r\n     * callback should add an empty paragraph so that the editor is never empty:\r\n     *\r\n     * ```ts\r\n     * document.registerPostFixer( writer => {\r\n     * \tconst changes = document.differ.getChanges();\r\n     *\r\n     * \t// Check if the changes lead to an empty root in the editor.\r\n     * \tfor ( const entry of changes ) {\r\n     * \t\tif ( entry.type == 'remove' && entry.position.root.isEmpty ) {\r\n     * \t\t\twriter.insertElement( 'paragraph', entry.position.root, 0 );\r\n     *\r\n     * \t\t\t// It is fine to return early, even if multiple roots would need to be fixed.\r\n     * \t\t\t// All post-fixers will be fired again, so if there are more empty roots, those will be fixed, too.\r\n     * \t\t\treturn true;\r\n     * \t\t}\r\n     * \t}\r\n     *\r\n     * \treturn false;\r\n     * } );\r\n     * ```\r\n     */\r\n    registerPostFixer(postFixer) {\r\n        this._postFixers.add(postFixer);\r\n    }\r\n    /**\r\n     * A custom `toJSON()` method to solve child-parent circular dependencies.\r\n     *\r\n     * @returns A clone of this object with the document property changed to a string.\r\n     */\r\n    toJSON() {\r\n        const json = clone(this);\r\n        // Due to circular references we need to remove parent reference.\r\n        json.selection = '[engine.model.DocumentSelection]';\r\n        json.model = '[engine.model.Model]';\r\n        return json;\r\n    }\r\n    /**\r\n     * Check if there were any changes done on document, and if so, call post-fixers,\r\n     * fire `change` event for features and conversion and then reset the differ.\r\n     * Fire `change:data` event when at least one operation or buffered marker changes the data.\r\n     *\r\n     * @internal\r\n     * @fires change\r\n     * @fires change:data\r\n     * @param writer The writer on which post-fixers will be called.\r\n     */\r\n    _handleChangeBlock(writer) {\r\n        if (this._hasDocumentChangedFromTheLastChangeBlock()) {\r\n            this._callPostFixers(writer);\r\n            // Refresh selection attributes according to the final position in the model after the change.\r\n            this.selection.refresh();\r\n            if (this.differ.hasDataChanges()) {\r\n                this.fire('change:data', writer.batch);\r\n            }\r\n            else {\r\n                this.fire('change', writer.batch);\r\n            }\r\n            // Theoretically, it is not necessary to refresh selection after change event because\r\n            // post-fixers are the last who should change the model, but just in case...\r\n            this.selection.refresh();\r\n            this.differ.reset();\r\n        }\r\n        this._hasSelectionChangedFromTheLastChangeBlock = false;\r\n    }\r\n    /**\r\n     * Returns whether there is a buffered change or if the selection has changed from the last\r\n     * {@link module:engine/model/model~Model#enqueueChange `enqueueChange()` block}\r\n     * or {@link module:engine/model/model~Model#change `change()` block}.\r\n     *\r\n     * @returns Returns `true` if document has changed from the last `change()` or `enqueueChange()` block.\r\n     */\r\n    _hasDocumentChangedFromTheLastChangeBlock() {\r\n        return !this.differ.isEmpty || this._hasSelectionChangedFromTheLastChangeBlock;\r\n    }\r\n    /**\r\n     * Returns the default root for this document which is either the first root that was added to the document using\r\n     * {@link #createRoot} or the {@link #graveyard graveyard root} if no other roots were created.\r\n     *\r\n     * @returns The default root for this document.\r\n     */\r\n    _getDefaultRoot() {\r\n        for (const root of this.roots) {\r\n            if (root !== this.graveyard) {\r\n                return root;\r\n            }\r\n        }\r\n        return this.graveyard;\r\n    }\r\n    /**\r\n     * Returns the default range for this selection. The default range is a collapsed range that starts and ends\r\n     * at the beginning of this selection's document {@link #_getDefaultRoot default root}.\r\n     *\r\n     * @internal\r\n     */\r\n    _getDefaultRange() {\r\n        const defaultRoot = this._getDefaultRoot();\r\n        const model = this.model;\r\n        const schema = model.schema;\r\n        // Find the first position where the selection can be put.\r\n        const position = model.createPositionFromPath(defaultRoot, [0]);\r\n        const nearestRange = schema.getNearestSelectionRange(position);\r\n        // If valid selection range is not found - return range collapsed at the beginning of the root.\r\n        return nearestRange || model.createRange(position);\r\n    }\r\n    /**\r\n     * Checks whether a given {@link module:engine/model/range~Range range} is a valid range for\r\n     * the {@link #selection document's selection}.\r\n     *\r\n     * @internal\r\n     * @param range A range to check.\r\n     * @returns `true` if `range` is valid, `false` otherwise.\r\n     */\r\n    _validateSelectionRange(range) {\r\n        return validateTextNodePosition(range.start) && validateTextNodePosition(range.end);\r\n    }\r\n    /**\r\n     * Performs post-fixer loops. Executes post-fixer callbacks as long as none of them has done any changes to the model.\r\n     *\r\n     * @param writer The writer on which post-fixer callbacks will be called.\r\n     */\r\n    _callPostFixers(writer) {\r\n        let wasFixed = false;\r\n        do {\r\n            for (const callback of this._postFixers) {\r\n                // Ensure selection attributes are up to date before each post-fixer.\r\n                // https://github.com/ckeditor/ckeditor5-engine/issues/1673.\r\n                //\r\n                // It might be good to refresh the selection after each operation but at the moment it leads\r\n                // to losing attributes for composition or and spell checking\r\n                // https://github.com/ckeditor/ckeditor5-typing/issues/188\r\n                this.selection.refresh();\r\n                wasFixed = callback(writer);\r\n                if (wasFixed) {\r\n                    break;\r\n                }\r\n            }\r\n        } while (wasFixed);\r\n    }\r\n}\r\n/**\r\n * Checks whether given range boundary position is valid for document selection, meaning that is not between\r\n * unicode surrogate pairs or base character and combining marks.\r\n */\r\nfunction validateTextNodePosition(rangeBoundary) {\r\n    const textNode = rangeBoundary.textNode;\r\n    if (textNode) {\r\n        const data = textNode.data;\r\n        const offset = rangeBoundary.offset - textNode.startOffset;\r\n        return !isInsideSurrogatePair(data, offset) && !isInsideCombinedSymbol(data, offset);\r\n    }\r\n    return true;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/markercollection\r\n */\r\nimport TypeCheckable from './typecheckable';\r\nimport LiveRange from './liverange';\r\nimport { CKEditorError, EmitterMixin } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * The collection of all {@link module:engine/model/markercollection~Marker markers} attached to the document.\r\n * It lets you {@link module:engine/model/markercollection~MarkerCollection#get get} markers or track them using\r\n * {@link module:engine/model/markercollection~MarkerCollection#event:update} event.\r\n *\r\n * To create, change or remove makers use {@link module:engine/model/writer~Writer model writers'} methods:\r\n * {@link module:engine/model/writer~Writer#addMarker} or {@link module:engine/model/writer~Writer#removeMarker}. Since\r\n * the writer is the only proper way to change the data model it is not possible to change markers directly using this\r\n * collection. All markers created by the writer will be automatically added to this collection.\r\n *\r\n * By default there is one marker collection available as {@link module:engine/model/model~Model#markers model property}.\r\n *\r\n * @see module:engine/model/markercollection~Marker\r\n */\r\nexport default class MarkerCollection extends EmitterMixin() {\r\n    constructor() {\r\n        super(...arguments);\r\n        /**\r\n         * Stores {@link ~Marker markers} added to the collection.\r\n         */\r\n        this._markers = new Map();\r\n    }\r\n    /**\r\n     * Iterable interface.\r\n     *\r\n     * Iterates over all {@link ~Marker markers} added to the collection.\r\n     */\r\n    [Symbol.iterator]() {\r\n        return this._markers.values();\r\n    }\r\n    /**\r\n     * Checks if given {@link ~Marker marker} or marker name is in the collection.\r\n     *\r\n     * @param markerOrName Name of marker or marker instance to check.\r\n     * @returns `true` if marker is in the collection, `false` otherwise.\r\n     */\r\n    has(markerOrName) {\r\n        const markerName = markerOrName instanceof Marker ? markerOrName.name : markerOrName;\r\n        return this._markers.has(markerName);\r\n    }\r\n    /**\r\n     * Returns {@link ~Marker marker} with given `markerName`.\r\n     *\r\n     * @param markerName Name of marker to get.\r\n     * @returns Marker with given name or `null` if such marker was\r\n     * not added to the collection.\r\n     */\r\n    get(markerName) {\r\n        return this._markers.get(markerName) || null;\r\n    }\r\n    /**\r\n     * Creates and adds a {@link ~Marker marker} to the `MarkerCollection` with given name on given\r\n     * {@link module:engine/model/range~Range range}.\r\n     *\r\n     * If `MarkerCollection` already had a marker with given name (or {@link ~Marker marker} was passed), the marker in\r\n     * collection is updated and {@link module:engine/model/markercollection~MarkerCollection#event:update} event is fired\r\n     * but only if there was a change (marker range or {@link module:engine/model/markercollection~Marker#managedUsingOperations}\r\n     * flag has changed.\r\n     *\r\n     * @internal\r\n     * @fires update\r\n     * @param markerOrName Name of marker to set or marker instance to update.\r\n     * @param range Marker range.\r\n     * @param managedUsingOperations Specifies whether the marker is managed using operations.\r\n     * @param affectsData Specifies whether the marker affects the data produced by the data pipeline\r\n     * (is persisted in the editor's data).\r\n     * @returns `Marker` instance which was added or updated.\r\n     */\r\n    _set(markerOrName, range, managedUsingOperations = false, affectsData = false) {\r\n        const markerName = markerOrName instanceof Marker ? markerOrName.name : markerOrName;\r\n        if (markerName.includes(',')) {\r\n            /**\r\n             * Marker name cannot contain the \",\" character.\r\n             *\r\n             * @error markercollection-incorrect-marker-name\r\n             */\r\n            throw new CKEditorError('markercollection-incorrect-marker-name', this);\r\n        }\r\n        const oldMarker = this._markers.get(markerName);\r\n        if (oldMarker) {\r\n            const oldMarkerData = oldMarker.getData();\r\n            const oldRange = oldMarker.getRange();\r\n            let hasChanged = false;\r\n            if (!oldRange.isEqual(range)) {\r\n                oldMarker._attachLiveRange(LiveRange.fromRange(range));\r\n                hasChanged = true;\r\n            }\r\n            if (managedUsingOperations != oldMarker.managedUsingOperations) {\r\n                oldMarker._managedUsingOperations = managedUsingOperations;\r\n                hasChanged = true;\r\n            }\r\n            if (typeof affectsData === 'boolean' && affectsData != oldMarker.affectsData) {\r\n                oldMarker._affectsData = affectsData;\r\n                hasChanged = true;\r\n            }\r\n            if (hasChanged) {\r\n                this.fire(`update:${markerName}`, oldMarker, oldRange, range, oldMarkerData);\r\n            }\r\n            return oldMarker;\r\n        }\r\n        const liveRange = LiveRange.fromRange(range);\r\n        const marker = new Marker(markerName, liveRange, managedUsingOperations, affectsData);\r\n        this._markers.set(markerName, marker);\r\n        this.fire(`update:${markerName}`, marker, null, range, { ...marker.getData(), range: null });\r\n        return marker;\r\n    }\r\n    /**\r\n     * Removes given {@link ~Marker marker} or a marker with given name from the `MarkerCollection`.\r\n     *\r\n     * @internal\r\n     * @fires update\r\n     * @param markerOrName Marker or name of a marker to remove.\r\n     * @returns `true` if marker was found and removed, `false` otherwise.\r\n     */\r\n    _remove(markerOrName) {\r\n        const markerName = markerOrName instanceof Marker ? markerOrName.name : markerOrName;\r\n        const oldMarker = this._markers.get(markerName);\r\n        if (oldMarker) {\r\n            this._markers.delete(markerName);\r\n            this.fire(`update:${markerName}`, oldMarker, oldMarker.getRange(), null, oldMarker.getData());\r\n            this._destroyMarker(oldMarker);\r\n            return true;\r\n        }\r\n        return false;\r\n    }\r\n    /**\r\n     * Fires an {@link module:engine/model/markercollection~MarkerCollection#event:update} event for the given {@link ~Marker marker}\r\n     * but does not change the marker. Useful to force {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher downcast\r\n     * conversion} for the marker.\r\n     *\r\n     * @internal\r\n     * @fires update\r\n     * @param markerOrName Marker or name of a marker to refresh.\r\n     */\r\n    _refresh(markerOrName) {\r\n        const markerName = markerOrName instanceof Marker ? markerOrName.name : markerOrName;\r\n        const marker = this._markers.get(markerName);\r\n        if (!marker) {\r\n            /**\r\n             * Marker with provided name does not exists.\r\n             *\r\n             * @error markercollection-refresh-marker-not-exists\r\n             */\r\n            throw new CKEditorError('markercollection-refresh-marker-not-exists', this);\r\n        }\r\n        const range = marker.getRange();\r\n        this.fire(`update:${markerName}`, marker, range, range, marker.getData());\r\n    }\r\n    /**\r\n     * Returns iterator that iterates over all markers, which ranges contain given {@link module:engine/model/position~Position position}.\r\n     */\r\n    *getMarkersAtPosition(position) {\r\n        for (const marker of this) {\r\n            if (marker.getRange().containsPosition(position)) {\r\n                yield marker;\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Returns iterator that iterates over all markers, which intersects with given {@link module:engine/model/range~Range range}.\r\n     */\r\n    *getMarkersIntersectingRange(range) {\r\n        for (const marker of this) {\r\n            if (marker.getRange().getIntersection(range) !== null) {\r\n                yield marker;\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Destroys marker collection and all markers inside it.\r\n     */\r\n    destroy() {\r\n        for (const marker of this._markers.values()) {\r\n            this._destroyMarker(marker);\r\n        }\r\n        this._markers = null;\r\n        this.stopListening();\r\n    }\r\n    /**\r\n     * Iterates over all markers that starts with given `prefix`.\r\n     *\r\n     * ```ts\r\n     * const markerFooA = markersCollection.set( 'foo:a', rangeFooA );\r\n     * const markerFooB = markersCollection.set( 'foo:b', rangeFooB );\r\n     * const markerBarA = markersCollection.set( 'bar:a', rangeBarA );\r\n     * const markerFooBarA = markersCollection.set( 'foobar:a', rangeFooBarA );\r\n     * Array.from( markersCollection.getMarkersGroup( 'foo' ) ); // [ markerFooA, markerFooB ]\r\n     * Array.from( markersCollection.getMarkersGroup( 'a' ) ); // []\r\n     * ```\r\n     */\r\n    *getMarkersGroup(prefix) {\r\n        for (const marker of this._markers.values()) {\r\n            if (marker.name.startsWith(prefix + ':')) {\r\n                yield marker;\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Destroys the marker.\r\n     */\r\n    _destroyMarker(marker) {\r\n        marker.stopListening();\r\n        marker._detachLiveRange();\r\n    }\r\n}\r\n/**\r\n * `Marker` is a continuous part of the model (like a range), is named and represents some kind of information about the\r\n * marked part of the model document. In contrary to {@link module:engine/model/node~Node nodes}, which are building blocks of\r\n * the model document tree, markers are not stored directly in the document tree but in the\r\n * {@link module:engine/model/model~Model#markers model markers' collection}. Still, they are document data, by giving\r\n * additional meaning to the part of a model document between marker start and marker end.\r\n *\r\n * In this sense, markers are similar to adding and converting attributes on nodes. The difference is that attribute is\r\n * connected with a given node (e.g. a character is bold no matter if it gets moved or content around it changes).\r\n * Markers on the other hand are continuous ranges and are characterized by their start and end position. This means that\r\n * any character in the marker is marked by the marker. For example, if a character is moved outside of marker it stops being\r\n * \"special\" and the marker is shrunk. Similarly, when a character is moved into the marker from other place in document\r\n * model, it starts being \"special\" and the marker is enlarged.\r\n *\r\n * Another upside of markers is that finding marked part of document is fast and easy. Using attributes to mark some nodes\r\n * and then trying to find that part of document would require traversing whole document tree. Marker gives instant access\r\n * to the range which it is marking at the moment.\r\n *\r\n * Markers are built from a name and a range.\r\n *\r\n * Range of the marker is updated automatically when document changes, using\r\n * {@link module:engine/model/liverange~LiveRange live range} mechanism.\r\n *\r\n * Name is used to group and identify markers. Names have to be unique, but markers can be grouped by\r\n * using common prefixes, separated with `:`, for example: `user:john` or `search:3`. That's useful in term of creating\r\n * namespaces for custom elements (e.g. comments, highlights). You can use this prefixes in\r\n * {@link module:engine/model/markercollection~MarkerCollection#event:update} listeners to listen on changes in a group of markers.\r\n * For instance: `model.markers.on( 'update:user', callback );` will be called whenever any `user:*` markers changes.\r\n *\r\n * There are two types of markers.\r\n *\r\n * 1. Markers managed directly, without using operations. They are added directly by {@link module:engine/model/writer~Writer}\r\n * to the {@link module:engine/model/markercollection~MarkerCollection} without any additional mechanism. They can be used\r\n * as bookmarks or visual markers. They are great for showing results of the find, or select link when the focus is in the input.\r\n *\r\n * 1. Markers managed using operations. These markers are also stored in {@link module:engine/model/markercollection~MarkerCollection}\r\n * but changes in these markers is managed the same way all other changes in the model structure - using operations.\r\n * Therefore, they are handled in the undo stack and synchronized between clients if the collaboration plugin is enabled.\r\n * This type of markers is useful for solutions like spell checking or comments.\r\n *\r\n * Both type of them should be added / updated by {@link module:engine/model/writer~Writer#addMarker}\r\n * and removed by {@link module:engine/model/writer~Writer#removeMarker} methods.\r\n *\r\n * ```ts\r\n * model.change( ( writer ) => {\r\n * \tconst marker = writer.addMarker( name, { range, usingOperation: true } );\r\n *\r\n * \t// ...\r\n *\r\n * \twriter.removeMarker( marker );\r\n * } );\r\n * ```\r\n *\r\n * See {@link module:engine/model/writer~Writer} to find more examples.\r\n *\r\n * Since markers need to track change in the document, for efficiency reasons, it is best to create and keep as little\r\n * markers as possible and remove them as soon as they are not needed anymore.\r\n *\r\n * Markers can be downcasted and upcasted.\r\n *\r\n * Markers downcast happens on {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:addMarker} and\r\n * {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:removeMarker} events.\r\n * Use {@link module:engine/conversion/downcasthelpers downcast converters} or attach a custom converter to mentioned events.\r\n * For {@link module:engine/controller/datacontroller~DataController data pipeline}, marker should be downcasted to an element.\r\n * Then, it can be upcasted back to a marker. Again, use {@link module:engine/conversion/upcasthelpers upcast converters} or\r\n * attach a custom converter to {@link module:engine/conversion/upcastdispatcher~UpcastDispatcher#event:element}.\r\n *\r\n * `Marker` instances are created and destroyed only by {@link ~MarkerCollection MarkerCollection}.\r\n */\r\nclass Marker extends EmitterMixin(TypeCheckable) {\r\n    /**\r\n     * Creates a marker instance.\r\n     *\r\n     * @param name Marker name.\r\n     * @param liveRange Range marked by the marker.\r\n     * @param managedUsingOperations Specifies whether the marker is managed using operations.\r\n     * @param affectsData Specifies whether the marker affects the data produced by the data pipeline (is persisted in the editor's data).\r\n     */\r\n    constructor(name, liveRange, managedUsingOperations, affectsData) {\r\n        super();\r\n        this.name = name;\r\n        this._liveRange = this._attachLiveRange(liveRange);\r\n        this._managedUsingOperations = managedUsingOperations;\r\n        this._affectsData = affectsData;\r\n    }\r\n    /**\r\n     * A value indicating if the marker is managed using operations.\r\n     * See {@link ~Marker marker class description} to learn more about marker types.\r\n     * See {@link module:engine/model/writer~Writer#addMarker}.\r\n     */\r\n    get managedUsingOperations() {\r\n        if (!this._liveRange) {\r\n            throw new CKEditorError('marker-destroyed', this);\r\n        }\r\n        return this._managedUsingOperations;\r\n    }\r\n    /**\r\n     * A value indicating if the marker changes the data.\r\n     */\r\n    get affectsData() {\r\n        if (!this._liveRange) {\r\n            throw new CKEditorError('marker-destroyed', this);\r\n        }\r\n        return this._affectsData;\r\n    }\r\n    /**\r\n     * Returns the marker data (properties defining the marker).\r\n     */\r\n    getData() {\r\n        return {\r\n            range: this.getRange(),\r\n            affectsData: this.affectsData,\r\n            managedUsingOperations: this.managedUsingOperations\r\n        };\r\n    }\r\n    /**\r\n     * Returns current marker start position.\r\n     */\r\n    getStart() {\r\n        if (!this._liveRange) {\r\n            throw new CKEditorError('marker-destroyed', this);\r\n        }\r\n        return this._liveRange.start.clone();\r\n    }\r\n    /**\r\n     * Returns current marker end position.\r\n     */\r\n    getEnd() {\r\n        if (!this._liveRange) {\r\n            throw new CKEditorError('marker-destroyed', this);\r\n        }\r\n        return this._liveRange.end.clone();\r\n    }\r\n    /**\r\n     * Returns a range that represents the current state of the marker.\r\n     *\r\n     * Keep in mind that returned value is a {@link module:engine/model/range~Range Range}, not a\r\n     * {@link module:engine/model/liverange~LiveRange LiveRange}. This means that it is up-to-date and relevant only\r\n     * until next model document change. Do not store values returned by this method. Instead, store {@link ~Marker#name}\r\n     * and get `Marker` instance from {@link module:engine/model/markercollection~MarkerCollection MarkerCollection} every\r\n     * time there is a need to read marker properties. This will guarantee that the marker has not been removed and\r\n     * that it's data is up-to-date.\r\n     */\r\n    getRange() {\r\n        if (!this._liveRange) {\r\n            throw new CKEditorError('marker-destroyed', this);\r\n        }\r\n        return this._liveRange.toRange();\r\n    }\r\n    /**\r\n     * Binds new live range to the marker and detach the old one if is attached.\r\n     *\r\n     * @internal\r\n     * @param liveRange Live range to attach\r\n     * @returns Attached live range.\r\n     */\r\n    _attachLiveRange(liveRange) {\r\n        if (this._liveRange) {\r\n            this._detachLiveRange();\r\n        }\r\n        // Delegating does not work with namespaces. Alternatively, we could delegate all events (using `*`).\r\n        liveRange.delegate('change:range').to(this);\r\n        liveRange.delegate('change:content').to(this);\r\n        this._liveRange = liveRange;\r\n        return liveRange;\r\n    }\r\n    /**\r\n     * Unbinds and destroys currently attached live range.\r\n     *\r\n     * @internal\r\n     */\r\n    _detachLiveRange() {\r\n        this._liveRange.stopDelegating('change:range', this);\r\n        this._liveRange.stopDelegating('change:content', this);\r\n        this._liveRange.detach();\r\n        this._liveRange = null;\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nMarker.prototype.is = function (type) {\r\n    return type === 'marker' || type === 'model:marker';\r\n};\r\n/**\r\n * Cannot use a {@link module:engine/model/markercollection~MarkerCollection#destroy destroyed marker} instance.\r\n *\r\n * @error marker-destroyed\r\n */\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/operation/detachoperation\r\n */\r\nimport Operation from './operation';\r\nimport Range from '../range';\r\nimport { _remove } from './utils';\r\nimport { CKEditorError } from '@ckeditor/ckeditor5-utils';\r\n// @if CK_DEBUG_ENGINE // const ModelRange = require( '../range' ).default;\r\n/**\r\n * Operation to permanently remove node from detached root.\r\n * Note this operation is only a local operation and won't be send to the other clients.\r\n */\r\nexport default class DetachOperation extends Operation {\r\n    /**\r\n     * Creates an insert operation.\r\n     *\r\n     * @param sourcePosition Position before the first {@link module:engine/model/item~Item model item} to move.\r\n     * @param howMany Offset size of moved range. Moved range will start from `sourcePosition` and end at\r\n     * `sourcePosition` with offset shifted by `howMany`.\r\n     */\r\n    constructor(sourcePosition, howMany) {\r\n        super(null);\r\n        this.sourcePosition = sourcePosition.clone();\r\n        this.howMany = howMany;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    get type() {\r\n        return 'detach';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    get affectedSelectable() {\r\n        return null;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    toJSON() {\r\n        const json = super.toJSON();\r\n        json.sourcePosition = this.sourcePosition.toJSON();\r\n        return json;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     * @internal\r\n     */\r\n    _validate() {\r\n        if (this.sourcePosition.root.document) {\r\n            /**\r\n             * Cannot detach document node.\r\n             *\r\n             * @error detach-operation-on-document-node\r\n             */\r\n            throw new CKEditorError('detach-operation-on-document-node', this);\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     * @internal\r\n     */\r\n    _execute() {\r\n        _remove(Range._createFromPositionAndShift(this.sourcePosition, this.howMany));\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get className() {\r\n        return 'DetachOperation';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/documentfragment\r\n */\r\nimport TypeCheckable from './typecheckable';\r\nimport Element from './element';\r\nimport NodeList from './nodelist';\r\nimport Text from './text';\r\nimport TextProxy from './textproxy';\r\nimport { isIterable } from '@ckeditor/ckeditor5-utils';\r\n// @if CK_DEBUG_ENGINE // const { stringifyMap } = require( '../dev-utils/utils' );\r\n/**\r\n * DocumentFragment represents a part of model which does not have a common root but its top-level nodes\r\n * can be seen as siblings. In other words, it is a detached part of model tree, without a root.\r\n *\r\n * DocumentFragment has own {@link module:engine/model/markercollection~MarkerCollection}. Markers from this collection\r\n * will be set to the {@link module:engine/model/model~Model#markers model markers} by a\r\n * {@link module:engine/model/writer~Writer#insert} function.\r\n */\r\nexport default class DocumentFragment extends TypeCheckable {\r\n    /**\r\n     * Creates an empty `DocumentFragment`.\r\n     *\r\n     * **Note:** Constructor of this class shouldn't be used directly in the code.\r\n     * Use the {@link module:engine/model/writer~Writer#createDocumentFragment} method instead.\r\n     *\r\n     * @internal\r\n     * @param children Nodes to be contained inside the `DocumentFragment`.\r\n     */\r\n    constructor(children) {\r\n        super();\r\n        /**\r\n         * DocumentFragment static markers map. This is a list of names and {@link module:engine/model/range~Range ranges}\r\n         * which will be set as Markers to {@link module:engine/model/model~Model#markers model markers collection}\r\n         * when DocumentFragment will be inserted to the document.\r\n         */\r\n        this.markers = new Map();\r\n        /**\r\n         * List of nodes contained inside the document fragment.\r\n         */\r\n        this._children = new NodeList();\r\n        if (children) {\r\n            this._insertChild(0, children);\r\n        }\r\n    }\r\n    /**\r\n     * Returns an iterator that iterates over all nodes contained inside this document fragment.\r\n     */\r\n    [Symbol.iterator]() {\r\n        return this.getChildren();\r\n    }\r\n    /**\r\n     * Number of this document fragment's children.\r\n     */\r\n    get childCount() {\r\n        return this._children.length;\r\n    }\r\n    /**\r\n     * Sum of {@link module:engine/model/node~Node#offsetSize offset sizes} of all of this document fragment's children.\r\n     */\r\n    get maxOffset() {\r\n        return this._children.maxOffset;\r\n    }\r\n    /**\r\n     * Is `true` if there are no nodes inside this document fragment, `false` otherwise.\r\n     */\r\n    get isEmpty() {\r\n        return this.childCount === 0;\r\n    }\r\n    /**\r\n     * Artificial next sibling. Returns `null`. Added for compatibility reasons.\r\n     */\r\n    get nextSibling() {\r\n        return null;\r\n    }\r\n    /**\r\n     * Artificial previous sibling. Returns `null`. Added for compatibility reasons.\r\n     */\r\n    get previousSibling() {\r\n        return null;\r\n    }\r\n    /**\r\n     * Artificial root of `DocumentFragment`. Returns itself. Added for compatibility reasons.\r\n     */\r\n    get root() {\r\n        return this;\r\n    }\r\n    /**\r\n     * Artificial parent of `DocumentFragment`. Returns `null`. Added for compatibility reasons.\r\n     */\r\n    get parent() {\r\n        return null;\r\n    }\r\n    /**\r\n     * Artificial owner of `DocumentFragment`. Returns `null`. Added for compatibility reasons.\r\n     */\r\n    get document() {\r\n        return null;\r\n    }\r\n    /**\r\n     * Returns `false` as `DocumentFragment` by definition is not attached to a document. Added for compatibility reasons.\r\n     */\r\n    isAttached() {\r\n        return false;\r\n    }\r\n    /**\r\n     * Returns empty array. Added for compatibility reasons.\r\n     */\r\n    getAncestors() {\r\n        return [];\r\n    }\r\n    /**\r\n     * Gets the child at the given index. Returns `null` if incorrect index was passed.\r\n     *\r\n     * @param index Index of child.\r\n     * @returns Child node.\r\n     */\r\n    getChild(index) {\r\n        return this._children.getNode(index);\r\n    }\r\n    /**\r\n     * Returns an iterator that iterates over all of this document fragment's children.\r\n     */\r\n    getChildren() {\r\n        return this._children[Symbol.iterator]();\r\n    }\r\n    /**\r\n     * Returns an index of the given child node. Returns `null` if given node is not a child of this document fragment.\r\n     *\r\n     * @param node Child node to look for.\r\n     * @returns Child node's index.\r\n     */\r\n    getChildIndex(node) {\r\n        return this._children.getNodeIndex(node);\r\n    }\r\n    /**\r\n     * Returns the starting offset of given child. Starting offset is equal to the sum of\r\n     * {@link module:engine/model/node~Node#offsetSize offset sizes} of all node's siblings that are before it. Returns `null` if\r\n     * given node is not a child of this document fragment.\r\n     *\r\n     * @param node Child node to look for.\r\n     * @returns Child node's starting offset.\r\n     */\r\n    getChildStartOffset(node) {\r\n        return this._children.getNodeStartOffset(node);\r\n    }\r\n    /**\r\n     * Returns path to a `DocumentFragment`, which is an empty array. Added for compatibility reasons.\r\n     */\r\n    getPath() {\r\n        return [];\r\n    }\r\n    /**\r\n     * Returns a descendant node by its path relative to this element.\r\n     *\r\n     * ```ts\r\n     * // <this>a<b>c</b></this>\r\n     * this.getNodeByPath( [ 0 ] );     // -> \"a\"\r\n     * this.getNodeByPath( [ 1 ] );     // -> <b>\r\n     * this.getNodeByPath( [ 1, 0 ] );  // -> \"c\"\r\n     * ```\r\n     *\r\n     * @param relativePath Path of the node to find, relative to this element.\r\n     */\r\n    getNodeByPath(relativePath) {\r\n        // eslint-disable-next-line @typescript-eslint/no-this-alias, consistent-this\r\n        let node = this;\r\n        for (const index of relativePath) {\r\n            node = node.getChild(node.offsetToIndex(index));\r\n        }\r\n        return node;\r\n    }\r\n    /**\r\n     * Converts offset \"position\" to index \"position\".\r\n     *\r\n     * Returns index of a node that occupies given offset. If given offset is too low, returns `0`. If given offset is\r\n     * too high, returns index after last child.\r\n     *\r\n     * ```ts\r\n     * const textNode = new Text( 'foo' );\r\n     * const pElement = new Element( 'p' );\r\n     * const docFrag = new DocumentFragment( [ textNode, pElement ] );\r\n     * docFrag.offsetToIndex( -1 ); // Returns 0, because offset is too low.\r\n     * docFrag.offsetToIndex( 0 ); // Returns 0, because offset 0 is taken by `textNode` which is at index 0.\r\n     * docFrag.offsetToIndex( 1 ); // Returns 0, because `textNode` has `offsetSize` equal to 3, so it occupies offset 1 too.\r\n     * docFrag.offsetToIndex( 2 ); // Returns 0.\r\n     * docFrag.offsetToIndex( 3 ); // Returns 1.\r\n     * docFrag.offsetToIndex( 4 ); // Returns 2. There are no nodes at offset 4, so last available index is returned.\r\n     * ```\r\n     *\r\n     * @param offset Offset to look for.\r\n     * @returns Index of a node that occupies given offset.\r\n     */\r\n    offsetToIndex(offset) {\r\n        return this._children.offsetToIndex(offset);\r\n    }\r\n    /**\r\n     * Converts `DocumentFragment` instance to plain object and returns it.\r\n     * Takes care of converting all of this document fragment's children.\r\n     *\r\n     * @returns `DocumentFragment` instance converted to plain object.\r\n     */\r\n    toJSON() {\r\n        const json = [];\r\n        for (const node of this._children) {\r\n            json.push(node.toJSON());\r\n        }\r\n        return json;\r\n    }\r\n    /**\r\n     * Creates a `DocumentFragment` instance from given plain object (i.e. parsed JSON string).\r\n     * Converts `DocumentFragment` children to proper nodes.\r\n     *\r\n     * @param json Plain object to be converted to `DocumentFragment`.\r\n     * @returns `DocumentFragment` instance created using given plain object.\r\n     */\r\n    static fromJSON(json) {\r\n        const children = [];\r\n        for (const child of json) {\r\n            if (child.name) {\r\n                // If child has name property, it is an Element.\r\n                children.push(Element.fromJSON(child));\r\n            }\r\n            else {\r\n                // Otherwise, it is a Text node.\r\n                children.push(Text.fromJSON(child));\r\n            }\r\n        }\r\n        return new DocumentFragment(children);\r\n    }\r\n    /**\r\n     * {@link #_insertChild Inserts} one or more nodes at the end of this document fragment.\r\n     *\r\n     * @internal\r\n     * @param items Items to be inserted.\r\n     */\r\n    _appendChild(items) {\r\n        this._insertChild(this.childCount, items);\r\n    }\r\n    /**\r\n     * Inserts one or more nodes at the given index and sets {@link module:engine/model/node~Node#parent parent} of these nodes\r\n     * to this document fragment.\r\n     *\r\n     * @internal\r\n     * @param index Index at which nodes should be inserted.\r\n     * @param items Items to be inserted.\r\n     */\r\n    _insertChild(index, items) {\r\n        const nodes = normalize(items);\r\n        for (const node of nodes) {\r\n            // If node that is being added to this element is already inside another element, first remove it from the old parent.\r\n            if (node.parent !== null) {\r\n                node._remove();\r\n            }\r\n            node.parent = this;\r\n        }\r\n        this._children._insertNodes(index, nodes);\r\n    }\r\n    /**\r\n     * Removes one or more nodes starting at the given index\r\n     * and sets {@link module:engine/model/node~Node#parent parent} of these nodes to `null`.\r\n     *\r\n     * @internal\r\n     * @param index Index of the first node to remove.\r\n     * @param howMany Number of nodes to remove.\r\n     * @returns Array containing removed nodes.\r\n     */\r\n    _removeChildren(index, howMany = 1) {\r\n        const nodes = this._children._removeNodes(index, howMany);\r\n        for (const node of nodes) {\r\n            node.parent = null;\r\n        }\r\n        return nodes;\r\n    }\r\n}\r\n// The magic of type inference using `is` method is centralized in `TypeCheckable` class.\r\n// Proper overload would interfere with that.\r\nDocumentFragment.prototype.is = function (type) {\r\n    return type === 'documentFragment' || type === 'model:documentFragment';\r\n};\r\n/**\r\n * Converts strings to Text and non-iterables to arrays.\r\n */\r\nfunction normalize(nodes) {\r\n    // Separate condition because string is iterable.\r\n    if (typeof nodes == 'string') {\r\n        return [new Text(nodes)];\r\n    }\r\n    if (!isIterable(nodes)) {\r\n        nodes = [nodes];\r\n    }\r\n    // Array.from to enable .map() on non-arrays.\r\n    return Array.from(nodes)\r\n        .map(node => {\r\n        if (typeof node == 'string') {\r\n            return new Text(node);\r\n        }\r\n        if (node instanceof TextProxy) {\r\n            return new Text(node.data, node.getAttributes());\r\n        }\r\n        return node;\r\n    });\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/writer\r\n */\r\nimport AttributeOperation from './operation/attributeoperation';\r\nimport DetachOperation from './operation/detachoperation';\r\nimport InsertOperation from './operation/insertoperation';\r\nimport MarkerOperation from './operation/markeroperation';\r\nimport MergeOperation from './operation/mergeoperation';\r\nimport MoveOperation from './operation/moveoperation';\r\nimport RenameOperation from './operation/renameoperation';\r\nimport RootAttributeOperation from './operation/rootattributeoperation';\r\nimport RootOperation from './operation/rootoperation';\r\nimport SplitOperation from './operation/splitoperation';\r\nimport DocumentFragment from './documentfragment';\r\nimport DocumentSelection from './documentselection';\r\nimport Element from './element';\r\nimport Position from './position';\r\nimport Range from './range';\r\nimport RootElement from './rootelement';\r\nimport Text from './text';\r\nimport { CKEditorError, logWarning, toMap } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * The model can only be modified by using the writer. It should be used whenever you want to create a node, modify\r\n * child nodes, attributes or text, set the selection's position and its attributes.\r\n *\r\n * The instance of the writer is only available in the {@link module:engine/model/model~Model#change `change()`} or\r\n * {@link module:engine/model/model~Model#enqueueChange `enqueueChange()`}.\r\n *\r\n * ```ts\r\n * model.change( writer => {\r\n * \twriter.insertText( 'foo', paragraph, 'end' );\r\n * } );\r\n * ```\r\n *\r\n * Note that the writer should never be stored and used outside of the `change()` and\r\n * `enqueueChange()` blocks.\r\n *\r\n * Note that writer's methods do not check the {@link module:engine/model/schema~Schema}. It is possible\r\n * to create incorrect model structures by using the writer. Read more about in\r\n * {@glink framework/deep-dive/schema#who-checks-the-schema \"Who checks the schema?\"}.\r\n *\r\n * @see module:engine/model/model~Model#change\r\n * @see module:engine/model/model~Model#enqueueChange\r\n */\r\nexport default class Writer {\r\n    /**\r\n     * Creates a writer instance.\r\n     *\r\n     * **Note:** It is not recommended to use it directly. Use {@link module:engine/model/model~Model#change `Model#change()`} or\r\n     * {@link module:engine/model/model~Model#enqueueChange `Model#enqueueChange()`} instead.\r\n     *\r\n     * @internal\r\n     */\r\n    constructor(model, batch) {\r\n        this.model = model;\r\n        this.batch = batch;\r\n    }\r\n    /**\r\n     * Creates a new {@link module:engine/model/text~Text text node}.\r\n     *\r\n     * ```ts\r\n     * writer.createText( 'foo' );\r\n     * writer.createText( 'foo', { bold: true } );\r\n     * ```\r\n     *\r\n     * @param data Text data.\r\n     * @param attributes Text attributes.\r\n     * @returns {module:engine/model/text~Text} Created text node.\r\n     */\r\n    createText(data, attributes) {\r\n        return new Text(data, attributes);\r\n    }\r\n    /**\r\n     * Creates a new {@link module:engine/model/element~Element element}.\r\n     *\r\n     * ```ts\r\n     * writer.createElement( 'paragraph' );\r\n     * writer.createElement( 'paragraph', { alignment: 'center' } );\r\n     * ```\r\n     *\r\n     * @param name Name of the element.\r\n     * @param attributes Elements attributes.\r\n     * @returns Created element.\r\n     */\r\n    createElement(name, attributes) {\r\n        return new Element(name, attributes);\r\n    }\r\n    /**\r\n     * Creates a new {@link module:engine/model/documentfragment~DocumentFragment document fragment}.\r\n     *\r\n     * @returns Created document fragment.\r\n     */\r\n    createDocumentFragment() {\r\n        return new DocumentFragment();\r\n    }\r\n    /**\r\n     * Creates a copy of the element and returns it. Created element has the same name and attributes as the original element.\r\n     * If clone is deep, the original element's children are also cloned. If not, then empty element is returned.\r\n     *\r\n     * @param element The element to clone.\r\n     * @param deep If set to `true` clones element and all its children recursively. When set to `false`,\r\n     * element will be cloned without any child.\r\n     */\r\n    cloneElement(element, deep = true) {\r\n        return element._clone(deep);\r\n    }\r\n    /**\r\n     * Inserts item on given position.\r\n     *\r\n     * ```ts\r\n     * const paragraph = writer.createElement( 'paragraph' );\r\n     * writer.insert( paragraph, position );\r\n     * ```\r\n     *\r\n     * Instead of using position you can use parent and offset:\r\n     *\r\n     * ```ts\r\n     * const text = writer.createText( 'foo' );\r\n     * writer.insert( text, paragraph, 5 );\r\n     * ```\r\n     *\r\n     * You can also use `end` instead of the offset to insert at the end:\r\n     *\r\n     * ```ts\r\n     * const text = writer.createText( 'foo' );\r\n     * writer.insert( text, paragraph, 'end' );\r\n     * ```\r\n     *\r\n     * Or insert before or after another element:\r\n     *\r\n     * ```ts\r\n     * const paragraph = writer.createElement( 'paragraph' );\r\n     * writer.insert( paragraph, anotherParagraph, 'after' );\r\n     * ```\r\n     *\r\n     * These parameters works the same way as {@link #createPositionAt `writer.createPositionAt()`}.\r\n     *\r\n     * Note that if the item already has parent it will be removed from the previous parent.\r\n     *\r\n     * Note that you cannot re-insert a node from a document to a different document or a document fragment. In this case,\r\n     * `model-writer-insert-forbidden-move` is thrown.\r\n     *\r\n     * If you want to move {@link module:engine/model/range~Range range} instead of an\r\n     * {@link module:engine/model/item~Item item} use {@link module:engine/model/writer~Writer#move `Writer#move()`}.\r\n     *\r\n     * **Note:** For a paste-like content insertion mechanism see\r\n     * {@link module:engine/model/model~Model#insertContent `model.insertContent()`}.\r\n     *\r\n     * @param item Item or document fragment to insert.\r\n     * @param offset Offset or one of the flags. Used only when second parameter is a {@link module:engine/model/item~Item model item}.\r\n     */\r\n    insert(item, itemOrPosition, offset = 0) {\r\n        this._assertWriterUsedCorrectly();\r\n        if (item instanceof Text && item.data == '') {\r\n            return;\r\n        }\r\n        const position = Position._createAt(itemOrPosition, offset);\r\n        // If item has a parent already.\r\n        if (item.parent) {\r\n            // We need to check if item is going to be inserted within the same document.\r\n            if (isSameTree(item.root, position.root)) {\r\n                // If it's we just need to move it.\r\n                this.move(Range._createOn(item), position);\r\n                return;\r\n            }\r\n            // If it isn't the same root.\r\n            else {\r\n                if (item.root.document) {\r\n                    /**\r\n                     * Cannot move a node from a document to a different tree.\r\n                     * It is forbidden to move a node that was already in a document outside of it.\r\n                     *\r\n                     * @error model-writer-insert-forbidden-move\r\n                     */\r\n                    throw new CKEditorError('model-writer-insert-forbidden-move', this);\r\n                }\r\n                else {\r\n                    // Move between two different document fragments or from document fragment to a document is possible.\r\n                    // In that case, remove the item from it's original parent.\r\n                    this.remove(item);\r\n                }\r\n            }\r\n        }\r\n        const version = position.root.document ? position.root.document.version : null;\r\n        const insert = new InsertOperation(position, item, version);\r\n        if (item instanceof Text) {\r\n            insert.shouldReceiveAttributes = true;\r\n        }\r\n        this.batch.addOperation(insert);\r\n        this.model.applyOperation(insert);\r\n        // When element is a DocumentFragment we need to move its markers to Document#markers.\r\n        if (item instanceof DocumentFragment) {\r\n            for (const [markerName, markerRange] of item.markers) {\r\n                // We need to migrate marker range from DocumentFragment to Document.\r\n                const rangeRootPosition = Position._createAt(markerRange.root, 0);\r\n                const range = new Range(markerRange.start._getCombined(rangeRootPosition, position), markerRange.end._getCombined(rangeRootPosition, position));\r\n                const options = { range, usingOperation: true, affectsData: true };\r\n                if (this.model.markers.has(markerName)) {\r\n                    this.updateMarker(markerName, options);\r\n                }\r\n                else {\r\n                    this.addMarker(markerName, options);\r\n                }\r\n            }\r\n        }\r\n    }\r\n    insertText(text, attributes, // Too complicated when not using `any`.\r\n    itemOrPosition, // Too complicated when not using `any`.\r\n    offset // Too complicated when not using `any`.\r\n    ) {\r\n        if (attributes instanceof DocumentFragment || attributes instanceof Element || attributes instanceof Position) {\r\n            this.insert(this.createText(text), attributes, itemOrPosition);\r\n        }\r\n        else {\r\n            this.insert(this.createText(text, attributes), itemOrPosition, offset);\r\n        }\r\n    }\r\n    insertElement(name, attributes, // Too complicated when not using `any`.\r\n    itemOrPositionOrOffset, // Too complicated when not using `any`.\r\n    offset // Too complicated when not using `any`.\r\n    ) {\r\n        if (attributes instanceof DocumentFragment || attributes instanceof Element || attributes instanceof Position) {\r\n            this.insert(this.createElement(name), attributes, itemOrPositionOrOffset);\r\n        }\r\n        else {\r\n            this.insert(this.createElement(name, attributes), itemOrPositionOrOffset, offset);\r\n        }\r\n    }\r\n    /**\r\n     * Inserts item at the end of the given parent.\r\n     *\r\n     * ```ts\r\n     * const paragraph = writer.createElement( 'paragraph' );\r\n     * writer.append( paragraph, root );\r\n     * ```\r\n     *\r\n     * Note that if the item already has parent it will be removed from the previous parent.\r\n     *\r\n     * If you want to move {@link module:engine/model/range~Range range} instead of an\r\n     * {@link module:engine/model/item~Item item} use {@link module:engine/model/writer~Writer#move `Writer#move()`}.\r\n     *\r\n     * @param item Item or document fragment to insert.\r\n     */\r\n    append(item, parent) {\r\n        this.insert(item, parent, 'end');\r\n    }\r\n    appendText(text, attributes, parent) {\r\n        if (attributes instanceof DocumentFragment || attributes instanceof Element) {\r\n            this.insert(this.createText(text), attributes, 'end');\r\n        }\r\n        else {\r\n            this.insert(this.createText(text, attributes), parent, 'end');\r\n        }\r\n    }\r\n    appendElement(name, attributes, parent) {\r\n        if (attributes instanceof DocumentFragment || attributes instanceof Element) {\r\n            this.insert(this.createElement(name), attributes, 'end');\r\n        }\r\n        else {\r\n            this.insert(this.createElement(name, attributes), parent, 'end');\r\n        }\r\n    }\r\n    /**\r\n     * Sets value of the attribute with given key on a {@link module:engine/model/item~Item model item}\r\n     * or on a {@link module:engine/model/range~Range range}.\r\n     *\r\n     * @param key Attribute key.\r\n     * @param value Attribute new value.\r\n     * @param itemOrRange Model item or range on which the attribute will be set.\r\n     */\r\n    setAttribute(key, value, itemOrRange) {\r\n        this._assertWriterUsedCorrectly();\r\n        if (itemOrRange instanceof Range) {\r\n            const ranges = itemOrRange.getMinimalFlatRanges();\r\n            for (const range of ranges) {\r\n                setAttributeOnRange(this, key, value, range);\r\n            }\r\n        }\r\n        else {\r\n            setAttributeOnItem(this, key, value, itemOrRange);\r\n        }\r\n    }\r\n    /**\r\n     * Sets values of attributes on a {@link module:engine/model/item~Item model item}\r\n     * or on a {@link module:engine/model/range~Range range}.\r\n     *\r\n     * ```ts\r\n     * writer.setAttributes( {\r\n     * \tbold: true,\r\n     * \titalic: true\r\n     * }, range );\r\n     * ```\r\n     *\r\n     * @param attributes Attributes keys and values.\r\n     * @param itemOrRange Model item or range on which the attributes will be set.\r\n     */\r\n    setAttributes(attributes, itemOrRange) {\r\n        for (const [key, val] of toMap(attributes)) {\r\n            this.setAttribute(key, val, itemOrRange);\r\n        }\r\n    }\r\n    /**\r\n     * Removes an attribute with given key from a {@link module:engine/model/item~Item model item}\r\n     * or from a {@link module:engine/model/range~Range range}.\r\n     *\r\n     * @param key Attribute key.\r\n     * @param itemOrRange Model item or range from which the attribute will be removed.\r\n     */\r\n    removeAttribute(key, itemOrRange) {\r\n        this._assertWriterUsedCorrectly();\r\n        if (itemOrRange instanceof Range) {\r\n            const ranges = itemOrRange.getMinimalFlatRanges();\r\n            for (const range of ranges) {\r\n                setAttributeOnRange(this, key, null, range);\r\n            }\r\n        }\r\n        else {\r\n            setAttributeOnItem(this, key, null, itemOrRange);\r\n        }\r\n    }\r\n    /**\r\n     * Removes all attributes from all elements in the range or from the given item.\r\n     *\r\n     * @param itemOrRange Model item or range from which all attributes will be removed.\r\n     */\r\n    clearAttributes(itemOrRange) {\r\n        this._assertWriterUsedCorrectly();\r\n        const removeAttributesFromItem = (item) => {\r\n            for (const attribute of item.getAttributeKeys()) {\r\n                this.removeAttribute(attribute, item);\r\n            }\r\n        };\r\n        if (!(itemOrRange instanceof Range)) {\r\n            removeAttributesFromItem(itemOrRange);\r\n        }\r\n        else {\r\n            for (const item of itemOrRange.getItems()) {\r\n                removeAttributesFromItem(item);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Moves all items in the source range to the target position.\r\n     *\r\n     * ```ts\r\n     * writer.move( sourceRange, targetPosition );\r\n     * ```\r\n     *\r\n     * Instead of the target position you can use parent and offset or define that range should be moved to the end\r\n     * or before or after chosen item:\r\n     *\r\n     * ```ts\r\n     * // Moves all items in the range to the paragraph at offset 5:\r\n     * writer.move( sourceRange, paragraph, 5 );\r\n     * // Moves all items in the range to the end of a blockquote:\r\n     * writer.move( sourceRange, blockquote, 'end' );\r\n     * // Moves all items in the range to a position after an image:\r\n     * writer.move( sourceRange, image, 'after' );\r\n     * ```\r\n     *\r\n     * These parameters work the same way as {@link #createPositionAt `writer.createPositionAt()`}.\r\n     *\r\n     * Note that items can be moved only within the same tree. It means that you can move items within the same root\r\n     * (element or document fragment) or between {@link module:engine/model/document~Document#roots documents roots},\r\n     * but you can not move items from document fragment to the document or from one detached element to another. Use\r\n     * {@link module:engine/model/writer~Writer#insert} in such cases.\r\n     *\r\n     * @param range Source range.\r\n     * @param offset Offset or one of the flags. Used only when second parameter is a {@link module:engine/model/item~Item model item}.\r\n     */\r\n    move(range, itemOrPosition, offset) {\r\n        this._assertWriterUsedCorrectly();\r\n        if (!(range instanceof Range)) {\r\n            /**\r\n             * Invalid range to move.\r\n             *\r\n             * @error writer-move-invalid-range\r\n             */\r\n            throw new CKEditorError('writer-move-invalid-range', this);\r\n        }\r\n        if (!range.isFlat) {\r\n            /**\r\n             * Range to move is not flat.\r\n             *\r\n             * @error writer-move-range-not-flat\r\n             */\r\n            throw new CKEditorError('writer-move-range-not-flat', this);\r\n        }\r\n        const position = Position._createAt(itemOrPosition, offset);\r\n        // Do not move anything if the move target is same as moved range start.\r\n        if (position.isEqual(range.start)) {\r\n            return;\r\n        }\r\n        // If part of the marker is removed, create additional marker operation for undo purposes.\r\n        this._addOperationForAffectedMarkers('move', range);\r\n        if (!isSameTree(range.root, position.root)) {\r\n            /**\r\n             * Range is going to be moved within not the same document. Please use\r\n             * {@link module:engine/model/writer~Writer#insert insert} instead.\r\n             *\r\n             * @error writer-move-different-document\r\n             */\r\n            throw new CKEditorError('writer-move-different-document', this);\r\n        }\r\n        const version = range.root.document ? range.root.document.version : null;\r\n        const operation = new MoveOperation(range.start, range.end.offset - range.start.offset, position, version);\r\n        this.batch.addOperation(operation);\r\n        this.model.applyOperation(operation);\r\n    }\r\n    /**\r\n     * Removes given model {@link module:engine/model/item~Item item} or {@link module:engine/model/range~Range range}.\r\n     *\r\n     * @param itemOrRange Model item or range to remove.\r\n     */\r\n    remove(itemOrRange) {\r\n        this._assertWriterUsedCorrectly();\r\n        const rangeToRemove = itemOrRange instanceof Range ? itemOrRange : Range._createOn(itemOrRange);\r\n        const ranges = rangeToRemove.getMinimalFlatRanges().reverse();\r\n        for (const flat of ranges) {\r\n            // If part of the marker is removed, create additional marker operation for undo purposes.\r\n            this._addOperationForAffectedMarkers('move', flat);\r\n            applyRemoveOperation(flat.start, flat.end.offset - flat.start.offset, this.batch, this.model);\r\n        }\r\n    }\r\n    /**\r\n     * Merges two siblings at the given position.\r\n     *\r\n     * Node before and after the position have to be an element. Otherwise `writer-merge-no-element-before` or\r\n     * `writer-merge-no-element-after` error will be thrown.\r\n     *\r\n     * @param position Position between merged elements.\r\n     */\r\n    merge(position) {\r\n        this._assertWriterUsedCorrectly();\r\n        const nodeBefore = position.nodeBefore;\r\n        const nodeAfter = position.nodeAfter;\r\n        // If part of the marker is removed, create additional marker operation for undo purposes.\r\n        this._addOperationForAffectedMarkers('merge', position);\r\n        if (!(nodeBefore instanceof Element)) {\r\n            /**\r\n             * Node before merge position must be an element.\r\n             *\r\n             * @error writer-merge-no-element-before\r\n             */\r\n            throw new CKEditorError('writer-merge-no-element-before', this);\r\n        }\r\n        if (!(nodeAfter instanceof Element)) {\r\n            /**\r\n             * Node after merge position must be an element.\r\n             *\r\n             * @error writer-merge-no-element-after\r\n             */\r\n            throw new CKEditorError('writer-merge-no-element-after', this);\r\n        }\r\n        if (!position.root.document) {\r\n            this._mergeDetached(position);\r\n        }\r\n        else {\r\n            this._merge(position);\r\n        }\r\n    }\r\n    /**\r\n     * Shortcut for {@link module:engine/model/model~Model#createPositionFromPath `Model#createPositionFromPath()`}.\r\n     *\r\n     * @param root Root of the position.\r\n     * @param path Position path. See {@link module:engine/model/position~Position#path}.\r\n     * @param stickiness Position stickiness. See {@link module:engine/model/position~PositionStickiness}.\r\n     */\r\n    createPositionFromPath(root, path, stickiness) {\r\n        return this.model.createPositionFromPath(root, path, stickiness);\r\n    }\r\n    /**\r\n     * Shortcut for {@link module:engine/model/model~Model#createPositionAt `Model#createPositionAt()`}.\r\n     *\r\n     * @param offset Offset or one of the flags. Used only when first parameter is a {@link module:engine/model/item~Item model item}.\r\n     */\r\n    createPositionAt(itemOrPosition, offset) {\r\n        return this.model.createPositionAt(itemOrPosition, offset);\r\n    }\r\n    /**\r\n     * Shortcut for {@link module:engine/model/model~Model#createPositionAfter `Model#createPositionAfter()`}.\r\n     *\r\n     * @param item Item after which the position should be placed.\r\n     */\r\n    createPositionAfter(item) {\r\n        return this.model.createPositionAfter(item);\r\n    }\r\n    /**\r\n     * Shortcut for {@link module:engine/model/model~Model#createPositionBefore `Model#createPositionBefore()`}.\r\n     *\r\n     * @param item Item after which the position should be placed.\r\n     */\r\n    createPositionBefore(item) {\r\n        return this.model.createPositionBefore(item);\r\n    }\r\n    /**\r\n     * Shortcut for {@link module:engine/model/model~Model#createRange `Model#createRange()`}.\r\n     *\r\n     * @param start Start position.\r\n     * @param end End position. If not set, range will be collapsed at `start` position.\r\n     */\r\n    createRange(start, end) {\r\n        return this.model.createRange(start, end);\r\n    }\r\n    /**\r\n     * Shortcut for {@link module:engine/model/model~Model#createRangeIn `Model#createRangeIn()`}.\r\n     *\r\n     * @param element Element which is a parent for the range.\r\n     */\r\n    createRangeIn(element) {\r\n        return this.model.createRangeIn(element);\r\n    }\r\n    /**\r\n     * Shortcut for {@link module:engine/model/model~Model#createRangeOn `Model#createRangeOn()`}.\r\n     *\r\n     * @param element Element which is a parent for the range.\r\n     */\r\n    createRangeOn(element) {\r\n        return this.model.createRangeOn(element);\r\n    }\r\n    createSelection(...args) {\r\n        return this.model.createSelection(...args);\r\n    }\r\n    /**\r\n     * Performs merge action in a detached tree.\r\n     *\r\n     * @param position Position between merged elements.\r\n     */\r\n    _mergeDetached(position) {\r\n        const nodeBefore = position.nodeBefore;\r\n        const nodeAfter = position.nodeAfter;\r\n        this.move(Range._createIn(nodeAfter), Position._createAt(nodeBefore, 'end'));\r\n        this.remove(nodeAfter);\r\n    }\r\n    /**\r\n     * Performs merge action in a non-detached tree.\r\n     *\r\n     * @param position Position between merged elements.\r\n     */\r\n    _merge(position) {\r\n        const targetPosition = Position._createAt(position.nodeBefore, 'end');\r\n        const sourcePosition = Position._createAt(position.nodeAfter, 0);\r\n        const graveyard = position.root.document.graveyard;\r\n        const graveyardPosition = new Position(graveyard, [0]);\r\n        const version = position.root.document.version;\r\n        const merge = new MergeOperation(sourcePosition, position.nodeAfter.maxOffset, targetPosition, graveyardPosition, version);\r\n        this.batch.addOperation(merge);\r\n        this.model.applyOperation(merge);\r\n    }\r\n    /**\r\n     * Renames the given element.\r\n     *\r\n     * @param element The element to rename.\r\n     * @param newName New element name.\r\n     */\r\n    rename(element, newName) {\r\n        this._assertWriterUsedCorrectly();\r\n        if (!(element instanceof Element)) {\r\n            /**\r\n             * Trying to rename an object which is not an instance of Element.\r\n             *\r\n             * @error writer-rename-not-element-instance\r\n             */\r\n            throw new CKEditorError('writer-rename-not-element-instance', this);\r\n        }\r\n        const version = element.root.document ? element.root.document.version : null;\r\n        const renameOperation = new RenameOperation(Position._createBefore(element), element.name, newName, version);\r\n        this.batch.addOperation(renameOperation);\r\n        this.model.applyOperation(renameOperation);\r\n    }\r\n    /**\r\n     * Splits elements starting from the given position and going to the top of the model tree as long as given\r\n     * `limitElement` is reached. When `limitElement` is not defined then only the parent of the given position will be split.\r\n     *\r\n     * The element needs to have a parent. It cannot be a root element nor a document fragment.\r\n     * The `writer-split-element-no-parent` error will be thrown if you try to split an element with no parent.\r\n     *\r\n     * @param position Position of split.\r\n     * @param limitElement Stop splitting when this element will be reached.\r\n     * @returns Split result with properties:\r\n     * * `position` - Position between split elements.\r\n     * * `range` - Range that stars from the end of the first split element and ends at the beginning of the first copy element.\r\n     */\r\n    split(position, limitElement) {\r\n        this._assertWriterUsedCorrectly();\r\n        let splitElement = position.parent;\r\n        if (!splitElement.parent) {\r\n            /**\r\n             * Element with no parent can not be split.\r\n             *\r\n             * @error writer-split-element-no-parent\r\n             */\r\n            throw new CKEditorError('writer-split-element-no-parent', this);\r\n        }\r\n        // When limit element is not defined lets set splitElement parent as limit.\r\n        if (!limitElement) {\r\n            limitElement = splitElement.parent;\r\n        }\r\n        if (!position.parent.getAncestors({ includeSelf: true }).includes(limitElement)) {\r\n            /**\r\n             * Limit element is not a position ancestor.\r\n             *\r\n             * @error writer-split-invalid-limit-element\r\n             */\r\n            throw new CKEditorError('writer-split-invalid-limit-element', this);\r\n        }\r\n        // We need to cache elements that will be created as a result of the first split because\r\n        // we need to create a range from the end of the first split element to the beginning of the\r\n        // first copy element. This should be handled by LiveRange but it doesn't work on detached nodes.\r\n        let firstSplitElement;\r\n        let firstCopyElement;\r\n        do {\r\n            const version = splitElement.root.document ? splitElement.root.document.version : null;\r\n            const howMany = splitElement.maxOffset - position.offset;\r\n            const insertionPosition = SplitOperation.getInsertionPosition(position);\r\n            const split = new SplitOperation(position, howMany, insertionPosition, null, version);\r\n            this.batch.addOperation(split);\r\n            this.model.applyOperation(split);\r\n            // Cache result of the first split.\r\n            if (!firstSplitElement && !firstCopyElement) {\r\n                firstSplitElement = splitElement;\r\n                firstCopyElement = position.parent.nextSibling;\r\n            }\r\n            position = this.createPositionAfter(position.parent);\r\n            splitElement = position.parent;\r\n        } while (splitElement !== limitElement);\r\n        return {\r\n            position,\r\n            range: new Range(Position._createAt(firstSplitElement, 'end'), Position._createAt(firstCopyElement, 0))\r\n        };\r\n    }\r\n    /**\r\n     * Wraps the given range with the given element or with a new element (if a string was passed).\r\n     *\r\n     * **Note:** range to wrap should be a \"flat range\" (see {@link module:engine/model/range~Range#isFlat `Range#isFlat`}).\r\n     * If not, an error will be thrown.\r\n     *\r\n     * @param range Range to wrap.\r\n     * @param elementOrString Element or name of element to wrap the range with.\r\n     */\r\n    wrap(range, elementOrString) {\r\n        this._assertWriterUsedCorrectly();\r\n        if (!range.isFlat) {\r\n            /**\r\n             * Range to wrap is not flat.\r\n             *\r\n             * @error writer-wrap-range-not-flat\r\n             */\r\n            throw new CKEditorError('writer-wrap-range-not-flat', this);\r\n        }\r\n        const element = elementOrString instanceof Element ? elementOrString : new Element(elementOrString);\r\n        if (element.childCount > 0) {\r\n            /**\r\n             * Element to wrap with is not empty.\r\n             *\r\n             * @error writer-wrap-element-not-empty\r\n             */\r\n            throw new CKEditorError('writer-wrap-element-not-empty', this);\r\n        }\r\n        if (element.parent !== null) {\r\n            /**\r\n             * Element to wrap with is already attached to a tree model.\r\n             *\r\n             * @error writer-wrap-element-attached\r\n             */\r\n            throw new CKEditorError('writer-wrap-element-attached', this);\r\n        }\r\n        this.insert(element, range.start);\r\n        // Shift the range-to-wrap because we just inserted an element before that range.\r\n        const shiftedRange = new Range(range.start.getShiftedBy(1), range.end.getShiftedBy(1));\r\n        this.move(shiftedRange, Position._createAt(element, 0));\r\n    }\r\n    /**\r\n     * Unwraps children of the given element – all its children are moved before it and then the element is removed.\r\n     * Throws error if you try to unwrap an element which does not have a parent.\r\n     *\r\n     * @param element Element to unwrap.\r\n     */\r\n    unwrap(element) {\r\n        this._assertWriterUsedCorrectly();\r\n        if (element.parent === null) {\r\n            /**\r\n             * Trying to unwrap an element which has no parent.\r\n             *\r\n             * @error writer-unwrap-element-no-parent\r\n             */\r\n            throw new CKEditorError('writer-unwrap-element-no-parent', this);\r\n        }\r\n        this.move(Range._createIn(element), this.createPositionAfter(element));\r\n        this.remove(element);\r\n    }\r\n    /**\r\n     * Adds a {@link module:engine/model/markercollection~Marker marker}. Marker is a named range, which tracks\r\n     * changes in the document and updates its range automatically, when model tree changes.\r\n     *\r\n     * As the first parameter you can set marker name.\r\n     *\r\n     * The required `options.usingOperation` parameter lets you decide if the marker should be managed by operations or not. See\r\n     * {@link module:engine/model/markercollection~Marker marker class description} to learn about the difference between\r\n     * markers managed by operations and not-managed by operations.\r\n     *\r\n     * The `options.affectsData` parameter, which defaults to `false`, allows you to define if a marker affects the data. It should be\r\n     * `true` when the marker change changes the data returned by the\r\n     * {@link module:core/editor/utils/dataapimixin~DataApi#getData `editor.getData()`} method.\r\n     * When set to `true` it fires the {@link module:engine/model/document~Document#event:change:data `change:data`} event.\r\n     * When set to `false` it fires the {@link module:engine/model/document~Document#event:change `change`} event.\r\n     *\r\n     * Create marker directly base on marker's name:\r\n     *\r\n     * ```ts\r\n     * addMarker( markerName, { range, usingOperation: false } );\r\n     * ```\r\n     *\r\n     * Create marker using operation:\r\n     *\r\n     * ```ts\r\n     * addMarker( markerName, { range, usingOperation: true } );\r\n     * ```\r\n     *\r\n     * Create marker that affects the editor data:\r\n     *\r\n     * ```ts\r\n     * addMarker( markerName, { range, usingOperation: false, affectsData: true } );\r\n     * ```\r\n     *\r\n     * Note: For efficiency reasons, it's best to create and keep as little markers as possible.\r\n     *\r\n     * @see module:engine/model/markercollection~Marker\r\n     * @param name Name of a marker to create - must be unique.\r\n     * @param options.usingOperation Flag indicating that the marker should be added by MarkerOperation.\r\n     * See {@link module:engine/model/markercollection~Marker#managedUsingOperations}.\r\n     * @param options.range Marker range.\r\n     * @param options.affectsData Flag indicating that the marker changes the editor data.\r\n     * @returns Marker that was set.\r\n     */\r\n    addMarker(name, options) {\r\n        this._assertWriterUsedCorrectly();\r\n        if (!options || typeof options.usingOperation != 'boolean') {\r\n            /**\r\n             * The `options.usingOperation` parameter is required when adding a new marker.\r\n             *\r\n             * @error writer-addmarker-no-usingoperation\r\n             */\r\n            throw new CKEditorError('writer-addmarker-no-usingoperation', this);\r\n        }\r\n        const usingOperation = options.usingOperation;\r\n        const range = options.range;\r\n        const affectsData = options.affectsData === undefined ? false : options.affectsData;\r\n        if (this.model.markers.has(name)) {\r\n            /**\r\n             * Marker with provided name already exists.\r\n             *\r\n             * @error writer-addmarker-marker-exists\r\n             */\r\n            throw new CKEditorError('writer-addmarker-marker-exists', this);\r\n        }\r\n        if (!range) {\r\n            /**\r\n             * Range parameter is required when adding a new marker.\r\n             *\r\n             * @error writer-addmarker-no-range\r\n             */\r\n            throw new CKEditorError('writer-addmarker-no-range', this);\r\n        }\r\n        if (!usingOperation) {\r\n            return this.model.markers._set(name, range, usingOperation, affectsData);\r\n        }\r\n        applyMarkerOperation(this, name, null, range, affectsData);\r\n        return this.model.markers.get(name);\r\n    }\r\n    /**\r\n     * Adds, updates or refreshes a {@link module:engine/model/markercollection~Marker marker}. Marker is a named range, which tracks\r\n     * changes in the document and updates its range automatically, when model tree changes. Still, it is possible to change the\r\n     * marker's range directly using this method.\r\n     *\r\n     * As the first parameter you can set marker name or instance. If none of them is provided, new marker, with a unique\r\n     * name is created and returned.\r\n     *\r\n     * **Note**: If you want to change the {@link module:engine/view/element~Element view element} of the marker while its data in the model\r\n     * remains the same, use the dedicated {@link module:engine/controller/editingcontroller~EditingController#reconvertMarker} method.\r\n     *\r\n     * The `options.usingOperation` parameter lets you change if the marker should be managed by operations or not. See\r\n     * {@link module:engine/model/markercollection~Marker marker class description} to learn about the difference between\r\n     * markers managed by operations and not-managed by operations. It is possible to change this option for an existing marker.\r\n     *\r\n     * The `options.affectsData` parameter, which defaults to `false`, allows you to define if a marker affects the data. It should be\r\n     * `true` when the marker change changes the data returned by\r\n     * the {@link module:core/editor/utils/dataapimixin~DataApi#getData `editor.getData()`} method.\r\n     * When set to `true` it fires the {@link module:engine/model/document~Document#event:change:data `change:data`} event.\r\n     * When set to `false` it fires the {@link module:engine/model/document~Document#event:change `change`} event.\r\n     *\r\n     * Update marker directly base on marker's name:\r\n     *\r\n     * ```ts\r\n     * updateMarker( markerName, { range } );\r\n     * ```\r\n     *\r\n     * Update marker using operation:\r\n     *\r\n     * ```ts\r\n     * updateMarker( marker, { range, usingOperation: true } );\r\n     * updateMarker( markerName, { range, usingOperation: true } );\r\n     * ```\r\n     *\r\n     * Change marker's option (start using operations to manage it):\r\n     *\r\n     * ```ts\r\n     * updateMarker( marker, { usingOperation: true } );\r\n     * ```\r\n     *\r\n     * Change marker's option (inform the engine, that the marker does not affect the data anymore):\r\n     *\r\n     * ```ts\r\n     * updateMarker( markerName, { affectsData: false } );\r\n     * ```\r\n     *\r\n     * @see module:engine/model/markercollection~Marker\r\n     * @param markerOrName Name of a marker to update, or a marker instance.\r\n     * @param options If options object is not defined then marker will be refreshed by triggering\r\n     * downcast conversion for this marker with the same data.\r\n     * @param options.range Marker range to update.\r\n     * @param options.usingOperation Flag indicated whether the marker should be added by MarkerOperation.\r\n     * See {@link module:engine/model/markercollection~Marker#managedUsingOperations}.\r\n     * @param options.affectsData Flag indicating that the marker changes the editor data.\r\n     */\r\n    updateMarker(markerOrName, options) {\r\n        this._assertWriterUsedCorrectly();\r\n        const markerName = typeof markerOrName == 'string' ? markerOrName : markerOrName.name;\r\n        const currentMarker = this.model.markers.get(markerName);\r\n        if (!currentMarker) {\r\n            /**\r\n             * Marker with provided name does not exist and will not be updated.\r\n             *\r\n             * @error writer-updatemarker-marker-not-exists\r\n             */\r\n            throw new CKEditorError('writer-updatemarker-marker-not-exists', this);\r\n        }\r\n        if (!options) {\r\n            /**\r\n             * The usage of `writer.updateMarker()` only to reconvert (refresh) a\r\n             * {@link module:engine/model/markercollection~Marker model marker} was deprecated and may not work in the future.\r\n             * Please update your code to use\r\n             * {@link module:engine/controller/editingcontroller~EditingController#reconvertMarker `editor.editing.reconvertMarker()`}\r\n             * instead.\r\n             *\r\n             * @error writer-updatemarker-reconvert-using-editingcontroller\r\n             * @param markerName The name of the updated marker.\r\n             */\r\n            logWarning('writer-updatemarker-reconvert-using-editingcontroller', { markerName });\r\n            this.model.markers._refresh(currentMarker);\r\n            return;\r\n        }\r\n        const hasUsingOperationDefined = typeof options.usingOperation == 'boolean';\r\n        const affectsDataDefined = typeof options.affectsData == 'boolean';\r\n        // Use previously defined marker's affectsData if the property is not provided.\r\n        const affectsData = affectsDataDefined ? options.affectsData : currentMarker.affectsData;\r\n        if (!hasUsingOperationDefined && !options.range && !affectsDataDefined) {\r\n            /**\r\n             * One of the options is required - provide range, usingOperations or affectsData.\r\n             *\r\n             * @error writer-updatemarker-wrong-options\r\n             */\r\n            throw new CKEditorError('writer-updatemarker-wrong-options', this);\r\n        }\r\n        const currentRange = currentMarker.getRange();\r\n        const updatedRange = options.range ? options.range : currentRange;\r\n        if (hasUsingOperationDefined && options.usingOperation !== currentMarker.managedUsingOperations) {\r\n            // The marker type is changed so it's necessary to create proper operations.\r\n            if (options.usingOperation) {\r\n                // If marker changes to a managed one treat this as synchronizing existing marker.\r\n                // Create `MarkerOperation` with `oldRange` set to `null`, so reverse operation will remove the marker.\r\n                applyMarkerOperation(this, markerName, null, updatedRange, affectsData);\r\n            }\r\n            else {\r\n                // If marker changes to a marker that do not use operations then we need to create additional operation\r\n                // that removes that marker first.\r\n                applyMarkerOperation(this, markerName, currentRange, null, affectsData);\r\n                // Although not managed the marker itself should stay in model and its range should be preserver or changed to passed range.\r\n                this.model.markers._set(markerName, updatedRange, undefined, affectsData);\r\n            }\r\n            return;\r\n        }\r\n        // Marker's type doesn't change so update it accordingly.\r\n        if (currentMarker.managedUsingOperations) {\r\n            applyMarkerOperation(this, markerName, currentRange, updatedRange, affectsData);\r\n        }\r\n        else {\r\n            this.model.markers._set(markerName, updatedRange, undefined, affectsData);\r\n        }\r\n    }\r\n    /**\r\n     * Removes given {@link module:engine/model/markercollection~Marker marker} or marker with given name.\r\n     * The marker is removed accordingly to how it has been created, so if the marker was created using operation,\r\n     * it will be destroyed using operation.\r\n     *\r\n     * @param markerOrName Marker or marker name to remove.\r\n     */\r\n    removeMarker(markerOrName) {\r\n        this._assertWriterUsedCorrectly();\r\n        const name = typeof markerOrName == 'string' ? markerOrName : markerOrName.name;\r\n        if (!this.model.markers.has(name)) {\r\n            /**\r\n             * Trying to remove marker which does not exist.\r\n             *\r\n             * @error writer-removemarker-no-marker\r\n             */\r\n            throw new CKEditorError('writer-removemarker-no-marker', this);\r\n        }\r\n        const marker = this.model.markers.get(name);\r\n        if (!marker.managedUsingOperations) {\r\n            this.model.markers._remove(name);\r\n            return;\r\n        }\r\n        const oldRange = marker.getRange();\r\n        applyMarkerOperation(this, name, oldRange, null, marker.affectsData);\r\n    }\r\n    /**\r\n     * Adds a new root to the document (or re-attaches a {@link #detachRoot detached root}).\r\n     *\r\n     * Throws an error, if trying to add a root that is already added and attached.\r\n     *\r\n     * @param rootName Name of the added root.\r\n     * @param elementName The element name. Defaults to `'$root'` which also has some basic schema defined\r\n     * (e.g. `$block` elements are allowed inside the `$root`). Make sure to define a proper schema if you use a different name.\r\n     * @returns The added root element.\r\n     */\r\n    addRoot(rootName, elementName = '$root') {\r\n        this._assertWriterUsedCorrectly();\r\n        const root = this.model.document.getRoot(rootName);\r\n        if (root && root.isAttached()) {\r\n            /**\r\n             * Root with provided name already exists and is attached.\r\n             *\r\n             * @error writer-addroot-root-exists\r\n             */\r\n            throw new CKEditorError('writer-addroot-root-exists', this);\r\n        }\r\n        const document = this.model.document;\r\n        const operation = new RootOperation(rootName, elementName, true, document, document.version);\r\n        this.batch.addOperation(operation);\r\n        this.model.applyOperation(operation);\r\n        return this.model.document.getRoot(rootName);\r\n    }\r\n    /**\r\n     * Detaches the root from the document.\r\n     *\r\n     * All content and markers are removed from the root upon detaching. New content and new markers cannot be added to the root, as long\r\n     * as it is detached.\r\n     *\r\n     * A root cannot be fully removed from the document, it can be only detached. A root is permanently removed only after you\r\n     * re-initialize the editor and do not specify the root in the initial data.\r\n     *\r\n     * A detached root can be re-attached using {@link #addRoot}.\r\n     *\r\n     * Throws an error if the root does not exist or the root is already detached.\r\n     *\r\n     * @param rootOrName Name of the detached root.\r\n     */\r\n    detachRoot(rootOrName) {\r\n        this._assertWriterUsedCorrectly();\r\n        const root = typeof rootOrName == 'string' ? this.model.document.getRoot(rootOrName) : rootOrName;\r\n        if (!root || !root.isAttached()) {\r\n            /**\r\n             * Root with provided name does not exist or is already detached.\r\n             *\r\n             * @error writer-detachroot-no-root\r\n             */\r\n            throw new CKEditorError('writer-detachroot-no-root', this);\r\n        }\r\n        // First, remove all markers from the root. It is better to do it before removing stuff for undo purposes.\r\n        // However, looking through all the markers may not be the best performance wise. But there's no better solution for now.\r\n        for (const marker of this.model.markers) {\r\n            if (marker.getRange().root === root) {\r\n                this.removeMarker(marker);\r\n            }\r\n        }\r\n        // Remove all attributes from the root.\r\n        for (const key of root.getAttributeKeys()) {\r\n            this.removeAttribute(key, root);\r\n        }\r\n        // Remove all contents of the root.\r\n        this.remove(this.createRangeIn(root));\r\n        // Finally, detach the root.\r\n        const document = this.model.document;\r\n        const operation = new RootOperation(root.rootName, root.name, false, document, document.version);\r\n        this.batch.addOperation(operation);\r\n        this.model.applyOperation(operation);\r\n    }\r\n    setSelection(...args) {\r\n        this._assertWriterUsedCorrectly();\r\n        this.model.document.selection._setTo(...args);\r\n    }\r\n    /**\r\n     * Moves {@link module:engine/model/documentselection~DocumentSelection#focus} to the specified location.\r\n     *\r\n     * The location can be specified in the same form as\r\n     * {@link #createPositionAt `writer.createPositionAt()`} parameters.\r\n     *\r\n     * @param itemOrPosition\r\n     * @param offset Offset or one of the flags. Used only when first parameter is a {@link module:engine/model/item~Item model item}.\r\n     */\r\n    setSelectionFocus(itemOrPosition, offset) {\r\n        this._assertWriterUsedCorrectly();\r\n        this.model.document.selection._setFocus(itemOrPosition, offset);\r\n    }\r\n    setSelectionAttribute(keyOrObjectOrIterable, value) {\r\n        this._assertWriterUsedCorrectly();\r\n        if (typeof keyOrObjectOrIterable === 'string') {\r\n            this._setSelectionAttribute(keyOrObjectOrIterable, value);\r\n        }\r\n        else {\r\n            for (const [key, value] of toMap(keyOrObjectOrIterable)) {\r\n                this._setSelectionAttribute(key, value);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Removes attribute(s) with given key(s) from the selection.\r\n     *\r\n     * Remove one attribute:\r\n     *\r\n     * ```ts\r\n     * writer.removeSelectionAttribute( 'italic' );\r\n     * ```\r\n     *\r\n     * Remove multiple attributes:\r\n     *\r\n     * ```ts\r\n     * writer.removeSelectionAttribute( [ 'italic', 'bold' ] );\r\n     * ```\r\n     *\r\n     * @param keyOrIterableOfKeys Key of the attribute to remove or an iterable of attribute keys to remove.\r\n     */\r\n    removeSelectionAttribute(keyOrIterableOfKeys) {\r\n        this._assertWriterUsedCorrectly();\r\n        if (typeof keyOrIterableOfKeys === 'string') {\r\n            this._removeSelectionAttribute(keyOrIterableOfKeys);\r\n        }\r\n        else {\r\n            for (const key of keyOrIterableOfKeys) {\r\n                this._removeSelectionAttribute(key);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Temporarily changes the {@link module:engine/model/documentselection~DocumentSelection#isGravityOverridden gravity}\r\n     * of the selection from left to right.\r\n     *\r\n     * The gravity defines from which direction the selection inherits its attributes. If it's the default left gravity,\r\n     * then the selection (after being moved by the user) inherits attributes from its left-hand side.\r\n     * This method allows to temporarily override this behavior by forcing the gravity to the right.\r\n     *\r\n     * For the following model fragment:\r\n     *\r\n     * ```xml\r\n     * <$text bold=\"true\" linkHref=\"url\">bar[]</$text><$text bold=\"true\">biz</$text>\r\n     * ```\r\n     *\r\n     * * Default gravity: selection will have the `bold` and `linkHref` attributes.\r\n     * * Overridden gravity: selection will have `bold` attribute.\r\n     *\r\n     * **Note**: It returns an unique identifier which is required to restore the gravity. It guarantees the symmetry\r\n     * of the process.\r\n     *\r\n     * @returns The unique id which allows restoring the gravity.\r\n     */\r\n    overrideSelectionGravity() {\r\n        return this.model.document.selection._overrideGravity();\r\n    }\r\n    /**\r\n     * Restores {@link ~Writer#overrideSelectionGravity} gravity to default.\r\n     *\r\n     * Restoring the gravity is only possible using the unique identifier returned by\r\n     * {@link ~Writer#overrideSelectionGravity}. Note that the gravity remains overridden as long as won't be restored\r\n     * the same number of times it was overridden.\r\n     *\r\n     * @param uid The unique id returned by {@link ~Writer#overrideSelectionGravity}.\r\n     */\r\n    restoreSelectionGravity(uid) {\r\n        this.model.document.selection._restoreGravity(uid);\r\n    }\r\n    /**\r\n     * @param key Key of the attribute to remove.\r\n     * @param value Attribute value.\r\n     */\r\n    _setSelectionAttribute(key, value) {\r\n        const selection = this.model.document.selection;\r\n        // Store attribute in parent element if the selection is collapsed in an empty node.\r\n        if (selection.isCollapsed && selection.anchor.parent.isEmpty) {\r\n            const storeKey = DocumentSelection._getStoreAttributeKey(key);\r\n            this.setAttribute(storeKey, value, selection.anchor.parent);\r\n        }\r\n        selection._setAttribute(key, value);\r\n    }\r\n    /**\r\n     * @param key Key of the attribute to remove.\r\n     */\r\n    _removeSelectionAttribute(key) {\r\n        const selection = this.model.document.selection;\r\n        // Remove stored attribute from parent element if the selection is collapsed in an empty node.\r\n        if (selection.isCollapsed && selection.anchor.parent.isEmpty) {\r\n            const storeKey = DocumentSelection._getStoreAttributeKey(key);\r\n            this.removeAttribute(storeKey, selection.anchor.parent);\r\n        }\r\n        selection._removeAttribute(key);\r\n    }\r\n    /**\r\n     * Throws `writer-detached-writer-tries-to-modify-model` error when the writer is used outside of the `change()` block.\r\n     */\r\n    _assertWriterUsedCorrectly() {\r\n        /**\r\n         * Trying to use a writer outside a {@link module:engine/model/model~Model#change `change()`} or\r\n         * {@link module:engine/model/model~Model#enqueueChange `enqueueChange()`} blocks.\r\n         *\r\n         * The writer can only be used inside these blocks which ensures that the model\r\n         * can only be changed during such \"sessions\".\r\n         *\r\n         * @error writer-incorrect-use\r\n         */\r\n        if (this.model._currentWriter !== this) {\r\n            throw new CKEditorError('writer-incorrect-use', this);\r\n        }\r\n    }\r\n    /**\r\n     * For given action `type` and `positionOrRange` where the action happens, this function finds all affected markers\r\n     * and applies a marker operation with the new marker range equal to the current range. Thanks to this, the marker range\r\n     * can be later correctly processed during undo.\r\n     *\r\n     * @param type Writer action type.\r\n     * @param positionOrRange Position or range where the writer action happens.\r\n     */\r\n    _addOperationForAffectedMarkers(type, positionOrRange) {\r\n        for (const marker of this.model.markers) {\r\n            if (!marker.managedUsingOperations) {\r\n                continue;\r\n            }\r\n            const markerRange = marker.getRange();\r\n            let isAffected = false;\r\n            if (type === 'move') {\r\n                const range = positionOrRange;\r\n                isAffected =\r\n                    range.containsPosition(markerRange.start) ||\r\n                        range.start.isEqual(markerRange.start) ||\r\n                        range.containsPosition(markerRange.end) ||\r\n                        range.end.isEqual(markerRange.end);\r\n            }\r\n            else {\r\n                // if type === 'merge'.\r\n                const position = positionOrRange;\r\n                const elementBefore = position.nodeBefore;\r\n                const elementAfter = position.nodeAfter;\r\n                //               Start:  <p>Foo[</p><p>Bar]</p>\r\n                //         After merge:  <p>Foo[Bar]</p>\r\n                // After undoing split:  <p>Foo</p><p>[Bar]</p>     <-- incorrect, needs remembering for undo.\r\n                //\r\n                const affectedInLeftElement = markerRange.start.parent == elementBefore && markerRange.start.isAtEnd;\r\n                //               Start:  <p>[Foo</p><p>]Bar</p>\r\n                //         After merge:  <p>[Foo]Bar</p>\r\n                // After undoing split:  <p>[Foo]</p><p>Bar</p>     <-- incorrect, needs remembering for undo.\r\n                //\r\n                const affectedInRightElement = markerRange.end.parent == elementAfter && markerRange.end.offset == 0;\r\n                //               Start:  <p>[Foo</p>]<p>Bar</p>\r\n                //         After merge:  <p>[Foo]Bar</p>\r\n                // After undoing split:  <p>[Foo]</p><p>Bar</p>     <-- incorrect, needs remembering for undo.\r\n                //\r\n                const affectedAfterLeftElement = markerRange.end.nodeAfter == elementAfter;\r\n                //               Start:  <p>Foo</p>[<p>Bar]</p>\r\n                //         After merge:  <p>Foo[Bar]</p>\r\n                // After undoing split:  <p>Foo</p><p>[Bar]</p>     <-- incorrect, needs remembering for undo.\r\n                //\r\n                const affectedBeforeRightElement = markerRange.start.nodeAfter == elementAfter;\r\n                isAffected = affectedInLeftElement || affectedInRightElement || affectedAfterLeftElement || affectedBeforeRightElement;\r\n            }\r\n            if (isAffected) {\r\n                this.updateMarker(marker.name, { range: markerRange });\r\n            }\r\n        }\r\n    }\r\n}\r\n/**\r\n * Sets given attribute to each node in given range. When attribute value is null then attribute will be removed.\r\n *\r\n * Because attribute operation needs to have the same attribute value on the whole range, this function splits\r\n * the range into smaller parts.\r\n *\r\n * Given `range` must be flat.\r\n */\r\nfunction setAttributeOnRange(writer, key, value, range) {\r\n    const model = writer.model;\r\n    const doc = model.document;\r\n    // Position of the last split, the beginning of the new range.\r\n    let lastSplitPosition = range.start;\r\n    // Currently position in the scanning range. Because we need value after the position, it is not a current\r\n    // position of the iterator but the previous one (we need to iterate one more time to get the value after).\r\n    let position;\r\n    // Value before the currently position.\r\n    let valueBefore;\r\n    // Value after the currently position.\r\n    let valueAfter;\r\n    for (const val of range.getWalker({ shallow: true })) {\r\n        valueAfter = val.item.getAttribute(key);\r\n        // At the first run of the iterator the position in undefined. We also do not have a valueBefore, but\r\n        // because valueAfter may be null, valueBefore may be equal valueAfter ( undefined == null ).\r\n        if (position && valueBefore != valueAfter) {\r\n            // if valueBefore == value there is nothing to change, so we add operation only if these values are different.\r\n            if (valueBefore != value) {\r\n                addOperation();\r\n            }\r\n            lastSplitPosition = position;\r\n        }\r\n        position = val.nextPosition;\r\n        valueBefore = valueAfter;\r\n    }\r\n    // Because position in the loop is not the iterator position (see let position comment), the last position in\r\n    // the while loop will be last but one position in the range. We need to check the last position manually.\r\n    if (position instanceof Position && position != lastSplitPosition && valueBefore != value) {\r\n        addOperation();\r\n    }\r\n    function addOperation() {\r\n        const range = new Range(lastSplitPosition, position);\r\n        const version = range.root.document ? doc.version : null;\r\n        const operation = new AttributeOperation(range, key, valueBefore, value, version);\r\n        writer.batch.addOperation(operation);\r\n        model.applyOperation(operation);\r\n    }\r\n}\r\n/**\r\n * Sets given attribute to the given node. When attribute value is null then attribute will be removed.\r\n */\r\nfunction setAttributeOnItem(writer, key, value, item) {\r\n    const model = writer.model;\r\n    const doc = model.document;\r\n    const previousValue = item.getAttribute(key);\r\n    let range, operation;\r\n    if (previousValue != value) {\r\n        const isRootChanged = item.root === item;\r\n        if (isRootChanged) {\r\n            // If we change attributes of root element, we have to use `RootAttributeOperation`.\r\n            const version = item.document ? doc.version : null;\r\n            operation = new RootAttributeOperation(item, key, previousValue, value, version);\r\n        }\r\n        else {\r\n            range = new Range(Position._createBefore(item), writer.createPositionAfter(item));\r\n            const version = range.root.document ? doc.version : null;\r\n            operation = new AttributeOperation(range, key, previousValue, value, version);\r\n        }\r\n        writer.batch.addOperation(operation);\r\n        model.applyOperation(operation);\r\n    }\r\n}\r\n/**\r\n * Creates and applies marker operation to {@link module:engine/model/operation/operation~Operation operation}.\r\n */\r\nfunction applyMarkerOperation(writer, name, oldRange, newRange, affectsData) {\r\n    const model = writer.model;\r\n    const doc = model.document;\r\n    const operation = new MarkerOperation(name, oldRange, newRange, model.markers, !!affectsData, doc.version);\r\n    writer.batch.addOperation(operation);\r\n    model.applyOperation(operation);\r\n}\r\n/**\r\n * Creates `MoveOperation` or `DetachOperation` that removes `howMany` nodes starting from `position`.\r\n * The operation will be applied on given model instance and added to given operation instance.\r\n *\r\n * @param position Position from which nodes are removed.\r\n * @param howMany Number of nodes to remove.\r\n * @param batch Batch to which the operation will be added.\r\n * @param model Model instance on which operation will be applied.\r\n */\r\nfunction applyRemoveOperation(position, howMany, batch, model) {\r\n    let operation;\r\n    if (position.root.document) {\r\n        const doc = model.document;\r\n        const graveyardPosition = new Position(doc.graveyard, [0]);\r\n        operation = new MoveOperation(position, howMany, graveyardPosition, doc.version);\r\n    }\r\n    else {\r\n        operation = new DetachOperation(position, howMany);\r\n    }\r\n    batch.addOperation(operation);\r\n    model.applyOperation(operation);\r\n}\r\n/**\r\n * Returns `true` if both root elements are the same element or both are documents root elements.\r\n *\r\n * Elements in the same tree can be moved (for instance you can move element form one documents root to another, or\r\n * within the same document fragment), but when element supposed to be moved from document fragment to the document, or\r\n * to another document it should be removed and inserted to avoid problems with OT. This is because features like undo or\r\n * collaboration may track changes on the document but ignore changes on detached fragments and should not get\r\n * unexpected `move` operation.\r\n */\r\nfunction isSameTree(rootA, rootB) {\r\n    // If it is the same root this is the same tree.\r\n    if (rootA === rootB) {\r\n        return true;\r\n    }\r\n    // If both roots are documents root it is operation within the document what we still treat as the same tree.\r\n    if (rootA instanceof RootElement && rootB instanceof RootElement) {\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/utils/deletecontent\r\n */\r\nimport DocumentSelection from '../documentselection';\r\nimport LivePosition from '../liveposition';\r\nimport Range from '../range';\r\n/**\r\n * Deletes content of the selection and merge siblings. The resulting selection is always collapsed.\r\n *\r\n * **Note:** Use {@link module:engine/model/model~Model#deleteContent} instead of this function.\r\n * This function is only exposed to be reusable in algorithms\r\n * which change the {@link module:engine/model/model~Model#deleteContent}\r\n * method's behavior.\r\n *\r\n * @param model The model in context of which the insertion should be performed.\r\n * @param selection Selection of which the content should be deleted.\r\n * @param options.leaveUnmerged Whether to merge elements after removing the content of the selection.\r\n *\r\n * For example `<heading>x[x</heading><paragraph>y]y</paragraph>` will become:\r\n *\r\n * * `<heading>x^y</heading>` with the option disabled (`leaveUnmerged == false`)\r\n * * `<heading>x^</heading><paragraph>y</paragraph>` with enabled (`leaveUnmerged == true`).\r\n *\r\n * Note: {@link module:engine/model/schema~Schema#isObject object} and {@link module:engine/model/schema~Schema#isLimit limit}\r\n * elements will not be merged.\r\n *\r\n * @param options.doNotResetEntireContent Whether to skip replacing the entire content with a\r\n * paragraph when the entire content was selected.\r\n *\r\n * For example `<heading>[x</heading><paragraph>y]</paragraph>` will become:\r\n *\r\n * * `<paragraph>^</paragraph>` with the option disabled (`doNotResetEntireContent == false`)\r\n * * `<heading>^</heading>` with enabled (`doNotResetEntireContent == true`).\r\n *\r\n * @param options.doNotAutoparagraph Whether to create a paragraph if after content deletion selection is moved\r\n * to a place where text cannot be inserted.\r\n *\r\n * For example `<paragraph>x</paragraph>[<imageBlock src=\"foo.jpg\"></imageBlock>]` will become:\r\n *\r\n * * `<paragraph>x</paragraph><paragraph>[]</paragraph>` with the option disabled (`doNotAutoparagraph == false`)\r\n * * `<paragraph>x</paragraph>[]` with the option enabled (`doNotAutoparagraph == true`).\r\n *\r\n * If you use this option you need to make sure to handle invalid selections yourself or leave\r\n * them to the selection post-fixer (may not always work).\r\n *\r\n * **Note:** If there is no valid position for the selection, the paragraph will always be created:\r\n *\r\n * `[<imageBlock src=\"foo.jpg\"></imageBlock>]` -> `<paragraph>[]</paragraph>`.\r\n */\r\nexport default function deleteContent(model, selection, options = {}) {\r\n    if (selection.isCollapsed) {\r\n        return;\r\n    }\r\n    const selRange = selection.getFirstRange();\r\n    // If the selection is already removed, don't do anything.\r\n    if (selRange.root.rootName == '$graveyard') {\r\n        return;\r\n    }\r\n    const schema = model.schema;\r\n    model.change(writer => {\r\n        // 1. Replace the entire content with paragraph.\r\n        // See: https://github.com/ckeditor/ckeditor5-engine/issues/1012#issuecomment-315017594.\r\n        if (!options.doNotResetEntireContent && shouldEntireContentBeReplacedWithParagraph(schema, selection)) {\r\n            replaceEntireContentWithParagraph(writer, selection);\r\n            return;\r\n        }\r\n        // Collect attributes to copy in case of autoparagraphing.\r\n        const attributesForAutoparagraph = {};\r\n        if (!options.doNotAutoparagraph) {\r\n            const selectedElement = selection.getSelectedElement();\r\n            if (selectedElement) {\r\n                Object.assign(attributesForAutoparagraph, schema.getAttributesWithProperty(selectedElement, 'copyOnReplace', true));\r\n            }\r\n        }\r\n        // Get the live positions for the range adjusted to span only blocks selected from the user perspective.\r\n        const [startPosition, endPosition] = getLivePositionsForSelectedBlocks(selRange);\r\n        // 2. Remove the content if there is any.\r\n        if (!startPosition.isTouching(endPosition)) {\r\n            writer.remove(writer.createRange(startPosition, endPosition));\r\n        }\r\n        // 3. Merge elements in the right branch to the elements in the left branch.\r\n        // The only reasonable (in terms of data and selection correctness) case in which we need to do that is:\r\n        //\r\n        // <heading type=1>Fo[</heading><paragraph>]ar</paragraph> => <heading type=1>Fo^ar</heading>\r\n        //\r\n        // However, the algorithm supports also merging deeper structures (up to the depth of the shallower branch),\r\n        // as it's hard to imagine what should actually be the default behavior. Usually, specific features will\r\n        // want to override that behavior anyway.\r\n        if (!options.leaveUnmerged) {\r\n            mergeBranches(writer, startPosition, endPosition);\r\n            // TMP this will be replaced with a postfixer.\r\n            // We need to check and strip disallowed attributes in all nested nodes because after merge\r\n            // some attributes could end up in a path where are disallowed.\r\n            //\r\n            // e.g. bold is disallowed for <H1>\r\n            // <h1>Fo{o</h1><p>b}a<b>r</b><p> -> <h1>Fo{}a<b>r</b><h1> -> <h1>Fo{}ar<h1>.\r\n            schema.removeDisallowedAttributes(startPosition.parent.getChildren(), writer);\r\n        }\r\n        collapseSelectionAt(writer, selection, startPosition);\r\n        // 4. Add a paragraph to set selection in it.\r\n        // Check if a text is allowed in the new container. If not, try to create a new paragraph (if it's allowed here).\r\n        // If autoparagraphing is off, we assume that you know what you do so we leave the selection wherever it was.\r\n        if (!options.doNotAutoparagraph && shouldAutoparagraph(schema, startPosition)) {\r\n            insertParagraph(writer, startPosition, selection, attributesForAutoparagraph);\r\n        }\r\n        startPosition.detach();\r\n        endPosition.detach();\r\n    });\r\n}\r\n/**\r\n * Returns the live positions for the range adjusted to span only blocks selected from the user perspective. Example:\r\n *\r\n * ```\r\n * <heading1>[foo</heading1>\r\n * <paragraph>bar</paragraph>\r\n * <heading1>]abc</heading1>  <-- this block is not considered as selected\r\n * ```\r\n *\r\n * This is the same behavior as in Selection#getSelectedBlocks() \"special case\".\r\n */\r\nfunction getLivePositionsForSelectedBlocks(range) {\r\n    const model = range.root.document.model;\r\n    const startPosition = range.start;\r\n    let endPosition = range.end;\r\n    // If the end of selection is at the start position of last block in the selection, then\r\n    // shrink it to not include that trailing block. Note that this should happen only for not empty selection.\r\n    if (model.hasContent(range, { ignoreMarkers: true })) {\r\n        const endBlock = getParentBlock(endPosition);\r\n        if (endBlock && endPosition.isTouching(model.createPositionAt(endBlock, 0))) {\r\n            // Create forward selection as a probe to find a valid position after excluding last block from the range.\r\n            const selection = model.createSelection(range);\r\n            // Modify the forward selection in backward direction to shrink it and remove first position of following block from it.\r\n            // This is how modifySelection works and here we are making use of it.\r\n            model.modifySelection(selection, { direction: 'backward' });\r\n            const newEndPosition = selection.getLastPosition();\r\n            // For such a model and selection:\r\n            //     <paragraph>A[</paragraph><imageBlock></imageBlock><paragraph>]B</paragraph>\r\n            //\r\n            // After modifySelection(), we would end up with this:\r\n            //     <paragraph>A[</paragraph>]<imageBlock></imageBlock><paragraph>B</paragraph>\r\n            //\r\n            // So we need to check if there is no content in the skipped range (because we want to include the <imageBlock>).\r\n            const skippedRange = model.createRange(newEndPosition, endPosition);\r\n            if (!model.hasContent(skippedRange, { ignoreMarkers: true })) {\r\n                endPosition = newEndPosition;\r\n            }\r\n        }\r\n    }\r\n    return [\r\n        LivePosition.fromPosition(startPosition, 'toPrevious'),\r\n        LivePosition.fromPosition(endPosition, 'toNext')\r\n    ];\r\n}\r\n/**\r\n * Finds the lowest element in position's ancestors which is a block.\r\n * Returns null if a limit element is encountered before reaching a block element.\r\n */\r\nfunction getParentBlock(position) {\r\n    const element = position.parent;\r\n    const schema = element.root.document.model.schema;\r\n    const ancestors = element.getAncestors({ parentFirst: true, includeSelf: true });\r\n    for (const element of ancestors) {\r\n        if (schema.isLimit(element)) {\r\n            return null;\r\n        }\r\n        if (schema.isBlock(element)) {\r\n            return element;\r\n        }\r\n    }\r\n}\r\n/**\r\n * This function is a result of reaching the Ballmer's peak for just the right amount of time.\r\n * Even I had troubles documenting it after a while and after reading it again I couldn't believe that it really works.\r\n */\r\nfunction mergeBranches(writer, startPosition, endPosition) {\r\n    const model = writer.model;\r\n    // Verify if there is a need and possibility to merge.\r\n    if (!checkShouldMerge(writer.model.schema, startPosition, endPosition)) {\r\n        return;\r\n    }\r\n    // If the start element on the common ancestor level is empty, and the end element on the same level is not empty\r\n    // then merge those to the right element so that it's properties are preserved (name, attributes).\r\n    // Because of OT merging is used instead of removing elements.\r\n    //\r\n    // Merge left:\r\n    //     <heading1>foo[</heading1>    ->  <heading1>foo[]bar</heading1>\r\n    //     <paragraph>]bar</paragraph>  ->               --^\r\n    //\r\n    // Merge right:\r\n    //     <heading1>[</heading1>       ->\r\n    //     <paragraph>]bar</paragraph>  ->  <paragraph>[]bar</paragraph>\r\n    //\r\n    // Merge left:\r\n    //     <blockQuote>                     ->  <blockQuote>\r\n    //         <heading1>foo[</heading1>    ->      <heading1>foo[]bar</heading1>\r\n    //         <paragraph>]bar</paragraph>  ->                   --^\r\n    //     </blockQuote>                    ->  </blockQuote>\r\n    //\r\n    // Merge right:\r\n    //     <blockQuote>                     ->  <blockQuote>\r\n    //         <heading1>[</heading1>       ->\r\n    //         <paragraph>]bar</paragraph>  ->      <paragraph>[]bar</paragraph>\r\n    //     </blockQuote>                    ->  </blockQuote>\r\n    // Merging should not go deeper than common ancestor.\r\n    const [startAncestor, endAncestor] = getAncestorsJustBelowCommonAncestor(startPosition, endPosition);\r\n    // Branches can't be merged if one of the positions is directly inside a common ancestor.\r\n    //\r\n    // Example:\r\n    //     <blockQuote>\r\n    //         <paragraph>[foo</paragraph>]\r\n    //         <table> ... </table>\r\n    //     <blockQuote>\r\n    //\r\n    if (!startAncestor || !endAncestor) {\r\n        return;\r\n    }\r\n    if (!model.hasContent(startAncestor, { ignoreMarkers: true }) && model.hasContent(endAncestor, { ignoreMarkers: true })) {\r\n        mergeBranchesRight(writer, startPosition, endPosition, startAncestor.parent);\r\n    }\r\n    else {\r\n        mergeBranchesLeft(writer, startPosition, endPosition, startAncestor.parent);\r\n    }\r\n}\r\n/**\r\n * Merging blocks to the left (properties of the left block are preserved).\r\n * Simple example:\r\n *\r\n * ```\r\n * <heading1>foo[</heading1>    ->  <heading1>foo[bar</heading1>]\r\n * <paragraph>]bar</paragraph>  ->              --^\r\n * ```\r\n *\r\n * Nested example:\r\n *\r\n * ```\r\n * <blockQuote>                     ->  <blockQuote>\r\n *     <heading1>foo[</heading1>    ->      <heading1>foo[bar</heading1>\r\n * </blockQuote>                    ->  </blockQuote>]    ^\r\n * <blockBlock>                     ->                    |\r\n *     <paragraph>]bar</paragraph>  ->                 ---\r\n * </blockBlock>                    ->\r\n * ```\r\n */\r\nfunction mergeBranchesLeft(writer, startPosition, endPosition, commonAncestor) {\r\n    const startElement = startPosition.parent;\r\n    const endElement = endPosition.parent;\r\n    // Merging reached the common ancestor element, stop here.\r\n    if (startElement == commonAncestor || endElement == commonAncestor) {\r\n        return;\r\n    }\r\n    // Remember next positions to merge in next recursive step (also used as modification points pointers).\r\n    startPosition = writer.createPositionAfter(startElement);\r\n    endPosition = writer.createPositionBefore(endElement);\r\n    // Move endElement just after startElement if they aren't siblings.\r\n    if (!endPosition.isEqual(startPosition)) {\r\n        //\r\n        //     <blockQuote>                     ->  <blockQuote>\r\n        //         <heading1>foo[</heading1>    ->      <heading1>foo</heading1>[<paragraph>bar</paragraph>\r\n        //     </blockQuote>                    ->  </blockQuote>                ^\r\n        //     <blockBlock>                     ->  <blockBlock>                 |\r\n        //         <paragraph>]bar</paragraph>  ->      ]                     ---\r\n        //     </blockBlock>                    ->  </blockBlock>\r\n        //\r\n        writer.insert(endElement, startPosition);\r\n    }\r\n    // Merge two siblings (nodes on sides of startPosition):\r\n    //\r\n    //     <blockQuote>                                             ->  <blockQuote>\r\n    //         <heading1>foo</heading1>[<paragraph>bar</paragraph>  ->      <heading1>foo[bar</heading1>\r\n    //     </blockQuote>                                            ->  </blockQuote>\r\n    //     <blockBlock>                                             ->  <blockBlock>\r\n    //         ]                                                    ->      ]\r\n    //     </blockBlock>                                            ->  </blockBlock>\r\n    //\r\n    // Or in simple case (without moving elements in above if):\r\n    //     <heading1>foo</heading1>[<paragraph>bar</paragraph>]  ->  <heading1>foo[bar</heading1>]\r\n    //\r\n    writer.merge(startPosition);\r\n    // Remove empty end ancestors:\r\n    //\r\n    //     <blockQuote>                      ->  <blockQuote>\r\n    //         <heading1>foo[bar</heading1>  ->      <heading1>foo[bar</heading1>\r\n    //     </blockQuote>                     ->  </blockQuote>\r\n    //     <blockBlock>                      ->\r\n    //         ]                             ->  ]\r\n    //     </blockBlock>                     ->\r\n    //\r\n    while (endPosition.parent.isEmpty) {\r\n        const parentToRemove = endPosition.parent;\r\n        endPosition = writer.createPositionBefore(parentToRemove);\r\n        writer.remove(parentToRemove);\r\n    }\r\n    // Verify if there is a need and possibility to merge next level.\r\n    if (!checkShouldMerge(writer.model.schema, startPosition, endPosition)) {\r\n        return;\r\n    }\r\n    // Continue merging next level (blockQuote with blockBlock in the examples above if it would not be empty and got removed).\r\n    mergeBranchesLeft(writer, startPosition, endPosition, commonAncestor);\r\n}\r\n/**\r\n * Merging blocks to the right (properties of the right block are preserved).\r\n * Simple example:\r\n *\r\n * ```\r\n * <heading1>foo[</heading1>    ->            --v\r\n * <paragraph>]bar</paragraph>  ->  [<paragraph>foo]bar</paragraph>\r\n * ```\r\n *\r\n * Nested example:\r\n *\r\n * ```\r\n * <blockQuote>                     ->\r\n *     <heading1>foo[</heading1>    ->              ---\r\n * </blockQuote>                    ->                 |\r\n * <blockBlock>                     ->  [<blockBlock>  v\r\n *     <paragraph>]bar</paragraph>  ->      <paragraph>foo]bar</paragraph>\r\n * </blockBlock>                    ->  </blockBlock>\r\n * ```\r\n */\r\nfunction mergeBranchesRight(writer, startPosition, endPosition, commonAncestor) {\r\n    const startElement = startPosition.parent;\r\n    const endElement = endPosition.parent;\r\n    // Merging reached the common ancestor element, stop here.\r\n    if (startElement == commonAncestor || endElement == commonAncestor) {\r\n        return;\r\n    }\r\n    // Remember next positions to merge in next recursive step (also used as modification points pointers).\r\n    startPosition = writer.createPositionAfter(startElement);\r\n    endPosition = writer.createPositionBefore(endElement);\r\n    // Move startElement just before endElement if they aren't siblings.\r\n    if (!endPosition.isEqual(startPosition)) {\r\n        //\r\n        //     <blockQuote>                     ->  <blockQuote>\r\n        //         <heading1>foo[</heading1>    ->      [                   ---\r\n        //     </blockQuote>                    ->  </blockQuote>              |\r\n        //     <blockBlock>                     ->  <blockBlock>               v\r\n        //         <paragraph>]bar</paragraph>  ->      <heading1>foo</heading1>]<paragraph>bar</paragraph>\r\n        //     </blockBlock>                    ->  </blockBlock>\r\n        //\r\n        writer.insert(startElement, endPosition);\r\n    }\r\n    // Remove empty end ancestors:\r\n    //\r\n    //     <blockQuote>                                             ->\r\n    //         [                                                    ->  [\r\n    //     </blockQuote>                                            ->\r\n    //     <blockBlock>                                             ->  <blockBlock>\r\n    //         <heading1>foo</heading1>]<paragraph>bar</paragraph>  ->      <heading1>foo</heading1>]<paragraph>bar</paragraph>\r\n    //     </blockBlock>                                            ->  </blockBlock>\r\n    //\r\n    while (startPosition.parent.isEmpty) {\r\n        const parentToRemove = startPosition.parent;\r\n        startPosition = writer.createPositionBefore(parentToRemove);\r\n        writer.remove(parentToRemove);\r\n    }\r\n    // Update endPosition after inserting and removing elements.\r\n    endPosition = writer.createPositionBefore(endElement);\r\n    // Merge right two siblings (nodes on sides of endPosition):\r\n    //                                                              ->\r\n    //     [                                                        ->  [\r\n    //                                                              ->\r\n    //     <blockBlock>                                             ->  <blockBlock>\r\n    //         <heading1>foo</heading1>]<paragraph>bar</paragraph>  ->      <paragraph>foo]bar</paragraph>\r\n    //     </blockBlock>                                            ->  </blockBlock>\r\n    //\r\n    // Or in simple case (without moving elements in above if):\r\n    //     [<heading1>foo</heading1>]<paragraph>bar</paragraph>  ->  [<heading1>foo]bar</heading1>\r\n    //\r\n    mergeRight(writer, endPosition);\r\n    // Verify if there is a need and possibility to merge next level.\r\n    if (!checkShouldMerge(writer.model.schema, startPosition, endPosition)) {\r\n        return;\r\n    }\r\n    // Continue merging next level (blockQuote with blockBlock in the examples above if it would not be empty and got removed).\r\n    mergeBranchesRight(writer, startPosition, endPosition, commonAncestor);\r\n}\r\n/**\r\n * There is no right merge operation so we need to simulate it.\r\n */\r\nfunction mergeRight(writer, position) {\r\n    const startElement = position.nodeBefore;\r\n    const endElement = position.nodeAfter;\r\n    if (startElement.name != endElement.name) {\r\n        writer.rename(startElement, endElement.name);\r\n    }\r\n    writer.clearAttributes(startElement);\r\n    writer.setAttributes(Object.fromEntries(endElement.getAttributes()), startElement);\r\n    writer.merge(position);\r\n}\r\n/**\r\n * Verifies if merging is needed and possible. It's not needed if both positions are in the same element\r\n * and it's not possible if some element is a limit or the range crosses a limit element.\r\n */\r\nfunction checkShouldMerge(schema, startPosition, endPosition) {\r\n    const startElement = startPosition.parent;\r\n    const endElement = endPosition.parent;\r\n    // If both positions ended up in the same parent, then there's nothing more to merge:\r\n    // <$root><p>x[</p><p>]y</p></$root> => <$root><p>xy</p>[]</$root>\r\n    if (startElement == endElement) {\r\n        return false;\r\n    }\r\n    // If one of the positions is a limit element, then there's nothing to merge because we don't want to cross the limit boundaries.\r\n    if (schema.isLimit(startElement) || schema.isLimit(endElement)) {\r\n        return false;\r\n    }\r\n    // Check if operations we'll need to do won't need to cross object or limit boundaries.\r\n    // E.g., we can't merge endElement into startElement in this case:\r\n    // <limit><startElement>x[</startElement></limit><endElement>]</endElement>\r\n    return isCrossingLimitElement(startPosition, endPosition, schema);\r\n}\r\n/**\r\n * Returns the elements that are the ancestors of the provided positions that are direct children of the common ancestor.\r\n */\r\nfunction getAncestorsJustBelowCommonAncestor(positionA, positionB) {\r\n    const ancestorsA = positionA.getAncestors();\r\n    const ancestorsB = positionB.getAncestors();\r\n    let i = 0;\r\n    while (ancestorsA[i] && ancestorsA[i] == ancestorsB[i]) {\r\n        i++;\r\n    }\r\n    return [ancestorsA[i], ancestorsB[i]];\r\n}\r\nfunction shouldAutoparagraph(schema, position) {\r\n    const isTextAllowed = schema.checkChild(position, '$text');\r\n    const isParagraphAllowed = schema.checkChild(position, 'paragraph');\r\n    return !isTextAllowed && isParagraphAllowed;\r\n}\r\n/**\r\n * Check if parents of two positions can be merged by checking if there are no limit/object\r\n * boundaries between those two positions.\r\n *\r\n * E.g. in <bQ><p>x[]</p></bQ><widget><caption>{}</caption></widget>\r\n * we'll check <p>, <bQ>, <widget> and <caption>.\r\n * Usually, widget and caption are marked as objects/limits in the schema, so in this case merging will be blocked.\r\n */\r\nfunction isCrossingLimitElement(leftPos, rightPos, schema) {\r\n    const rangeToCheck = new Range(leftPos, rightPos);\r\n    for (const value of rangeToCheck.getWalker()) {\r\n        if (schema.isLimit(value.item)) {\r\n            return false;\r\n        }\r\n    }\r\n    return true;\r\n}\r\nfunction insertParagraph(writer, position, selection, attributes = {}) {\r\n    const paragraph = writer.createElement('paragraph');\r\n    writer.model.schema.setAllowedAttributes(paragraph, attributes, writer);\r\n    writer.insert(paragraph, position);\r\n    collapseSelectionAt(writer, selection, writer.createPositionAt(paragraph, 0));\r\n}\r\nfunction replaceEntireContentWithParagraph(writer, selection) {\r\n    const limitElement = writer.model.schema.getLimitElement(selection);\r\n    writer.remove(writer.createRangeIn(limitElement));\r\n    insertParagraph(writer, writer.createPositionAt(limitElement, 0), selection);\r\n}\r\n/**\r\n * We want to replace the entire content with a paragraph when:\r\n * * the entire content is selected,\r\n * * selection contains at least two elements,\r\n * * whether the paragraph is allowed in schema in the common ancestor.\r\n */\r\nfunction shouldEntireContentBeReplacedWithParagraph(schema, selection) {\r\n    const limitElement = schema.getLimitElement(selection);\r\n    if (!selection.containsEntireContent(limitElement)) {\r\n        return false;\r\n    }\r\n    const range = selection.getFirstRange();\r\n    if (range.start.parent == range.end.parent) {\r\n        return false;\r\n    }\r\n    return schema.checkChild(limitElement, 'paragraph');\r\n}\r\n/**\r\n * Helper function that sets the selection. Depending whether given `selection` is a document selection or not,\r\n * uses a different method to set it.\r\n */\r\nfunction collapseSelectionAt(writer, selection, positionOrRange) {\r\n    if (selection instanceof DocumentSelection) {\r\n        writer.setSelection(positionOrRange);\r\n    }\r\n    else {\r\n        selection.setTo(positionOrRange);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/utils/getselectedcontent\r\n */\r\n/**\r\n * Gets a clone of the selected content.\r\n *\r\n * For example, for the following selection:\r\n *\r\n * ```html\r\n * <p>x</p><quote><p>y</p><h>fir[st</h></quote><p>se]cond</p><p>z</p>\r\n * ```\r\n *\r\n * It will return a document fragment with such a content:\r\n *\r\n * ```html\r\n * <quote><h>st</h></quote><p>se</p>\r\n * ```\r\n *\r\n * @param model The model in context of which the selection modification should be performed.\r\n * @param selection The selection of which content will be returned.\r\n */\r\nexport default function getSelectedContent(model, selection) {\r\n    return model.change(writer => {\r\n        const frag = writer.createDocumentFragment();\r\n        const range = selection.getFirstRange();\r\n        if (!range || range.isCollapsed) {\r\n            return frag;\r\n        }\r\n        const root = range.start.root;\r\n        const commonPath = range.start.getCommonPath(range.end);\r\n        const commonParent = root.getNodeByPath(commonPath);\r\n        // ## 1st step\r\n        //\r\n        // First, we'll clone a fragment represented by a minimal flat range\r\n        // containing the original range to be cloned.\r\n        // E.g. let's consider such a range:\r\n        //\r\n        // <p>x</p><quote><p>y</p><h>fir[st</h></quote><p>se]cond</p><p>z</p>\r\n        //\r\n        // A minimal flat range containing this one is:\r\n        //\r\n        // <p>x</p>[<quote><p>y</p><h>first</h></quote><p>second</p>]<p>z</p>\r\n        //\r\n        // We can easily clone this structure, preserving e.g. the <quote> element.\r\n        let flatSubtreeRange;\r\n        if (range.start.parent == range.end.parent) {\r\n            // The original range is flat, so take it.\r\n            flatSubtreeRange = range;\r\n        }\r\n        else {\r\n            flatSubtreeRange = writer.createRange(writer.createPositionAt(commonParent, range.start.path[commonPath.length]), writer.createPositionAt(commonParent, range.end.path[commonPath.length] + 1));\r\n        }\r\n        const howMany = flatSubtreeRange.end.offset - flatSubtreeRange.start.offset;\r\n        // Clone the whole contents.\r\n        for (const item of flatSubtreeRange.getItems({ shallow: true })) {\r\n            if (item.is('$textProxy')) {\r\n                writer.appendText(item.data, item.getAttributes(), frag);\r\n            }\r\n            else {\r\n                writer.append(writer.cloneElement(item, true), frag);\r\n            }\r\n        }\r\n        // ## 2nd step\r\n        //\r\n        // If the original range wasn't flat, then we need to remove the excess nodes from the both ends of the cloned fragment.\r\n        //\r\n        // For example, for the range shown in the 1st step comment, we need to remove these pieces:\r\n        //\r\n        // <quote>[<p>y</p>]<h>[fir]st</h></quote><p>se[cond]</p>\r\n        //\r\n        // So this will be the final copied content:\r\n        //\r\n        // <quote><h>st</h></quote><p>se</p>\r\n        //\r\n        // In order to do that, we remove content from these two ranges:\r\n        //\r\n        // [<quote><p>y</p><h>fir]st</h></quote><p>se[cond</p>]\r\n        if (flatSubtreeRange != range) {\r\n            // Find the position of the original range in the cloned fragment.\r\n            const newRange = range._getTransformedByMove(flatSubtreeRange.start, writer.createPositionAt(frag, 0), howMany)[0];\r\n            const leftExcessRange = writer.createRange(writer.createPositionAt(frag, 0), newRange.start);\r\n            const rightExcessRange = writer.createRange(newRange.end, writer.createPositionAt(frag, 'end'));\r\n            removeRangeContent(rightExcessRange, writer);\r\n            removeRangeContent(leftExcessRange, writer);\r\n        }\r\n        return frag;\r\n    });\r\n}\r\n// After https://github.com/ckeditor/ckeditor5-engine/issues/690 is fixed,\r\n// this function will, most likely, be able to rewritten using getMinimalFlatRanges().\r\nfunction removeRangeContent(range, writer) {\r\n    const parentsToCheck = [];\r\n    Array.from(range.getItems({ direction: 'backward' }))\r\n        // We should better store ranges because text proxies will lose integrity\r\n        // with the text nodes when we'll start removing content.\r\n        .map(item => writer.createRangeOn(item))\r\n        // Filter only these items which are fully contained in the passed range.\r\n        //\r\n        // E.g. for the following range: [<quote><p>y</p><h>fir]st</h>\r\n        // the walker will return the entire <h> element, when only the \"fir\" item inside it is fully contained.\r\n        .filter(itemRange => {\r\n        // We should be able to use Range.containsRange, but https://github.com/ckeditor/ckeditor5-engine/issues/691.\r\n        const contained = (itemRange.start.isAfter(range.start) || itemRange.start.isEqual(range.start)) &&\r\n            (itemRange.end.isBefore(range.end) || itemRange.end.isEqual(range.end));\r\n        return contained;\r\n    })\r\n        .forEach(itemRange => {\r\n        parentsToCheck.push(itemRange.start.parent);\r\n        writer.remove(itemRange);\r\n    });\r\n    // Remove ancestors of the removed items if they turned to be empty now\r\n    // (their whole content was contained in the range).\r\n    parentsToCheck.forEach(parentToCheck => {\r\n        let parent = parentToCheck;\r\n        while (parent.parent && parent.isEmpty) {\r\n            const removeRange = writer.createRangeOn(parent);\r\n            parent = parent.parent;\r\n            writer.remove(removeRange);\r\n        }\r\n    });\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/utils/insertcontent\r\n */\r\nimport DocumentSelection from '../documentselection';\r\nimport Element from '../element';\r\nimport LivePosition from '../liveposition';\r\nimport LiveRange from '../liverange';\r\nimport Position from '../position';\r\nimport Range from '../range';\r\nimport { CKEditorError } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Inserts content into the editor (specified selection) as one would expect the paste functionality to work.\r\n *\r\n * It takes care of removing the selected content, splitting elements (if needed), inserting elements and merging elements appropriately.\r\n *\r\n * Some examples:\r\n *\r\n * ```html\r\n * <p>x^</p> + <p>y</p> => <p>x</p><p>y</p> => <p>xy[]</p>\r\n * <p>x^y</p> + <p>z</p> => <p>x</p>^<p>y</p> + <p>z</p> => <p>x</p><p>z</p><p>y</p> => <p>xz[]y</p>\r\n * <p>x^y</p> + <img /> => <p>x</p>^<p>y</p> + <img /> => <p>x</p><img /><p>y</p>\r\n * <p>x</p><p>^</p><p>z</p> + <p>y</p> => <p>x</p><p>y[]</p><p>z</p> (no merging)\r\n * <p>x</p>[<img />]<p>z</p> + <p>y</p> => <p>x</p>^<p>z</p> + <p>y</p> => <p>x</p><p>y[]</p><p>z</p>\r\n * ```\r\n *\r\n * If an instance of {@link module:engine/model/selection~Selection} is passed as `selectable` it will be modified\r\n * to the insertion selection (equal to a range to be selected after insertion).\r\n *\r\n * If `selectable` is not passed, the content will be inserted using the current selection of the model document.\r\n *\r\n * **Note:** Use {@link module:engine/model/model~Model#insertContent} instead of this function.\r\n * This function is only exposed to be reusable in algorithms which change the {@link module:engine/model/model~Model#insertContent}\r\n * method's behavior.\r\n *\r\n * @param model The model in context of which the insertion should be performed.\r\n * @param content The content to insert.\r\n * @param selectable Selection into which the content should be inserted.\r\n * @param placeOrOffset Sets place or offset of the selection.\r\n * @returns Range which contains all the performed changes. This is a range that, if removed,\r\n * would return the model to the state before the insertion. If no changes were preformed by `insertContent`, returns a range collapsed\r\n * at the insertion position.\r\n */\r\nexport default function insertContent(model, content, selectable) {\r\n    return model.change(writer => {\r\n        const selection = selectable ? selectable : model.document.selection;\r\n        if (!selection.isCollapsed) {\r\n            model.deleteContent(selection, { doNotAutoparagraph: true });\r\n        }\r\n        const insertion = new Insertion(model, writer, selection.anchor);\r\n        const fakeMarkerElements = [];\r\n        let nodesToInsert;\r\n        if (content.is('documentFragment')) {\r\n            // If document fragment has any markers, these markers should be inserted into the model as well.\r\n            if (content.markers.size) {\r\n                const markersPosition = [];\r\n                for (const [name, range] of content.markers) {\r\n                    const { start, end } = range;\r\n                    const isCollapsed = start.isEqual(end);\r\n                    markersPosition.push({ position: start, name, isCollapsed }, { position: end, name, isCollapsed });\r\n                }\r\n                // Markers position is sorted backwards to ensure that the insertion of fake markers will not change\r\n                // the position of the next markers.\r\n                markersPosition.sort(({ position: posA }, { position: posB }) => posA.isBefore(posB) ? 1 : -1);\r\n                for (const { position, name, isCollapsed } of markersPosition) {\r\n                    let fakeElement = null;\r\n                    let collapsed = null;\r\n                    const isAtBeginning = position.parent === content && position.isAtStart;\r\n                    const isAtEnd = position.parent === content && position.isAtEnd;\r\n                    // We have two ways of handling markers. In general, we want to add temporary <$marker> model elements to\r\n                    // represent marker boundaries. These elements will be inserted into content together with the rest\r\n                    // of the document fragment. After insertion is done, positions for these elements will be read\r\n                    // and proper, actual markers will be created in the model and fake elements will be removed.\r\n                    //\r\n                    // However, if the <$marker> element is at the beginning or at the end of the document fragment,\r\n                    // it may affect how the inserted content is merged with current model, impacting the insertion\r\n                    // result. To avoid that, we don't add <$marker> elements at these positions. Instead, we will use\r\n                    // `Insertion#getAffectedRange()` to figure out new positions for these marker boundaries.\r\n                    if (!isAtBeginning && !isAtEnd) {\r\n                        fakeElement = writer.createElement('$marker');\r\n                        writer.insert(fakeElement, position);\r\n                    }\r\n                    else if (isCollapsed) {\r\n                        // Save whether the collapsed marker was at the beginning or at the end of document fragment\r\n                        // to know where to create it after the insertion is done.\r\n                        collapsed = isAtBeginning ? 'start' : 'end';\r\n                    }\r\n                    fakeMarkerElements.push({\r\n                        name,\r\n                        element: fakeElement,\r\n                        collapsed\r\n                    });\r\n                }\r\n            }\r\n            nodesToInsert = content.getChildren();\r\n        }\r\n        else {\r\n            nodesToInsert = [content];\r\n        }\r\n        insertion.handleNodes(nodesToInsert);\r\n        let newRange = insertion.getSelectionRange();\r\n        if (content.is('documentFragment') && fakeMarkerElements.length) {\r\n            // After insertion was done, the selection was set but the model contains fake <$marker> elements.\r\n            // These <$marker> elements will be now removed. Because of that, we will need to fix the selection.\r\n            // We will create a live range that will automatically be update as <$marker> elements are removed.\r\n            const selectionLiveRange = newRange ? LiveRange.fromRange(newRange) : null;\r\n            // Marker name -> [ start position, end position ].\r\n            const markersData = {};\r\n            // Note: `fakeMarkerElements` are sorted backwards. However, now, we want to handle the markers\r\n            // from the beginning, so that existing <$marker> elements do not affect markers positions.\r\n            // This is why we iterate from the end to the start.\r\n            for (let i = fakeMarkerElements.length - 1; i >= 0; i--) {\r\n                const { name, element, collapsed } = fakeMarkerElements[i];\r\n                const isStartBoundary = !markersData[name];\r\n                if (isStartBoundary) {\r\n                    markersData[name] = [];\r\n                }\r\n                if (element) {\r\n                    // Read fake marker element position to learn where the marker should be created.\r\n                    const elementPosition = writer.createPositionAt(element, 'before');\r\n                    markersData[name].push(elementPosition);\r\n                    writer.remove(element);\r\n                }\r\n                else {\r\n                    // If the fake marker element does not exist, it means that the marker boundary was at the beginning or at the end.\r\n                    const rangeOnInsertion = insertion.getAffectedRange();\r\n                    if (!rangeOnInsertion) {\r\n                        // If affected range is `null` it means that nothing was in the document fragment or all content was filtered out.\r\n                        // Some markers that were in the filtered content may be removed (partially or totally).\r\n                        // Let's handle only those markers that were at the beginning or at the end of the document fragment.\r\n                        if (collapsed) {\r\n                            markersData[name].push(insertion.position);\r\n                        }\r\n                        continue;\r\n                    }\r\n                    if (collapsed) {\r\n                        // If the marker was collapsed at the beginning or at the end of the document fragment,\r\n                        // put both boundaries at the beginning or at the end of inserted range (to keep the marker collapsed).\r\n                        markersData[name].push(rangeOnInsertion[collapsed]);\r\n                    }\r\n                    else {\r\n                        markersData[name].push(isStartBoundary ? rangeOnInsertion.start : rangeOnInsertion.end);\r\n                    }\r\n                }\r\n            }\r\n            for (const [name, [start, end]] of Object.entries(markersData)) {\r\n                // For now, we ignore markers if they are included in the filtered-out content.\r\n                // In the future implementation we will improve that case to create markers that are not filtered out completely.\r\n                if (start && end && start.root === end.root) {\r\n                    writer.addMarker(name, {\r\n                        usingOperation: true,\r\n                        affectsData: true,\r\n                        range: new Range(start, end)\r\n                    });\r\n                }\r\n            }\r\n            if (selectionLiveRange) {\r\n                newRange = selectionLiveRange.toRange();\r\n                selectionLiveRange.detach();\r\n            }\r\n        }\r\n        /* istanbul ignore else -- @preserve */\r\n        if (newRange) {\r\n            if (selection instanceof DocumentSelection) {\r\n                writer.setSelection(newRange);\r\n            }\r\n            else {\r\n                selection.setTo(newRange);\r\n            }\r\n        }\r\n        else {\r\n            // We are not testing else because it's a safe check for unpredictable edge cases:\r\n            // an insertion without proper range to select.\r\n            //\r\n            // @if CK_DEBUG // console.warn( 'Cannot determine a proper selection range after insertion.' );\r\n        }\r\n        const affectedRange = insertion.getAffectedRange() || model.createRange(selection.anchor);\r\n        insertion.destroy();\r\n        return affectedRange;\r\n    });\r\n}\r\n/**\r\n * Utility class for performing content insertion.\r\n */\r\nclass Insertion {\r\n    constructor(model, writer, position) {\r\n        /**\r\n         * The reference to the first inserted node.\r\n         */\r\n        this._firstNode = null;\r\n        /**\r\n         * The reference to the last inserted node.\r\n         */\r\n        this._lastNode = null;\r\n        /**\r\n         * The reference to the last auto paragraph node.\r\n         */\r\n        this._lastAutoParagraph = null;\r\n        /**\r\n         * The array of nodes that should be cleaned of not allowed attributes.\r\n         */\r\n        this._filterAttributesOf = [];\r\n        /**\r\n         * Beginning of the affected range. See {@link module:engine/model/utils/insertcontent~Insertion#getAffectedRange}.\r\n         */\r\n        this._affectedStart = null;\r\n        /**\r\n         * End of the affected range. See {@link module:engine/model/utils/insertcontent~Insertion#getAffectedRange}.\r\n         */\r\n        this._affectedEnd = null;\r\n        this._nodeToSelect = null;\r\n        this.model = model;\r\n        this.writer = writer;\r\n        this.position = position;\r\n        this.canMergeWith = new Set([this.position.parent]);\r\n        this.schema = model.schema;\r\n        this._documentFragment = writer.createDocumentFragment();\r\n        this._documentFragmentPosition = writer.createPositionAt(this._documentFragment, 0);\r\n    }\r\n    /**\r\n     * Handles insertion of a set of nodes.\r\n     *\r\n     * @param nodes Nodes to insert.\r\n     */\r\n    handleNodes(nodes) {\r\n        for (const node of Array.from(nodes)) {\r\n            this._handleNode(node);\r\n        }\r\n        // Insert nodes collected in temporary DocumentFragment.\r\n        this._insertPartialFragment();\r\n        // If there was an auto paragraph then we might need to adjust the end of insertion.\r\n        if (this._lastAutoParagraph) {\r\n            this._updateLastNodeFromAutoParagraph(this._lastAutoParagraph);\r\n        }\r\n        // After the content was inserted we may try to merge it with its next sibling if the selection was in it initially.\r\n        // Merging with the previous sibling was performed just after inserting the first node to the document.\r\n        this._mergeOnRight();\r\n        // TMP this will become a post-fixer.\r\n        this.schema.removeDisallowedAttributes(this._filterAttributesOf, this.writer);\r\n        this._filterAttributesOf = [];\r\n    }\r\n    /**\r\n     * Updates the last node after the auto paragraphing.\r\n     *\r\n     * @param node The last auto paragraphing node.\r\n     */\r\n    _updateLastNodeFromAutoParagraph(node) {\r\n        const positionAfterLastNode = this.writer.createPositionAfter(this._lastNode);\r\n        const positionAfterNode = this.writer.createPositionAfter(node);\r\n        // If the real end was after the last auto paragraph then update relevant properties.\r\n        if (positionAfterNode.isAfter(positionAfterLastNode)) {\r\n            this._lastNode = node;\r\n            /* istanbul ignore if -- @preserve */\r\n            if (this.position.parent != node || !this.position.isAtEnd) {\r\n                // Algorithm's correctness check. We should never end up here but it's good to know that we did.\r\n                // At this point the insertion position should be at the end of the last auto paragraph.\r\n                // Note: This error is documented in other place in this file.\r\n                throw new CKEditorError('insertcontent-invalid-insertion-position', this);\r\n            }\r\n            this.position = positionAfterNode;\r\n            this._setAffectedBoundaries(this.position);\r\n        }\r\n    }\r\n    /**\r\n     * Returns range to be selected after insertion.\r\n     * Returns `null` if there is no valid range to select after insertion.\r\n     */\r\n    getSelectionRange() {\r\n        if (this._nodeToSelect) {\r\n            return Range._createOn(this._nodeToSelect);\r\n        }\r\n        return this.model.schema.getNearestSelectionRange(this.position);\r\n    }\r\n    /**\r\n     * Returns a range which contains all the performed changes. This is a range that, if removed, would return the model to the state\r\n     * before the insertion. Returns `null` if no changes were done.\r\n     */\r\n    getAffectedRange() {\r\n        if (!this._affectedStart) {\r\n            return null;\r\n        }\r\n        return new Range(this._affectedStart, this._affectedEnd);\r\n    }\r\n    /**\r\n     * Destroys `Insertion` instance.\r\n     */\r\n    destroy() {\r\n        if (this._affectedStart) {\r\n            this._affectedStart.detach();\r\n        }\r\n        if (this._affectedEnd) {\r\n            this._affectedEnd.detach();\r\n        }\r\n    }\r\n    /**\r\n     * Handles insertion of a single node.\r\n     */\r\n    _handleNode(node) {\r\n        // Let's handle object in a special way.\r\n        // * They should never be merged with other elements.\r\n        // * If they are not allowed in any of the selection ancestors, they could be either autoparagraphed or totally removed.\r\n        if (this.schema.isObject(node)) {\r\n            this._handleObject(node);\r\n            return;\r\n        }\r\n        // Try to find a place for the given node.\r\n        // Check if a node can be inserted in the given position or it would be accepted if a paragraph would be inserted.\r\n        // Inserts the auto paragraph if it would allow for insertion.\r\n        let isAllowed = this._checkAndAutoParagraphToAllowedPosition(node);\r\n        if (!isAllowed) {\r\n            // Split the position.parent's branch up to a point where the node can be inserted.\r\n            // If it isn't allowed in the whole branch, then of course don't split anything.\r\n            isAllowed = this._checkAndSplitToAllowedPosition(node);\r\n            if (!isAllowed) {\r\n                this._handleDisallowedNode(node);\r\n                return;\r\n            }\r\n        }\r\n        // Add node to the current temporary DocumentFragment.\r\n        this._appendToFragment(node);\r\n        // Store the first and last nodes for easy access for merging with sibling nodes.\r\n        if (!this._firstNode) {\r\n            this._firstNode = node;\r\n        }\r\n        this._lastNode = node;\r\n    }\r\n    /**\r\n     * Inserts the temporary DocumentFragment into the model.\r\n     */\r\n    _insertPartialFragment() {\r\n        if (this._documentFragment.isEmpty) {\r\n            return;\r\n        }\r\n        const livePosition = LivePosition.fromPosition(this.position, 'toNext');\r\n        this._setAffectedBoundaries(this.position);\r\n        // If the very first node of the whole insertion process is inserted, insert it separately for OT reasons (undo).\r\n        // Note: there can be multiple calls to `_insertPartialFragment()` during one insertion process.\r\n        // Note: only the very first node can be merged so we have to do separate operation only for it.\r\n        if (this._documentFragment.getChild(0) == this._firstNode) {\r\n            this.writer.insert(this._firstNode, this.position);\r\n            // We must merge the first node just after inserting it to avoid problems with OT.\r\n            // (See: https://github.com/ckeditor/ckeditor5/pull/8773#issuecomment-760945652).\r\n            this._mergeOnLeft();\r\n            this.position = livePosition.toPosition();\r\n        }\r\n        // Insert the remaining nodes from document fragment.\r\n        if (!this._documentFragment.isEmpty) {\r\n            this.writer.insert(this._documentFragment, this.position);\r\n        }\r\n        this._documentFragmentPosition = this.writer.createPositionAt(this._documentFragment, 0);\r\n        this.position = livePosition.toPosition();\r\n        livePosition.detach();\r\n    }\r\n    /**\r\n     * @param node The object element.\r\n     */\r\n    _handleObject(node) {\r\n        // Try finding it a place in the tree.\r\n        if (this._checkAndSplitToAllowedPosition(node)) {\r\n            this._appendToFragment(node);\r\n        }\r\n        // Try autoparagraphing.\r\n        else {\r\n            this._tryAutoparagraphing(node);\r\n        }\r\n    }\r\n    /**\r\n     * @param node The disallowed node which needs to be handled.\r\n     */\r\n    _handleDisallowedNode(node) {\r\n        // If the node is an element, try inserting its children (strip the parent).\r\n        if (node.is('element')) {\r\n            this.handleNodes(node.getChildren());\r\n        }\r\n        // If text is not allowed, try autoparagraphing it.\r\n        else {\r\n            this._tryAutoparagraphing(node);\r\n        }\r\n    }\r\n    /**\r\n     * Append a node to the temporary DocumentFragment.\r\n     *\r\n     * @param node The node to insert.\r\n     */\r\n    _appendToFragment(node) {\r\n        /* istanbul ignore if -- @preserve */\r\n        if (!this.schema.checkChild(this.position, node)) {\r\n            // Algorithm's correctness check. We should never end up here but it's good to know that we did.\r\n            // Note that it would often be a silent issue if we insert node in a place where it's not allowed.\r\n            /**\r\n             * Given node cannot be inserted on the given position.\r\n             *\r\n             * @error insertcontent-wrong-position\r\n             * @param node Node to insert.\r\n             * @param position Position to insert the node at.\r\n             */\r\n            throw new CKEditorError('insertcontent-wrong-position', this, { node, position: this.position });\r\n        }\r\n        this.writer.insert(node, this._documentFragmentPosition);\r\n        this._documentFragmentPosition = this._documentFragmentPosition.getShiftedBy(node.offsetSize);\r\n        // The last inserted object should be selected because we can't put a collapsed selection after it.\r\n        if (this.schema.isObject(node) && !this.schema.checkChild(this.position, '$text')) {\r\n            this._nodeToSelect = node;\r\n        }\r\n        else {\r\n            this._nodeToSelect = null;\r\n        }\r\n        this._filterAttributesOf.push(node);\r\n    }\r\n    /**\r\n     * Sets `_affectedStart` and `_affectedEnd` to the given `position`. Should be used before a change is done during insertion process to\r\n     * mark the affected range.\r\n     *\r\n     * This method is used before inserting a node or splitting a parent node. `_affectedStart` and `_affectedEnd` are also changed\r\n     * during merging, but the logic there is more complicated so it is left out of this function.\r\n     */\r\n    _setAffectedBoundaries(position) {\r\n        // Set affected boundaries stickiness so that those position will \"expand\" when something is inserted in between them:\r\n        // <paragraph>Foo][bar</paragraph> -> <paragraph>Foo]xx[bar</paragraph>\r\n        // This is why it cannot be a range but two separate positions.\r\n        if (!this._affectedStart) {\r\n            this._affectedStart = LivePosition.fromPosition(position, 'toPrevious');\r\n        }\r\n        // If `_affectedEnd` is before the new boundary position, expand `_affectedEnd`. This can happen if first inserted node was\r\n        // inserted into the parent but the next node is moved-out of that parent:\r\n        // (1) <paragraph>Foo][</paragraph> -> <paragraph>Foo]xx[</paragraph>\r\n        // (2) <paragraph>Foo]xx[</paragraph> -> <paragraph>Foo]xx</paragraph><widget></widget>[\r\n        if (!this._affectedEnd || this._affectedEnd.isBefore(position)) {\r\n            if (this._affectedEnd) {\r\n                this._affectedEnd.detach();\r\n            }\r\n            this._affectedEnd = LivePosition.fromPosition(position, 'toNext');\r\n        }\r\n    }\r\n    /**\r\n     * Merges the previous sibling of the first node if it should be merged.\r\n     *\r\n     * After the content was inserted we may try to merge it with its siblings.\r\n     * This should happen only if the selection was in those elements initially.\r\n     */\r\n    _mergeOnLeft() {\r\n        const node = this._firstNode;\r\n        if (!(node instanceof Element)) {\r\n            return;\r\n        }\r\n        if (!this._canMergeLeft(node)) {\r\n            return;\r\n        }\r\n        const mergePosLeft = LivePosition._createBefore(node);\r\n        mergePosLeft.stickiness = 'toNext';\r\n        const livePosition = LivePosition.fromPosition(this.position, 'toNext');\r\n        // If `_affectedStart` is sames as merge position, it means that the element \"marked\" by `_affectedStart` is going to be\r\n        // removed and its contents will be moved. This won't transform `LivePosition` so `_affectedStart` needs to be moved\r\n        // by hand to properly reflect affected range. (Due to `_affectedStart` and `_affectedEnd` stickiness, the \"range\" is\r\n        // shown as `][`).\r\n        //\r\n        // Example - insert `<paragraph>Abc</paragraph><paragraph>Xyz</paragraph>` at the end of `<paragraph>Foo^</paragraph>`:\r\n        //\r\n        // <paragraph>Foo</paragraph><paragraph>Bar</paragraph>   -->\r\n        // <paragraph>Foo</paragraph>]<paragraph>Abc</paragraph><paragraph>Xyz</paragraph>[<paragraph>Bar</paragraph>   -->\r\n        // <paragraph>Foo]Abc</paragraph><paragraph>Xyz</paragraph>[<paragraph>Bar</paragraph>\r\n        //\r\n        // Note, that if we are here then something must have been inserted, so `_affectedStart` and `_affectedEnd` have to be set.\r\n        if (this._affectedStart.isEqual(mergePosLeft)) {\r\n            this._affectedStart.detach();\r\n            this._affectedStart = LivePosition._createAt(mergePosLeft.nodeBefore, 'end', 'toPrevious');\r\n        }\r\n        // We need to update the references to the first and last nodes if they will be merged into the previous sibling node\r\n        // because the reference would point to the removed node.\r\n        //\r\n        // <p>A^A</p> + <p>X</p>\r\n        //\r\n        // <p>A</p>^<p>A</p>\r\n        // <p>A</p><p>X</p><p>A</p>\r\n        // <p>AX</p><p>A</p>\r\n        // <p>AXA</p>\r\n        if (this._firstNode === this._lastNode) {\r\n            this._firstNode = mergePosLeft.nodeBefore;\r\n            this._lastNode = mergePosLeft.nodeBefore;\r\n        }\r\n        this.writer.merge(mergePosLeft);\r\n        // If only one element (the merged one) is in the \"affected range\", also move the affected range end appropriately.\r\n        //\r\n        // Example - insert `<paragraph>Abc</paragraph>` at the of `<paragraph>Foo^</paragraph>`:\r\n        //\r\n        // <paragraph>Foo</paragraph><paragraph>Bar</paragraph>   -->\r\n        // <paragraph>Foo</paragraph>]<paragraph>Abc</paragraph>[<paragraph>Bar</paragraph>   -->\r\n        // <paragraph>Foo]Abc</paragraph>[<paragraph>Bar</paragraph>   -->\r\n        // <paragraph>Foo]Abc[</paragraph><paragraph>Bar</paragraph>\r\n        if (mergePosLeft.isEqual(this._affectedEnd) && this._firstNode === this._lastNode) {\r\n            this._affectedEnd.detach();\r\n            this._affectedEnd = LivePosition._createAt(mergePosLeft.nodeBefore, 'end', 'toNext');\r\n        }\r\n        this.position = livePosition.toPosition();\r\n        livePosition.detach();\r\n        // After merge elements that were marked by _insert() to be filtered might be gone so\r\n        // we need to mark the new container.\r\n        this._filterAttributesOf.push(this.position.parent);\r\n        mergePosLeft.detach();\r\n    }\r\n    /**\r\n     * Merges the next sibling of the last node if it should be merged.\r\n     *\r\n     * After the content was inserted we may try to merge it with its siblings.\r\n     * This should happen only if the selection was in those elements initially.\r\n     */\r\n    _mergeOnRight() {\r\n        const node = this._lastNode;\r\n        if (!(node instanceof Element)) {\r\n            return;\r\n        }\r\n        if (!this._canMergeRight(node)) {\r\n            return;\r\n        }\r\n        const mergePosRight = LivePosition._createAfter(node);\r\n        mergePosRight.stickiness = 'toNext';\r\n        /* istanbul ignore if -- @preserve */\r\n        if (!this.position.isEqual(mergePosRight)) {\r\n            // Algorithm's correctness check. We should never end up here but it's good to know that we did.\r\n            // At this point the insertion position should be after the node we'll merge. If it isn't,\r\n            // it should need to be secured as in the left merge case.\r\n            /**\r\n             * An internal error occurred when merging inserted content with its siblings.\r\n             * The insertion position should equal the merge position.\r\n             *\r\n             * If you encountered this error, report it back to the CKEditor 5 team\r\n             * with as many details as possible regarding the content being inserted and the insertion position.\r\n             *\r\n             * @error insertcontent-invalid-insertion-position\r\n             */\r\n            throw new CKEditorError('insertcontent-invalid-insertion-position', this);\r\n        }\r\n        // Move the position to the previous node, so it isn't moved to the graveyard on merge.\r\n        // <p>x</p>[]<p>y</p> => <p>x[]</p><p>y</p>\r\n        this.position = Position._createAt(mergePosRight.nodeBefore, 'end');\r\n        // Explanation of setting position stickiness to `'toPrevious'`:\r\n        // OK:  <p>xx[]</p> + <p>yy</p> => <p>xx[]yy</p> (when sticks to previous)\r\n        // NOK: <p>xx[]</p> + <p>yy</p> => <p>xxyy[]</p> (when sticks to next)\r\n        const livePosition = LivePosition.fromPosition(this.position, 'toPrevious');\r\n        // See comment in `_mergeOnLeft()` on moving `_affectedStart`.\r\n        if (this._affectedEnd.isEqual(mergePosRight)) {\r\n            this._affectedEnd.detach();\r\n            this._affectedEnd = LivePosition._createAt(mergePosRight.nodeBefore, 'end', 'toNext');\r\n        }\r\n        // We need to update the references to the first and last nodes if they will be merged into the previous sibling node\r\n        // because the reference would point to the removed node.\r\n        //\r\n        // <p>A^A</p> + <p>X</p>\r\n        //\r\n        // <p>A</p>^<p>A</p>\r\n        // <p>A</p><p>X</p><p>A</p>\r\n        // <p>AX</p><p>A</p>\r\n        // <p>AXA</p>\r\n        if (this._firstNode === this._lastNode) {\r\n            this._firstNode = mergePosRight.nodeBefore;\r\n            this._lastNode = mergePosRight.nodeBefore;\r\n        }\r\n        this.writer.merge(mergePosRight);\r\n        // See comment in `_mergeOnLeft()` on moving `_affectedStart`.\r\n        if (mergePosRight.getShiftedBy(-1).isEqual(this._affectedStart) && this._firstNode === this._lastNode) {\r\n            this._affectedStart.detach();\r\n            this._affectedStart = LivePosition._createAt(mergePosRight.nodeBefore, 0, 'toPrevious');\r\n        }\r\n        this.position = livePosition.toPosition();\r\n        livePosition.detach();\r\n        // After merge elements that were marked by _insert() to be filtered might be gone so\r\n        // we need to mark the new container.\r\n        this._filterAttributesOf.push(this.position.parent);\r\n        mergePosRight.detach();\r\n    }\r\n    /**\r\n     * Checks whether specified node can be merged with previous sibling element.\r\n     *\r\n     * @param node The node which could potentially be merged.\r\n     */\r\n    _canMergeLeft(node) {\r\n        const previousSibling = node.previousSibling;\r\n        return (previousSibling instanceof Element) &&\r\n            this.canMergeWith.has(previousSibling) &&\r\n            this.model.schema.checkMerge(previousSibling, node);\r\n    }\r\n    /**\r\n     * Checks whether specified node can be merged with next sibling element.\r\n     *\r\n     * @param node The node which could potentially be merged.\r\n     */\r\n    _canMergeRight(node) {\r\n        const nextSibling = node.nextSibling;\r\n        return (nextSibling instanceof Element) &&\r\n            this.canMergeWith.has(nextSibling) &&\r\n            this.model.schema.checkMerge(node, nextSibling);\r\n    }\r\n    /**\r\n     * Tries wrapping the node in a new paragraph and inserting it this way.\r\n     *\r\n     * @param node The node which needs to be autoparagraphed.\r\n     */\r\n    _tryAutoparagraphing(node) {\r\n        const paragraph = this.writer.createElement('paragraph');\r\n        // Do not autoparagraph if the paragraph won't be allowed there,\r\n        // cause that would lead to an infinite loop. The paragraph would be rejected in\r\n        // the next _handleNode() call and we'd be here again.\r\n        if (this._getAllowedIn(this.position.parent, paragraph) && this.schema.checkChild(paragraph, node)) {\r\n            paragraph._appendChild(node);\r\n            this._handleNode(paragraph);\r\n        }\r\n    }\r\n    /**\r\n     * Checks if a node can be inserted in the given position or it would be accepted if a paragraph would be inserted.\r\n     * It also handles inserting the paragraph.\r\n     *\r\n     * @returns Whether an allowed position was found.\r\n     * `false` is returned if the node isn't allowed at the current position or in auto paragraph, `true` if was.\r\n     */\r\n    _checkAndAutoParagraphToAllowedPosition(node) {\r\n        if (this.schema.checkChild(this.position.parent, node)) {\r\n            return true;\r\n        }\r\n        // Do not auto paragraph if the paragraph won't be allowed there,\r\n        // cause that would lead to an infinite loop. The paragraph would be rejected in\r\n        // the next _handleNode() call and we'd be here again.\r\n        if (!this.schema.checkChild(this.position.parent, 'paragraph') || !this.schema.checkChild('paragraph', node)) {\r\n            return false;\r\n        }\r\n        // Insert nodes collected in temporary DocumentFragment if the position parent needs change to process further nodes.\r\n        this._insertPartialFragment();\r\n        // Insert a paragraph and move insertion position to it.\r\n        const paragraph = this.writer.createElement('paragraph');\r\n        this.writer.insert(paragraph, this.position);\r\n        this._setAffectedBoundaries(this.position);\r\n        this._lastAutoParagraph = paragraph;\r\n        this.position = this.writer.createPositionAt(paragraph, 0);\r\n        return true;\r\n    }\r\n    /**\r\n     * @returns Whether an allowed position was found.\r\n     * `false` is returned if the node isn't allowed at any position up in the tree, `true` if was.\r\n     */\r\n    _checkAndSplitToAllowedPosition(node) {\r\n        const allowedIn = this._getAllowedIn(this.position.parent, node);\r\n        if (!allowedIn) {\r\n            return false;\r\n        }\r\n        // Insert nodes collected in temporary DocumentFragment if the position parent needs change to process further nodes.\r\n        if (allowedIn != this.position.parent) {\r\n            this._insertPartialFragment();\r\n        }\r\n        while (allowedIn != this.position.parent) {\r\n            if (this.position.isAtStart) {\r\n                // If insertion position is at the beginning of the parent, move it out instead of splitting.\r\n                // <p>^Foo</p> -> ^<p>Foo</p>\r\n                const parent = this.position.parent;\r\n                this.position = this.writer.createPositionBefore(parent);\r\n                // Special case – parent is empty (<p>^</p>).\r\n                //\r\n                // 1. parent.isEmpty\r\n                // We can remove the element after moving insertion position out of it.\r\n                //\r\n                // 2. parent.parent === allowedIn\r\n                // However parent should remain in place when allowed element is above limit element in document tree.\r\n                // For example there shouldn't be allowed to remove empty paragraph from tableCell, when is pasted\r\n                // content allowed in $root.\r\n                if (parent.isEmpty && parent.parent === allowedIn) {\r\n                    this.writer.remove(parent);\r\n                }\r\n            }\r\n            else if (this.position.isAtEnd) {\r\n                // If insertion position is at the end of the parent, move it out instead of splitting.\r\n                // <p>Foo^</p> -> <p>Foo</p>^\r\n                this.position = this.writer.createPositionAfter(this.position.parent);\r\n            }\r\n            else {\r\n                const tempPos = this.writer.createPositionAfter(this.position.parent);\r\n                this._setAffectedBoundaries(this.position);\r\n                this.writer.split(this.position);\r\n                this.position = tempPos;\r\n                this.canMergeWith.add(this.position.nodeAfter);\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n    /**\r\n     * Gets the element in which the given node is allowed. It checks the passed element and all its ancestors.\r\n     *\r\n     * @param contextElement The element in which context the node should be checked.\r\n     * @param childNode The node to check.\r\n     */\r\n    _getAllowedIn(contextElement, childNode) {\r\n        if (this.schema.checkChild(contextElement, childNode)) {\r\n            return contextElement;\r\n        }\r\n        // If the child wasn't allowed in the context element and the element is a limit there's no point in\r\n        // checking any further towards the root. This is it: the limit is unsplittable and there's nothing\r\n        // we can do about it. Without this check, the algorithm will analyze parent of the limit and may create\r\n        // an illusion of the child being allowed. There's no way to insert it down there, though. It results in\r\n        // infinite loops.\r\n        if (this.schema.isLimit(contextElement)) {\r\n            return null;\r\n        }\r\n        return this._getAllowedIn(contextElement.parent, childNode);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/utils/findoptimalinsertionrange\r\n */\r\nimport { first } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Returns a model range which is optimal (in terms of UX) for inserting a widget block.\r\n *\r\n * For instance, if a selection is in the middle of a paragraph, the collapsed range before this paragraph\r\n * will be returned so that it is not split. If the selection is at the end of a paragraph,\r\n * the collapsed range after this paragraph will be returned.\r\n *\r\n * Note: If the selection is placed in an empty block, the range in that block will be returned. If that range\r\n * is then passed to {@link module:engine/model/model~Model#insertContent}, the block will be fully replaced\r\n * by the inserted widget block.\r\n *\r\n * **Note:** Use {@link module:widget/utils#findOptimalInsertionRange} instead of this function outside engine.\r\n * This function is only exposed to be used by {@link module:widget/utils#findOptimalInsertionRange findOptimalInsertionRange()}\r\n * in the `widget` package and inside the `engine` package.\r\n *\r\n * @param selection The selection based on which the insertion position should be calculated.\r\n * @param model Model instance.\r\n * @param place The place where to look for optimal insertion range.\r\n * The default `auto` value will determine itself the best position for insertion.\r\n * The `before` value will try to find a position before selection.\r\n * The `after` value will try to find a position after selection.\r\n * @returns The optimal range.\r\n */\r\nexport function findOptimalInsertionRange(selection, model, place = 'auto') {\r\n    const selectedElement = selection.getSelectedElement();\r\n    if (selectedElement && model.schema.isObject(selectedElement) && !model.schema.isInline(selectedElement)) {\r\n        if (place == 'before' || place == 'after') {\r\n            return model.createRange(model.createPositionAt(selectedElement, place));\r\n        }\r\n        return model.createRangeOn(selectedElement);\r\n    }\r\n    const firstBlock = first(selection.getSelectedBlocks());\r\n    // There are no block elements within ancestors (in the current limit element).\r\n    if (!firstBlock) {\r\n        return model.createRange(selection.focus);\r\n    }\r\n    // If inserting into an empty block – return position in that block. It will get\r\n    // replaced with the image by insertContent(). #42.\r\n    if (firstBlock.isEmpty) {\r\n        return model.createRange(model.createPositionAt(firstBlock, 0));\r\n    }\r\n    const positionAfter = model.createPositionAfter(firstBlock);\r\n    // If selection is at the end of the block - return position after the block.\r\n    if (selection.focus.isTouching(positionAfter)) {\r\n        return model.createRange(positionAfter);\r\n    }\r\n    // Otherwise, return position before the block.\r\n    return model.createRange(model.createPositionBefore(firstBlock));\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/utils/insertobject\r\n */\r\nimport { findOptimalInsertionRange } from './findoptimalinsertionrange';\r\nimport { CKEditorError, first } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Inserts an {@glink framework/deep-dive/schema#object-elements object element} at a specific position in the editor content.\r\n *\r\n * **Note:** Use {@link module:engine/model/model~Model#insertObject} instead of this function.\r\n * This function is only exposed to be reusable in algorithms which change the {@link module:engine/model/model~Model#insertObject}\r\n * method's behavior.\r\n *\r\n * **Note**: For more documentation and examples, see {@link module:engine/model/model~Model#insertObject}.\r\n *\r\n * @param model The model in context of which the insertion should be performed.\r\n * @param object An object to be inserted into the model document.\r\n * @param selectable A selectable where the content should be inserted. If not specified, the current\r\n * {@link module:engine/model/document~Document#selection document selection} will be used instead.\r\n * @param placeOrOffset Specifies the exact place or offset for the insertion to take place, relative to `selectable`.\r\n * @param options Additional options.\r\n * @param options.findOptimalPosition An option that, when set, adjusts the insertion position (relative to\r\n * `selectable` and `placeOrOffset`) so that the content of `selectable` is not split upon insertion (a.k.a. non-destructive insertion).\r\n * * When `'auto'`, the algorithm will decide whether to insert the object before or after `selectable` to avoid content splitting.\r\n * * When `'before'`, the closest position before `selectable` will be used that will not result in content splitting.\r\n * * When `'after'`, the closest position after `selectable` will be used that will not result in content splitting.\r\n *\r\n * Note that this option works only for block objects. Inline objects are inserted into text and do not split blocks.\r\n * @param options.setSelection An option that, when set, moves the\r\n * {@link module:engine/model/document~Document#selection document selection} after inserting the object.\r\n * * When `'on'`, the document selection will be set on the inserted object.\r\n * * When `'after'`, the document selection will move to the closest text node after the inserted object. If there is no\r\n * such text node, a paragraph will be created and the document selection will be moved inside it.\r\n * @returns A range which contains all the performed changes. This is a range that, if removed,\r\n * would return the model to the state before the insertion. If no changes were preformed by `insertObject()`, returns a range collapsed\r\n * at the insertion position.\r\n */\r\nexport default function insertObject(model, object, selectable, options = {}) {\r\n    if (!model.schema.isObject(object)) {\r\n        /**\r\n         * Tried to insert an element with {@link module:engine/model/utils/insertobject insertObject()} function\r\n         * that is not defined as an object in schema.\r\n         * See {@link module:engine/model/schema~SchemaItemDefinition#isObject `SchemaItemDefinition`}.\r\n         * If you want to insert content that is not an object you might want to use\r\n         * {@link module:engine/model/utils/insertcontent insertContent()} function.\r\n         * @error insertobject-element-not-an-object\r\n         */\r\n        throw new CKEditorError('insertobject-element-not-an-object', model, { object });\r\n    }\r\n    // Normalize selectable to a selection instance.\r\n    const originalSelection = selectable ? selectable : model.document.selection;\r\n    // Adjust the insertion selection.\r\n    let insertionSelection = originalSelection;\r\n    if (options.findOptimalPosition && model.schema.isBlock(object)) {\r\n        insertionSelection = model.createSelection(findOptimalInsertionRange(originalSelection, model, options.findOptimalPosition));\r\n    }\r\n    // Collect attributes to be copied on the inserted object.\r\n    const firstSelectedBlock = first(originalSelection.getSelectedBlocks());\r\n    const attributesToCopy = {};\r\n    if (firstSelectedBlock) {\r\n        Object.assign(attributesToCopy, model.schema.getAttributesWithProperty(firstSelectedBlock, 'copyOnReplace', true));\r\n    }\r\n    return model.change(writer => {\r\n        // Remove the selected content to find out what the parent of the inserted object would be.\r\n        // It would be removed inside model.insertContent() anyway.\r\n        if (!insertionSelection.isCollapsed) {\r\n            model.deleteContent(insertionSelection, { doNotAutoparagraph: true });\r\n        }\r\n        let elementToInsert = object;\r\n        const insertionPositionParent = insertionSelection.anchor.parent;\r\n        // Autoparagraphing of an inline objects.\r\n        if (!model.schema.checkChild(insertionPositionParent, object) &&\r\n            model.schema.checkChild(insertionPositionParent, 'paragraph') &&\r\n            model.schema.checkChild('paragraph', object)) {\r\n            elementToInsert = writer.createElement('paragraph');\r\n            writer.insert(object, elementToInsert);\r\n        }\r\n        // Apply attributes that are allowed on the inserted object (or paragraph if autoparagraphed).\r\n        model.schema.setAllowedAttributes(elementToInsert, attributesToCopy, writer);\r\n        // Insert the prepared content at the optionally adjusted selection.\r\n        const affectedRange = model.insertContent(elementToInsert, insertionSelection);\r\n        // Nothing got inserted.\r\n        if (affectedRange.isCollapsed) {\r\n            return affectedRange;\r\n        }\r\n        if (options.setSelection) {\r\n            updateSelection(writer, object, options.setSelection, attributesToCopy);\r\n        }\r\n        return affectedRange;\r\n    });\r\n}\r\n/**\r\n * Updates document selection based on given `place` parameter in relation to `contextElement` element.\r\n *\r\n * @param writer An instance of the model writer.\r\n * @param contextElement An element to set the attributes on.\r\n * @param place The place where selection should be set in relation to the `contextElement` element.\r\n * Value `on` will set selection on the passed `contextElement`. Value `after` will set selection after `contextElement`.\r\n * @param attributes Attributes keys and values to set on a paragraph that this function can create when\r\n * `place` parameter is equal to `after` but there is no element with `$text` node to set selection in.\r\n */\r\nfunction updateSelection(writer, contextElement, place, paragraphAttributes) {\r\n    const model = writer.model;\r\n    if (place == 'on') {\r\n        writer.setSelection(contextElement, 'on');\r\n        return;\r\n    }\r\n    if (place != 'after') {\r\n        /**\r\n         * The unsupported `options.setSelection` parameter was passed\r\n         * to the {@link module:engine/model/utils/insertobject insertObject()} function.\r\n         * Check the {@link module:engine/model/utils/insertobject insertObject()} API documentation for allowed\r\n         * `options.setSelection` parameter values.\r\n         *\r\n         * @error insertobject-invalid-place-parameter-value\r\n         */\r\n        throw new CKEditorError('insertobject-invalid-place-parameter-value', model);\r\n    }\r\n    let nextElement = contextElement.nextSibling;\r\n    if (model.schema.isInline(contextElement)) {\r\n        writer.setSelection(contextElement, 'after');\r\n        return;\r\n    }\r\n    // Check whether an element next to the inserted element is defined and can contain a text.\r\n    const canSetSelection = nextElement && model.schema.checkChild(nextElement, '$text');\r\n    // If the element is missing, but a paragraph could be inserted next to the element, let's add it.\r\n    if (!canSetSelection && model.schema.checkChild(contextElement.parent, 'paragraph')) {\r\n        nextElement = writer.createElement('paragraph');\r\n        model.schema.setAllowedAttributes(nextElement, paragraphAttributes, writer);\r\n        model.insertContent(nextElement, writer.createPositionAfter(contextElement));\r\n    }\r\n    // Put the selection inside the element, at the beginning.\r\n    if (nextElement) {\r\n        writer.setSelection(nextElement, 0);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/utils/modifyselection\r\n */\r\nimport DocumentSelection from '../documentselection';\r\nimport Position from '../position';\r\nimport Range from '../range';\r\nimport TreeWalker from '../treewalker';\r\nimport { isInsideSurrogatePair, isInsideCombinedSymbol, isInsideEmojiSequence } from '@ckeditor/ckeditor5-utils';\r\nconst wordBoundaryCharacters = ' ,.?!:;\"-()';\r\n/**\r\n * Modifies the selection. Currently, the supported modifications are:\r\n *\r\n * * Extending. The selection focus is moved in the specified `options.direction` with a step specified in `options.unit`.\r\n * Possible values for `unit` are:\r\n *  * `'character'` (default) - moves selection by one user-perceived character. In most cases this means moving by one\r\n *  character in `String` sense. However, unicode also defines \"combing marks\". These are special symbols, that combines\r\n *  with a symbol before it (\"base character\") to create one user-perceived character. For example, `q̣̇` is a normal\r\n *  letter `q` with two \"combining marks\": upper dot (`Ux0307`) and lower dot (`Ux0323`). For most actions, i.e. extending\r\n *  selection by one position, it is correct to include both \"base character\" and all of it's \"combining marks\". That is\r\n *  why `'character'` value is most natural and common method of modifying selection.\r\n *  * `'codePoint'` - moves selection by one unicode code point. In contrary to, `'character'` unit, this will insert\r\n *  selection between \"base character\" and \"combining mark\", because \"combining marks\" have their own unicode code points.\r\n *  However, for technical reasons, unicode code points with values above `UxFFFF` are represented in native `String` by\r\n *  two characters, called \"surrogate pairs\". Halves of \"surrogate pairs\" have a meaning only when placed next to each other.\r\n *  For example `𨭎` is represented in `String` by `\\uD862\\uDF4E`. Both `\\uD862` and `\\uDF4E` do not have any meaning\r\n *  outside the pair (are rendered as ? when alone). Position between them would be incorrect. In this case, selection\r\n *  extension will include whole \"surrogate pair\".\r\n *  * `'word'` - moves selection by a whole word.\r\n *\r\n * **Note:** if you extend a forward selection in a backward direction you will in fact shrink it.\r\n *\r\n * **Note:** Use {@link module:engine/model/model~Model#modifySelection} instead of this function.\r\n * This function is only exposed to be reusable in algorithms\r\n * which change the {@link module:engine/model/model~Model#modifySelection}\r\n * method's behavior.\r\n *\r\n * @param model The model in context of which the selection modification should be performed.\r\n * @param selection The selection to modify.\r\n * @param options.direction The direction in which the selection should be modified. Default 'forward'.\r\n * @param options.unit The unit by which selection should be modified. Default 'character'.\r\n * @param options.treatEmojiAsSingleUnit Whether multi-characer emoji sequences should be handled as single unit.\r\n */\r\nexport default function modifySelection(model, selection, options = {}) {\r\n    const schema = model.schema;\r\n    const isForward = options.direction != 'backward';\r\n    const unit = options.unit ? options.unit : 'character';\r\n    const treatEmojiAsSingleUnit = !!options.treatEmojiAsSingleUnit;\r\n    const focus = selection.focus;\r\n    const walker = new TreeWalker({\r\n        boundaries: getSearchRange(focus, isForward),\r\n        singleCharacters: true,\r\n        direction: isForward ? 'forward' : 'backward'\r\n    });\r\n    const data = { walker, schema, isForward, unit, treatEmojiAsSingleUnit };\r\n    let next;\r\n    while ((next = walker.next())) {\r\n        if (next.done) {\r\n            return;\r\n        }\r\n        const position = tryExtendingTo(data, next.value);\r\n        if (position) {\r\n            if (selection instanceof DocumentSelection) {\r\n                model.change(writer => {\r\n                    writer.setSelectionFocus(position);\r\n                });\r\n            }\r\n            else {\r\n                selection.setFocus(position);\r\n            }\r\n            return;\r\n        }\r\n    }\r\n}\r\n/**\r\n * Checks whether the selection can be extended to the the walker's next value (next position).\r\n */\r\nfunction tryExtendingTo(data, value) {\r\n    const { isForward, walker, unit, schema, treatEmojiAsSingleUnit } = data;\r\n    const { type, item, nextPosition } = value;\r\n    // If found text, we can certainly put the focus in it. Let's just find a correct position\r\n    // based on the unit.\r\n    if (type == 'text') {\r\n        if (data.unit === 'word') {\r\n            return getCorrectWordBreakPosition(walker, isForward);\r\n        }\r\n        return getCorrectPosition(walker, unit, treatEmojiAsSingleUnit);\r\n    }\r\n    // Entering an element.\r\n    if (type == (isForward ? 'elementStart' : 'elementEnd')) {\r\n        // If it's a selectable, we can select it now.\r\n        if (schema.isSelectable(item)) {\r\n            return Position._createAt(item, isForward ? 'after' : 'before');\r\n        }\r\n        // If text allowed on this position, extend to this place.\r\n        if (schema.checkChild(nextPosition, '$text')) {\r\n            return nextPosition;\r\n        }\r\n    }\r\n    // Leaving an element.\r\n    else {\r\n        // If leaving a limit element, stop.\r\n        if (schema.isLimit(item)) {\r\n            // NOTE: Fast-forward the walker until the end.\r\n            walker.skip(() => true);\r\n            return;\r\n        }\r\n        // If text allowed on this position, extend to this place.\r\n        if (schema.checkChild(nextPosition, '$text')) {\r\n            return nextPosition;\r\n        }\r\n    }\r\n}\r\n/**\r\n * Finds a correct position by walking in a text node and checking whether selection can be extended to given position\r\n * or should be extended further.\r\n */\r\nfunction getCorrectPosition(walker, unit, treatEmojiAsSingleUnit) {\r\n    const textNode = walker.position.textNode;\r\n    if (textNode) {\r\n        const data = textNode.data;\r\n        let offset = walker.position.offset - textNode.startOffset;\r\n        while (isInsideSurrogatePair(data, offset) ||\r\n            (unit == 'character' && isInsideCombinedSymbol(data, offset)) ||\r\n            (treatEmojiAsSingleUnit && isInsideEmojiSequence(data, offset))) {\r\n            walker.next();\r\n            offset = walker.position.offset - textNode.startOffset;\r\n        }\r\n    }\r\n    return walker.position;\r\n}\r\n/**\r\n * Finds a correct position of a word break by walking in a text node and checking whether selection can be extended to given position\r\n * or should be extended further.\r\n */\r\nfunction getCorrectWordBreakPosition(walker, isForward) {\r\n    let textNode = walker.position.textNode;\r\n    if (!textNode) {\r\n        textNode = isForward ? walker.position.nodeAfter : walker.position.nodeBefore;\r\n    }\r\n    while (textNode && textNode.is('$text')) {\r\n        const offset = walker.position.offset - textNode.startOffset;\r\n        // Check of adjacent text nodes with different attributes (like BOLD).\r\n        // Example          : 'foofoo []bar<$text bold=\"true\">bar</$text> bazbaz'\r\n        // should expand to : 'foofoo [bar<$text bold=\"true\">bar</$text>] bazbaz'.\r\n        if (isAtNodeBoundary(textNode, offset, isForward)) {\r\n            textNode = isForward ? walker.position.nodeAfter : walker.position.nodeBefore;\r\n        }\r\n        // Check if this is a word boundary.\r\n        else if (isAtWordBoundary(textNode.data, offset, isForward)) {\r\n            break;\r\n        }\r\n        // Maybe one more character.\r\n        else {\r\n            walker.next();\r\n        }\r\n    }\r\n    return walker.position;\r\n}\r\nfunction getSearchRange(start, isForward) {\r\n    const root = start.root;\r\n    const searchEnd = Position._createAt(root, isForward ? 'end' : 0);\r\n    if (isForward) {\r\n        return new Range(start, searchEnd);\r\n    }\r\n    else {\r\n        return new Range(searchEnd, start);\r\n    }\r\n}\r\n/**\r\n * Checks if selection is on word boundary.\r\n */\r\nfunction isAtWordBoundary(data, offset, isForward) {\r\n    // The offset to check depends on direction.\r\n    const offsetToCheck = offset + (isForward ? 0 : -1);\r\n    return wordBoundaryCharacters.includes(data.charAt(offsetToCheck));\r\n}\r\n/**\r\n * Checks if selection is on node boundary.\r\n */\r\nfunction isAtNodeBoundary(textNode, offset, isForward) {\r\n    return offset === (isForward ? textNode.offsetSize : 0);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/model/model\r\n */\r\nimport Batch from './batch';\r\nimport Document from './document';\r\nimport MarkerCollection from './markercollection';\r\nimport ModelPosition from './position';\r\nimport ModelRange from './range';\r\nimport ModelSelection from './selection';\r\nimport OperationFactory from './operation/operationfactory';\r\nimport DocumentSelection from './documentselection';\r\nimport Schema from './schema';\r\nimport Writer from './writer';\r\nimport Node from './node';\r\nimport { autoParagraphEmptyRoots } from './utils/autoparagraphing';\r\nimport { injectSelectionPostFixer } from './utils/selection-post-fixer';\r\nimport deleteContent from './utils/deletecontent';\r\nimport getSelectedContent from './utils/getselectedcontent';\r\nimport insertContent from './utils/insertcontent';\r\nimport insertObject from './utils/insertobject';\r\nimport modifySelection from './utils/modifyselection';\r\nimport { CKEditorError, ObservableMixin } from '@ckeditor/ckeditor5-utils';\r\n// @if CK_DEBUG_ENGINE // const { dumpTrees, initDocumentDumping } = require( '../dev-utils/utils' );\r\n// @if CK_DEBUG_ENGINE // const { OperationReplayer } = require( '../dev-utils/operationreplayer' ).default;\r\n/**\r\n * Editor's data model. Read about the model in the\r\n * {@glink framework/architecture/editing-engine engine architecture} guide.\r\n */\r\nexport default class Model extends ObservableMixin() {\r\n    // @if CK_DEBUG_ENGINE // private _operationLogs: Array<string>;\r\n    // @if CK_DEBUG_ENGINE // private _appliedOperations: Array<Operation>;\r\n    constructor() {\r\n        super();\r\n        this.markers = new MarkerCollection();\r\n        this.document = new Document(this);\r\n        this.schema = new Schema();\r\n        this._pendingChanges = [];\r\n        this._currentWriter = null;\r\n        ['deleteContent', 'modifySelection', 'getSelectedContent', 'applyOperation']\r\n            .forEach(methodName => this.decorate(methodName));\r\n        // Adding operation validation with `highest` priority, so it is called before any other feature would like\r\n        // to do anything with the operation. If the operation has incorrect parameters it should throw on the earliest occasion.\r\n        this.on('applyOperation', (evt, args) => {\r\n            const operation = args[0];\r\n            operation._validate();\r\n        }, { priority: 'highest' });\r\n        // Register some default abstract entities.\r\n        this.schema.register('$root', {\r\n            isLimit: true\r\n        });\r\n        this.schema.register('$container', {\r\n            allowIn: ['$root', '$container']\r\n        });\r\n        this.schema.register('$block', {\r\n            allowIn: ['$root', '$container'],\r\n            isBlock: true\r\n        });\r\n        this.schema.register('$blockObject', {\r\n            allowWhere: '$block',\r\n            isBlock: true,\r\n            isObject: true\r\n        });\r\n        this.schema.register('$inlineObject', {\r\n            allowWhere: '$text',\r\n            allowAttributesOf: '$text',\r\n            isInline: true,\r\n            isObject: true\r\n        });\r\n        this.schema.register('$text', {\r\n            allowIn: '$block',\r\n            isInline: true,\r\n            isContent: true\r\n        });\r\n        this.schema.register('$clipboardHolder', {\r\n            allowContentOf: '$root',\r\n            allowChildren: '$text',\r\n            isLimit: true\r\n        });\r\n        this.schema.register('$documentFragment', {\r\n            allowContentOf: '$root',\r\n            allowChildren: '$text',\r\n            isLimit: true\r\n        });\r\n        // An element needed by the `upcastElementToMarker` converter.\r\n        // This element temporarily represents a marker boundary during the conversion process and is removed\r\n        // at the end of the conversion. `UpcastDispatcher` or at least `Conversion` class looks like a\r\n        // better place for this registration but both know nothing about `Schema`.\r\n        this.schema.register('$marker');\r\n        this.schema.addChildCheck((context, childDefinition) => {\r\n            if (childDefinition.name === '$marker') {\r\n                return true;\r\n            }\r\n        });\r\n        injectSelectionPostFixer(this);\r\n        // Post-fixer which takes care of adding empty paragraph elements to the empty roots.\r\n        this.document.registerPostFixer(autoParagraphEmptyRoots);\r\n        // The base implementation for \"decorated\" method with remapped arguments.\r\n        this.on('insertContent', (evt, [content, selectable]) => {\r\n            evt.return = insertContent(this, content, selectable);\r\n        });\r\n        // The base implementation for \"decorated\" method with remapped arguments.\r\n        this.on('insertObject', (evt, [element, selection, options]) => {\r\n            evt.return = insertObject(this, element, selection, options);\r\n        });\r\n        // The base implementation for \"decorated\" method with remapped arguments.\r\n        this.on('canEditAt', evt => {\r\n            const canEditAt = !this.document.isReadOnly;\r\n            evt.return = canEditAt;\r\n            if (!canEditAt) {\r\n                // Prevent further processing if the selection is at non-editable place.\r\n                evt.stop();\r\n            }\r\n        });\r\n        // @if CK_DEBUG_ENGINE // initDocumentDumping( this.document );\r\n        // @if CK_DEBUG_ENGINE // this.on( 'applyOperation', () => {\r\n        // @if CK_DEBUG_ENGINE // \tdumpTrees( this.document, this.document.version );\r\n        // @if CK_DEBUG_ENGINE // }, { priority: 'lowest' } );\r\n        // @if CK_DEBUG_ENGINE // this._operationLogs = [];\r\n        // @if CK_DEBUG_ENGINE // this._appliedOperations = [];\r\n    }\r\n    /**\r\n     * The `change()` method is the primary way of changing the model. You should use it to modify all document nodes\r\n     * (including detached nodes – i.e. nodes not added to the {@link module:engine/model/model~Model#document model document}),\r\n     * the {@link module:engine/model/document~Document#selection document's selection}, and\r\n     * {@link module:engine/model/model~Model#markers model markers}.\r\n     *\r\n     * ```ts\r\n     * model.change( writer => {\r\n     * \twriter.insertText( 'foo', paragraph, 'end' );\r\n     * } );\r\n     * ```\r\n     *\r\n     * All changes inside the change block use the same {@link module:engine/model/batch~Batch} so they are combined\r\n     * into a single undo step.\r\n     *\r\n     * ```ts\r\n     * model.change( writer => {\r\n     * \twriter.insertText( 'foo', paragraph, 'end' ); // foo.\r\n     *\r\n     * \tmodel.change( writer => {\r\n     * \t\twriter.insertText( 'bar', paragraph, 'end' ); // foobar.\r\n     * \t} );\r\n     *\r\n     * \twriter.insertText( 'bom', paragraph, 'end' ); // foobarbom.\r\n     * } );\r\n     * ```\r\n     *\r\n     * The callback of the `change()` block is executed synchronously.\r\n     *\r\n     * You can also return a value from the change block.\r\n     *\r\n     * ```ts\r\n     * const img = model.change( writer => {\r\n     * \treturn writer.createElement( 'img' );\r\n     * } );\r\n     * ```\r\n     *\r\n     * @see #enqueueChange\r\n     * @typeParam TReturn The return type of the provided callback.\r\n     * @param callback Callback function which may modify the model.\r\n     */\r\n    change(callback) {\r\n        try {\r\n            if (this._pendingChanges.length === 0) {\r\n                // If this is the outermost block, create a new batch and start `_runPendingChanges` execution flow.\r\n                this._pendingChanges.push({ batch: new Batch(), callback });\r\n                return this._runPendingChanges()[0];\r\n            }\r\n            else {\r\n                // If this is not the outermost block, just execute the callback.\r\n                return callback(this._currentWriter);\r\n            }\r\n        }\r\n        catch (err) {\r\n            // @if CK_DEBUG // throw err;\r\n            /* istanbul ignore next -- @preserve */\r\n            CKEditorError.rethrowUnexpectedError(err, this);\r\n        }\r\n    }\r\n    enqueueChange(batchOrType, callback) {\r\n        try {\r\n            if (!batchOrType) {\r\n                batchOrType = new Batch();\r\n            }\r\n            else if (typeof batchOrType === 'function') {\r\n                callback = batchOrType;\r\n                batchOrType = new Batch();\r\n            }\r\n            else if (!(batchOrType instanceof Batch)) {\r\n                batchOrType = new Batch(batchOrType);\r\n            }\r\n            this._pendingChanges.push({ batch: batchOrType, callback });\r\n            if (this._pendingChanges.length == 1) {\r\n                this._runPendingChanges();\r\n            }\r\n        }\r\n        catch (err) {\r\n            // @if CK_DEBUG // throw err;\r\n            /* istanbul ignore next -- @preserve */\r\n            CKEditorError.rethrowUnexpectedError(err, this);\r\n        }\r\n    }\r\n    /**\r\n     * {@link module:utils/observablemixin~Observable#decorate Decorated} function for applying\r\n     * {@link module:engine/model/operation/operation~Operation operations} to the model.\r\n     *\r\n     * This is a low-level way of changing the model. It is exposed for very specific use cases (like the undo feature).\r\n     * Normally, to modify the model, you will want to use {@link module:engine/model/writer~Writer `Writer`}.\r\n     * See also {@glink framework/architecture/editing-engine#changing-the-model Changing the model} section\r\n     * of the {@glink framework/architecture/editing-engine Editing architecture} guide.\r\n     *\r\n     * @param operation The operation to apply.\r\n     */\r\n    applyOperation(operation) {\r\n        // @if CK_DEBUG_ENGINE // console.log( 'Applying ' + operation );\r\n        // @if CK_DEBUG_ENGINE // this._operationLogs.push( JSON.stringify( operation ) );\r\n        // @if CK_DEBUG_ENGINE // this._appliedOperations.push( operation );\r\n        operation._execute();\r\n    }\r\n    // @if CK_DEBUG_ENGINE // public getAppliedOperation(): string {\r\n    // @if CK_DEBUG_ENGINE // \tif ( !this._appliedOperations ) {\r\n    // @if CK_DEBUG_ENGINE // \t\treturn '';\r\n    // @if CK_DEBUG_ENGINE // \t}\r\n    // @if CK_DEBUG_ENGINE // \treturn this._appliedOperations.map( operation => JSON.stringify( operation ) ).join( '-------' );\r\n    // @if CK_DEBUG_ENGINE // }\r\n    // @if CK_DEBUG_ENGINE // public createReplayer( stringifiedOperations: string ): typeof OperationReplayer {\r\n    // @if CK_DEBUG_ENGINE // \treturn new OperationReplayer( this, '-------', stringifiedOperations );\r\n    // @if CK_DEBUG_ENGINE // }\r\n    /**\r\n     * Inserts content at the position in the editor specified by the selection, as one would expect the paste\r\n     * functionality to work.\r\n     *\r\n     * **Note**: If you want to insert an {@glink framework/deep-dive/schema#object-elements object element}\r\n     * (e.g. a {@link module:widget/utils~toWidget widget}), see {@link #insertObject} instead.\r\n     *\r\n     * This is a high-level method. It takes the {@link #schema schema} into consideration when inserting\r\n     * the content, clears the given selection's content before inserting nodes and moves the selection\r\n     * to its target position at the end of the process.\r\n     * It can split elements, merge them, wrap bare text nodes with paragraphs, etc. &mdash; just like the\r\n     * pasting feature should do.\r\n     *\r\n     * For lower-level methods see {@link module:engine/model/writer~Writer `Writer`}.\r\n     *\r\n     * This method, unlike {@link module:engine/model/writer~Writer `Writer`}'s methods, does not have to be used\r\n     * inside a {@link #change `change()` block}.\r\n     *\r\n     * # Conversion and schema\r\n     *\r\n     * Inserting elements and text nodes into the model is not enough to make CKEditor 5 render that content\r\n     * to the user. CKEditor 5 implements a model-view-controller architecture and what `model.insertContent()` does\r\n     * is only adding nodes to the model. Additionally, you need to define\r\n     * {@glink framework/architecture/editing-engine#conversion converters} between the model and view\r\n     * and define those nodes in the {@glink framework/architecture/editing-engine#schema schema}.\r\n     *\r\n     * So, while this method may seem similar to CKEditor 4 `editor.insertHtml()` (in fact, both methods\r\n     * are used for paste-like content insertion), the CKEditor 5 method cannot be use to insert arbitrary HTML\r\n     * unless converters are defined for all elements and attributes in that HTML.\r\n     *\r\n     * # Examples\r\n     *\r\n     * Using `insertContent()` with a manually created model structure:\r\n     *\r\n     * ```ts\r\n     * // Let's create a document fragment containing such content as:\r\n     * //\r\n     * // <paragraph>foo</paragraph>\r\n     * // <blockQuote>\r\n     * //    <paragraph>bar</paragraph>\r\n     * // </blockQuote>\r\n     * const docFrag = editor.model.change( writer => {\r\n     * \tconst p1 = writer.createElement( 'paragraph' );\r\n     * \tconst p2 = writer.createElement( 'paragraph' );\r\n     * \tconst blockQuote = writer.createElement( 'blockQuote' );\r\n     * \tconst docFrag = writer.createDocumentFragment();\r\n     *\r\n     * \twriter.append( p1, docFrag );\r\n     * \twriter.append( blockQuote, docFrag );\r\n     * \twriter.append( p2, blockQuote );\r\n     * \twriter.insertText( 'foo', p1 );\r\n     * \twriter.insertText( 'bar', p2 );\r\n     *\r\n     * \treturn docFrag;\r\n     * } );\r\n     *\r\n     * // insertContent() does not have to be used in a change() block. It can, though,\r\n     * // so this code could be moved to the callback defined above.\r\n     * editor.model.insertContent( docFrag );\r\n     * ```\r\n     *\r\n     * Using `insertContent()` with an HTML string converted to a model document fragment (similar to the pasting mechanism):\r\n     *\r\n     * ```ts\r\n     * // You can create your own HtmlDataProcessor instance or use editor.data.processor\r\n     * // if you have not overridden the default one (which is the HtmlDataProcessor instance).\r\n     * const htmlDP = new HtmlDataProcessor( viewDocument );\r\n     *\r\n     * // Convert an HTML string to a view document fragment:\r\n     * const viewFragment = htmlDP.toView( htmlString );\r\n     *\r\n     * // Convert the view document fragment to a model document fragment\r\n     * // in the context of $root. This conversion takes the schema into\r\n     * // account so if, for example, the view document fragment contained a bare text node,\r\n     * // this text node cannot be a child of $root, so it will be automatically\r\n     * // wrapped with a <paragraph>. You can define the context yourself (in the second parameter),\r\n     * // and e.g. convert the content like it would happen in a <paragraph>.\r\n     * // Note: The clipboard feature uses a custom context called $clipboardHolder\r\n     * // which has a loosened schema.\r\n     * const modelFragment = editor.data.toModel( viewFragment );\r\n     *\r\n     * editor.model.insertContent( modelFragment );\r\n     * ```\r\n     *\r\n     * By default this method will use the document selection but it can also be used with a position, range or selection instance.\r\n     *\r\n     * ```ts\r\n     * // Insert text at the current document selection position.\r\n     * editor.model.change( writer => {\r\n     * \teditor.model.insertContent( writer.createText( 'x' ) );\r\n     * } );\r\n     *\r\n     * // Insert text at a given position - the document selection will not be modified.\r\n     * editor.model.change( writer => {\r\n     * \teditor.model.insertContent( writer.createText( 'x' ), doc.getRoot(), 2 );\r\n     *\r\n     * \t// Which is a shorthand for:\r\n     * \teditor.model.insertContent( writer.createText( 'x' ), writer.createPositionAt( doc.getRoot(), 2 ) );\r\n     * } );\r\n     * ```\r\n     *\r\n     * If you want the document selection to be moved to the inserted content, use the\r\n     * {@link module:engine/model/writer~Writer#setSelection `setSelection()`} method of the writer after inserting\r\n     * the content:\r\n     *\r\n     * ```ts\r\n     * editor.model.change( writer => {\r\n     * \tconst paragraph = writer.createElement( 'paragraph' );\r\n     *\r\n     * \t// Insert an empty paragraph at the beginning of the root.\r\n     * \teditor.model.insertContent( paragraph, writer.createPositionAt( editor.model.document.getRoot(), 0 ) );\r\n     *\r\n     * \t// Move the document selection to the inserted paragraph.\r\n     * \twriter.setSelection( paragraph, 'in' );\r\n     * } );\r\n     * ```\r\n     *\r\n     * If an instance of the {@link module:engine/model/selection~Selection model selection} is passed as `selectable`,\r\n     * the new content will be inserted at the passed selection (instead of document selection):\r\n     *\r\n     * ```ts\r\n     * editor.model.change( writer => {\r\n     * \t// Create a selection in a paragraph that will be used as a place of insertion.\r\n     * \tconst selection = writer.createSelection( paragraph, 'in' );\r\n     *\r\n     * \t// Insert the new text at the created selection.\r\n     * \teditor.model.insertContent( writer.createText( 'x' ), selection );\r\n     *\r\n     * \t// insertContent() modifies the passed selection instance so it can be used to set the document selection.\r\n     * \t// Note: This is not necessary when you passed the document selection to insertContent().\r\n     * \twriter.setSelection( selection );\r\n     * } );\r\n     * ```\r\n     *\r\n     * @fires insertContent\r\n     * @param content The content to insert.\r\n     * @param selectable The selection into which the content should be inserted.\r\n     * If not provided the current model document selection will be used.\r\n     * @param placeOrOffset To be used when a model item was passed as `selectable`.\r\n     * This param defines a position in relation to that item.\r\n     * at the insertion position.\r\n     */\r\n    insertContent(content, selectable, placeOrOffset, ...rest) {\r\n        const selection = normalizeSelectable(selectable, placeOrOffset);\r\n        // Passing all call arguments so it acts like decorated method.\r\n        return this.fire('insertContent', [content, selection, placeOrOffset, ...rest]);\r\n    }\r\n    /**\r\n     * Inserts an {@glink framework/deep-dive/schema#object-elements object element} at a specific position in the editor content.\r\n     *\r\n     * This is a high-level API:\r\n     * * It takes the {@link #schema schema} into consideration,\r\n     * * It clears the content of passed `selectable` before inserting,\r\n     * * It can move the selection at the end of the process,\r\n     * * It will copy the selected block's attributes to preserve them upon insertion,\r\n     * * It can split elements or wrap inline objects with paragraphs if they are not allowed in target position,\r\n     * * etc.\r\n     *\r\n     * # Notes\r\n     *\r\n     * * If you want to insert a non-object content, see {@link #insertContent} instead.\r\n     * * For lower-level API, see {@link module:engine/model/writer~Writer `Writer`}.\r\n     * * Unlike {@link module:engine/model/writer~Writer `Writer`}, this method does not have to be used inside\r\n     * a {@link #change `change()` block}.\r\n     * * Inserting object into the model is not enough to make CKEditor 5 render that content to the user.\r\n     * CKEditor 5 implements a model-view-controller architecture and what `model.insertObject()` does\r\n     * is only adding nodes to the model. Additionally, you need to define\r\n     * {@glink framework/architecture/editing-engine#conversion converters} between the model and view\r\n     * and define those nodes in the {@glink framework/architecture/editing-engine#schema schema}.\r\n     *\r\n     * # Examples\r\n     *\r\n     * Use the following code to insert an object at the current selection and keep the selection on the inserted element:\r\n     *\r\n     * ```ts\r\n     * const rawHtmlEmbedElement = writer.createElement( 'rawHtml' );\r\n     *\r\n     * model.insertObject( rawHtmlEmbedElement, null, null, {\r\n     * \tsetSelection: 'on'\r\n     * } );\r\n     * ```\r\n     *\r\n     * Use the following code to insert an object at the current selection and nudge the selection after the inserted object:\r\n     *\r\n     * ```ts\r\n     * const pageBreakElement = writer.createElement( 'pageBreak' );\r\n     *\r\n     * model.insertObject( pageBreakElement, null, null, {\r\n     * \tsetSelection: 'after'\r\n     * } );\r\n     * ```\r\n     *\r\n     * Use the following code to insert an object at the current selection and avoid splitting the content (non-destructive insertion):\r\n     *\r\n     * ```ts\r\n     * const tableElement = writer.createElement( 'table' );\r\n     *\r\n     * model.insertObject( tableElement, null, null, {\r\n     * \tfindOptimalPosition: 'auto'\r\n     * } );\r\n     * ```\r\n     *\r\n     * Use the following code to insert an object at the specific range (also: replace the content of the range):\r\n     *\r\n     * ```ts\r\n     * const tableElement = writer.createElement( 'table' );\r\n     * const range = model.createRangeOn( model.document.getRoot().getChild( 1 ) );\r\n     *\r\n     * model.insertObject( tableElement, range );\r\n     * ```\r\n     *\r\n     * @param element An object to be inserted into the model document.\r\n     * @param selectable A selectable where the content should be inserted. If not specified, the current\r\n     * {@link module:engine/model/document~Document#selection document selection} will be used instead.\r\n     * @param placeOrOffset Specifies the exact place or offset for the insertion to take place, relative to `selectable`.\r\n     * @param options Additional options.\r\n     * @param options.findOptimalPosition An option that, when set, adjusts the insertion position (relative to\r\n     * `selectable` and `placeOrOffset`) so that the content of `selectable` is not split upon insertion (a.k.a. non-destructive insertion).\r\n     * * When `'auto'`, the algorithm will decide whether to insert the object before or after `selectable` to avoid content splitting.\r\n     * * When `'before'`, the closest position before `selectable` will be used that will not result in content splitting.\r\n     * * When `'after'`, the closest position after `selectable` will be used that will not result in content splitting.\r\n     *\r\n     * Note that this option only works for block objects. Inline objects are inserted into text and do not split blocks.\r\n     * @param options.setSelection An option that, when set, moves the\r\n     * {@link module:engine/model/document~Document#selection document selection} after inserting the object.\r\n     * * When `'on'`, the document selection will be set on the inserted object.\r\n     * * When `'after'`, the document selection will move to the closest text node after the inserted object. If there is no\r\n     * such text node, a paragraph will be created and the document selection will be moved inside it.\r\n     * at the insertion position.\r\n     */\r\n    insertObject(element, selectable, placeOrOffset, options, ...rest) {\r\n        const selection = normalizeSelectable(selectable, placeOrOffset);\r\n        // Note that options are fired as 2 arguments for backward compatibility with the decorated method.\r\n        // Passing all call arguments so it acts like decorated method.\r\n        return this.fire('insertObject', [element, selection, options, options, ...rest]);\r\n    }\r\n    /**\r\n     * Deletes content of the selection and merge siblings. The resulting selection is always collapsed.\r\n     *\r\n     * **Note:** For the sake of predictability, the resulting selection should always be collapsed.\r\n     * In cases where a feature wants to modify deleting behavior so selection isn't collapsed\r\n     * (e.g. a table feature may want to keep row selection after pressing <kbd>Backspace</kbd>),\r\n     * then that behavior should be implemented in the view's listener. At the same time, the table feature\r\n     * will need to modify this method's behavior too, e.g. to \"delete contents and then collapse\r\n     * the selection inside the last selected cell\" or \"delete the row and collapse selection somewhere near\".\r\n     * That needs to be done in order to ensure that other features which use `deleteContent()` will work well with tables.\r\n     *\r\n     * @fires deleteContent\r\n     * @param selection Selection of which the content should be deleted.\r\n     * @param options.leaveUnmerged Whether to merge elements after removing the content of the selection.\r\n     *\r\n     * For example `<heading1>x[x</heading1><paragraph>y]y</paragraph>` will become:\r\n     *\r\n     * * `<heading1>x^y</heading1>` with the option disabled (`leaveUnmerged == false`)\r\n     * * `<heading1>x^</heading1><paragraph>y</paragraph>` with enabled (`leaveUnmerged == true`).\r\n     *\r\n     * Note: {@link module:engine/model/schema~Schema#isObject object} and {@link module:engine/model/schema~Schema#isLimit limit}\r\n     * elements will not be merged.\r\n     *\r\n     * @param options.doNotResetEntireContent Whether to skip replacing the entire content with a\r\n     * paragraph when the entire content was selected.\r\n     *\r\n     * For example `<heading1>[x</heading1><paragraph>y]</paragraph>` will become:\r\n     *\r\n     * * `<paragraph>^</paragraph>` with the option disabled (`doNotResetEntireContent == false`)\r\n     * * `<heading1>^</heading1>` with enabled (`doNotResetEntireContent == true`)\r\n     *\r\n     * @param options.doNotAutoparagraph Whether to create a paragraph if after content deletion selection is moved\r\n     * to a place where text cannot be inserted.\r\n     *\r\n     * For example `<paragraph>x</paragraph>[<imageBlock src=\"foo.jpg\"></imageBlock>]` will become:\r\n     *\r\n     * * `<paragraph>x</paragraph><paragraph>[]</paragraph>` with the option disabled (`doNotAutoparagraph == false`)\r\n     * * `<paragraph>x[]</paragraph>` with the option enabled (`doNotAutoparagraph == true`).\r\n     *\r\n     * **Note:** if there is no valid position for the selection, the paragraph will always be created:\r\n     *\r\n     * `[<imageBlock src=\"foo.jpg\"></imageBlock>]` -> `<paragraph>[]</paragraph>`.\r\n     *\r\n     * @param options.direction The direction in which the content is being consumed.\r\n     * Deleting backward corresponds to using the <kbd>Backspace</kbd> key, while deleting content forward corresponds to\r\n     * the <kbd>Shift</kbd>+<kbd>Backspace</kbd> keystroke.\r\n     */\r\n    deleteContent(selection, options) {\r\n        deleteContent(this, selection, options);\r\n    }\r\n    /**\r\n     * Modifies the selection. Currently, the supported modifications are:\r\n     *\r\n     * * Extending. The selection focus is moved in the specified `options.direction` with a step specified in `options.unit`.\r\n     * Possible values for `unit` are:\r\n     *  * `'character'` (default) - moves selection by one user-perceived character. In most cases this means moving by one\r\n     *  character in `String` sense. However, unicode also defines \"combing marks\". These are special symbols, that combines\r\n     *  with a symbol before it (\"base character\") to create one user-perceived character. For example, `q̣̇` is a normal\r\n     *  letter `q` with two \"combining marks\": upper dot (`Ux0307`) and lower dot (`Ux0323`). For most actions, i.e. extending\r\n     *  selection by one position, it is correct to include both \"base character\" and all of it's \"combining marks\". That is\r\n     *  why `'character'` value is most natural and common method of modifying selection.\r\n     *  * `'codePoint'` - moves selection by one unicode code point. In contrary to, `'character'` unit, this will insert\r\n     *  selection between \"base character\" and \"combining mark\", because \"combining marks\" have their own unicode code points.\r\n     *  However, for technical reasons, unicode code points with values above `UxFFFF` are represented in native `String` by\r\n     *  two characters, called \"surrogate pairs\". Halves of \"surrogate pairs\" have a meaning only when placed next to each other.\r\n     *  For example `𨭎` is represented in `String` by `\\uD862\\uDF4E`. Both `\\uD862` and `\\uDF4E` do not have any meaning\r\n     *  outside the pair (are rendered as ? when alone). Position between them would be incorrect. In this case, selection\r\n     *  extension will include whole \"surrogate pair\".\r\n     *  * `'word'` - moves selection by a whole word.\r\n     *\r\n     * **Note:** if you extend a forward selection in a backward direction you will in fact shrink it.\r\n     *\r\n     * @fires modifySelection\r\n     * @param selection The selection to modify.\r\n     * @param options.direction The direction in which the selection should be modified.\r\n     * @param options.unit The unit by which selection should be modified.\r\n     * @param options.treatEmojiAsSingleUnit Whether multi-characer emoji sequences should be handled as single unit.\r\n     */\r\n    modifySelection(selection, options) {\r\n        modifySelection(this, selection, options);\r\n    }\r\n    /**\r\n     * Gets a clone of the selected content.\r\n     *\r\n     * For example, for the following selection:\r\n     *\r\n     * ```html\r\n     * <paragraph>x</paragraph>\r\n     * <blockQuote>\r\n     * \t<paragraph>y</paragraph>\r\n     * \t<heading1>fir[st</heading1>\r\n     * </blockQuote>\r\n     * <paragraph>se]cond</paragraph>\r\n     * <paragraph>z</paragraph>\r\n     * ```\r\n     *\r\n     * It will return a document fragment with such a content:\r\n     *\r\n     * ```html\r\n     * <blockQuote>\r\n     * \t<heading1>st</heading1>\r\n     * </blockQuote>\r\n     * <paragraph>se</paragraph>\r\n     * ```\r\n     *\r\n     * @fires getSelectedContent\r\n     * @param selection The selection of which content will be returned.\r\n     */\r\n    getSelectedContent(selection) {\r\n        return getSelectedContent(this, selection);\r\n    }\r\n    /**\r\n     * Checks whether the given {@link module:engine/model/range~Range range} or\r\n     * {@link module:engine/model/element~Element element} has any meaningful content.\r\n     *\r\n     * Meaningful content is:\r\n     *\r\n     * * any text node (`options.ignoreWhitespaces` allows controlling whether this text node must also contain\r\n     * any non-whitespace characters),\r\n     * * or any {@link module:engine/model/schema~Schema#isContent content element},\r\n     * * or any {@link module:engine/model/markercollection~Marker marker} which\r\n     * {@link module:engine/model/markercollection~Marker#_affectsData affects data}.\r\n     *\r\n     * This means that a range containing an empty `<paragraph></paragraph>` is not considered to have a meaningful content.\r\n     * However, a range containing an `<imageBlock></imageBlock>` (which would normally be marked in the schema as an object element)\r\n     * is considered non-empty.\r\n     *\r\n     * @param rangeOrElement Range or element to check.\r\n     * @param options.ignoreWhitespaces Whether text node with whitespaces only should be considered empty.\r\n     * @param options.ignoreMarkers Whether markers should be ignored.\r\n     */\r\n    hasContent(rangeOrElement, options = {}) {\r\n        const range = rangeOrElement instanceof ModelRange ? rangeOrElement : ModelRange._createIn(rangeOrElement);\r\n        if (range.isCollapsed) {\r\n            return false;\r\n        }\r\n        const { ignoreWhitespaces = false, ignoreMarkers = false } = options;\r\n        // Check if there are any markers which affects data in this given range.\r\n        if (!ignoreMarkers) {\r\n            for (const intersectingMarker of this.markers.getMarkersIntersectingRange(range)) {\r\n                if (intersectingMarker.affectsData) {\r\n                    return true;\r\n                }\r\n            }\r\n        }\r\n        for (const item of range.getItems()) {\r\n            if (this.schema.isContent(item)) {\r\n                if (item.is('$textProxy')) {\r\n                    if (!ignoreWhitespaces) {\r\n                        return true;\r\n                    }\r\n                    else if (item.data.search(/\\S/) !== -1) {\r\n                        return true;\r\n                    }\r\n                }\r\n                else {\r\n                    return true;\r\n                }\r\n            }\r\n        }\r\n        return false;\r\n    }\r\n    /**\r\n     * Check whether given selectable is at a place in the model where it can be edited (returns `true`) or not (returns `false`).\r\n     *\r\n     * Should be used instead of {@link module:core/editor/editor~Editor#isReadOnly} to check whether a user action can happen at\r\n     * given selectable. It may be decorated and used differently in different environment (e.g. multi-root editor can disable\r\n     * a particular root).\r\n     *\r\n     * This method is decorated. Although this method accepts any parameter of `Selectable` type, the\r\n     * {@link ~Model#event:canEditAt `canEditAt` event} is fired with `selectable` normalized to an instance of\r\n     * {@link module:engine/model/selection~Selection} or {@link module:engine/model/documentselection~DocumentSelection}\r\n     *\r\n     * @fires canEditAt\r\n     */\r\n    canEditAt(selectable) {\r\n        const selection = normalizeSelectable(selectable);\r\n        return this.fire('canEditAt', [selection]);\r\n    }\r\n    /**\r\n     * Creates a position from the given root and path in that root.\r\n     *\r\n     * Note: This method is also available as\r\n     * {@link module:engine/model/writer~Writer#createPositionFromPath `Writer#createPositionFromPath()`}.\r\n     *\r\n     * @param root Root of the position.\r\n     * @param path Position path. See {@link module:engine/model/position~Position#path}.\r\n     * @param stickiness Position stickiness. See {@link module:engine/model/position~PositionStickiness}.\r\n     */\r\n    createPositionFromPath(root, path, stickiness) {\r\n        return new ModelPosition(root, path, stickiness);\r\n    }\r\n    /**\r\n     * Creates position at the given location. The location can be specified as:\r\n     *\r\n     * * a {@link module:engine/model/position~Position position},\r\n     * * a parent element and offset in that element,\r\n     * * a parent element and `'end'` (the position will be set at the end of that element),\r\n     * * a {@link module:engine/model/item~Item model item} and `'before'` or `'after'`\r\n     * (the position will be set before or after the given model item).\r\n     *\r\n     * This method is a shortcut to other factory methods such as:\r\n     *\r\n     * * {@link module:engine/model/model~Model#createPositionBefore `createPositionBefore()`},\r\n     * * {@link module:engine/model/model~Model#createPositionAfter `createPositionAfter()`}.\r\n     *\r\n     * Note: This method is also available as\r\n     * {@link module:engine/model/writer~Writer#createPositionAt `Writer#createPositionAt()`},\r\n     *\r\n     * @param itemOrPosition\r\n     * @param offset Offset or one of the flags. Used only when first parameter is a {@link module:engine/model/item~Item model item}.\r\n     */\r\n    createPositionAt(itemOrPosition, offset) {\r\n        return ModelPosition._createAt(itemOrPosition, offset);\r\n    }\r\n    /**\r\n     * Creates a new position after the given {@link module:engine/model/item~Item model item}.\r\n     *\r\n     * Note: This method is also available as\r\n     * {@link module:engine/model/writer~Writer#createPositionAfter `Writer#createPositionAfter()`}.\r\n     *\r\n     * @param item Item after which the position should be placed.\r\n     */\r\n    createPositionAfter(item) {\r\n        return ModelPosition._createAfter(item);\r\n    }\r\n    /**\r\n     * Creates a new position before the given {@link module:engine/model/item~Item model item}.\r\n     *\r\n     * Note: This method is also available as\r\n     * {@link module:engine/model/writer~Writer#createPositionBefore `Writer#createPositionBefore()`}.\r\n     *\r\n     * @param item Item before which the position should be placed.\r\n     */\r\n    createPositionBefore(item) {\r\n        return ModelPosition._createBefore(item);\r\n    }\r\n    /**\r\n     * Creates a range spanning from the `start` position to the `end` position.\r\n     *\r\n     * Note: This method is also available as\r\n     * {@link module:engine/model/writer~Writer#createRange `Writer#createRange()`}:\r\n     *\r\n     * ```ts\r\n     * model.change( writer => {\r\n     * \tconst range = writer.createRange( start, end );\r\n     * } );\r\n     * ```\r\n     *\r\n     * @param start Start position.\r\n     * @param end End position. If not set, the range will be collapsed to the `start` position.\r\n     */\r\n    createRange(start, end) {\r\n        return new ModelRange(start, end);\r\n    }\r\n    /**\r\n     * Creates a range inside the given element which starts before the first child of\r\n     * that element and ends after the last child of that element.\r\n     *\r\n     * Note: This method is also available as\r\n     * {@link module:engine/model/writer~Writer#createRangeIn `Writer#createRangeIn()`}:\r\n     *\r\n     * ```ts\r\n     * model.change( writer => {\r\n     * \tconst range = writer.createRangeIn( paragraph );\r\n     * } );\r\n     * ```\r\n     *\r\n     * @param element Element which is a parent for the range.\r\n     */\r\n    createRangeIn(element) {\r\n        return ModelRange._createIn(element);\r\n    }\r\n    /**\r\n     * Creates a range that starts before the given {@link module:engine/model/item~Item model item} and ends after it.\r\n     *\r\n     * Note: This method is also available on `writer` instance as\r\n     * {@link module:engine/model/writer~Writer#createRangeOn `Writer.createRangeOn()`}:\r\n     *\r\n     * ```ts\r\n     * model.change( writer => {\r\n     * \tconst range = writer.createRangeOn( paragraph );\r\n     * } );\r\n     * ```\r\n     *\r\n     * @param item\r\n     */\r\n    createRangeOn(item) {\r\n        return ModelRange._createOn(item);\r\n    }\r\n    createSelection(...args) {\r\n        return new ModelSelection(...args);\r\n    }\r\n    /**\r\n     * Creates a {@link module:engine/model/batch~Batch} instance.\r\n     *\r\n     * **Note:** In most cases creating a batch instance is not necessary as they are created when using:\r\n     *\r\n     * * {@link #change `change()`},\r\n     * * {@link #enqueueChange `enqueueChange()`}.\r\n     *\r\n     * @param type {@link module:engine/model/batch~Batch#constructor The type} of the batch.\r\n     */\r\n    createBatch(type) {\r\n        return new Batch(type);\r\n    }\r\n    /**\r\n     * Creates an operation instance from a JSON object (parsed JSON string).\r\n     *\r\n     * This is an alias for {@link module:engine/model/operation/operationfactory~OperationFactory.fromJSON `OperationFactory.fromJSON()`}.\r\n     *\r\n     * @param json Deserialized JSON object.\r\n     */\r\n    createOperationFromJSON(json) {\r\n        return OperationFactory.fromJSON(json, this.document);\r\n    }\r\n    /**\r\n     * Removes all events listeners set by model instance and destroys {@link module:engine/model/document~Document}.\r\n     */\r\n    destroy() {\r\n        this.document.destroy();\r\n        this.stopListening();\r\n    }\r\n    /**\r\n     * Common part of {@link module:engine/model/model~Model#change} and {@link module:engine/model/model~Model#enqueueChange}\r\n     * which calls callbacks and returns array of values returned by these callbacks.\r\n     *\r\n     */\r\n    _runPendingChanges() {\r\n        const ret = [];\r\n        this.fire('_beforeChanges');\r\n        try {\r\n            while (this._pendingChanges.length) {\r\n                // Create a new writer using batch instance created for this chain of changes.\r\n                const currentBatch = this._pendingChanges[0].batch;\r\n                this._currentWriter = new Writer(this, currentBatch);\r\n                // Execute changes callback and gather the returned value.\r\n                const callbackReturnValue = this._pendingChanges[0].callback(this._currentWriter);\r\n                ret.push(callbackReturnValue);\r\n                this.document._handleChangeBlock(this._currentWriter);\r\n                this._pendingChanges.shift();\r\n                this._currentWriter = null;\r\n            }\r\n        }\r\n        finally {\r\n            this._pendingChanges.length = 0;\r\n            this._currentWriter = null;\r\n            this.fire('_afterChanges');\r\n        }\r\n        return ret;\r\n    }\r\n}\r\n/**\r\n * Normalizes a selectable to a Selection or DocumentSelection.\r\n */\r\nfunction normalizeSelectable(selectable, placeOrOffset) {\r\n    if (!selectable) {\r\n        return;\r\n    }\r\n    if (selectable instanceof ModelSelection || selectable instanceof DocumentSelection) {\r\n        return selectable;\r\n    }\r\n    if (selectable instanceof Node) {\r\n        if (placeOrOffset || placeOrOffset === 0) {\r\n            return new ModelSelection(selectable, placeOrOffset);\r\n        }\r\n        else if (selectable.is('rootElement')) {\r\n            return new ModelSelection(selectable, 'in');\r\n        }\r\n        else {\r\n            return new ModelSelection(selectable, 'on');\r\n        }\r\n    }\r\n    return new ModelSelection(selectable);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/observer/clickobserver\r\n */\r\nimport DomEventObserver from './domeventobserver';\r\n/**\r\n * {@link module:engine/view/document~Document#event:click Click} event observer.\r\n *\r\n * Note that this observer is not available by default. To make it available it needs to be added to\r\n * {@link module:engine/view/view~View view controller} by a {@link module:engine/view/view~View#addObserver} method.\r\n */\r\nexport default class ClickObserver extends DomEventObserver {\r\n    constructor() {\r\n        super(...arguments);\r\n        /**\r\n         * @inheritDoc\r\n         */\r\n        this.domEventType = 'click';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    onDomEvent(domEvent) {\r\n        this.fire(domEvent.type, domEvent);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/observer/mouseobserver\r\n */\r\nimport DomEventObserver from './domeventobserver';\r\n/**\r\n * Mouse events observer.\r\n *\r\n * Note that this observer is not available by default. To make it available it needs to be added to\r\n * {@link module:engine/view/view~View} by {@link module:engine/view/view~View#addObserver} method.\r\n */\r\nexport default class MouseObserver extends DomEventObserver {\r\n    constructor() {\r\n        super(...arguments);\r\n        /**\r\n         * @inheritDoc\r\n         */\r\n        this.domEventType = ['mousedown', 'mouseup', 'mouseover', 'mouseout'];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    onDomEvent(domEvent) {\r\n        this.fire(domEvent.type, domEvent);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module engine/view/upcastwriter\r\n */\r\nimport DocumentFragment from './documentfragment';\r\nimport Element from './element';\r\nimport Text from './text';\r\nimport { isPlainObject } from 'lodash-es';\r\nimport Position from './position';\r\nimport Range from './range';\r\nimport Selection from './selection';\r\n/**\r\n * View upcast writer. It provides a set of methods used to manipulate non-semantic view trees.\r\n *\r\n * It should be used only while working on a non-semantic view\r\n * (e.g. a view created from HTML string on paste).\r\n * To manipulate a view which was or is being downcasted from the the model use the\r\n * {@link module:engine/view/downcastwriter~DowncastWriter downcast writer}.\r\n *\r\n * Read more about changing the view in the {@glink framework/architecture/editing-engine#changing-the-view Changing the view}\r\n * section of the {@glink framework/architecture/editing-engine Editing engine architecture} guide.\r\n *\r\n * Unlike `DowncastWriter`, which is available in the {@link module:engine/view/view~View#change `View#change()`} block,\r\n * `UpcastWriter` can be created wherever you need it:\r\n *\r\n * ```ts\r\n * const writer = new UpcastWriter( viewDocument );\r\n * const text = writer.createText( 'foo!' );\r\n *\r\n * writer.appendChild( text, someViewElement );\r\n * ```\r\n */\r\nexport default class UpcastWriter {\r\n    /**\r\n     * @param document The view document instance in which this upcast writer operates.\r\n     */\r\n    constructor(document) {\r\n        this.document = document;\r\n    }\r\n    /**\r\n     * Creates a new {@link module:engine/view/documentfragment~DocumentFragment} instance.\r\n     *\r\n     * @param children A list of nodes to be inserted into the created document fragment.\r\n     * @returns The created document fragment.\r\n     */\r\n    createDocumentFragment(children) {\r\n        return new DocumentFragment(this.document, children);\r\n    }\r\n    /**\r\n     * Creates a new {@link module:engine/view/element~Element} instance.\r\n     *\r\n     * Attributes can be passed in various formats:\r\n     *\r\n     * ```ts\r\n     * upcastWriter.createElement( 'div', { class: 'editor', contentEditable: 'true' } ); // object\r\n     * upcastWriter.createElement( 'div', [ [ 'class', 'editor' ], [ 'contentEditable', 'true' ] ] ); // map-like iterator\r\n     * upcastWriter.createElement( 'div', mapOfAttributes ); // map\r\n     * ```\r\n     *\r\n     * @param name Node name.\r\n     * @param attrs Collection of attributes.\r\n     * @param children A list of nodes to be inserted into created element.\r\n     * @returns Created element.\r\n     */\r\n    createElement(name, attrs, children) {\r\n        return new Element(this.document, name, attrs, children);\r\n    }\r\n    /**\r\n     * Creates a new {@link module:engine/view/text~Text} instance.\r\n     *\r\n     * @param data The text's data.\r\n     * @returns The created text node.\r\n     */\r\n    createText(data) {\r\n        return new Text(this.document, data);\r\n    }\r\n    /**\r\n     * Clones the provided element.\r\n     *\r\n     * @see module:engine/view/element~Element#_clone\r\n     * @param element Element to be cloned.\r\n     * @param deep If set to `true` clones element and all its children recursively. When set to `false`,\r\n     * element will be cloned without any children.\r\n     * @returns Clone of this element.\r\n     */\r\n    clone(element, deep = false) {\r\n        return element._clone(deep);\r\n    }\r\n    /**\r\n     * Appends a child node or a list of child nodes at the end of this node\r\n     * and sets the parent of these nodes to this element.\r\n     *\r\n     * @see module:engine/view/element~Element#_appendChild\r\n     * @param items Items to be inserted.\r\n     * @param element Element to which items will be appended.\r\n     * @returns Number of appended nodes.\r\n     */\r\n    appendChild(items, element) {\r\n        return element._appendChild(items);\r\n    }\r\n    /**\r\n     * Inserts a child node or a list of child nodes on the given index and sets the parent of these nodes to\r\n     * this element.\r\n     *\r\n     * @see module:engine/view/element~Element#_insertChild\r\n     * @param index Offset at which nodes should be inserted.\r\n     * @param items Items to be inserted.\r\n     * @param element Element to which items will be inserted.\r\n     * @returns Number of inserted nodes.\r\n     */\r\n    insertChild(index, items, element) {\r\n        return element._insertChild(index, items);\r\n    }\r\n    /**\r\n     * Removes the given number of child nodes starting at the given index and set the parent of these nodes to `null`.\r\n     *\r\n     * @see module:engine/view/element~Element#_removeChildren\r\n     * @param index Offset from which nodes will be removed.\r\n     * @param howMany Number of nodes to remove.\r\n     * @param element Element which children will be removed.\r\n     * @returns The array containing removed nodes.\r\n     */\r\n    removeChildren(index, howMany, element) {\r\n        return element._removeChildren(index, howMany);\r\n    }\r\n    /**\r\n     * Removes given element from the view structure. Will not have effect on detached elements.\r\n     *\r\n     * @param element Element which will be removed.\r\n     * @returns The array containing removed nodes.\r\n     */\r\n    remove(element) {\r\n        const parent = element.parent;\r\n        if (parent) {\r\n            return this.removeChildren(parent.getChildIndex(element), 1, parent);\r\n        }\r\n        return [];\r\n    }\r\n    /**\r\n     * Replaces given element with the new one in the view structure. Will not have effect on detached elements.\r\n     *\r\n     * @param oldElement Element which will be replaced.\r\n     * @param newElement Element which will be inserted in the place of the old element.\r\n     * @returns Whether old element was successfully replaced.\r\n     */\r\n    replace(oldElement, newElement) {\r\n        const parent = oldElement.parent;\r\n        if (parent) {\r\n            const index = parent.getChildIndex(oldElement);\r\n            this.removeChildren(index, 1, parent);\r\n            this.insertChild(index, newElement, parent);\r\n            return true;\r\n        }\r\n        return false;\r\n    }\r\n    /**\r\n     * Removes given element from view structure and places its children in its position.\r\n     * It does nothing if element has no parent.\r\n     *\r\n     * @param element Element to unwrap.\r\n     */\r\n    unwrapElement(element) {\r\n        const parent = element.parent;\r\n        if (parent) {\r\n            const index = parent.getChildIndex(element);\r\n            this.remove(element);\r\n            this.insertChild(index, element.getChildren(), parent);\r\n        }\r\n    }\r\n    /**\r\n     * Renames element by creating a copy of a given element but with its name changed and then moving contents of the\r\n     * old element to the new one.\r\n     *\r\n     * Since this function creates a new element and removes the given one, the new element is returned to keep reference.\r\n     *\r\n     * @param newName New element name.\r\n     * @param  element Element to be renamed.\r\n     * @returns New element or null if the old element was not replaced (happens for detached elements).\r\n     */\r\n    rename(newName, element) {\r\n        const newElement = new Element(this.document, newName, element.getAttributes(), element.getChildren());\r\n        return this.replace(element, newElement) ? newElement : null;\r\n    }\r\n    /**\r\n     * Adds or overwrites element's attribute with a specified key and value.\r\n     *\r\n     * ```ts\r\n     * writer.setAttribute( 'href', 'http://ckeditor.com', linkElement );\r\n     * ```\r\n     *\r\n     * @see module:engine/view/element~Element#_setAttribute\r\n     * @param key Attribute key.\r\n     * @param value Attribute value.\r\n     * @param element Element for which attribute will be set.\r\n     */\r\n    setAttribute(key, value, element) {\r\n        element._setAttribute(key, value);\r\n    }\r\n    /**\r\n     * Removes attribute from the element.\r\n     *\r\n     * ```ts\r\n     * writer.removeAttribute( 'href', linkElement );\r\n     * ```\r\n     *\r\n     * @see module:engine/view/element~Element#_removeAttribute\r\n     * @param key Attribute key.\r\n     * @param element Element from which attribute will be removed.\r\n     */\r\n    removeAttribute(key, element) {\r\n        element._removeAttribute(key);\r\n    }\r\n    /**\r\n     * Adds specified class to the element.\r\n     *\r\n     * ```ts\r\n     * writer.addClass( 'foo', linkElement );\r\n     * writer.addClass( [ 'foo', 'bar' ], linkElement );\r\n     * ```\r\n     *\r\n     * @see module:engine/view/element~Element#_addClass\r\n     * @param className Single class name or array of class names which will be added.\r\n     * @param element Element for which class will be added.\r\n     */\r\n    addClass(className, element) {\r\n        element._addClass(className);\r\n    }\r\n    /**\r\n     * Removes specified class from the element.\r\n     *\r\n     * ```ts\r\n     * writer.removeClass( 'foo', linkElement );\r\n     * writer.removeClass( [ 'foo', 'bar' ], linkElement );\r\n     * ```\r\n     *\r\n     * @see module:engine/view/element~Element#_removeClass\r\n     * @param className Single class name or array of class names which will be removed.\r\n     * @param element Element from which class will be removed.\r\n     */\r\n    removeClass(className, element) {\r\n        element._removeClass(className);\r\n    }\r\n    setStyle(property, valueOrElement, element) {\r\n        if (isPlainObject(property) && element === undefined) {\r\n            valueOrElement._setStyle(property);\r\n        }\r\n        else {\r\n            element._setStyle(property, valueOrElement);\r\n        }\r\n    }\r\n    /**\r\n     * Removes specified style from the element.\r\n     *\r\n     * ```ts\r\n     * writer.removeStyle( 'color', element );  // Removes 'color' style.\r\n     * writer.removeStyle( [ 'color', 'border-top' ], element ); // Removes both 'color' and 'border-top' styles.\r\n     * ```\r\n     *\r\n     * **Note**: This method can work with normalized style names if\r\n     * {@link module:engine/controller/datacontroller~DataController#addStyleProcessorRules a particular style processor rule is enabled}.\r\n     * See {@link module:engine/view/stylesmap~StylesMap#remove `StylesMap#remove()`} for details.\r\n     *\r\n     * @see module:engine/view/element~Element#_removeStyle\r\n     * @param property Style property name or names to be removed.\r\n     * @param element Element from which style will be removed.\r\n     */\r\n    removeStyle(property, element) {\r\n        element._removeStyle(property);\r\n    }\r\n    /**\r\n     * Sets a custom property on element. Unlike attributes, custom properties are not rendered to the DOM,\r\n     * so they can be used to add special data to elements.\r\n     *\r\n     * @see module:engine/view/element~Element#_setCustomProperty\r\n     * @param key Custom property name/key.\r\n     * @param value Custom property value to be stored.\r\n     * @param element Element for which custom property will be set.\r\n     */\r\n    setCustomProperty(key, value, element) {\r\n        element._setCustomProperty(key, value);\r\n    }\r\n    /**\r\n     * Removes a custom property stored under the given key.\r\n     *\r\n     * @see module:engine/view/element~Element#_removeCustomProperty\r\n     * @param key Name/key of the custom property to be removed.\r\n     * @param element Element from which the custom property will be removed.\r\n     * @returns Returns true if property was removed.\r\n     */\r\n    removeCustomProperty(key, element) {\r\n        return element._removeCustomProperty(key);\r\n    }\r\n    /**\r\n     * Creates position at the given location. The location can be specified as:\r\n     *\r\n     * * a {@link module:engine/view/position~Position position},\r\n     * * parent element and offset (offset defaults to `0`),\r\n     * * parent element and `'end'` (sets position at the end of that element),\r\n     * * {@link module:engine/view/item~Item view item} and `'before'` or `'after'` (sets position before or after given view item).\r\n     *\r\n     * This method is a shortcut to other constructors such as:\r\n     *\r\n     * * {@link #createPositionBefore},\r\n     * * {@link #createPositionAfter},\r\n     *\r\n     * @param offset Offset or one of the flags. Used only when first parameter is a {@link module:engine/view/item~Item view item}.\r\n     */\r\n    createPositionAt(itemOrPosition, offset) {\r\n        return Position._createAt(itemOrPosition, offset);\r\n    }\r\n    /**\r\n     * Creates a new position after given view item.\r\n     *\r\n     * @param item View item after which the position should be located.\r\n     */\r\n    createPositionAfter(item) {\r\n        return Position._createAfter(item);\r\n    }\r\n    /**\r\n     * Creates a new position before given view item.\r\n     *\r\n     * @param item View item before which the position should be located.\r\n     */\r\n    createPositionBefore(item) {\r\n        return Position._createBefore(item);\r\n    }\r\n    /**\r\n     * Creates a range spanning from `start` position to `end` position.\r\n     *\r\n     * **Note:** This factory method creates it's own {@link module:engine/view/position~Position} instances basing on passed values.\r\n     *\r\n     * @param start Start position.\r\n     * @param end End position. If not set, range will be collapsed at `start` position.\r\n     */\r\n    createRange(start, end) {\r\n        return new Range(start, end);\r\n    }\r\n    /**\r\n     * Creates a range that starts before given {@link module:engine/view/item~Item view item} and ends after it.\r\n     */\r\n    createRangeOn(item) {\r\n        return Range._createOn(item);\r\n    }\r\n    /**\r\n     * Creates a range inside an {@link module:engine/view/element~Element element} which starts before the first child of\r\n     * that element and ends after the last child of that element.\r\n     *\r\n     * @param element Element which is a parent for the range.\r\n     */\r\n    createRangeIn(element) {\r\n        return Range._createIn(element);\r\n    }\r\n    createSelection(...args) {\r\n        return new Selection(...args);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nconst HEX_COLOR_REGEXP = /^#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\r\nconst RGB_COLOR_REGEXP = /^rgb\\([ ]?([0-9]{1,3}[ %]?,[ ]?){2,3}[0-9]{1,3}[ %]?\\)$/i;\r\nconst RGBA_COLOR_REGEXP = /^rgba\\([ ]?([0-9]{1,3}[ %]?,[ ]?){3}(1|[0-9]+%|[0]?\\.?[0-9]+)\\)$/i;\r\nconst HSL_COLOR_REGEXP = /^hsl\\([ ]?([0-9]{1,3}[ %]?[,]?[ ]*){3}(1|[0-9]+%|[0]?\\.?[0-9]+)?\\)$/i;\r\nconst HSLA_COLOR_REGEXP = /^hsla\\([ ]?([0-9]{1,3}[ %]?,[ ]?){2,3}(1|[0-9]+%|[0]?\\.?[0-9]+)\\)$/i;\r\n// Note: This regexp hardcodes a single level of nested () for values such as `calc( var( ...) + ...)`.\r\n// If this gets more complex, a proper parser should be used instead.\r\nconst CSS_SHORTHAND_VALUE_REGEXP = /\\w+\\((?:[^()]|\\([^()]*\\))*\\)|\\S+/gi;\r\nconst COLOR_NAMES = new Set([\r\n    // CSS Level 1\r\n    'black', 'silver', 'gray', 'white', 'maroon', 'red', 'purple', 'fuchsia',\r\n    'green', 'lime', 'olive', 'yellow', 'navy', 'blue', 'teal', 'aqua',\r\n    // CSS Level 2 (Revision 1)\r\n    'orange',\r\n    // CSS Color Module Level 3\r\n    'aliceblue', 'antiquewhite', 'aquamarine', 'azure', 'beige', 'bisque', 'blanchedalmond', 'blueviolet', 'brown',\r\n    'burlywood', 'cadetblue', 'chartreuse', 'chocolate', 'coral', 'cornflowerblue', 'cornsilk', 'crimson', 'cyan',\r\n    'darkblue', 'darkcyan', 'darkgoldenrod', 'darkgray', 'darkgreen', 'darkgrey', 'darkkhaki', 'darkmagenta',\r\n    'darkolivegreen', 'darkorange', 'darkorchid', 'darkred', 'darksalmon', 'darkseagreen', 'darkslateblue',\r\n    'darkslategray', 'darkslategrey', 'darkturquoise', 'darkviolet', 'deeppink', 'deepskyblue', 'dimgray', 'dimgrey',\r\n    'dodgerblue', 'firebrick', 'floralwhite', 'forestgreen', 'gainsboro', 'ghostwhite', 'gold', 'goldenrod',\r\n    'greenyellow', 'grey', 'honeydew', 'hotpink', 'indianred', 'indigo', 'ivory', 'khaki', 'lavender', 'lavenderblush',\r\n    'lawngreen', 'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan', 'lightgoldenrodyellow', 'lightgray',\r\n    'lightgreen', 'lightgrey', 'lightpink', 'lightsalmon', 'lightseagreen', 'lightskyblue', 'lightslategray',\r\n    'lightslategrey', 'lightsteelblue', 'lightyellow', 'limegreen', 'linen', 'magenta', 'mediumaquamarine',\r\n    'mediumblue', 'mediumorchid', 'mediumpurple', 'mediumseagreen', 'mediumslateblue', 'mediumspringgreen',\r\n    'mediumturquoise', 'mediumvioletred', 'midnightblue', 'mintcream', 'mistyrose', 'moccasin', 'navajowhite',\r\n    'oldlace', 'olivedrab', 'orangered', 'orchid', 'palegoldenrod', 'palegreen', 'paleturquoise', 'palevioletred',\r\n    'papayawhip', 'peachpuff', 'peru', 'pink', 'plum', 'powderblue', 'rosybrown', 'royalblue', 'saddlebrown', 'salmon',\r\n    'sandybrown', 'seagreen', 'seashell', 'sienna', 'skyblue', 'slateblue', 'slategray', 'slategrey', 'snow',\r\n    'springgreen', 'steelblue', 'tan', 'thistle', 'tomato', 'turquoise', 'violet', 'wheat', 'whitesmoke', 'yellowgreen',\r\n    // CSS Color Module Level 3 (System Colors)\r\n    'activeborder', 'activecaption', 'appworkspace', 'background', 'buttonface', 'buttonhighlight', 'buttonshadow',\r\n    'buttontext', 'captiontext', 'graytext', 'highlight', 'highlighttext', 'inactiveborder', 'inactivecaption',\r\n    'inactivecaptiontext', 'infobackground', 'infotext', 'menu', 'menutext', 'scrollbar', 'threeddarkshadow',\r\n    'threedface', 'threedhighlight', 'threedlightshadow', 'threedshadow', 'window', 'windowframe', 'windowtext',\r\n    // CSS Color Module Level 4\r\n    'rebeccapurple',\r\n    // Keywords\r\n    'currentcolor', 'transparent'\r\n]);\r\n/**\r\n * Checks if string contains [color](https://developer.mozilla.org/en-US/docs/Web/CSS/color) CSS value.\r\n *\r\n * ```ts\r\n * isColor( '#f00' );\t\t\t\t\t\t// true\r\n * isColor( '#AA00BB33' );\t\t\t\t\t// true\r\n * isColor( 'rgb(0, 0, 250)' );\t\t\t\t// true\r\n * isColor( 'hsla(240, 100%, 50%, .7)' );\t// true\r\n * isColor( 'deepskyblue' );\t\t\t\t// true\r\n * ```\r\n *\r\n * **Note**: It does not support CSS Level 4 whitespace syntax, system colors and radius values for HSL colors.\r\n */\r\nexport function isColor(string) {\r\n    // As far as I was able to test checking some pre-conditions is faster than joining each test with ||.\r\n    if (string.startsWith('#')) {\r\n        return HEX_COLOR_REGEXP.test(string);\r\n    }\r\n    if (string.startsWith('rgb')) {\r\n        return RGB_COLOR_REGEXP.test(string) || RGBA_COLOR_REGEXP.test(string);\r\n    }\r\n    if (string.startsWith('hsl')) {\r\n        return HSL_COLOR_REGEXP.test(string) || HSLA_COLOR_REGEXP.test(string);\r\n    }\r\n    // Array check > RegExp test.\r\n    return COLOR_NAMES.has(string.toLowerCase());\r\n}\r\nconst lineStyleValues = ['none', 'hidden', 'dotted', 'dashed', 'solid', 'double', 'groove', 'ridge', 'inset', 'outset'];\r\n/**\r\n * Checks if string contains [line style](https://developer.mozilla.org/en-US/docs/Web/CSS/border-style) CSS value.\r\n */\r\nexport function isLineStyle(string) {\r\n    return lineStyleValues.includes(string);\r\n}\r\nconst lengthRegExp = /^([+-]?[0-9]*([.][0-9]+)?(px|cm|mm|in|pc|pt|ch|em|ex|rem|vh|vw|vmin|vmax)|0)$/;\r\n/**\r\n * Checks if string contains [length](https://developer.mozilla.org/en-US/docs/Web/CSS/length) CSS value.\r\n */\r\nexport function isLength(string) {\r\n    return lengthRegExp.test(string);\r\n}\r\nconst PERCENTAGE_VALUE_REGEXP = /^[+-]?[0-9]*([.][0-9]+)?%$/;\r\n/**\r\n * Checks if string contains [percentage](https://developer.mozilla.org/en-US/docs/Web/CSS/percentage) CSS value.\r\n */\r\nexport function isPercentage(string) {\r\n    return PERCENTAGE_VALUE_REGEXP.test(string);\r\n}\r\nconst repeatValues = ['repeat-x', 'repeat-y', 'repeat', 'space', 'round', 'no-repeat'];\r\n/**\r\n * Checks if string contains [background repeat](https://developer.mozilla.org/en-US/docs/Web/CSS/background-repeat) CSS value.\r\n */\r\nexport function isRepeat(string) {\r\n    return repeatValues.includes(string);\r\n}\r\nconst positionValues = ['center', 'top', 'bottom', 'left', 'right'];\r\n/**\r\n * Checks if string contains [background position](https://developer.mozilla.org/en-US/docs/Web/CSS/background-position) CSS value.\r\n */\r\nexport function isPosition(string) {\r\n    return positionValues.includes(string);\r\n}\r\nconst attachmentValues = ['fixed', 'scroll', 'local'];\r\n/**\r\n * Checks if string contains [background attachment](https://developer.mozilla.org/en-US/docs/Web/CSS/background-attachment) CSS value.\r\n */\r\nexport function isAttachment(string) {\r\n    return attachmentValues.includes(string);\r\n}\r\nconst urlRegExp = /^url\\(/;\r\n/**\r\n * Checks if string contains [URL](https://developer.mozilla.org/en-US/docs/Web/CSS/url) CSS value.\r\n */\r\nexport function isURL(string) {\r\n    return urlRegExp.test(string);\r\n}\r\n/**\r\n * Parses box sides as individual values.\r\n */\r\nexport function getBoxSidesValues(value = '') {\r\n    if (value === '') {\r\n        return { top: undefined, right: undefined, bottom: undefined, left: undefined };\r\n    }\r\n    const values = getShorthandValues(value);\r\n    const top = values[0];\r\n    const bottom = values[2] || top;\r\n    const right = values[1] || top;\r\n    const left = values[3] || right;\r\n    return { top, bottom, right, left };\r\n}\r\n/**\r\n * Default reducer for CSS properties that concerns edges of a box\r\n * [shorthand](https://developer.mozilla.org/en-US/docs/Web/CSS/Shorthand_properties) notations:\r\n *\r\n * ```ts\r\n * stylesProcessor.setReducer( 'padding', getBoxSidesValueReducer( 'padding' ) );\r\n * ```\r\n */\r\nexport function getBoxSidesValueReducer(styleShorthand) {\r\n    return (value) => {\r\n        const { top, right, bottom, left } = value;\r\n        const reduced = [];\r\n        if (![top, right, left, bottom].every(value => !!value)) {\r\n            if (top) {\r\n                reduced.push([styleShorthand + '-top', top]);\r\n            }\r\n            if (right) {\r\n                reduced.push([styleShorthand + '-right', right]);\r\n            }\r\n            if (bottom) {\r\n                reduced.push([styleShorthand + '-bottom', bottom]);\r\n            }\r\n            if (left) {\r\n                reduced.push([styleShorthand + '-left', left]);\r\n            }\r\n        }\r\n        else {\r\n            reduced.push([styleShorthand, getBoxSidesShorthandValue(value)]);\r\n        }\r\n        return reduced;\r\n    };\r\n}\r\n/**\r\n * Returns a [shorthand](https://developer.mozilla.org/en-US/docs/Web/CSS/Shorthand_properties) notation\r\n * of a CSS property value.\r\n *\r\n * ```ts\r\n * getBoxSidesShorthandValue( { top: '1px', right: '1px', bottom: '2px', left: '1px' } );\r\n * // will return '1px 1px 2px'\r\n * ```\r\n */\r\nexport function getBoxSidesShorthandValue({ top, right, bottom, left }) {\r\n    const out = [];\r\n    if (left !== right) {\r\n        out.push(top, right, bottom, left);\r\n    }\r\n    else if (bottom !== top) {\r\n        out.push(top, right, bottom);\r\n    }\r\n    else if (right !== top) {\r\n        out.push(top, right);\r\n    }\r\n    else {\r\n        out.push(top);\r\n    }\r\n    return out.join(' ');\r\n}\r\n/**\r\n * Creates a normalizer for a [shorthand](https://developer.mozilla.org/en-US/docs/Web/CSS/Shorthand_properties) 1-to-4 value.\r\n *\r\n * ```ts\r\n * stylesProcessor.setNormalizer( 'margin', getPositionShorthandNormalizer( 'margin' ) );\r\n * ```\r\n */\r\nexport function getPositionShorthandNormalizer(shorthand) {\r\n    return (value) => {\r\n        return {\r\n            path: shorthand,\r\n            value: getBoxSidesValues(value)\r\n        };\r\n    };\r\n}\r\n/**\r\n * Parses parts of a 1-to-4 value notation - handles some CSS values with spaces (like RGB()).\r\n *\r\n * ```ts\r\n * getShorthandValues( 'red blue RGB(0, 0, 0)');\r\n * // will return [ 'red', 'blue', 'RGB(0, 0, 0)' ]\r\n * ```\r\n */\r\nexport function getShorthandValues(string) {\r\n    const matches = string.matchAll(CSS_SHORTHAND_VALUE_REGEXP);\r\n    return Array.from(matches).map(i => i[0]);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { getShorthandValues, isAttachment, isColor, isPosition, isRepeat, isURL } from './utils';\r\n/**\r\n * Adds a background CSS styles processing rules.\r\n *\r\n * ```ts\r\n * editor.data.addStyleProcessorRules( addBackgroundRules );\r\n * ```\r\n *\r\n * The normalized value is stored as:\r\n *\r\n * ```ts\r\n * const styles = {\r\n * \tbackground: {\r\n * \t\tcolor,\r\n * \t\trepeat,\r\n * \t\tposition,\r\n * \t\tattachment,\r\n * \t\timage\r\n * \t}\r\n * };\r\n * ````\r\n *\r\n * **Note**: Currently only `'background-color'` longhand value is parsed besides `'background'` shorthand. The reducer also supports only\r\n * `'background-color'` value.\r\n */\r\nexport function addBackgroundRules(stylesProcessor) {\r\n    stylesProcessor.setNormalizer('background', getBackgroundNormalizer());\r\n    stylesProcessor.setNormalizer('background-color', getBackgroundColorNormalizer());\r\n    stylesProcessor.setReducer('background', getBackgroundReducer());\r\n    stylesProcessor.setStyleRelation('background', ['background-color']);\r\n}\r\nfunction getBackgroundNormalizer() {\r\n    return value => {\r\n        const background = {};\r\n        const parts = getShorthandValues(value);\r\n        for (const part of parts) {\r\n            if (isRepeat(part)) {\r\n                background.repeat = background.repeat || [];\r\n                background.repeat.push(part);\r\n            }\r\n            else if (isPosition(part)) {\r\n                background.position = background.position || [];\r\n                background.position.push(part);\r\n            }\r\n            else if (isAttachment(part)) {\r\n                background.attachment = part;\r\n            }\r\n            else if (isColor(part)) {\r\n                background.color = part;\r\n            }\r\n            else if (isURL(part)) {\r\n                background.image = part;\r\n            }\r\n        }\r\n        return {\r\n            path: 'background',\r\n            value: background\r\n        };\r\n    };\r\n}\r\nfunction getBackgroundColorNormalizer() {\r\n    return value => ({ path: 'background.color', value });\r\n}\r\nfunction getBackgroundReducer() {\r\n    return value => {\r\n        const ret = [];\r\n        ret.push(['background-color', value.color]);\r\n        return ret;\r\n    };\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { getShorthandValues, getBoxSidesValueReducer, getBoxSidesValues, isLength, isLineStyle } from './utils';\r\n/**\r\n * Adds a border CSS styles processing rules.\r\n *\r\n * ```ts\r\n * editor.data.addStyleProcessorRules( addBorderRules );\r\n * ```\r\n *\r\n * This rules merges all [border](https://developer.mozilla.org/en-US/docs/Web/CSS/border) styles notation shorthands:\r\n *\r\n * - border\r\n * - border-top\r\n * - border-right\r\n * - border-bottom\r\n * - border-left\r\n * - border-color\r\n * - border-style\r\n * - border-width\r\n *\r\n * and all corresponding longhand forms (like `border-top-color`, `border-top-style`, etc).\r\n *\r\n * It does not handle other shorthands (like `border-radius` or `border-image`).\r\n *\r\n * The normalized model stores border values as:\r\n *\r\n * ```ts\r\n * const styles = {\r\n * \tborder: {\r\n * \t\tcolor: { top, right, bottom, left },\r\n * \t\tstyle: { top, right, bottom, left },\r\n * \t\twidth: { top, right, bottom, left },\r\n * \t}\r\n * };\r\n * ```\r\n */\r\nexport function addBorderRules(stylesProcessor) {\r\n    stylesProcessor.setNormalizer('border', getBorderNormalizer());\r\n    // Border-position shorthands.\r\n    stylesProcessor.setNormalizer('border-top', getBorderPositionNormalizer('top'));\r\n    stylesProcessor.setNormalizer('border-right', getBorderPositionNormalizer('right'));\r\n    stylesProcessor.setNormalizer('border-bottom', getBorderPositionNormalizer('bottom'));\r\n    stylesProcessor.setNormalizer('border-left', getBorderPositionNormalizer('left'));\r\n    // Border-property shorthands.\r\n    stylesProcessor.setNormalizer('border-color', getBorderPropertyNormalizer('color'));\r\n    stylesProcessor.setNormalizer('border-width', getBorderPropertyNormalizer('width'));\r\n    stylesProcessor.setNormalizer('border-style', getBorderPropertyNormalizer('style'));\r\n    // Border longhands.\r\n    stylesProcessor.setNormalizer('border-top-color', getBorderPropertyPositionNormalizer('color', 'top'));\r\n    stylesProcessor.setNormalizer('border-top-style', getBorderPropertyPositionNormalizer('style', 'top'));\r\n    stylesProcessor.setNormalizer('border-top-width', getBorderPropertyPositionNormalizer('width', 'top'));\r\n    stylesProcessor.setNormalizer('border-right-color', getBorderPropertyPositionNormalizer('color', 'right'));\r\n    stylesProcessor.setNormalizer('border-right-style', getBorderPropertyPositionNormalizer('style', 'right'));\r\n    stylesProcessor.setNormalizer('border-right-width', getBorderPropertyPositionNormalizer('width', 'right'));\r\n    stylesProcessor.setNormalizer('border-bottom-color', getBorderPropertyPositionNormalizer('color', 'bottom'));\r\n    stylesProcessor.setNormalizer('border-bottom-style', getBorderPropertyPositionNormalizer('style', 'bottom'));\r\n    stylesProcessor.setNormalizer('border-bottom-width', getBorderPropertyPositionNormalizer('width', 'bottom'));\r\n    stylesProcessor.setNormalizer('border-left-color', getBorderPropertyPositionNormalizer('color', 'left'));\r\n    stylesProcessor.setNormalizer('border-left-style', getBorderPropertyPositionNormalizer('style', 'left'));\r\n    stylesProcessor.setNormalizer('border-left-width', getBorderPropertyPositionNormalizer('width', 'left'));\r\n    stylesProcessor.setExtractor('border-top', getBorderPositionExtractor('top'));\r\n    stylesProcessor.setExtractor('border-right', getBorderPositionExtractor('right'));\r\n    stylesProcessor.setExtractor('border-bottom', getBorderPositionExtractor('bottom'));\r\n    stylesProcessor.setExtractor('border-left', getBorderPositionExtractor('left'));\r\n    stylesProcessor.setExtractor('border-top-color', 'border.color.top');\r\n    stylesProcessor.setExtractor('border-right-color', 'border.color.right');\r\n    stylesProcessor.setExtractor('border-bottom-color', 'border.color.bottom');\r\n    stylesProcessor.setExtractor('border-left-color', 'border.color.left');\r\n    stylesProcessor.setExtractor('border-top-width', 'border.width.top');\r\n    stylesProcessor.setExtractor('border-right-width', 'border.width.right');\r\n    stylesProcessor.setExtractor('border-bottom-width', 'border.width.bottom');\r\n    stylesProcessor.setExtractor('border-left-width', 'border.width.left');\r\n    stylesProcessor.setExtractor('border-top-style', 'border.style.top');\r\n    stylesProcessor.setExtractor('border-right-style', 'border.style.right');\r\n    stylesProcessor.setExtractor('border-bottom-style', 'border.style.bottom');\r\n    stylesProcessor.setExtractor('border-left-style', 'border.style.left');\r\n    stylesProcessor.setReducer('border-color', getBoxSidesValueReducer('border-color'));\r\n    stylesProcessor.setReducer('border-style', getBoxSidesValueReducer('border-style'));\r\n    stylesProcessor.setReducer('border-width', getBoxSidesValueReducer('border-width'));\r\n    stylesProcessor.setReducer('border-top', getBorderPositionReducer('top'));\r\n    stylesProcessor.setReducer('border-right', getBorderPositionReducer('right'));\r\n    stylesProcessor.setReducer('border-bottom', getBorderPositionReducer('bottom'));\r\n    stylesProcessor.setReducer('border-left', getBorderPositionReducer('left'));\r\n    stylesProcessor.setReducer('border', getBorderReducer());\r\n    stylesProcessor.setStyleRelation('border', [\r\n        'border-color', 'border-style', 'border-width',\r\n        'border-top', 'border-right', 'border-bottom', 'border-left',\r\n        'border-top-color', 'border-right-color', 'border-bottom-color', 'border-left-color',\r\n        'border-top-style', 'border-right-style', 'border-bottom-style', 'border-left-style',\r\n        'border-top-width', 'border-right-width', 'border-bottom-width', 'border-left-width'\r\n    ]);\r\n    stylesProcessor.setStyleRelation('border-color', [\r\n        'border-top-color', 'border-right-color', 'border-bottom-color', 'border-left-color'\r\n    ]);\r\n    stylesProcessor.setStyleRelation('border-style', [\r\n        'border-top-style', 'border-right-style', 'border-bottom-style', 'border-left-style'\r\n    ]);\r\n    stylesProcessor.setStyleRelation('border-width', [\r\n        'border-top-width', 'border-right-width', 'border-bottom-width', 'border-left-width'\r\n    ]);\r\n    stylesProcessor.setStyleRelation('border-top', ['border-top-color', 'border-top-style', 'border-top-width']);\r\n    stylesProcessor.setStyleRelation('border-right', ['border-right-color', 'border-right-style', 'border-right-width']);\r\n    stylesProcessor.setStyleRelation('border-bottom', ['border-bottom-color', 'border-bottom-style', 'border-bottom-width']);\r\n    stylesProcessor.setStyleRelation('border-left', ['border-left-color', 'border-left-style', 'border-left-width']);\r\n}\r\nfunction getBorderNormalizer() {\r\n    return value => {\r\n        const { color, style, width } = normalizeBorderShorthand(value);\r\n        return {\r\n            path: 'border',\r\n            value: {\r\n                color: getBoxSidesValues(color),\r\n                style: getBoxSidesValues(style),\r\n                width: getBoxSidesValues(width)\r\n            }\r\n        };\r\n    };\r\n}\r\nfunction getBorderPositionNormalizer(side) {\r\n    return value => {\r\n        const { color, style, width } = normalizeBorderShorthand(value);\r\n        const border = {};\r\n        if (color !== undefined) {\r\n            border.color = { [side]: color };\r\n        }\r\n        if (style !== undefined) {\r\n            border.style = { [side]: style };\r\n        }\r\n        if (width !== undefined) {\r\n            border.width = { [side]: width };\r\n        }\r\n        return {\r\n            path: 'border',\r\n            value: border\r\n        };\r\n    };\r\n}\r\nfunction getBorderPropertyNormalizer(propertyName) {\r\n    return value => {\r\n        return {\r\n            path: 'border',\r\n            value: toBorderPropertyShorthand(value, propertyName)\r\n        };\r\n    };\r\n}\r\nfunction toBorderPropertyShorthand(value, property) {\r\n    return {\r\n        [property]: getBoxSidesValues(value)\r\n    };\r\n}\r\nfunction getBorderPropertyPositionNormalizer(property, side) {\r\n    return value => {\r\n        return {\r\n            path: 'border',\r\n            value: {\r\n                [property]: {\r\n                    [side]: value\r\n                }\r\n            }\r\n        };\r\n    };\r\n}\r\nfunction getBorderPositionExtractor(which) {\r\n    return (name, styles) => {\r\n        if (styles.border) {\r\n            return extractBorderPosition(styles.border, which);\r\n        }\r\n    };\r\n}\r\nfunction extractBorderPosition(border, which) {\r\n    const value = {};\r\n    if (border.width && border.width[which]) {\r\n        value.width = border.width[which];\r\n    }\r\n    if (border.style && border.style[which]) {\r\n        value.style = border.style[which];\r\n    }\r\n    if (border.color && border.color[which]) {\r\n        value.color = border.color[which];\r\n    }\r\n    return value;\r\n}\r\nfunction normalizeBorderShorthand(string) {\r\n    const result = {};\r\n    const parts = getShorthandValues(string);\r\n    for (const part of parts) {\r\n        if (isLength(part) || /thin|medium|thick/.test(part)) {\r\n            result.width = part;\r\n        }\r\n        else if (isLineStyle(part)) {\r\n            result.style = part;\r\n        }\r\n        else {\r\n            result.color = part;\r\n        }\r\n    }\r\n    return result;\r\n}\r\n/**\r\n * The border reducer factory.\r\n *\r\n * It tries to produce the most optimal output for the specified styles.\r\n *\r\n * For a border style:\r\n *\r\n * ```css\r\n * style: {top: \"solid\", bottom: \"solid\", right: \"solid\", left: \"solid\"}\r\n * ```\r\n *\r\n * It will produce: `border-style: solid`.\r\n * For a border style and color:\r\n *\r\n * ```css\r\n * color: {top: \"#ff0\", bottom: \"#ff0\", right: \"#ff0\", left: \"#ff0\"}\r\n * style: {top: \"solid\", bottom: \"solid\", right: \"solid\", left: \"solid\"}\r\n * ```\r\n *\r\n * It will produce: `border-color: #ff0; border-style: solid`.\r\n * If all border parameters are specified:\r\n *\r\n * ```css\r\n * color: {top: \"#ff0\", bottom: \"#ff0\", right: \"#ff0\", left: \"#ff0\"}\r\n * style: {top: \"solid\", bottom: \"solid\", right: \"solid\", left: \"solid\"}\r\n * width: {top: \"2px\", bottom: \"2px\", right: \"2px\", left: \"2px\"}\r\n * ```\r\n *\r\n * It will combine everything into a single property: `border: 2px solid #ff0`.\r\n *\r\n * The definitions are merged only if all border selectors have the same values.\r\n */\r\nfunction getBorderReducer() {\r\n    return value => {\r\n        const topStyles = extractBorderPosition(value, 'top');\r\n        const rightStyles = extractBorderPosition(value, 'right');\r\n        const bottomStyles = extractBorderPosition(value, 'bottom');\r\n        const leftStyles = extractBorderPosition(value, 'left');\r\n        const borderStyles = [topStyles, rightStyles, bottomStyles, leftStyles];\r\n        const borderStylesByType = {\r\n            width: getReducedStyleValueForType(borderStyles, 'width'),\r\n            style: getReducedStyleValueForType(borderStyles, 'style'),\r\n            color: getReducedStyleValueForType(borderStyles, 'color')\r\n        };\r\n        // Try reducing to a single `border:` property.\r\n        const reducedBorderStyle = reduceBorderPosition(borderStylesByType, 'all');\r\n        if (reducedBorderStyle.length) {\r\n            return reducedBorderStyle;\r\n        }\r\n        // Try reducing to `border-style:`, `border-width:`, `border-color:` properties.\r\n        const reducedStyleTypes = Object.entries(borderStylesByType).reduce((reducedStyleTypes, [type, value]) => {\r\n            if (value) {\r\n                reducedStyleTypes.push([`border-${type}`, value]);\r\n                // Remove it from the full set to not include it in the most specific properties later.\r\n                borderStyles.forEach(style => delete style[type]);\r\n            }\r\n            return reducedStyleTypes;\r\n        }, []);\r\n        // The reduced properties (by type) and all that remains that could not be reduced.\r\n        return [\r\n            ...reducedStyleTypes,\r\n            ...reduceBorderPosition(topStyles, 'top'),\r\n            ...reduceBorderPosition(rightStyles, 'right'),\r\n            ...reduceBorderPosition(bottomStyles, 'bottom'),\r\n            ...reduceBorderPosition(leftStyles, 'left')\r\n        ];\r\n    };\r\n    /**\r\n     * @param styles The array of objects with `style`, `color`, `width` properties.\r\n     */\r\n    function getReducedStyleValueForType(styles, type) {\r\n        return styles\r\n            .map(style => style[type])\r\n            .reduce((result, style) => result == style ? result : null);\r\n    }\r\n}\r\nfunction getBorderPositionReducer(which) {\r\n    return value => reduceBorderPosition(value, which);\r\n}\r\n/**\r\n * Returns an array with reduced border styles depending on the specified values.\r\n *\r\n * If all border properties (width, style, color) are specified, the returned selector will be\r\n * merged into a group: `border-*: [width] [style] [color]`.\r\n *\r\n * Otherwise, the specific definitions will be returned: `border-(width|style|color)-*: [value]`.\r\n *\r\n * @param value Styles if defined.\r\n * @param which The border position.\r\n */\r\nfunction reduceBorderPosition(value, which) {\r\n    const borderTypes = [];\r\n    if (value && (value.width)) {\r\n        borderTypes.push('width');\r\n    }\r\n    if (value && (value.style)) {\r\n        borderTypes.push('style');\r\n    }\r\n    if (value && (value.color)) {\r\n        borderTypes.push('color');\r\n    }\r\n    if (borderTypes.length == 3) {\r\n        const borderValue = borderTypes.map(item => value[item]).join(' ');\r\n        return [\r\n            which == 'all' ? ['border', borderValue] : [`border-${which}`, borderValue]\r\n        ];\r\n    }\r\n    // We are unable to reduce to a single `border:` property.\r\n    if (which == 'all') {\r\n        return [];\r\n    }\r\n    return borderTypes.map(type => {\r\n        return [`border-${which}-${type}`, value[type]];\r\n    });\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { getPositionShorthandNormalizer, getBoxSidesValueReducer } from './utils';\r\n/**\r\n * Adds a margin CSS styles processing rules.\r\n *\r\n * ```ts\r\n * editor.data.addStyleProcessorRules( addMarginRules );\r\n * ```\r\n *\r\n * The normalized value is stored as:\r\n *\r\n * ```ts\r\n * const styles = {\r\n * \tmargin: {\r\n * \t\ttop,\r\n * \t\tright,\r\n * \t\tbottom,\r\n * \t\tleft\r\n * \t}\r\n * };\r\n * ```\r\n */\r\nexport function addMarginRules(stylesProcessor) {\r\n    stylesProcessor.setNormalizer('margin', getPositionShorthandNormalizer('margin'));\r\n    stylesProcessor.setNormalizer('margin-top', value => ({ path: 'margin.top', value }));\r\n    stylesProcessor.setNormalizer('margin-right', value => ({ path: 'margin.right', value }));\r\n    stylesProcessor.setNormalizer('margin-bottom', value => ({ path: 'margin.bottom', value }));\r\n    stylesProcessor.setNormalizer('margin-left', value => ({ path: 'margin.left', value }));\r\n    stylesProcessor.setReducer('margin', getBoxSidesValueReducer('margin'));\r\n    stylesProcessor.setStyleRelation('margin', ['margin-top', 'margin-right', 'margin-bottom', 'margin-left']);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { getPositionShorthandNormalizer, getBoxSidesValueReducer } from './utils';\r\n/**\r\n * Adds a margin CSS styles processing rules.\r\n *\r\n * ```ts\r\n * editor.data.addStyleProcessorRules( addPaddingRules );\r\n * ```\r\n *\r\n * The normalized value is stored as:\r\n *\r\n * ```ts\r\n * const styles = {\r\n * \tpadding: {\r\n * \t\ttop,\r\n * \t\tright,\r\n * \t\tbottom,\r\n * \t\tleft\r\n * \t}\r\n * };\r\n * ```\r\n */\r\nexport function addPaddingRules(stylesProcessor) {\r\n    stylesProcessor.setNormalizer('padding', getPositionShorthandNormalizer('padding'));\r\n    stylesProcessor.setNormalizer('padding-top', value => ({ path: 'padding.top', value }));\r\n    stylesProcessor.setNormalizer('padding-right', value => ({ path: 'padding.right', value }));\r\n    stylesProcessor.setNormalizer('padding-bottom', value => ({ path: 'padding.bottom', value }));\r\n    stylesProcessor.setNormalizer('padding-left', value => ({ path: 'padding.left', value }));\r\n    stylesProcessor.setReducer('padding', getBoxSidesValueReducer('padding'));\r\n    stylesProcessor.setStyleRelation('padding', ['padding-top', 'padding-right', 'padding-bottom', 'padding-left']);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module core/commandcollection\r\n */\r\nimport { CKEditorError } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Collection of commands. Its instance is available in {@link module:core/editor/editor~Editor#commands `editor.commands`}.\r\n */\r\nexport default class CommandCollection {\r\n    /**\r\n     * Creates collection instance.\r\n     */\r\n    constructor() {\r\n        this._commands = new Map();\r\n    }\r\n    /**\r\n     * Registers a new command.\r\n     *\r\n     * @param commandName The name of the command.\r\n     */\r\n    add(commandName, command) {\r\n        this._commands.set(commandName, command);\r\n    }\r\n    /**\r\n     * Retrieves a command from the collection.\r\n     *\r\n     * @param commandName The name of the command.\r\n     */\r\n    get(commandName) {\r\n        return this._commands.get(commandName);\r\n    }\r\n    /**\r\n     * Executes a command.\r\n     *\r\n     * @param commandName The name of the command.\r\n     * @param commandParams Command parameters.\r\n     * @returns The value returned by the {@link module:core/command~Command#execute `command.execute()`}.\r\n     */\r\n    execute(commandName, ...commandParams) {\r\n        const command = this.get(commandName);\r\n        if (!command) {\r\n            /**\r\n             * Command does not exist.\r\n             *\r\n             * @error commandcollection-command-not-found\r\n             * @param commandName Name of the command.\r\n             */\r\n            throw new CKEditorError('commandcollection-command-not-found', this, { commandName });\r\n        }\r\n        return command.execute(...commandParams);\r\n    }\r\n    /**\r\n     * Returns iterator of command names.\r\n     */\r\n    *names() {\r\n        yield* this._commands.keys();\r\n    }\r\n    /**\r\n     * Returns iterator of command instances.\r\n     */\r\n    *commands() {\r\n        yield* this._commands.values();\r\n    }\r\n    /**\r\n     * Iterable interface.\r\n     *\r\n     * Returns `[ commandName, commandInstance ]` pairs.\r\n     */\r\n    [Symbol.iterator]() {\r\n        return this._commands[Symbol.iterator]();\r\n    }\r\n    /**\r\n     * Destroys all collection commands.\r\n     */\r\n    destroy() {\r\n        for (const command of this.commands()) {\r\n            command.destroy();\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module core/editingkeystrokehandler\r\n */\r\nimport { KeystrokeHandler } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * A keystroke handler for editor editing. Its instance is available\r\n * in {@link module:core/editor/editor~Editor#keystrokes} so plugins\r\n * can register their keystrokes.\r\n *\r\n * E.g. an undo plugin would do this:\r\n *\r\n * ```ts\r\n * editor.keystrokes.set( 'Ctrl+Z', 'undo' );\r\n * editor.keystrokes.set( 'Ctrl+Shift+Z', 'redo' );\r\n * editor.keystrokes.set( 'Ctrl+Y', 'redo' );\r\n * ```\r\n */\r\nexport default class EditingKeystrokeHandler extends KeystrokeHandler {\r\n    /**\r\n     * Creates an instance of the keystroke handler.\r\n     */\r\n    constructor(editor) {\r\n        super();\r\n        this.editor = editor;\r\n    }\r\n    /**\r\n     * Registers a handler for the specified keystroke.\r\n     *\r\n     * The handler can be specified as a command name or a callback.\r\n     *\r\n     * @param keystroke Keystroke defined in a format accepted by\r\n     * the {@link module:utils/keyboard~parseKeystroke} function.\r\n     * @param callback If a string is passed, then the keystroke will\r\n     * {@link module:core/editor/editor~Editor#execute execute a command}.\r\n     * If a function, then it will be called with the\r\n     * {@link module:engine/view/observer/keyobserver~KeyEventData key event data} object and\r\n     * a `cancel()` helper to both `preventDefault()` and `stopPropagation()` of the event.\r\n     * @param options Additional options.\r\n     * @param options.priority The priority of the keystroke callback. The higher the priority value\r\n     * the sooner the callback will be executed. Keystrokes having the same priority\r\n     * are called in the order they were added.\r\n     */\r\n    set(keystroke, callback, options = {}) {\r\n        if (typeof callback == 'string') {\r\n            const commandName = callback;\r\n            callback = (evtData, cancel) => {\r\n                this.editor.execute(commandName);\r\n                cancel();\r\n            };\r\n        }\r\n        super.set(keystroke, callback, options);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module core/editor/editor\r\n */\r\nimport { Config, CKEditorError, ObservableMixin } from '@ckeditor/ckeditor5-utils';\r\nimport { Conversion, DataController, EditingController, Model, StylesProcessor } from '@ckeditor/ckeditor5-engine';\r\nimport Context from '../context';\r\nimport PluginCollection from '../plugincollection';\r\nimport CommandCollection from '../commandcollection';\r\nimport EditingKeystrokeHandler from '../editingkeystrokehandler';\r\n/**\r\n * The class representing a basic, generic editor.\r\n *\r\n * Check out the list of its subclasses to learn about specific editor implementations.\r\n *\r\n * All editor implementations (like {@link module:editor-classic/classiceditor~ClassicEditor} or\r\n * {@link module:editor-inline/inlineeditor~InlineEditor}) should extend this class. They can add their\r\n * own methods and properties.\r\n *\r\n * When you are implementing a plugin, this editor represents the API\r\n * which your plugin can expect to get when using its {@link module:core/plugin~Plugin#editor} property.\r\n *\r\n * This API should be sufficient in order to implement the \"editing\" part of your feature\r\n * (schema definition, conversion, commands, keystrokes, etc.).\r\n * It does not define the editor UI, which is available only if\r\n * the specific editor implements also the {@link ~Editor#ui} property\r\n * (as most editor implementations do).\r\n */\r\nexport default class Editor extends ObservableMixin() {\r\n    /**\r\n     * Creates a new instance of the editor class.\r\n     *\r\n     * Usually, not to be used directly. See the static {@link module:core/editor/editor~Editor.create `create()`} method.\r\n     *\r\n     * @param config The editor configuration.\r\n     */\r\n    constructor(config = {}) {\r\n        super();\r\n        const constructor = this.constructor;\r\n        // Prefer the language passed as the argument to the constructor instead of the constructor's `defaultConfig`, if both are set.\r\n        const language = config.language || (constructor.defaultConfig && constructor.defaultConfig.language);\r\n        this._context = config.context || new Context({ language });\r\n        this._context._addEditor(this, !config.context);\r\n        // Clone the plugins to make sure that the plugin array will not be shared\r\n        // between editors and make the watchdog feature work correctly.\r\n        const availablePlugins = Array.from(constructor.builtinPlugins || []);\r\n        this.config = new Config(config, constructor.defaultConfig);\r\n        this.config.define('plugins', availablePlugins);\r\n        this.config.define(this._context._getEditorConfig());\r\n        this.plugins = new PluginCollection(this, availablePlugins, this._context.plugins);\r\n        this.locale = this._context.locale;\r\n        this.t = this.locale.t;\r\n        this._readOnlyLocks = new Set();\r\n        this.commands = new CommandCollection();\r\n        this.set('state', 'initializing');\r\n        this.once('ready', () => (this.state = 'ready'), { priority: 'high' });\r\n        this.once('destroy', () => (this.state = 'destroyed'), { priority: 'high' });\r\n        this.model = new Model();\r\n        this.on('change:isReadOnly', () => {\r\n            this.model.document.isReadOnly = this.isReadOnly;\r\n        });\r\n        const stylesProcessor = new StylesProcessor();\r\n        this.data = new DataController(this.model, stylesProcessor);\r\n        this.editing = new EditingController(this.model, stylesProcessor);\r\n        this.editing.view.document.bind('isReadOnly').to(this);\r\n        this.conversion = new Conversion([this.editing.downcastDispatcher, this.data.downcastDispatcher], this.data.upcastDispatcher);\r\n        this.conversion.addAlias('dataDowncast', this.data.downcastDispatcher);\r\n        this.conversion.addAlias('editingDowncast', this.editing.downcastDispatcher);\r\n        this.keystrokes = new EditingKeystrokeHandler(this);\r\n        this.keystrokes.listenTo(this.editing.view.document);\r\n    }\r\n    /**\r\n     * Defines whether the editor is in the read-only mode.\r\n     *\r\n     * In read-only mode the editor {@link #commands commands} are disabled so it is not possible\r\n     * to modify the document by using them. Also, the editable element(s) become non-editable.\r\n     *\r\n     * In order to make the editor read-only, you need to call the {@link #enableReadOnlyMode} method:\r\n     *\r\n     * ```ts\r\n     * editor.enableReadOnlyMode( 'feature-id' );\r\n     * ```\r\n     *\r\n     * Later, to turn off the read-only mode, call {@link #disableReadOnlyMode}:\r\n     *\r\n     * ```ts\r\n     * editor.disableReadOnlyMode( 'feature-id' );\r\n     * ```\r\n     *\r\n     * @readonly\r\n     * @observable\r\n     */\r\n    get isReadOnly() {\r\n        return this._readOnlyLocks.size > 0;\r\n    }\r\n    set isReadOnly(value) {\r\n        /**\r\n         * The {@link module:core/editor/editor~Editor#isReadOnly Editor#isReadOnly} property is read-only since version `34.0.0`\r\n         * and can be set only using {@link module:core/editor/editor~Editor#enableReadOnlyMode `Editor#enableReadOnlyMode( lockId )`} and\r\n         * {@link module:core/editor/editor~Editor#disableReadOnlyMode `Editor#disableReadOnlyMode( lockId )`}.\r\n         *\r\n         * Usage before version `34.0.0`:\r\n         *\r\n         * ```ts\r\n         * editor.isReadOnly = true;\r\n         * editor.isReadOnly = false;\r\n         * ```\r\n         *\r\n         * Usage since version `34.0.0`:\r\n         *\r\n         * ```ts\r\n         * editor.enableReadOnlyMode( 'my-feature-id' );\r\n         * editor.disableReadOnlyMode( 'my-feature-id' );\r\n         * ```\r\n         *\r\n         * @error editor-isreadonly-has-no-setter\r\n         */\r\n        throw new CKEditorError('editor-isreadonly-has-no-setter');\r\n    }\r\n    /**\r\n     * Turns on the read-only mode in the editor.\r\n     *\r\n     * Editor can be switched to or out of the read-only mode by many features, under various circumstances. The editor supports locking\r\n     * mechanism for the read-only mode. It enables easy control over the read-only mode when many features wants to turn it on or off at\r\n     * the same time, without conflicting with each other. It guarantees that you will not make the editor editable accidentally (which\r\n     * could lead to errors).\r\n     *\r\n     * Each read-only mode request is identified by a unique id (also called \"lock\"). If multiple plugins requested to turn on the\r\n     * read-only mode, then, the editor will become editable only after all these plugins turn the read-only mode off (using the same ids).\r\n     *\r\n     * Note, that you cannot force the editor to disable the read-only mode if other plugins set it.\r\n     *\r\n     * After the first `enableReadOnlyMode()` call, the {@link #isReadOnly `isReadOnly` property} will be set to `true`:\r\n     *\r\n     * ```ts\r\n     * editor.isReadOnly; // `false`.\r\n     * editor.enableReadOnlyMode( 'my-feature-id' );\r\n     * editor.isReadOnly; // `true`.\r\n     * ```\r\n     *\r\n     * You can turn off the read-only mode (\"clear the lock\") using the {@link #disableReadOnlyMode `disableReadOnlyMode()`} method:\r\n     *\r\n     * ```ts\r\n     * editor.enableReadOnlyMode( 'my-feature-id' );\r\n     * // ...\r\n     * editor.disableReadOnlyMode( 'my-feature-id' );\r\n     * editor.isReadOnly; // `false`.\r\n     * ```\r\n     *\r\n     * All \"locks\" need to be removed to enable editing:\r\n     *\r\n     * ```ts\r\n     * editor.enableReadOnlyMode( 'my-feature-id' );\r\n     * editor.enableReadOnlyMode( 'my-other-feature-id' );\r\n     * // ...\r\n     * editor.disableReadOnlyMode( 'my-feature-id' );\r\n     * editor.isReadOnly; // `true`.\r\n     * editor.disableReadOnlyMode( 'my-other-feature-id' );\r\n     * editor.isReadOnly; // `false`.\r\n     * ```\r\n     *\r\n     * @param lockId A unique ID for setting the editor to the read-only state.\r\n     */\r\n    enableReadOnlyMode(lockId) {\r\n        if (typeof lockId !== 'string' && typeof lockId !== 'symbol') {\r\n            /**\r\n             * The lock ID is missing or it is not a string or symbol.\r\n             *\r\n             * @error editor-read-only-lock-id-invalid\r\n             */\r\n            throw new CKEditorError('editor-read-only-lock-id-invalid', null, { lockId });\r\n        }\r\n        if (this._readOnlyLocks.has(lockId)) {\r\n            return;\r\n        }\r\n        this._readOnlyLocks.add(lockId);\r\n        if (this._readOnlyLocks.size === 1) {\r\n            // Manually fire the `change:isReadOnly` event as only getter is provided.\r\n            this.fire('change:isReadOnly', 'isReadOnly', true, false);\r\n        }\r\n    }\r\n    /**\r\n     * Removes the read-only lock from the editor with given lock ID.\r\n     *\r\n     * When no lock is present on the editor anymore, then the {@link #isReadOnly `isReadOnly` property} will be set to `false`.\r\n     *\r\n     * @param lockId The lock ID for setting the editor to the read-only state.\r\n     */\r\n    disableReadOnlyMode(lockId) {\r\n        if (typeof lockId !== 'string' && typeof lockId !== 'symbol') {\r\n            throw new CKEditorError('editor-read-only-lock-id-invalid', null, { lockId });\r\n        }\r\n        if (!this._readOnlyLocks.has(lockId)) {\r\n            return;\r\n        }\r\n        this._readOnlyLocks.delete(lockId);\r\n        if (this._readOnlyLocks.size === 0) {\r\n            // Manually fire the `change:isReadOnly` event as only getter is provided.\r\n            this.fire('change:isReadOnly', 'isReadOnly', false, true);\r\n        }\r\n    }\r\n    /**\r\n     * Loads and initializes plugins specified in the configuration.\r\n     *\r\n     * @returns A promise which resolves once the initialization is completed, providing an array of loaded plugins.\r\n     */\r\n    initPlugins() {\r\n        const config = this.config;\r\n        const plugins = config.get('plugins');\r\n        const removePlugins = config.get('removePlugins') || [];\r\n        const extraPlugins = config.get('extraPlugins') || [];\r\n        const substitutePlugins = config.get('substitutePlugins') || [];\r\n        return this.plugins.init(plugins.concat(extraPlugins), removePlugins, substitutePlugins);\r\n    }\r\n    /**\r\n     * Destroys the editor instance, releasing all resources used by it.\r\n     *\r\n     * **Note** The editor cannot be destroyed during the initialization phase so if it is called\r\n     * while the editor {@link #state is being initialized}, it will wait for the editor initialization before destroying it.\r\n     *\r\n     * @fires destroy\r\n     * @returns A promise that resolves once the editor instance is fully destroyed.\r\n     */\r\n    destroy() {\r\n        let readyPromise = Promise.resolve();\r\n        if (this.state == 'initializing') {\r\n            readyPromise = new Promise(resolve => this.once('ready', resolve));\r\n        }\r\n        return readyPromise\r\n            .then(() => {\r\n            this.fire('destroy');\r\n            this.stopListening();\r\n            this.commands.destroy();\r\n        })\r\n            .then(() => this.plugins.destroy())\r\n            .then(() => {\r\n            this.model.destroy();\r\n            this.data.destroy();\r\n            this.editing.destroy();\r\n            this.keystrokes.destroy();\r\n        })\r\n            // Remove the editor from the context.\r\n            // When the context was created by this editor, the context will be destroyed.\r\n            .then(() => this._context._removeEditor(this));\r\n    }\r\n    /**\r\n     * Executes the specified command with given parameters.\r\n     *\r\n     * Shorthand for:\r\n     *\r\n     * ```ts\r\n     * editor.commands.get( commandName ).execute( ... );\r\n     * ```\r\n     *\r\n     * @param commandName The name of the command to execute.\r\n     * @param commandParams Command parameters.\r\n     * @returns The value returned by the {@link module:core/commandcollection~CommandCollection#execute `commands.execute()`}.\r\n     */\r\n    execute(commandName, ...commandParams) {\r\n        try {\r\n            return this.commands.execute(commandName, ...commandParams);\r\n        }\r\n        catch (err) {\r\n            // @if CK_DEBUG // throw err;\r\n            /* istanbul ignore next -- @preserve */\r\n            CKEditorError.rethrowUnexpectedError(err, this);\r\n        }\r\n    }\r\n    /**\r\n     * Focuses the editor.\r\n     *\r\n     * **Note** To explicitly focus the editing area of the editor, use the\r\n     * {@link module:engine/view/view~View#focus `editor.editing.view.focus()`} method of the editing view.\r\n     *\r\n     * Check out the {@glink framework/deep-dive/ui/focus-tracking#focus-in-the-editor-ui Focus in the editor UI} section\r\n     * of the {@glink framework/deep-dive/ui/focus-tracking Deep dive into focus tracking} guide to learn more.\r\n     */\r\n    focus() {\r\n        this.editing.view.focus();\r\n    }\r\n    /* istanbul ignore next -- @preserve */\r\n    /**\r\n     * Creates and initializes a new editor instance.\r\n     *\r\n     * This is an abstract method. Every editor type needs to implement its own initialization logic.\r\n     *\r\n     * See the `create()` methods of the existing editor types to learn how to use them:\r\n     *\r\n     * * {@link module:editor-classic/classiceditor~ClassicEditor.create `ClassicEditor.create()`}\r\n     * * {@link module:editor-balloon/ballooneditor~BalloonEditor.create `BalloonEditor.create()`}\r\n     * * {@link module:editor-decoupled/decouplededitor~DecoupledEditor.create `DecoupledEditor.create()`}\r\n     * * {@link module:editor-inline/inlineeditor~InlineEditor.create `InlineEditor.create()`}\r\n     */\r\n    static create(...args) {\r\n        throw new Error('This is an abstract method.');\r\n    }\r\n}\r\n/**\r\n * This error is thrown when trying to pass a `<textarea>` element to a `create()` function of an editor class.\r\n *\r\n * The only editor type which can be initialized on `<textarea>` elements is\r\n * the {@glink installation/getting-started/predefined-builds#classic-editor classic editor}.\r\n * This editor hides the passed element and inserts its own UI next to it. Other types of editors reuse the passed element as their root\r\n * editable element and therefore `<textarea>` is not appropriate for them. Use a `<div>` or another text container instead:\r\n *\r\n * ```html\r\n * <div id=\"editor\">\r\n * \t<p>Initial content.</p>\r\n * </div>\r\n * ```\r\n *\r\n * @error editor-wrong-element\r\n */\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * Implementation of the {@link module:core/editor/utils/dataapimixin~DataApi}.\r\n */\r\nexport default function DataApiMixin(base) {\r\n    class Mixin extends base {\r\n        setData(data) {\r\n            this.data.set(data);\r\n        }\r\n        getData(options) {\r\n            return this.data.get(options);\r\n        }\r\n    }\r\n    return Mixin;\r\n}\r\n// Backward compatibility with `mix`.\r\n{\r\n    const mixin = DataApiMixin(Object);\r\n    DataApiMixin.setData = mixin.prototype.setData;\r\n    DataApiMixin.getData = mixin.prototype.getData;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module core/editor/utils/elementapimixin\r\n */\r\nimport { CKEditorError, setDataInElement } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Implementation of the {@link module:core/editor/utils/elementapimixin~ElementApi}.\r\n */\r\nexport default function ElementApiMixin(base) {\r\n    class Mixin extends base {\r\n        updateSourceElement(data = this.data.get()) {\r\n            if (!this.sourceElement) {\r\n                /**\r\n                 * Cannot update the source element of a detached editor.\r\n                 *\r\n                 * The {@link module:core/editor/utils/elementapimixin~ElementApi#updateSourceElement `updateSourceElement()`}\r\n                 * method cannot be called if you did not pass an element to `Editor.create()`.\r\n                 *\r\n                 * @error editor-missing-sourceelement\r\n                 */\r\n                throw new CKEditorError('editor-missing-sourceelement', this);\r\n            }\r\n            const shouldUpdateSourceElement = this.config.get('updateSourceElementOnDestroy');\r\n            const isSourceElementTextArea = this.sourceElement instanceof HTMLTextAreaElement;\r\n            // The data returned by the editor might be unsafe, so we want to prevent rendering\r\n            // unsafe content inside the source element different than <textarea>, which is considered\r\n            // secure. This behaviour could be changed by setting the `updateSourceElementOnDestroy`\r\n            // configuration option to `true`.\r\n            if (!shouldUpdateSourceElement && !isSourceElementTextArea) {\r\n                setDataInElement(this.sourceElement, '');\r\n                return;\r\n            }\r\n            setDataInElement(this.sourceElement, data);\r\n        }\r\n    }\r\n    return Mixin;\r\n}\r\n// Backward compatibility with `mix`.\r\nElementApiMixin.updateSourceElement = ElementApiMixin(Object).prototype.updateSourceElement;\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module core/pendingactions\r\n */\r\nimport ContextPlugin from './contextplugin';\r\nimport { CKEditorError, Collection, ObservableMixin } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * The list of pending editor actions.\r\n *\r\n * This plugin should be used to synchronise plugins that execute long-lasting actions\r\n * (e.g. file upload) with the editor integration. It gives the developer who integrates the editor\r\n * an easy way to check if there are any actions pending whenever such information is needed.\r\n * All plugins that register a pending action also provide a message about the action that is ongoing\r\n * which can be displayed to the user. This lets them decide if they want to interrupt the action or wait.\r\n *\r\n * Adding and updating a pending action:\r\n *\r\n * ```ts\r\n * const pendingActions = editor.plugins.get( 'PendingActions' );\r\n * const action = pendingActions.add( 'Upload in progress: 0%.' );\r\n *\r\n * // You can update the message:\r\n * action.message = 'Upload in progress: 10%.';\r\n * ```\r\n *\r\n * Removing a pending action:\r\n *\r\n * ```ts\r\n * const pendingActions = editor.plugins.get( 'PendingActions' );\r\n * const action = pendingActions.add( 'Unsaved changes.' );\r\n *\r\n * pendingActions.remove( action );\r\n * ```\r\n *\r\n * Getting pending actions:\r\n *\r\n * ```ts\r\n * const pendingActions = editor.plugins.get( 'PendingActions' );\r\n *\r\n * const action1 = pendingActions.add( 'Action 1' );\r\n * const action2 = pendingActions.add( 'Action 2' );\r\n *\r\n * pendingActions.first; // Returns action1\r\n * Array.from( pendingActions ); // Returns [ action1, action2 ]\r\n * ```\r\n *\r\n * This plugin is used by features like {@link module:upload/filerepository~FileRepository} to register their ongoing actions\r\n * and by features like {@link module:autosave/autosave~Autosave} to detect whether there are any ongoing actions.\r\n * Read more about saving the data in the {@glink installation/getting-started/getting-and-setting-data Saving and getting data} guide.\r\n */\r\nexport default class PendingActions extends ContextPlugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'PendingActions';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        this.set('hasAny', false);\r\n        this._actions = new Collection({ idProperty: '_id' });\r\n        this._actions.delegate('add', 'remove').to(this);\r\n    }\r\n    /**\r\n     * Adds an action to the list of pending actions.\r\n     *\r\n     * This method returns an action object with an observable message property.\r\n     * The action object can be later used in the {@link #remove} method. It also allows you to change the message.\r\n     *\r\n     * @param message The action message.\r\n     * @returns An observable object that represents a pending action.\r\n     */\r\n    add(message) {\r\n        if (typeof message !== 'string') {\r\n            /**\r\n             * The message must be a string.\r\n             *\r\n             * @error pendingactions-add-invalid-message\r\n             */\r\n            throw new CKEditorError('pendingactions-add-invalid-message', this);\r\n        }\r\n        const action = new (ObservableMixin())();\r\n        action.set('message', message);\r\n        this._actions.add(action);\r\n        this.hasAny = true;\r\n        return action;\r\n    }\r\n    /**\r\n     * Removes an action from the list of pending actions.\r\n     *\r\n     * @param action An action object.\r\n     */\r\n    remove(action) {\r\n        this._actions.remove(action);\r\n        this.hasAny = !!this._actions.length;\r\n    }\r\n    /**\r\n     * Returns the first action from the list or null if the list is empty\r\n     *\r\n     * @returns The pending action object.\r\n     */\r\n    get first() {\r\n        return this._actions.get(0);\r\n    }\r\n    /**\r\n     * Iterable interface.\r\n     */\r\n    [Symbol.iterator]() {\r\n        return this._actions[Symbol.iterator]();\r\n    }\r\n}\r\n","export default \"<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>\";","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module core\r\n */\r\nexport { default as Plugin } from './plugin';\r\nexport { default as Command } from './command';\r\nexport { default as MultiCommand } from './multicommand';\r\nexport { default as Context } from './context';\r\nexport { default as ContextPlugin } from './contextplugin';\r\nexport { default as Editor } from './editor/editor';\r\nexport { default as attachToForm } from './editor/utils/attachtoform';\r\nexport { default as DataApiMixin } from './editor/utils/dataapimixin';\r\nexport { default as ElementApiMixin } from './editor/utils/elementapimixin';\r\nexport { default as secureSourceElement } from './editor/utils/securesourceelement';\r\nexport { default as PendingActions } from './pendingactions';\r\nimport cancel from './../theme/icons/cancel.svg';\r\nimport caption from './../theme/icons/caption.svg';\r\nimport check from './../theme/icons/check.svg';\r\nimport cog from './../theme/icons/cog.svg';\r\nimport eraser from './../theme/icons/eraser.svg';\r\nimport lowVision from './../theme/icons/low-vision.svg';\r\nimport image from './../theme/icons/image.svg';\r\nimport alignBottom from './../theme/icons/align-bottom.svg';\r\nimport alignMiddle from './../theme/icons/align-middle.svg';\r\nimport alignTop from './../theme/icons/align-top.svg';\r\nimport alignLeft from './../theme/icons/align-left.svg';\r\nimport alignCenter from './../theme/icons/align-center.svg';\r\nimport alignRight from './../theme/icons/align-right.svg';\r\nimport alignJustify from './../theme/icons/align-justify.svg';\r\nimport objectBlockLeft from './../theme/icons/object-left.svg';\r\nimport objectCenter from './../theme/icons/object-center.svg';\r\nimport objectBlockRight from './../theme/icons/object-right.svg';\r\nimport objectFullWidth from './../theme/icons/object-full-width.svg';\r\nimport objectInline from './../theme/icons/object-inline.svg';\r\nimport objectLeft from './../theme/icons/object-inline-left.svg';\r\nimport objectRight from './../theme/icons/object-inline-right.svg';\r\nimport objectSizeFull from './../theme/icons/object-size-full.svg';\r\nimport objectSizeLarge from './../theme/icons/object-size-large.svg';\r\nimport objectSizeSmall from './../theme/icons/object-size-small.svg';\r\nimport objectSizeMedium from './../theme/icons/object-size-medium.svg';\r\nimport pencil from './../theme/icons/pencil.svg';\r\nimport pilcrow from './../theme/icons/pilcrow.svg';\r\nimport quote from './../theme/icons/quote.svg';\r\nimport threeVerticalDots from './../theme/icons/three-vertical-dots.svg';\r\nimport bold from './../theme/icons/bold.svg';\r\nimport paragraph from './../theme/icons/paragraph.svg';\r\nimport plus from './../theme/icons/plus.svg';\r\nimport text from './../theme/icons/text.svg';\r\nimport importExport from './../theme/icons/importexport.svg';\r\nexport const icons = {\r\n    bold,\r\n    cancel,\r\n    caption,\r\n    check,\r\n    cog,\r\n    eraser,\r\n    image,\r\n    lowVision,\r\n    importExport,\r\n    paragraph,\r\n    plus,\r\n    text,\r\n    alignBottom,\r\n    alignMiddle,\r\n    alignTop,\r\n    alignLeft,\r\n    alignCenter,\r\n    alignRight,\r\n    alignJustify,\r\n    objectLeft,\r\n    objectCenter,\r\n    objectRight,\r\n    objectFullWidth,\r\n    objectInline,\r\n    objectBlockLeft,\r\n    objectBlockRight,\r\n    objectSizeFull,\r\n    objectSizeLarge,\r\n    objectSizeSmall,\r\n    objectSizeMedium,\r\n    pencil,\r\n    pilcrow,\r\n    quote,\r\n    threeVerticalDots\r\n};\r\nimport './augmentation';\r\n","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<svg viewBox=\\\"0 0 20 20\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M19 4.5 14 0H3v12.673l.868-1.041c.185-.222.4-.402.632-.54V1.5h8v5h5v7.626a2.24 2.24 0 0 1 1.5.822V4.5ZM14 5V2l3.3 3H14Zm-3.692 12.5c.062.105.133.206.213.303L11.52 19H8v-.876a2.243 2.243 0 0 0 1.82-.624h.488Zm7.518-.657a.75.75 0 0 0-1.152-.96L15.5 17.29V12H14v5.29l-1.174-1.408a.75.75 0 0 0-1.152.96l2.346 2.816a.95.95 0 0 0 1.46 0l2.346-2.815Zm-15.056-.38a.75.75 0 0 1-.096-1.056l2.346-2.815a.95.95 0 0 1 1.46 0l2.346 2.815a.75.75 0 1 1-1.152.96L6.5 14.96V20H5v-5.04l-1.174 1.408a.75.75 0 0 1-1.056.096Z\\\"/></svg>\";","export default \"<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>\";","export default \"<svg viewBox=\\\"0 0 20 20\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M10 2a1 1 0 0 0-1 1v6H3a1 1 0 1 0 0 2h6v6a1 1 0 1 0 2 0v-6h6a1 1 0 1 0 0-2h-6V3a1 1 0 0 0-1-1Z\\\"/></svg>\";","export default \"<svg viewBox=\\\"0 0 20 20\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M9.816 11.5 7.038 4.785 4.261 11.5h5.555Zm.62 1.5H3.641l-1.666 4.028H.312l5.789-14h1.875l5.789 14h-1.663L10.436 13Z\\\"/><path d=\\\"m12.09 17-.534-1.292.848-1.971.545 1.319L12.113 17h-.023Zm1.142-5.187.545 1.319L15.5 9.13l1.858 4.316h-3.45l.398.965h3.467L18.887 17H20l-3.873-9h-1.254l-1.641 3.813Z\\\"/></svg>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","import api from \"!../../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../../css-loader/dist/cjs.js!../../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./toolbar.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/toolbar/toolbarview\r\n */\r\nimport View from '../view';\r\nimport FocusCycler from '../focuscycler';\r\nimport ToolbarSeparatorView from './toolbarseparatorview';\r\nimport ToolbarLineBreakView from './toolbarlinebreakview';\r\nimport preventDefault from '../bindings/preventdefault';\r\nimport { createDropdown, addToolbarToDropdown } from '../dropdown/utils';\r\nimport normalizeToolbarConfig from './normalizetoolbarconfig';\r\nimport { FocusTracker, KeystrokeHandler, Rect, ResizeObserver, global, isVisible, logWarning } from '@ckeditor/ckeditor5-utils';\r\nimport { icons } from '@ckeditor/ckeditor5-core';\r\nimport { isObject } from 'lodash-es';\r\nimport '../../theme/components/toolbar/toolbar.css';\r\nconst { threeVerticalDots } = icons;\r\nconst NESTED_TOOLBAR_ICONS = {\r\n    alignLeft: icons.alignLeft,\r\n    bold: icons.bold,\r\n    importExport: icons.importExport,\r\n    paragraph: icons.paragraph,\r\n    plus: icons.plus,\r\n    text: icons.text,\r\n    threeVerticalDots: icons.threeVerticalDots\r\n};\r\n/**\r\n * The toolbar view class.\r\n */\r\nexport default class ToolbarView extends View {\r\n    /**\r\n     * Creates an instance of the {@link module:ui/toolbar/toolbarview~ToolbarView} class.\r\n     *\r\n     * Also see {@link #render}.\r\n     *\r\n     * @param locale The localization services instance.\r\n     * @param options Configuration options of the toolbar.\r\n     */\r\n    constructor(locale, options) {\r\n        super(locale);\r\n        const bind = this.bindTemplate;\r\n        const t = this.t;\r\n        this.options = options || {};\r\n        this.set('ariaLabel', t('Editor toolbar'));\r\n        this.set('maxWidth', 'auto');\r\n        this.items = this.createCollection();\r\n        this.focusTracker = new FocusTracker();\r\n        this.keystrokes = new KeystrokeHandler();\r\n        this.set('class', undefined);\r\n        this.set('isCompact', false);\r\n        this.itemsView = new ItemsView(locale);\r\n        this.children = this.createCollection();\r\n        this.children.add(this.itemsView);\r\n        this.focusables = this.createCollection();\r\n        const isRtl = locale.uiLanguageDirection === 'rtl';\r\n        this._focusCycler = new FocusCycler({\r\n            focusables: this.focusables,\r\n            focusTracker: this.focusTracker,\r\n            keystrokeHandler: this.keystrokes,\r\n            actions: {\r\n                // Navigate toolbar items backwards using the arrow[left,up] keys.\r\n                focusPrevious: [isRtl ? 'arrowright' : 'arrowleft', 'arrowup'],\r\n                // Navigate toolbar items forwards using the arrow[right,down] keys.\r\n                focusNext: [isRtl ? 'arrowleft' : 'arrowright', 'arrowdown']\r\n            }\r\n        });\r\n        const classes = [\r\n            'ck',\r\n            'ck-toolbar',\r\n            bind.to('class'),\r\n            bind.if('isCompact', 'ck-toolbar_compact')\r\n        ];\r\n        if (this.options.shouldGroupWhenFull && this.options.isFloating) {\r\n            classes.push('ck-toolbar_floating');\r\n        }\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: classes,\r\n                role: 'toolbar',\r\n                'aria-label': bind.to('ariaLabel'),\r\n                style: {\r\n                    maxWidth: bind.to('maxWidth')\r\n                },\r\n                tabindex: -1\r\n            },\r\n            children: this.children,\r\n            on: {\r\n                // https://github.com/ckeditor/ckeditor5-ui/issues/206\r\n                mousedown: preventDefault(this)\r\n            }\r\n        });\r\n        this._behavior = this.options.shouldGroupWhenFull ? new DynamicGrouping(this) : new StaticLayout(this);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        this.focusTracker.add(this.element);\r\n        // Children added before rendering should be known to the #focusTracker.\r\n        for (const item of this.items) {\r\n            this.focusTracker.add(item.element);\r\n        }\r\n        this.items.on('add', (evt, item) => {\r\n            this.focusTracker.add(item.element);\r\n        });\r\n        this.items.on('remove', (evt, item) => {\r\n            this.focusTracker.remove(item.element);\r\n        });\r\n        // Start listening for the keystrokes coming from #element.\r\n        this.keystrokes.listenTo(this.element);\r\n        this._behavior.render(this);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        this._behavior.destroy();\r\n        this.focusTracker.destroy();\r\n        this.keystrokes.destroy();\r\n        return super.destroy();\r\n    }\r\n    /**\r\n     * Focuses the first focusable in {@link #focusables}.\r\n     */\r\n    focus() {\r\n        this._focusCycler.focusFirst();\r\n    }\r\n    /**\r\n     * Focuses the last focusable in {@link #focusables}.\r\n     */\r\n    focusLast() {\r\n        this._focusCycler.focusLast();\r\n    }\r\n    /**\r\n     * A utility that expands the plain toolbar configuration into\r\n     * {@link module:ui/toolbar/toolbarview~ToolbarView#items} using a given component factory.\r\n     *\r\n     * @param itemsOrConfig The toolbar items or the entire toolbar configuration object.\r\n     * @param factory A factory producing toolbar items.\r\n     * @param removeItems An array of items names to be removed from the configuration. When present, applies\r\n     * to this toolbar and all nested ones as well.\r\n     */\r\n    fillFromConfig(itemsOrConfig, factory, removeItems) {\r\n        this.items.addMany(this._buildItemsFromConfig(itemsOrConfig, factory, removeItems));\r\n    }\r\n    /**\r\n     * A utility that expands the plain toolbar configuration into a list of view items using a given component factory.\r\n     *\r\n     * @param itemsOrConfig The toolbar items or the entire toolbar configuration object.\r\n     * @param factory A factory producing toolbar items.\r\n     * @param removeItems An array of items names to be removed from the configuration. When present, applies\r\n     * to this toolbar and all nested ones as well.\r\n     */\r\n    _buildItemsFromConfig(itemsOrConfig, factory, removeItems) {\r\n        const config = normalizeToolbarConfig(itemsOrConfig);\r\n        const normalizedRemoveItems = removeItems || config.removeItems;\r\n        const itemsToAdd = this._cleanItemsConfiguration(config.items, factory, normalizedRemoveItems)\r\n            .map(item => {\r\n            if (isObject(item)) {\r\n                return this._createNestedToolbarDropdown(item, factory, normalizedRemoveItems);\r\n            }\r\n            else if (item === '|') {\r\n                return new ToolbarSeparatorView();\r\n            }\r\n            else if (item === '-') {\r\n                return new ToolbarLineBreakView();\r\n            }\r\n            return factory.create(item);\r\n        })\r\n            .filter((item) => !!item);\r\n        return itemsToAdd;\r\n    }\r\n    /**\r\n     * Cleans up the {@link module:ui/toolbar/toolbarview~ToolbarView#items} of the toolbar by removing unwanted items and\r\n     * duplicated (obsolete) separators or line breaks.\r\n     *\r\n     * @param items The toolbar items configuration.\r\n     * @param factory A factory producing toolbar items.\r\n     * @param removeItems An array of items names to be removed from the configuration.\r\n     * @returns Items after the clean-up.\r\n     */\r\n    _cleanItemsConfiguration(items, factory, removeItems) {\r\n        const filteredItems = items\r\n            .filter((item, idx, items) => {\r\n            if (item === '|') {\r\n                return true;\r\n            }\r\n            // Items listed in `config.removeItems` should not be added to the toolbar.\r\n            if (removeItems.indexOf(item) !== -1) {\r\n                return false;\r\n            }\r\n            if (item === '-') {\r\n                // The toolbar line breaks must not be rendered when toolbar grouping is enabled.\r\n                // (https://github.com/ckeditor/ckeditor5/issues/8582)\r\n                if (this.options.shouldGroupWhenFull) {\r\n                    /**\r\n                     * The toolbar multiline breaks (`-` items) only work when the automatic button grouping\r\n                     * is disabled in the toolbar configuration.\r\n                     * To do this, set the `shouldNotGroupWhenFull` option to `true` in the editor configuration:\r\n                     *\r\n                     * ```ts\r\n                     * const config = {\r\n                     * \ttoolbar: {\r\n                     * \t\titems: [ ... ],\r\n                     * \t\tshouldNotGroupWhenFull: true\r\n                     * \t}\r\n                     * }\r\n                     * ```\r\n                     *\r\n                     * Learn more about {@link module:core/editor/editorconfig~EditorConfig#toolbar toolbar configuration}.\r\n                     *\r\n                     * @error toolbarview-line-break-ignored-when-grouping-items\r\n                     */\r\n                    logWarning('toolbarview-line-break-ignored-when-grouping-items', items);\r\n                    return false;\r\n                }\r\n                return true;\r\n            }\r\n            // For the items that cannot be instantiated we are sending warning message. We also filter them out.\r\n            if (!isObject(item) && !factory.has(item)) {\r\n                /**\r\n                 * There was a problem processing the configuration of the toolbar. The item with the given\r\n                 * name does not exist so it was omitted when rendering the toolbar.\r\n                 *\r\n                 * This warning usually shows up when the {@link module:core/plugin~Plugin} which is supposed\r\n                 * to provide a toolbar item has not been loaded or there is a typo in the configuration.\r\n                 *\r\n                 * Make sure the plugin responsible for this toolbar item is loaded and the toolbar configuration\r\n                 * is correct, e.g. {@link module:basic-styles/bold~Bold} is loaded for the `'bold'` toolbar item.\r\n                 *\r\n                 * You can use the following snippet to retrieve all available toolbar items:\r\n                 *\r\n                 * ```ts\r\n                 * Array.from( editor.ui.componentFactory.names() );\r\n                 * ```\r\n                 *\r\n                 * @error toolbarview-item-unavailable\r\n                 * @param item The name of the component or nested toolbar definition.\r\n                 */\r\n                logWarning('toolbarview-item-unavailable', { item });\r\n                return false;\r\n            }\r\n            return true;\r\n        });\r\n        return this._cleanSeparatorsAndLineBreaks(filteredItems);\r\n    }\r\n    /**\r\n     * Remove leading, trailing, and duplicated separators (`-` and `|`).\r\n     *\r\n     * @returns Toolbar items after the separator and line break clean-up.\r\n     */\r\n    _cleanSeparatorsAndLineBreaks(items) {\r\n        const nonSeparatorPredicate = (item) => (item !== '-' && item !== '|');\r\n        const count = items.length;\r\n        // Find an index of the first item that is not a separator.\r\n        const firstCommandItemIndex = items.findIndex(nonSeparatorPredicate);\r\n        // Items include separators only. There is no point in displaying them.\r\n        if (firstCommandItemIndex === -1) {\r\n            return [];\r\n        }\r\n        // Search from the end of the list, then convert found index back to the original direction.\r\n        const lastCommandItemIndex = count - items\r\n            .slice()\r\n            .reverse()\r\n            .findIndex(nonSeparatorPredicate);\r\n        return items\r\n            // Return items without the leading and trailing separators.\r\n            .slice(firstCommandItemIndex, lastCommandItemIndex)\r\n            // Remove duplicated separators.\r\n            .filter((name, idx, items) => {\r\n            // Filter only separators.\r\n            if (nonSeparatorPredicate(name)) {\r\n                return true;\r\n            }\r\n            const isDuplicated = idx > 0 && items[idx - 1] === name;\r\n            return !isDuplicated;\r\n        });\r\n    }\r\n    /**\r\n     * Creates a user-defined dropdown containing a toolbar with items.\r\n     *\r\n     * @param definition A definition of the nested toolbar dropdown.\r\n     * @param definition.label A label of the dropdown.\r\n     * @param definition.icon An icon of the drop-down. One of 'bold', 'plus', 'text', 'importExport', 'alignLeft',\r\n     * 'paragraph' or an SVG string. When `false` is passed, no icon will be used.\r\n     * @param definition.withText When set `true`, the label of the dropdown will be visible. See\r\n     * {@link module:ui/button/buttonview~ButtonView#withText} to learn more.\r\n     * @param definition.tooltip A tooltip of the dropdown button. See\r\n     * {@link module:ui/button/buttonview~ButtonView#tooltip} to learn more. Defaults to `true`.\r\n     * @param componentFactory Component factory used to create items\r\n     * of the nested toolbar.\r\n     */\r\n    _createNestedToolbarDropdown(definition, componentFactory, removeItems) {\r\n        let { label, icon, items, tooltip = true, withText = false } = definition;\r\n        items = this._cleanItemsConfiguration(items, componentFactory, removeItems);\r\n        // There is no point in rendering a dropdown without items.\r\n        if (!items.length) {\r\n            return null;\r\n        }\r\n        const locale = this.locale;\r\n        const dropdownView = createDropdown(locale);\r\n        if (!label) {\r\n            /**\r\n             * A dropdown definition in the toolbar configuration is missing a text label.\r\n             *\r\n             * Without a label, the dropdown becomes inaccessible to users relying on assistive technologies.\r\n             * Make sure the `label` property is set in your drop-down configuration:\r\n             *\r\n             * ```json\r\n             * {\r\n             * \tlabel: 'A human-readable label',\r\n             * \ticon: '...',\r\n             * \titems: [ ... ]\r\n             * },\r\n             * ```\r\n             *\r\n             * Learn more about {@link module:core/editor/editorconfig~EditorConfig#toolbar toolbar configuration}.\r\n             *\r\n             * @error toolbarview-nested-toolbar-dropdown-missing-label\r\n             */\r\n            logWarning('toolbarview-nested-toolbar-dropdown-missing-label', definition);\r\n        }\r\n        dropdownView.class = 'ck-toolbar__nested-toolbar-dropdown';\r\n        dropdownView.buttonView.set({\r\n            label,\r\n            tooltip,\r\n            withText: !!withText\r\n        });\r\n        // Allow disabling icon by passing false.\r\n        if (icon !== false) {\r\n            // A pre-defined icon picked by name, SVG string, a fallback (default) icon.\r\n            dropdownView.buttonView.icon = NESTED_TOOLBAR_ICONS[icon] || icon || threeVerticalDots;\r\n        }\r\n        // If the icon is disabled, display the label automatically.\r\n        else {\r\n            dropdownView.buttonView.withText = true;\r\n        }\r\n        addToolbarToDropdown(dropdownView, () => (dropdownView.toolbarView._buildItemsFromConfig(items, componentFactory, removeItems)));\r\n        return dropdownView;\r\n    }\r\n}\r\n/**\r\n * An inner block of the {@link module:ui/toolbar/toolbarview~ToolbarView} hosting its\r\n * {@link module:ui/toolbar/toolbarview~ToolbarView#items}.\r\n */\r\nclass ItemsView extends View {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        this.children = this.createCollection();\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-toolbar__items'\r\n                ]\r\n            },\r\n            children: this.children\r\n        });\r\n    }\r\n}\r\n/**\r\n * A toolbar behavior that makes it static and unresponsive to the changes of the environment.\r\n * At the same time, it also makes it possible to display a toolbar with a vertical layout\r\n * using the {@link module:ui/toolbar/toolbarview~ToolbarView#isVertical} property.\r\n */\r\nclass StaticLayout {\r\n    /**\r\n     * Creates an instance of the {@link module:ui/toolbar/toolbarview~StaticLayout} toolbar\r\n     * behavior.\r\n     *\r\n     * @param view An instance of the toolbar that this behavior is added to.\r\n     */\r\n    constructor(view) {\r\n        const bind = view.bindTemplate;\r\n        // Static toolbar can be vertical when needed.\r\n        view.set('isVertical', false);\r\n        // 1:1 pass–through binding, all ToolbarView#items are visible.\r\n        view.itemsView.children.bindTo(view.items).using(item => item);\r\n        // 1:1 pass–through binding, all ToolbarView#items are focusable.\r\n        view.focusables.bindTo(view.items).using(item => item);\r\n        view.extendTemplate({\r\n            attributes: {\r\n                class: [\r\n                    // When vertical, the toolbar has an additional CSS class.\r\n                    bind.if('isVertical', 'ck-toolbar_vertical')\r\n                ]\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() { }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() { }\r\n}\r\n/**\r\n * A toolbar behavior that makes the items respond to changes in the geometry.\r\n *\r\n * In a nutshell, it groups {@link module:ui/toolbar/toolbarview~ToolbarView#items}\r\n * that do not fit visually into a single row of the toolbar (due to limited space).\r\n * Items that do not fit are aggregated in a dropdown displayed at the end of the toolbar.\r\n *\r\n * ```\r\n *\t┌──────────────────────────────────────── ToolbarView ──────────────────────────────────────────┐\r\n *\t| ┌─────────────────────────────────────── #children ─────────────────────────────────────────┐ |\r\n *\t| |   ┌─────── #itemsView ────────┐ ┌──────────────────────┐ ┌── #groupedItemsDropdown ───┐   | |\r\n *\t| |   |       #ungroupedItems     | | ToolbarSeparatorView | |        #groupedItems       |   | |\r\n *\t| |   └──────────────────────────-┘ └──────────────────────┘ └────────────────────────────┘   | |\r\n *\t| |                                  \\---------- only when toolbar items overflow -------/    | |\r\n *\t| └───────────────────────────────────────────────────────────────────────────────────────────┘ |\r\n *\t└───────────────────────────────────────────────────────────────────────────────────────────────┘\r\n * ```\r\n */\r\nclass DynamicGrouping {\r\n    /**\r\n     * Creates an instance of the {@link module:ui/toolbar/toolbarview~DynamicGrouping} toolbar\r\n     * behavior.\r\n     *\r\n     * @param view An instance of the toolbar that this behavior is added to.\r\n     */\r\n    constructor(view) {\r\n        /**\r\n         * An instance of the resize observer that helps dynamically determine the geometry of the toolbar\r\n         * and manage items that do not fit into a single row.\r\n         *\r\n         * **Note:** Created in {@link #_enableGroupingOnResize}.\r\n         *\r\n         * @readonly\r\n         */\r\n        this.resizeObserver = null;\r\n        /**\r\n         * A cached value of the horizontal padding style used by {@link #_updateGrouping}\r\n         * to manage the {@link module:ui/toolbar/toolbarview~ToolbarView#items} that do not fit into\r\n         * a single toolbar line. This value can be reused between updates because it is unlikely that\r\n         * the padding will change and re–using `Window.getComputedStyle()` is expensive.\r\n         *\r\n         * @readonly\r\n         */\r\n        this.cachedPadding = null;\r\n        /**\r\n         * A flag indicating that an items grouping update has been queued (e.g. due to the toolbar being visible)\r\n         * and should be executed immediately the next time the toolbar shows up.\r\n         *\r\n         * @readonly\r\n         */\r\n        this.shouldUpdateGroupingOnNextResize = false;\r\n        this.view = view;\r\n        this.viewChildren = view.children;\r\n        this.viewFocusables = view.focusables;\r\n        this.viewItemsView = view.itemsView;\r\n        this.viewFocusTracker = view.focusTracker;\r\n        this.viewLocale = view.locale;\r\n        this.ungroupedItems = view.createCollection();\r\n        this.groupedItems = view.createCollection();\r\n        this.groupedItemsDropdown = this._createGroupedItemsDropdown();\r\n        // Only those items that were not grouped are visible to the user.\r\n        view.itemsView.children.bindTo(this.ungroupedItems).using(item => item);\r\n        // Make sure all #items visible in the main space of the toolbar are \"focuscycleable\".\r\n        this.ungroupedItems.on('change', this._updateFocusCycleableItems.bind(this));\r\n        // Make sure the #groupedItemsDropdown is also included in cycling when it appears.\r\n        view.children.on('change', this._updateFocusCycleableItems.bind(this));\r\n        // ToolbarView#items is dynamic. When an item is added or removed, it should be automatically\r\n        // represented in either grouped or ungrouped items at the right index.\r\n        // In other words #items == concat( #ungroupedItems, #groupedItems )\r\n        // (in length and order).\r\n        view.items.on('change', (evt, changeData) => {\r\n            const index = changeData.index;\r\n            const added = Array.from(changeData.added);\r\n            // Removing.\r\n            for (const removedItem of changeData.removed) {\r\n                if (index >= this.ungroupedItems.length) {\r\n                    this.groupedItems.remove(removedItem);\r\n                }\r\n                else {\r\n                    this.ungroupedItems.remove(removedItem);\r\n                }\r\n            }\r\n            // Adding.\r\n            for (let currentIndex = index; currentIndex < index + added.length; currentIndex++) {\r\n                const addedItem = added[currentIndex - index];\r\n                if (currentIndex > this.ungroupedItems.length) {\r\n                    this.groupedItems.add(addedItem, currentIndex - this.ungroupedItems.length);\r\n                }\r\n                else {\r\n                    this.ungroupedItems.add(addedItem, currentIndex);\r\n                }\r\n            }\r\n            // When new ungrouped items join in and land in #ungroupedItems, there's a chance it causes\r\n            // the toolbar to overflow.\r\n            // Consequently if removed from grouped or ungrouped items, there is a chance\r\n            // some new space is available and we could do some ungrouping.\r\n            this._updateGrouping();\r\n        });\r\n        view.extendTemplate({\r\n            attributes: {\r\n                class: [\r\n                    // To group items dynamically, the toolbar needs a dedicated CSS class.\r\n                    'ck-toolbar_grouping'\r\n                ]\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Enables dynamic items grouping based on the dimensions of the toolbar.\r\n     *\r\n     * @param view An instance of the toolbar that this behavior is added to.\r\n     */\r\n    render(view) {\r\n        this.viewElement = view.element;\r\n        this._enableGroupingOnResize();\r\n        this._enableGroupingOnMaxWidthChange(view);\r\n    }\r\n    /**\r\n     * Cleans up the internals used by this behavior.\r\n     */\r\n    destroy() {\r\n        // The dropdown may not be in ToolbarView#children at the moment of toolbar destruction\r\n        // so let's make sure it's actually destroyed along with the toolbar.\r\n        this.groupedItemsDropdown.destroy();\r\n        this.resizeObserver.destroy();\r\n    }\r\n    /**\r\n     * When called, it will check if any of the {@link #ungroupedItems} do not fit into a single row of the toolbar,\r\n     * and it will move them to the {@link #groupedItems} when it happens.\r\n     *\r\n     * At the same time, it will also check if there is enough space in the toolbar for the first of the\r\n     * {@link #groupedItems} to be returned back to {@link #ungroupedItems} and still fit into a single row\r\n     * without the toolbar wrapping.\r\n     */\r\n    _updateGrouping() {\r\n        // Do no grouping–related geometry analysis when the toolbar is detached from visible DOM,\r\n        // for instance before #render(), or after render but without a parent or a parent detached\r\n        // from DOM. DOMRects won't work anyway and there will be tons of warning in the console and\r\n        // nothing else. This happens, for instance, when the toolbar is detached from DOM and\r\n        // some logic adds or removes its #items.\r\n        if (!this.viewElement.ownerDocument.body.contains(this.viewElement)) {\r\n            return;\r\n        }\r\n        // Do not update grouping when the element is invisible. Such toolbar has DOMRect filled with zeros\r\n        // and that would cause all items to be grouped. Instead, queue the grouping so it runs next time\r\n        // the toolbar is visible (the next ResizeObserver callback execution). This is handy because\r\n        // the grouping could be caused by increasing the #maxWidth when the toolbar was invisible and the next\r\n        // time it shows up, some items could actually be ungrouped (https://github.com/ckeditor/ckeditor5/issues/6575).\r\n        if (!isVisible(this.viewElement)) {\r\n            this.shouldUpdateGroupingOnNextResize = true;\r\n            return;\r\n        }\r\n        // Remember how many items were initially grouped so at the it is possible to figure out if the number\r\n        // of grouped items has changed. If the number has changed, geometry of the toolbar has also changed.\r\n        const initialGroupedItemsCount = this.groupedItems.length;\r\n        let wereItemsGrouped;\r\n        // Group #items as long as some wrap to the next row. This will happen, for instance,\r\n        // when the toolbar is getting narrow and there is not enough space to display all items in\r\n        // a single row.\r\n        while (this._areItemsOverflowing) {\r\n            this._groupLastItem();\r\n            wereItemsGrouped = true;\r\n        }\r\n        // If none were grouped now but there were some items already grouped before,\r\n        // then, what the hell, maybe let's see if some of them can be ungrouped. This happens when,\r\n        // for instance, the toolbar is stretching and there's more space in it than before.\r\n        if (!wereItemsGrouped && this.groupedItems.length) {\r\n            // Ungroup items as long as none are overflowing or there are none to ungroup left.\r\n            while (this.groupedItems.length && !this._areItemsOverflowing) {\r\n                this._ungroupFirstItem();\r\n            }\r\n            // If the ungrouping ended up with some item wrapping to the next row,\r\n            // put it back to the group toolbar (\"undo the last ungroup\"). We don't know whether\r\n            // an item will wrap or not until we ungroup it (that's a DOM/CSS thing) so this\r\n            // clean–up is vital for the algorithm.\r\n            if (this._areItemsOverflowing) {\r\n                this._groupLastItem();\r\n            }\r\n        }\r\n        if (this.groupedItems.length !== initialGroupedItemsCount) {\r\n            this.view.fire('groupedItemsUpdate');\r\n        }\r\n    }\r\n    /**\r\n     * Returns `true` when {@link module:ui/toolbar/toolbarview~ToolbarView#element} children visually overflow,\r\n     * for instance if the toolbar is narrower than its members. Returns `false` otherwise.\r\n     */\r\n    get _areItemsOverflowing() {\r\n        // An empty toolbar cannot overflow.\r\n        if (!this.ungroupedItems.length) {\r\n            return false;\r\n        }\r\n        const element = this.viewElement;\r\n        const uiLanguageDirection = this.viewLocale.uiLanguageDirection;\r\n        const lastChildRect = new Rect(element.lastChild);\r\n        const toolbarRect = new Rect(element);\r\n        if (!this.cachedPadding) {\r\n            const computedStyle = global.window.getComputedStyle(element);\r\n            const paddingProperty = uiLanguageDirection === 'ltr' ? 'paddingRight' : 'paddingLeft';\r\n            // parseInt() is essential because of quirky floating point numbers logic and DOM.\r\n            // If the padding turned out too big because of that, the grouped items dropdown would\r\n            // always look (from the Rect perspective) like it overflows (while it's not).\r\n            this.cachedPadding = Number.parseInt(computedStyle[paddingProperty]);\r\n        }\r\n        if (uiLanguageDirection === 'ltr') {\r\n            return lastChildRect.right > toolbarRect.right - this.cachedPadding;\r\n        }\r\n        else {\r\n            return lastChildRect.left < toolbarRect.left + this.cachedPadding;\r\n        }\r\n    }\r\n    /**\r\n     * Enables the functionality that prevents {@link #ungroupedItems} from overflowing (wrapping to the next row)\r\n     * upon resize when there is little space available. Instead, the toolbar items are moved to the\r\n     * {@link #groupedItems} collection and displayed in a dropdown at the end of the row (which has its own nested toolbar).\r\n     *\r\n     * When called, the toolbar will automatically analyze the location of its {@link #ungroupedItems} and \"group\"\r\n     * them in the dropdown if necessary. It will also observe the browser window for size changes in\r\n     * the future and respond to them by grouping more items or reverting already grouped back, depending\r\n     * on the visual space available.\r\n     */\r\n    _enableGroupingOnResize() {\r\n        let previousWidth;\r\n        // TODO: Consider debounce.\r\n        this.resizeObserver = new ResizeObserver(this.viewElement, entry => {\r\n            if (!previousWidth || previousWidth !== entry.contentRect.width || this.shouldUpdateGroupingOnNextResize) {\r\n                this.shouldUpdateGroupingOnNextResize = false;\r\n                this._updateGrouping();\r\n                previousWidth = entry.contentRect.width;\r\n            }\r\n        });\r\n        this._updateGrouping();\r\n    }\r\n    /**\r\n     * Enables the grouping functionality, just like {@link #_enableGroupingOnResize} but the difference is that\r\n     * it listens to the changes of {@link module:ui/toolbar/toolbarview~ToolbarView#maxWidth} instead.\r\n     */\r\n    _enableGroupingOnMaxWidthChange(view) {\r\n        view.on('change:maxWidth', () => {\r\n            this._updateGrouping();\r\n        });\r\n    }\r\n    /**\r\n     * When called, it will remove the last item from {@link #ungroupedItems} and move it back\r\n     * to the {@link #groupedItems} collection.\r\n     *\r\n     * The opposite of {@link #_ungroupFirstItem}.\r\n     */\r\n    _groupLastItem() {\r\n        if (!this.groupedItems.length) {\r\n            this.viewChildren.add(new ToolbarSeparatorView());\r\n            this.viewChildren.add(this.groupedItemsDropdown);\r\n            this.viewFocusTracker.add(this.groupedItemsDropdown.element);\r\n        }\r\n        this.groupedItems.add(this.ungroupedItems.remove(this.ungroupedItems.last), 0);\r\n    }\r\n    /**\r\n     * Moves the very first item belonging to {@link #groupedItems} back\r\n     * to the {@link #ungroupedItems} collection.\r\n     *\r\n     * The opposite of {@link #_groupLastItem}.\r\n     */\r\n    _ungroupFirstItem() {\r\n        this.ungroupedItems.add(this.groupedItems.remove(this.groupedItems.first));\r\n        if (!this.groupedItems.length) {\r\n            this.viewChildren.remove(this.groupedItemsDropdown);\r\n            this.viewChildren.remove(this.viewChildren.last);\r\n            this.viewFocusTracker.remove(this.groupedItemsDropdown.element);\r\n        }\r\n    }\r\n    /**\r\n     * Creates the {@link #groupedItemsDropdown} that hosts the members of the {@link #groupedItems}\r\n     * collection when there is not enough space in the toolbar to display all items in a single row.\r\n     */\r\n    _createGroupedItemsDropdown() {\r\n        const locale = this.viewLocale;\r\n        const t = locale.t;\r\n        const dropdown = createDropdown(locale);\r\n        dropdown.class = 'ck-toolbar__grouped-dropdown';\r\n        // Make sure the dropdown never sticks out to the left/right. It should be under the main toolbar.\r\n        // (https://github.com/ckeditor/ckeditor5/issues/5608)\r\n        dropdown.panelPosition = locale.uiLanguageDirection === 'ltr' ? 'sw' : 'se';\r\n        addToolbarToDropdown(dropdown, this.groupedItems);\r\n        dropdown.buttonView.set({\r\n            label: t('Show more items'),\r\n            tooltip: true,\r\n            tooltipPosition: locale.uiLanguageDirection === 'rtl' ? 'se' : 'sw',\r\n            icon: threeVerticalDots\r\n        });\r\n        return dropdown;\r\n    }\r\n    /**\r\n     * Updates the {@link module:ui/toolbar/toolbarview~ToolbarView#focusables focus–cycleable items}\r\n     * collection so it represents the up–to–date state of the UI from the perspective of the user.\r\n     *\r\n     * For instance, the {@link #groupedItemsDropdown} can show up and hide but when it is visible,\r\n     * it must be subject to focus cycling in the toolbar.\r\n     *\r\n     * See the {@link module:ui/toolbar/toolbarview~ToolbarView#focusables collection} documentation\r\n     * to learn more about the purpose of this method.\r\n     */\r\n    _updateFocusCycleableItems() {\r\n        this.viewFocusables.clear();\r\n        this.ungroupedItems.map(item => {\r\n            this.viewFocusables.add(item);\r\n        });\r\n        if (this.groupedItems.length) {\r\n            this.viewFocusables.add(this.groupedItemsDropdown);\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * A helper which executes a native `Event.preventDefault()` if the target of an event equals the\r\n * {@link module:ui/view~View#element element of the view}. It shortens the definition of a\r\n * {@link module:ui/view~View#template template}.\r\n *\r\n * ```ts\r\n * // In a class extending View.\r\n * import preventDefault from '@ckeditor/ckeditor5-ui/src/bindings/preventdefault';\r\n *\r\n * // ...\r\n *\r\n * this.setTemplate( {\r\n * \ttag: 'div',\r\n *\r\n * \ton: {\r\n * \t\t// Prevent the default mousedown action on this view.\r\n * \t\tmousedown: preventDefault( this )\r\n * \t}\r\n * } );\r\n * ```\r\n *\r\n * @param view View instance that defines the template.\r\n */\r\nexport default function preventDefault(view) {\r\n    return view.bindTemplate.to(evt => {\r\n        if (evt.target === view.element) {\r\n            evt.preventDefault();\r\n        }\r\n    });\r\n}\r\n","import api from \"!../../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../../css-loader/dist/cjs.js!../../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./list.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/list/listview\r\n */\r\nimport View from '../view';\r\nimport FocusCycler from '../focuscycler';\r\nimport { FocusTracker, KeystrokeHandler } from '@ckeditor/ckeditor5-utils';\r\nimport '../../theme/components/list/list.css';\r\n/**\r\n * The list view class.\r\n */\r\nexport default class ListView extends View {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        const bind = this.bindTemplate;\r\n        this.items = this.createCollection();\r\n        this.focusTracker = new FocusTracker();\r\n        this.keystrokes = new KeystrokeHandler();\r\n        this._focusCycler = new FocusCycler({\r\n            focusables: this.items,\r\n            focusTracker: this.focusTracker,\r\n            keystrokeHandler: this.keystrokes,\r\n            actions: {\r\n                // Navigate list items backwards using the arrowup key.\r\n                focusPrevious: 'arrowup',\r\n                // Navigate toolbar items forwards using the arrowdown key.\r\n                focusNext: 'arrowdown'\r\n            }\r\n        });\r\n        this.set('ariaLabel', undefined);\r\n        this.set('role', undefined);\r\n        this.setTemplate({\r\n            tag: 'ul',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-reset',\r\n                    'ck-list'\r\n                ],\r\n                role: bind.to('role'),\r\n                'aria-label': bind.to('ariaLabel')\r\n            },\r\n            children: this.items\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        // Items added before rendering should be known to the #focusTracker.\r\n        for (const item of this.items) {\r\n            this.focusTracker.add(item.element);\r\n        }\r\n        this.items.on('add', (evt, item) => {\r\n            this.focusTracker.add(item.element);\r\n        });\r\n        this.items.on('remove', (evt, item) => {\r\n            this.focusTracker.remove(item.element);\r\n        });\r\n        // Start listening for the keystrokes coming from #element.\r\n        this.keystrokes.listenTo(this.element);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        this.focusTracker.destroy();\r\n        this.keystrokes.destroy();\r\n    }\r\n    /**\r\n     * Focuses the first focusable in {@link #items}.\r\n     */\r\n    focus() {\r\n        this._focusCycler.focusFirst();\r\n    }\r\n    /**\r\n     * Focuses the last focusable in {@link #items}.\r\n     */\r\n    focusLast() {\r\n        this._focusCycler.focusLast();\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/list/listitemview\r\n */\r\nimport View from '../view';\r\n/**\r\n * The list item view class.\r\n */\r\nexport default class ListItemView extends View {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        const bind = this.bindTemplate;\r\n        this.set('isVisible', true);\r\n        this.children = this.createCollection();\r\n        this.setTemplate({\r\n            tag: 'li',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-list__item',\r\n                    bind.if('isVisible', 'ck-hidden', value => !value)\r\n                ],\r\n                role: 'presentation'\r\n            },\r\n            children: this.children\r\n        });\r\n    }\r\n    /**\r\n     * Focuses the list item.\r\n     */\r\n    focus() {\r\n        this.children.first.focus();\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/list/listseparatorview\r\n */\r\nimport View from '../view';\r\n/**\r\n * The list separator view class.\r\n */\r\nexport default class ListSeparatorView extends View {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        this.setTemplate({\r\n            tag: 'li',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-list__separator'\r\n                ]\r\n            }\r\n        });\r\n    }\r\n}\r\n","import api from \"!../../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../../css-loader/dist/cjs.js!../../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./splitbutton.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/dropdown/button/splitbuttonview\r\n */\r\nimport View from '../../view';\r\nimport ButtonView from '../../button/buttonview';\r\nimport { KeystrokeHandler, FocusTracker } from '@ckeditor/ckeditor5-utils';\r\nimport dropdownArrowIcon from '../../../theme/icons/dropdown-arrow.svg';\r\nimport '../../../theme/components/dropdown/splitbutton.css';\r\n/**\r\n * The split button view class.\r\n *\r\n * ```ts\r\n * const view = new SplitButtonView();\r\n *\r\n * view.set( {\r\n * \tlabel: 'A button',\r\n * \tkeystroke: 'Ctrl+B',\r\n * \ttooltip: true\r\n * } );\r\n *\r\n * view.render();\r\n *\r\n * document.body.append( view.element );\r\n * ```\r\n *\r\n * Also see the {@link module:ui/dropdown/utils~createDropdown `createDropdown()` util}.\r\n */\r\nexport default class SplitButtonView extends View {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        const bind = this.bindTemplate;\r\n        // Implement the Button interface.\r\n        this.set('class', undefined);\r\n        this.set('labelStyle', undefined);\r\n        this.set('icon', undefined);\r\n        this.set('isEnabled', true);\r\n        this.set('isOn', false);\r\n        this.set('isToggleable', false);\r\n        this.set('isVisible', true);\r\n        this.set('keystroke', undefined);\r\n        this.set('withKeystroke', false);\r\n        this.set('label', undefined);\r\n        this.set('tabindex', -1);\r\n        this.set('tooltip', false);\r\n        this.set('tooltipPosition', 's');\r\n        this.set('type', 'button');\r\n        this.set('withText', false);\r\n        this.children = this.createCollection();\r\n        this.actionView = this._createActionView();\r\n        this.arrowView = this._createArrowView();\r\n        this.keystrokes = new KeystrokeHandler();\r\n        this.focusTracker = new FocusTracker();\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-splitbutton',\r\n                    bind.to('class'),\r\n                    bind.if('isVisible', 'ck-hidden', value => !value),\r\n                    this.arrowView.bindTemplate.if('isOn', 'ck-splitbutton_open')\r\n                ]\r\n            },\r\n            children: this.children\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        this.children.add(this.actionView);\r\n        this.children.add(this.arrowView);\r\n        this.focusTracker.add(this.actionView.element);\r\n        this.focusTracker.add(this.arrowView.element);\r\n        this.keystrokes.listenTo(this.element);\r\n        // Overrides toolbar focus cycling behavior.\r\n        this.keystrokes.set('arrowright', (evt, cancel) => {\r\n            if (this.focusTracker.focusedElement === this.actionView.element) {\r\n                this.arrowView.focus();\r\n                cancel();\r\n            }\r\n        });\r\n        // Overrides toolbar focus cycling behavior.\r\n        this.keystrokes.set('arrowleft', (evt, cancel) => {\r\n            if (this.focusTracker.focusedElement === this.arrowView.element) {\r\n                this.actionView.focus();\r\n                cancel();\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        this.focusTracker.destroy();\r\n        this.keystrokes.destroy();\r\n    }\r\n    /**\r\n     * Focuses the {@link module:ui/button/buttonview~ButtonView#element} of the action part of split button.\r\n     */\r\n    focus() {\r\n        this.actionView.focus();\r\n    }\r\n    /**\r\n     * Creates a {@link module:ui/button/buttonview~ButtonView} instance as {@link #actionView} and binds it with main split button\r\n     * attributes.\r\n     */\r\n    _createActionView() {\r\n        const actionView = new ButtonView();\r\n        actionView.bind('icon', 'isEnabled', 'isOn', 'isToggleable', 'keystroke', 'label', 'tabindex', 'tooltip', 'tooltipPosition', 'type', 'withText').to(this);\r\n        actionView.extendTemplate({\r\n            attributes: {\r\n                class: 'ck-splitbutton__action'\r\n            }\r\n        });\r\n        actionView.delegate('execute').to(this);\r\n        return actionView;\r\n    }\r\n    /**\r\n     * Creates a {@link module:ui/button/buttonview~ButtonView} instance as {@link #arrowView} and binds it with main split button\r\n     * attributes.\r\n     */\r\n    _createArrowView() {\r\n        const arrowView = new ButtonView();\r\n        const bind = arrowView.bindTemplate;\r\n        arrowView.icon = dropdownArrowIcon;\r\n        arrowView.extendTemplate({\r\n            attributes: {\r\n                class: [\r\n                    'ck-splitbutton__arrow'\r\n                ],\r\n                'data-cke-tooltip-disabled': bind.to('isOn'),\r\n                'aria-haspopup': true,\r\n                'aria-expanded': bind.to('isOn', value => String(value))\r\n            }\r\n        });\r\n        arrowView.bind('isEnabled').to(this);\r\n        arrowView.bind('label').to(this);\r\n        arrowView.bind('tooltip').to(this);\r\n        arrowView.delegate('execute').to(this, 'open');\r\n        return arrowView;\r\n    }\r\n}\r\n","import api from \"!../../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../../css-loader/dist/cjs.js!../../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./toolbardropdown.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../../css-loader/dist/cjs.js!../../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./listdropdown.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/dropdown/utils\r\n */\r\nimport DropdownPanelView from './dropdownpanelview';\r\nimport DropdownView from './dropdownview';\r\nimport DropdownButtonView from './button/dropdownbuttonview';\r\nimport ToolbarView from '../toolbar/toolbarview';\r\nimport ListView from '../list/listview';\r\nimport ListItemView from '../list/listitemview';\r\nimport ListSeparatorView from '../list/listseparatorview';\r\nimport ButtonView from '../button/buttonview';\r\nimport SplitButtonView from './button/splitbuttonview';\r\nimport SwitchButtonView from '../button/switchbuttonview';\r\nimport ViewCollection from '../viewcollection';\r\nimport clickOutsideHandler from '../bindings/clickoutsidehandler';\r\nimport { global, priorities, logWarning } from '@ckeditor/ckeditor5-utils';\r\nimport '../../theme/components/dropdown/toolbardropdown.css';\r\nimport '../../theme/components/dropdown/listdropdown.css';\r\n/**\r\n * A helper for creating dropdowns. It creates an instance of a {@link module:ui/dropdown/dropdownview~DropdownView dropdown},\r\n * with a {@link module:ui/dropdown/button/dropdownbutton~DropdownButton button},\r\n * {@link module:ui/dropdown/dropdownpanelview~DropdownPanelView panel} and all standard dropdown's behaviors.\r\n *\r\n * # Creating dropdowns\r\n *\r\n * By default, the default {@link module:ui/dropdown/button/dropdownbuttonview~DropdownButtonView} class is used as\r\n * definition of the button:\r\n *\r\n * ```ts\r\n * const dropdown = createDropdown( model );\r\n *\r\n * // Configure dropdown's button properties:\r\n * dropdown.buttonView.set( {\r\n * \tlabel: 'A dropdown',\r\n * \twithText: true\r\n * } );\r\n *\r\n * dropdown.render();\r\n *\r\n * // Will render a dropdown labeled \"A dropdown\" with an empty panel.\r\n * document.body.appendChild( dropdown.element );\r\n * ```\r\n *\r\n * You can also provide other button views (they need to implement the\r\n * {@link module:ui/dropdown/button/dropdownbutton~DropdownButton} interface). For instance, you can use\r\n * {@link module:ui/dropdown/button/splitbuttonview~SplitButtonView} to create a dropdown with a split button.\r\n *\r\n * ```ts\r\n * const dropdown = createDropdown( locale, SplitButtonView );\r\n *\r\n * // Configure dropdown's button properties:\r\n * dropdown.buttonView.set( {\r\n * \tlabel: 'A dropdown',\r\n * \twithText: true\r\n * } );\r\n *\r\n * dropdown.buttonView.on( 'execute', () => {\r\n * \t// Add the behavior of the \"action part\" of the split button.\r\n * \t// Split button consists of the \"action part\" and \"arrow part\".\r\n * \t// The arrow opens the dropdown while the action part can have some other behavior.\r\n * } );\r\n *\r\n * dropdown.render();\r\n *\r\n * // Will render a dropdown labeled \"A dropdown\" with an empty panel.\r\n * document.body.appendChild( dropdown.element );\r\n * ```\r\n *\r\n * # Adding content to the dropdown's panel\r\n *\r\n * The content of the panel can be inserted directly into the `dropdown.panelView.element`:\r\n *\r\n * ```ts\r\n * dropdown.panelView.element.textContent = 'Content of the panel';\r\n * ```\r\n *\r\n * However, most of the time you will want to add there either a {@link module:ui/list/listview~ListView list of options}\r\n * or a list of buttons (i.e. a {@link module:ui/toolbar/toolbarview~ToolbarView toolbar}).\r\n * To simplify the task, you can use, respectively, {@link module:ui/dropdown/utils~addListToDropdown} or\r\n * {@link module:ui/dropdown/utils~addToolbarToDropdown} utils.\r\n *\r\n * @param locale The locale instance.\r\n * @param ButtonClass The dropdown button view class. Needs to implement the\r\n * {@link module:ui/dropdown/button/dropdownbutton~DropdownButton} interface.\r\n * @returns The dropdown view instance.\r\n */\r\nexport function createDropdown(locale, ButtonClass = DropdownButtonView) {\r\n    const buttonView = new ButtonClass(locale);\r\n    const panelView = new DropdownPanelView(locale);\r\n    const dropdownView = new DropdownView(locale, buttonView, panelView);\r\n    buttonView.bind('isEnabled').to(dropdownView);\r\n    if (buttonView instanceof SplitButtonView) {\r\n        buttonView.arrowView.bind('isOn').to(dropdownView, 'isOpen');\r\n    }\r\n    else {\r\n        buttonView.bind('isOn').to(dropdownView, 'isOpen');\r\n    }\r\n    addDefaultBehavior(dropdownView);\r\n    return dropdownView;\r\n}\r\n/**\r\n * Adds an instance of {@link module:ui/toolbar/toolbarview~ToolbarView} to a dropdown.\r\n *\r\n * ```ts\r\n * const buttonsCreator = () => {\r\n * \tconst buttons = [];\r\n *\r\n * \t// Either create a new ButtonView instance or create existing.\r\n * \tbuttons.push( new ButtonView() );\r\n * \tbuttons.push( editor.ui.componentFactory.create( 'someButton' ) );\r\n * };\r\n *\r\n * const dropdown = createDropdown( locale );\r\n *\r\n * addToolbarToDropdown( dropdown, buttonsCreator, { isVertical: true } );\r\n *\r\n * // Will render a vertical button dropdown labeled \"A button dropdown\"\r\n * // with a button group in the panel containing two buttons.\r\n * // Buttons inside the dropdown will be created on first dropdown panel open.\r\n * dropdown.render()\r\n * document.body.appendChild( dropdown.element );\r\n * ```\r\n *\r\n * **Note:** To improve the accessibility, you can tell the dropdown to focus the first active button of the toolbar when the dropdown\r\n * {@link module:ui/dropdown/dropdownview~DropdownView#isOpen gets open}. See the documentation of `options` to learn more.\r\n *\r\n * **Note:** Toolbar view will be created on first open of the dropdown.\r\n *\r\n * See {@link module:ui/dropdown/utils~createDropdown} and {@link module:ui/toolbar/toolbarview~ToolbarView}.\r\n *\r\n * @param dropdownView A dropdown instance to which `ToolbarView` will be added.\r\n * @param options.enableActiveItemFocusOnDropdownOpen When set `true`, the focus will automatically move to the first\r\n * active {@link module:ui/toolbar/toolbarview~ToolbarView#items item} of the toolbar upon\r\n * {@link module:ui/dropdown/dropdownview~DropdownView#isOpen opening} the dropdown. Active items are those with the `isOn` property set\r\n * `true` (for instance {@link module:ui/button/buttonview~ButtonView buttons}). If no active items is found, the toolbar will be focused\r\n * as a whole resulting in the focus moving to its first focusable item (default behavior of\r\n * {@link module:ui/dropdown/dropdownview~DropdownView}).\r\n * @param options.ariaLabel Label used by assistive technologies to describe toolbar element.\r\n * @param options.maxWidth The maximum width of the toolbar element.\r\n * Details: {@link module:ui/toolbar/toolbarview~ToolbarView#maxWidth}.\r\n * @param options.class An additional CSS class added to the toolbar element.\r\n * @param options.isCompact When set true, makes the toolbar look compact with toolbar element.\r\n * @param options.isVertical Controls the orientation of toolbar items.\r\n */\r\nexport function addToolbarToDropdown(dropdownView, buttonsOrCallback, options = {}) {\r\n    dropdownView.extendTemplate({\r\n        attributes: {\r\n            class: ['ck-toolbar-dropdown']\r\n        }\r\n    });\r\n    if (dropdownView.isOpen) {\r\n        addToolbarToOpenDropdown(dropdownView, buttonsOrCallback, options);\r\n    }\r\n    else {\r\n        dropdownView.once('change:isOpen', () => addToolbarToOpenDropdown(dropdownView, buttonsOrCallback, options), { priority: 'highest' });\r\n    }\r\n    if (options.enableActiveItemFocusOnDropdownOpen) {\r\n        // Accessibility: Focus the first active button in the toolbar when the dropdown gets open.\r\n        focusChildOnDropdownOpen(dropdownView, () => dropdownView.toolbarView.items.find((item) => item.isOn));\r\n    }\r\n}\r\n/**\r\n * Adds an instance of {@link module:ui/toolbar/toolbarview~ToolbarView} to a dropdown.\r\n */\r\nfunction addToolbarToOpenDropdown(dropdownView, buttonsOrCallback, options) {\r\n    const locale = dropdownView.locale;\r\n    const t = locale.t;\r\n    const toolbarView = dropdownView.toolbarView = new ToolbarView(locale);\r\n    const buttons = typeof buttonsOrCallback == 'function' ? buttonsOrCallback() : buttonsOrCallback;\r\n    toolbarView.ariaLabel = options.ariaLabel || t('Dropdown toolbar');\r\n    if (options.maxWidth) {\r\n        toolbarView.maxWidth = options.maxWidth;\r\n    }\r\n    if (options.class) {\r\n        toolbarView.class = options.class;\r\n    }\r\n    if (options.isCompact) {\r\n        toolbarView.isCompact = options.isCompact;\r\n    }\r\n    if (options.isVertical) {\r\n        toolbarView.isVertical = true;\r\n    }\r\n    if (buttons instanceof ViewCollection) {\r\n        toolbarView.items.bindTo(buttons).using(item => item);\r\n    }\r\n    else {\r\n        toolbarView.items.addMany(buttons);\r\n    }\r\n    dropdownView.panelView.children.add(toolbarView);\r\n    toolbarView.items.delegate('execute').to(dropdownView);\r\n}\r\n/**\r\n * Adds an instance of {@link module:ui/list/listview~ListView} to a dropdown.\r\n *\r\n * ```ts\r\n * const items = new Collection();\r\n *\r\n * items.add( {\r\n * \ttype: 'button',\r\n * \tmodel: new Model( {\r\n * \t\twithText: true,\r\n * \t\tlabel: 'First item',\r\n * \t\tlabelStyle: 'color: red'\r\n * \t} )\r\n * } );\r\n *\r\n * items.add( {\r\n * \t type: 'button',\r\n * \t model: new Model( {\r\n * \t\twithText: true,\r\n * \t\tlabel: 'Second item',\r\n * \t\tlabelStyle: 'color: green',\r\n * \t\tclass: 'foo'\r\n * \t} )\r\n * } );\r\n *\r\n * const dropdown = createDropdown( locale );\r\n *\r\n * addListToDropdown( dropdown, items );\r\n *\r\n * // Will render a dropdown with a list in the panel containing two items.\r\n * dropdown.render()\r\n * document.body.appendChild( dropdown.element );\r\n * ```\r\n *\r\n * The `items` collection passed to this methods controls the presence and attributes of respective\r\n * {@link module:ui/list/listitemview~ListItemView list items}.\r\n *\r\n * **Note:** To improve the accessibility, when a list is added to the dropdown using this helper the dropdown will automatically attempt\r\n * to focus the first active item (a host to a {@link module:ui/button/buttonview~ButtonView} with\r\n * {@link module:ui/button/buttonview~ButtonView#isOn} set `true`) or the very first item when none are active.\r\n *\r\n * **Note:** List view will be created on first open of the dropdown.\r\n *\r\n * See {@link module:ui/dropdown/utils~createDropdown} and {@link module:list/list~List}.\r\n *\r\n * @param dropdownView A dropdown instance to which `ListVIew` will be added.\r\n * @param itemsOrCallback A collection of the list item definitions or a callback returning a list item definitions to populate the list.\r\n * @param options.ariaLabel Label used by assistive technologies to describe list element.\r\n * @param options.role Will be reflected by the `role` DOM attribute in `ListVIew` and used by assistive technologies.\r\n */\r\nexport function addListToDropdown(dropdownView, itemsOrCallback, options = {}) {\r\n    if (dropdownView.isOpen) {\r\n        addListToOpenDropdown(dropdownView, itemsOrCallback, options);\r\n    }\r\n    else {\r\n        dropdownView.once('change:isOpen', () => addListToOpenDropdown(dropdownView, itemsOrCallback, options), { priority: 'highest' });\r\n    }\r\n    // Accessibility: Focus the first active button in the list when the dropdown gets open.\r\n    focusChildOnDropdownOpen(dropdownView, () => dropdownView.listView.items.find(item => {\r\n        if (item instanceof ListItemView) {\r\n            return item.children.first.isOn;\r\n        }\r\n        return false;\r\n    }));\r\n}\r\n/**\r\n * Adds an instance of {@link module:ui/list/listview~ListView} to a dropdown.\r\n */\r\nfunction addListToOpenDropdown(dropdownView, itemsOrCallback, options) {\r\n    const locale = dropdownView.locale;\r\n    const listView = dropdownView.listView = new ListView(locale);\r\n    const items = typeof itemsOrCallback == 'function' ? itemsOrCallback() : itemsOrCallback;\r\n    listView.ariaLabel = options.ariaLabel;\r\n    listView.role = options.role;\r\n    listView.items.bindTo(items).using(def => {\r\n        if (def.type === 'separator') {\r\n            return new ListSeparatorView(locale);\r\n        }\r\n        else if (def.type === 'button' || def.type === 'switchbutton') {\r\n            const listItemView = new ListItemView(locale);\r\n            let buttonView;\r\n            if (def.type === 'button') {\r\n                buttonView = new ButtonView(locale);\r\n            }\r\n            else {\r\n                buttonView = new SwitchButtonView(locale);\r\n            }\r\n            // Bind all model properties to the button view.\r\n            buttonView.bind(...Object.keys(def.model)).to(def.model);\r\n            buttonView.delegate('execute').to(listItemView);\r\n            listItemView.children.add(buttonView);\r\n            return listItemView;\r\n        }\r\n        return null;\r\n    });\r\n    dropdownView.panelView.children.add(listView);\r\n    listView.items.delegate('execute').to(dropdownView);\r\n}\r\n/**\r\n * A helper to be used on an existing {@link module:ui/dropdown/dropdownview~DropdownView} that focuses\r\n * a specific child in DOM when the dropdown {@link module:ui/dropdown/dropdownview~DropdownView#isOpen gets open}.\r\n *\r\n * @param dropdownView A dropdown instance to which the focus behavior will be added.\r\n * @param childSelectorCallback A callback executed when the dropdown gets open. It should return a {@link module:ui/view~View}\r\n * instance (child of {@link module:ui/dropdown/dropdownview~DropdownView#panelView}) that will get focused or a falsy value.\r\n * If falsy value is returned, a default behavior of the dropdown will engage focusing the first focusable child in\r\n * the {@link module:ui/dropdown/dropdownview~DropdownView#panelView}.\r\n */\r\nexport function focusChildOnDropdownOpen(dropdownView, childSelectorCallback) {\r\n    dropdownView.on('change:isOpen', () => {\r\n        if (!dropdownView.isOpen) {\r\n            return;\r\n        }\r\n        const childToFocus = childSelectorCallback();\r\n        if (!childToFocus) {\r\n            return;\r\n        }\r\n        if (typeof childToFocus.focus === 'function') {\r\n            childToFocus.focus();\r\n        }\r\n        else {\r\n            /**\r\n             * The child view of a {@link module:ui/dropdown/dropdownview~DropdownView dropdown} is missing the `focus()` method\r\n             * and could not be focused when the dropdown got {@link module:ui/dropdown/dropdownview~DropdownView#isOpen open}.\r\n             *\r\n             * Making the content of a dropdown focusable in this case greatly improves the accessibility. Please make the view instance\r\n             * implements the {@link module:ui/dropdown/dropdownpanelfocusable~DropdownPanelFocusable focusable interface} for the best user\r\n             * experience.\r\n             *\r\n             * @error ui-dropdown-focus-child-on-open-child-missing-focus\r\n             * @param {module:ui/view~View} view\r\n             */\r\n            logWarning('ui-dropdown-focus-child-on-open-child-missing-focus', { view: childToFocus });\r\n        }\r\n        // * Let the panel show up first (do not focus an invisible element).\r\n        // * Execute after focusDropdownPanelOnOpen(). See focusDropdownPanelOnOpen() to learn more.\r\n    }, { priority: priorities.low - 10 });\r\n}\r\n/**\r\n * Add a set of default behaviors to dropdown view.\r\n */\r\nfunction addDefaultBehavior(dropdownView) {\r\n    closeDropdownOnClickOutside(dropdownView);\r\n    closeDropdownOnExecute(dropdownView);\r\n    closeDropdownOnBlur(dropdownView);\r\n    focusDropdownContentsOnArrows(dropdownView);\r\n    focusDropdownButtonOnClose(dropdownView);\r\n    focusDropdownPanelOnOpen(dropdownView);\r\n}\r\n/**\r\n * Adds a behavior to a dropdownView that closes opened dropdown when user clicks outside the dropdown.\r\n */\r\nfunction closeDropdownOnClickOutside(dropdownView) {\r\n    dropdownView.on('render', () => {\r\n        clickOutsideHandler({\r\n            emitter: dropdownView,\r\n            activator: () => dropdownView.isOpen,\r\n            callback: () => {\r\n                dropdownView.isOpen = false;\r\n            },\r\n            contextElements: [dropdownView.element]\r\n        });\r\n    });\r\n}\r\n/**\r\n * Adds a behavior to a dropdownView that closes the dropdown view on \"execute\" event.\r\n */\r\nfunction closeDropdownOnExecute(dropdownView) {\r\n    // Close the dropdown when one of the list items has been executed.\r\n    dropdownView.on('execute', evt => {\r\n        // Toggling a switch button view should not close the dropdown.\r\n        if (evt.source instanceof SwitchButtonView) {\r\n            return;\r\n        }\r\n        dropdownView.isOpen = false;\r\n    });\r\n}\r\n/**\r\n * Adds a behavior to a dropdown view that closes opened dropdown when it loses focus.\r\n */\r\nfunction closeDropdownOnBlur(dropdownView) {\r\n    dropdownView.focusTracker.on('change:isFocused', (evt, name, isFocused) => {\r\n        if (dropdownView.isOpen && !isFocused) {\r\n            dropdownView.isOpen = false;\r\n        }\r\n    });\r\n}\r\n/**\r\n * Adds a behavior to a dropdownView that focuses the dropdown's panel view contents on keystrokes.\r\n */\r\nfunction focusDropdownContentsOnArrows(dropdownView) {\r\n    // If the dropdown panel is already open, the arrow down key should focus the first child of the #panelView.\r\n    dropdownView.keystrokes.set('arrowdown', (data, cancel) => {\r\n        if (dropdownView.isOpen) {\r\n            dropdownView.panelView.focus();\r\n            cancel();\r\n        }\r\n    });\r\n    // If the dropdown panel is already open, the arrow up key should focus the last child of the #panelView.\r\n    dropdownView.keystrokes.set('arrowup', (data, cancel) => {\r\n        if (dropdownView.isOpen) {\r\n            dropdownView.panelView.focusLast();\r\n            cancel();\r\n        }\r\n    });\r\n}\r\n/**\r\n * Adds a behavior that focuses the #buttonView when the dropdown was closed but focus was within the #panelView element.\r\n * This makes sure the focus is never lost.\r\n */\r\nfunction focusDropdownButtonOnClose(dropdownView) {\r\n    dropdownView.on('change:isOpen', (evt, name, isOpen) => {\r\n        if (isOpen) {\r\n            return;\r\n        }\r\n        const element = dropdownView.panelView.element;\r\n        // If the dropdown was closed, move the focus back to the button (#12125).\r\n        // Don't touch the focus, if it moved somewhere else (e.g. moved to the editing root on #execute) (#12178).\r\n        // Note: Don't use the state of the DropdownView#focusTracker here. It fires #blur with the timeout.\r\n        if (element && element.contains(global.document.activeElement)) {\r\n            dropdownView.buttonView.focus();\r\n        }\r\n    });\r\n}\r\n/**\r\n * Adds a behavior that focuses the #panelView when dropdown gets open (accessibility).\r\n */\r\nfunction focusDropdownPanelOnOpen(dropdownView) {\r\n    dropdownView.on('change:isOpen', (evt, name, isOpen) => {\r\n        if (!isOpen) {\r\n            return;\r\n        }\r\n        // Focus the first item in the dropdown when the dropdown opened.\r\n        dropdownView.panelView.focus();\r\n        // * Let the panel show up first (do not focus an invisible element).\r\n        // * Also, execute before focusChildOnDropdownOpen() to make sure this helper does not break the\r\n        //   focus of a specific child by kicking in too late and resetting the focus in the panel.\r\n    }, { priority: 'low' });\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/labeledfield/utils\r\n */\r\nimport InputTextView from '../inputtext/inputtextview';\r\nimport InputNumberView from '../inputnumber/inputnumberview';\r\nimport { createDropdown } from '../dropdown/utils';\r\n/**\r\n * A helper for creating labeled inputs.\r\n *\r\n * It creates an instance of a {@link module:ui/inputtext/inputtextview~InputTextView input text} that is\r\n * logically related to a {@link module:ui/labeledfield/labeledfieldview~LabeledFieldView labeled view} in DOM.\r\n *\r\n * The helper does the following:\r\n *\r\n * * It sets input's `id` and `ariaDescribedById` attributes.\r\n * * It binds input's `isReadOnly` to the labeled view.\r\n * * It binds input's `hasError` to the labeled view.\r\n * * It enables a logic that cleans up the error when user starts typing in the input.\r\n *\r\n * Usage:\r\n *\r\n * ```ts\r\n * const labeledInputView = new LabeledFieldView( locale, createLabeledInputText );\r\n * console.log( labeledInputView.fieldView ); // A text input instance.\r\n * ```\r\n *\r\n * @param labeledFieldView The instance of the labeled field view.\r\n * @param viewUid An UID string that allows DOM logical connection between the\r\n * {@link module:ui/labeledfield/labeledfieldview~LabeledFieldView#labelView labeled view's label} and the input.\r\n * @param statusUid An UID string that allows DOM logical connection between the\r\n * {@link module:ui/labeledfield/labeledfieldview~LabeledFieldView#statusView labeled view's status} and the input.\r\n * @returns The input text view instance.\r\n */\r\nexport function createLabeledInputText(labeledFieldView, viewUid, statusUid) {\r\n    const inputView = new InputTextView(labeledFieldView.locale);\r\n    inputView.set({\r\n        id: viewUid,\r\n        ariaDescribedById: statusUid\r\n    });\r\n    inputView.bind('isReadOnly').to(labeledFieldView, 'isEnabled', value => !value);\r\n    inputView.bind('hasError').to(labeledFieldView, 'errorText', value => !!value);\r\n    inputView.on('input', () => {\r\n        // UX: Make the error text disappear and disable the error indicator as the user\r\n        // starts fixing the errors.\r\n        labeledFieldView.errorText = null;\r\n    });\r\n    labeledFieldView.bind('isEmpty', 'isFocused', 'placeholder').to(inputView);\r\n    return inputView;\r\n}\r\n/**\r\n * A helper for creating labeled number inputs.\r\n *\r\n * It creates an instance of a {@link module:ui/inputnumber/inputnumberview~InputNumberView input number} that is\r\n * logically related to a {@link module:ui/labeledfield/labeledfieldview~LabeledFieldView labeled view} in DOM.\r\n *\r\n * The helper does the following:\r\n *\r\n * * It sets input's `id` and `ariaDescribedById` attributes.\r\n * * It binds input's `isReadOnly` to the labeled view.\r\n * * It binds input's `hasError` to the labeled view.\r\n * * It enables a logic that cleans up the error when user starts typing in the input.\r\n *\r\n * Usage:\r\n *\r\n * ```ts\r\n * const labeledInputView = new LabeledFieldView( locale, createLabeledInputNumber );\r\n * console.log( labeledInputView.fieldView ); // A number input instance.\r\n * ```\r\n *\r\n * @param labeledFieldView The instance of the labeled field view.\r\n * @param viewUid An UID string that allows DOM logical connection between the\r\n * {@link module:ui/labeledfield/labeledfieldview~LabeledFieldView#labelView labeled view's label} and the input.\r\n * @param statusUid An UID string that allows DOM logical connection between the\r\n * {@link module:ui/labeledfield/labeledfieldview~LabeledFieldView#statusView labeled view's status} and the input.\r\n * @returns The input number view instance.\r\n */\r\nexport function createLabeledInputNumber(labeledFieldView, viewUid, statusUid) {\r\n    const inputView = new InputNumberView(labeledFieldView.locale);\r\n    inputView.set({\r\n        id: viewUid,\r\n        ariaDescribedById: statusUid,\r\n        inputMode: 'numeric'\r\n    });\r\n    inputView.bind('isReadOnly').to(labeledFieldView, 'isEnabled', value => !value);\r\n    inputView.bind('hasError').to(labeledFieldView, 'errorText', value => !!value);\r\n    inputView.on('input', () => {\r\n        // UX: Make the error text disappear and disable the error indicator as the user\r\n        // starts fixing the errors.\r\n        labeledFieldView.errorText = null;\r\n    });\r\n    labeledFieldView.bind('isEmpty', 'isFocused', 'placeholder').to(inputView);\r\n    return inputView;\r\n}\r\n/**\r\n * A helper for creating labeled dropdowns.\r\n *\r\n * It creates an instance of a {@link module:ui/dropdown/dropdownview~DropdownView dropdown} that is\r\n * logically related to a {@link module:ui/labeledfield/labeledfieldview~LabeledFieldView labeled field view}.\r\n *\r\n * The helper does the following:\r\n *\r\n * * It sets dropdown's `id` and `ariaDescribedById` attributes.\r\n * * It binds input's `isEnabled` to the labeled view.\r\n *\r\n * Usage:\r\n *\r\n * ```ts\r\n * const labeledInputView = new LabeledFieldView( locale, createLabeledDropdown );\r\n * console.log( labeledInputView.fieldView ); // A dropdown instance.\r\n * ```\r\n *\r\n * @param labeledFieldView The instance of the labeled field view.\r\n * @param viewUid An UID string that allows DOM logical connection between the\r\n * {@link module:ui/labeledfield/labeledfieldview~LabeledFieldView#labelView labeled view label} and the dropdown.\r\n * @param statusUid An UID string that allows DOM logical connection between the\r\n * {@link module:ui/labeledfield/labeledfieldview~LabeledFieldView#statusView labeled view status} and the dropdown.\r\n * @returns The dropdown view instance.\r\n */\r\nexport function createLabeledDropdown(labeledFieldView, viewUid, statusUid) {\r\n    const dropdownView = createDropdown(labeledFieldView.locale);\r\n    dropdownView.set({\r\n        id: viewUid,\r\n        ariaDescribedById: statusUid\r\n    });\r\n    dropdownView.bind('isEnabled').to(labeledFieldView);\r\n    return dropdownView;\r\n}\r\n","// Clamps a value between an upper and lower bound.\n// We use ternary operators because it makes the minified code\n// 2 times shorter then `Math.min(Math.max(a,b),c)`\nexport const clamp = (number, min = 0, max = 1) => {\n    return number > max ? max : number < min ? min : number;\n};\nexport const round = (number, digits = 0, base = Math.pow(10, digits)) => {\n    return Math.round(base * number) / base;\n};\n//# sourceMappingURL=math.js.map","import { round } from './math.js';\n/**\n * Valid CSS <angle> units.\n * https://developer.mozilla.org/en-US/docs/Web/CSS/angle\n */\nconst angleUnits = {\n    grad: 360 / 400,\n    turn: 360,\n    rad: 360 / (Math.PI * 2)\n};\nexport const hexToHsva = (hex) => rgbaToHsva(hexToRgba(hex));\nexport const hexToRgba = (hex) => {\n    if (hex[0] === '#')\n        hex = hex.substring(1);\n    if (hex.length < 6) {\n        return {\n            r: parseInt(hex[0] + hex[0], 16),\n            g: parseInt(hex[1] + hex[1], 16),\n            b: parseInt(hex[2] + hex[2], 16),\n            a: hex.length === 4 ? round(parseInt(hex[3] + hex[3], 16) / 255, 2) : 1\n        };\n    }\n    return {\n        r: parseInt(hex.substring(0, 2), 16),\n        g: parseInt(hex.substring(2, 4), 16),\n        b: parseInt(hex.substring(4, 6), 16),\n        a: hex.length === 8 ? round(parseInt(hex.substring(6, 8), 16) / 255, 2) : 1\n    };\n};\nexport const parseHue = (value, unit = 'deg') => {\n    return Number(value) * (angleUnits[unit] || 1);\n};\nexport const hslaStringToHsva = (hslString) => {\n    const matcher = /hsla?\\(?\\s*(-?\\d*\\.?\\d+)(deg|rad|grad|turn)?[,\\s]+(-?\\d*\\.?\\d+)%?[,\\s]+(-?\\d*\\.?\\d+)%?,?\\s*[/\\s]*(-?\\d*\\.?\\d+)?(%)?\\s*\\)?/i;\n    const match = matcher.exec(hslString);\n    if (!match)\n        return { h: 0, s: 0, v: 0, a: 1 };\n    return hslaToHsva({\n        h: parseHue(match[1], match[2]),\n        s: Number(match[3]),\n        l: Number(match[4]),\n        a: match[5] === undefined ? 1 : Number(match[5]) / (match[6] ? 100 : 1)\n    });\n};\nexport const hslStringToHsva = hslaStringToHsva;\nexport const hslaToHsva = ({ h, s, l, a }) => {\n    s *= (l < 50 ? l : 100 - l) / 100;\n    return {\n        h: h,\n        s: s > 0 ? ((2 * s) / (l + s)) * 100 : 0,\n        v: l + s,\n        a\n    };\n};\nexport const hsvaToHex = (hsva) => rgbaToHex(hsvaToRgba(hsva));\nexport const hsvaToHsla = ({ h, s, v, a }) => {\n    const hh = ((200 - s) * v) / 100;\n    return {\n        h: round(h),\n        s: round(hh > 0 && hh < 200 ? ((s * v) / 100 / (hh <= 100 ? hh : 200 - hh)) * 100 : 0),\n        l: round(hh / 2),\n        a: round(a, 2)\n    };\n};\nexport const hsvaToHsvString = (hsva) => {\n    const { h, s, v } = roundHsva(hsva);\n    return `hsv(${h}, ${s}%, ${v}%)`;\n};\nexport const hsvaToHsvaString = (hsva) => {\n    const { h, s, v, a } = roundHsva(hsva);\n    return `hsva(${h}, ${s}%, ${v}%, ${a})`;\n};\nexport const hsvaToHslString = (hsva) => {\n    const { h, s, l } = hsvaToHsla(hsva);\n    return `hsl(${h}, ${s}%, ${l}%)`;\n};\nexport const hsvaToHslaString = (hsva) => {\n    const { h, s, l, a } = hsvaToHsla(hsva);\n    return `hsla(${h}, ${s}%, ${l}%, ${a})`;\n};\nexport const hsvaToRgba = ({ h, s, v, a }) => {\n    h = (h / 360) * 6;\n    s = s / 100;\n    v = v / 100;\n    const hh = Math.floor(h), b = v * (1 - s), c = v * (1 - (h - hh) * s), d = v * (1 - (1 - h + hh) * s), module = hh % 6;\n    return {\n        r: round([v, c, b, b, d, v][module] * 255),\n        g: round([d, v, v, c, b, b][module] * 255),\n        b: round([b, b, d, v, v, c][module] * 255),\n        a: round(a, 2)\n    };\n};\nexport const hsvaToRgbString = (hsva) => {\n    const { r, g, b } = hsvaToRgba(hsva);\n    return `rgb(${r}, ${g}, ${b})`;\n};\nexport const hsvaToRgbaString = (hsva) => {\n    const { r, g, b, a } = hsvaToRgba(hsva);\n    return `rgba(${r}, ${g}, ${b}, ${a})`;\n};\nexport const hsvaStringToHsva = (hsvString) => {\n    const matcher = /hsva?\\(?\\s*(-?\\d*\\.?\\d+)(deg|rad|grad|turn)?[,\\s]+(-?\\d*\\.?\\d+)%?[,\\s]+(-?\\d*\\.?\\d+)%?,?\\s*[/\\s]*(-?\\d*\\.?\\d+)?(%)?\\s*\\)?/i;\n    const match = matcher.exec(hsvString);\n    if (!match)\n        return { h: 0, s: 0, v: 0, a: 1 };\n    return roundHsva({\n        h: parseHue(match[1], match[2]),\n        s: Number(match[3]),\n        v: Number(match[4]),\n        a: match[5] === undefined ? 1 : Number(match[5]) / (match[6] ? 100 : 1)\n    });\n};\nexport const hsvStringToHsva = hsvaStringToHsva;\nexport const rgbaStringToHsva = (rgbaString) => {\n    const matcher = /rgba?\\(?\\s*(-?\\d*\\.?\\d+)(%)?[,\\s]+(-?\\d*\\.?\\d+)(%)?[,\\s]+(-?\\d*\\.?\\d+)(%)?,?\\s*[/\\s]*(-?\\d*\\.?\\d+)?(%)?\\s*\\)?/i;\n    const match = matcher.exec(rgbaString);\n    if (!match)\n        return { h: 0, s: 0, v: 0, a: 1 };\n    return rgbaToHsva({\n        r: Number(match[1]) / (match[2] ? 100 / 255 : 1),\n        g: Number(match[3]) / (match[4] ? 100 / 255 : 1),\n        b: Number(match[5]) / (match[6] ? 100 / 255 : 1),\n        a: match[7] === undefined ? 1 : Number(match[7]) / (match[8] ? 100 : 1)\n    });\n};\nexport const rgbStringToHsva = rgbaStringToHsva;\nconst format = (number) => {\n    const hex = number.toString(16);\n    return hex.length < 2 ? '0' + hex : hex;\n};\nexport const rgbaToHex = ({ r, g, b, a }) => {\n    const alphaHex = a < 1 ? format(round(a * 255)) : '';\n    return '#' + format(r) + format(g) + format(b) + alphaHex;\n};\nexport const rgbaToHsva = ({ r, g, b, a }) => {\n    const max = Math.max(r, g, b);\n    const delta = max - Math.min(r, g, b);\n    // prettier-ignore\n    const hh = delta\n        ? max === r\n            ? (g - b) / delta\n            : max === g\n                ? 2 + (b - r) / delta\n                : 4 + (r - g) / delta\n        : 0;\n    return {\n        h: round(60 * (hh < 0 ? hh + 6 : hh)),\n        s: round(max ? (delta / max) * 100 : 0),\n        v: round((max / 255) * 100),\n        a\n    };\n};\nexport const roundHsva = (hsva) => ({\n    h: round(hsva.h),\n    s: round(hsva.s),\n    v: round(hsva.v),\n    a: round(hsva.a, 2)\n});\nexport const rgbaToRgb = ({ r, g, b }) => ({ r, g, b });\nexport const hslaToHsl = ({ h, s, l }) => ({ h, s, l });\nexport const hsvaToHsv = (hsva) => {\n    const { h, s, v } = roundHsva(hsva);\n    return { h, s, v };\n};\n//# sourceMappingURL=convert.js.map","import { hexToRgba } from './convert.js';\nexport const equalColorObjects = (first, second) => {\n    if (first === second)\n        return true;\n    for (const prop in first) {\n        // The following allows for a type-safe calling of this function (first & second have to be HSL, HSV, or RGB)\n        // with type-unsafe iterating over object keys. TS does not allow this without an index (`[key: string]: number`)\n        // on an object to define how iteration is normally done. To ensure extra keys are not allowed on our types,\n        // we must cast our object to unknown (as RGB demands `r` be a key, while `Record<string, x>` does not care if\n        // there is or not), and then as a type TS can iterate over.\n        if (first[prop] !==\n            second[prop])\n            return false;\n    }\n    return true;\n};\nexport const equalColorString = (first, second) => {\n    return first.replace(/\\s/g, '') === second.replace(/\\s/g, '');\n};\nexport const equalHex = (first, second) => {\n    if (first.toLowerCase() === second.toLowerCase())\n        return true;\n    // To compare colors like `#FFF` and `ffffff` we convert them into RGB objects\n    return equalColorObjects(hexToRgba(first), hexToRgba(second));\n};\n//# sourceMappingURL=compare.js.map","const cache = {};\nexport const tpl = (html) => {\n    let template = cache[html];\n    if (!template) {\n        template = document.createElement('template');\n        template.innerHTML = html;\n        cache[html] = template;\n    }\n    return template;\n};\nexport const fire = (target, type, detail) => {\n    target.dispatchEvent(new CustomEvent(type, {\n        bubbles: true,\n        detail\n    }));\n};\n//# sourceMappingURL=dom.js.map","import { fire, tpl } from '../utils/dom.js';\nimport { clamp } from '../utils/math.js';\nlet hasTouched = false;\n// Check if an event was triggered by touch\nconst isTouch = (e) => 'touches' in e;\n// Prevent mobile browsers from handling mouse events (conflicting with touch ones).\n// If we detected a touch interaction before, we prefer reacting to touch events only.\nconst isValid = (event) => {\n    if (hasTouched && !isTouch(event))\n        return false;\n    if (!hasTouched)\n        hasTouched = isTouch(event);\n    return true;\n};\nconst pointerMove = (target, event) => {\n    const pointer = isTouch(event) ? event.touches[0] : event;\n    const rect = target.el.getBoundingClientRect();\n    fire(target.el, 'move', target.getMove({\n        x: clamp((pointer.pageX - (rect.left + window.pageXOffset)) / rect.width),\n        y: clamp((pointer.pageY - (rect.top + window.pageYOffset)) / rect.height)\n    }));\n};\nconst keyMove = (target, event) => {\n    // We use `keyCode` instead of `key` to reduce the size of the library.\n    const keyCode = event.keyCode;\n    // Ignore all keys except arrow ones, Page Up, Page Down, Home and End.\n    if (keyCode > 40 || (target.xy && keyCode < 37) || keyCode < 33)\n        return;\n    // Do not scroll page by keys when color picker element has focus.\n    event.preventDefault();\n    // Send relative offset to the parent component.\n    fire(target.el, 'move', target.getMove({\n        x: keyCode === 39 // Arrow Right\n            ? 0.01\n            : keyCode === 37 // Arrow Left\n                ? -0.01\n                : keyCode === 34 // Page Down\n                    ? 0.05\n                    : keyCode === 33 // Page Up\n                        ? -0.05\n                        : keyCode === 35 // End\n                            ? 1\n                            : keyCode === 36 // Home\n                                ? -1\n                                : 0,\n        y: keyCode === 40 // Arrow down\n            ? 0.01\n            : keyCode === 38 // Arrow Up\n                ? -0.01\n                : 0\n    }, true));\n};\nexport class Slider {\n    constructor(root, part, aria, xy) {\n        const template = tpl(`<div role=\"slider\" tabindex=\"0\" part=\"${part}\" ${aria}><div part=\"${part}-pointer\"></div></div>`);\n        root.appendChild(template.content.cloneNode(true));\n        const el = root.querySelector(`[part=${part}]`);\n        el.addEventListener('mousedown', this);\n        el.addEventListener('touchstart', this);\n        el.addEventListener('keydown', this);\n        this.el = el;\n        this.xy = xy;\n        this.nodes = [el.firstChild, el];\n    }\n    set dragging(state) {\n        const toggleEvent = state ? document.addEventListener : document.removeEventListener;\n        toggleEvent(hasTouched ? 'touchmove' : 'mousemove', this);\n        toggleEvent(hasTouched ? 'touchend' : 'mouseup', this);\n    }\n    handleEvent(event) {\n        switch (event.type) {\n            case 'mousedown':\n            case 'touchstart':\n                event.preventDefault();\n                // event.button is 0 in mousedown for left button activation\n                if (!isValid(event) || (!hasTouched && event.button != 0))\n                    return;\n                this.el.focus();\n                pointerMove(this, event);\n                this.dragging = true;\n                break;\n            case 'mousemove':\n            case 'touchmove':\n                event.preventDefault();\n                pointerMove(this, event);\n                break;\n            case 'mouseup':\n            case 'touchend':\n                this.dragging = false;\n                break;\n            case 'keydown':\n                keyMove(this, event);\n                break;\n        }\n    }\n    style(styles) {\n        styles.forEach((style, i) => {\n            for (const p in style) {\n                this.nodes[i].style.setProperty(p, style[p]);\n            }\n        });\n    }\n}\n//# sourceMappingURL=slider.js.map","import { Slider } from './slider.js';\nimport { hsvaToHslString } from '../utils/convert.js';\nimport { clamp, round } from '../utils/math.js';\nexport class Hue extends Slider {\n    constructor(root) {\n        super(root, 'hue', 'aria-label=\"Hue\" aria-valuemin=\"0\" aria-valuemax=\"360\"', false);\n    }\n    update({ h }) {\n        this.h = h;\n        this.style([\n            {\n                left: `${(h / 360) * 100}%`,\n                color: hsvaToHslString({ h, s: 100, v: 100, a: 1 })\n            }\n        ]);\n        this.el.setAttribute('aria-valuenow', `${round(h)}`);\n    }\n    getMove(offset, key) {\n        // Hue measured in degrees of the color circle ranging from 0 to 360\n        return { h: key ? clamp(this.h + offset.x * 360, 0, 360) : 360 * offset.x };\n    }\n}\n//# sourceMappingURL=hue.js.map","import { Slider } from './slider.js';\nimport { hsvaToHslString } from '../utils/convert.js';\nimport { clamp, round } from '../utils/math.js';\nexport class Saturation extends Slider {\n    constructor(root) {\n        super(root, 'saturation', 'aria-label=\"Color\"', true);\n    }\n    update(hsva) {\n        this.hsva = hsva;\n        this.style([\n            {\n                top: `${100 - hsva.v}%`,\n                left: `${hsva.s}%`,\n                color: hsvaToHslString(hsva)\n            },\n            {\n                'background-color': hsvaToHslString({ h: hsva.h, s: 100, v: 100, a: 1 })\n            }\n        ]);\n        this.el.setAttribute('aria-valuetext', `Saturation ${round(hsva.s)}%, Brightness ${round(hsva.v)}%`);\n    }\n    getMove(offset, key) {\n        // Saturation and brightness always fit into [0, 100] range\n        return {\n            s: key ? clamp(this.hsva.s + offset.x * 100, 0, 100) : offset.x * 100,\n            v: key ? clamp(this.hsva.v - offset.y * 100, 0, 100) : Math.round(100 - offset.y * 100)\n        };\n    }\n}\n//# sourceMappingURL=saturation.js.map","export default `:host{display:flex;flex-direction:column;position:relative;width:200px;height:200px;user-select:none;-webkit-user-select:none;cursor:default}:host([hidden]){display:none!important}[role=slider]{position:relative;touch-action:none;user-select:none;-webkit-user-select:none;outline:0}[role=slider]:last-child{border-radius:0 0 8px 8px}[part$=pointer]{position:absolute;z-index:1;box-sizing:border-box;width:28px;height:28px;display:flex;place-content:center center;transform:translate(-50%,-50%);background-color:#fff;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 4px rgba(0,0,0,.2)}[part$=pointer]::after{content:\"\";width:100%;height:100%;border-radius:inherit;background-color:currentColor}[role=slider]:focus [part$=pointer]{transform:translate(-50%,-50%) scale(1.1)}`;\n//# sourceMappingURL=color-picker.js.map","import { equalColorObjects } from '../utils/compare.js';\nimport { fire, tpl } from '../utils/dom.js';\nimport { Hue } from './hue.js';\nimport { Saturation } from './saturation.js';\nimport css from '../styles/color-picker.js';\nimport hueCss from '../styles/hue.js';\nimport saturationCss from '../styles/saturation.js';\nconst $isSame = Symbol('same');\nconst $color = Symbol('color');\nconst $hsva = Symbol('hsva');\nconst $update = Symbol('update');\nconst $parts = Symbol('parts');\nexport const $css = Symbol('css');\nexport const $sliders = Symbol('sliders');\nexport class ColorPicker extends HTMLElement {\n    static get observedAttributes() {\n        return ['color'];\n    }\n    get [$css]() {\n        return [css, hueCss, saturationCss];\n    }\n    get [$sliders]() {\n        return [Saturation, Hue];\n    }\n    get color() {\n        return this[$color];\n    }\n    set color(newColor) {\n        if (!this[$isSame](newColor)) {\n            const newHsva = this.colorModel.toHsva(newColor);\n            this[$update](newHsva);\n            this[$color] = newColor;\n        }\n    }\n    constructor() {\n        super();\n        const template = tpl(`<style>${this[$css].join('')}</style>`);\n        const root = this.attachShadow({ mode: 'open' });\n        root.appendChild(template.content.cloneNode(true));\n        root.addEventListener('move', this);\n        this[$parts] = this[$sliders].map((slider) => new slider(root));\n    }\n    connectedCallback() {\n        // A user may set a property on an _instance_ of an element,\n        // before its prototype has been connected to this class.\n        // If so, we need to run it through the proper class setter.\n        if (this.hasOwnProperty('color')) {\n            const value = this.color;\n            delete this['color'];\n            this.color = value;\n        }\n        else if (!this.color) {\n            this.color = this.colorModel.defaultColor;\n        }\n    }\n    attributeChangedCallback(_attr, _oldVal, newVal) {\n        const color = this.colorModel.fromAttr(newVal);\n        if (!this[$isSame](color)) {\n            this.color = color;\n        }\n    }\n    handleEvent(event) {\n        // Merge the current HSV color object with updated params.\n        const oldHsva = this[$hsva];\n        const newHsva = { ...oldHsva, ...event.detail };\n        this[$update](newHsva);\n        let newColor;\n        if (!equalColorObjects(newHsva, oldHsva) &&\n            !this[$isSame]((newColor = this.colorModel.fromHsva(newHsva)))) {\n            this[$color] = newColor;\n            fire(this, 'color-changed', { value: newColor });\n        }\n    }\n    [$isSame](color) {\n        return this.color && this.colorModel.equal(color, this.color);\n    }\n    [$update](hsva) {\n        this[$hsva] = hsva;\n        this[$parts].forEach((part) => part.update(hsva));\n    }\n}\n//# sourceMappingURL=color-picker.js.map","export default `[part=hue]{flex:0 0 24px;background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}[part=hue-pointer]{top:50%;z-index:2}`;\n//# sourceMappingURL=hue.js.map","export default `[part=saturation]{flex-grow:1;border-color:transparent;border-bottom:12px solid #000;border-radius:8px 8px 0 0;background-image:linear-gradient(to top,#000,transparent),linear-gradient(to right,#fff,rgba(255,255,255,0));box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}[part=saturation-pointer]{z-index:3}`;\n//# sourceMappingURL=saturation.js.map","import { ColorPicker } from '../components/color-picker.js';\nimport { hexToHsva, hsvaToHex } from '../utils/convert.js';\nimport { equalHex } from '../utils/compare.js';\nconst colorModel = {\n    defaultColor: '#000',\n    toHsva: hexToHsva,\n    fromHsva: ({ h, s, v }) => hsvaToHex({ h, s, v, a: 1 }),\n    equal: equalHex,\n    fromAttr: (color) => color\n};\nexport class HexBase extends ColorPicker {\n    get colorModel() {\n        return colorModel;\n    }\n}\n//# sourceMappingURL=hex.js.map","import { HexBase } from './lib/entrypoints/hex.js';\n/**\n * A color picker custom element that uses HEX format.\n *\n * @element hex-color-picker\n *\n * @prop {string} color - Selected color in HEX format.\n * @attr {string} color - Selected color in HEX format.\n *\n * @fires color-changed - Event fired when color property changes.\n *\n * @csspart hue - A hue selector container.\n * @csspart saturation - A saturation selector container\n * @csspart hue-pointer - A hue pointer element.\n * @csspart saturation-pointer - A saturation pointer element.\n */\nexport class HexColorPicker extends HexBase {\n}\ncustomElements.define('hex-color-picker', HexColorPicker);\n//# sourceMappingURL=hex-color-picker.js.map","import api from \"!../../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../../css-loader/dist/cjs.js!../../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./colorpicker.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/colorpicker/colorpickerview\r\n */\r\nimport { convertColor, convertToHex } from './utils';\r\nimport { global, env } from '@ckeditor/ckeditor5-utils';\r\nimport { debounce } from 'lodash-es';\r\nimport View from '../view';\r\nimport LabeledFieldView from '../labeledfield/labeledfieldview';\r\nimport { createLabeledInputText } from '../labeledfield/utils';\r\nimport 'vanilla-colorful/hex-color-picker.js';\r\nimport '../../theme/components/colorpicker/colorpicker.css';\r\nconst waitingTime = 150;\r\nexport default class ColorPickerView extends View {\r\n    /**\r\n     * Creates a view of color picker.\r\n     *\r\n     * @param locale\r\n     * @param config\r\n     */\r\n    constructor(locale, config) {\r\n        super(locale);\r\n        this.set('color', '');\r\n        this.set('_hexColor', '');\r\n        this._format = config.format || 'hsl';\r\n        this.hexInputRow = this._createInputRow();\r\n        const children = this.createCollection();\r\n        children.add(this.hexInputRow);\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: ['ck', 'ck-color-picker'],\r\n                tabindex: -1\r\n            },\r\n            children\r\n        });\r\n        this._debounceColorPickerEvent = debounce((color) => {\r\n            this.set('color', color);\r\n        }, waitingTime, {\r\n            leading: true\r\n        });\r\n        // Sets color in the picker if color was updated.\r\n        this.on('set:color', (evt, propertyName, newValue) => {\r\n            // The color needs always to be kept in the output format.\r\n            evt.return = convertColor(newValue, this._format);\r\n        });\r\n        this.on('change:color', () => {\r\n            this._hexColor = convertColorToCommonHexFormat(this.color);\r\n        });\r\n        this.on('change:_hexColor', () => {\r\n            // Should update color in color picker when its not focused\r\n            if (document.activeElement !== this.picker) {\r\n                this.picker.setAttribute('color', this._hexColor);\r\n            }\r\n            // There has to be two way binding between properties.\r\n            // Extra precaution has to be taken to trigger change back only when the color really changes.\r\n            if (convertColorToCommonHexFormat(this.color) != convertColorToCommonHexFormat(this._hexColor)) {\r\n                this.color = this._hexColor;\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Renders color picker in the view.\r\n     */\r\n    render() {\r\n        super.render();\r\n        this.picker = global.document.createElement('hex-color-picker');\r\n        this.picker.setAttribute('class', 'hex-color-picker');\r\n        this.picker.setAttribute('tabindex', '-1');\r\n        this._createSlidersView();\r\n        if (this.element) {\r\n            this.element.insertBefore(this.picker, this.hexInputRow.element);\r\n            // Create custom stylesheet with a look of focused pointer in color picker and append it into the color picker shadowDom\r\n            const styleSheetForFocusedColorPicker = document.createElement('style');\r\n            styleSheetForFocusedColorPicker.textContent = '[role=\"slider\"]:focus [part$=\"pointer\"] {' +\r\n                'border: 1px solid #fff;' +\r\n                'outline: 1px solid var(--ck-color-focus-border);' +\r\n                'box-shadow: 0 0 0 2px #fff;' +\r\n                '}';\r\n            this.picker.shadowRoot.appendChild(styleSheetForFocusedColorPicker);\r\n        }\r\n        this.picker.addEventListener('color-changed', event => {\r\n            const customEvent = event;\r\n            const color = customEvent.detail.value;\r\n            this._debounceColorPickerEvent(color);\r\n        });\r\n    }\r\n    /**\r\n     * Focuses the first pointer in color picker.\r\n     *\r\n     */\r\n    focus() {\r\n        // In some browsers we need to move the focus to the input first.\r\n        // Otherwise, the color picker doesn't behave as expected.\r\n        // In FF, after selecting the color via slider, it instantly moves back to the previous color.\r\n        // In all iOS browsers and desktop Safari, once the saturation slider is moved for the first time,\r\n        // editor collapses the selection and doesn't apply the color change.\r\n        // See: https://github.com/cksource/ckeditor5-internal/issues/3245, https://github.com/ckeditor/ckeditor5/issues/14119,\r\n        // https://github.com/cksource/ckeditor5-internal/issues/3268.\r\n        /* istanbul ignore next -- @preserve */\r\n        if (env.isGecko || env.isiOS || env.isSafari) {\r\n            const input = this.hexInputRow.children.get(1);\r\n            input.focus();\r\n        }\r\n        const firstSlider = this.slidersView.first;\r\n        firstSlider.focus();\r\n    }\r\n    /**\r\n     * Creates collection of sliders in color picker.\r\n     *\r\n     * @private\r\n     */\r\n    _createSlidersView() {\r\n        const colorPickersChildren = [...this.picker.shadowRoot.children];\r\n        const sliders = colorPickersChildren.filter(item => item.getAttribute('role') === 'slider');\r\n        const slidersView = sliders.map(slider => {\r\n            const view = new SliderView(slider);\r\n            return view;\r\n        });\r\n        this.slidersView = this.createCollection();\r\n        slidersView.forEach(item => {\r\n            this.slidersView.add(item);\r\n        });\r\n    }\r\n    /**\r\n     * Creates input row for defining custom colors in color picker.\r\n     *\r\n     * @private\r\n     */\r\n    _createInputRow() {\r\n        const hashView = new HashView();\r\n        const colorInput = this._createColorInput();\r\n        return new ColorPickerInputRowView(this.locale, [hashView, colorInput]);\r\n    }\r\n    /**\r\n     * Creates the input where user can type or paste the color in hex format.\r\n     *\r\n     * @private\r\n     */\r\n    _createColorInput() {\r\n        const labeledInput = new LabeledFieldView(this.locale, createLabeledInputText);\r\n        const { t } = this.locale;\r\n        labeledInput.set({\r\n            label: t('HEX'),\r\n            class: 'color-picker-hex-input'\r\n        });\r\n        labeledInput.fieldView.bind('value').to(this, '_hexColor', pickerColor => {\r\n            if (labeledInput.isFocused) {\r\n                // Text field shouldn't be updated with color change if the text field is focused.\r\n                // Imagine user typing hex code and getting the value of field changed.\r\n                return labeledInput.fieldView.value;\r\n            }\r\n            else {\r\n                return pickerColor.startsWith('#') ? pickerColor.substring(1) : pickerColor;\r\n            }\r\n        });\r\n        // Only accept valid hex colors as input.\r\n        labeledInput.fieldView.on('input', () => {\r\n            const inputValue = labeledInput.fieldView.element.value;\r\n            if (inputValue) {\r\n                // Trim the whitespace.\r\n                const trimmedValue = inputValue.trim();\r\n                // Drop the `#` from the beginning if present.\r\n                const hashlessInput = trimmedValue.startsWith('#') ? trimmedValue.substring(1) : trimmedValue;\r\n                // Check if it's a hex color (3,4,6 or 8 chars long and with proper characters).\r\n                const isValidHexColor = [3, 4, 6, 8].includes(hashlessInput.length) &&\r\n                    /(([0-9a-fA-F]{2}){3,4}|([0-9a-fA-F]){3,4})/.test(hashlessInput);\r\n                if (isValidHexColor) {\r\n                    // If so, set the color.\r\n                    // Otherwise, do nothing.\r\n                    this._debounceColorPickerEvent('#' + hashlessInput);\r\n                }\r\n            }\r\n        });\r\n        return labeledInput;\r\n    }\r\n}\r\n// Converts any color format to a unified hex format.\r\n//\r\n// @param inputColor\r\n// @returns An unified hex string.\r\nfunction convertColorToCommonHexFormat(inputColor) {\r\n    let ret = convertToHex(inputColor);\r\n    if (!ret) {\r\n        ret = '#000';\r\n    }\r\n    if (ret.length === 4) {\r\n        // Unfold shortcut format.\r\n        ret = '#' + [ret[1], ret[1], ret[2], ret[2], ret[3], ret[3]].join('');\r\n    }\r\n    return ret.toLowerCase();\r\n}\r\n// View abstraction over pointer in color picker.\r\nclass SliderView extends View {\r\n    /**\r\n     * @param element HTML elemnt of slider in color picker.\r\n     */\r\n    constructor(element) {\r\n        super();\r\n        this.element = element;\r\n    }\r\n    /**\r\n     * Focuses element.\r\n     */\r\n    focus() {\r\n        this.element.focus();\r\n    }\r\n}\r\n// View abstaction over the `#` character before color input.\r\nclass HashView extends View {\r\n    constructor(locale) {\r\n        super(locale);\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-color-picker__hash-view'\r\n                ]\r\n            },\r\n            children: '#'\r\n        });\r\n    }\r\n}\r\n// The class representing a row containing hex color input field.\r\n// **Note**: For now this class is private. When more use cases appear (beyond `ckeditor5-table` and `ckeditor5-image`),\r\n// it will become a component in `ckeditor5-ui`.\r\n//\r\n// @private\r\nclass ColorPickerInputRowView extends View {\r\n    /**\r\n     * Creates an instance of the form row class.\r\n     *\r\n     * @param locale The locale instance.\r\n     */\r\n    constructor(locale, children) {\r\n        super(locale);\r\n        this.children = this.createCollection(children);\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-color-picker__row'\r\n                ]\r\n            },\r\n            children: this.children\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/componentfactory\r\n */\r\nimport { CKEditorError } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * A helper class implementing the UI component ({@link module:ui/view~View view}) factory.\r\n *\r\n * It allows functions producing specific UI components to be registered under their unique names\r\n * in the factory. A registered component can be then instantiated by providing its name.\r\n * Note that the names are case insensitive.\r\n *\r\n * ```ts\r\n * // The editor provides localization tools for the factory.\r\n * const factory = new ComponentFactory( editor );\r\n *\r\n * factory.add( 'foo', locale => new FooView( locale ) );\r\n * factory.add( 'bar', locale => new BarView( locale ) );\r\n *\r\n * // An instance of FooView.\r\n * const fooInstance = factory.create( 'foo' );\r\n *\r\n * // Names are case insensitive so this is also allowed:\r\n * const barInstance = factory.create( 'Bar' );\r\n * ```\r\n *\r\n * The {@link module:core/editor/editor~Editor#locale editor locale} is passed to the factory\r\n * function when {@link module:ui/componentfactory~ComponentFactory#create} is called.\r\n */\r\nexport default class ComponentFactory {\r\n    /**\r\n     * Creates an instance of the factory.\r\n     *\r\n     * @param editor The editor instance.\r\n     */\r\n    constructor(editor) {\r\n        /**\r\n         * Registered component factories.\r\n         */\r\n        this._components = new Map();\r\n        this.editor = editor;\r\n    }\r\n    /**\r\n     * Returns an iterator of registered component names. Names are returned in lower case.\r\n     */\r\n    *names() {\r\n        for (const value of this._components.values()) {\r\n            yield value.originalName;\r\n        }\r\n    }\r\n    /**\r\n     * Registers a component factory function that will be used by the\r\n     * {@link #create create} method and called with the\r\n     * {@link module:core/editor/editor~Editor#locale editor locale} as an argument,\r\n     * allowing localization of the {@link module:ui/view~View view}.\r\n     *\r\n     * @param name The name of the component.\r\n     * @param callback The callback that returns the component.\r\n     */\r\n    add(name, callback) {\r\n        this._components.set(getNormalized(name), { callback, originalName: name });\r\n    }\r\n    /**\r\n     * Creates an instance of a component registered in the factory under a specific name.\r\n     *\r\n     * When called, the {@link module:core/editor/editor~Editor#locale editor locale} is passed to\r\n     * the previously {@link #add added} factory function, allowing localization of the\r\n     * {@link module:ui/view~View view}.\r\n     *\r\n     * @param name The name of the component.\r\n     * @returns The instantiated component view.\r\n     */\r\n    create(name) {\r\n        if (!this.has(name)) {\r\n            /**\r\n             * The required component is not registered in the component factory. Please make sure\r\n             * the provided name is correct and the component has been correctly\r\n             * {@link module:ui/componentfactory~ComponentFactory#add added} to the factory.\r\n             *\r\n             * @error componentfactory-item-missing\r\n             * @param name The name of the missing component.\r\n             */\r\n            throw new CKEditorError('componentfactory-item-missing', this, { name });\r\n        }\r\n        return this._components.get(getNormalized(name)).callback(this.editor.locale);\r\n    }\r\n    /**\r\n     * Checks if a component of a given name is registered in the factory.\r\n     *\r\n     * @param name The name of the component.\r\n     */\r\n    has(name) {\r\n        return this._components.has(getNormalized(name));\r\n    }\r\n}\r\n/**\r\n * Ensures that the component name used as the key in the internal map is in lower case.\r\n */\r\nfunction getNormalized(name) {\r\n    return String(name).toLowerCase();\r\n}\r\n","import api from \"!../../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../../css-loader/dist/cjs.js!../../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./balloonpanel.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/panel/balloon/balloonpanelview\r\n */\r\nimport View from '../../view';\r\nimport { getOptimalPosition, global, isRange, toUnit } from '@ckeditor/ckeditor5-utils';\r\nimport { isElement } from 'lodash-es';\r\nimport '../../../theme/components/panel/balloonpanel.css';\r\nconst toPx = toUnit('px');\r\nconst defaultLimiterElement = global.document.body;\r\n/**\r\n * The balloon panel view class.\r\n *\r\n * A floating container which can\r\n * {@link module:ui/panel/balloon/balloonpanelview~BalloonPanelView#pin pin} to any\r\n * {@link module:utils/dom/position~Options#target target} in the DOM and remain in that position\r\n * e.g. when the web page is scrolled.\r\n *\r\n * The balloon panel can be used to display contextual, non-blocking UI like forms, toolbars and\r\n * the like in its {@link module:ui/panel/balloon/balloonpanelview~BalloonPanelView#content} view\r\n * collection.\r\n *\r\n * There is a number of {@link module:ui/panel/balloon/balloonpanelview~BalloonPanelView.defaultPositions}\r\n * that the balloon can use, automatically switching from one to another when the viewport space becomes\r\n * scarce to keep the balloon visible to the user as long as it is possible. The balloon will also\r\n * accept any custom position set provided by the user compatible with the\r\n * {@link module:utils/dom/position~Options options}.\r\n *\r\n * ```ts\r\n * const panel = new BalloonPanelView( locale );\r\n * const childView = new ChildView();\r\n * const positions = BalloonPanelView.defaultPositions;\r\n *\r\n * panel.render();\r\n *\r\n * // Add a child view to the panel's content collection.\r\n * panel.content.add( childView );\r\n *\r\n * // Start pinning the panel to an element with the \"target\" id DOM.\r\n * // The balloon will remain pinned until unpin() is called.\r\n * panel.pin( {\r\n * \ttarget: document.querySelector( '#target' ),\r\n * \tpositions: [\r\n * \t\tpositions.northArrowSouth,\r\n * \t\tpositions.southArrowNorth\r\n * \t]\r\n * } );\r\n * ```\r\n */\r\nexport default class BalloonPanelView extends View {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        const bind = this.bindTemplate;\r\n        this.set('top', 0);\r\n        this.set('left', 0);\r\n        this.set('position', 'arrow_nw');\r\n        this.set('isVisible', false);\r\n        this.set('withArrow', true);\r\n        this.set('class', undefined);\r\n        this._pinWhenIsVisibleCallback = null;\r\n        this.content = this.createCollection();\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-balloon-panel',\r\n                    bind.to('position', value => `ck-balloon-panel_${value}`),\r\n                    bind.if('isVisible', 'ck-balloon-panel_visible'),\r\n                    bind.if('withArrow', 'ck-balloon-panel_with-arrow'),\r\n                    bind.to('class')\r\n                ],\r\n                style: {\r\n                    top: bind.to('top', toPx),\r\n                    left: bind.to('left', toPx)\r\n                }\r\n            },\r\n            children: this.content\r\n        });\r\n    }\r\n    /**\r\n     * Shows the panel.\r\n     *\r\n     * See {@link #isVisible}.\r\n     */\r\n    show() {\r\n        this.isVisible = true;\r\n    }\r\n    /**\r\n     * Hides the panel.\r\n     *\r\n     * See {@link #isVisible}.\r\n     */\r\n    hide() {\r\n        this.isVisible = false;\r\n    }\r\n    /**\r\n     * Attaches the panel to a specified {@link module:utils/dom/position~Options#target} with a\r\n     * smart positioning heuristics that chooses from available positions to make sure the panel\r\n     * is visible to the user i.e. within the limits of the viewport.\r\n     *\r\n     * This method accepts configuration {@link module:utils/dom/position~Options options}\r\n     * to set the `target`, optional `limiter` and `positions` the balloon should choose from.\r\n     *\r\n     * ```ts\r\n     * const panel = new BalloonPanelView( locale );\r\n     * const positions = BalloonPanelView.defaultPositions;\r\n     *\r\n     * panel.render();\r\n     *\r\n     * // Attach the panel to an element with the \"target\" id DOM.\r\n     * panel.attachTo( {\r\n     * \ttarget: document.querySelector( '#target' ),\r\n     * \tpositions: [\r\n     * \t\tpositions.northArrowSouth,\r\n     * \t\tpositions.southArrowNorth\r\n     * \t]\r\n     * } );\r\n     * ```\r\n     *\r\n     * **Note**: Attaching the panel will also automatically {@link #show} it.\r\n     *\r\n     * **Note**: An attached panel will not follow its target when the window is scrolled or resized.\r\n     * See the {@link #pin} method for a more permanent positioning strategy.\r\n     *\r\n     * @param options Positioning options compatible with {@link module:utils/dom/position~getOptimalPosition}.\r\n     * Default `positions` array is {@link module:ui/panel/balloon/balloonpanelview~BalloonPanelView.defaultPositions}.\r\n     */\r\n    attachTo(options) {\r\n        this.show();\r\n        const defaultPositions = BalloonPanelView.defaultPositions;\r\n        const positionOptions = Object.assign({}, {\r\n            element: this.element,\r\n            positions: [\r\n                defaultPositions.southArrowNorth,\r\n                defaultPositions.southArrowNorthMiddleWest,\r\n                defaultPositions.southArrowNorthMiddleEast,\r\n                defaultPositions.southArrowNorthWest,\r\n                defaultPositions.southArrowNorthEast,\r\n                defaultPositions.northArrowSouth,\r\n                defaultPositions.northArrowSouthMiddleWest,\r\n                defaultPositions.northArrowSouthMiddleEast,\r\n                defaultPositions.northArrowSouthWest,\r\n                defaultPositions.northArrowSouthEast,\r\n                defaultPositions.viewportStickyNorth\r\n            ],\r\n            limiter: defaultLimiterElement,\r\n            fitInViewport: true\r\n        }, options);\r\n        const optimalPosition = BalloonPanelView._getOptimalPosition(positionOptions);\r\n        // Usually browsers make some problems with super accurate values like 104.345px\r\n        // so it is better to use int values.\r\n        const left = parseInt(optimalPosition.left);\r\n        const top = parseInt(optimalPosition.top);\r\n        const position = optimalPosition.name;\r\n        const config = optimalPosition.config || {};\r\n        const { withArrow = true } = config;\r\n        this.top = top;\r\n        this.left = left;\r\n        this.position = position;\r\n        this.withArrow = withArrow;\r\n    }\r\n    /**\r\n     * Works the same way as the {@link #attachTo} method except that the position of the panel is\r\n     * continuously updated when:\r\n     *\r\n     * * any ancestor of the {@link module:utils/dom/position~Options#target}\r\n     * or {@link module:utils/dom/position~Options#limiter} is scrolled,\r\n     * * the browser window gets resized or scrolled.\r\n     *\r\n     * Thanks to that, the panel always sticks to the {@link module:utils/dom/position~Options#target}\r\n     * and is immune to the changing environment.\r\n     *\r\n     * ```ts\r\n     * const panel = new BalloonPanelView( locale );\r\n     * const positions = BalloonPanelView.defaultPositions;\r\n     *\r\n     * panel.render();\r\n     *\r\n     * // Pin the panel to an element with the \"target\" id DOM.\r\n     * panel.pin( {\r\n     * \ttarget: document.querySelector( '#target' ),\r\n     * \tpositions: [\r\n     * \t\tpositions.northArrowSouth,\r\n     * \t\tpositions.southArrowNorth\r\n     * \t]\r\n     * } );\r\n     * ```\r\n     *\r\n     * To leave the pinned state, use the {@link #unpin} method.\r\n     *\r\n     * **Note**: Pinning the panel will also automatically {@link #show} it.\r\n     *\r\n     * @param options Positioning options compatible with {@link module:utils/dom/position~getOptimalPosition}.\r\n     * Default `positions` array is {@link module:ui/panel/balloon/balloonpanelview~BalloonPanelView.defaultPositions}.\r\n     */\r\n    pin(options) {\r\n        this.unpin();\r\n        this._pinWhenIsVisibleCallback = () => {\r\n            if (this.isVisible) {\r\n                this._startPinning(options);\r\n            }\r\n            else {\r\n                this._stopPinning();\r\n            }\r\n        };\r\n        this._startPinning(options);\r\n        // Control the state of the listeners depending on whether the panel is visible\r\n        // or not.\r\n        // TODO: Use on() (https://github.com/ckeditor/ckeditor5-utils/issues/144).\r\n        this.listenTo(this, 'change:isVisible', this._pinWhenIsVisibleCallback);\r\n    }\r\n    /**\r\n     * Stops pinning the panel, as set up by {@link #pin}.\r\n     */\r\n    unpin() {\r\n        if (this._pinWhenIsVisibleCallback) {\r\n            // Deactivate listeners attached by pin().\r\n            this._stopPinning();\r\n            // Deactivate the panel pin() control logic.\r\n            // TODO: Use off() (https://github.com/ckeditor/ckeditor5-utils/issues/144).\r\n            this.stopListening(this, 'change:isVisible', this._pinWhenIsVisibleCallback);\r\n            this._pinWhenIsVisibleCallback = null;\r\n            this.hide();\r\n        }\r\n    }\r\n    /**\r\n     * Starts managing the pinned state of the panel. See {@link #pin}.\r\n     *\r\n     * @param options Positioning options compatible with {@link module:utils/dom/position~getOptimalPosition}.\r\n     */\r\n    _startPinning(options) {\r\n        this.attachTo(options);\r\n        const targetElement = getDomElement(options.target);\r\n        const limiterElement = options.limiter ? getDomElement(options.limiter) : defaultLimiterElement;\r\n        // Then we need to listen on scroll event of eny element in the document.\r\n        this.listenTo(global.document, 'scroll', (evt, domEvt) => {\r\n            const scrollTarget = domEvt.target;\r\n            // The position needs to be updated if the positioning target is within the scrolled element.\r\n            const isWithinScrollTarget = targetElement && scrollTarget.contains(targetElement);\r\n            // The position needs to be updated if the positioning limiter is within the scrolled element.\r\n            const isLimiterWithinScrollTarget = limiterElement && scrollTarget.contains(limiterElement);\r\n            // The positioning target and/or limiter can be a Rect, object etc..\r\n            // There's no way to optimize the listener then.\r\n            if (isWithinScrollTarget || isLimiterWithinScrollTarget || !targetElement || !limiterElement) {\r\n                this.attachTo(options);\r\n            }\r\n        }, { useCapture: true });\r\n        // We need to listen on window resize event and update position.\r\n        this.listenTo(global.window, 'resize', () => {\r\n            this.attachTo(options);\r\n        });\r\n    }\r\n    /**\r\n     * Stops managing the pinned state of the panel. See {@link #pin}.\r\n     */\r\n    _stopPinning() {\r\n        this.stopListening(global.document, 'scroll');\r\n        this.stopListening(global.window, 'resize');\r\n    }\r\n}\r\n/**\r\n * A side offset of the arrow tip from the edge of the balloon. Controlled by CSS.\r\n *\r\n * ```\r\n *\t\t ┌───────────────────────┐\r\n *\t\t │                       │\r\n *\t\t │         Balloon       │\r\n *\t\t │         Content       │\r\n *\t\t │                       │\r\n *\t\t └──+    +───────────────┘\r\n *\t\t |   \\  /\r\n *\t\t |    \\/\r\n *\t\t>┼─────┼< ─────────────────────── side offset\r\n *\r\n * ```\r\n *\r\n * @default 25\r\n */\r\nBalloonPanelView.arrowSideOffset = 25;\r\n/**\r\n * A height offset of the arrow from the edge of the balloon. Controlled by CSS.\r\n *\r\n * ```\r\n *\t\t ┌───────────────────────┐\r\n *\t\t │                       │\r\n *\t\t │         Balloon       │\r\n *\t\t │         Content       │      ╱-- arrow height offset\r\n *\t\t │                       │      V\r\n *\t\t └──+    +───────────────┘ --- ─┼───────\r\n *\t\t     \\  /                       │\r\n *\t\t      \\/                        │\r\n *\t\t────────────────────────────────┼───────\r\n *\t\t                                ^\r\n *\r\n *\r\n *\t\t>┼────┼<  arrow height offset\r\n *\t\t │    │\r\n *\t\t │    ┌────────────────────────┐\r\n *\t\t │    │                        │\r\n *\t\t │   ╱                         │\r\n *\t\t │ ╱            Balloon        │\r\n *\t\t │ ╲            Content        │\r\n *\t\t │   ╲                         │\r\n *\t\t │    │                        │\r\n *\t\t │    └────────────────────────┘\r\n * ```\r\n *\r\n * @default 10\r\n*/\r\nBalloonPanelView.arrowHeightOffset = 10;\r\n/**\r\n * A vertical offset of the balloon panel from the edge of the viewport if sticky.\r\n * It helps in accessing toolbar buttons underneath the balloon panel.\r\n *\r\n * ```\r\n *\t\t  ┌───────────────────────────────────────────────────┐\r\n *\t\t  │                      Target                       │\r\n *\t\t  │                                                   │\r\n *\t\t  │                            /── vertical offset    │\r\n *\t\t┌─────────────────────────────V─────────────────────────┐\r\n *\t\t│ Toolbar            ┌─────────────┐                    │\r\n *\t\t├────────────────────│   Balloon   │────────────────────┤\r\n *\t\t│ │                  └─────────────┘                  │ │\r\n *\t\t│ │                                                   │ │\r\n *\t\t│ │                                                   │ │\r\n *\t\t│ │                                                   │ │\r\n *\t\t│ └───────────────────────────────────────────────────┘ │\r\n *\t\t│                        Viewport                       │\r\n *\t\t└───────────────────────────────────────────────────────┘\r\n * ```\r\n *\r\n * @default 20\r\n */\r\nBalloonPanelView.stickyVerticalOffset = 20;\r\n/**\r\n * Function used to calculate the optimal position for the balloon.\r\n */\r\nBalloonPanelView._getOptimalPosition = getOptimalPosition;\r\n/**\r\n * A default set of positioning functions used by the balloon panel view\r\n * when attaching using the {@link module:ui/panel/balloon/balloonpanelview~BalloonPanelView#attachTo} method.\r\n *\r\n * The available positioning functions are as follows:\r\n *\r\n * **North west**\r\n *\r\n * * `northWestArrowSouthWest`\r\n *\r\n * ```\r\n *\t\t+-----------------+\r\n *\t\t|     Balloon     |\r\n *\t\t+-----------------+\r\n *\t\t V\r\n *\t\t [ Target ]\r\n * ```\r\n *\r\n * * `northWestArrowSouthMiddleWest`\r\n *\r\n * ```\r\n *\t\t+-----------------+\r\n *\t\t|     Balloon     |\r\n *\t\t+-----------------+\r\n *\t\t    V\r\n *\t\t    [ Target ]\r\n * ```\r\n *\r\n * * `northWestArrowSouth`\r\n *\r\n * ```\r\n *\t\t+-----------------+\r\n *\t\t|     Balloon     |\r\n *\t\t+-----------------+\r\n *\t\t         V\r\n *\t\t         [ Target ]\r\n * ```\r\n *\r\n * * `northWestArrowSouthMiddleEast`\r\n *\r\n * ```\r\n *\t\t+-----------------+\r\n *\t\t|     Balloon     |\r\n *\t\t+-----------------+\r\n *\t\t             V\r\n *\t\t             [ Target ]\r\n * ```\r\n *\r\n * * `northWestArrowSouthEast`\r\n *\r\n * ```\r\n *\t\t+-----------------+\r\n *\t\t|     Balloon     |\r\n *\t\t+-----------------+\r\n *\t\t                 V\r\n *\t\t                 [ Target ]\r\n * ```\r\n *\r\n * **North**\r\n *\r\n * * `northArrowSouthWest`\r\n *\r\n * ```\r\n *\t\t    +-----------------+\r\n *\t\t    |     Balloon     |\r\n *\t\t    +-----------------+\r\n *\t\t     V\r\n *\t\t[ Target ]\r\n * ```\r\n *\r\n * * `northArrowSouthMiddleWest`\r\n *\r\n * ```\r\n *\t\t +-----------------+\r\n *\t\t |     Balloon     |\r\n *\t\t +-----------------+\r\n *\t\t     V\r\n *\t\t[ Target ]\r\n * ```\r\n * * `northArrowSouth`\r\n *\r\n * ```\r\n *\t\t+-----------------+\r\n *\t\t|     Balloon     |\r\n *\t\t+-----------------+\r\n *\t\t         V\r\n *\t\t    [ Target ]\r\n * ```\r\n *\r\n * * `northArrowSouthMiddleEast`\r\n *\r\n * ```\r\n *\t\t+-----------------+\r\n *\t\t|     Balloon     |\r\n *\t\t+-----------------+\r\n *\t\t             V\r\n *\t\t        [ Target ]\r\n * ```\r\n *\r\n * * `northArrowSouthEast`\r\n *\r\n * ```\r\n *\t\t+-----------------+\r\n *\t\t|     Balloon     |\r\n *\t\t+-----------------+\r\n *\t\t                V\r\n *\t\t           [ Target ]\r\n * ```\r\n *\r\n * **North east**\r\n *\r\n * * `northEastArrowSouthWest`\r\n *\r\n * ```\r\n *\t\t        +-----------------+\r\n *\t\t        |     Balloon     |\r\n *\t\t        +-----------------+\r\n *\t\t         V\r\n *\t\t[ Target ]\r\n * ```\r\n *\r\n * * `northEastArrowSouthMiddleWest`\r\n *\r\n * ```\r\n *\t\t     +-----------------+\r\n *\t\t     |     Balloon     |\r\n *\t\t     +-----------------+\r\n *\t\t         V\r\n *\t\t[ Target ]\r\n * ```\r\n *\r\n * * `northEastArrowSouth`\r\n *\r\n * ```\r\n *\t\t+-----------------+\r\n *\t\t|     Balloon     |\r\n *\t\t+-----------------+\r\n *\t\t         V\r\n *\t\t[ Target ]\r\n * ```\r\n *\r\n * * `northEastArrowSouthMiddleEast`\r\n *\r\n * ```\r\n *\t\t+-----------------+\r\n *\t\t|     Balloon     |\r\n *\t\t+-----------------+\r\n *\t\t             V\r\n *\t\t    [ Target ]\r\n * ```\r\n *\r\n * * `northEastArrowSouthEast`\r\n *\r\n * ```\r\n *\t\t+-----------------+\r\n *\t\t|     Balloon     |\r\n *\t\t+-----------------+\r\n *\t\t                 V\r\n *\t\t        [ Target ]\r\n * ```\r\n *\r\n * **South**\r\n *\r\n * * `southArrowNorthWest`\r\n *\r\n * ```\r\n *\t\t[ Target ]\r\n *\t\t     ^\r\n *\t\t    +-----------------+\r\n *\t\t    |     Balloon     |\r\n *\t\t    +-----------------+\r\n * ```\r\n *\r\n * * `southArrowNorthMiddleWest`\r\n *\r\n * ```\r\n *\t\t   [ Target ]\r\n *\t\t        ^\r\n *\t\t    +-----------------+\r\n *\t\t    |     Balloon     |\r\n *\t\t    +-----------------+\r\n * ```\r\n *\r\n * * `southArrowNorth`\r\n *\r\n * ```\r\n *\t\t    [ Target ]\r\n *\t\t         ^\r\n *\t\t+-----------------+\r\n *\t\t|     Balloon     |\r\n *\t\t+-----------------+\r\n * ```\r\n *\r\n * * `southArrowNorthMiddleEast`\r\n *\r\n * ```\r\n *\t\t            [ Target ]\r\n *\t\t                 ^\r\n *\t\t   +-----------------+\r\n *\t\t   |     Balloon     |\r\n *\t\t   +-----------------+\r\n * ```\r\n *\r\n * * `southArrowNorthEast`\r\n *\r\n * ```\r\n *\t\t            [ Target ]\r\n *\t\t                 ^\r\n *\t\t+-----------------+\r\n *\t\t|     Balloon     |\r\n *\t\t+-----------------+\r\n * ```\r\n *\r\n * **South west**\r\n *\r\n * * `southWestArrowNorthWest`\r\n *\r\n *\r\n * ```\r\n *\t\t [ Target ]\r\n *\t\t ^\r\n *\t\t+-----------------+\r\n *\t\t|     Balloon     |\r\n *\t\t+-----------------+\r\n * ```\r\n *\r\n * * `southWestArrowNorthMiddleWest`\r\n *\r\n * ```\r\n *\t\t     [ Target ]\r\n *\t\t     ^\r\n *\t\t +-----------------+\r\n *\t\t |     Balloon     |\r\n *\t\t +-----------------+\r\n * ```\r\n *\r\n * * `southWestArrowNorth`\r\n *\r\n * ```\r\n *\t\t         [ Target ]\r\n *\t\t         ^\r\n *\t\t+-----------------+\r\n *\t\t|     Balloon     |\r\n *\t\t+-----------------+\r\n * ```\r\n *\r\n * * `southWestArrowNorthMiddleEast`\r\n *\r\n * ```\r\n *\t\t              [ Target ]\r\n *\t\t              ^\r\n *\t\t+-----------------+\r\n *\t\t|     Balloon     |\r\n *\t\t+-----------------+\r\n * ```\r\n *\r\n * * `southWestArrowNorthEast`\r\n *\r\n * ```\r\n *\t\t                 [ Target ]\r\n *\t\t                 ^\r\n *\t\t+-----------------+\r\n *\t\t|     Balloon     |\r\n *\t\t+-----------------+\r\n * ```\r\n *\r\n * **South east**\r\n *\r\n * * `southEastArrowNorthWest`\r\n *\r\n * ```\r\n *\t\t[ Target ]\r\n *\t\t         ^\r\n *\t\t        +-----------------+\r\n *\t\t        |     Balloon     |\r\n *\t\t        +-----------------+\r\n * ```\r\n *\r\n * * `southEastArrowNorthMiddleWest`\r\n *\r\n * ```\r\n *\t\t   [ Target ]\r\n *\t\t            ^\r\n *\t\t        +-----------------+\r\n *\t\t        |     Balloon     |\r\n *\t\t        +-----------------+\r\n * ```\r\n *\r\n * * `southEastArrowNorth`\r\n *\r\n * ```\r\n *\t\t[ Target ]\r\n *\t\t         ^\r\n *\t\t+-----------------+\r\n *\t\t|     Balloon     |\r\n *\t\t+-----------------+\r\n * ```\r\n *\r\n * * `southEastArrowNorthMiddleEast`\r\n *\r\n * ```\r\n *\t\t     [ Target ]\r\n *\t\t              ^\r\n *\t\t+-----------------+\r\n *\t\t|     Balloon     |\r\n *\t\t+-----------------+\r\n * ```\r\n *\r\n * * `southEastArrowNorthEast`\r\n *\r\n * ```\r\n *\t\t        [ Target ]\r\n *\t\t                 ^\r\n *\t\t+-----------------+\r\n *\t\t|     Balloon     |\r\n *\t\t+-----------------+\r\n * ```\r\n *\r\n * **West**\r\n *\r\n * * `westArrowEast`\r\n *\r\n * ```\r\n *\t\t+-----------------+\r\n *\t\t|     Balloon     |>[ Target ]\r\n *\t\t+-----------------+\r\n * ```\r\n *\r\n * **East**\r\n *\r\n * * `eastArrowWest`\r\n *\r\n * ```\r\n *\t\t           +-----------------+\r\n *\t\t[ Target ]<|     Balloon     |\r\n *\t\t           +-----------------+\r\n * ```\r\n *\r\n * **Sticky**\r\n *\r\n * * `viewportStickyNorth`\r\n *\r\n * ```\r\n *\t\t    +---------------------------+\r\n *\t\t    |        [ Target ]         |\r\n *\t\t    |                           |\r\n *\t\t+-----------------------------------+\r\n *\t\t|   |    +-----------------+    |   |\r\n *\t\t|   |    |     Balloon     |    |   |\r\n *\t\t|   |    +-----------------+    |   |\r\n *\t\t|   |                           |   |\r\n *\t\t|   |                           |   |\r\n *\t\t|   |                           |   |\r\n *\t\t|   |                           |   |\r\n *\t\t|   +---------------------------+   |\r\n *\t\t|             Viewport              |\r\n *\t\t+-----------------------------------+\r\n * ```\r\n *\r\n * See {@link module:ui/panel/balloon/balloonpanelview~BalloonPanelView#attachTo}.\r\n *\r\n * Positioning functions must be compatible with {@link module:utils/dom/position~Position}.\r\n *\r\n * Default positioning functions with customized offsets can be generated using\r\n * {@link module:ui/panel/balloon/balloonpanelview~generatePositions}.\r\n *\r\n * The name that the position function returns will be reflected in the balloon panel's class that\r\n * controls the placement of the \"arrow\". See {@link #position} to learn more.\r\n */\r\nBalloonPanelView.defaultPositions = generatePositions();\r\n/**\r\n * Returns the DOM element for given object or null, if there is none,\r\n * e.g. when the passed object is a Rect instance or so.\r\n */\r\nfunction getDomElement(object) {\r\n    if (isElement(object)) {\r\n        return object;\r\n    }\r\n    if (isRange(object)) {\r\n        return object.commonAncestorContainer;\r\n    }\r\n    if (typeof object == 'function') {\r\n        return getDomElement(object());\r\n    }\r\n    return null;\r\n}\r\n/**\r\n * Returns available {@link module:ui/panel/balloon/balloonpanelview~BalloonPanelView}\r\n * {@link module:utils/dom/position~PositioningFunction positioning functions} adjusted by the specific offsets.\r\n *\r\n * @internal\r\n * @param options Options to generate positions. If not specified, this helper will simply return\r\n * {@link module:ui/panel/balloon/balloonpanelview~BalloonPanelView.defaultPositions}.\r\n * @param options.sideOffset A custom side offset (in pixels) of each position. If\r\n * not specified, {@link module:ui/panel/balloon/balloonpanelview~BalloonPanelView.arrowSideOffset the default value}\r\n * will be used.\r\n * @param options.heightOffset A custom height offset (in pixels) of each position. If\r\n * not specified, {@link module:ui/panel/balloon/balloonpanelview~BalloonPanelView.arrowHeightOffset the default value}\r\n * will be used.\r\n * @param options.stickyVerticalOffset A custom offset (in pixels) of the `viewportStickyNorth` positioning function.\r\n * If not specified, {@link module:ui/panel/balloon/balloonpanelview~BalloonPanelView.stickyVerticalOffset the default value}\r\n * will be used.\r\n * @param options.config Additional configuration of the balloon balloon panel view.\r\n * Currently only {@link module:ui/panel/balloon/balloonpanelview~BalloonPanelView#withArrow} is supported. Learn more\r\n * about {@link module:utils/dom/position~PositioningFunction positioning functions}.\r\n */\r\nexport function generatePositions(options = {}) {\r\n    const { sideOffset = BalloonPanelView.arrowSideOffset, heightOffset = BalloonPanelView.arrowHeightOffset, stickyVerticalOffset = BalloonPanelView.stickyVerticalOffset, config } = options;\r\n    return {\r\n        // ------- North west\r\n        northWestArrowSouthWest: (targetRect, balloonRect) => ({\r\n            top: getNorthTop(targetRect, balloonRect),\r\n            left: targetRect.left - sideOffset,\r\n            name: 'arrow_sw',\r\n            ...(config && { config })\r\n        }),\r\n        northWestArrowSouthMiddleWest: (targetRect, balloonRect) => ({\r\n            top: getNorthTop(targetRect, balloonRect),\r\n            left: targetRect.left - (balloonRect.width * .25) - sideOffset,\r\n            name: 'arrow_smw',\r\n            ...(config && { config })\r\n        }),\r\n        northWestArrowSouth: (targetRect, balloonRect) => ({\r\n            top: getNorthTop(targetRect, balloonRect),\r\n            left: targetRect.left - balloonRect.width / 2,\r\n            name: 'arrow_s',\r\n            ...(config && { config })\r\n        }),\r\n        northWestArrowSouthMiddleEast: (targetRect, balloonRect) => ({\r\n            top: getNorthTop(targetRect, balloonRect),\r\n            left: targetRect.left - (balloonRect.width * .75) + sideOffset,\r\n            name: 'arrow_sme',\r\n            ...(config && { config })\r\n        }),\r\n        northWestArrowSouthEast: (targetRect, balloonRect) => ({\r\n            top: getNorthTop(targetRect, balloonRect),\r\n            left: targetRect.left - balloonRect.width + sideOffset,\r\n            name: 'arrow_se',\r\n            ...(config && { config })\r\n        }),\r\n        // ------- North\r\n        northArrowSouthWest: (targetRect, balloonRect) => ({\r\n            top: getNorthTop(targetRect, balloonRect),\r\n            left: targetRect.left + targetRect.width / 2 - sideOffset,\r\n            name: 'arrow_sw',\r\n            ...(config && { config })\r\n        }),\r\n        northArrowSouthMiddleWest: (targetRect, balloonRect) => ({\r\n            top: getNorthTop(targetRect, balloonRect),\r\n            left: targetRect.left + targetRect.width / 2 - (balloonRect.width * .25) - sideOffset,\r\n            name: 'arrow_smw',\r\n            ...(config && { config })\r\n        }),\r\n        northArrowSouth: (targetRect, balloonRect) => ({\r\n            top: getNorthTop(targetRect, balloonRect),\r\n            left: targetRect.left + targetRect.width / 2 - balloonRect.width / 2,\r\n            name: 'arrow_s',\r\n            ...(config && { config })\r\n        }),\r\n        northArrowSouthMiddleEast: (targetRect, balloonRect) => ({\r\n            top: getNorthTop(targetRect, balloonRect),\r\n            left: targetRect.left + targetRect.width / 2 - (balloonRect.width * .75) + sideOffset,\r\n            name: 'arrow_sme',\r\n            ...(config && { config })\r\n        }),\r\n        northArrowSouthEast: (targetRect, balloonRect) => ({\r\n            top: getNorthTop(targetRect, balloonRect),\r\n            left: targetRect.left + targetRect.width / 2 - balloonRect.width + sideOffset,\r\n            name: 'arrow_se',\r\n            ...(config && { config })\r\n        }),\r\n        // ------- North east\r\n        northEastArrowSouthWest: (targetRect, balloonRect) => ({\r\n            top: getNorthTop(targetRect, balloonRect),\r\n            left: targetRect.right - sideOffset,\r\n            name: 'arrow_sw',\r\n            ...(config && { config })\r\n        }),\r\n        northEastArrowSouthMiddleWest: (targetRect, balloonRect) => ({\r\n            top: getNorthTop(targetRect, balloonRect),\r\n            left: targetRect.right - (balloonRect.width * .25) - sideOffset,\r\n            name: 'arrow_smw',\r\n            ...(config && { config })\r\n        }),\r\n        northEastArrowSouth: (targetRect, balloonRect) => ({\r\n            top: getNorthTop(targetRect, balloonRect),\r\n            left: targetRect.right - balloonRect.width / 2,\r\n            name: 'arrow_s',\r\n            ...(config && { config })\r\n        }),\r\n        northEastArrowSouthMiddleEast: (targetRect, balloonRect) => ({\r\n            top: getNorthTop(targetRect, balloonRect),\r\n            left: targetRect.right - (balloonRect.width * .75) + sideOffset,\r\n            name: 'arrow_sme',\r\n            ...(config && { config })\r\n        }),\r\n        northEastArrowSouthEast: (targetRect, balloonRect) => ({\r\n            top: getNorthTop(targetRect, balloonRect),\r\n            left: targetRect.right - balloonRect.width + sideOffset,\r\n            name: 'arrow_se',\r\n            ...(config && { config })\r\n        }),\r\n        // ------- South west\r\n        southWestArrowNorthWest: targetRect => ({\r\n            top: getSouthTop(targetRect),\r\n            left: targetRect.left - sideOffset,\r\n            name: 'arrow_nw',\r\n            ...(config && { config })\r\n        }),\r\n        southWestArrowNorthMiddleWest: (targetRect, balloonRect) => ({\r\n            top: getSouthTop(targetRect),\r\n            left: targetRect.left - (balloonRect.width * .25) - sideOffset,\r\n            name: 'arrow_nmw',\r\n            ...(config && { config })\r\n        }),\r\n        southWestArrowNorth: (targetRect, balloonRect) => ({\r\n            top: getSouthTop(targetRect),\r\n            left: targetRect.left - balloonRect.width / 2,\r\n            name: 'arrow_n',\r\n            ...(config && { config })\r\n        }),\r\n        southWestArrowNorthMiddleEast: (targetRect, balloonRect) => ({\r\n            top: getSouthTop(targetRect),\r\n            left: targetRect.left - (balloonRect.width * .75) + sideOffset,\r\n            name: 'arrow_nme',\r\n            ...(config && { config })\r\n        }),\r\n        southWestArrowNorthEast: (targetRect, balloonRect) => ({\r\n            top: getSouthTop(targetRect),\r\n            left: targetRect.left - balloonRect.width + sideOffset,\r\n            name: 'arrow_ne',\r\n            ...(config && { config })\r\n        }),\r\n        // ------- South\r\n        southArrowNorthWest: targetRect => ({\r\n            top: getSouthTop(targetRect),\r\n            left: targetRect.left + targetRect.width / 2 - sideOffset,\r\n            name: 'arrow_nw',\r\n            ...(config && { config })\r\n        }),\r\n        southArrowNorthMiddleWest: (targetRect, balloonRect) => ({\r\n            top: getSouthTop(targetRect),\r\n            left: targetRect.left + targetRect.width / 2 - (balloonRect.width * 0.25) - sideOffset,\r\n            name: 'arrow_nmw',\r\n            ...(config && { config })\r\n        }),\r\n        southArrowNorth: (targetRect, balloonRect) => ({\r\n            top: getSouthTop(targetRect),\r\n            left: targetRect.left + targetRect.width / 2 - balloonRect.width / 2,\r\n            name: 'arrow_n',\r\n            ...(config && { config })\r\n        }),\r\n        southArrowNorthMiddleEast: (targetRect, balloonRect) => ({\r\n            top: getSouthTop(targetRect),\r\n            left: targetRect.left + targetRect.width / 2 - (balloonRect.width * 0.75) + sideOffset,\r\n            name: 'arrow_nme',\r\n            ...(config && { config })\r\n        }),\r\n        southArrowNorthEast: (targetRect, balloonRect) => ({\r\n            top: getSouthTop(targetRect),\r\n            left: targetRect.left + targetRect.width / 2 - balloonRect.width + sideOffset,\r\n            name: 'arrow_ne',\r\n            ...(config && { config })\r\n        }),\r\n        // ------- South east\r\n        southEastArrowNorthWest: targetRect => ({\r\n            top: getSouthTop(targetRect),\r\n            left: targetRect.right - sideOffset,\r\n            name: 'arrow_nw',\r\n            ...(config && { config })\r\n        }),\r\n        southEastArrowNorthMiddleWest: (targetRect, balloonRect) => ({\r\n            top: getSouthTop(targetRect),\r\n            left: targetRect.right - (balloonRect.width * .25) - sideOffset,\r\n            name: 'arrow_nmw',\r\n            ...(config && { config })\r\n        }),\r\n        southEastArrowNorth: (targetRect, balloonRect) => ({\r\n            top: getSouthTop(targetRect),\r\n            left: targetRect.right - balloonRect.width / 2,\r\n            name: 'arrow_n',\r\n            ...(config && { config })\r\n        }),\r\n        southEastArrowNorthMiddleEast: (targetRect, balloonRect) => ({\r\n            top: getSouthTop(targetRect),\r\n            left: targetRect.right - (balloonRect.width * .75) + sideOffset,\r\n            name: 'arrow_nme',\r\n            ...(config && { config })\r\n        }),\r\n        southEastArrowNorthEast: (targetRect, balloonRect) => ({\r\n            top: getSouthTop(targetRect),\r\n            left: targetRect.right - balloonRect.width + sideOffset,\r\n            name: 'arrow_ne',\r\n            ...(config && { config })\r\n        }),\r\n        // ------- West\r\n        westArrowEast: (targetRect, balloonRect) => ({\r\n            top: targetRect.top + targetRect.height / 2 - balloonRect.height / 2,\r\n            left: targetRect.left - balloonRect.width - heightOffset,\r\n            name: 'arrow_e',\r\n            ...(config && { config })\r\n        }),\r\n        // ------- East\r\n        eastArrowWest: (targetRect, balloonRect) => ({\r\n            top: targetRect.top + targetRect.height / 2 - balloonRect.height / 2,\r\n            left: targetRect.right + heightOffset,\r\n            name: 'arrow_w',\r\n            ...(config && { config })\r\n        }),\r\n        // ------- Sticky\r\n        viewportStickyNorth: (targetRect, balloonRect, viewportRect) => {\r\n            if (!targetRect.getIntersection(viewportRect)) {\r\n                return null;\r\n            }\r\n            return {\r\n                top: viewportRect.top + stickyVerticalOffset,\r\n                left: targetRect.left + targetRect.width / 2 - balloonRect.width / 2,\r\n                name: 'arrowless',\r\n                config: {\r\n                    withArrow: false,\r\n                    ...config\r\n                }\r\n            };\r\n        }\r\n    };\r\n    /**\r\n     * Returns the top coordinate for positions starting with `north*`.\r\n     *\r\n     * @param targetRect A rect of the target.\r\n     * @param balloonRect A rect of the balloon.\r\n     */\r\n    function getNorthTop(targetRect, balloonRect) {\r\n        return targetRect.top - balloonRect.height - heightOffset;\r\n    }\r\n    /**\r\n     * Returns the top coordinate for positions starting with `south*`.\r\n     *\r\n     * @param targetRect A rect of the target.\r\n     */\r\n    function getSouthTop(targetRect) {\r\n        return targetRect.bottom + heightOffset;\r\n    }\r\n}\r\n","import api from \"!../../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../../css-loader/dist/cjs.js!../../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./tooltip.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/tooltipmanager\r\n */\r\nimport View from './view';\r\nimport BalloonPanelView, { generatePositions } from './panel/balloon/balloonpanelview';\r\nimport { DomEmitterMixin, ResizeObserver, first, global, isVisible } from '@ckeditor/ckeditor5-utils';\r\nimport { isElement, debounce } from 'lodash-es';\r\nimport '../theme/components/tooltip/tooltip.css';\r\nconst BALLOON_CLASS = 'ck-tooltip';\r\n/**\r\n * A tooltip manager class for the UI of the editor.\r\n *\r\n * **Note**: Most likely you do not have to use the `TooltipManager` API listed below in order to display tooltips. Popular\r\n * {@glink framework/architecture/ui-library UI components} support tooltips out-of-the-box via observable properties\r\n * (see {@link module:ui/button/buttonview~ButtonView#tooltip} and {@link module:ui/button/buttonview~ButtonView#tooltipPosition}).\r\n *\r\n * # Displaying tooltips\r\n *\r\n * To display a tooltip, set `data-cke-tooltip-text` attribute on any DOM element:\r\n *\r\n * ```ts\r\n * domElement.dataset.ckeTooltipText = 'My tooltip';\r\n * ```\r\n *\r\n * The tooltip will show up whenever the user moves the mouse over the element or the element gets focus in DOM.\r\n *\r\n * # Positioning tooltips\r\n *\r\n * To change the position of the tooltip, use the `data-cke-tooltip-position` attribute (`s`, `se`, `sw`, `n`, `e`, or `w`):\r\n *\r\n * ```ts\r\n * domElement.dataset.ckeTooltipText = 'Tooltip to the north';\r\n * domElement.dataset.ckeTooltipPosition = 'n';\r\n * ```\r\n *\r\n * # Disabling tooltips\r\n *\r\n * In order to disable the tooltip  temporarily, use the `data-cke-tooltip-disabled` attribute:\r\n *\r\n * ```ts\r\n * domElement.dataset.ckeTooltipText = 'Disabled. For now.';\r\n * domElement.dataset.ckeTooltipDisabled = 'true';\r\n * ```\r\n *\r\n * # Styling tooltips\r\n *\r\n * By default, the tooltip has `.ck-tooltip` class and its text inner `.ck-tooltip__text`.\r\n *\r\n * If your tooltip requires custom styling, using `data-cke-tooltip-class` attribute will add additional class to the balloon\r\n * displaying the tooltip:\r\n *\r\n * ```ts\r\n * domElement.dataset.ckeTooltipText = 'Tooltip with a red text';\r\n * domElement.dataset.ckeTooltipClass = 'my-class';\r\n * ```\r\n *\r\n * ```css\r\n * .ck.ck-tooltip.my-class { color: red }\r\n * ```\r\n *\r\n * **Note**: This class is a singleton. All editor instances re-use the same instance loaded by\r\n * {@link module:ui/editorui/editorui~EditorUI} of the first editor.\r\n */\r\nexport default class TooltipManager extends DomEmitterMixin() {\r\n    /**\r\n     * Creates an instance of the tooltip manager.\r\n     */\r\n    constructor(editor) {\r\n        super();\r\n        /**\r\n         * Stores the reference to the DOM element the tooltip is attached to. `null` when there's no tooltip\r\n         * in the UI.\r\n         */\r\n        this._currentElementWithTooltip = null;\r\n        /**\r\n         * Stores the current tooltip position. `null` when there's no tooltip in the UI.\r\n         */\r\n        this._currentTooltipPosition = null;\r\n        /**\r\n         * An instance of the resize observer that keeps track on target element visibility,\r\n         * when it hides the tooltip should also disappear.\r\n         *\r\n         * {@link module:core/editor/editorconfig~EditorConfig#balloonToolbar configuration}.\r\n         */\r\n        this._resizeObserver = null;\r\n        TooltipManager._editors.add(editor);\r\n        // TooltipManager must be a singleton. Multiple instances would mean multiple tooltips attached\r\n        // to the same DOM element with data-cke-tooltip-* attributes.\r\n        if (TooltipManager._instance) {\r\n            return TooltipManager._instance;\r\n        }\r\n        TooltipManager._instance = this;\r\n        this.tooltipTextView = new View(editor.locale);\r\n        this.tooltipTextView.set('text', '');\r\n        this.tooltipTextView.setTemplate({\r\n            tag: 'span',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-tooltip__text'\r\n                ]\r\n            },\r\n            children: [\r\n                {\r\n                    text: this.tooltipTextView.bindTemplate.to('text')\r\n                }\r\n            ]\r\n        });\r\n        this.balloonPanelView = new BalloonPanelView(editor.locale);\r\n        this.balloonPanelView.class = BALLOON_CLASS;\r\n        this.balloonPanelView.content.add(this.tooltipTextView);\r\n        this._pinTooltipDebounced = debounce(this._pinTooltip, 600);\r\n        this.listenTo(global.document, 'mouseenter', this._onEnterOrFocus.bind(this), { useCapture: true });\r\n        this.listenTo(global.document, 'mouseleave', this._onLeaveOrBlur.bind(this), { useCapture: true });\r\n        this.listenTo(global.document, 'focus', this._onEnterOrFocus.bind(this), { useCapture: true });\r\n        this.listenTo(global.document, 'blur', this._onLeaveOrBlur.bind(this), { useCapture: true });\r\n        this.listenTo(global.document, 'scroll', this._onScroll.bind(this), { useCapture: true });\r\n        // Because this class is a singleton, its only instance is shared across all editors and connects them through the reference.\r\n        // This causes issues with the ContextWatchdog. When an error is thrown in one editor, the watchdog traverses the references\r\n        // and (because of shared tooltip manager) figures that the error affects all editors and restarts them all.\r\n        // This flag, excludes tooltip manager instance from the traversal and brings ContextWatchdog back to normal.\r\n        // More in https://github.com/ckeditor/ckeditor5/issues/12292.\r\n        this._watchdogExcluded = true;\r\n    }\r\n    /**\r\n     * Destroys the tooltip manager.\r\n     *\r\n     * **Note**: The manager singleton cannot be destroyed until all editors that use it are destroyed.\r\n     *\r\n     * @param editor The editor the manager was created for.\r\n     */\r\n    destroy(editor) {\r\n        const editorBodyViewCollection = editor.ui.view && editor.ui.view.body;\r\n        TooltipManager._editors.delete(editor);\r\n        this.stopListening(editor.ui);\r\n        // Prevent the balloon panel from being destroyed in the EditorUI#destroy() cascade. It should be destroyed along\r\n        // with the last editor only (https://github.com/ckeditor/ckeditor5/issues/12602).\r\n        if (editorBodyViewCollection && editorBodyViewCollection.has(this.balloonPanelView)) {\r\n            editorBodyViewCollection.remove(this.balloonPanelView);\r\n        }\r\n        if (!TooltipManager._editors.size) {\r\n            this._unpinTooltip();\r\n            this.balloonPanelView.destroy();\r\n            this.stopListening();\r\n            TooltipManager._instance = null;\r\n        }\r\n    }\r\n    /**\r\n     * Returns {@link #balloonPanelView} {@link module:utils/dom/position~PositioningFunction positioning functions} for a given position\r\n     * name.\r\n     *\r\n     * @param position Name of the position (`s`, `se`, `sw`, `n`, `e`, or `w`).\r\n     * @returns Positioning functions to be used by the {@link #balloonPanelView}.\r\n     */\r\n    static getPositioningFunctions(position) {\r\n        const defaultPositions = TooltipManager.defaultBalloonPositions;\r\n        return {\r\n            // South is most popular. We can use positioning heuristics to avoid clipping by the viewport with the sane fallback.\r\n            s: [\r\n                defaultPositions.southArrowNorth,\r\n                defaultPositions.southArrowNorthEast,\r\n                defaultPositions.southArrowNorthWest\r\n            ],\r\n            n: [defaultPositions.northArrowSouth],\r\n            e: [defaultPositions.eastArrowWest],\r\n            w: [defaultPositions.westArrowEast],\r\n            sw: [defaultPositions.southArrowNorthEast],\r\n            se: [defaultPositions.southArrowNorthWest]\r\n        }[position];\r\n    }\r\n    /**\r\n     * Handles displaying tooltips on `mouseenter` and `focus` in DOM.\r\n     *\r\n     * @param evt An object containing information about the fired event.\r\n     * @param domEvent The DOM event.\r\n     */\r\n    _onEnterOrFocus(evt, { target }) {\r\n        const elementWithTooltipAttribute = getDescendantWithTooltip(target);\r\n        // Abort when there's no descendant needing tooltip.\r\n        if (!elementWithTooltipAttribute) {\r\n            return;\r\n        }\r\n        // Abort to avoid flashing when, for instance:\r\n        // * a tooltip is displayed for a focused element, then the same element gets mouseentered,\r\n        // * a tooltip is displayed for an element via mouseenter, then the focus moves to the same element.\r\n        if (elementWithTooltipAttribute === this._currentElementWithTooltip) {\r\n            return;\r\n        }\r\n        this._unpinTooltip();\r\n        this._pinTooltipDebounced(elementWithTooltipAttribute, getTooltipData(elementWithTooltipAttribute));\r\n    }\r\n    /**\r\n     * Handles hiding tooltips on `mouseleave` and `blur` in DOM.\r\n     *\r\n     * @param evt An object containing information about the fired event.\r\n     * @param domEvent The DOM event.\r\n     */\r\n    _onLeaveOrBlur(evt, { target, relatedTarget }) {\r\n        if (evt.name === 'mouseleave') {\r\n            // Don't act when the event does not concern a DOM element (e.g. a mouseleave out of an entire document),\r\n            if (!isElement(target)) {\r\n                return;\r\n            }\r\n            // If a tooltip is currently visible, don't act for a targets other than the one it is attached to.\r\n            // For instance, a random mouseleave far away in the page should not unpin the tooltip that was pinned because\r\n            // of a previous focus. Only leaving the same element should hide the tooltip.\r\n            if (this._currentElementWithTooltip && target !== this._currentElementWithTooltip) {\r\n                return;\r\n            }\r\n            const descendantWithTooltip = getDescendantWithTooltip(target);\r\n            const relatedDescendantWithTooltip = getDescendantWithTooltip(relatedTarget);\r\n            // Unpin when the mouse was leaving element with a tooltip to a place which does not have or has a different tooltip.\r\n            // Note that this should happen whether the tooltip is already visible or not, for instance, it could be invisible but queued\r\n            // (debounced): it should get canceled.\r\n            if (descendantWithTooltip && descendantWithTooltip !== relatedDescendantWithTooltip) {\r\n                this._unpinTooltip();\r\n            }\r\n        }\r\n        else {\r\n            // If a tooltip is currently visible, don't act for a targets other than the one it is attached to.\r\n            // For instance, a random blur in the web page should not unpin the tooltip that was pinned because of a previous mouseenter.\r\n            if (this._currentElementWithTooltip && target !== this._currentElementWithTooltip) {\r\n                return;\r\n            }\r\n            // Note that unpinning should happen whether the tooltip is already visible or not, for instance, it could be invisible but\r\n            // queued (debounced): it should get canceled (e.g. quick focus then quick blur using the keyboard).\r\n            this._unpinTooltip();\r\n        }\r\n    }\r\n    /**\r\n     * Handles hiding tooltips on `scroll` in DOM.\r\n     *\r\n     * @param evt An object containing information about the fired event.\r\n     * @param domEvent The DOM event.\r\n     */\r\n    _onScroll(evt, { target }) {\r\n        // No tooltip, no reason to react on scroll.\r\n        if (!this._currentElementWithTooltip) {\r\n            return;\r\n        }\r\n        // When scrolling a container that has both the balloon and the current element (common ancestor), the balloon can remain\r\n        // visible (e.g. scrolling ≤body>). Otherwise, to avoid glitches (clipping, lagging) better just hide the tooltip.\r\n        // Also, don't do anything when scrolling an unrelated DOM element that has nothing to do with the current element and the balloon.\r\n        if (target.contains(this.balloonPanelView.element) && target.contains(this._currentElementWithTooltip)) {\r\n            return;\r\n        }\r\n        this._unpinTooltip();\r\n    }\r\n    /**\r\n     * Pins the tooltip to a specific DOM element.\r\n     *\r\n     * @param options.text Text of the tooltip to display.\r\n     * @param options.position The position of the tooltip.\r\n     * @param options.cssClass Additional CSS class of the balloon with the tooltip.\r\n     */\r\n    _pinTooltip(targetDomElement, { text, position, cssClass }) {\r\n        // Use the body collection of the first editor.\r\n        const bodyViewCollection = first(TooltipManager._editors.values()).ui.view.body;\r\n        if (!bodyViewCollection.has(this.balloonPanelView)) {\r\n            bodyViewCollection.add(this.balloonPanelView);\r\n        }\r\n        this.tooltipTextView.text = text;\r\n        this.balloonPanelView.pin({\r\n            target: targetDomElement,\r\n            positions: TooltipManager.getPositioningFunctions(position)\r\n        });\r\n        this._resizeObserver = new ResizeObserver(targetDomElement, () => {\r\n            // The ResizeObserver will call its callback when the target element hides and the tooltip\r\n            // should also disappear (https://github.com/ckeditor/ckeditor5/issues/12492).\r\n            if (!isVisible(targetDomElement)) {\r\n                this._unpinTooltip();\r\n            }\r\n        });\r\n        this.balloonPanelView.class = [BALLOON_CLASS, cssClass]\r\n            .filter(className => className)\r\n            .join(' ');\r\n        // Start responding to changes in editor UI or content layout. For instance, when collaborators change content\r\n        // and a contextual toolbar attached to a content starts to move (and so should move the tooltip).\r\n        // Note: Using low priority to let other listeners that position contextual toolbars etc. to react first.\r\n        for (const editor of TooltipManager._editors) {\r\n            this.listenTo(editor.ui, 'update', this._updateTooltipPosition.bind(this), { priority: 'low' });\r\n        }\r\n        this._currentElementWithTooltip = targetDomElement;\r\n        this._currentTooltipPosition = position;\r\n    }\r\n    /**\r\n     * Unpins the tooltip and cancels all queued pinning.\r\n     */\r\n    _unpinTooltip() {\r\n        this._pinTooltipDebounced.cancel();\r\n        this.balloonPanelView.unpin();\r\n        for (const editor of TooltipManager._editors) {\r\n            this.stopListening(editor.ui, 'update');\r\n        }\r\n        this._currentElementWithTooltip = null;\r\n        this._currentTooltipPosition = null;\r\n        if (this._resizeObserver) {\r\n            this._resizeObserver.destroy();\r\n        }\r\n    }\r\n    /**\r\n     * Updates the position of the tooltip so it stays in sync with the element it is pinned to.\r\n     *\r\n     * Hides the tooltip when the element is no longer visible in DOM.\r\n     */\r\n    _updateTooltipPosition() {\r\n        // This could happen if the tooltip was attached somewhere in a contextual content toolbar and the toolbar\r\n        // disappeared (e.g. removed an image).\r\n        if (!isVisible(this._currentElementWithTooltip)) {\r\n            this._unpinTooltip();\r\n            return;\r\n        }\r\n        this.balloonPanelView.pin({\r\n            target: this._currentElementWithTooltip,\r\n            positions: TooltipManager.getPositioningFunctions(this._currentTooltipPosition)\r\n        });\r\n    }\r\n}\r\n/**\r\n * A set of default {@link module:utils/dom/position~PositioningFunction positioning functions} used by the `TooltipManager`\r\n * to pin tooltips in different positions.\r\n */\r\nTooltipManager.defaultBalloonPositions = generatePositions({\r\n    heightOffset: 5,\r\n    sideOffset: 13\r\n});\r\n/**\r\n * A set of editors the single tooltip manager instance must listen to.\r\n * This is mostly to handle `EditorUI#update` listeners from individual editors.\r\n */\r\nTooltipManager._editors = new Set();\r\n/**\r\n * A reference to the `TooltipManager` instance. The class is a singleton and as such,\r\n * successive attempts at creating instances should return this instance.\r\n */\r\nTooltipManager._instance = null;\r\nfunction getDescendantWithTooltip(element) {\r\n    if (!isElement(element)) {\r\n        return null;\r\n    }\r\n    return element.closest('[data-cke-tooltip-text]:not([data-cke-tooltip-disabled])');\r\n}\r\nfunction getTooltipData(element) {\r\n    return {\r\n        text: element.dataset.ckeTooltipText,\r\n        position: (element.dataset.ckeTooltipPosition || 's'),\r\n        cssClass: element.dataset.ckeTooltipClass || ''\r\n    };\r\n}\r\n","import debounce from './debounce.js';\nimport isObject from './isObject.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n *  Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n *  Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n  var leading = true,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  if (isObject(options)) {\n    leading = 'leading' in options ? !!options.leading : leading;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n  return debounce(func, wait, {\n    'leading': leading,\n    'maxWait': wait,\n    'trailing': trailing\n  });\n}\n\nexport default throttle;\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Rect, DomEmitterMixin, findClosestScrollableAncestor, verifyLicense } from '@ckeditor/ckeditor5-utils';\r\nimport BalloonPanelView from '../panel/balloon/balloonpanelview';\r\nimport IconView from '../icon/iconview';\r\nimport View from '../view';\r\nimport { throttle } from 'lodash-es';\r\nimport poweredByIcon from '../../theme/icons/project-logo.svg';\r\nconst ICON_WIDTH = 53;\r\nconst ICON_HEIGHT = 10;\r\n// ⚠ Note, whenever changing the threshold, make sure to update the docs/support/managing-ckeditor-logo.md docs\r\n// as this information is also mentioned there ⚠.\r\nconst NARROW_ROOT_HEIGHT_THRESHOLD = 50;\r\nconst NARROW_ROOT_WIDTH_THRESHOLD = 350;\r\nconst DEFAULT_LABEL = 'Powered by';\r\nconst OFF_THE_SCREEN_POSITION = {\r\n    top: -99999,\r\n    left: -99999,\r\n    name: 'invalid',\r\n    config: {\r\n        withArrow: false\r\n    }\r\n};\r\n/**\r\n * A helper that enables the \"powered by\" feature in the editor and renders a link to the project's\r\n * webpage next to the bottom of the editable element (editor root, source editing area, etc.) when the editor is focused.\r\n *\r\n * @private\r\n */\r\nexport default class PoweredBy extends DomEmitterMixin() {\r\n    /**\r\n     * Creates a \"powered by\" helper for a given editor. The feature is initialized on Editor#ready\r\n     * event.\r\n     *\r\n     * @param editor\r\n     */\r\n    constructor(editor) {\r\n        super();\r\n        this.editor = editor;\r\n        this._balloonView = null;\r\n        this._lastFocusedEditableElement = null;\r\n        this._showBalloonThrottled = throttle(this._showBalloon.bind(this), 50, { leading: true });\r\n        editor.on('ready', this._handleEditorReady.bind(this));\r\n    }\r\n    /**\r\n     * Destroys the \"powered by\" helper along with its view.\r\n     */\r\n    destroy() {\r\n        const balloon = this._balloonView;\r\n        if (balloon) {\r\n            // Balloon gets destroyed by the body collection.\r\n            // The powered by view gets destroyed by the balloon.\r\n            balloon.unpin();\r\n            this._balloonView = null;\r\n        }\r\n        this._showBalloonThrottled.cancel();\r\n        this.stopListening();\r\n    }\r\n    /**\r\n     * Enables \"powered by\" label once the editor (ui) is ready.\r\n     */\r\n    _handleEditorReady() {\r\n        const editor = this.editor;\r\n        const forceVisible = !!editor.config.get('ui.poweredBy.forceVisible');\r\n        /* istanbul ignore next -- @preserve */\r\n        if (!forceVisible && verifyLicense(editor.config.get('licenseKey')) === 'VALID') {\r\n            return;\r\n        }\r\n        // No view means no body collection to append the powered by balloon to.\r\n        if (!editor.ui.view) {\r\n            return;\r\n        }\r\n        editor.ui.focusTracker.on('change:isFocused', (evt, data, isFocused) => {\r\n            this._updateLastFocusedEditableElement();\r\n            if (isFocused) {\r\n                this._showBalloon();\r\n            }\r\n            else {\r\n                this._hideBalloon();\r\n            }\r\n        });\r\n        editor.ui.focusTracker.on('change:focusedElement', (evt, data, focusedElement) => {\r\n            this._updateLastFocusedEditableElement();\r\n            if (focusedElement) {\r\n                this._showBalloon();\r\n            }\r\n        });\r\n        editor.ui.on('update', () => {\r\n            this._showBalloonThrottled();\r\n        });\r\n    }\r\n    /**\r\n     * Creates an instance of the {@link module:ui/panel/balloon/balloonpanelview~BalloonPanelView balloon panel}\r\n     * with the \"powered by\" view inside ready for positioning.\r\n     */\r\n    _createBalloonView() {\r\n        const editor = this.editor;\r\n        const balloon = this._balloonView = new BalloonPanelView();\r\n        const poweredByConfig = getNormalizedConfig(editor);\r\n        const view = new PoweredByView(editor.locale, poweredByConfig.label);\r\n        balloon.content.add(view);\r\n        balloon.set({\r\n            class: 'ck-powered-by-balloon'\r\n        });\r\n        editor.ui.view.body.add(balloon);\r\n        editor.ui.focusTracker.add(balloon.element);\r\n        this._balloonView = balloon;\r\n    }\r\n    /**\r\n     * Attempts to display the balloon with the \"powered by\" view.\r\n     */\r\n    _showBalloon() {\r\n        if (!this._lastFocusedEditableElement) {\r\n            return;\r\n        }\r\n        const attachOptions = getBalloonAttachOptions(this.editor, this._lastFocusedEditableElement);\r\n        if (attachOptions) {\r\n            if (!this._balloonView) {\r\n                this._createBalloonView();\r\n            }\r\n            this._balloonView.pin(attachOptions);\r\n        }\r\n    }\r\n    /**\r\n     * Hides the \"powered by\" balloon if already visible.\r\n     */\r\n    _hideBalloon() {\r\n        if (this._balloonView) {\r\n            this._balloonView.unpin();\r\n        }\r\n    }\r\n    /**\r\n     * Updates the {@link #_lastFocusedEditableElement} based on the state of the global focus tracker.\r\n     */\r\n    _updateLastFocusedEditableElement() {\r\n        const editor = this.editor;\r\n        const isFocused = editor.ui.focusTracker.isFocused;\r\n        const focusedElement = editor.ui.focusTracker.focusedElement;\r\n        if (!isFocused || !focusedElement) {\r\n            this._lastFocusedEditableElement = null;\r\n            return;\r\n        }\r\n        const editableEditorElements = Array.from(editor.ui.getEditableElementsNames()).map(name => {\r\n            return editor.ui.getEditableElement(name);\r\n        });\r\n        if (editableEditorElements.includes(focusedElement)) {\r\n            this._lastFocusedEditableElement = focusedElement;\r\n        }\r\n        else {\r\n            // If it's none of the editable element, then the focus is somewhere in the UI. Let's display powered by\r\n            // over the first element then.\r\n            this._lastFocusedEditableElement = editableEditorElements[0];\r\n        }\r\n    }\r\n}\r\n/**\r\n * A view displaying a \"powered by\" label and project logo wrapped in a link.\r\n */\r\nclass PoweredByView extends View {\r\n    /**\r\n     * Created an instance of the \"powered by\" view.\r\n     *\r\n     * @param locale The localization services instance.\r\n     * @param label The label text.\r\n     */\r\n    constructor(locale, label) {\r\n        super(locale);\r\n        const iconView = new IconView();\r\n        const bind = this.bindTemplate;\r\n        iconView.set({\r\n            content: poweredByIcon,\r\n            isColorInherited: false\r\n        });\r\n        iconView.extendTemplate({\r\n            attributes: {\r\n                style: {\r\n                    width: ICON_WIDTH + 'px',\r\n                    height: ICON_HEIGHT + 'px'\r\n                }\r\n            }\r\n        });\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: ['ck', 'ck-powered-by'],\r\n                'aria-hidden': true\r\n            },\r\n            children: [\r\n                {\r\n                    tag: 'a',\r\n                    attributes: {\r\n                        href: 'https://ckeditor.com/?utm_source=ckeditor&' +\r\n                            'utm_medium=referral&utm_campaign=701Dn000000hVgmIAE_powered_by_ckeditor_logo',\r\n                        target: '_blank',\r\n                        tabindex: '-1'\r\n                    },\r\n                    children: [\r\n                        ...label ? [\r\n                            {\r\n                                tag: 'span',\r\n                                attributes: {\r\n                                    class: ['ck', 'ck-powered-by__label']\r\n                                },\r\n                                children: [label]\r\n                            }\r\n                        ] : [],\r\n                        iconView\r\n                    ],\r\n                    on: {\r\n                        dragstart: bind.to(evt => evt.preventDefault())\r\n                    }\r\n                }\r\n            ]\r\n        });\r\n    }\r\n}\r\nfunction getBalloonAttachOptions(editor, focusedEditableElement) {\r\n    const poweredByConfig = getNormalizedConfig(editor);\r\n    const positioningFunction = poweredByConfig.side === 'right' ?\r\n        getLowerRightCornerPosition(focusedEditableElement, poweredByConfig) :\r\n        getLowerLeftCornerPosition(focusedEditableElement, poweredByConfig);\r\n    return {\r\n        target: focusedEditableElement,\r\n        positions: [positioningFunction]\r\n    };\r\n}\r\nfunction getLowerRightCornerPosition(focusedEditableElement, config) {\r\n    return getLowerCornerPosition(focusedEditableElement, config, (rootRect, balloonRect) => {\r\n        return rootRect.left + rootRect.width - balloonRect.width - config.horizontalOffset;\r\n    });\r\n}\r\nfunction getLowerLeftCornerPosition(focusedEditableElement, config) {\r\n    return getLowerCornerPosition(focusedEditableElement, config, rootRect => rootRect.left + config.horizontalOffset);\r\n}\r\nfunction getLowerCornerPosition(focusedEditableElement, config, getBalloonLeft) {\r\n    return (editableElementRect, balloonRect) => {\r\n        const visibleEditableElementRect = editableElementRect.getVisible();\r\n        // Root cropped by ancestors.\r\n        if (!visibleEditableElementRect) {\r\n            return OFF_THE_SCREEN_POSITION;\r\n        }\r\n        if (editableElementRect.width < NARROW_ROOT_WIDTH_THRESHOLD || editableElementRect.height < NARROW_ROOT_HEIGHT_THRESHOLD) {\r\n            return OFF_THE_SCREEN_POSITION;\r\n        }\r\n        let balloonTop;\r\n        if (config.position === 'inside') {\r\n            balloonTop = editableElementRect.bottom - balloonRect.height;\r\n        }\r\n        else {\r\n            balloonTop = editableElementRect.bottom - balloonRect.height / 2;\r\n        }\r\n        balloonTop -= config.verticalOffset;\r\n        const balloonLeft = getBalloonLeft(editableElementRect, balloonRect);\r\n        if (config.position === 'inside') {\r\n            const newBalloonRect = balloonRect.clone().moveTo(balloonLeft, balloonTop);\r\n            // The watermark cannot be positioned in this corner because the corner is not quite visible.\r\n            if (newBalloonRect.getIntersectionArea(visibleEditableElementRect) < newBalloonRect.getArea()) {\r\n                return OFF_THE_SCREEN_POSITION;\r\n            }\r\n        }\r\n        else {\r\n            const firstScrollableEditableElementAncestor = findClosestScrollableAncestor(focusedEditableElement);\r\n            if (firstScrollableEditableElementAncestor) {\r\n                const firstScrollableEditableElementAncestorRect = new Rect(firstScrollableEditableElementAncestor);\r\n                // The watermark cannot be positioned in this corner because the corner is \"not visible enough\".\r\n                if (visibleEditableElementRect.bottom + balloonRect.height / 2 > firstScrollableEditableElementAncestorRect.bottom) {\r\n                    return OFF_THE_SCREEN_POSITION;\r\n                }\r\n            }\r\n        }\r\n        return {\r\n            top: balloonTop,\r\n            left: balloonLeft,\r\n            name: `position_${config.position}-side_${config.side}`,\r\n            config: {\r\n                withArrow: false\r\n            }\r\n        };\r\n    };\r\n}\r\nfunction getNormalizedConfig(editor) {\r\n    const userConfig = editor.config.get('ui.poweredBy');\r\n    const position = userConfig && userConfig.position || 'border';\r\n    return {\r\n        position,\r\n        label: DEFAULT_LABEL,\r\n        verticalOffset: position === 'inside' ? 5 : 0,\r\n        horizontalOffset: 5,\r\n        side: editor.locale.contentLanguageDirection === 'ltr' ? 'right' : 'left',\r\n        ...userConfig\r\n    };\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/verifylicense\r\n */\r\nimport { releaseDate } from './version';\r\n/**\r\n * Checks whether the given string contains information that allows you to verify the license status.\r\n *\r\n * @param token The string to check.\r\n * @returns String that represents the state of given `token` parameter.\r\n */\r\nexport default function verifyLicense(token) {\r\n    // This function implements naive and partial license key check mechanism,\r\n    // used only to decide whether to show or hide the \"Powered by CKEditor\" logo.\r\n    //\r\n    // You can read the reasoning behind showing the logo to unlicensed (GPL) users\r\n    // in this thread: https://github.com/ckeditor/ckeditor5/issues/14082.\r\n    //\r\n    // We firmly believe in the values behind creating open-source software, even when that\r\n    // means keeping the license verification logic open for everyone to see.\r\n    //\r\n    // Please keep this code intact. Thank you for your understanding.\r\n    function oldTokenCheck(token) {\r\n        if (token.length >= 40 && token.length <= 255) {\r\n            return 'VALID';\r\n        }\r\n        else {\r\n            return 'INVALID';\r\n        }\r\n    }\r\n    // TODO: issue ci#3175\r\n    if (!token) {\r\n        return 'INVALID';\r\n    }\r\n    let decryptedData = '';\r\n    try {\r\n        decryptedData = atob(token);\r\n    }\r\n    catch (e) {\r\n        return 'INVALID';\r\n    }\r\n    const splittedDecryptedData = decryptedData.split('-');\r\n    const firstElement = splittedDecryptedData[0];\r\n    const secondElement = splittedDecryptedData[1];\r\n    if (!secondElement) {\r\n        return oldTokenCheck(token);\r\n    }\r\n    try {\r\n        atob(secondElement);\r\n    }\r\n    catch (e) {\r\n        try {\r\n            atob(firstElement);\r\n            if (!atob(firstElement).length) {\r\n                return oldTokenCheck(token);\r\n            }\r\n        }\r\n        catch (e) {\r\n            return oldTokenCheck(token);\r\n        }\r\n    }\r\n    if (firstElement.length < 40 || firstElement.length > 255) {\r\n        return 'INVALID';\r\n    }\r\n    let decryptedSecondElement = '';\r\n    try {\r\n        atob(firstElement);\r\n        decryptedSecondElement = atob(secondElement);\r\n    }\r\n    catch (e) {\r\n        return 'INVALID';\r\n    }\r\n    if (decryptedSecondElement.length !== 8) {\r\n        return 'INVALID';\r\n    }\r\n    const year = Number(decryptedSecondElement.substring(0, 4));\r\n    const monthIndex = Number(decryptedSecondElement.substring(4, 6)) - 1;\r\n    const day = Number(decryptedSecondElement.substring(6, 8));\r\n    const date = new Date(year, monthIndex, day);\r\n    if (date < releaseDate || isNaN(Number(date))) {\r\n        return 'INVALID';\r\n    }\r\n    return 'VALID';\r\n}\r\n","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"53\\\" height=\\\"10\\\" viewBox=\\\"0 0 53 10\\\"><path fill=\\\"#1C2331\\\" d=\\\"M31.724 1.492a15.139 15.139 0 0 0 .045 1.16 2.434 2.434 0 0 0-.687-.34 3.68 3.68 0 0 0-1.103-.166 2.332 2.332 0 0 0-1.14.255 1.549 1.549 0 0 0-.686.87c-.15.41-.225.98-.225 1.712 0 .939.148 1.659.444 2.161.297.503.792.754 1.487.754.452.015.9-.094 1.294-.316.296-.174.557-.4.771-.669l.14.852h1.282V.007h-1.623v1.485ZM31 6.496a1.77 1.77 0 0 1-.494.061.964.964 0 0 1-.521-.127.758.758 0 0 1-.296-.466 3.984 3.984 0 0 1-.093-.992 4.208 4.208 0 0 1 .098-1.052.753.753 0 0 1 .307-.477 1.08 1.08 0 0 1 .55-.122c.233-.004.466.026.69.089l.483.144v2.553c-.11.076-.213.143-.307.2a1.73 1.73 0 0 1-.417.189ZM35.68 0l-.702.004c-.322.002-.482.168-.48.497l.004.581c.002.33.164.493.486.49l.702-.004c.322-.002.481-.167.48-.496L36.165.49c-.002-.33-.164-.493-.486-.491ZM36.145 2.313l-1.612.01.034 5.482 1.613-.01-.035-5.482ZM39.623.79 37.989.8 38 2.306l-.946.056.006 1.009.949-.006.024 2.983c.003.476.143.844.419 1.106.275.26.658.39 1.148.387.132 0 .293-.01.483-.03.19-.02.38-.046.57-.08.163-.028.324-.068.482-.119l-.183-1.095-.702.004a.664.664 0 0 1-.456-.123.553.553 0 0 1-.14-.422l-.016-2.621 1.513-.01-.006-1.064-1.514.01-.01-1.503ZM46.226 2.388c-.41-.184-.956-.274-1.636-.27-.673.004-1.215.101-1.627.29-.402.179-.72.505-.888.91-.18.419-.268.979-.264 1.68.004.688.1 1.24.285 1.655.172.404.495.724.9.894.414.18.957.268 1.63.264.68-.004 1.224-.099 1.632-.284.4-.176.714-.501.878-.905.176-.418.263-.971.258-1.658-.004-.702-.097-1.261-.28-1.677a1.696 1.696 0 0 0-.888-.9Zm-.613 3.607a.77.77 0 0 1-.337.501 1.649 1.649 0 0 1-1.317.009.776.776 0 0 1-.343-.497 4.066 4.066 0 0 1-.105-1.02 4.136 4.136 0 0 1 .092-1.03.786.786 0 0 1 .337-.507 1.59 1.59 0 0 1 1.316-.008.79.79 0 0 1 .344.502c.078.337.113.683.105 1.03.012.343-.019.685-.092 1.02ZM52.114 2.07a2.67 2.67 0 0 0-1.128.278c-.39.191-.752.437-1.072.73l-.157-.846-1.273.008.036 5.572 1.623-.01-.024-3.78c.35-.124.646-.22.887-.286.26-.075.53-.114.8-.118l.45-.003.144-1.546-.286.001ZM22.083 7.426l-1.576-2.532a2.137 2.137 0 0 0-.172-.253 1.95 1.95 0 0 0-.304-.29.138.138 0 0 1 .042-.04 1.7 1.7 0 0 0 .328-.374l1.75-2.71c.01-.015.025-.028.024-.048-.01-.01-.021-.007-.031-.007L20.49 1.17a.078.078 0 0 0-.075.045l-.868 1.384c-.23.366-.46.732-.688 1.099a.108.108 0 0 1-.112.06c-.098-.005-.196-.001-.294-.002-.018 0-.038.006-.055-.007.002-.02.002-.039.005-.058a4.6 4.6 0 0 0 .046-.701V1.203c0-.02-.009-.032-.03-.03h-.033L16.93 1.17c-.084 0-.073-.01-.073.076v6.491c-.001.018.006.028.025.027h1.494c.083 0 .072.007.072-.071v-2.19c0-.055-.003-.11-.004-.166a3.366 3.366 0 0 0-.05-.417h.06c.104 0 .209.002.313-.002a.082.082 0 0 1 .084.05c.535.913 1.07 1.824 1.607 2.736a.104.104 0 0 0 .103.062c.554-.003 1.107-.002 1.66-.002l.069-.003-.019-.032-.188-.304ZM27.112 6.555c-.005-.08-.004-.08-.082-.08h-2.414c-.053 0-.106-.003-.159-.011a.279.279 0 0 1-.246-.209.558.558 0 0 1-.022-.15c0-.382 0-.762-.002-1.143 0-.032.007-.049.042-.044h2.504c.029.003.037-.012.034-.038V3.814c0-.089.013-.078-.076-.078h-2.44c-.07 0-.062.003-.062-.06v-.837c0-.047.004-.093.013-.14a.283.283 0 0 1 .241-.246.717.717 0 0 1 .146-.011h2.484c.024.002.035-.009.036-.033l.003-.038.03-.496c.01-.183.024-.365.034-.548.005-.085.003-.087-.082-.094-.218-.018-.437-.038-.655-.05a17.845 17.845 0 0 0-.657-.026 72.994 72.994 0 0 0-1.756-.016 1.7 1.7 0 0 0-.471.064 1.286 1.286 0 0 0-.817.655c-.099.196-.149.413-.145.633v3.875c0 .072.003.144.011.216a1.27 1.27 0 0 0 .711 1.029c.228.113.48.167.734.158.757-.005 1.515.002 2.272-.042.274-.016.548-.034.82-.053.03-.002.043-.008.04-.041-.008-.104-.012-.208-.019-.312a69.964 69.964 0 0 1-.05-.768ZM16.14 7.415l-.127-1.075c-.004-.03-.014-.04-.044-.037a13.125 13.125 0 0 1-.998.073c-.336.01-.672.02-1.008.016-.116-.001-.233-.014-.347-.039a.746.746 0 0 1-.45-.262c-.075-.1-.132-.211-.167-.33a3.324 3.324 0 0 1-.126-.773 9.113 9.113 0 0 1-.015-.749c0-.285.022-.57.065-.852.023-.158.066-.312.127-.46a.728.728 0 0 1 .518-.443 1.64 1.64 0 0 1 .397-.048c.628-.001 1.255.003 1.882.05.022.001.033-.006.036-.026l.003-.031.06-.55c.019-.177.036-.355.057-.532.004-.034-.005-.046-.04-.056a5.595 5.595 0 0 0-1.213-.21 10.783 10.783 0 0 0-.708-.02c-.24-.003-.48.01-.719.041a3.477 3.477 0 0 0-.625.14 1.912 1.912 0 0 0-.807.497c-.185.2-.33.433-.424.688a4.311 4.311 0 0 0-.24 1.096c-.031.286-.045.572-.042.86-.006.43.024.86.091 1.286.04.25.104.497.193.734.098.279.26.53.473.734.214.205.473.358.756.446.344.11.702.17 1.063.177a8.505 8.505 0 0 0 1.578-.083 6.11 6.11 0 0 0 .766-.18c.03-.008.047-.023.037-.057a.157.157 0 0 1-.003-.025Z\\\"/><path fill=\\\"#AFE229\\\" d=\\\"M6.016 6.69a1.592 1.592 0 0 0-.614.21c-.23.132-.422.32-.56.546-.044.072-.287.539-.287.539l-.836 1.528.009.006c.038.025.08.046.123.063.127.046.26.07.395.073.505.023 1.011-.007 1.517-.003.29.009.58.002.869-.022a.886.886 0 0 0 .395-.116.962.962 0 0 0 .312-.286c.056-.083.114-.163.164-.249.24-.408.48-.816.718-1.226.075-.128.148-.257.222-.386l.112-.192a1.07 1.07 0 0 0 .153-.518l-1.304.023s-1.258-.005-1.388.01Z\\\"/><path fill=\\\"#771BFF\\\" d=\\\"m2.848 9.044.76-1.39.184-.352c-.124-.067-.245-.14-.367-.21-.346-.204-.706-.384-1.045-.6a.984.984 0 0 1-.244-.207c-.108-.134-.136-.294-.144-.46-.021-.409-.002-.818-.009-1.227-.003-.195 0-.39.003-.585.004-.322.153-.553.427-.713l.833-.488c.22-.13.44-.257.662-.385.05-.029.105-.052.158-.077.272-.128.519-.047.76.085l.044.028c.123.06.242.125.358.196.318.178.635.357.952.537.095.056.187.117.275.184.194.144.254.35.266.578.016.284.007.569.006.853-.001.28.004.558 0 .838.592-.003 1.259 0 1.259 0l.723-.013c-.003-.292-.007-.584-.007-.876 0-.524.015-1.048-.016-1.571-.024-.42-.135-.8-.492-1.067a5.02 5.02 0 0 0-.506-.339A400.52 400.52 0 0 0 5.94.787C5.722.664 5.513.524 5.282.423 5.255.406 5.228.388 5.2.373 4.758.126 4.305-.026 3.807.21c-.097.046-.197.087-.29.14A699.896 699.896 0 0 0 .783 1.948c-.501.294-.773.717-.778 1.31-.004.36-.009.718-.001 1.077.016.754-.017 1.508.024 2.261.016.304.07.6.269.848.127.15.279.28.448.382.622.4 1.283.734 1.92 1.11l.183.109Z\\\"/></svg>\\n\";","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module utils/dom/findclosestscrollableancestor\r\n */\r\nimport global from './global';\r\n/**\r\n * Returns the closest scrollable ancestor of a DOM element.\r\n *\r\n * @param domElement DOM element.\r\n * @returns First ancestor of `domElement` that is scrollable or null if such ancestor doesn't exist.\r\n */\r\nexport default function findClosestScrollableAncestor(domElement) {\r\n    let element = domElement.parentElement;\r\n    if (!element) {\r\n        return null;\r\n    }\r\n    while (element.tagName != 'BODY') {\r\n        const overflow = element.style.overflowY || global.window.getComputedStyle(element).overflowY;\r\n        if (overflow === 'auto' || overflow === 'scroll') {\r\n            break;\r\n        }\r\n        element = element.parentElement;\r\n        if (!element) {\r\n            return null;\r\n        }\r\n    }\r\n    return element;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/editorui/editorui\r\n */\r\n/* globals console */\r\nimport ComponentFactory from '../componentfactory';\r\nimport TooltipManager from '../tooltipmanager';\r\nimport PoweredBy from './poweredby';\r\nimport { ObservableMixin, isVisible, FocusTracker } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * A class providing the minimal interface that is required to successfully bootstrap any editor UI.\r\n */\r\nexport default class EditorUI extends ObservableMixin() {\r\n    /**\r\n     * Creates an instance of the editor UI class.\r\n     *\r\n     * @param editor The editor instance.\r\n     */\r\n    constructor(editor) {\r\n        super();\r\n        /**\r\n         * Indicates the UI is ready. Set `true` after {@link #event:ready} event is fired.\r\n         *\r\n         * @readonly\r\n         * @default false\r\n         */\r\n        this.isReady = false;\r\n        /**\r\n         * Stores all editable elements used by the editor instance.\r\n         */\r\n        this._editableElementsMap = new Map();\r\n        /**\r\n         * All available & focusable toolbars.\r\n         */\r\n        this._focusableToolbarDefinitions = [];\r\n        const editingView = editor.editing.view;\r\n        this.editor = editor;\r\n        this.componentFactory = new ComponentFactory(editor);\r\n        this.focusTracker = new FocusTracker();\r\n        this.tooltipManager = new TooltipManager(editor);\r\n        this.poweredBy = new PoweredBy(editor);\r\n        this.set('viewportOffset', this._readViewportOffsetFromConfig());\r\n        this.once('ready', () => {\r\n            this.isReady = true;\r\n        });\r\n        // Informs UI components that should be refreshed after layout change.\r\n        this.listenTo(editingView.document, 'layoutChanged', this.update.bind(this));\r\n        this.listenTo(editingView, 'scrollToTheSelection', this._handleScrollToTheSelection.bind(this));\r\n        this._initFocusTracking();\r\n    }\r\n    /**\r\n     * The main (outermost) DOM element of the editor UI.\r\n     *\r\n     * For example, in {@link module:editor-classic/classiceditor~ClassicEditor} it is a `<div>` which\r\n     * wraps the editable element and the toolbar. In {@link module:editor-inline/inlineeditor~InlineEditor}\r\n     * it is the editable element itself (as there is no other wrapper). However, in\r\n     * {@link module:editor-decoupled/decouplededitor~DecoupledEditor} it is set to `null` because this editor does not\r\n     * come with a single \"main\" HTML element (its editable element and toolbar are separate).\r\n     *\r\n     * This property can be understood as a shorthand for retrieving the element that a specific editor integration\r\n     * considers to be its main DOM element.\r\n     */\r\n    get element() {\r\n        return null;\r\n    }\r\n    /**\r\n     * Fires the {@link module:ui/editorui/editorui~EditorUI#event:update `update`} event.\r\n     *\r\n     * This method should be called when the editor UI (e.g. positions of its balloons) needs to be updated due to\r\n     * some environmental change which CKEditor 5 is not aware of (e.g. resize of a container in which it is used).\r\n     */\r\n    update() {\r\n        this.fire('update');\r\n    }\r\n    /**\r\n     * Destroys the UI.\r\n     */\r\n    destroy() {\r\n        this.stopListening();\r\n        this.focusTracker.destroy();\r\n        this.tooltipManager.destroy(this.editor);\r\n        this.poweredBy.destroy();\r\n        // Clean–up the references to the CKEditor instance stored in the native editable DOM elements.\r\n        for (const domElement of this._editableElementsMap.values()) {\r\n            domElement.ckeditorInstance = null;\r\n            this.editor.keystrokes.stopListening(domElement);\r\n        }\r\n        this._editableElementsMap = new Map();\r\n        this._focusableToolbarDefinitions = [];\r\n    }\r\n    /**\r\n     * Stores the native DOM editable element used by the editor under a unique name.\r\n     *\r\n     * Also, registers the element in the editor to maintain the accessibility of the UI. When the user is editing text in a focusable\r\n     * editable area, they can use the <kbd>Alt</kbd> + <kbd>F10</kbd> keystroke to navigate over editor toolbars. See {@link #addToolbar}.\r\n     *\r\n     * @param rootName The unique name of the editable element.\r\n     * @param domElement The native DOM editable element.\r\n     */\r\n    setEditableElement(rootName, domElement) {\r\n        this._editableElementsMap.set(rootName, domElement);\r\n        // Put a reference to the CKEditor instance in the editable native DOM element.\r\n        // It helps 3rd–party software (browser extensions, other libraries) access and recognize\r\n        // CKEditor 5 instances (editing roots) and use their API (there is no global editor\r\n        // instance registry).\r\n        if (!domElement.ckeditorInstance) {\r\n            domElement.ckeditorInstance = this.editor;\r\n        }\r\n        // Register the element, so it becomes available for Alt+F10 and Esc navigation.\r\n        this.focusTracker.add(domElement);\r\n        const setUpKeystrokeHandler = () => {\r\n            // The editing view of the editor is already listening to keystrokes from DOM roots (see: KeyObserver).\r\n            // Do not duplicate listeners.\r\n            if (this.editor.editing.view.getDomRoot(rootName)) {\r\n                return;\r\n            }\r\n            this.editor.keystrokes.listenTo(domElement);\r\n        };\r\n        // For editable elements set by features after EditorUI is ready (e.g. source editing).\r\n        if (this.isReady) {\r\n            setUpKeystrokeHandler();\r\n        }\r\n        // For editable elements set while the editor is being created (e.g. DOM roots).\r\n        else {\r\n            this.once('ready', setUpKeystrokeHandler);\r\n        }\r\n    }\r\n    /**\r\n     * Removes the editable from the editor UI. Removes all handlers added by {@link #setEditableElement}.\r\n     *\r\n     * @param rootName The name of the editable element to remove.\r\n     */\r\n    removeEditableElement(rootName) {\r\n        const domElement = this._editableElementsMap.get(rootName);\r\n        if (!domElement) {\r\n            return;\r\n        }\r\n        this._editableElementsMap.delete(rootName);\r\n        this.editor.keystrokes.stopListening(domElement);\r\n        this.focusTracker.remove(domElement);\r\n        domElement.ckeditorInstance = null;\r\n    }\r\n    /**\r\n     * Returns the editable editor element with the given name or null if editable does not exist.\r\n     *\r\n     * @param rootName The editable name.\r\n     */\r\n    getEditableElement(rootName = 'main') {\r\n        return this._editableElementsMap.get(rootName);\r\n    }\r\n    /**\r\n     * Returns array of names of all editor editable elements.\r\n     */\r\n    getEditableElementsNames() {\r\n        return this._editableElementsMap.keys();\r\n    }\r\n    /**\r\n     * Adds a toolbar to the editor UI. Used primarily to maintain the accessibility of the UI.\r\n     *\r\n     * Focusable toolbars can be accessed (focused) by users by pressing the <kbd>Alt</kbd> + <kbd>F10</kbd> keystroke.\r\n     * Successive keystroke presses navigate over available toolbars.\r\n     *\r\n     * @param toolbarView A instance of the toolbar to be registered.\r\n     */\r\n    addToolbar(toolbarView, options = {}) {\r\n        if (toolbarView.isRendered) {\r\n            this.focusTracker.add(toolbarView.element);\r\n            this.editor.keystrokes.listenTo(toolbarView.element);\r\n        }\r\n        else {\r\n            toolbarView.once('render', () => {\r\n                this.focusTracker.add(toolbarView.element);\r\n                this.editor.keystrokes.listenTo(toolbarView.element);\r\n            });\r\n        }\r\n        this._focusableToolbarDefinitions.push({ toolbarView, options });\r\n    }\r\n    /**\r\n     * Stores all editable elements used by the editor instance.\r\n     *\r\n     * @deprecated\r\n     */\r\n    get _editableElements() {\r\n        /**\r\n         * The {@link module:ui/editorui/editorui~EditorUI#_editableElements `EditorUI#_editableElements`} property has been\r\n         * deprecated and will be removed in the near future. Please use\r\n         * {@link module:ui/editorui/editorui~EditorUI#setEditableElement `setEditableElement()`} and\r\n         * {@link module:ui/editorui/editorui~EditorUI#getEditableElement `getEditableElement()`} methods instead.\r\n         *\r\n         * @error editor-ui-deprecated-editable-elements\r\n         * @param editorUI Editor UI instance the deprecated property belongs to.\r\n         */\r\n        console.warn('editor-ui-deprecated-editable-elements: ' +\r\n            'The EditorUI#_editableElements property has been deprecated and will be removed in the near future.', { editorUI: this });\r\n        return this._editableElementsMap;\r\n    }\r\n    /**\r\n     * Returns viewport offsets object:\r\n     *\r\n     * ```js\r\n     * {\r\n     * \ttop: Number,\r\n     * \tright: Number,\r\n     * \tbottom: Number,\r\n     * \tleft: Number\r\n     * }\r\n     * ```\r\n     *\r\n     * Only top property is currently supported.\r\n     */\r\n    _readViewportOffsetFromConfig() {\r\n        const editor = this.editor;\r\n        const viewportOffsetConfig = editor.config.get('ui.viewportOffset');\r\n        if (viewportOffsetConfig) {\r\n            return viewportOffsetConfig;\r\n        }\r\n        // Not present in EditorConfig type, because it's legacy. Hence the `as` expression.\r\n        const legacyOffsetConfig = editor.config.get('toolbar.viewportTopOffset');\r\n        // Fall back to deprecated toolbar config.\r\n        if (legacyOffsetConfig) {\r\n            /**\r\n             * The {@link module:core/editor/editorconfig~EditorConfig#toolbar `EditorConfig#toolbar.viewportTopOffset`}\r\n             * property has been deprecated and will be removed in the near future. Please use\r\n             * {@link module:core/editor/editorconfig~EditorConfig#ui `EditorConfig#ui.viewportOffset`} instead.\r\n             *\r\n             * @error editor-ui-deprecated-viewport-offset-config\r\n             */\r\n            console.warn('editor-ui-deprecated-viewport-offset-config: ' +\r\n                'The `toolbar.vieportTopOffset` configuration option is deprecated. ' +\r\n                'It will be removed from future CKEditor versions. Use `ui.viewportOffset.top` instead.');\r\n            return { top: legacyOffsetConfig };\r\n        }\r\n        // More keys to come in the future.\r\n        return { top: 0 };\r\n    }\r\n    /**\r\n     * Starts listening for <kbd>Alt</kbd> + <kbd>F10</kbd> and <kbd>Esc</kbd> keystrokes in the context of focusable\r\n     * {@link #setEditableElement editable elements} and {@link #addToolbar toolbars}\r\n     * to allow users navigate across the UI.\r\n     */\r\n    _initFocusTracking() {\r\n        const editor = this.editor;\r\n        const editingView = editor.editing.view;\r\n        let lastFocusedForeignElement;\r\n        let candidateDefinitions;\r\n        // Focus the next focusable toolbar on <kbd>Alt</kbd> + <kbd>F10</kbd>.\r\n        editor.keystrokes.set('Alt+F10', (data, cancel) => {\r\n            const focusedElement = this.focusTracker.focusedElement;\r\n            // Focus moved out of a DOM element that\r\n            // * is not a toolbar,\r\n            // * does not belong to the editing view (e.g. source editing).\r\n            if (Array.from(this._editableElementsMap.values()).includes(focusedElement) &&\r\n                !Array.from(editingView.domRoots.values()).includes(focusedElement)) {\r\n                lastFocusedForeignElement = focusedElement;\r\n            }\r\n            const currentFocusedToolbarDefinition = this._getCurrentFocusedToolbarDefinition();\r\n            // * When focusing a toolbar for the first time, set the array of definitions for successive presses of Alt+F10.\r\n            // This ensures, the navigation works always the same and no pair of toolbars takes over\r\n            // (e.g. image and table toolbars when a selected image is inside a cell).\r\n            // * It could be that the focus went to the toolbar by clicking a toolbar item (e.g. a dropdown). In this case,\r\n            // there were no candidates so they must be obtained (#12339).\r\n            if (!currentFocusedToolbarDefinition || !candidateDefinitions) {\r\n                candidateDefinitions = this._getFocusableCandidateToolbarDefinitions();\r\n            }\r\n            // In a single Alt+F10 press, check all candidates but if none were focused, don't go any further.\r\n            // This prevents an infinite loop.\r\n            for (let i = 0; i < candidateDefinitions.length; i++) {\r\n                const candidateDefinition = candidateDefinitions.shift();\r\n                // Put the first definition to the back of the array. This allows circular navigation over all toolbars\r\n                // on successive presses of Alt+F10.\r\n                candidateDefinitions.push(candidateDefinition);\r\n                // Don't focus the same toolbar again. If you did, this would move focus from the nth focused toolbar item back to the\r\n                // first item as per ToolbarView#focus() if the user navigated inside the toolbar.\r\n                if (candidateDefinition !== currentFocusedToolbarDefinition &&\r\n                    this._focusFocusableCandidateToolbar(candidateDefinition)) {\r\n                    // Clean up after a current visible toolbar when switching to the next one.\r\n                    if (currentFocusedToolbarDefinition && currentFocusedToolbarDefinition.options.afterBlur) {\r\n                        currentFocusedToolbarDefinition.options.afterBlur();\r\n                    }\r\n                    break;\r\n                }\r\n            }\r\n            cancel();\r\n        });\r\n        // Blur the focused toolbar on <kbd>Esc</kbd> and bring the focus back to its origin.\r\n        editor.keystrokes.set('Esc', (data, cancel) => {\r\n            const focusedToolbarDef = this._getCurrentFocusedToolbarDefinition();\r\n            if (!focusedToolbarDef) {\r\n                return;\r\n            }\r\n            // Bring focus back to where it came from before focusing the toolbar:\r\n            // 1. If it came from outside the engine view (e.g. source editing), move it there.\r\n            if (lastFocusedForeignElement) {\r\n                lastFocusedForeignElement.focus();\r\n                lastFocusedForeignElement = null;\r\n            }\r\n            // 2. There are two possibilities left:\r\n            //   2.1. It could be that the focus went from an editable element in the view (root or nested).\r\n            //   2.2. It could be the focus went straight to the toolbar before even focusing the editing area.\r\n            // In either case, just focus the view editing. The focus will land where it belongs.\r\n            else {\r\n                editor.editing.view.focus();\r\n            }\r\n            // Clean up after the toolbar if there is anything to do there.\r\n            if (focusedToolbarDef.options.afterBlur) {\r\n                focusedToolbarDef.options.afterBlur();\r\n            }\r\n            cancel();\r\n        });\r\n    }\r\n    /**\r\n     * Returns definitions of toolbars that could potentially be focused, sorted by their importance for the user.\r\n     *\r\n     * Focusable toolbars candidates are either:\r\n     * * already visible,\r\n     * * have `beforeFocus()` set in their {@link module:ui/editorui/editorui~FocusableToolbarDefinition definition} that suggests that\r\n     * they might show up when called. Keep in mind that determining whether a toolbar will show up (and become focusable) is impossible\r\n     * at this stage because it depends on its implementation, that in turn depends on the editing context (selection).\r\n     *\r\n     * **Note**: Contextual toolbars take precedence over regular toolbars.\r\n     */\r\n    _getFocusableCandidateToolbarDefinitions() {\r\n        const definitions = [];\r\n        for (const toolbarDef of this._focusableToolbarDefinitions) {\r\n            const { toolbarView, options } = toolbarDef;\r\n            if (isVisible(toolbarView.element) || options.beforeFocus) {\r\n                definitions.push(toolbarDef);\r\n            }\r\n        }\r\n        // Contextual and already visible toolbars have higher priority. If both are true, the toolbar will always focus first.\r\n        // For instance, a selected widget toolbar vs inline editor toolbar: both are visible but the widget toolbar is contextual.\r\n        definitions.sort((defA, defB) => getToolbarDefinitionWeight(defA) - getToolbarDefinitionWeight(defB));\r\n        return definitions;\r\n    }\r\n    /**\r\n     * Returns a definition of the toolbar that is currently visible and focused (one of its children has focus).\r\n     *\r\n     * `null` is returned when no toolbar is currently focused.\r\n     */\r\n    _getCurrentFocusedToolbarDefinition() {\r\n        for (const definition of this._focusableToolbarDefinitions) {\r\n            if (definition.toolbarView.element && definition.toolbarView.element.contains(this.focusTracker.focusedElement)) {\r\n                return definition;\r\n            }\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Focuses a focusable toolbar candidate using its definition.\r\n     *\r\n     * @param candidateToolbarDefinition A definition of the toolbar to focus.\r\n     * @returns `true` when the toolbar candidate was focused. `false` otherwise.\r\n     */\r\n    _focusFocusableCandidateToolbar(candidateToolbarDefinition) {\r\n        const { toolbarView, options: { beforeFocus } } = candidateToolbarDefinition;\r\n        if (beforeFocus) {\r\n            beforeFocus();\r\n        }\r\n        // If it didn't show up after beforeFocus(), it's not focusable at all.\r\n        if (!isVisible(toolbarView.element)) {\r\n            return false;\r\n        }\r\n        toolbarView.focus();\r\n        return true;\r\n    }\r\n    /**\r\n     * Provides an integration between {@link #viewportOffset} and {@link module:utils/dom/scroll~scrollViewportToShowTarget}.\r\n     * It allows the UI-agnostic engine method to consider user-configured viewport offsets specific for the integration.\r\n     *\r\n     * @param evt The `scrollToTheSelection` event info.\r\n     * @param data The payload carried by the `scrollToTheSelection` event.\r\n     */\r\n    _handleScrollToTheSelection(evt, data) {\r\n        const configuredViewportOffset = {\r\n            top: 0,\r\n            bottom: 0,\r\n            left: 0,\r\n            right: 0,\r\n            ...this.viewportOffset\r\n        };\r\n        data.viewportOffset.top += configuredViewportOffset.top;\r\n        data.viewportOffset.bottom += configuredViewportOffset.bottom;\r\n        data.viewportOffset.left += configuredViewportOffset.left;\r\n        data.viewportOffset.right += configuredViewportOffset.right;\r\n    }\r\n}\r\n/**\r\n * Returns a number (weight) for a toolbar definition. Visible toolbars have a higher priority and so do\r\n * contextual toolbars (displayed in the context of a content, for instance, an image toolbar).\r\n *\r\n * A standard invisible toolbar is the heaviest. A visible contextual toolbar is the lightest.\r\n *\r\n * @param toolbarDef A toolbar definition to be weighted.\r\n */\r\nfunction getToolbarDefinitionWeight(toolbarDef) {\r\n    const { toolbarView, options } = toolbarDef;\r\n    let weight = 10;\r\n    // Prioritize already visible toolbars. They should get focused first.\r\n    if (isVisible(toolbarView.element)) {\r\n        weight--;\r\n    }\r\n    // Prioritize contextual toolbars. They are displayed at the selection.\r\n    if (options.isContextual) {\r\n        weight--;\r\n    }\r\n    return weight;\r\n}\r\n","import api from \"!../../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../../css-loader/dist/cjs.js!../../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./editorui.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/editorui/editoruiview\r\n */\r\nimport View from '../view';\r\nimport BodyCollection from './bodycollection';\r\nimport '../../theme/components/editorui/editorui.css';\r\n/**\r\n * The editor UI view class. Base class for the editor main views.\r\n */\r\nexport default class EditorUIView extends View {\r\n    /**\r\n     * Creates an instance of the editor UI view class.\r\n     *\r\n     * @param locale The locale instance.\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        this.body = new BodyCollection(locale);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        this.body.attachToDom();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        this.body.detachFromDom();\r\n        return super.destroy();\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/editorui/boxed/boxededitoruiview\r\n */\r\nimport EditorUIView from '../editoruiview';\r\nimport LabelView from '../../label/labelview';\r\n/**\r\n * The boxed editor UI view class. This class represents an editor interface\r\n * consisting of a toolbar and an editable area, enclosed within a box.\r\n */\r\nexport default class BoxedEditorUIView extends EditorUIView {\r\n    /**\r\n     * Creates an instance of the boxed editor UI view class.\r\n     *\r\n     * @param locale The locale instance..\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        this.top = this.createCollection();\r\n        this.main = this.createCollection();\r\n        this._voiceLabelView = this._createVoiceLabel();\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-reset',\r\n                    'ck-editor',\r\n                    'ck-rounded-corners'\r\n                ],\r\n                role: 'application',\r\n                dir: locale.uiLanguageDirection,\r\n                lang: locale.uiLanguage,\r\n                'aria-labelledby': this._voiceLabelView.id\r\n            },\r\n            children: [\r\n                this._voiceLabelView,\r\n                {\r\n                    tag: 'div',\r\n                    attributes: {\r\n                        class: [\r\n                            'ck',\r\n                            'ck-editor__top',\r\n                            'ck-reset_all'\r\n                        ],\r\n                        role: 'presentation'\r\n                    },\r\n                    children: this.top\r\n                },\r\n                {\r\n                    tag: 'div',\r\n                    attributes: {\r\n                        class: [\r\n                            'ck',\r\n                            'ck-editor__main'\r\n                        ],\r\n                        role: 'presentation'\r\n                    },\r\n                    children: this.main\r\n                }\r\n            ]\r\n        });\r\n    }\r\n    /**\r\n     * Creates a voice label view instance.\r\n     */\r\n    _createVoiceLabel() {\r\n        const t = this.t;\r\n        const voiceLabel = new LabelView();\r\n        voiceLabel.text = t('Rich Text Editor');\r\n        voiceLabel.extendTemplate({\r\n            attributes: {\r\n                class: 'ck-voice-label'\r\n            }\r\n        });\r\n        return voiceLabel;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/editableui/editableuiview\r\n */\r\nimport View from '../view';\r\n/**\r\n * The editable UI view class.\r\n */\r\nexport default class EditableUIView extends View {\r\n    /**\r\n     * Creates an instance of EditableUIView class.\r\n     *\r\n     * @param locale The locale instance.\r\n     * @param editingView The editing view instance the editable is related to.\r\n     * @param editableElement The editable element. If not specified, this view\r\n     * should create it. Otherwise, the existing element should be used.\r\n     */\r\n    constructor(locale, editingView, editableElement) {\r\n        super(locale);\r\n        /**\r\n         * The name of the editable UI view.\r\n         */\r\n        this.name = null;\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-content',\r\n                    'ck-editor__editable',\r\n                    'ck-rounded-corners'\r\n                ],\r\n                lang: locale.contentLanguage,\r\n                dir: locale.contentLanguageDirection\r\n            }\r\n        });\r\n        this.set('isFocused', false);\r\n        this._editableElement = editableElement;\r\n        this._hasExternalElement = !!this._editableElement;\r\n        this._editingView = editingView;\r\n    }\r\n    /**\r\n     * Renders the view by either applying the {@link #template} to the existing\r\n     * {@link module:ui/editableui/editableuiview~EditableUIView#_editableElement} or assigning {@link #element}\r\n     * as {@link module:ui/editableui/editableuiview~EditableUIView#_editableElement}.\r\n     */\r\n    render() {\r\n        super.render();\r\n        if (this._hasExternalElement) {\r\n            this.template.apply(this.element = this._editableElement);\r\n        }\r\n        else {\r\n            this._editableElement = this.element;\r\n        }\r\n        this.on('change:isFocused', () => this._updateIsFocusedClasses());\r\n        this._updateIsFocusedClasses();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        if (this._hasExternalElement) {\r\n            this.template.revert(this._editableElement);\r\n        }\r\n        super.destroy();\r\n    }\r\n    /**\r\n     * Whether an external {@link #_editableElement} was passed into the constructor, which also means\r\n     * the view will not render its {@link #template}.\r\n     */\r\n    get hasExternalElement() {\r\n        return this._hasExternalElement;\r\n    }\r\n    /**\r\n     * Updates the `ck-focused` and `ck-blurred` CSS classes on the {@link #element} according to\r\n     * the {@link #isFocused} property value using the {@link #_editingView editing view} API.\r\n     */\r\n    _updateIsFocusedClasses() {\r\n        const editingView = this._editingView;\r\n        if (editingView.isRenderingInProgress) {\r\n            updateAfterRender(this);\r\n        }\r\n        else {\r\n            update(this);\r\n        }\r\n        function update(view) {\r\n            editingView.change(writer => {\r\n                const viewRoot = editingView.document.getRoot(view.name);\r\n                writer.addClass(view.isFocused ? 'ck-focused' : 'ck-blurred', viewRoot);\r\n                writer.removeClass(view.isFocused ? 'ck-blurred' : 'ck-focused', viewRoot);\r\n            });\r\n        }\r\n        // In a case of a multi-root editor, a callback will be attached more than once (one callback for each root).\r\n        // While executing one callback the `isRenderingInProgress` observable is changing what causes executing another\r\n        // callback and render is called inside the already pending render.\r\n        // We need to be sure that callback is executed only when the value has changed from `true` to `false`.\r\n        // See https://github.com/ckeditor/ckeditor5/issues/1676.\r\n        function updateAfterRender(view) {\r\n            editingView.once('change:isRenderingInProgress', (evt, name, value) => {\r\n                if (!value) {\r\n                    update(view);\r\n                }\r\n                else {\r\n                    updateAfterRender(view);\r\n                }\r\n            });\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/editableui/inline/inlineeditableuiview\r\n */\r\nimport EditableUIView from '../editableuiview';\r\n/**\r\n * The inline editable UI class implementing an inline {@link module:ui/editableui/editableuiview~EditableUIView}.\r\n */\r\nexport default class InlineEditableUIView extends EditableUIView {\r\n    /**\r\n     * Creates an instance of the InlineEditableUIView class.\r\n     *\r\n     * @param locale The locale instance.\r\n     * @param editingView The editing view instance the editable is related to.\r\n     * @param editableElement The editable element. If not specified, the\r\n     * {@link module:ui/editableui/editableuiview~EditableUIView}\r\n     * will create it. Otherwise, the existing element will be used.\r\n     * @param options Additional configuration of the view.\r\n     * @param options.label A function that gets called with the instance of this view as an argument\r\n     * and should return a string that represents the label of the editable for assistive technologies. If not provided,\r\n     * a default label generator is used.\r\n     */\r\n    constructor(locale, editingView, editableElement, options = {}) {\r\n        super(locale, editingView, editableElement);\r\n        const t = locale.t;\r\n        this.extendTemplate({\r\n            attributes: {\r\n                role: 'textbox',\r\n                class: 'ck-editor__editable_inline'\r\n            }\r\n        });\r\n        this._generateLabel = options.label || (() => t('Editor editing area: %0', this.name));\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        const editingView = this._editingView;\r\n        editingView.change(writer => {\r\n            const viewRoot = editingView.document.getRoot(this.name);\r\n            writer.setAttribute('aria-label', this._generateLabel(this), viewRoot);\r\n        });\r\n    }\r\n}\r\n","import api from \"!../../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../../css-loader/dist/cjs.js!../../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./formheader.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/formheader/formheaderview\r\n */\r\nimport View from '../view';\r\nimport '../../theme/components/formheader/formheader.css';\r\n/**\r\n * The class component representing a form header view. It should be used in more advanced forms to\r\n * describe the main purpose of the form.\r\n *\r\n * By default the component contains a bolded label view that has to be set. The label is usually a short (at most 3-word) string.\r\n * The component can also be extended by any other elements, like: icons, dropdowns, etc.\r\n *\r\n * It is used i.a.\r\n * by {@link module:table/tablecellproperties/ui/tablecellpropertiesview~TableCellPropertiesView}\r\n * and {@link module:special-characters/ui/specialcharactersnavigationview~SpecialCharactersNavigationView}.\r\n *\r\n * The latter is an example, where the component has been extended by {@link module:ui/dropdown/dropdownview~DropdownView} view.\r\n */\r\nexport default class FormHeaderView extends View {\r\n    /**\r\n     * Creates an instance of the form header class.\r\n     *\r\n     * @param locale The locale instance.\r\n     * @param options.label A label.\r\n     * @param options.class An additional class.\r\n     */\r\n    constructor(locale, options = {}) {\r\n        super(locale);\r\n        const bind = this.bindTemplate;\r\n        this.set('label', options.label || '');\r\n        this.set('class', options.class || null);\r\n        this.children = this.createCollection();\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-form__header',\r\n                    bind.to('class')\r\n                ]\r\n            },\r\n            children: this.children\r\n        });\r\n        const label = new View(locale);\r\n        label.setTemplate({\r\n            tag: 'h2',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-form__header__label'\r\n                ]\r\n            },\r\n            children: [\r\n                { text: bind.to('label') }\r\n            ]\r\n        });\r\n        this.children.add(label);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/notification/notification\r\n */\r\n/* globals window */\r\nimport { ContextPlugin } from '@ckeditor/ckeditor5-core';\r\n/**\r\n * The Notification plugin.\r\n *\r\n * This plugin sends a few types of notifications: `success`, `info` and `warning`. The notifications need to be\r\n * handled and displayed by a plugin responsible for showing the UI of the notifications. Using this plugin for dispatching\r\n * notifications makes it possible to switch the notifications UI.\r\n *\r\n * Note that every unhandled and not stopped `warning` notification will be displayed as a system alert.\r\n * See {@link module:ui/notification/notification~Notification#showWarning}.\r\n */\r\nexport default class Notification extends ContextPlugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'Notification';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        // Each unhandled and not stopped `show:warning` event is displayed as a system alert.\r\n        this.on('show:warning', (evt, data) => {\r\n            window.alert(data.message); // eslint-disable-line no-alert\r\n        }, { priority: 'lowest' });\r\n    }\r\n    /**\r\n     * Shows a success notification.\r\n     *\r\n     * By default, it fires the {@link #event:show:success `show:success` event} with the given `data`. The event namespace can be extended\r\n     * using the `data.namespace` option. For example:\r\n     *\r\n     * ```ts\r\n     * showSuccess( 'Image is uploaded.', {\r\n     * \tnamespace: 'upload:image'\r\n     * } );\r\n     * ```\r\n     *\r\n     * will fire the `show:success:upload:image` event.\r\n     *\r\n     * You can provide the title of the notification:\r\n     *\r\n     * ```ts\r\n     * showSuccess( 'Image is uploaded.', {\r\n     * \ttitle: 'Image upload success'\r\n     * } );\r\n     * ```\r\n     *\r\n     * @param message The content of the notification.\r\n     * @param data Additional data.\r\n     * @param data.namespace Additional event namespace.\r\n     * @param data.title The title of the notification.\r\n     */\r\n    showSuccess(message, data = {}) {\r\n        this._showNotification({\r\n            message,\r\n            type: 'success',\r\n            namespace: data.namespace,\r\n            title: data.title\r\n        });\r\n    }\r\n    /**\r\n     * Shows an information notification.\r\n     *\r\n     * By default, it fires the {@link #event:show:info `show:info` event} with the given `data`. The event namespace can be extended\r\n     * using the `data.namespace` option. For example:\r\n     *\r\n     * ```ts\r\n     * showInfo( 'Editor is offline.', {\r\n     * \tnamespace: 'editor:status'\r\n     * } );\r\n     * ```\r\n     *\r\n     * will fire the `show:info:editor:status` event.\r\n     *\r\n     * You can provide the title of the notification:\r\n     *\r\n     * ```ts\r\n     * showInfo( 'Editor is offline.', {\r\n     * \ttitle: 'Network information'\r\n     * } );\r\n     * ```\r\n     *\r\n     * @param message The content of the notification.\r\n     * @param data Additional data.\r\n     * @param data.namespace Additional event namespace.\r\n     * @param data.title The title of the notification.\r\n     */\r\n    showInfo(message, data = {}) {\r\n        this._showNotification({\r\n            message,\r\n            type: 'info',\r\n            namespace: data.namespace,\r\n            title: data.title\r\n        });\r\n    }\r\n    /**\r\n     * Shows a warning notification.\r\n     *\r\n     * By default, it fires the {@link #event:show:warning `show:warning` event}\r\n     * with the given `data`. The event namespace can be extended using the `data.namespace` option. For example:\r\n     *\r\n     * ```ts\r\n     * showWarning( 'Image upload error.', {\r\n     * \tnamespace: 'upload:image'\r\n     * } );\r\n     * ```\r\n     *\r\n     * will fire the `show:warning:upload:image` event.\r\n     *\r\n     * You can provide the title of the notification:\r\n     *\r\n     * ```ts\r\n     * showWarning( 'Image upload error.', {\r\n     * \ttitle: 'Upload failed'\r\n     * } );\r\n     * ```\r\n     *\r\n     * Note that each unhandled and not stopped `warning` notification will be displayed as a system alert.\r\n     * The plugin responsible for displaying warnings should `stop()` the event to prevent displaying it as an alert:\r\n     *\r\n     * ```ts\r\n     * notifications.on( 'show:warning', ( evt, data ) => {\r\n     * \t// Do something with the data.\r\n     *\r\n     * \t// Stop this event to prevent displaying it as an alert.\r\n     * \tevt.stop();\r\n     * } );\r\n     * ```\r\n     *\r\n     * You can attach many listeners to the same event and `stop()` this event in a listener with a low priority:\r\n     *\r\n     * ```ts\r\n     * notifications.on( 'show:warning', ( evt, data ) => {\r\n     * \t// Show the warning in the UI, but do not stop it.\r\n     * } );\r\n     *\r\n     * notifications.on( 'show:warning', ( evt, data ) => {\r\n     * \t// Log the warning to some error tracker.\r\n     *\r\n     * \t// Stop this event to prevent displaying it as an alert.\r\n     * \tevt.stop();\r\n     * }, { priority: 'low' } );\r\n     * ```\r\n     *\r\n     * @param message The content of the notification.\r\n     * @param data Additional data.\r\n     * @param data.namespace Additional event namespace.\r\n     * @param data.title The title of the notification.\r\n     */\r\n    showWarning(message, data = {}) {\r\n        this._showNotification({\r\n            message,\r\n            type: 'warning',\r\n            namespace: data.namespace,\r\n            title: data.title\r\n        });\r\n    }\r\n    /**\r\n     * Fires the `show` event with the specified type, namespace and message.\r\n     *\r\n     * @param data The message data.\r\n     * @param data.message The content of the notification.\r\n     * @param data.type The type of the message.\r\n     * @param data.namespace Additional event namespace.\r\n     * @param data.title The title of the notification.\r\n     */\r\n    _showNotification(data) {\r\n        const event = data.namespace ?\r\n            `show:${data.type}:${data.namespace}` :\r\n            `show:${data.type}`;\r\n        this.fire(event, {\r\n            message: data.message,\r\n            type: data.type,\r\n            title: data.title || ''\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/model\r\n */\r\nimport { ObservableMixin } from '@ckeditor/ckeditor5-utils';\r\nimport { extend } from 'lodash-es';\r\n/**\r\n * The base MVC model class.\r\n */\r\nexport default class Model extends ObservableMixin() {\r\n    /**\r\n     * Creates a new Model instance.\r\n     *\r\n     * @param attributes The model state attributes to be defined during the instance creation.\r\n     * @param properties The (out of state) properties to be appended to the instance during creation.\r\n     */\r\n    constructor(attributes, properties) {\r\n        super();\r\n        // Extend this instance with the additional (out of state) properties.\r\n        if (properties) {\r\n            extend(this, properties);\r\n        }\r\n        // Initialize the attributes.\r\n        if (attributes) {\r\n            this.set(attributes);\r\n        }\r\n    }\r\n}\r\n","export default \"<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>\";","import api from \"!../../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../../css-loader/dist/cjs.js!../../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./balloonrotator.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../../css-loader/dist/cjs.js!../../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./fakepanel.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/panel/balloon/contextualballoon\r\n */\r\nimport BalloonPanelView from './balloonpanelview';\r\nimport View from '../../view';\r\nimport ButtonView from '../../button/buttonview';\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\nimport { CKEditorError, FocusTracker, Rect, toUnit } from '@ckeditor/ckeditor5-utils';\r\nimport prevIcon from '../../../theme/icons/previous-arrow.svg';\r\nimport nextIcon from '../../../theme/icons/next-arrow.svg';\r\nimport '../../../theme/components/panel/balloonrotator.css';\r\nimport '../../../theme/components/panel/fakepanel.css';\r\nconst toPx = toUnit('px');\r\n/**\r\n * Provides the common contextual balloon for the editor.\r\n *\r\n * The role of this plugin is to unify the contextual balloons logic, simplify views management and help\r\n * avoid the unnecessary complexity of handling multiple {@link module:ui/panel/balloon/balloonpanelview~BalloonPanelView}\r\n * instances in the editor.\r\n *\r\n * This plugin allows for creating single or multiple panel stacks.\r\n *\r\n * Each stack may have multiple views, with the one on the top being visible. When the visible view is removed from the stack,\r\n * the previous view becomes visible.\r\n *\r\n * It might be useful to implement nested navigation in a balloon. For instance, a toolbar view may contain a link button.\r\n * When you click it, a link view (which lets you set the URL) is created and put on top of the toolbar view, so the link panel\r\n * is displayed. When you finish editing the link and close (remove) the link view, the toolbar view is visible again.\r\n *\r\n * However, there are cases when there are multiple independent balloons to be displayed, for instance, if the selection\r\n * is inside two inline comments at the same time. For such cases, you can create two independent panel stacks.\r\n * The contextual balloon plugin will create a navigation bar to let the users switch between these panel stacks using the \"Next\"\r\n * and \"Previous\" buttons.\r\n *\r\n * If there are no views in the current stack, the balloon panel will try to switch to the next stack. If there are no\r\n * panels in any stack, the balloon panel will be hidden.\r\n *\r\n * **Note**: To force the balloon panel to show only one view, even if there are other stacks, use the `singleViewMode=true` option\r\n * when {@link module:ui/panel/balloon/contextualballoon~ContextualBalloon#add adding} a view to a panel.\r\n *\r\n * From the implementation point of view, the contextual ballon plugin is reusing a single\r\n * {@link module:ui/panel/balloon/balloonpanelview~BalloonPanelView} instance to display multiple contextual balloon\r\n * panels in the editor. It also creates a special {@link module:ui/panel/balloon/contextualballoon~RotatorView rotator view},\r\n * used to manage multiple panel stacks. Rotator view is a child of the balloon panel view and the parent of the specific\r\n * view you want to display. If there is more than one panel stack to be displayed, the rotator view will add a\r\n * navigation bar. If there is only one stack, the rotator view is transparent (it does not add any UI elements).\r\n */\r\nexport default class ContextualBalloon extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ContextualBalloon';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        /**\r\n         * The map of views and their stacks.\r\n         */\r\n        this._viewToStack = new Map();\r\n        /**\r\n         * The map of IDs and stacks.\r\n         */\r\n        this._idToStack = new Map();\r\n        /**\r\n         * The common balloon panel view.\r\n         */\r\n        this._view = null;\r\n        /**\r\n         * Rotator view embedded in the contextual balloon.\r\n         * Displays the currently visible view in the balloon and provides navigation for switching stacks.\r\n         */\r\n        this._rotatorView = null;\r\n        /**\r\n         * Displays fake panels under the balloon panel view when multiple stacks are added to the balloon.\r\n         */\r\n        this._fakePanelsView = null;\r\n        this.positionLimiter = () => {\r\n            const view = this.editor.editing.view;\r\n            const viewDocument = view.document;\r\n            const editableElement = viewDocument.selection.editableElement;\r\n            if (editableElement) {\r\n                return view.domConverter.mapViewToDom(editableElement.root);\r\n            }\r\n            return null;\r\n        };\r\n        this.set('visibleView', null);\r\n        this.set('_numberOfStacks', 0);\r\n        this.set('_singleViewMode', false);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        if (this._view) {\r\n            this._view.destroy();\r\n        }\r\n        if (this._rotatorView) {\r\n            this._rotatorView.destroy();\r\n        }\r\n        if (this._fakePanelsView) {\r\n            this._fakePanelsView.destroy();\r\n        }\r\n    }\r\n    /**\r\n     * The common balloon panel view.\r\n     */\r\n    get view() {\r\n        if (!this._view) {\r\n            this._createPanelView();\r\n        }\r\n        return this._view;\r\n    }\r\n    /**\r\n     * Returns `true` when the given view is in one of the stacks. Otherwise returns `false`.\r\n     */\r\n    hasView(view) {\r\n        return Array.from(this._viewToStack.keys()).includes(view);\r\n    }\r\n    /**\r\n     * Adds a new view to the stack and makes it visible if the current stack is visible\r\n     * or it is the first view in the balloon.\r\n     *\r\n     * @param data The configuration of the view.\r\n     * @param data.stackId The ID of the stack that the view is added to. Defaults to `'main'`.\r\n     * @param data.view The content of the balloon.\r\n     * @param data.position Positioning options.\r\n     * @param data.balloonClassName An additional CSS class added to the {@link #view balloon} when visible.\r\n     * @param data.withArrow Whether the {@link #view balloon} should be rendered with an arrow. Defaults to `true`.\r\n     * @param data.singleViewMode Whether the view should be the only visible view even if other stacks were added. Defaults to `false`.\r\n     */\r\n    add(data) {\r\n        if (!this._view) {\r\n            this._createPanelView();\r\n        }\r\n        if (this.hasView(data.view)) {\r\n            /**\r\n             * Trying to add configuration of the same view more than once.\r\n             *\r\n             * @error contextualballoon-add-view-exist\r\n             */\r\n            throw new CKEditorError('contextualballoon-add-view-exist', [this, data]);\r\n        }\r\n        const stackId = data.stackId || 'main';\r\n        // If new stack is added, creates it and show view from this stack.\r\n        if (!this._idToStack.has(stackId)) {\r\n            this._idToStack.set(stackId, new Map([[data.view, data]]));\r\n            this._viewToStack.set(data.view, this._idToStack.get(stackId));\r\n            this._numberOfStacks = this._idToStack.size;\r\n            if (!this._visibleStack || data.singleViewMode) {\r\n                this.showStack(stackId);\r\n            }\r\n            return;\r\n        }\r\n        const stack = this._idToStack.get(stackId);\r\n        if (data.singleViewMode) {\r\n            this.showStack(stackId);\r\n        }\r\n        // Add new view to the stack.\r\n        stack.set(data.view, data);\r\n        this._viewToStack.set(data.view, stack);\r\n        // And display it if is added to the currently visible stack.\r\n        if (stack === this._visibleStack) {\r\n            this._showView(data);\r\n        }\r\n    }\r\n    /**\r\n     * Removes the given view from the stack. If the removed view was visible,\r\n     * the view preceding it in the stack will become visible instead.\r\n     * When there is no view in the stack, the next stack will be displayed.\r\n     * When there are no more stacks, the balloon will hide.\r\n     *\r\n     * @param view A view to be removed from the balloon.\r\n     */\r\n    remove(view) {\r\n        if (!this.hasView(view)) {\r\n            /**\r\n             * Trying to remove the configuration of the view not defined in the stack.\r\n             *\r\n             * @error contextualballoon-remove-view-not-exist\r\n             */\r\n            throw new CKEditorError('contextualballoon-remove-view-not-exist', [this, view]);\r\n        }\r\n        const stack = this._viewToStack.get(view);\r\n        if (this._singleViewMode && this.visibleView === view) {\r\n            this._singleViewMode = false;\r\n        }\r\n        // When visible view will be removed we need to show a preceding view or next stack\r\n        // if a view is the only view in the stack.\r\n        if (this.visibleView === view) {\r\n            if (stack.size === 1) {\r\n                if (this._idToStack.size > 1) {\r\n                    this._showNextStack();\r\n                }\r\n                else {\r\n                    this.view.hide();\r\n                    this.visibleView = null;\r\n                    this._rotatorView.hideView();\r\n                }\r\n            }\r\n            else {\r\n                this._showView(Array.from(stack.values())[stack.size - 2]);\r\n            }\r\n        }\r\n        if (stack.size === 1) {\r\n            this._idToStack.delete(this._getStackId(stack));\r\n            this._numberOfStacks = this._idToStack.size;\r\n        }\r\n        else {\r\n            stack.delete(view);\r\n        }\r\n        this._viewToStack.delete(view);\r\n    }\r\n    /**\r\n     * Updates the position of the balloon using the position data of the first visible view in the stack.\r\n     * When new position data is given, the position data of the currently visible view will be updated.\r\n     *\r\n     * @param position Position options.\r\n     */\r\n    updatePosition(position) {\r\n        if (position) {\r\n            this._visibleStack.get(this.visibleView).position = position;\r\n        }\r\n        this.view.pin(this._getBalloonPosition());\r\n        this._fakePanelsView.updatePosition();\r\n    }\r\n    /**\r\n     * Shows the last view from the stack of a given ID.\r\n     */\r\n    showStack(id) {\r\n        this.visibleStack = id;\r\n        const stack = this._idToStack.get(id);\r\n        if (!stack) {\r\n            /**\r\n             * Trying to show a stack that does not exist.\r\n             *\r\n             * @error contextualballoon-showstack-stack-not-exist\r\n             */\r\n            throw new CKEditorError('contextualballoon-showstack-stack-not-exist', this);\r\n        }\r\n        if (this._visibleStack === stack) {\r\n            return;\r\n        }\r\n        this._showView(Array.from(stack.values()).pop());\r\n    }\r\n    /**\r\n     * Initializes view instances.\r\n     */\r\n    _createPanelView() {\r\n        this._view = new BalloonPanelView(this.editor.locale);\r\n        this.editor.ui.view.body.add(this._view);\r\n        this.editor.ui.focusTracker.add(this._view.element);\r\n        this._rotatorView = this._createRotatorView();\r\n        this._fakePanelsView = this._createFakePanelsView();\r\n    }\r\n    /**\r\n     * Returns the stack of the currently visible view.\r\n     */\r\n    get _visibleStack() {\r\n        return this._viewToStack.get(this.visibleView);\r\n    }\r\n    /**\r\n     * Returns the ID of the given stack.\r\n     */\r\n    _getStackId(stack) {\r\n        const entry = Array.from(this._idToStack.entries()).find(entry => entry[1] === stack);\r\n        return entry[0];\r\n    }\r\n    /**\r\n     * Shows the last view from the next stack.\r\n     */\r\n    _showNextStack() {\r\n        const stacks = Array.from(this._idToStack.values());\r\n        let nextIndex = stacks.indexOf(this._visibleStack) + 1;\r\n        if (!stacks[nextIndex]) {\r\n            nextIndex = 0;\r\n        }\r\n        this.showStack(this._getStackId(stacks[nextIndex]));\r\n    }\r\n    /**\r\n     * Shows the last view from the previous stack.\r\n     */\r\n    _showPrevStack() {\r\n        const stacks = Array.from(this._idToStack.values());\r\n        let nextIndex = stacks.indexOf(this._visibleStack) - 1;\r\n        if (!stacks[nextIndex]) {\r\n            nextIndex = stacks.length - 1;\r\n        }\r\n        this.showStack(this._getStackId(stacks[nextIndex]));\r\n    }\r\n    /**\r\n     * Creates a rotator view.\r\n     */\r\n    _createRotatorView() {\r\n        const view = new RotatorView(this.editor.locale);\r\n        const t = this.editor.locale.t;\r\n        this.view.content.add(view);\r\n        // Hide navigation when there is only a one stack & not in single view mode.\r\n        view.bind('isNavigationVisible').to(this, '_numberOfStacks', this, '_singleViewMode', (value, isSingleViewMode) => {\r\n            return !isSingleViewMode && value > 1;\r\n        });\r\n        // Update balloon position after toggling navigation.\r\n        view.on('change:isNavigationVisible', () => (this.updatePosition()), { priority: 'low' });\r\n        // Update stacks counter value.\r\n        view.bind('counter').to(this, 'visibleView', this, '_numberOfStacks', (visibleView, numberOfStacks) => {\r\n            if (numberOfStacks < 2) {\r\n                return '';\r\n            }\r\n            const current = Array.from(this._idToStack.values()).indexOf(this._visibleStack) + 1;\r\n            return t('%0 of %1', [current, numberOfStacks]);\r\n        });\r\n        view.buttonNextView.on('execute', () => {\r\n            // When current view has a focus then move focus to the editable before removing it,\r\n            // otherwise editor will lost focus.\r\n            if (view.focusTracker.isFocused) {\r\n                this.editor.editing.view.focus();\r\n            }\r\n            this._showNextStack();\r\n        });\r\n        view.buttonPrevView.on('execute', () => {\r\n            // When current view has a focus then move focus to the editable before removing it,\r\n            // otherwise editor will lost focus.\r\n            if (view.focusTracker.isFocused) {\r\n                this.editor.editing.view.focus();\r\n            }\r\n            this._showPrevStack();\r\n        });\r\n        return view;\r\n    }\r\n    /**\r\n     * Creates a fake panels view.\r\n     */\r\n    _createFakePanelsView() {\r\n        const view = new FakePanelsView(this.editor.locale, this.view);\r\n        view.bind('numberOfPanels').to(this, '_numberOfStacks', this, '_singleViewMode', (number, isSingleViewMode) => {\r\n            const showPanels = !isSingleViewMode && number >= 2;\r\n            return showPanels ? Math.min(number - 1, 2) : 0;\r\n        });\r\n        view.listenTo(this.view, 'change:top', () => view.updatePosition());\r\n        view.listenTo(this.view, 'change:left', () => view.updatePosition());\r\n        this.editor.ui.view.body.add(view);\r\n        return view;\r\n    }\r\n    /**\r\n     * Sets the view as the content of the balloon and attaches the balloon using position\r\n     * options of the first view.\r\n     *\r\n     * @param data Configuration.\r\n     * @param data.view The view to show in the balloon.\r\n     * @param data.balloonClassName Additional class name which will be added to the {@link #view balloon}.\r\n     * @param data.withArrow Whether the {@link #view balloon} should be rendered with an arrow.\r\n     */\r\n    _showView({ view, balloonClassName = '', withArrow = true, singleViewMode = false }) {\r\n        this.view.class = balloonClassName;\r\n        this.view.withArrow = withArrow;\r\n        this._rotatorView.showView(view);\r\n        this.visibleView = view;\r\n        this.view.pin(this._getBalloonPosition());\r\n        this._fakePanelsView.updatePosition();\r\n        if (singleViewMode) {\r\n            this._singleViewMode = true;\r\n        }\r\n    }\r\n    /**\r\n     * Returns position options of the last view in the stack.\r\n     * This keeps the balloon in the same position when the view is changed.\r\n     */\r\n    _getBalloonPosition() {\r\n        let position = Array.from(this._visibleStack.values()).pop().position;\r\n        if (position) {\r\n            // Use the default limiter if none has been specified.\r\n            if (!position.limiter) {\r\n                // Don't modify the original options object.\r\n                position = Object.assign({}, position, {\r\n                    limiter: this.positionLimiter\r\n                });\r\n            }\r\n            // Don't modify the original options object.\r\n            position = Object.assign({}, position, {\r\n                viewportOffsetConfig: this.editor.ui.viewportOffset\r\n            });\r\n        }\r\n        return position;\r\n    }\r\n}\r\n/**\r\n * Rotator view is a helper class for the {@link module:ui/panel/balloon/contextualballoon~ContextualBalloon ContextualBalloon}.\r\n * It is used for displaying the last view from the current stack and providing navigation buttons for switching stacks.\r\n * See the {@link module:ui/panel/balloon/contextualballoon~ContextualBalloon ContextualBalloon} documentation to learn more.\r\n */\r\nexport class RotatorView extends View {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        const t = locale.t;\r\n        const bind = this.bindTemplate;\r\n        this.set('isNavigationVisible', true);\r\n        this.focusTracker = new FocusTracker();\r\n        this.buttonPrevView = this._createButtonView(t('Previous'), prevIcon);\r\n        this.buttonNextView = this._createButtonView(t('Next'), nextIcon);\r\n        this.content = this.createCollection();\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-balloon-rotator'\r\n                ],\r\n                'z-index': '-1'\r\n            },\r\n            children: [\r\n                {\r\n                    tag: 'div',\r\n                    attributes: {\r\n                        class: [\r\n                            'ck-balloon-rotator__navigation',\r\n                            bind.to('isNavigationVisible', value => value ? '' : 'ck-hidden')\r\n                        ]\r\n                    },\r\n                    children: [\r\n                        this.buttonPrevView,\r\n                        {\r\n                            tag: 'span',\r\n                            attributes: {\r\n                                class: [\r\n                                    'ck-balloon-rotator__counter'\r\n                                ]\r\n                            },\r\n                            children: [\r\n                                {\r\n                                    text: bind.to('counter')\r\n                                }\r\n                            ]\r\n                        },\r\n                        this.buttonNextView\r\n                    ]\r\n                },\r\n                {\r\n                    tag: 'div',\r\n                    attributes: {\r\n                        class: 'ck-balloon-rotator__content'\r\n                    },\r\n                    children: this.content\r\n                }\r\n            ]\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        this.focusTracker.add(this.element);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        this.focusTracker.destroy();\r\n    }\r\n    /**\r\n     * Shows a given view.\r\n     *\r\n     * @param view The view to show.\r\n     */\r\n    showView(view) {\r\n        this.hideView();\r\n        this.content.add(view);\r\n    }\r\n    /**\r\n     * Hides the currently displayed view.\r\n     */\r\n    hideView() {\r\n        this.content.clear();\r\n    }\r\n    /**\r\n     * Creates a navigation button view.\r\n     *\r\n     * @param label The button label.\r\n     * @param icon The button icon.\r\n     */\r\n    _createButtonView(label, icon) {\r\n        const view = new ButtonView(this.locale);\r\n        view.set({\r\n            label,\r\n            icon,\r\n            tooltip: true\r\n        });\r\n        return view;\r\n    }\r\n}\r\n/**\r\n * Displays additional layers under the balloon when multiple stacks are added to the balloon.\r\n */\r\nclass FakePanelsView extends View {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale, balloonPanelView) {\r\n        super(locale);\r\n        const bind = this.bindTemplate;\r\n        this.set('top', 0);\r\n        this.set('left', 0);\r\n        this.set('height', 0);\r\n        this.set('width', 0);\r\n        this.set('numberOfPanels', 0);\r\n        this.content = this.createCollection();\r\n        this._balloonPanelView = balloonPanelView;\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck-fake-panel',\r\n                    bind.to('numberOfPanels', number => number ? '' : 'ck-hidden')\r\n                ],\r\n                style: {\r\n                    top: bind.to('top', toPx),\r\n                    left: bind.to('left', toPx),\r\n                    width: bind.to('width', toPx),\r\n                    height: bind.to('height', toPx)\r\n                }\r\n            },\r\n            children: this.content\r\n        });\r\n        this.on('change:numberOfPanels', (evt, name, next, prev) => {\r\n            if (next > prev) {\r\n                this._addPanels(next - prev);\r\n            }\r\n            else {\r\n                this._removePanels(prev - next);\r\n            }\r\n            this.updatePosition();\r\n        });\r\n    }\r\n    _addPanels(number) {\r\n        while (number--) {\r\n            const view = new View();\r\n            view.setTemplate({ tag: 'div' });\r\n            this.content.add(view);\r\n            this.registerChild(view);\r\n        }\r\n    }\r\n    _removePanels(number) {\r\n        while (number--) {\r\n            const view = this.content.last;\r\n            this.content.remove(view);\r\n            this.deregisterChild(view);\r\n            view.destroy();\r\n        }\r\n    }\r\n    /**\r\n     * Updates coordinates of fake panels.\r\n     */\r\n    updatePosition() {\r\n        if (this.numberOfPanels) {\r\n            const { top, left } = this._balloonPanelView;\r\n            const { width, height } = new Rect(this._balloonPanelView.element);\r\n            Object.assign(this, { top, left, width, height });\r\n        }\r\n    }\r\n}\r\n","export default \"<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>\";","import api from \"!../../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../../css-loader/dist/cjs.js!../../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./stickypanel.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/panel/sticky/stickypanelview\r\n */\r\nimport View from '../../view';\r\nimport Template from '../../template';\r\nimport { global, toUnit } from '@ckeditor/ckeditor5-utils';\r\nimport '../../../theme/components/panel/stickypanel.css';\r\nconst toPx = toUnit('px');\r\n/**\r\n * The sticky panel view class.\r\n */\r\nexport default class StickyPanelView extends View {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        const bind = this.bindTemplate;\r\n        this.set('isActive', false);\r\n        this.set('isSticky', false);\r\n        this.set('limiterElement', null);\r\n        this.set('limiterBottomOffset', 50);\r\n        this.set('viewportTopOffset', 0);\r\n        this.set('_marginLeft', null);\r\n        this.set('_isStickyToTheLimiter', false);\r\n        this.set('_hasViewportTopOffset', false);\r\n        this.content = this.createCollection();\r\n        this._contentPanelPlaceholder = new Template({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-sticky-panel__placeholder'\r\n                ],\r\n                style: {\r\n                    display: bind.to('isSticky', isSticky => isSticky ? 'block' : 'none'),\r\n                    height: bind.to('isSticky', isSticky => {\r\n                        return isSticky ? toPx(this._panelRect.height) : null;\r\n                    })\r\n                }\r\n            }\r\n        }).render();\r\n        this._contentPanel = new Template({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-sticky-panel__content',\r\n                    // Toggle class of the panel when \"sticky\" state changes in the view.\r\n                    bind.if('isSticky', 'ck-sticky-panel__content_sticky'),\r\n                    bind.if('_isStickyToTheLimiter', 'ck-sticky-panel__content_sticky_bottom-limit')\r\n                ],\r\n                style: {\r\n                    width: bind.to('isSticky', isSticky => {\r\n                        return isSticky ? toPx(this._contentPanelPlaceholder.getBoundingClientRect().width) : null;\r\n                    }),\r\n                    top: bind.to('_hasViewportTopOffset', _hasViewportTopOffset => {\r\n                        return _hasViewportTopOffset ? toPx(this.viewportTopOffset) : null;\r\n                    }),\r\n                    bottom: bind.to('_isStickyToTheLimiter', _isStickyToTheLimiter => {\r\n                        return _isStickyToTheLimiter ? toPx(this.limiterBottomOffset) : null;\r\n                    }),\r\n                    marginLeft: bind.to('_marginLeft')\r\n                }\r\n            },\r\n            children: this.content\r\n        }).render();\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-sticky-panel'\r\n                ]\r\n            },\r\n            children: [\r\n                this._contentPanelPlaceholder,\r\n                this._contentPanel\r\n            ]\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        // Check if the panel should go into the sticky state immediately.\r\n        this._checkIfShouldBeSticky();\r\n        // Update sticky state of the panel as the window is being scrolled.\r\n        this.listenTo(global.window, 'scroll', () => {\r\n            this._checkIfShouldBeSticky();\r\n        });\r\n        // Synchronize with `model.isActive` because sticking an inactive panel is pointless.\r\n        this.listenTo(this, 'change:isActive', () => {\r\n            this._checkIfShouldBeSticky();\r\n        });\r\n    }\r\n    /**\r\n     * Analyzes the environment to decide whether the panel should\r\n     * be sticky or not.\r\n     */\r\n    _checkIfShouldBeSticky() {\r\n        const panelRect = this._panelRect = this._contentPanel.getBoundingClientRect();\r\n        let limiterRect;\r\n        if (!this.limiterElement) {\r\n            this.isSticky = false;\r\n        }\r\n        else {\r\n            limiterRect = this._limiterRect = this.limiterElement.getBoundingClientRect();\r\n            // The panel must be active to become sticky.\r\n            this.isSticky = this.isActive &&\r\n                // The limiter's top edge must be beyond the upper edge of the visible viewport (+the viewportTopOffset).\r\n                limiterRect.top < this.viewportTopOffset &&\r\n                // The model#limiterElement's height mustn't be smaller than the panel's height and model#limiterBottomOffset.\r\n                // There's no point in entering the sticky mode if the model#limiterElement is very, very small, because\r\n                // it would immediately set model#_isStickyToTheLimiter true and, given model#limiterBottomOffset, the panel\r\n                // would be positioned before the model#limiterElement.\r\n                this._panelRect.height + this.limiterBottomOffset < limiterRect.height;\r\n        }\r\n        // Stick the panel to the top edge of the viewport simulating CSS position:sticky.\r\n        // TODO: Possibly replaced by CSS in the future http://caniuse.com/#feat=css-sticky\r\n        if (this.isSticky) {\r\n            this._isStickyToTheLimiter =\r\n                limiterRect.bottom < panelRect.height + this.limiterBottomOffset + this.viewportTopOffset;\r\n            this._hasViewportTopOffset = !this._isStickyToTheLimiter && !!this.viewportTopOffset;\r\n            this._marginLeft = this._isStickyToTheLimiter ? null : toPx(-global.window.scrollX);\r\n        }\r\n        // Detach the panel from the top edge of the viewport.\r\n        else {\r\n            this._isStickyToTheLimiter = false;\r\n            this._hasViewportTopOffset = false;\r\n            this._marginLeft = null;\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/toolbar/balloon/balloontoolbar\r\n */\r\nimport ContextualBalloon from '../../panel/balloon/contextualballoon';\r\nimport ToolbarView from '../toolbarview';\r\nimport BalloonPanelView, { generatePositions } from '../../panel/balloon/balloonpanelview';\r\nimport normalizeToolbarConfig from '../normalizetoolbarconfig';\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\nimport { FocusTracker, Rect, ResizeObserver, env, global, toUnit } from '@ckeditor/ckeditor5-utils';\r\nimport { debounce } from 'lodash-es';\r\nconst toPx = toUnit('px');\r\n/**\r\n * The contextual toolbar.\r\n *\r\n * It uses the {@link module:ui/panel/balloon/contextualballoon~ContextualBalloon contextual balloon plugin}.\r\n */\r\nexport default class BalloonToolbar extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'BalloonToolbar';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ContextualBalloon];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        /**\r\n         * An instance of the resize observer that allows to respond to changes in editable's geometry\r\n         * so the toolbar can stay within its boundaries (and group toolbar items that do not fit).\r\n         *\r\n         * **Note**: Used only when `shouldNotGroupWhenFull` was **not** set in the\r\n         * {@link module:core/editor/editorconfig~EditorConfig#balloonToolbar configuration}.\r\n         *\r\n         * **Note:** Created in {@link #init}.\r\n         */\r\n        this._resizeObserver = null;\r\n        this._balloonConfig = normalizeToolbarConfig(editor.config.get('balloonToolbar'));\r\n        this.toolbarView = this._createToolbarView();\r\n        this.focusTracker = new FocusTracker();\r\n        // Wait for the EditorUI#init. EditableElement is not available before.\r\n        editor.ui.once('ready', () => {\r\n            this.focusTracker.add(editor.ui.getEditableElement());\r\n            this.focusTracker.add(this.toolbarView.element);\r\n        });\r\n        // Register the toolbar so it becomes available for Alt+F10 and Esc navigation.\r\n        editor.ui.addToolbar(this.toolbarView, {\r\n            beforeFocus: () => this.show(true),\r\n            afterBlur: () => this.hide(),\r\n            isContextual: true\r\n        });\r\n        this._balloon = editor.plugins.get(ContextualBalloon);\r\n        this._fireSelectionChangeDebounced = debounce(() => this.fire('_selectionChangeDebounced'), 200);\r\n        // The appearance of the BalloonToolbar method is event–driven.\r\n        // It is possible to stop the #show event and this prevent the toolbar from showing up.\r\n        this.decorate('show');\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const selection = editor.model.document.selection;\r\n        // Show/hide the toolbar on editable focus/blur.\r\n        this.listenTo(this.focusTracker, 'change:isFocused', (evt, name, isFocused) => {\r\n            const isToolbarVisible = this._balloon.visibleView === this.toolbarView;\r\n            if (!isFocused && isToolbarVisible) {\r\n                this.hide();\r\n            }\r\n            else if (isFocused) {\r\n                this.show();\r\n            }\r\n        });\r\n        // Hide the toolbar when the selection is changed by a direct change or has changed to collapsed.\r\n        this.listenTo(selection, 'change:range', (evt, data) => {\r\n            if (data.directChange || selection.isCollapsed) {\r\n                this.hide();\r\n            }\r\n            // Fire internal `_selectionChangeDebounced` event to use it for showing\r\n            // the toolbar after the selection stops changing.\r\n            this._fireSelectionChangeDebounced();\r\n        });\r\n        // Show the toolbar when the selection stops changing.\r\n        this.listenTo(this, '_selectionChangeDebounced', () => {\r\n            if (this.editor.editing.view.document.isFocused) {\r\n                this.show();\r\n            }\r\n        });\r\n        if (!this._balloonConfig.shouldNotGroupWhenFull) {\r\n            this.listenTo(editor, 'ready', () => {\r\n                const editableElement = editor.ui.view.editable.element;\r\n                // Set #toolbarView's max-width on the initialization and update it on the editable resize.\r\n                this._resizeObserver = new ResizeObserver(editableElement, entry => {\r\n                    // The max-width equals 90% of the editable's width for the best user experience.\r\n                    // The value keeps the balloon very close to the boundaries of the editable and limits the cases\r\n                    // when the balloon juts out from the editable element it belongs to.\r\n                    this.toolbarView.maxWidth = toPx(entry.contentRect.width * .9);\r\n                });\r\n            });\r\n        }\r\n        // Listen to the toolbar view and whenever it changes its geometry due to some items being\r\n        // grouped or ungrouped, update the position of the balloon because a shorter/longer toolbar\r\n        // means the balloon could be pointing at the wrong place. Once updated, the balloon will point\r\n        // at the right selection in the content again.\r\n        // https://github.com/ckeditor/ckeditor5/issues/6444\r\n        this.listenTo(this.toolbarView, 'groupedItemsUpdate', () => {\r\n            this._updatePosition();\r\n        });\r\n    }\r\n    /**\r\n     * Creates toolbar components based on given configuration.\r\n     * This needs to be done when all plugins are ready.\r\n     */\r\n    afterInit() {\r\n        const factory = this.editor.ui.componentFactory;\r\n        this.toolbarView.fillFromConfig(this._balloonConfig, factory);\r\n    }\r\n    /**\r\n     * Creates the toolbar view instance.\r\n     */\r\n    _createToolbarView() {\r\n        const t = this.editor.locale.t;\r\n        const shouldGroupWhenFull = !this._balloonConfig.shouldNotGroupWhenFull;\r\n        const toolbarView = new ToolbarView(this.editor.locale, {\r\n            shouldGroupWhenFull,\r\n            isFloating: true\r\n        });\r\n        toolbarView.ariaLabel = t('Editor contextual toolbar');\r\n        toolbarView.render();\r\n        return toolbarView;\r\n    }\r\n    /**\r\n     * Shows the toolbar and attaches it to the selection.\r\n     *\r\n     * Fires {@link #event:show} event which can be stopped to prevent the toolbar from showing up.\r\n     *\r\n     * @param showForCollapsedSelection When set `true`, the toolbar will show despite collapsed selection in the\r\n     * editing view.\r\n     */\r\n    show(showForCollapsedSelection = false) {\r\n        const editor = this.editor;\r\n        const selection = editor.model.document.selection;\r\n        const schema = editor.model.schema;\r\n        // Do not add the toolbar to the balloon stack twice.\r\n        if (this._balloon.hasView(this.toolbarView)) {\r\n            return;\r\n        }\r\n        // Do not show the toolbar when the selection is collapsed.\r\n        if (selection.isCollapsed && !showForCollapsedSelection) {\r\n            return;\r\n        }\r\n        // Do not show the toolbar when there is more than one range in the selection and they fully contain selectable elements.\r\n        // See https://github.com/ckeditor/ckeditor5/issues/6443.\r\n        if (selectionContainsOnlyMultipleSelectables(selection, schema)) {\r\n            return;\r\n        }\r\n        // Don not show the toolbar when all components inside are disabled\r\n        // see https://github.com/ckeditor/ckeditor5-ui/issues/269.\r\n        if (Array.from(this.toolbarView.items).every((item) => item.isEnabled !== undefined && !item.isEnabled)) {\r\n            return;\r\n        }\r\n        // Update the toolbar position when the editor ui should be refreshed.\r\n        this.listenTo(this.editor.ui, 'update', () => {\r\n            this._updatePosition();\r\n        });\r\n        // Add the toolbar to the common editor contextual balloon.\r\n        this._balloon.add({\r\n            view: this.toolbarView,\r\n            position: this._getBalloonPositionData(),\r\n            balloonClassName: 'ck-toolbar-container'\r\n        });\r\n    }\r\n    /**\r\n     * Hides the toolbar.\r\n     */\r\n    hide() {\r\n        if (this._balloon.hasView(this.toolbarView)) {\r\n            this.stopListening(this.editor.ui, 'update');\r\n            this._balloon.remove(this.toolbarView);\r\n        }\r\n    }\r\n    /**\r\n     * Returns positioning options for the {@link #_balloon}. They control the way balloon is attached\r\n     * to the selection.\r\n     */\r\n    _getBalloonPositionData() {\r\n        const editor = this.editor;\r\n        const view = editor.editing.view;\r\n        const viewDocument = view.document;\r\n        const viewSelection = viewDocument.selection;\r\n        // Get direction of the selection.\r\n        const isBackward = viewDocument.selection.isBackward;\r\n        return {\r\n            // Because the target for BalloonPanelView is a Rect (not DOMRange), it's geometry will stay fixed\r\n            // as the window scrolls. To let the BalloonPanelView follow such Rect, is must be continuously\r\n            // computed and hence, the target is defined as a function instead of a static value.\r\n            // https://github.com/ckeditor/ckeditor5-ui/issues/195\r\n            target: () => {\r\n                const range = isBackward ? viewSelection.getFirstRange() : viewSelection.getLastRange();\r\n                const rangeRects = Rect.getDomRangeRects(view.domConverter.viewRangeToDom(range));\r\n                // Select the proper range rect depending on the direction of the selection.\r\n                if (isBackward) {\r\n                    return rangeRects[0];\r\n                }\r\n                else {\r\n                    // Ditch the zero-width \"orphan\" rect in the next line for the forward selection if there's\r\n                    // another one preceding it. It is not rendered as a selection by the web browser anyway.\r\n                    // https://github.com/ckeditor/ckeditor5-ui/issues/308\r\n                    if (rangeRects.length > 1 && rangeRects[rangeRects.length - 1].width === 0) {\r\n                        rangeRects.pop();\r\n                    }\r\n                    return rangeRects[rangeRects.length - 1];\r\n                }\r\n            },\r\n            positions: this._getBalloonPositions(isBackward)\r\n        };\r\n    }\r\n    /**\r\n     * Updates the position of the {@link #_balloon} to make up for changes:\r\n     *\r\n     * * in the geometry of the selection it is attached to (e.g. the selection moved in the viewport or expanded or shrunk),\r\n     * * or the geometry of the balloon toolbar itself (e.g. the toolbar has grouped or ungrouped some items and it is shorter or longer).\r\n     */\r\n    _updatePosition() {\r\n        this._balloon.updatePosition(this._getBalloonPositionData());\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        this.stopListening();\r\n        this._fireSelectionChangeDebounced.cancel();\r\n        this.toolbarView.destroy();\r\n        this.focusTracker.destroy();\r\n        if (this._resizeObserver) {\r\n            this._resizeObserver.destroy();\r\n        }\r\n    }\r\n    /**\r\n     * Returns toolbar positions for the given direction of the selection.\r\n     */\r\n    _getBalloonPositions(isBackward) {\r\n        const isSafariIniOS = env.isSafari && env.isiOS;\r\n        // https://github.com/ckeditor/ckeditor5/issues/7707\r\n        const positions = isSafariIniOS ? generatePositions({\r\n            // 20px when zoomed out. Less then 20px when zoomed in; the \"radius\" of the native selection handle gets\r\n            // smaller as the user zooms in. No less than the default v-offset, though.\r\n            heightOffset: Math.max(BalloonPanelView.arrowHeightOffset, Math.round(20 / global.window.visualViewport.scale))\r\n        }) : BalloonPanelView.defaultPositions;\r\n        return isBackward ? [\r\n            positions.northWestArrowSouth,\r\n            positions.northWestArrowSouthWest,\r\n            positions.northWestArrowSouthEast,\r\n            positions.northWestArrowSouthMiddleEast,\r\n            positions.northWestArrowSouthMiddleWest,\r\n            positions.southWestArrowNorth,\r\n            positions.southWestArrowNorthWest,\r\n            positions.southWestArrowNorthEast,\r\n            positions.southWestArrowNorthMiddleWest,\r\n            positions.southWestArrowNorthMiddleEast\r\n        ] : [\r\n            positions.southEastArrowNorth,\r\n            positions.southEastArrowNorthEast,\r\n            positions.southEastArrowNorthWest,\r\n            positions.southEastArrowNorthMiddleEast,\r\n            positions.southEastArrowNorthMiddleWest,\r\n            positions.northEastArrowSouth,\r\n            positions.northEastArrowSouthEast,\r\n            positions.northEastArrowSouthWest,\r\n            positions.northEastArrowSouthMiddleEast,\r\n            positions.northEastArrowSouthMiddleWest\r\n        ];\r\n    }\r\n}\r\n/**\r\n * Returns \"true\" when the selection has multiple ranges and each range contains a selectable element\r\n * and nothing else.\r\n */\r\nfunction selectionContainsOnlyMultipleSelectables(selection, schema) {\r\n    // It doesn't contain multiple objects if there is only one range.\r\n    if (selection.rangeCount === 1) {\r\n        return false;\r\n    }\r\n    return [...selection.getRanges()].every(range => {\r\n        const element = range.getContainedElement();\r\n        return element && schema.isSelectable(element);\r\n    });\r\n}\r\n","import api from \"!../../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../../css-loader/dist/cjs.js!../../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./blocktoolbar.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/toolbar/block/blockbuttonview\r\n */\r\nimport ButtonView from '../../button/buttonview';\r\nimport { toUnit } from '@ckeditor/ckeditor5-utils';\r\nimport '../../../theme/components/toolbar/blocktoolbar.css';\r\nconst toPx = toUnit('px');\r\n/**\r\n * The block button view class.\r\n *\r\n * This view represents a button attached next to block element where the selection is anchored.\r\n *\r\n * See {@link module:ui/toolbar/block/blocktoolbar~BlockToolbar}.\r\n */\r\nexport default class BlockButtonView extends ButtonView {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        const bind = this.bindTemplate;\r\n        // Hide button on init.\r\n        this.isVisible = false;\r\n        this.isToggleable = true;\r\n        this.set('top', 0);\r\n        this.set('left', 0);\r\n        this.extendTemplate({\r\n            attributes: {\r\n                class: 'ck-block-toolbar-button',\r\n                style: {\r\n                    top: bind.to('top', val => toPx(val)),\r\n                    left: bind.to('left', val => toPx(val))\r\n                }\r\n            }\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui/toolbar/block/blocktoolbar\r\n */\r\n/* global window */\r\nimport { Plugin, icons } from '@ckeditor/ckeditor5-core';\r\nimport { Rect, ResizeObserver, getOptimalPosition, toUnit } from '@ckeditor/ckeditor5-utils';\r\nimport BlockButtonView from './blockbuttonview';\r\nimport BalloonPanelView from '../../panel/balloon/balloonpanelview';\r\nimport ToolbarView from '../toolbarview';\r\nimport clickOutsideHandler from '../../bindings/clickoutsidehandler';\r\nimport normalizeToolbarConfig from '../normalizetoolbarconfig';\r\nconst toPx = toUnit('px');\r\nconst { pilcrow } = icons;\r\n/**\r\n * The block toolbar plugin.\r\n *\r\n * This plugin provides a button positioned next to the block of content where the selection is anchored.\r\n * Upon clicking the button, a dropdown providing access to editor features shows up, as configured in\r\n * {@link module:core/editor/editorconfig~EditorConfig#blockToolbar}.\r\n *\r\n * By default, the button is displayed next to all elements marked in {@link module:engine/model/schema~Schema}\r\n * as `$block` for which the toolbar provides at least one option.\r\n *\r\n * By default, the button is attached so its right boundary is touching the\r\n * {@link module:engine/view/editableelement~EditableElement}:\r\n *\r\n * ```\r\n *  __ |\r\n * |  ||  This is a block of content that the\r\n *  ¯¯ |  button is attached to. This is a\r\n *     |  block of content that the button is\r\n *     |  attached to.\r\n * ```\r\n *\r\n * The position of the button can be adjusted using the CSS `transform` property:\r\n *\r\n * ```css\r\n * .ck-block-toolbar-button {\r\n * \ttransform: translateX( -10px );\r\n * }\r\n * ```\r\n *\r\n * ```\r\n *  __   |\r\n * |  |  |  This is a block of content that the\r\n *  ¯¯   |  button is attached to. This is a\r\n *       |  block of content that the button is\r\n *       |  attached to.\r\n * ```\r\n *\r\n * **Note**: If you plan to run the editor in a right–to–left (RTL) language, keep in mind the button\r\n * will be attached to the **right** boundary of the editable area. In that case, make sure the\r\n * CSS position adjustment works properly by adding the following styles:\r\n *\r\n * ```css\r\n * .ck[dir=\"rtl\"] .ck-block-toolbar-button {\r\n * \ttransform: translateX( 10px );\r\n * }\r\n * ```\r\n */\r\nexport default class BlockToolbar extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'BlockToolbar';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        /**\r\n         * An instance of the resize observer that allows to respond to changes in editable's geometry\r\n         * so the toolbar can stay within its boundaries (and group toolbar items that do not fit).\r\n         *\r\n         * **Note**: Used only when `shouldNotGroupWhenFull` was **not** set in the\r\n         * {@link module:core/editor/editorconfig~EditorConfig#blockToolbar configuration}.\r\n         *\r\n         * **Note:** Created in {@link #afterInit}.\r\n         */\r\n        this._resizeObserver = null;\r\n        this._blockToolbarConfig = normalizeToolbarConfig(this.editor.config.get('blockToolbar'));\r\n        this.toolbarView = this._createToolbarView();\r\n        this.panelView = this._createPanelView();\r\n        this.buttonView = this._createButtonView();\r\n        // Close the #panelView upon clicking outside of the plugin UI.\r\n        clickOutsideHandler({\r\n            emitter: this.panelView,\r\n            contextElements: [this.panelView.element, this.buttonView.element],\r\n            activator: () => this.panelView.isVisible,\r\n            callback: () => this._hidePanel()\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        // Hides panel on a direct selection change.\r\n        this.listenTo(editor.model.document.selection, 'change:range', (evt, data) => {\r\n            if (data.directChange) {\r\n                this._hidePanel();\r\n            }\r\n        });\r\n        this.listenTo(editor.ui, 'update', () => this._updateButton());\r\n        // `low` priority is used because of https://github.com/ckeditor/ckeditor5-core/issues/133.\r\n        this.listenTo(editor, 'change:isReadOnly', () => this._updateButton(), { priority: 'low' });\r\n        this.listenTo(editor.ui.focusTracker, 'change:isFocused', () => this._updateButton());\r\n        // Reposition button on resize.\r\n        this.listenTo(this.buttonView, 'change:isVisible', (evt, name, isVisible) => {\r\n            if (isVisible) {\r\n                // Keep correct position of button and panel on window#resize.\r\n                this.buttonView.listenTo(window, 'resize', () => this._updateButton());\r\n            }\r\n            else {\r\n                // Stop repositioning button when is hidden.\r\n                this.buttonView.stopListening(window, 'resize');\r\n                // Hide the panel when the button disappears.\r\n                this._hidePanel();\r\n            }\r\n        });\r\n        // Register the toolbar so it becomes available for Alt+F10 and Esc navigation.\r\n        editor.ui.addToolbar(this.toolbarView, {\r\n            beforeFocus: () => this._showPanel(),\r\n            afterBlur: () => this._hidePanel()\r\n        });\r\n    }\r\n    /**\r\n     * Fills the toolbar with its items based on the configuration.\r\n     *\r\n     * **Note:** This needs to be done after all plugins are ready.\r\n     */\r\n    afterInit() {\r\n        this.toolbarView.fillFromConfig(this._blockToolbarConfig, this.editor.ui.componentFactory);\r\n        // Hide panel before executing each button in the panel.\r\n        for (const item of this.toolbarView.items) {\r\n            item.on('execute', () => this._hidePanel(true), { priority: 'high' });\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        // Destroy created UI components as they are not automatically destroyed (see ckeditor5#1341).\r\n        this.panelView.destroy();\r\n        this.buttonView.destroy();\r\n        this.toolbarView.destroy();\r\n        if (this._resizeObserver) {\r\n            this._resizeObserver.destroy();\r\n        }\r\n    }\r\n    /**\r\n     * Creates the {@link #toolbarView}.\r\n     */\r\n    _createToolbarView() {\r\n        const t = this.editor.locale.t;\r\n        const shouldGroupWhenFull = !this._blockToolbarConfig.shouldNotGroupWhenFull;\r\n        const toolbarView = new ToolbarView(this.editor.locale, {\r\n            shouldGroupWhenFull,\r\n            isFloating: true\r\n        });\r\n        toolbarView.ariaLabel = t('Editor block content toolbar');\r\n        return toolbarView;\r\n    }\r\n    /**\r\n     * Creates the {@link #panelView}.\r\n     */\r\n    _createPanelView() {\r\n        const editor = this.editor;\r\n        const panelView = new BalloonPanelView(editor.locale);\r\n        panelView.content.add(this.toolbarView);\r\n        panelView.class = 'ck-toolbar-container';\r\n        editor.ui.view.body.add(panelView);\r\n        editor.ui.focusTracker.add(panelView.element);\r\n        // Close #panelView on `Esc` press.\r\n        this.toolbarView.keystrokes.set('Esc', (evt, cancel) => {\r\n            this._hidePanel(true);\r\n            cancel();\r\n        });\r\n        return panelView;\r\n    }\r\n    /**\r\n     * Creates the {@link #buttonView}.\r\n     */\r\n    _createButtonView() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        const buttonView = new BlockButtonView(editor.locale);\r\n        buttonView.set({\r\n            label: t('Edit block'),\r\n            icon: pilcrow,\r\n            withText: false\r\n        });\r\n        // Bind the panelView observable properties to the buttonView.\r\n        buttonView.bind('isOn').to(this.panelView, 'isVisible');\r\n        buttonView.bind('tooltip').to(this.panelView, 'isVisible', isVisible => !isVisible);\r\n        // Toggle the panelView upon buttonView#execute.\r\n        this.listenTo(buttonView, 'execute', () => {\r\n            if (!this.panelView.isVisible) {\r\n                this._showPanel();\r\n            }\r\n            else {\r\n                this._hidePanel(true);\r\n            }\r\n        });\r\n        editor.ui.view.body.add(buttonView);\r\n        editor.ui.focusTracker.add(buttonView.element);\r\n        return buttonView;\r\n    }\r\n    /**\r\n     * Shows or hides the button.\r\n     * When all the conditions for displaying the button are matched, it shows the button. Hides otherwise.\r\n     */\r\n    _updateButton() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const view = editor.editing.view;\r\n        // Hides the button when the editor is not focused.\r\n        if (!editor.ui.focusTracker.isFocused) {\r\n            this._hideButton();\r\n            return;\r\n        }\r\n        // Hides the button when the selection is in non-editable place.\r\n        if (!editor.model.canEditAt(editor.model.document.selection)) {\r\n            this._hideButton();\r\n            return;\r\n        }\r\n        // Get the first selected block, button will be attached to this element.\r\n        const modelTarget = Array.from(model.document.selection.getSelectedBlocks())[0];\r\n        // Hides the button when there is no enabled item in toolbar for the current block element.\r\n        if (!modelTarget || Array.from(this.toolbarView.items).every((item) => !item.isEnabled)) {\r\n            this._hideButton();\r\n            return;\r\n        }\r\n        // Get DOM target element.\r\n        const domTarget = view.domConverter.mapViewToDom(editor.editing.mapper.toViewElement(modelTarget));\r\n        // Show block button.\r\n        this.buttonView.isVisible = true;\r\n        // Make sure that the block toolbar panel is resized properly.\r\n        this._setupToolbarResize();\r\n        // Attach block button to target DOM element.\r\n        this._attachButtonToElement(domTarget);\r\n        // When panel is opened then refresh it position to be properly aligned with block button.\r\n        if (this.panelView.isVisible) {\r\n            this._showPanel();\r\n        }\r\n    }\r\n    /**\r\n     * Hides the button.\r\n     */\r\n    _hideButton() {\r\n        this.buttonView.isVisible = false;\r\n    }\r\n    /**\r\n     * Shows the {@link #toolbarView} attached to the {@link #buttonView}.\r\n     * If the toolbar is already visible, then it simply repositions it.\r\n     */\r\n    _showPanel() {\r\n        // Usually, the only way to show the toolbar is by pressing the block button. It makes it impossible for\r\n        // the toolbar to show up when the button is invisible (feature does not make sense for the selection then).\r\n        // The toolbar navigation using Alt+F10 does not access the button but shows the panel directly using this method.\r\n        // So we need to check whether this is possible first.\r\n        if (!this.buttonView.isVisible) {\r\n            return;\r\n        }\r\n        const wasVisible = this.panelView.isVisible;\r\n        // So here's the thing: If there was no initial panelView#show() or these two were in different order, the toolbar\r\n        // positioning will break in RTL editors. Weird, right? What you show know is that the toolbar\r\n        // grouping works thanks to:\r\n        //\r\n        // * the ResizeObserver, which kicks in as soon as the toolbar shows up in DOM (becomes visible again).\r\n        // * the observable ToolbarView#maxWidth, which triggers re-grouping when changed.\r\n        //\r\n        // Here are the possible scenarios:\r\n        //\r\n        // 1. (WRONG ❌) If the #maxWidth is set when the toolbar is invisible, it won't affect item grouping (no DOMRects, no grouping).\r\n        //    Then, when panelView.pin() is called, the position of the toolbar will be calculated for the old\r\n        //    items grouping state, and when finally ResizeObserver kicks in (hey, the toolbar is visible now, right?)\r\n        //    it will group/ungroup some items and the length of the toolbar will change. But since in RTL the toolbar\r\n        //    is attached on the right side and the positioning uses CSS \"left\", it will result in the toolbar shifting\r\n        //    to the left and being displayed in the wrong place.\r\n        // 2. (WRONG ❌) If the panelView.pin() is called first and #maxWidth set next, then basically the story repeats. The balloon\r\n        //    calculates the position for the old toolbar grouping state, then the toolbar re-groups items and because\r\n        //    it is positioned using CSS \"left\" it will move.\r\n        // 3. (RIGHT ✅) We show the panel first (the toolbar does re-grouping but it does not matter), then the #maxWidth\r\n        //    is set allowing the toolbar to re-group again and finally panelView.pin() does the positioning when the\r\n        //    items grouping state is stable and final.\r\n        //\r\n        // https://github.com/ckeditor/ckeditor5/issues/6449, https://github.com/ckeditor/ckeditor5/issues/6575\r\n        this.panelView.show();\r\n        const editableElement = this._getSelectedEditableElement();\r\n        this.toolbarView.maxWidth = this._getToolbarMaxWidth(editableElement);\r\n        this.panelView.pin({\r\n            target: this.buttonView.element,\r\n            limiter: editableElement\r\n        });\r\n        if (!wasVisible) {\r\n            this.toolbarView.items.get(0).focus();\r\n        }\r\n    }\r\n    /**\r\n     * Returns currently selected editable, based on the model selection.\r\n     */\r\n    _getSelectedEditableElement() {\r\n        const selectedModelRootName = this.editor.model.document.selection.getFirstRange().root.rootName;\r\n        return this.editor.ui.getEditableElement(selectedModelRootName);\r\n    }\r\n    /**\r\n     * Hides the {@link #toolbarView}.\r\n     *\r\n     * @param focusEditable When `true`, the editable will be focused after hiding the panel.\r\n     */\r\n    _hidePanel(focusEditable) {\r\n        this.panelView.isVisible = false;\r\n        if (focusEditable) {\r\n            this.editor.editing.view.focus();\r\n        }\r\n    }\r\n    /**\r\n     * Attaches the {@link #buttonView} to the target block of content.\r\n     *\r\n     * @param targetElement Target element.\r\n     */\r\n    _attachButtonToElement(targetElement) {\r\n        const contentStyles = window.getComputedStyle(targetElement);\r\n        const editableRect = new Rect(this._getSelectedEditableElement());\r\n        const contentPaddingTop = parseInt(contentStyles.paddingTop, 10);\r\n        // When line height is not an integer then treat it as \"normal\".\r\n        // MDN says that 'normal' == ~1.2 on desktop browsers.\r\n        const contentLineHeight = parseInt(contentStyles.lineHeight, 10) || parseInt(contentStyles.fontSize, 10) * 1.2;\r\n        const position = getOptimalPosition({\r\n            element: this.buttonView.element,\r\n            target: targetElement,\r\n            positions: [\r\n                (contentRect, buttonRect) => {\r\n                    let left;\r\n                    if (this.editor.locale.uiLanguageDirection === 'ltr') {\r\n                        left = editableRect.left - buttonRect.width;\r\n                    }\r\n                    else {\r\n                        left = editableRect.right;\r\n                    }\r\n                    return {\r\n                        top: contentRect.top + contentPaddingTop + (contentLineHeight - buttonRect.height) / 2,\r\n                        left\r\n                    };\r\n                }\r\n            ]\r\n        });\r\n        this.buttonView.top = position.top;\r\n        this.buttonView.left = position.left;\r\n    }\r\n    /**\r\n     * Creates a resize observer that observes selected editable and resizes the toolbar panel accordingly.\r\n     */\r\n    _setupToolbarResize() {\r\n        const editableElement = this._getSelectedEditableElement();\r\n        // Do this only if the automatic grouping is turned on.\r\n        if (!this._blockToolbarConfig.shouldNotGroupWhenFull) {\r\n            // If resize observer is attached to a different editable than currently selected editable, re-attach it.\r\n            if (this._resizeObserver && this._resizeObserver.element !== editableElement) {\r\n                this._resizeObserver.destroy();\r\n                this._resizeObserver = null;\r\n            }\r\n            if (!this._resizeObserver) {\r\n                this._resizeObserver = new ResizeObserver(editableElement, () => {\r\n                    this.toolbarView.maxWidth = this._getToolbarMaxWidth(editableElement);\r\n                });\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Gets the {@link #toolbarView} max-width, based on given `editableElement` width plus the distance between the farthest\r\n     * edge of the {@link #buttonView} and the editable.\r\n     *\r\n     * @returns A maximum width that toolbar can have, in pixels.\r\n     */\r\n    _getToolbarMaxWidth(editableElement) {\r\n        const editableRect = new Rect(editableElement);\r\n        const buttonRect = new Rect(this.buttonView.element);\r\n        const isRTL = this.editor.locale.uiLanguageDirection === 'rtl';\r\n        const offset = isRTL ? (buttonRect.left - editableRect.right) + buttonRect.width : editableRect.left - buttonRect.left;\r\n        return toPx(editableRect.width + offset);\r\n    }\r\n}\r\n","export default \"<svg viewBox=\\\"0 0 20 20\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M10.209 18.717A8.5 8.5 0 1 1 18.686 9.6h-.008l.002.12a3 3 0 0 1-2.866 2.997h-.268l-.046-.002v.002h-4.791a2 2 0 1 0 0 4 1 1 0 1 1-.128 1.992 8.665 8.665 0 0 1-.372.008Zm-3.918-7.01a1.25 1.25 0 1 0-2.415-.648 1.25 1.25 0 0 0 2.415.647ZM5.723 8.18a1.25 1.25 0 1 0 .647-2.414 1.25 1.25 0 0 0-.647 2.414ZM9.76 6.155a1.25 1.25 0 1 0 .647-2.415 1.25 1.25 0 0 0-.647 2.415Zm4.028 1.759a1.25 1.25 0 1 0 .647-2.415 1.25 1.25 0 0 0-.647 2.415Z\\\"/></svg>\";","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module ui\r\n */\r\nexport { default as clickOutsideHandler } from './bindings/clickoutsidehandler';\r\nexport { default as injectCssTransitionDisabler } from './bindings/injectcsstransitiondisabler';\r\nexport { default as CssTransitionDisablerMixin } from './bindings/csstransitiondisablermixin';\r\nexport { default as submitHandler } from './bindings/submithandler';\r\nexport { default as addKeyboardHandlingForGrid } from './bindings/addkeyboardhandlingforgrid';\r\nexport { default as BodyCollection } from './editorui/bodycollection';\r\nexport { default as ButtonView } from './button/buttonview';\r\nexport { default as SwitchButtonView } from './button/switchbuttonview';\r\nexport * from './colorgrid/utils';\r\nexport { default as ColorGridView } from './colorgrid/colorgridview';\r\nexport { default as ColorTileView } from './colorgrid/colortileview';\r\nexport { default as ColorPickerView } from './colorpicker/colorpickerview';\r\nexport { default as ComponentFactory } from './componentfactory';\r\nexport { default as DropdownView } from './dropdown/dropdownview';\r\nexport { default as DropdownPanelView } from './dropdown/dropdownpanelview';\r\nexport { default as DropdownButtonView } from './dropdown/button/dropdownbuttonview';\r\nexport { default as SplitButtonView } from './dropdown/button/splitbuttonview';\r\nexport * from './dropdown/utils';\r\nexport { default as EditorUI } from './editorui/editorui';\r\nexport { default as EditorUIView } from './editorui/editoruiview';\r\nexport { default as BoxedEditorUIView } from './editorui/boxed/boxededitoruiview';\r\nexport { default as InlineEditableUIView } from './editableui/inline/inlineeditableuiview';\r\nexport { default as FormHeaderView } from './formheader/formheaderview';\r\nexport { default as FocusCycler } from './focuscycler';\r\nexport { default as IconView } from './icon/iconview';\r\nexport { default as InputView } from './input/inputview';\r\nexport { default as InputTextView } from './inputtext/inputtextview';\r\nexport { default as InputNumberView } from './inputnumber/inputnumberview';\r\nexport { default as IframeView } from './iframe/iframeview';\r\nexport { default as LabelView } from './label/labelview';\r\nexport { default as LabeledFieldView } from './labeledfield/labeledfieldview';\r\nexport * from './labeledfield/utils';\r\nexport { default as ListItemView } from './list/listitemview';\r\nexport { default as ListView } from './list/listview';\r\nexport { default as Notification } from './notification/notification';\r\nexport { default as Model } from './model';\r\nexport { default as BalloonPanelView } from './panel/balloon/balloonpanelview';\r\nexport { default as ContextualBalloon } from './panel/balloon/contextualballoon';\r\nexport { default as StickyPanelView } from './panel/sticky/stickypanelview';\r\nexport { default as TooltipManager } from './tooltipmanager';\r\nexport { default as Template } from './template';\r\nexport { default as ToolbarView } from './toolbar/toolbarview';\r\nexport { default as ToolbarLineBreakView } from './toolbar/toolbarlinebreakview';\r\nexport { default as ToolbarSeparatorView } from './toolbar/toolbarseparatorview';\r\nexport { default as normalizeToolbarConfig } from './toolbar/normalizetoolbarconfig';\r\nexport { default as BalloonToolbar } from './toolbar/balloon/balloontoolbar';\r\nexport { default as BlockToolbar } from './toolbar/block/blocktoolbar';\r\nexport { default as View } from './view';\r\nexport { default as ViewCollection } from './viewcollection';\r\nimport { default as colorPaletteIcon } from '../theme/icons/color-palette.svg';\r\nexport const icons = {\r\n    colorPaletteIcon\r\n};\r\nimport './augmentation';\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { EditorUI, normalizeToolbarConfig } from 'ckeditor5/src/ui';\r\nimport { enablePlaceholder } from 'ckeditor5/src/engine';\r\nimport { ElementReplacer, Rect } from 'ckeditor5/src/utils';\r\n/**\r\n * The classic editor UI class.\r\n */\r\nexport default class ClassicEditorUI extends EditorUI {\r\n    /**\r\n     * Creates an instance of the classic editor UI class.\r\n     *\r\n     * @param editor The editor instance.\r\n     * @param view The view of the UI.\r\n     */\r\n    constructor(editor, view) {\r\n        super(editor);\r\n        this.view = view;\r\n        this._toolbarConfig = normalizeToolbarConfig(editor.config.get('toolbar'));\r\n        this._elementReplacer = new ElementReplacer();\r\n        this.listenTo(editor.editing.view, 'scrollToTheSelection', this._handleScrollToTheSelectionWithStickyPanel.bind(this));\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    get element() {\r\n        return this.view.element;\r\n    }\r\n    /**\r\n     * Initializes the UI.\r\n     *\r\n     * @param replacementElement The DOM element that will be the source for the created editor.\r\n     */\r\n    init(replacementElement) {\r\n        const editor = this.editor;\r\n        const view = this.view;\r\n        const editingView = editor.editing.view;\r\n        const editable = view.editable;\r\n        const editingRoot = editingView.document.getRoot();\r\n        // The editable UI and editing root should share the same name. Then name is used\r\n        // to recognize the particular editable, for instance in ARIA attributes.\r\n        editable.name = editingRoot.rootName;\r\n        view.render();\r\n        // The editable UI element in DOM is available for sure only after the editor UI view has been rendered.\r\n        // But it can be available earlier if a DOM element has been passed to BalloonEditor.create().\r\n        const editableElement = editable.element;\r\n        // Register the editable UI view in the editor. A single editor instance can aggregate multiple\r\n        // editable areas (roots) but the classic editor has only one.\r\n        this.setEditableElement(editable.name, editableElement);\r\n        // Let the editable UI element respond to the changes in the global editor focus\r\n        // tracker. It has been added to the same tracker a few lines above but, in reality, there are\r\n        // many focusable areas in the editor, like balloons, toolbars or dropdowns and as long\r\n        // as they have focus, the editable should act like it is focused too (although technically\r\n        // it isn't), e.g. by setting the proper CSS class, visually announcing focus to the user.\r\n        // Doing otherwise will result in editable focus styles disappearing, once e.g. the\r\n        // toolbar gets focused.\r\n        view.editable.bind('isFocused').to(this.focusTracker);\r\n        // Bind the editable UI element to the editing view, making it an end– and entry–point\r\n        // of the editor's engine. This is where the engine meets the UI.\r\n        editingView.attachDomRoot(editableElement);\r\n        // If an element containing the initial data of the editor was provided, replace it with\r\n        // an editor instance's UI in DOM until the editor is destroyed. For instance, a <textarea>\r\n        // can be such element.\r\n        if (replacementElement) {\r\n            this._elementReplacer.replace(replacementElement, this.element);\r\n        }\r\n        this._initPlaceholder();\r\n        this._initToolbar();\r\n        this.fire('ready');\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        const view = this.view;\r\n        const editingView = this.editor.editing.view;\r\n        this._elementReplacer.restore();\r\n        editingView.detachDomRoot(view.editable.name);\r\n        view.destroy();\r\n    }\r\n    /**\r\n     * Initializes the editor toolbar.\r\n     */\r\n    _initToolbar() {\r\n        const view = this.view;\r\n        // Set–up the sticky panel with toolbar.\r\n        view.stickyPanel.bind('isActive').to(this.focusTracker, 'isFocused');\r\n        view.stickyPanel.limiterElement = view.element;\r\n        view.stickyPanel.bind('viewportTopOffset').to(this, 'viewportOffset', ({ top }) => top || 0);\r\n        view.toolbar.fillFromConfig(this._toolbarConfig, this.componentFactory);\r\n        // Register the toolbar so it becomes available for Alt+F10 and Esc navigation.\r\n        this.addToolbar(view.toolbar);\r\n    }\r\n    /**\r\n     * Enable the placeholder text on the editing root, if any was configured.\r\n     */\r\n    _initPlaceholder() {\r\n        const editor = this.editor;\r\n        const editingView = editor.editing.view;\r\n        const editingRoot = editingView.document.getRoot();\r\n        const sourceElement = editor.sourceElement;\r\n        let placeholderText;\r\n        const placeholder = editor.config.get('placeholder');\r\n        if (placeholder) {\r\n            placeholderText = typeof placeholder === 'string' ? placeholder : placeholder[this.view.editable.name];\r\n        }\r\n        if (!placeholderText && sourceElement && sourceElement.tagName.toLowerCase() === 'textarea') {\r\n            placeholderText = sourceElement.getAttribute('placeholder');\r\n        }\r\n        if (placeholderText) {\r\n            enablePlaceholder({\r\n                view: editingView,\r\n                element: editingRoot,\r\n                text: placeholderText,\r\n                isDirectHost: false,\r\n                keepOnFocus: true\r\n            });\r\n        }\r\n    }\r\n    /**\r\n     * Provides an integration between the sticky toolbar and {@link module:utils/dom/scroll~scrollViewportToShowTarget}.\r\n     * It allows the UI-agnostic engine method to consider the geometry of the\r\n     * {@link module:editor-classic/classiceditoruiview~ClassicEditorUIView#stickyPanel} that pins to the\r\n     * edge of the viewport and can obscure the user caret after scrolling the window.\r\n     *\r\n     * @param evt The `scrollToTheSelection` event info.\r\n     * @param data The payload carried by the `scrollToTheSelection` event.\r\n     * @param originalArgs The original arguments passed to `scrollViewportToShowTarget()` method (see implementation to learn more).\r\n     */\r\n    _handleScrollToTheSelectionWithStickyPanel(evt, data, originalArgs) {\r\n        const stickyPanel = this.view.stickyPanel;\r\n        if (stickyPanel.isSticky) {\r\n            const stickyPanelHeight = new Rect(stickyPanel.element).height;\r\n            data.viewportOffset.top += stickyPanelHeight;\r\n        }\r\n        else {\r\n            const scrollViewportOnPanelGettingSticky = () => {\r\n                this.editor.editing.view.scrollToTheSelection(originalArgs);\r\n            };\r\n            this.listenTo(stickyPanel, 'change:isSticky', scrollViewportOnPanelGettingSticky);\r\n            // This works as a post-scroll-fixer because it's impossible predict whether the panel will be sticky after scrolling or not.\r\n            // Listen for a short period of time only and if the toolbar does not become sticky very soon, cancel the listener.\r\n            setTimeout(() => {\r\n                this.stopListening(stickyPanel, 'change:isSticky', scrollViewportOnPanelGettingSticky);\r\n            }, 20);\r\n        }\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./classiceditor.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module editor-classic/classiceditoruiview\r\n */\r\nimport { BoxedEditorUIView, InlineEditableUIView, StickyPanelView, ToolbarView } from 'ckeditor5/src/ui';\r\nimport '../theme/classiceditor.css';\r\n/**\r\n * Classic editor UI view. Uses an inline editable and a sticky toolbar, all\r\n * enclosed in a boxed UI view.\r\n */\r\nexport default class ClassicEditorUIView extends BoxedEditorUIView {\r\n    /**\r\n     * Creates an instance of the classic editor UI view.\r\n     *\r\n     * @param locale The {@link module:core/editor/editor~Editor#locale} instance.\r\n     * @param editingView The editing view instance this view is related to.\r\n     * @param options Configuration options for the view instance.\r\n     * @param options.shouldToolbarGroupWhenFull When set `true` enables automatic items grouping\r\n     * in the main {@link module:editor-classic/classiceditoruiview~ClassicEditorUIView#toolbar toolbar}.\r\n     * See {@link module:ui/toolbar/toolbarview~ToolbarOptions#shouldGroupWhenFull} to learn more.\r\n     */\r\n    constructor(locale, editingView, options = {}) {\r\n        super(locale);\r\n        this.stickyPanel = new StickyPanelView(locale);\r\n        this.toolbar = new ToolbarView(locale, {\r\n            shouldGroupWhenFull: options.shouldToolbarGroupWhenFull\r\n        });\r\n        this.editable = new InlineEditableUIView(locale, editingView);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        // Set toolbar as a child of a stickyPanel and makes toolbar sticky.\r\n        this.stickyPanel.content.add(this.toolbar);\r\n        this.top.add(this.stickyPanel);\r\n        this.main.add(this.editable);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * An abstract watchdog class that handles most of the error handling process and the state of the underlying component.\r\n *\r\n * See the {@glink features/watchdog Watchdog feature guide} to learn the rationale behind it and how to use it.\r\n *\r\n * @internal\r\n */\r\nexport default class Watchdog {\r\n    /**\r\n     * @param {module:watchdog/watchdog~WatchdogConfig} config The watchdog plugin configuration.\r\n     */\r\n    constructor(config) {\r\n        /**\r\n         * An array of crashes saved as an object with the following properties:\r\n         *\r\n         * * `message`: `String`,\r\n         * * `stack`: `String`,\r\n         * * `date`: `Number`,\r\n         * * `filename`: `String | undefined`,\r\n         * * `lineno`: `Number | undefined`,\r\n         * * `colno`: `Number | undefined`,\r\n         */\r\n        this.crashes = [];\r\n        /**\r\n         * Specifies the state of the item watched by the watchdog. The state can be one of the following values:\r\n         *\r\n         * * `initializing` &ndash; Before the first initialization, and after crashes, before the item is ready.\r\n         * * `ready` &ndash; A state when the user can interact with the item.\r\n         * * `crashed` &ndash; A state when an error occurs. It quickly changes to `initializing` or `crashedPermanently`\r\n         * depending on how many and how frequent errors have been caught recently.\r\n         * * `crashedPermanently` &ndash; A state when the watchdog stops reacting to errors and keeps the item it is watching crashed,\r\n         * * `destroyed` &ndash; A state when the item is manually destroyed by the user after calling `watchdog.destroy()`.\r\n         */\r\n        this.state = 'initializing';\r\n        /**\r\n         * Returns the result of the `Date.now()` call. It can be overridden in tests to mock time as some popular\r\n         * approaches like `sinon.useFakeTimers()` do not work well with error handling.\r\n         */\r\n        this._now = Date.now;\r\n        this.crashes = [];\r\n        this._crashNumberLimit = typeof config.crashNumberLimit === 'number' ? config.crashNumberLimit : 3;\r\n        this._minimumNonErrorTimePeriod = typeof config.minimumNonErrorTimePeriod === 'number' ? config.minimumNonErrorTimePeriod : 5000;\r\n        this._boundErrorHandler = evt => {\r\n            // `evt.error` is exposed by EventError while `evt.reason` is available in PromiseRejectionEvent.\r\n            const error = 'error' in evt ? evt.error : evt.reason;\r\n            // Note that `evt.reason` might be everything that is in the promise rejection.\r\n            // Similarly everything that is thrown lands in `evt.error`.\r\n            if (error instanceof Error) {\r\n                this._handleError(error, evt);\r\n            }\r\n        };\r\n        this._listeners = {};\r\n        if (!this._restart) {\r\n            throw new Error('The Watchdog class was split into the abstract `Watchdog` class and the `EditorWatchdog` class. ' +\r\n                'Please, use `EditorWatchdog` if you have used the `Watchdog` class previously.');\r\n        }\r\n    }\r\n    /**\r\n     * Destroys the watchdog and releases the resources.\r\n     */\r\n    destroy() {\r\n        this._stopErrorHandling();\r\n        this._listeners = {};\r\n    }\r\n    /**\r\n     * Starts listening to a specific event name by registering a callback that will be executed\r\n     * whenever an event with a given name fires.\r\n     *\r\n     * Note that this method differs from the CKEditor 5's default `EventEmitterMixin` implementation.\r\n     *\r\n     * @param eventName The event name.\r\n     * @param callback A callback which will be added to event listeners.\r\n     */\r\n    on(eventName, callback) {\r\n        if (!this._listeners[eventName]) {\r\n            this._listeners[eventName] = [];\r\n        }\r\n        this._listeners[eventName].push(callback);\r\n    }\r\n    /**\r\n     * Stops listening to the specified event name by removing the callback from event listeners.\r\n     *\r\n     * Note that this method differs from the CKEditor 5's default `EventEmitterMixin` implementation.\r\n     *\r\n     * @param eventName The event name.\r\n     * @param callback A callback which will be removed from event listeners.\r\n     */\r\n    off(eventName, callback) {\r\n        this._listeners[eventName] = this._listeners[eventName]\r\n            .filter(cb => cb !== callback);\r\n    }\r\n    /**\r\n     * Fires an event with a given event name and arguments.\r\n     *\r\n     * Note that this method differs from the CKEditor 5's default `EventEmitterMixin` implementation.\r\n     */\r\n    _fire(eventName, ...args) {\r\n        const callbacks = this._listeners[eventName] || [];\r\n        for (const callback of callbacks) {\r\n            callback.apply(this, [null, ...args]);\r\n        }\r\n    }\r\n    /**\r\n     * Starts error handling by attaching global error handlers.\r\n     */\r\n    _startErrorHandling() {\r\n        window.addEventListener('error', this._boundErrorHandler);\r\n        window.addEventListener('unhandledrejection', this._boundErrorHandler);\r\n    }\r\n    /**\r\n     * Stops error handling by detaching global error handlers.\r\n     */\r\n    _stopErrorHandling() {\r\n        window.removeEventListener('error', this._boundErrorHandler);\r\n        window.removeEventListener('unhandledrejection', this._boundErrorHandler);\r\n    }\r\n    /**\r\n     * Checks if an error comes from the watched item and restarts it.\r\n     * It reacts to {@link module:utils/ckeditorerror~CKEditorError `CKEditorError` errors} only.\r\n     *\r\n     * @fires error\r\n     * @param error Error.\r\n     * @param evt An error event.\r\n     */\r\n    _handleError(error, evt) {\r\n        // @if CK_DEBUG // const err = error as CKEditorError;\r\n        // @if CK_DEBUG // if ( err.is && err.is( 'CKEditorError' ) && err.context === undefined ) {\r\n        // @if CK_DEBUG // console.warn( 'The error is missing its context and Watchdog cannot restart the proper item.' );\r\n        // @if CK_DEBUG // }\r\n        if (this._shouldReactToError(error)) {\r\n            this.crashes.push({\r\n                message: error.message,\r\n                stack: error.stack,\r\n                // `evt.filename`, `evt.lineno` and `evt.colno` are available only in ErrorEvent events\r\n                filename: evt instanceof ErrorEvent ? evt.filename : undefined,\r\n                lineno: evt instanceof ErrorEvent ? evt.lineno : undefined,\r\n                colno: evt instanceof ErrorEvent ? evt.colno : undefined,\r\n                date: this._now()\r\n            });\r\n            const causesRestart = this._shouldRestart();\r\n            this.state = 'crashed';\r\n            this._fire('stateChange');\r\n            this._fire('error', { error, causesRestart });\r\n            if (causesRestart) {\r\n                this._restart();\r\n            }\r\n            else {\r\n                this.state = 'crashedPermanently';\r\n                this._fire('stateChange');\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Checks whether an error should be handled by the watchdog.\r\n     *\r\n     * @param error An error that was caught by the error handling process.\r\n     */\r\n    _shouldReactToError(error) {\r\n        return (error.is &&\r\n            error.is('CKEditorError') &&\r\n            error.context !== undefined &&\r\n            // In some cases the watched item should not be restarted - e.g. during the item initialization.\r\n            // That's why the `null` was introduced as a correct error context which does cause restarting.\r\n            error.context !== null &&\r\n            // Do not react to errors if the watchdog is in states other than `ready`.\r\n            this.state === 'ready' &&\r\n            this._isErrorComingFromThisItem(error));\r\n    }\r\n    /**\r\n     * Checks if the watchdog should restart the underlying item.\r\n     */\r\n    _shouldRestart() {\r\n        if (this.crashes.length <= this._crashNumberLimit) {\r\n            return true;\r\n        }\r\n        const lastErrorTime = this.crashes[this.crashes.length - 1].date;\r\n        const firstMeaningfulErrorTime = this.crashes[this.crashes.length - 1 - this._crashNumberLimit].date;\r\n        const averageNonErrorTimePeriod = (lastErrorTime - firstMeaningfulErrorTime) / this._crashNumberLimit;\r\n        return averageNonErrorTimePeriod > this._minimumNonErrorTimePeriod;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module watchdog/utils/getsubnodes\r\n */\r\n/* globals EventTarget, Event */\r\nexport default function getSubNodes(head, excludedProperties = new Set()) {\r\n    const nodes = [head];\r\n    // @if CK_DEBUG_WATCHDOG // const prevNodeMap = new Map();\r\n    // Nodes are stored to prevent infinite looping.\r\n    const subNodes = new Set();\r\n    let nodeIndex = 0;\r\n    while (nodes.length > nodeIndex) {\r\n        // Incrementing the iterator is much faster than changing size of the array with Array.prototype.shift().\r\n        const node = nodes[nodeIndex++];\r\n        if (subNodes.has(node) || !shouldNodeBeIncluded(node) || excludedProperties.has(node)) {\r\n            continue;\r\n        }\r\n        subNodes.add(node);\r\n        // Handle arrays, maps, sets, custom collections that implements `[ Symbol.iterator ]()`, etc.\r\n        if (Symbol.iterator in node) {\r\n            // The custom editor iterators might cause some problems if the editor is crashed.\r\n            try {\r\n                for (const n of node) {\r\n                    nodes.push(n);\r\n                    // @if CK_DEBUG_WATCHDOG // if ( !prevNodeMap.has( n ) ) {\r\n                    // @if CK_DEBUG_WATCHDOG // \tprevNodeMap.set( n, node );\r\n                    // @if CK_DEBUG_WATCHDOG // }\r\n                }\r\n            }\r\n            catch (err) {\r\n                // Do not log errors for broken structures\r\n                // since we are in the error handling process already.\r\n                // eslint-disable-line no-empty\r\n            }\r\n        }\r\n        else {\r\n            for (const key in node) {\r\n                // We share a reference via the protobuf library within the editors,\r\n                // hence the shared value should be skipped. Although, it's not a perfect\r\n                // solution since new places like that might occur in the future.\r\n                if (key === 'defaultValue') {\r\n                    continue;\r\n                }\r\n                nodes.push(node[key]);\r\n                // @if CK_DEBUG_WATCHDOG // if ( !prevNodeMap.has( node[ key ] ) ) {\r\n                // @if CK_DEBUG_WATCHDOG // \tprevNodeMap.set( node[ key ], node );\r\n                // @if CK_DEBUG_WATCHDOG // }\r\n            }\r\n        }\r\n    }\r\n    // @if CK_DEBUG_WATCHDOG // return { subNodes, prevNodeMap } as any;\r\n    return subNodes;\r\n}\r\nfunction shouldNodeBeIncluded(node) {\r\n    const type = Object.prototype.toString.call(node);\r\n    const typeOfNode = typeof node;\r\n    return !(typeOfNode === 'number' ||\r\n        typeOfNode === 'boolean' ||\r\n        typeOfNode === 'string' ||\r\n        typeOfNode === 'symbol' ||\r\n        typeOfNode === 'function' ||\r\n        type === '[object Date]' ||\r\n        type === '[object RegExp]' ||\r\n        type === '[object Module]' ||\r\n        node === undefined ||\r\n        node === null ||\r\n        // This flag is meant to exclude singletons shared across editor instances. So when an error is thrown in one editor,\r\n        // the other editors connected through the reference to the same singleton are not restarted. This is a temporary workaround\r\n        // until a better solution is found.\r\n        // More in https://github.com/ckeditor/ckeditor5/issues/12292.\r\n        node._watchdogExcluded ||\r\n        // Skip native DOM objects, e.g. Window, nodes, events, etc.\r\n        node instanceof EventTarget ||\r\n        node instanceof Event);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module watchdog/utils/areconnectedthroughproperties\r\n */\r\n/* globals console */\r\nimport getSubNodes from './getsubnodes';\r\n/**\r\n * Traverses both structures to find out whether there is a reference that is shared between both structures.\r\n */\r\nexport default function areConnectedThroughProperties(target1, target2, excludedNodes = new Set()) {\r\n    if (target1 === target2 && isObject(target1)) {\r\n        return true;\r\n    }\r\n    // @if CK_DEBUG_WATCHDOG // return checkConnectionBetweenProps( target1, target2, excludedNodes );\r\n    const subNodes1 = getSubNodes(target1, excludedNodes);\r\n    const subNodes2 = getSubNodes(target2, excludedNodes);\r\n    for (const node of subNodes1) {\r\n        if (subNodes2.has(node)) {\r\n            return true;\r\n        }\r\n    }\r\n    return false;\r\n}\r\n/* istanbul ignore next -- @preserve */\r\n// eslint-disable-next-line\r\nfunction checkConnectionBetweenProps(target1, target2, excludedNodes) {\r\n    const { subNodes: subNodes1, prevNodeMap: prevNodeMap1 } = getSubNodes(target1, excludedNodes.subNodes);\r\n    const { subNodes: subNodes2, prevNodeMap: prevNodeMap2 } = getSubNodes(target2, excludedNodes.subNodes);\r\n    for (const sharedNode of subNodes1) {\r\n        if (subNodes2.has(sharedNode)) {\r\n            const connection = [];\r\n            connection.push(sharedNode);\r\n            let node = prevNodeMap1.get(sharedNode);\r\n            while (node && node !== target1) {\r\n                connection.push(node);\r\n                node = prevNodeMap1.get(node);\r\n            }\r\n            node = prevNodeMap2.get(sharedNode);\r\n            while (node && node !== target2) {\r\n                connection.unshift(node);\r\n                node = prevNodeMap2.get(node);\r\n            }\r\n            console.log('--------');\r\n            console.log({ target1 });\r\n            console.log({ sharedNode });\r\n            console.log({ target2 });\r\n            console.log({ connection });\r\n            return true;\r\n        }\r\n    }\r\n    return false;\r\n}\r\nfunction isObject(structure) {\r\n    return typeof structure === 'object' && structure !== null;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport areConnectedThroughProperties from './utils/areconnectedthroughproperties';\r\nimport Watchdog from './watchdog';\r\nimport { throttle, cloneDeepWith, isElement } from 'lodash-es';\r\n/**\r\n * A watchdog for CKEditor 5 editors.\r\n *\r\n * See the {@glink features/watchdog Watchdog feature guide} to learn the rationale behind it and\r\n * how to use it.\r\n */\r\nexport default class EditorWatchdog extends Watchdog {\r\n    /**\r\n     * @param Editor The editor class.\r\n     * @param watchdogConfig The watchdog plugin configuration.\r\n     */\r\n    constructor(Editor, watchdogConfig = {}) {\r\n        super(watchdogConfig);\r\n        /**\r\n         * The current editor instance.\r\n         */\r\n        this._editor = null;\r\n        // this._editorClass = Editor;\r\n        this._throttledSave = throttle(this._save.bind(this), typeof watchdogConfig.saveInterval === 'number' ? watchdogConfig.saveInterval : 5000);\r\n        // Set default creator and destructor functions:\r\n        if (Editor) {\r\n            this._creator = ((elementOrData, config) => Editor.create(elementOrData, config));\r\n        }\r\n        this._destructor = editor => editor.destroy();\r\n    }\r\n    /**\r\n     * The current editor instance.\r\n     */\r\n    get editor() {\r\n        return this._editor;\r\n    }\r\n    /**\r\n     * @internal\r\n     */\r\n    get _item() {\r\n        return this._editor;\r\n    }\r\n    /**\r\n     * Sets the function that is responsible for the editor creation.\r\n     * It expects a function that should return a promise.\r\n     *\r\n     * ```ts\r\n     * watchdog.setCreator( ( element, config ) => ClassicEditor.create( element, config ) );\r\n     * ```\r\n     */\r\n    setCreator(creator) {\r\n        this._creator = creator;\r\n    }\r\n    /**\r\n     * Sets the function that is responsible for the editor destruction.\r\n     * Overrides the default destruction function, which destroys only the editor instance.\r\n     * It expects a function that should return a promise or `undefined`.\r\n     *\r\n     * ```ts\r\n     * watchdog.setDestructor( editor => {\r\n     * \t// Do something before the editor is destroyed.\r\n     *\r\n     * \treturn editor\r\n     * \t\t.destroy()\r\n     * \t\t.then( () => {\r\n     * \t\t\t// Do something after the editor is destroyed.\r\n     * \t\t} );\r\n     * } );\r\n     * ```\r\n     */\r\n    setDestructor(destructor) {\r\n        this._destructor = destructor;\r\n    }\r\n    /**\r\n     * Restarts the editor instance. This method is called whenever an editor error occurs. It fires the `restart` event and changes\r\n     * the state to `initializing`.\r\n     *\r\n     * @fires restart\r\n     */\r\n    _restart() {\r\n        return Promise.resolve()\r\n            .then(() => {\r\n            this.state = 'initializing';\r\n            this._fire('stateChange');\r\n            return this._destroy();\r\n        })\r\n            .catch(err => {\r\n            console.error('An error happened during the editor destroying.', err);\r\n        })\r\n            .then(() => {\r\n            if (typeof this._elementOrData === 'string') {\r\n                return this.create(this._data, this._config, this._config.context);\r\n            }\r\n            else {\r\n                const updatedConfig = Object.assign({}, this._config, {\r\n                    initialData: this._data\r\n                });\r\n                return this.create(this._elementOrData, updatedConfig, updatedConfig.context);\r\n            }\r\n        })\r\n            .then(() => {\r\n            this._fire('restart');\r\n        });\r\n    }\r\n    /**\r\n     * Creates the editor instance and keeps it running, using the defined creator and destructor.\r\n     *\r\n     * @param elementOrData The editor source element or the editor data.\r\n     * @param config The editor configuration.\r\n     * @param context A context for the editor.\r\n     */\r\n    create(elementOrData = this._elementOrData, config = this._config, context) {\r\n        return Promise.resolve()\r\n            .then(() => {\r\n            super._startErrorHandling();\r\n            this._elementOrData = elementOrData;\r\n            // Clone configuration because it might be shared within multiple watchdog instances. Otherwise,\r\n            // when an error occurs in one of these editors, the watchdog will restart all of them.\r\n            this._config = this._cloneEditorConfiguration(config) || {};\r\n            this._config.context = context;\r\n            return this._creator(elementOrData, this._config);\r\n        })\r\n            .then(editor => {\r\n            this._editor = editor;\r\n            editor.model.document.on('change:data', this._throttledSave);\r\n            this._lastDocumentVersion = editor.model.document.version;\r\n            this._data = this._getData();\r\n            this.state = 'ready';\r\n            this._fire('stateChange');\r\n        });\r\n    }\r\n    /**\r\n     * Destroys the watchdog and the current editor instance. It fires the callback\r\n     * registered in {@link #setDestructor `setDestructor()`} and uses it to destroy the editor instance.\r\n     * It also sets the state to `destroyed`.\r\n     */\r\n    destroy() {\r\n        return Promise.resolve()\r\n            .then(() => {\r\n            this.state = 'destroyed';\r\n            this._fire('stateChange');\r\n            super.destroy();\r\n            return this._destroy();\r\n        });\r\n    }\r\n    _destroy() {\r\n        return Promise.resolve()\r\n            .then(() => {\r\n            this._stopErrorHandling();\r\n            // Save data if there is a remaining editor data change.\r\n            this._throttledSave.flush();\r\n            const editor = this._editor;\r\n            this._editor = null;\r\n            // Remove the `change:data` listener before destroying the editor.\r\n            // Incorrectly written plugins may trigger firing `change:data` events during the editor destruction phase\r\n            // causing the watchdog to call `editor.getData()` when some parts of editor are already destroyed.\r\n            editor.model.document.off('change:data', this._throttledSave);\r\n            return this._destructor(editor);\r\n        });\r\n    }\r\n    /**\r\n     * Saves the editor data, so it can be restored after the crash even if the data cannot be fetched at\r\n     * the moment of the crash.\r\n     */\r\n    _save() {\r\n        const version = this._editor.model.document.version;\r\n        try {\r\n            this._data = this._getData();\r\n            this._lastDocumentVersion = version;\r\n        }\r\n        catch (err) {\r\n            console.error(err, 'An error happened during restoring editor data. ' +\r\n                'Editor will be restored from the previously saved data.');\r\n        }\r\n    }\r\n    /**\r\n     * @internal\r\n     */\r\n    _setExcludedProperties(props) {\r\n        this._excludedProps = props;\r\n    }\r\n    /**\r\n     * Returns the editor data.\r\n     */\r\n    _getData() {\r\n        const data = {};\r\n        for (const rootName of this._editor.model.document.getRootNames()) {\r\n            data[rootName] = this._editor.data.get({ rootName });\r\n        }\r\n        return data;\r\n    }\r\n    /**\r\n     * Traverses the error context and the current editor to find out whether these structures are connected\r\n     * to each other via properties.\r\n     *\r\n     * @internal\r\n     */\r\n    _isErrorComingFromThisItem(error) {\r\n        return areConnectedThroughProperties(this._editor, error.context, this._excludedProps);\r\n    }\r\n    /**\r\n     * Clones the editor configuration.\r\n     */\r\n    _cloneEditorConfiguration(config) {\r\n        return cloneDeepWith(config, (value, key) => {\r\n            // Leave DOM references.\r\n            if (isElement(value)) {\r\n                return value;\r\n            }\r\n            if (key === 'context') {\r\n                return value;\r\n            }\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport Watchdog from './watchdog';\r\nimport EditorWatchdog from './editorwatchdog';\r\nimport areConnectedThroughProperties from './utils/areconnectedthroughproperties';\r\nimport getSubNodes from './utils/getsubnodes';\r\nconst mainQueueId = Symbol('MainQueueId');\r\n/**\r\n * A watchdog for the {@link module:core/context~Context} class.\r\n *\r\n * See the {@glink features/watchdog Watchdog feature guide} to learn the rationale behind it and\r\n * how to use it.\r\n */\r\nexport default class ContextWatchdog extends Watchdog {\r\n    /**\r\n     * The context watchdog class constructor.\r\n     *\r\n     * ```ts\r\n     * const watchdog = new ContextWatchdog( Context );\r\n     *\r\n     * await watchdog.create( contextConfiguration );\r\n     *\r\n     * await watchdog.add( item );\r\n     * ```\r\n     *\r\n     * See the {@glink features/watchdog Watchdog feature guide} to learn more how to use this feature.\r\n     *\r\n     * @param Context The {@link module:core/context~Context} class.\r\n     * @param watchdogConfig The watchdog configuration.\r\n     */\r\n    constructor(Context, watchdogConfig = {}) {\r\n        super(watchdogConfig);\r\n        /**\r\n         * A map of internal watchdogs for added items.\r\n         */\r\n        this._watchdogs = new Map();\r\n        /**\r\n         * The current context instance.\r\n         */\r\n        this._context = null;\r\n        /**\r\n         * Context properties (nodes/references) that are gathered during the initial context creation\r\n         * and are used to distinguish the origin of an error.\r\n         */\r\n        this._contextProps = new Set();\r\n        /**\r\n         * An action queue, which is used to handle async functions queuing.\r\n         */\r\n        this._actionQueues = new ActionQueues();\r\n        this._watchdogConfig = watchdogConfig;\r\n        // Default creator and destructor.\r\n        this._creator = contextConfig => Context.create(contextConfig);\r\n        this._destructor = context => context.destroy();\r\n        this._actionQueues.onEmpty(() => {\r\n            if (this.state === 'initializing') {\r\n                this.state = 'ready';\r\n                this._fire('stateChange');\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Sets the function that is responsible for the context creation.\r\n     * It expects a function that should return a promise (or `undefined`).\r\n     *\r\n     * ```ts\r\n     * watchdog.setCreator( config => Context.create( config ) );\r\n     * ```\r\n     */\r\n    setCreator(creator) {\r\n        this._creator = creator;\r\n    }\r\n    /**\r\n     * Sets the function that is responsible for the context destruction.\r\n     * Overrides the default destruction function, which destroys only the context instance.\r\n     * It expects a function that should return a promise (or `undefined`).\r\n     *\r\n     * ```ts\r\n     * watchdog.setDestructor( context => {\r\n     * \t// Do something before the context is destroyed.\r\n     *\r\n     * \treturn context\r\n     * \t\t.destroy()\r\n     * \t\t.then( () => {\r\n     * \t\t\t// Do something after the context is destroyed.\r\n     * \t\t} );\r\n     * } );\r\n     * ```\r\n     */\r\n    setDestructor(destructor) {\r\n        this._destructor = destructor;\r\n    }\r\n    /**\r\n     * The context instance. Keep in mind that this property might be changed when the context watchdog restarts,\r\n     * so do not keep this instance internally. Always operate on the `ContextWatchdog#context` property.\r\n     */\r\n    get context() {\r\n        return this._context;\r\n    }\r\n    /**\r\n     * Initializes the context watchdog. Once it is created, the watchdog takes care about\r\n     * recreating the context and the provided items, and starts the error handling mechanism.\r\n     *\r\n     * ```ts\r\n     * await watchdog.create( {\r\n     * \tplugins: []\r\n     * } );\r\n     * ```\r\n     *\r\n     * @param contextConfig The context configuration. See {@link module:core/context~Context}.\r\n     */\r\n    create(contextConfig = {}) {\r\n        return this._actionQueues.enqueue(mainQueueId, () => {\r\n            this._contextConfig = contextConfig;\r\n            return this._create();\r\n        });\r\n    }\r\n    /**\r\n     * Returns an item instance with the given `itemId`.\r\n     *\r\n     * ```ts\r\n     * const editor1 = watchdog.getItem( 'editor1' );\r\n     * ```\r\n     *\r\n     * @param itemId The item ID.\r\n     * @returns The item instance or `undefined` if an item with a given ID has not been found.\r\n     */\r\n    getItem(itemId) {\r\n        const watchdog = this._getWatchdog(itemId);\r\n        return watchdog._item;\r\n    }\r\n    /**\r\n     * Gets the state of the given item. See {@link #state} for a list of available states.\r\n     *\r\n     * ```ts\r\n     * const editor1State = watchdog.getItemState( 'editor1' );\r\n     * ```\r\n     *\r\n     * @param itemId Item ID.\r\n     * @returns The state of the item.\r\n     */\r\n    getItemState(itemId) {\r\n        const watchdog = this._getWatchdog(itemId);\r\n        return watchdog.state;\r\n    }\r\n    /**\r\n     * Adds items to the watchdog. Once created, instances of these items will be available using the {@link #getItem} method.\r\n     *\r\n     * Items can be passed together as an array of objects:\r\n     *\r\n     * ```ts\r\n     * await watchdog.add( [ {\r\n     * \tid: 'editor1',\r\n     * \ttype: 'editor',\r\n     * \tsourceElementOrData: document.querySelector( '#editor' ),\r\n     * \tconfig: {\r\n     * \t\tplugins: [ Essentials, Paragraph, Bold, Italic ],\r\n     * \t\ttoolbar: [ 'bold', 'italic', 'alignment' ]\r\n     * \t},\r\n     * \tcreator: ( element, config ) => ClassicEditor.create( element, config )\r\n     * } ] );\r\n     * ```\r\n     *\r\n     * Or one by one as objects:\r\n     *\r\n     * ```ts\r\n     * await watchdog.add( {\r\n     * \tid: 'editor1',\r\n     * \ttype: 'editor',\r\n     * \tsourceElementOrData: document.querySelector( '#editor' ),\r\n     * \tconfig: {\r\n     * \t\tplugins: [ Essentials, Paragraph, Bold, Italic ],\r\n     * \t\ttoolbar: [ 'bold', 'italic', 'alignment' ]\r\n     * \t},\r\n     * \tcreator: ( element, config ) => ClassicEditor.create( element, config )\r\n     * ] );\r\n     * ```\r\n     *\r\n     * Then an instance can be retrieved using the {@link #getItem} method:\r\n     *\r\n     * ```ts\r\n     * const editor1 = watchdog.getItem( 'editor1' );\r\n     * ```\r\n     *\r\n     * Note that this method can be called multiple times, but for performance reasons it is better\r\n     * to pass all items together.\r\n     *\r\n     * @param itemConfigurationOrItemConfigurations An item configuration object or an array of item configurations.\r\n     */\r\n    add(itemConfigurationOrItemConfigurations) {\r\n        const itemConfigurations = toArray(itemConfigurationOrItemConfigurations);\r\n        return Promise.all(itemConfigurations.map(item => {\r\n            return this._actionQueues.enqueue(item.id, () => {\r\n                if (this.state === 'destroyed') {\r\n                    throw new Error('Cannot add items to destroyed watchdog.');\r\n                }\r\n                if (!this._context) {\r\n                    throw new Error('Context was not created yet. You should call the `ContextWatchdog#create()` method first.');\r\n                }\r\n                let watchdog;\r\n                if (this._watchdogs.has(item.id)) {\r\n                    throw new Error(`Item with the given id is already added: '${item.id}'.`);\r\n                }\r\n                if (item.type === 'editor') {\r\n                    watchdog = new EditorWatchdog(null, this._watchdogConfig);\r\n                    watchdog.setCreator(item.creator);\r\n                    watchdog._setExcludedProperties(this._contextProps);\r\n                    if (item.destructor) {\r\n                        watchdog.setDestructor(item.destructor);\r\n                    }\r\n                    this._watchdogs.set(item.id, watchdog);\r\n                    // Enqueue the internal watchdog errors within the main queue.\r\n                    // And propagate the internal `error` events as `itemError` event.\r\n                    watchdog.on('error', (evt, { error, causesRestart }) => {\r\n                        this._fire('itemError', { itemId: item.id, error });\r\n                        // Do not enqueue the item restart action if the item will not restart.\r\n                        if (!causesRestart) {\r\n                            return;\r\n                        }\r\n                        this._actionQueues.enqueue(item.id, () => new Promise(res => {\r\n                            const rethrowRestartEventOnce = () => {\r\n                                watchdog.off('restart', rethrowRestartEventOnce);\r\n                                this._fire('itemRestart', { itemId: item.id });\r\n                                res();\r\n                            };\r\n                            watchdog.on('restart', rethrowRestartEventOnce);\r\n                        }));\r\n                    });\r\n                    return watchdog.create(item.sourceElementOrData, item.config, this._context);\r\n                }\r\n                else {\r\n                    throw new Error(`Not supported item type: '${item.type}'.`);\r\n                }\r\n            });\r\n        }));\r\n    }\r\n    /**\r\n     * Removes and destroys item(s) with given ID(s).\r\n     *\r\n     * ```ts\r\n     * await watchdog.remove( 'editor1' );\r\n     * ```\r\n     *\r\n     * Or\r\n     *\r\n     * ```ts\r\n     * await watchdog.remove( [ 'editor1', 'editor2' ] );\r\n     * ```\r\n     *\r\n     * @param itemIdOrItemIds Item ID or an array of item IDs.\r\n     */\r\n    remove(itemIdOrItemIds) {\r\n        const itemIds = toArray(itemIdOrItemIds);\r\n        return Promise.all(itemIds.map(itemId => {\r\n            return this._actionQueues.enqueue(itemId, () => {\r\n                const watchdog = this._getWatchdog(itemId);\r\n                this._watchdogs.delete(itemId);\r\n                return watchdog.destroy();\r\n            });\r\n        }));\r\n    }\r\n    /**\r\n     * Destroys the context watchdog and all added items.\r\n     * Once the context watchdog is destroyed, new items cannot be added.\r\n     *\r\n     * ```ts\r\n     * await watchdog.destroy();\r\n     * ```\r\n     */\r\n    destroy() {\r\n        return this._actionQueues.enqueue(mainQueueId, () => {\r\n            this.state = 'destroyed';\r\n            this._fire('stateChange');\r\n            super.destroy();\r\n            return this._destroy();\r\n        });\r\n    }\r\n    /**\r\n     * Restarts the context watchdog.\r\n     */\r\n    _restart() {\r\n        return this._actionQueues.enqueue(mainQueueId, () => {\r\n            this.state = 'initializing';\r\n            this._fire('stateChange');\r\n            return this._destroy()\r\n                .catch(err => {\r\n                console.error('An error happened during destroying the context or items.', err);\r\n            })\r\n                .then(() => this._create())\r\n                .then(() => this._fire('restart'));\r\n        });\r\n    }\r\n    /**\r\n     * Initializes the context watchdog.\r\n     */\r\n    _create() {\r\n        return Promise.resolve()\r\n            .then(() => {\r\n            this._startErrorHandling();\r\n            return this._creator(this._contextConfig);\r\n        })\r\n            .then(context => {\r\n            this._context = context;\r\n            this._contextProps = getSubNodes(this._context);\r\n            return Promise.all(Array.from(this._watchdogs.values())\r\n                .map(watchdog => {\r\n                watchdog._setExcludedProperties(this._contextProps);\r\n                return watchdog.create(undefined, undefined, this._context);\r\n            }));\r\n        });\r\n    }\r\n    /**\r\n     * Destroys the context instance and all added items.\r\n     */\r\n    _destroy() {\r\n        return Promise.resolve()\r\n            .then(() => {\r\n            this._stopErrorHandling();\r\n            const context = this._context;\r\n            this._context = null;\r\n            this._contextProps = new Set();\r\n            return Promise.all(Array.from(this._watchdogs.values())\r\n                .map(watchdog => watchdog.destroy()))\r\n                // Context destructor destroys each editor.\r\n                .then(() => this._destructor(context));\r\n        });\r\n    }\r\n    /**\r\n     * Returns the watchdog for a given item ID.\r\n     *\r\n     * @param itemId Item ID.\r\n     */\r\n    _getWatchdog(itemId) {\r\n        const watchdog = this._watchdogs.get(itemId);\r\n        if (!watchdog) {\r\n            throw new Error(`Item with the given id was not registered: ${itemId}.`);\r\n        }\r\n        return watchdog;\r\n    }\r\n    /**\r\n     * Checks whether an error comes from the context instance and not from the item instances.\r\n     *\r\n     * @internal\r\n     */\r\n    _isErrorComingFromThisItem(error) {\r\n        for (const watchdog of this._watchdogs.values()) {\r\n            if (watchdog._isErrorComingFromThisItem(error)) {\r\n                return false;\r\n            }\r\n        }\r\n        return areConnectedThroughProperties(this._context, error.context);\r\n    }\r\n}\r\n/**\r\n * Manager of action queues that allows queuing async functions.\r\n */\r\nclass ActionQueues {\r\n    constructor() {\r\n        this._onEmptyCallbacks = [];\r\n        this._queues = new Map();\r\n        this._activeActions = 0;\r\n    }\r\n    /**\r\n     * Used to register callbacks that will be run when the queue becomes empty.\r\n     *\r\n     * @param onEmptyCallback A callback that will be run whenever the queue becomes empty.\r\n     */\r\n    onEmpty(onEmptyCallback) {\r\n        this._onEmptyCallbacks.push(onEmptyCallback);\r\n    }\r\n    /**\r\n     * It adds asynchronous actions (functions) to the proper queue and runs them one by one.\r\n     *\r\n     * @param queueId The action queue ID.\r\n     * @param action A function that should be enqueued.\r\n     */\r\n    enqueue(queueId, action) {\r\n        const isMainAction = queueId === mainQueueId;\r\n        this._activeActions++;\r\n        if (!this._queues.get(queueId)) {\r\n            this._queues.set(queueId, Promise.resolve());\r\n        }\r\n        // List all sources of actions that the current action needs to await for.\r\n        // For the main action wait for all other actions.\r\n        // For the item action wait only for the item queue and the main queue.\r\n        const awaitedActions = isMainAction ?\r\n            Promise.all(this._queues.values()) :\r\n            Promise.all([this._queues.get(mainQueueId), this._queues.get(queueId)]);\r\n        const queueWithAction = awaitedActions.then(action);\r\n        // Catch all errors in the main queue to stack promises even if an error occurred in the past.\r\n        const nonErrorQueue = queueWithAction.catch(() => { });\r\n        this._queues.set(queueId, nonErrorQueue);\r\n        return queueWithAction.finally(() => {\r\n            this._activeActions--;\r\n            if (this._queues.get(queueId) === nonErrorQueue && this._activeActions === 0) {\r\n                this._onEmptyCallbacks.forEach(cb => cb());\r\n            }\r\n        });\r\n    }\r\n}\r\n/**\r\n * Transforms any value to an array. If the provided value is already an array, it is returned unchanged.\r\n *\r\n * @param elementOrArray The value to transform to an array.\r\n * @returns An array created from data.\r\n */\r\nfunction toArray(elementOrArray) {\r\n    return Array.isArray(elementOrArray) ? elementOrArray : [elementOrArray];\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module editor-classic/classiceditor\r\n */\r\nimport ClassicEditorUI from './classiceditorui';\r\nimport ClassicEditorUIView from './classiceditoruiview';\r\nimport { Editor, Context, DataApiMixin, ElementApiMixin, attachToForm } from 'ckeditor5/src/core';\r\nimport { getDataFromElement, CKEditorError } from 'ckeditor5/src/utils';\r\nimport { ContextWatchdog, EditorWatchdog } from 'ckeditor5/src/watchdog';\r\nimport { isElement as _isElement } from 'lodash-es';\r\n/**\r\n * The {@glink installation/getting-started/predefined-builds#classic-editor classic editor} implementation.\r\n * It uses an inline editable and a sticky toolbar, all enclosed in a boxed UI.\r\n * See the {@glink examples/builds/classic-editor demo}.\r\n *\r\n * In order to create a classic editor instance, use the static\r\n * {@link module:editor-classic/classiceditor~ClassicEditor.create `ClassicEditor.create()`} method.\r\n *\r\n * # Classic editor and classic build\r\n *\r\n * The classic editor can be used directly from source (if you installed the\r\n * [`@ckeditor/ckeditor5-editor-classic`](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-classic) package)\r\n * but it is also available in the {@glink installation/getting-started/predefined-builds#classic-editor classic build}.\r\n *\r\n * {@glink installation/getting-started/predefined-builds Builds}\r\n * are ready-to-use editors with plugins bundled in. When using the editor from\r\n * source you need to take care of loading all plugins by yourself\r\n * (through the {@link module:core/editor/editorconfig~EditorConfig#plugins `config.plugins`} option).\r\n * Using the editor from source gives much better flexibility and allows easier customization.\r\n *\r\n * Read more about initializing the editor from source or as a build in\r\n * {@link module:editor-classic/classiceditor~ClassicEditor.create `ClassicEditor.create()`}.\r\n */\r\nexport default class ClassicEditor extends DataApiMixin(ElementApiMixin(Editor)) {\r\n    /**\r\n     * Creates an instance of the classic editor.\r\n     *\r\n     * **Note:** do not use the constructor to create editor instances. Use the static\r\n     * {@link module:editor-classic/classiceditor~ClassicEditor.create `ClassicEditor.create()`} method instead.\r\n     *\r\n     * @param sourceElementOrData The DOM element that will be the source for the created editor\r\n     * or the editor's initial data. For more information see\r\n     * {@link module:editor-classic/classiceditor~ClassicEditor.create `ClassicEditor.create()`}.\r\n     * @param config The editor configuration.\r\n     */\r\n    constructor(sourceElementOrData, config = {}) {\r\n        // If both `config.initialData` is set and initial data is passed as the constructor parameter, then throw.\r\n        if (!isElement(sourceElementOrData) && config.initialData !== undefined) {\r\n            // Documented in core/editor/editorconfig.jsdoc.\r\n            // eslint-disable-next-line ckeditor5-rules/ckeditor-error-message\r\n            throw new CKEditorError('editor-create-initial-data', null);\r\n        }\r\n        super(config);\r\n        if (this.config.get('initialData') === undefined) {\r\n            this.config.set('initialData', getInitialData(sourceElementOrData));\r\n        }\r\n        if (isElement(sourceElementOrData)) {\r\n            this.sourceElement = sourceElementOrData;\r\n        }\r\n        this.model.document.createRoot();\r\n        const shouldToolbarGroupWhenFull = !this.config.get('toolbar.shouldNotGroupWhenFull');\r\n        const view = new ClassicEditorUIView(this.locale, this.editing.view, {\r\n            shouldToolbarGroupWhenFull\r\n        });\r\n        this.ui = new ClassicEditorUI(this, view);\r\n        attachToForm(this);\r\n    }\r\n    /**\r\n     * Destroys the editor instance, releasing all resources used by it.\r\n     *\r\n     * Updates the original editor element with the data if the\r\n     * {@link module:core/editor/editorconfig~EditorConfig#updateSourceElementOnDestroy `updateSourceElementOnDestroy`}\r\n     * configuration option is set to `true`.\r\n     */\r\n    destroy() {\r\n        if (this.sourceElement) {\r\n            this.updateSourceElement();\r\n        }\r\n        this.ui.destroy();\r\n        return super.destroy();\r\n    }\r\n    /**\r\n     * Creates a new classic editor instance.\r\n     *\r\n     * There are three ways how the editor can be initialized.\r\n     *\r\n     * # Replacing a DOM element (and loading data from it)\r\n     *\r\n     * You can initialize the editor using an existing DOM element:\r\n     *\r\n     * ```ts\r\n     * ClassicEditor\r\n     * \t.create( document.querySelector( '#editor' ) )\r\n     * \t.then( editor => {\r\n     * \t\tconsole.log( 'Editor was initialized', editor );\r\n     * \t} )\r\n     * \t.catch( err => {\r\n     * \t\tconsole.error( err.stack );\r\n     * \t} );\r\n     * ```\r\n     *\r\n     * The element's content will be used as the editor data and the element will be replaced by the editor UI.\r\n     *\r\n     * # Creating a detached editor\r\n     *\r\n     * Alternatively, you can initialize the editor by passing the initial data directly as a string.\r\n     * In this case, the editor will render an element that must be inserted into the DOM:\r\n     *\r\n     * ```ts\r\n     * ClassicEditor\r\n     * \t.create( '<p>Hello world!</p>' )\r\n     * \t.then( editor => {\r\n     * \t\tconsole.log( 'Editor was initialized', editor );\r\n     *\r\n     * \t\t// Initial data was provided so the editor UI element needs to be added manually to the DOM.\r\n     * \t\tdocument.body.appendChild( editor.ui.element );\r\n     * \t} )\r\n     * \t.catch( err => {\r\n     * \t\tconsole.error( err.stack );\r\n     * \t} );\r\n     * ```\r\n     *\r\n     * This lets you dynamically append the editor to your web page whenever it is convenient for you. You may use this method if your\r\n     * web page content is generated on the client side and the DOM structure is not ready at the moment when you initialize the editor.\r\n     *\r\n     * # Replacing a DOM element (and data provided in `config.initialData`)\r\n     *\r\n     * You can also mix these two ways by providing a DOM element to be used and passing the initial data through the configuration:\r\n     *\r\n     * ```ts\r\n     * ClassicEditor\r\n     * \t.create( document.querySelector( '#editor' ), {\r\n     * \t\tinitialData: '<h2>Initial data</h2><p>Foo bar.</p>'\r\n     * \t} )\r\n     * \t.then( editor => {\r\n     * \t\tconsole.log( 'Editor was initialized', editor );\r\n     * \t} )\r\n     * \t.catch( err => {\r\n     * \t\tconsole.error( err.stack );\r\n     * \t} );\r\n     * ```\r\n     *\r\n     * This method can be used to initialize the editor on an existing element with the specified content in case if your integration\r\n     * makes it difficult to set the content of the source element.\r\n     *\r\n     * Note that an error will be thrown if you pass the initial data both as the first parameter and also in the configuration.\r\n     *\r\n     * # Configuring the editor\r\n     *\r\n     * See the {@link module:core/editor/editorconfig~EditorConfig editor configuration documentation} to learn more about\r\n     * customizing plugins, toolbar and more.\r\n     *\r\n     * # Using the editor from source\r\n     *\r\n     * The code samples listed in the previous sections of this documentation assume that you are using an\r\n     * {@glink installation/getting-started/predefined-builds editor build} (for example – `@ckeditor/ckeditor5-build-classic`).\r\n     *\r\n     * If you want to use the classic editor from source (`@ckeditor/ckeditor5-editor-classic/src/classiceditor`),\r\n     * you need to define the list of\r\n     * {@link module:core/editor/editorconfig~EditorConfig#plugins plugins to be initialized} and\r\n     * {@link module:core/editor/editorconfig~EditorConfig#toolbar toolbar items}. Read more about using the editor from\r\n     * source in the {@glink installation/advanced/alternative-setups/integrating-from-source-webpack dedicated guide}.\r\n     *\r\n     * @param sourceElementOrData The DOM element that will be the source for the created editor\r\n     * or the editor's initial data.\r\n     *\r\n     * If a DOM element is passed, its content will be automatically loaded to the editor upon initialization\r\n     * and the {@link module:editor-classic/classiceditorui~ClassicEditorUI#element editor element} will replace the passed element\r\n     * in the DOM (the original one will be hidden and the editor will be injected next to it).\r\n     *\r\n     * If the {@link module:core/editor/editorconfig~EditorConfig#updateSourceElementOnDestroy updateSourceElementOnDestroy}\r\n     * option is set to `true`, the editor data will be set back to the original element once the editor is destroyed and when a form,\r\n     * in which this element is contained, is submitted (if the original element is a `<textarea>`). This ensures seamless integration\r\n     * with native web forms.\r\n     *\r\n     * If the initial data is passed, a detached editor will be created. In this case you need to insert it into the DOM manually.\r\n     * It is available under the {@link module:editor-classic/classiceditorui~ClassicEditorUI#element `editor.ui.element`} property.\r\n     *\r\n     * @param config The editor configuration.\r\n     * @returns A promise resolved once the editor is ready. The promise resolves with the created editor instance.\r\n     */\r\n    static create(sourceElementOrData, config = {}) {\r\n        return new Promise(resolve => {\r\n            const editor = new this(sourceElementOrData, config);\r\n            resolve(editor.initPlugins()\r\n                .then(() => editor.ui.init(isElement(sourceElementOrData) ? sourceElementOrData : null))\r\n                .then(() => editor.data.init(editor.config.get('initialData')))\r\n                .then(() => editor.fire('ready'))\r\n                .then(() => editor));\r\n        });\r\n    }\r\n}\r\n/**\r\n * The {@link module:core/context~Context} class.\r\n *\r\n * Exposed as static editor field for easier access in editor builds.\r\n */\r\nClassicEditor.Context = Context;\r\n/**\r\n * The {@link module:watchdog/editorwatchdog~EditorWatchdog} class.\r\n *\r\n * Exposed as static editor field for easier access in editor builds.\r\n */\r\nClassicEditor.EditorWatchdog = EditorWatchdog;\r\n/**\r\n * The {@link module:watchdog/contextwatchdog~ContextWatchdog} class.\r\n *\r\n * Exposed as static editor field for easier access in editor builds.\r\n */\r\nClassicEditor.ContextWatchdog = ContextWatchdog;\r\nfunction getInitialData(sourceElementOrData) {\r\n    return isElement(sourceElementOrData) ? getDataFromElement(sourceElementOrData) : sourceElementOrData;\r\n}\r\nfunction isElement(value) {\r\n    return _isElement(value);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/* globals HTMLTextAreaElement */\r\n/**\r\n * @module utils/dom/getdatafromelement\r\n */\r\n/**\r\n * Gets data from a given source element.\r\n *\r\n * @param el The element from which the data will be retrieved.\r\n * @returns The data string.\r\n */\r\nexport default function getDataFromElement(el) {\r\n    if (el instanceof HTMLTextAreaElement) {\r\n        return el.value;\r\n    }\r\n    return el.innerHTML;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module core/editor/utils/attachtoform\r\n */\r\nimport { isFunction } from 'lodash-es';\r\nimport { CKEditorError } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Checks if the editor is initialized on a `<textarea>` element that belongs to a form. If yes, it updates the editor's element\r\n * content before submitting the form.\r\n *\r\n * This helper requires the {@link module:core/editor/utils/elementapimixin~ElementApi ElementApi interface}.\r\n *\r\n * @param editor Editor instance.\r\n */\r\nexport default function attachToForm(editor) {\r\n    if (!isFunction(editor.updateSourceElement)) {\r\n        /**\r\n         * The editor passed to `attachToForm()` must implement the\r\n         * {@link module:core/editor/utils/elementapimixin~ElementApi} interface.\r\n         *\r\n         * @error attachtoform-missing-elementapi-interface\r\n         */\r\n        throw new CKEditorError('attachtoform-missing-elementapi-interface', editor);\r\n    }\r\n    const sourceElement = editor.sourceElement;\r\n    // Only when replacing a textarea which is inside of a form element.\r\n    if (isTextArea(sourceElement) && sourceElement.form) {\r\n        let originalSubmit;\r\n        const form = sourceElement.form;\r\n        const onSubmit = () => editor.updateSourceElement();\r\n        // Replace the original form#submit() to call a custom submit function first.\r\n        // Check if #submit is a function because the form might have an input named \"submit\".\r\n        if (isFunction(form.submit)) {\r\n            originalSubmit = form.submit;\r\n            form.submit = () => {\r\n                onSubmit();\r\n                originalSubmit.apply(form);\r\n            };\r\n        }\r\n        // Update the replaced textarea with data before each form#submit event.\r\n        form.addEventListener('submit', onSubmit);\r\n        // Remove the submit listener and revert the original submit method on\r\n        // editor#destroy.\r\n        editor.on('destroy', () => {\r\n            form.removeEventListener('submit', onSubmit);\r\n            if (originalSubmit) {\r\n                form.submit = originalSubmit;\r\n            }\r\n        });\r\n    }\r\n}\r\nfunction isTextArea(sourceElement) {\r\n    return !!sourceElement && sourceElement.tagName.toLowerCase() === 'textarea';\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { CKEditorError, logWarning } from 'ckeditor5/src/utils';\r\n/**\r\n * @module alignment/utils\r\n */\r\n/**\r\n * The list of supported alignment options:\r\n *\r\n * * `'left'`,\r\n * * `'right'`,\r\n * * `'center'`,\r\n * * `'justify'`\r\n */\r\nexport const supportedOptions = ['left', 'right', 'center', 'justify'];\r\n/**\r\n * Checks whether the passed option is supported by {@link module:alignment/alignmentediting~AlignmentEditing}.\r\n *\r\n * @param option The option value to check.\r\n */\r\nexport function isSupported(option) {\r\n    return supportedOptions.includes(option);\r\n}\r\n/**\r\n * Checks whether alignment is the default one considering the direction\r\n * of the editor content.\r\n *\r\n * @param alignment The name of the alignment to check.\r\n * @param locale The {@link module:core/editor/editor~Editor#locale} instance.\r\n */\r\nexport function isDefault(alignment, locale) {\r\n    // Right now only LTR is supported so the 'left' value is always the default one.\r\n    if (locale.contentLanguageDirection == 'rtl') {\r\n        return alignment === 'right';\r\n    }\r\n    else {\r\n        return alignment === 'left';\r\n    }\r\n}\r\n/**\r\n * Brings the configuration to the common form, an array of objects.\r\n *\r\n * @param configuredOptions Alignment plugin configuration.\r\n * @returns Normalized object holding the configuration.\r\n */\r\nexport function normalizeAlignmentOptions(configuredOptions) {\r\n    const normalizedOptions = configuredOptions\r\n        .map(option => {\r\n        let result;\r\n        if (typeof option == 'string') {\r\n            result = { name: option };\r\n        }\r\n        else {\r\n            result = option;\r\n        }\r\n        return result;\r\n    })\r\n        // Remove all unknown options.\r\n        .filter(option => {\r\n        const isNameValid = supportedOptions.includes(option.name);\r\n        if (!isNameValid) {\r\n            /**\r\n             * The `name` in one of the `alignment.options` is not recognized.\r\n             * The available options are: `'left'`, `'right'`, `'center'` and `'justify'`.\r\n             *\r\n             * @error alignment-config-name-not-recognized\r\n             * @param option Options with unknown value of the `name` property.\r\n             */\r\n            logWarning('alignment-config-name-not-recognized', { option });\r\n        }\r\n        return isNameValid;\r\n    });\r\n    const classNameCount = normalizedOptions.filter(option => Boolean(option.className)).length;\r\n    // We either use classes for all styling options or for none.\r\n    if (classNameCount && classNameCount < normalizedOptions.length) {\r\n        /**\r\n         * The `className` property has to be defined for all options once at least one option declares `className`.\r\n         *\r\n         * @error alignment-config-classnames-are-missing\r\n         * @param configuredOptions Contents of `alignment.options`.\r\n         */\r\n        throw new CKEditorError('alignment-config-classnames-are-missing', { configuredOptions });\r\n    }\r\n    // Validate resulting config.\r\n    normalizedOptions.forEach((option, index, allOptions) => {\r\n        const succeedingOptions = allOptions.slice(index + 1);\r\n        const nameAlreadyExists = succeedingOptions.some(item => item.name == option.name);\r\n        if (nameAlreadyExists) {\r\n            /**\r\n             * The same `name` in one of the `alignment.options` was already declared.\r\n             * Each `name` representing one alignment option can be set exactly once.\r\n             *\r\n             * @error alignment-config-name-already-defined\r\n             * @param option First option that declares given `name`.\r\n             * @param configuredOptions Contents of `alignment.options`.\r\n             */\r\n            throw new CKEditorError('alignment-config-name-already-defined', { option, configuredOptions });\r\n        }\r\n        // The `className` property is present. Check for duplicates then.\r\n        if (option.className) {\r\n            const classNameAlreadyExists = succeedingOptions.some(item => item.className == option.className);\r\n            if (classNameAlreadyExists) {\r\n                /**\r\n                 * The same `className` in one of the `alignment.options` was already declared.\r\n                 *\r\n                 * @error alignment-config-classname-already-defined\r\n                 * @param option First option that declares given `className`.\r\n                 * @param configuredOptions\r\n                 * Contents of `alignment.options`.\r\n                 */\r\n                throw new CKEditorError('alignment-config-classname-already-defined', { option, configuredOptions });\r\n            }\r\n        }\r\n    });\r\n    return normalizedOptions;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module alignment/alignmentcommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { first } from 'ckeditor5/src/utils';\r\nimport { isDefault } from './utils';\r\nconst ALIGNMENT = 'alignment';\r\n/**\r\n * The alignment command plugin.\r\n */\r\nexport default class AlignmentCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const editor = this.editor;\r\n        const locale = editor.locale;\r\n        const firstBlock = first(this.editor.model.document.selection.getSelectedBlocks());\r\n        // As first check whether to enable or disable the command as the value will always be false if the command cannot be enabled.\r\n        this.isEnabled = Boolean(firstBlock) && this._canBeAligned(firstBlock);\r\n        if (this.isEnabled && firstBlock.hasAttribute('alignment')) {\r\n            this.value = firstBlock.getAttribute('alignment');\r\n        }\r\n        else {\r\n            this.value = locale.contentLanguageDirection === 'rtl' ? 'right' : 'left';\r\n        }\r\n    }\r\n    /**\r\n     * Executes the command. Applies the alignment `value` to the selected blocks.\r\n     * If no `value` is passed, the `value` is the default one or it is equal to the currently selected block's alignment attribute,\r\n     * the command will remove the attribute from the selected blocks.\r\n     *\r\n     * @param options Options for the executed command.\r\n     * @param options.value The value to apply.\r\n     * @fires execute\r\n     */\r\n    execute(options = {}) {\r\n        const editor = this.editor;\r\n        const locale = editor.locale;\r\n        const model = editor.model;\r\n        const doc = model.document;\r\n        const value = options.value;\r\n        model.change(writer => {\r\n            // Get only those blocks from selected that can have alignment set\r\n            const blocks = Array.from(doc.selection.getSelectedBlocks()).filter(block => this._canBeAligned(block));\r\n            const currentAlignment = blocks[0].getAttribute('alignment');\r\n            // Remove alignment attribute if current alignment is:\r\n            // - default (should not be stored in model as it will bloat model data)\r\n            // - equal to currently set\r\n            // - or no value is passed - denotes default alignment.\r\n            const removeAlignment = isDefault(value, locale) || currentAlignment === value || !value;\r\n            if (removeAlignment) {\r\n                removeAlignmentFromSelection(blocks, writer);\r\n            }\r\n            else {\r\n                setAlignmentOnSelection(blocks, writer, value);\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Checks whether a block can have alignment set.\r\n     *\r\n     * @param block The block to be checked.\r\n     */\r\n    _canBeAligned(block) {\r\n        return this.editor.model.schema.checkAttribute(block, ALIGNMENT);\r\n    }\r\n}\r\n/**\r\n * Removes the alignment attribute from blocks.\r\n */\r\nfunction removeAlignmentFromSelection(blocks, writer) {\r\n    for (const block of blocks) {\r\n        writer.removeAttribute(ALIGNMENT, block);\r\n    }\r\n}\r\n/**\r\n * Sets the alignment attribute on blocks.\r\n */\r\nfunction setAlignmentOnSelection(blocks, writer, alignment) {\r\n    for (const block of blocks) {\r\n        writer.setAttribute(ALIGNMENT, alignment, block);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module alignment/alignmentediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport AlignmentCommand from './alignmentcommand';\r\nimport { isDefault, isSupported, normalizeAlignmentOptions, supportedOptions } from './utils';\r\n/**\r\n * The alignment editing feature. It introduces the {@link module:alignment/alignmentcommand~AlignmentCommand command} and adds\r\n * the `alignment` attribute for block elements in the {@link module:engine/model/model~Model model}.\r\n */\r\nexport default class AlignmentEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'AlignmentEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        editor.config.define('alignment', {\r\n            options: supportedOptions.map(option => ({ name: option }))\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const locale = editor.locale;\r\n        const schema = editor.model.schema;\r\n        const options = normalizeAlignmentOptions(editor.config.get('alignment.options'));\r\n        // Filter out unsupported options and those that are redundant, e.g. `left` in LTR / `right` in RTL mode.\r\n        const optionsToConvert = options.filter(option => isSupported(option.name) && !isDefault(option.name, locale));\r\n        // Once there is at least one `className` defined, we switch to alignment with classes.\r\n        const shouldUseClasses = optionsToConvert.some(option => !!option.className);\r\n        // Allow alignment attribute on all blocks.\r\n        schema.extend('$block', { allowAttributes: 'alignment' });\r\n        editor.model.schema.setAttributeProperties('alignment', { isFormatting: true });\r\n        if (shouldUseClasses) {\r\n            editor.conversion.attributeToAttribute(buildClassDefinition(optionsToConvert));\r\n        }\r\n        else {\r\n            // Downcast inline styles.\r\n            editor.conversion.for('downcast').attributeToAttribute(buildDowncastInlineDefinition(optionsToConvert));\r\n        }\r\n        const upcastInlineDefinitions = buildUpcastInlineDefinitions(optionsToConvert);\r\n        // Always upcast from inline styles.\r\n        for (const definition of upcastInlineDefinitions) {\r\n            editor.conversion.for('upcast').attributeToAttribute(definition);\r\n        }\r\n        const upcastCompatibilityDefinitions = buildUpcastCompatibilityDefinitions(optionsToConvert);\r\n        // Always upcast from deprecated `align` attribute.\r\n        for (const definition of upcastCompatibilityDefinitions) {\r\n            editor.conversion.for('upcast').attributeToAttribute(definition);\r\n        }\r\n        editor.commands.add('alignment', new AlignmentCommand(editor));\r\n    }\r\n}\r\n/**\r\n * Prepare downcast conversion definition for inline alignment styling.\r\n */\r\nfunction buildDowncastInlineDefinition(options) {\r\n    const view = {};\r\n    for (const { name } of options) {\r\n        view[name] = {\r\n            key: 'style',\r\n            value: {\r\n                'text-align': name\r\n            }\r\n        };\r\n    }\r\n    const definition = {\r\n        model: {\r\n            key: 'alignment',\r\n            values: options.map(option => option.name)\r\n        },\r\n        view\r\n    };\r\n    return definition;\r\n}\r\n/**\r\n * Prepare upcast definitions for inline alignment styles.\r\n */\r\nfunction buildUpcastInlineDefinitions(options) {\r\n    const definitions = [];\r\n    for (const { name } of options) {\r\n        definitions.push({\r\n            view: {\r\n                key: 'style',\r\n                value: {\r\n                    'text-align': name\r\n                }\r\n            },\r\n            model: {\r\n                key: 'alignment',\r\n                value: name\r\n            }\r\n        });\r\n    }\r\n    return definitions;\r\n}\r\n/**\r\n * Prepare upcast definitions for deprecated `align` attribute.\r\n */\r\nfunction buildUpcastCompatibilityDefinitions(options) {\r\n    const definitions = [];\r\n    for (const { name } of options) {\r\n        definitions.push({\r\n            view: {\r\n                key: 'align',\r\n                value: name\r\n            },\r\n            model: {\r\n                key: 'alignment',\r\n                value: name\r\n            }\r\n        });\r\n    }\r\n    return definitions;\r\n}\r\n/**\r\n * Prepare conversion definitions for upcast and downcast alignment with classes.\r\n */\r\nfunction buildClassDefinition(options) {\r\n    const view = {};\r\n    for (const option of options) {\r\n        view[option.name] = {\r\n            key: 'class',\r\n            value: option.className\r\n        };\r\n    }\r\n    const definition = {\r\n        model: {\r\n            key: 'alignment',\r\n            values: options.map(option => option.name)\r\n        },\r\n        view\r\n    };\r\n    return definition;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module alignment/alignmentui\r\n */\r\nimport { Plugin, icons } from 'ckeditor5/src/core';\r\nimport { ButtonView, createDropdown, addToolbarToDropdown } from 'ckeditor5/src/ui';\r\nimport { isSupported, normalizeAlignmentOptions } from './utils';\r\nconst iconsMap = new Map([\r\n    ['left', icons.alignLeft],\r\n    ['right', icons.alignRight],\r\n    ['center', icons.alignCenter],\r\n    ['justify', icons.alignJustify]\r\n]);\r\n/**\r\n * The default alignment UI plugin.\r\n *\r\n * It introduces the `'alignment:left'`, `'alignment:right'`, `'alignment:center'` and `'alignment:justify'` buttons\r\n * and the `'alignment'` dropdown.\r\n */\r\nexport default class AlignmentUI extends Plugin {\r\n    /**\r\n     * Returns the localized option titles provided by the plugin.\r\n     *\r\n     * The following localized titles corresponding with\r\n     * {@link module:alignment/alignmentconfig~AlignmentConfig#options} are available:\r\n     *\r\n     * * `'left'`,\r\n     * * `'right'`,\r\n     * * `'center'`,\r\n     * * `'justify'`.\r\n     *\r\n     * @readonly\r\n     */\r\n    get localizedOptionTitles() {\r\n        const t = this.editor.t;\r\n        return {\r\n            'left': t('Align left'),\r\n            'right': t('Align right'),\r\n            'center': t('Align center'),\r\n            'justify': t('Justify')\r\n        };\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'AlignmentUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const componentFactory = editor.ui.componentFactory;\r\n        const t = editor.t;\r\n        const options = normalizeAlignmentOptions(editor.config.get('alignment.options'));\r\n        options\r\n            .map(option => option.name)\r\n            .filter(isSupported)\r\n            .forEach(option => this._addButton(option));\r\n        componentFactory.add('alignment', locale => {\r\n            const dropdownView = createDropdown(locale);\r\n            // Add existing alignment buttons to dropdown's toolbar.\r\n            addToolbarToDropdown(dropdownView, () => options.map(option => componentFactory.create(`alignment:${option.name}`)), {\r\n                enableActiveItemFocusOnDropdownOpen: true,\r\n                isVertical: true,\r\n                ariaLabel: t('Text alignment toolbar')\r\n            });\r\n            // Configure dropdown properties an behavior.\r\n            dropdownView.buttonView.set({\r\n                label: t('Text alignment'),\r\n                tooltip: true\r\n            });\r\n            dropdownView.extendTemplate({\r\n                attributes: {\r\n                    class: 'ck-alignment-dropdown'\r\n                }\r\n            });\r\n            // The default icon depends on the direction of the content.\r\n            const defaultIcon = locale.contentLanguageDirection === 'rtl' ? iconsMap.get('right') : iconsMap.get('left');\r\n            const command = editor.commands.get('alignment');\r\n            // Change icon to reflect current selection's alignment.\r\n            dropdownView.buttonView.bind('icon').to(command, 'value', value => iconsMap.get(value) || defaultIcon);\r\n            // Enable button if any of the buttons is enabled.\r\n            dropdownView.bind('isEnabled').to(command, 'isEnabled');\r\n            // Focus the editable after executing the command.\r\n            // Overrides a default behaviour where the focus is moved to the dropdown button (#12125).\r\n            this.listenTo(dropdownView, 'execute', () => {\r\n                editor.editing.view.focus();\r\n            });\r\n            return dropdownView;\r\n        });\r\n    }\r\n    /**\r\n     * Helper method for initializing the button and linking it with an appropriate command.\r\n     *\r\n     * @param option The name of the alignment option for which the button is added.\r\n     */\r\n    _addButton(option) {\r\n        const editor = this.editor;\r\n        editor.ui.componentFactory.add(`alignment:${option}`, locale => {\r\n            const command = editor.commands.get('alignment');\r\n            const buttonView = new ButtonView(locale);\r\n            buttonView.set({\r\n                label: this.localizedOptionTitles[option],\r\n                icon: iconsMap.get(option),\r\n                tooltip: true,\r\n                isToggleable: true\r\n            });\r\n            // Bind button model to command.\r\n            buttonView.bind('isEnabled').to(command);\r\n            buttonView.bind('isOn').to(command, 'value', value => value === option);\r\n            // Execute command.\r\n            this.listenTo(buttonView, 'execute', () => {\r\n                editor.execute('alignment', { value: option });\r\n                editor.editing.view.focus();\r\n            });\r\n            return buttonView;\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module clipboard/clipboardobserver\r\n */\r\nimport { EventInfo } from '@ckeditor/ckeditor5-utils';\r\nimport { DataTransfer, DomEventObserver } from '@ckeditor/ckeditor5-engine';\r\n/**\r\n * Clipboard events observer.\r\n *\r\n * Fires the following events:\r\n *\r\n * * {@link module:engine/view/document~Document#event:clipboardInput},\r\n * * {@link module:engine/view/document~Document#event:paste},\r\n * * {@link module:engine/view/document~Document#event:copy},\r\n * * {@link module:engine/view/document~Document#event:cut},\r\n * * {@link module:engine/view/document~Document#event:drop},\r\n * * {@link module:engine/view/document~Document#event:dragover},\r\n * * {@link module:engine/view/document~Document#event:dragging},\r\n * * {@link module:engine/view/document~Document#event:dragstart},\r\n * * {@link module:engine/view/document~Document#event:dragend},\r\n * * {@link module:engine/view/document~Document#event:dragenter},\r\n * * {@link module:engine/view/document~Document#event:dragleave}.\r\n *\r\n * **Note**: This observer is not available by default (ckeditor5-engine does not add it on its own).\r\n * To make it available, it needs to be added to {@link module:engine/view/document~Document} by using\r\n * the {@link module:engine/view/view~View#addObserver `View#addObserver()`} method. Alternatively, you can load the\r\n * {@link module:clipboard/clipboard~Clipboard} plugin which adds this observer automatically (because it uses it).\r\n */\r\nexport default class ClipboardObserver extends DomEventObserver {\r\n    constructor(view) {\r\n        super(view);\r\n        this.domEventType = [\r\n            'paste', 'copy', 'cut', 'drop', 'dragover', 'dragstart', 'dragend', 'dragenter', 'dragleave'\r\n        ];\r\n        const viewDocument = this.document;\r\n        this.listenTo(viewDocument, 'paste', handleInput('clipboardInput'), { priority: 'low' });\r\n        this.listenTo(viewDocument, 'drop', handleInput('clipboardInput'), { priority: 'low' });\r\n        this.listenTo(viewDocument, 'dragover', handleInput('dragging'), { priority: 'low' });\r\n        function handleInput(type) {\r\n            return (evt, data) => {\r\n                data.preventDefault();\r\n                const targetRanges = data.dropRange ? [data.dropRange] : null;\r\n                const eventInfo = new EventInfo(viewDocument, type);\r\n                viewDocument.fire(eventInfo, {\r\n                    dataTransfer: data.dataTransfer,\r\n                    method: evt.name,\r\n                    targetRanges,\r\n                    target: data.target,\r\n                    domEvent: data.domEvent\r\n                });\r\n                // If CKEditor handled the input, do not bubble the original event any further.\r\n                // This helps external integrations recognize that fact and act accordingly.\r\n                // https://github.com/ckeditor/ckeditor5-upload/issues/92\r\n                if (eventInfo.stop.called) {\r\n                    data.stopPropagation();\r\n                }\r\n            };\r\n        }\r\n    }\r\n    onDomEvent(domEvent) {\r\n        const nativeDataTransfer = 'clipboardData' in domEvent ? domEvent.clipboardData : domEvent.dataTransfer;\r\n        const cacheFiles = domEvent.type == 'drop' || domEvent.type == 'paste';\r\n        const evtData = {\r\n            dataTransfer: new DataTransfer(nativeDataTransfer, { cacheFiles })\r\n        };\r\n        if (domEvent.type == 'drop' || domEvent.type == 'dragover') {\r\n            evtData.dropRange = getDropViewRange(this.view, domEvent);\r\n        }\r\n        this.fire(domEvent.type, domEvent, evtData);\r\n    }\r\n}\r\nfunction getDropViewRange(view, domEvent) {\r\n    const domDoc = domEvent.target.ownerDocument;\r\n    const x = domEvent.clientX;\r\n    const y = domEvent.clientY;\r\n    let domRange;\r\n    // Webkit & Blink.\r\n    if (domDoc.caretRangeFromPoint && domDoc.caretRangeFromPoint(x, y)) {\r\n        domRange = domDoc.caretRangeFromPoint(x, y);\r\n    }\r\n    // FF.\r\n    else if (domEvent.rangeParent) {\r\n        domRange = domDoc.createRange();\r\n        domRange.setStart(domEvent.rangeParent, domEvent.rangeOffset);\r\n        domRange.collapse(true);\r\n    }\r\n    if (domRange) {\r\n        return view.domConverter.domRangeToView(domRange);\r\n    }\r\n    return null;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n// Elements which should not have empty-line padding.\r\n// Most `view.ContainerElement` want to be separate by new-line, but some are creating one structure\r\n// together (like `<li>`) so it is better to separate them by only one \"\\n\".\r\nconst smallPaddingElements = ['figcaption', 'li'];\r\n/**\r\n * Converts {@link module:engine/view/item~Item view item} and all of its children to plain text.\r\n *\r\n * @param viewItem View item to convert.\r\n * @returns Plain text representation of `viewItem`.\r\n */\r\nexport default function viewToPlainText(viewItem) {\r\n    let text = '';\r\n    if (viewItem.is('$text') || viewItem.is('$textProxy')) {\r\n        // If item is `Text` or `TextProxy` simple take its text data.\r\n        text = viewItem.data;\r\n    }\r\n    else if (viewItem.is('element', 'img') && viewItem.hasAttribute('alt')) {\r\n        // Special case for images - use alt attribute if it is provided.\r\n        text = viewItem.getAttribute('alt');\r\n    }\r\n    else if (viewItem.is('element', 'br')) {\r\n        // A soft break should be converted into a single line break (#8045).\r\n        text = '\\n';\r\n    }\r\n    else {\r\n        // Other elements are document fragments, attribute elements or container elements.\r\n        // They don't have their own text value, so convert their children.\r\n        let prev = null;\r\n        for (const child of viewItem.getChildren()) {\r\n            const childText = viewToPlainText(child);\r\n            // Separate container element children with one or more new-line characters.\r\n            if (prev && (prev.is('containerElement') || child.is('containerElement'))) {\r\n                if (smallPaddingElements.includes(prev.name) ||\r\n                    smallPaddingElements.includes(child.name)) {\r\n                    text += '\\n';\r\n                }\r\n                else {\r\n                    text += '\\n\\n';\r\n                }\r\n            }\r\n            text += childText;\r\n            prev = child;\r\n        }\r\n    }\r\n    return text;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module clipboard/clipboardpipeline\r\n */\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\nimport { EventInfo } from '@ckeditor/ckeditor5-utils';\r\nimport ClipboardObserver from './clipboardobserver';\r\nimport plainTextToHtml from './utils/plaintexttohtml';\r\nimport normalizeClipboardHtml from './utils/normalizeclipboarddata';\r\nimport viewToPlainText from './utils/viewtoplaintext';\r\n// Input pipeline events overview:\r\n//\r\n//              ┌──────────────────────┐          ┌──────────────────────┐\r\n//              │     view.Document    │          │     view.Document    │\r\n//              │         paste        │          │         drop         │\r\n//              └───────────┬──────────┘          └───────────┬──────────┘\r\n//                          │                                 │\r\n//                          └────────────────┌────────────────┘\r\n//                                           │\r\n//                                 ┌─────────V────────┐\r\n//                                 │   view.Document  │   Retrieves text/html or text/plain from data.dataTransfer\r\n//                                 │  clipboardInput  │   and processes it to view.DocumentFragment.\r\n//                                 └─────────┬────────┘\r\n//                                           │\r\n//                               ┌───────────V───────────┐\r\n//                               │   ClipboardPipeline   │   Converts view.DocumentFragment to model.DocumentFragment.\r\n//                               │  inputTransformation  │\r\n//                               └───────────┬───────────┘\r\n//                                           │\r\n//                                ┌──────────V──────────┐\r\n//                                │  ClipboardPipeline  │   Calls model.insertContent().\r\n//                                │   contentInsertion  │\r\n//                                └─────────────────────┘\r\n//\r\n//\r\n// Output pipeline events overview:\r\n//\r\n//              ┌──────────────────────┐          ┌──────────────────────┐\r\n//              │     view.Document    │          │     view.Document    │   Retrieves the selected model.DocumentFragment\r\n//              │         copy         │          │          cut         │   and converts it to view.DocumentFragment.\r\n//              └───────────┬──────────┘          └───────────┬──────────┘\r\n//                          │                                 │\r\n//                          └────────────────┌────────────────┘\r\n//                                           │\r\n//                                 ┌─────────V────────┐\r\n//                                 │   view.Document  │   Processes view.DocumentFragment to text/html and text/plain\r\n//                                 │  clipboardOutput │   and stores the results in data.dataTransfer.\r\n//                                 └──────────────────┘\r\n//\r\n/**\r\n * The clipboard pipeline feature. It is responsible for intercepting the `paste` and `drop` events and\r\n * passing the pasted content through a series of events in order to insert it into the editor's content.\r\n * It also handles the `cut` and `copy` events to fill the native clipboard with the serialized editor's data.\r\n *\r\n * # Input pipeline\r\n *\r\n * The behavior of the default handlers (all at a `low` priority):\r\n *\r\n * ## Event: `paste` or `drop`\r\n *\r\n * 1. Translates the event data.\r\n * 2. Fires the {@link module:engine/view/document~Document#event:clipboardInput `view.Document#clipboardInput`} event.\r\n *\r\n * ## Event: `view.Document#clipboardInput`\r\n *\r\n * 1. If the `data.content` event field is already set (by some listener on a higher priority), it takes this content and fires the event\r\n *    from the last point.\r\n * 2. Otherwise, it retrieves `text/html` or `text/plain` from `data.dataTransfer`.\r\n * 3. Normalizes the raw data by applying simple filters on string data.\r\n * 4. Processes the raw data to {@link module:engine/view/documentfragment~DocumentFragment `view.DocumentFragment`} with the\r\n *    {@link module:engine/controller/datacontroller~DataController#htmlProcessor `DataController#htmlProcessor`}.\r\n * 5. Fires the {@link module:clipboard/clipboardpipeline~ClipboardPipeline#event:inputTransformation\r\n *   `ClipboardPipeline#inputTransformation`} event with the view document fragment in the `data.content` event field.\r\n *\r\n * ## Event: `ClipboardPipeline#inputTransformation`\r\n *\r\n * 1. Converts {@link module:engine/view/documentfragment~DocumentFragment `view.DocumentFragment`} from the `data.content` field to\r\n *    {@link module:engine/model/documentfragment~DocumentFragment `model.DocumentFragment`}.\r\n * 2. Fires the {@link module:clipboard/clipboardpipeline~ClipboardPipeline#event:contentInsertion `ClipboardPipeline#contentInsertion`}\r\n *    event with the model document fragment in the `data.content` event field.\r\n *    **Note**: The `ClipboardPipeline#contentInsertion` event is fired within a model change block to allow other handlers\r\n *    to run in the same block without post-fixers called in between (i.e., the selection post-fixer).\r\n *\r\n * ## Event: `ClipboardPipeline#contentInsertion`\r\n *\r\n * 1. Calls {@link module:engine/model/model~Model#insertContent `model.insertContent()`} to insert `data.content`\r\n *    at the current selection position.\r\n *\r\n * # Output pipeline\r\n *\r\n * The behavior of the default handlers (all at a `low` priority):\r\n *\r\n * ## Event: `copy`, `cut` or `dragstart`\r\n *\r\n * 1. Retrieves the selected {@link module:engine/model/documentfragment~DocumentFragment `model.DocumentFragment`} by calling\r\n *    {@link module:engine/model/model~Model#getSelectedContent `model#getSelectedContent()`}.\r\n * 2. Converts the model document fragment to {@link module:engine/view/documentfragment~DocumentFragment `view.DocumentFragment`}.\r\n * 3. Fires the {@link module:engine/view/document~Document#event:clipboardOutput `view.Document#clipboardOutput`} event\r\n *    with the view document fragment in the `data.content` event field.\r\n *\r\n * ## Event: `view.Document#clipboardOutput`\r\n *\r\n * 1. Processes `data.content` to HTML and plain text with the\r\n *    {@link module:engine/controller/datacontroller~DataController#htmlProcessor `DataController#htmlProcessor`}.\r\n * 2. Updates the `data.dataTransfer` data for `text/html` and `text/plain` with the processed data.\r\n * 3. For the `cut` method, calls {@link module:engine/model/model~Model#deleteContent `model.deleteContent()`}\r\n *    on the current selection.\r\n *\r\n * Read more about the clipboard integration in the {@glink framework/deep-dive/clipboard clipboard deep-dive} guide.\r\n */\r\nexport default class ClipboardPipeline extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ClipboardPipeline';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const view = editor.editing.view;\r\n        view.addObserver(ClipboardObserver);\r\n        this._setupPasteDrop();\r\n        this._setupCopyCut();\r\n    }\r\n    /**\r\n     * The clipboard paste pipeline.\r\n     */\r\n    _setupPasteDrop() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const view = editor.editing.view;\r\n        const viewDocument = view.document;\r\n        // Pasting is disabled when selection is in non-editable place.\r\n        // Dropping is disabled in drag and drop handler.\r\n        this.listenTo(viewDocument, 'clipboardInput', (evt, data) => {\r\n            if (data.method == 'paste' && !editor.model.canEditAt(editor.model.document.selection)) {\r\n                evt.stop();\r\n            }\r\n        }, { priority: 'highest' });\r\n        this.listenTo(viewDocument, 'clipboardInput', (evt, data) => {\r\n            const dataTransfer = data.dataTransfer;\r\n            let content;\r\n            // Some feature could already inject content in the higher priority event handler (i.e., codeBlock).\r\n            if (data.content) {\r\n                content = data.content;\r\n            }\r\n            else {\r\n                let contentData = '';\r\n                if (dataTransfer.getData('text/html')) {\r\n                    contentData = normalizeClipboardHtml(dataTransfer.getData('text/html'));\r\n                }\r\n                else if (dataTransfer.getData('text/plain')) {\r\n                    contentData = plainTextToHtml(dataTransfer.getData('text/plain'));\r\n                }\r\n                content = this.editor.data.htmlProcessor.toView(contentData);\r\n            }\r\n            const eventInfo = new EventInfo(this, 'inputTransformation');\r\n            this.fire(eventInfo, {\r\n                content,\r\n                dataTransfer,\r\n                targetRanges: data.targetRanges,\r\n                method: data.method\r\n            });\r\n            // If CKEditor handled the input, do not bubble the original event any further.\r\n            // This helps external integrations recognize this fact and act accordingly.\r\n            // https://github.com/ckeditor/ckeditor5-upload/issues/92\r\n            if (eventInfo.stop.called) {\r\n                evt.stop();\r\n            }\r\n            view.scrollToTheSelection();\r\n        }, { priority: 'low' });\r\n        this.listenTo(this, 'inputTransformation', (evt, data) => {\r\n            if (data.content.isEmpty) {\r\n                return;\r\n            }\r\n            const dataController = this.editor.data;\r\n            // Convert the pasted content into a model document fragment.\r\n            // The conversion is contextual, but in this case an \"all allowed\" context is needed\r\n            // and for that we use the $clipboardHolder item.\r\n            const modelFragment = dataController.toModel(data.content, '$clipboardHolder');\r\n            if (modelFragment.childCount == 0) {\r\n                return;\r\n            }\r\n            evt.stop();\r\n            // Fire content insertion event in a single change block to allow other handlers to run in the same block\r\n            // without post-fixers called in between (i.e., the selection post-fixer).\r\n            model.change(() => {\r\n                this.fire('contentInsertion', {\r\n                    content: modelFragment,\r\n                    method: data.method,\r\n                    dataTransfer: data.dataTransfer,\r\n                    targetRanges: data.targetRanges\r\n                });\r\n            });\r\n        }, { priority: 'low' });\r\n        this.listenTo(this, 'contentInsertion', (evt, data) => {\r\n            data.resultRange = model.insertContent(data.content);\r\n        }, { priority: 'low' });\r\n    }\r\n    /**\r\n     * The clipboard copy/cut pipeline.\r\n     */\r\n    _setupCopyCut() {\r\n        const editor = this.editor;\r\n        const modelDocument = editor.model.document;\r\n        const view = editor.editing.view;\r\n        const viewDocument = view.document;\r\n        const onCopyCut = (evt, data) => {\r\n            const dataTransfer = data.dataTransfer;\r\n            data.preventDefault();\r\n            const content = editor.data.toView(editor.model.getSelectedContent(modelDocument.selection));\r\n            viewDocument.fire('clipboardOutput', {\r\n                dataTransfer,\r\n                content,\r\n                method: evt.name\r\n            });\r\n        };\r\n        this.listenTo(viewDocument, 'copy', onCopyCut, { priority: 'low' });\r\n        this.listenTo(viewDocument, 'cut', (evt, data) => {\r\n            // Cutting is disabled when selection is in non-editable place.\r\n            // See: https://github.com/ckeditor/ckeditor5-clipboard/issues/26.\r\n            if (!editor.model.canEditAt(editor.model.document.selection)) {\r\n                data.preventDefault();\r\n            }\r\n            else {\r\n                onCopyCut(evt, data);\r\n            }\r\n        }, { priority: 'low' });\r\n        this.listenTo(viewDocument, 'clipboardOutput', (evt, data) => {\r\n            if (!data.content.isEmpty) {\r\n                data.dataTransfer.setData('text/html', this.editor.data.htmlProcessor.toData(data.content));\r\n                data.dataTransfer.setData('text/plain', viewToPlainText(data.content));\r\n            }\r\n            if (data.method == 'cut') {\r\n                editor.model.deleteContent(modelDocument.selection);\r\n            }\r\n        }, { priority: 'low' });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module clipboard/utils/normalizeclipboarddata\r\n */\r\n/**\r\n * Removes some popular browser quirks out of the clipboard data (HTML).\r\n * Removes all HTML comments. These are considered an internal thing and it makes little sense if they leak into the editor data.\r\n *\r\n * @param data The HTML data to normalize.\r\n * @returns Normalized HTML.\r\n */\r\nexport default function normalizeClipboardData(data) {\r\n    return data\r\n        .replace(/<span(?: class=\"Apple-converted-space\"|)>(\\s+)<\\/span>/g, (fullMatch, spaces) => {\r\n        // Handle the most popular and problematic case when even a single space becomes an nbsp;.\r\n        // Decode those to normal spaces. Read more in https://github.com/ckeditor/ckeditor5-clipboard/issues/2.\r\n        if (spaces.length == 1) {\r\n            return ' ';\r\n        }\r\n        return spaces;\r\n    })\r\n        // Remove all HTML comments.\r\n        .replace(/<!--[\\s\\S]*?-->/g, '');\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module clipboard/utils/plaintexttohtml\r\n */\r\n/**\r\n * Converts plain text to its HTML-ized version.\r\n *\r\n * @param text The plain text to convert.\r\n * @returns HTML generated from the plain text.\r\n */\r\nexport default function plainTextToHtml(text) {\r\n    text = text\r\n        // Encode <>.\r\n        .replace(/</g, '&lt;')\r\n        .replace(/>/g, '&gt;')\r\n        // Creates a paragraph for each double line break.\r\n        .replace(/\\r?\\n\\r?\\n/g, '</p><p>')\r\n        // Creates a line break for each single line break.\r\n        .replace(/\\r?\\n/g, '<br>')\r\n        // Replace tabs with four spaces.\r\n        .replace(/\\t/g, '&nbsp;&nbsp;&nbsp;&nbsp;')\r\n        // Preserve trailing spaces (only the first and last one – the rest is handled below).\r\n        .replace(/^\\s/, '&nbsp;')\r\n        .replace(/\\s$/, '&nbsp;')\r\n        // Preserve other subsequent spaces now.\r\n        .replace(/\\s\\s/g, ' &nbsp;');\r\n    if (text.includes('</p><p>') || text.includes('<br>')) {\r\n        // If we created paragraphs above, add the trailing ones.\r\n        text = `<p>${text}</p>`;\r\n    }\r\n    // TODO:\r\n    // * What about '\\nfoo' vs ' foo'?\r\n    return text;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * Change buffer allows to group atomic changes (like characters that have been typed) into\r\n * {@link module:engine/model/batch~Batch batches}.\r\n *\r\n * Batches represent single undo steps, hence changes added to one single batch are undone together.\r\n *\r\n * The buffer has a configurable limit of atomic changes that it can accommodate. After the limit was\r\n * exceeded (see {@link ~ChangeBuffer#input}), a new batch is created in {@link ~ChangeBuffer#batch}.\r\n *\r\n * To use the change buffer you need to let it know about the number of changes that were added to the batch:\r\n *\r\n * ```ts\r\n * const buffer = new ChangeBuffer( model, LIMIT );\r\n *\r\n * // Later on in your feature:\r\n * buffer.batch.insert( pos, insertedCharacters );\r\n * buffer.input( insertedCharacters.length );\r\n * ```\r\n */\r\nexport default class ChangeBuffer {\r\n    /**\r\n     * Creates a new instance of the change buffer.\r\n     *\r\n     * @param limit The maximum number of atomic changes which can be contained in one batch.\r\n     */\r\n    constructor(model, limit = 20) {\r\n        /**\r\n         * The current batch instance.\r\n         */\r\n        this._batch = null;\r\n        this.model = model;\r\n        this._size = 0;\r\n        this.limit = limit;\r\n        this._isLocked = false;\r\n        // The function to be called in order to notify the buffer about batches which appeared in the document.\r\n        // The callback will check whether it is a new batch and in that case the buffer will be flushed.\r\n        //\r\n        // The reason why the buffer needs to be flushed whenever a new batch appears is that the changes added afterwards\r\n        // should be added to a new batch. For instance, when the user types, then inserts an image, and then types again,\r\n        // the characters typed after inserting the image should be added to a different batch than the characters typed before.\r\n        this._changeCallback = (evt, batch) => {\r\n            if (batch.isLocal && batch.isUndoable && batch !== this._batch) {\r\n                this._reset(true);\r\n            }\r\n        };\r\n        this._selectionChangeCallback = () => {\r\n            this._reset();\r\n        };\r\n        this.model.document.on('change', this._changeCallback);\r\n        this.model.document.selection.on('change:range', this._selectionChangeCallback);\r\n        this.model.document.selection.on('change:attribute', this._selectionChangeCallback);\r\n    }\r\n    /**\r\n     * The current batch to which a feature should add its operations. Once the {@link #size}\r\n     * is reached or exceeds the {@link #limit}, the batch is set to a new instance and the size is reset.\r\n     */\r\n    get batch() {\r\n        if (!this._batch) {\r\n            this._batch = this.model.createBatch({ isTyping: true });\r\n        }\r\n        return this._batch;\r\n    }\r\n    /**\r\n     * The number of atomic changes in the buffer. Once it exceeds the {@link #limit},\r\n     * the {@link #batch batch} is set to a new one.\r\n     */\r\n    get size() {\r\n        return this._size;\r\n    }\r\n    /**\r\n     * The input number of changes into the buffer. Once the {@link #size} is\r\n     * reached or exceeds the {@link #limit}, the batch is set to a new instance and the size is reset.\r\n     *\r\n     * @param changeCount The number of atomic changes to input.\r\n     */\r\n    input(changeCount) {\r\n        this._size += changeCount;\r\n        if (this._size >= this.limit) {\r\n            this._reset(true);\r\n        }\r\n    }\r\n    /**\r\n     * Whether the buffer is locked. A locked buffer cannot be reset unless it gets unlocked.\r\n     */\r\n    get isLocked() {\r\n        return this._isLocked;\r\n    }\r\n    /**\r\n     * Locks the buffer.\r\n     */\r\n    lock() {\r\n        this._isLocked = true;\r\n    }\r\n    /**\r\n     * Unlocks the buffer.\r\n     */\r\n    unlock() {\r\n        this._isLocked = false;\r\n    }\r\n    /**\r\n     * Destroys the buffer.\r\n     */\r\n    destroy() {\r\n        this.model.document.off('change', this._changeCallback);\r\n        this.model.document.selection.off('change:range', this._selectionChangeCallback);\r\n        this.model.document.selection.off('change:attribute', this._selectionChangeCallback);\r\n    }\r\n    /**\r\n     * Resets the change buffer.\r\n     *\r\n     * @param ignoreLock Whether internal lock {@link #isLocked} should be ignored.\r\n     */\r\n    _reset(ignoreLock = false) {\r\n        if (!this.isLocked || ignoreLock) {\r\n            this._batch = null;\r\n            this._size = 0;\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module typing/inserttextcommand\r\n */\r\nimport { Command } from '@ckeditor/ckeditor5-core';\r\nimport ChangeBuffer from './utils/changebuffer';\r\n/**\r\n * The insert text command. Used by the {@link module:typing/input~Input input feature} to handle typing.\r\n */\r\nexport default class InsertTextCommand extends Command {\r\n    /**\r\n     * Creates an instance of the command.\r\n     *\r\n     * @param undoStepSize The maximum number of atomic changes\r\n     * which can be contained in one batch in the command buffer.\r\n     */\r\n    constructor(editor, undoStepSize) {\r\n        super(editor);\r\n        this._buffer = new ChangeBuffer(editor.model, undoStepSize);\r\n        // Since this command may execute on different selectable than selection, it should be checked directly in execute block.\r\n        this._isEnabledBasedOnSelection = false;\r\n    }\r\n    /**\r\n     * The current change buffer.\r\n     */\r\n    get buffer() {\r\n        return this._buffer;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        this._buffer.destroy();\r\n    }\r\n    /**\r\n     * Executes the input command. It replaces the content within the given range with the given text.\r\n     * Replacing is a two step process, first the content within the range is removed and then the new text is inserted\r\n     * at the beginning of the range (which after the removal is a collapsed range).\r\n     *\r\n     * @fires execute\r\n     * @param options The command options.\r\n     */\r\n    execute(options = {}) {\r\n        const model = this.editor.model;\r\n        const doc = model.document;\r\n        const text = options.text || '';\r\n        const textInsertions = text.length;\r\n        let selection = doc.selection;\r\n        if (options.selection) {\r\n            selection = options.selection;\r\n        }\r\n        else if (options.range) {\r\n            selection = model.createSelection(options.range);\r\n        }\r\n        // Stop executing if selectable is in non-editable place.\r\n        if (!model.canEditAt(selection)) {\r\n            return;\r\n        }\r\n        const resultRange = options.resultRange;\r\n        model.enqueueChange(this._buffer.batch, writer => {\r\n            this._buffer.lock();\r\n            model.deleteContent(selection);\r\n            if (text) {\r\n                model.insertContent(writer.createText(text, doc.selection.getAttributes()), selection);\r\n            }\r\n            if (resultRange) {\r\n                writer.setSelection(resultRange);\r\n            }\r\n            else if (!selection.is('documentSelection')) {\r\n                writer.setSelection(selection);\r\n            }\r\n            this._buffer.unlock();\r\n            this._buffer.input(textInsertions);\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module typing/inserttextobserver\r\n */\r\nimport { env, EventInfo } from '@ckeditor/ckeditor5-utils';\r\nimport { DomEventData, Observer } from '@ckeditor/ckeditor5-engine';\r\nconst TYPING_INPUT_TYPES = [\r\n    // For collapsed range:\r\n    //\t- This one is a regular typing (all browsers, all systems).\r\n    //\t- This one is used by Chrome when typing accented letter – 2nd step when the user selects the accent (Mac).\r\n    // For non-collapsed range:\r\n    //\t- This one is used by Chrome when typing accented letter – when the selection box first appears (Mac).\r\n    //\t- This one is used by Safari when accepting spell check suggestions from the context menu (Mac).\r\n    'insertText',\r\n    // This one is used by Safari when typing accented letter (Mac).\r\n    // This one is used by Safari when accepting spell check suggestions from the autocorrection pop-up (Mac).\r\n    'insertReplacementText'\r\n];\r\n/**\r\n * Text insertion observer introduces the {@link module:engine/view/document~Document#event:insertText} event.\r\n */\r\nexport default class InsertTextObserver extends Observer {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(view) {\r\n        super(view);\r\n        // On Android composition events should immediately be applied to the model. Rendering is not disabled.\r\n        // On non-Android the model is updated only on composition end.\r\n        // On Android we can't rely on composition start/end to update model.\r\n        if (env.isAndroid) {\r\n            TYPING_INPUT_TYPES.push('insertCompositionText');\r\n        }\r\n        const viewDocument = view.document;\r\n        viewDocument.on('beforeinput', (evt, data) => {\r\n            if (!this.isEnabled) {\r\n                return;\r\n            }\r\n            const { data: text, targetRanges, inputType, domEvent } = data;\r\n            if (!TYPING_INPUT_TYPES.includes(inputType)) {\r\n                return;\r\n            }\r\n            const eventInfo = new EventInfo(viewDocument, 'insertText');\r\n            viewDocument.fire(eventInfo, new DomEventData(view, domEvent, {\r\n                text,\r\n                selection: view.createSelection(targetRanges)\r\n            }));\r\n            // Stop the beforeinput event if `delete` event was stopped.\r\n            // https://github.com/ckeditor/ckeditor5/issues/753\r\n            if (eventInfo.stop.called) {\r\n                evt.stop();\r\n            }\r\n        });\r\n        // Note: The priority must be lower than the CompositionObserver handler to call it after the renderer is unblocked.\r\n        viewDocument.on('compositionend', (evt, { data, domEvent }) => {\r\n            // On Android composition events are immediately applied to the model.\r\n            // On non-Android the model is updated only on composition end.\r\n            // On Android we can't rely on composition start/end to update model.\r\n            if (!this.isEnabled || env.isAndroid) {\r\n                return;\r\n            }\r\n            // In case of aborted composition.\r\n            if (!data) {\r\n                return;\r\n            }\r\n            // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n            // @if CK_DEBUG_TYPING // \tconsole.log( `%c[InsertTextObserver]%c Fire insertText event, text: ${ JSON.stringify( data ) }`,\r\n            // @if CK_DEBUG_TYPING // \t\t'font-weight: bold; color: green;', ''\r\n            // @if CK_DEBUG_TYPING // \t);\r\n            // @if CK_DEBUG_TYPING // }\r\n            // How do we know where to insert the composed text?\r\n            // The selection observer is blocked and the view is not updated with the composition changes.\r\n            // There were three options:\r\n            //   - Store the selection on `compositionstart` and use it now. This wouldn't work in RTC\r\n            //     where the view would change and the stored selection might get incorrect.\r\n            //     We'd need to fallback to the current view selection anyway.\r\n            //   - Use the current view selection. This is a bit weird and non-intuitive because\r\n            //     this isn't necessarily the selection on which the user started composing.\r\n            //     We cannot even know whether it's still collapsed (there might be some weird\r\n            //     editor feature that changed it in unpredictable ways for us). But it's by far\r\n            //     the simplest solution and should be stable (the selection is definitely correct)\r\n            //     and probably mostly predictable (features usually don't modify the selection\r\n            //     unless called explicitly by the user).\r\n            //   - Try to follow it from the `beforeinput` events. This would be really complex as each\r\n            //     `beforeinput` would come with just the range it's changing and we'd need to calculate that.\r\n            // We decided to go with the 2nd option for its simplicity and stability.\r\n            viewDocument.fire('insertText', new DomEventData(view, domEvent, {\r\n                text: data,\r\n                selection: viewDocument.selection\r\n            }));\r\n        }, { priority: 'lowest' });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    observe() { }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    stopObserving() { }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module typing/input\r\n */\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\nimport { env } from '@ckeditor/ckeditor5-utils';\r\nimport InsertTextCommand from './inserttextcommand';\r\nimport InsertTextObserver from './inserttextobserver';\r\n/**\r\n * Handles text input coming from the keyboard or other input methods.\r\n */\r\nexport default class Input extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'Input';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const view = editor.editing.view;\r\n        const modelSelection = model.document.selection;\r\n        view.addObserver(InsertTextObserver);\r\n        // TODO The above default configuration value should be defined using editor.config.define() once it's fixed.\r\n        const insertTextCommand = new InsertTextCommand(editor, editor.config.get('typing.undoStep') || 20);\r\n        // Register `insertText` command and add `input` command as an alias for backward compatibility.\r\n        editor.commands.add('insertText', insertTextCommand);\r\n        editor.commands.add('input', insertTextCommand);\r\n        this.listenTo(view.document, 'insertText', (evt, data) => {\r\n            // Rendering is disabled while composing so prevent events that will be rendered by the engine\r\n            // and should not be applied by the browser.\r\n            if (!view.document.isComposing) {\r\n                data.preventDefault();\r\n            }\r\n            const { text, selection: viewSelection, resultRange: viewResultRange } = data;\r\n            // If view selection was specified, translate it to model selection.\r\n            const modelRanges = Array.from(viewSelection.getRanges()).map(viewRange => {\r\n                return editor.editing.mapper.toModelRange(viewRange);\r\n            });\r\n            let insertText = text;\r\n            // Typing in English on Android is firing composition events for the whole typed word.\r\n            // We need to check the target range text to only apply the difference.\r\n            if (env.isAndroid) {\r\n                const selectedText = Array.from(modelRanges[0].getItems()).reduce((rangeText, node) => {\r\n                    return rangeText + (node.is('$textProxy') ? node.data : '');\r\n                }, '');\r\n                if (selectedText) {\r\n                    if (selectedText.length <= insertText.length) {\r\n                        if (insertText.startsWith(selectedText)) {\r\n                            insertText = insertText.substring(selectedText.length);\r\n                            modelRanges[0].start = modelRanges[0].start.getShiftedBy(selectedText.length);\r\n                        }\r\n                    }\r\n                    else {\r\n                        if (selectedText.startsWith(insertText)) {\r\n                            // TODO this should be mapped as delete?\r\n                            modelRanges[0].start = modelRanges[0].start.getShiftedBy(insertText.length);\r\n                            insertText = '';\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            const insertTextCommandData = {\r\n                text: insertText,\r\n                selection: model.createSelection(modelRanges)\r\n            };\r\n            // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n            // @if CK_DEBUG_TYPING // \tconsole.log( '%c[Input]%c Execute insertText:',\r\n            // @if CK_DEBUG_TYPING // \t\t'font-weight: bold; color: green;', '',\r\n            // @if CK_DEBUG_TYPING // \t\tinsertText,\r\n            // @if CK_DEBUG_TYPING // \t\t`[${ modelRanges[ 0 ].start.path }]-[${ modelRanges[ 0 ].end.path }]`\r\n            // @if CK_DEBUG_TYPING // \t);\r\n            // @if CK_DEBUG_TYPING // }\r\n            if (viewResultRange) {\r\n                insertTextCommandData.resultRange = editor.editing.mapper.toModelRange(viewResultRange);\r\n            }\r\n            editor.execute('insertText', insertTextCommandData);\r\n        });\r\n        if (env.isAndroid) {\r\n            // On Android with English keyboard, the composition starts just by putting caret\r\n            // at the word end or by selecting a table column. This is not a real composition started.\r\n            // Trigger delete content on first composition key pressed.\r\n            this.listenTo(view.document, 'keydown', (evt, data) => {\r\n                if (modelSelection.isCollapsed || data.keyCode != 229 || !view.document.isComposing) {\r\n                    return;\r\n                }\r\n                // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n                // @if CK_DEBUG_TYPING // \tconst firstPositionPath = modelSelection.getFirstPosition()!.path;\r\n                // @if CK_DEBUG_TYPING // \tconst lastPositionPath = modelSelection.getLastPosition()!.path;\r\n                // @if CK_DEBUG_TYPING // \tconsole.log( '%c[Input]%c KeyDown 229 -> model.deleteContent()',\r\n                // @if CK_DEBUG_TYPING // \t\t'font-weight: bold; color: green;', '',\r\n                // @if CK_DEBUG_TYPING // \t\t`[${ firstPositionPath }]-[${ lastPositionPath }]`\r\n                // @if CK_DEBUG_TYPING // \t);\r\n                // @if CK_DEBUG_TYPING // }\r\n                deleteSelectionContent(model, insertTextCommand);\r\n            });\r\n        }\r\n        else {\r\n            // Note: The priority must precede the CompositionObserver handler to call it before\r\n            // the renderer is blocked, because we want to render this change.\r\n            this.listenTo(view.document, 'compositionstart', () => {\r\n                if (modelSelection.isCollapsed) {\r\n                    return;\r\n                }\r\n                // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n                // @if CK_DEBUG_TYPING // \tconst firstPositionPath = modelSelection.getFirstPosition()!.path;\r\n                // @if CK_DEBUG_TYPING // \tconst lastPositionPath = modelSelection.getLastPosition()!.path;\r\n                // @if CK_DEBUG_TYPING // \tconsole.log( '%c[Input]%c Composition start -> model.deleteContent()',\r\n                // @if CK_DEBUG_TYPING // \t\t'font-weight: bold; color: green;', '',\r\n                // @if CK_DEBUG_TYPING // \t\t`[${ firstPositionPath }]-[${ lastPositionPath }]`\r\n                // @if CK_DEBUG_TYPING // \t);\r\n                // @if CK_DEBUG_TYPING // }\r\n                deleteSelectionContent(model, insertTextCommand);\r\n            });\r\n        }\r\n    }\r\n}\r\nfunction deleteSelectionContent(model, insertTextCommand) {\r\n    // By relying on the state of the input command we allow disabling the entire input easily\r\n    // by just disabling the input command. We could’ve used here the delete command but that\r\n    // would mean requiring the delete feature which would block loading one without the other.\r\n    // We could also check the editor.isReadOnly property, but that wouldn't allow to block\r\n    // the input without blocking other features.\r\n    if (!insertTextCommand.isEnabled) {\r\n        return;\r\n    }\r\n    const buffer = insertTextCommand.buffer;\r\n    buffer.lock();\r\n    model.enqueueChange(buffer.batch, () => {\r\n        model.deleteContent(model.document.selection);\r\n    });\r\n    buffer.unlock();\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module typing/deletecommand\r\n */\r\nimport { Command } from '@ckeditor/ckeditor5-core';\r\nimport { count } from '@ckeditor/ckeditor5-utils';\r\nimport ChangeBuffer from './utils/changebuffer';\r\n/**\r\n * The delete command. Used by the {@link module:typing/delete~Delete delete feature} to handle the <kbd>Delete</kbd> and\r\n * <kbd>Backspace</kbd> keys.\r\n */\r\nexport default class DeleteCommand extends Command {\r\n    /**\r\n     * Creates an instance of the command.\r\n     *\r\n     * @param direction The directionality of the delete describing in what direction it\r\n     * should consume the content when the selection is collapsed.\r\n     */\r\n    constructor(editor, direction) {\r\n        super(editor);\r\n        this.direction = direction;\r\n        this._buffer = new ChangeBuffer(editor.model, editor.config.get('typing.undoStep'));\r\n        // Since this command may execute on different selectable than selection, it should be checked directly in execute block.\r\n        this._isEnabledBasedOnSelection = false;\r\n    }\r\n    /**\r\n     * The current change buffer.\r\n     */\r\n    get buffer() {\r\n        return this._buffer;\r\n    }\r\n    /**\r\n     * Executes the delete command. Depending on whether the selection is collapsed or not, deletes its content\r\n     * or a piece of content in the {@link #direction defined direction}.\r\n     *\r\n     * @fires execute\r\n     * @param options The command options.\r\n     * @param options.unit See {@link module:engine/model/utils/modifyselection~modifySelection}'s options.\r\n     * @param options.sequence A number describing which subsequent delete event it is without the key being released.\r\n     * See the {@link module:engine/view/document~Document#event:delete} event data.\r\n     * @param options.selection Selection to remove. If not set, current model selection will be used.\r\n     */\r\n    execute(options = {}) {\r\n        const model = this.editor.model;\r\n        const doc = model.document;\r\n        model.enqueueChange(this._buffer.batch, writer => {\r\n            this._buffer.lock();\r\n            const selection = writer.createSelection(options.selection || doc.selection);\r\n            // Don't execute command when selection is in non-editable place.\r\n            if (!model.canEditAt(selection)) {\r\n                return;\r\n            }\r\n            const sequence = options.sequence || 1;\r\n            // Do not replace the whole selected content if selection was collapsed.\r\n            // This prevents such situation:\r\n            //\r\n            // <h1></h1><p>[]</p>\t-->  <h1>[</h1><p>]</p> \t\t-->  <p></p>\r\n            // starting content\t\t-->   after `modifySelection`\t-->  after `deleteContent`.\r\n            const doNotResetEntireContent = selection.isCollapsed;\r\n            // Try to extend the selection in the specified direction.\r\n            if (selection.isCollapsed) {\r\n                model.modifySelection(selection, {\r\n                    direction: this.direction,\r\n                    unit: options.unit,\r\n                    treatEmojiAsSingleUnit: true\r\n                });\r\n            }\r\n            // Check if deleting in an empty editor. See #61.\r\n            if (this._shouldEntireContentBeReplacedWithParagraph(sequence)) {\r\n                this._replaceEntireContentWithParagraph(writer);\r\n                return;\r\n            }\r\n            // Check if deleting in the first empty block.\r\n            // See https://github.com/ckeditor/ckeditor5/issues/8137.\r\n            if (this._shouldReplaceFirstBlockWithParagraph(selection, sequence)) {\r\n                this.editor.execute('paragraph', { selection });\r\n                return;\r\n            }\r\n            // If selection is still collapsed, then there's nothing to delete.\r\n            if (selection.isCollapsed) {\r\n                return;\r\n            }\r\n            let changeCount = 0;\r\n            selection.getFirstRange().getMinimalFlatRanges().forEach(range => {\r\n                changeCount += count(range.getWalker({ singleCharacters: true, ignoreElementEnd: true, shallow: true }));\r\n            });\r\n            // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n            // @if CK_DEBUG_TYPING // \tconsole.log( '%c[DeleteCommand]%c Delete content',\r\n            // @if CK_DEBUG_TYPING // \t\t'font-weight: bold; color: green;', '',\r\n            // @if CK_DEBUG_TYPING // \t\t`[${ selection.getFirstPosition()!.path }]-[${ selection.getLastPosition()!.path }]`, options\r\n            // @if CK_DEBUG_TYPING // \t);\r\n            // @if CK_DEBUG_TYPING // }\r\n            model.deleteContent(selection, {\r\n                doNotResetEntireContent,\r\n                direction: this.direction\r\n            });\r\n            this._buffer.input(changeCount);\r\n            writer.setSelection(selection);\r\n            this._buffer.unlock();\r\n        });\r\n    }\r\n    /**\r\n     * If the user keeps <kbd>Backspace</kbd> or <kbd>Delete</kbd> key pressed, the content of the current\r\n     * editable will be cleared. However, this will not yet lead to resetting the remaining block to a paragraph\r\n     * (which happens e.g. when the user does <kbd>Ctrl</kbd> + <kbd>A</kbd>, <kbd>Backspace</kbd>).\r\n     *\r\n     * But, if the user pressed the key in an empty editable for the first time,\r\n     * we want to replace the entire content with a paragraph if:\r\n     *\r\n     * * the current limit element is empty,\r\n     * * the paragraph is allowed in the limit element,\r\n     * * the limit doesn't already have a paragraph inside.\r\n     *\r\n     * See https://github.com/ckeditor/ckeditor5-typing/issues/61.\r\n     *\r\n     * @param sequence A number describing which subsequent delete event it is without the key being released.\r\n     */\r\n    _shouldEntireContentBeReplacedWithParagraph(sequence) {\r\n        // Does nothing if user pressed and held the \"Backspace\" or \"Delete\" key.\r\n        if (sequence > 1) {\r\n            return false;\r\n        }\r\n        const model = this.editor.model;\r\n        const doc = model.document;\r\n        const selection = doc.selection;\r\n        const limitElement = model.schema.getLimitElement(selection);\r\n        // If a collapsed selection contains the whole content it means that the content is empty\r\n        // (from the user perspective).\r\n        const limitElementIsEmpty = selection.isCollapsed && selection.containsEntireContent(limitElement);\r\n        if (!limitElementIsEmpty) {\r\n            return false;\r\n        }\r\n        if (!model.schema.checkChild(limitElement, 'paragraph')) {\r\n            return false;\r\n        }\r\n        const limitElementFirstChild = limitElement.getChild(0);\r\n        // Does nothing if the limit element already contains only a paragraph.\r\n        // We ignore the case when paragraph might have some inline elements (<p><inlineWidget>[]</inlineWidget></p>)\r\n        // because we don't support such cases yet and it's unclear whether inlineWidget shouldn't be a limit itself.\r\n        if (limitElementFirstChild && limitElementFirstChild.is('element', 'paragraph')) {\r\n            return false;\r\n        }\r\n        return true;\r\n    }\r\n    /**\r\n     * The entire content is replaced with the paragraph. Selection is moved inside the paragraph.\r\n     *\r\n     * @param writer The model writer.\r\n     */\r\n    _replaceEntireContentWithParagraph(writer) {\r\n        const model = this.editor.model;\r\n        const doc = model.document;\r\n        const selection = doc.selection;\r\n        const limitElement = model.schema.getLimitElement(selection);\r\n        const paragraph = writer.createElement('paragraph');\r\n        writer.remove(writer.createRangeIn(limitElement));\r\n        writer.insert(paragraph, limitElement);\r\n        writer.setSelection(paragraph, 0);\r\n    }\r\n    /**\r\n     * Checks if the selection is inside an empty element that is the first child of the limit element\r\n     * and should be replaced with a paragraph.\r\n     *\r\n     * @param selection The selection.\r\n     * @param sequence A number describing which subsequent delete event it is without the key being released.\r\n     */\r\n    _shouldReplaceFirstBlockWithParagraph(selection, sequence) {\r\n        const model = this.editor.model;\r\n        // Does nothing if user pressed and held the \"Backspace\" key or it was a \"Delete\" button.\r\n        if (sequence > 1 || this.direction != 'backward') {\r\n            return false;\r\n        }\r\n        if (!selection.isCollapsed) {\r\n            return false;\r\n        }\r\n        const position = selection.getFirstPosition();\r\n        const limitElement = model.schema.getLimitElement(position);\r\n        const limitElementFirstChild = limitElement.getChild(0);\r\n        // Only elements that are direct children of the limit element can be replaced.\r\n        // Unwrapping from a block quote should be handled in a dedicated feature.\r\n        if (position.parent != limitElementFirstChild) {\r\n            return false;\r\n        }\r\n        // A block should be replaced only if it was empty.\r\n        if (!selection.containsEntireContent(limitElementFirstChild)) {\r\n            return false;\r\n        }\r\n        // Replace with a paragraph only if it's allowed there.\r\n        if (!model.schema.checkChild(limitElement, 'paragraph')) {\r\n            return false;\r\n        }\r\n        // Does nothing if the limit element already contains only a paragraph.\r\n        if (limitElementFirstChild.name == 'paragraph') {\r\n            return false;\r\n        }\r\n        return true;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module typing/deleteobserver\r\n */\r\nimport { env, keyCodes, isInsideCombinedSymbol, isInsideEmojiSequence, isInsideSurrogatePair } from '@ckeditor/ckeditor5-utils';\r\nimport { BubblingEventInfo, DomEventData, Observer } from '@ckeditor/ckeditor5-engine';\r\nconst DELETE_CHARACTER = 'character';\r\nconst DELETE_WORD = 'word';\r\nconst DELETE_CODE_POINT = 'codePoint';\r\nconst DELETE_SELECTION = 'selection';\r\nconst DELETE_BACKWARD = 'backward';\r\nconst DELETE_FORWARD = 'forward';\r\nconst DELETE_EVENT_TYPES = {\r\n    // --------------------------------------- Backward delete types -----------------------------------------------------\r\n    // This happens in Safari on Mac when some content is selected and Ctrl + K is pressed.\r\n    deleteContent: {\r\n        unit: DELETE_SELECTION,\r\n        // According to the Input Events Level 2 spec, this delete type has no direction\r\n        // but to keep things simple, let's default to backward.\r\n        direction: DELETE_BACKWARD\r\n    },\r\n    // Chrome and Safari on Mac: Backspace or Ctrl + H\r\n    deleteContentBackward: {\r\n        // This kind of deletions must be done on the code point-level instead of target range provided by the DOM beforeinput event.\r\n        // Take for instance \"👨‍👩‍👧‍👧\", it equals:\r\n        //\r\n        //\t* [ \"👨\", \"ZERO WIDTH JOINER\", \"👩\", \"ZERO WIDTH JOINER\", \"👧\", \"ZERO WIDTH JOINER\", \"👧\" ]\r\n        //\t* or simply \"\\u{1F468}\\u200D\\u{1F469}\\u200D\\u{1F467}\\u200D\\u{1F467}\"\r\n        //\r\n        // The range provided by the browser would cause the entire multi-byte grapheme to disappear while the user\r\n        // intention when deleting backwards (\"👨‍👩‍👧‍👧[]\", then backspace) is gradual \"decomposition\" (first to \"👨‍👩‍👧‍[]\",\r\n        // then to \"👨‍👩‍[]\", etc.).\r\n        //\r\n        //\t* \"👨‍👩‍👧‍👧[]\" + backward delete (by code point)  -> results in \"👨‍👩‍👧[]\", removed the last \"👧\" 👍\r\n        //\t* \"👨‍👩‍👧‍👧[]\" + backward delete (by character)  -> results in \"[]\", removed the whole grapheme 👎\r\n        //\r\n        // Deleting by code-point is simply a better UX. See \"deleteContentForward\" to learn more.\r\n        unit: DELETE_CODE_POINT,\r\n        direction: DELETE_BACKWARD\r\n    },\r\n    // On Mac: Option + Backspace.\r\n    // On iOS: Hold the backspace for a while and the whole words will start to disappear.\r\n    deleteWordBackward: {\r\n        unit: DELETE_WORD,\r\n        direction: DELETE_BACKWARD\r\n    },\r\n    // Safari on Mac: Cmd + Backspace\r\n    deleteHardLineBackward: {\r\n        unit: DELETE_SELECTION,\r\n        direction: DELETE_BACKWARD\r\n    },\r\n    // Chrome on Mac: Cmd + Backspace.\r\n    deleteSoftLineBackward: {\r\n        unit: DELETE_SELECTION,\r\n        direction: DELETE_BACKWARD\r\n    },\r\n    // --------------------------------------- Forward delete types -----------------------------------------------------\r\n    // Chrome on Mac: Fn + Backspace or Ctrl + D\r\n    // Safari on Mac: Ctrl + K or Ctrl + D\r\n    deleteContentForward: {\r\n        // Unlike backward delete, this delete must be performed by character instead of by code point, which\r\n        // provides the best UX for working with accented letters.\r\n        // Take, for example \"b̂\" (\"\\u0062\\u0302\", or [ \"LATIN SMALL LETTER B\", \"COMBINING CIRCUMFLEX ACCENT\" ]):\r\n        //\r\n        //\t* \"b̂[]\" + backward delete (by code point)  -> results in \"b[]\", removed the combining mark 👍\r\n        //\t* \"[]b̂\" + forward delete (by code point)   -> results in \"[]^\", a bare combining mark does that not make sense when alone 👎\r\n        //\t* \"[]b̂\" + forward delete (by character)    -> results in \"[]\", removed both \"b\" and the combining mark 👍\r\n        //\r\n        // See: \"deleteContentBackward\" to learn more.\r\n        unit: DELETE_CHARACTER,\r\n        direction: DELETE_FORWARD\r\n    },\r\n    // On Mac: Fn + Option + Backspace.\r\n    deleteWordForward: {\r\n        unit: DELETE_WORD,\r\n        direction: DELETE_FORWARD\r\n    },\r\n    // Chrome on Mac: Ctrl + K (you have to disable the Link plugin first, though, because it uses the same keystroke)\r\n    // This is weird that it does not work in Safari on Mac despite being listed in the official shortcuts listing\r\n    // on Apple's webpage.\r\n    deleteHardLineForward: {\r\n        unit: DELETE_SELECTION,\r\n        direction: DELETE_FORWARD\r\n    },\r\n    // At this moment there is no known way to trigger this event type but let's keep it for the symmetry with\r\n    // deleteSoftLineBackward.\r\n    deleteSoftLineForward: {\r\n        unit: DELETE_SELECTION,\r\n        direction: DELETE_FORWARD\r\n    }\r\n};\r\n/**\r\n * Delete observer introduces the {@link module:engine/view/document~Document#event:delete} event.\r\n */\r\nexport default class DeleteObserver extends Observer {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(view) {\r\n        super(view);\r\n        const document = view.document;\r\n        // It matters how many subsequent deletions were made, e.g. when the backspace key was pressed and held\r\n        // by the user for some time. For instance, if such scenario ocurred and the heading the selection was\r\n        // anchored to was the only content of the editor, it will not be converted into a paragraph (the user\r\n        // wanted to clean it up, not remove it, it's about UX). Check out the DeleteCommand implementation to learn more.\r\n        //\r\n        // Fun fact: Safari on Mac won't fire beforeinput for backspace in an empty heading (only content).\r\n        let sequence = 0;\r\n        document.on('keydown', () => {\r\n            sequence++;\r\n        });\r\n        document.on('keyup', () => {\r\n            sequence = 0;\r\n        });\r\n        document.on('beforeinput', (evt, data) => {\r\n            if (!this.isEnabled) {\r\n                return;\r\n            }\r\n            const { targetRanges, domEvent, inputType } = data;\r\n            const deleteEventSpec = DELETE_EVENT_TYPES[inputType];\r\n            if (!deleteEventSpec) {\r\n                return;\r\n            }\r\n            const deleteData = {\r\n                direction: deleteEventSpec.direction,\r\n                unit: deleteEventSpec.unit,\r\n                sequence\r\n            };\r\n            if (deleteData.unit == DELETE_SELECTION) {\r\n                deleteData.selectionToRemove = view.createSelection(targetRanges[0]);\r\n            }\r\n            // The default deletion unit for deleteContentBackward is a single code point\r\n            // but if the browser provides a wider target range then we should use it.\r\n            if (inputType === 'deleteContentBackward') {\r\n                // On Android, deleteContentBackward has sequence 1 by default.\r\n                if (env.isAndroid) {\r\n                    deleteData.sequence = 1;\r\n                }\r\n                // The beforeInput event wants more than a single character to be removed.\r\n                if (shouldUseTargetRanges(targetRanges)) {\r\n                    deleteData.unit = DELETE_SELECTION;\r\n                    deleteData.selectionToRemove = view.createSelection(targetRanges);\r\n                }\r\n            }\r\n            const eventInfo = new BubblingEventInfo(document, 'delete', targetRanges[0]);\r\n            document.fire(eventInfo, new DomEventData(view, domEvent, deleteData));\r\n            // Stop the beforeinput event if `delete` event was stopped.\r\n            // https://github.com/ckeditor/ckeditor5/issues/753\r\n            if (eventInfo.stop.called) {\r\n                evt.stop();\r\n            }\r\n        });\r\n        // TODO: to be removed when https://bugs.chromium.org/p/chromium/issues/detail?id=1365311 is solved.\r\n        if (env.isBlink) {\r\n            enableChromeWorkaround(this);\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    observe() { }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    stopObserving() { }\r\n}\r\n/**\r\n * Enables workaround for the issue https://github.com/ckeditor/ckeditor5/issues/11904.\r\n */\r\nfunction enableChromeWorkaround(observer) {\r\n    const view = observer.view;\r\n    const document = view.document;\r\n    let pressedKeyCode = null;\r\n    let beforeInputReceived = false;\r\n    document.on('keydown', (evt, { keyCode }) => {\r\n        pressedKeyCode = keyCode;\r\n        beforeInputReceived = false;\r\n    });\r\n    document.on('keyup', (evt, { keyCode, domEvent }) => {\r\n        const selection = document.selection;\r\n        const shouldFireDeleteEvent = observer.isEnabled &&\r\n            keyCode == pressedKeyCode &&\r\n            isDeleteKeyCode(keyCode) &&\r\n            !selection.isCollapsed &&\r\n            !beforeInputReceived;\r\n        pressedKeyCode = null;\r\n        if (shouldFireDeleteEvent) {\r\n            const targetRange = selection.getFirstRange();\r\n            const eventInfo = new BubblingEventInfo(document, 'delete', targetRange);\r\n            const deleteData = {\r\n                unit: DELETE_SELECTION,\r\n                direction: getDeleteDirection(keyCode),\r\n                selectionToRemove: selection\r\n            };\r\n            document.fire(eventInfo, new DomEventData(view, domEvent, deleteData));\r\n        }\r\n    });\r\n    document.on('beforeinput', (evt, { inputType }) => {\r\n        const deleteEventSpec = DELETE_EVENT_TYPES[inputType];\r\n        const isMatchingBeforeInput = isDeleteKeyCode(pressedKeyCode) &&\r\n            deleteEventSpec &&\r\n            deleteEventSpec.direction == getDeleteDirection(pressedKeyCode);\r\n        if (isMatchingBeforeInput) {\r\n            beforeInputReceived = true;\r\n        }\r\n    }, { priority: 'high' });\r\n    document.on('beforeinput', (evt, { inputType, data }) => {\r\n        const shouldIgnoreBeforeInput = pressedKeyCode == keyCodes.delete &&\r\n            inputType == 'insertText' &&\r\n            data == '\\x7f'; // Delete character :P\r\n        if (shouldIgnoreBeforeInput) {\r\n            evt.stop();\r\n        }\r\n    }, { priority: 'high' });\r\n    function isDeleteKeyCode(keyCode) {\r\n        return keyCode == keyCodes.backspace || keyCode == keyCodes.delete;\r\n    }\r\n    function getDeleteDirection(keyCode) {\r\n        return keyCode == keyCodes.backspace ? DELETE_BACKWARD : DELETE_FORWARD;\r\n    }\r\n}\r\n/**\r\n * Verifies whether the given target ranges cover more than a single character and should be used instead of a single code-point deletion.\r\n */\r\nfunction shouldUseTargetRanges(targetRanges) {\r\n    // The collapsed target range could happen for example while deleting inside an inline filler\r\n    // (it's mapped to collapsed position before an inline filler).\r\n    if (targetRanges.length != 1 || targetRanges[0].isCollapsed) {\r\n        return false;\r\n    }\r\n    const walker = targetRanges[0].getWalker({\r\n        direction: 'backward',\r\n        singleCharacters: true,\r\n        ignoreElementEnd: true\r\n    });\r\n    let count = 0;\r\n    for (const { nextPosition } of walker) {\r\n        // There is some element in the range so count it as a single character.\r\n        if (!nextPosition.parent.is('$text')) {\r\n            count++;\r\n        }\r\n        else {\r\n            const data = nextPosition.parent.data;\r\n            const offset = nextPosition.offset;\r\n            // Count combined symbols and emoji sequences as a single character.\r\n            if (isInsideSurrogatePair(data, offset) ||\r\n                isInsideCombinedSymbol(data, offset) ||\r\n                isInsideEmojiSequence(data, offset)) {\r\n                continue;\r\n            }\r\n            count++;\r\n        }\r\n        if (count > 1) {\r\n            return true;\r\n        }\r\n    }\r\n    return false;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module typing/delete\r\n */\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\nimport DeleteCommand from './deletecommand';\r\nimport DeleteObserver from './deleteobserver';\r\n/**\r\n * The delete and backspace feature. Handles keys such as <kbd>Delete</kbd> and <kbd>Backspace</kbd>, other\r\n * keystrokes and user actions that result in deleting content in the editor.\r\n */\r\nexport default class Delete extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'Delete';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const view = editor.editing.view;\r\n        const viewDocument = view.document;\r\n        const modelDocument = editor.model.document;\r\n        view.addObserver(DeleteObserver);\r\n        this._undoOnBackspace = false;\r\n        const deleteForwardCommand = new DeleteCommand(editor, 'forward');\r\n        // Register `deleteForward` command and add `forwardDelete` command as an alias for backward compatibility.\r\n        editor.commands.add('deleteForward', deleteForwardCommand);\r\n        editor.commands.add('forwardDelete', deleteForwardCommand);\r\n        editor.commands.add('delete', new DeleteCommand(editor, 'backward'));\r\n        this.listenTo(viewDocument, 'delete', (evt, data) => {\r\n            // When not in composition, we handle the action, so prevent the default one.\r\n            // When in composition, it's the browser who modify the DOM (renderer is disabled).\r\n            if (!viewDocument.isComposing) {\r\n                data.preventDefault();\r\n            }\r\n            const { direction, sequence, selectionToRemove, unit } = data;\r\n            const commandName = direction === 'forward' ? 'deleteForward' : 'delete';\r\n            const commandData = { sequence };\r\n            if (unit == 'selection') {\r\n                const modelRanges = Array.from(selectionToRemove.getRanges()).map(viewRange => {\r\n                    return editor.editing.mapper.toModelRange(viewRange);\r\n                });\r\n                commandData.selection = editor.model.createSelection(modelRanges);\r\n            }\r\n            else {\r\n                commandData.unit = unit;\r\n            }\r\n            editor.execute(commandName, commandData);\r\n            view.scrollToTheSelection();\r\n        }, { priority: 'low' });\r\n        if (this.editor.plugins.has('UndoEditing')) {\r\n            this.listenTo(viewDocument, 'delete', (evt, data) => {\r\n                if (this._undoOnBackspace && data.direction == 'backward' && data.sequence == 1 && data.unit == 'codePoint') {\r\n                    this._undoOnBackspace = false;\r\n                    editor.execute('undo');\r\n                    data.preventDefault();\r\n                    evt.stop();\r\n                }\r\n            }, { context: '$capture' });\r\n            this.listenTo(modelDocument, 'change', () => {\r\n                this._undoOnBackspace = false;\r\n            });\r\n        }\r\n    }\r\n    /**\r\n     * If the next user action after calling this method is pressing backspace, it would undo the last change.\r\n     *\r\n     * Requires {@link module:undo/undoediting~UndoEditing} plugin. If not loaded, does nothing.\r\n     */\r\n    requestUndoOnBackspace() {\r\n        if (this.editor.plugins.has('UndoEditing')) {\r\n            this._undoOnBackspace = true;\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module typing/typing\r\n */\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\nimport Input from './input';\r\nimport Delete from './delete';\r\n/**\r\n * The typing feature. It handles typing.\r\n *\r\n * This is a \"glue\" plugin which loads the {@link module:typing/input~Input} and {@link module:typing/delete~Delete}\r\n * plugins.\r\n */\r\nexport default class Typing extends Plugin {\r\n    static get requires() {\r\n        return [Input, Delete];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'Typing';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * Returns the last text line from the given range.\r\n *\r\n * \"The last text line\" is understood as text (from one or more text nodes) which is limited either by a parent block\r\n * or by inline elements (e.g. `<softBreak>`).\r\n *\r\n * ```ts\r\n * const rangeToCheck = model.createRange(\r\n * \tmodel.createPositionAt( paragraph, 0 ),\r\n * \tmodel.createPositionAt( paragraph, 'end' )\r\n * );\r\n *\r\n * const { text, range } = getLastTextLine( rangeToCheck, model );\r\n * ```\r\n *\r\n * For model below, the returned `text` will be \"Foo bar baz\" and `range` will be set on whole `<paragraph>` content:\r\n *\r\n * ```xml\r\n * <paragraph>Foo bar baz<paragraph>\r\n * ```\r\n *\r\n * However, in below case, `text` will be set to \"baz\" and `range` will be set only on \"baz\".\r\n *\r\n * ```xml\r\n * <paragraph>Foo<softBreak></softBreak>bar<softBreak></softBreak>baz<paragraph>\r\n * ```\r\n */\r\nexport default function getLastTextLine(range, model) {\r\n    let start = range.start;\r\n    const text = Array.from(range.getWalker({ ignoreElementEnd: false })).reduce((rangeText, { item }) => {\r\n        // Trim text to a last occurrence of an inline element and update range start.\r\n        if (!(item.is('$text') || item.is('$textProxy'))) {\r\n            start = model.createPositionAfter(item);\r\n            return '';\r\n        }\r\n        return rangeText + item.data;\r\n    }, '');\r\n    return { text, range: model.createRange(start, range.end) };\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module typing/textwatcher\r\n */\r\nimport { ObservableMixin } from '@ckeditor/ckeditor5-utils';\r\nimport getLastTextLine from './utils/getlasttextline';\r\n/**\r\n * The text watcher feature.\r\n *\r\n * Fires the {@link module:typing/textwatcher~TextWatcher#event:matched:data `matched:data`},\r\n * {@link module:typing/textwatcher~TextWatcher#event:matched:selection `matched:selection`} and\r\n * {@link module:typing/textwatcher~TextWatcher#event:unmatched `unmatched`} events on typing or selection changes.\r\n */\r\nexport default class TextWatcher extends ObservableMixin() {\r\n    /**\r\n     * Creates a text watcher instance.\r\n     *\r\n     * @param testCallback See {@link module:typing/textwatcher~TextWatcher#testCallback}.\r\n     */\r\n    constructor(model, testCallback) {\r\n        super();\r\n        this.model = model;\r\n        this.testCallback = testCallback;\r\n        this._hasMatch = false;\r\n        this.set('isEnabled', true);\r\n        // Toggle text watching on isEnabled state change.\r\n        this.on('change:isEnabled', () => {\r\n            if (this.isEnabled) {\r\n                this._startListening();\r\n            }\r\n            else {\r\n                this.stopListening(model.document.selection);\r\n                this.stopListening(model.document);\r\n            }\r\n        });\r\n        this._startListening();\r\n    }\r\n    /**\r\n     * Flag indicating whether there is a match currently.\r\n     */\r\n    get hasMatch() {\r\n        return this._hasMatch;\r\n    }\r\n    /**\r\n     * Starts listening to the editor for typing and selection events.\r\n     */\r\n    _startListening() {\r\n        const model = this.model;\r\n        const document = model.document;\r\n        this.listenTo(document.selection, 'change:range', (evt, { directChange }) => {\r\n            // Indirect changes (i.e. when the user types or external changes are applied) are handled in the document's change event.\r\n            if (!directChange) {\r\n                return;\r\n            }\r\n            // Act only on collapsed selection.\r\n            if (!document.selection.isCollapsed) {\r\n                if (this.hasMatch) {\r\n                    this.fire('unmatched');\r\n                    this._hasMatch = false;\r\n                }\r\n                return;\r\n            }\r\n            this._evaluateTextBeforeSelection('selection');\r\n        });\r\n        this.listenTo(document, 'change:data', (evt, batch) => {\r\n            if (batch.isUndo || !batch.isLocal) {\r\n                return;\r\n            }\r\n            this._evaluateTextBeforeSelection('data', { batch });\r\n        });\r\n    }\r\n    /**\r\n     * Checks the editor content for matched text.\r\n     *\r\n     * @fires matched:data\r\n     * @fires matched:selection\r\n     * @fires unmatched\r\n     *\r\n     * @param suffix A suffix used for generating the event name.\r\n     * @param data Data object for event.\r\n     */\r\n    _evaluateTextBeforeSelection(suffix, data = {}) {\r\n        const model = this.model;\r\n        const document = model.document;\r\n        const selection = document.selection;\r\n        const rangeBeforeSelection = model.createRange(model.createPositionAt(selection.focus.parent, 0), selection.focus);\r\n        const { text, range } = getLastTextLine(rangeBeforeSelection, model);\r\n        const testResult = this.testCallback(text);\r\n        if (!testResult && this.hasMatch) {\r\n            this.fire('unmatched');\r\n        }\r\n        this._hasMatch = !!testResult;\r\n        if (testResult) {\r\n            const eventData = Object.assign(data, { text, range });\r\n            // If the test callback returns an object with additional data, assign the data as well.\r\n            if (typeof testResult == 'object') {\r\n                Object.assign(eventData, testResult);\r\n            }\r\n            this.fire(`matched:${suffix}`, eventData);\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module typing/twostepcaretmovement\r\n */\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\nimport { keyCodes } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * This plugin enables the two-step caret (phantom) movement behavior for\r\n * {@link module:typing/twostepcaretmovement~TwoStepCaretMovement#registerAttribute registered attributes}\r\n * on arrow right (<kbd>→</kbd>) and left (<kbd>←</kbd>) key press.\r\n *\r\n * Thanks to this (phantom) caret movement the user is able to type before/after as well as at the\r\n * beginning/end of an attribute.\r\n *\r\n * **Note:** This plugin support right–to–left (Arabic, Hebrew, etc.) content by mirroring its behavior\r\n * but for the sake of simplicity examples showcase only left–to–right use–cases.\r\n *\r\n * # Forward movement\r\n *\r\n * ## \"Entering\" an attribute:\r\n *\r\n * When this plugin is enabled and registered for the `a` attribute and the selection is right before it\r\n * (at the attribute boundary), pressing the right arrow key will not move the selection but update its\r\n * attributes accordingly:\r\n *\r\n * * When enabled:\r\n *\r\n * ```xml\r\n * foo{}<$text a=\"true\">bar</$text>\r\n * ```\r\n *\r\n * \t<kbd>→</kbd>\r\n *\r\n * ```xml\r\n * foo<$text a=\"true\">{}bar</$text>\r\n * ```\r\n *\r\n * * When disabled:\r\n *\r\n * ```xml\r\n * foo{}<$text a=\"true\">bar</$text>\r\n * ```\r\n *\r\n * \t<kbd>→</kbd>\r\n *\r\n * ```xml\r\n * foo<$text a=\"true\">b{}ar</$text>\r\n * ```\r\n *\r\n *\r\n * ## \"Leaving\" an attribute:\r\n *\r\n * * When enabled:\r\n *\r\n * ```xml\r\n * <$text a=\"true\">bar{}</$text>baz\r\n * ```\r\n *\r\n * \t<kbd>→</kbd>\r\n *\r\n * ```xml\r\n * <$text a=\"true\">bar</$text>{}baz\r\n * ```\r\n *\r\n * * When disabled:\r\n *\r\n * ```xml\r\n * <$text a=\"true\">bar{}</$text>baz\r\n * ```\r\n *\r\n * \t<kbd>→</kbd>\r\n *\r\n * ```xml\r\n * <$text a=\"true\">bar</$text>b{}az\r\n * ```\r\n *\r\n * # Backward movement\r\n *\r\n * * When enabled:\r\n *\r\n * ```xml\r\n * <$text a=\"true\">bar</$text>{}baz\r\n * ```\r\n *\r\n * \t<kbd>←</kbd>\r\n *\r\n * ```xml\r\n * <$text a=\"true\">bar{}</$text>baz\r\n * ```\r\n *\r\n * * When disabled:\r\n *\r\n * ```xml\r\n * <$text a=\"true\">bar</$text>{}baz\r\n * ```\r\n *\r\n * \t<kbd>←</kbd>\r\n *\r\n * ```xml\r\n * <$text a=\"true\">ba{}r</$text>b{}az\r\n * ```\r\n *\r\n * # Multiple attributes\r\n *\r\n * * When enabled and many attributes starts or ends at the same position:\r\n *\r\n * ```xml\r\n * <$text a=\"true\" b=\"true\">bar</$text>{}baz\r\n * ```\r\n *\r\n * \t<kbd>←</kbd>\r\n *\r\n * ```xml\r\n * <$text a=\"true\" b=\"true\">bar{}</$text>baz\r\n * ```\r\n *\r\n * * When enabled and one procedes another:\r\n *\r\n * ```xml\r\n * <$text a=\"true\">bar</$text><$text b=\"true\">{}bar</$text>\r\n * ```\r\n *\r\n * \t<kbd>←</kbd>\r\n *\r\n * ```xml\r\n * <$text a=\"true\">bar{}</$text><$text b=\"true\">bar</$text>\r\n * ```\r\n *\r\n */\r\nexport default class TwoStepCaretMovement extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'TwoStepCaretMovement';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        this.attributes = new Set();\r\n        this._overrideUid = null;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const view = editor.editing.view;\r\n        const locale = editor.locale;\r\n        const modelSelection = model.document.selection;\r\n        // Listen to keyboard events and handle the caret movement according to the 2-step caret logic.\r\n        this.listenTo(view.document, 'arrowKey', (evt, data) => {\r\n            // This implementation works only for collapsed selection.\r\n            if (!modelSelection.isCollapsed) {\r\n                return;\r\n            }\r\n            // When user tries to expand the selection or jump over the whole word or to the beginning/end then\r\n            // two-steps movement is not necessary.\r\n            if (data.shiftKey || data.altKey || data.ctrlKey) {\r\n                return;\r\n            }\r\n            const arrowRightPressed = data.keyCode == keyCodes.arrowright;\r\n            const arrowLeftPressed = data.keyCode == keyCodes.arrowleft;\r\n            // When neither left or right arrow has been pressed then do noting.\r\n            if (!arrowRightPressed && !arrowLeftPressed) {\r\n                return;\r\n            }\r\n            const contentDirection = locale.contentLanguageDirection;\r\n            let isMovementHandled = false;\r\n            if ((contentDirection === 'ltr' && arrowRightPressed) || (contentDirection === 'rtl' && arrowLeftPressed)) {\r\n                isMovementHandled = this._handleForwardMovement(data);\r\n            }\r\n            else {\r\n                isMovementHandled = this._handleBackwardMovement(data);\r\n            }\r\n            // Stop the keydown event if the two-step caret movement handled it. Avoid collisions\r\n            // with other features which may also take over the caret movement (e.g. Widget).\r\n            if (isMovementHandled === true) {\r\n                evt.stop();\r\n            }\r\n        }, { context: '$text', priority: 'highest' });\r\n        this._isNextGravityRestorationSkipped = false;\r\n        // The automatic gravity restoration logic.\r\n        this.listenTo(modelSelection, 'change:range', (evt, data) => {\r\n            // Skipping the automatic restoration is needed if the selection should change\r\n            // but the gravity must remain overridden afterwards. See the #handleBackwardMovement\r\n            // to learn more.\r\n            if (this._isNextGravityRestorationSkipped) {\r\n                this._isNextGravityRestorationSkipped = false;\r\n                return;\r\n            }\r\n            // Skip automatic restore when the gravity is not overridden — simply, there's nothing to restore\r\n            // at this moment.\r\n            if (!this._isGravityOverridden) {\r\n                return;\r\n            }\r\n            // Skip automatic restore when the change is indirect AND the selection is at the attribute boundary.\r\n            // It means that e.g. if the change was external (collaboration) and the user had their\r\n            // selection around the link, its gravity should remain intact in this change:range event.\r\n            if (!data.directChange && isBetweenDifferentAttributes(modelSelection.getFirstPosition(), this.attributes)) {\r\n                return;\r\n            }\r\n            this._restoreGravity();\r\n        });\r\n    }\r\n    /**\r\n     * Registers a given attribute for the two-step caret movement.\r\n     *\r\n     * @param attribute Name of the attribute to handle.\r\n     */\r\n    registerAttribute(attribute) {\r\n        this.attributes.add(attribute);\r\n    }\r\n    /**\r\n     * Updates the document selection and the view according to the two–step caret movement state\r\n     * when moving **forwards**. Executed upon `keypress` in the {@link module:engine/view/view~View}.\r\n     *\r\n     * @param data Data of the key press.\r\n     * @returns `true` when the handler prevented caret movement.\r\n     */\r\n    _handleForwardMovement(data) {\r\n        const attributes = this.attributes;\r\n        const model = this.editor.model;\r\n        const selection = model.document.selection;\r\n        const position = selection.getFirstPosition();\r\n        // DON'T ENGAGE 2-SCM if gravity is already overridden. It means that we just entered\r\n        //\r\n        // \t\t<paragraph>foo<$text attribute>{}bar</$text>baz</paragraph>\r\n        //\r\n        // or left the attribute\r\n        //\r\n        // \t\t<paragraph>foo<$text attribute>bar</$text>{}baz</paragraph>\r\n        //\r\n        // and the gravity will be restored automatically.\r\n        if (this._isGravityOverridden) {\r\n            return false;\r\n        }\r\n        // DON'T ENGAGE 2-SCM when the selection is at the beginning of the block AND already has the\r\n        // attribute:\r\n        // * when the selection was initially set there using the mouse,\r\n        // * when the editor has just started\r\n        //\r\n        //\t\t<paragraph><$text attribute>{}bar</$text>baz</paragraph>\r\n        //\r\n        if (position.isAtStart && hasAnyAttribute(selection, attributes)) {\r\n            return false;\r\n        }\r\n        // ENGAGE 2-SCM When at least one of the observed attributes changes its value (incl. starts, ends).\r\n        //\r\n        //\t\t<paragraph>foo<$text attribute>bar{}</$text>baz</paragraph>\r\n        //\t\t<paragraph>foo<$text attribute>bar{}</$text><$text otherAttribute>baz</$text></paragraph>\r\n        //\t\t<paragraph>foo<$text attribute=1>bar{}</$text><$text attribute=2>baz</$text></paragraph>\r\n        //\t\t<paragraph>foo{}<$text attribute>bar</$text>baz</paragraph>\r\n        //\r\n        if (isBetweenDifferentAttributes(position, attributes)) {\r\n            preventCaretMovement(data);\r\n            this._overrideGravity();\r\n            return true;\r\n        }\r\n        return false;\r\n    }\r\n    /**\r\n     * Updates the document selection and the view according to the two–step caret movement state\r\n     * when moving **backwards**. Executed upon `keypress` in the {@link module:engine/view/view~View}.\r\n     *\r\n     * @param data Data of the key press.\r\n     * @returns `true` when the handler prevented caret movement\r\n     */\r\n    _handleBackwardMovement(data) {\r\n        const attributes = this.attributes;\r\n        const model = this.editor.model;\r\n        const selection = model.document.selection;\r\n        const position = selection.getFirstPosition();\r\n        // When the gravity is already overridden (by this plugin), it means we are on the two-step position.\r\n        // Prevent the movement, restore the gravity and update selection attributes.\r\n        //\r\n        //\t\t<paragraph>foo<$text attribute=1>bar</$text><$text attribute=2>{}baz</$text></paragraph>\r\n        //\t\t<paragraph>foo<$text attribute>bar</$text><$text otherAttribute>{}baz</$text></paragraph>\r\n        //\t\t<paragraph>foo<$text attribute>{}bar</$text>baz</paragraph>\r\n        //\t\t<paragraph>foo<$text attribute>bar</$text>{}baz</paragraph>\r\n        //\r\n        if (this._isGravityOverridden) {\r\n            preventCaretMovement(data);\r\n            this._restoreGravity();\r\n            setSelectionAttributesFromTheNodeBefore(model, attributes, position);\r\n            return true;\r\n        }\r\n        else {\r\n            // REMOVE SELECTION ATTRIBUTE when restoring gravity towards a non-existent content at the\r\n            // beginning of the block.\r\n            //\r\n            // \t\t<paragraph>{}<$text attribute>bar</$text></paragraph>\r\n            //\r\n            if (position.isAtStart) {\r\n                if (hasAnyAttribute(selection, attributes)) {\r\n                    preventCaretMovement(data);\r\n                    setSelectionAttributesFromTheNodeBefore(model, attributes, position);\r\n                    return true;\r\n                }\r\n                return false;\r\n            }\r\n            // When we are moving from natural gravity, to the position of the 2SCM, we need to override the gravity,\r\n            // and make sure it won't be restored. Unless it's at the end of the block and an observed attribute.\r\n            // We need to check if the caret is a one position before the attribute boundary:\r\n            //\r\n            //\t\t<paragraph>foo<$text attribute=1>bar</$text><$text attribute=2>b{}az</$text></paragraph>\r\n            //\t\t<paragraph>foo<$text attribute>bar</$text><$text otherAttribute>b{}az</$text></paragraph>\r\n            //\t\t<paragraph>foo<$text attribute>b{}ar</$text>baz</paragraph>\r\n            //\t\t<paragraph>foo<$text attribute>bar</$text>b{}az</paragraph>\r\n            //\r\n            if (isStepAfterAnyAttributeBoundary(position, attributes)) {\r\n                // ENGAGE 2-SCM if the selection has no attribute. This may happen when the user\r\n                // left the attribute using a FORWARD 2-SCM.\r\n                //\r\n                // \t\t<paragraph><$text attribute>bar</$text>{}</paragraph>\r\n                //\r\n                if (position.isAtEnd &&\r\n                    !hasAnyAttribute(selection, attributes) &&\r\n                    isBetweenDifferentAttributes(position, attributes)) {\r\n                    preventCaretMovement(data);\r\n                    setSelectionAttributesFromTheNodeBefore(model, attributes, position);\r\n                    return true;\r\n                }\r\n                // Skip the automatic gravity restore upon the next selection#change:range event.\r\n                // If not skipped, it would automatically restore the gravity, which should remain\r\n                // overridden.\r\n                this._isNextGravityRestorationSkipped = true;\r\n                this._overrideGravity();\r\n                // Don't return \"true\" here because we didn't call _preventCaretMovement.\r\n                // Returning here will destabilize the filler logic, which also listens to\r\n                // keydown (and the event would be stopped).\r\n                return false;\r\n            }\r\n        }\r\n        return false;\r\n    }\r\n    /**\r\n     * `true` when the gravity is overridden for the plugin.\r\n     */\r\n    get _isGravityOverridden() {\r\n        return !!this._overrideUid;\r\n    }\r\n    /**\r\n     * Overrides the gravity using the {@link module:engine/model/writer~Writer model writer}\r\n     * and stores the information about this fact in the {@link #_overrideUid}.\r\n     *\r\n     * A shorthand for {@link module:engine/model/writer~Writer#overrideSelectionGravity}.\r\n     */\r\n    _overrideGravity() {\r\n        this._overrideUid = this.editor.model.change(writer => {\r\n            return writer.overrideSelectionGravity();\r\n        });\r\n    }\r\n    /**\r\n     * Restores the gravity using the {@link module:engine/model/writer~Writer model writer}.\r\n     *\r\n     * A shorthand for {@link module:engine/model/writer~Writer#restoreSelectionGravity}.\r\n     */\r\n    _restoreGravity() {\r\n        this.editor.model.change(writer => {\r\n            writer.restoreSelectionGravity(this._overrideUid);\r\n            this._overrideUid = null;\r\n        });\r\n    }\r\n}\r\n/**\r\n * Checks whether the selection has any of given attributes.\r\n */\r\nfunction hasAnyAttribute(selection, attributes) {\r\n    for (const observedAttribute of attributes) {\r\n        if (selection.hasAttribute(observedAttribute)) {\r\n            return true;\r\n        }\r\n    }\r\n    return false;\r\n}\r\n/**\r\n * Applies the given attributes to the current selection using using the\r\n * values from the node before the current position. Uses\r\n * the {@link module:engine/model/writer~Writer model writer}.\r\n */\r\nfunction setSelectionAttributesFromTheNodeBefore(model, attributes, position) {\r\n    const nodeBefore = position.nodeBefore;\r\n    model.change(writer => {\r\n        if (nodeBefore) {\r\n            writer.setSelectionAttribute(nodeBefore.getAttributes());\r\n        }\r\n        else {\r\n            writer.removeSelectionAttribute(attributes);\r\n        }\r\n    });\r\n}\r\n/**\r\n * Prevents the caret movement in the view by calling `preventDefault` on the event data.\r\n *\r\n * @alias data.preventDefault\r\n */\r\nfunction preventCaretMovement(data) {\r\n    data.preventDefault();\r\n}\r\n/**\r\n * Checks whether the step before `isBetweenDifferentAttributes()`.\r\n */\r\nfunction isStepAfterAnyAttributeBoundary(position, attributes) {\r\n    const positionBefore = position.getShiftedBy(-1);\r\n    return isBetweenDifferentAttributes(positionBefore, attributes);\r\n}\r\n/**\r\n * Checks whether the given position is between different values of given attributes.\r\n */\r\nfunction isBetweenDifferentAttributes(position, attributes) {\r\n    const { nodeBefore, nodeAfter } = position;\r\n    for (const observedAttribute of attributes) {\r\n        const attrBefore = nodeBefore ? nodeBefore.getAttribute(observedAttribute) : undefined;\r\n        const attrAfter = nodeAfter ? nodeAfter.getAttribute(observedAttribute) : undefined;\r\n        if (attrAfter !== attrBefore) {\r\n            return true;\r\n        }\r\n    }\r\n    return false;\r\n}\r\n","import toString from './toString.js';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n    reHasRegExpChar = RegExp(reRegExpChar.source);\n\n/**\n * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escapeRegExp('[lodash](https://lodash.com/)');\n * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n */\nfunction escapeRegExp(string) {\n  string = toString(string);\n  return (string && reHasRegExpChar.test(string))\n    ? string.replace(reRegExpChar, '\\\\$&')\n    : string;\n}\n\nexport default escapeRegExp;\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module typing/texttransformation\r\n */\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\nimport TextWatcher from './textwatcher';\r\nimport { escapeRegExp } from 'lodash-es';\r\n// All named transformations.\r\nconst TRANSFORMATIONS = {\r\n    // Common symbols:\r\n    copyright: { from: '(c)', to: '©' },\r\n    registeredTrademark: { from: '(r)', to: '®' },\r\n    trademark: { from: '(tm)', to: '™' },\r\n    // Mathematical:\r\n    oneHalf: { from: /(^|[^/a-z0-9])(1\\/2)([^/a-z0-9])$/i, to: [null, '½', null] },\r\n    oneThird: { from: /(^|[^/a-z0-9])(1\\/3)([^/a-z0-9])$/i, to: [null, '⅓', null] },\r\n    twoThirds: { from: /(^|[^/a-z0-9])(2\\/3)([^/a-z0-9])$/i, to: [null, '⅔', null] },\r\n    oneForth: { from: /(^|[^/a-z0-9])(1\\/4)([^/a-z0-9])$/i, to: [null, '¼', null] },\r\n    threeQuarters: { from: /(^|[^/a-z0-9])(3\\/4)([^/a-z0-9])$/i, to: [null, '¾', null] },\r\n    lessThanOrEqual: { from: '<=', to: '≤' },\r\n    greaterThanOrEqual: { from: '>=', to: '≥' },\r\n    notEqual: { from: '!=', to: '≠' },\r\n    arrowLeft: { from: '<-', to: '←' },\r\n    arrowRight: { from: '->', to: '→' },\r\n    // Typography:\r\n    horizontalEllipsis: { from: '...', to: '…' },\r\n    enDash: { from: /(^| )(--)( )$/, to: [null, '–', null] },\r\n    emDash: { from: /(^| )(---)( )$/, to: [null, '—', null] },\r\n    // Quotations:\r\n    // English, US\r\n    quotesPrimary: { from: buildQuotesRegExp('\"'), to: [null, '“', null, '”'] },\r\n    quotesSecondary: { from: buildQuotesRegExp('\\''), to: [null, '‘', null, '’'] },\r\n    // English, UK\r\n    quotesPrimaryEnGb: { from: buildQuotesRegExp('\\''), to: [null, '‘', null, '’'] },\r\n    quotesSecondaryEnGb: { from: buildQuotesRegExp('\"'), to: [null, '“', null, '”'] },\r\n    // Polish\r\n    quotesPrimaryPl: { from: buildQuotesRegExp('\"'), to: [null, '„', null, '”'] },\r\n    quotesSecondaryPl: { from: buildQuotesRegExp('\\''), to: [null, '‚', null, '’'] }\r\n};\r\n// Transformation groups.\r\nconst TRANSFORMATION_GROUPS = {\r\n    symbols: ['copyright', 'registeredTrademark', 'trademark'],\r\n    mathematical: [\r\n        'oneHalf', 'oneThird', 'twoThirds', 'oneForth', 'threeQuarters',\r\n        'lessThanOrEqual', 'greaterThanOrEqual', 'notEqual',\r\n        'arrowLeft', 'arrowRight'\r\n    ],\r\n    typography: ['horizontalEllipsis', 'enDash', 'emDash'],\r\n    quotes: ['quotesPrimary', 'quotesSecondary']\r\n};\r\n// A set of default transformations provided by the feature.\r\nconst DEFAULT_TRANSFORMATIONS = [\r\n    'symbols',\r\n    'mathematical',\r\n    'typography',\r\n    'quotes'\r\n];\r\n/**\r\n * The text transformation plugin.\r\n */\r\nexport default class TextTransformation extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return ['Delete', 'Input'];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'TextTransformation';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        editor.config.define('typing', {\r\n            transformations: {\r\n                include: DEFAULT_TRANSFORMATIONS\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const model = this.editor.model;\r\n        const modelSelection = model.document.selection;\r\n        modelSelection.on('change:range', () => {\r\n            // Disable plugin when selection is inside a code block.\r\n            this.isEnabled = !modelSelection.anchor.parent.is('element', 'codeBlock');\r\n        });\r\n        this._enableTransformationWatchers();\r\n    }\r\n    /**\r\n     * Create new TextWatcher listening to the editor for typing and selection events.\r\n     */\r\n    _enableTransformationWatchers() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const deletePlugin = editor.plugins.get('Delete');\r\n        const normalizedTransformations = normalizeTransformations(editor.config.get('typing.transformations'));\r\n        const testCallback = (text) => {\r\n            for (const normalizedTransformation of normalizedTransformations) {\r\n                const from = normalizedTransformation.from;\r\n                const match = from.test(text);\r\n                if (match) {\r\n                    return { normalizedTransformation };\r\n                }\r\n            }\r\n        };\r\n        const watcher = new TextWatcher(editor.model, testCallback);\r\n        watcher.on('matched:data', (evt, data) => {\r\n            if (!data.batch.isTyping) {\r\n                return;\r\n            }\r\n            const { from, to } = data.normalizedTransformation;\r\n            const matches = from.exec(data.text);\r\n            const replaces = to(matches.slice(1));\r\n            const matchedRange = data.range;\r\n            let changeIndex = matches.index;\r\n            model.enqueueChange(writer => {\r\n                for (let i = 1; i < matches.length; i++) {\r\n                    const match = matches[i];\r\n                    const replaceWith = replaces[i - 1];\r\n                    if (replaceWith == null) {\r\n                        changeIndex += match.length;\r\n                        continue;\r\n                    }\r\n                    const replacePosition = matchedRange.start.getShiftedBy(changeIndex);\r\n                    const replaceRange = model.createRange(replacePosition, replacePosition.getShiftedBy(match.length));\r\n                    const attributes = getTextAttributesAfterPosition(replacePosition);\r\n                    model.insertContent(writer.createText(replaceWith, attributes), replaceRange);\r\n                    changeIndex += replaceWith.length;\r\n                }\r\n                model.enqueueChange(() => {\r\n                    deletePlugin.requestUndoOnBackspace();\r\n                });\r\n            });\r\n        });\r\n        watcher.bind('isEnabled').to(this);\r\n    }\r\n}\r\n/**\r\n * Normalizes the configuration `from` parameter value.\r\n * The normalized value for the `from` parameter is a RegExp instance. If the passed `from` is already a RegExp instance,\r\n * it is returned unchanged.\r\n */\r\nfunction normalizeFrom(from) {\r\n    if (typeof from == 'string') {\r\n        return new RegExp(`(${escapeRegExp(from)})$`);\r\n    }\r\n    // `from` is already a regular expression.\r\n    return from;\r\n}\r\n/**\r\n * Normalizes the configuration `to` parameter value.\r\n * The normalized value for the `to` parameter is a function that takes an array and returns an array. See more in the\r\n * configuration description. If the passed `to` is already a function, it is returned unchanged.\r\n */\r\nfunction normalizeTo(to) {\r\n    if (typeof to == 'string') {\r\n        return () => [to];\r\n    }\r\n    else if (to instanceof Array) {\r\n        return () => to;\r\n    }\r\n    // `to` is already a function.\r\n    return to;\r\n}\r\n/**\r\n * For given `position` returns attributes for the text that is after that position.\r\n * The text can be in the same text node as the position (`foo[]bar`) or in the next text node (`foo[]<$text bold=\"true\">bar</$text>`).\r\n */\r\nfunction getTextAttributesAfterPosition(position) {\r\n    const textNode = position.textNode ? position.textNode : position.nodeAfter;\r\n    return textNode.getAttributes();\r\n}\r\n/**\r\n * Returns a RegExp pattern string that detects a sentence inside a quote.\r\n *\r\n * @param quoteCharacter The character to create a pattern for.\r\n */\r\nfunction buildQuotesRegExp(quoteCharacter) {\r\n    return new RegExp(`(^|\\\\s)(${quoteCharacter})([^${quoteCharacter}]*)(${quoteCharacter})$`);\r\n}\r\n/**\r\n * Reads text transformation config and returns normalized array of transformations objects.\r\n */\r\nfunction normalizeTransformations(config) {\r\n    const extra = config.extra || [];\r\n    const remove = config.remove || [];\r\n    const isNotRemoved = (transformation) => !remove.includes(transformation);\r\n    const configured = config.include.concat(extra).filter(isNotRemoved);\r\n    return expandGroupsAndRemoveDuplicates(configured)\r\n        .filter(isNotRemoved) // Filter out 'remove' transformations as they might be set in group.\r\n        .map(transformation => (typeof transformation == 'string' && TRANSFORMATIONS[transformation] ? TRANSFORMATIONS[transformation] : transformation))\r\n        // Filter out transformations set as string that has not been found.\r\n        .filter((transformation) => typeof transformation === 'object')\r\n        .map(transformation => ({\r\n        from: normalizeFrom(transformation.from),\r\n        to: normalizeTo(transformation.to)\r\n    }));\r\n}\r\n/**\r\n * Reads definitions and expands named groups if needed to transformation names.\r\n * This method also removes duplicated named transformations if any.\r\n */\r\nfunction expandGroupsAndRemoveDuplicates(definitions) {\r\n    // Set is using to make sure that transformation names are not duplicated.\r\n    const definedTransformations = new Set();\r\n    for (const transformationOrGroup of definitions) {\r\n        if (typeof transformationOrGroup == 'string' && TRANSFORMATION_GROUPS[transformationOrGroup]) {\r\n            for (const transformation of TRANSFORMATION_GROUPS[transformationOrGroup]) {\r\n                definedTransformations.add(transformation);\r\n            }\r\n        }\r\n        else {\r\n            definedTransformations.add(transformationOrGroup);\r\n        }\r\n    }\r\n    return Array.from(definedTransformations);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * Returns a model range that covers all consecutive nodes with the same `attributeName` and its `value`\r\n * that intersect the given `position`.\r\n *\r\n * It can be used e.g. to get the entire range on which the `linkHref` attribute needs to be changed when having a\r\n * selection inside a link.\r\n *\r\n * @param position The start position.\r\n * @param attributeName The attribute name.\r\n * @param value The attribute value.\r\n * @param model The model instance.\r\n * @returns The link range.\r\n */\r\nexport default function findAttributeRange(position, attributeName, value, model) {\r\n    return model.createRange(findAttributeRangeBound(position, attributeName, value, true, model), findAttributeRangeBound(position, attributeName, value, false, model));\r\n}\r\n/**\r\n * Walks forward or backward (depends on the `lookBack` flag), node by node, as long as they have the same attribute value\r\n * and returns a position just before or after (depends on the `lookBack` flag) the last matched node.\r\n *\r\n * @param position The start position.\r\n * @param attributeName The attribute name.\r\n * @param value The attribute value.\r\n * @param lookBack Whether the walk direction is forward (`false`) or backward (`true`).\r\n * @returns The position just before the last matched node.\r\n */\r\nexport function findAttributeRangeBound(position, attributeName, value, lookBack, model) {\r\n    // Get node before or after position (depends on `lookBack` flag).\r\n    // When position is inside text node then start searching from text node.\r\n    let node = position.textNode || (lookBack ? position.nodeBefore : position.nodeAfter);\r\n    let lastNode = null;\r\n    while (node && node.getAttribute(attributeName) == value) {\r\n        lastNode = node;\r\n        node = lookBack ? node.previousSibling : node.nextSibling;\r\n    }\r\n    return lastNode ? model.createPositionAt(lastNode, lookBack ? 'before' : 'after') : position;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * Returns attributes that should be preserved on the enter keystroke.\r\n *\r\n * Filtering is realized based on `copyOnEnter` attribute property. Read more about attribute properties\r\n * {@link module:engine/model/schema~Schema#setAttributeProperties here}.\r\n *\r\n * @param schema Model's schema.\r\n * @param allAttributes Attributes to filter.\r\n */\r\nexport function* getCopyOnEnterAttributes(schema, allAttributes) {\r\n    for (const attribute of allAttributes) {\r\n        if (attribute && schema.getAttributeProperties(attribute[0]).copyOnEnter) {\r\n            yield attribute;\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module enter/entercommand\r\n */\r\nimport { Command } from '@ckeditor/ckeditor5-core';\r\nimport { getCopyOnEnterAttributes } from './utils';\r\n/**\r\n * Enter command used by the {@link module:enter/enter~Enter Enter feature} to handle the <kbd>Enter</kbd> keystroke.\r\n */\r\nexport default class EnterCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    execute() {\r\n        this.editor.model.change(writer => {\r\n            this.enterBlock(writer);\r\n            this.fire('afterExecute', { writer });\r\n        });\r\n    }\r\n    /**\r\n     * Splits a block where the document selection is placed, in the way how the <kbd>Enter</kbd> key is expected to work:\r\n     *\r\n     * ```\r\n     * <p>Foo[]bar</p>   ->   <p>Foo</p><p>[]bar</p>\r\n     * <p>Foobar[]</p>   ->   <p>Foobar</p><p>[]</p>\r\n     * <p>Fo[ob]ar</p>   ->   <p>Fo</p><p>[]ar</p>\r\n     * ```\r\n     *\r\n     * In some cases, the split will not happen:\r\n     *\r\n     * ```\r\n     * // The selection parent is a limit element:\r\n     * <figcaption>A[bc]d</figcaption>   ->   <figcaption>A[]d</figcaption>\r\n     *\r\n     * // The selection spans over multiple elements:\r\n     * <h>x[x</h><p>y]y<p>   ->   <h>x</h><p>[]y</p>\r\n     * ```\r\n     *\r\n     * @param writer Writer to use when performing the enter action.\r\n     * @returns Boolean indicating if the block was split.\r\n     */\r\n    enterBlock(writer) {\r\n        const model = this.editor.model;\r\n        const selection = model.document.selection;\r\n        const schema = model.schema;\r\n        const isSelectionEmpty = selection.isCollapsed;\r\n        const range = selection.getFirstRange();\r\n        const startElement = range.start.parent;\r\n        const endElement = range.end.parent;\r\n        // Don't touch the roots and other limit elements.\r\n        if (schema.isLimit(startElement) || schema.isLimit(endElement)) {\r\n            // Delete the selected content but only if inside a single limit element.\r\n            // Abort, when crossing limit elements boundary (e.g. <limit1>x[x</limit1>donttouchme<limit2>y]y</limit2>).\r\n            // This is an edge case and it's hard to tell what should actually happen because such a selection\r\n            // is not entirely valid.\r\n            if (!isSelectionEmpty && startElement == endElement) {\r\n                model.deleteContent(selection);\r\n            }\r\n            return false;\r\n        }\r\n        if (isSelectionEmpty) {\r\n            const attributesToCopy = getCopyOnEnterAttributes(writer.model.schema, selection.getAttributes());\r\n            splitBlock(writer, range.start);\r\n            writer.setSelectionAttribute(attributesToCopy);\r\n            return true;\r\n        }\r\n        else {\r\n            const leaveUnmerged = !(range.start.isAtStart && range.end.isAtEnd);\r\n            const isContainedWithinOneElement = (startElement == endElement);\r\n            model.deleteContent(selection, { leaveUnmerged });\r\n            if (leaveUnmerged) {\r\n                // Partially selected elements.\r\n                //\r\n                // <h>x[xx]x</h>\t\t-> <h>x^x</h>\t\t\t-> <h>x</h><h>^x</h>\r\n                if (isContainedWithinOneElement) {\r\n                    splitBlock(writer, selection.focus);\r\n                    return true;\r\n                }\r\n                // Selection over multiple elements.\r\n                //\r\n                // <h>x[x</h><p>y]y<p>\t-> <h>x^</h><p>y</p>\t-> <h>x</h><p>^y</p>\r\n                else {\r\n                    writer.setSelection(endElement, 0);\r\n                }\r\n            }\r\n        }\r\n        return false;\r\n    }\r\n}\r\nfunction splitBlock(writer, splitPos) {\r\n    writer.split(splitPos);\r\n    writer.setSelection(splitPos.parent.nextSibling, 0);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module enter/enterobserver\r\n */\r\nimport { Observer, DomEventData, BubblingEventInfo } from '@ckeditor/ckeditor5-engine';\r\nimport { env } from '@ckeditor/ckeditor5-utils';\r\nconst ENTER_EVENT_TYPES = {\r\n    insertParagraph: { isSoft: false },\r\n    insertLineBreak: { isSoft: true }\r\n};\r\n/**\r\n * Enter observer introduces the {@link module:engine/view/document~Document#event:enter `Document#enter`} event.\r\n */\r\nexport default class EnterObserver extends Observer {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(view) {\r\n        super(view);\r\n        const doc = this.document;\r\n        let shiftPressed = false;\r\n        doc.on('keydown', (evt, data) => {\r\n            shiftPressed = data.shiftKey;\r\n        });\r\n        doc.on('beforeinput', (evt, data) => {\r\n            if (!this.isEnabled) {\r\n                return;\r\n            }\r\n            let inputType = data.inputType;\r\n            // See https://github.com/ckeditor/ckeditor5/issues/13321.\r\n            if (env.isSafari && shiftPressed && inputType == 'insertParagraph') {\r\n                inputType = 'insertLineBreak';\r\n            }\r\n            const domEvent = data.domEvent;\r\n            const enterEventSpec = ENTER_EVENT_TYPES[inputType];\r\n            if (!enterEventSpec) {\r\n                return;\r\n            }\r\n            const event = new BubblingEventInfo(doc, 'enter', data.targetRanges[0]);\r\n            doc.fire(event, new DomEventData(view, domEvent, {\r\n                isSoft: enterEventSpec.isSoft\r\n            }));\r\n            // Stop `beforeinput` event if `enter` event was stopped.\r\n            // https://github.com/ckeditor/ckeditor5/issues/753\r\n            if (event.stop.called) {\r\n                evt.stop();\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    observe() { }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    stopObserving() { }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module enter/enter\r\n */\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\nimport EnterCommand from './entercommand';\r\nimport EnterObserver from './enterobserver';\r\n/**\r\n * This plugin handles the <kbd>Enter</kbd> keystroke (hard line break) in the editor.\r\n *\r\n * See also the {@link module:enter/shiftenter~ShiftEnter} plugin.\r\n *\r\n * For more information about this feature see the {@glink api/enter package page}.\r\n */\r\nexport default class Enter extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'Enter';\r\n    }\r\n    init() {\r\n        const editor = this.editor;\r\n        const view = editor.editing.view;\r\n        const viewDocument = view.document;\r\n        view.addObserver(EnterObserver);\r\n        editor.commands.add('enter', new EnterCommand(editor));\r\n        this.listenTo(viewDocument, 'enter', (evt, data) => {\r\n            // When not in composition, we handle the action, so prevent the default one.\r\n            // When in composition, it's the browser who modify the DOM (renderer is disabled).\r\n            if (!viewDocument.isComposing) {\r\n                data.preventDefault();\r\n            }\r\n            // The soft enter key is handled by the ShiftEnter plugin.\r\n            if (data.isSoft) {\r\n                return;\r\n            }\r\n            editor.execute('enter');\r\n            view.scrollToTheSelection();\r\n        }, { priority: 'low' });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module enter/shiftentercommand\r\n */\r\nimport { Command } from '@ckeditor/ckeditor5-core';\r\nimport { getCopyOnEnterAttributes } from './utils';\r\n/**\r\n * ShiftEnter command. It is used by the {@link module:enter/shiftenter~ShiftEnter ShiftEnter feature} to handle\r\n * the <kbd>Shift</kbd>+<kbd>Enter</kbd> keystroke.\r\n */\r\nexport default class ShiftEnterCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    execute() {\r\n        const model = this.editor.model;\r\n        const doc = model.document;\r\n        model.change(writer => {\r\n            softBreakAction(model, writer, doc.selection);\r\n            this.fire('afterExecute', { writer });\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const model = this.editor.model;\r\n        const doc = model.document;\r\n        this.isEnabled = isEnabled(model.schema, doc.selection);\r\n    }\r\n}\r\n/**\r\n * Checks whether the ShiftEnter command should be enabled in the specified selection.\r\n */\r\nfunction isEnabled(schema, selection) {\r\n    // At this moment it is okay to support single range selections only.\r\n    // But in the future we may need to change that.\r\n    if (selection.rangeCount > 1) {\r\n        return false;\r\n    }\r\n    const anchorPos = selection.anchor;\r\n    // Check whether the break element can be inserted in the current selection anchor.\r\n    if (!anchorPos || !schema.checkChild(anchorPos, 'softBreak')) {\r\n        return false;\r\n    }\r\n    const range = selection.getFirstRange();\r\n    const startElement = range.start.parent;\r\n    const endElement = range.end.parent;\r\n    // Do not modify the content if selection is cross-limit elements.\r\n    if ((isInsideLimitElement(startElement, schema) || isInsideLimitElement(endElement, schema)) && startElement !== endElement) {\r\n        return false;\r\n    }\r\n    return true;\r\n}\r\n/**\r\n * Creates a break in the way that the <kbd>Shift</kbd>+<kbd>Enter</kbd> keystroke is expected to work.\r\n */\r\nfunction softBreakAction(model, writer, selection) {\r\n    const isSelectionEmpty = selection.isCollapsed;\r\n    const range = selection.getFirstRange();\r\n    const startElement = range.start.parent;\r\n    const endElement = range.end.parent;\r\n    const isContainedWithinOneElement = (startElement == endElement);\r\n    if (isSelectionEmpty) {\r\n        const attributesToCopy = getCopyOnEnterAttributes(model.schema, selection.getAttributes());\r\n        insertBreak(model, writer, range.end);\r\n        writer.removeSelectionAttribute(selection.getAttributeKeys());\r\n        writer.setSelectionAttribute(attributesToCopy);\r\n    }\r\n    else {\r\n        const leaveUnmerged = !(range.start.isAtStart && range.end.isAtEnd);\r\n        model.deleteContent(selection, { leaveUnmerged });\r\n        // Selection within one element:\r\n        //\r\n        // <h>x[xx]x</h>\t\t-> <h>x^x</h>\t\t\t-> <h>x<br>^x</h>\r\n        if (isContainedWithinOneElement) {\r\n            insertBreak(model, writer, selection.focus);\r\n        }\r\n        // Selection over multiple elements.\r\n        //\r\n        // <h>x[x</h><p>y]y<p>\t-> <h>x^</h><p>y</p>\t-> <h>x</h><p>^y</p>\r\n        //\r\n        // We chose not to insert a line break in this case because:\r\n        //\r\n        // * it's not a very common scenario,\r\n        // * it actually surprised me when I saw the \"expected behavior\" in real life.\r\n        //\r\n        // It's ok if the user will need to be more specific where they want the <br> to be inserted.\r\n        else {\r\n            // Move the selection to the 2nd element (last step of the example above).\r\n            if (leaveUnmerged) {\r\n                writer.setSelection(endElement, 0);\r\n            }\r\n        }\r\n    }\r\n}\r\nfunction insertBreak(model, writer, position) {\r\n    const breakLineElement = writer.createElement('softBreak');\r\n    model.insertContent(breakLineElement, position);\r\n    writer.setSelection(breakLineElement, 'after');\r\n}\r\n/**\r\n * Checks whether the specified `element` is a child of the limit element.\r\n *\r\n * Checking whether the `<p>` element is inside a limit element:\r\n *   - `<$root><p>Text.</p></$root> => false`\r\n *   - `<$root><limitElement><p>Text</p></limitElement></$root> => true`\r\n */\r\nfunction isInsideLimitElement(element, schema) {\r\n    // `$root` is a limit element but in this case is an invalid element.\r\n    if (element.is('rootElement')) {\r\n        return false;\r\n    }\r\n    return schema.isLimit(element) || isInsideLimitElement(element.parent, schema);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module enter/shiftenter\r\n */\r\nimport ShiftEnterCommand from './shiftentercommand';\r\nimport EnterObserver from './enterobserver';\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\n/**\r\n * This plugin handles the <kbd>Shift</kbd>+<kbd>Enter</kbd> keystroke (soft line break) in the editor.\r\n *\r\n * See also the {@link module:enter/enter~Enter} plugin.\r\n *\r\n * For more information about this feature see the {@glink api/enter package page}.\r\n */\r\nexport default class ShiftEnter extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ShiftEnter';\r\n    }\r\n    init() {\r\n        const editor = this.editor;\r\n        const schema = editor.model.schema;\r\n        const conversion = editor.conversion;\r\n        const view = editor.editing.view;\r\n        const viewDocument = view.document;\r\n        // Configure the schema.\r\n        schema.register('softBreak', {\r\n            allowWhere: '$text',\r\n            isInline: true\r\n        });\r\n        // Configure converters.\r\n        conversion.for('upcast')\r\n            .elementToElement({\r\n            model: 'softBreak',\r\n            view: 'br'\r\n        });\r\n        conversion.for('downcast')\r\n            .elementToElement({\r\n            model: 'softBreak',\r\n            view: (modelElement, { writer }) => writer.createEmptyElement('br')\r\n        });\r\n        view.addObserver(EnterObserver);\r\n        editor.commands.add('shiftEnter', new ShiftEnterCommand(editor));\r\n        this.listenTo(viewDocument, 'enter', (evt, data) => {\r\n            // When not in composition, we handle the action, so prevent the default one.\r\n            // When in composition, it's the browser who modify the DOM (renderer is disabled).\r\n            if (!viewDocument.isComposing) {\r\n                data.preventDefault();\r\n            }\r\n            // The hard enter key is handled by the Enter plugin.\r\n            if (!data.isSoft) {\r\n                return;\r\n            }\r\n            editor.execute('shiftEnter');\r\n            view.scrollToTheSelection();\r\n        }, { priority: 'low' });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module widget/highlightstack\r\n */\r\nimport { EmitterMixin } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Class used to handle the correct order of highlights on elements.\r\n *\r\n * When different highlights are applied to same element the correct order should be preserved:\r\n *\r\n * * highlight with highest priority should be applied,\r\n * * if two highlights have same priority - sort by CSS class provided in\r\n * {@link module:engine/conversion/downcasthelpers~HighlightDescriptor}.\r\n *\r\n * This way, highlight will be applied with the same rules it is applied on texts.\r\n */\r\nexport default class HighlightStack extends EmitterMixin() {\r\n    constructor() {\r\n        super(...arguments);\r\n        this._stack = [];\r\n    }\r\n    /**\r\n     * Adds highlight descriptor to the stack.\r\n     *\r\n     * @fires change:top\r\n     */\r\n    add(descriptor, writer) {\r\n        const stack = this._stack;\r\n        // Save top descriptor and insert new one. If top is changed - fire event.\r\n        const oldTop = stack[0];\r\n        this._insertDescriptor(descriptor);\r\n        const newTop = stack[0];\r\n        // When new object is at the top and stores different information.\r\n        if (oldTop !== newTop && !compareDescriptors(oldTop, newTop)) {\r\n            this.fire('change:top', {\r\n                oldDescriptor: oldTop,\r\n                newDescriptor: newTop,\r\n                writer\r\n            });\r\n        }\r\n    }\r\n    /**\r\n     * Removes highlight descriptor from the stack.\r\n     *\r\n     * @fires change:top\r\n     * @param id Id of the descriptor to remove.\r\n     */\r\n    remove(id, writer) {\r\n        const stack = this._stack;\r\n        const oldTop = stack[0];\r\n        this._removeDescriptor(id);\r\n        const newTop = stack[0];\r\n        // When new object is at the top and stores different information.\r\n        if (oldTop !== newTop && !compareDescriptors(oldTop, newTop)) {\r\n            this.fire('change:top', {\r\n                oldDescriptor: oldTop,\r\n                newDescriptor: newTop,\r\n                writer\r\n            });\r\n        }\r\n    }\r\n    /**\r\n     * Inserts a given descriptor in correct place in the stack. It also takes care about updating information\r\n     * when descriptor with same id is already present.\r\n     */\r\n    _insertDescriptor(descriptor) {\r\n        const stack = this._stack;\r\n        const index = stack.findIndex(item => item.id === descriptor.id);\r\n        // Inserting exact same descriptor - do nothing.\r\n        if (compareDescriptors(descriptor, stack[index])) {\r\n            return;\r\n        }\r\n        // If descriptor with same id but with different information is on the stack - remove it.\r\n        if (index > -1) {\r\n            stack.splice(index, 1);\r\n        }\r\n        // Find correct place to insert descriptor in the stack.\r\n        // It has different information (for example priority) so it must be re-inserted in correct place.\r\n        let i = 0;\r\n        while (stack[i] && shouldABeBeforeB(stack[i], descriptor)) {\r\n            i++;\r\n        }\r\n        stack.splice(i, 0, descriptor);\r\n    }\r\n    /**\r\n     * Removes descriptor with given id from the stack.\r\n     *\r\n     * @param id Descriptor's id.\r\n     */\r\n    _removeDescriptor(id) {\r\n        const stack = this._stack;\r\n        const index = stack.findIndex(item => item.id === id);\r\n        // If descriptor with same id is on the list - remove it.\r\n        if (index > -1) {\r\n            stack.splice(index, 1);\r\n        }\r\n    }\r\n}\r\n/**\r\n * Compares two descriptors by checking their priority and class list.\r\n *\r\n * @returns Returns true if both descriptors are defined and have same priority and classes.\r\n */\r\nfunction compareDescriptors(a, b) {\r\n    return a && b && a.priority == b.priority && classesToString(a.classes) == classesToString(b.classes);\r\n}\r\n/**\r\n * Checks whenever first descriptor should be placed in the stack before second one.\r\n */\r\nfunction shouldABeBeforeB(a, b) {\r\n    if (a.priority > b.priority) {\r\n        return true;\r\n    }\r\n    else if (a.priority < b.priority) {\r\n        return false;\r\n    }\r\n    // When priorities are equal and names are different - use classes to compare.\r\n    return classesToString(a.classes) > classesToString(b.classes);\r\n}\r\n/**\r\n * Converts CSS classes passed with {@link module:engine/conversion/downcasthelpers~HighlightDescriptor} to\r\n * sorted string.\r\n */\r\nfunction classesToString(classes) {\r\n    return Array.isArray(classes) ? classes.sort().join(',') : classes;\r\n}\r\n","export default \"<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>\";","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module widget/utils\r\n */\r\nimport { CKEditorError, toArray } from '@ckeditor/ckeditor5-utils';\r\nimport { findOptimalInsertionRange as engineFindOptimalInsertionRange } from '@ckeditor/ckeditor5-engine';\r\nimport { IconView } from '@ckeditor/ckeditor5-ui';\r\nimport HighlightStack from './highlightstack';\r\nimport { getTypeAroundFakeCaretPosition } from './widgettypearound/utils';\r\nimport dragHandleIcon from '../theme/icons/drag-handle.svg';\r\n/**\r\n * CSS class added to each widget element.\r\n */\r\nexport const WIDGET_CLASS_NAME = 'ck-widget';\r\n/**\r\n * CSS class added to currently selected widget element.\r\n */\r\nexport const WIDGET_SELECTED_CLASS_NAME = 'ck-widget_selected';\r\n/**\r\n * Returns `true` if given {@link module:engine/view/node~Node} is an {@link module:engine/view/element~Element} and a widget.\r\n */\r\nexport function isWidget(node) {\r\n    if (!node.is('element')) {\r\n        return false;\r\n    }\r\n    return !!node.getCustomProperty('widget');\r\n}\r\n/**\r\n * Converts the given {@link module:engine/view/element~Element} to a widget in the following way:\r\n *\r\n * * sets the `contenteditable` attribute to `\"false\"`,\r\n * * adds the `ck-widget` CSS class,\r\n * * adds a custom {@link module:engine/view/element~Element#getFillerOffset `getFillerOffset()`} method returning `null`,\r\n * * adds a custom property allowing to recognize widget elements by using {@link ~isWidget `isWidget()`},\r\n * * implements the {@link ~setHighlightHandling view highlight on widgets}.\r\n *\r\n * This function needs to be used in conjunction with\r\n * {@link module:engine/conversion/downcasthelpers~DowncastHelpers downcast conversion helpers}\r\n * like {@link module:engine/conversion/downcasthelpers~DowncastHelpers#elementToElement `elementToElement()`}.\r\n * Moreover, typically you will want to use `toWidget()` only for `editingDowncast`, while keeping the `dataDowncast` clean.\r\n *\r\n * For example, in order to convert a `<widget>` model element to `<div class=\"widget\">` in the view, you can define\r\n * such converters:\r\n *\r\n * ```ts\r\n * editor.conversion.for( 'editingDowncast' )\r\n * \t.elementToElement( {\r\n * \t\tmodel: 'widget',\r\n * \t\tview: ( modelItem, { writer } ) => {\r\n * \t\t\tconst div = writer.createContainerElement( 'div', { class: 'widget' } );\r\n *\r\n * \t\t\treturn toWidget( div, writer, { label: 'some widget' } );\r\n * \t\t}\r\n * \t} );\r\n *\r\n * editor.conversion.for( 'dataDowncast' )\r\n * \t.elementToElement( {\r\n * \t\tmodel: 'widget',\r\n * \t\tview: ( modelItem, { writer } ) => {\r\n * \t\t\treturn writer.createContainerElement( 'div', { class: 'widget' } );\r\n * \t\t}\r\n * \t} );\r\n * ```\r\n *\r\n * See the full source code of the widget (with a nested editable) schema definition and converters in\r\n * [this sample](https://github.com/ckeditor/ckeditor5-widget/blob/master/tests/manual/widget-with-nestededitable.js).\r\n *\r\n * @param options Additional options.\r\n * @param options.label Element's label provided to the {@link ~setLabel} function. It can be passed as\r\n * a plain string or a function returning a string. It represents the widget for assistive technologies (like screen readers).\r\n * @param options.hasSelectionHandle If `true`, the widget will have a selection handle added.\r\n * @returns Returns the same element.\r\n */\r\nexport function toWidget(element, writer, options = {}) {\r\n    if (!element.is('containerElement')) {\r\n        /**\r\n         * The element passed to `toWidget()` must be a {@link module:engine/view/containerelement~ContainerElement}\r\n         * instance.\r\n         *\r\n         * @error widget-to-widget-wrong-element-type\r\n         * @param element The view element passed to `toWidget()`.\r\n         */\r\n        throw new CKEditorError('widget-to-widget-wrong-element-type', null, { element });\r\n    }\r\n    writer.setAttribute('contenteditable', 'false', element);\r\n    writer.addClass(WIDGET_CLASS_NAME, element);\r\n    writer.setCustomProperty('widget', true, element);\r\n    element.getFillerOffset = getFillerOffset;\r\n    writer.setCustomProperty('widgetLabel', [], element);\r\n    if (options.label) {\r\n        setLabel(element, options.label);\r\n    }\r\n    if (options.hasSelectionHandle) {\r\n        addSelectionHandle(element, writer);\r\n    }\r\n    setHighlightHandling(element, writer);\r\n    return element;\r\n}\r\n/**\r\n * Default handler for adding a highlight on a widget.\r\n * It adds CSS class and attributes basing on the given highlight descriptor.\r\n */\r\nfunction addHighlight(element, descriptor, writer) {\r\n    if (descriptor.classes) {\r\n        writer.addClass(toArray(descriptor.classes), element);\r\n    }\r\n    if (descriptor.attributes) {\r\n        for (const key in descriptor.attributes) {\r\n            writer.setAttribute(key, descriptor.attributes[key], element);\r\n        }\r\n    }\r\n}\r\n/**\r\n * Default handler for removing a highlight from a widget.\r\n * It removes CSS class and attributes basing on the given highlight descriptor.\r\n */\r\nfunction removeHighlight(element, descriptor, writer) {\r\n    if (descriptor.classes) {\r\n        writer.removeClass(toArray(descriptor.classes), element);\r\n    }\r\n    if (descriptor.attributes) {\r\n        for (const key in descriptor.attributes) {\r\n            writer.removeAttribute(key, element);\r\n        }\r\n    }\r\n}\r\n/**\r\n * Sets highlight handling methods. Uses {@link module:widget/highlightstack~HighlightStack} to\r\n * properly determine which highlight descriptor should be used at given time.\r\n */\r\nexport function setHighlightHandling(element, writer, add = addHighlight, remove = removeHighlight) {\r\n    const stack = new HighlightStack();\r\n    stack.on('change:top', (evt, data) => {\r\n        if (data.oldDescriptor) {\r\n            remove(element, data.oldDescriptor, data.writer);\r\n        }\r\n        if (data.newDescriptor) {\r\n            add(element, data.newDescriptor, data.writer);\r\n        }\r\n    });\r\n    const addHighlightCallback = (element, descriptor, writer) => stack.add(descriptor, writer);\r\n    const removeHighlightCallback = (element, id, writer) => stack.remove(id, writer);\r\n    writer.setCustomProperty('addHighlight', addHighlightCallback, element);\r\n    writer.setCustomProperty('removeHighlight', removeHighlightCallback, element);\r\n}\r\n/**\r\n * Sets label for given element.\r\n * It can be passed as a plain string or a function returning a string. Function will be called each time label is retrieved by\r\n * {@link ~getLabel `getLabel()`}.\r\n */\r\nexport function setLabel(element, labelOrCreator) {\r\n    const widgetLabel = element.getCustomProperty('widgetLabel');\r\n    widgetLabel.push(labelOrCreator);\r\n}\r\n/**\r\n * Returns the label of the provided element.\r\n */\r\nexport function getLabel(element) {\r\n    const widgetLabel = element.getCustomProperty('widgetLabel');\r\n    return widgetLabel.reduce((prev, current) => {\r\n        if (typeof current === 'function') {\r\n            return prev ? prev + '. ' + current() : current();\r\n        }\r\n        else {\r\n            return prev ? prev + '. ' + current : current;\r\n        }\r\n    }, '');\r\n}\r\n/**\r\n * Adds functionality to the provided {@link module:engine/view/editableelement~EditableElement} to act as a widget's editable:\r\n *\r\n * * sets the `contenteditable` attribute to `true` when {@link module:engine/view/editableelement~EditableElement#isReadOnly} is `false`,\r\n * otherwise sets it to `false`,\r\n * * adds the `ck-editor__editable` and `ck-editor__nested-editable` CSS classes,\r\n * * adds the `ck-editor__nested-editable_focused` CSS class when the editable is focused and removes it when it is blurred.\r\n * * implements the {@link ~setHighlightHandling view highlight on widget's editable}.\r\n *\r\n * Similarly to {@link ~toWidget `toWidget()`} this function should be used in `editingDowncast` only and it is usually\r\n * used together with {@link module:engine/conversion/downcasthelpers~DowncastHelpers#elementToElement `elementToElement()`}.\r\n *\r\n * For example, in order to convert a `<nested>` model element to `<div class=\"nested\">` in the view, you can define\r\n * such converters:\r\n *\r\n * ```ts\r\n * editor.conversion.for( 'editingDowncast' )\r\n * \t.elementToElement( {\r\n * \t\tmodel: 'nested',\r\n * \t\tview: ( modelItem, { writer } ) => {\r\n * \t\t\tconst div = writer.createEditableElement( 'div', { class: 'nested' } );\r\n *\r\n * \t\t\treturn toWidgetEditable( nested, writer, { label: 'label for editable' } );\r\n * \t\t}\r\n * \t} );\r\n *\r\n * editor.conversion.for( 'dataDowncast' )\r\n * \t.elementToElement( {\r\n * \t\tmodel: 'nested',\r\n * \t\tview: ( modelItem, { writer } ) => {\r\n * \t\t\treturn writer.createContainerElement( 'div', { class: 'nested' } );\r\n * \t\t}\r\n * \t} );\r\n * ```\r\n *\r\n * See the full source code of the widget (with nested editable) schema definition and converters in\r\n * [this sample](https://github.com/ckeditor/ckeditor5-widget/blob/master/tests/manual/widget-with-nestededitable.js).\r\n *\r\n * @param options Additional options.\r\n * @param options.label Editable's label used by assistive technologies (e.g. screen readers).\r\n * @returns Returns the same element that was provided in the `editable` parameter\r\n */\r\nexport function toWidgetEditable(editable, writer, options = {}) {\r\n    writer.addClass(['ck-editor__editable', 'ck-editor__nested-editable'], editable);\r\n    writer.setAttribute('role', 'textbox', editable);\r\n    if (options.label) {\r\n        writer.setAttribute('aria-label', options.label, editable);\r\n    }\r\n    // Set initial contenteditable value.\r\n    writer.setAttribute('contenteditable', editable.isReadOnly ? 'false' : 'true', editable);\r\n    // Bind the contenteditable property to element#isReadOnly.\r\n    editable.on('change:isReadOnly', (evt, property, is) => {\r\n        writer.setAttribute('contenteditable', is ? 'false' : 'true', editable);\r\n    });\r\n    editable.on('change:isFocused', (evt, property, is) => {\r\n        if (is) {\r\n            writer.addClass('ck-editor__nested-editable_focused', editable);\r\n        }\r\n        else {\r\n            writer.removeClass('ck-editor__nested-editable_focused', editable);\r\n        }\r\n    });\r\n    setHighlightHandling(editable, writer);\r\n    return editable;\r\n}\r\n/**\r\n * Returns a model range which is optimal (in terms of UX) for inserting a widget block.\r\n *\r\n * For instance, if a selection is in the middle of a paragraph, the collapsed range before this paragraph\r\n * will be returned so that it is not split. If the selection is at the end of a paragraph,\r\n * the collapsed range after this paragraph will be returned.\r\n *\r\n * Note: If the selection is placed in an empty block, the range in that block will be returned. If that range\r\n * is then passed to {@link module:engine/model/model~Model#insertContent}, the block will be fully replaced\r\n * by the inserted widget block.\r\n *\r\n * @param selection The selection based on which the insertion position should be calculated.\r\n * @param model Model instance.\r\n * @returns The optimal range.\r\n */\r\nexport function findOptimalInsertionRange(selection, model) {\r\n    const selectedElement = selection.getSelectedElement();\r\n    if (selectedElement) {\r\n        const typeAroundFakeCaretPosition = getTypeAroundFakeCaretPosition(selection);\r\n        // If the WidgetTypeAround \"fake caret\" is displayed, use its position for the insertion\r\n        // to provide the most predictable UX (https://github.com/ckeditor/ckeditor5/issues/7438).\r\n        if (typeAroundFakeCaretPosition) {\r\n            return model.createRange(model.createPositionAt(selectedElement, typeAroundFakeCaretPosition));\r\n        }\r\n    }\r\n    return engineFindOptimalInsertionRange(selection, model);\r\n}\r\n/**\r\n * A util to be used in order to map view positions to correct model positions when implementing a widget\r\n * which renders non-empty view element for an empty model element.\r\n *\r\n * For example:\r\n *\r\n * ```\r\n * // Model:\r\n * <placeholder type=\"name\"></placeholder>\r\n *\r\n * // View:\r\n * <span class=\"placeholder\">name</span>\r\n * ```\r\n *\r\n * In such case, view positions inside `<span>` cannot be correctly mapped to the model (because the model element is empty).\r\n * To handle mapping positions inside `<span class=\"placeholder\">` to the model use this util as follows:\r\n *\r\n * ```ts\r\n * editor.editing.mapper.on(\r\n * \t'viewToModelPosition',\r\n * \tviewToModelPositionOutsideModelElement( model, viewElement => viewElement.hasClass( 'placeholder' ) )\r\n * );\r\n * ```\r\n *\r\n * The callback will try to map the view offset of selection to an expected model position.\r\n *\r\n * 1. When the position is at the end (or in the middle) of the inline widget:\r\n *\r\n * ```\r\n * // View:\r\n * <p>foo <span class=\"placeholder\">name|</span> bar</p>\r\n *\r\n * // Model:\r\n * <paragraph>foo <placeholder type=\"name\"></placeholder>| bar</paragraph>\r\n * ```\r\n *\r\n * 2. When the position is at the beginning of the inline widget:\r\n *\r\n * ```\r\n * // View:\r\n * <p>foo <span class=\"placeholder\">|name</span> bar</p>\r\n *\r\n * // Model:\r\n * <paragraph>foo |<placeholder type=\"name\"></placeholder> bar</paragraph>\r\n * ```\r\n *\r\n * @param model Model instance on which the callback operates.\r\n * @param viewElementMatcher Function that is passed a view element and should return `true` if the custom mapping\r\n * should be applied to the given view element.\r\n */\r\nexport function viewToModelPositionOutsideModelElement(model, viewElementMatcher) {\r\n    return (evt, data) => {\r\n        const { mapper, viewPosition } = data;\r\n        const viewParent = mapper.findMappedViewAncestor(viewPosition);\r\n        if (!viewElementMatcher(viewParent)) {\r\n            return;\r\n        }\r\n        const modelParent = mapper.toModelElement(viewParent);\r\n        data.modelPosition = model.createPositionAt(modelParent, viewPosition.isAtStart ? 'before' : 'after');\r\n    };\r\n}\r\n/**\r\n * Default filler offset function applied to all widget elements.\r\n */\r\nfunction getFillerOffset() {\r\n    return null;\r\n}\r\n/**\r\n * Adds a drag handle to the widget.\r\n */\r\nfunction addSelectionHandle(widgetElement, writer) {\r\n    const selectionHandle = writer.createUIElement('div', { class: 'ck ck-widget__selection-handle' }, function (domDocument) {\r\n        const domElement = this.toDomElement(domDocument);\r\n        // Use the IconView from the ui library.\r\n        const icon = new IconView();\r\n        icon.set('content', dragHandleIcon);\r\n        // Render the icon view right away to append its #element to the selectionHandle DOM element.\r\n        icon.render();\r\n        domElement.appendChild(icon.element);\r\n        return domElement;\r\n    });\r\n    // Append the selection handle into the widget wrapper.\r\n    writer.insert(writer.createPositionAt(widgetElement, 0), selectionHandle);\r\n    writer.addClass(['ck-widget_with-selection-handle'], widgetElement);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module widget/widgettypearound/utils\r\n */\r\nimport { isWidget } from '../utils';\r\n/**\r\n * The name of the type around model selection attribute responsible for\r\n * displaying a fake caret next to a selected widget.\r\n */\r\nexport const TYPE_AROUND_SELECTION_ATTRIBUTE = 'widget-type-around';\r\n/**\r\n * Checks if an element is a widget that qualifies to get the widget type around UI.\r\n */\r\nexport function isTypeAroundWidget(viewElement, modelElement, schema) {\r\n    return !!viewElement && isWidget(viewElement) && !schema.isInline(modelElement);\r\n}\r\n/**\r\n * For the passed HTML element, this helper finds the closest widget type around button ancestor.\r\n */\r\nexport function getClosestTypeAroundDomButton(domElement) {\r\n    return domElement.closest('.ck-widget__type-around__button');\r\n}\r\n/**\r\n * For the passed widget type around button element, this helper determines at which position\r\n * the paragraph would be inserted into the content if, for instance, the button was\r\n * clicked by the user.\r\n *\r\n * @returns The position of the button.\r\n */\r\nexport function getTypeAroundButtonPosition(domElement) {\r\n    return domElement.classList.contains('ck-widget__type-around__button_before') ? 'before' : 'after';\r\n}\r\n/**\r\n * For the passed HTML element, this helper returns the closest view widget ancestor.\r\n */\r\nexport function getClosestWidgetViewElement(domElement, domConverter) {\r\n    const widgetDomElement = domElement.closest('.ck-widget');\r\n    return domConverter.mapDomToView(widgetDomElement);\r\n}\r\n/**\r\n * For the passed selection instance, it returns the position of the fake caret displayed next to a widget.\r\n *\r\n * **Note**: If the fake caret is not currently displayed, `null` is returned.\r\n *\r\n * @returns The position of the fake caret or `null` when none is present.\r\n */\r\nexport function getTypeAroundFakeCaretPosition(selection) {\r\n    return selection.getAttribute(TYPE_AROUND_SELECTION_ATTRIBUTE);\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./widgettypearound.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/* global DOMParser */\r\n/**\r\n * @module widget/widgettypearound/widgettypearound\r\n */\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\nimport { Template } from '@ckeditor/ckeditor5-ui';\r\nimport { Enter } from '@ckeditor/ckeditor5-enter';\r\nimport { Delete } from '@ckeditor/ckeditor5-typing';\r\nimport { env, isForwardArrowKeyCode } from '@ckeditor/ckeditor5-utils';\r\nimport { isTypeAroundWidget, getClosestTypeAroundDomButton, getTypeAroundButtonPosition, getClosestWidgetViewElement, getTypeAroundFakeCaretPosition, TYPE_AROUND_SELECTION_ATTRIBUTE } from './utils';\r\nimport { isWidget } from '../utils';\r\nimport returnIcon from '../../theme/icons/return-arrow.svg';\r\nimport '../../theme/widgettypearound.css';\r\nconst POSSIBLE_INSERTION_POSITIONS = ['before', 'after'];\r\n// Do the SVG parsing once and then clone the result <svg> DOM element for each new button.\r\nconst RETURN_ARROW_ICON_ELEMENT = new DOMParser().parseFromString(returnIcon, 'image/svg+xml').firstChild;\r\nconst PLUGIN_DISABLED_EDITING_ROOT_CLASS = 'ck-widget__type-around_disabled';\r\n/**\r\n * A plugin that allows users to type around widgets where normally it is impossible to place the caret due\r\n * to limitations of web browsers. These \"tight spots\" occur, for instance, before (or after) a widget being\r\n * the first (or last) child of its parent or between two block widgets.\r\n *\r\n * This plugin extends the {@link module:widget/widget~Widget `Widget`} plugin and injects the user interface\r\n * with two buttons into each widget instance in the editor. Each of the buttons can be clicked by the\r\n * user if the widget is next to the \"tight spot\". Once clicked, a paragraph is created with the selection anchored\r\n * in it so that users can type (or insert content, paste, etc.) straight away.\r\n */\r\nexport default class WidgetTypeAround extends Plugin {\r\n    constructor() {\r\n        super(...arguments);\r\n        /**\r\n         * A reference to the model widget element that has the fake caret active\r\n         * on either side of it. It is later used to remove CSS classes associated with the fake caret\r\n         * when the widget no longer needs it.\r\n         */\r\n        this._currentFakeCaretModelElement = null;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'WidgetTypeAround';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [Enter, Delete];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const editingView = editor.editing.view;\r\n        // Set a CSS class on the view editing root when the plugin is disabled so all the buttons\r\n        // and lines visually disappear. All the interactions are disabled in individual plugin methods.\r\n        this.on('change:isEnabled', (evt, data, isEnabled) => {\r\n            editingView.change(writer => {\r\n                for (const root of editingView.document.roots) {\r\n                    if (isEnabled) {\r\n                        writer.removeClass(PLUGIN_DISABLED_EDITING_ROOT_CLASS, root);\r\n                    }\r\n                    else {\r\n                        writer.addClass(PLUGIN_DISABLED_EDITING_ROOT_CLASS, root);\r\n                    }\r\n                }\r\n            });\r\n            if (!isEnabled) {\r\n                editor.model.change(writer => {\r\n                    writer.removeSelectionAttribute(TYPE_AROUND_SELECTION_ATTRIBUTE);\r\n                });\r\n            }\r\n        });\r\n        this._enableTypeAroundUIInjection();\r\n        this._enableInsertingParagraphsOnButtonClick();\r\n        this._enableInsertingParagraphsOnEnterKeypress();\r\n        this._enableInsertingParagraphsOnTypingKeystroke();\r\n        this._enableTypeAroundFakeCaretActivationUsingKeyboardArrows();\r\n        this._enableDeleteIntegration();\r\n        this._enableInsertContentIntegration();\r\n        this._enableInsertObjectIntegration();\r\n        this._enableDeleteContentIntegration();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        this._currentFakeCaretModelElement = null;\r\n    }\r\n    /**\r\n     * Inserts a new paragraph next to a widget element with the selection anchored in it.\r\n     *\r\n     * **Note**: This method is heavily user-oriented and will both focus the editing view and scroll\r\n     * the viewport to the selection in the inserted paragraph.\r\n     *\r\n     * @param widgetModelElement The model widget element next to which a paragraph is inserted.\r\n     * @param position The position where the paragraph is inserted. Either `'before'` or `'after'` the widget.\r\n     */\r\n    _insertParagraph(widgetModelElement, position) {\r\n        const editor = this.editor;\r\n        const editingView = editor.editing.view;\r\n        const attributesToCopy = editor.model.schema.getAttributesWithProperty(widgetModelElement, 'copyOnReplace', true);\r\n        editor.execute('insertParagraph', {\r\n            position: editor.model.createPositionAt(widgetModelElement, position),\r\n            attributes: attributesToCopy\r\n        });\r\n        editingView.focus();\r\n        editingView.scrollToTheSelection();\r\n    }\r\n    /**\r\n     * A wrapper for the {@link module:utils/emittermixin~Emitter#listenTo} method that executes the callbacks only\r\n     * when the plugin {@link #isEnabled is enabled}.\r\n     *\r\n     * @param emitter The object that fires the event.\r\n     * @param event The name of the event.\r\n     * @param callback The function to be called on event.\r\n     * @param options Additional options.\r\n     * @param options.priority The priority of this event callback. The higher the priority value the sooner\r\n     * the callback will be fired. Events having the same priority are called in the order they were added.\r\n     */\r\n    _listenToIfEnabled(emitter, event, callback, options) {\r\n        this.listenTo(emitter, event, (...args) => {\r\n            // Do not respond if the plugin is disabled.\r\n            if (this.isEnabled) {\r\n                callback(...args);\r\n            }\r\n        }, options);\r\n    }\r\n    /**\r\n     * Similar to {@link #_insertParagraph}, this method inserts a paragraph except that it\r\n     * does not expect a position. Instead, it performs the insertion next to a selected widget\r\n     * according to the `widget-type-around` model selection attribute value (fake caret position).\r\n     *\r\n     * Because this method requires the `widget-type-around` attribute to be set,\r\n     * the insertion can only happen when the widget's fake caret is active (e.g. activated\r\n     * using the keyboard).\r\n     *\r\n     * @returns Returns `true` when the paragraph was inserted (the attribute was present) and `false` otherwise.\r\n     */\r\n    _insertParagraphAccordingToFakeCaretPosition() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const modelSelection = model.document.selection;\r\n        const typeAroundFakeCaretPosition = getTypeAroundFakeCaretPosition(modelSelection);\r\n        if (!typeAroundFakeCaretPosition) {\r\n            return false;\r\n        }\r\n        // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\r\n        // @if CK_DEBUG_TYPING // \tconsole.info( '%c[WidgetTypeAround]%c Fake caret -> insert paragraph',\r\n        // @if CK_DEBUG_TYPING // \t\t'font-weight: bold; color: green', ''\r\n        // @if CK_DEBUG_TYPING // \t);\r\n        // @if CK_DEBUG_TYPING // }\r\n        const selectedModelElement = modelSelection.getSelectedElement();\r\n        this._insertParagraph(selectedModelElement, typeAroundFakeCaretPosition);\r\n        return true;\r\n    }\r\n    /**\r\n     * Creates a listener in the editing conversion pipeline that injects the widget type around\r\n     * UI into every single widget instance created in the editor.\r\n     *\r\n     * The UI is delivered as a {@link module:engine/view/uielement~UIElement}\r\n     * wrapper which renders DOM buttons that users can use to insert paragraphs.\r\n     */\r\n    _enableTypeAroundUIInjection() {\r\n        const editor = this.editor;\r\n        const schema = editor.model.schema;\r\n        const t = editor.locale.t;\r\n        const buttonTitles = {\r\n            before: t('Insert paragraph before block'),\r\n            after: t('Insert paragraph after block')\r\n        };\r\n        editor.editing.downcastDispatcher.on('insert', (evt, data, conversionApi) => {\r\n            const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n            if (!viewElement) {\r\n                return;\r\n            }\r\n            // Filter out non-widgets and inline widgets.\r\n            if (isTypeAroundWidget(viewElement, data.item, schema)) {\r\n                injectUIIntoWidget(conversionApi.writer, buttonTitles, viewElement);\r\n                const widgetLabel = viewElement.getCustomProperty('widgetLabel');\r\n                widgetLabel.push(() => {\r\n                    return this.isEnabled ? t('Press Enter to type after or press Shift + Enter to type before the widget') : '';\r\n                });\r\n            }\r\n        }, { priority: 'low' });\r\n    }\r\n    /**\r\n     * Brings support for the fake caret that appears when either:\r\n     *\r\n     * * the selection moves to a widget from a position next to it using arrow keys,\r\n     * * the arrow key is pressed when the widget is already selected.\r\n     *\r\n     * The fake caret lets the user know that they can start typing or just press\r\n     * <kbd>Enter</kbd> to insert a paragraph at the position next to a widget as suggested by the fake caret.\r\n     *\r\n     * The fake caret disappears when the user changes the selection or the editor\r\n     * gets blurred.\r\n     *\r\n     * The whole idea is as follows:\r\n     *\r\n     * 1. A user does one of the 2 scenarios described at the beginning.\r\n     * 2. The \"keydown\" listener is executed and the decision is made whether to show or hide the fake caret.\r\n     * 3. If it should show up, the `widget-type-around` model selection attribute is set indicating\r\n     *    on which side of the widget it should appear.\r\n     * 4. The selection dispatcher reacts to the selection attribute and sets CSS classes responsible for the\r\n     *    fake caret on the view widget.\r\n     * 5. If the fake caret should disappear, the selection attribute is removed and the dispatcher\r\n     *    does the CSS class clean-up in the view.\r\n     * 6. Additionally, `change:range` and `FocusTracker#isFocused` listeners also remove the selection\r\n     *    attribute (the former also removes widget CSS classes).\r\n     */\r\n    _enableTypeAroundFakeCaretActivationUsingKeyboardArrows() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const modelSelection = model.document.selection;\r\n        const schema = model.schema;\r\n        const editingView = editor.editing.view;\r\n        // This is the main listener responsible for the fake caret.\r\n        // Note: The priority must precede the default Widget class keydown handler (\"high\").\r\n        this._listenToIfEnabled(editingView.document, 'arrowKey', (evt, domEventData) => {\r\n            this._handleArrowKeyPress(evt, domEventData);\r\n        }, { context: [isWidget, '$text'], priority: 'high' });\r\n        // This listener makes sure the widget type around selection attribute will be gone from the model\r\n        // selection as soon as the model range changes. This attribute only makes sense when a widget is selected\r\n        // (and the \"fake horizontal caret\" is visible) so whenever the range changes (e.g. selection moved somewhere else),\r\n        // let's get rid of the attribute so that the selection downcast dispatcher isn't even bothered.\r\n        this._listenToIfEnabled(modelSelection, 'change:range', (evt, data) => {\r\n            // Do not reset the selection attribute when the change was indirect.\r\n            if (!data.directChange) {\r\n                return;\r\n            }\r\n            // Get rid of the widget type around attribute of the selection on every change:range.\r\n            // If the range changes, it means for sure, the user is no longer in the active (\"fake horizontal caret\") mode.\r\n            editor.model.change(writer => {\r\n                writer.removeSelectionAttribute(TYPE_AROUND_SELECTION_ATTRIBUTE);\r\n            });\r\n        });\r\n        // Get rid of the widget type around attribute of the selection on every document change\r\n        // that makes widget not selected any more (i.e. widget was removed).\r\n        this._listenToIfEnabled(model.document, 'change:data', () => {\r\n            const selectedModelElement = modelSelection.getSelectedElement();\r\n            if (selectedModelElement) {\r\n                const selectedViewElement = editor.editing.mapper.toViewElement(selectedModelElement);\r\n                if (isTypeAroundWidget(selectedViewElement, selectedModelElement, schema)) {\r\n                    return;\r\n                }\r\n            }\r\n            editor.model.change(writer => {\r\n                writer.removeSelectionAttribute(TYPE_AROUND_SELECTION_ATTRIBUTE);\r\n            });\r\n        });\r\n        // React to changes of the model selection attribute made by the arrow keys listener.\r\n        // If the block widget is selected and the attribute changes, downcast the attribute to special\r\n        // CSS classes associated with the active (\"fake horizontal caret\") mode of the widget.\r\n        this._listenToIfEnabled(editor.editing.downcastDispatcher, 'selection', (evt, data, conversionApi) => {\r\n            const writer = conversionApi.writer;\r\n            if (this._currentFakeCaretModelElement) {\r\n                const selectedViewElement = conversionApi.mapper.toViewElement(this._currentFakeCaretModelElement);\r\n                if (selectedViewElement) {\r\n                    // Get rid of CSS classes associated with the active (\"fake horizontal caret\") mode from the view widget.\r\n                    writer.removeClass(POSSIBLE_INSERTION_POSITIONS.map(positionToWidgetCssClass), selectedViewElement);\r\n                    this._currentFakeCaretModelElement = null;\r\n                }\r\n            }\r\n            const selectedModelElement = data.selection.getSelectedElement();\r\n            if (!selectedModelElement) {\r\n                return;\r\n            }\r\n            const selectedViewElement = conversionApi.mapper.toViewElement(selectedModelElement);\r\n            if (!isTypeAroundWidget(selectedViewElement, selectedModelElement, schema)) {\r\n                return;\r\n            }\r\n            const typeAroundFakeCaretPosition = getTypeAroundFakeCaretPosition(data.selection);\r\n            if (!typeAroundFakeCaretPosition) {\r\n                return;\r\n            }\r\n            writer.addClass(positionToWidgetCssClass(typeAroundFakeCaretPosition), selectedViewElement);\r\n            // Remember the view widget that got the \"fake-caret\" CSS class. This class should be removed ASAP when the\r\n            // selection changes\r\n            this._currentFakeCaretModelElement = selectedModelElement;\r\n        });\r\n        this._listenToIfEnabled(editor.ui.focusTracker, 'change:isFocused', (evt, name, isFocused) => {\r\n            if (!isFocused) {\r\n                editor.model.change(writer => {\r\n                    writer.removeSelectionAttribute(TYPE_AROUND_SELECTION_ATTRIBUTE);\r\n                });\r\n            }\r\n        });\r\n        function positionToWidgetCssClass(position) {\r\n            return `ck-widget_type-around_show-fake-caret_${position}`;\r\n        }\r\n    }\r\n    /**\r\n     * A listener executed on each \"keydown\" in the view document, a part of\r\n     * {@link #_enableTypeAroundFakeCaretActivationUsingKeyboardArrows}.\r\n     *\r\n     * It decides whether the arrow keypress should activate the fake caret or not (also whether it should\r\n     * be deactivated).\r\n     *\r\n     * The fake caret activation is done by setting the `widget-type-around` model selection attribute\r\n     * in this listener, and stopping and preventing the event that would normally be handled by the widget\r\n     * plugin that is responsible for the regular keyboard navigation near/across all widgets (that\r\n     * includes inline widgets, which are ignored by the widget type around plugin).\r\n     */\r\n    _handleArrowKeyPress(evt, domEventData) {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const modelSelection = model.document.selection;\r\n        const schema = model.schema;\r\n        const editingView = editor.editing.view;\r\n        const keyCode = domEventData.keyCode;\r\n        const isForward = isForwardArrowKeyCode(keyCode, editor.locale.contentLanguageDirection);\r\n        const selectedViewElement = editingView.document.selection.getSelectedElement();\r\n        const selectedModelElement = editor.editing.mapper.toModelElement(selectedViewElement);\r\n        let shouldStopAndPreventDefault;\r\n        // Handle keyboard navigation when a type-around-compatible widget is currently selected.\r\n        if (isTypeAroundWidget(selectedViewElement, selectedModelElement, schema)) {\r\n            shouldStopAndPreventDefault = this._handleArrowKeyPressOnSelectedWidget(isForward);\r\n        }\r\n        // Handle keyboard arrow navigation when the selection is next to a type-around-compatible widget\r\n        // and the widget is about to be selected.\r\n        else if (modelSelection.isCollapsed) {\r\n            shouldStopAndPreventDefault = this._handleArrowKeyPressWhenSelectionNextToAWidget(isForward);\r\n        }\r\n        // Handle collapsing a non-collapsed selection that is wider than on a single widget.\r\n        else if (!domEventData.shiftKey) {\r\n            shouldStopAndPreventDefault = this._handleArrowKeyPressWhenNonCollapsedSelection(isForward);\r\n        }\r\n        if (shouldStopAndPreventDefault) {\r\n            domEventData.preventDefault();\r\n            evt.stop();\r\n        }\r\n    }\r\n    /**\r\n     * Handles the keyboard navigation on \"keydown\" when a widget is currently selected and activates or deactivates\r\n     * the fake caret for that widget, depending on the current value of the `widget-type-around` model\r\n     * selection attribute and the direction of the pressed arrow key.\r\n     *\r\n     * @param isForward `true` when the pressed arrow key was responsible for the forward model selection movement\r\n     * as in {@link module:utils/keyboard~isForwardArrowKeyCode}.\r\n     * @returns Returns `true` when the keypress was handled and no other keydown listener of the editor should\r\n     * process the event any further. Returns `false` otherwise.\r\n     */\r\n    _handleArrowKeyPressOnSelectedWidget(isForward) {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const modelSelection = model.document.selection;\r\n        const typeAroundFakeCaretPosition = getTypeAroundFakeCaretPosition(modelSelection);\r\n        return model.change(writer => {\r\n            // If the fake caret is displayed...\r\n            if (typeAroundFakeCaretPosition) {\r\n                const isLeavingWidget = typeAroundFakeCaretPosition === (isForward ? 'after' : 'before');\r\n                // If the keyboard arrow works against the value of the selection attribute...\r\n                // then remove the selection attribute but prevent default DOM actions\r\n                // and do not let the Widget plugin listener move the selection. This brings\r\n                // the widget back to the state, for instance, like if was selected using the mouse.\r\n                //\r\n                // **Note**: If leaving the widget when the fake caret is active, then the default\r\n                // Widget handler will change the selection and, in turn, this will automatically discard\r\n                // the selection attribute.\r\n                if (!isLeavingWidget) {\r\n                    writer.removeSelectionAttribute(TYPE_AROUND_SELECTION_ATTRIBUTE);\r\n                    return true;\r\n                }\r\n            }\r\n            // If the fake caret wasn't displayed, let's set it now according to the direction of the arrow\r\n            // key press. This also means we cannot let the Widget plugin listener move the selection.\r\n            else {\r\n                writer.setSelectionAttribute(TYPE_AROUND_SELECTION_ATTRIBUTE, isForward ? 'after' : 'before');\r\n                return true;\r\n            }\r\n            return false;\r\n        });\r\n    }\r\n    /**\r\n     * Handles the keyboard navigation on \"keydown\" when **no** widget is selected but the selection is **directly** next\r\n     * to one and upon the fake caret should become active for this widget upon arrow keypress\r\n     * (AKA entering/selecting the widget).\r\n     *\r\n     * **Note**: This code mirrors the implementation from the widget plugin but also adds the selection attribute.\r\n     * Unfortunately, there is no safe way to let the widget plugin do the selection part first and then just set the\r\n     * selection attribute here in the widget type around plugin. This is why this code must duplicate some from the widget plugin.\r\n     *\r\n     * @param isForward `true` when the pressed arrow key was responsible for the forward model selection movement\r\n     * as in {@link module:utils/keyboard~isForwardArrowKeyCode}.\r\n     * @returns Returns `true` when the keypress was handled and no other keydown listener of the editor should\r\n     * process the event any further. Returns `false` otherwise.\r\n     */\r\n    _handleArrowKeyPressWhenSelectionNextToAWidget(isForward) {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const schema = model.schema;\r\n        const widgetPlugin = editor.plugins.get('Widget');\r\n        // This is the widget the selection is about to be set on.\r\n        const modelElementNextToSelection = widgetPlugin._getObjectElementNextToSelection(isForward);\r\n        const viewElementNextToSelection = editor.editing.mapper.toViewElement(modelElementNextToSelection);\r\n        if (isTypeAroundWidget(viewElementNextToSelection, modelElementNextToSelection, schema)) {\r\n            model.change(writer => {\r\n                widgetPlugin._setSelectionOverElement(modelElementNextToSelection);\r\n                writer.setSelectionAttribute(TYPE_AROUND_SELECTION_ATTRIBUTE, isForward ? 'before' : 'after');\r\n            });\r\n            // The change() block above does the same job as the Widget plugin. The event can\r\n            // be safely canceled.\r\n            return true;\r\n        }\r\n        return false;\r\n    }\r\n    /**\r\n     * Handles the keyboard navigation on \"keydown\" when a widget is currently selected (together with some other content)\r\n     * and the widget is the first or last element in the selection. It activates or deactivates the fake caret for that widget.\r\n     *\r\n     * @param isForward `true` when the pressed arrow key was responsible for the forward model selection movement\r\n     * as in {@link module:utils/keyboard~isForwardArrowKeyCode}.\r\n     * @returns Returns `true` when the keypress was handled and no other keydown listener of the editor should\r\n     * process the event any further. Returns `false` otherwise.\r\n     */\r\n    _handleArrowKeyPressWhenNonCollapsedSelection(isForward) {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const schema = model.schema;\r\n        const mapper = editor.editing.mapper;\r\n        const modelSelection = model.document.selection;\r\n        const selectedModelNode = isForward ?\r\n            modelSelection.getLastPosition().nodeBefore :\r\n            modelSelection.getFirstPosition().nodeAfter;\r\n        const selectedViewNode = mapper.toViewElement(selectedModelNode);\r\n        // There is a widget at the collapse position so collapse the selection to the fake caret on it.\r\n        if (isTypeAroundWidget(selectedViewNode, selectedModelNode, schema)) {\r\n            model.change(writer => {\r\n                writer.setSelection(selectedModelNode, 'on');\r\n                writer.setSelectionAttribute(TYPE_AROUND_SELECTION_ATTRIBUTE, isForward ? 'after' : 'before');\r\n            });\r\n            return true;\r\n        }\r\n        return false;\r\n    }\r\n    /**\r\n     * Registers a `mousedown` listener for the view document which intercepts events\r\n     * coming from the widget type around UI, which happens when a user clicks one of the buttons\r\n     * that insert a paragraph next to a widget.\r\n     */\r\n    _enableInsertingParagraphsOnButtonClick() {\r\n        const editor = this.editor;\r\n        const editingView = editor.editing.view;\r\n        this._listenToIfEnabled(editingView.document, 'mousedown', (evt, domEventData) => {\r\n            const button = getClosestTypeAroundDomButton(domEventData.domTarget);\r\n            if (!button) {\r\n                return;\r\n            }\r\n            const buttonPosition = getTypeAroundButtonPosition(button);\r\n            const widgetViewElement = getClosestWidgetViewElement(button, editingView.domConverter);\r\n            const widgetModelElement = editor.editing.mapper.toModelElement(widgetViewElement);\r\n            this._insertParagraph(widgetModelElement, buttonPosition);\r\n            domEventData.preventDefault();\r\n            evt.stop();\r\n        });\r\n    }\r\n    /**\r\n     * Creates the <kbd>Enter</kbd> key listener on the view document that allows the user to insert a paragraph\r\n     * near the widget when either:\r\n     *\r\n     * * The fake caret was first activated using the arrow keys,\r\n     * * The entire widget is selected in the model.\r\n     *\r\n     * In the first case, the new paragraph is inserted according to the `widget-type-around` selection\r\n     * attribute (see {@link #_handleArrowKeyPress}).\r\n     *\r\n     * In the second case, the new paragraph is inserted based on whether a soft (<kbd>Shift</kbd>+<kbd>Enter</kbd>) keystroke\r\n     * was pressed or not.\r\n     */\r\n    _enableInsertingParagraphsOnEnterKeypress() {\r\n        const editor = this.editor;\r\n        const selection = editor.model.document.selection;\r\n        const editingView = editor.editing.view;\r\n        this._listenToIfEnabled(editingView.document, 'enter', (evt, domEventData) => {\r\n            // This event could be triggered from inside the widget but we are interested\r\n            // only when the widget is selected itself.\r\n            if (evt.eventPhase != 'atTarget') {\r\n                return;\r\n            }\r\n            const selectedModelElement = selection.getSelectedElement();\r\n            const selectedViewElement = editor.editing.mapper.toViewElement(selectedModelElement);\r\n            const schema = editor.model.schema;\r\n            let wasHandled;\r\n            // First check if the widget is selected and there's a type around selection attribute associated\r\n            // with the fake caret that would tell where to insert a new paragraph.\r\n            if (this._insertParagraphAccordingToFakeCaretPosition()) {\r\n                wasHandled = true;\r\n            }\r\n            // Then, if there is no selection attribute associated with the fake caret, check if the widget\r\n            // simply is selected and create a new paragraph according to the keystroke (Shift+)Enter.\r\n            else if (isTypeAroundWidget(selectedViewElement, selectedModelElement, schema)) {\r\n                this._insertParagraph(selectedModelElement, domEventData.isSoft ? 'before' : 'after');\r\n                wasHandled = true;\r\n            }\r\n            if (wasHandled) {\r\n                domEventData.preventDefault();\r\n                evt.stop();\r\n            }\r\n        }, { context: isWidget });\r\n    }\r\n    /**\r\n     * Similar to the {@link #_enableInsertingParagraphsOnEnterKeypress}, it allows the user\r\n     * to insert a paragraph next to a widget when the fake caret was activated using arrow\r\n     * keys but it responds to typing instead of <kbd>Enter</kbd>.\r\n     *\r\n     * Listener enabled by this method will insert a new paragraph according to the `widget-type-around`\r\n     * model selection attribute as the user simply starts typing, which creates the impression that the fake caret\r\n     * behaves like a real one rendered by the browser (AKA your text appears where the caret was).\r\n     *\r\n     * **Note**: At the moment this listener creates 2 undo steps: one for the `insertParagraph` command\r\n     * and another one for actual typing. It is not a disaster but this may need to be fixed\r\n     * sooner or later.\r\n     */\r\n    _enableInsertingParagraphsOnTypingKeystroke() {\r\n        const editor = this.editor;\r\n        const viewDocument = editor.editing.view.document;\r\n        // Note: The priority must precede the default Input plugin insertText handler.\r\n        this._listenToIfEnabled(viewDocument, 'insertText', (evt, data) => {\r\n            if (this._insertParagraphAccordingToFakeCaretPosition()) {\r\n                // The view selection in the event data contains the widget. If the new paragraph\r\n                // was inserted, modify the view selection passed along with the insertText event\r\n                // so the default event handler in the Input plugin starts typing inside the paragraph.\r\n                // Otherwise, the typing would be over the widget.\r\n                data.selection = viewDocument.selection;\r\n            }\r\n        }, { priority: 'high' });\r\n        if (env.isAndroid) {\r\n            // On Android with English keyboard, the composition starts just by putting caret\r\n            // at the word end or by selecting a table column. This is not a real composition started.\r\n            // Trigger delete content on first composition key pressed.\r\n            this._listenToIfEnabled(viewDocument, 'keydown', (evt, data) => {\r\n                if (data.keyCode == 229) {\r\n                    this._insertParagraphAccordingToFakeCaretPosition();\r\n                }\r\n            });\r\n        }\r\n        else {\r\n            // Note: The priority must precede the default Input plugin compositionstart handler (to call it before delete content).\r\n            this._listenToIfEnabled(viewDocument, 'compositionstart', () => {\r\n                this._insertParagraphAccordingToFakeCaretPosition();\r\n            }, { priority: 'high' });\r\n        }\r\n    }\r\n    /**\r\n     * It creates a \"delete\" event listener on the view document to handle cases when the <kbd>Delete</kbd> or <kbd>Backspace</kbd>\r\n     * is pressed and the fake caret is currently active.\r\n     *\r\n     * The fake caret should create an illusion of a real browser caret so that when it appears before or after\r\n     * a widget, pressing <kbd>Delete</kbd> or <kbd>Backspace</kbd> should remove a widget or delete the content\r\n     * before or after a widget (depending on the content surrounding the widget).\r\n     */\r\n    _enableDeleteIntegration() {\r\n        const editor = this.editor;\r\n        const editingView = editor.editing.view;\r\n        const model = editor.model;\r\n        const schema = model.schema;\r\n        this._listenToIfEnabled(editingView.document, 'delete', (evt, domEventData) => {\r\n            // This event could be triggered from inside the widget but we are interested\r\n            // only when the widget is selected itself.\r\n            if (evt.eventPhase != 'atTarget') {\r\n                return;\r\n            }\r\n            const typeAroundFakeCaretPosition = getTypeAroundFakeCaretPosition(model.document.selection);\r\n            // This listener handles only these cases when the fake caret is active.\r\n            if (!typeAroundFakeCaretPosition) {\r\n                return;\r\n            }\r\n            const direction = domEventData.direction;\r\n            const selectedModelWidget = model.document.selection.getSelectedElement();\r\n            const isFakeCaretBefore = typeAroundFakeCaretPosition === 'before';\r\n            const isDeleteForward = direction == 'forward';\r\n            const shouldDeleteEntireWidget = isFakeCaretBefore === isDeleteForward;\r\n            if (shouldDeleteEntireWidget) {\r\n                editor.execute('delete', {\r\n                    selection: model.createSelection(selectedModelWidget, 'on')\r\n                });\r\n            }\r\n            else {\r\n                const range = schema.getNearestSelectionRange(model.createPositionAt(selectedModelWidget, typeAroundFakeCaretPosition), direction);\r\n                // If there is somewhere to move selection to, then there will be something to delete.\r\n                if (range) {\r\n                    // If the range is NOT collapsed, then we know that the range contains an object (see getNearestSelectionRange() docs).\r\n                    if (!range.isCollapsed) {\r\n                        model.change(writer => {\r\n                            writer.setSelection(range);\r\n                            editor.execute(isDeleteForward ? 'deleteForward' : 'delete');\r\n                        });\r\n                    }\r\n                    else {\r\n                        const probe = model.createSelection(range.start);\r\n                        model.modifySelection(probe, { direction });\r\n                        // If the range is collapsed, let's see if a non-collapsed range exists that can could be deleted.\r\n                        // If such range exists, use the editor command because it it safe for collaboration (it merges where it can).\r\n                        if (!probe.focus.isEqual(range.start)) {\r\n                            model.change(writer => {\r\n                                writer.setSelection(range);\r\n                                editor.execute(isDeleteForward ? 'deleteForward' : 'delete');\r\n                            });\r\n                        }\r\n                        // If there is no non-collapsed range to be deleted then we are sure that there is an empty element\r\n                        // next to a widget that should be removed. \"delete\" and \"deleteForward\" commands cannot get rid of it\r\n                        // so calling Model#deleteContent here manually.\r\n                        else {\r\n                            const deepestEmptyRangeAncestor = getDeepestEmptyElementAncestor(schema, range.start.parent);\r\n                            model.deleteContent(model.createSelection(deepestEmptyRangeAncestor, 'on'), {\r\n                                doNotAutoparagraph: true\r\n                            });\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            // If some content was deleted, don't let the handler from the Widget plugin kick in.\r\n            // If nothing was deleted, then the default handler will have nothing to do anyway.\r\n            domEventData.preventDefault();\r\n            evt.stop();\r\n        }, { context: isWidget });\r\n    }\r\n    /**\r\n     * Attaches the {@link module:engine/model/model~Model#event:insertContent} event listener that, for instance, allows the user to paste\r\n     * content near a widget when the fake caret is first activated using the arrow keys.\r\n     *\r\n     * The content is inserted according to the `widget-type-around` selection attribute (see {@link #_handleArrowKeyPress}).\r\n     */\r\n    _enableInsertContentIntegration() {\r\n        const editor = this.editor;\r\n        const model = this.editor.model;\r\n        const documentSelection = model.document.selection;\r\n        this._listenToIfEnabled(editor.model, 'insertContent', (evt, [content, selectable]) => {\r\n            if (selectable && !selectable.is('documentSelection')) {\r\n                return;\r\n            }\r\n            const typeAroundFakeCaretPosition = getTypeAroundFakeCaretPosition(documentSelection);\r\n            if (!typeAroundFakeCaretPosition) {\r\n                return;\r\n            }\r\n            evt.stop();\r\n            return model.change(writer => {\r\n                const selectedElement = documentSelection.getSelectedElement();\r\n                const position = model.createPositionAt(selectedElement, typeAroundFakeCaretPosition);\r\n                const selection = writer.createSelection(position);\r\n                const result = model.insertContent(content, selection);\r\n                writer.setSelection(selection);\r\n                return result;\r\n            });\r\n        }, { priority: 'high' });\r\n    }\r\n    /**\r\n     * Attaches the {@link module:engine/model/model~Model#event:insertObject} event listener that modifies the\r\n     * `options.findOptimalPosition`parameter to position of fake caret in relation to selected element\r\n     * to reflect user's intent of desired insertion position.\r\n     *\r\n     * The object is inserted according to the `widget-type-around` selection attribute (see {@link #_handleArrowKeyPress}).\r\n     */\r\n    _enableInsertObjectIntegration() {\r\n        const editor = this.editor;\r\n        const model = this.editor.model;\r\n        const documentSelection = model.document.selection;\r\n        this._listenToIfEnabled(editor.model, 'insertObject', (evt, args) => {\r\n            const [, selectable, options = {}] = args;\r\n            if (selectable && !selectable.is('documentSelection')) {\r\n                return;\r\n            }\r\n            const typeAroundFakeCaretPosition = getTypeAroundFakeCaretPosition(documentSelection);\r\n            if (!typeAroundFakeCaretPosition) {\r\n                return;\r\n            }\r\n            options.findOptimalPosition = typeAroundFakeCaretPosition;\r\n            args[3] = options;\r\n        }, { priority: 'high' });\r\n    }\r\n    /**\r\n     * Attaches the {@link module:engine/model/model~Model#event:deleteContent} event listener to block the event when the fake\r\n     * caret is active.\r\n     *\r\n     * This is required for cases that trigger {@link module:engine/model/model~Model#deleteContent `model.deleteContent()`}\r\n     * before calling {@link module:engine/model/model~Model#insertContent `model.insertContent()`} like, for instance,\r\n     * plain text pasting.\r\n     */\r\n    _enableDeleteContentIntegration() {\r\n        const editor = this.editor;\r\n        const model = this.editor.model;\r\n        const documentSelection = model.document.selection;\r\n        this._listenToIfEnabled(editor.model, 'deleteContent', (evt, [selection]) => {\r\n            if (selection && !selection.is('documentSelection')) {\r\n                return;\r\n            }\r\n            const typeAroundFakeCaretPosition = getTypeAroundFakeCaretPosition(documentSelection);\r\n            // Disable removing the selection content while pasting plain text.\r\n            if (typeAroundFakeCaretPosition) {\r\n                evt.stop();\r\n            }\r\n        }, { priority: 'high' });\r\n    }\r\n}\r\n/**\r\n * Injects the type around UI into a view widget instance.\r\n */\r\nfunction injectUIIntoWidget(viewWriter, buttonTitles, widgetViewElement) {\r\n    const typeAroundWrapper = viewWriter.createUIElement('div', {\r\n        class: 'ck ck-reset_all ck-widget__type-around'\r\n    }, function (domDocument) {\r\n        const wrapperDomElement = this.toDomElement(domDocument);\r\n        injectButtons(wrapperDomElement, buttonTitles);\r\n        injectFakeCaret(wrapperDomElement);\r\n        return wrapperDomElement;\r\n    });\r\n    // Inject the type around wrapper into the widget's wrapper.\r\n    viewWriter.insert(viewWriter.createPositionAt(widgetViewElement, 'end'), typeAroundWrapper);\r\n}\r\n/**\r\n * FYI: Not using the IconView class because each instance would need to be destroyed to avoid memory leaks\r\n * and it's pretty hard to figure out when a view (widget) is gone for good so it's cheaper to use raw\r\n * <svg> here.\r\n */\r\nfunction injectButtons(wrapperDomElement, buttonTitles) {\r\n    for (const position of POSSIBLE_INSERTION_POSITIONS) {\r\n        const buttonTemplate = new Template({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-widget__type-around__button',\r\n                    `ck-widget__type-around__button_${position}`\r\n                ],\r\n                title: buttonTitles[position],\r\n                'aria-hidden': 'true'\r\n            },\r\n            children: [\r\n                wrapperDomElement.ownerDocument.importNode(RETURN_ARROW_ICON_ELEMENT, true)\r\n            ]\r\n        });\r\n        wrapperDomElement.appendChild(buttonTemplate.render());\r\n    }\r\n}\r\nfunction injectFakeCaret(wrapperDomElement) {\r\n    const caretTemplate = new Template({\r\n        tag: 'div',\r\n        attributes: {\r\n            class: [\r\n                'ck',\r\n                'ck-widget__type-around__fake-caret'\r\n            ]\r\n        }\r\n    });\r\n    wrapperDomElement.appendChild(caretTemplate.render());\r\n}\r\n/**\r\n * Returns the ancestor of an element closest to the root which is empty. For instance,\r\n * for `<baz>`:\r\n *\r\n * ```\r\n * <foo>abc<bar><baz></baz></bar></foo>\r\n * ```\r\n *\r\n * it returns `<bar>`.\r\n */\r\nfunction getDeepestEmptyElementAncestor(schema, element) {\r\n    let deepestEmptyAncestor = element;\r\n    for (const ancestor of element.getAncestors({ parentFirst: true })) {\r\n        if (ancestor.childCount > 1 || schema.isLimit(ancestor)) {\r\n            break;\r\n        }\r\n        deepestEmptyAncestor = ancestor;\r\n    }\r\n    return deepestEmptyAncestor;\r\n}\r\n","export default \"<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>\";","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module widget/verticalnavigation\r\n */\r\nimport { keyCodes, Rect } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Returns 'keydown' handler for up/down arrow keys that modifies the caret movement if it's in a text line next to an object.\r\n *\r\n * @param editing The editing controller.\r\n */\r\nexport default function verticalNavigationHandler(editing) {\r\n    const model = editing.model;\r\n    return (evt, data) => {\r\n        const arrowUpPressed = data.keyCode == keyCodes.arrowup;\r\n        const arrowDownPressed = data.keyCode == keyCodes.arrowdown;\r\n        const expandSelection = data.shiftKey;\r\n        const selection = model.document.selection;\r\n        if (!arrowUpPressed && !arrowDownPressed) {\r\n            return;\r\n        }\r\n        const isForward = arrowDownPressed;\r\n        // Navigation is in the opposite direction than the selection direction so this is shrinking of the selection.\r\n        // Selection for sure will not approach any object.\r\n        if (expandSelection && selectionWillShrink(selection, isForward)) {\r\n            return;\r\n        }\r\n        // Find a range between selection and closest limit element.\r\n        const range = findTextRangeFromSelection(editing, selection, isForward);\r\n        // There is no selection position inside the limit element.\r\n        if (!range) {\r\n            return;\r\n        }\r\n        // If already at the edge of a limit element.\r\n        if (range.isCollapsed) {\r\n            // A collapsed selection at limit edge - nothing more to do.\r\n            if (selection.isCollapsed) {\r\n                return;\r\n            }\r\n            // A non collapsed selection is at the limit edge while expanding the selection - let others do their stuff.\r\n            else if (expandSelection) {\r\n                return;\r\n            }\r\n        }\r\n        // If the range is a single line (there is no word wrapping) then move the selection to the position closest to the limit element.\r\n        //\r\n        // We can't move the selection directly to the isObject element (eg. table cell) because of dual position at the end/beginning\r\n        // of wrapped line (it's at the same time at the end of one line and at the start of the next line).\r\n        if (range.isCollapsed || isSingleLineRange(editing, range, isForward)) {\r\n            model.change(writer => {\r\n                const newPosition = isForward ? range.end : range.start;\r\n                if (expandSelection) {\r\n                    const newSelection = model.createSelection(selection.anchor);\r\n                    newSelection.setFocus(newPosition);\r\n                    writer.setSelection(newSelection);\r\n                }\r\n                else {\r\n                    writer.setSelection(newPosition);\r\n                }\r\n            });\r\n            evt.stop();\r\n            data.preventDefault();\r\n            data.stopPropagation();\r\n        }\r\n    };\r\n}\r\n/**\r\n * Finds the range between selection and closest limit element (in the direction of navigation).\r\n * The position next to limit element is adjusted to the closest allowed `$text` position.\r\n *\r\n * Returns `null` if, according to the schema, the resulting range cannot contain a `$text` element.\r\n *\r\n * @param editing The editing controller.\r\n * @param selection The current selection.\r\n * @param isForward The expected navigation direction.\r\n */\r\nfunction findTextRangeFromSelection(editing, selection, isForward) {\r\n    const model = editing.model;\r\n    if (isForward) {\r\n        const startPosition = selection.isCollapsed ? selection.focus : selection.getLastPosition();\r\n        const endPosition = getNearestNonInlineLimit(model, startPosition, 'forward');\r\n        // There is no limit element, browser should handle this.\r\n        if (!endPosition) {\r\n            return null;\r\n        }\r\n        const range = model.createRange(startPosition, endPosition);\r\n        const lastRangePosition = getNearestTextPosition(model.schema, range, 'backward');\r\n        if (lastRangePosition) {\r\n            return model.createRange(startPosition, lastRangePosition);\r\n        }\r\n        return null;\r\n    }\r\n    else {\r\n        const endPosition = selection.isCollapsed ? selection.focus : selection.getFirstPosition();\r\n        const startPosition = getNearestNonInlineLimit(model, endPosition, 'backward');\r\n        // There is no limit element, browser should handle this.\r\n        if (!startPosition) {\r\n            return null;\r\n        }\r\n        const range = model.createRange(startPosition, endPosition);\r\n        const firstRangePosition = getNearestTextPosition(model.schema, range, 'forward');\r\n        if (firstRangePosition) {\r\n            return model.createRange(firstRangePosition, endPosition);\r\n        }\r\n        return null;\r\n    }\r\n}\r\n/**\r\n * Finds the limit element position that is closest to startPosition.\r\n *\r\n * @param direction Search direction.\r\n */\r\nfunction getNearestNonInlineLimit(model, startPosition, direction) {\r\n    const schema = model.schema;\r\n    const range = model.createRangeIn(startPosition.root);\r\n    const walkerValueType = direction == 'forward' ? 'elementStart' : 'elementEnd';\r\n    for (const { previousPosition, item, type } of range.getWalker({ startPosition, direction })) {\r\n        if (schema.isLimit(item) && !schema.isInline(item)) {\r\n            return previousPosition;\r\n        }\r\n        // Stop looking for isLimit element if the next element is a block element (it is for sure not single line).\r\n        if (type == walkerValueType && schema.isBlock(item)) {\r\n            return null;\r\n        }\r\n    }\r\n    return null;\r\n}\r\n/**\r\n * Basing on the provided range, finds the first or last (depending on `direction`) position inside the range\r\n * that can contain `$text` (according to schema).\r\n *\r\n * @param schema The schema.\r\n * @param range The range to find the position in.\r\n * @param direction Search direction.\r\n * @returns The nearest selection position.\r\n *\r\n */\r\nfunction getNearestTextPosition(schema, range, direction) {\r\n    const position = direction == 'backward' ? range.end : range.start;\r\n    if (schema.checkChild(position, '$text')) {\r\n        return position;\r\n    }\r\n    for (const { nextPosition } of range.getWalker({ direction })) {\r\n        if (schema.checkChild(nextPosition, '$text')) {\r\n            return nextPosition;\r\n        }\r\n    }\r\n    return null;\r\n}\r\n/**\r\n * Checks if the DOM range corresponding to the provided model range renders as a single line by analyzing DOMRects\r\n * (verifying if they visually wrap content to the next line).\r\n *\r\n * @param editing The editing controller.\r\n * @param modelRange The current table cell content range.\r\n * @param isForward The expected navigation direction.\r\n */\r\nfunction isSingleLineRange(editing, modelRange, isForward) {\r\n    const model = editing.model;\r\n    const domConverter = editing.view.domConverter;\r\n    // Wrapped lines contain exactly the same position at the end of current line\r\n    // and at the beginning of next line. That position's client rect is at the end\r\n    // of current line. In case of caret at first position of the last line that 'dual'\r\n    // position would be detected as it's not the last line.\r\n    if (isForward) {\r\n        const probe = model.createSelection(modelRange.start);\r\n        model.modifySelection(probe);\r\n        // If the new position is at the end of the container then we can't use this position\r\n        // because it would provide incorrect result for eg caption of image and selection\r\n        // just before end of it. Also in this case there is no \"dual\" position.\r\n        if (!probe.focus.isAtEnd && !modelRange.start.isEqual(probe.focus)) {\r\n            modelRange = model.createRange(probe.focus, modelRange.end);\r\n        }\r\n    }\r\n    const viewRange = editing.mapper.toViewRange(modelRange);\r\n    const domRange = domConverter.viewRangeToDom(viewRange);\r\n    const rects = Rect.getDomRangeRects(domRange);\r\n    let boundaryVerticalPosition;\r\n    for (const rect of rects) {\r\n        if (boundaryVerticalPosition === undefined) {\r\n            boundaryVerticalPosition = Math.round(rect.bottom);\r\n            continue;\r\n        }\r\n        // Let's check if this rect is in new line.\r\n        if (Math.round(rect.top) >= boundaryVerticalPosition) {\r\n            return false;\r\n        }\r\n        boundaryVerticalPosition = Math.max(boundaryVerticalPosition, Math.round(rect.bottom));\r\n    }\r\n    return true;\r\n}\r\nfunction selectionWillShrink(selection, isForward) {\r\n    return !selection.isCollapsed && selection.isBackward == isForward;\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./widget.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module widget/widget\r\n */\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\nimport { MouseObserver } from '@ckeditor/ckeditor5-engine';\r\nimport { Delete } from '@ckeditor/ckeditor5-typing';\r\nimport { env, getLocalizedArrowKeyCodeDirection } from '@ckeditor/ckeditor5-utils';\r\nimport WidgetTypeAround from './widgettypearound/widgettypearound';\r\nimport verticalNavigationHandler from './verticalnavigation';\r\nimport { getLabel, isWidget, WIDGET_SELECTED_CLASS_NAME } from './utils';\r\nimport '../theme/widget.css';\r\n/**\r\n * The widget plugin. It enables base support for widgets.\r\n *\r\n * See {@glink api/widget package page} for more details and documentation.\r\n *\r\n * This plugin enables multiple behaviors required by widgets:\r\n *\r\n * * The model to view selection converter for the editing pipeline (it handles widget custom selection rendering).\r\n * If a converted selection wraps around a widget element, that selection is marked as\r\n * {@link module:engine/view/selection~Selection#isFake fake}. Additionally, the `ck-widget_selected` CSS class\r\n * is added to indicate that widget has been selected.\r\n * * The mouse and keyboard events handling on and around widget elements.\r\n */\r\nexport default class Widget extends Plugin {\r\n    constructor() {\r\n        super(...arguments);\r\n        /**\r\n         * Holds previously selected widgets.\r\n         */\r\n        this._previouslySelected = new Set();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'Widget';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [WidgetTypeAround, Delete];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const view = editor.editing.view;\r\n        const viewDocument = view.document;\r\n        // Model to view selection converter.\r\n        // Converts selection placed over widget element to fake selection.\r\n        //\r\n        // By default, the selection is downcasted by the engine to surround the attribute element, even though its only\r\n        // child is an inline widget. A similar thing also happens when a collapsed marker is rendered as a UI element\r\n        // next to an inline widget: the view selection contains both the widget and the marker.\r\n        //\r\n        // This prevents creating a correct fake selection when this inline widget is selected. Normalize the selection\r\n        // in these cases based on the model:\r\n        //\r\n        //\t\t[<attributeElement><inlineWidget /></attributeElement>] -> <attributeElement>[<inlineWidget />]</attributeElement>\r\n        //\t\t[<uiElement></uiElement><inlineWidget />] -> <uiElement></uiElement>[<inlineWidget />]\r\n        //\r\n        // Thanks to this:\r\n        //\r\n        // * fake selection can be set correctly,\r\n        // * any logic depending on (View)Selection#getSelectedElement() also works OK.\r\n        //\r\n        // See https://github.com/ckeditor/ckeditor5/issues/9524.\r\n        this.editor.editing.downcastDispatcher.on('selection', (evt, data, conversionApi) => {\r\n            const viewWriter = conversionApi.writer;\r\n            const modelSelection = data.selection;\r\n            // The collapsed selection can't contain any widget.\r\n            if (modelSelection.isCollapsed) {\r\n                return;\r\n            }\r\n            const selectedModelElement = modelSelection.getSelectedElement();\r\n            if (!selectedModelElement) {\r\n                return;\r\n            }\r\n            const selectedViewElement = editor.editing.mapper.toViewElement(selectedModelElement);\r\n            if (!isWidget(selectedViewElement)) {\r\n                return;\r\n            }\r\n            if (!conversionApi.consumable.consume(modelSelection, 'selection')) {\r\n                return;\r\n            }\r\n            viewWriter.setSelection(viewWriter.createRangeOn(selectedViewElement), {\r\n                fake: true,\r\n                label: getLabel(selectedViewElement)\r\n            });\r\n        });\r\n        // Mark all widgets inside the selection with the css class.\r\n        // This handler is registered at the 'low' priority so it's triggered after the real selection conversion.\r\n        this.editor.editing.downcastDispatcher.on('selection', (evt, data, conversionApi) => {\r\n            // Remove selected class from previously selected widgets.\r\n            this._clearPreviouslySelectedWidgets(conversionApi.writer);\r\n            const viewWriter = conversionApi.writer;\r\n            const viewSelection = viewWriter.document.selection;\r\n            let lastMarked = null;\r\n            for (const range of viewSelection.getRanges()) {\r\n                // Note: There could be multiple selected widgets in a range but no fake selection.\r\n                // All of them must be marked as selected, for instance [<widget></widget><widget></widget>]\r\n                for (const value of range) {\r\n                    const node = value.item;\r\n                    // Do not mark nested widgets in selected one. See: #4594\r\n                    if (isWidget(node) && !isChild(node, lastMarked)) {\r\n                        viewWriter.addClass(WIDGET_SELECTED_CLASS_NAME, node);\r\n                        this._previouslySelected.add(node);\r\n                        lastMarked = node;\r\n                    }\r\n                }\r\n            }\r\n        }, { priority: 'low' });\r\n        // If mouse down is pressed on widget - create selection over whole widget.\r\n        view.addObserver(MouseObserver);\r\n        this.listenTo(viewDocument, 'mousedown', (...args) => this._onMousedown(...args));\r\n        // There are two keydown listeners working on different priorities. This allows other\r\n        // features such as WidgetTypeAround or TableKeyboard to attach their listeners in between\r\n        // and customize the behavior even further in different content/selection scenarios.\r\n        //\r\n        // * The first listener handles changing the selection on arrow key press\r\n        // if the widget is selected or if the selection is next to a widget and the widget\r\n        // should become selected upon the arrow key press.\r\n        //\r\n        // * The second (late) listener makes sure the default browser action on arrow key press is\r\n        // prevented when a widget is selected. This prevents the selection from being moved\r\n        // from a fake selection container.\r\n        this.listenTo(viewDocument, 'arrowKey', (...args) => {\r\n            this._handleSelectionChangeOnArrowKeyPress(...args);\r\n        }, { context: [isWidget, '$text'] });\r\n        this.listenTo(viewDocument, 'arrowKey', (...args) => {\r\n            this._preventDefaultOnArrowKeyPress(...args);\r\n        }, { context: '$root' });\r\n        this.listenTo(viewDocument, 'arrowKey', verticalNavigationHandler(this.editor.editing), { context: '$text' });\r\n        // Handle custom delete behaviour.\r\n        this.listenTo(viewDocument, 'delete', (evt, data) => {\r\n            if (this._handleDelete(data.direction == 'forward')) {\r\n                data.preventDefault();\r\n                evt.stop();\r\n            }\r\n        }, { context: '$root' });\r\n    }\r\n    /**\r\n     * Handles {@link module:engine/view/document~Document#event:mousedown mousedown} events on widget elements.\r\n     */\r\n    _onMousedown(eventInfo, domEventData) {\r\n        const editor = this.editor;\r\n        const view = editor.editing.view;\r\n        const viewDocument = view.document;\r\n        let element = domEventData.target;\r\n        // Do nothing for single or double click inside nested editable.\r\n        if (isInsideNestedEditable(element)) {\r\n            // But at least triple click inside nested editable causes broken selection in Safari.\r\n            // For such event, we select the entire nested editable element.\r\n            // See: https://github.com/ckeditor/ckeditor5/issues/1463.\r\n            if ((env.isSafari || env.isGecko) && domEventData.domEvent.detail >= 3) {\r\n                const mapper = editor.editing.mapper;\r\n                const viewElement = element.is('attributeElement') ?\r\n                    element.findAncestor(element => !element.is('attributeElement')) : element;\r\n                const modelElement = mapper.toModelElement(viewElement);\r\n                domEventData.preventDefault();\r\n                this.editor.model.change(writer => {\r\n                    writer.setSelection(modelElement, 'in');\r\n                });\r\n            }\r\n            return;\r\n        }\r\n        // If target is not a widget element - check if one of the ancestors is.\r\n        if (!isWidget(element)) {\r\n            element = element.findAncestor(isWidget);\r\n            if (!element) {\r\n                return;\r\n            }\r\n        }\r\n        // On Android selection would jump to the first table cell, on other devices\r\n        // we can't block it (and don't need to) because of drag and drop support.\r\n        if (env.isAndroid) {\r\n            domEventData.preventDefault();\r\n        }\r\n        // Focus editor if is not focused already.\r\n        if (!viewDocument.isFocused) {\r\n            view.focus();\r\n        }\r\n        // Create model selection over widget.\r\n        const modelElement = editor.editing.mapper.toModelElement(element);\r\n        this._setSelectionOverElement(modelElement);\r\n    }\r\n    /**\r\n     * Handles {@link module:engine/view/document~Document#event:keydown keydown} events and changes\r\n     * the model selection when:\r\n     *\r\n     * * arrow key is pressed when the widget is selected,\r\n     * * the selection is next to a widget and the widget should become selected upon the arrow key press.\r\n     *\r\n     * See {@link #_preventDefaultOnArrowKeyPress}.\r\n     */\r\n    _handleSelectionChangeOnArrowKeyPress(eventInfo, domEventData) {\r\n        const keyCode = domEventData.keyCode;\r\n        const model = this.editor.model;\r\n        const schema = model.schema;\r\n        const modelSelection = model.document.selection;\r\n        const objectElement = modelSelection.getSelectedElement();\r\n        const direction = getLocalizedArrowKeyCodeDirection(keyCode, this.editor.locale.contentLanguageDirection);\r\n        const isForward = direction == 'down' || direction == 'right';\r\n        const isVerticalNavigation = direction == 'up' || direction == 'down';\r\n        // If object element is selected.\r\n        if (objectElement && schema.isObject(objectElement)) {\r\n            const position = isForward ? modelSelection.getLastPosition() : modelSelection.getFirstPosition();\r\n            const newRange = schema.getNearestSelectionRange(position, isForward ? 'forward' : 'backward');\r\n            if (newRange) {\r\n                model.change(writer => {\r\n                    writer.setSelection(newRange);\r\n                });\r\n                domEventData.preventDefault();\r\n                eventInfo.stop();\r\n            }\r\n            return;\r\n        }\r\n        // Handle collapsing of the selection when there is any widget on the edge of selection.\r\n        // This is needed because browsers have problems with collapsing such selection.\r\n        if (!modelSelection.isCollapsed && !domEventData.shiftKey) {\r\n            const firstPosition = modelSelection.getFirstPosition();\r\n            const lastPosition = modelSelection.getLastPosition();\r\n            const firstSelectedNode = firstPosition.nodeAfter;\r\n            const lastSelectedNode = lastPosition.nodeBefore;\r\n            if (firstSelectedNode && schema.isObject(firstSelectedNode) || lastSelectedNode && schema.isObject(lastSelectedNode)) {\r\n                model.change(writer => {\r\n                    writer.setSelection(isForward ? lastPosition : firstPosition);\r\n                });\r\n                domEventData.preventDefault();\r\n                eventInfo.stop();\r\n            }\r\n            return;\r\n        }\r\n        // Return if not collapsed.\r\n        if (!modelSelection.isCollapsed) {\r\n            return;\r\n        }\r\n        // If selection is next to object element.\r\n        const objectElementNextToSelection = this._getObjectElementNextToSelection(isForward);\r\n        if (objectElementNextToSelection && schema.isObject(objectElementNextToSelection)) {\r\n            // Do not select an inline widget while handling up/down arrow.\r\n            if (schema.isInline(objectElementNextToSelection) && isVerticalNavigation) {\r\n                return;\r\n            }\r\n            this._setSelectionOverElement(objectElementNextToSelection);\r\n            domEventData.preventDefault();\r\n            eventInfo.stop();\r\n        }\r\n    }\r\n    /**\r\n     * Handles {@link module:engine/view/document~Document#event:keydown keydown} events and prevents\r\n     * the default browser behavior to make sure the fake selection is not being moved from a fake selection\r\n     * container.\r\n     *\r\n     * See {@link #_handleSelectionChangeOnArrowKeyPress}.\r\n     */\r\n    _preventDefaultOnArrowKeyPress(eventInfo, domEventData) {\r\n        const model = this.editor.model;\r\n        const schema = model.schema;\r\n        const objectElement = model.document.selection.getSelectedElement();\r\n        // If object element is selected.\r\n        if (objectElement && schema.isObject(objectElement)) {\r\n            domEventData.preventDefault();\r\n            eventInfo.stop();\r\n        }\r\n    }\r\n    /**\r\n     * Handles delete keys: backspace and delete.\r\n     *\r\n     * @param isForward Set to true if delete was performed in forward direction.\r\n     * @returns Returns `true` if keys were handled correctly.\r\n     */\r\n    _handleDelete(isForward) {\r\n        const modelDocument = this.editor.model.document;\r\n        const modelSelection = modelDocument.selection;\r\n        // Do nothing when the read only mode is enabled.\r\n        if (!this.editor.model.canEditAt(modelSelection)) {\r\n            return;\r\n        }\r\n        // Do nothing on non-collapsed selection.\r\n        if (!modelSelection.isCollapsed) {\r\n            return;\r\n        }\r\n        const objectElement = this._getObjectElementNextToSelection(isForward);\r\n        if (objectElement) {\r\n            this.editor.model.change(writer => {\r\n                let previousNode = modelSelection.anchor.parent;\r\n                // Remove previous element if empty.\r\n                while (previousNode.isEmpty) {\r\n                    const nodeToRemove = previousNode;\r\n                    previousNode = nodeToRemove.parent;\r\n                    writer.remove(nodeToRemove);\r\n                }\r\n                this._setSelectionOverElement(objectElement);\r\n            });\r\n            return true;\r\n        }\r\n    }\r\n    /**\r\n     * Sets {@link module:engine/model/selection~Selection document's selection} over given element.\r\n     *\r\n     * @internal\r\n     */\r\n    _setSelectionOverElement(element) {\r\n        this.editor.model.change(writer => {\r\n            writer.setSelection(writer.createRangeOn(element));\r\n        });\r\n    }\r\n    /**\r\n     * Checks if {@link module:engine/model/element~Element element} placed next to the current\r\n     * {@link module:engine/model/selection~Selection model selection} exists and is marked in\r\n     * {@link module:engine/model/schema~Schema schema} as `object`.\r\n     *\r\n     * @internal\r\n     * @param forward Direction of checking.\r\n     */\r\n    _getObjectElementNextToSelection(forward) {\r\n        const model = this.editor.model;\r\n        const schema = model.schema;\r\n        const modelSelection = model.document.selection;\r\n        // Clone current selection to use it as a probe. We must leave default selection as it is so it can return\r\n        // to its current state after undo.\r\n        const probe = model.createSelection(modelSelection);\r\n        model.modifySelection(probe, { direction: forward ? 'forward' : 'backward' });\r\n        // The selection didn't change so there is nothing there.\r\n        if (probe.isEqual(modelSelection)) {\r\n            return null;\r\n        }\r\n        const objectElement = forward ? probe.focus.nodeBefore : probe.focus.nodeAfter;\r\n        if (!!objectElement && schema.isObject(objectElement)) {\r\n            return objectElement;\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Removes CSS class from previously selected widgets.\r\n     */\r\n    _clearPreviouslySelectedWidgets(writer) {\r\n        for (const widget of this._previouslySelected) {\r\n            writer.removeClass(WIDGET_SELECTED_CLASS_NAME, widget);\r\n        }\r\n        this._previouslySelected.clear();\r\n    }\r\n}\r\n/**\r\n * Returns `true` when element is a nested editable or is placed inside one.\r\n */\r\nfunction isInsideNestedEditable(element) {\r\n    let currentElement = element;\r\n    while (currentElement) {\r\n        if (currentElement.is('editableElement') && !currentElement.is('rootElement')) {\r\n            return true;\r\n        }\r\n        // Click on nested widget should select it.\r\n        if (isWidget(currentElement)) {\r\n            return false;\r\n        }\r\n        currentElement = currentElement.parent;\r\n    }\r\n    return false;\r\n}\r\n/**\r\n * Checks whether the specified `element` is a child of the `parent` element.\r\n *\r\n * @param element An element to check.\r\n * @param parent A parent for the element.\r\n */\r\nfunction isChild(element, parent) {\r\n    if (!parent) {\r\n        return false;\r\n    }\r\n    return Array.from(element.getAncestors()).includes(parent);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module widget/widgettoolbarrepository\r\n */\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\nimport { BalloonPanelView, ContextualBalloon, ToolbarView } from '@ckeditor/ckeditor5-ui';\r\nimport { CKEditorError, logWarning } from '@ckeditor/ckeditor5-utils';\r\nimport { isWidget } from './utils';\r\n/**\r\n * Widget toolbar repository plugin. A central point for registering widget toolbars. This plugin handles the whole\r\n * toolbar rendering process and exposes a concise API.\r\n *\r\n * To add a toolbar for your widget use the {@link ~WidgetToolbarRepository#register `WidgetToolbarRepository#register()`} method.\r\n *\r\n * The following example comes from the {@link module:image/imagetoolbar~ImageToolbar} plugin:\r\n *\r\n * ```ts\r\n * class ImageToolbar extends Plugin {\r\n * \tstatic get requires() {\r\n * \t\treturn [ WidgetToolbarRepository ];\r\n * \t}\r\n *\r\n * \tafterInit() {\r\n * \t\tconst editor = this.editor;\r\n * \t\tconst widgetToolbarRepository = editor.plugins.get( WidgetToolbarRepository );\r\n *\r\n * \t\twidgetToolbarRepository.register( 'image', {\r\n * \t\t\titems: editor.config.get( 'image.toolbar' ),\r\n * \t\t\tgetRelatedElement: getClosestSelectedImageWidget\r\n * \t\t} );\r\n * \t}\r\n * }\r\n * ```\r\n */\r\nexport default class WidgetToolbarRepository extends Plugin {\r\n    constructor() {\r\n        super(...arguments);\r\n        /**\r\n         * A map of toolbar definitions.\r\n         */\r\n        this._toolbarDefinitions = new Map();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ContextualBalloon];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'WidgetToolbarRepository';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        // Disables the default balloon toolbar for all widgets.\r\n        if (editor.plugins.has('BalloonToolbar')) {\r\n            const balloonToolbar = editor.plugins.get('BalloonToolbar');\r\n            this.listenTo(balloonToolbar, 'show', evt => {\r\n                if (isWidgetSelected(editor.editing.view.document.selection)) {\r\n                    evt.stop();\r\n                }\r\n            }, { priority: 'high' });\r\n        }\r\n        this._balloon = this.editor.plugins.get('ContextualBalloon');\r\n        this.on('change:isEnabled', () => {\r\n            this._updateToolbarsVisibility();\r\n        });\r\n        this.listenTo(editor.ui, 'update', () => {\r\n            this._updateToolbarsVisibility();\r\n        });\r\n        // UI#update is not fired after focus is back in editor, we need to check if balloon panel should be visible.\r\n        this.listenTo(editor.ui.focusTracker, 'change:isFocused', () => {\r\n            this._updateToolbarsVisibility();\r\n        }, { priority: 'low' });\r\n    }\r\n    destroy() {\r\n        super.destroy();\r\n        for (const toolbarConfig of this._toolbarDefinitions.values()) {\r\n            toolbarConfig.view.destroy();\r\n        }\r\n    }\r\n    /**\r\n     * Registers toolbar in the WidgetToolbarRepository. It renders it in the `ContextualBalloon` based on the value of the invoked\r\n     * `getRelatedElement` function. Toolbar items are gathered from `items` array.\r\n     * The balloon's CSS class is by default `ck-toolbar-container` and may be override with the `balloonClassName` option.\r\n     *\r\n     * Note: This method should be called in the {@link module:core/plugin~PluginInterface#afterInit `Plugin#afterInit()`}\r\n     * callback (or later) to make sure that the given toolbar items were already registered by other plugins.\r\n     *\r\n     * @param toolbarId An id for the toolbar. Used to\r\n     * @param options.ariaLabel Label used by assistive technologies to describe this toolbar element.\r\n     * @param options.items Array of toolbar items.\r\n     * @param options.getRelatedElement Callback which returns an element the toolbar should be attached to.\r\n     * @param options.balloonClassName CSS class for the widget balloon.\r\n     */\r\n    register(toolbarId, { ariaLabel, items, getRelatedElement, balloonClassName = 'ck-toolbar-container' }) {\r\n        // Trying to register a toolbar without any item.\r\n        if (!items.length) {\r\n            /**\r\n             * When {@link module:widget/widgettoolbarrepository~WidgetToolbarRepository#register registering} a new widget toolbar, you\r\n             * need to provide a non-empty array with the items that will be inserted into the toolbar.\r\n             *\r\n             * If you see this error when integrating the editor, you likely forgot to configure one of the widget toolbars.\r\n             *\r\n             * See for instance:\r\n             *\r\n             * * {@link module:table/tableconfig~TableConfig#contentToolbar `config.table.contentToolbar`}\r\n             * * {@link module:image/imageconfig~ImageConfig#toolbar `config.image.toolbar`}\r\n             *\r\n             * @error widget-toolbar-no-items\r\n             * @param toolbarId The id of the toolbar that has not been configured correctly.\r\n             */\r\n            logWarning('widget-toolbar-no-items', { toolbarId });\r\n            return;\r\n        }\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        const toolbarView = new ToolbarView(editor.locale);\r\n        toolbarView.ariaLabel = ariaLabel || t('Widget toolbar');\r\n        if (this._toolbarDefinitions.has(toolbarId)) {\r\n            /**\r\n             * Toolbar with the given id was already added.\r\n             *\r\n             * @error widget-toolbar-duplicated\r\n             * @param toolbarId Toolbar id.\r\n             */\r\n            throw new CKEditorError('widget-toolbar-duplicated', this, { toolbarId });\r\n        }\r\n        const toolbarDefinition = {\r\n            view: toolbarView,\r\n            getRelatedElement,\r\n            balloonClassName,\r\n            itemsConfig: items,\r\n            initialized: false\r\n        };\r\n        // Register the toolbar so it becomes available for Alt+F10 and Esc navigation.\r\n        editor.ui.addToolbar(toolbarView, {\r\n            isContextual: true,\r\n            beforeFocus: () => {\r\n                const relatedElement = getRelatedElement(editor.editing.view.document.selection);\r\n                if (relatedElement) {\r\n                    this._showToolbar(toolbarDefinition, relatedElement);\r\n                }\r\n            },\r\n            afterBlur: () => {\r\n                this._hideToolbar(toolbarDefinition);\r\n            }\r\n        });\r\n        this._toolbarDefinitions.set(toolbarId, toolbarDefinition);\r\n    }\r\n    /**\r\n     * Iterates over stored toolbars and makes them visible or hidden.\r\n     */\r\n    _updateToolbarsVisibility() {\r\n        let maxRelatedElementDepth = 0;\r\n        let deepestRelatedElement = null;\r\n        let deepestToolbarDefinition = null;\r\n        for (const definition of this._toolbarDefinitions.values()) {\r\n            const relatedElement = definition.getRelatedElement(this.editor.editing.view.document.selection);\r\n            if (!this.isEnabled || !relatedElement) {\r\n                if (this._isToolbarInBalloon(definition)) {\r\n                    this._hideToolbar(definition);\r\n                }\r\n            }\r\n            else if (!this.editor.ui.focusTracker.isFocused) {\r\n                if (this._isToolbarVisible(definition)) {\r\n                    this._hideToolbar(definition);\r\n                }\r\n            }\r\n            else {\r\n                const relatedElementDepth = relatedElement.getAncestors().length;\r\n                // Many toolbars can express willingness to be displayed but they do not know about\r\n                // each other. Figure out which toolbar is deepest in the view tree to decide which\r\n                // should be displayed. For instance, if a selected image is inside a table cell, display\r\n                // the ImageToolbar rather than the TableToolbar (#60).\r\n                if (relatedElementDepth > maxRelatedElementDepth) {\r\n                    maxRelatedElementDepth = relatedElementDepth;\r\n                    deepestRelatedElement = relatedElement;\r\n                    deepestToolbarDefinition = definition;\r\n                }\r\n            }\r\n        }\r\n        if (deepestToolbarDefinition) {\r\n            this._showToolbar(deepestToolbarDefinition, deepestRelatedElement);\r\n        }\r\n    }\r\n    /**\r\n     * Hides the given toolbar.\r\n     */\r\n    _hideToolbar(toolbarDefinition) {\r\n        this._balloon.remove(toolbarDefinition.view);\r\n        this.stopListening(this._balloon, 'change:visibleView');\r\n    }\r\n    /**\r\n     * Shows up the toolbar if the toolbar is not visible.\r\n     * Otherwise, repositions the toolbar's balloon when toolbar's view is the most top view in balloon stack.\r\n     *\r\n     * It might happen here that the toolbar's view is under another view. Then do nothing as the other toolbar view\r\n     * should be still visible after the {@link module:ui/editorui/editorui~EditorUI#event:update}.\r\n     */\r\n    _showToolbar(toolbarDefinition, relatedElement) {\r\n        if (this._isToolbarVisible(toolbarDefinition)) {\r\n            repositionContextualBalloon(this.editor, relatedElement);\r\n        }\r\n        else if (!this._isToolbarInBalloon(toolbarDefinition)) {\r\n            if (!toolbarDefinition.initialized) {\r\n                toolbarDefinition.initialized = true;\r\n                toolbarDefinition.view.fillFromConfig(toolbarDefinition.itemsConfig, this.editor.ui.componentFactory);\r\n            }\r\n            this._balloon.add({\r\n                view: toolbarDefinition.view,\r\n                position: getBalloonPositionData(this.editor, relatedElement),\r\n                balloonClassName: toolbarDefinition.balloonClassName\r\n            });\r\n            // Update toolbar position each time stack with toolbar view is switched to visible.\r\n            // This is in a case target element has changed when toolbar was in invisible stack\r\n            // e.g. target image was wrapped by a block quote.\r\n            // See https://github.com/ckeditor/ckeditor5-widget/issues/92.\r\n            this.listenTo(this._balloon, 'change:visibleView', () => {\r\n                for (const definition of this._toolbarDefinitions.values()) {\r\n                    if (this._isToolbarVisible(definition)) {\r\n                        const relatedElement = definition.getRelatedElement(this.editor.editing.view.document.selection);\r\n                        repositionContextualBalloon(this.editor, relatedElement);\r\n                    }\r\n                }\r\n            });\r\n        }\r\n    }\r\n    _isToolbarVisible(toolbar) {\r\n        return this._balloon.visibleView === toolbar.view;\r\n    }\r\n    _isToolbarInBalloon(toolbar) {\r\n        return this._balloon.hasView(toolbar.view);\r\n    }\r\n}\r\nfunction repositionContextualBalloon(editor, relatedElement) {\r\n    const balloon = editor.plugins.get('ContextualBalloon');\r\n    const position = getBalloonPositionData(editor, relatedElement);\r\n    balloon.updatePosition(position);\r\n}\r\nfunction getBalloonPositionData(editor, relatedElement) {\r\n    const editingView = editor.editing.view;\r\n    const defaultPositions = BalloonPanelView.defaultPositions;\r\n    return {\r\n        target: editingView.domConverter.mapViewToDom(relatedElement),\r\n        positions: [\r\n            defaultPositions.northArrowSouth,\r\n            defaultPositions.northArrowSouthWest,\r\n            defaultPositions.northArrowSouthEast,\r\n            defaultPositions.southArrowNorth,\r\n            defaultPositions.southArrowNorthWest,\r\n            defaultPositions.southArrowNorthEast,\r\n            defaultPositions.viewportStickyNorth\r\n        ]\r\n    };\r\n}\r\nfunction isWidgetSelected(selection) {\r\n    const viewElement = selection.getSelectedElement();\r\n    return !!(viewElement && isWidget(viewElement));\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module widget/widgetresize/resizerstate\r\n */\r\nimport { ObservableMixin, Rect } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Stores the internal state of a single resizable object.\r\n */\r\nexport default class ResizeState extends ObservableMixin() {\r\n    /**\r\n     * @param options Resizer options.\r\n     */\r\n    constructor(options) {\r\n        super();\r\n        this.set('activeHandlePosition', null);\r\n        this.set('proposedWidthPercents', null);\r\n        this.set('proposedWidth', null);\r\n        this.set('proposedHeight', null);\r\n        this.set('proposedHandleHostWidth', null);\r\n        this.set('proposedHandleHostHeight', null);\r\n        this._options = options;\r\n        this._referenceCoordinates = null;\r\n    }\r\n    /**\r\n     * The original width (pixels) of the resized object when the resize process was started.\r\n     */\r\n    get originalWidth() {\r\n        return this._originalWidth;\r\n    }\r\n    /**\r\n     * The original height (pixels) of the resized object when the resize process was started.\r\n     */\r\n    get originalHeight() {\r\n        return this._originalHeight;\r\n    }\r\n    /**\r\n     * The original width (percents) of the resized object when the resize process was started.\r\n     */\r\n    get originalWidthPercents() {\r\n        return this._originalWidthPercents;\r\n    }\r\n    /**\r\n     * A width to height ratio of the resized image.\r\n     */\r\n    get aspectRatio() {\r\n        return this._aspectRatio;\r\n    }\r\n    /**\r\n     *\r\n     * @param domResizeHandle The handle used to calculate the reference point.\r\n     */\r\n    begin(domResizeHandle, domHandleHost, domResizeHost) {\r\n        const clientRect = new Rect(domHandleHost);\r\n        this.activeHandlePosition = getHandlePosition(domResizeHandle);\r\n        this._referenceCoordinates = getAbsoluteBoundaryPoint(domHandleHost, getOppositePosition(this.activeHandlePosition));\r\n        this._originalWidth = clientRect.width;\r\n        this._originalHeight = clientRect.height;\r\n        this._aspectRatio = clientRect.width / clientRect.height;\r\n        const widthStyle = domResizeHost.style.width;\r\n        if (widthStyle && widthStyle.match(/^\\d+(\\.\\d*)?%$/)) {\r\n            this._originalWidthPercents = parseFloat(widthStyle);\r\n        }\r\n        else {\r\n            this._originalWidthPercents = calculateHostPercentageWidth(domResizeHost, clientRect);\r\n        }\r\n    }\r\n    update(newSize) {\r\n        this.proposedWidth = newSize.width;\r\n        this.proposedHeight = newSize.height;\r\n        this.proposedWidthPercents = newSize.widthPercents;\r\n        this.proposedHandleHostWidth = newSize.handleHostWidth;\r\n        this.proposedHandleHostHeight = newSize.handleHostHeight;\r\n    }\r\n}\r\n/**\r\n * Calculates a relative width of a `domResizeHost` compared to its ancestor in percents.\r\n */\r\nfunction calculateHostPercentageWidth(domResizeHost, resizeHostRect) {\r\n    const domResizeHostParent = domResizeHost.parentElement;\r\n    // Need to use computed style as it properly excludes parent's paddings from the returned value.\r\n    let parentWidth = parseFloat(domResizeHostParent.ownerDocument.defaultView.getComputedStyle(domResizeHostParent).width);\r\n    // Sometimes parent width cannot be accessed. If that happens we should go up in the elements tree\r\n    // and try to get width from next ancestor.\r\n    // https://github.com/ckeditor/ckeditor5/issues/10776\r\n    const ancestorLevelLimit = 5;\r\n    let currentLevel = 0;\r\n    let checkedElement = domResizeHostParent;\r\n    while (isNaN(parentWidth)) {\r\n        checkedElement = checkedElement.parentElement;\r\n        if (++currentLevel > ancestorLevelLimit) {\r\n            return 0;\r\n        }\r\n        parentWidth = parseFloat(domResizeHostParent.ownerDocument.defaultView.getComputedStyle(checkedElement).width);\r\n    }\r\n    return resizeHostRect.width / parentWidth * 100;\r\n}\r\n/**\r\n * Returns coordinates of the top-left corner of an element, relative to the document's top-left corner.\r\n *\r\n * @param resizerPosition The position of the resize handle, e.g. `\"top-left\"`, `\"bottom-right\"`.\r\n */\r\nfunction getAbsoluteBoundaryPoint(element, resizerPosition) {\r\n    const elementRect = new Rect(element);\r\n    const positionParts = resizerPosition.split('-');\r\n    const ret = {\r\n        x: positionParts[1] == 'right' ? elementRect.right : elementRect.left,\r\n        y: positionParts[0] == 'bottom' ? elementRect.bottom : elementRect.top\r\n    };\r\n    ret.x += element.ownerDocument.defaultView.scrollX;\r\n    ret.y += element.ownerDocument.defaultView.scrollY;\r\n    return ret;\r\n}\r\n/**\r\n * @param resizerPosition The expected resizer position, like `\"top-left\"`, `\"bottom-right\"`.\r\n * @returns A prefixed HTML class name for the resizer element.\r\n */\r\nfunction getResizerHandleClass(resizerPosition) {\r\n    return `ck-widget__resizer__handle-${resizerPosition}`;\r\n}\r\n/**\r\n * Determines the position of a given resize handle.\r\n *\r\n * @param domHandle Handle used to calculate the reference point.\r\n * @returns Returns a string like `\"top-left\"` or `undefined` if not matched.\r\n */\r\nfunction getHandlePosition(domHandle) {\r\n    const resizerPositions = ['top-left', 'top-right', 'bottom-right', 'bottom-left'];\r\n    for (const position of resizerPositions) {\r\n        if (domHandle.classList.contains(getResizerHandleClass(position))) {\r\n            return position;\r\n        }\r\n    }\r\n}\r\n/**\r\n * @param position Like `\"top-left\"`.\r\n * @returns Inverted `position`, e.g. it returns `\"bottom-right\"` if `\"top-left\"` was given as `position`.\r\n */\r\nfunction getOppositePosition(position) {\r\n    const parts = position.split('-');\r\n    const replacements = {\r\n        top: 'bottom',\r\n        bottom: 'top',\r\n        left: 'right',\r\n        right: 'left'\r\n    };\r\n    return `${replacements[parts[0]]}-${replacements[parts[1]]}`;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module widget/widgetresize/sizeview\r\n */\r\nimport { View } from '@ckeditor/ckeditor5-ui';\r\n/**\r\n * A view displaying the proposed new element size during the resizing.\r\n */\r\nexport default class SizeView extends View {\r\n    constructor() {\r\n        super();\r\n        const bind = this.bindTemplate;\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-size-view',\r\n                    bind.to('_viewPosition', value => value ? `ck-orientation-${value}` : '')\r\n                ],\r\n                style: {\r\n                    display: bind.if('_isVisible', 'none', visible => !visible)\r\n                }\r\n            },\r\n            children: [{\r\n                    text: bind.to('_label')\r\n                }]\r\n        });\r\n    }\r\n    /**\r\n     * A method used for binding the `SizeView` instance properties to the `ResizeState` instance observable properties.\r\n     *\r\n     * @internal\r\n     * @param options An object defining the resizer options, used for setting the proper size label.\r\n     * @param resizeState The `ResizeState` class instance, used for keeping the `SizeView` state up to date.\r\n     */\r\n    _bindToState(options, resizeState) {\r\n        this.bind('_isVisible').to(resizeState, 'proposedWidth', resizeState, 'proposedHeight', (width, height) => width !== null && height !== null);\r\n        this.bind('_label').to(resizeState, 'proposedHandleHostWidth', resizeState, 'proposedHandleHostHeight', resizeState, 'proposedWidthPercents', (width, height, widthPercents) => {\r\n            if (options.unit === 'px') {\r\n                return `${width}×${height}`;\r\n            }\r\n            else {\r\n                return `${widthPercents}%`;\r\n            }\r\n        });\r\n        this.bind('_viewPosition').to(resizeState, 'activeHandlePosition', resizeState, 'proposedHandleHostWidth', resizeState, 'proposedHandleHostHeight', \r\n        // If the widget is too small to contain the size label, display the label above.\r\n        (position, width, height) => width < 50 || height < 50 ? 'above-center' : position);\r\n    }\r\n    /**\r\n     * A method used for cleaning up. It removes the bindings and hides the view.\r\n     *\r\n     * @internal\r\n     */\r\n    _dismiss() {\r\n        this.unbind();\r\n        this._isVisible = false;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module widget/widgetresize/resizer\r\n */\r\nimport { Template } from '@ckeditor/ckeditor5-ui';\r\nimport { Rect, ObservableMixin, compareArrays } from '@ckeditor/ckeditor5-utils';\r\nimport ResizeState from './resizerstate';\r\nimport SizeView from './sizeview';\r\n/**\r\n * Represents a resizer for a single resizable object.\r\n */\r\nexport default class Resizer extends ObservableMixin() {\r\n    /**\r\n     * @param options Resizer options.\r\n     */\r\n    constructor(options) {\r\n        super();\r\n        /**\r\n         * A wrapper that is controlled by the resizer. This is usually a widget element.\r\n         */\r\n        this._viewResizerWrapper = null;\r\n        this._options = options;\r\n        this.set('isEnabled', true);\r\n        this.set('isSelected', false);\r\n        this.bind('isVisible').to(this, 'isEnabled', this, 'isSelected', (isEnabled, isSelected) => isEnabled && isSelected);\r\n        this.decorate('begin');\r\n        this.decorate('cancel');\r\n        this.decorate('commit');\r\n        this.decorate('updateSize');\r\n        this.on('commit', event => {\r\n            // State might not be initialized yet. In this case, prevent further handling and make sure that the resizer is\r\n            // cleaned up (#5195).\r\n            if (!this.state.proposedWidth && !this.state.proposedWidthPercents) {\r\n                this._cleanup();\r\n                event.stop();\r\n            }\r\n        }, { priority: 'high' });\r\n    }\r\n    /**\r\n     * Stores the state of the resizable host geometry, such as the original width, the currently proposed height, etc.\r\n     *\r\n     * Note that a new state is created for each resize transaction.\r\n     */\r\n    get state() {\r\n        return this._state;\r\n    }\r\n    /**\r\n     * Makes resizer visible in the UI.\r\n     */\r\n    show() {\r\n        const editingView = this._options.editor.editing.view;\r\n        editingView.change(writer => {\r\n            writer.removeClass('ck-hidden', this._viewResizerWrapper);\r\n        });\r\n    }\r\n    /**\r\n     * Hides resizer in the UI.\r\n     */\r\n    hide() {\r\n        const editingView = this._options.editor.editing.view;\r\n        editingView.change(writer => {\r\n            writer.addClass('ck-hidden', this._viewResizerWrapper);\r\n        });\r\n    }\r\n    /**\r\n     * Attaches the resizer to the DOM.\r\n     */\r\n    attach() {\r\n        // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n        const that = this;\r\n        const widgetElement = this._options.viewElement;\r\n        const editingView = this._options.editor.editing.view;\r\n        editingView.change(writer => {\r\n            const viewResizerWrapper = writer.createUIElement('div', {\r\n                class: 'ck ck-reset_all ck-widget__resizer'\r\n            }, function (domDocument) {\r\n                const domElement = this.toDomElement(domDocument);\r\n                that._appendHandles(domElement);\r\n                that._appendSizeUI(domElement);\r\n                return domElement;\r\n            });\r\n            // Append the resizer wrapper to the widget's wrapper.\r\n            writer.insert(writer.createPositionAt(widgetElement, 'end'), viewResizerWrapper);\r\n            writer.addClass('ck-widget_with-resizer', widgetElement);\r\n            this._viewResizerWrapper = viewResizerWrapper;\r\n            if (!this.isVisible) {\r\n                this.hide();\r\n            }\r\n        });\r\n        this.on('change:isVisible', () => {\r\n            if (this.isVisible) {\r\n                this.show();\r\n                this.redraw();\r\n            }\r\n            else {\r\n                this.hide();\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Starts the resizing process.\r\n     *\r\n     * Creates a new {@link #state} for the current process.\r\n     *\r\n     * @fires begin\r\n     * @param domResizeHandle Clicked handle.\r\n     */\r\n    begin(domResizeHandle) {\r\n        this._state = new ResizeState(this._options);\r\n        this._sizeView._bindToState(this._options, this.state);\r\n        this._initialViewWidth = this._options.viewElement.getStyle('width');\r\n        this.state.begin(domResizeHandle, this._getHandleHost(), this._getResizeHost());\r\n    }\r\n    /**\r\n     * Updates the proposed size based on `domEventData`.\r\n     *\r\n     * @fires updateSize\r\n     */\r\n    updateSize(domEventData) {\r\n        const newSize = this._proposeNewSize(domEventData);\r\n        const editingView = this._options.editor.editing.view;\r\n        editingView.change(writer => {\r\n            const unit = this._options.unit || '%';\r\n            const newWidth = (unit === '%' ? newSize.widthPercents : newSize.width) + unit;\r\n            writer.setStyle('width', newWidth, this._options.viewElement);\r\n        });\r\n        // Get an actual image width, and:\r\n        // * reflect this size to the resize wrapper\r\n        // * apply this **real** size to the state\r\n        const domHandleHost = this._getHandleHost();\r\n        const domHandleHostRect = new Rect(domHandleHost);\r\n        const handleHostWidth = Math.round(domHandleHostRect.width);\r\n        const handleHostHeight = Math.round(domHandleHostRect.height);\r\n        // Handle max-width limitation.\r\n        const domResizeHostRect = new Rect(domHandleHost);\r\n        newSize.width = Math.round(domResizeHostRect.width);\r\n        newSize.height = Math.round(domResizeHostRect.height);\r\n        this.redraw(domHandleHostRect);\r\n        this.state.update({\r\n            ...newSize,\r\n            handleHostWidth,\r\n            handleHostHeight\r\n        });\r\n    }\r\n    /**\r\n     * Applies the geometry proposed with the resizer.\r\n     *\r\n     * @fires commit\r\n     */\r\n    commit() {\r\n        const unit = this._options.unit || '%';\r\n        const newValue = (unit === '%' ? this.state.proposedWidthPercents : this.state.proposedWidth) + unit;\r\n        // Both cleanup and onCommit callback are very likely to make view changes. Ensure that it is made in a single step.\r\n        this._options.editor.editing.view.change(() => {\r\n            this._cleanup();\r\n            this._options.onCommit(newValue);\r\n        });\r\n    }\r\n    /**\r\n     * Cancels and rejects the proposed resize dimensions, hiding the UI.\r\n     *\r\n     * @fires cancel\r\n     */\r\n    cancel() {\r\n        this._cleanup();\r\n    }\r\n    /**\r\n     * Destroys the resizer.\r\n     */\r\n    destroy() {\r\n        this.cancel();\r\n    }\r\n    /**\r\n     * Redraws the resizer.\r\n     *\r\n     * @param handleHostRect Handle host rectangle might be given to improve performance.\r\n     */\r\n    redraw(handleHostRect) {\r\n        const domWrapper = this._domResizerWrapper;\r\n        // Refresh only if resizer exists in the DOM.\r\n        if (!existsInDom(domWrapper)) {\r\n            return;\r\n        }\r\n        const widgetWrapper = domWrapper.parentElement;\r\n        const handleHost = this._getHandleHost();\r\n        const resizerWrapper = this._viewResizerWrapper;\r\n        const currentDimensions = [\r\n            resizerWrapper.getStyle('width'),\r\n            resizerWrapper.getStyle('height'),\r\n            resizerWrapper.getStyle('left'),\r\n            resizerWrapper.getStyle('top')\r\n        ];\r\n        let newDimensions;\r\n        if (widgetWrapper.isSameNode(handleHost)) {\r\n            const clientRect = handleHostRect || new Rect(handleHost);\r\n            newDimensions = [\r\n                clientRect.width + 'px',\r\n                clientRect.height + 'px',\r\n                undefined,\r\n                undefined\r\n            ];\r\n        }\r\n        // In case a resizing host is not a widget wrapper, we need to compensate\r\n        // for any additional offsets the resize host might have. E.g. wrapper padding\r\n        // or simply another editable. By doing that the border and resizers are shown\r\n        // only around the resize host.\r\n        else {\r\n            newDimensions = [\r\n                handleHost.offsetWidth + 'px',\r\n                handleHost.offsetHeight + 'px',\r\n                handleHost.offsetLeft + 'px',\r\n                handleHost.offsetTop + 'px'\r\n            ];\r\n        }\r\n        // Make changes to the view only if the resizer should actually get new dimensions.\r\n        // Otherwise, if View#change() was always called, this would cause EditorUI#update\r\n        // loops because the WidgetResize plugin listens to EditorUI#update and updates\r\n        // the resizer.\r\n        // https://github.com/ckeditor/ckeditor5/issues/7633\r\n        if (compareArrays(currentDimensions, newDimensions) !== 'same') {\r\n            this._options.editor.editing.view.change(writer => {\r\n                writer.setStyle({\r\n                    width: newDimensions[0],\r\n                    height: newDimensions[1],\r\n                    left: newDimensions[2],\r\n                    top: newDimensions[3]\r\n                }, resizerWrapper);\r\n            });\r\n        }\r\n    }\r\n    containsHandle(domElement) {\r\n        return this._domResizerWrapper.contains(domElement);\r\n    }\r\n    static isResizeHandle(domElement) {\r\n        return domElement.classList.contains('ck-widget__resizer__handle');\r\n    }\r\n    /**\r\n     * Cleans up the context state.\r\n     */\r\n    _cleanup() {\r\n        this._sizeView._dismiss();\r\n        const editingView = this._options.editor.editing.view;\r\n        editingView.change(writer => {\r\n            writer.setStyle('width', this._initialViewWidth, this._options.viewElement);\r\n        });\r\n    }\r\n    /**\r\n     * Calculates the proposed size as the resize handles are dragged.\r\n     *\r\n     * @param domEventData Event data that caused the size update request. It should be used to calculate the proposed size.\r\n     */\r\n    _proposeNewSize(domEventData) {\r\n        const state = this.state;\r\n        const currentCoordinates = extractCoordinates(domEventData);\r\n        const isCentered = this._options.isCentered ? this._options.isCentered(this) : true;\r\n        // Enlargement defines how much the resize host has changed in a given axis. Naturally it could be a negative number\r\n        // meaning that it has been shrunk.\r\n        //\r\n        // +----------------+--+\r\n        // |                |  |\r\n        // |       img      |  |\r\n        // |  /handle host  |  |\r\n        // +----------------+  | ^\r\n        // |                   | | - enlarge y\r\n        // +-------------------+ v\r\n        // \t\t\t\t\t<-->\r\n        // \t\t\t\t\t enlarge x\r\n        const enlargement = {\r\n            x: state._referenceCoordinates.x - (currentCoordinates.x + state.originalWidth),\r\n            y: (currentCoordinates.y - state.originalHeight) - state._referenceCoordinates.y\r\n        };\r\n        if (isCentered && state.activeHandlePosition.endsWith('-right')) {\r\n            enlargement.x = currentCoordinates.x - (state._referenceCoordinates.x + state.originalWidth);\r\n        }\r\n        // Objects needs to be resized twice as much in horizontal axis if centered, since enlargement is counted from\r\n        // one resized corner to your cursor. It needs to be duplicated to compensate for the other side too.\r\n        if (isCentered) {\r\n            enlargement.x *= 2;\r\n        }\r\n        // const resizeHost = this._getResizeHost();\r\n        // The size proposed by the user. It does not consider the aspect ratio.\r\n        let width = Math.abs(state.originalWidth + enlargement.x);\r\n        let height = Math.abs(state.originalHeight + enlargement.y);\r\n        // Dominant determination must take the ratio into account.\r\n        const dominant = width / state.aspectRatio > height ? 'width' : 'height';\r\n        if (dominant == 'width') {\r\n            height = width / state.aspectRatio;\r\n        }\r\n        else {\r\n            width = height * state.aspectRatio;\r\n        }\r\n        return {\r\n            width: Math.round(width),\r\n            height: Math.round(height),\r\n            widthPercents: Math.min(Math.round(state.originalWidthPercents / state.originalWidth * width * 100) / 100, 100)\r\n        };\r\n    }\r\n    /**\r\n     * Obtains the resize host.\r\n     *\r\n     * Resize host is an object that receives dimensions which are the result of resizing.\r\n     */\r\n    _getResizeHost() {\r\n        const widgetWrapper = this._domResizerWrapper.parentElement;\r\n        return this._options.getResizeHost(widgetWrapper);\r\n    }\r\n    /**\r\n     * Obtains the handle host.\r\n     *\r\n     * Handle host is an object that the handles are aligned to.\r\n     *\r\n     * Handle host will not always be an entire widget itself. Take an image as an example. The image widget\r\n     * contains an image and a caption. Only the image should be surrounded with handles.\r\n     */\r\n    _getHandleHost() {\r\n        const widgetWrapper = this._domResizerWrapper.parentElement;\r\n        return this._options.getHandleHost(widgetWrapper);\r\n    }\r\n    /**\r\n     * DOM container of the entire resize UI.\r\n     *\r\n     * Note that this property will have a value only after the element bound with the resizer is rendered\r\n     * (otherwise `null`).\r\n     */\r\n    get _domResizerWrapper() {\r\n        return this._options.editor.editing.view.domConverter.mapViewToDom(this._viewResizerWrapper);\r\n    }\r\n    /**\r\n     * Renders the resize handles in the DOM.\r\n     *\r\n     * @param domElement The resizer wrapper.\r\n     */\r\n    _appendHandles(domElement) {\r\n        const resizerPositions = ['top-left', 'top-right', 'bottom-right', 'bottom-left'];\r\n        for (const currentPosition of resizerPositions) {\r\n            domElement.appendChild((new Template({\r\n                tag: 'div',\r\n                attributes: {\r\n                    class: `ck-widget__resizer__handle ${getResizerClass(currentPosition)}`\r\n                }\r\n            }).render()));\r\n        }\r\n    }\r\n    /**\r\n     * Sets up the {@link #_sizeView} property and adds it to the passed `domElement`.\r\n     */\r\n    _appendSizeUI(domElement) {\r\n        this._sizeView = new SizeView();\r\n        // Make sure icon#element is rendered before passing to appendChild().\r\n        this._sizeView.render();\r\n        domElement.appendChild(this._sizeView.element);\r\n    }\r\n}\r\n/**\r\n * @param resizerPosition Expected resizer position like `\"top-left\"`, `\"bottom-right\"`.\r\n * @returns A prefixed HTML class name for the resizer element\r\n */\r\nfunction getResizerClass(resizerPosition) {\r\n    return `ck-widget__resizer__handle-${resizerPosition}`;\r\n}\r\nfunction extractCoordinates(event) {\r\n    return {\r\n        x: event.pageX,\r\n        y: event.pageY\r\n    };\r\n}\r\nfunction existsInDom(element) {\r\n    return element && element.ownerDocument && element.ownerDocument.contains(element);\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./widgetresize.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module widget/widgetresize\r\n */\r\nimport Resizer from './widgetresize/resizer';\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\nimport { MouseObserver } from '@ckeditor/ckeditor5-engine';\r\nimport { DomEmitterMixin, global } from '@ckeditor/ckeditor5-utils';\r\nimport { throttle } from 'lodash-es';\r\nimport '../theme/widgetresize.css';\r\n/**\r\n * The widget resize feature plugin.\r\n *\r\n * Use the {@link module:widget/widgetresize~WidgetResize#attachTo} method to create a resizer for the specified widget.\r\n */\r\nexport default class WidgetResize extends Plugin {\r\n    constructor() {\r\n        super(...arguments);\r\n        /**\r\n         * A map of resizers created using this plugin instance.\r\n         */\r\n        this._resizers = new Map();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'WidgetResize';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editing = this.editor.editing;\r\n        const domDocument = global.window.document;\r\n        this.set('selectedResizer', null);\r\n        this.set('_activeResizer', null);\r\n        editing.view.addObserver(MouseObserver);\r\n        this._observer = new (DomEmitterMixin())();\r\n        this.listenTo(editing.view.document, 'mousedown', this._mouseDownListener.bind(this), { priority: 'high' });\r\n        this._observer.listenTo(domDocument, 'mousemove', this._mouseMoveListener.bind(this));\r\n        this._observer.listenTo(domDocument, 'mouseup', this._mouseUpListener.bind(this));\r\n        this._redrawSelectedResizerThrottled = throttle(() => this.redrawSelectedResizer(), 200);\r\n        // Redrawing on any change of the UI of the editor (including content changes).\r\n        this.editor.ui.on('update', this._redrawSelectedResizerThrottled);\r\n        // Remove view widget-resizer mappings for widgets that have been removed from the document.\r\n        // https://github.com/ckeditor/ckeditor5/issues/10156\r\n        // https://github.com/ckeditor/ckeditor5/issues/10266\r\n        this.editor.model.document.on('change', () => {\r\n            for (const [viewElement, resizer] of this._resizers) {\r\n                if (!viewElement.isAttached()) {\r\n                    this._resizers.delete(viewElement);\r\n                    resizer.destroy();\r\n                }\r\n            }\r\n        }, { priority: 'lowest' });\r\n        // Resizers need to be redrawn upon window resize, because new window might shrink resize host.\r\n        this._observer.listenTo(global.window, 'resize', this._redrawSelectedResizerThrottled);\r\n        const viewSelection = this.editor.editing.view.document.selection;\r\n        viewSelection.on('change', () => {\r\n            const selectedElement = viewSelection.getSelectedElement();\r\n            const resizer = this.getResizerByViewElement(selectedElement) || null;\r\n            if (resizer) {\r\n                this.select(resizer);\r\n            }\r\n            else {\r\n                this.deselect();\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Redraws the selected resizer if there is any selected resizer and if it is visible.\r\n     */\r\n    redrawSelectedResizer() {\r\n        if (this.selectedResizer && this.selectedResizer.isVisible) {\r\n            this.selectedResizer.redraw();\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        this._observer.stopListening();\r\n        for (const resizer of this._resizers.values()) {\r\n            resizer.destroy();\r\n        }\r\n        this._redrawSelectedResizerThrottled.cancel();\r\n    }\r\n    /**\r\n     * Marks resizer as selected.\r\n     */\r\n    select(resizer) {\r\n        this.deselect();\r\n        this.selectedResizer = resizer;\r\n        this.selectedResizer.isSelected = true;\r\n    }\r\n    /**\r\n     * Deselects currently set resizer.\r\n     */\r\n    deselect() {\r\n        if (this.selectedResizer) {\r\n            this.selectedResizer.isSelected = false;\r\n        }\r\n        this.selectedResizer = null;\r\n    }\r\n    /**\r\n     * @param options Resizer options.\r\n     */\r\n    attachTo(options) {\r\n        const resizer = new Resizer(options);\r\n        const plugins = this.editor.plugins;\r\n        resizer.attach();\r\n        if (plugins.has('WidgetToolbarRepository')) {\r\n            // Hiding widget toolbar to improve the performance\r\n            // (https://github.com/ckeditor/ckeditor5-widget/pull/112#issuecomment-564528765).\r\n            const widgetToolbarRepository = plugins.get('WidgetToolbarRepository');\r\n            resizer.on('begin', () => {\r\n                widgetToolbarRepository.forceDisabled('resize');\r\n            }, { priority: 'lowest' });\r\n            resizer.on('cancel', () => {\r\n                widgetToolbarRepository.clearForceDisabled('resize');\r\n            }, { priority: 'highest' });\r\n            resizer.on('commit', () => {\r\n                widgetToolbarRepository.clearForceDisabled('resize');\r\n            }, { priority: 'highest' });\r\n        }\r\n        this._resizers.set(options.viewElement, resizer);\r\n        const viewSelection = this.editor.editing.view.document.selection;\r\n        const selectedElement = viewSelection.getSelectedElement();\r\n        // If the element the resizer is created for is currently focused, it should become visible.\r\n        if (this.getResizerByViewElement(selectedElement) == resizer) {\r\n            this.select(resizer);\r\n        }\r\n        return resizer;\r\n    }\r\n    /**\r\n     * Returns a resizer created for a given view element (widget element).\r\n     *\r\n     * @param viewElement View element associated with the resizer.\r\n     */\r\n    getResizerByViewElement(viewElement) {\r\n        return this._resizers.get(viewElement);\r\n    }\r\n    /**\r\n     * Returns a resizer that contains a given resize handle.\r\n     */\r\n    _getResizerByHandle(domResizeHandle) {\r\n        for (const resizer of this._resizers.values()) {\r\n            if (resizer.containsHandle(domResizeHandle)) {\r\n                return resizer;\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * @param domEventData Native DOM event.\r\n     */\r\n    _mouseDownListener(event, domEventData) {\r\n        const resizeHandle = domEventData.domTarget;\r\n        if (!Resizer.isResizeHandle(resizeHandle)) {\r\n            return;\r\n        }\r\n        this._activeResizer = this._getResizerByHandle(resizeHandle) || null;\r\n        if (this._activeResizer) {\r\n            this._activeResizer.begin(resizeHandle);\r\n            // Do not call other events when resizing. See: #6755.\r\n            event.stop();\r\n            domEventData.preventDefault();\r\n        }\r\n    }\r\n    /**\r\n     * @param domEventData Native DOM event.\r\n     */\r\n    _mouseMoveListener(event, domEventData) {\r\n        if (this._activeResizer) {\r\n            this._activeResizer.updateSize(domEventData);\r\n        }\r\n    }\r\n    _mouseUpListener() {\r\n        if (this._activeResizer) {\r\n            this._activeResizer.commit();\r\n            this._activeResizer = null;\r\n        }\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./clipboard.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module clipboard/dragdrop\r\n */\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\nimport { LiveRange, MouseObserver } from '@ckeditor/ckeditor5-engine';\r\nimport { Widget, isWidget } from '@ckeditor/ckeditor5-widget';\r\nimport { env, uid, delay } from '@ckeditor/ckeditor5-utils';\r\nimport ClipboardPipeline from './clipboardpipeline';\r\nimport ClipboardObserver from './clipboardobserver';\r\nimport { throttle } from 'lodash-es';\r\nimport '../theme/clipboard.css';\r\n// Drag and drop events overview:\r\n//\r\n//                ┌──────────────────┐\r\n//                │     mousedown    │   Sets the draggable attribute.\r\n//                └─────────┬────────┘\r\n//                          │\r\n//                          └─────────────────────┐\r\n//                          │                     │\r\n//                          │           ┌─────────V────────┐\r\n//                          │           │      mouseup     │   Dragging did not start, removes the draggable attribute.\r\n//                          │           └──────────────────┘\r\n//                          │\r\n//                ┌─────────V────────┐   Retrieves the selected model.DocumentFragment\r\n//                │     dragstart    │   and converts it to view.DocumentFragment.\r\n//                └─────────┬────────┘\r\n//                          │\r\n//                ┌─────────V────────┐   Processes view.DocumentFragment to text/html and text/plain\r\n//                │  clipboardOutput │   and stores the results in data.dataTransfer.\r\n//                └─────────┬────────┘\r\n//                          │\r\n//                          │   DOM dragover\r\n//                          ┌────────────┐\r\n//                          │            │\r\n//                ┌─────────V────────┐   │\r\n//                │     dragging     │   │   Updates the drop target marker.\r\n//                └─────────┬────────┘   │\r\n//                          │            │\r\n//            ┌─────────────└────────────┘\r\n//            │             │            │\r\n//            │   ┌─────────V────────┐   │\r\n//            │   │     dragleave    │   │   Removes the drop target marker.\r\n//            │   └─────────┬────────┘   │\r\n//            │             │            │\r\n//        ┌───│─────────────┘            │\r\n//        │   │             │            │\r\n//        │   │   ┌─────────V────────┐   │\r\n//        │   │   │     dragenter    │   │   Focuses the editor view.\r\n//        │   │   └─────────┬────────┘   │\r\n//        │   │             │            │\r\n//        │   │             └────────────┘\r\n//        │   │\r\n//        │   └─────────────┐\r\n//        │   │             │\r\n//        │   │   ┌─────────V────────┐\r\n//        └───┐   │       drop       │   (The default handler of the clipboard pipeline).\r\n//            │   └─────────┬────────┘\r\n//            │             │\r\n//            │   ┌─────────V────────┐   Resolves the final data.targetRanges.\r\n//            │   │  clipboardInput  │   Aborts if dropping on dragged content.\r\n//            │   └─────────┬────────┘\r\n//            │             │\r\n//            │   ┌─────────V────────┐\r\n//            │   │  clipboardInput  │   (The default handler of the clipboard pipeline).\r\n//            │   └─────────┬────────┘\r\n//            │             │\r\n//            │ ┌───────────V───────────┐\r\n//            │ │  inputTransformation  │   (The default handler of the clipboard pipeline).\r\n//            │ └───────────┬───────────┘\r\n//            │             │\r\n//            │  ┌──────────V──────────┐\r\n//            │  │   contentInsertion  │   Updates the document selection to drop range.\r\n//            │  └──────────┬──────────┘\r\n//            │             │\r\n//            │  ┌──────────V──────────┐\r\n//            │  │   contentInsertion  │   (The default handler of the clipboard pipeline).\r\n//            │  └──────────┬──────────┘\r\n//            │             │\r\n//            │  ┌──────────V──────────┐\r\n//            │  │   contentInsertion  │   Removes the content from the original range if the insertion was successful.\r\n//            │  └──────────┬──────────┘\r\n//            │             │\r\n//            └─────────────┐\r\n//                          │\r\n//                ┌─────────V────────┐\r\n//                │      dragend     │   Removes the drop marker and cleans the state.\r\n//                └──────────────────┘\r\n//\r\n/**\r\n * The drag and drop feature. It works on top of the {@link module:clipboard/clipboardpipeline~ClipboardPipeline}.\r\n *\r\n * Read more about the clipboard integration in the {@glink framework/deep-dive/clipboard clipboard deep-dive} guide.\r\n */\r\nexport default class DragDrop extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'DragDrop';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ClipboardPipeline, Widget];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const view = editor.editing.view;\r\n        this._draggedRange = null;\r\n        this._draggingUid = '';\r\n        this._draggableElement = null;\r\n        this._updateDropMarkerThrottled = throttle(targetRange => this._updateDropMarker(targetRange), 40);\r\n        this._removeDropMarkerDelayed = delay(() => this._removeDropMarker(), 40);\r\n        this._clearDraggableAttributesDelayed = delay(() => this._clearDraggableAttributes(), 40);\r\n        if (editor.plugins.has('DragDropExperimental')) {\r\n            this.forceDisabled('DragDropExperimental');\r\n            return;\r\n        }\r\n        view.addObserver(ClipboardObserver);\r\n        view.addObserver(MouseObserver);\r\n        this._setupDragging();\r\n        this._setupContentInsertionIntegration();\r\n        this._setupClipboardInputIntegration();\r\n        this._setupDropMarker();\r\n        this._setupDraggableAttributeHandling();\r\n        this.listenTo(editor, 'change:isReadOnly', (evt, name, isReadOnly) => {\r\n            if (isReadOnly) {\r\n                this.forceDisabled('readOnlyMode');\r\n            }\r\n            else {\r\n                this.clearForceDisabled('readOnlyMode');\r\n            }\r\n        });\r\n        this.on('change:isEnabled', (evt, name, isEnabled) => {\r\n            if (!isEnabled) {\r\n                this._finalizeDragging(false);\r\n            }\r\n        });\r\n        if (env.isAndroid) {\r\n            this.forceDisabled('noAndroidSupport');\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        if (this._draggedRange) {\r\n            this._draggedRange.detach();\r\n            this._draggedRange = null;\r\n        }\r\n        this._updateDropMarkerThrottled.cancel();\r\n        this._removeDropMarkerDelayed.cancel();\r\n        this._clearDraggableAttributesDelayed.cancel();\r\n        return super.destroy();\r\n    }\r\n    /**\r\n     * Drag and drop events handling.\r\n     */\r\n    _setupDragging() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const modelDocument = model.document;\r\n        const view = editor.editing.view;\r\n        const viewDocument = view.document;\r\n        // The handler for the drag start; it is responsible for setting data transfer object.\r\n        this.listenTo(viewDocument, 'dragstart', (evt, data) => {\r\n            const selection = modelDocument.selection;\r\n            // Don't drag the editable element itself.\r\n            if (data.target && data.target.is('editableElement')) {\r\n                data.preventDefault();\r\n                return;\r\n            }\r\n            // TODO we could clone this node somewhere and style it to match editing view but without handles,\r\n            //  selection outline, WTA buttons, etc.\r\n            // data.dataTransfer._native.setDragImage( data.domTarget, 0, 0 );\r\n            // Check if this is dragstart over the widget (but not a nested editable).\r\n            const draggableWidget = data.target ? findDraggableWidget(data.target) : null;\r\n            if (draggableWidget) {\r\n                const modelElement = editor.editing.mapper.toModelElement(draggableWidget);\r\n                this._draggedRange = LiveRange.fromRange(model.createRangeOn(modelElement));\r\n                // Disable toolbars so they won't obscure the drop area.\r\n                if (editor.plugins.has('WidgetToolbarRepository')) {\r\n                    const widgetToolbarRepository = editor.plugins.get('WidgetToolbarRepository');\r\n                    widgetToolbarRepository.forceDisabled('dragDrop');\r\n                }\r\n            }\r\n            // If this was not a widget we should check if we need to drag some text content.\r\n            else if (!viewDocument.selection.isCollapsed) {\r\n                const selectedElement = viewDocument.selection.getSelectedElement();\r\n                if (!selectedElement || !isWidget(selectedElement)) {\r\n                    this._draggedRange = LiveRange.fromRange(selection.getFirstRange());\r\n                }\r\n            }\r\n            if (!this._draggedRange) {\r\n                data.preventDefault();\r\n                return;\r\n            }\r\n            this._draggingUid = uid();\r\n            const canEditAtDraggedRange = this.isEnabled && editor.model.canEditAt(this._draggedRange);\r\n            data.dataTransfer.effectAllowed = canEditAtDraggedRange ? 'copyMove' : 'copy';\r\n            data.dataTransfer.setData('application/ckeditor5-dragging-uid', this._draggingUid);\r\n            const draggedSelection = model.createSelection(this._draggedRange.toRange());\r\n            const content = editor.data.toView(model.getSelectedContent(draggedSelection));\r\n            viewDocument.fire('clipboardOutput', {\r\n                dataTransfer: data.dataTransfer,\r\n                content,\r\n                method: 'dragstart'\r\n            });\r\n            if (!canEditAtDraggedRange) {\r\n                this._draggedRange.detach();\r\n                this._draggedRange = null;\r\n                this._draggingUid = '';\r\n            }\r\n        }, { priority: 'low' });\r\n        // The handler for finalizing drag and drop. It should always be triggered after dragging completes\r\n        // even if it was completed in a different application.\r\n        // Note: This is not fired if source text node got removed while downcasting a marker.\r\n        this.listenTo(viewDocument, 'dragend', (evt, data) => {\r\n            this._finalizeDragging(!data.dataTransfer.isCanceled && data.dataTransfer.dropEffect == 'move');\r\n        }, { priority: 'low' });\r\n        // Dragging over the editable.\r\n        this.listenTo(viewDocument, 'dragenter', () => {\r\n            if (!this.isEnabled) {\r\n                return;\r\n            }\r\n            view.focus();\r\n        });\r\n        // Dragging out of the editable.\r\n        this.listenTo(viewDocument, 'dragleave', () => {\r\n            // We do not know if the mouse left the editor or just some element in it, so let us wait a few milliseconds\r\n            // to check if 'dragover' is not fired.\r\n            this._removeDropMarkerDelayed();\r\n        });\r\n        // Handler for moving dragged content over the target area.\r\n        this.listenTo(viewDocument, 'dragging', (evt, data) => {\r\n            if (!this.isEnabled) {\r\n                data.dataTransfer.dropEffect = 'none';\r\n                return;\r\n            }\r\n            this._removeDropMarkerDelayed.cancel();\r\n            const targetRange = findDropTargetRange(editor, data.targetRanges, data.target);\r\n            // Do not drop if target place is not editable.\r\n            if (!editor.model.canEditAt(targetRange)) {\r\n                data.dataTransfer.dropEffect = 'none';\r\n                return;\r\n            }\r\n            // If this is content being dragged from another editor, moving out of current editor instance\r\n            // is not possible until 'dragend' event case will be fixed.\r\n            if (!this._draggedRange) {\r\n                data.dataTransfer.dropEffect = 'copy';\r\n            }\r\n            // In Firefox it is already set and effect allowed remains the same as originally set.\r\n            if (!env.isGecko) {\r\n                if (data.dataTransfer.effectAllowed == 'copy') {\r\n                    data.dataTransfer.dropEffect = 'copy';\r\n                }\r\n                else if (['all', 'copyMove'].includes(data.dataTransfer.effectAllowed)) {\r\n                    data.dataTransfer.dropEffect = 'move';\r\n                }\r\n            }\r\n            /* istanbul ignore else -- @preserve */\r\n            if (targetRange) {\r\n                this._updateDropMarkerThrottled(targetRange);\r\n            }\r\n        }, { priority: 'low' });\r\n    }\r\n    /**\r\n     * Integration with the `clipboardInput` event.\r\n     */\r\n    _setupClipboardInputIntegration() {\r\n        const editor = this.editor;\r\n        const view = editor.editing.view;\r\n        const viewDocument = view.document;\r\n        // Update the event target ranges and abort dropping if dropping over itself.\r\n        this.listenTo(viewDocument, 'clipboardInput', (evt, data) => {\r\n            if (data.method != 'drop') {\r\n                return;\r\n            }\r\n            const targetRange = findDropTargetRange(editor, data.targetRanges, data.target);\r\n            // The dragging markers must be removed after searching for the target range because sometimes\r\n            // the target lands on the marker itself.\r\n            this._removeDropMarker();\r\n            /* istanbul ignore if -- @preserve */\r\n            if (!targetRange || !editor.model.canEditAt(targetRange)) {\r\n                this._finalizeDragging(false);\r\n                evt.stop();\r\n                return;\r\n            }\r\n            // Since we cannot rely on the drag end event, we must check if the local drag range is from the current drag and drop\r\n            // or it is from some previous not cleared one.\r\n            if (this._draggedRange && this._draggingUid != data.dataTransfer.getData('application/ckeditor5-dragging-uid')) {\r\n                this._draggedRange.detach();\r\n                this._draggedRange = null;\r\n                this._draggingUid = '';\r\n            }\r\n            // Do not do anything if some content was dragged within the same document to the same position.\r\n            const isMove = getFinalDropEffect(data.dataTransfer) == 'move';\r\n            if (isMove && this._draggedRange && this._draggedRange.containsRange(targetRange, true)) {\r\n                this._finalizeDragging(false);\r\n                evt.stop();\r\n                return;\r\n            }\r\n            // Override the target ranges with the one adjusted to the best one for a drop.\r\n            data.targetRanges = [editor.editing.mapper.toViewRange(targetRange)];\r\n        }, { priority: 'high' });\r\n    }\r\n    /**\r\n     * Integration with the `contentInsertion` event of the clipboard pipeline.\r\n     */\r\n    _setupContentInsertionIntegration() {\r\n        const clipboardPipeline = this.editor.plugins.get(ClipboardPipeline);\r\n        clipboardPipeline.on('contentInsertion', (evt, data) => {\r\n            if (!this.isEnabled || data.method !== 'drop') {\r\n                return;\r\n            }\r\n            // Update the selection to the target range in the same change block to avoid selection post-fixing\r\n            // and to be able to clone text attributes for plain text dropping.\r\n            const ranges = data.targetRanges.map(viewRange => this.editor.editing.mapper.toModelRange(viewRange));\r\n            this.editor.model.change(writer => writer.setSelection(ranges));\r\n        }, { priority: 'high' });\r\n        clipboardPipeline.on('contentInsertion', (evt, data) => {\r\n            if (!this.isEnabled || data.method !== 'drop') {\r\n                return;\r\n            }\r\n            // Remove dragged range content, remove markers, clean after dragging.\r\n            const isMove = getFinalDropEffect(data.dataTransfer) == 'move';\r\n            // Whether any content was inserted (insertion might fail if the schema is disallowing some elements\r\n            // (for example an image caption allows only the content of a block but not blocks themselves.\r\n            // Some integrations might not return valid range (i.e., table pasting).\r\n            const isSuccess = !data.resultRange || !data.resultRange.isCollapsed;\r\n            this._finalizeDragging(isSuccess && isMove);\r\n        }, { priority: 'lowest' });\r\n    }\r\n    /**\r\n     * Adds listeners that add the `draggable` attribute to the elements while the mouse button is down so the dragging could start.\r\n     */\r\n    _setupDraggableAttributeHandling() {\r\n        const editor = this.editor;\r\n        const view = editor.editing.view;\r\n        const viewDocument = view.document;\r\n        // Add the 'draggable' attribute to the widget while pressing the selection handle.\r\n        // This is required for widgets to be draggable. In Chrome it will enable dragging text nodes.\r\n        this.listenTo(viewDocument, 'mousedown', (evt, data) => {\r\n            // The lack of data can be caused by editor tests firing fake mouse events. This should not occur\r\n            // in real-life scenarios but this greatly simplifies editor tests that would otherwise fail a lot.\r\n            if (env.isAndroid || !data) {\r\n                return;\r\n            }\r\n            this._clearDraggableAttributesDelayed.cancel();\r\n            // Check if this is a mousedown over the widget (but not a nested editable).\r\n            let draggableElement = findDraggableWidget(data.target);\r\n            // Note: There is a limitation that if more than a widget is selected (a widget and some text)\r\n            // and dragging starts on the widget, then only the widget is dragged.\r\n            // If this was not a widget then we should check if we need to drag some text content.\r\n            // In Chrome set a 'draggable' attribute on closest editable to allow immediate dragging of the selected text range.\r\n            // In Firefox this is not needed. In Safari it makes the whole editable draggable (not just textual content).\r\n            // Disabled in read-only mode because draggable=\"true\" + contenteditable=\"false\" results\r\n            // in not firing selectionchange event ever, which makes the selection stuck in read-only mode.\r\n            if (env.isBlink && !draggableElement && !viewDocument.selection.isCollapsed) {\r\n                const selectedElement = viewDocument.selection.getSelectedElement();\r\n                if (!selectedElement || !isWidget(selectedElement)) {\r\n                    const editableElement = viewDocument.selection.editableElement;\r\n                    if (editableElement && !editableElement.isReadOnly) {\r\n                        draggableElement = editableElement;\r\n                    }\r\n                }\r\n            }\r\n            if (draggableElement) {\r\n                view.change(writer => {\r\n                    writer.setAttribute('draggable', 'true', draggableElement);\r\n                });\r\n                // Keep the reference to the model element in case the view element gets removed while dragging.\r\n                this._draggableElement = editor.editing.mapper.toModelElement(draggableElement);\r\n            }\r\n        });\r\n        // Remove the draggable attribute in case no dragging started (only mousedown + mouseup).\r\n        this.listenTo(viewDocument, 'mouseup', () => {\r\n            if (!env.isAndroid) {\r\n                this._clearDraggableAttributesDelayed();\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Removes the `draggable` attribute from the element that was used for dragging.\r\n     */\r\n    _clearDraggableAttributes() {\r\n        const editing = this.editor.editing;\r\n        editing.view.change(writer => {\r\n            // Remove 'draggable' attribute.\r\n            if (this._draggableElement && this._draggableElement.root.rootName != '$graveyard') {\r\n                writer.removeAttribute('draggable', editing.mapper.toViewElement(this._draggableElement));\r\n            }\r\n            this._draggableElement = null;\r\n        });\r\n    }\r\n    /**\r\n     * Creates downcast conversion for the drop target marker.\r\n     */\r\n    _setupDropMarker() {\r\n        const editor = this.editor;\r\n        // Drop marker conversion for hovering over widgets.\r\n        editor.conversion.for('editingDowncast').markerToHighlight({\r\n            model: 'drop-target',\r\n            view: {\r\n                classes: ['ck-clipboard-drop-target-range']\r\n            }\r\n        });\r\n        // Drop marker conversion for in text drop target.\r\n        editor.conversion.for('editingDowncast').markerToElement({\r\n            model: 'drop-target',\r\n            view: (data, { writer }) => {\r\n                const inText = editor.model.schema.checkChild(data.markerRange.start, '$text');\r\n                if (!inText) {\r\n                    return;\r\n                }\r\n                return writer.createUIElement('span', { class: 'ck ck-clipboard-drop-target-position' }, function (domDocument) {\r\n                    const domElement = this.toDomElement(domDocument);\r\n                    // Using word joiner to make this marker as high as text and also making text not break on marker.\r\n                    domElement.append('\\u2060', domDocument.createElement('span'), '\\u2060');\r\n                    return domElement;\r\n                });\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Updates the drop target marker to the provided range.\r\n     *\r\n     * @param targetRange The range to set the marker to.\r\n     */\r\n    _updateDropMarker(targetRange) {\r\n        const editor = this.editor;\r\n        const markers = editor.model.markers;\r\n        editor.model.change(writer => {\r\n            if (markers.has('drop-target')) {\r\n                if (!markers.get('drop-target').getRange().isEqual(targetRange)) {\r\n                    writer.updateMarker('drop-target', { range: targetRange });\r\n                }\r\n            }\r\n            else {\r\n                writer.addMarker('drop-target', {\r\n                    range: targetRange,\r\n                    usingOperation: false,\r\n                    affectsData: false\r\n                });\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Removes the drop target marker.\r\n     */\r\n    _removeDropMarker() {\r\n        const model = this.editor.model;\r\n        this._removeDropMarkerDelayed.cancel();\r\n        this._updateDropMarkerThrottled.cancel();\r\n        if (model.markers.has('drop-target')) {\r\n            model.change(writer => {\r\n                writer.removeMarker('drop-target');\r\n            });\r\n        }\r\n    }\r\n    /**\r\n     * Deletes the dragged content from its original range and clears the dragging state.\r\n     *\r\n     * @param moved Whether the move succeeded.\r\n     */\r\n    _finalizeDragging(moved) {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        this._removeDropMarker();\r\n        this._clearDraggableAttributes();\r\n        if (editor.plugins.has('WidgetToolbarRepository')) {\r\n            const widgetToolbarRepository = editor.plugins.get('WidgetToolbarRepository');\r\n            widgetToolbarRepository.clearForceDisabled('dragDrop');\r\n        }\r\n        this._draggingUid = '';\r\n        if (!this._draggedRange) {\r\n            return;\r\n        }\r\n        // Delete moved content.\r\n        if (moved && this.isEnabled) {\r\n            model.deleteContent(model.createSelection(this._draggedRange), { doNotAutoparagraph: true });\r\n        }\r\n        this._draggedRange.detach();\r\n        this._draggedRange = null;\r\n    }\r\n}\r\n/**\r\n * Returns fixed selection range for given position and target element.\r\n */\r\nfunction findDropTargetRange(editor, targetViewRanges, targetViewElement) {\r\n    const model = editor.model;\r\n    const mapper = editor.editing.mapper;\r\n    let range = null;\r\n    const targetViewPosition = targetViewRanges ? targetViewRanges[0].start : null;\r\n    // A UIElement is not a valid drop element, use parent (this could be a drop marker or any other UIElement).\r\n    if (targetViewElement.is('uiElement')) {\r\n        targetViewElement = targetViewElement.parent;\r\n    }\r\n    // Quick win if the target is a widget (but not a nested editable).\r\n    range = findDropTargetRangeOnWidget(editor, targetViewElement);\r\n    if (range) {\r\n        return range;\r\n    }\r\n    // The easiest part is over, now we need to move to the model space.\r\n    // Find target model element and position.\r\n    const targetModelElement = getClosestMappedModelElement(editor, targetViewElement);\r\n    const targetModelPosition = targetViewPosition ? mapper.toModelPosition(targetViewPosition) : null;\r\n    // There is no target position while hovering over an empty table cell.\r\n    // In Safari, target position can be empty while hovering over a widget (e.g., a page-break).\r\n    // Find the drop position inside the element.\r\n    if (!targetModelPosition) {\r\n        return findDropTargetRangeInElement(editor, targetModelElement);\r\n    }\r\n    // Check if target position is between blocks and adjust drop position to the next object.\r\n    // This is because while hovering over a root element next to a widget the target position can jump in crazy places.\r\n    range = findDropTargetRangeBetweenBlocks(editor, targetModelPosition, targetModelElement);\r\n    if (range) {\r\n        return range;\r\n    }\r\n    // Try fixing selection position.\r\n    // In Firefox, the target position lands before widgets but in other browsers it tends to land after a widget.\r\n    range = model.schema.getNearestSelectionRange(targetModelPosition, env.isGecko ? 'forward' : 'backward');\r\n    if (range) {\r\n        return range;\r\n    }\r\n    // There is no valid selection position inside the current limit element so find a closest object ancestor.\r\n    // This happens if the model position lands directly in the <table> element itself (view target element was a `<td>`\r\n    // so a nested editable, but view target position was directly in the `<figure>` element).\r\n    return findDropTargetRangeOnAncestorObject(editor, targetModelPosition.parent);\r\n}\r\n/**\r\n * Returns fixed selection range for a given position and a target element if it is over the widget but not over its nested editable.\r\n */\r\nfunction findDropTargetRangeOnWidget(editor, targetViewElement) {\r\n    const model = editor.model;\r\n    const mapper = editor.editing.mapper;\r\n    // Quick win if the target is a widget.\r\n    if (isWidget(targetViewElement)) {\r\n        return model.createRangeOn(mapper.toModelElement(targetViewElement));\r\n    }\r\n    // Check if we are deeper over a widget (but not over a nested editable).\r\n    if (!targetViewElement.is('editableElement')) {\r\n        // Find a closest ancestor that is either a widget or an editable element...\r\n        const ancestor = targetViewElement.findAncestor(node => isWidget(node) || node.is('editableElement'));\r\n        // ...and if the widget was closer then it is a drop target.\r\n        if (isWidget(ancestor)) {\r\n            return model.createRangeOn(mapper.toModelElement(ancestor));\r\n        }\r\n    }\r\n    return null;\r\n}\r\n/**\r\n * Returns fixed selection range inside a model element.\r\n */\r\nfunction findDropTargetRangeInElement(editor, targetModelElement) {\r\n    const model = editor.model;\r\n    const schema = model.schema;\r\n    const positionAtElementStart = model.createPositionAt(targetModelElement, 0);\r\n    return schema.getNearestSelectionRange(positionAtElementStart, 'forward');\r\n}\r\n/**\r\n * Returns fixed selection range for a given position and a target element if the drop is between blocks.\r\n */\r\nfunction findDropTargetRangeBetweenBlocks(editor, targetModelPosition, targetModelElement) {\r\n    const model = editor.model;\r\n    // Check if target is between blocks.\r\n    if (!model.schema.checkChild(targetModelElement, '$block')) {\r\n        return null;\r\n    }\r\n    // Find position between blocks.\r\n    const positionAtElementStart = model.createPositionAt(targetModelElement, 0);\r\n    // Get the common part of the path (inside the target element and the target position).\r\n    const commonPath = targetModelPosition.path.slice(0, positionAtElementStart.path.length);\r\n    // Position between the blocks.\r\n    const betweenBlocksPosition = model.createPositionFromPath(targetModelPosition.root, commonPath);\r\n    const nodeAfter = betweenBlocksPosition.nodeAfter;\r\n    // Adjust drop position to the next object.\r\n    // This is because while hovering over a root element next to a widget the target position can jump in crazy places.\r\n    if (nodeAfter && model.schema.isObject(nodeAfter)) {\r\n        return model.createRangeOn(nodeAfter);\r\n    }\r\n    return null;\r\n}\r\n/**\r\n * Returns a selection range on the ancestor object.\r\n */\r\nfunction findDropTargetRangeOnAncestorObject(editor, element) {\r\n    const model = editor.model;\r\n    let currentElement = element;\r\n    while (currentElement) {\r\n        if (model.schema.isObject(currentElement)) {\r\n            return model.createRangeOn(currentElement);\r\n        }\r\n        currentElement = currentElement.parent;\r\n    }\r\n    /* istanbul ignore next -- @preserve */\r\n    return null;\r\n}\r\n/**\r\n * Returns the closest model element for the specified view element.\r\n */\r\nfunction getClosestMappedModelElement(editor, element) {\r\n    const mapper = editor.editing.mapper;\r\n    const view = editor.editing.view;\r\n    const targetModelElement = mapper.toModelElement(element);\r\n    if (targetModelElement) {\r\n        return targetModelElement;\r\n    }\r\n    // Find mapped ancestor if the target is inside not mapped element (for example inline code element).\r\n    const viewPosition = view.createPositionBefore(element);\r\n    const viewElement = mapper.findMappedViewAncestor(viewPosition);\r\n    return mapper.toModelElement(viewElement);\r\n}\r\n/**\r\n * Returns the drop effect that should be a result of dragging the content.\r\n * This function is handling a quirk when checking the effect in the 'drop' DOM event.\r\n */\r\nfunction getFinalDropEffect(dataTransfer) {\r\n    if (env.isGecko) {\r\n        return dataTransfer.dropEffect;\r\n    }\r\n    return ['all', 'copyMove'].includes(dataTransfer.effectAllowed) ? 'move' : 'copy';\r\n}\r\n/**\r\n * Returns a widget element that should be dragged.\r\n */\r\nfunction findDraggableWidget(target) {\r\n    // This is directly an editable so not a widget for sure.\r\n    if (target.is('editableElement')) {\r\n        return null;\r\n    }\r\n    // TODO: Let's have a isWidgetSelectionHandleDomElement() helper in ckeditor5-widget utils.\r\n    if (target.hasClass('ck-widget__selection-handle')) {\r\n        return target.findAncestor(isWidget);\r\n    }\r\n    // Direct hit on a widget.\r\n    if (isWidget(target)) {\r\n        return target;\r\n    }\r\n    // Find closest ancestor that is either a widget or an editable element...\r\n    const ancestor = target.findAncestor(node => isWidget(node) || node.is('editableElement'));\r\n    // ...and if closer was the widget then enable dragging it.\r\n    if (isWidget(ancestor)) {\r\n        return ancestor;\r\n    }\r\n    return null;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module clipboard/pasteplaintext\r\n */\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\nimport ClipboardObserver from './clipboardobserver';\r\nimport ClipboardPipeline from './clipboardpipeline';\r\n/**\r\n * The plugin detects the user's intention to paste plain text.\r\n *\r\n * For example, it detects the <kbd>Ctrl/Cmd</kbd> + <kbd>Shift</kbd> + <kbd>V</kbd> keystroke.\r\n */\r\nexport default class PastePlainText extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'PastePlainText';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ClipboardPipeline];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const view = editor.editing.view;\r\n        const viewDocument = view.document;\r\n        const selection = model.document.selection;\r\n        let shiftPressed = false;\r\n        view.addObserver(ClipboardObserver);\r\n        this.listenTo(viewDocument, 'keydown', (evt, data) => {\r\n            shiftPressed = data.shiftKey;\r\n        });\r\n        editor.plugins.get(ClipboardPipeline).on('contentInsertion', (evt, data) => {\r\n            // Plain text can be determined based on the event flag (#7799) or auto-detection (#1006). If detected,\r\n            // preserve selection attributes on pasted items.\r\n            if (!shiftPressed && !isPlainTextFragment(data.content, model.schema)) {\r\n                return;\r\n            }\r\n            model.change(writer => {\r\n                // Formatting attributes should be preserved.\r\n                const textAttributes = Array.from(selection.getAttributes())\r\n                    .filter(([key]) => model.schema.getAttributeProperties(key).isFormatting);\r\n                if (!selection.isCollapsed) {\r\n                    model.deleteContent(selection, { doNotAutoparagraph: true });\r\n                }\r\n                // Also preserve other attributes if they survived the content deletion (because they were not fully selected).\r\n                // For example linkHref is not a formatting attribute but it should be preserved if pasted text was in the middle\r\n                // of a link.\r\n                textAttributes.push(...selection.getAttributes());\r\n                const range = writer.createRangeIn(data.content);\r\n                for (const item of range.getItems()) {\r\n                    if (item.is('$textProxy')) {\r\n                        writer.setAttributes(textAttributes, item);\r\n                    }\r\n                }\r\n            });\r\n        });\r\n    }\r\n}\r\n/**\r\n * Returns true if specified `documentFragment` represents a plain text.\r\n */\r\nfunction isPlainTextFragment(documentFragment, schema) {\r\n    if (documentFragment.childCount > 1) {\r\n        return false;\r\n    }\r\n    const child = documentFragment.getChild(0);\r\n    if (schema.isObject(child)) {\r\n        return false;\r\n    }\r\n    return Array.from(child.getAttributeKeys()).length == 0;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module clipboard/clipboard\r\n */\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\nimport ClipboardPipeline from './clipboardpipeline';\r\nimport DragDrop from './dragdrop';\r\nimport PastePlainText from './pasteplaintext';\r\n/**\r\n * The clipboard feature.\r\n *\r\n * Read more about the clipboard integration in the {@glink framework/deep-dive/clipboard clipboard deep-dive} guide.\r\n *\r\n * This is a \"glue\" plugin which loads the following plugins:\r\n * * {@link module:clipboard/clipboardpipeline~ClipboardPipeline}\r\n * * {@link module:clipboard/dragdrop~DragDrop}\r\n * * {@link module:clipboard/pasteplaintext~PastePlainText}\r\n */\r\nexport default class Clipboard extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'Clipboard';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ClipboardPipeline, DragDrop, PastePlainText];\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module clipboard/lineview\r\n */\r\n/* istanbul ignore file -- @preserve */\r\nimport { View } from '@ckeditor/ckeditor5-ui';\r\nimport { toUnit } from '@ckeditor/ckeditor5-utils';\r\nconst toPx = toUnit('px');\r\n/**\r\n * The horizontal drop target line view.\r\n */\r\nexport default class LineView extends View {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor() {\r\n        super();\r\n        const bind = this.bindTemplate;\r\n        this.set({\r\n            isVisible: false,\r\n            left: null,\r\n            top: null,\r\n            width: null\r\n        });\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-clipboard-drop-target-line',\r\n                    bind.if('isVisible', 'ck-hidden', value => !value)\r\n                ],\r\n                style: {\r\n                    left: bind.to('left', left => toPx(left)),\r\n                    top: bind.to('top', top => toPx(top)),\r\n                    width: bind.to('width', width => toPx(width))\r\n                }\r\n            }\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module undo/basecommand\r\n */\r\nimport { Command } from '@ckeditor/ckeditor5-core';\r\nimport { transformSets, NoOperation } from '@ckeditor/ckeditor5-engine';\r\n/**\r\n * Base class for the undo feature commands: {@link module:undo/undocommand~UndoCommand} and {@link module:undo/redocommand~RedoCommand}.\r\n */\r\nexport default class BaseCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        /**\r\n         * Stack of items stored by the command. These are pairs of:\r\n         *\r\n         * * {@link module:engine/model/batch~Batch batch} saved by the command,\r\n         * * {@link module:engine/model/selection~Selection selection} state at the moment of saving the batch.\r\n         */\r\n        this._stack = [];\r\n        /**\r\n         * Stores all batches that were created by this command.\r\n         *\r\n         * @internal\r\n         */\r\n        this._createdBatches = new WeakSet();\r\n        // Refresh state, so the command is inactive right after initialization.\r\n        this.refresh();\r\n        // This command should not depend on selection change.\r\n        this._isEnabledBasedOnSelection = false;\r\n        // Set the transparent batch for the `editor.data.set()` call if the\r\n        // batch type is not set already.\r\n        this.listenTo(editor.data, 'set', (evt, data) => {\r\n            // Create a shallow copy of the options to not change the original args.\r\n            // And make sure that an object is assigned to data[ 1 ].\r\n            data[1] = { ...data[1] };\r\n            const options = data[1];\r\n            // If batch type is not set, default to non-undoable batch.\r\n            if (!options.batchType) {\r\n                options.batchType = { isUndoable: false };\r\n            }\r\n        }, { priority: 'high' });\r\n        // Clear the stack for the `transparent` batches.\r\n        this.listenTo(editor.data, 'set', (evt, data) => {\r\n            // We can assume that the object exists and it has a `batchType` property.\r\n            // It was ensured with a higher priority listener before.\r\n            const options = data[1];\r\n            if (!options.batchType.isUndoable) {\r\n                this.clearStack();\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        this.isEnabled = this._stack.length > 0;\r\n    }\r\n    /**\r\n     * Returns all batches created by this command.\r\n     */\r\n    get createdBatches() {\r\n        return this._createdBatches;\r\n    }\r\n    /**\r\n     * Stores a batch in the command, together with the selection state of the {@link module:engine/model/document~Document document}\r\n     * created by the editor which this command is registered to.\r\n     *\r\n     * @param batch The batch to add.\r\n     */\r\n    addBatch(batch) {\r\n        const docSelection = this.editor.model.document.selection;\r\n        const selection = {\r\n            ranges: docSelection.hasOwnRange ? Array.from(docSelection.getRanges()) : [],\r\n            isBackward: docSelection.isBackward\r\n        };\r\n        this._stack.push({ batch, selection });\r\n        this.refresh();\r\n    }\r\n    /**\r\n     * Removes all items from the stack.\r\n     */\r\n    clearStack() {\r\n        this._stack = [];\r\n        this.refresh();\r\n    }\r\n    /**\r\n     * Restores the {@link module:engine/model/document~Document#selection document selection} state after a batch was undone.\r\n     *\r\n     * @param ranges Ranges to be restored.\r\n     * @param isBackward A flag describing whether the restored range was selected forward or backward.\r\n     * @param operations Operations which has been applied since selection has been stored.\r\n     */\r\n    _restoreSelection(ranges, isBackward, operations) {\r\n        const model = this.editor.model;\r\n        const document = model.document;\r\n        // This will keep the transformed selection ranges.\r\n        const selectionRanges = [];\r\n        // Transform all ranges from the restored selection.\r\n        const transformedRangeGroups = ranges.map(range => range.getTransformedByOperations(operations));\r\n        const allRanges = transformedRangeGroups.flat();\r\n        for (const rangeGroup of transformedRangeGroups) {\r\n            // While transforming there could appear ranges that are contained by other ranges, we shall ignore them.\r\n            const transformed = rangeGroup\r\n                .filter(range => range.root != document.graveyard)\r\n                .filter(range => !isRangeContainedByAnyOtherRange(range, allRanges));\r\n            // All the transformed ranges ended up in graveyard.\r\n            if (!transformed.length) {\r\n                continue;\r\n            }\r\n            // After the range got transformed, we have an array of ranges. Some of those\r\n            // ranges may be \"touching\" -- they can be next to each other and could be merged.\r\n            normalizeRanges(transformed);\r\n            // For each `range` from `ranges`, we take only one transformed range.\r\n            // This is because we want to prevent situation where single-range selection\r\n            // got transformed to multi-range selection.\r\n            selectionRanges.push(transformed[0]);\r\n        }\r\n        // @if CK_DEBUG_ENGINE // console.log( `Restored selection by undo: ${ selectionRanges.join( ', ' ) }` );\r\n        // `selectionRanges` may be empty if all ranges ended up in graveyard. If that is the case, do not restore selection.\r\n        if (selectionRanges.length) {\r\n            model.change(writer => {\r\n                writer.setSelection(selectionRanges, { backward: isBackward });\r\n            });\r\n        }\r\n    }\r\n    /**\r\n     * Undoes a batch by reversing that batch, transforming reversed batch and finally applying it.\r\n     * This is a helper method for {@link #execute}.\r\n     *\r\n     * @param batchToUndo The batch to be undone.\r\n     * @param undoingBatch The batch that will contain undoing changes.\r\n     */\r\n    _undo(batchToUndo, undoingBatch) {\r\n        const model = this.editor.model;\r\n        const document = model.document;\r\n        // All changes done by the command execution will be saved as one batch.\r\n        this._createdBatches.add(undoingBatch);\r\n        const operationsToUndo = batchToUndo.operations.slice().filter(operation => operation.isDocumentOperation);\r\n        operationsToUndo.reverse();\r\n        // We will process each operation from `batchToUndo`, in reverse order. If there were operations A, B and C in undone batch,\r\n        // we need to revert them in reverse order, so first C' (reversed C), then B', then A'.\r\n        for (const operationToUndo of operationsToUndo) {\r\n            const nextBaseVersion = operationToUndo.baseVersion + 1;\r\n            const historyOperations = Array.from(document.history.getOperations(nextBaseVersion));\r\n            const transformedSets = transformSets([operationToUndo.getReversed()], historyOperations, {\r\n                useRelations: true,\r\n                document: this.editor.model.document,\r\n                padWithNoOps: false,\r\n                forceWeakRemove: true\r\n            });\r\n            const reversedOperations = transformedSets.operationsA;\r\n            // After reversed operation has been transformed by all history operations, apply it.\r\n            for (let operation of reversedOperations) {\r\n                // Do not apply any operation on non-editable space.\r\n                const affectedSelectable = operation.affectedSelectable;\r\n                if (affectedSelectable && !model.canEditAt(affectedSelectable)) {\r\n                    operation = new NoOperation(operation.baseVersion);\r\n                }\r\n                // Before applying, add the operation to the `undoingBatch`.\r\n                undoingBatch.addOperation(operation);\r\n                model.applyOperation(operation);\r\n                document.history.setOperationAsUndone(operationToUndo, operation);\r\n            }\r\n        }\r\n    }\r\n}\r\n/**\r\n * Normalizes list of ranges by joining intersecting or \"touching\" ranges.\r\n *\r\n * @param ranges Ranges to be normalized.\r\n */\r\nfunction normalizeRanges(ranges) {\r\n    ranges.sort((a, b) => a.start.isBefore(b.start) ? -1 : 1);\r\n    for (let i = 1; i < ranges.length; i++) {\r\n        const previousRange = ranges[i - 1];\r\n        const joinedRange = previousRange.getJoined(ranges[i], true);\r\n        if (joinedRange) {\r\n            // Replace the ranges on the list with the new joined range.\r\n            i--;\r\n            ranges.splice(i, 2, joinedRange);\r\n        }\r\n    }\r\n}\r\nfunction isRangeContainedByAnyOtherRange(range, ranges) {\r\n    return ranges.some(otherRange => otherRange !== range && otherRange.containsRange(range, true));\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module undo/undocommand\r\n */\r\nimport BaseCommand from './basecommand';\r\n/**\r\n * The undo command stores {@link module:engine/model/batch~Batch batches} applied to the\r\n * {@link module:engine/model/document~Document document} and is able to undo a batch by reversing it and transforming by\r\n * batches from {@link module:engine/model/document~Document#history history} that happened after the reversed batch.\r\n *\r\n * The undo command also takes care of restoring the {@link module:engine/model/document~Document#selection document selection}.\r\n */\r\nexport default class UndoCommand extends BaseCommand {\r\n    /**\r\n     * Executes the command. This method reverts a {@link module:engine/model/batch~Batch batch} added to the command's stack, transforms\r\n     * and applies the reverted version on the {@link module:engine/model/document~Document document} and removes the batch from the stack.\r\n     * Then, it restores the {@link module:engine/model/document~Document#selection document selection}.\r\n     *\r\n     * @fires execute\r\n     * @fires revert\r\n     * @param batch A batch that should be undone. If not set, the last added batch will be undone.\r\n     */\r\n    execute(batch = null) {\r\n        // If batch is not given, set `batchIndex` to the last index in command stack.\r\n        const batchIndex = batch ? this._stack.findIndex(a => a.batch == batch) : this._stack.length - 1;\r\n        const item = this._stack.splice(batchIndex, 1)[0];\r\n        const undoingBatch = this.editor.model.createBatch({ isUndo: true });\r\n        // All changes have to be done in one `enqueueChange` callback so other listeners will not\r\n        // step between consecutive operations, or won't do changes to the document before selection is properly restored.\r\n        this.editor.model.enqueueChange(undoingBatch, () => {\r\n            this._undo(item.batch, undoingBatch);\r\n            const operations = this.editor.model.document.history.getOperations(item.batch.baseVersion);\r\n            this._restoreSelection(item.selection.ranges, item.selection.isBackward, operations);\r\n            this.fire('revert', item.batch, undoingBatch);\r\n        });\r\n        this.refresh();\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module undo/redocommand\r\n */\r\nimport BaseCommand from './basecommand';\r\n/**\r\n * The redo command stores {@link module:engine/model/batch~Batch batches} that were used to undo a batch by\r\n * {@link module:undo/undocommand~UndoCommand}. It is able to redo a previously undone batch by reversing the undoing\r\n * batches created by `UndoCommand`. The reversed batch is transformed by all the batches from\r\n * {@link module:engine/model/document~Document#history history} that happened after the reversed undo batch.\r\n *\r\n * The redo command also takes care of restoring the {@link module:engine/model/document~Document#selection document selection}.\r\n */\r\nexport default class RedoCommand extends BaseCommand {\r\n    /**\r\n     * Executes the command. This method reverts the last {@link module:engine/model/batch~Batch batch} added to\r\n     * the command's stack, applies the reverted and transformed version on the\r\n     * {@link module:engine/model/document~Document document} and removes the batch from the stack.\r\n     * Then, it restores the {@link module:engine/model/document~Document#selection document selection}.\r\n     *\r\n     * @fires execute\r\n     */\r\n    execute() {\r\n        const item = this._stack.pop();\r\n        const redoingBatch = this.editor.model.createBatch({ isUndo: true });\r\n        // All changes have to be done in one `enqueueChange` callback so other listeners will not step between consecutive\r\n        // operations, or won't do changes to the document before selection is properly restored.\r\n        this.editor.model.enqueueChange(redoingBatch, () => {\r\n            const lastOperation = item.batch.operations[item.batch.operations.length - 1];\r\n            const nextBaseVersion = lastOperation.baseVersion + 1;\r\n            const operations = this.editor.model.document.history.getOperations(nextBaseVersion);\r\n            this._restoreSelection(item.selection.ranges, item.selection.isBackward, operations);\r\n            this._undo(item.batch, redoingBatch);\r\n        });\r\n        this.refresh();\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module undo/undoediting\r\n */\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\nimport UndoCommand from './undocommand';\r\nimport RedoCommand from './redocommand';\r\n/**\r\n * The undo engine feature.\r\n *\r\n * It introduces the `'undo'` and `'redo'` commands to the editor.\r\n */\r\nexport default class UndoEditing extends Plugin {\r\n    constructor() {\r\n        super(...arguments);\r\n        /**\r\n         * Keeps track of which batches were registered in undo.\r\n         */\r\n        this._batchRegistry = new WeakSet();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'UndoEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        // Create commands.\r\n        this._undoCommand = new UndoCommand(editor);\r\n        this._redoCommand = new RedoCommand(editor);\r\n        // Register command to the editor.\r\n        editor.commands.add('undo', this._undoCommand);\r\n        editor.commands.add('redo', this._redoCommand);\r\n        this.listenTo(editor.model, 'applyOperation', (evt, args) => {\r\n            const operation = args[0];\r\n            // Do not register batch if the operation is not a document operation.\r\n            // This prevents from creating empty undo steps, where all operations where non-document operations.\r\n            // Non-document operations creates and alters content in detached tree fragments (for example, document fragments).\r\n            // Most of time this is preparing data before it is inserted into actual tree (for example during copy & paste).\r\n            // Such operations should not be reversed.\r\n            if (!operation.isDocumentOperation) {\r\n                return;\r\n            }\r\n            const batch = operation.batch;\r\n            const isRedoBatch = this._redoCommand.createdBatches.has(batch);\r\n            const isUndoBatch = this._undoCommand.createdBatches.has(batch);\r\n            const wasProcessed = this._batchRegistry.has(batch);\r\n            // Skip the batch if it was already processed.\r\n            if (wasProcessed) {\r\n                return;\r\n            }\r\n            // Add the batch to the registry so it will not be processed again.\r\n            this._batchRegistry.add(batch);\r\n            if (!batch.isUndoable) {\r\n                return;\r\n            }\r\n            if (isRedoBatch) {\r\n                // If this batch comes from `redoCommand`, add it to the `undoCommand` stack.\r\n                this._undoCommand.addBatch(batch);\r\n            }\r\n            else if (!isUndoBatch) {\r\n                // If the batch comes neither  from `redoCommand` nor from `undoCommand` then it is a new, regular batch.\r\n                // Add the batch to the `undoCommand` stack and clear the `redoCommand` stack.\r\n                this._undoCommand.addBatch(batch);\r\n                this._redoCommand.clearStack();\r\n            }\r\n        }, { priority: 'highest' });\r\n        this.listenTo(this._undoCommand, 'revert', (evt, undoneBatch, undoingBatch) => {\r\n            this._redoCommand.addBatch(undoingBatch);\r\n        });\r\n        editor.keystrokes.set('CTRL+Z', 'undo');\r\n        editor.keystrokes.set('CTRL+Y', 'redo');\r\n        editor.keystrokes.set('CTRL+SHIFT+Z', 'redo');\r\n    }\r\n}\r\n","export default \"<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>\";","export default \"<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>\";","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module undo/undoui\r\n */\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\nimport { ButtonView } from '@ckeditor/ckeditor5-ui';\r\nimport undoIcon from '../theme/icons/undo.svg';\r\nimport redoIcon from '../theme/icons/redo.svg';\r\n/**\r\n * The undo UI feature. It introduces the `'undo'` and `'redo'` buttons to the editor.\r\n */\r\nexport default class UndoUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'UndoUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const locale = editor.locale;\r\n        const t = editor.t;\r\n        const localizedUndoIcon = locale.uiLanguageDirection == 'ltr' ? undoIcon : redoIcon;\r\n        const localizedRedoIcon = locale.uiLanguageDirection == 'ltr' ? redoIcon : undoIcon;\r\n        this._addButton('undo', t('Undo'), 'CTRL+Z', localizedUndoIcon);\r\n        this._addButton('redo', t('Redo'), 'CTRL+Y', localizedRedoIcon);\r\n    }\r\n    /**\r\n     * Creates a button for the specified command.\r\n     *\r\n     * @param name Command name.\r\n     * @param label Button label.\r\n     * @param keystroke Command keystroke.\r\n     * @param Icon Source of the icon.\r\n     */\r\n    _addButton(name, label, keystroke, Icon) {\r\n        const editor = this.editor;\r\n        editor.ui.componentFactory.add(name, locale => {\r\n            const command = editor.commands.get(name);\r\n            const view = new ButtonView(locale);\r\n            view.set({\r\n                label,\r\n                icon: Icon,\r\n                keystroke,\r\n                tooltip: true\r\n            });\r\n            view.bind('isEnabled').to(command, 'isEnabled');\r\n            this.listenTo(view, 'execute', () => {\r\n                editor.execute(name);\r\n                editor.editing.view.focus();\r\n            });\r\n            return view;\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module undo/undo\r\n */\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\nimport UndoEditing from './undoediting';\r\nimport UndoUI from './undoui';\r\n/**\r\n * The undo feature.\r\n *\r\n * This is a \"glue\" plugin which loads the {@link module:undo/undoediting~UndoEditing undo editing feature}\r\n * and the {@link module:undo/undoui~UndoUI undo UI feature}.\r\n *\r\n * Below is an explanation of the undo mechanism working together with {@link module:engine/model/history~History History}:\r\n *\r\n * Whenever an {@link module:engine/model/operation/operation~Operation operation} is applied to the\r\n * {@link module:engine/model/document~Document document}, it is saved to `History` as is.\r\n * The {@link module:engine/model/batch~Batch batch} that owns that operation is also saved, in\r\n * {@link module:undo/undocommand~UndoCommand}, together with the selection that was present in the document before the\r\n * operation was applied. A batch is saved instead of the operation because changes are undone batch-by-batch, not operation-by-operation\r\n * and a batch is seen as one undo step.\r\n *\r\n * After changes happen to the document, the `History` and `UndoCommand` stack can be represented as follows:\r\n *\r\n * ```\r\n *    History                            Undo stack\r\n * ==============             ==================================\r\n * [operation A1]                      [  batch A  ]\r\n * [operation B1]                      [  batch B  ]\r\n * [operation B2]                      [  batch C  ]\r\n * [operation C1]\r\n * [operation C2]\r\n * [operation B3]\r\n * [operation C3]\r\n * ```\r\n *\r\n * Where operations starting with the same letter are from same batch.\r\n *\r\n * Undoing a batch means that a set of operations which will reverse the effects of that batch needs to be generated.\r\n * For example, if a batch added several letters, undoing the batch should remove them. It is important to apply undoing\r\n * operations in the reversed order, so if a batch has operation `X`, `Y`, `Z`, reversed operations `Zr`, `Yr` and `Xr`\r\n * need to be applied. Otherwise reversed operation `Xr` would operate on a wrong document state, because operation `X`\r\n * does not know that operations `Y` and `Z` happened.\r\n *\r\n * After operations from an undone batch got {@link module:engine/model/operation/operation~Operation#getReversed reversed},\r\n * one needs to make sure if they are ready to be applied. In the scenario above, operation `C3` is the last operation and `C3r`\r\n * bases on up-to-date document state, so it can be applied to the document.\r\n *\r\n * ```\r\n *      History                             Undo stack\r\n * =================             ==================================\r\n * [ operation A1  ]                      [  batch A  ]\r\n * [ operation B1  ]                      [  batch B  ]\r\n * [ operation B2  ]             [   processing undoing batch C   ]\r\n * [ operation C1  ]\r\n * [ operation C2  ]\r\n * [ operation B3  ]\r\n * [ operation C3  ]\r\n * [ operation C3r ]\r\n * ```\r\n *\r\n * Next is operation `C2`, reversed to `C2r`. `C2r` bases on `C2`, so it bases on the wrong document state. It needs to be\r\n * transformed by operations from history that happened after it, so it \"knows\" about them. Let us assume that `C2' = C2r * B3 * C3 * C3r`,\r\n * where `*` means \"transformed by\". Rest of operations from that batch are processed in the same fashion.\r\n *\r\n * ```\r\n *      History                             Undo stack                                      Redo stack\r\n * =================             ==================================             ==================================\r\n * [ operation A1  ]                      [  batch A  ]                                    [ batch Cr ]\r\n * [ operation B1  ]                      [  batch B  ]\r\n * [ operation B2  ]\r\n * [ operation C1  ]\r\n * [ operation C2  ]\r\n * [ operation B3  ]\r\n * [ operation C3  ]\r\n * [ operation C3r ]\r\n * [ operation C2' ]\r\n * [ operation C1' ]\r\n * ```\r\n *\r\n * Selective undo works on the same basis, however, instead of undoing the last batch in the undo stack, any batch can be undone.\r\n * The same algorithm applies: operations from a batch (i.e. `A1`) are reversed and then transformed by operations stored in history.\r\n *\r\n * Redo also is very similar to undo. It has its own stack that is filled with undoing (reversed batches). Operations from\r\n * the batch that is re-done are reversed-back, transformed in proper order and applied to the document.\r\n *\r\n * ```\r\n *      History                             Undo stack                                      Redo stack\r\n * =================             ==================================             ==================================\r\n * [ operation A1  ]                      [  batch A  ]\r\n * [ operation B1  ]                      [  batch B  ]\r\n * [ operation B2  ]                      [ batch Crr ]\r\n * [ operation C1  ]\r\n * [ operation C2  ]\r\n * [ operation B3  ]\r\n * [ operation C3  ]\r\n * [ operation C3r ]\r\n * [ operation C2' ]\r\n * [ operation C1' ]\r\n * [ operation C1'r]\r\n * [ operation C2'r]\r\n * [ operation C3rr]\r\n * ```\r\n */\r\nexport default class Undo extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [UndoEditing, UndoUI];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'Undo';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { first } from 'ckeditor5/src/utils';\r\n/**\r\n * Creates a view element representing the inline image.\r\n *\r\n * ```html\r\n * <span class=\"image-inline\"><img></img></span>\r\n * ```\r\n *\r\n * Note that `alt` and `src` attributes are converted separately, so they are not included.\r\n *\r\n * @internal\r\n */\r\nexport function createInlineImageViewElement(writer) {\r\n    return writer.createContainerElement('span', { class: 'image-inline' }, writer.createEmptyElement('img'));\r\n}\r\n/**\r\n * Creates a view element representing the block image.\r\n *\r\n * ```html\r\n * <figure class=\"image\"><img></img></figure>\r\n * ```\r\n *\r\n * Note that `alt` and `src` attributes are converted separately, so they are not included.\r\n *\r\n * @internal\r\n */\r\nexport function createBlockImageViewElement(writer) {\r\n    return writer.createContainerElement('figure', { class: 'image' }, [\r\n        writer.createEmptyElement('img'),\r\n        writer.createSlot('children')\r\n    ]);\r\n}\r\n/**\r\n * A function returning a `MatcherPattern` for a particular type of View images.\r\n *\r\n * @internal\r\n * @param matchImageType The type of created image.\r\n */\r\nexport function getImgViewElementMatcher(editor, matchImageType) {\r\n    const imageUtils = editor.plugins.get('ImageUtils');\r\n    const areBothImagePluginsLoaded = editor.plugins.has('ImageInlineEditing') && editor.plugins.has('ImageBlockEditing');\r\n    return element => {\r\n        // Check if the matched view element is an <img>.\r\n        if (!imageUtils.isInlineImageView(element)) {\r\n            return null;\r\n        }\r\n        // If just one of the plugins is loaded (block or inline), it will match all kinds of images.\r\n        if (!areBothImagePluginsLoaded) {\r\n            return getPositiveMatchPattern(element);\r\n        }\r\n        // The <img> can be standalone, wrapped in <figure>...</figure> (ImageBlock plugin) or\r\n        // wrapped in <figure><a>...</a></figure> (LinkImage plugin).\r\n        const imageType = element.getStyle('display') == 'block' || element.findAncestor(imageUtils.isBlockImageView) ?\r\n            'imageBlock' :\r\n            'imageInline';\r\n        if (imageType !== matchImageType) {\r\n            return null;\r\n        }\r\n        return getPositiveMatchPattern(element);\r\n    };\r\n    function getPositiveMatchPattern(element) {\r\n        const pattern = {\r\n            name: true\r\n        };\r\n        // This will trigger src consumption (See https://github.com/ckeditor/ckeditor5/issues/11530).\r\n        if (element.hasAttribute('src')) {\r\n            pattern.attributes = ['src'];\r\n        }\r\n        return pattern;\r\n    }\r\n}\r\n/**\r\n * Considering the current model selection, it returns the name of the model image element\r\n * (`'imageBlock'` or `'imageInline'`) that will make most sense from the UX perspective if a new\r\n * image was inserted (also: uploaded, dropped, pasted) at that selection.\r\n *\r\n * The assumption is that inserting images into empty blocks or on other block widgets should\r\n * produce block images. Inline images should be inserted in other cases, e.g. in paragraphs\r\n * that already contain some text.\r\n *\r\n * @internal\r\n */\r\nexport function determineImageTypeForInsertionAtSelection(schema, selection) {\r\n    const firstBlock = first(selection.getSelectedBlocks());\r\n    // Insert a block image if the selection is not in/on block elements or it's on a block widget.\r\n    if (!firstBlock || schema.isObject(firstBlock)) {\r\n        return 'imageBlock';\r\n    }\r\n    // A block image should also be inserted into an empty block element\r\n    // (that is not an empty list item so the list won't get split).\r\n    if (firstBlock.isEmpty && firstBlock.name != 'listItem') {\r\n        return 'imageBlock';\r\n    }\r\n    // Otherwise insert an inline image.\r\n    return 'imageInline';\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { findOptimalInsertionRange, isWidget, toWidget } from 'ckeditor5/src/widget';\r\nimport { determineImageTypeForInsertionAtSelection } from './image/utils';\r\n/**\r\n * A set of helpers related to images.\r\n */\r\nexport default class ImageUtils extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageUtils';\r\n    }\r\n    /**\r\n     * Checks if the provided model element is an `image` or `imageInline`.\r\n     */\r\n    isImage(modelElement) {\r\n        return this.isInlineImage(modelElement) || this.isBlockImage(modelElement);\r\n    }\r\n    /**\r\n     * Checks if the provided view element represents an inline image.\r\n     *\r\n     * Also, see {@link module:image/imageutils~ImageUtils#isImageWidget}.\r\n     */\r\n    isInlineImageView(element) {\r\n        return !!element && element.is('element', 'img');\r\n    }\r\n    /**\r\n     * Checks if the provided view element represents a block image.\r\n     *\r\n     * Also, see {@link module:image/imageutils~ImageUtils#isImageWidget}.\r\n     */\r\n    isBlockImageView(element) {\r\n        return !!element && element.is('element', 'figure') && element.hasClass('image');\r\n    }\r\n    /**\r\n     * Handles inserting single file. This method unifies image insertion using {@link module:widget/utils~findOptimalInsertionRange}\r\n     * method.\r\n     *\r\n     * ```ts\r\n     * const imageUtils = editor.plugins.get( 'ImageUtils' );\r\n     *\r\n     * imageUtils.insertImage( { src: 'path/to/image.jpg' } );\r\n     * ```\r\n     *\r\n     * @param attributes Attributes of the inserted image.\r\n     * This method filters out the attributes which are disallowed by the {@link module:engine/model/schema~Schema}.\r\n     * @param selectable Place to insert the image. If not specified,\r\n     * the {@link module:widget/utils~findOptimalInsertionRange} logic will be applied for the block images\r\n     * and `model.document.selection` for the inline images.\r\n     *\r\n     * **Note**: If `selectable` is passed, this helper will not be able to set selection attributes (such as `linkHref`)\r\n     * and apply them to the new image. In this case, make sure all selection attributes are passed in `attributes`.\r\n     *\r\n     * @param imageType Image type of inserted image. If not specified,\r\n     * it will be determined automatically depending of editor config or place of the insertion.\r\n     * @return The inserted model image element.\r\n     */\r\n    insertImage(attributes = {}, selectable = null, imageType = null) {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const selection = model.document.selection;\r\n        imageType = determineImageTypeForInsertion(editor, selectable || selection, imageType);\r\n        // Mix declarative attributes with selection attributes because the new image should \"inherit\"\r\n        // the latter for best UX. For instance, inline images inserted into existing links\r\n        // should not split them. To do that, they need to have \"linkHref\" inherited from the selection.\r\n        attributes = {\r\n            ...Object.fromEntries(selection.getAttributes()),\r\n            ...attributes\r\n        };\r\n        for (const attributeName in attributes) {\r\n            if (!model.schema.checkAttribute(imageType, attributeName)) {\r\n                delete attributes[attributeName];\r\n            }\r\n        }\r\n        return model.change(writer => {\r\n            const imageElement = writer.createElement(imageType, attributes);\r\n            model.insertObject(imageElement, selectable, null, {\r\n                setSelection: 'on',\r\n                // If we want to insert a block image (for whatever reason) then we don't want to split text blocks.\r\n                // This applies only when we don't have the selectable specified (i.e., we insert multiple block images at once).\r\n                findOptimalPosition: !selectable && imageType != 'imageInline' ? 'auto' : undefined\r\n            });\r\n            // Inserting an image might've failed due to schema regulations.\r\n            if (imageElement.parent) {\r\n                return imageElement;\r\n            }\r\n            return null;\r\n        });\r\n    }\r\n    /**\r\n     * Returns an image widget editing view element if one is selected or is among the selection's ancestors.\r\n     */\r\n    getClosestSelectedImageWidget(selection) {\r\n        const selectionPosition = selection.getFirstPosition();\r\n        if (!selectionPosition) {\r\n            return null;\r\n        }\r\n        const viewElement = selection.getSelectedElement();\r\n        if (viewElement && this.isImageWidget(viewElement)) {\r\n            return viewElement;\r\n        }\r\n        let parent = selectionPosition.parent;\r\n        while (parent) {\r\n            if (parent.is('element') && this.isImageWidget(parent)) {\r\n                return parent;\r\n            }\r\n            parent = parent.parent;\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Returns a image model element if one is selected or is among the selection's ancestors.\r\n     */\r\n    getClosestSelectedImageElement(selection) {\r\n        const selectedElement = selection.getSelectedElement();\r\n        return this.isImage(selectedElement) ? selectedElement : selection.getFirstPosition().findAncestor('imageBlock');\r\n    }\r\n    /**\r\n     * Checks if image can be inserted at current model selection.\r\n     *\r\n     * @internal\r\n     */\r\n    isImageAllowed() {\r\n        const model = this.editor.model;\r\n        const selection = model.document.selection;\r\n        return isImageAllowedInParent(this.editor, selection) && isNotInsideImage(selection);\r\n    }\r\n    /**\r\n     * Converts a given {@link module:engine/view/element~Element} to an image widget:\r\n     * * Adds a {@link module:engine/view/element~Element#_setCustomProperty custom property} allowing to recognize the image widget\r\n     * element.\r\n     * * Calls the {@link module:widget/utils~toWidget} function with the proper element's label creator.\r\n     *\r\n     * @param writer An instance of the view writer.\r\n     * @param label The element's label. It will be concatenated with the image `alt` attribute if one is present.\r\n     */\r\n    toImageWidget(viewElement, writer, label) {\r\n        writer.setCustomProperty('image', true, viewElement);\r\n        const labelCreator = () => {\r\n            const imgElement = this.findViewImgElement(viewElement);\r\n            const altText = imgElement.getAttribute('alt');\r\n            return altText ? `${altText} ${label}` : label;\r\n        };\r\n        return toWidget(viewElement, writer, { label: labelCreator });\r\n    }\r\n    /**\r\n     * Checks if a given view element is an image widget.\r\n     */\r\n    isImageWidget(viewElement) {\r\n        return !!viewElement.getCustomProperty('image') && isWidget(viewElement);\r\n    }\r\n    /**\r\n     * Checks if the provided model element is an `image`.\r\n     */\r\n    isBlockImage(modelElement) {\r\n        return !!modelElement && modelElement.is('element', 'imageBlock');\r\n    }\r\n    /**\r\n     * Checks if the provided model element is an `imageInline`.\r\n     */\r\n    isInlineImage(modelElement) {\r\n        return !!modelElement && modelElement.is('element', 'imageInline');\r\n    }\r\n    /**\r\n     * Get the view `<img>` from another view element, e.g. a widget (`<figure class=\"image\">`), a link (`<a>`).\r\n     *\r\n     * The `<img>` can be located deep in other elements, so this helper performs a deep tree search.\r\n     */\r\n    findViewImgElement(figureView) {\r\n        if (this.isInlineImageView(figureView)) {\r\n            return figureView;\r\n        }\r\n        const editingView = this.editor.editing.view;\r\n        for (const { item } of editingView.createRangeIn(figureView)) {\r\n            if (this.isInlineImageView(item)) {\r\n                return item;\r\n            }\r\n        }\r\n    }\r\n}\r\n/**\r\n * Checks if image is allowed by schema in optimal insertion parent.\r\n */\r\nfunction isImageAllowedInParent(editor, selection) {\r\n    const imageType = determineImageTypeForInsertion(editor, selection, null);\r\n    if (imageType == 'imageBlock') {\r\n        const parent = getInsertImageParent(selection, editor.model);\r\n        if (editor.model.schema.checkChild(parent, 'imageBlock')) {\r\n            return true;\r\n        }\r\n    }\r\n    else if (editor.model.schema.checkChild(selection.focus, 'imageInline')) {\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\n/**\r\n * Checks if selection is not placed inside an image (e.g. its caption).\r\n */\r\nfunction isNotInsideImage(selection) {\r\n    return [...selection.focus.getAncestors()].every(ancestor => !ancestor.is('element', 'imageBlock'));\r\n}\r\n/**\r\n * Returns a node that will be used to insert image with `model.insertContent`.\r\n */\r\nfunction getInsertImageParent(selection, model) {\r\n    const insertionRange = findOptimalInsertionRange(selection, model);\r\n    const parent = insertionRange.start.parent;\r\n    if (parent.isEmpty && !parent.is('element', '$root')) {\r\n        return parent.parent;\r\n    }\r\n    return parent;\r\n}\r\n/**\r\n * Determine image element type name depending on editor config or place of insertion.\r\n *\r\n * @param imageType Image element type name. Used to force return of provided element name,\r\n * but only if there is proper plugin enabled.\r\n */\r\nfunction determineImageTypeForInsertion(editor, selectable, imageType) {\r\n    const schema = editor.model.schema;\r\n    const configImageInsertType = editor.config.get('image.insert.type');\r\n    if (!editor.plugins.has('ImageBlockEditing')) {\r\n        return 'imageInline';\r\n    }\r\n    if (!editor.plugins.has('ImageInlineEditing')) {\r\n        return 'imageBlock';\r\n    }\r\n    if (imageType) {\r\n        return imageType;\r\n    }\r\n    if (configImageInsertType === 'inline') {\r\n        return 'imageInline';\r\n    }\r\n    if (configImageInsertType === 'block') {\r\n        return 'imageBlock';\r\n    }\r\n    // Try to replace the selected widget (e.g. another image).\r\n    if (selectable.is('selection')) {\r\n        return determineImageTypeForInsertionAtSelection(schema, selectable);\r\n    }\r\n    return schema.checkChild(selectable, 'imageInline') ? 'imageInline' : 'imageBlock';\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/autoimage\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { Clipboard } from 'ckeditor5/src/clipboard';\r\nimport { LivePosition, LiveRange } from 'ckeditor5/src/engine';\r\nimport { Undo } from 'ckeditor5/src/undo';\r\nimport { Delete } from 'ckeditor5/src/typing';\r\nimport { global } from 'ckeditor5/src/utils';\r\nimport ImageUtils from './imageutils';\r\n// Implements the pattern: http(s)://(www.)example.com/path/to/resource.ext?query=params&maybe=too.\r\nconst IMAGE_URL_REGEXP = new RegExp(String(/^(http(s)?:\\/\\/)?[\\w-]+\\.[\\w.~:/[\\]@!$&'()*+,;=%-]+/.source +\r\n    /\\.(jpg|jpeg|png|gif|ico|webp|JPG|JPEG|PNG|GIF|ICO|WEBP)/.source +\r\n    /(\\?[\\w.~:/[\\]@!$&'()*+,;=%-]*)?/.source +\r\n    /(#[\\w.~:/[\\]@!$&'()*+,;=%-]*)?$/.source));\r\n/**\r\n * The auto-image plugin. It recognizes image links in the pasted content and embeds\r\n * them shortly after they are injected into the document.\r\n */\r\nexport default class AutoImage extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [Clipboard, ImageUtils, Undo, Delete];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'AutoImage';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        this._timeoutId = null;\r\n        this._positionToInsert = null;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const modelDocument = editor.model.document;\r\n        const clipboardPipeline = editor.plugins.get('ClipboardPipeline');\r\n        // We need to listen on `Clipboard#inputTransformation` because we need to save positions of selection.\r\n        // After pasting, the content between those positions will be checked for a URL that could be transformed\r\n        // into an image.\r\n        this.listenTo(clipboardPipeline, 'inputTransformation', () => {\r\n            const firstRange = modelDocument.selection.getFirstRange();\r\n            const leftLivePosition = LivePosition.fromPosition(firstRange.start);\r\n            leftLivePosition.stickiness = 'toPrevious';\r\n            const rightLivePosition = LivePosition.fromPosition(firstRange.end);\r\n            rightLivePosition.stickiness = 'toNext';\r\n            modelDocument.once('change:data', () => {\r\n                this._embedImageBetweenPositions(leftLivePosition, rightLivePosition);\r\n                leftLivePosition.detach();\r\n                rightLivePosition.detach();\r\n            }, { priority: 'high' });\r\n        });\r\n        editor.commands.get('undo').on('execute', () => {\r\n            if (this._timeoutId) {\r\n                global.window.clearTimeout(this._timeoutId);\r\n                this._positionToInsert.detach();\r\n                this._timeoutId = null;\r\n                this._positionToInsert = null;\r\n            }\r\n        }, { priority: 'high' });\r\n    }\r\n    /**\r\n     * Analyzes the part of the document between provided positions in search for a URL representing an image.\r\n     * When the URL is found, it is automatically converted into an image.\r\n     *\r\n     * @param leftPosition Left position of the selection.\r\n     * @param rightPosition Right position of the selection.\r\n     */\r\n    _embedImageBetweenPositions(leftPosition, rightPosition) {\r\n        const editor = this.editor;\r\n        // TODO: Use a marker instead of LiveRange & LivePositions.\r\n        const urlRange = new LiveRange(leftPosition, rightPosition);\r\n        const walker = urlRange.getWalker({ ignoreElementEnd: true });\r\n        const selectionAttributes = Object.fromEntries(editor.model.document.selection.getAttributes());\r\n        const imageUtils = this.editor.plugins.get('ImageUtils');\r\n        let src = '';\r\n        for (const node of walker) {\r\n            if (node.item.is('$textProxy')) {\r\n                src += node.item.data;\r\n            }\r\n        }\r\n        src = src.trim();\r\n        // If the URL does not match the image URL regexp, let's skip that.\r\n        if (!src.match(IMAGE_URL_REGEXP)) {\r\n            urlRange.detach();\r\n            return;\r\n        }\r\n        // Position will not be available in the `setTimeout` function so let's clone it.\r\n        this._positionToInsert = LivePosition.fromPosition(leftPosition);\r\n        // This action mustn't be executed if undo was called between pasting and auto-embedding.\r\n        this._timeoutId = setTimeout(() => {\r\n            // Do nothing if image element cannot be inserted at the current position.\r\n            // See https://github.com/ckeditor/ckeditor5/issues/2763.\r\n            // Condition must be checked after timeout - pasting may take place on an element, replacing it. The final position matters.\r\n            const imageCommand = editor.commands.get('insertImage');\r\n            if (!imageCommand.isEnabled) {\r\n                urlRange.detach();\r\n                return;\r\n            }\r\n            editor.model.change(writer => {\r\n                this._timeoutId = null;\r\n                writer.remove(urlRange);\r\n                urlRange.detach();\r\n                let insertionPosition;\r\n                // Check if the position where the element should be inserted is still valid.\r\n                // Otherwise leave it as undefined to use the logic of insertImage().\r\n                if (this._positionToInsert.root.rootName !== '$graveyard') {\r\n                    insertionPosition = this._positionToInsert.toPosition();\r\n                }\r\n                imageUtils.insertImage({ ...selectionAttributes, src }, insertionPosition);\r\n                this._positionToInsert.detach();\r\n                this._positionToInsert = null;\r\n            });\r\n            const deletePlugin = editor.plugins.get('Delete');\r\n            deletePlugin.requestUndoOnBackspace();\r\n        }, 100);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { LiveRange } from 'ckeditor5/src/engine';\r\nimport { first } from 'ckeditor5/src/utils';\r\n/**\r\n * The block autoformatting engine. It allows to format various block patterns. For example,\r\n * it can be configured to turn a paragraph starting with `*` and followed by a space into a list item.\r\n *\r\n * The autoformatting operation is integrated with the undo manager,\r\n * so the autoformatting step can be undone if the user's intention was not to format the text.\r\n *\r\n * See the {@link module:autoformat/blockautoformatediting~blockAutoformatEditing `blockAutoformatEditing`} documentation\r\n * to learn how to create custom block autoformatters. You can also use\r\n * the {@link module:autoformat/autoformat~Autoformat} feature which enables a set of default autoformatters\r\n * (lists, headings, bold and italic).\r\n *\r\n * @module autoformat/blockautoformatediting\r\n */\r\n/**\r\n * Creates a listener triggered on {@link module:engine/model/document~Document#event:change:data `change:data`} event in the document.\r\n * Calls the callback when inserted text matches the regular expression or the command name\r\n * if provided instead of the callback.\r\n *\r\n * Examples of usage:\r\n *\r\n * To convert a paragraph into heading 1 when `- ` is typed, using just the command name:\r\n *\r\n * ```ts\r\n * blockAutoformatEditing( editor, plugin, /^\\- $/, 'heading1' );\r\n * ```\r\n *\r\n * To convert a paragraph into heading 1 when `- ` is typed, using just the callback:\r\n *\r\n * ```ts\r\n * blockAutoformatEditing( editor, plugin, /^\\- $/, ( context ) => {\r\n * \tconst { match } = context;\r\n * \tconst headingLevel = match[ 1 ].length;\r\n *\r\n * \teditor.execute( 'heading', {\r\n * \t\tformatId: `heading${ headingLevel }`\r\n * \t} );\r\n * } );\r\n * ```\r\n *\r\n * @param editor The editor instance.\r\n * @param plugin The autoformat plugin instance.\r\n * @param pattern The regular expression to execute on just inserted text. The regular expression is tested against the text\r\n * from the beginning until the caret position.\r\n * @param callbackOrCommand The callback to execute or the command to run when the text is matched.\r\n * In case of providing the callback, it receives the following parameter:\r\n * * match RegExp.exec() result of matching the pattern to inserted text.\r\n */\r\nexport default function blockAutoformatEditing(editor, plugin, pattern, callbackOrCommand) {\r\n    let callback;\r\n    let command = null;\r\n    if (typeof callbackOrCommand == 'function') {\r\n        callback = callbackOrCommand;\r\n    }\r\n    else {\r\n        // We assume that the actual command name was provided.\r\n        command = editor.commands.get(callbackOrCommand);\r\n        callback = () => {\r\n            editor.execute(callbackOrCommand);\r\n        };\r\n    }\r\n    editor.model.document.on('change:data', (evt, batch) => {\r\n        if (command && !command.isEnabled || !plugin.isEnabled) {\r\n            return;\r\n        }\r\n        const range = first(editor.model.document.selection.getRanges());\r\n        if (!range.isCollapsed) {\r\n            return;\r\n        }\r\n        if (batch.isUndo || !batch.isLocal) {\r\n            return;\r\n        }\r\n        const changes = Array.from(editor.model.document.differ.getChanges());\r\n        const entry = changes[0];\r\n        // Typing is represented by only a single change.\r\n        if (changes.length != 1 || entry.type !== 'insert' || entry.name != '$text' || entry.length != 1) {\r\n            return;\r\n        }\r\n        const blockToFormat = entry.position.parent;\r\n        // Block formatting should be disabled in codeBlocks (#5800).\r\n        if (blockToFormat.is('element', 'codeBlock')) {\r\n            return;\r\n        }\r\n        // Only list commands and custom callbacks can be applied inside a list.\r\n        if (blockToFormat.is('element', 'listItem') &&\r\n            typeof callbackOrCommand !== 'function' &&\r\n            !['numberedList', 'bulletedList', 'todoList'].includes(callbackOrCommand)) {\r\n            return;\r\n        }\r\n        // In case a command is bound, do not re-execute it over an existing block style which would result in a style removal.\r\n        // Instead, just drop processing so that autoformat trigger text is not lost. E.g. writing \"# \" in a level 1 heading.\r\n        if (command && command.value === true) {\r\n            return;\r\n        }\r\n        const firstNode = blockToFormat.getChild(0);\r\n        const firstNodeRange = editor.model.createRangeOn(firstNode);\r\n        // Range is only expected to be within or at the very end of the first text node.\r\n        if (!firstNodeRange.containsRange(range) && !range.end.isEqual(firstNodeRange.end)) {\r\n            return;\r\n        }\r\n        const match = pattern.exec(firstNode.data.substr(0, range.end.offset));\r\n        // ...and this text node's data match the pattern.\r\n        if (!match) {\r\n            return;\r\n        }\r\n        // Use enqueueChange to create new batch to separate typing batch from the auto-format changes.\r\n        editor.model.enqueueChange(writer => {\r\n            // Matched range.\r\n            const start = writer.createPositionAt(blockToFormat, 0);\r\n            const end = writer.createPositionAt(blockToFormat, match[0].length);\r\n            const range = new LiveRange(start, end);\r\n            const wasChanged = callback({ match });\r\n            // Remove matched text.\r\n            if (wasChanged !== false) {\r\n                writer.remove(range);\r\n                const selectionRange = editor.model.document.selection.getFirstRange();\r\n                const blockRange = writer.createRangeIn(blockToFormat);\r\n                // If the block is empty and the document selection has been moved when\r\n                // applying formatting (e.g. is now in newly created block).\r\n                if (blockToFormat.isEmpty && !blockRange.isEqual(selectionRange) && !blockRange.containsRange(selectionRange, true)) {\r\n                    writer.remove(blockToFormat);\r\n                }\r\n            }\r\n            range.detach();\r\n            editor.model.enqueueChange(() => {\r\n                const deletePlugin = editor.plugins.get('Delete');\r\n                deletePlugin.requestUndoOnBackspace();\r\n            });\r\n        });\r\n    });\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * Enables autoformatting mechanism for a given {@link module:core/editor/editor~Editor}.\r\n *\r\n * It formats the matched text by applying the given model attribute or by running the provided formatting callback.\r\n * On every {@link module:engine/model/document~Document#event:change:data data change} in the model document\r\n * the autoformatting engine checks the text on the left of the selection\r\n * and executes the provided action if the text matches given criteria (regular expression or callback).\r\n *\r\n * @param editor The editor instance.\r\n * @param plugin The autoformat plugin instance.\r\n * @param testRegexpOrCallback The regular expression or callback to execute on text.\r\n * Provided regular expression *must* have three capture groups. The first and the third capture group\r\n * should match opening and closing delimiters. The second capture group should match the text to format.\r\n *\r\n * ```ts\r\n * // Matches the `**bold text**` pattern.\r\n * // There are three capturing groups:\r\n * // - The first to match the starting `**` delimiter.\r\n * // - The second to match the text to format.\r\n * // - The third to match the ending `**` delimiter.\r\n * inlineAutoformatEditing( editor, plugin, /(\\*\\*)([^\\*]+?)(\\*\\*)$/g, formatCallback );\r\n * ```\r\n *\r\n * When a function is provided instead of the regular expression, it will be executed with the text to match as a parameter.\r\n * The function should return proper \"ranges\" to delete and format.\r\n *\r\n * ```ts\r\n * {\r\n * \tremove: [\r\n * \t\t[ 0, 1 ],\t// Remove the first letter from the given text.\r\n * \t\t[ 5, 6 ]\t// Remove the 6th letter from the given text.\r\n * \t],\r\n * \tformat: [\r\n * \t\t[ 1, 5 ]\t// Format all letters from 2nd to 5th.\r\n * \t]\r\n * }\r\n * ```\r\n *\r\n * @param formatCallback A callback to apply actual formatting.\r\n * It should return `false` if changes should not be applied (e.g. if a command is disabled).\r\n *\r\n * ```ts\r\n * inlineAutoformatEditing( editor, plugin, /(\\*\\*)([^\\*]+?)(\\*\\*)$/g, ( writer, rangesToFormat ) => {\r\n * \tconst command = editor.commands.get( 'bold' );\r\n *\r\n * \tif ( !command.isEnabled ) {\r\n * \t\treturn false;\r\n * \t}\r\n *\r\n * \tconst validRanges = editor.model.schema.getValidRanges( rangesToFormat, 'bold' );\r\n *\r\n * \tfor ( let range of validRanges ) {\r\n * \t\twriter.setAttribute( 'bold', true, range );\r\n * \t}\r\n * } );\r\n * ```\r\n */\r\nexport default function inlineAutoformatEditing(editor, plugin, testRegexpOrCallback, formatCallback) {\r\n    let regExp;\r\n    let testCallback;\r\n    if (testRegexpOrCallback instanceof RegExp) {\r\n        regExp = testRegexpOrCallback;\r\n    }\r\n    else {\r\n        testCallback = testRegexpOrCallback;\r\n    }\r\n    // A test callback run on changed text.\r\n    testCallback = testCallback || (text => {\r\n        let result;\r\n        const remove = [];\r\n        const format = [];\r\n        while ((result = regExp.exec(text)) !== null) {\r\n            // There should be full match and 3 capture groups.\r\n            if (result && result.length < 4) {\r\n                break;\r\n            }\r\n            let { index, '1': leftDel, '2': content, '3': rightDel } = result;\r\n            // Real matched string - there might be some non-capturing groups so we need to recalculate starting index.\r\n            const found = leftDel + content + rightDel;\r\n            index += result[0].length - found.length;\r\n            // Start and End offsets of delimiters to remove.\r\n            const delStart = [\r\n                index,\r\n                index + leftDel.length\r\n            ];\r\n            const delEnd = [\r\n                index + leftDel.length + content.length,\r\n                index + leftDel.length + content.length + rightDel.length\r\n            ];\r\n            remove.push(delStart);\r\n            remove.push(delEnd);\r\n            format.push([index + leftDel.length, index + leftDel.length + content.length]);\r\n        }\r\n        return {\r\n            remove,\r\n            format\r\n        };\r\n    });\r\n    editor.model.document.on('change:data', (evt, batch) => {\r\n        if (batch.isUndo || !batch.isLocal || !plugin.isEnabled) {\r\n            return;\r\n        }\r\n        const model = editor.model;\r\n        const selection = model.document.selection;\r\n        // Do nothing if selection is not collapsed.\r\n        if (!selection.isCollapsed) {\r\n            return;\r\n        }\r\n        const changes = Array.from(model.document.differ.getChanges());\r\n        const entry = changes[0];\r\n        // Typing is represented by only a single change.\r\n        if (changes.length != 1 || entry.type !== 'insert' || entry.name != '$text' || entry.length != 1) {\r\n            return;\r\n        }\r\n        const focus = selection.focus;\r\n        const block = focus.parent;\r\n        const { text, range } = getTextAfterCode(model.createRange(model.createPositionAt(block, 0), focus), model);\r\n        const testOutput = testCallback(text);\r\n        const rangesToFormat = testOutputToRanges(range.start, testOutput.format, model);\r\n        const rangesToRemove = testOutputToRanges(range.start, testOutput.remove, model);\r\n        if (!(rangesToFormat.length && rangesToRemove.length)) {\r\n            return;\r\n        }\r\n        // Use enqueueChange to create new batch to separate typing batch from the auto-format changes.\r\n        model.enqueueChange(writer => {\r\n            // Apply format.\r\n            const hasChanged = formatCallback(writer, rangesToFormat);\r\n            // Strict check on `false` to have backward compatibility (when callbacks were returning `undefined`).\r\n            if (hasChanged === false) {\r\n                return;\r\n            }\r\n            // Remove delimiters - use reversed order to not mix the offsets while removing.\r\n            for (const range of rangesToRemove.reverse()) {\r\n                writer.remove(range);\r\n            }\r\n            model.enqueueChange(() => {\r\n                const deletePlugin = editor.plugins.get('Delete');\r\n                deletePlugin.requestUndoOnBackspace();\r\n            });\r\n        });\r\n    });\r\n}\r\n/**\r\n * Converts output of the test function provided to the inlineAutoformatEditing and converts it to the model ranges\r\n * inside provided block.\r\n */\r\nfunction testOutputToRanges(start, arrays, model) {\r\n    return arrays\r\n        .filter(array => (array[0] !== undefined && array[1] !== undefined))\r\n        .map(array => {\r\n        return model.createRange(start.getShiftedBy(array[0]), start.getShiftedBy(array[1]));\r\n    });\r\n}\r\n/**\r\n * Returns the last text line after the last code element from the given range.\r\n * It is similar to {@link module:typing/utils/getlasttextline.getLastTextLine `getLastTextLine()`},\r\n * but it ignores any text before the last `code`.\r\n */\r\nfunction getTextAfterCode(range, model) {\r\n    let start = range.start;\r\n    const text = Array.from(range.getItems()).reduce((rangeText, node) => {\r\n        // Trim text to a last occurrence of an inline element and update range start.\r\n        if (!(node.is('$text') || node.is('$textProxy')) || node.getAttribute('code')) {\r\n            start = model.createPositionAfter(node);\r\n            return '';\r\n        }\r\n        return rangeText + node.data;\r\n    }, '');\r\n    return { text, range: model.createRange(start, range.end) };\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { Delete } from 'ckeditor5/src/typing';\r\nimport blockAutoformatEditing from './blockautoformatediting';\r\nimport inlineAutoformatEditing from './inlineautoformatediting';\r\n/**\r\n * Enables a set of predefined autoformatting actions.\r\n *\r\n * For a detailed overview, check the {@glink features/autoformat Autoformatting} feature guide\r\n * and the {@glink api/autoformat package page}.\r\n */\r\nexport default class Autoformat extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [Delete];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'Autoformat';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    afterInit() {\r\n        this._addListAutoformats();\r\n        this._addBasicStylesAutoformats();\r\n        this._addHeadingAutoformats();\r\n        this._addBlockQuoteAutoformats();\r\n        this._addCodeBlockAutoformats();\r\n        this._addHorizontalLineAutoformats();\r\n    }\r\n    /**\r\n     * Adds autoformatting related to the {@link module:list/list~List}.\r\n     *\r\n     * When typed:\r\n     * - `* ` or `- ` &ndash; A paragraph will be changed into a bulleted list.\r\n     * - `1. ` or `1) ` &ndash; A paragraph will be changed into a numbered list (\"1\" can be any digit or a list of digits).\r\n     * - `[] ` or `[ ] ` &ndash; A paragraph will be changed into a to-do list.\r\n     * - `[x] ` or `[ x ] ` &ndash; A paragraph will be changed into a checked to-do list.\r\n     */\r\n    _addListAutoformats() {\r\n        const commands = this.editor.commands;\r\n        if (commands.get('bulletedList')) {\r\n            blockAutoformatEditing(this.editor, this, /^[*-]\\s$/, 'bulletedList');\r\n        }\r\n        if (commands.get('numberedList')) {\r\n            blockAutoformatEditing(this.editor, this, /^1[.|)]\\s$/, 'numberedList');\r\n        }\r\n        if (commands.get('todoList')) {\r\n            blockAutoformatEditing(this.editor, this, /^\\[\\s?\\]\\s$/, 'todoList');\r\n        }\r\n        if (commands.get('checkTodoList')) {\r\n            blockAutoformatEditing(this.editor, this, /^\\[\\s?x\\s?\\]\\s$/, () => {\r\n                this.editor.execute('todoList');\r\n                this.editor.execute('checkTodoList');\r\n            });\r\n        }\r\n    }\r\n    /**\r\n     * Adds autoformatting related to the {@link module:basic-styles/bold~Bold},\r\n     * {@link module:basic-styles/italic~Italic}, {@link module:basic-styles/code~Code}\r\n     * and {@link module:basic-styles/strikethrough~Strikethrough}\r\n     *\r\n     * When typed:\r\n     * - `**foobar**` &ndash; `**` characters are removed and `foobar` is set to bold,\r\n     * - `__foobar__` &ndash; `__` characters are removed and `foobar` is set to bold,\r\n     * - `*foobar*` &ndash; `*` characters are removed and `foobar` is set to italic,\r\n     * - `_foobar_` &ndash; `_` characters are removed and `foobar` is set to italic,\r\n     * - ``` `foobar` &ndash; ``` ` ``` characters are removed and `foobar` is set to code,\r\n     * - `~~foobar~~` &ndash; `~~` characters are removed and `foobar` is set to strikethrough.\r\n     */\r\n    _addBasicStylesAutoformats() {\r\n        const commands = this.editor.commands;\r\n        if (commands.get('bold')) {\r\n            const boldCallback = getCallbackFunctionForInlineAutoformat(this.editor, 'bold');\r\n            inlineAutoformatEditing(this.editor, this, /(?:^|\\s)(\\*\\*)([^*]+)(\\*\\*)$/g, boldCallback);\r\n            inlineAutoformatEditing(this.editor, this, /(?:^|\\s)(__)([^_]+)(__)$/g, boldCallback);\r\n        }\r\n        if (commands.get('italic')) {\r\n            const italicCallback = getCallbackFunctionForInlineAutoformat(this.editor, 'italic');\r\n            // The italic autoformatter cannot be triggered by the bold markers, so we need to check the\r\n            // text before the pattern (e.g. `(?:^|[^\\*])`).\r\n            inlineAutoformatEditing(this.editor, this, /(?:^|\\s)(\\*)([^*_]+)(\\*)$/g, italicCallback);\r\n            inlineAutoformatEditing(this.editor, this, /(?:^|\\s)(_)([^_]+)(_)$/g, italicCallback);\r\n        }\r\n        if (commands.get('code')) {\r\n            const codeCallback = getCallbackFunctionForInlineAutoformat(this.editor, 'code');\r\n            inlineAutoformatEditing(this.editor, this, /(`)([^`]+)(`)$/g, codeCallback);\r\n        }\r\n        if (commands.get('strikethrough')) {\r\n            const strikethroughCallback = getCallbackFunctionForInlineAutoformat(this.editor, 'strikethrough');\r\n            inlineAutoformatEditing(this.editor, this, /(~~)([^~]+)(~~)$/g, strikethroughCallback);\r\n        }\r\n    }\r\n    /**\r\n     * Adds autoformatting related to {@link module:heading/heading~Heading}.\r\n     *\r\n     * It is using a number at the end of the command name to associate it with the proper trigger:\r\n     *\r\n     * * `heading` with a `heading1` value will be executed when typing `#`,\r\n     * * `heading` with a `heading2` value will be executed when typing `##`,\r\n     * * ... up to `heading6` for `######`.\r\n     */\r\n    _addHeadingAutoformats() {\r\n        const command = this.editor.commands.get('heading');\r\n        if (command) {\r\n            command.modelElements\r\n                .filter(name => name.match(/^heading[1-6]$/))\r\n                .forEach(modelName => {\r\n                const level = modelName[7];\r\n                const pattern = new RegExp(`^(#{${level}})\\\\s$`);\r\n                blockAutoformatEditing(this.editor, this, pattern, () => {\r\n                    // Should only be active if command is enabled and heading style associated with pattern is inactive.\r\n                    if (!command.isEnabled || command.value === modelName) {\r\n                        return false;\r\n                    }\r\n                    this.editor.execute('heading', { value: modelName });\r\n                });\r\n            });\r\n        }\r\n    }\r\n    /**\r\n     * Adds autoformatting related to {@link module:block-quote/blockquote~BlockQuote}.\r\n     *\r\n     * When typed:\r\n     * * `> ` &ndash; A paragraph will be changed to a block quote.\r\n     */\r\n    _addBlockQuoteAutoformats() {\r\n        if (this.editor.commands.get('blockQuote')) {\r\n            blockAutoformatEditing(this.editor, this, /^>\\s$/, 'blockQuote');\r\n        }\r\n    }\r\n    /**\r\n     * Adds autoformatting related to {@link module:code-block/codeblock~CodeBlock}.\r\n     *\r\n     * When typed:\r\n     * - `` ``` `` &ndash; A paragraph will be changed to a code block.\r\n     */\r\n    _addCodeBlockAutoformats() {\r\n        const editor = this.editor;\r\n        const selection = editor.model.document.selection;\r\n        if (editor.commands.get('codeBlock')) {\r\n            blockAutoformatEditing(editor, this, /^```$/, () => {\r\n                if (selection.getFirstPosition().parent.is('element', 'listItem')) {\r\n                    return false;\r\n                }\r\n                this.editor.execute('codeBlock', {\r\n                    usePreviousLanguageChoice: true\r\n                });\r\n            });\r\n        }\r\n    }\r\n    /**\r\n     * Adds autoformatting related to {@link module:horizontal-line/horizontalline~HorizontalLine}.\r\n     *\r\n     * When typed:\r\n     * - `` --- `` &ndash; Will be replaced with a horizontal line.\r\n     */\r\n    _addHorizontalLineAutoformats() {\r\n        if (this.editor.commands.get('horizontalLine')) {\r\n            blockAutoformatEditing(this.editor, this, /^---$/, 'horizontalLine');\r\n        }\r\n    }\r\n}\r\n/**\r\n * Helper function for getting `inlineAutoformatEditing` callbacks that checks if command is enabled.\r\n */\r\nfunction getCallbackFunctionForInlineAutoformat(editor, attributeKey) {\r\n    return (writer, rangesToFormat) => {\r\n        const command = editor.commands.get(attributeKey);\r\n        if (!command.isEnabled) {\r\n            return false;\r\n        }\r\n        const validRanges = editor.model.schema.getValidRanges(rangesToFormat, attributeKey);\r\n        for (const range of validRanges) {\r\n            writer.setAttribute(attributeKey, true, range);\r\n        }\r\n        // After applying attribute to the text, remove given attribute from the selection.\r\n        // This way user is able to type a text without attribute used by auto formatter.\r\n        writer.removeSelectionAttribute(attributeKey);\r\n    };\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module block-quote/blockquotecommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { first } from 'ckeditor5/src/utils';\r\n/**\r\n * The block quote command plugin.\r\n *\r\n * @extends module:core/command~Command\r\n */\r\nexport default class BlockQuoteCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        this.value = this._getValue();\r\n        this.isEnabled = this._checkEnabled();\r\n    }\r\n    /**\r\n     * Executes the command. When the command {@link #value is on}, all top-most block quotes within\r\n     * the selection will be removed. If it is off, all selected blocks will be wrapped with\r\n     * a block quote.\r\n     *\r\n     * @fires execute\r\n     * @param options Command options.\r\n     * @param options.forceValue If set, it will force the command behavior. If `true`, the command will apply a block quote,\r\n     * otherwise the command will remove the block quote. If not set, the command will act basing on its current value.\r\n     */\r\n    execute(options = {}) {\r\n        const model = this.editor.model;\r\n        const schema = model.schema;\r\n        const selection = model.document.selection;\r\n        const blocks = Array.from(selection.getSelectedBlocks());\r\n        const value = (options.forceValue === undefined) ? !this.value : options.forceValue;\r\n        model.change(writer => {\r\n            if (!value) {\r\n                this._removeQuote(writer, blocks.filter(findQuote));\r\n            }\r\n            else {\r\n                const blocksToQuote = blocks.filter(block => {\r\n                    // Already quoted blocks needs to be considered while quoting too\r\n                    // in order to reuse their <bQ> elements.\r\n                    return findQuote(block) || checkCanBeQuoted(schema, block);\r\n                });\r\n                this._applyQuote(writer, blocksToQuote);\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Checks the command's {@link #value}.\r\n     */\r\n    _getValue() {\r\n        const selection = this.editor.model.document.selection;\r\n        const firstBlock = first(selection.getSelectedBlocks());\r\n        // In the current implementation, the block quote must be an immediate parent of a block element.\r\n        return !!(firstBlock && findQuote(firstBlock));\r\n    }\r\n    /**\r\n     * Checks whether the command can be enabled in the current context.\r\n     *\r\n     * @returns Whether the command should be enabled.\r\n     */\r\n    _checkEnabled() {\r\n        if (this.value) {\r\n            return true;\r\n        }\r\n        const selection = this.editor.model.document.selection;\r\n        const schema = this.editor.model.schema;\r\n        const firstBlock = first(selection.getSelectedBlocks());\r\n        if (!firstBlock) {\r\n            return false;\r\n        }\r\n        return checkCanBeQuoted(schema, firstBlock);\r\n    }\r\n    /**\r\n     * Removes the quote from given blocks.\r\n     *\r\n     * If blocks which are supposed to be \"unquoted\" are in the middle of a quote,\r\n     * start it or end it, then the quote will be split (if needed) and the blocks\r\n     * will be moved out of it, so other quoted blocks remained quoted.\r\n     */\r\n    _removeQuote(writer, blocks) {\r\n        // Unquote all groups of block. Iterate in the reverse order to not break following ranges.\r\n        getRangesOfBlockGroups(writer, blocks).reverse().forEach(groupRange => {\r\n            if (groupRange.start.isAtStart && groupRange.end.isAtEnd) {\r\n                writer.unwrap(groupRange.start.parent);\r\n                return;\r\n            }\r\n            // The group of blocks are at the beginning of an <bQ> so let's move them left (out of the <bQ>).\r\n            if (groupRange.start.isAtStart) {\r\n                const positionBefore = writer.createPositionBefore(groupRange.start.parent);\r\n                writer.move(groupRange, positionBefore);\r\n                return;\r\n            }\r\n            // The blocks are in the middle of an <bQ> so we need to split the <bQ> after the last block\r\n            // so we move the items there.\r\n            if (!groupRange.end.isAtEnd) {\r\n                writer.split(groupRange.end);\r\n            }\r\n            // Now we are sure that groupRange.end.isAtEnd is true, so let's move the blocks right.\r\n            const positionAfter = writer.createPositionAfter(groupRange.end.parent);\r\n            writer.move(groupRange, positionAfter);\r\n        });\r\n    }\r\n    /**\r\n     * Applies the quote to given blocks.\r\n     */\r\n    _applyQuote(writer, blocks) {\r\n        const quotesToMerge = [];\r\n        // Quote all groups of block. Iterate in the reverse order to not break following ranges.\r\n        getRangesOfBlockGroups(writer, blocks).reverse().forEach(groupRange => {\r\n            let quote = findQuote(groupRange.start);\r\n            if (!quote) {\r\n                quote = writer.createElement('blockQuote');\r\n                writer.wrap(groupRange, quote);\r\n            }\r\n            quotesToMerge.push(quote);\r\n        });\r\n        // Merge subsequent <bQ> elements. Reverse the order again because this time we want to go through\r\n        // the <bQ> elements in the source order (due to how merge works – it moves the right element's content\r\n        // to the first element and removes the right one. Since we may need to merge a couple of subsequent `<bQ>` elements\r\n        // we want to keep the reference to the first (furthest left) one.\r\n        quotesToMerge.reverse().reduce((currentQuote, nextQuote) => {\r\n            if (currentQuote.nextSibling == nextQuote) {\r\n                writer.merge(writer.createPositionAfter(currentQuote));\r\n                return currentQuote;\r\n            }\r\n            return nextQuote;\r\n        });\r\n    }\r\n}\r\nfunction findQuote(elementOrPosition) {\r\n    return elementOrPosition.parent.name == 'blockQuote' ? elementOrPosition.parent : null;\r\n}\r\n/**\r\n * Returns a minimal array of ranges containing groups of subsequent blocks.\r\n *\r\n * content:         abcdefgh\r\n * blocks:          [ a, b, d, f, g, h ]\r\n * output ranges:   [ab]c[d]e[fgh]\r\n */\r\nfunction getRangesOfBlockGroups(writer, blocks) {\r\n    let startPosition;\r\n    let i = 0;\r\n    const ranges = [];\r\n    while (i < blocks.length) {\r\n        const block = blocks[i];\r\n        const nextBlock = blocks[i + 1];\r\n        if (!startPosition) {\r\n            startPosition = writer.createPositionBefore(block);\r\n        }\r\n        if (!nextBlock || block.nextSibling != nextBlock) {\r\n            ranges.push(writer.createRange(startPosition, writer.createPositionAfter(block)));\r\n            startPosition = null;\r\n        }\r\n        i++;\r\n    }\r\n    return ranges;\r\n}\r\n/**\r\n * Checks whether <bQ> can wrap the block.\r\n */\r\nfunction checkCanBeQuoted(schema, block) {\r\n    // TMP will be replaced with schema.checkWrap().\r\n    const isBQAllowed = schema.checkChild(block.parent, 'blockQuote');\r\n    const isBlockAllowedInBQ = schema.checkChild(['$root', 'blockQuote'], block);\r\n    return isBQAllowed && isBlockAllowedInBQ;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module block-quote/blockquoteediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { Enter } from 'ckeditor5/src/enter';\r\nimport { Delete } from 'ckeditor5/src/typing';\r\nimport BlockQuoteCommand from './blockquotecommand';\r\n/**\r\n * The block quote editing.\r\n *\r\n * Introduces the `'blockQuote'` command and the `'blockQuote'` model element.\r\n *\r\n * @extends module:core/plugin~Plugin\r\n */\r\nexport default class BlockQuoteEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'BlockQuoteEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [Enter, Delete];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const schema = editor.model.schema;\r\n        editor.commands.add('blockQuote', new BlockQuoteCommand(editor));\r\n        schema.register('blockQuote', {\r\n            inheritAllFrom: '$container'\r\n        });\r\n        editor.conversion.elementToElement({ model: 'blockQuote', view: 'blockquote' });\r\n        // Postfixer which cleans incorrect model states connected with block quotes.\r\n        editor.model.document.registerPostFixer(writer => {\r\n            const changes = editor.model.document.differ.getChanges();\r\n            for (const entry of changes) {\r\n                if (entry.type == 'insert') {\r\n                    const element = entry.position.nodeAfter;\r\n                    if (!element) {\r\n                        // We are inside a text node.\r\n                        continue;\r\n                    }\r\n                    if (element.is('element', 'blockQuote') && element.isEmpty) {\r\n                        // Added an empty blockQuote - remove it.\r\n                        writer.remove(element);\r\n                        return true;\r\n                    }\r\n                    else if (element.is('element', 'blockQuote') && !schema.checkChild(entry.position, element)) {\r\n                        // Added a blockQuote in incorrect place. Unwrap it so the content inside is not lost.\r\n                        writer.unwrap(element);\r\n                        return true;\r\n                    }\r\n                    else if (element.is('element')) {\r\n                        // Just added an element. Check that all children meet the scheme rules.\r\n                        const range = writer.createRangeIn(element);\r\n                        for (const child of range.getItems()) {\r\n                            if (child.is('element', 'blockQuote') &&\r\n                                !schema.checkChild(writer.createPositionBefore(child), child)) {\r\n                                writer.unwrap(child);\r\n                                return true;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                else if (entry.type == 'remove') {\r\n                    const parent = entry.position.parent;\r\n                    if (parent.is('element', 'blockQuote') && parent.isEmpty) {\r\n                        // Something got removed and now blockQuote is empty. Remove the blockQuote as well.\r\n                        writer.remove(parent);\r\n                        return true;\r\n                    }\r\n                }\r\n            }\r\n            return false;\r\n        });\r\n        const viewDocument = this.editor.editing.view.document;\r\n        const selection = editor.model.document.selection;\r\n        const blockQuoteCommand = editor.commands.get('blockQuote');\r\n        // Overwrite default Enter key behavior.\r\n        // If Enter key is pressed with selection collapsed in empty block inside a quote, break the quote.\r\n        this.listenTo(viewDocument, 'enter', (evt, data) => {\r\n            if (!selection.isCollapsed || !blockQuoteCommand.value) {\r\n                return;\r\n            }\r\n            const positionParent = selection.getLastPosition().parent;\r\n            if (positionParent.isEmpty) {\r\n                editor.execute('blockQuote');\r\n                editor.editing.view.scrollToTheSelection();\r\n                data.preventDefault();\r\n                evt.stop();\r\n            }\r\n        }, { context: 'blockquote' });\r\n        // Overwrite default Backspace key behavior.\r\n        // If Backspace key is pressed with selection collapsed in first empty block inside a quote, break the quote.\r\n        this.listenTo(viewDocument, 'delete', (evt, data) => {\r\n            if (data.direction != 'backward' || !selection.isCollapsed || !blockQuoteCommand.value) {\r\n                return;\r\n            }\r\n            const positionParent = selection.getLastPosition().parent;\r\n            if (positionParent.isEmpty && !positionParent.previousSibling) {\r\n                editor.execute('blockQuote');\r\n                editor.editing.view.scrollToTheSelection();\r\n                data.preventDefault();\r\n                evt.stop();\r\n            }\r\n        }, { context: 'blockquote' });\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./blockquote.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module block-quote/blockquoteui\r\n */\r\nimport { Plugin, icons } from 'ckeditor5/src/core';\r\nimport { ButtonView } from 'ckeditor5/src/ui';\r\nimport '../theme/blockquote.css';\r\n/**\r\n * The block quote UI plugin.\r\n *\r\n * It introduces the `'blockQuote'` button.\r\n *\r\n * @extends module:core/plugin~Plugin\r\n */\r\nexport default class BlockQuoteUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'BlockQuoteUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        editor.ui.componentFactory.add('blockQuote', locale => {\r\n            const command = editor.commands.get('blockQuote');\r\n            const buttonView = new ButtonView(locale);\r\n            buttonView.set({\r\n                label: t('Block quote'),\r\n                icon: icons.quote,\r\n                tooltip: true,\r\n                isToggleable: true\r\n            });\r\n            // Bind button model to command.\r\n            buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\r\n            // Execute command.\r\n            this.listenTo(buttonView, 'execute', () => {\r\n                editor.execute('blockQuote');\r\n                editor.editing.view.focus();\r\n            });\r\n            return buttonView;\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module basic-styles/attributecommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\n/**\r\n * An extension of the base {@link module:core/command~Command} class, which provides utilities for a command\r\n * that toggles a single attribute on a text or an element.\r\n *\r\n * `AttributeCommand` uses {@link module:engine/model/document~Document#selection}\r\n * to decide which nodes (if any) should be changed, and applies or removes the attribute from them.\r\n *\r\n * The command checks the {@link module:engine/model/model~Model#schema} to decide if it can be enabled\r\n * for the current selection and to which nodes the attribute can be applied.\r\n */\r\nexport default class AttributeCommand extends Command {\r\n    /**\r\n     * @param attributeKey Attribute that will be set by the command.\r\n     */\r\n    constructor(editor, attributeKey) {\r\n        super(editor);\r\n        this.attributeKey = attributeKey;\r\n    }\r\n    /**\r\n     * Updates the command's {@link #value} and {@link #isEnabled} based on the current selection.\r\n     */\r\n    refresh() {\r\n        const model = this.editor.model;\r\n        const doc = model.document;\r\n        this.value = this._getValueFromFirstAllowedNode();\r\n        this.isEnabled = model.schema.checkAttributeInSelection(doc.selection, this.attributeKey);\r\n    }\r\n    /**\r\n     * Executes the command &mdash; applies the attribute to the selection or removes it from the selection.\r\n     *\r\n     * If the command is active (`value == true`), it will remove attributes. Otherwise, it will set attributes.\r\n     *\r\n     * The execution result differs, depending on the {@link module:engine/model/document~Document#selection}:\r\n     *\r\n     * * If the selection is on a range, the command applies the attribute to all nodes in that range\r\n     * (if they are allowed to have this attribute by the {@link module:engine/model/schema~Schema schema}).\r\n     * * If the selection is collapsed in a non-empty node, the command applies the attribute to the\r\n     * {@link module:engine/model/document~Document#selection} itself (note that typed characters copy attributes from the selection).\r\n     * * If the selection is collapsed in an empty node, the command applies the attribute to the parent node of the selection (note\r\n     * that the selection inherits all attributes from a node if it is in an empty node).\r\n     *\r\n     * @fires execute\r\n     * @param options Command options.\r\n     * @param options.forceValue If set, it will force the command behavior. If `true`,\r\n     * the command will apply the attribute, otherwise the command will remove the attribute.\r\n     * If not set, the command will look for its current value to decide what it should do.\r\n     */\r\n    execute(options = {}) {\r\n        const model = this.editor.model;\r\n        const doc = model.document;\r\n        const selection = doc.selection;\r\n        const value = (options.forceValue === undefined) ? !this.value : options.forceValue;\r\n        model.change(writer => {\r\n            if (selection.isCollapsed) {\r\n                if (value) {\r\n                    writer.setSelectionAttribute(this.attributeKey, true);\r\n                }\r\n                else {\r\n                    writer.removeSelectionAttribute(this.attributeKey);\r\n                }\r\n            }\r\n            else {\r\n                const ranges = model.schema.getValidRanges(selection.getRanges(), this.attributeKey);\r\n                for (const range of ranges) {\r\n                    if (value) {\r\n                        writer.setAttribute(this.attributeKey, value, range);\r\n                    }\r\n                    else {\r\n                        writer.removeAttribute(this.attributeKey, range);\r\n                    }\r\n                }\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Checks the attribute value of the first node in the selection that allows the attribute.\r\n     * For the collapsed selection returns the selection attribute.\r\n     *\r\n     * @returns The attribute value.\r\n     */\r\n    _getValueFromFirstAllowedNode() {\r\n        const model = this.editor.model;\r\n        const schema = model.schema;\r\n        const selection = model.document.selection;\r\n        if (selection.isCollapsed) {\r\n            return selection.hasAttribute(this.attributeKey);\r\n        }\r\n        for (const range of selection.getRanges()) {\r\n            for (const item of range.getItems()) {\r\n                if (schema.checkAttribute(item, this.attributeKey)) {\r\n                    return item.hasAttribute(this.attributeKey);\r\n                }\r\n            }\r\n        }\r\n        return false;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module basic-styles/bold/boldediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport AttributeCommand from '../attributecommand';\r\nconst BOLD = 'bold';\r\n/**\r\n * The bold editing feature.\r\n *\r\n * It registers the `'bold'` command and introduces the `bold` attribute in the model which renders to the view\r\n * as a `<strong>` element.\r\n */\r\nexport default class BoldEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'BoldEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        // Allow bold attribute on text nodes.\r\n        editor.model.schema.extend('$text', { allowAttributes: BOLD });\r\n        editor.model.schema.setAttributeProperties(BOLD, {\r\n            isFormatting: true,\r\n            copyOnEnter: true\r\n        });\r\n        // Build converter from model to view for data and editing pipelines.\r\n        editor.conversion.attributeToElement({\r\n            model: BOLD,\r\n            view: 'strong',\r\n            upcastAlso: [\r\n                'b',\r\n                viewElement => {\r\n                    const fontWeight = viewElement.getStyle('font-weight');\r\n                    if (!fontWeight) {\r\n                        return null;\r\n                    }\r\n                    // Value of the `font-weight` attribute can be defined as a string or a number.\r\n                    if (fontWeight == 'bold' || Number(fontWeight) >= 600) {\r\n                        return {\r\n                            name: true,\r\n                            styles: ['font-weight']\r\n                        };\r\n                    }\r\n                    return null;\r\n                }\r\n            ]\r\n        });\r\n        // Create bold command.\r\n        editor.commands.add(BOLD, new AttributeCommand(editor, BOLD));\r\n        // Set the Ctrl+B keystroke.\r\n        editor.keystrokes.set('CTRL+B', BOLD);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module basic-styles/bold/boldui\r\n */\r\nimport { Plugin, icons } from 'ckeditor5/src/core';\r\nimport { ButtonView } from 'ckeditor5/src/ui';\r\nconst BOLD = 'bold';\r\n/**\r\n * The bold UI feature. It introduces the Bold button.\r\n */\r\nexport default class BoldUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'BoldUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        // Add bold button to feature components.\r\n        editor.ui.componentFactory.add(BOLD, locale => {\r\n            const command = editor.commands.get(BOLD);\r\n            const view = new ButtonView(locale);\r\n            view.set({\r\n                label: t('Bold'),\r\n                icon: icons.bold,\r\n                keystroke: 'CTRL+B',\r\n                tooltip: true,\r\n                isToggleable: true\r\n            });\r\n            view.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\r\n            // Execute command.\r\n            this.listenTo(view, 'execute', () => {\r\n                editor.execute(BOLD);\r\n                editor.editing.view.focus();\r\n            });\r\n            return view;\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module cloud-services/token/token\r\n */\r\n/* globals XMLHttpRequest, setTimeout, clearTimeout, atob */\r\nimport { ObservableMixin, CKEditorError } from 'ckeditor5/src/utils';\r\nconst DEFAULT_OPTIONS = { autoRefresh: true };\r\nconst DEFAULT_TOKEN_REFRESH_TIMEOUT_TIME = 3600000;\r\n/**\r\n * Class representing the token used for communication with CKEditor Cloud Services.\r\n * Value of the token is retrieving from the specified URL and is refreshed every 1 hour by default.\r\n */\r\nexport default class Token extends ObservableMixin() {\r\n    /**\r\n     * Creates `Token` instance.\r\n     * Method `init` should be called after using the constructor or use `create` method instead.\r\n     *\r\n     * @param tokenUrlOrRefreshToken Endpoint address to download the token or a callback that provides the token. If the\r\n     * value is a function it has to match the {@link module:cloud-services/token/token~Token#refreshToken} interface.\r\n     */\r\n    constructor(tokenUrlOrRefreshToken, options = {}) {\r\n        super();\r\n        if (!tokenUrlOrRefreshToken) {\r\n            /**\r\n             * A `tokenUrl` must be provided as the first constructor argument.\r\n             *\r\n             * @error token-missing-token-url\r\n             */\r\n            throw new CKEditorError('token-missing-token-url', this);\r\n        }\r\n        if (options.initValue) {\r\n            this._validateTokenValue(options.initValue);\r\n        }\r\n        this.set('value', options.initValue);\r\n        if (typeof tokenUrlOrRefreshToken === 'function') {\r\n            this._refresh = tokenUrlOrRefreshToken;\r\n        }\r\n        else {\r\n            this._refresh = () => defaultRefreshToken(tokenUrlOrRefreshToken);\r\n        }\r\n        this._options = { ...DEFAULT_OPTIONS, ...options };\r\n    }\r\n    /**\r\n     * Initializes the token.\r\n     */\r\n    init() {\r\n        return new Promise((resolve, reject) => {\r\n            if (!this.value) {\r\n                this.refreshToken()\r\n                    .then(resolve)\r\n                    .catch(reject);\r\n                return;\r\n            }\r\n            if (this._options.autoRefresh) {\r\n                this._registerRefreshTokenTimeout();\r\n            }\r\n            resolve(this);\r\n        });\r\n    }\r\n    /**\r\n     * Refresh token method. Useful in a method form as it can be override in tests.\r\n     */\r\n    refreshToken() {\r\n        return this._refresh()\r\n            .then(value => {\r\n            this._validateTokenValue(value);\r\n            this.set('value', value);\r\n            if (this._options.autoRefresh) {\r\n                this._registerRefreshTokenTimeout();\r\n            }\r\n            return this;\r\n        });\r\n    }\r\n    /**\r\n     * Destroys token instance. Stops refreshing.\r\n     */\r\n    destroy() {\r\n        clearTimeout(this._tokenRefreshTimeout);\r\n    }\r\n    /**\r\n     * Checks whether the provided token follows the JSON Web Tokens (JWT) format.\r\n     *\r\n     * @param tokenValue The token to validate.\r\n     */\r\n    _validateTokenValue(tokenValue) {\r\n        // The token must be a string.\r\n        const isString = typeof tokenValue === 'string';\r\n        // The token must be a plain string without quotes (\"\").\r\n        const isPlainString = !/^\".*\"$/.test(tokenValue);\r\n        // JWT token contains 3 parts: header, payload, and signature.\r\n        // Each part is separated by a dot.\r\n        const isJWTFormat = isString && tokenValue.split('.').length === 3;\r\n        if (!(isPlainString && isJWTFormat)) {\r\n            /**\r\n             * The provided token must follow the [JSON Web Tokens](https://jwt.io/introduction/) format.\r\n             *\r\n             * @error token-not-in-jwt-format\r\n             */\r\n            throw new CKEditorError('token-not-in-jwt-format', this);\r\n        }\r\n    }\r\n    /**\r\n     * Registers a refresh token timeout for the time taken from token.\r\n     */\r\n    _registerRefreshTokenTimeout() {\r\n        const tokenRefreshTimeoutTime = this._getTokenRefreshTimeoutTime();\r\n        clearTimeout(this._tokenRefreshTimeout);\r\n        this._tokenRefreshTimeout = setTimeout(() => {\r\n            this.refreshToken();\r\n        }, tokenRefreshTimeoutTime);\r\n    }\r\n    /**\r\n     * Returns token refresh timeout time calculated from expire time in the token payload.\r\n     *\r\n     * If the token parse fails or the token payload doesn't contain, the default DEFAULT_TOKEN_REFRESH_TIMEOUT_TIME is returned.\r\n     */\r\n    _getTokenRefreshTimeoutTime() {\r\n        try {\r\n            const [, binaryTokenPayload] = this.value.split('.');\r\n            const { exp: tokenExpireTime } = JSON.parse(atob(binaryTokenPayload));\r\n            if (!tokenExpireTime) {\r\n                return DEFAULT_TOKEN_REFRESH_TIMEOUT_TIME;\r\n            }\r\n            const tokenRefreshTimeoutTime = Math.floor(((tokenExpireTime * 1000) - Date.now()) / 2);\r\n            return tokenRefreshTimeoutTime;\r\n        }\r\n        catch (err) {\r\n            return DEFAULT_TOKEN_REFRESH_TIMEOUT_TIME;\r\n        }\r\n    }\r\n    /**\r\n     * Creates a initialized {@link module:cloud-services/token/token~Token} instance.\r\n     *\r\n     * @param tokenUrlOrRefreshToken Endpoint address to download the token or a callback that provides the token. If the\r\n     * value is a function it has to match the {@link module:cloud-services/token/token~Token#refreshToken} interface.\r\n     */\r\n    static create(tokenUrlOrRefreshToken, options = {}) {\r\n        const token = new Token(tokenUrlOrRefreshToken, options);\r\n        return token.init();\r\n    }\r\n}\r\n/**\r\n * This function is called in a defined interval by the {@link ~Token} class. It also can be invoked manually.\r\n * It should return a promise, which resolves with the new token value.\r\n * If any error occurs it should return a rejected promise with an error message.\r\n */\r\nfunction defaultRefreshToken(tokenUrl) {\r\n    return new Promise((resolve, reject) => {\r\n        const xhr = new XMLHttpRequest();\r\n        xhr.open('GET', tokenUrl);\r\n        xhr.addEventListener('load', () => {\r\n            const statusCode = xhr.status;\r\n            const xhrResponse = xhr.response;\r\n            if (statusCode < 200 || statusCode > 299) {\r\n                /**\r\n                 * Cannot download new token from the provided url.\r\n                 *\r\n                 * @error token-cannot-download-new-token\r\n                 */\r\n                return reject(new CKEditorError('token-cannot-download-new-token', null));\r\n            }\r\n            return resolve(xhrResponse);\r\n        });\r\n        xhr.addEventListener('error', () => reject(new Error('Network Error')));\r\n        xhr.addEventListener('abort', () => reject(new Error('Abort')));\r\n        xhr.send();\r\n    });\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { EmitterMixin, CKEditorError } from 'ckeditor5/src/utils';\r\nconst BASE64_HEADER_REG_EXP = /^data:(\\S*?);base64,/;\r\n/**\r\n * FileUploader class used to upload single file.\r\n */\r\nexport default class FileUploader extends EmitterMixin() {\r\n    /**\r\n     * Creates `FileUploader` instance.\r\n     *\r\n     * @param fileOrData A blob object or a data string encoded with Base64.\r\n     * @param token Token used for authentication.\r\n     * @param apiAddress API address.\r\n     */\r\n    constructor(fileOrData, token, apiAddress) {\r\n        super();\r\n        if (!fileOrData) {\r\n            /**\r\n             * File must be provided as the first argument.\r\n             *\r\n             * @error fileuploader-missing-file\r\n             */\r\n            throw new CKEditorError('fileuploader-missing-file', null);\r\n        }\r\n        if (!token) {\r\n            /**\r\n             * Token must be provided as the second argument.\r\n             *\r\n             * @error fileuploader-missing-token\r\n             */\r\n            throw new CKEditorError('fileuploader-missing-token', null);\r\n        }\r\n        if (!apiAddress) {\r\n            /**\r\n             * Api address must be provided as the third argument.\r\n             *\r\n             * @error fileuploader-missing-api-address\r\n             */\r\n            throw new CKEditorError('fileuploader-missing-api-address', null);\r\n        }\r\n        this.file = _isBase64(fileOrData) ? _base64ToBlob(fileOrData) : fileOrData;\r\n        this._token = token;\r\n        this._apiAddress = apiAddress;\r\n    }\r\n    /**\r\n     * Registers callback on `progress` event.\r\n     */\r\n    onProgress(callback) {\r\n        this.on('progress', (event, data) => callback(data));\r\n        return this;\r\n    }\r\n    /**\r\n     * Registers callback on `error` event. Event is called once when error occurs.\r\n     */\r\n    onError(callback) {\r\n        this.once('error', (event, data) => callback(data));\r\n        return this;\r\n    }\r\n    /**\r\n     * Aborts upload process.\r\n     */\r\n    abort() {\r\n        this.xhr.abort();\r\n    }\r\n    /**\r\n     * Sends XHR request to API.\r\n     */\r\n    send() {\r\n        this._prepareRequest();\r\n        this._attachXHRListeners();\r\n        return this._sendRequest();\r\n    }\r\n    /**\r\n     * Prepares XHR request.\r\n     */\r\n    _prepareRequest() {\r\n        const xhr = new XMLHttpRequest();\r\n        xhr.open('POST', this._apiAddress);\r\n        xhr.setRequestHeader('Authorization', this._token.value);\r\n        xhr.responseType = 'json';\r\n        this.xhr = xhr;\r\n    }\r\n    /**\r\n     * Attaches listeners to the XHR.\r\n     */\r\n    _attachXHRListeners() {\r\n        const xhr = this.xhr;\r\n        const onError = (message) => {\r\n            return () => this.fire('error', message);\r\n        };\r\n        xhr.addEventListener('error', onError('Network Error'));\r\n        xhr.addEventListener('abort', onError('Abort'));\r\n        /* istanbul ignore else -- @preserve */\r\n        if (xhr.upload) {\r\n            xhr.upload.addEventListener('progress', event => {\r\n                if (event.lengthComputable) {\r\n                    this.fire('progress', {\r\n                        total: event.total,\r\n                        uploaded: event.loaded\r\n                    });\r\n                }\r\n            });\r\n        }\r\n        xhr.addEventListener('load', () => {\r\n            const statusCode = xhr.status;\r\n            const xhrResponse = xhr.response;\r\n            if (statusCode < 200 || statusCode > 299) {\r\n                return this.fire('error', xhrResponse.message || xhrResponse.error);\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Sends XHR request.\r\n     */\r\n    _sendRequest() {\r\n        const formData = new FormData();\r\n        const xhr = this.xhr;\r\n        formData.append('file', this.file);\r\n        return new Promise((resolve, reject) => {\r\n            xhr.addEventListener('load', () => {\r\n                const statusCode = xhr.status;\r\n                const xhrResponse = xhr.response;\r\n                if (statusCode < 200 || statusCode > 299) {\r\n                    if (xhrResponse.message) {\r\n                        /**\r\n                         * Uploading file failed.\r\n                         *\r\n                         * @error fileuploader-uploading-data-failed\r\n                         */\r\n                        return reject(new CKEditorError('fileuploader-uploading-data-failed', this, { message: xhrResponse.message }));\r\n                    }\r\n                    return reject(xhrResponse.error);\r\n                }\r\n                return resolve(xhrResponse);\r\n            });\r\n            xhr.addEventListener('error', () => reject(new Error('Network Error')));\r\n            xhr.addEventListener('abort', () => reject(new Error('Abort')));\r\n            xhr.send(formData);\r\n        });\r\n    }\r\n}\r\n/**\r\n * Transforms Base64 string data into file.\r\n *\r\n * @param base64 String data.\r\n */\r\nfunction _base64ToBlob(base64, sliceSize = 512) {\r\n    try {\r\n        const contentType = base64.match(BASE64_HEADER_REG_EXP)[1];\r\n        const base64Data = atob(base64.replace(BASE64_HEADER_REG_EXP, ''));\r\n        const byteArrays = [];\r\n        for (let offset = 0; offset < base64Data.length; offset += sliceSize) {\r\n            const slice = base64Data.slice(offset, offset + sliceSize);\r\n            const byteNumbers = new Array(slice.length);\r\n            for (let i = 0; i < slice.length; i++) {\r\n                byteNumbers[i] = slice.charCodeAt(i);\r\n            }\r\n            byteArrays.push(new Uint8Array(byteNumbers));\r\n        }\r\n        return new Blob(byteArrays, { type: contentType });\r\n    }\r\n    catch (error) {\r\n        /**\r\n         * Problem with decoding Base64 image data.\r\n         *\r\n         * @error fileuploader-decoding-image-data-error\r\n         */\r\n        throw new CKEditorError('fileuploader-decoding-image-data-error', null);\r\n    }\r\n}\r\n/**\r\n * Checks that string is Base64.\r\n */\r\nfunction _isBase64(string) {\r\n    if (typeof string !== 'string') {\r\n        return false;\r\n    }\r\n    const match = string.match(BASE64_HEADER_REG_EXP);\r\n    return !!(match && match.length);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module cloud-services/uploadgateway/uploadgateway\r\n */\r\nimport FileUploader from './fileuploader';\r\nimport { CKEditorError } from 'ckeditor5/src/utils';\r\n/**\r\n * UploadGateway abstracts file uploads to CKEditor Cloud Services.\r\n */\r\nexport default class UploadGateway {\r\n    /**\r\n     * Creates `UploadGateway` instance.\r\n     *\r\n     * @param token Token used for authentication.\r\n     * @param apiAddress API address.\r\n     */\r\n    constructor(token, apiAddress) {\r\n        if (!token) {\r\n            /**\r\n             * Token must be provided.\r\n             *\r\n             * @error uploadgateway-missing-token\r\n             */\r\n            throw new CKEditorError('uploadgateway-missing-token', null);\r\n        }\r\n        if (!apiAddress) {\r\n            /**\r\n             * Api address must be provided.\r\n             *\r\n             * @error uploadgateway-missing-api-address\r\n             */\r\n            throw new CKEditorError('uploadgateway-missing-api-address', null);\r\n        }\r\n        this._token = token;\r\n        this._apiAddress = apiAddress;\r\n    }\r\n    /**\r\n     * Creates a {@link module:cloud-services/uploadgateway/fileuploader~FileUploader} instance that wraps\r\n     * file upload process. The file is being sent at a time when the\r\n     * {@link module:cloud-services/uploadgateway/fileuploader~FileUploader#send} method is called.\r\n     *\r\n     * ```ts\r\n     * const token = await Token.create( 'https://token-endpoint' );\r\n     * new UploadGateway( token, 'https://example.org' )\r\n     * \t.upload( 'FILE' )\r\n     * \t.onProgress( ( data ) => console.log( data ) )\r\n     * \t.send()\r\n     * \t.then( ( response ) => console.log( response ) );\r\n     * ```\r\n     *\r\n     * @param {Blob|String} fileOrData A blob object or a data string encoded with Base64.\r\n     * @returns {module:cloud-services/uploadgateway/fileuploader~FileUploader} Returns `FileUploader` instance.\r\n     */\r\n    upload(fileOrData) {\r\n        return new FileUploader(fileOrData, this._token, this._apiAddress);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module cloud-services/cloudservicescore\r\n */\r\nimport { ContextPlugin } from 'ckeditor5/src/core';\r\nimport Token from './token/token';\r\nimport UploadGateway from './uploadgateway/uploadgateway';\r\n/**\r\n * The `CloudServicesCore` plugin exposes the base API for communication with CKEditor Cloud Services.\r\n */\r\nexport default class CloudServicesCore extends ContextPlugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'CloudServicesCore';\r\n    }\r\n    /**\r\n     * Creates the {@link module:cloud-services/token/token~Token} instance.\r\n     *\r\n     * @param tokenUrlOrRefreshToken Endpoint address to download the token or a callback that provides the token. If the\r\n     * value is a function it has to match the {@link module:cloud-services/token/token~Token#refreshToken} interface.\r\n     * @param options.initValue Initial value of the token.\r\n     * @param options.autoRefresh Specifies whether to start the refresh automatically.\r\n     */\r\n    createToken(tokenUrlOrRefreshToken, options) {\r\n        return new Token(tokenUrlOrRefreshToken, options);\r\n    }\r\n    /**\r\n     * Creates the {@link module:cloud-services/uploadgateway/uploadgateway~UploadGateway} instance.\r\n     *\r\n     * @param token Token used for authentication.\r\n     * @param apiAddress API address.\r\n     */\r\n    createUploadGateway(token, apiAddress) {\r\n        return new UploadGateway(token, apiAddress);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { first } from 'ckeditor5/src/utils';\r\n/**\r\n * Returns code block languages as defined in `config.codeBlock.languages` but processed:\r\n *\r\n * * To consider the editor localization, i.e. to display {@link module:code-block/codeblockconfig~CodeBlockLanguageDefinition}\r\n * in the correct language. There is no way to use {@link module:utils/locale~Locale#t} when the user\r\n * configuration is defined because the editor does not exist yet.\r\n * * To make sure each definition has a CSS class associated with it even if not specified\r\n * in the original configuration.\r\n */\r\nexport function getNormalizedAndLocalizedLanguageDefinitions(editor) {\r\n    const t = editor.t;\r\n    const languageDefs = editor.config.get('codeBlock.languages');\r\n    for (const def of languageDefs) {\r\n        if (def.label === 'Plain text') {\r\n            def.label = t('Plain text');\r\n        }\r\n        if (def.class === undefined) {\r\n            def.class = `language-${def.language}`;\r\n        }\r\n    }\r\n    return languageDefs;\r\n}\r\n/**\r\n * Returns an object associating certain language definition properties with others. For instance:\r\n *\r\n * For:\r\n *\r\n * ```ts\r\n * const definitions = {\r\n * \t{ language: 'php', class: 'language-php', label: 'PHP' },\r\n * \t{ language: 'javascript', class: 'js', label: 'JavaScript' },\r\n * };\r\n *\r\n * getPropertyAssociation( definitions, 'class', 'language' );\r\n * ```\r\n *\r\n * returns:\r\n *\r\n * ```ts\r\n * {\r\n * \t'language-php': 'php',\r\n * \t'js': 'javascript'\r\n * }\r\n * ```\r\n *\r\n * and\r\n *\r\n * ```ts\r\n * getPropertyAssociation( definitions, 'language', 'label' );\r\n * ```\r\n *\r\n * returns:\r\n *\r\n * ```ts\r\n * {\r\n * \t'php': 'PHP',\r\n * \t'javascript': 'JavaScript'\r\n * }\r\n * ```\r\n */\r\nexport function getPropertyAssociation(languageDefs, key, value) {\r\n    const association = {};\r\n    for (const def of languageDefs) {\r\n        if (key === 'class') {\r\n            // Only the first class is considered.\r\n            const newKey = (def[key]).split(' ').shift();\r\n            association[newKey] = def[value];\r\n        }\r\n        else {\r\n            association[def[key]] = def[value];\r\n        }\r\n    }\r\n    return association;\r\n}\r\n/**\r\n * For a given model text node, it returns white spaces that precede other characters in that node.\r\n * This corresponds to the indentation part of the code block line.\r\n */\r\nexport function getLeadingWhiteSpaces(textNode) {\r\n    return textNode.data.match(/^(\\s*)/)[0];\r\n}\r\n/**\r\n * For plain text containing the code (a snippet), it returns a document fragment containing\r\n * view text nodes separated by `<br>` elements (in place of new line characters \"\\n\"), for instance:\r\n *\r\n * Input:\r\n *\r\n * ```ts\r\n * \"foo()\\n\r\n * bar()\"\r\n * ```\r\n *\r\n * Output:\r\n *\r\n * ```html\r\n * <DocumentFragment>\r\n * \t\"foo()\"\r\n * \t<br/>\r\n * \t\"bar()\"\r\n * </DocumentFragment>\r\n * ```\r\n *\r\n * @param text The raw code text to be converted.\r\n */\r\nexport function rawSnippetTextToViewDocumentFragment(writer, text) {\r\n    const fragment = writer.createDocumentFragment();\r\n    const textLines = text.split('\\n');\r\n    const items = textLines.reduce((nodes, line, lineIndex) => {\r\n        nodes.push(line);\r\n        if (lineIndex < textLines.length - 1) {\r\n            nodes.push(writer.createElement('br'));\r\n        }\r\n        return nodes;\r\n    }, []);\r\n    writer.appendChild(items, fragment);\r\n    return fragment;\r\n}\r\n/**\r\n * Returns an array of all model positions within the selection that represent code block lines.\r\n *\r\n * If the selection is collapsed, it returns the exact selection anchor position:\r\n *\r\n * ```html\r\n * <codeBlock>[]foo</codeBlock>        ->     <codeBlock>^foo</codeBlock>\r\n * <codeBlock>foo[]bar</codeBlock>     ->     <codeBlock>foo^bar</codeBlock>\r\n * ```\r\n *\r\n * Otherwise, it returns positions **before** each text node belonging to all code blocks contained by the selection:\r\n *\r\n * ```html\r\n * <codeBlock>                                <codeBlock>\r\n *     foo[bar                                   ^foobar\r\n *     <softBreak></softBreak>         ->        <softBreak></softBreak>\r\n *     baz]qux                                   ^bazqux\r\n * </codeBlock>                               </codeBlock>\r\n * ```\r\n *\r\n * It also works across other non–code blocks:\r\n *\r\n * ```html\r\n * <codeBlock>                                <codeBlock>\r\n *     foo[bar                                   ^foobar\r\n * </codeBlock>                               </codeBlock>\r\n * <paragraph>text</paragraph>         ->     <paragraph>text</paragraph>\r\n * <codeBlock>                                <codeBlock>\r\n *     baz]qux                                   ^bazqux\r\n * </codeBlock>                               </codeBlock>\r\n * ```\r\n *\r\n * **Note:** The positions are in reverse order so they do not get outdated when iterating over them and\r\n * the writer inserts or removes elements at the same time.\r\n *\r\n * **Note:** The position is located after the leading white spaces in the text node.\r\n */\r\nexport function getIndentOutdentPositions(model) {\r\n    const selection = model.document.selection;\r\n    const positions = [];\r\n    // When the selection is collapsed, there's only one position we can indent or outdent.\r\n    if (selection.isCollapsed) {\r\n        return [selection.anchor];\r\n    }\r\n    // When the selection is NOT collapsed, collect all positions starting before text nodes\r\n    // (code lines) in any <codeBlock> within the selection.\r\n    // Walk backward so positions we are about to collect here do not get outdated when\r\n    // inserting or deleting using the writer.\r\n    const walker = selection.getFirstRange().getWalker({\r\n        ignoreElementEnd: true,\r\n        direction: 'backward'\r\n    });\r\n    for (const { item } of walker) {\r\n        if (!item.is('$textProxy')) {\r\n            continue;\r\n        }\r\n        const { parent, startOffset } = item.textNode;\r\n        if (!parent.is('element', 'codeBlock')) {\r\n            continue;\r\n        }\r\n        const leadingWhiteSpaces = getLeadingWhiteSpaces(item.textNode);\r\n        // Make sure the position is after all leading whitespaces in the text node.\r\n        const position = model.createPositionAt(parent, startOffset + leadingWhiteSpaces.length);\r\n        positions.push(position);\r\n    }\r\n    return positions;\r\n}\r\n/**\r\n * Checks if any of the blocks within the model selection is a code block.\r\n */\r\nexport function isModelSelectionInCodeBlock(selection) {\r\n    const firstBlock = first(selection.getSelectedBlocks());\r\n    return !!firstBlock && firstBlock.is('element', 'codeBlock');\r\n}\r\n/**\r\n * Checks if an {@link module:engine/model/element~Element Element} can become a code block.\r\n *\r\n * @param schema Model's schema.\r\n * @param element The element to be checked.\r\n * @returns Check result.\r\n */\r\nexport function canBeCodeBlock(schema, element) {\r\n    if (element.is('rootElement') || schema.isLimit(element)) {\r\n        return false;\r\n    }\r\n    return schema.checkChild(element.parent, 'codeBlock');\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { first } from 'ckeditor5/src/utils';\r\nimport { getNormalizedAndLocalizedLanguageDefinitions, canBeCodeBlock } from './utils';\r\n/**\r\n * The code block command plugin.\r\n */\r\nexport default class CodeBlockCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        this._lastLanguage = null;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        this.value = this._getValue();\r\n        this.isEnabled = this._checkEnabled();\r\n    }\r\n    /**\r\n     * Executes the command. When the command {@link #value is on}, all topmost code blocks within\r\n     * the selection will be removed. If it is off, all selected blocks will be flattened and\r\n     * wrapped by a code block.\r\n     *\r\n     * @fires execute\r\n     * @param options Command options.\r\n     * @param options.language The code block language.\r\n     * @param options.forceValue If set, it will force the command behavior. If `true`, the command will apply a code block,\r\n     * otherwise the command will remove the code block. If not set, the command will act basing on its current value.\r\n     * @param options.usePreviousLanguageChoice If set on `true` and the `options.language` is not specified, the command\r\n     * will apply the previous language (if the command was already executed) when inserting the `codeBlock` element.\r\n     */\r\n    execute(options = {}) {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const selection = model.document.selection;\r\n        const normalizedLanguagesDefs = getNormalizedAndLocalizedLanguageDefinitions(editor);\r\n        const firstLanguageInConfig = normalizedLanguagesDefs[0];\r\n        const blocks = Array.from(selection.getSelectedBlocks());\r\n        const value = options.forceValue == undefined ? !this.value : options.forceValue;\r\n        const language = getLanguage(options, this._lastLanguage, firstLanguageInConfig.language);\r\n        model.change(writer => {\r\n            if (value) {\r\n                this._applyCodeBlock(writer, blocks, language);\r\n            }\r\n            else {\r\n                this._removeCodeBlock(writer, blocks);\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Checks the command's {@link #value}.\r\n     *\r\n     * @returns The current value.\r\n     */\r\n    _getValue() {\r\n        const selection = this.editor.model.document.selection;\r\n        const firstBlock = first(selection.getSelectedBlocks());\r\n        const isCodeBlock = !!(firstBlock && firstBlock.is('element', 'codeBlock'));\r\n        return isCodeBlock ? firstBlock.getAttribute('language') : false;\r\n    }\r\n    /**\r\n     * Checks whether the command can be enabled in the current context.\r\n     *\r\n     * @returns Whether the command should be enabled.\r\n     */\r\n    _checkEnabled() {\r\n        if (this.value) {\r\n            return true;\r\n        }\r\n        const selection = this.editor.model.document.selection;\r\n        const schema = this.editor.model.schema;\r\n        const firstBlock = first(selection.getSelectedBlocks());\r\n        if (!firstBlock) {\r\n            return false;\r\n        }\r\n        return canBeCodeBlock(schema, firstBlock);\r\n    }\r\n    _applyCodeBlock(writer, blocks, language) {\r\n        this._lastLanguage = language;\r\n        const schema = this.editor.model.schema;\r\n        const allowedBlocks = blocks.filter(block => canBeCodeBlock(schema, block));\r\n        for (const block of allowedBlocks) {\r\n            writer.rename(block, 'codeBlock');\r\n            writer.setAttribute('language', language, block);\r\n            schema.removeDisallowedAttributes([block], writer);\r\n            // Remove children of the  `codeBlock` element that are not allowed. See #9567.\r\n            Array.from(block.getChildren())\r\n                .filter(child => !schema.checkChild(block, child))\r\n                .forEach(child => writer.remove(child));\r\n        }\r\n        allowedBlocks.reverse().forEach((currentBlock, i) => {\r\n            const nextBlock = allowedBlocks[i + 1];\r\n            if (currentBlock.previousSibling === nextBlock) {\r\n                writer.appendElement('softBreak', nextBlock);\r\n                writer.merge(writer.createPositionBefore(currentBlock));\r\n            }\r\n        });\r\n    }\r\n    _removeCodeBlock(writer, blocks) {\r\n        const codeBlocks = blocks.filter(block => block.is('element', 'codeBlock'));\r\n        for (const block of codeBlocks) {\r\n            const range = writer.createRangeOn(block);\r\n            for (const item of Array.from(range.getItems()).reverse()) {\r\n                if (item.is('element', 'softBreak') && item.parent.is('element', 'codeBlock')) {\r\n                    const { position } = writer.split(writer.createPositionBefore(item));\r\n                    const elementAfter = position.nodeAfter;\r\n                    writer.rename(elementAfter, 'paragraph');\r\n                    writer.removeAttribute('language', elementAfter);\r\n                    writer.remove(item);\r\n                }\r\n            }\r\n            writer.rename(block, 'paragraph');\r\n            writer.removeAttribute('language', block);\r\n        }\r\n    }\r\n}\r\n/**\r\n * Picks the language for the new code block. If any language is passed as an option,\r\n * it will be returned. Else, if option usePreviousLanguageChoice is true and some\r\n * code block was already created (lastLanguage is not null) then previously used\r\n * language will be returned. If not, it will return default language.\r\n */\r\nfunction getLanguage(options, lastLanguage, defaultLanguage) {\r\n    if (options.language) {\r\n        return options.language;\r\n    }\r\n    if (options.usePreviousLanguageChoice && lastLanguage) {\r\n        return lastLanguage;\r\n    }\r\n    return defaultLanguage;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module code-block/indentcodeblockcommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { getIndentOutdentPositions, isModelSelectionInCodeBlock } from './utils';\r\n/**\r\n * The code block indentation increase command plugin.\r\n */\r\nexport default class IndentCodeBlockCommand extends Command {\r\n    constructor(editor) {\r\n        super(editor);\r\n        this._indentSequence = editor.config.get('codeBlock.indentSequence');\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        this.isEnabled = this._checkEnabled();\r\n    }\r\n    /**\r\n     * Executes the command. When the command {@link #isEnabled is enabled}, the indentation of the\r\n     * code lines in the selection will be increased.\r\n     *\r\n     * @fires execute\r\n     */\r\n    execute() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        model.change(writer => {\r\n            const positions = getIndentOutdentPositions(model);\r\n            // Indent all positions, for instance assuming the indent sequence is 4x space (\"    \"):\r\n            //\r\n            //\t\t<codeBlock>^foo</codeBlock>        ->       <codeBlock>    foo</codeBlock>\r\n            //\r\n            //\t\t<codeBlock>foo^bar</codeBlock>     ->       <codeBlock>foo    bar</codeBlock>\r\n            //\r\n            // Also, when there is more than one position:\r\n            //\r\n            //\t\t<codeBlock>\r\n            //\t\t\t^foobar\r\n            //\t\t\t<softBreak></softBreak>\r\n            //\t\t\t^bazqux\r\n            //\t\t</codeBlock>\r\n            //\r\n            //\t\t->\r\n            //\r\n            //\t\t<codeBlock>\r\n            //\t\t\t    foobar\r\n            //\t\t\t<softBreak></softBreak>\r\n            //\t\t\t    bazqux\r\n            //\t\t</codeBlock>\r\n            //\r\n            for (const position of positions) {\r\n                const indentSequenceTextElement = writer.createText(this._indentSequence);\r\n                // Previously insertion was done by writer.insertText(). It was changed to insertContent() to enable\r\n                // integration of code block with track changes. It's the easiest way of integration because insertContent()\r\n                // is already integrated with track changes, but if it ever cause any troubles it can be reverted, however\r\n                // some additional work will be required in track changes integration of code block.\r\n                model.insertContent(indentSequenceTextElement, position);\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Checks whether the command can be enabled in the current context.\r\n     */\r\n    _checkEnabled() {\r\n        if (!this._indentSequence) {\r\n            return false;\r\n        }\r\n        // Indent (forward) command is always enabled when there's any code block in the selection\r\n        // because you can always indent code lines.\r\n        return isModelSelectionInCodeBlock(this.editor.model.document.selection);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { getLeadingWhiteSpaces, getIndentOutdentPositions, isModelSelectionInCodeBlock } from './utils';\r\n/**\r\n * The code block indentation decrease command plugin.\r\n */\r\nexport default class OutdentCodeBlockCommand extends Command {\r\n    constructor(editor) {\r\n        super(editor);\r\n        this._indentSequence = editor.config.get('codeBlock.indentSequence');\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        this.isEnabled = this._checkEnabled();\r\n    }\r\n    /**\r\n     * Executes the command. When the command {@link #isEnabled is enabled}, the indentation of the\r\n     * code lines in the selection will be decreased.\r\n     *\r\n     * @fires execute\r\n     */\r\n    execute() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        model.change(() => {\r\n            const positions = getIndentOutdentPositions(model);\r\n            // Outdent all positions, for instance assuming the indent sequence is 4x space (\"    \"):\r\n            //\r\n            //\t\t<codeBlock>^foo</codeBlock>         ->       <codeBlock>foo</codeBlock>\r\n            //\r\n            //\t\t<codeBlock>    ^bar</codeBlock>     ->       <codeBlock>bar</codeBlock>\r\n            //\r\n            // Also, when there is more than one position:\r\n            //\r\n            //\t\t<codeBlock>\r\n            //\t\t\t    ^foobar\r\n            //\t\t\t<softBreak></softBreak>\r\n            //\t\t\t    ^bazqux\r\n            //\t\t</codeBlock>\r\n            //\r\n            //\t\t->\r\n            //\r\n            //\t\t<codeBlock>\r\n            //\t\t\tfoobar\r\n            //\t\t\t<softBreak></softBreak>\r\n            //\t\t\tbazqux\r\n            //\t\t</codeBlock>\r\n            for (const position of positions) {\r\n                const range = getLastOutdentableSequenceRange(model, position, this._indentSequence);\r\n                if (range) {\r\n                    // Previously deletion was done by writer.remove(). It was changed to deleteContent() to enable\r\n                    // integration of code block with track changes. It's the easiest way of integration because deleteContent()\r\n                    // is already integrated with track changes, but if it ever cause any troubles it can be reverted, however\r\n                    // some additional work will be required in track changes integration of code block.\r\n                    model.deleteContent(model.createSelection(range));\r\n                }\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Checks whether the command can be enabled in the current context.\r\n     *\r\n     * @private\r\n     * @returns {Boolean} Whether the command should be enabled.\r\n     */\r\n    _checkEnabled() {\r\n        if (!this._indentSequence) {\r\n            return false;\r\n        }\r\n        const model = this.editor.model;\r\n        if (!isModelSelectionInCodeBlock(model.document.selection)) {\r\n            return false;\r\n        }\r\n        // Outdent command can execute only when there is an indent character sequence\r\n        // in some of the lines.\r\n        return getIndentOutdentPositions(model).some(position => {\r\n            return getLastOutdentableSequenceRange(model, position, this._indentSequence);\r\n        });\r\n    }\r\n}\r\n// For a position coming from `getIndentOutdentPositions()`, it returns the range representing\r\n// the last occurrence of the indent sequence among the leading whitespaces of the code line the\r\n// position represents.\r\n//\r\n// For instance, assuming the indent sequence is 4x space (\"    \"):\r\n//\r\n//\t\t<codeBlock>foo^</codeBlock>                                 ->          null\r\n//\t\t<codeBlock>foo^<softBreak></softBreak>bar</codeBlock>       ->          null\r\n//\t\t<codeBlock>  ^foo</codeBlock>                               ->          null\r\n//\t\t<codeBlock>        ^foo</codeBlock>                         ->          <codeBlock>    [    ]foo</codeBlock>\r\n//\t\t<codeBlock>    ^foo    bar</codeBlock>                      ->          <codeBlock>[    ]foo    bar</codeBlock>\r\n//\r\n// @param {<module:engine/model/model~Model>} model\r\n// @param {<module:engine/model/position~Position>} position\r\n// @param {String} sequence\r\n// @returns {<module:engine/model/range~Range>|null}\r\nfunction getLastOutdentableSequenceRange(model, position, sequence) {\r\n    // Positions start before each text node (code line). Get the node corresponding to the position.\r\n    const nodeAtPosition = getCodeLineTextNodeAtPosition(position);\r\n    if (!nodeAtPosition) {\r\n        return null;\r\n    }\r\n    const leadingWhiteSpaces = getLeadingWhiteSpaces(nodeAtPosition);\r\n    const lastIndexOfSequence = leadingWhiteSpaces.lastIndexOf(sequence);\r\n    // For instance, assuming the indent sequence is 4x space (\"    \"):\r\n    //\r\n    //\t\t<codeBlock>    \t^foo</codeBlock>           ->             null\r\n    //\r\n    if (lastIndexOfSequence + sequence.length !== leadingWhiteSpaces.length) {\r\n        return null;\r\n    }\r\n    // For instance, assuming the indent sequence is 4x space (\"    \"):\r\n    //\r\n    //\t\t<codeBlock>  ^foo</codeBlock>           ->             null\r\n    //\r\n    if (lastIndexOfSequence === -1) {\r\n        return null;\r\n    }\r\n    const { parent, startOffset } = nodeAtPosition;\r\n    // Create a range that contains the **last** indent sequence among the leading whitespaces\r\n    // of the line.\r\n    //\r\n    // For instance, assuming the indent sequence is 4x space (\"    \"):\r\n    //\r\n    //\t\t<codeBlock>        ^foo</codeBlock>      ->     <codeBlock>    [    ]foo</codeBlock>\r\n    //\r\n    return model.createRange(model.createPositionAt(parent, startOffset + lastIndexOfSequence), model.createPositionAt(parent, startOffset + lastIndexOfSequence + sequence.length));\r\n}\r\nfunction getCodeLineTextNodeAtPosition(position) {\r\n    // Positions start before each text node (code line). Get the node corresponding to the position.\r\n    let nodeAtPosition = position.parent.getChild(position.index);\r\n    // <codeBlock>foo^</codeBlock>\r\n    // <codeBlock>foo^<softBreak></softBreak>bar</codeBlock>\r\n    if (!nodeAtPosition || nodeAtPosition.is('element', 'softBreak')) {\r\n        nodeAtPosition = position.nodeBefore;\r\n    }\r\n    // <codeBlock>^</codeBlock>\r\n    // <codeBlock>foo^<softBreak></softBreak>bar</codeBlock>\r\n    if (!nodeAtPosition || nodeAtPosition.is('element', 'softBreak')) {\r\n        return null;\r\n    }\r\n    return nodeAtPosition;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { getPropertyAssociation } from './utils';\r\n/**\r\n * A model-to-view (both editing and data) converter for the `codeBlock` element.\r\n *\r\n * Sample input:\r\n *\r\n * ```html\r\n * <codeBlock language=\"javascript\">foo();<softBreak></softBreak>bar();</codeBlock>\r\n * ```\r\n *\r\n * Sample output (editing):\r\n *\r\n * ```html\r\n * <pre data-language=\"JavaScript\"><code class=\"language-javascript\">foo();<br />bar();</code></pre>\r\n * ```\r\n *\r\n * Sample output (data, see {@link module:code-block/converters~modelToDataViewSoftBreakInsertion}):\r\n *\r\n * ```html\r\n * <pre><code class=\"language-javascript\">foo();\\nbar();</code></pre>\r\n * ```\r\n *\r\n * @param languageDefs The normalized language configuration passed to the feature.\r\n * @param useLabels When `true`, the `<pre>` element will get a `data-language` attribute with a\r\n * human–readable label of the language. Used only in the editing.\r\n * @returns Returns a conversion callback.\r\n */\r\nexport function modelToViewCodeBlockInsertion(model, languageDefs, useLabels = false) {\r\n    // Language CSS classes:\r\n    //\r\n    //\t\t{\r\n    //\t\t\tphp: 'language-php',\r\n    //\t\t\tpython: 'language-python',\r\n    //\t\t\tjavascript: 'js',\r\n    //\t\t\t...\r\n    //\t\t}\r\n    const languagesToClasses = getPropertyAssociation(languageDefs, 'language', 'class');\r\n    // Language labels:\r\n    //\r\n    //\t\t{\r\n    //\t\t\tphp: 'PHP',\r\n    //\t\t\tpython: 'Python',\r\n    //\t\t\tjavascript: 'JavaScript',\r\n    //\t\t\t...\r\n    //\t\t}\r\n    const languagesToLabels = getPropertyAssociation(languageDefs, 'language', 'label');\r\n    return (evt, data, conversionApi) => {\r\n        const { writer, mapper, consumable } = conversionApi;\r\n        if (!consumable.consume(data.item, 'insert')) {\r\n            return;\r\n        }\r\n        const codeBlockLanguage = data.item.getAttribute('language');\r\n        const targetViewPosition = mapper.toViewPosition(model.createPositionBefore(data.item));\r\n        const preAttributes = {};\r\n        // Attributes added only in the editing view.\r\n        if (useLabels) {\r\n            preAttributes['data-language'] = languagesToLabels[codeBlockLanguage];\r\n            preAttributes.spellcheck = 'false';\r\n        }\r\n        const codeAttributes = languagesToClasses[codeBlockLanguage] ? {\r\n            class: languagesToClasses[codeBlockLanguage]\r\n        } : undefined;\r\n        const code = writer.createContainerElement('code', codeAttributes);\r\n        const pre = writer.createContainerElement('pre', preAttributes, code);\r\n        writer.insert(targetViewPosition, pre);\r\n        mapper.bindElements(data.item, code);\r\n    };\r\n}\r\n/**\r\n * A model-to-data view converter for the new line (`softBreak`) separator.\r\n *\r\n * Sample input:\r\n *\r\n * ```html\r\n * <codeBlock ...>foo();<softBreak></softBreak>bar();</codeBlock>\r\n * ```\r\n *\r\n * Sample output:\r\n *\r\n * ```html\r\n * <pre><code ...>foo();\\nbar();</code></pre>\r\n * ```\r\n *\r\n * @returns Returns a conversion callback.\r\n */\r\nexport function modelToDataViewSoftBreakInsertion(model) {\r\n    return (evt, data, conversionApi) => {\r\n        if (data.item.parent.name !== 'codeBlock') {\r\n            return;\r\n        }\r\n        const { writer, mapper, consumable } = conversionApi;\r\n        if (!consumable.consume(data.item, 'insert')) {\r\n            return;\r\n        }\r\n        const position = mapper.toViewPosition(model.createPositionBefore(data.item));\r\n        writer.insert(position, writer.createText('\\n'));\r\n    };\r\n}\r\n/**\r\n * A view-to-model converter for `<pre>` with the `<code>` HTML.\r\n *\r\n * Sample input:\r\n *\r\n * ```html\r\n * <pre><code class=\"language-javascript\">foo();bar();</code></pre>\r\n * ```\r\n *\r\n * Sample output:\r\n *\r\n * ```html\r\n * <codeBlock language=\"javascript\">foo();bar();</codeBlock>\r\n * ```\r\n *\r\n * @param languageDefs The normalized language configuration passed to the feature.\r\n * @returns Returns a conversion callback.\r\n */\r\nexport function dataViewToModelCodeBlockInsertion(editingView, languageDefs) {\r\n    // Language names associated with CSS classes:\r\n    //\r\n    //\t\t{\r\n    //\t\t\t'language-php': 'php',\r\n    //\t\t\t'language-python': 'python',\r\n    //\t\t\tjs: 'javascript',\r\n    //\t\t\t...\r\n    //\t\t}\r\n    const classesToLanguages = getPropertyAssociation(languageDefs, 'class', 'language');\r\n    const defaultLanguageName = languageDefs[0].language;\r\n    return (evt, data, conversionApi) => {\r\n        const viewCodeElement = data.viewItem;\r\n        const viewPreElement = viewCodeElement.parent;\r\n        if (!viewPreElement || !viewPreElement.is('element', 'pre')) {\r\n            return;\r\n        }\r\n        // In case of nested code blocks we don't want to convert to another code block.\r\n        if (data.modelCursor.findAncestor('codeBlock')) {\r\n            return;\r\n        }\r\n        const { consumable, writer } = conversionApi;\r\n        if (!consumable.test(viewCodeElement, { name: true })) {\r\n            return;\r\n        }\r\n        const codeBlock = writer.createElement('codeBlock');\r\n        const viewChildClasses = [...viewCodeElement.getClassNames()];\r\n        // As we're to associate each class with a model language, a lack of class (empty class) can be\r\n        // also associated with a language if the language definition was configured so. Pushing an empty\r\n        // string to make sure the association will work.\r\n        if (!viewChildClasses.length) {\r\n            viewChildClasses.push('');\r\n        }\r\n        // Figure out if any of the <code> element's class names is a valid programming\r\n        // language class. If so, use it on the model element (becomes the language of the entire block).\r\n        for (const className of viewChildClasses) {\r\n            const language = classesToLanguages[className];\r\n            if (language) {\r\n                writer.setAttribute('language', language, codeBlock);\r\n                break;\r\n            }\r\n        }\r\n        // If no language value was set, use the default language from the config.\r\n        if (!codeBlock.hasAttribute('language')) {\r\n            writer.setAttribute('language', defaultLanguageName, codeBlock);\r\n        }\r\n        conversionApi.convertChildren(viewCodeElement, codeBlock);\r\n        // Let's try to insert code block.\r\n        if (!conversionApi.safeInsert(codeBlock, data.modelCursor)) {\r\n            return;\r\n        }\r\n        consumable.consume(viewCodeElement, { name: true });\r\n        conversionApi.updateConversionResult(codeBlock, data);\r\n    };\r\n}\r\n/**\r\n * A view-to-model converter for new line characters in `<pre>`.\r\n *\r\n * Sample input:\r\n *\r\n * ```html\r\n * <pre><code class=\"language-javascript\">foo();\\nbar();</code></pre>\r\n * ```\r\n *\r\n * Sample output:\r\n *\r\n * ```html\r\n * <codeBlock language=\"javascript\">foo();<softBreak></softBreak>bar();</codeBlock>\r\n * ```\r\n *\r\n * @returns {Function} Returns a conversion callback.\r\n */\r\nexport function dataViewToModelTextNewlinesInsertion() {\r\n    return (evt, data, { consumable, writer }) => {\r\n        let position = data.modelCursor;\r\n        // When node is already converted then do nothing.\r\n        if (!consumable.test(data.viewItem)) {\r\n            return;\r\n        }\r\n        // When not inside `codeBlock` then do nothing.\r\n        if (!position.findAncestor('codeBlock')) {\r\n            return;\r\n        }\r\n        consumable.consume(data.viewItem);\r\n        const text = data.viewItem.data;\r\n        const textLines = text.split('\\n').map(data => writer.createText(data));\r\n        const lastLine = textLines[textLines.length - 1];\r\n        for (const node of textLines) {\r\n            writer.insert(node, position);\r\n            position = position.getShiftedBy(node.offsetSize);\r\n            if (node !== lastLine) {\r\n                const softBreak = writer.createElement('softBreak');\r\n                writer.insert(softBreak, position);\r\n                position = writer.createPositionAfter(softBreak);\r\n            }\r\n        }\r\n        data.modelRange = writer.createRange(data.modelCursor, position);\r\n        data.modelCursor = position;\r\n    };\r\n}\r\n/**\r\n * A view-to-model converter that handles orphan text nodes (white spaces, new lines, etc.)\r\n * that surround `<code>` inside `<pre>`.\r\n *\r\n * Sample input:\r\n *\r\n * ```html\r\n * // White spaces\r\n * <pre> <code>foo()</code> </pre>\r\n *\r\n * // White spaces\r\n * <pre>      <code>foo()</code>      </pre>\r\n *\r\n * // White spaces\r\n * <pre>\t\t\t<code>foo()</code>\t\t\t</pre>\r\n *\r\n * // New lines\r\n * <pre>\r\n * \t<code>foo()</code>\r\n * </pre>\r\n *\r\n * // Redundant text\r\n * <pre>ABC<code>foo()</code>DEF</pre>\r\n * ```\r\n *\r\n * Unified output for each case:\r\n *\r\n * ```html\r\n * <codeBlock language=\"plaintext\">foo()</codeBlock>\r\n * ```\r\n *\r\n * @returns Returns a conversion callback.\r\n */\r\nexport function dataViewToModelOrphanNodeConsumer() {\r\n    return (evt, data, { consumable }) => {\r\n        const preElement = data.viewItem;\r\n        // Don't clean up nested pre elements. Their content should stay as it is, they are not upcasted\r\n        // to code blocks.\r\n        if (preElement.findAncestor('pre')) {\r\n            return;\r\n        }\r\n        const preChildren = Array.from(preElement.getChildren());\r\n        const childCodeElement = preChildren.find(node => node.is('element', 'code'));\r\n        // <code>-less <pre>. It will not upcast to code block in the model, skipping.\r\n        if (!childCodeElement) {\r\n            return;\r\n        }\r\n        for (const child of preChildren) {\r\n            if (child === childCodeElement || !child.is('$text')) {\r\n                continue;\r\n            }\r\n            // Consuming the orphan to remove it from the input data.\r\n            // Second argument in `consumable.consume` is discarded for text nodes.\r\n            consumable.consume(child, { name: true });\r\n        }\r\n    };\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module code-block/codeblockediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { ShiftEnter } from 'ckeditor5/src/enter';\r\nimport { UpcastWriter } from 'ckeditor5/src/engine';\r\nimport CodeBlockCommand from './codeblockcommand';\r\nimport IndentCodeBlockCommand from './indentcodeblockcommand';\r\nimport OutdentCodeBlockCommand from './outdentcodeblockcommand';\r\nimport { getNormalizedAndLocalizedLanguageDefinitions, getLeadingWhiteSpaces, rawSnippetTextToViewDocumentFragment } from './utils';\r\nimport { modelToViewCodeBlockInsertion, modelToDataViewSoftBreakInsertion, dataViewToModelCodeBlockInsertion, dataViewToModelTextNewlinesInsertion, dataViewToModelOrphanNodeConsumer } from './converters';\r\nconst DEFAULT_ELEMENT = 'paragraph';\r\n/**\r\n * The editing part of the code block feature.\r\n *\r\n * Introduces the `'codeBlock'` command and the `'codeBlock'` model element.\r\n */\r\nexport default class CodeBlockEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'CodeBlockEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ShiftEnter];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        editor.config.define('codeBlock', {\r\n            languages: [\r\n                { language: 'plaintext', label: 'Plain text' },\r\n                { language: 'c', label: 'C' },\r\n                { language: 'cs', label: 'C#' },\r\n                { language: 'cpp', label: 'C++' },\r\n                { language: 'css', label: 'CSS' },\r\n                { language: 'diff', label: 'Diff' },\r\n                { language: 'html', label: 'HTML' },\r\n                { language: 'java', label: 'Java' },\r\n                { language: 'javascript', label: 'JavaScript' },\r\n                { language: 'php', label: 'PHP' },\r\n                { language: 'python', label: 'Python' },\r\n                { language: 'ruby', label: 'Ruby' },\r\n                { language: 'typescript', label: 'TypeScript' },\r\n                { language: 'xml', label: 'XML' }\r\n            ],\r\n            // A single tab.\r\n            indentSequence: '\\t'\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const schema = editor.model.schema;\r\n        const model = editor.model;\r\n        const view = editor.editing.view;\r\n        const isDocumentListEditingLoaded = editor.plugins.has('DocumentListEditing');\r\n        const normalizedLanguagesDefs = getNormalizedAndLocalizedLanguageDefinitions(editor);\r\n        // The main command.\r\n        editor.commands.add('codeBlock', new CodeBlockCommand(editor));\r\n        // Commands that change the indentation.\r\n        editor.commands.add('indentCodeBlock', new IndentCodeBlockCommand(editor));\r\n        editor.commands.add('outdentCodeBlock', new OutdentCodeBlockCommand(editor));\r\n        this.listenTo(view.document, 'tab', (evt, data) => {\r\n            const commandName = data.shiftKey ? 'outdentCodeBlock' : 'indentCodeBlock';\r\n            const command = editor.commands.get(commandName);\r\n            if (!command.isEnabled) {\r\n                return;\r\n            }\r\n            editor.execute(commandName);\r\n            data.stopPropagation();\r\n            data.preventDefault();\r\n            evt.stop();\r\n        }, { context: 'pre' });\r\n        schema.register('codeBlock', {\r\n            allowWhere: '$block',\r\n            allowChildren: '$text',\r\n            isBlock: true,\r\n            allowAttributes: ['language']\r\n        });\r\n        // Allow all list* attributes on `codeBlock` (integration with DocumentList).\r\n        // Disallow all attributes on $text inside `codeBlock`.\r\n        schema.addAttributeCheck((context, attributeName) => {\r\n            const isDocumentListAttributeOnCodeBlock = context.endsWith('codeBlock') &&\r\n                attributeName.startsWith('list') &&\r\n                attributeName !== 'list';\r\n            if (isDocumentListEditingLoaded && isDocumentListAttributeOnCodeBlock) {\r\n                return true;\r\n            }\r\n            if (context.endsWith('codeBlock $text')) {\r\n                return false;\r\n            }\r\n        });\r\n        // Disallow object elements inside `codeBlock`. See #9567.\r\n        editor.model.schema.addChildCheck((context, childDefinition) => {\r\n            if (context.endsWith('codeBlock') && childDefinition.isObject) {\r\n                return false;\r\n            }\r\n        });\r\n        // Conversion.\r\n        editor.editing.downcastDispatcher.on('insert:codeBlock', modelToViewCodeBlockInsertion(model, normalizedLanguagesDefs, true));\r\n        editor.data.downcastDispatcher.on('insert:codeBlock', modelToViewCodeBlockInsertion(model, normalizedLanguagesDefs));\r\n        editor.data.downcastDispatcher.on('insert:softBreak', modelToDataViewSoftBreakInsertion(model), { priority: 'high' });\r\n        editor.data.upcastDispatcher.on('element:code', dataViewToModelCodeBlockInsertion(view, normalizedLanguagesDefs));\r\n        editor.data.upcastDispatcher.on('text', dataViewToModelTextNewlinesInsertion());\r\n        editor.data.upcastDispatcher.on('element:pre', dataViewToModelOrphanNodeConsumer(), { priority: 'high' });\r\n        // Intercept the clipboard input (paste) when the selection is anchored in the code block and force the clipboard\r\n        // data to be pasted as a single plain text. Otherwise, the code lines will split the code block and\r\n        // \"spill out\" as separate paragraphs.\r\n        this.listenTo(editor.editing.view.document, 'clipboardInput', (evt, data) => {\r\n            let insertionRange = model.createRange(model.document.selection.anchor);\r\n            // Use target ranges in case this is a drop.\r\n            if (data.targetRanges) {\r\n                insertionRange = editor.editing.mapper.toModelRange(data.targetRanges[0]);\r\n            }\r\n            if (!insertionRange.start.parent.is('element', 'codeBlock')) {\r\n                return;\r\n            }\r\n            const text = data.dataTransfer.getData('text/plain');\r\n            const writer = new UpcastWriter(editor.editing.view.document);\r\n            // Pass the view fragment to the default clipboardInput handler.\r\n            data.content = rawSnippetTextToViewDocumentFragment(writer, text);\r\n        });\r\n        // Make sure multi–line selection is always wrapped in a code block when `getSelectedContent()`\r\n        // is used (e.g. clipboard copy). Otherwise, only the raw text will be copied to the clipboard and,\r\n        // upon next paste, this bare text will not be inserted as a code block, which is not the best UX.\r\n        // Similarly, when the selection in a single line, the selected content should be an inline code\r\n        // so it can be pasted later on and retain it's preformatted nature.\r\n        this.listenTo(model, 'getSelectedContent', (evt, [selection]) => {\r\n            const anchor = selection.anchor;\r\n            if (selection.isCollapsed || !anchor.parent.is('element', 'codeBlock') || !anchor.hasSameParentAs(selection.focus)) {\r\n                return;\r\n            }\r\n            model.change(writer => {\r\n                const docFragment = evt.return;\r\n                // fo[o<softBreak></softBreak>b]ar  ->   <codeBlock language=\"...\">[o<softBreak></softBreak>b]<codeBlock>\r\n                if (anchor.parent.is('element') &&\r\n                    (docFragment.childCount > 1 || selection.containsEntireContent(anchor.parent))) {\r\n                    const codeBlock = writer.createElement('codeBlock', anchor.parent.getAttributes());\r\n                    writer.append(docFragment, codeBlock);\r\n                    const newDocumentFragment = writer.createDocumentFragment();\r\n                    writer.append(codeBlock, newDocumentFragment);\r\n                    evt.return = newDocumentFragment;\r\n                    return;\r\n                }\r\n                // \"f[oo]\"                          ->   <$text code=\"true\">oo</text>\r\n                const textNode = docFragment.getChild(0);\r\n                if (schema.checkAttribute(textNode, 'code')) {\r\n                    writer.setAttribute('code', true, textNode);\r\n                }\r\n            });\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    afterInit() {\r\n        const editor = this.editor;\r\n        const commands = editor.commands;\r\n        const indent = commands.get('indent');\r\n        const outdent = commands.get('outdent');\r\n        if (indent) {\r\n            // Priority is highest due to integration with `IndentList` command of `List` plugin.\r\n            // If selection is in a code block we give priority to it. This way list item cannot be indented\r\n            // but if we would give priority to indenting list item then user would have to indent list item\r\n            // as much as possible and only then he could indent code block.\r\n            indent.registerChildCommand(commands.get('indentCodeBlock'), { priority: 'highest' });\r\n        }\r\n        if (outdent) {\r\n            outdent.registerChildCommand(commands.get('outdentCodeBlock'));\r\n        }\r\n        // Customize the response to the <kbd>Enter</kbd> and <kbd>Shift</kbd>+<kbd>Enter</kbd>\r\n        // key press when the selection is in the code block. Upon enter key press we can either\r\n        // leave the block if it's \"two or three enters\" in a row or create a new code block line, preserving\r\n        // previous line's indentation.\r\n        this.listenTo(editor.editing.view.document, 'enter', (evt, data) => {\r\n            const positionParent = editor.model.document.selection.getLastPosition().parent;\r\n            if (!positionParent.is('element', 'codeBlock')) {\r\n                return;\r\n            }\r\n            if (!leaveBlockStartOnEnter(editor, data.isSoft) && !leaveBlockEndOnEnter(editor, data.isSoft)) {\r\n                breakLineOnEnter(editor);\r\n            }\r\n            data.preventDefault();\r\n            evt.stop();\r\n        }, { context: 'pre' });\r\n    }\r\n}\r\n/**\r\n * Normally, when the Enter (or Shift+Enter) key is pressed, a soft line break is to be added to the\r\n * code block. Let's try to follow the indentation of the previous line when possible, for instance:\r\n *\r\n * ```html\r\n * // Before pressing enter (or shift enter)\r\n * <codeBlock>\r\n * \"    foo()\"[]                   // Indent of 4 spaces.\r\n * </codeBlock>\r\n *\r\n * // After pressing:\r\n * <codeBlock>\r\n * \"    foo()\"                 // Indent of 4 spaces.\r\n * <softBreak></softBreak>     // A new soft break created by pressing enter.\r\n * \"    \"[]                    // Retain the indent of 4 spaces.\r\n * </codeBlock>\r\n * ```\r\n */\r\nfunction breakLineOnEnter(editor) {\r\n    const model = editor.model;\r\n    const modelDoc = model.document;\r\n    const lastSelectionPosition = modelDoc.selection.getLastPosition();\r\n    const node = lastSelectionPosition.nodeBefore || lastSelectionPosition.textNode;\r\n    let leadingWhiteSpaces;\r\n    // Figure out the indentation (white space chars) at the beginning of the line.\r\n    if (node && node.is('$text')) {\r\n        leadingWhiteSpaces = getLeadingWhiteSpaces(node);\r\n    }\r\n    // Keeping everything in a change block for a single undo step.\r\n    editor.model.change(writer => {\r\n        editor.execute('shiftEnter');\r\n        // If the line before being broken in two had some indentation, let's retain it\r\n        // in the new line.\r\n        if (leadingWhiteSpaces) {\r\n            writer.insertText(leadingWhiteSpaces, modelDoc.selection.anchor);\r\n        }\r\n    });\r\n}\r\n/**\r\n * Leave the code block when Enter (but NOT Shift+Enter) has been pressed twice at the beginning\r\n * of the code block:\r\n *\r\n * ```html\r\n * // Before:\r\n * <codeBlock>[]<softBreak></softBreak>foo</codeBlock>\r\n *\r\n * // After pressing:\r\n * <paragraph>[]</paragraph><codeBlock>foo</codeBlock>\r\n * ```\r\n *\r\n * @param isSoftEnter When `true`, enter was pressed along with <kbd>Shift</kbd>.\r\n * @returns `true` when selection left the block. `false` if stayed.\r\n */\r\nfunction leaveBlockStartOnEnter(editor, isSoftEnter) {\r\n    const model = editor.model;\r\n    const modelDoc = model.document;\r\n    const view = editor.editing.view;\r\n    const lastSelectionPosition = modelDoc.selection.getLastPosition();\r\n    const nodeAfter = lastSelectionPosition.nodeAfter;\r\n    if (isSoftEnter || !modelDoc.selection.isCollapsed || !lastSelectionPosition.isAtStart) {\r\n        return false;\r\n    }\r\n    if (!isSoftBreakNode(nodeAfter)) {\r\n        return false;\r\n    }\r\n    // We're doing everything in a single change block to have a single undo step.\r\n    editor.model.change(writer => {\r\n        // \"Clone\" the <codeBlock> in the standard way.\r\n        editor.execute('enter');\r\n        // The cloned block exists now before the original code block.\r\n        const newBlock = modelDoc.selection.anchor.parent.previousSibling;\r\n        // Make the cloned <codeBlock> a regular <paragraph> (with clean attributes, so no language).\r\n        writer.rename(newBlock, DEFAULT_ELEMENT);\r\n        writer.setSelection(newBlock, 'in');\r\n        editor.model.schema.removeDisallowedAttributes([newBlock], writer);\r\n        // Remove the <softBreak> that originally followed the selection position.\r\n        writer.remove(nodeAfter);\r\n    });\r\n    // Eye candy.\r\n    view.scrollToTheSelection();\r\n    return true;\r\n}\r\n/**\r\n * Leave the code block when Enter (but NOT Shift+Enter) has been pressed twice at the end\r\n * of the code block:\r\n *\r\n * ```html\r\n * // Before:\r\n * <codeBlock>foo[]</codeBlock>\r\n *\r\n * // After first press:\r\n * <codeBlock>foo<softBreak></softBreak>[]</codeBlock>\r\n *\r\n * // After second press:\r\n * <codeBlock>foo</codeBlock><paragraph>[]</paragraph>\r\n * ```\r\n *\r\n * @param isSoftEnter When `true`, enter was pressed along with <kbd>Shift</kbd>.\r\n * @returns `true` when selection left the block. `false` if stayed.\r\n */\r\nfunction leaveBlockEndOnEnter(editor, isSoftEnter) {\r\n    const model = editor.model;\r\n    const modelDoc = model.document;\r\n    const view = editor.editing.view;\r\n    const lastSelectionPosition = modelDoc.selection.getLastPosition();\r\n    const nodeBefore = lastSelectionPosition.nodeBefore;\r\n    let emptyLineRangeToRemoveOnEnter;\r\n    if (isSoftEnter || !modelDoc.selection.isCollapsed || !lastSelectionPosition.isAtEnd || !nodeBefore || !nodeBefore.previousSibling) {\r\n        return false;\r\n    }\r\n    // When the position is directly preceded by two soft breaks\r\n    //\r\n    //\t\t<codeBlock>foo<softBreak></softBreak><softBreak></softBreak>[]</codeBlock>\r\n    //\r\n    // it creates the following range that will be cleaned up before leaving:\r\n    //\r\n    //\t\t<codeBlock>foo[<softBreak></softBreak><softBreak></softBreak>]</codeBlock>\r\n    //\r\n    if (isSoftBreakNode(nodeBefore) && isSoftBreakNode(nodeBefore.previousSibling)) {\r\n        emptyLineRangeToRemoveOnEnter = model.createRange(model.createPositionBefore(nodeBefore.previousSibling), model.createPositionAfter(nodeBefore));\r\n    }\r\n    // When there's some text before the position that is\r\n    // preceded by two soft breaks and made purely of white–space characters\r\n    //\r\n    //\t\t<codeBlock>foo<softBreak></softBreak><softBreak></softBreak>    []</codeBlock>\r\n    //\r\n    // it creates the following range to clean up before leaving:\r\n    //\r\n    //\t\t<codeBlock>foo[<softBreak></softBreak><softBreak></softBreak>    ]</codeBlock>\r\n    //\r\n    else if (isEmptyishTextNode(nodeBefore) &&\r\n        isSoftBreakNode(nodeBefore.previousSibling) &&\r\n        isSoftBreakNode(nodeBefore.previousSibling.previousSibling)) {\r\n        emptyLineRangeToRemoveOnEnter = model.createRange(model.createPositionBefore(nodeBefore.previousSibling.previousSibling), model.createPositionAfter(nodeBefore));\r\n    }\r\n    // When there's some text before the position that is made purely of white–space characters\r\n    // and is preceded by some other text made purely of white–space characters\r\n    //\r\n    //\t\t<codeBlock>foo<softBreak></softBreak>    <softBreak></softBreak>    []</codeBlock>\r\n    //\r\n    // it creates the following range to clean up before leaving:\r\n    //\r\n    //\t\t<codeBlock>foo[<softBreak></softBreak>    <softBreak></softBreak>    ]</codeBlock>\r\n    //\r\n    else if (isEmptyishTextNode(nodeBefore) &&\r\n        isSoftBreakNode(nodeBefore.previousSibling) &&\r\n        isEmptyishTextNode(nodeBefore.previousSibling.previousSibling) &&\r\n        nodeBefore.previousSibling.previousSibling &&\r\n        isSoftBreakNode(nodeBefore.previousSibling.previousSibling.previousSibling)) {\r\n        emptyLineRangeToRemoveOnEnter = model.createRange(model.createPositionBefore(nodeBefore.previousSibling.previousSibling.previousSibling), model.createPositionAfter(nodeBefore));\r\n    }\r\n    // Not leaving the block in the following cases:\r\n    //\r\n    //\t\t<codeBlock>    []</codeBlock>\r\n    //\t\t<codeBlock>  a []</codeBlock>\r\n    //\t\t<codeBlock>foo<softBreak></softBreak>[]</codeBlock>\r\n    //\t\t<codeBlock>foo<softBreak></softBreak><softBreak></softBreak>bar[]</codeBlock>\r\n    //\t\t<codeBlock>foo<softBreak></softBreak><softBreak></softBreak> a []</codeBlock>\r\n    //\r\n    else {\r\n        return false;\r\n    }\r\n    // We're doing everything in a single change block to have a single undo step.\r\n    editor.model.change(writer => {\r\n        // Remove the last <softBreak>s and all white space characters that followed them.\r\n        writer.remove(emptyLineRangeToRemoveOnEnter);\r\n        // \"Clone\" the <codeBlock> in the standard way.\r\n        editor.execute('enter');\r\n        const newBlock = modelDoc.selection.anchor.parent;\r\n        // Make the cloned <codeBlock> a regular <paragraph> (with clean attributes, so no language).\r\n        writer.rename(newBlock, DEFAULT_ELEMENT);\r\n        editor.model.schema.removeDisallowedAttributes([newBlock], writer);\r\n    });\r\n    // Eye candy.\r\n    view.scrollToTheSelection();\r\n    return true;\r\n}\r\nfunction isEmptyishTextNode(node) {\r\n    return node && node.is('$text') && !node.data.match(/\\S/);\r\n}\r\nfunction isSoftBreakNode(node) {\r\n    return node && node.is('element', 'softBreak');\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./codeblock.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module code-block/codeblockui\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { Collection } from 'ckeditor5/src/utils';\r\nimport { Model, SplitButtonView, createDropdown, addListToDropdown } from 'ckeditor5/src/ui';\r\nimport { getNormalizedAndLocalizedLanguageDefinitions } from './utils';\r\nimport codeBlockIcon from '../theme/icons/codeblock.svg';\r\nimport '../theme/codeblock.css';\r\n/**\r\n * The code block UI plugin.\r\n *\r\n * Introduces the `'codeBlock'` dropdown.\r\n */\r\nexport default class CodeBlockUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'CodeBlockUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        const componentFactory = editor.ui.componentFactory;\r\n        const normalizedLanguageDefs = getNormalizedAndLocalizedLanguageDefinitions(editor);\r\n        componentFactory.add('codeBlock', locale => {\r\n            const command = editor.commands.get('codeBlock');\r\n            const dropdownView = createDropdown(locale, SplitButtonView);\r\n            const splitButtonView = dropdownView.buttonView;\r\n            const accessibleLabel = t('Insert code block');\r\n            splitButtonView.set({\r\n                label: accessibleLabel,\r\n                tooltip: true,\r\n                icon: codeBlockIcon,\r\n                isToggleable: true\r\n            });\r\n            splitButtonView.bind('isOn').to(command, 'value', value => !!value);\r\n            splitButtonView.on('execute', () => {\r\n                editor.execute('codeBlock', {\r\n                    usePreviousLanguageChoice: true\r\n                });\r\n                editor.editing.view.focus();\r\n            });\r\n            dropdownView.on('execute', evt => {\r\n                editor.execute('codeBlock', {\r\n                    language: evt.source._codeBlockLanguage,\r\n                    forceValue: true\r\n                });\r\n                editor.editing.view.focus();\r\n            });\r\n            dropdownView.class = 'ck-code-block-dropdown';\r\n            dropdownView.bind('isEnabled').to(command);\r\n            addListToDropdown(dropdownView, () => this._getLanguageListItemDefinitions(normalizedLanguageDefs), {\r\n                role: 'menu',\r\n                ariaLabel: accessibleLabel\r\n            });\r\n            return dropdownView;\r\n        });\r\n    }\r\n    /**\r\n     * A helper returning a collection of the `codeBlock` dropdown items representing languages\r\n     * available for the user to choose from.\r\n     */\r\n    _getLanguageListItemDefinitions(normalizedLanguageDefs) {\r\n        const editor = this.editor;\r\n        const command = editor.commands.get('codeBlock');\r\n        const itemDefinitions = new Collection();\r\n        for (const languageDef of normalizedLanguageDefs) {\r\n            const definition = {\r\n                type: 'button',\r\n                model: new Model({\r\n                    _codeBlockLanguage: languageDef.language,\r\n                    label: languageDef.label,\r\n                    role: 'menuitemradio',\r\n                    withText: true\r\n                })\r\n            };\r\n            definition.model.bind('isOn').to(command, 'value', value => {\r\n                return value === definition.model._codeBlockLanguage;\r\n            });\r\n            itemDefinitions.add(definition);\r\n        }\r\n        return itemDefinitions;\r\n    }\r\n}\r\n","export default \"<svg viewBox=\\\"0 0 20 20\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M12.87 12.61a.75.75 0 0 1-.089.976l-.085.07-3.154 2.254 3.412 2.414a.75.75 0 0 1 .237.95l-.057.095a.75.75 0 0 1-.95.237l-.096-.058-4.272-3.022-.003-1.223 4.01-2.867a.75.75 0 0 1 1.047.174zm2.795-.231.095.057 4.011 2.867-.003 1.223-4.272 3.022-.095.058a.75.75 0 0 1-.88-.151l-.07-.086-.058-.095a.75.75 0 0 1 .15-.88l.087-.07 3.412-2.414-3.154-2.253-.085-.071a.75.75 0 0 1 .862-1.207zM16 0a2 2 0 0 1 2 2v9.354l-.663-.492-.837-.001V2a.5.5 0 0 0-.5-.5H2a.5.5 0 0 0-.5.5v15a.5.5 0 0 0 .5.5h3.118L7.156 19H2a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2h14zM5.009 15l.003 1H3v-1h2.009zm2.188-2-1.471 1H5v-1h2.197zM10 11v.095L8.668 12H7v-1h3zm4-2v1H7V9h7zm0-2v1H7V7h7zm-4-2v1H5V5h5zM6 3v1H3V3h3z\\\"/></svg>\";","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module select-all/selectallcommand\r\n */\r\nimport { Command } from '@ckeditor/ckeditor5-core';\r\n/**\r\n * The select all command.\r\n *\r\n * It is used by the {@link module:select-all/selectallediting~SelectAllEditing select all editing feature} to handle\r\n * the <kbd>Ctrl/⌘</kbd>+<kbd>A</kbd> keystroke.\r\n *\r\n * Executing this command changes the {@glink framework/architecture/editing-engine#model model}\r\n * selection so it contains the entire content of the editable root of the editor the selection is\r\n * {@link module:engine/model/selection~Selection#anchor anchored} in.\r\n *\r\n * If the selection was anchored in a {@glink framework/tutorials/implementing-a-block-widget nested editable}\r\n * (e.g. a caption of an image), the new selection will contain its entire content. Successive executions of this command\r\n * will expand the selection to encompass more and more content up to the entire editable root of the editor.\r\n */\r\nexport default class SelectAllCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        // It does not affect data so should be enabled in read-only mode.\r\n        this.affectsData = false;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    execute() {\r\n        const model = this.editor.model;\r\n        const selection = model.document.selection;\r\n        let scopeElement = model.schema.getLimitElement(selection);\r\n        // If an entire scope is selected, or the selection's ancestor is not a scope yet,\r\n        // browse through ancestors to find the enclosing parent scope.\r\n        if (selection.containsEntireContent(scopeElement) || !isSelectAllScope(model.schema, scopeElement)) {\r\n            do {\r\n                scopeElement = scopeElement.parent;\r\n                // Do nothing, if the entire `root` is already selected.\r\n                if (!scopeElement) {\r\n                    return;\r\n                }\r\n            } while (!isSelectAllScope(model.schema, scopeElement));\r\n        }\r\n        model.change(writer => {\r\n            writer.setSelection(scopeElement, 'in');\r\n        });\r\n    }\r\n}\r\n/**\r\n * Checks whether the element is a valid select-all scope. Returns true, if the element is a\r\n * {@link module:engine/model/schema~Schema#isLimit limit}, and can contain any text or paragraph.\r\n *\r\n * @param schema Schema to check against.\r\n * @param element Model element.\r\n */\r\nfunction isSelectAllScope(schema, element) {\r\n    return schema.isLimit(element) && (schema.checkChild(element, '$text') || schema.checkChild(element, 'paragraph'));\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module select-all/selectallediting\r\n */\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\nimport { getCode, parseKeystroke } from '@ckeditor/ckeditor5-utils';\r\nimport SelectAllCommand from './selectallcommand';\r\nconst SELECT_ALL_KEYSTROKE = parseKeystroke('Ctrl+A');\r\n/**\r\n * The select all editing feature.\r\n *\r\n * It registers the `'selectAll'` {@link module:select-all/selectallcommand~SelectAllCommand command}\r\n * and the <kbd>Ctrl/⌘</kbd>+<kbd>A</kbd> keystroke listener which executes it.\r\n */\r\nexport default class SelectAllEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'SelectAllEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const view = editor.editing.view;\r\n        const viewDocument = view.document;\r\n        editor.commands.add('selectAll', new SelectAllCommand(editor));\r\n        this.listenTo(viewDocument, 'keydown', (eventInfo, domEventData) => {\r\n            if (getCode(domEventData) === SELECT_ALL_KEYSTROKE) {\r\n                editor.execute('selectAll');\r\n                domEventData.preventDefault();\r\n            }\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module select-all/selectallui\r\n */\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\nimport { ButtonView } from '@ckeditor/ckeditor5-ui';\r\nimport selectAllIcon from '../theme/icons/select-all.svg';\r\n/**\r\n * The select all UI feature.\r\n *\r\n * It registers the `'selectAll'` UI button in the editor's\r\n * {@link module:ui/componentfactory~ComponentFactory component factory}. When clicked, the button\r\n * executes the {@link module:select-all/selectallcommand~SelectAllCommand select all command}.\r\n */\r\nexport default class SelectAllUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'SelectAllUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        editor.ui.componentFactory.add('selectAll', locale => {\r\n            const command = editor.commands.get('selectAll');\r\n            const view = new ButtonView(locale);\r\n            const t = locale.t;\r\n            view.set({\r\n                label: t('Select all'),\r\n                icon: selectAllIcon,\r\n                keystroke: 'Ctrl+A',\r\n                tooltip: true\r\n            });\r\n            view.bind('isEnabled').to(command, 'isEnabled');\r\n            // Execute the command.\r\n            this.listenTo(view, 'execute', () => {\r\n                editor.execute('selectAll');\r\n                editor.editing.view.focus();\r\n            });\r\n            return view;\r\n        });\r\n    }\r\n}\r\n","export default \"<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>\";","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module select-all/selectall\r\n */\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\nimport SelectAllEditing from './selectallediting';\r\nimport SelectAllUI from './selectallui';\r\n/**\r\n * The select all feature.\r\n *\r\n * This is a \"glue\" plugin which loads the {@link module:select-all/selectallediting~SelectAllEditing select all editing feature}\r\n * and the {@link module:select-all/selectallui~SelectAllUI select all UI feature}.\r\n *\r\n * Please refer to the documentation of individual features to learn more.\r\n */\r\nexport default class SelectAll extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [SelectAllEditing, SelectAllUI];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'SelectAll';\r\n    }\r\n}\r\n","import api from \"!../../../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../../css-loader/dist/cjs.js!../../../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./responsiveform.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./findandreplaceform.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module find-and-replace/ui/findandreplaceformview\r\n */\r\nimport { View, ButtonView, FormHeaderView, LabeledFieldView, Model, FocusCycler, createLabeledInputText, submitHandler, ViewCollection, createDropdown, addListToDropdown } from 'ckeditor5/src/ui';\r\nimport { FocusTracker, KeystrokeHandler, Collection, Rect, isVisible } from 'ckeditor5/src/utils';\r\n// See: #8833.\r\n// eslint-disable-next-line ckeditor5-rules/ckeditor-imports\r\nimport '@ckeditor/ckeditor5-ui/theme/components/responsive-form/responsiveform.css';\r\nimport '../../theme/findandreplaceform.css';\r\n// eslint-disable-next-line ckeditor5-rules/ckeditor-imports\r\nimport previousArrow from '@ckeditor/ckeditor5-ui/theme/icons/previous-arrow.svg';\r\nimport { icons } from 'ckeditor5/src/core';\r\n/**\r\n * The find and replace form view class.\r\n *\r\n * See {@link module:find-and-replace/ui/findandreplaceformview~FindAndReplaceFormView}.\r\n */\r\nexport default class FindAndReplaceFormView extends View {\r\n    /**\r\n     * Creates a view of find and replace form.\r\n     *\r\n     * @param locale The localization services instance.\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        const t = locale.t;\r\n        this.set('matchCount', 0);\r\n        this.set('highlightOffset', 0);\r\n        this.set('isDirty', false);\r\n        this.set('_areCommandsEnabled', {});\r\n        this.set('_resultsCounterText', '');\r\n        this.set('_matchCase', false);\r\n        this.set('_wholeWordsOnly', false);\r\n        this.bind('_searchResultsFound').to(this, 'matchCount', this, 'isDirty', (matchCount, isDirty) => {\r\n            return matchCount > 0 && !isDirty;\r\n        });\r\n        this._findInputView = this._createInputField(t('Find in text…'));\r\n        this._replaceInputView = this._createInputField(t('Replace with…'));\r\n        this._findButtonView = this._createButton({\r\n            label: t('Find'),\r\n            class: 'ck-button-find ck-button-action',\r\n            withText: true\r\n        });\r\n        this._findPrevButtonView = this._createButton({\r\n            label: t('Previous result'),\r\n            class: 'ck-button-prev',\r\n            icon: previousArrow,\r\n            keystroke: 'Shift+F3',\r\n            tooltip: true\r\n        });\r\n        this._findNextButtonView = this._createButton({\r\n            label: t('Next result'),\r\n            class: 'ck-button-next',\r\n            icon: previousArrow,\r\n            keystroke: 'F3',\r\n            tooltip: true\r\n        });\r\n        this._optionsDropdown = this._createOptionsDropdown();\r\n        this._replaceButtonView = this._createButton({\r\n            label: t('Replace'),\r\n            class: 'ck-button-replace',\r\n            withText: true\r\n        });\r\n        this._replaceAllButtonView = this._createButton({\r\n            label: t('Replace all'),\r\n            class: 'ck-button-replaceall',\r\n            withText: true\r\n        });\r\n        this._findFieldsetView = this._createFindFieldset();\r\n        this._replaceFieldsetView = this._createReplaceFieldset();\r\n        this._focusTracker = new FocusTracker();\r\n        this._keystrokes = new KeystrokeHandler();\r\n        this._focusables = new ViewCollection();\r\n        this._focusCycler = new FocusCycler({\r\n            focusables: this._focusables,\r\n            focusTracker: this._focusTracker,\r\n            keystrokeHandler: this._keystrokes,\r\n            actions: {\r\n                // Navigate form fields backwards using the <kbd>Shift</kbd> + <kbd>Tab</kbd> keystroke.\r\n                focusPrevious: 'shift + tab',\r\n                // Navigate form fields forwards using the <kbd>Tab</kbd> key.\r\n                focusNext: 'tab'\r\n            }\r\n        });\r\n        this.setTemplate({\r\n            tag: 'form',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-find-and-replace-form'\r\n                ],\r\n                tabindex: '-1'\r\n            },\r\n            children: [\r\n                new FormHeaderView(locale, {\r\n                    label: t('Find and replace')\r\n                }),\r\n                this._findFieldsetView,\r\n                this._replaceFieldsetView\r\n            ]\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        submitHandler({ view: this });\r\n        this._initFocusCycling();\r\n        this._initKeystrokeHandling();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        this._focusTracker.destroy();\r\n        this._keystrokes.destroy();\r\n    }\r\n    /**\r\n     * Focuses the fist {@link #_focusables} in the form.\r\n     */\r\n    focus() {\r\n        this._focusCycler.focusFirst();\r\n    }\r\n    /**\r\n     * Resets the form before re-appearing.\r\n     *\r\n     * It clears error messages, hides the match counter and disables the replace feature\r\n     * until the next hit of the \"Find\" button.\r\n     *\r\n     * **Note**: It does not reset inputs and options, though. This way the form works better in editors with\r\n     * disappearing toolbar (e.g. BalloonEditor): hiding the toolbar by accident (together with the find and replace UI)\r\n     * does not require filling the entire form again.\r\n     */\r\n    reset() {\r\n        this._findInputView.errorText = null;\r\n        this.isDirty = true;\r\n    }\r\n    /**\r\n     * Returns the value of the find input.\r\n     */\r\n    get _textToFind() {\r\n        return this._findInputView.fieldView.element.value;\r\n    }\r\n    /**\r\n     * Returns the value of the replace input.\r\n     */\r\n    get _textToReplace() {\r\n        return this._replaceInputView.fieldView.element.value;\r\n    }\r\n    /**\r\n     * Configures and returns the `<fieldset>` aggregating all find controls.\r\n     */\r\n    _createFindFieldset() {\r\n        const locale = this.locale;\r\n        const fieldsetView = new View(locale);\r\n        // Typing in the find field invalidates all previous results (the form is \"dirty\").\r\n        this._findInputView.fieldView.on('input', () => {\r\n            this.isDirty = true;\r\n        });\r\n        this._findButtonView.on('execute', this._onFindButtonExecute.bind(this));\r\n        // Pressing prev/next buttons fires related event on the form.\r\n        this._findPrevButtonView.delegate('execute').to(this, 'findPrevious');\r\n        this._findNextButtonView.delegate('execute').to(this, 'findNext');\r\n        // Prev/next buttons will be disabled when related editor command gets disabled.\r\n        this._findPrevButtonView.bind('isEnabled').to(this, '_areCommandsEnabled', ({ findPrevious }) => findPrevious);\r\n        this._findNextButtonView.bind('isEnabled').to(this, '_areCommandsEnabled', ({ findNext }) => findNext);\r\n        this._injectFindResultsCounter();\r\n        fieldsetView.setTemplate({\r\n            tag: 'fieldset',\r\n            attributes: {\r\n                class: ['ck', 'ck-find-and-replace-form__find']\r\n            },\r\n            children: [\r\n                this._findInputView,\r\n                this._findButtonView,\r\n                this._findPrevButtonView,\r\n                this._findNextButtonView\r\n            ]\r\n        });\r\n        return fieldsetView;\r\n    }\r\n    /**\r\n     * The action performed when the {@link #_findButtonView} is pressed.\r\n     */\r\n    _onFindButtonExecute() {\r\n        // When hitting \"Find\" in an empty input, an error should be displayed.\r\n        // Also, if the form was \"dirty\", it should remain so.\r\n        if (!this._textToFind) {\r\n            const t = this.t;\r\n            this._findInputView.errorText = t('Text to find must not be empty.');\r\n            return;\r\n        }\r\n        // Hitting \"Find\" automatically clears the dirty state.\r\n        this.isDirty = false;\r\n        this.fire('findNext', {\r\n            searchText: this._textToFind,\r\n            matchCase: this._matchCase,\r\n            wholeWords: this._wholeWordsOnly\r\n        });\r\n    }\r\n    /**\r\n     * Configures an injects the find results counter displaying a \"N of M\" label of the {@link #_findInputView}.\r\n     */\r\n    _injectFindResultsCounter() {\r\n        const locale = this.locale;\r\n        const t = locale.t;\r\n        const bind = this.bindTemplate;\r\n        const resultsCounterView = new View(this.locale);\r\n        this.bind('_resultsCounterText').to(this, 'highlightOffset', this, 'matchCount', (highlightOffset, matchCount) => t('%0 of %1', [highlightOffset, matchCount]));\r\n        resultsCounterView.setTemplate({\r\n            tag: 'span',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-results-counter',\r\n                    // The counter only makes sense when the field text corresponds to search results in the editing.\r\n                    bind.if('isDirty', 'ck-hidden')\r\n                ]\r\n            },\r\n            children: [\r\n                {\r\n                    text: bind.to('_resultsCounterText')\r\n                }\r\n            ]\r\n        });\r\n        // The whole idea is that when the text of the counter changes, its width also increases/decreases and\r\n        // it consumes more or less space over the input. The input, on the other hand, should adjust it's right\r\n        // padding so its *entire* text always remains visible and available to the user.\r\n        const updateFindInputPadding = () => {\r\n            const inputElement = this._findInputView.fieldView.element;\r\n            // Don't adjust the padding if the input (also: counter) were not rendered or not inserted into DOM yet.\r\n            if (!inputElement || !isVisible(inputElement)) {\r\n                return;\r\n            }\r\n            const counterWidth = new Rect(resultsCounterView.element).width;\r\n            const paddingPropertyName = locale.uiLanguageDirection === 'ltr' ? 'paddingRight' : 'paddingLeft';\r\n            if (!counterWidth) {\r\n                inputElement.style[paddingPropertyName] = '';\r\n            }\r\n            else {\r\n                inputElement.style[paddingPropertyName] = `calc( 2 * var(--ck-spacing-standard) + ${counterWidth}px )`;\r\n            }\r\n        };\r\n        // Adjust the input padding when the text of the counter changes, for instance \"1 of 200\" is narrower than \"123 of 200\".\r\n        // Using \"low\" priority to let the text be set by the template binding first.\r\n        this.on('change:_resultsCounterText', updateFindInputPadding, { priority: 'low' });\r\n        // Adjust the input padding when the counter shows or hides. When hidden, there should be no padding. When it shows, the\r\n        // padding should be set according to the text of the counter.\r\n        // Using \"low\" priority to let the text be set by the template binding first.\r\n        this.on('change:isDirty', updateFindInputPadding, { priority: 'low' });\r\n        // Put the counter element next to the <input> in the find field.\r\n        this._findInputView.template.children[0].children.push(resultsCounterView);\r\n    }\r\n    /**\r\n     * Configures and returns the `<fieldset>` aggregating all replace controls.\r\n     */\r\n    _createReplaceFieldset() {\r\n        const locale = this.locale;\r\n        const t = locale.t;\r\n        const fieldsetView = new View(this.locale);\r\n        this._replaceButtonView.bind('isEnabled').to(this, '_areCommandsEnabled', this, '_searchResultsFound', ({ replace }, resultsFound) => replace && resultsFound);\r\n        this._replaceAllButtonView.bind('isEnabled').to(this, '_areCommandsEnabled', this, '_searchResultsFound', ({ replaceAll }, resultsFound) => replaceAll && resultsFound);\r\n        this._replaceInputView.bind('isEnabled').to(this, '_areCommandsEnabled', this, '_searchResultsFound', ({ replace }, resultsFound) => replace && resultsFound);\r\n        this._replaceInputView.bind('infoText').to(this._replaceInputView, 'isEnabled', this._replaceInputView, 'isFocused', (isEnabled, isFocused) => {\r\n            if (isEnabled || !isFocused) {\r\n                return '';\r\n            }\r\n            return t('Tip: Find some text first in order to replace it.');\r\n        });\r\n        this._replaceButtonView.on('execute', () => {\r\n            this.fire('replace', {\r\n                searchText: this._textToFind,\r\n                replaceText: this._textToReplace\r\n            });\r\n        });\r\n        this._replaceAllButtonView.on('execute', () => {\r\n            this.fire('replaceAll', {\r\n                searchText: this._textToFind,\r\n                replaceText: this._textToReplace\r\n            });\r\n            this.focus();\r\n        });\r\n        fieldsetView.setTemplate({\r\n            tag: 'fieldset',\r\n            attributes: {\r\n                class: ['ck', 'ck-find-and-replace-form__replace']\r\n            },\r\n            children: [\r\n                this._replaceInputView,\r\n                this._optionsDropdown,\r\n                this._replaceButtonView,\r\n                this._replaceAllButtonView\r\n            ]\r\n        });\r\n        return fieldsetView;\r\n    }\r\n    /**\r\n     * Creates, configures and returns and instance of a dropdown allowing users to narrow\r\n     * the search criteria down. The dropdown has a list with switch buttons for each option.\r\n     */\r\n    _createOptionsDropdown() {\r\n        const locale = this.locale;\r\n        const t = locale.t;\r\n        const dropdownView = createDropdown(this.locale);\r\n        dropdownView.class = 'ck-options-dropdown';\r\n        dropdownView.buttonView.set({\r\n            withText: false,\r\n            label: t('Show options'),\r\n            icon: icons.cog,\r\n            tooltip: true\r\n        });\r\n        const matchCaseModel = new Model({\r\n            withText: true,\r\n            label: t('Match case'),\r\n            // A dummy read-only prop to make it easy to tell which switch was toggled.\r\n            _isMatchCaseSwitch: true\r\n        });\r\n        const wholeWordsOnlyModel = new Model({\r\n            withText: true,\r\n            label: t('Whole words only')\r\n        });\r\n        // Let the switches be controlled by form's observable properties.\r\n        matchCaseModel.bind('isOn').to(this, '_matchCase');\r\n        wholeWordsOnlyModel.bind('isOn').to(this, '_wholeWordsOnly');\r\n        // Update the state of the form when a switch is toggled.\r\n        dropdownView.on('execute', evt => {\r\n            if (evt.source._isMatchCaseSwitch) {\r\n                this._matchCase = !this._matchCase;\r\n            }\r\n            else {\r\n                this._wholeWordsOnly = !this._wholeWordsOnly;\r\n            }\r\n            // Toggling a switch makes the form dirty because this changes search criteria\r\n            // just like typing text of the find input.\r\n            this.isDirty = true;\r\n        });\r\n        addListToDropdown(dropdownView, new Collection([\r\n            { type: 'switchbutton', model: matchCaseModel },\r\n            { type: 'switchbutton', model: wholeWordsOnlyModel }\r\n        ]));\r\n        return dropdownView;\r\n    }\r\n    /**\r\n     * Initializes the {@link #_focusables} and {@link #_focusTracker} to allow navigation\r\n     * using <kbd>Tab</kbd> and <kbd>Shift</kbd>+<kbd>Tab</kbd> keystrokes in the right order.\r\n     */\r\n    _initFocusCycling() {\r\n        const childViews = [\r\n            this._findInputView,\r\n            this._findButtonView,\r\n            this._findPrevButtonView,\r\n            this._findNextButtonView,\r\n            this._replaceInputView,\r\n            this._optionsDropdown,\r\n            this._replaceButtonView,\r\n            this._replaceAllButtonView\r\n        ];\r\n        childViews.forEach(v => {\r\n            // Register the view as focusable.\r\n            this._focusables.add(v);\r\n            // Register the view in the focus tracker.\r\n            this._focusTracker.add(v.element);\r\n        });\r\n    }\r\n    /**\r\n     * Initializes the keystroke handling in the form.\r\n     */\r\n    _initKeystrokeHandling() {\r\n        const stopPropagation = (data) => data.stopPropagation();\r\n        const stopPropagationAndPreventDefault = (data) => {\r\n            data.stopPropagation();\r\n            data.preventDefault();\r\n        };\r\n        // Start listening for the keystrokes coming from #element.\r\n        this._keystrokes.listenTo(this.element);\r\n        // Find the next result upon F3.\r\n        this._keystrokes.set('f3', event => {\r\n            stopPropagationAndPreventDefault(event);\r\n            this._findNextButtonView.fire('execute');\r\n        });\r\n        // Find the previous result upon F3.\r\n        this._keystrokes.set('shift+f3', event => {\r\n            stopPropagationAndPreventDefault(event);\r\n            this._findPrevButtonView.fire('execute');\r\n        });\r\n        // Find or replace upon pressing Enter in the find and replace fields.\r\n        this._keystrokes.set('enter', event => {\r\n            const target = event.target;\r\n            if (target === this._findInputView.fieldView.element) {\r\n                if (this._areCommandsEnabled.findNext) {\r\n                    this._findNextButtonView.fire('execute');\r\n                }\r\n                else {\r\n                    this._findButtonView.fire('execute');\r\n                }\r\n                stopPropagationAndPreventDefault(event);\r\n            }\r\n            else if (target === this._replaceInputView.fieldView.element && !this.isDirty) {\r\n                this._replaceButtonView.fire('execute');\r\n                stopPropagationAndPreventDefault(event);\r\n            }\r\n        });\r\n        // Find previous upon pressing Shift+Enter in the find field.\r\n        this._keystrokes.set('shift+enter', event => {\r\n            const target = event.target;\r\n            if (target !== this._findInputView.fieldView.element) {\r\n                return;\r\n            }\r\n            if (this._areCommandsEnabled.findPrevious) {\r\n                this._findPrevButtonView.fire('execute');\r\n            }\r\n            else {\r\n                this._findButtonView.fire('execute');\r\n            }\r\n            stopPropagationAndPreventDefault(event);\r\n        });\r\n        // Since the form is in the dropdown panel which is a child of the toolbar, the toolbar's\r\n        // keystroke handler would take over the key management in the URL input.\r\n        // We need to prevent this ASAP. Otherwise, the basic caret movement using the arrow keys will be impossible.\r\n        this._keystrokes.set('arrowright', stopPropagation);\r\n        this._keystrokes.set('arrowleft', stopPropagation);\r\n        this._keystrokes.set('arrowup', stopPropagation);\r\n        this._keystrokes.set('arrowdown', stopPropagation);\r\n    }\r\n    /**\r\n     * Creates a button view.\r\n     *\r\n     * @param options The properties of the `ButtonView`.\r\n     * @returns The button view instance.\r\n     */\r\n    _createButton(options) {\r\n        const button = new ButtonView(this.locale);\r\n        button.set(options);\r\n        return button;\r\n    }\r\n    /**\r\n     * Creates a labeled input view.\r\n     *\r\n     * @param label The input label.\r\n     * @returns The labeled input view instance.\r\n     */\r\n    _createInputField(label) {\r\n        const labeledInput = new LabeledFieldView(this.locale, createLabeledInputText);\r\n        labeledInput.label = label;\r\n        return labeledInput;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module find-and-replace/findandreplaceui\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { createDropdown, CssTransitionDisablerMixin } from 'ckeditor5/src/ui';\r\nimport FindAndReplaceFormView from './ui/findandreplaceformview';\r\nimport loupeIcon from '../theme/icons/find-replace.svg';\r\n/**\r\n * The default find and replace UI.\r\n *\r\n * It registers the `'findAndReplace'` UI button in the editor's {@link module:ui/componentfactory~ComponentFactory component factory}.\r\n * that uses the {@link module:find-and-replace/findandreplace~FindAndReplace FindAndReplace} plugin API.\r\n */\r\nexport default class FindAndReplaceUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'FindAndReplaceUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        this.formView = null;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        // Register the toolbar dropdown component.\r\n        editor.ui.componentFactory.add('findAndReplace', locale => {\r\n            const dropdown = createDropdown(locale);\r\n            // Dropdown should be disabled when in source editing mode. See #10001.\r\n            const findCommand = editor.commands.get('find');\r\n            dropdown.bind('isEnabled').to(findCommand);\r\n            dropdown.once('change:isOpen', () => {\r\n                this.formView = new (CssTransitionDisablerMixin(FindAndReplaceFormView))(editor.locale);\r\n                dropdown.panelView.children.add(this.formView);\r\n                this._setupFormView(this.formView);\r\n            });\r\n            // Every time a dropdown is opened, the search text field should get focused and selected for better UX.\r\n            // Note: Using the low priority here to make sure the following listener starts working after\r\n            // the default action of the drop-down is executed (i.e. the panel showed up). Otherwise,\r\n            // the invisible form/input cannot be focused/selected.\r\n            //\r\n            // Each time a dropdown is closed, move the focus back to the find and replace toolbar button\r\n            // and let the find and replace editing feature know that all search results can be invalidated\r\n            // and no longer should be marked in the content.\r\n            dropdown.on('change:isOpen', (event, name, isOpen) => {\r\n                if (isOpen) {\r\n                    this.formView.disableCssTransitions();\r\n                    this.formView.reset();\r\n                    this.formView._findInputView.fieldView.select();\r\n                    this.formView.enableCssTransitions();\r\n                }\r\n                else {\r\n                    this.fire('searchReseted');\r\n                }\r\n            }, { priority: 'low' });\r\n            this._setupDropdownButton(dropdown);\r\n            return dropdown;\r\n        });\r\n    }\r\n    /**\r\n     * Sets up the find and replace button.\r\n     */\r\n    _setupDropdownButton(dropdown) {\r\n        const editor = this.editor;\r\n        const t = editor.locale.t;\r\n        dropdown.buttonView.set({\r\n            icon: loupeIcon,\r\n            label: t('Find and replace'),\r\n            keystroke: 'CTRL+F',\r\n            tooltip: true\r\n        });\r\n        editor.keystrokes.set('Ctrl+F', (data, cancelEvent) => {\r\n            if (dropdown.isEnabled) {\r\n                dropdown.isOpen = true;\r\n                cancelEvent();\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Sets up the form view for the find and replace.\r\n     *\r\n     * @param formView A related form view.\r\n     */\r\n    _setupFormView(formView) {\r\n        const editor = this.editor;\r\n        const commands = editor.commands;\r\n        const findAndReplaceEditing = this.editor.plugins.get('FindAndReplaceEditing');\r\n        const editingState = findAndReplaceEditing.state;\r\n        const sortMapping = { before: -1, same: 0, after: 1, different: 1 };\r\n        // Let the form know which result is being highlighted.\r\n        formView.bind('highlightOffset').to(editingState, 'highlightedResult', highlightedResult => {\r\n            if (!highlightedResult) {\r\n                return 0;\r\n            }\r\n            return Array.from(editingState.results)\r\n                .sort((a, b) => sortMapping[a.marker.getStart().compareWith(b.marker.getStart())])\r\n                .indexOf(highlightedResult) + 1;\r\n        });\r\n        // Let the form know how many results were found in total.\r\n        formView.listenTo(editingState.results, 'change', () => {\r\n            formView.matchCount = editingState.results.length;\r\n        });\r\n        // Command states are used to enable/disable individual form controls.\r\n        // To keep things simple, instead of binding 4 individual observables, there's only one that combines every\r\n        // commands' isEnabled state. Yes, it will change more often but this simplifies the structure of the form.\r\n        const findNextCommand = commands.get('findNext');\r\n        const findPreviousCommand = commands.get('findPrevious');\r\n        const replaceCommand = commands.get('replace');\r\n        const replaceAllCommand = commands.get('replaceAll');\r\n        formView.bind('_areCommandsEnabled').to(findNextCommand, 'isEnabled', findPreviousCommand, 'isEnabled', replaceCommand, 'isEnabled', replaceAllCommand, 'isEnabled', (findNext, findPrevious, replace, replaceAll) => ({ findNext, findPrevious, replace, replaceAll }));\r\n        // The UI plugin works as an interface between the form and the editing part of the feature.\r\n        formView.delegate('findNext', 'findPrevious', 'replace', 'replaceAll').to(this);\r\n        // Let the feature know that search results are no longer relevant because the user changed the searched phrase\r\n        // (or options) but didn't hit the \"Find\" button yet (e.g. still typing).\r\n        formView.on('change:isDirty', (evt, data, isDirty) => {\r\n            if (isDirty) {\r\n                this.fire('searchReseted');\r\n            }\r\n        });\r\n    }\r\n}\r\n","export default \"<svg viewBox=\\\"0 0 20 20\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"m12.87 13.786 1.532-1.286 3.857 4.596a1 1 0 1 1-1.532 1.286l-3.857-4.596z\\\"/><path d=\\\"M16.004 8.5a6.5 6.5 0 0 1-9.216 5.905c-1.154-.53-.863-1.415-.663-1.615.194-.194.564-.592 1.635-.141a4.5 4.5 0 0 0 5.89-5.904l-.104-.227 1.332-1.331c.045-.046.196-.041.224.007a6.47 6.47 0 0 1 .902 3.306zm-3.4-5.715c.562.305.742 1.106.354 1.494-.388.388-.995.414-1.476.178a4.5 4.5 0 0 0-6.086 5.882l.114.236-1.348 1.349c-.038.037-.17.022-.198-.023a6.5 6.5 0 0 1 5.54-9.9 6.469 6.469 0 0 1 3.1.784z\\\"/><path d=\\\"M4.001 11.93.948 8.877a.2.2 0 0 1 .141-.341h6.106a.2.2 0 0 1 .141.341L4.283 11.93a.2.2 0 0 1-.282 0zm11.083-6.789 3.053 3.053a.2.2 0 0 1-.14.342H11.89a.2.2 0 0 1-.14-.342l3.052-3.053a.2.2 0 0 1 .282 0z\\\"/></svg>\";","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\n/**\r\n * The find command. It is used by the {@link module:find-and-replace/findandreplace~FindAndReplace find and replace feature}.\r\n */\r\nexport default class FindCommand extends Command {\r\n    /**\r\n     * Creates a new `FindCommand` instance.\r\n     *\r\n     * @param editor The editor on which this command will be used.\r\n     * @param state An object to hold plugin state.\r\n     */\r\n    constructor(editor, state) {\r\n        super(editor);\r\n        // The find command is always enabled.\r\n        this.isEnabled = true;\r\n        // It does not affect data so should be enabled in read-only mode.\r\n        this.affectsData = false;\r\n        this._state = state;\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * @param callbackOrText\r\n     * @param options Options object.\r\n     * @param options.matchCase If set to `true`, the letter case will be matched.\r\n     * @param options.wholeWords If set to `true`, only whole words that match `callbackOrText` will be matched.\r\n     *\r\n     * @fires execute\r\n     */\r\n    execute(callbackOrText, { matchCase, wholeWords } = {}) {\r\n        const { editor } = this;\r\n        const { model } = editor;\r\n        const findAndReplaceUtils = editor.plugins.get('FindAndReplaceUtils');\r\n        let findCallback;\r\n        // Allow to execute `find()` on a plugin with a keyword only.\r\n        if (typeof callbackOrText === 'string') {\r\n            findCallback = findAndReplaceUtils.findByTextCallback(callbackOrText, { matchCase, wholeWords });\r\n            this._state.searchText = callbackOrText;\r\n        }\r\n        else {\r\n            findCallback = callbackOrText;\r\n        }\r\n        // Initial search is done on all nodes in all roots inside the content.\r\n        const results = model.document.getRootNames()\r\n            .reduce(((currentResults, rootName) => findAndReplaceUtils.updateFindResultFromRange(model.createRangeIn(model.document.getRoot(rootName)), model, findCallback, currentResults)), null);\r\n        this._state.clear(model);\r\n        this._state.results.addMany(results);\r\n        this._state.highlightedResult = results.get(0);\r\n        if (typeof callbackOrText === 'string') {\r\n            this._state.searchText = callbackOrText;\r\n        }\r\n        this._state.matchCase = !!matchCase;\r\n        this._state.matchWholeWords = !!wholeWords;\r\n        return {\r\n            results,\r\n            findCallback\r\n        };\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module find-and-replace/replacecommandbase\r\n*/\r\nimport { Command } from 'ckeditor5/src/core';\r\nexport class ReplaceCommandBase extends Command {\r\n    /**\r\n     * Creates a new `ReplaceCommand` instance.\r\n     *\r\n     * @param editor Editor on which this command will be used.\r\n     * @param state An object to hold plugin state.\r\n     */\r\n    constructor(editor, state) {\r\n        super(editor);\r\n        // The replace command is always enabled.\r\n        this.isEnabled = true;\r\n        this._state = state;\r\n        // Since this command executes on particular result independent of selection, it should be checked directly in execute block.\r\n        this._isEnabledBasedOnSelection = false;\r\n    }\r\n    /**\r\n     * Common logic for both `replace` commands.\r\n     * Replace a given find result by a string or a callback.\r\n     *\r\n     * @param result A single result from the find command.\r\n     */\r\n    _replace(replacementText, result) {\r\n        const { model } = this.editor;\r\n        const range = result.marker.getRange();\r\n        // Don't replace a result that is in non-editable place.\r\n        if (!model.canEditAt(range)) {\r\n            return;\r\n        }\r\n        model.change(writer => {\r\n            // Don't replace a result (marker) that found its way into the $graveyard (e.g. removed by collaborators).\r\n            if (range.root.rootName === '$graveyard') {\r\n                this._state.results.remove(result);\r\n                return;\r\n            }\r\n            let textAttributes = {};\r\n            for (const item of range.getItems()) {\r\n                if (item.is('$text') || item.is('$textProxy')) {\r\n                    textAttributes = item.getAttributes();\r\n                    break;\r\n                }\r\n            }\r\n            model.insertContent(writer.createText(replacementText, textAttributes), range);\r\n            if (this._state.results.has(result)) {\r\n                this._state.results.remove(result);\r\n            }\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { ReplaceCommandBase } from './replacecommandbase';\r\n/**\r\n * The replace command. It is used by the {@link module:find-and-replace/findandreplace~FindAndReplace find and replace feature}.\r\n */\r\nexport default class ReplaceCommand extends ReplaceCommandBase {\r\n    /**\r\n     * Replace a given find result by a string or a callback.\r\n     *\r\n     * @param result A single result from the find command.\r\n     *\r\n     * @fires execute\r\n     */\r\n    execute(replacementText, result) {\r\n        this._replace(replacementText, result);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module find-and-replace/replaceallcommand\r\n */\r\nimport { Collection } from 'ckeditor5/src/utils';\r\nimport { ReplaceCommandBase } from './replacecommandbase';\r\n/**\r\n * The replace all command. It is used by the {@link module:find-and-replace/findandreplace~FindAndReplace find and replace feature}.\r\n */\r\nexport default class ReplaceAllCommand extends ReplaceCommandBase {\r\n    /**\r\n     * Replaces all the occurrences of `textToReplace` with a given `newText` string.\r\n     *\r\n     * ```ts\r\n     *\treplaceAllCommand.execute( 'replaceAll', 'new text replacement', 'text to replace' );\r\n     * ```\r\n     *\r\n     * Alternatively you can call it from editor instance:\r\n     *\r\n     * ```ts\r\n     *\teditor.execute( 'replaceAll', 'new text', 'old text' );\r\n     * ```\r\n     *\r\n     * @param newText Text that will be inserted to the editor for each match.\r\n     * @param textToReplace Text to be replaced or a collection of matches\r\n     * as returned by the find command.\r\n     *\r\n     * @fires module:core/command~Command#event:execute\r\n     */\r\n    execute(newText, textToReplace) {\r\n        const { editor } = this;\r\n        const { model } = editor;\r\n        const findAndReplaceUtils = editor.plugins.get('FindAndReplaceUtils');\r\n        const results = textToReplace instanceof Collection ?\r\n            textToReplace : model.document.getRootNames()\r\n            .reduce(((currentResults, rootName) => findAndReplaceUtils.updateFindResultFromRange(model.createRangeIn(model.document.getRoot(rootName)), model, findAndReplaceUtils.findByTextCallback(textToReplace, this._state), currentResults)), null);\r\n        if (results.length) {\r\n            [...results].forEach(searchResult => {\r\n                // Just reuse logic from the replace command to replace a single match.\r\n                this._replace(newText, searchResult);\r\n            });\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module find-and-replace/findnextcommand\r\n*/\r\nimport { Command } from 'ckeditor5/src/core';\r\n/**\r\n * The find next command. Moves the highlight to the next search result.\r\n *\r\n * It is used by the {@link module:find-and-replace/findandreplace~FindAndReplace find and replace feature}.\r\n */\r\nexport default class FindNextCommand extends Command {\r\n    /**\r\n     * Creates a new `FindNextCommand` instance.\r\n     *\r\n     * @param editor The editor on which this command will be used.\r\n     * @param state An object to hold plugin state.\r\n     */\r\n    constructor(editor, state) {\r\n        super(editor);\r\n        // It does not affect data so should be enabled in read-only mode.\r\n        this.affectsData = false;\r\n        this._state = state;\r\n        this.isEnabled = false;\r\n        this.listenTo(this._state.results, 'change', () => {\r\n            this.isEnabled = this._state.results.length > 1;\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        this.isEnabled = this._state.results.length > 1;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    execute() {\r\n        const results = this._state.results;\r\n        const currentIndex = results.getIndex(this._state.highlightedResult);\r\n        const nextIndex = currentIndex + 1 >= results.length ?\r\n            0 : currentIndex + 1;\r\n        this._state.highlightedResult = this._state.results.get(nextIndex);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module find-and-replace/findpreviouscommand\r\n*/\r\nimport FindNextCommand from './findnextcommand';\r\n/**\r\n * The find previous command. Moves the highlight to the previous search result.\r\n *\r\n * It is used by the {@link module:find-and-replace/findandreplace~FindAndReplace find and replace feature}.\r\n */\r\nexport default class FindPreviousCommand extends FindNextCommand {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    execute() {\r\n        const results = this._state.results;\r\n        const currentIndex = results.getIndex(this._state.highlightedResult);\r\n        const previousIndex = currentIndex - 1 < 0 ?\r\n            this._state.results.length - 1 : currentIndex - 1;\r\n        this._state.highlightedResult = this._state.results.get(previousIndex);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { ObservableMixin, Collection } from 'ckeditor5/src/utils';\r\n/**\r\n * The object storing find and replace plugin state for a given editor instance.\r\n */\r\nexport default class FindAndReplaceState extends ObservableMixin() {\r\n    /**\r\n     * Creates an instance of the state.\r\n     */\r\n    constructor(model) {\r\n        super();\r\n        this.set('results', new Collection());\r\n        this.set('highlightedResult', null);\r\n        this.set('searchText', '');\r\n        this.set('replaceText', '');\r\n        this.set('matchCase', false);\r\n        this.set('matchWholeWords', false);\r\n        this.results.on('change', (eventInfo, { removed, index }) => {\r\n            if (Array.from(removed).length) {\r\n                let highlightedResultRemoved = false;\r\n                model.change(writer => {\r\n                    for (const removedResult of removed) {\r\n                        if (this.highlightedResult === removedResult) {\r\n                            highlightedResultRemoved = true;\r\n                        }\r\n                        if (model.markers.has(removedResult.marker.name)) {\r\n                            writer.removeMarker(removedResult.marker);\r\n                        }\r\n                    }\r\n                });\r\n                if (highlightedResultRemoved) {\r\n                    const nextHighlightedIndex = index >= this.results.length ? 0 : index;\r\n                    this.highlightedResult = this.results.get(nextHighlightedIndex);\r\n                }\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Cleans the state up and removes markers from the model.\r\n     */\r\n    clear(model) {\r\n        this.searchText = '';\r\n        model.change(writer => {\r\n            if (this.highlightedResult) {\r\n                const oldMatchId = this.highlightedResult.marker.name.split(':')[1];\r\n                const oldMarker = model.markers.get(`findResultHighlighted:${oldMatchId}`);\r\n                if (oldMarker) {\r\n                    writer.removeMarker(oldMarker);\r\n                }\r\n            }\r\n            [...this.results].forEach(({ marker }) => {\r\n                writer.removeMarker(marker);\r\n            });\r\n        });\r\n        this.results.clear();\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { Collection, uid } from 'ckeditor5/src/utils';\r\nimport { escapeRegExp } from 'lodash-es';\r\n/**\r\n * A set of helpers related to find and replace.\r\n */\r\nexport default class FindAndReplaceUtils extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'FindAndReplaceUtils';\r\n    }\r\n    /**\r\n     * Executes findCallback and updates search results list.\r\n     *\r\n     * @param range The model range to scan for matches.\r\n     * @param model The model.\r\n     * @param findCallback The callback that should return `true` if provided text matches the search term.\r\n     * @param startResults An optional collection of find matches that the function should\r\n     * start with. This would be a collection returned by a previous `updateFindResultFromRange()` call.\r\n     * @returns A collection of objects describing find match.\r\n     *\r\n     * An example structure:\r\n     *\r\n     * ```js\r\n     * {\r\n     *\tid: resultId,\r\n     *\tlabel: foundItem.label,\r\n     *\tmarker\r\n     *\t}\r\n     * ```\r\n     */\r\n    updateFindResultFromRange(range, model, findCallback, startResults) {\r\n        const results = startResults || new Collection();\r\n        model.change(writer => {\r\n            [...range].forEach(({ type, item }) => {\r\n                if (type === 'elementStart') {\r\n                    if (model.schema.checkChild(item, '$text')) {\r\n                        const foundItems = findCallback({\r\n                            item,\r\n                            text: this.rangeToText(model.createRangeIn(item))\r\n                        });\r\n                        if (!foundItems) {\r\n                            return;\r\n                        }\r\n                        foundItems.forEach(foundItem => {\r\n                            const resultId = `findResult:${uid()}`;\r\n                            const marker = writer.addMarker(resultId, {\r\n                                usingOperation: false,\r\n                                affectsData: false,\r\n                                range: writer.createRange(writer.createPositionAt(item, foundItem.start), writer.createPositionAt(item, foundItem.end))\r\n                            });\r\n                            const index = findInsertIndex(results, marker);\r\n                            results.add({\r\n                                id: resultId,\r\n                                label: foundItem.label,\r\n                                marker\r\n                            }, index);\r\n                        });\r\n                    }\r\n                }\r\n            });\r\n        });\r\n        return results;\r\n    }\r\n    /**\r\n     * Returns text representation of a range. The returned text length should be the same as range length.\r\n     * In order to achieve this, this function will replace inline elements (text-line) as new line character (\"\\n\").\r\n     *\r\n     * @param range The model range.\r\n     * @returns The text content of the provided range.\r\n     */\r\n    rangeToText(range) {\r\n        return Array.from(range.getItems()).reduce((rangeText, node) => {\r\n            // Trim text to a last occurrence of an inline element and update range start.\r\n            if (!(node.is('$text') || node.is('$textProxy'))) {\r\n                // Editor has only one inline element defined in schema: `<softBreak>` which is treated as new line character in blocks.\r\n                // Special handling might be needed for other inline elements (inline widgets).\r\n                return `${rangeText}\\n`;\r\n            }\r\n            return rangeText + node.data;\r\n        }, '');\r\n    }\r\n    /**\r\n     * Creates a text matching callback for a specified search term and matching options.\r\n     *\r\n     * @param searchTerm The search term.\r\n     * @param options Matching options.\r\n     * \t- options.matchCase=false If set to `true` letter casing will be ignored.\r\n     * \t- options.wholeWords=false If set to `true` only whole words that match `callbackOrText` will be matched.\r\n     */\r\n    findByTextCallback(searchTerm, options) {\r\n        let flags = 'gu';\r\n        if (!options.matchCase) {\r\n            flags += 'i';\r\n        }\r\n        let regExpQuery = `(${escapeRegExp(searchTerm)})`;\r\n        if (options.wholeWords) {\r\n            const nonLetterGroup = '[^a-zA-Z\\u00C0-\\u024F\\u1E00-\\u1EFF]';\r\n            if (!new RegExp('^' + nonLetterGroup).test(searchTerm)) {\r\n                regExpQuery = `(^|${nonLetterGroup}|_)${regExpQuery}`;\r\n            }\r\n            if (!new RegExp(nonLetterGroup + '$').test(searchTerm)) {\r\n                regExpQuery = `${regExpQuery}(?=_|${nonLetterGroup}|$)`;\r\n            }\r\n        }\r\n        const regExp = new RegExp(regExpQuery, flags);\r\n        function findCallback({ text }) {\r\n            const matches = [...text.matchAll(regExp)];\r\n            return matches.map(regexpMatchToFindResult);\r\n        }\r\n        return findCallback;\r\n    }\r\n}\r\n// Finds the appropriate index in the resultsList Collection.\r\nfunction findInsertIndex(resultsList, markerToInsert) {\r\n    const result = resultsList.find(({ marker }) => {\r\n        return markerToInsert.getStart().isBefore(marker.getStart());\r\n    });\r\n    return result ? resultsList.getIndex(result) : resultsList.length;\r\n}\r\n/**\r\n *  Maps RegExp match result to find result.\r\n */\r\nfunction regexpMatchToFindResult(matchResult) {\r\n    const lastGroupIndex = matchResult.length - 1;\r\n    let startOffset = matchResult.index;\r\n    // Searches with match all flag have an extra matching group with empty string or white space matched before the word.\r\n    // If the search term starts with the space already, there is no extra group even with match all flag on.\r\n    if (matchResult.length === 3) {\r\n        startOffset += matchResult[1].length;\r\n    }\r\n    return {\r\n        label: matchResult[lastGroupIndex],\r\n        start: startOffset,\r\n        end: startOffset + matchResult[lastGroupIndex].length\r\n    };\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./findandreplace.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module find-and-replace/findandreplaceediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { scrollViewportToShowTarget } from 'ckeditor5/src/utils';\r\nimport FindCommand from './findcommand';\r\nimport ReplaceCommand from './replacecommand';\r\nimport ReplaceAllCommand from './replaceallcommand';\r\nimport FindNextCommand from './findnextcommand';\r\nimport FindPreviousCommand from './findpreviouscommand';\r\nimport FindAndReplaceState from './findandreplacestate';\r\nimport FindAndReplaceUtils from './findandreplaceutils';\r\nimport { debounce } from 'lodash-es';\r\nimport '../theme/findandreplace.css';\r\nconst HIGHLIGHT_CLASS = 'ck-find-result_selected';\r\n/**\r\n * Reacts to document changes in order to update search list.\r\n */\r\nfunction onDocumentChange(results, editor, searchCallback) {\r\n    const changedNodes = new Set();\r\n    const removedMarkers = new Set();\r\n    const model = editor.model;\r\n    const changes = model.document.differ.getChanges();\r\n    // Get nodes in which changes happened to re-run a search callback on them.\r\n    changes.forEach(change => {\r\n        if (change.name === '$text' || model.schema.isInline(change.position.nodeAfter)) {\r\n            changedNodes.add(change.position.parent);\r\n            [...model.markers.getMarkersAtPosition(change.position)].forEach(markerAtChange => {\r\n                removedMarkers.add(markerAtChange.name);\r\n            });\r\n        }\r\n        else if (change.type === 'insert') {\r\n            changedNodes.add(change.position.nodeAfter);\r\n        }\r\n    });\r\n    // Get markers from removed nodes also.\r\n    model.document.differ.getChangedMarkers().forEach(({ name, data: { newRange } }) => {\r\n        if (newRange && newRange.start.root.rootName === '$graveyard') {\r\n            removedMarkers.add(name);\r\n        }\r\n    });\r\n    // Get markers from the updated nodes and remove all (search will be re-run on these nodes).\r\n    changedNodes.forEach(node => {\r\n        const markersInNode = [...model.markers.getMarkersIntersectingRange(model.createRangeIn(node))];\r\n        markersInNode.forEach(marker => removedMarkers.add(marker.name));\r\n    });\r\n    // Remove results & markers from the changed part of content.\r\n    model.change(writer => {\r\n        removedMarkers.forEach(markerName => {\r\n            // Remove the result first - in order to prevent rendering a removed marker.\r\n            if (results.has(markerName)) {\r\n                results.remove(markerName);\r\n            }\r\n            writer.removeMarker(markerName);\r\n        });\r\n    });\r\n    // Run search callback again on updated nodes.\r\n    changedNodes.forEach(nodeToCheck => {\r\n        const findAndReplaceUtils = editor.plugins.get('FindAndReplaceUtils');\r\n        findAndReplaceUtils.updateFindResultFromRange(model.createRangeOn(nodeToCheck), model, searchCallback, results);\r\n    });\r\n}\r\n/**\r\n * Implements the editing part for find and replace plugin. For example conversion, commands etc.\r\n */\r\nexport default class FindAndReplaceEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [FindAndReplaceUtils];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'FindAndReplaceEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        this._activeResults = null;\r\n        this.state = new FindAndReplaceState(this.editor.model);\r\n        this._defineConverters();\r\n        this._defineCommands();\r\n        this.listenTo(this.state, 'change:highlightedResult', (eventInfo, name, newValue, oldValue) => {\r\n            const { model } = this.editor;\r\n            model.change(writer => {\r\n                if (oldValue) {\r\n                    const oldMatchId = oldValue.marker.name.split(':')[1];\r\n                    const oldMarker = model.markers.get(`findResultHighlighted:${oldMatchId}`);\r\n                    if (oldMarker) {\r\n                        writer.removeMarker(oldMarker);\r\n                    }\r\n                }\r\n                if (newValue) {\r\n                    const newMatchId = newValue.marker.name.split(':')[1];\r\n                    writer.addMarker(`findResultHighlighted:${newMatchId}`, {\r\n                        usingOperation: false,\r\n                        affectsData: false,\r\n                        range: newValue.marker.getRange()\r\n                    });\r\n                }\r\n            });\r\n        });\r\n        /* istanbul ignore next -- @preserve */\r\n        const scrollToHighlightedResult = (eventInfo, name, newValue) => {\r\n            if (newValue) {\r\n                const domConverter = this.editor.editing.view.domConverter;\r\n                const viewRange = this.editor.editing.mapper.toViewRange(newValue.marker.getRange());\r\n                scrollViewportToShowTarget({\r\n                    target: domConverter.viewRangeToDom(viewRange),\r\n                    viewportOffset: 40\r\n                });\r\n            }\r\n        };\r\n        const debouncedScrollListener = debounce(scrollToHighlightedResult.bind(this), 32);\r\n        // Debounce scroll as highlight might be changed very frequently, e.g. when there's a replace all command.\r\n        this.listenTo(this.state, 'change:highlightedResult', debouncedScrollListener, { priority: 'low' });\r\n        // It's possible that the editor will get destroyed before debounced call kicks in.\r\n        // This would result with accessing a view three that is no longer in DOM.\r\n        this.listenTo(this.editor, 'destroy', debouncedScrollListener.cancel);\r\n    }\r\n    /**\r\n     * Initiate a search.\r\n     */\r\n    find(callbackOrText) {\r\n        const { editor } = this;\r\n        const { model } = editor;\r\n        const { findCallback, results } = editor.execute('find', callbackOrText);\r\n        this._activeResults = results;\r\n        // @todo: handle this listener, another copy is in findcommand.js file.\r\n        this.listenTo(model.document, 'change:data', () => onDocumentChange(this._activeResults, editor, findCallback));\r\n        return this._activeResults;\r\n    }\r\n    /**\r\n     * Stops active results from updating, and clears out the results.\r\n     */\r\n    stop() {\r\n        if (!this._activeResults) {\r\n            return;\r\n        }\r\n        this.stopListening(this.editor.model.document);\r\n        this.state.clear(this.editor.model);\r\n        this._activeResults = null;\r\n    }\r\n    /**\r\n     * Sets up the commands.\r\n     */\r\n    _defineCommands() {\r\n        this.editor.commands.add('find', new FindCommand(this.editor, this.state));\r\n        this.editor.commands.add('findNext', new FindNextCommand(this.editor, this.state));\r\n        this.editor.commands.add('findPrevious', new FindPreviousCommand(this.editor, this.state));\r\n        this.editor.commands.add('replace', new ReplaceCommand(this.editor, this.state));\r\n        this.editor.commands.add('replaceAll', new ReplaceAllCommand(this.editor, this.state));\r\n    }\r\n    /**\r\n     * Sets up the marker downcast converters for search results highlighting.\r\n     */\r\n    _defineConverters() {\r\n        const { editor } = this;\r\n        // Setup the marker highlighting conversion.\r\n        editor.conversion.for('editingDowncast').markerToHighlight({\r\n            model: 'findResult',\r\n            view: ({ markerName }) => {\r\n                const [, id] = markerName.split(':');\r\n                // Marker removal from the view has a bug: https://github.com/ckeditor/ckeditor5/issues/7499\r\n                // A minimal option is to return a new object for each converted marker...\r\n                return {\r\n                    name: 'span',\r\n                    classes: ['ck-find-result'],\r\n                    attributes: {\r\n                        // ...however, adding a unique attribute should be future-proof..\r\n                        'data-find-result': id\r\n                    }\r\n                };\r\n            }\r\n        });\r\n        editor.conversion.for('editingDowncast').markerToHighlight({\r\n            model: 'findResultHighlighted',\r\n            view: ({ markerName }) => {\r\n                const [, id] = markerName.split(':');\r\n                // Marker removal from the view has a bug: https://github.com/ckeditor/ckeditor5/issues/7499\r\n                // A minimal option is to return a new object for each converted marker...\r\n                return {\r\n                    name: 'span',\r\n                    classes: [HIGHLIGHT_CLASS],\r\n                    attributes: {\r\n                        // ...however, adding a unique attribute should be future-proof..\r\n                        'data-find-result': id\r\n                    }\r\n                };\r\n            }\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module font/fontcommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\n/**\r\n * The base font command.\r\n */\r\nexport default class FontCommand extends Command {\r\n    /**\r\n     * Creates an instance of the command.\r\n     *\r\n     * @param editor Editor instance.\r\n     * @param attributeKey The name of a model attribute on which this command operates.\r\n     */\r\n    constructor(editor, attributeKey) {\r\n        super(editor);\r\n        this.attributeKey = attributeKey;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const model = this.editor.model;\r\n        const doc = model.document;\r\n        this.value = doc.selection.getAttribute(this.attributeKey);\r\n        this.isEnabled = model.schema.checkAttributeInSelection(doc.selection, this.attributeKey);\r\n    }\r\n    /**\r\n     * Executes the command. Applies the `value` of the {@link #attributeKey} to the selection.\r\n     * If no `value` is passed, it removes the attribute from the selection.\r\n     *\r\n     * @param options Options for the executed command.\r\n     * @param options.value The value to apply.\r\n     * @fires execute\r\n     */\r\n    execute(options = {}) {\r\n        const model = this.editor.model;\r\n        const document = model.document;\r\n        const selection = document.selection;\r\n        const value = options.value;\r\n        const batch = options.batch;\r\n        const updateAttribute = (writer) => {\r\n            if (selection.isCollapsed) {\r\n                if (value) {\r\n                    writer.setSelectionAttribute(this.attributeKey, value);\r\n                }\r\n                else {\r\n                    writer.removeSelectionAttribute(this.attributeKey);\r\n                }\r\n            }\r\n            else {\r\n                const ranges = model.schema.getValidRanges(selection.getRanges(), this.attributeKey);\r\n                for (const range of ranges) {\r\n                    if (value) {\r\n                        writer.setAttribute(this.attributeKey, value, range);\r\n                    }\r\n                    else {\r\n                        writer.removeAttribute(this.attributeKey, range);\r\n                    }\r\n                }\r\n            }\r\n        };\r\n        // In some scenarios, you may want to use a single undo step for multiple changes (e.g. in color picker).\r\n        if (batch) {\r\n            model.enqueueChange(batch, writer => {\r\n                updateAttribute(writer);\r\n            });\r\n        }\r\n        else {\r\n            model.change(writer => {\r\n                updateAttribute(writer);\r\n            });\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Collection, ObservableMixin } from 'ckeditor5/src/utils';\r\n/**\r\n * A collection to store document colors. It enforces colors to be unique.\r\n */\r\nexport default class DocumentColorCollection extends ObservableMixin((Collection)) {\r\n    constructor(options) {\r\n        super(options);\r\n        this.set('isEmpty', true);\r\n        this.on('change', () => {\r\n            this.set('isEmpty', this.length === 0);\r\n        });\r\n    }\r\n    /**\r\n     * Adds a color to the document color collection.\r\n     *\r\n     * This method ensures that no color duplicates are inserted (compared using\r\n     * the color value of the {@link module:ui/colorgrid/colorgridview~ColorDefinition}).\r\n     *\r\n     * If the item does not have an ID, it will be automatically generated and set on the item.\r\n     *\r\n     * @param index The position of the item in the collection. The item is pushed to the collection when `index` is not specified.\r\n     * @fires add\r\n     * @fires change\r\n     */\r\n    add(item, index) {\r\n        if (this.find(element => element.color === item.color)) {\r\n            // No duplicates are allowed.\r\n            return this;\r\n        }\r\n        return super.add(item, index);\r\n    }\r\n    /**\r\n     * Checks if an object with given colors is present in the document color collection.\r\n     */\r\n    hasColor(color) {\r\n        return !!this.find(item => item.color === color);\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./fontcolor.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module font/ui/colortableview\r\n */\r\nimport { icons } from 'ckeditor5/src/core';\r\nimport { ButtonView, ColorGridView, ColorTileView, FocusCycler, LabelView, Template, View, ViewCollection, ColorPickerView, icons as uiIcons } from 'ckeditor5/src/ui';\r\nimport { FocusTracker, KeystrokeHandler } from 'ckeditor5/src/utils';\r\nimport DocumentColorCollection from '../documentcolorcollection';\r\nimport '../../theme/fontcolor.css';\r\n/**\r\n * A class which represents a view with the following sub–components:\r\n *\r\n * * A {@link module:font/ui/colortableview~ColorTableView#colorGridsPageView color grids component},\r\n * * A {@link module:font/ui/colortableview~ColorTableView#colorPickerPageView color picker component}.\r\n */\r\nexport default class ColorTableView extends View {\r\n    /**\r\n     * Creates a view to be inserted as a child of {@link module:ui/dropdown/dropdownview~DropdownView}.\r\n     *\r\n     * @param locale The localization services instance.\r\n     * @param colors An array with definitions of colors to be displayed in the table.\r\n     * @param columns The number of columns in the color grid.\r\n     * @param removeButtonLabel The label of the button responsible for removing the color.\r\n     * @param colorPickerLabel The label of the button responsible for color picker appearing.\r\n     * @param documentColorsLabel The label for the section with the document colors.\r\n     * @param documentColorsCount The number of colors in the document colors section inside the color dropdown.\r\n     * @param colorPickerConfig The configuration of color picker feature.\r\n     */\r\n    constructor(locale, { colors, columns, removeButtonLabel, documentColorsLabel, documentColorsCount, colorPickerLabel, colorPickerConfig }) {\r\n        super(locale);\r\n        this.items = this.createCollection();\r\n        this.focusTracker = new FocusTracker();\r\n        this.keystrokes = new KeystrokeHandler();\r\n        this._focusables = new ViewCollection();\r\n        this._colorPickerConfig = colorPickerConfig;\r\n        this._focusCycler = new FocusCycler({\r\n            focusables: this._focusables,\r\n            focusTracker: this.focusTracker,\r\n            keystrokeHandler: this.keystrokes,\r\n            actions: {\r\n                // Navigate list items backwards using the <kbd>Shift</kbd> + <kbd>Tab</kbd> keystroke.\r\n                focusPrevious: 'shift + tab',\r\n                // Navigate list items forwards using the <kbd>Tab</kbd> key.\r\n                focusNext: 'tab'\r\n            }\r\n        });\r\n        this.colorGridsPageView = new ColorGridsPageView(locale, {\r\n            colors, columns, removeButtonLabel, documentColorsLabel, documentColorsCount, colorPickerLabel,\r\n            focusTracker: this.focusTracker,\r\n            focusables: this._focusables\r\n        });\r\n        this.colorPickerPageView = new ColorPickerPageView(locale, {\r\n            focusables: this._focusables,\r\n            focusTracker: this.focusTracker,\r\n            keystrokes: this.keystrokes,\r\n            colorPickerConfig\r\n        });\r\n        this.set('_isColorGridsPageVisible', true);\r\n        this.set('_isColorPickerPageVisible', false);\r\n        this.set('selectedColor', undefined);\r\n        this.colorGridsPageView.bind('isVisible').to(this, '_isColorGridsPageVisible');\r\n        this.colorPickerPageView.bind('isVisible').to(this, '_isColorPickerPageVisible');\r\n        /**\r\n         * This is kind of bindings. Unfortunately we could not use this.bind() method because the same property\r\n         * can not be binded twice. So this is work around how to bind 'selectedColor' property between components.\r\n         */\r\n        this.on('change:selectedColor', (evt, evtName, data) => {\r\n            this.colorGridsPageView.set('selectedColor', data);\r\n            this.colorPickerPageView.set('selectedColor', data);\r\n        });\r\n        this.colorGridsPageView.on('change:selectedColor', (evt, evtName, data) => {\r\n            this.set('selectedColor', data);\r\n        });\r\n        this.colorPickerPageView.on('change:selectedColor', (evt, evtName, data) => {\r\n            this.set('selectedColor', data);\r\n        });\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-color-table'\r\n                ]\r\n            },\r\n            children: this.items\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        // Start listening for the keystrokes coming from #element.\r\n        this.keystrokes.listenTo(this.element);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        this.focusTracker.destroy();\r\n        this.keystrokes.destroy();\r\n    }\r\n    /**\r\n     * Appends static and document color grid views.\r\n     */\r\n    appendGrids() {\r\n        if (this.items.length) {\r\n            return;\r\n        }\r\n        this.items.add(this.colorGridsPageView);\r\n        this.colorGridsPageView.delegate('execute').to(this);\r\n        this.colorGridsPageView.delegate('showColorPicker').to(this);\r\n    }\r\n    /**\r\n     * Renders UI in dropdown. Which sub-components are rendered\r\n     * depends on the component configuration.\r\n     */\r\n    appendUI() {\r\n        this.appendGrids();\r\n        if (this._colorPickerConfig) {\r\n            this._appendColorPicker();\r\n        }\r\n    }\r\n    /**\r\n     * Show \"Color picker\" and hide \"Color grids\".\r\n     */\r\n    showColorPicker() {\r\n        if (!this.colorPickerPageView.colorPickerView) {\r\n            return;\r\n        }\r\n        this.set('_isColorPickerPageVisible', true);\r\n        this.colorPickerPageView.focus();\r\n        this.set('_isColorGridsPageVisible', false);\r\n    }\r\n    /**\r\n     * Show \"Color grids\" and hide \"Color picker\".\r\n     */\r\n    showColorGrids() {\r\n        this.set('_isColorGridsPageVisible', true);\r\n        this.set('_isColorPickerPageVisible', false);\r\n    }\r\n    /**\r\n     * Focuses the first focusable element in {@link #items}.\r\n     */\r\n    focus() {\r\n        this._focusCycler.focusFirst();\r\n    }\r\n    /**\r\n     * Focuses the last focusable element in {@link #items}.\r\n     */\r\n    focusLast() {\r\n        this._focusCycler.focusLast();\r\n    }\r\n    /**\r\n     * Scans through the editor model and searches for text node attributes with the given attribute name.\r\n     * Found entries are set as document colors.\r\n     *\r\n     * All the previously stored document colors will be lost in the process.\r\n     *\r\n     * @param model The model used as a source to obtain the document colors.\r\n     * @param attributeName Determines the name of the related model's attribute for a given dropdown.\r\n     */\r\n    updateDocumentColors(model, attributeName) {\r\n        this.colorGridsPageView.updateDocumentColors(model, attributeName);\r\n    }\r\n    /**\r\n     * Refreshes the state of the selected color in one or both {@link module:ui/colorgrid/colorgridview~ColorGridView}s\r\n     * available in the {@link module:font/ui/colortableview~ColorTableView}. It guarantees that the selection will occur only in one\r\n     * of them.\r\n     */\r\n    updateSelectedColors() {\r\n        this.colorGridsPageView.updateSelectedColors();\r\n    }\r\n    /**\r\n     * Appends the color picker view.\r\n     */\r\n    _appendColorPicker() {\r\n        if (this.items.length === 2) {\r\n            return;\r\n        }\r\n        this.items.add(this.colorPickerPageView);\r\n        if (this.colorGridsPageView.colorPickerButtonView) {\r\n            this.colorGridsPageView.colorPickerButtonView.on('execute', () => {\r\n                this.showColorPicker();\r\n            });\r\n        }\r\n        this.colorGridsPageView.addColorPickerButton();\r\n        this.colorPickerPageView.delegate('execute').to(this);\r\n        this.colorPickerPageView.delegate('cancel').to(this);\r\n    }\r\n}\r\n/**\r\n * A class which represents a view with the following sub–components:\r\n *\r\n * * A remove color button,\r\n * * A static {@link module:ui/colorgrid/colorgridview~ColorGridView} of colors defined in the configuration,\r\n * * A dynamic {@link module:ui/colorgrid/colorgridview~ColorGridView} of colors used in the document.\r\n * * If color picker is configured, the \"Color Picker\" button is visible too.\r\n */\r\nclass ColorGridsPageView extends View {\r\n    /**\r\n     * Creates a view to be inserted as a child of {@link module:ui/dropdown/dropdownview~DropdownView}.\r\n     *\r\n     * @param locale The localization services instance.\r\n     * @param colors An array with definitions of colors to be displayed in the table.\r\n     * @param columns The number of columns in the color grid.\r\n     * @param removeButtonLabel The label of the button responsible for removing the color.\r\n     * @param colorPickerLabel The label of the button responsible for color picker appearing.\r\n     * @param documentColorsLabel The label for the section with the document colors.\r\n     * @param documentColorsCount The number of colors in the document colors section inside the color dropdown.\r\n     * @param focusTracker Tracks information about the DOM focus in the list.\r\n     * @param focusables A collection of views that can be focused in the view.\r\n     */\r\n    constructor(locale, { colors, columns, removeButtonLabel, documentColorsLabel, documentColorsCount, colorPickerLabel, focusTracker, focusables }) {\r\n        super(locale);\r\n        const bind = this.bindTemplate;\r\n        this.set('isVisible', true);\r\n        this.focusTracker = focusTracker;\r\n        this.items = this.createCollection();\r\n        this.colorDefinitions = colors;\r\n        this.columns = columns;\r\n        this.documentColors = new DocumentColorCollection();\r\n        this.documentColorsCount = documentColorsCount;\r\n        this._focusables = focusables;\r\n        this._removeButtonLabel = removeButtonLabel;\r\n        this._colorPickerLabel = colorPickerLabel;\r\n        this._documentColorsLabel = documentColorsLabel;\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck-color-grids-page-view',\r\n                    bind.if('isVisible', 'ck-hidden', value => !value)\r\n                ]\r\n            },\r\n            children: this.items\r\n        });\r\n        this.removeColorButtonView = this._createRemoveColorButton();\r\n        this.items.add(this.removeColorButtonView);\r\n    }\r\n    /**\r\n     * Scans through the editor model and searches for text node attributes with the given attribute name.\r\n     * Found entries are set as document colors.\r\n     *\r\n     * All the previously stored document colors will be lost in the process.\r\n     *\r\n     * @param model The model used as a source to obtain the document colors.\r\n     * @param attributeName Determines the name of the related model's attribute for a given dropdown.\r\n     */\r\n    updateDocumentColors(model, attributeName) {\r\n        const document = model.document;\r\n        const maxCount = this.documentColorsCount;\r\n        this.documentColors.clear();\r\n        for (const rootName of document.getRootNames()) {\r\n            const root = document.getRoot(rootName);\r\n            const range = model.createRangeIn(root);\r\n            for (const node of range.getItems()) {\r\n                if (node.is('$textProxy') && node.hasAttribute(attributeName)) {\r\n                    this._addColorToDocumentColors(node.getAttribute(attributeName));\r\n                    if (this.documentColors.length >= maxCount) {\r\n                        return;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Refreshes the state of the selected color in one or both {@link module:ui/colorgrid/colorgridview~ColorGridView}s\r\n     * available in the {@link module:font/ui/colortableview~ColorTableView}. It guarantees that the selection will occur only in one\r\n     * of them.\r\n     */\r\n    updateSelectedColors() {\r\n        const documentColorsGrid = this.documentColorsGrid;\r\n        const staticColorsGrid = this.staticColorsGrid;\r\n        const selectedColor = this.selectedColor;\r\n        staticColorsGrid.selectedColor = selectedColor;\r\n        if (documentColorsGrid) {\r\n            documentColorsGrid.selectedColor = selectedColor;\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        this.staticColorsGrid = this._createStaticColorsGrid();\r\n        this.items.add(this.staticColorsGrid);\r\n        if (this.documentColorsCount) {\r\n            // Create a label for document colors.\r\n            const bind = Template.bind(this.documentColors, this.documentColors);\r\n            const label = new LabelView(this.locale);\r\n            label.text = this._documentColorsLabel;\r\n            label.extendTemplate({\r\n                attributes: {\r\n                    class: [\r\n                        'ck',\r\n                        'ck-color-grid__label',\r\n                        bind.if('isEmpty', 'ck-hidden')\r\n                    ]\r\n                }\r\n            });\r\n            this.items.add(label);\r\n            this.documentColorsGrid = this._createDocumentColorsGrid();\r\n            this.items.add(this.documentColorsGrid);\r\n        }\r\n        this._createColorPickerButton();\r\n        this._addColorTablesElementsToFocusTracker();\r\n        this.focus();\r\n    }\r\n    /**\r\n     * Focuses the component.\r\n     */\r\n    focus() {\r\n        this.removeColorButtonView.focus();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n    }\r\n    /**\r\n     * Handles displaying the color picker button (if it was previously created) and making it focusable.\r\n     */\r\n    addColorPickerButton() {\r\n        if (this.colorPickerButtonView) {\r\n            this.items.add(this.colorPickerButtonView);\r\n            this.focusTracker.add(this.colorPickerButtonView.element);\r\n            this._focusables.add(this.colorPickerButtonView);\r\n        }\r\n    }\r\n    /**\r\n     * Adds color table elements to focus tracker.\r\n     */\r\n    _addColorTablesElementsToFocusTracker() {\r\n        this.focusTracker.add(this.removeColorButtonView.element);\r\n        this._focusables.add(this.removeColorButtonView);\r\n        if (this.staticColorsGrid) {\r\n            this.focusTracker.add(this.staticColorsGrid.element);\r\n            this._focusables.add(this.staticColorsGrid);\r\n        }\r\n        if (this.documentColorsGrid) {\r\n            this.focusTracker.add(this.documentColorsGrid.element);\r\n            this._focusables.add(this.documentColorsGrid);\r\n        }\r\n    }\r\n    /**\r\n     * Creates the button responsible for displaying the color picker component.\r\n     */\r\n    _createColorPickerButton() {\r\n        this.colorPickerButtonView = new ButtonView();\r\n        this.colorPickerButtonView.set({\r\n            label: this._colorPickerLabel,\r\n            withText: true,\r\n            icon: uiIcons.colorPaletteIcon,\r\n            class: 'ck-color-table__color-picker'\r\n        });\r\n        this.colorPickerButtonView.on('execute', () => {\r\n            this.fire('showColorPicker');\r\n        });\r\n    }\r\n    /**\r\n     * Adds the remove color button as a child of the current view.\r\n     */\r\n    _createRemoveColorButton() {\r\n        const buttonView = new ButtonView();\r\n        buttonView.set({\r\n            withText: true,\r\n            icon: icons.eraser,\r\n            label: this._removeButtonLabel\r\n        });\r\n        buttonView.class = 'ck-color-table__remove-color';\r\n        buttonView.on('execute', () => {\r\n            this.fire('execute', {\r\n                value: null,\r\n                source: 'removeColorButton'\r\n            });\r\n        });\r\n        buttonView.render();\r\n        return buttonView;\r\n    }\r\n    /**\r\n     * Creates a static color table grid based on the editor configuration.\r\n     */\r\n    _createStaticColorsGrid() {\r\n        const colorGrid = new ColorGridView(this.locale, {\r\n            colorDefinitions: this.colorDefinitions,\r\n            columns: this.columns\r\n        });\r\n        colorGrid.on('execute', (evt, data) => {\r\n            this.fire('execute', {\r\n                value: data.value,\r\n                source: 'staticColorsGrid'\r\n            });\r\n        });\r\n        return colorGrid;\r\n    }\r\n    /**\r\n     * Creates the document colors section view and binds it to {@link #documentColors}.\r\n     */\r\n    _createDocumentColorsGrid() {\r\n        const bind = Template.bind(this.documentColors, this.documentColors);\r\n        const documentColorsGrid = new ColorGridView(this.locale, {\r\n            columns: this.columns\r\n        });\r\n        documentColorsGrid.extendTemplate({\r\n            attributes: {\r\n                class: bind.if('isEmpty', 'ck-hidden')\r\n            }\r\n        });\r\n        documentColorsGrid.items.bindTo(this.documentColors).using(colorObj => {\r\n            const colorTile = new ColorTileView();\r\n            colorTile.set({\r\n                color: colorObj.color,\r\n                hasBorder: colorObj.options && colorObj.options.hasBorder\r\n            });\r\n            if (colorObj.label) {\r\n                colorTile.set({\r\n                    label: colorObj.label,\r\n                    tooltip: true\r\n                });\r\n            }\r\n            colorTile.on('execute', () => {\r\n                this.fire('execute', {\r\n                    value: colorObj.color,\r\n                    source: 'documentColorsGrid'\r\n                });\r\n            });\r\n            return colorTile;\r\n        });\r\n        // Selected color should be cleared when document colors became empty.\r\n        this.documentColors.on('change:isEmpty', (evt, name, val) => {\r\n            if (val) {\r\n                documentColorsGrid.selectedColor = null;\r\n            }\r\n        });\r\n        return documentColorsGrid;\r\n    }\r\n    /**\r\n     * Adds a given color to the document colors list. If possible, the method will attempt to use\r\n     * data from the {@link #colorDefinitions} (label, color options).\r\n     *\r\n     * @param color A string that stores the value of the recently applied color.\r\n     */\r\n    _addColorToDocumentColors(color) {\r\n        const predefinedColor = this.colorDefinitions\r\n            .find(definition => definition.color === color);\r\n        if (!predefinedColor) {\r\n            this.documentColors.add({\r\n                color,\r\n                label: color,\r\n                options: {\r\n                    hasBorder: false\r\n                }\r\n            });\r\n        }\r\n        else {\r\n            this.documentColors.add(Object.assign({}, predefinedColor));\r\n        }\r\n    }\r\n}\r\n/**\r\n * A class which represents a color picker component view with the following sub–components:\r\n *\r\n * * Color picker saturation and hue sliders,\r\n * * Input accepting colors in HEX format,\r\n * * \"Save\" and \"Cancel\" action buttons.\r\n */\r\nclass ColorPickerPageView extends View {\r\n    /**\r\n     * @param locale The localization services instance.\r\n     * @param focusTracker Tracks information about the DOM focus in the list.\r\n     * @param focusables A collection of views that can be focused in the view..\r\n     * @param keystrokes An instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}.\r\n     * @param colorPickerConfig The configuration of color picker feature.\r\n     */\r\n    constructor(locale, { focusTracker, focusables, keystrokes, colorPickerConfig }) {\r\n        super(locale);\r\n        this.items = this.createCollection();\r\n        this.focusTracker = focusTracker;\r\n        this.keystrokes = keystrokes;\r\n        this.set('isVisible', false);\r\n        this.set('selectedColor', undefined);\r\n        this._focusables = focusables;\r\n        this._pickerConfig = colorPickerConfig;\r\n        const bind = this.bindTemplate;\r\n        const { saveButtonView, cancelButtonView } = this._createActionButtons();\r\n        this.saveButtonView = saveButtonView;\r\n        this.cancelButtonView = cancelButtonView;\r\n        this.actionBarView = this._createActionBarView({ saveButtonView, cancelButtonView });\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck-color-picker-page-view',\r\n                    bind.if('isVisible', 'ck-hidden', value => !value)\r\n                ]\r\n            },\r\n            children: this.items\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        const colorPickerView = new ColorPickerView(this.locale, this._pickerConfig);\r\n        this.colorPickerView = colorPickerView;\r\n        this.colorPickerView.render();\r\n        if (this.selectedColor) {\r\n            colorPickerView.color = this.selectedColor;\r\n        }\r\n        this.listenTo(this, 'change:selectedColor', (evt, name, value) => {\r\n            colorPickerView.color = value;\r\n        });\r\n        this.items.add(this.colorPickerView);\r\n        this.items.add(this.actionBarView);\r\n        this._addColorPickersElementsToFocusTracker();\r\n        this._stopPropagationOnArrowsKeys();\r\n        this._executeOnEnterPress();\r\n        this._executeUponColorChange();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n    }\r\n    /**\r\n     * Focuses the color picker.\r\n     */\r\n    focus() {\r\n        this.colorPickerView.focus();\r\n    }\r\n    /**\r\n     * When color picker is focused and \"enter\" is pressed it executes command.\r\n     */\r\n    _executeOnEnterPress() {\r\n        this.keystrokes.set('enter', evt => {\r\n            if (this.isVisible && this.focusTracker.focusedElement !== this.cancelButtonView.element) {\r\n                this.fire('execute', {\r\n                    value: this.selectedColor\r\n                });\r\n                evt.stopPropagation();\r\n                evt.preventDefault();\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Removes default behavior of arrow keys in dropdown.\r\n     */\r\n    _stopPropagationOnArrowsKeys() {\r\n        const stopPropagation = (data) => data.stopPropagation();\r\n        this.keystrokes.set('arrowright', stopPropagation);\r\n        this.keystrokes.set('arrowleft', stopPropagation);\r\n        this.keystrokes.set('arrowup', stopPropagation);\r\n        this.keystrokes.set('arrowdown', stopPropagation);\r\n    }\r\n    /**\r\n     * Adds color picker elements to focus tracker.\r\n     */\r\n    _addColorPickersElementsToFocusTracker() {\r\n        for (const slider of this.colorPickerView.slidersView) {\r\n            this.focusTracker.add(slider.element);\r\n            this._focusables.add(slider);\r\n        }\r\n        this.focusTracker.add(this.colorPickerView.hexInputRow.children.get(1).element);\r\n        this._focusables.add(this.colorPickerView.hexInputRow.children.get(1));\r\n        this.focusTracker.add(this.saveButtonView.element);\r\n        this._focusables.add(this.saveButtonView);\r\n        this.focusTracker.add(this.cancelButtonView.element);\r\n        this._focusables.add(this.cancelButtonView);\r\n    }\r\n    /**\r\n     * Creates bar containing \"Save\" and \"Cancel\" buttons.\r\n     */\r\n    _createActionBarView({ saveButtonView, cancelButtonView }) {\r\n        const actionBarRow = new View();\r\n        const children = this.createCollection();\r\n        children.add(saveButtonView);\r\n        children.add(cancelButtonView);\r\n        actionBarRow.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-color-table_action-bar'\r\n                ]\r\n            },\r\n            children\r\n        });\r\n        return actionBarRow;\r\n    }\r\n    /**\r\n     * Creates \"Save\" and \"Cancel\" buttons.\r\n     */\r\n    _createActionButtons() {\r\n        const locale = this.locale;\r\n        const t = locale.t;\r\n        const saveButtonView = new ButtonView(locale);\r\n        const cancelButtonView = new ButtonView(locale);\r\n        saveButtonView.set({\r\n            icon: icons.check,\r\n            class: 'ck-button-save',\r\n            withText: false,\r\n            label: t('Accept'),\r\n            type: 'button'\r\n        });\r\n        cancelButtonView.set({\r\n            icon: icons.cancel,\r\n            class: 'ck-button-cancel',\r\n            withText: false,\r\n            label: t('Cancel')\r\n        });\r\n        saveButtonView.on('execute', () => {\r\n            this.fire('execute', {\r\n                source: 'saveButton',\r\n                value: this.selectedColor\r\n            });\r\n        });\r\n        cancelButtonView.on('execute', () => {\r\n            this.fire('cancel');\r\n        });\r\n        return {\r\n            saveButtonView, cancelButtonView\r\n        };\r\n    }\r\n    /**\r\n     * Fires the `execute` event if color in color picker changed.\r\n     *\r\n     * @fires execute\r\n     */\r\n    _executeUponColorChange() {\r\n        this.colorPickerView.on('change:color', (evt, evtName, newValue) => {\r\n            this.fire('execute', {\r\n                value: newValue,\r\n                source: 'colorPicker'\r\n            });\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module font/utils\r\n */\r\nimport ColorTableView from './ui/colortableview';\r\n/**\r\n * The name of the font size plugin.\r\n */\r\nexport const FONT_SIZE = 'fontSize';\r\n/**\r\n * The name of the font family plugin.\r\n */\r\nexport const FONT_FAMILY = 'fontFamily';\r\n/**\r\n * The name of the font color plugin.\r\n */\r\nexport const FONT_COLOR = 'fontColor';\r\n/**\r\n * The name of the font background color plugin.\r\n */\r\nexport const FONT_BACKGROUND_COLOR = 'fontBackgroundColor';\r\n/**\r\n * Builds a proper converter definition out of input data.\r\n */\r\nexport function buildDefinition(modelAttributeKey, options) {\r\n    const definition = {\r\n        model: {\r\n            key: modelAttributeKey,\r\n            values: []\r\n        },\r\n        view: {},\r\n        upcastAlso: {}\r\n    };\r\n    for (const option of options) {\r\n        definition.model.values.push(option.model);\r\n        definition.view[option.model] = option.view;\r\n        if (option.upcastAlso) {\r\n            definition.upcastAlso[option.model] = option.upcastAlso;\r\n        }\r\n    }\r\n    return definition;\r\n}\r\n/**\r\n * A {@link module:font/fontcolor~FontColor font color} and\r\n * {@link module:font/fontbackgroundcolor~FontBackgroundColor font background color} helper\r\n * responsible for upcasting data to the model.\r\n *\r\n * **Note**: The `styleAttr` parameter should be either `'color'` or `'background-color'`.\r\n */\r\nexport function renderUpcastAttribute(styleAttr) {\r\n    return (viewElement) => normalizeColorCode(viewElement.getStyle(styleAttr));\r\n}\r\n/**\r\n * A {@link module:font/fontcolor~FontColor font color} and\r\n * {@link module:font/fontbackgroundcolor~FontBackgroundColor font background color} helper\r\n * responsible for downcasting a color attribute to a `<span>` element.\r\n *\r\n * **Note**: The `styleAttr` parameter should be either `'color'` or `'background-color'`.\r\n */\r\nexport function renderDowncastElement(styleAttr) {\r\n    return (modelAttributeValue, { writer }) => writer.createAttributeElement('span', {\r\n        style: `${styleAttr}:${modelAttributeValue}`\r\n    }, { priority: 7 });\r\n}\r\n/**\r\n * A helper that adds {@link module:font/ui/colortableview~ColorTableView} to the color dropdown with proper initial values.\r\n *\r\n * @param config.dropdownView The dropdown view to which a {@link module:font/ui/colortableview~ColorTableView} will be added.\r\n * @param config.colors An array with definitions representing colors to be displayed in the color table.\r\n * @param config.removeButtonLabel The label for the button responsible for removing the color.\r\n * @param config.documentColorsLabel The label for the section with document colors.\r\n * @param config.documentColorsCount The number of document colors inside the dropdown.\r\n * @returns The new color table view.\r\n */\r\nexport function addColorTableToDropdown({ dropdownView, colors, columns, removeButtonLabel, colorPickerLabel, documentColorsLabel, documentColorsCount, colorPickerConfig }) {\r\n    const locale = dropdownView.locale;\r\n    const colorTableView = new ColorTableView(locale, {\r\n        colors,\r\n        columns,\r\n        removeButtonLabel,\r\n        colorPickerLabel,\r\n        documentColorsLabel,\r\n        documentColorsCount,\r\n        colorPickerConfig\r\n    });\r\n    dropdownView.colorTableView = colorTableView;\r\n    dropdownView.panelView.children.add(colorTableView);\r\n    return colorTableView;\r\n}\r\n/**\r\n * Fixes the color value string.\r\n */\r\nfunction normalizeColorCode(value) {\r\n    return value.replace(/\\s/g, '');\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport FontCommand from '../fontcommand';\r\nimport { FONT_COLOR } from '../utils';\r\n/**\r\n * The font color command. It is used by {@link module:font/fontcolor/fontcolorediting~FontColorEditing}\r\n * to apply the font color.\r\n *\r\n * ```ts\r\n * editor.execute( 'fontColor', { value: 'rgb(250, 20, 20)' } );\r\n * ```\r\n *\r\n * **Note**: Executing the command with the `null` value removes the attribute from the model.\r\n */\r\nexport default class FontColorCommand extends FontCommand {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor, FONT_COLOR);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module font/fontcolor/fontcolorediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport FontColorCommand from './fontcolorcommand';\r\nimport { FONT_COLOR, renderDowncastElement, renderUpcastAttribute } from '../utils';\r\n/**\r\n * The font color editing feature.\r\n *\r\n * It introduces the {@link module:font/fontcolor/fontcolorcommand~FontColorCommand command} and\r\n * the `fontColor` attribute in the {@link module:engine/model/model~Model model} which renders\r\n * in the {@link module:engine/view/view view} as a `<span>` element (`<span style=\"color: ...\">`),\r\n * depending on the {@link module:font/fontconfig~FontColorConfig configuration}.\r\n */\r\nexport default class FontColorEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'FontColorEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        editor.config.define(FONT_COLOR, {\r\n            colors: [\r\n                {\r\n                    color: 'hsl(0, 0%, 0%)',\r\n                    label: 'Black'\r\n                },\r\n                {\r\n                    color: 'hsl(0, 0%, 30%)',\r\n                    label: 'Dim grey'\r\n                },\r\n                {\r\n                    color: 'hsl(0, 0%, 60%)',\r\n                    label: 'Grey'\r\n                },\r\n                {\r\n                    color: 'hsl(0, 0%, 90%)',\r\n                    label: 'Light grey'\r\n                },\r\n                {\r\n                    color: 'hsl(0, 0%, 100%)',\r\n                    label: 'White',\r\n                    hasBorder: true\r\n                },\r\n                {\r\n                    color: 'hsl(0, 75%, 60%)',\r\n                    label: 'Red'\r\n                },\r\n                {\r\n                    color: 'hsl(30, 75%, 60%)',\r\n                    label: 'Orange'\r\n                },\r\n                {\r\n                    color: 'hsl(60, 75%, 60%)',\r\n                    label: 'Yellow'\r\n                },\r\n                {\r\n                    color: 'hsl(90, 75%, 60%)',\r\n                    label: 'Light green'\r\n                },\r\n                {\r\n                    color: 'hsl(120, 75%, 60%)',\r\n                    label: 'Green'\r\n                },\r\n                {\r\n                    color: 'hsl(150, 75%, 60%)',\r\n                    label: 'Aquamarine'\r\n                },\r\n                {\r\n                    color: 'hsl(180, 75%, 60%)',\r\n                    label: 'Turquoise'\r\n                },\r\n                {\r\n                    color: 'hsl(210, 75%, 60%)',\r\n                    label: 'Light blue'\r\n                },\r\n                {\r\n                    color: 'hsl(240, 75%, 60%)',\r\n                    label: 'Blue'\r\n                },\r\n                {\r\n                    color: 'hsl(270, 75%, 60%)',\r\n                    label: 'Purple'\r\n                }\r\n            ],\r\n            columns: 5\r\n        });\r\n        editor.conversion.for('upcast').elementToAttribute({\r\n            view: {\r\n                name: 'span',\r\n                styles: {\r\n                    'color': /[\\s\\S]+/\r\n                }\r\n            },\r\n            model: {\r\n                key: FONT_COLOR,\r\n                value: renderUpcastAttribute('color')\r\n            }\r\n        });\r\n        // Support legacy `<font color=\"..\">` formatting.\r\n        editor.conversion.for('upcast').elementToAttribute({\r\n            view: {\r\n                name: 'font',\r\n                attributes: {\r\n                    'color': /^#?\\w+$/\r\n                }\r\n            },\r\n            model: {\r\n                key: FONT_COLOR,\r\n                value: (viewElement) => viewElement.getAttribute('color')\r\n            }\r\n        });\r\n        editor.conversion.for('downcast').attributeToElement({\r\n            model: FONT_COLOR,\r\n            view: renderDowncastElement('color')\r\n        });\r\n        editor.commands.add(FONT_COLOR, new FontColorCommand(editor));\r\n        // Allow the font color attribute on text nodes.\r\n        editor.model.schema.extend('$text', { allowAttributes: FONT_COLOR });\r\n        editor.model.schema.setAttributeProperties(FONT_COLOR, {\r\n            isFormatting: true,\r\n            copyOnEnter: true\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module font/ui/colorui\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { createDropdown, normalizeColorOptions, getLocalizedColorOptions, focusChildOnDropdownOpen } from 'ckeditor5/src/ui';\r\nimport { addColorTableToDropdown } from '../utils';\r\n/**\r\n * The color UI plugin which isolates the common logic responsible for displaying dropdowns with color grids.\r\n *\r\n * It is used to create the `'fontBackgroundColor'` and `'fontColor'` dropdowns, each hosting\r\n * a {@link module:font/ui/colortableview~ColorTableView}.\r\n */\r\nexport default class ColorUI extends Plugin {\r\n    /**\r\n     * Creates a plugin which introduces a dropdown with a pre–configured {@link module:font/ui/colortableview~ColorTableView}.\r\n     *\r\n     * @param config The configuration object.\r\n     * @param config.commandName The name of the command which will be executed when a color tile is clicked.\r\n     * @param config.componentName The name of the dropdown in the {@link module:ui/componentfactory~ComponentFactory}\r\n     * and the configuration scope name in `editor.config`.\r\n     * @param config.icon The SVG icon used by the dropdown.\r\n     * @param config.dropdownLabel The label used by the dropdown.\r\n     */\r\n    constructor(editor, { commandName, componentName, icon, dropdownLabel }) {\r\n        super(editor);\r\n        this.commandName = commandName;\r\n        this.componentName = componentName;\r\n        this.icon = icon;\r\n        this.dropdownLabel = dropdownLabel;\r\n        this.columns = editor.config.get(`${this.componentName}.columns`);\r\n        this.colorTableView = undefined;\r\n    }\r\n    /**\r\n    * @inheritDoc\r\n    */\r\n    init() {\r\n        const editor = this.editor;\r\n        const locale = editor.locale;\r\n        const t = locale.t;\r\n        const command = editor.commands.get(this.commandName);\r\n        const componentConfig = editor.config.get(this.componentName);\r\n        const colorsConfig = normalizeColorOptions(componentConfig.colors);\r\n        const localizedColors = getLocalizedColorOptions(locale, colorsConfig);\r\n        const documentColorsCount = componentConfig.documentColors;\r\n        const hasColorPicker = componentConfig.colorPicker !== false;\r\n        // Register the UI component.\r\n        editor.ui.componentFactory.add(this.componentName, locale => {\r\n            const dropdownView = createDropdown(locale);\r\n            // Font color dropdown rendering is deferred once it gets open to improve performance (#6192).\r\n            let dropdownContentRendered = false;\r\n            this.colorTableView = addColorTableToDropdown({\r\n                dropdownView,\r\n                colors: localizedColors.map(option => ({\r\n                    label: option.label,\r\n                    color: option.model,\r\n                    options: {\r\n                        hasBorder: option.hasBorder\r\n                    }\r\n                })),\r\n                columns: this.columns,\r\n                removeButtonLabel: t('Remove color'),\r\n                colorPickerLabel: t('Color picker'),\r\n                documentColorsLabel: documentColorsCount !== 0 ? t('Document colors') : '',\r\n                documentColorsCount: documentColorsCount === undefined ? this.columns : documentColorsCount,\r\n                colorPickerConfig: hasColorPicker ? (componentConfig.colorPicker || {}) : false\r\n            });\r\n            this.colorTableView.bind('selectedColor').to(command, 'value');\r\n            dropdownView.buttonView.set({\r\n                label: this.dropdownLabel,\r\n                icon: this.icon,\r\n                tooltip: true\r\n            });\r\n            dropdownView.extendTemplate({\r\n                attributes: {\r\n                    class: 'ck-color-ui-dropdown'\r\n                }\r\n            });\r\n            dropdownView.bind('isEnabled').to(command);\r\n            this.colorTableView.on('execute', (evt, data) => {\r\n                if (dropdownView.isOpen) {\r\n                    editor.execute(this.commandName, {\r\n                        value: data.value,\r\n                        batch: this._undoStepBatch\r\n                    });\r\n                }\r\n                if (data.source !== 'colorPicker') {\r\n                    editor.editing.view.focus();\r\n                }\r\n            });\r\n            this.colorTableView.on('showColorPicker', () => {\r\n                this._undoStepBatch = editor.model.createBatch();\r\n            });\r\n            this.colorTableView.on('cancel', () => {\r\n                if (this._undoStepBatch.operations.length) {\r\n                    // We need to close the dropdown before the undo batch.\r\n                    // Otherwise, ColorUI treats undo as a selected color change,\r\n                    // propagating the update to the whole selection.\r\n                    // That's an issue if spans with various colors were selected.\r\n                    dropdownView.isOpen = false;\r\n                    editor.execute('undo', this._undoStepBatch);\r\n                }\r\n                editor.editing.view.focus();\r\n            });\r\n            dropdownView.on('change:isOpen', (evt, name, isVisible) => {\r\n                if (!dropdownContentRendered) {\r\n                    dropdownContentRendered = true;\r\n                    dropdownView.colorTableView.appendUI();\r\n                }\r\n                if (isVisible) {\r\n                    if (documentColorsCount !== 0) {\r\n                        this.colorTableView.updateDocumentColors(editor.model, this.componentName);\r\n                    }\r\n                    this.colorTableView.updateSelectedColors();\r\n                }\r\n                else {\r\n                    this.colorTableView.showColorGrids();\r\n                }\r\n            });\r\n            // Accessibility: focus the first active color when opening the dropdown.\r\n            focusChildOnDropdownOpen(dropdownView, () => dropdownView.colorTableView.colorGridsPageView.staticColorsGrid.items.find((item) => item.isOn));\r\n            return dropdownView;\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module font/fontcolor/fontcolorui\r\n */\r\nimport ColorUI from '../ui/colorui';\r\nimport { FONT_COLOR } from '../utils';\r\nimport fontColorIcon from '../../theme/icons/font-color.svg';\r\n/**\r\n * The font color UI plugin. It introduces the `'fontColor'` dropdown.\r\n */\r\nexport default class FontColorUI extends ColorUI {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        const t = editor.locale.t;\r\n        super(editor, {\r\n            commandName: FONT_COLOR,\r\n            componentName: FONT_COLOR,\r\n            icon: fontColorIcon,\r\n            dropdownLabel: t('Font Color')\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'FontColorUI';\r\n    }\r\n}\r\n","export default \"<svg viewBox=\\\"0 0 20 20\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M12.4 10.3 10 4.5l-2.4 5.8h4.8zm.5 1.2H7.1L5.7 15H4.2l5-12h1.6l5 12h-1.5L13 11.5zm3.1 7H4a1 1 0 0 1 0-2h12a1 1 0 0 1 0 2z\\\"/></svg>\";","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport FontCommand from '../fontcommand';\r\nimport { FONT_SIZE } from '../utils';\r\n/**\r\n * The font size command. It is used by {@link module:font/fontsize/fontsizeediting~FontSizeEditing}\r\n * to apply the font size.\r\n *\r\n * ```ts\r\n * editor.execute( 'fontSize', { value: 'small' } );\r\n * ```\r\n *\r\n * **Note**: Executing the command without the value removes the attribute from the model.\r\n */\r\nexport default class FontSizeCommand extends FontCommand {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor, FONT_SIZE);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module font/fontsize/utils\r\n */\r\nimport { CKEditorError } from 'ckeditor5/src/utils';\r\n/**\r\n * Normalizes and translates the {@link module:font/fontconfig~FontSizeConfig#options configuration options}\r\n * to the {@link module:font/fontconfig~FontSizeOption} format.\r\n *\r\n * @param configuredOptions An array of options taken from the configuration.\r\n */\r\nexport function normalizeOptions(configuredOptions) {\r\n    // Convert options to objects.\r\n    return configuredOptions\r\n        .map(item => getOptionDefinition(item))\r\n        // Filter out undefined values that `getOptionDefinition` might return.\r\n        .filter((option) => option !== undefined);\r\n}\r\n// Default named presets map. Always create a new instance of the preset object in order to avoid modifying references.\r\nconst namedPresets = {\r\n    get tiny() {\r\n        return {\r\n            title: 'Tiny',\r\n            model: 'tiny',\r\n            view: {\r\n                name: 'span',\r\n                classes: 'text-tiny',\r\n                priority: 7\r\n            }\r\n        };\r\n    },\r\n    get small() {\r\n        return {\r\n            title: 'Small',\r\n            model: 'small',\r\n            view: {\r\n                name: 'span',\r\n                classes: 'text-small',\r\n                priority: 7\r\n            }\r\n        };\r\n    },\r\n    get big() {\r\n        return {\r\n            title: 'Big',\r\n            model: 'big',\r\n            view: {\r\n                name: 'span',\r\n                classes: 'text-big',\r\n                priority: 7\r\n            }\r\n        };\r\n    },\r\n    get huge() {\r\n        return {\r\n            title: 'Huge',\r\n            model: 'huge',\r\n            view: {\r\n                name: 'span',\r\n                classes: 'text-huge',\r\n                priority: 7\r\n            }\r\n        };\r\n    }\r\n};\r\n/**\r\n * Returns an option definition either from preset or creates one from number shortcut.\r\n * If object is passed then this method will return it without alternating it. Returns undefined for item than cannot be parsed.\r\n */\r\nfunction getOptionDefinition(option) {\r\n    if (typeof option === 'number') {\r\n        option = String(option);\r\n    }\r\n    // Check whether passed option is a full item definition provided by user in configuration.\r\n    if (typeof option === 'object' && isFullItemDefinition(option)) {\r\n        return attachPriority(option);\r\n    }\r\n    const preset = findPreset(option);\r\n    // Item is a named preset.\r\n    if (preset) {\r\n        return attachPriority(preset);\r\n    }\r\n    // 'Default' font size. It will be used to remove the fontSize attribute.\r\n    if (option === 'default') {\r\n        return {\r\n            model: undefined,\r\n            title: 'Default'\r\n        };\r\n    }\r\n    // At this stage we probably have numerical value to generate a preset so parse it's value.\r\n    // Discard any faulty values.\r\n    if (isNumericalDefinition(option)) {\r\n        return undefined;\r\n    }\r\n    // Return font size definition from size value.\r\n    return generatePixelPreset(option);\r\n}\r\n/**\r\n * Creates a predefined preset for pixel size.\r\n * @param definition Font size in pixels.\r\n * @returns\r\n */\r\nfunction generatePixelPreset(definition) {\r\n    // Extend a short (numeric value) definition.\r\n    if (typeof definition === 'string') {\r\n        definition = {\r\n            title: definition,\r\n            model: `${parseFloat(definition)}px`\r\n        };\r\n    }\r\n    definition.view = {\r\n        name: 'span',\r\n        styles: {\r\n            'font-size': definition.model\r\n        }\r\n    };\r\n    return attachPriority(definition);\r\n}\r\n/**\r\n * Adds the priority to the view element definition if missing. It's required due to ckeditor/ckeditor5#2291\r\n */\r\nfunction attachPriority(definition) {\r\n    if (definition.view && typeof definition.view !== 'string' && !definition.view.priority) {\r\n        definition.view.priority = 7;\r\n    }\r\n    return definition;\r\n}\r\n/**\r\n * Returns a prepared preset definition. If passed an object, a name of preset should be defined as `model` value.\r\n *\r\n * @param definition.model A preset name.\r\n */\r\nfunction findPreset(definition) {\r\n    return typeof definition === 'string' ? namedPresets[definition] : namedPresets[definition.model];\r\n}\r\n/**\r\n * We treat `definition` as completed if it is an object that contains `title`, `model` and `view` values.\r\n */\r\nfunction isFullItemDefinition(definition) {\r\n    return definition.title && definition.model && definition.view;\r\n}\r\nfunction isNumericalDefinition(definition) {\r\n    let numberValue;\r\n    if (typeof definition === 'object') {\r\n        if (!definition.model) {\r\n            /**\r\n             * Provided value as an option for {@link module:font/fontsize~FontSize} seems to invalid.\r\n             *\r\n             * See valid examples described in the {@link module:font/fontconfig~FontSizeConfig#options plugin configuration}.\r\n             *\r\n             * @error font-size-invalid-definition\r\n             */\r\n            throw new CKEditorError('font-size-invalid-definition', null, definition);\r\n        }\r\n        else {\r\n            numberValue = parseFloat(definition.model);\r\n        }\r\n    }\r\n    else {\r\n        numberValue = parseFloat(definition);\r\n    }\r\n    return isNaN(numberValue);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module font/fontsize/fontsizeediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { CKEditorError } from 'ckeditor5/src/utils';\r\nimport { isLength, isPercentage } from 'ckeditor5/src/engine';\r\nimport FontSizeCommand from './fontsizecommand';\r\nimport { normalizeOptions } from './utils';\r\nimport { buildDefinition, FONT_SIZE } from '../utils';\r\n// Mapping of `<font size=\"..\">` styling to CSS's `font-size` values.\r\nconst styleFontSize = [\r\n    'x-small',\r\n    'x-small',\r\n    'small',\r\n    'medium',\r\n    'large',\r\n    'x-large',\r\n    'xx-large',\r\n    'xxx-large'\r\n];\r\n/**\r\n * The font size editing feature.\r\n *\r\n * It introduces the {@link module:font/fontsize/fontsizecommand~FontSizeCommand command} and the `fontSize`\r\n * attribute in the {@link module:engine/model/model~Model model} which renders in the {@link module:engine/view/view view}\r\n * as a `<span>` element with either:\r\n * * a style attribute (`<span style=\"font-size:12px\">...</span>`),\r\n * * or a class attribute (`<span class=\"text-small\">...</span>`)\r\n *\r\n * depending on the {@link module:font/fontconfig~FontSizeConfig configuration}.\r\n */\r\nexport default class FontSizeEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'FontSizeEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        // Define default configuration using named presets.\r\n        editor.config.define(FONT_SIZE, {\r\n            options: [\r\n                'tiny',\r\n                'small',\r\n                'default',\r\n                'big',\r\n                'huge'\r\n            ],\r\n            supportAllValues: false\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        // Allow fontSize attribute on text nodes.\r\n        editor.model.schema.extend('$text', { allowAttributes: FONT_SIZE });\r\n        editor.model.schema.setAttributeProperties(FONT_SIZE, {\r\n            isFormatting: true,\r\n            copyOnEnter: true\r\n        });\r\n        const supportAllValues = editor.config.get('fontSize.supportAllValues');\r\n        // Define view to model conversion.\r\n        const options = normalizeOptions(this.editor.config.get('fontSize.options'))\r\n            .filter(item => item.model);\r\n        const definition = buildDefinition(FONT_SIZE, options);\r\n        // Set-up the two-way conversion.\r\n        if (supportAllValues) {\r\n            this._prepareAnyValueConverters(definition);\r\n            this._prepareCompatibilityConverter();\r\n        }\r\n        else {\r\n            editor.conversion.attributeToElement(definition);\r\n        }\r\n        // Add FontSize command.\r\n        editor.commands.add(FONT_SIZE, new FontSizeCommand(editor));\r\n    }\r\n    /**\r\n     * These converters enable keeping any value found as `style=\"font-size: *\"` as a value of an attribute on a text even\r\n     * if it is not defined in the plugin configuration.\r\n     *\r\n     * @param definition Converter definition out of input data.\r\n     */\r\n    _prepareAnyValueConverters(definition) {\r\n        const editor = this.editor;\r\n        // If `fontSize.supportAllValues=true`, we do not allow to use named presets in the plugin's configuration.\r\n        const presets = definition.model.values.filter((value) => {\r\n            return !isLength(String(value)) && !isPercentage(String(value));\r\n        });\r\n        if (presets.length) {\r\n            /**\r\n             * If {@link module:font/fontconfig~FontSizeConfig#supportAllValues `config.fontSize.supportAllValues`} is `true`,\r\n             * you need to use numerical values as font size options.\r\n             *\r\n             * See valid examples described in the {@link module:font/fontconfig~FontSizeConfig#options plugin configuration}.\r\n             *\r\n             * @error font-size-invalid-use-of-named-presets\r\n             * @param {Array.<String>} presets Invalid values.\r\n             */\r\n            throw new CKEditorError('font-size-invalid-use-of-named-presets', null, { presets });\r\n        }\r\n        editor.conversion.for('downcast').attributeToElement({\r\n            model: FONT_SIZE,\r\n            view: (attributeValue, { writer }) => {\r\n                if (!attributeValue) {\r\n                    return;\r\n                }\r\n                return writer.createAttributeElement('span', { style: 'font-size:' + attributeValue }, { priority: 7 });\r\n            }\r\n        });\r\n        editor.conversion.for('upcast').elementToAttribute({\r\n            model: {\r\n                key: FONT_SIZE,\r\n                value: (viewElement) => viewElement.getStyle('font-size')\r\n            },\r\n            view: {\r\n                name: 'span',\r\n                styles: {\r\n                    'font-size': /.*/\r\n                }\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Adds support for legacy `<font size=\"..\">` formatting.\r\n     */\r\n    _prepareCompatibilityConverter() {\r\n        const editor = this.editor;\r\n        editor.conversion.for('upcast').elementToAttribute({\r\n            view: {\r\n                name: 'font',\r\n                attributes: {\r\n                    // Documentation mentions sizes from 1 to 7. To handle old content we support all values\r\n                    // up to 999 but clamp it to the valid range. Why 999? It should cover accidental values\r\n                    // similar to percentage, e.g. 100%, 200% which could be the usual mistake for font size.\r\n                    'size': /^[+-]?\\d{1,3}$/\r\n                }\r\n            },\r\n            model: {\r\n                key: FONT_SIZE,\r\n                value: (viewElement) => {\r\n                    const value = viewElement.getAttribute('size');\r\n                    const isRelative = value[0] === '-' || value[0] === '+';\r\n                    let size = parseInt(value, 10);\r\n                    if (isRelative) {\r\n                        // Add relative size (which can be negative) to the default size = 3.\r\n                        size = 3 + size;\r\n                    }\r\n                    const maxSize = styleFontSize.length - 1;\r\n                    const clampedSize = Math.min(Math.max(size, 0), maxSize);\r\n                    return styleFontSize[clampedSize];\r\n                }\r\n            }\r\n        });\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./fontsize.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module font/fontsize/fontsizeui\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { Model, createDropdown, addListToDropdown } from 'ckeditor5/src/ui';\r\nimport { Collection } from 'ckeditor5/src/utils';\r\nimport { normalizeOptions } from './utils';\r\nimport { FONT_SIZE } from '../utils';\r\nimport '../../theme/fontsize.css';\r\nimport fontSizeIcon from '../../theme/icons/font-size.svg';\r\n/**\r\n * The font size UI plugin. It introduces the `'fontSize'` dropdown.\r\n */\r\nexport default class FontSizeUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'FontSizeUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        const options = this._getLocalizedOptions();\r\n        const command = editor.commands.get(FONT_SIZE);\r\n        const accessibleLabel = t('Font Size');\r\n        // Register UI component.\r\n        editor.ui.componentFactory.add(FONT_SIZE, locale => {\r\n            const dropdownView = createDropdown(locale);\r\n            addListToDropdown(dropdownView, () => _prepareListOptions(options, command), {\r\n                role: 'menu',\r\n                ariaLabel: accessibleLabel\r\n            });\r\n            // Create dropdown model.\r\n            dropdownView.buttonView.set({\r\n                label: accessibleLabel,\r\n                icon: fontSizeIcon,\r\n                tooltip: true\r\n            });\r\n            dropdownView.extendTemplate({\r\n                attributes: {\r\n                    class: [\r\n                        'ck-font-size-dropdown'\r\n                    ]\r\n                }\r\n            });\r\n            dropdownView.bind('isEnabled').to(command);\r\n            // Execute command when an item from the dropdown is selected.\r\n            this.listenTo(dropdownView, 'execute', evt => {\r\n                editor.execute(evt.source.commandName, { value: evt.source.commandParam });\r\n                editor.editing.view.focus();\r\n            });\r\n            return dropdownView;\r\n        });\r\n    }\r\n    /**\r\n     * Returns options as defined in `config.fontSize.options` but processed to account for\r\n     * editor localization, i.e. to display {@link module:font/fontconfig~FontSizeOption}\r\n     * in the correct language.\r\n     *\r\n     * Note: The reason behind this method is that there is no way to use {@link module:utils/locale~Locale#t}\r\n     * when the user configuration is defined because the editor does not exist yet.\r\n     */\r\n    _getLocalizedOptions() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        const localizedTitles = {\r\n            Default: t('Default'),\r\n            Tiny: t('Tiny'),\r\n            Small: t('Small'),\r\n            Big: t('Big'),\r\n            Huge: t('Huge')\r\n        };\r\n        const options = normalizeOptions((editor.config.get(FONT_SIZE)).options);\r\n        return options.map(option => {\r\n            const title = localizedTitles[option.title];\r\n            if (title && title != option.title) {\r\n                // Clone the option to avoid altering the original `namedPresets` from `./utils.js`.\r\n                option = Object.assign({}, option, { title });\r\n            }\r\n            return option;\r\n        });\r\n    }\r\n}\r\n/**\r\n * Prepares FontSize dropdown items.\r\n */\r\nfunction _prepareListOptions(options, command) {\r\n    const itemDefinitions = new Collection();\r\n    for (const option of options) {\r\n        const def = {\r\n            type: 'button',\r\n            model: new Model({\r\n                commandName: FONT_SIZE,\r\n                commandParam: option.model,\r\n                label: option.title,\r\n                class: 'ck-fontsize-option',\r\n                role: 'menuitemradio',\r\n                withText: true\r\n            })\r\n        };\r\n        if (option.view && typeof option.view !== 'string') {\r\n            if (option.view.styles) {\r\n                def.model.set('labelStyle', `font-size:${option.view.styles['font-size']}`);\r\n            }\r\n            if (option.view.classes) {\r\n                def.model.set('class', `${def.model.class} ${option.view.classes}`);\r\n            }\r\n        }\r\n        def.model.bind('isOn').to(command, 'value', value => value === option.model);\r\n        // Add the option to the collection.\r\n        itemDefinitions.add(def);\r\n    }\r\n    return itemDefinitions;\r\n}\r\n","export default \"<svg viewBox=\\\"0 0 20 20\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M9.816 11.5 7.038 4.785 4.261 11.5h5.555zm.62 1.5H3.641l-1.666 4.028H.312l5.789-14h1.875l5.789 14h-1.663L10.436 13zm7.55 2.279.779-.779.707.707-2.265 2.265-2.193-2.265.707-.707.765.765V4.825c0-.042 0-.083.002-.123l-.77.77-.707-.707L17.207 2.5l2.265 2.265-.707.707-.782-.782c.002.043.003.089.003.135v10.454z\\\"/></svg>\";","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module paragraph/paragraphcommand\r\n */\r\nimport { Command } from '@ckeditor/ckeditor5-core';\r\nimport { first } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * The paragraph command.\r\n */\r\nexport default class ParagraphCommand extends Command {\r\n    constructor(editor) {\r\n        super(editor);\r\n        // Since this command may pass selection in execution block, it should be checked directly.\r\n        this._isEnabledBasedOnSelection = false;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const model = this.editor.model;\r\n        const document = model.document;\r\n        const block = first(document.selection.getSelectedBlocks());\r\n        this.value = !!block && block.is('element', 'paragraph');\r\n        this.isEnabled = !!block && checkCanBecomeParagraph(block, model.schema);\r\n    }\r\n    /**\r\n     * Executes the command. All the blocks (see {@link module:engine/model/schema~Schema}) in the selection\r\n     * will be turned to paragraphs.\r\n     *\r\n     * @fires execute\r\n     * @param options Options for the executed command.\r\n     * @param options.selection The selection that the command should be applied to. By default,\r\n     * if not provided, the command is applied to the {@link module:engine/model/document~Document#selection}.\r\n     */\r\n    execute(options = {}) {\r\n        const model = this.editor.model;\r\n        const document = model.document;\r\n        const selection = options.selection || document.selection;\r\n        // Don't execute command if selection is in non-editable place.\r\n        if (!model.canEditAt(selection)) {\r\n            return;\r\n        }\r\n        model.change(writer => {\r\n            const blocks = selection.getSelectedBlocks();\r\n            for (const block of blocks) {\r\n                if (!block.is('element', 'paragraph') && checkCanBecomeParagraph(block, model.schema)) {\r\n                    writer.rename(block, 'paragraph');\r\n                }\r\n            }\r\n        });\r\n    }\r\n}\r\n/**\r\n * Checks whether the given block can be replaced by a paragraph.\r\n *\r\n * @param block A block to be tested.\r\n * @param schema The schema of the document.\r\n */\r\nfunction checkCanBecomeParagraph(block, schema) {\r\n    return schema.checkChild(block.parent, 'paragraph') && !schema.isObject(block);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module paragraph/insertparagraphcommand\r\n */\r\nimport { Command } from '@ckeditor/ckeditor5-core';\r\n/**\r\n * The insert paragraph command. It inserts a new paragraph at a specific\r\n * {@link module:engine/model/position~Position document position}.\r\n *\r\n * ```ts\r\n * // Insert a new paragraph before an element in the document.\r\n * editor.execute( 'insertParagraph', {\r\n *   position: editor.model.createPositionBefore( element )\r\n * } );\r\n * ```\r\n *\r\n * If a paragraph is disallowed in the context of the specific position, the command\r\n * will attempt to split position ancestors to find a place where it is possible\r\n * to insert a paragraph.\r\n *\r\n * **Note**: This command moves the selection to the inserted paragraph.\r\n */\r\nexport default class InsertParagraphCommand extends Command {\r\n    constructor(editor) {\r\n        super(editor);\r\n        // Since this command passes position in execution block instead of selection, it should be checked directly.\r\n        this._isEnabledBasedOnSelection = false;\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * @param options Options for the executed command.\r\n     * @param options.position The model position at which the new paragraph will be inserted.\r\n     * @param options.attributes Attributes keys and values to set on a inserted paragraph.\r\n     * @fires execute\r\n     */\r\n    execute(options) {\r\n        const model = this.editor.model;\r\n        const attributes = options.attributes;\r\n        let position = options.position;\r\n        // Don't execute command if position is in non-editable place.\r\n        if (!model.canEditAt(position)) {\r\n            return;\r\n        }\r\n        model.change(writer => {\r\n            const paragraph = writer.createElement('paragraph');\r\n            if (attributes) {\r\n                model.schema.setAllowedAttributes(paragraph, attributes, writer);\r\n            }\r\n            if (!model.schema.checkChild(position.parent, paragraph)) {\r\n                const allowedParent = model.schema.findAllowedParent(position, paragraph);\r\n                // It could be there's no ancestor limit that would allow paragraph.\r\n                // In theory, \"paragraph\" could be disallowed even in the \"$root\".\r\n                if (!allowedParent) {\r\n                    return;\r\n                }\r\n                position = writer.split(position, allowedParent).position;\r\n            }\r\n            model.insertContent(paragraph, position);\r\n            writer.setSelection(paragraph, 'in');\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module paragraph/paragraph\r\n */\r\nimport ParagraphCommand from './paragraphcommand';\r\nimport InsertParagraphCommand from './insertparagraphcommand';\r\nimport { Plugin } from '@ckeditor/ckeditor5-core';\r\n/**\r\n * The paragraph feature for the editor.\r\n *\r\n * It introduces the `<paragraph>` element in the model which renders as a `<p>` element in the DOM and data.\r\n *\r\n * It also brings two editors commands:\r\n *\r\n * * The {@link module:paragraph/paragraphcommand~ParagraphCommand `'paragraph'`} command that converts all\r\n * blocks in the model selection into paragraphs.\r\n * * The {@link module:paragraph/insertparagraphcommand~InsertParagraphCommand `'insertParagraph'`} command\r\n * that inserts a new paragraph at a specified location in the model.\r\n */\r\nexport default class Paragraph extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'Paragraph';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        editor.commands.add('paragraph', new ParagraphCommand(editor));\r\n        editor.commands.add('insertParagraph', new InsertParagraphCommand(editor));\r\n        // Schema.\r\n        model.schema.register('paragraph', { inheritAllFrom: '$block' });\r\n        editor.conversion.elementToElement({ model: 'paragraph', view: 'p' });\r\n        // Conversion for paragraph-like elements which has not been converted by any plugin.\r\n        editor.conversion.for('upcast').elementToElement({\r\n            model: (viewElement, { writer }) => {\r\n                if (!Paragraph.paragraphLikeElements.has(viewElement.name)) {\r\n                    return null;\r\n                }\r\n                // Do not auto-paragraph empty elements.\r\n                if (viewElement.isEmpty) {\r\n                    return null;\r\n                }\r\n                return writer.createElement('paragraph');\r\n            },\r\n            view: /.+/,\r\n            converterPriority: 'low'\r\n        });\r\n    }\r\n}\r\n/**\r\n * A list of element names which should be treated by the autoparagraphing algorithms as\r\n * paragraph-like. This means that e.g. the following content:\r\n *\r\n * ```html\r\n * <h1>Foo</h1>\r\n * <table>\r\n *   <tr>\r\n *     <td>X</td>\r\n *     <td>\r\n *       <ul>\r\n *         <li>Y</li>\r\n *         <li>Z</li>\r\n *       </ul>\r\n *     </td>\r\n *   </tr>\r\n * </table>\r\n * ```\r\n *\r\n * contains five paragraph-like elements: `<h1>`, two `<td>`s and two `<li>`s.\r\n * Hence, if none of the features is going to convert those elements the above content will be automatically handled\r\n * by the paragraph feature and converted to:\r\n *\r\n * ```html\r\n * <p>Foo</p>\r\n * <p>X</p>\r\n * <p>Y</p>\r\n * <p>Z</p>\r\n * ```\r\n *\r\n * Note: The `<td>` containing two `<li>` elements was ignored as the innermost paragraph-like elements\r\n * have a priority upon conversion.\r\n */\r\nParagraph.paragraphLikeElements = new Set([\r\n    'blockquote',\r\n    'dd',\r\n    'div',\r\n    'dt',\r\n    'h1',\r\n    'h2',\r\n    'h3',\r\n    'h4',\r\n    'h5',\r\n    'h6',\r\n    'li',\r\n    'p',\r\n    'td',\r\n    'th'\r\n]);\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module heading/headingcommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { first } from 'ckeditor5/src/utils';\r\n/**\r\n * The heading command. It is used by the {@link module:heading/heading~Heading heading feature} to apply headings.\r\n */\r\nexport default class HeadingCommand extends Command {\r\n    /**\r\n     * Creates an instance of the command.\r\n     *\r\n     * @param editor Editor instance.\r\n     * @param modelElements Names of the element which this command can apply in the model.\r\n     */\r\n    constructor(editor, modelElements) {\r\n        super(editor);\r\n        this.modelElements = modelElements;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const block = first(this.editor.model.document.selection.getSelectedBlocks());\r\n        this.value = !!block && this.modelElements.includes(block.name) && block.name;\r\n        this.isEnabled = !!block && this.modelElements.some(heading => checkCanBecomeHeading(block, heading, this.editor.model.schema));\r\n    }\r\n    /**\r\n     * Executes the command. Applies the heading to the selected blocks or, if the first selected\r\n     * block is a heading already, turns selected headings (of this level only) to paragraphs.\r\n     *\r\n     * @param options.value Name of the element which this command will apply in the model.\r\n     * @fires execute\r\n     */\r\n    execute(options) {\r\n        const model = this.editor.model;\r\n        const document = model.document;\r\n        const modelElement = options.value;\r\n        model.change(writer => {\r\n            const blocks = Array.from(document.selection.getSelectedBlocks())\r\n                .filter(block => {\r\n                return checkCanBecomeHeading(block, modelElement, model.schema);\r\n            });\r\n            for (const block of blocks) {\r\n                if (!block.is('element', modelElement)) {\r\n                    writer.rename(block, modelElement);\r\n                }\r\n            }\r\n        });\r\n    }\r\n}\r\n/**\r\n * Checks whether the given block can be replaced by a specific heading.\r\n *\r\n * @param block A block to be tested.\r\n * @param heading Command element name in the model.\r\n * @param schema The schema of the document.\r\n */\r\nfunction checkCanBecomeHeading(block, heading, schema) {\r\n    return schema.checkChild(block.parent, heading) && !schema.isObject(block);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module heading/headingediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { Paragraph } from 'ckeditor5/src/paragraph';\r\nimport { priorities } from 'ckeditor5/src/utils';\r\nimport HeadingCommand from './headingcommand';\r\nconst defaultModelElement = 'paragraph';\r\n/**\r\n * The headings engine feature. It handles switching between block formats &ndash; headings and paragraph.\r\n * This class represents the engine part of the heading feature. See also {@link module:heading/heading~Heading}.\r\n * It introduces `heading1`-`headingN` commands which allow to convert paragraphs into headings.\r\n */\r\nexport default class HeadingEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'HeadingEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        editor.config.define('heading', {\r\n            options: [\r\n                { model: 'paragraph', title: 'Paragraph', class: 'ck-heading_paragraph' },\r\n                { model: 'heading1', view: 'h2', title: 'Heading 1', class: 'ck-heading_heading1' },\r\n                { model: 'heading2', view: 'h3', title: 'Heading 2', class: 'ck-heading_heading2' },\r\n                { model: 'heading3', view: 'h4', title: 'Heading 3', class: 'ck-heading_heading3' }\r\n            ]\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [Paragraph];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const options = editor.config.get('heading.options');\r\n        const modelElements = [];\r\n        for (const option of options) {\r\n            // Skip paragraph - it is defined in required Paragraph feature.\r\n            if (option.model === 'paragraph') {\r\n                continue;\r\n            }\r\n            // Schema.\r\n            editor.model.schema.register(option.model, {\r\n                inheritAllFrom: '$block'\r\n            });\r\n            editor.conversion.elementToElement(option);\r\n            modelElements.push(option.model);\r\n        }\r\n        this._addDefaultH1Conversion(editor);\r\n        // Register the heading command for this option.\r\n        editor.commands.add('heading', new HeadingCommand(editor, modelElements));\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    afterInit() {\r\n        // If the enter command is added to the editor, alter its behavior.\r\n        // Enter at the end of a heading element should create a paragraph.\r\n        const editor = this.editor;\r\n        const enterCommand = editor.commands.get('enter');\r\n        const options = editor.config.get('heading.options');\r\n        if (enterCommand) {\r\n            this.listenTo(enterCommand, 'afterExecute', (evt, data) => {\r\n                const positionParent = editor.model.document.selection.getFirstPosition().parent;\r\n                const isHeading = options.some(option => positionParent.is('element', option.model));\r\n                if (isHeading && !positionParent.is('element', defaultModelElement) && positionParent.childCount === 0) {\r\n                    data.writer.rename(positionParent, defaultModelElement);\r\n                }\r\n            });\r\n        }\r\n    }\r\n    /**\r\n     * Adds default conversion for `h1` -> `heading1` with a low priority.\r\n     *\r\n     * @param editor Editor instance on which to add the `h1` conversion.\r\n     */\r\n    _addDefaultH1Conversion(editor) {\r\n        editor.conversion.for('upcast').elementToElement({\r\n            model: 'heading1',\r\n            view: 'h1',\r\n            // With a `low` priority, `paragraph` plugin autoparagraphing mechanism is executed. Make sure\r\n            // this listener is called before it. If not, `h1` will be transformed into a paragraph.\r\n            converterPriority: priorities.low + 1\r\n        });\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./heading.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module heading/headingui\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { Model, createDropdown, addListToDropdown } from 'ckeditor5/src/ui';\r\nimport { Collection } from 'ckeditor5/src/utils';\r\nimport { getLocalizedOptions } from './utils';\r\nimport '../theme/heading.css';\r\n/**\r\n * The headings UI feature. It introduces the `headings` dropdown.\r\n */\r\nexport default class HeadingUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'HeadingUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        const options = getLocalizedOptions(editor);\r\n        const defaultTitle = t('Choose heading');\r\n        const accessibleLabel = t('Heading');\r\n        // Register UI component.\r\n        editor.ui.componentFactory.add('heading', locale => {\r\n            const titles = {};\r\n            const itemDefinitions = new Collection();\r\n            const headingCommand = editor.commands.get('heading');\r\n            const paragraphCommand = editor.commands.get('paragraph');\r\n            const commands = [headingCommand];\r\n            for (const option of options) {\r\n                const def = {\r\n                    type: 'button',\r\n                    model: new Model({\r\n                        label: option.title,\r\n                        class: option.class,\r\n                        role: 'menuitemradio',\r\n                        withText: true\r\n                    })\r\n                };\r\n                if (option.model === 'paragraph') {\r\n                    def.model.bind('isOn').to(paragraphCommand, 'value');\r\n                    def.model.set('commandName', 'paragraph');\r\n                    commands.push(paragraphCommand);\r\n                }\r\n                else {\r\n                    def.model.bind('isOn').to(headingCommand, 'value', value => value === option.model);\r\n                    def.model.set({\r\n                        commandName: 'heading',\r\n                        commandValue: option.model\r\n                    });\r\n                }\r\n                // Add the option to the collection.\r\n                itemDefinitions.add(def);\r\n                titles[option.model] = option.title;\r\n            }\r\n            const dropdownView = createDropdown(locale);\r\n            addListToDropdown(dropdownView, itemDefinitions, {\r\n                ariaLabel: accessibleLabel,\r\n                role: 'menu'\r\n            });\r\n            dropdownView.buttonView.set({\r\n                ariaLabel: accessibleLabel,\r\n                ariaLabelledBy: undefined,\r\n                isOn: false,\r\n                withText: true,\r\n                tooltip: accessibleLabel\r\n            });\r\n            dropdownView.extendTemplate({\r\n                attributes: {\r\n                    class: [\r\n                        'ck-heading-dropdown'\r\n                    ]\r\n                }\r\n            });\r\n            dropdownView.bind('isEnabled').toMany(commands, 'isEnabled', (...areEnabled) => {\r\n                return areEnabled.some(isEnabled => isEnabled);\r\n            });\r\n            dropdownView.buttonView.bind('label').to(headingCommand, 'value', paragraphCommand, 'value', (value, para) => {\r\n                const whichModel = value || para && 'paragraph';\r\n                if (typeof whichModel === 'boolean') {\r\n                    return defaultTitle;\r\n                }\r\n                // If none of the commands is active, display default title.\r\n                if (!titles[whichModel]) {\r\n                    return defaultTitle;\r\n                }\r\n                return titles[whichModel];\r\n            });\r\n            // Execute command when an item from the dropdown is selected.\r\n            this.listenTo(dropdownView, 'execute', evt => {\r\n                const { commandName, commandValue } = evt.source;\r\n                editor.execute(commandName, commandValue ? { value: commandValue } : undefined);\r\n                editor.editing.view.focus();\r\n            });\r\n            return dropdownView;\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * Returns heading options as defined in `config.heading.options` but processed to consider\r\n * the editor localization, i.e. to display {@link module:heading/headingconfig~HeadingOption}\r\n * in the correct language.\r\n *\r\n * Note: The reason behind this method is that there is no way to use {@link module:utils/locale~Locale#t}\r\n * when the user configuration is defined because the editor does not exist yet.\r\n */\r\nexport function getLocalizedOptions(editor) {\r\n    const t = editor.t;\r\n    const localizedTitles = {\r\n        'Paragraph': t('Paragraph'),\r\n        'Heading 1': t('Heading 1'),\r\n        'Heading 2': t('Heading 2'),\r\n        'Heading 3': t('Heading 3'),\r\n        'Heading 4': t('Heading 4'),\r\n        'Heading 5': t('Heading 5'),\r\n        'Heading 6': t('Heading 6')\r\n    };\r\n    return editor.config.get('heading.options').map(option => {\r\n        const title = localizedTitles[option.title];\r\n        if (title && title != option.title) {\r\n            option.title = title;\r\n        }\r\n        return option;\r\n    });\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { findOptimalInsertionRange } from 'ckeditor5/src/widget';\r\n/**\r\n * The horizontal line command.\r\n *\r\n * The command is registered by {@link module:horizontal-line/horizontallineediting~HorizontalLineEditing} as `'horizontalLine'`.\r\n *\r\n * To insert a horizontal line at the current selection, execute the command:\r\n *\r\n * ```ts\r\n * editor.execute( 'horizontalLine' );\r\n * ```\r\n */\r\nexport default class HorizontalLineCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const model = this.editor.model;\r\n        const schema = model.schema;\r\n        const selection = model.document.selection;\r\n        this.isEnabled = isHorizontalLineAllowedInParent(selection, schema, model);\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * @fires execute\r\n     */\r\n    execute() {\r\n        const model = this.editor.model;\r\n        model.change(writer => {\r\n            const horizontalElement = writer.createElement('horizontalLine');\r\n            model.insertObject(horizontalElement, null, null, { setSelection: 'after' });\r\n        });\r\n    }\r\n}\r\n/**\r\n * Checks if a horizontal line is allowed by the schema in the optimal insertion parent.\r\n *\r\n * @param model Model instance.\r\n */\r\nfunction isHorizontalLineAllowedInParent(selection, schema, model) {\r\n    const parent = getInsertHorizontalLineParent(selection, model);\r\n    return schema.checkChild(parent, 'horizontalLine');\r\n}\r\n/**\r\n * Returns a node that will be used to insert a horizontal line with `model.insertContent` to check if the horizontal line can be\r\n * placed there.\r\n *\r\n * @param model Model instance.\r\n */\r\nfunction getInsertHorizontalLineParent(selection, model) {\r\n    const insertionRange = findOptimalInsertionRange(selection, model);\r\n    const parent = insertionRange.start.parent;\r\n    if (parent.isEmpty && !parent.is('element', '$root')) {\r\n        return parent.parent;\r\n    }\r\n    return parent;\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./horizontalline.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module horizontal-line/horizontallineediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { toWidget } from 'ckeditor5/src/widget';\r\nimport HorizontalLineCommand from './horizontallinecommand';\r\nimport '../theme/horizontalline.css';\r\n/**\r\n * The horizontal line editing feature.\r\n */\r\nexport default class HorizontalLineEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'HorizontalLineEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const schema = editor.model.schema;\r\n        const t = editor.t;\r\n        const conversion = editor.conversion;\r\n        schema.register('horizontalLine', {\r\n            inheritAllFrom: '$blockObject'\r\n        });\r\n        conversion.for('dataDowncast').elementToElement({\r\n            model: 'horizontalLine',\r\n            view: (modelElement, { writer }) => {\r\n                return writer.createEmptyElement('hr');\r\n            }\r\n        });\r\n        conversion.for('editingDowncast').elementToStructure({\r\n            model: 'horizontalLine',\r\n            view: (modelElement, { writer }) => {\r\n                const label = t('Horizontal line');\r\n                const viewWrapper = writer.createContainerElement('div', null, writer.createEmptyElement('hr'));\r\n                writer.addClass('ck-horizontal-line', viewWrapper);\r\n                writer.setCustomProperty('hr', true, viewWrapper);\r\n                return toHorizontalLineWidget(viewWrapper, writer, label);\r\n            }\r\n        });\r\n        conversion.for('upcast').elementToElement({ view: 'hr', model: 'horizontalLine' });\r\n        editor.commands.add('horizontalLine', new HorizontalLineCommand(editor));\r\n    }\r\n}\r\n/**\r\n * Converts a given {@link module:engine/view/element~Element} to a horizontal line widget:\r\n * * Adds a {@link module:engine/view/element~Element#_setCustomProperty custom property} allowing to\r\n *   recognize the horizontal line widget element.\r\n * * Calls the {@link module:widget/utils~toWidget} function with the proper element's label creator.\r\n *\r\n * @param writer An instance of the view writer.\r\n */\r\nfunction toHorizontalLineWidget(viewElement, writer, label) {\r\n    writer.setCustomProperty('horizontalLine', true, viewElement);\r\n    return toWidget(viewElement, writer, { label });\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module horizontal-line/horizontallineui\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { ButtonView } from 'ckeditor5/src/ui';\r\nimport horizontalLineIcon from '../theme/icons/horizontalline.svg';\r\n/**\r\n * The horizontal line UI plugin.\r\n */\r\nexport default class HorizontalLineUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'HorizontalLineUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        // Add the `horizontalLine` button to feature components.\r\n        editor.ui.componentFactory.add('horizontalLine', locale => {\r\n            const command = editor.commands.get('horizontalLine');\r\n            const view = new ButtonView(locale);\r\n            view.set({\r\n                label: t('Horizontal line'),\r\n                icon: horizontalLineIcon,\r\n                tooltip: true\r\n            });\r\n            view.bind('isEnabled').to(command, 'isEnabled');\r\n            // Execute the command.\r\n            this.listenTo(view, 'execute', () => {\r\n                editor.execute('horizontalLine');\r\n                editor.editing.view.focus();\r\n            });\r\n            return view;\r\n        });\r\n    }\r\n}\r\n","export default \"<svg viewBox=\\\"0 0 20 20\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M2 9h16v2H2z\\\"/></svg>\";","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imagetextalternative/imagetextalternativecommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\n/**\r\n * The image text alternative command. It is used to change the `alt` attribute of `<imageBlock>` and `<imageInline>` model elements.\r\n */\r\nexport default class ImageTextAlternativeCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const editor = this.editor;\r\n        const imageUtils = editor.plugins.get('ImageUtils');\r\n        const element = imageUtils.getClosestSelectedImageElement(this.editor.model.document.selection);\r\n        this.isEnabled = !!element;\r\n        if (this.isEnabled && element.hasAttribute('alt')) {\r\n            this.value = element.getAttribute('alt');\r\n        }\r\n        else {\r\n            this.value = false;\r\n        }\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * @fires execute\r\n     * @param options\r\n     * @param options.newValue The new value of the `alt` attribute to set.\r\n     */\r\n    execute(options) {\r\n        const editor = this.editor;\r\n        const imageUtils = editor.plugins.get('ImageUtils');\r\n        const model = editor.model;\r\n        const imageElement = imageUtils.getClosestSelectedImageElement(model.document.selection);\r\n        model.change(writer => {\r\n            writer.setAttribute('alt', options.newValue, imageElement);\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imagetextalternative/imagetextalternativeediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport ImageTextAlternativeCommand from './imagetextalternativecommand';\r\nimport ImageUtils from '../imageutils';\r\n/**\r\n * The image text alternative editing plugin.\r\n *\r\n * Registers the `'imageTextAlternative'` command.\r\n */\r\nexport default class ImageTextAlternativeEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ImageUtils];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageTextAlternativeEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        this.editor.commands.add('imageTextAlternative', new ImageTextAlternativeCommand(this.editor));\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./textalternativeform.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imagetextalternative/ui/textalternativeformview\r\n */\r\nimport { ButtonView, FocusCycler, LabeledFieldView, View, ViewCollection, createLabeledInputText, submitHandler } from 'ckeditor5/src/ui';\r\nimport { FocusTracker, KeystrokeHandler } from 'ckeditor5/src/utils';\r\nimport { icons } from 'ckeditor5/src/core';\r\nimport '../../../theme/textalternativeform.css';\r\n// See: #8833.\r\n// eslint-disable-next-line ckeditor5-rules/ckeditor-imports\r\nimport '@ckeditor/ckeditor5-ui/theme/components/responsive-form/responsiveform.css';\r\n/**\r\n * The TextAlternativeFormView class.\r\n */\r\nexport default class TextAlternativeFormView extends View {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        const t = this.locale.t;\r\n        this.focusTracker = new FocusTracker();\r\n        this.keystrokes = new KeystrokeHandler();\r\n        this.labeledInput = this._createLabeledInputView();\r\n        this.saveButtonView = this._createButton(t('Save'), icons.check, 'ck-button-save');\r\n        this.saveButtonView.type = 'submit';\r\n        this.cancelButtonView = this._createButton(t('Cancel'), icons.cancel, 'ck-button-cancel', 'cancel');\r\n        this._focusables = new ViewCollection();\r\n        this._focusCycler = new FocusCycler({\r\n            focusables: this._focusables,\r\n            focusTracker: this.focusTracker,\r\n            keystrokeHandler: this.keystrokes,\r\n            actions: {\r\n                // Navigate form fields backwards using the Shift + Tab keystroke.\r\n                focusPrevious: 'shift + tab',\r\n                // Navigate form fields forwards using the Tab key.\r\n                focusNext: 'tab'\r\n            }\r\n        });\r\n        this.setTemplate({\r\n            tag: 'form',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-text-alternative-form',\r\n                    'ck-responsive-form'\r\n                ],\r\n                // https://github.com/ckeditor/ckeditor5-image/issues/40\r\n                tabindex: '-1'\r\n            },\r\n            children: [\r\n                this.labeledInput,\r\n                this.saveButtonView,\r\n                this.cancelButtonView\r\n            ]\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        this.keystrokes.listenTo(this.element);\r\n        submitHandler({ view: this });\r\n        [this.labeledInput, this.saveButtonView, this.cancelButtonView]\r\n            .forEach(v => {\r\n            // Register the view as focusable.\r\n            this._focusables.add(v);\r\n            // Register the view in the focus tracker.\r\n            this.focusTracker.add(v.element);\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        this.focusTracker.destroy();\r\n        this.keystrokes.destroy();\r\n    }\r\n    /**\r\n     * Creates the button view.\r\n     *\r\n     * @param label The button label\r\n     * @param icon The button's icon.\r\n     * @param className The additional button CSS class name.\r\n     * @param eventName The event name that the ButtonView#execute event will be delegated to.\r\n     * @returns The button view instance.\r\n     */\r\n    _createButton(label, icon, className, eventName) {\r\n        const button = new ButtonView(this.locale);\r\n        button.set({\r\n            label,\r\n            icon,\r\n            tooltip: true\r\n        });\r\n        button.extendTemplate({\r\n            attributes: {\r\n                class: className\r\n            }\r\n        });\r\n        if (eventName) {\r\n            button.delegate('execute').to(this, eventName);\r\n        }\r\n        return button;\r\n    }\r\n    /**\r\n     * Creates an input with a label.\r\n     *\r\n     * @returns Labeled field view instance.\r\n     */\r\n    _createLabeledInputView() {\r\n        const t = this.locale.t;\r\n        const labeledInput = new LabeledFieldView(this.locale, createLabeledInputText);\r\n        labeledInput.label = t('Text alternative');\r\n        return labeledInput;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { BalloonPanelView } from 'ckeditor5/src/ui';\r\n/**\r\n * A helper utility that positions the\r\n * {@link module:ui/panel/balloon/contextualballoon~ContextualBalloon contextual balloon} instance\r\n * with respect to the image in the editor content, if one is selected.\r\n *\r\n * @param editor The editor instance.\r\n */\r\nexport function repositionContextualBalloon(editor) {\r\n    const balloon = editor.plugins.get('ContextualBalloon');\r\n    const imageUtils = editor.plugins.get('ImageUtils');\r\n    if (imageUtils.getClosestSelectedImageWidget(editor.editing.view.document.selection)) {\r\n        const position = getBalloonPositionData(editor);\r\n        balloon.updatePosition(position);\r\n    }\r\n}\r\n/**\r\n * Returns the positioning options that control the geometry of the\r\n * {@link module:ui/panel/balloon/contextualballoon~ContextualBalloon contextual balloon} with respect\r\n * to the selected element in the editor content.\r\n *\r\n * @param editor The editor instance.\r\n */\r\nexport function getBalloonPositionData(editor) {\r\n    const editingView = editor.editing.view;\r\n    const defaultPositions = BalloonPanelView.defaultPositions;\r\n    const imageUtils = editor.plugins.get('ImageUtils');\r\n    return {\r\n        target: editingView.domConverter.mapViewToDom(imageUtils.getClosestSelectedImageWidget(editingView.document.selection)),\r\n        positions: [\r\n            defaultPositions.northArrowSouth,\r\n            defaultPositions.northArrowSouthWest,\r\n            defaultPositions.northArrowSouthEast,\r\n            defaultPositions.southArrowNorth,\r\n            defaultPositions.southArrowNorthWest,\r\n            defaultPositions.southArrowNorthEast,\r\n            defaultPositions.viewportStickyNorth\r\n        ]\r\n    };\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imagetextalternative/imagetextalternativeui\r\n */\r\nimport { Plugin, icons } from 'ckeditor5/src/core';\r\nimport { ButtonView, ContextualBalloon, clickOutsideHandler, CssTransitionDisablerMixin } from 'ckeditor5/src/ui';\r\nimport TextAlternativeFormView from './ui/textalternativeformview';\r\nimport { repositionContextualBalloon, getBalloonPositionData } from '../image/ui/utils';\r\n/**\r\n * The image text alternative UI plugin.\r\n *\r\n * The plugin uses the {@link module:ui/panel/balloon/contextualballoon~ContextualBalloon}.\r\n */\r\nexport default class ImageTextAlternativeUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ContextualBalloon];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageTextAlternativeUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        this._createButton();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        // Destroy created UI components as they are not automatically destroyed (see ckeditor5#1341).\r\n        if (this._form) {\r\n            this._form.destroy();\r\n        }\r\n    }\r\n    /**\r\n     * Creates a button showing the balloon panel for changing the image text alternative and\r\n     * registers it in the editor {@link module:ui/componentfactory~ComponentFactory ComponentFactory}.\r\n     */\r\n    _createButton() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        editor.ui.componentFactory.add('imageTextAlternative', locale => {\r\n            const command = editor.commands.get('imageTextAlternative');\r\n            const view = new ButtonView(locale);\r\n            view.set({\r\n                label: t('Change image text alternative'),\r\n                icon: icons.lowVision,\r\n                tooltip: true\r\n            });\r\n            view.bind('isEnabled').to(command, 'isEnabled');\r\n            view.bind('isOn').to(command, 'value', value => !!value);\r\n            this.listenTo(view, 'execute', () => {\r\n                this._showForm();\r\n            });\r\n            return view;\r\n        });\r\n    }\r\n    /**\r\n     * Creates the {@link module:image/imagetextalternative/ui/textalternativeformview~TextAlternativeFormView}\r\n     * form.\r\n     */\r\n    _createForm() {\r\n        const editor = this.editor;\r\n        const view = editor.editing.view;\r\n        const viewDocument = view.document;\r\n        const imageUtils = editor.plugins.get('ImageUtils');\r\n        this._balloon = this.editor.plugins.get('ContextualBalloon');\r\n        this._form = new (CssTransitionDisablerMixin(TextAlternativeFormView))(editor.locale);\r\n        // Render the form so its #element is available for clickOutsideHandler.\r\n        this._form.render();\r\n        this.listenTo(this._form, 'submit', () => {\r\n            editor.execute('imageTextAlternative', {\r\n                newValue: this._form.labeledInput.fieldView.element.value\r\n            });\r\n            this._hideForm(true);\r\n        });\r\n        this.listenTo(this._form, 'cancel', () => {\r\n            this._hideForm(true);\r\n        });\r\n        // Close the form on Esc key press.\r\n        this._form.keystrokes.set('Esc', (data, cancel) => {\r\n            this._hideForm(true);\r\n            cancel();\r\n        });\r\n        // Reposition the balloon or hide the form if an image widget is no longer selected.\r\n        this.listenTo(editor.ui, 'update', () => {\r\n            if (!imageUtils.getClosestSelectedImageWidget(viewDocument.selection)) {\r\n                this._hideForm(true);\r\n            }\r\n            else if (this._isVisible) {\r\n                repositionContextualBalloon(editor);\r\n            }\r\n        });\r\n        // Close on click outside of balloon panel element.\r\n        clickOutsideHandler({\r\n            emitter: this._form,\r\n            activator: () => this._isVisible,\r\n            contextElements: () => [this._balloon.view.element],\r\n            callback: () => this._hideForm()\r\n        });\r\n    }\r\n    /**\r\n     * Shows the {@link #_form} in the {@link #_balloon}.\r\n     */\r\n    _showForm() {\r\n        if (this._isVisible) {\r\n            return;\r\n        }\r\n        if (!this._form) {\r\n            this._createForm();\r\n        }\r\n        const editor = this.editor;\r\n        const command = editor.commands.get('imageTextAlternative');\r\n        const labeledInput = this._form.labeledInput;\r\n        this._form.disableCssTransitions();\r\n        if (!this._isInBalloon) {\r\n            this._balloon.add({\r\n                view: this._form,\r\n                position: getBalloonPositionData(editor)\r\n            });\r\n        }\r\n        // Make sure that each time the panel shows up, the field remains in sync with the value of\r\n        // the command. If the user typed in the input, then canceled the balloon (`labeledInput#value`\r\n        // stays unaltered) and re-opened it without changing the value of the command, they would see the\r\n        // old value instead of the actual value of the command.\r\n        // https://github.com/ckeditor/ckeditor5-image/issues/114\r\n        labeledInput.fieldView.value = labeledInput.fieldView.element.value = command.value || '';\r\n        this._form.labeledInput.fieldView.select();\r\n        this._form.enableCssTransitions();\r\n    }\r\n    /**\r\n     * Removes the {@link #_form} from the {@link #_balloon}.\r\n     *\r\n     * @param focusEditable Controls whether the editing view is focused afterwards.\r\n     */\r\n    _hideForm(focusEditable = false) {\r\n        if (!this._isInBalloon) {\r\n            return;\r\n        }\r\n        // Blur the input element before removing it from DOM to prevent issues in some browsers.\r\n        // See https://github.com/ckeditor/ckeditor5/issues/1501.\r\n        if (this._form.focusTracker.isFocused) {\r\n            this._form.saveButtonView.focus();\r\n        }\r\n        this._balloon.remove(this._form);\r\n        if (focusEditable) {\r\n            this.editor.editing.view.focus();\r\n        }\r\n    }\r\n    /**\r\n     * Returns `true` when the {@link #_form} is the visible view in the {@link #_balloon}.\r\n     */\r\n    get _isVisible() {\r\n        return !!this._balloon && this._balloon.visibleView === this._form;\r\n    }\r\n    /**\r\n     * Returns `true` when the {@link #_form} is in the {@link #_balloon}.\r\n     */\r\n    get _isInBalloon() {\r\n        return !!this._balloon && this._balloon.hasView(this._form);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imagetextalternative\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport ImageTextAlternativeEditing from './imagetextalternative/imagetextalternativeediting';\r\nimport ImageTextAlternativeUI from './imagetextalternative/imagetextalternativeui';\r\n/**\r\n * The image text alternative plugin.\r\n *\r\n * For a detailed overview, check the {@glink features/images/images-styles image styles} documentation.\r\n *\r\n * This is a \"glue\" plugin which loads the\r\n *  {@link module:image/imagetextalternative/imagetextalternativeediting~ImageTextAlternativeEditing}\r\n * and {@link module:image/imagetextalternative/imagetextalternativeui~ImageTextAlternativeUI} plugins.\r\n */\r\nexport default class ImageTextAlternative extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ImageTextAlternativeEditing, ImageTextAlternativeUI];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageTextAlternative';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { first } from 'ckeditor5/src/utils';\r\n/**\r\n * Returns a function that converts the image view representation:\r\n *\r\n * ```html\r\n * <figure class=\"image\"><img src=\"...\" alt=\"...\"></img></figure>\r\n * ```\r\n *\r\n * to the model representation:\r\n *\r\n * ```html\r\n * <imageBlock src=\"...\" alt=\"...\"></imageBlock>\r\n * ```\r\n *\r\n * The entire content of the `<figure>` element except the first `<img>` is being converted as children\r\n * of the `<imageBlock>` model element.\r\n *\r\n * @internal\r\n */\r\nexport function upcastImageFigure(imageUtils) {\r\n    const converter = (evt, data, conversionApi) => {\r\n        // Do not convert if this is not an \"image figure\".\r\n        if (!conversionApi.consumable.test(data.viewItem, { name: true, classes: 'image' })) {\r\n            return;\r\n        }\r\n        // Find an image element inside the figure element.\r\n        const viewImage = imageUtils.findViewImgElement(data.viewItem);\r\n        // Do not convert if image element is absent or was already converted.\r\n        if (!viewImage || !conversionApi.consumable.test(viewImage, { name: true })) {\r\n            return;\r\n        }\r\n        // Consume the figure to prevent other converters from processing it again.\r\n        conversionApi.consumable.consume(data.viewItem, { name: true, classes: 'image' });\r\n        // Convert view image to model image.\r\n        const conversionResult = conversionApi.convertItem(viewImage, data.modelCursor);\r\n        // Get image element from conversion result.\r\n        const modelImage = first(conversionResult.modelRange.getItems());\r\n        // When image wasn't successfully converted then finish conversion.\r\n        if (!modelImage) {\r\n            // Revert consumed figure so other features can convert it.\r\n            conversionApi.consumable.revert(data.viewItem, { name: true, classes: 'image' });\r\n            return;\r\n        }\r\n        // Convert rest of the figure element's children as an image children.\r\n        conversionApi.convertChildren(data.viewItem, modelImage);\r\n        conversionApi.updateConversionResult(modelImage, data);\r\n    };\r\n    return dispatcher => {\r\n        dispatcher.on('element:figure', converter);\r\n    };\r\n}\r\n/**\r\n * Returns a function that converts the image view representation:\r\n *\r\n * ```html\r\n * <picture><source ... /><source ... />...<img ... /></picture>\r\n * ```\r\n *\r\n * to the model representation as the `sources` attribute:\r\n *\r\n * ```html\r\n * <image[Block|Inline] ... sources=\"...\"></image[Block|Inline]>\r\n * ```\r\n *\r\n * @internal\r\n */\r\nexport function upcastPicture(imageUtils) {\r\n    const sourceAttributeNames = ['srcset', 'media', 'type', 'sizes'];\r\n    const converter = (evt, data, conversionApi) => {\r\n        const pictureViewElement = data.viewItem;\r\n        // Do not convert <picture> if already consumed.\r\n        if (!conversionApi.consumable.test(pictureViewElement, { name: true })) {\r\n            return;\r\n        }\r\n        const sources = new Map();\r\n        // Collect all <source /> elements attribute values.\r\n        for (const childSourceElement of pictureViewElement.getChildren()) {\r\n            if (childSourceElement.is('element', 'source')) {\r\n                const attributes = {};\r\n                for (const name of sourceAttributeNames) {\r\n                    if (childSourceElement.hasAttribute(name)) {\r\n                        // Don't collect <source /> attribute if already consumed somewhere else.\r\n                        if (conversionApi.consumable.test(childSourceElement, { attributes: name })) {\r\n                            attributes[name] = childSourceElement.getAttribute(name);\r\n                        }\r\n                    }\r\n                }\r\n                if (Object.keys(attributes).length) {\r\n                    sources.set(childSourceElement, attributes);\r\n                }\r\n            }\r\n        }\r\n        const imgViewElement = imageUtils.findViewImgElement(pictureViewElement);\r\n        // Don't convert when a picture has no <img/> inside (it is broken).\r\n        if (!imgViewElement) {\r\n            return;\r\n        }\r\n        let modelImage = data.modelCursor.parent;\r\n        // - In case of an inline image (cursor parent in a <paragraph>), the <img/> must be converted right away\r\n        // because no converter handled it yet and otherwise there would be no model element to set the sources attribute on.\r\n        // - In case of a block image, the <figure class=\"image\"> converter (in ImageBlockEditing) converts the\r\n        // <img/> right away on its own and the modelCursor is already inside an imageBlock and there's nothing special\r\n        // to do here.\r\n        if (!modelImage.is('element', 'imageBlock')) {\r\n            const conversionResult = conversionApi.convertItem(imgViewElement, data.modelCursor);\r\n            // Set image range as conversion result.\r\n            data.modelRange = conversionResult.modelRange;\r\n            // Continue conversion where image conversion ends.\r\n            data.modelCursor = conversionResult.modelCursor;\r\n            modelImage = first(conversionResult.modelRange.getItems());\r\n        }\r\n        conversionApi.consumable.consume(pictureViewElement, { name: true });\r\n        // Consume only these <source/> attributes that were actually collected and will be passed on\r\n        // to the image model element.\r\n        for (const [sourceElement, attributes] of sources) {\r\n            conversionApi.consumable.consume(sourceElement, { attributes: Object.keys(attributes) });\r\n        }\r\n        if (sources.size) {\r\n            conversionApi.writer.setAttribute('sources', Array.from(sources.values()), modelImage);\r\n        }\r\n        // Convert rest of the <picture> children as an image children. Other converters may want to consume them.\r\n        conversionApi.convertChildren(pictureViewElement, modelImage);\r\n    };\r\n    return dispatcher => {\r\n        dispatcher.on('element:picture', converter);\r\n    };\r\n}\r\n/**\r\n * Converter used to convert the `srcset` model image attribute to the `srcset`, `sizes` and `width` attributes in the view.\r\n *\r\n * @internal\r\n * @param imageType The type of the image.\r\n */\r\nexport function downcastSrcsetAttribute(imageUtils, imageType) {\r\n    const converter = (evt, data, conversionApi) => {\r\n        if (!conversionApi.consumable.consume(data.item, evt.name)) {\r\n            return;\r\n        }\r\n        const writer = conversionApi.writer;\r\n        const element = conversionApi.mapper.toViewElement(data.item);\r\n        const img = imageUtils.findViewImgElement(element);\r\n        if (data.attributeNewValue === null) {\r\n            const srcset = data.attributeOldValue;\r\n            if (srcset && srcset.data) {\r\n                writer.removeAttribute('srcset', img);\r\n                writer.removeAttribute('sizes', img);\r\n                if (srcset.width) {\r\n                    writer.removeAttribute('width', img);\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            const srcset = data.attributeNewValue;\r\n            if (srcset && srcset.data) {\r\n                writer.setAttribute('srcset', srcset.data, img);\r\n                // Always outputting `100vw`. See https://github.com/ckeditor/ckeditor5-image/issues/2.\r\n                writer.setAttribute('sizes', '100vw', img);\r\n                if (srcset.width) {\r\n                    writer.setAttribute('width', srcset.width, img);\r\n                }\r\n            }\r\n        }\r\n    };\r\n    return dispatcher => {\r\n        dispatcher.on(`attribute:srcset:${imageType}`, converter);\r\n    };\r\n}\r\n/**\r\n * Converts the `source` model attribute to the `<picture><source /><source />...<img /></picture>`\r\n * view structure.\r\n *\r\n * @internal\r\n */\r\nexport function downcastSourcesAttribute(imageUtils) {\r\n    const converter = (evt, data, conversionApi) => {\r\n        if (!conversionApi.consumable.consume(data.item, evt.name)) {\r\n            return;\r\n        }\r\n        const viewWriter = conversionApi.writer;\r\n        const element = conversionApi.mapper.toViewElement(data.item);\r\n        const imgElement = imageUtils.findViewImgElement(element);\r\n        const attributeNewValue = data.attributeNewValue;\r\n        if (attributeNewValue && attributeNewValue.length) {\r\n            // Make sure <picture> does not break attribute elements, for instance <a> in linked images.\r\n            const pictureElement = viewWriter.createContainerElement('picture', null, attributeNewValue.map(sourceAttributes => {\r\n                return viewWriter.createEmptyElement('source', sourceAttributes);\r\n            }));\r\n            // Collect all wrapping attribute elements.\r\n            const attributeElements = [];\r\n            let viewElement = imgElement.parent;\r\n            while (viewElement && viewElement.is('attributeElement')) {\r\n                const parentElement = viewElement.parent;\r\n                viewWriter.unwrap(viewWriter.createRangeOn(imgElement), viewElement);\r\n                attributeElements.unshift(viewElement);\r\n                viewElement = parentElement;\r\n            }\r\n            // Insert the picture and move img into it.\r\n            viewWriter.insert(viewWriter.createPositionBefore(imgElement), pictureElement);\r\n            viewWriter.move(viewWriter.createRangeOn(imgElement), viewWriter.createPositionAt(pictureElement, 'end'));\r\n            // Apply collected attribute elements over the new picture element.\r\n            for (const attributeElement of attributeElements) {\r\n                viewWriter.wrap(viewWriter.createRangeOn(pictureElement), attributeElement);\r\n            }\r\n        }\r\n        // Both setting \"sources\" to an empty array and removing the attribute should unwrap the <img />.\r\n        // Unwrap once if the latter followed the former, though.\r\n        else if (imgElement.parent.is('element', 'picture')) {\r\n            const pictureElement = imgElement.parent;\r\n            viewWriter.move(viewWriter.createRangeOn(imgElement), viewWriter.createPositionBefore(pictureElement));\r\n            viewWriter.remove(pictureElement);\r\n        }\r\n    };\r\n    return dispatcher => {\r\n        dispatcher.on('attribute:sources:imageBlock', converter);\r\n        dispatcher.on('attribute:sources:imageInline', converter);\r\n    };\r\n}\r\n/**\r\n * Converter used to convert a given image attribute from the model to the view.\r\n *\r\n * @internal\r\n * @param imageType The type of the image.\r\n * @param attributeKey The name of the attribute to convert.\r\n */\r\nexport function downcastImageAttribute(imageUtils, imageType, attributeKey) {\r\n    const converter = (evt, data, conversionApi) => {\r\n        if (!conversionApi.consumable.consume(data.item, evt.name)) {\r\n            return;\r\n        }\r\n        const viewWriter = conversionApi.writer;\r\n        const element = conversionApi.mapper.toViewElement(data.item);\r\n        const img = imageUtils.findViewImgElement(element);\r\n        viewWriter.setAttribute(data.attributeKey, data.attributeNewValue || '', img);\r\n    };\r\n    return dispatcher => {\r\n        dispatcher.on(`attribute:${attributeKey}:${imageType}`, converter);\r\n    };\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/image/imageloadobserver\r\n */\r\nimport { Observer } from 'ckeditor5/src/engine';\r\n/**\r\n * Observes all new images added to the {@link module:engine/view/document~Document},\r\n * fires {@link module:engine/view/document~Document#event:imageLoaded} and\r\n * {@link module:engine/view/document~Document#event:layoutChanged} event every time when the new image\r\n * has been loaded.\r\n *\r\n * **Note:** This event is not fired for images that has been added to the document and rendered as `complete` (already loaded).\r\n */\r\nexport default class ImageLoadObserver extends Observer {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    observe(domRoot) {\r\n        this.listenTo(domRoot, 'load', (event, domEvent) => {\r\n            const domElement = domEvent.target;\r\n            if (this.checkShouldIgnoreEventFromTarget(domElement)) {\r\n                return;\r\n            }\r\n            if (domElement.tagName == 'IMG') {\r\n                this._fireEvents(domEvent);\r\n            }\r\n            // Use capture phase for better performance (#4504).\r\n        }, { useCapture: true });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    stopObserving(domRoot) {\r\n        this.stopListening(domRoot);\r\n    }\r\n    /**\r\n     * Fires {@link module:engine/view/document~Document#event:layoutChanged} and\r\n     * {@link module:engine/view/document~Document#event:imageLoaded}\r\n     * if observer {@link #isEnabled is enabled}.\r\n     *\r\n     * @param domEvent The DOM event.\r\n     */\r\n    _fireEvents(domEvent) {\r\n        if (this.isEnabled) {\r\n            this.document.fire('layoutChanged');\r\n            this.document.fire('imageLoaded', domEvent);\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/image/insertimagecommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { logWarning, toArray } from 'ckeditor5/src/utils';\r\n/**\r\n * Insert image command.\r\n *\r\n * The command is registered by the {@link module:image/image/imageediting~ImageEditing} plugin as `insertImage`\r\n * and it is also available via aliased `imageInsert` name.\r\n *\r\n * In order to insert an image at the current selection position\r\n * (according to the {@link module:widget/utils~findOptimalInsertionRange} algorithm),\r\n * execute the command and specify the image source:\r\n *\r\n * ```ts\r\n * editor.execute( 'insertImage', { source: 'http://url.to.the/image' } );\r\n * ```\r\n *\r\n * It is also possible to insert multiple images at once:\r\n *\r\n * ```ts\r\n * editor.execute( 'insertImage', {\r\n * \tsource:  [\r\n * \t\t'path/to/image.jpg',\r\n * \t\t'path/to/other-image.jpg'\r\n * \t]\r\n * } );\r\n * ```\r\n *\r\n * If you want to take the full control over the process, you can specify individual model attributes:\r\n *\r\n * ```ts\r\n * editor.execute( 'insertImage', {\r\n * \tsource:  [\r\n * \t\t{ src: 'path/to/image.jpg', alt: 'First alt text' },\r\n * \t\t{ src: 'path/to/other-image.jpg', alt: 'Second alt text', customAttribute: 'My attribute value' }\r\n * \t]\r\n * } );\r\n * ```\r\n */\r\nexport default class InsertImageCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        const configImageInsertType = editor.config.get('image.insert.type');\r\n        if (!editor.plugins.has('ImageBlockEditing')) {\r\n            if (configImageInsertType === 'block') {\r\n                /**\r\n                 * The {@link module:image/imageblock~ImageBlock} plugin must be enabled to allow inserting block images. See\r\n                 * {@link module:image/imageconfig~ImageInsertConfig#type} to learn more.\r\n                 *\r\n                 * @error image-block-plugin-required\r\n                 */\r\n                logWarning('image-block-plugin-required');\r\n            }\r\n        }\r\n        if (!editor.plugins.has('ImageInlineEditing')) {\r\n            if (configImageInsertType === 'inline') {\r\n                /**\r\n                 * The {@link module:image/imageinline~ImageInline} plugin must be enabled to allow inserting inline images. See\r\n                 * {@link module:image/imageconfig~ImageInsertConfig#type} to learn more.\r\n                 *\r\n                 * @error image-inline-plugin-required\r\n                 */\r\n                logWarning('image-inline-plugin-required');\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const imageUtils = this.editor.plugins.get('ImageUtils');\r\n        this.isEnabled = imageUtils.isImageAllowed();\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * @fires execute\r\n     * @param options Options for the executed command.\r\n     * @param options.source The image source or an array of image sources to insert.\r\n     * See the documentation of the command to learn more about accepted formats.\r\n     */\r\n    execute(options) {\r\n        const sourceDefinitions = toArray(options.source);\r\n        const selection = this.editor.model.document.selection;\r\n        const imageUtils = this.editor.plugins.get('ImageUtils');\r\n        // In case of multiple images, each image (starting from the 2nd) will be inserted at a position that\r\n        // follows the previous one. That will move the selection and, to stay on the safe side and make sure\r\n        // all images inherit the same selection attributes, they are collected beforehand.\r\n        //\r\n        // Applying these attributes ensures, for instance, that inserting an (inline) image into a link does\r\n        // not split that link but preserves its continuity.\r\n        //\r\n        // Note: Selection attributes that do not make sense for images will be filtered out by insertImage() anyway.\r\n        const selectionAttributes = Object.fromEntries(selection.getAttributes());\r\n        sourceDefinitions.forEach((sourceDefinition, index) => {\r\n            const selectedElement = selection.getSelectedElement();\r\n            if (typeof sourceDefinition === 'string') {\r\n                sourceDefinition = { src: sourceDefinition };\r\n            }\r\n            // Inserting of an inline image replace the selected element and make a selection on the inserted image.\r\n            // Therefore inserting multiple inline images requires creating position after each element.\r\n            if (index && selectedElement && imageUtils.isImage(selectedElement)) {\r\n                const position = this.editor.model.createPositionAfter(selectedElement);\r\n                imageUtils.insertImage({ ...sourceDefinition, ...selectionAttributes }, position);\r\n            }\r\n            else {\r\n                imageUtils.insertImage({ ...sourceDefinition, ...selectionAttributes });\r\n            }\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\n/**\r\n * @module image/image/replaceimagesourcecommand\r\n */\r\n/**\r\n * Replace image source command.\r\n *\r\n * Changes image source to the one provided. Can be executed as follows:\r\n *\r\n * ```ts\r\n * editor.execute( 'replaceImageSource', { source: 'http://url.to.the/image' } );\r\n * ```\r\n */\r\nexport default class ReplaceImageSourceCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const editor = this.editor;\r\n        const imageUtils = editor.plugins.get('ImageUtils');\r\n        const element = this.editor.model.document.selection.getSelectedElement();\r\n        this.isEnabled = imageUtils.isImage(element);\r\n        this.value = this.isEnabled ? element.getAttribute('src') : null;\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * @fires execute\r\n     * @param options Options for the executed command.\r\n     * @param options.source The image source to replace.\r\n     */\r\n    execute(options) {\r\n        const image = this.editor.model.document.selection.getSelectedElement();\r\n        this.editor.model.change(writer => {\r\n            writer.setAttribute('src', options.source, image);\r\n            writer.removeAttribute('srcset', image);\r\n            writer.removeAttribute('sizes', image);\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/image/imageediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport ImageLoadObserver from './imageloadobserver';\r\nimport InsertImageCommand from './insertimagecommand';\r\nimport ReplaceImageSourceCommand from './replaceimagesourcecommand';\r\nimport ImageUtils from '../imageutils';\r\n/**\r\n * The image engine plugin. This module loads common code shared between\r\n * {@link module:image/image/imageinlineediting~ImageInlineEditing} and\r\n * {@link module:image/image/imageblockediting~ImageBlockEditing} plugins.\r\n *\r\n * This plugin registers the {@link module:image/image/insertimagecommand~InsertImageCommand 'insertImage'} command.\r\n */\r\nexport default class ImageEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ImageUtils];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const conversion = editor.conversion;\r\n        // See https://github.com/ckeditor/ckeditor5-image/issues/142.\r\n        editor.editing.view.addObserver(ImageLoadObserver);\r\n        conversion.for('upcast')\r\n            .attributeToAttribute({\r\n            view: {\r\n                name: 'img',\r\n                key: 'alt'\r\n            },\r\n            model: 'alt'\r\n        })\r\n            .attributeToAttribute({\r\n            view: {\r\n                name: 'img',\r\n                key: 'srcset'\r\n            },\r\n            model: {\r\n                key: 'srcset',\r\n                value: (viewImage) => {\r\n                    const value = {\r\n                        data: viewImage.getAttribute('srcset')\r\n                    };\r\n                    if (viewImage.hasAttribute('width')) {\r\n                        value.width = viewImage.getAttribute('width');\r\n                    }\r\n                    return value;\r\n                }\r\n            }\r\n        });\r\n        const insertImageCommand = new InsertImageCommand(editor);\r\n        const replaceImageSourceCommand = new ReplaceImageSourceCommand(editor);\r\n        editor.commands.add('insertImage', insertImageCommand);\r\n        editor.commands.add('replaceImageSource', replaceImageSourceCommand);\r\n        // `imageInsert` is an alias for backward compatibility.\r\n        editor.commands.add('imageInsert', insertImageCommand);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\n/**\r\n * The image type command. It changes the type of a selected image, depending on the configuration.\r\n */\r\nexport default class ImageTypeCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     *\r\n     * @param modelElementName Model element name the command converts to.\r\n     */\r\n    constructor(editor, modelElementName) {\r\n        super(editor);\r\n        this._modelElementName = modelElementName;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const editor = this.editor;\r\n        const imageUtils = editor.plugins.get('ImageUtils');\r\n        const element = imageUtils.getClosestSelectedImageElement(this.editor.model.document.selection);\r\n        if (this._modelElementName === 'imageBlock') {\r\n            this.isEnabled = imageUtils.isInlineImage(element);\r\n        }\r\n        else {\r\n            this.isEnabled = imageUtils.isBlockImage(element);\r\n        }\r\n    }\r\n    /**\r\n     * Executes the command and changes the type of a selected image.\r\n     *\r\n     * @fires execute\r\n     * @returns An object containing references to old and new model image elements\r\n     * (for before and after the change) so external integrations can hook into the decorated\r\n     * `execute` event and handle this change. `null` if the type change failed.\r\n     */\r\n    execute() {\r\n        const editor = this.editor;\r\n        const model = this.editor.model;\r\n        const imageUtils = editor.plugins.get('ImageUtils');\r\n        const oldElement = imageUtils.getClosestSelectedImageElement(model.document.selection);\r\n        const attributes = Object.fromEntries(oldElement.getAttributes());\r\n        // Don't change image type if \"src\" is missing (a broken image), unless there's \"uploadId\" set.\r\n        // This state may happen during image upload (before it finishes) and it should be possible to change type\r\n        // of the image in the meantime.\r\n        if (!attributes.src && !attributes.uploadId) {\r\n            return null;\r\n        }\r\n        return model.change(writer => {\r\n            // Get all markers that contain the old image element.\r\n            const markers = Array.from(model.markers)\r\n                .filter(marker => marker.getRange().containsItem(oldElement));\r\n            const newElement = imageUtils.insertImage(attributes, model.createSelection(oldElement, 'on'), this._modelElementName);\r\n            if (!newElement) {\r\n                return null;\r\n            }\r\n            const newElementRange = writer.createRangeOn(newElement);\r\n            // Expand the previously intersecting markers' ranges to include the new image element.\r\n            for (const marker of markers) {\r\n                const markerRange = marker.getRange();\r\n                // Join the survived part of the old marker range with the new element range\r\n                // (loosely because there could be some new paragraph or the existing one might got split).\r\n                const range = markerRange.root.rootName != '$graveyard' ?\r\n                    markerRange.getJoined(newElementRange, true) : newElementRange;\r\n                writer.updateMarker(marker, { range });\r\n            }\r\n            return {\r\n                oldElement,\r\n                newElement\r\n            };\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/image/imageblockediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { ClipboardPipeline } from 'ckeditor5/src/clipboard';\r\nimport { UpcastWriter } from 'ckeditor5/src/engine';\r\nimport { downcastImageAttribute, downcastSrcsetAttribute, upcastImageFigure } from './converters';\r\nimport ImageEditing from './imageediting';\r\nimport ImageTypeCommand from './imagetypecommand';\r\nimport ImageUtils from '../imageutils';\r\nimport { getImgViewElementMatcher, createBlockImageViewElement, determineImageTypeForInsertionAtSelection } from '../image/utils';\r\n/**\r\n * The image block plugin.\r\n *\r\n * It registers:\r\n *\r\n * * `<imageBlock>` as a block element in the document schema, and allows `alt`, `src` and `srcset` attributes.\r\n * * converters for editing and data pipelines.,\r\n * * {@link module:image/image/imagetypecommand~ImageTypeCommand `'imageTypeBlock'`} command that converts inline images into\r\n * block images.\r\n */\r\nexport default class ImageBlockEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ImageEditing, ImageUtils, ClipboardPipeline];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageBlockEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const schema = editor.model.schema;\r\n        // Converters 'alt' and 'srcset' are added in 'ImageEditing' plugin.\r\n        schema.register('imageBlock', {\r\n            inheritAllFrom: '$blockObject',\r\n            allowAttributes: ['alt', 'src', 'srcset']\r\n        });\r\n        this._setupConversion();\r\n        if (editor.plugins.has('ImageInlineEditing')) {\r\n            editor.commands.add('imageTypeBlock', new ImageTypeCommand(this.editor, 'imageBlock'));\r\n            this._setupClipboardIntegration();\r\n        }\r\n    }\r\n    /**\r\n     * Configures conversion pipelines to support upcasting and downcasting\r\n     * block images (block image widgets) and their attributes.\r\n     */\r\n    _setupConversion() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        const conversion = editor.conversion;\r\n        const imageUtils = editor.plugins.get('ImageUtils');\r\n        conversion.for('dataDowncast')\r\n            .elementToStructure({\r\n            model: 'imageBlock',\r\n            view: (modelElement, { writer }) => createBlockImageViewElement(writer)\r\n        });\r\n        conversion.for('editingDowncast')\r\n            .elementToStructure({\r\n            model: 'imageBlock',\r\n            view: (modelElement, { writer }) => imageUtils.toImageWidget(createBlockImageViewElement(writer), writer, t('image widget'))\r\n        });\r\n        conversion.for('downcast')\r\n            .add(downcastImageAttribute(imageUtils, 'imageBlock', 'src'))\r\n            .add(downcastImageAttribute(imageUtils, 'imageBlock', 'alt'))\r\n            .add(downcastSrcsetAttribute(imageUtils, 'imageBlock'));\r\n        // More image related upcasts are in 'ImageEditing' plugin.\r\n        conversion.for('upcast')\r\n            .elementToElement({\r\n            view: getImgViewElementMatcher(editor, 'imageBlock'),\r\n            model: (viewImage, { writer }) => writer.createElement('imageBlock', viewImage.hasAttribute('src') ? { src: viewImage.getAttribute('src') } : undefined)\r\n        })\r\n            .add(upcastImageFigure(imageUtils));\r\n    }\r\n    /**\r\n     * Integrates the plugin with the clipboard pipeline.\r\n     *\r\n     * Idea is that the feature should recognize the user's intent when an **inline** image is\r\n     * pasted or dropped. If such an image is pasted/dropped:\r\n     *\r\n     * * into an empty block (e.g. an empty paragraph),\r\n     * * on another object (e.g. some block widget).\r\n     *\r\n     * it gets converted into a block image on the fly. We assume this is the user's intent\r\n     * if they decided to put their image there.\r\n     *\r\n     * See the `ImageInlineEditing` for the similar integration that works in the opposite direction.\r\n     */\r\n    _setupClipboardIntegration() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const editingView = editor.editing.view;\r\n        const imageUtils = editor.plugins.get('ImageUtils');\r\n        const clipboardPipeline = editor.plugins.get('ClipboardPipeline');\r\n        this.listenTo(clipboardPipeline, 'inputTransformation', (evt, data) => {\r\n            const docFragmentChildren = Array.from(data.content.getChildren());\r\n            let modelRange;\r\n            // Make sure only <img> elements are dropped or pasted. Otherwise, if there some other HTML\r\n            // mixed up, this should be handled as a regular paste.\r\n            if (!docFragmentChildren.every(imageUtils.isInlineImageView)) {\r\n                return;\r\n            }\r\n            // When drag and dropping, data.targetRanges specifies where to drop because\r\n            // this is usually a different place than the current model selection (the user\r\n            // uses a drop marker to specify the drop location).\r\n            if (data.targetRanges) {\r\n                modelRange = editor.editing.mapper.toModelRange(data.targetRanges[0]);\r\n            }\r\n            // Pasting, however, always occurs at the current model selection.\r\n            else {\r\n                modelRange = model.document.selection.getFirstRange();\r\n            }\r\n            const selection = model.createSelection(modelRange);\r\n            // Convert inline images into block images only when the currently selected block is empty\r\n            // (e.g. an empty paragraph) or some object is selected (to replace it).\r\n            if (determineImageTypeForInsertionAtSelection(model.schema, selection) === 'imageBlock') {\r\n                const writer = new UpcastWriter(editingView.document);\r\n                // Wrap <img ... /> -> <figure class=\"image\"><img .../></figure>\r\n                const blockViewImages = docFragmentChildren.map(inlineViewImage => writer.createElement('figure', { class: 'image' }, inlineViewImage));\r\n                data.content = writer.createDocumentFragment(blockViewImages);\r\n            }\r\n        });\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./image.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imageblock\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { Widget } from 'ckeditor5/src/widget';\r\nimport ImageTextAlternative from './imagetextalternative';\r\nimport ImageBlockEditing from './image/imageblockediting';\r\nimport '../theme/image.css';\r\n/**\r\n * The image block plugin.\r\n *\r\n * This is a \"glue\" plugin which loads the following plugins:\r\n *\r\n * * {@link module:image/image/imageblockediting~ImageBlockEditing},\r\n * * {@link module:image/imagetextalternative~ImageTextAlternative}.\r\n *\r\n * Usually, it is used in conjunction with other plugins from this package. See the {@glink api/image package page}\r\n * for more information.\r\n */\r\nexport default class ImageBlock extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ImageBlockEditing, Widget, ImageTextAlternative];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageBlock';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/image/imageinlineediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { ClipboardPipeline } from 'ckeditor5/src/clipboard';\r\nimport { UpcastWriter } from 'ckeditor5/src/engine';\r\nimport { downcastImageAttribute, downcastSrcsetAttribute } from './converters';\r\nimport ImageEditing from './imageediting';\r\nimport ImageTypeCommand from './imagetypecommand';\r\nimport ImageUtils from '../imageutils';\r\nimport { getImgViewElementMatcher, createInlineImageViewElement, determineImageTypeForInsertionAtSelection } from '../image/utils';\r\n/**\r\n * The image inline plugin.\r\n *\r\n * It registers:\r\n *\r\n * * `<imageInline>` as an inline element in the document schema, and allows `alt`, `src` and `srcset` attributes.\r\n * * converters for editing and data pipelines.\r\n * * {@link module:image/image/imagetypecommand~ImageTypeCommand `'imageTypeInline'`} command that converts block images into\r\n * inline images.\r\n */\r\nexport default class ImageInlineEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ImageEditing, ImageUtils, ClipboardPipeline];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageInlineEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const schema = editor.model.schema;\r\n        // Converters 'alt' and 'srcset' are added in 'ImageEditing' plugin.\r\n        schema.register('imageInline', {\r\n            inheritAllFrom: '$inlineObject',\r\n            allowAttributes: ['alt', 'src', 'srcset']\r\n        });\r\n        // Disallow inline images in captions (for now). This is the best spot to do that because\r\n        // independent packages can introduce captions (ImageCaption, TableCaption, etc.) so better this\r\n        // be future-proof.\r\n        schema.addChildCheck((context, childDefinition) => {\r\n            if (context.endsWith('caption') && childDefinition.name === 'imageInline') {\r\n                return false;\r\n            }\r\n        });\r\n        this._setupConversion();\r\n        if (editor.plugins.has('ImageBlockEditing')) {\r\n            editor.commands.add('imageTypeInline', new ImageTypeCommand(this.editor, 'imageInline'));\r\n            this._setupClipboardIntegration();\r\n        }\r\n    }\r\n    /**\r\n     * Configures conversion pipelines to support upcasting and downcasting\r\n     * inline images (inline image widgets) and their attributes.\r\n     */\r\n    _setupConversion() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        const conversion = editor.conversion;\r\n        const imageUtils = editor.plugins.get('ImageUtils');\r\n        conversion.for('dataDowncast')\r\n            .elementToElement({\r\n            model: 'imageInline',\r\n            view: (modelElement, { writer }) => writer.createEmptyElement('img')\r\n        });\r\n        conversion.for('editingDowncast')\r\n            .elementToStructure({\r\n            model: 'imageInline',\r\n            view: (modelElement, { writer }) => imageUtils.toImageWidget(createInlineImageViewElement(writer), writer, t('image widget'))\r\n        });\r\n        conversion.for('downcast')\r\n            .add(downcastImageAttribute(imageUtils, 'imageInline', 'src'))\r\n            .add(downcastImageAttribute(imageUtils, 'imageInline', 'alt'))\r\n            .add(downcastSrcsetAttribute(imageUtils, 'imageInline'));\r\n        // More image related upcasts are in 'ImageEditing' plugin.\r\n        conversion.for('upcast')\r\n            .elementToElement({\r\n            view: getImgViewElementMatcher(editor, 'imageInline'),\r\n            model: (viewImage, { writer }) => writer.createElement('imageInline', viewImage.hasAttribute('src') ? { src: viewImage.getAttribute('src') } : undefined)\r\n        });\r\n    }\r\n    /**\r\n     * Integrates the plugin with the clipboard pipeline.\r\n     *\r\n     * Idea is that the feature should recognize the user's intent when an **block** image is\r\n     * pasted or dropped. If such an image is pasted/dropped into a non-empty block\r\n     * (e.g. a paragraph with some text) it gets converted into an inline image on the fly.\r\n     *\r\n     * We assume this is the user's intent if they decided to put their image there.\r\n     *\r\n     * **Note**: If a block image has a caption, it will not be converted to an inline image\r\n     * to avoid the confusion. Captions are added on purpose and they should never be lost\r\n     * in the clipboard pipeline.\r\n     *\r\n     * See the `ImageBlockEditing` for the similar integration that works in the opposite direction.\r\n     */\r\n    _setupClipboardIntegration() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const editingView = editor.editing.view;\r\n        const imageUtils = editor.plugins.get('ImageUtils');\r\n        const clipboardPipeline = editor.plugins.get('ClipboardPipeline');\r\n        this.listenTo(clipboardPipeline, 'inputTransformation', (evt, data) => {\r\n            const docFragmentChildren = Array.from(data.content.getChildren());\r\n            let modelRange;\r\n            // Make sure only <figure class=\"image\"></figure> elements are dropped or pasted. Otherwise, if there some other HTML\r\n            // mixed up, this should be handled as a regular paste.\r\n            if (!docFragmentChildren.every(imageUtils.isBlockImageView)) {\r\n                return;\r\n            }\r\n            // When drag and dropping, data.targetRanges specifies where to drop because\r\n            // this is usually a different place than the current model selection (the user\r\n            // uses a drop marker to specify the drop location).\r\n            if (data.targetRanges) {\r\n                modelRange = editor.editing.mapper.toModelRange(data.targetRanges[0]);\r\n            }\r\n            // Pasting, however, always occurs at the current model selection.\r\n            else {\r\n                modelRange = model.document.selection.getFirstRange();\r\n            }\r\n            const selection = model.createSelection(modelRange);\r\n            // Convert block images into inline images only when pasting or dropping into non-empty blocks\r\n            // and when the block is not an object (e.g. pasting to replace another widget).\r\n            if (determineImageTypeForInsertionAtSelection(model.schema, selection) === 'imageInline') {\r\n                const writer = new UpcastWriter(editingView.document);\r\n                // Unwrap <figure class=\"image\"><img .../></figure> -> <img ... />\r\n                // but <figure class=\"image\"><img .../><figcaption>...</figcaption></figure> -> stays the same\r\n                const inlineViewImages = docFragmentChildren.map(blockViewImage => {\r\n                    // If there's just one child, it can be either <img /> or <a><img></a>.\r\n                    // If there are other children than <img>, this means that the block image\r\n                    // has a caption or some other features and this kind of image should be\r\n                    // pasted/dropped without modifications.\r\n                    if (blockViewImage.childCount === 1) {\r\n                        // Pass the attributes which are present only in the <figure> to the <img>\r\n                        // (e.g. the style=\"width:10%\" attribute applied by the ImageResize plugin).\r\n                        Array.from(blockViewImage.getAttributes())\r\n                            .forEach(attribute => writer.setAttribute(...attribute, imageUtils.findViewImgElement(blockViewImage)));\r\n                        return blockViewImage.getChild(0);\r\n                    }\r\n                    else {\r\n                        return blockViewImage;\r\n                    }\r\n                });\r\n                data.content = writer.createDocumentFragment(inlineViewImages);\r\n            }\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imageinline\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { Widget } from 'ckeditor5/src/widget';\r\nimport ImageTextAlternative from './imagetextalternative';\r\nimport ImageInlineEditing from './image/imageinlineediting';\r\nimport '../theme/image.css';\r\n/**\r\n * The image inline plugin.\r\n *\r\n * This is a \"glue\" plugin which loads the following plugins:\r\n *\r\n * * {@link module:image/image/imageinlineediting~ImageInlineEditing},\r\n * * {@link module:image/imagetextalternative~ImageTextAlternative}.\r\n *\r\n * Usually, it is used in conjunction with other plugins from this package. See the {@glink api/image package page}\r\n * for more information.\r\n */\r\nexport default class ImageInline extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ImageInlineEditing, Widget, ImageTextAlternative];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageInline';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport ImageBlockEditing from '../image/imageblockediting';\r\n/**\r\n * The toggle image caption command.\r\n *\r\n * This command is registered by {@link module:image/imagecaption/imagecaptionediting~ImageCaptionEditing} as the\r\n * `'toggleImageCaption'` editor command.\r\n *\r\n * Executing this command:\r\n *\r\n * * either adds or removes the image caption of a selected image (depending on whether the caption is present or not),\r\n * * removes the image caption if the selection is anchored in one.\r\n *\r\n * ```ts\r\n * // Toggle the presence of the caption.\r\n * editor.execute( 'toggleImageCaption' );\r\n * ```\r\n *\r\n * **Note**: Upon executing this command, the selection will be set on the image if previously anchored in the caption element.\r\n *\r\n * **Note**: You can move the selection to the caption right away as it shows up upon executing this command by using\r\n * the `focusCaptionOnShow` option:\r\n *\r\n * ```ts\r\n * editor.execute( 'toggleImageCaption', { focusCaptionOnShow: true } );\r\n * ```\r\n */\r\nexport default class ToggleImageCaptionCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const editor = this.editor;\r\n        const imageCaptionUtils = editor.plugins.get('ImageCaptionUtils');\r\n        const imageUtils = editor.plugins.get('ImageUtils');\r\n        // Only block images can get captions.\r\n        if (!editor.plugins.has(ImageBlockEditing)) {\r\n            this.isEnabled = false;\r\n            this.value = false;\r\n            return;\r\n        }\r\n        const selection = editor.model.document.selection;\r\n        const selectedElement = selection.getSelectedElement();\r\n        if (!selectedElement) {\r\n            const ancestorCaptionElement = imageCaptionUtils.getCaptionFromModelSelection(selection);\r\n            this.isEnabled = !!ancestorCaptionElement;\r\n            this.value = !!ancestorCaptionElement;\r\n            return;\r\n        }\r\n        // Block images support captions by default but the command should also be enabled for inline\r\n        // images because toggling the caption when one is selected should convert it into a block image.\r\n        this.isEnabled = imageUtils.isImage(selectedElement);\r\n        if (!this.isEnabled) {\r\n            this.value = false;\r\n        }\r\n        else {\r\n            this.value = !!imageCaptionUtils.getCaptionFromImageModelElement(selectedElement);\r\n        }\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * ```ts\r\n     * editor.execute( 'toggleImageCaption' );\r\n     * ```\r\n     *\r\n     * @param options Options for the executed command.\r\n     * @param options.focusCaptionOnShow When true and the caption shows up, the selection will be moved into it straight away.\r\n     * @fires execute\r\n     */\r\n    execute(options = {}) {\r\n        const { focusCaptionOnShow } = options;\r\n        this.editor.model.change(writer => {\r\n            if (this.value) {\r\n                this._hideImageCaption(writer);\r\n            }\r\n            else {\r\n                this._showImageCaption(writer, focusCaptionOnShow);\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Shows the caption of the `<imageBlock>` or `<imageInline>`. Also:\r\n     *\r\n     * * it converts `<imageInline>` to `<imageBlock>` to show the caption,\r\n     * * it attempts to restore the caption content from the `ImageCaptionEditing` caption registry,\r\n     * * it moves the selection to the caption right away, it the `focusCaptionOnShow` option was set.\r\n     */\r\n    _showImageCaption(writer, focusCaptionOnShow) {\r\n        const model = this.editor.model;\r\n        const selection = model.document.selection;\r\n        const imageCaptionEditing = this.editor.plugins.get('ImageCaptionEditing');\r\n        const imageUtils = this.editor.plugins.get('ImageUtils');\r\n        let selectedImage = selection.getSelectedElement();\r\n        const savedCaption = imageCaptionEditing._getSavedCaption(selectedImage);\r\n        // Convert imageInline -> image first.\r\n        if (imageUtils.isInlineImage(selectedImage)) {\r\n            this.editor.execute('imageTypeBlock');\r\n            // Executing the command created a new model element. Let's pick it again.\r\n            selectedImage = selection.getSelectedElement();\r\n        }\r\n        // Try restoring the caption from the ImageCaptionEditing plugin storage.\r\n        const newCaptionElement = savedCaption || writer.createElement('caption');\r\n        writer.append(newCaptionElement, selectedImage);\r\n        if (focusCaptionOnShow) {\r\n            writer.setSelection(newCaptionElement, 'in');\r\n        }\r\n    }\r\n    /**\r\n     * Hides the caption of a selected image (or an image caption the selection is anchored to).\r\n     *\r\n     * The content of the caption is stored in the `ImageCaptionEditing` caption registry to make this\r\n     * a reversible action.\r\n     */\r\n    _hideImageCaption(writer) {\r\n        const editor = this.editor;\r\n        const selection = editor.model.document.selection;\r\n        const imageCaptionEditing = editor.plugins.get('ImageCaptionEditing');\r\n        const imageCaptionUtils = editor.plugins.get('ImageCaptionUtils');\r\n        let selectedImage = selection.getSelectedElement();\r\n        let captionElement;\r\n        if (selectedImage) {\r\n            captionElement = imageCaptionUtils.getCaptionFromImageModelElement(selectedImage);\r\n        }\r\n        else {\r\n            captionElement = imageCaptionUtils.getCaptionFromModelSelection(selection);\r\n            selectedImage = captionElement.parent;\r\n        }\r\n        // Store the caption content so it can be restored quickly if the user changes their mind even if they toggle image<->imageInline.\r\n        imageCaptionEditing._saveCaption(selectedImage, captionElement);\r\n        writer.setSelection(selectedImage, 'on');\r\n        writer.remove(captionElement);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport ImageUtils from '../imageutils';\r\n/**\r\n * The image caption utilities plugin.\r\n */\r\nexport default class ImageCaptionUtils extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageCaptionUtils';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ImageUtils];\r\n    }\r\n    /**\r\n     * Returns the caption model element from a given image element. Returns `null` if no caption is found.\r\n     */\r\n    getCaptionFromImageModelElement(imageModelElement) {\r\n        for (const node of imageModelElement.getChildren()) {\r\n            if (!!node && node.is('element', 'caption')) {\r\n                return node;\r\n            }\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Returns the caption model element for a model selection. Returns `null` if the selection has no caption element ancestor.\r\n     */\r\n    getCaptionFromModelSelection(selection) {\r\n        const imageUtils = this.editor.plugins.get('ImageUtils');\r\n        const captionElement = selection.getFirstPosition().findAncestor('caption');\r\n        if (!captionElement) {\r\n            return null;\r\n        }\r\n        if (imageUtils.isBlockImage(captionElement.parent)) {\r\n            return captionElement;\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * {@link module:engine/view/matcher~Matcher} pattern. Checks if a given element is a `<figcaption>` element that is placed\r\n     * inside the image `<figure>` element.\r\n     * @returns Returns the object accepted by {@link module:engine/view/matcher~Matcher} or `null` if the element\r\n     * cannot be matched.\r\n     */\r\n    matchImageCaptionViewElement(element) {\r\n        const imageUtils = this.editor.plugins.get('ImageUtils');\r\n        // Convert only captions for images.\r\n        if (element.name == 'figcaption' && imageUtils.isBlockImageView(element.parent)) {\r\n            return { name: true };\r\n        }\r\n        return null;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imagecaption/imagecaptionediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { Element, enablePlaceholder } from 'ckeditor5/src/engine';\r\nimport { toWidgetEditable } from 'ckeditor5/src/widget';\r\nimport ToggleImageCaptionCommand from './toggleimagecaptioncommand';\r\nimport ImageUtils from '../imageutils';\r\nimport ImageCaptionUtils from './imagecaptionutils';\r\n/**\r\n * The image caption engine plugin. It is responsible for:\r\n *\r\n * * registering converters for the caption element,\r\n * * registering converters for the caption model attribute,\r\n * * registering the {@link module:image/imagecaption/toggleimagecaptioncommand~ToggleImageCaptionCommand `toggleImageCaption`} command.\r\n */\r\nexport default class ImageCaptionEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ImageUtils, ImageCaptionUtils];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageCaptionEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        this._savedCaptionsMap = new WeakMap();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const schema = editor.model.schema;\r\n        // Schema configuration.\r\n        if (!schema.isRegistered('caption')) {\r\n            schema.register('caption', {\r\n                allowIn: 'imageBlock',\r\n                allowContentOf: '$block',\r\n                isLimit: true\r\n            });\r\n        }\r\n        else {\r\n            schema.extend('caption', {\r\n                allowIn: 'imageBlock'\r\n            });\r\n        }\r\n        editor.commands.add('toggleImageCaption', new ToggleImageCaptionCommand(this.editor));\r\n        this._setupConversion();\r\n        this._setupImageTypeCommandsIntegration();\r\n        this._registerCaptionReconversion();\r\n    }\r\n    /**\r\n     * Configures conversion pipelines to support upcasting and downcasting\r\n     * image captions.\r\n     */\r\n    _setupConversion() {\r\n        const editor = this.editor;\r\n        const view = editor.editing.view;\r\n        const imageUtils = editor.plugins.get('ImageUtils');\r\n        const imageCaptionUtils = editor.plugins.get('ImageCaptionUtils');\r\n        const t = editor.t;\r\n        // View -> model converter for the data pipeline.\r\n        editor.conversion.for('upcast').elementToElement({\r\n            view: element => imageCaptionUtils.matchImageCaptionViewElement(element),\r\n            model: 'caption'\r\n        });\r\n        // Model -> view converter for the data pipeline.\r\n        editor.conversion.for('dataDowncast').elementToElement({\r\n            model: 'caption',\r\n            view: (modelElement, { writer }) => {\r\n                if (!imageUtils.isBlockImage(modelElement.parent)) {\r\n                    return null;\r\n                }\r\n                return writer.createContainerElement('figcaption');\r\n            }\r\n        });\r\n        // Model -> view converter for the editing pipeline.\r\n        editor.conversion.for('editingDowncast').elementToElement({\r\n            model: 'caption',\r\n            view: (modelElement, { writer }) => {\r\n                if (!imageUtils.isBlockImage(modelElement.parent)) {\r\n                    return null;\r\n                }\r\n                const figcaptionElement = writer.createEditableElement('figcaption');\r\n                writer.setCustomProperty('imageCaption', true, figcaptionElement);\r\n                enablePlaceholder({\r\n                    view,\r\n                    element: figcaptionElement,\r\n                    text: t('Enter image caption'),\r\n                    keepOnFocus: true\r\n                });\r\n                const imageAlt = modelElement.parent.getAttribute('alt');\r\n                const label = imageAlt ? t('Caption for image: %0', [imageAlt]) : t('Caption for the image');\r\n                return toWidgetEditable(figcaptionElement, writer, { label });\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Integrates with {@link module:image/image/imagetypecommand~ImageTypeCommand image type commands}\r\n     * to make sure the caption is preserved when the type of an image changes so it can be restored\r\n     * in the future if the user decides they want their caption back.\r\n     */\r\n    _setupImageTypeCommandsIntegration() {\r\n        const editor = this.editor;\r\n        const imageUtils = editor.plugins.get('ImageUtils');\r\n        const imageCaptionUtils = editor.plugins.get('ImageCaptionUtils');\r\n        const imageTypeInlineCommand = editor.commands.get('imageTypeInline');\r\n        const imageTypeBlockCommand = editor.commands.get('imageTypeBlock');\r\n        const handleImageTypeChange = evt => {\r\n            // The image type command execution can be unsuccessful.\r\n            if (!evt.return) {\r\n                return;\r\n            }\r\n            const { oldElement, newElement } = evt.return;\r\n            /* istanbul ignore if: paranoid check -- @preserve */\r\n            if (!oldElement) {\r\n                return;\r\n            }\r\n            if (imageUtils.isBlockImage(oldElement)) {\r\n                const oldCaptionElement = imageCaptionUtils.getCaptionFromImageModelElement(oldElement);\r\n                // If the old element was a captioned block image (the caption was visible),\r\n                // simply save it so it can be restored.\r\n                if (oldCaptionElement) {\r\n                    this._saveCaption(newElement, oldCaptionElement);\r\n                    return;\r\n                }\r\n            }\r\n            const savedOldElementCaption = this._getSavedCaption(oldElement);\r\n            // If either:\r\n            //\r\n            // * the block image didn't have a visible caption,\r\n            // * the block image caption was hidden (and already saved),\r\n            // * the inline image was passed\r\n            //\r\n            // just try to \"pass\" the saved caption from the old image to the new image\r\n            // so it can be retrieved in the future if the user wants it back.\r\n            if (savedOldElementCaption) {\r\n                // Note: Since we're writing to a WeakMap, we don't bother with removing the\r\n                // [ oldElement, savedOldElementCaption ] pair from it.\r\n                this._saveCaption(newElement, savedOldElementCaption);\r\n            }\r\n        };\r\n        // Presence of the commands depends on the Image(Inline|Block)Editing plugins loaded in the editor.\r\n        if (imageTypeInlineCommand) {\r\n            this.listenTo(imageTypeInlineCommand, 'execute', handleImageTypeChange, { priority: 'low' });\r\n        }\r\n        if (imageTypeBlockCommand) {\r\n            this.listenTo(imageTypeBlockCommand, 'execute', handleImageTypeChange, { priority: 'low' });\r\n        }\r\n    }\r\n    /**\r\n     * Returns the saved {@link module:engine/model/element~Element#toJSON JSONified} caption\r\n     * of an image model element.\r\n     *\r\n     * See {@link #_saveCaption}.\r\n     *\r\n     * @internal\r\n     * @param imageModelElement The model element the caption should be returned for.\r\n     * @returns The model caption element or `null` if there is none.\r\n     */\r\n    _getSavedCaption(imageModelElement) {\r\n        const jsonObject = this._savedCaptionsMap.get(imageModelElement);\r\n        return jsonObject ? Element.fromJSON(jsonObject) : null;\r\n    }\r\n    /**\r\n     * Saves a {@link module:engine/model/element~Element#toJSON JSONified} caption for\r\n     * an image element to allow restoring it in the future.\r\n     *\r\n     * A caption is saved every time it gets hidden and/or the type of an image changes. The\r\n     * user should be able to restore it on demand.\r\n     *\r\n     * **Note**: The caption cannot be stored in the image model element attribute because,\r\n     * for instance, when the model state propagates to collaborators, the attribute would get\r\n     * lost (mainly because it does not convert to anything when the caption is hidden) and\r\n     * the states of collaborators' models would de-synchronize causing numerous issues.\r\n     *\r\n     * See {@link #_getSavedCaption}.\r\n     *\r\n     * @internal\r\n     * @param imageModelElement The model element the caption is saved for.\r\n     * @param caption The caption model element to be saved.\r\n     */\r\n    _saveCaption(imageModelElement, caption) {\r\n        this._savedCaptionsMap.set(imageModelElement, caption.toJSON());\r\n    }\r\n    /**\r\n     * Reconverts image caption when image alt attribute changes.\r\n     * The change of alt attribute is reflected in caption's aria-label attribute.\r\n     */\r\n    _registerCaptionReconversion() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const imageUtils = editor.plugins.get('ImageUtils');\r\n        const imageCaptionUtils = editor.plugins.get('ImageCaptionUtils');\r\n        model.document.on('change:data', () => {\r\n            const changes = model.document.differ.getChanges();\r\n            for (const change of changes) {\r\n                if (change.attributeKey !== 'alt') {\r\n                    continue;\r\n                }\r\n                const image = change.range.start.nodeAfter;\r\n                if (imageUtils.isBlockImage(image)) {\r\n                    const caption = imageCaptionUtils.getCaptionFromImageModelElement(image);\r\n                    if (!caption) {\r\n                        return;\r\n                    }\r\n                    editor.editing.reconvertItem(caption);\r\n                }\r\n            }\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imagecaption/imagecaptionui\r\n */\r\nimport { Plugin, icons } from 'ckeditor5/src/core';\r\nimport { ButtonView } from 'ckeditor5/src/ui';\r\nimport ImageCaptionUtils from './imagecaptionutils';\r\n/**\r\n * The image caption UI plugin. It introduces the `'toggleImageCaption'` UI button.\r\n */\r\nexport default class ImageCaptionUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ImageCaptionUtils];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageCaptionUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const editingView = editor.editing.view;\r\n        const imageCaptionUtils = editor.plugins.get('ImageCaptionUtils');\r\n        const t = editor.t;\r\n        editor.ui.componentFactory.add('toggleImageCaption', locale => {\r\n            const command = editor.commands.get('toggleImageCaption');\r\n            const view = new ButtonView(locale);\r\n            view.set({\r\n                icon: icons.caption,\r\n                tooltip: true,\r\n                isToggleable: true\r\n            });\r\n            view.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\r\n            view.bind('label').to(command, 'value', value => value ? t('Toggle caption off') : t('Toggle caption on'));\r\n            this.listenTo(view, 'execute', () => {\r\n                editor.execute('toggleImageCaption', { focusCaptionOnShow: true });\r\n                // Scroll to the selection and highlight the caption if the caption showed up.\r\n                const modelCaptionElement = imageCaptionUtils.getCaptionFromModelSelection(editor.model.document.selection);\r\n                if (modelCaptionElement) {\r\n                    const figcaptionElement = editor.editing.mapper.toViewElement(modelCaptionElement);\r\n                    editingView.scrollToTheSelection();\r\n                    editingView.change(writer => {\r\n                        writer.addClass('image__caption_highlighted', figcaptionElement);\r\n                    });\r\n                }\r\n                editor.editing.view.focus();\r\n            });\r\n            return view;\r\n        });\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./imagecaption.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module upload/filereader\r\n */\r\n/* globals window */\r\nimport { ObservableMixin } from '@ckeditor/ckeditor5-utils';\r\n/**\r\n * Wrapper over the native `FileReader`.\r\n */\r\nexport default class FileReader extends ObservableMixin() {\r\n    /**\r\n     * Creates an instance of the FileReader.\r\n     */\r\n    constructor() {\r\n        super();\r\n        const reader = new window.FileReader();\r\n        this._reader = reader;\r\n        this._data = undefined;\r\n        this.set('loaded', 0);\r\n        reader.onprogress = evt => {\r\n            this.loaded = evt.loaded;\r\n        };\r\n    }\r\n    /**\r\n     * Returns error that occurred during file reading.\r\n     */\r\n    get error() {\r\n        return this._reader.error;\r\n    }\r\n    /**\r\n     * Holds the data of an already loaded file. The file must be first loaded\r\n     * by using {@link module:upload/filereader~FileReader#read `read()`}.\r\n     */\r\n    get data() {\r\n        return this._data;\r\n    }\r\n    /**\r\n     * Reads the provided file.\r\n     *\r\n     * @param file Native File object.\r\n     * @returns Returns a promise that will be resolved with file's content.\r\n     * The promise will be rejected in case of an error or when the reading process is aborted.\r\n     */\r\n    read(file) {\r\n        const reader = this._reader;\r\n        this.total = file.size;\r\n        return new Promise((resolve, reject) => {\r\n            reader.onload = () => {\r\n                const result = reader.result;\r\n                this._data = result;\r\n                resolve(result);\r\n            };\r\n            reader.onerror = () => {\r\n                reject('error');\r\n            };\r\n            reader.onabort = () => {\r\n                reject('aborted');\r\n            };\r\n            this._reader.readAsDataURL(file);\r\n        });\r\n    }\r\n    /**\r\n     * Aborts file reader.\r\n     */\r\n    abort() {\r\n        this._reader.abort();\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module upload/filerepository\r\n */\r\nimport { Plugin, PendingActions } from '@ckeditor/ckeditor5-core';\r\nimport { CKEditorError, Collection, ObservableMixin, logWarning, uid } from '@ckeditor/ckeditor5-utils';\r\nimport FileReader from './filereader';\r\n/**\r\n * File repository plugin. A central point for managing file upload.\r\n *\r\n * To use it, first you need an upload adapter. Upload adapter's job is to handle communication with the server\r\n * (sending the file and handling server's response). You can use one of the existing plugins introducing upload adapters\r\n * (e.g. {@link module:easy-image/cloudservicesuploadadapter~CloudServicesUploadAdapter} or\r\n * {@link module:adapter-ckfinder/uploadadapter~CKFinderUploadAdapter}) or write your own one – see\r\n * the {@glink framework/deep-dive/upload-adapter Custom image upload adapter deep-dive} guide.\r\n *\r\n * Then, you can use {@link module:upload/filerepository~FileRepository#createLoader `createLoader()`} and the returned\r\n * {@link module:upload/filerepository~FileLoader} instance to load and upload files.\r\n */\r\nexport default class FileRepository extends Plugin {\r\n    constructor() {\r\n        super(...arguments);\r\n        /**\r\n         * Collection of loaders associated with this repository.\r\n         */\r\n        this.loaders = new Collection();\r\n        /**\r\n         * Loaders mappings used to retrieve loaders references.\r\n         */\r\n        this._loadersMap = new Map();\r\n        /**\r\n         * Reference to a pending action registered in a {@link module:core/pendingactions~PendingActions} plugin\r\n         * while upload is in progress. When there is no upload then value is `null`.\r\n         */\r\n        this._pendingAction = null;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'FileRepository';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [PendingActions];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        // Keeps upload in a sync with pending actions.\r\n        this.loaders.on('change', () => this._updatePendingAction());\r\n        this.set('uploaded', 0);\r\n        this.set('uploadTotal', null);\r\n        this.bind('uploadedPercent').to(this, 'uploaded', this, 'uploadTotal', (uploaded, total) => {\r\n            return total ? (uploaded / total * 100) : 0;\r\n        });\r\n    }\r\n    /**\r\n     * Returns the loader associated with specified file or promise.\r\n     *\r\n     * To get loader by id use `fileRepository.loaders.get( id )`.\r\n     *\r\n     * @param fileOrPromise Native file or promise handle.\r\n     */\r\n    getLoader(fileOrPromise) {\r\n        return this._loadersMap.get(fileOrPromise) || null;\r\n    }\r\n    /**\r\n     * Creates a loader instance for the given file.\r\n     *\r\n     * Requires {@link #createUploadAdapter} factory to be defined.\r\n     *\r\n     * @param fileOrPromise Native File object or native Promise object which resolves to a File.\r\n     */\r\n    createLoader(fileOrPromise) {\r\n        if (!this.createUploadAdapter) {\r\n            /**\r\n             * You need to enable an upload adapter in order to be able to upload files.\r\n             *\r\n             * This warning shows up when {@link module:upload/filerepository~FileRepository} is being used\r\n             * without {@link module:upload/filerepository~FileRepository#createUploadAdapter defining an upload adapter}.\r\n             *\r\n             * **If you see this warning when using one of the {@glink installation/getting-started/predefined-builds\r\n             * CKEditor 5 Builds}**\r\n             * it means that you did not configure any of the upload adapters available by default in those builds.\r\n             *\r\n             * See the {@glink features/images/image-upload/image-upload comprehensive \"Image upload overview\"} to learn which upload\r\n             * adapters are available in the builds and how to configure them.\r\n             *\r\n             * **If you see this warning when using a custom build** there is a chance that you enabled\r\n             * a feature like {@link module:image/imageupload~ImageUpload},\r\n             * or {@link module:image/imageupload/imageuploadui~ImageUploadUI} but you did not enable any upload adapter.\r\n             * You can choose one of the existing upload adapters listed in the\r\n             * {@glink features/images/image-upload/image-upload \"Image upload overview\"}.\r\n             *\r\n             * You can also implement your {@glink framework/deep-dive/upload-adapter own image upload adapter}.\r\n             *\r\n             * @error filerepository-no-upload-adapter\r\n             */\r\n            logWarning('filerepository-no-upload-adapter');\r\n            return null;\r\n        }\r\n        const loader = new FileLoader(Promise.resolve(fileOrPromise), this.createUploadAdapter);\r\n        this.loaders.add(loader);\r\n        this._loadersMap.set(fileOrPromise, loader);\r\n        // Store also file => loader mapping so loader can be retrieved by file instance returned upon Promise resolution.\r\n        if (fileOrPromise instanceof Promise) {\r\n            loader.file\r\n                .then(file => {\r\n                this._loadersMap.set(file, loader);\r\n            })\r\n                // Every then() must have a catch().\r\n                // File loader state (and rejections) are handled in read() and upload().\r\n                // Also, see the \"does not swallow the file promise rejection\" test.\r\n                .catch(() => { });\r\n        }\r\n        loader.on('change:uploaded', () => {\r\n            let aggregatedUploaded = 0;\r\n            for (const loader of this.loaders) {\r\n                aggregatedUploaded += loader.uploaded;\r\n            }\r\n            this.uploaded = aggregatedUploaded;\r\n        });\r\n        loader.on('change:uploadTotal', () => {\r\n            let aggregatedTotal = 0;\r\n            for (const loader of this.loaders) {\r\n                if (loader.uploadTotal) {\r\n                    aggregatedTotal += loader.uploadTotal;\r\n                }\r\n            }\r\n            this.uploadTotal = aggregatedTotal;\r\n        });\r\n        return loader;\r\n    }\r\n    /**\r\n     * Destroys the given loader.\r\n     *\r\n     * @param fileOrPromiseOrLoader File or Promise associated with that loader or loader itself.\r\n     */\r\n    destroyLoader(fileOrPromiseOrLoader) {\r\n        const loader = fileOrPromiseOrLoader instanceof FileLoader ? fileOrPromiseOrLoader : this.getLoader(fileOrPromiseOrLoader);\r\n        loader._destroy();\r\n        this.loaders.remove(loader);\r\n        this._loadersMap.forEach((value, key) => {\r\n            if (value === loader) {\r\n                this._loadersMap.delete(key);\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Registers or deregisters pending action bound with upload progress.\r\n     */\r\n    _updatePendingAction() {\r\n        const pendingActions = this.editor.plugins.get(PendingActions);\r\n        if (this.loaders.length) {\r\n            if (!this._pendingAction) {\r\n                const t = this.editor.t;\r\n                const getMessage = (value) => `${t('Upload in progress')} ${parseInt(value)}%.`;\r\n                this._pendingAction = pendingActions.add(getMessage(this.uploadedPercent));\r\n                this._pendingAction.bind('message').to(this, 'uploadedPercent', getMessage);\r\n            }\r\n        }\r\n        else {\r\n            pendingActions.remove(this._pendingAction);\r\n            this._pendingAction = null;\r\n        }\r\n    }\r\n}\r\n/**\r\n * File loader class.\r\n *\r\n * It is used to control the process of reading the file and uploading it using the specified upload adapter.\r\n */\r\nclass FileLoader extends ObservableMixin() {\r\n    /**\r\n     * Creates a new instance of `FileLoader`.\r\n     *\r\n     * @param filePromise A promise which resolves to a file instance.\r\n     * @param uploadAdapterCreator The function which returns {@link module:upload/filerepository~UploadAdapter} instance.\r\n     */\r\n    constructor(filePromise, uploadAdapterCreator) {\r\n        super();\r\n        this.id = uid();\r\n        this._filePromiseWrapper = this._createFilePromiseWrapper(filePromise);\r\n        this._adapter = uploadAdapterCreator(this);\r\n        this._reader = new FileReader();\r\n        this.set('status', 'idle');\r\n        this.set('uploaded', 0);\r\n        this.set('uploadTotal', null);\r\n        this.bind('uploadedPercent').to(this, 'uploaded', this, 'uploadTotal', (uploaded, total) => {\r\n            return total ? (uploaded / total * 100) : 0;\r\n        });\r\n        this.set('uploadResponse', null);\r\n    }\r\n    /**\r\n     * A `Promise` which resolves to a `File` instance associated with this file loader.\r\n     */\r\n    get file() {\r\n        if (!this._filePromiseWrapper) {\r\n            // Loader was destroyed, return promise which resolves to null.\r\n            return Promise.resolve(null);\r\n        }\r\n        else {\r\n            // The `this._filePromiseWrapper.promise` is chained and not simply returned to handle a case when:\r\n            //\r\n            //\t\t* The `loader.file.then( ... )` is called by external code (returned promise is pending).\r\n            //\t\t* Then `loader._destroy()` is called (call is synchronous) which destroys the `loader`.\r\n            //\t\t* Promise returned by the first `loader.file.then( ... )` call is resolved.\r\n            //\r\n            // Returning `this._filePromiseWrapper.promise` will still resolve to a `File` instance so there\r\n            // is an additional check needed in the chain to see if `loader` was destroyed in the meantime.\r\n            return this._filePromiseWrapper.promise.then(file => this._filePromiseWrapper ? file : null);\r\n        }\r\n    }\r\n    /**\r\n     * Returns the file data. To read its data, you need for first load the file\r\n     * by using the {@link module:upload/filerepository~FileLoader#read `read()`} method.\r\n     */\r\n    get data() {\r\n        return this._reader.data;\r\n    }\r\n    /**\r\n     * Reads file using {@link module:upload/filereader~FileReader}.\r\n     *\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `filerepository-read-wrong-status` when status\r\n     * is different than `idle`.\r\n     *\r\n     * Example usage:\r\n     *\r\n     * ```ts\r\n     * fileLoader.read()\r\n     * \t.then( data => { ... } )\r\n     * \t.catch( err => {\r\n     * \t\tif ( err === 'aborted' ) {\r\n     * \t\t\tconsole.log( 'Reading aborted.' );\r\n     * \t\t} else {\r\n     * \t\t\tconsole.log( 'Reading error.', err );\r\n     * \t\t}\r\n     * \t} );\r\n     * ```\r\n     *\r\n     * @returns Returns promise that will be resolved with read data. Promise will be rejected if error\r\n     * occurs or if read process is aborted.\r\n     */\r\n    read() {\r\n        if (this.status != 'idle') {\r\n            /**\r\n             * You cannot call read if the status is different than idle.\r\n             *\r\n             * @error filerepository-read-wrong-status\r\n             */\r\n            throw new CKEditorError('filerepository-read-wrong-status', this);\r\n        }\r\n        this.status = 'reading';\r\n        return this.file\r\n            .then(file => this._reader.read(file))\r\n            .then(data => {\r\n            // Edge case: reader was aborted after file was read - double check for proper status.\r\n            // It can happen when image was deleted during its upload.\r\n            if (this.status !== 'reading') {\r\n                throw this.status;\r\n            }\r\n            this.status = 'idle';\r\n            return data;\r\n        })\r\n            .catch(err => {\r\n            if (err === 'aborted') {\r\n                this.status = 'aborted';\r\n                throw 'aborted';\r\n            }\r\n            this.status = 'error';\r\n            throw this._reader.error ? this._reader.error : err;\r\n        });\r\n    }\r\n    /**\r\n     * Reads file using the provided {@link module:upload/filerepository~UploadAdapter}.\r\n     *\r\n     * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `filerepository-upload-wrong-status` when status\r\n     * is different than `idle`.\r\n     * Example usage:\r\n     *\r\n     * ```ts\r\n     * fileLoader.upload()\r\n     * \t.then( data => { ... } )\r\n     * \t.catch( e => {\r\n     * \t\tif ( e === 'aborted' ) {\r\n     * \t\t\tconsole.log( 'Uploading aborted.' );\r\n     * \t\t} else {\r\n     * \t\t\tconsole.log( 'Uploading error.', e );\r\n     * \t\t}\r\n     * \t} );\r\n     * ```\r\n     *\r\n     * @returns Returns promise that will be resolved with response data. Promise will be rejected if error\r\n     * occurs or if read process is aborted.\r\n     */\r\n    upload() {\r\n        if (this.status != 'idle') {\r\n            /**\r\n             * You cannot call upload if the status is different than idle.\r\n             *\r\n             * @error filerepository-upload-wrong-status\r\n             */\r\n            throw new CKEditorError('filerepository-upload-wrong-status', this);\r\n        }\r\n        this.status = 'uploading';\r\n        return this.file\r\n            .then(() => this._adapter.upload())\r\n            .then(data => {\r\n            this.uploadResponse = data;\r\n            this.status = 'idle';\r\n            return data;\r\n        })\r\n            .catch(err => {\r\n            if (this.status === 'aborted') {\r\n                throw 'aborted';\r\n            }\r\n            this.status = 'error';\r\n            throw err;\r\n        });\r\n    }\r\n    /**\r\n     * Aborts loading process.\r\n     */\r\n    abort() {\r\n        const status = this.status;\r\n        this.status = 'aborted';\r\n        if (!this._filePromiseWrapper.isFulfilled) {\r\n            // Edge case: file loader is aborted before read() is called\r\n            // so it might happen that no one handled the rejection of this promise.\r\n            // See https://github.com/ckeditor/ckeditor5-upload/pull/100\r\n            this._filePromiseWrapper.promise.catch(() => { });\r\n            this._filePromiseWrapper.rejecter('aborted');\r\n        }\r\n        else if (status == 'reading') {\r\n            this._reader.abort();\r\n        }\r\n        else if (status == 'uploading' && this._adapter.abort) {\r\n            this._adapter.abort();\r\n        }\r\n        this._destroy();\r\n    }\r\n    /**\r\n     * Performs cleanup.\r\n     *\r\n     * @internal\r\n     */\r\n    _destroy() {\r\n        this._filePromiseWrapper = undefined;\r\n        this._reader = undefined;\r\n        this._adapter = undefined;\r\n        this.uploadResponse = undefined;\r\n    }\r\n    /**\r\n     * Wraps a given file promise into another promise giving additional\r\n     * control (resolving, rejecting, checking if fulfilled) over it.\r\n     *\r\n     * @param filePromise The initial file promise to be wrapped.\r\n     */\r\n    _createFilePromiseWrapper(filePromise) {\r\n        const wrapper = {};\r\n        wrapper.promise = new Promise((resolve, reject) => {\r\n            wrapper.rejecter = reject;\r\n            wrapper.isFulfilled = false;\r\n            filePromise\r\n                .then(file => {\r\n                wrapper.isFulfilled = true;\r\n                resolve(file);\r\n            })\r\n                .catch(err => {\r\n                wrapper.isFulfilled = true;\r\n                reject(err);\r\n            });\r\n        });\r\n        return wrapper;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module upload/ui/filedialogbuttonview\r\n */\r\nimport { ButtonView, View } from '@ckeditor/ckeditor5-ui';\r\n/**\r\n * The file dialog button view.\r\n *\r\n * This component provides a button that opens the native file selection dialog.\r\n * It can be used to implement the UI of a file upload feature.\r\n *\r\n * ```ts\r\n * const view = new FileDialogButtonView( locale );\r\n *\r\n * view.set( {\r\n * \tacceptedType: 'image/*',\r\n * \tallowMultipleFiles: true\r\n * } );\r\n *\r\n * view.buttonView.set( {\r\n * \tlabel: t( 'Insert image' ),\r\n * \ticon: imageIcon,\r\n * \ttooltip: true\r\n * } );\r\n *\r\n * view.on( 'done', ( evt, files ) => {\r\n * \tfor ( const file of Array.from( files ) ) {\r\n * \t\tconsole.log( 'Selected file', file );\r\n * \t}\r\n * } );\r\n * ```\r\n */\r\nexport default class FileDialogButtonView extends View {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        this.buttonView = new ButtonView(locale);\r\n        this._fileInputView = new FileInputView(locale);\r\n        this._fileInputView.bind('acceptedType').to(this);\r\n        this._fileInputView.bind('allowMultipleFiles').to(this);\r\n        this._fileInputView.delegate('done').to(this);\r\n        this.setTemplate({\r\n            tag: 'span',\r\n            attributes: {\r\n                class: 'ck-file-dialog-button'\r\n            },\r\n            children: [\r\n                this.buttonView,\r\n                this._fileInputView\r\n            ]\r\n        });\r\n        this.buttonView.on('execute', () => {\r\n            this._fileInputView.open();\r\n        });\r\n    }\r\n    /**\r\n     * Focuses the {@link #buttonView}.\r\n     */\r\n    focus() {\r\n        this.buttonView.focus();\r\n    }\r\n}\r\n/**\r\n * The hidden file input view class.\r\n */\r\nclass FileInputView extends View {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        this.set('acceptedType', undefined);\r\n        this.set('allowMultipleFiles', false);\r\n        const bind = this.bindTemplate;\r\n        this.setTemplate({\r\n            tag: 'input',\r\n            attributes: {\r\n                class: [\r\n                    'ck-hidden'\r\n                ],\r\n                type: 'file',\r\n                tabindex: '-1',\r\n                accept: bind.to('acceptedType'),\r\n                multiple: bind.to('allowMultipleFiles')\r\n            },\r\n            on: {\r\n                // Removing from code coverage since we cannot programmatically set input element files.\r\n                change: bind.to(/* istanbul ignore next -- @preserve */ () => {\r\n                    if (this.element && this.element.files && this.element.files.length) {\r\n                        this.fire('done', this.element.files);\r\n                    }\r\n                    this.element.value = '';\r\n                })\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Opens file dialog.\r\n     */\r\n    open() {\r\n        this.element.click();\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { global } from 'ckeditor5/src/utils';\r\n/**\r\n * Creates a regular expression used to test for image files.\r\n *\r\n * ```ts\r\n * const imageType = createImageTypeRegExp( [ 'png', 'jpeg', 'svg+xml', 'vnd.microsoft.icon' ] );\r\n *\r\n * console.log( 'is supported image', imageType.test( file.type ) );\r\n * ```\r\n */\r\nexport function createImageTypeRegExp(types) {\r\n    // Sanitize the MIME type name which may include: \"+\", \"-\" or \".\".\r\n    const regExpSafeNames = types.map(type => type.replace('+', '\\\\+'));\r\n    return new RegExp(`^image\\\\/(${regExpSafeNames.join('|')})$`);\r\n}\r\n/**\r\n * Creates a promise that fetches the image local source (Base64 or blob) and resolves with a `File` object.\r\n *\r\n * @param image Image whose source to fetch.\r\n * @returns A promise which resolves when an image source is fetched and converted to a `File` instance.\r\n * It resolves with a `File` object. If there were any errors during file processing, the promise will be rejected.\r\n */\r\nexport function fetchLocalImage(image) {\r\n    return new Promise((resolve, reject) => {\r\n        const imageSrc = image.getAttribute('src');\r\n        // Fetch works asynchronously and so does not block browser UI when processing data.\r\n        fetch(imageSrc)\r\n            .then(resource => resource.blob())\r\n            .then(blob => {\r\n            const mimeType = getImageMimeType(blob, imageSrc);\r\n            const ext = mimeType.replace('image/', '');\r\n            const filename = `image.${ext}`;\r\n            const file = new File([blob], filename, { type: mimeType });\r\n            resolve(file);\r\n        })\r\n            .catch(err => {\r\n            // Fetch fails only, if it can't make a request due to a network failure or if anything prevented the request\r\n            // from completing, i.e. the Content Security Policy rules. It is not possible to detect the exact cause of failure,\r\n            // so we are just trying the fallback solution, if general TypeError is thrown.\r\n            return err && err.name === 'TypeError' ?\r\n                convertLocalImageOnCanvas(imageSrc).then(resolve).catch(reject) :\r\n                reject(err);\r\n        });\r\n    });\r\n}\r\n/**\r\n * Checks whether a given node is an image element with a local source (Base64 or blob).\r\n *\r\n * @param node The node to check.\r\n */\r\nexport function isLocalImage(imageUtils, node) {\r\n    if (!imageUtils.isInlineImageView(node) || !node.getAttribute('src')) {\r\n        return false;\r\n    }\r\n    return !!node.getAttribute('src').match(/^data:image\\/\\w+;base64,/g) ||\r\n        !!node.getAttribute('src').match(/^blob:/g);\r\n}\r\n/**\r\n * Extracts an image type based on its blob representation or its source.\r\n * @param blob Image blob representation.\r\n * @param src Image `src` attribute value.\r\n */\r\nfunction getImageMimeType(blob, src) {\r\n    if (blob.type) {\r\n        return blob.type;\r\n    }\r\n    else if (src.match(/data:(image\\/\\w+);base64/)) {\r\n        return src.match(/data:(image\\/\\w+);base64/)[1].toLowerCase();\r\n    }\r\n    else {\r\n        // Fallback to 'jpeg' as common extension.\r\n        return 'image/jpeg';\r\n    }\r\n}\r\n/**\r\n * Creates a promise that converts the image local source (Base64 or blob) to a blob using canvas and resolves\r\n * with a `File` object.\r\n * @param imageSrc Image `src` attribute value.\r\n * @returns A promise which resolves when an image source is converted to a `File` instance.\r\n * It resolves with a `File` object. If there were any errors during file processing, the promise will be rejected.\r\n */\r\nfunction convertLocalImageOnCanvas(imageSrc) {\r\n    return getBlobFromCanvas(imageSrc).then(blob => {\r\n        const mimeType = getImageMimeType(blob, imageSrc);\r\n        const ext = mimeType.replace('image/', '');\r\n        const filename = `image.${ext}`;\r\n        return new File([blob], filename, { type: mimeType });\r\n    });\r\n}\r\n/**\r\n * Creates a promise that resolves with a `Blob` object converted from the image source (Base64 or blob).\r\n * @param imageSrc Image `src` attribute value.\r\n */\r\nfunction getBlobFromCanvas(imageSrc) {\r\n    return new Promise((resolve, reject) => {\r\n        const image = global.document.createElement('img');\r\n        image.addEventListener('load', () => {\r\n            const canvas = global.document.createElement('canvas');\r\n            canvas.width = image.width;\r\n            canvas.height = image.height;\r\n            const ctx = canvas.getContext('2d');\r\n            ctx.drawImage(image, 0, 0);\r\n            canvas.toBlob(blob => blob ? resolve(blob) : reject());\r\n        });\r\n        image.addEventListener('error', () => reject());\r\n        image.src = imageSrc;\r\n    });\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Plugin, icons } from 'ckeditor5/src/core';\r\nimport { FileDialogButtonView } from 'ckeditor5/src/upload';\r\nimport { createImageTypeRegExp } from './utils';\r\n/**\r\n * The image upload button plugin.\r\n *\r\n * For a detailed overview, check the {@glink features/images/image-upload/image-upload Image upload feature} documentation.\r\n *\r\n * Adds the `'uploadImage'` button to the {@link module:ui/componentfactory~ComponentFactory UI component factory}\r\n * and also the `imageUpload` button as an alias for backward compatibility.\r\n */\r\nexport default class ImageUploadUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageUploadUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        const componentCreator = (locale) => {\r\n            const view = new FileDialogButtonView(locale);\r\n            const command = editor.commands.get('uploadImage');\r\n            const imageTypes = editor.config.get('image.upload.types');\r\n            const imageTypesRegExp = createImageTypeRegExp(imageTypes);\r\n            view.set({\r\n                acceptedType: imageTypes.map(type => `image/${type}`).join(','),\r\n                allowMultipleFiles: true\r\n            });\r\n            view.buttonView.set({\r\n                label: t('Insert image'),\r\n                icon: icons.image,\r\n                tooltip: true\r\n            });\r\n            view.buttonView.bind('isEnabled').to(command);\r\n            view.on('done', (evt, files) => {\r\n                const imagesToUpload = Array.from(files).filter(file => imageTypesRegExp.test(file.type));\r\n                if (imagesToUpload.length) {\r\n                    editor.execute('uploadImage', { file: imagesToUpload });\r\n                    editor.editing.view.focus();\r\n                }\r\n            });\r\n            return view;\r\n        };\r\n        // Setup `uploadImage` button and add `imageUpload` button as an alias for backward compatibility.\r\n        editor.ui.componentFactory.add('uploadImage', componentCreator);\r\n        editor.ui.componentFactory.add('imageUpload', componentCreator);\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./imageuploadprogress.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./imageuploadicon.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./imageuploadloader.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imageupload/imageuploadprogress\r\n */\r\n/* globals setTimeout */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { FileRepository } from 'ckeditor5/src/upload';\r\nimport '../../theme/imageuploadprogress.css';\r\nimport '../../theme/imageuploadicon.css';\r\nimport '../../theme/imageuploadloader.css';\r\n/**\r\n * The image upload progress plugin.\r\n * It shows a placeholder when the image is read from the disk and a progress bar while the image is uploading.\r\n */\r\nexport default class ImageUploadProgress extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageUploadProgress';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        /**\r\n         * This method is called each time the image `uploadStatus` attribute is changed.\r\n         *\r\n         * @param evt An object containing information about the fired event.\r\n         * @param data Additional information about the change.\r\n         */\r\n        this.uploadStatusChange = (evt, data, conversionApi) => {\r\n            const editor = this.editor;\r\n            const modelImage = data.item;\r\n            const uploadId = modelImage.getAttribute('uploadId');\r\n            if (!conversionApi.consumable.consume(data.item, evt.name)) {\r\n                return;\r\n            }\r\n            const imageUtils = editor.plugins.get('ImageUtils');\r\n            const fileRepository = editor.plugins.get(FileRepository);\r\n            const status = uploadId ? data.attributeNewValue : null;\r\n            const placeholder = this.placeholder;\r\n            const viewFigure = editor.editing.mapper.toViewElement(modelImage);\r\n            const viewWriter = conversionApi.writer;\r\n            if (status == 'reading') {\r\n                // Start \"appearing\" effect and show placeholder with infinite progress bar on the top\r\n                // while image is read from disk.\r\n                _startAppearEffect(viewFigure, viewWriter);\r\n                _showPlaceholder(imageUtils, placeholder, viewFigure, viewWriter);\r\n                return;\r\n            }\r\n            // Show progress bar on the top of the image when image is uploading.\r\n            if (status == 'uploading') {\r\n                const loader = fileRepository.loaders.get(uploadId);\r\n                // Start appear effect if needed - see https://github.com/ckeditor/ckeditor5-image/issues/191.\r\n                _startAppearEffect(viewFigure, viewWriter);\r\n                if (!loader) {\r\n                    // There is no loader associated with uploadId - this means that image came from external changes.\r\n                    // In such cases we still want to show the placeholder until image is fully uploaded.\r\n                    // Show placeholder if needed - see https://github.com/ckeditor/ckeditor5-image/issues/191.\r\n                    _showPlaceholder(imageUtils, placeholder, viewFigure, viewWriter);\r\n                }\r\n                else {\r\n                    // Hide placeholder and initialize progress bar showing upload progress.\r\n                    _hidePlaceholder(viewFigure, viewWriter);\r\n                    _showProgressBar(viewFigure, viewWriter, loader, editor.editing.view);\r\n                    _displayLocalImage(imageUtils, viewFigure, viewWriter, loader);\r\n                }\r\n                return;\r\n            }\r\n            if (status == 'complete' && fileRepository.loaders.get(uploadId)) {\r\n                _showCompleteIcon(viewFigure, viewWriter, editor.editing.view);\r\n            }\r\n            // Clean up.\r\n            _hideProgressBar(viewFigure, viewWriter);\r\n            _hidePlaceholder(viewFigure, viewWriter);\r\n            _stopAppearEffect(viewFigure, viewWriter);\r\n        };\r\n        this.placeholder = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        // Upload status change - update image's view according to that status.\r\n        if (editor.plugins.has('ImageBlockEditing')) {\r\n            editor.editing.downcastDispatcher.on('attribute:uploadStatus:imageBlock', this.uploadStatusChange);\r\n        }\r\n        if (editor.plugins.has('ImageInlineEditing')) {\r\n            editor.editing.downcastDispatcher.on('attribute:uploadStatus:imageInline', this.uploadStatusChange);\r\n        }\r\n    }\r\n}\r\n/**\r\n * Adds ck-appear class to the image figure if one is not already applied.\r\n */\r\nfunction _startAppearEffect(viewFigure, writer) {\r\n    if (!viewFigure.hasClass('ck-appear')) {\r\n        writer.addClass('ck-appear', viewFigure);\r\n    }\r\n}\r\n/**\r\n * Removes ck-appear class to the image figure if one is not already removed.\r\n */\r\nfunction _stopAppearEffect(viewFigure, writer) {\r\n    writer.removeClass('ck-appear', viewFigure);\r\n}\r\n/**\r\n * Shows placeholder together with infinite progress bar on given image figure.\r\n */\r\nfunction _showPlaceholder(imageUtils, placeholder, viewFigure, writer) {\r\n    if (!viewFigure.hasClass('ck-image-upload-placeholder')) {\r\n        writer.addClass('ck-image-upload-placeholder', viewFigure);\r\n    }\r\n    const viewImg = imageUtils.findViewImgElement(viewFigure);\r\n    if (viewImg.getAttribute('src') !== placeholder) {\r\n        writer.setAttribute('src', placeholder, viewImg);\r\n    }\r\n    if (!_getUIElement(viewFigure, 'placeholder')) {\r\n        writer.insert(writer.createPositionAfter(viewImg), _createPlaceholder(writer));\r\n    }\r\n}\r\n/**\r\n * Removes placeholder together with infinite progress bar on given image figure.\r\n */\r\nfunction _hidePlaceholder(viewFigure, writer) {\r\n    if (viewFigure.hasClass('ck-image-upload-placeholder')) {\r\n        writer.removeClass('ck-image-upload-placeholder', viewFigure);\r\n    }\r\n    _removeUIElement(viewFigure, writer, 'placeholder');\r\n}\r\n/**\r\n * Shows progress bar displaying upload progress.\r\n * Attaches it to the file loader to update when upload percentace is changed.\r\n */\r\nfunction _showProgressBar(viewFigure, writer, loader, view) {\r\n    const progressBar = _createProgressBar(writer);\r\n    writer.insert(writer.createPositionAt(viewFigure, 'end'), progressBar);\r\n    // Update progress bar width when uploadedPercent is changed.\r\n    loader.on('change:uploadedPercent', (evt, name, value) => {\r\n        view.change(writer => {\r\n            writer.setStyle('width', value + '%', progressBar);\r\n        });\r\n    });\r\n}\r\n/**\r\n * Hides upload progress bar.\r\n */\r\nfunction _hideProgressBar(viewFigure, writer) {\r\n    _removeUIElement(viewFigure, writer, 'progressBar');\r\n}\r\n/**\r\n * Shows complete icon and hides after a certain amount of time.\r\n */\r\nfunction _showCompleteIcon(viewFigure, writer, view) {\r\n    const completeIcon = writer.createUIElement('div', { class: 'ck-image-upload-complete-icon' });\r\n    writer.insert(writer.createPositionAt(viewFigure, 'end'), completeIcon);\r\n    setTimeout(() => {\r\n        view.change(writer => writer.remove(writer.createRangeOn(completeIcon)));\r\n    }, 3000);\r\n}\r\n/**\r\n * Create progress bar element using {@link module:engine/view/uielement~UIElement}.\r\n */\r\nfunction _createProgressBar(writer) {\r\n    const progressBar = writer.createUIElement('div', { class: 'ck-progress-bar' });\r\n    writer.setCustomProperty('progressBar', true, progressBar);\r\n    return progressBar;\r\n}\r\n/**\r\n * Create placeholder element using {@link module:engine/view/uielement~UIElement}.\r\n */\r\nfunction _createPlaceholder(writer) {\r\n    const placeholder = writer.createUIElement('div', { class: 'ck-upload-placeholder-loader' });\r\n    writer.setCustomProperty('placeholder', true, placeholder);\r\n    return placeholder;\r\n}\r\n/**\r\n * Returns {@link module:engine/view/uielement~UIElement} of given unique property from image figure element.\r\n * Returns `undefined` if element is not found.\r\n */\r\nfunction _getUIElement(imageFigure, uniqueProperty) {\r\n    for (const child of imageFigure.getChildren()) {\r\n        if (child.getCustomProperty(uniqueProperty)) {\r\n            return child;\r\n        }\r\n    }\r\n}\r\n/**\r\n * Removes {@link module:engine/view/uielement~UIElement} of given unique property from image figure element.\r\n */\r\nfunction _removeUIElement(viewFigure, writer, uniqueProperty) {\r\n    const element = _getUIElement(viewFigure, uniqueProperty);\r\n    if (element) {\r\n        writer.remove(writer.createRangeOn(element));\r\n    }\r\n}\r\n/**\r\n * Displays local data from file loader.\r\n */\r\nfunction _displayLocalImage(imageUtils, viewFigure, writer, loader) {\r\n    if (loader.data) {\r\n        const viewImg = imageUtils.findViewImgElement(viewFigure);\r\n        writer.setAttribute('src', loader.data, viewImg);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { FileRepository } from 'ckeditor5/src/upload';\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { toArray } from 'ckeditor5/src/utils';\r\n/**\r\n * @module image/imageupload/uploadimagecommand\r\n */\r\n/**\r\n * The upload image command.\r\n *\r\n * The command is registered by the {@link module:image/imageupload/imageuploadediting~ImageUploadEditing} plugin as `uploadImage`\r\n * and it is also available via aliased `imageUpload` name.\r\n *\r\n * In order to upload an image at the current selection position\r\n * (according to the {@link module:widget/utils~findOptimalInsertionRange} algorithm),\r\n * execute the command and pass the native image file instance:\r\n *\r\n * ```ts\r\n * this.listenTo( editor.editing.view.document, 'clipboardInput', ( evt, data ) => {\r\n * \t// Assuming that only images were pasted:\r\n * \tconst images = Array.from( data.dataTransfer.files );\r\n *\r\n * \t// Upload the first image:\r\n * \teditor.execute( 'uploadImage', { file: images[ 0 ] } );\r\n * } );\r\n * ```\r\n *\r\n * It is also possible to insert multiple images at once:\r\n *\r\n * ```ts\r\n * editor.execute( 'uploadImage', {\r\n * \tfile: [\r\n * \t\tfile1,\r\n * \t\tfile2\r\n * \t]\r\n * } );\r\n * ```\r\n */\r\nexport default class UploadImageCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const editor = this.editor;\r\n        const imageUtils = editor.plugins.get('ImageUtils');\r\n        const selectedElement = editor.model.document.selection.getSelectedElement();\r\n        // TODO: This needs refactoring.\r\n        this.isEnabled = imageUtils.isImageAllowed() || imageUtils.isImage(selectedElement);\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * @fires execute\r\n     * @param options Options for the executed command.\r\n     * @param options.file The image file or an array of image files to upload.\r\n     */\r\n    execute(options) {\r\n        const files = toArray(options.file);\r\n        const selection = this.editor.model.document.selection;\r\n        const imageUtils = this.editor.plugins.get('ImageUtils');\r\n        // In case of multiple files, each file (starting from the 2nd) will be inserted at a position that\r\n        // follows the previous one. That will move the selection and, to stay on the safe side and make sure\r\n        // all images inherit the same selection attributes, they are collected beforehand.\r\n        //\r\n        // Applying these attributes ensures, for instance, that inserting an (inline) image into a link does\r\n        // not split that link but preserves its continuity.\r\n        //\r\n        // Note: Selection attributes that do not make sense for images will be filtered out by insertImage() anyway.\r\n        const selectionAttributes = Object.fromEntries(selection.getAttributes());\r\n        files.forEach((file, index) => {\r\n            const selectedElement = selection.getSelectedElement();\r\n            // Inserting of an inline image replace the selected element and make a selection on the inserted image.\r\n            // Therefore inserting multiple inline images requires creating position after each element.\r\n            if (index && selectedElement && imageUtils.isImage(selectedElement)) {\r\n                const position = this.editor.model.createPositionAfter(selectedElement);\r\n                this._uploadImage(file, selectionAttributes, position);\r\n            }\r\n            else {\r\n                this._uploadImage(file, selectionAttributes);\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Handles uploading single file.\r\n     */\r\n    _uploadImage(file, attributes, position) {\r\n        const editor = this.editor;\r\n        const fileRepository = editor.plugins.get(FileRepository);\r\n        const loader = fileRepository.createLoader(file);\r\n        const imageUtils = editor.plugins.get('ImageUtils');\r\n        // Do not throw when upload adapter is not set. FileRepository will log an error anyway.\r\n        if (!loader) {\r\n            return;\r\n        }\r\n        imageUtils.insertImage({ ...attributes, uploadId: loader.id }, position);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imageupload/imageuploadediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { UpcastWriter } from 'ckeditor5/src/engine';\r\nimport { Notification } from 'ckeditor5/src/ui';\r\nimport { ClipboardPipeline } from 'ckeditor5/src/clipboard';\r\nimport { FileRepository } from 'ckeditor5/src/upload';\r\nimport { env } from 'ckeditor5/src/utils';\r\nimport ImageUtils from '../imageutils';\r\nimport UploadImageCommand from './uploadimagecommand';\r\nimport { fetchLocalImage, isLocalImage } from '../../src/imageupload/utils';\r\nimport { createImageTypeRegExp } from './utils';\r\n/**\r\n * The editing part of the image upload feature. It registers the `'uploadImage'` command\r\n * and the `imageUpload` command as an aliased name.\r\n *\r\n * When an image is uploaded, it fires the {@link ~ImageUploadEditing#event:uploadComplete `uploadComplete`} event\r\n * that allows adding custom attributes to the {@link module:engine/model/element~Element image element}.\r\n */\r\nexport default class ImageUploadEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [FileRepository, Notification, ClipboardPipeline, ImageUtils];\r\n    }\r\n    static get pluginName() {\r\n        return 'ImageUploadEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        editor.config.define('image', {\r\n            upload: {\r\n                types: ['jpeg', 'png', 'gif', 'bmp', 'webp', 'tiff']\r\n            }\r\n        });\r\n        this._uploadImageElements = new Map();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const doc = editor.model.document;\r\n        const conversion = editor.conversion;\r\n        const fileRepository = editor.plugins.get(FileRepository);\r\n        const imageUtils = editor.plugins.get('ImageUtils');\r\n        const clipboardPipeline = editor.plugins.get('ClipboardPipeline');\r\n        const imageTypes = createImageTypeRegExp(editor.config.get('image.upload.types'));\r\n        const uploadImageCommand = new UploadImageCommand(editor);\r\n        // Register `uploadImage` command and add `imageUpload` command as an alias for backward compatibility.\r\n        editor.commands.add('uploadImage', uploadImageCommand);\r\n        editor.commands.add('imageUpload', uploadImageCommand);\r\n        // Register upcast converter for uploadId.\r\n        conversion.for('upcast')\r\n            .attributeToAttribute({\r\n            view: {\r\n                name: 'img',\r\n                key: 'uploadId'\r\n            },\r\n            model: 'uploadId'\r\n        });\r\n        // Handle pasted images.\r\n        // For every image file, a new file loader is created and a placeholder image is\r\n        // inserted into the content. Then, those images are uploaded once they appear in the model\r\n        // (see Document#change listener below).\r\n        this.listenTo(editor.editing.view.document, 'clipboardInput', (evt, data) => {\r\n            // Skip if non empty HTML data is included.\r\n            // https://github.com/ckeditor/ckeditor5-upload/issues/68\r\n            if (isHtmlIncluded(data.dataTransfer)) {\r\n                return;\r\n            }\r\n            const images = Array.from(data.dataTransfer.files).filter(file => {\r\n                // See https://github.com/ckeditor/ckeditor5-image/pull/254.\r\n                if (!file) {\r\n                    return false;\r\n                }\r\n                return imageTypes.test(file.type);\r\n            });\r\n            if (!images.length) {\r\n                return;\r\n            }\r\n            evt.stop();\r\n            editor.model.change(writer => {\r\n                // Set selection to paste target.\r\n                if (data.targetRanges) {\r\n                    writer.setSelection(data.targetRanges.map(viewRange => editor.editing.mapper.toModelRange(viewRange)));\r\n                }\r\n                // Upload images after the selection has changed in order to ensure the command's state is refreshed.\r\n                editor.model.enqueueChange(() => {\r\n                    editor.execute('uploadImage', { file: images });\r\n                });\r\n            });\r\n        });\r\n        // Handle HTML pasted with images with base64 or blob sources.\r\n        // For every image file, a new file loader is created and a placeholder image is\r\n        // inserted into the content. Then, those images are uploaded once they appear in the model\r\n        // (see Document#change listener below).\r\n        this.listenTo(clipboardPipeline, 'inputTransformation', (evt, data) => {\r\n            const fetchableImages = Array.from(editor.editing.view.createRangeIn(data.content))\r\n                .map(value => value.item)\r\n                .filter(viewElement => isLocalImage(imageUtils, viewElement) &&\r\n                !viewElement.getAttribute('uploadProcessed'))\r\n                .map(viewElement => { return { promise: fetchLocalImage(viewElement), imageElement: viewElement }; });\r\n            if (!fetchableImages.length) {\r\n                return;\r\n            }\r\n            const writer = new UpcastWriter(editor.editing.view.document);\r\n            for (const fetchableImage of fetchableImages) {\r\n                // Set attribute marking that the image was processed already.\r\n                writer.setAttribute('uploadProcessed', true, fetchableImage.imageElement);\r\n                const loader = fileRepository.createLoader(fetchableImage.promise);\r\n                if (loader) {\r\n                    writer.setAttribute('src', '', fetchableImage.imageElement);\r\n                    writer.setAttribute('uploadId', loader.id, fetchableImage.imageElement);\r\n                }\r\n            }\r\n        });\r\n        // Prevents from the browser redirecting to the dropped image.\r\n        editor.editing.view.document.on('dragover', (evt, data) => {\r\n            data.preventDefault();\r\n        });\r\n        // Upload placeholder images that appeared in the model.\r\n        doc.on('change', () => {\r\n            // Note: Reversing changes to start with insertions and only then handle removals. If it was the other way around,\r\n            // loaders for **all** images that land in the $graveyard would abort while in fact only those that were **not** replaced\r\n            // by other images should be aborted.\r\n            const changes = doc.differ.getChanges({ includeChangesInGraveyard: true }).reverse();\r\n            const insertedImagesIds = new Set();\r\n            for (const entry of changes) {\r\n                if (entry.type == 'insert' && entry.name != '$text') {\r\n                    const item = entry.position.nodeAfter;\r\n                    const isInsertedInGraveyard = entry.position.root.rootName == '$graveyard';\r\n                    for (const imageElement of getImagesFromChangeItem(editor, item)) {\r\n                        // Check if the image element still has upload id.\r\n                        const uploadId = imageElement.getAttribute('uploadId');\r\n                        if (!uploadId) {\r\n                            continue;\r\n                        }\r\n                        // Check if the image is loaded on this client.\r\n                        const loader = fileRepository.loaders.get(uploadId);\r\n                        if (!loader) {\r\n                            continue;\r\n                        }\r\n                        if (isInsertedInGraveyard) {\r\n                            // If the image was inserted to the graveyard for good (**not** replaced by another image),\r\n                            // only then abort the loading process.\r\n                            if (!insertedImagesIds.has(uploadId)) {\r\n                                loader.abort();\r\n                            }\r\n                        }\r\n                        else {\r\n                            // Remember the upload id of the inserted image. If it acted as a replacement for another\r\n                            // image (which landed in the $graveyard), the related loader will not be aborted because\r\n                            // this is still the same image upload.\r\n                            insertedImagesIds.add(uploadId);\r\n                            // Keep the mapping between the upload ID and the image model element so the upload\r\n                            // can later resolve in the context of the correct model element. The model element could\r\n                            // change for the same upload if one image was replaced by another (e.g. image type was changed),\r\n                            // so this may also replace an existing mapping.\r\n                            this._uploadImageElements.set(uploadId, imageElement);\r\n                            if (loader.status == 'idle') {\r\n                                // If the image was inserted into content and has not been loaded yet, start loading it.\r\n                                this._readAndUpload(loader);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        });\r\n        // Set the default handler for feeding the image element with `src` and `srcset` attributes.\r\n        this.on('uploadComplete', (evt, { imageElement, data }) => {\r\n            const urls = data.urls ? data.urls : data;\r\n            this.editor.model.change(writer => {\r\n                writer.setAttribute('src', urls.default, imageElement);\r\n                this._parseAndSetSrcsetAttributeOnImage(urls, imageElement, writer);\r\n            });\r\n        }, { priority: 'low' });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    afterInit() {\r\n        const schema = this.editor.model.schema;\r\n        // Setup schema to allow uploadId and uploadStatus for images.\r\n        // Wait for ImageBlockEditing or ImageInlineEditing to register their elements first,\r\n        // that's why doing this in afterInit() instead of init().\r\n        if (this.editor.plugins.has('ImageBlockEditing')) {\r\n            schema.extend('imageBlock', {\r\n                allowAttributes: ['uploadId', 'uploadStatus']\r\n            });\r\n        }\r\n        if (this.editor.plugins.has('ImageInlineEditing')) {\r\n            schema.extend('imageInline', {\r\n                allowAttributes: ['uploadId', 'uploadStatus']\r\n            });\r\n        }\r\n    }\r\n    /**\r\n     * Reads and uploads an image.\r\n     *\r\n     * The image is read from the disk and as a Base64-encoded string it is set temporarily to\r\n     * `image[src]`. When the image is successfully uploaded, the temporary data is replaced with the target\r\n     * image's URL (the URL to the uploaded image on the server).\r\n     */\r\n    _readAndUpload(loader) {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const t = editor.locale.t;\r\n        const fileRepository = editor.plugins.get(FileRepository);\r\n        const notification = editor.plugins.get(Notification);\r\n        const imageUtils = editor.plugins.get('ImageUtils');\r\n        const imageUploadElements = this._uploadImageElements;\r\n        model.enqueueChange({ isUndoable: false }, writer => {\r\n            writer.setAttribute('uploadStatus', 'reading', imageUploadElements.get(loader.id));\r\n        });\r\n        return loader.read()\r\n            .then(() => {\r\n            const promise = loader.upload();\r\n            const imageElement = imageUploadElements.get(loader.id);\r\n            // Force re–paint in Safari. Without it, the image will display with a wrong size.\r\n            // https://github.com/ckeditor/ckeditor5/issues/1975\r\n            /* istanbul ignore next -- @preserve */\r\n            if (env.isSafari) {\r\n                const viewFigure = editor.editing.mapper.toViewElement(imageElement);\r\n                const viewImg = imageUtils.findViewImgElement(viewFigure);\r\n                editor.editing.view.once('render', () => {\r\n                    // Early returns just to be safe. There might be some code ran\r\n                    // in between the outer scope and this callback.\r\n                    if (!viewImg.parent) {\r\n                        return;\r\n                    }\r\n                    const domFigure = editor.editing.view.domConverter.mapViewToDom(viewImg.parent);\r\n                    if (!domFigure) {\r\n                        return;\r\n                    }\r\n                    const originalDisplay = domFigure.style.display;\r\n                    domFigure.style.display = 'none';\r\n                    // Make sure this line will never be removed during minification for having \"no effect\".\r\n                    domFigure._ckHack = domFigure.offsetHeight;\r\n                    domFigure.style.display = originalDisplay;\r\n                });\r\n            }\r\n            model.enqueueChange({ isUndoable: false }, writer => {\r\n                writer.setAttribute('uploadStatus', 'uploading', imageElement);\r\n            });\r\n            return promise;\r\n        })\r\n            .then(data => {\r\n            model.enqueueChange({ isUndoable: false }, writer => {\r\n                const imageElement = imageUploadElements.get(loader.id);\r\n                writer.setAttribute('uploadStatus', 'complete', imageElement);\r\n                this.fire('uploadComplete', { data, imageElement });\r\n            });\r\n            clean();\r\n        })\r\n            .catch(error => {\r\n            // If status is not 'error' nor 'aborted' - throw error because it means that something else went wrong,\r\n            // it might be generic error and it would be real pain to find what is going on.\r\n            if (loader.status !== 'error' && loader.status !== 'aborted') {\r\n                throw error;\r\n            }\r\n            // Might be 'aborted'.\r\n            if (loader.status == 'error' && error) {\r\n                notification.showWarning(error, {\r\n                    title: t('Upload failed'),\r\n                    namespace: 'upload'\r\n                });\r\n            }\r\n            // Permanently remove image from insertion batch.\r\n            model.enqueueChange({ isUndoable: false }, writer => {\r\n                writer.remove(imageUploadElements.get(loader.id));\r\n            });\r\n            clean();\r\n        });\r\n        function clean() {\r\n            model.enqueueChange({ isUndoable: false }, writer => {\r\n                const imageElement = imageUploadElements.get(loader.id);\r\n                writer.removeAttribute('uploadId', imageElement);\r\n                writer.removeAttribute('uploadStatus', imageElement);\r\n                imageUploadElements.delete(loader.id);\r\n            });\r\n            fileRepository.destroyLoader(loader);\r\n        }\r\n    }\r\n    /**\r\n     * Creates the `srcset` attribute based on a given file upload response and sets it as an attribute to a specific image element.\r\n     *\r\n     * @param data Data object from which `srcset` will be created.\r\n     * @param image The image element on which the `srcset` attribute will be set.\r\n     */\r\n    _parseAndSetSrcsetAttributeOnImage(data, image, writer) {\r\n        // Srcset attribute for responsive images support.\r\n        let maxWidth = 0;\r\n        const srcsetAttribute = Object.keys(data)\r\n            // Filter out keys that are not integers.\r\n            .filter(key => {\r\n            const width = parseInt(key, 10);\r\n            if (!isNaN(width)) {\r\n                maxWidth = Math.max(maxWidth, width);\r\n                return true;\r\n            }\r\n        })\r\n            // Convert each key to srcset entry.\r\n            .map(key => `${data[key]} ${key}w`)\r\n            // Join all entries.\r\n            .join(', ');\r\n        if (srcsetAttribute != '') {\r\n            writer.setAttribute('srcset', {\r\n                data: srcsetAttribute,\r\n                width: maxWidth\r\n            }, image);\r\n        }\r\n    }\r\n}\r\n/**\r\n * Returns `true` if non-empty `text/html` is included in the data transfer.\r\n */\r\nexport function isHtmlIncluded(dataTransfer) {\r\n    return Array.from(dataTransfer.types).includes('text/html') && dataTransfer.getData('text/html') !== '';\r\n}\r\nfunction getImagesFromChangeItem(editor, item) {\r\n    const imageUtils = editor.plugins.get('ImageUtils');\r\n    return Array.from(editor.model.createRangeOn(item))\r\n        .filter(value => imageUtils.isImage(value.item))\r\n        .map(value => value.item);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imageupload\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport ImageUploadUI from './imageupload/imageuploadui';\r\nimport ImageUploadProgress from './imageupload/imageuploadprogress';\r\nimport ImageUploadEditing from './imageupload/imageuploadediting';\r\n/**\r\n * The image upload plugin.\r\n *\r\n * For a detailed overview, check the {@glink features/images/image-upload/image-upload image upload feature} documentation.\r\n *\r\n * This plugin does not do anything directly, but it loads a set of specific plugins to enable image uploading:\r\n *\r\n * * {@link module:image/imageupload/imageuploadediting~ImageUploadEditing},\r\n * * {@link module:image/imageupload/imageuploadui~ImageUploadUI},\r\n * * {@link module:image/imageupload/imageuploadprogress~ImageUploadProgress}.\r\n */\r\nexport default class ImageUpload extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageUpload';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ImageUploadEditing, ImageUploadUI, ImageUploadProgress];\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./imageinsertformrowview.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { View } from 'ckeditor5/src/ui';\r\nimport '../../../theme/imageinsertformrowview.css';\r\n/**\r\n * The class representing a single row in a complex form,\r\n * used by {@link module:image/imageinsert/ui/imageinsertpanelview~ImageInsertPanelView}.\r\n *\r\n * **Note**: For now this class is private. When more use cases appear (beyond `ckeditor5-table` and `ckeditor5-image`),\r\n * it will become a component in `ckeditor5-ui`.\r\n *\r\n * @private\r\n */\r\nexport default class ImageUploadFormRowView extends View {\r\n    /**\r\n     * Creates an instance of the form row class.\r\n     *\r\n     * @param locale The locale instance.\r\n     * @param options.labelView When passed, the row gets the `group` and `aria-labelledby`\r\n     * DOM attributes and gets described by the label.\r\n     */\r\n    constructor(locale, options = {}) {\r\n        super(locale);\r\n        const bind = this.bindTemplate;\r\n        this.set('class', options.class || null);\r\n        this.children = this.createCollection();\r\n        if (options.children) {\r\n            options.children.forEach(child => this.children.add(child));\r\n        }\r\n        this.set('_role', null);\r\n        this.set('_ariaLabelledBy', null);\r\n        if (options.labelView) {\r\n            this.set({\r\n                _role: 'group',\r\n                _ariaLabelledBy: options.labelView.id\r\n            });\r\n        }\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-form__row',\r\n                    bind.to('class')\r\n                ],\r\n                role: bind.to('_role'),\r\n                'aria-labelledby': bind.to('_ariaLabelledBy')\r\n            },\r\n            children: this.children\r\n        });\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./imageinsert.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imageinsert/ui/imageinsertpanelview\r\n */\r\nimport { icons } from 'ckeditor5/src/core';\r\nimport { ButtonView, View, ViewCollection, submitHandler, FocusCycler } from 'ckeditor5/src/ui';\r\nimport { Collection, FocusTracker, KeystrokeHandler } from 'ckeditor5/src/utils';\r\nimport ImageInsertFormRowView from './imageinsertformrowview';\r\nimport '../../../theme/imageinsert.css';\r\n/**\r\n * The insert an image via URL view controller class.\r\n *\r\n * See {@link module:image/imageinsert/ui/imageinsertpanelview~ImageInsertPanelView}.\r\n */\r\nexport default class ImageInsertPanelView extends View {\r\n    /**\r\n     * Creates a view for the dropdown panel of {@link module:image/imageinsert/imageinsertui~ImageInsertUI}.\r\n     *\r\n     * @param locale The localization services instance.\r\n     * @param integrations An integrations object that contains components (or tokens for components) to be shown in the panel view.\r\n     */\r\n    constructor(locale, integrations = {}) {\r\n        super(locale);\r\n        const { insertButtonView, cancelButtonView } = this._createActionButtons(locale);\r\n        this.insertButtonView = insertButtonView;\r\n        this.cancelButtonView = cancelButtonView;\r\n        this.set('imageURLInputValue', '');\r\n        this.focusTracker = new FocusTracker();\r\n        this.keystrokes = new KeystrokeHandler();\r\n        this._focusables = new ViewCollection();\r\n        this._focusCycler = new FocusCycler({\r\n            focusables: this._focusables,\r\n            focusTracker: this.focusTracker,\r\n            keystrokeHandler: this.keystrokes,\r\n            actions: {\r\n                // Navigate form fields backwards using the Shift + Tab keystroke.\r\n                focusPrevious: 'shift + tab',\r\n                // Navigate form fields forwards using the Tab key.\r\n                focusNext: 'tab'\r\n            }\r\n        });\r\n        this.set('_integrations', new Collection());\r\n        for (const [integration, integrationView] of Object.entries(integrations)) {\r\n            if (integration === 'insertImageViaUrl') {\r\n                integrationView.fieldView\r\n                    .bind('value').to(this, 'imageURLInputValue', (value) => value || '');\r\n                integrationView.fieldView.on('input', () => {\r\n                    this.imageURLInputValue = integrationView.fieldView.element.value.trim();\r\n                });\r\n            }\r\n            integrationView.name = integration;\r\n            this._integrations.add(integrationView);\r\n        }\r\n        this.setTemplate({\r\n            tag: 'form',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-image-insert-form'\r\n                ],\r\n                tabindex: '-1'\r\n            },\r\n            children: [\r\n                ...this._integrations,\r\n                new ImageInsertFormRowView(locale, {\r\n                    children: [\r\n                        this.insertButtonView,\r\n                        this.cancelButtonView\r\n                    ],\r\n                    class: 'ck-image-insert-form__action-row'\r\n                })\r\n            ]\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        submitHandler({\r\n            view: this\r\n        });\r\n        const childViews = [\r\n            ...this._integrations,\r\n            this.insertButtonView,\r\n            this.cancelButtonView\r\n        ];\r\n        childViews.forEach(v => {\r\n            // Register the view as focusable.\r\n            this._focusables.add(v);\r\n            // Register the view in the focus tracker.\r\n            this.focusTracker.add(v.element);\r\n        });\r\n        // Start listening for the keystrokes coming from #element.\r\n        this.keystrokes.listenTo(this.element);\r\n        const stopPropagation = (data) => data.stopPropagation();\r\n        // Since the form is in the dropdown panel which is a child of the toolbar, the toolbar's\r\n        // keystroke handler would take over the key management in the URL input. We need to prevent\r\n        // this ASAP. Otherwise, the basic caret movement using the arrow keys will be impossible.\r\n        this.keystrokes.set('arrowright', stopPropagation);\r\n        this.keystrokes.set('arrowleft', stopPropagation);\r\n        this.keystrokes.set('arrowup', stopPropagation);\r\n        this.keystrokes.set('arrowdown', stopPropagation);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        this.focusTracker.destroy();\r\n        this.keystrokes.destroy();\r\n    }\r\n    /**\r\n     * Returns a view of the integration.\r\n     *\r\n     * @param name The name of the integration.\r\n     */\r\n    getIntegration(name) {\r\n        return this._integrations.find(integration => integration.name === name);\r\n    }\r\n    /**\r\n     * Creates the following form controls:\r\n     *\r\n     * * {@link #insertButtonView},\r\n     * * {@link #cancelButtonView}.\r\n     *\r\n     * @param locale The localization services instance.\r\n     */\r\n    _createActionButtons(locale) {\r\n        const t = locale.t;\r\n        const insertButtonView = new ButtonView(locale);\r\n        const cancelButtonView = new ButtonView(locale);\r\n        insertButtonView.set({\r\n            label: t('Insert'),\r\n            icon: icons.check,\r\n            class: 'ck-button-save',\r\n            type: 'submit',\r\n            withText: true,\r\n            isEnabled: this.imageURLInputValue\r\n        });\r\n        cancelButtonView.set({\r\n            label: t('Cancel'),\r\n            icon: icons.cancel,\r\n            class: 'ck-button-cancel',\r\n            withText: true\r\n        });\r\n        insertButtonView.bind('isEnabled').to(this, 'imageURLInputValue', value => !!value);\r\n        insertButtonView.delegate('execute').to(this, 'submit');\r\n        cancelButtonView.delegate('execute').to(this, 'cancel');\r\n        return { insertButtonView, cancelButtonView };\r\n    }\r\n    /**\r\n     * Focuses the first {@link #_focusables focusable} in the form.\r\n     */\r\n    focus() {\r\n        this._focusCycler.focusFirst();\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { LabeledFieldView, createLabeledInputText } from 'ckeditor5/src/ui';\r\n/**\r\n * Creates integrations object that will be passed to the\r\n * {@link module:image/imageinsert/ui/imageinsertpanelview~ImageInsertPanelView}.\r\n *\r\n * @param editor Editor instance.\r\n *\r\n * @returns Integrations object.\r\n */\r\nexport function prepareIntegrations(editor) {\r\n    const panelItems = editor.config.get('image.insert.integrations');\r\n    const imageInsertUIPlugin = editor.plugins.get('ImageInsertUI');\r\n    const PREDEFINED_INTEGRATIONS = {\r\n        'insertImageViaUrl': createLabeledInputView(editor.locale)\r\n    };\r\n    if (!panelItems) {\r\n        return PREDEFINED_INTEGRATIONS;\r\n    }\r\n    // Prepares ckfinder component for the `openCKFinder` integration token.\r\n    if (panelItems.find(item => item === 'openCKFinder') && editor.ui.componentFactory.has('ckfinder')) {\r\n        const ckFinderButton = editor.ui.componentFactory.create('ckfinder');\r\n        ckFinderButton.set({\r\n            withText: true,\r\n            class: 'ck-image-insert__ck-finder-button'\r\n        });\r\n        // We want to close the dropdown panel view when user clicks the ckFinderButton.\r\n        ckFinderButton.delegate('execute').to(imageInsertUIPlugin, 'cancel');\r\n        PREDEFINED_INTEGRATIONS.openCKFinder = ckFinderButton;\r\n    }\r\n    // Creates integrations object of valid views to pass it to the ImageInsertPanelView.\r\n    return panelItems.reduce((object, key) => {\r\n        if (PREDEFINED_INTEGRATIONS[key]) {\r\n            object[key] = PREDEFINED_INTEGRATIONS[key];\r\n        }\r\n        else if (editor.ui.componentFactory.has(key)) {\r\n            object[key] = editor.ui.componentFactory.create(key);\r\n        }\r\n        return object;\r\n    }, {});\r\n}\r\n/**\r\n * Creates labeled field view.\r\n *\r\n * @param locale The localization services instance.\r\n */\r\nexport function createLabeledInputView(locale) {\r\n    const t = locale.t;\r\n    const labeledInputView = new LabeledFieldView(locale, createLabeledInputText);\r\n    labeledInputView.set({\r\n        label: t('Insert image via URL')\r\n    });\r\n    labeledInputView.fieldView.placeholder = 'https://example.com/image.png';\r\n    return labeledInputView;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imageinsert/imageinsertui\r\n */\r\nimport { Plugin, icons } from 'ckeditor5/src/core';\r\nimport { SplitButtonView, createDropdown } from 'ckeditor5/src/ui';\r\nimport ImageInsertPanelView from './ui/imageinsertpanelview';\r\nimport { prepareIntegrations } from './utils';\r\n/**\r\n * The image insert dropdown plugin.\r\n *\r\n * For a detailed overview, check the {@glink features/images/image-upload/image-upload Image upload feature}\r\n * and {@glink features/images/images-inserting Insert images via source URL} documentation.\r\n *\r\n * Adds the `'insertImage'` dropdown to the {@link module:ui/componentfactory~ComponentFactory UI component factory}\r\n * and also the `imageInsert` dropdown as an alias for backward compatibility.\r\n */\r\nexport default class ImageInsertUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageInsertUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const componentCreator = (locale) => {\r\n            return this._createDropdownView(locale);\r\n        };\r\n        // Register `insertImage` dropdown and add `imageInsert` dropdown as an alias for backward compatibility.\r\n        editor.ui.componentFactory.add('insertImage', componentCreator);\r\n        editor.ui.componentFactory.add('imageInsert', componentCreator);\r\n    }\r\n    /**\r\n     * Creates the dropdown view.\r\n     *\r\n     * @param locale The localization services instance.\r\n     */\r\n    _createDropdownView(locale) {\r\n        const editor = this.editor;\r\n        const t = locale.t;\r\n        const uploadImageCommand = editor.commands.get('uploadImage');\r\n        const insertImageCommand = editor.commands.get('insertImage');\r\n        this.dropdownView = createDropdown(locale, uploadImageCommand ? SplitButtonView : undefined);\r\n        const buttonView = this.dropdownView.buttonView;\r\n        const panelView = this.dropdownView.panelView;\r\n        buttonView.set({\r\n            label: t('Insert image'),\r\n            icon: icons.image,\r\n            tooltip: true\r\n        });\r\n        panelView.extendTemplate({\r\n            attributes: {\r\n                class: 'ck-image-insert__panel'\r\n            }\r\n        });\r\n        if (uploadImageCommand) {\r\n            const splitButtonView = this.dropdownView.buttonView;\r\n            // We are injecting custom button replacement to readonly field.\r\n            splitButtonView.actionView = editor.ui.componentFactory.create('uploadImage');\r\n            // After we replaced action button with `uploadImage` component,\r\n            // we have lost a proper styling and some minor visual quirks have appeared.\r\n            // Brining back original split button classes helps fix the button styling\r\n            // See https://github.com/ckeditor/ckeditor5/issues/7986.\r\n            splitButtonView.actionView.extendTemplate({\r\n                attributes: {\r\n                    class: 'ck ck-button ck-splitbutton__action'\r\n                }\r\n            });\r\n        }\r\n        return this._setUpDropdown(uploadImageCommand || insertImageCommand);\r\n    }\r\n    /**\r\n     * Sets up the dropdown view.\r\n     *\r\n     * @param command An uploadImage or insertImage command.\r\n     */\r\n    _setUpDropdown(command) {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        const dropdownView = this.dropdownView;\r\n        const panelView = dropdownView.panelView;\r\n        const imageUtils = this.editor.plugins.get('ImageUtils');\r\n        const replaceImageSourceCommand = editor.commands.get('replaceImageSource');\r\n        let imageInsertView;\r\n        dropdownView.bind('isEnabled').to(command);\r\n        dropdownView.once('change:isOpen', () => {\r\n            imageInsertView = new ImageInsertPanelView(editor.locale, prepareIntegrations(editor));\r\n            imageInsertView.delegate('submit', 'cancel').to(dropdownView);\r\n            panelView.children.add(imageInsertView);\r\n        });\r\n        dropdownView.on('change:isOpen', () => {\r\n            const selectedElement = editor.model.document.selection.getSelectedElement();\r\n            const insertButtonView = imageInsertView.insertButtonView;\r\n            const insertImageViaUrlForm = imageInsertView.getIntegration('insertImageViaUrl');\r\n            if (dropdownView.isOpen) {\r\n                if (imageUtils.isImage(selectedElement)) {\r\n                    imageInsertView.imageURLInputValue = replaceImageSourceCommand.value;\r\n                    insertButtonView.label = t('Update');\r\n                    insertImageViaUrlForm.label = t('Update image URL');\r\n                }\r\n                else {\r\n                    imageInsertView.imageURLInputValue = '';\r\n                    insertButtonView.label = t('Insert');\r\n                    insertImageViaUrlForm.label = t('Insert image via URL');\r\n                }\r\n            }\r\n            // Note: Use the low priority to make sure the following listener starts working after the\r\n            // default action of the drop-down is executed (i.e. the panel showed up). Otherwise, the\r\n            // invisible form/input cannot be focused/selected.\r\n        }, { priority: 'low' });\r\n        this.delegate('cancel').to(dropdownView);\r\n        dropdownView.on('submit', () => {\r\n            closePanel();\r\n            onSubmit();\r\n        });\r\n        dropdownView.on('cancel', () => {\r\n            closePanel();\r\n        });\r\n        function onSubmit() {\r\n            const selectedElement = editor.model.document.selection.getSelectedElement();\r\n            if (imageUtils.isImage(selectedElement)) {\r\n                editor.execute('replaceImageSource', { source: imageInsertView.imageURLInputValue });\r\n            }\r\n            else {\r\n                editor.execute('insertImage', { source: imageInsertView.imageURLInputValue });\r\n            }\r\n        }\r\n        function closePanel() {\r\n            editor.editing.view.focus();\r\n            dropdownView.isOpen = false;\r\n        }\r\n        return dropdownView;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imageinsertviaurl\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport ImageInsertUI from './imageinsert/imageinsertui';\r\n/**\r\n * The image insert via URL plugin.\r\n *\r\n * For a detailed overview, check the {@glink features/images/images-inserting\r\n * Insert images via source URL} documentation.\r\n *\r\n * This plugin does not do anything directly, but it loads a set of specific plugins\r\n * to enable image inserting via implemented integrations:\r\n *\r\n * * {@link module:image/imageinsert/imageinsertui~ImageInsertUI},\r\n */\r\nexport default class ImageInsertViaUrl extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageInsertViaUrl';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ImageInsertUI];\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imageresize/resizeimagecommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\n/**\r\n * The resize image command. Currently, it only supports the width attribute.\r\n */\r\nexport default class ResizeImageCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const editor = this.editor;\r\n        const imageUtils = editor.plugins.get('ImageUtils');\r\n        const element = imageUtils.getClosestSelectedImageElement(editor.model.document.selection);\r\n        this.isEnabled = !!element;\r\n        if (!element || !element.hasAttribute('width')) {\r\n            this.value = null;\r\n        }\r\n        else {\r\n            this.value = {\r\n                width: element.getAttribute('width'),\r\n                height: null\r\n            };\r\n        }\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * ```ts\r\n     * // Sets the width to 50%:\r\n     * editor.execute( 'resizeImage', { width: '50%' } );\r\n     *\r\n     * // Removes the width attribute:\r\n     * editor.execute( 'resizeImage', { width: null } );\r\n     * ```\r\n     *\r\n     * @param options\r\n     * @param options.width The new width of the image.\r\n     * @fires execute\r\n     */\r\n    execute(options) {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const imageUtils = editor.plugins.get('ImageUtils');\r\n        const imageElement = imageUtils.getClosestSelectedImageElement(model.document.selection);\r\n        this.value = {\r\n            width: options.width,\r\n            height: null\r\n        };\r\n        if (imageElement) {\r\n            model.change(writer => {\r\n                writer.setAttribute('width', options.width, imageElement);\r\n            });\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport ImageUtils from '../imageutils';\r\nimport ResizeImageCommand from './resizeimagecommand';\r\n/**\r\n * The image resize editing feature.\r\n *\r\n * It adds the ability to resize each image using handles or manually by\r\n * {@link module:image/imageresize/imageresizebuttons~ImageResizeButtons} buttons.\r\n */\r\nexport default class ImageResizeEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ImageUtils];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageResizeEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        editor.config.define('image', {\r\n            resizeUnit: '%',\r\n            resizeOptions: [{\r\n                    name: 'resizeImage:original',\r\n                    value: null,\r\n                    icon: 'original'\r\n                },\r\n                {\r\n                    name: 'resizeImage:25',\r\n                    value: '25',\r\n                    icon: 'small'\r\n                },\r\n                {\r\n                    name: 'resizeImage:50',\r\n                    value: '50',\r\n                    icon: 'medium'\r\n                },\r\n                {\r\n                    name: 'resizeImage:75',\r\n                    value: '75',\r\n                    icon: 'large'\r\n                }]\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const resizeImageCommand = new ResizeImageCommand(editor);\r\n        this._registerSchema();\r\n        this._registerConverters('imageBlock');\r\n        this._registerConverters('imageInline');\r\n        // Register `resizeImage` command and add `imageResize` command as an alias for backward compatibility.\r\n        editor.commands.add('resizeImage', resizeImageCommand);\r\n        editor.commands.add('imageResize', resizeImageCommand);\r\n    }\r\n    _registerSchema() {\r\n        if (this.editor.plugins.has('ImageBlockEditing')) {\r\n            this.editor.model.schema.extend('imageBlock', { allowAttributes: 'width' });\r\n        }\r\n        if (this.editor.plugins.has('ImageInlineEditing')) {\r\n            this.editor.model.schema.extend('imageInline', { allowAttributes: 'width' });\r\n        }\r\n    }\r\n    /**\r\n     * Registers image resize converters.\r\n     *\r\n     * @param imageType The type of the image.\r\n     */\r\n    _registerConverters(imageType) {\r\n        const editor = this.editor;\r\n        // Dedicated converter to propagate image's attribute to the img tag.\r\n        editor.conversion.for('downcast').add(dispatcher => dispatcher.on(`attribute:width:${imageType}`, (evt, data, conversionApi) => {\r\n            if (!conversionApi.consumable.consume(data.item, evt.name)) {\r\n                return;\r\n            }\r\n            const viewWriter = conversionApi.writer;\r\n            const figure = conversionApi.mapper.toViewElement(data.item);\r\n            if (data.attributeNewValue !== null) {\r\n                viewWriter.setStyle('width', data.attributeNewValue, figure);\r\n                viewWriter.addClass('image_resized', figure);\r\n            }\r\n            else {\r\n                viewWriter.removeStyle('width', figure);\r\n                viewWriter.removeClass('image_resized', figure);\r\n            }\r\n        }));\r\n        editor.conversion.for('upcast')\r\n            .attributeToAttribute({\r\n            view: {\r\n                name: imageType === 'imageBlock' ? 'figure' : 'img',\r\n                styles: {\r\n                    width: /.+/\r\n                }\r\n            },\r\n            model: {\r\n                key: 'width',\r\n                value: (viewElement) => viewElement.getStyle('width')\r\n            }\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imageresize/imageresizebuttons\r\n */\r\nimport { Plugin, icons } from 'ckeditor5/src/core';\r\nimport { ButtonView, DropdownButtonView, Model, createDropdown, addListToDropdown } from 'ckeditor5/src/ui';\r\nimport { CKEditorError, Collection } from 'ckeditor5/src/utils';\r\nimport ImageResizeEditing from './imageresizeediting';\r\nconst RESIZE_ICONS = {\r\n    small: icons.objectSizeSmall,\r\n    medium: icons.objectSizeMedium,\r\n    large: icons.objectSizeLarge,\r\n    original: icons.objectSizeFull\r\n};\r\n/**\r\n * The image resize buttons plugin.\r\n *\r\n * It adds a possibility to resize images using the toolbar dropdown or individual buttons, depending on the plugin configuration.\r\n */\r\nexport default class ImageResizeButtons extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ImageResizeEditing];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageResizeButtons';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        this._resizeUnit = editor.config.get('image.resizeUnit');\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const options = editor.config.get('image.resizeOptions');\r\n        const command = editor.commands.get('resizeImage');\r\n        this.bind('isEnabled').to(command);\r\n        for (const option of options) {\r\n            this._registerImageResizeButton(option);\r\n        }\r\n        this._registerImageResizeDropdown(options);\r\n    }\r\n    /**\r\n     * A helper function that creates a standalone button component for the plugin.\r\n     *\r\n     * @param resizeOption A model of the resize option.\r\n     */\r\n    _registerImageResizeButton(option) {\r\n        const editor = this.editor;\r\n        const { name, value, icon } = option;\r\n        const optionValueWithUnit = value ? value + this._resizeUnit : null;\r\n        editor.ui.componentFactory.add(name, locale => {\r\n            const button = new ButtonView(locale);\r\n            const command = editor.commands.get('resizeImage');\r\n            const labelText = this._getOptionLabelValue(option, true);\r\n            if (!RESIZE_ICONS[icon]) {\r\n                /**\r\n                 * When configuring {@link module:image/imageconfig~ImageConfig#resizeOptions `config.image.resizeOptions`} for standalone\r\n                 * buttons, a valid `icon` token must be set for each option.\r\n                 *\r\n                 * See all valid options described in the\r\n                 * {@link module:image/imageconfig~ImageResizeOption plugin configuration}.\r\n                 *\r\n                 * @error imageresizebuttons-missing-icon\r\n                 * @param option Invalid image resize option.\r\n                */\r\n                throw new CKEditorError('imageresizebuttons-missing-icon', editor, option);\r\n            }\r\n            button.set({\r\n                // Use the `label` property for a verbose description (because of ARIA).\r\n                label: labelText,\r\n                icon: RESIZE_ICONS[icon],\r\n                tooltip: labelText,\r\n                isToggleable: true\r\n            });\r\n            // Bind button to the command.\r\n            button.bind('isEnabled').to(this);\r\n            button.bind('isOn').to(command, 'value', getIsOnButtonCallback(optionValueWithUnit));\r\n            this.listenTo(button, 'execute', () => {\r\n                editor.execute('resizeImage', { width: optionValueWithUnit });\r\n            });\r\n            return button;\r\n        });\r\n    }\r\n    /**\r\n     * A helper function that creates a dropdown component for the plugin containing all the resize options defined in\r\n     * the editor configuration.\r\n     *\r\n     * @param options An array of configured options.\r\n     */\r\n    _registerImageResizeDropdown(options) {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        const originalSizeOption = options.find(option => !option.value);\r\n        const componentCreator = (locale) => {\r\n            const command = editor.commands.get('resizeImage');\r\n            const dropdownView = createDropdown(locale, DropdownButtonView);\r\n            const dropdownButton = dropdownView.buttonView;\r\n            const accessibleLabel = t('Resize image');\r\n            dropdownButton.set({\r\n                tooltip: accessibleLabel,\r\n                commandValue: originalSizeOption.value,\r\n                icon: RESIZE_ICONS.medium,\r\n                isToggleable: true,\r\n                label: this._getOptionLabelValue(originalSizeOption),\r\n                withText: true,\r\n                class: 'ck-resize-image-button',\r\n                ariaLabel: accessibleLabel,\r\n                ariaLabelledBy: undefined\r\n            });\r\n            dropdownButton.bind('label').to(command, 'value', commandValue => {\r\n                if (commandValue && commandValue.width) {\r\n                    return commandValue.width;\r\n                }\r\n                else {\r\n                    return this._getOptionLabelValue(originalSizeOption);\r\n                }\r\n            });\r\n            dropdownView.bind('isEnabled').to(this);\r\n            addListToDropdown(dropdownView, () => this._getResizeDropdownListItemDefinitions(options, command), {\r\n                ariaLabel: t('Image resize list'),\r\n                role: 'menu'\r\n            });\r\n            // Execute command when an item from the dropdown is selected.\r\n            this.listenTo(dropdownView, 'execute', evt => {\r\n                editor.execute(evt.source.commandName, { width: evt.source.commandValue });\r\n                editor.editing.view.focus();\r\n            });\r\n            return dropdownView;\r\n        };\r\n        // Register `resizeImage` dropdown and add `imageResize` dropdown as an alias for backward compatibility.\r\n        editor.ui.componentFactory.add('resizeImage', componentCreator);\r\n        editor.ui.componentFactory.add('imageResize', componentCreator);\r\n    }\r\n    /**\r\n     * A helper function for creating an option label value string.\r\n     *\r\n     * @param option A resize option object.\r\n     * @param forTooltip An optional flag for creating a tooltip label.\r\n     * @returns A user-defined label combined from the numeric value and the resize unit or the default label\r\n     * for reset options (`Original`).\r\n     */\r\n    _getOptionLabelValue(option, forTooltip = false) {\r\n        const t = this.editor.t;\r\n        if (option.label) {\r\n            return option.label;\r\n        }\r\n        else if (forTooltip) {\r\n            if (option.value) {\r\n                return t('Resize image to %0', option.value + this._resizeUnit);\r\n            }\r\n            else {\r\n                return t('Resize image to the original size');\r\n            }\r\n        }\r\n        else {\r\n            if (option.value) {\r\n                return option.value + this._resizeUnit;\r\n            }\r\n            else {\r\n                return t('Original');\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * A helper function that parses the resize options and returns list item definitions ready for use in the dropdown.\r\n     *\r\n     * @param options The resize options.\r\n     * @param command The resize image command.\r\n     * @returns Dropdown item definitions.\r\n     */\r\n    _getResizeDropdownListItemDefinitions(options, command) {\r\n        const itemDefinitions = new Collection();\r\n        options.map(option => {\r\n            const optionValueWithUnit = option.value ? option.value + this._resizeUnit : null;\r\n            const definition = {\r\n                type: 'button',\r\n                model: new Model({\r\n                    commandName: 'resizeImage',\r\n                    commandValue: optionValueWithUnit,\r\n                    label: this._getOptionLabelValue(option),\r\n                    role: 'menuitemradio',\r\n                    withText: true,\r\n                    icon: null\r\n                })\r\n            };\r\n            definition.model.bind('isOn').to(command, 'value', getIsOnButtonCallback(optionValueWithUnit));\r\n            itemDefinitions.add(definition);\r\n        });\r\n        return itemDefinitions;\r\n    }\r\n}\r\n/**\r\n * A helper function for setting the `isOn` state of buttons in value bindings.\r\n */\r\nfunction getIsOnButtonCallback(value) {\r\n    return (commandValue) => {\r\n        const objectCommandValue = commandValue;\r\n        if (value === null && objectCommandValue === value) {\r\n            return true;\r\n        }\r\n        return objectCommandValue !== null && objectCommandValue.width === value;\r\n    };\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { WidgetResize } from 'ckeditor5/src/widget';\r\nimport ImageLoadObserver from '../image/imageloadobserver';\r\nconst RESIZABLE_IMAGES_CSS_SELECTOR = 'figure.image.ck-widget > img,' +\r\n    'figure.image.ck-widget > picture > img,' +\r\n    'figure.image.ck-widget > a > img,' +\r\n    'figure.image.ck-widget > a > picture > img,' +\r\n    'span.image-inline.ck-widget > img,' +\r\n    'span.image-inline.ck-widget > picture > img';\r\nconst IMAGE_WIDGETS_CLASSES_MATCH_REGEXP = /(image|image-inline)/;\r\nconst RESIZED_IMAGE_CLASS = 'image_resized';\r\n/**\r\n * The image resize by handles feature.\r\n *\r\n * It adds the ability to resize each image using handles or manually by\r\n * {@link module:image/imageresize/imageresizebuttons~ImageResizeButtons} buttons.\r\n */\r\nexport default class ImageResizeHandles extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [WidgetResize];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageResizeHandles';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const command = this.editor.commands.get('resizeImage');\r\n        this.bind('isEnabled').to(command);\r\n        this._setupResizerCreator();\r\n    }\r\n    /**\r\n     * Attaches the listeners responsible for creating a resizer for each image, except for images inside the HTML embed preview.\r\n     */\r\n    _setupResizerCreator() {\r\n        const editor = this.editor;\r\n        const editingView = editor.editing.view;\r\n        editingView.addObserver(ImageLoadObserver);\r\n        this.listenTo(editingView.document, 'imageLoaded', (evt, domEvent) => {\r\n            // The resizer must be attached only to images loaded by the `ImageInsert`, `ImageUpload` or `LinkImage` plugins.\r\n            if (!domEvent.target.matches(RESIZABLE_IMAGES_CSS_SELECTOR)) {\r\n                return;\r\n            }\r\n            const domConverter = editor.editing.view.domConverter;\r\n            const imageView = domConverter.domToView(domEvent.target);\r\n            const widgetView = imageView.findAncestor({ classes: IMAGE_WIDGETS_CLASSES_MATCH_REGEXP });\r\n            let resizer = this.editor.plugins.get(WidgetResize).getResizerByViewElement(widgetView);\r\n            if (resizer) {\r\n                // There are rare cases when the image will be triggered multiple times for the same widget, e.g. when\r\n                // the image's source was changed after upload (https://github.com/ckeditor/ckeditor5/pull/8108#issuecomment-708302992).\r\n                resizer.redraw();\r\n                return;\r\n            }\r\n            const mapper = editor.editing.mapper;\r\n            const imageModel = mapper.toModelElement(widgetView);\r\n            resizer = editor.plugins\r\n                .get(WidgetResize)\r\n                .attachTo({\r\n                unit: editor.config.get('image.resizeUnit'),\r\n                modelElement: imageModel,\r\n                viewElement: widgetView,\r\n                editor,\r\n                getHandleHost(domWidgetElement) {\r\n                    return domWidgetElement.querySelector('img');\r\n                },\r\n                getResizeHost() {\r\n                    // Return the model image element parent to avoid setting an inline element (<a>/<span>) as a resize host.\r\n                    return domConverter.mapViewToDom(mapper.toViewElement(imageModel.parent));\r\n                },\r\n                // TODO consider other positions.\r\n                isCentered() {\r\n                    const imageStyle = imageModel.getAttribute('imageStyle');\r\n                    return !imageStyle || imageStyle == 'block' || imageStyle == 'alignCenter';\r\n                },\r\n                onCommit(newValue) {\r\n                    // Get rid of the CSS class in case the command execution that follows is unsuccessful\r\n                    // (e.g. Track Changes can override it and the new dimensions will not apply). Otherwise,\r\n                    // the presence of the class and the absence of the width style will cause it to take 100%\r\n                    // of the horizontal space.\r\n                    editingView.change(writer => {\r\n                        writer.removeClass(RESIZED_IMAGE_CLASS, widgetView);\r\n                    });\r\n                    editor.execute('resizeImage', { width: newValue });\r\n                }\r\n            });\r\n            resizer.on('updateSize', () => {\r\n                if (!widgetView.hasClass(RESIZED_IMAGE_CLASS)) {\r\n                    editingView.change(writer => {\r\n                        writer.addClass(RESIZED_IMAGE_CLASS, widgetView);\r\n                    });\r\n                }\r\n            });\r\n            resizer.bind('isEnabled').to(this);\r\n        });\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./imageresize.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\n/**\r\n * The image style command. It is used to apply {@link module:image/imageconfig~ImageStyleConfig#options image style option}\r\n * to a selected image.\r\n *\r\n * **Note**: Executing this command may change the image model element if the desired style requires an image of a different\r\n * type. See {@link module:image/imagestyle/imagestylecommand~ImageStyleCommand#execute} to learn more.\r\n */\r\nexport default class ImageStyleCommand extends Command {\r\n    /**\r\n     * Creates an instance of the image style command. When executed, the command applies one of\r\n     * {@link module:image/imageconfig~ImageStyleConfig#options style options} to the currently selected image.\r\n     *\r\n     * @param editor The editor instance.\r\n     * @param styles The style options that this command supports.\r\n     */\r\n    constructor(editor, styles) {\r\n        super(editor);\r\n        this._defaultStyles = {\r\n            imageBlock: false,\r\n            imageInline: false\r\n        };\r\n        this._styles = new Map(styles.map(style => {\r\n            if (style.isDefault) {\r\n                for (const modelElementName of style.modelElements) {\r\n                    this._defaultStyles[modelElementName] = style.name;\r\n                }\r\n            }\r\n            return [style.name, style];\r\n        }));\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const editor = this.editor;\r\n        const imageUtils = editor.plugins.get('ImageUtils');\r\n        const element = imageUtils.getClosestSelectedImageElement(this.editor.model.document.selection);\r\n        this.isEnabled = !!element;\r\n        if (!this.isEnabled) {\r\n            this.value = false;\r\n        }\r\n        else if (element.hasAttribute('imageStyle')) {\r\n            this.value = element.getAttribute('imageStyle');\r\n        }\r\n        else {\r\n            this.value = this._defaultStyles[element.name];\r\n        }\r\n    }\r\n    /**\r\n     * Executes the command and applies the style to the currently selected image:\r\n     *\r\n     * ```ts\r\n     * editor.execute( 'imageStyle', { value: 'side' } );\r\n     * ```\r\n     *\r\n     * **Note**: Executing this command may change the image model element if the desired style requires an image\r\n     * of a different type. Learn more about {@link module:image/imageconfig~ImageStyleOptionDefinition#modelElements model element}\r\n     * configuration for the style option.\r\n     *\r\n     * @param options.value The name of the style (as configured in {@link module:image/imageconfig~ImageStyleConfig#options}).\r\n     * @fires execute\r\n     */\r\n    execute(options = {}) {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const imageUtils = editor.plugins.get('ImageUtils');\r\n        model.change(writer => {\r\n            const requestedStyle = options.value;\r\n            let imageElement = imageUtils.getClosestSelectedImageElement(model.document.selection);\r\n            // Change the image type if a style requires it.\r\n            if (requestedStyle && this.shouldConvertImageType(requestedStyle, imageElement)) {\r\n                this.editor.execute(imageUtils.isBlockImage(imageElement) ? 'imageTypeInline' : 'imageTypeBlock');\r\n                // Update the imageElement to the newly created image.\r\n                imageElement = imageUtils.getClosestSelectedImageElement(model.document.selection);\r\n            }\r\n            // Default style means that there is no `imageStyle` attribute in the model.\r\n            // https://github.com/ckeditor/ckeditor5-image/issues/147\r\n            if (!requestedStyle || this._styles.get(requestedStyle).isDefault) {\r\n                writer.removeAttribute('imageStyle', imageElement);\r\n            }\r\n            else {\r\n                writer.setAttribute('imageStyle', requestedStyle, imageElement);\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Returns `true` if requested style change would trigger the image type change.\r\n     *\r\n     * @param requestedStyle The name of the style (as configured in {@link module:image/imageconfig~ImageStyleConfig#options}).\r\n     * @param imageElement The image model element.\r\n     */\r\n    shouldConvertImageType(requestedStyle, imageElement) {\r\n        const supportedTypes = this._styles.get(requestedStyle).modelElements;\r\n        return !supportedTypes.includes(imageElement.name);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imagestyle/utils\r\n */\r\nimport { icons } from 'ckeditor5/src/core';\r\nimport { logWarning } from 'ckeditor5/src/utils';\r\nconst { objectFullWidth, objectInline, objectLeft, objectRight, objectCenter, objectBlockLeft, objectBlockRight } = icons;\r\n/**\r\n * Default image style options provided by the plugin that can be referred in the {@link module:image/imageconfig~ImageConfig#styles}\r\n * configuration.\r\n *\r\n * There are available 5 styles focused on formatting:\r\n *\r\n * * **`'alignLeft'`** aligns the inline or block image to the left and wraps it with the text using the `image-style-align-left` class,\r\n * * **`'alignRight'`** aligns the inline or block image to the right and wraps it with the text using the `image-style-align-right` class,\r\n * * **`'alignCenter'`** centers the block image using the `image-style-align-center` class,\r\n * * **`'alignBlockLeft'`** aligns the block image to the left using the `image-style-block-align-left` class,\r\n * * **`'alignBlockRight'`** aligns the block image to the right using the `image-style-block-align-right` class,\r\n *\r\n * and 3 semantic styles:\r\n *\r\n * * **`'inline'`** is an inline image without any CSS class,\r\n * * **`'block'`** is a block image without any CSS class,\r\n * * **`'side'`** is a block image styled with the `image-style-side` CSS class.\r\n */\r\nexport const DEFAULT_OPTIONS = {\r\n    // This style represents an image placed in the line of text.\r\n    get inline() {\r\n        return {\r\n            name: 'inline',\r\n            title: 'In line',\r\n            icon: objectInline,\r\n            modelElements: ['imageInline'],\r\n            isDefault: true\r\n        };\r\n    },\r\n    // This style represents an image aligned to the left and wrapped with text.\r\n    get alignLeft() {\r\n        return {\r\n            name: 'alignLeft',\r\n            title: 'Left aligned image',\r\n            icon: objectLeft,\r\n            modelElements: ['imageBlock', 'imageInline'],\r\n            className: 'image-style-align-left'\r\n        };\r\n    },\r\n    // This style represents an image aligned to the left.\r\n    get alignBlockLeft() {\r\n        return {\r\n            name: 'alignBlockLeft',\r\n            title: 'Left aligned image',\r\n            icon: objectBlockLeft,\r\n            modelElements: ['imageBlock'],\r\n            className: 'image-style-block-align-left'\r\n        };\r\n    },\r\n    // This style represents a centered image.\r\n    get alignCenter() {\r\n        return {\r\n            name: 'alignCenter',\r\n            title: 'Centered image',\r\n            icon: objectCenter,\r\n            modelElements: ['imageBlock'],\r\n            className: 'image-style-align-center'\r\n        };\r\n    },\r\n    // This style represents an image aligned to the right and wrapped with text.\r\n    get alignRight() {\r\n        return {\r\n            name: 'alignRight',\r\n            title: 'Right aligned image',\r\n            icon: objectRight,\r\n            modelElements: ['imageBlock', 'imageInline'],\r\n            className: 'image-style-align-right'\r\n        };\r\n    },\r\n    // This style represents an image aligned to the right.\r\n    get alignBlockRight() {\r\n        return {\r\n            name: 'alignBlockRight',\r\n            title: 'Right aligned image',\r\n            icon: objectBlockRight,\r\n            modelElements: ['imageBlock'],\r\n            className: 'image-style-block-align-right'\r\n        };\r\n    },\r\n    // This option is equal to the situation when no style is applied.\r\n    get block() {\r\n        return {\r\n            name: 'block',\r\n            title: 'Centered image',\r\n            icon: objectCenter,\r\n            modelElements: ['imageBlock'],\r\n            isDefault: true\r\n        };\r\n    },\r\n    // This represents a side image.\r\n    get side() {\r\n        return {\r\n            name: 'side',\r\n            title: 'Side image',\r\n            icon: objectRight,\r\n            modelElements: ['imageBlock'],\r\n            className: 'image-style-side'\r\n        };\r\n    }\r\n};\r\n/**\r\n * Default image style icons provided by the plugin that can be referred in the {@link module:image/imageconfig~ImageConfig#styles}\r\n * configuration.\r\n *\r\n * See {@link module:image/imageconfig~ImageStyleOptionDefinition#icon} to learn more.\r\n *\r\n * There are 7 default icons available: `'full'`, `'left'`, `'inlineLeft'`, `'center'`, `'right'`, `'inlineRight'`, and `'inline'`.\r\n */\r\nexport const DEFAULT_ICONS = {\r\n    full: objectFullWidth,\r\n    left: objectBlockLeft,\r\n    right: objectBlockRight,\r\n    center: objectCenter,\r\n    inlineLeft: objectLeft,\r\n    inlineRight: objectRight,\r\n    inline: objectInline\r\n};\r\n/**\r\n * Default drop-downs provided by the plugin that can be referred in the {@link module:image/imageconfig~ImageConfig#toolbar}\r\n * configuration. The drop-downs are containers for the {@link module:image/imageconfig~ImageStyleConfig#options image style options}.\r\n *\r\n * If both of the `ImageEditing` plugins are loaded, there are 2 predefined drop-downs available:\r\n *\r\n * * **`'imageStyle:wrapText'`**, which contains the `alignLeft` and `alignRight` options, that is,\r\n * those that wraps the text around the image,\r\n * * **`'imageStyle:breakText'`**, which contains the `alignBlockLeft`, `alignCenter` and `alignBlockRight` options, that is,\r\n * those that breaks the text around the image.\r\n */\r\nexport const DEFAULT_DROPDOWN_DEFINITIONS = [{\r\n        name: 'imageStyle:wrapText',\r\n        title: 'Wrap text',\r\n        defaultItem: 'imageStyle:alignLeft',\r\n        items: ['imageStyle:alignLeft', 'imageStyle:alignRight']\r\n    }, {\r\n        name: 'imageStyle:breakText',\r\n        title: 'Break text',\r\n        defaultItem: 'imageStyle:block',\r\n        items: ['imageStyle:alignBlockLeft', 'imageStyle:block', 'imageStyle:alignBlockRight']\r\n    }];\r\n/**\r\n * Returns a list of the normalized and validated image style options.\r\n *\r\n * @param config\r\n * @param config.isInlinePluginLoaded\r\n * Determines whether the {@link module:image/image/imageblockediting~ImageBlockEditing `ImageBlockEditing`} plugin has been loaded.\r\n * @param config.isBlockPluginLoaded\r\n * Determines whether the {@link module:image/image/imageinlineediting~ImageInlineEditing `ImageInlineEditing`} plugin has been loaded.\r\n * @param config.configuredStyles\r\n * The image styles configuration provided in the image styles {@link module:image/imageconfig~ImageConfig#styles configuration}\r\n * as a default or custom value.\r\n * @returns\r\n * * Each of options contains a complete icon markup.\r\n * * The image style options not supported by any of the loaded plugins are filtered out.\r\n */\r\nfunction normalizeStyles(config) {\r\n    const configuredStyles = config.configuredStyles.options || [];\r\n    const styles = configuredStyles\r\n        .map(arrangement => normalizeDefinition(arrangement))\r\n        .filter(arrangement => isValidOption(arrangement, config));\r\n    return styles;\r\n}\r\n/**\r\n * Returns the default image styles configuration depending on the loaded image editing plugins.\r\n *\r\n * @param isInlinePluginLoaded\r\n * Determines whether the {@link module:image/image/imageblockediting~ImageBlockEditing `ImageBlockEditing`} plugin has been loaded.\r\n *\r\n * @param isBlockPluginLoaded\r\n * Determines whether the {@link module:image/image/imageinlineediting~ImageInlineEditing `ImageInlineEditing`} plugin has been loaded.\r\n *\r\n * @returns\r\n * It returns an object with the lists of the image style options and groups defined as strings related to the\r\n * {@link module:image/imagestyle/utils#DEFAULT_OPTIONS default options}\r\n */\r\nfunction getDefaultStylesConfiguration(isBlockPluginLoaded, isInlinePluginLoaded) {\r\n    if (isBlockPluginLoaded && isInlinePluginLoaded) {\r\n        return {\r\n            options: [\r\n                'inline', 'alignLeft', 'alignRight',\r\n                'alignCenter', 'alignBlockLeft', 'alignBlockRight',\r\n                'block', 'side'\r\n            ]\r\n        };\r\n    }\r\n    else if (isBlockPluginLoaded) {\r\n        return {\r\n            options: ['block', 'side']\r\n        };\r\n    }\r\n    else if (isInlinePluginLoaded) {\r\n        return {\r\n            options: ['inline', 'alignLeft', 'alignRight']\r\n        };\r\n    }\r\n    return {};\r\n}\r\n/**\r\n * Returns a list of the available predefined drop-downs' definitions depending on the loaded image editing plugins.\r\n */\r\nfunction getDefaultDropdownDefinitions(pluginCollection) {\r\n    if (pluginCollection.has('ImageBlockEditing') && pluginCollection.has('ImageInlineEditing')) {\r\n        return [...DEFAULT_DROPDOWN_DEFINITIONS];\r\n    }\r\n    else {\r\n        return [];\r\n    }\r\n}\r\n/**\r\n * Normalizes an image style option or group provided in the {@link module:image/imageconfig~ImageConfig#styles}\r\n * and returns it in a {@link module:image/imageconfig~ImageStyleOptionDefinition}/\r\n */\r\nfunction normalizeDefinition(definition) {\r\n    if (typeof definition === 'string') {\r\n        // Just the name of the style has been passed, but none of the defaults.\r\n        if (!DEFAULT_OPTIONS[definition]) {\r\n            // Normalize the style anyway to prevent errors.\r\n            definition = { name: definition };\r\n        }\r\n        // Just the name of the style has been passed and it's one of the defaults, just use it.\r\n        // Clone the style to avoid overriding defaults.\r\n        else {\r\n            definition = { ...DEFAULT_OPTIONS[definition] };\r\n        }\r\n    }\r\n    else {\r\n        // If an object style has been passed and if the name matches one of the defaults,\r\n        // extend it with defaults – the user wants to customize a default style.\r\n        // Note: Don't override the user–defined style object, clone it instead.\r\n        definition = extendStyle(DEFAULT_OPTIONS[definition.name], definition);\r\n    }\r\n    // If an icon is defined as a string and correspond with a name\r\n    // in default icons, use the default icon provided by the plugin.\r\n    if (typeof definition.icon === 'string') {\r\n        definition.icon = DEFAULT_ICONS[definition.icon] || definition.icon;\r\n    }\r\n    return definition;\r\n}\r\n/**\r\n * Checks if the image style option is valid:\r\n * * if it has the modelElements fields defined and filled,\r\n * * if the defined modelElements are supported by any of the loaded image editing plugins.\r\n * It also displays a console warning these conditions are not met.\r\n *\r\n * @param option image style option\r\n */\r\nfunction isValidOption(option, { isBlockPluginLoaded, isInlinePluginLoaded }) {\r\n    const { modelElements, name } = option;\r\n    if (!modelElements || !modelElements.length || !name) {\r\n        warnInvalidStyle({ style: option });\r\n        return false;\r\n    }\r\n    else {\r\n        const supportedElements = [isBlockPluginLoaded ? 'imageBlock' : null, isInlinePluginLoaded ? 'imageInline' : null];\r\n        // Check if the option is supported by any of the loaded plugins.\r\n        if (!modelElements.some(elementName => supportedElements.includes(elementName))) {\r\n            /**\r\n             * In order to work correctly, each image style {@link module:image/imageconfig~ImageStyleOptionDefinition option}\r\n             * requires specific model elements (also: types of images) to be supported by the editor.\r\n             *\r\n             * Model element names to which the image style option can be applied are defined in the\r\n             * {@link module:image/imageconfig~ImageStyleOptionDefinition#modelElements} property of the style option\r\n             * definition.\r\n             *\r\n             * Explore the warning in the console to find out precisely which option is not supported and which editor plugins\r\n             * are missing. Make sure these plugins are loaded in your editor to get this image style option working.\r\n             *\r\n             * @error image-style-missing-dependency\r\n             * @param {String} [option] The name of the unsupported option.\r\n             * @param {String} [missingPlugins] The names of the plugins one of which has to be loaded for the particular option.\r\n             */\r\n            logWarning('image-style-missing-dependency', {\r\n                style: option,\r\n                missingPlugins: modelElements.map(name => name === 'imageBlock' ? 'ImageBlockEditing' : 'ImageInlineEditing')\r\n            });\r\n            return false;\r\n        }\r\n    }\r\n    return true;\r\n}\r\n/**\r\n * Extends the default style with a style provided by the developer.\r\n * Note: Don't override the custom–defined style object, clone it instead.\r\n */\r\nfunction extendStyle(source, style) {\r\n    const extendedStyle = { ...style };\r\n    for (const prop in source) {\r\n        if (!Object.prototype.hasOwnProperty.call(style, prop)) {\r\n            extendedStyle[prop] = source[prop];\r\n        }\r\n    }\r\n    return extendedStyle;\r\n}\r\n/**\r\n * Displays a console warning with the 'image-style-configuration-definition-invalid' error.\r\n */\r\nfunction warnInvalidStyle(info) {\r\n    /**\r\n     * The image style definition provided in the configuration is invalid.\r\n     *\r\n     * Please make sure the definition implements properly one of the following:\r\n     *\r\n     * * {@link module:image/imageconfig~ImageStyleOptionDefinition image style option definition},\r\n     * * {@link module:image/imageconfig~ImageStyleDropdownDefinition image style dropdown definition}\r\n     *\r\n     * @error image-style-configuration-definition-invalid\r\n     * @param {String} [dropdown] The name of the invalid drop-down\r\n     * @param {String} [style] The name of the invalid image style option\r\n     */\r\n    logWarning('image-style-configuration-definition-invalid', info);\r\n}\r\nexport default {\r\n    normalizeStyles,\r\n    getDefaultStylesConfiguration,\r\n    getDefaultDropdownDefinitions,\r\n    warnInvalidStyle,\r\n    DEFAULT_OPTIONS,\r\n    DEFAULT_ICONS,\r\n    DEFAULT_DROPDOWN_DEFINITIONS\r\n};\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { first } from 'ckeditor5/src/utils';\r\n/**\r\n * @module image/imagestyle/converters\r\n */\r\n/**\r\n * Returns a converter for the `imageStyle` attribute. It can be used for adding, changing and removing the attribute.\r\n *\r\n * @param styles An array containing available image style options.\r\n * @returns A model-to-view attribute converter.\r\n */\r\nexport function modelToViewStyleAttribute(styles) {\r\n    return (evt, data, conversionApi) => {\r\n        if (!conversionApi.consumable.consume(data.item, evt.name)) {\r\n            return;\r\n        }\r\n        // Check if there is class name associated with given value.\r\n        const newStyle = getStyleDefinitionByName(data.attributeNewValue, styles);\r\n        const oldStyle = getStyleDefinitionByName(data.attributeOldValue, styles);\r\n        const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n        const viewWriter = conversionApi.writer;\r\n        if (oldStyle) {\r\n            viewWriter.removeClass(oldStyle.className, viewElement);\r\n        }\r\n        if (newStyle) {\r\n            viewWriter.addClass(newStyle.className, viewElement);\r\n        }\r\n    };\r\n}\r\n/**\r\n * Returns a view-to-model converter converting image CSS classes to a proper value in the model.\r\n *\r\n * @param styles Image style options for which the converter is created.\r\n * @returns A view-to-model converter.\r\n */\r\nexport function viewToModelStyleAttribute(styles) {\r\n    // Convert only non–default styles.\r\n    const nonDefaultStyles = {\r\n        imageInline: styles.filter(style => !style.isDefault && style.modelElements.includes('imageInline')),\r\n        imageBlock: styles.filter(style => !style.isDefault && style.modelElements.includes('imageBlock'))\r\n    };\r\n    return (evt, data, conversionApi) => {\r\n        if (!data.modelRange) {\r\n            return;\r\n        }\r\n        const viewElement = data.viewItem;\r\n        const modelImageElement = first(data.modelRange.getItems());\r\n        // Run this converter only if an image has been found in the model.\r\n        // In some cases it may not be found (for example if we run this on a figure with different type than image).\r\n        if (!modelImageElement) {\r\n            return;\r\n        }\r\n        // ...and the `imageStyle` attribute is allowed for that element, otherwise stop conversion early.\r\n        if (!conversionApi.schema.checkAttribute(modelImageElement, 'imageStyle')) {\r\n            return;\r\n        }\r\n        // Convert styles one by one.\r\n        for (const style of nonDefaultStyles[modelImageElement.name]) {\r\n            // Try to consume class corresponding with the style.\r\n            if (conversionApi.consumable.consume(viewElement, { classes: style.className })) {\r\n                // And convert this style to model attribute.\r\n                conversionApi.writer.setAttribute('imageStyle', style.name, modelImageElement);\r\n            }\r\n        }\r\n    };\r\n}\r\n/**\r\n * Returns the style with a given `name` from an array of styles.\r\n */\r\nfunction getStyleDefinitionByName(name, styles) {\r\n    for (const style of styles) {\r\n        if (style.name === name) {\r\n            return style;\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imagestyle/imagestyleediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport ImageStyleCommand from './imagestylecommand';\r\nimport ImageUtils from '../imageutils';\r\nimport utils from './utils';\r\nimport { viewToModelStyleAttribute, modelToViewStyleAttribute } from './converters';\r\n/**\r\n * The image style engine plugin. It sets the default configuration, creates converters and registers\r\n * {@link module:image/imagestyle/imagestylecommand~ImageStyleCommand ImageStyleCommand}.\r\n */\r\nexport default class ImageStyleEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageStyleEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ImageUtils];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const { normalizeStyles, getDefaultStylesConfiguration } = utils;\r\n        const editor = this.editor;\r\n        const isBlockPluginLoaded = editor.plugins.has('ImageBlockEditing');\r\n        const isInlinePluginLoaded = editor.plugins.has('ImageInlineEditing');\r\n        editor.config.define('image.styles', getDefaultStylesConfiguration(isBlockPluginLoaded, isInlinePluginLoaded));\r\n        this.normalizedStyles = normalizeStyles({\r\n            configuredStyles: editor.config.get('image.styles'),\r\n            isBlockPluginLoaded,\r\n            isInlinePluginLoaded\r\n        });\r\n        this._setupConversion(isBlockPluginLoaded, isInlinePluginLoaded);\r\n        this._setupPostFixer();\r\n        // Register imageStyle command.\r\n        editor.commands.add('imageStyle', new ImageStyleCommand(editor, this.normalizedStyles));\r\n    }\r\n    /**\r\n     * Sets the editor conversion taking the presence of\r\n     * {@link module:image/image/imageinlineediting~ImageInlineEditing `ImageInlineEditing`}\r\n     * and {@link module:image/image/imageblockediting~ImageBlockEditing `ImageBlockEditing`} plugins into consideration.\r\n     */\r\n    _setupConversion(isBlockPluginLoaded, isInlinePluginLoaded) {\r\n        const editor = this.editor;\r\n        const schema = editor.model.schema;\r\n        const modelToViewConverter = modelToViewStyleAttribute(this.normalizedStyles);\r\n        const viewToModelConverter = viewToModelStyleAttribute(this.normalizedStyles);\r\n        editor.editing.downcastDispatcher.on('attribute:imageStyle', modelToViewConverter);\r\n        editor.data.downcastDispatcher.on('attribute:imageStyle', modelToViewConverter);\r\n        // Allow imageStyle attribute in image and imageInline.\r\n        // We could call it 'style' but https://github.com/ckeditor/ckeditor5-engine/issues/559.\r\n        if (isBlockPluginLoaded) {\r\n            schema.extend('imageBlock', { allowAttributes: 'imageStyle' });\r\n            // Converter for figure element from view to model.\r\n            editor.data.upcastDispatcher.on('element:figure', viewToModelConverter, { priority: 'low' });\r\n        }\r\n        if (isInlinePluginLoaded) {\r\n            schema.extend('imageInline', { allowAttributes: 'imageStyle' });\r\n            // Converter for the img element from view to model.\r\n            editor.data.upcastDispatcher.on('element:img', viewToModelConverter, { priority: 'low' });\r\n        }\r\n    }\r\n    /**\r\n     * Registers a post-fixer that will make sure that the style attribute value is correct for a specific image type (block vs inline).\r\n     */\r\n    _setupPostFixer() {\r\n        const editor = this.editor;\r\n        const document = editor.model.document;\r\n        const imageUtils = editor.plugins.get(ImageUtils);\r\n        const stylesMap = new Map(this.normalizedStyles.map(style => [style.name, style]));\r\n        // Make sure that style attribute is valid for the image type.\r\n        document.registerPostFixer(writer => {\r\n            let changed = false;\r\n            for (const change of document.differ.getChanges()) {\r\n                if (change.type == 'insert' || change.type == 'attribute' && change.attributeKey == 'imageStyle') {\r\n                    let element = change.type == 'insert' ? change.position.nodeAfter : change.range.start.nodeAfter;\r\n                    if (element && element.is('element', 'paragraph') && element.childCount > 0) {\r\n                        element = element.getChild(0);\r\n                    }\r\n                    if (!imageUtils.isImage(element)) {\r\n                        continue;\r\n                    }\r\n                    const imageStyle = element.getAttribute('imageStyle');\r\n                    if (!imageStyle) {\r\n                        continue;\r\n                    }\r\n                    const imageStyleDefinition = stylesMap.get(imageStyle);\r\n                    if (!imageStyleDefinition || !imageStyleDefinition.modelElements.includes(element.name)) {\r\n                        writer.removeAttribute('imageStyle', element);\r\n                        changed = true;\r\n                    }\r\n                }\r\n            }\r\n            return changed;\r\n        });\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./imagestyle.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imagestyle/imagestyleui\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { ButtonView, createDropdown, addToolbarToDropdown, SplitButtonView } from 'ckeditor5/src/ui';\r\nimport { isObject, identity } from 'lodash-es';\r\nimport ImageStyleEditing from './imagestyleediting';\r\nimport utils from './utils';\r\nimport '../../theme/imagestyle.css';\r\n/**\r\n * The image style UI plugin.\r\n *\r\n * It registers buttons corresponding to the {@link module:image/imageconfig~ImageConfig#styles} configuration.\r\n * It also registers the {@link module:image/imagestyle/utils#DEFAULT_DROPDOWN_DEFINITIONS default drop-downs} and the\r\n * custom drop-downs defined by the developer in the {@link module:image/imageconfig~ImageConfig#toolbar} configuration.\r\n */\r\nexport default class ImageStyleUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ImageStyleEditing];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageStyleUI';\r\n    }\r\n    /**\r\n     * Returns the default localized style titles provided by the plugin.\r\n     *\r\n     * The following localized titles corresponding with\r\n     * {@link module:image/imagestyle/utils#DEFAULT_OPTIONS} are available:\r\n     *\r\n     * * `'Wrap text'`,\r\n     * * `'Break text'`,\r\n     * * `'In line'`,\r\n     * * `'Full size image'`,\r\n     * * `'Side image'`,\r\n     * * `'Left aligned image'`,\r\n     * * `'Centered image'`,\r\n     * * `'Right aligned image'`\r\n     */\r\n    get localizedDefaultStylesTitles() {\r\n        const t = this.editor.t;\r\n        return {\r\n            'Wrap text': t('Wrap text'),\r\n            'Break text': t('Break text'),\r\n            'In line': t('In line'),\r\n            'Full size image': t('Full size image'),\r\n            'Side image': t('Side image'),\r\n            'Left aligned image': t('Left aligned image'),\r\n            'Centered image': t('Centered image'),\r\n            'Right aligned image': t('Right aligned image')\r\n        };\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const plugins = this.editor.plugins;\r\n        const toolbarConfig = this.editor.config.get('image.toolbar') || [];\r\n        const imageStyleEditing = plugins.get('ImageStyleEditing');\r\n        const definedStyles = translateStyles(imageStyleEditing.normalizedStyles, this.localizedDefaultStylesTitles);\r\n        for (const styleConfig of definedStyles) {\r\n            this._createButton(styleConfig);\r\n        }\r\n        const definedDropdowns = translateStyles([\r\n            ...toolbarConfig.filter(isObject),\r\n            ...utils.getDefaultDropdownDefinitions(plugins)\r\n        ], this.localizedDefaultStylesTitles);\r\n        for (const dropdownConfig of definedDropdowns) {\r\n            this._createDropdown(dropdownConfig, definedStyles);\r\n        }\r\n    }\r\n    /**\r\n     * Creates a dropdown and stores it in the editor {@link module:ui/componentfactory~ComponentFactory}.\r\n     */\r\n    _createDropdown(dropdownConfig, definedStyles) {\r\n        const factory = this.editor.ui.componentFactory;\r\n        factory.add(dropdownConfig.name, locale => {\r\n            let defaultButton;\r\n            const { defaultItem, items, title } = dropdownConfig;\r\n            const buttonViews = items\r\n                .filter(itemName => definedStyles.find(({ name }) => getUIComponentName(name) === itemName))\r\n                .map(buttonName => {\r\n                const button = factory.create(buttonName);\r\n                if (buttonName === defaultItem) {\r\n                    defaultButton = button;\r\n                }\r\n                return button;\r\n            });\r\n            if (items.length !== buttonViews.length) {\r\n                utils.warnInvalidStyle({ dropdown: dropdownConfig });\r\n            }\r\n            const dropdownView = createDropdown(locale, SplitButtonView);\r\n            const splitButtonView = dropdownView.buttonView;\r\n            const splitButtonViewArrow = splitButtonView.arrowView;\r\n            addToolbarToDropdown(dropdownView, buttonViews, { enableActiveItemFocusOnDropdownOpen: true });\r\n            splitButtonView.set({\r\n                label: getDropdownButtonTitle(title, defaultButton.label),\r\n                class: null,\r\n                tooltip: true\r\n            });\r\n            splitButtonViewArrow.unbind('label');\r\n            splitButtonViewArrow.set({\r\n                label: title\r\n            });\r\n            splitButtonView.bind('icon').toMany(buttonViews, 'isOn', (...areOn) => {\r\n                const index = areOn.findIndex(identity);\r\n                return (index < 0) ? defaultButton.icon : buttonViews[index].icon;\r\n            });\r\n            splitButtonView.bind('label').toMany(buttonViews, 'isOn', (...areOn) => {\r\n                const index = areOn.findIndex(identity);\r\n                return getDropdownButtonTitle(title, (index < 0) ? defaultButton.label : buttonViews[index].label);\r\n            });\r\n            splitButtonView.bind('isOn').toMany(buttonViews, 'isOn', (...areOn) => areOn.some(identity));\r\n            splitButtonView.bind('class')\r\n                .toMany(buttonViews, 'isOn', (...areOn) => areOn.some(identity) ? 'ck-splitbutton_flatten' : undefined);\r\n            splitButtonView.on('execute', () => {\r\n                if (!buttonViews.some(({ isOn }) => isOn)) {\r\n                    defaultButton.fire('execute');\r\n                }\r\n                else {\r\n                    dropdownView.isOpen = !dropdownView.isOpen;\r\n                }\r\n            });\r\n            dropdownView.bind('isEnabled')\r\n                .toMany(buttonViews, 'isEnabled', (...areEnabled) => areEnabled.some(identity));\r\n            // Focus the editable after executing the command.\r\n            // Overrides a default behaviour where the focus is moved to the dropdown button (#12125).\r\n            this.listenTo(dropdownView, 'execute', () => {\r\n                this.editor.editing.view.focus();\r\n            });\r\n            return dropdownView;\r\n        });\r\n    }\r\n    /**\r\n     * Creates a button and stores it in the editor {@link module:ui/componentfactory~ComponentFactory}.\r\n     */\r\n    _createButton(buttonConfig) {\r\n        const buttonName = buttonConfig.name;\r\n        this.editor.ui.componentFactory.add(getUIComponentName(buttonName), locale => {\r\n            const command = this.editor.commands.get('imageStyle');\r\n            const view = new ButtonView(locale);\r\n            view.set({\r\n                label: buttonConfig.title,\r\n                icon: buttonConfig.icon,\r\n                tooltip: true,\r\n                isToggleable: true\r\n            });\r\n            view.bind('isEnabled').to(command, 'isEnabled');\r\n            view.bind('isOn').to(command, 'value', value => value === buttonName);\r\n            view.on('execute', this._executeCommand.bind(this, buttonName));\r\n            return view;\r\n        });\r\n    }\r\n    _executeCommand(name) {\r\n        this.editor.execute('imageStyle', { value: name });\r\n        this.editor.editing.view.focus();\r\n    }\r\n}\r\n/**\r\n * Returns the translated `title` from the passed styles array.\r\n */\r\nfunction translateStyles(styles, titles) {\r\n    for (const style of styles) {\r\n        // Localize the titles of the styles, if a title corresponds with\r\n        // a localized default provided by the plugin.\r\n        if (titles[style.title]) {\r\n            style.title = titles[style.title];\r\n        }\r\n    }\r\n    return styles;\r\n}\r\n/**\r\n * Returns the image style component name with the \"imageStyle:\" prefix.\r\n */\r\nfunction getUIComponentName(name) {\r\n    return `imageStyle:${name}`;\r\n}\r\n/**\r\n * Returns title for the splitbutton containing the dropdown title and default action item title.\r\n */\r\nfunction getDropdownButtonTitle(dropdownTitle, buttonTitle) {\r\n    return (dropdownTitle ? dropdownTitle + ': ' : '') + buttonTitle;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module indent/indentediting\r\n */\r\nimport { Plugin, MultiCommand } from 'ckeditor5/src/core';\r\n/**\r\n * The indent editing feature.\r\n *\r\n * This plugin registers the `'indent'` and `'outdent'` commands.\r\n *\r\n * **Note**: In order for the commands to work, at least one of the compatible features is required. Read more in the\r\n * {@link module:indent/indent~Indent indent feature} API documentation.\r\n */\r\nexport default class IndentEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'IndentEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        editor.commands.add('indent', new MultiCommand(editor));\r\n        editor.commands.add('outdent', new MultiCommand(editor));\r\n    }\r\n}\r\n","export default \"<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>\";","export default \"<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>\";","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module indent/indentui\r\n */\r\nimport { ButtonView } from 'ckeditor5/src/ui';\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport indentIcon from '../theme/icons/indent.svg';\r\nimport outdentIcon from '../theme/icons/outdent.svg';\r\n/**\r\n * The indent UI feature.\r\n *\r\n * This plugin registers the `'indent'` and `'outdent'` buttons.\r\n *\r\n * **Note**: In order for the commands to work, at least one of the compatible features is required. Read more in\r\n * the {@link module:indent/indent~Indent indent feature} API documentation.\r\n */\r\nexport default class IndentUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'IndentUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const locale = editor.locale;\r\n        const t = editor.t;\r\n        const localizedIndentIcon = locale.uiLanguageDirection == 'ltr' ? indentIcon : outdentIcon;\r\n        const localizedOutdentIcon = locale.uiLanguageDirection == 'ltr' ? outdentIcon : indentIcon;\r\n        this._defineButton('indent', t('Increase indent'), localizedIndentIcon);\r\n        this._defineButton('outdent', t('Decrease indent'), localizedOutdentIcon);\r\n    }\r\n    /**\r\n     * Defines a UI button.\r\n     */\r\n    _defineButton(commandName, label, icon) {\r\n        const editor = this.editor;\r\n        editor.ui.componentFactory.add(commandName, locale => {\r\n            const command = editor.commands.get(commandName);\r\n            const view = new ButtonView(locale);\r\n            view.set({\r\n                label,\r\n                icon,\r\n                tooltip: true\r\n            });\r\n            view.bind('isEnabled').to(command, 'isEnabled');\r\n            this.listenTo(view, 'execute', () => {\r\n                editor.execute(commandName);\r\n                editor.editing.view.focus();\r\n            });\r\n            return view;\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module indent/indentblockcommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { first } from 'ckeditor5/src/utils';\r\n/**\r\n * The indent block command.\r\n *\r\n * The command is registered by the {@link module:indent/indentblock~IndentBlock} as `'indentBlock'` for indenting blocks and\r\n * `'outdentBlock'` for outdenting blocks.\r\n *\r\n * To increase block indentation at the current selection, execute the command:\r\n *\r\n * ```ts\r\n * editor.execute( 'indentBlock' );\r\n * ```\r\n *\r\n * To decrease block indentation at the current selection, execute the command:\r\n *\r\n * ```ts\r\n * editor.execute( 'outdentBlock' );\r\n * ```\r\n */\r\nexport default class IndentBlockCommand extends Command {\r\n    /**\r\n     * Creates an instance of the command.\r\n     */\r\n    constructor(editor, indentBehavior) {\r\n        super(editor);\r\n        this._indentBehavior = indentBehavior;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        // Check whether any of the position's ancestors is a list item.\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const block = first(model.document.selection.getSelectedBlocks());\r\n        if (!block || !model.schema.checkAttribute(block, 'blockIndent')) {\r\n            this.isEnabled = false;\r\n            return;\r\n        }\r\n        this.isEnabled = this._indentBehavior.checkEnabled(block.getAttribute('blockIndent'));\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    execute() {\r\n        const model = this.editor.model;\r\n        const blocksToChange = getBlocksToChange(model);\r\n        model.change(writer => {\r\n            for (const block of blocksToChange) {\r\n                const currentIndent = block.getAttribute('blockIndent');\r\n                const nextIndent = this._indentBehavior.getNextIndent(currentIndent);\r\n                if (nextIndent) {\r\n                    writer.setAttribute('blockIndent', nextIndent, block);\r\n                }\r\n                else {\r\n                    writer.removeAttribute('blockIndent', block);\r\n                }\r\n            }\r\n        });\r\n    }\r\n}\r\n/**\r\n * Returns blocks from selection that should have blockIndent selection set.\r\n */\r\nfunction getBlocksToChange(model) {\r\n    const selection = model.document.selection;\r\n    const schema = model.schema;\r\n    const blocksInSelection = Array.from(selection.getSelectedBlocks());\r\n    return blocksInSelection.filter(block => schema.checkAttribute(block, 'blockIndent'));\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * The block indentation behavior that uses offsets to set indentation.\r\n */\r\nexport default class IndentUsingOffset {\r\n    /**\r\n     * Creates an instance of the indentation behavior.\r\n     *\r\n     * @param config.direction The direction of indentation.\r\n     * @param config.offset The offset of the next indentation step.\r\n     * @param config.unit Indentation unit.\r\n     */\r\n    constructor(config) {\r\n        this.isForward = config.direction === 'forward';\r\n        this.offset = config.offset;\r\n        this.unit = config.unit;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    checkEnabled(indentAttributeValue) {\r\n        const currentOffset = parseFloat(indentAttributeValue || '0');\r\n        // The command is always enabled for forward indentation.\r\n        return this.isForward || currentOffset > 0;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    getNextIndent(indentAttributeValue) {\r\n        const currentOffset = parseFloat(indentAttributeValue || '0');\r\n        const isSameUnit = !indentAttributeValue || indentAttributeValue.endsWith(this.unit);\r\n        if (!isSameUnit) {\r\n            return this.isForward ? this.offset + this.unit : undefined;\r\n        }\r\n        const nextOffset = this.isForward ? this.offset : -this.offset;\r\n        const offsetToSet = currentOffset + nextOffset;\r\n        return offsetToSet > 0 ? offsetToSet + this.unit : undefined;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * The block indentation behavior that uses classes to set indentation.\r\n */\r\nexport default class IndentUsingClasses {\r\n    /**\r\n     * Creates an instance of the indentation behavior.\r\n     *\r\n     * @param config.direction The direction of indentation.\r\n     * @param config.classes A list of classes used for indentation.\r\n     */\r\n    constructor(config) {\r\n        this.isForward = config.direction === 'forward';\r\n        this.classes = config.classes;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    checkEnabled(indentAttributeValue) {\r\n        const currentIndex = this.classes.indexOf(indentAttributeValue);\r\n        if (this.isForward) {\r\n            return currentIndex < this.classes.length - 1;\r\n        }\r\n        else {\r\n            return currentIndex >= 0;\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    getNextIndent(indentAttributeValue) {\r\n        const currentIndex = this.classes.indexOf(indentAttributeValue);\r\n        const indexStep = this.isForward ? 1 : -1;\r\n        return this.classes[currentIndex + indexStep];\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module indent/indentblock\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { addMarginRules } from 'ckeditor5/src/engine';\r\nimport IndentBlockCommand from './indentblockcommand';\r\nimport IndentUsingOffset from './indentcommandbehavior/indentusingoffset';\r\nimport IndentUsingClasses from './indentcommandbehavior/indentusingclasses';\r\nconst DEFAULT_ELEMENTS = ['paragraph', 'heading1', 'heading2', 'heading3', 'heading4', 'heading5', 'heading6'];\r\n/**\r\n * The block indentation feature.\r\n *\r\n * It registers the `'indentBlock'` and `'outdentBlock'` commands.\r\n *\r\n * If the plugin {@link module:indent/indent~Indent} is defined, it also attaches the `'indentBlock'` and `'outdentBlock'` commands to\r\n * the `'indent'` and `'outdent'` commands.\r\n */\r\nexport default class IndentBlock extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        editor.config.define('indentBlock', {\r\n            offset: 40,\r\n            unit: 'px'\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'IndentBlock';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const configuration = editor.config.get('indentBlock');\r\n        if (configuration.classes && configuration.classes.length) {\r\n            this._setupConversionUsingClasses(configuration.classes);\r\n            editor.commands.add('indentBlock', new IndentBlockCommand(editor, new IndentUsingClasses({\r\n                direction: 'forward',\r\n                classes: configuration.classes\r\n            })));\r\n            editor.commands.add('outdentBlock', new IndentBlockCommand(editor, new IndentUsingClasses({\r\n                direction: 'backward',\r\n                classes: configuration.classes\r\n            })));\r\n        }\r\n        else {\r\n            editor.data.addStyleProcessorRules(addMarginRules);\r\n            this._setupConversionUsingOffset();\r\n            editor.commands.add('indentBlock', new IndentBlockCommand(editor, new IndentUsingOffset({\r\n                direction: 'forward',\r\n                offset: configuration.offset,\r\n                unit: configuration.unit\r\n            })));\r\n            editor.commands.add('outdentBlock', new IndentBlockCommand(editor, new IndentUsingOffset({\r\n                direction: 'backward',\r\n                offset: configuration.offset,\r\n                unit: configuration.unit\r\n            })));\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    afterInit() {\r\n        const editor = this.editor;\r\n        const schema = editor.model.schema;\r\n        const indentCommand = editor.commands.get('indent');\r\n        const outdentCommand = editor.commands.get('outdent');\r\n        // Enable block indentation to heading configuration options. If it is not defined enable in paragraph and default headings.\r\n        const options = editor.config.get('heading.options');\r\n        const configuredElements = options && options.map(option => option.model);\r\n        const knownElements = configuredElements || DEFAULT_ELEMENTS;\r\n        knownElements.forEach(elementName => {\r\n            if (schema.isRegistered(elementName)) {\r\n                schema.extend(elementName, { allowAttributes: 'blockIndent' });\r\n            }\r\n        });\r\n        schema.setAttributeProperties('blockIndent', { isFormatting: true });\r\n        indentCommand.registerChildCommand(editor.commands.get('indentBlock'));\r\n        outdentCommand.registerChildCommand(editor.commands.get('outdentBlock'));\r\n    }\r\n    /**\r\n     * Setups conversion for using offset indents.\r\n     */\r\n    _setupConversionUsingOffset() {\r\n        const conversion = this.editor.conversion;\r\n        const locale = this.editor.locale;\r\n        const marginProperty = locale.contentLanguageDirection === 'rtl' ? 'margin-right' : 'margin-left';\r\n        conversion.for('upcast').attributeToAttribute({\r\n            view: {\r\n                styles: {\r\n                    [marginProperty]: /[\\s\\S]+/\r\n                }\r\n            },\r\n            model: {\r\n                key: 'blockIndent',\r\n                value: (viewElement) => viewElement.getStyle(marginProperty)\r\n            }\r\n        });\r\n        conversion.for('downcast').attributeToAttribute({\r\n            model: 'blockIndent',\r\n            view: modelAttributeValue => {\r\n                return {\r\n                    key: 'style',\r\n                    value: {\r\n                        [marginProperty]: modelAttributeValue\r\n                    }\r\n                };\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Setups conversion for using classes.\r\n     */\r\n    _setupConversionUsingClasses(classes) {\r\n        const definition = {\r\n            model: {\r\n                key: 'blockIndent',\r\n                values: []\r\n            },\r\n            view: {}\r\n        };\r\n        for (const className of classes) {\r\n            definition.model.values.push(className);\r\n            definition.view[className] = {\r\n                key: 'class',\r\n                value: [className]\r\n            };\r\n        }\r\n        this.editor.conversion.attributeToAttribute(definition);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module basic-styles/italic/italicediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport AttributeCommand from '../attributecommand';\r\nconst ITALIC = 'italic';\r\n/**\r\n * The italic editing feature.\r\n *\r\n * It registers the `'italic'` command, the <kbd>Ctrl+I</kbd> keystroke and introduces the `italic` attribute in the model\r\n * which renders to the view as an `<i>` element.\r\n */\r\nexport default class ItalicEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ItalicEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        // Allow italic attribute on text nodes.\r\n        editor.model.schema.extend('$text', { allowAttributes: ITALIC });\r\n        editor.model.schema.setAttributeProperties(ITALIC, {\r\n            isFormatting: true,\r\n            copyOnEnter: true\r\n        });\r\n        editor.conversion.attributeToElement({\r\n            model: ITALIC,\r\n            view: 'i',\r\n            upcastAlso: [\r\n                'em',\r\n                {\r\n                    styles: {\r\n                        'font-style': 'italic'\r\n                    }\r\n                }\r\n            ]\r\n        });\r\n        // Create italic command.\r\n        editor.commands.add(ITALIC, new AttributeCommand(editor, ITALIC));\r\n        // Set the Ctrl+I keystroke.\r\n        editor.keystrokes.set('CTRL+I', ITALIC);\r\n    }\r\n}\r\n","export default \"<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>\";","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module basic-styles/italic/italicui\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { ButtonView } from 'ckeditor5/src/ui';\r\nimport italicIcon from '../../theme/icons/italic.svg';\r\nconst ITALIC = 'italic';\r\n/**\r\n * The italic UI feature. It introduces the Italic button.\r\n */\r\nexport default class ItalicUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ItalicUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        // Add bold button to feature components.\r\n        editor.ui.componentFactory.add(ITALIC, locale => {\r\n            const command = editor.commands.get(ITALIC);\r\n            const view = new ButtonView(locale);\r\n            view.set({\r\n                label: t('Italic'),\r\n                icon: italicIcon,\r\n                keystroke: 'CTRL+I',\r\n                tooltip: true,\r\n                isToggleable: true\r\n            });\r\n            view.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\r\n            // Execute command.\r\n            this.listenTo(view, 'execute', () => {\r\n                editor.execute(ITALIC);\r\n                editor.editing.view.focus();\r\n            });\r\n            return view;\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module link/utils/automaticdecorators\r\n */\r\nimport { toMap } from 'ckeditor5/src/utils';\r\n/**\r\n * Helper class that ties together all {@link module:link/linkconfig~LinkDecoratorAutomaticDefinition} and provides\r\n * the {@link module:engine/conversion/downcasthelpers~DowncastHelpers#attributeToElement downcast dispatchers} for them.\r\n */\r\nexport default class AutomaticDecorators {\r\n    constructor() {\r\n        /**\r\n         * Stores the definition of {@link module:link/linkconfig~LinkDecoratorAutomaticDefinition automatic decorators}.\r\n         * This data is used as a source for a downcast dispatcher to create a proper conversion to output data.\r\n         */\r\n        this._definitions = new Set();\r\n    }\r\n    /**\r\n     * Gives information about the number of decorators stored in the {@link module:link/utils/automaticdecorators~AutomaticDecorators}\r\n     * instance.\r\n     */\r\n    get length() {\r\n        return this._definitions.size;\r\n    }\r\n    /**\r\n     * Adds automatic decorator objects or an array with them to be used during downcasting.\r\n     *\r\n     * @param item A configuration object of automatic rules for decorating links. It might also be an array of such objects.\r\n     */\r\n    add(item) {\r\n        if (Array.isArray(item)) {\r\n            item.forEach(item => this._definitions.add(item));\r\n        }\r\n        else {\r\n            this._definitions.add(item);\r\n        }\r\n    }\r\n    /**\r\n     * Provides the conversion helper used in the {@link module:engine/conversion/downcasthelpers~DowncastHelpers#add} method.\r\n     *\r\n     * @returns A dispatcher function used as conversion helper in {@link module:engine/conversion/downcasthelpers~DowncastHelpers#add}.\r\n     */\r\n    getDispatcher() {\r\n        return dispatcher => {\r\n            dispatcher.on('attribute:linkHref', (evt, data, conversionApi) => {\r\n                // There is only test as this behavior decorates links and\r\n                // it is run before dispatcher which actually consumes this node.\r\n                // This allows on writing own dispatcher with highest priority,\r\n                // which blocks both native converter and this additional decoration.\r\n                if (!conversionApi.consumable.test(data.item, 'attribute:linkHref')) {\r\n                    return;\r\n                }\r\n                // Automatic decorators for block links are handled e.g. in LinkImageEditing.\r\n                if (!(data.item.is('selection') || conversionApi.schema.isInline(data.item))) {\r\n                    return;\r\n                }\r\n                const viewWriter = conversionApi.writer;\r\n                const viewSelection = viewWriter.document.selection;\r\n                for (const item of this._definitions) {\r\n                    const viewElement = viewWriter.createAttributeElement('a', item.attributes, {\r\n                        priority: 5\r\n                    });\r\n                    if (item.classes) {\r\n                        viewWriter.addClass(item.classes, viewElement);\r\n                    }\r\n                    for (const key in item.styles) {\r\n                        viewWriter.setStyle(key, item.styles[key], viewElement);\r\n                    }\r\n                    viewWriter.setCustomProperty('link', true, viewElement);\r\n                    if (item.callback(data.attributeNewValue)) {\r\n                        if (data.item.is('selection')) {\r\n                            viewWriter.wrap(viewSelection.getFirstRange(), viewElement);\r\n                        }\r\n                        else {\r\n                            viewWriter.wrap(conversionApi.mapper.toViewRange(data.range), viewElement);\r\n                        }\r\n                    }\r\n                    else {\r\n                        viewWriter.unwrap(conversionApi.mapper.toViewRange(data.range), viewElement);\r\n                    }\r\n                }\r\n            }, { priority: 'high' });\r\n        };\r\n    }\r\n    /**\r\n     * Provides the conversion helper used in the {@link module:engine/conversion/downcasthelpers~DowncastHelpers#add} method\r\n     * when linking images.\r\n     *\r\n     * @returns A dispatcher function used as conversion helper in {@link module:engine/conversion/downcasthelpers~DowncastHelpers#add}.\r\n     */\r\n    getDispatcherForLinkedImage() {\r\n        return dispatcher => {\r\n            dispatcher.on('attribute:linkHref:imageBlock', (evt, data, { writer, mapper }) => {\r\n                const viewFigure = mapper.toViewElement(data.item);\r\n                const linkInImage = Array.from(viewFigure.getChildren())\r\n                    .find((child) => child.is('element', 'a'));\r\n                for (const item of this._definitions) {\r\n                    const attributes = toMap(item.attributes);\r\n                    if (item.callback(data.attributeNewValue)) {\r\n                        for (const [key, val] of attributes) {\r\n                            // Left for backward compatibility. Since v30 decorator should\r\n                            // accept `classes` and `styles` separately from `attributes`.\r\n                            if (key === 'class') {\r\n                                writer.addClass(val, linkInImage);\r\n                            }\r\n                            else {\r\n                                writer.setAttribute(key, val, linkInImage);\r\n                            }\r\n                        }\r\n                        if (item.classes) {\r\n                            writer.addClass(item.classes, linkInImage);\r\n                        }\r\n                        for (const key in item.styles) {\r\n                            writer.setStyle(key, item.styles[key], linkInImage);\r\n                        }\r\n                    }\r\n                    else {\r\n                        for (const [key, val] of attributes) {\r\n                            if (key === 'class') {\r\n                                writer.removeClass(val, linkInImage);\r\n                            }\r\n                            else {\r\n                                writer.removeAttribute(key, linkInImage);\r\n                            }\r\n                        }\r\n                        if (item.classes) {\r\n                            writer.removeClass(item.classes, linkInImage);\r\n                        }\r\n                        for (const key in item.styles) {\r\n                            writer.removeStyle(key, linkInImage);\r\n                        }\r\n                    }\r\n                }\r\n            });\r\n        };\r\n    }\r\n}\r\n","import baseSlice from './_baseSlice.js';\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n  var length = array.length;\n  end = end === undefined ? length : end;\n  return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\nexport default castSlice;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n    rsComboMarksRange = '\\\\u0300-\\\\u036f',\n    reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n    rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n    rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsZWJ = '\\\\u200d';\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n  return reHasUnicode.test(string);\n}\n\nexport default hasUnicode;\n","/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n  return string.split('');\n}\n\nexport default asciiToArray;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n    rsComboMarksRange = '\\\\u0300-\\\\u036f',\n    reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n    rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n    rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n    rsCombo = '[' + rsComboRange + ']',\n    rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n    rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n    rsNonAstral = '[^' + rsAstralRange + ']',\n    rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n    rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n    rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n    rsOptVar = '[' + rsVarRange + ']?',\n    rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n    rsSeq = rsOptVar + reOptMod + rsOptJoin,\n    rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction unicodeToArray(string) {\n  return string.match(reUnicode) || [];\n}\n\nexport default unicodeToArray;\n","import asciiToArray from './_asciiToArray.js';\nimport hasUnicode from './_hasUnicode.js';\nimport unicodeToArray from './_unicodeToArray.js';\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n  return hasUnicode(string)\n    ? unicodeToArray(string)\n    : asciiToArray(string);\n}\n\nexport default stringToArray;\n","import createCaseFirst from './_createCaseFirst.js';\n\n/**\n * Converts the first character of `string` to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.upperFirst('fred');\n * // => 'Fred'\n *\n * _.upperFirst('FRED');\n * // => 'FRED'\n */\nvar upperFirst = createCaseFirst('toUpperCase');\n\nexport default upperFirst;\n","import castSlice from './_castSlice.js';\nimport hasUnicode from './_hasUnicode.js';\nimport stringToArray from './_stringToArray.js';\nimport toString from './toString.js';\n\n/**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */\nfunction createCaseFirst(methodName) {\n  return function(string) {\n    string = toString(string);\n\n    var strSymbols = hasUnicode(string)\n      ? stringToArray(string)\n      : undefined;\n\n    var chr = strSymbols\n      ? strSymbols[0]\n      : string.charAt(0);\n\n    var trailing = strSymbols\n      ? castSlice(strSymbols, 1).join('')\n      : string.slice(1);\n\n    return chr[methodName]() + trailing;\n  };\n}\n\nexport default createCaseFirst;\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { upperFirst } from 'lodash-es';\r\nconst ATTRIBUTE_WHITESPACES = /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205f\\u3000]/g; // eslint-disable-line no-control-regex\r\nconst SAFE_URL = /^(?:(?:https?|ftps?|mailto):|[^a-z]|[a-z+.-]+(?:[^a-z+.:-]|$))/i;\r\n// Simplified email test - should be run over previously found URL.\r\nconst EMAIL_REG_EXP = /^[\\S]+@((?![-_])(?:[-\\w\\u00a1-\\uffff]{0,63}[^-_]\\.))+(?:[a-z\\u00a1-\\uffff]{2,})$/i;\r\n// The regex checks for the protocol syntax ('xxxx://' or 'xxxx:')\r\n// or non-word characters at the beginning of the link ('/', '#' etc.).\r\nconst PROTOCOL_REG_EXP = /^((\\w+:(\\/{2,})?)|(\\W))/i;\r\n/**\r\n * A keystroke used by the {@link module:link/linkui~LinkUI link UI feature}.\r\n */\r\nexport const LINK_KEYSTROKE = 'Ctrl+K';\r\n/**\r\n * Returns `true` if a given view node is the link element.\r\n */\r\nexport function isLinkElement(node) {\r\n    return node.is('attributeElement') && !!node.getCustomProperty('link');\r\n}\r\n/**\r\n * Creates a link {@link module:engine/view/attributeelement~AttributeElement} with the provided `href` attribute.\r\n */\r\nexport function createLinkElement(href, { writer }) {\r\n    // Priority 5 - https://github.com/ckeditor/ckeditor5-link/issues/121.\r\n    const linkElement = writer.createAttributeElement('a', { href }, { priority: 5 });\r\n    writer.setCustomProperty('link', true, linkElement);\r\n    return linkElement;\r\n}\r\n/**\r\n * Returns a safe URL based on a given value.\r\n *\r\n * A URL is considered safe if it is safe for the user (does not contain any malicious code).\r\n *\r\n * If a URL is considered unsafe, a simple `\"#\"` is returned.\r\n *\r\n * @internal\r\n */\r\nexport function ensureSafeUrl(url) {\r\n    const urlString = String(url);\r\n    return isSafeUrl(urlString) ? urlString : '#';\r\n}\r\n/**\r\n * Checks whether the given URL is safe for the user (does not contain any malicious code).\r\n */\r\nfunction isSafeUrl(url) {\r\n    const normalizedUrl = url.replace(ATTRIBUTE_WHITESPACES, '');\r\n    return !!normalizedUrl.match(SAFE_URL);\r\n}\r\n/**\r\n * Returns the {@link module:link/linkconfig~LinkConfig#decorators `config.link.decorators`} configuration processed\r\n * to respect the locale of the editor, i.e. to display the {@link module:link/linkconfig~LinkDecoratorManualDefinition label}\r\n * in the correct language.\r\n *\r\n * **Note**: Only the few most commonly used labels are translated automatically. Other labels should be manually\r\n * translated in the {@link module:link/linkconfig~LinkConfig#decorators `config.link.decorators`} configuration.\r\n *\r\n * @param t Shorthand for {@link module:utils/locale~Locale#t Locale#t}.\r\n * @param decorators The decorator reference where the label values should be localized.\r\n */\r\nexport function getLocalizedDecorators(t, decorators) {\r\n    const localizedDecoratorsLabels = {\r\n        'Open in a new tab': t('Open in a new tab'),\r\n        'Downloadable': t('Downloadable')\r\n    };\r\n    decorators.forEach(decorator => {\r\n        if ('label' in decorator && localizedDecoratorsLabels[decorator.label]) {\r\n            decorator.label = localizedDecoratorsLabels[decorator.label];\r\n        }\r\n        return decorator;\r\n    });\r\n    return decorators;\r\n}\r\n/**\r\n * Converts an object with defined decorators to a normalized array of decorators. The `id` key is added for each decorator and\r\n * is used as the attribute's name in the model.\r\n */\r\nexport function normalizeDecorators(decorators) {\r\n    const retArray = [];\r\n    if (decorators) {\r\n        for (const [key, value] of Object.entries(decorators)) {\r\n            const decorator = Object.assign({}, value, { id: `link${upperFirst(key)}` });\r\n            retArray.push(decorator);\r\n        }\r\n    }\r\n    return retArray;\r\n}\r\n/**\r\n * Returns `true` if the specified `element` can be linked (the element allows the `linkHref` attribute).\r\n */\r\nexport function isLinkableElement(element, schema) {\r\n    if (!element) {\r\n        return false;\r\n    }\r\n    return schema.checkAttribute(element.name, 'linkHref');\r\n}\r\n/**\r\n * Returns `true` if the specified `value` is an email.\r\n */\r\nexport function isEmail(value) {\r\n    return EMAIL_REG_EXP.test(value);\r\n}\r\n/**\r\n * Adds the protocol prefix to the specified `link` when:\r\n *\r\n * * it does not contain it already, and there is a {@link module:link/linkconfig~LinkConfig#defaultProtocol `defaultProtocol` }\r\n * configuration value provided,\r\n * * or the link is an email address.\r\n */\r\nexport function addLinkProtocolIfApplicable(link, defaultProtocol) {\r\n    const protocol = isEmail(link) ? 'mailto:' : defaultProtocol;\r\n    const isProtocolNeeded = !!protocol && !linkHasProtocol(link);\r\n    return link && isProtocolNeeded ? protocol + link : link;\r\n}\r\n/**\r\n * Checks if protocol is already included in the link.\r\n */\r\nexport function linkHasProtocol(link) {\r\n    return PROTOCOL_REG_EXP.test(link);\r\n}\r\n/**\r\n * Opens the link in a new browser tab.\r\n */\r\nexport function openLink(link) {\r\n    window.open(link, '_blank', 'noopener');\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module link/linkcommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { findAttributeRange } from 'ckeditor5/src/typing';\r\nimport { Collection, first, toMap } from 'ckeditor5/src/utils';\r\nimport AutomaticDecorators from './utils/automaticdecorators';\r\nimport { isLinkableElement } from './utils';\r\n/**\r\n * The link command. It is used by the {@link module:link/link~Link link feature}.\r\n */\r\nexport default class LinkCommand extends Command {\r\n    constructor() {\r\n        super(...arguments);\r\n        /**\r\n         * A collection of {@link module:link/utils/manualdecorator~ManualDecorator manual decorators}\r\n         * corresponding to the {@link module:link/linkconfig~LinkConfig#decorators decorator configuration}.\r\n         *\r\n         * You can consider it a model with states of manual decorators added to the currently selected link.\r\n         */\r\n        this.manualDecorators = new Collection();\r\n        /**\r\n         * An instance of the helper that ties together all {@link module:link/linkconfig~LinkDecoratorAutomaticDefinition}\r\n         * that are used by the {@glink features/link link} and the {@glink features/images/images-linking linking images} features.\r\n         */\r\n        this.automaticDecorators = new AutomaticDecorators();\r\n    }\r\n    /**\r\n     * Synchronizes the state of {@link #manualDecorators} with the currently present elements in the model.\r\n     */\r\n    restoreManualDecoratorStates() {\r\n        for (const manualDecorator of this.manualDecorators) {\r\n            manualDecorator.value = this._getDecoratorStateFromModel(manualDecorator.id);\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const model = this.editor.model;\r\n        const selection = model.document.selection;\r\n        const selectedElement = selection.getSelectedElement() || first(selection.getSelectedBlocks());\r\n        // A check for any integration that allows linking elements (e.g. `LinkImage`).\r\n        // Currently the selection reads attributes from text nodes only. See #7429 and #7465.\r\n        if (isLinkableElement(selectedElement, model.schema)) {\r\n            this.value = selectedElement.getAttribute('linkHref');\r\n            this.isEnabled = model.schema.checkAttribute(selectedElement, 'linkHref');\r\n        }\r\n        else {\r\n            this.value = selection.getAttribute('linkHref');\r\n            this.isEnabled = model.schema.checkAttributeInSelection(selection, 'linkHref');\r\n        }\r\n        for (const manualDecorator of this.manualDecorators) {\r\n            manualDecorator.value = this._getDecoratorStateFromModel(manualDecorator.id);\r\n        }\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * When the selection is non-collapsed, the `linkHref` attribute will be applied to nodes inside the selection, but only to\r\n     * those nodes where the `linkHref` attribute is allowed (disallowed nodes will be omitted).\r\n     *\r\n     * When the selection is collapsed and is not inside the text with the `linkHref` attribute, a\r\n     * new {@link module:engine/model/text~Text text node} with the `linkHref` attribute will be inserted in place of the caret, but\r\n     * only if such element is allowed in this place. The `_data` of the inserted text will equal the `href` parameter.\r\n     * The selection will be updated to wrap the just inserted text node.\r\n     *\r\n     * When the selection is collapsed and inside the text with the `linkHref` attribute, the attribute value will be updated.\r\n     *\r\n     * # Decorators and model attribute management\r\n     *\r\n     * There is an optional argument to this command that applies or removes model\r\n     * {@glink framework/architecture/editing-engine#text-attributes text attributes} brought by\r\n     * {@link module:link/utils/manualdecorator~ManualDecorator manual link decorators}.\r\n     *\r\n     * Text attribute names in the model correspond to the entries in the {@link module:link/linkconfig~LinkConfig#decorators\r\n     * configuration}.\r\n     * For every decorator configured, a model text attribute exists with the \"link\" prefix. For example, a `'linkMyDecorator'` attribute\r\n     * corresponds to `'myDecorator'` in the configuration.\r\n     *\r\n     * To learn more about link decorators, check out the {@link module:link/linkconfig~LinkConfig#decorators `config.link.decorators`}\r\n     * documentation.\r\n     *\r\n     * Here is how to manage decorator attributes with the link command:\r\n     *\r\n     * ```ts\r\n     * const linkCommand = editor.commands.get( 'link' );\r\n     *\r\n     * // Adding a new decorator attribute.\r\n     * linkCommand.execute( 'http://example.com', {\r\n     * \tlinkIsExternal: true\r\n     * } );\r\n     *\r\n     * // Removing a decorator attribute from the selection.\r\n     * linkCommand.execute( 'http://example.com', {\r\n     * \tlinkIsExternal: false\r\n     * } );\r\n     *\r\n     * // Adding multiple decorator attributes at the same time.\r\n     * linkCommand.execute( 'http://example.com', {\r\n     * \tlinkIsExternal: true,\r\n     * \tlinkIsDownloadable: true,\r\n     * } );\r\n     *\r\n     * // Removing and adding decorator attributes at the same time.\r\n     * linkCommand.execute( 'http://example.com', {\r\n     * \tlinkIsExternal: false,\r\n     * \tlinkFoo: true,\r\n     * \tlinkIsDownloadable: false,\r\n     * } );\r\n     * ```\r\n     *\r\n     * **Note**: If the decorator attribute name is not specified, its state remains untouched.\r\n     *\r\n     * **Note**: {@link module:link/unlinkcommand~UnlinkCommand#execute `UnlinkCommand#execute()`} removes all\r\n     * decorator attributes.\r\n     *\r\n     * @fires execute\r\n     * @param href Link destination.\r\n     * @param manualDecoratorIds The information about manual decorator attributes to be applied or removed upon execution.\r\n     */\r\n    execute(href, manualDecoratorIds = {}) {\r\n        const model = this.editor.model;\r\n        const selection = model.document.selection;\r\n        // Stores information about manual decorators to turn them on/off when command is applied.\r\n        const truthyManualDecorators = [];\r\n        const falsyManualDecorators = [];\r\n        for (const name in manualDecoratorIds) {\r\n            if (manualDecoratorIds[name]) {\r\n                truthyManualDecorators.push(name);\r\n            }\r\n            else {\r\n                falsyManualDecorators.push(name);\r\n            }\r\n        }\r\n        model.change(writer => {\r\n            // If selection is collapsed then update selected link or insert new one at the place of caret.\r\n            if (selection.isCollapsed) {\r\n                const position = selection.getFirstPosition();\r\n                // When selection is inside text with `linkHref` attribute.\r\n                if (selection.hasAttribute('linkHref')) {\r\n                    const linkText = extractTextFromSelection(selection);\r\n                    // Then update `linkHref` value.\r\n                    let linkRange = findAttributeRange(position, 'linkHref', selection.getAttribute('linkHref'), model);\r\n                    if (selection.getAttribute('linkHref') === linkText) {\r\n                        linkRange = this._updateLinkContent(model, writer, linkRange, href);\r\n                    }\r\n                    writer.setAttribute('linkHref', href, linkRange);\r\n                    truthyManualDecorators.forEach(item => {\r\n                        writer.setAttribute(item, true, linkRange);\r\n                    });\r\n                    falsyManualDecorators.forEach(item => {\r\n                        writer.removeAttribute(item, linkRange);\r\n                    });\r\n                    // Put the selection at the end of the updated link.\r\n                    writer.setSelection(writer.createPositionAfter(linkRange.end.nodeBefore));\r\n                }\r\n                // If not then insert text node with `linkHref` attribute in place of caret.\r\n                // However, since selection is collapsed, attribute value will be used as data for text node.\r\n                // So, if `href` is empty, do not create text node.\r\n                else if (href !== '') {\r\n                    const attributes = toMap(selection.getAttributes());\r\n                    attributes.set('linkHref', href);\r\n                    truthyManualDecorators.forEach(item => {\r\n                        attributes.set(item, true);\r\n                    });\r\n                    const { end: positionAfter } = model.insertContent(writer.createText(href, attributes), position);\r\n                    // Put the selection at the end of the inserted link.\r\n                    // Using end of range returned from insertContent in case nodes with the same attributes got merged.\r\n                    writer.setSelection(positionAfter);\r\n                }\r\n                // Remove the `linkHref` attribute and all link decorators from the selection.\r\n                // It stops adding a new content into the link element.\r\n                ['linkHref', ...truthyManualDecorators, ...falsyManualDecorators].forEach(item => {\r\n                    writer.removeSelectionAttribute(item);\r\n                });\r\n            }\r\n            else {\r\n                // If selection has non-collapsed ranges, we change attribute on nodes inside those ranges\r\n                // omitting nodes where the `linkHref` attribute is disallowed.\r\n                const ranges = model.schema.getValidRanges(selection.getRanges(), 'linkHref');\r\n                // But for the first, check whether the `linkHref` attribute is allowed on selected blocks (e.g. the \"image\" element).\r\n                const allowedRanges = [];\r\n                for (const element of selection.getSelectedBlocks()) {\r\n                    if (model.schema.checkAttribute(element, 'linkHref')) {\r\n                        allowedRanges.push(writer.createRangeOn(element));\r\n                    }\r\n                }\r\n                // Ranges that accept the `linkHref` attribute. Since we will iterate over `allowedRanges`, let's clone it.\r\n                const rangesToUpdate = allowedRanges.slice();\r\n                // For all selection ranges we want to check whether given range is inside an element that accepts the `linkHref` attribute.\r\n                // If so, we don't want to propagate applying the attribute to its children.\r\n                for (const range of ranges) {\r\n                    if (this._isRangeToUpdate(range, allowedRanges)) {\r\n                        rangesToUpdate.push(range);\r\n                    }\r\n                }\r\n                for (const range of rangesToUpdate) {\r\n                    let linkRange = range;\r\n                    if (rangesToUpdate.length === 1) {\r\n                        // Current text of the link in the document.\r\n                        const linkText = extractTextFromSelection(selection);\r\n                        if (selection.getAttribute('linkHref') === linkText) {\r\n                            linkRange = this._updateLinkContent(model, writer, range, href);\r\n                            writer.setSelection(writer.createSelection(linkRange));\r\n                        }\r\n                    }\r\n                    writer.setAttribute('linkHref', href, linkRange);\r\n                    truthyManualDecorators.forEach(item => {\r\n                        writer.setAttribute(item, true, linkRange);\r\n                    });\r\n                    falsyManualDecorators.forEach(item => {\r\n                        writer.removeAttribute(item, linkRange);\r\n                    });\r\n                }\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Provides information whether a decorator with a given name is present in the currently processed selection.\r\n     *\r\n     * @param decoratorName The name of the manual decorator used in the model\r\n     * @returns The information whether a given decorator is currently present in the selection.\r\n     */\r\n    _getDecoratorStateFromModel(decoratorName) {\r\n        const model = this.editor.model;\r\n        const selection = model.document.selection;\r\n        const selectedElement = selection.getSelectedElement();\r\n        // A check for the `LinkImage` plugin. If the selection contains an element, get values from the element.\r\n        // Currently the selection reads attributes from text nodes only. See #7429 and #7465.\r\n        if (isLinkableElement(selectedElement, model.schema)) {\r\n            return selectedElement.getAttribute(decoratorName);\r\n        }\r\n        return selection.getAttribute(decoratorName);\r\n    }\r\n    /**\r\n     * Checks whether specified `range` is inside an element that accepts the `linkHref` attribute.\r\n     *\r\n     * @param range A range to check.\r\n     * @param allowedRanges An array of ranges created on elements where the attribute is accepted.\r\n     */\r\n    _isRangeToUpdate(range, allowedRanges) {\r\n        for (const allowedRange of allowedRanges) {\r\n            // A range is inside an element that will have the `linkHref` attribute. Do not modify its nodes.\r\n            if (allowedRange.containsRange(range)) {\r\n                return false;\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n    /**\r\n     * Updates selected link with a new value as its content and as its href attribute.\r\n     *\r\n     * @param model Model is need to insert content.\r\n     * @param writer Writer is need to create text element in model.\r\n     * @param range A range where should be inserted content.\r\n     * @param href A link value which should be in the href attribute and in the content.\r\n     */\r\n    _updateLinkContent(model, writer, range, href) {\r\n        const text = writer.createText(href, { linkHref: href });\r\n        return model.insertContent(text, range);\r\n    }\r\n}\r\n// Returns a text of a link under the collapsed selection or a selection that contains the entire link.\r\nfunction extractTextFromSelection(selection) {\r\n    if (selection.isCollapsed) {\r\n        const firstPosition = selection.getFirstPosition();\r\n        return firstPosition.textNode && firstPosition.textNode.data;\r\n    }\r\n    else {\r\n        const rangeItems = Array.from(selection.getFirstRange().getItems());\r\n        if (rangeItems.length > 1) {\r\n            return null;\r\n        }\r\n        const firstNode = rangeItems[0];\r\n        if (firstNode.is('$text') || firstNode.is('$textProxy')) {\r\n            return firstNode.data;\r\n        }\r\n        return null;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module link/unlinkcommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { findAttributeRange } from 'ckeditor5/src/typing';\r\nimport { isLinkableElement } from './utils';\r\n/**\r\n * The unlink command. It is used by the {@link module:link/link~Link link plugin}.\r\n */\r\nexport default class UnlinkCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const model = this.editor.model;\r\n        const selection = model.document.selection;\r\n        const selectedElement = selection.getSelectedElement();\r\n        // A check for any integration that allows linking elements (e.g. `LinkImage`).\r\n        // Currently the selection reads attributes from text nodes only. See #7429 and #7465.\r\n        if (isLinkableElement(selectedElement, model.schema)) {\r\n            this.isEnabled = model.schema.checkAttribute(selectedElement, 'linkHref');\r\n        }\r\n        else {\r\n            this.isEnabled = model.schema.checkAttributeInSelection(selection, 'linkHref');\r\n        }\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * When the selection is collapsed, it removes the `linkHref` attribute from each node with the same `linkHref` attribute value.\r\n     * When the selection is non-collapsed, it removes the `linkHref` attribute from each node in selected ranges.\r\n     *\r\n     * # Decorators\r\n     *\r\n     * If {@link module:link/linkconfig~LinkConfig#decorators `config.link.decorators`} is specified,\r\n     * all configured decorators are removed together with the `linkHref` attribute.\r\n     *\r\n     * @fires execute\r\n     */\r\n    execute() {\r\n        const editor = this.editor;\r\n        const model = this.editor.model;\r\n        const selection = model.document.selection;\r\n        const linkCommand = editor.commands.get('link');\r\n        model.change(writer => {\r\n            // Get ranges to unlink.\r\n            const rangesToUnlink = selection.isCollapsed ?\r\n                [findAttributeRange(selection.getFirstPosition(), 'linkHref', selection.getAttribute('linkHref'), model)] :\r\n                model.schema.getValidRanges(selection.getRanges(), 'linkHref');\r\n            // Remove `linkHref` attribute from specified ranges.\r\n            for (const range of rangesToUnlink) {\r\n                writer.removeAttribute('linkHref', range);\r\n                // If there are registered custom attributes, then remove them during unlink.\r\n                if (linkCommand) {\r\n                    for (const manualDecorator of linkCommand.manualDecorators) {\r\n                        writer.removeAttribute(manualDecorator.id, range);\r\n                    }\r\n                }\r\n            }\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module link/utils/manualdecorator\r\n */\r\nimport { ObservableMixin } from 'ckeditor5/src/utils';\r\n/**\r\n * Helper class that stores manual decorators with observable {@link module:link/utils/manualdecorator~ManualDecorator#value}\r\n * to support integration with the UI state. An instance of this class is a model with the state of individual manual decorators.\r\n * These decorators are kept as collections in {@link module:link/linkcommand~LinkCommand#manualDecorators}.\r\n */\r\nexport default class ManualDecorator extends ObservableMixin() {\r\n    /**\r\n     * Creates a new instance of {@link module:link/utils/manualdecorator~ManualDecorator}.\r\n     *\r\n     * @param config.id The name of the attribute used in the model that represents a given manual decorator.\r\n     * For example: `'linkIsExternal'`.\r\n     * @param config.label The label used in the user interface to toggle the manual decorator.\r\n     * @param config.attributes A set of attributes added to output data when the decorator is active for a specific link.\r\n     * Attributes should keep the format of attributes defined in {@link module:engine/view/elementdefinition~ElementDefinition}.\r\n     * @param [config.defaultValue] Controls whether the decorator is \"on\" by default.\r\n     */\r\n    constructor({ id, label, attributes, classes, styles, defaultValue }) {\r\n        super();\r\n        this.id = id;\r\n        this.set('value', undefined);\r\n        this.defaultValue = defaultValue;\r\n        this.label = label;\r\n        this.attributes = attributes;\r\n        this.classes = classes;\r\n        this.styles = styles;\r\n    }\r\n    /**\r\n     * Returns {@link module:engine/view/matcher~MatcherPattern} with decorator attributes.\r\n     *\r\n     * @internal\r\n     */\r\n    _createPattern() {\r\n        return {\r\n            attributes: this.attributes,\r\n            classes: this.classes,\r\n            styles: this.styles\r\n        };\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./link.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module link/linkediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { MouseObserver } from 'ckeditor5/src/engine';\r\nimport { Input, TwoStepCaretMovement, inlineHighlight, findAttributeRange } from 'ckeditor5/src/typing';\r\nimport { ClipboardPipeline } from 'ckeditor5/src/clipboard';\r\nimport { keyCodes, env } from 'ckeditor5/src/utils';\r\nimport LinkCommand from './linkcommand';\r\nimport UnlinkCommand from './unlinkcommand';\r\nimport ManualDecorator from './utils/manualdecorator';\r\nimport { createLinkElement, ensureSafeUrl, getLocalizedDecorators, normalizeDecorators, openLink, addLinkProtocolIfApplicable } from './utils';\r\nimport '../theme/link.css';\r\nconst HIGHLIGHT_CLASS = 'ck-link_selected';\r\nconst DECORATOR_AUTOMATIC = 'automatic';\r\nconst DECORATOR_MANUAL = 'manual';\r\nconst EXTERNAL_LINKS_REGEXP = /^(https?:)?\\/\\//;\r\n/**\r\n * The link engine feature.\r\n *\r\n * It introduces the `linkHref=\"url\"` attribute in the model which renders to the view as a `<a href=\"url\">` element\r\n * as well as `'link'` and `'unlink'` commands.\r\n */\r\nexport default class LinkEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'LinkEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        // Clipboard is required for handling cut and paste events while typing over the link.\r\n        return [TwoStepCaretMovement, Input, ClipboardPipeline];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        editor.config.define('link', {\r\n            addTargetToExternalLinks: false\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        // Allow link attribute on all inline nodes.\r\n        editor.model.schema.extend('$text', { allowAttributes: 'linkHref' });\r\n        editor.conversion.for('dataDowncast')\r\n            .attributeToElement({ model: 'linkHref', view: createLinkElement });\r\n        editor.conversion.for('editingDowncast')\r\n            .attributeToElement({ model: 'linkHref', view: (href, conversionApi) => {\r\n                return createLinkElement(ensureSafeUrl(href), conversionApi);\r\n            } });\r\n        editor.conversion.for('upcast')\r\n            .elementToAttribute({\r\n            view: {\r\n                name: 'a',\r\n                attributes: {\r\n                    href: true\r\n                }\r\n            },\r\n            model: {\r\n                key: 'linkHref',\r\n                value: (viewElement) => viewElement.getAttribute('href')\r\n            }\r\n        });\r\n        // Create linking commands.\r\n        editor.commands.add('link', new LinkCommand(editor));\r\n        editor.commands.add('unlink', new UnlinkCommand(editor));\r\n        const linkDecorators = getLocalizedDecorators(editor.t, normalizeDecorators(editor.config.get('link.decorators')));\r\n        this._enableAutomaticDecorators(linkDecorators\r\n            .filter((item) => item.mode === DECORATOR_AUTOMATIC));\r\n        this._enableManualDecorators(linkDecorators\r\n            .filter((item) => item.mode === DECORATOR_MANUAL));\r\n        // Enable two-step caret movement for `linkHref` attribute.\r\n        const twoStepCaretMovementPlugin = editor.plugins.get(TwoStepCaretMovement);\r\n        twoStepCaretMovementPlugin.registerAttribute('linkHref');\r\n        // Setup highlight over selected link.\r\n        inlineHighlight(editor, 'linkHref', 'a', HIGHLIGHT_CLASS);\r\n        // Handle link following by CTRL+click or ALT+ENTER\r\n        this._enableLinkOpen();\r\n        // Change the attributes of the selection in certain situations after the link was inserted into the document.\r\n        this._enableInsertContentSelectionAttributesFixer();\r\n        // Handle a click at the beginning/end of a link element.\r\n        this._enableClickingAfterLink();\r\n        // Handle typing over the link.\r\n        this._enableTypingOverLink();\r\n        // Handle removing the content after the link element.\r\n        this._handleDeleteContentAfterLink();\r\n        // Handle adding default protocol to pasted links.\r\n        this._enableClipboardIntegration();\r\n    }\r\n    /**\r\n     * Processes an array of configured {@link module:link/linkconfig~LinkDecoratorAutomaticDefinition automatic decorators}\r\n     * and registers a {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher downcast dispatcher}\r\n     * for each one of them. Downcast dispatchers are obtained using the\r\n     * {@link module:link/utils/automaticdecorators~AutomaticDecorators#getDispatcher} method.\r\n     *\r\n     * **Note**: This method also activates the automatic external link decorator if enabled with\r\n     * {@link module:link/linkconfig~LinkConfig#addTargetToExternalLinks `config.link.addTargetToExternalLinks`}.\r\n     */\r\n    _enableAutomaticDecorators(automaticDecoratorDefinitions) {\r\n        const editor = this.editor;\r\n        // Store automatic decorators in the command instance as we do the same with manual decorators.\r\n        // Thanks to that, `LinkImageEditing` plugin can re-use the same definitions.\r\n        const command = editor.commands.get('link');\r\n        const automaticDecorators = command.automaticDecorators;\r\n        // Adds a default decorator for external links.\r\n        if (editor.config.get('link.addTargetToExternalLinks')) {\r\n            automaticDecorators.add({\r\n                id: 'linkIsExternal',\r\n                mode: DECORATOR_AUTOMATIC,\r\n                callback: url => !!url && EXTERNAL_LINKS_REGEXP.test(url),\r\n                attributes: {\r\n                    target: '_blank',\r\n                    rel: 'noopener noreferrer'\r\n                }\r\n            });\r\n        }\r\n        automaticDecorators.add(automaticDecoratorDefinitions);\r\n        if (automaticDecorators.length) {\r\n            editor.conversion.for('downcast').add(automaticDecorators.getDispatcher());\r\n        }\r\n    }\r\n    /**\r\n     * Processes an array of configured {@link module:link/linkconfig~LinkDecoratorManualDefinition manual decorators},\r\n     * transforms them into {@link module:link/utils/manualdecorator~ManualDecorator} instances and stores them in the\r\n     * {@link module:link/linkcommand~LinkCommand#manualDecorators} collection (a model for manual decorators state).\r\n     *\r\n     * Also registers an {@link module:engine/conversion/downcasthelpers~DowncastHelpers#attributeToElement attribute-to-element}\r\n     * converter for each manual decorator and extends the {@link module:engine/model/schema~Schema model's schema}\r\n     * with adequate model attributes.\r\n     */\r\n    _enableManualDecorators(manualDecoratorDefinitions) {\r\n        if (!manualDecoratorDefinitions.length) {\r\n            return;\r\n        }\r\n        const editor = this.editor;\r\n        const command = editor.commands.get('link');\r\n        const manualDecorators = command.manualDecorators;\r\n        manualDecoratorDefinitions.forEach(decoratorDefinition => {\r\n            editor.model.schema.extend('$text', { allowAttributes: decoratorDefinition.id });\r\n            // Keeps reference to manual decorator to decode its name to attributes during downcast.\r\n            const decorator = new ManualDecorator(decoratorDefinition);\r\n            manualDecorators.add(decorator);\r\n            editor.conversion.for('downcast').attributeToElement({\r\n                model: decorator.id,\r\n                view: (manualDecoratorValue, { writer, schema }, { item }) => {\r\n                    // Manual decorators for block links are handled e.g. in LinkImageEditing.\r\n                    if (!(item.is('selection') || schema.isInline(item))) {\r\n                        return;\r\n                    }\r\n                    if (manualDecoratorValue) {\r\n                        const element = writer.createAttributeElement('a', decorator.attributes, { priority: 5 });\r\n                        if (decorator.classes) {\r\n                            writer.addClass(decorator.classes, element);\r\n                        }\r\n                        for (const key in decorator.styles) {\r\n                            writer.setStyle(key, decorator.styles[key], element);\r\n                        }\r\n                        writer.setCustomProperty('link', true, element);\r\n                        return element;\r\n                    }\r\n                }\r\n            });\r\n            editor.conversion.for('upcast').elementToAttribute({\r\n                view: {\r\n                    name: 'a',\r\n                    ...decorator._createPattern()\r\n                },\r\n                model: {\r\n                    key: decorator.id\r\n                }\r\n            });\r\n        });\r\n    }\r\n    /**\r\n     * Attaches handlers for {@link module:engine/view/document~Document#event:enter} and\r\n     * {@link module:engine/view/document~Document#event:click} to enable link following.\r\n     */\r\n    _enableLinkOpen() {\r\n        const editor = this.editor;\r\n        const view = editor.editing.view;\r\n        const viewDocument = view.document;\r\n        this.listenTo(viewDocument, 'click', (evt, data) => {\r\n            const shouldOpen = env.isMac ? data.domEvent.metaKey : data.domEvent.ctrlKey;\r\n            if (!shouldOpen) {\r\n                return;\r\n            }\r\n            let clickedElement = data.domTarget;\r\n            if (clickedElement.tagName.toLowerCase() != 'a') {\r\n                clickedElement = clickedElement.closest('a');\r\n            }\r\n            if (!clickedElement) {\r\n                return;\r\n            }\r\n            const url = clickedElement.getAttribute('href');\r\n            if (!url) {\r\n                return;\r\n            }\r\n            evt.stop();\r\n            data.preventDefault();\r\n            openLink(url);\r\n        }, { context: '$capture' });\r\n        // Open link on Alt+Enter.\r\n        this.listenTo(viewDocument, 'keydown', (evt, data) => {\r\n            const linkCommand = editor.commands.get('link');\r\n            const url = linkCommand.value;\r\n            const shouldOpen = !!url && data.keyCode === keyCodes.enter && data.altKey;\r\n            if (!shouldOpen) {\r\n                return;\r\n            }\r\n            evt.stop();\r\n            openLink(url);\r\n        });\r\n    }\r\n    /**\r\n     * Starts listening to {@link module:engine/model/model~Model#event:insertContent} and corrects the model\r\n     * selection attributes if the selection is at the end of a link after inserting the content.\r\n     *\r\n     * The purpose of this action is to improve the overall UX because the user is no longer \"trapped\" by the\r\n     * `linkHref` attribute of the selection and they can type a \"clean\" (`linkHref`–less) text right away.\r\n     *\r\n     * See https://github.com/ckeditor/ckeditor5/issues/6053.\r\n     */\r\n    _enableInsertContentSelectionAttributesFixer() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const selection = model.document.selection;\r\n        this.listenTo(model, 'insertContent', () => {\r\n            const nodeBefore = selection.anchor.nodeBefore;\r\n            const nodeAfter = selection.anchor.nodeAfter;\r\n            // NOTE: ↰ and ↱ represent the gravity of the selection.\r\n            // The only truly valid case is:\r\n            //\r\n            //\t\t                                 ↰\r\n            //\t\t...<$text linkHref=\"foo\">INSERTED[]</$text>\r\n            //\r\n            // If the selection is not \"trapped\" by the `linkHref` attribute after inserting, there's nothing\r\n            // to fix there.\r\n            if (!selection.hasAttribute('linkHref')) {\r\n                return;\r\n            }\r\n            // Filter out the following case where a link with the same href (e.g. <a href=\"foo\">INSERTED</a>) is inserted\r\n            // in the middle of an existing link:\r\n            //\r\n            // Before insertion:\r\n            //\t\t                       ↰\r\n            //\t\t<$text linkHref=\"foo\">l[]ink</$text>\r\n            //\r\n            // Expected after insertion:\r\n            //\t\t                               ↰\r\n            //\t\t<$text linkHref=\"foo\">lINSERTED[]ink</$text>\r\n            //\r\n            if (!nodeBefore) {\r\n                return;\r\n            }\r\n            // Filter out the following case where the selection has the \"linkHref\" attribute because the\r\n            // gravity is overridden and some text with another attribute (e.g. <b>INSERTED</b>) is inserted:\r\n            //\r\n            // Before insertion:\r\n            //\r\n            //\t\t                       ↱\r\n            //\t\t<$text linkHref=\"foo\">[]link</$text>\r\n            //\r\n            // Expected after insertion:\r\n            //\r\n            //\t\t                                                          ↱\r\n            //\t\t<$text bold=\"true\">INSERTED</$text><$text linkHref=\"foo\">[]link</$text>\r\n            //\r\n            if (!nodeBefore.hasAttribute('linkHref')) {\r\n                return;\r\n            }\r\n            // Filter out the following case where a link is a inserted in the middle (or before) another link\r\n            // (different URLs, so they will not merge). In this (let's say weird) case, we can leave the selection\r\n            // attributes as they are because the user will end up writing in one link or another anyway.\r\n            //\r\n            // Before insertion:\r\n            //\r\n            //\t\t                       ↰\r\n            //\t\t<$text linkHref=\"foo\">l[]ink</$text>\r\n            //\r\n            // Expected after insertion:\r\n            //\r\n            //\t\t                                                             ↰\r\n            //\t\t<$text linkHref=\"foo\">l</$text><$text linkHref=\"bar\">INSERTED[]</$text><$text linkHref=\"foo\">ink</$text>\r\n            //\r\n            if (nodeAfter && nodeAfter.hasAttribute('linkHref')) {\r\n                return;\r\n            }\r\n            model.change(writer => {\r\n                removeLinkAttributesFromSelection(writer, getLinkAttributesAllowedOnText(model.schema));\r\n            });\r\n        }, { priority: 'low' });\r\n    }\r\n    /**\r\n     * Starts listening to {@link module:engine/view/document~Document#event:mousedown} and\r\n     * {@link module:engine/view/document~Document#event:selectionChange} and puts the selection before/after a link node\r\n     * if clicked at the beginning/ending of the link.\r\n     *\r\n     * The purpose of this action is to allow typing around the link node directly after a click.\r\n     *\r\n     * See https://github.com/ckeditor/ckeditor5/issues/1016.\r\n     */\r\n    _enableClickingAfterLink() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        editor.editing.view.addObserver(MouseObserver);\r\n        let clicked = false;\r\n        // Detect the click.\r\n        this.listenTo(editor.editing.view.document, 'mousedown', () => {\r\n            clicked = true;\r\n        });\r\n        // When the selection has changed...\r\n        this.listenTo(editor.editing.view.document, 'selectionChange', () => {\r\n            if (!clicked) {\r\n                return;\r\n            }\r\n            // ...and it was caused by the click...\r\n            clicked = false;\r\n            const selection = model.document.selection;\r\n            // ...and no text is selected...\r\n            if (!selection.isCollapsed) {\r\n                return;\r\n            }\r\n            // ...and clicked text is the link...\r\n            if (!selection.hasAttribute('linkHref')) {\r\n                return;\r\n            }\r\n            const position = selection.getFirstPosition();\r\n            const linkRange = findAttributeRange(position, 'linkHref', selection.getAttribute('linkHref'), model);\r\n            // ...check whether clicked start/end boundary of the link.\r\n            // If so, remove the `linkHref` attribute.\r\n            if (position.isTouching(linkRange.start) || position.isTouching(linkRange.end)) {\r\n                model.change(writer => {\r\n                    removeLinkAttributesFromSelection(writer, getLinkAttributesAllowedOnText(model.schema));\r\n                });\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Starts listening to {@link module:engine/model/model~Model#deleteContent} and {@link module:engine/model/model~Model#insertContent}\r\n     * and checks whether typing over the link. If so, attributes of removed text are preserved and applied to the inserted text.\r\n     *\r\n     * The purpose of this action is to allow modifying a text without loosing the `linkHref` attribute (and other).\r\n     *\r\n     * See https://github.com/ckeditor/ckeditor5/issues/4762.\r\n     */\r\n    _enableTypingOverLink() {\r\n        const editor = this.editor;\r\n        const view = editor.editing.view;\r\n        // Selection attributes when started typing over the link.\r\n        let selectionAttributes = null;\r\n        // Whether pressed `Backspace` or `Delete`. If so, attributes should not be preserved.\r\n        let deletedContent = false;\r\n        // Detect pressing `Backspace` / `Delete`.\r\n        this.listenTo(view.document, 'delete', () => {\r\n            deletedContent = true;\r\n        }, { priority: 'high' });\r\n        // Listening to `model#deleteContent` allows detecting whether selected content was a link.\r\n        // If so, before removing the element, we will copy its attributes.\r\n        this.listenTo(editor.model, 'deleteContent', () => {\r\n            const selection = editor.model.document.selection;\r\n            // Copy attributes only if anything is selected.\r\n            if (selection.isCollapsed) {\r\n                return;\r\n            }\r\n            // When the content was deleted, do not preserve attributes.\r\n            if (deletedContent) {\r\n                deletedContent = false;\r\n                return;\r\n            }\r\n            // Enabled only when typing.\r\n            if (!isTyping(editor)) {\r\n                return;\r\n            }\r\n            if (shouldCopyAttributes(editor.model)) {\r\n                selectionAttributes = selection.getAttributes();\r\n            }\r\n        }, { priority: 'high' });\r\n        // Listening to `model#insertContent` allows detecting the content insertion.\r\n        // We want to apply attributes that were removed while typing over the link.\r\n        this.listenTo(editor.model, 'insertContent', (evt, [element]) => {\r\n            deletedContent = false;\r\n            // Enabled only when typing.\r\n            if (!isTyping(editor)) {\r\n                return;\r\n            }\r\n            if (!selectionAttributes) {\r\n                return;\r\n            }\r\n            editor.model.change(writer => {\r\n                for (const [attribute, value] of selectionAttributes) {\r\n                    writer.setAttribute(attribute, value, element);\r\n                }\r\n            });\r\n            selectionAttributes = null;\r\n        }, { priority: 'high' });\r\n    }\r\n    /**\r\n     * Starts listening to {@link module:engine/model/model~Model#deleteContent} and checks whether\r\n     * removing a content right after the \"linkHref\" attribute.\r\n     *\r\n     * If so, the selection should not preserve the `linkHref` attribute. However, if\r\n     * the {@link module:typing/twostepcaretmovement~TwoStepCaretMovement} plugin is active and\r\n     * the selection has the \"linkHref\" attribute due to overriden gravity (at the end), the `linkHref` attribute should stay untouched.\r\n     *\r\n     * The purpose of this action is to allow removing the link text and keep the selection outside the link.\r\n     *\r\n     * See https://github.com/ckeditor/ckeditor5/issues/7521.\r\n     */\r\n    _handleDeleteContentAfterLink() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const selection = model.document.selection;\r\n        const view = editor.editing.view;\r\n        // A flag whether attributes `linkHref` attribute should be preserved.\r\n        let shouldPreserveAttributes = false;\r\n        // A flag whether the `Backspace` key was pressed.\r\n        let hasBackspacePressed = false;\r\n        // Detect pressing `Backspace`.\r\n        this.listenTo(view.document, 'delete', (evt, data) => {\r\n            hasBackspacePressed = data.direction === 'backward';\r\n        }, { priority: 'high' });\r\n        // Before removing the content, check whether the selection is inside a link or at the end of link but with 2-SCM enabled.\r\n        // If so, we want to preserve link attributes.\r\n        this.listenTo(model, 'deleteContent', () => {\r\n            // Reset the state.\r\n            shouldPreserveAttributes = false;\r\n            const position = selection.getFirstPosition();\r\n            const linkHref = selection.getAttribute('linkHref');\r\n            if (!linkHref) {\r\n                return;\r\n            }\r\n            const linkRange = findAttributeRange(position, 'linkHref', linkHref, model);\r\n            // Preserve `linkHref` attribute if the selection is in the middle of the link or\r\n            // the selection is at the end of the link and 2-SCM is activated.\r\n            shouldPreserveAttributes = linkRange.containsPosition(position) || linkRange.end.isEqual(position);\r\n        }, { priority: 'high' });\r\n        // After removing the content, check whether the current selection should preserve the `linkHref` attribute.\r\n        this.listenTo(model, 'deleteContent', () => {\r\n            // If didn't press `Backspace`.\r\n            if (!hasBackspacePressed) {\r\n                return;\r\n            }\r\n            hasBackspacePressed = false;\r\n            // Disable the mechanism if inside a link (`<$text url=\"foo\">F[]oo</$text>` or <$text url=\"foo\">Foo[]</$text>`).\r\n            if (shouldPreserveAttributes) {\r\n                return;\r\n            }\r\n            // Use `model.enqueueChange()` in order to execute the callback at the end of the changes process.\r\n            editor.model.enqueueChange(writer => {\r\n                removeLinkAttributesFromSelection(writer, getLinkAttributesAllowedOnText(model.schema));\r\n            });\r\n        }, { priority: 'low' });\r\n    }\r\n    /**\r\n     * Enables URL fixing on pasting.\r\n     */\r\n    _enableClipboardIntegration() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const defaultProtocol = this.editor.config.get('link.defaultProtocol');\r\n        if (!defaultProtocol) {\r\n            return;\r\n        }\r\n        this.listenTo(editor.plugins.get('ClipboardPipeline'), 'contentInsertion', (evt, data) => {\r\n            model.change(writer => {\r\n                const range = writer.createRangeIn(data.content);\r\n                for (const item of range.getItems()) {\r\n                    if (item.hasAttribute('linkHref')) {\r\n                        const newLink = addLinkProtocolIfApplicable(item.getAttribute('linkHref'), defaultProtocol);\r\n                        writer.setAttribute('linkHref', newLink, item);\r\n                    }\r\n                }\r\n            });\r\n        });\r\n    }\r\n}\r\n/**\r\n * Make the selection free of link-related model attributes.\r\n * All link-related model attributes start with \"link\". That includes not only \"linkHref\"\r\n * but also all decorator attributes (they have dynamic names), or even custom plugins.\r\n */\r\nfunction removeLinkAttributesFromSelection(writer, linkAttributes) {\r\n    writer.removeSelectionAttribute('linkHref');\r\n    for (const attribute of linkAttributes) {\r\n        writer.removeSelectionAttribute(attribute);\r\n    }\r\n}\r\n/**\r\n * Checks whether selection's attributes should be copied to the new inserted text.\r\n */\r\nfunction shouldCopyAttributes(model) {\r\n    const selection = model.document.selection;\r\n    const firstPosition = selection.getFirstPosition();\r\n    const lastPosition = selection.getLastPosition();\r\n    const nodeAtFirstPosition = firstPosition.nodeAfter;\r\n    // The text link node does not exist...\r\n    if (!nodeAtFirstPosition) {\r\n        return false;\r\n    }\r\n    // ...or it isn't the text node...\r\n    if (!nodeAtFirstPosition.is('$text')) {\r\n        return false;\r\n    }\r\n    // ...or isn't the link.\r\n    if (!nodeAtFirstPosition.hasAttribute('linkHref')) {\r\n        return false;\r\n    }\r\n    // `textNode` = the position is inside the link element.\r\n    // `nodeBefore` = the position is at the end of the link element.\r\n    const nodeAtLastPosition = lastPosition.textNode || lastPosition.nodeBefore;\r\n    // If both references the same node selection contains a single text node.\r\n    if (nodeAtFirstPosition === nodeAtLastPosition) {\r\n        return true;\r\n    }\r\n    // If nodes are not equal, maybe the link nodes has defined additional attributes inside.\r\n    // First, we need to find the entire link range.\r\n    const linkRange = findAttributeRange(firstPosition, 'linkHref', nodeAtFirstPosition.getAttribute('linkHref'), model);\r\n    // Then we can check whether selected range is inside the found link range. If so, attributes should be preserved.\r\n    return linkRange.containsRange(model.createRange(firstPosition, lastPosition), true);\r\n}\r\n/**\r\n * Checks whether provided changes were caused by typing.\r\n */\r\nfunction isTyping(editor) {\r\n    const currentBatch = editor.model.change(writer => writer.batch);\r\n    return currentBatch.isTyping;\r\n}\r\n/**\r\n * Returns an array containing names of the attributes allowed on `$text` that describes the link item.\r\n */\r\nfunction getLinkAttributesAllowedOnText(schema) {\r\n    const textAttributes = schema.getDefinition('$text').allowAttributes;\r\n    return textAttributes.filter(attribute => attribute.startsWith('link'));\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module typing/utils/inlinehighlight\r\n */\r\nimport findAttributeRange from './findattributerange';\r\n/**\r\n * Adds a visual highlight style to an attribute element in which the selection is anchored.\r\n * Together with two-step caret movement, they indicate that the user is typing inside the element.\r\n *\r\n * Highlight is turned on by adding the given class to the attribute element in the view:\r\n *\r\n * * The class is removed before the conversion has started, as callbacks added with the `'highest'` priority\r\n * to {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher} events.\r\n * * The class is added in the view post fixer, after other changes in the model tree were converted to the view.\r\n *\r\n * This way, adding and removing the highlight does not interfere with conversion.\r\n *\r\n * Usage:\r\n *\r\n * ```ts\r\n * import inlineHighlight from '@ckeditor/ckeditor5-typing/src/utils/inlinehighlight';\r\n *\r\n * // Make `ck-link_selected` class be applied on an `a` element\r\n * // whenever the corresponding `linkHref` attribute element is selected.\r\n * inlineHighlight( editor, 'linkHref', 'a', 'ck-link_selected' );\r\n * ```\r\n *\r\n * @param editor The editor instance.\r\n * @param attributeName The attribute name to check.\r\n * @param tagName The tagName of a view item.\r\n * @param className The class name to apply in the view.\r\n */\r\nexport default function inlineHighlight(editor, attributeName, tagName, className) {\r\n    const view = editor.editing.view;\r\n    const highlightedElements = new Set();\r\n    // Adding the class.\r\n    view.document.registerPostFixer(writer => {\r\n        const selection = editor.model.document.selection;\r\n        let changed = false;\r\n        if (selection.hasAttribute(attributeName)) {\r\n            const modelRange = findAttributeRange(selection.getFirstPosition(), attributeName, selection.getAttribute(attributeName), editor.model);\r\n            const viewRange = editor.editing.mapper.toViewRange(modelRange);\r\n            // There might be multiple view elements in the `viewRange`, for example, when the `a` element is\r\n            // broken by a UIElement.\r\n            for (const item of viewRange.getItems()) {\r\n                if (item.is('element', tagName) && !item.hasClass(className)) {\r\n                    writer.addClass(className, item);\r\n                    highlightedElements.add(item);\r\n                    changed = true;\r\n                }\r\n            }\r\n        }\r\n        return changed;\r\n    });\r\n    // Removing the class.\r\n    editor.conversion.for('editingDowncast').add(dispatcher => {\r\n        // Make sure the highlight is removed on every possible event, before conversion is started.\r\n        dispatcher.on('insert', removeHighlight, { priority: 'highest' });\r\n        dispatcher.on('remove', removeHighlight, { priority: 'highest' });\r\n        dispatcher.on('attribute', removeHighlight, { priority: 'highest' });\r\n        dispatcher.on('selection', removeHighlight, { priority: 'highest' });\r\n        function removeHighlight() {\r\n            view.change(writer => {\r\n                for (const item of highlightedElements.values()) {\r\n                    writer.removeClass(className, item);\r\n                    highlightedElements.delete(item);\r\n                }\r\n            });\r\n        }\r\n    });\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./linkform.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module link/ui/linkformview\r\n */\r\nimport { ButtonView, FocusCycler, LabeledFieldView, SwitchButtonView, View, ViewCollection, createLabeledInputText, submitHandler } from 'ckeditor5/src/ui';\r\nimport { FocusTracker, KeystrokeHandler } from 'ckeditor5/src/utils';\r\nimport { icons } from 'ckeditor5/src/core';\r\n// See: #8833.\r\n// eslint-disable-next-line ckeditor5-rules/ckeditor-imports\r\nimport '@ckeditor/ckeditor5-ui/theme/components/responsive-form/responsiveform.css';\r\nimport '../../theme/linkform.css';\r\n/**\r\n * The link form view controller class.\r\n *\r\n * See {@link module:link/ui/linkformview~LinkFormView}.\r\n */\r\nexport default class LinkFormView extends View {\r\n    /**\r\n     * Creates an instance of the {@link module:link/ui/linkformview~LinkFormView} class.\r\n     *\r\n     * Also see {@link #render}.\r\n     *\r\n     * @param locale The localization services instance.\r\n     * @param linkCommand Reference to {@link module:link/linkcommand~LinkCommand}.\r\n     */\r\n    constructor(locale, linkCommand) {\r\n        super(locale);\r\n        /**\r\n         * Tracks information about DOM focus in the form.\r\n         */\r\n        this.focusTracker = new FocusTracker();\r\n        /**\r\n         * An instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}.\r\n         */\r\n        this.keystrokes = new KeystrokeHandler();\r\n        /**\r\n         * A collection of views that can be focused in the form.\r\n         */\r\n        this._focusables = new ViewCollection();\r\n        const t = locale.t;\r\n        this.urlInputView = this._createUrlInput();\r\n        this.saveButtonView = this._createButton(t('Save'), icons.check, 'ck-button-save');\r\n        this.saveButtonView.type = 'submit';\r\n        this.cancelButtonView = this._createButton(t('Cancel'), icons.cancel, 'ck-button-cancel', 'cancel');\r\n        this._manualDecoratorSwitches = this._createManualDecoratorSwitches(linkCommand);\r\n        this.children = this._createFormChildren(linkCommand.manualDecorators);\r\n        this._focusCycler = new FocusCycler({\r\n            focusables: this._focusables,\r\n            focusTracker: this.focusTracker,\r\n            keystrokeHandler: this.keystrokes,\r\n            actions: {\r\n                // Navigate form fields backwards using the Shift + Tab keystroke.\r\n                focusPrevious: 'shift + tab',\r\n                // Navigate form fields forwards using the Tab key.\r\n                focusNext: 'tab'\r\n            }\r\n        });\r\n        const classList = ['ck', 'ck-link-form', 'ck-responsive-form'];\r\n        if (linkCommand.manualDecorators.length) {\r\n            classList.push('ck-link-form_layout-vertical', 'ck-vertical-form');\r\n        }\r\n        this.setTemplate({\r\n            tag: 'form',\r\n            attributes: {\r\n                class: classList,\r\n                // https://github.com/ckeditor/ckeditor5-link/issues/90\r\n                tabindex: '-1'\r\n            },\r\n            children: this.children\r\n        });\r\n    }\r\n    /**\r\n     * Obtains the state of the {@link module:ui/button/switchbuttonview~SwitchButtonView switch buttons} representing\r\n     * {@link module:link/linkcommand~LinkCommand#manualDecorators manual link decorators}\r\n     * in the {@link module:link/ui/linkformview~LinkFormView}.\r\n     *\r\n     * @returns Key-value pairs, where the key is the name of the decorator and the value is its state.\r\n     */\r\n    getDecoratorSwitchesState() {\r\n        return Array\r\n            .from(this._manualDecoratorSwitches)\r\n            .reduce((accumulator, switchButton) => {\r\n            accumulator[switchButton.name] = switchButton.isOn;\r\n            return accumulator;\r\n        }, {});\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        submitHandler({\r\n            view: this\r\n        });\r\n        const childViews = [\r\n            this.urlInputView,\r\n            ...this._manualDecoratorSwitches,\r\n            this.saveButtonView,\r\n            this.cancelButtonView\r\n        ];\r\n        childViews.forEach(v => {\r\n            // Register the view as focusable.\r\n            this._focusables.add(v);\r\n            // Register the view in the focus tracker.\r\n            this.focusTracker.add(v.element);\r\n        });\r\n        // Start listening for the keystrokes coming from #element.\r\n        this.keystrokes.listenTo(this.element);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        this.focusTracker.destroy();\r\n        this.keystrokes.destroy();\r\n    }\r\n    /**\r\n     * Focuses the fist {@link #_focusables} in the form.\r\n     */\r\n    focus() {\r\n        this._focusCycler.focusFirst();\r\n    }\r\n    /**\r\n     * Creates a labeled input view.\r\n     *\r\n     * @returns Labeled field view instance.\r\n     */\r\n    _createUrlInput() {\r\n        const t = this.locale.t;\r\n        const labeledInput = new LabeledFieldView(this.locale, createLabeledInputText);\r\n        labeledInput.label = t('Link URL');\r\n        return labeledInput;\r\n    }\r\n    /**\r\n     * Creates a button view.\r\n     *\r\n     * @param label The button label.\r\n     * @param icon The button icon.\r\n     * @param className The additional button CSS class name.\r\n     * @param eventName An event name that the `ButtonView#execute` event will be delegated to.\r\n     * @returns The button view instance.\r\n     */\r\n    _createButton(label, icon, className, eventName) {\r\n        const button = new ButtonView(this.locale);\r\n        button.set({\r\n            label,\r\n            icon,\r\n            tooltip: true\r\n        });\r\n        button.extendTemplate({\r\n            attributes: {\r\n                class: className\r\n            }\r\n        });\r\n        if (eventName) {\r\n            button.delegate('execute').to(this, eventName);\r\n        }\r\n        return button;\r\n    }\r\n    /**\r\n     * Populates {@link module:ui/viewcollection~ViewCollection} of {@link module:ui/button/switchbuttonview~SwitchButtonView}\r\n     * made based on {@link module:link/linkcommand~LinkCommand#manualDecorators}.\r\n     *\r\n     * @param linkCommand A reference to the link command.\r\n     * @returns ViewCollection of switch buttons.\r\n     */\r\n    _createManualDecoratorSwitches(linkCommand) {\r\n        const switches = this.createCollection();\r\n        for (const manualDecorator of linkCommand.manualDecorators) {\r\n            const switchButton = new SwitchButtonView(this.locale);\r\n            switchButton.set({\r\n                name: manualDecorator.id,\r\n                label: manualDecorator.label,\r\n                withText: true\r\n            });\r\n            switchButton.bind('isOn').toMany([manualDecorator, linkCommand], 'value', (decoratorValue, commandValue) => {\r\n                return commandValue === undefined && decoratorValue === undefined ? !!manualDecorator.defaultValue : !!decoratorValue;\r\n            });\r\n            switchButton.on('execute', () => {\r\n                manualDecorator.set('value', !switchButton.isOn);\r\n            });\r\n            switches.add(switchButton);\r\n        }\r\n        return switches;\r\n    }\r\n    /**\r\n     * Populates the {@link #children} collection of the form.\r\n     *\r\n     * If {@link module:link/linkcommand~LinkCommand#manualDecorators manual decorators} are configured in the editor, it creates an\r\n     * additional `View` wrapping all {@link #_manualDecoratorSwitches} switch buttons corresponding\r\n     * to these decorators.\r\n     *\r\n     * @param manualDecorators A reference to\r\n     * the collection of manual decorators stored in the link command.\r\n     * @returns The children of link form view.\r\n     */\r\n    _createFormChildren(manualDecorators) {\r\n        const children = this.createCollection();\r\n        children.add(this.urlInputView);\r\n        if (manualDecorators.length) {\r\n            const additionalButtonsView = new View();\r\n            additionalButtonsView.setTemplate({\r\n                tag: 'ul',\r\n                children: this._manualDecoratorSwitches.map(switchButton => ({\r\n                    tag: 'li',\r\n                    children: [switchButton],\r\n                    attributes: {\r\n                        class: [\r\n                            'ck',\r\n                            'ck-list__item'\r\n                        ]\r\n                    }\r\n                })),\r\n                attributes: {\r\n                    class: [\r\n                        'ck',\r\n                        'ck-reset',\r\n                        'ck-list'\r\n                    ]\r\n                }\r\n            });\r\n            children.add(additionalButtonsView);\r\n        }\r\n        children.add(this.saveButtonView);\r\n        children.add(this.cancelButtonView);\r\n        return children;\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./linkactions.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module link/ui/linkactionsview\r\n */\r\nimport { ButtonView, View, ViewCollection, FocusCycler } from 'ckeditor5/src/ui';\r\nimport { FocusTracker, KeystrokeHandler } from 'ckeditor5/src/utils';\r\nimport { icons } from 'ckeditor5/src/core';\r\nimport { ensureSafeUrl } from '../utils';\r\n// See: #8833.\r\n// eslint-disable-next-line ckeditor5-rules/ckeditor-imports\r\nimport '@ckeditor/ckeditor5-ui/theme/components/responsive-form/responsiveform.css';\r\nimport '../../theme/linkactions.css';\r\nimport unlinkIcon from '../../theme/icons/unlink.svg';\r\n/**\r\n * The link actions view class. This view displays the link preview, allows\r\n * unlinking or editing the link.\r\n */\r\nexport default class LinkActionsView extends View {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        /**\r\n         * Tracks information about DOM focus in the actions.\r\n         */\r\n        this.focusTracker = new FocusTracker();\r\n        /**\r\n         * An instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}.\r\n         */\r\n        this.keystrokes = new KeystrokeHandler();\r\n        /**\r\n         * A collection of views that can be focused in the view.\r\n         */\r\n        this._focusables = new ViewCollection();\r\n        const t = locale.t;\r\n        this.previewButtonView = this._createPreviewButton();\r\n        this.unlinkButtonView = this._createButton(t('Unlink'), unlinkIcon, 'unlink');\r\n        this.editButtonView = this._createButton(t('Edit link'), icons.pencil, 'edit');\r\n        this.set('href', undefined);\r\n        this._focusCycler = new FocusCycler({\r\n            focusables: this._focusables,\r\n            focusTracker: this.focusTracker,\r\n            keystrokeHandler: this.keystrokes,\r\n            actions: {\r\n                // Navigate fields backwards using the Shift + Tab keystroke.\r\n                focusPrevious: 'shift + tab',\r\n                // Navigate fields forwards using the Tab key.\r\n                focusNext: 'tab'\r\n            }\r\n        });\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-link-actions',\r\n                    'ck-responsive-form'\r\n                ],\r\n                // https://github.com/ckeditor/ckeditor5-link/issues/90\r\n                tabindex: '-1'\r\n            },\r\n            children: [\r\n                this.previewButtonView,\r\n                this.editButtonView,\r\n                this.unlinkButtonView\r\n            ]\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        const childViews = [\r\n            this.previewButtonView,\r\n            this.editButtonView,\r\n            this.unlinkButtonView\r\n        ];\r\n        childViews.forEach(v => {\r\n            // Register the view as focusable.\r\n            this._focusables.add(v);\r\n            // Register the view in the focus tracker.\r\n            this.focusTracker.add(v.element);\r\n        });\r\n        // Start listening for the keystrokes coming from #element.\r\n        this.keystrokes.listenTo(this.element);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        this.focusTracker.destroy();\r\n        this.keystrokes.destroy();\r\n    }\r\n    /**\r\n     * Focuses the fist {@link #_focusables} in the actions.\r\n     */\r\n    focus() {\r\n        this._focusCycler.focusFirst();\r\n    }\r\n    /**\r\n     * Creates a button view.\r\n     *\r\n     * @param label The button label.\r\n     * @param icon The button icon.\r\n     * @param eventName An event name that the `ButtonView#execute` event will be delegated to.\r\n     * @returns The button view instance.\r\n     */\r\n    _createButton(label, icon, eventName) {\r\n        const button = new ButtonView(this.locale);\r\n        button.set({\r\n            label,\r\n            icon,\r\n            tooltip: true\r\n        });\r\n        button.delegate('execute').to(this, eventName);\r\n        return button;\r\n    }\r\n    /**\r\n     * Creates a link href preview button.\r\n     *\r\n     * @returns The button view instance.\r\n     */\r\n    _createPreviewButton() {\r\n        const button = new ButtonView(this.locale);\r\n        const bind = this.bindTemplate;\r\n        const t = this.t;\r\n        button.set({\r\n            withText: true,\r\n            tooltip: t('Open link in new tab')\r\n        });\r\n        button.extendTemplate({\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-link-actions__preview'\r\n                ],\r\n                href: bind.to('href', href => href && ensureSafeUrl(href)),\r\n                target: '_blank',\r\n                rel: 'noopener noreferrer'\r\n            }\r\n        });\r\n        button.bind('label').to(this, 'href', href => {\r\n            return href || t('This link has no URL');\r\n        });\r\n        button.bind('isEnabled').to(this, 'href', href => !!href);\r\n        button.template.tag = 'a';\r\n        button.template.eventListeners = {};\r\n        return button;\r\n    }\r\n}\r\n","export default \"<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>\";","export default \"<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>\";","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module link/linkui\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { ClickObserver } from 'ckeditor5/src/engine';\r\nimport { ButtonView, ContextualBalloon, clickOutsideHandler, CssTransitionDisablerMixin } from 'ckeditor5/src/ui';\r\nimport { isWidget } from 'ckeditor5/src/widget';\r\nimport LinkFormView from './ui/linkformview';\r\nimport LinkActionsView from './ui/linkactionsview';\r\nimport { addLinkProtocolIfApplicable, isLinkElement, LINK_KEYSTROKE } from './utils';\r\nimport linkIcon from '../theme/icons/link.svg';\r\nconst VISUAL_SELECTION_MARKER_NAME = 'link-ui';\r\n/**\r\n * The link UI plugin. It introduces the `'link'` and `'unlink'` buttons and support for the <kbd>Ctrl+K</kbd> keystroke.\r\n *\r\n * It uses the\r\n * {@link module:ui/panel/balloon/contextualballoon~ContextualBalloon contextual balloon plugin}.\r\n */\r\nexport default class LinkUI extends Plugin {\r\n    constructor() {\r\n        super(...arguments);\r\n        /**\r\n         * The actions view displayed inside of the balloon.\r\n         */\r\n        this.actionsView = null;\r\n        /**\r\n         * The form view displayed inside the balloon.\r\n         */\r\n        this.formView = null;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ContextualBalloon];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'LinkUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        editor.editing.view.addObserver(ClickObserver);\r\n        this._balloon = editor.plugins.get(ContextualBalloon);\r\n        // Create toolbar buttons.\r\n        this._createToolbarLinkButton();\r\n        this._enableBalloonActivators();\r\n        // Renders a fake visual selection marker on an expanded selection.\r\n        editor.conversion.for('editingDowncast').markerToHighlight({\r\n            model: VISUAL_SELECTION_MARKER_NAME,\r\n            view: {\r\n                classes: ['ck-fake-link-selection']\r\n            }\r\n        });\r\n        // Renders a fake visual selection marker on a collapsed selection.\r\n        editor.conversion.for('editingDowncast').markerToElement({\r\n            model: VISUAL_SELECTION_MARKER_NAME,\r\n            view: {\r\n                name: 'span',\r\n                classes: ['ck-fake-link-selection', 'ck-fake-link-selection_collapsed']\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        // Destroy created UI components as they are not automatically destroyed (see ckeditor5#1341).\r\n        if (this.formView) {\r\n            this.formView.destroy();\r\n        }\r\n        if (this.actionsView) {\r\n            this.actionsView.destroy();\r\n        }\r\n    }\r\n    /**\r\n     * Creates views.\r\n     */\r\n    _createViews() {\r\n        this.actionsView = this._createActionsView();\r\n        this.formView = this._createFormView();\r\n        // Attach lifecycle actions to the the balloon.\r\n        this._enableUserBalloonInteractions();\r\n    }\r\n    /**\r\n     * Creates the {@link module:link/ui/linkactionsview~LinkActionsView} instance.\r\n     */\r\n    _createActionsView() {\r\n        const editor = this.editor;\r\n        const actionsView = new LinkActionsView(editor.locale);\r\n        const linkCommand = editor.commands.get('link');\r\n        const unlinkCommand = editor.commands.get('unlink');\r\n        actionsView.bind('href').to(linkCommand, 'value');\r\n        actionsView.editButtonView.bind('isEnabled').to(linkCommand);\r\n        actionsView.unlinkButtonView.bind('isEnabled').to(unlinkCommand);\r\n        // Execute unlink command after clicking on the \"Edit\" button.\r\n        this.listenTo(actionsView, 'edit', () => {\r\n            this._addFormView();\r\n        });\r\n        // Execute unlink command after clicking on the \"Unlink\" button.\r\n        this.listenTo(actionsView, 'unlink', () => {\r\n            editor.execute('unlink');\r\n            this._hideUI();\r\n        });\r\n        // Close the panel on esc key press when the **actions have focus**.\r\n        actionsView.keystrokes.set('Esc', (data, cancel) => {\r\n            this._hideUI();\r\n            cancel();\r\n        });\r\n        // Open the form view on Ctrl+K when the **actions have focus**..\r\n        actionsView.keystrokes.set(LINK_KEYSTROKE, (data, cancel) => {\r\n            this._addFormView();\r\n            cancel();\r\n        });\r\n        return actionsView;\r\n    }\r\n    /**\r\n     * Creates the {@link module:link/ui/linkformview~LinkFormView} instance.\r\n     */\r\n    _createFormView() {\r\n        const editor = this.editor;\r\n        const linkCommand = editor.commands.get('link');\r\n        const defaultProtocol = editor.config.get('link.defaultProtocol');\r\n        const formView = new (CssTransitionDisablerMixin(LinkFormView))(editor.locale, linkCommand);\r\n        formView.urlInputView.fieldView.bind('value').to(linkCommand, 'value');\r\n        // Form elements should be read-only when corresponding commands are disabled.\r\n        formView.urlInputView.bind('isEnabled').to(linkCommand, 'isEnabled');\r\n        formView.saveButtonView.bind('isEnabled').to(linkCommand);\r\n        // Execute link command after clicking the \"Save\" button.\r\n        this.listenTo(formView, 'submit', () => {\r\n            const { value } = formView.urlInputView.fieldView.element;\r\n            const parsedUrl = addLinkProtocolIfApplicable(value, defaultProtocol);\r\n            editor.execute('link', parsedUrl, formView.getDecoratorSwitchesState());\r\n            this._closeFormView();\r\n        });\r\n        // Hide the panel after clicking the \"Cancel\" button.\r\n        this.listenTo(formView, 'cancel', () => {\r\n            this._closeFormView();\r\n        });\r\n        // Close the panel on esc key press when the **form has focus**.\r\n        formView.keystrokes.set('Esc', (data, cancel) => {\r\n            this._closeFormView();\r\n            cancel();\r\n        });\r\n        return formView;\r\n    }\r\n    /**\r\n     * Creates a toolbar Link button. Clicking this button will show\r\n     * a {@link #_balloon} attached to the selection.\r\n     */\r\n    _createToolbarLinkButton() {\r\n        const editor = this.editor;\r\n        const linkCommand = editor.commands.get('link');\r\n        const t = editor.t;\r\n        editor.ui.componentFactory.add('link', locale => {\r\n            const button = new ButtonView(locale);\r\n            button.isEnabled = true;\r\n            button.label = t('Link');\r\n            button.icon = linkIcon;\r\n            button.keystroke = LINK_KEYSTROKE;\r\n            button.tooltip = true;\r\n            button.isToggleable = true;\r\n            // Bind button to the command.\r\n            button.bind('isEnabled').to(linkCommand, 'isEnabled');\r\n            button.bind('isOn').to(linkCommand, 'value', value => !!value);\r\n            // Show the panel on button click.\r\n            this.listenTo(button, 'execute', () => this._showUI(true));\r\n            return button;\r\n        });\r\n    }\r\n    /**\r\n     * Attaches actions that control whether the balloon panel containing the\r\n     * {@link #formView} should be displayed.\r\n     */\r\n    _enableBalloonActivators() {\r\n        const editor = this.editor;\r\n        const viewDocument = editor.editing.view.document;\r\n        // Handle click on view document and show panel when selection is placed inside the link element.\r\n        // Keep panel open until selection will be inside the same link element.\r\n        this.listenTo(viewDocument, 'click', () => {\r\n            const parentLink = this._getSelectedLinkElement();\r\n            if (parentLink) {\r\n                // Then show panel but keep focus inside editor editable.\r\n                this._showUI();\r\n            }\r\n        });\r\n        // Handle the `Ctrl+K` keystroke and show the panel.\r\n        editor.keystrokes.set(LINK_KEYSTROKE, (keyEvtData, cancel) => {\r\n            // Prevent focusing the search bar in FF, Chrome and Edge. See https://github.com/ckeditor/ckeditor5/issues/4811.\r\n            cancel();\r\n            if (editor.commands.get('link').isEnabled) {\r\n                this._showUI(true);\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Attaches actions that control whether the balloon panel containing the\r\n     * {@link #formView} is visible or not.\r\n     */\r\n    _enableUserBalloonInteractions() {\r\n        // Focus the form if the balloon is visible and the Tab key has been pressed.\r\n        this.editor.keystrokes.set('Tab', (data, cancel) => {\r\n            if (this._areActionsVisible && !this.actionsView.focusTracker.isFocused) {\r\n                this.actionsView.focus();\r\n                cancel();\r\n            }\r\n        }, {\r\n            // Use the high priority because the link UI navigation is more important\r\n            // than other feature's actions, e.g. list indentation.\r\n            // https://github.com/ckeditor/ckeditor5-link/issues/146\r\n            priority: 'high'\r\n        });\r\n        // Close the panel on the Esc key press when the editable has focus and the balloon is visible.\r\n        this.editor.keystrokes.set('Esc', (data, cancel) => {\r\n            if (this._isUIVisible) {\r\n                this._hideUI();\r\n                cancel();\r\n            }\r\n        });\r\n        // Close on click outside of balloon panel element.\r\n        clickOutsideHandler({\r\n            emitter: this.formView,\r\n            activator: () => this._isUIInPanel,\r\n            contextElements: () => [this._balloon.view.element],\r\n            callback: () => this._hideUI()\r\n        });\r\n    }\r\n    /**\r\n     * Adds the {@link #actionsView} to the {@link #_balloon}.\r\n     *\r\n     * @internal\r\n     */\r\n    _addActionsView() {\r\n        if (!this.actionsView) {\r\n            this._createViews();\r\n        }\r\n        if (this._areActionsInPanel) {\r\n            return;\r\n        }\r\n        this._balloon.add({\r\n            view: this.actionsView,\r\n            position: this._getBalloonPositionData()\r\n        });\r\n    }\r\n    /**\r\n     * Adds the {@link #formView} to the {@link #_balloon}.\r\n     */\r\n    _addFormView() {\r\n        if (!this.formView) {\r\n            this._createViews();\r\n        }\r\n        if (this._isFormInPanel) {\r\n            return;\r\n        }\r\n        const editor = this.editor;\r\n        const linkCommand = editor.commands.get('link');\r\n        this.formView.disableCssTransitions();\r\n        this._balloon.add({\r\n            view: this.formView,\r\n            position: this._getBalloonPositionData()\r\n        });\r\n        // Select input when form view is currently visible.\r\n        if (this._balloon.visibleView === this.formView) {\r\n            this.formView.urlInputView.fieldView.select();\r\n        }\r\n        this.formView.enableCssTransitions();\r\n        // Make sure that each time the panel shows up, the URL field remains in sync with the value of\r\n        // the command. If the user typed in the input, then canceled the balloon (`urlInputView.fieldView#value` stays\r\n        // unaltered) and re-opened it without changing the value of the link command (e.g. because they\r\n        // clicked the same link), they would see the old value instead of the actual value of the command.\r\n        // https://github.com/ckeditor/ckeditor5-link/issues/78\r\n        // https://github.com/ckeditor/ckeditor5-link/issues/123\r\n        this.formView.urlInputView.fieldView.element.value = linkCommand.value || '';\r\n    }\r\n    /**\r\n     * Closes the form view. Decides whether the balloon should be hidden completely or if the action view should be shown. This is\r\n     * decided upon the link command value (which has a value if the document selection is in the link).\r\n     *\r\n     * Additionally, if any {@link module:link/linkconfig~LinkConfig#decorators} are defined in the editor configuration, the state of\r\n     * switch buttons responsible for manual decorator handling is restored.\r\n     */\r\n    _closeFormView() {\r\n        const linkCommand = this.editor.commands.get('link');\r\n        // Restore manual decorator states to represent the current model state. This case is important to reset the switch buttons\r\n        // when the user cancels the editing form.\r\n        linkCommand.restoreManualDecoratorStates();\r\n        if (linkCommand.value !== undefined) {\r\n            this._removeFormView();\r\n        }\r\n        else {\r\n            this._hideUI();\r\n        }\r\n    }\r\n    /**\r\n     * Removes the {@link #formView} from the {@link #_balloon}.\r\n     */\r\n    _removeFormView() {\r\n        if (this._isFormInPanel) {\r\n            // Blur the input element before removing it from DOM to prevent issues in some browsers.\r\n            // See https://github.com/ckeditor/ckeditor5/issues/1501.\r\n            this.formView.saveButtonView.focus();\r\n            this._balloon.remove(this.formView);\r\n            // Because the form has an input which has focus, the focus must be brought back\r\n            // to the editor. Otherwise, it would be lost.\r\n            this.editor.editing.view.focus();\r\n            this._hideFakeVisualSelection();\r\n        }\r\n    }\r\n    /**\r\n     * Shows the correct UI type. It is either {@link #formView} or {@link #actionsView}.\r\n     *\r\n     * @internal\r\n     */\r\n    _showUI(forceVisible = false) {\r\n        if (!this.formView) {\r\n            this._createViews();\r\n        }\r\n        // When there's no link under the selection, go straight to the editing UI.\r\n        if (!this._getSelectedLinkElement()) {\r\n            // Show visual selection on a text without a link when the contextual balloon is displayed.\r\n            // See https://github.com/ckeditor/ckeditor5/issues/4721.\r\n            this._showFakeVisualSelection();\r\n            this._addActionsView();\r\n            // Be sure panel with link is visible.\r\n            if (forceVisible) {\r\n                this._balloon.showStack('main');\r\n            }\r\n            this._addFormView();\r\n        }\r\n        // If there's a link under the selection...\r\n        else {\r\n            // Go to the editing UI if actions are already visible.\r\n            if (this._areActionsVisible) {\r\n                this._addFormView();\r\n            }\r\n            // Otherwise display just the actions UI.\r\n            else {\r\n                this._addActionsView();\r\n            }\r\n            // Be sure panel with link is visible.\r\n            if (forceVisible) {\r\n                this._balloon.showStack('main');\r\n            }\r\n        }\r\n        // Begin responding to ui#update once the UI is added.\r\n        this._startUpdatingUI();\r\n    }\r\n    /**\r\n     * Removes the {@link #formView} from the {@link #_balloon}.\r\n     *\r\n     * See {@link #_addFormView}, {@link #_addActionsView}.\r\n     */\r\n    _hideUI() {\r\n        if (!this._isUIInPanel) {\r\n            return;\r\n        }\r\n        const editor = this.editor;\r\n        this.stopListening(editor.ui, 'update');\r\n        this.stopListening(this._balloon, 'change:visibleView');\r\n        // Make sure the focus always gets back to the editable _before_ removing the focused form view.\r\n        // Doing otherwise causes issues in some browsers. See https://github.com/ckeditor/ckeditor5-link/issues/193.\r\n        editor.editing.view.focus();\r\n        // Remove form first because it's on top of the stack.\r\n        this._removeFormView();\r\n        // Then remove the actions view because it's beneath the form.\r\n        this._balloon.remove(this.actionsView);\r\n        this._hideFakeVisualSelection();\r\n    }\r\n    /**\r\n     * Makes the UI react to the {@link module:ui/editorui/editorui~EditorUI#event:update} event to\r\n     * reposition itself when the editor UI should be refreshed.\r\n     *\r\n     * See: {@link #_hideUI} to learn when the UI stops reacting to the `update` event.\r\n     */\r\n    _startUpdatingUI() {\r\n        const editor = this.editor;\r\n        const viewDocument = editor.editing.view.document;\r\n        let prevSelectedLink = this._getSelectedLinkElement();\r\n        let prevSelectionParent = getSelectionParent();\r\n        const update = () => {\r\n            const selectedLink = this._getSelectedLinkElement();\r\n            const selectionParent = getSelectionParent();\r\n            // Hide the panel if:\r\n            //\r\n            // * the selection went out of the EXISTING link element. E.g. user moved the caret out\r\n            //   of the link,\r\n            // * the selection went to a different parent when creating a NEW link. E.g. someone\r\n            //   else modified the document.\r\n            // * the selection has expanded (e.g. displaying link actions then pressing SHIFT+Right arrow).\r\n            //\r\n            // Note: #_getSelectedLinkElement will return a link for a non-collapsed selection only\r\n            // when fully selected.\r\n            if ((prevSelectedLink && !selectedLink) ||\r\n                (!prevSelectedLink && selectionParent !== prevSelectionParent)) {\r\n                this._hideUI();\r\n            }\r\n            // Update the position of the panel when:\r\n            //  * link panel is in the visible stack\r\n            //  * the selection remains in the original link element,\r\n            //  * there was no link element in the first place, i.e. creating a new link\r\n            else if (this._isUIVisible) {\r\n                // If still in a link element, simply update the position of the balloon.\r\n                // If there was no link (e.g. inserting one), the balloon must be moved\r\n                // to the new position in the editing view (a new native DOM range).\r\n                this._balloon.updatePosition(this._getBalloonPositionData());\r\n            }\r\n            prevSelectedLink = selectedLink;\r\n            prevSelectionParent = selectionParent;\r\n        };\r\n        function getSelectionParent() {\r\n            return viewDocument.selection.focus.getAncestors()\r\n                .reverse()\r\n                .find((node) => node.is('element'));\r\n        }\r\n        this.listenTo(editor.ui, 'update', update);\r\n        this.listenTo(this._balloon, 'change:visibleView', update);\r\n    }\r\n    /**\r\n     * Returns `true` when {@link #formView} is in the {@link #_balloon}.\r\n     */\r\n    get _isFormInPanel() {\r\n        return !!this.formView && this._balloon.hasView(this.formView);\r\n    }\r\n    /**\r\n     * Returns `true` when {@link #actionsView} is in the {@link #_balloon}.\r\n     */\r\n    get _areActionsInPanel() {\r\n        return !!this.actionsView && this._balloon.hasView(this.actionsView);\r\n    }\r\n    /**\r\n     * Returns `true` when {@link #actionsView} is in the {@link #_balloon} and it is\r\n     * currently visible.\r\n     */\r\n    get _areActionsVisible() {\r\n        return !!this.actionsView && this._balloon.visibleView === this.actionsView;\r\n    }\r\n    /**\r\n     * Returns `true` when {@link #actionsView} or {@link #formView} is in the {@link #_balloon}.\r\n     */\r\n    get _isUIInPanel() {\r\n        return this._isFormInPanel || this._areActionsInPanel;\r\n    }\r\n    /**\r\n     * Returns `true` when {@link #actionsView} or {@link #formView} is in the {@link #_balloon} and it is\r\n     * currently visible.\r\n     */\r\n    get _isUIVisible() {\r\n        const visibleView = this._balloon.visibleView;\r\n        return !!this.formView && visibleView == this.formView || this._areActionsVisible;\r\n    }\r\n    /**\r\n     * Returns positioning options for the {@link #_balloon}. They control the way the balloon is attached\r\n     * to the target element or selection.\r\n     *\r\n     * If the selection is collapsed and inside a link element, the panel will be attached to the\r\n     * entire link element. Otherwise, it will be attached to the selection.\r\n     */\r\n    _getBalloonPositionData() {\r\n        const view = this.editor.editing.view;\r\n        const model = this.editor.model;\r\n        const viewDocument = view.document;\r\n        let target;\r\n        if (model.markers.has(VISUAL_SELECTION_MARKER_NAME)) {\r\n            // There are cases when we highlight selection using a marker (#7705, #4721).\r\n            const markerViewElements = Array.from(this.editor.editing.mapper.markerNameToElements(VISUAL_SELECTION_MARKER_NAME));\r\n            const newRange = view.createRange(view.createPositionBefore(markerViewElements[0]), view.createPositionAfter(markerViewElements[markerViewElements.length - 1]));\r\n            target = view.domConverter.viewRangeToDom(newRange);\r\n        }\r\n        else {\r\n            // Make sure the target is calculated on demand at the last moment because a cached DOM range\r\n            // (which is very fragile) can desynchronize with the state of the editing view if there was\r\n            // any rendering done in the meantime. This can happen, for instance, when an inline widget\r\n            // gets unlinked.\r\n            target = () => {\r\n                const targetLink = this._getSelectedLinkElement();\r\n                return targetLink ?\r\n                    // When selection is inside link element, then attach panel to this element.\r\n                    view.domConverter.mapViewToDom(targetLink) :\r\n                    // Otherwise attach panel to the selection.\r\n                    view.domConverter.viewRangeToDom(viewDocument.selection.getFirstRange());\r\n            };\r\n        }\r\n        return { target };\r\n    }\r\n    /**\r\n     * Returns the link {@link module:engine/view/attributeelement~AttributeElement} under\r\n     * the {@link module:engine/view/document~Document editing view's} selection or `null`\r\n     * if there is none.\r\n     *\r\n     * **Note**: For a non–collapsed selection, the link element is returned when **fully**\r\n     * selected and the **only** element within the selection boundaries, or when\r\n     * a linked widget is selected.\r\n     */\r\n    _getSelectedLinkElement() {\r\n        const view = this.editor.editing.view;\r\n        const selection = view.document.selection;\r\n        const selectedElement = selection.getSelectedElement();\r\n        // The selection is collapsed or some widget is selected (especially inline widget).\r\n        if (selection.isCollapsed || selectedElement && isWidget(selectedElement)) {\r\n            return findLinkElementAncestor(selection.getFirstPosition());\r\n        }\r\n        else {\r\n            // The range for fully selected link is usually anchored in adjacent text nodes.\r\n            // Trim it to get closer to the actual link element.\r\n            const range = selection.getFirstRange().getTrimmed();\r\n            const startLink = findLinkElementAncestor(range.start);\r\n            const endLink = findLinkElementAncestor(range.end);\r\n            if (!startLink || startLink != endLink) {\r\n                return null;\r\n            }\r\n            // Check if the link element is fully selected.\r\n            if (view.createRangeIn(startLink).getTrimmed().isEqual(range)) {\r\n                return startLink;\r\n            }\r\n            else {\r\n                return null;\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Displays a fake visual selection when the contextual balloon is displayed.\r\n     *\r\n     * This adds a 'link-ui' marker into the document that is rendered as a highlight on selected text fragment.\r\n     */\r\n    _showFakeVisualSelection() {\r\n        const model = this.editor.model;\r\n        model.change(writer => {\r\n            const range = model.document.selection.getFirstRange();\r\n            if (model.markers.has(VISUAL_SELECTION_MARKER_NAME)) {\r\n                writer.updateMarker(VISUAL_SELECTION_MARKER_NAME, { range });\r\n            }\r\n            else {\r\n                if (range.start.isAtEnd) {\r\n                    const startPosition = range.start.getLastMatchingPosition(({ item }) => !model.schema.isContent(item), { boundaries: range });\r\n                    writer.addMarker(VISUAL_SELECTION_MARKER_NAME, {\r\n                        usingOperation: false,\r\n                        affectsData: false,\r\n                        range: writer.createRange(startPosition, range.end)\r\n                    });\r\n                }\r\n                else {\r\n                    writer.addMarker(VISUAL_SELECTION_MARKER_NAME, {\r\n                        usingOperation: false,\r\n                        affectsData: false,\r\n                        range\r\n                    });\r\n                }\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Hides the fake visual selection created in {@link #_showFakeVisualSelection}.\r\n     */\r\n    _hideFakeVisualSelection() {\r\n        const model = this.editor.model;\r\n        if (model.markers.has(VISUAL_SELECTION_MARKER_NAME)) {\r\n            model.change(writer => {\r\n                writer.removeMarker(VISUAL_SELECTION_MARKER_NAME);\r\n            });\r\n        }\r\n    }\r\n}\r\n/**\r\n * Returns a link element if there's one among the ancestors of the provided `Position`.\r\n *\r\n * @param View position to analyze.\r\n * @returns Link element at the position or null.\r\n */\r\nfunction findLinkElementAncestor(position) {\r\n    return position.getAncestors().find((ancestor) => isLinkElement(ancestor)) || null;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module link/autolink\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { Delete, TextWatcher, getLastTextLine } from 'ckeditor5/src/typing';\r\nimport { addLinkProtocolIfApplicable, linkHasProtocol } from './utils';\r\nconst MIN_LINK_LENGTH_WITH_SPACE_AT_END = 4; // Ie: \"t.co \" (length 5).\r\n// This was a tweak from https://gist.github.com/dperini/729294.\r\nconst URL_REG_EXP = new RegExp(\r\n// Group 1: Line start or after a space.\r\n'(^|\\\\s)' +\r\n    // Group 2: Detected URL (or e-mail).\r\n    '(' +\r\n    // Protocol identifier or short syntax \"//\"\r\n    // a. Full form http://user@foo.bar.baz:8080/foo/bar.html#baz?foo=bar\r\n    '(' +\r\n    '(?:(?:(?:https?|ftp):)?\\\\/\\\\/)' +\r\n    // BasicAuth using user:pass (optional)\r\n    '(?:\\\\S+(?::\\\\S*)?@)?' +\r\n    '(?:' +\r\n    // IP address dotted notation octets\r\n    // excludes loopback network 0.0.0.0\r\n    // excludes reserved space >= 224.0.0.0\r\n    // excludes network & broadcast addresses\r\n    // (first & last IP address of each class)\r\n    '(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])' +\r\n    '(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}' +\r\n    '(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))' +\r\n    '|' +\r\n    '(' +\r\n    // Do not allow `www.foo` - see https://github.com/ckeditor/ckeditor5/issues/8050.\r\n    '((?!www\\\\.)|(www\\\\.))' +\r\n    // Host & domain names.\r\n    '(?![-_])(?:[-_a-z0-9\\\\u00a1-\\\\uffff]{1,63}\\\\.)+' +\r\n    // TLD identifier name.\r\n    '(?:[a-z\\\\u00a1-\\\\uffff]{2,63})' +\r\n    ')' +\r\n    ')' +\r\n    // port number (optional)\r\n    '(?::\\\\d{2,5})?' +\r\n    // resource path (optional)\r\n    '(?:[/?#]\\\\S*)?' +\r\n    ')' +\r\n    '|' +\r\n    // b. Short form (either www.example.com or example@example.com)\r\n    '(' +\r\n    '(www.|(\\\\S+@))' +\r\n    // Host & domain names.\r\n    '((?![-_])(?:[-_a-z0-9\\\\u00a1-\\\\uffff]{1,63}\\\\.))+' +\r\n    // TLD identifier name.\r\n    '(?:[a-z\\\\u00a1-\\\\uffff]{2,63})' +\r\n    ')' +\r\n    ')$', 'i');\r\nconst URL_GROUP_IN_MATCH = 2;\r\n/**\r\n * The autolink plugin.\r\n */\r\nexport default class AutoLink extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [Delete];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'AutoLink';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const selection = editor.model.document.selection;\r\n        selection.on('change:range', () => {\r\n            // Disable plugin when selection is inside a code block.\r\n            this.isEnabled = !selection.anchor.parent.is('element', 'codeBlock');\r\n        });\r\n        this._enableTypingHandling();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    afterInit() {\r\n        this._enableEnterHandling();\r\n        this._enableShiftEnterHandling();\r\n    }\r\n    /**\r\n     * Enables autolinking on typing.\r\n     */\r\n    _enableTypingHandling() {\r\n        const editor = this.editor;\r\n        const watcher = new TextWatcher(editor.model, text => {\r\n            // 1. Detect <kbd>Space</kbd> after a text with a potential link.\r\n            if (!isSingleSpaceAtTheEnd(text)) {\r\n                return;\r\n            }\r\n            // 2. Check text before last typed <kbd>Space</kbd>.\r\n            const url = getUrlAtTextEnd(text.substr(0, text.length - 1));\r\n            if (url) {\r\n                return { url };\r\n            }\r\n        });\r\n        watcher.on('matched:data', (evt, data) => {\r\n            const { batch, range, url } = data;\r\n            if (!batch.isTyping) {\r\n                return;\r\n            }\r\n            const linkEnd = range.end.getShiftedBy(-1); // Executed after a space character.\r\n            const linkStart = linkEnd.getShiftedBy(-url.length);\r\n            const linkRange = editor.model.createRange(linkStart, linkEnd);\r\n            this._applyAutoLink(url, linkRange);\r\n        });\r\n        watcher.bind('isEnabled').to(this);\r\n    }\r\n    /**\r\n     * Enables autolinking on the <kbd>Enter</kbd> key.\r\n     */\r\n    _enableEnterHandling() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const enterCommand = editor.commands.get('enter');\r\n        if (!enterCommand) {\r\n            return;\r\n        }\r\n        enterCommand.on('execute', () => {\r\n            const position = model.document.selection.getFirstPosition();\r\n            if (!position.parent.previousSibling) {\r\n                return;\r\n            }\r\n            const rangeToCheck = model.createRangeIn(position.parent.previousSibling);\r\n            this._checkAndApplyAutoLinkOnRange(rangeToCheck);\r\n        });\r\n    }\r\n    /**\r\n     * Enables autolinking on the <kbd>Shift</kbd>+<kbd>Enter</kbd> keyboard shortcut.\r\n     */\r\n    _enableShiftEnterHandling() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const shiftEnterCommand = editor.commands.get('shiftEnter');\r\n        if (!shiftEnterCommand) {\r\n            return;\r\n        }\r\n        shiftEnterCommand.on('execute', () => {\r\n            const position = model.document.selection.getFirstPosition();\r\n            const rangeToCheck = model.createRange(model.createPositionAt(position.parent, 0), position.getShiftedBy(-1));\r\n            this._checkAndApplyAutoLinkOnRange(rangeToCheck);\r\n        });\r\n    }\r\n    /**\r\n     * Checks if the passed range contains a linkable text.\r\n     */\r\n    _checkAndApplyAutoLinkOnRange(rangeToCheck) {\r\n        const model = this.editor.model;\r\n        const { text, range } = getLastTextLine(rangeToCheck, model);\r\n        const url = getUrlAtTextEnd(text);\r\n        if (url) {\r\n            const linkRange = model.createRange(range.end.getShiftedBy(-url.length), range.end);\r\n            this._applyAutoLink(url, linkRange);\r\n        }\r\n    }\r\n    /**\r\n     * Applies a link on a given range if the link should be applied.\r\n     *\r\n     * @param url The URL to link.\r\n     * @param range The text range to apply the link attribute to.\r\n     */\r\n    _applyAutoLink(url, range) {\r\n        const model = this.editor.model;\r\n        const defaultProtocol = this.editor.config.get('link.defaultProtocol');\r\n        const fullUrl = addLinkProtocolIfApplicable(url, defaultProtocol);\r\n        if (!this.isEnabled || !isLinkAllowedOnRange(range, model) || !linkHasProtocol(fullUrl) || linkIsAlreadySet(range)) {\r\n            return;\r\n        }\r\n        this._persistAutoLink(fullUrl, range);\r\n    }\r\n    /**\r\n     * Enqueues autolink changes in the model.\r\n     *\r\n     * @param url The URL to link.\r\n     * @param range The text range to apply the link attribute to.\r\n     */\r\n    _persistAutoLink(url, range) {\r\n        const model = this.editor.model;\r\n        const deletePlugin = this.editor.plugins.get('Delete');\r\n        // Enqueue change to make undo step.\r\n        model.enqueueChange(writer => {\r\n            writer.setAttribute('linkHref', url, range);\r\n            model.enqueueChange(() => {\r\n                deletePlugin.requestUndoOnBackspace();\r\n            });\r\n        });\r\n    }\r\n}\r\n// Check if text should be evaluated by the plugin in order to reduce number of RegExp checks on whole text.\r\nfunction isSingleSpaceAtTheEnd(text) {\r\n    return text.length > MIN_LINK_LENGTH_WITH_SPACE_AT_END && text[text.length - 1] === ' ' && text[text.length - 2] !== ' ';\r\n}\r\nfunction getUrlAtTextEnd(text) {\r\n    const match = URL_REG_EXP.exec(text);\r\n    return match ? match[URL_GROUP_IN_MATCH] : null;\r\n}\r\nfunction isLinkAllowedOnRange(range, model) {\r\n    return model.schema.checkAttributeInSelection(model.createSelection(range), 'linkHref');\r\n}\r\nfunction linkIsAlreadySet(range) {\r\n    const item = range.start.nodeAfter;\r\n    return !!item && item.hasAttribute('linkHref');\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module link/linkimageediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { Matcher } from 'ckeditor5/src/engine';\r\nimport { toMap } from 'ckeditor5/src/utils';\r\nimport LinkEditing from './linkediting';\r\n/**\r\n * The link image engine feature.\r\n *\r\n * It accepts the `linkHref=\"url\"` attribute in the model for the {@link module:image/image~Image `<imageBlock>`} element\r\n * which allows linking images.\r\n */\r\nexport default class LinkImageEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return ['ImageEditing', 'ImageUtils', LinkEditing];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'LinkImageEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const schema = editor.model.schema;\r\n        if (editor.plugins.has('ImageBlockEditing')) {\r\n            schema.extend('imageBlock', { allowAttributes: ['linkHref'] });\r\n        }\r\n        editor.conversion.for('upcast').add(upcastLink(editor));\r\n        editor.conversion.for('downcast').add(downcastImageLink(editor));\r\n        // Definitions for decorators are provided by the `link` command and the `LinkEditing` plugin.\r\n        this._enableAutomaticDecorators();\r\n        this._enableManualDecorators();\r\n    }\r\n    /**\r\n     * Processes {@link module:link/linkconfig~LinkDecoratorAutomaticDefinition automatic decorators} definitions and\r\n     * attaches proper converters that will work when linking an image.`\r\n     */\r\n    _enableAutomaticDecorators() {\r\n        const editor = this.editor;\r\n        const command = editor.commands.get('link');\r\n        const automaticDecorators = command.automaticDecorators;\r\n        if (automaticDecorators.length) {\r\n            editor.conversion.for('downcast').add(automaticDecorators.getDispatcherForLinkedImage());\r\n        }\r\n    }\r\n    /**\r\n     * Processes transformed {@link module:link/utils/manualdecorator~ManualDecorator} instances and attaches proper converters\r\n     * that will work when linking an image.\r\n     */\r\n    _enableManualDecorators() {\r\n        const editor = this.editor;\r\n        const command = editor.commands.get('link');\r\n        for (const decorator of command.manualDecorators) {\r\n            if (editor.plugins.has('ImageBlockEditing')) {\r\n                editor.model.schema.extend('imageBlock', { allowAttributes: decorator.id });\r\n            }\r\n            if (editor.plugins.has('ImageInlineEditing')) {\r\n                editor.model.schema.extend('imageInline', { allowAttributes: decorator.id });\r\n            }\r\n            editor.conversion.for('downcast').add(downcastImageLinkManualDecorator(decorator));\r\n            editor.conversion.for('upcast').add(upcastImageLinkManualDecorator(editor, decorator));\r\n        }\r\n    }\r\n}\r\n/**\r\n * Returns a converter for linked block images that consumes the \"href\" attribute\r\n * if a link contains an image.\r\n *\r\n * @param editor The editor instance.\r\n */\r\nfunction upcastLink(editor) {\r\n    const isImageInlinePluginLoaded = editor.plugins.has('ImageInlineEditing');\r\n    const imageUtils = editor.plugins.get('ImageUtils');\r\n    return dispatcher => {\r\n        dispatcher.on('element:a', (evt, data, conversionApi) => {\r\n            const viewLink = data.viewItem;\r\n            const imageInLink = imageUtils.findViewImgElement(viewLink);\r\n            if (!imageInLink) {\r\n                return;\r\n            }\r\n            const blockImageView = imageInLink.findAncestor(element => imageUtils.isBlockImageView(element));\r\n            // There are four possible cases to consider here\r\n            //\r\n            // 1. A \"root > ... > figure.image > a > img\" structure.\r\n            // 2. A \"root > ... > figure.image > a > picture > img\" structure.\r\n            // 3. A \"root > ... > block > a > img\" structure.\r\n            // 4. A \"root > ... > block > a > picture > img\" structure.\r\n            //\r\n            // but the last 2 cases should only be considered by this converter when the inline image plugin\r\n            // is NOT loaded in the editor (because otherwise, that would be a plain, linked inline image).\r\n            if (isImageInlinePluginLoaded && !blockImageView) {\r\n                return;\r\n            }\r\n            // There's an image inside an <a> element - we consume it so it won't be picked up by the Link plugin.\r\n            const consumableAttributes = { attributes: ['href'] };\r\n            // Consume the `href` attribute so the default one will not convert it to $text attribute.\r\n            if (!conversionApi.consumable.consume(viewLink, consumableAttributes)) {\r\n                // Might be consumed by something else - i.e. other converter with priority=highest - a standard check.\r\n                return;\r\n            }\r\n            const linkHref = viewLink.getAttribute('href');\r\n            // Missing the 'href' attribute.\r\n            if (!linkHref) {\r\n                return;\r\n            }\r\n            // A full definition of the image feature.\r\n            // figure > a > img: parent of the view link element is an image element (figure).\r\n            let modelElement = data.modelCursor.parent;\r\n            if (!modelElement.is('element', 'imageBlock')) {\r\n                // a > img: parent of the view link is not the image (figure) element. We need to convert it manually.\r\n                const conversionResult = conversionApi.convertItem(imageInLink, data.modelCursor);\r\n                // Set image range as conversion result.\r\n                data.modelRange = conversionResult.modelRange;\r\n                // Continue conversion where image conversion ends.\r\n                data.modelCursor = conversionResult.modelCursor;\r\n                modelElement = data.modelCursor.nodeBefore;\r\n            }\r\n            if (modelElement && modelElement.is('element', 'imageBlock')) {\r\n                // Set the linkHref attribute from link element on model image element.\r\n                conversionApi.writer.setAttribute('linkHref', linkHref, modelElement);\r\n            }\r\n        }, { priority: 'high' });\r\n        // Using the same priority that `upcastImageLinkManualDecorator()` converter guarantees\r\n        // that manual decorators will decorate the proper element.\r\n    };\r\n}\r\n/**\r\n * Creates a converter that adds `<a>` to linked block image view elements.\r\n */\r\nfunction downcastImageLink(editor) {\r\n    const imageUtils = editor.plugins.get('ImageUtils');\r\n    return dispatcher => {\r\n        dispatcher.on('attribute:linkHref:imageBlock', (evt, data, conversionApi) => {\r\n            if (!conversionApi.consumable.consume(data.item, evt.name)) {\r\n                return;\r\n            }\r\n            // The image will be already converted - so it will be present in the view.\r\n            const viewFigure = conversionApi.mapper.toViewElement(data.item);\r\n            const writer = conversionApi.writer;\r\n            // But we need to check whether the link element exists.\r\n            const linkInImage = Array.from(viewFigure.getChildren())\r\n                .find((child) => child.is('element', 'a'));\r\n            const viewImage = imageUtils.findViewImgElement(viewFigure);\r\n            // <picture>...<img/></picture> or <img/>\r\n            const viewImgOrPicture = viewImage.parent.is('element', 'picture') ? viewImage.parent : viewImage;\r\n            // If so, update the attribute if it's defined or remove the entire link if the attribute is empty.\r\n            if (linkInImage) {\r\n                if (data.attributeNewValue) {\r\n                    writer.setAttribute('href', data.attributeNewValue, linkInImage);\r\n                }\r\n                else {\r\n                    writer.move(writer.createRangeOn(viewImgOrPicture), writer.createPositionAt(viewFigure, 0));\r\n                    writer.remove(linkInImage);\r\n                }\r\n            }\r\n            else {\r\n                // But if it does not exist. Let's wrap already converted image by newly created link element.\r\n                // 1. Create an empty link element.\r\n                const linkElement = writer.createContainerElement('a', { href: data.attributeNewValue });\r\n                // 2. Insert link inside the associated image.\r\n                writer.insert(writer.createPositionAt(viewFigure, 0), linkElement);\r\n                // 3. Move the image to the link.\r\n                writer.move(writer.createRangeOn(viewImgOrPicture), writer.createPositionAt(linkElement, 0));\r\n            }\r\n        }, { priority: 'high' });\r\n    };\r\n}\r\n/**\r\n * Returns a converter that decorates the `<a>` element when the image is the link label.\r\n */\r\nfunction downcastImageLinkManualDecorator(decorator) {\r\n    return dispatcher => {\r\n        dispatcher.on(`attribute:${decorator.id}:imageBlock`, (evt, data, conversionApi) => {\r\n            const viewFigure = conversionApi.mapper.toViewElement(data.item);\r\n            const linkInImage = Array.from(viewFigure.getChildren())\r\n                .find((child) => child.is('element', 'a'));\r\n            // The <a> element was removed by the time this converter is executed.\r\n            // It may happen when the base `linkHref` and decorator attributes are removed\r\n            // at the same time (see #8401).\r\n            if (!linkInImage) {\r\n                return;\r\n            }\r\n            for (const [key, val] of toMap(decorator.attributes)) {\r\n                conversionApi.writer.setAttribute(key, val, linkInImage);\r\n            }\r\n            if (decorator.classes) {\r\n                conversionApi.writer.addClass(decorator.classes, linkInImage);\r\n            }\r\n            for (const key in decorator.styles) {\r\n                conversionApi.writer.setStyle(key, decorator.styles[key], linkInImage);\r\n            }\r\n        });\r\n    };\r\n}\r\n/**\r\n * Returns a converter that checks whether manual decorators should be applied to the link.\r\n */\r\nfunction upcastImageLinkManualDecorator(editor, decorator) {\r\n    const isImageInlinePluginLoaded = editor.plugins.has('ImageInlineEditing');\r\n    const imageUtils = editor.plugins.get('ImageUtils');\r\n    return dispatcher => {\r\n        dispatcher.on('element:a', (evt, data, conversionApi) => {\r\n            const viewLink = data.viewItem;\r\n            const imageInLink = imageUtils.findViewImgElement(viewLink);\r\n            // We need to check whether an image is inside a link because the converter handles\r\n            // only manual decorators for linked images. See #7975.\r\n            if (!imageInLink) {\r\n                return;\r\n            }\r\n            const blockImageView = imageInLink.findAncestor(element => imageUtils.isBlockImageView(element));\r\n            if (isImageInlinePluginLoaded && !blockImageView) {\r\n                return;\r\n            }\r\n            const matcher = new Matcher(decorator._createPattern());\r\n            const result = matcher.match(viewLink);\r\n            // The link element does not have required attributes or/and proper values.\r\n            if (!result) {\r\n                return;\r\n            }\r\n            // Check whether we can consume those attributes.\r\n            if (!conversionApi.consumable.consume(viewLink, result.match)) {\r\n                return;\r\n            }\r\n            // At this stage we can assume that we have the `<imageBlock>` element.\r\n            // `nodeBefore` comes after conversion: `<a><img></a>`.\r\n            // `parent` comes with full image definition: `<figure><a><img></a></figure>.\r\n            // See the body of the `upcastLink()` function.\r\n            const modelElement = data.modelCursor.nodeBefore || data.modelCursor.parent;\r\n            conversionApi.writer.setAttribute(decorator.id, true, modelElement);\r\n        }, { priority: 'high' });\r\n        // Using the same priority that `upcastLink()` converter guarantees that the linked image was properly converted.\r\n    };\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module link/linkimageui\r\n */\r\nimport { ButtonView } from 'ckeditor5/src/ui';\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport LinkUI from './linkui';\r\nimport LinkEditing from './linkediting';\r\nimport { LINK_KEYSTROKE } from './utils';\r\nimport linkIcon from '../theme/icons/link.svg';\r\n/**\r\n * The link image UI plugin.\r\n *\r\n * This plugin provides the `'linkImage'` button that can be displayed in the {@link module:image/imagetoolbar~ImageToolbar}.\r\n * It can be used to wrap images in links.\r\n */\r\nexport default class LinkImageUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [LinkEditing, LinkUI, 'ImageBlockEditing'];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'LinkImageUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const viewDocument = editor.editing.view.document;\r\n        this.listenTo(viewDocument, 'click', (evt, data) => {\r\n            if (this._isSelectedLinkedImage(editor.model.document.selection)) {\r\n                // Prevent browser navigation when clicking a linked image.\r\n                data.preventDefault();\r\n                // Block the `LinkUI` plugin when an image was clicked.\r\n                // In such a case, we'd like to display the image toolbar.\r\n                evt.stop();\r\n            }\r\n        }, { priority: 'high' });\r\n        this._createToolbarLinkImageButton();\r\n    }\r\n    /**\r\n     * Creates a `LinkImageUI` button view.\r\n     *\r\n     * Clicking this button shows a {@link module:link/linkui~LinkUI#_balloon} attached to the selection.\r\n     * When an image is already linked, the view shows {@link module:link/linkui~LinkUI#actionsView} or\r\n     * {@link module:link/linkui~LinkUI#formView} if it is not.\r\n     */\r\n    _createToolbarLinkImageButton() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        editor.ui.componentFactory.add('linkImage', locale => {\r\n            const button = new ButtonView(locale);\r\n            const plugin = editor.plugins.get('LinkUI');\r\n            const linkCommand = editor.commands.get('link');\r\n            button.set({\r\n                isEnabled: true,\r\n                label: t('Link image'),\r\n                icon: linkIcon,\r\n                keystroke: LINK_KEYSTROKE,\r\n                tooltip: true,\r\n                isToggleable: true\r\n            });\r\n            // Bind button to the command.\r\n            button.bind('isEnabled').to(linkCommand, 'isEnabled');\r\n            button.bind('isOn').to(linkCommand, 'value', value => !!value);\r\n            // Show the actionsView or formView (both from LinkUI) on button click depending on whether the image is linked already.\r\n            this.listenTo(button, 'execute', () => {\r\n                if (this._isSelectedLinkedImage(editor.model.document.selection)) {\r\n                    plugin._addActionsView();\r\n                }\r\n                else {\r\n                    plugin._showUI(true);\r\n                }\r\n            });\r\n            return button;\r\n        });\r\n    }\r\n    /**\r\n     * Returns true if a linked image (either block or inline) is the only selected element\r\n     * in the model document.\r\n     */\r\n    _isSelectedLinkedImage(selection) {\r\n        const selectedModelElement = selection.getSelectedElement();\r\n        const imageUtils = this.editor.plugins.get('ImageUtils');\r\n        return imageUtils.isImage(selectedModelElement) && selectedModelElement.hasAttribute('linkHref');\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./linkimage.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { first } from 'ckeditor5/src/utils';\r\n/**\r\n * The list command. It is used by the {@link module:list/list~List list feature}.\r\n */\r\nexport default class ListCommand extends Command {\r\n    /**\r\n     * Creates an instance of the command.\r\n     *\r\n     * @param editor The editor instance.\r\n     * @param type List type that will be handled by this command.\r\n     */\r\n    constructor(editor, type) {\r\n        super(editor);\r\n        this.type = type;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        this.value = this._getValue();\r\n        this.isEnabled = this._checkEnabled();\r\n    }\r\n    /**\r\n     * Executes the list command.\r\n     *\r\n     * @fires execute\r\n     * @param options Command options.\r\n     * @param options.forceValue If set, it will force the command behavior. If `true`, the command will try to convert the\r\n     * selected items and potentially the neighbor elements to the proper list items. If set to `false`, it will convert selected elements\r\n     * to paragraphs. If not set, the command will toggle selected elements to list items or paragraphs, depending on the selection.\r\n     */\r\n    execute(options = {}) {\r\n        const model = this.editor.model;\r\n        const document = model.document;\r\n        const blocks = Array.from(document.selection.getSelectedBlocks())\r\n            .filter(block => checkCanBecomeListItem(block, model.schema));\r\n        // Whether we are turning off some items.\r\n        const turnOff = options.forceValue !== undefined ? !options.forceValue : this.value;\r\n        // If we are turning off items, we are going to rename them to paragraphs.\r\n        model.change(writer => {\r\n            // If part of a list got turned off, we need to handle (outdent) all of sub-items of the last turned-off item.\r\n            // To be sure that model is all the time in a good state, we first fix items below turned-off item.\r\n            if (turnOff) {\r\n                // Start from the model item that is just after the last turned-off item.\r\n                let next = blocks[blocks.length - 1].nextSibling;\r\n                let currentIndent = Number.POSITIVE_INFINITY;\r\n                let changes = [];\r\n                // Correct indent of all items after the last turned off item.\r\n                // Rules that should be followed:\r\n                // 1. All direct sub-items of turned-off item should become indent 0, because the first item after it\r\n                //    will be the first item of a new list. Other items are at the same level, so should have same 0 index.\r\n                // 2. All items with indent lower than indent of turned-off item should become indent 0, because they\r\n                //    should not end up as a child of any of list items that they were not children of before.\r\n                // 3. All other items should have their indent changed relatively to it's parent.\r\n                //\r\n                // For example:\r\n                // 1  * --------\r\n                // 2     * --------\r\n                // 3        * --------\t\t\t<-- this is turned off.\r\n                // 4           * --------\t\t<-- this has to become indent = 0, because it will be first item on a new list.\r\n                // 5              * --------\t<-- this should be still be a child of item above, so indent = 1.\r\n                // 6        * --------\t\t\t<-- this has to become indent = 0, because it should not be a child of any of items above.\r\n                // 7           * --------\t\t<-- this should be still be a child of item above, so indent = 1.\r\n                // 8     * --------\t\t\t\t<-- this has to become indent = 0.\r\n                // 9        * --------\t\t\t<-- this should still be a child of item above, so indent = 1.\r\n                // 10          * --------\t\t<-- this should still be a child of item above, so indent = 2.\r\n                // 11          * --------\t\t<-- this should still be at the same level as item above, so indent = 2.\r\n                // 12 * --------\t\t\t\t<-- this and all below are left unchanged.\r\n                // 13    * --------\r\n                // 14       * --------\r\n                //\r\n                // After turning off 3 the list becomes:\r\n                //\r\n                // 1  * --------\r\n                // 2     * --------\r\n                //\r\n                // 3  --------\r\n                //\r\n                // 4  * --------\r\n                // 5     * --------\r\n                // 6  * --------\r\n                // 7     * --------\r\n                // 8  * --------\r\n                // 9     * --------\r\n                // 10       * --------\r\n                // 11       * --------\r\n                // 12 * --------\r\n                // 13    * --------\r\n                // 14       * --------\r\n                //\r\n                // Thanks to this algorithm no lists are mismatched and no items get unexpected children/parent, while\r\n                // those parent-child connection which are possible to maintain are still maintained. It's worth noting\r\n                // that this is the same effect that we would be get by multiple use of outdent command. However doing\r\n                // it like this is much more efficient because it's less operation (less memory usage, easier OT) and\r\n                // less conversion (faster).\r\n                while (next && next.name == 'listItem' && next.getAttribute('listIndent') !== 0) {\r\n                    // Check each next list item, as long as its indent is bigger than 0.\r\n                    // If the indent is 0 we are not going to change anything anyway.\r\n                    const indent = next.getAttribute('listIndent');\r\n                    // We check if that's item indent is lower as current relative indent.\r\n                    if (indent < currentIndent) {\r\n                        // If it is, current relative indent becomes that indent.\r\n                        currentIndent = indent;\r\n                    }\r\n                    // Fix indent relatively to current relative indent.\r\n                    // Note, that if we just changed the current relative indent, the newIndent will be equal to 0.\r\n                    const newIndent = indent - currentIndent;\r\n                    // Save the entry in changes array. We do not apply it at the moment, because we will need to\r\n                    // reverse the changes so the last item is changed first.\r\n                    // This is to keep model in correct state all the time.\r\n                    changes.push({ element: next, listIndent: newIndent });\r\n                    // Find next item.\r\n                    next = next.nextSibling;\r\n                }\r\n                changes = changes.reverse();\r\n                for (const item of changes) {\r\n                    writer.setAttribute('listIndent', item.listIndent, item.element);\r\n                }\r\n            }\r\n            // If we are turning on, we might change some items that are already `listItem`s but with different type.\r\n            // Changing one nested list item to other type should also trigger changing all its siblings so the\r\n            // whole nested list is of the same type.\r\n            // Example (assume changing to numbered list):\r\n            // * ------\t\t\t\t<-- do not fix, top level item\r\n            //   * ------\t\t\t<-- fix, because latter list item of this item's list is changed\r\n            //      * ------\t\t<-- do not fix, item is not affected (different list)\r\n            //   * ------\t\t\t<-- fix, because latter list item of this item's list is changed\r\n            //      * ------\t\t<-- fix, because latter list item of this item's list is changed\r\n            //      * ---[--\t\t<-- already in selection\r\n            //   * ------\t\t\t<-- already in selection\r\n            //   * ------\t\t\t<-- already in selection\r\n            // * ------\t\t\t\t<-- already in selection, but does not cause other list items to change because is top-level\r\n            //   * ---]--\t\t\t<-- already in selection\r\n            //   * ------\t\t\t<-- fix, because preceding list item of this item's list is changed\r\n            //      * ------\t\t<-- do not fix, item is not affected (different list)\r\n            // * ------\t\t\t\t<-- do not fix, top level item\r\n            if (!turnOff) {\r\n                // Find lowest indent among selected items. This will be indicator what is the indent of\r\n                // top-most list affected by the command.\r\n                let lowestIndent = Number.POSITIVE_INFINITY;\r\n                for (const item of blocks) {\r\n                    if (item.is('element', 'listItem') && item.getAttribute('listIndent') < lowestIndent) {\r\n                        lowestIndent = item.getAttribute('listIndent');\r\n                    }\r\n                }\r\n                // Do not execute the fix for top-level lists.\r\n                lowestIndent = lowestIndent === 0 ? 1 : lowestIndent;\r\n                // Fix types of list items that are \"before\" the selected blocks.\r\n                _fixType(blocks, true, lowestIndent);\r\n                // Fix types of list items that are \"after\" the selected blocks.\r\n                _fixType(blocks, false, lowestIndent);\r\n            }\r\n            // Phew! Now it will be easier :).\r\n            // For each block element that was in the selection, we will either: turn it to list item,\r\n            // turn it to paragraph, or change it's type. Or leave it as it is.\r\n            // Do it in reverse as there might be multiple blocks (same as with changing indents).\r\n            for (const element of blocks.reverse()) {\r\n                if (turnOff && element.name == 'listItem') {\r\n                    // We are turning off and the element is a `listItem` - it should be converted to `paragraph`.\r\n                    // List item specific attributes are removed by post fixer.\r\n                    writer.rename(element, 'paragraph');\r\n                }\r\n                else if (!turnOff && element.name != 'listItem') {\r\n                    // We are turning on and the element is not a `listItem` - it should be converted to `listItem`.\r\n                    // The order of operations is important to keep model in correct state.\r\n                    writer.setAttributes({ listType: this.type, listIndent: 0 }, element);\r\n                    writer.rename(element, 'listItem');\r\n                }\r\n                else if (!turnOff && element.name == 'listItem' && element.getAttribute('listType') != this.type) {\r\n                    // We are turning on and the element is a `listItem` but has different type - change it's type and\r\n                    // type of it's all siblings that have same indent.\r\n                    writer.setAttribute('listType', this.type, element);\r\n                }\r\n            }\r\n            /**\r\n             * Event fired by the {@link #execute} method.\r\n             *\r\n             * It allows to execute an action after executing the {@link ~ListCommand#execute} method, for example adjusting\r\n             * attributes of changed blocks.\r\n             *\r\n             * @protected\r\n             * @event _executeCleanup\r\n             */\r\n            this.fire('_executeCleanup', blocks);\r\n        });\r\n    }\r\n    /**\r\n     * Checks the command's {@link #value}.\r\n     *\r\n     * @returns The current value.\r\n     */\r\n    _getValue() {\r\n        // Check whether closest `listItem` ancestor of the position has a correct type.\r\n        const listItem = first(this.editor.model.document.selection.getSelectedBlocks());\r\n        return !!listItem && listItem.is('element', 'listItem') && listItem.getAttribute('listType') == this.type;\r\n    }\r\n    /**\r\n     * Checks whether the command can be enabled in the current context.\r\n     *\r\n     * @returns Whether the command should be enabled.\r\n     */\r\n    _checkEnabled() {\r\n        // If command value is true it means that we are in list item, so the command should be enabled.\r\n        if (this.value) {\r\n            return true;\r\n        }\r\n        const selection = this.editor.model.document.selection;\r\n        const schema = this.editor.model.schema;\r\n        const firstBlock = first(selection.getSelectedBlocks());\r\n        if (!firstBlock) {\r\n            return false;\r\n        }\r\n        // Otherwise, check if list item can be inserted at the position start.\r\n        return checkCanBecomeListItem(firstBlock, schema);\r\n    }\r\n}\r\n/**\r\n * Helper function used when one or more list item have their type changed. Fixes type of other list items\r\n * that are affected by the change (are in same lists) but are not directly in selection. The function got extracted\r\n * not to duplicated code, as same fix has to be performed before and after selection.\r\n *\r\n * @param blocks Blocks that are in selection.\r\n * @param isBackward Specified whether fix will be applied for blocks before first selected block (`true`)\r\n * or blocks after last selected block (`false`).\r\n * @param lowestIndent Lowest indent among selected blocks.\r\n */\r\nfunction _fixType(blocks, isBackward, lowestIndent) {\r\n    // We need to check previous sibling of first changed item and next siblings of last changed item.\r\n    const startingItem = isBackward ? blocks[0] : blocks[blocks.length - 1];\r\n    if (startingItem.is('element', 'listItem')) {\r\n        let item = startingItem[isBackward ? 'previousSibling' : 'nextSibling'];\r\n        // During processing items, keeps the lowest indent of already processed items.\r\n        // This saves us from changing too many items.\r\n        // Following example is for going forward as it is easier to read, however same applies to going backward.\r\n        // * ------\r\n        //   * ------\r\n        //     * --[---\r\n        //   * ------\t\t<-- `lowestIndent` should be 1\r\n        //     * --]---\t\t<-- `startingItem`, `currentIndent` = 2, `lowestIndent` == 1\r\n        //     * ------\t\t<-- should be fixed, `indent` == 2 == `currentIndent`\r\n        //   * ------\t\t<-- should be fixed, set `currentIndent` to 1, `indent` == 1 == `currentIndent`\r\n        //     * ------\t\t<-- should not be fixed, item is in different list, `indent` = 2, `indent` != `currentIndent`\r\n        //   * ------\t\t<-- should be fixed, `indent` == 1 == `currentIndent`\r\n        // * ------\t\t\t<-- break loop (`indent` < `lowestIndent`)\r\n        let currentIndent = startingItem.getAttribute('listIndent');\r\n        // Look back until a list item with indent lower than reference `lowestIndent`.\r\n        // That would be the parent of nested sublist which contains item having `lowestIndent`.\r\n        while (item && item.is('element', 'listItem') && item.getAttribute('listIndent') >= lowestIndent) {\r\n            if (currentIndent > item.getAttribute('listIndent')) {\r\n                currentIndent = item.getAttribute('listIndent');\r\n            }\r\n            // Found an item that is in the same nested sublist.\r\n            if (item.getAttribute('listIndent') == currentIndent) {\r\n                // Just add the item to selected blocks like it was selected by the user.\r\n                blocks[isBackward ? 'unshift' : 'push'](item);\r\n            }\r\n            item = item[isBackward ? 'previousSibling' : 'nextSibling'];\r\n        }\r\n    }\r\n}\r\n/**\r\n * Checks whether the given block can be replaced by a listItem.\r\n *\r\n * @param block A block to be tested.\r\n * @param schema The schema of the document.\r\n */\r\nfunction checkCanBecomeListItem(block, schema) {\r\n    return schema.checkChild(block.parent, 'listItem') && !schema.isObject(block);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { first } from 'ckeditor5/src/utils';\r\n/**\r\n * The list indent command. It is used by the {@link module:list/list~List list feature}.\r\n */\r\nexport default class IndentCommand extends Command {\r\n    /**\r\n     * Creates an instance of the command.\r\n     *\r\n     * @param editor The editor instance.\r\n     * @param indentDirection The direction of indent. If it is equal to `backward`, the command will outdent a list item.\r\n     */\r\n    constructor(editor, indentDirection) {\r\n        super(editor);\r\n        this._indentBy = indentDirection == 'forward' ? 1 : -1;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        this.isEnabled = this._checkEnabled();\r\n    }\r\n    /**\r\n     * Indents or outdents (depending on the {@link #constructor}'s `indentDirection` parameter) selected list items.\r\n     *\r\n     * @fires execute\r\n     */\r\n    execute() {\r\n        const model = this.editor.model;\r\n        const doc = model.document;\r\n        let itemsToChange = Array.from(doc.selection.getSelectedBlocks());\r\n        model.change(writer => {\r\n            const lastItem = itemsToChange[itemsToChange.length - 1];\r\n            // Indenting a list item should also indent all the items that are already sub-items of indented item.\r\n            let next = lastItem.nextSibling;\r\n            // Check all items after last indented item, as long as their indent is bigger than indent of that item.\r\n            while (next && next.name == 'listItem' &&\r\n                next.getAttribute('listIndent') > lastItem.getAttribute('listIndent')) {\r\n                itemsToChange.push(next);\r\n                next = next.nextSibling;\r\n            }\r\n            // We need to be sure to keep model in correct state after each small change, because converters\r\n            // bases on that state and assumes that model is correct.\r\n            // Because of that, if the command outdents items, we will outdent them starting from the last item, as\r\n            // it is safer.\r\n            if (this._indentBy < 0) {\r\n                itemsToChange = itemsToChange.reverse();\r\n            }\r\n            for (const item of itemsToChange) {\r\n                const indent = item.getAttribute('listIndent') + this._indentBy;\r\n                // If indent is lower than 0, it means that the item got outdented when it was not indented.\r\n                // This means that we need to convert that list item to paragraph.\r\n                if (indent < 0) {\r\n                    // To keep the model as correct as possible, first rename listItem, then remove attributes,\r\n                    // as listItem without attributes is very incorrect and will cause problems in converters.\r\n                    // No need to remove attributes, will be removed by post fixer.\r\n                    writer.rename(item, 'paragraph');\r\n                }\r\n                // If indent is >= 0, change the attribute value.\r\n                else {\r\n                    writer.setAttribute('listIndent', indent, item);\r\n                }\r\n            }\r\n            // It allows to execute an action after executing the `~IndentCommand#execute` method, for example adjusting\r\n            // attributes of changed list items.\r\n            this.fire('_executeCleanup', itemsToChange);\r\n        });\r\n    }\r\n    /**\r\n     * Checks whether the command can be enabled in the current context.\r\n     *\r\n     * @returns Whether the command should be enabled.\r\n     */\r\n    _checkEnabled() {\r\n        // Check whether any of position's ancestor is a list item.\r\n        const listItem = first(this.editor.model.document.selection.getSelectedBlocks());\r\n        // If selection is not in a list item, the command is disabled.\r\n        if (!listItem || !listItem.is('element', 'listItem')) {\r\n            return false;\r\n        }\r\n        if (this._indentBy > 0) {\r\n            // Cannot indent first item in it's list. Check if before `listItem` is a list item that is in same list.\r\n            // To be in the same list, the item has to have same attributes and cannot be \"split\" by an item with lower indent.\r\n            const indent = listItem.getAttribute('listIndent');\r\n            const type = listItem.getAttribute('listType');\r\n            let prev = listItem.previousSibling;\r\n            while (prev && prev.is('element', 'listItem') && prev.getAttribute('listIndent') >= indent) {\r\n                if (prev.getAttribute('listIndent') == indent) {\r\n                    // The item is on the same level.\r\n                    // If it has same type, it means that we found a preceding sibling from the same list.\r\n                    // If it does not have same type, it means that `listItem` is on different list (this can happen only\r\n                    // on top level lists, though).\r\n                    return prev.getAttribute('listType') == type;\r\n                }\r\n                prev = prev.previousSibling;\r\n            }\r\n            // Could not find similar list item, this means that `listItem` is first in its list.\r\n            return false;\r\n        }\r\n        // If we are outdenting it is enough to be in list item. Every list item can always be outdented.\r\n        return true;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { TreeWalker, getFillerOffset } from 'ckeditor5/src/engine';\r\nimport { ButtonView } from 'ckeditor5/src/ui';\r\n/**\r\n * Creates a list item {@link module:engine/view/containerelement~ContainerElement}.\r\n *\r\n * @param writer The writer instance.\r\n */\r\nexport function createViewListItemElement(writer) {\r\n    const viewItem = writer.createContainerElement('li');\r\n    viewItem.getFillerOffset = getListItemFillerOffset;\r\n    return viewItem;\r\n}\r\n/**\r\n * Helper function that creates a `<ul><li></li></ul>` or (`<ol>`) structure out of the given `modelItem` model `listItem` element.\r\n * Then, it binds the created view list item (`<li>`) with the model `listItem` element.\r\n * The function then returns the created view list item (`<li>`).\r\n *\r\n * @param modelItem Model list item.\r\n * @param conversionApi Conversion interface.\r\n * @returns View list element.\r\n */\r\nexport function generateLiInUl(modelItem, conversionApi) {\r\n    const mapper = conversionApi.mapper;\r\n    const viewWriter = conversionApi.writer;\r\n    const listType = modelItem.getAttribute('listType') == 'numbered' ? 'ol' : 'ul';\r\n    const viewItem = createViewListItemElement(viewWriter);\r\n    const viewList = viewWriter.createContainerElement(listType, null);\r\n    viewWriter.insert(viewWriter.createPositionAt(viewList, 0), viewItem);\r\n    mapper.bindElements(modelItem, viewItem);\r\n    return viewItem;\r\n}\r\n/**\r\n * Helper function that inserts a view list at a correct place and merges it with its siblings.\r\n * It takes a model list item element (`modelItem`) and a corresponding view list item element (`injectedItem`). The view list item\r\n * should be in a view list element (`<ul>` or `<ol>`) and should be its only child.\r\n * See comments below to better understand the algorithm.\r\n *\r\n * @param modelItem Model list item.\r\n * @param injectedItem\r\n * @param conversionApi Conversion interface.\r\n * @param model The model instance.\r\n */\r\nexport function injectViewList(modelItem, injectedItem, conversionApi, model) {\r\n    const injectedList = injectedItem.parent;\r\n    const mapper = conversionApi.mapper;\r\n    const viewWriter = conversionApi.writer;\r\n    // The position where the view list will be inserted.\r\n    let insertPosition = mapper.toViewPosition(model.createPositionBefore(modelItem));\r\n    // 1. Find the previous list item that has the same or smaller indent. Basically we are looking for the first model item\r\n    // that is a \"parent\" or \"sibling\" of the injected model item.\r\n    // If there is no such list item, it means that the injected list item is the first item in \"its list\".\r\n    const refItem = getSiblingListItem(modelItem.previousSibling, {\r\n        sameIndent: true,\r\n        smallerIndent: true,\r\n        listIndent: modelItem.getAttribute('listIndent')\r\n    });\r\n    const prevItem = modelItem.previousSibling;\r\n    if (refItem && refItem.getAttribute('listIndent') == modelItem.getAttribute('listIndent')) {\r\n        // There is a list item with the same indent - we found the same-level sibling.\r\n        // Break the list after it. The inserted view item will be added in the broken space.\r\n        const viewItem = mapper.toViewElement(refItem);\r\n        insertPosition = viewWriter.breakContainer(viewWriter.createPositionAfter(viewItem));\r\n    }\r\n    else {\r\n        // There is no list item with the same indent. Check the previous model item.\r\n        if (prevItem && prevItem.name == 'listItem') {\r\n            // If it is a list item, it has to have a lower indent.\r\n            // It means that the inserted item should be added to it as its nested item.\r\n            insertPosition = mapper.toViewPosition(model.createPositionAt(prevItem, 'end'));\r\n            // There could be some not mapped elements (eg. span in to-do list) but we need to insert\r\n            // a nested list directly inside the li element.\r\n            const mappedViewAncestor = mapper.findMappedViewAncestor(insertPosition);\r\n            const nestedList = findNestedList(mappedViewAncestor);\r\n            // If there already is some nested list, then use it's position.\r\n            if (nestedList) {\r\n                insertPosition = viewWriter.createPositionBefore(nestedList);\r\n            }\r\n            else {\r\n                // Else just put new list on the end of list item content.\r\n                insertPosition = viewWriter.createPositionAt(mappedViewAncestor, 'end');\r\n            }\r\n        }\r\n        else {\r\n            // The previous item is not a list item (or does not exist at all).\r\n            // Just map the position and insert the view item at the mapped position.\r\n            insertPosition = mapper.toViewPosition(model.createPositionBefore(modelItem));\r\n        }\r\n    }\r\n    insertPosition = positionAfterUiElements(insertPosition);\r\n    // Insert the view item.\r\n    viewWriter.insert(insertPosition, injectedList);\r\n    // 2. Handle possible children of the injected model item.\r\n    if (prevItem && prevItem.name == 'listItem') {\r\n        const prevView = mapper.toViewElement(prevItem);\r\n        const walkerBoundaries = viewWriter.createRange(viewWriter.createPositionAt(prevView, 0), insertPosition);\r\n        const walker = walkerBoundaries.getWalker({ ignoreElementEnd: true });\r\n        for (const value of walker) {\r\n            if (value.item.is('element', 'li')) {\r\n                const breakPosition = viewWriter.breakContainer(viewWriter.createPositionBefore(value.item));\r\n                const viewList = value.item.parent;\r\n                const targetPosition = viewWriter.createPositionAt(injectedItem, 'end');\r\n                mergeViewLists(viewWriter, targetPosition.nodeBefore, targetPosition.nodeAfter);\r\n                viewWriter.move(viewWriter.createRangeOn(viewList), targetPosition);\r\n                // This is bad, but those lists will be removed soon anyway.\r\n                walker._position = breakPosition;\r\n            }\r\n        }\r\n    }\r\n    else {\r\n        const nextViewList = injectedList.nextSibling;\r\n        if (nextViewList && (nextViewList.is('element', 'ul') || nextViewList.is('element', 'ol'))) {\r\n            let lastSubChild = null;\r\n            for (const child of nextViewList.getChildren()) {\r\n                const modelChild = mapper.toModelElement(child);\r\n                if (modelChild &&\r\n                    modelChild.getAttribute('listIndent') > modelItem.getAttribute('listIndent')) {\r\n                    lastSubChild = child;\r\n                }\r\n                else {\r\n                    break;\r\n                }\r\n            }\r\n            if (lastSubChild) {\r\n                viewWriter.breakContainer(viewWriter.createPositionAfter(lastSubChild));\r\n                viewWriter.move(viewWriter.createRangeOn(lastSubChild.parent), viewWriter.createPositionAt(injectedItem, 'end'));\r\n            }\r\n        }\r\n    }\r\n    // Merge the inserted view list with its possible neighbor lists.\r\n    mergeViewLists(viewWriter, injectedList, injectedList.nextSibling);\r\n    mergeViewLists(viewWriter, injectedList.previousSibling, injectedList);\r\n}\r\nexport function mergeViewLists(viewWriter, firstList, secondList) {\r\n    // Check if two lists are going to be merged.\r\n    if (!firstList || !secondList || (firstList.name != 'ul' && firstList.name != 'ol')) {\r\n        return null;\r\n    }\r\n    // Both parameters are list elements, so compare types now.\r\n    if (firstList.name != secondList.name || firstList.getAttribute('class') !== secondList.getAttribute('class')) {\r\n        return null;\r\n    }\r\n    return viewWriter.mergeContainers(viewWriter.createPositionAfter(firstList));\r\n}\r\n/**\r\n * Helper function that for a given `view.Position`, returns a `view.Position` that is after all `view.UIElement`s that\r\n * are after the given position.\r\n *\r\n * For example:\r\n * `<container:p>foo^<ui:span></ui:span><ui:span></ui:span>bar</container:p>`\r\n * For position ^, the position before \"bar\" will be returned.\r\n *\r\n */\r\nexport function positionAfterUiElements(viewPosition) {\r\n    return viewPosition.getLastMatchingPosition(value => value.item.is('uiElement'));\r\n}\r\n/**\r\n * Helper function that searches for a previous list item sibling of a given model item that meets the given criteria\r\n * passed by the options object.\r\n *\r\n * @param options Search criteria.\r\n * @param options.sameIndent Whether the sought sibling should have the same indentation.\r\n * @param options.smallerIndent Whether the sought sibling should have a smaller indentation.\r\n * @param options.listIndent The reference indentation.\r\n * @param options.direction Walking direction.\r\n */\r\nexport function getSiblingListItem(modelItem, options) {\r\n    const sameIndent = !!options.sameIndent;\r\n    const smallerIndent = !!options.smallerIndent;\r\n    const indent = options.listIndent;\r\n    let item = modelItem;\r\n    while (item && item.name == 'listItem') {\r\n        const itemIndent = item.getAttribute('listIndent');\r\n        if ((sameIndent && indent == itemIndent) || (smallerIndent && indent > itemIndent)) {\r\n            return item;\r\n        }\r\n        if (options.direction === 'forward') {\r\n            item = item.nextSibling;\r\n        }\r\n        else {\r\n            item = item.previousSibling;\r\n        }\r\n    }\r\n    return null;\r\n}\r\n/**\r\n * Helper method for creating a UI button and linking it with an appropriate command.\r\n *\r\n * @internal\r\n * @param editor The editor instance to which the UI component will be added.\r\n * @param commandName The name of the command.\r\n * @param label The button label.\r\n * @param icon The source of the icon.\r\n */\r\nexport function createUIComponent(editor, commandName, label, icon) {\r\n    editor.ui.componentFactory.add(commandName, locale => {\r\n        const command = editor.commands.get(commandName);\r\n        const buttonView = new ButtonView(locale);\r\n        buttonView.set({\r\n            label,\r\n            icon,\r\n            tooltip: true,\r\n            isToggleable: true\r\n        });\r\n        // Bind button model to command.\r\n        buttonView.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\r\n        // Execute command.\r\n        buttonView.on('execute', () => {\r\n            editor.execute(commandName);\r\n            editor.editing.view.focus();\r\n        });\r\n        return buttonView;\r\n    });\r\n}\r\n/**\r\n * Returns a first list view element that is direct child of the given view element.\r\n */\r\nexport function findNestedList(viewElement) {\r\n    for (const node of viewElement.getChildren()) {\r\n        if (node.name == 'ul' || node.name == 'ol') {\r\n            return node;\r\n        }\r\n    }\r\n    return null;\r\n}\r\n/**\r\n * Returns an array with all `listItem` elements that represent the same list.\r\n *\r\n * It means that values of `listIndent`, `listType`, `listStyle`, `listReversed` and `listStart` for all items are equal.\r\n *\r\n * Additionally, if the `position` is inside a list item, that list item will be returned as well.\r\n *\r\n * @param position Starting position.\r\n * @param direction Walking direction.\r\n */\r\nexport function getSiblingNodes(position, direction) {\r\n    const items = [];\r\n    const listItem = position.parent;\r\n    const walkerOptions = {\r\n        ignoreElementEnd: false,\r\n        startPosition: position,\r\n        shallow: true,\r\n        direction\r\n    };\r\n    const limitIndent = listItem.getAttribute('listIndent');\r\n    const nodes = [...new TreeWalker(walkerOptions)]\r\n        .filter(value => value.item.is('element'))\r\n        .map(value => value.item);\r\n    for (const element of nodes) {\r\n        // If found something else than `listItem`, we're out of the list scope.\r\n        if (!element.is('element', 'listItem')) {\r\n            break;\r\n        }\r\n        // If current parsed item has lower indent that element that the element that was a starting point,\r\n        // it means we left a nested list. Abort searching items.\r\n        //\r\n        // ■ List item 1.       [listIndent=0]\r\n        //     ○ List item 2.[] [listIndent=1], limitIndent = 1,\r\n        //     ○ List item 3.   [listIndent=1]\r\n        // ■ List item 4.       [listIndent=0]\r\n        //\r\n        // Abort searching when leave nested list.\r\n        if (element.getAttribute('listIndent') < limitIndent) {\r\n            break;\r\n        }\r\n        // ■ List item 1.[]     [listIndent=0] limitIndent = 0,\r\n        //     ○ List item 2.   [listIndent=1]\r\n        //     ○ List item 3.   [listIndent=1]\r\n        // ■ List item 4.       [listIndent=0]\r\n        //\r\n        // Ignore nested lists.\r\n        if (element.getAttribute('listIndent') > limitIndent) {\r\n            continue;\r\n        }\r\n        // ■ List item 1.[]  [listType=bulleted]\r\n        // 1. List item 2.   [listType=numbered]\r\n        // 2.List item 3.    [listType=numbered]\r\n        //\r\n        // Abort searching when found a different kind of a list.\r\n        if (element.getAttribute('listType') !== listItem.getAttribute('listType')) {\r\n            break;\r\n        }\r\n        // ■ List item 1.[]  [listType=bulleted]\r\n        // ■ List item 2.    [listType=bulleted]\r\n        // ○ List item 3.    [listType=bulleted]\r\n        // ○ List item 4.    [listType=bulleted]\r\n        //\r\n        // Abort searching when found a different list style,\r\n        if (element.getAttribute('listStyle') !== listItem.getAttribute('listStyle')) {\r\n            break;\r\n        }\r\n        // ... different direction\r\n        if (element.getAttribute('listReversed') !== listItem.getAttribute('listReversed')) {\r\n            break;\r\n        }\r\n        // ... and different start index\r\n        if (element.getAttribute('listStart') !== listItem.getAttribute('listStart')) {\r\n            break;\r\n        }\r\n        if (direction === 'backward') {\r\n            items.unshift(element);\r\n        }\r\n        else {\r\n            items.push(element);\r\n        }\r\n    }\r\n    return items;\r\n}\r\n/**\r\n * Returns an array with all `listItem` elements in the model selection.\r\n *\r\n * It returns all the items even if only a part of the list is selected, including items that belong to nested lists.\r\n * If no list is selected, it returns an empty array.\r\n * The order of the elements is not specified.\r\n *\r\n * @internal\r\n */\r\nexport function getSelectedListItems(model) {\r\n    const document = model.document;\r\n    // For all selected blocks find all list items that are being selected\r\n    // and update the `listStyle` attribute in those lists.\r\n    let listItems = [...document.selection.getSelectedBlocks()]\r\n        .filter(element => element.is('element', 'listItem'))\r\n        .map(element => {\r\n        const position = model.change(writer => writer.createPositionAt(element, 0));\r\n        return [\r\n            ...getSiblingNodes(position, 'backward'),\r\n            ...getSiblingNodes(position, 'forward')\r\n        ];\r\n    })\r\n        .flat();\r\n    // Since `getSelectedBlocks()` can return items that belong to the same list, and\r\n    // `getSiblingNodes()` returns the entire list, we need to remove duplicated items.\r\n    listItems = [...new Set(listItems)];\r\n    return listItems;\r\n}\r\nconst BULLETED_LIST_STYLE_TYPES = ['disc', 'circle', 'square'];\r\n// There's a lot of them (https://www.w3.org/TR/css-counter-styles-3/#typedef-counter-style).\r\n// Let's support only those that can be selected by ListPropertiesUI.\r\nconst NUMBERED_LIST_STYLE_TYPES = [\r\n    'decimal',\r\n    'decimal-leading-zero',\r\n    'lower-roman',\r\n    'upper-roman',\r\n    'lower-latin',\r\n    'upper-latin'\r\n];\r\n/**\r\n * Checks whether the given list-style-type is supported by numbered or bulleted list.\r\n */\r\nexport function getListTypeFromListStyleType(listStyleType) {\r\n    if (BULLETED_LIST_STYLE_TYPES.includes(listStyleType)) {\r\n        return 'bulleted';\r\n    }\r\n    if (NUMBERED_LIST_STYLE_TYPES.includes(listStyleType)) {\r\n        return 'numbered';\r\n    }\r\n    return null;\r\n}\r\n/**\r\n * Implementation of getFillerOffset for view list item element.\r\n *\r\n * @returns Block filler offset or `null` if block filler is not needed.\r\n */\r\nfunction getListItemFillerOffset() {\r\n    const hasOnlyLists = !this.isEmpty && (this.getChild(0).name == 'ul' || this.getChild(0).name == 'ol');\r\n    if (this.isEmpty || hasOnlyLists) {\r\n        return 0;\r\n    }\r\n    return getFillerOffset.call(this);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { getListTypeFromListStyleType, getSelectedListItems, getSiblingNodes } from './utils';\r\n/**\r\n * A set of helpers related to document lists.\r\n */\r\nexport default class ListUtils extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ListUtils';\r\n    }\r\n    /**\r\n     * Checks whether the given list-style-type is supported by numbered or bulleted list.\r\n     */\r\n    getListTypeFromListStyleType(listStyleType) {\r\n        return getListTypeFromListStyleType(listStyleType);\r\n    }\r\n    /**\r\n     * Returns an array with all `listItem` elements in the model selection.\r\n     *\r\n     * It returns all the items even if only a part of the list is selected, including items that belong to nested lists.\r\n     * If no list is selected, it returns an empty array.\r\n     * The order of the elements is not specified.\r\n     */\r\n    getSelectedListItems(model) {\r\n        return getSelectedListItems(model);\r\n    }\r\n    /**\r\n     * Returns an array with all `listItem` elements that represent the same list.\r\n     *\r\n     * It means that values of `listIndent`, `listType`, `listStyle`, `listReversed` and `listStart` for all items are equal.\r\n     *\r\n     * Additionally, if the `position` is inside a list item, that list item will be returned as well.\r\n     *\r\n     * @param position Starting position.\r\n     * @param direction Walking direction.\r\n     */\r\n    getSiblingNodes(position, direction) {\r\n        return getSiblingNodes(position, direction);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module list/list/converters\r\n */\r\nimport { TreeWalker } from 'ckeditor5/src/engine';\r\nimport { generateLiInUl, injectViewList, mergeViewLists, getSiblingListItem, positionAfterUiElements } from './utils';\r\n/**\r\n * A model-to-view converter for the `listItem` model element insertion.\r\n *\r\n * It creates a `<ul><li></li><ul>` (or `<ol>`) view structure out of a `listItem` model element, inserts it at the correct\r\n * position, and merges the list with surrounding lists (if available).\r\n *\r\n * @see module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:insert\r\n * @param model Model instance.\r\n */\r\nexport function modelViewInsertion(model) {\r\n    return (evt, data, conversionApi) => {\r\n        const consumable = conversionApi.consumable;\r\n        if (!consumable.test(data.item, 'insert') ||\r\n            !consumable.test(data.item, 'attribute:listType') ||\r\n            !consumable.test(data.item, 'attribute:listIndent')) {\r\n            return;\r\n        }\r\n        consumable.consume(data.item, 'insert');\r\n        consumable.consume(data.item, 'attribute:listType');\r\n        consumable.consume(data.item, 'attribute:listIndent');\r\n        const modelItem = data.item;\r\n        const viewItem = generateLiInUl(modelItem, conversionApi);\r\n        injectViewList(modelItem, viewItem, conversionApi, model);\r\n    };\r\n}\r\n/**\r\n * A model-to-view converter for the `listItem` model element removal.\r\n *\r\n * @see module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:remove\r\n * @param model Model instance.\r\n * @returns Returns a conversion callback.\r\n */\r\nexport function modelViewRemove(model) {\r\n    return (evt, data, conversionApi) => {\r\n        const viewPosition = conversionApi.mapper.toViewPosition(data.position);\r\n        const viewStart = viewPosition.getLastMatchingPosition(value => !value.item.is('element', 'li'));\r\n        const viewItem = viewStart.nodeAfter;\r\n        const viewWriter = conversionApi.writer;\r\n        // 1. Break the container after and before the list item.\r\n        // This will create a view list with one view list item - the one to remove.\r\n        viewWriter.breakContainer(viewWriter.createPositionBefore(viewItem));\r\n        viewWriter.breakContainer(viewWriter.createPositionAfter(viewItem));\r\n        // 2. Remove the list with the item to remove.\r\n        const viewList = viewItem.parent;\r\n        const viewListPrev = viewList.previousSibling;\r\n        const removeRange = viewWriter.createRangeOn(viewList);\r\n        const removed = viewWriter.remove(removeRange);\r\n        // 3. Merge the whole created by breaking and removing the list.\r\n        if (viewListPrev && viewListPrev.nextSibling) {\r\n            mergeViewLists(viewWriter, viewListPrev, viewListPrev.nextSibling);\r\n        }\r\n        // 4. Bring back nested list that was in the removed <li>.\r\n        const modelItem = conversionApi.mapper.toModelElement(viewItem);\r\n        hoistNestedLists(modelItem.getAttribute('listIndent') + 1, data.position, removeRange.start, viewItem, conversionApi, model);\r\n        // 5. Unbind removed view item and all children.\r\n        for (const child of viewWriter.createRangeIn(removed).getItems()) {\r\n            conversionApi.mapper.unbindViewElement(child);\r\n        }\r\n        evt.stop();\r\n    };\r\n}\r\n/**\r\n * A model-to-view converter for the `type` attribute change on the `listItem` model element.\r\n *\r\n * This change means that the `<li>` element parent changes from `<ul>` to `<ol>` (or vice versa). This is accomplished\r\n * by breaking view elements and changing their name. The next {@link module:list/list/converters~modelViewMergeAfterChangeType}\r\n * converter will attempt to merge split nodes.\r\n *\r\n * Splitting this conversion into 2 steps makes it possible to add an additional conversion in the middle.\r\n * Check {@link module:list/todolist/todolistconverters~modelViewChangeType} to see an example of it.\r\n *\r\n * @see module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:attribute\r\n */\r\nexport const modelViewChangeType = (evt, data, conversionApi) => {\r\n    if (!conversionApi.consumable.test(data.item, evt.name)) {\r\n        return;\r\n    }\r\n    const viewItem = conversionApi.mapper.toViewElement(data.item);\r\n    const viewWriter = conversionApi.writer;\r\n    // Break the container after and before the list item.\r\n    // This will create a view list with one view list item -- the one that changed type.\r\n    viewWriter.breakContainer(viewWriter.createPositionBefore(viewItem));\r\n    viewWriter.breakContainer(viewWriter.createPositionAfter(viewItem));\r\n    // Change name of the view list that holds the changed view item.\r\n    // We cannot just change name property, because that would not render properly.\r\n    const viewList = viewItem.parent;\r\n    const listName = data.attributeNewValue == 'numbered' ? 'ol' : 'ul';\r\n    viewWriter.rename(listName, viewList);\r\n};\r\n/**\r\n * A model-to-view converter that attempts to merge nodes split by {@link module:list/list/converters~modelViewChangeType}.\r\n *\r\n * @see module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:attribute\r\n */\r\nexport const modelViewMergeAfterChangeType = (evt, data, conversionApi) => {\r\n    conversionApi.consumable.consume(data.item, evt.name);\r\n    const viewItem = conversionApi.mapper.toViewElement(data.item);\r\n    const viewList = viewItem.parent;\r\n    const viewWriter = conversionApi.writer;\r\n    // Merge the changed view list with other lists, if possible.\r\n    mergeViewLists(viewWriter, viewList, viewList.nextSibling);\r\n    mergeViewLists(viewWriter, viewList.previousSibling, viewList);\r\n};\r\n/**\r\n * A model-to-view converter for the `listIndent` attribute change on the `listItem` model element.\r\n *\r\n * @see module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:attribute\r\n * @param model Model instance.\r\n * @returns Returns a conversion callback.\r\n */\r\nexport function modelViewChangeIndent(model) {\r\n    return (evt, data, conversionApi) => {\r\n        if (!conversionApi.consumable.consume(data.item, 'attribute:listIndent')) {\r\n            return;\r\n        }\r\n        const viewItem = conversionApi.mapper.toViewElement(data.item);\r\n        const viewWriter = conversionApi.writer;\r\n        // 1. Break the container after and before the list item.\r\n        // This will create a view list with one view list item -- the one that changed type.\r\n        viewWriter.breakContainer(viewWriter.createPositionBefore(viewItem));\r\n        viewWriter.breakContainer(viewWriter.createPositionAfter(viewItem));\r\n        // 2. Extract view list with changed view list item and merge \"hole\" possibly created by breaking and removing elements.\r\n        const viewList = viewItem.parent;\r\n        const viewListPrev = viewList.previousSibling;\r\n        const removeRange = viewWriter.createRangeOn(viewList);\r\n        viewWriter.remove(removeRange);\r\n        if (viewListPrev && viewListPrev.nextSibling) {\r\n            mergeViewLists(viewWriter, viewListPrev, viewListPrev.nextSibling);\r\n        }\r\n        // 3. Bring back nested list that was in the removed <li>.\r\n        hoistNestedLists(data.attributeOldValue + 1, data.range.start, removeRange.start, viewItem, conversionApi, model);\r\n        // 4. Inject view list like it is newly inserted.\r\n        injectViewList(data.item, viewItem, conversionApi, model);\r\n        // 5. Consume insertion of children inside the item. They are already handled by re-building the item in view.\r\n        for (const child of data.item.getChildren()) {\r\n            conversionApi.consumable.consume(child, 'insert');\r\n        }\r\n    };\r\n}\r\n/**\r\n * A special model-to-view converter introduced by the {@link module:list/list~List list feature}. This converter is fired for\r\n * insert change of every model item, and should be fired before the actual converter. The converter checks whether the inserted\r\n * model item is a non-`listItem` element. If it is, and it is inserted inside a view list, the converter breaks the\r\n * list so the model element is inserted to the view parent element corresponding to its model parent element.\r\n *\r\n * The converter prevents such situations:\r\n *\r\n * ```xml\r\n * // Model:                        // View:\r\n * <listItem>foo</listItem>         <ul>\r\n * <listItem>bar</listItem>             <li>foo</li>\r\n *                                      <li>bar</li>\r\n *                                  </ul>\r\n *\r\n * // After change:                 // Correct view guaranteed by this converter:\r\n * <listItem>foo</listItem>         <ul><li>foo</li></ul><p>xxx</p><ul><li>bar</li></ul>\r\n * <paragraph>xxx</paragraph>       // Instead of this wrong view state:\r\n * <listItem>bar</listItem>         <ul><li>foo</li><p>xxx</p><li>bar</li></ul>\r\n * ```\r\n *\r\n * @see module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:insert\r\n */\r\nexport const modelViewSplitOnInsert = (evt, data, conversionApi) => {\r\n    if (!conversionApi.consumable.test(data.item, evt.name)) {\r\n        return;\r\n    }\r\n    if (data.item.name != 'listItem') {\r\n        let viewPosition = conversionApi.mapper.toViewPosition(data.range.start);\r\n        const viewWriter = conversionApi.writer;\r\n        const lists = [];\r\n        // Break multiple ULs/OLs if there are.\r\n        //\r\n        // Imagine following list:\r\n        //\r\n        // 1 --------\r\n        //   1.1 --------\r\n        //     1.1.1 --------\r\n        //     1.1.2 --------\r\n        //     1.1.3 --------\r\n        //       1.1.3.1 --------\r\n        //   1.2 --------\r\n        //     1.2.1 --------\r\n        // 2 --------\r\n        //\r\n        // Insert paragraph after item 1.1.1:\r\n        //\r\n        // 1 --------\r\n        //   1.1 --------\r\n        //     1.1.1 --------\r\n        //\r\n        // Lorem ipsum.\r\n        //\r\n        //     1.1.2 --------\r\n        //     1.1.3 --------\r\n        //       1.1.3.1 --------\r\n        //   1.2 --------\r\n        //     1.2.1 --------\r\n        // 2 --------\r\n        //\r\n        // In this case 1.1.2 has to become beginning of a new list.\r\n        // We need to break list before 1.1.2 (obvious), then we need to break list also before 1.2.\r\n        // Then we need to move those broken pieces one after another and merge:\r\n        //\r\n        // 1 --------\r\n        //   1.1 --------\r\n        //     1.1.1 --------\r\n        //\r\n        // Lorem ipsum.\r\n        //\r\n        // 1.1.2 --------\r\n        //   1.1.3 --------\r\n        //     1.1.3.1 --------\r\n        // 1.2 --------\r\n        //   1.2.1 --------\r\n        // 2 --------\r\n        //\r\n        while (viewPosition.parent.name == 'ul' || viewPosition.parent.name == 'ol') {\r\n            viewPosition = viewWriter.breakContainer(viewPosition);\r\n            if (viewPosition.parent.name != 'li') {\r\n                break;\r\n            }\r\n            // Remove lists that are after inserted element.\r\n            // They will be brought back later, below the inserted element.\r\n            const removeStart = viewPosition;\r\n            const removeEnd = viewWriter.createPositionAt(viewPosition.parent, 'end');\r\n            // Don't remove if there is nothing to remove.\r\n            if (!removeStart.isEqual(removeEnd)) {\r\n                const removed = viewWriter.remove(viewWriter.createRange(removeStart, removeEnd));\r\n                lists.push(removed);\r\n            }\r\n            viewPosition = viewWriter.createPositionAfter(viewPosition.parent);\r\n        }\r\n        // Bring back removed lists.\r\n        if (lists.length > 0) {\r\n            for (let i = 0; i < lists.length; i++) {\r\n                const previousList = viewPosition.nodeBefore;\r\n                const insertedRange = viewWriter.insert(viewPosition, lists[i]);\r\n                viewPosition = insertedRange.end;\r\n                // Don't merge first list! We want a split in that place (this is why this converter is introduced).\r\n                if (i > 0) {\r\n                    const mergePos = mergeViewLists(viewWriter, previousList, previousList.nextSibling);\r\n                    // If `mergePos` is in `previousList` it means that the lists got merged.\r\n                    // In this case, we need to fix insert position.\r\n                    if (mergePos && mergePos.parent == previousList) {\r\n                        viewPosition.offset--;\r\n                    }\r\n                }\r\n            }\r\n            // Merge last inserted list with element after it.\r\n            mergeViewLists(viewWriter, viewPosition.nodeBefore, viewPosition.nodeAfter);\r\n        }\r\n    }\r\n};\r\n/**\r\n * A special model-to-view converter introduced by the {@link module:list/list~List list feature}. This converter takes care of\r\n * merging view lists after something is removed or moved from near them.\r\n *\r\n * Example:\r\n *\r\n * ```xml\r\n * // Model:                        // View:\r\n * <listItem>foo</listItem>         <ul><li>foo</li></ul>\r\n * <paragraph>xxx</paragraph>       <p>xxx</p>\r\n * <listItem>bar</listItem>         <ul><li>bar</li></ul>\r\n *\r\n * // After change:                 // Correct view guaranteed by this converter:\r\n * <listItem>foo</listItem>         <ul>\r\n * <listItem>bar</listItem>             <li>foo</li>\r\n *                                      <li>bar</li>\r\n *                                  </ul>\r\n * ```\r\n *\r\n * @see module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:remove\r\n */\r\nexport const modelViewMergeAfter = (evt, data, conversionApi) => {\r\n    const viewPosition = conversionApi.mapper.toViewPosition(data.position);\r\n    const viewItemPrev = viewPosition.nodeBefore;\r\n    const viewItemNext = viewPosition.nodeAfter;\r\n    // Merge lists if something (remove, move) was done from inside of list.\r\n    // Merging will be done only if both items are view lists of the same type.\r\n    // The check is done inside the helper function.\r\n    mergeViewLists(conversionApi.writer, viewItemPrev, viewItemNext);\r\n};\r\n/**\r\n * A view-to-model converter that converts the `<li>` view elements into the `listItem` model elements.\r\n *\r\n * To set correct values of the `listType` and `listIndent` attributes the converter:\r\n * * checks `<li>`'s parent,\r\n * * stores and increases the `conversionApi.store.indent` value when `<li>`'s sub-items are converted.\r\n *\r\n * @see module:engine/conversion/upcastdispatcher~UpcastDispatcher#event:element\r\n */\r\nexport const viewModelConverter = (evt, data, conversionApi) => {\r\n    if (conversionApi.consumable.consume(data.viewItem, { name: true })) {\r\n        const writer = conversionApi.writer;\r\n        // 1. Create `listItem` model element.\r\n        const listItem = writer.createElement('listItem');\r\n        // 2. Handle `listItem` model element attributes.\r\n        const indent = getIndent(data.viewItem);\r\n        writer.setAttribute('listIndent', indent, listItem);\r\n        // Set 'bulleted' as default. If this item is pasted into a context,\r\n        const type = data.viewItem.parent && data.viewItem.parent.name == 'ol' ? 'numbered' : 'bulleted';\r\n        writer.setAttribute('listType', type, listItem);\r\n        if (!conversionApi.safeInsert(listItem, data.modelCursor)) {\r\n            return;\r\n        }\r\n        const nextPosition = viewToModelListItemChildrenConverter(listItem, data.viewItem.getChildren(), conversionApi);\r\n        // Result range starts before the first item and ends after the last.\r\n        data.modelRange = writer.createRange(data.modelCursor, nextPosition);\r\n        conversionApi.updateConversionResult(listItem, data);\r\n    }\r\n};\r\n/**\r\n * A view-to-model converter for the `<ul>` and `<ol>` view elements that cleans the input view of garbage.\r\n * This is mostly to clean whitespaces from between the `<li>` view elements inside the view list element, however, also\r\n * incorrect data can be cleared if the view was incorrect.\r\n *\r\n * @see module:engine/conversion/upcastdispatcher~UpcastDispatcher#event:element\r\n */\r\nexport const cleanList = (evt, data, conversionApi) => {\r\n    if (conversionApi.consumable.test(data.viewItem, { name: true })) {\r\n        // Caching children because when we start removing them iterating fails.\r\n        const children = Array.from(data.viewItem.getChildren());\r\n        for (const child of children) {\r\n            const isWrongElement = !(child.is('element', 'li') || isList(child));\r\n            if (isWrongElement) {\r\n                child._remove();\r\n            }\r\n        }\r\n    }\r\n};\r\n/**\r\n * A view-to-model converter for the `<li>` elements that cleans whitespace formatting from the input view.\r\n *\r\n * @see module:engine/conversion/upcastdispatcher~UpcastDispatcher#event:element\r\n */\r\nexport const cleanListItem = (evt, data, conversionApi) => {\r\n    if (conversionApi.consumable.test(data.viewItem, { name: true })) {\r\n        if (data.viewItem.childCount === 0) {\r\n            return;\r\n        }\r\n        const children = [...data.viewItem.getChildren()];\r\n        let foundList = false;\r\n        for (const child of children) {\r\n            if (foundList && !isList(child)) {\r\n                child._remove();\r\n            }\r\n            if (isList(child)) {\r\n                // If this is a <ul> or <ol>, do not process it, just mark that we already visited list element.\r\n                foundList = true;\r\n            }\r\n        }\r\n    }\r\n};\r\n/**\r\n * Returns a callback for model position to view position mapping for {@link module:engine/conversion/mapper~Mapper}. The callback fixes\r\n * positions between the `listItem` elements that would be incorrectly mapped because of how list items are represented in the model\r\n * and in the view.\r\n */\r\nexport function modelToViewPosition(view) {\r\n    return (evt, data) => {\r\n        if (data.isPhantom) {\r\n            return;\r\n        }\r\n        const modelItem = data.modelPosition.nodeBefore;\r\n        if (modelItem && modelItem.is('element', 'listItem')) {\r\n            const viewItem = data.mapper.toViewElement(modelItem);\r\n            const topmostViewList = viewItem.getAncestors().find(isList);\r\n            const walker = view.createPositionAt(viewItem, 0).getWalker();\r\n            for (const value of walker) {\r\n                if (value.type == 'elementStart' && value.item.is('element', 'li')) {\r\n                    data.viewPosition = value.previousPosition;\r\n                    break;\r\n                }\r\n                else if (value.type == 'elementEnd' && value.item == topmostViewList) {\r\n                    data.viewPosition = value.nextPosition;\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n    };\r\n}\r\n/**\r\n * The callback for view position to model position mapping for {@link module:engine/conversion/mapper~Mapper}. The callback fixes\r\n * positions between the `<li>` elements that would be incorrectly mapped because of how list items are represented in the model\r\n * and in the view.\r\n *\r\n * @see module:engine/conversion/mapper~Mapper#event:viewToModelPosition\r\n * @param model Model instance.\r\n * @returns Returns a conversion callback.\r\n */\r\nexport function viewToModelPosition(model) {\r\n    return (evt, data) => {\r\n        const viewPos = data.viewPosition;\r\n        const viewParent = viewPos.parent;\r\n        const mapper = data.mapper;\r\n        if (viewParent.name == 'ul' || viewParent.name == 'ol') {\r\n            // Position is directly in <ul> or <ol>.\r\n            if (!viewPos.isAtEnd) {\r\n                // If position is not at the end, it must be before <li>.\r\n                // Get that <li>, map it to `listItem` and set model position before that `listItem`.\r\n                const modelNode = mapper.toModelElement(viewPos.nodeAfter);\r\n                data.modelPosition = model.createPositionBefore(modelNode);\r\n            }\r\n            else {\r\n                // Position is at the end of <ul> or <ol>, so there is no <li> after it to be mapped.\r\n                // There is <li> before the position, but we cannot just map it to `listItem` and set model position after it,\r\n                // because that <li> may contain nested items.\r\n                // We will check \"model length\" of that <li>, in other words - how many `listItem`s are in that <li>.\r\n                const modelNode = mapper.toModelElement(viewPos.nodeBefore);\r\n                const modelLength = mapper.getModelLength(viewPos.nodeBefore);\r\n                // Then we get model position before mapped `listItem` and shift it accordingly.\r\n                data.modelPosition = model.createPositionBefore(modelNode).getShiftedBy(modelLength);\r\n            }\r\n            evt.stop();\r\n        }\r\n        else if (viewParent.name == 'li' &&\r\n            viewPos.nodeBefore &&\r\n            (viewPos.nodeBefore.name == 'ul' || viewPos.nodeBefore.name == 'ol')) {\r\n            // In most cases when view position is in <li> it is in text and this is a correct position.\r\n            // However, if position is after <ul> or <ol> we have to fix it -- because in model <ul>/<ol> are not in the `listItem`.\r\n            const modelNode = mapper.toModelElement(viewParent);\r\n            // Check all <ul>s and <ol>s that are in the <li> but before mapped position.\r\n            // Get model length of those elements and then add it to the offset of `listItem` mapped to the original <li>.\r\n            let modelLength = 1; // Starts from 1 because the original <li> has to be counted in too.\r\n            let viewList = viewPos.nodeBefore;\r\n            while (viewList && isList(viewList)) {\r\n                modelLength += mapper.getModelLength(viewList);\r\n                viewList = viewList.previousSibling;\r\n            }\r\n            data.modelPosition = model.createPositionBefore(modelNode).getShiftedBy(modelLength);\r\n            evt.stop();\r\n        }\r\n    };\r\n}\r\n/**\r\n * Post-fixer that reacts to changes on document and fixes incorrect model states.\r\n *\r\n * In the example below, there is a correct list structure.\r\n * Then the middle element is removed so the list structure will become incorrect:\r\n *\r\n * ```xml\r\n * <listItem listType=\"bulleted\" listIndent=0>Item 1</listItem>\r\n * <listItem listType=\"bulleted\" listIndent=1>Item 2</listItem>   <--- this is removed.\r\n * <listItem listType=\"bulleted\" listIndent=2>Item 3</listItem>\r\n * ```\r\n *\r\n * The list structure after the middle element is removed:\r\n *\r\n * ```xml\r\n * <listItem listType=\"bulleted\" listIndent=0>Item 1</listItem>\r\n * <listItem listType=\"bulleted\" listIndent=2>Item 3</listItem>\r\n * ```\r\n *\r\n * Should become:\r\n *\r\n * ```xml\r\n * <listItem listType=\"bulleted\" listIndent=0>Item 1</listItem>\r\n * <listItem listType=\"bulleted\" listIndent=1>Item 3</listItem>   <--- note that indent got post-fixed.\r\n * ```\r\n *\r\n * @param model The data model.\r\n * @param writer The writer to do changes with.\r\n * @returns `true` if any change has been applied, `false` otherwise.\r\n */\r\nexport function modelChangePostFixer(model, writer) {\r\n    const changes = model.document.differ.getChanges();\r\n    const itemToListHead = new Map();\r\n    let applied = false;\r\n    for (const entry of changes) {\r\n        if (entry.type == 'insert' && entry.name == 'listItem') {\r\n            _addListToFix(entry.position);\r\n        }\r\n        else if (entry.type == 'insert' && entry.name != 'listItem') {\r\n            if (entry.name != '$text') {\r\n                // In case of renamed element.\r\n                const item = entry.position.nodeAfter;\r\n                if (item.hasAttribute('listIndent')) {\r\n                    writer.removeAttribute('listIndent', item);\r\n                    applied = true;\r\n                }\r\n                if (item.hasAttribute('listType')) {\r\n                    writer.removeAttribute('listType', item);\r\n                    applied = true;\r\n                }\r\n                if (item.hasAttribute('listStyle')) {\r\n                    writer.removeAttribute('listStyle', item);\r\n                    applied = true;\r\n                }\r\n                if (item.hasAttribute('listReversed')) {\r\n                    writer.removeAttribute('listReversed', item);\r\n                    applied = true;\r\n                }\r\n                if (item.hasAttribute('listStart')) {\r\n                    writer.removeAttribute('listStart', item);\r\n                    applied = true;\r\n                }\r\n                for (const innerItem of Array.from(model.createRangeIn(item)).filter(e => e.item.is('element', 'listItem'))) {\r\n                    _addListToFix(innerItem.previousPosition);\r\n                }\r\n            }\r\n            const posAfter = entry.position.getShiftedBy(entry.length);\r\n            _addListToFix(posAfter);\r\n        }\r\n        else if (entry.type == 'remove' && entry.name == 'listItem') {\r\n            _addListToFix(entry.position);\r\n        }\r\n        else if (entry.type == 'attribute' && entry.attributeKey == 'listIndent') {\r\n            _addListToFix(entry.range.start);\r\n        }\r\n        else if (entry.type == 'attribute' && entry.attributeKey == 'listType') {\r\n            _addListToFix(entry.range.start);\r\n        }\r\n    }\r\n    for (const listHead of itemToListHead.values()) {\r\n        _fixListIndents(listHead);\r\n        _fixListTypes(listHead);\r\n    }\r\n    return applied;\r\n    function _addListToFix(position) {\r\n        const previousNode = position.nodeBefore;\r\n        if (!previousNode || !previousNode.is('element', 'listItem')) {\r\n            const item = position.nodeAfter;\r\n            if (item && item.is('element', 'listItem')) {\r\n                itemToListHead.set(item, item);\r\n            }\r\n        }\r\n        else {\r\n            let listHead = previousNode;\r\n            if (itemToListHead.has(listHead)) {\r\n                return;\r\n            }\r\n            for (\r\n            // Cache previousSibling and reuse for performance reasons. See #6581.\r\n            let previousSibling = listHead.previousSibling; previousSibling && previousSibling.is('element', 'listItem'); previousSibling = listHead.previousSibling) {\r\n                listHead = previousSibling;\r\n                if (itemToListHead.has(listHead)) {\r\n                    return;\r\n                }\r\n            }\r\n            itemToListHead.set(previousNode, listHead);\r\n        }\r\n    }\r\n    function _fixListIndents(item) {\r\n        let maxIndent = 0;\r\n        let fixBy = null;\r\n        while (item && item.is('element', 'listItem')) {\r\n            const itemIndent = item.getAttribute('listIndent');\r\n            if (itemIndent > maxIndent) {\r\n                let newIndent;\r\n                if (fixBy === null) {\r\n                    fixBy = itemIndent - maxIndent;\r\n                    newIndent = maxIndent;\r\n                }\r\n                else {\r\n                    if (fixBy > itemIndent) {\r\n                        fixBy = itemIndent;\r\n                    }\r\n                    newIndent = itemIndent - fixBy;\r\n                }\r\n                writer.setAttribute('listIndent', newIndent, item);\r\n                applied = true;\r\n            }\r\n            else {\r\n                fixBy = null;\r\n                maxIndent = item.getAttribute('listIndent') + 1;\r\n            }\r\n            item = item.nextSibling;\r\n        }\r\n    }\r\n    function _fixListTypes(item) {\r\n        let typesStack = [];\r\n        let prev = null;\r\n        while (item && item.is('element', 'listItem')) {\r\n            const itemIndent = item.getAttribute('listIndent');\r\n            if (prev && prev.getAttribute('listIndent') > itemIndent) {\r\n                typesStack = typesStack.slice(0, itemIndent + 1);\r\n            }\r\n            if (itemIndent != 0) {\r\n                if (typesStack[itemIndent]) {\r\n                    const type = typesStack[itemIndent];\r\n                    if (item.getAttribute('listType') != type) {\r\n                        writer.setAttribute('listType', type, item);\r\n                        applied = true;\r\n                    }\r\n                }\r\n                else {\r\n                    typesStack[itemIndent] = item.getAttribute('listType');\r\n                }\r\n            }\r\n            prev = item;\r\n            item = item.nextSibling;\r\n        }\r\n    }\r\n}\r\n/**\r\n * A fixer for pasted content that includes list items.\r\n *\r\n * It fixes indentation of pasted list items so the pasted items match correctly to the context they are pasted into.\r\n *\r\n * Example:\r\n *\r\n * ```xml\r\n * <listItem listType=\"bulleted\" listIndent=0>A</listItem>\r\n * <listItem listType=\"bulleted\" listIndent=1>B^</listItem>\r\n * // At ^ paste:  <listItem listType=\"bulleted\" listIndent=4>X</listItem>\r\n * //              <listItem listType=\"bulleted\" listIndent=5>Y</listItem>\r\n * <listItem listType=\"bulleted\" listIndent=2>C</listItem>\r\n * ```\r\n *\r\n * Should become:\r\n *\r\n * ```xml\r\n * <listItem listType=\"bulleted\" listIndent=0>A</listItem>\r\n * <listItem listType=\"bulleted\" listIndent=1>BX</listItem>\r\n * <listItem listType=\"bulleted\" listIndent=2>Y/listItem>\r\n * <listItem listType=\"bulleted\" listIndent=2>C</listItem>\r\n * ```\r\n */\r\nexport const modelIndentPasteFixer = function (evt, [content, selectable]) {\r\n    const model = this;\r\n    // Check whether inserted content starts from a `listItem`. If it does not, it means that there are some other\r\n    // elements before it and there is no need to fix indents, because even if we insert that content into a list,\r\n    // that list will be broken.\r\n    // Note: we also need to handle singular elements because inserting item with indent 0 into 0,1,[],2\r\n    // would create incorrect model.\r\n    let item = content.is('documentFragment') ? content.getChild(0) : content;\r\n    let selection;\r\n    if (!selectable) {\r\n        selection = model.document.selection;\r\n    }\r\n    else {\r\n        selection = model.createSelection(selectable);\r\n    }\r\n    if (item && item.is('element', 'listItem')) {\r\n        // Get a reference list item. Inserted list items will be fixed according to that item.\r\n        const pos = selection.getFirstPosition();\r\n        let refItem = null;\r\n        if (pos.parent.is('element', 'listItem')) {\r\n            refItem = pos.parent;\r\n        }\r\n        else if (pos.nodeBefore && pos.nodeBefore.is('element', 'listItem')) {\r\n            refItem = pos.nodeBefore;\r\n        }\r\n        // If there is `refItem` it means that we do insert list items into an existing list.\r\n        if (refItem) {\r\n            // First list item in `data` has indent equal to 0 (it is a first list item). It should have indent equal\r\n            // to the indent of reference item. We have to fix the first item and all of it's children and following siblings.\r\n            // Indent of all those items has to be adjusted to reference item.\r\n            const indentChange = refItem.getAttribute('listIndent');\r\n            // Fix only if there is anything to fix.\r\n            if (indentChange > 0) {\r\n                // Adjust indent of all \"first\" list items in inserted data.\r\n                while (item && item.is('element', 'listItem')) {\r\n                    item._setAttribute('listIndent', item.getAttribute('listIndent') + indentChange);\r\n                    item = item.nextSibling;\r\n                }\r\n            }\r\n        }\r\n    }\r\n};\r\n/**\r\n * Helper function that converts children of a given `<li>` view element into corresponding model elements.\r\n * The function maintains proper order of elements if model `listItem` is split during the conversion\r\n * due to block children conversion.\r\n *\r\n * @param listItemModel List item model element to which converted children will be inserted.\r\n * @param viewChildren View elements which will be converted.\r\n * @param conversionApi Conversion interface to be used by the callback.\r\n * @returns Position on which next elements should be inserted after children conversion.\r\n */\r\nfunction viewToModelListItemChildrenConverter(listItemModel, viewChildren, conversionApi) {\r\n    const { writer, schema } = conversionApi;\r\n    // A position after the last inserted `listItem`.\r\n    let nextPosition = writer.createPositionAfter(listItemModel);\r\n    // Check all children of the converted `<li>`. At this point we assume there are no \"whitespace\" view text nodes\r\n    // in view list, between view list items. This should be handled by `<ul>` and `<ol>` converters.\r\n    for (const child of viewChildren) {\r\n        if (child.name == 'ul' || child.name == 'ol') {\r\n            // If the children is a list, we will insert its conversion result after currently handled `listItem`.\r\n            // Then, next insertion position will be set after all the new list items (and maybe other elements if\r\n            // something split list item).\r\n            //\r\n            // If this is a list, we expect that some `listItem`s and possibly other blocks will be inserted, however `.modelCursor`\r\n            // should be set after last `listItem` (or block). This is why it feels safe to use it as `nextPosition`\r\n            nextPosition = conversionApi.convertItem(child, nextPosition).modelCursor;\r\n        }\r\n        else {\r\n            // If this is not a list, try inserting content at the end of the currently handled `listItem`.\r\n            const result = conversionApi.convertItem(child, writer.createPositionAt(listItemModel, 'end'));\r\n            // It may end up that the current `listItem` becomes split (if that content cannot be inside `listItem`). For example:\r\n            //\r\n            // <li><p>Foo</p></li>\r\n            //\r\n            // will be converted to:\r\n            //\r\n            // <listItem></listItem><paragraph>Foo</paragraph><listItem></listItem>\r\n            //\r\n            const convertedChild = result.modelRange.start.nodeAfter;\r\n            const wasSplit = convertedChild && convertedChild.is('element') && !schema.checkChild(listItemModel, convertedChild.name);\r\n            if (wasSplit) {\r\n                // As `lastListItem` got split, we need to update it to the second part of the split `listItem` element.\r\n                //\r\n                // `modelCursor` should be set to a position where the conversion should continue. There are multiple possible scenarios\r\n                // that may happen. Usually, `modelCursor` (marked as `#` below) would point to the second list item after conversion:\r\n                //\r\n                //\t\t`<li><p>Foo</p></li>` -> `<listItem></listItem><paragraph>Foo</paragraph><listItem>#</listItem>`\r\n                //\r\n                // However, in some cases, like auto-paragraphing, the position is placed at the end of the block element:\r\n                //\r\n                //\t\t`<li><div>Foo</div></li>` -> `<listItem></listItem><paragraph>Foo#</paragraph><listItem></listItem>`\r\n                //\r\n                // or after an element if another element broken auto-paragraphed element:\r\n                //\r\n                //\t\t`<li><div><h2>Foo</h2></div></li>` -> `<listItem></listItem><heading1>Foo</heading1>#<listItem></listItem>`\r\n                //\r\n                // We need to check for such cases and use proper list item and position based on it.\r\n                //\r\n                if (result.modelCursor.parent.is('element', 'listItem')) {\r\n                    // (1).\r\n                    listItemModel = result.modelCursor.parent;\r\n                }\r\n                else {\r\n                    // (2), (3).\r\n                    listItemModel = findNextListItem(result.modelCursor);\r\n                }\r\n                nextPosition = writer.createPositionAfter(listItemModel);\r\n            }\r\n        }\r\n    }\r\n    return nextPosition;\r\n}\r\n/**\r\n * Helper function that seeks for a next list item starting from given `startPosition`.\r\n */\r\nfunction findNextListItem(startPosition) {\r\n    const treeWalker = new TreeWalker({ startPosition });\r\n    let value;\r\n    do {\r\n        value = treeWalker.next();\r\n    } while (!value.value.item.is('element', 'listItem'));\r\n    return value.value.item;\r\n}\r\n/**\r\n * Helper function that takes all children of given `viewRemovedItem` and moves them in a correct place, according\r\n * to other given parameters.\r\n */\r\nfunction hoistNestedLists(nextIndent, modelRemoveStartPosition, viewRemoveStartPosition, viewRemovedItem, conversionApi, model) {\r\n    // Find correct previous model list item element.\r\n    // The element has to have either same or smaller indent than given reference indent.\r\n    // This will be the model element which will get nested items (if it has smaller indent) or sibling items (if it has same indent).\r\n    // Keep in mind that such element might not be found, if removed item was the first item.\r\n    const prevModelItem = getSiblingListItem(modelRemoveStartPosition.nodeBefore, {\r\n        sameIndent: true,\r\n        smallerIndent: true,\r\n        listIndent: nextIndent\r\n    });\r\n    const mapper = conversionApi.mapper;\r\n    const viewWriter = conversionApi.writer;\r\n    // Indent of found element or `null` if the element has not been found.\r\n    const prevIndent = prevModelItem ? prevModelItem.getAttribute('listIndent') : null;\r\n    let insertPosition;\r\n    if (!prevModelItem) {\r\n        // If element has not been found, simply insert lists at the position where the removed item was:\r\n        //\r\n        // Lorem ipsum.\r\n        // 1 --------           <--- this is removed, no previous list item, put nested items in place of removed item.\r\n        //   1.1 --------       <--- this is reference indent.\r\n        //     1.1.1 --------\r\n        //     1.1.2 --------\r\n        //   1.2 --------\r\n        //\r\n        // Becomes:\r\n        //\r\n        // Lorem ipsum.\r\n        // 1.1 --------\r\n        //   1.1.1 --------\r\n        //   1.1.2 --------\r\n        // 1.2 --------\r\n        insertPosition = viewRemoveStartPosition;\r\n    }\r\n    else if (prevIndent == nextIndent) {\r\n        // If element has been found and has same indent as reference indent it means that nested items should\r\n        // become siblings of found element:\r\n        //\r\n        // 1 --------\r\n        //   1.1 --------\r\n        //   1.2 --------       <--- this is `prevModelItem`.\r\n        // 2 --------           <--- this is removed, previous list item has indent same as reference indent.\r\n        //   2.1 --------       <--- this is reference indent, this and 2.2 should become siblings of 1.2.\r\n        //   2.2 --------\r\n        //\r\n        // Becomes:\r\n        //\r\n        // 1 --------\r\n        //   1.1 --------\r\n        //   1.2 --------\r\n        //   2.1 --------\r\n        //   2.2 --------\r\n        const prevViewList = mapper.toViewElement(prevModelItem).parent;\r\n        insertPosition = viewWriter.createPositionAfter(prevViewList);\r\n    }\r\n    else {\r\n        // If element has been found and has smaller indent as reference indent it means that nested items\r\n        // should become nested items of found item:\r\n        //\r\n        // 1 --------           <--- this is `prevModelItem`.\r\n        //   1.1 --------       <--- this is removed, previous list item has indent smaller than reference indent.\r\n        //     1.1.1 --------   <--- this is reference indent, this and 1.1.1 should become nested items of 1.\r\n        //     1.1.2 --------\r\n        //   1.2 --------\r\n        //\r\n        // Becomes:\r\n        //\r\n        // 1 --------\r\n        //   1.1.1 --------\r\n        //   1.1.2 --------\r\n        //   1.2 --------\r\n        //\r\n        // Note: in this case 1.1.1 have indent 2 while 1 have indent 0. In model that should not be possible,\r\n        // because following item may have indent bigger only by one. But this is fixed by postfixer.\r\n        const modelPosition = model.createPositionAt(prevModelItem, 'end');\r\n        insertPosition = mapper.toViewPosition(modelPosition);\r\n    }\r\n    insertPosition = positionAfterUiElements(insertPosition);\r\n    // Handle multiple lists. This happens if list item has nested numbered and bulleted lists. Following lists\r\n    // are inserted after the first list (no need to recalculate insertion position for them).\r\n    for (const child of [...viewRemovedItem.getChildren()]) {\r\n        if (isList(child)) {\r\n            insertPosition = viewWriter.move(viewWriter.createRangeOn(child), insertPosition).end;\r\n            mergeViewLists(viewWriter, child, child.nextSibling);\r\n            mergeViewLists(viewWriter, child.previousSibling, child);\r\n        }\r\n    }\r\n}\r\n/**\r\n * Checks if view element is a list type (ul or ol).\r\n */\r\nfunction isList(viewElement) {\r\n    return viewElement.is('element', 'ol') || viewElement.is('element', 'ul');\r\n}\r\n/**\r\n * Calculates the indent value for a list item. Handles HTML compliant and non-compliant lists.\r\n *\r\n * Also, fixes non HTML compliant lists indents:\r\n *\r\n * ```\r\n * before:                                     fixed list:\r\n * OL                                          OL\r\n * |-> LI (parent LIs: 0)                      |-> LI     (indent: 0)\r\n *     |-> OL                                  |-> OL\r\n *         |-> OL                                  |\r\n *         |   |-> OL                              |\r\n *         |       |-> OL                          |\r\n *         |           |-> LI (parent LIs: 1)      |-> LI (indent: 1)\r\n *         |-> LI (parent LIs: 1)                  |-> LI (indent: 1)\r\n *\r\n * before:                                     fixed list:\r\n * OL                                          OL\r\n * |-> OL                                      |\r\n *     |-> OL                                  |\r\n *          |-> OL                             |\r\n *              |-> LI (parent LIs: 0)         |-> LI        (indent: 0)\r\n *\r\n * before:                                     fixed list:\r\n * OL                                          OL\r\n * |-> LI (parent LIs: 0)                      |-> LI         (indent: 0)\r\n * |-> OL                                          |-> OL\r\n *     |-> LI (parent LIs: 0)                          |-> LI (indent: 1)\r\n * ```\r\n */\r\nfunction getIndent(listItem) {\r\n    let indent = 0;\r\n    let parent = listItem.parent;\r\n    while (parent) {\r\n        // Each LI in the tree will result in an increased indent for HTML compliant lists.\r\n        if (parent.is('element', 'li')) {\r\n            indent++;\r\n        }\r\n        else {\r\n            // If however the list is nested in other list we should check previous sibling of any of the list elements...\r\n            const previousSibling = parent.previousSibling;\r\n            // ...because the we might need increase its indent:\r\n            //\t\tbefore:                           fixed list:\r\n            //\t\tOL                                OL\r\n            //\t\t|-> LI (parent LIs: 0)            |-> LI         (indent: 0)\r\n            //\t\t|-> OL                                |-> OL\r\n            //\t\t    |-> LI (parent LIs: 0)                |-> LI (indent: 1)\r\n            if (previousSibling && previousSibling.is('element', 'li')) {\r\n                indent++;\r\n            }\r\n        }\r\n        parent = parent.parent;\r\n    }\r\n    return indent;\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./list.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module list/list/listediting\r\n */\r\nimport ListCommand from './listcommand';\r\nimport IndentCommand from './indentcommand';\r\nimport ListUtils from './listutils';\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { Enter } from 'ckeditor5/src/enter';\r\nimport { Delete } from 'ckeditor5/src/typing';\r\nimport { cleanList, cleanListItem, modelViewInsertion, modelViewChangeType, modelViewMergeAfterChangeType, modelViewMergeAfter, modelViewRemove, modelViewSplitOnInsert, modelViewChangeIndent, modelChangePostFixer, modelIndentPasteFixer, viewModelConverter, modelToViewPosition, viewToModelPosition } from './converters';\r\nimport '../../theme/list.css';\r\n/**\r\n * The engine of the list feature. It handles creating, editing and removing lists and list items.\r\n *\r\n * It registers the `'numberedList'`, `'bulletedList'`, `'indentList'` and `'outdentList'` commands.\r\n */\r\nexport default class ListEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ListEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [Enter, Delete, ListUtils];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        // Schema.\r\n        // Note: in case `$block` will ever be allowed in `listItem`, keep in mind that this feature\r\n        // uses `Selection#getSelectedBlocks()` without any additional processing to obtain all selected list items.\r\n        // If there are blocks allowed inside list item, algorithms using `getSelectedBlocks()` will have to be modified.\r\n        editor.model.schema.register('listItem', {\r\n            inheritAllFrom: '$block',\r\n            allowAttributes: ['listType', 'listIndent']\r\n        });\r\n        // Converters.\r\n        const data = editor.data;\r\n        const editing = editor.editing;\r\n        editor.model.document.registerPostFixer(writer => modelChangePostFixer(editor.model, writer));\r\n        editing.mapper.registerViewToModelLength('li', getViewListItemLength);\r\n        data.mapper.registerViewToModelLength('li', getViewListItemLength);\r\n        editing.mapper.on('modelToViewPosition', modelToViewPosition(editing.view));\r\n        editing.mapper.on('viewToModelPosition', viewToModelPosition(editor.model));\r\n        data.mapper.on('modelToViewPosition', modelToViewPosition(editing.view));\r\n        editor.conversion.for('editingDowncast')\r\n            .add(dispatcher => {\r\n            dispatcher.on('insert', modelViewSplitOnInsert, { priority: 'high' });\r\n            dispatcher.on('insert:listItem', modelViewInsertion(editor.model));\r\n            dispatcher.on('attribute:listType:listItem', modelViewChangeType, { priority: 'high' });\r\n            dispatcher.on('attribute:listType:listItem', modelViewMergeAfterChangeType, { priority: 'low' });\r\n            dispatcher.on('attribute:listIndent:listItem', modelViewChangeIndent(editor.model));\r\n            dispatcher.on('remove:listItem', modelViewRemove(editor.model));\r\n            dispatcher.on('remove', modelViewMergeAfter, { priority: 'low' });\r\n        });\r\n        editor.conversion.for('dataDowncast')\r\n            .add(dispatcher => {\r\n            dispatcher.on('insert', modelViewSplitOnInsert, { priority: 'high' });\r\n            dispatcher.on('insert:listItem', modelViewInsertion(editor.model));\r\n        });\r\n        editor.conversion.for('upcast')\r\n            .add(dispatcher => {\r\n            dispatcher.on('element:ul', cleanList, { priority: 'high' });\r\n            dispatcher.on('element:ol', cleanList, { priority: 'high' });\r\n            dispatcher.on('element:li', cleanListItem, { priority: 'high' });\r\n            dispatcher.on('element:li', viewModelConverter);\r\n        });\r\n        // Fix indentation of pasted items.\r\n        editor.model.on('insertContent', modelIndentPasteFixer, { priority: 'high' });\r\n        // Register commands for numbered and bulleted list.\r\n        editor.commands.add('numberedList', new ListCommand(editor, 'numbered'));\r\n        editor.commands.add('bulletedList', new ListCommand(editor, 'bulleted'));\r\n        // Register commands for indenting.\r\n        editor.commands.add('indentList', new IndentCommand(editor, 'forward'));\r\n        editor.commands.add('outdentList', new IndentCommand(editor, 'backward'));\r\n        const viewDocument = editing.view.document;\r\n        // Overwrite default Enter key behavior.\r\n        // If Enter key is pressed with selection collapsed in empty list item, outdent it instead of breaking it.\r\n        this.listenTo(viewDocument, 'enter', (evt, data) => {\r\n            const doc = this.editor.model.document;\r\n            const positionParent = doc.selection.getLastPosition().parent;\r\n            if (doc.selection.isCollapsed && positionParent.name == 'listItem' && positionParent.isEmpty) {\r\n                this.editor.execute('outdentList');\r\n                data.preventDefault();\r\n                evt.stop();\r\n            }\r\n        }, { context: 'li' });\r\n        // Overwrite default Backspace key behavior.\r\n        // If Backspace key is pressed with selection collapsed on first position in first list item, outdent it. #83\r\n        this.listenTo(viewDocument, 'delete', (evt, data) => {\r\n            // Check conditions from those that require less computations like those immediately available.\r\n            if (data.direction !== 'backward') {\r\n                return;\r\n            }\r\n            const selection = this.editor.model.document.selection;\r\n            if (!selection.isCollapsed) {\r\n                return;\r\n            }\r\n            const firstPosition = selection.getFirstPosition();\r\n            if (!firstPosition.isAtStart) {\r\n                return;\r\n            }\r\n            const positionParent = firstPosition.parent;\r\n            if (positionParent.name !== 'listItem') {\r\n                return;\r\n            }\r\n            const previousIsAListItem = positionParent.previousSibling && positionParent.previousSibling.name === 'listItem';\r\n            if (previousIsAListItem) {\r\n                return;\r\n            }\r\n            this.editor.execute('outdentList');\r\n            data.preventDefault();\r\n            evt.stop();\r\n        }, { context: 'li' });\r\n        this.listenTo(editor.editing.view.document, 'tab', (evt, data) => {\r\n            const commandName = data.shiftKey ? 'outdentList' : 'indentList';\r\n            const command = this.editor.commands.get(commandName);\r\n            if (command.isEnabled) {\r\n                editor.execute(commandName);\r\n                data.stopPropagation();\r\n                data.preventDefault();\r\n                evt.stop();\r\n            }\r\n        }, { context: 'li' });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    afterInit() {\r\n        const commands = this.editor.commands;\r\n        const indent = commands.get('indent');\r\n        const outdent = commands.get('outdent');\r\n        if (indent) {\r\n            indent.registerChildCommand(commands.get('indentList'));\r\n        }\r\n        if (outdent) {\r\n            outdent.registerChildCommand(commands.get('outdentList'));\r\n        }\r\n    }\r\n}\r\nfunction getViewListItemLength(element) {\r\n    let length = 1;\r\n    for (const child of element.getChildren()) {\r\n        if (child.name == 'ul' || child.name == 'ol') {\r\n            for (const item of child.getChildren()) {\r\n                length += getViewListItemLength(item);\r\n            }\r\n        }\r\n    }\r\n    return length;\r\n}\r\n","export default \"<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>\";","export default \"<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>\";","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module list/list/listui\r\n */\r\nimport { createUIComponent } from './utils';\r\nimport numberedListIcon from '../../theme/icons/numberedlist.svg';\r\nimport bulletedListIcon from '../../theme/icons/bulletedlist.svg';\r\nimport { Plugin } from 'ckeditor5/src/core';\r\n/**\r\n * The list UI feature. It introduces the `'numberedList'` and `'bulletedList'` buttons that\r\n * allow to convert paragraphs to and from list items and indent or outdent them.\r\n */\r\nexport default class ListUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ListUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const t = this.editor.t;\r\n        // Create two buttons and link them with numberedList and bulletedList commands.\r\n        createUIComponent(this.editor, 'numberedList', t('Numbered List'), numberedListIcon);\r\n        createUIComponent(this.editor, 'bulletedList', t('Bulleted List'), bulletedListIcon);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module list/listproperties/liststylecommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { getListTypeFromListStyleType, getSelectedListItems } from '../list/utils';\r\n/**\r\n * The list style command. It changes the `listStyle` attribute of the selected list items.\r\n *\r\n * If the list type (numbered or bulleted) can be inferred from the passed style type,\r\n * the command tries to convert selected items to a list of that type.\r\n * It is used by the {@link module:list/listproperties~ListProperties list properties feature}.\r\n */\r\nexport default class ListStyleCommand extends Command {\r\n    /**\r\n     * Creates an instance of the command.\r\n     *\r\n     * @param editor The editor instance.\r\n     * @param defaultType The list type that will be used by default if the value was not specified during\r\n     * the command execution.\r\n     */\r\n    constructor(editor, defaultType) {\r\n        super(editor);\r\n        this.defaultType = defaultType;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        this.value = this._getValue();\r\n        this.isEnabled = this._checkEnabled();\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * @fires execute\r\n     * @param options.type The type of the list style, e.g. `'disc'` or `'square'`. If `null` is specified, the default\r\n     * style will be applied.\r\n     */\r\n    execute(options = {}) {\r\n        this._tryToConvertItemsToList(options);\r\n        const model = this.editor.model;\r\n        const listItems = getSelectedListItems(model);\r\n        if (!listItems.length) {\r\n            return;\r\n        }\r\n        model.change(writer => {\r\n            for (const item of listItems) {\r\n                writer.setAttribute('listStyle', options.type || this.defaultType, item);\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Checks the command's {@link #value}.\r\n     *\r\n     * @returns The current value.\r\n     */\r\n    _getValue() {\r\n        const listItem = this.editor.model.document.selection.getFirstPosition().parent;\r\n        if (listItem && listItem.is('element', 'listItem')) {\r\n            return listItem.getAttribute('listStyle');\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Checks whether the command can be enabled in the current context.\r\n     *\r\n     * @returns Whether the command should be enabled.\r\n     */\r\n    _checkEnabled() {\r\n        const editor = this.editor;\r\n        const numberedList = editor.commands.get('numberedList');\r\n        const bulletedList = editor.commands.get('bulletedList');\r\n        return numberedList.isEnabled || bulletedList.isEnabled;\r\n    }\r\n    /**\r\n     * Checks if the provided list style is valid. Also changes the selection to a list if it's not set yet.\r\n     *\r\n     * @param The type of the list style. If `null` is specified, the function does nothing.\r\n    */\r\n    _tryToConvertItemsToList(options) {\r\n        if (!options.type) {\r\n            return;\r\n        }\r\n        const listType = getListTypeFromListStyleType(options.type);\r\n        if (!listType) {\r\n            return;\r\n        }\r\n        const editor = this.editor;\r\n        const commandName = `${listType}List`;\r\n        const command = editor.commands.get(commandName);\r\n        if (!command.value) {\r\n            editor.execute(commandName);\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module list/listproperties/listreversedcommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { getSelectedListItems } from '../list/utils';\r\n/**\r\n * The reversed list command. It changes the `listReversed` attribute of the selected list items. As a result, the list order will be\r\n * reversed.\r\n * It is used by the {@link module:list/listproperties~ListProperties list properties feature}.\r\n */\r\nexport default class ListReversedCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const value = this._getValue();\r\n        this.value = value;\r\n        this.isEnabled = value != null;\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * @fires execute\r\n     * @param options.reversed Whether the list should be reversed.\r\n     */\r\n    execute(options = {}) {\r\n        const model = this.editor.model;\r\n        const listItems = getSelectedListItems(model)\r\n            .filter(item => item.getAttribute('listType') == 'numbered');\r\n        model.change(writer => {\r\n            for (const item of listItems) {\r\n                writer.setAttribute('listReversed', !!options.reversed, item);\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Checks the command's {@link #value}.\r\n     *\r\n     * @returns The current value.\r\n     */\r\n    _getValue() {\r\n        const listItem = this.editor.model.document.selection.getFirstPosition().parent;\r\n        if (listItem && listItem.is('element', 'listItem') && listItem.getAttribute('listType') == 'numbered') {\r\n            return listItem.getAttribute('listReversed');\r\n        }\r\n        return null;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module list/listproperties/liststartcommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { getSelectedListItems } from '../list/utils';\r\n/**\r\n * The list start index command. It changes the `listStart` attribute of the selected list items.\r\n * It is used by the {@link module:list/listproperties~ListProperties list properties feature}.\r\n */\r\nexport default class ListStartCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const value = this._getValue();\r\n        this.value = value;\r\n        this.isEnabled = value != null;\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * @fires execute\r\n     * @param options.startIndex The list start index.\r\n     */\r\n    execute({ startIndex = 1 } = {}) {\r\n        const model = this.editor.model;\r\n        const listItems = getSelectedListItems(model)\r\n            .filter(item => item.getAttribute('listType') == 'numbered');\r\n        model.change(writer => {\r\n            for (const item of listItems) {\r\n                writer.setAttribute('listStart', startIndex >= 0 ? startIndex : 1, item);\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Checks the command's {@link #value}.\r\n     *\r\n     * @returns The current value.\r\n     */\r\n    _getValue() {\r\n        const listItem = this.editor.model.document.selection.getFirstPosition().parent;\r\n        if (listItem && listItem.is('element', 'listItem') && listItem.getAttribute('listType') == 'numbered') {\r\n            return listItem.getAttribute('listStart');\r\n        }\r\n        return null;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module list/listproperties/listpropertiesediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport ListEditing from '../list/listediting';\r\nimport ListStyleCommand from './liststylecommand';\r\nimport ListReversedCommand from './listreversedcommand';\r\nimport ListStartCommand from './liststartcommand';\r\nimport { getSiblingListItem, getSiblingNodes } from '../list/utils';\r\nconst DEFAULT_LIST_TYPE = 'default';\r\n/**\r\n * The engine of the list properties feature.\r\n *\r\n * It sets the value for the `listItem` attribute of the {@link module:list/list~List `<listItem>`} element that\r\n * allows modifying the list style type.\r\n *\r\n * It registers the `'listStyle'`, `'listReversed'` and `'listStart'` commands if they are enabled in the configuration.\r\n * Read more in {@link module:list/listconfig~ListPropertiesConfig}.\r\n */\r\nexport default class ListPropertiesEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ListEditing];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ListPropertiesEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        editor.config.define('list', {\r\n            properties: {\r\n                styles: true,\r\n                startIndex: false,\r\n                reversed: false\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const enabledProperties = editor.config.get('list.properties');\r\n        const strategies = createAttributeStrategies(enabledProperties);\r\n        // Extend schema.\r\n        model.schema.extend('listItem', {\r\n            allowAttributes: strategies.map(s => s.attributeName)\r\n        });\r\n        for (const strategy of strategies) {\r\n            strategy.addCommand(editor);\r\n        }\r\n        // Fix list attributes when modifying their nesting levels (the `listIndent` attribute).\r\n        this.listenTo(editor.commands.get('indentList'), '_executeCleanup', fixListAfterIndentListCommand(editor, strategies));\r\n        this.listenTo(editor.commands.get('outdentList'), '_executeCleanup', fixListAfterOutdentListCommand(editor, strategies));\r\n        this.listenTo(editor.commands.get('bulletedList'), '_executeCleanup', restoreDefaultListStyle(editor));\r\n        this.listenTo(editor.commands.get('numberedList'), '_executeCleanup', restoreDefaultListStyle(editor));\r\n        // Register a post-fixer that ensures that the attributes is specified in each `listItem` element.\r\n        model.document.registerPostFixer(fixListAttributesOnListItemElements(editor, strategies));\r\n        // Set up conversion.\r\n        editor.conversion.for('upcast').add(upcastListItemAttributes(strategies));\r\n        editor.conversion.for('downcast').add(downcastListItemAttributes(strategies));\r\n        // Handle merging two separated lists into the single one.\r\n        this._mergeListAttributesWhileMergingLists(strategies);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    afterInit() {\r\n        const editor = this.editor;\r\n        // Enable post-fixer that removes the attributes from to-do list items only if the \"TodoList\" plugin is on.\r\n        // We need to registry the hook here since the `TodoList` plugin can be added after the `ListPropertiesEditing`.\r\n        if (editor.commands.get('todoList')) {\r\n            editor.model.document.registerPostFixer(removeListItemAttributesFromTodoList(editor));\r\n        }\r\n    }\r\n    /**\r\n     * Starts listening to {@link module:engine/model/model~Model#deleteContent} and checks whether two lists will be merged into a single\r\n     * one after deleting the content.\r\n     *\r\n     * The purpose of this action is to adjust the `listStyle`, `listReversed` and `listStart` values\r\n     * for the list that was merged.\r\n     *\r\n     * Consider the following model's content:\r\n     *\r\n     * ```xml\r\n     * <listItem listIndent=\"0\" listType=\"bulleted\" listStyle=\"square\">UL List item 1</listItem>\r\n     * <listItem listIndent=\"0\" listType=\"bulleted\" listStyle=\"square\">UL List item 2</listItem>\r\n     * <paragraph>[A paragraph.]</paragraph>\r\n     * <listItem listIndent=\"0\" listType=\"bulleted\" listStyle=\"circle\">UL List item 1</listItem>\r\n     * <listItem listIndent=\"0\" listType=\"bulleted\" listStyle=\"circle\">UL List item 2</listItem>\r\n     * ```\r\n     *\r\n     * After removing the paragraph element, the second list will be merged into the first one.\r\n     * We want to inherit the `listStyle` attribute for the second list from the first one.\r\n     *\r\n     * ```xml\r\n     * <listItem listIndent=\"0\" listType=\"bulleted\" listStyle=\"square\">UL List item 1</listItem>\r\n     * <listItem listIndent=\"0\" listType=\"bulleted\" listStyle=\"square\">UL List item 2</listItem>\r\n     * <listItem listIndent=\"0\" listType=\"bulleted\" listStyle=\"square\">UL List item 1</listItem>\r\n     * <listItem listIndent=\"0\" listType=\"bulleted\" listStyle=\"square\">UL List item 2</listItem>\r\n     * ```\r\n     *\r\n     * See https://github.com/ckeditor/ckeditor5/issues/7879.\r\n     *\r\n     * @param attributeStrategies Strategies for the enabled attributes.\r\n     */\r\n    _mergeListAttributesWhileMergingLists(attributeStrategies) {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        // First the outer-most`listItem` in the first list reference.\r\n        // If found, the lists should be merged and this `listItem` provides the attributes\r\n        // and it is also a starting point when searching for items in the second list.\r\n        let firstMostOuterItem;\r\n        // Check whether the removed content is between two lists.\r\n        this.listenTo(model, 'deleteContent', (evt, [selection]) => {\r\n            const firstPosition = selection.getFirstPosition();\r\n            const lastPosition = selection.getLastPosition();\r\n            // Typing or removing content in a single item. Aborting.\r\n            if (firstPosition.parent === lastPosition.parent) {\r\n                return;\r\n            }\r\n            // An element before the content that will be removed is not a list.\r\n            if (!firstPosition.parent.is('element', 'listItem')) {\r\n                return;\r\n            }\r\n            const nextSibling = lastPosition.parent.nextSibling;\r\n            // An element after the content that will be removed is not a list.\r\n            if (!nextSibling || !nextSibling.is('element', 'listItem')) {\r\n                return;\r\n            }\r\n            // Find the outermost list item based on the `listIndent` attribute. We can't assume that `listIndent=0`\r\n            // because the selection can be hooked in nested lists.\r\n            //\r\n            // <listItem listIndent=\"0\" listType=\"bulleted\" listStyle=\"square\">UL List item 1</listItem>\r\n            // <listItem listIndent=\"1\" listType=\"bulleted\" listStyle=\"square\">UL List [item 1.1</listItem>\r\n            // <listItem listIndent=\"0\" listType=\"bulleted\" listStyle=\"circle\">[]UL List item 1.</listItem>\r\n            // <listItem listIndent=\"1\" listType=\"bulleted\" listStyle=\"circle\">UL List ]item 1.1</listItem>\r\n            //\r\n            // After deleting the content, we would like to inherit the \"square\" attribute for the last element:\r\n            //\r\n            // <listItem listIndent=\"0\" listType=\"bulleted\" listStyle=\"square\">UL List item 1</listItem>\r\n            // <listItem listIndent=\"1\" listType=\"bulleted\" listStyle=\"square\">UL List []item 1.1</listItem>\r\n            const mostOuterItemList = getSiblingListItem(firstPosition.parent, {\r\n                sameIndent: true,\r\n                listIndent: nextSibling.getAttribute('listIndent')\r\n            });\r\n            // The outermost list item may not exist while removing elements between lists with different value\r\n            // of the `listIndent` attribute. In such a case we don't want to update anything. See: #8073.\r\n            if (!mostOuterItemList) {\r\n                return;\r\n            }\r\n            if (mostOuterItemList.getAttribute('listType') === nextSibling.getAttribute('listType')) {\r\n                firstMostOuterItem = mostOuterItemList;\r\n            }\r\n        }, { priority: 'high' });\r\n        // If so, update the `listStyle` attribute for the second list.\r\n        this.listenTo(model, 'deleteContent', () => {\r\n            if (!firstMostOuterItem) {\r\n                return;\r\n            }\r\n            model.change(writer => {\r\n                // Find the first most-outer item list in the merged list.\r\n                // A case when the first list item in the second list was merged into the last item in the first list.\r\n                //\r\n                // <listItem listIndent=\"0\" listType=\"bulleted\" listStyle=\"square\">UL List item 1</listItem>\r\n                // <listItem listIndent=\"0\" listType=\"bulleted\" listStyle=\"square\">UL List item 2</listItem>\r\n                // <listItem listIndent=\"0\" listType=\"bulleted\" listStyle=\"circle\">[]UL List item 1</listItem>\r\n                // <listItem listIndent=\"0\" listType=\"bulleted\" listStyle=\"circle\">UL List item 2</listItem>\r\n                const secondListMostOuterItem = getSiblingListItem(firstMostOuterItem.nextSibling, {\r\n                    sameIndent: true,\r\n                    listIndent: firstMostOuterItem.getAttribute('listIndent'),\r\n                    direction: 'forward'\r\n                });\r\n                // If the selection ends in a non-list element, there are no <listItem>s that would require adjustments.\r\n                // See: #8642.\r\n                if (!secondListMostOuterItem) {\r\n                    firstMostOuterItem = null;\r\n                    return;\r\n                }\r\n                const items = [\r\n                    secondListMostOuterItem,\r\n                    ...getSiblingNodes(writer.createPositionAt(secondListMostOuterItem, 0), 'forward')\r\n                ];\r\n                for (const listItem of items) {\r\n                    for (const strategy of attributeStrategies) {\r\n                        if (strategy.appliesToListItem(listItem)) {\r\n                            const attributeName = strategy.attributeName;\r\n                            const value = firstMostOuterItem.getAttribute(attributeName);\r\n                            writer.setAttribute(attributeName, value, listItem);\r\n                        }\r\n                    }\r\n                }\r\n            });\r\n            firstMostOuterItem = null;\r\n        }, { priority: 'low' });\r\n    }\r\n}\r\n/**\r\n * Creates an array of strategies for dealing with enabled listItem attributes.\r\n */\r\nfunction createAttributeStrategies(enabledProperties) {\r\n    const strategies = [];\r\n    if (enabledProperties.styles) {\r\n        strategies.push({\r\n            attributeName: 'listStyle',\r\n            defaultValue: DEFAULT_LIST_TYPE,\r\n            addCommand(editor) {\r\n                editor.commands.add('listStyle', new ListStyleCommand(editor, DEFAULT_LIST_TYPE));\r\n            },\r\n            appliesToListItem() {\r\n                return true;\r\n            },\r\n            setAttributeOnDowncast(writer, listStyle, element) {\r\n                if (listStyle && listStyle !== DEFAULT_LIST_TYPE) {\r\n                    writer.setStyle('list-style-type', listStyle, element);\r\n                }\r\n                else {\r\n                    writer.removeStyle('list-style-type', element);\r\n                }\r\n            },\r\n            getAttributeOnUpcast(listParent) {\r\n                return listParent.getStyle('list-style-type') || DEFAULT_LIST_TYPE;\r\n            }\r\n        });\r\n    }\r\n    if (enabledProperties.reversed) {\r\n        strategies.push({\r\n            attributeName: 'listReversed',\r\n            defaultValue: false,\r\n            addCommand(editor) {\r\n                editor.commands.add('listReversed', new ListReversedCommand(editor));\r\n            },\r\n            appliesToListItem(item) {\r\n                return item.getAttribute('listType') == 'numbered';\r\n            },\r\n            setAttributeOnDowncast(writer, listReversed, element) {\r\n                if (listReversed) {\r\n                    writer.setAttribute('reversed', 'reversed', element);\r\n                }\r\n                else {\r\n                    writer.removeAttribute('reversed', element);\r\n                }\r\n            },\r\n            getAttributeOnUpcast(listParent) {\r\n                return listParent.hasAttribute('reversed');\r\n            }\r\n        });\r\n    }\r\n    if (enabledProperties.startIndex) {\r\n        strategies.push({\r\n            attributeName: 'listStart',\r\n            defaultValue: 1,\r\n            addCommand(editor) {\r\n                editor.commands.add('listStart', new ListStartCommand(editor));\r\n            },\r\n            appliesToListItem(item) {\r\n                return item.getAttribute('listType') == 'numbered';\r\n            },\r\n            setAttributeOnDowncast(writer, listStart, element) {\r\n                if (listStart == 0 || listStart > 1) {\r\n                    writer.setAttribute('start', listStart, element);\r\n                }\r\n                else {\r\n                    writer.removeAttribute('start', element);\r\n                }\r\n            },\r\n            getAttributeOnUpcast(listParent) {\r\n                const startAttributeValue = listParent.getAttribute('start');\r\n                return startAttributeValue >= 0 ? startAttributeValue : 1;\r\n            }\r\n        });\r\n    }\r\n    return strategies;\r\n}\r\n/**\r\n * Returns a converter consumes the `style`, `reversed` and `start` attribute.\r\n * In `style` it searches for the `list-style-type` definition.\r\n * If not found, the `\"default\"` value will be used.\r\n */\r\nfunction upcastListItemAttributes(attributeStrategies) {\r\n    return (dispatcher) => {\r\n        dispatcher.on('element:li', (evt, data, conversionApi) => {\r\n            // https://github.com/ckeditor/ckeditor5/issues/13858\r\n            if (!data.modelRange) {\r\n                return;\r\n            }\r\n            const listParent = data.viewItem.parent;\r\n            const listItem = data.modelRange.start.nodeAfter || data.modelRange.end.nodeBefore;\r\n            for (const strategy of attributeStrategies) {\r\n                if (strategy.appliesToListItem(listItem)) {\r\n                    const listStyle = strategy.getAttributeOnUpcast(listParent);\r\n                    conversionApi.writer.setAttribute(strategy.attributeName, listStyle, listItem);\r\n                }\r\n            }\r\n        }, { priority: 'low' });\r\n    };\r\n}\r\n/**\r\n * Returns a converter that adds `reversed`, `start` attributes and adds `list-style-type` definition as a value for the `style` attribute.\r\n * The `\"default\"` values are removed and not present in the view/data.\r\n */\r\nfunction downcastListItemAttributes(attributeStrategies) {\r\n    return (dispatcher) => {\r\n        for (const strategy of attributeStrategies) {\r\n            dispatcher.on(`attribute:${strategy.attributeName}:listItem`, (evt, data, conversionApi) => {\r\n                const viewWriter = conversionApi.writer;\r\n                const currentElement = data.item;\r\n                const previousElement = getSiblingListItem(currentElement.previousSibling, {\r\n                    sameIndent: true,\r\n                    listIndent: currentElement.getAttribute('listIndent'),\r\n                    direction: 'backward'\r\n                });\r\n                const viewItem = conversionApi.mapper.toViewElement(currentElement);\r\n                // A case when elements represent different lists. We need to separate their container.\r\n                if (!areRepresentingSameList(currentElement, previousElement)) {\r\n                    viewWriter.breakContainer(viewWriter.createPositionBefore(viewItem));\r\n                }\r\n                strategy.setAttributeOnDowncast(viewWriter, data.attributeNewValue, viewItem.parent);\r\n            }, { priority: 'low' });\r\n        }\r\n    };\r\n    /**\r\n     * Checks whether specified list items belong to the same list.\r\n     */\r\n    function areRepresentingSameList(listItem1, listItem2) {\r\n        return listItem2 &&\r\n            listItem1.getAttribute('listType') === listItem2.getAttribute('listType') &&\r\n            listItem1.getAttribute('listIndent') === listItem2.getAttribute('listIndent') &&\r\n            listItem1.getAttribute('listStyle') === listItem2.getAttribute('listStyle') &&\r\n            listItem1.getAttribute('listReversed') === listItem2.getAttribute('listReversed') &&\r\n            listItem1.getAttribute('listStart') === listItem2.getAttribute('listStart');\r\n    }\r\n}\r\n/**\r\n * When indenting list, nested list should clear its value for the attributes or inherit from nested lists.\r\n *\r\n * ■ List item 1.\r\n * ■ List item 2.[]\r\n * ■ List item 3.\r\n * editor.execute( 'indentList' );\r\n *\r\n * ■ List item 1.\r\n *     ○ List item 2.[]\r\n * ■ List item 3.\r\n */\r\nfunction fixListAfterIndentListCommand(editor, attributeStrategies) {\r\n    return (evt, changedItems) => {\r\n        const root = changedItems[0];\r\n        const rootIndent = root.getAttribute('listIndent');\r\n        const itemsToUpdate = changedItems.filter(item => item.getAttribute('listIndent') === rootIndent);\r\n        // A case where a few list items are indented must be checked separately\r\n        // since `getSiblingListItem()` returns the first changed element.\r\n        // ■ List item 1.\r\n        //     ○ [List item 2.\r\n        //     ○ List item 3.]\r\n        // ■ List item 4.\r\n        //\r\n        // List items: `2` and `3` should be adjusted.\r\n        let previousSibling = null;\r\n        if (root.previousSibling.getAttribute('listIndent') + 1 !== rootIndent) {\r\n            previousSibling = getSiblingListItem(root.previousSibling, {\r\n                sameIndent: true, direction: 'backward', listIndent: rootIndent\r\n            });\r\n        }\r\n        editor.model.change(writer => {\r\n            for (const item of itemsToUpdate) {\r\n                for (const strategy of attributeStrategies) {\r\n                    if (strategy.appliesToListItem(item)) {\r\n                        const valueToSet = previousSibling == null ?\r\n                            strategy.defaultValue :\r\n                            previousSibling.getAttribute(strategy.attributeName);\r\n                        writer.setAttribute(strategy.attributeName, valueToSet, item);\r\n                    }\r\n                }\r\n            }\r\n        });\r\n    };\r\n}\r\n/**\r\n * When outdenting a list, a nested list should copy attribute values\r\n * from the previous sibling list item including the same value for the `listIndent` value.\r\n *\r\n * ■ List item 1.\r\n *     ○ List item 2.[]\r\n * ■ List item 3.\r\n *\r\n * editor.execute( 'outdentList' );\r\n *\r\n * ■ List item 1.\r\n * ■ List item 2.[]\r\n * ■ List item 3.\r\n */\r\nfunction fixListAfterOutdentListCommand(editor, attributeStrategies) {\r\n    return (evt, changedItems) => {\r\n        changedItems = changedItems.reverse().filter(item => item.is('element', 'listItem'));\r\n        if (!changedItems.length) {\r\n            return;\r\n        }\r\n        const indent = changedItems[0].getAttribute('listIndent');\r\n        const listType = changedItems[0].getAttribute('listType');\r\n        let listItem = changedItems[0].previousSibling;\r\n        // ■ List item 1.\r\n        //     ○ List item 2.\r\n        //     ○ List item 3.[]\r\n        // ■ List item 4.\r\n        //\r\n        // After outdenting a list, `List item 3` should inherit the `listStyle` attribute from `List item 1`.\r\n        //\r\n        // ■ List item 1.\r\n        //     ○ List item 2.\r\n        // ■ List item 3.[]\r\n        // ■ List item 4.\r\n        if (listItem.is('element', 'listItem')) {\r\n            while (listItem.getAttribute('listIndent') !== indent) {\r\n                listItem = listItem.previousSibling;\r\n            }\r\n        }\r\n        else {\r\n            listItem = null;\r\n        }\r\n        // Outdenting such a list should restore values based on `List item 4`.\r\n        // ■ List item 1.[]\r\n        //     ○ List item 2.\r\n        //     ○ List item 3.\r\n        // ■ List item 4.\r\n        if (!listItem) {\r\n            listItem = changedItems[changedItems.length - 1].nextSibling;\r\n        }\r\n        // And such a list should not modify anything.\r\n        // However, `listItem` can indicate a node below the list. Be sure that we have the `listItem` element.\r\n        // ■ List item 1.[]\r\n        //     ○ List item 2.\r\n        //     ○ List item 3.\r\n        // <paragraph>The later if check.</paragraph>\r\n        if (!listItem || !listItem.is('element', 'listItem')) {\r\n            return;\r\n        }\r\n        // Do not modify the list if found `listItem` represents other type of list than outdented list items.\r\n        if (listItem.getAttribute('listType') !== listType) {\r\n            return;\r\n        }\r\n        editor.model.change(writer => {\r\n            const itemsToUpdate = changedItems.filter(item => item.getAttribute('listIndent') === indent);\r\n            for (const item of itemsToUpdate) {\r\n                for (const strategy of attributeStrategies) {\r\n                    if (strategy.appliesToListItem(item)) {\r\n                        const attributeName = strategy.attributeName;\r\n                        const valueToSet = listItem.getAttribute(attributeName);\r\n                        writer.setAttribute(attributeName, valueToSet, item);\r\n                    }\r\n                }\r\n            }\r\n        });\r\n    };\r\n}\r\n/**\r\n * Each `listItem` element must have specified the `listStyle`, `listReversed` and `listStart` attributes\r\n * if they are enabled and supported by its `listType`.\r\n * This post-fixer checks whether inserted elements `listItem` elements should inherit the attribute values from\r\n * their sibling nodes or should use the default values.\r\n *\r\n * Paragraph[]\r\n * ■ List item 1. // [listStyle=\"square\", listType=\"bulleted\"]\r\n * ■ List item 2. // ...\r\n * ■ List item 3. // ...\r\n *\r\n * editor.execute( 'bulletedList' )\r\n *\r\n * ■ Paragraph[]  // [listStyle=\"square\", listType=\"bulleted\"]\r\n * ■ List item 1. // [listStyle=\"square\", listType=\"bulleted\"]\r\n * ■ List item 2.\r\n * ■ List item 3.\r\n *\r\n * It also covers a such change:\r\n *\r\n * [Paragraph 1\r\n * Paragraph 2]\r\n * ■ List item 1. // [listStyle=\"square\", listType=\"bulleted\"]\r\n * ■ List item 2. // ...\r\n * ■ List item 3. // ...\r\n *\r\n * editor.execute( 'numberedList' )\r\n *\r\n * 1. [Paragraph 1 // [listStyle=\"default\", listType=\"numbered\"]\r\n * 2. Paragraph 2] // [listStyle=\"default\", listType=\"numbered\"]\r\n * ■ List item 1.  // [listStyle=\"square\", listType=\"bulleted\"]\r\n * ■ List item 2.  // ...\r\n * ■ List item 3.  // ...\r\n */\r\nfunction fixListAttributesOnListItemElements(editor, attributeStrategies) {\r\n    return (writer) => {\r\n        let wasFixed = false;\r\n        const insertedListItems = getChangedListItems(editor.model.document.differ.getChanges())\r\n            .filter(item => {\r\n            // Don't touch todo lists. They are handled in another post-fixer.\r\n            return item.getAttribute('listType') !== 'todo';\r\n        });\r\n        if (!insertedListItems.length) {\r\n            return wasFixed;\r\n        }\r\n        // Check whether the last inserted element is next to the `listItem` element.\r\n        //\r\n        // ■ Paragraph[]  // <-- The inserted item.\r\n        // ■ List item 1.\r\n        let existingListItem = insertedListItems[insertedListItems.length - 1].nextSibling;\r\n        // If it doesn't, maybe the `listItem` was inserted at the end of the list.\r\n        //\r\n        // ■ List item 1.\r\n        // ■ Paragraph[]  // <-- The inserted item.\r\n        if (!existingListItem || !existingListItem.is('element', 'listItem')) {\r\n            existingListItem = insertedListItems[0].previousSibling;\r\n            if (existingListItem) {\r\n                const indent = insertedListItems[0].getAttribute('listIndent');\r\n                // But we need to find a `listItem` with the `listIndent=0` attribute.\r\n                // If doesn't, maybe the `listItem` was inserted at the end of the list.\r\n                //\r\n                // ■ List item 1.\r\n                //     ○ List item 2.\r\n                // ■ Paragraph[]  // <-- The inserted item.\r\n                while (existingListItem.is('element', 'listItem') && existingListItem.getAttribute('listIndent') !== indent) {\r\n                    existingListItem = existingListItem.previousSibling;\r\n                    // If the item does not exist, most probably there is no other content in the editor. See: #8072.\r\n                    if (!existingListItem) {\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        for (const strategy of attributeStrategies) {\r\n            const attributeName = strategy.attributeName;\r\n            for (const item of insertedListItems) {\r\n                if (!strategy.appliesToListItem(item)) {\r\n                    writer.removeAttribute(attributeName, item);\r\n                    continue;\r\n                }\r\n                if (!item.hasAttribute(attributeName)) {\r\n                    if (shouldInheritListType(existingListItem, item, strategy)) {\r\n                        writer.setAttribute(attributeName, existingListItem.getAttribute(attributeName), item);\r\n                    }\r\n                    else {\r\n                        writer.setAttribute(attributeName, strategy.defaultValue, item);\r\n                    }\r\n                    wasFixed = true;\r\n                }\r\n                else {\r\n                    // Adjust the `listStyle`, `listReversed` and `listStart`\r\n                    // attributes for inserted (pasted) items. See #8160.\r\n                    //\r\n                    // ■ List item 1. // [listStyle=\"square\", listType=\"bulleted\"]\r\n                    //     ○ List item 1.1. // [listStyle=\"circle\", listType=\"bulleted\"]\r\n                    //     ○ [] (selection is here)\r\n                    //\r\n                    // Then, pasting a list with different attributes (listStyle, listType):\r\n                    //\r\n                    // 1. First. // [listStyle=\"decimal\", listType=\"numbered\"]\r\n                    // 2. Second // [listStyle=\"decimal\", listType=\"numbered\"]\r\n                    //\r\n                    // The `listType` attribute will be corrected by the `ListEditing` converters.\r\n                    // We need to adjust the `listStyle` attribute. Expected structure:\r\n                    //\r\n                    // ■ List item 1. // [listStyle=\"square\", listType=\"bulleted\"]\r\n                    //     ○ List item 1.1. // [listStyle=\"circle\", listType=\"bulleted\"]\r\n                    //     ○ First. // [listStyle=\"circle\", listType=\"bulleted\"]\r\n                    //     ○ Second // [listStyle=\"circle\", listType=\"bulleted\"]\r\n                    const previousSibling = item.previousSibling;\r\n                    if (shouldInheritListTypeFromPreviousItem(previousSibling, item, strategy.attributeName)) {\r\n                        writer.setAttribute(attributeName, previousSibling.getAttribute(attributeName), item);\r\n                        wasFixed = true;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        return wasFixed;\r\n    };\r\n}\r\n/**\r\n * Checks whether the `listStyle`, `listReversed` and `listStart` attributes\r\n * should be copied from the `baseItem` element.\r\n *\r\n * The attribute should be copied if the inserted element does not have defined it and\r\n * the value for the element is other than default in the base element.\r\n */\r\nfunction shouldInheritListType(baseItem, itemToChange, attributeStrategy) {\r\n    if (!baseItem) {\r\n        return false;\r\n    }\r\n    const baseListAttribute = baseItem.getAttribute(attributeStrategy.attributeName);\r\n    if (!baseListAttribute) {\r\n        return false;\r\n    }\r\n    if (baseListAttribute == attributeStrategy.defaultValue) {\r\n        return false;\r\n    }\r\n    if (baseItem.getAttribute('listType') !== itemToChange.getAttribute('listType')) {\r\n        return false;\r\n    }\r\n    return true;\r\n}\r\n/**\r\n * Checks whether the `listStyle`, `listReversed` and `listStart` attributes\r\n * should be copied from previous list item.\r\n *\r\n * The attribute should be copied if there's a mismatch of styles of the pasted list into a nested list.\r\n * Top-level lists are not normalized as we allow side-by-side list of different types.\r\n */\r\nfunction shouldInheritListTypeFromPreviousItem(previousItem, itemToChange, attributeName) {\r\n    if (!previousItem || !previousItem.is('element', 'listItem')) {\r\n        return false;\r\n    }\r\n    if (itemToChange.getAttribute('listType') !== previousItem.getAttribute('listType')) {\r\n        return false;\r\n    }\r\n    const previousItemIndent = previousItem.getAttribute('listIndent');\r\n    if (previousItemIndent < 1 || previousItemIndent !== itemToChange.getAttribute('listIndent')) {\r\n        return false;\r\n    }\r\n    const previousItemListAttribute = previousItem.getAttribute(attributeName);\r\n    if (!previousItemListAttribute || previousItemListAttribute === itemToChange.getAttribute(attributeName)) {\r\n        return false;\r\n    }\r\n    return true;\r\n}\r\n/**\r\n * Removes the `listStyle`, `listReversed` and `listStart` attributes from \"todo\" list items.\r\n */\r\nfunction removeListItemAttributesFromTodoList(editor) {\r\n    return (writer) => {\r\n        const todoListItems = getChangedListItems(editor.model.document.differ.getChanges())\r\n            .filter(item => {\r\n            // Handle the todo lists only. The rest is handled in another post-fixer.\r\n            return item.getAttribute('listType') === 'todo' && (item.hasAttribute('listStyle') ||\r\n                item.hasAttribute('listReversed') ||\r\n                item.hasAttribute('listStart'));\r\n        });\r\n        if (!todoListItems.length) {\r\n            return false;\r\n        }\r\n        for (const item of todoListItems) {\r\n            writer.removeAttribute('listStyle', item);\r\n            writer.removeAttribute('listReversed', item);\r\n            writer.removeAttribute('listStart', item);\r\n        }\r\n        return true;\r\n    };\r\n}\r\n/**\r\n * Restores the `listStyle` attribute after changing the list type.\r\n */\r\nfunction restoreDefaultListStyle(editor) {\r\n    return (evt, changedItems) => {\r\n        changedItems = changedItems.filter(item => item.is('element', 'listItem'));\r\n        editor.model.change(writer => {\r\n            for (const item of changedItems) {\r\n                // Remove the attribute. Post-fixer will restore the proper value.\r\n                writer.removeAttribute('listStyle', item);\r\n            }\r\n        });\r\n    };\r\n}\r\n/**\r\n * Returns the `listItem` that was inserted or changed.\r\n *\r\n * @param changes The changes list returned by the differ.\r\n */\r\nfunction getChangedListItems(changes) {\r\n    const items = [];\r\n    for (const change of changes) {\r\n        const item = getItemFromChange(change);\r\n        if (item && item.is('element', 'listItem')) {\r\n            items.push(item);\r\n        }\r\n    }\r\n    return items;\r\n}\r\nfunction getItemFromChange(change) {\r\n    if (change.type === 'attribute') {\r\n        return change.range.start.nodeAfter;\r\n    }\r\n    if (change.type === 'insert') {\r\n        return change.position.nodeAfter;\r\n    }\r\n    return null;\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./collapsible.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { View, ButtonView } from 'ckeditor5/src/ui';\r\n// eslint-disable-next-line ckeditor5-rules/ckeditor-imports\r\nimport dropdownArrowIcon from '@ckeditor/ckeditor5-ui/theme/icons/dropdown-arrow.svg';\r\nimport '../../../theme/collapsible.css';\r\n/**\r\n * A collapsible UI component. Consists of a labeled button and a container which can be collapsed\r\n * by clicking the button. The collapsible container can be a host to other UI views.\r\n *\r\n * @internal\r\n */\r\nexport default class CollapsibleView extends View {\r\n    /**\r\n     * Creates an instance of the collapsible view.\r\n     *\r\n     * @param locale The {@link module:core/editor/editor~Editor#locale} instance.\r\n     * @param childViews An optional array of initial child views to be inserted into the collapsible.\r\n     */\r\n    constructor(locale, childViews) {\r\n        super(locale);\r\n        const bind = this.bindTemplate;\r\n        this.set('isCollapsed', false);\r\n        this.set('label', '');\r\n        this.buttonView = this._createButtonView();\r\n        this.children = this.createCollection();\r\n        this.set('_collapsibleAriaLabelUid', undefined);\r\n        if (childViews) {\r\n            this.children.addMany(childViews);\r\n        }\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-collapsible',\r\n                    bind.if('isCollapsed', 'ck-collapsible_collapsed')\r\n                ]\r\n            },\r\n            children: [\r\n                this.buttonView,\r\n                {\r\n                    tag: 'div',\r\n                    attributes: {\r\n                        class: [\r\n                            'ck',\r\n                            'ck-collapsible__children'\r\n                        ],\r\n                        role: 'region',\r\n                        hidden: bind.if('isCollapsed', 'hidden'),\r\n                        'aria-labelledby': bind.to('_collapsibleAriaLabelUid')\r\n                    },\r\n                    children: this.children\r\n                }\r\n            ]\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        this._collapsibleAriaLabelUid = this.buttonView.labelView.element.id;\r\n    }\r\n    /**\r\n     * Creates the main {@link #buttonView} of the collapsible.\r\n     */\r\n    _createButtonView() {\r\n        const buttonView = new ButtonView(this.locale);\r\n        const bind = buttonView.bindTemplate;\r\n        buttonView.set({\r\n            withText: true,\r\n            icon: dropdownArrowIcon\r\n        });\r\n        buttonView.extendTemplate({\r\n            attributes: {\r\n                'aria-expanded': bind.to('isOn', value => String(value))\r\n            }\r\n        });\r\n        buttonView.bind('label').to(this);\r\n        buttonView.bind('isOn').to(this, 'isCollapsed', isCollapsed => !isCollapsed);\r\n        buttonView.on('execute', () => {\r\n            this.isCollapsed = !this.isCollapsed;\r\n        });\r\n        return buttonView;\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./listproperties.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module list/listproperties/ui/listpropertiesview\r\n */\r\nimport { View, ViewCollection, FocusCycler, SwitchButtonView, LabeledFieldView, createLabeledInputNumber, addKeyboardHandlingForGrid } from 'ckeditor5/src/ui';\r\nimport { FocusTracker, KeystrokeHandler, global } from 'ckeditor5/src/utils';\r\nimport CollapsibleView from './collapsibleview';\r\nimport '../../../theme/listproperties.css';\r\n/**\r\n * The list properties view to be displayed in the list dropdown.\r\n *\r\n * Contains a grid of available list styles and, for numbered list, also the list start index and reversed fields.\r\n *\r\n * @internal\r\n */\r\nexport default class ListPropertiesView extends View {\r\n    /**\r\n     * Creates an instance of the list properties view.\r\n     *\r\n     * @param locale The {@link module:core/editor/editor~Editor#locale} instance.\r\n     * @param options Options of the view.\r\n     * @param options.enabledProperties An object containing the configuration of enabled list property names.\r\n     * Allows conditional rendering the sub-components of the properties view.\r\n     * @param options.styleButtonViews A list of style buttons to be rendered\r\n     * inside the styles grid. The grid will not be rendered when `enabledProperties` does not include the `'styles'` key.\r\n     * @param options.styleGridAriaLabel An assistive technologies label set on the grid of styles (if the grid is rendered).\r\n     */\r\n    constructor(locale, { enabledProperties, styleButtonViews, styleGridAriaLabel }) {\r\n        super(locale);\r\n        /**\r\n         * A view that renders the grid of list styles.\r\n         */\r\n        this.stylesView = null;\r\n        /**\r\n         * A collapsible view that hosts additional list property fields ({@link #startIndexFieldView} and\r\n         * {@link #reversedSwitchButtonView}) to visually separate them from the {@link #stylesView grid of styles}.\r\n         *\r\n         * **Note**: Only present when:\r\n         * * the view represents **numbered** list properties,\r\n         * * and the {@link #stylesView} is rendered,\r\n         * * and either {@link #startIndexFieldView} or {@link #reversedSwitchButtonView} is rendered.\r\n         *\r\n         * @readonly\r\n         */\r\n        this.additionalPropertiesCollapsibleView = null;\r\n        /**\r\n         * A labeled number field allowing the user to set the start index of the list.\r\n         *\r\n         * **Note**: Only present when the view represents **numbered** list properties.\r\n         *\r\n         * @readonly\r\n         */\r\n        this.startIndexFieldView = null;\r\n        /**\r\n         * A switch button allowing the user to make the edited list reversed.\r\n         *\r\n         * **Note**: Only present when the view represents **numbered** list properties.\r\n         *\r\n         * @readonly\r\n         */\r\n        this.reversedSwitchButtonView = null;\r\n        /**\r\n         * Tracks information about the DOM focus in the view.\r\n         */\r\n        this.focusTracker = new FocusTracker();\r\n        /**\r\n         * An instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}.\r\n         */\r\n        this.keystrokes = new KeystrokeHandler();\r\n        /**\r\n         * A collection of views that can be focused in the properties view.\r\n         */\r\n        this.focusables = new ViewCollection();\r\n        const elementCssClasses = [\r\n            'ck',\r\n            'ck-list-properties'\r\n        ];\r\n        this.children = this.createCollection();\r\n        this.focusCycler = new FocusCycler({\r\n            focusables: this.focusables,\r\n            focusTracker: this.focusTracker,\r\n            keystrokeHandler: this.keystrokes,\r\n            actions: {\r\n                // Navigate #children backwards using the <kbd>Shift</kbd> + <kbd>Tab</kbd> keystroke.\r\n                focusPrevious: 'shift + tab',\r\n                // Navigate #children forwards using the <kbd>Tab</kbd> key.\r\n                focusNext: 'tab'\r\n            }\r\n        });\r\n        // The rendering of the styles grid is conditional. When there is no styles grid, the view will render without collapsible\r\n        // for numbered list properties, hence simplifying the layout.\r\n        if (enabledProperties.styles) {\r\n            this.stylesView = this._createStylesView(styleButtonViews, styleGridAriaLabel);\r\n            this.children.add(this.stylesView);\r\n        }\r\n        else {\r\n            elementCssClasses.push('ck-list-properties_without-styles');\r\n        }\r\n        // The rendering of the numbered list property views is also conditional. It only makes sense for the numbered list\r\n        // dropdown. The unordered list does not have such properties.\r\n        if (enabledProperties.startIndex || enabledProperties.reversed) {\r\n            this._addNumberedListPropertyViews(enabledProperties);\r\n            elementCssClasses.push('ck-list-properties_with-numbered-properties');\r\n        }\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: elementCssClasses\r\n            },\r\n            children: this.children\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        if (this.stylesView) {\r\n            this.focusables.add(this.stylesView);\r\n            this.focusTracker.add(this.stylesView.element);\r\n            // Register the collapsible toggle button to the focus system.\r\n            if (this.startIndexFieldView || this.reversedSwitchButtonView) {\r\n                this.focusables.add(this.children.last.buttonView);\r\n                this.focusTracker.add(this.children.last.buttonView.element);\r\n            }\r\n            for (const item of this.stylesView.children) {\r\n                this.stylesView.focusTracker.add(item.element);\r\n            }\r\n            addKeyboardHandlingForGrid({\r\n                keystrokeHandler: this.stylesView.keystrokes,\r\n                focusTracker: this.stylesView.focusTracker,\r\n                gridItems: this.stylesView.children,\r\n                // Note: The styles view has a different number of columns depending on whether the other properties\r\n                // are enabled in the dropdown or not (https://github.com/ckeditor/ckeditor5/issues/12340)\r\n                numberOfColumns: () => global.window\r\n                    .getComputedStyle(this.stylesView.element)\r\n                    .getPropertyValue('grid-template-columns')\r\n                    .split(' ')\r\n                    .length,\r\n                uiLanguageDirection: this.locale && this.locale.uiLanguageDirection\r\n            });\r\n        }\r\n        if (this.startIndexFieldView) {\r\n            this.focusables.add(this.startIndexFieldView);\r\n            this.focusTracker.add(this.startIndexFieldView.element);\r\n            const stopPropagation = (data) => data.stopPropagation();\r\n            // Since the form is in the dropdown panel which is a child of the toolbar, the toolbar's\r\n            // keystroke handler would take over the key management in the input. We need to prevent\r\n            // this ASAP. Otherwise, the basic caret movement using the arrow keys will be impossible.\r\n            this.keystrokes.set('arrowright', stopPropagation);\r\n            this.keystrokes.set('arrowleft', stopPropagation);\r\n            this.keystrokes.set('arrowup', stopPropagation);\r\n            this.keystrokes.set('arrowdown', stopPropagation);\r\n        }\r\n        if (this.reversedSwitchButtonView) {\r\n            this.focusables.add(this.reversedSwitchButtonView);\r\n            this.focusTracker.add(this.reversedSwitchButtonView.element);\r\n        }\r\n        // Start listening for the keystrokes coming from #element.\r\n        this.keystrokes.listenTo(this.element);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    focus() {\r\n        this.focusCycler.focusFirst();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    focusLast() {\r\n        this.focusCycler.focusLast();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        this.focusTracker.destroy();\r\n        this.keystrokes.destroy();\r\n    }\r\n    /**\r\n     * Creates the list styles grid.\r\n     *\r\n     * @param styleButtons Buttons to be placed in the grid.\r\n     * @param styleGridAriaLabel The assistive technology label of the grid.\r\n     */\r\n    _createStylesView(styleButtons, styleGridAriaLabel) {\r\n        const stylesView = new View(this.locale);\r\n        stylesView.children = stylesView.createCollection();\r\n        stylesView.children.addMany(styleButtons);\r\n        stylesView.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                'aria-label': styleGridAriaLabel,\r\n                class: [\r\n                    'ck',\r\n                    'ck-list-styles-list'\r\n                ]\r\n            },\r\n            children: stylesView.children\r\n        });\r\n        stylesView.children.delegate('execute').to(this);\r\n        stylesView.focus = function () {\r\n            this.children.first.focus();\r\n        };\r\n        stylesView.focusTracker = new FocusTracker();\r\n        stylesView.keystrokes = new KeystrokeHandler();\r\n        stylesView.render();\r\n        stylesView.keystrokes.listenTo(stylesView.element);\r\n        return stylesView;\r\n    }\r\n    /**\r\n     * Renders {@link #startIndexFieldView} and/or {@link #reversedSwitchButtonView} depending on the configuration of the properties view.\r\n     *\r\n     * @param enabledProperties An object containing the configuration of enabled list property names\r\n     * (see {@link #constructor}).\r\n     */\r\n    _addNumberedListPropertyViews(enabledProperties) {\r\n        const t = this.locale.t;\r\n        const numberedPropertyViews = [];\r\n        if (enabledProperties.startIndex) {\r\n            this.startIndexFieldView = this._createStartIndexField();\r\n            numberedPropertyViews.push(this.startIndexFieldView);\r\n        }\r\n        if (enabledProperties.reversed) {\r\n            this.reversedSwitchButtonView = this._createReversedSwitchButton();\r\n            numberedPropertyViews.push(this.reversedSwitchButtonView);\r\n        }\r\n        // When there are some style buttons, pack the numbered list properties into a collapsible to separate them.\r\n        if (enabledProperties.styles) {\r\n            this.additionalPropertiesCollapsibleView = new CollapsibleView(this.locale, numberedPropertyViews);\r\n            this.additionalPropertiesCollapsibleView.set({\r\n                label: t('List properties'),\r\n                isCollapsed: true\r\n            });\r\n            // Don't enable the collapsible view unless either start index or reversed field is enabled (e.g. when no list is selected).\r\n            this.additionalPropertiesCollapsibleView.buttonView.bind('isEnabled').toMany(numberedPropertyViews, 'isEnabled', (...areEnabled) => areEnabled.some(isEnabled => isEnabled));\r\n            // Automatically collapse the additional properties collapsible when either start index or reversed field gets disabled.\r\n            this.additionalPropertiesCollapsibleView.buttonView.on('change:isEnabled', (evt, data, isEnabled) => {\r\n                if (!isEnabled) {\r\n                    this.additionalPropertiesCollapsibleView.isCollapsed = true;\r\n                }\r\n            });\r\n            this.children.add(this.additionalPropertiesCollapsibleView);\r\n        }\r\n        else {\r\n            this.children.addMany(numberedPropertyViews);\r\n        }\r\n    }\r\n    /**\r\n     * Creates the list start index labeled field.\r\n     */\r\n    _createStartIndexField() {\r\n        const t = this.locale.t;\r\n        const startIndexFieldView = new LabeledFieldView(this.locale, createLabeledInputNumber);\r\n        startIndexFieldView.set({\r\n            label: t('Start at'),\r\n            class: 'ck-numbered-list-properties__start-index'\r\n        });\r\n        startIndexFieldView.fieldView.set({\r\n            min: 0,\r\n            step: 1,\r\n            value: 1,\r\n            inputMode: 'numeric'\r\n        });\r\n        startIndexFieldView.fieldView.on('input', () => {\r\n            const inputElement = startIndexFieldView.fieldView.element;\r\n            const startIndex = inputElement.valueAsNumber;\r\n            if (Number.isNaN(startIndex)) {\r\n                return;\r\n            }\r\n            if (!inputElement.checkValidity()) {\r\n                startIndexFieldView.errorText = t('Start index must be greater than 0.');\r\n            }\r\n            else {\r\n                this.fire('listStart', { startIndex });\r\n            }\r\n        });\r\n        return startIndexFieldView;\r\n    }\r\n    /**\r\n     * Creates the reversed list switch button.\r\n     */\r\n    _createReversedSwitchButton() {\r\n        const t = this.locale.t;\r\n        const reversedButtonView = new SwitchButtonView(this.locale);\r\n        reversedButtonView.set({\r\n            withText: true,\r\n            label: t('Reversed order'),\r\n            class: 'ck-numbered-list-properties__reversed-order'\r\n        });\r\n        reversedButtonView.delegate('execute').to(this, 'listReversed');\r\n        return reversedButtonView;\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./liststyles.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module list/listproperties/listpropertiesui\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { ButtonView, SplitButtonView, createDropdown, focusChildOnDropdownOpen } from 'ckeditor5/src/ui';\r\nimport ListPropertiesView from './ui/listpropertiesview';\r\nimport bulletedListIcon from '../../theme/icons/bulletedlist.svg';\r\nimport numberedListIcon from '../../theme/icons/numberedlist.svg';\r\nimport listStyleDiscIcon from '../../theme/icons/liststyledisc.svg';\r\nimport listStyleCircleIcon from '../../theme/icons/liststylecircle.svg';\r\nimport listStyleSquareIcon from '../../theme/icons/liststylesquare.svg';\r\nimport listStyleDecimalIcon from '../../theme/icons/liststyledecimal.svg';\r\nimport listStyleDecimalWithLeadingZeroIcon from '../../theme/icons/liststyledecimalleadingzero.svg';\r\nimport listStyleLowerRomanIcon from '../../theme/icons/liststylelowerroman.svg';\r\nimport listStyleUpperRomanIcon from '../../theme/icons/liststyleupperroman.svg';\r\nimport listStyleLowerLatinIcon from '../../theme/icons/liststylelowerlatin.svg';\r\nimport listStyleUpperLatinIcon from '../../theme/icons/liststyleupperlatin.svg';\r\nimport '../../theme/liststyles.css';\r\n/**\r\n * The list properties UI plugin. It introduces the extended `'bulletedList'` and `'numberedList'` toolbar\r\n * buttons that allow users to control such aspects of list as the marker, start index or order.\r\n *\r\n * **Note**: Buttons introduced by this plugin override implementations from the {@link module:list/list/listui~ListUI}\r\n * (because they share the same names).\r\n */\r\nexport default class ListPropertiesUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ListPropertiesUI';\r\n    }\r\n    init() {\r\n        const editor = this.editor;\r\n        const t = editor.locale.t;\r\n        const enabledProperties = editor.config.get('list.properties');\r\n        // Note: When this plugin does not register the \"bulletedList\" dropdown due to properties configuration,\r\n        // a simple button will be still registered under the same name by ListUI as a fallback. This should happen\r\n        // in most editor configuration because the List plugin automatically requires ListUI.\r\n        if (enabledProperties.styles) {\r\n            editor.ui.componentFactory.add('bulletedList', getDropdownViewCreator({\r\n                editor,\r\n                parentCommandName: 'bulletedList',\r\n                buttonLabel: t('Bulleted List'),\r\n                buttonIcon: bulletedListIcon,\r\n                styleGridAriaLabel: t('Bulleted list styles toolbar'),\r\n                styleDefinitions: [\r\n                    {\r\n                        label: t('Toggle the disc list style'),\r\n                        tooltip: t('Disc'),\r\n                        type: 'disc',\r\n                        icon: listStyleDiscIcon\r\n                    },\r\n                    {\r\n                        label: t('Toggle the circle list style'),\r\n                        tooltip: t('Circle'),\r\n                        type: 'circle',\r\n                        icon: listStyleCircleIcon\r\n                    },\r\n                    {\r\n                        label: t('Toggle the square list style'),\r\n                        tooltip: t('Square'),\r\n                        type: 'square',\r\n                        icon: listStyleSquareIcon\r\n                    }\r\n                ]\r\n            }));\r\n        }\r\n        // Note: When this plugin does not register the \"numberedList\" dropdown due to properties configuration,\r\n        // a simple button will be still registered under the same name by ListUI as a fallback. This should happen\r\n        // in most editor configuration because the List plugin automatically requires ListUI.\r\n        if (enabledProperties.styles || enabledProperties.startIndex || enabledProperties.reversed) {\r\n            editor.ui.componentFactory.add('numberedList', getDropdownViewCreator({\r\n                editor,\r\n                parentCommandName: 'numberedList',\r\n                buttonLabel: t('Numbered List'),\r\n                buttonIcon: numberedListIcon,\r\n                styleGridAriaLabel: t('Numbered list styles toolbar'),\r\n                styleDefinitions: [\r\n                    {\r\n                        label: t('Toggle the decimal list style'),\r\n                        tooltip: t('Decimal'),\r\n                        type: 'decimal',\r\n                        icon: listStyleDecimalIcon\r\n                    },\r\n                    {\r\n                        label: t('Toggle the decimal with leading zero list style'),\r\n                        tooltip: t('Decimal with leading zero'),\r\n                        type: 'decimal-leading-zero',\r\n                        icon: listStyleDecimalWithLeadingZeroIcon\r\n                    },\r\n                    {\r\n                        label: t('Toggle the lower–roman list style'),\r\n                        tooltip: t('Lower–roman'),\r\n                        type: 'lower-roman',\r\n                        icon: listStyleLowerRomanIcon\r\n                    },\r\n                    {\r\n                        label: t('Toggle the upper–roman list style'),\r\n                        tooltip: t('Upper-roman'),\r\n                        type: 'upper-roman',\r\n                        icon: listStyleUpperRomanIcon\r\n                    },\r\n                    {\r\n                        label: t('Toggle the lower–latin list style'),\r\n                        tooltip: t('Lower-latin'),\r\n                        type: 'lower-latin',\r\n                        icon: listStyleLowerLatinIcon\r\n                    },\r\n                    {\r\n                        label: t('Toggle the upper–latin list style'),\r\n                        tooltip: t('Upper-latin'),\r\n                        type: 'upper-latin',\r\n                        icon: listStyleUpperLatinIcon\r\n                    }\r\n                ]\r\n            }));\r\n        }\r\n    }\r\n}\r\n/**\r\n * A helper that returns a function that creates a split button with a toolbar in the dropdown,\r\n * which in turn contains buttons allowing users to change list styles in the context of the current selection.\r\n *\r\n * @param options.editor\r\n * @param options.parentCommandName The name of the higher-order editor command associated with\r\n * the set of particular list styles (e.g. \"bulletedList\" for \"disc\", \"circle\", and \"square\" styles).\r\n * @param options.buttonLabel Label of the main part of the split button.\r\n * @param options.buttonIcon The SVG string of an icon for the main part of the split button.\r\n * @param options.styleGridAriaLabel The ARIA label for the styles grid in the split button dropdown.\r\n * @param options.styleDefinitions Definitions of the style buttons.\r\n * @returns A function that can be passed straight into {@link module:ui/componentfactory~ComponentFactory#add}.\r\n */\r\nfunction getDropdownViewCreator({ editor, parentCommandName, buttonLabel, buttonIcon, styleGridAriaLabel, styleDefinitions }) {\r\n    const parentCommand = editor.commands.get(parentCommandName);\r\n    return (locale) => {\r\n        const dropdownView = createDropdown(locale, SplitButtonView);\r\n        const mainButtonView = dropdownView.buttonView;\r\n        dropdownView.bind('isEnabled').to(parentCommand);\r\n        dropdownView.class = 'ck-list-styles-dropdown';\r\n        // Main button was clicked.\r\n        mainButtonView.on('execute', () => {\r\n            editor.execute(parentCommandName);\r\n            editor.editing.view.focus();\r\n        });\r\n        mainButtonView.set({\r\n            label: buttonLabel,\r\n            icon: buttonIcon,\r\n            tooltip: true,\r\n            isToggleable: true\r\n        });\r\n        mainButtonView.bind('isOn').to(parentCommand, 'value', value => !!value);\r\n        dropdownView.once('change:isOpen', () => {\r\n            const listPropertiesView = createListPropertiesView({\r\n                editor,\r\n                dropdownView,\r\n                parentCommandName,\r\n                styleGridAriaLabel,\r\n                styleDefinitions\r\n            });\r\n            dropdownView.panelView.children.add(listPropertiesView);\r\n        });\r\n        // Focus the editable after executing the command.\r\n        // Overrides a default behaviour where the focus is moved to the dropdown button (#12125).\r\n        dropdownView.on('execute', () => {\r\n            editor.editing.view.focus();\r\n        });\r\n        return dropdownView;\r\n    };\r\n}\r\n/**\r\n * A helper that returns a function (factory) that creates individual buttons used by users to change styles\r\n * of lists.\r\n *\r\n * @param options.editor\r\n * @param options.listStyleCommand The instance of the `ListStylesCommand` class.\r\n * @param options.parentCommandName The name of the higher-order command associated with a\r\n * particular list style (e.g. \"bulletedList\" is associated with \"square\" and \"numberedList\" is associated with \"roman\").\r\n * @returns A function that can be passed straight into {@link module:ui/componentfactory~ComponentFactory#add}.\r\n */\r\nfunction getStyleButtonCreator({ editor, listStyleCommand, parentCommandName }) {\r\n    const locale = editor.locale;\r\n    const parentCommand = editor.commands.get(parentCommandName);\r\n    return ({ label, type, icon, tooltip }) => {\r\n        const button = new ButtonView(locale);\r\n        button.set({ label, icon, tooltip });\r\n        listStyleCommand.on('change:value', () => {\r\n            button.isOn = listStyleCommand.value === type;\r\n        });\r\n        button.on('execute', () => {\r\n            // If the content the selection is anchored to is a list, let's change its style.\r\n            if (parentCommand.value) {\r\n                // If the current list style is not set in the model or the style is different than the\r\n                // one to be applied, simply apply the new style.\r\n                if (listStyleCommand.value !== type) {\r\n                    editor.execute('listStyle', { type });\r\n                }\r\n                // If the style was the same, remove it (the button works as an off toggle).\r\n                else {\r\n                    editor.execute('listStyle', { type: listStyleCommand.defaultType });\r\n                }\r\n            }\r\n            // Otherwise, leave the creation of the styled list to the `ListStyleCommand`.\r\n            else {\r\n                editor.model.change(() => {\r\n                    editor.execute('listStyle', { type });\r\n                });\r\n            }\r\n        });\r\n        return button;\r\n    };\r\n}\r\n/**\r\n * A helper that creates the properties view for the individual style dropdown.\r\n *\r\n * @param options.editor Editor instance.\r\n * @param options.dropdownView Styles dropdown view that hosts the properties view.\r\n * @param options.parentCommandName The name of the higher-order editor command associated with\r\n * the set of particular list styles (e.g. \"bulletedList\" for \"disc\", \"circle\", and \"square\" styles).\r\n * @param options.styleDefinitions Definitions of the style buttons.\r\n * @param options.styleGridAriaLabel An assistive technologies label set on the grid of styles (if the grid is rendered).\r\n */\r\nfunction createListPropertiesView({ editor, dropdownView, parentCommandName, styleDefinitions, styleGridAriaLabel }) {\r\n    const locale = editor.locale;\r\n    const enabledProperties = editor.config.get('list.properties');\r\n    let styleButtonViews = null;\r\n    if (parentCommandName != 'numberedList') {\r\n        enabledProperties.startIndex = false;\r\n        enabledProperties.reversed = false;\r\n    }\r\n    if (enabledProperties.styles) {\r\n        const listStyleCommand = editor.commands.get('listStyle');\r\n        const styleButtonCreator = getStyleButtonCreator({\r\n            editor,\r\n            parentCommandName,\r\n            listStyleCommand\r\n        });\r\n        // The command can be ListStyleCommand or DocumentListStyleCommand.\r\n        const isStyleTypeSupported = typeof listStyleCommand.isStyleTypeSupported == 'function' ?\r\n            (styleDefinition) => listStyleCommand.isStyleTypeSupported(styleDefinition.type) :\r\n            () => true;\r\n        styleButtonViews = styleDefinitions.filter(isStyleTypeSupported).map(styleButtonCreator);\r\n    }\r\n    const listPropertiesView = new ListPropertiesView(locale, {\r\n        styleGridAriaLabel,\r\n        enabledProperties,\r\n        styleButtonViews\r\n    });\r\n    if (enabledProperties.styles) {\r\n        // Accessibility: focus the first active style when opening the dropdown.\r\n        focusChildOnDropdownOpen(dropdownView, () => {\r\n            return listPropertiesView.stylesView.children.find((child) => child.isOn);\r\n        });\r\n    }\r\n    if (enabledProperties.startIndex) {\r\n        const listStartCommand = editor.commands.get('listStart');\r\n        listPropertiesView.startIndexFieldView.bind('isEnabled').to(listStartCommand);\r\n        listPropertiesView.startIndexFieldView.fieldView.bind('value').to(listStartCommand);\r\n        listPropertiesView.on('listStart', (evt, data) => editor.execute('listStart', data));\r\n    }\r\n    if (enabledProperties.reversed) {\r\n        const listReversedCommand = editor.commands.get('listReversed');\r\n        listPropertiesView.reversedSwitchButtonView.bind('isEnabled').to(listReversedCommand);\r\n        listPropertiesView.reversedSwitchButtonView.bind('isOn').to(listReversedCommand, 'value', value => !!value);\r\n        listPropertiesView.on('listReversed', () => {\r\n            const isReversed = listReversedCommand.value;\r\n            editor.execute('listReversed', { reversed: !isReversed });\r\n        });\r\n    }\r\n    // Make sure applying styles closes the dropdown.\r\n    listPropertiesView.delegate('execute').to(dropdownView);\r\n    return listPropertiesView;\r\n}\r\n","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * Returns a function that converts the model \"url\" attribute to the view representation.\r\n *\r\n * Depending on the configuration, the view representation can be \"semantic\" (for the data pipeline):\r\n *\r\n * ```html\r\n * <figure class=\"media\">\r\n * \t<oembed url=\"foo\"></oembed>\r\n * </figure>\r\n * ```\r\n *\r\n * or \"non-semantic\" (for the editing view pipeline):\r\n *\r\n * ```html\r\n * <figure class=\"media\">\r\n * \t<div data-oembed-url=\"foo\">[ non-semantic media preview for \"foo\" ]</div>\r\n * </figure>\r\n * ```\r\n *\r\n * **Note:** Changing the model \"url\" attribute replaces the entire content of the\r\n * `<figure>` in the view.\r\n *\r\n * @param registry The registry providing\r\n * the media and their content.\r\n * @param options options object with following properties:\r\n * - elementName When set, overrides the default element name for semantic media embeds.\r\n * - renderMediaPreview When `true`, the converter will create the view in the non-semantic form.\r\n * - renderForEditingView When `true`, the converter will create a view specific for the\r\n * editing pipeline (e.g. including CSS classes, content placeholders).\r\n */\r\nexport function modelToViewUrlAttributeConverter(registry, options) {\r\n    const converter = (evt, data, conversionApi) => {\r\n        if (!conversionApi.consumable.consume(data.item, evt.name)) {\r\n            return;\r\n        }\r\n        const url = data.attributeNewValue;\r\n        const viewWriter = conversionApi.writer;\r\n        const figure = conversionApi.mapper.toViewElement(data.item);\r\n        const mediaContentElement = [...figure.getChildren()]\r\n            .find(child => child.getCustomProperty('media-content'));\r\n        // TODO: removing the wrapper and creating it from scratch is a hack. We can do better than that.\r\n        viewWriter.remove(mediaContentElement);\r\n        const mediaViewElement = registry.getMediaViewElement(viewWriter, url, options);\r\n        viewWriter.insert(viewWriter.createPositionAt(figure, 0), mediaViewElement);\r\n    };\r\n    return dispatcher => {\r\n        dispatcher.on('attribute:url:media', converter);\r\n    };\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { isWidget, toWidget } from 'ckeditor5/src/widget';\r\n/**\r\n * Converts a given {@link module:engine/view/element~Element} to a media embed widget:\r\n * * Adds a {@link module:engine/view/element~Element#_setCustomProperty custom property} allowing to recognize the media widget element.\r\n * * Calls the {@link module:widget/utils~toWidget} function with the proper element's label creator.\r\n *\r\n * @param writer An instance of the view writer.\r\n * @param label The element's label.\r\n */\r\nexport function toMediaWidget(viewElement, writer, label) {\r\n    writer.setCustomProperty('media', true, viewElement);\r\n    return toWidget(viewElement, writer, { label });\r\n}\r\n/**\r\n * Returns a media widget editing view element if one is selected.\r\n */\r\nexport function getSelectedMediaViewWidget(selection) {\r\n    const viewElement = selection.getSelectedElement();\r\n    if (viewElement && isMediaWidget(viewElement)) {\r\n        return viewElement;\r\n    }\r\n    return null;\r\n}\r\n/**\r\n * Checks if a given view element is a media widget.\r\n */\r\nexport function isMediaWidget(viewElement) {\r\n    return !!viewElement.getCustomProperty('media') && isWidget(viewElement);\r\n}\r\n/**\r\n * Creates a view element representing the media. Either a \"semantic\" one for the data pipeline:\r\n *\r\n * ```html\r\n * <figure class=\"media\">\r\n * \t<oembed url=\"foo\"></oembed>\r\n * </figure>\r\n * ```\r\n *\r\n * or a \"non-semantic\" (for the editing view pipeline):\r\n *\r\n * ```html\r\n * <figure class=\"media\">\r\n * \t<div data-oembed-url=\"foo\">[ non-semantic media preview for \"foo\" ]</div>\r\n * </figure>\r\n * ```\r\n */\r\nexport function createMediaFigureElement(writer, registry, url, options) {\r\n    return writer.createContainerElement('figure', { class: 'media' }, [\r\n        registry.getMediaViewElement(writer, url, options),\r\n        writer.createSlot()\r\n    ]);\r\n}\r\n/**\r\n * Returns a selected media element in the model, if any.\r\n */\r\nexport function getSelectedMediaModelWidget(selection) {\r\n    const selectedElement = selection.getSelectedElement();\r\n    if (selectedElement && selectedElement.is('element', 'media')) {\r\n        return selectedElement;\r\n    }\r\n    return null;\r\n}\r\n/**\r\n * Creates a media element and inserts it into the model.\r\n *\r\n * **Note**: This method will use {@link module:engine/model/model~Model#insertContent `model.insertContent()`} logic of inserting content\r\n * if no `insertPosition` is passed.\r\n *\r\n * @param url An URL of an embeddable media.\r\n * @param findOptimalPosition If true it will try to find optimal position to insert media without breaking content\r\n * in which a selection is.\r\n */\r\nexport function insertMedia(model, url, selectable, findOptimalPosition) {\r\n    model.change(writer => {\r\n        const mediaElement = writer.createElement('media', { url });\r\n        model.insertObject(mediaElement, selectable, null, {\r\n            setSelection: 'on',\r\n            findOptimalPosition: findOptimalPosition ? 'auto' : undefined\r\n        });\r\n    });\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { findOptimalInsertionRange } from 'ckeditor5/src/widget';\r\nimport { getSelectedMediaModelWidget, insertMedia } from './utils';\r\n/**\r\n * The insert media command.\r\n *\r\n * The command is registered by the {@link module:media-embed/mediaembedediting~MediaEmbedEditing} as `'mediaEmbed'`.\r\n *\r\n * To insert media at the current selection, execute the command and specify the URL:\r\n *\r\n * ```ts\r\n * editor.execute( 'mediaEmbed', 'http://url.to.the/media' );\r\n * ```\r\n */\r\nexport default class MediaEmbedCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const model = this.editor.model;\r\n        const selection = model.document.selection;\r\n        const selectedMedia = getSelectedMediaModelWidget(selection);\r\n        this.value = selectedMedia ? selectedMedia.getAttribute('url') : undefined;\r\n        this.isEnabled = isMediaSelected(selection) || isAllowedInParent(selection, model);\r\n    }\r\n    /**\r\n     * Executes the command, which either:\r\n     *\r\n     * * updates the URL of the selected media,\r\n     * * inserts the new media into the editor and puts the selection around it.\r\n     *\r\n     * @fires execute\r\n     * @param url The URL of the media.\r\n     */\r\n    execute(url) {\r\n        const model = this.editor.model;\r\n        const selection = model.document.selection;\r\n        const selectedMedia = getSelectedMediaModelWidget(selection);\r\n        if (selectedMedia) {\r\n            model.change(writer => {\r\n                writer.setAttribute('url', url, selectedMedia);\r\n            });\r\n        }\r\n        else {\r\n            insertMedia(model, url, selection, true);\r\n        }\r\n    }\r\n}\r\n/**\r\n * Checks if the media embed is allowed in the parent.\r\n */\r\nfunction isAllowedInParent(selection, model) {\r\n    const insertionRange = findOptimalInsertionRange(selection, model);\r\n    let parent = insertionRange.start.parent;\r\n    // The model.insertContent() will remove empty parent (unless it is a $root or a limit).\r\n    if (parent.isEmpty && !model.schema.isLimit(parent)) {\r\n        parent = parent.parent;\r\n    }\r\n    return model.schema.checkChild(parent, 'media');\r\n}\r\n/**\r\n * Checks if the media object is selected.\r\n */\r\nfunction isMediaSelected(selection) {\r\n    const element = selection.getSelectedElement();\r\n    return !!element && element.name === 'media';\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { IconView, Template } from 'ckeditor5/src/ui';\r\nimport { logWarning, toArray } from 'ckeditor5/src/utils';\r\nimport mediaPlaceholderIcon from '../theme/icons/media-placeholder.svg';\r\nconst mediaPlaceholderIconViewBox = '0 0 64 42';\r\n/**\r\n * A bridge between the raw media content provider definitions and the editor view content.\r\n *\r\n * It helps translating media URLs to corresponding {@link module:engine/view/element~Element view elements}.\r\n *\r\n * Mostly used by the {@link module:media-embed/mediaembedediting~MediaEmbedEditing} plugin.\r\n */\r\nexport default class MediaRegistry {\r\n    /**\r\n     * Creates an instance of the {@link module:media-embed/mediaregistry~MediaRegistry} class.\r\n     *\r\n     * @param locale The localization services instance.\r\n     * @param config The configuration of the media embed feature.\r\n     */\r\n    constructor(locale, config) {\r\n        const providers = config.providers;\r\n        const extraProviders = config.extraProviders || [];\r\n        const removedProviders = new Set(config.removeProviders);\r\n        const providerDefinitions = providers\r\n            .concat(extraProviders)\r\n            .filter(provider => {\r\n            const name = provider.name;\r\n            if (!name) {\r\n                /**\r\n                 * One of the providers (or extra providers) specified in the media embed configuration\r\n                 * has no name and will not be used by the editor. In order to get this media\r\n                 * provider working, double check your editor configuration.\r\n                 *\r\n                 * @error media-embed-no-provider-name\r\n                 */\r\n                logWarning('media-embed-no-provider-name', { provider });\r\n                return false;\r\n            }\r\n            return !removedProviders.has(name);\r\n        });\r\n        this.locale = locale;\r\n        this.providerDefinitions = providerDefinitions;\r\n    }\r\n    /**\r\n     * Checks whether the passed URL is representing a certain media type allowed in the editor.\r\n     *\r\n     * @param url The URL to be checked\r\n     */\r\n    hasMedia(url) {\r\n        return !!this._getMedia(url);\r\n    }\r\n    /**\r\n     * For the given media URL string and options, it returns the {@link module:engine/view/element~Element view element}\r\n     * representing that media.\r\n     *\r\n     * **Note:** If no URL is specified, an empty view element is returned.\r\n     *\r\n     * @param writer The view writer used to produce a view element.\r\n     * @param url The URL to be translated into a view element.\r\n     */\r\n    getMediaViewElement(writer, url, options) {\r\n        return this._getMedia(url).getViewElement(writer, options);\r\n    }\r\n    /**\r\n     * Returns a `Media` instance for the given URL.\r\n     *\r\n     * @param url The URL of the media.\r\n     * @returns The `Media` instance or `null` when there is none.\r\n     */\r\n    _getMedia(url) {\r\n        if (!url) {\r\n            return new Media(this.locale);\r\n        }\r\n        url = url.trim();\r\n        for (const definition of this.providerDefinitions) {\r\n            const previewRenderer = definition.html;\r\n            const pattern = toArray(definition.url);\r\n            for (const subPattern of pattern) {\r\n                const match = this._getUrlMatches(url, subPattern);\r\n                if (match) {\r\n                    return new Media(this.locale, url, match, previewRenderer);\r\n                }\r\n            }\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Tries to match `url` to `pattern`.\r\n     *\r\n     * @param url The URL of the media.\r\n     * @param pattern The pattern that should accept the media URL.\r\n     */\r\n    _getUrlMatches(url, pattern) {\r\n        // 1. Try to match without stripping the protocol and \"www\" subdomain.\r\n        let match = url.match(pattern);\r\n        if (match) {\r\n            return match;\r\n        }\r\n        // 2. Try to match after stripping the protocol.\r\n        let rawUrl = url.replace(/^https?:\\/\\//, '');\r\n        match = rawUrl.match(pattern);\r\n        if (match) {\r\n            return match;\r\n        }\r\n        // 3. Try to match after stripping the \"www\" subdomain.\r\n        rawUrl = rawUrl.replace(/^www\\./, '');\r\n        match = rawUrl.match(pattern);\r\n        if (match) {\r\n            return match;\r\n        }\r\n        return null;\r\n    }\r\n}\r\n/**\r\n * Represents media defined by the provider configuration.\r\n *\r\n * It can be rendered to the {@link module:engine/view/element~Element view element} and used in the editing or data pipeline.\r\n */\r\nclass Media {\r\n    constructor(locale, url, match, previewRenderer) {\r\n        this.url = this._getValidUrl(url);\r\n        this._locale = locale;\r\n        this._match = match;\r\n        this._previewRenderer = previewRenderer;\r\n    }\r\n    /**\r\n     * Returns the view element representation of the media.\r\n     *\r\n     * @param writer The view writer used to produce a view element.\r\n     */\r\n    getViewElement(writer, options) {\r\n        const attributes = {};\r\n        let viewElement;\r\n        if (options.renderForEditingView || (options.renderMediaPreview && this.url && this._previewRenderer)) {\r\n            if (this.url) {\r\n                attributes['data-oembed-url'] = this.url;\r\n            }\r\n            if (options.renderForEditingView) {\r\n                attributes.class = 'ck-media__wrapper';\r\n            }\r\n            const mediaHtml = this._getPreviewHtml(options);\r\n            viewElement = writer.createRawElement('div', attributes, (domElement, domConverter) => {\r\n                domConverter.setContentOf(domElement, mediaHtml);\r\n            });\r\n        }\r\n        else {\r\n            if (this.url) {\r\n                attributes.url = this.url;\r\n            }\r\n            viewElement = writer.createEmptyElement(options.elementName, attributes);\r\n        }\r\n        writer.setCustomProperty('media-content', true, viewElement);\r\n        return viewElement;\r\n    }\r\n    /**\r\n     * Returns the HTML string of the media content preview.\r\n     */\r\n    _getPreviewHtml(options) {\r\n        if (this._previewRenderer) {\r\n            return this._previewRenderer(this._match);\r\n        }\r\n        else {\r\n            // The placeholder only makes sense for editing view and media which have URLs.\r\n            // Placeholder is never displayed in data and URL-less media have no content.\r\n            if (this.url && options.renderForEditingView) {\r\n                return this._getPlaceholderHtml();\r\n            }\r\n            return '';\r\n        }\r\n    }\r\n    /**\r\n     * Returns the placeholder HTML when the media has no content preview.\r\n     */\r\n    _getPlaceholderHtml() {\r\n        const icon = new IconView();\r\n        const t = this._locale.t;\r\n        icon.content = mediaPlaceholderIcon;\r\n        icon.viewBox = mediaPlaceholderIconViewBox;\r\n        const placeholder = new Template({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: 'ck ck-reset_all ck-media__placeholder'\r\n            },\r\n            children: [\r\n                {\r\n                    tag: 'div',\r\n                    attributes: {\r\n                        class: 'ck-media__placeholder__icon'\r\n                    },\r\n                    children: [icon]\r\n                },\r\n                {\r\n                    tag: 'a',\r\n                    attributes: {\r\n                        class: 'ck-media__placeholder__url',\r\n                        target: '_blank',\r\n                        rel: 'noopener noreferrer',\r\n                        href: this.url,\r\n                        'data-cke-tooltip-text': t('Open media in new tab')\r\n                    },\r\n                    children: [\r\n                        {\r\n                            tag: 'span',\r\n                            attributes: {\r\n                                class: 'ck-media__placeholder__url__text'\r\n                            },\r\n                            children: [this.url]\r\n                        }\r\n                    ]\r\n                }\r\n            ]\r\n        }).render();\r\n        return placeholder.outerHTML;\r\n    }\r\n    /**\r\n     * Returns the full URL to the specified media.\r\n     *\r\n     * @param url The URL of the media.\r\n     */\r\n    _getValidUrl(url) {\r\n        if (!url) {\r\n            return null;\r\n        }\r\n        if (url.match(/^https?/)) {\r\n            return url;\r\n        }\r\n        return 'https://' + url;\r\n    }\r\n}\r\n","export default \"<svg viewBox=\\\"0 0 64 42\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M47.426 17V3.713L63.102 0v19.389h-.001l.001.272c0 1.595-2.032 3.43-4.538 4.098-2.506.668-4.538-.083-4.538-1.678 0-1.594 2.032-3.43 4.538-4.098.914-.244 2.032-.565 2.888-.603V4.516L49.076 7.447v9.556A1.014 1.014 0 0 0 49 17h-1.574zM29.5 17h-8.343a7.073 7.073 0 1 0-4.657 4.06v3.781H3.3a2.803 2.803 0 0 1-2.8-2.804V8.63a2.803 2.803 0 0 1 2.8-2.805h4.082L8.58 2.768A1.994 1.994 0 0 1 10.435 1.5h8.985c.773 0 1.477.448 1.805 1.149l1.488 3.177H26.7c1.546 0 2.8 1.256 2.8 2.805V17zm-11.637 0H17.5a1 1 0 0 0-1 1v.05A4.244 4.244 0 1 1 17.863 17zm29.684 2c.97 0 .953-.048.953.889v20.743c0 .953.016.905-.953.905H19.453c-.97 0-.953.048-.953-.905V19.89c0-.937-.016-.889.97-.889h28.077zm-4.701 19.338V22.183H24.154v16.155h18.692zM20.6 21.375v1.616h1.616v-1.616H20.6zm0 3.231v1.616h1.616v-1.616H20.6zm0 3.231v1.616h1.616v-1.616H20.6zm0 3.231v1.616h1.616v-1.616H20.6zm0 3.231v1.616h1.616v-1.616H20.6zm0 3.231v1.616h1.616V37.53H20.6zm24.233-16.155v1.616h1.615v-1.616h-1.615zm0 3.231v1.616h1.615v-1.616h-1.615zm0 3.231v1.616h1.615v-1.616h-1.615zm0 3.231v1.616h1.615v-1.616h-1.615zm0 3.231v1.616h1.615v-1.616h-1.615zm0 3.231v1.616h1.615V37.53h-1.615zM29.485 25.283a.4.4 0 0 1 .593-.35l9.05 4.977a.4.4 0 0 1 0 .701l-9.05 4.978a.4.4 0 0 1-.593-.35v-9.956z\\\"/></svg>\";","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./mediaembedediting.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module media-embed/mediaembedediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { first } from 'ckeditor5/src/utils';\r\nimport { modelToViewUrlAttributeConverter } from './converters';\r\nimport MediaEmbedCommand from './mediaembedcommand';\r\nimport MediaRegistry from './mediaregistry';\r\nimport { toMediaWidget, createMediaFigureElement } from './utils';\r\nimport '../theme/mediaembedediting.css';\r\n/**\r\n * The media embed editing feature.\r\n */\r\nexport default class MediaEmbedEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'MediaEmbedEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        editor.config.define('mediaEmbed', {\r\n            elementName: 'oembed',\r\n            providers: [\r\n                {\r\n                    name: 'dailymotion',\r\n                    url: /^dailymotion\\.com\\/video\\/(\\w+)/,\r\n                    html: match => {\r\n                        const id = match[1];\r\n                        return ('<div style=\"position: relative; padding-bottom: 100%; height: 0; \">' +\r\n                            `<iframe src=\"https://www.dailymotion.com/embed/video/${id}\" ` +\r\n                            'style=\"position: absolute; width: 100%; height: 100%; top: 0; left: 0;\" ' +\r\n                            'frameborder=\"0\" width=\"480\" height=\"270\" allowfullscreen allow=\"autoplay\">' +\r\n                            '</iframe>' +\r\n                            '</div>');\r\n                    }\r\n                },\r\n                {\r\n                    name: 'spotify',\r\n                    url: [\r\n                        /^open\\.spotify\\.com\\/(artist\\/\\w+)/,\r\n                        /^open\\.spotify\\.com\\/(album\\/\\w+)/,\r\n                        /^open\\.spotify\\.com\\/(track\\/\\w+)/\r\n                    ],\r\n                    html: match => {\r\n                        const id = match[1];\r\n                        return ('<div style=\"position: relative; padding-bottom: 100%; height: 0; padding-bottom: 126%;\">' +\r\n                            `<iframe src=\"https://open.spotify.com/embed/${id}\" ` +\r\n                            'style=\"position: absolute; width: 100%; height: 100%; top: 0; left: 0;\" ' +\r\n                            'frameborder=\"0\" allowtransparency=\"true\" allow=\"encrypted-media\">' +\r\n                            '</iframe>' +\r\n                            '</div>');\r\n                    }\r\n                },\r\n                {\r\n                    name: 'youtube',\r\n                    url: [\r\n                        /^(?:m\\.)?youtube\\.com\\/watch\\?v=([\\w-]+)(?:&t=(\\d+))?/,\r\n                        /^(?:m\\.)?youtube\\.com\\/v\\/([\\w-]+)(?:\\?t=(\\d+))?/,\r\n                        /^youtube\\.com\\/embed\\/([\\w-]+)(?:\\?start=(\\d+))?/,\r\n                        /^youtu\\.be\\/([\\w-]+)(?:\\?t=(\\d+))?/\r\n                    ],\r\n                    html: match => {\r\n                        const id = match[1];\r\n                        const time = match[2];\r\n                        return ('<div style=\"position: relative; padding-bottom: 100%; height: 0; padding-bottom: 56.2493%;\">' +\r\n                            `<iframe src=\"https://www.youtube.com/embed/${id}${time ? `?start=${time}` : ''}\" ` +\r\n                            'style=\"position: absolute; width: 100%; height: 100%; top: 0; left: 0;\" ' +\r\n                            'frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen>' +\r\n                            '</iframe>' +\r\n                            '</div>');\r\n                    }\r\n                },\r\n                {\r\n                    name: 'vimeo',\r\n                    url: [\r\n                        /^vimeo\\.com\\/(\\d+)/,\r\n                        /^vimeo\\.com\\/[^/]+\\/[^/]+\\/video\\/(\\d+)/,\r\n                        /^vimeo\\.com\\/album\\/[^/]+\\/video\\/(\\d+)/,\r\n                        /^vimeo\\.com\\/channels\\/[^/]+\\/(\\d+)/,\r\n                        /^vimeo\\.com\\/groups\\/[^/]+\\/videos\\/(\\d+)/,\r\n                        /^vimeo\\.com\\/ondemand\\/[^/]+\\/(\\d+)/,\r\n                        /^player\\.vimeo\\.com\\/video\\/(\\d+)/\r\n                    ],\r\n                    html: match => {\r\n                        const id = match[1];\r\n                        return ('<div style=\"position: relative; padding-bottom: 100%; height: 0; padding-bottom: 56.2493%;\">' +\r\n                            `<iframe src=\"https://player.vimeo.com/video/${id}\" ` +\r\n                            'style=\"position: absolute; width: 100%; height: 100%; top: 0; left: 0;\" ' +\r\n                            'frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen>' +\r\n                            '</iframe>' +\r\n                            '</div>');\r\n                    }\r\n                },\r\n                {\r\n                    name: 'instagram',\r\n                    url: /^instagram\\.com\\/p\\/(\\w+)/\r\n                },\r\n                {\r\n                    name: 'twitter',\r\n                    url: /^twitter\\.com/\r\n                },\r\n                {\r\n                    name: 'googleMaps',\r\n                    url: [\r\n                        /^google\\.com\\/maps/,\r\n                        /^goo\\.gl\\/maps/,\r\n                        /^maps\\.google\\.com/,\r\n                        /^maps\\.app\\.goo\\.gl/\r\n                    ]\r\n                },\r\n                {\r\n                    name: 'flickr',\r\n                    url: /^flickr\\.com/\r\n                },\r\n                {\r\n                    name: 'facebook',\r\n                    url: /^facebook\\.com/\r\n                }\r\n            ]\r\n        });\r\n        this.registry = new MediaRegistry(editor.locale, editor.config.get('mediaEmbed'));\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const schema = editor.model.schema;\r\n        const t = editor.t;\r\n        const conversion = editor.conversion;\r\n        const renderMediaPreview = editor.config.get('mediaEmbed.previewsInData');\r\n        const elementName = editor.config.get('mediaEmbed.elementName');\r\n        const registry = this.registry;\r\n        editor.commands.add('mediaEmbed', new MediaEmbedCommand(editor));\r\n        // Configure the schema.\r\n        schema.register('media', {\r\n            inheritAllFrom: '$blockObject',\r\n            allowAttributes: ['url']\r\n        });\r\n        // Model -> Data\r\n        conversion.for('dataDowncast').elementToStructure({\r\n            model: 'media',\r\n            view: (modelElement, { writer }) => {\r\n                const url = modelElement.getAttribute('url');\r\n                return createMediaFigureElement(writer, registry, url, {\r\n                    elementName,\r\n                    renderMediaPreview: !!url && renderMediaPreview\r\n                });\r\n            }\r\n        });\r\n        // Model -> Data (url -> data-oembed-url)\r\n        conversion.for('dataDowncast').add(modelToViewUrlAttributeConverter(registry, {\r\n            elementName,\r\n            renderMediaPreview\r\n        }));\r\n        // Model -> View (element)\r\n        conversion.for('editingDowncast').elementToStructure({\r\n            model: 'media',\r\n            view: (modelElement, { writer }) => {\r\n                const url = modelElement.getAttribute('url');\r\n                const figure = createMediaFigureElement(writer, registry, url, {\r\n                    elementName,\r\n                    renderForEditingView: true\r\n                });\r\n                return toMediaWidget(figure, writer, t('media widget'));\r\n            }\r\n        });\r\n        // Model -> View (url -> data-oembed-url)\r\n        conversion.for('editingDowncast').add(modelToViewUrlAttributeConverter(registry, {\r\n            elementName,\r\n            renderForEditingView: true\r\n        }));\r\n        // View -> Model (data-oembed-url -> url)\r\n        conversion.for('upcast')\r\n            // Upcast semantic media.\r\n            .elementToElement({\r\n            view: element => ['oembed', elementName].includes(element.name) && element.getAttribute('url') ?\r\n                { name: true } :\r\n                null,\r\n            model: (viewMedia, { writer }) => {\r\n                const url = viewMedia.getAttribute('url');\r\n                if (registry.hasMedia(url)) {\r\n                    return writer.createElement('media', { url });\r\n                }\r\n                return null;\r\n            }\r\n        })\r\n            // Upcast non-semantic media.\r\n            .elementToElement({\r\n            view: {\r\n                name: 'div',\r\n                attributes: {\r\n                    'data-oembed-url': true\r\n                }\r\n            },\r\n            model: (viewMedia, { writer }) => {\r\n                const url = viewMedia.getAttribute('data-oembed-url');\r\n                if (registry.hasMedia(url)) {\r\n                    return writer.createElement('media', { url });\r\n                }\r\n                return null;\r\n            }\r\n        })\r\n            // Consume `<figure class=\"media\">` elements, that were left after upcast.\r\n            .add(dispatcher => {\r\n            const converter = (evt, data, conversionApi) => {\r\n                if (!conversionApi.consumable.consume(data.viewItem, { name: true, classes: 'media' })) {\r\n                    return;\r\n                }\r\n                const { modelRange, modelCursor } = conversionApi.convertChildren(data.viewItem, data.modelCursor);\r\n                data.modelRange = modelRange;\r\n                data.modelCursor = modelCursor;\r\n                const modelElement = first(modelRange.getItems());\r\n                if (!modelElement) {\r\n                    // Revert consumed figure so other features can convert it.\r\n                    conversionApi.consumable.revert(data.viewItem, { name: true, classes: 'media' });\r\n                }\r\n            };\r\n            dispatcher.on('element:figure', converter);\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module media-embed/automediaembed\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { LiveRange, LivePosition } from 'ckeditor5/src/engine';\r\nimport { Clipboard } from 'ckeditor5/src/clipboard';\r\nimport { Delete } from 'ckeditor5/src/typing';\r\nimport { Undo } from 'ckeditor5/src/undo';\r\nimport { global } from 'ckeditor5/src/utils';\r\nimport MediaEmbedEditing from './mediaembedediting';\r\nimport { insertMedia } from './utils';\r\nconst URL_REGEXP = /^(?:http(s)?:\\/\\/)?[\\w-]+\\.[\\w-.~:/?#[\\]@!$&'()*+,;=%]+$/;\r\n/**\r\n * The auto-media embed plugin. It recognizes media links in the pasted content and embeds\r\n * them shortly after they are injected into the document.\r\n */\r\nexport default class AutoMediaEmbed extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [Clipboard, Delete, Undo];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'AutoMediaEmbed';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        this._timeoutId = null;\r\n        this._positionToInsert = null;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const modelDocument = editor.model.document;\r\n        // We need to listen on `Clipboard#inputTransformation` because we need to save positions of selection.\r\n        // After pasting, the content between those positions will be checked for a URL that could be transformed\r\n        // into media.\r\n        const clipboardPipeline = editor.plugins.get('ClipboardPipeline');\r\n        this.listenTo(clipboardPipeline, 'inputTransformation', () => {\r\n            const firstRange = modelDocument.selection.getFirstRange();\r\n            const leftLivePosition = LivePosition.fromPosition(firstRange.start);\r\n            leftLivePosition.stickiness = 'toPrevious';\r\n            const rightLivePosition = LivePosition.fromPosition(firstRange.end);\r\n            rightLivePosition.stickiness = 'toNext';\r\n            modelDocument.once('change:data', () => {\r\n                this._embedMediaBetweenPositions(leftLivePosition, rightLivePosition);\r\n                leftLivePosition.detach();\r\n                rightLivePosition.detach();\r\n            }, { priority: 'high' });\r\n        });\r\n        const undoCommand = editor.commands.get('undo');\r\n        undoCommand.on('execute', () => {\r\n            if (this._timeoutId) {\r\n                global.window.clearTimeout(this._timeoutId);\r\n                this._positionToInsert.detach();\r\n                this._timeoutId = null;\r\n                this._positionToInsert = null;\r\n            }\r\n        }, { priority: 'high' });\r\n    }\r\n    /**\r\n     * Analyzes the part of the document between provided positions in search for a URL representing media.\r\n     * When the URL is found, it is automatically converted into media.\r\n     *\r\n     * @param leftPosition Left position of the selection.\r\n     * @param rightPosition Right position of the selection.\r\n     */\r\n    _embedMediaBetweenPositions(leftPosition, rightPosition) {\r\n        const editor = this.editor;\r\n        const mediaRegistry = editor.plugins.get(MediaEmbedEditing).registry;\r\n        // TODO: Use marker instead of LiveRange & LivePositions.\r\n        const urlRange = new LiveRange(leftPosition, rightPosition);\r\n        const walker = urlRange.getWalker({ ignoreElementEnd: true });\r\n        let url = '';\r\n        for (const node of walker) {\r\n            if (node.item.is('$textProxy')) {\r\n                url += node.item.data;\r\n            }\r\n        }\r\n        url = url.trim();\r\n        // If the URL does not match to universal URL regexp, let's skip that.\r\n        if (!url.match(URL_REGEXP)) {\r\n            urlRange.detach();\r\n            return;\r\n        }\r\n        // If the URL represents a media, let's use it.\r\n        if (!mediaRegistry.hasMedia(url)) {\r\n            urlRange.detach();\r\n            return;\r\n        }\r\n        const mediaEmbedCommand = editor.commands.get('mediaEmbed');\r\n        // Do not anything if media element cannot be inserted at the current position (#47).\r\n        if (!mediaEmbedCommand.isEnabled) {\r\n            urlRange.detach();\r\n            return;\r\n        }\r\n        // Position won't be available in the `setTimeout` function so let's clone it.\r\n        this._positionToInsert = LivePosition.fromPosition(leftPosition);\r\n        // This action mustn't be executed if undo was called between pasting and auto-embedding.\r\n        this._timeoutId = global.window.setTimeout(() => {\r\n            editor.model.change(writer => {\r\n                this._timeoutId = null;\r\n                writer.remove(urlRange);\r\n                urlRange.detach();\r\n                let insertionPosition = null;\r\n                // Check if position where the media element should be inserted is still valid.\r\n                // Otherwise leave it as undefined to use document.selection - default behavior of model.insertContent().\r\n                if (this._positionToInsert.root.rootName !== '$graveyard') {\r\n                    insertionPosition = this._positionToInsert;\r\n                }\r\n                insertMedia(editor.model, url, insertionPosition, false);\r\n                this._positionToInsert.detach();\r\n                this._positionToInsert = null;\r\n            });\r\n            editor.plugins.get(Delete).requestUndoOnBackspace();\r\n        }, 100);\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./mediaform.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module media-embed/ui/mediaformview\r\n */\r\nimport { ButtonView, FocusCycler, LabeledFieldView, View, ViewCollection, createLabeledInputText, submitHandler } from 'ckeditor5/src/ui';\r\nimport { FocusTracker, KeystrokeHandler } from 'ckeditor5/src/utils';\r\nimport { icons } from 'ckeditor5/src/core';\r\n// See: #8833.\r\n// eslint-disable-next-line ckeditor5-rules/ckeditor-imports\r\nimport '@ckeditor/ckeditor5-ui/theme/components/responsive-form/responsiveform.css';\r\nimport '../../theme/mediaform.css';\r\n/**\r\n * The media form view controller class.\r\n *\r\n * See {@link module:media-embed/ui/mediaformview~MediaFormView}.\r\n */\r\nexport default class MediaFormView extends View {\r\n    /**\r\n     * @param validators Form validators used by {@link #isValid}.\r\n     * @param locale The localization services instance.\r\n     */\r\n    constructor(validators, locale) {\r\n        super(locale);\r\n        const t = locale.t;\r\n        this.focusTracker = new FocusTracker();\r\n        this.keystrokes = new KeystrokeHandler();\r\n        this.set('mediaURLInputValue', '');\r\n        this.urlInputView = this._createUrlInput();\r\n        this.saveButtonView = this._createButton(t('Save'), icons.check, 'ck-button-save');\r\n        this.saveButtonView.type = 'submit';\r\n        this.saveButtonView.bind('isEnabled').to(this, 'mediaURLInputValue', value => !!value);\r\n        this.cancelButtonView = this._createButton(t('Cancel'), icons.cancel, 'ck-button-cancel', 'cancel');\r\n        this._focusables = new ViewCollection();\r\n        this._focusCycler = new FocusCycler({\r\n            focusables: this._focusables,\r\n            focusTracker: this.focusTracker,\r\n            keystrokeHandler: this.keystrokes,\r\n            actions: {\r\n                // Navigate form fields backwards using the <kbd>Shift</kbd> + <kbd>Tab</kbd> keystroke.\r\n                focusPrevious: 'shift + tab',\r\n                // Navigate form fields forwards using the <kbd>Tab</kbd> key.\r\n                focusNext: 'tab'\r\n            }\r\n        });\r\n        this._validators = validators;\r\n        this.setTemplate({\r\n            tag: 'form',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-media-form',\r\n                    'ck-responsive-form'\r\n                ],\r\n                tabindex: '-1'\r\n            },\r\n            children: [\r\n                this.urlInputView,\r\n                this.saveButtonView,\r\n                this.cancelButtonView\r\n            ]\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        submitHandler({\r\n            view: this\r\n        });\r\n        const childViews = [\r\n            this.urlInputView,\r\n            this.saveButtonView,\r\n            this.cancelButtonView\r\n        ];\r\n        childViews.forEach(v => {\r\n            // Register the view as focusable.\r\n            this._focusables.add(v);\r\n            // Register the view in the focus tracker.\r\n            this.focusTracker.add(v.element);\r\n        });\r\n        // Start listening for the keystrokes coming from #element.\r\n        this.keystrokes.listenTo(this.element);\r\n        const stopPropagation = (data) => data.stopPropagation();\r\n        // Since the form is in the dropdown panel which is a child of the toolbar, the toolbar's\r\n        // keystroke handler would take over the key management in the URL input. We need to prevent\r\n        // this ASAP. Otherwise, the basic caret movement using the arrow keys will be impossible.\r\n        this.keystrokes.set('arrowright', stopPropagation);\r\n        this.keystrokes.set('arrowleft', stopPropagation);\r\n        this.keystrokes.set('arrowup', stopPropagation);\r\n        this.keystrokes.set('arrowdown', stopPropagation);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        this.focusTracker.destroy();\r\n        this.keystrokes.destroy();\r\n    }\r\n    /**\r\n     * Focuses the fist {@link #_focusables} in the form.\r\n     */\r\n    focus() {\r\n        this._focusCycler.focusFirst();\r\n    }\r\n    /**\r\n     * The native DOM `value` of the {@link #urlInputView} element.\r\n     *\r\n     * **Note**: Do not confuse it with the {@link module:ui/inputtext/inputtextview~InputTextView#value}\r\n     * which works one way only and may not represent the actual state of the component in the DOM.\r\n     */\r\n    get url() {\r\n        return this.urlInputView.fieldView.element.value.trim();\r\n    }\r\n    set url(url) {\r\n        this.urlInputView.fieldView.element.value = url.trim();\r\n    }\r\n    /**\r\n     * Validates the form and returns `false` when some fields are invalid.\r\n     */\r\n    isValid() {\r\n        this.resetFormStatus();\r\n        for (const validator of this._validators) {\r\n            const errorText = validator(this);\r\n            // One error per field is enough.\r\n            if (errorText) {\r\n                // Apply updated error.\r\n                this.urlInputView.errorText = errorText;\r\n                return false;\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n    /**\r\n     * Cleans up the supplementary error and information text of the {@link #urlInputView}\r\n     * bringing them back to the state when the form has been displayed for the first time.\r\n     *\r\n     * See {@link #isValid}.\r\n     */\r\n    resetFormStatus() {\r\n        this.urlInputView.errorText = null;\r\n        this.urlInputView.infoText = this._urlInputViewInfoDefault;\r\n    }\r\n    /**\r\n     * Creates a labeled input view.\r\n     *\r\n     * @returns Labeled input view instance.\r\n     */\r\n    _createUrlInput() {\r\n        const t = this.locale.t;\r\n        const labeledInput = new LabeledFieldView(this.locale, createLabeledInputText);\r\n        const inputField = labeledInput.fieldView;\r\n        this._urlInputViewInfoDefault = t('Paste the media URL in the input.');\r\n        this._urlInputViewInfoTip = t('Tip: Paste the URL into the content to embed faster.');\r\n        labeledInput.label = t('Media URL');\r\n        labeledInput.infoText = this._urlInputViewInfoDefault;\r\n        inputField.on('input', () => {\r\n            // Display the tip text only when there is some value. Otherwise fall back to the default info text.\r\n            labeledInput.infoText = inputField.element.value ? this._urlInputViewInfoTip : this._urlInputViewInfoDefault;\r\n            this.mediaURLInputValue = inputField.element.value.trim();\r\n        });\r\n        return labeledInput;\r\n    }\r\n    /**\r\n     * Creates a button view.\r\n     *\r\n     * @param label The button label.\r\n     * @param icon The button icon.\r\n     * @param className The additional button CSS class name.\r\n     * @param eventName An event name that the `ButtonView#execute` event will be delegated to.\r\n     * @returns The button view instance.\r\n     */\r\n    _createButton(label, icon, className, eventName) {\r\n        const button = new ButtonView(this.locale);\r\n        button.set({\r\n            label,\r\n            icon,\r\n            tooltip: true\r\n        });\r\n        button.extendTemplate({\r\n            attributes: {\r\n                class: className\r\n            }\r\n        });\r\n        if (eventName) {\r\n            button.delegate('execute').to(this, eventName);\r\n        }\r\n        return button;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module media-embed/mediaembedui\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { createDropdown, CssTransitionDisablerMixin } from 'ckeditor5/src/ui';\r\nimport MediaFormView from './ui/mediaformview';\r\nimport MediaEmbedEditing from './mediaembedediting';\r\nimport mediaIcon from '../theme/icons/media.svg';\r\n/**\r\n * The media embed UI plugin.\r\n */\r\nexport default class MediaEmbedUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [MediaEmbedEditing];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'MediaEmbedUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const command = editor.commands.get('mediaEmbed');\r\n        editor.ui.componentFactory.add('mediaEmbed', locale => {\r\n            const dropdown = createDropdown(locale);\r\n            this._setUpDropdown(dropdown, command);\r\n            return dropdown;\r\n        });\r\n    }\r\n    _setUpDropdown(dropdown, command) {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        const button = dropdown.buttonView;\r\n        const registry = editor.plugins.get(MediaEmbedEditing).registry;\r\n        dropdown.once('change:isOpen', () => {\r\n            const form = new (CssTransitionDisablerMixin(MediaFormView))(getFormValidators(editor.t, registry), editor.locale);\r\n            dropdown.panelView.children.add(form);\r\n            // Note: Use the low priority to make sure the following listener starts working after the\r\n            // default action of the drop-down is executed (i.e. the panel showed up). Otherwise, the\r\n            // invisible form/input cannot be focused/selected.\r\n            button.on('open', () => {\r\n                form.disableCssTransitions();\r\n                // Make sure that each time the panel shows up, the URL field remains in sync with the value of\r\n                // the command. If the user typed in the input, then canceled (`urlInputView#fieldView#value` stays\r\n                // unaltered) and re-opened it without changing the value of the media command (e.g. because they\r\n                // didn't change the selection), they would see the old value instead of the actual value of the\r\n                // command.\r\n                form.url = command.value || '';\r\n                form.urlInputView.fieldView.select();\r\n                form.enableCssTransitions();\r\n            }, { priority: 'low' });\r\n            dropdown.on('submit', () => {\r\n                if (form.isValid()) {\r\n                    editor.execute('mediaEmbed', form.url);\r\n                    editor.editing.view.focus();\r\n                }\r\n            });\r\n            dropdown.on('change:isOpen', () => form.resetFormStatus());\r\n            dropdown.on('cancel', () => {\r\n                editor.editing.view.focus();\r\n            });\r\n            form.delegate('submit', 'cancel').to(dropdown);\r\n            form.urlInputView.fieldView.bind('value').to(command, 'value');\r\n            // Form elements should be read-only when corresponding commands are disabled.\r\n            form.urlInputView.bind('isEnabled').to(command, 'isEnabled');\r\n        });\r\n        dropdown.bind('isEnabled').to(command);\r\n        button.set({\r\n            label: t('Insert media'),\r\n            icon: mediaIcon,\r\n            tooltip: true\r\n        });\r\n    }\r\n}\r\nfunction getFormValidators(t, registry) {\r\n    return [\r\n        form => {\r\n            if (!form.url.length) {\r\n                return t('The URL must not be empty.');\r\n            }\r\n        },\r\n        form => {\r\n            if (!registry.hasMedia(form.url)) {\r\n                return t('This media URL is not supported.');\r\n            }\r\n        }\r\n    ];\r\n}\r\n","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 20 20\\\"><path d=\\\"M18.68 3.03c.6 0 .59-.03.59.55v12.84c0 .59.01.56-.59.56H1.29c-.6 0-.59.03-.59-.56V3.58c0-.58-.01-.55.6-.55h17.38zM15.77 15V5H4.2v10h11.57zM2 4v1h1V4H2zm0 2v1h1V6H2zm0 2v1h1V8H2zm0 2v1h1v-1H2zm0 2v1h1v-1H2zm0 2v1h1v-1H2zM17 4v1h1V4h-1zm0 2v1h1V6h-1zm0 2v1h1V8h-1zm0 2v1h1v-1h-1zm0 2v1h1v-1h-1zm0 2v1h1v-1h-1zM7.5 7.177a.4.4 0 0 1 .593-.351l5.133 2.824a.4.4 0 0 1 0 .7l-5.133 2.824a.4.4 0 0 1-.593-.35V7.176v.001z\\\"/></svg>\";","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./mediaembed.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module mention/mentioncommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { CKEditorError, toMap } from 'ckeditor5/src/utils';\r\nimport { _addMentionAttributes } from './mentionediting';\r\n/**\r\n * The mention command.\r\n *\r\n * The command is registered by {@link module:mention/mentionediting~MentionEditing} as `'mention'`.\r\n *\r\n * To insert a mention into a range, execute the command and specify a mention object with a range to replace:\r\n *\r\n * ```ts\r\n * const focus = editor.model.document.selection.focus;\r\n *\r\n * // It will replace one character before the selection focus with the '#1234' text\r\n * // with the mention attribute filled with passed attributes.\r\n * editor.execute( 'mention', {\r\n * \tmarker: '#',\r\n * \tmention: {\r\n * \t\tid: '#1234',\r\n * \t\tname: 'Foo',\r\n * \t\ttitle: 'Big Foo'\r\n * \t},\r\n * \trange: editor.model.createRange( focus.getShiftedBy( -1 ), focus )\r\n * } );\r\n *\r\n * // It will replace one character before the selection focus with the 'The \"Big Foo\"' text\r\n * // with the mention attribute filled with passed attributes.\r\n * editor.execute( 'mention', {\r\n * \tmarker: '#',\r\n * \tmention: {\r\n * \t\tid: '#1234',\r\n * \t\tname: 'Foo',\r\n * \t\ttitle: 'Big Foo'\r\n * \t},\r\n * \ttext: 'The \"Big Foo\"',\r\n * \trange: editor.model.createRange( focus.getShiftedBy( -1 ), focus )\r\n * } );\r\n *\t```\r\n */\r\nexport default class MentionCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        // Since this command may pass range in execution parameters, it should be checked directly in execute block.\r\n        this._isEnabledBasedOnSelection = false;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const model = this.editor.model;\r\n        const doc = model.document;\r\n        this.isEnabled = model.schema.checkAttributeInSelection(doc.selection, 'mention');\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * @param options Options for the executed command.\r\n     * @param options.mention The mention object to insert. When a string is passed, it will be used to create a plain\r\n     * object with the name attribute that equals the passed string.\r\n     * @param options.marker The marker character (e.g. `'@'`).\r\n     * @param options.text The text of the inserted mention. Defaults to the full mention string composed from `marker` and\r\n     * `mention` string or `mention.id` if an object is passed.\r\n     * @param options.range The range to replace.\r\n     * Note that the replaced range might be shorter than the inserted text with the mention attribute.\r\n     * @fires execute\r\n     */\r\n    execute(options) {\r\n        const model = this.editor.model;\r\n        const document = model.document;\r\n        const selection = document.selection;\r\n        const mentionData = typeof options.mention == 'string' ? { id: options.mention } : options.mention;\r\n        const mentionID = mentionData.id;\r\n        const range = options.range || selection.getFirstRange();\r\n        // Don't execute command if range is in non-editable place.\r\n        if (!model.canEditAt(range)) {\r\n            return;\r\n        }\r\n        const mentionText = options.text || mentionID;\r\n        const mention = _addMentionAttributes({ _text: mentionText, id: mentionID }, mentionData);\r\n        if (options.marker.length != 1) {\r\n            /**\r\n             * The marker must be a single character.\r\n             *\r\n             * Correct markers: `'@'`, `'#'`.\r\n             *\r\n             * Incorrect markers: `'@@'`, `'[@'`.\r\n             *\r\n             * See {@link module:mention/mentionconfig~MentionConfig}.\r\n             *\r\n             * @error mentioncommand-incorrect-marker\r\n             */\r\n            throw new CKEditorError('mentioncommand-incorrect-marker', this);\r\n        }\r\n        if (mentionID.charAt(0) != options.marker) {\r\n            /**\r\n             * The feed item ID must start with the marker character.\r\n             *\r\n             * Correct mention feed setting:\r\n             *\r\n             * ```ts\r\n             * mentions: [\r\n             * \t{\r\n             * \t\tmarker: '@',\r\n             * \t\tfeed: [ '@Ann', '@Barney', ... ]\r\n             * \t}\r\n             * ]\r\n             * ```\r\n             *\r\n             * Incorrect mention feed setting:\r\n             *\r\n             * ```ts\r\n             * mentions: [\r\n             * \t{\r\n             * \t\tmarker: '@',\r\n             * \t\tfeed: [ 'Ann', 'Barney', ... ]\r\n             * \t}\r\n             * ]\r\n             * ```\r\n             *\r\n             * See {@link module:mention/mentionconfig~MentionConfig}.\r\n             *\r\n             * @error mentioncommand-incorrect-id\r\n             */\r\n            throw new CKEditorError('mentioncommand-incorrect-id', this);\r\n        }\r\n        model.change(writer => {\r\n            const currentAttributes = toMap(selection.getAttributes());\r\n            const attributesWithMention = new Map(currentAttributes.entries());\r\n            attributesWithMention.set('mention', mention);\r\n            // Replace a range with the text with a mention.\r\n            model.insertContent(writer.createText(mentionText, attributesWithMention), range);\r\n            model.insertContent(writer.createText(' ', currentAttributes), range.start.getShiftedBy(mentionText.length));\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module mention/mentionediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { uid } from 'ckeditor5/src/utils';\r\nimport MentionCommand from './mentioncommand';\r\n/**\r\n * The mention editing feature.\r\n *\r\n * It introduces the {@link module:mention/mentioncommand~MentionCommand command} and the `mention`\r\n * attribute in the {@link module:engine/model/model~Model model} which renders in the {@link module:engine/view/view view}\r\n * as a `<span class=\"mention\" data-mention=\"@mention\">`.\r\n */\r\nexport default class MentionEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'MentionEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const doc = model.document;\r\n        // Allow the mention attribute on all text nodes.\r\n        model.schema.extend('$text', { allowAttributes: 'mention' });\r\n        // Upcast conversion.\r\n        editor.conversion.for('upcast').elementToAttribute({\r\n            view: {\r\n                name: 'span',\r\n                key: 'data-mention',\r\n                classes: 'mention'\r\n            },\r\n            model: {\r\n                key: 'mention',\r\n                value: (viewElement) => _toMentionAttribute(viewElement)\r\n            }\r\n        });\r\n        // Downcast conversion.\r\n        editor.conversion.for('downcast').attributeToElement({\r\n            model: 'mention',\r\n            view: createViewMentionElement\r\n        });\r\n        editor.conversion.for('downcast').add(preventPartialMentionDowncast);\r\n        doc.registerPostFixer(writer => removePartialMentionPostFixer(writer, doc, model.schema));\r\n        doc.registerPostFixer(writer => extendAttributeOnMentionPostFixer(writer, doc));\r\n        doc.registerPostFixer(writer => selectionMentionAttributePostFixer(writer, doc));\r\n        editor.commands.add('mention', new MentionCommand(editor));\r\n    }\r\n}\r\n/**\r\n * @internal\r\n */\r\nexport function _addMentionAttributes(baseMentionData, data) {\r\n    return Object.assign({ uid: uid() }, baseMentionData, data || {});\r\n}\r\n/**\r\n * Creates a mention attribute value from the provided view element and optional data.\r\n *\r\n * This function is exposed as\r\n * {@link module:mention/mention~Mention#toMentionAttribute `editor.plugins.get( 'Mention' ).toMentionAttribute()`}.\r\n *\r\n * @internal\r\n */\r\nexport function _toMentionAttribute(viewElementOrMention, data) {\r\n    const dataMention = viewElementOrMention.getAttribute('data-mention');\r\n    const textNode = viewElementOrMention.getChild(0);\r\n    // Do not convert empty mentions.\r\n    if (!textNode) {\r\n        return;\r\n    }\r\n    const baseMentionData = {\r\n        id: dataMention,\r\n        _text: textNode.data\r\n    };\r\n    return _addMentionAttributes(baseMentionData, data);\r\n}\r\n/**\r\n * A converter that blocks partial mention from being converted.\r\n *\r\n * This converter is registered with 'highest' priority in order to consume mention attribute before it is converted by\r\n * any other converters. This converter only consumes partial mention - those whose `_text` attribute is not equal to text with mention\r\n * attribute. This may happen when copying part of mention text.\r\n */\r\nfunction preventPartialMentionDowncast(dispatcher) {\r\n    dispatcher.on('attribute:mention', (evt, data, conversionApi) => {\r\n        const mention = data.attributeNewValue;\r\n        if (!data.item.is('$textProxy') || !mention) {\r\n            return;\r\n        }\r\n        const start = data.range.start;\r\n        const textNode = start.textNode || start.nodeAfter;\r\n        if (textNode.data != mention._text) {\r\n            // Consume item to prevent partial mention conversion.\r\n            conversionApi.consumable.consume(data.item, evt.name);\r\n        }\r\n    }, { priority: 'highest' });\r\n}\r\n/**\r\n * Creates a mention element from the mention data.\r\n */\r\nfunction createViewMentionElement(mention, { writer }) {\r\n    if (!mention) {\r\n        return;\r\n    }\r\n    const attributes = {\r\n        class: 'mention',\r\n        'data-mention': mention.id\r\n    };\r\n    const options = {\r\n        id: mention.uid,\r\n        priority: 20\r\n    };\r\n    return writer.createAttributeElement('span', attributes, options);\r\n}\r\n/**\r\n * Model post-fixer that disallows typing with selection when the selection is placed after the text node with the mention attribute or\r\n * before a text node with mention attribute.\r\n */\r\nfunction selectionMentionAttributePostFixer(writer, doc) {\r\n    const selection = doc.selection;\r\n    const focus = selection.focus;\r\n    if (selection.isCollapsed && selection.hasAttribute('mention') && shouldNotTypeWithMentionAt(focus)) {\r\n        writer.removeSelectionAttribute('mention');\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\n/**\r\n * Helper function to detect if mention attribute should be removed from selection.\r\n * This check makes only sense if the selection has mention attribute.\r\n *\r\n * The mention attribute should be removed from a selection when selection focus is placed:\r\n * a) after a text node\r\n * b) the position is at parents start - the selection will set attributes from node after.\r\n */\r\nfunction shouldNotTypeWithMentionAt(position) {\r\n    const isAtStart = position.isAtStart;\r\n    const isAfterAMention = position.nodeBefore && position.nodeBefore.is('$text');\r\n    return isAfterAMention || isAtStart;\r\n}\r\n/**\r\n * Model post-fixer that removes the mention attribute from the modified text node.\r\n */\r\nfunction removePartialMentionPostFixer(writer, doc, schema) {\r\n    const changes = doc.differ.getChanges();\r\n    let wasChanged = false;\r\n    for (const change of changes) {\r\n        if (change.type == 'attribute') {\r\n            continue;\r\n        }\r\n        // Checks the text node on the current position.\r\n        const position = change.position;\r\n        if (change.name == '$text') {\r\n            const nodeAfterInsertedTextNode = position.textNode && position.textNode.nextSibling;\r\n            // Checks the text node where the change occurred.\r\n            wasChanged = checkAndFix(position.textNode, writer) || wasChanged;\r\n            // Occurs on paste inside a text node with mention.\r\n            wasChanged = checkAndFix(nodeAfterInsertedTextNode, writer) || wasChanged;\r\n            wasChanged = checkAndFix(position.nodeBefore, writer) || wasChanged;\r\n            wasChanged = checkAndFix(position.nodeAfter, writer) || wasChanged;\r\n        }\r\n        // Checks text nodes in inserted elements (might occur when splitting a paragraph or pasting content inside text with mention).\r\n        if (change.name != '$text' && change.type == 'insert') {\r\n            const insertedNode = position.nodeAfter;\r\n            for (const item of writer.createRangeIn(insertedNode).getItems()) {\r\n                wasChanged = checkAndFix(item, writer) || wasChanged;\r\n            }\r\n        }\r\n        // Inserted inline elements might break mention.\r\n        if (change.type == 'insert' && schema.isInline(change.name)) {\r\n            const nodeAfterInserted = position.nodeAfter && position.nodeAfter.nextSibling;\r\n            wasChanged = checkAndFix(position.nodeBefore, writer) || wasChanged;\r\n            wasChanged = checkAndFix(nodeAfterInserted, writer) || wasChanged;\r\n        }\r\n    }\r\n    return wasChanged;\r\n}\r\n/**\r\n * This post-fixer will extend the attribute applied on the part of the mention so the whole text node of the mention will have\r\n * the added attribute.\r\n */\r\nfunction extendAttributeOnMentionPostFixer(writer, doc) {\r\n    const changes = doc.differ.getChanges();\r\n    let wasChanged = false;\r\n    for (const change of changes) {\r\n        if (change.type === 'attribute' && change.attributeKey != 'mention') {\r\n            // Checks the node on the left side of the range...\r\n            const nodeBefore = change.range.start.nodeBefore;\r\n            // ... and on the right side of the range.\r\n            const nodeAfter = change.range.end.nodeAfter;\r\n            for (const node of [nodeBefore, nodeAfter]) {\r\n                if (isBrokenMentionNode(node) && node.getAttribute(change.attributeKey) != change.attributeNewValue) {\r\n                    writer.setAttribute(change.attributeKey, change.attributeNewValue, node);\r\n                    wasChanged = true;\r\n                }\r\n            }\r\n        }\r\n    }\r\n    return wasChanged;\r\n}\r\n/**\r\n * Checks if a node has a correct mention attribute if present.\r\n * Returns `true` if the node is text and has a mention attribute whose text does not match the expected mention text.\r\n */\r\nfunction isBrokenMentionNode(node) {\r\n    if (!node || !(node.is('$text') || node.is('$textProxy')) || !node.hasAttribute('mention')) {\r\n        return false;\r\n    }\r\n    const text = node.data;\r\n    const mention = node.getAttribute('mention');\r\n    const expectedText = mention._text;\r\n    return text != expectedText;\r\n}\r\n/**\r\n * Fixes a mention on a text node if it needs a fix.\r\n */\r\nfunction checkAndFix(textNode, writer) {\r\n    if (isBrokenMentionNode(textNode)) {\r\n        writer.removeAttribute('mention', textNode);\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./mentionui.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module mention/ui/mentionsview\r\n */\r\nimport { ListView } from 'ckeditor5/src/ui';\r\nimport { Rect } from 'ckeditor5/src/utils';\r\nimport '../../theme/mentionui.css';\r\n/**\r\n * The mention ui view.\r\n */\r\nexport default class MentionsView extends ListView {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        this.extendTemplate({\r\n            attributes: {\r\n                class: [\r\n                    'ck-mentions'\r\n                ],\r\n                tabindex: '-1'\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * {@link #select Selects} the first item.\r\n     */\r\n    selectFirst() {\r\n        this.select(0);\r\n    }\r\n    /**\r\n     * Selects next item to the currently {@link #select selected}.\r\n     *\r\n     * If the last item is already selected, it will select the first item.\r\n     */\r\n    selectNext() {\r\n        const item = this.selected;\r\n        const index = this.items.getIndex(item);\r\n        this.select(index + 1);\r\n    }\r\n    /**\r\n     * Selects previous item to the currently {@link #select selected}.\r\n     *\r\n     * If the first item is already selected, it will select the last item.\r\n     */\r\n    selectPrevious() {\r\n        const item = this.selected;\r\n        const index = this.items.getIndex(item);\r\n        this.select(index - 1);\r\n    }\r\n    /**\r\n     * Marks item at a given index as selected.\r\n     *\r\n     * Handles selection cycling when passed index is out of bounds:\r\n     * - if the index is lower than 0, it will select the last item,\r\n     * - if the index is higher than the last item index, it will select the first item.\r\n     *\r\n     * @param index Index of an item to be marked as selected.\r\n     */\r\n    select(index) {\r\n        let indexToGet = 0;\r\n        if (index > 0 && index < this.items.length) {\r\n            indexToGet = index;\r\n        }\r\n        else if (index < 0) {\r\n            indexToGet = this.items.length - 1;\r\n        }\r\n        const item = this.items.get(indexToGet);\r\n        // Return early if item is already selected.\r\n        if (this.selected === item) {\r\n            return;\r\n        }\r\n        // Remove highlight of previously selected item.\r\n        if (this.selected) {\r\n            this.selected.removeHighlight();\r\n        }\r\n        item.highlight();\r\n        this.selected = item;\r\n        // Scroll the mentions view to the selected element.\r\n        if (!this._isItemVisibleInScrolledArea(item)) {\r\n            this.element.scrollTop = item.element.offsetTop;\r\n        }\r\n    }\r\n    /**\r\n     * Triggers the `execute` event on the {@link #select selected} item.\r\n     */\r\n    executeSelected() {\r\n        this.selected.fire('execute');\r\n    }\r\n    /**\r\n     * Checks if an item is visible in the scrollable area.\r\n     *\r\n     * The item is considered visible when:\r\n     * - its top boundary is inside the scrollable rect\r\n     * - its bottom boundary is inside the scrollable rect (the whole item must be visible)\r\n     */\r\n    _isItemVisibleInScrolledArea(item) {\r\n        return new Rect(this.element).contains(new Rect(item.element));\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module mention/ui/domwrapperview\r\n */\r\nimport { View } from 'ckeditor5/src/ui';\r\n/**\r\n * This class wraps DOM element as a CKEditor5 UI View.\r\n *\r\n * It allows to render any DOM element and use it in mentions list.\r\n */\r\nexport default class DomWrapperView extends View {\r\n    /**\r\n     * Creates an instance of {@link module:mention/ui/domwrapperview~DomWrapperView} class.\r\n     *\r\n     * Also see {@link #render}.\r\n     */\r\n    constructor(locale, domElement) {\r\n        super(locale);\r\n        // Disable template rendering on this view.\r\n        this.template = undefined;\r\n        this.domElement = domElement;\r\n        // Render dom wrapper as a button.\r\n        this.domElement.classList.add('ck-button');\r\n        this.set('isOn', false);\r\n        // Handle isOn state as in buttons.\r\n        this.on('change:isOn', (evt, name, isOn) => {\r\n            if (isOn) {\r\n                this.domElement.classList.add('ck-on');\r\n                this.domElement.classList.remove('ck-off');\r\n            }\r\n            else {\r\n                this.domElement.classList.add('ck-off');\r\n                this.domElement.classList.remove('ck-on');\r\n            }\r\n        });\r\n        // Pass click event as execute event.\r\n        this.listenTo(this.domElement, 'click', () => {\r\n            this.fire('execute');\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        this.element = this.domElement;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module mention/ui/mentionlistitemview\r\n */\r\nimport { ListItemView } from 'ckeditor5/src/ui';\r\nexport default class MentionListItemView extends ListItemView {\r\n    highlight() {\r\n        const child = this.children.first;\r\n        child.isOn = true;\r\n    }\r\n    removeHighlight() {\r\n        const child = this.children.first;\r\n        child.isOn = false;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module mention/mentionui\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { ButtonView, ContextualBalloon, clickOutsideHandler } from 'ckeditor5/src/ui';\r\nimport { CKEditorError, Collection, Rect, env, keyCodes, logWarning } from 'ckeditor5/src/utils';\r\nimport { TextWatcher } from 'ckeditor5/src/typing';\r\nimport { debounce } from 'lodash-es';\r\nimport MentionsView from './ui/mentionsview';\r\nimport DomWrapperView from './ui/domwrapperview';\r\nimport MentionListItemView from './ui/mentionlistitemview';\r\nconst VERTICAL_SPACING = 3;\r\n// The key codes that mention UI handles when it is open (without commit keys).\r\nconst defaultHandledKeyCodes = [\r\n    keyCodes.arrowup,\r\n    keyCodes.arrowdown,\r\n    keyCodes.esc\r\n];\r\n// Dropdown commit key codes.\r\nconst defaultCommitKeyCodes = [\r\n    keyCodes.enter,\r\n    keyCodes.tab\r\n];\r\n/**\r\n * The mention UI feature.\r\n */\r\nexport default class MentionUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'MentionUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ContextualBalloon];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        this._items = new Collection();\r\n        this._mentionsView = this._createMentionView();\r\n        this._mentionsConfigurations = new Map();\r\n        this._requestFeedDebounced = debounce(this._requestFeed, 100);\r\n        editor.config.define('mention', { feeds: [] });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const commitKeys = editor.config.get('mention.commitKeys') || defaultCommitKeyCodes;\r\n        const handledKeyCodes = defaultHandledKeyCodes.concat(commitKeys);\r\n        this._balloon = editor.plugins.get(ContextualBalloon);\r\n        // Key listener that handles navigation in mention view.\r\n        editor.editing.view.document.on('keydown', (evt, data) => {\r\n            if (isHandledKey(data.keyCode) && this._isUIVisible) {\r\n                data.preventDefault();\r\n                evt.stop(); // Required for Enter key overriding.\r\n                if (data.keyCode == keyCodes.arrowdown) {\r\n                    this._mentionsView.selectNext();\r\n                }\r\n                if (data.keyCode == keyCodes.arrowup) {\r\n                    this._mentionsView.selectPrevious();\r\n                }\r\n                if (commitKeys.includes(data.keyCode)) {\r\n                    this._mentionsView.executeSelected();\r\n                }\r\n                if (data.keyCode == keyCodes.esc) {\r\n                    this._hideUIAndRemoveMarker();\r\n                }\r\n            }\r\n        }, { priority: 'highest' }); // Required to override the Enter key.\r\n        // Close the dropdown upon clicking outside of the plugin UI.\r\n        clickOutsideHandler({\r\n            emitter: this._mentionsView,\r\n            activator: () => this._isUIVisible,\r\n            contextElements: () => [this._balloon.view.element],\r\n            callback: () => this._hideUIAndRemoveMarker()\r\n        });\r\n        const feeds = editor.config.get('mention.feeds');\r\n        for (const mentionDescription of feeds) {\r\n            const { feed, marker, dropdownLimit } = mentionDescription;\r\n            if (!isValidMentionMarker(marker)) {\r\n                /**\r\n                 * The marker must be a single character.\r\n                 *\r\n                 * Correct markers: `'@'`, `'#'`.\r\n                 *\r\n                 * Incorrect markers: `'$$'`, `'[@'`.\r\n                 *\r\n                 * See {@link module:mention/mentionconfig~MentionConfig}.\r\n                 *\r\n                 * @error mentionconfig-incorrect-marker\r\n                 * @param marker Configured marker\r\n                 */\r\n                throw new CKEditorError('mentionconfig-incorrect-marker', null, { marker });\r\n            }\r\n            const feedCallback = typeof feed == 'function' ? feed.bind(this.editor) : createFeedCallback(feed);\r\n            const itemRenderer = mentionDescription.itemRenderer;\r\n            const definition = { marker, feedCallback, itemRenderer, dropdownLimit };\r\n            this._mentionsConfigurations.set(marker, definition);\r\n        }\r\n        this._setupTextWatcher(feeds);\r\n        this.listenTo(editor, 'change:isReadOnly', () => {\r\n            this._hideUIAndRemoveMarker();\r\n        });\r\n        this.on('requestFeed:response', (evt, data) => this._handleFeedResponse(data));\r\n        this.on('requestFeed:error', () => this._hideUIAndRemoveMarker());\r\n        /**\r\n         * Checks if a given key code is handled by the mention UI.\r\n         */\r\n        function isHandledKey(keyCode) {\r\n            return handledKeyCodes.includes(keyCode);\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        // Destroy created UI components as they are not automatically destroyed (see ckeditor5#1341).\r\n        this._mentionsView.destroy();\r\n    }\r\n    /**\r\n     * Returns true when {@link #_mentionsView} is in the {@link module:ui/panel/balloon/contextualballoon~ContextualBalloon} and it is\r\n     * currently visible.\r\n     */\r\n    get _isUIVisible() {\r\n        return this._balloon.visibleView === this._mentionsView;\r\n    }\r\n    /**\r\n     * Creates the {@link #_mentionsView}.\r\n     */\r\n    _createMentionView() {\r\n        const locale = this.editor.locale;\r\n        const mentionsView = new MentionsView(locale);\r\n        mentionsView.items.bindTo(this._items).using(data => {\r\n            const { item, marker } = data;\r\n            const { dropdownLimit: markerDropdownLimit } = this._mentionsConfigurations.get(marker);\r\n            // Set to 10 by default for backwards compatibility. See: #10479\r\n            const dropdownLimit = markerDropdownLimit || this.editor.config.get('mention.dropdownLimit') || 10;\r\n            if (mentionsView.items.length >= dropdownLimit) {\r\n                return null;\r\n            }\r\n            const listItemView = new MentionListItemView(locale);\r\n            const view = this._renderItem(item, marker);\r\n            view.delegate('execute').to(listItemView);\r\n            listItemView.children.add(view);\r\n            listItemView.item = item;\r\n            listItemView.marker = marker;\r\n            listItemView.on('execute', () => {\r\n                mentionsView.fire('execute', {\r\n                    item,\r\n                    marker\r\n                });\r\n            });\r\n            return listItemView;\r\n        });\r\n        mentionsView.on('execute', (evt, data) => {\r\n            const editor = this.editor;\r\n            const model = editor.model;\r\n            const item = data.item;\r\n            const marker = data.marker;\r\n            const mentionMarker = editor.model.markers.get('mention');\r\n            // Create a range on matched text.\r\n            const end = model.createPositionAt(model.document.selection.focus);\r\n            const start = model.createPositionAt(mentionMarker.getStart());\r\n            const range = model.createRange(start, end);\r\n            this._hideUIAndRemoveMarker();\r\n            editor.execute('mention', {\r\n                mention: item,\r\n                text: item.text,\r\n                marker,\r\n                range\r\n            });\r\n            editor.editing.view.focus();\r\n        });\r\n        return mentionsView;\r\n    }\r\n    /**\r\n     * Returns item renderer for the marker.\r\n     */\r\n    _getItemRenderer(marker) {\r\n        const { itemRenderer } = this._mentionsConfigurations.get(marker);\r\n        return itemRenderer;\r\n    }\r\n    /**\r\n     * Requests a feed from a configured callbacks.\r\n     */\r\n    _requestFeed(marker, feedText) {\r\n        // @if CK_DEBUG_MENTION // console.log( '%c[Feed]%c Requesting for', 'color: blue', 'color: black', `\"${ feedText }\"` );\r\n        // Store the last requested feed - it is used to discard any out-of order requests.\r\n        this._lastRequested = feedText;\r\n        const { feedCallback } = this._mentionsConfigurations.get(marker);\r\n        const feedResponse = feedCallback(feedText);\r\n        const isAsynchronous = feedResponse instanceof Promise;\r\n        // For synchronous feeds (e.g. callbacks, arrays) fire the response event immediately.\r\n        if (!isAsynchronous) {\r\n            this.fire('requestFeed:response', { feed: feedResponse, marker, feedText });\r\n            return;\r\n        }\r\n        // Handle the asynchronous responses.\r\n        feedResponse\r\n            .then(response => {\r\n            // Check the feed text of this response with the last requested one so either:\r\n            if (this._lastRequested == feedText) {\r\n                // It is the same and fire the response event.\r\n                this.fire('requestFeed:response', { feed: response, marker, feedText });\r\n            }\r\n            else {\r\n                // It is different - most probably out-of-order one, so fire the discarded event.\r\n                this.fire('requestFeed:discarded', { feed: response, marker, feedText });\r\n            }\r\n        })\r\n            .catch(error => {\r\n            this.fire('requestFeed:error', { error });\r\n            /**\r\n             * The callback used for obtaining mention autocomplete feed thrown and error and the mention UI was hidden or\r\n             * not displayed at all.\r\n             *\r\n             * @error mention-feed-callback-error\r\n             */\r\n            logWarning('mention-feed-callback-error', { marker });\r\n        });\r\n    }\r\n    /**\r\n     * Registers a text watcher for the marker.\r\n     */\r\n    _setupTextWatcher(feeds) {\r\n        const editor = this.editor;\r\n        const feedsWithPattern = feeds.map(feed => ({\r\n            ...feed,\r\n            pattern: createRegExp(feed.marker, feed.minimumCharacters || 0)\r\n        }));\r\n        const watcher = new TextWatcher(editor.model, createTestCallback(feedsWithPattern));\r\n        watcher.on('matched', (evt, data) => {\r\n            const markerDefinition = getLastValidMarkerInText(feedsWithPattern, data.text);\r\n            const selection = editor.model.document.selection;\r\n            const focus = selection.focus;\r\n            const markerPosition = editor.model.createPositionAt(focus.parent, markerDefinition.position);\r\n            if (isPositionInExistingMention(focus) || isMarkerInExistingMention(markerPosition)) {\r\n                this._hideUIAndRemoveMarker();\r\n                return;\r\n            }\r\n            const feedText = requestFeedText(markerDefinition, data.text);\r\n            const matchedTextLength = markerDefinition.marker.length + feedText.length;\r\n            // Create a marker range.\r\n            const start = focus.getShiftedBy(-matchedTextLength);\r\n            const end = focus.getShiftedBy(-feedText.length);\r\n            const markerRange = editor.model.createRange(start, end);\r\n            // @if CK_DEBUG_MENTION // console.group( '%c[TextWatcher]%c matched', 'color: red', 'color: black', `\"${ feedText }\"` );\r\n            // @if CK_DEBUG_MENTION // console.log( 'data#text', `\"${ data.text }\"` );\r\n            // @if CK_DEBUG_MENTION // console.log( 'data#range', data.range.start.path, data.range.end.path );\r\n            // @if CK_DEBUG_MENTION // console.log( 'marker definition', markerDefinition );\r\n            // @if CK_DEBUG_MENTION // console.log( 'marker range', markerRange.start.path, markerRange.end.path );\r\n            if (checkIfStillInCompletionMode(editor)) {\r\n                const mentionMarker = editor.model.markers.get('mention');\r\n                // Update the marker - user might've moved the selection to other mention trigger.\r\n                editor.model.change(writer => {\r\n                    // @if CK_DEBUG_MENTION // console.log( '%c[Editing]%c Updating the marker.', 'color: purple', 'color: black' );\r\n                    writer.updateMarker(mentionMarker, { range: markerRange });\r\n                });\r\n            }\r\n            else {\r\n                editor.model.change(writer => {\r\n                    // @if CK_DEBUG_MENTION // console.log( '%c[Editing]%c Adding the marker.', 'color: purple', 'color: black' );\r\n                    writer.addMarker('mention', { range: markerRange, usingOperation: false, affectsData: false });\r\n                });\r\n            }\r\n            this._requestFeedDebounced(markerDefinition.marker, feedText);\r\n            // @if CK_DEBUG_MENTION // console.groupEnd();\r\n        });\r\n        watcher.on('unmatched', () => {\r\n            this._hideUIAndRemoveMarker();\r\n        });\r\n        const mentionCommand = editor.commands.get('mention');\r\n        watcher.bind('isEnabled').to(mentionCommand);\r\n        return watcher;\r\n    }\r\n    /**\r\n     * Handles the feed response event data.\r\n     */\r\n    _handleFeedResponse(data) {\r\n        const { feed, marker } = data;\r\n        // eslint-disable-next-line max-len\r\n        // @if CK_DEBUG_MENTION // console.log( `%c[Feed]%c Response for \"${ data.feedText }\" (${ feed.length })`, 'color: blue', 'color: black', feed );\r\n        // If the marker is not in the document happens when the selection had changed and the 'mention' marker was removed.\r\n        if (!checkIfStillInCompletionMode(this.editor)) {\r\n            return;\r\n        }\r\n        // Reset the view.\r\n        this._items.clear();\r\n        for (const feedItem of feed) {\r\n            const item = typeof feedItem != 'object' ? { id: feedItem, text: feedItem } : feedItem;\r\n            this._items.add({ item, marker });\r\n        }\r\n        const mentionMarker = this.editor.model.markers.get('mention');\r\n        if (this._items.length) {\r\n            this._showOrUpdateUI(mentionMarker);\r\n        }\r\n        else {\r\n            // Do not show empty mention UI.\r\n            this._hideUIAndRemoveMarker();\r\n        }\r\n    }\r\n    /**\r\n     * Shows the mentions balloon. If the panel is already visible, it will reposition it.\r\n     */\r\n    _showOrUpdateUI(markerMarker) {\r\n        if (this._isUIVisible) {\r\n            // @if CK_DEBUG_MENTION // console.log( '%c[UI]%c Updating position.', 'color: green', 'color: black' );\r\n            // Update balloon position as the mention list view may change its size.\r\n            this._balloon.updatePosition(this._getBalloonPanelPositionData(markerMarker, this._mentionsView.position));\r\n        }\r\n        else {\r\n            // @if CK_DEBUG_MENTION // console.log( '%c[UI]%c Showing the UI.', 'color: green', 'color: black' );\r\n            this._balloon.add({\r\n                view: this._mentionsView,\r\n                position: this._getBalloonPanelPositionData(markerMarker, this._mentionsView.position),\r\n                singleViewMode: true\r\n            });\r\n        }\r\n        this._mentionsView.position = this._balloon.view.position;\r\n        this._mentionsView.selectFirst();\r\n    }\r\n    /**\r\n     * Hides the mentions balloon and removes the 'mention' marker from the markers collection.\r\n     */\r\n    _hideUIAndRemoveMarker() {\r\n        // Remove the mention view from balloon before removing marker - it is used by balloon position target().\r\n        if (this._balloon.hasView(this._mentionsView)) {\r\n            // @if CK_DEBUG_MENTION // console.log( '%c[UI]%c Hiding the UI.', 'color: green', 'color: black' );\r\n            this._balloon.remove(this._mentionsView);\r\n        }\r\n        if (checkIfStillInCompletionMode(this.editor)) {\r\n            // @if CK_DEBUG_MENTION // console.log( '%c[Editing]%c Removing marker.', 'color: purple', 'color: black' );\r\n            this.editor.model.change(writer => writer.removeMarker('mention'));\r\n        }\r\n        // Make the last matched position on panel view undefined so the #_getBalloonPanelPositionData() method will return all positions\r\n        // on the next call.\r\n        this._mentionsView.position = undefined;\r\n    }\r\n    /**\r\n     * Renders a single item in the autocomplete list.\r\n     */\r\n    _renderItem(item, marker) {\r\n        const editor = this.editor;\r\n        let view;\r\n        let label = item.id;\r\n        const renderer = this._getItemRenderer(marker);\r\n        if (renderer) {\r\n            const renderResult = renderer(item);\r\n            if (typeof renderResult != 'string') {\r\n                view = new DomWrapperView(editor.locale, renderResult);\r\n            }\r\n            else {\r\n                label = renderResult;\r\n            }\r\n        }\r\n        if (!view) {\r\n            const buttonView = new ButtonView(editor.locale);\r\n            buttonView.label = label;\r\n            buttonView.withText = true;\r\n            view = buttonView;\r\n        }\r\n        return view;\r\n    }\r\n    /**\r\n     * Creates a position options object used to position the balloon panel.\r\n     *\r\n     * @param mentionMarker\r\n     * @param preferredPosition The name of the last matched position name.\r\n     */\r\n    _getBalloonPanelPositionData(mentionMarker, preferredPosition) {\r\n        const editor = this.editor;\r\n        const editing = editor.editing;\r\n        const domConverter = editing.view.domConverter;\r\n        const mapper = editing.mapper;\r\n        const uiLanguageDirection = editor.locale.uiLanguageDirection;\r\n        return {\r\n            target: () => {\r\n                let modelRange = mentionMarker.getRange();\r\n                // Target the UI to the model selection range - the marker has been removed so probably the UI will not be shown anyway.\r\n                // The logic is used by ContextualBalloon to display another panel in the same place.\r\n                if (modelRange.start.root.rootName == '$graveyard') {\r\n                    modelRange = editor.model.document.selection.getFirstRange();\r\n                }\r\n                const viewRange = mapper.toViewRange(modelRange);\r\n                const rangeRects = Rect.getDomRangeRects(domConverter.viewRangeToDom(viewRange));\r\n                return rangeRects.pop();\r\n            },\r\n            limiter: () => {\r\n                const view = this.editor.editing.view;\r\n                const viewDocument = view.document;\r\n                const editableElement = viewDocument.selection.editableElement;\r\n                if (editableElement) {\r\n                    return view.domConverter.mapViewToDom(editableElement.root);\r\n                }\r\n                return null;\r\n            },\r\n            positions: getBalloonPanelPositions(preferredPosition, uiLanguageDirection)\r\n        };\r\n    }\r\n}\r\n/**\r\n * Returns the balloon positions data callbacks.\r\n */\r\nfunction getBalloonPanelPositions(preferredPosition, uiLanguageDirection) {\r\n    const positions = {\r\n        // Positions the panel to the southeast of the caret rectangle.\r\n        'caret_se': (targetRect) => {\r\n            return {\r\n                top: targetRect.bottom + VERTICAL_SPACING,\r\n                left: targetRect.right,\r\n                name: 'caret_se',\r\n                config: {\r\n                    withArrow: false\r\n                }\r\n            };\r\n        },\r\n        // Positions the panel to the northeast of the caret rectangle.\r\n        'caret_ne': (targetRect, balloonRect) => {\r\n            return {\r\n                top: targetRect.top - balloonRect.height - VERTICAL_SPACING,\r\n                left: targetRect.right,\r\n                name: 'caret_ne',\r\n                config: {\r\n                    withArrow: false\r\n                }\r\n            };\r\n        },\r\n        // Positions the panel to the southwest of the caret rectangle.\r\n        'caret_sw': (targetRect, balloonRect) => {\r\n            return {\r\n                top: targetRect.bottom + VERTICAL_SPACING,\r\n                left: targetRect.right - balloonRect.width,\r\n                name: 'caret_sw',\r\n                config: {\r\n                    withArrow: false\r\n                }\r\n            };\r\n        },\r\n        // Positions the panel to the northwest of the caret rect.\r\n        'caret_nw': (targetRect, balloonRect) => {\r\n            return {\r\n                top: targetRect.top - balloonRect.height - VERTICAL_SPACING,\r\n                left: targetRect.right - balloonRect.width,\r\n                name: 'caret_nw',\r\n                config: {\r\n                    withArrow: false\r\n                }\r\n            };\r\n        }\r\n    };\r\n    // Returns only the last position if it was matched to prevent the panel from jumping after the first match.\r\n    if (Object.prototype.hasOwnProperty.call(positions, preferredPosition)) {\r\n        return [\r\n            positions[preferredPosition]\r\n        ];\r\n    }\r\n    // By default, return all position callbacks ordered depending on the UI language direction.\r\n    return uiLanguageDirection !== 'rtl' ? [\r\n        positions.caret_se,\r\n        positions.caret_sw,\r\n        positions.caret_ne,\r\n        positions.caret_nw\r\n    ] : [\r\n        positions.caret_sw,\r\n        positions.caret_se,\r\n        positions.caret_nw,\r\n        positions.caret_ne\r\n    ];\r\n}\r\n/**\r\n * Returns a marker definition of the last valid occurring marker in a given string.\r\n * If there is no valid marker in a string, it returns undefined.\r\n *\r\n * Example of returned object:\r\n *\r\n * ```ts\r\n * {\r\n * \tmarker: '@',\r\n * \tposition: 4,\r\n * \tminimumCharacters: 0\r\n * }\r\n * ````\r\n *\r\n * @param feedsWithPattern Registered feeds in editor for mention plugin with created RegExp for matching marker.\r\n * @param text String to find the marker in\r\n * @returns Matched marker's definition\r\n */\r\nfunction getLastValidMarkerInText(feedsWithPattern, text) {\r\n    let lastValidMarker;\r\n    for (const feed of feedsWithPattern) {\r\n        const currentMarkerLastIndex = text.lastIndexOf(feed.marker);\r\n        if (currentMarkerLastIndex > 0 && !text.substring(currentMarkerLastIndex - 1).match(feed.pattern)) {\r\n            continue;\r\n        }\r\n        if (!lastValidMarker || currentMarkerLastIndex >= lastValidMarker.position) {\r\n            lastValidMarker = {\r\n                marker: feed.marker,\r\n                position: currentMarkerLastIndex,\r\n                minimumCharacters: feed.minimumCharacters,\r\n                pattern: feed.pattern\r\n            };\r\n        }\r\n    }\r\n    return lastValidMarker;\r\n}\r\n/**\r\n * Creates a RegExp pattern for the marker.\r\n *\r\n * Function has to be exported to achieve 100% code coverage.\r\n */\r\nexport function createRegExp(marker, minimumCharacters) {\r\n    const numberOfCharacters = minimumCharacters == 0 ? '*' : `{${minimumCharacters},}`;\r\n    const openAfterCharacters = env.features.isRegExpUnicodePropertySupported ? '\\\\p{Ps}\\\\p{Pi}\"\\'' : '\\\\(\\\\[{\"\\'';\r\n    const mentionCharacters = '.';\r\n    // The pattern consists of 3 groups:\r\n    // - 0 (non-capturing): Opening sequence - start of the line, space or an opening punctuation character like \"(\" or \"\\\"\",\r\n    // - 1: The marker character,\r\n    // - 2: Mention input (taking the minimal length into consideration to trigger the UI),\r\n    //\r\n    // The pattern matches up to the caret (end of string switch - $).\r\n    //               (0:      opening sequence       )(1:   marker  )(2:                typed mention              )$\r\n    const pattern = `(?:^|[ ${openAfterCharacters}])([${marker}])(${mentionCharacters}${numberOfCharacters})$`;\r\n    return new RegExp(pattern, 'u');\r\n}\r\n/**\r\n * Creates a test callback for the marker to be used in the text watcher instance.\r\n *\r\n * @param feedsWithPattern Feeds of mention plugin configured in editor with RegExp to match marker in text\r\n */\r\nfunction createTestCallback(feedsWithPattern) {\r\n    const textMatcher = (text) => {\r\n        const markerDefinition = getLastValidMarkerInText(feedsWithPattern, text);\r\n        if (!markerDefinition) {\r\n            return false;\r\n        }\r\n        let splitStringFrom = 0;\r\n        if (markerDefinition.position !== 0) {\r\n            splitStringFrom = markerDefinition.position - 1;\r\n        }\r\n        const textToTest = text.substring(splitStringFrom);\r\n        return markerDefinition.pattern.test(textToTest);\r\n    };\r\n    return textMatcher;\r\n}\r\n/**\r\n * Creates a text matcher from the marker.\r\n */\r\nfunction requestFeedText(markerDefinition, text) {\r\n    let splitStringFrom = 0;\r\n    if (markerDefinition.position !== 0) {\r\n        splitStringFrom = markerDefinition.position - 1;\r\n    }\r\n    const regExp = createRegExp(markerDefinition.marker, 0);\r\n    const textToMatch = text.substring(splitStringFrom);\r\n    const match = textToMatch.match(regExp);\r\n    return match[2];\r\n}\r\n/**\r\n * The default feed callback.\r\n */\r\nfunction createFeedCallback(feedItems) {\r\n    return (feedText) => {\r\n        const filteredItems = feedItems\r\n            // Make the default mention feed case-insensitive.\r\n            .filter(item => {\r\n            // Item might be defined as object.\r\n            const itemId = typeof item == 'string' ? item : String(item.id);\r\n            // The default feed is case insensitive.\r\n            return itemId.toLowerCase().includes(feedText.toLowerCase());\r\n        });\r\n        return filteredItems;\r\n    };\r\n}\r\n/**\r\n * Checks if position in inside or right after a text with a mention.\r\n */\r\nfunction isPositionInExistingMention(position) {\r\n    // The text watcher listens only to changed range in selection - so the selection attributes are not yet available\r\n    // and you cannot use selection.hasAttribute( 'mention' ) just yet.\r\n    // See https://github.com/ckeditor/ckeditor5-engine/issues/1723.\r\n    const hasMention = position.textNode && position.textNode.hasAttribute('mention');\r\n    const nodeBefore = position.nodeBefore;\r\n    return hasMention || nodeBefore && nodeBefore.is('$text') && nodeBefore.hasAttribute('mention');\r\n}\r\n/**\r\n * Checks if the closest marker offset is at the beginning of a mention.\r\n *\r\n * See https://github.com/ckeditor/ckeditor5/issues/11400.\r\n */\r\nfunction isMarkerInExistingMention(markerPosition) {\r\n    const nodeAfter = markerPosition.nodeAfter;\r\n    return nodeAfter && nodeAfter.is('$text') && nodeAfter.hasAttribute('mention');\r\n}\r\n/**\r\n * Checks if string is a valid mention marker.\r\n */\r\nfunction isValidMentionMarker(marker) {\r\n    return marker && marker.length == 1;\r\n}\r\n/**\r\n * Checks the mention plugins is in completion mode (e.g. when typing is after a valid mention string like @foo).\r\n */\r\nfunction checkIfStillInCompletionMode(editor) {\r\n    return editor.model.markers.has('mention');\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./mention.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module page-break/pagebreakcommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { findOptimalInsertionRange } from 'ckeditor5/src/widget';\r\n/**\r\n * The page break command.\r\n *\r\n * The command is registered by {@link module:page-break/pagebreakediting~PageBreakEditing} as `'pageBreak'`.\r\n *\r\n * To insert a page break at the current selection, execute the command:\r\n *\r\n *\t\teditor.execute( 'pageBreak' );\r\n */\r\nexport default class PageBreakCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const model = this.editor.model;\r\n        const schema = model.schema;\r\n        const selection = model.document.selection;\r\n        this.isEnabled = isPageBreakAllowedInParent(selection, schema, model);\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * @fires execute\r\n     */\r\n    execute() {\r\n        const model = this.editor.model;\r\n        model.change(writer => {\r\n            const pageBreakElement = writer.createElement('pageBreak');\r\n            model.insertObject(pageBreakElement, null, null, {\r\n                setSelection: 'after'\r\n            });\r\n        });\r\n    }\r\n}\r\n/**\r\n * Checks if a page break is allowed by the schema in the optimal insertion parent.\r\n */\r\nfunction isPageBreakAllowedInParent(selection, schema, model) {\r\n    const parent = getInsertPageBreakParent(selection, model);\r\n    return schema.checkChild(parent, 'pageBreak');\r\n}\r\n/**\r\n * Returns a node that will be used to insert a page break with `model.insertContent` to check if the page break can be placed there.\r\n */\r\nfunction getInsertPageBreakParent(selection, model) {\r\n    const insertionRange = findOptimalInsertionRange(selection, model);\r\n    const parent = insertionRange.start.parent;\r\n    if (parent.isEmpty && !parent.is('element', '$root')) {\r\n        return parent.parent;\r\n    }\r\n    return parent;\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./pagebreak.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module page-break/pagebreakediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { toWidget } from 'ckeditor5/src/widget';\r\nimport PageBreakCommand from './pagebreakcommand';\r\nimport '../theme/pagebreak.css';\r\n/**\r\n * The page break editing feature.\r\n */\r\nexport default class PageBreakEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'PageBreakEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const schema = editor.model.schema;\r\n        const t = editor.t;\r\n        const conversion = editor.conversion;\r\n        schema.register('pageBreak', {\r\n            inheritAllFrom: '$blockObject'\r\n        });\r\n        conversion.for('dataDowncast').elementToStructure({\r\n            model: 'pageBreak',\r\n            view: (modelElement, { writer }) => {\r\n                const divElement = writer.createContainerElement('div', {\r\n                    class: 'page-break',\r\n                    // If user has no `.ck-content` styles, it should always break a page during print.\r\n                    style: 'page-break-after: always'\r\n                }, \r\n                // For a rationale of using span inside a div see:\r\n                // https://github.com/ckeditor/ckeditor5-page-break/pull/1#discussion_r328934062.\r\n                writer.createContainerElement('span', {\r\n                    style: 'display: none'\r\n                }));\r\n                return divElement;\r\n            }\r\n        });\r\n        conversion.for('editingDowncast').elementToStructure({\r\n            model: 'pageBreak',\r\n            view: (modelElement, { writer }) => {\r\n                const label = t('Page break');\r\n                const viewWrapper = writer.createContainerElement('div');\r\n                const viewLabelElement = writer.createRawElement('span', { class: 'page-break__label' }, function (domElement) {\r\n                    domElement.innerText = t('Page break');\r\n                });\r\n                writer.addClass('page-break', viewWrapper);\r\n                writer.insert(writer.createPositionAt(viewWrapper, 0), viewLabelElement);\r\n                return toPageBreakWidget(viewWrapper, writer, label);\r\n            }\r\n        });\r\n        conversion.for('upcast')\r\n            .elementToElement({\r\n            view: element => {\r\n                // For upcast conversion it's enough if we check for element style and verify if it's empty\r\n                // or contains only hidden span element.\r\n                const hasPageBreakBefore = element.getStyle('page-break-before') == 'always';\r\n                const hasPageBreakAfter = element.getStyle('page-break-after') == 'always';\r\n                if (!hasPageBreakBefore && !hasPageBreakAfter) {\r\n                    return null;\r\n                }\r\n                // The \"page break\" div accepts only single child or no child at all.\r\n                if (element.childCount == 1) {\r\n                    const viewSpan = element.getChild(0);\r\n                    // The child must be the \"span\" element that is not displayed.\r\n                    if (!viewSpan.is('element', 'span') || viewSpan.getStyle('display') != 'none') {\r\n                        return null;\r\n                    }\r\n                }\r\n                else if (element.childCount > 1) {\r\n                    return null;\r\n                }\r\n                return { name: true };\r\n            },\r\n            model: 'pageBreak',\r\n            // This conversion must be checked before <br> conversion because some editors use\r\n            // <br style=\"page-break-before:always\"> as a page break marker.\r\n            converterPriority: 'high'\r\n        });\r\n        editor.commands.add('pageBreak', new PageBreakCommand(editor));\r\n    }\r\n}\r\n/**\r\n * Converts a given {@link module:engine/view/element~Element} to a page break widget:\r\n * * Adds a {@link module:engine/view/element~Element#_setCustomProperty custom property} allowing to\r\n *   recognize the page break widget element.\r\n * * Calls the {@link module:widget/utils~toWidget} function with the proper element's label creator.\r\n */\r\nfunction toPageBreakWidget(viewElement, writer, label) {\r\n    writer.setCustomProperty('pageBreak', true, viewElement);\r\n    return toWidget(viewElement, writer, { label });\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module page-break/pagebreakui\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { ButtonView } from 'ckeditor5/src/ui';\r\nimport pageBreakIcon from '../theme/icons/pagebreak.svg';\r\n/**\r\n * The page break UI plugin.\r\n */\r\nexport default class PageBreakUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'PageBreakUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        // Add pageBreak button to feature components.\r\n        editor.ui.componentFactory.add('pageBreak', locale => {\r\n            const command = editor.commands.get('pageBreak');\r\n            const view = new ButtonView(locale);\r\n            view.set({\r\n                label: t('Page break'),\r\n                icon: pageBreakIcon,\r\n                tooltip: true\r\n            });\r\n            view.bind('isEnabled').to(command, 'isEnabled');\r\n            // Execute command.\r\n            this.listenTo(view, 'execute', () => {\r\n                editor.execute('pageBreak');\r\n                editor.editing.view.focus();\r\n            });\r\n            return view;\r\n        });\r\n    }\r\n}\r\n","export default \"<svg viewBox=\\\"0 0 20 20\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M3.598.687h1.5v5h-1.5zm14.5 0h1.5v5h-1.5z\\\"/><path d=\\\"M19.598 4.187v1.5h-16v-1.5zm-16 14.569h1.5v-5h-1.5zm14.5 0h1.5v-5h-1.5z\\\"/><path d=\\\"M19.598 15.256v-1.5h-16v1.5zM5.081 9h6v2h-6zm8 0h6v2h-6zm-9.483 1L0 12.5v-5z\\\"/></svg>\";","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module paste-from-office/filters/list\r\n */\r\nimport { Matcher, UpcastWriter } from 'ckeditor5/src/engine';\r\n/**\r\n * Transforms Word specific list-like elements to the semantic HTML lists.\r\n *\r\n * Lists in Word are represented by block elements with special attributes like:\r\n *\r\n * ```xml\r\n * <p class=MsoListParagraphCxSpFirst style='mso-list:l1 level1 lfo1'>...</p> // Paragraph based list.\r\n * <h1 style='mso-list:l0 level1 lfo1'>...</h1> // Heading 1 based list.\r\n * ```\r\n *\r\n * @param documentFragment The view structure to be transformed.\r\n * @param stylesString Styles from which list-like elements styling will be extracted.\r\n */\r\nexport function transformListItemLikeElementsIntoLists(documentFragment, stylesString) {\r\n    if (!documentFragment.childCount) {\r\n        return;\r\n    }\r\n    const writer = new UpcastWriter(documentFragment.document);\r\n    const itemLikeElements = findAllItemLikeElements(documentFragment, writer);\r\n    if (!itemLikeElements.length) {\r\n        return;\r\n    }\r\n    let currentList = null;\r\n    let currentIndentation = 1;\r\n    itemLikeElements.forEach((itemLikeElement, i) => {\r\n        const isDifferentList = isNewListNeeded(itemLikeElements[i - 1], itemLikeElement);\r\n        const previousItemLikeElement = isDifferentList ? null : itemLikeElements[i - 1];\r\n        const indentationDifference = getIndentationDifference(previousItemLikeElement, itemLikeElement);\r\n        if (isDifferentList) {\r\n            currentList = null;\r\n            currentIndentation = 1;\r\n        }\r\n        if (!currentList || indentationDifference !== 0) {\r\n            const listStyle = detectListStyle(itemLikeElement, stylesString);\r\n            if (!currentList) {\r\n                currentList = insertNewEmptyList(listStyle, itemLikeElement.element, writer);\r\n            }\r\n            else if (itemLikeElement.indent > currentIndentation) {\r\n                const lastListItem = currentList.getChild(currentList.childCount - 1);\r\n                const lastListItemChild = lastListItem.getChild(lastListItem.childCount - 1);\r\n                currentList = insertNewEmptyList(listStyle, lastListItemChild, writer);\r\n                currentIndentation += 1;\r\n            }\r\n            else if (itemLikeElement.indent < currentIndentation) {\r\n                const differentIndentation = currentIndentation - itemLikeElement.indent;\r\n                currentList = findParentListAtLevel(currentList, differentIndentation);\r\n                currentIndentation = itemLikeElement.indent;\r\n            }\r\n            if (itemLikeElement.indent <= currentIndentation) {\r\n                if (!currentList.is('element', listStyle.type)) {\r\n                    currentList = writer.rename(listStyle.type, currentList);\r\n                }\r\n            }\r\n        }\r\n        const listItem = transformElementIntoListItem(itemLikeElement.element, writer);\r\n        writer.appendChild(listItem, currentList);\r\n    });\r\n}\r\n/**\r\n * Removes paragraph wrapping content inside a list item.\r\n */\r\nexport function unwrapParagraphInListItem(documentFragment, writer) {\r\n    for (const value of writer.createRangeIn(documentFragment)) {\r\n        const element = value.item;\r\n        if (element.is('element', 'li')) {\r\n            // Google Docs allows for single paragraph inside LI.\r\n            const firstChild = element.getChild(0);\r\n            if (firstChild && firstChild.is('element', 'p')) {\r\n                writer.unwrapElement(firstChild);\r\n            }\r\n        }\r\n    }\r\n}\r\n/**\r\n * Finds all list-like elements in a given document fragment.\r\n *\r\n * @param documentFragment Document fragment in which to look for list-like nodes.\r\n * @returns Array of found list-like items. Each item is an object containing:\r\n */\r\nfunction findAllItemLikeElements(documentFragment, writer) {\r\n    const range = writer.createRangeIn(documentFragment);\r\n    // Matcher for finding list-like elements.\r\n    const itemLikeElementsMatcher = new Matcher({\r\n        name: /^p|h\\d+$/,\r\n        styles: {\r\n            'mso-list': /.*/\r\n        }\r\n    });\r\n    const itemLikeElements = [];\r\n    for (const value of range) {\r\n        if (value.type === 'elementStart' && itemLikeElementsMatcher.match(value.item)) {\r\n            const itemData = getListItemData(value.item);\r\n            itemLikeElements.push({\r\n                element: value.item,\r\n                id: itemData.id,\r\n                order: itemData.order,\r\n                indent: itemData.indent\r\n            });\r\n        }\r\n    }\r\n    return itemLikeElements;\r\n}\r\n/**\r\n * Extracts list item style from the provided CSS.\r\n *\r\n * List item style is extracted from the CSS stylesheet. Each list with its specific style attribute\r\n * value (`mso-list:l1 level1 lfo1`) has its dedicated properties in a CSS stylesheet defined with a selector like:\r\n *\r\n * ```css\r\n * @list l1:level1 { ... }\r\n * ```\r\n *\r\n * It contains `mso-level-number-format` property which defines list numbering/bullet style. If this property\r\n * is not defined it means default `decimal` numbering.\r\n *\r\n * Here CSS string representation is used as `mso-level-number-format` property is an invalid CSS property\r\n * and will be removed during CSS parsing.\r\n *\r\n * @param listLikeItem List-like item for which list style will be searched for. Usually\r\n * a result of `findAllItemLikeElements()` function.\r\n * @param stylesString CSS stylesheet.\r\n * @returns An object with properties:\r\n *\r\n * * type - List type, could be `ul` or `ol`.\r\n * * startIndex - List start index, valid only for ordered lists.\r\n * * style - List style, for example: `decimal`, `lower-roman`, etc. It is extracted\r\n *     directly from Word stylesheet and adjusted to represent proper values for the CSS `list-style-type` property.\r\n *     If it cannot be adjusted, the `null` value is returned.\r\n */\r\nfunction detectListStyle(listLikeItem, stylesString) {\r\n    const listStyleRegexp = new RegExp(`@list l${listLikeItem.id}:level${listLikeItem.indent}\\\\s*({[^}]*)`, 'gi');\r\n    const listStyleTypeRegex = /mso-level-number-format:([^;]{0,100});/gi;\r\n    const listStartIndexRegex = /mso-level-start-at:\\s{0,100}([0-9]{0,10})\\s{0,100};/gi;\r\n    const listStyleMatch = listStyleRegexp.exec(stylesString);\r\n    let listStyleType = 'decimal'; // Decimal is default one.\r\n    let type = 'ol'; // <ol> is default list.\r\n    let startIndex = null;\r\n    if (listStyleMatch && listStyleMatch[1]) {\r\n        const listStyleTypeMatch = listStyleTypeRegex.exec(listStyleMatch[1]);\r\n        if (listStyleTypeMatch && listStyleTypeMatch[1]) {\r\n            listStyleType = listStyleTypeMatch[1].trim();\r\n            type = listStyleType !== 'bullet' && listStyleType !== 'image' ? 'ol' : 'ul';\r\n        }\r\n        // Styles for the numbered lists are always defined in the Word CSS stylesheet.\r\n        // Unordered lists MAY contain a value for the Word CSS definition `mso-level-text` but sometimes\r\n        // this tag is missing. And because of that, we cannot depend on that. We need to predict the list style value\r\n        // based on the list style marker element.\r\n        if (listStyleType === 'bullet') {\r\n            const bulletedStyle = findBulletedListStyle(listLikeItem.element);\r\n            if (bulletedStyle) {\r\n                listStyleType = bulletedStyle;\r\n            }\r\n        }\r\n        else {\r\n            const listStartIndexMatch = listStartIndexRegex.exec(listStyleMatch[1]);\r\n            if (listStartIndexMatch && listStartIndexMatch[1]) {\r\n                startIndex = parseInt(listStartIndexMatch[1]);\r\n            }\r\n        }\r\n    }\r\n    return {\r\n        type,\r\n        startIndex,\r\n        style: mapListStyleDefinition(listStyleType)\r\n    };\r\n}\r\n/**\r\n * Tries to extract the `list-style-type` value based on the marker element for bulleted list.\r\n */\r\nfunction findBulletedListStyle(element) {\r\n    const listMarkerElement = findListMarkerNode(element);\r\n    if (!listMarkerElement) {\r\n        return null;\r\n    }\r\n    const listMarker = listMarkerElement._data;\r\n    if (listMarker === 'o') {\r\n        return 'circle';\r\n    }\r\n    else if (listMarker === '·') {\r\n        return 'disc';\r\n    }\r\n    // Word returns '§' instead of '■' for the square list style.\r\n    else if (listMarker === '§') {\r\n        return 'square';\r\n    }\r\n    return null;\r\n}\r\n/**\r\n * Tries to find a text node that represents the marker element (list-style-type).\r\n */\r\nfunction findListMarkerNode(element) {\r\n    // If the first child is a text node, it is the data for the element.\r\n    // The list-style marker is not present here.\r\n    if (element.getChild(0).is('$text')) {\r\n        return null;\r\n    }\r\n    for (const childNode of element.getChildren()) {\r\n        // The list-style marker will be inside the `<span>` element. Let's ignore all non-span elements.\r\n        // It may happen that the `<a>` element is added as the first child. Most probably, it's an anchor element.\r\n        if (!childNode.is('element', 'span')) {\r\n            continue;\r\n        }\r\n        const textNodeOrElement = childNode.getChild(0);\r\n        if (!textNodeOrElement) {\r\n            continue;\r\n        }\r\n        // If already found the marker element, use it.\r\n        if (textNodeOrElement.is('$text')) {\r\n            return textNodeOrElement;\r\n        }\r\n        return textNodeOrElement.getChild(0);\r\n    }\r\n    /* istanbul ignore next -- @preserve */\r\n    return null;\r\n}\r\n/**\r\n * Parses the `list-style-type` value extracted directly from the Word CSS stylesheet and returns proper CSS definition.\r\n */\r\nfunction mapListStyleDefinition(value) {\r\n    if (value.startsWith('arabic-leading-zero')) {\r\n        return 'decimal-leading-zero';\r\n    }\r\n    switch (value) {\r\n        case 'alpha-upper':\r\n            return 'upper-alpha';\r\n        case 'alpha-lower':\r\n            return 'lower-alpha';\r\n        case 'roman-upper':\r\n            return 'upper-roman';\r\n        case 'roman-lower':\r\n            return 'lower-roman';\r\n        case 'circle':\r\n        case 'disc':\r\n        case 'square':\r\n            return value;\r\n        default:\r\n            return null;\r\n    }\r\n}\r\n/**\r\n * Creates an empty list of a given type and inserts it after a specified element.\r\n *\r\n * @param listStyle List style object which determines the type of newly created list.\r\n * Usually a result of `detectListStyle()` function.\r\n * @param element Element after which list is inserted.\r\n * @returns Newly created list element.\r\n */\r\nfunction insertNewEmptyList(listStyle, element, writer) {\r\n    const parent = element.parent;\r\n    const list = writer.createElement(listStyle.type);\r\n    const position = parent.getChildIndex(element) + 1;\r\n    writer.insertChild(position, list, parent);\r\n    // We do not support modifying the marker for a particular list item.\r\n    // Set the value for the `list-style-type` property directly to the list container.\r\n    if (listStyle.style) {\r\n        writer.setStyle('list-style-type', listStyle.style, list);\r\n    }\r\n    if (listStyle.startIndex && listStyle.startIndex > 1) {\r\n        writer.setAttribute('start', listStyle.startIndex, list);\r\n    }\r\n    return list;\r\n}\r\n/**\r\n * Transforms a given element into a semantic list item. As the function operates on a provided\r\n * {module:engine/src/view/element~Element element} it will modify the view structure to which this element belongs.\r\n *\r\n * @param element Element which will be transformed into a list item.\r\n * @returns New element to which the given one was transformed. It is\r\n * inserted in place of the old element (the reference to the old element is lost due to renaming).\r\n */\r\nfunction transformElementIntoListItem(element, writer) {\r\n    removeBulletElement(element, writer);\r\n    writer.removeStyle('text-indent', element); // #12361\r\n    return writer.rename('li', element);\r\n}\r\n/**\r\n * Extracts list item information from Word specific list-like element style:\r\n *\r\n * ```\r\n * `style=\"mso-list:l1 level1 lfo1\"`\r\n * ```\r\n *\r\n * where:\r\n *\r\n * ```\r\n * * `l1` is a list id (however it does not mean this is a continuous list - see #43),\r\n * * `level1` is a list item indentation level,\r\n * * `lfo1` is a list insertion order in a document.\r\n * ```\r\n *\r\n * @param element Element from which style data is extracted.\r\n */\r\nfunction getListItemData(element) {\r\n    const data = {};\r\n    const listStyle = element.getStyle('mso-list');\r\n    if (listStyle) {\r\n        const idMatch = listStyle.match(/(^|\\s{1,100})l(\\d+)/i);\r\n        const orderMatch = listStyle.match(/\\s{0,100}lfo(\\d+)/i);\r\n        const indentMatch = listStyle.match(/\\s{0,100}level(\\d+)/i);\r\n        if (idMatch && orderMatch && indentMatch) {\r\n            data.id = idMatch[2];\r\n            data.order = orderMatch[1];\r\n            data.indent = parseInt(indentMatch[1]);\r\n        }\r\n    }\r\n    return data;\r\n}\r\n/**\r\n * Removes span with a numbering/bullet from a given element.\r\n */\r\nfunction removeBulletElement(element, writer) {\r\n    // Matcher for finding `span` elements holding lists numbering/bullets.\r\n    const bulletMatcher = new Matcher({\r\n        name: 'span',\r\n        styles: {\r\n            'mso-list': 'Ignore'\r\n        }\r\n    });\r\n    const range = writer.createRangeIn(element);\r\n    for (const value of range) {\r\n        if (value.type === 'elementStart' && bulletMatcher.match(value.item)) {\r\n            writer.remove(value.item);\r\n        }\r\n    }\r\n}\r\n/**\r\n * Whether the previous and current items belong to the same list. It is determined based on `item.id`\r\n * (extracted from `mso-list` style, see #getListItemData) and a previous sibling of the current item.\r\n *\r\n * However, it's quite easy to change the `id` attribute for nested lists in Word. It will break the list feature while pasting.\r\n * Let's check also the `indent` attribute. If the difference between those two elements is equal to 1, we can assume that\r\n * the `currentItem` is a beginning of the nested list because lists in CKEditor 5 always start with the `indent=0` attribute.\r\n * See: https://github.com/ckeditor/ckeditor5/issues/7805.\r\n */\r\nfunction isNewListNeeded(previousItem, currentItem) {\r\n    if (!previousItem) {\r\n        return true;\r\n    }\r\n    if (previousItem.id !== currentItem.id) {\r\n        // See: https://github.com/ckeditor/ckeditor5/issues/7805.\r\n        //\r\n        // * List item 1.\r\n        //     - Nested list item 1.\r\n        if (currentItem.indent - previousItem.indent === 1) {\r\n            return false;\r\n        }\r\n        return true;\r\n    }\r\n    const previousSibling = currentItem.element.previousSibling;\r\n    if (!previousSibling) {\r\n        return true;\r\n    }\r\n    // Even with the same id the list does not have to be continuous (#43).\r\n    return !isList(previousSibling);\r\n}\r\nfunction isList(element) {\r\n    return element.is('element', 'ol') || element.is('element', 'ul');\r\n}\r\n/**\r\n * Calculates the indentation difference between two given list items (based on the indent attribute\r\n * extracted from the `mso-list` style, see #getListItemData).\r\n */\r\nfunction getIndentationDifference(previousItem, currentItem) {\r\n    return previousItem ? currentItem.indent - previousItem.indent : currentItem.indent - 1;\r\n}\r\n/**\r\n * Finds the parent list element (ul/ol) of a given list element with indentation level lower by a given value.\r\n *\r\n * @param listElement List element from which to start looking for a parent list.\r\n * @param indentationDifference Indentation difference between lists.\r\n * @returns Found list element with indentation level lower by a given value.\r\n */\r\nfunction findParentListAtLevel(listElement, indentationDifference) {\r\n    const ancestors = listElement.getAncestors({ parentFirst: true });\r\n    let parentList = null;\r\n    let levelChange = 0;\r\n    for (const ancestor of ancestors) {\r\n        if (ancestor.is('element', 'ul') || ancestor.is('element', 'ol')) {\r\n            levelChange++;\r\n        }\r\n        if (levelChange === indentationDifference) {\r\n            parentList = ancestor;\r\n            break;\r\n        }\r\n    }\r\n    return parentList;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module paste-from-office/filters/image\r\n */\r\n/* globals btoa */\r\nimport { Matcher, UpcastWriter } from 'ckeditor5/src/engine';\r\n/**\r\n * Replaces source attribute of all `<img>` elements representing regular\r\n * images (not the Word shapes) with inlined base64 image representation extracted from RTF or Blob data.\r\n *\r\n * @param documentFragment Document fragment on which transform images.\r\n * @param rtfData The RTF data from which images representation will be used.\r\n */\r\nexport function replaceImagesSourceWithBase64(documentFragment, rtfData) {\r\n    if (!documentFragment.childCount) {\r\n        return;\r\n    }\r\n    const upcastWriter = new UpcastWriter(documentFragment.document);\r\n    const shapesIds = findAllShapesIds(documentFragment, upcastWriter);\r\n    removeAllImgElementsRepresentingShapes(shapesIds, documentFragment, upcastWriter);\r\n    insertMissingImgs(shapesIds, documentFragment, upcastWriter);\r\n    removeAllShapeElements(documentFragment, upcastWriter);\r\n    const images = findAllImageElementsWithLocalSource(documentFragment, upcastWriter);\r\n    if (images.length) {\r\n        replaceImagesFileSourceWithInlineRepresentation(images, extractImageDataFromRtf(rtfData), upcastWriter);\r\n    }\r\n}\r\n/**\r\n * Converts given HEX string to base64 representation.\r\n *\r\n * @internal\r\n * @param hexString The HEX string to be converted.\r\n * @returns Base64 representation of a given HEX string.\r\n */\r\nexport function _convertHexToBase64(hexString) {\r\n    return btoa(hexString.match(/\\w{2}/g).map(char => {\r\n        return String.fromCharCode(parseInt(char, 16));\r\n    }).join(''));\r\n}\r\n/**\r\n * Finds all shapes (`<v:*>...</v:*>`) ids. Shapes can represent images (canvas)\r\n * or Word shapes (which does not have RTF or Blob representation).\r\n *\r\n * @param documentFragment Document fragment from which to extract shape ids.\r\n * @returns Array of shape ids.\r\n */\r\nfunction findAllShapesIds(documentFragment, writer) {\r\n    const range = writer.createRangeIn(documentFragment);\r\n    const shapeElementsMatcher = new Matcher({\r\n        name: /v:(.+)/\r\n    });\r\n    const shapesIds = [];\r\n    for (const value of range) {\r\n        if (value.type != 'elementStart') {\r\n            continue;\r\n        }\r\n        const el = value.item;\r\n        const previousSibling = el.previousSibling;\r\n        const prevSiblingName = previousSibling && previousSibling.is('element') ? previousSibling.name : null;\r\n        // If shape element have 'o:gfxdata' attribute and is not directly before `<v:shapetype>` element it means it represent Word shape.\r\n        if (shapeElementsMatcher.match(el) && el.getAttribute('o:gfxdata') && prevSiblingName !== 'v:shapetype') {\r\n            shapesIds.push(value.item.getAttribute('id'));\r\n        }\r\n    }\r\n    return shapesIds;\r\n}\r\n/**\r\n * Removes all `<img>` elements which represents Word shapes and not regular images.\r\n *\r\n * @param shapesIds Shape ids which will be checked against `<img>` elements.\r\n * @param documentFragment Document fragment from which to remove `<img>` elements.\r\n */\r\nfunction removeAllImgElementsRepresentingShapes(shapesIds, documentFragment, writer) {\r\n    const range = writer.createRangeIn(documentFragment);\r\n    const imageElementsMatcher = new Matcher({\r\n        name: 'img'\r\n    });\r\n    const imgs = [];\r\n    for (const value of range) {\r\n        if (value.item.is('element') && imageElementsMatcher.match(value.item)) {\r\n            const el = value.item;\r\n            const shapes = el.getAttribute('v:shapes') ? el.getAttribute('v:shapes').split(' ') : [];\r\n            if (shapes.length && shapes.every(shape => shapesIds.indexOf(shape) > -1)) {\r\n                imgs.push(el);\r\n                // Shapes may also have empty source while content is paste in some browsers (Safari).\r\n            }\r\n            else if (!el.getAttribute('src')) {\r\n                imgs.push(el);\r\n            }\r\n        }\r\n    }\r\n    for (const img of imgs) {\r\n        writer.remove(img);\r\n    }\r\n}\r\n/**\r\n * Removes all shape elements (`<v:*>...</v:*>`) so they do not pollute the output structure.\r\n *\r\n * @param documentFragment Document fragment from which to remove shape elements.\r\n */\r\nfunction removeAllShapeElements(documentFragment, writer) {\r\n    const range = writer.createRangeIn(documentFragment);\r\n    const shapeElementsMatcher = new Matcher({\r\n        name: /v:(.+)/\r\n    });\r\n    const shapes = [];\r\n    for (const value of range) {\r\n        if (value.type == 'elementStart' && shapeElementsMatcher.match(value.item)) {\r\n            shapes.push(value.item);\r\n        }\r\n    }\r\n    for (const shape of shapes) {\r\n        writer.remove(shape);\r\n    }\r\n}\r\n/**\r\n * Inserts `img` tags if there is none after a shape.\r\n */\r\nfunction insertMissingImgs(shapeIds, documentFragment, writer) {\r\n    const range = writer.createRangeIn(documentFragment);\r\n    const shapes = [];\r\n    for (const value of range) {\r\n        if (value.type == 'elementStart' && value.item.is('element', 'v:shape')) {\r\n            const id = value.item.getAttribute('id');\r\n            if (shapeIds.includes(id)) {\r\n                continue;\r\n            }\r\n            if (!containsMatchingImg(value.item.parent.getChildren(), id)) {\r\n                shapes.push(value.item);\r\n            }\r\n        }\r\n    }\r\n    for (const shape of shapes) {\r\n        const attrs = {\r\n            src: findSrc(shape)\r\n        };\r\n        if (shape.hasAttribute('alt')) {\r\n            attrs.alt = shape.getAttribute('alt');\r\n        }\r\n        const img = writer.createElement('img', attrs);\r\n        writer.insertChild(shape.index + 1, img, shape.parent);\r\n    }\r\n    function containsMatchingImg(nodes, id) {\r\n        for (const node of nodes) {\r\n            /* istanbul ignore else -- @preserve */\r\n            if (node.is('element')) {\r\n                if (node.name == 'img' && node.getAttribute('v:shapes') == id) {\r\n                    return true;\r\n                }\r\n                if (containsMatchingImg(node.getChildren(), id)) {\r\n                    return true;\r\n                }\r\n            }\r\n        }\r\n        return false;\r\n    }\r\n    function findSrc(shape) {\r\n        for (const child of shape.getChildren()) {\r\n            /* istanbul ignore else -- @preserve */\r\n            if (child.is('element') && child.getAttribute('src')) {\r\n                return child.getAttribute('src');\r\n            }\r\n        }\r\n    }\r\n}\r\n/**\r\n * Finds all `<img>` elements in a given document fragment which have source pointing to local `file://` resource.\r\n *\r\n * @param documentFragment Document fragment in which to look for `<img>` elements.\r\n * @returns result All found images grouped by source type.\r\n */\r\nfunction findAllImageElementsWithLocalSource(documentFragment, writer) {\r\n    const range = writer.createRangeIn(documentFragment);\r\n    const imageElementsMatcher = new Matcher({\r\n        name: 'img'\r\n    });\r\n    const imgs = [];\r\n    for (const value of range) {\r\n        if (value.item.is('element') && imageElementsMatcher.match(value.item)) {\r\n            if (value.item.getAttribute('src').startsWith('file://')) {\r\n                imgs.push(value.item);\r\n            }\r\n        }\r\n    }\r\n    return imgs;\r\n}\r\n/**\r\n * Extracts all images HEX representations from a given RTF data.\r\n *\r\n * @param rtfData The RTF data from which to extract images HEX representation.\r\n * @returns Array of found HEX representations. Each array item is an object containing:\r\n *\r\n * * hex Image representation in HEX format.\r\n * * type Type of image, `image/png` or `image/jpeg`.\r\n */\r\nfunction extractImageDataFromRtf(rtfData) {\r\n    if (!rtfData) {\r\n        return [];\r\n    }\r\n    const regexPictureHeader = /{\\\\pict[\\s\\S]+?\\\\bliptag-?\\d+(\\\\blipupi-?\\d+)?({\\\\\\*\\\\blipuid\\s?[\\da-fA-F]+)?[\\s}]*?/;\r\n    const regexPicture = new RegExp('(?:(' + regexPictureHeader.source + '))([\\\\da-fA-F\\\\s]+)\\\\}', 'g');\r\n    const images = rtfData.match(regexPicture);\r\n    const result = [];\r\n    if (images) {\r\n        for (const image of images) {\r\n            let imageType = false;\r\n            if (image.includes('\\\\pngblip')) {\r\n                imageType = 'image/png';\r\n            }\r\n            else if (image.includes('\\\\jpegblip')) {\r\n                imageType = 'image/jpeg';\r\n            }\r\n            if (imageType) {\r\n                result.push({\r\n                    hex: image.replace(regexPictureHeader, '').replace(/[^\\da-fA-F]/g, ''),\r\n                    type: imageType\r\n                });\r\n            }\r\n        }\r\n    }\r\n    return result;\r\n}\r\n/**\r\n * Replaces `src` attribute value of all given images with the corresponding base64 image representation.\r\n *\r\n * @param imageElements Array of image elements which will have its source replaced.\r\n * @param imagesHexSources Array of images hex sources (usually the result of `extractImageDataFromRtf()` function).\r\n * The array should be the same length as `imageElements` parameter.\r\n */\r\nfunction replaceImagesFileSourceWithInlineRepresentation(imageElements, imagesHexSources, writer) {\r\n    // Assume there is an equal amount of image elements and images HEX sources so they can be matched accordingly based on existing order.\r\n    if (imageElements.length === imagesHexSources.length) {\r\n        for (let i = 0; i < imageElements.length; i++) {\r\n            const newSrc = `data:${imagesHexSources[i].type};base64,${_convertHexToBase64(imagesHexSources[i].hex)}`;\r\n            writer.setAttribute('src', newSrc, imageElements[i]);\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module paste-from-office/normalizers/mswordnormalizer\r\n */\r\nimport { transformListItemLikeElementsIntoLists } from '../filters/list';\r\nimport { replaceImagesSourceWithBase64 } from '../filters/image';\r\nconst msWordMatch1 = /<meta\\s*name=\"?generator\"?\\s*content=\"?microsoft\\s*word\\s*\\d+\"?\\/?>/i;\r\nconst msWordMatch2 = /xmlns:o=\"urn:schemas-microsoft-com/i;\r\n/**\r\n * Normalizer for the content pasted from Microsoft Word.\r\n */\r\nexport default class MSWordNormalizer {\r\n    /**\r\n     * Creates a new `MSWordNormalizer` instance.\r\n     *\r\n     * @param document View document.\r\n     */\r\n    constructor(document) {\r\n        this.document = document;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    isActive(htmlString) {\r\n        return msWordMatch1.test(htmlString) || msWordMatch2.test(htmlString);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    execute(data) {\r\n        const { body: documentFragment, stylesString } = data._parsedData;\r\n        transformListItemLikeElementsIntoLists(documentFragment, stylesString);\r\n        replaceImagesSourceWithBase64(documentFragment, data.dataTransfer.getData('text/rtf'));\r\n        data.content = documentFragment;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module paste-from-office/filters/br\r\n */\r\nimport { DomConverter, ViewDocument } from 'ckeditor5/src/engine';\r\n/**\r\n * Transforms `<br>` elements that are siblings to some block element into a paragraphs.\r\n *\r\n * @param documentFragment The view structure to be transformed.\r\n */\r\nexport default function transformBlockBrsToParagraphs(documentFragment, writer) {\r\n    const viewDocument = new ViewDocument(writer.document.stylesProcessor);\r\n    const domConverter = new DomConverter(viewDocument, { renderingMode: 'data' });\r\n    const blockElements = domConverter.blockElements;\r\n    const inlineObjectElements = domConverter.inlineObjectElements;\r\n    const elementsToReplace = [];\r\n    for (const value of writer.createRangeIn(documentFragment)) {\r\n        const element = value.item;\r\n        if (element.is('element', 'br')) {\r\n            const nextSibling = findSibling(element, 'forward', writer, { blockElements, inlineObjectElements });\r\n            const previousSibling = findSibling(element, 'backward', writer, { blockElements, inlineObjectElements });\r\n            const nextSiblingIsBlock = isBlockViewElement(nextSibling, blockElements);\r\n            const previousSiblingIsBlock = isBlockViewElement(previousSibling, blockElements);\r\n            // If the <br> is surrounded by blocks then convert it to a paragraph:\r\n            // * <p>foo</p>[<br>]<p>bar</p> -> <p>foo</p>[<p></p>]<p>bar</p>\r\n            // * <p>foo</p>[<br>] -> <p>foo</p>[<p></p>]\r\n            // * [<br>]<p>foo</p> -> [<p></p>]<p>foo</p>\r\n            if (previousSiblingIsBlock || nextSiblingIsBlock) {\r\n                elementsToReplace.push(element);\r\n            }\r\n        }\r\n    }\r\n    for (const element of elementsToReplace) {\r\n        if (element.hasClass('Apple-interchange-newline')) {\r\n            writer.remove(element);\r\n        }\r\n        else {\r\n            writer.replace(element, writer.createElement('p'));\r\n        }\r\n    }\r\n}\r\n/**\r\n * Returns sibling node, threats inline elements as transparent (but should stop on an inline objects).\r\n */\r\nfunction findSibling(viewElement, direction, writer, { blockElements, inlineObjectElements }) {\r\n    let position = writer.createPositionAt(viewElement, direction == 'forward' ? 'after' : 'before');\r\n    // Find first position that is just before a first:\r\n    // * text node,\r\n    // * block element,\r\n    // * inline object element.\r\n    // It's ignoring any inline (non-object) elements like span, strong, etc.\r\n    position = position.getLastMatchingPosition(({ item }) => (item.is('element') &&\r\n        !blockElements.includes(item.name) &&\r\n        !inlineObjectElements.includes(item.name)), { direction });\r\n    return direction == 'forward' ? position.nodeAfter : position.nodeBefore;\r\n}\r\n/**\r\n * Returns true for view elements that are listed as block view elements.\r\n */\r\nfunction isBlockViewElement(node, blockElements) {\r\n    return !!node && node.is('element') && blockElements.includes(node.name);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module paste-from-office/normalizers/googledocsnormalizer\r\n */\r\nimport { UpcastWriter } from 'ckeditor5/src/engine';\r\nimport removeBoldWrapper from '../filters/removeboldwrapper';\r\nimport transformBlockBrsToParagraphs from '../filters/br';\r\nimport { unwrapParagraphInListItem } from '../filters/list';\r\nconst googleDocsMatch = /id=(\"|')docs-internal-guid-[-0-9a-f]+(\"|')/i;\r\n/**\r\n * Normalizer for the content pasted from Google Docs.\r\n */\r\nexport default class GoogleDocsNormalizer {\r\n    /**\r\n     * Creates a new `GoogleDocsNormalizer` instance.\r\n     *\r\n     * @param document View document.\r\n     */\r\n    constructor(document) {\r\n        this.document = document;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    isActive(htmlString) {\r\n        return googleDocsMatch.test(htmlString);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    execute(data) {\r\n        const writer = new UpcastWriter(this.document);\r\n        const { body: documentFragment } = data._parsedData;\r\n        removeBoldWrapper(documentFragment, writer);\r\n        unwrapParagraphInListItem(documentFragment, writer);\r\n        transformBlockBrsToParagraphs(documentFragment, writer);\r\n        data.content = documentFragment;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * Removes the `<b>` tag wrapper added by Google Docs to a copied content.\r\n *\r\n * @param documentFragment element `data.content` obtained from clipboard\r\n */\r\nexport default function removeBoldWrapper(documentFragment, writer) {\r\n    for (const child of documentFragment.getChildren()) {\r\n        if (child.is('element', 'b') && child.getStyle('font-weight') === 'normal') {\r\n            const childIndex = documentFragment.getChildIndex(child);\r\n            writer.remove(child);\r\n            writer.insertChild(childIndex, child.getChildren(), documentFragment);\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module paste-from-office/normalizers/googlesheetsnormalizer\r\n */\r\nimport { UpcastWriter } from 'ckeditor5/src/engine';\r\nimport removeXmlns from '../filters/removexmlns';\r\nimport removeGoogleSheetsTag from '../filters/removegooglesheetstag';\r\nimport removeInvalidTableWidth from '../filters/removeinvalidtablewidth';\r\nimport removeStyleBlock from '../filters/removestyleblock';\r\nconst googleSheetsMatch = /<google-sheets-html-origin/i;\r\n/**\r\n * Normalizer for the content pasted from Google Sheets.\r\n */\r\nexport default class GoogleSheetsNormalizer {\r\n    /**\r\n     * Creates a new `GoogleSheetsNormalizer` instance.\r\n     *\r\n     * @param document View document.\r\n     */\r\n    constructor(document) {\r\n        this.document = document;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    isActive(htmlString) {\r\n        return googleSheetsMatch.test(htmlString);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    execute(data) {\r\n        const writer = new UpcastWriter(this.document);\r\n        const { body: documentFragment } = data._parsedData;\r\n        removeGoogleSheetsTag(documentFragment, writer);\r\n        removeXmlns(documentFragment, writer);\r\n        removeInvalidTableWidth(documentFragment, writer);\r\n        removeStyleBlock(documentFragment, writer);\r\n        data.content = documentFragment;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * Removes the `<google-sheets-html-origin>` tag wrapper added by Google Sheets to a copied content.\r\n *\r\n * @param documentFragment element `data.content` obtained from clipboard\r\n */\r\nexport default function removeGoogleSheetsTag(documentFragment, writer) {\r\n    for (const child of documentFragment.getChildren()) {\r\n        if (child.is('element', 'google-sheets-html-origin')) {\r\n            const childIndex = documentFragment.getChildIndex(child);\r\n            writer.remove(child);\r\n            writer.insertChild(childIndex, child.getChildren(), documentFragment);\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * Removes the `xmlns` attribute from table pasted from Google Sheets.\r\n *\r\n * @param documentFragment element `data.content` obtained from clipboard\r\n */\r\nexport default function removeXmlns(documentFragment, writer) {\r\n    for (const child of documentFragment.getChildren()) {\r\n        if (child.is('element', 'table') && child.hasAttribute('xmlns')) {\r\n            writer.removeAttribute('xmlns', child);\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * Removes the `width:0px` style from table pasted from Google Sheets.\r\n *\r\n * @param documentFragment element `data.content` obtained from clipboard\r\n */\r\nexport default function removeInvalidTableWidth(documentFragment, writer) {\r\n    for (const child of documentFragment.getChildren()) {\r\n        if (child.is('element', 'table') && child.getStyle('width') === '0px') {\r\n            writer.removeStyle('width', child);\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * Removes `<style>` block added by Google Sheets to a copied content.\r\n *\r\n * @param documentFragment element `data.content` obtained from clipboard\r\n */\r\nexport default function removeStyleBlock(documentFragment, writer) {\r\n    for (const child of Array.from(documentFragment.getChildren())) {\r\n        if (child.is('element', 'style')) {\r\n            writer.remove(child);\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module paste-from-office/filters/space\r\n */\r\n/**\r\n * Replaces last space preceding elements closing tag with `&nbsp;`. Such operation prevents spaces from being removed\r\n * during further DOM/View processing (see especially {@link module:engine/view/domconverter~DomConverter#_processDataFromDomText}).\r\n * This method also takes into account Word specific `<o:p></o:p>` empty tags.\r\n * Additionally multiline sequences of spaces and new lines between tags are removed (see #39 and #40).\r\n *\r\n * @param htmlString HTML string in which spacing should be normalized.\r\n * @returns Input HTML with spaces normalized.\r\n */\r\nexport function normalizeSpacing(htmlString) {\r\n    // Run normalizeSafariSpaceSpans() two times to cover nested spans.\r\n    return normalizeSafariSpaceSpans(normalizeSafariSpaceSpans(htmlString))\r\n        // Remove all \\r\\n from \"spacerun spans\" so the last replace line doesn't strip all whitespaces.\r\n        .replace(/(<span\\s+style=['\"]mso-spacerun:yes['\"]>[^\\S\\r\\n]*?)[\\r\\n]+([^\\S\\r\\n]*<\\/span>)/g, '$1$2')\r\n        .replace(/<span\\s+style=['\"]mso-spacerun:yes['\"]><\\/span>/g, '')\r\n        .replace(/ <\\//g, '\\u00A0</')\r\n        .replace(/ <o:p><\\/o:p>/g, '\\u00A0<o:p></o:p>')\r\n        // Remove <o:p> block filler from empty paragraph. Safari uses \\u00A0 instead of &nbsp;.\r\n        .replace(/<o:p>(&nbsp;|\\u00A0)<\\/o:p>/g, '')\r\n        // Remove all whitespaces when they contain any \\r or \\n.\r\n        .replace(/>([^\\S\\r\\n]*[\\r\\n]\\s*)</g, '><');\r\n}\r\n/**\r\n * Normalizes spacing in special Word `spacerun spans` (`<span style='mso-spacerun:yes'>\\s+</span>`) by replacing\r\n * all spaces with `&nbsp; ` pairs. This prevents spaces from being removed during further DOM/View processing\r\n * (see especially {@link module:engine/view/domconverter~DomConverter#_processDataFromDomText}).\r\n *\r\n * @param htmlDocument Native `Document` object in which spacing should be normalized.\r\n */\r\nexport function normalizeSpacerunSpans(htmlDocument) {\r\n    htmlDocument.querySelectorAll('span[style*=spacerun]').forEach(el => {\r\n        const htmlElement = el;\r\n        const innerTextLength = htmlElement.innerText.length || 0;\r\n        htmlElement.innerText = Array(innerTextLength + 1).join('\\u00A0 ').substr(0, innerTextLength);\r\n    });\r\n}\r\n/**\r\n * Normalizes specific spacing generated by Safari when content pasted from Word (`<span class=\"Apple-converted-space\"> </span>`)\r\n * by replacing all spaces sequences longer than 1 space with `&nbsp; ` pairs. This prevents spaces from being removed during\r\n * further DOM/View processing (see especially {@link module:engine/view/domconverter~DomConverter#_processDataFromDomText}).\r\n *\r\n * This function is similar to {@link module:clipboard/utils/normalizeclipboarddata normalizeClipboardData util} but uses\r\n * regular spaces / &nbsp; sequence for replacement.\r\n *\r\n * @param htmlString HTML string in which spacing should be normalized\r\n * @returns Input HTML with spaces normalized.\r\n */\r\nfunction normalizeSafariSpaceSpans(htmlString) {\r\n    return htmlString.replace(/<span(?: class=\"Apple-converted-space\"|)>(\\s+)<\\/span>/g, (fullMatch, spaces) => {\r\n        return spaces.length === 1 ? ' ' : Array(spaces.length + 1).join('\\u00A0 ').substr(0, spaces.length);\r\n    });\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module paste-from-office/filters/parse\r\n */\r\n/* globals DOMParser */\r\nimport { DomConverter, ViewDocument } from 'ckeditor5/src/engine';\r\nimport { normalizeSpacing, normalizeSpacerunSpans } from './space';\r\n/**\r\n * Parses the provided HTML extracting contents of `<body>` and `<style>` tags.\r\n *\r\n * @param htmlString HTML string to be parsed.\r\n */\r\nexport function parseHtml(htmlString, stylesProcessor) {\r\n    const domParser = new DOMParser();\r\n    // Remove Word specific \"if comments\" so content inside is not omitted by the parser.\r\n    htmlString = htmlString.replace(/<!--\\[if gte vml 1]>/g, '');\r\n    const normalizedHtml = normalizeSpacing(cleanContentAfterBody(htmlString));\r\n    // Parse htmlString as native Document object.\r\n    const htmlDocument = domParser.parseFromString(normalizedHtml, 'text/html');\r\n    normalizeSpacerunSpans(htmlDocument);\r\n    // Get `innerHTML` first as transforming to View modifies the source document.\r\n    const bodyString = htmlDocument.body.innerHTML;\r\n    // Transform document.body to View.\r\n    const bodyView = documentToView(htmlDocument, stylesProcessor);\r\n    // Extract stylesheets.\r\n    const stylesObject = extractStyles(htmlDocument);\r\n    return {\r\n        body: bodyView,\r\n        bodyString,\r\n        styles: stylesObject.styles,\r\n        stylesString: stylesObject.stylesString\r\n    };\r\n}\r\n/**\r\n * Transforms native `Document` object into {@link module:engine/view/documentfragment~DocumentFragment}. Comments are skipped.\r\n *\r\n * @param htmlDocument Native `Document` object to be transformed.\r\n */\r\nfunction documentToView(htmlDocument, stylesProcessor) {\r\n    const viewDocument = new ViewDocument(stylesProcessor);\r\n    const domConverter = new DomConverter(viewDocument, { renderingMode: 'data' });\r\n    const fragment = htmlDocument.createDocumentFragment();\r\n    const nodes = htmlDocument.body.childNodes;\r\n    while (nodes.length > 0) {\r\n        fragment.appendChild(nodes[0]);\r\n    }\r\n    return domConverter.domToView(fragment, { skipComments: true });\r\n}\r\n/**\r\n * Extracts both `CSSStyleSheet` and string representation from all `style` elements available in a provided `htmlDocument`.\r\n *\r\n * @param htmlDocument Native `Document` object from which styles will be extracted.\r\n */\r\nfunction extractStyles(htmlDocument) {\r\n    const styles = [];\r\n    const stylesString = [];\r\n    const styleTags = Array.from(htmlDocument.getElementsByTagName('style'));\r\n    for (const style of styleTags) {\r\n        if (style.sheet && style.sheet.cssRules && style.sheet.cssRules.length) {\r\n            styles.push(style.sheet);\r\n            stylesString.push(style.innerHTML);\r\n        }\r\n    }\r\n    return {\r\n        styles,\r\n        stylesString: stylesString.join(' ')\r\n    };\r\n}\r\n/**\r\n * Removes leftover content from between closing </body> and closing </html> tag:\r\n *\r\n * ```html\r\n * <html><body><p>Foo Bar</p></body><span>Fo</span></html> -> <html><body><p>Foo Bar</p></body></html>\r\n * ```\r\n *\r\n * This function is used as specific browsers (Edge) add some random content after `body` tag when pasting from Word.\r\n * @param htmlString The HTML string to be cleaned.\r\n * @returns The HTML string with leftover content removed.\r\n */\r\nfunction cleanContentAfterBody(htmlString) {\r\n    const bodyCloseTag = '</body>';\r\n    const htmlCloseTag = '</html>';\r\n    const bodyCloseIndex = htmlString.indexOf(bodyCloseTag);\r\n    if (bodyCloseIndex < 0) {\r\n        return htmlString;\r\n    }\r\n    const htmlCloseIndex = htmlString.indexOf(htmlCloseTag, bodyCloseIndex + bodyCloseTag.length);\r\n    return htmlString.substring(0, bodyCloseIndex + bodyCloseTag.length) +\r\n        (htmlCloseIndex >= 0 ? htmlString.substring(htmlCloseIndex) : '');\r\n}\r\n","export default \"<svg viewBox=\\\"0 0 20 20\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M8.69 14.915c.053.052.173.083.36.093a.366.366 0 0 1 .345.485l-.003.01a.738.738 0 0 1-.697.497h-2.67a.374.374 0 0 1-.353-.496l.013-.038a.681.681 0 0 1 .644-.458c.197-.012.325-.043.386-.093a.28.28 0 0 0 .072-.11L9.592 4.5H6.269c-.359-.017-.609.013-.75.09-.142.078-.289.265-.442.563-.192.29-.516.464-.864.464H4.17a.43.43 0 0 1-.407-.569L4.46 3h13.08l-.62 2.043a.81.81 0 0 1-.775.574h-.114a.486.486 0 0 1-.486-.486c.001-.284-.054-.464-.167-.54-.112-.076-.367-.106-.766-.091h-3.28l-2.68 10.257c-.006.074.007.127.038.158zM3 17h8a.5.5 0 1 1 0 1H3a.5.5 0 1 1 0-1zm11.299 1.17a.75.75 0 1 1-1.06-1.06l1.414-1.415-1.415-1.414a.75.75 0 0 1 1.06-1.06l1.415 1.414 1.414-1.415a.75.75 0 1 1 1.06 1.06l-1.413 1.415 1.414 1.415a.75.75 0 0 1-1.06 1.06l-1.415-1.414-1.414 1.414z\\\"/></svg>\";","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module remove-format/removeformatui\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { ButtonView } from 'ckeditor5/src/ui';\r\nimport removeFormatIcon from '../theme/icons/remove-format.svg';\r\nconst REMOVE_FORMAT = 'removeFormat';\r\n/**\r\n * The remove format UI plugin. It registers the `'removeFormat'` button which can be\r\n * used in the toolbar.\r\n */\r\nexport default class RemoveFormatUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'RemoveFormatUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        editor.ui.componentFactory.add(REMOVE_FORMAT, locale => {\r\n            const command = editor.commands.get(REMOVE_FORMAT);\r\n            const view = new ButtonView(locale);\r\n            view.set({\r\n                label: t('Remove Format'),\r\n                icon: removeFormatIcon,\r\n                tooltip: true\r\n            });\r\n            view.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\r\n            // Execute the command.\r\n            this.listenTo(view, 'execute', () => {\r\n                editor.execute(REMOVE_FORMAT);\r\n                editor.editing.view.focus();\r\n            });\r\n            return view;\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { first } from 'ckeditor5/src/utils';\r\n/**\r\n * The remove format command.\r\n *\r\n * It is used by the {@link module:remove-format/removeformat~RemoveFormat remove format feature}\r\n * to clear the formatting in the selection.\r\n *\r\n * ```ts\r\n * editor.execute( 'removeFormat' );\r\n * ```\r\n */\r\nexport default class RemoveFormatCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const model = this.editor.model;\r\n        this.isEnabled = !!first(this._getFormattingItems(model.document.selection, model.schema));\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    execute() {\r\n        const model = this.editor.model;\r\n        const schema = model.schema;\r\n        model.change(writer => {\r\n            for (const item of this._getFormattingItems(model.document.selection, schema)) {\r\n                if (item.is('selection')) {\r\n                    for (const attributeName of this._getFormattingAttributes(item, schema)) {\r\n                        writer.removeSelectionAttribute(attributeName);\r\n                    }\r\n                }\r\n                else {\r\n                    // Workaround for items with multiple removable attributes. See\r\n                    // https://github.com/ckeditor/ckeditor5-remove-format/pull/1#pullrequestreview-220515609\r\n                    const itemRange = writer.createRangeOn(item);\r\n                    for (const attributeName of this._getFormattingAttributes(item, schema)) {\r\n                        writer.removeAttribute(attributeName, itemRange);\r\n                    }\r\n                }\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Returns an iterable of items in a selection (including the selection itself) that have formatting model\r\n     * attributes to be removed by the feature.\r\n     *\r\n     * @param schema The schema describing the item.\r\n     */\r\n    *_getFormattingItems(selection, schema) {\r\n        const itemHasRemovableFormatting = (item) => {\r\n            return !!first(this._getFormattingAttributes(item, schema));\r\n        };\r\n        // Check formatting on selected items that are not blocks.\r\n        for (const curRange of selection.getRanges()) {\r\n            for (const item of curRange.getItems()) {\r\n                if (!schema.isBlock(item) && itemHasRemovableFormatting(item)) {\r\n                    yield item;\r\n                }\r\n            }\r\n        }\r\n        // Check formatting from selected blocks.\r\n        for (const block of selection.getSelectedBlocks()) {\r\n            if (itemHasRemovableFormatting(block)) {\r\n                yield block;\r\n            }\r\n        }\r\n        // Finally the selection might be formatted as well, so make sure to check it.\r\n        if (itemHasRemovableFormatting(selection)) {\r\n            yield selection;\r\n        }\r\n    }\r\n    /**\r\n     * Returns an iterable of formatting attributes of a given model item.\r\n     *\r\n     * **Note:** Formatting items have the `isFormatting` property set to `true`.\r\n     *\r\n     * @param schema The schema describing the item.\r\n     * @returns The names of formatting attributes found in a given item.\r\n     */\r\n    *_getFormattingAttributes(item, schema) {\r\n        for (const [attributeName] of item.getAttributes()) {\r\n            const attributeProperties = schema.getAttributeProperties(attributeName);\r\n            if (attributeProperties && attributeProperties.isFormatting) {\r\n                yield attributeName;\r\n            }\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module remove-format/removeformatediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport RemoveFormatCommand from './removeformatcommand';\r\n/**\r\n * The remove format editing plugin.\r\n *\r\n * It registers the {@link module:remove-format/removeformatcommand~RemoveFormatCommand removeFormat} command.\r\n */\r\nexport default class RemoveFormatEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'RemoveFormatEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        editor.commands.add('removeFormat', new RemoveFormatCommand(editor));\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module source-editing/utils/formathtml\r\n */\r\n/**\r\n * A simple (and naive) HTML code formatter that returns a formatted HTML markup that can be easily\r\n * parsed by human eyes. It beautifies the HTML code by adding new lines between elements that behave like block elements\r\n * (https://developer.mozilla.org/en-US/docs/Web/HTML/Block-level_elements\r\n * and a few more like `tr`, `td`, and similar ones) and inserting indents for nested content.\r\n *\r\n * WARNING: This function works only on a text that does not contain any indentations or new lines.\r\n * Calling this function on the already formatted text will damage the formatting.\r\n *\r\n * @param input An HTML string to format.\r\n */\r\nexport function formatHtml(input) {\r\n    // A list of block-like elements around which the new lines should be inserted, and within which\r\n    // the indentation of their children should be increased.\r\n    // The list is partially based on https://developer.mozilla.org/en-US/docs/Web/HTML/Block-level_elements that contains\r\n    // a full list of HTML block-level elements.\r\n    // A void element is an element that cannot have any child - https://html.spec.whatwg.org/multipage/syntax.html#void-elements.\r\n    // Note that <pre> element is not listed on this list to avoid breaking whitespace formatting.\r\n    const elementsToFormat = [\r\n        { name: 'address', isVoid: false },\r\n        { name: 'article', isVoid: false },\r\n        { name: 'aside', isVoid: false },\r\n        { name: 'blockquote', isVoid: false },\r\n        { name: 'br', isVoid: true },\r\n        { name: 'details', isVoid: false },\r\n        { name: 'dialog', isVoid: false },\r\n        { name: 'dd', isVoid: false },\r\n        { name: 'div', isVoid: false },\r\n        { name: 'dl', isVoid: false },\r\n        { name: 'dt', isVoid: false },\r\n        { name: 'fieldset', isVoid: false },\r\n        { name: 'figcaption', isVoid: false },\r\n        { name: 'figure', isVoid: false },\r\n        { name: 'footer', isVoid: false },\r\n        { name: 'form', isVoid: false },\r\n        { name: 'h1', isVoid: false },\r\n        { name: 'h2', isVoid: false },\r\n        { name: 'h3', isVoid: false },\r\n        { name: 'h4', isVoid: false },\r\n        { name: 'h5', isVoid: false },\r\n        { name: 'h6', isVoid: false },\r\n        { name: 'header', isVoid: false },\r\n        { name: 'hgroup', isVoid: false },\r\n        { name: 'hr', isVoid: true },\r\n        { name: 'input', isVoid: true },\r\n        { name: 'li', isVoid: false },\r\n        { name: 'main', isVoid: false },\r\n        { name: 'nav', isVoid: false },\r\n        { name: 'ol', isVoid: false },\r\n        { name: 'p', isVoid: false },\r\n        { name: 'section', isVoid: false },\r\n        { name: 'table', isVoid: false },\r\n        { name: 'tbody', isVoid: false },\r\n        { name: 'td', isVoid: false },\r\n        { name: 'textarea', isVoid: false },\r\n        { name: 'th', isVoid: false },\r\n        { name: 'thead', isVoid: false },\r\n        { name: 'tr', isVoid: false },\r\n        { name: 'ul', isVoid: false }\r\n    ];\r\n    const elementNamesToFormat = elementsToFormat.map(element => element.name).join('|');\r\n    // It is not the fastest way to format the HTML markup but the performance should be good enough.\r\n    const lines = input\r\n        // Add new line before and after `<tag>` and `</tag>`.\r\n        // It may separate individual elements with two new lines, but this will be fixed below.\r\n        .replace(new RegExp(`</?(${elementNamesToFormat})( .*?)?>`, 'g'), '\\n$&\\n')\r\n        // Divide input string into lines, which start with either an opening tag, a closing tag, or just a text.\r\n        .split('\\n');\r\n    let indentCount = 0;\r\n    return lines\r\n        .filter(line => line.length)\r\n        .map(line => {\r\n        if (isNonVoidOpeningTag(line, elementsToFormat)) {\r\n            return indentLine(line, indentCount++);\r\n        }\r\n        if (isClosingTag(line, elementsToFormat)) {\r\n            return indentLine(line, --indentCount);\r\n        }\r\n        return indentLine(line, indentCount);\r\n    })\r\n        .join('\\n');\r\n}\r\n/**\r\n * Checks, if an argument is an opening tag of a non-void element to be formatted.\r\n *\r\n * @param line String to check.\r\n * @param elementsToFormat Elements to be formatted.\r\n */\r\nfunction isNonVoidOpeningTag(line, elementsToFormat) {\r\n    return elementsToFormat.some(element => {\r\n        if (element.isVoid) {\r\n            return false;\r\n        }\r\n        if (!new RegExp(`<${element.name}( .*?)?>`).test(line)) {\r\n            return false;\r\n        }\r\n        return true;\r\n    });\r\n}\r\n/**\r\n * Checks, if an argument is a closing tag.\r\n *\r\n * @param line String to check.\r\n * @param elementsToFormat Elements to be formatted.\r\n */\r\nfunction isClosingTag(line, elementsToFormat) {\r\n    return elementsToFormat.some(element => {\r\n        return new RegExp(`</${element.name}>`).test(line);\r\n    });\r\n}\r\n/**\r\n * Indents a line by a specified number of characters.\r\n *\r\n * @param line Line to indent.\r\n * @param indentCount Number of characters to use for indentation.\r\n * @param indentChar Indentation character(s). 4 spaces by default.\r\n */\r\nfunction indentLine(line, indentCount, indentChar = '    ') {\r\n    // More about Math.max() here in https://github.com/ckeditor/ckeditor5/issues/10698.\r\n    return `${indentChar.repeat(Math.max(0, indentCount))}${line}`;\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./sourceediting.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module source-editing/sourceediting\r\n */\r\n/* global console */\r\nimport { Plugin, PendingActions } from 'ckeditor5/src/core';\r\nimport { ButtonView } from 'ckeditor5/src/ui';\r\nimport { createElement, ElementReplacer } from 'ckeditor5/src/utils';\r\nimport { formatHtml } from './utils/formathtml';\r\nimport '../theme/sourceediting.css';\r\nimport sourceEditingIcon from '../theme/icons/source-editing.svg';\r\nconst COMMAND_FORCE_DISABLE_ID = 'SourceEditingMode';\r\n/**\r\n * The source editing feature.\r\n *\r\n * It provides the possibility to view and edit the source of the document.\r\n *\r\n * For a detailed overview, check the {@glink features/source-editing source editing feature documentation} and the\r\n * {@glink api/source-editing package page}.\r\n */\r\nexport default class SourceEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'SourceEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [PendingActions];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        this.set('isSourceEditingMode', false);\r\n        this._elementReplacer = new ElementReplacer();\r\n        this._replacedRoots = new Map();\r\n        this._dataFromRoots = new Map();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        editor.ui.componentFactory.add('sourceEditing', locale => {\r\n            const buttonView = new ButtonView(locale);\r\n            buttonView.set({\r\n                label: t('Source'),\r\n                icon: sourceEditingIcon,\r\n                tooltip: true,\r\n                withText: true,\r\n                class: 'ck-source-editing-button'\r\n            });\r\n            buttonView.bind('isOn').to(this, 'isSourceEditingMode');\r\n            // The button should be disabled if one of the following conditions is met:\r\n            buttonView.bind('isEnabled').to(this, 'isEnabled', editor, 'isReadOnly', editor.plugins.get(PendingActions), 'hasAny', (isEnabled, isEditorReadOnly, hasAnyPendingActions) => {\r\n                // (1) The plugin itself is disabled.\r\n                if (!isEnabled) {\r\n                    return false;\r\n                }\r\n                // (2) The editor is in read-only mode.\r\n                if (isEditorReadOnly) {\r\n                    return false;\r\n                }\r\n                // (3) Any pending action is scheduled. It may change the model, so modifying the document source should be prevented\r\n                // until the model is finally set.\r\n                if (hasAnyPendingActions) {\r\n                    return false;\r\n                }\r\n                return true;\r\n            });\r\n            this.listenTo(buttonView, 'execute', () => {\r\n                this.isSourceEditingMode = !this.isSourceEditingMode;\r\n            });\r\n            return buttonView;\r\n        });\r\n        // Currently, the plugin handles the source editing mode by itself only for the classic editor. To use this plugin with other\r\n        // integrations, listen to the `change:isSourceEditingMode` event and act accordingly.\r\n        if (this._isAllowedToHandleSourceEditingMode()) {\r\n            this.on('change:isSourceEditingMode', (evt, name, isSourceEditingMode) => {\r\n                if (isSourceEditingMode) {\r\n                    this._showSourceEditing();\r\n                    this._disableCommands();\r\n                }\r\n                else {\r\n                    this._hideSourceEditing();\r\n                    this._enableCommands();\r\n                }\r\n            });\r\n            this.on('change:isEnabled', (evt, name, isEnabled) => this._handleReadOnlyMode(!isEnabled));\r\n            this.listenTo(editor, 'change:isReadOnly', (evt, name, isReadOnly) => this._handleReadOnlyMode(isReadOnly));\r\n        }\r\n        // Update the editor data while calling editor.getData() in the source editing mode.\r\n        editor.data.on('get', () => {\r\n            if (this.isSourceEditingMode) {\r\n                this.updateEditorData();\r\n            }\r\n        }, { priority: 'high' });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    afterInit() {\r\n        const editor = this.editor;\r\n        const collaborationPluginNamesToWarn = [\r\n            'RealTimeCollaborativeEditing',\r\n            'CommentsEditing',\r\n            'TrackChangesEditing',\r\n            'RevisionHistory'\r\n        ];\r\n        // Currently, the basic integration with Collaboration Features is to display a warning in the console.\r\n        if (collaborationPluginNamesToWarn.some(pluginName => editor.plugins.has(pluginName))) {\r\n            console.warn('You initialized the editor with the source editing feature and at least one of the collaboration features. ' +\r\n                'Please be advised that the source editing feature may not work, and be careful when editing document source ' +\r\n                'that contains markers created by the collaboration features.');\r\n        }\r\n        // Restricted Editing integration can also lead to problems. Warn the user accordingly.\r\n        if (editor.plugins.has('RestrictedEditingModeEditing')) {\r\n            console.warn('You initialized the editor with the source editing feature and restricted editing feature. ' +\r\n                'Please be advised that the source editing feature may not work, and be careful when editing document source ' +\r\n                'that contains markers created by the restricted editing feature.');\r\n        }\r\n    }\r\n    /**\r\n     * Updates the source data in all hidden editing roots.\r\n     */\r\n    updateEditorData() {\r\n        const editor = this.editor;\r\n        const data = {};\r\n        for (const [rootName, domSourceEditingElementWrapper] of this._replacedRoots) {\r\n            const oldData = this._dataFromRoots.get(rootName);\r\n            const newData = domSourceEditingElementWrapper.dataset.value;\r\n            // Do not set the data unless some changes have been made in the meantime.\r\n            // This prevents empty undo steps after switching to the normal editor.\r\n            if (oldData !== newData) {\r\n                data[rootName] = newData;\r\n            }\r\n        }\r\n        if (Object.keys(data).length) {\r\n            editor.data.set(data, { batchType: { isUndoable: true } });\r\n        }\r\n    }\r\n    /**\r\n     * Creates source editing wrappers that replace each editing root. Each wrapper contains the document source from the corresponding\r\n     * root.\r\n     *\r\n     * The wrapper element contains a textarea and it solves the problem, that the textarea element cannot auto expand its height based on\r\n     * the content it contains. The solution is to make the textarea more like a plain div element, which expands in height as much as it\r\n     * needs to, in order to display the whole document source without scrolling. The wrapper element is a parent for the textarea and for\r\n     * the pseudo-element `::after`, that replicates the look, content, and position of the textarea. The pseudo-element replica is hidden,\r\n     * but it is styled to be an identical visual copy of the textarea with the same content. Then, the wrapper is a grid container and both\r\n     * of its children (the textarea and the `::after` pseudo-element) are positioned within a CSS grid to occupy the same grid cell. The\r\n     * content in the pseudo-element `::after` is set in CSS and it stretches the grid to the appropriate size based on the textarea value.\r\n     * Since both children occupy the same grid cell, both have always the same height.\r\n     */\r\n    _showSourceEditing() {\r\n        const editor = this.editor;\r\n        const editingView = editor.editing.view;\r\n        const model = editor.model;\r\n        model.change(writer => {\r\n            writer.setSelection(null);\r\n            writer.removeSelectionAttribute(model.document.selection.getAttributeKeys());\r\n        });\r\n        // It is not needed to iterate through all editing roots, as currently the plugin supports only the Classic Editor with a single\r\n        // main root, but this code may help understand and use this feature in external integrations.\r\n        for (const [rootName, domRootElement] of editingView.domRoots) {\r\n            const data = formatSource(editor.data.get({ rootName }));\r\n            const domSourceEditingElementTextarea = createElement(domRootElement.ownerDocument, 'textarea', {\r\n                rows: '1',\r\n                'aria-label': 'Source code editing area'\r\n            });\r\n            const domSourceEditingElementWrapper = createElement(domRootElement.ownerDocument, 'div', {\r\n                class: 'ck-source-editing-area',\r\n                'data-value': data\r\n            }, [domSourceEditingElementTextarea]);\r\n            domSourceEditingElementTextarea.value = data;\r\n            // Setting a value to textarea moves the input cursor to the end. We want the selection at the beginning.\r\n            domSourceEditingElementTextarea.setSelectionRange(0, 0);\r\n            // Bind the textarea's value to the wrapper's `data-value` property. Each change of the textarea's value updates the\r\n            // wrapper's `data-value` property.\r\n            domSourceEditingElementTextarea.addEventListener('input', () => {\r\n                domSourceEditingElementWrapper.dataset.value = domSourceEditingElementTextarea.value;\r\n                editor.ui.update();\r\n            });\r\n            editingView.change(writer => {\r\n                const viewRoot = editingView.document.getRoot(rootName);\r\n                writer.addClass('ck-hidden', viewRoot);\r\n            });\r\n            // Register the element so it becomes available for Alt+F10 and Esc navigation.\r\n            editor.ui.setEditableElement('sourceEditing:' + rootName, domSourceEditingElementTextarea);\r\n            this._replacedRoots.set(rootName, domSourceEditingElementWrapper);\r\n            this._elementReplacer.replace(domRootElement, domSourceEditingElementWrapper);\r\n            this._dataFromRoots.set(rootName, data);\r\n        }\r\n        this._focusSourceEditing();\r\n    }\r\n    /**\r\n     * Restores all hidden editing roots and sets the source data in them.\r\n     */\r\n    _hideSourceEditing() {\r\n        const editor = this.editor;\r\n        const editingView = editor.editing.view;\r\n        this.updateEditorData();\r\n        editingView.change(writer => {\r\n            for (const [rootName] of this._replacedRoots) {\r\n                writer.removeClass('ck-hidden', editingView.document.getRoot(rootName));\r\n            }\r\n        });\r\n        this._elementReplacer.restore();\r\n        this._replacedRoots.clear();\r\n        this._dataFromRoots.clear();\r\n        editingView.focus();\r\n    }\r\n    /**\r\n     * Focuses the textarea containing document source from the first editing root.\r\n     */\r\n    _focusSourceEditing() {\r\n        const editor = this.editor;\r\n        const [domSourceEditingElementWrapper] = this._replacedRoots.values();\r\n        const textarea = domSourceEditingElementWrapper.querySelector('textarea');\r\n        // The FocusObserver was disabled by View.render() while the DOM root was getting hidden and the replacer\r\n        // revealed the textarea. So it couldn't notice that the DOM root got blurred in the process.\r\n        // Let's sync this state manually here because otherwise Renderer will attempt to render selection\r\n        // in an invisible DOM root.\r\n        editor.editing.view.document.isFocused = false;\r\n        textarea.focus();\r\n    }\r\n    /**\r\n     * Disables all commands.\r\n     */\r\n    _disableCommands() {\r\n        const editor = this.editor;\r\n        for (const command of editor.commands.commands()) {\r\n            command.forceDisabled(COMMAND_FORCE_DISABLE_ID);\r\n        }\r\n    }\r\n    /**\r\n     * Clears forced disable for all commands, that was previously set through {@link #_disableCommands}.\r\n     */\r\n    _enableCommands() {\r\n        const editor = this.editor;\r\n        for (const command of editor.commands.commands()) {\r\n            command.clearForceDisabled(COMMAND_FORCE_DISABLE_ID);\r\n        }\r\n    }\r\n    /**\r\n     * Adds or removes the `readonly` attribute from the textarea from all roots, if document source mode is active.\r\n     *\r\n     * @param isReadOnly Indicates whether all textarea elements should be read-only.\r\n     */\r\n    _handleReadOnlyMode(isReadOnly) {\r\n        if (!this.isSourceEditingMode) {\r\n            return;\r\n        }\r\n        for (const [, domSourceEditingElementWrapper] of this._replacedRoots) {\r\n            domSourceEditingElementWrapper.querySelector('textarea').readOnly = isReadOnly;\r\n        }\r\n    }\r\n    /**\r\n     * Checks, if the plugin is allowed to handle the source editing mode by itself. Currently, the source editing mode is supported only\r\n     * for the {@link module:editor-classic/classiceditor~ClassicEditor classic editor}.\r\n     */\r\n    _isAllowedToHandleSourceEditingMode() {\r\n        const editor = this.editor;\r\n        const editable = editor.ui.view.editable;\r\n        // Checks, if the editor's editable belongs to the editor's DOM tree.\r\n        return editable && !editable.hasExternalElement;\r\n    }\r\n}\r\n/**\r\n * Formats the content for a better readability.\r\n *\r\n * For a non-HTML source the unchanged input string is returned.\r\n *\r\n * @param input Input string to check.\r\n */\r\nfunction formatSource(input) {\r\n    if (!isHtml(input)) {\r\n        return input;\r\n    }\r\n    return formatHtml(input);\r\n}\r\n/**\r\n * Checks, if the document source is HTML. It is sufficient to just check the first character from the document data.\r\n *\r\n * @param input Input string to check.\r\n */\r\nfunction isHtml(input) {\r\n    return input.startsWith('<');\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module special-characters/ui/specialcharactersnavigationview\r\n */\r\nimport { Collection } from 'ckeditor5/src/utils';\r\nimport { addListToDropdown, createDropdown, Model, FormHeaderView } from 'ckeditor5/src/ui';\r\n/**\r\n * A class representing the navigation part of the special characters UI. It is responsible\r\n * for describing the feature and allowing the user to select a particular character group.\r\n */\r\nexport default class SpecialCharactersNavigationView extends FormHeaderView {\r\n    /**\r\n     * Creates an instance of the {@link module:special-characters/ui/specialcharactersnavigationview~SpecialCharactersNavigationView}\r\n     * class.\r\n     *\r\n     * @param locale The localization services instance.\r\n     * @param groupNames The names of the character groups and their displayed labels.\r\n     */\r\n    constructor(locale, groupNames) {\r\n        super(locale);\r\n        const t = locale.t;\r\n        this.set('class', 'ck-special-characters-navigation');\r\n        this.groupDropdownView = this._createGroupDropdown(groupNames);\r\n        this.groupDropdownView.panelPosition = locale.uiLanguageDirection === 'rtl' ? 'se' : 'sw';\r\n        this.label = t('Special characters');\r\n        this.children.add(this.groupDropdownView);\r\n    }\r\n    /**\r\n     * Returns the name of the character group currently selected in the {@link #groupDropdownView}.\r\n     */\r\n    get currentGroupName() {\r\n        return this.groupDropdownView.value;\r\n    }\r\n    /**\r\n     * Focuses the character categories dropdown.\r\n     */\r\n    focus() {\r\n        this.groupDropdownView.focus();\r\n    }\r\n    /**\r\n     * Returns a dropdown that allows selecting character groups.\r\n     *\r\n     * @param groupNames The names of the character groups and their displayed labels.\r\n     */\r\n    _createGroupDropdown(groupNames) {\r\n        const locale = this.locale;\r\n        const t = locale.t;\r\n        const dropdown = createDropdown(locale);\r\n        const groupDefinitions = this._getCharacterGroupListItemDefinitions(dropdown, groupNames);\r\n        const accessibleLabel = t('Character categories');\r\n        dropdown.set('value', groupDefinitions.first.model.name);\r\n        dropdown.buttonView.bind('label').to(dropdown, 'value', value => groupNames.get(value));\r\n        dropdown.buttonView.set({\r\n            isOn: false,\r\n            withText: true,\r\n            tooltip: accessibleLabel,\r\n            class: ['ck-dropdown__button_label-width_auto'],\r\n            ariaLabel: accessibleLabel,\r\n            ariaLabelledBy: undefined\r\n        });\r\n        dropdown.on('execute', evt => {\r\n            dropdown.value = evt.source.name;\r\n        });\r\n        dropdown.delegate('execute').to(this);\r\n        addListToDropdown(dropdown, groupDefinitions, {\r\n            ariaLabel: accessibleLabel,\r\n            role: 'menu'\r\n        });\r\n        return dropdown;\r\n    }\r\n    /**\r\n     * Returns list item definitions to be used in the character group dropdown\r\n     * representing specific character groups.\r\n     *\r\n     * @param dropdown Dropdown view element\r\n     * @param groupNames The names of the character groups and their displayed labels.\r\n     */\r\n    _getCharacterGroupListItemDefinitions(dropdown, groupNames) {\r\n        const groupDefs = new Collection();\r\n        for (const [name, label] of groupNames) {\r\n            const model = new Model({\r\n                name,\r\n                label,\r\n                withText: true,\r\n                role: 'menuitemradio'\r\n            });\r\n            model.bind('isOn').to(dropdown, 'value', value => value === model.name);\r\n            groupDefs.add({ type: 'button', model });\r\n        }\r\n        return groupDefs;\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./charactergrid.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module special-characters/ui/charactergridview\r\n */\r\nimport { View, ButtonView, addKeyboardHandlingForGrid } from 'ckeditor5/src/ui';\r\nimport { KeystrokeHandler, FocusTracker, global } from 'ckeditor5/src/utils';\r\nimport '../../theme/charactergrid.css';\r\n/**\r\n * A grid of character tiles. It allows browsing special characters and selecting the character to\r\n * be inserted into the content.\r\n */\r\nexport default class CharacterGridView extends View {\r\n    /**\r\n     * Creates an instance of a character grid containing tiles representing special characters.\r\n     *\r\n     * @param locale The localization services instance.\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        this.tiles = this.createCollection();\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            children: [\r\n                {\r\n                    tag: 'div',\r\n                    attributes: {\r\n                        class: [\r\n                            'ck',\r\n                            'ck-character-grid__tiles'\r\n                        ]\r\n                    },\r\n                    children: this.tiles\r\n                }\r\n            ],\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-character-grid'\r\n                ]\r\n            }\r\n        });\r\n        this.focusTracker = new FocusTracker();\r\n        this.keystrokes = new KeystrokeHandler();\r\n        addKeyboardHandlingForGrid({\r\n            keystrokeHandler: this.keystrokes,\r\n            focusTracker: this.focusTracker,\r\n            gridItems: this.tiles,\r\n            numberOfColumns: () => global.window\r\n                .getComputedStyle(this.element.firstChild) // Responsive .ck-character-grid__tiles\r\n                .getPropertyValue('grid-template-columns')\r\n                .split(' ')\r\n                .length,\r\n            uiLanguageDirection: this.locale && this.locale.uiLanguageDirection\r\n        });\r\n    }\r\n    /**\r\n     * Creates a new tile for the grid.\r\n     *\r\n     * @param character A human-readable character displayed as the label (e.g. \"ε\").\r\n     * @param name The name of the character (e.g. \"greek small letter epsilon\").\r\n     */\r\n    createTile(character, name) {\r\n        const tile = new ButtonView(this.locale);\r\n        tile.set({\r\n            label: character,\r\n            withText: true,\r\n            class: 'ck-character-grid__tile'\r\n        });\r\n        // Labels are vital for the users to understand what character they're looking at.\r\n        // For now we're using native title attribute for that, see #5817.\r\n        tile.extendTemplate({\r\n            attributes: {\r\n                title: name\r\n            },\r\n            on: {\r\n                mouseover: tile.bindTemplate.to('mouseover'),\r\n                focus: tile.bindTemplate.to('focus')\r\n            }\r\n        });\r\n        tile.on('mouseover', () => {\r\n            this.fire('tileHover', { name, character });\r\n        });\r\n        tile.on('focus', () => {\r\n            this.fire('tileFocus', { name, character });\r\n        });\r\n        tile.on('execute', () => {\r\n            this.fire('execute', { name, character });\r\n        });\r\n        return tile;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        for (const item of this.tiles) {\r\n            this.focusTracker.add(item.element);\r\n        }\r\n        this.tiles.on('change', (eventInfo, { added, removed }) => {\r\n            if (added.length > 0) {\r\n                for (const item of added) {\r\n                    this.focusTracker.add(item.element);\r\n                }\r\n            }\r\n            if (removed.length > 0) {\r\n                for (const item of removed) {\r\n                    this.focusTracker.remove(item.element);\r\n                }\r\n            }\r\n        });\r\n        this.keystrokes.listenTo(this.element);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        this.keystrokes.destroy();\r\n    }\r\n    /**\r\n     * Focuses the first focusable in {@link ~CharacterGridView#tiles}.\r\n     */\r\n    focus() {\r\n        this.tiles.first.focus();\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./characterinfo.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { View } from 'ckeditor5/src/ui';\r\nimport '../../theme/characterinfo.css';\r\n/**\r\n * The view displaying detailed information about a special character glyph, e.g. upon\r\n * hovering it with a mouse.\r\n */\r\nexport default class CharacterInfoView extends View {\r\n    constructor(locale) {\r\n        super(locale);\r\n        const bind = this.bindTemplate;\r\n        this.set('character', null);\r\n        this.set('name', null);\r\n        this.bind('code').to(this, 'character', characterToUnicodeString);\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            children: [\r\n                {\r\n                    tag: 'span',\r\n                    attributes: {\r\n                        class: [\r\n                            'ck-character-info__name'\r\n                        ]\r\n                    },\r\n                    children: [\r\n                        {\r\n                            // Note: ZWSP to prevent vertical collapsing.\r\n                            text: bind.to('name', name => name ? name : '\\u200B')\r\n                        }\r\n                    ]\r\n                },\r\n                {\r\n                    tag: 'span',\r\n                    attributes: {\r\n                        class: [\r\n                            'ck-character-info__code'\r\n                        ]\r\n                    },\r\n                    children: [\r\n                        {\r\n                            text: bind.to('code')\r\n                        }\r\n                    ]\r\n                }\r\n            ],\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-character-info'\r\n                ]\r\n            }\r\n        });\r\n    }\r\n}\r\n/**\r\n * Converts a character into a \"Unicode string\", for instance:\r\n *\r\n * \"$\" -> \"U+0024\"\r\n *\r\n * Returns an empty string when the character is `null`.\r\n */\r\nfunction characterToUnicodeString(character) {\r\n    if (character === null) {\r\n        return '';\r\n    }\r\n    const hexCode = character.codePointAt(0).toString(16);\r\n    return 'U+' + ('0000' + hexCode).slice(-4);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module special-characters/ui/specialcharactersview\r\n */\r\nimport { View, FocusCycler } from 'ckeditor5/src/ui';\r\nimport { FocusTracker, KeystrokeHandler } from 'ckeditor5/src/utils';\r\n/**\r\n * A view that glues pieces of the special characters dropdown panel together:\r\n *\r\n * * the navigation view (allows selecting the category),\r\n * * the grid view (displays characters as a grid),\r\n * * and the info view (displays detailed info about a specific character).\r\n */\r\nexport default class SpecialCharactersView extends View {\r\n    /**\r\n     * Creates an instance of the `SpecialCharactersView`.\r\n     */\r\n    constructor(locale, navigationView, gridView, infoView) {\r\n        super(locale);\r\n        this.navigationView = navigationView;\r\n        this.gridView = gridView;\r\n        this.infoView = infoView;\r\n        this.items = this.createCollection();\r\n        this.focusTracker = new FocusTracker();\r\n        this.keystrokes = new KeystrokeHandler();\r\n        this._focusCycler = new FocusCycler({\r\n            focusables: this.items,\r\n            focusTracker: this.focusTracker,\r\n            keystrokeHandler: this.keystrokes,\r\n            actions: {\r\n                focusPrevious: 'shift + tab',\r\n                focusNext: 'tab'\r\n            }\r\n        });\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            children: [\r\n                this.navigationView,\r\n                this.gridView,\r\n                this.infoView\r\n            ],\r\n            attributes: {\r\n                // Avoid focus loss when the user clicks the area of the grid that is not a button.\r\n                // https://github.com/ckeditor/ckeditor5/pull/12319#issuecomment-1231779819\r\n                tabindex: '-1'\r\n            }\r\n        });\r\n        this.items.add(this.navigationView.groupDropdownView.buttonView);\r\n        this.items.add(this.gridView);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        this.focusTracker.add(this.navigationView.groupDropdownView.buttonView.element);\r\n        this.focusTracker.add(this.gridView.element);\r\n        // Start listening for the keystrokes coming from #element.\r\n        this.keystrokes.listenTo(this.element);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        this.focusTracker.destroy();\r\n        this.keystrokes.destroy();\r\n    }\r\n    /**\r\n     * Focuses the first focusable in {@link #items}.\r\n     */\r\n    focus() {\r\n        this.navigationView.focus();\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./specialcharacters.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module special-characters/specialcharacters\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { Typing } from 'ckeditor5/src/typing';\r\nimport { createDropdown } from 'ckeditor5/src/ui';\r\nimport { CKEditorError } from 'ckeditor5/src/utils';\r\nimport SpecialCharactersNavigationView from './ui/specialcharactersnavigationview';\r\nimport CharacterGridView from './ui/charactergridview';\r\nimport CharacterInfoView from './ui/characterinfoview';\r\nimport SpecialCharactersView from './ui/specialcharactersview';\r\nimport specialCharactersIcon from '../theme/icons/specialcharacters.svg';\r\nimport '../theme/specialcharacters.css';\r\nconst ALL_SPECIAL_CHARACTERS_GROUP = 'All';\r\n/**\r\n * The special characters feature.\r\n *\r\n * Introduces the `'specialCharacters'` dropdown.\r\n */\r\nexport default class SpecialCharacters extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [Typing];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'SpecialCharacters';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        const t = editor.t;\r\n        this._characters = new Map();\r\n        this._groups = new Map();\r\n        this._allSpecialCharactersGroupLabel = t('All');\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        const inputCommand = editor.commands.get('insertText');\r\n        // Add the `specialCharacters` dropdown button to feature components.\r\n        editor.ui.componentFactory.add('specialCharacters', locale => {\r\n            const dropdownView = createDropdown(locale);\r\n            let dropdownPanelContent;\r\n            dropdownView.buttonView.set({\r\n                label: t('Special characters'),\r\n                icon: specialCharactersIcon,\r\n                tooltip: true\r\n            });\r\n            dropdownView.bind('isEnabled').to(inputCommand);\r\n            // Insert a special character when a tile was clicked.\r\n            dropdownView.on('execute', (evt, data) => {\r\n                editor.execute('insertText', { text: data.character });\r\n                editor.editing.view.focus();\r\n            });\r\n            dropdownView.on('change:isOpen', () => {\r\n                if (!dropdownPanelContent) {\r\n                    dropdownPanelContent = this._createDropdownPanelContent(locale, dropdownView);\r\n                    const specialCharactersView = new SpecialCharactersView(locale, dropdownPanelContent.navigationView, dropdownPanelContent.gridView, dropdownPanelContent.infoView);\r\n                    dropdownView.panelView.children.add(specialCharactersView);\r\n                }\r\n                dropdownPanelContent.infoView.set({\r\n                    character: null,\r\n                    name: null\r\n                });\r\n            });\r\n            return dropdownView;\r\n        });\r\n    }\r\n    /**\r\n     * Adds a collection of special characters to the specified group. The title of a special character must be unique.\r\n     *\r\n     * **Note:** The \"All\" category name is reserved by the plugin and cannot be used as a new name for a special\r\n     * characters category.\r\n     */\r\n    addItems(groupName, items, options = { label: groupName }) {\r\n        if (groupName === ALL_SPECIAL_CHARACTERS_GROUP) {\r\n            /**\r\n             * The name \"All\" for a special category group cannot be used because it is a special category that displays all\r\n             * available special characters.\r\n             *\r\n             * @error special-character-invalid-group-name\r\n             */\r\n            throw new CKEditorError('special-character-invalid-group-name', null);\r\n        }\r\n        const group = this._getGroup(groupName, options.label);\r\n        for (const item of items) {\r\n            group.items.add(item.title);\r\n            this._characters.set(item.title, item.character);\r\n        }\r\n    }\r\n    /**\r\n     * Returns special character groups in an order determined based on configuration and registration sequence.\r\n     */\r\n    getGroups() {\r\n        const groups = Array.from(this._groups.keys());\r\n        const order = this.editor.config.get('specialCharacters.order') || [];\r\n        const invalidGroup = order.find(item => !groups.includes(item));\r\n        if (invalidGroup) {\r\n            /**\r\n             * One of the special character groups in the \"specialCharacters.order\" configuration doesn't exist.\r\n             *\r\n             * @error special-character-invalid-order-group-name\r\n             */\r\n            throw new CKEditorError('special-character-invalid-order-group-name', null, { invalidGroup });\r\n        }\r\n        return new Set([\r\n            ...order,\r\n            ...groups\r\n        ]);\r\n    }\r\n    /**\r\n     * Returns a collection of special characters symbol names (titles).\r\n     */\r\n    getCharactersForGroup(groupName) {\r\n        if (groupName === ALL_SPECIAL_CHARACTERS_GROUP) {\r\n            return new Set(this._characters.keys());\r\n        }\r\n        const group = this._groups.get(groupName);\r\n        if (group) {\r\n            return group.items;\r\n        }\r\n    }\r\n    /**\r\n     * Returns the symbol of a special character for the specified name. If the special character could not be found, `undefined`\r\n     * is returned.\r\n     *\r\n     * @param title The title of a special character.\r\n     */\r\n    getCharacter(title) {\r\n        return this._characters.get(title);\r\n    }\r\n    /**\r\n     * Returns a group of special characters. If the group with the specified name does not exist, it will be created.\r\n     *\r\n     * @param groupName The name of the group to create.\r\n     * @param label The label describing the new group.\r\n     */\r\n    _getGroup(groupName, label) {\r\n        if (!this._groups.has(groupName)) {\r\n            this._groups.set(groupName, {\r\n                items: new Set(),\r\n                label\r\n            });\r\n        }\r\n        return this._groups.get(groupName);\r\n    }\r\n    /**\r\n     * Updates the symbol grid depending on the currently selected character group.\r\n     */\r\n    _updateGrid(currentGroupName, gridView) {\r\n        // Updating the grid starts with removing all tiles belonging to the old group.\r\n        gridView.tiles.clear();\r\n        const characterTitles = this.getCharactersForGroup(currentGroupName);\r\n        for (const title of characterTitles) {\r\n            const character = this.getCharacter(title);\r\n            gridView.tiles.add(gridView.createTile(character, title));\r\n        }\r\n    }\r\n    /**\r\n     * Initializes the dropdown, used for lazy loading.\r\n     *\r\n     * @returns An object with `navigationView`, `gridView` and `infoView` properties, containing UI parts.\r\n     */\r\n    _createDropdownPanelContent(locale, dropdownView) {\r\n        const groupEntries = Array\r\n            .from(this.getGroups())\r\n            .map(name => ([name, this._groups.get(name).label]));\r\n        // The map contains a name of category (an identifier) and its label (a translational string).\r\n        const specialCharsGroups = new Map([\r\n            // Add a special group that shows all available special characters.\r\n            [ALL_SPECIAL_CHARACTERS_GROUP, this._allSpecialCharactersGroupLabel],\r\n            ...groupEntries\r\n        ]);\r\n        const navigationView = new SpecialCharactersNavigationView(locale, specialCharsGroups);\r\n        const gridView = new CharacterGridView(locale);\r\n        const infoView = new CharacterInfoView(locale);\r\n        gridView.delegate('execute').to(dropdownView);\r\n        gridView.on('tileHover', (evt, data) => {\r\n            infoView.set(data);\r\n        });\r\n        gridView.on('tileFocus', (evt, data) => {\r\n            infoView.set(data);\r\n        });\r\n        // Update the grid of special characters when a user changed the character group.\r\n        navigationView.on('execute', () => {\r\n            this._updateGrid(navigationView.currentGroupName, gridView);\r\n        });\r\n        // Set the initial content of the special characters grid.\r\n        this._updateGrid(navigationView.currentGroupName, gridView);\r\n        return { navigationView, gridView, infoView };\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module special-characters/specialcharactersarrows\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\n/**\r\n * A plugin that provides special characters for the \"Arrows\" category.\r\n *\r\n * ```ts\r\n * ClassicEditor\r\n *   .create( {\r\n *     plugins: [ ..., SpecialCharacters, SpecialCharactersArrows ],\r\n *   } )\r\n *   .then( ... )\r\n *   .catch( ... );\r\n * ```\r\n */\r\nexport default class SpecialCharactersArrows extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'SpecialCharactersArrows';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        const plugin = editor.plugins.get('SpecialCharacters');\r\n        plugin.addItems('Arrows', [\r\n            { title: t('leftwards simple arrow'), character: '←' },\r\n            { title: t('rightwards simple arrow'), character: '→' },\r\n            { title: t('upwards simple arrow'), character: '↑' },\r\n            { title: t('downwards simple arrow'), character: '↓' },\r\n            { title: t('leftwards double arrow'), character: '⇐' },\r\n            { title: t('rightwards double arrow'), character: '⇒' },\r\n            { title: t('upwards double arrow'), character: '⇑' },\r\n            { title: t('downwards double arrow'), character: '⇓' },\r\n            { title: t('leftwards dashed arrow'), character: '⇠' },\r\n            { title: t('rightwards dashed arrow'), character: '⇢' },\r\n            { title: t('upwards dashed arrow'), character: '⇡' },\r\n            { title: t('downwards dashed arrow'), character: '⇣' },\r\n            { title: t('leftwards arrow to bar'), character: '⇤' },\r\n            { title: t('rightwards arrow to bar'), character: '⇥' },\r\n            { title: t('upwards arrow to bar'), character: '⤒' },\r\n            { title: t('downwards arrow to bar'), character: '⤓' },\r\n            { title: t('up down arrow with base'), character: '↨' },\r\n            { title: t('back with leftwards arrow above'), character: '🔙' },\r\n            { title: t('end with leftwards arrow above'), character: '🔚' },\r\n            { title: t('on with exclamation mark with left right arrow above'), character: '🔛' },\r\n            { title: t('soon with rightwards arrow above'), character: '🔜' },\r\n            { title: t('top with upwards arrow above'), character: '🔝' }\r\n        ], { label: t('Arrows') });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module special-characters/specialcharacterscurrency\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\n/**\r\n * A plugin that provides special characters for the \"Currency\" category.\r\n *\r\n * ```ts\r\n * ClassicEditor\r\n *   .create( {\r\n *     plugins: [ ..., SpecialCharacters, SpecialCharactersCurrency ],\r\n *   } )\r\n *   .then( ... )\r\n *   .catch( ... );\r\n * ```\r\n */\r\nexport default class SpecialCharactersCurrency extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'SpecialCharactersCurrency';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        const plugin = editor.plugins.get('SpecialCharacters');\r\n        plugin.addItems('Currency', [\r\n            { character: '$', title: t('Dollar sign') },\r\n            { character: '€', title: t('Euro sign') },\r\n            { character: '¥', title: t('Yen sign') },\r\n            { character: '£', title: t('Pound sign') },\r\n            { character: '¢', title: t('Cent sign') },\r\n            { character: '₠', title: t('Euro-currency sign') },\r\n            { character: '₡', title: t('Colon sign') },\r\n            { character: '₢', title: t('Cruzeiro sign') },\r\n            { character: '₣', title: t('French franc sign') },\r\n            { character: '₤', title: t('Lira sign') },\r\n            { character: '¤', title: t('Currency sign') },\r\n            { character: '₿', title: t('Bitcoin sign') },\r\n            { character: '₥', title: t('Mill sign') },\r\n            { character: '₦', title: t('Naira sign') },\r\n            { character: '₧', title: t('Peseta sign') },\r\n            { character: '₨', title: t('Rupee sign') },\r\n            { character: '₩', title: t('Won sign') },\r\n            { character: '₪', title: t('New sheqel sign') },\r\n            { character: '₫', title: t('Dong sign') },\r\n            { character: '₭', title: t('Kip sign') },\r\n            { character: '₮', title: t('Tugrik sign') },\r\n            { character: '₯', title: t('Drachma sign') },\r\n            { character: '₰', title: t('German penny sign') },\r\n            { character: '₱', title: t('Peso sign') },\r\n            { character: '₲', title: t('Guarani sign') },\r\n            { character: '₳', title: t('Austral sign') },\r\n            { character: '₴', title: t('Hryvnia sign') },\r\n            { character: '₵', title: t('Cedi sign') },\r\n            { character: '₶', title: t('Livre tournois sign') },\r\n            { character: '₷', title: t('Spesmilo sign') },\r\n            { character: '₸', title: t('Tenge sign') },\r\n            { character: '₹', title: t('Indian rupee sign') },\r\n            { character: '₺', title: t('Turkish lira sign') },\r\n            { character: '₻', title: t('Nordic mark sign') },\r\n            { character: '₼', title: t('Manat sign') },\r\n            { character: '₽', title: t('Ruble sign') }\r\n        ], { label: t('Currency') });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module special-characters/specialcharactersmathematical\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\n/**\r\n * A plugin that provides special characters for the \"Mathematical\" category.\r\n *\r\n * ```ts\r\n * ClassicEditor\r\n *   .create( {\r\n *     plugins: [ ..., SpecialCharacters, SpecialCharactersMathematical ],\r\n *   } )\r\n *   .then( ... )\r\n *   .catch( ... );\r\n * ```\r\n */\r\nexport default class SpecialCharactersMathematical extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'SpecialCharactersMathematical';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        const plugin = editor.plugins.get('SpecialCharacters');\r\n        plugin.addItems('Mathematical', [\r\n            { character: '<', title: t('Less-than sign') },\r\n            { character: '>', title: t('Greater-than sign') },\r\n            { character: '≤', title: t('Less-than or equal to') },\r\n            { character: '≥', title: t('Greater-than or equal to') },\r\n            { character: '–', title: t('En dash') },\r\n            { character: '—', title: t('Em dash') },\r\n            { character: '¯', title: t('Macron') },\r\n            { character: '‾', title: t('Overline') },\r\n            { character: '°', title: t('Degree sign') },\r\n            { character: '−', title: t('Minus sign') },\r\n            { character: '±', title: t('Plus-minus sign') },\r\n            { character: '÷', title: t('Division sign') },\r\n            { character: '⁄', title: t('Fraction slash') },\r\n            { character: '×', title: t('Multiplication sign') },\r\n            { character: 'ƒ', title: t('Latin small letter f with hook') },\r\n            { character: '∫', title: t('Integral') },\r\n            { character: '∑', title: t('N-ary summation') },\r\n            { character: '∞', title: t('Infinity') },\r\n            { character: '√', title: t('Square root') },\r\n            { character: '∼', title: t('Tilde operator') },\r\n            { character: '≅', title: t('Approximately equal to') },\r\n            { character: '≈', title: t('Almost equal to') },\r\n            { character: '≠', title: t('Not equal to') },\r\n            { character: '≡', title: t('Identical to') },\r\n            { character: '∈', title: t('Element of') },\r\n            { character: '∉', title: t('Not an element of') },\r\n            { character: '∋', title: t('Contains as member') },\r\n            { character: '∏', title: t('N-ary product') },\r\n            { character: '∧', title: t('Logical and') },\r\n            { character: '∨', title: t('Logical or') },\r\n            { character: '¬', title: t('Not sign') },\r\n            { character: '∩', title: t('Intersection') },\r\n            { character: '∪', title: t('Union') },\r\n            { character: '∂', title: t('Partial differential') },\r\n            { character: '∀', title: t('For all') },\r\n            { character: '∃', title: t('There exists') },\r\n            { character: '∅', title: t('Empty set') },\r\n            { character: '∇', title: t('Nabla') },\r\n            { character: '∗', title: t('Asterisk operator') },\r\n            { character: '∝', title: t('Proportional to') },\r\n            { character: '∠', title: t('Angle') },\r\n            { character: '¼', title: t('Vulgar fraction one quarter') },\r\n            { character: '½', title: t('Vulgar fraction one half') },\r\n            { character: '¾', title: t('Vulgar fraction three quarters') }\r\n        ], { label: t('Mathematical') });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module special-characters/specialcharacterslatin\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\n/**\r\n * A plugin that provides special characters for the \"Latin\" category.\r\n *\r\n * ```ts\r\n * ClassicEditor\r\n *   .create( {\r\n *     plugins: [ ..., SpecialCharacters, SpecialCharactersLatin ],\r\n *   } )\r\n *   .then( ... )\r\n *   .catch( ... );\r\n * ```\r\n */\r\nexport default class SpecialCharactersLatin extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'SpecialCharactersLatin';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        const plugin = editor.plugins.get('SpecialCharacters');\r\n        plugin.addItems('Latin', [\r\n            { character: 'Ā', title: t('Latin capital letter a with macron') },\r\n            { character: 'ā', title: t('Latin small letter a with macron') },\r\n            { character: 'Ă', title: t('Latin capital letter a with breve') },\r\n            { character: 'ă', title: t('Latin small letter a with breve') },\r\n            { character: 'Ą', title: t('Latin capital letter a with ogonek') },\r\n            { character: 'ą', title: t('Latin small letter a with ogonek') },\r\n            { character: 'Ć', title: t('Latin capital letter c with acute') },\r\n            { character: 'ć', title: t('Latin small letter c with acute') },\r\n            { character: 'Ĉ', title: t('Latin capital letter c with circumflex') },\r\n            { character: 'ĉ', title: t('Latin small letter c with circumflex') },\r\n            { character: 'Ċ', title: t('Latin capital letter c with dot above') },\r\n            { character: 'ċ', title: t('Latin small letter c with dot above') },\r\n            { character: 'Č', title: t('Latin capital letter c with caron') },\r\n            { character: 'č', title: t('Latin small letter c with caron') },\r\n            { character: 'Ď', title: t('Latin capital letter d with caron') },\r\n            { character: 'ď', title: t('Latin small letter d with caron') },\r\n            { character: 'Đ', title: t('Latin capital letter d with stroke') },\r\n            { character: 'đ', title: t('Latin small letter d with stroke') },\r\n            { character: 'Ē', title: t('Latin capital letter e with macron') },\r\n            { character: 'ē', title: t('Latin small letter e with macron') },\r\n            { character: 'Ĕ', title: t('Latin capital letter e with breve') },\r\n            { character: 'ĕ', title: t('Latin small letter e with breve') },\r\n            { character: 'Ė', title: t('Latin capital letter e with dot above') },\r\n            { character: 'ė', title: t('Latin small letter e with dot above') },\r\n            { character: 'Ę', title: t('Latin capital letter e with ogonek') },\r\n            { character: 'ę', title: t('Latin small letter e with ogonek') },\r\n            { character: 'Ě', title: t('Latin capital letter e with caron') },\r\n            { character: 'ě', title: t('Latin small letter e with caron') },\r\n            { character: 'Ĝ', title: t('Latin capital letter g with circumflex') },\r\n            { character: 'ĝ', title: t('Latin small letter g with circumflex') },\r\n            { character: 'Ğ', title: t('Latin capital letter g with breve') },\r\n            { character: 'ğ', title: t('Latin small letter g with breve') },\r\n            { character: 'Ġ', title: t('Latin capital letter g with dot above') },\r\n            { character: 'ġ', title: t('Latin small letter g with dot above') },\r\n            { character: 'Ģ', title: t('Latin capital letter g with cedilla') },\r\n            { character: 'ģ', title: t('Latin small letter g with cedilla') },\r\n            { character: 'Ĥ', title: t('Latin capital letter h with circumflex') },\r\n            { character: 'ĥ', title: t('Latin small letter h with circumflex') },\r\n            { character: 'Ħ', title: t('Latin capital letter h with stroke') },\r\n            { character: 'ħ', title: t('Latin small letter h with stroke') },\r\n            { character: 'Ĩ', title: t('Latin capital letter i with tilde') },\r\n            { character: 'ĩ', title: t('Latin small letter i with tilde') },\r\n            { character: 'Ī', title: t('Latin capital letter i with macron') },\r\n            { character: 'ī', title: t('Latin small letter i with macron') },\r\n            { character: 'Ĭ', title: t('Latin capital letter i with breve') },\r\n            { character: 'ĭ', title: t('Latin small letter i with breve') },\r\n            { character: 'Į', title: t('Latin capital letter i with ogonek') },\r\n            { character: 'į', title: t('Latin small letter i with ogonek') },\r\n            { character: 'İ', title: t('Latin capital letter i with dot above') },\r\n            { character: 'ı', title: t('Latin small letter dotless i') },\r\n            { character: 'Ĳ', title: t('Latin capital ligature ij') },\r\n            { character: 'ĳ', title: t('Latin small ligature ij') },\r\n            { character: 'Ĵ', title: t('Latin capital letter j with circumflex') },\r\n            { character: 'ĵ', title: t('Latin small letter j with circumflex') },\r\n            { character: 'Ķ', title: t('Latin capital letter k with cedilla') },\r\n            { character: 'ķ', title: t('Latin small letter k with cedilla') },\r\n            { character: 'ĸ', title: t('Latin small letter kra') },\r\n            { character: 'Ĺ', title: t('Latin capital letter l with acute') },\r\n            { character: 'ĺ', title: t('Latin small letter l with acute') },\r\n            { character: 'Ļ', title: t('Latin capital letter l with cedilla') },\r\n            { character: 'ļ', title: t('Latin small letter l with cedilla') },\r\n            { character: 'Ľ', title: t('Latin capital letter l with caron') },\r\n            { character: 'ľ', title: t('Latin small letter l with caron') },\r\n            { character: 'Ŀ', title: t('Latin capital letter l with middle dot') },\r\n            { character: 'ŀ', title: t('Latin small letter l with middle dot') },\r\n            { character: 'Ł', title: t('Latin capital letter l with stroke') },\r\n            { character: 'ł', title: t('Latin small letter l with stroke') },\r\n            { character: 'Ń', title: t('Latin capital letter n with acute') },\r\n            { character: 'ń', title: t('Latin small letter n with acute') },\r\n            { character: 'Ņ', title: t('Latin capital letter n with cedilla') },\r\n            { character: 'ņ', title: t('Latin small letter n with cedilla') },\r\n            { character: 'Ň', title: t('Latin capital letter n with caron') },\r\n            { character: 'ň', title: t('Latin small letter n with caron') },\r\n            { character: 'ŉ', title: t('Latin small letter n preceded by apostrophe') },\r\n            { character: 'Ŋ', title: t('Latin capital letter eng') },\r\n            { character: 'ŋ', title: t('Latin small letter eng') },\r\n            { character: 'Ō', title: t('Latin capital letter o with macron') },\r\n            { character: 'ō', title: t('Latin small letter o with macron') },\r\n            { character: 'Ŏ', title: t('Latin capital letter o with breve') },\r\n            { character: 'ŏ', title: t('Latin small letter o with breve') },\r\n            { character: 'Ő', title: t('Latin capital letter o with double acute') },\r\n            { character: 'ő', title: t('Latin small letter o with double acute') },\r\n            { character: 'Œ', title: t('Latin capital ligature oe') },\r\n            { character: 'œ', title: t('Latin small ligature oe') },\r\n            { character: 'Ŕ', title: t('Latin capital letter r with acute') },\r\n            { character: 'ŕ', title: t('Latin small letter r with acute') },\r\n            { character: 'Ŗ', title: t('Latin capital letter r with cedilla') },\r\n            { character: 'ŗ', title: t('Latin small letter r with cedilla') },\r\n            { character: 'Ř', title: t('Latin capital letter r with caron') },\r\n            { character: 'ř', title: t('Latin small letter r with caron') },\r\n            { character: 'Ś', title: t('Latin capital letter s with acute') },\r\n            { character: 'ś', title: t('Latin small letter s with acute') },\r\n            { character: 'Ŝ', title: t('Latin capital letter s with circumflex') },\r\n            { character: 'ŝ', title: t('Latin small letter s with circumflex') },\r\n            { character: 'Ş', title: t('Latin capital letter s with cedilla') },\r\n            { character: 'ş', title: t('Latin small letter s with cedilla') },\r\n            { character: 'Š', title: t('Latin capital letter s with caron') },\r\n            { character: 'š', title: t('Latin small letter s with caron') },\r\n            { character: 'Ţ', title: t('Latin capital letter t with cedilla') },\r\n            { character: 'ţ', title: t('Latin small letter t with cedilla') },\r\n            { character: 'Ť', title: t('Latin capital letter t with caron') },\r\n            { character: 'ť', title: t('Latin small letter t with caron') },\r\n            { character: 'Ŧ', title: t('Latin capital letter t with stroke') },\r\n            { character: 'ŧ', title: t('Latin small letter t with stroke') },\r\n            { character: 'Ũ', title: t('Latin capital letter u with tilde') },\r\n            { character: 'ũ', title: t('Latin small letter u with tilde') },\r\n            { character: 'Ū', title: t('Latin capital letter u with macron') },\r\n            { character: 'ū', title: t('Latin small letter u with macron') },\r\n            { character: 'Ŭ', title: t('Latin capital letter u with breve') },\r\n            { character: 'ŭ', title: t('Latin small letter u with breve') },\r\n            { character: 'Ů', title: t('Latin capital letter u with ring above') },\r\n            { character: 'ů', title: t('Latin small letter u with ring above') },\r\n            { character: 'Ű', title: t('Latin capital letter u with double acute') },\r\n            { character: 'ű', title: t('Latin small letter u with double acute') },\r\n            { character: 'Ų', title: t('Latin capital letter u with ogonek') },\r\n            { character: 'ų', title: t('Latin small letter u with ogonek') },\r\n            { character: 'Ŵ', title: t('Latin capital letter w with circumflex') },\r\n            { character: 'ŵ', title: t('Latin small letter w with circumflex') },\r\n            { character: 'Ŷ', title: t('Latin capital letter y with circumflex') },\r\n            { character: 'ŷ', title: t('Latin small letter y with circumflex') },\r\n            { character: 'Ÿ', title: t('Latin capital letter y with diaeresis') },\r\n            { character: 'Ź', title: t('Latin capital letter z with acute') },\r\n            { character: 'ź', title: t('Latin small letter z with acute') },\r\n            { character: 'Ż', title: t('Latin capital letter z with dot above') },\r\n            { character: 'ż', title: t('Latin small letter z with dot above') },\r\n            { character: 'Ž', title: t('Latin capital letter z with caron') },\r\n            { character: 'ž', title: t('Latin small letter z with caron') },\r\n            { character: 'ſ', title: t('Latin small letter long s') }\r\n        ], { label: t('Latin') });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module special-characters/specialcharacterstext\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\n/**\r\n * A plugin that provides special characters for the \"Text\" category.\r\n *\r\n * ```ts\r\n * ClassicEditor\r\n *   .create( {\r\n *     plugins: [ ..., SpecialCharacters, SpecialCharactersText ],\r\n *   } )\r\n *   .then( ... )\r\n *   .catch( ... );\r\n * ```\r\n */\r\nexport default class SpecialCharactersText extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'SpecialCharactersText';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        const plugin = editor.plugins.get('SpecialCharacters');\r\n        plugin.addItems('Text', [\r\n            { character: '‹', title: t('Single left-pointing angle quotation mark') },\r\n            { character: '›', title: t('Single right-pointing angle quotation mark') },\r\n            { character: '«', title: t('Left-pointing double angle quotation mark') },\r\n            { character: '»', title: t('Right-pointing double angle quotation mark') },\r\n            { character: '‘', title: t('Left single quotation mark') },\r\n            { character: '’', title: t('Right single quotation mark') },\r\n            { character: '“', title: t('Left double quotation mark') },\r\n            { character: '”', title: t('Right double quotation mark') },\r\n            { character: '‚', title: t('Single low-9 quotation mark') },\r\n            { character: '„', title: t('Double low-9 quotation mark') },\r\n            { character: '¡', title: t('Inverted exclamation mark') },\r\n            { character: '¿', title: t('Inverted question mark') },\r\n            { character: '‥', title: t('Two dot leader') },\r\n            { character: '…', title: t('Horizontal ellipsis') },\r\n            { character: '‡', title: t('Double dagger') },\r\n            { character: '‰', title: t('Per mille sign') },\r\n            { character: '‱', title: t('Per ten thousand sign') },\r\n            { character: '‼', title: t('Double exclamation mark') },\r\n            { character: '⁈', title: t('Question exclamation mark') },\r\n            { character: '⁉', title: t('Exclamation question mark') },\r\n            { character: '⁇', title: t('Double question mark') },\r\n            { character: '©', title: t('Copyright sign') },\r\n            { character: '®', title: t('Registered sign') },\r\n            { character: '™', title: t('Trade mark sign') },\r\n            { character: '§', title: t('Section sign') },\r\n            { character: '¶', title: t('Paragraph sign') },\r\n            { character: '⁋', title: t('Reversed paragraph sign') }\r\n        ], { label: t('Text') });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module restricted-editing/restrictededitingexceptioncommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\n/**\r\n * The command that toggles exceptions from the restricted editing on text.\r\n */\r\nexport default class RestrictedEditingExceptionCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const model = this.editor.model;\r\n        const doc = model.document;\r\n        this.value = !!doc.selection.getAttribute('restrictedEditingException');\r\n        this.isEnabled = model.schema.checkAttributeInSelection(doc.selection, 'restrictedEditingException');\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    execute(options = {}) {\r\n        const model = this.editor.model;\r\n        const document = model.document;\r\n        const selection = document.selection;\r\n        const valueToSet = (options.forceValue === undefined) ? !this.value : options.forceValue;\r\n        model.change(writer => {\r\n            const ranges = model.schema.getValidRanges(selection.getRanges(), 'restrictedEditingException');\r\n            if (selection.isCollapsed) {\r\n                if (valueToSet) {\r\n                    writer.setSelectionAttribute('restrictedEditingException', valueToSet);\r\n                }\r\n                else {\r\n                    const isSameException = (value) => {\r\n                        return value.item.getAttribute('restrictedEditingException') === this.value;\r\n                    };\r\n                    const focus = selection.focus;\r\n                    const exceptionStart = focus.getLastMatchingPosition(isSameException, { direction: 'backward' });\r\n                    const exceptionEnd = focus.getLastMatchingPosition(isSameException);\r\n                    writer.removeSelectionAttribute('restrictedEditingException');\r\n                    if (!(focus.isEqual(exceptionStart) || focus.isEqual(exceptionEnd))) {\r\n                        writer.removeAttribute('restrictedEditingException', writer.createRange(exceptionStart, exceptionEnd));\r\n                    }\r\n                }\r\n            }\r\n            else {\r\n                for (const range of ranges) {\r\n                    if (valueToSet) {\r\n                        writer.setAttribute('restrictedEditingException', valueToSet, range);\r\n                    }\r\n                    else {\r\n                        writer.removeAttribute('restrictedEditingException', range);\r\n                    }\r\n                }\r\n            }\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module restricted-editing/standardeditingmodeediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport RestrictedEditingExceptionCommand from './restrictededitingexceptioncommand';\r\n/**\r\n * The standard editing mode editing feature.\r\n *\r\n * * It introduces the `restrictedEditingException` text attribute that is rendered as\r\n * a `<span>` element with the `restricted-editing-exception` CSS class.\r\n * * It registers the `'restrictedEditingException'` command.\r\n */\r\nexport default class StandardEditingModeEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'StandardEditingModeEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        editor.model.schema.extend('$text', { allowAttributes: ['restrictedEditingException'] });\r\n        editor.conversion.for('upcast').elementToAttribute({\r\n            model: 'restrictedEditingException',\r\n            view: {\r\n                name: 'span',\r\n                classes: 'restricted-editing-exception'\r\n            }\r\n        });\r\n        editor.conversion.for('downcast').attributeToElement({\r\n            model: 'restrictedEditingException',\r\n            view: (modelAttributeValue, { writer }) => {\r\n                if (modelAttributeValue) {\r\n                    // Make the restricted editing <span> outer-most in the view.\r\n                    return writer.createAttributeElement('span', { class: 'restricted-editing-exception' }, { priority: -10 });\r\n                }\r\n            }\r\n        });\r\n        editor.commands.add('restrictedEditingException', new RestrictedEditingExceptionCommand(editor));\r\n        editor.editing.view.change(writer => {\r\n            for (const root of editor.editing.view.document.roots) {\r\n                writer.addClass('ck-restricted-editing_mode_standard', root);\r\n            }\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module restricted-editing/standardeditingmodeui\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { ButtonView } from 'ckeditor5/src/ui';\r\nimport unlockIcon from '../theme/icons/contentunlock.svg';\r\n/**\r\n * The standard editing mode UI feature.\r\n *\r\n * It introduces the `'restrictedEditingException'` button that marks text as unrestricted for editing.\r\n */\r\nexport default class StandardEditingModeUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'StandardEditingModeUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        editor.ui.componentFactory.add('restrictedEditingException', locale => {\r\n            const command = editor.commands.get('restrictedEditingException');\r\n            const view = new ButtonView(locale);\r\n            view.set({\r\n                icon: unlockIcon,\r\n                tooltip: true,\r\n                isToggleable: true\r\n            });\r\n            view.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\r\n            view.bind('label').to(command, 'value', value => {\r\n                return value ? t('Disable editing') : t('Enable editing');\r\n            });\r\n            this.listenTo(view, 'execute', () => {\r\n                editor.execute('restrictedEditingException');\r\n                editor.editing.view.focus();\r\n            });\r\n            return view;\r\n        });\r\n    }\r\n}\r\n","export default \"<svg viewBox=\\\"0 0 20 20\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M6.25 16a.75.75 0 1 1 0 1.5H.75a.75.75 0 1 1 0-1.5h5.5zm0-5a.75.75 0 1 1 0 1.5H.75a.75.75 0 1 1 0-1.5h5.5zm3-5a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1 0-1.5h8.5zm6-5a.75.75 0 1 1 0 1.5H.75a.75.75 0 0 1 0-1.5h14.5zm.25 5.5a3.5 3.5 0 0 1 3.143 1.959.75.75 0 0 1-1.36.636A2 2 0 0 0 13.5 10v2H19a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1h-7a1 1 0 0 1-1-1v-5a1 1 0 0 1 1-1v-2l.005-.192A3.5 3.5 0 0 1 15.5 6.5zm0 7.5a.5.5 0 0 0-.492.41L15 14.5v2a.5.5 0 0 0 .992.09L16 16.5v-2a.5.5 0 0 0-.5-.5z\\\"/></svg>\";","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./restrictedediting.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * Conversion helper for upcasting attributes using normalized styles.\r\n *\r\n * @param options.modelAttribute The attribute to set.\r\n * @param options.styleName The style name to convert.\r\n * @param options.viewElement The view element name that should be converted.\r\n * @param options.defaultValue The default value for the specified `modelAttribute`.\r\n * @param options.shouldUpcast The function which returns `true` if style should be upcasted from this element.\r\n */\r\nexport function upcastStyleToAttribute(conversion, options) {\r\n    const { modelAttribute, styleName, viewElement, defaultValue, reduceBoxSides = false, shouldUpcast = () => true } = options;\r\n    conversion.for('upcast').attributeToAttribute({\r\n        view: {\r\n            name: viewElement,\r\n            styles: {\r\n                [styleName]: /[\\s\\S]+/\r\n            }\r\n        },\r\n        model: {\r\n            key: modelAttribute,\r\n            value: (viewElement) => {\r\n                if (!shouldUpcast(viewElement)) {\r\n                    return;\r\n                }\r\n                const normalized = viewElement.getNormalizedStyle(styleName);\r\n                const value = reduceBoxSides ? reduceBoxSidesValue(normalized) : normalized;\r\n                if (defaultValue !== value) {\r\n                    return value;\r\n                }\r\n            }\r\n        }\r\n    });\r\n}\r\n/**\r\n * Conversion helper for upcasting border styles for view elements.\r\n *\r\n * @param defaultBorder The default border values.\r\n * @param defaultBorder.color The default `borderColor` value.\r\n * @param defaultBorder.style The default `borderStyle` value.\r\n * @param defaultBorder.width The default `borderWidth` value.\r\n */\r\nexport function upcastBorderStyles(conversion, viewElementName, modelAttributes, defaultBorder) {\r\n    conversion.for('upcast').add(dispatcher => dispatcher.on('element:' + viewElementName, (evt, data, conversionApi) => {\r\n        // If the element was not converted by element-to-element converter,\r\n        // we should not try to convert the style. See #8393.\r\n        if (!data.modelRange) {\r\n            return;\r\n        }\r\n        // Check the most detailed properties. These will be always set directly or\r\n        // when using the \"group\" properties like: `border-(top|right|bottom|left)` or `border`.\r\n        const stylesToConsume = [\r\n            'border-top-width',\r\n            'border-top-color',\r\n            'border-top-style',\r\n            'border-bottom-width',\r\n            'border-bottom-color',\r\n            'border-bottom-style',\r\n            'border-right-width',\r\n            'border-right-color',\r\n            'border-right-style',\r\n            'border-left-width',\r\n            'border-left-color',\r\n            'border-left-style'\r\n        ].filter(styleName => data.viewItem.hasStyle(styleName));\r\n        if (!stylesToConsume.length) {\r\n            return;\r\n        }\r\n        const matcherPattern = {\r\n            styles: stylesToConsume\r\n        };\r\n        // Try to consume appropriate values from consumable values list.\r\n        if (!conversionApi.consumable.test(data.viewItem, matcherPattern)) {\r\n            return;\r\n        }\r\n        const modelElement = [...data.modelRange.getItems({ shallow: true })].pop();\r\n        conversionApi.consumable.consume(data.viewItem, matcherPattern);\r\n        const normalizedBorder = {\r\n            style: data.viewItem.getNormalizedStyle('border-style'),\r\n            color: data.viewItem.getNormalizedStyle('border-color'),\r\n            width: data.viewItem.getNormalizedStyle('border-width')\r\n        };\r\n        const reducedBorder = {\r\n            style: reduceBoxSidesValue(normalizedBorder.style),\r\n            color: reduceBoxSidesValue(normalizedBorder.color),\r\n            width: reduceBoxSidesValue(normalizedBorder.width)\r\n        };\r\n        if (reducedBorder.style !== defaultBorder.style) {\r\n            conversionApi.writer.setAttribute(modelAttributes.style, reducedBorder.style, modelElement);\r\n        }\r\n        if (reducedBorder.color !== defaultBorder.color) {\r\n            conversionApi.writer.setAttribute(modelAttributes.color, reducedBorder.color, modelElement);\r\n        }\r\n        if (reducedBorder.width !== defaultBorder.width) {\r\n            conversionApi.writer.setAttribute(modelAttributes.width, reducedBorder.width, modelElement);\r\n        }\r\n    }));\r\n}\r\n/**\r\n * Conversion helper for downcasting an attribute to a style.\r\n */\r\nexport function downcastAttributeToStyle(conversion, options) {\r\n    const { modelElement, modelAttribute, styleName } = options;\r\n    conversion.for('downcast').attributeToAttribute({\r\n        model: {\r\n            name: modelElement,\r\n            key: modelAttribute\r\n        },\r\n        view: modelAttributeValue => ({\r\n            key: 'style',\r\n            value: {\r\n                [styleName]: modelAttributeValue\r\n            }\r\n        })\r\n    });\r\n}\r\n/**\r\n * Conversion helper for downcasting attributes from the model table to a view table (not to `<figure>`).\r\n */\r\nexport function downcastTableAttribute(conversion, options) {\r\n    const { modelAttribute, styleName } = options;\r\n    conversion.for('downcast').add(dispatcher => dispatcher.on(`attribute:${modelAttribute}:table`, (evt, data, conversionApi) => {\r\n        const { item, attributeNewValue } = data;\r\n        const { mapper, writer } = conversionApi;\r\n        if (!conversionApi.consumable.consume(data.item, evt.name)) {\r\n            return;\r\n        }\r\n        const table = [...mapper.toViewElement(item).getChildren()].find(child => child.is('element', 'table'));\r\n        if (attributeNewValue) {\r\n            writer.setStyle(styleName, attributeNewValue, table);\r\n        }\r\n        else {\r\n            writer.removeStyle(styleName, table);\r\n        }\r\n    }));\r\n}\r\n/**\r\n * Reduces the full top, right, bottom, left object to a single string if all sides are equal.\r\n * Returns original style otherwise.\r\n */\r\nfunction reduceBoxSidesValue(style) {\r\n    if (!style) {\r\n        return;\r\n    }\r\n    const sides = ['top', 'right', 'bottom', 'left'];\r\n    const allSidesDefined = sides.every(side => style[side]);\r\n    if (!allSidesDefined) {\r\n        return style;\r\n    }\r\n    const topSideStyle = style.top;\r\n    const allSidesEqual = sides.every(side => style[side] === topSideStyle);\r\n    if (!allSidesEqual) {\r\n        return style;\r\n    }\r\n    return topSideStyle;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { downcastAttributeToStyle, upcastStyleToAttribute } from './../converters/tableproperties';\r\n/**\r\n * A common method to update the numeric value. If a value is the default one, it will be unset.\r\n *\r\n * @param key An attribute key.\r\n * @param value The new attribute value.\r\n * @param item A model item on which the attribute will be set.\r\n * @param defaultValue The default attribute value. If a value is lower or equal, it will be unset.\r\n */\r\nexport function updateNumericAttribute(key, value, item, writer, defaultValue = 1) {\r\n    if (value !== undefined && value !== null && defaultValue !== undefined && defaultValue !== null && value > defaultValue) {\r\n        writer.setAttribute(key, value, item);\r\n    }\r\n    else {\r\n        writer.removeAttribute(key, item);\r\n    }\r\n}\r\n/**\r\n * A common method to create an empty table cell. It creates a proper model structure as a table cell must have at least one block inside.\r\n *\r\n * @param writer The model writer.\r\n * @param insertPosition The position at which the table cell should be inserted.\r\n * @param attributes The element attributes.\r\n * @returns Created table cell.\r\n */\r\nexport function createEmptyTableCell(writer, insertPosition, attributes = {}) {\r\n    const tableCell = writer.createElement('tableCell', attributes);\r\n    writer.insertElement('paragraph', tableCell);\r\n    writer.insert(tableCell, insertPosition);\r\n    return tableCell;\r\n}\r\n/**\r\n * Checks if a table cell belongs to the heading column section.\r\n */\r\nexport function isHeadingColumnCell(tableUtils, tableCell) {\r\n    const table = tableCell.parent.parent;\r\n    const headingColumns = parseInt(table.getAttribute('headingColumns') || '0');\r\n    const { column } = tableUtils.getCellLocation(tableCell);\r\n    return !!headingColumns && column < headingColumns;\r\n}\r\n/**\r\n * Enables conversion for an attribute for simple view-model mappings.\r\n *\r\n * @param options.defaultValue The default value for the specified `modelAttribute`.\r\n */\r\nexport function enableProperty(schema, conversion, options) {\r\n    const { modelAttribute } = options;\r\n    schema.extend('tableCell', {\r\n        allowAttributes: [modelAttribute]\r\n    });\r\n    upcastStyleToAttribute(conversion, { viewElement: /^(td|th)$/, ...options });\r\n    downcastAttributeToStyle(conversion, { modelElement: 'tableCell', ...options });\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { createEmptyTableCell } from '../utils/common';\r\nimport { first } from 'ckeditor5/src/utils';\r\n/**\r\n * Returns a function that converts the table view representation:\r\n *\r\n * ```xml\r\n * <figure class=\"table\"><table>...</table></figure>\r\n * ```\r\n *\r\n * to the model representation:\r\n *\r\n * ```xml\r\n * <table></table>\r\n * ```\r\n */\r\nexport function upcastTableFigure() {\r\n    return (dispatcher) => {\r\n        dispatcher.on('element:figure', (evt, data, conversionApi) => {\r\n            // Do not convert if this is not a \"table figure\".\r\n            if (!conversionApi.consumable.test(data.viewItem, { name: true, classes: 'table' })) {\r\n                return;\r\n            }\r\n            // Find a table element inside the figure element.\r\n            const viewTable = getViewTableFromFigure(data.viewItem);\r\n            // Do not convert if table element is absent or was already converted.\r\n            if (!viewTable || !conversionApi.consumable.test(viewTable, { name: true })) {\r\n                return;\r\n            }\r\n            // Consume the figure to prevent other converters from processing it again.\r\n            conversionApi.consumable.consume(data.viewItem, { name: true, classes: 'table' });\r\n            // Convert view table to model table.\r\n            const conversionResult = conversionApi.convertItem(viewTable, data.modelCursor);\r\n            // Get table element from conversion result.\r\n            const modelTable = first(conversionResult.modelRange.getItems());\r\n            // When table wasn't successfully converted then finish conversion.\r\n            if (!modelTable) {\r\n                // Revert consumed figure so other features can convert it.\r\n                conversionApi.consumable.revert(data.viewItem, { name: true, classes: 'table' });\r\n                return;\r\n            }\r\n            conversionApi.convertChildren(data.viewItem, conversionApi.writer.createPositionAt(modelTable, 'end'));\r\n            conversionApi.updateConversionResult(modelTable, data);\r\n        });\r\n    };\r\n}\r\n/**\r\n * View table element to model table element conversion helper.\r\n *\r\n * This conversion helper converts the table element as well as table rows.\r\n *\r\n * @returns Conversion helper.\r\n */\r\nexport default function upcastTable() {\r\n    return (dispatcher) => {\r\n        dispatcher.on('element:table', (evt, data, conversionApi) => {\r\n            const viewTable = data.viewItem;\r\n            // When element was already consumed then skip it.\r\n            if (!conversionApi.consumable.test(viewTable, { name: true })) {\r\n                return;\r\n            }\r\n            const { rows, headingRows, headingColumns } = scanTable(viewTable);\r\n            // Only set attributes if values is greater then 0.\r\n            const attributes = {};\r\n            if (headingColumns) {\r\n                attributes.headingColumns = headingColumns;\r\n            }\r\n            if (headingRows) {\r\n                attributes.headingRows = headingRows;\r\n            }\r\n            const table = conversionApi.writer.createElement('table', attributes);\r\n            if (!conversionApi.safeInsert(table, data.modelCursor)) {\r\n                return;\r\n            }\r\n            conversionApi.consumable.consume(viewTable, { name: true });\r\n            // Upcast table rows in proper order (heading rows first).\r\n            rows.forEach(row => conversionApi.convertItem(row, conversionApi.writer.createPositionAt(table, 'end')));\r\n            // Convert everything else.\r\n            conversionApi.convertChildren(viewTable, conversionApi.writer.createPositionAt(table, 'end'));\r\n            // Create one row and one table cell for empty table.\r\n            if (table.isEmpty) {\r\n                const row = conversionApi.writer.createElement('tableRow');\r\n                conversionApi.writer.insert(row, conversionApi.writer.createPositionAt(table, 'end'));\r\n                createEmptyTableCell(conversionApi.writer, conversionApi.writer.createPositionAt(row, 'end'));\r\n            }\r\n            conversionApi.updateConversionResult(table, data);\r\n        });\r\n    };\r\n}\r\n/**\r\n * A conversion helper that skips empty <tr> elements from upcasting at the beginning of the table.\r\n *\r\n * An empty row is considered a table model error but when handling clipboard data there could be rows that contain only row-spanned cells\r\n * and empty TR-s are used to maintain the table structure (also {@link module:table/tablewalker~TableWalker} assumes that there are only\r\n * rows that have related `tableRow` elements).\r\n *\r\n * *Note:* Only the first empty rows are removed because they have no meaning and it solves the issue\r\n * of an improper table with all empty rows.\r\n *\r\n * @returns Conversion helper.\r\n */\r\nexport function skipEmptyTableRow() {\r\n    return (dispatcher) => {\r\n        dispatcher.on('element:tr', (evt, data) => {\r\n            if (data.viewItem.isEmpty && data.modelCursor.index == 0) {\r\n                evt.stop();\r\n            }\r\n        }, { priority: 'high' });\r\n    };\r\n}\r\n/**\r\n * A converter that ensures an empty paragraph is inserted in a table cell if no other content was converted.\r\n *\r\n * @returns Conversion helper.\r\n */\r\nexport function ensureParagraphInTableCell(elementName) {\r\n    return (dispatcher) => {\r\n        dispatcher.on(`element:${elementName}`, (evt, data, { writer }) => {\r\n            // The default converter will create a model range on converted table cell.\r\n            if (!data.modelRange) {\r\n                return;\r\n            }\r\n            const tableCell = data.modelRange.start.nodeAfter;\r\n            const modelCursor = writer.createPositionAt(tableCell, 0);\r\n            // Ensure a paragraph in the model for empty table cells for converted table cells.\r\n            if (data.viewItem.isEmpty) {\r\n                writer.insertElement('paragraph', modelCursor);\r\n                return;\r\n            }\r\n            const childNodes = Array.from(tableCell.getChildren());\r\n            // In case there are only markers inside the table cell then move them to the paragraph.\r\n            if (childNodes.every(node => node.is('element', '$marker'))) {\r\n                const paragraph = writer.createElement('paragraph');\r\n                writer.insert(paragraph, writer.createPositionAt(tableCell, 0));\r\n                for (const node of childNodes) {\r\n                    writer.move(writer.createRangeOn(node), writer.createPositionAt(paragraph, 'end'));\r\n                }\r\n            }\r\n        }, { priority: 'low' });\r\n    };\r\n}\r\n/**\r\n * Get view `<table>` element from the view widget (`<figure>`).\r\n */\r\nfunction getViewTableFromFigure(figureView) {\r\n    for (const figureChild of figureView.getChildren()) {\r\n        if (figureChild.is('element', 'table')) {\r\n            return figureChild;\r\n        }\r\n    }\r\n}\r\n/**\r\n * Scans table rows and extracts required metadata from the table:\r\n *\r\n * headingRows    - The number of rows that go as table headers.\r\n * headingColumns - The maximum number of row headings.\r\n * rows           - Sorted `<tr>` elements as they should go into the model - ie. if `<thead>` is inserted after `<tbody>` in the view.\r\n */\r\nfunction scanTable(viewTable) {\r\n    let headingRows = 0;\r\n    let headingColumns = undefined;\r\n    // The `<tbody>` and `<thead>` sections in the DOM do not have to be in order `<thead>` -> `<tbody>` and there might be more than one\r\n    // of them.\r\n    // As the model does not have these sections, rows from different sections must be sorted.\r\n    // For example, below is a valid HTML table:\r\n    //\r\n    // <table>\r\n    //   <tbody><tr><td>2</td></tr></tbody>\r\n    //   <thead><tr><td>1</td></tr></thead>\r\n    //   <tbody><tr><td>3</td></tr></tbody>\r\n    // </table>\r\n    //\r\n    // But browsers will render rows in order as: 1 as the heading and 2 and 3 as the body.\r\n    const headRows = [];\r\n    const bodyRows = [];\r\n    // Currently the editor does not support more then one <thead> section.\r\n    // Only the first <thead> from the view will be used as a heading row and the others will be converted to body rows.\r\n    let firstTheadElement;\r\n    for (const tableChild of Array.from(viewTable.getChildren())) {\r\n        // Only `<thead>`, `<tbody>` & `<tfoot>` from allowed table children can have `<tr>`s.\r\n        // The else is for future purposes (mainly `<caption>`).\r\n        if (tableChild.name !== 'tbody' && tableChild.name !== 'thead' && tableChild.name !== 'tfoot') {\r\n            continue;\r\n        }\r\n        // Save the first `<thead>` in the table as table header - all other ones will be converted to table body rows.\r\n        if (tableChild.name === 'thead' && !firstTheadElement) {\r\n            firstTheadElement = tableChild;\r\n        }\r\n        // There might be some extra empty text nodes between the `<tr>`s.\r\n        // Make sure further code operates on `tr`s only. (#145)\r\n        const trs = Array.from(tableChild.getChildren()).filter((el) => el.is('element', 'tr'));\r\n        for (const tr of trs) {\r\n            // This <tr> is a child of a first <thead> element.\r\n            if ((firstTheadElement && tableChild === firstTheadElement) ||\r\n                (tableChild.name === 'tbody' &&\r\n                    Array.from(tr.getChildren()).length &&\r\n                    Array.from(tr.getChildren()).every(e => e.is('element', 'th')))) {\r\n                headingRows++;\r\n                headRows.push(tr);\r\n            }\r\n            else {\r\n                bodyRows.push(tr);\r\n                // For other rows check how many column headings this row has.\r\n                const headingCols = scanRowForHeadingColumns(tr);\r\n                if (!headingColumns || headingCols < headingColumns) {\r\n                    headingColumns = headingCols;\r\n                }\r\n            }\r\n        }\r\n    }\r\n    return {\r\n        headingRows,\r\n        headingColumns: headingColumns || 0,\r\n        rows: [...headRows, ...bodyRows]\r\n    };\r\n}\r\n/**\r\n * Scans a `<tr>` element and its children for metadata:\r\n * - For heading row:\r\n *     - Adds this row to either the heading or the body rows.\r\n *     - Updates the number of heading rows.\r\n * - For body rows:\r\n *     - Calculates the number of column headings.\r\n */\r\nfunction scanRowForHeadingColumns(tr) {\r\n    let headingColumns = 0;\r\n    let index = 0;\r\n    // Filter out empty text nodes from tr children.\r\n    const children = Array.from(tr.getChildren())\r\n        .filter(child => child.name === 'th' || child.name === 'td');\r\n    // Count starting adjacent <th> elements of a <tr>.\r\n    while (index < children.length && children[index].name === 'th') {\r\n        const th = children[index];\r\n        // Adjust columns calculation by the number of spanned columns.\r\n        const colspan = parseInt(th.getAttribute('colspan') || '1');\r\n        headingColumns = headingColumns + colspan;\r\n        index++;\r\n    }\r\n    return headingColumns;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * The table iterator class. It allows to iterate over table cells. For each cell the iterator yields\r\n * {@link module:table/tablewalker~TableSlot} with proper table cell attributes.\r\n */\r\nexport default class TableWalker {\r\n    /**\r\n     * Creates an instance of the table walker.\r\n     *\r\n     * The table walker iterates internally by traversing the table from row index = 0 and column index = 0.\r\n     * It walks row by row and column by column in order to output values defined in the constructor.\r\n     * By default it will output only the locations that are occupied by a cell. To include also spanned rows and columns,\r\n     * pass the `includeAllSlots` option to the constructor.\r\n     *\r\n     * The most important values of the iterator are column and row indexes of a cell.\r\n     *\r\n     * See {@link module:table/tablewalker~TableSlot} what values are returned by the table walker.\r\n     *\r\n     * To iterate over a given row:\r\n     *\r\n     * ```ts\r\n     * const tableWalker = new TableWalker( table, { startRow: 1, endRow: 2 } );\r\n     *\r\n     * for ( const tableSlot of tableWalker ) {\r\n     *   console.log( 'A cell at row', tableSlot.row, 'and column', tableSlot.column );\r\n     * }\r\n     * ```\r\n     *\r\n     * For instance the code above for the following table:\r\n     *\r\n     *  +----+----+----+----+----+----+\r\n     *  | 00      | 02 | 03 | 04 | 05 |\r\n     *  |         +----+----+----+----+\r\n     *  |         | 12      | 14 | 15 |\r\n     *  |         +----+----+----+    +\r\n     *  |         | 22           |    |\r\n     *  |----+----+----+----+----+    +\r\n     *  | 30 | 31 | 32 | 33 | 34 |    |\r\n     *  +----+----+----+----+----+----+\r\n     *\r\n     * will log in the console:\r\n     *\r\n     *  'A cell at row 1 and column 2'\r\n     *  'A cell at row 1 and column 4'\r\n     *  'A cell at row 1 and column 5'\r\n     *  'A cell at row 2 and column 2'\r\n     *\r\n     * To also iterate over spanned cells:\r\n     *\r\n     * ```ts\r\n     * const tableWalker = new TableWalker( table, { row: 1, includeAllSlots: true } );\r\n     *\r\n     * for ( const tableSlot of tableWalker ) {\r\n     *   console.log( 'Slot at', tableSlot.row, 'x', tableSlot.column, ':', tableSlot.isAnchor ? 'is anchored' : 'is spanned' );\r\n     * }\r\n     * ```\r\n     *\r\n     * will log in the console for the table from the previous example:\r\n     *\r\n     *  'Cell at 1 x 0 : is spanned'\r\n     *  'Cell at 1 x 1 : is spanned'\r\n     *  'Cell at 1 x 2 : is anchored'\r\n     *  'Cell at 1 x 3 : is spanned'\r\n     *  'Cell at 1 x 4 : is anchored'\r\n     *  'Cell at 1 x 5 : is anchored'\r\n     *\r\n     * **Note**: Option `row` is a shortcut that sets both `startRow` and `endRow` to the same row.\r\n     * (Use either `row` or `startRow` and `endRow` but never together). Similarly the `column` option sets both `startColumn`\r\n     * and `endColumn` to the same column (Use either `column` or `startColumn` and `endColumn` but never together).\r\n     *\r\n     * @param table A table over which the walker iterates.\r\n     * @param options An object with configuration.\r\n     * @param options.row A row index for which this iterator will output cells. Can't be used together with `startRow` and `endRow`.\r\n     * @param options.startRow A row index from which this iterator should start. Can't be used together with `row`. Default value is 0.\r\n     * @param options.endRow A row index at which this iterator should end. Can't be used together with `row`.\r\n     * @param options.column A column index for which this iterator will output cells.\r\n     * Can't be used together with `startColumn` and `endColumn`.\r\n     * @param options.startColumn A column index from which this iterator should start.\r\n     * Can't be used together with `column`. Default value is 0.\r\n     * @param options.endColumn A column index at which this iterator should end. Can't be used together with `column`.\r\n     * @param options.includeAllSlots Also return values for spanned cells. Default value is \"false\".\r\n     */\r\n    constructor(table, options = {}) {\r\n        this._table = table;\r\n        this._startRow = options.row !== undefined ? options.row : options.startRow || 0;\r\n        this._endRow = options.row !== undefined ? options.row : options.endRow;\r\n        this._startColumn = options.column !== undefined ? options.column : options.startColumn || 0;\r\n        this._endColumn = options.column !== undefined ? options.column : options.endColumn;\r\n        this._includeAllSlots = !!options.includeAllSlots;\r\n        this._skipRows = new Set();\r\n        this._row = 0;\r\n        this._rowIndex = 0;\r\n        this._column = 0;\r\n        this._cellIndex = 0;\r\n        this._spannedCells = new Map();\r\n        this._nextCellAtColumn = -1;\r\n    }\r\n    /**\r\n     * Iterable interface.\r\n     */\r\n    [Symbol.iterator]() {\r\n        return this;\r\n    }\r\n    /**\r\n     * Gets the next table walker's value.\r\n     *\r\n     * @returns The next table walker's value.\r\n     */\r\n    next() {\r\n        const row = this._table.getChild(this._rowIndex);\r\n        // Iterator is done when there's no row (table ended) or the row is after `endRow` limit.\r\n        if (!row || this._isOverEndRow()) {\r\n            return { done: true, value: undefined };\r\n        }\r\n        // We step over current element when it is not a tableRow instance.\r\n        if (!row.is('element', 'tableRow')) {\r\n            this._rowIndex++;\r\n            return this.next();\r\n        }\r\n        if (this._isOverEndColumn()) {\r\n            return this._advanceToNextRow();\r\n        }\r\n        let outValue = null;\r\n        const spanData = this._getSpanned();\r\n        if (spanData) {\r\n            if (this._includeAllSlots && !this._shouldSkipSlot()) {\r\n                outValue = this._formatOutValue(spanData.cell, spanData.row, spanData.column);\r\n            }\r\n        }\r\n        else {\r\n            const cell = row.getChild(this._cellIndex);\r\n            if (!cell) {\r\n                // If there are no more cells left in row advance to the next row.\r\n                return this._advanceToNextRow();\r\n            }\r\n            const colspan = parseInt(cell.getAttribute('colspan') || '1');\r\n            const rowspan = parseInt(cell.getAttribute('rowspan') || '1');\r\n            // Record this cell spans if it's not 1x1 cell.\r\n            if (colspan > 1 || rowspan > 1) {\r\n                this._recordSpans(cell, rowspan, colspan);\r\n            }\r\n            if (!this._shouldSkipSlot()) {\r\n                outValue = this._formatOutValue(cell);\r\n            }\r\n            this._nextCellAtColumn = this._column + colspan;\r\n        }\r\n        // Advance to the next column before returning value.\r\n        this._column++;\r\n        if (this._column == this._nextCellAtColumn) {\r\n            this._cellIndex++;\r\n        }\r\n        // The current value will be returned only if current row and column are not skipped.\r\n        return outValue || this.next();\r\n    }\r\n    /**\r\n     * Marks a row to skip in the next iteration. It will also skip cells from the current row if there are any cells from the current row\r\n     * to output.\r\n     *\r\n     * @param row The row index to skip.\r\n     */\r\n    skipRow(row) {\r\n        this._skipRows.add(row);\r\n    }\r\n    /**\r\n     * Advances internal cursor to the next row.\r\n     */\r\n    _advanceToNextRow() {\r\n        this._row++;\r\n        this._rowIndex++;\r\n        this._column = 0;\r\n        this._cellIndex = 0;\r\n        this._nextCellAtColumn = -1;\r\n        return this.next();\r\n    }\r\n    /**\r\n     * Checks if the current row is over {@link #_endRow}.\r\n     */\r\n    _isOverEndRow() {\r\n        // If #_endRow is defined skip all rows after it.\r\n        return this._endRow !== undefined && this._row > this._endRow;\r\n    }\r\n    /**\r\n     * Checks if the current cell is over {@link #_endColumn}\r\n     */\r\n    _isOverEndColumn() {\r\n        // If #_endColumn is defined skip all cells after it.\r\n        return this._endColumn !== undefined && this._column > this._endColumn;\r\n    }\r\n    /**\r\n     * A common method for formatting the iterator's output value.\r\n     *\r\n     * @param cell The table cell to output.\r\n     * @param anchorRow The row index of a cell anchor slot.\r\n     * @param anchorColumn The column index of a cell anchor slot.\r\n     */\r\n    _formatOutValue(cell, anchorRow = this._row, anchorColumn = this._column) {\r\n        return {\r\n            done: false,\r\n            value: new TableSlot(this, cell, anchorRow, anchorColumn)\r\n        };\r\n    }\r\n    /**\r\n     * Checks if the current slot should be skipped.\r\n     */\r\n    _shouldSkipSlot() {\r\n        const rowIsMarkedAsSkipped = this._skipRows.has(this._row);\r\n        const rowIsBeforeStartRow = this._row < this._startRow;\r\n        const columnIsBeforeStartColumn = this._column < this._startColumn;\r\n        const columnIsAfterEndColumn = this._endColumn !== undefined && this._column > this._endColumn;\r\n        return rowIsMarkedAsSkipped || rowIsBeforeStartRow || columnIsBeforeStartColumn || columnIsAfterEndColumn;\r\n    }\r\n    /**\r\n     * Returns the cell element that is spanned over the current cell location.\r\n     */\r\n    _getSpanned() {\r\n        const rowMap = this._spannedCells.get(this._row);\r\n        // No spans for given row.\r\n        if (!rowMap) {\r\n            return null;\r\n        }\r\n        // If spans for given rows has entry for column it means that this location if spanned by other cell.\r\n        return rowMap.get(this._column) || null;\r\n    }\r\n    /**\r\n     * Updates spanned cells map relative to the current cell location and its span dimensions.\r\n     *\r\n     * @param cell A cell that is spanned.\r\n     * @param rowspan Cell height.\r\n     * @param colspan Cell width.\r\n     */\r\n    _recordSpans(cell, rowspan, colspan) {\r\n        const data = {\r\n            cell,\r\n            row: this._row,\r\n            column: this._column\r\n        };\r\n        for (let rowToUpdate = this._row; rowToUpdate < this._row + rowspan; rowToUpdate++) {\r\n            for (let columnToUpdate = this._column; columnToUpdate < this._column + colspan; columnToUpdate++) {\r\n                if (rowToUpdate != this._row || columnToUpdate != this._column) {\r\n                    this._markSpannedCell(rowToUpdate, columnToUpdate, data);\r\n                }\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Marks the cell location as spanned by another cell.\r\n     *\r\n     * @param row The row index of the cell location.\r\n     * @param column The column index of the cell location.\r\n     * @param data A spanned cell details (cell element, anchor row and column).\r\n     */\r\n    _markSpannedCell(row, column, data) {\r\n        if (!this._spannedCells.has(row)) {\r\n            this._spannedCells.set(row, new Map());\r\n        }\r\n        const rowSpans = this._spannedCells.get(row);\r\n        rowSpans.set(column, data);\r\n    }\r\n}\r\n/**\r\n * An object returned by {@link module:table/tablewalker~TableWalker} when traversing table cells.\r\n */\r\nclass TableSlot {\r\n    /**\r\n     * Creates an instance of the table walker value.\r\n     *\r\n     * @param tableWalker The table walker instance.\r\n     * @param cell The current table cell.\r\n     * @param anchorRow The row index of a cell anchor slot.\r\n     * @param anchorColumn The column index of a cell anchor slot.\r\n     */\r\n    constructor(tableWalker, cell, anchorRow, anchorColumn) {\r\n        this.cell = cell;\r\n        this.row = tableWalker._row;\r\n        this.column = tableWalker._column;\r\n        this.cellAnchorRow = anchorRow;\r\n        this.cellAnchorColumn = anchorColumn;\r\n        this._cellIndex = tableWalker._cellIndex;\r\n        this._rowIndex = tableWalker._rowIndex;\r\n        this._table = tableWalker._table;\r\n    }\r\n    // @if CK_DEBUG // public get isSpanned(): unknown { return throwMissingGetterError( 'isSpanned' ); }\r\n    // @if CK_DEBUG // public get colspan(): unknown { return throwMissingGetterError( 'colspan' ); }\r\n    // @if CK_DEBUG // public get rowspan(): unknown { return throwMissingGetterError( 'rowspan' ); }\r\n    // @if CK_DEBUG // public get cellIndex(): unknown { return throwMissingGetterError( 'cellIndex' ); }\r\n    /**\r\n     * Whether the cell is anchored in the current slot.\r\n     */\r\n    get isAnchor() {\r\n        return this.row === this.cellAnchorRow && this.column === this.cellAnchorColumn;\r\n    }\r\n    /**\r\n     * The width of a cell defined by a `colspan` attribute. If the model attribute is not present, it is set to `1`.\r\n     */\r\n    get cellWidth() {\r\n        return parseInt(this.cell.getAttribute('colspan') || '1');\r\n    }\r\n    /**\r\n     * The height of a cell defined by a `rowspan` attribute. If the model attribute is not present, it is set to `1`.\r\n     */\r\n    get cellHeight() {\r\n        return parseInt(this.cell.getAttribute('rowspan') || '1');\r\n    }\r\n    /**\r\n     * The index of the current row element in the table.\r\n     */\r\n    get rowIndex() {\r\n        return this._rowIndex;\r\n    }\r\n    /**\r\n     * Returns the {@link module:engine/model/position~Position} before the table slot.\r\n     */\r\n    getPositionBefore() {\r\n        const model = this._table.root.document.model;\r\n        return model.createPositionAt(this._table.getChild(this.row), this._cellIndex);\r\n    }\r\n}\r\n/**\r\n * This `TableSlot`'s getter (property) was removed in CKEditor 5 v20.0.0.\r\n *\r\n * Check out the new `TableWalker`'s API in the documentation.\r\n *\r\n * @error tableslot-getter-removed\r\n * @param getterName\r\n */\r\n// @if CK_DEBUG // function throwMissingGetterError( getterName: string ): void {\r\n// @if CK_DEBUG //\t\tthrow new CKEditorError( 'tableslot-getter-removed', null, {\r\n// @if CK_DEBUG //\t\t\tgetterName\r\n// @if CK_DEBUG //\t\t} );\r\n// @if CK_DEBUG // }\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/converters/downcast\r\n */\r\nimport { toWidget, toWidgetEditable } from 'ckeditor5/src/widget';\r\nimport TableWalker from './../tablewalker';\r\n/**\r\n * Model table element to view table element conversion helper.\r\n */\r\nexport function downcastTable(tableUtils, options) {\r\n    return (table, { writer }) => {\r\n        const headingRows = table.getAttribute('headingRows') || 0;\r\n        const tableElement = writer.createContainerElement('table', null, []);\r\n        const figureElement = writer.createContainerElement('figure', { class: 'table' }, tableElement);\r\n        // Table head slot.\r\n        if (headingRows > 0) {\r\n            writer.insert(writer.createPositionAt(tableElement, 'end'), writer.createContainerElement('thead', null, writer.createSlot(element => element.is('element', 'tableRow') && element.index < headingRows)));\r\n        }\r\n        // Table body slot.\r\n        if (headingRows < tableUtils.getRows(table)) {\r\n            writer.insert(writer.createPositionAt(tableElement, 'end'), writer.createContainerElement('tbody', null, writer.createSlot(element => element.is('element', 'tableRow') && element.index >= headingRows)));\r\n        }\r\n        // Dynamic slots.\r\n        for (const { positionOffset, filter } of options.additionalSlots) {\r\n            writer.insert(writer.createPositionAt(tableElement, positionOffset), writer.createSlot(filter));\r\n        }\r\n        // Create a slot with items that don't fit into the table.\r\n        writer.insert(writer.createPositionAt(tableElement, 'after'), writer.createSlot(element => {\r\n            if (element.is('element', 'tableRow')) {\r\n                return false;\r\n            }\r\n            return !options.additionalSlots.some(({ filter }) => filter(element));\r\n        }));\r\n        return options.asWidget ? toTableWidget(figureElement, writer) : figureElement;\r\n    };\r\n}\r\n/**\r\n * Model table row element to view `<tr>` element conversion helper.\r\n *\r\n * @returns Element creator.\r\n */\r\nexport function downcastRow() {\r\n    return (tableRow, { writer }) => {\r\n        return tableRow.isEmpty ?\r\n            writer.createEmptyElement('tr') :\r\n            writer.createContainerElement('tr');\r\n    };\r\n}\r\n/**\r\n * Model table cell element to view `<td>` or `<th>` element conversion helper.\r\n *\r\n * This conversion helper will create proper `<th>` elements for table cells that are in the heading section (heading row or column)\r\n * and `<td>` otherwise.\r\n *\r\n * @param options.asWidget If set to `true`, the downcast conversion will produce a widget.\r\n * @returns Element creator.\r\n */\r\nexport function downcastCell(options = {}) {\r\n    return (tableCell, { writer }) => {\r\n        const tableRow = tableCell.parent;\r\n        const table = tableRow.parent;\r\n        const rowIndex = table.getChildIndex(tableRow);\r\n        const tableWalker = new TableWalker(table, { row: rowIndex });\r\n        const headingRows = table.getAttribute('headingRows') || 0;\r\n        const headingColumns = table.getAttribute('headingColumns') || 0;\r\n        let result = null;\r\n        // We need to iterate over a table in order to get proper row & column values from a walker.\r\n        for (const tableSlot of tableWalker) {\r\n            if (tableSlot.cell == tableCell) {\r\n                const isHeading = tableSlot.row < headingRows || tableSlot.column < headingColumns;\r\n                const cellElementName = isHeading ? 'th' : 'td';\r\n                result = options.asWidget ?\r\n                    toWidgetEditable(writer.createEditableElement(cellElementName), writer) :\r\n                    writer.createContainerElement(cellElementName);\r\n                break;\r\n            }\r\n        }\r\n        return result;\r\n    };\r\n}\r\n/**\r\n * Overrides paragraph inside table cell conversion.\r\n *\r\n * This converter:\r\n * * should be used to override default paragraph conversion.\r\n * * It will only convert `<paragraph>` placed directly inside `<tableCell>`.\r\n * * For a single paragraph without attributes it returns `<span>` to simulate data table.\r\n * * For all other cases it returns `<p>` element.\r\n *\r\n * @param options.asWidget If set to `true`, the downcast conversion will produce a widget.\r\n * @returns Element creator.\r\n */\r\nexport function convertParagraphInTableCell(options = {}) {\r\n    return (modelElement, { writer }) => {\r\n        if (!modelElement.parent.is('element', 'tableCell')) {\r\n            return null;\r\n        }\r\n        if (!isSingleParagraphWithoutAttributes(modelElement)) {\r\n            return null;\r\n        }\r\n        if (options.asWidget) {\r\n            return writer.createContainerElement('span', { class: 'ck-table-bogus-paragraph' });\r\n        }\r\n        else {\r\n            // Using `<p>` in case there are some markers on it and transparentRendering will render it anyway.\r\n            const viewElement = writer.createContainerElement('p');\r\n            writer.setCustomProperty('dataPipeline:transparentRendering', true, viewElement);\r\n            return viewElement;\r\n        }\r\n    };\r\n}\r\n/**\r\n * Checks if given model `<paragraph>` is an only child of a parent (`<tableCell>`) and if it has any attribute set.\r\n *\r\n * The paragraph should be converted in the editing view to:\r\n *\r\n * * If returned `true` - to a `<span class=\"ck-table-bogus-paragraph\">`\r\n * * If returned `false` - to a `<p>`\r\n */\r\nexport function isSingleParagraphWithoutAttributes(modelElement) {\r\n    const tableCell = modelElement.parent;\r\n    const isSingleParagraph = tableCell.childCount == 1;\r\n    return isSingleParagraph && !hasAnyAttribute(modelElement);\r\n}\r\n/**\r\n * Converts a given {@link module:engine/view/element~Element} to a table widget:\r\n * * Adds a {@link module:engine/view/element~Element#_setCustomProperty custom property} allowing to recognize the table widget element.\r\n * * Calls the {@link module:widget/utils~toWidget} function with the proper element's label creator.\r\n *\r\n * @param writer An instance of the view writer.\r\n * @param label The element's label. It will be concatenated with the table `alt` attribute if one is present.\r\n */\r\nfunction toTableWidget(viewElement, writer) {\r\n    writer.setCustomProperty('table', true, viewElement);\r\n    return toWidget(viewElement, writer, { hasSelectionHandle: true });\r\n}\r\n/**\r\n * Checks if an element has any attributes set.\r\n */\r\nfunction hasAnyAttribute(element) {\r\n    const iteratorItem = element.getAttributeKeys().next();\r\n    return !iteratorItem.done;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/commands/inserttablecommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\n/**\r\n * The insert table command.\r\n *\r\n * The command is registered by {@link module:table/tableediting~TableEditing} as the `'insertTable'` editor command.\r\n *\r\n * To insert a table at the current selection, execute the command and specify the dimensions:\r\n *\r\n * ```ts\r\n * editor.execute( 'insertTable', { rows: 20, columns: 5 } );\r\n * ```\r\n */\r\nexport default class InsertTableCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const model = this.editor.model;\r\n        const selection = model.document.selection;\r\n        const schema = model.schema;\r\n        this.isEnabled = isAllowedInParent(selection, schema);\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * Inserts a table with the given number of rows and columns into the editor.\r\n     *\r\n     * @param options.rows The number of rows to create in the inserted table. Default value is 2.\r\n     * @param options.columns The number of columns to create in the inserted table. Default value is 2.\r\n     * @param options.headingRows The number of heading rows. If not provided it will default to\r\n     * {@link module:table/tableconfig~TableConfig#defaultHeadings `config.table.defaultHeadings.rows`} table config.\r\n     * @param options.headingColumns The number of heading columns. If not provided it will default to\r\n     * {@link module:table/tableconfig~TableConfig#defaultHeadings `config.table.defaultHeadings.columns`} table config.\r\n     * @fires execute\r\n     */\r\n    execute(options = {}) {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const tableUtils = editor.plugins.get('TableUtils');\r\n        const defaultRows = editor.config.get('table.defaultHeadings.rows');\r\n        const defaultColumns = editor.config.get('table.defaultHeadings.columns');\r\n        if (options.headingRows === undefined && defaultRows) {\r\n            options.headingRows = defaultRows;\r\n        }\r\n        if (options.headingColumns === undefined && defaultColumns) {\r\n            options.headingColumns = defaultColumns;\r\n        }\r\n        model.change(writer => {\r\n            const table = tableUtils.createTable(writer, options);\r\n            model.insertObject(table, null, null, { findOptimalPosition: 'auto' });\r\n            writer.setSelection(writer.createPositionAt(table.getNodeByPath([0, 0, 0]), 0));\r\n        });\r\n    }\r\n}\r\n/**\r\n * Checks if the table is allowed in the parent.\r\n */\r\nfunction isAllowedInParent(selection, schema) {\r\n    const positionParent = selection.getFirstPosition().parent;\r\n    const validParent = positionParent === positionParent.root ? positionParent : positionParent.parent;\r\n    return schema.checkChild(validParent, 'table');\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/commands/insertrowcommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\n/**\r\n * The insert row command.\r\n *\r\n * The command is registered by {@link module:table/tableediting~TableEditing} as the `'insertTableRowBelow'` and\r\n * `'insertTableRowAbove'` editor commands.\r\n *\r\n * To insert a row below the selected cell, execute the following command:\r\n *\r\n * ```ts\r\n * editor.execute( 'insertTableRowBelow' );\r\n * ```\r\n *\r\n * To insert a row above the selected cell, execute the following command:\r\n *\r\n * ```ts\r\n * editor.execute( 'insertTableRowAbove' );\r\n * ```\r\n */\r\nexport default class InsertRowCommand extends Command {\r\n    /**\r\n     * Creates a new `InsertRowCommand` instance.\r\n     *\r\n     * @param editor The editor on which this command will be used.\r\n     * @param options.order The order of insertion relative to the row in which the caret is located.\r\n     * Possible values: `\"above\"` and `\"below\"`. Default value is \"below\"\r\n     */\r\n    constructor(editor, options = {}) {\r\n        super(editor);\r\n        this.order = options.order || 'below';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const selection = this.editor.model.document.selection;\r\n        const tableUtils = this.editor.plugins.get('TableUtils');\r\n        const isAnyCellSelected = !!tableUtils.getSelectionAffectedTableCells(selection).length;\r\n        this.isEnabled = isAnyCellSelected;\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * Depending on the command's {@link #order} value, it inserts a row `'below'` or `'above'` the row in which selection is set.\r\n     *\r\n     * @fires execute\r\n     */\r\n    execute() {\r\n        const editor = this.editor;\r\n        const selection = editor.model.document.selection;\r\n        const tableUtils = editor.plugins.get('TableUtils');\r\n        const insertAbove = this.order === 'above';\r\n        const affectedTableCells = tableUtils.getSelectionAffectedTableCells(selection);\r\n        const rowIndexes = tableUtils.getRowIndexes(affectedTableCells);\r\n        const row = insertAbove ? rowIndexes.first : rowIndexes.last;\r\n        const table = affectedTableCells[0].findAncestor('table');\r\n        tableUtils.insertRows(table, { at: insertAbove ? row : row + 1, copyStructureFromAbove: !insertAbove });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/commands/insertcolumncommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\n/**\r\n * The insert column command.\r\n *\r\n * The command is registered by {@link module:table/tableediting~TableEditing} as the `'insertTableColumnLeft'` and\r\n * `'insertTableColumnRight'` editor commands.\r\n *\r\n * To insert a column to the left of the selected cell, execute the following command:\r\n *\r\n * ```ts\r\n * editor.execute( 'insertTableColumnLeft' );\r\n * ```\r\n *\r\n * To insert a column to the right of the selected cell, execute the following command:\r\n *\r\n * ```ts\r\n * editor.execute( 'insertTableColumnRight' );\r\n * ```\r\n */\r\nexport default class InsertColumnCommand extends Command {\r\n    /**\r\n     * Creates a new `InsertColumnCommand` instance.\r\n     *\r\n     * @param editor An editor on which this command will be used.\r\n     * @param options.order The order of insertion relative to the column in which the caret is located.\r\n     * Possible values: `\"left\"` and `\"right\"`. Default value is \"right\".\r\n     */\r\n    constructor(editor, options = {}) {\r\n        super(editor);\r\n        this.order = options.order || 'right';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const selection = this.editor.model.document.selection;\r\n        const tableUtils = this.editor.plugins.get('TableUtils');\r\n        const isAnyCellSelected = !!tableUtils.getSelectionAffectedTableCells(selection).length;\r\n        this.isEnabled = isAnyCellSelected;\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * Depending on the command's {@link #order} value, it inserts a column to the `'left'` or `'right'` of the column\r\n     * in which the selection is set.\r\n     *\r\n     * @fires execute\r\n     */\r\n    execute() {\r\n        const editor = this.editor;\r\n        const selection = editor.model.document.selection;\r\n        const tableUtils = editor.plugins.get('TableUtils');\r\n        const insertBefore = this.order === 'left';\r\n        const affectedTableCells = tableUtils.getSelectionAffectedTableCells(selection);\r\n        const columnIndexes = tableUtils.getColumnIndexes(affectedTableCells);\r\n        const column = insertBefore ? columnIndexes.first : columnIndexes.last;\r\n        const table = affectedTableCells[0].findAncestor('table');\r\n        tableUtils.insertColumns(table, { columns: 1, at: insertBefore ? column : column + 1 });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/commands/splitcellcommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\n/**\r\n * The split cell command.\r\n *\r\n * The command is registered by {@link module:table/tableediting~TableEditing} as the `'splitTableCellVertically'`\r\n * and `'splitTableCellHorizontally'`  editor commands.\r\n *\r\n * You can split any cell vertically or horizontally by executing this command. For example, to split the selected table cell vertically:\r\n *\r\n * ```ts\r\n * editor.execute( 'splitTableCellVertically' );\r\n * ```\r\n */\r\nexport default class SplitCellCommand extends Command {\r\n    /**\r\n     * Creates a new `SplitCellCommand` instance.\r\n     *\r\n     * @param editor The editor on which this command will be used.\r\n     * @param options.direction Indicates whether the command should split cells `'horizontally'` or `'vertically'`.\r\n     */\r\n    constructor(editor, options = {}) {\r\n        super(editor);\r\n        this.direction = options.direction || 'horizontally';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const tableUtils = this.editor.plugins.get('TableUtils');\r\n        const selectedCells = tableUtils.getSelectionAffectedTableCells(this.editor.model.document.selection);\r\n        this.isEnabled = selectedCells.length === 1;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    execute() {\r\n        const tableUtils = this.editor.plugins.get('TableUtils');\r\n        const tableCell = tableUtils.getSelectionAffectedTableCells(this.editor.model.document.selection)[0];\r\n        const isHorizontal = this.direction === 'horizontally';\r\n        if (isHorizontal) {\r\n            tableUtils.splitCellHorizontally(tableCell, 2);\r\n        }\r\n        else {\r\n            tableUtils.splitCellVertically(tableCell, 2);\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { default as TableWalker } from '../tablewalker';\r\nimport { createEmptyTableCell, updateNumericAttribute } from './common';\r\n/**\r\n * Returns a cropped table according to given dimensions.\r\n\r\n * To return a cropped table that starts at first row and first column and end in third row and column:\r\n *\r\n * ```ts\r\n * const croppedTable = cropTableToDimensions( table, {\r\n *   startRow: 1,\r\n *   endRow: 3,\r\n *   startColumn: 1,\r\n *   endColumn: 3\r\n * }, writer );\r\n * ```\r\n *\r\n * Calling the code above for the table below:\r\n *\r\n *        0   1   2   3   4                      0   1   2\r\n *      ┌───┬───┬───┬───┬───┐\r\n *   0  │ a │ b │ c │ d │ e │\r\n *      ├───┴───┤   ├───┴───┤                  ┌───┬───┬───┐\r\n *   1  │ f     │   │ g     │                  │   │   │ g │  0\r\n *      ├───┬───┴───┼───┬───┤   will return:   ├───┴───┼───┤\r\n *   2  │ h │ i     │ j │ k │                  │ i     │ j │  1\r\n *      ├───┤       ├───┤   │                  │       ├───┤\r\n *   3  │ l │       │ m │   │                  │       │ m │  2\r\n *      ├───┼───┬───┤   ├───┤                  └───────┴───┘\r\n *   4  │ n │ o │ p │   │ q │\r\n *      └───┴───┴───┴───┴───┘\r\n */\r\nexport function cropTableToDimensions(sourceTable, cropDimensions, writer) {\r\n    const { startRow, startColumn, endRow, endColumn } = cropDimensions;\r\n    // Create empty table with empty rows equal to crop height.\r\n    const croppedTable = writer.createElement('table');\r\n    const cropHeight = endRow - startRow + 1;\r\n    for (let i = 0; i < cropHeight; i++) {\r\n        writer.insertElement('tableRow', croppedTable, 'end');\r\n    }\r\n    const tableMap = [...new TableWalker(sourceTable, { startRow, endRow, startColumn, endColumn, includeAllSlots: true })];\r\n    // Iterate over source table slots (including empty - spanned - ones).\r\n    for (const { row: sourceRow, column: sourceColumn, cell: tableCell, isAnchor, cellAnchorRow, cellAnchorColumn } of tableMap) {\r\n        // Row index in cropped table.\r\n        const rowInCroppedTable = sourceRow - startRow;\r\n        const row = croppedTable.getChild(rowInCroppedTable);\r\n        // For empty slots: fill the gap with empty table cell.\r\n        if (!isAnchor) {\r\n            // But fill the gap only if the spanning cell is anchored outside cropped area.\r\n            // In the table from method jsdoc those cells are: \"c\" & \"f\".\r\n            if (cellAnchorRow < startRow || cellAnchorColumn < startColumn) {\r\n                createEmptyTableCell(writer, writer.createPositionAt(row, 'end'));\r\n            }\r\n        }\r\n        // Otherwise clone the cell with all children and trim if it exceeds cropped area.\r\n        else {\r\n            const tableCellCopy = writer.cloneElement(tableCell);\r\n            writer.append(tableCellCopy, row);\r\n            // Trim table if it exceeds cropped area.\r\n            // In the table from method jsdoc those cells are: \"g\" & \"m\".\r\n            trimTableCellIfNeeded(tableCellCopy, sourceRow, sourceColumn, endRow, endColumn, writer);\r\n        }\r\n    }\r\n    // Adjust heading rows & columns in cropped table if crop selection includes headings parts.\r\n    addHeadingsToCroppedTable(croppedTable, sourceTable, startRow, startColumn, writer);\r\n    return croppedTable;\r\n}\r\n/**\r\n * Returns slot info of cells that starts above and overlaps a given row.\r\n *\r\n * In a table below, passing `overlapRow = 3`\r\n *\r\n *     ┌───┬───┬───┬───┬───┐\r\n *  0  │ a │ b │ c │ d │ e │\r\n *     │   ├───┼───┼───┼───┤\r\n *  1  │   │ f │ g │ h │ i │\r\n *     ├───┤   ├───┼───┤   │\r\n *  2  │ j │   │ k │ l │   │\r\n *     │   │   │   ├───┼───┤\r\n *  3  │   │   │   │ m │ n │  <- overlap row to check\r\n *     ├───┼───┤   │   ├───│\r\n *  4  │ o │ p │   │   │ q │\r\n *     └───┴───┴───┴───┴───┘\r\n *\r\n * will return slot info for cells: \"j\", \"f\", \"k\".\r\n *\r\n * @param table The table to check.\r\n * @param overlapRow The index of the row to check.\r\n * @param startRow row to start analysis. Use it when it is known that the cells above that row will not overlap. Default value is 0.\r\n */\r\nexport function getVerticallyOverlappingCells(table, overlapRow, startRow = 0) {\r\n    const cells = [];\r\n    const tableWalker = new TableWalker(table, { startRow, endRow: overlapRow - 1 });\r\n    for (const slotInfo of tableWalker) {\r\n        const { row, cellHeight } = slotInfo;\r\n        const cellEndRow = row + cellHeight - 1;\r\n        if (row < overlapRow && overlapRow <= cellEndRow) {\r\n            cells.push(slotInfo);\r\n        }\r\n    }\r\n    return cells;\r\n}\r\n/**\r\n * Splits the table cell horizontally.\r\n *\r\n * @returns Created table cell, if any were created.\r\n */\r\nexport function splitHorizontally(tableCell, splitRow, writer) {\r\n    const tableRow = tableCell.parent;\r\n    const table = tableRow.parent;\r\n    const rowIndex = tableRow.index;\r\n    const rowspan = parseInt(tableCell.getAttribute('rowspan'));\r\n    const newRowspan = splitRow - rowIndex;\r\n    const newCellAttributes = {};\r\n    const newCellRowSpan = rowspan - newRowspan;\r\n    if (newCellRowSpan > 1) {\r\n        newCellAttributes.rowspan = newCellRowSpan;\r\n    }\r\n    const colspan = parseInt(tableCell.getAttribute('colspan') || '1');\r\n    if (colspan > 1) {\r\n        newCellAttributes.colspan = colspan;\r\n    }\r\n    const startRow = rowIndex;\r\n    const endRow = startRow + newRowspan;\r\n    const tableMap = [...new TableWalker(table, { startRow, endRow, includeAllSlots: true })];\r\n    let newCell = null;\r\n    let columnIndex;\r\n    for (const tableSlot of tableMap) {\r\n        const { row, column, cell } = tableSlot;\r\n        if (cell === tableCell && columnIndex === undefined) {\r\n            columnIndex = column;\r\n        }\r\n        if (columnIndex !== undefined && columnIndex === column && row === endRow) {\r\n            newCell = createEmptyTableCell(writer, tableSlot.getPositionBefore(), newCellAttributes);\r\n        }\r\n    }\r\n    // Update the rowspan attribute after updating table.\r\n    updateNumericAttribute('rowspan', newRowspan, tableCell, writer);\r\n    return newCell;\r\n}\r\n/**\r\n * Returns slot info of cells that starts before and overlaps a given column.\r\n *\r\n * In a table below, passing `overlapColumn = 3`\r\n *\r\n *    0   1   2   3   4\r\n *  ┌───────┬───────┬───┐\r\n *  │ a     │ b     │ c │\r\n *  │───┬───┴───────┼───┤\r\n *  │ d │ e         │ f │\r\n *  ├───┼───┬───────┴───┤\r\n *  │ g │ h │ i         │\r\n *  ├───┼───┼───┬───────┤\r\n *  │ j │ k │ l │ m     │\r\n *  ├───┼───┴───┼───┬───┤\r\n *  │ n │ o     │ p │ q │\r\n *  └───┴───────┴───┴───┘\r\n *                ^\r\n *                Overlap column to check\r\n *\r\n * will return slot info for cells: \"b\", \"e\", \"i\".\r\n *\r\n * @param table The table to check.\r\n * @param overlapColumn The index of the column to check.\r\n */\r\nexport function getHorizontallyOverlappingCells(table, overlapColumn) {\r\n    const cellsToSplit = [];\r\n    const tableWalker = new TableWalker(table);\r\n    for (const slotInfo of tableWalker) {\r\n        const { column, cellWidth } = slotInfo;\r\n        const cellEndColumn = column + cellWidth - 1;\r\n        if (column < overlapColumn && overlapColumn <= cellEndColumn) {\r\n            cellsToSplit.push(slotInfo);\r\n        }\r\n    }\r\n    return cellsToSplit;\r\n}\r\n/**\r\n * Splits the table cell vertically.\r\n *\r\n * @param columnIndex The table cell column index.\r\n * @param splitColumn The index of column to split cell on.\r\n * @returns Created table cell.\r\n */\r\nexport function splitVertically(tableCell, columnIndex, splitColumn, writer) {\r\n    const colspan = parseInt(tableCell.getAttribute('colspan'));\r\n    const newColspan = splitColumn - columnIndex;\r\n    const newCellAttributes = {};\r\n    const newCellColSpan = colspan - newColspan;\r\n    if (newCellColSpan > 1) {\r\n        newCellAttributes.colspan = newCellColSpan;\r\n    }\r\n    const rowspan = parseInt(tableCell.getAttribute('rowspan') || '1');\r\n    if (rowspan > 1) {\r\n        newCellAttributes.rowspan = rowspan;\r\n    }\r\n    const newCell = createEmptyTableCell(writer, writer.createPositionAfter(tableCell), newCellAttributes);\r\n    // Update the colspan attribute after updating table.\r\n    updateNumericAttribute('colspan', newColspan, tableCell, writer);\r\n    return newCell;\r\n}\r\n/**\r\n * Adjusts table cell dimensions to not exceed limit row and column.\r\n *\r\n * If table cell width (or height) covers a column (or row) that is after a limit column (or row)\r\n * this method will trim \"colspan\" (or \"rowspan\") attribute so the table cell will fit in a defined limits.\r\n */\r\nexport function trimTableCellIfNeeded(tableCell, cellRow, cellColumn, limitRow, limitColumn, writer) {\r\n    const colspan = parseInt(tableCell.getAttribute('colspan') || '1');\r\n    const rowspan = parseInt(tableCell.getAttribute('rowspan') || '1');\r\n    const endColumn = cellColumn + colspan - 1;\r\n    if (endColumn > limitColumn) {\r\n        const trimmedSpan = limitColumn - cellColumn + 1;\r\n        updateNumericAttribute('colspan', trimmedSpan, tableCell, writer, 1);\r\n    }\r\n    const endRow = cellRow + rowspan - 1;\r\n    if (endRow > limitRow) {\r\n        const trimmedSpan = limitRow - cellRow + 1;\r\n        updateNumericAttribute('rowspan', trimmedSpan, tableCell, writer, 1);\r\n    }\r\n}\r\n/**\r\n * Sets proper heading attributes to a cropped table.\r\n */\r\nfunction addHeadingsToCroppedTable(croppedTable, sourceTable, startRow, startColumn, writer) {\r\n    const headingRows = parseInt(sourceTable.getAttribute('headingRows') || '0');\r\n    if (headingRows > 0) {\r\n        const headingRowsInCrop = headingRows - startRow;\r\n        updateNumericAttribute('headingRows', headingRowsInCrop, croppedTable, writer, 0);\r\n    }\r\n    const headingColumns = parseInt(sourceTable.getAttribute('headingColumns') || '0');\r\n    if (headingColumns > 0) {\r\n        const headingColumnsInCrop = headingColumns - startColumn;\r\n        updateNumericAttribute('headingColumns', headingColumnsInCrop, croppedTable, writer, 0);\r\n    }\r\n}\r\n/**\r\n * Removes columns that have no cells anchored.\r\n *\r\n * In table below:\r\n *\r\n *     +----+----+----+----+----+----+----+\r\n *     | 00 | 01      | 03 | 04      | 06 |\r\n *     +----+----+----+----+         +----+\r\n *     | 10 | 11      | 13 |         | 16 |\r\n *     +----+----+----+----+----+----+----+\r\n *     | 20 | 21      | 23 | 24      | 26 |\r\n *     +----+----+----+----+----+----+----+\r\n *                  ^--- empty ---^\r\n *\r\n * Will remove columns 2 and 5.\r\n *\r\n * **Note:** This is a low-level helper method for clearing invalid model state when doing table modifications.\r\n * To remove a column from a table use {@link module:table/tableutils~TableUtils#removeColumns `TableUtils.removeColumns()`}.\r\n *\r\n * @internal\r\n * @returns True if removed some columns.\r\n */\r\nexport function removeEmptyColumns(table, tableUtils) {\r\n    const width = tableUtils.getColumns(table);\r\n    const columnsMap = new Array(width).fill(0);\r\n    for (const { column } of new TableWalker(table)) {\r\n        columnsMap[column]++;\r\n    }\r\n    const emptyColumns = columnsMap.reduce((result, cellsCount, column) => {\r\n        return cellsCount ? result : [...result, column];\r\n    }, []);\r\n    if (emptyColumns.length > 0) {\r\n        // Remove only last empty column because it will recurrently trigger removing empty rows.\r\n        const emptyColumn = emptyColumns[emptyColumns.length - 1];\r\n        // @if CK_DEBUG_TABLE // console.log( `Removing empty column: ${ emptyColumn }.` );\r\n        tableUtils.removeColumns(table, { at: emptyColumn });\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\n/**\r\n * Removes rows that have no cells anchored.\r\n *\r\n * In table below:\r\n *\r\n *     +----+----+----+\r\n *     | 00 | 01 | 02 |\r\n *     +----+----+----+\r\n *     | 10 | 11 | 12 |\r\n *     +    +    +    +\r\n *     |    |    |    | <-- empty\r\n *     +----+----+----+\r\n *     | 30 | 31 | 32 |\r\n *     +----+----+----+\r\n *     | 40      | 42 |\r\n *     +         +    +\r\n *     |         |    | <-- empty\r\n *     +----+----+----+\r\n *     | 60 | 61 | 62 |\r\n *     +----+----+----+\r\n *\r\n * Will remove rows 2 and 5.\r\n *\r\n * **Note:** This is a low-level helper method for clearing invalid model state when doing table modifications.\r\n * To remove a row from a table use {@link module:table/tableutils~TableUtils#removeRows `TableUtils.removeRows()`}.\r\n *\r\n * @internal\r\n * @returns True if removed some rows.\r\n */\r\nexport function removeEmptyRows(table, tableUtils) {\r\n    const emptyRows = [];\r\n    const tableRowCount = tableUtils.getRows(table);\r\n    for (let rowIndex = 0; rowIndex < tableRowCount; rowIndex++) {\r\n        const tableRow = table.getChild(rowIndex);\r\n        if (tableRow.isEmpty) {\r\n            emptyRows.push(rowIndex);\r\n        }\r\n    }\r\n    if (emptyRows.length > 0) {\r\n        // Remove only last empty row because it will recurrently trigger removing empty columns.\r\n        const emptyRow = emptyRows[emptyRows.length - 1];\r\n        // @if CK_DEBUG_TABLE // console.log( `Removing empty row: ${ emptyRow }.` );\r\n        tableUtils.removeRows(table, { at: emptyRow });\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\n/**\r\n * Removes rows and columns that have no cells anchored.\r\n *\r\n * In table below:\r\n *\r\n *     +----+----+----+----+\r\n *     | 00      | 02      |\r\n *     +----+----+         +\r\n *     | 10      |         |\r\n *     +----+----+----+----+\r\n *     | 20      | 22 | 23 |\r\n *     +         +    +    +\r\n *     |         |    |    | <-- empty row\r\n *     +----+----+----+----+\r\n *             ^--- empty column\r\n *\r\n * Will remove row 3 and column 1.\r\n *\r\n * **Note:** This is a low-level helper method for clearing invalid model state when doing table modifications.\r\n * To remove a rows from a table use {@link module:table/tableutils~TableUtils#removeRows `TableUtils.removeRows()`} and\r\n * {@link module:table/tableutils~TableUtils#removeColumns `TableUtils.removeColumns()`} to remove a column.\r\n *\r\n * @internal\r\n */\r\nexport function removeEmptyRowsColumns(table, tableUtils) {\r\n    const removedColumns = removeEmptyColumns(table, tableUtils);\r\n    // If there was some columns removed then cleaning empty rows was already triggered.\r\n    if (!removedColumns) {\r\n        removeEmptyRows(table, tableUtils);\r\n    }\r\n}\r\n/**\r\n * Returns adjusted last row index if selection covers part of a row with empty slots (spanned by other cells).\r\n * The `dimensions.lastRow` is equal to last row index but selection might be bigger.\r\n *\r\n * This happens *only* on rectangular selection so we analyze a case like this:\r\n *\r\n *        +---+---+---+---+\r\n *      0 | a | b | c | d |\r\n *        +   +   +---+---+\r\n *      1 |   | e | f | g |\r\n *        +   +---+   +---+\r\n *      2 |   | h |   | i | <- last row, each cell has rowspan = 2,\r\n *        +   +   +   +   +    so we need to return 3, not 2\r\n *      3 |   |   |   |   |\r\n *        +---+---+---+---+\r\n *\r\n * @returns Adjusted last row index.\r\n */\r\nexport function adjustLastRowIndex(table, dimensions) {\r\n    const lastRowMap = Array.from(new TableWalker(table, {\r\n        startColumn: dimensions.firstColumn,\r\n        endColumn: dimensions.lastColumn,\r\n        row: dimensions.lastRow\r\n    }));\r\n    const everyCellHasSingleRowspan = lastRowMap.every(({ cellHeight }) => cellHeight === 1);\r\n    // It is a \"flat\" row, so the last row index is OK.\r\n    if (everyCellHasSingleRowspan) {\r\n        return dimensions.lastRow;\r\n    }\r\n    // Otherwise get any cell's rowspan and adjust the last row index.\r\n    const rowspanAdjustment = lastRowMap[0].cellHeight - 1;\r\n    return dimensions.lastRow + rowspanAdjustment;\r\n}\r\n/**\r\n * Returns adjusted last column index if selection covers part of a column with empty slots (spanned by other cells).\r\n * The `dimensions.lastColumn` is equal to last column index but selection might be bigger.\r\n *\r\n * This happens *only* on rectangular selection so we analyze a case like this:\r\n *\r\n *       0   1   2   3\r\n *     +---+---+---+---+\r\n *     | a             |\r\n *     +---+---+---+---+\r\n *     | b | c | d     |\r\n *     +---+---+---+---+\r\n *     | e     | f     |\r\n *     +---+---+---+---+\r\n *     | g | h         |\r\n *     +---+---+---+---+\r\n *               ^\r\n *              last column, each cell has colspan = 2, so we need to return 3, not 2\r\n *\r\n * @returns Adjusted last column index.\r\n */\r\nexport function adjustLastColumnIndex(table, dimensions) {\r\n    const lastColumnMap = Array.from(new TableWalker(table, {\r\n        startRow: dimensions.firstRow,\r\n        endRow: dimensions.lastRow,\r\n        column: dimensions.lastColumn\r\n    }));\r\n    const everyCellHasSingleColspan = lastColumnMap.every(({ cellWidth }) => cellWidth === 1);\r\n    // It is a \"flat\" column, so the last column index is OK.\r\n    if (everyCellHasSingleColspan) {\r\n        return dimensions.lastColumn;\r\n    }\r\n    // Otherwise get any cell's colspan and adjust the last column index.\r\n    const colspanAdjustment = lastColumnMap[0].cellWidth - 1;\r\n    return dimensions.lastColumn + colspanAdjustment;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport TableWalker from '../tablewalker';\r\nimport { isHeadingColumnCell } from '../utils/common';\r\nimport { removeEmptyRowsColumns } from '../utils/structure';\r\n/**\r\n * The merge cell command.\r\n *\r\n * The command is registered by {@link module:table/tableediting~TableEditing} as the `'mergeTableCellRight'`, `'mergeTableCellLeft'`,\r\n * `'mergeTableCellUp'` and `'mergeTableCellDown'` editor commands.\r\n *\r\n * To merge a table cell at the current selection with another cell, execute the command corresponding with the preferred direction.\r\n *\r\n * For example, to merge with a cell to the right:\r\n *\r\n * ```ts\r\n * editor.execute( 'mergeTableCellRight' );\r\n * ```\r\n *\r\n * **Note**: If a table cell has a different [`rowspan`](https://www.w3.org/TR/html50/tabular-data.html#attr-tdth-rowspan)\r\n * (for `'mergeTableCellRight'` and `'mergeTableCellLeft'`) or [`colspan`](https://www.w3.org/TR/html50/tabular-data.html#attr-tdth-colspan)\r\n * (for `'mergeTableCellUp'` and `'mergeTableCellDown'`), the command will be disabled.\r\n */\r\nexport default class MergeCellCommand extends Command {\r\n    /**\r\n     * Creates a new `MergeCellCommand` instance.\r\n     *\r\n     * @param editor The editor on which this command will be used.\r\n     * @param options.direction Indicates which cell to merge with the currently selected one.\r\n     * Possible values are: `'left'`, `'right'`, `'up'` and `'down'`.\r\n     */\r\n    constructor(editor, options) {\r\n        super(editor);\r\n        this.direction = options.direction;\r\n        this.isHorizontal = this.direction == 'right' || this.direction == 'left';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const cellToMerge = this._getMergeableCell();\r\n        this.value = cellToMerge;\r\n        this.isEnabled = !!cellToMerge;\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * Depending on the command's {@link #direction} value, it will merge the cell that is to the `'left'`, `'right'`, `'up'` or `'down'`.\r\n     *\r\n     * @fires execute\r\n     */\r\n    execute() {\r\n        const model = this.editor.model;\r\n        const doc = model.document;\r\n        const tableUtils = this.editor.plugins.get('TableUtils');\r\n        const tableCell = tableUtils.getTableCellsContainingSelection(doc.selection)[0];\r\n        const cellToMerge = this.value;\r\n        const direction = this.direction;\r\n        model.change(writer => {\r\n            const isMergeNext = direction == 'right' || direction == 'down';\r\n            // The merge mechanism is always the same so sort cells to be merged.\r\n            const cellToExpand = (isMergeNext ? tableCell : cellToMerge);\r\n            const cellToRemove = (isMergeNext ? cellToMerge : tableCell);\r\n            // Cache the parent of cell to remove for later check.\r\n            const removedTableCellRow = cellToRemove.parent;\r\n            mergeTableCells(cellToRemove, cellToExpand, writer);\r\n            const spanAttribute = this.isHorizontal ? 'colspan' : 'rowspan';\r\n            const cellSpan = parseInt(tableCell.getAttribute(spanAttribute) || '1');\r\n            const cellToMergeSpan = parseInt(cellToMerge.getAttribute(spanAttribute) || '1');\r\n            // Update table cell span attribute and merge set selection on merged contents.\r\n            writer.setAttribute(spanAttribute, cellSpan + cellToMergeSpan, cellToExpand);\r\n            writer.setSelection(writer.createRangeIn(cellToExpand));\r\n            const tableUtils = this.editor.plugins.get('TableUtils');\r\n            const table = removedTableCellRow.findAncestor('table');\r\n            // Remove empty rows and columns after merging.\r\n            removeEmptyRowsColumns(table, tableUtils);\r\n        });\r\n    }\r\n    /**\r\n     * Returns a cell that can be merged with the current cell depending on the command's direction.\r\n     */\r\n    _getMergeableCell() {\r\n        const model = this.editor.model;\r\n        const doc = model.document;\r\n        const tableUtils = this.editor.plugins.get('TableUtils');\r\n        const tableCell = tableUtils.getTableCellsContainingSelection(doc.selection)[0];\r\n        if (!tableCell) {\r\n            return;\r\n        }\r\n        // First get the cell on proper direction.\r\n        const cellToMerge = this.isHorizontal ?\r\n            getHorizontalCell(tableCell, this.direction, tableUtils) :\r\n            getVerticalCell(tableCell, this.direction, tableUtils);\r\n        if (!cellToMerge) {\r\n            return;\r\n        }\r\n        // If found check if the span perpendicular to merge direction is equal on both cells.\r\n        const spanAttribute = this.isHorizontal ? 'rowspan' : 'colspan';\r\n        const span = parseInt(tableCell.getAttribute(spanAttribute) || '1');\r\n        const cellToMergeSpan = parseInt(cellToMerge.getAttribute(spanAttribute) || '1');\r\n        if (cellToMergeSpan === span) {\r\n            return cellToMerge;\r\n        }\r\n    }\r\n}\r\n/**\r\n * Returns the cell that can be merged horizontally.\r\n */\r\nfunction getHorizontalCell(tableCell, direction, tableUtils) {\r\n    const tableRow = tableCell.parent;\r\n    const table = tableRow.parent;\r\n    const horizontalCell = direction == 'right' ? tableCell.nextSibling : tableCell.previousSibling;\r\n    const hasHeadingColumns = (table.getAttribute('headingColumns') || 0) > 0;\r\n    if (!horizontalCell) {\r\n        return;\r\n    }\r\n    // Sort cells:\r\n    const cellOnLeft = (direction == 'right' ? tableCell : horizontalCell);\r\n    const cellOnRight = (direction == 'right' ? horizontalCell : tableCell);\r\n    // Get their column indexes:\r\n    const { column: leftCellColumn } = tableUtils.getCellLocation(cellOnLeft);\r\n    const { column: rightCellColumn } = tableUtils.getCellLocation(cellOnRight);\r\n    const leftCellSpan = parseInt(cellOnLeft.getAttribute('colspan') || '1');\r\n    const isCellOnLeftInHeadingColumn = isHeadingColumnCell(tableUtils, cellOnLeft);\r\n    const isCellOnRightInHeadingColumn = isHeadingColumnCell(tableUtils, cellOnRight);\r\n    // We cannot merge heading columns cells with regular cells.\r\n    if (hasHeadingColumns && isCellOnLeftInHeadingColumn != isCellOnRightInHeadingColumn) {\r\n        return;\r\n    }\r\n    // The cell on the right must have index that is distant to the cell on the left by the left cell's width (colspan).\r\n    const cellsAreTouching = leftCellColumn + leftCellSpan === rightCellColumn;\r\n    // If the right cell's column index is different it means that there are rowspanned cells between them.\r\n    return cellsAreTouching ? horizontalCell : undefined;\r\n}\r\n/**\r\n * Returns the cell that can be merged vertically.\r\n */\r\nfunction getVerticalCell(tableCell, direction, tableUtils) {\r\n    const tableRow = tableCell.parent;\r\n    const table = tableRow.parent;\r\n    const rowIndex = table.getChildIndex(tableRow);\r\n    // Don't search for mergeable cell if direction points out of the table.\r\n    if ((direction == 'down' && rowIndex === tableUtils.getRows(table) - 1) || (direction == 'up' && rowIndex === 0)) {\r\n        return null;\r\n    }\r\n    const rowspan = parseInt(tableCell.getAttribute('rowspan') || '1');\r\n    const headingRows = table.getAttribute('headingRows') || 0;\r\n    const isMergeWithBodyCell = direction == 'down' && (rowIndex + rowspan) === headingRows;\r\n    const isMergeWithHeadCell = direction == 'up' && rowIndex === headingRows;\r\n    // Don't search for mergeable cell if direction points out of the current table section.\r\n    if (headingRows && (isMergeWithBodyCell || isMergeWithHeadCell)) {\r\n        return null;\r\n    }\r\n    const currentCellRowSpan = parseInt(tableCell.getAttribute('rowspan') || '1');\r\n    const rowOfCellToMerge = direction == 'down' ? rowIndex + currentCellRowSpan : rowIndex;\r\n    const tableMap = [...new TableWalker(table, { endRow: rowOfCellToMerge })];\r\n    const currentCellData = tableMap.find(value => value.cell === tableCell);\r\n    const mergeColumn = currentCellData.column;\r\n    const cellToMergeData = tableMap.find(({ row, cellHeight, column }) => {\r\n        if (column !== mergeColumn) {\r\n            return false;\r\n        }\r\n        if (direction == 'down') {\r\n            // If merging a cell below the mergeRow is already calculated.\r\n            return row === rowOfCellToMerge;\r\n        }\r\n        else {\r\n            // If merging a cell above calculate if it spans to mergeRow.\r\n            return rowOfCellToMerge === row + cellHeight;\r\n        }\r\n    });\r\n    return cellToMergeData && cellToMergeData.cell ? cellToMergeData.cell : null;\r\n}\r\n/**\r\n * Merges two table cells. It will ensure that after merging cells with an empty paragraph, the resulting table cell will only have one\r\n * paragraph. If one of the merged table cells is empty, the merged table cell will have the contents of the non-empty table cell.\r\n * If both are empty, the merged table cell will have only one empty paragraph.\r\n */\r\nfunction mergeTableCells(cellToRemove, cellToExpand, writer) {\r\n    if (!isEmpty(cellToRemove)) {\r\n        if (isEmpty(cellToExpand)) {\r\n            writer.remove(writer.createRangeIn(cellToExpand));\r\n        }\r\n        writer.move(writer.createRangeIn(cellToRemove), writer.createPositionAt(cellToExpand, 'end'));\r\n    }\r\n    // Remove merged table cell.\r\n    writer.remove(cellToRemove);\r\n}\r\n/**\r\n * Checks if the passed table cell contains an empty paragraph.\r\n */\r\nfunction isEmpty(tableCell) {\r\n    const firstTableChild = tableCell.getChild(0);\r\n    return tableCell.childCount == 1 && firstTableChild.is('element', 'paragraph') && firstTableChild.isEmpty;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/commands/removerowcommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\n/**\r\n * The remove row command.\r\n *\r\n * The command is registered by {@link module:table/tableediting~TableEditing} as the `'removeTableRow'` editor command.\r\n *\r\n * To remove the row containing the selected cell, execute the command:\r\n *\r\n * ```ts\r\n * editor.execute( 'removeTableRow' );\r\n * ```\r\n */\r\nexport default class RemoveRowCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const tableUtils = this.editor.plugins.get('TableUtils');\r\n        const selectedCells = tableUtils.getSelectionAffectedTableCells(this.editor.model.document.selection);\r\n        const firstCell = selectedCells[0];\r\n        if (firstCell) {\r\n            const table = firstCell.findAncestor('table');\r\n            const tableRowCount = tableUtils.getRows(table);\r\n            const lastRowIndex = tableRowCount - 1;\r\n            const selectedRowIndexes = tableUtils.getRowIndexes(selectedCells);\r\n            const areAllRowsSelected = selectedRowIndexes.first === 0 && selectedRowIndexes.last === lastRowIndex;\r\n            // Disallow selecting whole table -> delete whole table should be used instead.\r\n            this.isEnabled = !areAllRowsSelected;\r\n        }\r\n        else {\r\n            this.isEnabled = false;\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    execute() {\r\n        const model = this.editor.model;\r\n        const tableUtils = this.editor.plugins.get('TableUtils');\r\n        const referenceCells = tableUtils.getSelectionAffectedTableCells(model.document.selection);\r\n        const removedRowIndexes = tableUtils.getRowIndexes(referenceCells);\r\n        const firstCell = referenceCells[0];\r\n        const table = firstCell.findAncestor('table');\r\n        const columnIndexToFocus = tableUtils.getCellLocation(firstCell).column;\r\n        model.change(writer => {\r\n            const rowsToRemove = removedRowIndexes.last - removedRowIndexes.first + 1;\r\n            tableUtils.removeRows(table, {\r\n                at: removedRowIndexes.first,\r\n                rows: rowsToRemove\r\n            });\r\n            const cellToFocus = getCellToFocus(table, removedRowIndexes.first, columnIndexToFocus, tableUtils.getRows(table));\r\n            writer.setSelection(writer.createPositionAt(cellToFocus, 0));\r\n        });\r\n    }\r\n}\r\n/**\r\n * Returns a cell that should be focused before removing the row, belonging to the same column as the currently focused cell.\r\n * - If the row was not the last one, the cell to focus will be in the row that followed it (before removal).\r\n * - If the row was the last one, the cell to focus will be in the row that preceded it (before removal).\r\n */\r\nfunction getCellToFocus(table, removedRowIndex, columnToFocus, tableRowCount) {\r\n    // Don't go beyond last row's index.\r\n    const row = table.getChild(Math.min(removedRowIndex, tableRowCount - 1));\r\n    // Default to first table cell.\r\n    let cellToFocus = row.getChild(0);\r\n    let column = 0;\r\n    for (const tableCell of row.getChildren()) {\r\n        if (column > columnToFocus) {\r\n            return cellToFocus;\r\n        }\r\n        cellToFocus = tableCell;\r\n        column += parseInt(tableCell.getAttribute('colspan') || '1');\r\n    }\r\n    return cellToFocus;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/commands/removecolumncommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport TableWalker from '../tablewalker';\r\n/**\r\n * The remove column command.\r\n *\r\n * The command is registered by {@link module:table/tableediting~TableEditing} as the `'removeTableColumn'` editor command.\r\n *\r\n * To remove the column containing the selected cell, execute the command:\r\n *\r\n * ```ts\r\n * editor.execute( 'removeTableColumn' );\r\n * ```\r\n */\r\nexport default class RemoveColumnCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const tableUtils = this.editor.plugins.get('TableUtils');\r\n        const selectedCells = tableUtils.getSelectionAffectedTableCells(this.editor.model.document.selection);\r\n        const firstCell = selectedCells[0];\r\n        if (firstCell) {\r\n            const table = firstCell.findAncestor('table');\r\n            const tableColumnCount = tableUtils.getColumns(table);\r\n            const { first, last } = tableUtils.getColumnIndexes(selectedCells);\r\n            this.isEnabled = last - first < (tableColumnCount - 1);\r\n        }\r\n        else {\r\n            this.isEnabled = false;\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    execute() {\r\n        const tableUtils = this.editor.plugins.get('TableUtils');\r\n        const [firstCell, lastCell] = getBoundaryCells(this.editor.model.document.selection, tableUtils);\r\n        const table = firstCell.parent.parent;\r\n        // Cache the table before removing or updating colspans.\r\n        const tableMap = [...new TableWalker(table)];\r\n        // Store column indexes of removed columns.\r\n        const removedColumnIndexes = {\r\n            first: tableMap.find(value => value.cell === firstCell).column,\r\n            last: tableMap.find(value => value.cell === lastCell).column\r\n        };\r\n        const cellToFocus = getCellToFocus(tableMap, firstCell, lastCell, removedColumnIndexes);\r\n        this.editor.model.change(writer => {\r\n            const columnsToRemove = removedColumnIndexes.last - removedColumnIndexes.first + 1;\r\n            tableUtils.removeColumns(table, {\r\n                at: removedColumnIndexes.first,\r\n                columns: columnsToRemove\r\n            });\r\n            writer.setSelection(writer.createPositionAt(cellToFocus, 0));\r\n        });\r\n    }\r\n}\r\n/**\r\n * Returns a proper table cell to focus after removing a column.\r\n * - selection is on last table cell it will return previous cell.\r\n */\r\nfunction getCellToFocus(tableMap, firstCell, lastCell, removedColumnIndexes) {\r\n    const colspan = parseInt(lastCell.getAttribute('colspan') || '1');\r\n    // If the table cell is spanned over 2+ columns - it will be truncated so the selection should\r\n    // stay in that cell.\r\n    if (colspan > 1) {\r\n        return lastCell;\r\n    }\r\n    // Normally, look for the cell in the same row that precedes the first cell to put selection there (\"column on the left\").\r\n    // If the deleted column is the first column of the table, there will be no predecessor: use the cell\r\n    // from the column that follows then (also in the same row).\r\n    else if (firstCell.previousSibling || lastCell.nextSibling) {\r\n        return lastCell.nextSibling || firstCell.previousSibling;\r\n    }\r\n    // It can happen that table cells have no siblings in a row, for instance, when there are row spans\r\n    // in the table (in the previous row). Then just look for the closest cell that is in a column\r\n    // that will not be removed to put the selection there.\r\n    else {\r\n        // Look for any cell in a column that precedes the first removed column.\r\n        if (removedColumnIndexes.first) {\r\n            return tableMap.reverse().find(({ column }) => {\r\n                return column < removedColumnIndexes.first;\r\n            }).cell;\r\n        }\r\n        // If the first removed column is the first column of the table, then\r\n        // look for any cell that is in a column that follows the last removed column.\r\n        else {\r\n            return tableMap.reverse().find(({ column }) => {\r\n                return column > removedColumnIndexes.last;\r\n            }).cell;\r\n        }\r\n    }\r\n}\r\n/**\r\n * Returns helper object returning the first and the last cell contained in given selection, based on DOM order.\r\n */\r\nfunction getBoundaryCells(selection, tableUtils) {\r\n    const referenceCells = tableUtils.getSelectionAffectedTableCells(selection);\r\n    const firstCell = referenceCells[0];\r\n    const lastCell = referenceCells.pop();\r\n    const returnValue = [firstCell, lastCell];\r\n    return firstCell.isBefore(lastCell) ? returnValue : returnValue.reverse();\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/commands/setheaderrowcommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { updateNumericAttribute } from '../utils/common';\r\nimport { getVerticallyOverlappingCells, splitHorizontally } from '../utils/structure';\r\n/**\r\n * The header row command.\r\n *\r\n * The command is registered by {@link module:table/tableediting~TableEditing} as the `'setTableColumnHeader'` editor command.\r\n *\r\n * You can make the row containing the selected cell a [header](https://www.w3.org/TR/html50/tabular-data.html#the-th-element) by executing:\r\n *\r\n * ```ts\r\n * editor.execute( 'setTableRowHeader' );\r\n * ```\r\n *\r\n * **Note:** All preceding rows will also become headers. If the current row is already a header, executing this command\r\n * will make it a regular row back again (including the following rows).\r\n */\r\nexport default class SetHeaderRowCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const tableUtils = this.editor.plugins.get('TableUtils');\r\n        const model = this.editor.model;\r\n        const selectedCells = tableUtils.getSelectionAffectedTableCells(model.document.selection);\r\n        const isInTable = selectedCells.length > 0;\r\n        this.isEnabled = isInTable;\r\n        this.value = isInTable && selectedCells.every(cell => this._isInHeading(cell, cell.parent.parent));\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * When the selection is in a non-header row, the command will set the `headingRows` table attribute to cover that row.\r\n     *\r\n     * When the selection is already in a header row, it will set `headingRows` so the heading section will end before that row.\r\n     *\r\n     * @fires execute\r\n     * @param options.forceValue If set, the command will set (`true`) or unset (`false`) the header rows according to\r\n     * the `forceValue` parameter instead of the current model state.\r\n     */\r\n    execute(options = {}) {\r\n        if (options.forceValue === this.value) {\r\n            return;\r\n        }\r\n        const tableUtils = this.editor.plugins.get('TableUtils');\r\n        const model = this.editor.model;\r\n        const selectedCells = tableUtils.getSelectionAffectedTableCells(model.document.selection);\r\n        const table = selectedCells[0].findAncestor('table');\r\n        const { first, last } = tableUtils.getRowIndexes(selectedCells);\r\n        const headingRowsToSet = this.value ? first : last + 1;\r\n        const currentHeadingRows = table.getAttribute('headingRows') || 0;\r\n        model.change(writer => {\r\n            if (headingRowsToSet) {\r\n                // Changing heading rows requires to check if any of a heading cell is overlapping vertically the table head.\r\n                // Any table cell that has a rowspan attribute > 1 will not exceed the table head so we need to fix it in rows below.\r\n                const startRow = headingRowsToSet > currentHeadingRows ? currentHeadingRows : 0;\r\n                const overlappingCells = getVerticallyOverlappingCells(table, headingRowsToSet, startRow);\r\n                for (const { cell } of overlappingCells) {\r\n                    splitHorizontally(cell, headingRowsToSet, writer);\r\n                }\r\n            }\r\n            updateNumericAttribute('headingRows', headingRowsToSet, table, writer, 0);\r\n        });\r\n    }\r\n    /**\r\n     * Checks if a table cell is in the heading section.\r\n     */\r\n    _isInHeading(tableCell, table) {\r\n        const headingRows = parseInt(table.getAttribute('headingRows') || '0');\r\n        return !!headingRows && tableCell.parent.index < headingRows;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/commands/setheadercolumncommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { isHeadingColumnCell, updateNumericAttribute } from '../utils/common';\r\nimport { getHorizontallyOverlappingCells, splitVertically } from '../utils/structure';\r\n/**\r\n * The header column command.\r\n *\r\n * The command is registered by {@link module:table/tableediting~TableEditing} as the `'setTableColumnHeader'` editor command.\r\n *\r\n * You can make the column containing the selected cell a [header](https://www.w3.org/TR/html50/tabular-data.html#the-th-element)\r\n * by executing:\r\n *\r\n * ```ts\r\n * editor.execute( 'setTableColumnHeader' );\r\n * ```\r\n *\r\n * **Note:** All preceding columns will also become headers. If the current column is already a header, executing this command\r\n * will make it a regular column back again (including the following columns).\r\n */\r\nexport default class SetHeaderColumnCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const model = this.editor.model;\r\n        const tableUtils = this.editor.plugins.get('TableUtils');\r\n        const selectedCells = tableUtils.getSelectionAffectedTableCells(model.document.selection);\r\n        const isInTable = selectedCells.length > 0;\r\n        this.isEnabled = isInTable;\r\n        this.value = isInTable && selectedCells.every(cell => isHeadingColumnCell(tableUtils, cell));\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * When the selection is in a non-header column, the command will set the `headingColumns` table attribute to cover that column.\r\n     *\r\n     * When the selection is already in a header column, it will set `headingColumns` so the heading section will end before that column.\r\n     *\r\n     * @fires execute\r\n     * @param options.forceValue If set, the command will set (`true`) or unset (`false`) the header columns according to\r\n     * the `forceValue` parameter instead of the current model state.\r\n     */\r\n    execute(options = {}) {\r\n        if (options.forceValue === this.value) {\r\n            return;\r\n        }\r\n        const tableUtils = this.editor.plugins.get('TableUtils');\r\n        const model = this.editor.model;\r\n        const selectedCells = tableUtils.getSelectionAffectedTableCells(model.document.selection);\r\n        const table = selectedCells[0].findAncestor('table');\r\n        const { first, last } = tableUtils.getColumnIndexes(selectedCells);\r\n        const headingColumnsToSet = this.value ? first : last + 1;\r\n        model.change(writer => {\r\n            if (headingColumnsToSet) {\r\n                // Changing heading columns requires to check if any of a heading cell is overlapping horizontally the table head.\r\n                // Any table cell that has a colspan attribute > 1 will not exceed the table head so we need to fix it in columns before.\r\n                const overlappingCells = getHorizontallyOverlappingCells(table, headingColumnsToSet);\r\n                for (const { cell, column } of overlappingCells) {\r\n                    splitVertically(cell, column, headingColumnsToSet, writer);\r\n                }\r\n            }\r\n            updateNumericAttribute('headingColumns', headingColumnsToSet, table, writer, 0);\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/tableutils\r\n */\r\nimport { CKEditorError } from 'ckeditor5/src/utils';\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport TableWalker from './tablewalker';\r\nimport { createEmptyTableCell, updateNumericAttribute } from './utils/common';\r\nimport { removeEmptyColumns, removeEmptyRows } from './utils/structure';\r\n/**\r\n * The table utilities plugin.\r\n */\r\nexport default class TableUtils extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'TableUtils';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        this.decorate('insertColumns');\r\n        this.decorate('insertRows');\r\n    }\r\n    /**\r\n     * Returns the table cell location as an object with table row and table column indexes.\r\n     *\r\n     * For instance, in the table below:\r\n     *\r\n     *      0   1   2   3\r\n     *    +---+---+---+---+\r\n     *  0 | a     | b | c |\r\n     *    +       +   +---+\r\n     *  1 |       |   | d |\r\n     *    +---+---+   +---+\r\n     *  2 | e     |   | f |\r\n     *    +---+---+---+---+\r\n     *\r\n     * the method will return:\r\n     *\r\n     * ```ts\r\n     * const cellA = table.getNodeByPath( [ 0, 0 ] );\r\n     * editor.plugins.get( 'TableUtils' ).getCellLocation( cellA );\r\n     * // will return { row: 0, column: 0 }\r\n     *\r\n     * const cellD = table.getNodeByPath( [ 1, 0 ] );\r\n     * editor.plugins.get( 'TableUtils' ).getCellLocation( cellD );\r\n     * // will return { row: 1, column: 3 }\r\n     * ```\r\n     *\r\n     * @returns Returns a `{row, column}` object.\r\n     */\r\n    getCellLocation(tableCell) {\r\n        const tableRow = tableCell.parent;\r\n        const table = tableRow.parent;\r\n        const rowIndex = table.getChildIndex(tableRow);\r\n        const tableWalker = new TableWalker(table, { row: rowIndex });\r\n        for (const { cell, row, column } of tableWalker) {\r\n            if (cell === tableCell) {\r\n                return { row, column };\r\n            }\r\n        }\r\n        // Should be unreachable code.\r\n        /* istanbul ignore next -- @preserve */\r\n        return undefined;\r\n    }\r\n    /**\r\n     * Creates an empty table with a proper structure. The table needs to be inserted into the model,\r\n     * for example, by using the {@link module:engine/model/model~Model#insertContent} function.\r\n     *\r\n     * ```ts\r\n     * model.change( ( writer ) => {\r\n     *   // Create a table of 2 rows and 7 columns:\r\n     *   const table = tableUtils.createTable( writer, { rows: 2, columns: 7 } );\r\n     *\r\n     *   // Insert a table to the model at the best position taking the current selection:\r\n     *   model.insertContent( table );\r\n     * }\r\n     * ```\r\n     *\r\n     * @param writer The model writer.\r\n     * @param options.rows The number of rows to create. Default value is 2.\r\n     * @param options.columns The number of columns to create. Default value is 2.\r\n     * @param options.headingRows The number of heading rows. Default value is 0.\r\n     * @param options.headingColumns The number of heading columns. Default value is 0.\r\n     * @returns The created table element.\r\n     */\r\n    createTable(writer, options) {\r\n        const table = writer.createElement('table');\r\n        const rows = options.rows || 2;\r\n        const columns = options.columns || 2;\r\n        createEmptyRows(writer, table, 0, rows, columns);\r\n        if (options.headingRows) {\r\n            updateNumericAttribute('headingRows', Math.min(options.headingRows, rows), table, writer, 0);\r\n        }\r\n        if (options.headingColumns) {\r\n            updateNumericAttribute('headingColumns', Math.min(options.headingColumns, columns), table, writer, 0);\r\n        }\r\n        return table;\r\n    }\r\n    /**\r\n     * Inserts rows into a table.\r\n     *\r\n     * ```ts\r\n     * editor.plugins.get( 'TableUtils' ).insertRows( table, { at: 1, rows: 2 } );\r\n     * ```\r\n     *\r\n     * Assuming the table on the left, the above code will transform it to the table on the right:\r\n     *\r\n     *  row index\r\n     *    0 +---+---+---+       `at` = 1,      +---+---+---+ 0\r\n     *      | a | b | c |       `rows` = 2,    | a | b | c |\r\n     *    1 +   +---+---+   <-- insert here    +   +---+---+ 1\r\n     *      |   | d | e |                      |   |   |   |\r\n     *    2 +   +---+---+       will give:     +   +---+---+ 2\r\n     *      |   | f | g |                      |   |   |   |\r\n     *    3 +---+---+---+                      +   +---+---+ 3\r\n     *                                         |   | d | e |\r\n     *                                         +   +---+---+ 4\r\n     *                                         +   + f | g |\r\n     *                                         +---+---+---+ 5\r\n     *\r\n     * @param table The table model element where the rows will be inserted.\r\n     * @param options.at The row index at which the rows will be inserted.  Default value is 0.\r\n     * @param options.rows The number of rows to insert.  Default value is 1.\r\n     * @param options.copyStructureFromAbove The flag for copying row structure. Note that\r\n     * the row structure will not be copied if this option is not provided.\r\n     */\r\n    insertRows(table, options = {}) {\r\n        const model = this.editor.model;\r\n        const insertAt = options.at || 0;\r\n        const rowsToInsert = options.rows || 1;\r\n        const isCopyStructure = options.copyStructureFromAbove !== undefined;\r\n        const copyStructureFrom = options.copyStructureFromAbove ? insertAt - 1 : insertAt;\r\n        const rows = this.getRows(table);\r\n        const columns = this.getColumns(table);\r\n        if (insertAt > rows) {\r\n            /**\r\n             * The `options.at` points at a row position that does not exist.\r\n             *\r\n             * @error tableutils-insertrows-insert-out-of-range\r\n             */\r\n            throw new CKEditorError('tableutils-insertrows-insert-out-of-range', this, { options });\r\n        }\r\n        model.change(writer => {\r\n            const headingRows = table.getAttribute('headingRows') || 0;\r\n            // Inserting rows inside heading section requires to update `headingRows` attribute as the heading section will grow.\r\n            if (headingRows > insertAt) {\r\n                updateNumericAttribute('headingRows', headingRows + rowsToInsert, table, writer, 0);\r\n            }\r\n            // Inserting at the end or at the beginning of a table doesn't require to calculate anything special.\r\n            if (!isCopyStructure && (insertAt === 0 || insertAt === rows)) {\r\n                createEmptyRows(writer, table, insertAt, rowsToInsert, columns);\r\n                return;\r\n            }\r\n            // Iterate over all the rows above the inserted rows in order to check for the row-spanned cells.\r\n            const walkerEndRow = isCopyStructure ? Math.max(insertAt, copyStructureFrom) : insertAt;\r\n            const tableIterator = new TableWalker(table, { endRow: walkerEndRow });\r\n            // Store spans of the reference row to reproduce it's structure. This array is column number indexed.\r\n            const rowColSpansMap = new Array(columns).fill(1);\r\n            for (const { row, column, cellHeight, cellWidth, cell } of tableIterator) {\r\n                const lastCellRow = row + cellHeight - 1;\r\n                const isOverlappingInsertedRow = row < insertAt && insertAt <= lastCellRow;\r\n                const isReferenceRow = row <= copyStructureFrom && copyStructureFrom <= lastCellRow;\r\n                // If the cell is row-spanned and overlaps the inserted row, then reserve space for it in the row map.\r\n                if (isOverlappingInsertedRow) {\r\n                    // This cell overlaps the inserted rows so we need to expand it further.\r\n                    writer.setAttribute('rowspan', cellHeight + rowsToInsert, cell);\r\n                    // Mark this cell with negative number to indicate how many cells should be skipped when adding the new cells.\r\n                    rowColSpansMap[column] = -cellWidth;\r\n                }\r\n                // Store the colspan from reference row.\r\n                else if (isCopyStructure && isReferenceRow) {\r\n                    rowColSpansMap[column] = cellWidth;\r\n                }\r\n            }\r\n            for (let rowIndex = 0; rowIndex < rowsToInsert; rowIndex++) {\r\n                const tableRow = writer.createElement('tableRow');\r\n                writer.insert(tableRow, table, insertAt);\r\n                for (let cellIndex = 0; cellIndex < rowColSpansMap.length; cellIndex++) {\r\n                    const colspan = rowColSpansMap[cellIndex];\r\n                    const insertPosition = writer.createPositionAt(tableRow, 'end');\r\n                    // Insert the empty cell only if this slot is not row-spanned from any other cell.\r\n                    if (colspan > 0) {\r\n                        createEmptyTableCell(writer, insertPosition, colspan > 1 ? { colspan } : undefined);\r\n                    }\r\n                    // Skip the col-spanned slots, there won't be any cells.\r\n                    cellIndex += Math.abs(colspan) - 1;\r\n                }\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Inserts columns into a table.\r\n     *\r\n     * ```ts\r\n     * editor.plugins.get( 'TableUtils' ).insertColumns( table, { at: 1, columns: 2 } );\r\n     * ```\r\n     *\r\n     * Assuming the table on the left, the above code will transform it to the table on the right:\r\n     *\r\n     *  0   1   2   3                   0   1   2   3   4   5\r\n     *  +---+---+---+                   +---+---+---+---+---+\r\n     *  | a     | b |                   | a             | b |\r\n     *  +       +---+                   +               +---+\r\n     *  |       | c |                   |               | c |\r\n     *  +---+---+---+     will give:    +---+---+---+---+---+\r\n     *  | d | e | f |                   | d |   |   | e | f |\r\n     *  +---+   +---+                   +---+---+---+   +---+\r\n     *  | g |   | h |                   | g |   |   |   | h |\r\n     *  +---+---+---+                   +---+---+---+---+---+\r\n     *  | i         |                   | i                 |\r\n     *  +---+---+---+                   +---+---+---+---+---+\r\n     *      ^---- insert here, `at` = 1, `columns` = 2\r\n     *\r\n     * @param table The table model element where the columns will be inserted.\r\n     * @param options.at The column index at which the columns will be inserted. Default value is 0.\r\n     * @param options.columns The number of columns to insert. Default value is 1.\r\n     */\r\n    insertColumns(table, options = {}) {\r\n        const model = this.editor.model;\r\n        const insertAt = options.at || 0;\r\n        const columnsToInsert = options.columns || 1;\r\n        model.change(writer => {\r\n            const headingColumns = table.getAttribute('headingColumns');\r\n            // Inserting columns inside heading section requires to update `headingColumns` attribute as the heading section will grow.\r\n            if (insertAt < headingColumns) {\r\n                writer.setAttribute('headingColumns', headingColumns + columnsToInsert, table);\r\n            }\r\n            const tableColumns = this.getColumns(table);\r\n            // Inserting at the end and at the beginning of a table doesn't require to calculate anything special.\r\n            if (insertAt === 0 || tableColumns === insertAt) {\r\n                for (const tableRow of table.getChildren()) {\r\n                    // Ignore non-row elements inside the table (e.g. caption).\r\n                    if (!tableRow.is('element', 'tableRow')) {\r\n                        continue;\r\n                    }\r\n                    createCells(columnsToInsert, writer, writer.createPositionAt(tableRow, insertAt ? 'end' : 0));\r\n                }\r\n                return;\r\n            }\r\n            const tableWalker = new TableWalker(table, { column: insertAt, includeAllSlots: true });\r\n            for (const tableSlot of tableWalker) {\r\n                const { row, cell, cellAnchorColumn, cellAnchorRow, cellWidth, cellHeight } = tableSlot;\r\n                // When iterating over column the table walker outputs either:\r\n                // - cells at given column index (cell \"e\" from method docs),\r\n                // - spanned columns (spanned cell from row between cells \"g\" and \"h\" - spanned by \"e\", only if `includeAllSlots: true`),\r\n                // - or a cell from the same row which spans over this column (cell \"a\").\r\n                if (cellAnchorColumn < insertAt) {\r\n                    // If cell is anchored in previous column, it is a cell that spans over an inserted column (cell \"a\" & \"i\").\r\n                    // For such cells expand them by a number of columns inserted.\r\n                    writer.setAttribute('colspan', cellWidth + columnsToInsert, cell);\r\n                    // This cell will overlap cells in rows below so skip them (because of `includeAllSlots` option) - (cell \"a\")\r\n                    const lastCellRow = cellAnchorRow + cellHeight - 1;\r\n                    for (let i = row; i <= lastCellRow; i++) {\r\n                        tableWalker.skipRow(i);\r\n                    }\r\n                }\r\n                else {\r\n                    // It's either cell at this column index or spanned cell by a row-spanned cell from row above.\r\n                    // In table above it's cell \"e\" and a spanned position from row below (empty cell between cells \"g\" and \"h\")\r\n                    createCells(columnsToInsert, writer, tableSlot.getPositionBefore());\r\n                }\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Removes rows from the given `table`.\r\n     *\r\n     * This method re-calculates the table geometry including `rowspan` attribute of table cells overlapping removed rows\r\n     * and table headings values.\r\n     *\r\n     * ```ts\r\n     * editor.plugins.get( 'TableUtils' ).removeRows( table, { at: 1, rows: 2 } );\r\n     * ```\r\n     *\r\n     * Executing the above code in the context of the table on the left will transform its structure as presented on the right:\r\n     *\r\n     *  row index\r\n     *      ┌───┬───┬───┐        `at` = 1        ┌───┬───┬───┐\r\n     *    0 │ a │ b │ c │        `rows` = 2      │ a │ b │ c │ 0\r\n     *      │   ├───┼───┤                        │   ├───┼───┤\r\n     *    1 │   │ d │ e │  <-- remove from here  │   │ d │ g │ 1\r\n     *      │   │   ├───┤        will give:      ├───┼───┼───┤\r\n     *    2 │   │   │ f │                        │ h │ i │ j │ 2\r\n     *      │   │   ├───┤                        └───┴───┴───┘\r\n     *    3 │   │   │ g │\r\n     *      ├───┼───┼───┤\r\n     *    4 │ h │ i │ j │\r\n     *      └───┴───┴───┘\r\n     *\r\n     * @param options.at The row index at which the removing rows will start.\r\n     * @param options.rows The number of rows to remove. Default value is 1.\r\n     */\r\n    removeRows(table, options) {\r\n        const model = this.editor.model;\r\n        const rowsToRemove = options.rows || 1;\r\n        const rowCount = this.getRows(table);\r\n        const first = options.at;\r\n        const last = first + rowsToRemove - 1;\r\n        if (last > rowCount - 1) {\r\n            /**\r\n             * The `options.at` param must point at existing row and `options.rows` must not exceed the rows in the table.\r\n             *\r\n             * @error tableutils-removerows-row-index-out-of-range\r\n             */\r\n            throw new CKEditorError('tableutils-removerows-row-index-out-of-range', this, { table, options });\r\n        }\r\n        model.change(writer => {\r\n            const indexesObject = { first, last };\r\n            // Removing rows from the table require that most calculations to be done prior to changing table structure.\r\n            // Preparations must be done in the same enqueueChange callback to use the current table structure.\r\n            // 1. Preparation - get row-spanned cells that have to be modified after removing rows.\r\n            const { cellsToMove, cellsToTrim } = getCellsToMoveAndTrimOnRemoveRow(table, indexesObject);\r\n            // 2. Execution\r\n            // 2a. Move cells from removed rows that extends over a removed section - must be done before removing rows.\r\n            // This will fill any gaps in a rows below that previously were empty because of row-spanned cells.\r\n            if (cellsToMove.size) {\r\n                const rowAfterRemovedSection = last + 1;\r\n                moveCellsToRow(table, rowAfterRemovedSection, cellsToMove, writer);\r\n            }\r\n            // 2b. Remove all required rows.\r\n            for (let i = last; i >= first; i--) {\r\n                writer.remove(table.getChild(i));\r\n            }\r\n            // 2c. Update cells from rows above that overlap removed section. Similar to step 2 but does not involve moving cells.\r\n            for (const { rowspan, cell } of cellsToTrim) {\r\n                updateNumericAttribute('rowspan', rowspan, cell, writer);\r\n            }\r\n            // 2d. Adjust heading rows if removed rows were in a heading section.\r\n            updateHeadingRows(table, indexesObject, writer);\r\n            // 2e. Remove empty columns (without anchored cells) if there are any.\r\n            if (!removeEmptyColumns(table, this)) {\r\n                // If there wasn't any empty columns then we still need to check if this wasn't called\r\n                // because of cleaning empty rows and we only removed one of them.\r\n                removeEmptyRows(table, this);\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Removes columns from the given `table`.\r\n     *\r\n     * This method re-calculates the table geometry including the `colspan` attribute of table cells overlapping removed columns\r\n     * and table headings values.\r\n     *\r\n     * ```ts\r\n     * editor.plugins.get( 'TableUtils' ).removeColumns( table, { at: 1, columns: 2 } );\r\n     * ```\r\n     *\r\n     * Executing the above code in the context of the table on the left will transform its structure as presented on the right:\r\n     *\r\n     *    0   1   2   3   4                       0   1   2\r\n     *  ┌───────────────┬───┐                   ┌───────┬───┐\r\n     *  │ a             │ b │                   │ a     │ b │\r\n     *  │               ├───┤                   │       ├───┤\r\n     *  │               │ c │                   │       │ c │\r\n     *  ├───┬───┬───┬───┼───┤     will give:    ├───┬───┼───┤\r\n     *  │ d │ e │ f │ g │ h │                   │ d │ g │ h │\r\n     *  ├───┼───┼───┤   ├───┤                   ├───┤   ├───┤\r\n     *  │ i │ j │ k │   │ l │                   │ i │   │ l │\r\n     *  ├───┴───┴───┴───┴───┤                   ├───┴───┴───┤\r\n     *  │ m                 │                   │ m         │\r\n     *  └───────────────────┘                   └───────────┘\r\n     *        ^---- remove from here, `at` = 1, `columns` = 2\r\n     *\r\n     * @param options.at The row index at which the removing columns will start.\r\n     * @param options.columns The number of columns to remove.\r\n     */\r\n    removeColumns(table, options) {\r\n        const model = this.editor.model;\r\n        const first = options.at;\r\n        const columnsToRemove = options.columns || 1;\r\n        const last = options.at + columnsToRemove - 1;\r\n        model.change(writer => {\r\n            adjustHeadingColumns(table, { first, last }, writer);\r\n            for (let removedColumnIndex = last; removedColumnIndex >= first; removedColumnIndex--) {\r\n                for (const { cell, column, cellWidth } of [...new TableWalker(table)]) {\r\n                    // If colspaned cell overlaps removed column decrease its span.\r\n                    if (column <= removedColumnIndex && cellWidth > 1 && column + cellWidth > removedColumnIndex) {\r\n                        updateNumericAttribute('colspan', cellWidth - 1, cell, writer);\r\n                    }\r\n                    else if (column === removedColumnIndex) {\r\n                        // The cell in removed column has colspan of 1.\r\n                        writer.remove(cell);\r\n                    }\r\n                }\r\n            }\r\n            // Remove empty rows that could appear after removing columns.\r\n            if (!removeEmptyRows(table, this)) {\r\n                // If there wasn't any empty rows then we still need to check if this wasn't called\r\n                // because of cleaning empty columns and we only removed one of them.\r\n                removeEmptyColumns(table, this);\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Divides a table cell vertically into several ones.\r\n     *\r\n     * The cell will be visually split into more cells by updating colspans of other cells in a column\r\n     * and inserting cells (columns) after that cell.\r\n     *\r\n     * In the table below, if cell \"a\" is split into 3 cells:\r\n     *\r\n     *  +---+---+---+\r\n     *  | a | b | c |\r\n     *  +---+---+---+\r\n     *  | d | e | f |\r\n     *  +---+---+---+\r\n     *\r\n     * it will result in the table below:\r\n     *\r\n     *  +---+---+---+---+---+\r\n     *  | a |   |   | b | c |\r\n     *  +---+---+---+---+---+\r\n     *  | d         | e | f |\r\n     *  +---+---+---+---+---+\r\n     *\r\n     * So cell \"d\" will get its `colspan` updated to `3` and 2 cells will be added (2 columns will be created).\r\n     *\r\n     * Splitting a cell that already has a `colspan` attribute set will distribute the cell `colspan` evenly and the remainder\r\n     * will be left to the original cell:\r\n     *\r\n     *  +---+---+---+\r\n     *  | a         |\r\n     *  +---+---+---+\r\n     *  | b | c | d |\r\n     *  +---+---+---+\r\n     *\r\n     * Splitting cell \"a\" with `colspan=3` into 2 cells will create 1 cell with a `colspan=a` and cell \"a\" that will have `colspan=2`:\r\n     *\r\n     *  +---+---+---+\r\n     *  | a     |   |\r\n     *  +---+---+---+\r\n     *  | b | c | d |\r\n     *  +---+---+---+\r\n     */\r\n    splitCellVertically(tableCell, numberOfCells = 2) {\r\n        const model = this.editor.model;\r\n        const tableRow = tableCell.parent;\r\n        const table = tableRow.parent;\r\n        const rowspan = parseInt(tableCell.getAttribute('rowspan') || '1');\r\n        const colspan = parseInt(tableCell.getAttribute('colspan') || '1');\r\n        model.change(writer => {\r\n            // First check - the cell spans over multiple rows so before doing anything else just split this cell.\r\n            if (colspan > 1) {\r\n                // Get spans of new (inserted) cells and span to update of split cell.\r\n                const { newCellsSpan, updatedSpan } = breakSpanEvenly(colspan, numberOfCells);\r\n                updateNumericAttribute('colspan', updatedSpan, tableCell, writer);\r\n                // Each inserted cell will have the same attributes:\r\n                const newCellsAttributes = {};\r\n                // Do not store default value in the model.\r\n                if (newCellsSpan > 1) {\r\n                    newCellsAttributes.colspan = newCellsSpan;\r\n                }\r\n                // Copy rowspan of split cell.\r\n                if (rowspan > 1) {\r\n                    newCellsAttributes.rowspan = rowspan;\r\n                }\r\n                const cellsToInsert = colspan > numberOfCells ? numberOfCells - 1 : colspan - 1;\r\n                createCells(cellsToInsert, writer, writer.createPositionAfter(tableCell), newCellsAttributes);\r\n            }\r\n            // Second check - the cell has colspan of 1 or we need to create more cells then the currently one spans over.\r\n            if (colspan < numberOfCells) {\r\n                const cellsToInsert = numberOfCells - colspan;\r\n                // First step: expand cells on the same column as split cell.\r\n                const tableMap = [...new TableWalker(table)];\r\n                // Get the column index of split cell.\r\n                const { column: splitCellColumn } = tableMap.find(({ cell }) => cell === tableCell);\r\n                // Find cells which needs to be expanded vertically - those on the same column or those that spans over split cell's column.\r\n                const cellsToUpdate = tableMap.filter(({ cell, cellWidth, column }) => {\r\n                    const isOnSameColumn = cell !== tableCell && column === splitCellColumn;\r\n                    const spansOverColumn = (column < splitCellColumn && column + cellWidth > splitCellColumn);\r\n                    return isOnSameColumn || spansOverColumn;\r\n                });\r\n                // Expand cells vertically.\r\n                for (const { cell, cellWidth } of cellsToUpdate) {\r\n                    writer.setAttribute('colspan', cellWidth + cellsToInsert, cell);\r\n                }\r\n                // Second step: create columns after split cell.\r\n                // Each inserted cell will have the same attributes:\r\n                const newCellsAttributes = {};\r\n                // Do not store default value in the model.\r\n                // Copy rowspan of split cell.\r\n                if (rowspan > 1) {\r\n                    newCellsAttributes.rowspan = rowspan;\r\n                }\r\n                createCells(cellsToInsert, writer, writer.createPositionAfter(tableCell), newCellsAttributes);\r\n                const headingColumns = table.getAttribute('headingColumns') || 0;\r\n                // Update heading section if split cell is in heading section.\r\n                if (headingColumns > splitCellColumn) {\r\n                    updateNumericAttribute('headingColumns', headingColumns + cellsToInsert, table, writer);\r\n                }\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Divides a table cell horizontally into several ones.\r\n     *\r\n     * The cell will be visually split into more cells by updating rowspans of other cells in the row and inserting rows with a single cell\r\n     * below.\r\n     *\r\n     * If in the table below cell \"b\" is split into 3 cells:\r\n     *\r\n     *  +---+---+---+\r\n     *  | a | b | c |\r\n     *  +---+---+---+\r\n     *  | d | e | f |\r\n     *  +---+---+---+\r\n     *\r\n     * It will result in the table below:\r\n     *\r\n     *  +---+---+---+\r\n     *  | a | b | c |\r\n     *  +   +---+   +\r\n     *  |   |   |   |\r\n     *  +   +---+   +\r\n     *  |   |   |   |\r\n     *  +---+---+---+\r\n     *  | d | e | f |\r\n     *  +---+---+---+\r\n     *\r\n     * So cells \"a\" and \"b\" will get their `rowspan` updated to `3` and 2 rows with a single cell will be added.\r\n     *\r\n     * Splitting a cell that already has a `rowspan` attribute set will distribute the cell `rowspan` evenly and the remainder\r\n     * will be left to the original cell:\r\n     *\r\n     *  +---+---+---+\r\n     *  | a | b | c |\r\n     *  +   +---+---+\r\n     *  |   | d | e |\r\n     *  +   +---+---+\r\n     *  |   | f | g |\r\n     *  +   +---+---+\r\n     *  |   | h | i |\r\n     *  +---+---+---+\r\n     *\r\n     * Splitting cell \"a\" with `rowspan=4` into 3 cells will create 2 cells with a `rowspan=1` and cell \"a\" will have `rowspan=2`:\r\n     *\r\n     *  +---+---+---+\r\n     *  | a | b | c |\r\n     *  +   +---+---+\r\n     *  |   | d | e |\r\n     *  +---+---+---+\r\n     *  |   | f | g |\r\n     *  +---+---+---+\r\n     *  |   | h | i |\r\n     *  +---+---+---+\r\n     */\r\n    splitCellHorizontally(tableCell, numberOfCells = 2) {\r\n        const model = this.editor.model;\r\n        const tableRow = tableCell.parent;\r\n        const table = tableRow.parent;\r\n        const splitCellRow = table.getChildIndex(tableRow);\r\n        const rowspan = parseInt(tableCell.getAttribute('rowspan') || '1');\r\n        const colspan = parseInt(tableCell.getAttribute('colspan') || '1');\r\n        model.change(writer => {\r\n            // First check - the cell spans over multiple rows so before doing anything else just split this cell.\r\n            if (rowspan > 1) {\r\n                // Cache table map before updating table.\r\n                const tableMap = [...new TableWalker(table, {\r\n                        startRow: splitCellRow,\r\n                        endRow: splitCellRow + rowspan - 1,\r\n                        includeAllSlots: true\r\n                    })];\r\n                // Get spans of new (inserted) cells and span to update of split cell.\r\n                const { newCellsSpan, updatedSpan } = breakSpanEvenly(rowspan, numberOfCells);\r\n                updateNumericAttribute('rowspan', updatedSpan, tableCell, writer);\r\n                const { column: cellColumn } = tableMap.find(({ cell }) => cell === tableCell);\r\n                // Each inserted cell will have the same attributes:\r\n                const newCellsAttributes = {};\r\n                // Do not store default value in the model.\r\n                if (newCellsSpan > 1) {\r\n                    newCellsAttributes.rowspan = newCellsSpan;\r\n                }\r\n                // Copy colspan of split cell.\r\n                if (colspan > 1) {\r\n                    newCellsAttributes.colspan = colspan;\r\n                }\r\n                for (const tableSlot of tableMap) {\r\n                    const { column, row } = tableSlot;\r\n                    // As both newly created cells and the split cell might have rowspan,\r\n                    // the insertion of new cells must go to appropriate rows:\r\n                    //\r\n                    // 1. It's a row after split cell + it's height.\r\n                    const isAfterSplitCell = row >= splitCellRow + updatedSpan;\r\n                    // 2. Is on the same column.\r\n                    const isOnSameColumn = column === cellColumn;\r\n                    // 3. And it's row index is after previous cell height.\r\n                    const isInEvenlySplitRow = (row + splitCellRow + updatedSpan) % newCellsSpan === 0;\r\n                    if (isAfterSplitCell && isOnSameColumn && isInEvenlySplitRow) {\r\n                        createCells(1, writer, tableSlot.getPositionBefore(), newCellsAttributes);\r\n                    }\r\n                }\r\n            }\r\n            // Second check - the cell has rowspan of 1 or we need to create more cells than the current cell spans over.\r\n            if (rowspan < numberOfCells) {\r\n                // We already split the cell in check one so here we split to the remaining number of cells only.\r\n                const cellsToInsert = numberOfCells - rowspan;\r\n                // This check is needed since we need to check if there are any cells from previous rows than spans over this cell's row.\r\n                const tableMap = [...new TableWalker(table, { startRow: 0, endRow: splitCellRow })];\r\n                // First step: expand cells.\r\n                for (const { cell, cellHeight, row } of tableMap) {\r\n                    // Expand rowspan of cells that are either:\r\n                    // - on the same row as current cell,\r\n                    // - or are below split cell row and overlaps that row.\r\n                    if (cell !== tableCell && row + cellHeight > splitCellRow) {\r\n                        const rowspanToSet = cellHeight + cellsToInsert;\r\n                        writer.setAttribute('rowspan', rowspanToSet, cell);\r\n                    }\r\n                }\r\n                // Second step: create rows with single cell below split cell.\r\n                const newCellsAttributes = {};\r\n                // Copy colspan of split cell.\r\n                if (colspan > 1) {\r\n                    newCellsAttributes.colspan = colspan;\r\n                }\r\n                createEmptyRows(writer, table, splitCellRow + 1, cellsToInsert, 1, newCellsAttributes);\r\n                // Update heading section if split cell is in heading section.\r\n                const headingRows = table.getAttribute('headingRows') || 0;\r\n                if (headingRows > splitCellRow) {\r\n                    updateNumericAttribute('headingRows', headingRows + cellsToInsert, table, writer);\r\n                }\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Returns the number of columns for a given table.\r\n     *\r\n     * ```ts\r\n     * editor.plugins.get( 'TableUtils' ).getColumns( table );\r\n     * ```\r\n     *\r\n     * @param table The table to analyze.\r\n     */\r\n    getColumns(table) {\r\n        // Analyze first row only as all the rows should have the same width.\r\n        // Using the first row without checking if it's a tableRow because we expect\r\n        // that table will have only tableRow model elements at the beginning.\r\n        const row = table.getChild(0);\r\n        return [...row.getChildren()].reduce((columns, row) => {\r\n            const columnWidth = parseInt(row.getAttribute('colspan') || '1');\r\n            return columns + columnWidth;\r\n        }, 0);\r\n    }\r\n    /**\r\n     * Returns the number of rows for a given table. Any other element present in the table model is omitted.\r\n     *\r\n     * ```ts\r\n     * editor.plugins.get( 'TableUtils' ).getRows( table );\r\n     * ```\r\n     *\r\n     * @param table The table to analyze.\r\n     */\r\n    getRows(table) {\r\n        // Rowspan not included due to #6427.\r\n        return Array.from(table.getChildren())\r\n            .reduce((rowCount, child) => child.is('element', 'tableRow') ? rowCount + 1 : rowCount, 0);\r\n    }\r\n    /**\r\n     * Creates an instance of the table walker.\r\n     *\r\n     * The table walker iterates internally by traversing the table from row index = 0 and column index = 0.\r\n     * It walks row by row and column by column in order to output values defined in the options.\r\n     * By default it will output only the locations that are occupied by a cell. To include also spanned rows and columns,\r\n     * pass the `includeAllSlots` option.\r\n     *\r\n     * @internal\r\n     * @param table A table over which the walker iterates.\r\n     * @param options An object with configuration.\r\n     */\r\n    createTableWalker(table, options = {}) {\r\n        return new TableWalker(table, options);\r\n    }\r\n    /**\r\n     * Returns all model table cells that are fully selected (from the outside)\r\n     * within the provided model selection's ranges.\r\n     *\r\n     * To obtain the cells selected from the inside, use\r\n     * {@link #getTableCellsContainingSelection}.\r\n     */\r\n    getSelectedTableCells(selection) {\r\n        const cells = [];\r\n        for (const range of this.sortRanges(selection.getRanges())) {\r\n            const element = range.getContainedElement();\r\n            if (element && element.is('element', 'tableCell')) {\r\n                cells.push(element);\r\n            }\r\n        }\r\n        return cells;\r\n    }\r\n    /**\r\n     * Returns all model table cells that the provided model selection's ranges\r\n     * {@link module:engine/model/range~Range#start} inside.\r\n     *\r\n     * To obtain the cells selected from the outside, use\r\n     * {@link #getSelectedTableCells}.\r\n     */\r\n    getTableCellsContainingSelection(selection) {\r\n        const cells = [];\r\n        for (const range of selection.getRanges()) {\r\n            const cellWithSelection = range.start.findAncestor('tableCell');\r\n            if (cellWithSelection) {\r\n                cells.push(cellWithSelection);\r\n            }\r\n        }\r\n        return cells;\r\n    }\r\n    /**\r\n     * Returns all model table cells that are either completely selected\r\n     * by selection ranges or host selection range\r\n     * {@link module:engine/model/range~Range#start start positions} inside them.\r\n     *\r\n     * Combines {@link #getTableCellsContainingSelection} and\r\n     * {@link #getSelectedTableCells}.\r\n     */\r\n    getSelectionAffectedTableCells(selection) {\r\n        const selectedCells = this.getSelectedTableCells(selection);\r\n        if (selectedCells.length) {\r\n            return selectedCells;\r\n        }\r\n        return this.getTableCellsContainingSelection(selection);\r\n    }\r\n    /**\r\n     * Returns an object with the `first` and `last` row index contained in the given `tableCells`.\r\n     *\r\n     * ```ts\r\n     * const selectedTableCells = getSelectedTableCells( editor.model.document.selection );\r\n     *\r\n     * const { first, last } = getRowIndexes( selectedTableCells );\r\n     *\r\n     * console.log( `Selected rows: ${ first } to ${ last }` );\r\n     * ```\r\n     *\r\n     * @returns Returns an object with the `first` and `last` table row indexes.\r\n     */\r\n    getRowIndexes(tableCells) {\r\n        const indexes = tableCells.map(cell => cell.parent.index);\r\n        return this._getFirstLastIndexesObject(indexes);\r\n    }\r\n    /**\r\n     * Returns an object with the `first` and `last` column index contained in the given `tableCells`.\r\n     *\r\n     * ```ts\r\n     * const selectedTableCells = getSelectedTableCells( editor.model.document.selection );\r\n     *\r\n     * const { first, last } = getColumnIndexes( selectedTableCells );\r\n     *\r\n     * console.log( `Selected columns: ${ first } to ${ last }` );\r\n     * ```\r\n     *\r\n     * @returns Returns an object with the `first` and `last` table column indexes.\r\n     */\r\n    getColumnIndexes(tableCells) {\r\n        const table = tableCells[0].findAncestor('table');\r\n        const tableMap = [...new TableWalker(table)];\r\n        const indexes = tableMap\r\n            .filter(entry => tableCells.includes(entry.cell))\r\n            .map(entry => entry.column);\r\n        return this._getFirstLastIndexesObject(indexes);\r\n    }\r\n    /**\r\n     * Checks if the selection contains cells that do not exceed rectangular selection.\r\n     *\r\n     * In a table below:\r\n     *\r\n     *  ┌───┬───┬───┬───┐\r\n     *  │ a │ b │ c │ d │\r\n     *  ├───┴───┼───┤   │\r\n     *  │ e     │ f │   │\r\n     *  │       ├───┼───┤\r\n     *  │       │ g │ h │\r\n     *  └───────┴───┴───┘\r\n     *\r\n     * Valid selections are these which create a solid rectangle (without gaps), such as:\r\n     *   - a, b (two horizontal cells)\r\n     *   - c, f (two vertical cells)\r\n     *   - a, b, e (cell \"e\" spans over four cells)\r\n     *   - c, d, f (cell d spans over a cell in the row below)\r\n     *\r\n     * While an invalid selection would be:\r\n     *   - a, c (the unselected cell \"b\" creates a gap)\r\n     *   - f, g, h (cell \"d\" spans over a cell from the row of \"f\" cell - thus creates a gap)\r\n     */\r\n    isSelectionRectangular(selectedTableCells) {\r\n        if (selectedTableCells.length < 2 || !this._areCellInTheSameTableSection(selectedTableCells)) {\r\n            return false;\r\n        }\r\n        // A valid selection is a fully occupied rectangle composed of table cells.\r\n        // Below we will calculate the area of a selected table cells and the area of valid selection.\r\n        // The area of a valid selection is defined by top-left and bottom-right cells.\r\n        const rows = new Set();\r\n        const columns = new Set();\r\n        let areaOfSelectedCells = 0;\r\n        for (const tableCell of selectedTableCells) {\r\n            const { row, column } = this.getCellLocation(tableCell);\r\n            const rowspan = parseInt(tableCell.getAttribute('rowspan')) || 1;\r\n            const colspan = parseInt(tableCell.getAttribute('colspan')) || 1;\r\n            // Record row & column indexes of current cell.\r\n            rows.add(row);\r\n            columns.add(column);\r\n            // For cells that spans over multiple rows add also the last row that this cell spans over.\r\n            if (rowspan > 1) {\r\n                rows.add(row + rowspan - 1);\r\n            }\r\n            // For cells that spans over multiple columns add also the last column that this cell spans over.\r\n            if (colspan > 1) {\r\n                columns.add(column + colspan - 1);\r\n            }\r\n            areaOfSelectedCells += (rowspan * colspan);\r\n        }\r\n        // We can only merge table cells that are in adjacent rows...\r\n        const areaOfValidSelection = getBiggestRectangleArea(rows, columns);\r\n        return areaOfValidSelection == areaOfSelectedCells;\r\n    }\r\n    /**\r\n     * Returns array of sorted ranges.\r\n     */\r\n    sortRanges(ranges) {\r\n        return Array.from(ranges).sort(compareRangeOrder);\r\n    }\r\n    /**\r\n     * Helper method to get an object with `first` and `last` indexes from an unsorted array of indexes.\r\n     */\r\n    _getFirstLastIndexesObject(indexes) {\r\n        const allIndexesSorted = indexes.sort((indexA, indexB) => indexA - indexB);\r\n        const first = allIndexesSorted[0];\r\n        const last = allIndexesSorted[allIndexesSorted.length - 1];\r\n        return { first, last };\r\n    }\r\n    /**\r\n     * Checks if the selection does not mix a header (column or row) with other cells.\r\n     *\r\n     * For instance, in the table below valid selections consist of cells with the same letter only.\r\n     * So, a-a (same heading row and column) or d-d (body cells) are valid while c-d or a-b are not.\r\n     *\r\n     * header columns\r\n     *    ↓   ↓\r\n     *  ┌───┬───┬───┬───┐\r\n     *  │ a │ a │ b │ b │  ← header row\r\n     *  ├───┼───┼───┼───┤\r\n     *  │ c │ c │ d │ d │\r\n     *  ├───┼───┼───┼───┤\r\n     *  │ c │ c │ d │ d │\r\n     *  └───┴───┴───┴───┘\r\n     */\r\n    _areCellInTheSameTableSection(tableCells) {\r\n        const table = tableCells[0].findAncestor('table');\r\n        const rowIndexes = this.getRowIndexes(tableCells);\r\n        const headingRows = parseInt(table.getAttribute('headingRows')) || 0;\r\n        // Calculating row indexes is a bit cheaper so if this check fails we can't merge.\r\n        if (!this._areIndexesInSameSection(rowIndexes, headingRows)) {\r\n            return false;\r\n        }\r\n        const columnIndexes = this.getColumnIndexes(tableCells);\r\n        const headingColumns = parseInt(table.getAttribute('headingColumns')) || 0;\r\n        // Similarly cells must be in same column section.\r\n        return this._areIndexesInSameSection(columnIndexes, headingColumns);\r\n    }\r\n    /**\r\n     * Unified check if table rows/columns indexes are in the same heading/body section.\r\n     */\r\n    _areIndexesInSameSection({ first, last }, headingSectionSize) {\r\n        const firstCellIsInHeading = first < headingSectionSize;\r\n        const lastCellIsInHeading = last < headingSectionSize;\r\n        return firstCellIsInHeading === lastCellIsInHeading;\r\n    }\r\n}\r\n/**\r\n * Creates empty rows at the given index in an existing table.\r\n *\r\n * @param insertAt The row index of row insertion.\r\n * @param rows The number of rows to create.\r\n * @param tableCellToInsert The number of cells to insert in each row.\r\n */\r\nfunction createEmptyRows(writer, table, insertAt, rows, tableCellToInsert, attributes = {}) {\r\n    for (let i = 0; i < rows; i++) {\r\n        const tableRow = writer.createElement('tableRow');\r\n        writer.insert(tableRow, table, insertAt);\r\n        createCells(tableCellToInsert, writer, writer.createPositionAt(tableRow, 'end'), attributes);\r\n    }\r\n}\r\n/**\r\n * Creates cells at a given position.\r\n *\r\n * @param cells The number of cells to create\r\n */\r\nfunction createCells(cells, writer, insertPosition, attributes = {}) {\r\n    for (let i = 0; i < cells; i++) {\r\n        createEmptyTableCell(writer, insertPosition, attributes);\r\n    }\r\n}\r\n/**\r\n * Evenly distributes the span of a cell to a number of provided cells.\r\n * The resulting spans will always be integer values.\r\n *\r\n * For instance breaking a span of 7 into 3 cells will return:\r\n *\r\n * ```ts\r\n * { newCellsSpan: 2, updatedSpan: 3 }\r\n * ```\r\n *\r\n * as two cells will have a span of 2 and the remainder will go the first cell so its span will change to 3.\r\n *\r\n * @param span The span value do break.\r\n * @param numberOfCells The number of resulting spans.\r\n */\r\nfunction breakSpanEvenly(span, numberOfCells) {\r\n    if (span < numberOfCells) {\r\n        return { newCellsSpan: 1, updatedSpan: 1 };\r\n    }\r\n    const newCellsSpan = Math.floor(span / numberOfCells);\r\n    const updatedSpan = (span - newCellsSpan * numberOfCells) + newCellsSpan;\r\n    return { newCellsSpan, updatedSpan };\r\n}\r\n/**\r\n * Updates heading columns attribute if removing a row from head section.\r\n */\r\nfunction adjustHeadingColumns(table, removedColumnIndexes, writer) {\r\n    const headingColumns = table.getAttribute('headingColumns') || 0;\r\n    if (headingColumns && removedColumnIndexes.first < headingColumns) {\r\n        const headingsRemoved = Math.min(headingColumns - 1 /* Other numbers are 0-based */, removedColumnIndexes.last) -\r\n            removedColumnIndexes.first + 1;\r\n        writer.setAttribute('headingColumns', headingColumns - headingsRemoved, table);\r\n    }\r\n}\r\n/**\r\n * Calculates a new heading rows value for removing rows from heading section.\r\n */\r\nfunction updateHeadingRows(table, { first, last }, writer) {\r\n    const headingRows = table.getAttribute('headingRows') || 0;\r\n    if (first < headingRows) {\r\n        const newRows = last < headingRows ? headingRows - (last - first + 1) : first;\r\n        updateNumericAttribute('headingRows', newRows, table, writer, 0);\r\n    }\r\n}\r\n/**\r\n * Finds cells that will be:\r\n * - trimmed - Cells that are \"above\" removed rows sections and overlap the removed section - their rowspan must be trimmed.\r\n * - moved - Cells from removed rows section might stick out of. These cells are moved to the next row after a removed section.\r\n *\r\n * Sample table with overlapping & sticking out cells:\r\n *\r\n *      +----+----+----+----+----+\r\n *      | 00 | 01 | 02 | 03 | 04 |\r\n *      +----+    +    +    +    +\r\n *      | 10 |    |    |    |    |\r\n *      +----+----+    +    +    +\r\n *      | 20 | 21 |    |    |    | <-- removed row\r\n *      +    +    +----+    +    +\r\n *      |    |    | 32 |    |    | <-- removed row\r\n *      +----+    +    +----+    +\r\n *      | 40 |    |    | 43 |    |\r\n *      +----+----+----+----+----+\r\n *\r\n * In a table above:\r\n * - cells to trim: '02', '03' & '04'.\r\n * - cells to move: '21' & '32'.\r\n */\r\nfunction getCellsToMoveAndTrimOnRemoveRow(table, { first, last }) {\r\n    const cellsToMove = new Map();\r\n    const cellsToTrim = [];\r\n    for (const { row, column, cellHeight, cell } of new TableWalker(table, { endRow: last })) {\r\n        const lastRowOfCell = row + cellHeight - 1;\r\n        const isCellStickingOutFromRemovedRows = row >= first && row <= last && lastRowOfCell > last;\r\n        if (isCellStickingOutFromRemovedRows) {\r\n            const rowspanInRemovedSection = last - row + 1;\r\n            const rowSpanToSet = cellHeight - rowspanInRemovedSection;\r\n            cellsToMove.set(column, {\r\n                cell,\r\n                rowspan: rowSpanToSet\r\n            });\r\n        }\r\n        const isCellOverlappingRemovedRows = row < first && lastRowOfCell >= first;\r\n        if (isCellOverlappingRemovedRows) {\r\n            let rowspanAdjustment;\r\n            // Cell fully covers removed section - trim it by removed rows count.\r\n            if (lastRowOfCell >= last) {\r\n                rowspanAdjustment = last - first + 1;\r\n            }\r\n            // Cell partially overlaps removed section - calculate cell's span that is in removed section.\r\n            else {\r\n                rowspanAdjustment = lastRowOfCell - first + 1;\r\n            }\r\n            cellsToTrim.push({\r\n                cell,\r\n                rowspan: cellHeight - rowspanAdjustment\r\n            });\r\n        }\r\n    }\r\n    return { cellsToMove, cellsToTrim };\r\n}\r\nfunction moveCellsToRow(table, targetRowIndex, cellsToMove, writer) {\r\n    const tableWalker = new TableWalker(table, {\r\n        includeAllSlots: true,\r\n        row: targetRowIndex\r\n    });\r\n    const tableRowMap = [...tableWalker];\r\n    const row = table.getChild(targetRowIndex);\r\n    let previousCell;\r\n    for (const { column, cell, isAnchor } of tableRowMap) {\r\n        if (cellsToMove.has(column)) {\r\n            const { cell: cellToMove, rowspan } = cellsToMove.get(column);\r\n            const targetPosition = previousCell ?\r\n                writer.createPositionAfter(previousCell) :\r\n                writer.createPositionAt(row, 0);\r\n            writer.move(writer.createRangeOn(cellToMove), targetPosition);\r\n            updateNumericAttribute('rowspan', rowspan, cellToMove, writer);\r\n            previousCell = cellToMove;\r\n        }\r\n        else if (isAnchor) {\r\n            // If cell is spanned then `cell` holds reference to overlapping cell. See ckeditor/ckeditor5#6502.\r\n            previousCell = cell;\r\n        }\r\n    }\r\n}\r\nfunction compareRangeOrder(rangeA, rangeB) {\r\n    // Since table cell ranges are disjoint, it's enough to check their start positions.\r\n    const posA = rangeA.start;\r\n    const posB = rangeB.start;\r\n    // Checking for equal position (returning 0) is not needed because this would be either:\r\n    // a. Intersecting range (not allowed by model)\r\n    // b. Collapsed range on the same position (allowed by model but should not happen).\r\n    return posA.isBefore(posB) ? -1 : 1;\r\n}\r\n/**\r\n * Calculates the area of a maximum rectangle that can span over the provided row & column indexes.\r\n */\r\nfunction getBiggestRectangleArea(rows, columns) {\r\n    const rowsIndexes = Array.from(rows.values());\r\n    const columnIndexes = Array.from(columns.values());\r\n    const lastRow = Math.max(...rowsIndexes);\r\n    const firstRow = Math.min(...rowsIndexes);\r\n    const lastColumn = Math.max(...columnIndexes);\r\n    const firstColumn = Math.min(...columnIndexes);\r\n    return (lastRow - firstRow + 1) * (lastColumn - firstColumn + 1);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport TableUtils from '../tableutils';\r\nimport { updateNumericAttribute } from '../utils/common';\r\nimport { removeEmptyRowsColumns } from '../utils/structure';\r\n/**\r\n * The merge cells command.\r\n *\r\n * The command is registered by {@link module:table/tableediting~TableEditing} as the `'mergeTableCells'` editor command.\r\n *\r\n * For example, to merge selected table cells:\r\n *\r\n * ```ts\r\n * editor.execute( 'mergeTableCells' );\r\n * ```\r\n */\r\nexport default class MergeCellsCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const tableUtils = this.editor.plugins.get(TableUtils);\r\n        const selectedTableCells = tableUtils.getSelectedTableCells(this.editor.model.document.selection);\r\n        this.isEnabled = tableUtils.isSelectionRectangular(selectedTableCells);\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * @fires execute\r\n     */\r\n    execute() {\r\n        const model = this.editor.model;\r\n        const tableUtils = this.editor.plugins.get(TableUtils);\r\n        model.change(writer => {\r\n            const selectedTableCells = tableUtils.getSelectedTableCells(model.document.selection);\r\n            // All cells will be merged into the first one.\r\n            const firstTableCell = selectedTableCells.shift();\r\n            // Update target cell dimensions.\r\n            const { mergeWidth, mergeHeight } = getMergeDimensions(firstTableCell, selectedTableCells, tableUtils);\r\n            updateNumericAttribute('colspan', mergeWidth, firstTableCell, writer);\r\n            updateNumericAttribute('rowspan', mergeHeight, firstTableCell, writer);\r\n            for (const tableCell of selectedTableCells) {\r\n                mergeTableCells(tableCell, firstTableCell, writer);\r\n            }\r\n            const table = firstTableCell.findAncestor('table');\r\n            // Remove rows and columns that become empty (have no anchored cells).\r\n            removeEmptyRowsColumns(table, tableUtils);\r\n            writer.setSelection(firstTableCell, 'in');\r\n        });\r\n    }\r\n}\r\n/**\r\n *  Merges two table cells. It will ensure that after merging cells with empty paragraphs the resulting table cell will only have one\r\n * paragraph. If one of the merged table cells is empty, the merged table cell will have contents of the non-empty table cell.\r\n * If both are empty, the merged table cell will have only one empty paragraph.\r\n */\r\nfunction mergeTableCells(cellBeingMerged, targetCell, writer) {\r\n    if (!isEmpty(cellBeingMerged)) {\r\n        if (isEmpty(targetCell)) {\r\n            writer.remove(writer.createRangeIn(targetCell));\r\n        }\r\n        writer.move(writer.createRangeIn(cellBeingMerged), writer.createPositionAt(targetCell, 'end'));\r\n    }\r\n    // Remove merged table cell.\r\n    writer.remove(cellBeingMerged);\r\n}\r\n/**\r\n * Checks if the passed table cell contains an empty paragraph.\r\n */\r\nfunction isEmpty(tableCell) {\r\n    const firstTableChild = tableCell.getChild(0);\r\n    return tableCell.childCount == 1 && firstTableChild.is('element', 'paragraph') && firstTableChild.isEmpty;\r\n}\r\nfunction getMergeDimensions(firstTableCell, selectedTableCells, tableUtils) {\r\n    let maxWidthOffset = 0;\r\n    let maxHeightOffset = 0;\r\n    for (const tableCell of selectedTableCells) {\r\n        const { row, column } = tableUtils.getCellLocation(tableCell);\r\n        maxWidthOffset = getMaxOffset(tableCell, column, maxWidthOffset, 'colspan');\r\n        maxHeightOffset = getMaxOffset(tableCell, row, maxHeightOffset, 'rowspan');\r\n    }\r\n    // Update table cell span attribute and merge set selection on a merged contents.\r\n    const { row: firstCellRow, column: firstCellColumn } = tableUtils.getCellLocation(firstTableCell);\r\n    const mergeWidth = maxWidthOffset - firstCellColumn;\r\n    const mergeHeight = maxHeightOffset - firstCellRow;\r\n    return { mergeWidth, mergeHeight };\r\n}\r\nfunction getMaxOffset(tableCell, start, currentMaxOffset, which) {\r\n    const dimensionValue = parseInt(tableCell.getAttribute(which) || '1');\r\n    return Math.max(currentMaxOffset, start + dimensionValue);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/commands/selectrowcommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\n/**\r\n * The select row command.\r\n *\r\n * The command is registered by {@link module:table/tableediting~TableEditing} as the `'selectTableRow'` editor command.\r\n *\r\n * To select the rows containing the selected cells, execute the command:\r\n *\r\n * ```ts\r\n * editor.execute( 'selectTableRow' );\r\n * ```\r\n */\r\nexport default class SelectRowCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        // It does not affect data so should be enabled in read-only mode.\r\n        this.affectsData = false;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const tableUtils = this.editor.plugins.get('TableUtils');\r\n        const selectedCells = tableUtils.getSelectionAffectedTableCells(this.editor.model.document.selection);\r\n        this.isEnabled = selectedCells.length > 0;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    execute() {\r\n        const model = this.editor.model;\r\n        const tableUtils = this.editor.plugins.get('TableUtils');\r\n        const referenceCells = tableUtils.getSelectionAffectedTableCells(model.document.selection);\r\n        const rowIndexes = tableUtils.getRowIndexes(referenceCells);\r\n        const table = referenceCells[0].findAncestor('table');\r\n        const rangesToSelect = [];\r\n        for (let rowIndex = rowIndexes.first; rowIndex <= rowIndexes.last; rowIndex++) {\r\n            for (const cell of table.getChild(rowIndex).getChildren()) {\r\n                rangesToSelect.push(model.createRangeOn(cell));\r\n            }\r\n        }\r\n        model.change(writer => {\r\n            writer.setSelection(rangesToSelect);\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/commands/selectcolumncommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport TableWalker from '../tablewalker';\r\n/**\r\n * The select column command.\r\n *\r\n * The command is registered by {@link module:table/tableediting~TableEditing} as the `'selectTableColumn'` editor command.\r\n *\r\n * To select the columns containing the selected cells, execute the command:\r\n *\r\n * ```ts\r\n * editor.execute( 'selectTableColumn' );\r\n * ```\r\n */\r\nexport default class SelectColumnCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        // It does not affect data so should be enabled in read-only mode.\r\n        this.affectsData = false;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const tableUtils = this.editor.plugins.get('TableUtils');\r\n        const selectedCells = tableUtils.getSelectionAffectedTableCells(this.editor.model.document.selection);\r\n        this.isEnabled = selectedCells.length > 0;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    execute() {\r\n        const tableUtils = this.editor.plugins.get('TableUtils');\r\n        const model = this.editor.model;\r\n        const referenceCells = tableUtils.getSelectionAffectedTableCells(model.document.selection);\r\n        const firstCell = referenceCells[0];\r\n        const lastCell = referenceCells.pop();\r\n        const table = firstCell.findAncestor('table');\r\n        const startLocation = tableUtils.getCellLocation(firstCell);\r\n        const endLocation = tableUtils.getCellLocation(lastCell);\r\n        const startColumn = Math.min(startLocation.column, endLocation.column);\r\n        const endColumn = Math.max(startLocation.column, endLocation.column);\r\n        const rangesToSelect = [];\r\n        for (const cellInfo of new TableWalker(table, { startColumn, endColumn })) {\r\n            rangesToSelect.push(model.createRangeOn(cellInfo.cell));\r\n        }\r\n        model.change(writer => {\r\n            writer.setSelection(rangesToSelect);\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport TableWalker from './../tablewalker';\r\nimport { createEmptyTableCell, updateNumericAttribute } from '../utils/common';\r\n/**\r\n * Injects a table layout post-fixer into the model.\r\n *\r\n * The role of the table layout post-fixer is to ensure that the table rows have the correct structure\r\n * after a {@link module:engine/model/model~Model#change `change()`} block was executed.\r\n *\r\n * The correct structure means that:\r\n *\r\n * * All table rows have the same size.\r\n * * None of the table cells extend vertically beyond their section (either header or body).\r\n * * A table cell has always at least one element as a child.\r\n *\r\n * If the table structure is not correct, the post-fixer will automatically correct it in two steps:\r\n *\r\n * 1. It will clip table cells that extend beyond their section.\r\n * 2. It will add empty table cells to the rows that are narrower than the widest table row.\r\n *\r\n * ## Clipping overlapping table cells\r\n *\r\n * Such situation may occur when pasting a table (or a part of a table) to the editor from external sources.\r\n *\r\n * For example, see the following table which has a cell (FOO) with the rowspan attribute (2):\r\n *\r\n * ```xml\r\n * <table headingRows=\"1\">\r\n *   <tableRow>\r\n *     <tableCell rowspan=\"2\"><paragraph>FOO</paragraph></tableCell>\r\n *     <tableCell colspan=\"2\"><paragraph>BAR</paragraph></tableCell>\r\n *   </tableRow>\r\n *   <tableRow>\r\n *     <tableCell><paragraph>BAZ</paragraph></tableCell>\r\n *     <tableCell><paragraph>XYZ</paragraph></tableCell>\r\n *   </tableRow>\r\n * </table>\r\n * ```\r\n *\r\n * It will be rendered in the view as:\r\n *\r\n * ```xml\r\n * <table>\r\n *   <thead>\r\n *     <tr>\r\n *       <td rowspan=\"2\">FOO</td>\r\n *       <td colspan=\"2\">BAR</td>\r\n *     </tr>\r\n *   </thead>\r\n *   <tbody>\r\n *     <tr>\r\n *       <td>BAZ</td>\r\n *       <td>XYZ</td>\r\n *     </tr>\r\n *   </tbody>\r\n * </table>\r\n * ```\r\n *\r\n * In the above example the table will be rendered as a table with two rows: one in the header and second one in the body.\r\n * The table cell (FOO) cannot span over multiple rows as it would extend from the header to the body section.\r\n * The `rowspan` attribute must be changed to (1). The value (1) is the default value of the `rowspan` attribute\r\n * so the `rowspan` attribute will be removed from the model.\r\n *\r\n * The table cell with BAZ in the content will be in the first column of the table.\r\n *\r\n * ## Adding missing table cells\r\n *\r\n * The table post-fixer will insert empty table cells to equalize table row sizes (the number of columns).\r\n * The size of a table row is calculated by counting column spans of table cells, both horizontal (from the same row) and\r\n * vertical (from the rows above).\r\n *\r\n * In the above example, the table row in the body section of the table is narrower then the row from the header: it has two cells\r\n * with the default colspan (1). The header row has one cell with colspan (1) and the second with colspan (2).\r\n * The table cell (FOO) does not extend beyond the head section (and as such will be fixed in the first step of this post-fixer).\r\n * The post-fixer will add a missing table cell to the row in the body section of the table.\r\n *\r\n * The table from the above example will be fixed and rendered to the view as below:\r\n *\r\n * ```xml\r\n * <table>\r\n *   <thead>\r\n *     <tr>\r\n *       <td rowspan=\"2\">FOO</td>\r\n *       <td colspan=\"2\">BAR</td>\r\n *     </tr>\r\n *   </thead>\r\n *   <tbody>\r\n *     <tr>\r\n *       <td>BAZ</td>\r\n *       <td>XYZ</td>\r\n *     </tr>\r\n *   </tbody>\r\n * </table>\r\n * ```\r\n *\r\n * ## Collaboration and undo - Expectations vs post-fixer results\r\n *\r\n * The table post-fixer only ensures proper structure without a deeper analysis of the nature of the change. As such, it might lead\r\n * to a structure which was not intended by the user. In particular, it will also fix undo steps (in conjunction with collaboration)\r\n * in which the editor content might not return to the original state.\r\n *\r\n * This will usually happen when one or more users change the size of the table.\r\n *\r\n * As an example see the table below:\r\n *\r\n * ```xml\r\n * <table>\r\n *   <tbody>\r\n *     <tr>\r\n *       <td>11</td>\r\n *       <td>12</td>\r\n *     </tr>\r\n *     <tr>\r\n *       <td>21</td>\r\n *       <td>22</td>\r\n *     </tr>\r\n *   </tbody>\r\n * </table>\r\n * ```\r\n *\r\n * and the user actions:\r\n *\r\n * 1. Both users have a table with two rows and two columns.\r\n * 2. User A adds a column at the end of the table. This will insert empty table cells to two rows.\r\n * 3. User B adds a row at the end of the table. This will insert a row with two empty table cells.\r\n * 4. Both users will have a table as below:\r\n *\r\n * ```xml\r\n * <table>\r\n *   <tbody>\r\n *     <tr>\r\n *       <td>11</td>\r\n *       <td>12</td>\r\n *       <td>(empty, inserted by A)</td>\r\n *     </tr>\r\n *     <tr>\r\n *       <td>21</td>\r\n *       <td>22</td>\r\n *       <td>(empty, inserted by A)</td>\r\n *     </tr>\r\n *     <tr>\r\n *       <td>(empty, inserted by B)</td>\r\n *       <td>(empty, inserted by B)</td>\r\n *     </tr>\r\n *   </tbody>\r\n * </table>\r\n * ```\r\n *\r\n * The last row is shorter then others so the table post-fixer will add an empty row to the last row:\r\n *\r\n * ```xml\r\n * <table>\r\n *   <tbody>\r\n *     <tr>\r\n *       <td>11</td>\r\n *       <td>12</td>\r\n *       <td>(empty, inserted by A)</td>\r\n *     </tr>\r\n *     <tr>\r\n *       <td>21</td>\r\n *       <td>22</td>\r\n *       <td>(empty, inserted by A)</td>\r\n *     </tr>\r\n *     <tr>\r\n *       <td>(empty, inserted by B)</td>\r\n *       <td>(empty, inserted by B)</td>\r\n *       <td>(empty, inserted by the post-fixer)</td>\r\n *     </tr>\r\n *   </tbody>\r\n * </table>\r\n * ```\r\n *\r\n * Unfortunately undo does not know the nature of the changes and depending on which user applies the post-fixer changes, undoing them\r\n * might lead to a broken table. If User B undoes inserting the column to the table, the undo engine will undo only the operations of\r\n * inserting empty cells to rows from the initial table state (row 1 and 2) but the cell in the post-fixed row will remain:\r\n *\r\n * ```xml\r\n * <table>\r\n *   <tbody>\r\n *     <tr>\r\n *       <td>11</td>\r\n *       <td>12</td>\r\n *     </tr>\r\n *     <tr>\r\n *       <td>21</td>\r\n *       <td>22</td>\r\n *     </tr>\r\n *     <tr>\r\n *       <td>(empty, inserted by B)</td>\r\n *       <td>(empty, inserted by B)</td>\r\n *       <td>(empty, inserted by a post-fixer)</td>\r\n *     </tr>\r\n *   </tbody>\r\n * </table>\r\n * ```\r\n *\r\n * After undo, the table post-fixer will detect that two rows are shorter than others and will fix the table to:\r\n *\r\n * ```xml\r\n * <table>\r\n *   <tbody>\r\n *     <tr>\r\n *       <td>11</td>\r\n *       <td>12</td>\r\n *       <td>(empty, inserted by a post-fixer after undo)</td>\r\n *     </tr>\r\n *     <tr>\r\n *       <td>21</td>\r\n *       <td>22</td>\r\n *       <td>(empty, inserted by a post-fixer after undo)</td>\r\n *     </tr>\r\n *     <tr>\r\n *       <td>(empty, inserted by B)</td>\r\n *       <td>(empty, inserted by B)</td>\r\n *       <td>(empty, inserted by a post-fixer)</td>\r\n *     </tr>\r\n *   </tbody>\r\n * </table>\r\n * ```\r\n */\r\nexport default function injectTableLayoutPostFixer(model) {\r\n    model.document.registerPostFixer(writer => tableLayoutPostFixer(writer, model));\r\n}\r\n/**\r\n * The table layout post-fixer.\r\n */\r\nfunction tableLayoutPostFixer(writer, model) {\r\n    const changes = model.document.differ.getChanges();\r\n    let wasFixed = false;\r\n    // Do not analyze the same table more then once - may happen for multiple changes in the same table.\r\n    const analyzedTables = new Set();\r\n    for (const entry of changes) {\r\n        let table = null;\r\n        if (entry.type == 'insert' && entry.name == 'table') {\r\n            table = entry.position.nodeAfter;\r\n        }\r\n        // Fix table on adding/removing table cells and rows.\r\n        if ((entry.type == 'insert' || entry.type == 'remove') && (entry.name == 'tableRow' || entry.name == 'tableCell')) {\r\n            table = entry.position.findAncestor('table');\r\n        }\r\n        // Fix table on any table's attribute change - including attributes of table cells.\r\n        if (isTableAttributeEntry(entry)) {\r\n            table = entry.range.start.findAncestor('table');\r\n        }\r\n        if (table && !analyzedTables.has(table)) {\r\n            // Step 1: correct rowspans of table cells if necessary.\r\n            // The wasFixed flag should be true if any of tables in batch was fixed - might be more then one.\r\n            wasFixed = fixTableCellsRowspan(table, writer) || wasFixed;\r\n            // Step 2: fix table rows sizes.\r\n            wasFixed = fixTableRowsSizes(table, writer) || wasFixed;\r\n            analyzedTables.add(table);\r\n        }\r\n    }\r\n    return wasFixed;\r\n}\r\n/**\r\n * Fixes the invalid value of the `rowspan` attribute because a table cell cannot vertically extend beyond the table section it belongs to.\r\n *\r\n * @returns Returns `true` if the table was fixed.\r\n */\r\nfunction fixTableCellsRowspan(table, writer) {\r\n    let wasFixed = false;\r\n    const cellsToTrim = findCellsToTrim(table);\r\n    if (cellsToTrim.length) {\r\n        // @if CK_DEBUG_TABLE // console.log( `Post-fixing table: trimming cells row-spans (${ cellsToTrim.length }).` );\r\n        wasFixed = true;\r\n        for (const data of cellsToTrim) {\r\n            updateNumericAttribute('rowspan', data.rowspan, data.cell, writer, 1);\r\n        }\r\n    }\r\n    return wasFixed;\r\n}\r\n/**\r\n * Makes all table rows in a table the same size.\r\n *\r\n * @returns Returns `true` if the table was fixed.\r\n */\r\nfunction fixTableRowsSizes(table, writer) {\r\n    let wasFixed = false;\r\n    const childrenLengths = getChildrenLengths(table);\r\n    const rowsToRemove = [];\r\n    // Find empty rows.\r\n    for (const [rowIndex, size] of childrenLengths.entries()) {\r\n        // Ignore all non-row models.\r\n        if (!size && table.getChild(rowIndex).is('element', 'tableRow')) {\r\n            rowsToRemove.push(rowIndex);\r\n        }\r\n    }\r\n    // Remove empty rows.\r\n    if (rowsToRemove.length) {\r\n        // @if CK_DEBUG_TABLE // console.log( `Post-fixing table: remove empty rows (${ rowsToRemove.length }).` );\r\n        wasFixed = true;\r\n        for (const rowIndex of rowsToRemove.reverse()) {\r\n            writer.remove(table.getChild(rowIndex));\r\n            childrenLengths.splice(rowIndex, 1);\r\n        }\r\n    }\r\n    // Filter out everything that's not a table row.\r\n    const rowsLengths = childrenLengths.filter((row, rowIndex) => table.getChild(rowIndex).is('element', 'tableRow'));\r\n    // Verify if all the rows have the same number of columns.\r\n    const tableSize = rowsLengths[0];\r\n    const isValid = rowsLengths.every(length => length === tableSize);\r\n    if (!isValid) {\r\n        // @if CK_DEBUG_TABLE // console.log( 'Post-fixing table: adding missing cells.' );\r\n        // Find the maximum number of columns.\r\n        const maxColumns = rowsLengths.reduce((prev, current) => current > prev ? current : prev, 0);\r\n        for (const [rowIndex, size] of rowsLengths.entries()) {\r\n            const columnsToInsert = maxColumns - size;\r\n            if (columnsToInsert) {\r\n                for (let i = 0; i < columnsToInsert; i++) {\r\n                    createEmptyTableCell(writer, writer.createPositionAt(table.getChild(rowIndex), 'end'));\r\n                }\r\n                wasFixed = true;\r\n            }\r\n        }\r\n    }\r\n    return wasFixed;\r\n}\r\n/**\r\n * Searches for table cells that extend beyond the table section to which they belong to. It will return an array of objects\r\n * that stores table cells to be trimmed and the correct value of the `rowspan` attribute to set.\r\n */\r\nfunction findCellsToTrim(table) {\r\n    const headingRows = parseInt(table.getAttribute('headingRows') || '0');\r\n    const maxRows = Array.from(table.getChildren())\r\n        .reduce((count, row) => row.is('element', 'tableRow') ? count + 1 : count, 0);\r\n    const cellsToTrim = [];\r\n    for (const { row, cell, cellHeight } of new TableWalker(table)) {\r\n        // Skip cells that do not expand over its row.\r\n        if (cellHeight < 2) {\r\n            continue;\r\n        }\r\n        const isInHeader = row < headingRows;\r\n        // Row limit is either end of header section or whole table as table body is after the header.\r\n        const rowLimit = isInHeader ? headingRows : maxRows;\r\n        // If table cell expands over its limit reduce it height to proper value.\r\n        if (row + cellHeight > rowLimit) {\r\n            const newRowspan = rowLimit - row;\r\n            cellsToTrim.push({ cell, rowspan: newRowspan });\r\n        }\r\n    }\r\n    return cellsToTrim;\r\n}\r\n/**\r\n * Returns an array with lengths of rows assigned to the corresponding row index.\r\n */\r\nfunction getChildrenLengths(table) {\r\n    // TableWalker will not provide items for the empty rows, we need to pre-fill this array.\r\n    const lengths = new Array(table.childCount).fill(0);\r\n    for (const { rowIndex } of new TableWalker(table, { includeAllSlots: true })) {\r\n        lengths[rowIndex]++;\r\n    }\r\n    return lengths;\r\n}\r\n/**\r\n * Checks if the differ entry for an attribute change is one of the table's attributes.\r\n */\r\nfunction isTableAttributeEntry(entry) {\r\n    if (entry.type !== 'attribute') {\r\n        return false;\r\n    }\r\n    const key = entry.attributeKey;\r\n    return key === 'headingRows' || key === 'colspan' || key === 'rowspan';\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * Injects a table cell post-fixer into the model which inserts a `paragraph` element into empty table cells.\r\n *\r\n * A table cell must contain at least one block element as a child. An empty table cell will have an empty `paragraph` as a child.\r\n *\r\n * ```xml\r\n * <table>\r\n *   <tableRow>\r\n *      <tableCell></tableCell>\r\n *   </tableRow>\r\n * </table>\r\n * ```\r\n *\r\n * Will be fixed to:\r\n *\r\n * ```xml\r\n * <table>\r\n *   <tableRow>\r\n *      <tableCell><paragraph></paragraph></tableCell>\r\n *   </tableRow>\r\n * </table>\r\n * ```\r\n */\r\nexport default function injectTableCellParagraphPostFixer(model) {\r\n    model.document.registerPostFixer(writer => tableCellContentsPostFixer(writer, model));\r\n}\r\n/**\r\n * The table cell contents post-fixer.\r\n */\r\nfunction tableCellContentsPostFixer(writer, model) {\r\n    const changes = model.document.differ.getChanges();\r\n    let wasFixed = false;\r\n    for (const entry of changes) {\r\n        if (entry.type == 'insert' && entry.name == 'table') {\r\n            wasFixed = fixTable(entry.position.nodeAfter, writer) || wasFixed;\r\n        }\r\n        if (entry.type == 'insert' && entry.name == 'tableRow') {\r\n            wasFixed = fixTableRow(entry.position.nodeAfter, writer) || wasFixed;\r\n        }\r\n        if (entry.type == 'insert' && entry.name == 'tableCell') {\r\n            wasFixed = fixTableCellContent(entry.position.nodeAfter, writer) || wasFixed;\r\n        }\r\n        if ((entry.type == 'remove' || entry.type == 'insert') && checkTableCellChange(entry)) {\r\n            wasFixed = fixTableCellContent(entry.position.parent, writer) || wasFixed;\r\n        }\r\n    }\r\n    return wasFixed;\r\n}\r\n/**\r\n * Fixes all table cells in a table.\r\n */\r\nfunction fixTable(table, writer) {\r\n    let wasFixed = false;\r\n    for (const row of table.getChildren()) {\r\n        if (row.is('element', 'tableRow')) {\r\n            wasFixed = fixTableRow(row, writer) || wasFixed;\r\n        }\r\n    }\r\n    return wasFixed;\r\n}\r\n/**\r\n * Fixes all table cells in a table row.\r\n */\r\nfunction fixTableRow(tableRow, writer) {\r\n    let wasFixed = false;\r\n    for (const tableCell of tableRow.getChildren()) {\r\n        wasFixed = fixTableCellContent(tableCell, writer) || wasFixed;\r\n    }\r\n    return wasFixed;\r\n}\r\n/**\r\n * Fixes all table cell content by:\r\n * - Adding a paragraph to a table cell without any child.\r\n * - Wrapping direct $text in a `<paragraph>`.\r\n */\r\nfunction fixTableCellContent(tableCell, writer) {\r\n    // Insert paragraph to an empty table cell.\r\n    if (tableCell.childCount == 0) {\r\n        // @if CK_DEBUG_TABLE // console.log( 'Post-fixing table: insert paragraph in empty cell.' );\r\n        writer.insertElement('paragraph', tableCell);\r\n        return true;\r\n    }\r\n    // Check table cell children for directly placed text nodes.\r\n    // Temporary solution. See https://github.com/ckeditor/ckeditor5/issues/1464.\r\n    const textNodes = Array.from(tableCell.getChildren()).filter(child => child.is('$text'));\r\n    // @if CK_DEBUG_TABLE // textNodes.length && console.log( 'Post-fixing table: wrap cell content with paragraph.' );\r\n    for (const child of textNodes) {\r\n        writer.wrap(writer.createRangeOn(child), 'paragraph');\r\n    }\r\n    // Return true when there were text nodes to fix.\r\n    return !!textNodes.length;\r\n}\r\n/**\r\n * Checks if a differ change should fix the table cell. This happens on:\r\n * - Removing content from the table cell (i.e. `tableCell` can be left empty).\r\n * - Adding a text node directly into a table cell.\r\n */\r\nfunction checkTableCellChange(entry) {\r\n    if (!entry.position.parent.is('element', 'tableCell')) {\r\n        return false;\r\n    }\r\n    return entry.type == 'insert' && entry.name == '$text' || entry.type == 'remove';\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { isSingleParagraphWithoutAttributes } from './downcast';\r\n/**\r\n * A table cell refresh handler which marks the table cell in the differ to have it re-rendered.\r\n *\r\n * Model `paragraph` inside a table cell can be rendered as `<span>` or `<p>`. It is rendered as `<span>` if this is the only block\r\n * element in that table cell and it does not have any attributes. It is rendered as `<p>` otherwise.\r\n *\r\n * When table cell content changes, for example a second `paragraph` element is added, we need to ensure that the first `paragraph` is\r\n * re-rendered so it changes from `<span>` to `<p>`. The easiest way to do it is to re-render the entire table cell.\r\n */\r\nexport default function tableCellRefreshHandler(model, editing) {\r\n    const differ = model.document.differ;\r\n    // Stores cells to be refreshed, so the table cell will be refreshed once for multiple changes.\r\n    const cellsToCheck = new Set();\r\n    for (const change of differ.getChanges()) {\r\n        const parent = change.type == 'attribute' ? change.range.start.parent : change.position.parent;\r\n        if (parent.is('element', 'tableCell')) {\r\n            cellsToCheck.add(parent);\r\n        }\r\n    }\r\n    for (const tableCell of cellsToCheck.values()) {\r\n        const paragraphsToRefresh = Array.from(tableCell.getChildren())\r\n            .filter(child => shouldRefresh(child, editing.mapper));\r\n        for (const paragraph of paragraphsToRefresh) {\r\n            editing.reconvertItem(paragraph);\r\n        }\r\n    }\r\n}\r\n/**\r\n * Check if given model element needs refreshing.\r\n */\r\nfunction shouldRefresh(child, mapper) {\r\n    if (!child.is('element', 'paragraph')) {\r\n        return false;\r\n    }\r\n    const viewElement = mapper.toViewElement(child);\r\n    if (!viewElement) {\r\n        return false;\r\n    }\r\n    return isSingleParagraphWithoutAttributes(child) !== viewElement.is('element', 'span');\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./tableediting.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/tableediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport upcastTable, { ensureParagraphInTableCell, skipEmptyTableRow, upcastTableFigure } from './converters/upcasttable';\r\nimport { convertParagraphInTableCell, downcastCell, downcastRow, downcastTable } from './converters/downcast';\r\nimport InsertTableCommand from './commands/inserttablecommand';\r\nimport InsertRowCommand from './commands/insertrowcommand';\r\nimport InsertColumnCommand from './commands/insertcolumncommand';\r\nimport SplitCellCommand from './commands/splitcellcommand';\r\nimport MergeCellCommand from './commands/mergecellcommand';\r\nimport RemoveRowCommand from './commands/removerowcommand';\r\nimport RemoveColumnCommand from './commands/removecolumncommand';\r\nimport SetHeaderRowCommand from './commands/setheaderrowcommand';\r\nimport SetHeaderColumnCommand from './commands/setheadercolumncommand';\r\nimport MergeCellsCommand from './commands/mergecellscommand';\r\nimport SelectRowCommand from './commands/selectrowcommand';\r\nimport SelectColumnCommand from './commands/selectcolumncommand';\r\nimport TableUtils from '../src/tableutils';\r\nimport injectTableLayoutPostFixer from './converters/table-layout-post-fixer';\r\nimport injectTableCellParagraphPostFixer from './converters/table-cell-paragraph-post-fixer';\r\nimport tableHeadingsRefreshHandler from './converters/table-headings-refresh-handler';\r\nimport tableCellRefreshHandler from './converters/table-cell-refresh-handler';\r\nimport '../theme/tableediting.css';\r\n/**\r\n * The table editing feature.\r\n */\r\nexport default class TableEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'TableEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [TableUtils];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        this._additionalSlots = [];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const schema = model.schema;\r\n        const conversion = editor.conversion;\r\n        const tableUtils = editor.plugins.get(TableUtils);\r\n        schema.register('table', {\r\n            inheritAllFrom: '$blockObject',\r\n            allowAttributes: ['headingRows', 'headingColumns']\r\n        });\r\n        schema.register('tableRow', {\r\n            allowIn: 'table',\r\n            isLimit: true\r\n        });\r\n        schema.register('tableCell', {\r\n            allowContentOf: '$container',\r\n            allowIn: 'tableRow',\r\n            allowAttributes: ['colspan', 'rowspan'],\r\n            isLimit: true,\r\n            isSelectable: true\r\n        });\r\n        // Figure conversion.\r\n        conversion.for('upcast').add(upcastTableFigure());\r\n        // Table conversion.\r\n        conversion.for('upcast').add(upcastTable());\r\n        conversion.for('editingDowncast').elementToStructure({\r\n            model: {\r\n                name: 'table',\r\n                attributes: ['headingRows']\r\n            },\r\n            view: downcastTable(tableUtils, {\r\n                asWidget: true,\r\n                additionalSlots: this._additionalSlots\r\n            })\r\n        });\r\n        conversion.for('dataDowncast').elementToStructure({\r\n            model: {\r\n                name: 'table',\r\n                attributes: ['headingRows']\r\n            },\r\n            view: downcastTable(tableUtils, {\r\n                additionalSlots: this._additionalSlots\r\n            })\r\n        });\r\n        // Table row conversion.\r\n        conversion.for('upcast').elementToElement({ model: 'tableRow', view: 'tr' });\r\n        conversion.for('upcast').add(skipEmptyTableRow());\r\n        conversion.for('downcast').elementToElement({\r\n            model: 'tableRow',\r\n            view: downcastRow()\r\n        });\r\n        // Table cell conversion.\r\n        conversion.for('upcast').elementToElement({ model: 'tableCell', view: 'td' });\r\n        conversion.for('upcast').elementToElement({ model: 'tableCell', view: 'th' });\r\n        conversion.for('upcast').add(ensureParagraphInTableCell('td'));\r\n        conversion.for('upcast').add(ensureParagraphInTableCell('th'));\r\n        conversion.for('editingDowncast').elementToElement({\r\n            model: 'tableCell',\r\n            view: downcastCell({ asWidget: true })\r\n        });\r\n        conversion.for('dataDowncast').elementToElement({\r\n            model: 'tableCell',\r\n            view: downcastCell()\r\n        });\r\n        // Duplicates code - needed to properly refresh paragraph inside a table cell.\r\n        conversion.for('editingDowncast').elementToElement({\r\n            model: 'paragraph',\r\n            view: convertParagraphInTableCell({ asWidget: true }),\r\n            converterPriority: 'high'\r\n        });\r\n        conversion.for('dataDowncast').elementToElement({\r\n            model: 'paragraph',\r\n            view: convertParagraphInTableCell(),\r\n            converterPriority: 'high'\r\n        });\r\n        // Table attributes conversion.\r\n        conversion.for('downcast').attributeToAttribute({ model: 'colspan', view: 'colspan' });\r\n        conversion.for('upcast').attributeToAttribute({\r\n            model: { key: 'colspan', value: upcastCellSpan('colspan') },\r\n            view: 'colspan'\r\n        });\r\n        conversion.for('downcast').attributeToAttribute({ model: 'rowspan', view: 'rowspan' });\r\n        conversion.for('upcast').attributeToAttribute({\r\n            model: { key: 'rowspan', value: upcastCellSpan('rowspan') },\r\n            view: 'rowspan'\r\n        });\r\n        // Define the config.\r\n        editor.config.define('table.defaultHeadings.rows', 0);\r\n        editor.config.define('table.defaultHeadings.columns', 0);\r\n        // Define all the commands.\r\n        editor.commands.add('insertTable', new InsertTableCommand(editor));\r\n        editor.commands.add('insertTableRowAbove', new InsertRowCommand(editor, { order: 'above' }));\r\n        editor.commands.add('insertTableRowBelow', new InsertRowCommand(editor, { order: 'below' }));\r\n        editor.commands.add('insertTableColumnLeft', new InsertColumnCommand(editor, { order: 'left' }));\r\n        editor.commands.add('insertTableColumnRight', new InsertColumnCommand(editor, { order: 'right' }));\r\n        editor.commands.add('removeTableRow', new RemoveRowCommand(editor));\r\n        editor.commands.add('removeTableColumn', new RemoveColumnCommand(editor));\r\n        editor.commands.add('splitTableCellVertically', new SplitCellCommand(editor, { direction: 'vertically' }));\r\n        editor.commands.add('splitTableCellHorizontally', new SplitCellCommand(editor, { direction: 'horizontally' }));\r\n        editor.commands.add('mergeTableCells', new MergeCellsCommand(editor));\r\n        editor.commands.add('mergeTableCellRight', new MergeCellCommand(editor, { direction: 'right' }));\r\n        editor.commands.add('mergeTableCellLeft', new MergeCellCommand(editor, { direction: 'left' }));\r\n        editor.commands.add('mergeTableCellDown', new MergeCellCommand(editor, { direction: 'down' }));\r\n        editor.commands.add('mergeTableCellUp', new MergeCellCommand(editor, { direction: 'up' }));\r\n        editor.commands.add('setTableColumnHeader', new SetHeaderColumnCommand(editor));\r\n        editor.commands.add('setTableRowHeader', new SetHeaderRowCommand(editor));\r\n        editor.commands.add('selectTableRow', new SelectRowCommand(editor));\r\n        editor.commands.add('selectTableColumn', new SelectColumnCommand(editor));\r\n        injectTableLayoutPostFixer(model);\r\n        injectTableCellParagraphPostFixer(model);\r\n        this.listenTo(model.document, 'change:data', () => {\r\n            tableHeadingsRefreshHandler(model, editor.editing);\r\n            tableCellRefreshHandler(model, editor.editing);\r\n        });\r\n    }\r\n    /**\r\n     * Registers downcast handler for the additional table slot.\r\n     */\r\n    registerAdditionalSlot(slotHandler) {\r\n        this._additionalSlots.push(slotHandler);\r\n    }\r\n}\r\n/**\r\n * Returns fixed colspan and rowspan attrbutes values.\r\n *\r\n * @param type colspan or rowspan.\r\n * @returns conversion value function.\r\n */\r\nfunction upcastCellSpan(type) {\r\n    return (cell) => {\r\n        const span = parseInt(cell.getAttribute(type));\r\n        if (Number.isNaN(span) || span <= 0) {\r\n            return null;\r\n        }\r\n        return span;\r\n    };\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport TableWalker from '../tablewalker';\r\n/**\r\n * A table headings refresh handler which marks the table cells or rows in the differ to have it re-rendered\r\n * if the headings attribute changed.\r\n *\r\n * Table heading rows and heading columns are represented in the model by a `headingRows` and `headingColumns` attributes.\r\n *\r\n * When table headings attribute changes, all the cells/rows are marked to re-render to change between `<td>` and `<th>`.\r\n */\r\nexport default function tableHeadingsRefreshHandler(model, editing) {\r\n    const differ = model.document.differ;\r\n    for (const change of differ.getChanges()) {\r\n        let table;\r\n        let isRowChange = false;\r\n        if (change.type == 'attribute') {\r\n            const element = change.range.start.nodeAfter;\r\n            if (!element || !element.is('element', 'table')) {\r\n                continue;\r\n            }\r\n            if (change.attributeKey != 'headingRows' && change.attributeKey != 'headingColumns') {\r\n                continue;\r\n            }\r\n            table = element;\r\n            isRowChange = change.attributeKey == 'headingRows';\r\n        }\r\n        else if (change.name == 'tableRow' || change.name == 'tableCell') {\r\n            table = change.position.findAncestor('table');\r\n            isRowChange = change.name == 'tableRow';\r\n        }\r\n        if (!table) {\r\n            continue;\r\n        }\r\n        const headingRows = table.getAttribute('headingRows') || 0;\r\n        const headingColumns = table.getAttribute('headingColumns') || 0;\r\n        const tableWalker = new TableWalker(table);\r\n        for (const tableSlot of tableWalker) {\r\n            const isHeading = tableSlot.row < headingRows || tableSlot.column < headingColumns;\r\n            const expectedElementName = isHeading ? 'th' : 'td';\r\n            const viewElement = editing.mapper.toViewElement(tableSlot.cell);\r\n            if (viewElement && viewElement.is('element') && viewElement.name != expectedElementName) {\r\n                editing.reconvertItem((isRowChange ? tableSlot.cell.parent : tableSlot.cell));\r\n            }\r\n        }\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./inserttable.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/ui/inserttableview\r\n */\r\nimport { View, ButtonView, addKeyboardHandlingForGrid } from 'ckeditor5/src/ui';\r\nimport { KeystrokeHandler, FocusTracker } from 'ckeditor5/src/utils';\r\nimport './../../theme/inserttable.css';\r\n/**\r\n * The table size view.\r\n *\r\n * It renders a 10x10 grid to choose the inserted table size.\r\n */\r\nexport default class InsertTableView extends View {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(locale) {\r\n        super(locale);\r\n        const bind = this.bindTemplate;\r\n        this.items = this._createGridCollection();\r\n        this.keystrokes = new KeystrokeHandler();\r\n        this.focusTracker = new FocusTracker();\r\n        this.set('rows', 0);\r\n        this.set('columns', 0);\r\n        this.bind('label').to(this, 'columns', this, 'rows', (columns, rows) => `${rows} × ${columns}`);\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: ['ck']\r\n            },\r\n            children: [\r\n                {\r\n                    tag: 'div',\r\n                    attributes: {\r\n                        class: ['ck-insert-table-dropdown__grid']\r\n                    },\r\n                    on: {\r\n                        'mouseover@.ck-insert-table-dropdown-grid-box': bind.to('boxover')\r\n                    },\r\n                    children: this.items\r\n                },\r\n                {\r\n                    tag: 'div',\r\n                    attributes: {\r\n                        class: [\r\n                            'ck',\r\n                            'ck-insert-table-dropdown__label'\r\n                        ],\r\n                        'aria-hidden': true\r\n                    },\r\n                    children: [\r\n                        {\r\n                            text: bind.to('label')\r\n                        }\r\n                    ]\r\n                }\r\n            ],\r\n            on: {\r\n                mousedown: bind.to(evt => {\r\n                    evt.preventDefault();\r\n                }),\r\n                click: bind.to(() => {\r\n                    this.fire('execute');\r\n                })\r\n            }\r\n        });\r\n        // #rows and #columns are set via changes to #focusTracker on mouse over.\r\n        this.on('boxover', (evt, domEvt) => {\r\n            const { row, column } = domEvt.target.dataset;\r\n            this.items.get((parseInt(row, 10) - 1) * 10 + (parseInt(column, 10) - 1)).focus();\r\n        });\r\n        // This allows the #rows and #columns to be updated when:\r\n        // * the user navigates the grid using the keyboard,\r\n        // * the user moves the mouse over grid items.\r\n        this.focusTracker.on('change:focusedElement', (evt, name, focusedElement) => {\r\n            if (!focusedElement) {\r\n                return;\r\n            }\r\n            const { row, column } = focusedElement.dataset;\r\n            // As row & column indexes are zero-based transform it to number of selected rows & columns.\r\n            this.set({\r\n                rows: parseInt(row),\r\n                columns: parseInt(column)\r\n            });\r\n        });\r\n        this.on('change:columns', () => this._highlightGridBoxes());\r\n        this.on('change:rows', () => this._highlightGridBoxes());\r\n    }\r\n    render() {\r\n        super.render();\r\n        addKeyboardHandlingForGrid({\r\n            keystrokeHandler: this.keystrokes,\r\n            focusTracker: this.focusTracker,\r\n            gridItems: this.items,\r\n            numberOfColumns: 10,\r\n            uiLanguageDirection: this.locale && this.locale.uiLanguageDirection\r\n        });\r\n        for (const item of this.items) {\r\n            this.focusTracker.add(item.element);\r\n        }\r\n        this.keystrokes.listenTo(this.element);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    focus() {\r\n        this.items.get(0).focus();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    focusLast() {\r\n        this.items.get(0).focus();\r\n    }\r\n    /**\r\n     * Highlights grid boxes depending on rows and columns selected.\r\n     */\r\n    _highlightGridBoxes() {\r\n        const rows = this.rows;\r\n        const columns = this.columns;\r\n        this.items.map((boxView, index) => {\r\n            // Translate box index to the row & column index.\r\n            const itemRow = Math.floor(index / 10);\r\n            const itemColumn = index % 10;\r\n            // Grid box is highlighted when its row & column index belongs to selected number of rows & columns.\r\n            const isOn = itemRow < rows && itemColumn < columns;\r\n            boxView.set('isOn', isOn);\r\n        });\r\n    }\r\n    /**\r\n     * Creates a new Button for the grid.\r\n     *\r\n     * @param locale The locale instance.\r\n     * @param row Row number.\r\n     * @param column Column number.\r\n     * @param label The grid button label.\r\n     */\r\n    _createGridButton(locale, row, column, label) {\r\n        const button = new ButtonView(locale);\r\n        button.set({\r\n            label,\r\n            class: 'ck-insert-table-dropdown-grid-box'\r\n        });\r\n        button.extendTemplate({\r\n            attributes: {\r\n                'data-row': row,\r\n                'data-column': column\r\n            }\r\n        });\r\n        return button;\r\n    }\r\n    /**\r\n     * @returns A view collection containing boxes to be placed in a table grid.\r\n     */\r\n    _createGridCollection() {\r\n        const boxes = [];\r\n        // Add grid boxes to table selection view.\r\n        for (let index = 0; index < 100; index++) {\r\n            const row = Math.floor(index / 10);\r\n            const column = index % 10;\r\n            const label = `${row + 1} × ${column + 1}`;\r\n            boxes.push(this._createGridButton(this.locale, row + 1, column + 1, label));\r\n        }\r\n        return this.createCollection(boxes);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/tableui\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { addListToDropdown, createDropdown, Model, SplitButtonView, SwitchButtonView } from 'ckeditor5/src/ui';\r\nimport { Collection } from 'ckeditor5/src/utils';\r\nimport InsertTableView from './ui/inserttableview';\r\nimport tableIcon from './../theme/icons/table.svg';\r\nimport tableColumnIcon from './../theme/icons/table-column.svg';\r\nimport tableRowIcon from './../theme/icons/table-row.svg';\r\nimport tableMergeCellIcon from './../theme/icons/table-merge-cell.svg';\r\n/**\r\n * The table UI plugin. It introduces:\r\n *\r\n * * The `'insertTable'` dropdown,\r\n * * The `'tableColumn'` dropdown,\r\n * * The `'tableRow'` dropdown,\r\n * * The `'mergeTableCells'` split button.\r\n *\r\n * The `'tableColumn'`, `'tableRow'` and `'mergeTableCells'` dropdowns work best with {@link module:table/tabletoolbar~TableToolbar}.\r\n */\r\nexport default class TableUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'TableUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const t = this.editor.t;\r\n        const contentLanguageDirection = editor.locale.contentLanguageDirection;\r\n        const isContentLtr = contentLanguageDirection === 'ltr';\r\n        editor.ui.componentFactory.add('insertTable', locale => {\r\n            const command = editor.commands.get('insertTable');\r\n            const dropdownView = createDropdown(locale);\r\n            dropdownView.bind('isEnabled').to(command);\r\n            // Decorate dropdown's button.\r\n            dropdownView.buttonView.set({\r\n                icon: tableIcon,\r\n                label: t('Insert table'),\r\n                tooltip: true\r\n            });\r\n            let insertTableView;\r\n            dropdownView.on('change:isOpen', () => {\r\n                if (insertTableView) {\r\n                    return;\r\n                }\r\n                // Prepare custom view for dropdown's panel.\r\n                insertTableView = new InsertTableView(locale);\r\n                dropdownView.panelView.children.add(insertTableView);\r\n                insertTableView.delegate('execute').to(dropdownView);\r\n                dropdownView.on('execute', () => {\r\n                    editor.execute('insertTable', { rows: insertTableView.rows, columns: insertTableView.columns });\r\n                    editor.editing.view.focus();\r\n                });\r\n            });\r\n            return dropdownView;\r\n        });\r\n        editor.ui.componentFactory.add('tableColumn', locale => {\r\n            const options = [\r\n                {\r\n                    type: 'switchbutton',\r\n                    model: {\r\n                        commandName: 'setTableColumnHeader',\r\n                        label: t('Header column'),\r\n                        bindIsOn: true\r\n                    }\r\n                },\r\n                { type: 'separator' },\r\n                {\r\n                    type: 'button',\r\n                    model: {\r\n                        commandName: isContentLtr ? 'insertTableColumnLeft' : 'insertTableColumnRight',\r\n                        label: t('Insert column left')\r\n                    }\r\n                },\r\n                {\r\n                    type: 'button',\r\n                    model: {\r\n                        commandName: isContentLtr ? 'insertTableColumnRight' : 'insertTableColumnLeft',\r\n                        label: t('Insert column right')\r\n                    }\r\n                },\r\n                {\r\n                    type: 'button',\r\n                    model: {\r\n                        commandName: 'removeTableColumn',\r\n                        label: t('Delete column')\r\n                    }\r\n                },\r\n                {\r\n                    type: 'button',\r\n                    model: {\r\n                        commandName: 'selectTableColumn',\r\n                        label: t('Select column')\r\n                    }\r\n                }\r\n            ];\r\n            return this._prepareDropdown(t('Column'), tableColumnIcon, options, locale);\r\n        });\r\n        editor.ui.componentFactory.add('tableRow', locale => {\r\n            const options = [\r\n                {\r\n                    type: 'switchbutton',\r\n                    model: {\r\n                        commandName: 'setTableRowHeader',\r\n                        label: t('Header row'),\r\n                        bindIsOn: true\r\n                    }\r\n                },\r\n                { type: 'separator' },\r\n                {\r\n                    type: 'button',\r\n                    model: {\r\n                        commandName: 'insertTableRowAbove',\r\n                        label: t('Insert row above')\r\n                    }\r\n                },\r\n                {\r\n                    type: 'button',\r\n                    model: {\r\n                        commandName: 'insertTableRowBelow',\r\n                        label: t('Insert row below')\r\n                    }\r\n                },\r\n                {\r\n                    type: 'button',\r\n                    model: {\r\n                        commandName: 'removeTableRow',\r\n                        label: t('Delete row')\r\n                    }\r\n                },\r\n                {\r\n                    type: 'button',\r\n                    model: {\r\n                        commandName: 'selectTableRow',\r\n                        label: t('Select row')\r\n                    }\r\n                }\r\n            ];\r\n            return this._prepareDropdown(t('Row'), tableRowIcon, options, locale);\r\n        });\r\n        editor.ui.componentFactory.add('mergeTableCells', locale => {\r\n            const options = [\r\n                {\r\n                    type: 'button',\r\n                    model: {\r\n                        commandName: 'mergeTableCellUp',\r\n                        label: t('Merge cell up')\r\n                    }\r\n                },\r\n                {\r\n                    type: 'button',\r\n                    model: {\r\n                        commandName: isContentLtr ? 'mergeTableCellRight' : 'mergeTableCellLeft',\r\n                        label: t('Merge cell right')\r\n                    }\r\n                },\r\n                {\r\n                    type: 'button',\r\n                    model: {\r\n                        commandName: 'mergeTableCellDown',\r\n                        label: t('Merge cell down')\r\n                    }\r\n                },\r\n                {\r\n                    type: 'button',\r\n                    model: {\r\n                        commandName: isContentLtr ? 'mergeTableCellLeft' : 'mergeTableCellRight',\r\n                        label: t('Merge cell left')\r\n                    }\r\n                },\r\n                { type: 'separator' },\r\n                {\r\n                    type: 'button',\r\n                    model: {\r\n                        commandName: 'splitTableCellVertically',\r\n                        label: t('Split cell vertically')\r\n                    }\r\n                },\r\n                {\r\n                    type: 'button',\r\n                    model: {\r\n                        commandName: 'splitTableCellHorizontally',\r\n                        label: t('Split cell horizontally')\r\n                    }\r\n                }\r\n            ];\r\n            return this._prepareMergeSplitButtonDropdown(t('Merge cells'), tableMergeCellIcon, options, locale);\r\n        });\r\n    }\r\n    /**\r\n     * Creates a dropdown view from a set of options.\r\n     *\r\n     * @param label The dropdown button label.\r\n     * @param icon An icon for the dropdown button.\r\n     * @param options The list of options for the dropdown.\r\n     */\r\n    _prepareDropdown(label, icon, options, locale) {\r\n        const editor = this.editor;\r\n        const dropdownView = createDropdown(locale);\r\n        const commands = this._fillDropdownWithListOptions(dropdownView, options);\r\n        // Decorate dropdown's button.\r\n        dropdownView.buttonView.set({\r\n            label,\r\n            icon,\r\n            tooltip: true\r\n        });\r\n        // Make dropdown button disabled when all options are disabled.\r\n        dropdownView.bind('isEnabled').toMany(commands, 'isEnabled', (...areEnabled) => {\r\n            return areEnabled.some(isEnabled => isEnabled);\r\n        });\r\n        this.listenTo(dropdownView, 'execute', evt => {\r\n            editor.execute(evt.source.commandName);\r\n            // Toggling a switch button view should not move the focus to the editable.\r\n            if (!(evt.source instanceof SwitchButtonView)) {\r\n                editor.editing.view.focus();\r\n            }\r\n        });\r\n        return dropdownView;\r\n    }\r\n    /**\r\n     * Creates a dropdown view with a {@link module:ui/dropdown/button/splitbuttonview~SplitButtonView} for\r\n     * merge (and split)–related commands.\r\n     *\r\n     * @param label The dropdown button label.\r\n     * @param icon An icon for the dropdown button.\r\n     * @param options The list of options for the dropdown.\r\n     */\r\n    _prepareMergeSplitButtonDropdown(label, icon, options, locale) {\r\n        const editor = this.editor;\r\n        const dropdownView = createDropdown(locale, SplitButtonView);\r\n        const mergeCommandName = 'mergeTableCells';\r\n        // Main command.\r\n        const mergeCommand = editor.commands.get(mergeCommandName);\r\n        // Subcommands in the dropdown.\r\n        const commands = this._fillDropdownWithListOptions(dropdownView, options);\r\n        dropdownView.buttonView.set({\r\n            label,\r\n            icon,\r\n            tooltip: true,\r\n            isEnabled: true\r\n        });\r\n        // Make dropdown button disabled when all options are disabled together with the main command.\r\n        dropdownView.bind('isEnabled').toMany([mergeCommand, ...commands], 'isEnabled', (...areEnabled) => {\r\n            return areEnabled.some(isEnabled => isEnabled);\r\n        });\r\n        // Merge selected table cells when the main part of the split button is clicked.\r\n        this.listenTo(dropdownView.buttonView, 'execute', () => {\r\n            editor.execute(mergeCommandName);\r\n            editor.editing.view.focus();\r\n        });\r\n        // Execute commands for events coming from the list in the dropdown panel.\r\n        this.listenTo(dropdownView, 'execute', evt => {\r\n            editor.execute(evt.source.commandName);\r\n            editor.editing.view.focus();\r\n        });\r\n        return dropdownView;\r\n    }\r\n    /**\r\n     * Injects a {@link module:ui/list/listview~ListView} into the passed dropdown with buttons\r\n     * which execute editor commands as configured in passed options.\r\n     *\r\n     * @param options The list of options for the dropdown.\r\n     * @returns Commands the list options are interacting with.\r\n     */\r\n    _fillDropdownWithListOptions(dropdownView, options) {\r\n        const editor = this.editor;\r\n        const commands = [];\r\n        const itemDefinitions = new Collection();\r\n        for (const option of options) {\r\n            addListOption(option, editor, commands, itemDefinitions);\r\n        }\r\n        addListToDropdown(dropdownView, itemDefinitions);\r\n        return commands;\r\n    }\r\n}\r\n/**\r\n * Adds an option to a list view.\r\n *\r\n * @param option A configuration option.\r\n * @param commands The list of commands to update.\r\n * @param itemDefinitions A collection of dropdown items to update with the given option.\r\n */\r\nfunction addListOption(option, editor, commands, itemDefinitions) {\r\n    if (option.type === 'button' || option.type === 'switchbutton') {\r\n        const model = option.model = new Model(option.model);\r\n        const { commandName, bindIsOn } = option.model;\r\n        const command = editor.commands.get(commandName);\r\n        commands.push(command);\r\n        model.set({ commandName });\r\n        model.bind('isEnabled').to(command);\r\n        if (bindIsOn) {\r\n            model.bind('isOn').to(command, 'value');\r\n        }\r\n        model.set({\r\n            withText: true\r\n        });\r\n    }\r\n    itemDefinitions.add(option);\r\n}\r\n","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","export default \"<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>\";","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./tableselection.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/tableselection\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { first } from 'ckeditor5/src/utils';\r\nimport TableWalker from './tablewalker';\r\nimport TableUtils from './tableutils';\r\nimport { cropTableToDimensions, adjustLastRowIndex, adjustLastColumnIndex } from './utils/structure';\r\nimport '../theme/tableselection.css';\r\n/**\r\n * This plugin enables the advanced table cells, rows and columns selection.\r\n * It is loaded automatically by the {@link module:table/table~Table} plugin.\r\n */\r\nexport default class TableSelection extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'TableSelection';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [TableUtils, TableUtils];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        const view = editor.editing.view;\r\n        this.listenTo(model, 'deleteContent', (evt, args) => this._handleDeleteContent(evt, args), { priority: 'high' });\r\n        this.listenTo(view.document, 'insertText', (evt, data) => this._handleInsertTextEvent(evt, data), { priority: 'high' });\r\n        this._defineSelectionConverter();\r\n        this._enablePluginDisabling(); // sic!\r\n    }\r\n    /**\r\n     * Returns the currently selected table cells or `null` if it is not a table cells selection.\r\n     */\r\n    getSelectedTableCells() {\r\n        const tableUtils = this.editor.plugins.get(TableUtils);\r\n        const selection = this.editor.model.document.selection;\r\n        const selectedCells = tableUtils.getSelectedTableCells(selection);\r\n        if (selectedCells.length == 0) {\r\n            return null;\r\n        }\r\n        // This should never happen, but let's know if it ever happens.\r\n        // @if CK_DEBUG //\tif ( selectedCells.length != selection.rangeCount ) {\r\n        // @if CK_DEBUG //\t\tconsole.warn( 'Mixed selection warning. The selection contains table cells and some other ranges.' );\r\n        // @if CK_DEBUG //\t}\r\n        return selectedCells;\r\n    }\r\n    /**\r\n     * Returns the selected table fragment as a document fragment.\r\n     */\r\n    getSelectionAsFragment() {\r\n        const tableUtils = this.editor.plugins.get(TableUtils);\r\n        const selectedCells = this.getSelectedTableCells();\r\n        if (!selectedCells) {\r\n            return null;\r\n        }\r\n        return this.editor.model.change(writer => {\r\n            const documentFragment = writer.createDocumentFragment();\r\n            const { first: firstColumn, last: lastColumn } = tableUtils.getColumnIndexes(selectedCells);\r\n            const { first: firstRow, last: lastRow } = tableUtils.getRowIndexes(selectedCells);\r\n            const sourceTable = selectedCells[0].findAncestor('table');\r\n            let adjustedLastRow = lastRow;\r\n            let adjustedLastColumn = lastColumn;\r\n            // If the selection is rectangular there could be a case of all cells in the last row/column spanned over\r\n            // next row/column so the real lastRow/lastColumn should be updated.\r\n            if (tableUtils.isSelectionRectangular(selectedCells)) {\r\n                const dimensions = {\r\n                    firstColumn,\r\n                    lastColumn,\r\n                    firstRow,\r\n                    lastRow\r\n                };\r\n                adjustedLastRow = adjustLastRowIndex(sourceTable, dimensions);\r\n                adjustedLastColumn = adjustLastColumnIndex(sourceTable, dimensions);\r\n            }\r\n            const cropDimensions = {\r\n                startRow: firstRow,\r\n                startColumn: firstColumn,\r\n                endRow: adjustedLastRow,\r\n                endColumn: adjustedLastColumn\r\n            };\r\n            const table = cropTableToDimensions(sourceTable, cropDimensions, writer);\r\n            writer.insert(table, documentFragment, 0);\r\n            return documentFragment;\r\n        });\r\n    }\r\n    /**\r\n     * Sets the model selection based on given anchor and target cells (can be the same cell).\r\n     * Takes care of setting the backward flag.\r\n     *\r\n     * ```ts\r\n     * const modelRoot = editor.model.document.getRoot();\r\n     * const firstCell = modelRoot.getNodeByPath( [ 0, 0, 0 ] );\r\n     * const lastCell = modelRoot.getNodeByPath( [ 0, 0, 1 ] );\r\n     *\r\n     * const tableSelection = editor.plugins.get( 'TableSelection' );\r\n     * tableSelection.setCellSelection( firstCell, lastCell );\r\n     * ```\r\n     */\r\n    setCellSelection(anchorCell, targetCell) {\r\n        const cellsToSelect = this._getCellsToSelect(anchorCell, targetCell);\r\n        this.editor.model.change(writer => {\r\n            writer.setSelection(cellsToSelect.cells.map(cell => writer.createRangeOn(cell)), { backward: cellsToSelect.backward });\r\n        });\r\n    }\r\n    /**\r\n     * Returns the focus cell from the current selection.\r\n     */\r\n    getFocusCell() {\r\n        const selection = this.editor.model.document.selection;\r\n        const focusCellRange = [...selection.getRanges()].pop();\r\n        const element = focusCellRange.getContainedElement();\r\n        if (element && element.is('element', 'tableCell')) {\r\n            return element;\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Returns the anchor cell from the current selection.\r\n     */\r\n    getAnchorCell() {\r\n        const selection = this.editor.model.document.selection;\r\n        const anchorCellRange = first(selection.getRanges());\r\n        const element = anchorCellRange.getContainedElement();\r\n        if (element && element.is('element', 'tableCell')) {\r\n            return element;\r\n        }\r\n        return null;\r\n    }\r\n    /**\r\n     * Defines a selection converter which marks the selected cells with a specific class.\r\n     *\r\n     * The real DOM selection is put in the last cell. Since the order of ranges is dependent on whether the\r\n     * selection is backward or not, the last cell will usually be close to the \"focus\" end of the selection\r\n     * (a selection has anchor and focus).\r\n     *\r\n     * The real DOM selection is then hidden with CSS.\r\n     */\r\n    _defineSelectionConverter() {\r\n        const editor = this.editor;\r\n        const highlighted = new Set();\r\n        editor.conversion.for('editingDowncast').add(dispatcher => dispatcher.on('selection', (evt, data, conversionApi) => {\r\n            const viewWriter = conversionApi.writer;\r\n            clearHighlightedTableCells(viewWriter);\r\n            const selectedCells = this.getSelectedTableCells();\r\n            if (!selectedCells) {\r\n                return;\r\n            }\r\n            for (const tableCell of selectedCells) {\r\n                const viewElement = conversionApi.mapper.toViewElement(tableCell);\r\n                viewWriter.addClass('ck-editor__editable_selected', viewElement);\r\n                highlighted.add(viewElement);\r\n            }\r\n            const lastViewCell = conversionApi.mapper.toViewElement(selectedCells[selectedCells.length - 1]);\r\n            viewWriter.setSelection(lastViewCell, 0);\r\n        }, { priority: 'lowest' }));\r\n        function clearHighlightedTableCells(viewWriter) {\r\n            for (const previouslyHighlighted of highlighted) {\r\n                viewWriter.removeClass('ck-editor__editable_selected', previouslyHighlighted);\r\n            }\r\n            highlighted.clear();\r\n        }\r\n    }\r\n    /**\r\n     * Creates a listener that reacts to changes in {@link #isEnabled} and, if the plugin was disabled,\r\n     * it collapses the multi-cell selection to a regular selection placed inside a table cell.\r\n     *\r\n     * This listener helps features that disable the table selection plugin bring the selection\r\n     * to a clear state they can work with (for instance, because they don't support multiple cell selection).\r\n     */\r\n    _enablePluginDisabling() {\r\n        const editor = this.editor;\r\n        this.on('change:isEnabled', () => {\r\n            if (!this.isEnabled) {\r\n                const selectedCells = this.getSelectedTableCells();\r\n                if (!selectedCells) {\r\n                    return;\r\n                }\r\n                editor.model.change(writer => {\r\n                    const position = writer.createPositionAt(selectedCells[0], 0);\r\n                    const range = editor.model.schema.getNearestSelectionRange(position);\r\n                    writer.setSelection(range);\r\n                });\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Overrides the default `model.deleteContent()` behavior over a selected table fragment.\r\n     *\r\n     * @param args Delete content method arguments.\r\n     */\r\n    _handleDeleteContent(event, args) {\r\n        const tableUtils = this.editor.plugins.get(TableUtils);\r\n        const selection = args[0];\r\n        const options = args[1];\r\n        const model = this.editor.model;\r\n        const isBackward = !options || options.direction == 'backward';\r\n        const selectedTableCells = tableUtils.getSelectedTableCells(selection);\r\n        if (!selectedTableCells.length) {\r\n            return;\r\n        }\r\n        event.stop();\r\n        model.change(writer => {\r\n            const tableCellToSelect = selectedTableCells[isBackward ? selectedTableCells.length - 1 : 0];\r\n            model.change(writer => {\r\n                for (const tableCell of selectedTableCells) {\r\n                    model.deleteContent(writer.createSelection(tableCell, 'in'));\r\n                }\r\n            });\r\n            const rangeToSelect = model.schema.getNearestSelectionRange(writer.createPositionAt(tableCellToSelect, 0));\r\n            // Note: we ignore the case where rangeToSelect may be null because deleteContent() will always (unless someone broke it)\r\n            // create an empty paragraph to accommodate the selection.\r\n            if (selection.is('documentSelection')) {\r\n                writer.setSelection(rangeToSelect);\r\n            }\r\n            else {\r\n                selection.setTo(rangeToSelect);\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * This handler makes it possible to remove the content of all selected cells by starting to type.\r\n     * If you take a look at {@link #_defineSelectionConverter} you will find out that despite the multi-cell selection being set\r\n     * in the model, the view selection is collapsed in the last cell (because most browsers are unable to render multi-cell selections;\r\n     * yes, it's a hack).\r\n     *\r\n     * When multiple cells are selected in the model and the user starts to type, the\r\n     * {@link module:engine/view/document~Document#event:insertText} event carries information provided by the\r\n     * beforeinput DOM  event, that in turn only knows about this collapsed DOM selection in the last cell.\r\n     *\r\n     * As a result, the selected cells have no chance to be cleaned up. To fix this, this listener intercepts\r\n     * the event and injects the custom view selection in the data that translates correctly to the actual state\r\n     * of the multi-cell selection in the model.\r\n     *\r\n     * @param data Insert text event data.\r\n     */\r\n    _handleInsertTextEvent(evt, data) {\r\n        const editor = this.editor;\r\n        const selectedCells = this.getSelectedTableCells();\r\n        if (!selectedCells) {\r\n            return;\r\n        }\r\n        const view = editor.editing.view;\r\n        const mapper = editor.editing.mapper;\r\n        const viewRanges = selectedCells.map(tableCell => view.createRangeOn(mapper.toViewElement(tableCell)));\r\n        data.selection = view.createSelection(viewRanges);\r\n    }\r\n    /**\r\n     * Returns an array of table cells that should be selected based on the\r\n     * given anchor cell and target (focus) cell.\r\n     *\r\n     * The cells are returned in a reverse direction if the selection is backward.\r\n     */\r\n    _getCellsToSelect(anchorCell, targetCell) {\r\n        const tableUtils = this.editor.plugins.get('TableUtils');\r\n        const startLocation = tableUtils.getCellLocation(anchorCell);\r\n        const endLocation = tableUtils.getCellLocation(targetCell);\r\n        const startRow = Math.min(startLocation.row, endLocation.row);\r\n        const endRow = Math.max(startLocation.row, endLocation.row);\r\n        const startColumn = Math.min(startLocation.column, endLocation.column);\r\n        const endColumn = Math.max(startLocation.column, endLocation.column);\r\n        // 2-dimensional array of the selected cells to ease flipping the order of cells for backward selections.\r\n        const selectionMap = new Array(endRow - startRow + 1).fill(null).map(() => []);\r\n        const walkerOptions = {\r\n            startRow,\r\n            endRow,\r\n            startColumn,\r\n            endColumn\r\n        };\r\n        for (const { row, cell } of new TableWalker(anchorCell.findAncestor('table'), walkerOptions)) {\r\n            selectionMap[row - startRow].push(cell);\r\n        }\r\n        const flipVertically = endLocation.row < startLocation.row;\r\n        const flipHorizontally = endLocation.column < startLocation.column;\r\n        if (flipVertically) {\r\n            selectionMap.reverse();\r\n        }\r\n        if (flipHorizontally) {\r\n            selectionMap.forEach(row => row.reverse());\r\n        }\r\n        return {\r\n            cells: selectionMap.flat(),\r\n            backward: flipVertically || flipHorizontally\r\n        };\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport TableSelection from './tableselection';\r\nimport TableWalker from './tablewalker';\r\nimport TableUtils from './tableutils';\r\nimport { cropTableToDimensions, getHorizontallyOverlappingCells, getVerticallyOverlappingCells, removeEmptyRowsColumns, splitHorizontally, splitVertically, trimTableCellIfNeeded, adjustLastRowIndex, adjustLastColumnIndex } from './utils/structure';\r\n/**\r\n * This plugin adds support for copying/cutting/pasting fragments of tables.\r\n * It is loaded automatically by the {@link module:table/table~Table} plugin.\r\n */\r\nexport default class TableClipboard extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'TableClipboard';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [TableSelection, TableUtils];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const viewDocument = editor.editing.view.document;\r\n        this.listenTo(viewDocument, 'copy', (evt, data) => this._onCopyCut(evt, data));\r\n        this.listenTo(viewDocument, 'cut', (evt, data) => this._onCopyCut(evt, data));\r\n        this.listenTo(editor.model, 'insertContent', (evt, [content, selectable]) => this._onInsertContent(evt, content, selectable), { priority: 'high' });\r\n        this.decorate('_replaceTableSlotCell');\r\n    }\r\n    /**\r\n     * Copies table content to a clipboard on \"copy\" & \"cut\" events.\r\n     *\r\n     * @param evt An object containing information about the handled event.\r\n     * @param data Clipboard event data.\r\n     */\r\n    _onCopyCut(evt, data) {\r\n        const tableSelection = this.editor.plugins.get(TableSelection);\r\n        if (!tableSelection.getSelectedTableCells()) {\r\n            return;\r\n        }\r\n        if (evt.name == 'cut' && !this.editor.model.canEditAt(this.editor.model.document.selection)) {\r\n            return;\r\n        }\r\n        data.preventDefault();\r\n        evt.stop();\r\n        const dataController = this.editor.data;\r\n        const viewDocument = this.editor.editing.view.document;\r\n        const content = dataController.toView(tableSelection.getSelectionAsFragment());\r\n        viewDocument.fire('clipboardOutput', {\r\n            dataTransfer: data.dataTransfer,\r\n            content,\r\n            method: evt.name\r\n        });\r\n    }\r\n    /**\r\n     * Overrides default {@link module:engine/model/model~Model#insertContent `model.insertContent()`} method to handle pasting table inside\r\n     * selected table fragment.\r\n     *\r\n     * Depending on selected table fragment:\r\n     * - If a selected table fragment is smaller than paste table it will crop pasted table to match dimensions.\r\n     * - If dimensions are equal it will replace selected table fragment with a pasted table contents.\r\n     *\r\n     * @param content The content to insert.\r\n     * @param selectable The selection into which the content should be inserted.\r\n     * If not provided the current model document selection will be used.\r\n     */\r\n    _onInsertContent(evt, content, selectable) {\r\n        if (selectable && !selectable.is('documentSelection')) {\r\n            return;\r\n        }\r\n        const model = this.editor.model;\r\n        const tableUtils = this.editor.plugins.get(TableUtils);\r\n        // We might need to crop table before inserting so reference might change.\r\n        let pastedTable = this.getTableIfOnlyTableInContent(content, model);\r\n        if (!pastedTable) {\r\n            return;\r\n        }\r\n        const selectedTableCells = tableUtils.getSelectionAffectedTableCells(model.document.selection);\r\n        if (!selectedTableCells.length) {\r\n            removeEmptyRowsColumns(pastedTable, tableUtils);\r\n            return;\r\n        }\r\n        // Override default model.insertContent() handling at this point.\r\n        evt.stop();\r\n        model.change(writer => {\r\n            const pastedDimensions = {\r\n                width: tableUtils.getColumns(pastedTable),\r\n                height: tableUtils.getRows(pastedTable)\r\n            };\r\n            // Prepare the table for pasting.\r\n            const selection = prepareTableForPasting(selectedTableCells, pastedDimensions, writer, tableUtils);\r\n            // Beyond this point we operate on a fixed content table with rectangular selection and proper last row/column values.\r\n            const selectionHeight = selection.lastRow - selection.firstRow + 1;\r\n            const selectionWidth = selection.lastColumn - selection.firstColumn + 1;\r\n            // Crop pasted table if:\r\n            // - Pasted table dimensions exceeds selection area.\r\n            // - Pasted table has broken layout (ie some cells sticks out by the table dimensions established by the first and last row).\r\n            //\r\n            // Note: The table dimensions are established by the width of the first row and the total number of rows.\r\n            // It is possible to programmatically create a table that has rows which would have cells anchored beyond first row width but\r\n            // such table will not be created by other editing solutions.\r\n            const cropDimensions = {\r\n                startRow: 0,\r\n                startColumn: 0,\r\n                endRow: Math.min(selectionHeight, pastedDimensions.height) - 1,\r\n                endColumn: Math.min(selectionWidth, pastedDimensions.width) - 1\r\n            };\r\n            pastedTable = cropTableToDimensions(pastedTable, cropDimensions, writer);\r\n            // Content table to which we insert a pasted table.\r\n            const selectedTable = selectedTableCells[0].findAncestor('table');\r\n            const cellsToSelect = this._replaceSelectedCellsWithPasted(pastedTable, pastedDimensions, selectedTable, selection, writer);\r\n            if (this.editor.plugins.get('TableSelection').isEnabled) {\r\n                // Selection ranges must be sorted because the first and last selection ranges are considered\r\n                // as anchor/focus cell ranges for multi-cell selection.\r\n                const selectionRanges = tableUtils.sortRanges(cellsToSelect.map(cell => writer.createRangeOn(cell)));\r\n                writer.setSelection(selectionRanges);\r\n            }\r\n            else {\r\n                // Set selection inside first cell if multi-cell selection is disabled.\r\n                writer.setSelection(cellsToSelect[0], 0);\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Replaces the part of selectedTable with pastedTable.\r\n     */\r\n    _replaceSelectedCellsWithPasted(pastedTable, pastedDimensions, selectedTable, selection, writer) {\r\n        const { width: pastedWidth, height: pastedHeight } = pastedDimensions;\r\n        // Holds two-dimensional array that is addressed by [ row ][ column ] that stores cells anchored at given location.\r\n        const pastedTableLocationMap = createLocationMap(pastedTable, pastedWidth, pastedHeight);\r\n        const selectedTableMap = [...new TableWalker(selectedTable, {\r\n                startRow: selection.firstRow,\r\n                endRow: selection.lastRow,\r\n                startColumn: selection.firstColumn,\r\n                endColumn: selection.lastColumn,\r\n                includeAllSlots: true\r\n            })];\r\n        // Selection must be set to pasted cells (some might be removed or new created).\r\n        const cellsToSelect = [];\r\n        // Store next cell insert position.\r\n        let insertPosition;\r\n        // Content table replace cells algorithm iterates over a selected table fragment and:\r\n        //\r\n        // - Removes existing table cells at current slot (location).\r\n        // - Inserts cell from a pasted table for a matched slots.\r\n        //\r\n        // This ensures proper table geometry after the paste\r\n        for (const tableSlot of selectedTableMap) {\r\n            const { row, column } = tableSlot;\r\n            // Save the insert position for current row start.\r\n            if (column === selection.firstColumn) {\r\n                insertPosition = tableSlot.getPositionBefore();\r\n            }\r\n            // Map current table slot location to an pasted table slot location.\r\n            const pastedRow = row - selection.firstRow;\r\n            const pastedColumn = column - selection.firstColumn;\r\n            const pastedCell = pastedTableLocationMap[pastedRow % pastedHeight][pastedColumn % pastedWidth];\r\n            // Clone cell to insert (to duplicate its attributes and children).\r\n            // Cloning is required to support repeating pasted table content when inserting to a bigger selection.\r\n            const cellToInsert = pastedCell ? writer.cloneElement(pastedCell) : null;\r\n            // Replace the cell from the current slot with new table cell.\r\n            const newTableCell = this._replaceTableSlotCell(tableSlot, cellToInsert, insertPosition, writer);\r\n            // The cell was only removed.\r\n            if (!newTableCell) {\r\n                continue;\r\n            }\r\n            // Trim the cell if it's row/col-spans would exceed selection area.\r\n            trimTableCellIfNeeded(newTableCell, row, column, selection.lastRow, selection.lastColumn, writer);\r\n            cellsToSelect.push(newTableCell);\r\n            insertPosition = writer.createPositionAfter(newTableCell);\r\n        }\r\n        // If there are any headings, all the cells that overlap from heading must be splitted.\r\n        const headingRows = parseInt(selectedTable.getAttribute('headingRows') || '0');\r\n        const headingColumns = parseInt(selectedTable.getAttribute('headingColumns') || '0');\r\n        const areHeadingRowsIntersectingSelection = selection.firstRow < headingRows && headingRows <= selection.lastRow;\r\n        const areHeadingColumnsIntersectingSelection = selection.firstColumn < headingColumns && headingColumns <= selection.lastColumn;\r\n        if (areHeadingRowsIntersectingSelection) {\r\n            const columnsLimit = { first: selection.firstColumn, last: selection.lastColumn };\r\n            const newCells = doHorizontalSplit(selectedTable, headingRows, columnsLimit, writer, selection.firstRow);\r\n            cellsToSelect.push(...newCells);\r\n        }\r\n        if (areHeadingColumnsIntersectingSelection) {\r\n            const rowsLimit = { first: selection.firstRow, last: selection.lastRow };\r\n            const newCells = doVerticalSplit(selectedTable, headingColumns, rowsLimit, writer);\r\n            cellsToSelect.push(...newCells);\r\n        }\r\n        return cellsToSelect;\r\n    }\r\n    /**\r\n     * Replaces a single table slot.\r\n     *\r\n     * @returns Inserted table cell or null if slot should remain empty.\r\n     * @private\r\n     */\r\n    _replaceTableSlotCell(tableSlot, cellToInsert, insertPosition, writer) {\r\n        const { cell, isAnchor } = tableSlot;\r\n        // If the slot is occupied by a cell in a selected table - remove it.\r\n        // The slot of this cell will be either:\r\n        // - Replaced by a pasted table cell.\r\n        // - Spanned by a previously pasted table cell.\r\n        if (isAnchor) {\r\n            writer.remove(cell);\r\n        }\r\n        // There is no cell to insert (might be spanned by other cell in a pasted table) - advance to the next content table slot.\r\n        if (!cellToInsert) {\r\n            return null;\r\n        }\r\n        writer.insert(cellToInsert, insertPosition);\r\n        return cellToInsert;\r\n    }\r\n    /**\r\n     * Extracts the table for pasting into a table.\r\n     *\r\n     * @param content The content to insert.\r\n     * @param model The editor model.\r\n     */\r\n    getTableIfOnlyTableInContent(content, model) {\r\n        if (!content.is('documentFragment') && !content.is('element')) {\r\n            return null;\r\n        }\r\n        // Table passed directly.\r\n        if (content.is('element', 'table')) {\r\n            return content;\r\n        }\r\n        // We do not support mixed content when pasting table into table.\r\n        // See: https://github.com/ckeditor/ckeditor5/issues/6817.\r\n        if (content.childCount == 1 && content.getChild(0).is('element', 'table')) {\r\n            return content.getChild(0);\r\n        }\r\n        // If there are only whitespaces around a table then use that table for pasting.\r\n        const contentRange = model.createRangeIn(content);\r\n        for (const element of contentRange.getItems()) {\r\n            if (element.is('element', 'table')) {\r\n                // Stop checking if there is some content before table.\r\n                const rangeBefore = model.createRange(contentRange.start, model.createPositionBefore(element));\r\n                if (model.hasContent(rangeBefore, { ignoreWhitespaces: true })) {\r\n                    return null;\r\n                }\r\n                // Stop checking if there is some content after table.\r\n                const rangeAfter = model.createRange(model.createPositionAfter(element), contentRange.end);\r\n                if (model.hasContent(rangeAfter, { ignoreWhitespaces: true })) {\r\n                    return null;\r\n                }\r\n                // There wasn't any content neither before nor after.\r\n                return element;\r\n            }\r\n        }\r\n        return null;\r\n    }\r\n}\r\n/**\r\n * Prepares a table for pasting and returns adjusted selection dimensions.\r\n */\r\nfunction prepareTableForPasting(selectedTableCells, pastedDimensions, writer, tableUtils) {\r\n    const selectedTable = selectedTableCells[0].findAncestor('table');\r\n    const columnIndexes = tableUtils.getColumnIndexes(selectedTableCells);\r\n    const rowIndexes = tableUtils.getRowIndexes(selectedTableCells);\r\n    const selection = {\r\n        firstColumn: columnIndexes.first,\r\n        lastColumn: columnIndexes.last,\r\n        firstRow: rowIndexes.first,\r\n        lastRow: rowIndexes.last\r\n    };\r\n    // Single cell selected - expand selection to pasted table dimensions.\r\n    const shouldExpandSelection = selectedTableCells.length === 1;\r\n    if (shouldExpandSelection) {\r\n        selection.lastRow += pastedDimensions.height - 1;\r\n        selection.lastColumn += pastedDimensions.width - 1;\r\n        expandTableSize(selectedTable, selection.lastRow + 1, selection.lastColumn + 1, tableUtils);\r\n    }\r\n    // In case of expanding selection we do not reset the selection so in this case we will always try to fix selection\r\n    // like in the case of a non-rectangular area. This might be fixed by re-setting selected cells array but this shortcut is safe.\r\n    if (shouldExpandSelection || !tableUtils.isSelectionRectangular(selectedTableCells)) {\r\n        // For a non-rectangular selection (ie in which some cells sticks out from a virtual selection rectangle) we need to create\r\n        // a table layout that has a rectangular selection. This will split cells so the selection become rectangular.\r\n        // Beyond this point we will operate on fixed content table.\r\n        splitCellsToRectangularSelection(selectedTable, selection, writer);\r\n    }\r\n    // However a selected table fragment might be invalid if examined alone. Ie such table fragment:\r\n    //\r\n    //    +---+---+---+---+\r\n    //  0 | a | b | c | d |\r\n    //    +   +   +---+---+\r\n    //  1 |   | e | f | g |\r\n    //    +   +---+   +---+\r\n    //  2 |   | h |   | i | <- last row, each cell has rowspan = 2,\r\n    //    +   +   +   +   +    so we need to return 3, not 2\r\n    //  3 |   |   |   |   |\r\n    //    +---+---+---+---+\r\n    //\r\n    // is invalid as the cells \"h\" and \"i\" have rowspans.\r\n    // This case needs only adjusting the selection dimension as the rest of the algorithm operates on empty slots also.\r\n    else {\r\n        selection.lastRow = adjustLastRowIndex(selectedTable, selection);\r\n        selection.lastColumn = adjustLastColumnIndex(selectedTable, selection);\r\n    }\r\n    return selection;\r\n}\r\n/**\r\n * Expand table (in place) to expected size.\r\n */\r\nfunction expandTableSize(table, expectedHeight, expectedWidth, tableUtils) {\r\n    const tableWidth = tableUtils.getColumns(table);\r\n    const tableHeight = tableUtils.getRows(table);\r\n    if (expectedWidth > tableWidth) {\r\n        tableUtils.insertColumns(table, {\r\n            at: tableWidth,\r\n            columns: expectedWidth - tableWidth\r\n        });\r\n    }\r\n    if (expectedHeight > tableHeight) {\r\n        tableUtils.insertRows(table, {\r\n            at: tableHeight,\r\n            rows: expectedHeight - tableHeight\r\n        });\r\n    }\r\n}\r\n/**\r\n * Returns two-dimensional array that is addressed by [ row ][ column ] that stores cells anchored at given location.\r\n *\r\n * At given row & column location it might be one of:\r\n *\r\n * * cell - cell from pasted table anchored at this location.\r\n * * null - if no cell is anchored at this location.\r\n *\r\n * For instance, from a table below:\r\n *\r\n *   +----+----+----+----+\r\n *   | 00 | 01 | 02 | 03 |\r\n *   +    +----+----+----+\r\n *   |    | 11      | 13 |\r\n *   +----+         +----+\r\n *   | 20 |         | 23 |\r\n *   +----+----+----+----+\r\n *\r\n * The method will return an array (numbers represents cell element):\r\n *\r\n * ```ts\r\n * const map = [\r\n *   [ '00', '01', '02', '03' ],\r\n *   [ null, '11', null, '13' ],\r\n *   [ '20', null, null, '23' ]\r\n * ]\r\n * ```\r\n *\r\n * This allows for a quick access to table at give row & column. For instance to access table cell \"13\" from pasted table call:\r\n *\r\n * ```ts\r\n * const cell = map[ 1 ][ 3 ]\r\n * ```\r\n */\r\nfunction createLocationMap(table, width, height) {\r\n    // Create height x width (row x column) two-dimensional table to store cells.\r\n    const map = new Array(height).fill(null)\r\n        .map(() => new Array(width).fill(null));\r\n    for (const { column, row, cell } of new TableWalker(table)) {\r\n        map[row][column] = cell;\r\n    }\r\n    return map;\r\n}\r\n/**\r\n * Make selected cells rectangular by splitting the cells that stand out from a rectangular selection.\r\n *\r\n * In the table below a selection is shown with \"::\" and slots with anchor cells are named.\r\n *\r\n * +----+----+----+----+----+                    +----+----+----+----+----+\r\n * | 00 | 01 | 02 | 03      |                    | 00 | 01 | 02 | 03      |\r\n * +    +----+    +----+----+                    |    ::::::::::::::::----+\r\n * |    | 11 |    | 13 | 14 |                    |    ::11 |    | 13:: 14 |    <- first row\r\n * +----+----+    +    +----+                    +----::---|    |   ::----+\r\n * | 20 | 21 |    |    | 24 |   select cells:    | 20 ::21 |    |   :: 24 |\r\n * +----+----+    +----+----+     11 -> 33       +----::---|    |---::----+\r\n * | 30      |    | 33 | 34 |                    | 30 ::   |    | 33:: 34 |    <- last row\r\n * +         +    +----+    +                    |    ::::::::::::::::    +\r\n * |         |    | 43 |    |                    |         |    | 43 |    |\r\n * +----+----+----+----+----+                    +----+----+----+----+----+\r\n *                                                      ^          ^\r\n *                                                     first & last columns\r\n *\r\n * Will update table to:\r\n *\r\n *                       +----+----+----+----+----+\r\n *                       | 00 | 01 | 02 | 03      |\r\n *                       +    +----+----+----+----+\r\n *                       |    | 11 |    | 13 | 14 |\r\n *                       +----+----+    +    +----+\r\n *                       | 20 | 21 |    |    | 24 |\r\n *                       +----+----+    +----+----+\r\n *                       | 30 |    |    | 33 | 34 |\r\n *                       +    +----+----+----+    +\r\n *                       |    |    |    | 43 |    |\r\n *                       +----+----+----+----+----+\r\n *\r\n * In th example above:\r\n * - Cell \"02\" which have `rowspan = 4` must be trimmed at first and at after last row.\r\n * - Cell \"03\" which have `rowspan = 2` and `colspan = 2` must be trimmed at first column and after last row.\r\n * - Cells \"00\", \"03\" & \"30\" which cannot be cut by this algorithm as they are outside the trimmed area.\r\n * - Cell \"13\" cannot be cut as it is inside the trimmed area.\r\n */\r\nfunction splitCellsToRectangularSelection(table, dimensions, writer) {\r\n    const { firstRow, lastRow, firstColumn, lastColumn } = dimensions;\r\n    const rowIndexes = { first: firstRow, last: lastRow };\r\n    const columnIndexes = { first: firstColumn, last: lastColumn };\r\n    // 1. Split cells vertically in two steps as first step might create cells that needs to split again.\r\n    doVerticalSplit(table, firstColumn, rowIndexes, writer);\r\n    doVerticalSplit(table, lastColumn + 1, rowIndexes, writer);\r\n    // 2. Split cells horizontally in two steps as first step might create cells that needs to split again.\r\n    doHorizontalSplit(table, firstRow, columnIndexes, writer);\r\n    doHorizontalSplit(table, lastRow + 1, columnIndexes, writer, firstRow);\r\n}\r\nfunction doHorizontalSplit(table, splitRow, limitColumns, writer, startRow = 0) {\r\n    // If selection starts at first row then no split is needed.\r\n    if (splitRow < 1) {\r\n        return;\r\n    }\r\n    const overlappingCells = getVerticallyOverlappingCells(table, splitRow, startRow);\r\n    // Filter out cells that are not touching insides of the rectangular selection.\r\n    const cellsToSplit = overlappingCells.filter(({ column, cellWidth }) => isAffectedBySelection(column, cellWidth, limitColumns));\r\n    return cellsToSplit.map(({ cell }) => splitHorizontally(cell, splitRow, writer));\r\n}\r\nfunction doVerticalSplit(table, splitColumn, limitRows, writer) {\r\n    // If selection starts at first column then no split is needed.\r\n    if (splitColumn < 1) {\r\n        return;\r\n    }\r\n    const overlappingCells = getHorizontallyOverlappingCells(table, splitColumn);\r\n    // Filter out cells that are not touching insides of the rectangular selection.\r\n    const cellsToSplit = overlappingCells.filter(({ row, cellHeight }) => isAffectedBySelection(row, cellHeight, limitRows));\r\n    return cellsToSplit.map(({ cell, column }) => splitVertically(cell, column, splitColumn, writer));\r\n}\r\n/**\r\n * Checks if cell at given row (column) is affected by a rectangular selection defined by first/last column (row).\r\n *\r\n * The same check is used for row as for column.\r\n */\r\nfunction isAffectedBySelection(index, span, limit) {\r\n    const endIndex = index + span - 1;\r\n    const { first, last } = limit;\r\n    const isInsideSelection = index >= first && index <= last;\r\n    const overlapsSelectionFromOutside = index < first && endIndex >= first;\r\n    return isInsideSelection || overlapsSelectionFromOutside;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/tablekeyboard\r\n */\r\nimport TableSelection from './tableselection';\r\nimport TableWalker from './tablewalker';\r\nimport TableUtils from './tableutils';\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { getLocalizedArrowKeyCodeDirection } from 'ckeditor5/src/utils';\r\n/**\r\n * This plugin enables keyboard navigation for tables.\r\n * It is loaded automatically by the {@link module:table/table~Table} plugin.\r\n */\r\nexport default class TableKeyboard extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'TableKeyboard';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [TableSelection, TableUtils];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const view = this.editor.editing.view;\r\n        const viewDocument = view.document;\r\n        this.listenTo(viewDocument, 'arrowKey', (...args) => this._onArrowKey(...args), { context: 'table' });\r\n        this.listenTo(viewDocument, 'tab', (...args) => this._handleTabOnSelectedTable(...args), { context: 'figure' });\r\n        this.listenTo(viewDocument, 'tab', (...args) => this._handleTab(...args), { context: ['th', 'td'] });\r\n    }\r\n    /**\r\n     * Handles {@link module:engine/view/document~Document#event:tab tab} events for the <kbd>Tab</kbd> key executed\r\n     * when the table widget is selected.\r\n     */\r\n    _handleTabOnSelectedTable(bubblingEventInfo, domEventData) {\r\n        const editor = this.editor;\r\n        const selection = editor.model.document.selection;\r\n        const selectedElement = selection.getSelectedElement();\r\n        if (!selectedElement || !selectedElement.is('element', 'table')) {\r\n            return;\r\n        }\r\n        domEventData.preventDefault();\r\n        domEventData.stopPropagation();\r\n        bubblingEventInfo.stop();\r\n        editor.model.change(writer => {\r\n            writer.setSelection(writer.createRangeIn(selectedElement.getChild(0).getChild(0)));\r\n        });\r\n    }\r\n    /**\r\n     * Handles {@link module:engine/view/document~Document#event:tab tab} events for the <kbd>Tab</kbd> key executed\r\n     * inside table cells.\r\n     */\r\n    _handleTab(bubblingEventInfo, domEventData) {\r\n        const editor = this.editor;\r\n        const tableUtils = this.editor.plugins.get(TableUtils);\r\n        const tableSelection = this.editor.plugins.get('TableSelection');\r\n        const selection = editor.model.document.selection;\r\n        const isForward = !domEventData.shiftKey;\r\n        let tableCell = tableUtils.getTableCellsContainingSelection(selection)[0];\r\n        if (!tableCell) {\r\n            tableCell = tableSelection.getFocusCell();\r\n        }\r\n        if (!tableCell) {\r\n            return;\r\n        }\r\n        domEventData.preventDefault();\r\n        domEventData.stopPropagation();\r\n        bubblingEventInfo.stop();\r\n        const tableRow = tableCell.parent;\r\n        const table = tableRow.parent;\r\n        const currentRowIndex = table.getChildIndex(tableRow);\r\n        const currentCellIndex = tableRow.getChildIndex(tableCell);\r\n        const isFirstCellInRow = currentCellIndex === 0;\r\n        if (!isForward && isFirstCellInRow && currentRowIndex === 0) {\r\n            // Set the selection over the whole table if the selection was in the first table cell.\r\n            editor.model.change(writer => {\r\n                writer.setSelection(writer.createRangeOn(table));\r\n            });\r\n            return;\r\n        }\r\n        const isLastCellInRow = currentCellIndex === tableRow.childCount - 1;\r\n        const isLastRow = currentRowIndex === tableUtils.getRows(table) - 1;\r\n        if (isForward && isLastRow && isLastCellInRow) {\r\n            editor.execute('insertTableRowBelow');\r\n            // Check if the command actually added a row. If `insertTableRowBelow` execution didn't add a row (because it was disabled\r\n            // or it got overwritten) set the selection over the whole table to mirror the first cell case.\r\n            if (currentRowIndex === tableUtils.getRows(table) - 1) {\r\n                editor.model.change(writer => {\r\n                    writer.setSelection(writer.createRangeOn(table));\r\n                });\r\n                return;\r\n            }\r\n        }\r\n        let cellToFocus;\r\n        // Move to the first cell in the next row.\r\n        if (isForward && isLastCellInRow) {\r\n            const nextRow = table.getChild(currentRowIndex + 1);\r\n            cellToFocus = nextRow.getChild(0);\r\n        }\r\n        // Move to the last cell in the previous row.\r\n        else if (!isForward && isFirstCellInRow) {\r\n            const previousRow = table.getChild(currentRowIndex - 1);\r\n            cellToFocus = previousRow.getChild(previousRow.childCount - 1);\r\n        }\r\n        // Move to the next/previous cell.\r\n        else {\r\n            cellToFocus = tableRow.getChild(currentCellIndex + (isForward ? 1 : -1));\r\n        }\r\n        editor.model.change(writer => {\r\n            writer.setSelection(writer.createRangeIn(cellToFocus));\r\n        });\r\n    }\r\n    /**\r\n     * Handles {@link module:engine/view/document~Document#event:keydown keydown} events.\r\n     */\r\n    _onArrowKey(eventInfo, domEventData) {\r\n        const editor = this.editor;\r\n        const keyCode = domEventData.keyCode;\r\n        const direction = getLocalizedArrowKeyCodeDirection(keyCode, editor.locale.contentLanguageDirection);\r\n        const wasHandled = this._handleArrowKeys(direction, domEventData.shiftKey);\r\n        if (wasHandled) {\r\n            domEventData.preventDefault();\r\n            domEventData.stopPropagation();\r\n            eventInfo.stop();\r\n        }\r\n    }\r\n    /**\r\n     * Handles arrow keys to move the selection around the table.\r\n     *\r\n     * @param direction The direction of the arrow key.\r\n     * @param expandSelection If the current selection should be expanded.\r\n     * @returns Returns `true` if key was handled.\r\n     */\r\n    _handleArrowKeys(direction, expandSelection) {\r\n        const tableUtils = this.editor.plugins.get(TableUtils);\r\n        const tableSelection = this.editor.plugins.get('TableSelection');\r\n        const model = this.editor.model;\r\n        const selection = model.document.selection;\r\n        const isForward = ['right', 'down'].includes(direction);\r\n        // In case one or more table cells are selected (from outside),\r\n        // move the selection to a cell adjacent to the selected table fragment.\r\n        const selectedCells = tableUtils.getSelectedTableCells(selection);\r\n        if (selectedCells.length) {\r\n            let focusCell;\r\n            if (expandSelection) {\r\n                focusCell = tableSelection.getFocusCell();\r\n            }\r\n            else {\r\n                focusCell = isForward ? selectedCells[selectedCells.length - 1] : selectedCells[0];\r\n            }\r\n            this._navigateFromCellInDirection(focusCell, direction, expandSelection);\r\n            return true;\r\n        }\r\n        // Abort if we're not in a table cell.\r\n        const tableCell = selection.focus.findAncestor('tableCell');\r\n        /* istanbul ignore if: paranoid check -- @preserve */\r\n        if (!tableCell) {\r\n            return false;\r\n        }\r\n        // When the selection is not collapsed.\r\n        if (!selection.isCollapsed) {\r\n            if (expandSelection) {\r\n                // Navigation is in the opposite direction than the selection direction so this is shrinking of the selection.\r\n                // Selection for sure will not approach cell edge.\r\n                //\r\n                // With a special case when all cell content is selected - then selection should expand to the other cell.\r\n                // Note: When the entire cell gets selected using CTRL+A, the selection is always forward.\r\n                if (selection.isBackward == isForward && !selection.containsEntireContent(tableCell)) {\r\n                    return false;\r\n                }\r\n            }\r\n            else {\r\n                const selectedElement = selection.getSelectedElement();\r\n                // It will collapse for non-object selected so it's not going to move to other cell.\r\n                if (!selectedElement || !model.schema.isObject(selectedElement)) {\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n        // Let's check if the selection is at the beginning/end of the cell.\r\n        if (this._isSelectionAtCellEdge(selection, tableCell, isForward)) {\r\n            this._navigateFromCellInDirection(tableCell, direction, expandSelection);\r\n            return true;\r\n        }\r\n        return false;\r\n    }\r\n    /**\r\n     * Returns `true` if the selection is at the boundary of a table cell according to the navigation direction.\r\n     *\r\n     * @param selection The current selection.\r\n     * @param tableCell The current table cell element.\r\n     * @param isForward The expected navigation direction.\r\n     */\r\n    _isSelectionAtCellEdge(selection, tableCell, isForward) {\r\n        const model = this.editor.model;\r\n        const schema = this.editor.model.schema;\r\n        const focus = isForward ? selection.getLastPosition() : selection.getFirstPosition();\r\n        // If the current limit element is not table cell we are for sure not at the cell edge.\r\n        // Also `modifySelection` will not let us out of it.\r\n        if (!schema.getLimitElement(focus).is('element', 'tableCell')) {\r\n            const boundaryPosition = model.createPositionAt(tableCell, isForward ? 'end' : 0);\r\n            return boundaryPosition.isTouching(focus);\r\n        }\r\n        const probe = model.createSelection(focus);\r\n        model.modifySelection(probe, { direction: isForward ? 'forward' : 'backward' });\r\n        // If there was no change in the focus position, then it's not possible to move the selection there.\r\n        return focus.isEqual(probe.focus);\r\n    }\r\n    /**\r\n     * Moves the selection from the given table cell in the specified direction.\r\n     *\r\n     * @param focusCell The table cell that is current multi-cell selection focus.\r\n     * @param direction Direction in which selection should move.\r\n     * @param expandSelection If the current selection should be expanded. Default value is false.\r\n     */\r\n    _navigateFromCellInDirection(focusCell, direction, expandSelection = false) {\r\n        const model = this.editor.model;\r\n        const table = focusCell.findAncestor('table');\r\n        const tableMap = [...new TableWalker(table, { includeAllSlots: true })];\r\n        const { row: lastRow, column: lastColumn } = tableMap[tableMap.length - 1];\r\n        const currentCellInfo = tableMap.find(({ cell }) => cell == focusCell);\r\n        let { row, column } = currentCellInfo;\r\n        switch (direction) {\r\n            case 'left':\r\n                column--;\r\n                break;\r\n            case 'up':\r\n                row--;\r\n                break;\r\n            case 'right':\r\n                column += currentCellInfo.cellWidth;\r\n                break;\r\n            case 'down':\r\n                row += currentCellInfo.cellHeight;\r\n                break;\r\n        }\r\n        const isOutsideVertically = row < 0 || row > lastRow;\r\n        const isBeforeFirstCell = column < 0 && row <= 0;\r\n        const isAfterLastCell = column > lastColumn && row >= lastRow;\r\n        // Note that if the table cell at the end of a row is row-spanned then isAfterLastCell will never be true.\r\n        // However, we don't know if user was navigating on the last row or not, so let's stay in the table.\r\n        if (isOutsideVertically || isBeforeFirstCell || isAfterLastCell) {\r\n            model.change(writer => {\r\n                writer.setSelection(writer.createRangeOn(table));\r\n            });\r\n            return;\r\n        }\r\n        if (column < 0) {\r\n            column = expandSelection ? 0 : lastColumn;\r\n            row--;\r\n        }\r\n        else if (column > lastColumn) {\r\n            column = expandSelection ? lastColumn : 0;\r\n            row++;\r\n        }\r\n        const cellToSelect = tableMap.find(cellInfo => cellInfo.row == row && cellInfo.column == column).cell;\r\n        const isForward = ['right', 'down'].includes(direction);\r\n        const tableSelection = this.editor.plugins.get('TableSelection');\r\n        if (expandSelection && tableSelection.isEnabled) {\r\n            const anchorCell = tableSelection.getAnchorCell() || focusCell;\r\n            tableSelection.setCellSelection(anchorCell, cellToSelect);\r\n        }\r\n        else {\r\n            const positionToSelect = model.createPositionAt(cellToSelect, isForward ? 0 : 'end');\r\n            model.change(writer => {\r\n                writer.setSelection(positionToSelect);\r\n            });\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/tablemouse/mouseeventsobserver\r\n */\r\nimport { DomEventObserver } from 'ckeditor5/src/engine';\r\n/**\r\n * The mouse selection event observer.\r\n *\r\n * It registers listeners for the following DOM events:\r\n *\r\n * - `'mousemove'`\r\n * - `'mouseleave'`\r\n *\r\n * Note that this observer is disabled by default. To enable this observer, it needs to be added to\r\n * {@link module:engine/view/view~View} using the {@link module:engine/view/view~View#addObserver} method.\r\n *\r\n * The observer is registered by the {@link module:table/tableselection~TableSelection} plugin.\r\n */\r\nexport default class MouseEventsObserver extends DomEventObserver {\r\n    constructor() {\r\n        super(...arguments);\r\n        this.domEventType = [\r\n            'mousemove', 'mouseleave'\r\n        ];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    onDomEvent(domEvent) {\r\n        this.fire(domEvent.type, domEvent);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/tablemouse\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport TableSelection from './tableselection';\r\nimport MouseEventsObserver from './tablemouse/mouseeventsobserver';\r\nimport TableUtils from './tableutils';\r\n/**\r\n * This plugin enables a table cells' selection with the mouse.\r\n * It is loaded automatically by the {@link module:table/table~Table} plugin.\r\n */\r\nexport default class TableMouse extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'TableMouse';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [TableSelection, TableUtils];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        // Currently the MouseObserver only handles `mousedown` and `mouseup` events.\r\n        // TODO move to the engine?\r\n        editor.editing.view.addObserver(MouseEventsObserver);\r\n        this._enableShiftClickSelection();\r\n        this._enableMouseDragSelection();\r\n    }\r\n    /**\r\n     * Enables making cells selection by <kbd>Shift</kbd>+click. Creates a selection from the cell which previously held\r\n     * the selection to the cell which was clicked. It can be the same cell, in which case it selects a single cell.\r\n     */\r\n    _enableShiftClickSelection() {\r\n        const editor = this.editor;\r\n        const tableUtils = editor.plugins.get(TableUtils);\r\n        let blockSelectionChange = false;\r\n        const tableSelection = editor.plugins.get(TableSelection);\r\n        this.listenTo(editor.editing.view.document, 'mousedown', (evt, domEventData) => {\r\n            const selection = editor.model.document.selection;\r\n            if (!this.isEnabled || !tableSelection.isEnabled) {\r\n                return;\r\n            }\r\n            if (!domEventData.domEvent.shiftKey) {\r\n                return;\r\n            }\r\n            const anchorCell = tableSelection.getAnchorCell() || tableUtils.getTableCellsContainingSelection(selection)[0];\r\n            if (!anchorCell) {\r\n                return;\r\n            }\r\n            const targetCell = this._getModelTableCellFromDomEvent(domEventData);\r\n            if (targetCell && haveSameTableParent(anchorCell, targetCell)) {\r\n                blockSelectionChange = true;\r\n                tableSelection.setCellSelection(anchorCell, targetCell);\r\n                domEventData.preventDefault();\r\n            }\r\n        });\r\n        this.listenTo(editor.editing.view.document, 'mouseup', () => {\r\n            blockSelectionChange = false;\r\n        });\r\n        // We need to ignore a `selectionChange` event that is fired after we render our new table cells selection.\r\n        // When downcasting table cells selection to the view, we put the view selection in the last selected cell\r\n        // in a place that may not be natively a \"correct\" location. This is – we put it directly in the `<td>` element.\r\n        // All browsers fire the native `selectionchange` event.\r\n        // However, all browsers except Safari return the selection in the exact place where we put it\r\n        // (even though it's visually normalized). Safari returns `<td><p>^foo` that makes our selection observer\r\n        // fire our `selectionChange` event (because the view selection that we set in the first step differs from the DOM selection).\r\n        // Since `selectionChange` is fired, we automatically update the model selection that moves it that paragraph.\r\n        // This breaks our dear cells selection.\r\n        //\r\n        // Theoretically this issue concerns only Safari that is the only browser that do normalize the selection.\r\n        // However, to avoid code branching and to have a good coverage for this event blocker, I enabled it for all browsers.\r\n        //\r\n        // Note: I'm keeping the `blockSelectionChange` state separately for shift+click and mouse drag (exact same logic)\r\n        // so I don't have to try to analyze whether they don't overlap in some weird cases. Probably they don't.\r\n        // But I have other things to do, like writing this comment.\r\n        this.listenTo(editor.editing.view.document, 'selectionChange', evt => {\r\n            if (blockSelectionChange) {\r\n                // @if CK_DEBUG // console.log( 'Blocked selectionChange to avoid breaking table cells selection.' );\r\n                evt.stop();\r\n            }\r\n        }, { priority: 'highest' });\r\n    }\r\n    /**\r\n     * Enables making cells selection by dragging.\r\n     *\r\n     * The selection is made only on mousemove. Mouse tracking is started on mousedown.\r\n     * However, the cells selection is enabled only after the mouse cursor left the anchor cell.\r\n     * Thanks to that normal text selection within one cell works just fine. However, you can still select\r\n     * just one cell by leaving the anchor cell and moving back to it.\r\n     */\r\n    _enableMouseDragSelection() {\r\n        const editor = this.editor;\r\n        let anchorCell, targetCell;\r\n        let beganCellSelection = false;\r\n        let blockSelectionChange = false;\r\n        const tableSelection = editor.plugins.get(TableSelection);\r\n        this.listenTo(editor.editing.view.document, 'mousedown', (evt, domEventData) => {\r\n            if (!this.isEnabled || !tableSelection.isEnabled) {\r\n                return;\r\n            }\r\n            // Make sure to not conflict with the shift+click listener and any other possible handler.\r\n            if (domEventData.domEvent.shiftKey || domEventData.domEvent.ctrlKey || domEventData.domEvent.altKey) {\r\n                return;\r\n            }\r\n            anchorCell = this._getModelTableCellFromDomEvent(domEventData);\r\n        });\r\n        this.listenTo(editor.editing.view.document, 'mousemove', (evt, domEventData) => {\r\n            if (!domEventData.domEvent.buttons) {\r\n                return;\r\n            }\r\n            if (!anchorCell) {\r\n                return;\r\n            }\r\n            const newTargetCell = this._getModelTableCellFromDomEvent(domEventData);\r\n            if (newTargetCell && haveSameTableParent(anchorCell, newTargetCell)) {\r\n                targetCell = newTargetCell;\r\n                // Switch to the cell selection mode after the mouse cursor left the anchor cell.\r\n                // Switch off only on mouseup (makes selecting a single cell possible).\r\n                if (!beganCellSelection && targetCell != anchorCell) {\r\n                    beganCellSelection = true;\r\n                }\r\n            }\r\n            // Yep, not making a cell selection yet. See method docs.\r\n            if (!beganCellSelection) {\r\n                return;\r\n            }\r\n            blockSelectionChange = true;\r\n            tableSelection.setCellSelection(anchorCell, targetCell);\r\n            domEventData.preventDefault();\r\n        });\r\n        this.listenTo(editor.editing.view.document, 'mouseup', () => {\r\n            beganCellSelection = false;\r\n            blockSelectionChange = false;\r\n            anchorCell = null;\r\n            targetCell = null;\r\n        });\r\n        // See the explanation in `_enableShiftClickSelection()`.\r\n        this.listenTo(editor.editing.view.document, 'selectionChange', evt => {\r\n            if (blockSelectionChange) {\r\n                // @if CK_DEBUG // console.log( 'Blocked selectionChange to avoid breaking table cells selection.' );\r\n                evt.stop();\r\n            }\r\n        }, { priority: 'highest' });\r\n    }\r\n    /**\r\n     * Returns the model table cell element based on the target element of the passed DOM event.\r\n     *\r\n     * @returns Returns the table cell or `undefined`.\r\n     */\r\n    _getModelTableCellFromDomEvent(domEventData) {\r\n        // Note: Work with positions (not element mapping) because the target element can be an attribute or other non-mapped element.\r\n        const viewTargetElement = domEventData.target;\r\n        const viewPosition = this.editor.editing.view.createPositionAt(viewTargetElement, 0);\r\n        const modelPosition = this.editor.editing.mapper.toModelPosition(viewPosition);\r\n        const modelElement = modelPosition.parent;\r\n        return modelElement.findAncestor('tableCell', { includeSelf: true });\r\n    }\r\n}\r\nfunction haveSameTableParent(cellA, cellB) {\r\n    return cellA.parent.parent == cellB.parent.parent;\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./table.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./colorinput.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/ui/colorinputview\r\n */\r\nimport { View, InputTextView, ButtonView, createDropdown, ColorGridView, FocusCycler, ViewCollection } from 'ckeditor5/src/ui';\r\nimport { icons } from 'ckeditor5/src/core';\r\nimport { FocusTracker, KeystrokeHandler } from 'ckeditor5/src/utils';\r\nimport '../../theme/colorinput.css';\r\n/**\r\n * The color input view class. It allows the user to type in a color (hex, rgb, etc.)\r\n * or choose it from the configurable color palette with a preview.\r\n *\r\n * @internal\r\n */\r\nexport default class ColorInputView extends View {\r\n    /**\r\n     * Creates an instance of the color input view.\r\n     *\r\n     * @param locale The locale instance.\r\n     * @param options The input options.\r\n     * @param options.colorDefinitions The colors to be displayed in the palette inside the input's dropdown.\r\n     * @param options.columns The number of columns in which the colors will be displayed.\r\n     * @param options.defaultColorValue If specified, the color input view will replace the \"Remove color\" button with\r\n     * the \"Restore default\" button. Instead of clearing the input field, the default color value will be set.\r\n     */\r\n    constructor(locale, options) {\r\n        super(locale);\r\n        this.set('value', '');\r\n        this.set('isReadOnly', false);\r\n        this.set('isFocused', false);\r\n        this.set('isEmpty', true);\r\n        this.options = options;\r\n        this.focusTracker = new FocusTracker();\r\n        this._focusables = new ViewCollection();\r\n        this.dropdownView = this._createDropdownView();\r\n        this.inputView = this._createInputTextView();\r\n        this.keystrokes = new KeystrokeHandler();\r\n        this._stillTyping = false;\r\n        this._focusCycler = new FocusCycler({\r\n            focusables: this._focusables,\r\n            focusTracker: this.focusTracker,\r\n            keystrokeHandler: this.keystrokes,\r\n            actions: {\r\n                // Navigate items backwards using the <kbd>Shift</kbd> + <kbd>Tab</kbd> keystroke.\r\n                focusPrevious: 'shift + tab',\r\n                // Navigate items forwards using the <kbd>Tab</kbd> key.\r\n                focusNext: 'tab'\r\n            }\r\n        });\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-input-color'\r\n                ]\r\n            },\r\n            children: [\r\n                this.dropdownView,\r\n                this.inputView\r\n            ]\r\n        });\r\n        this.on('change:value', (evt, name, inputValue) => this._setInputValue(inputValue));\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        // Start listening for the keystrokes coming from the dropdown panel view.\r\n        this.keystrokes.listenTo(this.dropdownView.panelView.element);\r\n    }\r\n    /**\r\n     * Focuses the input.\r\n     */\r\n    focus() {\r\n        this.inputView.focus();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        this.focusTracker.destroy();\r\n        this.keystrokes.destroy();\r\n    }\r\n    /**\r\n     * Creates and configures the {@link #dropdownView}.\r\n     */\r\n    _createDropdownView() {\r\n        const locale = this.locale;\r\n        const t = locale.t;\r\n        const bind = this.bindTemplate;\r\n        const colorGrid = this._createColorGrid(locale);\r\n        const dropdown = createDropdown(locale);\r\n        const colorPreview = new View();\r\n        const removeColorButton = this._createRemoveColorButton();\r\n        colorPreview.setTemplate({\r\n            tag: 'span',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-input-color__button__preview'\r\n                ],\r\n                style: {\r\n                    backgroundColor: bind.to('value')\r\n                }\r\n            },\r\n            children: [{\r\n                    tag: 'span',\r\n                    attributes: {\r\n                        class: [\r\n                            'ck',\r\n                            'ck-input-color__button__preview__no-color-indicator',\r\n                            bind.if('value', 'ck-hidden', value => value != '')\r\n                        ]\r\n                    }\r\n                }]\r\n        });\r\n        dropdown.buttonView.extendTemplate({\r\n            attributes: {\r\n                class: 'ck-input-color__button'\r\n            }\r\n        });\r\n        dropdown.buttonView.children.add(colorPreview);\r\n        dropdown.buttonView.label = t('Color picker');\r\n        dropdown.buttonView.tooltip = true;\r\n        dropdown.panelPosition = locale.uiLanguageDirection === 'rtl' ? 'se' : 'sw';\r\n        dropdown.panelView.children.add(removeColorButton);\r\n        dropdown.panelView.children.add(colorGrid);\r\n        dropdown.bind('isEnabled').to(this, 'isReadOnly', value => !value);\r\n        this._focusables.add(removeColorButton);\r\n        this._focusables.add(colorGrid);\r\n        this.focusTracker.add(removeColorButton.element);\r\n        this.focusTracker.add(colorGrid.element);\r\n        return dropdown;\r\n    }\r\n    /**\r\n     * Creates and configures an instance of {@link module:ui/inputtext/inputtextview~InputTextView}.\r\n     *\r\n     * @returns A configured instance to be set as {@link #inputView}.\r\n     */\r\n    _createInputTextView() {\r\n        const locale = this.locale;\r\n        const inputView = new InputTextView(locale);\r\n        inputView.extendTemplate({\r\n            on: {\r\n                blur: inputView.bindTemplate.to('blur')\r\n            }\r\n        });\r\n        inputView.value = this.value;\r\n        inputView.bind('isReadOnly', 'hasError').to(this);\r\n        this.bind('isFocused', 'isEmpty').to(inputView);\r\n        inputView.on('input', () => {\r\n            const inputValue = inputView.element.value;\r\n            // Check if the value matches one of our defined colors' label.\r\n            const mappedColor = this.options.colorDefinitions.find(def => inputValue === def.label);\r\n            this._stillTyping = true;\r\n            this.value = mappedColor && mappedColor.color || inputValue;\r\n        });\r\n        inputView.on('blur', () => {\r\n            this._stillTyping = false;\r\n            this._setInputValue(inputView.element.value);\r\n        });\r\n        inputView.delegate('input').to(this);\r\n        return inputView;\r\n    }\r\n    /**\r\n     * Creates and configures the button that clears the color.\r\n     */\r\n    _createRemoveColorButton() {\r\n        const locale = this.locale;\r\n        const t = locale.t;\r\n        const removeColorButton = new ButtonView(locale);\r\n        const defaultColor = this.options.defaultColorValue || '';\r\n        const removeColorButtonLabel = defaultColor ? t('Restore default') : t('Remove color');\r\n        removeColorButton.class = 'ck-input-color__remove-color';\r\n        removeColorButton.withText = true;\r\n        removeColorButton.icon = icons.eraser;\r\n        removeColorButton.label = removeColorButtonLabel;\r\n        removeColorButton.on('execute', () => {\r\n            this.value = defaultColor;\r\n            this.dropdownView.isOpen = false;\r\n            this.fire('input');\r\n        });\r\n        return removeColorButton;\r\n    }\r\n    /**\r\n     * Creates and configures the color grid inside the {@link #dropdownView}.\r\n     */\r\n    _createColorGrid(locale) {\r\n        const colorGrid = new ColorGridView(locale, {\r\n            colorDefinitions: this.options.colorDefinitions,\r\n            columns: this.options.columns\r\n        });\r\n        colorGrid.on('execute', (evtData, data) => {\r\n            this.value = data.value;\r\n            this.dropdownView.isOpen = false;\r\n            this.fire('input');\r\n        });\r\n        colorGrid.bind('selectedColor').to(this, 'value');\r\n        return colorGrid;\r\n    }\r\n    /**\r\n     * Sets {@link #inputView}'s value property to the color value or color label,\r\n     * if there is one and the user is not typing.\r\n     *\r\n     * Handles cases like:\r\n     *\r\n     * * Someone picks the color in the grid.\r\n     * * The color is set from the plugin level.\r\n     *\r\n     * @param inputValue Color value to be set.\r\n     */\r\n    _setInputValue(inputValue) {\r\n        if (!this._stillTyping) {\r\n            const normalizedInputValue = normalizeColor(inputValue);\r\n            // Check if the value matches one of our defined colors.\r\n            const mappedColor = this.options.colorDefinitions.find(def => normalizedInputValue === normalizeColor(def.color));\r\n            if (mappedColor) {\r\n                this.inputView.value = mappedColor.label;\r\n            }\r\n            else {\r\n                this.inputView.value = inputValue || '';\r\n            }\r\n        }\r\n    }\r\n}\r\n/**\r\n * Normalizes color value, by stripping extensive whitespace.\r\n * For example., transforms:\r\n * * `   rgb(  25 50    0 )` to `rgb(25 50 0)`,\r\n * * \"\\t  rgb(  25 ,  50,0 )\t\t\" to `rgb(25 50 0)`.\r\n *\r\n * @param colorString The value to be normalized.\r\n */\r\nfunction normalizeColor(colorString) {\r\n    return colorString\r\n        // Remove any whitespace right after `(` or `,`.\r\n        .replace(/([(,])\\s+/g, '$1')\r\n        // Remove any whitespace at the beginning or right before the end, `)`, `,`, or another whitespace.\r\n        .replace(/^\\s+|\\s+(?=[),\\s]|$)/g, '')\r\n        // Then, replace `,` or whitespace with a single space.\r\n        .replace(/,|\\s/g, ' ');\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/utils/ui/table-properties\r\n */\r\nimport { ButtonView, Model } from 'ckeditor5/src/ui';\r\nimport { Collection } from 'ckeditor5/src/utils';\r\nimport { isColor, isLength, isPercentage } from 'ckeditor5/src/engine';\r\nimport ColorInputView from '../../ui/colorinputview';\r\nconst isEmpty = (val) => val === '';\r\n/**\r\n * Returns an object containing pairs of CSS border style values and their localized UI\r\n * labels. Used by {@link module:table/tablecellproperties/ui/tablecellpropertiesview~TableCellPropertiesView}\r\n * and {@link module:table/tableproperties/ui/tablepropertiesview~TablePropertiesView}.\r\n *\r\n * @param t The \"t\" function provided by the editor that is used to localize strings.\r\n */\r\nexport function getBorderStyleLabels(t) {\r\n    return {\r\n        none: t('None'),\r\n        solid: t('Solid'),\r\n        dotted: t('Dotted'),\r\n        dashed: t('Dashed'),\r\n        double: t('Double'),\r\n        groove: t('Groove'),\r\n        ridge: t('Ridge'),\r\n        inset: t('Inset'),\r\n        outset: t('Outset')\r\n    };\r\n}\r\n/**\r\n * Returns a localized error string that can be displayed next to color (background, border)\r\n * fields that have an invalid value.\r\n *\r\n * @param t The \"t\" function provided by the editor that is used to localize strings.\r\n */\r\nexport function getLocalizedColorErrorText(t) {\r\n    return t('The color is invalid. Try \"#FF0000\" or \"rgb(255,0,0)\" or \"red\".');\r\n}\r\n/**\r\n * Returns a localized error string that can be displayed next to length (padding, border width)\r\n * fields that have an invalid value.\r\n *\r\n * @param t The \"t\" function provided by the editor that is used to localize strings.\r\n */\r\nexport function getLocalizedLengthErrorText(t) {\r\n    return t('The value is invalid. Try \"10px\" or \"2em\" or simply \"2\".');\r\n}\r\n/**\r\n * Returns `true` when the passed value is an empty string or a valid CSS color expression.\r\n * Otherwise, `false` is returned.\r\n *\r\n * See {@link module:engine/view/styles/utils~isColor}.\r\n */\r\nexport function colorFieldValidator(value) {\r\n    value = value.trim();\r\n    return isEmpty(value) || isColor(value);\r\n}\r\n/**\r\n * Returns `true` when the passed value is an empty string, a number without a unit or a valid CSS length expression.\r\n * Otherwise, `false` is returned.\r\n *\r\n * See {@link module:engine/view/styles/utils~isLength}.\r\n * See {@link module:engine/view/styles/utils~isPercentage}.\r\n */\r\nexport function lengthFieldValidator(value) {\r\n    value = value.trim();\r\n    return isEmpty(value) || isNumberString(value) || isLength(value) || isPercentage(value);\r\n}\r\n/**\r\n * Returns `true` when the passed value is an empty string, a number without a unit or a valid CSS length expression.\r\n * Otherwise, `false` is returned.\r\n *\r\n * See {@link module:engine/view/styles/utils~isLength}.\r\n */\r\nexport function lineWidthFieldValidator(value) {\r\n    value = value.trim();\r\n    return isEmpty(value) || isNumberString(value) || isLength(value);\r\n}\r\n/**\r\n * Generates item definitions for a UI dropdown that allows changing the border style of a table or a table cell.\r\n *\r\n * @param defaultStyle The default border.\r\n */\r\nexport function getBorderStyleDefinitions(view, defaultStyle) {\r\n    const itemDefinitions = new Collection();\r\n    const styleLabels = getBorderStyleLabels(view.t);\r\n    for (const style in styleLabels) {\r\n        const definition = {\r\n            type: 'button',\r\n            model: new Model({\r\n                _borderStyleValue: style,\r\n                label: styleLabels[style],\r\n                role: 'menuitemradio',\r\n                withText: true\r\n            })\r\n        };\r\n        if (style === 'none') {\r\n            definition.model.bind('isOn').to(view, 'borderStyle', value => {\r\n                if (defaultStyle === 'none') {\r\n                    return !value;\r\n                }\r\n                return value === style;\r\n            });\r\n        }\r\n        else {\r\n            definition.model.bind('isOn').to(view, 'borderStyle', value => {\r\n                return value === style;\r\n            });\r\n        }\r\n        itemDefinitions.add(definition);\r\n    }\r\n    return itemDefinitions;\r\n}\r\n/**\r\n * A helper that fills a toolbar with buttons that:\r\n *\r\n * * have some labels,\r\n * * have some icons,\r\n * * set a certain UI view property value upon execution.\r\n *\r\n * @param nameToValue A function that maps a button name to a value. By default names are the same as values.\r\n */\r\nexport function fillToolbar(options) {\r\n    const { view, icons, toolbar, labels, propertyName, nameToValue, defaultValue } = options;\r\n    for (const name in labels) {\r\n        const button = new ButtonView(view.locale);\r\n        button.set({\r\n            label: labels[name],\r\n            icon: icons[name],\r\n            tooltip: labels[name]\r\n        });\r\n        // If specified the `nameToValue()` callback, map the value based on the option's name.\r\n        const buttonValue = nameToValue ? nameToValue(name) : name;\r\n        button.bind('isOn').to(view, propertyName, value => {\r\n            // `value` comes from `view[ propertyName ]`.\r\n            let valueToCompare = value;\r\n            // If it's empty, and the `defaultValue` is specified, use it instead.\r\n            if (value === '' && defaultValue) {\r\n                valueToCompare = defaultValue;\r\n            }\r\n            return buttonValue === valueToCompare;\r\n        });\r\n        button.on('execute', () => {\r\n            view[propertyName] = buttonValue;\r\n        });\r\n        toolbar.items.add(button);\r\n    }\r\n}\r\n/**\r\n * A default color palette used by various user interfaces related to tables, for instance,\r\n * by {@link module:table/tablecellproperties/tablecellpropertiesui~TableCellPropertiesUI} or\r\n * {@link module:table/tableproperties/tablepropertiesui~TablePropertiesUI}.\r\n *\r\n * The color palette follows the {@link module:table/tableconfig~TableColorConfig table color configuration format}\r\n * and contains the following color definitions:\r\n *\r\n * ```ts\r\n * const defaultColors = [\r\n *   {\r\n *     color: 'hsl(0, 0%, 0%)',\r\n *     label: 'Black'\r\n *   },\r\n *   {\r\n *     color: 'hsl(0, 0%, 30%)',\r\n *     label: 'Dim grey'\r\n *   },\r\n *   {\r\n *     color: 'hsl(0, 0%, 60%)',\r\n *     label: 'Grey'\r\n *   },\r\n *   {\r\n *     color: 'hsl(0, 0%, 90%)',\r\n *     label: 'Light grey'\r\n *   },\r\n *   {\r\n *     color: 'hsl(0, 0%, 100%)',\r\n *     label: 'White',\r\n *     hasBorder: true\r\n *   },\r\n *   {\r\n *     color: 'hsl(0, 75%, 60%)',\r\n *     label: 'Red'\r\n *   },\r\n *   {\r\n *     color: 'hsl(30, 75%, 60%)',\r\n *     label: 'Orange'\r\n *   },\r\n *   {\r\n *     color: 'hsl(60, 75%, 60%)',\r\n *     label: 'Yellow'\r\n *   },\r\n *   {\r\n *     color: 'hsl(90, 75%, 60%)',\r\n *     label: 'Light green'\r\n *   },\r\n *   {\r\n *     color: 'hsl(120, 75%, 60%)',\r\n *     label: 'Green'\r\n *   },\r\n *   {\r\n *     color: 'hsl(150, 75%, 60%)',\r\n *     label: 'Aquamarine'\r\n *   },\r\n *   {\r\n *     color: 'hsl(180, 75%, 60%)',\r\n *     label: 'Turquoise'\r\n *   },\r\n *   {\r\n *     color: 'hsl(210, 75%, 60%)',\r\n *     label: 'Light blue'\r\n *   },\r\n *   {\r\n *     color: 'hsl(240, 75%, 60%)',\r\n *     label: 'Blue'\r\n *   },\r\n *   {\r\n *     color: 'hsl(270, 75%, 60%)',\r\n *     label: 'Purple'\r\n *   }\r\n * ];\r\n * ```\r\n */\r\nexport const defaultColors = [\r\n    {\r\n        color: 'hsl(0, 0%, 0%)',\r\n        label: 'Black'\r\n    },\r\n    {\r\n        color: 'hsl(0, 0%, 30%)',\r\n        label: 'Dim grey'\r\n    },\r\n    {\r\n        color: 'hsl(0, 0%, 60%)',\r\n        label: 'Grey'\r\n    },\r\n    {\r\n        color: 'hsl(0, 0%, 90%)',\r\n        label: 'Light grey'\r\n    },\r\n    {\r\n        color: 'hsl(0, 0%, 100%)',\r\n        label: 'White',\r\n        hasBorder: true\r\n    },\r\n    {\r\n        color: 'hsl(0, 75%, 60%)',\r\n        label: 'Red'\r\n    },\r\n    {\r\n        color: 'hsl(30, 75%, 60%)',\r\n        label: 'Orange'\r\n    },\r\n    {\r\n        color: 'hsl(60, 75%, 60%)',\r\n        label: 'Yellow'\r\n    },\r\n    {\r\n        color: 'hsl(90, 75%, 60%)',\r\n        label: 'Light green'\r\n    },\r\n    {\r\n        color: 'hsl(120, 75%, 60%)',\r\n        label: 'Green'\r\n    },\r\n    {\r\n        color: 'hsl(150, 75%, 60%)',\r\n        label: 'Aquamarine'\r\n    },\r\n    {\r\n        color: 'hsl(180, 75%, 60%)',\r\n        label: 'Turquoise'\r\n    },\r\n    {\r\n        color: 'hsl(210, 75%, 60%)',\r\n        label: 'Light blue'\r\n    },\r\n    {\r\n        color: 'hsl(240, 75%, 60%)',\r\n        label: 'Blue'\r\n    },\r\n    {\r\n        color: 'hsl(270, 75%, 60%)',\r\n        label: 'Purple'\r\n    }\r\n];\r\n/**\r\n * Returns a creator for a color input with a label.\r\n *\r\n * For given options, it returns a function that creates an instance of a\r\n * {@link module:table/ui/colorinputview~ColorInputView color input} logically related to\r\n * a {@link module:ui/labeledfield/labeledfieldview~LabeledFieldView labeled view} in the DOM.\r\n *\r\n * The helper does the following:\r\n *\r\n * * It sets the color input `id` and `ariaDescribedById` attributes.\r\n * * It binds the color input `isReadOnly` to the labeled view.\r\n * * It binds the color input `hasError` to the labeled view.\r\n * * It enables a logic that cleans up the error when the user starts typing in the color input.\r\n *\r\n * Usage:\r\n *\r\n * ```ts\r\n * const colorInputCreator = getLabeledColorInputCreator( {\r\n *   colorConfig: [ ... ],\r\n *   columns: 3,\r\n * } );\r\n *\r\n * const labeledInputView = new LabeledFieldView( locale, colorInputCreator );\r\n * console.log( labeledInputView.view ); // A color input instance.\r\n * ```\r\n *\r\n * @internal\r\n * @param options Color input options.\r\n * @param options.colorConfig The configuration of the color palette displayed in the input's dropdown.\r\n * @param options.columns The configuration of the number of columns the color palette consists of in the input's dropdown.\r\n * @param options.defaultColorValue If specified, the color input view will replace the \"Remove color\" button with\r\n * the \"Restore default\" button. Instead of clearing the input field, the default color value will be set.\r\n */\r\nexport function getLabeledColorInputCreator(options) {\r\n    return (labeledFieldView, viewUid, statusUid) => {\r\n        const colorInputView = new ColorInputView(labeledFieldView.locale, {\r\n            colorDefinitions: colorConfigToColorGridDefinitions(options.colorConfig),\r\n            columns: options.columns,\r\n            defaultColorValue: options.defaultColorValue\r\n        });\r\n        colorInputView.inputView.set({\r\n            id: viewUid,\r\n            ariaDescribedById: statusUid\r\n        });\r\n        colorInputView.bind('isReadOnly').to(labeledFieldView, 'isEnabled', value => !value);\r\n        colorInputView.bind('hasError').to(labeledFieldView, 'errorText', value => !!value);\r\n        colorInputView.on('input', () => {\r\n            // UX: Make the error text disappear and disable the error indicator as the user\r\n            // starts fixing the errors.\r\n            labeledFieldView.errorText = null;\r\n        });\r\n        labeledFieldView.bind('isEmpty', 'isFocused').to(colorInputView);\r\n        return colorInputView;\r\n    };\r\n}\r\n/**\r\n * A simple helper method to detect number strings.\r\n * I allows full number notation, so omitting 0 is not allowed:\r\n */\r\nfunction isNumberString(value) {\r\n    const parsedValue = parseFloat(value);\r\n    return !Number.isNaN(parsedValue) && value === String(parsedValue);\r\n}\r\nfunction colorConfigToColorGridDefinitions(colorConfig) {\r\n    return colorConfig.map(item => ({\r\n        color: item.model,\r\n        label: item.label,\r\n        options: {\r\n            hasBorder: item.hasBorder\r\n        }\r\n    }));\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./formrow.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/ui/formrowview\r\n */\r\nimport { View } from 'ckeditor5/src/ui';\r\nimport '../../theme/formrow.css';\r\n/**\r\n * The class representing a single row in a complex form,\r\n * used by {@link module:table/tablecellproperties/ui/tablecellpropertiesview~TableCellPropertiesView}.\r\n *\r\n * **Note**: For now this class is private. When more use cases arrive (beyond ckeditor5-table),\r\n * it will become a component in ckeditor5-ui.\r\n *\r\n * @internal\r\n */\r\nexport default class FormRowView extends View {\r\n    /**\r\n     * Creates an instance of the form row class.\r\n     *\r\n     * @param locale The locale instance.\r\n     * @param options.labelView When passed, the row gets the `group` and `aria-labelledby`\r\n     * DOM attributes and gets described by the label.\r\n     */\r\n    constructor(locale, options = {}) {\r\n        super(locale);\r\n        const bind = this.bindTemplate;\r\n        this.set('class', options.class || null);\r\n        this.children = this.createCollection();\r\n        if (options.children) {\r\n            options.children.forEach(child => this.children.add(child));\r\n        }\r\n        this.set('_role', null);\r\n        this.set('_ariaLabelledBy', null);\r\n        if (options.labelView) {\r\n            this.set({\r\n                _role: 'group',\r\n                _ariaLabelledBy: options.labelView.id\r\n            });\r\n        }\r\n        this.setTemplate({\r\n            tag: 'div',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-form__row',\r\n                    bind.to('class')\r\n                ],\r\n                role: bind.to('_role'),\r\n                'aria-labelledby': bind.to('_ariaLabelledBy')\r\n            },\r\n            children: this.children\r\n        });\r\n    }\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./form.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./tableform.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./tablecellproperties.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/tablecellproperties/ui/tablecellpropertiesview\r\n */\r\nimport { addListToDropdown, ButtonView, createLabeledDropdown, createLabeledInputText, FocusCycler, FormHeaderView, LabeledFieldView, LabelView, submitHandler, ToolbarView, View, ViewCollection } from 'ckeditor5/src/ui';\r\nimport { KeystrokeHandler, FocusTracker } from 'ckeditor5/src/utils';\r\nimport { icons } from 'ckeditor5/src/core';\r\nimport { fillToolbar, getBorderStyleDefinitions, getBorderStyleLabels, getLabeledColorInputCreator } from '../../utils/ui/table-properties';\r\nimport FormRowView from '../../ui/formrowview';\r\nimport '../../../theme/form.css';\r\nimport '../../../theme/tableform.css';\r\nimport '../../../theme/tablecellproperties.css';\r\nconst ALIGNMENT_ICONS = {\r\n    left: icons.alignLeft,\r\n    center: icons.alignCenter,\r\n    right: icons.alignRight,\r\n    justify: icons.alignJustify,\r\n    top: icons.alignTop,\r\n    middle: icons.alignMiddle,\r\n    bottom: icons.alignBottom\r\n};\r\n/**\r\n * The class representing a table cell properties form, allowing users to customize\r\n * certain style aspects of a table cell, for instance, border, padding, text alignment, etc..\r\n */\r\nexport default class TableCellPropertiesView extends View {\r\n    /**\r\n     * @param locale The {@link module:core/editor/editor~Editor#locale} instance.\r\n     * @param options Additional configuration of the view.\r\n     * @param options.borderColors A configuration of the border color palette used by the\r\n     * {@link module:table/tablecellproperties/ui/tablecellpropertiesview~TableCellPropertiesView#borderColorInput}.\r\n     * @param options.backgroundColors A configuration of the background color palette used by the\r\n     * {@link module:table/tablecellproperties/ui/tablecellpropertiesview~TableCellPropertiesView#backgroundInput}.\r\n     * @param options.defaultTableCellProperties The default table cell properties.\r\n     */\r\n    constructor(locale, options) {\r\n        super(locale);\r\n        this.set({\r\n            borderStyle: '',\r\n            borderWidth: '',\r\n            borderColor: '',\r\n            padding: '',\r\n            backgroundColor: '',\r\n            width: '',\r\n            height: '',\r\n            horizontalAlignment: '',\r\n            verticalAlignment: ''\r\n        });\r\n        this.options = options;\r\n        const { borderStyleDropdown, borderWidthInput, borderColorInput, borderRowLabel } = this._createBorderFields();\r\n        const { backgroundRowLabel, backgroundInput } = this._createBackgroundFields();\r\n        const { widthInput, operatorLabel, heightInput, dimensionsLabel } = this._createDimensionFields();\r\n        const { horizontalAlignmentToolbar, verticalAlignmentToolbar, alignmentLabel } = this._createAlignmentFields();\r\n        this.focusTracker = new FocusTracker();\r\n        this.keystrokes = new KeystrokeHandler();\r\n        this.children = this.createCollection();\r\n        this.borderStyleDropdown = borderStyleDropdown;\r\n        this.borderWidthInput = borderWidthInput;\r\n        this.borderColorInput = borderColorInput;\r\n        this.backgroundInput = backgroundInput;\r\n        this.paddingInput = this._createPaddingField();\r\n        this.widthInput = widthInput;\r\n        this.heightInput = heightInput;\r\n        this.horizontalAlignmentToolbar = horizontalAlignmentToolbar;\r\n        this.verticalAlignmentToolbar = verticalAlignmentToolbar;\r\n        // Defer creating to make sure other fields are present and the Save button can\r\n        // bind its #isEnabled to their error messages so there's no way to save unless all\r\n        // fields are valid.\r\n        const { saveButtonView, cancelButtonView } = this._createActionButtons();\r\n        this.saveButtonView = saveButtonView;\r\n        this.cancelButtonView = cancelButtonView;\r\n        this._focusables = new ViewCollection();\r\n        this._focusCycler = new FocusCycler({\r\n            focusables: this._focusables,\r\n            focusTracker: this.focusTracker,\r\n            keystrokeHandler: this.keystrokes,\r\n            actions: {\r\n                // Navigate form fields backwards using the Shift + Tab keystroke.\r\n                focusPrevious: 'shift + tab',\r\n                // Navigate form fields forwards using the Tab key.\r\n                focusNext: 'tab'\r\n            }\r\n        });\r\n        // Form header.\r\n        this.children.add(new FormHeaderView(locale, {\r\n            label: this.t('Cell properties')\r\n        }));\r\n        // Border row.\r\n        this.children.add(new FormRowView(locale, {\r\n            labelView: borderRowLabel,\r\n            children: [\r\n                borderRowLabel,\r\n                borderStyleDropdown,\r\n                borderColorInput,\r\n                borderWidthInput\r\n            ],\r\n            class: 'ck-table-form__border-row'\r\n        }));\r\n        // Background.\r\n        this.children.add(new FormRowView(locale, {\r\n            labelView: backgroundRowLabel,\r\n            children: [\r\n                backgroundRowLabel,\r\n                backgroundInput\r\n            ],\r\n            class: 'ck-table-form__background-row'\r\n        }));\r\n        // Dimensions row and padding.\r\n        this.children.add(new FormRowView(locale, {\r\n            children: [\r\n                // Dimensions row.\r\n                new FormRowView(locale, {\r\n                    labelView: dimensionsLabel,\r\n                    children: [\r\n                        dimensionsLabel,\r\n                        widthInput,\r\n                        operatorLabel,\r\n                        heightInput\r\n                    ],\r\n                    class: 'ck-table-form__dimensions-row'\r\n                }),\r\n                // Padding row.\r\n                new FormRowView(locale, {\r\n                    children: [\r\n                        this.paddingInput\r\n                    ],\r\n                    class: 'ck-table-cell-properties-form__padding-row'\r\n                })\r\n            ]\r\n        }));\r\n        // Text alignment row.\r\n        this.children.add(new FormRowView(locale, {\r\n            labelView: alignmentLabel,\r\n            children: [\r\n                alignmentLabel,\r\n                horizontalAlignmentToolbar,\r\n                verticalAlignmentToolbar\r\n            ],\r\n            class: 'ck-table-cell-properties-form__alignment-row'\r\n        }));\r\n        // Action row.\r\n        this.children.add(new FormRowView(locale, {\r\n            children: [\r\n                this.saveButtonView,\r\n                this.cancelButtonView\r\n            ],\r\n            class: 'ck-table-form__action-row'\r\n        }));\r\n        this.setTemplate({\r\n            tag: 'form',\r\n            attributes: {\r\n                class: [\r\n                    'ck',\r\n                    'ck-form',\r\n                    'ck-table-form',\r\n                    'ck-table-cell-properties-form'\r\n                ],\r\n                // https://github.com/ckeditor/ckeditor5-link/issues/90\r\n                tabindex: '-1'\r\n            },\r\n            children: this.children\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    render() {\r\n        super.render();\r\n        // Enable the \"submit\" event for this view. It can be triggered by the #saveButtonView\r\n        // which is of the \"submit\" DOM \"type\".\r\n        submitHandler({\r\n            view: this\r\n        });\r\n        [\r\n            this.borderStyleDropdown,\r\n            this.borderColorInput,\r\n            this.borderColorInput.fieldView.dropdownView.buttonView,\r\n            this.borderWidthInput,\r\n            this.backgroundInput,\r\n            this.backgroundInput.fieldView.dropdownView.buttonView,\r\n            this.widthInput,\r\n            this.heightInput,\r\n            this.paddingInput,\r\n            this.horizontalAlignmentToolbar,\r\n            this.verticalAlignmentToolbar,\r\n            this.saveButtonView,\r\n            this.cancelButtonView\r\n        ].forEach(view => {\r\n            // Register the view as focusable.\r\n            this._focusables.add(view);\r\n            // Register the view in the focus tracker.\r\n            this.focusTracker.add(view.element);\r\n        });\r\n        // Mainly for closing using \"Esc\" and navigation using \"Tab\".\r\n        this.keystrokes.listenTo(this.element);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        this.focusTracker.destroy();\r\n        this.keystrokes.destroy();\r\n    }\r\n    /**\r\n     * Focuses the fist focusable field in the form.\r\n     */\r\n    focus() {\r\n        this._focusCycler.focusFirst();\r\n    }\r\n    /**\r\n     * Creates the following form fields:\r\n     *\r\n     * * {@link #borderStyleDropdown},\r\n     * * {@link #borderWidthInput},\r\n     * * {@link #borderColorInput}.\r\n     */\r\n    _createBorderFields() {\r\n        const defaultTableCellProperties = this.options.defaultTableCellProperties;\r\n        const defaultBorder = {\r\n            style: defaultTableCellProperties.borderStyle,\r\n            width: defaultTableCellProperties.borderWidth,\r\n            color: defaultTableCellProperties.borderColor\r\n        };\r\n        const colorInputCreator = getLabeledColorInputCreator({\r\n            colorConfig: this.options.borderColors,\r\n            columns: 5,\r\n            defaultColorValue: defaultBorder.color\r\n        });\r\n        const locale = this.locale;\r\n        const t = this.t;\r\n        const accessibleLabel = t('Style');\r\n        // -- Group label ---------------------------------------------\r\n        const borderRowLabel = new LabelView(locale);\r\n        borderRowLabel.text = t('Border');\r\n        // -- Style ---------------------------------------------------\r\n        const styleLabels = getBorderStyleLabels(t);\r\n        const borderStyleDropdown = new LabeledFieldView(locale, createLabeledDropdown);\r\n        borderStyleDropdown.set({\r\n            label: accessibleLabel,\r\n            class: 'ck-table-form__border-style'\r\n        });\r\n        borderStyleDropdown.fieldView.buttonView.set({\r\n            ariaLabel: accessibleLabel,\r\n            ariaLabelledBy: undefined,\r\n            isOn: false,\r\n            withText: true,\r\n            tooltip: accessibleLabel\r\n        });\r\n        borderStyleDropdown.fieldView.buttonView.bind('label').to(this, 'borderStyle', value => {\r\n            return styleLabels[value ? value : 'none'];\r\n        });\r\n        borderStyleDropdown.fieldView.on('execute', evt => {\r\n            this.borderStyle = evt.source._borderStyleValue;\r\n        });\r\n        borderStyleDropdown.bind('isEmpty').to(this, 'borderStyle', value => !value);\r\n        addListToDropdown(borderStyleDropdown.fieldView, getBorderStyleDefinitions(this, defaultBorder.style), {\r\n            role: 'menu',\r\n            ariaLabel: accessibleLabel\r\n        });\r\n        // -- Width ---------------------------------------------------\r\n        const borderWidthInput = new LabeledFieldView(locale, createLabeledInputText);\r\n        borderWidthInput.set({\r\n            label: t('Width'),\r\n            class: 'ck-table-form__border-width'\r\n        });\r\n        borderWidthInput.fieldView.bind('value').to(this, 'borderWidth');\r\n        borderWidthInput.bind('isEnabled').to(this, 'borderStyle', isBorderStyleSet);\r\n        borderWidthInput.fieldView.on('input', () => {\r\n            this.borderWidth = borderWidthInput.fieldView.element.value;\r\n        });\r\n        // -- Color ---------------------------------------------------\r\n        const borderColorInput = new LabeledFieldView(locale, colorInputCreator);\r\n        borderColorInput.set({\r\n            label: t('Color'),\r\n            class: 'ck-table-form__border-color'\r\n        });\r\n        borderColorInput.fieldView.bind('value').to(this, 'borderColor');\r\n        borderColorInput.bind('isEnabled').to(this, 'borderStyle', isBorderStyleSet);\r\n        borderColorInput.fieldView.on('input', () => {\r\n            this.borderColor = borderColorInput.fieldView.value;\r\n        });\r\n        // Reset the border color and width fields depending on the `border-style` value.\r\n        this.on('change:borderStyle', (evt, name, newValue, oldValue) => {\r\n            // When removing the border (`border-style:none`), clear the remaining `border-*` properties.\r\n            // See: https://github.com/ckeditor/ckeditor5/issues/6227.\r\n            if (!isBorderStyleSet(newValue)) {\r\n                this.borderColor = '';\r\n                this.borderWidth = '';\r\n            }\r\n            // When setting the `border-style` from `none`, set the default `border-color` and `border-width` properties.\r\n            if (!isBorderStyleSet(oldValue)) {\r\n                this.borderColor = defaultBorder.color;\r\n                this.borderWidth = defaultBorder.width;\r\n            }\r\n        });\r\n        return {\r\n            borderRowLabel,\r\n            borderStyleDropdown,\r\n            borderColorInput,\r\n            borderWidthInput\r\n        };\r\n    }\r\n    /**\r\n     * Creates the following form fields:\r\n     *\r\n     * * {@link #backgroundInput}.\r\n     */\r\n    _createBackgroundFields() {\r\n        const locale = this.locale;\r\n        const t = this.t;\r\n        // -- Group label ---------------------------------------------\r\n        const backgroundRowLabel = new LabelView(locale);\r\n        backgroundRowLabel.text = t('Background');\r\n        // -- Background color input -----------------------------------\r\n        const colorInputCreator = getLabeledColorInputCreator({\r\n            colorConfig: this.options.backgroundColors,\r\n            columns: 5,\r\n            defaultColorValue: this.options.defaultTableCellProperties.backgroundColor\r\n        });\r\n        const backgroundInput = new LabeledFieldView(locale, colorInputCreator);\r\n        backgroundInput.set({\r\n            label: t('Color'),\r\n            class: 'ck-table-cell-properties-form__background'\r\n        });\r\n        backgroundInput.fieldView.bind('value').to(this, 'backgroundColor');\r\n        backgroundInput.fieldView.on('input', () => {\r\n            this.backgroundColor = backgroundInput.fieldView.value;\r\n        });\r\n        return {\r\n            backgroundRowLabel,\r\n            backgroundInput\r\n        };\r\n    }\r\n    /**\r\n     * Creates the following form fields:\r\n     *\r\n     * * {@link #widthInput}.\r\n     * * {@link #heightInput}.\r\n     */\r\n    _createDimensionFields() {\r\n        const locale = this.locale;\r\n        const t = this.t;\r\n        // -- Label ---------------------------------------------------\r\n        const dimensionsLabel = new LabelView(locale);\r\n        dimensionsLabel.text = t('Dimensions');\r\n        // -- Width ---------------------------------------------------\r\n        const widthInput = new LabeledFieldView(locale, createLabeledInputText);\r\n        widthInput.set({\r\n            label: t('Width'),\r\n            class: 'ck-table-form__dimensions-row__width'\r\n        });\r\n        widthInput.fieldView.bind('value').to(this, 'width');\r\n        widthInput.fieldView.on('input', () => {\r\n            this.width = widthInput.fieldView.element.value;\r\n        });\r\n        // -- Operator ---------------------------------------------------\r\n        const operatorLabel = new View(locale);\r\n        operatorLabel.setTemplate({\r\n            tag: 'span',\r\n            attributes: {\r\n                class: [\r\n                    'ck-table-form__dimension-operator'\r\n                ]\r\n            },\r\n            children: [\r\n                { text: '×' }\r\n            ]\r\n        });\r\n        // -- Height ---------------------------------------------------\r\n        const heightInput = new LabeledFieldView(locale, createLabeledInputText);\r\n        heightInput.set({\r\n            label: t('Height'),\r\n            class: 'ck-table-form__dimensions-row__height'\r\n        });\r\n        heightInput.fieldView.bind('value').to(this, 'height');\r\n        heightInput.fieldView.on('input', () => {\r\n            this.height = heightInput.fieldView.element.value;\r\n        });\r\n        return {\r\n            dimensionsLabel,\r\n            widthInput,\r\n            operatorLabel,\r\n            heightInput\r\n        };\r\n    }\r\n    /**\r\n     * Creates the following form fields:\r\n     *\r\n     * * {@link #paddingInput}.\r\n     */\r\n    _createPaddingField() {\r\n        const locale = this.locale;\r\n        const t = this.t;\r\n        const paddingInput = new LabeledFieldView(locale, createLabeledInputText);\r\n        paddingInput.set({\r\n            label: t('Padding'),\r\n            class: 'ck-table-cell-properties-form__padding'\r\n        });\r\n        paddingInput.fieldView.bind('value').to(this, 'padding');\r\n        paddingInput.fieldView.on('input', () => {\r\n            this.padding = paddingInput.fieldView.element.value;\r\n        });\r\n        return paddingInput;\r\n    }\r\n    /**\r\n     * Creates the following form fields:\r\n     *\r\n     * * {@link #horizontalAlignmentToolbar},\r\n     * * {@link #verticalAlignmentToolbar}.\r\n     */\r\n    _createAlignmentFields() {\r\n        const locale = this.locale;\r\n        const t = this.t;\r\n        const alignmentLabel = new LabelView(locale);\r\n        alignmentLabel.text = t('Table cell text alignment');\r\n        // -- Horizontal ---------------------------------------------------\r\n        const horizontalAlignmentToolbar = new ToolbarView(locale);\r\n        const isContentRTL = locale.contentLanguageDirection === 'rtl';\r\n        horizontalAlignmentToolbar.set({\r\n            isCompact: true,\r\n            ariaLabel: t('Horizontal text alignment toolbar')\r\n        });\r\n        fillToolbar({\r\n            view: this,\r\n            icons: ALIGNMENT_ICONS,\r\n            toolbar: horizontalAlignmentToolbar,\r\n            labels: this._horizontalAlignmentLabels,\r\n            propertyName: 'horizontalAlignment',\r\n            nameToValue: name => {\r\n                // For the RTL content, we want to swap the buttons \"align to the left\" and \"align to the right\".\r\n                if (isContentRTL) {\r\n                    if (name === 'left') {\r\n                        return 'right';\r\n                    }\r\n                    else if (name === 'right') {\r\n                        return 'left';\r\n                    }\r\n                }\r\n                return name;\r\n            },\r\n            defaultValue: this.options.defaultTableCellProperties.horizontalAlignment\r\n        });\r\n        // -- Vertical -----------------------------------------------------\r\n        const verticalAlignmentToolbar = new ToolbarView(locale);\r\n        verticalAlignmentToolbar.set({\r\n            isCompact: true,\r\n            ariaLabel: t('Vertical text alignment toolbar')\r\n        });\r\n        fillToolbar({\r\n            view: this,\r\n            icons: ALIGNMENT_ICONS,\r\n            toolbar: verticalAlignmentToolbar,\r\n            labels: this._verticalAlignmentLabels,\r\n            propertyName: 'verticalAlignment',\r\n            defaultValue: this.options.defaultTableCellProperties.verticalAlignment\r\n        });\r\n        return {\r\n            horizontalAlignmentToolbar,\r\n            verticalAlignmentToolbar,\r\n            alignmentLabel\r\n        };\r\n    }\r\n    /**\r\n     * Creates the following form controls:\r\n     *\r\n     * * {@link #saveButtonView},\r\n     * * {@link #cancelButtonView}.\r\n     */\r\n    _createActionButtons() {\r\n        const locale = this.locale;\r\n        const t = this.t;\r\n        const saveButtonView = new ButtonView(locale);\r\n        const cancelButtonView = new ButtonView(locale);\r\n        const fieldsThatShouldValidateToSave = [\r\n            this.borderWidthInput,\r\n            this.borderColorInput,\r\n            this.backgroundInput,\r\n            this.paddingInput\r\n        ];\r\n        saveButtonView.set({\r\n            label: t('Save'),\r\n            icon: icons.check,\r\n            class: 'ck-button-save',\r\n            type: 'submit',\r\n            withText: true\r\n        });\r\n        saveButtonView.bind('isEnabled').toMany(fieldsThatShouldValidateToSave, 'errorText', (...errorTexts) => {\r\n            return errorTexts.every(errorText => !errorText);\r\n        });\r\n        cancelButtonView.set({\r\n            label: t('Cancel'),\r\n            icon: icons.cancel,\r\n            class: 'ck-button-cancel',\r\n            withText: true\r\n        });\r\n        cancelButtonView.delegate('execute').to(this, 'cancel');\r\n        return {\r\n            saveButtonView, cancelButtonView\r\n        };\r\n    }\r\n    /**\r\n     * Provides localized labels for {@link #horizontalAlignmentToolbar} buttons.\r\n     */\r\n    get _horizontalAlignmentLabels() {\r\n        const locale = this.locale;\r\n        const t = this.t;\r\n        const left = t('Align cell text to the left');\r\n        const center = t('Align cell text to the center');\r\n        const right = t('Align cell text to the right');\r\n        const justify = t('Justify cell text');\r\n        // Returns object with a proper order of labels.\r\n        if (locale.uiLanguageDirection === 'rtl') {\r\n            return { right, center, left, justify };\r\n        }\r\n        else {\r\n            return { left, center, right, justify };\r\n        }\r\n    }\r\n    /**\r\n     * Provides localized labels for {@link #verticalAlignmentToolbar} buttons.\r\n     */\r\n    get _verticalAlignmentLabels() {\r\n        const t = this.t;\r\n        return {\r\n            top: t('Align cell text to the top'),\r\n            middle: t('Align cell text to the middle'),\r\n            bottom: t('Align cell text to the bottom')\r\n        };\r\n    }\r\n}\r\nfunction isBorderStyleSet(value) {\r\n    return value !== 'none';\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { isWidget } from 'ckeditor5/src/widget';\r\n/**\r\n * Returns a table widget editing view element if one is selected.\r\n */\r\nexport function getSelectedTableWidget(selection) {\r\n    const viewElement = selection.getSelectedElement();\r\n    if (viewElement && isTableWidget(viewElement)) {\r\n        return viewElement;\r\n    }\r\n    return null;\r\n}\r\n/**\r\n * Returns a table widget editing view element if one is among the selection's ancestors.\r\n */\r\nexport function getTableWidgetAncestor(selection) {\r\n    const selectionPosition = selection.getFirstPosition();\r\n    if (!selectionPosition) {\r\n        return null;\r\n    }\r\n    let parent = selectionPosition.parent;\r\n    while (parent) {\r\n        if (parent.is('element') && isTableWidget(parent)) {\r\n            return parent;\r\n        }\r\n        parent = parent.parent;\r\n    }\r\n    return null;\r\n}\r\n/**\r\n * Checks if a given view element is a table widget.\r\n */\r\nfunction isTableWidget(viewElement) {\r\n    return !!viewElement.getCustomProperty('table') && isWidget(viewElement);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/utils/ui/contextualballoon\r\n */\r\nimport { Rect } from 'ckeditor5/src/utils';\r\nimport { BalloonPanelView } from 'ckeditor5/src/ui';\r\nimport { getTableWidgetAncestor } from './widget';\r\nconst DEFAULT_BALLOON_POSITIONS = BalloonPanelView.defaultPositions;\r\nconst BALLOON_POSITIONS = [\r\n    DEFAULT_BALLOON_POSITIONS.northArrowSouth,\r\n    DEFAULT_BALLOON_POSITIONS.northArrowSouthWest,\r\n    DEFAULT_BALLOON_POSITIONS.northArrowSouthEast,\r\n    DEFAULT_BALLOON_POSITIONS.southArrowNorth,\r\n    DEFAULT_BALLOON_POSITIONS.southArrowNorthWest,\r\n    DEFAULT_BALLOON_POSITIONS.southArrowNorthEast,\r\n    DEFAULT_BALLOON_POSITIONS.viewportStickyNorth\r\n];\r\n/**\r\n * A helper utility that positions the\r\n * {@link module:ui/panel/balloon/contextualballoon~ContextualBalloon contextual balloon} instance\r\n * with respect to the table in the editor content, if one is selected.\r\n *\r\n * @param editor The editor instance.\r\n * @param target Either \"cell\" or \"table\". Determines the target the balloon will be attached to.\r\n */\r\nexport function repositionContextualBalloon(editor, target) {\r\n    const balloon = editor.plugins.get('ContextualBalloon');\r\n    if (getTableWidgetAncestor(editor.editing.view.document.selection)) {\r\n        let position;\r\n        if (target === 'cell') {\r\n            position = getBalloonCellPositionData(editor);\r\n        }\r\n        else {\r\n            position = getBalloonTablePositionData(editor);\r\n        }\r\n        balloon.updatePosition(position);\r\n    }\r\n}\r\n/**\r\n * Returns the positioning options that control the geometry of the\r\n * {@link module:ui/panel/balloon/contextualballoon~ContextualBalloon contextual balloon} with respect\r\n * to the selected table in the editor content.\r\n *\r\n * @param editor The editor instance.\r\n */\r\nexport function getBalloonTablePositionData(editor) {\r\n    const firstPosition = editor.model.document.selection.getFirstPosition();\r\n    const modelTable = firstPosition.findAncestor('table');\r\n    const viewTable = editor.editing.mapper.toViewElement(modelTable);\r\n    return {\r\n        target: editor.editing.view.domConverter.mapViewToDom(viewTable),\r\n        positions: BALLOON_POSITIONS\r\n    };\r\n}\r\n/**\r\n * Returns the positioning options that control the geometry of the\r\n * {@link module:ui/panel/balloon/contextualballoon~ContextualBalloon contextual balloon} with respect\r\n * to the selected table cell in the editor content.\r\n *\r\n * @param editor The editor instance.\r\n */\r\nexport function getBalloonCellPositionData(editor) {\r\n    const mapper = editor.editing.mapper;\r\n    const domConverter = editor.editing.view.domConverter;\r\n    const selection = editor.model.document.selection;\r\n    if (selection.rangeCount > 1) {\r\n        return {\r\n            target: () => createBoundingRect(selection.getRanges(), editor),\r\n            positions: BALLOON_POSITIONS\r\n        };\r\n    }\r\n    const modelTableCell = getTableCellAtPosition(selection.getFirstPosition());\r\n    const viewTableCell = mapper.toViewElement(modelTableCell);\r\n    return {\r\n        target: domConverter.mapViewToDom(viewTableCell),\r\n        positions: BALLOON_POSITIONS\r\n    };\r\n}\r\n/**\r\n * Returns the first selected table cell from a multi-cell or in-cell selection.\r\n *\r\n * @param position Document position.\r\n */\r\nfunction getTableCellAtPosition(position) {\r\n    const isTableCellSelected = position.nodeAfter && position.nodeAfter.is('element', 'tableCell');\r\n    return isTableCellSelected ? position.nodeAfter : position.findAncestor('tableCell');\r\n}\r\n/**\r\n * Returns bounding rectangle for given model ranges.\r\n *\r\n * @param ranges Model ranges that the bounding rect should be returned for.\r\n * @param editor The editor instance.\r\n */\r\nfunction createBoundingRect(ranges, editor) {\r\n    const mapper = editor.editing.mapper;\r\n    const domConverter = editor.editing.view.domConverter;\r\n    const rects = Array.from(ranges).map(range => {\r\n        const modelTableCell = getTableCellAtPosition(range.start);\r\n        const viewTableCell = mapper.toViewElement(modelTableCell);\r\n        return new Rect(domConverter.mapViewToDom(viewTableCell));\r\n    });\r\n    return Rect.getBoundingRect(rects);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { isObject } from 'lodash-es';\r\n/**\r\n * Returns a string if all four values of box sides are equal.\r\n *\r\n * If a string is passed, it is treated as a single value (pass-through).\r\n *\r\n * ```ts\r\n * // Returns 'foo':\r\n * getSingleValue( { top: 'foo', right: 'foo', bottom: 'foo', left: 'foo' } );\r\n * getSingleValue( 'foo' );\r\n *\r\n * // Returns undefined:\r\n * getSingleValue( { top: 'foo', right: 'foo', bottom: 'bar', left: 'foo' } );\r\n * getSingleValue( { top: 'foo', right: 'foo' } );\r\n * ```\r\n */\r\nexport function getSingleValue(objectOrString) {\r\n    if (!objectOrString || !isObject(objectOrString)) {\r\n        return objectOrString;\r\n    }\r\n    const { top, right, bottom, left } = objectOrString;\r\n    if (top == right && right == bottom && bottom == left) {\r\n        return top;\r\n    }\r\n}\r\n/**\r\n * Adds a unit to a value if the value is a number or a string representing a number.\r\n *\r\n * **Note**: It does nothing to non-numeric values.\r\n *\r\n * ```ts\r\n * getSingleValue( 25, 'px' ); // '25px'\r\n * getSingleValue( 25, 'em' ); // '25em'\r\n * getSingleValue( '25em', 'px' ); // '25em'\r\n * getSingleValue( 'foo', 'px' ); // 'foo'\r\n * ```\r\n *\r\n * @param defaultUnit A default unit added to a numeric value.\r\n */\r\nexport function addDefaultUnitToNumericValue(value, defaultUnit) {\r\n    const numericValue = parseFloat(value);\r\n    if (Number.isNaN(numericValue)) {\r\n        return value;\r\n    }\r\n    if (String(numericValue) !== String(value)) {\r\n        return value;\r\n    }\r\n    return `${numericValue}${defaultUnit}`;\r\n}\r\n/**\r\n * Returns the normalized configuration.\r\n *\r\n * @param options.includeAlignmentProperty Whether the \"alignment\" property should be added.\r\n * @param options.includePaddingProperty Whether the \"padding\" property should be added.\r\n * @param options.includeVerticalAlignmentProperty Whether the \"verticalAlignment\" property should be added.\r\n * @param options.includeHorizontalAlignmentProperty Whether the \"horizontalAlignment\" property should be added.\r\n * @param options.isRightToLeftContent Whether the content is right-to-left.\r\n */\r\nexport function getNormalizedDefaultProperties(config, options = {}) {\r\n    const normalizedConfig = {\r\n        borderStyle: 'none',\r\n        borderWidth: '',\r\n        borderColor: '',\r\n        backgroundColor: '',\r\n        width: '',\r\n        height: '',\r\n        ...config\r\n    };\r\n    if (options.includeAlignmentProperty && !normalizedConfig.alignment) {\r\n        normalizedConfig.alignment = 'center';\r\n    }\r\n    if (options.includePaddingProperty && !normalizedConfig.padding) {\r\n        normalizedConfig.padding = '';\r\n    }\r\n    if (options.includeVerticalAlignmentProperty && !normalizedConfig.verticalAlignment) {\r\n        normalizedConfig.verticalAlignment = 'middle';\r\n    }\r\n    if (options.includeHorizontalAlignmentProperty && !normalizedConfig.horizontalAlignment) {\r\n        normalizedConfig.horizontalAlignment = options.isRightToLeftContent ? 'right' : 'left';\r\n    }\r\n    return normalizedConfig;\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/tablecellproperties/tablecellpropertiesui\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { ButtonView, clickOutsideHandler, ContextualBalloon, getLocalizedColorOptions, normalizeColorOptions } from 'ckeditor5/src/ui';\r\nimport TableCellPropertiesView from './ui/tablecellpropertiesview';\r\nimport { colorFieldValidator, getLocalizedColorErrorText, getLocalizedLengthErrorText, defaultColors, lengthFieldValidator, lineWidthFieldValidator } from '../utils/ui/table-properties';\r\nimport { debounce } from 'lodash-es';\r\nimport { getTableWidgetAncestor } from '../utils/ui/widget';\r\nimport { getBalloonCellPositionData, repositionContextualBalloon } from '../utils/ui/contextualballoon';\r\nimport tableCellProperties from './../../theme/icons/table-cell-properties.svg';\r\nimport { getNormalizedDefaultProperties } from '../utils/table-properties';\r\nconst ERROR_TEXT_TIMEOUT = 500;\r\n// Map of view properties and related commands.\r\nconst propertyToCommandMap = {\r\n    borderStyle: 'tableCellBorderStyle',\r\n    borderColor: 'tableCellBorderColor',\r\n    borderWidth: 'tableCellBorderWidth',\r\n    height: 'tableCellHeight',\r\n    width: 'tableCellWidth',\r\n    padding: 'tableCellPadding',\r\n    backgroundColor: 'tableCellBackgroundColor',\r\n    horizontalAlignment: 'tableCellHorizontalAlignment',\r\n    verticalAlignment: 'tableCellVerticalAlignment'\r\n};\r\n/**\r\n * The table cell properties UI plugin. It introduces the `'tableCellProperties'` button\r\n * that opens a form allowing to specify the visual styling of a table cell.\r\n *\r\n * It uses the {@link module:ui/panel/balloon/contextualballoon~ContextualBalloon contextual balloon plugin}.\r\n */\r\nexport default class TableCellPropertiesUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ContextualBalloon];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'TableCellPropertiesUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        editor.config.define('table.tableCellProperties', {\r\n            borderColors: defaultColors,\r\n            backgroundColors: defaultColors\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        this._defaultTableCellProperties = getNormalizedDefaultProperties(editor.config.get('table.tableCellProperties.defaultProperties'), {\r\n            includeVerticalAlignmentProperty: true,\r\n            includeHorizontalAlignmentProperty: true,\r\n            includePaddingProperty: true,\r\n            isRightToLeftContent: editor.locale.contentLanguageDirection === 'rtl'\r\n        });\r\n        this._balloon = editor.plugins.get(ContextualBalloon);\r\n        this.view = null;\r\n        this._isReady = false;\r\n        editor.ui.componentFactory.add('tableCellProperties', locale => {\r\n            const view = new ButtonView(locale);\r\n            view.set({\r\n                label: t('Cell properties'),\r\n                icon: tableCellProperties,\r\n                tooltip: true\r\n            });\r\n            this.listenTo(view, 'execute', () => this._showView());\r\n            const commands = Object.values(propertyToCommandMap)\r\n                .map(commandName => editor.commands.get(commandName));\r\n            view.bind('isEnabled').toMany(commands, 'isEnabled', (...areEnabled) => (areEnabled.some(isCommandEnabled => isCommandEnabled)));\r\n            return view;\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        // Destroy created UI components as they are not automatically destroyed.\r\n        // See https://github.com/ckeditor/ckeditor5/issues/1341.\r\n        if (this.view) {\r\n            this.view.destroy();\r\n        }\r\n    }\r\n    /**\r\n     * Creates the {@link module:table/tablecellproperties/ui/tablecellpropertiesview~TableCellPropertiesView} instance.\r\n     *\r\n     * @returns The cell properties form view instance.\r\n     */\r\n    _createPropertiesView() {\r\n        const editor = this.editor;\r\n        const config = editor.config.get('table.tableCellProperties');\r\n        const borderColorsConfig = normalizeColorOptions(config.borderColors);\r\n        const localizedBorderColors = getLocalizedColorOptions(editor.locale, borderColorsConfig);\r\n        const backgroundColorsConfig = normalizeColorOptions(config.backgroundColors);\r\n        const localizedBackgroundColors = getLocalizedColorOptions(editor.locale, backgroundColorsConfig);\r\n        const view = new TableCellPropertiesView(editor.locale, {\r\n            borderColors: localizedBorderColors,\r\n            backgroundColors: localizedBackgroundColors,\r\n            defaultTableCellProperties: this._defaultTableCellProperties\r\n        });\r\n        const t = editor.t;\r\n        // Render the view so its #element is available for the clickOutsideHandler.\r\n        view.render();\r\n        this.listenTo(view, 'submit', () => {\r\n            this._hideView();\r\n        });\r\n        this.listenTo(view, 'cancel', () => {\r\n            // https://github.com/ckeditor/ckeditor5/issues/6180\r\n            if (this._undoStepBatch.operations.length) {\r\n                editor.execute('undo', this._undoStepBatch);\r\n            }\r\n            this._hideView();\r\n        });\r\n        // Close the balloon on Esc key press.\r\n        view.keystrokes.set('Esc', (data, cancel) => {\r\n            this._hideView();\r\n            cancel();\r\n        });\r\n        // Close on click outside of balloon panel element.\r\n        clickOutsideHandler({\r\n            emitter: view,\r\n            activator: () => this._isViewInBalloon,\r\n            contextElements: [this._balloon.view.element],\r\n            callback: () => this._hideView()\r\n        });\r\n        const colorErrorText = getLocalizedColorErrorText(t);\r\n        const lengthErrorText = getLocalizedLengthErrorText(t);\r\n        // Create the \"UI -> editor data\" binding.\r\n        // These listeners update the editor data (via table commands) when any observable\r\n        // property of the view has changed. They also validate the value and display errors in the UI\r\n        // when necessary. This makes the view live, which means the changes are\r\n        // visible in the editing as soon as the user types or changes fields' values.\r\n        view.on('change:borderStyle', this._getPropertyChangeCallback('tableCellBorderStyle'));\r\n        view.on('change:borderColor', this._getValidatedPropertyChangeCallback({\r\n            viewField: view.borderColorInput,\r\n            commandName: 'tableCellBorderColor',\r\n            errorText: colorErrorText,\r\n            validator: colorFieldValidator\r\n        }));\r\n        view.on('change:borderWidth', this._getValidatedPropertyChangeCallback({\r\n            viewField: view.borderWidthInput,\r\n            commandName: 'tableCellBorderWidth',\r\n            errorText: lengthErrorText,\r\n            validator: lineWidthFieldValidator\r\n        }));\r\n        view.on('change:padding', this._getValidatedPropertyChangeCallback({\r\n            viewField: view.paddingInput,\r\n            commandName: 'tableCellPadding',\r\n            errorText: lengthErrorText,\r\n            validator: lengthFieldValidator\r\n        }));\r\n        view.on('change:width', this._getValidatedPropertyChangeCallback({\r\n            viewField: view.widthInput,\r\n            commandName: 'tableCellWidth',\r\n            errorText: lengthErrorText,\r\n            validator: lengthFieldValidator\r\n        }));\r\n        view.on('change:height', this._getValidatedPropertyChangeCallback({\r\n            viewField: view.heightInput,\r\n            commandName: 'tableCellHeight',\r\n            errorText: lengthErrorText,\r\n            validator: lengthFieldValidator\r\n        }));\r\n        view.on('change:backgroundColor', this._getValidatedPropertyChangeCallback({\r\n            viewField: view.backgroundInput,\r\n            commandName: 'tableCellBackgroundColor',\r\n            errorText: colorErrorText,\r\n            validator: colorFieldValidator\r\n        }));\r\n        view.on('change:horizontalAlignment', this._getPropertyChangeCallback('tableCellHorizontalAlignment'));\r\n        view.on('change:verticalAlignment', this._getPropertyChangeCallback('tableCellVerticalAlignment'));\r\n        return view;\r\n    }\r\n    /**\r\n     * In this method the \"editor data -> UI\" binding is happening.\r\n     *\r\n     * When executed, this method obtains selected cell property values from various table commands\r\n     * and passes them to the {@link #view}.\r\n     *\r\n     * This way, the UI stays up–to–date with the editor data.\r\n     */\r\n    _fillViewFormFromCommandValues() {\r\n        const commands = this.editor.commands;\r\n        const borderStyleCommand = commands.get('tableCellBorderStyle');\r\n        Object.entries(propertyToCommandMap)\r\n            .map(([property, commandName]) => {\r\n            const defaultValue = this._defaultTableCellProperties[property] || '';\r\n            return [\r\n                property,\r\n                commands.get(commandName).value || defaultValue\r\n            ];\r\n        })\r\n            .forEach(([property, value]) => {\r\n            // Do not set the `border-color` and `border-width` fields if `border-style:none`.\r\n            if ((property === 'borderColor' || property === 'borderWidth') && borderStyleCommand.value === 'none') {\r\n                return;\r\n            }\r\n            this.view.set(property, value);\r\n        });\r\n        this._isReady = true;\r\n    }\r\n    /**\r\n     * Shows the {@link #view} in the {@link #_balloon}.\r\n     *\r\n     * **Note**: Each time a view is shown, a new {@link #_undoStepBatch} is created. It contains\r\n     * all changes made to the document when the view is visible, allowing a single undo step\r\n     * for all of them.\r\n     */\r\n    _showView() {\r\n        const editor = this.editor;\r\n        if (!this.view) {\r\n            this.view = this._createPropertiesView();\r\n        }\r\n        this.listenTo(editor.ui, 'update', () => {\r\n            this._updateView();\r\n        });\r\n        // Update the view with the model values.\r\n        this._fillViewFormFromCommandValues();\r\n        this._balloon.add({\r\n            view: this.view,\r\n            position: getBalloonCellPositionData(editor)\r\n        });\r\n        // Create a new batch. Clicking \"Cancel\" will undo this batch.\r\n        this._undoStepBatch = editor.model.createBatch();\r\n        // Basic a11y.\r\n        this.view.focus();\r\n    }\r\n    /**\r\n     * Removes the {@link #view} from the {@link #_balloon}.\r\n     */\r\n    _hideView() {\r\n        const editor = this.editor;\r\n        this.stopListening(editor.ui, 'update');\r\n        this._isReady = false;\r\n        // Blur any input element before removing it from DOM to prevent issues in some browsers.\r\n        // See https://github.com/ckeditor/ckeditor5/issues/1501.\r\n        this.view.saveButtonView.focus();\r\n        this._balloon.remove(this.view);\r\n        // Make sure the focus is not lost in the process by putting it directly\r\n        // into the editing view.\r\n        this.editor.editing.view.focus();\r\n    }\r\n    /**\r\n     * Repositions the {@link #_balloon} or hides the {@link #view} if a table cell is no longer selected.\r\n     */\r\n    _updateView() {\r\n        const editor = this.editor;\r\n        const viewDocument = editor.editing.view.document;\r\n        if (!getTableWidgetAncestor(viewDocument.selection)) {\r\n            this._hideView();\r\n        }\r\n        else if (this._isViewVisible) {\r\n            repositionContextualBalloon(editor, 'cell');\r\n        }\r\n    }\r\n    /**\r\n     * Returns `true` when the {@link #view} is visible in the {@link #_balloon}.\r\n     */\r\n    get _isViewVisible() {\r\n        return !!this.view && this._balloon.visibleView === this.view;\r\n    }\r\n    /**\r\n     * Returns `true` when the {@link #view} is in the {@link #_balloon}.\r\n     */\r\n    get _isViewInBalloon() {\r\n        return !!this.view && this._balloon.hasView(this.view);\r\n    }\r\n    /**\r\n     * Creates a callback that when executed upon the {@link #view view's} property change\r\n     * executes a related editor command with the new property value.\r\n     *\r\n     * @param defaultValue The default value of the command.\r\n     */\r\n    _getPropertyChangeCallback(commandName) {\r\n        return (evt, propertyName, newValue) => {\r\n            if (!this._isReady) {\r\n                return;\r\n            }\r\n            this.editor.execute(commandName, {\r\n                value: newValue,\r\n                batch: this._undoStepBatch\r\n            });\r\n        };\r\n    }\r\n    /**\r\n     * Creates a callback that when executed upon the {@link #view view's} property change:\r\n     * * Executes a related editor command with the new property value if the value is valid,\r\n     * * Or sets the error text next to the invalid field, if the value did not pass the validation.\r\n     */\r\n    _getValidatedPropertyChangeCallback(options) {\r\n        const { commandName, viewField, validator, errorText } = options;\r\n        const setErrorTextDebounced = debounce(() => {\r\n            viewField.errorText = errorText;\r\n        }, ERROR_TEXT_TIMEOUT);\r\n        return (evt, propertyName, newValue) => {\r\n            setErrorTextDebounced.cancel();\r\n            // Do not execute the command on initial call (opening the table properties view).\r\n            if (!this._isReady) {\r\n                return;\r\n            }\r\n            if (validator(newValue)) {\r\n                this.editor.execute(commandName, {\r\n                    value: newValue,\r\n                    batch: this._undoStepBatch\r\n                });\r\n                viewField.errorText = null;\r\n            }\r\n            else {\r\n                setErrorTextDebounced();\r\n            }\r\n        };\r\n    }\r\n}\r\n","export default \"<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>\";","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/tablecellproperties/commands/tablecellpropertycommand\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\n/**\r\n * The table cell attribute command.\r\n *\r\n * The command is a base command for other table cell property commands.\r\n */\r\nexport default class TableCellPropertyCommand extends Command {\r\n    /**\r\n     * Creates a new `TableCellPropertyCommand` instance.\r\n     *\r\n     * @param editor An editor in which this command will be used.\r\n     * @param attributeName Table cell attribute name.\r\n     * @param defaultValue The default value of the attribute.\r\n     */\r\n    constructor(editor, attributeName, defaultValue) {\r\n        super(editor);\r\n        this.attributeName = attributeName;\r\n        this._defaultValue = defaultValue;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        const editor = this.editor;\r\n        const tableUtils = this.editor.plugins.get('TableUtils');\r\n        const selectedTableCells = tableUtils.getSelectionAffectedTableCells(editor.model.document.selection);\r\n        this.isEnabled = !!selectedTableCells.length;\r\n        this.value = this._getSingleValue(selectedTableCells);\r\n    }\r\n    /**\r\n     * Executes the command.\r\n     *\r\n     * @fires execute\r\n     * @param options.value If set, the command will set the attribute on selected table cells.\r\n     * If it is not set, the command will remove the attribute from the selected table cells.\r\n     * @param options.batch Pass the model batch instance to the command to aggregate changes,\r\n     * for example to allow a single undo step for multiple executions.\r\n     */\r\n    execute(options = {}) {\r\n        const { value, batch } = options;\r\n        const model = this.editor.model;\r\n        const tableUtils = this.editor.plugins.get('TableUtils');\r\n        const tableCells = tableUtils.getSelectionAffectedTableCells(model.document.selection);\r\n        const valueToSet = this._getValueToSet(value);\r\n        model.enqueueChange(batch, writer => {\r\n            if (valueToSet) {\r\n                tableCells.forEach(tableCell => writer.setAttribute(this.attributeName, valueToSet, tableCell));\r\n            }\r\n            else {\r\n                tableCells.forEach(tableCell => writer.removeAttribute(this.attributeName, tableCell));\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Returns the attribute value for a table cell.\r\n     */\r\n    _getAttribute(tableCell) {\r\n        if (!tableCell) {\r\n            return;\r\n        }\r\n        const value = tableCell.getAttribute(this.attributeName);\r\n        if (value === this._defaultValue) {\r\n            return;\r\n        }\r\n        return value;\r\n    }\r\n    /**\r\n     * Returns the proper model value. It can be used to add a default unit to numeric values.\r\n     */\r\n    _getValueToSet(value) {\r\n        if (value === this._defaultValue) {\r\n            return;\r\n        }\r\n        return value;\r\n    }\r\n    /**\r\n     * Returns a single value for all selected table cells. If the value is the same for all cells,\r\n     * it will be returned (`undefined` otherwise).\r\n     */\r\n    _getSingleValue(tableCells) {\r\n        const firstCellValue = this._getAttribute(tableCells[0]);\r\n        const everyCellHasAttribute = tableCells.every(tableCells => this._getAttribute(tableCells) === firstCellValue);\r\n        return everyCellHasAttribute ? firstCellValue : undefined;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport TableCellPropertyCommand from '../../tablecellproperties/commands/tablecellpropertycommand';\r\nimport { addDefaultUnitToNumericValue } from '../../utils/table-properties';\r\n/**\r\n * The table cell width command.\r\n *\r\n * The command is registered by the {@link module:table/tablecellwidth/tablecellwidthediting~TableCellWidthEditing} as\r\n * the `'tableCellWidth'` editor command.\r\n *\r\n * To change the width of selected cells, execute the command:\r\n *\r\n * ```ts\r\n * editor.execute( 'tableCellWidth', {\r\n *   value: '50px'\r\n * } );\r\n * ```\r\n *\r\n * **Note**: This command adds a default `'px'` unit to numeric values. Executing:\r\n *\r\n * ```ts\r\n * editor.execute( 'tableCellWidth', {\r\n *   value: '50'\r\n * } );\r\n * ```\r\n *\r\n * will set the `width` attribute to `'50px'` in the model.\r\n */\r\nexport default class TableCellWidthCommand extends TableCellPropertyCommand {\r\n    /**\r\n     * Creates a new `TableCellWidthCommand` instance.\r\n     *\r\n     * @param editor An editor in which this command will be used.\r\n     * @param defaultValue The default value of the attribute.\r\n     */\r\n    constructor(editor, defaultValue) {\r\n        super(editor, 'tableCellWidth', defaultValue);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    _getValueToSet(value) {\r\n        value = addDefaultUnitToNumericValue(value, 'px');\r\n        if (value === this._defaultValue) {\r\n            return;\r\n        }\r\n        return value;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/tablecellwidth/tablecellwidthediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport TableEditing from './../tableediting';\r\nimport TableCellWidthCommand from './commands/tablecellwidthcommand';\r\nimport { getNormalizedDefaultProperties } from '../utils/table-properties';\r\nimport { enableProperty } from '../utils/common';\r\n/**\r\n * The table cell width editing feature.\r\n *\r\n * Introduces `tableCellWidth` table cell model attribute alongside with its converters\r\n * and a command.\r\n */\r\nexport default class TableCellWidthEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'TableCellWidthEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [TableEditing];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const defaultTableCellProperties = getNormalizedDefaultProperties(editor.config.get('table.tableCellProperties.defaultProperties'));\r\n        enableProperty(editor.model.schema, editor.conversion, {\r\n            modelAttribute: 'tableCellWidth',\r\n            styleName: 'width',\r\n            defaultValue: defaultTableCellProperties.width\r\n        });\r\n        editor.commands.add('tableCellWidth', new TableCellWidthCommand(editor, defaultTableCellProperties.width));\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport TableCellPropertyCommand from './tablecellpropertycommand';\r\nimport { addDefaultUnitToNumericValue, getSingleValue } from '../../utils/table-properties';\r\n/**\r\n * The table cell padding command.\r\n *\r\n * The command is registered by the {@link module:table/tablecellproperties/tablecellpropertiesediting~TableCellPropertiesEditing} as\r\n * the `'tableCellPadding'` editor command.\r\n *\r\n * To change the padding of selected cells, execute the command:\r\n *\r\n * ```ts\r\n * editor.execute( 'tableCellPadding', {\r\n *   value: '5px'\r\n * } );\r\n * ```\r\n *\r\n * **Note**: This command adds the default `'px'` unit to numeric values. Executing:\r\n *\r\n * ```ts\r\n * editor.execute( 'tableCellPadding', {\r\n *   value: '5'\r\n * } );\r\n * ```\r\n *\r\n * will set the `padding` attribute to `'5px'` in the model.\r\n */\r\nexport default class TableCellPaddingCommand extends TableCellPropertyCommand {\r\n    /**\r\n     * Creates a new `TableCellPaddingCommand` instance.\r\n     *\r\n     * @param editor An editor in which this command will be used.\r\n     * @param defaultValue The default value of the attribute.\r\n     */\r\n    constructor(editor, defaultValue) {\r\n        super(editor, 'tableCellPadding', defaultValue);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    _getAttribute(tableCell) {\r\n        if (!tableCell) {\r\n            return;\r\n        }\r\n        const value = getSingleValue(tableCell.getAttribute(this.attributeName));\r\n        if (value === this._defaultValue) {\r\n            return;\r\n        }\r\n        return value;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    _getValueToSet(value) {\r\n        const newValue = addDefaultUnitToNumericValue(value, 'px');\r\n        if (newValue === this._defaultValue) {\r\n            return;\r\n        }\r\n        return newValue;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport TableCellPropertyCommand from './tablecellpropertycommand';\r\nimport { addDefaultUnitToNumericValue } from '../../utils/table-properties';\r\n/**\r\n * The table cell height command.\r\n *\r\n * The command is registered by the {@link module:table/tablecellproperties/tablecellpropertiesediting~TableCellPropertiesEditing} as\r\n * the `'tableCellHeight'` editor command.\r\n *\r\n * To change the height of selected cells, execute the command:\r\n *\r\n * ```ts\r\n * editor.execute( 'tableCellHeight', {\r\n *   value: '50px'\r\n * } );\r\n * ```\r\n *\r\n * **Note**: This command adds the default `'px'` unit to numeric values. Executing:\r\n *\r\n * ```ts\r\n * editor.execute( 'tableCellHeight', {\r\n *   value: '50'\r\n * } );\r\n * ```\r\n *\r\n * will set the `height` attribute to `'50px'` in the model.\r\n */\r\nexport default class TableCellHeightCommand extends TableCellPropertyCommand {\r\n    /**\r\n     * Creates a new `TableCellHeightCommand` instance.\r\n     *\r\n     * @param editor An editor in which this command will be used.\r\n     * @param defaultValue The default value of the attribute.\r\n     */\r\n    constructor(editor, defaultValue) {\r\n        super(editor, 'tableCellHeight', defaultValue);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    _getValueToSet(value) {\r\n        const newValue = addDefaultUnitToNumericValue(value, 'px');\r\n        if (newValue === this._defaultValue) {\r\n            return;\r\n        }\r\n        return newValue;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport TableCellPropertyCommand from './tablecellpropertycommand';\r\n/**\r\n * The table cell background color command.\r\n *\r\n * The command is registered by the {@link module:table/tablecellproperties/tablecellpropertiesediting~TableCellPropertiesEditing} as\r\n * the `'tableCellBackgroundColor'` editor command.\r\n *\r\n * To change the background color of selected cells, execute the command:\r\n *\r\n * ```ts\r\n * editor.execute( 'tableCellBackgroundColor', {\r\n *   value: '#f00'\r\n * } );\r\n * ```\r\n */\r\nexport default class TableCellBackgroundColorCommand extends TableCellPropertyCommand {\r\n    /**\r\n     * Creates a new `TableCellBackgroundColorCommand` instance.\r\n     *\r\n     * @param editor An editor in which this command will be used.\r\n     * @param defaultValue The default value of the attribute.\r\n     */\r\n    constructor(editor, defaultValue) {\r\n        super(editor, 'tableCellBackgroundColor', defaultValue);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport TableCellPropertyCommand from './tablecellpropertycommand';\r\n/**\r\n * The table cell vertical alignment command.\r\n *\r\n * The command is registered by the {@link module:table/tablecellproperties/tablecellpropertiesediting~TableCellPropertiesEditing} as\r\n * the `'tableCellVerticalAlignment'` editor command.\r\n *\r\n * To change the vertical text alignment of selected cells, execute the command:\r\n *\r\n * ```ts\r\n * editor.execute( 'tableCellVerticalAlignment', {\r\n *   value: 'top'\r\n * } );\r\n * ```\r\n *\r\n * The following values, corresponding to the\r\n * [`vertical-align` CSS attribute](https://developer.mozilla.org/en-US/docs/Web/CSS/vertical-align), are allowed:\r\n *\r\n * * `'top'`\r\n * * `'bottom'`\r\n *\r\n * The `'middle'` value is the default one so there is no need to set it.\r\n */\r\nexport default class TableCellVerticalAlignmentCommand extends TableCellPropertyCommand {\r\n    /**\r\n     * Creates a new `TableCellVerticalAlignmentCommand` instance.\r\n     *\r\n     * @param editor An editor in which this command will be used.\r\n     * @param defaultValue The default value for the \"alignment\" attribute.\r\n     */\r\n    constructor(editor, defaultValue) {\r\n        super(editor, 'tableCellVerticalAlignment', defaultValue);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport TableCellPropertyCommand from './tablecellpropertycommand';\r\n/**\r\n * The table cell horizontal alignment command.\r\n *\r\n * The command is registered by the {@link module:table/tablecellproperties/tablecellpropertiesediting~TableCellPropertiesEditing} as\r\n * the `'tableCellHorizontalAlignment'` editor command.\r\n *\r\n * To change the horizontal text alignment of selected cells, execute the command:\r\n *\r\n * ```ts\r\n * editor.execute( 'tableCellHorizontalAlignment', {\r\n *  value: 'right'\r\n * } );\r\n * ```\r\n */\r\nexport default class TableCellHorizontalAlignmentCommand extends TableCellPropertyCommand {\r\n    /**\r\n     * Creates a new `TableCellHorizontalAlignmentCommand` instance.\r\n     *\r\n     * @param editor An editor in which this command will be used.\r\n     * @param defaultValue The default value for the \"alignment\" attribute.\r\n     */\r\n    constructor(editor, defaultValue) {\r\n        super(editor, 'tableCellHorizontalAlignment', defaultValue);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport TableCellPropertyCommand from './tablecellpropertycommand';\r\nimport { getSingleValue } from '../../utils/table-properties';\r\n/**\r\n * The table cell border style command.\r\n *\r\n * The command is registered by the {@link module:table/tablecellproperties/tablecellpropertiesediting~TableCellPropertiesEditing} as\r\n * the `'tableCellBorderStyle'` editor command.\r\n *\r\n * To change the border style of selected cells, execute the command:\r\n *\r\n * ```ts\r\n * editor.execute( 'tableCellBorderStyle', {\r\n *   value: 'dashed'\r\n * } );\r\n * ```\r\n */\r\nexport default class TableCellBorderStyleCommand extends TableCellPropertyCommand {\r\n    /**\r\n     * Creates a new `TableCellBorderStyleCommand` instance.\r\n     *\r\n     * @param editor An editor in which this command will be used.\r\n     * @param defaultValue The default value of the attribute.\r\n     */\r\n    constructor(editor, defaultValue) {\r\n        super(editor, 'tableCellBorderStyle', defaultValue);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    _getAttribute(tableCell) {\r\n        if (!tableCell) {\r\n            return;\r\n        }\r\n        const value = getSingleValue(tableCell.getAttribute(this.attributeName));\r\n        if (value === this._defaultValue) {\r\n            return;\r\n        }\r\n        return value;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport TableCellPropertyCommand from './tablecellpropertycommand';\r\nimport { getSingleValue } from '../../utils/table-properties';\r\n/**\r\n * The table cell border color command.\r\n *\r\n * The command is registered by the {@link module:table/tablecellproperties/tablecellpropertiesediting~TableCellPropertiesEditing} as\r\n * the `'tableCellBorderColor'` editor command.\r\n *\r\n * To change the border color of selected cells, execute the command:\r\n *\r\n * ```ts\r\n * editor.execute( 'tableCellBorderColor', {\r\n *   value: '#f00'\r\n * } );\r\n * ```\r\n */\r\nexport default class TableCellBorderColorCommand extends TableCellPropertyCommand {\r\n    /**\r\n     * Creates a new `TableCellBorderColorCommand` instance.\r\n     *\r\n     * @param editor An editor in which this command will be used.\r\n     * @param defaultValue The default value of the attribute.\r\n     */\r\n    constructor(editor, defaultValue) {\r\n        super(editor, 'tableCellBorderColor', defaultValue);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    _getAttribute(tableCell) {\r\n        if (!tableCell) {\r\n            return;\r\n        }\r\n        const value = getSingleValue(tableCell.getAttribute(this.attributeName));\r\n        if (value === this._defaultValue) {\r\n            return;\r\n        }\r\n        return value;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport TableCellPropertyCommand from './tablecellpropertycommand';\r\nimport { addDefaultUnitToNumericValue, getSingleValue } from '../../utils/table-properties';\r\n/**\r\n * The table cell border width command.\r\n *\r\n * The command is registered by the {@link module:table/tablecellproperties/tablecellpropertiesediting~TableCellPropertiesEditing} as\r\n * the `'tableCellBorderWidth'` editor command.\r\n *\r\n * To change the border width of selected cells, execute the command:\r\n *\r\n * ```ts\r\n * editor.execute( 'tableCellBorderWidth', {\r\n *   value: '5px'\r\n * } );\r\n * ```\r\n *\r\n * **Note**: This command adds the default `'px'` unit to numeric values. Executing:\r\n *\r\n * ```ts\r\n * editor.execute( 'tableCellBorderWidth', {\r\n *   value: '5'\r\n * } );\r\n * ```\r\n *\r\n * will set the `borderWidth` attribute to `'5px'` in the model.\r\n */\r\nexport default class TableCellBorderWidthCommand extends TableCellPropertyCommand {\r\n    /**\r\n     * Creates a new `TableCellBorderWidthCommand` instance.\r\n     *\r\n     * @param editor An editor in which this command will be used.\r\n     * @param defaultValue The default value of the attribute.\r\n     */\r\n    constructor(editor, defaultValue) {\r\n        super(editor, 'tableCellBorderWidth', defaultValue);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    _getAttribute(tableCell) {\r\n        if (!tableCell) {\r\n            return;\r\n        }\r\n        const value = getSingleValue(tableCell.getAttribute(this.attributeName));\r\n        if (value === this._defaultValue) {\r\n            return;\r\n        }\r\n        return value;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    _getValueToSet(value) {\r\n        const newValue = addDefaultUnitToNumericValue(value, 'px');\r\n        if (newValue === this._defaultValue) {\r\n            return;\r\n        }\r\n        return newValue;\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/tablecellproperties/tablecellpropertiesediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { addBorderRules, addPaddingRules, addBackgroundRules } from 'ckeditor5/src/engine';\r\nimport { downcastAttributeToStyle, upcastBorderStyles } from './../converters/tableproperties';\r\nimport TableEditing from './../tableediting';\r\nimport TableCellWidthEditing from '../tablecellwidth/tablecellwidthediting';\r\nimport TableCellPaddingCommand from './commands/tablecellpaddingcommand';\r\nimport TableCellHeightCommand from './commands/tablecellheightcommand';\r\nimport TableCellBackgroundColorCommand from './commands/tablecellbackgroundcolorcommand';\r\nimport TableCellVerticalAlignmentCommand from './commands/tablecellverticalalignmentcommand';\r\nimport TableCellHorizontalAlignmentCommand from './commands/tablecellhorizontalalignmentcommand';\r\nimport TableCellBorderStyleCommand from './commands/tablecellborderstylecommand';\r\nimport TableCellBorderColorCommand from './commands/tablecellbordercolorcommand';\r\nimport TableCellBorderWidthCommand from './commands/tablecellborderwidthcommand';\r\nimport { getNormalizedDefaultProperties } from '../utils/table-properties';\r\nimport { enableProperty } from '../utils/common';\r\nconst VALIGN_VALUES_REG_EXP = /^(top|middle|bottom)$/;\r\nconst ALIGN_VALUES_REG_EXP = /^(left|center|right|justify)$/;\r\n/**\r\n * The table cell properties editing feature.\r\n *\r\n * Introduces table cell model attributes and their conversion:\r\n *\r\n * - border: `tableCellBorderStyle`, `tableCellBorderColor` and `tableCellBorderWidth`\r\n * - background color: `tableCellBackgroundColor`\r\n * - cell padding: `tableCellPadding`\r\n * - horizontal and vertical alignment: `tableCellHorizontalAlignment`, `tableCellVerticalAlignment`\r\n * - cell width and height: `tableCellWidth`, `tableCellHeight`\r\n *\r\n * It also registers commands used to manipulate the above attributes:\r\n *\r\n * - border: the `'tableCellBorderStyle'`, `'tableCellBorderColor'` and `'tableCellBorderWidth'` commands\r\n * - background color: the `'tableCellBackgroundColor'` command\r\n * - cell padding: the `'tableCellPadding'` command\r\n * - horizontal and vertical alignment: the `'tableCellHorizontalAlignment'` and `'tableCellVerticalAlignment'` commands\r\n * - width and height: the `'tableCellWidth'` and `'tableCellHeight'` commands\r\n */\r\nexport default class TableCellPropertiesEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'TableCellPropertiesEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [TableEditing, TableCellWidthEditing];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const schema = editor.model.schema;\r\n        const conversion = editor.conversion;\r\n        editor.config.define('table.tableCellProperties.defaultProperties', {});\r\n        const defaultTableCellProperties = getNormalizedDefaultProperties(editor.config.get('table.tableCellProperties.defaultProperties'), {\r\n            includeVerticalAlignmentProperty: true,\r\n            includeHorizontalAlignmentProperty: true,\r\n            includePaddingProperty: true,\r\n            isRightToLeftContent: editor.locale.contentLanguageDirection === 'rtl'\r\n        });\r\n        editor.data.addStyleProcessorRules(addBorderRules);\r\n        enableBorderProperties(schema, conversion, {\r\n            color: defaultTableCellProperties.borderColor,\r\n            style: defaultTableCellProperties.borderStyle,\r\n            width: defaultTableCellProperties.borderWidth\r\n        });\r\n        editor.commands.add('tableCellBorderStyle', new TableCellBorderStyleCommand(editor, defaultTableCellProperties.borderStyle));\r\n        editor.commands.add('tableCellBorderColor', new TableCellBorderColorCommand(editor, defaultTableCellProperties.borderColor));\r\n        editor.commands.add('tableCellBorderWidth', new TableCellBorderWidthCommand(editor, defaultTableCellProperties.borderWidth));\r\n        enableProperty(schema, conversion, {\r\n            modelAttribute: 'tableCellHeight',\r\n            styleName: 'height',\r\n            defaultValue: defaultTableCellProperties.height\r\n        });\r\n        editor.commands.add('tableCellHeight', new TableCellHeightCommand(editor, defaultTableCellProperties.height));\r\n        editor.data.addStyleProcessorRules(addPaddingRules);\r\n        enableProperty(schema, conversion, {\r\n            modelAttribute: 'tableCellPadding',\r\n            styleName: 'padding',\r\n            reduceBoxSides: true,\r\n            defaultValue: defaultTableCellProperties.padding\r\n        });\r\n        editor.commands.add('tableCellPadding', new TableCellPaddingCommand(editor, defaultTableCellProperties.padding));\r\n        editor.data.addStyleProcessorRules(addBackgroundRules);\r\n        enableProperty(schema, conversion, {\r\n            modelAttribute: 'tableCellBackgroundColor',\r\n            styleName: 'background-color',\r\n            defaultValue: defaultTableCellProperties.backgroundColor\r\n        });\r\n        editor.commands.add('tableCellBackgroundColor', new TableCellBackgroundColorCommand(editor, defaultTableCellProperties.backgroundColor));\r\n        enableHorizontalAlignmentProperty(schema, conversion, defaultTableCellProperties.horizontalAlignment);\r\n        editor.commands.add('tableCellHorizontalAlignment', new TableCellHorizontalAlignmentCommand(editor, defaultTableCellProperties.horizontalAlignment));\r\n        enableVerticalAlignmentProperty(schema, conversion, defaultTableCellProperties.verticalAlignment);\r\n        editor.commands.add('tableCellVerticalAlignment', new TableCellVerticalAlignmentCommand(editor, defaultTableCellProperties.verticalAlignment));\r\n    }\r\n}\r\n/**\r\n * Enables the `'tableCellBorderStyle'`, `'tableCellBorderColor'` and `'tableCellBorderWidth'` attributes for table cells.\r\n *\r\n * @param defaultBorder The default border values.\r\n * @param defaultBorder.color The default `tableCellBorderColor` value.\r\n * @param defaultBorder.style The default `tableCellBorderStyle` value.\r\n * @param defaultBorder.width The default `tableCellBorderWidth` value.\r\n */\r\nfunction enableBorderProperties(schema, conversion, defaultBorder) {\r\n    const modelAttributes = {\r\n        width: 'tableCellBorderWidth',\r\n        color: 'tableCellBorderColor',\r\n        style: 'tableCellBorderStyle'\r\n    };\r\n    schema.extend('tableCell', {\r\n        allowAttributes: Object.values(modelAttributes)\r\n    });\r\n    upcastBorderStyles(conversion, 'td', modelAttributes, defaultBorder);\r\n    upcastBorderStyles(conversion, 'th', modelAttributes, defaultBorder);\r\n    downcastAttributeToStyle(conversion, { modelElement: 'tableCell', modelAttribute: modelAttributes.style, styleName: 'border-style' });\r\n    downcastAttributeToStyle(conversion, { modelElement: 'tableCell', modelAttribute: modelAttributes.color, styleName: 'border-color' });\r\n    downcastAttributeToStyle(conversion, { modelElement: 'tableCell', modelAttribute: modelAttributes.width, styleName: 'border-width' });\r\n}\r\n/**\r\n * Enables the `'tableCellHorizontalAlignment'` attribute for table cells.\r\n *\r\n * @param defaultValue The default horizontal alignment value.\r\n */\r\nfunction enableHorizontalAlignmentProperty(schema, conversion, defaultValue) {\r\n    schema.extend('tableCell', {\r\n        allowAttributes: ['tableCellHorizontalAlignment']\r\n    });\r\n    conversion.for('downcast')\r\n        .attributeToAttribute({\r\n        model: {\r\n            name: 'tableCell',\r\n            key: 'tableCellHorizontalAlignment'\r\n        },\r\n        view: alignment => ({\r\n            key: 'style',\r\n            value: {\r\n                'text-align': alignment\r\n            }\r\n        })\r\n    });\r\n    conversion.for('upcast')\r\n        // Support for the `text-align:*;` CSS definition for the table cell alignment.\r\n        .attributeToAttribute({\r\n        view: {\r\n            name: /^(td|th)$/,\r\n            styles: {\r\n                'text-align': ALIGN_VALUES_REG_EXP\r\n            }\r\n        },\r\n        model: {\r\n            key: 'tableCellHorizontalAlignment',\r\n            value: (viewElement) => {\r\n                const align = viewElement.getStyle('text-align');\r\n                return align === defaultValue ? null : align;\r\n            }\r\n        }\r\n    })\r\n        // Support for the `align` attribute as the backward compatibility while pasting from other sources.\r\n        .attributeToAttribute({\r\n        view: {\r\n            name: /^(td|th)$/,\r\n            attributes: {\r\n                align: ALIGN_VALUES_REG_EXP\r\n            }\r\n        },\r\n        model: {\r\n            key: 'tableCellHorizontalAlignment',\r\n            value: (viewElement) => {\r\n                const align = viewElement.getAttribute('align');\r\n                return align === defaultValue ? null : align;\r\n            }\r\n        }\r\n    });\r\n}\r\n/**\r\n * Enables the `'verticalAlignment'` attribute for table cells.\r\n *\r\n * @param defaultValue The default vertical alignment value.\r\n */\r\nfunction enableVerticalAlignmentProperty(schema, conversion, defaultValue) {\r\n    schema.extend('tableCell', {\r\n        allowAttributes: ['tableCellVerticalAlignment']\r\n    });\r\n    conversion.for('downcast')\r\n        .attributeToAttribute({\r\n        model: {\r\n            name: 'tableCell',\r\n            key: 'tableCellVerticalAlignment'\r\n        },\r\n        view: alignment => ({\r\n            key: 'style',\r\n            value: {\r\n                'vertical-align': alignment\r\n            }\r\n        })\r\n    });\r\n    conversion.for('upcast')\r\n        // Support for the `vertical-align:*;` CSS definition for the table cell alignment.\r\n        .attributeToAttribute({\r\n        view: {\r\n            name: /^(td|th)$/,\r\n            styles: {\r\n                'vertical-align': VALIGN_VALUES_REG_EXP\r\n            }\r\n        },\r\n        model: {\r\n            key: 'tableCellVerticalAlignment',\r\n            value: (viewElement) => {\r\n                const align = viewElement.getStyle('vertical-align');\r\n                return align === defaultValue ? null : align;\r\n            }\r\n        }\r\n    })\r\n        // Support for the `align` attribute as the backward compatibility while pasting from other sources.\r\n        .attributeToAttribute({\r\n        view: {\r\n            name: /^(td|th)$/,\r\n            attributes: {\r\n                valign: VALIGN_VALUES_REG_EXP\r\n            }\r\n        },\r\n        model: {\r\n            key: 'tableCellVerticalAlignment',\r\n            value: (viewElement) => {\r\n                const valign = viewElement.getAttribute('valign');\r\n                return valign === defaultValue ? null : valign;\r\n            }\r\n        }\r\n    });\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/tablecolumnresize/constants\r\n */\r\n/**\r\n * The minimum column width given as a percentage value. Used in situations when the table is not yet rendered, so it is impossible to\r\n * calculate how many percentage of the table width would be {@link ~COLUMN_MIN_WIDTH_IN_PIXELS minimum column width in pixels}.\r\n */\r\nexport const COLUMN_MIN_WIDTH_AS_PERCENTAGE = 5;\r\n/**\r\n * The minimum column width in pixels when the maximum table width is known.\r\n */\r\nexport const COLUMN_MIN_WIDTH_IN_PIXELS = 40;\r\n/**\r\n * Determines how many digits after the decimal point are used to store the column width as a percentage value.\r\n */\r\nexport const COLUMN_WIDTH_PRECISION = 2;\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { global } from 'ckeditor5/src/utils';\r\nimport { COLUMN_WIDTH_PRECISION, COLUMN_MIN_WIDTH_AS_PERCENTAGE, COLUMN_MIN_WIDTH_IN_PIXELS } from './constants';\r\n/**\r\n * Returns all the inserted or changed table model elements in a given change set. Only the tables\r\n * with 'columnsWidth' attribute are taken into account. The returned set may be empty.\r\n *\r\n * Most notably if an entire table is removed it will not be included in returned set.\r\n *\r\n * @param model The model to collect the affected elements from.\r\n * @returns A set of table model elements.\r\n */\r\nexport function getChangedResizedTables(model) {\r\n    const affectedTables = new Set();\r\n    for (const change of model.document.differ.getChanges()) {\r\n        let referencePosition = null;\r\n        // Checks if the particular change from the differ is:\r\n        // - an insertion or removal of a table, a row or a cell,\r\n        // - an attribute change on a table, a row or a cell.\r\n        switch (change.type) {\r\n            case 'insert':\r\n                referencePosition = ['table', 'tableRow', 'tableCell'].includes(change.name) ?\r\n                    change.position :\r\n                    null;\r\n                break;\r\n            case 'remove':\r\n                // If the whole table is removed, there's no need to update its column widths (#12201).\r\n                referencePosition = ['tableRow', 'tableCell'].includes(change.name) ?\r\n                    change.position :\r\n                    null;\r\n                break;\r\n            case 'attribute':\r\n                if (change.range.start.nodeAfter) {\r\n                    referencePosition = ['table', 'tableRow', 'tableCell'].includes(change.range.start.nodeAfter.name) ?\r\n                        change.range.start :\r\n                        null;\r\n                }\r\n                break;\r\n        }\r\n        if (!referencePosition) {\r\n            continue;\r\n        }\r\n        const tableNode = (referencePosition.nodeAfter && referencePosition.nodeAfter.is('element', 'table')) ?\r\n            referencePosition.nodeAfter : referencePosition.findAncestor('table');\r\n        // We iterate over the whole table looking for the nested tables that are also affected.\r\n        for (const node of model.createRangeOn(tableNode).getItems()) {\r\n            if (!node.is('element', 'table')) {\r\n                continue;\r\n            }\r\n            if (!getColumnGroupElement(node)) {\r\n                continue;\r\n            }\r\n            affectedTables.add(node);\r\n        }\r\n    }\r\n    return affectedTables;\r\n}\r\n/**\r\n * Calculates the percentage of the minimum column width given in pixels for a given table.\r\n *\r\n * @param modelTable A table model element.\r\n * @param editor The editor instance.\r\n * @returns The minimal column width in percentage.\r\n */\r\nexport function getColumnMinWidthAsPercentage(modelTable, editor) {\r\n    return COLUMN_MIN_WIDTH_IN_PIXELS * 100 / getTableWidthInPixels(modelTable, editor);\r\n}\r\n/**\r\n * Calculates the table width in pixels.\r\n *\r\n * @param modelTable A table model element.\r\n * @param editor The editor instance.\r\n * @returns The width of the table in pixels.\r\n */\r\nexport function getTableWidthInPixels(modelTable, editor) {\r\n    // It is possible for a table to not have a <tbody> element - see #11878.\r\n    const referenceElement = getChildrenViewElement(modelTable, 'tbody', editor) || getChildrenViewElement(modelTable, 'thead', editor);\r\n    const domReferenceElement = editor.editing.view.domConverter.mapViewToDom(referenceElement);\r\n    return getElementWidthInPixels(domReferenceElement);\r\n}\r\n/**\r\n * Returns the a view element with a given name that is nested directly in a `<table>` element\r\n * related to a given `modelTable`.\r\n *\r\n * @param elementName Name of a view to be looked for, e.g. `'colgroup`', `'thead`'.\r\n * @returns Matched view or `undefined` otherwise.\r\n */\r\nfunction getChildrenViewElement(modelTable, elementName, editor) {\r\n    const viewFigure = editor.editing.mapper.toViewElement(modelTable);\r\n    const viewTable = [...viewFigure.getChildren()]\r\n        .find((node) => node.is('element', 'table'));\r\n    return [...viewTable.getChildren()]\r\n        .find((node) => node.is('element', elementName));\r\n}\r\n/**\r\n * Returns the computed width (in pixels) of the DOM element without padding and borders.\r\n *\r\n * @param domElement A DOM element.\r\n * @returns The width of the DOM element in pixels.\r\n */\r\nexport function getElementWidthInPixels(domElement) {\r\n    const styles = global.window.getComputedStyle(domElement);\r\n    // In the 'border-box' box sizing algorithm, the element's width\r\n    // already includes the padding and border width (#12335).\r\n    if (styles.boxSizing === 'border-box') {\r\n        return parseFloat(styles.width) -\r\n            parseFloat(styles.paddingLeft) -\r\n            parseFloat(styles.paddingRight) -\r\n            parseFloat(styles.borderLeftWidth) -\r\n            parseFloat(styles.borderRightWidth);\r\n    }\r\n    else {\r\n        return parseFloat(styles.width);\r\n    }\r\n}\r\n/**\r\n * Returns the column indexes on the left and right edges of a cell. They differ if the cell spans\r\n * across multiple columns.\r\n *\r\n * @param cell A table cell model element.\r\n * @param tableUtils The Table Utils plugin instance.\r\n * @returns An object containing the indexes of the left and right edges of the cell.\r\n */\r\nexport function getColumnEdgesIndexes(cell, tableUtils) {\r\n    const cellColumnIndex = tableUtils.getCellLocation(cell).column;\r\n    const cellWidth = cell.getAttribute('colspan') || 1;\r\n    return {\r\n        leftEdge: cellColumnIndex,\r\n        rightEdge: cellColumnIndex + cellWidth - 1\r\n    };\r\n}\r\n/**\r\n * Rounds the provided value to a fixed-point number with defined number of digits after the decimal point.\r\n *\r\n * @param value A number to be rounded.\r\n * @returns The rounded number.\r\n */\r\nexport function toPrecision(value) {\r\n    const multiplier = Math.pow(10, COLUMN_WIDTH_PRECISION);\r\n    const number = typeof value === 'number' ? value : parseFloat(value);\r\n    return Math.round(number * multiplier) / multiplier;\r\n}\r\n/**\r\n * Clamps the number within the inclusive lower (min) and upper (max) bounds. Returned number is rounded using the\r\n * {@link ~toPrecision `toPrecision()`} function.\r\n *\r\n * @param number A number to be clamped.\r\n * @param min A lower bound.\r\n * @param max An upper bound.\r\n * @returns The clamped number.\r\n */\r\nexport function clamp(number, min, max) {\r\n    if (number <= min) {\r\n        return toPrecision(min);\r\n    }\r\n    if (number >= max) {\r\n        return toPrecision(max);\r\n    }\r\n    return toPrecision(number);\r\n}\r\n/**\r\n * Creates an array with defined length and fills all elements with defined value.\r\n *\r\n * @param length The length of the array.\r\n * @param value The value to fill the array with.\r\n * @returns An array with defined length and filled with defined value.\r\n */\r\nexport function createFilledArray(length, value) {\r\n    return Array(length).fill(value);\r\n}\r\n/**\r\n * Sums all array values that can be parsed to a float.\r\n *\r\n * @param array An array of numbers.\r\n * @returns The sum of all array values.\r\n */\r\nexport function sumArray(array) {\r\n    return array\r\n        .map(value => typeof value === 'number' ? value : parseFloat(value))\r\n        .filter(value => !Number.isNaN(value))\r\n        .reduce((result, item) => result + item, 0);\r\n}\r\n/**\r\n * Makes sure that the sum of the widths from all columns is 100%. If the sum of all the widths is not equal 100%, all the widths are\r\n * changed proportionally so that they all sum back to 100%. If there are columns without specified width, the amount remaining\r\n * after assigning the known widths will be distributed equally between them.\r\n *\r\n * Currently, only widths provided as percentage values are supported.\r\n *\r\n * @param columnWidths An array of column widths.\r\n * @returns An array of column widths guaranteed to sum up to 100%.\r\n */\r\nexport function normalizeColumnWidths(columnWidths) {\r\n    const widths = columnWidths.map(width => {\r\n        // Possible values are 'auto' or string ending with '%'\r\n        if (width === 'auto') {\r\n            return width;\r\n        }\r\n        return parseFloat(width.replace('%', ''));\r\n    });\r\n    let normalizedWidths = calculateMissingColumnWidths(widths);\r\n    const totalWidth = sumArray(normalizedWidths);\r\n    if (totalWidth !== 100) {\r\n        normalizedWidths = normalizedWidths\r\n            // Adjust all the columns proportionally.\r\n            .map(width => toPrecision(width * 100 / totalWidth))\r\n            // Due to rounding of numbers it may happen that the sum of the widths of all columns will not be exactly 100%.\r\n            // Therefore, the width of the last column is explicitly adjusted (narrowed or expanded), since all the columns\r\n            // have been proportionally changed already.\r\n            .map((columnWidth, columnIndex, width) => {\r\n            const isLastColumn = columnIndex === width.length - 1;\r\n            if (!isLastColumn) {\r\n                return columnWidth;\r\n            }\r\n            const totalWidth = sumArray(width);\r\n            return toPrecision(columnWidth + 100 - totalWidth);\r\n        });\r\n    }\r\n    return normalizedWidths.map(width => width + '%');\r\n}\r\n/**\r\n * Initializes the column widths by parsing the attribute value and calculating the uninitialized column widths. The special value 'auto'\r\n * indicates that width for the column must be calculated. The width of such uninitialized column is calculated as follows:\r\n * - If there is enough free space in the table for all uninitialized columns to have at least the minimum allowed width for all of them,\r\n *   then set this width equally for all uninitialized columns.\r\n * - Otherwise, just set the minimum allowed width for all uninitialized columns. The sum of all column widths will be greater than 100%,\r\n *   but then it will be adjusted proportionally to 100% in {@link #normalizeColumnWidths `normalizeColumnWidths()`}.\r\n *\r\n * @param columnWidths An array of column widths.\r\n * @returns An array with 'auto' values replaced with calculated widths.\r\n */\r\nfunction calculateMissingColumnWidths(columnWidths) {\r\n    const numberOfUninitializedColumns = columnWidths.filter(columnWidth => columnWidth === 'auto').length;\r\n    if (numberOfUninitializedColumns === 0) {\r\n        return columnWidths.map(columnWidth => toPrecision(columnWidth));\r\n    }\r\n    const totalWidthOfInitializedColumns = sumArray(columnWidths);\r\n    const widthForUninitializedColumn = Math.max((100 - totalWidthOfInitializedColumns) / numberOfUninitializedColumns, COLUMN_MIN_WIDTH_AS_PERCENTAGE);\r\n    return columnWidths\r\n        .map(columnWidth => columnWidth === 'auto' ? widthForUninitializedColumn : columnWidth)\r\n        .map(columnWidth => toPrecision(columnWidth));\r\n}\r\n/**\r\n * Calculates the total horizontal space taken by the cell. That includes:\r\n *  * width,\r\n *  * left and red padding,\r\n *  * border width.\r\n *\r\n * @param domCell A DOM cell element.\r\n * @returns Width in pixels without `px` at the end.\r\n */\r\nexport function getDomCellOuterWidth(domCell) {\r\n    const styles = global.window.getComputedStyle(domCell);\r\n    // In the 'border-box' box sizing algorithm, the element's width\r\n    // already includes the padding and border width (#12335).\r\n    if (styles.boxSizing === 'border-box') {\r\n        return parseInt(styles.width);\r\n    }\r\n    else {\r\n        return parseFloat(styles.width) +\r\n            parseFloat(styles.paddingLeft) +\r\n            parseFloat(styles.paddingRight) +\r\n            parseFloat(styles.borderWidth);\r\n    }\r\n}\r\n/**\r\n * Updates column elements to match columns widths.\r\n *\r\n * @param columns\r\n * @param tableColumnGroup\r\n * @param normalizedWidths\r\n * @param writer\r\n */\r\nexport function updateColumnElements(columns, tableColumnGroup, normalizedWidths, writer) {\r\n    for (let i = 0; i < Math.max(normalizedWidths.length, columns.length); i++) {\r\n        const column = columns[i];\r\n        const columnWidth = normalizedWidths[i];\r\n        if (!columnWidth) {\r\n            // Number of `<tableColumn>` elements exceeds actual number of columns.\r\n            writer.remove(column);\r\n        }\r\n        else if (!column) {\r\n            // There is fewer `<tableColumn>` elements than actual columns.\r\n            writer.appendElement('tableColumn', { columnWidth }, tableColumnGroup);\r\n        }\r\n        else {\r\n            // Update column width.\r\n            writer.setAttribute('columnWidth', columnWidth, column);\r\n        }\r\n    }\r\n}\r\n/**\r\n * Returns a 'tableColumnGroup' element from the 'table'.\r\n *\r\n * @internal\r\n * @param element A 'table' or 'tableColumnGroup' element.\r\n * @returns A 'tableColumnGroup' element.\r\n */\r\nexport function getColumnGroupElement(element) {\r\n    if (element.is('element', 'tableColumnGroup')) {\r\n        return element;\r\n    }\r\n    const children = element.getChildren();\r\n    return Array\r\n        .from(children)\r\n        .find(element => element.is('element', 'tableColumnGroup'));\r\n}\r\n/**\r\n * Returns an array of 'tableColumn' elements.\r\n *\r\n * @internal\r\n * @param element A 'table' or 'tableColumnGroup' element.\r\n * @returns An array of 'tableColumn' elements.\r\n */\r\nexport function getTableColumnElements(element) {\r\n    return Array.from(getColumnGroupElement(element).getChildren());\r\n}\r\n/**\r\n * Returns an array of table column widths.\r\n *\r\n * @internal\r\n * @param element A 'table' or 'tableColumnGroup' element.\r\n * @returns An array of table column widths.\r\n */\r\nexport function getTableColumnsWidths(element) {\r\n    return getTableColumnElements(element).map(column => column.getAttribute('columnWidth'));\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Command } from 'ckeditor5/src/core';\r\nimport { normalizeColumnWidths } from './utils';\r\n/**\r\n * Command used by the {@link module:table/tablecolumnresize~TableColumnResize Table column resize feature} that\r\n * updates the width of the whole table as well as its individual columns.\r\n */\r\nexport default class TableWidthsCommand extends Command {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    refresh() {\r\n        // The command is always enabled as it doesn't care about the actual selection - table can be resized\r\n        // even if the selection is elsewhere.\r\n        this.isEnabled = true;\r\n    }\r\n    /**\r\n     * Updated the `tableWidth` attribute of the table and the `columnWidth` attribute of the columns of that table.\r\n     */\r\n    execute(options = {}) {\r\n        const { model, plugins } = this.editor;\r\n        let { table = model.document.selection.getSelectedElement(), columnWidths, tableWidth } = options;\r\n        if (columnWidths) {\r\n            // For backwards compatibility, columnWidths might be an array or a string of comma-separated values.\r\n            columnWidths = Array.isArray(columnWidths) ?\r\n                columnWidths :\r\n                columnWidths.split(',');\r\n        }\r\n        model.change(writer => {\r\n            if (tableWidth) {\r\n                writer.setAttribute('tableWidth', tableWidth, table);\r\n            }\r\n            else {\r\n                writer.removeAttribute('tableWidth', table);\r\n            }\r\n            const tableColumnGroup = plugins\r\n                .get('TableColumnResizeEditing')\r\n                .getColumnGroupElement(table);\r\n            if (!columnWidths && !tableColumnGroup) {\r\n                return;\r\n            }\r\n            if (!columnWidths) {\r\n                return writer.remove(tableColumnGroup);\r\n            }\r\n            const widths = normalizeColumnWidths(columnWidths);\r\n            if (!tableColumnGroup) {\r\n                const colGroupElement = writer.createElement('tableColumnGroup');\r\n                widths.forEach(columnWidth => writer.appendElement('tableColumn', { columnWidth }, colGroupElement));\r\n                writer.append(colGroupElement, table);\r\n            }\r\n            else {\r\n                Array\r\n                    .from(tableColumnGroup.getChildren())\r\n                    .forEach((column, index) => writer.setAttribute('columnWidth', widths[index], column));\r\n            }\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/tablecolumnresize/tablecolumnresizeediting\r\n */\r\nimport { throttle, isEqual } from 'lodash-es';\r\nimport { global, DomEmitterMixin } from 'ckeditor5/src/utils';\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport MouseEventsObserver from '../../src/tablemouse/mouseeventsobserver';\r\nimport TableEditing from '../tableediting';\r\nimport TableUtils from '../tableutils';\r\nimport TableWalker from '../tablewalker';\r\nimport TableWidthsCommand from './tablewidthscommand';\r\nimport { downcastTableResizedClass, upcastColgroupElement } from './converters';\r\nimport { clamp, createFilledArray, sumArray, getColumnEdgesIndexes, getChangedResizedTables, getColumnMinWidthAsPercentage, getElementWidthInPixels, getTableWidthInPixels, normalizeColumnWidths, toPrecision, getDomCellOuterWidth, updateColumnElements, getColumnGroupElement, getTableColumnElements, getTableColumnsWidths } from './utils';\r\nimport { COLUMN_MIN_WIDTH_IN_PIXELS } from './constants';\r\n/**\r\n * The table column resize editing plugin.\r\n */\r\nexport default class TableColumnResizeEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [TableEditing, TableUtils];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'TableColumnResizeEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        this._isResizingActive = false;\r\n        this.set('_isResizingAllowed', true);\r\n        this._resizingData = null;\r\n        this._domEmitter = new (DomEmitterMixin())();\r\n        this._tableUtilsPlugin = editor.plugins.get('TableUtils');\r\n        this.on('change:_isResizingAllowed', (evt, name, value) => {\r\n            // Toggling the `ck-column-resize_disabled` class shows and hides the resizers through CSS.\r\n            const classAction = value ? 'removeClass' : 'addClass';\r\n            editor.editing.view.change(writer => {\r\n                for (const root of editor.editing.view.document.roots) {\r\n                    writer[classAction]('ck-column-resize_disabled', editor.editing.view.document.getRoot(root.rootName));\r\n                }\r\n            });\r\n        });\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        this._extendSchema();\r\n        this._registerPostFixer();\r\n        this._registerConverters();\r\n        this._registerResizingListeners();\r\n        this._registerResizerInserter();\r\n        const editor = this.editor;\r\n        const columnResizePlugin = editor.plugins.get('TableColumnResize');\r\n        const tableEditing = editor.plugins.get('TableEditing');\r\n        tableEditing.registerAdditionalSlot({\r\n            filter: element => element.is('element', 'tableColumnGroup'),\r\n            positionOffset: 0\r\n        });\r\n        const tableWidthsCommand = new TableWidthsCommand(editor);\r\n        // For backwards compatibility we have two commands that perform exactly the same operation.\r\n        editor.commands.add('resizeTableWidth', tableWidthsCommand);\r\n        editor.commands.add('resizeColumnWidths', tableWidthsCommand);\r\n        // Currently the states of column resize and table resize (which is actually the last column resize) features\r\n        // are bound together. They can be separated in the future by adding distinct listeners and applying\r\n        // different CSS classes (e.g. `ck-column-resize_disabled` and `ck-table-resize_disabled`) to the editor root.\r\n        // See #12148 for the details.\r\n        this.bind('_isResizingAllowed').to(editor, 'isReadOnly', columnResizePlugin, 'isEnabled', tableWidthsCommand, 'isEnabled', (isEditorReadOnly, isPluginEnabled, isTableWidthsCommandCommandEnabled) => !isEditorReadOnly && isPluginEnabled && isTableWidthsCommandCommandEnabled);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        this._domEmitter.stopListening();\r\n        super.destroy();\r\n    }\r\n    /**\r\n     * Returns a 'tableColumnGroup' element from the 'table'.\r\n     *\r\n     * @param element A 'table' or 'tableColumnGroup' element.\r\n     * @returns A 'tableColumnGroup' element.\r\n     */\r\n    getColumnGroupElement(element) {\r\n        return getColumnGroupElement(element);\r\n    }\r\n    /**\r\n     * Returns an array of 'tableColumn' elements.\r\n     *\r\n     * @param element A 'table' or 'tableColumnGroup' element.\r\n     * @returns An array of 'tableColumn' elements.\r\n     */\r\n    getTableColumnElements(element) {\r\n        return getTableColumnElements(element);\r\n    }\r\n    /**\r\n     * Returns an array of table column widths.\r\n     *\r\n     * @param element A 'table' or 'tableColumnGroup' element.\r\n     * @returns An array of table column widths.\r\n     */\r\n    getTableColumnsWidths(element) {\r\n        return getTableColumnsWidths(element);\r\n    }\r\n    /**\r\n     * Registers new attributes for a table model element.\r\n     */\r\n    _extendSchema() {\r\n        this.editor.model.schema.extend('table', {\r\n            allowAttributes: ['tableWidth']\r\n        });\r\n        this.editor.model.schema.register('tableColumnGroup', {\r\n            allowIn: 'table',\r\n            isLimit: true\r\n        });\r\n        this.editor.model.schema.register('tableColumn', {\r\n            allowIn: 'tableColumnGroup',\r\n            allowAttributes: ['columnWidth'],\r\n            isLimit: true\r\n        });\r\n    }\r\n    /**\r\n     * Registers table column resize post-fixer.\r\n     *\r\n     * It checks if the change from the differ concerns a table-related element or attribute. For detected changes it:\r\n     *  * Adjusts the `columnWidths` attribute to guarantee that the sum of the widths from all columns is 100%.\r\n     *  * Checks if the `columnWidths` attribute gets updated accordingly after columns have been added or removed.\r\n     */\r\n    _registerPostFixer() {\r\n        const editor = this.editor;\r\n        const model = editor.model;\r\n        model.document.registerPostFixer(writer => {\r\n            let changed = false;\r\n            for (const table of getChangedResizedTables(model)) {\r\n                const tableColumnGroup = this.getColumnGroupElement(table);\r\n                const columns = this.getTableColumnElements(tableColumnGroup);\r\n                const columnWidths = this.getTableColumnsWidths(tableColumnGroup);\r\n                // Adjust the `columnWidths` attribute to guarantee that the sum of the widths from all columns is 100%.\r\n                let normalizedWidths = normalizeColumnWidths(columnWidths);\r\n                // If the number of columns has changed, then we need to adjust the widths of the affected columns.\r\n                normalizedWidths = adjustColumnWidths(normalizedWidths, table, this);\r\n                if (isEqual(columnWidths, normalizedWidths)) {\r\n                    continue;\r\n                }\r\n                updateColumnElements(columns, tableColumnGroup, normalizedWidths, writer);\r\n                changed = true;\r\n            }\r\n            return changed;\r\n        });\r\n        /**\r\n         * Adjusts if necessary the `columnWidths` in case if the number of column has changed.\r\n         *\r\n         * @param columnWidths Note: this array **may be modified** by the function.\r\n         * @param table Table to be checked.\r\n         */\r\n        function adjustColumnWidths(columnWidths, table, plugin) {\r\n            const newTableColumnsCount = plugin._tableUtilsPlugin.getColumns(table);\r\n            const columnsCountDelta = newTableColumnsCount - columnWidths.length;\r\n            if (columnsCountDelta === 0) {\r\n                return columnWidths;\r\n            }\r\n            const widths = columnWidths.map(width => Number(width.replace('%', '')));\r\n            // Collect all cells that are affected by the change.\r\n            const cellSet = getAffectedCells(plugin.editor.model.document.differ, table);\r\n            for (const cell of cellSet) {\r\n                const currentColumnsDelta = newTableColumnsCount - widths.length;\r\n                if (currentColumnsDelta === 0) {\r\n                    continue;\r\n                }\r\n                // If the column count in the table changed, adjust the widths of the affected columns.\r\n                const hasMoreColumns = currentColumnsDelta > 0;\r\n                const currentColumnIndex = plugin._tableUtilsPlugin.getCellLocation(cell).column;\r\n                if (hasMoreColumns) {\r\n                    const columnMinWidthAsPercentage = getColumnMinWidthAsPercentage(table, plugin.editor);\r\n                    const columnWidthsToInsert = createFilledArray(currentColumnsDelta, columnMinWidthAsPercentage);\r\n                    widths.splice(currentColumnIndex, 0, ...columnWidthsToInsert);\r\n                }\r\n                else {\r\n                    // Moves the widths of the removed columns to the preceding one.\r\n                    // Other editors either reduce the width of the whole table or adjust the widths\r\n                    // proportionally, so change of this behavior can be considered in the future.\r\n                    const removedColumnWidths = widths.splice(currentColumnIndex, Math.abs(currentColumnsDelta));\r\n                    widths[currentColumnIndex] += sumArray(removedColumnWidths);\r\n                }\r\n            }\r\n            return widths.map(width => width + '%');\r\n        }\r\n        /**\r\n         * Returns a set of cells that have been changed in a given table.\r\n         */\r\n        function getAffectedCells(differ, table) {\r\n            const cellSet = new Set();\r\n            for (const change of differ.getChanges()) {\r\n                if (change.type == 'insert' &&\r\n                    change.position.nodeAfter &&\r\n                    change.position.nodeAfter.name == 'tableCell' &&\r\n                    change.position.nodeAfter.getAncestors().includes(table)) {\r\n                    cellSet.add(change.position.nodeAfter);\r\n                }\r\n                else if (change.type == 'remove') {\r\n                    // If the first cell was removed, use the node after the change position instead.\r\n                    const referenceNode = (change.position.nodeBefore || change.position.nodeAfter);\r\n                    if (referenceNode.name == 'tableCell' && referenceNode.getAncestors().includes(table)) {\r\n                        cellSet.add(referenceNode);\r\n                    }\r\n                }\r\n            }\r\n            return cellSet;\r\n        }\r\n    }\r\n    /**\r\n     * Registers table column resize converters.\r\n     */\r\n    _registerConverters() {\r\n        const editor = this.editor;\r\n        const conversion = editor.conversion;\r\n        // Table width style\r\n        conversion.for('upcast').attributeToAttribute({\r\n            view: {\r\n                name: 'figure',\r\n                key: 'style',\r\n                value: {\r\n                    width: /[\\s\\S]+/\r\n                }\r\n            },\r\n            model: {\r\n                name: 'table',\r\n                key: 'tableWidth',\r\n                value: (viewElement) => viewElement.getStyle('width')\r\n            }\r\n        });\r\n        conversion.for('downcast').attributeToAttribute({\r\n            model: {\r\n                name: 'table',\r\n                key: 'tableWidth'\r\n            },\r\n            view: (width) => ({\r\n                name: 'figure',\r\n                key: 'style',\r\n                value: {\r\n                    width\r\n                }\r\n            })\r\n        });\r\n        conversion.elementToElement({ model: 'tableColumnGroup', view: 'colgroup' });\r\n        conversion.elementToElement({ model: 'tableColumn', view: 'col' });\r\n        conversion.for('downcast').add(downcastTableResizedClass());\r\n        conversion.for('upcast').add(upcastColgroupElement(this._tableUtilsPlugin));\r\n        conversion.for('upcast').attributeToAttribute({\r\n            view: {\r\n                name: 'col',\r\n                styles: {\r\n                    width: /.*/\r\n                }\r\n            },\r\n            model: {\r\n                key: 'columnWidth',\r\n                value: (viewElement) => {\r\n                    const viewColWidth = viewElement.getStyle('width');\r\n                    if (!viewColWidth || !viewColWidth.endsWith('%')) {\r\n                        return 'auto';\r\n                    }\r\n                    return viewColWidth;\r\n                }\r\n            }\r\n        });\r\n        conversion.for('downcast').attributeToAttribute({\r\n            model: {\r\n                name: 'tableColumn',\r\n                key: 'columnWidth'\r\n            },\r\n            view: width => ({ key: 'style', value: { width } })\r\n        });\r\n    }\r\n    /**\r\n     * Registers listeners to handle resizing process.\r\n     */\r\n    _registerResizingListeners() {\r\n        const editingView = this.editor.editing.view;\r\n        editingView.addObserver(MouseEventsObserver);\r\n        editingView.document.on('mousedown', this._onMouseDownHandler.bind(this), { priority: 'high' });\r\n        this._domEmitter.listenTo(global.window.document, 'mousemove', throttle(this._onMouseMoveHandler.bind(this), 50));\r\n        this._domEmitter.listenTo(global.window.document, 'mouseup', this._onMouseUpHandler.bind(this));\r\n    }\r\n    /**\r\n     * Handles the `mousedown` event on column resizer element:\r\n     *  * calculates the initial column pixel widths,\r\n     *  * inserts the `<colgroup>` element if it is not present in the `<table>`,\r\n     *  * puts the necessary data in the temporary storage,\r\n     *  * applies the attributes to the `<table>` view element.\r\n     *\r\n     * @param eventInfo An object containing information about the fired event.\r\n     * @param domEventData The data related to the DOM event.\r\n     */\r\n    _onMouseDownHandler(eventInfo, domEventData) {\r\n        const target = domEventData.target;\r\n        if (!target.hasClass('ck-table-column-resizer')) {\r\n            return;\r\n        }\r\n        if (!this._isResizingAllowed) {\r\n            return;\r\n        }\r\n        const editor = this.editor;\r\n        const modelTable = editor.editing.mapper.toModelElement(target.findAncestor('figure'));\r\n        // Do not resize if table model is in non-editable place.\r\n        if (!editor.model.canEditAt(modelTable)) {\r\n            return;\r\n        }\r\n        domEventData.preventDefault();\r\n        eventInfo.stop();\r\n        // The column widths are calculated upon mousedown to allow lazy applying the `columnWidths` attribute on the table.\r\n        const columnWidthsInPx = _calculateDomColumnWidths(modelTable, this._tableUtilsPlugin, editor);\r\n        const viewTable = target.findAncestor('table');\r\n        const editingView = editor.editing.view;\r\n        // Insert colgroup for the table that is resized for the first time.\r\n        if (!Array.from(viewTable.getChildren()).find(viewCol => viewCol.is('element', 'colgroup'))) {\r\n            editingView.change(viewWriter => {\r\n                _insertColgroupElement(viewWriter, columnWidthsInPx, viewTable);\r\n            });\r\n        }\r\n        this._isResizingActive = true;\r\n        this._resizingData = this._getResizingData(domEventData, columnWidthsInPx);\r\n        // At this point we change only the editor view - we don't want other users to see our changes yet,\r\n        // so we can't apply them in the model.\r\n        editingView.change(writer => _applyResizingAttributesToTable(writer, viewTable, this._resizingData));\r\n        /**\r\n         * Calculates the DOM columns' widths. It is done by taking the width of the widest cell\r\n         * from each table column (we rely on the  {@link module:table/tablewalker~TableWalker}\r\n         * to determine which column the cell belongs to).\r\n         *\r\n         * @param modelTable A table which columns should be measured.\r\n         * @param tableUtils The Table Utils plugin instance.\r\n         * @param editor The editor instance.\r\n         * @returns Columns' widths expressed in pixels (without unit).\r\n         */\r\n        function _calculateDomColumnWidths(modelTable, tableUtilsPlugin, editor) {\r\n            const columnWidthsInPx = Array(tableUtilsPlugin.getColumns(modelTable));\r\n            const tableWalker = new TableWalker(modelTable);\r\n            for (const cellSlot of tableWalker) {\r\n                const viewCell = editor.editing.mapper.toViewElement(cellSlot.cell);\r\n                const domCell = editor.editing.view.domConverter.mapViewToDom(viewCell);\r\n                const domCellWidth = getDomCellOuterWidth(domCell);\r\n                if (!columnWidthsInPx[cellSlot.column] || domCellWidth < columnWidthsInPx[cellSlot.column]) {\r\n                    columnWidthsInPx[cellSlot.column] = toPrecision(domCellWidth);\r\n                }\r\n            }\r\n            return columnWidthsInPx;\r\n        }\r\n        /**\r\n         * Creates a `<colgroup>` element with `<col>`s and inserts it into a given view table.\r\n         *\r\n         * @param viewWriter A writer instance.\r\n         * @param columnWidthsInPx Column widths.\r\n         * @param viewTable A table view element.\r\n         */\r\n        function _insertColgroupElement(viewWriter, columnWidthsInPx, viewTable) {\r\n            const colgroup = viewWriter.createContainerElement('colgroup');\r\n            for (let i = 0; i < columnWidthsInPx.length; i++) {\r\n                const viewColElement = viewWriter.createEmptyElement('col');\r\n                const columnWidthInPc = `${toPrecision(columnWidthsInPx[i] / sumArray(columnWidthsInPx) * 100)}%`;\r\n                viewWriter.setStyle('width', columnWidthInPc, viewColElement);\r\n                viewWriter.insert(viewWriter.createPositionAt(colgroup, 'end'), viewColElement);\r\n            }\r\n            viewWriter.insert(viewWriter.createPositionAt(viewTable, 0), colgroup);\r\n        }\r\n        /**\r\n         * Applies the style and classes to the view table as the resizing begun.\r\n         *\r\n         * @param viewWriter A writer instance.\r\n         * @param viewTable A table containing the clicked resizer.\r\n         * @param resizingData Data related to the resizing.\r\n         */\r\n        function _applyResizingAttributesToTable(viewWriter, viewTable, resizingData) {\r\n            const figureInitialPcWidth = resizingData.widths.viewFigureWidth / resizingData.widths.viewFigureParentWidth;\r\n            viewWriter.addClass('ck-table-resized', viewTable);\r\n            viewWriter.addClass('ck-table-column-resizer__active', resizingData.elements.viewResizer);\r\n            viewWriter.setStyle('width', `${toPrecision(figureInitialPcWidth * 100)}%`, viewTable.findAncestor('figure'));\r\n        }\r\n    }\r\n    /**\r\n     * Handles the `mousemove` event.\r\n     *  * If resizing process is not in progress, it does nothing.\r\n     *  * If resizing is active but not allowed, it stops the resizing process instantly calling the `mousedown` event handler.\r\n     *  * Otherwise it dynamically updates the widths of the resized columns.\r\n     *\r\n     * @param eventInfo An object containing information about the fired event.\r\n     * @param mouseEventData The native DOM event.\r\n     */\r\n    _onMouseMoveHandler(eventInfo, mouseEventData) {\r\n        if (!this._isResizingActive) {\r\n            return;\r\n        }\r\n        if (!this._isResizingAllowed) {\r\n            this._onMouseUpHandler();\r\n            return;\r\n        }\r\n        const { columnPosition, flags: { isRightEdge, isTableCentered, isLtrContent }, elements: { viewFigure, viewLeftColumn, viewRightColumn }, widths: { viewFigureParentWidth, tableWidth, leftColumnWidth, rightColumnWidth } } = this._resizingData;\r\n        const dxLowerBound = -leftColumnWidth + COLUMN_MIN_WIDTH_IN_PIXELS;\r\n        const dxUpperBound = isRightEdge ?\r\n            viewFigureParentWidth - tableWidth :\r\n            rightColumnWidth - COLUMN_MIN_WIDTH_IN_PIXELS;\r\n        // The multiplier is needed for calculating the proper movement offset:\r\n        // - it should negate the sign if content language direction is right-to-left,\r\n        // - it should double the offset if the table edge is resized and table is centered.\r\n        const multiplier = (isLtrContent ? 1 : -1) * (isRightEdge && isTableCentered ? 2 : 1);\r\n        const dx = clamp((mouseEventData.clientX - columnPosition) * multiplier, Math.min(dxLowerBound, 0), Math.max(dxUpperBound, 0));\r\n        if (dx === 0) {\r\n            return;\r\n        }\r\n        this.editor.editing.view.change(writer => {\r\n            const leftColumnWidthAsPercentage = toPrecision((leftColumnWidth + dx) * 100 / tableWidth);\r\n            writer.setStyle('width', `${leftColumnWidthAsPercentage}%`, viewLeftColumn);\r\n            if (isRightEdge) {\r\n                const tableWidthAsPercentage = toPrecision((tableWidth + dx) * 100 / viewFigureParentWidth);\r\n                writer.setStyle('width', `${tableWidthAsPercentage}%`, viewFigure);\r\n            }\r\n            else {\r\n                const rightColumnWidthAsPercentage = toPrecision((rightColumnWidth - dx) * 100 / tableWidth);\r\n                writer.setStyle('width', `${rightColumnWidthAsPercentage}%`, viewRightColumn);\r\n            }\r\n        });\r\n    }\r\n    /**\r\n     * Handles the `mouseup` event.\r\n     *  * If resizing process is not in progress, it does nothing.\r\n     *  * If resizing is active but not allowed, it cancels the resizing process restoring the original widths.\r\n     *  * Otherwise it propagates the changes from view to the model by executing the adequate commands.\r\n     */\r\n    _onMouseUpHandler() {\r\n        if (!this._isResizingActive) {\r\n            return;\r\n        }\r\n        const { viewResizer, modelTable, viewFigure, viewColgroup } = this._resizingData.elements;\r\n        const editor = this.editor;\r\n        const editingView = editor.editing.view;\r\n        const tableColumnGroup = this.getColumnGroupElement(modelTable);\r\n        const viewColumns = Array\r\n            .from(viewColgroup.getChildren())\r\n            .filter((column) => column.is('view:element'));\r\n        const columnWidthsAttributeOld = tableColumnGroup ?\r\n            this.getTableColumnsWidths(tableColumnGroup) :\r\n            null;\r\n        const columnWidthsAttributeNew = viewColumns.map(column => column.getStyle('width'));\r\n        const isColumnWidthsAttributeChanged = !isEqual(columnWidthsAttributeOld, columnWidthsAttributeNew);\r\n        const tableWidthAttributeOld = modelTable.getAttribute('tableWidth');\r\n        const tableWidthAttributeNew = viewFigure.getStyle('width');\r\n        const isTableWidthAttributeChanged = tableWidthAttributeOld !== tableWidthAttributeNew;\r\n        if (isColumnWidthsAttributeChanged || isTableWidthAttributeChanged) {\r\n            if (this._isResizingAllowed) {\r\n                editor.execute('resizeTableWidth', {\r\n                    table: modelTable,\r\n                    tableWidth: `${toPrecision(tableWidthAttributeNew)}%`,\r\n                    columnWidths: columnWidthsAttributeNew\r\n                });\r\n            }\r\n            else {\r\n                // In read-only mode revert all changes in the editing view. The model is not touched so it does not need to be restored.\r\n                // This case can occur if the read-only mode kicks in during the resizing process.\r\n                editingView.change(writer => {\r\n                    // If table had resized columns before, restore the previous column widths.\r\n                    // Otherwise clean up the view from the temporary column resizing markup.\r\n                    if (columnWidthsAttributeOld) {\r\n                        for (const viewCol of viewColumns) {\r\n                            writer.setStyle('width', columnWidthsAttributeOld.shift(), viewCol);\r\n                        }\r\n                    }\r\n                    else {\r\n                        writer.remove(viewColgroup);\r\n                    }\r\n                    if (isTableWidthAttributeChanged) {\r\n                        // If the whole table was already resized before, restore the previous table width.\r\n                        // Otherwise clean up the view from the temporary table resizing markup.\r\n                        if (tableWidthAttributeOld) {\r\n                            writer.setStyle('width', tableWidthAttributeOld, viewFigure);\r\n                        }\r\n                        else {\r\n                            writer.removeStyle('width', viewFigure);\r\n                        }\r\n                    }\r\n                    // If a table and its columns weren't resized before,\r\n                    // prune the remaining common resizing markup.\r\n                    if (!columnWidthsAttributeOld && !tableWidthAttributeOld) {\r\n                        writer.removeClass('ck-table-resized', [...viewFigure.getChildren()].find(element => element.name === 'table'));\r\n                    }\r\n                });\r\n            }\r\n        }\r\n        editingView.change(writer => {\r\n            writer.removeClass('ck-table-column-resizer__active', viewResizer);\r\n        });\r\n        this._isResizingActive = false;\r\n        this._resizingData = null;\r\n    }\r\n    /**\r\n     * Retrieves and returns required data needed for the resizing process.\r\n     *\r\n     * @param domEventData The data of the `mousedown` event.\r\n     * @param columnWidths The current widths of the columns.\r\n     * @returns The data needed for the resizing process.\r\n     */\r\n    _getResizingData(domEventData, columnWidths) {\r\n        const editor = this.editor;\r\n        const columnPosition = domEventData.domEvent.clientX;\r\n        const viewResizer = domEventData.target;\r\n        const viewLeftCell = viewResizer.findAncestor('td') || viewResizer.findAncestor('th');\r\n        const modelLeftCell = editor.editing.mapper.toModelElement(viewLeftCell);\r\n        const modelTable = modelLeftCell.findAncestor('table');\r\n        const leftColumnIndex = getColumnEdgesIndexes(modelLeftCell, this._tableUtilsPlugin).rightEdge;\r\n        const lastColumnIndex = this._tableUtilsPlugin.getColumns(modelTable) - 1;\r\n        const isRightEdge = leftColumnIndex === lastColumnIndex;\r\n        const isTableCentered = !modelTable.hasAttribute('tableAlignment');\r\n        const isLtrContent = editor.locale.contentLanguageDirection !== 'rtl';\r\n        const viewTable = viewLeftCell.findAncestor('table');\r\n        const viewFigure = viewTable.findAncestor('figure');\r\n        const viewColgroup = [...viewTable.getChildren()]\r\n            .find(viewCol => viewCol.is('element', 'colgroup'));\r\n        const viewLeftColumn = viewColgroup.getChild(leftColumnIndex);\r\n        const viewRightColumn = isRightEdge ? undefined : viewColgroup.getChild(leftColumnIndex + 1);\r\n        const viewFigureParentWidth = getElementWidthInPixels(editor.editing.view.domConverter.mapViewToDom(viewFigure.parent));\r\n        const viewFigureWidth = getElementWidthInPixels(editor.editing.view.domConverter.mapViewToDom(viewFigure));\r\n        const tableWidth = getTableWidthInPixels(modelTable, editor);\r\n        const leftColumnWidth = columnWidths[leftColumnIndex];\r\n        const rightColumnWidth = isRightEdge ? undefined : columnWidths[leftColumnIndex + 1];\r\n        return {\r\n            columnPosition,\r\n            flags: {\r\n                isRightEdge,\r\n                isTableCentered,\r\n                isLtrContent\r\n            },\r\n            elements: {\r\n                viewResizer,\r\n                modelTable,\r\n                viewFigure,\r\n                viewColgroup,\r\n                viewLeftColumn,\r\n                viewRightColumn\r\n            },\r\n            widths: {\r\n                viewFigureParentWidth,\r\n                viewFigureWidth,\r\n                tableWidth,\r\n                leftColumnWidth,\r\n                rightColumnWidth\r\n            }\r\n        };\r\n    }\r\n    /**\r\n     * Registers a listener ensuring that each resizable cell have a resizer handle.\r\n     */\r\n    _registerResizerInserter() {\r\n        this.editor.conversion.for('editingDowncast').add(dispatcher => {\r\n            dispatcher.on('insert:tableCell', (evt, data, conversionApi) => {\r\n                const modelElement = data.item;\r\n                const viewElement = conversionApi.mapper.toViewElement(modelElement);\r\n                const viewWriter = conversionApi.writer;\r\n                viewWriter.insert(viewWriter.createPositionAt(viewElement, 'end'), viewWriter.createUIElement('div', { class: 'ck-table-column-resizer' }));\r\n            }, { priority: 'lowest' });\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { normalizeColumnWidths, updateColumnElements, getColumnGroupElement, getTableColumnElements, getTableColumnsWidths } from './utils';\r\n/**\r\n * Returns a upcast helper that ensures the number of `<tableColumn>` elements corresponds to the actual number of columns in the table,\r\n * because the input data might have too few or too many <col> elements.\r\n */\r\nexport function upcastColgroupElement(tableUtilsPlugin) {\r\n    return dispatcher => dispatcher.on('element:colgroup', (evt, data, conversionApi) => {\r\n        const modelTable = data.modelCursor.findAncestor('table');\r\n        const tableColumnGroup = getColumnGroupElement(modelTable);\r\n        if (!tableColumnGroup) {\r\n            return;\r\n        }\r\n        const columnElements = getTableColumnElements(tableColumnGroup);\r\n        let columnWidths = getTableColumnsWidths(tableColumnGroup);\r\n        const columnsCount = tableUtilsPlugin.getColumns(modelTable);\r\n        columnWidths = Array.from({ length: columnsCount }, (_, index) => columnWidths[index] || 'auto');\r\n        if (columnWidths.length != columnElements.length || columnWidths.includes('auto')) {\r\n            updateColumnElements(columnElements, tableColumnGroup, normalizeColumnWidths(columnWidths), conversionApi.writer);\r\n        }\r\n    }, { priority: 'low' });\r\n}\r\n/**\r\n * Returns downcast helper for adding `ck-table-resized` class if there is a `<tableColumnGroup>` element inside the table.\r\n */\r\nexport function downcastTableResizedClass() {\r\n    return dispatcher => dispatcher.on('insert:table', (evt, data, conversionApi) => {\r\n        const viewWriter = conversionApi.writer;\r\n        const modelTable = data.item;\r\n        const viewElement = conversionApi.mapper.toViewElement(modelTable);\r\n        const viewTable = viewElement.is('element', 'table') ?\r\n            viewElement :\r\n            Array.from(viewElement.getChildren()).find(viewChild => viewChild.is('element', 'table'));\r\n        const tableColumnGroup = getColumnGroupElement(modelTable);\r\n        if (tableColumnGroup) {\r\n            viewWriter.addClass('ck-table-resized', viewTable);\r\n        }\r\n        else {\r\n            viewWriter.removeClass('ck-table-resized', viewTable);\r\n        }\r\n    }, { priority: 'low' });\r\n}\r\n","import api from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../css-loader/dist/cjs.js!../../../postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./tablecolumnresize.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module basic-styles/underline/underlineediting\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport AttributeCommand from '../attributecommand';\r\nconst UNDERLINE = 'underline';\r\n/**\r\n * The underline editing feature.\r\n *\r\n * It registers the `'underline'` command, the <kbd>Ctrl+U</kbd> keystroke\r\n * and introduces the `underline` attribute in the model which renders to the view as an `<u>` element.\r\n */\r\nexport default class UnderlineEditing extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'UnderlineEditing';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        // Allow strikethrough attribute on text nodes.\r\n        editor.model.schema.extend('$text', { allowAttributes: UNDERLINE });\r\n        editor.model.schema.setAttributeProperties(UNDERLINE, {\r\n            isFormatting: true,\r\n            copyOnEnter: true\r\n        });\r\n        editor.conversion.attributeToElement({\r\n            model: UNDERLINE,\r\n            view: 'u',\r\n            upcastAlso: {\r\n                styles: {\r\n                    'text-decoration': 'underline'\r\n                }\r\n            }\r\n        });\r\n        // Create underline command.\r\n        editor.commands.add(UNDERLINE, new AttributeCommand(editor, UNDERLINE));\r\n        // Set the Ctrl+U keystroke.\r\n        editor.keystrokes.set('CTRL+U', 'underline');\r\n    }\r\n}\r\n","export default \"<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>\";","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module basic-styles/underline/underlineui\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { ButtonView } from 'ckeditor5/src/ui';\r\nimport underlineIcon from '../../theme/icons/underline.svg';\r\nconst UNDERLINE = 'underline';\r\n/**\r\n * The underline UI feature. It introduces the Underline button.\r\n */\r\nexport default class UnderlineUI extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'UnderlineUI';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        // Add bold button to feature components.\r\n        editor.ui.componentFactory.add(UNDERLINE, locale => {\r\n            const command = editor.commands.get(UNDERLINE);\r\n            const view = new ButtonView(locale);\r\n            view.set({\r\n                label: t('Underline'),\r\n                icon: underlineIcon,\r\n                keystroke: 'CTRL+U',\r\n                tooltip: true,\r\n                isToggleable: true\r\n            });\r\n            view.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled');\r\n            // Execute command.\r\n            this.listenTo(view, 'execute', () => {\r\n                editor.execute(UNDERLINE);\r\n                editor.editing.view.focus();\r\n            });\r\n            return view;\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * Returns a plain text representation of an element and its children.\r\n *\r\n * @returns Plain text representing the model's data.\r\n */\r\nexport function modelElementToPlainText(item) {\r\n    if (item.is('$text') || item.is('$textProxy')) {\r\n        return item.data;\r\n    }\r\n    const element = item;\r\n    let text = '';\r\n    let prev = null;\r\n    for (const child of element.getChildren()) {\r\n        const childText = modelElementToPlainText(child);\r\n        // If last block was finish, start from new line.\r\n        if (prev && prev.is('element')) {\r\n            text += '\\n';\r\n        }\r\n        text += childText;\r\n        prev = child;\r\n    }\r\n    return text;\r\n}\r\n","import { Command } from '@ckeditor/ckeditor5-core';\n\nexport default class PlaceholderCommand extends Command {\n  execute({ value }) {\n    const editor = this.editor;\n    const selection = editor.model.document.selection;\n\n    editor.model.change((writer) => {\n      // Create a <placeholder> element with the \"name\" attribute (and all the selection attributes)...\n      const placeholder = writer.createElement('placeholder', {\n        ...Object.fromEntries(selection.getAttributes()),\n        name: value,\n      });\n\n      // ... and insert it into the document. Put the selection on the inserted element.\n      editor.model.insertObject(placeholder, null, null, {\n        setSelection: 'on',\n      });\n    });\n  }\n\n  refresh() {\n    const model = this.editor.model;\n    const selection = model.document.selection;\n\n    const isAllowed = model.schema.checkChild(\n      selection.focus.parent,\n      'placeholder'\n    );\n\n    this.isEnabled = isAllowed;\n  }\n}\n","import api from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n            import content from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./placeholder.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/* eslint-disable ember/classic-decorator-hooks */\nimport { Plugin } from '@ckeditor/ckeditor5-core';\nimport {\n  Widget,\n  toWidget,\n  viewToModelPositionOutsideModelElement,\n} from '@ckeditor/ckeditor5-widget';\nimport PlaceholderCommand from './placeholdercommand';\nimport './theme/placeholder.css';\n\nexport default class PlaceholderEditing extends Plugin {\n  static get requires() {\n    return [Widget];\n  }\n\n  init() {\n    this._defineSchema();\n    this._defineConverters();\n\n    this.editor.commands.add(\n      'placeholder',\n      new PlaceholderCommand(this.editor)\n    );\n\n    this.editor.editing.mapper.on(\n      'viewToModelPosition',\n      viewToModelPositionOutsideModelElement(this.editor.model, (viewElement) =>\n        viewElement.hasClass('placeholder')\n      )\n    );\n\n    this.editor.config.define('placeholderConfig', {\n      types: ['date', 'first name', 'surname'],\n    });\n  }\n\n  _defineSchema() {\n    const schema = this.editor.model.schema;\n\n    schema.register('placeholder', {\n      // Behaves like a self-contained inline object (e.g. an inline image)\n      // allowed in places where $text is allowed (e.g. in paragraphs).\n      // The inline widget can have the same attributes as text (for example linkHref, bold).\n      inheritAllFrom: '$inlineObject',\n\n      // The placeholder can have many types, like date, name, surname, etc:\n      allowAttributes: ['name'],\n    });\n  }\n\n  _defineConverters() {\n    const conversion = this.editor.conversion;\n\n    conversion.for('upcast').elementToElement({\n      view: {\n        name: 'span',\n        classes: ['placeholder'],\n      },\n      model: (viewElement, { writer: modelWriter }) => {\n        // Extract the \"name\" from \"{name}\".\n        const name = viewElement.getChild(0).data.slice(1, -1);\n\n        return modelWriter.createElement('placeholder', { name });\n      },\n    });\n\n    conversion.for('editingDowncast').elementToElement({\n      model: 'placeholder',\n      view: (modelItem, { writer: viewWriter }) => {\n        const widgetElement = createPlaceholderView(modelItem, viewWriter);\n\n        // Enable widget handling on a placeholder element inside the editing view.\n        return toWidget(widgetElement, viewWriter);\n      },\n    });\n\n    conversion.for('dataDowncast').elementToElement({\n      model: 'placeholder',\n      view: (modelItem, { writer: viewWriter }) =>\n        createPlaceholderView(modelItem, viewWriter),\n    });\n\n    // Helper method for both downcast converters.\n    function createPlaceholderView(modelItem, viewWriter) {\n      const name = modelItem.getAttribute('name');\n\n      const placeholderView = viewWriter.createContainerElement('span', {\n        class: 'placeholder',\n      });\n\n      // Insert the placeholder name (as a text).\n      const innerText = viewWriter.createText('{' + name + '}');\n      viewWriter.insert(\n        viewWriter.createPositionAt(placeholderView, 0),\n        innerText\n      );\n\n      return placeholderView;\n    }\n  }\n}\n","/* eslint-disable ember/classic-decorator-hooks */\nimport { Plugin } from '@ckeditor/ckeditor5-core';\nimport {\n  Model,\n  addListToDropdown,\n  createDropdown,\n} from '@ckeditor/ckeditor5-ui';\nimport { Collection } from '@ckeditor/ckeditor5-utils';\n\nexport default class PlaceholderUI extends Plugin {\n  init() {\n    const editor = this.editor;\n    const t = editor.t;\n    // recupero da ckeditor.js le voci placeholder da mostrare\n    const placeholderNames = editor.config.get('placeholderConfig.types');\n\n    // The \"placeholder\" dropdown must be registered among the UI components of the editor\n    // to be displayed in the toolbar.\n    editor.ui.componentFactory.add('placeholder', (locale) => {\n      const dropdownView = createDropdown(locale);\n\n      // Populate the list in the dropdown with items.\n      addListToDropdown(\n        dropdownView,\n        getDropdownItemsDefinitions(placeholderNames)\n      );\n\n      dropdownView.buttonView.set({\n        // The t() function helps localize the editor. All strings enclosed in t() can be\n        // translated and change when the language of the editor changes.\n        label: t('Placeholder'),\n        tooltip: true,\n        withText: true,\n      });\n\n      // Disable the placeholder button when the command is disabled.\n      const command = editor.commands.get('placeholder');\n      dropdownView.bind('isEnabled').to(command);\n\n      // Execute the command when the dropdown item is clicked (executed).\n      this.listenTo(dropdownView, 'execute', (evt) => {\n        editor.execute('placeholder', { value: evt.source.commandParam });\n        editor.editing.view.focus();\n      });\n\n      return dropdownView;\n    });\n  }\n}\n\nfunction getDropdownItemsDefinitions(placeholderNames) {\n  const itemDefinitions = new Collection();\n\n  for (const name of placeholderNames) {\n    const definition = {\n      type: 'button',\n      model: new Model({\n        commandParam: name,\n        label: name,\n        withText: true,\n      }),\n    };\n\n    // Add the item definition to the collection.\n    itemDefinitions.add(definition);\n  }\n\n  return itemDefinitions;\n}\n","/**\n * @license Copyright (c) 2014-2023, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\nimport Fullscreen from '../src/plugins/Fullscreen/fullscreen.js';\nimport ClassicEditor from '@ckeditor/ckeditor5-editor-classic/src/classiceditor.js';\nimport Alignment from '@ckeditor/ckeditor5-alignment/src/alignment.js';\nimport AutoImage from '@ckeditor/ckeditor5-image/src/autoimage.js';\nimport Autoformat from '@ckeditor/ckeditor5-autoformat/src/autoformat.js';\nimport BlockQuote from '@ckeditor/ckeditor5-block-quote/src/blockquote.js';\nimport Bold from '@ckeditor/ckeditor5-basic-styles/src/bold.js';\nimport CloudServices from '@ckeditor/ckeditor5-cloud-services/src/cloudservices.js';\nimport CodeBlock from '@ckeditor/ckeditor5-code-block/src/codeblock.js';\nimport Essentials from '@ckeditor/ckeditor5-essentials/src/essentials.js';\nimport FindAndReplace from '@ckeditor/ckeditor5-find-and-replace/src/findandreplace.js';\nimport FontColor from '@ckeditor/ckeditor5-font/src/fontcolor.js';\nimport FontSize from '@ckeditor/ckeditor5-font/src/fontsize.js';\nimport Heading from '@ckeditor/ckeditor5-heading/src/heading.js';\nimport HorizontalLine from '@ckeditor/ckeditor5-horizontal-line/src/horizontalline.js';\nimport Image from '@ckeditor/ckeditor5-image/src/image.js';\nimport ImageCaption from '@ckeditor/ckeditor5-image/src/imagecaption.js';\nimport ImageInsert from '@ckeditor/ckeditor5-image/src/imageinsert.js';\nimport ImageResize from '@ckeditor/ckeditor5-image/src/imageresize.js';\nimport ImageStyle from '@ckeditor/ckeditor5-image/src/imagestyle.js';\nimport ImageToolbar from '@ckeditor/ckeditor5-image/src/imagetoolbar.js';\nimport ImageUpload from '@ckeditor/ckeditor5-image/src/imageupload.js';\nimport Indent from '@ckeditor/ckeditor5-indent/src/indent.js';\nimport IndentBlock from '@ckeditor/ckeditor5-indent/src/indentblock.js';\nimport Italic from '@ckeditor/ckeditor5-basic-styles/src/italic.js';\nimport Link from '@ckeditor/ckeditor5-link/src/link.js';\nimport LinkImage from '@ckeditor/ckeditor5-link/src/linkimage.js';\nimport List from '@ckeditor/ckeditor5-list/src/list.js';\nimport ListProperties from '@ckeditor/ckeditor5-list/src/listproperties.js';\nimport MediaEmbed from '@ckeditor/ckeditor5-media-embed/src/mediaembed.js';\nimport Mention from '@ckeditor/ckeditor5-mention/src/mention.js';\nimport PageBreak from '@ckeditor/ckeditor5-page-break/src/pagebreak.js';\nimport Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph.js';\nimport PasteFromOffice from '@ckeditor/ckeditor5-paste-from-office/src/pastefromoffice.js';\nimport RemoveFormat from '@ckeditor/ckeditor5-remove-format/src/removeformat.js';\nimport SelectAll from '@ckeditor/ckeditor5-select-all/src/selectall.js';\nimport SourceEditing from '@ckeditor/ckeditor5-source-editing/src/sourceediting.js';\nimport SpecialCharacters from '@ckeditor/ckeditor5-special-characters/src/specialcharacters.js';\nimport SpecialCharactersArrows from '@ckeditor/ckeditor5-special-characters/src/specialcharactersarrows.js';\nimport SpecialCharactersCurrency from '@ckeditor/ckeditor5-special-characters/src/specialcharacterscurrency.js';\nimport SpecialCharactersEssentials from '@ckeditor/ckeditor5-special-characters/src/specialcharactersessentials.js';\nimport SpecialCharactersLatin from '@ckeditor/ckeditor5-special-characters/src/specialcharacterslatin.js';\nimport SpecialCharactersMathematical from '@ckeditor/ckeditor5-special-characters/src/specialcharactersmathematical.js';\nimport SpecialCharactersText from '@ckeditor/ckeditor5-special-characters/src/specialcharacterstext.js';\nimport StandardEditingMode from '@ckeditor/ckeditor5-restricted-editing/src/standardeditingmode.js';\nimport Table from '@ckeditor/ckeditor5-table/src/table.js';\nimport TableCellProperties from '@ckeditor/ckeditor5-table/src/tablecellproperties';\nimport TableColumnResize from '@ckeditor/ckeditor5-table/src/tablecolumnresize.js';\nimport TableToolbar from '@ckeditor/ckeditor5-table/src/tabletoolbar.js';\nimport TextTransformation from '@ckeditor/ckeditor5-typing/src/texttransformation.js';\nimport Underline from '@ckeditor/ckeditor5-basic-styles/src/underline.js';\nimport WordCount from '@ckeditor/ckeditor5-word-count/src/wordcount.js';\n\n//import { Plugin } from '@ckeditor/ckeditor5-core';\n\n// Importazione plugins custom\nimport Placeholder from '../src/plugins/placeholder/placeholder.js';\n\nclass Editor extends ClassicEditor {}\n\n// Plugins to include in the build.\nEditor.builtinPlugins = [\n  Fullscreen,\n  Alignment,\n  AutoImage,\n  Autoformat,\n  BlockQuote,\n  Bold,\n  CloudServices,\n  CodeBlock,\n  Essentials,\n  FindAndReplace,\n  FontColor,\n  FontSize,\n  Heading,\n  HorizontalLine,\n  Image,\n  ImageCaption,\n  ImageInsert,\n  ImageResize,\n  ImageStyle,\n  ImageToolbar,\n  ImageUpload,\n  Indent,\n  IndentBlock,\n  Italic,\n  Link,\n  LinkImage,\n  List,\n  ListProperties,\n  MediaEmbed,\n  Mention,\n  PageBreak,\n  Paragraph,\n  PasteFromOffice,\n  RemoveFormat,\n  SelectAll,\n  SourceEditing,\n  SpecialCharacters,\n  SpecialCharactersArrows,\n  SpecialCharactersCurrency,\n  SpecialCharactersEssentials,\n  SpecialCharactersLatin,\n  SpecialCharactersMathematical,\n  SpecialCharactersText,\n  StandardEditingMode,\n  Table,\n  TableCellProperties,\n  TableColumnResize,\n  TableToolbar,\n  TextTransformation,\n  Underline,\n  WordCount,\n  Placeholder,\n];\n\n// Editor configuration.\nEditor.defaultConfig = {\n  toolbar: {\n    items: [\n      'fullscreen',\n      'sourceEditing',\n      '|',\n      'heading',\n      '|',\n      'bold',\n      'italic',\n      'underline',\n      'link',\n      'alignment',\n      '|',\n      'fontColor',\n      'fontSize',\n      'specialCharacters',\n      'removeFormat',\n      '|',\n      'bulletedList',\n      'numberedList',\n      '|',\n      'outdent',\n      'indent',\n      '|',\n      'insertTable',\n      '|',\n      'imageUpload',\n      'imageInsert',\n      'mediaEmbed',\n      '|',\n      'horizontalLine',\n      'blockQuote',\n      'pageBreak',\n      '|',\n      '-',\n      'undo',\n      'redo',\n      '|',\n      'findAndReplace',\n      'restrictedEditingException',\n      'codeBlock',\n      'selectAll',\n      '|',\n      'placeholder',\n    ],\n    shouldNotGroupWhenFull: true,\n  },\n  language: 'en',\n  image: {\n    toolbar: [\n      'imageTextAlternative',\n      'toggleImageCaption',\n      'imageStyle:inline',\n      'imageStyle:block',\n      'imageStyle:side',\n      'linkImage',\n    ],\n  },\n  table: {\n    contentToolbar: [\n      'tableColumn',\n      'tableRow',\n      'mergeTableCells',\n      'tableCellProperties',\n    ],\n  },\n  placeholderConfig: {\n    types: [\n      'UserName',\n      'UserSurname',\n      'UserEmail',\n      'TenantName',\n      'TenantVAT',\n      'TenantEmail',\n      'TenantPEC',\n      'TenantPhone',\n      'TenantAddress',\n      'TenantCity',\n      'BaseEndPoint',\n      'OTP',\n    ],\n  },\n};\n\nexport default Editor;\n","import Plugin from '@ckeditor/ckeditor5-core/src/plugin';\nimport ButtonView from '@ckeditor/ckeditor5-ui/src/button/buttonview';\nimport './fullscreen.css';\n\nexport default class Fullscreen extends Plugin {\n  constructor(editor) {\n    super(editor);\n\n    editor.ui.componentFactory.add('fullscreen', (locale) => {\n      const view = new ButtonView(locale);\n      const fullscreenIcon = `\n          <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n              <path fill=\"currentColor\" d=\"M5 3h4V0H3v6h2V3zm16-3h-4v3h2v3h6V0h-4zm-2 20h-2v3h6v-6h-2v3h-2v-3zm-12 0v-2H3v6h6v-2H5v-2h4v-3z\"/>\n          </svg>\n      `;\n\n      view.set({\n        label: 'Toggle Fullscreen',\n        icon: fullscreenIcon,\n        tooltip: true,\n      });\n\n      // Callback executed when the button is clicked\n      view.on('execute', () => {\n        const editorElement = editor.ui.view.element; // editor.ui.view.editable.element;\n\n        if (editorElement.classList.contains('ckeditor-fullscreen')) {\n          editorElement.classList.remove('ckeditor-fullscreen');\n        } else {\n          editorElement.classList.add('ckeditor-fullscreen');\n        }\n      });\n\n      return view;\n    });\n  }\n}\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module alignment/alignment\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport AlignmentEditing from './alignmentediting';\r\nimport AlignmentUI from './alignmentui';\r\n/**\r\n * The text alignment plugin.\r\n *\r\n * For a detailed overview, check the {@glink features/text-alignment Text alignment} feature guide\r\n * and the {@glink api/alignment package page}.\r\n *\r\n * This is a \"glue\" plugin which loads the {@link module:alignment/alignmentediting~AlignmentEditing} and\r\n * {@link module:alignment/alignmentui~AlignmentUI} plugins.\r\n */\r\nexport default class Alignment extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [AlignmentEditing, AlignmentUI];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'Alignment';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module block-quote/blockquote\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport BlockQuoteEditing from './blockquoteediting';\r\nimport BlockQuoteUI from './blockquoteui';\r\n/**\r\n * The block quote plugin.\r\n *\r\n * For more information about this feature check the {@glink api/block-quote package page}.\r\n *\r\n * This is a \"glue\" plugin which loads the {@link module:block-quote/blockquoteediting~BlockQuoteEditing block quote editing feature}\r\n * and {@link module:block-quote/blockquoteui~BlockQuoteUI block quote UI feature}.\r\n *\r\n * @extends module:core/plugin~Plugin\r\n */\r\nexport default class BlockQuote extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [BlockQuoteEditing, BlockQuoteUI];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'BlockQuote';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module basic-styles/bold\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport BoldEditing from './bold/boldediting';\r\nimport BoldUI from './bold/boldui';\r\n/**\r\n * The bold feature.\r\n *\r\n * For a detailed overview check the {@glink features/basic-styles Basic styles feature} guide\r\n * and the {@glink api/basic-styles package page}.\r\n *\r\n * This is a \"glue\" plugin which loads the {@link module:basic-styles/bold/boldediting~BoldEditing bold editing feature}\r\n * and {@link module:basic-styles/bold/boldui~BoldUI bold UI feature}.\r\n */\r\nexport default class Bold extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [BoldEditing, BoldUI];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'Bold';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module cloud-services/cloudservices\r\n */\r\nimport { ContextPlugin } from 'ckeditor5/src/core';\r\nimport { CKEditorError } from 'ckeditor5/src/utils';\r\nimport CloudServicesCore from './cloudservicescore';\r\n/**\r\n * Plugin introducing the integration between CKEditor 5 and CKEditor Cloud Services .\r\n *\r\n * It initializes the token provider based on\r\n * the {@link module:cloud-services/cloudservicesconfig~CloudServicesConfig `config.cloudService`}.\r\n */\r\nexport default class CloudServices extends ContextPlugin {\r\n    constructor() {\r\n        super(...arguments);\r\n        /**\r\n         * Other plugins use this token for the authorization process. It handles token requesting and refreshing.\r\n         * Its value is `null` when {@link module:cloud-services/cloudservicesconfig~CloudServicesConfig#tokenUrl} is not provided.\r\n         *\r\n         * @readonly\r\n         */\r\n        this.token = null;\r\n        /**\r\n         * A map of token object instances keyed by the token URLs.\r\n         */\r\n        this._tokens = new Map();\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'CloudServices';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [CloudServicesCore];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    async init() {\r\n        const config = this.context.config;\r\n        const options = config.get('cloudServices') || {};\r\n        for (const [key, value] of Object.entries(options)) {\r\n            this[key] = value;\r\n        }\r\n        if (!this.tokenUrl) {\r\n            this.token = null;\r\n            return;\r\n        }\r\n        const cloudServicesCore = this.context.plugins.get('CloudServicesCore');\r\n        this.token = await cloudServicesCore.createToken(this.tokenUrl).init();\r\n        this._tokens.set(this.tokenUrl, this.token);\r\n    }\r\n    /**\r\n     * Registers an additional authentication token URL for CKEditor Cloud Services or a callback to the token value promise. See the\r\n     * {@link module:cloud-services/cloudservicesconfig~CloudServicesConfig#tokenUrl} for more details.\r\n     *\r\n     * @param tokenUrl The authentication token URL for CKEditor Cloud Services or a callback to the token value promise.\r\n     */\r\n    async registerTokenUrl(tokenUrl) {\r\n        // Reuse the token instance in case of multiple features using the same token URL.\r\n        if (this._tokens.has(tokenUrl)) {\r\n            return this.getTokenFor(tokenUrl);\r\n        }\r\n        const cloudServicesCore = this.context.plugins.get('CloudServicesCore');\r\n        const token = await cloudServicesCore.createToken(tokenUrl).init();\r\n        this._tokens.set(tokenUrl, token);\r\n        return token;\r\n    }\r\n    /**\r\n     * Returns an authentication token provider previously registered by {@link #registerTokenUrl}.\r\n     *\r\n     * @param tokenUrl The authentication token URL for CKEditor Cloud Services or a callback to the token value promise.\r\n     */\r\n    getTokenFor(tokenUrl) {\r\n        const token = this._tokens.get(tokenUrl);\r\n        if (!token) {\r\n            /**\r\n             * The provided `tokenUrl` was not registered by {@link module:cloud-services/cloudservices~CloudServices#registerTokenUrl}.\r\n             *\r\n             * @error cloudservices-token-not-registered\r\n             */\r\n            throw new CKEditorError('cloudservices-token-not-registered', this);\r\n        }\r\n        return token;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        super.destroy();\r\n        for (const token of this._tokens.values()) {\r\n            token.destroy();\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module code-block/codeblock\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport CodeBlockEditing from './codeblockediting';\r\nimport CodeBlockUI from './codeblockui';\r\n/**\r\n * The code block plugin.\r\n *\r\n * For more information about this feature check the {@glink api/code-block package page} and the\r\n * {@glink features/code-blocks code block} feature guide.\r\n *\r\n * This is a \"glue\" plugin that loads the {@link module:code-block/codeblockediting~CodeBlockEditing code block editing feature}\r\n * and the {@link module:code-block/codeblockui~CodeBlockUI code block UI feature}.\r\n */\r\nexport default class CodeBlock extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [CodeBlockEditing, CodeBlockUI];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'CodeBlock';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module essentials/essentials\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { Clipboard } from 'ckeditor5/src/clipboard';\r\nimport { Enter, ShiftEnter } from 'ckeditor5/src/enter';\r\nimport { SelectAll } from 'ckeditor5/src/select-all';\r\nimport { Typing } from 'ckeditor5/src/typing';\r\nimport { Undo } from 'ckeditor5/src/undo';\r\n/**\r\n * A plugin including all essential editing features. It represents a set of features that enables similar functionalities\r\n * to a `<textarea>` element.\r\n *\r\n * It includes:\r\n *\r\n * * {@link module:clipboard/clipboard~Clipboard},\r\n * * {@link module:enter/enter~Enter},\r\n * * {@link module:select-all/selectall~SelectAll},\r\n * * {@link module:enter/shiftenter~ShiftEnter},\r\n * * {@link module:typing/typing~Typing},\r\n * * {@link module:undo/undo~Undo}.\r\n *\r\n * This plugin set does not define any block-level containers (such as {@link module:paragraph/paragraph~Paragraph}).\r\n * If your editor is supposed to handle block content, make sure to include it.\r\n */\r\nexport default class Essentials extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [Clipboard, Enter, SelectAll, ShiftEnter, Typing, Undo];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'Essentials';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module find-and-replace/findandreplace\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport FindAndReplaceUI from './findandreplaceui';\r\nimport FindAndReplaceEditing from './findandreplaceediting';\r\n/**\r\n * The find and replace plugin.\r\n *\r\n * For a detailed overview, check the {@glink features/find-and-replace Find and replace feature documentation}.\r\n *\r\n * This is a \"glue\" plugin which loads the following plugins:\r\n *\r\n * * The {@link module:find-and-replace/findandreplaceediting~FindAndReplaceEditing find and replace editing feature},\r\n * * The {@link module:find-and-replace/findandreplaceui~FindAndReplaceUI find and replace UI feature}\r\n */\r\nexport default class FindAndReplace extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [FindAndReplaceEditing, FindAndReplaceUI];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'FindAndReplace';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const ui = this.editor.plugins.get('FindAndReplaceUI');\r\n        const findAndReplaceEditing = this.editor.plugins.get('FindAndReplaceEditing');\r\n        const state = findAndReplaceEditing.state;\r\n        ui.on('findNext', (event, data) => {\r\n            // Data is contained only for the \"find\" button.\r\n            if (data) {\r\n                state.searchText = data.searchText;\r\n                this.editor.execute('find', data.searchText, data);\r\n            }\r\n            else {\r\n                // Find next arrow button press.\r\n                this.editor.execute('findNext');\r\n            }\r\n        });\r\n        ui.on('findPrevious', (event, data) => {\r\n            if (data && state.searchText !== data.searchText) {\r\n                this.editor.execute('find', data.searchText);\r\n            }\r\n            else {\r\n                // Subsequent calls.\r\n                this.editor.execute('findPrevious');\r\n            }\r\n        });\r\n        ui.on('replace', (event, data) => {\r\n            if (state.searchText !== data.searchText) {\r\n                this.editor.execute('find', data.searchText);\r\n            }\r\n            const highlightedResult = state.highlightedResult;\r\n            if (highlightedResult) {\r\n                this.editor.execute('replace', data.replaceText, highlightedResult);\r\n            }\r\n        });\r\n        ui.on('replaceAll', (event, data) => {\r\n            // The state hadn't been yet built for this search text.\r\n            if (state.searchText !== data.searchText) {\r\n                this.editor.execute('find', data.searchText);\r\n            }\r\n            this.editor.execute('replaceAll', data.replaceText, state.results);\r\n        });\r\n        // Reset the state when the user invalidated last search results, for instance,\r\n        // by starting typing another search query or changing options.\r\n        ui.on('searchReseted', () => {\r\n            state.clear(this.editor.model);\r\n            findAndReplaceEditing.stop();\r\n        });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module font/fontcolor\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport FontColorEditing from './fontcolor/fontcolorediting';\r\nimport FontColorUI from './fontcolor/fontcolorui';\r\n/**\r\n * The font color plugin.\r\n *\r\n * For a detailed overview, check the {@glink features/font font feature} documentation\r\n * and the {@glink api/font package page}.\r\n *\r\n * This is a \"glue\" plugin which loads the {@link module:font/fontcolor/fontcolorediting~FontColorEditing} and\r\n * {@link module:font/fontcolor/fontcolorui~FontColorUI} features in the editor.\r\n */\r\nexport default class FontColor extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [FontColorEditing, FontColorUI];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'FontColor';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module font/fontsize\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport FontSizeEditing from './fontsize/fontsizeediting';\r\nimport FontSizeUI from './fontsize/fontsizeui';\r\nimport { normalizeOptions } from './fontsize/utils';\r\n/**\r\n * The font size plugin.\r\n *\r\n * For a detailed overview, check the {@glink features/font font feature} documentation\r\n * and the {@glink api/font package page}.\r\n *\r\n * This is a \"glue\" plugin which loads the {@link module:font/fontsize/fontsizeediting~FontSizeEditing} and\r\n * {@link module:font/fontsize/fontsizeui~FontSizeUI} features in the editor.\r\n */\r\nexport default class FontSize extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [FontSizeEditing, FontSizeUI];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'FontSize';\r\n    }\r\n    /**\r\n     * Normalizes and translates the {@link module:font/fontconfig~FontSizeConfig#options configuration options}\r\n     * to the {@link module:font/fontconfig~FontSizeOption} format.\r\n     *\r\n     * @param configuredOptions An array of options taken from the configuration.\r\n     */\r\n    normalizeSizeOptions(options) {\r\n        return normalizeOptions(options);\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module heading/heading\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport HeadingEditing from './headingediting';\r\nimport HeadingUI from './headingui';\r\nimport '../theme/heading.css';\r\n/**\r\n * The headings feature.\r\n *\r\n * For a detailed overview, check the {@glink features/headings Headings feature} guide\r\n * and the {@glink api/heading package page}.\r\n *\r\n * This is a \"glue\" plugin which loads the {@link module:heading/headingediting~HeadingEditing heading editing feature}\r\n * and {@link module:heading/headingui~HeadingUI heading UI feature}.\r\n *\r\n * @extends module:core/plugin~Plugin\r\n */\r\nexport default class Heading extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [HeadingEditing, HeadingUI];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'Heading';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module horizontal-line/horizontalline\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { Widget } from 'ckeditor5/src/widget';\r\nimport HorizontalLineEditing from './horizontallineediting';\r\nimport HorizontalLineUI from './horizontallineui';\r\n/**\r\n * The horizontal line feature.\r\n *\r\n * It provides the possibility to insert a horizontal line into the rich-text editor.\r\n *\r\n * For a detailed overview, check the {@glink features/horizontal-line Horizontal line feature} documentation.\r\n */\r\nexport default class HorizontalLine extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [HorizontalLineEditing, HorizontalLineUI, Widget];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'HorizontalLine';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/image\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport ImageBlock from './imageblock';\r\nimport ImageInline from './imageinline';\r\nimport '../theme/image.css';\r\n/**\r\n * The image plugin.\r\n *\r\n * For a detailed overview, check the {@glink features/images/images-overview image feature} documentation.\r\n *\r\n * This is a \"glue\" plugin which loads the following plugins:\r\n *\r\n * * {@link module:image/imageblock~ImageBlock},\r\n * * {@link module:image/imageinline~ImageInline},\r\n *\r\n * Usually, it is used in conjunction with other plugins from this package. See the {@glink api/image package page}\r\n * for more information.\r\n */\r\nexport default class Image extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ImageBlock, ImageInline];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'Image';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imagecaption\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport ImageCaptionEditing from './imagecaption/imagecaptionediting';\r\nimport ImageCaptionUI from './imagecaption/imagecaptionui';\r\nimport '../theme/imagecaption.css';\r\n/**\r\n * The image caption plugin.\r\n *\r\n * For a detailed overview, check the {@glink features/images/images-captions image caption} documentation.\r\n */\r\nexport default class ImageCaption extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ImageCaptionEditing, ImageCaptionUI];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageCaption';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imageinsert\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport ImageUpload from './imageupload';\r\nimport ImageInsertViaUrl from './imageinsertviaurl';\r\nimport ImageInsertUI from './imageinsert/imageinsertui';\r\n/**\r\n * The image insert plugin.\r\n *\r\n * For a detailed overview, check the {@glink features/images/image-upload/image-upload Image upload feature}\r\n * and {@glink features/images/images-inserting Insert images via source URL} documentation.\r\n *\r\n * This plugin does not do anything directly, but it loads a set of specific plugins\r\n * to enable image uploading or inserting via implemented integrations:\r\n *\r\n * * {@link module:image/imageupload~ImageUpload}\r\n * * {@link module:image/imageinsert/imageinsertui~ImageInsertUI}\r\n */\r\nexport default class ImageInsert extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageInsert';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ImageUpload, ImageInsertViaUrl, ImageInsertUI];\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imageresize\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport ImageResizeButtons from './imageresize/imageresizebuttons';\r\nimport ImageResizeEditing from './imageresize/imageresizeediting';\r\nimport ImageResizeHandles from './imageresize/imageresizehandles';\r\nimport '../theme/imageresize.css';\r\n/**\r\n * The image resize plugin.\r\n *\r\n * It adds a possibility to resize each image using handles.\r\n */\r\nexport default class ImageResize extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ImageResizeEditing, ImageResizeHandles, ImageResizeButtons];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageResize';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imagestyle\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport ImageStyleEditing from './imagestyle/imagestyleediting';\r\nimport ImageStyleUI from './imagestyle/imagestyleui';\r\n/**\r\n * The image style plugin.\r\n *\r\n * For a detailed overview of the image styles feature, check the {@glink features/images/images-styles documentation}.\r\n *\r\n * This is a \"glue\" plugin which loads the following plugins:\r\n * * {@link module:image/imagestyle/imagestyleediting~ImageStyleEditing},\r\n * * {@link module:image/imagestyle/imagestyleui~ImageStyleUI}\r\n *\r\n * It provides a default configuration, which can be extended or overwritten.\r\n * Read more about the {@link module:image/imageconfig~ImageConfig#styles image styles configuration}.\r\n */\r\nexport default class ImageStyle extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ImageStyleEditing, ImageStyleUI];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageStyle';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module image/imagetoolbar\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { WidgetToolbarRepository } from 'ckeditor5/src/widget';\r\nimport ImageUtils from './imageutils';\r\nimport { isObject } from 'lodash-es';\r\n/**\r\n * The image toolbar plugin. It creates and manages the image toolbar (the toolbar displayed when an image is selected).\r\n *\r\n * For an overview, check the {@glink features/images/images-overview#image-contextual-toolbar image contextual toolbar} documentation.\r\n *\r\n * Instances of toolbar components (e.g. buttons) are created using the editor's\r\n * {@link module:ui/componentfactory~ComponentFactory component factory}\r\n * based on the {@link module:image/imageconfig~ImageConfig#toolbar `image.toolbar` configuration option}.\r\n *\r\n * The toolbar uses the {@link module:ui/panel/balloon/contextualballoon~ContextualBalloon}.\r\n */\r\nexport default class ImageToolbar extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [WidgetToolbarRepository, ImageUtils];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ImageToolbar';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    afterInit() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        const widgetToolbarRepository = editor.plugins.get(WidgetToolbarRepository);\r\n        const imageUtils = editor.plugins.get('ImageUtils');\r\n        widgetToolbarRepository.register('image', {\r\n            ariaLabel: t('Image toolbar'),\r\n            items: normalizeDeclarativeConfig(editor.config.get('image.toolbar') || []),\r\n            getRelatedElement: selection => imageUtils.getClosestSelectedImageWidget(selection)\r\n        });\r\n    }\r\n}\r\n/**\r\n * Convert the dropdown definitions to their keys registered in the ComponentFactory.\r\n * The registration precess should be handled by the plugin which handles the UI of a particular feature.\r\n */\r\nfunction normalizeDeclarativeConfig(config) {\r\n    return config.map(item => isObject(item) ? item.name : item);\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module indent/indent\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport IndentEditing from './indentediting';\r\nimport IndentUI from './indentui';\r\n/**\r\n * The indent feature.\r\n *\r\n * This plugin acts as a single entry point plugin for other features that implement indentation of elements like lists or paragraphs.\r\n *\r\n * The compatible features are:\r\n *\r\n * * The {@link module:list/list~List} or {@link module:list/list/listediting~ListEditing} feature for list indentation.\r\n * * The {@link module:indent/indentblock~IndentBlock} feature for block indentation.\r\n *\r\n * This is a \"glue\" plugin that loads the following plugins:\r\n *\r\n * * The {@link module:indent/indentediting~IndentEditing indent editing feature}.\r\n * * The {@link module:indent/indentui~IndentUI indent UI feature}.\r\n *\r\n * The dependent plugins register the `'indent'` and `'outdent'` commands and introduce the `'indent'` and `'outdent'` buttons\r\n * that allow to increase or decrease text indentation of supported elements.\r\n *\r\n * **Note**: In order for the commands and buttons to work, at least one of compatible features is required.\r\n */\r\nexport default class Indent extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'Indent';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [IndentEditing, IndentUI];\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module basic-styles/italic\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport ItalicEditing from './italic/italicediting';\r\nimport ItalicUI from './italic/italicui';\r\n/**\r\n * The italic feature.\r\n *\r\n * For a detailed overview check the {@glink features/basic-styles Basic styles feature} guide\r\n * and the {@glink api/basic-styles package page}.\r\n *\r\n * This is a \"glue\" plugin which loads the {@link module:basic-styles/italic/italicediting~ItalicEditing} and\r\n * {@link module:basic-styles/italic/italicui~ItalicUI} plugins.\r\n */\r\nexport default class Italic extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ItalicEditing, ItalicUI];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'Italic';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module link/link\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport LinkEditing from './linkediting';\r\nimport LinkUI from './linkui';\r\nimport AutoLink from './autolink';\r\n/**\r\n * The link plugin.\r\n *\r\n * This is a \"glue\" plugin that loads the {@link module:link/linkediting~LinkEditing link editing feature}\r\n * and {@link module:link/linkui~LinkUI link UI feature}.\r\n */\r\nexport default class Link extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [LinkEditing, LinkUI, AutoLink];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'Link';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module link/linkimage\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport LinkImageEditing from './linkimageediting';\r\nimport LinkImageUI from './linkimageui';\r\nimport '../theme/linkimage.css';\r\n/**\r\n * The `LinkImage` plugin.\r\n *\r\n * This is a \"glue\" plugin that loads the {@link module:link/linkimageediting~LinkImageEditing link image editing feature}\r\n * and {@link module:link/linkimageui~LinkImageUI link image UI feature}.\r\n */\r\nexport default class LinkImage extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [LinkImageEditing, LinkImageUI];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'LinkImage';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module list/list\r\n */\r\nimport ListEditing from './list/listediting';\r\nimport ListUI from './list/listui';\r\nimport { Plugin } from 'ckeditor5/src/core';\r\n/**\r\n * The list feature.\r\n *\r\n * This is a \"glue\" plugin that loads the {@link module:list/list/listediting~ListEditing list editing feature}\r\n * and {@link module:list/list/listui~ListUI list UI feature}.\r\n */\r\nexport default class List extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ListEditing, ListUI];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'List';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module list/listproperties\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport ListPropertiesEditing from './listproperties/listpropertiesediting';\r\nimport ListPropertiesUI from './listproperties/listpropertiesui';\r\n/**\r\n * The list properties feature.\r\n *\r\n * This is a \"glue\" plugin that loads the {@link module:list/listproperties/listpropertiesediting~ListPropertiesEditing list properties\r\n * editing feature} and the {@link module:list/listproperties/listpropertiesui~ListPropertiesUI list properties UI feature}.\r\n */\r\nexport default class ListProperties extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ListPropertiesEditing, ListPropertiesUI];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'ListProperties';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module media-embed/mediaembed\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { Widget } from 'ckeditor5/src/widget';\r\nimport MediaEmbedEditing from './mediaembedediting';\r\nimport AutoMediaEmbed from './automediaembed';\r\nimport MediaEmbedUI from './mediaembedui';\r\nimport '../theme/mediaembed.css';\r\n/**\r\n * The media embed plugin.\r\n *\r\n * For a detailed overview, check the {@glink features/media-embed Media Embed feature documentation}.\r\n *\r\n * This is a \"glue\" plugin which loads the following plugins:\r\n *\r\n * * The {@link module:media-embed/mediaembedediting~MediaEmbedEditing media embed editing feature},\r\n * * The {@link module:media-embed/mediaembedui~MediaEmbedUI media embed UI feature} and\r\n * * The {@link module:media-embed/automediaembed~AutoMediaEmbed auto-media embed feature}.\r\n */\r\nexport default class MediaEmbed extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [MediaEmbedEditing, MediaEmbedUI, AutoMediaEmbed, Widget];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'MediaEmbed';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module mention/mention\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport MentionEditing, { _toMentionAttribute } from './mentionediting';\r\nimport MentionUI from './mentionui';\r\nimport '../theme/mention.css';\r\n/**\r\n * The mention plugin.\r\n *\r\n * For a detailed overview, check the {@glink features/mentions Mention feature} guide.\r\n */\r\nexport default class Mention extends Plugin {\r\n    /**\r\n     * Creates a mention attribute value from the provided view element and optional data.\r\n     *\r\n     * ```ts\r\n     * editor.plugins.get( 'Mention' ).toMentionAttribute( viewElement, { userId: '1234' } );\r\n     *\r\n     * // For a view element: <span data-mention=\"@joe\">@John Doe</span>\r\n     * // it will return:\r\n     * // { id: '@joe', userId: '1234', uid: '7a7bc7...', _text: '@John Doe' }\r\n     * ```\r\n     *\r\n     * @param viewElement\r\n     * @param data Additional data to be stored in the mention attribute.\r\n     */\r\n    toMentionAttribute(viewElement, data) {\r\n        return _toMentionAttribute(viewElement, data);\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'Mention';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [MentionEditing, MentionUI];\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module page-break/pagebreak\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { Widget } from 'ckeditor5/src/widget';\r\nimport PageBreakEditing from './pagebreakediting';\r\nimport PageBreakUI from './pagebreakui';\r\n/**\r\n * The page break feature.\r\n *\r\n * It provides the possibility to insert a page break into the rich-text editor.\r\n *\r\n * For a detailed overview, check the {@glink features/page-break Page break feature} documentation.\r\n */\r\nexport default class PageBreak extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [PageBreakEditing, PageBreakUI, Widget];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'PageBreak';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module paste-from-office/pastefromoffice\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { ClipboardPipeline } from 'ckeditor5/src/clipboard';\r\nimport MSWordNormalizer from './normalizers/mswordnormalizer';\r\nimport GoogleDocsNormalizer from './normalizers/googledocsnormalizer';\r\nimport GoogleSheetsNormalizer from './normalizers/googlesheetsnormalizer';\r\nimport { parseHtml } from './filters/parse';\r\n/**\r\n * The Paste from Office plugin.\r\n *\r\n * This plugin handles content pasted from Office apps and transforms it (if necessary)\r\n * to a valid structure which can then be understood by the editor features.\r\n *\r\n * Transformation is made by a set of predefined {@link module:paste-from-office/normalizer~Normalizer normalizers}.\r\n * This plugin includes following normalizers:\r\n * * {@link module:paste-from-office/normalizers/mswordnormalizer~MSWordNormalizer Microsoft Word normalizer}\r\n * * {@link module:paste-from-office/normalizers/googledocsnormalizer~GoogleDocsNormalizer Google Docs normalizer}\r\n *\r\n * For more information about this feature check the {@glink api/paste-from-office package page}.\r\n */\r\nexport default class PasteFromOffice extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'PasteFromOffice';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [ClipboardPipeline];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        const clipboardPipeline = editor.plugins.get('ClipboardPipeline');\r\n        const viewDocument = editor.editing.view.document;\r\n        const normalizers = [];\r\n        normalizers.push(new MSWordNormalizer(viewDocument));\r\n        normalizers.push(new GoogleDocsNormalizer(viewDocument));\r\n        normalizers.push(new GoogleSheetsNormalizer(viewDocument));\r\n        clipboardPipeline.on('inputTransformation', (evt, data) => {\r\n            if (data._isTransformedWithPasteFromOffice) {\r\n                return;\r\n            }\r\n            const codeBlock = editor.model.document.selection.getFirstPosition().parent;\r\n            if (codeBlock.is('element', 'codeBlock')) {\r\n                return;\r\n            }\r\n            const htmlString = data.dataTransfer.getData('text/html');\r\n            const activeNormalizer = normalizers.find(normalizer => normalizer.isActive(htmlString));\r\n            if (activeNormalizer) {\r\n                if (!data._parsedData) {\r\n                    data._parsedData = parseHtml(htmlString, viewDocument.stylesProcessor);\r\n                }\r\n                activeNormalizer.execute(data);\r\n                data._isTransformedWithPasteFromOffice = true;\r\n            }\r\n        }, { priority: 'high' });\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module remove-format/removeformat\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport RemoveFormatUI from './removeformatui';\r\nimport RemoveFormatEditing from './removeformatediting';\r\n/**\r\n * The remove format plugin.\r\n *\r\n * This is a \"glue\" plugin which loads the {@link module:remove-format/removeformatediting~RemoveFormatEditing}\r\n * and {@link module:remove-format/removeformatui~RemoveFormatUI} plugins.\r\n *\r\n * For a detailed overview, check out the {@glink features/remove-format remove format} feature documentation.\r\n */\r\nexport default class RemoveFormat extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [RemoveFormatEditing, RemoveFormatUI];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'RemoveFormat';\r\n    }\r\n}\r\n","export default \"<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>\";","export default \"<svg viewBox=\\\"0 0 20 20\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M10 2.5a7.47 7.47 0 0 1 4.231 1.31 7.268 7.268 0 0 1 2.703 3.454 7.128 7.128 0 0 1 .199 4.353c-.39 1.436-1.475 2.72-2.633 3.677h2.013c0-.226.092-.443.254-.603a.876.876 0 0 1 1.229 0c.163.16.254.377.254.603v.853c0 .209-.078.41-.22.567a.873.873 0 0 1-.547.28l-.101.006h-4.695a.517.517 0 0 1-.516-.518v-1.265c0-.21.128-.398.317-.489a5.601 5.601 0 0 0 2.492-2.371 5.459 5.459 0 0 0 .552-3.693 5.53 5.53 0 0 0-1.955-3.2A5.71 5.71 0 0 0 10 4.206 5.708 5.708 0 0 0 6.419 5.46 5.527 5.527 0 0 0 4.46 8.663a5.457 5.457 0 0 0 .554 3.695 5.6 5.6 0 0 0 2.497 2.37.55.55 0 0 1 .317.49v1.264c0 .286-.23.518-.516.518H2.618a.877.877 0 0 1-.614-.25.845.845 0 0 1-.254-.603v-.853c0-.226.091-.443.254-.603a.876.876 0 0 1 1.228 0c.163.16.255.377.255.603h1.925c-1.158-.958-2.155-2.241-2.545-3.678a7.128 7.128 0 0 1 .199-4.352 7.268 7.268 0 0 1 2.703-3.455A7.475 7.475 0 0 1 10 2.5z\\\"/></svg>\";","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module special-characters/specialcharactersessentials\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport SpecialCharactersCurrency from './specialcharacterscurrency';\r\nimport SpecialCharactersMathematical from './specialcharactersmathematical';\r\nimport SpecialCharactersArrows from './specialcharactersarrows';\r\nimport SpecialCharactersLatin from './specialcharacterslatin';\r\nimport SpecialCharactersText from './specialcharacterstext';\r\n/**\r\n * A plugin combining a basic set of characters for the special characters plugin.\r\n *\r\n * ```ts\r\n * ClassicEditor\r\n *   .create( {\r\n *     plugins: [ ..., SpecialCharacters, SpecialCharactersEssentials ],\r\n *   } )\r\n *   .then( ... )\r\n *   .catch( ... );\r\n * ```\r\n */\r\nexport default class SpecialCharactersEssentials extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'SpecialCharactersEssentials';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [\r\n            SpecialCharactersCurrency,\r\n            SpecialCharactersText,\r\n            SpecialCharactersMathematical,\r\n            SpecialCharactersArrows,\r\n            SpecialCharactersLatin\r\n        ];\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module restricted-editing/standardeditingmode\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport StandardEditingModeEditing from './standardeditingmodeediting';\r\nimport StandardEditingModeUI from './standardeditingmodeui';\r\nimport '../theme/restrictedediting.css';\r\n/**\r\n * The standard editing mode plugin.\r\n *\r\n * This is a \"glue\" plugin that loads the following plugins:\r\n *\r\n * * The {@link module:restricted-editing/standardeditingmodeediting~StandardEditingModeEditing standard mode editing feature}.\r\n * * The {@link module:restricted-editing/standardeditingmodeui~StandardEditingModeUI standard mode UI feature}.\r\n */\r\nexport default class StandardEditingMode extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'StandardEditingMode';\r\n    }\r\n    static get requires() {\r\n        return [StandardEditingModeEditing, StandardEditingModeUI];\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/table\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { Widget } from 'ckeditor5/src/widget';\r\nimport TableEditing from './tableediting';\r\nimport TableUI from './tableui';\r\nimport TableSelection from './tableselection';\r\nimport TableClipboard from './tableclipboard';\r\nimport TableKeyboard from './tablekeyboard';\r\nimport TableMouse from './tablemouse';\r\nimport '../theme/table.css';\r\n/**\r\n * The table plugin.\r\n *\r\n * For a detailed overview, check the {@glink features/tables/tables Table feature documentation}.\r\n *\r\n * This is a \"glue\" plugin that loads the following table features:\r\n *\r\n * * {@link module:table/tableediting~TableEditing editing feature},\r\n * * {@link module:table/tableselection~TableSelection selection feature},\r\n * * {@link module:table/tablekeyboard~TableKeyboard keyboard navigation feature},\r\n * * {@link module:table/tablemouse~TableMouse mouse selection feature},\r\n * * {@link module:table/tableclipboard~TableClipboard clipboard feature},\r\n * * {@link module:table/tableui~TableUI UI feature}.\r\n */\r\nexport default class Table extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [TableEditing, TableUI, TableSelection, TableMouse, TableKeyboard, TableClipboard, Widget];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'Table';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/tablecellproperties\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport TableCellPropertiesUI from './tablecellproperties/tablecellpropertiesui';\r\nimport TableCellPropertiesEditing from './tablecellproperties/tablecellpropertiesediting';\r\n/**\r\n * The table cell properties feature. Enables support for setting properties of table cells (size, border, background, etc.).\r\n *\r\n * Read more in the {@glink features/tables/tables-styling Table and cell styling tools} section.\r\n * See also the {@link module:table/tableproperties~TableProperties} plugin.\r\n *\r\n * This is a \"glue\" plugin that loads the\r\n * {@link module:table/tablecellproperties/tablecellpropertiesediting~TableCellPropertiesEditing table cell properties editing feature} and\r\n * the {@link module:table/tablecellproperties/tablecellpropertiesui~TableCellPropertiesUI table cell properties UI feature}.\r\n */\r\nexport default class TableCellProperties extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'TableCellProperties';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [TableCellPropertiesEditing, TableCellPropertiesUI];\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/tablecolumnresize\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport TableColumnResizeEditing from './tablecolumnresize/tablecolumnresizeediting';\r\nimport TableCellWidthEditing from './tablecellwidth/tablecellwidthediting';\r\nimport '../theme/tablecolumnresize.css';\r\n/**\r\n * The table column resize feature.\r\n *\r\n * It provides the possibility to set the width of each column in a table using a resize handler.\r\n */\r\nexport default class TableColumnResize extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [TableColumnResizeEditing, TableCellWidthEditing];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'TableColumnResize';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module table/tabletoolbar\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { WidgetToolbarRepository } from 'ckeditor5/src/widget';\r\nimport { getSelectedTableWidget, getTableWidgetAncestor } from './utils/ui/widget';\r\n/**\r\n * The table toolbar class. It creates toolbars for the table feature and its content (for now only for the table cell content).\r\n *\r\n * The table toolbar shows up when a table widget is selected. Its components (e.g. buttons) are created based on the\r\n * {@link module:table/tableconfig~TableConfig#tableToolbar `table.tableToolbar` configuration option}.\r\n *\r\n * Table content toolbar shows up when the selection is inside the content of a table. It creates its component based on the\r\n * {@link module:table/tableconfig~TableConfig#contentToolbar `table.contentToolbar` configuration option}.\r\n */\r\nexport default class TableToolbar extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [WidgetToolbarRepository];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'TableToolbar';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    afterInit() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        const widgetToolbarRepository = editor.plugins.get(WidgetToolbarRepository);\r\n        const tableContentToolbarItems = editor.config.get('table.contentToolbar');\r\n        const tableToolbarItems = editor.config.get('table.tableToolbar');\r\n        if (tableContentToolbarItems) {\r\n            widgetToolbarRepository.register('tableContent', {\r\n                ariaLabel: t('Table toolbar'),\r\n                items: tableContentToolbarItems,\r\n                getRelatedElement: getTableWidgetAncestor\r\n            });\r\n        }\r\n        if (tableToolbarItems) {\r\n            widgetToolbarRepository.register('table', {\r\n                ariaLabel: t('Table toolbar'),\r\n                items: tableToolbarItems,\r\n                getRelatedElement: getSelectedTableWidget\r\n            });\r\n        }\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\n/**\r\n * @module basic-styles/underline\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport UnderlineEditing from './underline/underlineediting';\r\nimport UnderlineUI from './underline/underlineui';\r\n/**\r\n * The underline feature.\r\n *\r\n * For a detailed overview check the {@glink features/basic-styles Basic styles feature} guide\r\n * and the {@glink api/basic-styles package page}.\r\n *\r\n * This is a \"glue\" plugin which loads the {@link module:basic-styles/underline/underlineediting~UnderlineEditing} and\r\n * {@link module:basic-styles/underline/underlineui~UnderlineUI} plugins.\r\n */\r\nexport default class Underline extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get requires() {\r\n        return [UnderlineEditing, UnderlineUI];\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'Underline';\r\n    }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\r\n */\r\nimport { Plugin } from 'ckeditor5/src/core';\r\nimport { Template, View } from 'ckeditor5/src/ui';\r\nimport { env } from 'ckeditor5/src/utils';\r\nimport { modelElementToPlainText } from './utils';\r\nimport { throttle, isElement } from 'lodash-es';\r\n/**\r\n * The word count plugin.\r\n *\r\n * This plugin calculates all words and characters in all {@link module:engine/model/text~Text text nodes} available in the model.\r\n * It also provides an HTML element that updates its state whenever the editor content is changed.\r\n *\r\n * The model's data is first converted to plain text using {@link module:word-count/utils~modelElementToPlainText}.\r\n * The number of words and characters in your text are determined based on the created plain text. Please keep in mind\r\n * that every block in the editor is separated with a newline character, which is included in the calculation.\r\n *\r\n * Here are some examples of how the word and character calculations are made:\r\n *\r\n * ```html\r\n * <paragraph>foo</paragraph>\r\n * <paragraph>bar</paragraph>\r\n * // Words: 2, Characters: 7\r\n *\r\n * <paragraph><$text bold=\"true\">foo</$text>bar</paragraph>\r\n * // Words: 1, Characters: 6\r\n *\r\n * <paragraph>*&^%)</paragraph>\r\n * // Words: 0, Characters: 5\r\n *\r\n * <paragraph>foo(bar)</paragraph>\r\n * //Words: 1, Characters: 8\r\n *\r\n * <paragraph>12345</paragraph>\r\n * // Words: 1, Characters: 5\r\n * ```\r\n */\r\nexport default class WordCount extends Plugin {\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    constructor(editor) {\r\n        super(editor);\r\n        this.set('characters', 0);\r\n        this.set('words', 0);\r\n        // Don't wait for the #update event to set the value of the properties but obtain it right away.\r\n        // This way, accessing the properties directly returns precise numbers, e.g. for validation, etc.\r\n        // If not accessed directly, the properties will be refreshed upon #update anyway.\r\n        Object.defineProperties(this, {\r\n            characters: {\r\n                get() {\r\n                    return (this.characters = this._getCharacters(this._getText()));\r\n                }\r\n            },\r\n            words: {\r\n                get() {\r\n                    return (this.words = this._getWords(this._getText()));\r\n                }\r\n            }\r\n        });\r\n        this.set('_wordsLabel', undefined);\r\n        this.set('_charactersLabel', undefined);\r\n        this._config = editor.config.get('wordCount') || {};\r\n        this._outputView = undefined;\r\n        this._wordsMatchRegExp = env.features.isRegExpUnicodePropertySupported ?\r\n            // Usage of regular expression literal cause error during build (ckeditor/ckeditor5-dev#534).\r\n            // Groups:\r\n            // {L} - Any kind of letter from any language.\r\n            // {N} - Any kind of numeric character in any script.\r\n            new RegExp('([\\\\p{L}\\\\p{N}]+\\\\S?)+', 'gu') :\r\n            /([a-zA-Z0-9À-ž]+\\S?)+/gu;\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    static get pluginName() {\r\n        return 'WordCount';\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    init() {\r\n        const editor = this.editor;\r\n        editor.model.document.on('change:data', throttle(this._refreshStats.bind(this), 250));\r\n        if (typeof this._config.onUpdate == 'function') {\r\n            this.on('update', (evt, data) => {\r\n                this._config.onUpdate(data);\r\n            });\r\n        }\r\n        if (isElement(this._config.container)) {\r\n            this._config.container.appendChild(this.wordCountContainer);\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    destroy() {\r\n        if (this._outputView) {\r\n            this._outputView.element.remove();\r\n            this._outputView.destroy();\r\n        }\r\n        super.destroy();\r\n    }\r\n    /**\r\n     * Creates a self-updating HTML element. Repeated executions return the same element.\r\n     * The returned element has the following HTML structure:\r\n     *\r\n     * ```html\r\n     * <div class=\"ck ck-word-count\">\r\n     * \t<div class=\"ck-word-count__words\">Words: 4</div>\r\n     * \t<div class=\"ck-word-count__characters\">Characters: 28</div>\r\n     * </div>\r\n     * ```\r\n     */\r\n    get wordCountContainer() {\r\n        const editor = this.editor;\r\n        const t = editor.t;\r\n        const displayWords = editor.config.get('wordCount.displayWords');\r\n        const displayCharacters = editor.config.get('wordCount.displayCharacters');\r\n        const bind = Template.bind(this, this);\r\n        const children = [];\r\n        if (!this._outputView) {\r\n            this._outputView = new View();\r\n            if (displayWords || displayWords === undefined) {\r\n                this.bind('_wordsLabel').to(this, 'words', words => {\r\n                    return t('Words: %0', words);\r\n                });\r\n                children.push({\r\n                    tag: 'div',\r\n                    children: [\r\n                        {\r\n                            text: [bind.to('_wordsLabel')]\r\n                        }\r\n                    ],\r\n                    attributes: {\r\n                        class: 'ck-word-count__words'\r\n                    }\r\n                });\r\n            }\r\n            if (displayCharacters || displayCharacters === undefined) {\r\n                this.bind('_charactersLabel').to(this, 'characters', words => {\r\n                    return t('Characters: %0', words);\r\n                });\r\n                children.push({\r\n                    tag: 'div',\r\n                    children: [\r\n                        {\r\n                            text: [bind.to('_charactersLabel')]\r\n                        }\r\n                    ],\r\n                    attributes: {\r\n                        class: 'ck-word-count__characters'\r\n                    }\r\n                });\r\n            }\r\n            this._outputView.setTemplate({\r\n                tag: 'div',\r\n                attributes: {\r\n                    class: [\r\n                        'ck',\r\n                        'ck-word-count'\r\n                    ]\r\n                },\r\n                children\r\n            });\r\n            this._outputView.render();\r\n        }\r\n        return this._outputView.element;\r\n    }\r\n    _getText() {\r\n        let txt = '';\r\n        for (const rootName of this.editor.model.document.getRootNames()) {\r\n            if (txt !== '') {\r\n                // Add a delimiter, so words from each root are treated independently.\r\n                txt += '\\n';\r\n            }\r\n            txt += modelElementToPlainText(this.editor.model.document.getRoot(rootName));\r\n        }\r\n        return txt;\r\n    }\r\n    /**\r\n     * Determines the number of characters in the current editor's model.\r\n     */\r\n    _getCharacters(txt) {\r\n        return txt.replace(/\\n/g, '').length;\r\n    }\r\n    /**\r\n     * Determines the number of words in the current editor's model.\r\n     */\r\n    _getWords(txt) {\r\n        const detectedWords = txt.match(this._wordsMatchRegExp) || [];\r\n        return detectedWords.length;\r\n    }\r\n    /**\r\n     * Determines the number of words and characters in the current editor's model and assigns it to {@link #characters} and {@link #words}.\r\n     * It also fires the {@link #event:update}.\r\n     *\r\n     * @fires update\r\n     */\r\n    _refreshStats() {\r\n        const txt = this._getText();\r\n        const words = this.words = this._getWords(txt);\r\n        const characters = this.characters = this._getCharacters(txt);\r\n        this.fire('update', {\r\n            words,\r\n            characters\r\n        });\r\n    }\r\n}\r\n","import { Plugin } from '@ckeditor/ckeditor5-core';\n\nimport PlaceholderEditing from './placeholderediting';\nimport PlaceholderUI from './placeholderui';\n\nexport default class Placeholder extends Plugin {\n  static get requires() {\n    return [PlaceholderEditing, PlaceholderUI];\n  }\n}\n","/*! @license DOMPurify 3.2.5 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.5/LICENSE */\n!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,(function(){\"use strict\";const{entries:e,setPrototypeOf:t,isFrozen:n,getPrototypeOf:o,getOwnPropertyDescriptor:r}=Object;let{freeze:i,seal:a,create:l}=Object,{apply:c,construct:s}=\"undefined\"!=typeof Reflect&&Reflect;i||(i=function(e){return e}),a||(a=function(e){return e}),c||(c=function(e,t,n){return e.apply(t,n)}),s||(s=function(e,t){return new e(...t)});const u=R(Array.prototype.forEach),m=R(Array.prototype.lastIndexOf),p=R(Array.prototype.pop),f=R(Array.prototype.push),d=R(Array.prototype.splice),h=R(String.prototype.toLowerCase),g=R(String.prototype.toString),T=R(String.prototype.match),y=R(String.prototype.replace),E=R(String.prototype.indexOf),A=R(String.prototype.trim),_=R(Object.prototype.hasOwnProperty),S=R(RegExp.prototype.test),b=(N=TypeError,function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return s(N,t)});var N;function R(e){return function(t){t instanceof RegExp&&(t.lastIndex=0);for(var n=arguments.length,o=new Array(n>1?n-1:0),r=1;r<n;r++)o[r-1]=arguments[r];return c(e,t,o)}}function w(e,o){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:h;t&&t(e,null);let i=o.length;for(;i--;){let t=o[i];if(\"string\"==typeof t){const e=r(t);e!==t&&(n(o)||(o[i]=e),t=e)}e[t]=!0}return e}function O(e){for(let t=0;t<e.length;t++){_(e,t)||(e[t]=null)}return e}function D(t){const n=l(null);for(const[o,r]of e(t)){_(t,o)&&(Array.isArray(r)?n[o]=O(r):r&&\"object\"==typeof r&&r.constructor===Object?n[o]=D(r):n[o]=r)}return n}function v(e,t){for(;null!==e;){const n=r(e,t);if(n){if(n.get)return R(n.get);if(\"function\"==typeof n.value)return R(n.value)}e=o(e)}return function(){return null}}const L=i([\"a\",\"abbr\",\"acronym\",\"address\",\"area\",\"article\",\"aside\",\"audio\",\"b\",\"bdi\",\"bdo\",\"big\",\"blink\",\"blockquote\",\"body\",\"br\",\"button\",\"canvas\",\"caption\",\"center\",\"cite\",\"code\",\"col\",\"colgroup\",\"content\",\"data\",\"datalist\",\"dd\",\"decorator\",\"del\",\"details\",\"dfn\",\"dialog\",\"dir\",\"div\",\"dl\",\"dt\",\"element\",\"em\",\"fieldset\",\"figcaption\",\"figure\",\"font\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"head\",\"header\",\"hgroup\",\"hr\",\"html\",\"i\",\"img\",\"input\",\"ins\",\"kbd\",\"label\",\"legend\",\"li\",\"main\",\"map\",\"mark\",\"marquee\",\"menu\",\"menuitem\",\"meter\",\"nav\",\"nobr\",\"ol\",\"optgroup\",\"option\",\"output\",\"p\",\"picture\",\"pre\",\"progress\",\"q\",\"rp\",\"rt\",\"ruby\",\"s\",\"samp\",\"section\",\"select\",\"shadow\",\"small\",\"source\",\"spacer\",\"span\",\"strike\",\"strong\",\"style\",\"sub\",\"summary\",\"sup\",\"table\",\"tbody\",\"td\",\"template\",\"textarea\",\"tfoot\",\"th\",\"thead\",\"time\",\"tr\",\"track\",\"tt\",\"u\",\"ul\",\"var\",\"video\",\"wbr\"]),C=i([\"svg\",\"a\",\"altglyph\",\"altglyphdef\",\"altglyphitem\",\"animatecolor\",\"animatemotion\",\"animatetransform\",\"circle\",\"clippath\",\"defs\",\"desc\",\"ellipse\",\"filter\",\"font\",\"g\",\"glyph\",\"glyphref\",\"hkern\",\"image\",\"line\",\"lineargradient\",\"marker\",\"mask\",\"metadata\",\"mpath\",\"path\",\"pattern\",\"polygon\",\"polyline\",\"radialgradient\",\"rect\",\"stop\",\"style\",\"switch\",\"symbol\",\"text\",\"textpath\",\"title\",\"tref\",\"tspan\",\"view\",\"vkern\"]),x=i([\"feBlend\",\"feColorMatrix\",\"feComponentTransfer\",\"feComposite\",\"feConvolveMatrix\",\"feDiffuseLighting\",\"feDisplacementMap\",\"feDistantLight\",\"feDropShadow\",\"feFlood\",\"feFuncA\",\"feFuncB\",\"feFuncG\",\"feFuncR\",\"feGaussianBlur\",\"feImage\",\"feMerge\",\"feMergeNode\",\"feMorphology\",\"feOffset\",\"fePointLight\",\"feSpecularLighting\",\"feSpotLight\",\"feTile\",\"feTurbulence\"]),I=i([\"animate\",\"color-profile\",\"cursor\",\"discard\",\"font-face\",\"font-face-format\",\"font-face-name\",\"font-face-src\",\"font-face-uri\",\"foreignobject\",\"hatch\",\"hatchpath\",\"mesh\",\"meshgradient\",\"meshpatch\",\"meshrow\",\"missing-glyph\",\"script\",\"set\",\"solidcolor\",\"unknown\",\"use\"]),M=i([\"math\",\"menclose\",\"merror\",\"mfenced\",\"mfrac\",\"mglyph\",\"mi\",\"mlabeledtr\",\"mmultiscripts\",\"mn\",\"mo\",\"mover\",\"mpadded\",\"mphantom\",\"mroot\",\"mrow\",\"ms\",\"mspace\",\"msqrt\",\"mstyle\",\"msub\",\"msup\",\"msubsup\",\"mtable\",\"mtd\",\"mtext\",\"mtr\",\"munder\",\"munderover\",\"mprescripts\"]),k=i([\"maction\",\"maligngroup\",\"malignmark\",\"mlongdiv\",\"mscarries\",\"mscarry\",\"msgroup\",\"mstack\",\"msline\",\"msrow\",\"semantics\",\"annotation\",\"annotation-xml\",\"mprescripts\",\"none\"]),U=i([\"#text\"]),z=i([\"accept\",\"action\",\"align\",\"alt\",\"autocapitalize\",\"autocomplete\",\"autopictureinpicture\",\"autoplay\",\"background\",\"bgcolor\",\"border\",\"capture\",\"cellpadding\",\"cellspacing\",\"checked\",\"cite\",\"class\",\"clear\",\"color\",\"cols\",\"colspan\",\"controls\",\"controlslist\",\"coords\",\"crossorigin\",\"datetime\",\"decoding\",\"default\",\"dir\",\"disabled\",\"disablepictureinpicture\",\"disableremoteplayback\",\"download\",\"draggable\",\"enctype\",\"enterkeyhint\",\"face\",\"for\",\"headers\",\"height\",\"hidden\",\"high\",\"href\",\"hreflang\",\"id\",\"inputmode\",\"integrity\",\"ismap\",\"kind\",\"label\",\"lang\",\"list\",\"loading\",\"loop\",\"low\",\"max\",\"maxlength\",\"media\",\"method\",\"min\",\"minlength\",\"multiple\",\"muted\",\"name\",\"nonce\",\"noshade\",\"novalidate\",\"nowrap\",\"open\",\"optimum\",\"pattern\",\"placeholder\",\"playsinline\",\"popover\",\"popovertarget\",\"popovertargetaction\",\"poster\",\"preload\",\"pubdate\",\"radiogroup\",\"readonly\",\"rel\",\"required\",\"rev\",\"reversed\",\"role\",\"rows\",\"rowspan\",\"spellcheck\",\"scope\",\"selected\",\"shape\",\"size\",\"sizes\",\"span\",\"srclang\",\"start\",\"src\",\"srcset\",\"step\",\"style\",\"summary\",\"tabindex\",\"title\",\"translate\",\"type\",\"usemap\",\"valign\",\"value\",\"width\",\"wrap\",\"xmlns\",\"slot\"]),P=i([\"accent-height\",\"accumulate\",\"additive\",\"alignment-baseline\",\"amplitude\",\"ascent\",\"attributename\",\"attributetype\",\"azimuth\",\"basefrequency\",\"baseline-shift\",\"begin\",\"bias\",\"by\",\"class\",\"clip\",\"clippathunits\",\"clip-path\",\"clip-rule\",\"color\",\"color-interpolation\",\"color-interpolation-filters\",\"color-profile\",\"color-rendering\",\"cx\",\"cy\",\"d\",\"dx\",\"dy\",\"diffuseconstant\",\"direction\",\"display\",\"divisor\",\"dur\",\"edgemode\",\"elevation\",\"end\",\"exponent\",\"fill\",\"fill-opacity\",\"fill-rule\",\"filter\",\"filterunits\",\"flood-color\",\"flood-opacity\",\"font-family\",\"font-size\",\"font-size-adjust\",\"font-stretch\",\"font-style\",\"font-variant\",\"font-weight\",\"fx\",\"fy\",\"g1\",\"g2\",\"glyph-name\",\"glyphref\",\"gradientunits\",\"gradienttransform\",\"height\",\"href\",\"id\",\"image-rendering\",\"in\",\"in2\",\"intercept\",\"k\",\"k1\",\"k2\",\"k3\",\"k4\",\"kerning\",\"keypoints\",\"keysplines\",\"keytimes\",\"lang\",\"lengthadjust\",\"letter-spacing\",\"kernelmatrix\",\"kernelunitlength\",\"lighting-color\",\"local\",\"marker-end\",\"marker-mid\",\"marker-start\",\"markerheight\",\"markerunits\",\"markerwidth\",\"maskcontentunits\",\"maskunits\",\"max\",\"mask\",\"media\",\"method\",\"mode\",\"min\",\"name\",\"numoctaves\",\"offset\",\"operator\",\"opacity\",\"order\",\"orient\",\"orientation\",\"origin\",\"overflow\",\"paint-order\",\"path\",\"pathlength\",\"patterncontentunits\",\"patterntransform\",\"patternunits\",\"points\",\"preservealpha\",\"preserveaspectratio\",\"primitiveunits\",\"r\",\"rx\",\"ry\",\"radius\",\"refx\",\"refy\",\"repeatcount\",\"repeatdur\",\"restart\",\"result\",\"rotate\",\"scale\",\"seed\",\"shape-rendering\",\"slope\",\"specularconstant\",\"specularexponent\",\"spreadmethod\",\"startoffset\",\"stddeviation\",\"stitchtiles\",\"stop-color\",\"stop-opacity\",\"stroke-dasharray\",\"stroke-dashoffset\",\"stroke-linecap\",\"stroke-linejoin\",\"stroke-miterlimit\",\"stroke-opacity\",\"stroke\",\"stroke-width\",\"style\",\"surfacescale\",\"systemlanguage\",\"tabindex\",\"tablevalues\",\"targetx\",\"targety\",\"transform\",\"transform-origin\",\"text-anchor\",\"text-decoration\",\"text-rendering\",\"textlength\",\"type\",\"u1\",\"u2\",\"unicode\",\"values\",\"viewbox\",\"visibility\",\"version\",\"vert-adv-y\",\"vert-origin-x\",\"vert-origin-y\",\"width\",\"word-spacing\",\"wrap\",\"writing-mode\",\"xchannelselector\",\"ychannelselector\",\"x\",\"x1\",\"x2\",\"xmlns\",\"y\",\"y1\",\"y2\",\"z\",\"zoomandpan\"]),H=i([\"accent\",\"accentunder\",\"align\",\"bevelled\",\"close\",\"columnsalign\",\"columnlines\",\"columnspan\",\"denomalign\",\"depth\",\"dir\",\"display\",\"displaystyle\",\"encoding\",\"fence\",\"frame\",\"height\",\"href\",\"id\",\"largeop\",\"length\",\"linethickness\",\"lspace\",\"lquote\",\"mathbackground\",\"mathcolor\",\"mathsize\",\"mathvariant\",\"maxsize\",\"minsize\",\"movablelimits\",\"notation\",\"numalign\",\"open\",\"rowalign\",\"rowlines\",\"rowspacing\",\"rowspan\",\"rspace\",\"rquote\",\"scriptlevel\",\"scriptminsize\",\"scriptsizemultiplier\",\"selection\",\"separator\",\"separators\",\"stretchy\",\"subscriptshift\",\"supscriptshift\",\"symmetric\",\"voffset\",\"width\",\"xmlns\"]),F=i([\"xlink:href\",\"xml:id\",\"xlink:title\",\"xml:space\",\"xmlns:xlink\"]),B=a(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm),W=a(/<%[\\w\\W]*|[\\w\\W]*%>/gm),G=a(/\\$\\{[\\w\\W]*/gm),Y=a(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/),j=a(/^aria-[\\-\\w]+$/),X=a(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i),q=a(/^(?:\\w+script|data):/i),$=a(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g),K=a(/^html$/i),V=a(/^[a-z][.\\w]*(-[.\\w]+)+$/i);var Z=Object.freeze({__proto__:null,ARIA_ATTR:j,ATTR_WHITESPACE:$,CUSTOM_ELEMENT:V,DATA_ATTR:Y,DOCTYPE_NAME:K,ERB_EXPR:W,IS_ALLOWED_URI:X,IS_SCRIPT_OR_DATA:q,MUSTACHE_EXPR:B,TMPLIT_EXPR:G});const J=1,Q=3,ee=7,te=8,ne=9,oe=function(){return\"undefined\"==typeof window?null:window};var re=function t(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:oe();const o=e=>t(e);if(o.version=\"3.2.5\",o.removed=[],!n||!n.document||n.document.nodeType!==ne||!n.Element)return o.isSupported=!1,o;let{document:r}=n;const a=r,c=a.currentScript,{DocumentFragment:s,HTMLTemplateElement:N,Node:R,Element:O,NodeFilter:B,NamedNodeMap:W=n.NamedNodeMap||n.MozNamedAttrMap,HTMLFormElement:G,DOMParser:Y,trustedTypes:j}=n,q=O.prototype,$=v(q,\"cloneNode\"),V=v(q,\"remove\"),re=v(q,\"nextSibling\"),ie=v(q,\"childNodes\"),ae=v(q,\"parentNode\");if(\"function\"==typeof N){const e=r.createElement(\"template\");e.content&&e.content.ownerDocument&&(r=e.content.ownerDocument)}let le,ce=\"\";const{implementation:se,createNodeIterator:ue,createDocumentFragment:me,getElementsByTagName:pe}=r,{importNode:fe}=a;let de={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};o.isSupported=\"function\"==typeof e&&\"function\"==typeof ae&&se&&void 0!==se.createHTMLDocument;const{MUSTACHE_EXPR:he,ERB_EXPR:ge,TMPLIT_EXPR:Te,DATA_ATTR:ye,ARIA_ATTR:Ee,IS_SCRIPT_OR_DATA:Ae,ATTR_WHITESPACE:_e,CUSTOM_ELEMENT:Se}=Z;let{IS_ALLOWED_URI:be}=Z,Ne=null;const Re=w({},[...L,...C,...x,...M,...U]);let we=null;const Oe=w({},[...z,...P,...H,...F]);let De=Object.seal(l(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),ve=null,Le=null,Ce=!0,xe=!0,Ie=!1,Me=!0,ke=!1,Ue=!0,ze=!1,Pe=!1,He=!1,Fe=!1,Be=!1,We=!1,Ge=!0,Ye=!1,je=!0,Xe=!1,qe={},$e=null;const Ke=w({},[\"annotation-xml\",\"audio\",\"colgroup\",\"desc\",\"foreignobject\",\"head\",\"iframe\",\"math\",\"mi\",\"mn\",\"mo\",\"ms\",\"mtext\",\"noembed\",\"noframes\",\"noscript\",\"plaintext\",\"script\",\"style\",\"svg\",\"template\",\"thead\",\"title\",\"video\",\"xmp\"]);let Ve=null;const Ze=w({},[\"audio\",\"video\",\"img\",\"source\",\"image\",\"track\"]);let Je=null;const Qe=w({},[\"alt\",\"class\",\"for\",\"id\",\"label\",\"name\",\"pattern\",\"placeholder\",\"role\",\"summary\",\"title\",\"value\",\"style\",\"xmlns\"]),et=\"http://www.w3.org/1998/Math/MathML\",tt=\"http://www.w3.org/2000/svg\",nt=\"http://www.w3.org/1999/xhtml\";let ot=nt,rt=!1,it=null;const at=w({},[et,tt,nt],g);let lt=w({},[\"mi\",\"mo\",\"mn\",\"ms\",\"mtext\"]),ct=w({},[\"annotation-xml\"]);const st=w({},[\"title\",\"style\",\"font\",\"a\",\"script\"]);let ut=null;const mt=[\"application/xhtml+xml\",\"text/html\"];let pt=null,ft=null;const dt=r.createElement(\"form\"),ht=function(e){return e instanceof RegExp||e instanceof Function},gt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!ft||ft!==e){if(e&&\"object\"==typeof e||(e={}),e=D(e),ut=-1===mt.indexOf(e.PARSER_MEDIA_TYPE)?\"text/html\":e.PARSER_MEDIA_TYPE,pt=\"application/xhtml+xml\"===ut?g:h,Ne=_(e,\"ALLOWED_TAGS\")?w({},e.ALLOWED_TAGS,pt):Re,we=_(e,\"ALLOWED_ATTR\")?w({},e.ALLOWED_ATTR,pt):Oe,it=_(e,\"ALLOWED_NAMESPACES\")?w({},e.ALLOWED_NAMESPACES,g):at,Je=_(e,\"ADD_URI_SAFE_ATTR\")?w(D(Qe),e.ADD_URI_SAFE_ATTR,pt):Qe,Ve=_(e,\"ADD_DATA_URI_TAGS\")?w(D(Ze),e.ADD_DATA_URI_TAGS,pt):Ze,$e=_(e,\"FORBID_CONTENTS\")?w({},e.FORBID_CONTENTS,pt):Ke,ve=_(e,\"FORBID_TAGS\")?w({},e.FORBID_TAGS,pt):{},Le=_(e,\"FORBID_ATTR\")?w({},e.FORBID_ATTR,pt):{},qe=!!_(e,\"USE_PROFILES\")&&e.USE_PROFILES,Ce=!1!==e.ALLOW_ARIA_ATTR,xe=!1!==e.ALLOW_DATA_ATTR,Ie=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Me=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,ke=e.SAFE_FOR_TEMPLATES||!1,Ue=!1!==e.SAFE_FOR_XML,ze=e.WHOLE_DOCUMENT||!1,Fe=e.RETURN_DOM||!1,Be=e.RETURN_DOM_FRAGMENT||!1,We=e.RETURN_TRUSTED_TYPE||!1,He=e.FORCE_BODY||!1,Ge=!1!==e.SANITIZE_DOM,Ye=e.SANITIZE_NAMED_PROPS||!1,je=!1!==e.KEEP_CONTENT,Xe=e.IN_PLACE||!1,be=e.ALLOWED_URI_REGEXP||X,ot=e.NAMESPACE||nt,lt=e.MATHML_TEXT_INTEGRATION_POINTS||lt,ct=e.HTML_INTEGRATION_POINTS||ct,De=e.CUSTOM_ELEMENT_HANDLING||{},e.CUSTOM_ELEMENT_HANDLING&&ht(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(De.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&ht(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(De.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&\"boolean\"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(De.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),ke&&(xe=!1),Be&&(Fe=!0),qe&&(Ne=w({},U),we=[],!0===qe.html&&(w(Ne,L),w(we,z)),!0===qe.svg&&(w(Ne,C),w(we,P),w(we,F)),!0===qe.svgFilters&&(w(Ne,x),w(we,P),w(we,F)),!0===qe.mathMl&&(w(Ne,M),w(we,H),w(we,F))),e.ADD_TAGS&&(Ne===Re&&(Ne=D(Ne)),w(Ne,e.ADD_TAGS,pt)),e.ADD_ATTR&&(we===Oe&&(we=D(we)),w(we,e.ADD_ATTR,pt)),e.ADD_URI_SAFE_ATTR&&w(Je,e.ADD_URI_SAFE_ATTR,pt),e.FORBID_CONTENTS&&($e===Ke&&($e=D($e)),w($e,e.FORBID_CONTENTS,pt)),je&&(Ne[\"#text\"]=!0),ze&&w(Ne,[\"html\",\"head\",\"body\"]),Ne.table&&(w(Ne,[\"tbody\"]),delete ve.tbody),e.TRUSTED_TYPES_POLICY){if(\"function\"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw b('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');if(\"function\"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw b('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');le=e.TRUSTED_TYPES_POLICY,ce=le.createHTML(\"\")}else void 0===le&&(le=function(e,t){if(\"object\"!=typeof e||\"function\"!=typeof e.createPolicy)return null;let n=null;const o=\"data-tt-policy-suffix\";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r=\"dompurify\"+(n?\"#\"+n:\"\");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn(\"TrustedTypes policy \"+r+\" could not be created.\"),null}}(j,c)),null!==le&&\"string\"==typeof ce&&(ce=le.createHTML(\"\"));i&&i(e),ft=e}},Tt=w({},[...C,...x,...I]),yt=w({},[...M,...k]),Et=function(e){f(o.removed,{element:e});try{ae(e).removeChild(e)}catch(t){V(e)}},At=function(e,t){try{f(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){f(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),\"is\"===e)if(Fe||Be)try{Et(t)}catch(e){}else try{t.setAttribute(e,\"\")}catch(e){}},_t=function(e){let t=null,n=null;if(He)e=\"<remove></remove>\"+e;else{const t=T(e,/^[\\r\\n\\t ]+/);n=t&&t[0]}\"application/xhtml+xml\"===ut&&ot===nt&&(e='<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>'+e+\"</body></html>\");const o=le?le.createHTML(e):e;if(ot===nt)try{t=(new Y).parseFromString(o,ut)}catch(e){}if(!t||!t.documentElement){t=se.createDocument(ot,\"template\",null);try{t.documentElement.innerHTML=rt?ce:o}catch(e){}}const i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),ot===nt?pe.call(t,ze?\"html\":\"body\")[0]:ze?t.documentElement:i},St=function(e){return ue.call(e.ownerDocument||e,e,B.SHOW_ELEMENT|B.SHOW_COMMENT|B.SHOW_TEXT|B.SHOW_PROCESSING_INSTRUCTION|B.SHOW_CDATA_SECTION,null)},bt=function(e){return e instanceof G&&(\"string\"!=typeof e.nodeName||\"string\"!=typeof e.textContent||\"function\"!=typeof e.removeChild||!(e.attributes instanceof W)||\"function\"!=typeof e.removeAttribute||\"function\"!=typeof e.setAttribute||\"string\"!=typeof e.namespaceURI||\"function\"!=typeof e.insertBefore||\"function\"!=typeof e.hasChildNodes)},Nt=function(e){return\"function\"==typeof R&&e instanceof R};function Rt(e,t,n){u(e,(e=>{e.call(o,t,n,ft)}))}const wt=function(e){let t=null;if(Rt(de.beforeSanitizeElements,e,null),bt(e))return Et(e),!0;const n=pt(e.nodeName);if(Rt(de.uponSanitizeElement,e,{tagName:n,allowedTags:Ne}),e.hasChildNodes()&&!Nt(e.firstElementChild)&&S(/<[/\\w!]/g,e.innerHTML)&&S(/<[/\\w!]/g,e.textContent))return Et(e),!0;if(e.nodeType===ee)return Et(e),!0;if(Ue&&e.nodeType===te&&S(/<[/\\w]/g,e.data))return Et(e),!0;if(!Ne[n]||ve[n]){if(!ve[n]&&Dt(n)){if(De.tagNameCheck instanceof RegExp&&S(De.tagNameCheck,n))return!1;if(De.tagNameCheck instanceof Function&&De.tagNameCheck(n))return!1}if(je&&!$e[n]){const t=ae(e)||e.parentNode,n=ie(e)||e.childNodes;if(n&&t){for(let o=n.length-1;o>=0;--o){const r=$(n[o],!0);r.__removalCount=(e.__removalCount||0)+1,t.insertBefore(r,re(e))}}}return Et(e),!0}return e instanceof O&&!function(e){let t=ae(e);t&&t.tagName||(t={namespaceURI:ot,tagName:\"template\"});const n=h(e.tagName),o=h(t.tagName);return!!it[e.namespaceURI]&&(e.namespaceURI===tt?t.namespaceURI===nt?\"svg\"===n:t.namespaceURI===et?\"svg\"===n&&(\"annotation-xml\"===o||lt[o]):Boolean(Tt[n]):e.namespaceURI===et?t.namespaceURI===nt?\"math\"===n:t.namespaceURI===tt?\"math\"===n&&ct[o]:Boolean(yt[n]):e.namespaceURI===nt?!(t.namespaceURI===tt&&!ct[o])&&!(t.namespaceURI===et&&!lt[o])&&!yt[n]&&(st[n]||!Tt[n]):!(\"application/xhtml+xml\"!==ut||!it[e.namespaceURI]))}(e)?(Et(e),!0):\"noscript\"!==n&&\"noembed\"!==n&&\"noframes\"!==n||!S(/<\\/no(script|embed|frames)/i,e.innerHTML)?(ke&&e.nodeType===Q&&(t=e.textContent,u([he,ge,Te],(e=>{t=y(t,e,\" \")})),e.textContent!==t&&(f(o.removed,{element:e.cloneNode()}),e.textContent=t)),Rt(de.afterSanitizeElements,e,null),!1):(Et(e),!0)},Ot=function(e,t,n){if(Ge&&(\"id\"===t||\"name\"===t)&&(n in r||n in dt))return!1;if(xe&&!Le[t]&&S(ye,t));else if(Ce&&S(Ee,t));else if(!we[t]||Le[t]){if(!(Dt(e)&&(De.tagNameCheck instanceof RegExp&&S(De.tagNameCheck,e)||De.tagNameCheck instanceof Function&&De.tagNameCheck(e))&&(De.attributeNameCheck instanceof RegExp&&S(De.attributeNameCheck,t)||De.attributeNameCheck instanceof Function&&De.attributeNameCheck(t))||\"is\"===t&&De.allowCustomizedBuiltInElements&&(De.tagNameCheck instanceof RegExp&&S(De.tagNameCheck,n)||De.tagNameCheck instanceof Function&&De.tagNameCheck(n))))return!1}else if(Je[t]);else if(S(be,y(n,_e,\"\")));else if(\"src\"!==t&&\"xlink:href\"!==t&&\"href\"!==t||\"script\"===e||0!==E(n,\"data:\")||!Ve[e]){if(Ie&&!S(Ae,y(n,_e,\"\")));else if(n)return!1}else;return!0},Dt=function(e){return\"annotation-xml\"!==e&&T(e,Se)},vt=function(e){Rt(de.beforeSanitizeAttributes,e,null);const{attributes:t}=e;if(!t||bt(e))return;const n={attrName:\"\",attrValue:\"\",keepAttr:!0,allowedAttributes:we,forceKeepAttr:void 0};let r=t.length;for(;r--;){const i=t[r],{name:a,namespaceURI:l,value:c}=i,s=pt(a);let m=\"value\"===a?c:A(c);if(n.attrName=s,n.attrValue=m,n.keepAttr=!0,n.forceKeepAttr=void 0,Rt(de.uponSanitizeAttribute,e,n),m=n.attrValue,!Ye||\"id\"!==s&&\"name\"!==s||(At(a,e),m=\"user-content-\"+m),Ue&&S(/((--!?|])>)|<\\/(style|title)/i,m)){At(a,e);continue}if(n.forceKeepAttr)continue;if(At(a,e),!n.keepAttr)continue;if(!Me&&S(/\\/>/i,m)){At(a,e);continue}ke&&u([he,ge,Te],(e=>{m=y(m,e,\" \")}));const f=pt(e.nodeName);if(Ot(f,s,m)){if(le&&\"object\"==typeof j&&\"function\"==typeof j.getAttributeType)if(l);else switch(j.getAttributeType(f,s)){case\"TrustedHTML\":m=le.createHTML(m);break;case\"TrustedScriptURL\":m=le.createScriptURL(m)}try{l?e.setAttributeNS(l,a,m):e.setAttribute(a,m),bt(e)?Et(e):p(o.removed)}catch(e){}}}Rt(de.afterSanitizeAttributes,e,null)},Lt=function e(t){let n=null;const o=St(t);for(Rt(de.beforeSanitizeShadowDOM,t,null);n=o.nextNode();)Rt(de.uponSanitizeShadowNode,n,null),wt(n),vt(n),n.content instanceof s&&e(n.content);Rt(de.afterSanitizeShadowDOM,t,null)};return o.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,r=null,i=null,l=null;if(rt=!e,rt&&(e=\"\\x3c!--\\x3e\"),\"string\"!=typeof e&&!Nt(e)){if(\"function\"!=typeof e.toString)throw b(\"toString is not a function\");if(\"string\"!=typeof(e=e.toString()))throw b(\"dirty is not a string, aborting\")}if(!o.isSupported)return e;if(Pe||gt(t),o.removed=[],\"string\"==typeof e&&(Xe=!1),Xe){if(e.nodeName){const t=pt(e.nodeName);if(!Ne[t]||ve[t])throw b(\"root node is forbidden and cannot be sanitized in-place\")}}else if(e instanceof R)n=_t(\"\\x3c!----\\x3e\"),r=n.ownerDocument.importNode(e,!0),r.nodeType===J&&\"BODY\"===r.nodeName||\"HTML\"===r.nodeName?n=r:n.appendChild(r);else{if(!Fe&&!ke&&!ze&&-1===e.indexOf(\"<\"))return le&&We?le.createHTML(e):e;if(n=_t(e),!n)return Fe?null:We?ce:\"\"}n&&He&&Et(n.firstChild);const c=St(Xe?e:n);for(;i=c.nextNode();)wt(i),vt(i),i.content instanceof s&&Lt(i.content);if(Xe)return e;if(Fe){if(Be)for(l=me.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(we.shadowroot||we.shadowrootmode)&&(l=fe.call(a,l,!0)),l}let m=ze?n.outerHTML:n.innerHTML;return ze&&Ne[\"!doctype\"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&S(K,n.ownerDocument.doctype.name)&&(m=\"<!DOCTYPE \"+n.ownerDocument.doctype.name+\">\\n\"+m),ke&&u([he,ge,Te],(e=>{m=y(m,e,\" \")})),le&&We?le.createHTML(m):m},o.setConfig=function(){gt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),Pe=!0},o.clearConfig=function(){ft=null,Pe=!1},o.isValidAttribute=function(e,t,n){ft||gt({});const o=pt(e),r=pt(t);return Ot(o,r,n)},o.addHook=function(e,t){\"function\"==typeof t&&f(de[e],t)},o.removeHook=function(e,t){if(void 0!==t){const n=m(de[e],t);return-1===n?void 0:d(de[e],n,1)[0]}return p(de[e])},o.removeHooks=function(e){de[e]=[]},o.removeAllHooks=function(){de={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},o}();return re}));\n","/* flatpickr v4.6.13,, @license MIT */\n!function(e,n){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=n():\"function\"==typeof define&&define.amd?define(n):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).flatpickr=n()}(this,(function(){\"use strict\";var e=function(){return(e=Object.assign||function(e){for(var n,t=1,a=arguments.length;t<a;t++)for(var i in n=arguments[t])Object.prototype.hasOwnProperty.call(n,i)&&(e[i]=n[i]);return e}).apply(this,arguments)};function n(){for(var e=0,n=0,t=arguments.length;n<t;n++)e+=arguments[n].length;var a=Array(e),i=0;for(n=0;n<t;n++)for(var o=arguments[n],r=0,l=o.length;r<l;r++,i++)a[i]=o[r];return a}var t=[\"onChange\",\"onClose\",\"onDayCreate\",\"onDestroy\",\"onKeyDown\",\"onMonthChange\",\"onOpen\",\"onParseConfig\",\"onReady\",\"onValueUpdate\",\"onYearChange\",\"onPreCalendarPosition\"],a={_disable:[],allowInput:!1,allowInvalidPreload:!1,altFormat:\"F j, Y\",altInput:!1,altInputClass:\"form-control input\",animate:\"object\"==typeof window&&-1===window.navigator.userAgent.indexOf(\"MSIE\"),ariaDateFormat:\"F j, Y\",autoFillDefaultTime:!0,clickOpens:!0,closeOnSelect:!0,conjunction:\", \",dateFormat:\"Y-m-d\",defaultHour:12,defaultMinute:0,defaultSeconds:0,disable:[],disableMobile:!1,enableSeconds:!1,enableTime:!1,errorHandler:function(e){return\"undefined\"!=typeof console&&console.warn(e)},getWeek:function(e){var n=new Date(e.getTime());n.setHours(0,0,0,0),n.setDate(n.getDate()+3-(n.getDay()+6)%7);var t=new Date(n.getFullYear(),0,4);return 1+Math.round(((n.getTime()-t.getTime())/864e5-3+(t.getDay()+6)%7)/7)},hourIncrement:1,ignoredFocusElements:[],inline:!1,locale:\"default\",minuteIncrement:5,mode:\"single\",monthSelectorType:\"dropdown\",nextArrow:\"<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M13.207 8.472l-7.854 7.854-0.707-0.707 7.146-7.146-7.146-7.148 0.707-0.707 7.854 7.854z' /></svg>\",noCalendar:!1,now:new Date,onChange:[],onClose:[],onDayCreate:[],onDestroy:[],onKeyDown:[],onMonthChange:[],onOpen:[],onParseConfig:[],onReady:[],onValueUpdate:[],onYearChange:[],onPreCalendarPosition:[],plugins:[],position:\"auto\",positionElement:void 0,prevArrow:\"<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M5.207 8.471l7.146 7.147-0.707 0.707-7.853-7.854 7.854-7.853 0.707 0.707-7.147 7.146z' /></svg>\",shorthandCurrentMonth:!1,showMonths:1,static:!1,time_24hr:!1,weekNumbers:!1,wrap:!1},i={weekdays:{shorthand:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],longhand:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]},months:{shorthand:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],longhand:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]},daysInMonth:[31,28,31,30,31,30,31,31,30,31,30,31],firstDayOfWeek:0,ordinal:function(e){var n=e%100;if(n>3&&n<21)return\"th\";switch(n%10){case 1:return\"st\";case 2:return\"nd\";case 3:return\"rd\";default:return\"th\"}},rangeSeparator:\" to \",weekAbbreviation:\"Wk\",scrollTitle:\"Scroll to increment\",toggleTitle:\"Click to toggle\",amPM:[\"AM\",\"PM\"],yearAriaLabel:\"Year\",monthAriaLabel:\"Month\",hourAriaLabel:\"Hour\",minuteAriaLabel:\"Minute\",time_24hr:!1},o=function(e,n){return void 0===n&&(n=2),(\"000\"+e).slice(-1*n)},r=function(e){return!0===e?1:0};function l(e,n){var t;return function(){var a=this,i=arguments;clearTimeout(t),t=setTimeout((function(){return e.apply(a,i)}),n)}}var c=function(e){return e instanceof Array?e:[e]};function s(e,n,t){if(!0===t)return e.classList.add(n);e.classList.remove(n)}function d(e,n,t){var a=window.document.createElement(e);return n=n||\"\",t=t||\"\",a.className=n,void 0!==t&&(a.textContent=t),a}function u(e){for(;e.firstChild;)e.removeChild(e.firstChild)}function f(e,n){return n(e)?e:e.parentNode?f(e.parentNode,n):void 0}function m(e,n){var t=d(\"div\",\"numInputWrapper\"),a=d(\"input\",\"numInput \"+e),i=d(\"span\",\"arrowUp\"),o=d(\"span\",\"arrowDown\");if(-1===navigator.userAgent.indexOf(\"MSIE 9.0\")?a.type=\"number\":(a.type=\"text\",a.pattern=\"\\\\d*\"),void 0!==n)for(var r in n)a.setAttribute(r,n[r]);return t.appendChild(a),t.appendChild(i),t.appendChild(o),t}function g(e){try{return\"function\"==typeof e.composedPath?e.composedPath()[0]:e.target}catch(n){return e.target}}var p=function(){},h=function(e,n,t){return t.months[n?\"shorthand\":\"longhand\"][e]},v={D:p,F:function(e,n,t){e.setMonth(t.months.longhand.indexOf(n))},G:function(e,n){e.setHours((e.getHours()>=12?12:0)+parseFloat(n))},H:function(e,n){e.setHours(parseFloat(n))},J:function(e,n){e.setDate(parseFloat(n))},K:function(e,n,t){e.setHours(e.getHours()%12+12*r(new RegExp(t.amPM[1],\"i\").test(n)))},M:function(e,n,t){e.setMonth(t.months.shorthand.indexOf(n))},S:function(e,n){e.setSeconds(parseFloat(n))},U:function(e,n){return new Date(1e3*parseFloat(n))},W:function(e,n,t){var a=parseInt(n),i=new Date(e.getFullYear(),0,2+7*(a-1),0,0,0,0);return i.setDate(i.getDate()-i.getDay()+t.firstDayOfWeek),i},Y:function(e,n){e.setFullYear(parseFloat(n))},Z:function(e,n){return new Date(n)},d:function(e,n){e.setDate(parseFloat(n))},h:function(e,n){e.setHours((e.getHours()>=12?12:0)+parseFloat(n))},i:function(e,n){e.setMinutes(parseFloat(n))},j:function(e,n){e.setDate(parseFloat(n))},l:p,m:function(e,n){e.setMonth(parseFloat(n)-1)},n:function(e,n){e.setMonth(parseFloat(n)-1)},s:function(e,n){e.setSeconds(parseFloat(n))},u:function(e,n){return new Date(parseFloat(n))},w:p,y:function(e,n){e.setFullYear(2e3+parseFloat(n))}},D={D:\"\",F:\"\",G:\"(\\\\d\\\\d|\\\\d)\",H:\"(\\\\d\\\\d|\\\\d)\",J:\"(\\\\d\\\\d|\\\\d)\\\\w+\",K:\"\",M:\"\",S:\"(\\\\d\\\\d|\\\\d)\",U:\"(.+)\",W:\"(\\\\d\\\\d|\\\\d)\",Y:\"(\\\\d{4})\",Z:\"(.+)\",d:\"(\\\\d\\\\d|\\\\d)\",h:\"(\\\\d\\\\d|\\\\d)\",i:\"(\\\\d\\\\d|\\\\d)\",j:\"(\\\\d\\\\d|\\\\d)\",l:\"\",m:\"(\\\\d\\\\d|\\\\d)\",n:\"(\\\\d\\\\d|\\\\d)\",s:\"(\\\\d\\\\d|\\\\d)\",u:\"(.+)\",w:\"(\\\\d\\\\d|\\\\d)\",y:\"(\\\\d{2})\"},w={Z:function(e){return e.toISOString()},D:function(e,n,t){return n.weekdays.shorthand[w.w(e,n,t)]},F:function(e,n,t){return h(w.n(e,n,t)-1,!1,n)},G:function(e,n,t){return o(w.h(e,n,t))},H:function(e){return o(e.getHours())},J:function(e,n){return void 0!==n.ordinal?e.getDate()+n.ordinal(e.getDate()):e.getDate()},K:function(e,n){return n.amPM[r(e.getHours()>11)]},M:function(e,n){return h(e.getMonth(),!0,n)},S:function(e){return o(e.getSeconds())},U:function(e){return e.getTime()/1e3},W:function(e,n,t){return t.getWeek(e)},Y:function(e){return o(e.getFullYear(),4)},d:function(e){return o(e.getDate())},h:function(e){return e.getHours()%12?e.getHours()%12:12},i:function(e){return o(e.getMinutes())},j:function(e){return e.getDate()},l:function(e,n){return n.weekdays.longhand[e.getDay()]},m:function(e){return o(e.getMonth()+1)},n:function(e){return e.getMonth()+1},s:function(e){return e.getSeconds()},u:function(e){return e.getTime()},w:function(e){return e.getDay()},y:function(e){return String(e.getFullYear()).substring(2)}},b=function(e){var n=e.config,t=void 0===n?a:n,o=e.l10n,r=void 0===o?i:o,l=e.isMobile,c=void 0!==l&&l;return function(e,n,a){var i=a||r;return void 0===t.formatDate||c?n.split(\"\").map((function(n,a,o){return w[n]&&\"\\\\\"!==o[a-1]?w[n](e,i,t):\"\\\\\"!==n?n:\"\"})).join(\"\"):t.formatDate(e,n,i)}},C=function(e){var n=e.config,t=void 0===n?a:n,o=e.l10n,r=void 0===o?i:o;return function(e,n,i,o){if(0===e||e){var l,c=o||r,s=e;if(e instanceof Date)l=new Date(e.getTime());else if(\"string\"!=typeof e&&void 0!==e.toFixed)l=new Date(e);else if(\"string\"==typeof e){var d=n||(t||a).dateFormat,u=String(e).trim();if(\"today\"===u)l=new Date,i=!0;else if(t&&t.parseDate)l=t.parseDate(e,d);else if(/Z$/.test(u)||/GMT$/.test(u))l=new Date(e);else{for(var f=void 0,m=[],g=0,p=0,h=\"\";g<d.length;g++){var w=d[g],b=\"\\\\\"===w,C=\"\\\\\"===d[g-1]||b;if(D[w]&&!C){h+=D[w];var M=new RegExp(h).exec(e);M&&(f=!0)&&m[\"Y\"!==w?\"push\":\"unshift\"]({fn:v[w],val:M[++p]})}else b||(h+=\".\")}l=t&&t.noCalendar?new Date((new Date).setHours(0,0,0,0)):new Date((new Date).getFullYear(),0,1,0,0,0,0),m.forEach((function(e){var n=e.fn,t=e.val;return l=n(l,t,c)||l})),l=f?l:void 0}}if(l instanceof Date&&!isNaN(l.getTime()))return!0===i&&l.setHours(0,0,0,0),l;t.errorHandler(new Error(\"Invalid date provided: \"+s))}}};function M(e,n,t){return void 0===t&&(t=!0),!1!==t?new Date(e.getTime()).setHours(0,0,0,0)-new Date(n.getTime()).setHours(0,0,0,0):e.getTime()-n.getTime()}var y=function(e,n,t){return 3600*e+60*n+t},x=864e5;function E(e){var n=e.defaultHour,t=e.defaultMinute,a=e.defaultSeconds;if(void 0!==e.minDate){var i=e.minDate.getHours(),o=e.minDate.getMinutes(),r=e.minDate.getSeconds();n<i&&(n=i),n===i&&t<o&&(t=o),n===i&&t===o&&a<r&&(a=e.minDate.getSeconds())}if(void 0!==e.maxDate){var l=e.maxDate.getHours(),c=e.maxDate.getMinutes();(n=Math.min(n,l))===l&&(t=Math.min(c,t)),n===l&&t===c&&(a=e.maxDate.getSeconds())}return{hours:n,minutes:t,seconds:a}}\"function\"!=typeof Object.assign&&(Object.assign=function(e){for(var n=[],t=1;t<arguments.length;t++)n[t-1]=arguments[t];if(!e)throw TypeError(\"Cannot convert undefined or null to object\");for(var a=function(n){n&&Object.keys(n).forEach((function(t){return e[t]=n[t]}))},i=0,o=n;i<o.length;i++){var r=o[i];a(r)}return e});function k(p,v){var w={config:e(e({},a),I.defaultConfig),l10n:i};function k(){var e;return(null===(e=w.calendarContainer)||void 0===e?void 0:e.getRootNode()).activeElement||document.activeElement}function T(e){return e.bind(w)}function S(){var e=w.config;!1===e.weekNumbers&&1===e.showMonths||!0!==e.noCalendar&&window.requestAnimationFrame((function(){if(void 0!==w.calendarContainer&&(w.calendarContainer.style.visibility=\"hidden\",w.calendarContainer.style.display=\"block\"),void 0!==w.daysContainer){var n=(w.days.offsetWidth+1)*e.showMonths;w.daysContainer.style.width=n+\"px\",w.calendarContainer.style.width=n+(void 0!==w.weekWrapper?w.weekWrapper.offsetWidth:0)+\"px\",w.calendarContainer.style.removeProperty(\"visibility\"),w.calendarContainer.style.removeProperty(\"display\")}}))}function _(e){if(0===w.selectedDates.length){var n=void 0===w.config.minDate||M(new Date,w.config.minDate)>=0?new Date:new Date(w.config.minDate.getTime()),t=E(w.config);n.setHours(t.hours,t.minutes,t.seconds,n.getMilliseconds()),w.selectedDates=[n],w.latestSelectedDateObj=n}void 0!==e&&\"blur\"!==e.type&&function(e){e.preventDefault();var n=\"keydown\"===e.type,t=g(e),a=t;void 0!==w.amPM&&t===w.amPM&&(w.amPM.textContent=w.l10n.amPM[r(w.amPM.textContent===w.l10n.amPM[0])]);var i=parseFloat(a.getAttribute(\"min\")),l=parseFloat(a.getAttribute(\"max\")),c=parseFloat(a.getAttribute(\"step\")),s=parseInt(a.value,10),d=e.delta||(n?38===e.which?1:-1:0),u=s+c*d;if(void 0!==a.value&&2===a.value.length){var f=a===w.hourElement,m=a===w.minuteElement;u<i?(u=l+u+r(!f)+(r(f)&&r(!w.amPM)),m&&L(void 0,-1,w.hourElement)):u>l&&(u=a===w.hourElement?u-l-r(!w.amPM):i,m&&L(void 0,1,w.hourElement)),w.amPM&&f&&(1===c?u+s===23:Math.abs(u-s)>c)&&(w.amPM.textContent=w.l10n.amPM[r(w.amPM.textContent===w.l10n.amPM[0])]),a.value=o(u)}}(e);var a=w._input.value;O(),ye(),w._input.value!==a&&w._debouncedChange()}function O(){if(void 0!==w.hourElement&&void 0!==w.minuteElement){var e,n,t=(parseInt(w.hourElement.value.slice(-2),10)||0)%24,a=(parseInt(w.minuteElement.value,10)||0)%60,i=void 0!==w.secondElement?(parseInt(w.secondElement.value,10)||0)%60:0;void 0!==w.amPM&&(e=t,n=w.amPM.textContent,t=e%12+12*r(n===w.l10n.amPM[1]));var o=void 0!==w.config.minTime||w.config.minDate&&w.minDateHasTime&&w.latestSelectedDateObj&&0===M(w.latestSelectedDateObj,w.config.minDate,!0),l=void 0!==w.config.maxTime||w.config.maxDate&&w.maxDateHasTime&&w.latestSelectedDateObj&&0===M(w.latestSelectedDateObj,w.config.maxDate,!0);if(void 0!==w.config.maxTime&&void 0!==w.config.minTime&&w.config.minTime>w.config.maxTime){var c=y(w.config.minTime.getHours(),w.config.minTime.getMinutes(),w.config.minTime.getSeconds()),s=y(w.config.maxTime.getHours(),w.config.maxTime.getMinutes(),w.config.maxTime.getSeconds()),d=y(t,a,i);if(d>s&&d<c){var u=function(e){var n=Math.floor(e/3600),t=(e-3600*n)/60;return[n,t,e-3600*n-60*t]}(c);t=u[0],a=u[1],i=u[2]}}else{if(l){var f=void 0!==w.config.maxTime?w.config.maxTime:w.config.maxDate;(t=Math.min(t,f.getHours()))===f.getHours()&&(a=Math.min(a,f.getMinutes())),a===f.getMinutes()&&(i=Math.min(i,f.getSeconds()))}if(o){var m=void 0!==w.config.minTime?w.config.minTime:w.config.minDate;(t=Math.max(t,m.getHours()))===m.getHours()&&a<m.getMinutes()&&(a=m.getMinutes()),a===m.getMinutes()&&(i=Math.max(i,m.getSeconds()))}}A(t,a,i)}}function F(e){var n=e||w.latestSelectedDateObj;n&&n instanceof Date&&A(n.getHours(),n.getMinutes(),n.getSeconds())}function A(e,n,t){void 0!==w.latestSelectedDateObj&&w.latestSelectedDateObj.setHours(e%24,n,t||0,0),w.hourElement&&w.minuteElement&&!w.isMobile&&(w.hourElement.value=o(w.config.time_24hr?e:(12+e)%12+12*r(e%12==0)),w.minuteElement.value=o(n),void 0!==w.amPM&&(w.amPM.textContent=w.l10n.amPM[r(e>=12)]),void 0!==w.secondElement&&(w.secondElement.value=o(t)))}function N(e){var n=g(e),t=parseInt(n.value)+(e.delta||0);(t/1e3>1||\"Enter\"===e.key&&!/[^\\d]/.test(t.toString()))&&ee(t)}function P(e,n,t,a){return n instanceof Array?n.forEach((function(n){return P(e,n,t,a)})):e instanceof Array?e.forEach((function(e){return P(e,n,t,a)})):(e.addEventListener(n,t,a),void w._handlers.push({remove:function(){return e.removeEventListener(n,t,a)}}))}function Y(){De(\"onChange\")}function j(e,n){var t=void 0!==e?w.parseDate(e):w.latestSelectedDateObj||(w.config.minDate&&w.config.minDate>w.now?w.config.minDate:w.config.maxDate&&w.config.maxDate<w.now?w.config.maxDate:w.now),a=w.currentYear,i=w.currentMonth;try{void 0!==t&&(w.currentYear=t.getFullYear(),w.currentMonth=t.getMonth())}catch(e){e.message=\"Invalid date supplied: \"+t,w.config.errorHandler(e)}n&&w.currentYear!==a&&(De(\"onYearChange\"),q()),!n||w.currentYear===a&&w.currentMonth===i||De(\"onMonthChange\"),w.redraw()}function H(e){var n=g(e);~n.className.indexOf(\"arrow\")&&L(e,n.classList.contains(\"arrowUp\")?1:-1)}function L(e,n,t){var a=e&&g(e),i=t||a&&a.parentNode&&a.parentNode.firstChild,o=we(\"increment\");o.delta=n,i&&i.dispatchEvent(o)}function R(e,n,t,a){var i=ne(n,!0),o=d(\"span\",e,n.getDate().toString());return o.dateObj=n,o.$i=a,o.setAttribute(\"aria-label\",w.formatDate(n,w.config.ariaDateFormat)),-1===e.indexOf(\"hidden\")&&0===M(n,w.now)&&(w.todayDateElem=o,o.classList.add(\"today\"),o.setAttribute(\"aria-current\",\"date\")),i?(o.tabIndex=-1,be(n)&&(o.classList.add(\"selected\"),w.selectedDateElem=o,\"range\"===w.config.mode&&(s(o,\"startRange\",w.selectedDates[0]&&0===M(n,w.selectedDates[0],!0)),s(o,\"endRange\",w.selectedDates[1]&&0===M(n,w.selectedDates[1],!0)),\"nextMonthDay\"===e&&o.classList.add(\"inRange\")))):o.classList.add(\"flatpickr-disabled\"),\"range\"===w.config.mode&&function(e){return!(\"range\"!==w.config.mode||w.selectedDates.length<2)&&(M(e,w.selectedDates[0])>=0&&M(e,w.selectedDates[1])<=0)}(n)&&!be(n)&&o.classList.add(\"inRange\"),w.weekNumbers&&1===w.config.showMonths&&\"prevMonthDay\"!==e&&a%7==6&&w.weekNumbers.insertAdjacentHTML(\"beforeend\",\"<span class='flatpickr-day'>\"+w.config.getWeek(n)+\"</span>\"),De(\"onDayCreate\",o),o}function W(e){e.focus(),\"range\"===w.config.mode&&oe(e)}function B(e){for(var n=e>0?0:w.config.showMonths-1,t=e>0?w.config.showMonths:-1,a=n;a!=t;a+=e)for(var i=w.daysContainer.children[a],o=e>0?0:i.children.length-1,r=e>0?i.children.length:-1,l=o;l!=r;l+=e){var c=i.children[l];if(-1===c.className.indexOf(\"hidden\")&&ne(c.dateObj))return c}}function J(e,n){var t=k(),a=te(t||document.body),i=void 0!==e?e:a?t:void 0!==w.selectedDateElem&&te(w.selectedDateElem)?w.selectedDateElem:void 0!==w.todayDateElem&&te(w.todayDateElem)?w.todayDateElem:B(n>0?1:-1);void 0===i?w._input.focus():a?function(e,n){for(var t=-1===e.className.indexOf(\"Month\")?e.dateObj.getMonth():w.currentMonth,a=n>0?w.config.showMonths:-1,i=n>0?1:-1,o=t-w.currentMonth;o!=a;o+=i)for(var r=w.daysContainer.children[o],l=t-w.currentMonth===o?e.$i+n:n<0?r.children.length-1:0,c=r.children.length,s=l;s>=0&&s<c&&s!=(n>0?c:-1);s+=i){var d=r.children[s];if(-1===d.className.indexOf(\"hidden\")&&ne(d.dateObj)&&Math.abs(e.$i-s)>=Math.abs(n))return W(d)}w.changeMonth(i),J(B(i),0)}(i,n):W(i)}function K(e,n){for(var t=(new Date(e,n,1).getDay()-w.l10n.firstDayOfWeek+7)%7,a=w.utils.getDaysInMonth((n-1+12)%12,e),i=w.utils.getDaysInMonth(n,e),o=window.document.createDocumentFragment(),r=w.config.showMonths>1,l=r?\"prevMonthDay hidden\":\"prevMonthDay\",c=r?\"nextMonthDay hidden\":\"nextMonthDay\",s=a+1-t,u=0;s<=a;s++,u++)o.appendChild(R(\"flatpickr-day \"+l,new Date(e,n-1,s),0,u));for(s=1;s<=i;s++,u++)o.appendChild(R(\"flatpickr-day\",new Date(e,n,s),0,u));for(var f=i+1;f<=42-t&&(1===w.config.showMonths||u%7!=0);f++,u++)o.appendChild(R(\"flatpickr-day \"+c,new Date(e,n+1,f%i),0,u));var m=d(\"div\",\"dayContainer\");return m.appendChild(o),m}function U(){if(void 0!==w.daysContainer){u(w.daysContainer),w.weekNumbers&&u(w.weekNumbers);for(var e=document.createDocumentFragment(),n=0;n<w.config.showMonths;n++){var t=new Date(w.currentYear,w.currentMonth,1);t.setMonth(w.currentMonth+n),e.appendChild(K(t.getFullYear(),t.getMonth()))}w.daysContainer.appendChild(e),w.days=w.daysContainer.firstChild,\"range\"===w.config.mode&&1===w.selectedDates.length&&oe()}}function q(){if(!(w.config.showMonths>1||\"dropdown\"!==w.config.monthSelectorType)){var e=function(e){return!(void 0!==w.config.minDate&&w.currentYear===w.config.minDate.getFullYear()&&e<w.config.minDate.getMonth())&&!(void 0!==w.config.maxDate&&w.currentYear===w.config.maxDate.getFullYear()&&e>w.config.maxDate.getMonth())};w.monthsDropdownContainer.tabIndex=-1,w.monthsDropdownContainer.innerHTML=\"\";for(var n=0;n<12;n++)if(e(n)){var t=d(\"option\",\"flatpickr-monthDropdown-month\");t.value=new Date(w.currentYear,n).getMonth().toString(),t.textContent=h(n,w.config.shorthandCurrentMonth,w.l10n),t.tabIndex=-1,w.currentMonth===n&&(t.selected=!0),w.monthsDropdownContainer.appendChild(t)}}}function $(){var e,n=d(\"div\",\"flatpickr-month\"),t=window.document.createDocumentFragment();w.config.showMonths>1||\"static\"===w.config.monthSelectorType?e=d(\"span\",\"cur-month\"):(w.monthsDropdownContainer=d(\"select\",\"flatpickr-monthDropdown-months\"),w.monthsDropdownContainer.setAttribute(\"aria-label\",w.l10n.monthAriaLabel),P(w.monthsDropdownContainer,\"change\",(function(e){var n=g(e),t=parseInt(n.value,10);w.changeMonth(t-w.currentMonth),De(\"onMonthChange\")})),q(),e=w.monthsDropdownContainer);var a=m(\"cur-year\",{tabindex:\"-1\"}),i=a.getElementsByTagName(\"input\")[0];i.setAttribute(\"aria-label\",w.l10n.yearAriaLabel),w.config.minDate&&i.setAttribute(\"min\",w.config.minDate.getFullYear().toString()),w.config.maxDate&&(i.setAttribute(\"max\",w.config.maxDate.getFullYear().toString()),i.disabled=!!w.config.minDate&&w.config.minDate.getFullYear()===w.config.maxDate.getFullYear());var o=d(\"div\",\"flatpickr-current-month\");return o.appendChild(e),o.appendChild(a),t.appendChild(o),n.appendChild(t),{container:n,yearElement:i,monthElement:e}}function V(){u(w.monthNav),w.monthNav.appendChild(w.prevMonthNav),w.config.showMonths&&(w.yearElements=[],w.monthElements=[]);for(var e=w.config.showMonths;e--;){var n=$();w.yearElements.push(n.yearElement),w.monthElements.push(n.monthElement),w.monthNav.appendChild(n.container)}w.monthNav.appendChild(w.nextMonthNav)}function z(){w.weekdayContainer?u(w.weekdayContainer):w.weekdayContainer=d(\"div\",\"flatpickr-weekdays\");for(var e=w.config.showMonths;e--;){var n=d(\"div\",\"flatpickr-weekdaycontainer\");w.weekdayContainer.appendChild(n)}return G(),w.weekdayContainer}function G(){if(w.weekdayContainer){var e=w.l10n.firstDayOfWeek,t=n(w.l10n.weekdays.shorthand);e>0&&e<t.length&&(t=n(t.splice(e,t.length),t.splice(0,e)));for(var a=w.config.showMonths;a--;)w.weekdayContainer.children[a].innerHTML=\"\\n      <span class='flatpickr-weekday'>\\n        \"+t.join(\"</span><span class='flatpickr-weekday'>\")+\"\\n      </span>\\n      \"}}function Z(e,n){void 0===n&&(n=!0);var t=n?e:e-w.currentMonth;t<0&&!0===w._hidePrevMonthArrow||t>0&&!0===w._hideNextMonthArrow||(w.currentMonth+=t,(w.currentMonth<0||w.currentMonth>11)&&(w.currentYear+=w.currentMonth>11?1:-1,w.currentMonth=(w.currentMonth+12)%12,De(\"onYearChange\"),q()),U(),De(\"onMonthChange\"),Ce())}function Q(e){return w.calendarContainer.contains(e)}function X(e){if(w.isOpen&&!w.config.inline){var n=g(e),t=Q(n),a=!(n===w.input||n===w.altInput||w.element.contains(n)||e.path&&e.path.indexOf&&(~e.path.indexOf(w.input)||~e.path.indexOf(w.altInput)))&&!t&&!Q(e.relatedTarget),i=!w.config.ignoredFocusElements.some((function(e){return e.contains(n)}));a&&i&&(w.config.allowInput&&w.setDate(w._input.value,!1,w.config.altInput?w.config.altFormat:w.config.dateFormat),void 0!==w.timeContainer&&void 0!==w.minuteElement&&void 0!==w.hourElement&&\"\"!==w.input.value&&void 0!==w.input.value&&_(),w.close(),w.config&&\"range\"===w.config.mode&&1===w.selectedDates.length&&w.clear(!1))}}function ee(e){if(!(!e||w.config.minDate&&e<w.config.minDate.getFullYear()||w.config.maxDate&&e>w.config.maxDate.getFullYear())){var n=e,t=w.currentYear!==n;w.currentYear=n||w.currentYear,w.config.maxDate&&w.currentYear===w.config.maxDate.getFullYear()?w.currentMonth=Math.min(w.config.maxDate.getMonth(),w.currentMonth):w.config.minDate&&w.currentYear===w.config.minDate.getFullYear()&&(w.currentMonth=Math.max(w.config.minDate.getMonth(),w.currentMonth)),t&&(w.redraw(),De(\"onYearChange\"),q())}}function ne(e,n){var t;void 0===n&&(n=!0);var a=w.parseDate(e,void 0,n);if(w.config.minDate&&a&&M(a,w.config.minDate,void 0!==n?n:!w.minDateHasTime)<0||w.config.maxDate&&a&&M(a,w.config.maxDate,void 0!==n?n:!w.maxDateHasTime)>0)return!1;if(!w.config.enable&&0===w.config.disable.length)return!0;if(void 0===a)return!1;for(var i=!!w.config.enable,o=null!==(t=w.config.enable)&&void 0!==t?t:w.config.disable,r=0,l=void 0;r<o.length;r++){if(\"function\"==typeof(l=o[r])&&l(a))return i;if(l instanceof Date&&void 0!==a&&l.getTime()===a.getTime())return i;if(\"string\"==typeof l){var c=w.parseDate(l,void 0,!0);return c&&c.getTime()===a.getTime()?i:!i}if(\"object\"==typeof l&&void 0!==a&&l.from&&l.to&&a.getTime()>=l.from.getTime()&&a.getTime()<=l.to.getTime())return i}return!i}function te(e){return void 0!==w.daysContainer&&(-1===e.className.indexOf(\"hidden\")&&-1===e.className.indexOf(\"flatpickr-disabled\")&&w.daysContainer.contains(e))}function ae(e){var n=e.target===w._input,t=w._input.value.trimEnd()!==Me();!n||!t||e.relatedTarget&&Q(e.relatedTarget)||w.setDate(w._input.value,!0,e.target===w.altInput?w.config.altFormat:w.config.dateFormat)}function ie(e){var n=g(e),t=w.config.wrap?p.contains(n):n===w._input,a=w.config.allowInput,i=w.isOpen&&(!a||!t),o=w.config.inline&&t&&!a;if(13===e.keyCode&&t){if(a)return w.setDate(w._input.value,!0,n===w.altInput?w.config.altFormat:w.config.dateFormat),w.close(),n.blur();w.open()}else if(Q(n)||i||o){var r=!!w.timeContainer&&w.timeContainer.contains(n);switch(e.keyCode){case 13:r?(e.preventDefault(),_(),fe()):me(e);break;case 27:e.preventDefault(),fe();break;case 8:case 46:t&&!w.config.allowInput&&(e.preventDefault(),w.clear());break;case 37:case 39:if(r||t)w.hourElement&&w.hourElement.focus();else{e.preventDefault();var l=k();if(void 0!==w.daysContainer&&(!1===a||l&&te(l))){var c=39===e.keyCode?1:-1;e.ctrlKey?(e.stopPropagation(),Z(c),J(B(1),0)):J(void 0,c)}}break;case 38:case 40:e.preventDefault();var s=40===e.keyCode?1:-1;w.daysContainer&&void 0!==n.$i||n===w.input||n===w.altInput?e.ctrlKey?(e.stopPropagation(),ee(w.currentYear-s),J(B(1),0)):r||J(void 0,7*s):n===w.currentYearElement?ee(w.currentYear-s):w.config.enableTime&&(!r&&w.hourElement&&w.hourElement.focus(),_(e),w._debouncedChange());break;case 9:if(r){var d=[w.hourElement,w.minuteElement,w.secondElement,w.amPM].concat(w.pluginElements).filter((function(e){return e})),u=d.indexOf(n);if(-1!==u){var f=d[u+(e.shiftKey?-1:1)];e.preventDefault(),(f||w._input).focus()}}else!w.config.noCalendar&&w.daysContainer&&w.daysContainer.contains(n)&&e.shiftKey&&(e.preventDefault(),w._input.focus())}}if(void 0!==w.amPM&&n===w.amPM)switch(e.key){case w.l10n.amPM[0].charAt(0):case w.l10n.amPM[0].charAt(0).toLowerCase():w.amPM.textContent=w.l10n.amPM[0],O(),ye();break;case w.l10n.amPM[1].charAt(0):case w.l10n.amPM[1].charAt(0).toLowerCase():w.amPM.textContent=w.l10n.amPM[1],O(),ye()}(t||Q(n))&&De(\"onKeyDown\",e)}function oe(e,n){if(void 0===n&&(n=\"flatpickr-day\"),1===w.selectedDates.length&&(!e||e.classList.contains(n)&&!e.classList.contains(\"flatpickr-disabled\"))){for(var t=e?e.dateObj.getTime():w.days.firstElementChild.dateObj.getTime(),a=w.parseDate(w.selectedDates[0],void 0,!0).getTime(),i=Math.min(t,w.selectedDates[0].getTime()),o=Math.max(t,w.selectedDates[0].getTime()),r=!1,l=0,c=0,s=i;s<o;s+=x)ne(new Date(s),!0)||(r=r||s>i&&s<o,s<a&&(!l||s>l)?l=s:s>a&&(!c||s<c)&&(c=s));Array.from(w.rContainer.querySelectorAll(\"*:nth-child(-n+\"+w.config.showMonths+\") > .\"+n)).forEach((function(n){var i,o,s,d=n.dateObj.getTime(),u=l>0&&d<l||c>0&&d>c;if(u)return n.classList.add(\"notAllowed\"),void[\"inRange\",\"startRange\",\"endRange\"].forEach((function(e){n.classList.remove(e)}));r&&!u||([\"startRange\",\"inRange\",\"endRange\",\"notAllowed\"].forEach((function(e){n.classList.remove(e)})),void 0!==e&&(e.classList.add(t<=w.selectedDates[0].getTime()?\"startRange\":\"endRange\"),a<t&&d===a?n.classList.add(\"startRange\"):a>t&&d===a&&n.classList.add(\"endRange\"),d>=l&&(0===c||d<=c)&&(o=a,s=t,(i=d)>Math.min(o,s)&&i<Math.max(o,s))&&n.classList.add(\"inRange\")))}))}}function re(){!w.isOpen||w.config.static||w.config.inline||de()}function le(e){return function(n){var t=w.config[\"_\"+e+\"Date\"]=w.parseDate(n,w.config.dateFormat),a=w.config[\"_\"+(\"min\"===e?\"max\":\"min\")+\"Date\"];void 0!==t&&(w[\"min\"===e?\"minDateHasTime\":\"maxDateHasTime\"]=t.getHours()>0||t.getMinutes()>0||t.getSeconds()>0),w.selectedDates&&(w.selectedDates=w.selectedDates.filter((function(e){return ne(e)})),w.selectedDates.length||\"min\"!==e||F(t),ye()),w.daysContainer&&(ue(),void 0!==t?w.currentYearElement[e]=t.getFullYear().toString():w.currentYearElement.removeAttribute(e),w.currentYearElement.disabled=!!a&&void 0!==t&&a.getFullYear()===t.getFullYear())}}function ce(){return w.config.wrap?p.querySelector(\"[data-input]\"):p}function se(){\"object\"!=typeof w.config.locale&&void 0===I.l10ns[w.config.locale]&&w.config.errorHandler(new Error(\"flatpickr: invalid locale \"+w.config.locale)),w.l10n=e(e({},I.l10ns.default),\"object\"==typeof w.config.locale?w.config.locale:\"default\"!==w.config.locale?I.l10ns[w.config.locale]:void 0),D.D=\"(\"+w.l10n.weekdays.shorthand.join(\"|\")+\")\",D.l=\"(\"+w.l10n.weekdays.longhand.join(\"|\")+\")\",D.M=\"(\"+w.l10n.months.shorthand.join(\"|\")+\")\",D.F=\"(\"+w.l10n.months.longhand.join(\"|\")+\")\",D.K=\"(\"+w.l10n.amPM[0]+\"|\"+w.l10n.amPM[1]+\"|\"+w.l10n.amPM[0].toLowerCase()+\"|\"+w.l10n.amPM[1].toLowerCase()+\")\",void 0===e(e({},v),JSON.parse(JSON.stringify(p.dataset||{}))).time_24hr&&void 0===I.defaultConfig.time_24hr&&(w.config.time_24hr=w.l10n.time_24hr),w.formatDate=b(w),w.parseDate=C({config:w.config,l10n:w.l10n})}function de(e){if(\"function\"!=typeof w.config.position){if(void 0!==w.calendarContainer){De(\"onPreCalendarPosition\");var n=e||w._positionElement,t=Array.prototype.reduce.call(w.calendarContainer.children,(function(e,n){return e+n.offsetHeight}),0),a=w.calendarContainer.offsetWidth,i=w.config.position.split(\" \"),o=i[0],r=i.length>1?i[1]:null,l=n.getBoundingClientRect(),c=window.innerHeight-l.bottom,d=\"above\"===o||\"below\"!==o&&c<t&&l.top>t,u=window.pageYOffset+l.top+(d?-t-2:n.offsetHeight+2);if(s(w.calendarContainer,\"arrowTop\",!d),s(w.calendarContainer,\"arrowBottom\",d),!w.config.inline){var f=window.pageXOffset+l.left,m=!1,g=!1;\"center\"===r?(f-=(a-l.width)/2,m=!0):\"right\"===r&&(f-=a-l.width,g=!0),s(w.calendarContainer,\"arrowLeft\",!m&&!g),s(w.calendarContainer,\"arrowCenter\",m),s(w.calendarContainer,\"arrowRight\",g);var p=window.document.body.offsetWidth-(window.pageXOffset+l.right),h=f+a>window.document.body.offsetWidth,v=p+a>window.document.body.offsetWidth;if(s(w.calendarContainer,\"rightMost\",h),!w.config.static)if(w.calendarContainer.style.top=u+\"px\",h)if(v){var D=function(){for(var e=null,n=0;n<document.styleSheets.length;n++){var t=document.styleSheets[n];if(t.cssRules){try{t.cssRules}catch(e){continue}e=t;break}}return null!=e?e:(a=document.createElement(\"style\"),document.head.appendChild(a),a.sheet);var a}();if(void 0===D)return;var b=window.document.body.offsetWidth,C=Math.max(0,b/2-a/2),M=D.cssRules.length,y=\"{left:\"+l.left+\"px;right:auto;}\";s(w.calendarContainer,\"rightMost\",!1),s(w.calendarContainer,\"centerMost\",!0),D.insertRule(\".flatpickr-calendar.centerMost:before,.flatpickr-calendar.centerMost:after\"+y,M),w.calendarContainer.style.left=C+\"px\",w.calendarContainer.style.right=\"auto\"}else w.calendarContainer.style.left=\"auto\",w.calendarContainer.style.right=p+\"px\";else w.calendarContainer.style.left=f+\"px\",w.calendarContainer.style.right=\"auto\"}}}else w.config.position(w,e)}function ue(){w.config.noCalendar||w.isMobile||(q(),Ce(),U())}function fe(){w._input.focus(),-1!==window.navigator.userAgent.indexOf(\"MSIE\")||void 0!==navigator.msMaxTouchPoints?setTimeout(w.close,0):w.close()}function me(e){e.preventDefault(),e.stopPropagation();var n=f(g(e),(function(e){return e.classList&&e.classList.contains(\"flatpickr-day\")&&!e.classList.contains(\"flatpickr-disabled\")&&!e.classList.contains(\"notAllowed\")}));if(void 0!==n){var t=n,a=w.latestSelectedDateObj=new Date(t.dateObj.getTime()),i=(a.getMonth()<w.currentMonth||a.getMonth()>w.currentMonth+w.config.showMonths-1)&&\"range\"!==w.config.mode;if(w.selectedDateElem=t,\"single\"===w.config.mode)w.selectedDates=[a];else if(\"multiple\"===w.config.mode){var o=be(a);o?w.selectedDates.splice(parseInt(o),1):w.selectedDates.push(a)}else\"range\"===w.config.mode&&(2===w.selectedDates.length&&w.clear(!1,!1),w.latestSelectedDateObj=a,w.selectedDates.push(a),0!==M(a,w.selectedDates[0],!0)&&w.selectedDates.sort((function(e,n){return e.getTime()-n.getTime()})));if(O(),i){var r=w.currentYear!==a.getFullYear();w.currentYear=a.getFullYear(),w.currentMonth=a.getMonth(),r&&(De(\"onYearChange\"),q()),De(\"onMonthChange\")}if(Ce(),U(),ye(),i||\"range\"===w.config.mode||1!==w.config.showMonths?void 0!==w.selectedDateElem&&void 0===w.hourElement&&w.selectedDateElem&&w.selectedDateElem.focus():W(t),void 0!==w.hourElement&&void 0!==w.hourElement&&w.hourElement.focus(),w.config.closeOnSelect){var l=\"single\"===w.config.mode&&!w.config.enableTime,c=\"range\"===w.config.mode&&2===w.selectedDates.length&&!w.config.enableTime;(l||c)&&fe()}Y()}}w.parseDate=C({config:w.config,l10n:w.l10n}),w._handlers=[],w.pluginElements=[],w.loadedPlugins=[],w._bind=P,w._setHoursFromDate=F,w._positionCalendar=de,w.changeMonth=Z,w.changeYear=ee,w.clear=function(e,n){void 0===e&&(e=!0);void 0===n&&(n=!0);w.input.value=\"\",void 0!==w.altInput&&(w.altInput.value=\"\");void 0!==w.mobileInput&&(w.mobileInput.value=\"\");w.selectedDates=[],w.latestSelectedDateObj=void 0,!0===n&&(w.currentYear=w._initialDate.getFullYear(),w.currentMonth=w._initialDate.getMonth());if(!0===w.config.enableTime){var t=E(w.config),a=t.hours,i=t.minutes,o=t.seconds;A(a,i,o)}w.redraw(),e&&De(\"onChange\")},w.close=function(){w.isOpen=!1,w.isMobile||(void 0!==w.calendarContainer&&w.calendarContainer.classList.remove(\"open\"),void 0!==w._input&&w._input.classList.remove(\"active\"));De(\"onClose\")},w.onMouseOver=oe,w._createElement=d,w.createDay=R,w.destroy=function(){void 0!==w.config&&De(\"onDestroy\");for(var e=w._handlers.length;e--;)w._handlers[e].remove();if(w._handlers=[],w.mobileInput)w.mobileInput.parentNode&&w.mobileInput.parentNode.removeChild(w.mobileInput),w.mobileInput=void 0;else if(w.calendarContainer&&w.calendarContainer.parentNode)if(w.config.static&&w.calendarContainer.parentNode){var n=w.calendarContainer.parentNode;if(n.lastChild&&n.removeChild(n.lastChild),n.parentNode){for(;n.firstChild;)n.parentNode.insertBefore(n.firstChild,n);n.parentNode.removeChild(n)}}else w.calendarContainer.parentNode.removeChild(w.calendarContainer);w.altInput&&(w.input.type=\"text\",w.altInput.parentNode&&w.altInput.parentNode.removeChild(w.altInput),delete w.altInput);w.input&&(w.input.type=w.input._type,w.input.classList.remove(\"flatpickr-input\"),w.input.removeAttribute(\"readonly\"));[\"_showTimeInput\",\"latestSelectedDateObj\",\"_hideNextMonthArrow\",\"_hidePrevMonthArrow\",\"__hideNextMonthArrow\",\"__hidePrevMonthArrow\",\"isMobile\",\"isOpen\",\"selectedDateElem\",\"minDateHasTime\",\"maxDateHasTime\",\"days\",\"daysContainer\",\"_input\",\"_positionElement\",\"innerContainer\",\"rContainer\",\"monthNav\",\"todayDateElem\",\"calendarContainer\",\"weekdayContainer\",\"prevMonthNav\",\"nextMonthNav\",\"monthsDropdownContainer\",\"currentMonthElement\",\"currentYearElement\",\"navigationCurrentMonth\",\"selectedDateElem\",\"config\"].forEach((function(e){try{delete w[e]}catch(e){}}))},w.isEnabled=ne,w.jumpToDate=j,w.updateValue=ye,w.open=function(e,n){void 0===n&&(n=w._positionElement);if(!0===w.isMobile){if(e){e.preventDefault();var t=g(e);t&&t.blur()}return void 0!==w.mobileInput&&(w.mobileInput.focus(),w.mobileInput.click()),void De(\"onOpen\")}if(w._input.disabled||w.config.inline)return;var a=w.isOpen;w.isOpen=!0,a||(w.calendarContainer.classList.add(\"open\"),w._input.classList.add(\"active\"),De(\"onOpen\"),de(n));!0===w.config.enableTime&&!0===w.config.noCalendar&&(!1!==w.config.allowInput||void 0!==e&&w.timeContainer.contains(e.relatedTarget)||setTimeout((function(){return w.hourElement.select()}),50))},w.redraw=ue,w.set=function(e,n){if(null!==e&&\"object\"==typeof e)for(var a in Object.assign(w.config,e),e)void 0!==ge[a]&&ge[a].forEach((function(e){return e()}));else w.config[e]=n,void 0!==ge[e]?ge[e].forEach((function(e){return e()})):t.indexOf(e)>-1&&(w.config[e]=c(n));w.redraw(),ye(!0)},w.setDate=function(e,n,t){void 0===n&&(n=!1);void 0===t&&(t=w.config.dateFormat);if(0!==e&&!e||e instanceof Array&&0===e.length)return w.clear(n);pe(e,t),w.latestSelectedDateObj=w.selectedDates[w.selectedDates.length-1],w.redraw(),j(void 0,n),F(),0===w.selectedDates.length&&w.clear(!1);ye(n),n&&De(\"onChange\")},w.toggle=function(e){if(!0===w.isOpen)return w.close();w.open(e)};var ge={locale:[se,G],showMonths:[V,S,z],minDate:[j],maxDate:[j],positionElement:[ve],clickOpens:[function(){!0===w.config.clickOpens?(P(w._input,\"focus\",w.open),P(w._input,\"click\",w.open)):(w._input.removeEventListener(\"focus\",w.open),w._input.removeEventListener(\"click\",w.open))}]};function pe(e,n){var t=[];if(e instanceof Array)t=e.map((function(e){return w.parseDate(e,n)}));else if(e instanceof Date||\"number\"==typeof e)t=[w.parseDate(e,n)];else if(\"string\"==typeof e)switch(w.config.mode){case\"single\":case\"time\":t=[w.parseDate(e,n)];break;case\"multiple\":t=e.split(w.config.conjunction).map((function(e){return w.parseDate(e,n)}));break;case\"range\":t=e.split(w.l10n.rangeSeparator).map((function(e){return w.parseDate(e,n)}))}else w.config.errorHandler(new Error(\"Invalid date supplied: \"+JSON.stringify(e)));w.selectedDates=w.config.allowInvalidPreload?t:t.filter((function(e){return e instanceof Date&&ne(e,!1)})),\"range\"===w.config.mode&&w.selectedDates.sort((function(e,n){return e.getTime()-n.getTime()}))}function he(e){return e.slice().map((function(e){return\"string\"==typeof e||\"number\"==typeof e||e instanceof Date?w.parseDate(e,void 0,!0):e&&\"object\"==typeof e&&e.from&&e.to?{from:w.parseDate(e.from,void 0),to:w.parseDate(e.to,void 0)}:e})).filter((function(e){return e}))}function ve(){w._positionElement=w.config.positionElement||w._input}function De(e,n){if(void 0!==w.config){var t=w.config[e];if(void 0!==t&&t.length>0)for(var a=0;t[a]&&a<t.length;a++)t[a](w.selectedDates,w.input.value,w,n);\"onChange\"===e&&(w.input.dispatchEvent(we(\"change\")),w.input.dispatchEvent(we(\"input\")))}}function we(e){var n=document.createEvent(\"Event\");return n.initEvent(e,!0,!0),n}function be(e){for(var n=0;n<w.selectedDates.length;n++){var t=w.selectedDates[n];if(t instanceof Date&&0===M(t,e))return\"\"+n}return!1}function Ce(){w.config.noCalendar||w.isMobile||!w.monthNav||(w.yearElements.forEach((function(e,n){var t=new Date(w.currentYear,w.currentMonth,1);t.setMonth(w.currentMonth+n),w.config.showMonths>1||\"static\"===w.config.monthSelectorType?w.monthElements[n].textContent=h(t.getMonth(),w.config.shorthandCurrentMonth,w.l10n)+\" \":w.monthsDropdownContainer.value=t.getMonth().toString(),e.value=t.getFullYear().toString()})),w._hidePrevMonthArrow=void 0!==w.config.minDate&&(w.currentYear===w.config.minDate.getFullYear()?w.currentMonth<=w.config.minDate.getMonth():w.currentYear<w.config.minDate.getFullYear()),w._hideNextMonthArrow=void 0!==w.config.maxDate&&(w.currentYear===w.config.maxDate.getFullYear()?w.currentMonth+1>w.config.maxDate.getMonth():w.currentYear>w.config.maxDate.getFullYear()))}function Me(e){var n=e||(w.config.altInput?w.config.altFormat:w.config.dateFormat);return w.selectedDates.map((function(e){return w.formatDate(e,n)})).filter((function(e,n,t){return\"range\"!==w.config.mode||w.config.enableTime||t.indexOf(e)===n})).join(\"range\"!==w.config.mode?w.config.conjunction:w.l10n.rangeSeparator)}function ye(e){void 0===e&&(e=!0),void 0!==w.mobileInput&&w.mobileFormatStr&&(w.mobileInput.value=void 0!==w.latestSelectedDateObj?w.formatDate(w.latestSelectedDateObj,w.mobileFormatStr):\"\"),w.input.value=Me(w.config.dateFormat),void 0!==w.altInput&&(w.altInput.value=Me(w.config.altFormat)),!1!==e&&De(\"onValueUpdate\")}function xe(e){var n=g(e),t=w.prevMonthNav.contains(n),a=w.nextMonthNav.contains(n);t||a?Z(t?-1:1):w.yearElements.indexOf(n)>=0?n.select():n.classList.contains(\"arrowUp\")?w.changeYear(w.currentYear+1):n.classList.contains(\"arrowDown\")&&w.changeYear(w.currentYear-1)}return function(){w.element=w.input=p,w.isOpen=!1,function(){var n=[\"wrap\",\"weekNumbers\",\"allowInput\",\"allowInvalidPreload\",\"clickOpens\",\"time_24hr\",\"enableTime\",\"noCalendar\",\"altInput\",\"shorthandCurrentMonth\",\"inline\",\"static\",\"enableSeconds\",\"disableMobile\"],i=e(e({},JSON.parse(JSON.stringify(p.dataset||{}))),v),o={};w.config.parseDate=i.parseDate,w.config.formatDate=i.formatDate,Object.defineProperty(w.config,\"enable\",{get:function(){return w.config._enable},set:function(e){w.config._enable=he(e)}}),Object.defineProperty(w.config,\"disable\",{get:function(){return w.config._disable},set:function(e){w.config._disable=he(e)}});var r=\"time\"===i.mode;if(!i.dateFormat&&(i.enableTime||r)){var l=I.defaultConfig.dateFormat||a.dateFormat;o.dateFormat=i.noCalendar||r?\"H:i\"+(i.enableSeconds?\":S\":\"\"):l+\" H:i\"+(i.enableSeconds?\":S\":\"\")}if(i.altInput&&(i.enableTime||r)&&!i.altFormat){var s=I.defaultConfig.altFormat||a.altFormat;o.altFormat=i.noCalendar||r?\"h:i\"+(i.enableSeconds?\":S K\":\" K\"):s+\" h:i\"+(i.enableSeconds?\":S\":\"\")+\" K\"}Object.defineProperty(w.config,\"minDate\",{get:function(){return w.config._minDate},set:le(\"min\")}),Object.defineProperty(w.config,\"maxDate\",{get:function(){return w.config._maxDate},set:le(\"max\")});var d=function(e){return function(n){w.config[\"min\"===e?\"_minTime\":\"_maxTime\"]=w.parseDate(n,\"H:i:S\")}};Object.defineProperty(w.config,\"minTime\",{get:function(){return w.config._minTime},set:d(\"min\")}),Object.defineProperty(w.config,\"maxTime\",{get:function(){return w.config._maxTime},set:d(\"max\")}),\"time\"===i.mode&&(w.config.noCalendar=!0,w.config.enableTime=!0);Object.assign(w.config,o,i);for(var u=0;u<n.length;u++)w.config[n[u]]=!0===w.config[n[u]]||\"true\"===w.config[n[u]];t.filter((function(e){return void 0!==w.config[e]})).forEach((function(e){w.config[e]=c(w.config[e]||[]).map(T)})),w.isMobile=!w.config.disableMobile&&!w.config.inline&&\"single\"===w.config.mode&&!w.config.disable.length&&!w.config.enable&&!w.config.weekNumbers&&/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);for(u=0;u<w.config.plugins.length;u++){var f=w.config.plugins[u](w)||{};for(var m in f)t.indexOf(m)>-1?w.config[m]=c(f[m]).map(T).concat(w.config[m]):void 0===i[m]&&(w.config[m]=f[m])}i.altInputClass||(w.config.altInputClass=ce().className+\" \"+w.config.altInputClass);De(\"onParseConfig\")}(),se(),function(){if(w.input=ce(),!w.input)return void w.config.errorHandler(new Error(\"Invalid input element specified\"));w.input._type=w.input.type,w.input.type=\"text\",w.input.classList.add(\"flatpickr-input\"),w._input=w.input,w.config.altInput&&(w.altInput=d(w.input.nodeName,w.config.altInputClass),w._input=w.altInput,w.altInput.placeholder=w.input.placeholder,w.altInput.disabled=w.input.disabled,w.altInput.required=w.input.required,w.altInput.tabIndex=w.input.tabIndex,w.altInput.type=\"text\",w.input.setAttribute(\"type\",\"hidden\"),!w.config.static&&w.input.parentNode&&w.input.parentNode.insertBefore(w.altInput,w.input.nextSibling));w.config.allowInput||w._input.setAttribute(\"readonly\",\"readonly\");ve()}(),function(){w.selectedDates=[],w.now=w.parseDate(w.config.now)||new Date;var e=w.config.defaultDate||(\"INPUT\"!==w.input.nodeName&&\"TEXTAREA\"!==w.input.nodeName||!w.input.placeholder||w.input.value!==w.input.placeholder?w.input.value:null);e&&pe(e,w.config.dateFormat);w._initialDate=w.selectedDates.length>0?w.selectedDates[0]:w.config.minDate&&w.config.minDate.getTime()>w.now.getTime()?w.config.minDate:w.config.maxDate&&w.config.maxDate.getTime()<w.now.getTime()?w.config.maxDate:w.now,w.currentYear=w._initialDate.getFullYear(),w.currentMonth=w._initialDate.getMonth(),w.selectedDates.length>0&&(w.latestSelectedDateObj=w.selectedDates[0]);void 0!==w.config.minTime&&(w.config.minTime=w.parseDate(w.config.minTime,\"H:i\"));void 0!==w.config.maxTime&&(w.config.maxTime=w.parseDate(w.config.maxTime,\"H:i\"));w.minDateHasTime=!!w.config.minDate&&(w.config.minDate.getHours()>0||w.config.minDate.getMinutes()>0||w.config.minDate.getSeconds()>0),w.maxDateHasTime=!!w.config.maxDate&&(w.config.maxDate.getHours()>0||w.config.maxDate.getMinutes()>0||w.config.maxDate.getSeconds()>0)}(),w.utils={getDaysInMonth:function(e,n){return void 0===e&&(e=w.currentMonth),void 0===n&&(n=w.currentYear),1===e&&(n%4==0&&n%100!=0||n%400==0)?29:w.l10n.daysInMonth[e]}},w.isMobile||function(){var e=window.document.createDocumentFragment();if(w.calendarContainer=d(\"div\",\"flatpickr-calendar\"),w.calendarContainer.tabIndex=-1,!w.config.noCalendar){if(e.appendChild((w.monthNav=d(\"div\",\"flatpickr-months\"),w.yearElements=[],w.monthElements=[],w.prevMonthNav=d(\"span\",\"flatpickr-prev-month\"),w.prevMonthNav.innerHTML=w.config.prevArrow,w.nextMonthNav=d(\"span\",\"flatpickr-next-month\"),w.nextMonthNav.innerHTML=w.config.nextArrow,V(),Object.defineProperty(w,\"_hidePrevMonthArrow\",{get:function(){return w.__hidePrevMonthArrow},set:function(e){w.__hidePrevMonthArrow!==e&&(s(w.prevMonthNav,\"flatpickr-disabled\",e),w.__hidePrevMonthArrow=e)}}),Object.defineProperty(w,\"_hideNextMonthArrow\",{get:function(){return w.__hideNextMonthArrow},set:function(e){w.__hideNextMonthArrow!==e&&(s(w.nextMonthNav,\"flatpickr-disabled\",e),w.__hideNextMonthArrow=e)}}),w.currentYearElement=w.yearElements[0],Ce(),w.monthNav)),w.innerContainer=d(\"div\",\"flatpickr-innerContainer\"),w.config.weekNumbers){var n=function(){w.calendarContainer.classList.add(\"hasWeeks\");var e=d(\"div\",\"flatpickr-weekwrapper\");e.appendChild(d(\"span\",\"flatpickr-weekday\",w.l10n.weekAbbreviation));var n=d(\"div\",\"flatpickr-weeks\");return e.appendChild(n),{weekWrapper:e,weekNumbers:n}}(),t=n.weekWrapper,a=n.weekNumbers;w.innerContainer.appendChild(t),w.weekNumbers=a,w.weekWrapper=t}w.rContainer=d(\"div\",\"flatpickr-rContainer\"),w.rContainer.appendChild(z()),w.daysContainer||(w.daysContainer=d(\"div\",\"flatpickr-days\"),w.daysContainer.tabIndex=-1),U(),w.rContainer.appendChild(w.daysContainer),w.innerContainer.appendChild(w.rContainer),e.appendChild(w.innerContainer)}w.config.enableTime&&e.appendChild(function(){w.calendarContainer.classList.add(\"hasTime\"),w.config.noCalendar&&w.calendarContainer.classList.add(\"noCalendar\");var e=E(w.config);w.timeContainer=d(\"div\",\"flatpickr-time\"),w.timeContainer.tabIndex=-1;var n=d(\"span\",\"flatpickr-time-separator\",\":\"),t=m(\"flatpickr-hour\",{\"aria-label\":w.l10n.hourAriaLabel});w.hourElement=t.getElementsByTagName(\"input\")[0];var a=m(\"flatpickr-minute\",{\"aria-label\":w.l10n.minuteAriaLabel});w.minuteElement=a.getElementsByTagName(\"input\")[0],w.hourElement.tabIndex=w.minuteElement.tabIndex=-1,w.hourElement.value=o(w.latestSelectedDateObj?w.latestSelectedDateObj.getHours():w.config.time_24hr?e.hours:function(e){switch(e%24){case 0:case 12:return 12;default:return e%12}}(e.hours)),w.minuteElement.value=o(w.latestSelectedDateObj?w.latestSelectedDateObj.getMinutes():e.minutes),w.hourElement.setAttribute(\"step\",w.config.hourIncrement.toString()),w.minuteElement.setAttribute(\"step\",w.config.minuteIncrement.toString()),w.hourElement.setAttribute(\"min\",w.config.time_24hr?\"0\":\"1\"),w.hourElement.setAttribute(\"max\",w.config.time_24hr?\"23\":\"12\"),w.hourElement.setAttribute(\"maxlength\",\"2\"),w.minuteElement.setAttribute(\"min\",\"0\"),w.minuteElement.setAttribute(\"max\",\"59\"),w.minuteElement.setAttribute(\"maxlength\",\"2\"),w.timeContainer.appendChild(t),w.timeContainer.appendChild(n),w.timeContainer.appendChild(a),w.config.time_24hr&&w.timeContainer.classList.add(\"time24hr\");if(w.config.enableSeconds){w.timeContainer.classList.add(\"hasSeconds\");var i=m(\"flatpickr-second\");w.secondElement=i.getElementsByTagName(\"input\")[0],w.secondElement.value=o(w.latestSelectedDateObj?w.latestSelectedDateObj.getSeconds():e.seconds),w.secondElement.setAttribute(\"step\",w.minuteElement.getAttribute(\"step\")),w.secondElement.setAttribute(\"min\",\"0\"),w.secondElement.setAttribute(\"max\",\"59\"),w.secondElement.setAttribute(\"maxlength\",\"2\"),w.timeContainer.appendChild(d(\"span\",\"flatpickr-time-separator\",\":\")),w.timeContainer.appendChild(i)}w.config.time_24hr||(w.amPM=d(\"span\",\"flatpickr-am-pm\",w.l10n.amPM[r((w.latestSelectedDateObj?w.hourElement.value:w.config.defaultHour)>11)]),w.amPM.title=w.l10n.toggleTitle,w.amPM.tabIndex=-1,w.timeContainer.appendChild(w.amPM));return w.timeContainer}());s(w.calendarContainer,\"rangeMode\",\"range\"===w.config.mode),s(w.calendarContainer,\"animate\",!0===w.config.animate),s(w.calendarContainer,\"multiMonth\",w.config.showMonths>1),w.calendarContainer.appendChild(e);var i=void 0!==w.config.appendTo&&void 0!==w.config.appendTo.nodeType;if((w.config.inline||w.config.static)&&(w.calendarContainer.classList.add(w.config.inline?\"inline\":\"static\"),w.config.inline&&(!i&&w.element.parentNode?w.element.parentNode.insertBefore(w.calendarContainer,w._input.nextSibling):void 0!==w.config.appendTo&&w.config.appendTo.appendChild(w.calendarContainer)),w.config.static)){var l=d(\"div\",\"flatpickr-wrapper\");w.element.parentNode&&w.element.parentNode.insertBefore(l,w.element),l.appendChild(w.element),w.altInput&&l.appendChild(w.altInput),l.appendChild(w.calendarContainer)}w.config.static||w.config.inline||(void 0!==w.config.appendTo?w.config.appendTo:window.document.body).appendChild(w.calendarContainer)}(),function(){w.config.wrap&&[\"open\",\"close\",\"toggle\",\"clear\"].forEach((function(e){Array.prototype.forEach.call(w.element.querySelectorAll(\"[data-\"+e+\"]\"),(function(n){return P(n,\"click\",w[e])}))}));if(w.isMobile)return void function(){var e=w.config.enableTime?w.config.noCalendar?\"time\":\"datetime-local\":\"date\";w.mobileInput=d(\"input\",w.input.className+\" flatpickr-mobile\"),w.mobileInput.tabIndex=1,w.mobileInput.type=e,w.mobileInput.disabled=w.input.disabled,w.mobileInput.required=w.input.required,w.mobileInput.placeholder=w.input.placeholder,w.mobileFormatStr=\"datetime-local\"===e?\"Y-m-d\\\\TH:i:S\":\"date\"===e?\"Y-m-d\":\"H:i:S\",w.selectedDates.length>0&&(w.mobileInput.defaultValue=w.mobileInput.value=w.formatDate(w.selectedDates[0],w.mobileFormatStr));w.config.minDate&&(w.mobileInput.min=w.formatDate(w.config.minDate,\"Y-m-d\"));w.config.maxDate&&(w.mobileInput.max=w.formatDate(w.config.maxDate,\"Y-m-d\"));w.input.getAttribute(\"step\")&&(w.mobileInput.step=String(w.input.getAttribute(\"step\")));w.input.type=\"hidden\",void 0!==w.altInput&&(w.altInput.type=\"hidden\");try{w.input.parentNode&&w.input.parentNode.insertBefore(w.mobileInput,w.input.nextSibling)}catch(e){}P(w.mobileInput,\"change\",(function(e){w.setDate(g(e).value,!1,w.mobileFormatStr),De(\"onChange\"),De(\"onClose\")}))}();var e=l(re,50);w._debouncedChange=l(Y,300),w.daysContainer&&!/iPhone|iPad|iPod/i.test(navigator.userAgent)&&P(w.daysContainer,\"mouseover\",(function(e){\"range\"===w.config.mode&&oe(g(e))}));P(w._input,\"keydown\",ie),void 0!==w.calendarContainer&&P(w.calendarContainer,\"keydown\",ie);w.config.inline||w.config.static||P(window,\"resize\",e);void 0!==window.ontouchstart?P(window.document,\"touchstart\",X):P(window.document,\"mousedown\",X);P(window.document,\"focus\",X,{capture:!0}),!0===w.config.clickOpens&&(P(w._input,\"focus\",w.open),P(w._input,\"click\",w.open));void 0!==w.daysContainer&&(P(w.monthNav,\"click\",xe),P(w.monthNav,[\"keyup\",\"increment\"],N),P(w.daysContainer,\"click\",me));if(void 0!==w.timeContainer&&void 0!==w.minuteElement&&void 0!==w.hourElement){var n=function(e){return g(e).select()};P(w.timeContainer,[\"increment\"],_),P(w.timeContainer,\"blur\",_,{capture:!0}),P(w.timeContainer,\"click\",H),P([w.hourElement,w.minuteElement],[\"focus\",\"click\"],n),void 0!==w.secondElement&&P(w.secondElement,\"focus\",(function(){return w.secondElement&&w.secondElement.select()})),void 0!==w.amPM&&P(w.amPM,\"click\",(function(e){_(e)}))}w.config.allowInput&&P(w._input,\"blur\",ae)}(),(w.selectedDates.length||w.config.noCalendar)&&(w.config.enableTime&&F(w.config.noCalendar?w.latestSelectedDateObj:void 0),ye(!1)),S();var n=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);!w.isMobile&&n&&de(),De(\"onReady\")}(),w}function T(e,n){for(var t=Array.prototype.slice.call(e).filter((function(e){return e instanceof HTMLElement})),a=[],i=0;i<t.length;i++){var o=t[i];try{if(null!==o.getAttribute(\"data-fp-omit\"))continue;void 0!==o._flatpickr&&(o._flatpickr.destroy(),o._flatpickr=void 0),o._flatpickr=k(o,n||{}),a.push(o._flatpickr)}catch(e){console.error(e)}}return 1===a.length?a[0]:a}\"undefined\"!=typeof HTMLElement&&\"undefined\"!=typeof HTMLCollection&&\"undefined\"!=typeof NodeList&&(HTMLCollection.prototype.flatpickr=NodeList.prototype.flatpickr=function(e){return T(this,e)},HTMLElement.prototype.flatpickr=function(e){return T([this],e)});var I=function(e,n){return\"string\"==typeof e?T(window.document.querySelectorAll(e),n):e instanceof Node?T([e],n):T(e,n)};return I.defaultConfig={},I.l10ns={en:e({},i),default:e({},i)},I.localize=function(n){I.l10ns.default=e(e({},I.l10ns.default),n)},I.setDefaults=function(n){I.defaultConfig=e(e({},I.defaultConfig),n)},I.parseDate=C({}),I.formatDate=b({}),I.compareDates=M,\"undefined\"!=typeof jQuery&&void 0!==jQuery.fn&&(jQuery.fn.flatpickr=function(e){return T(this,e)}),Date.prototype.fp_incr=function(e){return new Date(this.getFullYear(),this.getMonth(),this.getDate()+(\"string\"==typeof e?parseInt(e,10):e))},\"undefined\"!=typeof window&&(window.flatpickr=I),I}));","define(\"@bagaar/ember-permissions/helpers/can-access-route\", [\"exports\", \"@ember/component/helper\", \"@ember/service\"], function (_exports, _helper, _service) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _dec, _class, _descriptor;\n  function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }\n  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n  function _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\n  function _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }\n  function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }\n  let CanAccessRouteHelper = (_dec = (0, _service.inject)('permissions'), _class = class CanAccessRouteHelper extends _helper.default {\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty(this, \"permissionsService\", _descriptor, this);\n    }\n    compute(_ref) {\n      let [routeName] = _ref;\n      return this.permissionsService.canAccessRoute(routeName);\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"permissionsService\", [_dec], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n  _exports.default = CanAccessRouteHelper;\n});","define(\"@bagaar/ember-permissions/helpers/has-permissions\", [\"exports\", \"@ember/component/helper\", \"@ember/service\"], function (_exports, _helper, _service) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _dec, _class, _descriptor;\n  function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }\n  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n  function _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\n  function _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }\n  function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }\n  let HasPermissionsHelper = (_dec = (0, _service.inject)('permissions'), _class = class HasPermissionsHelper extends _helper.default {\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty(this, \"permissionsService\", _descriptor, this);\n    }\n    compute(permissions) {\n      return this.permissionsService.hasPermissions(permissions);\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"permissionsService\", [_dec], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n  _exports.default = HasPermissionsHelper;\n});","define(\"@bagaar/ember-permissions/services/permissions\", [\"exports\", \"@ember/debug\", \"@ember/object\", \"@ember/service\", \"@glimmer/tracking\"], function (_exports, _debug, _object, _service, _tracking) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _dec, _class, _descriptor, _descriptor2, _descriptor3, _isRouteValidationEnabled, _routeAccessDeniedHandlers;\n  function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }\n  function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }\n  function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError(\"Cannot initialize the same private elements twice on an object\"); } }\n  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n  function _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\n  function _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n  function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"set\"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }\n  function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError(\"attempted to set read only private field\"); } descriptor.value = value; } }\n  function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"get\"); return _classApplyDescriptorGet(receiver, descriptor); }\n  function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError(\"attempted to \" + action + \" private field on non-instance\"); } return privateMap.get(receiver); }\n  function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }\n  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }\n  function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }\n  let PermissionsService = (_dec = (0, _service.inject)('router'), _class = (_isRouteValidationEnabled = /*#__PURE__*/new WeakMap(), _routeAccessDeniedHandlers = /*#__PURE__*/new WeakMap(), class PermissionsService extends _service.default {\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty(this, \"routerService\", _descriptor, this);\n      _initializerDefineProperty(this, \"permissions\", _descriptor2, this);\n      _initializerDefineProperty(this, \"routePermissions\", _descriptor3, this);\n      _classPrivateFieldInitSpec(this, _isRouteValidationEnabled, {\n        writable: true,\n        value: false\n      });\n      _classPrivateFieldInitSpec(this, _routeAccessDeniedHandlers, {\n        writable: true,\n        value: new Set()\n      });\n    }\n    addRouteAccessDeniedHandler(handler) {\n      _classPrivateFieldGet(this, _routeAccessDeniedHandlers).add(handler);\n    }\n    removeRouteAccessDeniedHandler(handler) {\n      _classPrivateFieldGet(this, _routeAccessDeniedHandlers).delete(handler);\n    }\n    setPermissions(permissions) {\n      (true && !(permissions && Array.isArray(permissions)) && (0, _debug.assert)('`permissions` is required and should be an array.', permissions && Array.isArray(permissions)));\n      this.permissions = permissions;\n    }\n    setRoutePermissions(routePermissions) {\n      (true && !(routePermissions && typeof routePermissions === 'object') && (0, _debug.assert)('`routePermissions` is required and should be an object.', routePermissions && typeof routePermissions === 'object'));\n      this.routePermissions = routePermissions;\n    }\n    hasPermissions(permissions) {\n      (true && !(permissions && Array.isArray(permissions)) && (0, _debug.assert)('`permissions` is required and should be an array.', permissions && Array.isArray(permissions)));\n      return permissions.every(permission => {\n        return this.permissions.includes(permission);\n      });\n    }\n    canAccessRoute(routeName) {\n      (true && !(routeName && typeof routeName === 'string') && (0, _debug.assert)('`routeName` is required and should be a string.', routeName && typeof routeName === 'string'));\n      const routeTreePermissions = this.getRouteTreePermissions(routeName);\n      return this.hasPermissions(routeTreePermissions);\n    }\n    getRouteTreePermissions(routeName) {\n      const routeNameSplitted = routeName.split('.');\n      const routeTreePermissions = [];\n      for (let index = 0; index < routeNameSplitted.length; index++) {\n        const routeNameJoined = routeNameSplitted.slice(0, index + 1).join('.');\n        const routePermissions = this.routePermissions[routeNameJoined];\n        if (routePermissions) {\n          routeTreePermissions.push(...routePermissions);\n        }\n      }\n      return routeTreePermissions;\n    }\n    enableRouteValidation(initialTransition) {\n      if (_classPrivateFieldGet(this, _isRouteValidationEnabled) === true) {\n        return;\n      }\n      _classPrivateFieldSet(this, _isRouteValidationEnabled, true);\n      if (initialTransition) {\n        this.validateTransition(initialTransition);\n      }\n      this.routerService.on('routeWillChange', this.validateTransition);\n    }\n    validateTransition(transition) {\n      const routeName = transition?.to?.name;\n      if (routeName && this.canAccessRoute(routeName) === false) {\n        _classPrivateFieldGet(this, _routeAccessDeniedHandlers).forEach(handler => handler(transition));\n      }\n    }\n    willDestroy() {\n      if (_classPrivateFieldGet(this, _isRouteValidationEnabled) === true) {\n        this.routerService.off('routeWillChange', this.validateTransition);\n      }\n    }\n  }), _descriptor = _applyDecoratedDescriptor(_class.prototype, \"routerService\", [_dec], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"permissions\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return [];\n    }\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"routePermissions\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return {};\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"validateTransition\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"validateTransition\"), _class.prototype), _class);\n  _exports.default = PermissionsService;\n});","define('@ember-data/adapter/-private', ['exports', '@embroider/macros/runtime', '@ember/debug', 'rsvp', 'require', '@ember/object/mixin', '@ember/string', 'ember-inflector'], (function (exports, runtime, debug, rsvp, require, Mixin, string, emberInflector) { 'use strict';\n\n  const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e };\n\n  const require__default = /*#__PURE__*/_interopDefaultLegacy(require);\n  const Mixin__default = /*#__PURE__*/_interopDefaultLegacy(Mixin);\n\n  const newline = /\\r?\\n/;\n  function parseResponseHeaders(headersString) {\n    const headers = Object.create(null);\n    if (!headersString) {\n      return headers;\n    }\n    const headerPairs = headersString.split(newline);\n    for (let i = 0; i < headerPairs.length; i++) {\n      let header = headerPairs[i];\n      let j = 0;\n      let foundSep = false;\n      for (; j < header.length; j++) {\n        if (header.charCodeAt(j) === 58 /* ':' */) {\n          foundSep = true;\n          break;\n        }\n      }\n      if (foundSep === false) {\n        continue;\n      }\n      let field = header.substring(0, j).trim();\n      let value = header.substring(j + 1, header.length).trim();\n      if (value) {\n        let lowerCasedField = field.toLowerCase();\n        headers[lowerCasedField] = value;\n        headers[field] = value;\n      }\n    }\n    return headers;\n  }\n\n  function continueOnReject(promise) {\n    return rsvp.resolve(promise).catch(e => e);\n  }\n\n  /*\n   * Function that always attempts to parse the response as json, and if an error is thrown,\n   * returns `undefined` if the response is successful and has a status code of 204 (No Content),\n   * or 205 (Reset Content) or if the request method was 'HEAD', and the plain payload otherwise.\n   */\n  function _determineContent(response, requestData, payload) {\n    let ret = payload;\n    let error = null;\n    if (!response.ok) {\n      return payload;\n    }\n    let status = response.status;\n    let payloadIsEmpty = payload === '' || payload === null;\n    let statusIndicatesEmptyResponse = status === 204 || status === 205 || requestData.method === 'HEAD';\n    if (runtime.macroCondition(true)) {\n      if (payloadIsEmpty && !statusIndicatesEmptyResponse) {\n        let message = `The server returned an empty string for ${requestData.method} ${requestData.url}, which cannot be parsed into a valid JSON. Return either null or {}.`;\n        if (payload === '') {\n          (debug.warn(message, {\n            id: 'ds.adapter.returned-empty-string-as-JSON'\n          }));\n        }\n      }\n    }\n    if (response.ok && (statusIndicatesEmptyResponse || payloadIsEmpty)) {\n      return;\n    }\n    try {\n      ret = JSON.parse(payload);\n    } catch (e) {\n      if (!(e instanceof SyntaxError)) {\n        return e;\n      }\n      e.payload = payload;\n      error = e;\n    }\n    if (error) {\n      if (runtime.macroCondition(true)) {\n        // eslint-disable-next-line no-console\n        console.warn('This response was unable to be parsed as json.', payload);\n      }\n      return error;\n    }\n    return ret;\n  }\n  function determineBodyPromise(response, requestData) {\n    // response.text() may resolve or reject\n    // it is a native promise, may not have finally\n    return continueOnReject(response.text()).then(payload => _determineContent(response, requestData, payload));\n  }\n\n  const RBRACKET = /\\[\\]$/;\n  function isPlainObject(obj) {\n    return Object.prototype.toString.call(obj) === '[object Object]';\n  }\n\n  /*\n   * Helper function that turns the data/body of a request into a query param string.\n   * This is directly copied from jQuery.param.\n   */\n  function serializeQueryParams(queryParamsObject) {\n    let s = [];\n    function buildParams(prefix, obj) {\n      let i, len, key;\n      if (prefix) {\n        if (Array.isArray(obj)) {\n          for (i = 0, len = obj.length; i < len; i++) {\n            if (RBRACKET.test(prefix)) {\n              add(s, prefix, obj[i]);\n            } else {\n              buildParams(prefix + '[' + (typeof obj[i] === 'object' && obj[i] !== null ? i : '') + ']', obj[i]);\n            }\n          }\n        } else if (isPlainObject(obj)) {\n          for (key in obj) {\n            buildParams(prefix + '[' + key + ']', obj[key]);\n          }\n        } else {\n          add(s, prefix, obj);\n        }\n      } else if (Array.isArray(obj)) {\n        for (i = 0, len = obj.length; i < len; i++) {\n          add(s, obj[i].name, obj[i].value);\n        }\n      } else {\n        for (key in obj) {\n          buildParams(key, obj[key]);\n        }\n      }\n      return s;\n    }\n    return buildParams('', queryParamsObject).join('&');\n  }\n\n  /*\n   * Part of the `serializeQueryParams` helper function.\n   */\n  function add(s, k, v) {\n    // Strip out keys with undefined value and replace null values with\n    // empty strings (mimics jQuery.ajax)\n    if (v === undefined) {\n      return;\n    } else if (v === null) {\n      v = '';\n    }\n    v = typeof v === 'function' ? v() : v;\n    s[s.length] = `${encodeURIComponent(k)}=${encodeURIComponent(v)}`;\n  }\n\n  let _fetch = null;\n  function getFetchFunction() {\n    if (_fetch !== null) {\n      return _fetch();\n    }\n    if (require.has('fetch')) {\n      // use `fetch` module by default, this is commonly provided by ember-fetch\n      let fetchFn = require__default.default('fetch').default;\n      _fetch = () => fetchFn;\n    } else if (typeof fetch === 'function') {\n      // fallback to using global fetch\n      _fetch = () => fetch;\n    } else {\n      throw new Error('cannot find the `fetch` module or the `fetch` global. Did you mean to install the `ember-fetch` addon?');\n    }\n    return _fetch();\n  }\n\n  /**\n    @module @ember-data/adapter\n  */\n\n  /*\n   The structure of this file is such because typing Mixins is hard. Here we've structured it in\n   such a way as to maximize the type information that a consumer can utilize. There are simpler\n   ways to type a mixin but we would not be able to provide the nice overload signature for buildURL\n  */\n  // the interface must fully declare the function signatures that the individual functions\n  // will also declare. If instead we try to keep them in sync by doing something like\n  // `interface BuildURLMixin { buildURL: typeof buildURL }`\n  // then an extending class overwriting one of the methods will break because typescript\n  // thinks it is a switch from an instance prop (that is a method) to an instance method.\n\n  // prevents the final constructed object from needing to add\n  // host and namespace which are provided by the final consuming\n  // class to the prototype which can result in overwrite errors\n\n  /**\n    ## Using BuildURLMixin\n\n    To use URL building, include the mixin when extending an adapter, and call `buildURL` where needed.\n    The default behaviour is designed for RESTAdapter.\n\n    ### Example\n\n    ```javascript\n    import Adapter, { BuildURLMixin } from '@ember-data/adapter';\n\n    export default class ApplicationAdapter extends Adapter.extend(BuildURLMixin) {\n      findRecord(store, type, id, snapshot) {\n        var url = this.buildURL(type.modelName, id, snapshot, 'findRecord');\n        return this.ajax(url, 'GET');\n      }\n    }\n    ```\n\n    ### Attributes\n\n    The `host` and `namespace` attributes will be used if defined, and are optional.\n\n    @class BuildURLMixin\n    @public\n  */\n  /**\n      Builds a URL for a given type and optional ID.\n\n      By default, it pluralizes the type's name (for example, 'post'\n      becomes 'posts' and 'person' becomes 'people'). To override the\n      pluralization see [pathForType](./pathForType?anchor=pathForType).\n\n      If an ID is specified, it adds the ID to the path generated\n      for the type, separated by a `/`.\n\n      When called by `RESTAdapter.findMany()` the `id` and `snapshot` parameters\n      will be arrays of ids and snapshots.\n\n      @method buildURL\n      @public\n      @param {String} modelName\n      @param {(String|Array|Object)} id single id or array of ids or query\n      @param {(Snapshot|SnapshotRecordArray)} snapshot single snapshot or array of snapshots\n      @param {String} requestType\n      @param {Object} query object of query parameters to send for query requests.\n      @return {String} url\n    */\n\n  function buildURL(modelName, id, snapshot, requestType, query) {\n    /*\n        Switch statements in typescript don't currently narrow even when the function is implemented\n        with overloads.\n         We still extract this to stand alone so that we can provide nice overloads for calling signatures,\n        but we will still require all of this casting (or a ridiculous number of assertsthat narrow it down\n        for us).\n    */\n    switch (requestType) {\n      case 'findRecord':\n        return this.urlForFindRecord(id, modelName, snapshot);\n      case 'findAll':\n        return this.urlForFindAll(modelName, snapshot);\n      case 'query':\n        return this.urlForQuery(query || {}, modelName);\n      case 'queryRecord':\n        return this.urlForQueryRecord(query || {}, modelName);\n      case 'findMany':\n        return this.urlForFindMany(id, modelName, snapshot);\n      case 'findHasMany':\n        return this.urlForFindHasMany(id, modelName, snapshot);\n      case 'findBelongsTo':\n        return this.urlForFindBelongsTo(id, modelName, snapshot);\n      case 'createRecord':\n        return this.urlForCreateRecord(modelName, snapshot);\n      case 'updateRecord':\n        return this.urlForUpdateRecord(id, modelName, snapshot);\n      case 'deleteRecord':\n        return this.urlForDeleteRecord(id, modelName, snapshot);\n      default:\n        // this is the 'never' case but someone may call `buildURL` manually so\n        // we try to do something for them.\n        return this._buildURL(modelName, id);\n    }\n  }\n\n  /**\n      @method _buildURL\n      @private\n      @param {String} modelName\n      @param {String} id\n      @return {String} url\n    */\n  function _buildURL(modelName, id) {\n    let path;\n    let url = [];\n    let {\n      host\n    } = this;\n    let prefix = this.urlPrefix();\n    if (modelName) {\n      path = this.pathForType(modelName);\n      if (path) {\n        url.push(path);\n      }\n    }\n    if (id) {\n      url.push(encodeURIComponent(id));\n    }\n    if (prefix) {\n      url.unshift(prefix);\n    }\n    let urlString = url.join('/');\n    if (!host && urlString && urlString.charAt(0) !== '/') {\n      urlString = '/' + urlString;\n    }\n    return urlString;\n  }\n\n  /**\n     Builds a URL for a `store.findRecord(type, id)` call.\n\n     Example:\n\n     ```app/adapters/user.js\n     import JSONAPIAdapter from '@ember-data/adapter/json-api';\n\n     export default class ApplicationAdapter extends JSONAPIAdapter {\n       urlForFindRecord(id, modelName, snapshot) {\n         let baseUrl = this.buildURL(modelName, id, snapshot);\n         return `${baseUrl}/users/${snapshot.adapterOptions.user_id}/playlists/${id}`;\n       }\n     }\n     ```\n\n     @method urlForFindRecord\n     @public\n     @param {String} id\n     @param {String} modelName\n     @param {Snapshot} snapshot\n     @return {String} url\n\n     */\n  function urlForFindRecord(id, modelName, snapshot) {\n    return this._buildURL(modelName, id);\n  }\n\n  /**\n     Builds a URL for a `store.findAll(type)` call.\n\n     Example:\n\n     ```app/adapters/comment.js\n     import JSONAPIAdapter from '@ember-data/adapter/json-api';\n\n     export default class ApplicationAdapter extends JSONAPIAdapter {\n       urlForFindAll(modelName, snapshot) {\n         let baseUrl = this.buildURL(modelName);\n         return `${baseUrl}/data/comments.json`;\n       }\n     }\n     ```\n\n     @method urlForFindAll\n      @public\n     @param {String} modelName\n     @param {SnapshotRecordArray} snapshot\n     @return {String} url\n     */\n  function urlForFindAll(modelName, snapshots) {\n    return this._buildURL(modelName);\n  }\n\n  /**\n     Builds a URL for a `store.query(type, query)` call.\n\n     Example:\n\n     ```app/adapters/application.js\n     import RESTAdapter from '@ember-data/adapter/rest';\n\n     export default class ApplicationAdapter extends RESTAdapter {\n       host = 'https://api.github.com';\n       urlForQuery (query, modelName) {\n         switch(modelName) {\n           case 'repo':\n             return `https://api.github.com/orgs/${query.orgId}/repos`;\n           default:\n             return super.urlForQuery(...arguments);\n         }\n       }\n     }\n     ```\n\n     @method urlForQuery\n      @public\n     @param {Object} query\n     @param {String} modelName\n     @return {String} url\n     */\n  function urlForQuery(query, modelName) {\n    return this._buildURL(modelName);\n  }\n\n  /**\n     Builds a URL for a `store.queryRecord(type, query)` call.\n\n     Example:\n\n     ```app/adapters/application.js\n     import RESTAdapter from '@ember-data/adapter/rest';\n\n     export default class ApplicationAdapter extends RESTAdapter {\n       urlForQueryRecord({ slug }, modelName) {\n         let baseUrl = this.buildURL();\n         return `${baseUrl}/${encodeURIComponent(slug)}`;\n       }\n     }\n     ```\n\n     @method urlForQueryRecord\n      @public\n     @param {Object} query\n     @param {String} modelName\n     @return {String} url\n     */\n  function urlForQueryRecord(query, modelName) {\n    return this._buildURL(modelName);\n  }\n\n  /**\n     Builds a URL for coalescing multiple `store.findRecord(type, id)`\n     records into 1 request when the adapter's `coalesceFindRequests`\n     property is `true`.\n\n     Example:\n\n     ```app/adapters/application.js\n     import RESTAdapter from '@ember-data/adapter/rest';\n\n     export default class ApplicationAdapter extends RESTAdapter {\n       urlForFindMany(ids, modelName) {\n         let baseUrl = this.buildURL();\n         return `${baseUrl}/coalesce`;\n       }\n     }\n     ```\n\n     @method urlForFindMany\n      @public\n     @param {Array} ids\n     @param {String} modelName\n     @param {Array} snapshots\n     @return {String} url\n     */\n  function urlForFindMany(ids, modelName, snapshots) {\n    return this._buildURL(modelName);\n  }\n\n  /**\n     Builds a URL for fetching an async `hasMany` relationship when a URL\n     is not provided by the server.\n\n     Example:\n\n     ```app/adapters/application.js\n     import JSONAPIAdapter from '@ember-data/adapter/json-api';\n\n     export default class ApplicationAdapter extends JSONAPIAdapter {\n       urlForFindHasMany(id, modelName, snapshot) {\n         let baseUrl = this.buildURL(modelName, id);\n         return `${baseUrl}/relationships`;\n       }\n     }\n     ```\n\n     @method urlForFindHasMany\n      @public\n     @param {String} id\n     @param {String} modelName\n     @param {Snapshot} snapshot\n     @return {String} url\n     */\n  function urlForFindHasMany(id, modelName, snapshot) {\n    return this._buildURL(modelName, id);\n  }\n\n  /**\n     Builds a URL for fetching an async `belongsTo` relationship when a url\n     is not provided by the server.\n\n     Example:\n\n     ```app/adapters/application.js\n     import JSONAPIAdapter from '@ember-data/adapter/json-api';\n\n     export default class ApplicationAdapter extends JSONAPIAdapter {\n       urlForFindBelongsTo(id, modelName, snapshot) {\n         let baseUrl = this.buildURL(modelName, id);\n         return `${baseUrl}/relationships`;\n       }\n     }\n     ```\n\n     @method urlForFindBelongsTo\n      @public\n     @param {String} id\n     @param {String} modelName\n     @param {Snapshot} snapshot\n     @return {String} url\n     */\n  function urlForFindBelongsTo(id, modelName, snapshot) {\n    return this._buildURL(modelName, id);\n  }\n\n  /**\n     Builds a URL for a `record.save()` call when the record was created\n     locally using `store.createRecord()`.\n\n     Example:\n\n     ```app/adapters/application.js\n     import RESTAdapter from '@ember-data/adapter/rest';\n\n     export default class ApplicationAdapter extends RESTAdapter {\n       urlForCreateRecord(modelName, snapshot) {\n         return super.urlForCreateRecord(...arguments) + '/new';\n       }\n     }\n     ```\n\n     @method urlForCreateRecord\n      @public\n     @param {String} modelName\n     @param {Snapshot} snapshot\n     @return {String} url\n     */\n  function urlForCreateRecord(modelName, snapshot) {\n    return this._buildURL(modelName);\n  }\n\n  /**\n     Builds a URL for a `record.save()` call when the record has been updated locally.\n\n     Example:\n\n     ```app/adapters/application.js\n     import RESTAdapter from '@ember-data/adapter/rest';\n\n     export default class ApplicationAdapter extends RESTAdapter {\n       urlForUpdateRecord(id, modelName, snapshot) {\n         return `/${id}/feed?access_token=${snapshot.adapterOptions.token}`;\n       }\n     }\n     ```\n\n     @method urlForUpdateRecord\n      @public\n     @param {String} id\n     @param {String} modelName\n     @param {Snapshot} snapshot\n     @return {String} url\n     */\n  function urlForUpdateRecord(id, modelName, snapshot) {\n    return this._buildURL(modelName, id);\n  }\n\n  /**\n     Builds a URL for a `record.save()` call when the record has been deleted locally.\n\n     Example:\n\n     ```app/adapters/application.js\n     import RESTAdapter from '@ember-data/adapter/rest';\n\n     export default class ApplicationAdapter extends RESTAdapter {\n       urlForDeleteRecord(id, modelName, snapshot) {\n         return super.urlForDeleteRecord(...arguments) + '/destroy';\n       }\n     }\n     ```\n\n     @method urlForDeleteRecord\n      @public\n     @param {String} id\n     @param {String} modelName\n     @param {Snapshot} snapshot\n     @return {String} url\n     */\n  function urlForDeleteRecord(id, modelName, snapshot) {\n    return this._buildURL(modelName, id);\n  }\n\n  /**\n      @method urlPrefix\n      @private\n      @param {String} path\n      @param {String} parentURL\n      @return {String} urlPrefix\n    */\n  function urlPrefix(path, parentURL) {\n    let {\n      host,\n      namespace\n    } = this;\n    if (!host || host === '/') {\n      host = '';\n    }\n    if (path) {\n      // Protocol relative url\n      if (/^\\/\\//.test(path) || /http(s)?:\\/\\//.test(path)) {\n        // Do nothing, the full host is already included.\n        return path;\n\n        // Absolute path\n      } else if (path.charAt(0) === '/') {\n        return `${host}${path}`;\n        // Relative path\n      } else {\n        return `${parentURL}/${path}`;\n      }\n    }\n\n    // No path provided\n    let url = [];\n    if (host) {\n      url.push(host);\n    }\n    if (namespace) {\n      url.push(namespace);\n    }\n    return url.join('/');\n  }\n\n  /**\n      Determines the pathname for a given type.\n\n      By default, it pluralizes the type's name (for example,\n      'post' becomes 'posts' and 'person' becomes 'people').\n\n      ### Pathname customization\n\n      For example, if you have an object `LineItem` with an\n      endpoint of `/line_items/`.\n\n      ```app/adapters/application.js\n      import RESTAdapter from '@ember-data/adapter/rest';\n      import { decamelize, pluralize } from '<app-name>/utils/string-utils';\n\n      export default class ApplicationAdapter extends RESTAdapter {\n        pathForType(modelName) {\n          var decamelized = decamelize(modelName);\n          return pluralize(decamelized);\n        }\n      }\n      ```\n\n      @method pathForType\n      @public\n      @param {String} modelName\n      @return {String} path\n    **/\n  function pathForType(modelName) {\n    let camelized = string.camelize(modelName);\n    return emberInflector.pluralize(camelized);\n  }\n\n  // we build it this way vs casting to BuildURLMixin so that any\n  // changes to the interface surface as errors here.\n  const mixinProps = {\n    buildURL,\n    _buildURL,\n    urlForFindRecord,\n    urlForFindAll,\n    urlForQueryRecord,\n    urlForQuery,\n    urlForFindMany,\n    urlForFindHasMany,\n    urlForFindBelongsTo,\n    urlForCreateRecord,\n    urlForDeleteRecord,\n    urlForUpdateRecord,\n    urlPrefix,\n    pathForType\n  };\n  const buildUrlMixin = Mixin__default.default.create(mixinProps);\n\n  function serializeIntoHash(store, modelClass, snapshot, options) {\n    if (options === void 0) {\n      options = {\n        includeId: true\n      };\n    }\n    const serializer = store.serializerFor(modelClass.modelName);\n    (!(serializer) && debug.assert(`Cannot serialize record, no serializer defined`, serializer));\n    if (typeof serializer.serializeIntoHash === 'function') {\n      const data = {};\n      serializer.serializeIntoHash(data, modelClass, snapshot, options);\n      return data;\n    }\n    return serializer.serialize(snapshot, options);\n  }\n\n  exports.BuildURLMixin = buildUrlMixin;\n  exports.determineBodyPromise = determineBodyPromise;\n  exports.fetch = getFetchFunction;\n  exports.parseResponseHeaders = parseResponseHeaders;\n  exports.serializeIntoHash = serializeIntoHash;\n  exports.serializeQueryParams = serializeQueryParams;\n\n  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });\n\n}));\n","define(\"@ember-data/adapter/error\", [\"exports\", \"@embroider/macros/runtime\", \"@ember/debug\"], function (_exports, _runtime, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = _exports.UnauthorizedError = _exports.TimeoutError = _exports.ServerError = _exports.NotFoundError = _exports.InvalidError = _exports.ForbiddenError = _exports.ConflictError = _exports.AbortError = void 0;\n  _exports.errorsArrayToHash = errorsArrayToHash;\n  _exports.errorsHashToArray = errorsHashToArray;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/debug\",0,\"@ember-data/private-build-infra/deprecations\"eaimeta@70e063a35619d71f\n  /**\n    @module @ember-data/adapter/error\n   */\n  /**\n    A `AdapterError` is used by an adapter to signal that an error occurred\n    during a request to an external API. It indicates a generic error, and\n    subclasses are used to indicate specific error states. The following\n    subclasses are provided:\n  \n    - `InvalidError`\n    - `TimeoutError`\n    - `AbortError`\n    - `UnauthorizedError`\n    - `ForbiddenError`\n    - `NotFoundError`\n    - `ConflictError`\n    - `ServerError`\n  \n    To create a custom error to signal a specific error state in communicating\n    with an external API, extend the `AdapterError`. For example, if the\n    external API exclusively used HTTP `503 Service Unavailable` to indicate\n    it was closed for maintenance:\n  \n    ```app/adapters/maintenance-error.js\n    import AdapterError from '@ember-data/adapter/error';\n  \n    export default AdapterError.extend({ message: \"Down for maintenance.\" });\n    ```\n  \n    This error would then be returned by an adapter's `handleResponse` method:\n  \n    ```app/adapters/application.js\n    import JSONAPIAdapter from '@ember-data/adapter/json-api';\n    import MaintenanceError from './maintenance-error';\n  \n    export default class ApplicationAdapter extends JSONAPIAdapter {\n      handleResponse(status) {\n        if (503 === status) {\n          return new MaintenanceError();\n        }\n  \n        return super.handleResponse(...arguments);\n      }\n    }\n    ```\n  \n    And can then be detected in an application and used to send the user to an\n    `under-maintenance` route:\n  \n    ```app/routes/application.js\n    import Route from '@ember/routing/route';\n    import MaintenanceError from '../adapters/maintenance-error';\n  \n    export default class ApplicationRoute extends Route {\n      actions: {\n        error(error, transition) {\n          if (error instanceof MaintenanceError) {\n            this.transitionTo('under-maintenance');\n            return;\n          }\n  \n          // ...other error handling logic\n        }\n      }\n    }\n    ```\n  \n    @main @ember-data/adapter/error\n    @class AdapterError\n    @public\n  */\n  function AdapterError(errors, message) {\n    if (message === void 0) {\n      message = 'Adapter operation failed';\n    }\n    this.isAdapterError = true;\n    let error = Error.call(this, message);\n    if (error) {\n      this.stack = error.stack;\n      this.description = error.description;\n      this.fileName = error.fileName;\n      this.lineNumber = error.lineNumber;\n      this.message = error.message;\n      this.name = error.name;\n      this.number = error.number;\n    }\n    this.errors = errors || [{\n      title: 'Adapter Error',\n      detail: message\n    }];\n  }\n  var _default = AdapterError;\n  _exports.default = _default;\n  function extendFn(ErrorClass) {\n    return function (_temp) {\n      let {\n        message: defaultMessage\n      } = _temp === void 0 ? {} : _temp;\n      return extend(ErrorClass, defaultMessage);\n    };\n  }\n  function extend(ParentErrorClass, defaultMessage) {\n    let ErrorClass = function (errors, message) {\n      (true && !(Array.isArray(errors || [])) && (0, _debug.assert)('`AdapterError` expects json-api formatted errors array.', Array.isArray(errors || [])));\n      ParentErrorClass.call(this, errors, message || defaultMessage);\n    };\n    ErrorClass.prototype = Object.create(ParentErrorClass.prototype);\n    ErrorClass.extend = extendFn(ErrorClass);\n    return ErrorClass;\n  }\n  AdapterError.prototype = Object.create(Error.prototype);\n  AdapterError.prototype.code = 'AdapterError';\n  AdapterError.extend = extendFn(AdapterError);\n\n  /**\n    A `InvalidError` is used by an adapter to signal the external API\n    was unable to process a request because the content was not\n    semantically correct or meaningful per the API. Usually, this means a\n    record failed some form of server-side validation. When a promise\n    from an adapter is rejected with a `InvalidError` the record will\n    transition to the `invalid` state and the errors will be set to the\n    `errors` property on the record.\n  \n    For Ember Data to correctly map errors to their corresponding\n    properties on the model, Ember Data expects each error to be\n    a valid JSON-API error object with a `source/pointer` that matches\n    the property name. For example, if you had a Post model that\n    looked like this.\n  \n    ```app/models/post.js\n    import Model, { attr } from '@ember-data/model';\n  \n    export default class PostModel extends Model {\n      @attr('string') title;\n      @attr('string') content;\n    }\n    ```\n  \n    To show an error from the server related to the `title` and\n    `content` properties your adapter could return a promise that\n    rejects with a `InvalidError` object that looks like this:\n  \n    ```app/adapters/post.js\n    import RSVP from 'RSVP';\n    import RESTAdapter from '@ember-data/adapter/rest';\n    import { InvalidError } from '@ember-data/adapter/error';\n  \n    export default class ApplicationAdapter extends RESTAdapter {\n      updateRecord() {\n        // Fictional adapter that always rejects\n        return RSVP.reject(new InvalidError([\n          {\n            detail: 'Must be unique',\n            source: { pointer: '/data/attributes/title' }\n          },\n          {\n            detail: 'Must not be blank',\n            source: { pointer: '/data/attributes/content'}\n          }\n        ]));\n      }\n    }\n    ```\n  \n    Your backend may use different property names for your records the\n    store will attempt to extract and normalize the errors using the\n    serializer's `extractErrors` method before the errors get added to\n    the model. As a result, it is safe for the `InvalidError` to\n    wrap the error payload unaltered.\n  \n    @class InvalidError\n    @public\n    @extends AdapterError\n  */\n  // TODO @deprecate extractError documentation\n  const InvalidError = extend(AdapterError, 'The adapter rejected the commit because it was invalid');\n  _exports.InvalidError = InvalidError;\n  InvalidError.prototype.code = 'InvalidError';\n\n  /**\n    A `TimeoutError` is used by an adapter to signal that a request\n    to the external API has timed out. I.e. no response was received from\n    the external API within an allowed time period.\n  \n    An example use case would be to warn the user to check their internet\n    connection if an adapter operation has timed out:\n  \n    ```app/routes/application.js\n    import Route from '@ember/routing/route';\n    import { TimeoutError } from '@ember-data/adapter/error';\n    import { action } from '@ember/object';\n  \n    export default class ApplicationRoute extends Route {\n      @action\n      error(error, transition) {\n        if (error instanceof TimeoutError) {\n          // alert the user\n          alert('Are you still connected to the Internet?');\n          return;\n        }\n  \n        // ...other error handling logic\n      }\n    }\n    ```\n  \n    @class TimeoutError\n    @public\n    @extends AdapterError\n  */\n  const TimeoutError = extend(AdapterError, 'The adapter operation timed out');\n  _exports.TimeoutError = TimeoutError;\n  TimeoutError.prototype.code = 'TimeoutError';\n\n  /**\n    A `AbortError` is used by an adapter to signal that a request to\n    the external API was aborted. For example, this can occur if the user\n    navigates away from the current page after a request to the external API\n    has been initiated but before a response has been received.\n  \n    @class AbortError\n    @public\n    @extends AdapterError\n  */\n  const AbortError = extend(AdapterError, 'The adapter operation was aborted');\n  _exports.AbortError = AbortError;\n  AbortError.prototype.code = 'AbortError';\n\n  /**\n    A `UnauthorizedError` equates to a HTTP `401 Unauthorized` response\n    status. It is used by an adapter to signal that a request to the external\n    API was rejected because authorization is required and has failed or has not\n    yet been provided.\n  \n    An example use case would be to redirect the user to a login route if a\n    request is unauthorized:\n  \n    ```app/routes/application.js\n    import Route from '@ember/routing/route';\n    import { UnauthorizedError } from '@ember-data/adapter/error';\n    import { action } from '@ember/object';\n  \n    export default class ApplicationRoute extends Route {\n      @action\n      error(error, transition) {\n        if (error instanceof UnauthorizedError) {\n          // go to the login route\n          this.transitionTo('login');\n          return;\n        }\n  \n        // ...other error handling logic\n      }\n    }\n    ```\n  \n    @class UnauthorizedError\n    @public\n    @extends AdapterError\n  */\n  const UnauthorizedError = extend(AdapterError, 'The adapter operation is unauthorized');\n  _exports.UnauthorizedError = UnauthorizedError;\n  UnauthorizedError.prototype.code = 'UnauthorizedError';\n\n  /**\n    A `ForbiddenError` equates to a HTTP `403 Forbidden` response status.\n    It is used by an adapter to signal that a request to the external API was\n    valid but the server is refusing to respond to it. If authorization was\n    provided and is valid, then the authenticated user does not have the\n    necessary permissions for the request.\n  \n    @class ForbiddenError\n    @public\n    @extends AdapterError\n  */\n  const ForbiddenError = extend(AdapterError, 'The adapter operation is forbidden');\n  _exports.ForbiddenError = ForbiddenError;\n  ForbiddenError.prototype.code = 'ForbiddenError';\n\n  /**\n    A `NotFoundError` equates to a HTTP `404 Not Found` response status.\n    It is used by an adapter to signal that a request to the external API\n    was rejected because the resource could not be found on the API.\n  \n    An example use case would be to detect if the user has entered a route\n    for a specific model that does not exist. For example:\n  \n    ```app/routes/post.js\n    import Route from '@ember/routing/route';\n    import { NotFoundError } from '@ember-data/adapter/error';\n    import { inject as service } from '@ember/service';\n    import { action } from '@ember/object';\n  \n    export default class PostRoute extends Route {\n      @service store;\n      model(params) {\n        return this.store.findRecord('post', params.post_id);\n      }\n      @action\n      error(error, transition) {\n        if (error instanceof NotFoundError) {\n          // redirect to a list of all posts instead\n          this.transitionTo('posts');\n        } else {\n          // otherwise let the error bubble\n          return true;\n        }\n      }\n    }\n    ```\n  \n    @class NotFoundError\n    @public\n    @extends AdapterError\n  */\n  const NotFoundError = extend(AdapterError, 'The adapter could not find the resource');\n  _exports.NotFoundError = NotFoundError;\n  NotFoundError.prototype.code = 'NotFoundError';\n\n  /**\n    A `ConflictError` equates to a HTTP `409 Conflict` response status.\n    It is used by an adapter to indicate that the request could not be processed\n    because of a conflict in the request. An example scenario would be when\n    creating a record with a client-generated ID but that ID is already known\n    to the external API.\n  \n    @class ConflictError\n    @public\n    @extends AdapterError\n  */\n  const ConflictError = extend(AdapterError, 'The adapter operation failed due to a conflict');\n  _exports.ConflictError = ConflictError;\n  ConflictError.prototype.code = 'ConflictError';\n\n  /**\n    A `ServerError` equates to a HTTP `500 Internal Server Error` response\n    status. It is used by the adapter to indicate that a request has failed\n    because of an error in the external API.\n  \n    @class ServerError\n    @public\n    @extends AdapterError\n  */\n  const ServerError = extend(AdapterError, 'The adapter operation failed due to a server error');\n  _exports.ServerError = ServerError;\n  ServerError.prototype.code = 'ServerError';\n  function makeArray(value) {\n    return Array.isArray(value) ? value : [value];\n  }\n  const SOURCE_POINTER_REGEXP = /^\\/?data\\/(attributes|relationships)\\/(.*)/;\n  const SOURCE_POINTER_PRIMARY_REGEXP = /^\\/?data/;\n  const PRIMARY_ATTRIBUTE_KEY = 'base';\n  /**\n    Convert an hash of errors into an array with errors in JSON-API format.\n     ```javascript\n     import { errorsHashToArray } from '@ember-data/adapter/error';\n  \n     let errors = {\n      base: 'Invalid attributes on saving this record',\n      name: 'Must be present',\n      age: ['Must be present', 'Must be a number']\n    };\n     let errorsArray = errorsHashToArray(errors);\n    // [\n    //   {\n    //     title: \"Invalid Document\",\n    //     detail: \"Invalid attributes on saving this record\",\n    //     source: { pointer: \"/data\" }\n    //   },\n    //   {\n    //     title: \"Invalid Attribute\",\n    //     detail: \"Must be present\",\n    //     source: { pointer: \"/data/attributes/name\" }\n    //   },\n    //   {\n    //     title: \"Invalid Attribute\",\n    //     detail: \"Must be present\",\n    //     source: { pointer: \"/data/attributes/age\" }\n    //   },\n    //   {\n    //     title: \"Invalid Attribute\",\n    //     detail: \"Must be a number\",\n    //     source: { pointer: \"/data/attributes/age\" }\n    //   }\n    // ]\n    ```\n    @method errorsHashToArray\n    @for @ember-data/adapter/error\n    @static\n    @deprecated\n    @public\n    @param {Object} errors hash with errors as properties\n    @return {Array} array of errors in JSON-API format\n  */\n  function errorsHashToArray(errors) {\n    if ((0, _runtime.macroCondition)((0, _runtime.config)(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/adapter\").deprecations.DEPRECATE_HELPERS)) {\n      (true && !(false) && (0, _debug.deprecate)(`errorsHashToArray helper has been deprecated.`, false, {\n        id: 'ember-data:deprecate-errors-hash-to-array-helper',\n        for: 'ember-data',\n        until: '5.0',\n        since: {\n          available: '4.7',\n          enabled: '4.7'\n        }\n      }));\n      let out = [];\n      if (errors) {\n        Object.keys(errors).forEach(key => {\n          let messages = makeArray(errors[key]);\n          for (let i = 0; i < messages.length; i++) {\n            let title = 'Invalid Attribute';\n            let pointer = `/data/attributes/${key}`;\n            if (key === PRIMARY_ATTRIBUTE_KEY) {\n              title = 'Invalid Document';\n              pointer = `/data`;\n            }\n            out.push({\n              title: title,\n              detail: messages[i],\n              source: {\n                pointer: pointer\n              }\n            });\n          }\n        });\n      }\n      return out;\n    }\n    (true && !(false) && (0, _debug.assert)(`errorsHashToArray helper has been removed`));\n  }\n\n  /**\n    Convert an array of errors in JSON-API format into an object.\n  \n    ```javascript\n    import { errorsArrayToHash } from '@ember-data/adapter/error';\n  \n    let errorsArray = [\n      {\n        title: 'Invalid Attribute',\n        detail: 'Must be present',\n        source: { pointer: '/data/attributes/name' }\n      },\n      {\n        title: 'Invalid Attribute',\n        detail: 'Must be present',\n        source: { pointer: '/data/attributes/age' }\n      },\n      {\n        title: 'Invalid Attribute',\n        detail: 'Must be a number',\n        source: { pointer: '/data/attributes/age' }\n      }\n    ];\n  \n    let errors = errorsArrayToHash(errorsArray);\n    // {\n    //   \"name\": [\"Must be present\"],\n    //   \"age\":  [\"Must be present\", \"must be a number\"]\n    // }\n    ```\n  \n    @method errorsArrayToHash\n    @static\n    @for @ember-data/adapter/error\n    @deprecated\n    @public\n    @param {Array} errors array of errors in JSON-API format\n    @return {Object}\n  */\n  function errorsArrayToHash(errors) {\n    if ((0, _runtime.macroCondition)((0, _runtime.config)(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/adapter\").deprecations.DEPRECATE_HELPERS)) {\n      (true && !(false) && (0, _debug.deprecate)(`errorsArrayToHash helper has been deprecated.`, false, {\n        id: 'ember-data:deprecate-errors-array-to-hash-helper',\n        for: 'ember-data',\n        until: '5.0',\n        since: {\n          available: '4.7',\n          enabled: '4.7'\n        }\n      }));\n      let out = {};\n      if (errors) {\n        errors.forEach(error => {\n          if (error.source && error.source.pointer) {\n            let key = error.source.pointer.match(SOURCE_POINTER_REGEXP);\n            if (key) {\n              key = key[2];\n            } else if (error.source.pointer.search(SOURCE_POINTER_PRIMARY_REGEXP) !== -1) {\n              key = PRIMARY_ATTRIBUTE_KEY;\n            }\n            if (key) {\n              out[key] = out[key] || [];\n              out[key].push(error.detail || error.title);\n            }\n          }\n        });\n      }\n      return out;\n    }\n    (true && !(false) && (0, _debug.assert)(`errorsArrayToHash helper has been removed`));\n  }\n});","define(\"@ember-data/adapter/index\", [\"exports\", \"@embroider/macros/runtime\", \"@ember/object\", \"@ember/service\", \"rsvp\", \"@ember-data/adapter/-private\"], function (_exports, _runtime, _object, _service, _rsvp, _private) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"BuildURLMixin\", {\n    enumerable: true,\n    get: function () {\n      return _private.BuildURLMixin;\n    }\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  /**\n    ## Overview\n  \n    In order to properly fetch and update data, EmberData\n    needs to understand how to connect to your API.\n  \n    `Adapters` accept various kinds of requests from the store\n    and manage fulfillment of the request from your API.\n  \n    ### Request Flow\n  \n    When the store decides it needs to issue a request it uses the\n    following flow to manage the request and process the data.\n  \n    - find the appropriate adapter\n    - issue the request to the adapter\n    - await the adapter's response\n      - if an error occurs reject with the error\n      - if no error\n        - if there is response data\n          - pass the response data to the appropriate serializer\n          - update the cache using the JSON:API formatted data from the serializer's response\n        - return the primary record(s) associated with the request\n  \n    ### Request Errors\n  \n    When a request errors and your adapter does not have the ability to recover from the error,\n    you may either reject the promise returned by your adapter method with the error or simply\n    throw the error.\n  \n    If the request was for a `createRecord` `updateRecord` or `deleteRecord` special rules\n    apply to how this error will affect the state of the store and additional properties on\n    the `Error` class may be used. See the documentation for these methods in the\n    `MinimumAdapterInterface` for more information.\n  \n    ### Implementing an Adapter\n  \n    There are seven required adapter methods, one for each of\n    the primary request types that EmberData issues.\n  \n    They are:\n  \n    - findRecord\n    - findAll\n    - queryRecord\n    - query\n    - createRecord\n    - updateRecord\n    - deleteRecord\n  \n    Each of these request types has a matching store method that triggers it\n    and matching `requestType` that is passed to the serializer's\n    `normalizeResponse` method.\n  \n    If your app only reads data but never writes data, it is not necessary\n    to implement the methods for create, update, and delete. This extends to\n    all of the store's find methods with the exception of `findRecord` (`findAll`,\n    `query`, `queryRecord`): if you do not use the store method in your app then\n    your Adapter does not need the method.\n  \n    ```ts\n    import EmberObject from '@ember/object';\n  \n    async function fetchData(url, options = {}) {\n      let response = await fetch(url, options);\n      return response.toJSON();\n    }\n  \n    export default class ApplicationAdapter extends EmberObject {\n      findRecord(_, { modelName }, id) {\n        return fetchData(`./${modelName}s/${id}`);\n      }\n    }\n    ```\n  \n    ### Adapter Resolution\n  \n    `store.adapterFor(name)` will lookup adapters defined in `app/adapters/` and\n    return an instance.\n  \n    `adapterFor` first attempts to find an adapter with an exact match on `name`,\n    then falls back to checking for the presence of an adapter named `application`.\n  \n    If no adapter is found, an error will be thrown.\n  \n    ```ts\n    store.adapterFor('author');\n  \n    // lookup paths (in order) =>\n    //   app/adapters/author.js\n    //   app/adapters/application.js\n    ```\n  \n    Most requests in EmberData are made with respect to a particular `type` (or `modelName`)\n    (e.g., \"get me the full collection of **books**\" or \"get me the **employee** whose id is 37\"). We\n    refer to this as the **primary** resource `type`.\n  \n    `adapterFor` is used by the store to find an adapter with a name matching that of the primary\n    resource `type` for the request, which then falls back to the `application` adapter.\n  \n    It is recommended that applications define only a single `application` adapter and serializer\n    where possible, only implementing an adapter specific to the `type` when absolutely necessary.\n  \n    If you need to support multiple API versions for the same type, the per-type strategy for\n    defining adapters might not be adequate.\n  \n    If you have multiple APIs or multiple API versions and the single application adapter and per-type\n    strategy does not suite your needs, one strategy is to write an `application` adapter and serializer\n    that make use of `options` to specify the desired format when making a request, then forwards to the\n    request to the desired adapter or serializer as needed.\n  \n    ```app/adapters/application.js\n    export default class Adapter extends EmberObject {\n      findRecord(store, schema, id, snapshot) {\n        let { apiVersion } = snapshot.adapterOptions;\n        return this.adapterFor(`-api-${apiVersion}`).findRecord(store, schema, id, snapshot);\n      }\n    }\n    ```\n  \n    ### Using an Adapter\n  \n    Any adapter in `app/adapters/` can be looked up by `name` using `store.adapterFor(name)`.\n  \n    ### Default Adapters\n  \n    Applications whose API's structure endpoint URLs *very close to* or *exactly* the **REST**\n    or **JSON:API** convention, the `@ember-data/adapter` package contains implementations\n    these applications can extend.\n  \n    Many applications will find writing their own adapter to be allow greater flexibility,\n    customization, and maintenance than attempting to override methods in these adapters.\n  \n    @module @ember-data/adapter\n    @main @ember-data/adapter\n  */\n  0; //eaimeta@70e063a35619d71f0,\"@ember/object\",0,\"@ember/service\",0,\"@glimmer/env\",0,\"rsvp\",0,\"@ember-data/adapter/-private\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }\n  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }\n  function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }\n  /**\n    An adapter is an object that receives requests from a store and\n    translates them into the appropriate action to take against your\n    persistence layer. The persistence layer is usually an HTTP API but\n    may be anything, such as the browser's local storage. Typically the\n    adapter is not invoked directly instead its functionality is accessed\n    through the `store`.\n  \n    ### Creating an Adapter\n  \n    Create a new subclass of `Adapter` in the `app/adapters` folder:\n  \n    ```app/adapters/application.js\n    import Adapter from '@ember-data/adapter';\n  \n    export default Adapter.extend({\n      // ...your code here\n    });\n    ```\n  \n    Model-specific adapters can be created by putting your adapter\n    class in an `app/adapters/` + `model-name` + `.js` file of the application.\n  \n    ```app/adapters/post.js\n    import Adapter from '@ember-data/adapter';\n  \n    export default Adapter.extend({\n      // ...Post-specific adapter code goes here\n    });\n    ```\n  \n    `Adapter` is an abstract base class that you should override in your\n    application to customize it for your backend. The minimum set of methods\n    that you should implement is:\n  \n      * `findRecord()`\n      * `createRecord()`\n      * `updateRecord()`\n      * `deleteRecord()`\n      * `findAll()`\n      * `query()`\n  \n    To improve the network performance of your application, you can optimize\n    your adapter by overriding these lower-level methods:\n  \n      * `findMany()`\n  \n  \n    For an example of the implementation, see `RESTAdapter`, the\n    included REST adapter.\n  \n    @class Adapter\n    @public\n    @extends Ember.EmberObject\n  */\n  let Adapter = (_class = class Adapter extends _object.default {\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty(this, \"store\", _descriptor, this);\n    }\n    /**\n      The `findRecord()` method is invoked when the store is asked for a record that\n      has not previously been loaded. In response to `findRecord()` being called, you\n      should query your persistence layer for a record with the given ID. The `findRecord`\n      method should return a promise that will resolve to a JavaScript object that will be\n      normalized by the serializer.\n       Here is an example of the `findRecord` implementation:\n       ```app/adapters/application.js\n      import Adapter from '@ember-data/adapter';\n      import RSVP from 'RSVP';\n      import $ from 'jquery';\n       export default class ApplicationAdapter extends Adapter {\n        findRecord(store, type, id, snapshot) {\n          return new RSVP.Promise(function(resolve, reject) {\n            $.getJSON(`/${type.modelName}/${id}`).then(function(data) {\n              resolve(data);\n            }, function(jqXHR) {\n              reject(jqXHR);\n            });\n          });\n        }\n      }\n      ```\n       @method findRecord\n      @param {Store} store\n      @param {Model} type\n      @param {String} id\n      @param {Snapshot} snapshot\n      @return {Promise} promise\n      @public\n    */\n    findRecord(store, type, id, snapshot) {\n      if ((0, _runtime.macroCondition)(true)) {\n        throw new Error('You subclassed the Adapter class but missing a findRecord override');\n      }\n      return _rsvp.Promise.resolve();\n    }\n\n    /**\n      The `findAll()` method is used to retrieve all records for a given type.\n       Example\n       ```app/adapters/application.js\n      import Adapter from '@ember-data/adapter';\n      import RSVP from 'RSVP';\n      import $ from 'jquery';\n       export default class ApplicationAdapter extends Adapter {\n        findAll(store, type) {\n          return new RSVP.Promise(function(resolve, reject) {\n            $.getJSON(`/${type.modelName}`).then(function(data) {\n              resolve(data);\n            }, function(jqXHR) {\n              reject(jqXHR);\n            });\n          });\n        }\n      }\n      ```\n       @method findAll\n      @param {Store} store\n      @param {Model} type\n      @param {undefined} neverSet a value is never provided to this argument\n      @param {SnapshotRecordArray} snapshotRecordArray\n      @return {Promise} promise\n      @public\n    */\n    findAll(store, type, neverSet, snapshotRecordArray) {\n      if ((0, _runtime.macroCondition)(true)) {\n        throw new Error('You subclassed the Adapter class but missing a findAll override');\n      }\n      return _rsvp.Promise.resolve();\n    }\n\n    /**\n      This method is called when you call `query` on the store.\n       Example\n       ```app/adapters/application.js\n      import Adapter from '@ember-data/adapter';\n      import RSVP from 'RSVP';\n      import $ from 'jquery';\n       export default class ApplicationAdapter extends Adapter {\n        query(store, type, query) {\n          return new RSVP.Promise(function(resolve, reject) {\n            $.getJSON(`/${type.modelName}`, query).then(function(data) {\n              resolve(data);\n            }, function(jqXHR) {\n              reject(jqXHR);\n            });\n          });\n        }\n      }\n      ```\n       @method query\n      @param {Store} store\n      @param {Model} type\n      @param {Object} query\n      @param {Collection} recordArray\n      @param {Object} adapterOptions\n      @return {Promise} promise\n      @public\n    */\n    query(store, type, query) {\n      if ((0, _runtime.macroCondition)(true)) {\n        throw new Error('You subclassed the Adapter class but missing a query override');\n      }\n      return _rsvp.Promise.resolve();\n    }\n\n    /**\n      The `queryRecord()` method is invoked when the store is asked for a single\n      record through a query object.\n       In response to `queryRecord()` being called, you should always fetch fresh\n      data. Once found, you can asynchronously call the store's `push()` method\n      to push the record into the store.\n       Here is an example `queryRecord` implementation:\n       Example\n       ```app/adapters/application.js\n      import Adapter, { BuildURLMixin } from '@ember-data/adapter';\n      import RSVP from 'RSVP';\n      import $ from 'jquery';\n       export default class ApplicationAdapter extends Adapter.extend(BuildURLMixin) {\n        queryRecord(store, type, query) {\n          return new RSVP.Promise(function(resolve, reject) {\n            $.getJSON(`/${type.modelName}`, query).then(function(data) {\n              resolve(data);\n            }, function(jqXHR) {\n              reject(jqXHR);\n            });\n          });\n        }\n      }\n      ```\n       @method queryRecord\n      @param {Store} store\n      @param {subclass of Model} type\n      @param {Object} query\n      @param {Object} adapterOptions\n      @return {Promise} promise\n      @public\n    */\n    queryRecord(store, type, query, adapterOptions) {\n      if ((0, _runtime.macroCondition)(true)) {\n        throw new Error('You subclassed the Adapter class but missing a queryRecord override');\n      }\n      return _rsvp.Promise.resolve();\n    }\n\n    /**\n      If the globally unique IDs for your records should be generated on the client,\n      implement the `generateIdForRecord()` method. This method will be invoked\n      each time you create a new record, and the value returned from it will be\n      assigned to the record's `primaryKey`.\n       Most traditional REST-like HTTP APIs will not use this method. Instead, the ID\n      of the record will be set by the server, and your adapter will update the store\n      with the new ID when it calls `didCreateRecord()`. Only implement this method if\n      you intend to generate record IDs on the client-side.\n       The `generateIdForRecord()` method will be invoked with the requesting store as\n      the first parameter and the newly created record as the second parameter:\n       ```javascript\n      import Adapter from '@ember-data/adapter';\n      import { v4 } from 'uuid';\n       export default class ApplicationAdapter extends Adapter {\n        generateIdForRecord(store, type, inputProperties) {\n          return v4();\n        }\n      }\n      ```\n       @method generateIdForRecord\n      @param {Store} store\n      @param {Model} type   the Model class of the record\n      @param {Object} inputProperties a hash of properties to set on the\n        newly created record.\n      @return {(String|Number)} id\n      @public\n    */\n\n    /**\n      Proxies to the serializer's `serialize` method.\n       Example\n       ```app/adapters/application.js\n      import Adapter from '@ember-data/adapter';\n       export default class ApplicationAdapter extends Adapter {\n        createRecord(store, type, snapshot) {\n          let data = this.serialize(snapshot, { includeId: true });\n          let url = `/${type.modelName}`;\n           // ...\n        }\n      }\n      ```\n       @method serialize\n      @param {Snapshot} snapshot\n      @param {Object}   options\n      @return {Object} serialized snapshot\n      @public\n    */\n    serialize(snapshot, options) {\n      return snapshot.serialize(options);\n    }\n\n    /**\n      Implement this method in a subclass to handle the creation of\n      new records.\n       Serializes the record and sends it to the server.\n       Example\n       ```app/adapters/application.js\n      import Adapter from '@ember-data/adapter';\n      import RSVP from 'RSVP';\n      import $ from 'jquery';\n       export default class ApplicationAdapter extends Adapter {\n        createRecord(store, type, snapshot) {\n          let data = this.serialize(snapshot, { includeId: true });\n           return new RSVP.Promise(function (resolve, reject) {\n            $.ajax({\n              type: 'POST',\n              url: `/${type.modelName}`,\n              dataType: 'json',\n              data: data\n            }).then(function (data) {\n              resolve(data);\n            }, function (jqXHR) {\n              jqXHR.then = null; // tame jQuery's ill mannered promises\n              reject(jqXHR);\n            });\n          });\n        }\n      }\n      ```\n       @method createRecord\n      @param {Store} store\n      @param {Model} type   the Model class of the record\n      @param {Snapshot} snapshot\n      @return {Promise} promise\n      @public\n    */\n    createRecord(store, type, snapshot) {\n      if ((0, _runtime.macroCondition)(true)) {\n        throw new Error('You subclassed the Adapter class but missing a createRecord override');\n      }\n      return _rsvp.Promise.resolve();\n    }\n\n    /**\n      Implement this method in a subclass to handle the updating of\n      a record.\n       Serializes the record update and sends it to the server.\n       The updateRecord method is expected to return a promise that will\n      resolve with the serialized record. This allows the backend to\n      inform the Ember Data store the current state of this record after\n      the update. If it is not possible to return a serialized record\n      the updateRecord promise can also resolve with `undefined` and the\n      Ember Data store will assume all of the updates were successfully\n      applied on the backend.\n       Example\n       ```app/adapters/application.js\n      import Adapter from '@ember-data/adapter';\n      import RSVP from 'RSVP';\n      import $ from 'jquery';\n       export default class ApplicationAdapter extends Adapter {\n        updateRecord(store, type, snapshot) {\n          let data = this.serialize(snapshot, { includeId: true });\n          let id = snapshot.id;\n           return new RSVP.Promise(function(resolve, reject) {\n            $.ajax({\n              type: 'PUT',\n              url: `/${type.modelName}/${id}`,\n              dataType: 'json',\n              data: data\n            }).then(function(data) {\n              resolve(data);\n            }, function(jqXHR) {\n              jqXHR.then = null; // tame jQuery's ill mannered promises\n              reject(jqXHR);\n            });\n          });\n        }\n      }\n      ```\n       @method updateRecord\n      @param {Store} store\n      @param {Model} type   the Model class of the record\n      @param {Snapshot} snapshot\n      @return {Promise} promise\n      @public\n    */\n    updateRecord(store, type, snapshot) {\n      if ((0, _runtime.macroCondition)(true)) {\n        throw new Error('You subclassed the Adapter class but missing a updateRecord override');\n      }\n      return _rsvp.Promise.resolve();\n    }\n\n    /**\n      Implement this method in a subclass to handle the deletion of\n      a record.\n       Sends a delete request for the record to the server.\n       Example\n       ```app/adapters/application.js\n      import Adapter from '@ember-data/adapter';\n      import RSVP from 'RSVP';\n      import $ from 'jquery';\n       export default class ApplicationAdapter extends Adapter {\n        deleteRecord(store, type, snapshot) {\n          let data = this.serialize(snapshot, { includeId: true });\n          let id = snapshot.id;\n           return new RSVP.Promise(function(resolve, reject) {\n            $.ajax({\n              type: 'DELETE',\n              url: `/${type.modelName}/${id}`,\n              dataType: 'json',\n              data: data\n            }).then(function(data) {\n              resolve(data)\n            }, function(jqXHR) {\n              jqXHR.then = null; // tame jQuery's ill mannered promises\n              reject(jqXHR);\n            });\n          });\n        }\n      }\n      ```\n       @method deleteRecord\n      @param {Store} store\n      @param {Model} type   the Model class of the record\n      @param {Snapshot} snapshot\n      @return {Promise} promise\n      @public\n    */\n    deleteRecord(store, type, snapshot) {\n      if ((0, _runtime.macroCondition)(true)) {\n        throw new Error('You subclassed the Adapter class but missing a deleteRecord override');\n      }\n      return _rsvp.Promise.resolve();\n    }\n\n    /**\n      By default the store will try to coalesce all `findRecord` calls within the same runloop\n      into as few requests as possible by calling groupRecordsForFindMany and passing it into a findMany call.\n      You can opt out of this behaviour by either not implementing the findMany hook or by setting\n      coalesceFindRequests to false.\n       @property coalesceFindRequests\n      @public\n      @type {boolean}\n    */\n    get coalesceFindRequests() {\n      let coalesceFindRequests = this._coalesceFindRequests;\n      if (typeof coalesceFindRequests === 'boolean') {\n        return coalesceFindRequests;\n      }\n      return this._coalesceFindRequests = true;\n    }\n    set coalesceFindRequests(value) {\n      this._coalesceFindRequests = value;\n    }\n\n    /**\n      The store will call `findMany` instead of multiple `findRecord`\n      requests to find multiple records at once if coalesceFindRequests\n      is true.\n       ```app/adapters/application.js\n      import Adapter from '@ember-data/adapter';\n      import RSVP from 'RSVP';\n      import $ from 'jquery';\n       export default class ApplicationAdapter extends Adapter {\n        findMany(store, type, ids, snapshots) {\n          return new RSVP.Promise(function(resolve, reject) {\n            $.ajax({\n              type: 'GET',\n              url: `/${type.modelName}/`,\n              dataType: 'json',\n              data: { filter: { id: ids.join(',') } }\n            }).then(function(data) {\n              resolve(data);\n            }, function(jqXHR) {\n              jqXHR.then = null; // tame jQuery's ill mannered promises\n              reject(jqXHR);\n            });\n          });\n        }\n      }\n      ```\n       @method findMany\n      @param {Store} store\n      @param {Model} type   the Model class of the records\n      @param {Array}    ids\n      @param {Array} snapshots\n      @return {Promise} promise\n      @public\n    */\n\n    /**\n      Organize records into groups, each of which is to be passed to separate\n      calls to `findMany`.\n       For example, if your API has nested URLs that depend on the parent, you will\n      want to group records by their parent.\n       The default implementation returns the records as a single group.\n       @method groupRecordsForFindMany\n      @public\n      @param {Store} store\n      @param {Array} snapshots\n      @return {Array}  an array of arrays of records, each of which is to be\n                        loaded separately by `findMany`.\n    */\n    groupRecordsForFindMany(store, snapshots) {\n      return [snapshots];\n    }\n\n    /**\n      This method is used by the store to determine if the store should\n      reload a record from the adapter when a record is requested by\n      `store.findRecord`.\n       If this method returns `true`, the store will re-fetch a record from\n      the adapter. If this method returns `false`, the store will resolve\n      immediately using the cached record.\n       For example, if you are building an events ticketing system, in which users\n      can only reserve tickets for 20 minutes at a time, and want to ensure that\n      in each route you have data that is no more than 20 minutes old you could\n      write:\n       ```javascript\n      shouldReloadRecord(store, ticketSnapshot) {\n        let lastAccessedAt = ticketSnapshot.attr('lastAccessedAt');\n        let timeDiff = moment().diff(lastAccessedAt, 'minutes');\n         if (timeDiff > 20) {\n          return true;\n        } else {\n          return false;\n        }\n      }\n      ```\n       This method would ensure that whenever you do `store.findRecord('ticket',\n      id)` you will always get a ticket that is no more than 20 minutes old. In\n      case the cached version is more than 20 minutes old, `findRecord` will not\n      resolve until you fetched the latest version.\n       By default this hook returns `false`, as most UIs should not block user\n      interactions while waiting on data update.\n       Note that, with default settings, `shouldBackgroundReloadRecord` will always\n      re-fetch the records in the background even if `shouldReloadRecord` returns\n      `false`. You can override `shouldBackgroundReloadRecord` if this does not\n      suit your use case.\n       @since 1.13.0\n      @method shouldReloadRecord\n      @param {Store} store\n      @param {Snapshot} snapshot\n      @return {Boolean}\n      @public\n    */\n    shouldReloadRecord(store, snapshot) {\n      return false;\n    }\n\n    /**\n      This method is used by the store to determine if the store should\n      reload all records from the adapter when records are requested by\n      `store.findAll`.\n       If this method returns `true`, the store will re-fetch all records from\n      the adapter. If this method returns `false`, the store will resolve\n      immediately using the cached records.\n       For example, if you are building an events ticketing system, in which users\n      can only reserve tickets for 20 minutes at a time, and want to ensure that\n      in each route you have data that is no more than 20 minutes old you could\n      write:\n       ```javascript\n      shouldReloadAll(store, snapshotArray) {\n        let snapshots = snapshotArray.snapshots();\n         return snapshots.any((ticketSnapshot) => {\n          let lastAccessedAt = ticketSnapshot.attr('lastAccessedAt');\n          let timeDiff = moment().diff(lastAccessedAt, 'minutes');\n           if (timeDiff > 20) {\n            return true;\n          } else {\n            return false;\n          }\n        });\n      }\n      ```\n       This method would ensure that whenever you do `store.findAll('ticket')` you\n      will always get a list of tickets that are no more than 20 minutes old. In\n      case a cached version is more than 20 minutes old, `findAll` will not\n      resolve until you fetched the latest versions.\n       By default, this method returns `true` if the passed `snapshotRecordArray`\n      is empty (meaning that there are no records locally available yet),\n      otherwise, it returns `false`.\n       Note that, with default settings, `shouldBackgroundReloadAll` will always\n      re-fetch all the records in the background even if `shouldReloadAll` returns\n      `false`. You can override `shouldBackgroundReloadAll` if this does not suit\n      your use case.\n       @since 1.13.0\n      @method shouldReloadAll\n      @param {Store} store\n      @param {SnapshotRecordArray} snapshotRecordArray\n      @return {Boolean}\n      @public\n    */\n    shouldReloadAll(store, snapshotRecordArray) {\n      return !snapshotRecordArray.length;\n    }\n\n    /**\n      This method is used by the store to determine if the store should\n      reload a record after the `store.findRecord` method resolves a\n      cached record.\n       This method is *only* checked by the store when the store is\n      returning a cached record.\n       If this method returns `true` the store will re-fetch a record from\n      the adapter.\n       For example, if you do not want to fetch complex data over a mobile\n      connection, or if the network is down, you can implement\n      `shouldBackgroundReloadRecord` as follows:\n       ```javascript\n      shouldBackgroundReloadRecord(store, snapshot) {\n        let { downlink, effectiveType } = navigator.connection;\n         return downlink > 0 && effectiveType === '4g';\n      }\n      ```\n       By default, this hook returns `true` so the data for the record is updated\n      in the background.\n       @since 1.13.0\n      @method shouldBackgroundReloadRecord\n      @param {Store} store\n      @param {Snapshot} snapshot\n      @return {Boolean}\n      @public\n    */\n    shouldBackgroundReloadRecord(store, Snapshot) {\n      return true;\n    }\n\n    /**\n      This method is used by the store to determine if the store should\n      reload a record array after the `store.findAll` method resolves\n      with a cached record array.\n       This method is *only* checked by the store when the store is\n      returning a cached record array.\n       If this method returns `true` the store will re-fetch all records\n      from the adapter.\n       For example, if you do not want to fetch complex data over a mobile\n      connection, or if the network is down, you can implement\n      `shouldBackgroundReloadAll` as follows:\n       ```javascript\n      shouldBackgroundReloadAll(store, snapshotArray) {\n        let { downlink, effectiveType } = navigator.connection;\n         return downlink > 0 && effectiveType === '4g';\n      }\n      ```\n       By default this method returns `true`, indicating that a background reload\n      should always be triggered.\n       @since 1.13.0\n      @method shouldBackgroundReloadAll\n      @param {Store} store\n      @param {SnapshotRecordArray} snapshotRecordArray\n      @return {Boolean}\n      @public\n    */\n    shouldBackgroundReloadAll(store, snapshotRecordArray) {\n      return true;\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"store\", [_service.inject], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n  _exports.default = Adapter;\n});","define(\"@ember-data/adapter/json-api\", [\"exports\", \"@ember/debug\", \"@ember/string\", \"ember-inflector\", \"@ember-data/adapter/-private\", \"@ember-data/adapter/rest\"], function (_exports, _debug, _string, _emberInflector, _private, _rest) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/debug\",0,\"@ember/string\",0,\"ember-inflector\",0,\"@ember-data/adapter/-private\",0,\"@ember-data/adapter/rest\"eaimeta@70e063a35619d71f\n  /**\n    @module @ember-data/adapter/json-api\n   */\n  /**\n    The `JSONAPIAdapter` is the default adapter used by Ember Data. It\n    is responsible for transforming the store's requests into HTTP\n    requests that follow the [JSON API](http://jsonapi.org/format/)\n    format.\n  \n    ## JSON API Conventions\n  \n    The JSONAPIAdapter uses JSON API conventions for building the URL\n    for a record and selecting the HTTP verb to use with a request. The\n    actions you can take on a record map onto the following URLs in the\n    JSON API adapter:\n  \n  <table>\n    <tr>\n      <th>\n        Action\n      </th>\n      <th>\n        HTTP Verb\n      </th>\n      <th>\n        URL\n      </th>\n    </tr>\n    <tr>\n      <th>\n        `store.findRecord('post', 123)`\n      </th>\n      <td>\n        GET\n      </td>\n      <td>\n        /posts/123\n      </td>\n    </tr>\n    <tr>\n      <th>\n        `store.findAll('post')`\n      </th>\n      <td>\n        GET\n      </td>\n      <td>\n        /posts\n      </td>\n    </tr>\n    <tr>\n      <th>\n        Update `postRecord.save()`\n      </th>\n      <td>\n        PATCH\n      </td>\n      <td>\n        /posts/123\n      </td>\n    </tr>\n    <tr>\n      <th>\n        Create `store.createRecord('post').save()`\n      </th>\n      <td>\n        POST\n      </td>\n      <td>\n        /posts\n      </td>\n    </tr>\n    <tr>\n      <th>\n        Delete `postRecord.destroyRecord()`\n      </th>\n      <td>\n        DELETE\n      </td>\n      <td>\n        /posts/123\n      </td>\n    </tr>\n  </table>\n  \n    ## Success and failure\n  \n    The JSONAPIAdapter will consider a success any response with a\n    status code of the 2xx family (\"Success\"), as well as 304 (\"Not\n    Modified\"). Any other status code will be considered a failure.\n  \n    On success, the request promise will be resolved with the full\n    response payload.\n  \n    Failed responses with status code 422 (\"Unprocessable Entity\") will\n    be considered \"invalid\". The response will be discarded, except for\n    the `errors` key. The request promise will be rejected with a\n    `InvalidError`. This error object will encapsulate the saved\n    `errors` value.\n  \n    Any other status codes will be treated as an adapter error. The\n    request promise will be rejected, similarly to the invalid case,\n    but with an instance of `AdapterError` instead.\n  \n    ### Endpoint path customization\n  \n    Endpoint paths can be prefixed with a `namespace` by setting the\n    namespace property on the adapter:\n  \n    ```app/adapters/application.js\n    import JSONAPIAdapter from '@ember-data/adapter/json-api';\n  \n    export default class ApplicationAdapter extends JSONAPIAdapter {\n      namespace = 'api/1';\n    }\n    ```\n    Requests for the `person` model would now target `/api/1/people/1`.\n  \n    ### Host customization\n  \n    An adapter can target other hosts by setting the `host` property.\n  \n    ```app/adapters/application.js\n    import JSONAPIAdapter from '@ember-data/adapter/json-api';\n  \n    export default class ApplicationAdapter extends JSONAPIAdapter {\n      host = 'https://api.example.com';\n    }\n    ```\n  \n    Requests for the `person` model would now target\n    `https://api.example.com/people/1`.\n  \n    @since 1.13.0\n    @class JSONAPIAdapter\n    @main @ember-data/adapter/json-api\n    @public\n    @constructor\n    @extends RESTAdapter\n  */\n  class JSONAPIAdapter extends _rest.default {\n    constructor() {\n      super(...arguments);\n      this._defaultContentType = 'application/vnd.api+json';\n    }\n    /**\n      @method ajaxOptions\n      @private\n      @param {String} url\n      @param {String} type The request type GET, POST, PUT, DELETE etc.\n      @param {Object} options\n      @return {Object}\n    */\n    ajaxOptions(url, type, options) {\n      if (options === void 0) {\n        options = {};\n      }\n      let hash = super.ajaxOptions(url, type, options);\n      hash.headers['Accept'] = hash.headers['Accept'] || 'application/vnd.api+json';\n      return hash;\n    }\n\n    /**\n      By default the JSONAPIAdapter will send each find request coming from a `store.find`\n      or from accessing a relationship separately to the server. If your server supports passing\n      ids as a query string, you can set coalesceFindRequests to true to coalesce all find requests\n      within a single runloop.\n       For example, if you have an initial payload of:\n       ```javascript\n      {\n        data: {\n          id: 1,\n          type: 'post',\n          relationship: {\n            comments: {\n              data: [\n                { id: 1, type: 'comment' },\n                { id: 2, type: 'comment' }\n              ]\n            }\n          }\n        }\n      }\n      ```\n       By default calling `post.comments` will trigger the following requests(assuming the\n      comments haven't been loaded before):\n       ```\n      GET /comments/1\n      GET /comments/2\n      ```\n       If you set coalesceFindRequests to `true` it will instead trigger the following request:\n       ```\n      GET /comments?filter[id]=1,2\n      ```\n       Setting coalesceFindRequests to `true` also works for `store.find` requests and `belongsTo`\n      relationships accessed within the same runloop. If you set `coalesceFindRequests: true`\n       ```javascript\n      store.findRecord('comment', 1);\n      store.findRecord('comment', 2);\n      ```\n       will also send a request to: `GET /comments?filter[id]=1,2`\n       Note: Requests coalescing rely on URL building strategy. So if you override `buildURL` in your app\n      `groupRecordsForFindMany` more likely should be overridden as well in order for coalescing to work.\n       @property coalesceFindRequests\n      @public\n      @type {boolean}\n    */\n    get coalesceFindRequests() {\n      let coalesceFindRequests = this._coalesceFindRequests;\n      if (typeof coalesceFindRequests === 'boolean') {\n        return coalesceFindRequests;\n      }\n      return this._coalesceFindRequests = false;\n    }\n    set coalesceFindRequests(value) {\n      this._coalesceFindRequests = value;\n    }\n    findMany(store, type, ids, snapshots) {\n      let url = this.buildURL(type.modelName, ids, snapshots, 'findMany');\n      return this.ajax(url, 'GET', {\n        data: {\n          filter: {\n            id: ids.join(',')\n          }\n        }\n      });\n    }\n    pathForType(modelName) {\n      let dasherized = (0, _string.dasherize)(modelName);\n      return (0, _emberInflector.pluralize)(dasherized);\n    }\n    updateRecord(store, schema, snapshot) {\n      const data = (0, _private.serializeIntoHash)(store, schema, snapshot);\n      const type = snapshot.modelName;\n      const id = snapshot.id;\n      (true && !(typeof id === 'string' && id.length > 0) && (0, _debug.assert)(`Attempted to update the ${type} record, but the record has no id`, typeof id === 'string' && id.length > 0));\n      let url = this.buildURL(type, id, snapshot, 'updateRecord');\n      return this.ajax(url, 'PATCH', {\n        data: data\n      });\n    }\n  }\n  var _default = JSONAPIAdapter;\n  _exports.default = _default;\n});","define(\"@ember-data/adapter/rest\", [\"exports\", \"@embroider/macros/runtime\", \"@ember/application\", \"@ember/debug\", \"@ember/object\", \"@ember/runloop\", \"rsvp\", \"@ember-data/adapter/-private\", \"@ember-data/adapter/error\", \"@ember-data/adapter/index\"], function (_exports, _runtime, _application, _debug, _object, _runloop, _rsvp, _private, _error, _index) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.fetchOptions = fetchOptions;\n  var _dec, _class;\n  /**\n    @module @ember-data/adapter/rest\n  */\n  0; //eaimeta@70e063a35619d71f0,\"@ember/application\",0,\"@ember/debug\",0,\"@ember/object\",0,\"@ember/runloop\",0,\"@glimmer/env\",0,\"rsvp\",0,\"@ember-data/adapter/-private\",0,\"@ember-data/adapter/error\",0,\"@ember-data/adapter/index\"eaimeta@70e063a35619d71f\n  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }\n  /**\n    The REST adapter allows your store to communicate with an HTTP server by\n    transmitting JSON via XHR. Most Ember.js apps that consume a JSON API\n    should use the REST adapter.\n  \n    This adapter is designed around the idea that the JSON exchanged with\n    the server should be conventional.\n  \n    ## Success and failure\n  \n    The REST adapter will consider a success any response with a status code\n    of the 2xx family (\"Success\"), as well as 304 (\"Not Modified\"). Any other\n    status code will be considered a failure.\n  \n    On success, the request promise will be resolved with the full response\n    payload.\n  \n    Failed responses with status code 422 (\"Unprocessable Entity\") will be\n    considered \"invalid\". The response will be discarded, except for the\n    `errors` key. The request promise will be rejected with a `InvalidError`.\n    This error object will encapsulate the saved `errors` value.\n  \n    Any other status codes will be treated as an \"adapter error\". The request\n    promise will be rejected, similarly to the \"invalid\" case, but with\n    an instance of `AdapterError` instead.\n  \n    ## JSON Structure\n  \n    The REST adapter expects the JSON returned from your server to follow\n    these conventions.\n  \n    ### Object Root\n  \n    The JSON payload should be an object that contains the record inside a\n    root property. For example, in response to a `GET` request for\n    `/posts/1`, the JSON should look like this:\n  \n    ```js\n    {\n      \"posts\": {\n        \"id\": 1,\n        \"title\": \"I'm Running to Reform the W3C's Tag\",\n        \"author\": \"Yehuda Katz\"\n      }\n    }\n    ```\n  \n    Similarly, in response to a `GET` request for `/posts`, the JSON should\n    look like this:\n  \n    ```js\n    {\n      \"posts\": [\n        {\n          \"id\": 1,\n          \"title\": \"I'm Running to Reform the W3C's Tag\",\n          \"author\": \"Yehuda Katz\"\n        },\n        {\n          \"id\": 2,\n          \"title\": \"Rails is omakase\",\n          \"author\": \"D2H\"\n        }\n      ]\n    }\n    ```\n  \n    Note that the object root can be pluralized for both a single-object response\n    and an array response: the REST adapter is not strict on this. Further, if the\n    HTTP server responds to a `GET` request to `/posts/1` (e.g. the response to a\n    `findRecord` query) with more than one object in the array, Ember Data will\n    only display the object with the matching ID.\n  \n    ### Conventional Names\n  \n    Attribute names in your JSON payload should be the camelCased versions of\n    the attributes in your Ember.js models.\n  \n    For example, if you have a `Person` model:\n  \n    ```app/models/person.js\n    import Model, { attr } from '@ember-data/model';\n  \n    export default Model.extend({\n      firstName: attr('string'),\n      lastName: attr('string'),\n      occupation: attr('string')\n    });\n    ```\n  \n    The JSON returned should look like this:\n  \n    ```js\n    {\n      \"people\": {\n        \"id\": 5,\n        \"firstName\": \"Zaphod\",\n        \"lastName\": \"Beeblebrox\",\n        \"occupation\": \"President\"\n      }\n    }\n    ```\n  \n    #### Relationships\n  \n    Relationships are usually represented by ids to the record in the\n    relationship. The related records can then be sideloaded in the\n    response under a key for the type.\n  \n    ```js\n    {\n      \"posts\": {\n        \"id\": 5,\n        \"title\": \"I'm Running to Reform the W3C's Tag\",\n        \"author\": \"Yehuda Katz\",\n        \"comments\": [1, 2]\n      },\n      \"comments\": [{\n        \"id\": 1,\n        \"author\": \"User 1\",\n        \"message\": \"First!\",\n      }, {\n        \"id\": 2,\n        \"author\": \"User 2\",\n        \"message\": \"Good Luck!\",\n      }]\n    }\n    ```\n  \n    If the records in the relationship are not known when the response\n    is serialized it's also possible to represent the relationship as a\n    URL using the `links` key in the response. Ember Data will fetch\n    this URL to resolve the relationship when it is accessed for the\n    first time.\n  \n    ```js\n    {\n      \"posts\": {\n        \"id\": 5,\n        \"title\": \"I'm Running to Reform the W3C's Tag\",\n        \"author\": \"Yehuda Katz\",\n        \"links\": {\n          \"comments\": \"/posts/5/comments\"\n        }\n      }\n    }\n    ```\n  \n    ### Errors\n  \n    If a response is considered a failure, the JSON payload is expected to include\n    a top-level key `errors`, detailing any specific issues. For example:\n  \n    ```js\n    {\n      \"errors\": {\n        \"msg\": \"Something went wrong\"\n      }\n    }\n    ```\n  \n    This adapter does not make any assumptions as to the format of the `errors`\n    object. It will simply be passed along as is, wrapped in an instance\n    of `InvalidError` or `AdapterError`. The serializer can interpret it\n    afterwards.\n  \n    ## Customization\n  \n    ### Endpoint path customization\n  \n    Endpoint paths can be prefixed with a `namespace` by setting the namespace\n    property on the adapter:\n  \n    ```app/adapters/application.js\n    import RESTAdapter from '@ember-data/adapter/rest';\n  \n    export default class ApplicationAdapter extends RESTAdapter {\n      namespace = 'api/1';\n    }\n    ```\n    Requests for the `Person` model would now target `/api/1/people/1`.\n  \n    ### Host customization\n  \n    An adapter can target other hosts by setting the `host` property.\n  \n    ```app/adapters/application.js\n    import RESTAdapter from '@ember-data/adapter/rest';\n  \n    export default class ApplicationAdapter extends RESTAdapter {\n      host = 'https://api.example.com';\n    }\n    ```\n  \n    ### Headers customization\n  \n    Some APIs require HTTP headers, e.g. to provide an API key. Arbitrary\n    headers can be set as key/value pairs on the `RESTAdapter`'s `headers`\n    object and Ember Data will send them along with each ajax request.\n  \n  \n    ```app/adapters/application.js\n    import RESTAdapter from '@ember-data/adapter/rest';\n    import { computed } from '@ember/object';\n  \n    export default class ApplicationAdapter extends RESTAdapter {\n      headers: computed(function() {\n        return {\n          'API_KEY': 'secret key',\n          'ANOTHER_HEADER': 'Some header value'\n        };\n      }\n    }\n    ```\n  \n    `headers` can also be used as a computed property to support dynamic\n    headers. In the example below, the `session` object has been\n    injected into an adapter by Ember's container.\n  \n    ```app/adapters/application.js\n    import RESTAdapter from '@ember-data/adapter/rest';\n    import { computed } from '@ember/object';\n  \n    export default class ApplicationAdapter extends RESTAdapter {\n      headers: computed('session.authToken', function() {\n        return {\n          'API_KEY': this.session.authToken,\n          'ANOTHER_HEADER': 'Some header value'\n        };\n      })\n    }\n    ```\n  \n    In some cases, your dynamic headers may require data from some\n    object outside of Ember's observer system (for example\n    `document.cookie`). You can use the\n    [volatile](/api/classes/Ember.ComputedProperty.html?anchor=volatile)\n    function to set the property into a non-cached mode causing the headers to\n    be recomputed with every request.\n  \n    ```app/adapters/application.js\n    import RESTAdapter from '@ember-data/adapter/rest';\n    import { computed } from '@ember/object';\n  \n    export default class ApplicationAdapter extends RESTAdapter {\n      headers: computed(function() {\n        return {\n          'API_KEY': document.cookie.match(/apiKey\\=([^;]*)/)['1'],\n          'ANOTHER_HEADER': 'Some header value'\n        };\n      }).volatile()\n    }\n    ```\n  \n    @class RESTAdapter\n    @main @ember-data/adapter/rest\n    @public\n    @constructor\n    @extends Adapter\n    @uses BuildURLMixin\n  */\n  let RESTAdapter = (_dec = (0, _object.computed)(), _class = class RESTAdapter extends _index.default.extend(_index.BuildURLMixin) {\n    constructor() {\n      super(...arguments);\n      /**\n        This property allows ajax to still be used instead when `false`.\n         @property useFetch\n        @type {Boolean}\n        @default true\n        @public\n      */\n      this.useFetch = true;\n      this._defaultContentType = 'application/json; charset=utf-8';\n      // http://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers\n      this.maxURLLength = 2048;\n    }\n    get fastboot() {\n      // Avoid computed property override deprecation in fastboot as suggested by:\n      // https://deprecations.emberjs.com/v3.x/#toc_computed-property-override\n      let fastboot = this._fastboot;\n      if (fastboot) {\n        return fastboot;\n      }\n      return this._fastboot = (0, _application.getOwner)(this).lookup('service:fastboot');\n    }\n    set fastboot(value) {\n      this._fastboot = value;\n    }\n\n    /**\n      By default, the RESTAdapter will send the query params sorted alphabetically to the\n      server.\n       For example:\n       ```js\n      store.query('posts', { sort: 'price', category: 'pets' });\n      ```\n       will generate a requests like this `/posts?category=pets&sort=price`, even if the\n      parameters were specified in a different order.\n       That way the generated URL will be deterministic and that simplifies caching mechanisms\n      in the backend.\n       Setting `sortQueryParams` to a falsey value will respect the original order.\n       In case you want to sort the query parameters with a different criteria, set\n      `sortQueryParams` to your custom sort function.\n       ```app/adapters/application.js\n      import RESTAdapter from '@ember-data/adapter/rest';\n       export default class ApplicationAdapter extends RESTAdapter {\n        sortQueryParams(params) {\n          let sortedKeys = Object.keys(params).sort().reverse();\n          let len = sortedKeys.length, newParams = {};\n           for (let i = 0; i < len; i++) {\n            newParams[sortedKeys[i]] = params[sortedKeys[i]];\n          }\n           return newParams;\n        }\n      }\n      ```\n       @method sortQueryParams\n      @param {Object} obj\n      @return {Object}\n      @public\n    */\n    sortQueryParams(obj) {\n      let keys = Object.keys(obj);\n      let len = keys.length;\n      if (len < 2) {\n        return obj;\n      }\n      let newQueryParams = {};\n      let sortedKeys = keys.sort();\n      for (let i = 0; i < len; i++) {\n        newQueryParams[sortedKeys[i]] = obj[sortedKeys[i]];\n      }\n      return newQueryParams;\n    }\n\n    /**\n      By default the RESTAdapter will send each find request coming from a `store.find`\n      or from accessing a relationship separately to the server. If your server supports passing\n      ids as a query string, you can set coalesceFindRequests to true to coalesce all find requests\n      within a single runloop.\n       For example, if you have an initial payload of:\n       ```javascript\n      {\n        post: {\n          id: 1,\n          comments: [1, 2]\n        }\n      }\n      ```\n       By default calling `post.comments` will trigger the following requests(assuming the\n      comments haven't been loaded before):\n       ```\n      GET /comments/1\n      GET /comments/2\n      ```\n       If you set coalesceFindRequests to `true` it will instead trigger the following request:\n       ```\n      GET /comments?ids[]=1&ids[]=2\n      ```\n       Setting coalesceFindRequests to `true` also works for `store.find` requests and `belongsTo`\n      relationships accessed within the same runloop. If you set `coalesceFindRequests: true`\n       ```javascript\n      store.findRecord('comment', 1);\n      store.findRecord('comment', 2);\n      ```\n       will also send a request to: `GET /comments?ids[]=1&ids[]=2`\n       Note: Requests coalescing rely on URL building strategy. So if you override `buildURL` in your app\n      `groupRecordsForFindMany` more likely should be overridden as well in order for coalescing to work.\n       @property coalesceFindRequests\n      @public\n      @type {boolean}\n    */\n    get coalesceFindRequests() {\n      let coalesceFindRequests = this._coalesceFindRequests;\n      if (typeof coalesceFindRequests === 'boolean') {\n        return coalesceFindRequests;\n      }\n      return this._coalesceFindRequests = false;\n    }\n    set coalesceFindRequests(value) {\n      this._coalesceFindRequests = value;\n    }\n\n    /**\n      Endpoint paths can be prefixed with a `namespace` by setting the namespace\n      property on the adapter:\n       ```app/adapters/application.js\n      import RESTAdapter from '@ember-data/adapter/rest';\n       export default class ApplicationAdapter extends RESTAdapter {\n        namespace = 'api/1';\n      }\n      ```\n       Requests for the `Post` model would now target `/api/1/post/`.\n       @property namespace\n      @public\n      @type {String}\n    */\n\n    /**\n      An adapter can target other hosts by setting the `host` property.\n       ```app/adapters/application.js\n      import RESTAdapter from '@ember-data/adapter/rest';\n       export default class ApplicationAdapter extends RESTAdapter {\n        host = 'https://api.example.com';\n      }\n      ```\n       Requests for the `Post` model would now target `https://api.example.com/post/`.\n       @property host\n      @public\n      @type {String}\n    */\n\n    /**\n      Some APIs require HTTP headers, e.g. to provide an API\n      key. Arbitrary headers can be set as key/value pairs on the\n      `RESTAdapter`'s `headers` object and Ember Data will send them\n      along with each ajax request. For dynamic headers see [headers\n      customization](/ember-data/release/classes/RESTAdapter).\n       ```app/adapters/application.js\n      import RESTAdapter from '@ember-data/adapter/rest';\n      import { computed } from '@ember/object';\n       export default class ApplicationAdapter extends RESTAdapter {\n        headers: computed(function() {\n          return {\n            'API_KEY': 'secret key',\n            'ANOTHER_HEADER': 'Some header value'\n          };\n        })\n      }\n      ```\n       @property headers\n      @public\n      @type {Object}\n     */\n\n    /**\n      Called by the store in order to fetch the JSON for a given\n      type and ID.\n       The `findRecord` method makes an Ajax request to a URL computed by\n      `buildURL`, and returns a promise for the resulting payload.\n       This method performs an HTTP `GET` request with the id provided as part of the query string.\n       @since 1.13.0\n      @method findRecord\n      @public\n      @param {Store} store\n      @param {Model} type\n      @param {String} id\n      @param {Snapshot} snapshot\n      @return {Promise} promise\n    */\n    findRecord(store, type, id, snapshot) {\n      let url = this.buildURL(type.modelName, id, snapshot, 'findRecord');\n      let query = this.buildQuery(snapshot);\n      return this.ajax(url, 'GET', {\n        data: query\n      });\n    }\n\n    /**\n      Called by the store in order to fetch a JSON array for all\n      of the records for a given type.\n       The `findAll` method makes an Ajax (HTTP GET) request to a URL computed by `buildURL`, and returns a\n      promise for the resulting payload.\n       @method findAll\n      @public\n      @param {Store} store\n      @param {Model} type\n      @param {undefined} neverSet a value is never provided to this argument\n      @param {SnapshotRecordArray} snapshotRecordArray\n      @return {Promise} promise\n    */\n    findAll(store, type, sinceToken, snapshotRecordArray) {\n      let query = this.buildQuery(snapshotRecordArray);\n      let url = this.buildURL(type.modelName, null, snapshotRecordArray, 'findAll');\n      if (sinceToken) {\n        query.since = sinceToken;\n      }\n      return this.ajax(url, 'GET', {\n        data: query\n      });\n    }\n\n    /**\n      Called by the store in order to fetch a JSON array for\n      the records that match a particular query.\n       The `query` method makes an Ajax (HTTP GET) request to a URL\n      computed by `buildURL`, and returns a promise for the resulting\n      payload.\n       The `query` argument is a simple JavaScript object that will be passed directly\n      to the server as parameters.\n       @method query\n      @public\n      @param {Store} store\n      @param {Model} type\n      @param {Object} query\n      @param {Collection} recordArray\n      @param {Object} adapterOptions\n      @return {Promise} promise\n    */\n    query(store, type, query) {\n      let url = this.buildURL(type.modelName, null, null, 'query', query);\n      if (this.sortQueryParams) {\n        query = this.sortQueryParams(query);\n      }\n      return this.ajax(url, 'GET', {\n        data: query\n      });\n    }\n\n    /**\n      Called by the store in order to fetch a JSON object for\n      the record that matches a particular query.\n       The `queryRecord` method makes an Ajax (HTTP GET) request to a URL\n      computed by `buildURL`, and returns a promise for the resulting\n      payload.\n       The `query` argument is a simple JavaScript object that will be passed directly\n      to the server as parameters.\n       @since 1.13.0\n      @method queryRecord\n      @public\n      @param {Store} store\n      @param {Model} type\n      @param {Object} query\n      @param {Object} adapterOptions\n      @return {Promise} promise\n    */\n    queryRecord(store, type, query, adapterOptions) {\n      let url = this.buildURL(type.modelName, null, null, 'queryRecord', query);\n      if (this.sortQueryParams) {\n        query = this.sortQueryParams(query);\n      }\n      return this.ajax(url, 'GET', {\n        data: query\n      });\n    }\n\n    /**\n      Called by the store in order to fetch several records together if `coalesceFindRequests` is true\n       For example, if the original payload looks like:\n       ```js\n      {\n        \"id\": 1,\n        \"title\": \"Rails is omakase\",\n        \"comments\": [ 1, 2, 3 ]\n      }\n      ```\n       The IDs will be passed as a URL-encoded Array of IDs, in this form:\n       ```\n      ids[]=1&ids[]=2&ids[]=3\n      ```\n       Many servers, such as Rails and PHP, will automatically convert this URL-encoded array\n      into an Array for you on the server-side. If you want to encode the\n      IDs, differently, just override this (one-line) method.\n       The `findMany` method makes an Ajax (HTTP GET) request to a URL computed by `buildURL`, and returns a\n      promise for the resulting payload.\n       @method findMany\n      @public\n      @param {Store} store\n      @param {Model} type\n      @param {Array} ids\n      @param {Array} snapshots\n      @return {Promise} promise\n    */\n    findMany(store, type, ids, snapshots) {\n      let url = this.buildURL(type.modelName, ids, snapshots, 'findMany');\n      return this.ajax(url, 'GET', {\n        data: {\n          ids: ids\n        }\n      });\n    }\n\n    /**\n      Called by the store in order to fetch a JSON array for\n      the unloaded records in a has-many relationship that were originally\n      specified as a URL (inside of `links`).\n       For example, if your original payload looks like this:\n       ```js\n      {\n        \"post\": {\n          \"id\": 1,\n          \"title\": \"Rails is omakase\",\n          \"links\": { \"comments\": \"/posts/1/comments\" }\n        }\n      }\n      ```\n       This method will be called with the parent record and `/posts/1/comments`.\n       The `findHasMany` method will make an Ajax (HTTP GET) request to the originally specified URL.\n       The format of your `links` value will influence the final request URL via the `urlPrefix` method:\n       * Links beginning with `//`, `http://`, `https://`, will be used as is, with no further manipulation.\n       * Links beginning with a single `/` will have the current adapter's `host` value prepended to it.\n       * Links with no beginning `/` will have a parentURL prepended to it, via the current adapter's `buildURL`.\n       @method findHasMany\n      @public\n      @param {Store} store\n      @param {Snapshot} snapshot\n      @param {String} url\n      @param {Object} relationship meta object describing the relationship\n      @return {Promise} promise\n    */\n    findHasMany(store, snapshot, url, relationship) {\n      let id = snapshot.id;\n      let type = snapshot.modelName;\n      (true && !(typeof id === 'string' && id.length > 0) && (0, _debug.assert)(`Attempted to fetch the hasMany relationship for ${type}, but the record has no id`, typeof id === 'string' && id.length > 0));\n      url = this.urlPrefix(url, this.buildURL(type, id, snapshot, 'findHasMany'));\n      return this.ajax(url, 'GET');\n    }\n\n    /**\n      Called by the store in order to fetch the JSON for the unloaded record in a\n      belongs-to relationship that was originally specified as a URL (inside of\n      `links`).\n       For example, if your original payload looks like this:\n       ```js\n      {\n        \"person\": {\n          \"id\": 1,\n          \"name\": \"Tom Dale\",\n          \"links\": { \"group\": \"/people/1/group\" }\n        }\n      }\n      ```\n       This method will be called with the parent record and `/people/1/group`.\n       The `findBelongsTo` method will make an Ajax (HTTP GET) request to the originally specified URL.\n       The format of your `links` value will influence the final request URL via the `urlPrefix` method:\n       * Links beginning with `//`, `http://`, `https://`, will be used as is, with no further manipulation.\n       * Links beginning with a single `/` will have the current adapter's `host` value prepended to it.\n       * Links with no beginning `/` will have a parentURL prepended to it, via the current adapter's `buildURL`.\n       @method findBelongsTo\n      @public\n      @param {Store} store\n      @param {Snapshot} snapshot\n      @param {String} url\n      @param {Object} relationship meta object describing the relationship\n      @return {Promise} promise\n    */\n    findBelongsTo(store, snapshot, url, relationship) {\n      let id = snapshot.id;\n      let type = snapshot.modelName;\n      (true && !(typeof id === 'string' && id.length > 0) && (0, _debug.assert)(`Attempted to fetch the belongsTo relationship for ${type}, but the record has no id`, typeof id === 'string' && id.length > 0));\n      url = this.urlPrefix(url, this.buildURL(type, id, snapshot, 'findBelongsTo'));\n      return this.ajax(url, 'GET');\n    }\n\n    /**\n      Called by the store when a newly created record is\n      saved via the `save` method on a model record instance.\n       The `createRecord` method serializes the record and makes an Ajax (HTTP POST) request\n      to a URL computed by `buildURL`.\n       See `serialize` for information on how to customize the serialized form\n      of a record.\n       @method createRecord\n      @public\n      @param {Store} store\n      @param {Model} type\n      @param {Snapshot} snapshot\n      @return {Promise} promise\n    */\n    createRecord(store, type, snapshot) {\n      let url = this.buildURL(type.modelName, null, snapshot, 'createRecord');\n      const data = (0, _private.serializeIntoHash)(store, type, snapshot);\n      return this.ajax(url, 'POST', {\n        data\n      });\n    }\n\n    /**\n      Called by the store when an existing record is saved\n      via the `save` method on a model record instance.\n       The `updateRecord` method serializes the record and makes an Ajax (HTTP PUT) request\n      to a URL computed by `buildURL`.\n       See `serialize` for information on how to customize the serialized form\n      of a record.\n       @method updateRecord\n      @public\n      @param {Store} store\n      @param {Model} schema\n      @param {Snapshot} snapshot\n      @return {Promise} promise\n    */\n    updateRecord(store, schema, snapshot) {\n      const data = (0, _private.serializeIntoHash)(store, schema, snapshot, {});\n      const type = snapshot.modelName;\n      const id = snapshot.id;\n      (true && !(typeof id === 'string' && id.length > 0) && (0, _debug.assert)(`Attempted to update the ${type} record, but the record has no id`, typeof id === 'string' && id.length > 0));\n      let url = this.buildURL(type, id, snapshot, 'updateRecord');\n      return this.ajax(url, 'PUT', {\n        data\n      });\n    }\n\n    /**\n      Called by the store when a record is deleted.\n       The `deleteRecord` method  makes an Ajax (HTTP DELETE) request to a URL computed by `buildURL`.\n       @method deleteRecord\n      @public\n      @param {Store} store\n      @param {Model} type\n      @param {Snapshot} snapshot\n      @return {Promise} promise\n    */\n    deleteRecord(store, schema, snapshot) {\n      const type = snapshot.modelName;\n      const id = snapshot.id;\n      (true && !(typeof id === 'string' && id.length > 0) && (0, _debug.assert)(`Attempted to delete the ${type} record, but the record has no id`, typeof id === 'string' && id.length > 0));\n      return this.ajax(this.buildURL(type, id, snapshot, 'deleteRecord'), 'DELETE');\n    }\n    _stripIDFromURL(store, snapshot) {\n      const type = snapshot.modelName;\n      const id = snapshot.id;\n      (true && !(typeof id === 'string' && id.length > 0) && (0, _debug.assert)(`Attempted to strip the url from the ${type} record for coalescing, but the record has no id`, typeof id === 'string' && id.length > 0));\n      let url = this.buildURL(type, id, snapshot);\n      let expandedURL = url.split('/');\n      // Case when the url is of the format ...something/:id\n      // We are decodeURIComponent-ing the lastSegment because if it represents\n      // the id, it has been encodeURIComponent-ified within `buildURL`. If we\n      // don't do this, then records with id having special characters are not\n      // coalesced correctly (see GH #4190 for the reported bug)\n      let lastSegment = expandedURL[expandedURL.length - 1];\n      if (decodeURIComponent(lastSegment) === id) {\n        expandedURL[expandedURL.length - 1] = '';\n      } else if (id && endsWith(lastSegment, '?id=' + id)) {\n        //Case when the url is of the format ...something?id=:id\n        expandedURL[expandedURL.length - 1] = lastSegment.substring(0, lastSegment.length - id.length - 1);\n      }\n      return expandedURL.join('/');\n    }\n    /**\n      Organize records into groups, each of which is to be passed to separate\n      calls to `findMany`.\n       This implementation groups together records that have the same base URL but\n      differing ids. For example `/comments/1` and `/comments/2` will be grouped together\n      because we know findMany can coalesce them together as `/comments?ids[]=1&ids[]=2`\n       It also supports urls where ids are passed as a query param, such as `/comments?id=1`\n      but not those where there is more than 1 query param such as `/comments?id=2&name=David`\n      Currently only the query param of `id` is supported. If you need to support others, please\n      override this or the `_stripIDFromURL` method.\n       It does not group records that have differing base urls, such as for example: `/posts/1/comments/2`\n      and `/posts/2/comments/3`\n       @method groupRecordsForFindMany\n      @public\n      @param {Store} store\n      @param {Array} snapshots\n      @return {Array}  an array of arrays of records, each of which is to be\n                        loaded separately by `findMany`.\n    */\n    groupRecordsForFindMany(store, snapshots) {\n      let groups = new Map();\n      let adapter = this;\n      let maxURLLength = this.maxURLLength;\n      snapshots.forEach(snapshot => {\n        let baseUrl = adapter._stripIDFromURL(store, snapshot);\n        if (!groups.has(baseUrl)) {\n          groups.set(baseUrl, []);\n        }\n        groups.get(baseUrl).push(snapshot);\n      });\n      function splitGroupToFitInUrl(group, maxURLLength, paramNameLength) {\n        let idsSize = 0;\n        let baseUrl = adapter._stripIDFromURL(store, group[0]);\n        let splitGroups = [[]];\n        group.forEach(snapshot => {\n          let additionalLength = encodeURIComponent(snapshot.id).length + paramNameLength;\n          if (baseUrl.length + idsSize + additionalLength >= maxURLLength) {\n            idsSize = 0;\n            splitGroups.push([]);\n          }\n          idsSize += additionalLength;\n          let lastGroupIndex = splitGroups.length - 1;\n          splitGroups[lastGroupIndex].push(snapshot);\n        });\n        return splitGroups;\n      }\n      let groupsArray = [];\n      groups.forEach((group, key) => {\n        let paramNameLength = '&ids%5B%5D='.length;\n        let splitGroups = splitGroupToFitInUrl(group, maxURLLength, paramNameLength);\n        splitGroups.forEach(splitGroup => groupsArray.push(splitGroup));\n      });\n      return groupsArray;\n    }\n\n    /**\n      Takes an ajax response, and returns the json payload or an error.\n       By default this hook just returns the json payload passed to it.\n      You might want to override it in two cases:\n       1. Your API might return useful results in the response headers.\n      Response headers are passed in as the second argument.\n       2. Your API might return errors as successful responses with status code\n      200 and an Errors text or object. You can return a `InvalidError` or a\n      `AdapterError` (or a sub class) from this hook and it will automatically\n      reject the promise and put your record into the invalid or error state.\n       Returning a `InvalidError` from this method will cause the\n      record to transition into the `invalid` state and make the\n      `errors` object available on the record. When returning an\n      `InvalidError` the store will attempt to normalize the error data\n      returned from the server using the serializer's `extractErrors`\n      method.\n       @since 1.13.0\n      @method handleResponse\n      @public\n      @param  {Number} status\n      @param  {Object} headers\n      @param  {Object} payload\n      @param  {Object} requestData - the original request information\n      @return {Object | AdapterError} response\n    */\n    handleResponse(status, headers, payload, requestData) {\n      if (this.isSuccess(status, headers, payload)) {\n        return payload;\n      } else if (this.isInvalid(status, headers, payload)) {\n        return new _error.InvalidError(typeof payload === 'object' && 'errors' in payload ? payload.errors : undefined);\n      }\n      let errors = this.normalizeErrorResponse(status, headers, payload);\n      let detailedMessage = this.generatedDetailedMessage(status, headers, payload, requestData);\n      switch (status) {\n        case 401:\n          return new _error.UnauthorizedError(errors, detailedMessage);\n        case 403:\n          return new _error.ForbiddenError(errors, detailedMessage);\n        case 404:\n          return new _error.NotFoundError(errors, detailedMessage);\n        case 409:\n          return new _error.ConflictError(errors, detailedMessage);\n        default:\n          if (status >= 500) {\n            return new _error.ServerError(errors, detailedMessage);\n          }\n      }\n      return new _error.default(errors, detailedMessage);\n    }\n\n    /**\n      Default `handleResponse` implementation uses this hook to decide if the\n      response is a success.\n       @since 1.13.0\n      @method isSuccess\n      @public\n      @param  {Number} status\n      @param  {Object} headers\n      @param  {Object} payload\n      @return {Boolean}\n    */\n    isSuccess(status, _headers, _payload) {\n      return status >= 200 && status < 300 || status === 304;\n    }\n\n    /**\n      Default `handleResponse` implementation uses this hook to decide if the\n      response is an invalid error.\n       @since 1.13.0\n      @method isInvalid\n      @public\n      @param  {Number} status\n      @param  {Object} headers\n      @param  {Object} payload\n      @return {Boolean}\n    */\n    isInvalid(status, _headers, _payload) {\n      return status === 422;\n    }\n\n    /**\n      Takes a URL, an HTTP method and a hash of data, and makes an\n      HTTP request.\n       When the server responds with a payload, Ember Data will call into `extractSingle`\n      or `extractArray` (depending on whether the original query was for one record or\n      many records).\n       By default, `ajax` method has the following behavior:\n       * It sets the response `dataType` to `\"json\"`\n      * If the HTTP method is not `\"GET\"`, it sets the `Content-Type` to be\n        `application/json; charset=utf-8`\n      * If the HTTP method is not `\"GET\"`, it stringifies the data passed in. The\n        data is the serialized record in the case of a save.\n      * Registers success and failure handlers.\n       @method ajax\n      @private\n      @param {String} url\n      @param {String} type The request type GET, POST, PUT, DELETE etc.\n      @param {Object} options\n      @return {Promise} promise\n    */\n    async ajax(url, type, options) {\n      if (options === void 0) {\n        options = {};\n      }\n      let adapter = this;\n      let requestData = {\n        url: url,\n        method: type\n      };\n      if (this.useFetch) {\n        let hash = adapter.ajaxOptions(url, type, options);\n        let response = await this._fetchRequest(hash);\n        let payload = await (0, _private.determineBodyPromise)(response, requestData);\n        if (response.ok && !(payload instanceof Error)) {\n          return fetchSuccessHandler(adapter, payload, response, requestData);\n        } else {\n          throw fetchErrorHandler(adapter, payload, response, null, requestData);\n        }\n      } else {\n        let hash = adapter.ajaxOptions(url, type, options);\n        return new _rsvp.Promise(function (resolve, reject) {\n          hash.success = function (payload, textStatus, jqXHR) {\n            let response = ajaxSuccessHandler(adapter, payload, jqXHR, requestData);\n            (0, _runloop.join)(null, resolve, response);\n          };\n          hash.error = function (jqXHR, textStatus, errorThrown) {\n            let error = ajaxErrorHandler(adapter, jqXHR, errorThrown, requestData);\n            (0, _runloop.join)(null, reject, error);\n          };\n          adapter._ajax(hash);\n        }, 'DS: RESTAdapter#ajax ' + type + ' to ' + url);\n      }\n    }\n\n    /**\n      @method _ajaxRequest\n      @private\n      @param {Object} options jQuery ajax options to be used for the ajax request\n    */\n    _ajaxRequest(options) {\n      // TODO add assertion that jquery is there rather then equality check\n      typeof jQuery !== 'undefined' && jQuery.ajax(options);\n    }\n    _fetchRequest(options) {\n      let fetchFunction = (0, _private.fetch)();\n      if (fetchFunction) {\n        return fetchFunction(options.url, options);\n      } else {\n        throw new Error('cannot find the `fetch` module or the `fetch` global. Did you mean to install the `ember-fetch` addon?');\n      }\n    }\n    _ajax(options) {\n      if (this.useFetch) {\n        this._fetchRequest(options);\n      } else {\n        this._ajaxRequest(options);\n      }\n    }\n\n    /**\n      @method ajaxOptions\n      @private\n      @param {String} url\n      @param {String} type The request type GET, POST, PUT, DELETE etc.\n      @param {Object} options\n      @return {Object}\n    */\n    ajaxOptions(url, method, options) {\n      let reqOptions = Object.assign({\n        url,\n        method,\n        type: method\n      }, options);\n      if (this.headers !== undefined) {\n        reqOptions.headers = {\n          ...this.headers,\n          ...reqOptions.headers\n        };\n      } else if (!options.headers) {\n        reqOptions.headers = {};\n      }\n      let contentType = reqOptions.contentType || this._defaultContentType;\n      if (this.useFetch) {\n        if (reqOptions.data && reqOptions.type !== 'GET' && reqOptions.headers) {\n          if (!reqOptions.headers['Content-Type'] && !reqOptions.headers['content-type']) {\n            reqOptions.headers['content-type'] = contentType;\n          }\n        }\n        reqOptions = fetchOptions(reqOptions, this);\n      } else {\n        // GET requests without a body should not have a content-type header\n        // and may be unexpected by a server\n        if (reqOptions.data && reqOptions.type !== 'GET') {\n          reqOptions = {\n            ...reqOptions,\n            contentType\n          };\n        }\n        reqOptions = ajaxOptions(reqOptions, this);\n      }\n      reqOptions.url = this._ajaxURL(reqOptions.url);\n      return reqOptions;\n    }\n    _ajaxURL(url) {\n      if (this.fastboot?.isFastBoot) {\n        let httpRegex = /^https?:\\/\\//;\n        let protocolRelativeRegex = /^\\/\\//;\n        let protocol = this.fastboot.request.protocol;\n        let host = this.fastboot.request.host;\n        if (protocolRelativeRegex.test(url)) {\n          return `${protocol}${url}`;\n        } else if (!httpRegex.test(url)) {\n          try {\n            return `${protocol}//${host}${url}`;\n          } catch (fbError) {\n            throw new Error('You are using Ember Data with no host defined in your adapter. This will attempt to use the host of the FastBoot request, which is not configured for the current host of this request. Please set the hostWhitelist property for in your environment.js. FastBoot Error: ' + fbError.message);\n          }\n        }\n      }\n      return url;\n    }\n\n    /**\n      @method parseErrorResponse\n      @private\n      @param {String} responseText\n      @return {Object}\n    */\n    parseErrorResponse(responseText) {\n      let json = responseText;\n      try {\n        json = JSON.parse(responseText);\n      } catch (e) {\n        // ignored\n      }\n      return json;\n    }\n\n    /**\n      @method normalizeErrorResponse\n      @private\n      @param  {Number} status\n      @param  {Object} headers\n      @param  {Object} payload\n      @return {Array} errors payload\n    */\n    normalizeErrorResponse(status, _headers, payload) {\n      if (payload && typeof payload === 'object' && 'errors' in payload && Array.isArray(payload.errors)) {\n        return payload.errors;\n      } else {\n        return [{\n          status: `${status}`,\n          // Set to a string per the JSON API spec: https://jsonapi.org/format/#errors\n          title: 'The backend responded with an error',\n          detail: `${payload}`\n        }];\n      }\n    }\n\n    /**\n      Generates a detailed (\"friendly\") error message, with plenty\n      of information for debugging (good luck!)\n       @method generatedDetailedMessage\n      @private\n      @param  {Number} status\n      @param  {Object} headers\n      @param  {Object} payload\n      @param  {Object} requestData\n      @return {String} detailed error message\n    */\n    generatedDetailedMessage(status, headers, payload, requestData) {\n      let shortenedPayload;\n      let payloadContentType = headers['content-type'] || 'Empty Content-Type';\n      if (payloadContentType === 'text/html' && typeof payload === 'string' && payload.length > 250) {\n        shortenedPayload = '[Omitted Lengthy HTML]';\n      } else {\n        shortenedPayload = payload;\n      }\n      let requestDescription = requestData.method + ' ' + requestData.url;\n      let payloadDescription = 'Payload (' + payloadContentType + ')';\n      return ['Ember Data Request ' + requestDescription + ' returned a ' + status, payloadDescription, shortenedPayload].join('\\n');\n    }\n\n    /**\n      Used by `findAll` and `findRecord` to build the query's `data` hash\n      supplied to the ajax method.\n       @method buildQuery\n      @since 2.5.0\n      @public\n      @param  {Snapshot} snapshot\n      @return {Object}\n    */\n    buildQuery(snapshot) {\n      let query = {};\n      if (snapshot) {\n        let {\n          include\n        } = snapshot;\n        if (include) {\n          query.include = include;\n        }\n      }\n      return query;\n    }\n  }, _applyDecoratedDescriptor(_class.prototype, \"fastboot\", [_dec], Object.getOwnPropertyDescriptor(_class.prototype, \"fastboot\"), _class.prototype), _class);\n  function ajaxSuccess(adapter, payload, requestData, responseData) {\n    let response;\n    try {\n      response = adapter.handleResponse(responseData.status, responseData.headers, payload, requestData);\n    } catch (error) {\n      return _rsvp.Promise.reject(error);\n    }\n    if (response && response.isAdapterError) {\n      return _rsvp.Promise.reject(response);\n    } else {\n      return response;\n    }\n  }\n  function ajaxError(adapter, payload, requestData, responseData) {\n    let error;\n    if (responseData.errorThrown instanceof Error && payload !== '') {\n      error = responseData.errorThrown;\n    } else if (responseData.textStatus === 'timeout') {\n      error = new _error.TimeoutError();\n    } else if (responseData.textStatus === 'abort' || responseData.status === 0) {\n      error = handleAbort(requestData, responseData);\n    } else {\n      try {\n        error = adapter.handleResponse(responseData.status, responseData.headers, payload || responseData.errorThrown, requestData);\n      } catch (e) {\n        error = e;\n      }\n    }\n    return error;\n  }\n\n  // Adapter abort error to include any relevent info, e.g. request/response:\n  function handleAbort(requestData, responseData) {\n    let {\n      method,\n      url,\n      errorThrown\n    } = requestData;\n    let {\n      status\n    } = responseData;\n    let msg = `Request failed: ${method} ${url} ${errorThrown || ''}`;\n    let errors = [{\n      title: 'Adapter Error',\n      detail: msg.trim(),\n      status\n    }];\n    return new _error.AbortError(errors);\n  }\n\n  //From http://stackoverflow.com/questions/280634/endswith-in-javascript\n  function endsWith(string, suffix) {\n    if (typeof String.prototype.endsWith !== 'function') {\n      return string.indexOf(suffix, string.length - suffix.length) !== -1;\n    } else {\n      return string.endsWith(suffix);\n    }\n  }\n  function fetchSuccessHandler(adapter, payload, response, requestData) {\n    let responseData = fetchResponseData(response);\n    return ajaxSuccess(adapter, payload, requestData, responseData);\n  }\n  function fetchErrorHandler(adapter, payload, response, errorThrown, requestData) {\n    let responseData = fetchResponseData(response);\n    if (responseData.status === 200 && payload instanceof Error) {\n      responseData.errorThrown = payload;\n      payload = responseData.errorThrown.payload;\n    } else {\n      responseData.errorThrown = errorThrown;\n      if (typeof payload === 'string') {\n        payload = adapter.parseErrorResponse(payload);\n      }\n    }\n    return ajaxError(adapter, payload, requestData, responseData);\n  }\n  function ajaxSuccessHandler(adapter, payload, jqXHR, requestData) {\n    let responseData = ajaxResponseData(jqXHR);\n    return ajaxSuccess(adapter, payload, requestData, responseData);\n  }\n  function ajaxErrorHandler(adapter, jqXHR, errorThrown, requestData) {\n    let responseData = ajaxResponseData(jqXHR);\n    responseData.errorThrown = errorThrown;\n    let payload = adapter.parseErrorResponse(jqXHR.responseText);\n    if ((0, _runtime.macroCondition)(true)) {\n      let message = `The server returned an empty string for ${requestData.method} ${requestData.url}, which cannot be parsed into a valid JSON. Return either null or {}.`;\n      let validJSONString = !(responseData.textStatus === 'parsererror' && payload === '');\n      (true && (0, _debug.warn)(message, validJSONString, {\n        id: 'ds.adapter.returned-empty-string-as-JSON'\n      }));\n    }\n    return ajaxError(adapter, payload, requestData, responseData);\n  }\n  function fetchResponseData(response) {\n    return {\n      status: response.status,\n      textStatus: response.statusText,\n      headers: headersToObject(response.headers)\n    };\n  }\n  function ajaxResponseData(jqXHR) {\n    return {\n      status: jqXHR.status,\n      textStatus: jqXHR.statusText,\n      headers: (0, _private.parseResponseHeaders)(jqXHR.getAllResponseHeaders())\n    };\n  }\n  function headersToObject(headers) {\n    let headersObject = {};\n    if (headers) {\n      headers.forEach((value, key) => headersObject[key] = value);\n    }\n    return headersObject;\n  }\n\n  /**\n   * Helper function that translates the options passed to `jQuery.ajax` into a format that `fetch` expects.\n   *\n   * @method fetchOptions\n   * @for @ember-data/adapter/rest\n   * @param {Object} _options\n   * @param {Adapter} adapter\n   * @private\n   * @returns {Object}\n   */\n  function fetchOptions(options, adapter) {\n    options.credentials = options.credentials || 'same-origin';\n    if (options.data) {\n      // GET and HEAD requests can't have a `body`\n      if (options.method === 'GET' || options.method === 'HEAD') {\n        // If no options are passed, Ember Data sets `data` to an empty object, which we test for.\n        if (Object.keys(options.data).length && options.url) {\n          // Test if there are already query params in the url (mimics jQuey.ajax).\n          const queryParamDelimiter = options.url.indexOf('?') > -1 ? '&' : '?';\n          options.url += `${queryParamDelimiter}${(0, _private.serializeQueryParams)(options.data)}`;\n        }\n      } else {\n        // NOTE: a request's body cannot be an object, so we stringify it if it is.\n        // JSON.stringify removes keys with values of `undefined` (mimics jQuery.ajax).\n        // If the data is not a POJO (it's a String, FormData, etc), we just set it.\n        // If the data is a string, we assume it's a stringified object.\n\n        /* We check for Objects this way because we want the logic inside the consequent to run\n         * if `options.data` is a POJO, not if it is a data structure whose `typeof` returns \"object\"\n         * when it's not (Array, FormData, etc). The reason we don't use `options.data.constructor`\n         * to check is in case `data` is an object with no prototype (e.g. created with null).\n         */\n        if (Object.prototype.toString.call(options.data) === '[object Object]') {\n          options.body = JSON.stringify(options.data);\n        } else {\n          options.body = options.data;\n        }\n      }\n    }\n    return options;\n  }\n  function ajaxOptions(options, adapter) {\n    options.dataType = 'json';\n    options.context = adapter;\n    if (options.data && options.type !== 'GET') {\n      options.data = JSON.stringify(options.data);\n    }\n    options.beforeSend = function (xhr) {\n      if (options.headers) {\n        Object.keys(options.headers).forEach(key => {\n          let headerValue = options.headers && options.headers[key];\n          const isString = value => typeof value === 'string';\n          if (isString(headerValue)) {\n            xhr.setRequestHeader(key, headerValue);\n          }\n        });\n      }\n    };\n    return options;\n  }\n  var _default = RESTAdapter;\n  _exports.default = _default;\n});","define(\"@ember-data/canary-features/default-features\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n   * ## Canary Features\n   *\n   * EmberData allows users to test features that are implemented but not yet\n   * available even in canary.\n   *\n   * Typically these features represent work that might introduce a new concept,\n   * new API, change an API, or risk an unintended change in behavior to consuming\n   * applications.\n   *\n   * Such features have their implementations guarded by a \"feature flag\", and the\n   * flag is only activated once the core-data team is prepared to ship the work\n   * in a canary release.\n   *\n   * ### Installing Canary\n   *\n   * To test a feature you MUST be using a canary build. Canary builds are published\n   * to `npm` and can be installed using a precise tag (such as `ember-data@3.16.0-alpha.1`)\n   * or by installing the latest dist-tag published to the `canary` channel.\n   *\n   * *Using `npm` to install the latest canary*\n   *\n   * ```cli\n   * npm install --save-dev ember-data@canary\n   * ```\n   *\n   * *Using `yarn` to install the latest canary*\n   *\n   * ```cli\n   * pnpm add ember-data@canary\n   * ```\n   *\n   * ### Activating a Canary Feature\n   *\n   * Once you have installed canary, feature-flags can be activated at build-time by an environment\n   * variable or at runtime using `window.EmberDataENV`.\n   *\n   * The \"off\" branch of feature-flagged code is always stripped from production builds, so you\n   * MUST use the build-time environment variable to activate a flag if testing production.\n   *\n   * The list of available feature-flags is located [here](https://github.com/emberjs/data/tree/master/packages/canary-features/addon/default-features.ts \"List of EmberData FeatureFlags\")\n   *\n   * #### Runtime Configuration\n   *\n   * To configure feature-flags at runtime you will want to configure `window.EmberDataENV = {}` appropriately.\n   * You should add this global property in your app prior to your application booting. At the top of\n   * your `app.js` file is a convenient location, as is within ` index.html` as a script running prior\n   * to loading any other scripts.\n   *\n   * *Example activating a single feature flags*\n   *\n   * ```js\n   * window.EmberDataENV = {\n   *   FEATURES: {\n   *     RECORD_DATA_ERRORS: true,\n   *   }\n   * }\n   * ```\n   *\n   * *Example activating multiple feature flags*\n   *\n   * ```js\n   * window.EmberDataENV = {\n   *   FEATURES: {\n   *     RECORD_DATA_ERRORS: true,\n   *     RECORD_DATA_STATE: true,\n   *   }\n   * }\n   * ```\n   *\n   * *Example activating all feature flags*\n   *\n   * ```js\n   * window.EmberDataENV = {\n   *   ENABLE_OPTIONAL_FEATURES: true\n   * }\n   * ```\n   *\n   * #### Build Time Configuration\n   *\n   * *Example activating a single feature flags*\n   *\n   * ```js\n   * EMBER_DATA_FEATURE_OVERRIDE=SAMPLE_FEATURE_FLAG ember build\n   * ```\n   *\n   * *Example activating multiple feature flags*\n   *\n   * ```js\n   * EMBER_DATA_FEATURE_OVERRIDE=SAMPLE_FEATURE_FLAG,CUSTOM_MODEL_CLASS ember build\n   * ```\n   *\n   * *Example activating all feature flags*\n   *\n   * ```js\n   * EMBER_DATA_FEATURE_OVERRIDE=ENABLE_ALL_OPTIONAL ember build\n   * ```\n   *\n   * ### Preparing an Addon to use a Canary Feature\n   *\n   * For most addons and most features simple version detection should be\n   * enough. Using the provided version compatibility helpers from\n   * [ember-compatibility-helpers](https://github.com/pzuraq/ember-compatibility-helpers)\n   * the following can be done:\n   *\n   * ```js\n   * if (gte('@ember-data/store', '3.12.0')) {\n   *\n   * } else {\n   *\n   * }\n   * ```\n   *\n   * For addons needing more advanced detection [babel-plugin-debug-macros](https://github.com/ember-cli/babel-plugin-debug-macros)\n   * can be leveraged to provide code-stripping based on feature presence. For example in your addon's `index.js`:\n   *\n   * ```js\n   * function debugMacros(features) {\n   *   let plugins = [\n   *     [\n   *       require.resolve('babel-plugin-debug-macros'),\n   *       {\n   *         flags: [\n   *           {\n   *             source: '<addon-name>/feature-flags',\n   *             flags: features,\n   *           },\n   *         ],\n   *       },\n   *       '<addon-name>/canary-features-stripping',\n   *     ],\n   *   ];\n   *\n   *   return plugins;\n   * }\n   *\n   * module.exports = {\n   *   name: '<addon-name>',\n   *\n   *   init() {\n   *     this._super.init.apply(this, arguments);\n   *\n   *     let features;\n   *     try {\n   *       features = this.project.require('@ember-data/private-build-infra/src/features')();\n   *     } catch (e) {\n   *       features = { CUSTOM_MODEL_CLASS: false };\n   *     }\n   *\n   *     this.options = this.options || {};\n   *     this.options.babel = this.options.babel || {};\n   *     // this ensures that the same `@ember-data/canary-features` processing that the various\n   *     // ember-data addons do is done for this addon\n   *     this.options.babel.plugins = [...debugMacros(features)];\n   *   }\n   * }\n   * ```\n   *\n     @module @ember-data/canary-features\n     @main @ember-data/canary-features\n   */\n  /*\n    This list of features is used both at build time (by `@ember-data/private-build-infra`)\n    and at runtime (by `@ember-data/canary-features`).\n  \n    The valid values are:\n  \n    - true - The feature is enabled at all times, and cannot be disabled.\n    - false - The feature is disabled at all times, and cannot be enabled.\n    - null - The feature is disabled by default, but can be enabled at runtime via `EmberDataENV`.\n  */\n  var _default = {\n    SAMPLE_FEATURE_FLAG: null\n  };\n  _exports.default = _default;\n});","define(\"@ember-data/canary-features/index\", [\"exports\", \"@ember-data/canary-features/default-features\"], function (_exports, _defaultFeatures) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.SAMPLE_FEATURE_FLAG = _exports.FEATURES = void 0;\n  /* globals EmberDataENV */\n\n  const ENV = typeof EmberDataENV !== 'undefined' && EmberDataENV !== null ? EmberDataENV : {};\n  function featureValue(value) {\n    if (ENV.ENABLE_OPTIONAL_FEATURES && value === null) {\n      return true;\n    }\n    return value;\n  }\n  const FEATURES = Object.assign({}, _defaultFeatures.default, ENV.FEATURES);\n  _exports.FEATURES = FEATURES;\n  const SAMPLE_FEATURE_FLAG = featureValue(FEATURES.SAMPLE_FEATURE_FLAG);\n  _exports.SAMPLE_FEATURE_FLAG = SAMPLE_FEATURE_FLAG;\n});","define(\"@ember-data/debug/index\", [\"exports\", \"@ember/array\", \"@ember/debug\", \"@ember/debug/data-adapter\", \"@ember/object/observers\", \"@ember/service\", \"@ember/string\", \"@ember/runloop\", \"@ember-data/debug/setup\"], function (_exports, _array, _debug, _dataAdapter, _observers, _service, _string, _runloop, _setup) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/array\",0,\"@ember/debug\",0,\"@ember/debug/data-adapter\",0,\"@ember/object/observers\",0,\"@ember/service\",0,\"@ember/string\",0,\"@ember/runloop\",0,\"@ember-data/debug/setup\"eaimeta@70e063a35619d71f\n  /**\n    # Overview\n  \n    This package provides the `DataAdapter` which the [Ember Inspector](https://github.com/emberjs/ember-inspector)\n    uses to subscribe and retrieve information for the `data` tab in the inspector.\n  \n    This package adds roughly .6 KB when minified and compressed to your application in production; however,\n    you can opt out of shipping this addon in production via options in `ember-cli-build.js`\n  \n    ```js\n    let app = new EmberApp(defaults, {\n      emberData: {\n        includeDataAdapterInProduction: false\n      }\n    });\n    ```\n  \n    When using `ember-data` as a dependency of your app, the default is to ship the inspector support to production.\n  \n    When not using `ember-data` as a dependency but instead using EmberData via declaring specific `@ember-data/<package>`\n    dependencies the default is to not ship to production.\n  \n    @module @ember-data/debug\n    @main @ember-data/debug\n  */\n  /**\n    Implements `@ember/debug/data-adapter` with for EmberData\n    integration with the ember-inspector.\n  \n    @class InspectorDataAdapter\n    @extends DataAdapter\n    @private\n  */\n  var _default = _dataAdapter.default.extend({\n    store: (0, _service.inject)('store'),\n    /**\n      Specifies how records can be filtered based on the state of the record\n      Records returned will need to have a `filterValues`\n      property with a key for every name in the returned array\n       @method getFilters\n      @private\n      @return {Array} List of objects defining filters\n       The object should have a `name` and `desc` property\n    */\n    getFilters() {\n      return [{\n        name: 'isNew',\n        desc: 'New'\n      }, {\n        name: 'isModified',\n        desc: 'Modified'\n      }, {\n        name: 'isClean',\n        desc: 'Clean'\n      }];\n    },\n    _nameToClass(type) {\n      return this.store.modelFor(type);\n    },\n    /**\n      Fetch the model types and observe them for changes.\n      Maintains the list of model types without needing the Model package for detection.\n       @method watchModelTypes\n      @private\n      @param {Function} typesAdded Callback to call to add types.\n      Takes an array of objects containing wrapped types (returned from `wrapModelType`).\n      @param {Function} typesUpdated Callback to call when a type has changed.\n      Takes an array of objects containing wrapped types.\n      @return {Function} Method to call to remove all observers\n    */\n    watchModelTypes(typesAdded, typesUpdated) {\n      const {\n        store\n      } = this;\n      const __getRecordData = store._instanceCache.getRecordData;\n      const _releaseMethods = [];\n      const discoveredTypes = (0, _setup.typesMapFor)(store);\n\n      // Add any models that were added during initialization of the app, before the inspector was opened\n      discoveredTypes.forEach((_, type) => {\n        this.watchTypeIfUnseen(store, discoveredTypes, type, typesAdded, typesUpdated, _releaseMethods);\n      });\n\n      // Overwrite _createRecordData so newly added models will get added to the list\n      store._instanceCache.getRecordData = identifier => {\n        // defer to ensure first-create does not result in an infinite loop, see https://github.com/emberjs/data/issues/8006\n        (0, _runloop.next)(() => this.watchTypeIfUnseen(store, discoveredTypes, identifier.type, typesAdded, typesUpdated, _releaseMethods));\n        return __getRecordData.call(store._instanceCache, identifier);\n      };\n      let release = () => {\n        _releaseMethods.forEach(fn => fn());\n        store._instanceCache.getRecordData = __getRecordData;\n        // reset the list so the models can be added if the inspector is re-opened\n        // the entries are set to false instead of removed, since the models still exist in the app\n        // we just need the inspector to become aware of them\n        discoveredTypes.forEach((value, key) => {\n          discoveredTypes.set(key, false);\n        });\n        this.releaseMethods.removeObject(release);\n      };\n      this.releaseMethods.pushObject(release);\n      return release;\n    },\n    /**\n     * Loop over the discovered types and use the callbacks from watchModelTypes to notify\n     * the consumer of this adapter about the mdoels.\n     *\n     * @method watchTypeIfUnseen\n     * @param {store} store\n     * @param {Map} discoveredTypes\n     * @param {String} type\n     * @param {Function} typesAdded\n     * @param {Function} typesUpdated\n     * @param {Array} releaseMethods\n     * @private\n     */\n    watchTypeIfUnseen(store, discoveredTypes, type, typesAdded, typesUpdated, releaseMethods) {\n      if (discoveredTypes.get(type) !== true) {\n        let klass = store.modelFor(type);\n        let wrapped = this.wrapModelType(klass, type);\n        releaseMethods.push(this.observeModelType(type, typesUpdated));\n        typesAdded([wrapped]);\n        discoveredTypes.set(type, true);\n      }\n    },\n    /**\n      Creates a human readable string used for column headers\n       @method columnNameToDesc\n      @private\n      @param {String} name The attribute name\n      @return {String} Human readable string based on the attribute name\n    */\n    columnNameToDesc(name) {\n      return (0, _string.capitalize)((0, _string.underscore)(name).replace(/_/g, ' ').trim());\n    },\n    /**\n      Get the columns for a given model type\n       @method columnsForType\n      @private\n      @param {Model} typeClass\n      @return {Array} An array of columns of the following format:\n       name: {String} The name of the column\n       desc: {String} Humanized description (what would show in a table column name)\n    */\n    columnsForType(typeClass) {\n      let columns = [{\n        name: 'id',\n        desc: 'Id'\n      }];\n      let count = 0;\n      let self = this;\n      typeClass.attributes.forEach((meta, name) => {\n        if (count++ > self.attributeLimit) {\n          return false;\n        }\n        let desc = this.columnNameToDesc(name);\n        columns.push({\n          name: name,\n          desc: desc\n        });\n      });\n      return columns;\n    },\n    /**\n      Fetches all loaded records for a given type\n       @method getRecords\n      @private\n      @param {Model} modelClass of the record\n      @param {String} modelName of the record\n      @return {Array} An array of Model records\n       This array will be observed for changes,\n       so it should update when new records are added/removed\n    */\n    getRecords(modelClass, modelName) {\n      if (arguments.length < 2) {\n        // Legacy Ember.js < 1.13 support\n        let containerKey = modelClass._debugContainerKey;\n        if (containerKey) {\n          let match = containerKey.match(/model:(.*)/);\n          if (match !== null) {\n            modelName = match[1];\n          }\n        }\n      }\n      (true && !(!!modelName) && (0, _debug.assert)('Cannot find model name. Please upgrade to Ember.js >= 1.13 for Ember Inspector support', !!modelName));\n      return this.store.peekAll(modelName);\n    },\n    /**\n      Gets the values for each column\n      This is the attribute values for a given record\n       @method getRecordColumnValues\n      @private\n      @param {Model} record to get values from\n      @return {Object} Keys should match column names defined by the model type\n    */\n    getRecordColumnValues(record) {\n      let count = 0;\n      let columnValues = {\n        id: record.id\n      };\n      record.eachAttribute(key => {\n        if (count++ > this.attributeLimit) {\n          return false;\n        }\n        columnValues[key] = record[key];\n      });\n      return columnValues;\n    },\n    /**\n      Returns keywords to match when searching records\n       @method getRecordKeywords\n      @private\n      @param {Model} record\n      @return {Array} Relevant keywords for search based on the record's attribute values\n    */\n    getRecordKeywords(record) {\n      let keywords = [];\n      let keys = (0, _array.A)(['id']);\n      record.eachAttribute(key => keys.push(key));\n      keys.forEach(key => keywords.push(record[key]));\n      return keywords;\n    },\n    /**\n      Returns the values of filters defined by `getFilters`\n      These reflect the state of the record\n       @method getRecordFilterValues\n      @private\n      @param {Model} record\n      @return {Object} The record state filter values\n    */\n    getRecordFilterValues(record) {\n      return {\n        isNew: record.isNew,\n        isModified: record.hasDirtyAttributes && !record.isNew,\n        isClean: !record.hasDirtyAttributes\n      };\n    },\n    /**\n      Returns a color that represents the record's state\n      Possible colors: black, blue, green\n       @method getRecordColor\n      @private\n      @param {Model} record\n      @return {String} The record color\n    */\n    getRecordColor(record) {\n      let color = 'black';\n      if (record.isNew) {\n        color = 'green';\n      } else if (record.hasDirtyAttributes) {\n        color = 'blue';\n      }\n      return color;\n    },\n    /**\n      Observes all relevant properties and re-sends the wrapped record\n      when a change occurs\n       @method observeRecord\n      @private\n      @param {Model} record\n      @param {Function} recordUpdated Callback used to notify changes\n      @return {Function} The function to call to remove all observers\n    */\n    observeRecord(record, recordUpdated) {\n      let releaseMethods = (0, _array.A)();\n      let keysToObserve = (0, _array.A)(['id', 'isNew', 'hasDirtyAttributes']);\n      record.eachAttribute(key => keysToObserve.push(key));\n      let adapter = this;\n      keysToObserve.forEach(function (key) {\n        let handler = function () {\n          recordUpdated(adapter.wrapRecord(record));\n        };\n        (0, _observers.addObserver)(record, key, handler);\n        releaseMethods.push(function () {\n          (0, _observers.removeObserver)(record, key, handler);\n        });\n      });\n      let release = function () {\n        releaseMethods.forEach(fn => fn());\n      };\n      return release;\n    }\n  });\n  _exports.default = _default;\n});","define(\"@ember-data/debug/setup\", [\"exports\", \"@ember-data/store\"], function (_exports, _store) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.typesMapFor = typesMapFor;\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/store\"eaimeta@70e063a35619d71f\n  // dirty hack to add the known models to the typesMap\n  const StoreTypesMap = new WeakMap();\n  function typesMapFor(store) {\n    let typesMap = StoreTypesMap.get(store);\n    if (typesMap === undefined) {\n      typesMap = new Map();\n      StoreTypesMap.set(store, typesMap);\n    }\n    return typesMap;\n  }\n\n  // EmberData 4.7+\n  Object.defineProperty(_store.default.prototype, '_instanceCache', {\n    get() {\n      return this.__instanceCache;\n    },\n    set(value) {\n      const getRecordData = value.getRecordData;\n      const store = this;\n      value.getRecordData = function (identifier) {\n        const typesMap = typesMapFor(store);\n        if (!typesMap.has(identifier.type)) {\n          typesMap.set(identifier.type, false);\n        }\n        return getRecordData.call(this, identifier);\n      };\n      this.__instanceCache = value;\n    }\n  });\n\n  // EmberData <= 4.6\n  const __createRecordData = _store.default.prototype._createRecordData;\n  _store.default.prototype._createRecordData = function (identifier) {\n    const typesMap = typesMapFor(this);\n    if (!typesMap.has(identifier.type)) {\n      typesMap.set(identifier.type, false);\n    }\n    return __createRecordData.call(this, identifier);\n  };\n  var _default = {\n    name: '@ember-data/data-adapter',\n    initialize() {}\n  };\n  _exports.default = _default;\n});","define('@ember-data/model/-private', ['exports', '@embroider/macros/runtime', '@ember/debug', '@ember/object', '@ember-data/store', '@ember-data/store/-private', '@ember/string', '@ember/object/compat', '@ember/runloop', '@glimmer/tracking', 'ember', 'rsvp', '@ember/object/promise-proxy-mixin', '@ember/object/proxy', '@ember/array', '@ember/array/proxy', '@ember/object/computed', '@embroider/macros/es-compat', '@ember/object/internals', '@ember-data/tracking/-private', 'ember-inflector', '@ember/application'], (function (exports, runtime, debug, EmberObject, store, Private, string, compat, runloop, tracking, Ember, rsvp, PromiseProxyMixin, ObjectProxy, ArrayMixin, ArrayProxy, computed, esc, internals, Private$1, emberInflector, application) { 'use strict';\n\n  const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e };\n\n  const EmberObject__default = /*#__PURE__*/_interopDefaultLegacy(EmberObject);\n  const Ember__default = /*#__PURE__*/_interopDefaultLegacy(Ember);\n  const PromiseProxyMixin__default = /*#__PURE__*/_interopDefaultLegacy(PromiseProxyMixin);\n  const ObjectProxy__default = /*#__PURE__*/_interopDefaultLegacy(ObjectProxy);\n  const ArrayMixin__default = /*#__PURE__*/_interopDefaultLegacy(ArrayMixin);\n  const ArrayProxy__default = /*#__PURE__*/_interopDefaultLegacy(ArrayProxy);\n  const esc__default = /*#__PURE__*/_interopDefaultLegacy(esc);\n\n  function isElementDescriptor(args) {\n    let [maybeTarget, maybeKey, maybeDesc] = args;\n    return (\n      // Ensure we have the right number of args\n      args.length === 3 && (\n      // Make sure the target is a class or object (prototype)\n      typeof maybeTarget === 'function' || typeof maybeTarget === 'object' && maybeTarget !== null) &&\n      // Make sure the key is a string\n      typeof maybeKey === 'string' && (\n      // Make sure the descriptor is the right shape\n      typeof maybeDesc === 'object' && maybeDesc !== null && 'enumerable' in maybeDesc && 'configurable' in maybeDesc ||\n      // TS compatibility\n      maybeDesc === undefined)\n    );\n  }\n  function computedMacroWithOptionalParams(fn) {\n    {\n      return function () {\n        for (var _len = arguments.length, maybeDesc = new Array(_len), _key = 0; _key < _len; _key++) {\n          maybeDesc[_key] = arguments[_key];\n        }\n        return isElementDescriptor(maybeDesc) ? fn()(...maybeDesc) : fn(...maybeDesc);\n      };\n    }\n  }\n\n  /**\n    @module @ember-data/model\n  */\n\n  /**\n    `attr` defines an attribute on a [Model](/ember-data/release/classes/Model).\n    By default, attributes are passed through as-is, however you can specify an\n    optional type to have the value automatically transformed.\n    Ember Data ships with four basic transform types: `string`, `number`,\n    `boolean` and `date`. You can define your own transforms by subclassing\n    [Transform](/ember-data/release/classes/Transform).\n\n    Note that you cannot use `attr` to define an attribute of `id`.\n\n    `attr` takes an optional hash as a second parameter, currently\n    supported options are:\n\n    - `defaultValue`: Pass a string or a function to be called to set the attribute\n    to a default value if and only if the key is absent from the payload response.\n\n    Example\n\n    ```app/models/user.js\n    import Model, { attr } from '@ember-data/model';\n\n    export default class UserModel extends Model {\n      @attr('string') username;\n      @attr('string') email;\n      @attr('boolean', { defaultValue: false }) verified;\n    }\n    ```\n\n    Default value can also be a function. This is useful it you want to return\n    a new object for each attribute.\n\n    ```app/models/user.js\n    import Model, { attr } from '@ember-data/model';\n\n    export default class UserModel extends Model {\n      @attr('string') username;\n      @attr('string') email;\n\n      @attr({\n        defaultValue() {\n          return {};\n        }\n      })\n      settings;\n    }\n    ```\n\n    The `options` hash is passed as second argument to a transforms'\n    `serialize` and `deserialize` method. This allows to configure a\n    transformation and adapt the corresponding value, based on the config:\n\n    ```app/models/post.js\n    import Model, { attr } from '@ember-data/model';\n\n    export default class PostModel extends Model {\n      @attr('text', {\n        uppercase: true\n      })\n      text;\n    }\n    ```\n\n    ```app/transforms/text.js\n    import Transform from '@ember-data/serializer/transform';\n\n    export default class TextTransform extends Transform {\n      serialize(value, options) {\n        if (options.uppercase) {\n          return value.toUpperCase();\n        }\n\n        return value;\n      }\n\n      deserialize(value) {\n        return value;\n      }\n    }\n    ```\n\n    @method attr\n    @public\n    @static\n    @for @ember-data/model\n    @param {String|Object} type the attribute type\n    @param {Object} options a hash of options\n    @return {Attribute}\n  */\n  function attr(type, options) {\n    if (typeof type === 'object') {\n      options = type;\n      type = undefined;\n    } else {\n      options = options || {};\n    }\n    let meta = {\n      type: type,\n      isAttribute: true,\n      options: options\n    };\n    return EmberObject.computed({\n      get(key) {\n        if (runtime.macroCondition(true)) {\n          if (['currentState'].indexOf(key) !== -1) {\n            throw new Error(`'${key}' is a reserved property name on instances of classes extending Model. Please choose a different property name for your attr on ${this.constructor.toString()}`);\n          }\n        }\n        if (this.isDestroyed || this.isDestroying) {\n          return;\n        }\n        return Private.recordDataFor(this).getAttr(store.recordIdentifierFor(this), key);\n      },\n      set(key, value) {\n        if (runtime.macroCondition(true)) {\n          if (['currentState'].indexOf(key) !== -1) {\n            throw new Error(`'${key}' is a reserved property name on instances of classes extending Model. Please choose a different property name for your attr on ${this.constructor.toString()}`);\n          }\n        }\n        (!(!this.currentState.isDeleted) && debug.assert(`Attempted to set '${key}' on the deleted record ${store.recordIdentifierFor(this)}`, !this.currentState.isDeleted));\n        const identifier = store.recordIdentifierFor(this);\n        const recordData = store.storeFor(this)._instanceCache.getRecordData(identifier);\n        let currentValue = recordData.getAttr(identifier, key);\n        if (currentValue !== value) {\n          recordData.setAttr(identifier, key, value);\n          if (!this.isValid) {\n            const {\n              errors\n            } = this;\n            if (errors.get(key)) {\n              errors.remove(key);\n              this.currentState.cleanErrorRequests();\n            }\n          }\n        }\n        return value;\n      }\n    }).meta(meta);\n  }\n  const attr$1 = computedMacroWithOptionalParams(attr);\n\n  const PromiseObject = ObjectProxy__default.default.extend(PromiseProxyMixin__default.default);\n\n  function promiseObject(promise) {\n    return PromiseObject.create({\n      promise: rsvp.resolve(promise)\n    });\n  }\n\n  // constructor is accessed in some internals but not including it in the copyright for the deprecation\n  const ALLOWABLE_METHODS = ['constructor', 'then', 'catch', 'finally'];\n  const ALLOWABLE_PROPS = ['__ec_yieldable__', '__ec_cancel__'];\n  const PROXIED_OBJECT_PROPS = ['content', 'isPending', 'isSettled', 'isRejected', 'isFulfilled', 'promise', 'reason'];\n  const ProxySymbolString = String(Symbol.for('PROXY_CONTENT'));\n  function deprecatedPromiseObject(promise) {\n    const promiseObjectProxy = promiseObject(promise);\n    if (runtime.macroCondition(!true)) {\n      return promiseObjectProxy;\n    }\n    const handler = {\n      get(target, prop, receiver) {\n        if (typeof prop === 'symbol') {\n          if (String(prop) === ProxySymbolString) {\n            return;\n          }\n          return Reflect.get(target, prop, receiver);\n        }\n        if (prop === 'constructor') {\n          return target.constructor;\n        }\n        if (ALLOWABLE_PROPS.includes(prop)) {\n          return target[prop];\n        }\n        if (!ALLOWABLE_METHODS.includes(prop)) {\n          (debug.deprecate(`Accessing ${prop} is deprecated. The return type is being changed from PromiseObjectProxy to a Promise. The only available methods to access on this promise are .then, .catch and .finally`, false, {\n            id: 'ember-data:model-save-promise',\n            until: '5.0',\n            for: '@ember-data/store',\n            since: {\n              available: '4.4',\n              enabled: '4.4'\n            }\n          }));\n        } else {\n          return target[prop].bind(target);\n        }\n        if (PROXIED_OBJECT_PROPS.includes(prop)) {\n          return target[prop];\n        }\n        const value = EmberObject.get(target, prop);\n        if (value && typeof value === 'function' && typeof value.bind === 'function') {\n          return value.bind(receiver);\n        }\n        return undefined;\n      }\n    };\n    return new Proxy(promiseObjectProxy, handler);\n  }\n\n  var _dec$1, _dec2, _dec3, _dec4, _class$6, _descriptor$5, _descriptor2$2;\n  function _initializerDefineProperty$5(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }\n  function _applyDecoratedDescriptor$6(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }\n\n  /**\n    @module @ember-data/model\n  */\n\n  // we force the type here to our own construct because mixin and extend patterns\n  // lose generic signatures. We also do this because we need to Omit `clear` from\n  // the type of ArrayProxy as we override it's signature.\n  const ArrayProxyWithCustomOverrides = ArrayProxy__default.default;\n\n  /**\n    Holds validation errors for a given record, organized by attribute names.\n\n    This class is not directly instantiable.\n\n    Every `Model` has an `errors` property that is an instance of\n    `Errors`. This can be used to display validation error\n    messages returned from the server when a `record.save()` rejects.\n\n    For Example, if you had a `User` model that looked like this:\n\n    ```app/models/user.js\n    import Model, { attr } from '@ember-data/model';\n\n    export default class UserModel extends Model {\n      @attr('string') username;\n      @attr('string') email;\n    }\n    ```\n    And you attempted to save a record that did not validate on the backend:\n\n    ```javascript\n    let user = store.createRecord('user', {\n      username: 'tomster',\n      email: 'invalidEmail'\n    });\n    user.save();\n    ```\n\n    Your backend would be expected to return an error response that described\n    the problem, so that error messages can be generated on the app.\n\n    API responses will be translated into instances of `Errors` differently,\n    depending on the specific combination of adapter and serializer used. You\n    may want to check the documentation or the source code of the libraries\n    that you are using, to know how they expect errors to be communicated.\n\n    Errors can be displayed to the user by accessing their property name\n    to get an array of all the error objects for that property. Each\n    error object is a JavaScript object with two keys:\n\n    - `message` A string containing the error message from the backend\n    - `attribute` The name of the property associated with this error message\n\n    ```handlebars\n    <label>Username: <Input @value={{@model.username}} /> </label>\n    {{#each @model.errors.username as |error|}}\n      <div class=\"error\">\n        {{error.message}}\n      </div>\n    {{/each}}\n\n    <label>Email: <Input @value={{@model.email}} /> </label>\n    {{#each @model.errors.email as |error|}}\n      <div class=\"error\">\n        {{error.message}}\n      </div>\n    {{/each}}\n    ```\n\n    You can also access the special `messages` property on the error\n    object to get an array of all the error strings.\n\n    ```handlebars\n    {{#each @model.errors.messages as |message|}}\n      <div class=\"error\">\n        {{message}}\n      </div>\n    {{/each}}\n    ```\n\n    @class Errors\n    @public\n    @extends Ember.ArrayProxy\n   */\n  let Errors = (_dec$1 = EmberObject.computed(), _dec2 = computed.mapBy('content', 'message'), _dec3 = EmberObject.computed(), _dec4 = computed.not('length'), _class$6 = class Errors extends ArrayProxyWithCustomOverrides {\n    constructor() {\n      super(...arguments);\n      /**\n        An array containing all of the error messages for this\n        record. This is useful for displaying all errors to the user.\n         ```handlebars\n        {{#each @model.errors.messages as |message|}}\n          <div class=\"error\">\n            {{message}}\n          </div>\n        {{/each}}\n        ```\n         @property messages\n        @public\n        @type {Array}\n      */\n      _initializerDefineProperty$5(this, \"messages\", _descriptor$5, this);\n      /**\n        Total number of errors.\n         @property length\n        @type {Number}\n        @public\n        @readOnly\n      */\n      /**\n        `true` if we have no errors.\n         @property isEmpty\n        @type {Boolean}\n        @public\n        @readOnly\n      */\n      _initializerDefineProperty$5(this, \"isEmpty\", _descriptor2$2, this);\n    }\n    /**\n      @property errorsByAttributeName\n      @type {MapWithDefault}\n      @private\n    */\n    get errorsByAttributeName() {\n      return new Map();\n    }\n\n    /**\n      Returns errors for a given attribute\n       ```javascript\n      let user = store.createRecord('user', {\n        username: 'tomster',\n        email: 'invalidEmail'\n      });\n      user.save().catch(function(){\n        user.errors.errorsFor('email'); // returns:\n        // [{attribute: \"email\", message: \"Doesn't look like a valid email.\"}]\n      });\n      ```\n       @method errorsFor\n      @public\n      @param {String} attribute\n      @return {Array}\n    */\n    errorsFor(attribute) {\n      let map = this.errorsByAttributeName;\n      let errors = map.get(attribute);\n      if (errors === undefined) {\n        errors = ArrayMixin.A();\n        map.set(attribute, errors);\n      }\n\n      // Errors may be a native array with extensions turned on. Since we access\n      // the array via a method, and not a computed or using `Ember.get`, it does\n      // not entangle properly with autotracking, so we entangle manually by\n      // getting the `[]` property.\n      EmberObject.get(errors, '[]');\n      return errors;\n    }\n    /**\n      @property content\n      @type {Array}\n      @private\n    */\n    get content() {\n      return ArrayMixin.A();\n    }\n\n    /**\n      @method unknownProperty\n      @private\n    */\n    unknownProperty(attribute) {\n      let errors = this.errorsFor(attribute);\n      if (errors.length === 0) {\n        return undefined;\n      }\n      return errors;\n    }\n    /**\n     Manually adds errors to the record. This will trigger the `becameInvalid` event/ lifecycle method on\n      the record and transition the record into an `invalid` state.\n      Example\n     ```javascript\n      let errors = user.errors;\n       // add multiple errors\n      errors.add('password', [\n        'Must be at least 12 characters',\n        'Must contain at least one symbol',\n        'Cannot contain your name'\n      ]);\n       errors.errorsFor('password');\n      // =>\n      // [\n      //   { attribute: 'password', message: 'Must be at least 12 characters' },\n      //   { attribute: 'password', message: 'Must contain at least one symbol' },\n      //   { attribute: 'password', message: 'Cannot contain your name' },\n      // ]\n       // add a single error\n      errors.add('username', 'This field is required');\n       errors.errorsFor('username');\n      // =>\n      // [\n      //   { attribute: 'username', message: 'This field is required' },\n      // ]\n     ```\n      @method add\n      @public\n      @param {string} attribute - the property name of an attribute or relationship\n      @param {string[]|string} messages - an error message or array of error messages for the attribute\n     */\n    add(attribute, messages) {\n      const errors = this._findOrCreateMessages(attribute, messages);\n      this.addObjects(errors);\n      this.errorsFor(attribute).addObjects(errors);\n      this.__record.currentState.notify('isValid');\n      this.notifyPropertyChange(attribute);\n    }\n\n    /**\n      @method _findOrCreateMessages\n      @private\n    */\n    _findOrCreateMessages(attribute, messages) {\n      let errors = this.errorsFor(attribute);\n      let messagesArray = Array.isArray(messages) ? messages : [messages];\n      let _messages = new Array(messagesArray.length);\n      for (let i = 0; i < messagesArray.length; i++) {\n        let message = messagesArray[i];\n        let err = errors.findBy('message', message);\n        if (err) {\n          _messages[i] = err;\n        } else {\n          _messages[i] = {\n            attribute: attribute,\n            message\n          };\n        }\n      }\n      return _messages;\n    }\n\n    /**\n     Manually removes all errors for a given member from the record.\n       This will transition the record into a `valid` state, and\n      triggers the `becameValid` event and lifecycle method.\n      Example:\n      ```javascript\n      let errors = user.errors;\n      errors.add('phone', ['error-1', 'error-2']);\n       errors.errorsFor('phone');\n      // =>\n      // [\n      //   { attribute: 'phone', message: 'error-1' },\n      //   { attribute: 'phone', message: 'error-2' },\n      // ]\n       errors.remove('phone');\n       errors.errorsFor('phone');\n      // => undefined\n     ```\n     @method remove\n      @public\n     @param {string} member - the property name of an attribute or relationship\n     */\n    remove(attribute) {\n      if (this.isEmpty) {\n        return;\n      }\n      let content = this.rejectBy('attribute', attribute);\n      this.content.setObjects(content);\n\n      // Although errorsByAttributeName.delete is technically enough to sync errors state, we also\n      // must mutate the array as well for autotracking\n      let errors = this.errorsFor(attribute);\n      for (let i = 0; i < errors.length; i++) {\n        if (errors[i].attribute === attribute) {\n          // .replace from Ember.NativeArray is necessary. JS splice will not work.\n          errors.replace(i, 1);\n        }\n      }\n      this.errorsByAttributeName.delete(attribute);\n      this.__record.currentState.notify('isValid');\n      this.notifyPropertyChange(attribute);\n      this.notifyPropertyChange('length');\n    }\n\n    /**\n     Manually clears all errors for the record.\n       This will transition the record into a `valid` state, and\n       will trigger the `becameValid` event and lifecycle method.\n     Example:\n      ```javascript\n     let errors = user.errors;\n     errors.add('username', ['error-a']);\n     errors.add('phone', ['error-1', 'error-2']);\n      errors.errorsFor('username');\n     // =>\n     // [\n     //   { attribute: 'username', message: 'error-a' },\n     // ]\n      errors.errorsFor('phone');\n     // =>\n     // [\n     //   { attribute: 'phone', message: 'error-1' },\n     //   { attribute: 'phone', message: 'error-2' },\n     // ]\n      errors.clear();\n      errors.errorsFor('username');\n     // => undefined\n      errors.errorsFor('phone');\n     // => undefined\n      errors.messages\n     // => []\n     ```\n     @method clear\n     @public\n     */\n    clear() {\n      if (this.isEmpty) {\n        return;\n      }\n      let errorsByAttributeName = this.errorsByAttributeName;\n      let attributes = [];\n      errorsByAttributeName.forEach(function (_, attribute) {\n        attributes.push(attribute);\n      });\n      errorsByAttributeName.clear();\n      attributes.forEach(attribute => {\n        this.notifyPropertyChange(attribute);\n      });\n      this.__record.currentState.notify('isValid');\n      super.clear();\n    }\n\n    /**\n      Checks if there are error messages for the given attribute.\n       ```app/controllers/user/edit.js\n      import Controller from '@ember/controller';\n      import { action } from '@ember/object';\n       export default class UserEditController extends Controller {\n        @action\n        save(user) {\n          if (user.errors.has('email')) {\n            return alert('Please update your email before attempting to save.');\n          }\n          user.save();\n        }\n      }\n      ```\n       @method has\n      @public\n      @param {String} attribute\n      @return {Boolean} true if there some errors on given attribute\n    */\n    has(attribute) {\n      return this.errorsFor(attribute).length > 0;\n    }\n  }, _applyDecoratedDescriptor$6(_class$6.prototype, \"errorsByAttributeName\", [_dec$1], Object.getOwnPropertyDescriptor(_class$6.prototype, \"errorsByAttributeName\"), _class$6.prototype), _descriptor$5 = _applyDecoratedDescriptor$6(_class$6.prototype, \"messages\", [_dec2], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _applyDecoratedDescriptor$6(_class$6.prototype, \"content\", [_dec3], Object.getOwnPropertyDescriptor(_class$6.prototype, \"content\"), _class$6.prototype), _descriptor2$2 = _applyDecoratedDescriptor$6(_class$6.prototype, \"isEmpty\", [_dec4], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class$6);\n\n  function iterateData(data, fn) {\n    if (Array.isArray(data)) {\n      return data.map(fn);\n    } else {\n      return fn(data);\n    }\n  }\n  function assertIdentifierHasId(identifier) {\n    (!(identifier.id !== null) && debug.assert(`Attempted to schedule a fetch for a record without an id.`, identifier.id !== null));\n  }\n  function normalizeResponseHelper(serializer, store, modelClass, payload, id, requestType) {\n    let normalizedResponse = serializer ? serializer.normalizeResponse(store, modelClass, payload, id, requestType) : payload;\n    validateDocumentStructure(normalizedResponse);\n    return normalizedResponse;\n  }\n  function validateDocumentStructure(doc) {\n    if (runtime.macroCondition(true)) {\n      let errors = [];\n      if (!doc || typeof doc !== 'object') {\n        errors.push('Top level of a JSON API document must be an object');\n      } else {\n        if (!('data' in doc) && !('errors' in doc) && !('meta' in doc)) {\n          errors.push('One or more of the following keys must be present: \"data\", \"errors\", \"meta\".');\n        } else {\n          if ('data' in doc && 'errors' in doc) {\n            errors.push('Top level keys \"errors\" and \"data\" cannot both be present in a JSON API document');\n          }\n        }\n        if ('data' in doc) {\n          if (!(doc.data === null || Array.isArray(doc.data) || typeof doc.data === 'object')) {\n            errors.push('data must be null, an object, or an array');\n          }\n        }\n        if ('meta' in doc) {\n          if (typeof doc.meta !== 'object') {\n            errors.push('meta must be an object');\n          }\n        }\n        if ('errors' in doc) {\n          if (!Array.isArray(doc.errors)) {\n            errors.push('errors must be an array');\n          }\n        }\n        if ('links' in doc) {\n          if (typeof doc.links !== 'object') {\n            errors.push('links must be an object');\n          }\n        }\n        if ('jsonapi' in doc) {\n          if (typeof doc.jsonapi !== 'object') {\n            errors.push('jsonapi must be an object');\n          }\n        }\n        if ('included' in doc) {\n          if (typeof doc.included !== 'object') {\n            errors.push('included must be an array');\n          }\n        }\n      }\n      (!(errors.length === 0) && debug.assert(`Response must be normalized to a valid JSON API document:\\n\\t* ${errors.join('\\n\\t* ')}`, errors.length === 0));\n    }\n  }\n\n  function _findHasMany(adapter, store, identifier, link, relationship, options) {\n    const record = store._instanceCache.getRecord(identifier);\n    const snapshot = store._instanceCache.createSnapshot(identifier, options);\n    let modelClass = store.modelFor(relationship.type);\n    let useLink = !link || typeof link === 'string';\n    let relatedLink = useLink ? link : link.href;\n    let promise = adapter.findHasMany(store, snapshot, relatedLink, relationship);\n    let label = `DS: Handle Adapter#findHasMany of '${identifier.type}' : '${relationship.type}'`;\n    promise = guardDestroyedStore(promise, store, label);\n    promise = promise.then(adapterPayload => {\n      if (!_objectIsAlive(record)) {\n        if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_RSVP_PROMISE)) {\n          (debug.deprecate(`A Promise for fetching ${relationship.type} did not resolve by the time your model was destroyed. This will error in a future release.`, false, {\n            id: 'ember-data:rsvp-unresolved-async',\n            until: '5.0',\n            for: '@ember-data/store',\n            since: {\n              available: '4.5',\n              enabled: '4.5'\n            }\n          }));\n        }\n      }\n      (!(payloadIsNotBlank(adapterPayload)) && debug.assert(`You made a 'findHasMany' request for a ${identifier.type}'s '${relationship.key}' relationship, using link '${link}' , but the adapter's response did not have any data`, payloadIsNotBlank(adapterPayload)));\n      let serializer = store.serializerFor(relationship.type);\n      let payload = normalizeResponseHelper(serializer, store, modelClass, adapterPayload, null, 'findHasMany');\n      (!('data' in payload && Array.isArray(payload.data)) && debug.assert(`fetched the hasMany relationship '${relationship.name}' for ${identifier.type}:${identifier.id} with link '${link}', but no data member is present in the response. If no data exists, the response should set { data: [] }`, 'data' in payload && Array.isArray(payload.data)));\n      payload = syncRelationshipDataFromLink(store, payload, identifier, relationship);\n      return store._push(payload);\n    }, null, `DS: Extract payload of '${identifier.type}' : hasMany '${relationship.type}'`);\n    if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_RSVP_PROMISE)) {\n      promise = _guard(promise, _bind(_objectIsAlive, record));\n    }\n    return promise;\n  }\n  function _findBelongsTo(store, identifier, link, relationship, options) {\n    const record = store._instanceCache.getRecord(identifier);\n    let adapter = store.adapterFor(identifier.type);\n    (!(adapter) && debug.assert(`You tried to load a belongsTo relationship but you have no adapter (for ${identifier.type})`, adapter));\n    (!(typeof adapter.findBelongsTo === 'function') && debug.assert(`You tried to load a belongsTo relationship from a specified 'link' in the original payload but your adapter does not implement 'findBelongsTo'`, typeof adapter.findBelongsTo === 'function'));\n    let snapshot = store._instanceCache.createSnapshot(identifier, options);\n    let modelClass = store.modelFor(relationship.type);\n    let useLink = !link || typeof link === 'string';\n    let relatedLink = useLink ? link : link.href;\n    let promise = adapter.findBelongsTo(store, snapshot, relatedLink, relationship);\n    let label = `DS: Handle Adapter#findBelongsTo of ${identifier.type} : ${relationship.type}`;\n    promise = guardDestroyedStore(promise, store, label);\n    promise = _guard(promise, _bind(_objectIsAlive, record));\n    promise = promise.then(adapterPayload => {\n      if (!_objectIsAlive(record)) {\n        if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_RSVP_PROMISE)) {\n          (debug.deprecate(`A Promise for fetching ${relationship.type} did not resolve by the time your model was destroyed. This will error in a future release.`, false, {\n            id: 'ember-data:rsvp-unresolved-async',\n            until: '5.0',\n            for: '@ember-data/store',\n            since: {\n              available: '4.5',\n              enabled: '4.5'\n            }\n          }));\n        }\n      }\n      let serializer = store.serializerFor(relationship.type);\n      let payload = normalizeResponseHelper(serializer, store, modelClass, adapterPayload, null, 'findBelongsTo');\n      (!('data' in payload && (payload.data === null || typeof payload.data === 'object' && !Array.isArray(payload.data))) && debug.assert(`fetched the belongsTo relationship '${relationship.name}' for ${identifier.type}:${identifier.id} with link '${link}', but no data member is present in the response. If no data exists, the response should set { data: null }`, 'data' in payload && (payload.data === null || typeof payload.data === 'object' && !Array.isArray(payload.data))));\n      if (!payload.data && !payload.links && !payload.meta) {\n        return null;\n      }\n      payload = syncRelationshipDataFromLink(store, payload, identifier, relationship);\n      return store._push(payload);\n    }, null, `DS: Extract payload of ${identifier.type} : ${relationship.type}`);\n    if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_RSVP_PROMISE)) {\n      promise = _guard(promise, _bind(_objectIsAlive, record));\n    }\n    return promise;\n  }\n\n  // sync\n  // iterate over records in payload.data\n  // for each record\n  //   assert that record.relationships[inverse] is either undefined (so we can fix it)\n  //     or provide a data: {id, type} that matches the record that requested it\n  //   return the relationship data for the parent\n  function syncRelationshipDataFromLink(store, payload, parentIdentifier, relationship) {\n    // ensure the right hand side (incoming payload) points to the parent record that\n    // requested this relationship\n    let relationshipData = payload.data ? iterateData(payload.data, (data, index) => {\n      const {\n        id,\n        type\n      } = data;\n      ensureRelationshipIsSetToParent(data, parentIdentifier, store, relationship, index);\n      return {\n        id,\n        type\n      };\n    }) : null;\n    const relatedDataHash = {};\n    if ('meta' in payload) {\n      relatedDataHash.meta = payload.meta;\n    }\n    if ('links' in payload) {\n      relatedDataHash.links = payload.links;\n    }\n    if ('data' in payload) {\n      relatedDataHash.data = relationshipData;\n    }\n\n    // now, push the left hand side (the parent record) to ensure things are in sync, since\n    // the payload will be pushed with store._push\n    const parentPayload = {\n      id: parentIdentifier.id,\n      type: parentIdentifier.type,\n      relationships: {\n        [relationship.key]: relatedDataHash\n      }\n    };\n    if (!Array.isArray(payload.included)) {\n      payload.included = [];\n    }\n    payload.included.push(parentPayload);\n    return payload;\n  }\n  function ensureRelationshipIsSetToParent(payload, parentIdentifier, store, parentRelationship, index) {\n    let {\n      id,\n      type\n    } = payload;\n    if (!payload.relationships) {\n      payload.relationships = {};\n    }\n    let {\n      relationships\n    } = payload;\n    let inverse = getInverse(store, parentIdentifier, parentRelationship, type);\n    if (inverse) {\n      let {\n        inverseKey,\n        kind\n      } = inverse;\n      let relationshipData = relationships[inverseKey] && relationships[inverseKey].data;\n      if (runtime.macroCondition(true)) {\n        if (typeof relationshipData !== 'undefined' && !relationshipDataPointsToParent(relationshipData, parentIdentifier)) {\n          let inspect = function inspect(thing) {\n            return `'${JSON.stringify(thing)}'`;\n          };\n          let quotedType = inspect(type);\n          let quotedInverse = inspect(inverseKey);\n          let expected = inspect({\n            id: parentIdentifier.id,\n            type: parentIdentifier.type\n          });\n          let expectedModel = `${parentIdentifier.type}:${parentIdentifier.id}`;\n          let got = inspect(relationshipData);\n          let prefix = typeof index === 'number' ? `data[${index}]` : `data`;\n          let path = `${prefix}.relationships.${inverseKey}.data`;\n          let other = relationshipData ? `<${relationshipData.type}:${relationshipData.id}>` : null;\n          let relationshipFetched = `${expectedModel}.${parentRelationship.kind}(\"${parentRelationship.name}\")`;\n          let includedRecord = `<${type}:${id}>`;\n          let message = [`Encountered mismatched relationship: Ember Data expected ${path} in the payload from ${relationshipFetched} to include ${expected} but got ${got} instead.\\n`, `The ${includedRecord} record loaded at ${prefix} in the payload specified ${other} as its ${quotedInverse}, but should have specified ${expectedModel} (the record the relationship is being loaded from) as its ${quotedInverse} instead.`, `This could mean that the response for ${relationshipFetched} may have accidentally returned ${quotedType} records that aren't related to ${expectedModel} and could be related to a different ${parentIdentifier.type} record instead.`, `Ember Data has corrected the ${includedRecord} record's ${quotedInverse} relationship to ${expectedModel} so that ${relationshipFetched} will include ${includedRecord}.`, `Please update the response from the server or change your serializer to either ensure that the response for only includes ${quotedType} records that specify ${expectedModel} as their ${quotedInverse}, or omit the ${quotedInverse} relationship from the response.`].join('\\n');\n          (debug.assert(message));\n        }\n      }\n      if (kind !== 'hasMany' || typeof relationshipData !== 'undefined') {\n        relationships[inverseKey] = relationships[inverseKey] || {};\n        relationships[inverseKey].data = fixRelationshipData(relationshipData, kind, parentIdentifier);\n      }\n    }\n  }\n  function metaIsRelationshipDefinition(meta) {\n    return typeof meta._inverseKey === 'function';\n  }\n  function inverseForRelationship(store, identifier, key) {\n    const definition = store.getSchemaDefinitionService().relationshipsDefinitionFor(identifier)[key];\n    if (!definition) {\n      return null;\n    }\n    if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_RELATIONSHIPS_WITHOUT_INVERSE)) {\n      if (metaIsRelationshipDefinition(definition)) {\n        const modelClass = store.modelFor(identifier.type);\n        return definition._inverseKey(store, modelClass);\n      }\n    }\n    (!(definition.options?.inverse === null || typeof definition.options?.inverse === 'string' && definition.options.inverse.length > 0) && debug.assert(`Expected the relationship defintion to specify the inverse type or null.`, definition.options?.inverse === null || typeof definition.options?.inverse === 'string' && definition.options.inverse.length > 0));\n    return definition.options.inverse;\n  }\n  function getInverse(store, parentIdentifier, parentRelationship, type) {\n    let {\n      name: lhs_relationshipName\n    } = parentRelationship;\n    let {\n      type: parentType\n    } = parentIdentifier;\n    let inverseKey = inverseForRelationship(store, {\n      type: parentType\n    }, lhs_relationshipName);\n    if (inverseKey) {\n      const definition = store.getSchemaDefinitionService().relationshipsDefinitionFor({\n        type\n      });\n      let {\n        kind\n      } = definition[inverseKey];\n      return {\n        inverseKey,\n        kind\n      };\n    }\n  }\n  function relationshipDataPointsToParent(relationshipData, identifier) {\n    if (relationshipData === null) {\n      return false;\n    }\n    if (Array.isArray(relationshipData)) {\n      if (relationshipData.length === 0) {\n        return false;\n      }\n      for (let i = 0; i < relationshipData.length; i++) {\n        let entry = relationshipData[i];\n        if (validateRelationshipEntry(entry, identifier)) {\n          return true;\n        }\n      }\n    } else {\n      return validateRelationshipEntry(relationshipData, identifier);\n    }\n    return false;\n  }\n  function fixRelationshipData(relationshipData, relationshipKind, _ref) {\n    let {\n      id,\n      type\n    } = _ref;\n    let parentRelationshipData = {\n      id,\n      type\n    };\n    let payload;\n    if (relationshipKind === 'hasMany') {\n      payload = relationshipData || [];\n      if (relationshipData) {\n        // these arrays could be massive so this is better than filter\n        // Note: this is potentially problematic if type/id are not in the\n        // same state of normalization.\n        let found = relationshipData.find(v => {\n          return v.type === parentRelationshipData.type && v.id === parentRelationshipData.id;\n        });\n        if (!found) {\n          payload.push(parentRelationshipData);\n        }\n      } else {\n        payload.push(parentRelationshipData);\n      }\n    } else {\n      payload = relationshipData || {};\n      Object.assign(payload, parentRelationshipData);\n    }\n    return payload;\n  }\n  function validateRelationshipEntry(_ref2, _ref3) {\n    let {\n      id\n    } = _ref2;\n    let {\n      id: parentModelID\n    } = _ref3;\n    return id && id.toString() === parentModelID;\n  }\n  function _bind(fn) {\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n    return function () {\n      return fn.apply(undefined, args);\n    };\n  }\n  function _guard(promise, test) {\n    let guarded = promise.finally(() => {\n      if (!test()) {\n        guarded._subscribers.length = 0;\n      }\n    });\n    return guarded;\n  }\n  function _objectIsAlive(object) {\n    return !(object.isDestroyed || object.isDestroying);\n  }\n  function payloadIsNotBlank(adapterPayload) {\n    if (Array.isArray(adapterPayload)) {\n      return true;\n    } else {\n      return Object.keys(adapterPayload || {}).length;\n    }\n  }\n  function guardDestroyedStore(promise, store, label) {\n    let token;\n    if (runtime.macroCondition(true)) {\n      token = store._trackAsyncRequestStart(label);\n    }\n    let wrapperPromise = rsvp.resolve(promise, label).then(_v => {\n      if (!_objectIsAlive(store)) {\n        if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_RSVP_PROMISE)) {\n          (debug.deprecate(`A Promise did not resolve by the time the store was destroyed. This will error in a future release.`, false, {\n            id: 'ember-data:rsvp-unresolved-async',\n            until: '5.0',\n            for: '@ember-data/store',\n            since: {\n              available: '4.5',\n              enabled: '4.5'\n            }\n          }));\n        }\n      }\n      return promise;\n    });\n    return _guard(wrapperPromise, () => {\n      if (runtime.macroCondition(true)) {\n        store._trackAsyncRequestEnd(token);\n      }\n      return _objectIsAlive(store);\n    });\n  }\n\n  /**\n    A `ManyArray` is a `MutableArray` that represents the contents of a has-many\n    relationship.\n\n    The `ManyArray` is instantiated lazily the first time the relationship is\n    requested.\n\n    This class is not intended to be directly instantiated by consuming applications.\n\n    ### Inverses\n\n    Often, the relationships in Ember Data applications will have\n    an inverse. For example, imagine the following models are\n    defined:\n\n    ```app/models/post.js\n    import Model, { hasMany } from '@ember-data/model';\n\n    export default class PostModel extends Model {\n      @hasMany('comment') comments;\n    }\n    ```\n\n    ```app/models/comment.js\n    import Model, { belongsTo } from '@ember-data/model';\n\n    export default class CommentModel extends Model {\n      @belongsTo('post') post;\n    }\n    ```\n\n    If you created a new instance of `Post` and added\n    a `Comment` record to its `comments` has-many\n    relationship, you would expect the comment's `post`\n    property to be set to the post that contained\n    the has-many.\n\n    We call the record to which a relationship belongs-to the\n    relationship's _owner_.\n\n    @class ManyArray\n    @public\n  */\n  class RelatedCollection extends Private.RecordArray {\n    /**\n      The loading state of this array\n       @property {Boolean} isLoaded\n      @public\n      */\n\n    /**\n      `true` if the relationship is polymorphic, `false` otherwise.\n       @property {Boolean} isPolymorphic\n      @private\n      */\n\n    /**\n      Metadata associated with the request for async hasMany relationships.\n       Example\n       Given that the server returns the following JSON payload when fetching a\n      hasMany relationship:\n       ```js\n      {\n        \"comments\": [{\n          \"id\": 1,\n          \"comment\": \"This is the first comment\",\n        }, {\n      // ...\n        }],\n         \"meta\": {\n          \"page\": 1,\n          \"total\": 5\n        }\n      }\n      ```\n       You can then access the meta data via the `meta` property:\n       ```js\n      let comments = await post.comments;\n      let meta = comments.meta;\n       // meta.page => 1\n      // meta.total => 5\n      ```\n       @property {Object | null} meta\n      @public\n      */\n\n    /**\n       * Retrieve the links for this relationship\n       *\n       @property {Object | null} links\n       @public\n       */\n\n    // @ts-expect-error\n\n    constructor(options) {\n      super(options);\n      this.isLoaded = options.isLoaded || false;\n      this.isAsync = options.isAsync || false;\n      this.isPolymorphic = options.isPolymorphic || false;\n      this.identifier = options.identifier;\n      this.key = options.key;\n    }\n    [Private.MUTATE](prop, args, result) {\n      switch (prop) {\n        case 'length 0':\n          {\n            this._manager.updateCache({\n              op: 'replaceRelatedRecords',\n              record: this.identifier,\n              field: this.key,\n              value: []\n            });\n            break;\n          }\n        case 'replace cell':\n          {\n            const [index, prior, value] = args;\n            this._manager.updateCache({\n              op: 'replaceRelatedRecord',\n              record: this.identifier,\n              field: this.key,\n              value,\n              prior,\n              index\n            });\n            break;\n          }\n        case 'push':\n          this._manager.updateCache({\n            op: 'addToRelatedRecords',\n            record: this.identifier,\n            field: this.key,\n            value: extractIdentifiersFromRecords(args)\n          });\n          break;\n        case 'pop':\n          if (result) {\n            this._manager.updateCache({\n              op: 'removeFromRelatedRecords',\n              record: this.identifier,\n              field: this.key,\n              value: Private.recordIdentifierFor(result)\n            });\n          }\n          break;\n        case 'unshift':\n          this._manager.updateCache({\n            op: 'addToRelatedRecords',\n            record: this.identifier,\n            field: this.key,\n            value: extractIdentifiersFromRecords(args),\n            index: 0\n          });\n          break;\n        case 'shift':\n          if (result) {\n            this._manager.updateCache({\n              op: 'removeFromRelatedRecords',\n              record: this.identifier,\n              field: this.key,\n              value: Private.recordIdentifierFor(result),\n              index: 0\n            });\n          }\n          break;\n        case 'sort':\n          this._manager.updateCache({\n            op: 'sortRelatedRecords',\n            record: this.identifier,\n            field: this.key,\n            value: result.map(Private.recordIdentifierFor)\n          });\n          break;\n        case 'splice':\n          {\n            const [start, removeCount, ...adds] = args;\n            // detect a full replace\n            if (removeCount > 0 && adds.length === this[Private.SOURCE].length) {\n              this._manager.updateCache({\n                op: 'replaceRelatedRecords',\n                record: this.identifier,\n                field: this.key,\n                value: extractIdentifiersFromRecords(adds)\n              });\n              return;\n            }\n            if (removeCount > 0) {\n              this._manager.updateCache({\n                op: 'removeFromRelatedRecords',\n                record: this.identifier,\n                field: this.key,\n                value: result.map(Private.recordIdentifierFor),\n                index: start\n              });\n            }\n            if (adds?.length) {\n              this._manager.updateCache({\n                op: 'addToRelatedRecords',\n                record: this.identifier,\n                field: this.key,\n                value: extractIdentifiersFromRecords(adds),\n                index: start\n              });\n            }\n            break;\n          }\n        default:\n          (debug.assert(`unable to convert ${prop} into a transaction that updates the cache state for this record array`));\n      }\n    }\n    notify() {\n      const tag = this[Private.IDENTIFIER_ARRAY_TAG];\n      tag.shouldReset = true;\n      // @ts-expect-error\n      Private.notifyArray(this);\n    }\n\n    /**\n      Reloads all of the records in the manyArray. If the manyArray\n      holds a relationship that was originally fetched using a links url\n      Ember Data will revisit the original links url to repopulate the\n      relationship.\n       If the manyArray holds the result of a `store.query()` reload will\n      re-run the original query.\n       Example\n       ```javascript\n      let user = store.peekRecord('user', '1')\n      await login(user);\n       let permissions = await user.permissions;\n      await permissions.reload();\n      ```\n       @method reload\n      @public\n    */\n    reload(options) {\n      // TODO this is odd, we don't ask the store for anything else like this?\n      return this._manager.reloadHasMany(this.key, options);\n    }\n\n    /**\n      Saves all of the records in the `ManyArray`.\n       Example\n       ```javascript\n      let inbox = await store.findRecord('inbox', '1');\n      let messages = await inbox.messages;\n      messages.forEach((message) => {\n        message.isRead = true;\n      });\n      messages.save();\n      ```\n       @method save\n      @public\n      @return {PromiseArray} promise\n    */\n\n    /**\n      Create a child record within the owner\n       @method createRecord\n      @public\n      @param {Object} hash\n      @return {Model} record\n    */\n    createRecord(hash) {\n      const {\n        store\n      } = this;\n      const record = store.createRecord(this.modelName, hash);\n      this.push(record);\n      return record;\n    }\n  }\n  RelatedCollection.prototype.isAsync = false;\n  RelatedCollection.prototype.isPolymorphic = false;\n  RelatedCollection.prototype.identifier = null;\n  RelatedCollection.prototype.recordData = null;\n  RelatedCollection.prototype._inverseIsAsync = false;\n  RelatedCollection.prototype.key = '';\n  RelatedCollection.prototype.DEPRECATED_CLASS_NAME = 'ManyArray';\n  function assertRecordPassedToHasMany(record) {\n    (!(function () {\n      try {\n        Private.recordIdentifierFor(record);\n        return true;\n      } catch {\n        return false;\n      }\n    }()) && debug.assert(`All elements of a hasMany relationship must be instances of Model, you passed $${typeof record}`, function () {\n      try {\n        Private.recordIdentifierFor(record);\n        return true;\n      } catch {\n        return false;\n      }\n    }()));\n  }\n  function extractIdentifiersFromRecords(records) {\n    return records.map(extractIdentifierFromRecord$1);\n  }\n  function extractIdentifierFromRecord$1(recordOrPromiseRecord) {\n    if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_PROMISE_PROXIES)) {\n      if (isPromiseRecord$1(recordOrPromiseRecord)) {\n        let content = recordOrPromiseRecord.content;\n        (!(content !== undefined && content !== null) && debug.assert('You passed in a promise that did not originate from an EmberData relationship. You can only pass promises that come from a belongsTo relationship.', content !== undefined && content !== null));\n        (debug.deprecate(`You passed in a PromiseProxy to a Relationship API that now expects a resolved value. await the value before setting it.`, false, {\n          id: 'ember-data:deprecate-promise-proxies',\n          until: '5.0',\n          since: {\n            enabled: '4.7',\n            available: '4.7'\n          },\n          for: 'ember-data'\n        }));\n        assertRecordPassedToHasMany(content);\n        return Private.recordIdentifierFor(content);\n      }\n    }\n    assertRecordPassedToHasMany(recordOrPromiseRecord);\n    return Private.recordIdentifierFor(recordOrPromiseRecord);\n  }\n  function isPromiseRecord$1(record) {\n    return !!record.then;\n  }\n\n  var _dec, _class$5;\n  function _applyDecoratedDescriptor$5(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n\n  const Extended = PromiseObject;\n\n  /**\n   @module @ember-data/model\n   */\n\n  /**\n    A PromiseBelongsTo is a PromiseObject that also proxies certain method calls\n    to the underlying belongsTo model.\n    Right now we proxy:\n      * `reload()`\n    @class PromiseBelongsTo\n    @extends PromiseObject\n    @private\n  */\n  let PromiseBelongsTo = (_dec = EmberObject.computed(), _class$5 = class PromiseBelongsTo extends Extended {\n    // we don't proxy meta because we would need to proxy it to the relationship state container\n    //  however, meta on relationships does not trigger change notifications.\n    //  if you need relationship meta, you should do `record.belongsTo(relationshipName).meta()`\n    get meta() {\n      // eslint-disable-next-line no-constant-condition\n      {\n        (debug.assert('You attempted to access meta on the promise for the async belongsTo relationship ' + `${this.get('_belongsToState').modelName}:${this.get('_belongsToState').key}'.` + '\\nUse `record.belongsTo(relationshipName).meta()` instead.', false));\n      }\n      return;\n    }\n    async reload(options) {\n      (!(this.content !== undefined) && debug.assert('You are trying to reload an async belongsTo before it has been created', this.content !== undefined));\n      let {\n        key,\n        legacySupport\n      } = this._belongsToState;\n      await legacySupport.reloadBelongsTo(key, options);\n      return this;\n    }\n  }, _applyDecoratedDescriptor$5(_class$5.prototype, \"meta\", [_dec], Object.getOwnPropertyDescriptor(_class$5.prototype, \"meta\"), _class$5.prototype), _class$5);\n\n  var _class$4, _descriptor$4, _descriptor2$1, _descriptor3, _descriptor4, _descriptor5;\n  function _initializerDefineProperty$4(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }\n  function _applyDecoratedDescriptor$4(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }\n\n  /**\n   @module @ember-data/model\n   */\n  /**\n    This class is returned as the result of accessing an async hasMany relationship\n    on an instance of a Model extending from `@ember-data/model`.\n\n    A PromiseManyArray is an iterable proxy that allows templates to consume related\n    ManyArrays and update once their contents are no longer pending.\n\n    In your JS code you should resolve the promise first.\n\n    ```js\n    const comments = await post.comments;\n    ```\n\n    @class PromiseManyArray\n    @public\n  */\n  let PromiseManyArray = (_class$4 = class PromiseManyArray {\n    // @deprecated (isDestroyed is not deprecated)\n\n    constructor(promise, content) {\n      //---- Methods/Properties on ArrayProxy that we will keep as our API\n      _initializerDefineProperty$4(this, \"content\", _descriptor$4, this);\n      //----  Properties/Methods from the PromiseProxyMixin that we will keep as our API\n      /**\n       * Whether the loading promise is still pending\n       *\n       * @property {boolean} isPending\n       * @public\n       */\n      _initializerDefineProperty$4(this, \"isPending\", _descriptor2$1, this);\n      /**\n       * Whether the loading promise rejected\n       *\n       * @property {boolean} isRejected\n       * @public\n       */\n      _initializerDefineProperty$4(this, \"isRejected\", _descriptor3, this);\n      /**\n       * Whether the loading promise succeeded\n       *\n       * @property {boolean} isFulfilled\n       * @public\n       */\n      _initializerDefineProperty$4(this, \"isFulfilled\", _descriptor4, this);\n      /**\n       * Whether the loading promise completed (resolved or rejected)\n       *\n       * @property {boolean} isSettled\n       * @public\n       */\n      _initializerDefineProperty$4(this, \"isSettled\", _descriptor5, this);\n      this._update(promise, content);\n      this.isDestroyed = false;\n      this.isDestroying = false;\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_A_USAGE)) {\n        const meta = Ember__default.default.meta(this);\n        meta.hasMixin = mixin => {\n          (debug.deprecate(`Do not use A() on an EmberData PromiseManyArray`, false, {\n            id: 'ember-data:no-a-with-array-like',\n            until: '5.0',\n            since: {\n              enabled: '4.7',\n              available: '4.7'\n            },\n            for: 'ember-data'\n          })); // @ts-expect-error ArrayMixin is more than a type\n          if (mixin === ArrayMixin.NativeArray || mixin === ArrayMixin__default.default) {\n            return true;\n          }\n          return false;\n        };\n      } else if (runtime.macroCondition(true)) {\n        const meta = Ember__default.default.meta(this);\n        meta.hasMixin = mixin => {\n          (debug.assert(`Do not use A() on an EmberData PromiseManyArray`));\n        };\n      }\n    }\n    /**\n     * Retrieve the length of the content\n     * @property length\n     * @public\n     */\n    get length() {\n      // shouldn't be needed, but ends up being needed\n      // for computed chains even in 4.x\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_COMPUTED_CHAINS)) {\n        this['[]'];\n      }\n      return this.content ? this.content.length : 0;\n    }\n\n    // ember-source < 3.23 (e.g. 3.20 lts)\n    // requires that the tag `'[]'` be notified\n    // on the ArrayProxy in order for `{{#each}}`\n    // to recompute. We entangle the '[]' tag from\n    get '[]'() {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_COMPUTED_CHAINS)) {\n        return this.content?.length && this.content;\n      }\n    }\n\n    /**\n     * Iterate the proxied content. Called by the glimmer iterator in #each\n     * We do not guarantee that forEach will always be available. This\n     * may eventually be made to use Symbol.Iterator once glimmer supports it.\n     *\n     * @method forEach\n     * @param cb\n     * @returns\n     * @private\n     */\n    forEach(cb) {\n      if (this.content && this.length) {\n        this.content.forEach(cb);\n      }\n    }\n\n    /**\n     * Reload the relationship\n     * @method reload\n     * @public\n     * @param options\n     * @returns\n     */\n    reload(options) {\n      (!(this.content) && debug.assert('You are trying to reload an async manyArray before it has been created', this.content));\n      this.content.reload(options);\n      return this;\n    }\n    /**\n     * chain this promise\n     *\n     * @method then\n     * @public\n     * @param success\n     * @param fail\n     * @returns Promise\n     */\n    then(s, f) {\n      return this.promise.then(s, f);\n    }\n\n    /**\n     * catch errors thrown by this promise\n     * @method catch\n     * @public\n     * @param callback\n     * @returns Promise\n     */\n    catch(cb) {\n      return this.promise.catch(cb);\n    }\n\n    /**\n     * run cleanup after this promise completes\n     *\n     * @method finally\n     * @public\n     * @param callback\n     * @returns Promise\n     */\n    finally(cb) {\n      return this.promise.finally(cb);\n    }\n\n    //---- Methods on EmberObject that we should keep\n\n    destroy() {\n      this.isDestroying = true;\n      this.isDestroyed = true;\n      this.content = null;\n      this.promise = null;\n    }\n\n    //---- Methods/Properties on ManyArray that we own and proxy to\n\n    /**\n     * Retrieve the links for this relationship\n     * @property links\n     * @public\n     */\n    get links() {\n      return this.content ? this.content.links : undefined;\n    }\n\n    /**\n     * Retrieve the meta for this relationship\n     * @property meta\n     * @public\n     */\n    get meta() {\n      return this.content ? this.content.meta : undefined;\n    }\n\n    //---- Our own stuff\n\n    _update(promise, content) {\n      if (content !== undefined) {\n        this.content = content;\n      }\n      this.promise = tapPromise(this, promise);\n    }\n    static create(_ref) {\n      let {\n        promise,\n        content\n      } = _ref;\n      return new this(promise, content);\n    }\n  }, _descriptor$4 = _applyDecoratedDescriptor$4(_class$4.prototype, \"content\", [tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return null;\n    }\n  }), _applyDecoratedDescriptor$4(_class$4.prototype, \"length\", [compat.dependentKeyCompat], Object.getOwnPropertyDescriptor(_class$4.prototype, \"length\"), _class$4.prototype), _applyDecoratedDescriptor$4(_class$4.prototype, '[]', [compat.dependentKeyCompat], Object.getOwnPropertyDescriptor(_class$4.prototype, '[]'), _class$4.prototype), _descriptor2$1 = _applyDecoratedDescriptor$4(_class$4.prototype, \"isPending\", [tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return false;\n    }\n  }), _descriptor3 = _applyDecoratedDescriptor$4(_class$4.prototype, \"isRejected\", [tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return false;\n    }\n  }), _descriptor4 = _applyDecoratedDescriptor$4(_class$4.prototype, \"isFulfilled\", [tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return false;\n    }\n  }), _descriptor5 = _applyDecoratedDescriptor$4(_class$4.prototype, \"isSettled\", [tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return false;\n    }\n  }), _applyDecoratedDescriptor$4(_class$4.prototype, \"links\", [compat.dependentKeyCompat], Object.getOwnPropertyDescriptor(_class$4.prototype, \"links\"), _class$4.prototype), _applyDecoratedDescriptor$4(_class$4.prototype, \"meta\", [compat.dependentKeyCompat], Object.getOwnPropertyDescriptor(_class$4.prototype, \"meta\"), _class$4.prototype), _class$4);\n  if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_PROMISE_MANY_ARRAY_BEHAVIORS)) {\n    PromiseManyArray.prototype.createRecord = function createRecord() {\n      (debug.deprecate(`The createRecord method on ember-data's PromiseManyArray is deprecated. await the promise and work with the ManyArray directly.`, false, {\n        id: 'ember-data:deprecate-promise-many-array-behaviors',\n        until: '5.0',\n        since: {\n          enabled: '4.7',\n          available: '4.7'\n        },\n        for: 'ember-data'\n      }));\n      (!(this.content) && debug.assert('You are trying to createRecord on an async manyArray before it has been created', this.content));\n      return this.content.createRecord(...arguments);\n    };\n    Object.defineProperty(PromiseManyArray.prototype, 'firstObject', {\n      get() {\n        (debug.deprecate(`The firstObject property on ember-data's PromiseManyArray is deprecated. await the promise and work with the ManyArray directly.`, false, {\n          id: 'ember-data:deprecate-promise-many-array-behaviors',\n          until: '5.0',\n          since: {\n            enabled: '4.7',\n            available: '4.7'\n          },\n          for: 'ember-data'\n        }));\n        return this.content ? this.content.firstObject : undefined;\n      }\n    });\n    Object.defineProperty(PromiseManyArray.prototype, 'lastObject', {\n      get() {\n        (debug.deprecate(`The lastObject property on ember-data's PromiseManyArray is deprecated. await the promise and work with the ManyArray directly.`, false, {\n          id: 'ember-data:deprecate-promise-many-array-behaviors',\n          until: '5.0',\n          since: {\n            enabled: '4.7',\n            available: '4.7'\n          },\n          for: 'ember-data'\n        }));\n        return this.content ? this.content.lastObject : undefined;\n      }\n    });\n  }\n  function tapPromise(proxy, promise) {\n    proxy.isPending = true;\n    proxy.isSettled = false;\n    proxy.isFulfilled = false;\n    proxy.isRejected = false;\n    return rsvp.resolve(promise).then(content => {\n      proxy.isPending = false;\n      proxy.isFulfilled = true;\n      proxy.isSettled = true;\n      proxy.content = content;\n      return content;\n    }, error => {\n      proxy.isPending = false;\n      proxy.isFulfilled = false;\n      proxy.isRejected = true;\n      proxy.isSettled = true;\n      throw error;\n    });\n  }\n  if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_PROMISE_MANY_ARRAY_BEHAVIORS)) {\n    const EmberObjectMethods = ['addObserver', 'cacheFor', 'decrementProperty', 'get', 'getProperties', 'incrementProperty', 'notifyPropertyChange', 'removeObserver', 'set', 'setProperties', 'toggleProperty'];\n    EmberObjectMethods.forEach(method => {\n      PromiseManyArray.prototype[method] = function delegatedMethod() {\n        (debug.deprecate(`The ${method} method on ember-data's PromiseManyArray is deprecated. await the promise and work with the ManyArray directly.`, false, {\n          id: 'ember-data:deprecate-promise-many-array-behaviors',\n          until: '5.0',\n          since: {\n            enabled: '4.7',\n            available: '4.7'\n          },\n          for: 'ember-data'\n        }));\n        for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n          args[_key] = arguments[_key];\n        }\n        return Ember__default.default[method](this, ...args);\n      };\n    });\n    const InheritedProxyMethods = ['addArrayObserver', 'addObject', 'addObjects', 'any', 'arrayContentDidChange', 'arrayContentWillChange', 'clear', 'compact', 'every', 'filter', 'filterBy', 'find', 'findBy', 'getEach', 'includes', 'indexOf', 'insertAt', 'invoke', 'isAny', 'isEvery', 'lastIndexOf', 'map', 'mapBy',\n    // TODO update RFC to note objectAt was deprecated (forEach was left for iteration)\n    'objectAt', 'objectsAt', 'popObject', 'pushObject', 'pushObjects', 'reduce', 'reject', 'rejectBy', 'removeArrayObserver', 'removeAt', 'removeObject', 'removeObjects', 'replace', 'reverseObjects', 'setEach', 'setObjects', 'shiftObject', 'slice', 'sortBy', 'toArray', 'uniq', 'uniqBy', 'unshiftObject', 'unshiftObjects', 'without'];\n    InheritedProxyMethods.forEach(method => {\n      PromiseManyArray.prototype[method] = function proxiedMethod() {\n        (debug.deprecate(`The ${method} method on ember-data's PromiseManyArray is deprecated. await the promise and work with the ManyArray directly.`, false, {\n          id: 'ember-data:deprecate-promise-many-array-behaviors',\n          until: '5.0',\n          since: {\n            enabled: '4.7',\n            available: '4.7'\n          },\n          for: 'ember-data'\n        }));\n        (!(this.content) && debug.assert(`Cannot call ${method} before content is assigned.`, this.content));\n        return this.content[method](...arguments);\n      };\n    });\n  }\n\n  /*\n    Assert that `addedRecord` has a valid type so it can be added to the\n    relationship of the `record`.\n\n    The assert basically checks if the `addedRecord` can be added to the\n    relationship (specified via `relationshipMeta`) of the `record`.\n\n    This utility should only be used internally, as both record parameters must\n    be stable record identifiers and the `relationshipMeta` needs to be the meta\n    information about the relationship, retrieved via\n    `record.relationshipFor(key)`.\n  */\n  let assertPolymorphicType;\n  if (runtime.macroCondition(true)) {\n    let checkPolymorphic = function checkPolymorphic(modelClass, addedModelClass) {\n      if (modelClass.__isMixin) {\n        return modelClass.__mixin.detect(addedModelClass.PrototypeMixin) ||\n        // handle native class extension e.g. `class Post extends Model.extend(Commentable) {}`\n        modelClass.__mixin.detect(Object.getPrototypeOf(addedModelClass).PrototypeMixin);\n      }\n      return addedModelClass.prototype instanceof modelClass || modelClass.detect(addedModelClass);\n    };\n    assertPolymorphicType = function assertPolymorphicType(parentIdentifier, parentDefinition, addedIdentifier, store) {\n      let asserted = false;\n      if (parentDefinition.inverseIsImplicit) {\n        return;\n      }\n      if (parentDefinition.isPolymorphic) {\n        let meta = store.getSchemaDefinitionService().relationshipsDefinitionFor(addedIdentifier)[parentDefinition.inverseKey];\n        if (meta?.options?.as) {\n          asserted = true;\n          (!(meta.options.as === parentDefinition.type) && debug.assert(`The schema for the relationship '${parentDefinition.inverseKey}' on '${addedIdentifier.type}' type does not implement '${parentDefinition.type}' and thus cannot be assigned to the '${parentDefinition.key}' relationship in '${parentIdentifier.type}'. The definition should specify 'as: \"${parentDefinition.type}\"' in options.`, meta.options.as === parentDefinition.type));\n        }\n      }\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_NON_EXPLICIT_POLYMORPHISM)) {\n        if (!asserted) {\n          store = store._store ? store._store : store; // allow usage with storeWrapper\n          let addedModelName = addedIdentifier.type;\n          let parentModelName = parentIdentifier.type;\n          let key = parentDefinition.key;\n          let relationshipModelName = parentDefinition.type;\n          let relationshipClass = store.modelFor(relationshipModelName);\n          let addedClass = store.modelFor(addedModelName);\n          let assertionMessage = `The '${addedModelName}' type does not implement '${relationshipModelName}' and thus cannot be assigned to the '${key}' relationship in '${parentModelName}'. Make it a descendant of '${relationshipModelName}' or use a mixin of the same name.`;\n          let isPolymorphic = checkPolymorphic(relationshipClass, addedClass);\n          (!(isPolymorphic) && debug.assert(assertionMessage, isPolymorphic));\n        }\n      }\n    };\n  }\n\n  var _class$3, _descriptor$3;\n  function _initializerDefineProperty$3(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }\n  function _applyDecoratedDescriptor$3(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }\n  let cached$2 = runtime.macroCondition(false) ? esc__default.default(require('@glimmer/tracking')).cached : esc__default.default(require('ember-cached-decorator-polyfill')).cached;\n\n  /**\n    @module @ember-data/model\n  */\n\n  function isResourceIdentiferWithRelatedLinks$1(value) {\n    return Boolean(value && value.links && value.links.related);\n  }\n\n  /**\n   A `BelongsToReference` is a low-level API that allows users and\n   addon authors to perform meta-operations on a belongs-to\n   relationship.\n\n   @class BelongsToReference\n   @public\n   */\n  let BelongsToReference = (_class$3 = class BelongsToReference {\n    constructor(store, graph, parentIdentifier, belongsToRelationship, key) {\n      this.___identifier = void 0;\n      // unsubscribe tokens given to us by the notification manager\n      this.___token = void 0;\n      this.___relatedToken = null;\n      _initializerDefineProperty$3(this, \"_ref\", _descriptor$3, this);\n      this.graph = graph;\n      this.key = key;\n      this.belongsToRelationship = belongsToRelationship;\n      this.type = belongsToRelationship.definition.type;\n      this.store = store;\n      this.___identifier = parentIdentifier;\n      this.___token = store._notificationManager.subscribe(parentIdentifier, (_, bucket, notifiedKey) => {\n        if (bucket === 'relationships' && notifiedKey === key) {\n          this._ref++;\n        }\n      });\n\n      // TODO inverse\n    }\n    destroy() {\n      // TODO @feature we need the notification manager often enough\n      // we should potentially just expose it fully public\n      this.store._notificationManager.unsubscribe(this.___token);\n      this.___token = null;\n      if (this.___relatedToken) {\n        this.store._notificationManager.unsubscribe(this.___relatedToken);\n        this.___relatedToken = null;\n      }\n    }\n\n    /**\n     * The identifier of the record that this reference refers to.\n     * `null` if no related record is known.\n     *\n     * @property {StableRecordIdentifier | null} identifier\n     * @public\n     */\n    get identifier() {\n      this._ref; // consume the tracked prop\n      if (this.___relatedToken) {\n        this.store._notificationManager.unsubscribe(this.___relatedToken);\n        this.___relatedToken = null;\n      }\n      let resource = this._resource();\n      if (resource && resource.data) {\n        const identifier = this.store.identifierCache.getOrCreateRecordIdentifier(resource.data);\n        this.___relatedToken = this.store._notificationManager.subscribe(identifier, (_, bucket, notifiedKey) => {\n          if (bucket === 'identity' || bucket === 'attributes' && notifiedKey === 'id') {\n            this._ref++;\n          }\n        });\n        return identifier;\n      }\n      return null;\n    }\n\n    /**\n     The `id` of the record that this reference refers to. Together, the\n     `type()` and `id()` methods form a composite key for the identity\n     map. This can be used to access the id of an async relationship\n     without triggering a fetch that would normally happen if you\n     attempted to use `record.relationship.id`.\n      Example\n      ```javascript\n     // models/blog.js\n     import Model, { belongsTo } from '@ember-data/model';\n      export default class BlogModel extends Model {\n      @belongsTo('user', { async: true, inverse: null }) user;\n     }\n      let blog = store.push({\n        data: {\n          type: 'blog',\n          id: 1,\n          relationships: {\n            user: {\n              data: { type: 'user', id: 1 }\n            }\n          }\n        }\n      });\n     let userRef = blog.belongsTo('user');\n      // get the identifier of the reference\n     if (userRef.remoteType() === \"id\") {\n        let id = userRef.id();\n      }\n     ```\n      @method id\n     @public\n     @return {String} The id of the record in this belongsTo relationship.\n     */\n    id() {\n      return this.identifier?.id || null;\n    }\n\n    /**\n     The link Ember Data will use to fetch or reload this belongs-to\n     relationship. By default it uses only the \"related\" resource linkage.\n      Example\n      ```javascript\n     // models/blog.js\n     import Model, { belongsTo } from '@ember-data/model';\n     export default Model.extend({\n        user: belongsTo('user', { async: true, inverse: null })\n      });\n      let blog = store.push({\n        data: {\n          type: 'blog',\n          id: 1,\n          relationships: {\n            user: {\n              links: {\n                related: '/articles/1/author'\n              }\n            }\n          }\n        }\n      });\n     let userRef = blog.belongsTo('user');\n      // get the identifier of the reference\n     if (userRef.remoteType() === \"link\") {\n        let link = userRef.link();\n      }\n     ```\n      @method link\n     @public\n     @return {String} The link Ember Data will use to fetch or reload this belongs-to relationship.\n     */\n    link() {\n      let resource = this._resource();\n      if (isResourceIdentiferWithRelatedLinks$1(resource)) {\n        if (resource.links) {\n          let related = resource.links.related;\n          return !related || typeof related === 'string' ? related : related.href;\n        }\n      }\n      return null;\n    }\n\n    /**\n     * any links that have been received for this relationship\n     *\n     * @method links\n     * @public\n     * @returns\n     */\n    links() {\n      let resource = this._resource();\n      return resource && resource.links ? resource.links : null;\n    }\n\n    /**\n     The meta data for the belongs-to relationship.\n      Example\n      ```javascript\n     // models/blog.js\n     import Model, { belongsTo } from '@ember-data/model';\n     export default Model.extend({\n        user: belongsTo('user', { async: true, inverse: null })\n      });\n      let blog = store.push({\n        data: {\n          type: 'blog',\n          id: 1,\n          relationships: {\n            user: {\n              links: {\n                related: {\n                  href: '/articles/1/author'\n                },\n              },\n              meta: {\n                lastUpdated: 1458014400000\n              }\n            }\n          }\n        }\n      });\n      let userRef = blog.belongsTo('user');\n      userRef.meta() // { lastUpdated: 1458014400000 }\n     ```\n      @method meta\n      @public\n     @return {Object} The meta information for the belongs-to relationship.\n     */\n    meta() {\n      let meta = null;\n      let resource = this._resource();\n      if (resource && resource.meta && typeof resource.meta === 'object') {\n        meta = resource.meta;\n      }\n      return meta;\n    }\n    _resource() {\n      return this.store._instanceCache.getRecordData(this.___identifier).getRelationship(this.___identifier, this.key);\n    }\n\n    /**\n     This returns a string that represents how the reference will be\n     looked up when it is loaded. If the relationship has a link it will\n     use the \"link\" otherwise it defaults to \"id\".\n      Example\n      ```app/models/post.js\n     import Model, { hasMany } from '@ember-data/model';\n      export default class PostModel extends Model {\n       @hasMany('comment', { async: true, inverse: null }) comments;\n     }\n     ```\n      ```javascript\n     let post = store.push({\n       data: {\n         type: 'post',\n         id: 1,\n         relationships: {\n           comments: {\n             data: [{ type: 'comment', id: 1 }]\n           }\n         }\n       }\n     });\n      let commentsRef = post.hasMany('comments');\n      // get the identifier of the reference\n     if (commentsRef.remoteType() === \"ids\") {\n       let ids = commentsRef.ids();\n     } else if (commentsRef.remoteType() === \"link\") {\n       let link = commentsRef.link();\n     }\n     ```\n      @method remoteType\n     @public\n     @return {String} The name of the remote type. This should either be `link` or `id`\n     */\n    remoteType() {\n      let value = this._resource();\n      if (isResourceIdentiferWithRelatedLinks$1(value)) {\n        return 'link';\n      }\n      return 'id';\n    }\n\n    /**\n     `push` can be used to update the data in the relationship and Ember\n     Data will treat the new data as the canonical value of this\n     relationship on the backend.\n      Example\n      ```app/models/blog.js\n     import Model, { belongsTo } from '@ember-data/model';\n      export default class BlogModel extends Model {\n        @belongsTo('user', { async: true, inverse: null }) user;\n      }\n      let blog = store.push({\n        data: {\n          type: 'blog',\n          id: 1,\n          relationships: {\n            user: {\n              data: { type: 'user', id: 1 }\n            }\n          }\n        }\n      });\n     let userRef = blog.belongsTo('user');\n      // provide data for reference\n     userRef.push({\n        data: {\n          type: 'user',\n          id: 1,\n          attributes: {\n            username: \"@user\"\n          }\n        }\n      }).then(function(user) {\n        userRef.value() === user;\n      });\n     ```\n      @method push\n      @public\n     @param {Object|Promise} objectOrPromise a promise that resolves to a JSONAPI document object describing the new value of this relationship.\n     @return {Promise<record>} A promise that resolves with the new value in this belongs-to relationship.\n     */\n    async push(data) {\n      let jsonApiDoc = data;\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_PROMISE_PROXIES)) {\n        if (data.then) {\n          jsonApiDoc = await rsvp.resolve(data);\n          if (jsonApiDoc !== data) {\n            (debug.deprecate(`You passed in a Promise to a Reference API that now expects a resolved value. await the value before setting it.`, false, {\n              id: 'ember-data:deprecate-promise-proxies',\n              until: '5.0',\n              since: {\n                enabled: '4.7',\n                available: '4.7'\n              },\n              for: 'ember-data'\n            }));\n          }\n        }\n      }\n      let record = this.store.push(jsonApiDoc);\n      if (runtime.macroCondition(true)) {\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n        assertPolymorphicType(this.belongsToRelationship.identifier, this.belongsToRelationship.definition, Private.recordIdentifierFor(record), this.store);\n      }\n      const {\n        identifier\n      } = this.belongsToRelationship;\n      this.store._join(() => {\n        this.graph.push({\n          op: 'replaceRelatedRecord',\n          record: identifier,\n          field: this.key,\n          value: Private.recordIdentifierFor(record)\n        });\n      });\n      return record;\n    }\n\n    /**\n     `value()` synchronously returns the current value of the belongs-to\n     relationship. Unlike `record.relationshipName`, calling\n     `value()` on a reference does not trigger a fetch if the async\n     relationship is not yet loaded. If the relationship is not loaded\n     it will always return `null`.\n      Example\n      ```javascript\n     // models/blog.js\n     import Model, { belongsTo } from '@ember-data/model';\n      export default class BlogModel extends Model {\n       @belongsTo('user', { async: true, inverse: null }) user;\n     }\n      let blog = store.push({\n        data: {\n          type: 'blog',\n          id: 1,\n          relationships: {\n            user: {\n              data: { type: 'user', id: 1 }\n            }\n          }\n        }\n      });\n     let userRef = blog.belongsTo('user');\n      userRef.value(); // null\n      // provide data for reference\n     userRef.push({\n        data: {\n          type: 'user',\n          id: 1,\n          attributes: {\n            username: \"@user\"\n          }\n        }\n      }).then(function(user) {\n        userRef.value(); // user\n      });\n     ```\n      @method value\n      @public\n     @return {Model} the record in this relationship\n     */\n    value() {\n      let resource = this._resource();\n      return resource && resource.data ? this.store.peekRecord(resource.data) : null;\n    }\n\n    /**\n     Loads a record in a belongs-to relationship if it is not already\n     loaded. If the relationship is already loaded this method does not\n     trigger a new load.\n      Example\n      ```javascript\n     // models/blog.js\n     import Model, { belongsTo } from '@ember-data/model';\n      export default class BlogModel extends Model {\n       @belongsTo('user', { async: true, inverse: null }) user;\n     }\n      let blog = store.push({\n        data: {\n          type: 'blog',\n          id: 1,\n          relationships: {\n            user: {\n              data: { type: 'user', id: 1 }\n            }\n          }\n        }\n      });\n     let userRef = blog.belongsTo('user');\n      userRef.value(); // null\n      userRef.load().then(function(user) {\n        userRef.value() === user\n      });\n     ```\n      You may also pass in an options object whose properties will be\n     fed forward. This enables you to pass `adapterOptions` into the\n     request given to the adapter via the reference.\n      Example\n      ```javascript\n     userRef.load({ adapterOptions: { isPrivate: true } }).then(function(user) {\n       userRef.value() === user;\n     });\n     ```\n     ```app/adapters/user.js\n     import Adapter from '@ember-data/adapter';\n      export default class UserAdapter extends Adapter {\n       findRecord(store, type, id, snapshot) {\n         // In the adapter you will have access to adapterOptions.\n         let adapterOptions = snapshot.adapterOptions;\n       }\n     });\n     ```\n      @method load\n      @public\n     @param {Object} options the options to pass in.\n     @return {Promise} a promise that resolves with the record in this belongs-to relationship.\n     */\n    load(options) {\n      const support = LEGACY_SUPPORT.get(this.___identifier);\n      return support.getBelongsTo(this.key, options);\n    }\n\n    /**\n     Triggers a reload of the value in this relationship. If the\n     remoteType is `\"link\"` Ember Data will use the relationship link to\n     reload the relationship. Otherwise it will reload the record by its\n     id.\n      Example\n      ```javascript\n     // models/blog.js\n     import Model, { belongsTo } from '@ember-data/model';\n      export default class BlogModel extends Model {\n       @belongsTo('user', { async: true, inverse: null }) user;\n     }\n      let blog = store.push({\n        data: {\n          type: 'blog',\n          id: 1,\n          relationships: {\n            user: {\n              data: { type: 'user', id: 1 }\n            }\n          }\n        }\n      });\n     let userRef = blog.belongsTo('user');\n      userRef.reload().then(function(user) {\n        userRef.value() === user\n      });\n     ```\n      You may also pass in an options object whose properties will be\n     fed forward. This enables you to pass `adapterOptions` into the\n     request given to the adapter via the reference. A full example\n     can be found in the `load` method.\n      Example\n      ```javascript\n     userRef.reload({ adapterOptions: { isPrivate: true } })\n     ```\n      @method reload\n      @public\n     @param {Object} options the options to pass in.\n     @return {Promise} a promise that resolves with the record in this belongs-to relationship after the reload has completed.\n     */\n    reload(options) {\n      const support = LEGACY_SUPPORT.get(this.___identifier);\n      return support.reloadBelongsTo(this.key, options).then(() => this.value());\n    }\n  }, _descriptor$3 = _applyDecoratedDescriptor$3(_class$3.prototype, \"_ref\", [tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return 0;\n    }\n  }), _applyDecoratedDescriptor$3(_class$3.prototype, \"identifier\", [cached$2, compat.dependentKeyCompat], Object.getOwnPropertyDescriptor(_class$3.prototype, \"identifier\"), _class$3.prototype), _class$3);\n\n  var _class$2, _descriptor$2;\n  function _initializerDefineProperty$2(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }\n  function _applyDecoratedDescriptor$2(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }\n  let cached$1 = runtime.macroCondition(false) ? esc__default.default(require('@glimmer/tracking')).cached : esc__default.default(require('ember-cached-decorator-polyfill')).cached;\n\n  /**\n    @module @ember-data/model\n  */\n\n  function isResourceIdentiferWithRelatedLinks(value) {\n    return Boolean(value && value.links && value.links.related);\n  }\n  /**\n   A `HasManyReference` is a low-level API that allows users and addon\n   authors to perform meta-operations on a has-many relationship.\n\n   @class HasManyReference\n   @public\n   @extends Reference\n   */\n  let HasManyReference = (_class$2 = class HasManyReference {\n    constructor(store, graph, parentIdentifier, hasManyRelationship, key) {\n      // unsubscribe tokens given to us by the notification manager\n      this.___token = void 0;\n      this.___identifier = void 0;\n      this.___relatedTokenMap = void 0;\n      _initializerDefineProperty$2(this, \"_ref\", _descriptor$2, this);\n      this.graph = graph;\n      this.key = key;\n      this.hasManyRelationship = hasManyRelationship;\n      this.type = hasManyRelationship.definition.type;\n      this.store = store;\n      this.___identifier = parentIdentifier;\n      this.___token = store._notificationManager.subscribe(parentIdentifier, (_, bucket, notifiedKey) => {\n        if (bucket === 'relationships' && notifiedKey === key) {\n          this._ref++;\n        }\n      });\n      this.___relatedTokenMap = new Map();\n      // TODO inverse\n    }\n    destroy() {\n      this.store._notificationManager.unsubscribe(this.___token);\n      this.___relatedTokenMap.forEach(token => {\n        this.store._notificationManager.unsubscribe(token);\n      });\n      this.___relatedTokenMap.clear();\n    }\n\n    /**\n     * An array of identifiers for the records that this reference refers to.\n     *\n     * @property {StableRecordIdentifier[]} identifiers\n     * @public\n     */\n    get identifiers() {\n      this._ref; // consume the tracked prop\n\n      let resource = this._resource();\n      let map = this.___relatedTokenMap;\n      this.___relatedTokenMap = new Map();\n      if (resource && resource.data) {\n        return resource.data.map(resourceIdentifier => {\n          const identifier = this.store.identifierCache.getOrCreateRecordIdentifier(resourceIdentifier);\n          let token = map.get(identifier);\n          if (token) {\n            map.delete(identifier);\n          } else {\n            token = this.store._notificationManager.subscribe(identifier, (_, bucket, notifiedKey) => {\n              if (bucket === 'identity' || bucket === 'attributes' && notifiedKey === 'id') {\n                this._ref++;\n              }\n            });\n          }\n          this.___relatedTokenMap.set(identifier, token);\n          return identifier;\n        });\n      }\n      map.forEach(token => {\n        this.store._notificationManager.unsubscribe(token);\n      });\n      map.clear();\n      return [];\n    }\n    _resource() {\n      return this.store._instanceCache.getRecordData(this.___identifier).getRelationship(this.___identifier, this.key);\n    }\n\n    /**\n     This returns a string that represents how the reference will be\n     looked up when it is loaded. If the relationship has a link it will\n     use the \"link\" otherwise it defaults to \"id\".\n      Example\n      ```app/models/post.js\n     import Model, { hasMany } from '@ember-data/model';\n      export default class PostModel extends Model {\n       @hasMany('comment', { async: true, inverse: null }) comments;\n     }\n     ```\n      ```javascript\n     let post = store.push({\n       data: {\n         type: 'post',\n         id: 1,\n         relationships: {\n           comments: {\n             data: [{ type: 'comment', id: 1 }]\n           }\n         }\n       }\n     });\n      let commentsRef = post.hasMany('comments');\n      // get the identifier of the reference\n     if (commentsRef.remoteType() === \"ids\") {\n       let ids = commentsRef.ids();\n     } else if (commentsRef.remoteType() === \"link\") {\n       let link = commentsRef.link();\n     }\n     ```\n      @method remoteType\n     @public\n     @return {String} The name of the remote type. This should either be `link` or `ids`\n     */\n    remoteType() {\n      let value = this._resource();\n      if (value && value.links && value.links.related) {\n        return 'link';\n      }\n      return 'ids';\n    }\n\n    /**\n     `ids()` returns an array of the record IDs in this relationship.\n      Example\n      ```app/models/post.js\n     import Model, { hasMany } from '@ember-data/model';\n      export default class PostModel extends Model {\n       @hasMany('comment', { async: true, inverse: null }) comments;\n     }\n     ```\n      ```javascript\n     let post = store.push({\n       data: {\n         type: 'post',\n         id: 1,\n         relationships: {\n           comments: {\n             data: [{ type: 'comment', id: 1 }]\n           }\n         }\n       }\n     });\n      let commentsRef = post.hasMany('comments');\n      commentsRef.ids(); // ['1']\n     ```\n      @method ids\n      @public\n     @return {Array} The ids in this has-many relationship\n     */\n    ids() {\n      return this.identifiers.map(identifier => identifier.id);\n    }\n\n    /**\n     The link Ember Data will use to fetch or reload this belongs-to\n     relationship. By default it uses only the \"related\" resource linkage.\n      Example\n      ```javascript\n     // models/blog.js\n     import Model, { belongsTo } from '@ember-data/model';\n     export default Model.extend({\n        user: belongsTo('user', { async: true, inverse: null })\n      });\n      let blog = store.push({\n        data: {\n          type: 'blog',\n          id: 1,\n          relationships: {\n            user: {\n              links: {\n                related: '/articles/1/author'\n              }\n            }\n          }\n        }\n      });\n     let userRef = blog.belongsTo('user');\n      // get the identifier of the reference\n     if (userRef.remoteType() === \"link\") {\n        let link = userRef.link();\n      }\n     ```\n      @method link\n     @public\n     @return {String} The link Ember Data will use to fetch or reload this belongs-to relationship.\n     */\n    link() {\n      let resource = this._resource();\n      if (isResourceIdentiferWithRelatedLinks(resource)) {\n        if (resource.links) {\n          let related = resource.links.related;\n          return !related || typeof related === 'string' ? related : related.href;\n        }\n      }\n      return null;\n    }\n\n    /**\n     * any links that have been received for this relationship\n     *\n     * @method links\n     * @public\n     * @returns\n     */\n    links() {\n      let resource = this._resource();\n      return resource && resource.links ? resource.links : null;\n    }\n\n    /**\n     The meta data for the has-many relationship.\n      Example\n      ```javascript\n     // models/blog.js\n     import Model, { hasMany } from '@ember-data/model';\n     export default Model.extend({\n        users: hasMany('user', { async: true, inverse: null })\n      });\n      let blog = store.push({\n        data: {\n          type: 'blog',\n          id: 1,\n          relationships: {\n            users: {\n              links: {\n                related: {\n                  href: '/articles/1/authors'\n                },\n              },\n              meta: {\n                lastUpdated: 1458014400000\n              }\n            }\n          }\n        }\n      });\n      let usersRef = blog.hasMany('user');\n      usersRef.meta() // { lastUpdated: 1458014400000 }\n     ```\n     @method meta\n    @public\n    @return {Object} The meta information for the belongs-to relationship.\n    */\n    meta() {\n      let meta = null;\n      let resource = this._resource();\n      if (resource && resource.meta && typeof resource.meta === 'object') {\n        meta = resource.meta;\n      }\n      return meta;\n    }\n\n    /**\n     `push` can be used to update the data in the relationship and Ember\n     Data will treat the new data as the canonical value of this\n     relationship on the backend.\n      Example\n      ```app/models/post.js\n     import Model, { hasMany } from '@ember-data/model';\n      export default class PostModel extends Model {\n       @hasMany('comment', { async: true, inverse: null }) comments;\n     }\n     ```\n      ```\n     let post = store.push({\n       data: {\n         type: 'post',\n         id: 1,\n         relationships: {\n           comments: {\n             data: [{ type: 'comment', id: 1 }]\n           }\n         }\n       }\n     });\n      let commentsRef = post.hasMany('comments');\n      commentsRef.ids(); // ['1']\n      commentsRef.push([\n     [{ type: 'comment', id: 2 }],\n     [{ type: 'comment', id: 3 }],\n     ])\n      commentsRef.ids(); // ['2', '3']\n     ```\n      @method push\n      @public\n     @param {Array|Promise} objectOrPromise a promise that resolves to a JSONAPI document object describing the new value of this relationship.\n     @return {ManyArray}\n     */\n    async push(objectOrPromise) {\n      let payload = objectOrPromise;\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_PROMISE_PROXIES)) {\n        if (objectOrPromise.then) {\n          payload = await rsvp.resolve(objectOrPromise);\n          if (payload !== objectOrPromise) {\n            (debug.deprecate(`You passed in a Promise to a Reference API that now expects a resolved value. await the value before setting it.`, false, {\n              id: 'ember-data:deprecate-promise-proxies',\n              until: '5.0',\n              since: {\n                enabled: '4.7',\n                available: '4.7'\n              },\n              for: 'ember-data'\n            }));\n          }\n        }\n      }\n      let array;\n      if (!Array.isArray(payload) && typeof payload === 'object' && Array.isArray(payload.data)) {\n        array = payload.data;\n      } else {\n        array = payload;\n      }\n      const {\n        store: store$1\n      } = this;\n      let identifiers = array.map(obj => {\n        let record;\n        if ('data' in obj) {\n          // TODO deprecate pushing non-valid JSON:API here\n          record = store$1.push(obj);\n        } else {\n          record = store$1.push({\n            data: obj\n          });\n        }\n        if (runtime.macroCondition(true)) {\n          let relationshipMeta = this.hasManyRelationship.definition;\n          let identifier = this.hasManyRelationship.identifier;\n\n          // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n          assertPolymorphicType(identifier, relationshipMeta, store.recordIdentifierFor(record), store$1);\n        }\n        return store.recordIdentifierFor(record);\n      });\n      const {\n        identifier\n      } = this.hasManyRelationship;\n      store$1._join(() => {\n        this.graph.push({\n          op: 'replaceRelatedRecords',\n          record: identifier,\n          field: this.key,\n          value: identifiers\n        });\n      });\n      return this.load();\n    }\n    _isLoaded() {\n      let hasRelationshipDataProperty = this.hasManyRelationship.state.hasReceivedData;\n      if (!hasRelationshipDataProperty) {\n        return false;\n      }\n      let localState = this.hasManyRelationship.localState;\n      return localState.every(identifier => {\n        return this.store._instanceCache.recordIsLoaded(identifier, true) === true;\n      });\n    }\n\n    /**\n     `value()` synchronously returns the current value of the has-many\n     relationship. Unlike `record.relationshipName`, calling\n     `value()` on a reference does not trigger a fetch if the async\n     relationship is not yet loaded. If the relationship is not loaded\n     it will always return `null`.\n      Example\n      ```app/models/post.js\n     import Model, { hasMany } from '@ember-data/model';\n      export default class PostModel extends Model {\n       @hasMany('comment', { async: true, inverse: null }) comments;\n     }\n     ```\n      ```javascript\n     let post = store.push({\n       data: {\n         type: 'post',\n         id: 1,\n         relationships: {\n           comments: {\n             data: [{ type: 'comment', id: 1 }]\n           }\n         }\n       }\n     });\n      let commentsRef = post.hasMany('comments');\n      post.comments.then(function(comments) {\n       commentsRef.value() === comments\n     })\n     ```\n      @method value\n      @public\n     @return {ManyArray}\n     */\n    value() {\n      const support = LEGACY_SUPPORT.get(this.___identifier);\n      const loaded = this._isLoaded();\n      if (!loaded) {\n        // subscribe to changes\n        // for when we are not loaded yet\n        this._ref;\n        return null;\n      }\n      return support.getManyArray(this.key);\n    }\n\n    /**\n     Loads the relationship if it is not already loaded.  If the\n     relationship is already loaded this method does not trigger a new\n     load. This causes a request to the specified\n     relationship link or reloads all items currently in the relationship.\n      Example\n      ```app/models/post.js\n     import Model, { hasMany } from '@ember-data/model';\n      export default class PostModel extends Model {\n       @hasMany('comment', { async: true, inverse: null }) comments;\n     }\n     ```\n      ```javascript\n     let post = store.push({\n       data: {\n         type: 'post',\n         id: 1,\n         relationships: {\n           comments: {\n             data: [{ type: 'comment', id: 1 }]\n           }\n         }\n       }\n     });\n      let commentsRef = post.hasMany('comments');\n      commentsRef.load().then(function(comments) {\n       //...\n     });\n     ```\n      You may also pass in an options object whose properties will be\n     fed forward. This enables you to pass `adapterOptions` into the\n     request given to the adapter via the reference.\n      Example\n      ```javascript\n     commentsRef.load({ adapterOptions: { isPrivate: true } })\n       .then(function(comments) {\n         //...\n       });\n     ```\n      ```app/adapters/comment.js\n     export default ApplicationAdapter.extend({\n       findMany(store, type, id, snapshots) {\n         // In the adapter you will have access to adapterOptions.\n         let adapterOptions = snapshots[0].adapterOptions;\n       }\n     });\n     ```\n      @method load\n      @public\n     @param {Object} options the options to pass in.\n     @return {Promise} a promise that resolves with the ManyArray in\n     this has-many relationship.\n     */\n    async load(options) {\n      const support = LEGACY_SUPPORT.get(this.___identifier);\n      return support.getHasMany(this.key, options); // this cast is necessary because typescript does not work properly with custom thenables;\n    }\n\n    /**\n     Reloads this has-many relationship. This causes a request to the specified\n     relationship link or reloads all items currently in the relationship.\n      Example\n      ```app/models/post.js\n     import Model, { hasMany } from '@ember-data/model';\n      export default class PostModel extends Model {\n       @hasMany('comment', { async: true, inverse: null }) comments;\n     }\n     ```\n      ```javascript\n     let post = store.push({\n       data: {\n         type: 'post',\n         id: 1,\n         relationships: {\n           comments: {\n             data: [{ type: 'comment', id: 1 }]\n           }\n         }\n       }\n     });\n      let commentsRef = post.hasMany('comments');\n      commentsRef.reload().then(function(comments) {\n       //...\n     });\n     ```\n      You may also pass in an options object whose properties will be\n     fed forward. This enables you to pass `adapterOptions` into the\n     request given to the adapter via the reference. A full example\n     can be found in the `load` method.\n      Example\n      ```javascript\n     commentsRef.reload({ adapterOptions: { isPrivate: true } })\n     ```\n      @method reload\n      @public\n     @param {Object} options the options to pass in.\n     @return {Promise} a promise that resolves with the ManyArray in this has-many relationship.\n     */\n    reload(options) {\n      const support = LEGACY_SUPPORT.get(this.___identifier);\n      return support.reloadHasMany(this.key, options);\n    }\n  }, _descriptor$2 = _applyDecoratedDescriptor$2(_class$2.prototype, \"_ref\", [tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return 0;\n    }\n  }), _applyDecoratedDescriptor$2(_class$2.prototype, \"identifiers\", [cached$1, compat.dependentKeyCompat], Object.getOwnPropertyDescriptor(_class$2.prototype, \"identifiers\"), _class$2.prototype), _class$2);\n\n  class LegacySupport {\n    constructor(record) {\n      this.record = record;\n      this.store = Private.storeFor(record);\n      this.identifier = Private.recordIdentifierFor(record);\n      this.recordData = this.store._instanceCache.getRecordData(this.identifier);\n      this._manyArrayCache = Object.create(null);\n      this._relationshipPromisesCache = Object.create(null);\n      this._relationshipProxyCache = Object.create(null);\n      this.references = Object.create(null);\n    }\n    _syncArray(array) {\n      // It’s possible the parent side of the relationship may have been destroyed by this point\n      if (this.isDestroyed || this.isDestroying) {\n        return;\n      }\n      const currentState = array[Private.SOURCE];\n      const identifier = this.identifier;\n      let [identifiers, jsonApi] = this._getCurrentState(identifier, array.key);\n      if (jsonApi.meta) {\n        array.meta = jsonApi.meta;\n      }\n      if (jsonApi.links) {\n        array.links = jsonApi.links;\n      }\n      currentState.length = 0;\n      Private.fastPush(currentState, identifiers);\n    }\n    updateCache(operation) {\n      this.recordData.update(operation);\n    }\n    _findBelongsTo(key, resource, relationship, options) {\n      // TODO @runspired follow up if parent isNew then we should not be attempting load here\n      // TODO @runspired follow up on whether this should be in the relationship requests cache\n      return this._findBelongsToByJsonApiResource(resource, this.identifier, relationship, options).then(identifier => handleCompletedRelationshipRequest(this, key, relationship, identifier), e => handleCompletedRelationshipRequest(this, key, relationship, null, e));\n    }\n    reloadBelongsTo(key, options) {\n      let loadingPromise = this._relationshipPromisesCache[key];\n      if (loadingPromise) {\n        return loadingPromise;\n      }\n      const graphFor = esc__default.default(require('@ember-data/record-data/-private')).graphFor;\n      const relationship = graphFor(this.store).get(this.identifier, key);\n      (!(isBelongsTo(relationship)) && debug.assert(`Expected ${key} to be a belongs-to relationship`, isBelongsTo(relationship)));\n      let resource = this.recordData.getRelationship(this.identifier, key);\n      relationship.state.hasFailedLoadAttempt = false;\n      relationship.state.shouldForceReload = true;\n      let promise = this._findBelongsTo(key, resource, relationship, options);\n      if (this._relationshipProxyCache[key]) {\n        return this._updatePromiseProxyFor('belongsTo', key, {\n          promise\n        });\n      }\n      return promise;\n    }\n    getBelongsTo(key, options) {\n      const {\n        identifier,\n        recordData\n      } = this;\n      let resource = recordData.getRelationship(this.identifier, key);\n      let relatedIdentifier = resource && resource.data ? resource.data : null;\n      (!(!relatedIdentifier || Private.isStableIdentifier(relatedIdentifier)) && debug.assert(`Expected a stable identifier`, !relatedIdentifier || Private.isStableIdentifier(relatedIdentifier)));\n      const store = this.store;\n      const graphFor = esc__default.default(require('@ember-data/record-data/-private')).graphFor;\n      const relationship = graphFor(store).get(this.identifier, key);\n      (!(isBelongsTo(relationship)) && debug.assert(`Expected ${key} to be a belongs-to relationship`, isBelongsTo(relationship)));\n      let isAsync = relationship.definition.isAsync;\n      let _belongsToState = {\n        key,\n        store,\n        legacySupport: this,\n        modelName: relationship.definition.type\n      };\n      if (isAsync) {\n        if (relationship.state.hasFailedLoadAttempt) {\n          return this._relationshipProxyCache[key];\n        }\n        let promise = this._findBelongsTo(key, resource, relationship, options);\n        const isLoaded = relatedIdentifier && store._instanceCache.recordIsLoaded(relatedIdentifier);\n        return this._updatePromiseProxyFor('belongsTo', key, {\n          promise,\n          content: isLoaded ? store._instanceCache.getRecord(relatedIdentifier) : null,\n          _belongsToState\n        });\n      } else {\n        if (relatedIdentifier === null) {\n          return null;\n        } else {\n          let toReturn = store._instanceCache.getRecord(relatedIdentifier);\n          (!(toReturn === null || store._instanceCache.recordIsLoaded(relatedIdentifier, true)) && debug.assert(`You looked up the '${key}' relationship on a '${identifier.type}' with id ${identifier.id || 'null'} but some of the associated records were not loaded. Either make sure they are all loaded together with the parent record, or specify that the relationship is async (\\`belongsTo(<type>, { async: true, inverse: <inverse> })\\`)`, toReturn === null || store._instanceCache.recordIsLoaded(relatedIdentifier, true)));\n          return toReturn;\n        }\n      }\n    }\n    setDirtyBelongsTo(key, value) {\n      return this.recordData.update({\n        op: 'replaceRelatedRecord',\n        record: this.identifier,\n        field: key,\n        value: extractIdentifierFromRecord(value)\n      },\n      // @ts-expect-error\n      true);\n    }\n    _getCurrentState(identifier, field) {\n      let jsonApi = this.recordData.getRelationship(identifier, field, true);\n      const cache = this.store._instanceCache;\n      let identifiers = [];\n      if (jsonApi.data) {\n        for (let i = 0; i < jsonApi.data.length; i++) {\n          const identifier = jsonApi.data[i];\n          (!(Private.isStableIdentifier(identifier)) && debug.assert(`Expected a stable identifier`, Private.isStableIdentifier(identifier)));\n          if (cache.recordIsLoaded(identifier, true)) {\n            identifiers.push(identifier);\n          }\n        }\n      }\n      return [identifiers, jsonApi];\n    }\n    getManyArray(key, definition) {\n      if (runtime.macroCondition(true)) {\n        let manyArray = this._manyArrayCache[key];\n        if (!definition) {\n          const graphFor = esc__default.default(require('@ember-data/record-data/-private')).graphFor;\n          definition = graphFor(this.store).get(this.identifier, key).definition;\n        }\n        if (!manyArray) {\n          const [identifiers, doc] = this._getCurrentState(this.identifier, key);\n          manyArray = new RelatedCollection({\n            store: this.store,\n            type: definition.type,\n            identifier: this.identifier,\n            recordData: this.recordData,\n            identifiers,\n            key,\n            meta: doc.meta || null,\n            links: doc.links || null,\n            isPolymorphic: definition.isPolymorphic,\n            isAsync: definition.isAsync,\n            _inverseIsAsync: definition.inverseIsAsync,\n            manager: this,\n            isLoaded: !definition.isAsync,\n            allowMutation: true\n          });\n          this._manyArrayCache[key] = manyArray;\n        }\n        return manyArray;\n      }\n      (debug.assert('hasMany only works with the @ember-data/record-data package'));\n    }\n    fetchAsyncHasMany(key, relationship, manyArray, options) {\n      if (runtime.macroCondition(true)) {\n        let loadingPromise = this._relationshipPromisesCache[key];\n        if (loadingPromise) {\n          return loadingPromise;\n        }\n        const jsonApi = this.recordData.getRelationship(this.identifier, key);\n        const promise = this._findHasManyByJsonApiResource(jsonApi, this.identifier, relationship, options);\n        if (!promise) {\n          manyArray.isLoaded = true;\n          return rsvp.resolve(manyArray);\n        }\n        loadingPromise = promise.then(() => handleCompletedRelationshipRequest(this, key, relationship, manyArray), e => handleCompletedRelationshipRequest(this, key, relationship, manyArray, e));\n        this._relationshipPromisesCache[key] = loadingPromise;\n        return loadingPromise;\n      }\n      (debug.assert('hasMany only works with the @ember-data/record-data package'));\n    }\n    reloadHasMany(key, options) {\n      if (runtime.macroCondition(true)) {\n        let loadingPromise = this._relationshipPromisesCache[key];\n        if (loadingPromise) {\n          return loadingPromise;\n        }\n        const graphFor = esc__default.default(require('@ember-data/record-data/-private')).graphFor;\n        const relationship = graphFor(this.store).get(this.identifier, key);\n        const {\n          definition,\n          state\n        } = relationship;\n        state.hasFailedLoadAttempt = false;\n        state.shouldForceReload = true;\n        let manyArray = this.getManyArray(key, definition);\n        let promise = this.fetchAsyncHasMany(key, relationship, manyArray, options);\n        if (this._relationshipProxyCache[key]) {\n          return this._updatePromiseProxyFor('hasMany', key, {\n            promise\n          });\n        }\n        return promise;\n      }\n      (debug.assert(`hasMany only works with the @ember-data/record-data package`));\n    }\n    getHasMany(key, options) {\n      if (runtime.macroCondition(true)) {\n        const graphFor = esc__default.default(require('@ember-data/record-data/-private')).graphFor;\n        const relationship = graphFor(this.store).get(this.identifier, key);\n        const {\n          definition,\n          state\n        } = relationship;\n        let manyArray = this.getManyArray(key, definition);\n        if (definition.isAsync) {\n          if (state.hasFailedLoadAttempt) {\n            return this._relationshipProxyCache[key];\n          }\n          let promise = this.fetchAsyncHasMany(key, relationship, manyArray, options);\n          return this._updatePromiseProxyFor('hasMany', key, {\n            promise,\n            content: manyArray\n          });\n        } else {\n          (!(!anyUnloaded(this.store, relationship)) && debug.assert(`You looked up the '${key}' relationship on a '${this.identifier.type}' with id ${this.identifier.id || 'null'} but some of the associated records were not loaded. Either make sure they are all loaded together with the parent record, or specify that the relationship is async ('hasMany(<type>, { async: true, inverse: <inverse> })')`, !anyUnloaded(this.store, relationship)));\n          return manyArray;\n        }\n      }\n      (debug.assert(`hasMany only works with the @ember-data/record-data package`));\n    }\n    _updatePromiseProxyFor(kind, key, args) {\n      let promiseProxy = this._relationshipProxyCache[key];\n      if (kind === 'hasMany') {\n        const {\n          promise,\n          content\n        } = args;\n        if (promiseProxy) {\n          (!('_update' in promiseProxy) && debug.assert(`Expected a PromiseManyArray`, '_update' in promiseProxy));\n          promiseProxy._update(promise, content);\n        } else {\n          promiseProxy = this._relationshipProxyCache[key] = new PromiseManyArray(promise, content);\n        }\n        return promiseProxy;\n      }\n      if (promiseProxy) {\n        const {\n          promise,\n          content\n        } = args;\n        (!('_belongsToState' in promiseProxy) && debug.assert(`Expected a PromiseBelongsTo`, '_belongsToState' in promiseProxy));\n        if (content !== undefined) {\n          promiseProxy.set('content', content);\n        }\n        void promiseProxy.set('promise', promise);\n      } else {\n        promiseProxy = PromiseBelongsTo.create(args);\n        this._relationshipProxyCache[key] = promiseProxy;\n      }\n      return promiseProxy;\n    }\n    referenceFor(kind, name) {\n      let reference = this.references[name];\n      if (!reference) {\n        if (runtime.macroCondition(!true)) {\n          // TODO @runspired while this feels odd, it is not a regression in capability because we do\n          // not today support references pulling from RecordDatas other than our own\n          // because of the intimate API access involved. This is something we will need to redesign.\n          (debug.assert(`snapshot.belongsTo only supported for @ember-data/record-data`));\n        }\n        const graphFor = esc__default.default(require('@ember-data/record-data/-private')).graphFor;\n        const graph = graphFor(this.store);\n        const relationship = graph.get(this.identifier, name);\n        if (runtime.macroCondition(true)) {\n          if (kind) {\n            let modelName = this.identifier.type;\n            let actualRelationshipKind = relationship.definition.kind;\n            (!(actualRelationshipKind === kind) && debug.assert(`You tried to get the '${name}' relationship on a '${modelName}' via record.${kind}('${name}'), but the relationship is of kind '${actualRelationshipKind}'. Use record.${actualRelationshipKind}('${name}') instead.`, actualRelationshipKind === kind));\n          }\n        }\n        let relationshipKind = relationship.definition.kind;\n        if (relationshipKind === 'belongsTo') {\n          reference = new BelongsToReference(this.store, graph, this.identifier, relationship, name);\n        } else if (relationshipKind === 'hasMany') {\n          reference = new HasManyReference(this.store, graph, this.identifier, relationship, name);\n        }\n        this.references[name] = reference;\n      }\n      return reference;\n    }\n    _findHasManyByJsonApiResource(resource, parentIdentifier, relationship, options) {\n      if (options === void 0) {\n        options = {};\n      }\n      if (runtime.macroCondition(true)) {\n        if (!resource) {\n          return;\n        }\n        const {\n          definition,\n          state\n        } = relationship;\n        const adapter = this.store.adapterFor(definition.type);\n        const {\n          isStale,\n          hasDematerializedInverse,\n          hasReceivedData,\n          isEmpty,\n          shouldForceReload\n        } = state;\n        const allInverseRecordsAreLoaded = areAllInverseRecordsLoaded(this.store, resource);\n        const shouldFindViaLink = resource.links && resource.links.related && (typeof adapter.findHasMany === 'function' || typeof resource.data === 'undefined') && (shouldForceReload || hasDematerializedInverse || isStale || !allInverseRecordsAreLoaded && !isEmpty);\n\n        // fetch via link\n        if (shouldFindViaLink) {\n          // findHasMany, although not public, does not need to care about our upgrade relationship definitions\n          // and can stick with the public definition API for now.\n          const relationshipMeta = this.store.getSchemaDefinitionService().relationshipsDefinitionFor({\n            type: definition.inverseType\n          })[definition.key];\n          let adapter = this.store.adapterFor(parentIdentifier.type);\n\n          /*\n            If a relationship was originally populated by the adapter as a link\n            (as opposed to a list of IDs), this method is called when the\n            relationship is fetched.\n             The link (which is usually a URL) is passed through unchanged, so the\n            adapter can make whatever request it wants.\n             The usual use-case is for the server to register a URL as a link, and\n            then use that URL in the future to make a request for the relationship.\n          */\n          (!(adapter) && debug.assert(`You tried to load a hasMany relationship but you have no adapter (for ${parentIdentifier.type})`, adapter));\n          (!(typeof adapter.findHasMany === 'function') && debug.assert(`You tried to load a hasMany relationship from a specified 'link' in the original payload but your adapter does not implement 'findHasMany'`, typeof adapter.findHasMany === 'function'));\n          return _findHasMany(adapter, this.store, parentIdentifier, resource.links.related, relationshipMeta, options);\n        }\n        const preferLocalCache = hasReceivedData && !isEmpty;\n        const hasLocalPartialData = hasDematerializedInverse || isEmpty && Array.isArray(resource.data) && resource.data.length > 0;\n\n        // fetch using data, pulling from local cache if possible\n        if (!shouldForceReload && !isStale && (preferLocalCache || hasLocalPartialData)) {\n          if (allInverseRecordsAreLoaded) {\n            return;\n          }\n          (!(Array.isArray(resource.data)) && debug.assert(`Expected collection to be an array`, Array.isArray(resource.data)));\n          if (allInverseRecordsAreLoaded) {\n            return;\n          }\n          let finds = new Array(resource.data.length);\n          let cache = this.store._instanceCache;\n          for (let i = 0; i < resource.data.length; i++) {\n            const identifier = resource.data[i];\n            (!(Private.isStableIdentifier(identifier)) && debug.assert(`expected a stable identifier`, Private.isStableIdentifier(identifier)));\n            finds[i] = cache._fetchDataIfNeededForIdentifier(identifier, options);\n          }\n          return rsvp.all(finds);\n        }\n        let hasData = hasReceivedData && !isEmpty;\n\n        // fetch by data\n        if (hasData || hasLocalPartialData) {\n          const identifiers = resource.data;\n          (!(Array.isArray(identifiers)) && debug.assert(`Expected collection to be an array`, Array.isArray(identifiers)));\n          (!(identifiers.every(Private.isStableIdentifier)) && debug.assert(`Expected stable identifiers`, identifiers.every(Private.isStableIdentifier)));\n          let fetches = new Array(identifiers.length);\n          const manager = this.store._fetchManager;\n          for (let i = 0; i < identifiers.length; i++) {\n            let identifier = identifiers[i];\n            assertIdentifierHasId(identifier);\n            fetches[i] = manager.scheduleFetch(identifier, options);\n          }\n          return rsvp.all(fetches);\n        }\n\n        // we were explicitly told we have no data and no links.\n        //   TODO if the relationshipIsStale, should we hit the adapter anyway?\n        return;\n      }\n      (debug.assert(`hasMany only works with the @ember-data/record-data package`));\n    }\n    _findBelongsToByJsonApiResource(resource, parentIdentifier, relationship, options) {\n      if (options === void 0) {\n        options = {};\n      }\n      if (!resource) {\n        return rsvp.resolve(null);\n      }\n      const identifier = resource.data ? resource.data : null;\n      (!(!identifier || Private.isStableIdentifier(identifier)) && debug.assert(`Expected a stable identifier`, !identifier || Private.isStableIdentifier(identifier)));\n      let {\n        isStale,\n        hasDematerializedInverse,\n        hasReceivedData,\n        isEmpty,\n        shouldForceReload\n      } = relationship.state;\n\n      // short circuit if we are already loading\n      let pendingRequest = identifier && this.store._fetchManager.getPendingFetch(identifier, options);\n      if (pendingRequest) {\n        return pendingRequest;\n      }\n      const allInverseRecordsAreLoaded = areAllInverseRecordsLoaded(this.store, resource);\n      const shouldFindViaLink = resource.links?.related && (shouldForceReload || hasDematerializedInverse || isStale || !allInverseRecordsAreLoaded && !isEmpty);\n\n      // fetch via link\n      if (shouldFindViaLink) {\n        const relationshipMeta = this.store.getSchemaDefinitionService().relationshipsDefinitionFor(this.identifier)[relationship.definition.key];\n        (!(relationshipMeta) && debug.assert(`Attempted to access a belongsTo relationship but no definition exists for it`, relationshipMeta));\n        return _findBelongsTo(this.store, parentIdentifier, resource.links.related, relationshipMeta, options);\n      }\n      let preferLocalCache = hasReceivedData && allInverseRecordsAreLoaded && !isEmpty;\n      let hasLocalPartialData = hasDematerializedInverse || isEmpty && resource.data;\n      // null is explicit empty, undefined is \"we don't know anything\"\n      const localDataIsEmpty = resource.data === undefined || resource.data === null;\n\n      // fetch using data, pulling from local cache if possible\n      if (!shouldForceReload && !isStale && (preferLocalCache || hasLocalPartialData)) {\n        /*\n          We have canonical data, but our local state is empty\n         */\n        if (localDataIsEmpty) {\n          return rsvp.resolve(null);\n        }\n        if (!identifier) {\n          (!(identifier) && debug.assert(`No Information found for ${resource.data.lid}`, identifier));\n        }\n        return this.store._instanceCache._fetchDataIfNeededForIdentifier(identifier, options);\n      }\n      let resourceIsLocal = !localDataIsEmpty && resource.data.id === null;\n      if (identifier && resourceIsLocal) {\n        return rsvp.resolve(identifier);\n      }\n\n      // fetch by data\n      if (identifier && !localDataIsEmpty) {\n        assertIdentifierHasId(identifier);\n        return this.store._fetchManager.scheduleFetch(identifier, options);\n      }\n\n      // we were explicitly told we have no data and no links.\n      //   TODO if the relationshipIsStale, should we hit the adapter anyway?\n      return rsvp.resolve(null);\n    }\n    destroy() {\n      this.isDestroying = true;\n      let cache = this._manyArrayCache;\n      this._manyArrayCache = Object.create(null);\n      Object.keys(cache).forEach(key => {\n        cache[key].destroy();\n      });\n      cache = this._relationshipProxyCache;\n      this._relationshipProxyCache = Object.create(null);\n      Object.keys(cache).forEach(key => {\n        const proxy = cache[key];\n        if (proxy.destroy) {\n          proxy.destroy();\n        }\n      });\n      cache = this.references;\n      this.references = Object.create(null);\n      Object.keys(cache).forEach(key => {\n        cache[key].destroy();\n      });\n      this.isDestroyed = true;\n    }\n  }\n  function handleCompletedRelationshipRequest(recordExt, key, relationship, value, error) {\n    delete recordExt._relationshipPromisesCache[key];\n    relationship.state.shouldForceReload = false;\n    const isHasMany = relationship.definition.kind === 'hasMany';\n    if (isHasMany) {\n      // we don't notify the record property here to avoid refetch\n      // only the many array\n      value.notify();\n    }\n    if (error) {\n      relationship.state.hasFailedLoadAttempt = true;\n      let proxy = recordExt._relationshipProxyCache[key];\n      // belongsTo relationships are sometimes unloaded\n      // when a load fails, in this case we need\n      // to make sure that we aren't proxying\n      // to destroyed content\n      // for the sync belongsTo reload case there will be no proxy\n      // for the async reload case there will be no proxy if the ui\n      // has never been accessed\n      if (proxy && !isHasMany) {\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n        if (proxy.content && proxy.content.isDestroying) {\n          proxy.set('content', null);\n        }\n      }\n      throw error;\n    }\n    if (isHasMany) {\n      value.isLoaded = true;\n    }\n    relationship.state.hasFailedLoadAttempt = false;\n    // only set to not stale if no error is thrown\n    relationship.state.isStale = false;\n    return isHasMany || !value ? value : recordExt.store.peekRecord(value);\n  }\n  function extractIdentifierFromRecord(recordOrPromiseRecord) {\n    if (!recordOrPromiseRecord) {\n      return null;\n    }\n    if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_PROMISE_PROXIES)) {\n      if (isPromiseRecord(recordOrPromiseRecord)) {\n        let content = recordOrPromiseRecord.content;\n        (!(content !== undefined) && debug.assert('You passed in a promise that did not originate from an EmberData relationship. You can only pass promises that come from a belongsTo or hasMany relationship to the get call.', content !== undefined));\n        (debug.deprecate(`You passed in a PromiseProxy to a Relationship API that now expects a resolved value. await the value before setting it.`, false, {\n          id: 'ember-data:deprecate-promise-proxies',\n          until: '5.0',\n          since: {\n            enabled: '4.7',\n            available: '4.7'\n          },\n          for: 'ember-data'\n        }));\n        return content ? Private.recordIdentifierFor(content) : null;\n      }\n    }\n    return Private.recordIdentifierFor(recordOrPromiseRecord);\n  }\n  function isPromiseRecord(record) {\n    return !!record.then;\n  }\n  function anyUnloaded(store, relationship) {\n    let state = relationship.localState;\n    const cache = store._instanceCache;\n    const unloaded = state.find(s => {\n      let isLoaded = cache.recordIsLoaded(s, true);\n      return !isLoaded;\n    });\n    return unloaded || false;\n  }\n  function areAllInverseRecordsLoaded(store, resource) {\n    const instanceCache = store._instanceCache;\n    const identifiers = resource.data;\n    if (Array.isArray(identifiers)) {\n      (!(identifiers.every(Private.isStableIdentifier)) && debug.assert(`Expected stable identifiers`, identifiers.every(Private.isStableIdentifier))); // treat as collection\n      // check for unloaded records\n      return identifiers.every(identifier => instanceCache.recordIsLoaded(identifier));\n    }\n\n    // treat as single resource\n    if (!identifiers) return true;\n    (!(Private.isStableIdentifier(identifiers)) && debug.assert(`Expected stable identifiers`, Private.isStableIdentifier(identifiers)));\n    return instanceCache.recordIsLoaded(identifiers);\n  }\n  function isBelongsTo(relationship) {\n    return relationship.definition.kind === 'belongsTo';\n  }\n\n  function notifyChanges(identifier, value, key, record, store) {\n    if (value === 'attributes') {\n      if (key) {\n        notifyAttribute(store, identifier, key, record);\n      } else {\n        record.eachAttribute(key => {\n          notifyAttribute(store, identifier, key, record);\n        });\n      }\n    } else if (value === 'relationships') {\n      if (key) {\n        let meta = record.constructor.relationshipsByName.get(key);\n        notifyRelationship(identifier, key, record, meta);\n      } else {\n        record.eachRelationship((key, meta) => {\n          notifyRelationship(identifier, key, record, meta);\n        });\n      }\n    } else if (value === 'identity') {\n      record.notifyPropertyChange('id');\n    }\n  }\n  function notifyRelationship(identifier, key, record, meta) {\n    if (meta.kind === 'belongsTo') {\n      record.notifyPropertyChange(key);\n    } else if (meta.kind === 'hasMany') {\n      let support = LEGACY_SUPPORT.get(identifier);\n      let manyArray = support && support._manyArrayCache[key];\n      let hasPromise = support && support._relationshipPromisesCache[key];\n      if (manyArray && hasPromise) {\n        // do nothing, we will notify the ManyArray directly\n        // once the fetch has completed.\n        return;\n      }\n      if (manyArray) {\n        manyArray.notify();\n\n        //We need to notifyPropertyChange in the adding case because we need to make sure\n        //we fetch the newly added record in case it is unloaded\n        //TODO(Igor): Consider whether we could do this only if the record state is unloaded\n        if (!meta.options || meta.options.async || meta.options.async === undefined) {\n          record.notifyPropertyChange(key);\n        }\n      }\n    }\n  }\n  function notifyAttribute(store, identifier, key, record) {\n    let currentValue = internals.cacheFor(record, key);\n    if (currentValue !== store._instanceCache.getRecordData(identifier).getAttr(identifier, key)) {\n      record.notifyPropertyChange(key);\n    }\n  }\n\n  var _class$1, _descriptor$1, _class2, _descriptor2;\n  function _initializerDefineProperty$1(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }\n  function _applyDecoratedDescriptor$1(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }\n  let cached = runtime.macroCondition(false) ? esc__default.default(require('@glimmer/tracking')).cached : esc__default.default(require('ember-cached-decorator-polyfill')).cached;\n  const SOURCE_POINTER_REGEXP = /^\\/?data\\/(attributes|relationships)\\/(.*)/;\n  const SOURCE_POINTER_PRIMARY_REGEXP = /^\\/?data/;\n  const PRIMARY_ATTRIBUTE_KEY = 'base';\n  function isInvalidError(error) {\n    return error && error.isAdapterError === true && error.code === 'InvalidError';\n  }\n\n  /**\n   * Tag provides a cache for a getter\n   * that recomputes only when a specific\n   * tracked property that it manages is dirtied.\n   *\n   * This allows us to bust the cache for a value\n   * that otherwise doesn't access anything tracked\n   * as well as control the timing of that notification.\n   *\n   * @internal\n   */\n  let Tag = (_class$1 = class Tag {\n    constructor() {\n      _initializerDefineProperty$1(this, \"ref\", _descriptor$1, this);\n      this.rev = 1;\n      this.isDirty = true;\n      this.value = undefined;\n      /*\n       * whether this was part of a transaction when mutated\n       */\n      this.t = false;\n    }\n    notify() {\n      this.isDirty = true;\n      Private$1.addToTransaction(this);\n      this.rev++;\n    }\n    consume(v) {\n      this.isDirty = false;\n      this.value = v; // set cached value\n    }\n  }, _descriptor$1 = _applyDecoratedDescriptor$1(_class$1.prototype, \"ref\", [tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return null;\n    }\n  }), _class$1);\n  const Tags = new WeakMap();\n  function getTag(record, key) {\n    let tags = Tags.get(record);\n    if (!tags) {\n      tags = Object.create(null);\n      Tags.set(record, tags);\n    }\n    return tags[key] = tags[key] || new Tag();\n  }\n  function peekTag(record, key) {\n    let tags = Tags.get(record);\n    return tags && tags[key];\n  }\n\n  /**\n   * A decorattor that caches a getter while\n   * providing the ability to bust that cache\n   * when we so choose in a way that notifies\n   * glimmer's tracking system.\n   *\n   * @internal\n   */\n  function tagged(_target, key, desc) {\n    const getter = desc.get;\n    const setter = desc.set;\n    desc.get = function () {\n      let tag = getTag(this, key);\n      Private$1.subscribe(tag);\n      if (tag.isDirty) {\n        tag.consume(getter.call(this));\n      }\n      return tag.value;\n    };\n    desc.set = function (v) {\n      getTag(this, key); // ensure tag is setup in case we want to use it.\n      // probably notify here but not yet.\n      setter.call(this, v);\n    };\n    compat.dependentKeyCompat(desc);\n    return desc;\n  }\n\n  /**\n  Historically EmberData managed a state machine\n  for each record, the localState for which\n  was reflected onto Model.\n\n  This implements the flags and stateName for backwards compat\n  with the state tree that used to be possible (listed below).\n\n  stateName and dirtyType are candidates for deprecation.\n\n  root\n    empty\n      deleted    // hidden from stateName\n      preloaded  // hidden from stateName\n\n    loading\n       empty     // hidden from stateName\n       preloaded // hidden from stateName\n\n    loaded\n      saved\n      updated\n        uncommitted\n        invalid\n        inFlight\n      created\n        uncommitted\n        invalid\n        inFlight\n\n    deleted\n      saved\n        new      // hidden from stateName\n      uncommitted\n      invalid\n      inFlight\n\n    @internal\n  */\n  let RecordState = (_class2 = class RecordState {\n    constructor(record) {\n      _initializerDefineProperty$1(this, \"isSaving\", _descriptor2, this);\n      const store$1 = store.storeFor(record);\n      const identity = Private.recordIdentifierFor(record);\n      this.identifier = identity;\n      this.record = record;\n      this.recordData = store$1._instanceCache.getRecordData(identity);\n      this.pendingCount = 0;\n      this.fulfilledCount = 0;\n      this.rejectedCount = 0;\n      this._errorRequests = [];\n      this._lastError = null;\n      let requests = store$1.getRequestStateService();\n      let notifications = store$1._notificationManager;\n      const handleRequest = req => {\n        if (req.type === 'mutation') {\n          switch (req.state) {\n            case 'pending':\n              this.isSaving = true;\n              break;\n            case 'rejected':\n              this.isSaving = false;\n              this._lastError = req;\n              if (!(req.response && isInvalidError(req.response.data))) {\n                this._errorRequests.push(req);\n              }\n              notifyErrorsStateChanged(this);\n              break;\n            case 'fulfilled':\n              this._errorRequests = [];\n              this._lastError = null;\n              this.isSaving = false;\n              notifyErrorsStateChanged(this);\n              break;\n          }\n        } else {\n          switch (req.state) {\n            case 'pending':\n              this.pendingCount++;\n              this.notify('isLoading');\n              break;\n            case 'rejected':\n              this.pendingCount--;\n              this._lastError = req;\n              if (!(req.response && isInvalidError(req.response.data))) {\n                this._errorRequests.push(req);\n              }\n              this.notify('isLoading');\n              notifyErrorsStateChanged(this);\n              break;\n            case 'fulfilled':\n              this.pendingCount--;\n              this.fulfilledCount++;\n              this.notify('isLoading');\n              this.notify('isDirty');\n              notifyErrorsStateChanged(this);\n              this._errorRequests = [];\n              this._lastError = null;\n              break;\n          }\n        }\n      };\n      requests.subscribeForRecord(identity, handleRequest);\n\n      // we instantiate lazily\n      // so we grab anything we don't have yet\n      if (runtime.macroCondition(!true)) {\n        const lastRequest = requests.getLastRequestForRecord(identity);\n        if (lastRequest) {\n          handleRequest(lastRequest);\n        }\n      }\n      this.handler = notifications.subscribe(identity, (identifier, type, key) => {\n        switch (type) {\n          case 'state':\n            this.notify('isNew');\n            this.notify('isDeleted');\n            this.notify('isDirty');\n            break;\n          case 'attributes':\n            this.notify('isEmpty');\n            this.notify('isDirty');\n            break;\n          case 'errors':\n            this.updateInvalidErrors(this.record.errors);\n            this.notify('isValid');\n            break;\n        }\n      });\n    }\n    destroy() {\n      store.storeFor(this.record)._notificationManager.unsubscribe(this.handler);\n    }\n    notify(key) {\n      getTag(this, key).notify();\n    }\n    updateInvalidErrors(errors) {\n      (!(typeof this.recordData.getErrors === 'function') && debug.assert(`Expected the RecordData instance for ${this.identifier}  to implement getErrors(identifier)`, typeof this.recordData.getErrors === 'function'));\n      let jsonApiErrors = this.recordData.getErrors(this.identifier);\n      errors.clear();\n      for (let i = 0; i < jsonApiErrors.length; i++) {\n        let error = jsonApiErrors[i];\n        if (error.source && error.source.pointer) {\n          let keyMatch = error.source.pointer.match(SOURCE_POINTER_REGEXP);\n          let key;\n          if (keyMatch) {\n            key = keyMatch[2];\n          } else if (error.source.pointer.search(SOURCE_POINTER_PRIMARY_REGEXP) !== -1) {\n            key = PRIMARY_ATTRIBUTE_KEY;\n          }\n          if (key) {\n            let errMsg = error.detail || error.title;\n            errors.add(key, errMsg);\n          }\n        }\n      }\n    }\n    cleanErrorRequests() {\n      this.notify('isValid');\n      this.notify('isError');\n      this.notify('adapterError');\n      this._errorRequests = [];\n      this._lastError = null;\n    }\n    get isLoading() {\n      return !this.isLoaded && this.pendingCount > 0 && this.fulfilledCount === 0;\n    }\n    get isLoaded() {\n      if (this.isNew) {\n        return true;\n      }\n      return this.fulfilledCount > 0 || !this.isEmpty;\n    }\n    get isSaved() {\n      let rd = this.recordData;\n      if (this.isDeleted) {\n        (!(rd.isDeletionCommitted) && debug.assert(`Expected RecordData to implement isDeletionCommitted()`, rd.isDeletionCommitted));\n        return rd.isDeletionCommitted(this.identifier);\n      }\n      if (this.isNew || this.isEmpty || !this.isValid || this.isDirty || this.isLoading) {\n        return false;\n      }\n      return true;\n    }\n    get isEmpty() {\n      let rd = this.recordData;\n      // TODO this is not actually an RFC'd concept. Determine the\n      // correct heuristic to replace this with.\n      (!(rd.isEmpty) && debug.assert(`Expected RecordData to implement isEmpty()`, rd.isEmpty));\n      return !this.isNew && rd.isEmpty(this.identifier);\n    }\n    get isNew() {\n      let rd = this.recordData;\n      (!(rd.isNew) && debug.assert(`Expected RecordData to implement isNew()`, rd.isNew));\n      return rd.isNew(this.identifier);\n    }\n    get isDeleted() {\n      let rd = this.recordData;\n      (!(rd.isDeleted) && debug.assert(`Expected RecordData to implement isDeleted()`, rd.isDeleted));\n      return rd.isDeleted(this.identifier);\n    }\n    get isValid() {\n      return this.record.errors.length === 0;\n    }\n    get isDirty() {\n      let rd = this.recordData;\n      if (rd.isDeletionCommitted(this.identifier) || this.isDeleted && this.isNew) {\n        return false;\n      }\n      return this.isNew || rd.hasChangedAttrs(this.identifier);\n    }\n    get isError() {\n      let errorReq = this._errorRequests[this._errorRequests.length - 1];\n      if (!errorReq) {\n        return false;\n      } else {\n        return true;\n      }\n    }\n    get adapterError() {\n      let request = this._lastError;\n      if (!request) {\n        return null;\n      }\n      return request.state === 'rejected' && request.response.data;\n    }\n    get isPreloaded() {\n      return !this.isEmpty && this.isLoading;\n    }\n    get stateName() {\n      // we might be empty while loading so check this first\n      if (this.isLoading) {\n        return 'root.loading';\n\n        // got nothing yet or were unloaded\n      } else if (this.isEmpty) {\n        return 'root.empty';\n\n        // deleted substates\n      } else if (this.isDeleted) {\n        if (this.isSaving) {\n          return 'root.deleted.inFlight';\n        } else if (this.isSaved) {\n          // TODO ensure isSaved isn't true from previous requests\n          return 'root.deleted.saved';\n        } else if (!this.isValid) {\n          return 'root.deleted.invalid';\n        } else {\n          return 'root.deleted.uncommitted';\n        }\n\n        // loaded.created substates\n      } else if (this.isNew) {\n        if (this.isSaving) {\n          return 'root.loaded.created.inFlight';\n        } else if (!this.isValid) {\n          return 'root.loaded.created.invalid';\n        }\n        return 'root.loaded.created.uncommitted';\n\n        // loaded.updated substates\n      } else if (this.isSaving) {\n        return 'root.loaded.updated.inFlight';\n      } else if (!this.isValid) {\n        return 'root.loaded.updated.invalid';\n      } else if (this.isDirty) {\n        return 'root.loaded.updated.uncommitted';\n\n        // if nothing remains, we are loaded saved!\n      } else {\n        return 'root.loaded.saved';\n      }\n    }\n    get dirtyType() {\n      // we might be empty while loading so check this first\n      if (this.isLoading || this.isEmpty) {\n        return '';\n\n        // deleted substates\n      } else if (this.isDeleted) {\n        return 'deleted';\n\n        // loaded.created substates\n      } else if (this.isNew) {\n        return 'created';\n\n        // loaded.updated substates\n      } else if (this.isSaving || !this.isValid || this.isDirty) {\n        return 'updated';\n\n        // if nothing remains, we are loaded saved!\n      } else {\n        return '';\n      }\n    }\n  }, _descriptor2 = _applyDecoratedDescriptor$1(_class2.prototype, \"isSaving\", [tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return false;\n    }\n  }), _applyDecoratedDescriptor$1(_class2.prototype, \"isLoading\", [tagged], Object.getOwnPropertyDescriptor(_class2.prototype, \"isLoading\"), _class2.prototype), _applyDecoratedDescriptor$1(_class2.prototype, \"isLoaded\", [tagged], Object.getOwnPropertyDescriptor(_class2.prototype, \"isLoaded\"), _class2.prototype), _applyDecoratedDescriptor$1(_class2.prototype, \"isSaved\", [tagged], Object.getOwnPropertyDescriptor(_class2.prototype, \"isSaved\"), _class2.prototype), _applyDecoratedDescriptor$1(_class2.prototype, \"isEmpty\", [tagged], Object.getOwnPropertyDescriptor(_class2.prototype, \"isEmpty\"), _class2.prototype), _applyDecoratedDescriptor$1(_class2.prototype, \"isNew\", [tagged], Object.getOwnPropertyDescriptor(_class2.prototype, \"isNew\"), _class2.prototype), _applyDecoratedDescriptor$1(_class2.prototype, \"isDeleted\", [tagged], Object.getOwnPropertyDescriptor(_class2.prototype, \"isDeleted\"), _class2.prototype), _applyDecoratedDescriptor$1(_class2.prototype, \"isValid\", [tagged], Object.getOwnPropertyDescriptor(_class2.prototype, \"isValid\"), _class2.prototype), _applyDecoratedDescriptor$1(_class2.prototype, \"isDirty\", [tagged], Object.getOwnPropertyDescriptor(_class2.prototype, \"isDirty\"), _class2.prototype), _applyDecoratedDescriptor$1(_class2.prototype, \"isError\", [tagged], Object.getOwnPropertyDescriptor(_class2.prototype, \"isError\"), _class2.prototype), _applyDecoratedDescriptor$1(_class2.prototype, \"adapterError\", [tagged], Object.getOwnPropertyDescriptor(_class2.prototype, \"adapterError\"), _class2.prototype), _applyDecoratedDescriptor$1(_class2.prototype, \"isPreloaded\", [cached], Object.getOwnPropertyDescriptor(_class2.prototype, \"isPreloaded\"), _class2.prototype), _applyDecoratedDescriptor$1(_class2.prototype, \"stateName\", [cached], Object.getOwnPropertyDescriptor(_class2.prototype, \"stateName\"), _class2.prototype), _applyDecoratedDescriptor$1(_class2.prototype, \"dirtyType\", [cached], Object.getOwnPropertyDescriptor(_class2.prototype, \"dirtyType\"), _class2.prototype), _class2);\n  function notifyErrorsStateChanged(state) {\n    state.notify('isValid');\n    state.notify('isError');\n    state.notify('adapterError');\n  }\n\n  function typeForRelationshipMeta(meta) {\n    let modelName = string.dasherize(meta.type || meta.key);\n    if (meta.kind === 'hasMany') {\n      modelName = emberInflector.singularize(modelName);\n    }\n    return modelName;\n  }\n  function shouldFindInverse(relationshipMeta) {\n    let options = relationshipMeta.options;\n    return !(options && options.inverse === null);\n  }\n  class RelationshipDefinition {\n    constructor(meta) {\n      this._type = '';\n      this.__inverseKey = '';\n      this.__hasCalculatedInverse = false;\n      this.parentModelName = meta.parentModelName;\n      this.meta = meta;\n    }\n\n    /**\n     * @internal\n     * @deprecated\n     */\n    get key() {\n      return this.meta.key;\n    }\n    get kind() {\n      return this.meta.kind;\n    }\n    get type() {\n      if (this._type) {\n        return this._type;\n      }\n      this._type = typeForRelationshipMeta(this.meta);\n      return this._type;\n    }\n    get options() {\n      return this.meta.options;\n    }\n    get name() {\n      return this.meta.name;\n    }\n    _inverseKey(store, modelClass) {\n      if (this.__hasCalculatedInverse === false) {\n        this._calculateInverse(store, modelClass);\n      }\n      return this.__inverseKey;\n    }\n    _calculateInverse(store, modelClass) {\n      this.__hasCalculatedInverse = true;\n      let inverseKey;\n      let inverse = null;\n      if (shouldFindInverse(this.meta)) {\n        inverse = modelClass.inverseFor(this.key, store);\n      }\n      // TODO make this error again for the non-polymorphic case\n      if (runtime.macroCondition(true)) {\n        if (!this.options.polymorphic) {\n          modelClass.typeForRelationship(this.key, store);\n        }\n      }\n      if (inverse) {\n        inverseKey = inverse.name;\n      } else {\n        inverseKey = null;\n      }\n      this.__inverseKey = inverseKey;\n    }\n  }\n  function relationshipFromMeta(meta) {\n    return new RelationshipDefinition(meta);\n  }\n\n  var _class, _descriptor, _Model;\n  function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }\n  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }\n  const {\n    changeProperties\n  } = Ember__default.default;\n  const LEGACY_SUPPORT = new Map();\n  function lookupLegacySupport(record) {\n    const identifier = store.recordIdentifierFor(record);\n    let support = LEGACY_SUPPORT.get(identifier);\n    if (!support) {\n      (!(!record.isDestroyed && !record.isDestroying) && debug.assert(`Memory Leak Detected`, !record.isDestroyed && !record.isDestroying));\n      support = new LegacySupport(record);\n      LEGACY_SUPPORT.set(identifier, support);\n      LEGACY_SUPPORT.set(record, support);\n    }\n    return support;\n  }\n  function findPossibleInverses(type, inverseType, name, relationshipsSoFar) {\n    let possibleRelationships = relationshipsSoFar || [];\n    let relationshipMap = inverseType.relationships;\n    if (!relationshipMap) {\n      return possibleRelationships;\n    }\n    let relationshipsForType = relationshipMap.get(type.modelName);\n    let relationships = Array.isArray(relationshipsForType) ? relationshipsForType.filter(relationship => {\n      let optionsForRelationship = relationship.options;\n      if (!optionsForRelationship.inverse && optionsForRelationship.inverse !== null) {\n        return true;\n      }\n      return name === optionsForRelationship.inverse;\n    }) : null;\n    if (relationships) {\n      possibleRelationships.push.apply(possibleRelationships, relationships);\n    }\n\n    //Recurse to support polymorphism\n    if (type.superclass) {\n      findPossibleInverses(type.superclass, inverseType, name, possibleRelationships);\n    }\n    return possibleRelationships;\n  }\n\n  /*\n   * This decorator allows us to lazily compute\n   * an expensive getter on first-access and thereafter\n   * never recompute it.\n   */\n  function computeOnce(target, key, desc) {\n    const cache = new WeakMap();\n    let getter = desc.get;\n    desc.get = function () {\n      let meta = cache.get(this);\n      if (!meta) {\n        meta = {\n          hasComputed: false,\n          value: undefined\n        };\n        cache.set(this, meta);\n      }\n      if (!meta.hasComputed) {\n        meta.value = getter.call(this);\n        meta.hasComputed = true;\n      }\n      return meta.value;\n    };\n    return desc;\n  }\n\n  /**\n    Base class from which Models can be define.\n\n    ```js\n    import Model, { attr } from '@ember-data/model';\n\n    export default class User extends Model {\n      @attr name;\n    }\n    ```\n\n    @class Model\n    @public\n    @extends Ember.EmberObject\n  */\n  let Model = (_class = (_Model = class Model extends EmberObject__default.default {\n    constructor() {\n      super(...arguments);\n      this.___private_notifications = void 0;\n      /**\n        If `true` the store is attempting to reload the record from the adapter.\n         Example\n         ```javascript\n        record.isReloading; // false\n        record.reload();\n        record.isReloading; // true\n        ```\n         @property isReloading\n        @public\n        @type {Boolean}\n        @readOnly\n      */\n      _initializerDefineProperty(this, \"isReloading\", _descriptor, this);\n    }\n    init(options) {\n      if (options === void 0) {\n        options = {};\n      }\n      if (runtime.macroCondition(true)) {\n        if (!options._secretInit && !options._createProps) {\n          throw new Error('You should not call `create` on a model. Instead, call `store.createRecord` with the attributes you would like to set.');\n        }\n      }\n      const createProps = options._createProps;\n      const _secretInit = options._secretInit;\n      options._createProps = null;\n      options._secretInit = null;\n      let store = this.store = _secretInit.store;\n      super.init(options);\n      let identity = _secretInit.identifier;\n      _secretInit.cb(this, _secretInit.recordData, identity, _secretInit.store);\n      this.___recordState = runtime.macroCondition(true) ? new RecordState(this) : null;\n      this.setProperties(createProps);\n      let notifications = store._notificationManager;\n      this.___private_notifications = notifications.subscribe(identity, (identifier, type, key) => {\n        notifyChanges(identifier, type, key, this, store);\n      });\n    }\n    destroy() {\n      const identifier = store.recordIdentifierFor(this);\n      this.___recordState?.destroy();\n      const store$1 = store.storeFor(this);\n      store$1._notificationManager.unsubscribe(this.___private_notifications);\n      // Legacy behavior is to notify the relationships on destroy\n      // such that they \"clear\". It's uncertain this behavior would\n      // be good for a new model paradigm, likely cheaper and safer\n      // to simply not notify, for this reason the store does not itself\n      // notify individual changes once the delete has been signaled,\n      // this decision is left to model instances.\n\n      this.eachRelationship((key, meta) => {\n        if (meta.kind === 'belongsTo') {\n          this.notifyPropertyChange(key);\n        }\n      });\n      LEGACY_SUPPORT.get(this)?.destroy();\n      LEGACY_SUPPORT.delete(this);\n      LEGACY_SUPPORT.delete(identifier);\n      super.destroy();\n    }\n\n    /**\n      If this property is `true` the record is in the `empty`\n      state. Empty is the first state all records enter after they have\n      been created. Most records created by the store will quickly\n      transition to the `loading` state if data needs to be fetched from\n      the server or the `created` state if the record is created on the\n      client. A record can also enter the empty state if the adapter is\n      unable to locate the record.\n       @property isEmpty\n      @public\n      @type {Boolean}\n      @readOnly\n    */\n    get isEmpty() {\n      return this.currentState.isEmpty;\n    }\n\n    /**\n      If this property is `true` the record is in the `loading` state. A\n      record enters this state when the store asks the adapter for its\n      data. It remains in this state until the adapter provides the\n      requested data.\n       @property isLoading\n      @public\n      @type {Boolean}\n      @readOnly\n    */\n    get isLoading() {\n      return this.currentState.isLoading;\n    }\n\n    /**\n      If this property is `true` the record is in the `loaded` state. A\n      record enters this state when its data is populated. Most of a\n      record's lifecycle is spent inside substates of the `loaded`\n      state.\n       Example\n       ```javascript\n      let record = store.createRecord('model');\n      record.isLoaded; // true\n       store.findRecord('model', 1).then(function(model) {\n        model.isLoaded; // true\n      });\n      ```\n       @property isLoaded\n      @public\n      @type {Boolean}\n      @readOnly\n    */\n    get isLoaded() {\n      return this.currentState.isLoaded;\n    }\n\n    /**\n      If this property is `true` the record is in the `dirty` state. The\n      record has local changes that have not yet been saved by the\n      adapter. This includes records that have been created (but not yet\n      saved) or deleted.\n       Example\n       ```javascript\n      let record = store.createRecord('model');\n      record.hasDirtyAttributes; // true\n       store.findRecord('model', 1).then(function(model) {\n        model.hasDirtyAttributes; // false\n        model.set('foo', 'some value');\n        model.hasDirtyAttributes; // true\n      });\n      ```\n       @since 1.13.0\n      @property hasDirtyAttributes\n      @public\n      @type {Boolean}\n      @readOnly\n    */\n    get hasDirtyAttributes() {\n      return this.currentState.isDirty;\n    }\n\n    /**\n      If this property is `true` the record is in the `saving` state. A\n      record enters the saving state when `save` is called, but the\n      adapter has not yet acknowledged that the changes have been\n      persisted to the backend.\n       Example\n       ```javascript\n      let record = store.createRecord('model');\n      record.isSaving; // false\n      let promise = record.save();\n      record.isSaving; // true\n      promise.then(function() {\n        record.isSaving; // false\n      });\n      ```\n       @property isSaving\n      @public\n      @type {Boolean}\n      @readOnly\n    */\n    get isSaving() {\n      return this.currentState.isSaving;\n    }\n\n    /**\n      If this property is `true` the record is in the `deleted` state\n      and has been marked for deletion. When `isDeleted` is true and\n      `hasDirtyAttributes` is true, the record is deleted locally but the deletion\n      was not yet persisted. When `isSaving` is true, the change is\n      in-flight. When both `hasDirtyAttributes` and `isSaving` are false, the\n      change has persisted.\n       Example\n       ```javascript\n      let record = store.createRecord('model');\n      record.isDeleted;    // false\n      record.deleteRecord();\n       // Locally deleted\n      record.isDeleted;           // true\n      record.hasDirtyAttributes;  // true\n      record.isSaving;            // false\n       // Persisting the deletion\n      let promise = record.save();\n      record.isDeleted;    // true\n      record.isSaving;     // true\n       // Deletion Persisted\n      promise.then(function() {\n        record.isDeleted;          // true\n        record.isSaving;           // false\n        record.hasDirtyAttributes; // false\n      });\n      ```\n       @property isDeleted\n      @public\n      @type {Boolean}\n      @readOnly\n    */\n    get isDeleted() {\n      return this.currentState.isDeleted;\n    }\n\n    /**\n      If this property is `true` the record is in the `new` state. A\n      record will be in the `new` state when it has been created on the\n      client and the adapter has not yet report that it was successfully\n      saved.\n       Example\n       ```javascript\n      let record = store.createRecord('model');\n      record.isNew; // true\n       record.save().then(function(model) {\n        model.isNew; // false\n      });\n      ```\n       @property isNew\n      @public\n      @type {Boolean}\n      @readOnly\n    */\n    get isNew() {\n      return this.currentState.isNew;\n    }\n\n    /**\n      If this property is `true` the record is in the `valid` state.\n       A record will be in the `valid` state when the adapter did not report any\n      server-side validation failures.\n       @property isValid\n      @public\n      @type {Boolean}\n      @readOnly\n    */\n    get isValid() {\n      return this.currentState.isValid;\n    }\n\n    /**\n      If the record is in the dirty state this property will report what\n      kind of change has caused it to move into the dirty\n      state. Possible values are:\n       - `created` The record has been created by the client and not yet saved to the adapter.\n      - `updated` The record has been updated by the client and not yet saved to the adapter.\n      - `deleted` The record has been deleted by the client and not yet saved to the adapter.\n       Example\n       ```javascript\n      let record = store.createRecord('model');\n      record.dirtyType; // 'created'\n      ```\n       @property dirtyType\n      @public\n      @type {String}\n      @readOnly\n    */\n    get dirtyType() {\n      return this.currentState.dirtyType;\n    }\n\n    /**\n      If `true` the adapter reported that it was unable to save local\n      changes to the backend for any reason other than a server-side\n      validation error.\n       Example\n       ```javascript\n      record.isError; // false\n      record.set('foo', 'valid value');\n      record.save().then(null, function() {\n        record.isError; // true\n      });\n      ```\n       @property isError\n      @public\n      @type {Boolean}\n      @readOnly\n    */\n    get isError() {\n      return this.currentState.isError;\n    }\n    set isError(v) {\n      if (runtime.macroCondition(true)) {\n        throw new Error(`isError is not directly settable`);\n      }\n    }\n    /**\n      All ember models have an id property. This is an identifier\n      managed by an external source. These are always coerced to be\n      strings before being used internally. Note when declaring the\n      attributes for a model it is an error to declare an id\n      attribute.\n       ```javascript\n      let record = store.createRecord('model');\n      record.id; // null\n       store.findRecord('model', 1).then(function(model) {\n        model.id; // '1'\n      });\n      ```\n       @property id\n      @public\n      @type {String}\n    */\n    get id() {\n      // this guard exists, because some dev-only deprecation code\n      // (addListener via validatePropertyInjections) invokes toString before the\n      // object is real.\n      if (runtime.macroCondition(true)) {\n        try {\n          return store.recordIdentifierFor(this).id;\n        } catch {\n          return void 0;\n        }\n      }\n      return store.recordIdentifierFor(this).id;\n    }\n    set id(id) {\n      const normalizedId = Private.coerceId(id);\n      const identifier = store.recordIdentifierFor(this);\n      let didChange = normalizedId !== identifier.id;\n      (!(!didChange || identifier.id === null) && debug.assert(`Cannot set ${identifier.type} record's id to ${id}, because id is already ${identifier.id}`, !didChange || identifier.id === null));\n      if (normalizedId !== null && didChange) {\n        this.store._instanceCache.setRecordId(identifier, normalizedId);\n        this.store._notificationManager.notify(identifier, 'identity');\n      }\n    }\n    toString() {\n      return `<model::${this.constructor.modelName}:${this.id}>`;\n    }\n\n    /**\n      @property currentState\n      @private\n      @type {Object}\n    */\n    // TODO we can probably make this a computeOnce\n    // we likely do not need to notify the currentState root anymore\n    get currentState() {\n      // descriptors are called with the wrong `this` context during mergeMixins\n      // when using legacy/classic ember classes. Basically: lazy in prod and eager in dev.\n      // so we do this to try to steer folks to the nicer \"dont user currentState\"\n      // error.\n      if (runtime.macroCondition(!true)) {\n        if (!this.___recordState) {\n          this.___recordState = new RecordState(this);\n        }\n      }\n      return this.___recordState;\n    }\n    set currentState(_v) {\n      throw new Error('cannot set currentState');\n    }\n\n    /**\n      The store service instance which created this record instance\n      @property store\n      @public\n     */\n\n    /**\n      When the record is in the `invalid` state this object will contain\n      any errors returned by the adapter. When present the errors hash\n      contains keys corresponding to the invalid property names\n      and values which are arrays of Javascript objects with two keys:\n       - `message` A string containing the error message from the backend\n      - `attribute` The name of the property associated with this error message\n       ```javascript\n      record.errors.length; // 0\n      record.set('foo', 'invalid value');\n      record.save().catch(function() {\n        record.errors.foo;\n        // [{message: 'foo should be a number.', attribute: 'foo'}]\n      });\n      ```\n       The `errors` property is useful for displaying error messages to\n      the user.\n       ```handlebars\n      <label>Username: <Input @value={{@model.username}} /> </label>\n      {{#each @model.errors.username as |error|}}\n        <div class=\"error\">\n          {{error.message}}\n        </div>\n      {{/each}}\n      <label>Email: <Input @value={{@model.email}} /> </label>\n      {{#each @model.errors.email as |error|}}\n        <div class=\"error\">\n          {{error.message}}\n        </div>\n      {{/each}}\n      ```\n        You can also access the special `messages` property on the error\n      object to get an array of all the error strings.\n       ```handlebars\n      {{#each @model.errors.messages as |message|}}\n        <div class=\"error\">\n          {{message}}\n        </div>\n      {{/each}}\n      ```\n       @property errors\n      @public\n      @type {Errors}\n    */\n    get errors() {\n      let errors = Errors.create({\n        __record: this\n      });\n      this.currentState.updateInvalidErrors(errors);\n      return errors;\n    }\n\n    /**\n      This property holds the `AdapterError` object with which\n      last adapter operation was rejected.\n       @property adapterError\n      @public\n      @type {AdapterError}\n    */\n    get adapterError() {\n      return this.currentState.adapterError;\n    }\n    set adapterError(v) {\n      throw new Error(`adapterError is not directly settable`);\n    }\n\n    /**\n      Create a JSON representation of the record, using the serialization\n      strategy of the store's adapter.\n      `serialize` takes an optional hash as a parameter, currently\n      supported options are:\n      - `includeId`: `true` if the record's ID should be included in the\n        JSON representation.\n       @method serialize\n      @public\n      @param {Object} options\n      @return {Object} an object whose values are primitive JSON values only\n    */\n    serialize(options) {\n      return store.storeFor(this)._instanceCache.createSnapshot(store.recordIdentifierFor(this)).serialize(options);\n    }\n\n    /*\n      We hook the default implementation to ensure\n      our tagged properties are properly notified\n      as well. We still super for everything because\n      sync observers require a direct call occuring\n      to trigger their flush. We wouldn't need to\n      super in 4.0+ where sync observers are removed.\n     */\n    notifyPropertyChange(key) {\n      let tag = peekTag(this, key);\n      if (tag) {\n        tag.notify();\n      }\n      super.notifyPropertyChange(key);\n    }\n\n    /**\n      Marks the record as deleted but does not save it. You must call\n      `save` afterwards if you want to persist it. You might use this\n      method if you want to allow the user to still `rollbackAttributes()`\n      after a delete was made.\n       Example\n       ```app/controllers/model/delete.js\n      import Controller from '@ember/controller';\n      import { action } from '@ember/object';\n       export default class ModelDeleteController extends Controller {\n        @action\n        softDelete() {\n          this.model.deleteRecord();\n        }\n         @action\n        confirm() {\n          this.model.save();\n        }\n         @action\n        undo() {\n          this.model.rollbackAttributes();\n        }\n      }\n      ```\n       @method deleteRecord\n      @public\n    */\n    deleteRecord() {\n      // ensure we've populated currentState prior to deleting a new record\n      if (this.currentState) {\n        store.storeFor(this).deleteRecord(this);\n      }\n    }\n\n    /**\n      Same as `deleteRecord`, but saves the record immediately.\n       Example\n       ```app/controllers/model/delete.js\n      import Controller from '@ember/controller';\n      import { action } from '@ember/object';\n       export default class ModelDeleteController extends Controller {\n        @action\n        delete() {\n          this.model.destroyRecord().then(function() {\n            this.transitionToRoute('model.index');\n          });\n        }\n      }\n      ```\n       If you pass an object on the `adapterOptions` property of the options\n      argument it will be passed to your adapter via the snapshot\n       ```js\n      record.destroyRecord({ adapterOptions: { subscribe: false } });\n      ```\n       ```app/adapters/post.js\n      import MyCustomAdapter from './custom-adapter';\n       export default class PostAdapter extends MyCustomAdapter {\n        deleteRecord(store, type, snapshot) {\n          if (snapshot.adapterOptions.subscribe) {\n            // ...\n          }\n          // ...\n        }\n      }\n      ```\n       @method destroyRecord\n      @public\n      @param {Object} options\n      @return {Promise} a promise that will be resolved when the adapter returns\n      successfully or rejected if the adapter returns with an error.\n    */\n    destroyRecord(options) {\n      const {\n        isNew\n      } = this.currentState;\n      this.deleteRecord();\n      if (isNew) {\n        return rsvp.resolve(this);\n      }\n      return this.save(options).then(_ => {\n        runloop.run(() => {\n          this.unloadRecord();\n        });\n        return this;\n      });\n    }\n\n    /**\n      Unloads the record from the store. This will not send a delete request\n      to your server, it just unloads the record from memory.\n       @method unloadRecord\n      @public\n    */\n    unloadRecord() {\n      if (this.currentState.isNew && (this.isDestroyed || this.isDestroying)) {\n        return;\n      }\n      store.storeFor(this).unloadRecord(this);\n    }\n\n    /**\n      @method _notifyProperties\n      @private\n    */\n    _notifyProperties(keys) {\n      // changeProperties defers notifications until after the delegate\n      // and protects with a try...finally block\n      // previously used begin...endPropertyChanges but this is private API\n      changeProperties(() => {\n        let key;\n        for (let i = 0, length = keys.length; i < length; i++) {\n          key = keys[i];\n          this.notifyPropertyChange(key);\n        }\n      });\n    }\n\n    /**\n      Returns an object, whose keys are changed properties, and value is\n      an [oldProp, newProp] array.\n       The array represents the diff of the canonical state with the local state\n      of the model. Note: if the model is created locally, the canonical state is\n      empty since the adapter hasn't acknowledged the attributes yet:\n       Example\n       ```app/models/mascot.js\n      import Model, { attr } from '@ember-data/model';\n       export default class MascotModel extends Model {\n        @attr('string') name;\n        @attr('boolean', {\n          defaultValue: false\n        })\n        isAdmin;\n      }\n      ```\n       ```javascript\n      let mascot = store.createRecord('mascot');\n       mascot.changedAttributes(); // {}\n       mascot.set('name', 'Tomster');\n      mascot.changedAttributes(); // { name: [undefined, 'Tomster'] }\n       mascot.set('isAdmin', true);\n      mascot.changedAttributes(); // { isAdmin: [undefined, true], name: [undefined, 'Tomster'] }\n       mascot.save().then(function() {\n        mascot.changedAttributes(); // {}\n         mascot.set('isAdmin', false);\n        mascot.changedAttributes(); // { isAdmin: [true, false] }\n      });\n      ```\n       @method changedAttributes\n      @public\n      @return {Object} an object, whose keys are changed properties,\n        and value is an [oldProp, newProp] array.\n    */\n    changedAttributes() {\n      return Private.recordDataFor(this).changedAttrs(store.recordIdentifierFor(this));\n    }\n\n    /**\n      If the model `hasDirtyAttributes` this function will discard any unsaved\n      changes. If the model `isNew` it will be removed from the store.\n       Example\n       ```javascript\n      record.name; // 'Untitled Document'\n      record.set('name', 'Doc 1');\n      record.name; // 'Doc 1'\n      record.rollbackAttributes();\n      record.name; // 'Untitled Document'\n      ```\n       @since 1.13.0\n      @method rollbackAttributes\n      @public\n    */\n    rollbackAttributes() {\n      const {\n        currentState\n      } = this;\n      const {\n        isNew\n      } = currentState;\n      store.storeFor(this)._join(() => {\n        Private.recordDataFor(this).rollbackAttrs(store.recordIdentifierFor(this));\n        this.errors.clear();\n        currentState.cleanErrorRequests();\n        if (isNew) {\n          this.unloadRecord();\n        }\n      });\n    }\n\n    /**\n      @method _createSnapshot\n      @private\n    */\n    // TODO @deprecate in favor of a public API or examples of how to test successfully\n    _createSnapshot() {\n      return store.storeFor(this)._instanceCache.createSnapshot(store.recordIdentifierFor(this));\n    }\n\n    /**\n      Save the record and persist any changes to the record to an\n      external source via the adapter.\n       Example\n       ```javascript\n      record.set('name', 'Tomster');\n      record.save().then(function() {\n        // Success callback\n      }, function() {\n        // Error callback\n      });\n      ```\n      If you pass an object using the `adapterOptions` property of the options\n     argument it will be passed to your adapter via the snapshot.\n       ```js\n      record.save({ adapterOptions: { subscribe: false } });\n      ```\n       ```app/adapters/post.js\n      import MyCustomAdapter from './custom-adapter';\n       export default class PostAdapter extends MyCustomAdapter {\n        updateRecord(store, type, snapshot) {\n          if (snapshot.adapterOptions.subscribe) {\n            // ...\n          }\n          // ...\n        }\n      }\n      ```\n       @method save\n      @public\n      @param {Object} options\n      @return {Promise} a promise that will be resolved when the adapter returns\n      successfully or rejected if the adapter returns with an error.\n    */\n    save(options) {\n      let promise;\n      if (this.currentState.isNew && this.currentState.isDeleted) {\n        promise = rsvp.resolve(this);\n      } else {\n        promise = store.storeFor(this).saveRecord(this, options);\n      }\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_SAVE_PROMISE_ACCESS)) {\n        return deprecatedPromiseObject(promise);\n      }\n      return promise;\n    }\n\n    /**\n      Reload the record from the adapter.\n       This will only work if the record has already finished loading.\n       Example\n       ```app/controllers/model/view.js\n      import Controller from '@ember/controller';\n      import { action } from '@ember/object';\n       export default class ViewController extends Controller {\n        @action\n        reload() {\n          this.model.reload().then(function(model) {\n          // do something with the reloaded model\n          });\n        }\n      }\n      ```\n       @method reload\n      @public\n      @param {Object} options optional, may include `adapterOptions` hash which will be passed to adapter request\n      @return {Promise} a promise that will be resolved with the record when the\n      adapter returns successfully or rejected if the adapter returns\n      with an error.\n    */\n    reload(_options) {\n      let options = {};\n      if (typeof _options === 'object' && _options !== null && _options.adapterOptions) {\n        options.adapterOptions = _options.adapterOptions;\n      }\n      options.isReloading = true;\n      let identifier = store.recordIdentifierFor(this);\n      (!(identifier.id) && debug.assert(`You cannot reload a record without an ID`, identifier.id));\n      this.isReloading = true;\n      const promise = store.storeFor(this)._fetchManager.scheduleFetch(identifier, options).then(() => this).finally(() => {\n        this.isReloading = false;\n      });\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_SAVE_PROMISE_ACCESS)) {\n        return deprecatedPromiseObject(promise);\n      }\n      return promise;\n    }\n    attr() {\n      (debug.assert('The `attr` method is not available on Model, a Snapshot was probably expected. Are you passing a Model instead of a Snapshot to your serializer?', false));\n    }\n\n    /**\n      Get the reference for the specified belongsTo relationship.\n       Example\n       ```app/models/blog.js\n      import Model, { belongsTo } from '@ember-data/model';\n       export default class BlogModel extends Model {\n        @belongsTo('user', { async: true, inverse: null }) user;\n      }\n      ```\n       ```javascript\n      let blog = store.push({\n        data: {\n          type: 'blog',\n          id: 1,\n          relationships: {\n            user: {\n              data: { type: 'user', id: 1 }\n            }\n          }\n        }\n      });\n      let userRef = blog.belongsTo('user');\n       // check if the user relationship is loaded\n      let isLoaded = userRef.value() !== null;\n       // get the record of the reference (null if not yet available)\n      let user = userRef.value();\n       // get the identifier of the reference\n      if (userRef.remoteType() === \"id\") {\n        let id = userRef.id();\n      } else if (userRef.remoteType() === \"link\") {\n        let link = userRef.link();\n      }\n       // load user (via store.findRecord or store.findBelongsTo)\n      userRef.load().then(...)\n       // or trigger a reload\n      userRef.reload().then(...)\n       // provide data for reference\n      userRef.push({\n        type: 'user',\n        id: 1,\n        attributes: {\n          username: \"@user\"\n        }\n      }).then(function(user) {\n        userRef.value() === user;\n      });\n      ```\n       @method belongsTo\n      @public\n      @param {String} name of the relationship\n      @since 2.5.0\n      @return {BelongsToReference} reference for this relationship\n    */\n    belongsTo(name) {\n      return lookupLegacySupport(this).referenceFor('belongsTo', name);\n    }\n\n    /**\n      Get the reference for the specified hasMany relationship.\n       Example\n       ```app/models/blog.js\n      import Model, { hasMany } from '@ember-data/model';\n       export default class BlogModel extends Model {\n        @hasMany('comment', { async: true, inverse: null }) comments;\n      }\n       let blog = store.push({\n        data: {\n          type: 'blog',\n          id: 1,\n          relationships: {\n            comments: {\n              data: [\n                { type: 'comment', id: 1 },\n                { type: 'comment', id: 2 }\n              ]\n            }\n          }\n        }\n      });\n      let commentsRef = blog.hasMany('comments');\n       // check if the comments are loaded already\n      let isLoaded = commentsRef.value() !== null;\n       // get the records of the reference (null if not yet available)\n      let comments = commentsRef.value();\n       // get the identifier of the reference\n      if (commentsRef.remoteType() === \"ids\") {\n        let ids = commentsRef.ids();\n      } else if (commentsRef.remoteType() === \"link\") {\n        let link = commentsRef.link();\n      }\n       // load comments (via store.findMany or store.findHasMany)\n      commentsRef.load().then(...)\n       // or trigger a reload\n      commentsRef.reload().then(...)\n       // provide data for reference\n      commentsRef.push([{ type: 'comment', id: 1 }, { type: 'comment', id: 2 }]).then(function(comments) {\n        commentsRef.value() === comments;\n      });\n      ```\n       @method hasMany\n      @public\n      @param {String} name of the relationship\n      @since 2.5.0\n      @return {HasManyReference} reference for this relationship\n    */\n    hasMany(name) {\n      return lookupLegacySupport(this).referenceFor('hasMany', name);\n    }\n\n    /**\n     Given a callback, iterates over each of the relationships in the model,\n     invoking the callback with the name of each relationship and its relationship\n     descriptor.\n       The callback method you provide should have the following signature (all\n     parameters are optional):\n      ```javascript\n     function(name, descriptor);\n     ```\n      - `name` the name of the current property in the iteration\n     - `descriptor` the meta object that describes this relationship\n      The relationship descriptor argument is an object with the following properties.\n      - **key** <span class=\"type\">String</span> the name of this relationship on the Model\n     - **kind** <span class=\"type\">String</span> \"hasMany\" or \"belongsTo\"\n     - **options** <span class=\"type\">Object</span> the original options hash passed when the relationship was declared\n     - **parentType** <span class=\"type\">Model</span> the type of the Model that owns this relationship\n     - **type** <span class=\"type\">String</span> the type name of the related Model\n      Note that in addition to a callback, you can also pass an optional target\n     object that will be set as `this` on the context.\n      Example\n      ```app/serializers/application.js\n     import JSONSerializer from '@ember-data/serializer/json';\n      export default class ApplicationSerializer extends JSONSerializer {\n        serialize(record, options) {\n        let json = {};\n         record.eachRelationship(function(name, descriptor) {\n          if (descriptor.kind === 'hasMany') {\n            let serializedHasManyName = name.toUpperCase() + '_IDS';\n            json[serializedHasManyName] = record.get(name).map(r => r.id);\n          }\n        });\n         return json;\n      }\n    }\n     ```\n      @method eachRelationship\n      @public\n     @param {Function} callback the callback to invoke\n     @param {any} binding the value to which the callback's `this` should be bound\n     */\n    eachRelationship(callback, binding) {\n      this.constructor.eachRelationship(callback, binding);\n    }\n    relationshipFor(name) {\n      return this.constructor.relationshipsByName.get(name);\n    }\n    inverseFor(key) {\n      return this.constructor.inverseFor(key, store.storeFor(this));\n    }\n    eachAttribute(callback, binding) {\n      this.constructor.eachAttribute(callback, binding);\n    }\n    /*\n     These class methods below provide relationship\n     introspection abilities about relationships.\n      A note about the computed properties contained here:\n      **These properties are effectively sealed once called for the first time.**\n     To avoid repeatedly doing expensive iteration over a model's fields, these\n     values are computed once and then cached for the remainder of the runtime of\n     your application.\n      If your application needs to modify a class after its initial definition\n     (for example, using `reopen()` to add additional attributes), make sure you\n     do it before using your model with the store, which uses these properties\n     extensively.\n     */\n\n    /**\n     For a given relationship name, returns the model type of the relationship.\n      For example, if you define a model like this:\n      ```app/models/post.js\n     import Model, { hasMany } from '@ember-data/model';\n      export default class PostModel extends Model {\n       @hasMany('comment') comments;\n     }\n     ```\n      Calling `store.modelFor('post').typeForRelationship('comments', store)` will return `Comment`.\n      @method typeForRelationship\n      @public\n     @static\n     @param {String} name the name of the relationship\n     @param {store} store an instance of Store\n     @return {Model} the type of the relationship, or undefined\n     */\n    static typeForRelationship(name, store) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_EARLY_STATIC)) {\n        (!(this.modelName) && debug.deprecate(`Accessing schema information on Models without looking up the model via the store is deprecated. Use store.modelFor (or better Snapshots or the store.getSchemaDefinitionService() apis) instead.`, this.modelName, {\n          id: 'ember-data:deprecate-early-static',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            available: '4.7',\n            enabled: '4.7'\n          }\n        }));\n      } else {\n        (!(this.modelName) && debug.assert(`Accessing schema information on Models without looking up the model via the store is disallowed.`, this.modelName));\n      }\n      let relationship = this.relationshipsByName.get(name);\n      return relationship && store.modelFor(relationship.type);\n    }\n    static get inverseMap() {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_EARLY_STATIC)) {\n        (!(this.modelName) && debug.deprecate(`Accessing schema information on Models without looking up the model via the store is deprecated. Use store.modelFor (or better Snapshots or the store.getSchemaDefinitionService() apis) instead.`, this.modelName, {\n          id: 'ember-data:deprecate-early-static',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            available: '4.7',\n            enabled: '4.7'\n          }\n        }));\n      } else {\n        (!(this.modelName) && debug.assert(`Accessing schema information on Models without looking up the model via the store is disallowed.`, this.modelName));\n      }\n      return Object.create(null);\n    }\n\n    /**\n     Find the relationship which is the inverse of the one asked for.\n      For example, if you define models like this:\n      ```app/models/post.js\n     import Model, { hasMany } from '@ember-data/model';\n      export default class PostModel extends Model {\n        @hasMany('message') comments;\n      }\n     ```\n      ```app/models/message.js\n     import Model, { belongsTo } from '@ember-data/model';\n      export default class MessageModel extends Model {\n        @belongsTo('post') owner;\n      }\n     ```\n      ``` js\n     store.modelFor('post').inverseFor('comments', store) // { type: App.Message, name: 'owner', kind: 'belongsTo' }\n     store.modelFor('message').inverseFor('owner', store) // { type: App.Post, name: 'comments', kind: 'hasMany' }\n     ```\n      @method inverseFor\n      @public\n     @static\n     @param {String} name the name of the relationship\n     @param {Store} store\n     @return {Object} the inverse relationship, or null\n     */\n    static inverseFor(name, store) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_EARLY_STATIC)) {\n        (!(this.modelName) && debug.deprecate(`Accessing schema information on Models without looking up the model via the store is deprecated. Use store.modelFor (or better Snapshots or the store.getSchemaDefinitionService() apis) instead.`, this.modelName, {\n          id: 'ember-data:deprecate-early-static',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            available: '4.7',\n            enabled: '4.7'\n          }\n        }));\n      } else {\n        (!(this.modelName) && debug.assert(`Accessing schema information on Models without looking up the model via the store is disallowed.`, this.modelName));\n      }\n      let inverseMap = this.inverseMap;\n      if (inverseMap[name]) {\n        return inverseMap[name];\n      } else {\n        let inverse = this._findInverseFor(name, store);\n        inverseMap[name] = inverse;\n        return inverse;\n      }\n    }\n\n    //Calculate the inverse, ignoring the cache\n    static _findInverseFor(name, store) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_EARLY_STATIC)) {\n        (!(this.modelName) && debug.deprecate(`Accessing schema information on Models without looking up the model via the store is deprecated. Use store.modelFor (or better Snapshots or the store.getSchemaDefinitionService() apis) instead.`, this.modelName, {\n          id: 'ember-data:deprecate-early-static',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            available: '4.7',\n            enabled: '4.7'\n          }\n        }));\n      } else {\n        (!(this.modelName) && debug.assert(`Accessing schema information on Models without looking up the model via the store is disallowed.`, this.modelName));\n      }\n      const relationship = this.relationshipsByName.get(name);\n      const {\n        options\n      } = relationship;\n      const isPolymorphic = options.polymorphic;\n\n      //If inverse is manually specified to be null, like  `comments: hasMany('message', { inverse: null })`\n      const isExplicitInverseNull = options.inverse === null;\n      const isAbstractType = !isExplicitInverseNull && isPolymorphic && !store.getSchemaDefinitionService().doesTypeExist(relationship.type);\n      if (isExplicitInverseNull || isAbstractType) {\n        (!(!isPolymorphic || isExplicitInverseNull) && debug.assert(`No schema for the abstract type '${relationship.type}' for the polymorphic relationship '${name}' on '${this.modelName}' was provided by the SchemaDefinitionService.`, !isPolymorphic || isExplicitInverseNull));\n        return null;\n      }\n      let fieldOnInverse, inverseKind, inverseRelationship, inverseOptions;\n      let inverseSchema = this.typeForRelationship(name, store);\n\n      // if the type does not exist and we are not polymorphic\n      //If inverse is specified manually, return the inverse\n      if (options.inverse !== undefined) {\n        fieldOnInverse = options.inverse;\n        inverseRelationship = inverseSchema && inverseSchema.relationshipsByName.get(fieldOnInverse);\n        (!(inverseRelationship) && debug.assert(`We found no field named '${fieldOnInverse}' on the schema for '${inverseSchema.modelName}' to be the inverse of the '${name}' relationship on '${this.modelName}'. This is most likely due to a missing field on your model definition.`, inverseRelationship)); // TODO probably just return the whole inverse here\n        inverseKind = inverseRelationship.kind;\n        inverseOptions = inverseRelationship.options;\n      } else {\n        //No inverse was specified manually, we need to use a heuristic to guess one\n        if (relationship.type === relationship.parentModelName) {\n          (debug.warn(`Detected a reflexive relationship named '${name}' on the schema for '${relationship.type}' without an inverse option. Look at https://guides.emberjs.com/current/models/relationships/#toc_reflexive-relations for how to explicitly specify inverses.`, false, {\n            id: 'ds.model.reflexive-relationship-without-inverse'\n          }));\n        }\n        let possibleRelationships = findPossibleInverses(this, inverseSchema, name);\n        if (possibleRelationships.length === 0) {\n          return null;\n        }\n        if (runtime.macroCondition(true)) {\n          let filteredRelationships = possibleRelationships.filter(possibleRelationship => {\n            let optionsForRelationship = possibleRelationship.options;\n            return name === optionsForRelationship.inverse;\n          });\n          (!(filteredRelationships.length < 2) && debug.assert(\"You defined the '\" + name + \"' relationship on \" + this + ', but you defined the inverse relationships of type ' + inverseSchema.toString() + ' multiple times. Look at https://guides.emberjs.com/current/models/relationships/#toc_explicit-inverses for how to explicitly specify inverses', filteredRelationships.length < 2));\n        }\n        let explicitRelationship = possibleRelationships.find(relationship => relationship.options.inverse === name);\n        if (explicitRelationship) {\n          possibleRelationships = [explicitRelationship];\n        }\n        (!(possibleRelationships.length === 1) && debug.assert(\"You defined the '\" + name + \"' relationship on \" + this + ', but multiple possible inverse relationships of type ' + this + ' were found on ' + inverseSchema + '. Look at https://guides.emberjs.com/current/models/relationships/#toc_explicit-inverses for how to explicitly specify inverses', possibleRelationships.length === 1));\n        fieldOnInverse = possibleRelationships[0].name;\n        inverseKind = possibleRelationships[0].kind;\n        inverseOptions = possibleRelationships[0].options;\n      }\n\n      // ensure inverse is properly configured\n      if (runtime.macroCondition(true)) {\n        if (isPolymorphic) {\n          if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_NON_EXPLICIT_POLYMORPHISM)) {\n            if (!inverseOptions.as) {\n              (debug.deprecate(`Relationships that satisfy polymorphic relationships MUST define which abstract-type they are satisfying using 'as'. The field '${fieldOnInverse}' on type '${inverseSchema.modelName}' is misconfigured.`, false, {\n                id: 'ember-data:non-explicit-relationships',\n                since: {\n                  enabled: '4.7',\n                  available: '4.7'\n                },\n                until: '5.0',\n                for: 'ember-data'\n              }));\n            }\n          } else {\n            (!(inverseOptions.as) && debug.assert(`Relationships that satisfy polymorphic relationships MUST define which abstract-type they are satisfying using 'as'. The field '${fieldOnInverse}' on type '${inverseSchema.modelName}' is misconfigured.`, inverseOptions.as));\n            (!(!!inverseOptions.as && relationship.type === inverseOptions.as) && debug.assert(`options.as should match the expected type of the polymorphic relationship. Expected field '${fieldOnInverse}' on type '${inverseSchema.modelName}' to specify '${relationship.type}' but found '${inverseOptions.as}'`, !!inverseOptions.as && relationship.type === inverseOptions.as));\n          }\n        }\n      }\n\n      // ensure we are properly configured\n      if (runtime.macroCondition(true)) {\n        if (inverseOptions.polymorphic) {\n          if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_NON_EXPLICIT_POLYMORPHISM)) {\n            if (!options.as) {\n              (debug.deprecate(`Relationships that satisfy polymorphic relationships MUST define which abstract-type they are satisfying using 'as'. The field '${name}' on type '${this.modelName}' is misconfigured.`, false, {\n                id: 'ember-data:non-explicit-relationships',\n                since: {\n                  enabled: '4.7',\n                  available: '4.7'\n                },\n                until: '5.0',\n                for: 'ember-data'\n              }));\n            }\n          } else {\n            (!(options.as) && debug.assert(`Relationships that satisfy polymorphic relationships MUST define which abstract-type they are satisfying using 'as'. The field '${name}' on type '${this.modelName}' is misconfigured.`, options.as));\n            (!(!!options.as && inverseRelationship.type === options.as) && debug.assert(`options.as should match the expected type of the polymorphic relationship. Expected field '${name}' on type '${this.modelName}' to specify '${inverseRelationship.type}' but found '${options.as}'`, !!options.as && inverseRelationship.type === options.as));\n          }\n        }\n      }\n      (!(inverseOptions.inverse !== null) && debug.assert(`The ${inverseSchema.modelName}:${fieldOnInverse} relationship declares 'inverse: null', but it was resolved as the inverse for ${this.modelName}:${name}.`, inverseOptions.inverse !== null));\n      return {\n        type: inverseSchema,\n        name: fieldOnInverse,\n        kind: inverseKind,\n        options: inverseOptions\n      };\n    }\n\n    /**\n     The model's relationships as a map, keyed on the type of the\n     relationship. The value of each entry is an array containing a descriptor\n     for each relationship with that type, describing the name of the relationship\n     as well as the type.\n      For example, given the following model definition:\n      ```app/models/blog.js\n     import Model, { belongsTo, hasMany } from '@ember-data/model';\n      export default class BlogModel extends Model {\n        @hasMany('user') users;\n        @belongsTo('user') owner;\n        @hasMany('post') posts;\n      }\n     ```\n      This computed property would return a map describing these\n     relationships, like this:\n      ```javascript\n     import { get } from '@ember/object';\n     import Blog from 'app/models/blog';\n     import User from 'app/models/user';\n     import Post from 'app/models/post';\n      let relationships = Blog.relationships;\n     relationships.user;\n     //=> [ { name: 'users', kind: 'hasMany' },\n     //     { name: 'owner', kind: 'belongsTo' } ]\n     relationships.post;\n     //=> [ { name: 'posts', kind: 'hasMany' } ]\n     ```\n      @property relationships\n      @public\n     @static\n     @type Map\n     @readOnly\n     */\n\n    static get relationships() {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_EARLY_STATIC)) {\n        (!(this.modelName) && debug.deprecate(`Accessing schema information on Models without looking up the model via the store is deprecated. Use store.modelFor (or better Snapshots or the store.getSchemaDefinitionService() apis) instead.`, this.modelName, {\n          id: 'ember-data:deprecate-early-static',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            available: '4.7',\n            enabled: '4.7'\n          }\n        }));\n      } else {\n        (!(this.modelName) && debug.assert(`Accessing schema information on Models without looking up the model via the store is disallowed.`, this.modelName));\n      }\n      let map = new Map();\n      let relationshipsByName = this.relationshipsByName;\n\n      // Loop through each computed property on the class\n      relationshipsByName.forEach(desc => {\n        let {\n          type\n        } = desc;\n        if (!map.has(type)) {\n          map.set(type, []);\n        }\n        map.get(type).push(desc);\n      });\n      return map;\n    }\n\n    /**\n     A hash containing lists of the model's relationships, grouped\n     by the relationship kind. For example, given a model with this\n     definition:\n      ```app/models/blog.js\n     import Model, { belongsTo, hasMany } from '@ember-data/model';\n      export default class BlogModel extends Model {\n        @hasMany('user') users;\n        @belongsTo('user') owner;\n         @hasMany('post') posts;\n      }\n     ```\n      This property would contain the following:\n      ```javascript\n     import { get } from '@ember/object';\n     import Blog from 'app/models/blog';\n      let relationshipNames = Blog.relationshipNames;\n     relationshipNames.hasMany;\n     //=> ['users', 'posts']\n     relationshipNames.belongsTo;\n     //=> ['owner']\n     ```\n      @property relationshipNames\n      @public\n     @static\n     @type Object\n     @readOnly\n     */\n    static get relationshipNames() {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_EARLY_STATIC)) {\n        (!(this.modelName) && debug.deprecate(`Accessing schema information on Models without looking up the model via the store is deprecated. Use store.modelFor (or better Snapshots or the store.getSchemaDefinitionService() apis) instead.`, this.modelName, {\n          id: 'ember-data:deprecate-early-static',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            available: '4.7',\n            enabled: '4.7'\n          }\n        }));\n      } else {\n        (!(this.modelName) && debug.assert(`Accessing schema information on Models without looking up the model via the store is disallowed.`, this.modelName));\n      }\n      let names = {\n        hasMany: [],\n        belongsTo: []\n      };\n      this.eachComputedProperty((name, meta) => {\n        if (meta.isRelationship) {\n          names[meta.kind].push(name);\n        }\n      });\n      return names;\n    }\n\n    /**\n     An array of types directly related to a model. Each type will be\n     included once, regardless of the number of relationships it has with\n     the model.\n      For example, given a model with this definition:\n      ```app/models/blog.js\n     import Model, { belongsTo, hasMany } from '@ember-data/model';\n      export default class BlogModel extends Model {\n        @hasMany('user') users;\n        @belongsTo('user') owner;\n         @hasMany('post') posts;\n      }\n     ```\n      This property would contain the following:\n      ```javascript\n     import { get } from '@ember/object';\n     import Blog from 'app/models/blog';\n      let relatedTypes = Blog.relatedTypes');\n     //=> [ User, Post ]\n     ```\n      @property relatedTypes\n      @public\n     @static\n     @type Ember.Array\n     @readOnly\n     */\n    static get relatedTypes() {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_EARLY_STATIC)) {\n        (!(this.modelName) && debug.deprecate(`Accessing schema information on Models without looking up the model via the store is deprecated. Use store.modelFor (or better Snapshots or the store.getSchemaDefinitionService() apis) instead.`, this.modelName, {\n          id: 'ember-data:deprecate-early-static',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            available: '4.7',\n            enabled: '4.7'\n          }\n        }));\n      } else {\n        (!(this.modelName) && debug.assert(`Accessing schema information on Models without looking up the model via the store is disallowed.`, this.modelName));\n      }\n      let types = [];\n      let rels = this.relationshipsObject;\n      let relationships = Object.keys(rels);\n\n      // create an array of the unique types involved\n      // in relationships\n      for (let i = 0; i < relationships.length; i++) {\n        let name = relationships[i];\n        let meta = rels[name];\n        let modelName = meta.type;\n        if (types.indexOf(modelName) === -1) {\n          types.push(modelName);\n        }\n      }\n      return types;\n    }\n\n    /**\n     A map whose keys are the relationships of a model and whose values are\n     relationship descriptors.\n      For example, given a model with this\n     definition:\n      ```app/models/blog.js\n     import Model, { belongsTo, hasMany } from '@ember-data/model';\n      export default class BlogModel extends Model {\n        @hasMany('user') users;\n        @belongsTo('user') owner;\n         @hasMany('post') posts;\n      }\n     ```\n      This property would contain the following:\n      ```javascript\n     import { get } from '@ember/object';\n     import Blog from 'app/models/blog';\n      let relationshipsByName = Blog.relationshipsByName;\n     relationshipsByName.users;\n     //=> { key: 'users', kind: 'hasMany', type: 'user', options: Object, isRelationship: true }\n     relationshipsByName.owner;\n     //=> { key: 'owner', kind: 'belongsTo', type: 'user', options: Object, isRelationship: true }\n     ```\n      @property relationshipsByName\n      @public\n     @static\n     @type Map\n     @readOnly\n     */\n    static get relationshipsByName() {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_EARLY_STATIC)) {\n        (!(this.modelName) && debug.deprecate(`Accessing schema information on Models without looking up the model via the store is deprecated. Use store.modelFor (or better Snapshots or the store.getSchemaDefinitionService() apis) instead.`, this.modelName, {\n          id: 'ember-data:deprecate-early-static',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            available: '4.7',\n            enabled: '4.7'\n          }\n        }));\n      } else {\n        (!(this.modelName) && debug.assert(`Accessing schema information on Models without looking up the model via the store is disallowed.`, this.modelName));\n      }\n      let map = new Map();\n      let rels = this.relationshipsObject;\n      let relationships = Object.keys(rels);\n      for (let i = 0; i < relationships.length; i++) {\n        let key = relationships[i];\n        let value = rels[key];\n        map.set(value.key, value);\n      }\n      return map;\n    }\n    static get relationshipsObject() {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_EARLY_STATIC)) {\n        (!(this.modelName) && debug.deprecate(`Accessing schema information on Models without looking up the model via the store is deprecated. Use store.modelFor (or better Snapshots or the store.getSchemaDefinitionService() apis) instead.`, this.modelName, {\n          id: 'ember-data:deprecate-early-static',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            available: '4.7',\n            enabled: '4.7'\n          }\n        }));\n      } else {\n        (!(this.modelName) && debug.assert(`Accessing schema information on Models without looking up the model via the store is disallowed.`, this.modelName));\n      }\n      let relationships = Object.create(null);\n      let modelName = this.modelName;\n      this.eachComputedProperty((name, meta) => {\n        if (meta.isRelationship) {\n          meta.key = name;\n          meta.name = name;\n          meta.parentModelName = modelName;\n          relationships[name] = runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_RELATIONSHIPS_WITHOUT_INVERSE) ? relationshipFromMeta(meta) : meta;\n        }\n      });\n      return relationships;\n    }\n\n    /**\n     A map whose keys are the fields of the model and whose values are strings\n     describing the kind of the field. A model's fields are the union of all of its\n     attributes and relationships.\n      For example:\n      ```app/models/blog.js\n     import Model, { attr, belongsTo, hasMany } from '@ember-data/model';\n      export default class BlogModel extends Model {\n        @hasMany('user') users;\n        @belongsTo('user') owner;\n         @hasMany('post') posts;\n         @attr('string') title;\n      }\n     ```\n      ```js\n     import { get } from '@ember/object';\n     import Blog from 'app/models/blog'\n      let fields = Blog.fields;\n     fields.forEach(function(kind, field) {\n        // do thing\n      });\n      // prints:\n     // users, hasMany\n     // owner, belongsTo\n     // posts, hasMany\n     // title, attribute\n     ```\n      @property fields\n      @public\n     @static\n     @type Map\n     @readOnly\n     */\n    static get fields() {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_EARLY_STATIC)) {\n        (!(this.modelName) && debug.deprecate(`Accessing schema information on Models without looking up the model via the store is deprecated. Use store.modelFor (or better Snapshots or the store.getSchemaDefinitionService() apis) instead.`, this.modelName, {\n          id: 'ember-data:deprecate-early-static',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            available: '4.7',\n            enabled: '4.7'\n          }\n        }));\n      } else {\n        (!(this.modelName) && debug.assert(`Accessing schema information on Models without looking up the model via the store is disallowed.`, this.modelName));\n      }\n      let map = new Map();\n      this.eachComputedProperty((name, meta) => {\n        // TODO end reliance on these booleans and stop leaking them in the spec\n        if (meta.isRelationship) {\n          map.set(name, meta.kind);\n        } else if (meta.isAttribute) {\n          map.set(name, 'attribute');\n        }\n      });\n      return map;\n    }\n\n    /**\n     Given a callback, iterates over each of the relationships in the model,\n     invoking the callback with the name of each relationship and its relationship\n     descriptor.\n      @method eachRelationship\n      @public\n     @static\n     @param {Function} callback the callback to invoke\n     @param {any} binding the value to which the callback's `this` should be bound\n     */\n    static eachRelationship(callback, binding) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_EARLY_STATIC)) {\n        (!(this.modelName) && debug.deprecate(`Accessing schema information on Models without looking up the model via the store is deprecated. Use store.modelFor (or better Snapshots or the store.getSchemaDefinitionService() apis) instead.`, this.modelName, {\n          id: 'ember-data:deprecate-early-static',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            available: '4.7',\n            enabled: '4.7'\n          }\n        }));\n      } else {\n        (!(this.modelName) && debug.assert(`Accessing schema information on Models without looking up the model via the store is disallowed.`, this.modelName));\n      }\n      this.relationshipsByName.forEach((relationship, name) => {\n        callback.call(binding, name, relationship);\n      });\n    }\n\n    /**\n     Given a callback, iterates over each of the types related to a model,\n     invoking the callback with the related type's class. Each type will be\n     returned just once, regardless of how many different relationships it has\n     with a model.\n      @method eachRelatedType\n      @public\n     @static\n     @param {Function} callback the callback to invoke\n     @param {any} binding the value to which the callback's `this` should be bound\n     */\n    static eachRelatedType(callback, binding) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_EARLY_STATIC)) {\n        (!(this.modelName) && debug.deprecate(`Accessing schema information on Models without looking up the model via the store is deprecated. Use store.modelFor (or better Snapshots or the store.getSchemaDefinitionService() apis) instead.`, this.modelName, {\n          id: 'ember-data:deprecate-early-static',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            available: '4.7',\n            enabled: '4.7'\n          }\n        }));\n      } else {\n        (!(this.modelName) && debug.assert(`Accessing schema information on Models without looking up the model via the store is disallowed.`, this.modelName));\n      }\n      let relationshipTypes = this.relatedTypes;\n      for (let i = 0; i < relationshipTypes.length; i++) {\n        let type = relationshipTypes[i];\n        callback.call(binding, type);\n      }\n    }\n    static determineRelationshipType(knownSide, store) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_EARLY_STATIC)) {\n        (!(this.modelName) && debug.deprecate(`Accessing schema information on Models without looking up the model via the store is deprecated. Use store.modelFor (or better Snapshots or the store.getSchemaDefinitionService() apis) instead.`, this.modelName, {\n          id: 'ember-data:deprecate-early-static',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            available: '4.7',\n            enabled: '4.7'\n          }\n        }));\n      } else {\n        (!(this.modelName) && debug.assert(`Accessing schema information on Models without looking up the model via the store is disallowed.`, this.modelName));\n      }\n      let knownKey = knownSide.key;\n      let knownKind = knownSide.kind;\n      let inverse = this.inverseFor(knownKey, store);\n      // let key;\n      let otherKind;\n      if (!inverse) {\n        return knownKind === 'belongsTo' ? 'oneToNone' : 'manyToNone';\n      }\n\n      // key = inverse.name;\n      otherKind = inverse.kind;\n      if (otherKind === 'belongsTo') {\n        return knownKind === 'belongsTo' ? 'oneToOne' : 'manyToOne';\n      } else {\n        return knownKind === 'belongsTo' ? 'oneToMany' : 'manyToMany';\n      }\n    }\n\n    /**\n     A map whose keys are the attributes of the model (properties\n     described by attr) and whose values are the meta object for the\n     property.\n      Example\n      ```app/models/person.js\n     import Model, { attr } from '@ember-data/model';\n      export default class PersonModel extends Model {\n        @attr('string') firstName;\n        @attr('string') lastName;\n        @attr('date') birthday;\n      }\n     ```\n      ```javascript\n     import { get } from '@ember/object';\n     import Person from 'app/models/person'\n      let attributes = Person.attributes\n      attributes.forEach(function(meta, name) {\n        // do thing\n      });\n      // prints:\n     // firstName {type: \"string\", isAttribute: true, options: Object, parentType: function, name: \"firstName\"}\n     // lastName {type: \"string\", isAttribute: true, options: Object, parentType: function, name: \"lastName\"}\n     // birthday {type: \"date\", isAttribute: true, options: Object, parentType: function, name: \"birthday\"}\n     ```\n      @property attributes\n      @public\n     @static\n     @type {Map}\n     @readOnly\n     */\n    static get attributes() {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_EARLY_STATIC)) {\n        (!(this.modelName) && debug.deprecate(`Accessing schema information on Models without looking up the model via the store is deprecated. Use store.modelFor (or better Snapshots or the store.getSchemaDefinitionService() apis) instead.`, this.modelName, {\n          id: 'ember-data:deprecate-early-static',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            available: '4.7',\n            enabled: '4.7'\n          }\n        }));\n      } else {\n        (!(this.modelName) && debug.assert(`Accessing schema information on Models without looking up the model via the store is disallowed.`, this.modelName));\n      }\n      let map = new Map();\n      this.eachComputedProperty((name, meta) => {\n        if (meta.isAttribute) {\n          (!(name !== 'id') && debug.assert(\"You may not set `id` as an attribute on your model. Please remove any lines that look like: `id: attr('<type>')` from \" + this.toString(), name !== 'id'));\n          meta.name = name;\n          map.set(name, meta);\n        }\n      });\n      return map;\n    }\n\n    /**\n     A map whose keys are the attributes of the model (properties\n     described by attr) and whose values are type of transformation\n     applied to each attribute. This map does not include any\n     attributes that do not have an transformation type.\n      Example\n      ```app/models/person.js\n     import Model, { attr } from '@ember-data/model';\n      export default class PersonModel extends Model {\n        @attr firstName;\n        @attr('string') lastName;\n        @attr('date') birthday;\n      }\n     ```\n      ```javascript\n     import { get } from '@ember/object';\n     import Person from 'app/models/person';\n      let transformedAttributes = Person.transformedAttributes\n      transformedAttributes.forEach(function(field, type) {\n        // do thing\n      });\n      // prints:\n     // lastName string\n     // birthday date\n     ```\n      @property transformedAttributes\n      @public\n     @static\n     @type {Map}\n     @readOnly\n     */\n    static get transformedAttributes() {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_EARLY_STATIC)) {\n        (!(this.modelName) && debug.deprecate(`Accessing schema information on Models without looking up the model via the store is deprecated. Use store.modelFor (or better Snapshots or the store.getSchemaDefinitionService() apis) instead.`, this.modelName, {\n          id: 'ember-data:deprecate-early-static',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            available: '4.7',\n            enabled: '4.7'\n          }\n        }));\n      } else {\n        (!(this.modelName) && debug.assert(`Accessing schema information on Models without looking up the model via the store is disallowed.`, this.modelName));\n      }\n      let map = new Map();\n      this.eachAttribute((key, meta) => {\n        if (meta.type) {\n          map.set(key, meta.type);\n        }\n      });\n      return map;\n    }\n\n    /**\n     Iterates through the attributes of the model, calling the passed function on each\n     attribute.\n      The callback method you provide should have the following signature (all\n     parameters are optional):\n      ```javascript\n     function(name, meta);\n     ```\n      - `name` the name of the current property in the iteration\n     - `meta` the meta object for the attribute property in the iteration\n      Note that in addition to a callback, you can also pass an optional target\n     object that will be set as `this` on the context.\n      Example\n      ```javascript\n     import Model, { attr } from '@ember-data/model';\n      class PersonModel extends Model {\n        @attr('string') firstName;\n        @attr('string') lastName;\n        @attr('date') birthday;\n      }\n      PersonModel.eachAttribute(function(name, meta) {\n        // do thing\n      });\n      // prints:\n     // firstName {type: \"string\", isAttribute: true, options: Object, parentType: function, name: \"firstName\"}\n     // lastName {type: \"string\", isAttribute: true, options: Object, parentType: function, name: \"lastName\"}\n     // birthday {type: \"date\", isAttribute: true, options: Object, parentType: function, name: \"birthday\"}\n     ```\n      @method eachAttribute\n      @public\n     @param {Function} callback The callback to execute\n     @param {Object} [binding] the value to which the callback's `this` should be bound\n     @static\n     */\n    static eachAttribute(callback, binding) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_EARLY_STATIC)) {\n        (!(this.modelName) && debug.deprecate(`Accessing schema information on Models without looking up the model via the store is deprecated. Use store.modelFor (or better Snapshots or the store.getSchemaDefinitionService() apis) instead.`, this.modelName, {\n          id: 'ember-data:deprecate-early-static',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            available: '4.7',\n            enabled: '4.7'\n          }\n        }));\n      } else {\n        (!(this.modelName) && debug.assert(`Accessing schema information on Models without looking up the model via the store is disallowed.`, this.modelName));\n      }\n      this.attributes.forEach((meta, name) => {\n        callback.call(binding, name, meta);\n      });\n    }\n\n    /**\n     Iterates through the transformedAttributes of the model, calling\n     the passed function on each attribute. Note the callback will not be\n     called for any attributes that do not have an transformation type.\n      The callback method you provide should have the following signature (all\n     parameters are optional):\n      ```javascript\n     function(name, type);\n     ```\n      - `name` the name of the current property in the iteration\n     - `type` a string containing the name of the type of transformed\n     applied to the attribute\n      Note that in addition to a callback, you can also pass an optional target\n     object that will be set as `this` on the context.\n      Example\n      ```javascript\n     import Model, { attr } from '@ember-data/model';\n      let Person = Model.extend({\n        firstName: attr(),\n        lastName: attr('string'),\n        birthday: attr('date')\n      });\n      Person.eachTransformedAttribute(function(name, type) {\n        // do thing\n      });\n      // prints:\n     // lastName string\n     // birthday date\n     ```\n      @method eachTransformedAttribute\n      @public\n     @param {Function} callback The callback to execute\n     @param {Object} [binding] the value to which the callback's `this` should be bound\n     @static\n     */\n    static eachTransformedAttribute(callback, binding) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_EARLY_STATIC)) {\n        (!(this.modelName) && debug.deprecate(`Accessing schema information on Models without looking up the model via the store is deprecated. Use store.modelFor (or better Snapshots or the store.getSchemaDefinitionService() apis) instead.`, this.modelName, {\n          id: 'ember-data:deprecate-early-static',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            available: '4.7',\n            enabled: '4.7'\n          }\n        }));\n      } else {\n        (!(this.modelName) && debug.assert(`Accessing schema information on Models without looking up the model via the store is disallowed.`, this.modelName));\n      }\n      this.transformedAttributes.forEach((type, name) => {\n        callback.call(binding, name, type);\n      });\n    }\n\n    /**\n     Returns the name of the model class.\n      @method toString\n      @public\n     @static\n     */\n    static toString() {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_EARLY_STATIC)) {\n        (!(this.modelName) && debug.deprecate(`Accessing schema information on Models without looking up the model via the store is deprecated. Use store.modelFor (or better Snapshots or the store.getSchemaDefinitionService() apis) instead.`, this.modelName, {\n          id: 'ember-data:deprecate-early-static',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            available: '4.7',\n            enabled: '4.7'\n          }\n        }));\n      } else {\n        (!(this.modelName) && debug.assert(`Accessing schema information on Models without looking up the model via the store is disallowed.`, this.modelName));\n      }\n      return `model:${this.modelName}`;\n    }\n  }, _Model.isModel = true, _Model.modelName = null, _Model), _applyDecoratedDescriptor(_class.prototype, \"isEmpty\", [compat.dependentKeyCompat], Object.getOwnPropertyDescriptor(_class.prototype, \"isEmpty\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"isLoading\", [compat.dependentKeyCompat], Object.getOwnPropertyDescriptor(_class.prototype, \"isLoading\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"isLoaded\", [compat.dependentKeyCompat], Object.getOwnPropertyDescriptor(_class.prototype, \"isLoaded\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"hasDirtyAttributes\", [compat.dependentKeyCompat], Object.getOwnPropertyDescriptor(_class.prototype, \"hasDirtyAttributes\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"isSaving\", [compat.dependentKeyCompat], Object.getOwnPropertyDescriptor(_class.prototype, \"isSaving\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"isDeleted\", [compat.dependentKeyCompat], Object.getOwnPropertyDescriptor(_class.prototype, \"isDeleted\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"isNew\", [compat.dependentKeyCompat], Object.getOwnPropertyDescriptor(_class.prototype, \"isNew\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"isValid\", [compat.dependentKeyCompat], Object.getOwnPropertyDescriptor(_class.prototype, \"isValid\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"dirtyType\", [compat.dependentKeyCompat], Object.getOwnPropertyDescriptor(_class.prototype, \"dirtyType\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"isError\", [compat.dependentKeyCompat], Object.getOwnPropertyDescriptor(_class.prototype, \"isError\"), _class.prototype), _descriptor = _applyDecoratedDescriptor(_class.prototype, \"isReloading\", [tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return false;\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"id\", [tagged], Object.getOwnPropertyDescriptor(_class.prototype, \"id\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"currentState\", [tagged], Object.getOwnPropertyDescriptor(_class.prototype, \"currentState\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"errors\", [computeOnce], Object.getOwnPropertyDescriptor(_class.prototype, \"errors\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"adapterError\", [compat.dependentKeyCompat], Object.getOwnPropertyDescriptor(_class.prototype, \"adapterError\"), _class.prototype), _applyDecoratedDescriptor(_class, \"inverseMap\", [computeOnce], Object.getOwnPropertyDescriptor(_class, \"inverseMap\"), _class), _applyDecoratedDescriptor(_class, \"relationships\", [computeOnce], Object.getOwnPropertyDescriptor(_class, \"relationships\"), _class), _applyDecoratedDescriptor(_class, \"relationshipNames\", [computeOnce], Object.getOwnPropertyDescriptor(_class, \"relationshipNames\"), _class), _applyDecoratedDescriptor(_class, \"relatedTypes\", [computeOnce], Object.getOwnPropertyDescriptor(_class, \"relatedTypes\"), _class), _applyDecoratedDescriptor(_class, \"relationshipsByName\", [computeOnce], Object.getOwnPropertyDescriptor(_class, \"relationshipsByName\"), _class), _applyDecoratedDescriptor(_class, \"relationshipsObject\", [computeOnce], Object.getOwnPropertyDescriptor(_class, \"relationshipsObject\"), _class), _applyDecoratedDescriptor(_class, \"fields\", [computeOnce], Object.getOwnPropertyDescriptor(_class, \"fields\"), _class), _applyDecoratedDescriptor(_class, \"attributes\", [computeOnce], Object.getOwnPropertyDescriptor(_class, \"attributes\"), _class), _applyDecoratedDescriptor(_class, \"transformedAttributes\", [computeOnce], Object.getOwnPropertyDescriptor(_class, \"transformedAttributes\"), _class), _class); // this is required to prevent `init` from passing\n  // the values initialized during create to `setUnknownProperty`\n  Model.prototype._createProps = null;\n  Model.prototype._secretInit = null;\n  if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").includeDataAdapter)) {\n    /**\n     Provides info about the model for debugging purposes\n     by grouping the properties into more semantic groups.\n      Meant to be used by debugging tools such as the Chrome Ember Extension.\n      - Groups all attributes in \"Attributes\" group.\n     - Groups all belongsTo relationships in \"Belongs To\" group.\n     - Groups all hasMany relationships in \"Has Many\" group.\n     - Groups all flags in \"Flags\" group.\n     - Flags relationship CPs as expensive properties.\n      @method _debugInfo\n     @for Model\n     @private\n     */\n    Model.prototype._debugInfo = function () {\n      let attributes = ['id'];\n      let relationships = {};\n      let expensiveProperties = [];\n      this.eachAttribute((name, meta) => attributes.push(name));\n      let groups = [{\n        name: 'Attributes',\n        properties: attributes,\n        expand: true\n      }];\n      this.eachRelationship((name, relationship) => {\n        let properties = relationships[relationship.kind];\n        if (properties === undefined) {\n          properties = relationships[relationship.kind] = [];\n          groups.push({\n            name: relationship.kind,\n            properties,\n            expand: true\n          });\n        }\n        properties.push(name);\n        expensiveProperties.push(name);\n      });\n      groups.push({\n        name: 'Flags',\n        properties: ['isLoaded', 'hasDirtyAttributes', 'isSaving', 'isDeleted', 'isError', 'isNew', 'isValid']\n      });\n      return {\n        propertyInfo: {\n          // include all other mixins / properties (not just the grouped ones)\n          includeOtherProperties: true,\n          groups: groups,\n          // don't pre-calculate unless cached\n          expensiveProperties: expensiveProperties\n        }\n      };\n    };\n  }\n  if (runtime.macroCondition(true)) {\n    let lookupDescriptor = function lookupDescriptor(obj, keyName) {\n      let current = obj;\n      do {\n        let descriptor = Object.getOwnPropertyDescriptor(current, keyName);\n        if (descriptor !== undefined) {\n          return descriptor;\n        }\n        current = Object.getPrototypeOf(current);\n      } while (current !== null);\n      return null;\n    };\n    Model.reopen({\n      init() {\n        this._super(...arguments);\n        let ourDescriptor = lookupDescriptor(Model.prototype, 'currentState');\n        let theirDescriptor = lookupDescriptor(this, 'currentState');\n        let realState = this.___recordState;\n        if (ourDescriptor.get !== theirDescriptor.get || realState !== this.currentState) {\n          throw new Error(`'currentState' is a reserved property name on instances of classes extending Model. Please choose a different property name for ${this.constructor.toString()}`);\n        }\n        const ID_DESCRIPTOR = lookupDescriptor(Model.prototype, 'id');\n        let idDesc = lookupDescriptor(this, 'id');\n        if (idDesc.get !== ID_DESCRIPTOR.get) {\n          throw new Error(`You may not set 'id' as an attribute on your model. Please remove any lines that look like: \\`id: attr('<type>')\\` from ${this.constructor.toString()}`);\n        }\n      }\n    });\n    if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_MODEL_REOPEN)) {\n      const originalReopen = Model.reopen;\n      const originalReopenClass = Model.reopenClass;\n      Model.reopen = function deprecatedReopen() {\n        (debug.deprecate(`Model.reopen is deprecated. Use Foo extends Model to extend your class instead.`, false, {\n          id: 'ember-data:deprecate-model-reopen',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            available: '4.7',\n            enabled: '4.7'\n          }\n        }));\n        return originalReopen.call(this, ...arguments);\n      };\n      Model.reopenClass = function deprecatedReopenClass() {\n        (debug.deprecate(`Model.reopenClass is deprecated. Use Foo extends Model to add static methods and properties to your class instead.`, false, {\n          id: 'ember-data:deprecate-model-reopenclass',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            available: '4.7',\n            enabled: '4.7'\n          }\n        }));\n        return originalReopenClass.call(this, ...arguments);\n      };\n    }\n  }\n\n  function normalizeType$1(type) {\n    if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_RELATIONSHIPS_WITHOUT_TYPE)) {\n      if (!type) {\n        return;\n      }\n    }\n    return string.dasherize(type);\n  }\n  /**\n    @module @ember-data/model\n  */\n\n  /**\n    `belongsTo` is used to define One-To-One and One-To-Many\n    relationships on a [Model](/ember-data/release/classes/Model).\n\n\n    `belongsTo` takes an optional hash as a second parameter, currently\n    supported options are:\n\n    - `async`: A boolean value used to explicitly declare this to be an async relationship. The default is true.\n    - `inverse`: A string used to identify the inverse property on a\n      related model in a One-To-Many relationship. See [Explicit Inverses](#explicit-inverses)\n    - `polymorphic` A boolean value to mark the relationship as polymorphic\n\n    #### One-To-One\n    To declare a one-to-one relationship between two models, use\n    `belongsTo`:\n\n    ```app/models/user.js\n    import Model, { belongsTo } from '@ember-data/model';\n\n    export default class UserModel extends Model {\n      @belongsTo('profile') profile;\n    }\n    ```\n\n    ```app/models/profile.js\n    import Model, { belongsTo } from '@ember-data/model';\n\n    export default class ProfileModel extends Model {\n      @belongsTo('user') user;\n    }\n    ```\n\n    #### One-To-Many\n    To declare a one-to-many relationship between two models, use\n    `belongsTo` in combination with `hasMany`, like this:\n\n    ```app/models/post.js\n    import Model, { hasMany } from '@ember-data/model';\n\n    export default class PostModel extends Model {\n      @hasMany('comment') comments;\n    }\n    ```\n\n    ```app/models/comment.js\n    import Model, { belongsTo } from '@ember-data/model';\n\n    export default class CommentModel extends Model {\n      @belongsTo('post') post;\n    }\n    ```\n\n    You can avoid passing a string as the first parameter. In that case Ember Data\n    will infer the type from the key name.\n\n    ```app/models/comment.js\n    import Model, { belongsTo } from '@ember-data/model';\n\n    export default class CommentModel extends Model {\n      @belongsTo post;\n    }\n    ```\n\n    will lookup for a Post type.\n\n    #### Sync relationships\n\n    Ember Data resolves sync relationships with the related resources\n    available in its local store, hence it is expected these resources\n    to be loaded before or along-side the primary resource.\n\n    ```app/models/comment.js\n    import Model, { belongsTo } from '@ember-data/model';\n\n    export default class CommentModel extends Model {\n      @belongsTo('post', {\n        async: false\n      })\n      post;\n    }\n    ```\n\n    In contrast to async relationship, accessing a sync relationship\n    will always return the record (Model instance) for the existing\n    local resource, or null. But it will error on access when\n    a related resource is known to exist and it has not been loaded.\n\n    ```\n    let post = comment.post;\n\n    ```\n\n    @method belongsTo\n    @public\n    @static\n    @for @ember-data/model\n    @param {String} modelName (optional) type of the relationship\n    @param {Object} options (optional) a hash of options\n    @return {Ember.computed} relationship\n  */\n  function belongsTo(modelName, options) {\n    let opts = options;\n    let userEnteredModelName = modelName;\n    if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_RELATIONSHIPS_WITHOUT_TYPE)) {\n      if (typeof modelName !== 'string' || !modelName.length) {\n        (debug.deprecate('belongsTo() must specify the string type of the related resource as the first parameter', false, {\n          id: 'ember-data:deprecate-non-strict-relationships',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            enabled: '4.7',\n            available: '4.7'\n          }\n        }));\n        if (typeof modelName === 'object') {\n          opts = modelName;\n          userEnteredModelName = undefined;\n        } else {\n          opts = options;\n          userEnteredModelName = modelName;\n        }\n        (!(typeof userEnteredModelName === 'string' || typeof userEnteredModelName === 'undefined') && debug.assert('The first argument to belongsTo must be a string representing a model type key, not an instance of ' + typeof userEnteredModelName + \". E.g., to define a relation to the Person model, use belongsTo('person')\", typeof userEnteredModelName === 'string' || typeof userEnteredModelName === 'undefined'));\n      }\n    }\n    if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_RELATIONSHIPS_WITHOUT_ASYNC)) {\n      if (!opts || typeof opts.async !== 'boolean') {\n        opts = opts || {};\n        if (!('async' in opts)) {\n          opts.async = true;\n        }\n        (debug.deprecate('belongsTo(<type>, <options>) must specify options.async as either `true` or `false`.', false, {\n          id: 'ember-data:deprecate-non-strict-relationships',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            enabled: '4.7',\n            available: '4.7'\n          }\n        }));\n      } else {\n        (!(opts && typeof opts.async === 'boolean') && debug.assert(`Expected belongsTo options.async to be a boolean`, opts && typeof opts.async === 'boolean'));\n      }\n    } else {\n      (!(opts && typeof opts.async === 'boolean') && debug.assert(`Expected belongsTo options.async to be a boolean`, opts && typeof opts.async === 'boolean'));\n    }\n    if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_RELATIONSHIPS_WITHOUT_INVERSE)) {\n      if (opts.inverse !== null && (typeof opts.inverse !== 'string' || opts.inverse.length === 0)) {\n        (debug.deprecate('belongsTo(<type>, <options>) must specify options.inverse as either `null` or string type of the related resource.', false, {\n          id: 'ember-data:deprecate-non-strict-relationships',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            enabled: '4.7',\n            available: '4.7'\n          }\n        }));\n      } else {\n        (!(opts.inverse === null || typeof opts.inverse === 'string' && opts.inverse.length > 0) && debug.assert(`Expected belongsTo options.inverse to be either null or the string type of the related resource.`, opts.inverse === null || typeof opts.inverse === 'string' && opts.inverse.length > 0));\n      }\n    } else {\n      (!(opts.inverse === null || typeof opts.inverse === 'string' && opts.inverse.length > 0) && debug.assert(`Expected belongsTo options.inverse to be either null or the string type of the related resource.`, opts.inverse === null || typeof opts.inverse === 'string' && opts.inverse.length > 0));\n    }\n    let meta = {\n      type: normalizeType$1(userEnteredModelName),\n      isRelationship: true,\n      options: opts,\n      kind: 'belongsTo',\n      name: 'Belongs To',\n      key: null\n    };\n    return EmberObject.computed({\n      get(key) {\n        // this is a legacy behavior we may not carry into a new model setup\n        // it's better to error on disconnected records so users find errors\n        // in their logic.\n        if (this.isDestroying || this.isDestroyed) {\n          return null;\n        }\n        const support = lookupLegacySupport(this);\n        if (runtime.macroCondition(true)) {\n          if (['currentState'].indexOf(key) !== -1) {\n            throw new Error(`'${key}' is a reserved property name on instances of classes extending Model. Please choose a different property name for your belongsTo on ${this.constructor.toString()}`);\n          }\n          if (Object.prototype.hasOwnProperty.call(opts, 'serialize')) {\n            (debug.warn(`You provided a serialize option on the \"${key}\" property in the \"${support.identifier.type}\" class, this belongs in the serializer. See Serializer and it's implementations https://api.emberjs.com/ember-data/release/classes/Serializer`, false, {\n              id: 'ds.model.serialize-option-in-belongs-to'\n            }));\n          }\n          if (Object.prototype.hasOwnProperty.call(opts, 'embedded')) {\n            (debug.warn(`You provided an embedded option on the \"${key}\" property in the \"${support.identifier.type}\" class, this belongs in the serializer. See EmbeddedRecordsMixin https://api.emberjs.com/ember-data/release/classes/EmbeddedRecordsMixin`, false, {\n              id: 'ds.model.embedded-option-in-belongs-to'\n            }));\n          }\n        }\n        return support.getBelongsTo(key);\n      },\n      set(key, value) {\n        const support = lookupLegacySupport(this);\n        if (runtime.macroCondition(true)) {\n          if (['currentState'].indexOf(key) !== -1) {\n            throw new Error(`'${key}' is a reserved property name on instances of classes extending Model. Please choose a different property name for your belongsTo on ${this.constructor.toString()}`);\n          }\n        }\n        this.store._join(() => {\n          support.setDirtyBelongsTo(key, value);\n        });\n        return support.getBelongsTo(key);\n      }\n    }).meta(meta);\n  }\n  const belongsTo$1 = computedMacroWithOptionalParams(belongsTo);\n\n  function normalizeType(type) {\n    if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_RELATIONSHIPS_WITHOUT_TYPE)) {\n      if (!type) {\n        return;\n      }\n    }\n    return emberInflector.singularize(string.dasherize(type));\n  }\n\n  /**\n    `hasMany` is used to define One-To-Many and Many-To-Many\n    relationships on a [Model](/ember-data/release/classes/Model).\n\n    `hasMany` takes an optional hash as a second parameter, currently\n    supported options are:\n\n    - `async`: A boolean value used to explicitly declare this to be an async relationship. The default is true.\n    - `inverse`: A string used to identify the inverse property on a related model.\n    - `polymorphic` A boolean value to mark the relationship as polymorphic\n\n    #### One-To-Many\n    To declare a one-to-many relationship between two models, use\n    `belongsTo` in combination with `hasMany`, like this:\n\n    ```app/models/post.js\n    import Model, { hasMany } from '@ember-data/model';\n\n    export default class PostModel extends Model {\n      @hasMany('comment') comments;\n    }\n    ```\n\n    ```app/models/comment.js\n    import Model, { belongsTo } from '@ember-data/model';\n\n    export default class CommentModel extends Model {\n      @belongsTo('post') post;\n    }\n    ```\n\n    #### Many-To-Many\n    To declare a many-to-many relationship between two models, use\n    `hasMany`:\n\n    ```app/models/post.js\n    import Model, { hasMany } from '@ember-data/model';\n\n    export default class PostModel extends Model {\n      @hasMany('tag') tags;\n    }\n    ```\n\n    ```app/models/tag.js\n    import Model, { hasMany } from '@ember-data/model';\n\n    export default class TagModel extends Model {\n      @hasMany('post') posts;\n    }\n    ```\n\n    You can avoid passing a string as the first parameter. In that case Ember Data\n    will infer the type from the singularized key name.\n\n    ```app/models/post.js\n    import Model, { hasMany } from '@ember-data/model';\n\n    export default class PostModel extends Model {\n      @hasMany tags;\n    }\n    ```\n\n    will lookup for a Tag type.\n\n    #### Explicit Inverses\n\n    Ember Data will do its best to discover which relationships map to\n    one another. In the one-to-many code above, for example, Ember Data\n    can figure out that changing the `comments` relationship should update\n    the `post` relationship on the inverse because post is the only\n    relationship to that model.\n\n    However, sometimes you may have multiple `belongsTo`/`hasMany` for the\n    same type. You can specify which property on the related model is\n    the inverse using `hasMany`'s `inverse` option:\n\n    ```app/models/comment.js\n    import Model, { belongsTo } from '@ember-data/model';\n\n    export default class CommentModel extends Model {\n      @belongsTo('post') onePost;\n      @belongsTo('post') twoPost\n      @belongsTo('post') redPost;\n      @belongsTo('post') bluePost;\n    }\n    ```\n\n    ```app/models/post.js\n    import Model, { hasMany } from '@ember-data/model';\n\n    export default class PostModel extends Model {\n      @hasMany('comment', {\n        inverse: 'redPost'\n      })\n      comments;\n    }\n    ```\n\n    You can also specify an inverse on a `belongsTo`, which works how\n    you'd expect.\n\n    #### Sync relationships\n\n    Ember Data resolves sync relationships with the related resources\n    available in its local store, hence it is expected these resources\n    to be loaded before or along-side the primary resource.\n\n    ```app/models/post.js\n    import Model, { hasMany } from '@ember-data/model';\n\n    export default class PostModel extends Model {\n      @hasMany('comment', {\n        async: false\n      })\n      comments;\n    }\n    ```\n\n    In contrast to async relationship, accessing a sync relationship\n    will always return a [ManyArray](/ember-data/release/classes/ManyArray) instance\n    containing the existing local resources. But it will error on access\n    when any of the known related resources have not been loaded.\n\n    ```\n    post.comments.forEach((comment) => {\n\n    });\n\n    ```\n\n    If you are using `links` with sync relationships, you have to use\n    `ref.reload` to fetch the resources.\n\n    @method hasMany\n    @public\n    @static\n    @for @ember-data/model\n    @param {String} type (optional) type of the relationship\n    @param {Object} options (optional) a hash of options\n    @return {Ember.computed} relationship\n  */\n  function hasMany(type, options) {\n    if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_RELATIONSHIPS_WITHOUT_TYPE)) {\n      if (typeof type !== 'string' || !type.length) {\n        (debug.deprecate('hasMany(<type>, <options>) must specify the string type of the related resource as the first parameter', false, {\n          id: 'ember-data:deprecate-non-strict-relationships',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            enabled: '4.7',\n            available: '4.7'\n          }\n        }));\n        if (typeof type === 'object') {\n          options = type;\n          type = undefined;\n        }\n        (!(typeof type === 'string' || typeof type === 'undefined') && debug.assert(`The first argument to hasMany must be a string representing a model type key, not an instance of ${debug.inspect(type)}. E.g., to define a relation to the Comment model, use hasMany('comment')`, typeof type === 'string' || typeof type === 'undefined'));\n      }\n    }\n    if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_RELATIONSHIPS_WITHOUT_ASYNC)) {\n      if (!options || typeof options.async !== 'boolean') {\n        options = options || {};\n        if (!('async' in options)) {\n          options.async = true;\n        }\n        (debug.deprecate('hasMany(<type>, <options>) must specify options.async as either `true` or `false`.', false, {\n          id: 'ember-data:deprecate-non-strict-relationships',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            enabled: '4.7',\n            available: '4.7'\n          }\n        }));\n      } else {\n        (!(options && typeof options.async === 'boolean') && debug.assert(`Expected hasMany options.async to be a boolean`, options && typeof options.async === 'boolean'));\n      }\n    } else {\n      (!(options && typeof options.async === 'boolean') && debug.assert(`Expected hasMany options.async to be a boolean`, options && typeof options.async === 'boolean'));\n    }\n    if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\").deprecations.DEPRECATE_RELATIONSHIPS_WITHOUT_INVERSE)) {\n      if (options.inverse !== null && (typeof options.inverse !== 'string' || options.inverse.length === 0)) {\n        (debug.deprecate('hasMany(<type>, <options>) must specify options.inverse as either `null` or string type of the related resource.', false, {\n          id: 'ember-data:deprecate-non-strict-relationships',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            enabled: '4.7',\n            available: '4.7'\n          }\n        }));\n      }\n    }\n\n    // Metadata about relationships is stored on the meta of\n    // the relationship. This is used for introspection and\n    // serialization. Note that `key` is populated lazily\n    // the first time the CP is called.\n    let meta = {\n      type: normalizeType(type),\n      options,\n      isRelationship: true,\n      kind: 'hasMany',\n      name: 'Has Many',\n      key: null\n    };\n    return EmberObject.computed({\n      get(key) {\n        if (runtime.macroCondition(true)) {\n          if (['currentState'].indexOf(key) !== -1) {\n            throw new Error(`'${key}' is a reserved property name on instances of classes extending Model. Please choose a different property name for your hasMany on ${this.constructor.toString()}`);\n          }\n        }\n        if (this.isDestroying || this.isDestroyed) {\n          return ArrayMixin.A();\n        }\n        return lookupLegacySupport(this).getHasMany(key);\n      },\n      set(key, records) {\n        if (runtime.macroCondition(true)) {\n          if (['currentState'].indexOf(key) !== -1) {\n            throw new Error(`'${key}' is a reserved property name on instances of classes extending Model. Please choose a different property name for your hasMany on ${this.constructor.toString()}`);\n          }\n        }\n        const support = lookupLegacySupport(this);\n        const manyArray = support.getManyArray(key);\n        (!(Array.isArray(records)) && debug.assert(`You must pass an array of records to set a hasMany relationship`, Array.isArray(records)));\n        this.store._join(() => {\n          manyArray.splice(0, manyArray.length, ...records);\n        });\n        return support.getHasMany(key);\n      }\n    }).meta(meta);\n  }\n  const hasMany$1 = computedMacroWithOptionalParams(hasMany);\n\n  /*\n      In case someone defined a relationship to a mixin, for example:\n      ```\n        import Model, { belongsTo, hasMany } from '@ember-data/model';\n        import Mixin from '@ember/object/mixin';\n\n        class CommentModel extends Model {\n          @belongsTo('commentable', { polymorphic: true }) owner;\n        }\n\n        let Commentable = Mixin.create({\n          @hasMany('comment') comments;\n        });\n      ```\n      we want to look up a Commentable class which has all the necessary\n      relationship meta data. Thus, we look up the mixin and create a mock\n      Model, so we can access the relationship CPs of the mixin (`comments`)\n      in this case\n    */\n  function modelForMixin(store, normalizedModelName) {\n    let owner = application.getOwner(store);\n    let MaybeMixin = owner.factoryFor(`mixin:${normalizedModelName}`);\n    let mixin = MaybeMixin && MaybeMixin.class;\n    if (mixin) {\n      let ModelForMixin = Model.extend(mixin);\n      ModelForMixin.__isMixin = true;\n      ModelForMixin.__mixin = mixin;\n      //Cache the class as a model\n      owner.register('model:' + normalizedModelName, ModelForMixin);\n    }\n    return owner.factoryFor(`model:${normalizedModelName}`);\n  }\n\n  /**\n    @module @ember-data/model\n  */\n\n  /**\n    @method diffArray\n    @internal\n    @param {Array} oldArray the old array\n    @param {Array} newArray the new array\n    @return {hash} {\n        firstChangeIndex: <integer>,  // null if no change\n        addedCount: <integer>,        // 0 if no change\n        removedCount: <integer>       // 0 if no change\n      }\n  */\n  function diffArray(oldArray, newArray) {\n    const oldLength = oldArray.length;\n    const newLength = newArray.length;\n    const shortestLength = Math.min(oldLength, newLength);\n    let firstChangeIndex = null; // null signifies no changes\n\n    // find the first change\n    for (let i = 0; i < shortestLength; i++) {\n      // compare each item in the array\n      if (oldArray[i] !== newArray[i]) {\n        firstChangeIndex = i;\n        break;\n      }\n    }\n    if (firstChangeIndex === null && newLength !== oldLength) {\n      // no change found in the overlapping block\n      // and array lengths differ,\n      // so change starts at end of overlap\n      firstChangeIndex = shortestLength;\n    }\n    let addedCount = 0;\n    let removedCount = 0;\n    if (firstChangeIndex !== null) {\n      // we found a change, find the end of the change\n      let unchangedEndBlockLength = shortestLength - firstChangeIndex;\n      // walk back from the end of both arrays until we find a change\n      for (let i = 1; i <= shortestLength; i++) {\n        // compare each item in the array\n        if (oldArray[oldLength - i] !== newArray[newLength - i]) {\n          unchangedEndBlockLength = i - 1;\n          break;\n        }\n      }\n      addedCount = newLength - unchangedEndBlockLength - firstChangeIndex;\n      removedCount = oldLength - unchangedEndBlockLength - firstChangeIndex;\n    }\n    return {\n      firstChangeIndex,\n      addedCount,\n      removedCount\n    };\n  }\n\n  exports.Errors = Errors;\n  exports.LEGACY_SUPPORT = LEGACY_SUPPORT;\n  exports.ManyArray = RelatedCollection;\n  exports.Model = Model;\n  exports.PromiseBelongsTo = PromiseBelongsTo;\n  exports.PromiseManyArray = PromiseManyArray;\n  exports._modelForMixin = modelForMixin;\n  exports.attr = attr$1;\n  exports.belongsTo = belongsTo$1;\n  exports.diffArray = diffArray;\n  exports.hasMany = hasMany$1;\n\n  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });\n\n}));\n","define(\"@ember-data/model/index\", [\"exports\", \"@ember-data/model/-private\"], function (_exports, _private) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"attr\", {\n    enumerable: true,\n    get: function () {\n      return _private.attr;\n    }\n  });\n  Object.defineProperty(_exports, \"belongsTo\", {\n    enumerable: true,\n    get: function () {\n      return _private.belongsTo;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _private.Model;\n    }\n  });\n  Object.defineProperty(_exports, \"hasMany\", {\n    enumerable: true,\n    get: function () {\n      return _private.hasMany;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/model/-private\"eaimeta@70e063a35619d71f\n  /**\n   In EmberData a `Model` is a class defining the attributes and relationships\n    of a specific resource `type` (model name). In this sense it represents a static \"schema\".\n  \n    Data for individual resources fetched from your API is presented\n    to the UI via instances of the `Model`s you define.\n  \n    An instantiated `Model` is referred to as a `record`.\n  \n    When we refer to the `ModelClass` we are referring to the class definition\n    and the static schema methods present on it.\n  \n    When we refer to a `record` we refer to a specific class instance presenting\n    the resource data for a given `type` and `id`.\n  \n    ### Defining a Model\n  \n    ```app/models/person.js\n    import Model, { attr, belongsTo, hasMany } from '@ember-data/model';\n  \n    export default class PersonModel extends Model {\n      @attr name;\n  \n      @belongsTo('pet', { inverse: 'owners', async: false }) dog;\n  \n      @hasMany('person', { inverse: 'friends', async: true }) friends;\n    }\n    ```\n  \n    ### modelName convention\n  \n    By convention, the name of a given model (its `type`) matches the name\n    of the file in the `app/models` folder and should be lowercase, singular\n    and dasherized.\n  \n    @module @ember-data/model\n    @main @ember-data/model\n   */\n});","define(\"@ember-data/private-build-infra/available-packages\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = {\n    HAS_EMBER_DATA_PACKAGE: 'ember-data',\n    HAS_STORE_PACKAGE: '@ember-data/store',\n    HAS_MODEL_PACKAGE: '@ember-data/model',\n    HAS_RECORD_DATA_PACKAGE: '@ember-data/record-data',\n    HAS_ADAPTER_PACKAGE: '@ember-data/adapter',\n    HAS_SERIALIZER_PACKAGE: '@ember-data/serializer',\n    HAS_DEBUG_PACKAGE: '@ember-data/debug'\n  };\n  _exports.default = _default;\n});","define(\"@ember-data/private-build-infra/current-deprecations\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n   * ## Deprecations\n   *\n   * EmberData allows users to opt-in and remove code that exists to support deprecated\n   * behaviors.\n   *\n   * If your app has resolved all deprecations present in a given version,\n   * you may specify that version as your \"compatibility\" version to remove\n   * the code that supported the deprecated behavior from your app.\n   *\n   * For instance, if a deprecation was introduced in 3.13, and the app specifies\n   * 3.13 as its minimum version compatibility, any deprecations introduced before\n   * or during 3.13 would be stripped away.\n   *\n   * An app can use a different version than what it specifies as it's compatibility\n   * version. For instance, an App could be using `3.16` while specifying compatibility\n   * with `3.12`. This would remove any deprecations that were present in or before `3.12`\n   * but keep support for anything deprecated in or above `3.13`.\n   *\n   * ### Configuring Compatibility\n   *\n   * To configure your compatibility version, set the `compatWith` to the version you\n   * are compatible with on the `emberData` config in your `ember-cli-build.js` file.\n   *\n   * ```js\n   * let app = new EmberApp(defaults, {\n   *   emberData: {\n   *     compatWith: '3.12',\n   *   },\n   * });\n   * ```\n   *\n   * The complete list of which versions specific deprecations will be removed in\n   * can be found [here](https://github.com/emberjs/data/tree/master/packages/private-build-infra/addon/current-deprecations.ts \"List of EmberData Deprecations\")\n   *\n   * @module @ember-data/deprecations\n   * @main @ember-data/deprecations\n   */\n  var _default = {\n    DEPRECATE_CATCH_ALL: '99.0',\n    DEPRECATE_3_12: '3.12',\n    DEPRECATE_RSVP_PROMISE: '4.4',\n    DEPRECATE_SAVE_PROMISE_ACCESS: '4.4',\n    DEPRECATE_SNAPSHOT_MODEL_CLASS_ACCESS: '4.5',\n    DEPRECATE_STORE_FIND: '4.5',\n    DEPRECATE_HAS_RECORD: '4.5',\n    DEPRECATE_STRING_ARG_SCHEMAS: '4.5',\n    DEPRECATE_JSON_API_FALLBACK: '4.5',\n    DEPRECATE_MODEL_REOPEN: '4.7',\n    DEPRECATE_EARLY_STATIC: '4.7',\n    DEPRECATE_CLASSIC: '4.9',\n    DEPRECATE_HELPERS: '4.7',\n    DEPRECATE_PROMISE_MANY_ARRAY_BEHAVIORS: '4.7',\n    DEPRECATE_V1CACHE_STORE_APIS: '4.7',\n    DEPRECATE_RELATIONSHIPS_WITHOUT_TYPE: '4.7',\n    DEPRECATE_RELATIONSHIPS_WITHOUT_ASYNC: '4.7',\n    DEPRECATE_RELATIONSHIPS_WITHOUT_INVERSE: '4.7',\n    DEPRECATE_V1_RECORD_DATA: '4.7',\n    DEPRECATE_A_USAGE: '4.7',\n    DEPRECATE_PROMISE_PROXIES: '4.7',\n    DEPRECATE_ARRAY_LIKE: '4.7',\n    DEPRECATE_COMPUTED_CHAINS: '5.0',\n    DEPRECATE_NON_EXPLICIT_POLYMORPHISM: '4.7'\n  };\n  _exports.default = _default;\n});","define(\"@ember-data/private-build-infra/debugging\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.LOG_REQUEST_STATUS = _exports.LOG_PAYLOADS = _exports.LOG_OPERATIONS = _exports.LOG_NOTIFICATIONS = _exports.LOG_MUTATIONS = _exports.LOG_INSTANCE_CACHE = _exports.LOG_IDENTIFIERS = _exports.LOG_GRAPH = void 0;\n  /**\n    @module @ember-data/debug\n   */\n  /**\n   *\n   * Many portions of the internals are helpfully instrumented with logging that can be activated\n  at build time. This instrumentation is always removed from production builds or any builds\n  that has not explicitly activated it. To activate it set the appropriate flag to `true`.\n  \n  ```ts\n    let app = new EmberApp(defaults, {\n      emberData: {\n        debug: {\n            LOG_PAYLOADS: false, // data store received to update cache with\n            LOG_OPERATIONS: false, // updates to cache remote state\n            LOG_MUTATIONS: false, // updates to cache local state\n            LOG_NOTIFICATIONS: false,\n            LOG_REQUEST_STATUS: false,\n            LOG_IDENTIFIERS: false,\n            LOG_GRAPH: false,\n            LOG_INSTANCE_CACHE: false,\n        }\n      }\n    });\n    ```\n  \n    @class DebugLogging\n    @public\n   */\n  /**\n   * log payloads received by the store\n   * via `push` or returned from a delete/update/create\n   * operation.\n   *\n   * @property {boolean} LOG_PAYLOADS\n   * @public\n   */\n  const LOG_PAYLOADS = false;\n  /**\n   * log remote-state updates to the cache\n   *\n   * @property {boolean} LOG_OPERATIONS\n   * @public\n   */\n  _exports.LOG_PAYLOADS = LOG_PAYLOADS;\n  const LOG_OPERATIONS = false;\n  /**\n   * log local-state updates to the cache\n   *\n   * @property {boolean} LOG_MUTATIONS\n   * @public\n   */\n  _exports.LOG_OPERATIONS = LOG_OPERATIONS;\n  const LOG_MUTATIONS = false;\n  /**\n   * log notifications received by the RecordNotificationManager\n   *\n   * @property {boolean} LOG_NOTIFICATIONS\n   * @public\n   */\n  _exports.LOG_MUTATIONS = LOG_MUTATIONS;\n  const LOG_NOTIFICATIONS = false;\n  /**\n   * log updates to requests the store has issued to\n   * the network (adapter) to fulfill.\n   *\n   * @property {boolean} LOG_REQUEST_STATUS\n   * @public\n   */\n  _exports.LOG_NOTIFICATIONS = LOG_NOTIFICATIONS;\n  const LOG_REQUEST_STATUS = false;\n  /**\n   * log peek, generation and updates to\n   * Record Identifiers.\n   *\n   * @property {boolean} LOG_IDENTIFIERS\n   * @public\n   */\n  _exports.LOG_REQUEST_STATUS = LOG_REQUEST_STATUS;\n  const LOG_IDENTIFIERS = false;\n  /**\n   * log updates received by the graph (relationship pointer storage)\n   *\n   * @property {boolean} LOG_GRAPH\n   * @public\n   */\n  _exports.LOG_IDENTIFIERS = LOG_IDENTIFIERS;\n  const LOG_GRAPH = false;\n  /**\n   * log creation/removal of RecordData and Record\n   * instances.\n   *\n   * @property {boolean} LOG_INSTANCE_CACHE\n   * @public\n   */\n  _exports.LOG_GRAPH = LOG_GRAPH;\n  const LOG_INSTANCE_CACHE = false;\n  _exports.LOG_INSTANCE_CACHE = LOG_INSTANCE_CACHE;\n});","define(\"@ember-data/private-build-infra/deprecations\", [\"exports\", \"@ember-data/private-build-infra/current-deprecations\"], function (_exports, _currentDeprecations) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.DEPRECATE_V1_RECORD_DATA = _exports.DEPRECATE_V1CACHE_STORE_APIS = _exports.DEPRECATE_STRING_ARG_SCHEMAS = _exports.DEPRECATE_STORE_FIND = _exports.DEPRECATE_SNAPSHOT_MODEL_CLASS_ACCESS = _exports.DEPRECATE_SAVE_PROMISE_ACCESS = _exports.DEPRECATE_RSVP_PROMISE = _exports.DEPRECATE_RELATIONSHIPS_WITHOUT_TYPE = _exports.DEPRECATE_RELATIONSHIPS_WITHOUT_INVERSE = _exports.DEPRECATE_RELATIONSHIPS_WITHOUT_ASYNC = _exports.DEPRECATE_PROMISE_PROXIES = _exports.DEPRECATE_PROMISE_MANY_ARRAY_BEHAVIORS = _exports.DEPRECATE_NON_EXPLICIT_POLYMORPHISM = _exports.DEPRECATE_MODEL_REOPEN = _exports.DEPRECATE_JSON_API_FALLBACK = _exports.DEPRECATE_HELPERS = _exports.DEPRECATE_HAS_RECORD = _exports.DEPRECATE_EARLY_STATIC = _exports.DEPRECATE_COMPUTED_CHAINS = _exports.DEPRECATE_CLASSIC = _exports.DEPRECATE_CATCH_ALL = _exports.DEPRECATE_A_USAGE = _exports.DEPRECATE_ARRAY_LIKE = _exports.DEPRECATE_3_12 = void 0;\n  function deprecationState(deprecationName) {\n    // if we hit this at runtime and the deprecation exists it is always activated\n    return deprecationName in _currentDeprecations.default;\n  }\n\n  // deprecations\n  const DEPRECATE_CATCH_ALL = deprecationState('DEPRECATE_CATCH_ALL');\n  _exports.DEPRECATE_CATCH_ALL = DEPRECATE_CATCH_ALL;\n  const DEPRECATE_3_12 = deprecationState('DEPRECATE_3_12');\n  _exports.DEPRECATE_3_12 = DEPRECATE_3_12;\n  const DEPRECATE_SAVE_PROMISE_ACCESS = deprecationState('DEPRECATE_SAVE_PROMISE_ACCESS');\n  _exports.DEPRECATE_SAVE_PROMISE_ACCESS = DEPRECATE_SAVE_PROMISE_ACCESS;\n  const DEPRECATE_RSVP_PROMISE = deprecationState('DEPRECATE_RSVP_PROMISE');\n  _exports.DEPRECATE_RSVP_PROMISE = DEPRECATE_RSVP_PROMISE;\n  const DEPRECATE_SNAPSHOT_MODEL_CLASS_ACCESS = deprecationState('DEPRECATE_SNAPSHOT_MODEL_CLASS_ACCESS');\n  _exports.DEPRECATE_SNAPSHOT_MODEL_CLASS_ACCESS = DEPRECATE_SNAPSHOT_MODEL_CLASS_ACCESS;\n  const DEPRECATE_STORE_FIND = deprecationState('DEPRECATE_STORE_FIND');\n  _exports.DEPRECATE_STORE_FIND = DEPRECATE_STORE_FIND;\n  const DEPRECATE_HAS_RECORD = deprecationState('DEPRECATE_HAS_RECORD');\n  _exports.DEPRECATE_HAS_RECORD = DEPRECATE_HAS_RECORD;\n  const DEPRECATE_STRING_ARG_SCHEMAS = deprecationState('DEPRECATE_STRING_ARG_SCHEMAS');\n  _exports.DEPRECATE_STRING_ARG_SCHEMAS = DEPRECATE_STRING_ARG_SCHEMAS;\n  const DEPRECATE_JSON_API_FALLBACK = deprecationState('DEPRECATE_JSON_API_FALLBACK');\n  _exports.DEPRECATE_JSON_API_FALLBACK = DEPRECATE_JSON_API_FALLBACK;\n  const DEPRECATE_MODEL_REOPEN = deprecationState('DEPRECATE_MODEL_REOPEN');\n  _exports.DEPRECATE_MODEL_REOPEN = DEPRECATE_MODEL_REOPEN;\n  const DEPRECATE_EARLY_STATIC = deprecationState('DEPRECATE_EARLY_STATIC');\n  _exports.DEPRECATE_EARLY_STATIC = DEPRECATE_EARLY_STATIC;\n  const DEPRECATE_CLASSIC = deprecationState('DEPRECATE_CLASSIC');\n  _exports.DEPRECATE_CLASSIC = DEPRECATE_CLASSIC;\n  const DEPRECATE_HELPERS = deprecationState('DEPRECATE_HELPERS');\n  _exports.DEPRECATE_HELPERS = DEPRECATE_HELPERS;\n  const DEPRECATE_PROMISE_MANY_ARRAY_BEHAVIORS = deprecationState('DEPRECATE_PROMISE_MANY_ARRAY_BEHAVIORS');\n  _exports.DEPRECATE_PROMISE_MANY_ARRAY_BEHAVIORS = DEPRECATE_PROMISE_MANY_ARRAY_BEHAVIORS;\n  const DEPRECATE_V1CACHE_STORE_APIS = deprecationState('DEPRECATE_V1CACHE_STORE_APIS');\n  _exports.DEPRECATE_V1CACHE_STORE_APIS = DEPRECATE_V1CACHE_STORE_APIS;\n  const DEPRECATE_RELATIONSHIPS_WITHOUT_TYPE = deprecationState('DEPRECATE_RELATIONSHIPS_WITHOUT_TYPE');\n  _exports.DEPRECATE_RELATIONSHIPS_WITHOUT_TYPE = DEPRECATE_RELATIONSHIPS_WITHOUT_TYPE;\n  const DEPRECATE_RELATIONSHIPS_WITHOUT_ASYNC = deprecationState('DEPRECATE_RELATIONSHIPS_WITHOUT_ASYNC');\n  _exports.DEPRECATE_RELATIONSHIPS_WITHOUT_ASYNC = DEPRECATE_RELATIONSHIPS_WITHOUT_ASYNC;\n  const DEPRECATE_RELATIONSHIPS_WITHOUT_INVERSE = deprecationState('DEPRECATE_RELATIONSHIPS_WITHOUT_INVERSE');\n  _exports.DEPRECATE_RELATIONSHIPS_WITHOUT_INVERSE = DEPRECATE_RELATIONSHIPS_WITHOUT_INVERSE;\n  const DEPRECATE_V1_RECORD_DATA = deprecationState('DEPRECATE_V1_RECORD_DATA');\n  _exports.DEPRECATE_V1_RECORD_DATA = DEPRECATE_V1_RECORD_DATA;\n  const DEPRECATE_A_USAGE = deprecationState('DEPRECATE_A_USAGE');\n  _exports.DEPRECATE_A_USAGE = DEPRECATE_A_USAGE;\n  const DEPRECATE_PROMISE_PROXIES = deprecationState('DEPRECATE_PROMISE_PROXIES');\n  _exports.DEPRECATE_PROMISE_PROXIES = DEPRECATE_PROMISE_PROXIES;\n  const DEPRECATE_ARRAY_LIKE = deprecationState('DEPRECATE_ARRAY_LIKE');\n  _exports.DEPRECATE_ARRAY_LIKE = DEPRECATE_ARRAY_LIKE;\n  const DEPRECATE_COMPUTED_CHAINS = deprecationState('DEPRECATE_COMPUTED_CHAINS');\n  _exports.DEPRECATE_COMPUTED_CHAINS = DEPRECATE_COMPUTED_CHAINS;\n  const DEPRECATE_NON_EXPLICIT_POLYMORPHISM = deprecationState('DEPRECATE_NON_EXPLICIT_POLYMORPHISM');\n  _exports.DEPRECATE_NON_EXPLICIT_POLYMORPHISM = DEPRECATE_NON_EXPLICIT_POLYMORPHISM;\n});","define(\"@ember-data/private-build-infra/index\", [\"exports\", \"require\", \"@ember-data/private-build-infra/available-packages\"], function (_exports, _require, _availablePackages) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.HAS_STORE_PACKAGE = _exports.HAS_SERIALIZER_PACKAGE = _exports.HAS_RECORD_DATA_PACKAGE = _exports.HAS_MODEL_PACKAGE = _exports.HAS_EMBER_DATA_PACKAGE = _exports.HAS_DEBUG_PACKAGE = _exports.HAS_ADAPTER_PACKAGE = void 0;\n  function flagState(flag) {\n    const packageName = _availablePackages.default[flag];\n    return (0, _require.has)(packageName) || false;\n  }\n  const HAS_EMBER_DATA_PACKAGE = flagState('HAS_EMBER_DATA_PACKAGE');\n  _exports.HAS_EMBER_DATA_PACKAGE = HAS_EMBER_DATA_PACKAGE;\n  const HAS_STORE_PACKAGE = flagState('HAS_STORE_PACKAGE');\n  _exports.HAS_STORE_PACKAGE = HAS_STORE_PACKAGE;\n  const HAS_MODEL_PACKAGE = flagState('HAS_MODEL_PACKAGE');\n  _exports.HAS_MODEL_PACKAGE = HAS_MODEL_PACKAGE;\n  const HAS_ADAPTER_PACKAGE = flagState('HAS_ADAPTER_PACKAGE');\n  _exports.HAS_ADAPTER_PACKAGE = HAS_ADAPTER_PACKAGE;\n  const HAS_SERIALIZER_PACKAGE = flagState('HAS_SERIALIZER_PACKAGE');\n  _exports.HAS_SERIALIZER_PACKAGE = HAS_SERIALIZER_PACKAGE;\n  const HAS_DEBUG_PACKAGE = flagState('HAS_DEBUG_PACKAGE');\n  _exports.HAS_DEBUG_PACKAGE = HAS_DEBUG_PACKAGE;\n  const HAS_RECORD_DATA_PACKAGE = flagState('HAS_RECORD_DATA_PACKAGE');\n  _exports.HAS_RECORD_DATA_PACKAGE = HAS_RECORD_DATA_PACKAGE;\n});","define('@ember-data/record-data/-private', ['exports', '@embroider/macros/runtime', '@ember/debug', '@ember/runloop', '@ember/utils', '@ember-data/store/-private'], (function (exports, runtime, debug, runloop, utils, Private) { 'use strict';\n\n  // Used by the store to normalize IDs entering the store.  Despite the fact\n  // that developers may provide IDs as numbers (e.g., `store.findRecord('person', 1)`),\n  // it is important that internally we use strings, since IDs may be serialized\n  // and lose type information.  For example, Ember's router may put a record's\n  // ID into the URL, and if we later try to deserialize that URL and find the\n  // corresponding record, we will not know if it is a string or a number.\n\n  function coerceId(id) {\n    if (id === null || id === undefined || id === '') {\n      return null;\n    }\n    if (typeof id === 'string') {\n      return id;\n    }\n    if (typeof id === 'symbol') {\n      return id.toString();\n    }\n    return '' + id;\n  }\n\n  function getStore(wrapper) {\n    (!('_store' in wrapper) && debug.assert(`expected a private _store property`, '_store' in wrapper));\n    return wrapper._store;\n  }\n  function expandingGet(cache, key1, key2) {\n    let mainCache = cache[key1] = cache[key1] || Object.create(null);\n    return mainCache[key2];\n  }\n  function expandingSet(cache, key1, key2, value) {\n    let mainCache = cache[key1] = cache[key1] || Object.create(null);\n    mainCache[key2] = value;\n  }\n  function assertValidRelationshipPayload(graph, op) {\n    const relationship = graph.get(op.record, op.field);\n    (!(isHasMany(relationship) || isBelongsTo(relationship)) && debug.assert(`Cannot update an implicit relationship`, isHasMany(relationship) || isBelongsTo(relationship)));\n    const payload = op.value;\n    const {\n      definition,\n      identifier,\n      state\n    } = relationship;\n    const {\n      type\n    } = identifier;\n    const {\n      field\n    } = op;\n    const {\n      isAsync,\n      kind\n    } = definition;\n    if (payload.links) {\n      (debug.warn(`You pushed a record of type '${type}' with a relationship '${field}' configured as 'async: false'. You've included a link but no primary data, this may be an error in your payload. EmberData will treat this relationship as known-to-be-empty.`, isAsync || !!payload.data || state.hasReceivedData, {\n        id: 'ds.store.push-link-for-sync-relationship'\n      }));\n    } else if (payload.data) {\n      if (kind === 'belongsTo') {\n        (!(!Array.isArray(payload.data)) && debug.assert(`A ${type} record was pushed into the store with the value of ${field} being ${debug.inspect(payload.data)}, but ${field} is a belongsTo relationship so the value must not be an array. You should probably check your data payload or serializer.`, !Array.isArray(payload.data)));\n        assertRelationshipData(getStore(graph.store), identifier, payload.data, definition);\n      } else if (kind === 'hasMany') {\n        (!(Array.isArray(payload.data)) && debug.assert(`A ${type} record was pushed into the store with the value of ${field} being '${debug.inspect(payload.data)}', but ${field} is a hasMany relationship so the value must be an array. You should probably check your data payload or serializer.`, Array.isArray(payload.data)));\n        if (Array.isArray(payload.data)) {\n          for (let i = 0; i < payload.data.length; i++) {\n            assertRelationshipData(getStore(graph.store), identifier, payload.data[i], definition);\n          }\n        }\n      }\n    }\n  }\n  function isNew(identifier) {\n    if (!identifier.id) {\n      return true;\n    }\n    const recordData = Private.recordDataFor(identifier);\n    return Boolean(recordData?.isNew(identifier));\n  }\n  function isBelongsTo(relationship) {\n    return relationship.definition.kind === 'belongsTo';\n  }\n  function isImplicit(relationship) {\n    return relationship.definition.isImplicit;\n  }\n  function isHasMany(relationship) {\n    return relationship.definition.kind === 'hasMany';\n  }\n  function forAllRelatedIdentifiers(rel, cb) {\n    if (isBelongsTo(rel)) {\n      if (rel.remoteState) {\n        cb(rel.remoteState);\n      }\n      if (rel.localState && rel.localState !== rel.remoteState) {\n        cb(rel.localState);\n      }\n    } else if (isHasMany(rel)) {\n      // ensure we don't walk anything twice if an entry is\n      // in both localMembers and remoteMembers\n      let seen = new Set();\n      for (let i = 0; i < rel.localState.length; i++) {\n        const inverseIdentifier = rel.localState[i];\n        if (!seen.has(inverseIdentifier)) {\n          seen.add(inverseIdentifier);\n          cb(inverseIdentifier);\n        }\n      }\n      for (let i = 0; i < rel.remoteState.length; i++) {\n        const inverseIdentifier = rel.remoteState[i];\n        if (!seen.has(inverseIdentifier)) {\n          seen.add(inverseIdentifier);\n          cb(inverseIdentifier);\n        }\n      }\n    } else {\n      let seen = new Set();\n      rel.localMembers.forEach(inverseIdentifier => {\n        if (!seen.has(inverseIdentifier)) {\n          seen.add(inverseIdentifier);\n          cb(inverseIdentifier);\n        }\n      });\n      rel.remoteMembers.forEach(inverseIdentifier => {\n        if (!seen.has(inverseIdentifier)) {\n          seen.add(inverseIdentifier);\n          cb(inverseIdentifier);\n        }\n      });\n    }\n  }\n\n  /*\n    Removes the given identifier from BOTH remote AND local state.\n\n    This method is useful when either a deletion or a rollback on a new record\n    needs to entirely purge itself from an inverse relationship.\n    */\n  function removeIdentifierCompletelyFromRelationship(graph, relationship, value, silenceNotifications) {\n    if (isBelongsTo(relationship)) {\n      if (relationship.remoteState === value) {\n        relationship.remoteState = null;\n      }\n      if (relationship.localState === value) {\n        relationship.localState = null;\n        // This allows dematerialized inverses to be rematerialized\n        // we shouldn't be notifying here though, figure out where\n        // a notification was missed elsewhere.\n        if (!silenceNotifications) {\n          notifyChange(graph, relationship.identifier, relationship.definition.key);\n        }\n      }\n    } else if (isHasMany(relationship)) {\n      relationship.remoteMembers.delete(value);\n      relationship.localMembers.delete(value);\n      const canonicalIndex = relationship.remoteState.indexOf(value);\n      if (canonicalIndex !== -1) {\n        relationship.remoteState.splice(canonicalIndex, 1);\n      }\n      const currentIndex = relationship.localState.indexOf(value);\n      if (currentIndex !== -1) {\n        relationship.localState.splice(currentIndex, 1);\n        // This allows dematerialized inverses to be rematerialized\n        // we shouldn't be notifying here though, figure out where\n        // a notification was missed elsewhere.\n        if (!silenceNotifications) {\n          notifyChange(graph, relationship.identifier, relationship.definition.key);\n        }\n      }\n    } else {\n      relationship.remoteMembers.delete(value);\n      relationship.localMembers.delete(value);\n    }\n  }\n\n  // TODO add silencing at the graph level\n  function notifyChange(graph, identifier, key) {\n    if (identifier === graph._removing) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/record-data\").debug.LOG_GRAPH)) {\n        // eslint-disable-next-line no-console\n        console.log(`Graph: ignoring relationship change for removed identifier ${String(identifier)} ${key}`);\n      }\n      return;\n    }\n    if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/record-data\").debug.LOG_GRAPH)) {\n      // eslint-disable-next-line no-console\n      console.log(`Graph: notifying relationship change for ${String(identifier)} ${key}`);\n    }\n    graph.store.notifyChange(identifier, 'relationships', key);\n  }\n  function assertRelationshipData(store, identifier, data, meta) {\n    (!(!Array.isArray(data)) && debug.assert(`A ${identifier.type} record was pushed into the store with the value of ${meta.key} being '${JSON.stringify(data)}', but ${meta.key} is a belongsTo relationship so the value must not be an array. You should probably check your data payload or serializer.`, !Array.isArray(data)));\n    (!(data === null || typeof data.type === 'string' && data.type.length) && debug.assert(`Encountered a relationship identifier without a type for the ${meta.kind} relationship '${meta.key}' on <${identifier.type}:${identifier.id}>, expected a json-api identifier with type '${meta.type}' but found '${JSON.stringify(data)}'. Please check your serializer and make sure it is serializing the relationship payload into a JSON API format.`, data === null || typeof data.type === 'string' && data.type.length));\n    (!(data === null || !!coerceId(data.id)) && debug.assert(`Encountered a relationship identifier without an id for the ${meta.kind} relationship '${meta.key}' on <${identifier.type}:${identifier.id}>, expected a json-api identifier but found '${JSON.stringify(data)}'. Please check your serializer and make sure it is serializing the relationship payload into a JSON API format.`, data === null || !!coerceId(data.id)));\n    (!(data === null || !data.type || store.getSchemaDefinitionService().doesTypeExist(data.type)) && debug.assert(`Encountered a relationship identifier with type '${data.type}' for the ${meta.kind} relationship '${meta.key}' on <${identifier.type}:${identifier.id}>, Expected a json-api identifier with type '${meta.type}'. No model was found for '${data.type}'.`, data === null || !data.type || store.getSchemaDefinitionService().doesTypeExist(data.type)));\n  }\n\n  function createState() {\n    return {\n      hasReceivedData: false,\n      isEmpty: true,\n      isStale: false,\n      hasFailedLoadAttempt: false,\n      shouldForceReload: false,\n      hasDematerializedInverse: false\n    };\n  }\n\n  class BelongsToRelationship {\n    constructor(definition, identifier) {\n      this.definition = definition;\n      this.identifier = identifier;\n      this._state = null;\n      this.transactionRef = 0;\n      this.meta = null;\n      this.links = null;\n      this.localState = null;\n      this.remoteState = null;\n    }\n    get state() {\n      let {\n        _state\n      } = this;\n      if (!_state) {\n        _state = this._state = createState();\n      }\n      return _state;\n    }\n    getData() {\n      let data;\n      let payload = {};\n      if (this.localState) {\n        data = this.localState;\n      }\n      if (this.localState === null && this.state.hasReceivedData) {\n        data = null;\n      }\n      if (this.links) {\n        payload.links = this.links;\n      }\n      if (data !== undefined) {\n        payload.data = data;\n      }\n      if (this.meta) {\n        payload.meta = this.meta;\n      }\n      return payload;\n    }\n  }\n\n  class ManyRelationship {\n    constructor(definition, identifier) {\n      this.definition = definition;\n      this.identifier = identifier;\n      this._state = null;\n      this.transactionRef = 0;\n      this.localMembers = new Set();\n      this.remoteMembers = new Set();\n      this.meta = null;\n      this.links = null;\n\n      // persisted state\n      this.remoteState = [];\n      // local client state\n      this.localState = [];\n    }\n    get state() {\n      let {\n        _state\n      } = this;\n      if (!_state) {\n        _state = this._state = createState();\n      }\n      return _state;\n    }\n    getData() {\n      let payload = {};\n      if (this.state.hasReceivedData) {\n        payload.data = this.localState.slice();\n      }\n      if (this.links) {\n        payload.links = this.links;\n      }\n      if (this.meta) {\n        payload.meta = this.meta;\n      }\n      return payload;\n    }\n  }\n\n  const BOOL_LATER = null;\n  const STR_LATER = '';\n  const IMPLICIT_KEY_RAND = Date.now();\n  function implicitKeyFor(type, key) {\n    return `implicit-${type}:${key}${IMPLICIT_KEY_RAND}`;\n  }\n  function syncMeta(definition, inverseDefinition) {\n    definition.inverseKind = inverseDefinition.kind;\n    definition.inverseKey = inverseDefinition.key;\n    definition.inverseType = inverseDefinition.type;\n    definition.inverseIsAsync = inverseDefinition.isAsync;\n    definition.inverseIsCollection = inverseDefinition.isCollection;\n    definition.inverseIsPolymorphic = inverseDefinition.isPolymorphic;\n    definition.inverseIsImplicit = inverseDefinition.isImplicit;\n  }\n  function upgradeMeta(meta) {\n    let niceMeta = {};\n    let options = meta.options;\n    niceMeta.kind = meta.kind;\n    niceMeta.key = meta.name;\n    niceMeta.type = meta.type;\n    (!(typeof options?.async === 'boolean') && debug.assert(`Expected relationship definition to specify async`, typeof options?.async === 'boolean'));\n    niceMeta.isAsync = options.async;\n    niceMeta.isImplicit = false;\n    niceMeta.isCollection = meta.kind === 'hasMany';\n    niceMeta.isPolymorphic = options && !!options.polymorphic;\n    niceMeta.inverseKey = options && options.inverse || STR_LATER;\n    niceMeta.inverseType = STR_LATER;\n    niceMeta.inverseIsAsync = BOOL_LATER;\n    niceMeta.inverseIsImplicit = options && options.inverse === null || BOOL_LATER;\n    niceMeta.inverseIsCollection = BOOL_LATER;\n    return niceMeta;\n  }\n  function isLHS(info, type, key) {\n    let isSelfReferential = info.isSelfReferential;\n    let isRelationship = key === info.lhs_relationshipName;\n    if (isRelationship === true) {\n      return isSelfReferential === true ||\n      // itself\n      type === info.lhs_baseModelName ||\n      // base or non-polymorphic\n      // if the other side is polymorphic then we need to scan our modelNames\n      info.rhs_isPolymorphic && info.lhs_modelNames.indexOf(type) !== -1 // polymorphic\n  ;\n    }\n    return false;\n  }\n  function upgradeDefinition(graph, identifier, propertyName, isImplicit) {\n    if (isImplicit === void 0) {\n      isImplicit = false;\n    }\n    const cache = graph._definitionCache;\n    const storeWrapper = graph.store;\n    const polymorphicLookup = graph._potentialPolymorphicTypes;\n    const {\n      type\n    } = identifier;\n    let cached = expandingGet(cache, type, propertyName);\n\n    // CASE: We have a cached resolution (null if no relationship exists)\n    if (cached !== undefined) {\n      return cached;\n    }\n    (!(!isImplicit) && debug.assert(`Expected to find relationship definition in the cache for the implicit relationship ${propertyName}`, !isImplicit));\n    let relationships = storeWrapper.getSchemaDefinitionService().relationshipsDefinitionFor(identifier);\n    (!(relationships) && debug.assert(`Expected to have a relationship definition for ${type} but none was found.`, relationships));\n    let meta = relationships[propertyName];\n    if (!meta) {\n      if (polymorphicLookup[type]) {\n        const altTypes = Object.keys(polymorphicLookup[type]);\n        for (let i = 0; i < altTypes.length; i++) {\n          let cached = expandingGet(cache, altTypes[i], propertyName);\n          if (cached) {\n            expandingSet(cache, type, propertyName, cached);\n            return cached;\n          }\n        }\n      }\n\n      // CASE: We don't have a relationship at all\n      // we should only hit this in prod\n      (!(meta) && debug.assert(`Expected to find a relationship definition for ${type}.${propertyName} but none was found.`, meta));\n      cache[type][propertyName] = null;\n      return null;\n    }\n    const definition = upgradeMeta(meta);\n    let inverseDefinition;\n    let inverseKey;\n    const inverseType = definition.type;\n\n    // CASE: Inverse is explicitly null\n    if (definition.inverseKey === null) {\n      // TODO probably dont need this assertion if polymorphic\n      (!(getStore(storeWrapper).modelFor(inverseType)) && debug.assert(`Expected the inverse model to exist`, getStore(storeWrapper).modelFor(inverseType)));\n      inverseDefinition = null;\n    } else {\n      inverseKey = inverseForRelationship(getStore(storeWrapper), identifier, propertyName);\n\n      // CASE: If we are polymorphic, and we declared an inverse that is non-null\n      // we must assume that the lack of inverseKey means that there is no\n      // concrete type as the baseType, so we must construct and artificial\n      // placeholder\n      if (!inverseKey && definition.isPolymorphic && definition.inverseKey) {\n        inverseDefinition = {\n          kind: 'belongsTo',\n          // this must be updated when we find the first belongsTo or hasMany definition that matches\n          key: definition.inverseKey,\n          type: type,\n          isAsync: false,\n          // this must be updated when we find the first belongsTo or hasMany definition that matches\n          isImplicit: false,\n          isCollection: false,\n          // this must be updated when we find the first belongsTo or hasMany definition that matches\n          isPolymorphic: false,\n          isInitialized: false // tracks whether we have seen the other side at least once\n        };\n\n        // CASE: Inverse resolves to null\n      } else if (!inverseKey) {\n        inverseDefinition = null;\n      } else {\n        // CASE: We have an explicit inverse or were able to resolve one\n        let inverseDefinitions = storeWrapper.getSchemaDefinitionService().relationshipsDefinitionFor({\n          type: inverseType\n        });\n        (!(inverseDefinitions) && debug.assert(`Expected to have a relationship definition for ${inverseType} but none was found.`, inverseDefinitions));\n        let meta = inverseDefinitions[inverseKey];\n        (!(meta) && debug.assert(`Expected to find a relationship definition for ${inverseType}.${inverseKey} but none was found.`, meta));\n        inverseDefinition = upgradeMeta(meta);\n      }\n    }\n\n    // CASE: We have no inverse\n    if (!inverseDefinition) {\n      // polish off meta\n      inverseKey = implicitKeyFor(type, propertyName);\n      inverseDefinition = {\n        kind: 'implicit',\n        key: inverseKey,\n        type: type,\n        isAsync: false,\n        isImplicit: true,\n        isCollection: true,\n        // with implicits any number of records could point at us\n        isPolymorphic: false\n      };\n      syncMeta(definition, inverseDefinition);\n      syncMeta(inverseDefinition, definition);\n      const info = {\n        lhs_key: `${type}:${propertyName}`,\n        lhs_modelNames: [type],\n        lhs_baseModelName: type,\n        lhs_relationshipName: propertyName,\n        lhs_definition: definition,\n        lhs_isPolymorphic: definition.isPolymorphic,\n        rhs_key: '',\n        rhs_modelNames: [],\n        rhs_baseModelName: inverseType,\n        rhs_relationshipName: '',\n        rhs_definition: inverseDefinition,\n        rhs_isPolymorphic: false,\n        hasInverse: false,\n        isSelfReferential: type === inverseType,\n        // this could be wrong if we are self-referential but also polymorphic\n        isReflexive: false // we can't be reflexive if we don't define an inverse\n      };\n      expandingSet(cache, inverseType, inverseKey, info);\n      expandingSet(cache, type, propertyName, info);\n      return info;\n    }\n\n    // CASE: We do have an inverse\n    const baseType = inverseDefinition.type;\n\n    // TODO we want to assert this but this breaks all of our shoddily written tests\n    /*\n      if (DEBUG) {\n        let inverseDoubleCheck = inverseMeta.type.inverseFor(inverseRelationshipName, store);\n         assert(`The ${inverseBaseModelName}:${inverseRelationshipName} relationship declares 'inverse: null', but it was resolved as the inverse for ${baseModelName}:${relationshipName}.`, inverseDoubleCheck);\n      }\n    */\n    // CASE: We may have already discovered the inverse for the baseModelName\n    // CASE: We have already discovered the inverse\n    cached = expandingGet(cache, baseType, propertyName) || expandingGet(cache, inverseType, inverseKey);\n    if (cached) {\n      // TODO this assert can be removed if the above assert is enabled\n      (!(cached.hasInverse !== false) && debug.assert(`The ${inverseType}:${inverseKey} relationship declares 'inverse: null', but it was resolved as the inverse for ${type}:${propertyName}.`, cached.hasInverse !== false));\n      let isLHS = cached.lhs_baseModelName === baseType;\n      let modelNames = isLHS ? cached.lhs_modelNames : cached.rhs_modelNames;\n      // make this lookup easier in the future by caching the key\n      modelNames.push(type);\n      expandingSet(cache, type, propertyName, cached);\n      return cached;\n    }\n\n    // this is our first time so polish off the metas\n    syncMeta(definition, inverseDefinition);\n    syncMeta(inverseDefinition, definition);\n    const lhs_modelNames = [type];\n    if (type !== baseType) {\n      lhs_modelNames.push(baseType);\n    }\n    const isSelfReferential = type === inverseType;\n    const info = {\n      lhs_key: `${baseType}:${propertyName}`,\n      lhs_modelNames,\n      lhs_baseModelName: baseType,\n      lhs_relationshipName: propertyName,\n      lhs_definition: definition,\n      lhs_isPolymorphic: definition.isPolymorphic,\n      rhs_key: `${inverseType}:${inverseKey}`,\n      rhs_modelNames: [inverseType],\n      rhs_baseModelName: inverseType,\n      rhs_relationshipName: inverseKey,\n      rhs_definition: inverseDefinition,\n      rhs_isPolymorphic: inverseDefinition.isPolymorphic,\n      hasInverse: true,\n      isSelfReferential,\n      isReflexive: isSelfReferential && propertyName === inverseKey\n    };\n\n    // Create entries for the baseModelName as well as modelName to speed up\n    //  inverse lookups\n    expandingSet(cache, baseType, propertyName, info);\n    expandingSet(cache, type, propertyName, info);\n\n    // Greedily populate the inverse\n    expandingSet(cache, inverseType, inverseKey, info);\n    return info;\n  }\n  function metaIsRelationshipDefinition(meta) {\n    return typeof meta._inverseKey === 'function';\n  }\n  function inverseForRelationship(store, identifier, key) {\n    const definition = store.getSchemaDefinitionService().relationshipsDefinitionFor(identifier)[key];\n    if (!definition) {\n      return null;\n    }\n    if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/record-data\").deprecations.DEPRECATE_RELATIONSHIPS_WITHOUT_INVERSE)) {\n      if (metaIsRelationshipDefinition(definition)) {\n        const modelClass = store.modelFor(identifier.type);\n        return definition._inverseKey(store, modelClass);\n      }\n    }\n    (!(definition.options?.inverse === null || typeof definition.options?.inverse === 'string' && definition.options.inverse.length > 0) && debug.assert(`Expected the relationship defintion to specify the inverse type or null.`, definition.options?.inverse === null || typeof definition.options?.inverse === 'string' && definition.options.inverse.length > 0));\n    return definition.options.inverse;\n  }\n\n  /*\n    Assert that `addedRecord` has a valid type so it can be added to the\n    relationship of the `record`.\n\n    The assert basically checks if the `addedRecord` can be added to the\n    relationship (specified via `relationshipMeta`) of the `record`.\n\n    This utility should only be used internally, as both record parameters must\n    be stable record identifiers and the `relationshipMeta` needs to be the meta\n    information about the relationship, retrieved via\n    `record.relationshipFor(key)`.\n  */\n  let assertPolymorphicType;\n  if (runtime.macroCondition(true)) {\n    let checkPolymorphic = function checkPolymorphic(modelClass, addedModelClass) {\n      if (modelClass.__isMixin) {\n        return modelClass.__mixin.detect(addedModelClass.PrototypeMixin) ||\n        // handle native class extension e.g. `class Post extends Model.extend(Commentable) {}`\n        modelClass.__mixin.detect(Object.getPrototypeOf(addedModelClass).PrototypeMixin);\n      }\n      return addedModelClass.prototype instanceof modelClass || modelClass.detect(addedModelClass);\n    };\n    assertPolymorphicType = function assertPolymorphicType(parentIdentifier, parentDefinition, addedIdentifier, store) {\n      let asserted = false;\n      if (parentDefinition.inverseIsImplicit) {\n        return;\n      }\n      if (parentDefinition.isPolymorphic) {\n        let meta = store.getSchemaDefinitionService().relationshipsDefinitionFor(addedIdentifier)[parentDefinition.inverseKey];\n        if (meta?.options?.as) {\n          asserted = true;\n          (!(meta.options.as === parentDefinition.type) && debug.assert(`The schema for the relationship '${parentDefinition.inverseKey}' on '${addedIdentifier.type}' type does not implement '${parentDefinition.type}' and thus cannot be assigned to the '${parentDefinition.key}' relationship in '${parentIdentifier.type}'. The definition should specify 'as: \"${parentDefinition.type}\"' in options.`, meta.options.as === parentDefinition.type));\n        }\n      }\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/record-data\").deprecations.DEPRECATE_NON_EXPLICIT_POLYMORPHISM)) {\n        if (!asserted) {\n          store = store._store ? store._store : store; // allow usage with storeWrapper\n          let addedModelName = addedIdentifier.type;\n          let parentModelName = parentIdentifier.type;\n          let key = parentDefinition.key;\n          let relationshipModelName = parentDefinition.type;\n          let relationshipClass = store.modelFor(relationshipModelName);\n          let addedClass = store.modelFor(addedModelName);\n          let assertionMessage = `The '${addedModelName}' type does not implement '${relationshipModelName}' and thus cannot be assigned to the '${key}' relationship in '${parentModelName}'. Make it a descendant of '${relationshipModelName}' or use a mixin of the same name.`;\n          let isPolymorphic = checkPolymorphic(relationshipClass, addedClass);\n          (!(isPolymorphic) && debug.assert(assertionMessage, isPolymorphic));\n        }\n      }\n    };\n  }\n\n  /*\n      case many:1\n      ========\n      In a bi-directional graph with Many:1 edges, adding a value\n      results in up-to 3 discrete value transitions, while removing\n      a value is only 2 transitions.\n\n      For adding C to A\n      If: A <<-> B, C <->> D is the initial state,\n      and: B <->> A <<-> C, D is the final state\n\n      then we would undergo the following transitions.\n\n      add C to A\n      remove C from D\n      add A to C\n\n      For removing B from A\n      If: A <<-> B, C <->> D is the initial state,\n      and: A, B, C <->> D is the final state\n\n      then we would undergo the following transitions.\n\n      remove B from A\n      remove A from B\n\n      case many:many\n      ===========\n      In a bi-directional graph with Many:Many edges, adding or\n      removing a value requires only 2 value transitions.\n\n      For Adding\n      If: A<<->>B, C<<->>D is the initial state (double arrows representing the many side)\n      And: D<<->>C<<->>A<<->>B is the final state\n\n      Then we would undergo two transitions.\n\n      add C to A.\n      add A to C\n\n      For Removing\n      If: A<<->>B, C<<->>D is the initial state (double arrows representing the many side)\n      And: A, B, C<<->>D is the final state\n\n      Then we would undergo two transitions.\n\n      remove B from A\n      remove A from B\n\n      case many:?\n      ========\n      In a uni-directional graph with Many:? edges (modeled in EmberData with `inverse:null`) with\n      artificial (implicit) inverses, replacing a value results in 2 discrete value transitions.\n      This is because a Many:? relationship is effectively Many:Many.\n    */\n  function replaceRelatedRecords(graph, op, isRemote) {\n    if (isRemote) {\n      replaceRelatedRecordsRemote(graph, op, isRemote);\n    } else {\n      replaceRelatedRecordsLocal(graph, op, isRemote);\n    }\n  }\n  function replaceRelatedRecordsLocal(graph, op, isRemote) {\n    const identifiers = op.value;\n    const relationship = graph.get(op.record, op.field);\n    (!(isHasMany(relationship)) && debug.assert(`expected hasMany relationship`, isHasMany(relationship)));\n    relationship.state.hasReceivedData = true;\n\n    // cache existing state\n    const {\n      localState,\n      localMembers,\n      definition\n    } = relationship;\n    const newValues = new Set(identifiers);\n    const identifiersLength = identifiers.length;\n    const newState = new Array(newValues.size);\n    const newMembership = new Set();\n\n    // wipe existing state\n    relationship.localMembers = newMembership;\n    relationship.localState = newState;\n    const {\n      type\n    } = relationship.definition;\n    let changed = false;\n    const currentLength = localState.length;\n    const iterationLength = currentLength > identifiersLength ? currentLength : identifiersLength;\n    const equalLength = currentLength === identifiersLength;\n    for (let i = 0, j = 0; i < iterationLength; i++) {\n      let adv = false;\n      if (i < identifiersLength) {\n        const identifier = identifiers[i];\n        // skip processing if we encounter a duplicate identifier in the array\n        if (!newMembership.has(identifier)) {\n          if (type !== identifier.type) {\n            if (runtime.macroCondition(true)) {\n              assertPolymorphicType(relationship.identifier, relationship.definition, identifier, graph.store);\n            }\n            graph.registerPolymorphicType(type, identifier.type);\n          }\n          newState[j] = identifier;\n          adv = true;\n          newMembership.add(identifier);\n          if (!localMembers.has(identifier)) {\n            changed = true;\n            addToInverse(graph, identifier, definition.inverseKey, op.record, isRemote);\n          }\n        }\n      }\n      if (i < currentLength) {\n        const identifier = localState[i];\n\n        // detect reordering\n        if (!newMembership.has(identifier)) {\n          if (equalLength && newState[i] !== identifier) {\n            changed = true;\n          }\n          if (!newValues.has(identifier)) {\n            changed = true;\n            removeFromInverse(graph, identifier, definition.inverseKey, op.record, isRemote);\n          }\n        }\n      }\n      if (adv) {\n        j++;\n      }\n    }\n    if (changed) {\n      notifyChange(graph, relationship.identifier, relationship.definition.key);\n    }\n  }\n  function replaceRelatedRecordsRemote(graph, op, isRemote) {\n    const identifiers = op.value;\n    const relationship = graph.get(op.record, op.field);\n    (!(isHasMany(relationship)) && debug.assert(`You can only '${op.op}' on a hasMany relationship. ${op.record.type}.${op.field} is a ${relationship.definition.kind}`, isHasMany(relationship)));\n    if (isRemote) {\n      graph._addToTransaction(relationship);\n    }\n    relationship.state.hasReceivedData = true;\n\n    // cache existing state\n    const {\n      remoteState,\n      remoteMembers,\n      definition\n    } = relationship;\n    const newValues = new Set(identifiers);\n    const identifiersLength = identifiers.length;\n    const newState = new Array(newValues.size);\n    const newMembership = new Set();\n\n    // wipe existing state\n    relationship.remoteMembers = newMembership;\n    relationship.remoteState = newState;\n    const {\n      type\n    } = relationship.definition;\n    let changed = false;\n    const canonicalLength = remoteState.length;\n    const iterationLength = canonicalLength > identifiersLength ? canonicalLength : identifiersLength;\n    const equalLength = canonicalLength === identifiersLength;\n    for (let i = 0, j = 0; i < iterationLength; i++) {\n      let adv = false;\n      if (i < identifiersLength) {\n        const identifier = identifiers[i];\n        if (!newMembership.has(identifier)) {\n          if (type !== identifier.type) {\n            if (runtime.macroCondition(true)) {\n              assertPolymorphicType(relationship.identifier, relationship.definition, identifier, graph.store);\n            }\n            graph.registerPolymorphicType(type, identifier.type);\n          }\n          newState[j] = identifier;\n          newMembership.add(identifier);\n          adv = true;\n          if (!remoteMembers.has(identifier)) {\n            changed = true;\n            addToInverse(graph, identifier, definition.inverseKey, op.record, isRemote);\n          }\n        }\n      }\n      if (i < canonicalLength) {\n        const identifier = remoteState[i];\n        if (!newMembership.has(identifier)) {\n          // detect reordering\n          if (equalLength && newState[j] !== identifier) {\n            changed = true;\n          }\n          if (!newValues.has(identifier)) {\n            changed = true;\n            removeFromInverse(graph, identifier, definition.inverseKey, op.record, isRemote);\n          }\n        }\n      }\n      if (adv) {\n        j++;\n      }\n    }\n    if (changed) {\n      flushCanonical(graph, relationship);\n      /*\n      replaceRelatedRecordsLocal(\n        graph,\n        {\n          op: op.op,\n          record: op.record,\n          field: op.field,\n          value: remoteState,\n        },\n        false\n      );*/\n    } else {\n      // preserve legacy behavior we want to change but requires some sort\n      // of deprecation.\n      flushCanonical(graph, relationship);\n    }\n  }\n  function addToInverse(graph, identifier, key, value, isRemote) {\n    const relationship = graph.get(identifier, key);\n    const {\n      type\n    } = relationship.definition;\n    if (type !== value.type) {\n      if (runtime.macroCondition(true)) {\n        assertPolymorphicType(relationship.identifier, relationship.definition, value, graph.store);\n      }\n      graph.registerPolymorphicType(type, value.type);\n    }\n    if (isBelongsTo(relationship)) {\n      relationship.state.hasReceivedData = true;\n      relationship.state.isEmpty = false;\n      if (isRemote) {\n        graph._addToTransaction(relationship);\n        if (relationship.remoteState !== null) {\n          removeFromInverse(graph, relationship.remoteState, relationship.definition.inverseKey, identifier, isRemote);\n        }\n        relationship.remoteState = value;\n      }\n      if (relationship.localState !== value) {\n        if (!isRemote && relationship.localState) {\n          removeFromInverse(graph, relationship.localState, relationship.definition.inverseKey, identifier, isRemote);\n        }\n        relationship.localState = value;\n        notifyChange(graph, relationship.identifier, relationship.definition.key);\n      }\n    } else if (isHasMany(relationship)) {\n      if (isRemote) {\n        if (!relationship.remoteMembers.has(value)) {\n          graph._addToTransaction(relationship);\n          relationship.remoteState.push(value);\n          relationship.remoteMembers.add(value);\n          relationship.state.hasReceivedData = true;\n          flushCanonical(graph, relationship);\n        }\n      } else {\n        if (!relationship.localMembers.has(value)) {\n          relationship.localState.push(value);\n          relationship.localMembers.add(value);\n          relationship.state.hasReceivedData = true;\n          notifyChange(graph, relationship.identifier, relationship.definition.key);\n        }\n      }\n    } else {\n      if (isRemote) {\n        if (!relationship.remoteMembers.has(value)) {\n          relationship.remoteMembers.add(value);\n          relationship.localMembers.add(value);\n        }\n      } else {\n        if (!relationship.localMembers.has(value)) {\n          relationship.localMembers.add(value);\n        }\n      }\n    }\n  }\n  function notifyInverseOfPotentialMaterialization(graph, identifier, key, value, isRemote) {\n    const relationship = graph.get(identifier, key);\n    if (isHasMany(relationship) && isRemote && relationship.remoteMembers.has(value)) {\n      notifyChange(graph, relationship.identifier, relationship.definition.key);\n    }\n  }\n  function removeFromInverse(graph, identifier, key, value, isRemote) {\n    const relationship = graph.get(identifier, key);\n    if (isBelongsTo(relationship)) {\n      relationship.state.isEmpty = true;\n      if (isRemote) {\n        graph._addToTransaction(relationship);\n        relationship.remoteState = null;\n      }\n      if (relationship.localState === value) {\n        relationship.localState = null;\n        notifyChange(graph, identifier, key);\n      }\n    } else if (isHasMany(relationship)) {\n      if (isRemote) {\n        graph._addToTransaction(relationship);\n        let index = relationship.remoteState.indexOf(value);\n        if (index !== -1) {\n          relationship.remoteMembers.delete(value);\n          relationship.remoteState.splice(index, 1);\n        }\n      }\n      let index = relationship.localState.indexOf(value);\n      if (index !== -1) {\n        relationship.localMembers.delete(value);\n        relationship.localState.splice(index, 1);\n      }\n      notifyChange(graph, relationship.identifier, relationship.definition.key);\n    } else {\n      if (isRemote) {\n        relationship.remoteMembers.delete(value);\n        relationship.localMembers.delete(value);\n      } else {\n        if (value && relationship.localMembers.has(value)) {\n          relationship.localMembers.delete(value);\n        }\n      }\n    }\n  }\n  function syncRemoteToLocal(graph, rel) {\n    let toSet = rel.remoteState;\n    let newRecordDatas = rel.localState.filter(recordData => isNew(recordData) && toSet.indexOf(recordData) === -1);\n    let existingState = rel.localState;\n    rel.localState = toSet.concat(newRecordDatas);\n    let localMembers = rel.localMembers = new Set();\n    rel.remoteMembers.forEach(v => localMembers.add(v));\n    for (let i = 0; i < newRecordDatas.length; i++) {\n      localMembers.add(newRecordDatas[i]);\n    }\n\n    // TODO always notifying fails only one test and we should probably do away with it\n    if (existingState.length !== rel.localState.length) {\n      notifyChange(graph, rel.identifier, rel.definition.key);\n    } else {\n      for (let i = 0; i < existingState.length; i++) {\n        if (existingState[i] !== rel.localState[i]) {\n          notifyChange(graph, rel.identifier, rel.definition.key);\n          break;\n        }\n      }\n    }\n  }\n  function flushCanonical(graph, rel) {\n    graph._scheduleLocalSync(rel);\n  }\n\n  function addToRelatedRecords(graph, op, isRemote) {\n    const {\n      record,\n      value,\n      index\n    } = op;\n    const relationship = graph.get(record, op.field);\n    (!(isHasMany(relationship)) && debug.assert(`You can only '${op.op}' on a hasMany relationship. ${record.type}.${op.field} is a ${relationship.definition.kind}`, isHasMany(relationship)));\n    if (Array.isArray(value)) {\n      for (let i = 0; i < value.length; i++) {\n        addRelatedRecord(graph, relationship, record, value[i], index !== undefined ? index + i : index, isRemote);\n      }\n    } else {\n      addRelatedRecord(graph, relationship, record, value, index, isRemote);\n    }\n    notifyChange(graph, relationship.identifier, relationship.definition.key);\n  }\n  function addRelatedRecord(graph, relationship, record, value, index, isRemote) {\n    (!(value) && debug.assert(`expected an identifier to add to the relationship`, value));\n    const {\n      localMembers,\n      localState\n    } = relationship;\n    if (localMembers.has(value)) {\n      return;\n    }\n    const {\n      type\n    } = relationship.definition;\n    if (type !== value.type) {\n      if (runtime.macroCondition(true)) {\n        assertPolymorphicType(record, relationship.definition, value, graph.store);\n      }\n      graph.registerPolymorphicType(value.type, type);\n    }\n    relationship.state.hasReceivedData = true;\n    localMembers.add(value);\n    if (index === undefined) {\n      localState.push(value);\n    } else {\n      localState.splice(index, 0, value);\n    }\n    addToInverse(graph, value, relationship.definition.inverseKey, record, isRemote);\n  }\n\n  function mergeIdentifier(graph, op, relationships) {\n    Object.keys(relationships).forEach(key => {\n      const rel = relationships[key];\n      if (!rel) {\n        return;\n      }\n      mergeIdentifierForRelationship(graph, op, rel);\n    });\n  }\n  function mergeIdentifierForRelationship(graph, op, rel) {\n    rel.identifier = op.value;\n    forAllRelatedIdentifiers(rel, identifier => {\n      const inverse = graph.get(identifier, rel.definition.inverseKey);\n      mergeInRelationship(graph, inverse, op);\n    });\n  }\n  function mergeInRelationship(graph, rel, op) {\n    if (isBelongsTo(rel)) {\n      mergeBelongsTo(graph, rel, op);\n    } else if (isHasMany(rel)) {\n      mergeHasMany(graph, rel, op);\n    } else {\n      mergeImplicit(graph, rel, op);\n    }\n  }\n  function mergeBelongsTo(graph, rel, op) {\n    if (rel.remoteState === op.record) {\n      rel.remoteState = op.value;\n    }\n    if (rel.localState === op.record) {\n      rel.localState = op.record;\n      notifyChange(graph, rel.identifier, rel.definition.key);\n    }\n  }\n  function mergeHasMany(graph, rel, op) {\n    if (rel.remoteMembers.has(op.record)) {\n      rel.remoteMembers.delete(op.record);\n      rel.remoteMembers.add(op.value);\n      const index = rel.remoteState.indexOf(op.record);\n      rel.remoteState.splice(index, 1, op.value);\n    }\n    if (rel.localMembers.has(op.record)) {\n      rel.localMembers.delete(op.record);\n      rel.localMembers.add(op.value);\n      const index = rel.localState.indexOf(op.record);\n      rel.localState.splice(index, 1, op.value);\n      notifyChange(graph, rel.identifier, rel.definition.key);\n    }\n  }\n  function mergeImplicit(graph, rel, op) {\n    if (rel.remoteMembers.has(op.record)) {\n      rel.remoteMembers.delete(op.record);\n      rel.remoteMembers.add(op.value);\n    }\n    if (rel.localMembers.has(op.record)) {\n      rel.localMembers.delete(op.record);\n      rel.localMembers.add(op.value);\n    }\n  }\n\n  function removeFromRelatedRecords(graph, op, isRemote) {\n    const {\n      record,\n      value\n    } = op;\n    const relationship = graph.get(record, op.field);\n    (!(isHasMany(relationship)) && debug.assert(`You can only '${op.op}' on a hasMany relationship. ${record.type}.${op.field} is a ${relationship.definition.kind}`, isHasMany(relationship)));\n    if (Array.isArray(value)) {\n      for (let i = 0; i < value.length; i++) {\n        removeRelatedRecord(graph, relationship, record, value[i], isRemote);\n      }\n    } else {\n      removeRelatedRecord(graph, relationship, record, value, isRemote);\n    }\n    notifyChange(graph, relationship.identifier, relationship.definition.key);\n  }\n  function removeRelatedRecord(graph, relationship, record, value, isRemote) {\n    (!(value) && debug.assert(`expected an identifier to add to the relationship`, value));\n    const {\n      localMembers,\n      localState\n    } = relationship;\n    if (!localMembers.has(value)) {\n      return;\n    }\n    localMembers.delete(value);\n    let index = localState.indexOf(value);\n    (!(index !== -1) && debug.assert(`expected localMembers and localState to be in sync`, index !== -1));\n    localState.splice(index, 1);\n    removeFromInverse(graph, value, relationship.definition.inverseKey, record, isRemote);\n  }\n\n  function replaceRelatedRecord(graph, op, isRemote) {\n    if (isRemote === void 0) {\n      isRemote = false;\n    }\n    const relationship = graph.get(op.record, op.field);\n    (!(isBelongsTo(relationship)) && debug.assert(`You can only '${op.op}' on a belongsTo relationship. ${op.record.type}.${op.field} is a ${relationship.definition.kind}`, isBelongsTo(relationship)));\n    if (isRemote) {\n      graph._addToTransaction(relationship);\n    }\n    const {\n      definition,\n      state\n    } = relationship;\n    const prop = isRemote ? 'remoteState' : 'localState';\n    const existingState = relationship[prop];\n\n    /*\n      case 1:1\n      ========\n      In a bi-directional graph with 1:1 edges, replacing a value\n      results in up-to 4 discrete value transitions.\n       If: A <-> B, C <-> D is the initial state,\n      and: A <-> C, B, D is the final state\n       then we would undergo the following 4 transitions.\n       remove A from B\n      add C to A\n      remove C from D\n      add A to C\n       case 1:many\n      ===========\n      In a bi-directional graph with 1:Many edges, replacing a value\n      results in up-to 3 discrete value transitions.\n       If: A<->>B<<->D, C<<->D is the initial state (double arrows representing the many side)\n      And: A<->>C<<->D, B<<->D is the final state\n       Then we would undergo three transitions.\n       remove A from B\n      add C to A.\n      add A to C\n       case 1:?\n      ========\n      In a uni-directional graph with 1:? edges (modeled in EmberData with `inverse:null`) with\n      artificial (implicit) inverses, replacing a value results in up-to 3 discrete value transitions.\n      This is because a 1:? relationship is effectively 1:many.\n       If: A->B, C->B is the initial state\n      And: A->C, C->B is the final state\n       Then we would undergo three transitions.\n       Remove A from B\n      Add C to A\n      Add A to C\n    */\n\n    // nothing for us to do\n    if (op.value === existingState) {\n      // if we were empty before but now know we are empty this needs to be true\n      state.hasReceivedData = true;\n      // if this is a remote update we still sync\n      if (isRemote) {\n        const {\n          localState\n        } = relationship;\n        // don't sync if localState is a new record and our remoteState is null\n        if (localState && isNew(localState) && !existingState) {\n          return;\n        }\n        if (existingState && localState === existingState) {\n          notifyInverseOfPotentialMaterialization(graph, existingState, definition.inverseKey, op.record, isRemote);\n        } else {\n          relationship.localState = existingState;\n          notifyChange(graph, relationship.identifier, relationship.definition.key);\n        }\n      }\n      return;\n    }\n\n    // remove this value from the inverse if required\n    if (existingState) {\n      removeFromInverse(graph, existingState, definition.inverseKey, op.record, isRemote);\n    }\n\n    // update value to the new value\n    relationship[prop] = op.value;\n    state.hasReceivedData = true;\n    state.isEmpty = op.value === null;\n    state.isStale = false;\n    state.hasFailedLoadAttempt = false;\n    if (op.value) {\n      if (definition.type !== op.value.type) {\n        (!(definition.isPolymorphic) && debug.assert(`The '<${definition.inverseType}>.${op.field}' relationship expects only '${definition.type}' records since it is not polymorphic. Received a Record of type '${op.value.type}'`, definition.isPolymorphic)); // TODO this should now handle the deprecation warning if isPolymorphic is not set\n        // but the record does turn out to be polymorphic\n        // this should still assert if the user is relying on legacy inheritance/mixins to\n        // provide polymorphic behavior and has not yet added the polymorphic flags\n        if (runtime.macroCondition(true)) {\n          assertPolymorphicType(relationship.identifier, definition, op.value, graph.store);\n        }\n        graph.registerPolymorphicType(definition.type, op.value.type);\n      }\n      addToInverse(graph, op.value, definition.inverseKey, op.record, isRemote);\n    }\n    if (isRemote) {\n      const {\n        localState,\n        remoteState\n      } = relationship;\n      if (localState && isNew(localState) && !remoteState) {\n        return;\n      }\n      if (localState !== remoteState) {\n        relationship.localState = remoteState;\n        notifyChange(graph, relationship.identifier, relationship.definition.key);\n      }\n    } else {\n      notifyChange(graph, relationship.identifier, relationship.definition.key);\n    }\n  }\n\n  /*\n    This method normalizes a link to an \"links object\". If the passed link is\n    already an object it's returned without any modifications.\n\n    See http://jsonapi.org/format/#document-links for more information.\n  */\n  function _normalizeLink(link) {\n    switch (typeof link) {\n      case 'object':\n        return link;\n      case 'string':\n        return {\n          href: link\n        };\n    }\n  }\n\n  /*\n      Updates the \"canonical\" or \"remote\" state of a relationship, replacing any existing\n      state and blowing away any local changes (excepting new records).\n  */\n  function updateRelationshipOperation(graph, op) {\n    const relationship = graph.get(op.record, op.field);\n    (!(isHasMany(relationship) || isBelongsTo(relationship)) && debug.assert(`Cannot update an implicit relationship`, isHasMany(relationship) || isBelongsTo(relationship)));\n    const {\n      definition,\n      state,\n      identifier\n    } = relationship;\n    const {\n      isCollection\n    } = definition;\n    const payload = op.value;\n    let hasRelationshipDataProperty = false;\n    let hasUpdatedLink = false;\n    if (payload.meta) {\n      relationship.meta = payload.meta;\n    }\n    if (payload.data !== undefined) {\n      hasRelationshipDataProperty = true;\n      if (isCollection) {\n        // TODO deprecate this case. We\n        // have tests saying we support it.\n        if (payload.data === null) {\n          payload.data = [];\n        }\n        (!(Array.isArray(payload.data)) && debug.assert(`Expected an array`, Array.isArray(payload.data)));\n        const cache = graph.store.identifierCache;\n        // TODO may not need to cast to stable identifiers here since update likely does this too\n        graph.update({\n          op: 'replaceRelatedRecords',\n          record: identifier,\n          field: op.field,\n          value: payload.data.map(i => cache.getOrCreateRecordIdentifier(i))\n        }, true);\n      } else {\n        // TODO may not need to cast to stable identifiers here since update likely does this too\n        graph.update({\n          op: 'replaceRelatedRecord',\n          record: identifier,\n          field: op.field,\n          value: payload.data ? graph.store.identifierCache.getOrCreateRecordIdentifier(payload.data) : null\n        }, true);\n      }\n    } else if (definition.isAsync === false && !state.hasReceivedData) {\n      hasRelationshipDataProperty = true;\n      if (isCollection) {\n        graph.update({\n          op: 'replaceRelatedRecords',\n          record: identifier,\n          field: op.field,\n          value: []\n        }, true);\n      } else {\n        graph.update({\n          op: 'replaceRelatedRecord',\n          record: identifier,\n          field: op.field,\n          value: null\n        }, true);\n      }\n    }\n    if (payload.links) {\n      let originalLinks = relationship.links;\n      relationship.links = payload.links;\n      if (payload.links.related) {\n        let relatedLink = _normalizeLink(payload.links.related);\n        let currentLink = originalLinks && originalLinks.related ? _normalizeLink(originalLinks.related) : null;\n        let currentLinkHref = currentLink ? currentLink.href : null;\n        if (relatedLink && relatedLink.href && relatedLink.href !== currentLinkHref) {\n          (debug.warn(`You pushed a record of type '${identifier.type}' with a relationship '${definition.key}' configured as 'async: false'. You've included a link but no primary data, this may be an error in your payload. EmberData will treat this relationship as known-to-be-empty.`, definition.isAsync || state.hasReceivedData, {\n            id: 'ds.store.push-link-for-sync-relationship'\n          }));\n          (!(typeof relatedLink.href === 'string' || relatedLink.href === null) && debug.assert(`You have pushed a record of type '${identifier.type}' with '${definition.key}' as a link, but the value of that link is not a string.`, typeof relatedLink.href === 'string' || relatedLink.href === null));\n          hasUpdatedLink = true;\n        }\n      }\n    }\n\n    /*\n         Data being pushed into the relationship might contain only data or links,\n         or a combination of both.\n          IF contains only data\n         IF contains both links and data\n          state.isEmpty -> true if is empty array (has-many) or is null (belongs-to)\n          state.hasReceivedData -> true\n          hasDematerializedInverse -> false\n          state.isStale -> false\n          allInverseRecordsAreLoaded -> run-check-to-determine\n          IF contains only links\n          state.isStale -> true\n         */\n    relationship.state.hasFailedLoadAttempt = false;\n    if (hasRelationshipDataProperty) {\n      let relationshipIsEmpty = payload.data === null || Array.isArray(payload.data) && payload.data.length === 0;\n\n      // we don't need to notify here as the update op we pushed in above will notify once\n      // membership is in the correct state.\n      relationship.state.hasReceivedData = true;\n      relationship.state.isStale = false;\n      relationship.state.hasDematerializedInverse = false;\n      relationship.state.isEmpty = relationshipIsEmpty;\n    } else if (hasUpdatedLink) {\n      // only notify stale if we have not previously received membership data.\n      // within this same transaction\n      // this prevents refetching when only one side of the relationship in the\n      // payload contains the info while the other side contains just a link\n      // this only works when the side with just a link is a belongsTo, as we\n      // don't know if a hasMany has full information or not.\n      // see #7049 for context.\n      if (isCollection || !relationship.state.hasReceivedData || relationship.transactionRef === 0) {\n        relationship.state.isStale = true;\n        notifyChange(graph, relationship.identifier, relationship.definition.key);\n      } else {\n        relationship.state.isStale = false;\n      }\n    }\n  }\n\n  const Graphs = new Map();\n\n  /*\n   * Graph acts as the cache for relationship data. It allows for\n   * us to ask about and update relationships for a given Identifier\n   * without requiring other objects for that Identifier to be\n   * instantiated (such as `RecordData` or a `Record`)\n   *\n   * This also allows for us to make more substantive changes to relationships\n   * with increasingly minor alterations to other portions of the internals\n   * over time.\n   *\n   * The graph is made up of nodes and edges. Each unique identifier gets\n   * its own node, which is a dictionary with a list of that node's edges\n   * (or connections) to other nodes. In `Model` terms, a node represents a\n   * record instance, with each key (an edge) in the dictionary correlating\n   * to either a `hasMany` or `belongsTo` field on that record instance.\n   *\n   * The value for each key, or `edge` is the identifier(s) the node relates\n   * to in the graph from that key.\n   */\n  class Graph {\n    constructor(store) {\n      this._definitionCache = Object.create(null);\n      this._potentialPolymorphicTypes = Object.create(null);\n      this.identifiers = new Map();\n      this.store = store;\n      this.isDestroyed = false;\n      this._willSyncRemote = false;\n      this._willSyncLocal = false;\n      this._pushedUpdates = {\n        belongsTo: [],\n        hasMany: [],\n        deletions: []\n      };\n      this._updatedRelationships = new Set();\n      this._transaction = null;\n      this._removing = null;\n    }\n    has(identifier, propertyName) {\n      let relationships = this.identifiers.get(identifier);\n      if (!relationships) {\n        return false;\n      }\n      return relationships[propertyName] !== undefined;\n    }\n    get(identifier, propertyName) {\n      (!(propertyName) && debug.assert(`expected propertyName`, propertyName));\n      let relationships = this.identifiers.get(identifier);\n      if (!relationships) {\n        relationships = Object.create(null);\n        this.identifiers.set(identifier, relationships);\n      }\n      let relationship = relationships[propertyName];\n      if (!relationship) {\n        const info = upgradeDefinition(this, identifier, propertyName);\n        (!(info !== null) && debug.assert(`Could not determine relationship information for ${identifier.type}.${propertyName}`, info !== null));\n        const meta = isLHS(info, identifier.type, propertyName) ? info.lhs_definition : info.rhs_definition;\n        if (meta.kind !== 'implicit') {\n          const Klass = meta.kind === 'hasMany' ? ManyRelationship : BelongsToRelationship;\n          relationship = relationships[propertyName] = new Klass(meta, identifier);\n        } else {\n          relationship = relationships[propertyName] = {\n            definition: meta,\n            identifier,\n            localMembers: new Set(),\n            remoteMembers: new Set()\n          };\n        }\n      }\n      return relationship;\n    }\n\n    /*\n     * Allows for the graph to dynamically discover polymorphic connections\n     * without needing to walk prototype chains.\n     *\n     * Used by edges when an added `type` does not match the expected `type`\n     * for that edge.\n     *\n     * Currently we assert before calling this. For a public API we will want\n     * to call out to the schema manager to ask if we should consider these\n     * types as equivalent for a given relationship.\n     */\n    registerPolymorphicType(type1, type2) {\n      const typeCache = this._potentialPolymorphicTypes;\n      let t1 = typeCache[type1];\n      if (!t1) {\n        t1 = typeCache[type1] = Object.create(null);\n      }\n      t1[type2] = true;\n      let t2 = typeCache[type2];\n      if (!t2) {\n        t2 = typeCache[type2] = Object.create(null);\n      }\n      t2[type1] = true;\n    }\n\n    /*\n     TODO move this comment somewhere else\n     implicit relationships are relationships which have not been declared but the inverse side exists on\n     another record somewhere\n      For example if there was:\n      ```app/models/comment.js\n     import Model, { attr } from '@ember-data/model';\n      export default class Comment extends Model {\n       @attr text;\n     }\n     ```\n      and there is also:\n      ```app/models/post.js\n     import Model, { attr, hasMany } from '@ember-data/model';\n      export default class Post extends Model {\n       @attr title;\n       @hasMany('comment') comments;\n     }\n     ```\n      Then we would have a implicit 'post' relationship for the comment record in order\n     to be do things like remove the comment from the post if the comment were to be deleted.\n    */\n\n    isReleasable(identifier) {\n      const relationships = this.identifiers.get(identifier);\n      if (!relationships) {\n        return true;\n      }\n      const keys = Object.keys(relationships);\n      for (let i = 0; i < keys.length; i++) {\n        const relationship = relationships[keys[i]];\n        (!(relationship) && debug.assert(`Expected a relationship`, relationship));\n        if (relationship.definition.inverseIsAsync) {\n          return false;\n        }\n      }\n      return true;\n    }\n    unload(identifier, silenceNotifications) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/record-data\").debug.LOG_GRAPH)) {\n        // eslint-disable-next-line no-console\n        console.log(`graph: unload ${String(identifier)}`);\n      }\n      const relationships = this.identifiers.get(identifier);\n      if (relationships) {\n        // cleans up the graph but retains some nodes\n        // to allow for rematerialization\n        Object.keys(relationships).forEach(key => {\n          let rel = relationships[key];\n          if (!rel) {\n            return;\n          }\n          destroyRelationship(this, rel, silenceNotifications);\n          if (isImplicit(rel)) {\n            relationships[key] = undefined;\n          }\n        });\n      }\n    }\n    remove(identifier) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/record-data\").debug.LOG_GRAPH)) {\n        // eslint-disable-next-line no-console\n        console.log(`graph: remove ${String(identifier)}`);\n      }\n      (!(!this._removing) && debug.assert(`Cannot remove ${String(identifier)} while still removing ${String(this._removing)}`, !this._removing));\n      this._removing = identifier;\n      this.unload(identifier);\n      this.identifiers.delete(identifier);\n      this._removing = null;\n    }\n\n    /*\n     * Remote state changes\n     */\n    push(op) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/record-data\").debug.LOG_GRAPH)) {\n        // eslint-disable-next-line no-console\n        console.log(`graph: push ${String(op.record)}`, op);\n      }\n      if (op.op === 'deleteRecord') {\n        this._pushedUpdates.deletions.push(op);\n      } else if (op.op === 'replaceRelatedRecord') {\n        this._pushedUpdates.belongsTo.push(op);\n      } else {\n        const relationship = this.get(op.record, op.field);\n        (!(!isImplicit(relationship)) && debug.assert(`Cannot push a remote update for an implicit relationship`, !isImplicit(relationship)));\n        this._pushedUpdates[relationship.definition.kind].push(op);\n      }\n      if (!this._willSyncRemote) {\n        this._willSyncRemote = true;\n        getStore(this.store)._schedule('coalesce', () => this._flushRemoteQueue());\n      }\n    }\n\n    /*\n     * Local state changes\n     */\n\n    update(op, isRemote) {\n      if (isRemote === void 0) {\n        isRemote = false;\n      }\n      (!(op.op === 'deleteRecord' || op.op === 'mergeIdentifiers' || !isImplicit(this.get(op.record, op.field))) && debug.assert(`Cannot update an implicit relationship`, op.op === 'deleteRecord' || op.op === 'mergeIdentifiers' || !isImplicit(this.get(op.record, op.field))));\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/record-data\").debug.LOG_GRAPH)) {\n        // eslint-disable-next-line no-console\n        console.log(`graph: update (${isRemote ? 'remote' : 'local'}) ${String(op.record)}`, op);\n      }\n      switch (op.op) {\n        case 'mergeIdentifiers':\n          {\n            const relationships = this.identifiers.get(op.record);\n            if (relationships) {\n              mergeIdentifier(this, op, relationships);\n            }\n            break;\n          }\n        case 'updateRelationship':\n          (!(isRemote) && debug.assert(`Can only perform the operation updateRelationship on remote state`, isRemote));\n          if (runtime.macroCondition(true)) {\n            // in debug, assert payload validity eagerly\n            // TODO add deprecations/assertion here for duplicates\n            assertValidRelationshipPayload(this, op);\n          }\n          updateRelationshipOperation(this, op);\n          break;\n        case 'deleteRecord':\n          {\n            (!(isRemote) && debug.assert(`Can only perform the operation deleteRelationship on remote state`, isRemote));\n            const identifier = op.record;\n            const relationships = this.identifiers.get(identifier);\n            if (relationships) {\n              Object.keys(relationships).forEach(key => {\n                const rel = relationships[key];\n                if (!rel) {\n                  return;\n                }\n                // works together with the has check\n                relationships[key] = undefined;\n                removeCompletelyFromInverse(this, rel);\n              });\n              this.identifiers.delete(identifier);\n            }\n            break;\n          }\n        case 'replaceRelatedRecord':\n          replaceRelatedRecord(this, op, isRemote);\n          break;\n        case 'addToRelatedRecords':\n          addToRelatedRecords(this, op, isRemote);\n          break;\n        case 'removeFromRelatedRecords':\n          removeFromRelatedRecords(this, op, isRemote);\n          break;\n        case 'replaceRelatedRecords':\n          replaceRelatedRecords(this, op, isRemote);\n          break;\n        default:\n          (debug.assert(`No local relationship update operation exists for '${op.op}'`));\n      }\n    }\n    _scheduleLocalSync(relationship) {\n      this._updatedRelationships.add(relationship);\n      if (!this._willSyncLocal) {\n        this._willSyncLocal = true;\n        getStore(this.store)._schedule('sync', () => this._flushLocalQueue());\n      }\n    }\n    _flushRemoteQueue() {\n      if (!this._willSyncRemote) {\n        return;\n      }\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/record-data\").debug.LOG_GRAPH)) {\n        // eslint-disable-next-line no-console\n        console.groupCollapsed(`Graph: Initialized Transaction`);\n      }\n      this._transaction = new Set();\n      this._willSyncRemote = false;\n      const {\n        deletions,\n        hasMany,\n        belongsTo\n      } = this._pushedUpdates;\n      this._pushedUpdates.deletions = [];\n      this._pushedUpdates.hasMany = [];\n      this._pushedUpdates.belongsTo = [];\n      for (let i = 0; i < deletions.length; i++) {\n        this.update(deletions[i], true);\n      }\n      for (let i = 0; i < hasMany.length; i++) {\n        this.update(hasMany[i], true);\n      }\n      for (let i = 0; i < belongsTo.length; i++) {\n        this.update(belongsTo[i], true);\n      }\n      this._finalize();\n    }\n    _addToTransaction(relationship) {\n      (!(this._transaction !== null) && debug.assert(`expected a transaction`, this._transaction !== null));\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/record-data\").debug.LOG_GRAPH)) {\n        // eslint-disable-next-line no-console\n        console.log(`Graph: ${String(relationship.identifier)} ${relationship.definition.key} added to transaction`);\n      }\n      relationship.transactionRef++;\n      this._transaction.add(relationship);\n    }\n    _finalize() {\n      if (this._transaction) {\n        this._transaction.forEach(v => v.transactionRef = 0);\n        this._transaction = null;\n        if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/record-data\").debug.LOG_GRAPH)) {\n          // eslint-disable-next-line no-console\n          console.log(`Graph: transaction finalized`);\n          // eslint-disable-next-line no-console\n          console.groupEnd();\n        }\n      }\n    }\n    _flushLocalQueue() {\n      if (!this._willSyncLocal) {\n        return;\n      }\n      this._willSyncLocal = false;\n      let updated = this._updatedRelationships;\n      this._updatedRelationships = new Set();\n      updated.forEach(rel => syncRemoteToLocal(this, rel));\n    }\n    destroy() {\n      Graphs.delete(this.store);\n      if (runtime.macroCondition(true)) {\n        Graphs.delete(getStore(this.store));\n        if (Graphs.size) {\n          Graphs.forEach((_, key) => {\n            (!(\n            // @ts-expect-error\n            !key.isDestroyed && !key.isDestroying) && debug.assert(`Memory Leak Detected, likely the test or app instance previous to this was not torn down properly`, !key.isDestroyed && !key.isDestroying));\n          });\n        }\n      }\n      this.identifiers.clear();\n      this.store = null;\n      this.isDestroyed = true;\n    }\n  }\n\n  // Handle dematerialization for relationship `rel`.  In all cases, notify the\n  // relationship of the dematerialization: this is done so the relationship can\n  // notify its inverse which needs to update state\n  //\n  // If the inverse is sync, unloading this record is treated as a client-side\n  // delete, so we remove the inverse records from this relationship to\n  // disconnect the graph.  Because it's not async, we don't need to keep around\n  // the identifier as an id-wrapper for references\n  function destroyRelationship(graph, rel, silenceNotifications) {\n    if (isImplicit(rel)) {\n      if (graph.isReleasable(rel.identifier)) {\n        removeCompletelyFromInverse(graph, rel);\n      }\n      return;\n    }\n    const {\n      identifier\n    } = rel;\n    const {\n      inverseKey\n    } = rel.definition;\n    if (!rel.definition.inverseIsImplicit) {\n      forAllRelatedIdentifiers(rel, inverseIdentifer => notifyInverseOfDematerialization(graph, inverseIdentifer, inverseKey, identifier, silenceNotifications));\n    }\n    if (!rel.definition.inverseIsImplicit && !rel.definition.inverseIsAsync) {\n      rel.state.isStale = true;\n      clearRelationship(rel);\n\n      // necessary to clear relationships in the ui from dematerialized records\n      // hasMany is managed by Model which calls `retreiveLatest` after\n      // dematerializing the recordData instance.\n      // but sync belongsTo requires this since they don't have a proxy to update.\n      // so we have to notify so it will \"update\" to null.\n      // we should discuss whether we still care about this, probably fine to just\n      // leave the ui relationship populated since the record is destroyed and\n      // internally we've fully cleaned up.\n      if (!rel.definition.isAsync && !silenceNotifications) {\n        notifyChange(graph, rel.identifier, rel.definition.key);\n      }\n    }\n  }\n  function notifyInverseOfDematerialization(graph, inverseIdentifier, inverseKey, identifier, silenceNotifications) {\n    if (!graph.has(inverseIdentifier, inverseKey)) {\n      return;\n    }\n    let relationship = graph.get(inverseIdentifier, inverseKey);\n    (!(!isImplicit(relationship)) && debug.assert(`expected no implicit`, !isImplicit(relationship))); // For remote members, it is possible that inverseRecordData has already been associated to\n    // to another record. For such cases, do not dematerialize the inverseRecordData\n    if (!isBelongsTo(relationship) || !relationship.localState || identifier === relationship.localState) {\n      removeDematerializedInverse(graph, relationship, identifier, silenceNotifications);\n    }\n  }\n  function clearRelationship(relationship) {\n    if (isBelongsTo(relationship)) {\n      relationship.localState = null;\n      relationship.remoteState = null;\n      relationship.state.hasReceivedData = false;\n      relationship.state.isEmpty = true;\n    } else {\n      relationship.localMembers.clear();\n      relationship.remoteMembers.clear();\n      relationship.localState = [];\n      relationship.remoteState = [];\n    }\n  }\n  function removeDematerializedInverse(graph, relationship, inverseIdentifier, silenceNotifications) {\n    if (isBelongsTo(relationship)) {\n      const inverseIdentifier = relationship.localState;\n      if (!relationship.definition.isAsync || inverseIdentifier && isNew(inverseIdentifier)) {\n        // unloading inverse of a sync relationship is treated as a client-side\n        // delete, so actually remove the models don't merely invalidate the cp\n        // cache.\n        // if the record being unloaded only exists on the client, we similarly\n        // treat it as a client side delete\n        if (relationship.localState === inverseIdentifier && inverseIdentifier !== null) {\n          relationship.localState = null;\n        }\n        if (relationship.remoteState === inverseIdentifier && inverseIdentifier !== null) {\n          relationship.remoteState = null;\n          relationship.state.hasReceivedData = true;\n          relationship.state.isEmpty = true;\n          if (relationship.localState && !isNew(relationship.localState)) {\n            relationship.localState = null;\n          }\n        }\n      } else {\n        relationship.state.hasDematerializedInverse = true;\n      }\n      if (!silenceNotifications) {\n        notifyChange(graph, relationship.identifier, relationship.definition.key);\n      }\n    } else {\n      if (!relationship.definition.isAsync || inverseIdentifier && isNew(inverseIdentifier)) {\n        // unloading inverse of a sync relationship is treated as a client-side\n        // delete, so actually remove the models don't merely invalidate the cp\n        // cache.\n        // if the record being unloaded only exists on the client, we similarly\n        // treat it as a client side delete\n        removeIdentifierCompletelyFromRelationship(graph, relationship, inverseIdentifier);\n      } else {\n        relationship.state.hasDematerializedInverse = true;\n      }\n      if (!silenceNotifications) {\n        notifyChange(graph, relationship.identifier, relationship.definition.key);\n      }\n    }\n  }\n  function removeCompletelyFromInverse(graph, relationship) {\n    const {\n      identifier\n    } = relationship;\n    const {\n      inverseKey\n    } = relationship.definition;\n    forAllRelatedIdentifiers(relationship, inverseIdentifier => {\n      if (graph.has(inverseIdentifier, inverseKey)) {\n        removeIdentifierCompletelyFromRelationship(graph, graph.get(inverseIdentifier, inverseKey), identifier);\n      }\n    });\n    if (isBelongsTo(relationship)) {\n      if (!relationship.definition.isAsync) {\n        clearRelationship(relationship);\n      }\n      relationship.localState = null;\n    } else if (isHasMany(relationship)) {\n      if (!relationship.definition.isAsync) {\n        clearRelationship(relationship);\n        notifyChange(graph, relationship.identifier, relationship.definition.key);\n      }\n    } else {\n      relationship.remoteMembers.clear();\n      relationship.localMembers.clear();\n    }\n  }\n\n  function isStore(maybeStore) {\n    return maybeStore._instanceCache !== undefined;\n  }\n  function getWrapper(store) {\n    return isStore(store) ? store._instanceCache._storeWrapper : store;\n  }\n  function peekGraph(store) {\n    return Graphs.get(getWrapper(store));\n  }\n  function graphFor(store) {\n    const wrapper = getWrapper(store);\n    let graph = Graphs.get(wrapper);\n    if (!graph) {\n      graph = new Graph(wrapper);\n      Graphs.set(wrapper, graph);\n\n      // in DEBUG we attach the graph to the main store for improved debuggability\n      if (runtime.macroCondition(true)) {\n        if (getStore(wrapper).isDestroying) {\n          throw new Error(`Memory Leak Detected During Teardown`);\n        }\n        Graphs.set(getStore(wrapper), graph);\n      }\n    }\n    return graph;\n  }\n\n  const EMPTY_ITERATOR = {\n    iterator() {\n      return {\n        next() {\n          return {\n            done: true,\n            value: undefined\n          };\n        }\n      };\n    }\n  };\n\n  /**\n    The default cache implementation used by ember-data. The cache\n    is configurable and using a different implementation can be\n    achieved by implementing the store's createRecordDataFor hook.\n\n    @class RecordDataDefault\n    @public\n   */\n\n  function makeCache() {\n    return {\n      remoteAttrs: null,\n      localAttrs: null,\n      inflightAttrs: null,\n      changes: null,\n      errors: null,\n      isNew: false,\n      isDeleted: false,\n      isDeletionCommitted: false\n    };\n  }\n  class SingletonRecordData {\n    constructor(storeWrapper) {\n      this.version = '2';\n      this.__storeWrapper = void 0;\n      this.__cache = new Map();\n      this.__destroyedCache = new Map();\n      this.__storeWrapper = storeWrapper;\n    }\n\n    /**\n     * Private method used when the store's `createRecordDataFor` hook is called\n     * to populate an entry for the identifier into the singleton.\n     *\n     * @method createCache\n     * @private\n     * @param identifier\n     */\n    createCache(identifier) {\n      this.__cache.set(identifier, makeCache());\n    }\n    __peek(identifier, allowDestroyed) {\n      if (allowDestroyed === void 0) {\n        allowDestroyed = false;\n      }\n      let resource = this.__cache.get(identifier);\n      if (!resource && allowDestroyed) {\n        resource = this.__destroyedCache.get(identifier);\n      }\n      (!(resource) && debug.assert(`Expected RecordData Cache to have a resource cache for the identifier ${String(identifier)} but none was found`, resource));\n      return resource;\n    }\n    pushData(identifier, data, calculateChanges) {\n      let changedKeys;\n      const cached = this.__peek(identifier);\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/record-data\").debug.LOG_OPERATIONS)) {\n        try {\n          let _data = JSON.parse(JSON.stringify(data));\n          // eslint-disable-next-line no-console\n          console.log('EmberData | Operation - pushData (upsert)', _data);\n        } catch (e) {\n          // eslint-disable-next-line no-console\n          console.log('EmberData | Operation - pushData (upsert)', data);\n        }\n      }\n      if (cached.isNew) {\n        cached.isNew = false;\n        this.__storeWrapper.notifyChange(identifier, 'state');\n      }\n      if (calculateChanges) {\n        changedKeys = calculateChangedKeys(cached, data.attributes);\n      }\n      cached.remoteAttrs = Object.assign(cached.remoteAttrs || Object.create(null), data.attributes);\n      if (cached.localAttrs) {\n        if (patchLocalAttributes(cached)) {\n          this.__storeWrapper.notifyChange(identifier, 'state');\n        }\n      }\n      if (data.relationships) {\n        setupRelationships(this.__storeWrapper, identifier, data);\n      }\n      if (changedKeys && changedKeys.length) {\n        notifyAttributes(this.__storeWrapper, identifier, changedKeys);\n      }\n      return changedKeys;\n    }\n    sync(op) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/record-data\").debug.LOG_OPERATIONS)) {\n        try {\n          let _data = JSON.parse(JSON.stringify(op));\n          // eslint-disable-next-line no-console\n          console.log(`EmberData | Operation - sync ${op.op}`, _data);\n        } catch (e) {\n          // eslint-disable-next-line no-console\n          console.log(`EmberData | Operation - sync ${op.op}`, op);\n        }\n      }\n      if (op.op === 'mergeIdentifiers') {\n        const cache = this.__cache.get(op.record);\n        if (cache) {\n          this.__cache.set(op.value, cache);\n          this.__cache.delete(op.record);\n        }\n        graphFor(this.__storeWrapper).update(op, true);\n      }\n    }\n    update(op) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/record-data\").debug.LOG_MUTATIONS)) {\n        try {\n          let _data = JSON.parse(JSON.stringify(op));\n          // eslint-disable-next-line no-console\n          console.log(`EmberData | Mutation - update ${op.op}`, _data);\n        } catch (e) {\n          // eslint-disable-next-line no-console\n          console.log(`EmberData | Mutation - update ${op.op}`, op);\n        }\n      }\n      graphFor(this.__storeWrapper).update(op, false);\n    }\n    clientDidCreate(identifier, options) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/record-data\").debug.LOG_MUTATIONS)) {\n        try {\n          let _data = options ? JSON.parse(JSON.stringify(options)) : options;\n          // eslint-disable-next-line no-console\n          console.log(`EmberData | Mutation - clientDidCreate ${identifier.lid}`, _data);\n        } catch (e) {\n          // eslint-disable-next-line no-console\n          console.log(`EmberData | Mutation - clientDidCreate ${identifier.lid}`, options);\n        }\n      }\n      const cached = this.__peek(identifier);\n      cached.isNew = true;\n      let createOptions = {};\n      if (options !== undefined) {\n        const storeWrapper = this.__storeWrapper;\n        let attributeDefs = storeWrapper.getSchemaDefinitionService().attributesDefinitionFor(identifier);\n        let relationshipDefs = storeWrapper.getSchemaDefinitionService().relationshipsDefinitionFor(identifier);\n        const graph = graphFor(storeWrapper);\n        let propertyNames = Object.keys(options);\n        for (let i = 0; i < propertyNames.length; i++) {\n          let name = propertyNames[i];\n          let propertyValue = options[name];\n          if (name === 'id') {\n            continue;\n          }\n          const fieldType = relationshipDefs[name] || attributeDefs[name];\n          let kind = fieldType !== undefined ? 'kind' in fieldType ? fieldType.kind : 'attribute' : null;\n          let relationship;\n          switch (kind) {\n            case 'attribute':\n              this.setAttr(identifier, name, propertyValue);\n              break;\n            case 'belongsTo':\n              this.update({\n                op: 'replaceRelatedRecord',\n                field: name,\n                record: identifier,\n                value: propertyValue\n              });\n              relationship = graph.get(identifier, name);\n              relationship.state.hasReceivedData = true;\n              relationship.state.isEmpty = false;\n              break;\n            case 'hasMany':\n              this.update({\n                op: 'replaceRelatedRecords',\n                field: name,\n                record: identifier,\n                value: propertyValue\n              });\n              relationship = graph.get(identifier, name);\n              relationship.state.hasReceivedData = true;\n              relationship.state.isEmpty = false;\n              break;\n            default:\n              // reflect back (pass-thru) unknown properties\n              createOptions[name] = propertyValue;\n          }\n        }\n      }\n      return createOptions;\n    }\n    willCommit(identifier) {\n      const cached = this.__peek(identifier);\n      cached.inflightAttrs = cached.localAttrs;\n      cached.localAttrs = null;\n    }\n    didCommit(identifier, data) {\n      const cached = this.__peek(identifier);\n      if (cached.isDeleted) {\n        graphFor(this.__storeWrapper).push({\n          op: 'deleteRecord',\n          record: identifier,\n          isNew: false\n        });\n        cached.isDeletionCommitted = true;\n      }\n      cached.isNew = false;\n      let newCanonicalAttributes;\n      if (data) {\n        if (data.id) {\n          // didCommit provided an ID, notify the store of it\n          this.__storeWrapper.setRecordId(identifier, data.id);\n        }\n        if (data.relationships) {\n          setupRelationships(this.__storeWrapper, identifier, data);\n        }\n        newCanonicalAttributes = data.attributes;\n      }\n      let changedKeys = calculateChangedKeys(cached, newCanonicalAttributes);\n      cached.remoteAttrs = Object.assign(cached.remoteAttrs || Object.create(null), cached.inflightAttrs, newCanonicalAttributes);\n      cached.inflightAttrs = null;\n      patchLocalAttributes(cached);\n      if (cached.errors) {\n        cached.errors = null;\n        this.__storeWrapper.notifyChange(identifier, 'errors');\n      }\n      notifyAttributes(this.__storeWrapper, identifier, changedKeys);\n      this.__storeWrapper.notifyChange(identifier, 'state');\n    }\n    commitWasRejected(identifier, errors) {\n      const cached = this.__peek(identifier);\n      if (cached.inflightAttrs) {\n        let keys = Object.keys(cached.inflightAttrs);\n        if (keys.length > 0) {\n          let attrs = cached.localAttrs = cached.localAttrs || Object.create(null);\n          for (let i = 0; i < keys.length; i++) {\n            if (attrs[keys[i]] === undefined) {\n              attrs[keys[i]] = cached.inflightAttrs[keys[i]];\n            }\n          }\n        }\n        cached.inflightAttrs = null;\n      }\n      if (errors) {\n        cached.errors = errors;\n      }\n      this.__storeWrapper.notifyChange(identifier, 'errors');\n    }\n    unloadRecord(identifier) {\n      const cached = this.__peek(identifier);\n      const storeWrapper = this.__storeWrapper;\n      peekGraph(storeWrapper)?.unload(identifier);\n\n      // effectively clearing these is ensuring that\n      // we report as `isEmpty` during teardown.\n      cached.localAttrs = null;\n      cached.remoteAttrs = null;\n      cached.inflightAttrs = null;\n      let relatedIdentifiers = _allRelatedRecordDatas(storeWrapper, identifier);\n      if (areAllModelsUnloaded(storeWrapper, relatedIdentifiers)) {\n        for (let i = 0; i < relatedIdentifiers.length; ++i) {\n          let identifier = relatedIdentifiers[i];\n          storeWrapper.disconnectRecord(identifier);\n        }\n      }\n      this.__cache.delete(identifier);\n      this.__destroyedCache.set(identifier, cached);\n\n      /*\n       * The destroy cache is a hack to prevent applications\n       * from blowing up during teardown. Accessing state\n       * on a destroyed record is not safe, but historically\n       * was possible due to a combination of teardown timing\n       * and retention of a RecordData instance directly on the\n       * record itself.\n       *\n       * Once we have deprecated accessing state on a destroyed\n       * instance we may remove this. The timing isn't a huge deal\n       * as momentarily retaining the objects outside the bounds\n       * of a test won't cause issues.\n       */\n      if (this.__destroyedCache.size === 1) {\n        runloop.schedule('destroy', () => {\n          setTimeout(() => {\n            this.__destroyedCache.clear();\n          }, 100);\n        });\n      }\n    }\n    getAttr(identifier, attr) {\n      const cached = this.__peek(identifier, true);\n      if (cached.localAttrs && attr in cached.localAttrs) {\n        return cached.localAttrs[attr];\n      } else if (cached.inflightAttrs && attr in cached.inflightAttrs) {\n        return cached.inflightAttrs[attr];\n      } else if (cached.remoteAttrs && attr in cached.remoteAttrs) {\n        return cached.remoteAttrs[attr];\n      } else {\n        const attrSchema = this.__storeWrapper.getSchemaDefinitionService().attributesDefinitionFor(identifier)[attr];\n        return getDefaultValue(attrSchema?.options);\n      }\n    }\n    setAttr(identifier, attr, value) {\n      const cached = this.__peek(identifier);\n      const existing = cached.inflightAttrs && attr in cached.inflightAttrs ? cached.inflightAttrs[attr] : cached.remoteAttrs && attr in cached.remoteAttrs ? cached.remoteAttrs[attr] : undefined;\n      if (existing !== value) {\n        cached.localAttrs = cached.localAttrs || Object.create(null);\n        cached.localAttrs[attr] = value;\n        cached.changes = cached.changes || Object.create(null);\n        cached.changes[attr] = [existing, value];\n      } else if (cached.localAttrs) {\n        delete cached.localAttrs[attr];\n        delete cached.changes[attr];\n      }\n      this.__storeWrapper.notifyChange(identifier, 'attributes', attr);\n    }\n    changedAttrs(identifier) {\n      // TODO freeze in dev\n      return this.__peek(identifier).changes || Object.create(null);\n    }\n    hasChangedAttrs(identifier) {\n      const cached = this.__peek(identifier, true);\n      return cached.localAttrs !== null && Object.keys(cached.localAttrs).length > 0;\n    }\n    rollbackAttrs(identifier) {\n      const cached = this.__peek(identifier);\n      let dirtyKeys;\n      cached.isDeleted = false;\n      if (cached.localAttrs !== null) {\n        dirtyKeys = Object.keys(cached.localAttrs);\n        cached.localAttrs = null;\n        cached.changes = null;\n      }\n      if (cached.isNew) {\n        graphFor(this.__storeWrapper).push({\n          op: 'deleteRecord',\n          record: identifier,\n          isNew: true\n        });\n        cached.isDeleted = true;\n        cached.isNew = false;\n      }\n      cached.inflightAttrs = null;\n      if (cached.errors) {\n        cached.errors = null;\n        this.__storeWrapper.notifyChange(identifier, 'errors');\n      }\n      this.__storeWrapper.notifyChange(identifier, 'state');\n      if (dirtyKeys && dirtyKeys.length) {\n        notifyAttributes(this.__storeWrapper, identifier, dirtyKeys);\n      }\n      return dirtyKeys || [];\n    }\n    getRelationship(identifier, field) {\n      return graphFor(this.__storeWrapper).get(identifier, field).getData();\n    }\n    setIsDeleted(identifier, isDeleted) {\n      const cached = this.__peek(identifier);\n      cached.isDeleted = isDeleted;\n      if (cached.isNew) {\n        // TODO can we delete this since we will do this in unload?\n        graphFor(this.__storeWrapper).push({\n          op: 'deleteRecord',\n          record: identifier,\n          isNew: true\n        });\n      }\n      this.__storeWrapper.notifyChange(identifier, 'state');\n    }\n    getErrors(identifier) {\n      return this.__peek(identifier, true).errors || [];\n    }\n    isEmpty(identifier) {\n      const cached = this.__peek(identifier, true);\n      return cached.remoteAttrs === null && cached.inflightAttrs === null && cached.localAttrs === null;\n    }\n    isNew(identifier) {\n      return this.__peek(identifier, true).isNew;\n    }\n    isDeleted(identifier) {\n      return this.__peek(identifier, true).isDeleted;\n    }\n    isDeletionCommitted(identifier) {\n      return this.__peek(identifier, true).isDeletionCommitted;\n    }\n  }\n  function areAllModelsUnloaded(wrapper, identifiers) {\n    for (let i = 0; i < identifiers.length; ++i) {\n      let identifier = identifiers[i];\n      if (wrapper.hasRecord(identifier)) {\n        return false;\n      }\n    }\n    return true;\n  }\n  function getLocalState(rel) {\n    if (rel.definition.kind === 'belongsTo') {\n      return rel.localState ? [rel.localState] : [];\n    }\n    return rel.localState;\n  }\n  function getRemoteState(rel) {\n    if (rel.definition.kind === 'belongsTo') {\n      return rel.remoteState ? [rel.remoteState] : [];\n    }\n    return rel.remoteState;\n  }\n  function getDefaultValue(options) {\n    if (!options) {\n      return;\n    }\n    if (typeof options.defaultValue === 'function') {\n      // If anyone opens an issue for args not working right, we'll restore + deprecate it via a Proxy\n      // that lazily instantiates the record. We don't want to provide any args here\n      // because in a non @ember-data/model world they don't make sense.\n      return options.defaultValue();\n    } else {\n      let defaultValue = options.defaultValue;\n      (!(typeof defaultValue !== 'object' || defaultValue === null) && debug.assert(`Non primitive defaultValues are not supported because they are shared between all instances. If you would like to use a complex object as a default value please provide a function that returns the complex object.`, typeof defaultValue !== 'object' || defaultValue === null));\n      return defaultValue;\n    }\n  }\n  function notifyAttributes(storeWrapper, identifier, keys) {\n    if (!keys) {\n      storeWrapper.notifyChange(identifier, 'attributes');\n      return;\n    }\n    for (let i = 0; i < keys.length; i++) {\n      storeWrapper.notifyChange(identifier, 'attributes', keys[i]);\n    }\n  }\n\n  /*\n        TODO @deprecate IGOR DAVID\n        There seems to be a potential bug here, where we will return keys that are not\n        in the schema\n    */\n  function calculateChangedKeys(cached, updates) {\n    let changedKeys = [];\n    if (updates) {\n      const keys = Object.keys(updates);\n      const length = keys.length;\n      const localAttrs = cached.localAttrs;\n      const original = Object.assign(Object.create(null), cached.remoteAttrs, cached.inflightAttrs);\n      for (let i = 0; i < length; i++) {\n        let key = keys[i];\n        let value = updates[key];\n\n        // A value in localAttrs means the user has a local change to\n        // this attribute. We never override this value when merging\n        // updates from the backend so we should not sent a change\n        // notification if the server value differs from the original.\n        if (localAttrs && localAttrs[key] !== undefined) {\n          continue;\n        }\n        if (!utils.isEqual(original[key], value)) {\n          changedKeys.push(key);\n        }\n      }\n    }\n    return changedKeys;\n  }\n  function setupRelationships(storeWrapper, identifier, data) {\n    // TODO @runspired iterating by definitions instead of by payload keys\n    // allows relationship payloads to be ignored silently if no relationship\n    // definition exists. Ensure there's a test for this and then consider\n    // moving this to an assertion. This check should possibly live in the graph.\n    const relationships = storeWrapper.getSchemaDefinitionService().relationshipsDefinitionFor(identifier);\n    const keys = Object.keys(relationships);\n    for (let i = 0; i < keys.length; i++) {\n      const relationshipName = keys[i];\n      const relationshipData = data.relationships[relationshipName];\n      if (!relationshipData) {\n        continue;\n      }\n      graphFor(storeWrapper).push({\n        op: 'updateRelationship',\n        record: identifier,\n        field: relationshipName,\n        value: relationshipData\n      });\n    }\n  }\n  function patchLocalAttributes(cached) {\n    const {\n      localAttrs,\n      remoteAttrs,\n      inflightAttrs,\n      changes\n    } = cached;\n    if (!localAttrs) {\n      return false;\n    }\n    let hasAppliedPatch = false;\n    let mutatedKeys = Object.keys(localAttrs);\n    for (let i = 0, length = mutatedKeys.length; i < length; i++) {\n      let attr = mutatedKeys[i];\n      const existing = inflightAttrs && attr in inflightAttrs ? inflightAttrs[attr] : remoteAttrs && attr in remoteAttrs ? remoteAttrs[attr] : undefined;\n      if (existing === localAttrs[attr]) {\n        hasAppliedPatch = true;\n        delete localAttrs[attr];\n        delete changes[attr];\n      }\n    }\n    return hasAppliedPatch;\n  }\n\n  /*\n      Iterates over the set of internal models reachable from `this` across exactly one\n      relationship.\n    */\n  function _directlyRelatedRecordDatasIterable(storeWrapper, originating) {\n    const graph = peekGraph(storeWrapper);\n    const initializedRelationships = graph?.identifiers.get(originating);\n    if (!initializedRelationships) {\n      return EMPTY_ITERATOR;\n    }\n    const initializedRelationshipsArr = [];\n    Object.keys(initializedRelationships).forEach(key => {\n      const rel = initializedRelationships[key];\n      if (rel && !isImplicit(rel)) {\n        initializedRelationshipsArr.push(rel);\n      }\n    });\n    let i = 0;\n    let j = 0;\n    let k = 0;\n    const findNext = () => {\n      while (i < initializedRelationshipsArr.length) {\n        while (j < 2) {\n          let relatedIdentifiers = j === 0 ? getLocalState(initializedRelationshipsArr[i]) : getRemoteState(initializedRelationshipsArr[i]);\n          while (k < relatedIdentifiers.length) {\n            let relatedIdentifier = relatedIdentifiers[k++];\n            if (relatedIdentifier !== null) {\n              return relatedIdentifier;\n            }\n          }\n          k = 0;\n          j++;\n        }\n        j = 0;\n        i++;\n      }\n      return undefined;\n    };\n    return {\n      iterator() {\n        return {\n          next: () => {\n            const value = findNext();\n            return {\n              value,\n              done: value === undefined\n            };\n          }\n        };\n      }\n    };\n  }\n\n  /*\n        Computes the set of Identifiers reachable from this Identifier.\n\n        Reachability is determined over the relationship graph (ie a graph where\n        nodes are identifiers and edges are belongs to or has many\n        relationships).\n\n        Returns an array including `this` and all identifiers reachable\n        from `this.identifier`.\n      */\n  function _allRelatedRecordDatas(storeWrapper, originating) {\n    let array = [];\n    let queue = [];\n    let seen = new Set();\n    queue.push(originating);\n    while (queue.length > 0) {\n      let identifier = queue.shift();\n      array.push(identifier);\n      seen.add(identifier);\n      const iterator = _directlyRelatedRecordDatasIterable(storeWrapper, originating).iterator();\n      for (let obj = iterator.next(); !obj.done; obj = iterator.next()) {\n        const identifier = obj.value;\n        if (identifier && !seen.has(identifier)) {\n          seen.add(identifier);\n          queue.push(identifier);\n        }\n      }\n    }\n    return array;\n  }\n\n  exports.RecordData = SingletonRecordData;\n  exports.graphFor = graphFor;\n  exports.peekGraph = peekGraph;\n\n  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });\n\n}));\n","define('@ember-data/serializer/-private', ['exports', '@ember/array', '@ember/debug', '@ember/object/mixin', '@ember/string', '@ember/utils', '@ember/object'], (function (exports, array, debug, Mixin, string, utils, EmberObject) { 'use strict';\n\n  const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e };\n\n  const Mixin__default = /*#__PURE__*/_interopDefaultLegacy(Mixin);\n  const EmberObject__default = /*#__PURE__*/_interopDefaultLegacy(EmberObject);\n\n  /**\n    @module @ember-data/serializer/rest\n  */\n\n  /**\n    ## Using Embedded Records\n\n    `EmbeddedRecordsMixin` supports serializing embedded records.\n\n    To set up embedded records, include the mixin when extending a serializer,\n    then define and configure embedded (model) relationships.\n\n    Note that embedded records will serialize with the serializer for their model instead of the serializer in which they are defined.\n\n    Note also that this mixin does not work with JSONAPISerializer because the JSON:API specification does not describe how to format embedded resources.\n\n    Below is an example of a per-type serializer (`post` type).\n\n    ```app/serializers/post.js\n    import RESTSerializer, { EmbeddedRecordsMixin } from '@ember-data/serializer/rest';\n\n    export default class PostSerializer extends RESTSerializer.extend(EmbeddedRecordsMixin) {\n      attrs = {\n        author: { embedded: 'always' },\n        comments: { serialize: 'ids' }\n      }\n    }\n    ```\n    Note that this use of `{ embedded: 'always' }` is unrelated to\n    the `{ embedded: 'always' }` that is defined as an option on `attr` as part of\n    defining a model while working with the `ActiveModelSerializer`.  Nevertheless,\n    using `{ embedded: 'always' }` as an option to `attr` is not a valid way to set up\n    embedded records.\n\n    The `attrs` option for a resource `{ embedded: 'always' }` is shorthand for:\n\n    ```js\n    {\n      serialize: 'records',\n      deserialize: 'records'\n    }\n    ```\n\n    ### Configuring Attrs\n\n    A resource's `attrs` option may be set to use `ids`, `records` or false for the\n    `serialize`  and `deserialize` settings.\n\n    The `attrs` property can be set on the `ApplicationSerializer` or a per-type\n    serializer.\n\n    In the case where embedded JSON is expected while extracting a payload (reading)\n    the setting is `deserialize: 'records'`, there is no need to use `ids` when\n    extracting as that is the default behaviour without this mixin if you are using\n    the vanilla `EmbeddedRecordsMixin`. Likewise, to embed JSON in the payload while\n    serializing `serialize: 'records'` is the setting to use. There is an option of\n    not embedding JSON in the serialized payload by using `serialize: 'ids'`. If you\n    do not want the relationship sent at all, you can use `serialize: false`.\n\n\n    ### EmbeddedRecordsMixin defaults\n    If you do not overwrite `attrs` for a specific relationship, the `EmbeddedRecordsMixin`\n    will behave in the following way:\n\n    BelongsTo: `{ serialize: 'id', deserialize: 'id' }`\n    HasMany:   `{ serialize: false, deserialize: 'ids' }`\n\n    ### Model Relationships\n\n    Embedded records must have a model defined to be extracted and serialized. Note that\n    when defining any relationships on your model such as `belongsTo` and `hasMany`, you\n    should not both specify `async: true` and also indicate through the serializer's\n    `attrs` attribute that the related model should be embedded for deserialization.\n    If a model is declared embedded for deserialization (`embedded: 'always'` or `deserialize: 'records'`),\n    then do not use `async: true`.\n\n    To successfully extract and serialize embedded records the model relationships\n    must be set up correctly. See the\n    [defining relationships](https://guides.emberjs.com/current/models/relationships)\n    section of the **Defining Models** guide page.\n\n    Records without an `id` property are not considered embedded records, model\n    instances must have an `id` property to be used with Ember Data.\n\n    ### Example JSON payloads, Models and Serializers\n\n    **When customizing a serializer it is important to grok what the customizations\n    are. Please read the docs for the methods this mixin provides, in case you need\n    to modify it to fit your specific needs.**\n\n    For example, review the docs for each method of this mixin:\n    * [normalize](/ember-data/release/classes/EmbeddedRecordsMixin/methods/normalize?anchor=normalize)\n    * [serializeBelongsTo](/ember-data/release/classes/EmbeddedRecordsMixin/methods/serializeBelongsTo?anchor=serializeBelongsTo)\n    * [serializeHasMany](/ember-data/release/classes/EmbeddedRecordsMixin/methods/serializeHasMany?anchor=serializeHasMany)\n\n    @class EmbeddedRecordsMixin\n    @public\n  */\n  const embeddedRecordsMixin = Mixin__default.default.create({\n    /**\n      Normalize the record and recursively normalize/extract all the embedded records\n      while pushing them into the store as they are encountered\n       A payload with an attr configured for embedded records needs to be extracted:\n       ```js\n      {\n        \"post\": {\n          \"id\": \"1\"\n          \"title\": \"Rails is omakase\",\n          \"comments\": [{\n            \"id\": \"1\",\n            \"body\": \"Rails is unagi\"\n          }, {\n            \"id\": \"2\",\n            \"body\": \"Omakase O_o\"\n          }]\n        }\n      }\n      ```\n     @method normalize\n      @public\n     @param {Model} typeClass\n     @param {Object} hash to be normalized\n     @param {String} prop the hash has been referenced by\n     @return {Object} the normalized hash\n    **/\n    normalize(typeClass, hash, prop) {\n      let normalizedHash = this._super(typeClass, hash, prop);\n      return this._extractEmbeddedRecords(this, this.store, typeClass, normalizedHash);\n    },\n    keyForRelationship(key, typeClass, method) {\n      if (method === 'serialize' && this.hasSerializeRecordsOption(key) || method === 'deserialize' && this.hasDeserializeRecordsOption(key)) {\n        return this.keyForAttribute(key, method);\n      } else {\n        return this._super(key, typeClass, method) || key;\n      }\n    },\n    /**\n      Serialize `belongsTo` relationship when it is configured as an embedded object.\n       This example of an author model belongs to a post model:\n       ```js\n      import Model, { attr, belongsTo } from '@ember-data/model';\n       Post = Model.extend({\n        title:    attr('string'),\n        body:     attr('string'),\n        author:   belongsTo('author')\n      });\n       Author = Model.extend({\n        name:     attr('string'),\n        post:     belongsTo('post')\n      });\n      ```\n       Use a custom (type) serializer for the post model to configure embedded author\n       ```app/serializers/post.js\n      import RESTSerializer, { EmbeddedRecordsMixin } from '@ember-data/serializer/rest';\n       export default class PostSerializer extends RESTSerializer.extend(EmbeddedRecordsMixin) {\n        attrs = {\n          author: { embedded: 'always' }\n        }\n      }\n      ```\n       A payload with an attribute configured for embedded records can serialize\n      the records together under the root attribute's payload:\n       ```js\n      {\n        \"post\": {\n          \"id\": \"1\"\n          \"title\": \"Rails is omakase\",\n          \"author\": {\n            \"id\": \"2\"\n            \"name\": \"dhh\"\n          }\n        }\n      }\n      ```\n       @method serializeBelongsTo\n      @public\n      @param {Snapshot} snapshot\n      @param {Object} json\n      @param {Object} relationship\n    */\n    serializeBelongsTo(snapshot, json, relationship) {\n      let attr = relationship.key;\n      if (this.noSerializeOptionSpecified(attr)) {\n        this._super(snapshot, json, relationship);\n        return;\n      }\n      let includeIds = this.hasSerializeIdsOption(attr);\n      let includeRecords = this.hasSerializeRecordsOption(attr);\n      let embeddedSnapshot = snapshot.belongsTo(attr);\n      if (includeIds) {\n        let schema = this.store.modelFor(snapshot.modelName);\n        let serializedKey = this._getMappedKey(relationship.key, schema);\n        if (serializedKey === relationship.key && this.keyForRelationship) {\n          serializedKey = this.keyForRelationship(relationship.key, relationship.kind, 'serialize');\n        }\n        if (!embeddedSnapshot) {\n          json[serializedKey] = null;\n        } else {\n          json[serializedKey] = embeddedSnapshot.id;\n          if (relationship.options.polymorphic) {\n            this.serializePolymorphicType(snapshot, json, relationship);\n          }\n        }\n      } else if (includeRecords) {\n        this._serializeEmbeddedBelongsTo(snapshot, json, relationship);\n      }\n    },\n    _serializeEmbeddedBelongsTo(snapshot, json, relationship) {\n      let embeddedSnapshot = snapshot.belongsTo(relationship.key);\n      let schema = this.store.modelFor(snapshot.modelName);\n      let serializedKey = this._getMappedKey(relationship.key, schema);\n      if (serializedKey === relationship.key && this.keyForRelationship) {\n        serializedKey = this.keyForRelationship(relationship.key, relationship.kind, 'serialize');\n      }\n      if (!embeddedSnapshot) {\n        json[serializedKey] = null;\n      } else {\n        json[serializedKey] = embeddedSnapshot.serialize({\n          includeId: true\n        });\n        this.removeEmbeddedForeignKey(snapshot, embeddedSnapshot, relationship, json[serializedKey]);\n        if (relationship.options.polymorphic) {\n          this.serializePolymorphicType(snapshot, json, relationship);\n        }\n      }\n    },\n    /**\n      Serializes `hasMany` relationships when it is configured as embedded objects.\n       This example of a post model has many comments:\n       ```js\n      import Model, { attr, belongsTo, hasMany } from '@ember-data/model';\n       Post = Model.extend({\n        title:    attr('string'),\n        body:     attr('string'),\n        comments: hasMany('comment')\n      });\n       Comment = Model.extend({\n        body:     attr('string'),\n        post:     belongsTo('post')\n      });\n      ```\n       Use a custom (type) serializer for the post model to configure embedded comments\n       ```app/serializers/post.js\n      import RESTSerializer, { EmbeddedRecordsMixin } from '@ember-data/serializer/rest';\n       export default class PostSerializer extends RESTSerializer.extend(EmbeddedRecordsMixin) {\n        attrs = {\n          comments: { embedded: 'always' }\n        }\n      }\n      ```\n       A payload with an attribute configured for embedded records can serialize\n      the records together under the root attribute's payload:\n       ```js\n      {\n        \"post\": {\n          \"id\": \"1\"\n          \"title\": \"Rails is omakase\",\n          \"body\": \"I want this for my ORM, I want that for my template language...\"\n          \"comments\": [{\n            \"id\": \"1\",\n            \"body\": \"Rails is unagi\"\n          }, {\n            \"id\": \"2\",\n            \"body\": \"Omakase O_o\"\n          }]\n        }\n      }\n      ```\n       The attrs options object can use more specific instruction for extracting and\n      serializing. When serializing, an option to embed `ids`, `ids-and-types` or `records` can be set.\n      When extracting the only option is `records`.\n       So `{ embedded: 'always' }` is shorthand for:\n      `{ serialize: 'records', deserialize: 'records' }`\n       To embed the `ids` for a related object (using a hasMany relationship):\n       ```app/serializers/post.js\n      import RESTSerializer, { EmbeddedRecordsMixin } from '@ember-data/serializer/rest';\n       export default class PostSerializer extends RESTSerializer.extend(EmbeddedRecordsMixin) {\n        attrs = {\n          comments: { serialize: 'ids', deserialize: 'records' }\n        }\n      }\n      ```\n       ```js\n      {\n        \"post\": {\n          \"id\": \"1\"\n          \"title\": \"Rails is omakase\",\n          \"body\": \"I want this for my ORM, I want that for my template language...\"\n          \"comments\": [\"1\", \"2\"]\n        }\n      }\n      ```\n       To embed the relationship as a collection of objects with `id` and `type` keys, set\n      `ids-and-types` for the related object.\n       This is particularly useful for polymorphic relationships where records don't share\n      the same table and the `id` is not enough information.\n       For example having a user that has many pets:\n       ```js\n      User = Model.extend({\n        name: attr('string'),\n        pets: hasMany('pet', { polymorphic: true })\n      });\n       Pet = Model.extend({\n        name: attr('string'),\n      });\n       Cat = Pet.extend({\n        // ...\n      });\n       Parrot = Pet.extend({\n        // ...\n      });\n      ```\n       ```app/serializers/user.js\n      import RESTSerializer, { EmbeddedRecordsMixin } from '@ember-data/serializer/rest';\n       export default class UserSerializer extends RESTSerializer.extend(EmbeddedRecordsMixin) {\n        attrs = {\n          pets: { serialize: 'ids-and-types', deserialize: 'records' }\n        }\n      }\n      ```\n       ```js\n      {\n        \"user\": {\n          \"id\": \"1\"\n          \"name\": \"Bertin Osborne\",\n          \"pets\": [\n            { \"id\": \"1\", \"type\": \"Cat\" },\n            { \"id\": \"1\", \"type\": \"Parrot\"}\n          ]\n        }\n      }\n      ```\n       @method serializeHasMany\n      @public\n      @param {Snapshot} snapshot\n      @param {Object} json\n      @param {Object} relationship\n    */\n    serializeHasMany(snapshot, json, relationship) {\n      let attr = relationship.key;\n      if (this.noSerializeOptionSpecified(attr)) {\n        this._super(snapshot, json, relationship);\n        return;\n      }\n      if (this.hasSerializeIdsOption(attr)) {\n        let schema = this.store.modelFor(snapshot.modelName);\n        let serializedKey = this._getMappedKey(relationship.key, schema);\n        if (serializedKey === relationship.key && this.keyForRelationship) {\n          serializedKey = this.keyForRelationship(relationship.key, relationship.kind, 'serialize');\n        }\n        json[serializedKey] = snapshot.hasMany(attr, {\n          ids: true\n        });\n      } else if (this.hasSerializeRecordsOption(attr)) {\n        this._serializeEmbeddedHasMany(snapshot, json, relationship);\n      } else {\n        if (this.hasSerializeIdsAndTypesOption(attr)) {\n          this._serializeHasManyAsIdsAndTypes(snapshot, json, relationship);\n        }\n      }\n    },\n    /*\n      Serializes a hasMany relationship as an array of objects containing only `id` and `type`\n      keys.\n      This has its use case on polymorphic hasMany relationships where the server is not storing\n      all records in the same table using STI, and therefore the `id` is not enough information\n       TODO: Make the default in Ember-data 3.0??\n    */\n    _serializeHasManyAsIdsAndTypes(snapshot, json, relationship) {\n      let serializedKey = this.keyForAttribute(relationship.key, 'serialize');\n      let hasMany = snapshot.hasMany(relationship.key);\n      json[serializedKey] = array.A(hasMany).map(function (recordSnapshot) {\n        //\n        // I'm sure I'm being utterly naive here. Probably id is a configurable property and\n        // type too, and the modelName has to be normalized somehow.\n        //\n        return {\n          id: recordSnapshot.id,\n          type: recordSnapshot.modelName\n        };\n      });\n    },\n    _serializeEmbeddedHasMany(snapshot, json, relationship) {\n      let schema = this.store.modelFor(snapshot.modelName);\n      let serializedKey = this._getMappedKey(relationship.key, schema);\n      if (serializedKey === relationship.key && this.keyForRelationship) {\n        serializedKey = this.keyForRelationship(relationship.key, relationship.kind, 'serialize');\n      }\n      (debug.warn(`The embedded relationship '${serializedKey}' is undefined for '${snapshot.modelName}' with id '${snapshot.id}'. Please include it in your original payload.`, utils.typeOf(snapshot.hasMany(relationship.key)) !== 'undefined', {\n        id: 'ds.serializer.embedded-relationship-undefined'\n      }));\n      json[serializedKey] = this._generateSerializedHasMany(snapshot, relationship);\n    },\n    /*\n      Returns an array of embedded records serialized to JSON\n    */\n    _generateSerializedHasMany(snapshot, relationship) {\n      let hasMany = snapshot.hasMany(relationship.key);\n      let manyArray = array.A(hasMany);\n      let ret = new Array(manyArray.length);\n      for (let i = 0; i < manyArray.length; i++) {\n        let embeddedSnapshot = manyArray[i];\n        let embeddedJson = embeddedSnapshot.serialize({\n          includeId: true\n        });\n        this.removeEmbeddedForeignKey(snapshot, embeddedSnapshot, relationship, embeddedJson);\n        ret[i] = embeddedJson;\n      }\n      return ret;\n    },\n    /**\n      When serializing an embedded record, modify the property (in the `JSON` payload)\n      that refers to the parent record (foreign key for the relationship).\n       Serializing a `belongsTo` relationship removes the property that refers to the\n      parent record\n       Serializing a `hasMany` relationship does not remove the property that refers to\n      the parent record.\n       @method removeEmbeddedForeignKey\n      @public\n      @param {Snapshot} snapshot\n      @param {Snapshot} embeddedSnapshot\n      @param {Object} relationship\n      @param {Object} json\n    */\n    removeEmbeddedForeignKey(snapshot, embeddedSnapshot, relationship, json) {\n      if (relationship.kind === 'belongsTo') {\n        let schema = this.store.modelFor(snapshot.modelName);\n        let parentRecord = schema.inverseFor(relationship.key, this.store);\n        if (parentRecord) {\n          let name = parentRecord.name;\n          let embeddedSerializer = this.store.serializerFor(embeddedSnapshot.modelName);\n          let parentKey = embeddedSerializer.keyForRelationship(name, parentRecord.kind, 'deserialize');\n          if (parentKey) {\n            delete json[parentKey];\n          }\n        }\n      } /*else if (relationship.kind === 'hasMany') {\n        return;\n        }*/\n    },\n    // checks config for attrs option to embedded (always) - serialize and deserialize\n    hasEmbeddedAlwaysOption(attr) {\n      let option = this.attrsOption(attr);\n      return option && option.embedded === 'always';\n    },\n    // checks config for attrs option to serialize ids\n    hasSerializeRecordsOption(attr) {\n      let alwaysEmbed = this.hasEmbeddedAlwaysOption(attr);\n      let option = this.attrsOption(attr);\n      return alwaysEmbed || option && option.serialize === 'records';\n    },\n    // checks config for attrs option to serialize records\n    hasSerializeIdsOption(attr) {\n      let option = this.attrsOption(attr);\n      return option && (option.serialize === 'ids' || option.serialize === 'id');\n    },\n    // checks config for attrs option to serialize records as objects containing id and types\n    hasSerializeIdsAndTypesOption(attr) {\n      let option = this.attrsOption(attr);\n      return option && (option.serialize === 'ids-and-types' || option.serialize === 'id-and-type');\n    },\n    // checks config for attrs option to serialize records\n    noSerializeOptionSpecified(attr) {\n      let option = this.attrsOption(attr);\n      return !(option && (option.serialize || option.embedded));\n    },\n    // checks config for attrs option to deserialize records\n    // a defined option object for a resource is treated the same as\n    // `deserialize: 'records'`\n    hasDeserializeRecordsOption(attr) {\n      let alwaysEmbed = this.hasEmbeddedAlwaysOption(attr);\n      let option = this.attrsOption(attr);\n      return alwaysEmbed || option && option.deserialize === 'records';\n    },\n    attrsOption(attr) {\n      let attrs = this.attrs;\n      return attrs && (attrs[string.camelize(attr)] || attrs[attr]);\n    },\n    /**\n     @method _extractEmbeddedRecords\n     @private\n    */\n    _extractEmbeddedRecords(serializer, store, typeClass, partial) {\n      typeClass.eachRelationship((key, relationship) => {\n        if (serializer.hasDeserializeRecordsOption(key)) {\n          if (relationship.kind === 'hasMany') {\n            this._extractEmbeddedHasMany(store, key, partial, relationship);\n          }\n          if (relationship.kind === 'belongsTo') {\n            this._extractEmbeddedBelongsTo(store, key, partial, relationship);\n          }\n        }\n      });\n      return partial;\n    },\n    /**\n     @method _extractEmbeddedHasMany\n     @private\n    */\n    _extractEmbeddedHasMany(store, key, hash, relationshipMeta) {\n      let relationshipHash = hash.data?.relationships?.[key]?.data;\n      if (!relationshipHash) {\n        return;\n      }\n      let hasMany = new Array(relationshipHash.length);\n      for (let i = 0; i < relationshipHash.length; i++) {\n        let item = relationshipHash[i];\n        let {\n          data,\n          included\n        } = this._normalizeEmbeddedRelationship(store, relationshipMeta, item);\n        hash.included = hash.included || [];\n        hash.included.push(data);\n        if (included) {\n          hash.included = hash.included.concat(included);\n        }\n        hasMany[i] = {\n          id: data.id,\n          type: data.type\n        };\n      }\n      let relationship = {\n        data: hasMany\n      };\n      hash.data.relationships[key] = relationship;\n    },\n    /**\n     @method _extractEmbeddedBelongsTo\n     @private\n    */\n    _extractEmbeddedBelongsTo(store, key, hash, relationshipMeta) {\n      let relationshipHash = hash.data?.relationships?.[key]?.data;\n      if (!relationshipHash) {\n        return;\n      }\n      let {\n        data,\n        included\n      } = this._normalizeEmbeddedRelationship(store, relationshipMeta, relationshipHash);\n      hash.included = hash.included || [];\n      hash.included.push(data);\n      if (included) {\n        hash.included = hash.included.concat(included);\n      }\n      let belongsTo = {\n        id: data.id,\n        type: data.type\n      };\n      let relationship = {\n        data: belongsTo\n      };\n      hash.data.relationships[key] = relationship;\n    },\n    /**\n     @method _normalizeEmbeddedRelationship\n     @private\n    */\n    _normalizeEmbeddedRelationship(store, relationshipMeta, relationshipHash) {\n      let modelName = relationshipMeta.type;\n      if (relationshipMeta.options.polymorphic) {\n        modelName = relationshipHash.type;\n      }\n      let modelClass = store.modelFor(modelName);\n      let serializer = store.serializerFor(modelName);\n      return serializer.normalize(modelClass, relationshipHash, null);\n    },\n    isEmbeddedRecordsMixin: true\n  });\n\n  /**\n    @module @ember-data/serializer\n  */\n\n  /**\n    The `Transform` class is used to serialize and deserialize model\n    attributes when they are saved or loaded from an\n    adapter. Subclassing `Transform` is useful for creating custom\n    attributes. All subclasses of `Transform` must implement a\n    `serialize` and a `deserialize` method.\n\n    Example\n\n    ```app/transforms/temperature.js\n    import Transform from '@ember-data/serializer/transform';\n\n    // Converts centigrade in the JSON to fahrenheit in the app\n    export default class TemperatureTransform extends Transform {\n      deserialize(serialized, options) {\n        return (serialized *  1.8) + 32;\n      }\n\n      serialize(deserialized, options) {\n        return (deserialized - 32) / 1.8;\n      }\n    }\n    ```\n\n    Usage\n\n    ```app/models/requirement.js\n    import Model, { attr } from '@ember-data/model';\n\n    export default class RequirementModel extends Model {\n      @attr('string') name;\n      @attr('temperature') temperature;\n    }\n    ```\n\n    The options passed into the `attr` function when the attribute is\n    declared on the model is also available in the transform.\n\n    ```app/models/post.js\n    import Model, { attr } from '@ember-data/model';\n\n    export default class PostModel extends Model {\n      @attr('string') title;\n      @attr('markdown', {\n        markdown: {\n          gfm: false,\n          sanitize: true\n        }\n      })\n      markdown;\n    }\n    ```\n\n    ```app/transforms/markdown.js\n    import Transform from '@ember-data/serializer/transform';\n\n    export default class MarkdownTransform extends Transform {\n      serialize(deserialized, options) {\n        return deserialized.raw;\n      }\n\n      deserialize(serialized, options) {\n        let markdownOptions = options.markdown || {};\n\n        return marked(serialized, markdownOptions);\n      }\n    }\n    ```\n\n    @class Transform\n    @public\n   */\n  class Transform extends EmberObject__default.default {\n    /**\n      When given a deserialized value from a record attribute this\n      method must return the serialized value.\n       Example\n       ```javascript\n      import { isEmpty } from '@ember/utils';\n       serialize(deserialized, options) {\n        return isEmpty(deserialized) ? null : Number(deserialized);\n      }\n      ```\n       @method serialize\n      @public\n      @param deserialized The deserialized value\n      @param options hash of options passed to `attr`\n      @return The serialized value\n    */\n    /**\n      When given a serialized value from a JSON object this method must\n      return the deserialized value for the record attribute.\n       Example\n       ```javascript\n      deserialize(serialized, options) {\n        return empty(serialized) ? null : Number(serialized);\n      }\n      ```\n       @method deserialize\n      @public\n      @param serialized The serialized value\n      @param options hash of options passed to `attr`\n      @return The deserialized value\n    */\n  }\n\n  /**\n    @module @ember-data/serializer\n  */\n\n  /**\n    The `BooleanTransform` class is used to serialize and deserialize\n    boolean attributes on Ember Data record objects. This transform is\n    used when `boolean` is passed as the type parameter to the\n    [attr](/ember-data/release/functions/@ember-data%2Fmodel/attr) function.\n\n    Usage\n\n    ```app/models/user.js\n    import Model, { attr } from '@ember-data/model';\n\n    export default class UserModel extends Model {\n      @attr('boolean') isAdmin;\n      @attr('string') name;\n      @attr('string') email;\n    }\n    ```\n\n    By default, the boolean transform only allows for values of `true` or\n    `false`. You can opt into allowing `null` values for\n    boolean attributes via `attr('boolean', { allowNull: true })`\n\n    ```app/models/user.js\n    import Model, { attr } from '@ember-data/model';\n\n    export default class UserModel extends Model {\n      @attr('string') email;\n      @attr('string') username;\n      @attr('boolean', { allowNull: true }) wantsWeeklyEmail;\n    }\n    ```\n\n    @class BooleanTransform\n    @public\n    @extends Transform\n   */\n  class BooleanTransform extends Transform {\n    deserialize(serialized, options) {\n      if (utils.isNone(serialized) && options.allowNull === true) {\n        return null;\n      }\n      let type = typeof serialized;\n      if (type === 'boolean') {\n        return serialized;\n      } else if (type === 'string') {\n        return /^(true|t|1)$/i.test(serialized);\n      } else if (type === 'number') {\n        return serialized === 1;\n      } else {\n        return false;\n      }\n    }\n    serialize(deserialized, options) {\n      if (utils.isNone(deserialized) && options.allowNull === true) {\n        return null;\n      }\n      return Boolean(deserialized);\n    }\n  }\n\n  /**\n    @module @ember-data/serializer\n  */\n\n  /**\n   The `DateTransform` class is used to serialize and deserialize\n   date attributes on Ember Data record objects. This transform is used\n   when `date` is passed as the type parameter to the\n   [attr](/ember-data/release/functions/@ember-data%2Fmodel/attr) function. It uses the [`ISO 8601`](https://en.wikipedia.org/wiki/ISO_8601)\n   standard.\n\n   ```app/models/score.js\n   import Model, { attr, belongsTo } from '@ember-data/model';\n\n   export default class ScoreModel extends Model {\n      @attr('number') value;\n      @belongsTo('player') player;\n      @attr('date') date;\n    }\n   ```\n\n   @class DateTransform\n    @public\n   @extends Transform\n   */\n\n  class DateTransform extends Transform {\n    deserialize(serialized) {\n      let type = typeof serialized;\n      if (type === 'string') {\n        let offset = serialized.indexOf('+');\n        if (offset !== -1 && serialized.length - 5 === offset) {\n          offset += 3;\n          return new Date(serialized.slice(0, offset) + ':' + serialized.slice(offset));\n        }\n        return new Date(serialized);\n      } else if (type === 'number') {\n        return new Date(serialized);\n      } else if (serialized === null || serialized === undefined) {\n        // if the value is null return null\n        // if the value is not present in the data return undefined\n        return serialized;\n      } else {\n        return null;\n      }\n    }\n    serialize(date) {\n      if (date instanceof Date && !isNaN(date)) {\n        return date.toISOString();\n      } else {\n        return null;\n      }\n    }\n  }\n\n  /**\n    @module @ember-data/serializer\n  */\n\n  function isNumber(value) {\n    return value === value && value !== Infinity && value !== -Infinity;\n  }\n\n  /**\n    The `NumberTransform` class is used to serialize and deserialize\n    numeric attributes on Ember Data record objects. This transform is\n    used when `number` is passed as the type parameter to the\n    [attr](/ember-data/release/functions/@ember-data%2Fmodel/attr) function.\n\n    Usage\n\n    ```app/models/score.js\n    import Model, { attr, belongsTo } from '@ember-data/model';\n\n    export default class ScoreModel extends Model {\n      @attr('number') value;\n      @belongsTo('player') player;\n      @attr('date') date;\n    }\n    ```\n\n    @class NumberTransform\n    @public\n    @extends Transform\n   */\n  class NumberTransform extends Transform {\n    deserialize(serialized) {\n      let transformed;\n      if (serialized === '' || serialized === null || serialized === undefined) {\n        return null;\n      } else {\n        transformed = Number(serialized);\n        return isNumber(transformed) ? transformed : null;\n      }\n    }\n    serialize(deserialized) {\n      let transformed;\n      if (deserialized === '' || deserialized === null || deserialized === undefined) {\n        return null;\n      } else {\n        transformed = Number(deserialized);\n        return isNumber(transformed) ? transformed : null;\n      }\n    }\n  }\n\n  /**\n    @module @ember-data/serializer\n  */\n\n  /**\n    The `StringTransform` class is used to serialize and deserialize\n    string attributes on Ember Data record objects. This transform is\n    used when `string` is passed as the type parameter to the\n    [attr](/ember-data/release/functions/@ember-data%2Fmodel/attr) function.\n\n    Usage\n\n    ```app/models/user.js\n    import Model, { attr, belongsTo } from '@ember-data/model';\n\n    export default class UserModel extends Model {\n      @attr('boolean') isAdmin;\n      @attr('string') name;\n      @attr('string') email;\n    }\n    ```\n\n    @class StringTransform\n    @public\n    @extends Transform\n   */\n  class StringTransform extends Transform {\n    deserialize(serialized) {\n      return utils.isNone(serialized) ? null : String(serialized);\n    }\n    serialize(deserialized) {\n      return utils.isNone(deserialized) ? null : String(deserialized);\n    }\n  }\n\n  exports.BooleanTransform = BooleanTransform;\n  exports.DateTransform = DateTransform;\n  exports.EmbeddedRecordsMixin = embeddedRecordsMixin;\n  exports.NumberTransform = NumberTransform;\n  exports.StringTransform = StringTransform;\n  exports.Transform = Transform;\n\n  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });\n\n}));\n","define(\"@ember-data/serializer/embedded-records-mixin-d75385ff\", [\"exports\", \"@ember/array\", \"@ember/debug\", \"@ember/object/mixin\", \"@ember/string\"], function (_exports, _array, _debug, _mixin, _string) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.e = void 0;\n  /**\n    @module @ember-data/serializer/rest\n  */\n\n  /**\n    ## Using Embedded Records\n  \n    `EmbeddedRecordsMixin` supports serializing embedded records.\n  \n    To set up embedded records, include the mixin when extending a serializer,\n    then define and configure embedded (model) relationships.\n  \n    Note that embedded records will serialize with the serializer for their model instead of the serializer in which they are defined.\n  \n    Note also that this mixin does not work with JSONAPISerializer because the JSON:API specification does not describe how to format embedded resources.\n  \n    Below is an example of a per-type serializer (`post` type).\n  \n    ```app/serializers/post.js\n    import RESTSerializer, { EmbeddedRecordsMixin } from '@ember-data/serializer/rest';\n  \n    export default class PostSerializer extends RESTSerializer.extend(EmbeddedRecordsMixin) {\n      attrs = {\n        author: { embedded: 'always' },\n        comments: { serialize: 'ids' }\n      }\n    }\n    ```\n    Note that this use of `{ embedded: 'always' }` is unrelated to\n    the `{ embedded: 'always' }` that is defined as an option on `attr` as part of\n    defining a model while working with the `ActiveModelSerializer`.  Nevertheless,\n    using `{ embedded: 'always' }` as an option to `attr` is not a valid way to set up\n    embedded records.\n  \n    The `attrs` option for a resource `{ embedded: 'always' }` is shorthand for:\n  \n    ```js\n    {\n      serialize: 'records',\n      deserialize: 'records'\n    }\n    ```\n  \n    ### Configuring Attrs\n  \n    A resource's `attrs` option may be set to use `ids`, `records` or false for the\n    `serialize`  and `deserialize` settings.\n  \n    The `attrs` property can be set on the `ApplicationSerializer` or a per-type\n    serializer.\n  \n    In the case where embedded JSON is expected while extracting a payload (reading)\n    the setting is `deserialize: 'records'`, there is no need to use `ids` when\n    extracting as that is the default behaviour without this mixin if you are using\n    the vanilla `EmbeddedRecordsMixin`. Likewise, to embed JSON in the payload while\n    serializing `serialize: 'records'` is the setting to use. There is an option of\n    not embedding JSON in the serialized payload by using `serialize: 'ids'`. If you\n    do not want the relationship sent at all, you can use `serialize: false`.\n  \n  \n    ### EmbeddedRecordsMixin defaults\n    If you do not overwrite `attrs` for a specific relationship, the `EmbeddedRecordsMixin`\n    will behave in the following way:\n  \n    BelongsTo: `{ serialize: 'id', deserialize: 'id' }`\n    HasMany:   `{ serialize: false, deserialize: 'ids' }`\n  \n    ### Model Relationships\n  \n    Embedded records must have a model defined to be extracted and serialized. Note that\n    when defining any relationships on your model such as `belongsTo` and `hasMany`, you\n    should not both specify `async: true` and also indicate through the serializer's\n    `attrs` attribute that the related model should be embedded for deserialization.\n    If a model is declared embedded for deserialization (`embedded: 'always'` or `deserialize: 'records'`),\n    then do not use `async: true`.\n  \n    To successfully extract and serialize embedded records the model relationships\n    must be set up correctly. See the\n    [defining relationships](https://guides.emberjs.com/current/models/relationships)\n    section of the **Defining Models** guide page.\n  \n    Records without an `id` property are not considered embedded records, model\n    instances must have an `id` property to be used with Ember Data.\n  \n    ### Example JSON payloads, Models and Serializers\n  \n    **When customizing a serializer it is important to grok what the customizations\n    are. Please read the docs for the methods this mixin provides, in case you need\n    to modify it to fit your specific needs.**\n  \n    For example, review the docs for each method of this mixin:\n    * [normalize](/ember-data/release/classes/EmbeddedRecordsMixin/methods/normalize?anchor=normalize)\n    * [serializeBelongsTo](/ember-data/release/classes/EmbeddedRecordsMixin/methods/serializeBelongsTo?anchor=serializeBelongsTo)\n    * [serializeHasMany](/ember-data/release/classes/EmbeddedRecordsMixin/methods/serializeHasMany?anchor=serializeHasMany)\n  \n    @class EmbeddedRecordsMixin\n    @public\n  */\n  var embeddedRecordsMixin = _mixin.default.create({\n    /**\n      Normalize the record and recursively normalize/extract all the embedded records\n      while pushing them into the store as they are encountered\n       A payload with an attr configured for embedded records needs to be extracted:\n       ```js\n      {\n        \"post\": {\n          \"id\": \"1\"\n          \"title\": \"Rails is omakase\",\n          \"comments\": [{\n            \"id\": \"1\",\n            \"body\": \"Rails is unagi\"\n          }, {\n            \"id\": \"2\",\n            \"body\": \"Omakase O_o\"\n          }]\n        }\n      }\n      ```\n     @method normalize\n      @public\n     @param {Model} typeClass\n     @param {Object} hash to be normalized\n     @param {String} prop the hash has been referenced by\n     @return {Object} the normalized hash\n    **/\n    normalize(typeClass, hash, prop) {\n      let normalizedHash = this._super(typeClass, hash, prop);\n      return this._extractEmbeddedRecords(this, this.store, typeClass, normalizedHash);\n    },\n    keyForRelationship(key, typeClass, method) {\n      if (method === 'serialize' && this.hasSerializeRecordsOption(key) || method === 'deserialize' && this.hasDeserializeRecordsOption(key)) {\n        return this.keyForAttribute(key, method);\n      } else {\n        return this._super(key, typeClass, method) || key;\n      }\n    },\n    /**\n      Serialize `belongsTo` relationship when it is configured as an embedded object.\n       This example of an author model belongs to a post model:\n       ```js\n      import Model, { attr, belongsTo } from '@ember-data/model';\n       Post = Model.extend({\n        title:    attr('string'),\n        body:     attr('string'),\n        author:   belongsTo('author')\n      });\n       Author = Model.extend({\n        name:     attr('string'),\n        post:     belongsTo('post')\n      });\n      ```\n       Use a custom (type) serializer for the post model to configure embedded author\n       ```app/serializers/post.js\n      import RESTSerializer, { EmbeddedRecordsMixin } from '@ember-data/serializer/rest';\n       export default class PostSerializer extends RESTSerializer.extend(EmbeddedRecordsMixin) {\n        attrs = {\n          author: { embedded: 'always' }\n        }\n      }\n      ```\n       A payload with an attribute configured for embedded records can serialize\n      the records together under the root attribute's payload:\n       ```js\n      {\n        \"post\": {\n          \"id\": \"1\"\n          \"title\": \"Rails is omakase\",\n          \"author\": {\n            \"id\": \"2\"\n            \"name\": \"dhh\"\n          }\n        }\n      }\n      ```\n       @method serializeBelongsTo\n      @public\n      @param {Snapshot} snapshot\n      @param {Object} json\n      @param {Object} relationship\n    */\n    serializeBelongsTo(snapshot, json, relationship) {\n      let attr = relationship.key;\n      if (this.noSerializeOptionSpecified(attr)) {\n        this._super(snapshot, json, relationship);\n        return;\n      }\n      let includeIds = this.hasSerializeIdsOption(attr);\n      let includeRecords = this.hasSerializeRecordsOption(attr);\n      let embeddedSnapshot = snapshot.belongsTo(attr);\n      if (includeIds) {\n        let schema = this.store.modelFor(snapshot.modelName);\n        let serializedKey = this._getMappedKey(relationship.key, schema);\n        if (serializedKey === relationship.key && this.keyForRelationship) {\n          serializedKey = this.keyForRelationship(relationship.key, relationship.kind, 'serialize');\n        }\n        if (!embeddedSnapshot) {\n          json[serializedKey] = null;\n        } else {\n          json[serializedKey] = embeddedSnapshot.id;\n          if (relationship.options.polymorphic) {\n            this.serializePolymorphicType(snapshot, json, relationship);\n          }\n        }\n      } else if (includeRecords) {\n        this._serializeEmbeddedBelongsTo(snapshot, json, relationship);\n      }\n    },\n    _serializeEmbeddedBelongsTo(snapshot, json, relationship) {\n      let embeddedSnapshot = snapshot.belongsTo(relationship.key);\n      let schema = this.store.modelFor(snapshot.modelName);\n      let serializedKey = this._getMappedKey(relationship.key, schema);\n      if (serializedKey === relationship.key && this.keyForRelationship) {\n        serializedKey = this.keyForRelationship(relationship.key, relationship.kind, 'serialize');\n      }\n      if (!embeddedSnapshot) {\n        json[serializedKey] = null;\n      } else {\n        json[serializedKey] = embeddedSnapshot.serialize({\n          includeId: true\n        });\n        this.removeEmbeddedForeignKey(snapshot, embeddedSnapshot, relationship, json[serializedKey]);\n        if (relationship.options.polymorphic) {\n          this.serializePolymorphicType(snapshot, json, relationship);\n        }\n      }\n    },\n    /**\n      Serializes `hasMany` relationships when it is configured as embedded objects.\n       This example of a post model has many comments:\n       ```js\n      import Model, { attr, belongsTo, hasMany } from '@ember-data/model';\n       Post = Model.extend({\n        title:    attr('string'),\n        body:     attr('string'),\n        comments: hasMany('comment')\n      });\n       Comment = Model.extend({\n        body:     attr('string'),\n        post:     belongsTo('post')\n      });\n      ```\n       Use a custom (type) serializer for the post model to configure embedded comments\n       ```app/serializers/post.js\n      import RESTSerializer, { EmbeddedRecordsMixin } from '@ember-data/serializer/rest';\n       export default class PostSerializer extends RESTSerializer.extend(EmbeddedRecordsMixin) {\n        attrs = {\n          comments: { embedded: 'always' }\n        }\n      }\n      ```\n       A payload with an attribute configured for embedded records can serialize\n      the records together under the root attribute's payload:\n       ```js\n      {\n        \"post\": {\n          \"id\": \"1\"\n          \"title\": \"Rails is omakase\",\n          \"body\": \"I want this for my ORM, I want that for my template language...\"\n          \"comments\": [{\n            \"id\": \"1\",\n            \"body\": \"Rails is unagi\"\n          }, {\n            \"id\": \"2\",\n            \"body\": \"Omakase O_o\"\n          }]\n        }\n      }\n      ```\n       The attrs options object can use more specific instruction for extracting and\n      serializing. When serializing, an option to embed `ids`, `ids-and-types` or `records` can be set.\n      When extracting the only option is `records`.\n       So `{ embedded: 'always' }` is shorthand for:\n      `{ serialize: 'records', deserialize: 'records' }`\n       To embed the `ids` for a related object (using a hasMany relationship):\n       ```app/serializers/post.js\n      import RESTSerializer, { EmbeddedRecordsMixin } from '@ember-data/serializer/rest';\n       export default class PostSerializer extends RESTSerializer.extend(EmbeddedRecordsMixin) {\n        attrs = {\n          comments: { serialize: 'ids', deserialize: 'records' }\n        }\n      }\n      ```\n       ```js\n      {\n        \"post\": {\n          \"id\": \"1\"\n          \"title\": \"Rails is omakase\",\n          \"body\": \"I want this for my ORM, I want that for my template language...\"\n          \"comments\": [\"1\", \"2\"]\n        }\n      }\n      ```\n       To embed the relationship as a collection of objects with `id` and `type` keys, set\n      `ids-and-types` for the related object.\n       This is particularly useful for polymorphic relationships where records don't share\n      the same table and the `id` is not enough information.\n       For example having a user that has many pets:\n       ```js\n      User = Model.extend({\n        name: attr('string'),\n        pets: hasMany('pet', { polymorphic: true })\n      });\n       Pet = Model.extend({\n        name: attr('string'),\n      });\n       Cat = Pet.extend({\n        // ...\n      });\n       Parrot = Pet.extend({\n        // ...\n      });\n      ```\n       ```app/serializers/user.js\n      import RESTSerializer, { EmbeddedRecordsMixin } from '@ember-data/serializer/rest';\n       export default class UserSerializer extends RESTSerializer.extend(EmbeddedRecordsMixin) {\n        attrs = {\n          pets: { serialize: 'ids-and-types', deserialize: 'records' }\n        }\n      }\n      ```\n       ```js\n      {\n        \"user\": {\n          \"id\": \"1\"\n          \"name\": \"Bertin Osborne\",\n          \"pets\": [\n            { \"id\": \"1\", \"type\": \"Cat\" },\n            { \"id\": \"1\", \"type\": \"Parrot\"}\n          ]\n        }\n      }\n      ```\n       @method serializeHasMany\n      @public\n      @param {Snapshot} snapshot\n      @param {Object} json\n      @param {Object} relationship\n    */\n    serializeHasMany(snapshot, json, relationship) {\n      let attr = relationship.key;\n      if (this.noSerializeOptionSpecified(attr)) {\n        this._super(snapshot, json, relationship);\n        return;\n      }\n      if (this.hasSerializeIdsOption(attr)) {\n        let schema = this.store.modelFor(snapshot.modelName);\n        let serializedKey = this._getMappedKey(relationship.key, schema);\n        if (serializedKey === relationship.key && this.keyForRelationship) {\n          serializedKey = this.keyForRelationship(relationship.key, relationship.kind, 'serialize');\n        }\n        json[serializedKey] = snapshot.hasMany(attr, {\n          ids: true\n        });\n      } else if (this.hasSerializeRecordsOption(attr)) {\n        this._serializeEmbeddedHasMany(snapshot, json, relationship);\n      } else {\n        if (this.hasSerializeIdsAndTypesOption(attr)) {\n          this._serializeHasManyAsIdsAndTypes(snapshot, json, relationship);\n        }\n      }\n    },\n    /*\n      Serializes a hasMany relationship as an array of objects containing only `id` and `type`\n      keys.\n      This has its use case on polymorphic hasMany relationships where the server is not storing\n      all records in the same table using STI, and therefore the `id` is not enough information\n       TODO: Make the default in Ember-data 3.0??\n    */\n    _serializeHasManyAsIdsAndTypes(snapshot, json, relationship) {\n      let serializedKey = this.keyForAttribute(relationship.key, 'serialize');\n      let hasMany = snapshot.hasMany(relationship.key);\n      json[serializedKey] = (0, _array.A)(hasMany).map(function (recordSnapshot) {\n        //\n        // I'm sure I'm being utterly naive here. Probably id is a configurable property and\n        // type too, and the modelName has to be normalized somehow.\n        //\n        return {\n          id: recordSnapshot.id,\n          type: recordSnapshot.modelName\n        };\n      });\n    },\n    _serializeEmbeddedHasMany(snapshot, json, relationship) {\n      let schema = this.store.modelFor(snapshot.modelName);\n      let serializedKey = this._getMappedKey(relationship.key, schema);\n      if (serializedKey === relationship.key && this.keyForRelationship) {\n        serializedKey = this.keyForRelationship(relationship.key, relationship.kind, 'serialize');\n      }\n      (true && (0, _debug.warn)(`The embedded relationship '${serializedKey}' is undefined for '${snapshot.modelName}' with id '${snapshot.id}'. Please include it in your original payload.`, typeof snapshot.hasMany(relationship.key) !== 'undefined', {\n        id: 'ds.serializer.embedded-relationship-undefined'\n      }));\n      json[serializedKey] = this._generateSerializedHasMany(snapshot, relationship);\n    },\n    /*\n      Returns an array of embedded records serialized to JSON\n    */\n    _generateSerializedHasMany(snapshot, relationship) {\n      let hasMany = snapshot.hasMany(relationship.key);\n      let manyArray = (0, _array.A)(hasMany);\n      let ret = new Array(manyArray.length);\n      for (let i = 0; i < manyArray.length; i++) {\n        let embeddedSnapshot = manyArray[i];\n        let embeddedJson = embeddedSnapshot.serialize({\n          includeId: true\n        });\n        this.removeEmbeddedForeignKey(snapshot, embeddedSnapshot, relationship, embeddedJson);\n        ret[i] = embeddedJson;\n      }\n      return ret;\n    },\n    /**\n      When serializing an embedded record, modify the property (in the `JSON` payload)\n      that refers to the parent record (foreign key for the relationship).\n       Serializing a `belongsTo` relationship removes the property that refers to the\n      parent record\n       Serializing a `hasMany` relationship does not remove the property that refers to\n      the parent record.\n       @method removeEmbeddedForeignKey\n      @public\n      @param {Snapshot} snapshot\n      @param {Snapshot} embeddedSnapshot\n      @param {Object} relationship\n      @param {Object} json\n    */\n    removeEmbeddedForeignKey(snapshot, embeddedSnapshot, relationship, json) {\n      if (relationship.kind === 'belongsTo') {\n        let schema = this.store.modelFor(snapshot.modelName);\n        let parentRecord = schema.inverseFor(relationship.key, this.store);\n        if (parentRecord) {\n          let name = parentRecord.name;\n          let embeddedSerializer = this.store.serializerFor(embeddedSnapshot.modelName);\n          let parentKey = embeddedSerializer.keyForRelationship(name, parentRecord.kind, 'deserialize');\n          if (parentKey) {\n            delete json[parentKey];\n          }\n        }\n      } /*else if (relationship.kind === 'hasMany') {\n        return;\n        }*/\n    },\n    // checks config for attrs option to embedded (always) - serialize and deserialize\n    hasEmbeddedAlwaysOption(attr) {\n      let option = this.attrsOption(attr);\n      return option && option.embedded === 'always';\n    },\n    // checks config for attrs option to serialize ids\n    hasSerializeRecordsOption(attr) {\n      let alwaysEmbed = this.hasEmbeddedAlwaysOption(attr);\n      let option = this.attrsOption(attr);\n      return alwaysEmbed || option && option.serialize === 'records';\n    },\n    // checks config for attrs option to serialize records\n    hasSerializeIdsOption(attr) {\n      let option = this.attrsOption(attr);\n      return option && (option.serialize === 'ids' || option.serialize === 'id');\n    },\n    // checks config for attrs option to serialize records as objects containing id and types\n    hasSerializeIdsAndTypesOption(attr) {\n      let option = this.attrsOption(attr);\n      return option && (option.serialize === 'ids-and-types' || option.serialize === 'id-and-type');\n    },\n    // checks config for attrs option to serialize records\n    noSerializeOptionSpecified(attr) {\n      let option = this.attrsOption(attr);\n      return !(option && (option.serialize || option.embedded));\n    },\n    // checks config for attrs option to deserialize records\n    // a defined option object for a resource is treated the same as\n    // `deserialize: 'records'`\n    hasDeserializeRecordsOption(attr) {\n      let alwaysEmbed = this.hasEmbeddedAlwaysOption(attr);\n      let option = this.attrsOption(attr);\n      return alwaysEmbed || option && option.deserialize === 'records';\n    },\n    attrsOption(attr) {\n      let attrs = this.attrs;\n      return attrs && (attrs[(0, _string.camelize)(attr)] || attrs[attr]);\n    },\n    /**\n     @method _extractEmbeddedRecords\n     @private\n    */\n    _extractEmbeddedRecords(serializer, store, typeClass, partial) {\n      typeClass.eachRelationship((key, relationship) => {\n        if (serializer.hasDeserializeRecordsOption(key)) {\n          if (relationship.kind === 'hasMany') {\n            this._extractEmbeddedHasMany(store, key, partial, relationship);\n          }\n          if (relationship.kind === 'belongsTo') {\n            this._extractEmbeddedBelongsTo(store, key, partial, relationship);\n          }\n        }\n      });\n      return partial;\n    },\n    /**\n     @method _extractEmbeddedHasMany\n     @private\n    */\n    _extractEmbeddedHasMany(store, key, hash, relationshipMeta) {\n      let relationshipHash = hash.data?.relationships?.[key]?.data;\n      if (!relationshipHash) {\n        return;\n      }\n      let hasMany = new Array(relationshipHash.length);\n      for (let i = 0; i < relationshipHash.length; i++) {\n        let item = relationshipHash[i];\n        let {\n          data,\n          included\n        } = this._normalizeEmbeddedRelationship(store, relationshipMeta, item);\n        hash.included = hash.included || [];\n        hash.included.push(data);\n        if (included) {\n          hash.included = hash.included.concat(included);\n        }\n        hasMany[i] = {\n          id: data.id,\n          type: data.type\n        };\n      }\n      let relationship = {\n        data: hasMany\n      };\n      hash.data.relationships[key] = relationship;\n    },\n    /**\n     @method _extractEmbeddedBelongsTo\n     @private\n    */\n    _extractEmbeddedBelongsTo(store, key, hash, relationshipMeta) {\n      let relationshipHash = hash.data?.relationships?.[key]?.data;\n      if (!relationshipHash) {\n        return;\n      }\n      let {\n        data,\n        included\n      } = this._normalizeEmbeddedRelationship(store, relationshipMeta, relationshipHash);\n      hash.included = hash.included || [];\n      hash.included.push(data);\n      if (included) {\n        hash.included = hash.included.concat(included);\n      }\n      let belongsTo = {\n        id: data.id,\n        type: data.type\n      };\n      let relationship = {\n        data: belongsTo\n      };\n      hash.data.relationships[key] = relationship;\n    },\n    /**\n     @method _normalizeEmbeddedRelationship\n     @private\n    */\n    _normalizeEmbeddedRelationship(store, relationshipMeta, relationshipHash) {\n      let modelName = relationshipMeta.type;\n      if (relationshipMeta.options.polymorphic) {\n        modelName = relationshipHash.type;\n      }\n      let modelClass = store.modelFor(modelName);\n      let serializer = store.serializerFor(modelName);\n      return serializer.normalize(modelClass, relationshipHash, null);\n    },\n    isEmbeddedRecordsMixin: true\n  });\n  _exports.e = embeddedRecordsMixin;\n});","define(\"@ember-data/serializer/index\", [\"exports\", \"@ember/object\", \"@ember/service\"], function (_exports, _object, _service) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class2, _descriptor;\n  /**\n    ## Overview\n  \n    In order to properly manage and present your data, EmberData\n    needs to understand the structure of data it receives.\n  \n    `Serializers` convert data between the server's API format and\n    the format EmberData understands.\n  \n    Data received from an API response is **normalized** into\n    [JSON:API](https://jsonapi.org/) (the format used internally\n    by EmberData), while data sent to an API is **serialized**\n    into the format the API expects.\n  \n    ### Implementing a Serializer\n  \n    There are only two required serializer methods, one for\n    normalizing data from the server API format into JSON:API, and\n    another for serializing records via `Snapshots` into the expected\n    server API format.\n  \n    To implement a serializer, export a class that conforms to the structure\n    described by the [MinimumSerializerInterface](/ember-data/release/classes/MinimumSerializerInterface)\n    from the `app/serializers/` directory. An example is below.\n  \n    ```ts\n    import EmberObject from '@ember/object';\n  \n    export default class ApplicationSerializer extends EmberObject {\n      normalizeResponse(store, schema, rawPayload) {\n        return rawPayload;\n      }\n  \n      serialize(snapshot, options) {\n        const serializedResource = {\n          id: snapshot.id,\n          type: snapshot.modelName,\n          attributes: snapshot.attributes()\n        };\n  \n        return serializedResource;\n      }\n    }\n   ```\n  \n  \n    ### Serializer Resolution\n  \n    `store.serializerFor(name)` will lookup serializers defined in\n    `app/serializers/` and return an instance. If no serializer is found, an\n    error will be thrown.\n  \n    `serializerFor` first attempts to find a serializer with an exact match on `name`,\n    then falls back to checking for the presence of a serializer named `application`.\n  \n    ```ts\n    store.serializerFor('author');\n  \n    // lookup paths (in order) =>\n    //   app/serializers/author.js\n    //   app/serializers/application.js\n    ```\n  \n    Most requests in EmberData are made with respect to a particular `type` (or `modelName`)\n    (e.g., \"get me the full collection of **books**\" or \"get me the **employee** whose id is 37\"). We\n    refer to this as the **primary** resource `type`.\n  \n    Typically `serializerFor` will be used to find a serializer with a name matching that of the primary\n    resource `type` for the request, falling back to the `application` serializer for those types that\n    do not have a defined serializer. This is often described as a `per-model` or `per-type` strategy\n    for defining serializers. However, because APIs rarely format payloads per-type but rather\n    per-API-version, this may not be a desired strategy.\n  \n    It is recommended that applications define only a single `application` adapter and serializer\n    where possible.\n  \n    If you have multiple API formats and the per-type strategy is not viable, one strategy is to\n    write an `application` adapter and serializer that make use of `options` to specify the desired\n    format when making a request.\n  \n    ### Using a Serializer\n  \n    Any serializer in `app/serializers/` can be looked up by `name` using `store.serializerFor(name)`.\n  \n    ### Default Serializers\n  \n    For applications whose APIs are *very close to* or *exactly* the **REST** format or **JSON:API**\n    format the `@ember-data/serializer` package contains implementations these applications can\n    extend. It also contains a simple `JSONSerializer` for serializing to/from very basic JSON objects.\n  \n    Many applications will find writing their own serializer to be more performant and less\n    complex than extending these classes even when their API format is very close to that expected\n    by these serializers.\n  \n    It is recommended that apps write their own serializer to best suit the needs of their API and\n    application.\n  \n    @module @ember-data/serializer\n    @main @ember-data/serializer\n  */\n  0; //eaimeta@70e063a35619d71f0,\"@ember/object\",0,\"@ember/service\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }\n  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }\n  function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }\n  /**\n    `Serializer` is an abstract base class that you should override in your\n    application to customize it for your backend. The minimum set of methods\n    that you should implement is:\n  \n      * `normalizeResponse()`\n      * `serialize()`\n  \n    And you can optionally override the following methods:\n  \n      * `normalize()`\n  \n    For an example implementation, see\n    [JSONSerializer](JSONSerializer), the included JSON serializer.\n  \n    @class Serializer\n    @public\n    @extends Ember.EmberObject\n  */\n  let _class = (_class2 = class _class2 extends _object.default {\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty(this, \"store\", _descriptor, this);\n    }\n    /**\n      The `store` property is the application's `store` that contains\n      all records. It can be used to look up serializers for other model\n      types that may be nested inside the payload response.\n       Example:\n       ```js\n      Serializer.extend({\n        extractRelationship(relationshipModelName, relationshipHash) {\n          let modelClass = this.store.modelFor(relationshipModelName);\n          let relationshipSerializer = this.store.serializerFor(relationshipModelName);\n          return relationshipSerializer.normalize(modelClass, relationshipHash);\n        }\n      });\n      ```\n       @property store\n      @type {Store}\n      @public\n    */\n\n    /**\n      The `normalizeResponse` method is used to normalize a payload from the\n      server to a JSON-API Document.\n       http://jsonapi.org/format/#document-structure\n       Example:\n       ```js\n      Serializer.extend({\n        normalizeResponse(store, primaryModelClass, payload, id, requestType) {\n          if (requestType === 'findRecord') {\n            return this.normalize(primaryModelClass, payload);\n          } else {\n            return payload.reduce(function(documentHash, item) {\n              let { data, included } = this.normalize(primaryModelClass, item);\n              documentHash.included.push(...included);\n              documentHash.data.push(data);\n              return documentHash;\n            }, { data: [], included: [] })\n          }\n        }\n      });\n      ```\n       @since 1.13.0\n      @method normalizeResponse\n      @public\n      @param {Store} store\n      @param {Model} primaryModelClass\n      @param {Object} payload\n      @param {String|Number} id\n      @param {String} requestType\n      @return {Object} JSON-API Document\n    */\n\n    /**\n      The `serialize` method is used when a record is saved in order to convert\n      the record into the form that your external data source expects.\n       `serialize` takes an optional `options` hash with a single option:\n       - `includeId`: If this is `true`, `serialize` should include the ID\n        in the serialized object it builds.\n       Example:\n       ```js\n      Serializer.extend({\n        serialize(snapshot, options) {\n          let json = {\n            id: snapshot.id\n          };\n           snapshot.eachAttribute((key, attribute) => {\n            json[key] = snapshot.attr(key);\n          });\n           snapshot.eachRelationship((key, relationship) => {\n            if (relationship.kind === 'belongsTo') {\n              json[key] = snapshot.belongsTo(key, { id: true });\n            } else if (relationship.kind === 'hasMany') {\n              json[key] = snapshot.hasMany(key, { ids: true });\n            }\n          });\n           return json;\n        },\n      });\n      ```\n       @method serialize\n      @public\n      @param {Snapshot} snapshot\n      @param {Object} [options]\n      @return {Object}\n    */\n\n    /**\n      The `normalize` method is used to convert a payload received from your\n      external data source into the normalized form `store.push()` expects. You\n      should override this method, munge the hash and return the normalized\n      payload.\n       Example:\n       ```js\n      Serializer.extend({\n        normalize(modelClass, resourceHash) {\n          let data = {\n            id:            resourceHash.id,\n            type:          modelClass.modelName,\n            attributes:    resourceHash\n          };\n          return { data: data };\n        }\n      })\n      ```\n       @method normalize\n      @public\n      @param {Model} typeClass\n      @param {Object} hash\n      @return {Object}\n    */\n    normalize(typeClass, hash) {\n      return hash;\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class2.prototype, \"store\", [_service.inject], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class2);\n  _exports.default = _class;\n});","define(\"@ember-data/serializer/json-api\", [\"exports\", \"@embroider/macros/runtime\", \"@ember/debug\", \"@ember/string\", \"@ember/utils\", \"ember-inflector\", \"@ember-data/serializer/json\"], function (_exports, _runtime, _debug, _string, _utils, _emberInflector, _json) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/debug\",0,\"@ember/string\",0,\"@ember/utils\",0,\"@glimmer/env\",0,\"ember-inflector\",0,\"@ember-data/serializer/json\"eaimeta@70e063a35619d71f\n  /**\n   * @module @ember-data/serializer/json-api\n   */\n  /**\n    Ember Data 2.0 Serializer:\n  \n    In Ember Data a Serializer is used to serialize and deserialize\n    records when they are transferred in and out of an external source.\n    This process involves normalizing property names, transforming\n    attribute values and serializing relationships.\n  \n    `JSONAPISerializer` supports the http://jsonapi.org/ spec and is the\n    serializer recommended by Ember Data.\n  \n    This serializer normalizes a JSON API payload that looks like:\n  \n    ```app/models/player.js\n    import Model, { attr, belongsTo } from '@ember-data/model';\n  \n    export default class Player extends Model {\n      @attr('string') name;\n      @attr('string') skill;\n      @attr('number') gamesPlayed;\n      @belongsTo('club') club;\n    }\n    ```\n  \n    ```app/models/club.js\n    import Model, { attr, hasMany } from '@ember-data/model';\n  \n    export default class Club extends Model {\n      @attr('string') name;\n      @attr('string') location;\n      @hasMany('player') players;\n    }\n    ```\n  \n    ```js\n      {\n        \"data\": [\n          {\n            \"attributes\": {\n              \"name\": \"Benfica\",\n              \"location\": \"Portugal\"\n            },\n            \"id\": \"1\",\n            \"relationships\": {\n              \"players\": {\n                \"data\": [\n                  {\n                    \"id\": \"3\",\n                    \"type\": \"players\"\n                  }\n                ]\n              }\n            },\n            \"type\": \"clubs\"\n          }\n        ],\n        \"included\": [\n          {\n            \"attributes\": {\n              \"name\": \"Eusebio Silva Ferreira\",\n              \"skill\": \"Rocket shot\",\n              \"games-played\": 431\n            },\n            \"id\": \"3\",\n            \"relationships\": {\n              \"club\": {\n                \"data\": {\n                  \"id\": \"1\",\n                  \"type\": \"clubs\"\n                }\n              }\n            },\n            \"type\": \"players\"\n          }\n        ]\n      }\n    ```\n  \n    to the format that the Ember Data store expects.\n  \n    ### Customizing meta\n  \n    Since a JSON API Document can have meta defined in multiple locations you can\n    use the specific serializer hooks if you need to customize the meta.\n  \n    One scenario would be to camelCase the meta keys of your payload. The example\n    below shows how this could be done using `normalizeArrayResponse` and\n    `extractRelationship`.\n  \n    ```app/serializers/application.js\n    import JSONAPISerializer from '@ember-data/serializer/json-api';\n  \n    export default class ApplicationSerializer extends JSONAPISerializer {\n      normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        let normalizedDocument = super.normalizeArrayResponse(...arguments);\n  \n        // Customize document meta\n        normalizedDocument.meta = camelCaseKeys(normalizedDocument.meta);\n  \n        return normalizedDocument;\n      }\n  \n      extractRelationship(relationshipHash) {\n        let normalizedRelationship = super.extractRelationship(...arguments);\n  \n        // Customize relationship meta\n        normalizedRelationship.meta = camelCaseKeys(normalizedRelationship.meta);\n  \n        return normalizedRelationship;\n      }\n    }\n    ```\n  \n    @main @ember-data/serializer/json-api\n    @since 1.13.0\n    @class JSONAPISerializer\n    @public\n    @extends JSONSerializer\n  */\n  const JSONAPISerializer = _json.default.extend({\n    /**\n      @method _normalizeDocumentHelper\n      @param {Object} documentHash\n      @return {Object}\n      @private\n    */\n    _normalizeDocumentHelper(documentHash) {\n      if ((0, _utils.typeOf)(documentHash.data) === 'object') {\n        documentHash.data = this._normalizeResourceHelper(documentHash.data);\n      } else if (Array.isArray(documentHash.data)) {\n        let ret = new Array(documentHash.data.length);\n        for (let i = 0; i < documentHash.data.length; i++) {\n          let data = documentHash.data[i];\n          ret[i] = this._normalizeResourceHelper(data);\n        }\n        documentHash.data = ret;\n      }\n      if (Array.isArray(documentHash.included)) {\n        let ret = new Array();\n        for (let i = 0; i < documentHash.included.length; i++) {\n          let included = documentHash.included[i];\n          let normalized = this._normalizeResourceHelper(included);\n          if (normalized !== null) {\n            // can be null when unknown type is encountered\n            ret.push(normalized);\n          }\n        }\n        documentHash.included = ret;\n      }\n      return documentHash;\n    },\n    /**\n      @method _normalizeRelationshipDataHelper\n      @param {Object} relationshipDataHash\n      @return {Object}\n      @private\n    */\n    _normalizeRelationshipDataHelper(relationshipDataHash) {\n      relationshipDataHash.type = this.modelNameFromPayloadKey(relationshipDataHash.type);\n      return relationshipDataHash;\n    },\n    /**\n      @method _normalizeResourceHelper\n      @param {Object} resourceHash\n      @return {Object}\n      @private\n    */\n    _normalizeResourceHelper(resourceHash) {\n      (true && !(!(0, _utils.isNone)(resourceHash.type)) && (0, _debug.assert)(this.warnMessageForUndefinedType(), !(0, _utils.isNone)(resourceHash.type)));\n      let modelName, usedLookup;\n      modelName = this.modelNameFromPayloadKey(resourceHash.type);\n      usedLookup = 'modelNameFromPayloadKey';\n      if (!this.store.getSchemaDefinitionService().doesTypeExist(modelName)) {\n        (true && (0, _debug.warn)(this.warnMessageNoModelForType(modelName, resourceHash.type, usedLookup), false, {\n          id: 'ds.serializer.model-for-type-missing'\n        }));\n        return null;\n      }\n      let modelClass = this.store.modelFor(modelName);\n      let serializer = this.store.serializerFor(modelName);\n      let {\n        data\n      } = serializer.normalize(modelClass, resourceHash);\n      return data;\n    },\n    /**\n      Normalize some data and push it into the store.\n       @method pushPayload\n      @public\n      @param {Store} store\n      @param {Object} payload\n    */\n    pushPayload(store, payload) {\n      let normalizedPayload = this._normalizeDocumentHelper(payload);\n      store.push(normalizedPayload);\n    },\n    /**\n      @method _normalizeResponse\n      @param {Store} store\n      @param {Model} primaryModelClass\n      @param {Object} payload\n      @param {String|Number} id\n      @param {String} requestType\n      @param {Boolean} isSingle\n      @return {Object} JSON-API Document\n      @private\n    */\n    _normalizeResponse(store, primaryModelClass, payload, id, requestType, isSingle) {\n      let normalizedPayload = this._normalizeDocumentHelper(payload);\n      return normalizedPayload;\n    },\n    normalizeQueryRecordResponse() {\n      let normalized = this._super(...arguments);\n      (true && !(!Array.isArray(normalized.data)) && (0, _debug.assert)('Expected the primary data returned by the serializer for a `queryRecord` response to be a single object but instead it was an array.', !Array.isArray(normalized.data)));\n      return normalized;\n    },\n    extractAttributes(modelClass, resourceHash) {\n      let attributes = {};\n      if (resourceHash.attributes) {\n        modelClass.eachAttribute(key => {\n          let attributeKey = this.keyForAttribute(key, 'deserialize');\n          if (resourceHash.attributes[attributeKey] !== undefined) {\n            attributes[key] = resourceHash.attributes[attributeKey];\n          }\n          if ((0, _runtime.macroCondition)(true)) {\n            if (resourceHash.attributes[attributeKey] === undefined && resourceHash.attributes[key] !== undefined) {\n              (true && !(false) && (0, _debug.assert)(`Your payload for '${modelClass.modelName}' contains '${key}', but your serializer is setup to look for '${attributeKey}'. This is most likely because Ember Data's JSON API serializer dasherizes attribute keys by default. You should subclass JSONAPISerializer and implement 'keyForAttribute(key) { return key; }' to prevent Ember Data from customizing your attribute keys.`, false));\n            }\n          }\n        });\n      }\n      return attributes;\n    },\n    /**\n       Returns a relationship formatted as a JSON-API \"relationship object\".\n        http://jsonapi.org/format/#document-resource-object-relationships\n        @method extractRelationship\n      @public\n       @param {Object} relationshipHash\n       @return {Object}\n    */\n    extractRelationship(relationshipHash) {\n      if ((0, _utils.typeOf)(relationshipHash.data) === 'object') {\n        relationshipHash.data = this._normalizeRelationshipDataHelper(relationshipHash.data);\n      }\n      if (Array.isArray(relationshipHash.data)) {\n        let ret = new Array(relationshipHash.data.length);\n        for (let i = 0; i < relationshipHash.data.length; i++) {\n          let data = relationshipHash.data[i];\n          ret[i] = this._normalizeRelationshipDataHelper(data);\n        }\n        relationshipHash.data = ret;\n      }\n      return relationshipHash;\n    },\n    /**\n       Returns the resource's relationships formatted as a JSON-API \"relationships object\".\n        http://jsonapi.org/format/#document-resource-object-relationships\n        @method extractRelationships\n      @public\n       @param {Object} modelClass\n       @param {Object} resourceHash\n       @return {Object}\n    */\n    extractRelationships(modelClass, resourceHash) {\n      let relationships = {};\n      if (resourceHash.relationships) {\n        modelClass.eachRelationship((key, relationshipMeta) => {\n          let relationshipKey = this.keyForRelationship(key, relationshipMeta.kind, 'deserialize');\n          if (resourceHash.relationships[relationshipKey] !== undefined) {\n            let relationshipHash = resourceHash.relationships[relationshipKey];\n            relationships[key] = this.extractRelationship(relationshipHash);\n          }\n          if ((0, _runtime.macroCondition)(true)) {\n            if (resourceHash.relationships[relationshipKey] === undefined && resourceHash.relationships[key] !== undefined) {\n              (true && !(false) && (0, _debug.assert)(`Your payload for '${modelClass.modelName}' contains '${key}', but your serializer is setup to look for '${relationshipKey}'. This is most likely because Ember Data's JSON API serializer dasherizes relationship keys by default. You should subclass JSONAPISerializer and implement 'keyForRelationship(key) { return key; }' to prevent Ember Data from customizing your relationship keys.`, false));\n            }\n          }\n        });\n      }\n      return relationships;\n    },\n    /**\n      @method _extractType\n      @param {Model} modelClass\n      @param {Object} resourceHash\n      @return {String}\n      @private\n    */\n    _extractType(modelClass, resourceHash) {\n      return this.modelNameFromPayloadKey(resourceHash.type);\n    },\n    /**\n      Dasherizes and singularizes the model name in the payload to match\n      the format Ember Data uses internally for the model name.\n       For example the key `posts` would be converted to `post` and the\n      key `studentAssesments` would be converted to `student-assesment`.\n       @method modelNameFromPayloadKey\n      @public\n      @param {String} key\n      @return {String} the model's modelName\n    */\n    modelNameFromPayloadKey(key) {\n      return (0, _emberInflector.singularize)((0, _string.dasherize)(key));\n    },\n    /**\n      Converts the model name to a pluralized version of the model name.\n       For example `post` would be converted to `posts` and\n      `student-assesment` would be converted to `student-assesments`.\n       @method payloadKeyFromModelName\n      @public\n      @param {String} modelName\n      @return {String}\n    */\n    payloadKeyFromModelName(modelName) {\n      return (0, _emberInflector.pluralize)(modelName);\n    },\n    normalize(modelClass, resourceHash) {\n      if (resourceHash.attributes) {\n        this.normalizeUsingDeclaredMapping(modelClass, resourceHash.attributes);\n      }\n      if (resourceHash.relationships) {\n        this.normalizeUsingDeclaredMapping(modelClass, resourceHash.relationships);\n      }\n      let data = {\n        id: this.extractId(modelClass, resourceHash),\n        type: this._extractType(modelClass, resourceHash),\n        attributes: this.extractAttributes(modelClass, resourceHash),\n        relationships: this.extractRelationships(modelClass, resourceHash)\n      };\n      this.applyTransforms(modelClass, data.attributes);\n      return {\n        data\n      };\n    },\n    /**\n      `keyForAttribute` can be used to define rules for how to convert an\n      attribute name in your model to a key in your JSON.\n      By default `JSONAPISerializer` follows the format used on the examples of\n      http://jsonapi.org/format and uses dashes as the word separator in the JSON\n      attribute keys.\n       This behaviour can be easily customized by extending this method.\n       Example\n       ```app/serializers/application.js\n      import JSONAPISerializer from '@ember-data/serializer/json-api';\n      import { dasherize } from '<app-name>/utils/string-utils';\n       export default class ApplicationSerializer extends JSONAPISerializer {\n        keyForAttribute(attr, method) {\n          return dasherize(attr).toUpperCase();\n        }\n      }\n      ```\n       @method keyForAttribute\n      @public\n      @param {String} key\n      @param {String} method\n      @return {String} normalized key\n    */\n    keyForAttribute(key, method) {\n      return (0, _string.dasherize)(key);\n    },\n    /**\n     `keyForRelationship` can be used to define a custom key when\n     serializing and deserializing relationship properties.\n     By default `JSONAPISerializer` follows the format used on the examples of\n     http://jsonapi.org/format and uses dashes as word separators in\n     relationship properties.\n      This behaviour can be easily customized by extending this method.\n      Example\n       ```app/serializers/post.js\n      import JSONAPISerializer from '@ember-data/serializer/json-api';\n      import { underscore } from '<app-name>/utils/string-utils';\n       export default class ApplicationSerializer extends JSONAPISerializer {\n        keyForRelationship(key, relationship, method) {\n          return underscore(key);\n        }\n      }\n      ```\n     @method keyForRelationship\n      @public\n     @param {String} key\n     @param {String} typeClass\n     @param {String} method\n     @return {String} normalized key\n    */\n    keyForRelationship(key, typeClass, method) {\n      return (0, _string.dasherize)(key);\n    },\n    /**\n      Called when a record is saved in order to convert the\n      record into JSON.\n       For example, consider this model:\n       ```app/models/comment.js\n      import Model, { attr, belongsTo } from '@ember-data/model';\n       export default class CommentModel extends Model {\n        @attr title;\n        @attr body;\n         @belongsTo('user', { async: false, inverse: null })\n        author;\n      }\n      ```\n       The default serialization would create a JSON-API resource object like:\n       ```javascript\n      {\n        \"data\": {\n          \"type\": \"comments\",\n          \"attributes\": {\n            \"title\": \"Rails is unagi\",\n            \"body\": \"Rails? Omakase? O_O\",\n          },\n          \"relationships\": {\n            \"author\": {\n              \"data\": {\n                \"id\": \"12\",\n                \"type\": \"users\"\n              }\n            }\n          }\n        }\n      }\n      ```\n       By default, attributes are passed through as-is, unless\n      you specified an attribute type (`attr('date')`). If\n      you specify a transform, the JavaScript value will be\n      serialized when inserted into the attributes hash.\n       Belongs-to relationships are converted into JSON-API\n      resource identifier objects.\n       ## IDs\n       `serialize` takes an options hash with a single option:\n      `includeId`. If this option is `true`, `serialize` will,\n      by default include the ID in the JSON object it builds.\n       The JSONAPIAdapter passes in `includeId: true` when serializing a record\n      for `createRecord` or `updateRecord`.\n       ## Customization\n       Your server may expect data in a different format than the\n      built-in serialization format.\n       In that case, you can implement `serialize` yourself and\n      return data formatted to match your API's expectations, or override\n      the invoked adapter method and do the serialization in the adapter directly\n      by using the provided snapshot.\n       If your API's format differs greatly from the JSON:API spec, you should\n      consider authoring your own adapter and serializer instead of extending\n      this class.\n       ```app/serializers/post.js\n      import JSONAPISerializer from '@ember-data/serializer/json-api';\n       export default class PostSerializer extends JSONAPISerializer {\n        serialize(snapshot, options) {\n          let json = {\n            POST_TTL: snapshot.attr('title'),\n            POST_BDY: snapshot.attr('body'),\n            POST_CMS: snapshot.hasMany('comments', { ids: true })\n          };\n           if (options.includeId) {\n            json.POST_ID_ = snapshot.id;\n          }\n           return json;\n        }\n      }\n      ```\n       ## Customizing an App-Wide Serializer\n       If you want to define a serializer for your entire\n      application, you'll probably want to use `eachAttribute`\n      and `eachRelationship` on the record.\n       ```app/serializers/application.js\n      import JSONAPISerializer from '@ember-data/serializer/json-api';\n      import { underscore, singularize } from '<app-name>/utils/string-utils';\n       export default class ApplicationSerializer extends JSONAPISerializer {\n        serialize(snapshot, options) {\n          let json = {};\n           snapshot.eachAttribute((name) => {\n            json[serverAttributeName(name)] = snapshot.attr(name);\n          });\n           snapshot.eachRelationship((name, relationship) => {\n            if (relationship.kind === 'hasMany') {\n              json[serverHasManyName(name)] = snapshot.hasMany(name, { ids: true });\n            }\n          });\n           if (options.includeId) {\n            json.ID_ = snapshot.id;\n          }\n           return json;\n        }\n      }\n       function serverAttributeName(attribute) {\n        return underscore(attribute).toUpperCase();\n      }\n       function serverHasManyName(name) {\n        return serverAttributeName(singularize(name)) + '_IDS';\n      }\n      ```\n       This serializer will generate JSON that looks like this:\n       ```javascript\n      {\n        \"TITLE\": \"Rails is omakase\",\n        \"BODY\": \"Yep. Omakase.\",\n        \"COMMENT_IDS\": [ \"1\", \"2\", \"3\" ]\n      }\n      ```\n       ## Tweaking the Default Formatting\n       If you just want to do some small tweaks on the default JSON:API formatted response,\n      you can call `super.serialize` first and make the tweaks\n      on the returned object.\n       ```app/serializers/post.js\n      import JSONAPISerializer from '@ember-data/serializer/json-api';\n       export default class PostSerializer extends JSONAPISerializer {\n        serialize(snapshot, options) {\n          let json = super.serialize(...arguments);\n           json.data.attributes.subject = json.data.attributes.title;\n          delete json.data.attributes.title;\n           return json;\n        }\n      }\n      ```\n       @method serialize\n      @public\n      @param {Snapshot} snapshot\n      @param {Object} options\n      @return {Object} json\n    */\n    serialize(snapshot, options) {\n      let data = this._super(...arguments);\n      data.type = this.payloadKeyFromModelName(snapshot.modelName);\n      return {\n        data\n      };\n    },\n    serializeAttribute(snapshot, json, key, attribute) {\n      let type = attribute.type;\n      if (this._canSerialize(key)) {\n        json.attributes = json.attributes || {};\n        let value = snapshot.attr(key);\n        if (type) {\n          let transform = this.transformFor(type);\n          value = transform.serialize(value, attribute.options);\n        }\n        let schema = this.store.modelFor(snapshot.modelName);\n        let payloadKey = this._getMappedKey(key, schema);\n        if (payloadKey === key) {\n          payloadKey = this.keyForAttribute(key, 'serialize');\n        }\n        json.attributes[payloadKey] = value;\n      }\n    },\n    serializeBelongsTo(snapshot, json, relationship) {\n      let key = relationship.key;\n      if (this._canSerialize(key)) {\n        let belongsTo = snapshot.belongsTo(key);\n        let belongsToIsNotNew = belongsTo && !belongsTo.isNew;\n        if (belongsTo === null || belongsToIsNotNew) {\n          json.relationships = json.relationships || {};\n          let schema = this.store.modelFor(snapshot.modelName);\n          let payloadKey = this._getMappedKey(key, schema);\n          if (payloadKey === key) {\n            payloadKey = this.keyForRelationship(key, 'belongsTo', 'serialize');\n          }\n          let data = null;\n          if (belongsTo) {\n            let payloadType = this.payloadKeyFromModelName(belongsTo.modelName);\n            data = {\n              type: payloadType,\n              id: belongsTo.id\n            };\n          }\n          json.relationships[payloadKey] = {\n            data\n          };\n        }\n      }\n    },\n    serializeHasMany(snapshot, json, relationship) {\n      let key = relationship.key;\n      if (this.shouldSerializeHasMany(snapshot, key, relationship)) {\n        let hasMany = snapshot.hasMany(key);\n        if (hasMany !== undefined) {\n          json.relationships = json.relationships || {};\n          let schema = this.store.modelFor(snapshot.modelName);\n          let payloadKey = this._getMappedKey(key, schema);\n          if (payloadKey === key && this.keyForRelationship) {\n            payloadKey = this.keyForRelationship(key, 'hasMany', 'serialize');\n          }\n\n          // only serialize has many relationships that are not new\n          let nonNewHasMany = hasMany.filter(item => item.record && !item.record.isNew);\n          let data = new Array(nonNewHasMany.length);\n          for (let i = 0; i < nonNewHasMany.length; i++) {\n            let item = hasMany[i];\n            let payloadType = this.payloadKeyFromModelName(item.modelName);\n            data[i] = {\n              type: payloadType,\n              id: item.id\n            };\n          }\n          json.relationships[payloadKey] = {\n            data\n          };\n        }\n      }\n    }\n  });\n  if ((0, _runtime.macroCondition)(true)) {\n    JSONAPISerializer.reopen({\n      init() {\n        this._super(...arguments);\n        (true && !(!this.isEmbeddedRecordsMixin || this.isEmbeddedRecordsMixinCompatible === true) && (0, _debug.assert)(`You've used the EmbeddedRecordsMixin in ${this.toString()} which is not fully compatible with the JSON:API specification. Please confirm that this works for your specific API and add \\`this.isEmbeddedRecordsMixinCompatible = true\\` to your serializer.`, !this.isEmbeddedRecordsMixin || this.isEmbeddedRecordsMixinCompatible === true));\n        let constructor = this.constructor;\n        (true && (0, _debug.warn)(`You've defined 'extractMeta' in ${constructor.toString()} which is not used for serializers extending JSONAPISerializer. Read more at https://api.emberjs.com/ember-data/release/classes/JSONAPISerializer on how to customize meta when using JSON API.`, this.extractMeta === _json.default.prototype.extractMeta, {\n          id: 'ds.serializer.json-api.extractMeta'\n        }));\n      },\n      warnMessageForUndefinedType() {\n        return 'Encountered a resource object with an undefined type (resolved resource using ' + this.constructor.toString() + ')';\n      },\n      warnMessageNoModelForType(modelName, originalType, usedLookup) {\n        return `Encountered a resource object with type \"${originalType}\", but no model was found for model name \"${modelName}\" (resolved model name using '${this.constructor.toString()}.${usedLookup}(\"${originalType}\")').`;\n      }\n    });\n  }\n  var _default = JSONAPISerializer;\n  _exports.default = _default;\n});","define(\"@ember-data/serializer/json\", [\"exports\", \"@ember/application\", \"@ember/debug\", \"@ember/string\", \"@ember/utils\", \"@ember-data/serializer\", \"@ember-data/store/-private\"], function (_exports, _application, _debug, _string, _utils, _serializer, _private) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/application\",0,\"@ember/debug\",0,\"@ember/string\",0,\"@ember/utils\",0,\"@ember-data/serializer\",0,\"@ember-data/store/-private\"eaimeta@70e063a35619d71f\n  /**\n   * @module @ember-data/serializer/json\n   */\n  const SOURCE_POINTER_REGEXP = /^\\/?data\\/(attributes|relationships)\\/(.*)/;\n  const SOURCE_POINTER_PRIMARY_REGEXP = /^\\/?data/;\n  const PRIMARY_ATTRIBUTE_KEY = 'base';\n\n  /**\n    Ember Data 2.0 Serializer:\n  \n    In Ember Data a Serializer is used to serialize and deserialize\n    records when they are transferred in and out of an external source.\n    This process involves normalizing property names, transforming\n    attribute values and serializing relationships.\n  \n    By default, Ember Data uses and recommends the `JSONAPISerializer`.\n  \n    `JSONSerializer` is useful for simpler or legacy backends that may\n    not support the http://jsonapi.org/ spec.\n  \n    For example, given the following `User` model and JSON payload:\n  \n    ```app/models/user.js\n    import Model, { attr, belongsTo, hasMany } from '@ember-data/model';\n  \n    export default class UserModel extends Model {\n      @hasMany('user') friends;\n      @belongsTo('location') house;\n  \n      @attr('string') name;\n    }\n    ```\n  \n    ```js\n    {\n      id: 1,\n      name: 'Sebastian',\n      friends: [3, 4],\n      links: {\n        house: '/houses/lefkada'\n      }\n    }\n    ```\n  \n    `JSONSerializer` will normalize the JSON payload to the JSON API format that the\n    Ember Data store expects.\n  \n    You can customize how JSONSerializer processes its payload by passing options in\n    the `attrs` hash or by subclassing the `JSONSerializer` and overriding hooks:\n  \n      - To customize how a single record is normalized, use the `normalize` hook.\n      - To customize how `JSONSerializer` normalizes the whole server response, use the\n        `normalizeResponse` hook.\n      - To customize how `JSONSerializer` normalizes a specific response from the server,\n        use one of the many specific `normalizeResponse` hooks.\n      - To customize how `JSONSerializer` normalizes your id, attributes or relationships,\n        use the `extractId`, `extractAttributes` and `extractRelationships` hooks.\n  \n    The `JSONSerializer` normalization process follows these steps:\n  \n      1. `normalizeResponse`\n          - entry method to the serializer.\n      2. `normalizeCreateRecordResponse`\n          - a `normalizeResponse` for a specific operation is called.\n      3. `normalizeSingleResponse`|`normalizeArrayResponse`\n          - for methods like `createRecord` we expect a single record back, while for methods like `findAll` we expect multiple records back.\n      4. `normalize`\n          - `normalizeArrayResponse` iterates and calls `normalize` for each of its records while `normalizeSingle`\n            calls it once. This is the method you most likely want to subclass.\n      5. `extractId` | `extractAttributes` | `extractRelationships`\n          - `normalize` delegates to these methods to\n            turn the record payload into the JSON API format.\n  \n    @main @ember-data/serializer/json\n    @class JSONSerializer\n    @public\n    @extends Serializer\n  */\n  const JSONSerializer = _serializer.default.extend({\n    /**\n      The `primaryKey` is used when serializing and deserializing\n      data. Ember Data always uses the `id` property to store the id of\n      the record. The external source may not always follow this\n      convention. In these cases it is useful to override the\n      `primaryKey` property to match the `primaryKey` of your external\n      store.\n       Example\n       ```app/serializers/application.js\n      import JSONSerializer from '@ember-data/serializer/json';\n       export default class ApplicationSerializer extends JSONSerializer {\n        primaryKey = '_id'\n      }\n      ```\n       @property primaryKey\n      @type {String}\n      @public\n      @default 'id'\n    */\n    primaryKey: 'id',\n    /**\n      The `attrs` object can be used to declare a simple mapping between\n      property names on `Model` records and payload keys in the\n      serialized JSON object representing the record. An object with the\n      property `key` can also be used to designate the attribute's key on\n      the response payload.\n       Example\n       ```app/models/person.js\n      import Model, { attr } from '@ember-data/model';\n       export default class PersonModel extends Model {\n        @attr('string') firstName;\n        @attr('string') lastName;\n        @attr('string') occupation;\n        @attr('boolean') admin;\n      }\n      ```\n       ```app/serializers/person.js\n      import JSONSerializer from '@ember-data/serializer/json';\n       export default class PersonSerializer extends JSONSerializer {\n        attrs = {\n          admin: 'is_admin',\n          occupation: { key: 'career' }\n        }\n      }\n      ```\n       You can also remove attributes and relationships by setting the `serialize`\n      key to `false` in your mapping object.\n       Example\n       ```app/serializers/person.js\n      import JSONSerializer from '@ember-data/serializer/json';\n       export default class PostSerializer extends JSONSerializer {\n        attrs = {\n          admin: { serialize: false },\n          occupation: { key: 'career' }\n        }\n      }\n      ```\n       When serialized:\n       ```javascript\n      {\n        \"firstName\": \"Harry\",\n        \"lastName\": \"Houdini\",\n        \"career\": \"magician\"\n      }\n      ```\n       Note that the `admin` is now not included in the payload.\n       Setting `serialize` to `true` enforces serialization for hasMany\n      relationships even if it's neither a many-to-many nor many-to-none\n      relationship.\n       @property attrs\n      @public\n      @type {Object}\n    */\n    mergedProperties: ['attrs'],\n    /**\n     Given a subclass of `Model` and a JSON object this method will\n     iterate through each attribute of the `Model` and invoke the\n     `Transform#deserialize` method on the matching property of the\n     JSON object.  This method is typically called after the\n     serializer's `normalize` method.\n      @method applyTransforms\n     @private\n     @param {Model} typeClass\n     @param {Object} data The data to transform\n     @return {Object} data The transformed data object\n    */\n    applyTransforms(typeClass, data) {\n      let attributes = typeClass.attributes;\n      typeClass.eachTransformedAttribute((key, typeClass) => {\n        if (data[key] === undefined) {\n          return;\n        }\n        let transform = this.transformFor(typeClass);\n        let transformMeta = attributes.get(key);\n        data[key] = transform.deserialize(data[key], transformMeta.options);\n      });\n      return data;\n    },\n    /**\n      The `normalizeResponse` method is used to normalize a payload from the\n      server to a JSON-API Document.\n       http://jsonapi.org/format/#document-structure\n       This method delegates to a more specific normalize method based on\n      the `requestType`.\n       To override this method with a custom one, make sure to call\n      `return super.normalizeResponse(store, primaryModelClass, payload, id, requestType)` with your\n      pre-processed data.\n       Here's an example of using `normalizeResponse` manually:\n       ```javascript\n      socket.on('message', function(message) {\n        let data = message.data;\n        let modelClass = store.modelFor(data.modelName);\n        let serializer = store.serializerFor(data.modelName);\n        let normalized = serializer.normalizeSingleResponse(store, modelClass, data, data.id);\n         store.push(normalized);\n      });\n      ```\n       @since 1.13.0\n      @method normalizeResponse\n      @public\n      @param {Store} store\n      @param {Model} primaryModelClass\n      @param {Object} payload\n      @param {String|Number} id\n      @param {String} requestType\n      @return {Object} JSON-API Document\n    */\n    normalizeResponse(store, primaryModelClass, payload, id, requestType) {\n      switch (requestType) {\n        case 'findRecord':\n          return this.normalizeFindRecordResponse(...arguments);\n        case 'queryRecord':\n          return this.normalizeQueryRecordResponse(...arguments);\n        case 'findAll':\n          return this.normalizeFindAllResponse(...arguments);\n        case 'findBelongsTo':\n          return this.normalizeFindBelongsToResponse(...arguments);\n        case 'findHasMany':\n          return this.normalizeFindHasManyResponse(...arguments);\n        case 'findMany':\n          return this.normalizeFindManyResponse(...arguments);\n        case 'query':\n          return this.normalizeQueryResponse(...arguments);\n        case 'createRecord':\n          return this.normalizeCreateRecordResponse(...arguments);\n        case 'deleteRecord':\n          return this.normalizeDeleteRecordResponse(...arguments);\n        case 'updateRecord':\n          return this.normalizeUpdateRecordResponse(...arguments);\n      }\n    },\n    /**\n      Called by the default normalizeResponse implementation when the\n      type of request is `findRecord`\n       @since 1.13.0\n      @method normalizeFindRecordResponse\n      @public\n      @param {Store} store\n      @param {Model} primaryModelClass\n      @param {Object} payload\n      @param {String|Number} id\n      @param {String} requestType\n      @return {Object} JSON-API Document\n    */\n    normalizeFindRecordResponse(store, primaryModelClass, payload, id, requestType) {\n      return this.normalizeSingleResponse(...arguments);\n    },\n    /**\n      Called by the default normalizeResponse implementation when the\n      type of request is `queryRecord`\n       @since 1.13.0\n      @method normalizeQueryRecordResponse\n      @public\n      @param {Store} store\n      @param {Model} primaryModelClass\n      @param {Object} payload\n      @param {String|Number} id\n      @param {String} requestType\n      @return {Object} JSON-API Document\n    */\n    normalizeQueryRecordResponse(store, primaryModelClass, payload, id, requestType) {\n      return this.normalizeSingleResponse(...arguments);\n    },\n    /**\n      Called by the default normalizeResponse implementation when the\n      type of request is `findAll`\n       @since 1.13.0\n      @method normalizeFindAllResponse\n      @public\n      @param {Store} store\n      @param {Model} primaryModelClass\n      @param {Object} payload\n      @param {String|Number} id\n      @param {String} requestType\n      @return {Object} JSON-API Document\n    */\n    normalizeFindAllResponse(store, primaryModelClass, payload, id, requestType) {\n      return this.normalizeArrayResponse(...arguments);\n    },\n    /**\n      Called by the default normalizeResponse implementation when the\n      type of request is `findBelongsTo`\n       @since 1.13.0\n      @method normalizeFindBelongsToResponse\n      @public\n      @param {Store} store\n      @param {Model} primaryModelClass\n      @param {Object} payload\n      @param {String|Number} id\n      @param {String} requestType\n      @return {Object} JSON-API Document\n    */\n    normalizeFindBelongsToResponse(store, primaryModelClass, payload, id, requestType) {\n      return this.normalizeSingleResponse(...arguments);\n    },\n    /**\n      Called by the default normalizeResponse implementation when the\n      type of request is `findHasMany`\n       @since 1.13.0\n      @method normalizeFindHasManyResponse\n      @public\n      @param {Store} store\n      @param {Model} primaryModelClass\n      @param {Object} payload\n      @param {String|Number} id\n      @param {String} requestType\n      @return {Object} JSON-API Document\n    */\n    normalizeFindHasManyResponse(store, primaryModelClass, payload, id, requestType) {\n      return this.normalizeArrayResponse(...arguments);\n    },\n    /**\n      Called by the default normalizeResponse implementation when the\n      type of request is `findMany`\n       @since 1.13.0\n      @method normalizeFindManyResponse\n      @public\n      @param {Store} store\n      @param {Model} primaryModelClass\n      @param {Object} payload\n      @param {String|Number} id\n      @param {String} requestType\n      @return {Object} JSON-API Document\n    */\n    normalizeFindManyResponse(store, primaryModelClass, payload, id, requestType) {\n      return this.normalizeArrayResponse(...arguments);\n    },\n    /**\n      Called by the default normalizeResponse implementation when the\n      type of request is `query`\n       @since 1.13.0\n      @method normalizeQueryResponse\n      @public\n      @param {Store} store\n      @param {Model} primaryModelClass\n      @param {Object} payload\n      @param {String|Number} id\n      @param {String} requestType\n      @return {Object} JSON-API Document\n    */\n    normalizeQueryResponse(store, primaryModelClass, payload, id, requestType) {\n      return this.normalizeArrayResponse(...arguments);\n    },\n    /**\n      Called by the default normalizeResponse implementation when the\n      type of request is `createRecord`\n       @since 1.13.0\n      @method normalizeCreateRecordResponse\n      @public\n      @param {Store} store\n      @param {Model} primaryModelClass\n      @param {Object} payload\n      @param {String|Number} id\n      @param {String} requestType\n      @return {Object} JSON-API Document\n    */\n    normalizeCreateRecordResponse(store, primaryModelClass, payload, id, requestType) {\n      return this.normalizeSaveResponse(...arguments);\n    },\n    /**\n      Called by the default normalizeResponse implementation when the\n      type of request is `deleteRecord`\n       @since 1.13.0\n      @method normalizeDeleteRecordResponse\n      @public\n      @param {Store} store\n      @param {Model} primaryModelClass\n      @param {Object} payload\n      @param {String|Number} id\n      @param {String} requestType\n      @return {Object} JSON-API Document\n    */\n    normalizeDeleteRecordResponse(store, primaryModelClass, payload, id, requestType) {\n      return this.normalizeSaveResponse(...arguments);\n    },\n    /**\n      Called by the default normalizeResponse implementation when the\n      type of request is `updateRecord`\n       @since 1.13.0\n      @method normalizeUpdateRecordResponse\n      @public\n      @param {Store} store\n      @param {Model} primaryModelClass\n      @param {Object} payload\n      @param {String|Number} id\n      @param {String} requestType\n      @return {Object} JSON-API Document\n    */\n    normalizeUpdateRecordResponse(store, primaryModelClass, payload, id, requestType) {\n      return this.normalizeSaveResponse(...arguments);\n    },\n    /**\n      normalizeUpdateRecordResponse, normalizeCreateRecordResponse and\n      normalizeDeleteRecordResponse delegate to this method by default.\n       @since 1.13.0\n      @method normalizeSaveResponse\n      @public\n      @param {Store} store\n      @param {Model} primaryModelClass\n      @param {Object} payload\n      @param {String|Number} id\n      @param {String} requestType\n      @return {Object} JSON-API Document\n    */\n    normalizeSaveResponse(store, primaryModelClass, payload, id, requestType) {\n      return this.normalizeSingleResponse(...arguments);\n    },\n    /**\n      normalizeQueryResponse and normalizeFindRecordResponse delegate to this\n      method by default.\n       @since 1.13.0\n      @method normalizeSingleResponse\n      @public\n      @param {Store} store\n      @param {Model} primaryModelClass\n      @param {Object} payload\n      @param {String|Number} id\n      @param {String} requestType\n      @return {Object} JSON-API Document\n    */\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n      return this._normalizeResponse(store, primaryModelClass, payload, id, requestType, true);\n    },\n    /**\n      normalizeQueryResponse, normalizeFindManyResponse, and normalizeFindHasManyResponse delegate\n      to this method by default.\n       @since 1.13.0\n      @method normalizeArrayResponse\n      @public\n      @param {Store} store\n      @param {Model} primaryModelClass\n      @param {Object} payload\n      @param {String|Number} id\n      @param {String} requestType\n      @return {Object} JSON-API Document\n    */\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n      return this._normalizeResponse(store, primaryModelClass, payload, id, requestType, false);\n    },\n    /**\n      @method _normalizeResponse\n      @param {Store} store\n      @param {Model} primaryModelClass\n      @param {Object} payload\n      @param {String|Number} id\n      @param {String} requestType\n      @param {Boolean} isSingle\n      @return {Object} JSON-API Document\n      @private\n    */\n    _normalizeResponse(store, primaryModelClass, payload, id, requestType, isSingle) {\n      let documentHash = {\n        data: null,\n        included: []\n      };\n      let meta = this.extractMeta(store, primaryModelClass, payload);\n      if (meta) {\n        (true && !((0, _utils.typeOf)(meta) === 'object') && (0, _debug.assert)('The `meta` returned from `extractMeta` has to be an object, not \"' + (0, _utils.typeOf)(meta) + '\".', (0, _utils.typeOf)(meta) === 'object'));\n        documentHash.meta = meta;\n      }\n      if (isSingle) {\n        let {\n          data,\n          included\n        } = this.normalize(primaryModelClass, payload);\n        documentHash.data = data;\n        if (included) {\n          documentHash.included = included;\n        }\n      } else {\n        let ret = new Array(payload.length);\n        for (let i = 0, l = payload.length; i < l; i++) {\n          let item = payload[i];\n          let {\n            data,\n            included\n          } = this.normalize(primaryModelClass, item);\n          if (included) {\n            documentHash.included = documentHash.included.concat(included);\n          }\n          ret[i] = data;\n        }\n        documentHash.data = ret;\n      }\n      return documentHash;\n    },\n    /**\n      Normalizes a part of the JSON payload returned by\n      the server. You should override this method, munge the hash\n      and call super if you have generic normalization to do.\n       It takes the type of the record that is being normalized\n      (as a Model class), the property where the hash was\n      originally found, and the hash to normalize.\n       You can use this method, for example, to normalize underscored keys to camelized\n      or other general-purpose normalizations.\n       Example\n       ```app/serializers/application.js\n      import JSONSerializer from '@ember-data/serializer/json';\n      import { underscore } from '<app-name>/utils/string-utils';\n      import { get } from '@ember/object';\n       export default class ApplicationSerializer extends JSONSerializer {\n        normalize(typeClass, hash) {\n          let fields = typeClass.fields;\n           fields.forEach(function(type, field) {\n            let payloadField = underscore(field);\n            if (field === payloadField) { return; }\n             hash[field] = hash[payloadField];\n            delete hash[payloadField];\n          });\n           return super.normalize(...arguments);\n        }\n      }\n      ```\n       @method normalize\n      @public\n      @param {Model} typeClass\n      @param {Object} hash\n      @return {Object}\n    */\n    normalize(modelClass, resourceHash) {\n      let data = null;\n      if (resourceHash) {\n        this.normalizeUsingDeclaredMapping(modelClass, resourceHash);\n        if ((0, _utils.typeOf)(resourceHash.links) === 'object') {\n          this.normalizeUsingDeclaredMapping(modelClass, resourceHash.links);\n        }\n        data = {\n          id: this.extractId(modelClass, resourceHash),\n          type: modelClass.modelName,\n          attributes: this.extractAttributes(modelClass, resourceHash),\n          relationships: this.extractRelationships(modelClass, resourceHash)\n        };\n        this.applyTransforms(modelClass, data.attributes);\n      }\n      return {\n        data\n      };\n    },\n    /**\n      Returns the resource's ID.\n       @method extractId\n      @public\n      @param {Object} modelClass\n      @param {Object} resourceHash\n      @return {String}\n    */\n    extractId(modelClass, resourceHash) {\n      let primaryKey = this.primaryKey;\n      let id = resourceHash[primaryKey];\n      return (0, _private.coerceId)(id);\n    },\n    /**\n      Returns the resource's attributes formatted as a JSON-API \"attributes object\".\n       http://jsonapi.org/format/#document-resource-object-attributes\n       @method extractAttributes\n      @public\n      @param {Object} modelClass\n      @param {Object} resourceHash\n      @return {Object}\n    */\n    extractAttributes(modelClass, resourceHash) {\n      let attributeKey;\n      let attributes = {};\n      modelClass.eachAttribute(key => {\n        attributeKey = this.keyForAttribute(key, 'deserialize');\n        if (resourceHash[attributeKey] !== undefined) {\n          attributes[key] = resourceHash[attributeKey];\n        }\n      });\n      return attributes;\n    },\n    /**\n      Returns a relationship formatted as a JSON-API \"relationship object\".\n       http://jsonapi.org/format/#document-resource-object-relationships\n       @method extractRelationship\n      @public\n      @param {Object} relationshipModelName\n      @param {Object} relationshipHash\n      @return {Object}\n    */\n    extractRelationship(relationshipModelName, relationshipHash) {\n      if ((0, _utils.isNone)(relationshipHash)) {\n        return null;\n      }\n      /*\n        When `relationshipHash` is an object it usually means that the relationship\n        is polymorphic. It could however also be embedded resources that the\n        EmbeddedRecordsMixin has be able to process.\n      */\n      if ((0, _utils.typeOf)(relationshipHash) === 'object') {\n        if (relationshipHash.id) {\n          relationshipHash.id = (0, _private.coerceId)(relationshipHash.id);\n        }\n        let modelClass = this.store.modelFor(relationshipModelName);\n        if (relationshipHash.type && !modelClass.fields.has('type')) {\n          relationshipHash.type = this.modelNameFromPayloadKey(relationshipHash.type);\n        }\n        return relationshipHash;\n      }\n      return {\n        id: (0, _private.coerceId)(relationshipHash),\n        type: relationshipModelName\n      };\n    },\n    /**\n      Returns a polymorphic relationship formatted as a JSON-API \"relationship object\".\n       http://jsonapi.org/format/#document-resource-object-relationships\n       `relationshipOptions` is a hash which contains more information about the\n      polymorphic relationship which should be extracted:\n        - `resourceHash` complete hash of the resource the relationship should be\n          extracted from\n        - `relationshipKey` key under which the value for the relationship is\n          extracted from the resourceHash\n        - `relationshipMeta` meta information about the relationship\n       @method extractPolymorphicRelationship\n      @public\n      @param {Object} relationshipModelName\n      @param {Object} relationshipHash\n      @param {Object} relationshipOptions\n      @return {Object}\n    */\n    extractPolymorphicRelationship(relationshipModelName, relationshipHash, relationshipOptions) {\n      return this.extractRelationship(relationshipModelName, relationshipHash);\n    },\n    /**\n      Returns the resource's relationships formatted as a JSON-API \"relationships object\".\n       http://jsonapi.org/format/#document-resource-object-relationships\n       @method extractRelationships\n      @public\n      @param {Object} modelClass\n      @param {Object} resourceHash\n      @return {Object}\n    */\n    extractRelationships(modelClass, resourceHash) {\n      let relationships = {};\n      modelClass.eachRelationship((key, relationshipMeta) => {\n        let relationship = null;\n        let relationshipKey = this.keyForRelationship(key, relationshipMeta.kind, 'deserialize');\n        if (resourceHash[relationshipKey] !== undefined) {\n          let data = null;\n          let relationshipHash = resourceHash[relationshipKey];\n          if (relationshipMeta.kind === 'belongsTo') {\n            if (relationshipMeta.options.polymorphic) {\n              // extracting a polymorphic belongsTo may need more information\n              // than the type and the hash (which might only be an id) for the\n              // relationship, hence we pass the key, resource and\n              // relationshipMeta too\n              data = this.extractPolymorphicRelationship(relationshipMeta.type, relationshipHash, {\n                key,\n                resourceHash,\n                relationshipMeta\n              });\n            } else {\n              data = this.extractRelationship(relationshipMeta.type, relationshipHash);\n            }\n          } else if (relationshipMeta.kind === 'hasMany') {\n            if (!(0, _utils.isNone)(relationshipHash)) {\n              data = new Array(relationshipHash.length);\n              if (relationshipMeta.options.polymorphic) {\n                for (let i = 0, l = relationshipHash.length; i < l; i++) {\n                  let item = relationshipHash[i];\n                  data[i] = this.extractPolymorphicRelationship(relationshipMeta.type, item, {\n                    key,\n                    resourceHash,\n                    relationshipMeta\n                  });\n                }\n              } else {\n                for (let i = 0, l = relationshipHash.length; i < l; i++) {\n                  let item = relationshipHash[i];\n                  data[i] = this.extractRelationship(relationshipMeta.type, item);\n                }\n              }\n            }\n          }\n          relationship = {\n            data\n          };\n        }\n        let linkKey = this.keyForLink(key, relationshipMeta.kind);\n        if (resourceHash.links && resourceHash.links[linkKey] !== undefined) {\n          let related = resourceHash.links[linkKey];\n          relationship = relationship || {};\n          relationship.links = {\n            related\n          };\n        }\n        if (relationship) {\n          relationships[key] = relationship;\n        }\n      });\n      return relationships;\n    },\n    /**\n      Dasherizes the model name in the payload\n       @method modelNameFromPayloadKey\n      @public\n      @param {String} key\n      @return {String} the model's modelName\n    */\n    modelNameFromPayloadKey(key) {\n      return (0, _string.dasherize)(key);\n    },\n    /**\n      @method normalizeRelationships\n      @private\n    */\n    normalizeRelationships(typeClass, hash) {\n      let payloadKey;\n      if (this.keyForRelationship) {\n        typeClass.eachRelationship((key, relationship) => {\n          payloadKey = this.keyForRelationship(key, relationship.kind, 'deserialize');\n          if (key === payloadKey) {\n            return;\n          }\n          if (hash[payloadKey] === undefined) {\n            return;\n          }\n          hash[key] = hash[payloadKey];\n          delete hash[payloadKey];\n        });\n      }\n    },\n    /**\n      @method normalizeUsingDeclaredMapping\n      @private\n    */\n    normalizeUsingDeclaredMapping(modelClass, hash) {\n      let attrs = this.attrs;\n      let normalizedKey;\n      let payloadKey;\n      if (attrs) {\n        for (let key in attrs) {\n          normalizedKey = payloadKey = this._getMappedKey(key, modelClass);\n          if (hash[payloadKey] === undefined) {\n            continue;\n          }\n          if (modelClass.attributes.has(key)) {\n            normalizedKey = this.keyForAttribute(key, 'deserialize');\n          }\n          if (modelClass.relationshipsByName.has(key)) {\n            normalizedKey = this.keyForRelationship(key, modelClass, 'deserialize');\n          }\n          if (payloadKey !== normalizedKey) {\n            hash[normalizedKey] = hash[payloadKey];\n            delete hash[payloadKey];\n          }\n        }\n      }\n    },\n    /**\n      Looks up the property key that was set by the custom `attr` mapping\n      passed to the serializer.\n       @method _getMappedKey\n      @private\n      @param {String} key\n      @return {String} key\n    */\n    _getMappedKey(key, modelClass) {\n      (true && (0, _debug.warn)('There is no attribute or relationship with the name `' + key + '` on `' + modelClass.modelName + '`. Check your serializers attrs hash.', modelClass.attributes.has(key) || modelClass.relationshipsByName.has(key), {\n        id: 'ds.serializer.no-mapped-attrs-key'\n      }));\n      let attrs = this.attrs;\n      let mappedKey;\n      if (attrs && attrs[key]) {\n        mappedKey = attrs[key];\n        //We need to account for both the { title: 'post_title' } and\n        //{ title: { key: 'post_title' }} forms\n        if (mappedKey.key) {\n          mappedKey = mappedKey.key;\n        }\n        if (typeof mappedKey === 'string') {\n          key = mappedKey;\n        }\n      }\n      return key;\n    },\n    /**\n      Check attrs.key.serialize property to inform if the `key`\n      can be serialized\n       @method _canSerialize\n      @private\n      @param {String} key\n      @return {boolean} true if the key can be serialized\n    */\n    _canSerialize(key) {\n      let attrs = this.attrs;\n      return !attrs || !attrs[key] || attrs[key].serialize !== false;\n    },\n    /**\n      When attrs.key.serialize is set to true then\n      it takes priority over the other checks and the related\n      attribute/relationship will be serialized\n       @method _mustSerialize\n      @private\n      @param {String} key\n      @return {boolean} true if the key must be serialized\n    */\n    _mustSerialize(key) {\n      let attrs = this.attrs;\n      return attrs && attrs[key] && attrs[key].serialize === true;\n    },\n    /**\n      Check if the given hasMany relationship should be serialized\n       By default only many-to-many and many-to-none relationships are serialized.\n      This could be configured per relationship by Serializer's `attrs` object.\n       @method shouldSerializeHasMany\n      @public\n      @param {Snapshot} snapshot\n      @param {String} key\n      @param {String} relationshipType\n      @return {boolean} true if the hasMany relationship should be serialized\n    */\n    shouldSerializeHasMany(snapshot, key, relationship) {\n      const schema = this.store.modelFor(snapshot.modelName);\n      let relationshipType = schema.determineRelationshipType(relationship, this.store);\n      if (this._mustSerialize(key)) {\n        return true;\n      }\n      return this._canSerialize(key) && (relationshipType === 'manyToNone' || relationshipType === 'manyToMany');\n    },\n    // SERIALIZE\n    /**\n      Called when a record is saved in order to convert the\n      record into JSON.\n       By default, it creates a JSON object with a key for\n      each attribute and belongsTo relationship.\n       For example, consider this model:\n       ```app/models/comment.js\n      import Model, { attr, belongsTo } from '@ember-data/model';\n       export default class CommentModel extends Model {\n        @attr title;\n        @attr body;\n         @belongsTo('user') author;\n      }\n      ```\n       The default serialization would create a JSON object like:\n       ```javascript\n      {\n        \"title\": \"Rails is unagi\",\n        \"body\": \"Rails? Omakase? O_O\",\n        \"author\": 12\n      }\n      ```\n       By default, attributes are passed through as-is, unless\n      you specified an attribute type (`attr('date')`). If\n      you specify a transform, the JavaScript value will be\n      serialized when inserted into the JSON hash.\n       By default, belongs-to relationships are converted into\n      IDs when inserted into the JSON hash.\n       ## IDs\n       `serialize` takes an options hash with a single option:\n      `includeId`. If this option is `true`, `serialize` will,\n      by default include the ID in the JSON object it builds.\n       The adapter passes in `includeId: true` when serializing\n      a record for `createRecord`, but not for `updateRecord`.\n       ## Customization\n       Your server may expect a different JSON format than the\n      built-in serialization format.\n       In that case, you can implement `serialize` yourself and\n      return a JSON hash of your choosing.\n       ```app/serializers/post.js\n      import JSONSerializer from '@ember-data/serializer/json';\n       export default class PostSerializer extends JSONSerializer {\n        serialize(snapshot, options) {\n          let json = {\n            POST_TTL: snapshot.attr('title'),\n            POST_BDY: snapshot.attr('body'),\n            POST_CMS: snapshot.hasMany('comments', { ids: true })\n          };\n           if (options.includeId) {\n            json.POST_ID_ = snapshot.id;\n          }\n           return json;\n        }\n      }\n      ```\n       ## Customizing an App-Wide Serializer\n       If you want to define a serializer for your entire\n      application, you'll probably want to use `eachAttribute`\n      and `eachRelationship` on the record.\n       ```app/serializers/application.js\n      import JSONSerializer from '@ember-data/serializer/json';\n      import { singularize } from '<app-name>/utils/string-utils';\n       export default class ApplicationSerializer extends JSONSerializer {\n        serialize(snapshot, options) {\n          let json = {};\n           snapshot.eachAttribute((name) => {\n            json[serverAttributeName(name)] = snapshot.attr(name);\n          });\n           snapshot.eachRelationship((name, relationship) => {\n            if (relationship.kind === 'hasMany') {\n              json[serverHasManyName(name)] = snapshot.hasMany(name, { ids: true });\n            }\n          });\n           if (options.includeId) {\n            json.ID_ = snapshot.id;\n          }\n           return json;\n        }\n      }\n       function serverAttributeName(attribute) {\n        return attribute.underscore().toUpperCase();\n      }\n       function serverHasManyName(name) {\n        return serverAttributeName(singularize(name)) + \"_IDS\";\n      }\n      ```\n       This serializer will generate JSON that looks like this:\n       ```javascript\n      {\n        \"TITLE\": \"Rails is omakase\",\n        \"BODY\": \"Yep. Omakase.\",\n        \"COMMENT_IDS\": [ \"1\", \"2\", \"3\" ]\n      }\n      ```\n       ## Tweaking the Default JSON\n       If you just want to do some small tweaks on the default JSON,\n      you can call `super.serialize` first and make the tweaks on\n      the returned JSON.\n       ```app/serializers/post.js\n      import JSONSerializer from '@ember-data/serializer/json';\n       export default class PostSerializer extends JSONSerializer {\n        serialize(snapshot, options) {\n          let json = super.serialize(...arguments);\n           json.subject = json.title;\n          delete json.title;\n           return json;\n        }\n      }\n      ```\n       @method serialize\n      @public\n      @param {Snapshot} snapshot\n      @param {Object} options\n      @return {Object} json\n    */\n    serialize(snapshot, options) {\n      let json = {};\n      if (options && options.includeId) {\n        const id = snapshot.id;\n        if (id) {\n          json[this.primaryKey] = id;\n        }\n      }\n      snapshot.eachAttribute((key, attribute) => {\n        this.serializeAttribute(snapshot, json, key, attribute);\n      });\n      snapshot.eachRelationship((key, relationship) => {\n        if (relationship.kind === 'belongsTo') {\n          this.serializeBelongsTo(snapshot, json, relationship);\n        } else if (relationship.kind === 'hasMany') {\n          this.serializeHasMany(snapshot, json, relationship);\n        }\n      });\n      return json;\n    },\n    /**\n      You can use this method to customize how a serialized record is added to the complete\n      JSON hash to be sent to the server. By default the JSON Serializer does not namespace\n      the payload and just sends the raw serialized JSON object.\n      If your server expects namespaced keys, you should consider using the RESTSerializer.\n      Otherwise you can override this method to customize how the record is added to the hash.\n      The hash property should be modified by reference.\n       For example, your server may expect underscored root objects.\n       ```app/serializers/application.js\n      import RESTSerializer from '@ember-data/serializer/rest';\n      import { decamelize } from '<app-name>/utils/string-utils';\n       export default class ApplicationSerializer extends RESTSerializer {\n        serializeIntoHash(data, type, snapshot, options) {\n          let root = decamelize(type.modelName);\n          data[root] = this.serialize(snapshot, options);\n        }\n      }\n      ```\n       @method serializeIntoHash\n      @public\n      @param {Object} hash\n      @param {Model} typeClass\n      @param {Snapshot} snapshot\n      @param {Object} options\n    */\n    serializeIntoHash(hash, typeClass, snapshot, options) {\n      Object.assign(hash, this.serialize(snapshot, options));\n    },\n    /**\n      `serializeAttribute` can be used to customize how `attr`\n      properties are serialized\n       For example if you wanted to ensure all your attributes were always\n      serialized as properties on an `attributes` object you could\n      write:\n       ```app/serializers/application.js\n      import JSONSerializer from '@ember-data/serializer/json';\n       export default class ApplicationSerializer extends JSONSerializer {\n        serializeAttribute(snapshot, json, key, attributes) {\n          json.attributes = json.attributes || {};\n          super.serializeAttribute(snapshot, json.attributes, key, attributes);\n        }\n      }\n      ```\n       @method serializeAttribute\n      @public\n      @param {Snapshot} snapshot\n      @param {Object} json\n      @param {String} key\n      @param {Object} attribute\n    */\n    serializeAttribute(snapshot, json, key, attribute) {\n      if (this._canSerialize(key)) {\n        let type = attribute.type;\n        let value = snapshot.attr(key);\n        if (type) {\n          let transform = this.transformFor(type);\n          value = transform.serialize(value, attribute.options);\n        }\n\n        // if provided, use the mapping provided by `attrs` in\n        // the serializer\n        let schema = this.store.modelFor(snapshot.modelName);\n        let payloadKey = this._getMappedKey(key, schema);\n        if (payloadKey === key && this.keyForAttribute) {\n          payloadKey = this.keyForAttribute(key, 'serialize');\n        }\n        json[payloadKey] = value;\n      }\n    },\n    /**\n      `serializeBelongsTo` can be used to customize how `belongsTo`\n      properties are serialized.\n       Example\n       ```app/serializers/post.js\n      import JSONSerializer from '@ember-data/serializer/json';\n      import { isNone } from '@ember/utils';\n       export default class PostSerializer extends JSONSerializer {\n        serializeBelongsTo(snapshot, json, relationship) {\n          let key = relationship.key;\n          let belongsTo = snapshot.belongsTo(key);\n           key = this.keyForRelationship ? this.keyForRelationship(key, \"belongsTo\", \"serialize\") : key;\n           json[key] = isNone(belongsTo) ? belongsTo : belongsTo.record.toJSON();\n        }\n      }\n      ```\n       @method serializeBelongsTo\n      @public\n      @param {Snapshot} snapshot\n      @param {Object} json\n      @param {Object} relationship\n    */\n    serializeBelongsTo(snapshot, json, relationship) {\n      let key = relationship.key;\n      if (this._canSerialize(key)) {\n        let belongsToId = snapshot.belongsTo(key, {\n          id: true\n        });\n\n        // if provided, use the mapping provided by `attrs` in\n        // the serializer\n        let schema = this.store.modelFor(snapshot.modelName);\n        let payloadKey = this._getMappedKey(key, schema);\n        if (payloadKey === key && this.keyForRelationship) {\n          payloadKey = this.keyForRelationship(key, 'belongsTo', 'serialize');\n        }\n\n        //Need to check whether the id is there for new&async records\n        if ((0, _utils.isNone)(belongsToId)) {\n          json[payloadKey] = null;\n        } else {\n          json[payloadKey] = belongsToId;\n        }\n        if (relationship.options.polymorphic) {\n          this.serializePolymorphicType(snapshot, json, relationship);\n        }\n      }\n    },\n    /**\n     `serializeHasMany` can be used to customize how `hasMany`\n     properties are serialized.\n      Example\n      ```app/serializers/post.js\n     import JSONSerializer from '@ember-data/serializer/json';\n      export default class PostSerializer extends JSONSerializer {\n       serializeHasMany(snapshot, json, relationship) {\n         let key = relationship.key;\n         if (key === 'comments') {\n           return;\n         } else {\n           super.serializeHasMany(...arguments);\n         }\n       }\n     }\n     ```\n      @method serializeHasMany\n      @public\n     @param {Snapshot} snapshot\n     @param {Object} json\n     @param {Object} relationship\n    */\n    serializeHasMany(snapshot, json, relationship) {\n      let key = relationship.key;\n      if (this.shouldSerializeHasMany(snapshot, key, relationship)) {\n        let hasMany = snapshot.hasMany(key, {\n          ids: true\n        });\n        if (hasMany !== undefined) {\n          // if provided, use the mapping provided by `attrs` in\n          // the serializer\n          let schema = this.store.modelFor(snapshot.modelName);\n          let payloadKey = this._getMappedKey(key, schema);\n          if (payloadKey === key && this.keyForRelationship) {\n            payloadKey = this.keyForRelationship(key, 'hasMany', 'serialize');\n          }\n          json[payloadKey] = hasMany;\n          // TODO support for polymorphic manyToNone and manyToMany relationships\n        }\n      }\n    },\n    /**\n      You can use this method to customize how polymorphic objects are\n      serialized. Objects are considered to be polymorphic if\n      `{ polymorphic: true }` is pass as the second argument to the\n      `belongsTo` function.\n       Example\n       ```app/serializers/comment.js\n      import JSONSerializer from '@ember-data/serializer/json';\n      import { isNone } from '@ember/utils';\n       export default class CommentSerializer extends JSONSerializer {\n        serializePolymorphicType(snapshot, json, relationship) {\n          let key = relationship.key;\n          let belongsTo = snapshot.belongsTo(key);\n           key = this.keyForAttribute ? this.keyForAttribute(key, 'serialize') : key;\n           if (isNone(belongsTo)) {\n            json[key + '_type'] = null;\n          } else {\n            json[key + '_type'] = belongsTo.modelName;\n          }\n        }\n      }\n      ```\n       @method serializePolymorphicType\n      @public\n      @param {Snapshot} snapshot\n      @param {Object} json\n      @param {Object} relationship\n    */\n    serializePolymorphicType() {},\n    /**\n      `extractMeta` is used to deserialize any meta information in the\n      adapter payload. By default Ember Data expects meta information to\n      be located on the `meta` property of the payload object.\n       Example\n       ```app/serializers/post.js\n      import JSONSerializer from '@ember-data/serializer/json';\n       export default class PostSerializer extends JSONSerializer {\n        extractMeta(store, typeClass, payload) {\n          if (payload && payload.hasOwnProperty('_pagination')) {\n            let meta = payload._pagination;\n            delete payload._pagination;\n            return meta;\n          }\n        }\n      }\n      ```\n       @method extractMeta\n      @public\n      @param {Store} store\n      @param {Model} modelClass\n      @param {Object} payload\n    */\n    extractMeta(store, modelClass, payload) {\n      if (payload && payload['meta'] !== undefined) {\n        let meta = payload.meta;\n        delete payload.meta;\n        return meta;\n      }\n    },\n    /**\n      `extractErrors` is used to extract model errors when a call\n      to `Model#save` fails with an `InvalidError`. By default\n      Ember Data expects error information to be located on the `errors`\n      property of the payload object.\n       This serializer expects this `errors` object to be an Array similar\n      to the following, compliant with the https://jsonapi.org/format/#errors specification:\n       ```js\n      {\n        \"errors\": [\n          {\n            \"detail\": \"This username is already taken!\",\n            \"source\": {\n              \"pointer\": \"data/attributes/username\"\n            }\n          }, {\n            \"detail\": \"Doesn't look like a valid email.\",\n            \"source\": {\n              \"pointer\": \"data/attributes/email\"\n            }\n          }\n        ]\n      }\n      ```\n       The key `detail` provides a textual description of the problem.\n      Alternatively, the key `title` can be used for the same purpose.\n       The nested keys `source.pointer` detail which specific element\n      of the request data was invalid.\n       Note that JSON-API also allows for object-level errors to be placed\n      in an object with pointer `data`, signifying that the problem\n      cannot be traced to a specific attribute:\n       ```javascript\n      {\n        \"errors\": [\n          {\n            \"detail\": \"Some generic non property error message\",\n            \"source\": {\n              \"pointer\": \"data\"\n            }\n          }\n        ]\n      }\n      ```\n       When turn into a `Errors` object, you can read these errors\n      through the property `base`:\n       ```handlebars\n      {{#each @model.errors.base as |error|}}\n        <div class=\"error\">\n          {{error.message}}\n        </div>\n      {{/each}}\n      ```\n       Example of alternative implementation, overriding the default\n      behavior to deal with a different format of errors:\n       ```app/serializers/post.js\n      import JSONSerializer from '@ember-data/serializer/json';\n       export default class PostSerializer extends JSONSerializer {\n        extractErrors(store, typeClass, payload, id) {\n          if (payload && typeof payload === 'object' && payload._problems) {\n            payload = payload._problems;\n            this.normalizeErrors(typeClass, payload);\n          }\n          return payload;\n        }\n      }\n      ```\n       @method extractErrors\n      @public\n      @param {Store} store\n      @param {Model} typeClass\n      @param {Object} payload\n      @param {(String|Number)} id\n      @return {Object} json The deserialized errors\n    */\n    extractErrors(store, typeClass, payload, id) {\n      if (payload && typeof payload === 'object' && payload.errors) {\n        // the default assumption is that errors is already in JSON:API format\n        const extracted = {};\n        payload.errors.forEach(error => {\n          if (error.source && error.source.pointer) {\n            let key = error.source.pointer.match(SOURCE_POINTER_REGEXP);\n            if (key) {\n              key = key[2];\n            } else if (error.source.pointer.search(SOURCE_POINTER_PRIMARY_REGEXP) !== -1) {\n              key = PRIMARY_ATTRIBUTE_KEY;\n            }\n            if (key) {\n              extracted[key] = extracted[key] || [];\n              extracted[key].push(error.detail || error.title);\n            }\n          }\n        });\n\n        // if the user has an attrs hash, convert keys using it\n        this.normalizeUsingDeclaredMapping(typeClass, extracted);\n\n        // for each attr and relationship, make sure that we use\n        // the normalized key\n        typeClass.eachAttribute(name => {\n          let key = this.keyForAttribute(name, 'deserialize');\n          if (key !== name && extracted[key] !== undefined) {\n            extracted[name] = extracted[key];\n            delete extracted[key];\n          }\n        });\n        typeClass.eachRelationship(name => {\n          let key = this.keyForRelationship(name, 'deserialize');\n          if (key !== name && extracted[key] !== undefined) {\n            extracted[name] = extracted[key];\n            delete extracted[key];\n          }\n        });\n        return extracted;\n      }\n      return payload;\n    },\n    /**\n      `keyForAttribute` can be used to define rules for how to convert an\n      attribute name in your model to a key in your JSON.\n       Example\n       ```app/serializers/application.js\n      import JSONSerializer from '@ember-data/serializer/json';\n      import { underscore } from '<app-name>/utils/string-utils';\n       export default class ApplicationSerializer extends JSONSerializer {\n        keyForAttribute(attr, method) {\n          return underscore(attr).toUpperCase();\n        }\n      }\n      ```\n       @method keyForAttribute\n      @public\n      @param {String} key\n      @param {String} method\n      @return {String} normalized key\n    */\n    keyForAttribute(key, method) {\n      return key;\n    },\n    /**\n      `keyForRelationship` can be used to define a custom key when\n      serializing and deserializing relationship properties. By default\n      `JSONSerializer` does not provide an implementation of this method.\n       Example\n         ```app/serializers/post.js\n        import JSONSerializer from '@ember-data/serializer/json';\n        import { underscore } from '<app-name>/utils/string-utils';\n         export default class PostSerializer extends JSONSerializer {\n          keyForRelationship(key, relationship, method) {\n            return `rel_${underscore(key)}`;\n          }\n        }\n        ```\n       @method keyForRelationship\n      @public\n      @param {String} key\n      @param {String} typeClass\n      @param {String} method\n      @return {String} normalized key\n    */\n    keyForRelationship(key, typeClass, method) {\n      return key;\n    },\n    /**\n     `keyForLink` can be used to define a custom key when deserializing link\n     properties.\n      @method keyForLink\n      @public\n     @param {String} key\n     @param {String} kind `belongsTo` or `hasMany`\n     @return {String} normalized key\n    */\n    keyForLink(key, kind) {\n      return key;\n    },\n    // HELPERS\n\n    /**\n     @method transformFor\n     @private\n     @param {String} attributeType\n     @param {Boolean} skipAssertion\n     @return {Transform} transform\n    */\n    transformFor(attributeType, skipAssertion) {\n      let transform = (0, _application.getOwner)(this).lookup('transform:' + attributeType);\n      (true && !(skipAssertion || !!transform) && (0, _debug.assert)(`Unable to find the transform for \\`attr('${attributeType}')\\``, skipAssertion || !!transform));\n      return transform;\n    }\n  });\n  var _default = JSONSerializer;\n  _exports.default = _default;\n});","define(\"@ember-data/serializer/rest\", [\"exports\", \"@embroider/macros/runtime\", \"@ember/debug\", \"@ember/string\", \"@ember/utils\", \"ember-inflector\", \"@ember-data/serializer/json\", \"@ember-data/store/-private\", \"@ember-data/serializer/-private\"], function (_exports, _runtime, _debug, _string, _utils, _emberInflector, _json, _private, _private2) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"EmbeddedRecordsMixin\", {\n    enumerable: true,\n    get: function () {\n      return _private2.EmbeddedRecordsMixin;\n    }\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/debug\",0,\"@ember/string\",0,\"@ember/utils\",0,\"@glimmer/env\",0,\"ember-inflector\",0,\"@ember-data/serializer/json\",0,\"@ember-data/store/-private\",0,\"@ember-data/serializer/-private\"eaimeta@70e063a35619d71f\n  /**\n   * @module @ember-data/serializer/rest\n   */\n  function makeArray(value) {\n    return Array.isArray(value) ? value : [value];\n  }\n\n  /**\n    Normally, applications will use the `RESTSerializer` by implementing\n    the `normalize` method.\n  \n    This allows you to do whatever kind of munging you need and is\n    especially useful if your server is inconsistent and you need to\n    do munging differently for many different kinds of responses.\n  \n    See the `normalize` documentation for more information.\n  \n    ## Across the Board Normalization\n  \n    There are also a number of hooks that you might find useful to define\n    across-the-board rules for your payload. These rules will be useful\n    if your server is consistent, or if you're building an adapter for\n    an infrastructure service, like Firebase, and want to encode service\n    conventions.\n  \n    For example, if all of your keys are underscored and all-caps, but\n    otherwise consistent with the names you use in your models, you\n    can implement across-the-board rules for how to convert an attribute\n    name in your model to a key in your JSON.\n  \n    ```app/serializers/application.js\n    import RESTSerializer from '@ember-data/serializer/rest';\n    import { underscore } from '<app-name>/utils/string-utils';\n  \n    export default class ApplicationSerializer extends RESTSerializer {\n      keyForAttribute(attr, method) {\n        return underscore(attr).toUpperCase();\n      }\n    }\n    ```\n  \n    You can also implement `keyForRelationship`, which takes the name\n    of the relationship as the first parameter, the kind of\n    relationship (`hasMany` or `belongsTo`) as the second parameter, and\n    the method (`serialize` or `deserialize`) as the third parameter.\n  \n    @class RESTSerializer\n    @main @ember-data/serializer/rest\n    @public\n    @extends JSONSerializer\n  */\n  const RESTSerializer = _json.default.extend({\n    /**\n     `keyForPolymorphicType` can be used to define a custom key when\n     serializing and deserializing a polymorphic type. By default, the\n     returned key is `${key}Type`.\n      Example\n       ```app/serializers/post.js\n      import RESTSerializer from '@ember-data/serializer/rest';\n       export default class ApplicationSerializer extends RESTSerializer {\n        keyForPolymorphicType(key, relationship) {\n          let relationshipKey = this.keyForRelationship(key);\n           return 'type-' + relationshipKey;\n        }\n      }\n      ```\n      @method keyForPolymorphicType\n      @public\n     @param {String} key\n     @param {String} typeClass\n     @param {String} method\n     @return {String} normalized key\n    */\n    keyForPolymorphicType(key, typeClass, method) {\n      let relationshipKey = this.keyForRelationship(key);\n      return `${relationshipKey}Type`;\n    },\n    /**\n      Normalizes a part of the JSON payload returned by\n      the server. You should override this method, munge the hash\n      and call super if you have generic normalization to do.\n       It takes the type of the record that is being normalized\n      (as a Model class), the property where the hash was\n      originally found, and the hash to normalize.\n       For example, if you have a payload that looks like this:\n       ```js\n      {\n        \"post\": {\n          \"id\": 1,\n          \"title\": \"Rails is omakase\",\n          \"comments\": [ 1, 2 ]\n        },\n        \"comments\": [{\n          \"id\": 1,\n          \"body\": \"FIRST\"\n        }, {\n          \"id\": 2,\n          \"body\": \"Rails is unagi\"\n        }]\n      }\n      ```\n       The `normalize` method will be called three times:\n       * With `App.Post`, `\"posts\"` and `{ id: 1, title: \"Rails is omakase\", ... }`\n      * With `App.Comment`, `\"comments\"` and `{ id: 1, body: \"FIRST\" }`\n      * With `App.Comment`, `\"comments\"` and `{ id: 2, body: \"Rails is unagi\" }`\n       You can use this method, for example, to normalize underscored keys to camelized\n      or other general-purpose normalizations. You will only need to implement\n      `normalize` and manipulate the payload as desired.\n       For example, if the `IDs` under `\"comments\"` are provided as `_id` instead of\n      `id`, you can specify how to normalize just the comments:\n       ```app/serializers/post.js\n      import RESTSerializer from '@ember-data/serializer/rest';\n       export default class ApplicationSerializer extends RESTSerializer {\n        normalize(model, hash, prop) {\n          if (prop === 'comments') {\n            hash.id = hash._id;\n            delete hash._id;\n          }\n           return super.normalize(...arguments);\n        }\n      }\n      ```\n       On each call to the `normalize` method, the third parameter (`prop`) is always\n      one of the keys that were in the original payload or in the result of another\n      normalization as `normalizeResponse`.\n       @method normalize\n      @public\n      @param {Model} modelClass\n      @param {Object} resourceHash\n      @param {String} prop\n      @return {Object}\n    */\n\n    /**\n      Normalizes an array of resource payloads and returns a JSON-API Document\n      with primary data and, if any, included data as `{ data, included }`.\n       @method _normalizeArray\n      @param {Store} store\n      @param {String} modelName\n      @param {Object} arrayHash\n      @param {String} prop\n      @return {Object}\n      @private\n    */\n    _normalizeArray(store, modelName, arrayHash, prop) {\n      let documentHash = {\n        data: [],\n        included: []\n      };\n      let modelClass = store.modelFor(modelName);\n      let serializer = store.serializerFor(modelName);\n      makeArray(arrayHash).forEach(hash => {\n        let {\n          data,\n          included\n        } = this._normalizePolymorphicRecord(store, hash, prop, modelClass, serializer);\n        documentHash.data.push(data);\n        if (included) {\n          documentHash.included = documentHash.included.concat(included);\n        }\n      });\n      return documentHash;\n    },\n    _normalizePolymorphicRecord(store, hash, prop, primaryModelClass, primarySerializer) {\n      let serializer = primarySerializer;\n      let modelClass = primaryModelClass;\n      let primaryHasTypeAttribute = primaryModelClass.fields.has('type');\n      if (!primaryHasTypeAttribute && hash.type) {\n        // Support polymorphic records in async relationships\n        let modelName = this.modelNameFromPayloadKey(hash.type);\n        if (store.getSchemaDefinitionService().doesTypeExist(modelName)) {\n          serializer = store.serializerFor(modelName);\n          modelClass = store.modelFor(modelName);\n        }\n      }\n      return serializer.normalize(modelClass, hash, prop);\n    },\n    /**\n      @method _normalizeResponse\n      @param {Store} store\n      @param {Model} primaryModelClass\n      @param {Object} payload\n      @param {String|Number} id\n      @param {String} requestType\n      @param {Boolean} isSingle\n      @return {Object} JSON-API Document\n      @private\n    */\n    _normalizeResponse(store, primaryModelClass, payload, id, requestType, isSingle) {\n      let documentHash = {\n        data: null,\n        included: []\n      };\n      let meta = this.extractMeta(store, primaryModelClass, payload);\n      if (meta) {\n        (true && !((0, _utils.typeOf)(meta) === 'object') && (0, _debug.assert)('The `meta` returned from `extractMeta` has to be an object, not \"' + (0, _utils.typeOf)(meta) + '\".', (0, _utils.typeOf)(meta) === 'object'));\n        documentHash.meta = meta;\n      }\n      let keys = Object.keys(payload);\n      for (var i = 0, length = keys.length; i < length; i++) {\n        var prop = keys[i];\n        var modelName = prop;\n        var forcedSecondary = false;\n\n        /*\n          If you want to provide sideloaded records of the same type that the\n          primary data you can do that by prefixing the key with `_`.\n           Example\n           ```\n          {\n            users: [\n              { id: 1, title: 'Tom', manager: 3 },\n              { id: 2, title: 'Yehuda', manager: 3 }\n            ],\n            _users: [\n              { id: 3, title: 'Tomster' }\n            ]\n          }\n          ```\n           This forces `_users` to be added to `included` instead of `data`.\n         */\n        if (prop.charAt(0) === '_') {\n          forcedSecondary = true;\n          modelName = prop.substr(1);\n        }\n        var typeName = this.modelNameFromPayloadKey(modelName);\n        if (!store.getSchemaDefinitionService().doesTypeExist(typeName)) {\n          (true && (0, _debug.warn)(this.warnMessageNoModelForKey(modelName, typeName), false, {\n            id: 'ds.serializer.model-for-key-missing'\n          }));\n          continue;\n        }\n        var isPrimary = !forcedSecondary && this.isPrimaryType(store, typeName, primaryModelClass);\n        var value = payload[prop];\n        if (value === null) {\n          continue;\n        }\n        (true && !(!(requestType === 'queryRecord' && isPrimary && Array.isArray(value))) && (0, _debug.assert)('The adapter returned an array for the primary data of a `queryRecord` response. `queryRecord` should return a single record.', !(requestType === 'queryRecord' && isPrimary && Array.isArray(value))));\n        /*\n          Support primary data as an object instead of an array.\n           Example\n           ```\n          {\n            user: { id: 1, title: 'Tom', manager: 3 }\n          }\n          ```\n         */\n        if (isPrimary && !Array.isArray(value)) {\n          let {\n            data,\n            included\n          } = this._normalizePolymorphicRecord(store, value, prop, primaryModelClass, this);\n          documentHash.data = data;\n          if (included) {\n            documentHash.included = documentHash.included.concat(included);\n          }\n          continue;\n        }\n        let {\n          data,\n          included\n        } = this._normalizeArray(store, typeName, value, prop);\n        if (included) {\n          documentHash.included = documentHash.included.concat(included);\n        }\n        if (isSingle) {\n          data.forEach(resource => {\n            /*\n              Figures out if this is the primary record or not.\n               It's either:\n               1. The record with the same ID as the original request\n              2. If it's a newly created record without an ID, the first record\n                 in the array\n             */\n            let isUpdatedRecord = isPrimary && (0, _private.coerceId)(resource.id) === id;\n            let isFirstCreatedRecord = isPrimary && !id && !documentHash.data;\n            if (isFirstCreatedRecord || isUpdatedRecord) {\n              documentHash.data = resource;\n            } else {\n              documentHash.included.push(resource);\n            }\n          });\n        } else {\n          if (isPrimary) {\n            documentHash.data = data;\n          } else {\n            if (data) {\n              documentHash.included = documentHash.included.concat(data);\n            }\n          }\n        }\n      }\n      return documentHash;\n    },\n    isPrimaryType(store, modelName, primaryModelClass) {\n      return (0, _string.dasherize)(modelName) === primaryModelClass.modelName;\n    },\n    /**\n      This method allows you to push a payload containing top-level\n      collections of records organized per type.\n       ```js\n      {\n        \"posts\": [{\n          \"id\": \"1\",\n          \"title\": \"Rails is omakase\",\n          \"author\", \"1\",\n          \"comments\": [ \"1\" ]\n        }],\n        \"comments\": [{\n          \"id\": \"1\",\n          \"body\": \"FIRST\"\n        }],\n        \"users\": [{\n          \"id\": \"1\",\n          \"name\": \"@d2h\"\n        }]\n      }\n      ```\n       It will first normalize the payload, so you can use this to push\n      in data streaming in from your server structured the same way\n      that fetches and saves are structured.\n       @method pushPayload\n      @public\n      @param {Store} store\n      @param {Object} payload\n    */\n    pushPayload(store, payload) {\n      let documentHash = {\n        data: [],\n        included: []\n      };\n      for (var prop in payload) {\n        var modelName = this.modelNameFromPayloadKey(prop);\n        if (!store.getSchemaDefinitionService().doesTypeExist(modelName)) {\n          (true && (0, _debug.warn)(this.warnMessageNoModelForKey(prop, modelName), false, {\n            id: 'ds.serializer.model-for-key-missing'\n          }));\n          continue;\n        }\n        var type = store.modelFor(modelName);\n        var typeSerializer = store.serializerFor(type.modelName);\n        makeArray(payload[prop]).forEach(hash => {\n          let {\n            data,\n            included\n          } = typeSerializer.normalize(type, hash, prop);\n          documentHash.data.push(data);\n          if (included) {\n            documentHash.included = documentHash.included.concat(included);\n          }\n        });\n      }\n      store.push(documentHash);\n    },\n    /**\n      This method is used to convert each JSON root key in the payload\n      into a modelName that it can use to look up the appropriate model for\n      that part of the payload.\n       For example, your server may send a model name that does not correspond with\n      the name of the model in your app. Let's take a look at an example model,\n      and an example payload:\n       ```app/models/post.js\n      import Model from '@ember-data/model';\n       export default class Post extends Model {}\n      ```\n       ```javascript\n        {\n          \"blog/post\": {\n            \"id\": \"1\n          }\n        }\n      ```\n       Ember Data is going to normalize the payload's root key for the modelName. As a result,\n      it will try to look up the \"blog/post\" model. Since we don't have a model called \"blog/post\"\n      (or a file called app/models/blog/post.js in ember-cli), Ember Data will throw an error\n      because it cannot find the \"blog/post\" model.\n       Since we want to remove this namespace, we can define a serializer for the application that will\n      remove \"blog/\" from the payload key whenver it's encountered by Ember Data:\n       ```app/serializers/application.js\n      import RESTSerializer from '@ember-data/serializer/rest';\n       export default class ApplicationSerializer extends RESTSerializer {\n        modelNameFromPayloadKey(payloadKey) {\n          if (payloadKey === 'blog/post') {\n            return super.modelNameFromPayloadKey(payloadKey.replace('blog/', ''));\n          } else {\n           return super.modelNameFromPayloadKey(payloadKey);\n          }\n        }\n      }\n      ```\n       After refreshing, Ember Data will appropriately look up the \"post\" model.\n       By default the modelName for a model is its\n      name in dasherized form. This means that a payload key like \"blogPost\" would be\n      normalized to \"blog-post\" when Ember Data looks up the model. Usually, Ember Data\n      can use the correct inflection to do this for you. Most of the time, you won't\n      need to override `modelNameFromPayloadKey` for this purpose.\n       @method modelNameFromPayloadKey\n      @public\n      @param {String} key\n      @return {String} the model's modelName\n    */\n    modelNameFromPayloadKey(key) {\n      return (0, _emberInflector.singularize)((0, _string.dasherize)(key));\n    },\n    // SERIALIZE\n\n    /**\n      Called when a record is saved in order to convert the\n      record into JSON.\n       By default, it creates a JSON object with a key for\n      each attribute and belongsTo relationship.\n       For example, consider this model:\n       ```app/models/comment.js\n      import Model, { attr, belongsTo } from '@ember-data/model';\n       export default class Comment extends Model {\n        @attr title\n        @attr body\n         @belongsTo('user') author\n      }\n      ```\n       The default serialization would create a JSON object like:\n       ```js\n      {\n        \"title\": \"Rails is unagi\",\n        \"body\": \"Rails? Omakase? O_O\",\n        \"author\": 12\n      }\n      ```\n       By default, attributes are passed through as-is, unless\n      you specified an attribute type (`attr('date')`). If\n      you specify a transform, the JavaScript value will be\n      serialized when inserted into the JSON hash.\n       By default, belongs-to relationships are converted into\n      IDs when inserted into the JSON hash.\n       ## IDs\n       `serialize` takes an options hash with a single option:\n      `includeId`. If this option is `true`, `serialize` will,\n      by default include the ID in the JSON object it builds.\n       The adapter passes in `includeId: true` when serializing\n      a record for `createRecord`, but not for `updateRecord`.\n       ## Customization\n       Your server may expect a different JSON format than the\n      built-in serialization format.\n       In that case, you can implement `serialize` yourself and\n      return a JSON hash of your choosing.\n       ```app/serializers/post.js\n      import RESTSerializer from '@ember-data/serializer/rest';\n       export default class ApplicationSerializer extends RESTSerializer {\n        serialize(snapshot, options) {\n          let json = {\n            POST_TTL: snapshot.attr('title'),\n            POST_BDY: snapshot.attr('body'),\n            POST_CMS: snapshot.hasMany('comments', { ids: true })\n          };\n           if (options.includeId) {\n            json.POST_ID_ = snapshot.id;\n          }\n           return json;\n        }\n      }\n      ```\n       ## Customizing an App-Wide Serializer\n       If you want to define a serializer for your entire\n      application, you'll probably want to use `eachAttribute`\n      and `eachRelationship` on the record.\n       ```app/serializers/application.js\n      import RESTSerializer from '@ember-data/serializer/rest';\n      import { pluralize } from '<app-name>/utils/string-utils';\n       export default class ApplicationSerializer extends RESTSerializer {\n        serialize(snapshot, options) {\n          let json = {};\n           snapshot.eachAttribute(function(name) {\n            json[serverAttributeName(name)] = snapshot.attr(name);\n          });\n           snapshot.eachRelationship(function(name, relationship) {\n            if (relationship.kind === 'hasMany') {\n              json[serverHasManyName(name)] = snapshot.hasMany(name, { ids: true });\n            }\n          });\n           if (options.includeId) {\n            json.ID_ = snapshot.id;\n          }\n           return json;\n        }\n      }\n       function serverAttributeName(attribute) {\n        return attribute.underscore().toUpperCase();\n      }\n       function serverHasManyName(name) {\n        return serverAttributeName(singularize(name)) + \"_IDS\";\n      }\n      ```\n       This serializer will generate JSON that looks like this:\n       ```js\n      {\n        \"TITLE\": \"Rails is omakase\",\n        \"BODY\": \"Yep. Omakase.\",\n        \"COMMENT_IDS\": [ 1, 2, 3 ]\n      }\n      ```\n       ## Tweaking the Default JSON\n       If you just want to do some small tweaks on the default JSON,\n      you can call super first and make the tweaks on the returned\n      JSON.\n       ```app/serializers/post.js\n      import RESTSerializer from '@ember-data/serializer/rest';\n       export default class ApplicationSerializer extends RESTSerializer {\n        serialize(snapshot, options) {\n          let json = super.serialize(snapshot, options);\n           json.subject = json.title;\n          delete json.title;\n           return json;\n        }\n      }\n      ```\n       @method serialize\n      @public\n      @param {Snapshot} snapshot\n      @param {Object} options\n      @return {Object} json\n    */\n    serialize(snapshot, options) {\n      return this._super(...arguments);\n    },\n    /**\n      You can use this method to customize the root keys serialized into the JSON.\n      The hash property should be modified by reference (possibly using something like _.extend)\n      By default the REST Serializer sends the modelName of a model, which is a camelized\n      version of the name.\n       For example, your server may expect underscored root objects.\n       ```app/serializers/application.js\n      import RESTSerializer from '@ember-data/serializer/rest';\n      import { decamelize } from '<app-name>/utils/string-utils';\n       export default class ApplicationSerializer extends RESTSerializer {\n        serializeIntoHash(data, type, record, options) {\n          let root = decamelize(type.modelName);\n          data[root] = this.serialize(record, options);\n        }\n      }\n      ```\n       @method serializeIntoHash\n      @public\n      @param {Object} hash\n      @param {Model} typeClass\n      @param {Snapshot} snapshot\n      @param {Object} options\n    */\n    serializeIntoHash(hash, typeClass, snapshot, options) {\n      let normalizedRootKey = this.payloadKeyFromModelName(typeClass.modelName);\n      hash[normalizedRootKey] = this.serialize(snapshot, options);\n    },\n    /**\n      You can use `payloadKeyFromModelName` to override the root key for an outgoing\n      request. By default, the RESTSerializer returns a camelized version of the\n      model's name.\n       For a model called TacoParty, its `modelName` would be the string `taco-party`. The RESTSerializer\n      will send it to the server with `tacoParty` as the root key in the JSON payload:\n       ```js\n      {\n        \"tacoParty\": {\n          \"id\": \"1\",\n          \"location\": \"Matthew Beale's House\"\n        }\n      }\n      ```\n       For example, your server may expect dasherized root objects:\n       ```app/serializers/application.js\n      import RESTSerializer from '@ember-data/serializer/rest';\n      import { dasherize } from '<app-name>/utils/string-utils';\n       export default class ApplicationSerializer extends RESTSerializer {\n        payloadKeyFromModelName(modelName) {\n          return dasherize(modelName);\n        }\n      }\n      ```\n       Given a `TacoParty` model, calling `save` on it would produce an outgoing\n      request like:\n       ```js\n      {\n        \"taco-party\": {\n          \"id\": \"1\",\n          \"location\": \"Matthew Beale's House\"\n        }\n      }\n      ```\n       @method payloadKeyFromModelName\n      @public\n      @param {String} modelName\n      @return {String}\n    */\n    payloadKeyFromModelName(modelName) {\n      return (0, _string.camelize)(modelName);\n    },\n    /**\n      You can use this method to customize how polymorphic objects are serialized.\n      By default the REST Serializer creates the key by appending `Type` to\n      the attribute and value from the model's camelcased model name.\n       @method serializePolymorphicType\n      @public\n      @param {Snapshot} snapshot\n      @param {Object} json\n      @param {Object} relationship\n    */\n    serializePolymorphicType(snapshot, json, relationship) {\n      let key = relationship.key;\n      let typeKey = this.keyForPolymorphicType(key, relationship.type, 'serialize');\n      let belongsTo = snapshot.belongsTo(key);\n      if ((0, _utils.isNone)(belongsTo)) {\n        json[typeKey] = null;\n      } else {\n        json[typeKey] = (0, _string.camelize)(belongsTo.modelName);\n      }\n    },\n    /**\n      You can use this method to customize how a polymorphic relationship should\n      be extracted.\n       @method extractPolymorphicRelationship\n      @public\n      @param {Object} relationshipType\n      @param {Object} relationshipHash\n      @param {Object} relationshipOptions\n      @return {Object}\n     */\n    extractPolymorphicRelationship(relationshipType, relationshipHash, relationshipOptions) {\n      let {\n        key,\n        resourceHash,\n        relationshipMeta\n      } = relationshipOptions;\n\n      // A polymorphic belongsTo relationship can be present in the payload\n      // either in the form where the `id` and the `type` are given:\n      //\n      //   {\n      //     message: { id: 1, type: 'post' }\n      //   }\n      //\n      // or by the `id` and a `<relationship>Type` attribute:\n      //\n      //   {\n      //     message: 1,\n      //     messageType: 'post'\n      //   }\n      //\n      // The next code checks if the latter case is present and returns the\n      // corresponding JSON-API representation. The former case is handled within\n      // the base class JSONSerializer.\n      let isPolymorphic = relationshipMeta.options.polymorphic;\n      let typeProperty = this.keyForPolymorphicType(key, relationshipType, 'deserialize');\n      if (isPolymorphic && resourceHash[typeProperty] !== undefined && typeof relationshipHash !== 'object') {\n        let type = this.modelNameFromPayloadKey(resourceHash[typeProperty]);\n        return {\n          id: relationshipHash,\n          type: type\n        };\n      }\n      return this._super(...arguments);\n    }\n  });\n  if ((0, _runtime.macroCondition)(true)) {\n    RESTSerializer.reopen({\n      warnMessageNoModelForKey(prop, typeKey) {\n        return 'Encountered \"' + prop + '\" in payload, but no model was found for model name \"' + typeKey + '\" (resolved model name using ' + this.constructor.toString() + '.modelNameFromPayloadKey(\"' + prop + '\"))';\n      }\n    });\n  }\n  var _default = RESTSerializer;\n  _exports.default = _default;\n});","define(\"@ember-data/serializer/transform\", [\"exports\", \"@ember-data/serializer/-private\"], function (_exports, _private) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/serializer/-private\"eaimeta@70e063a35619d71f\n  /**\n    @module @ember-data/serializer\n  */\n  var _default = _private.Transform;\n  _exports.default = _default;\n});","define('@ember-data/store/-private', ['exports', '@embroider/macros/runtime', '@ember/debug', '@ember/string', '@embroider/macros/es-compat', '@ember/application', '@ember/runloop', '@ember/service', '@ember/test', 'rsvp', '@glimmer/tracking', '@ember-data/tracking/-private', '@ember/-internals/metal', '@ember/object', '@ember/object/compat', '@ember/utils', '@glimmer/validator', 'ember', '@ember/object/computed', '@ember/array/proxy', '@ember/object/promise-proxy-mixin', '@ember/object/proxy'], (function (exports, runtime, debug, string, esc, application, runloop, Service, test, RSVP, tracking, Private, metal, object, compat, utils, validator, Ember, computed, ArrayProxy, PromiseProxyMixin, ObjectProxy) { 'use strict';\n\n  const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e };\n\n  const esc__default = /*#__PURE__*/_interopDefaultLegacy(esc);\n  const Service__default = /*#__PURE__*/_interopDefaultLegacy(Service);\n  const RSVP__default = /*#__PURE__*/_interopDefaultLegacy(RSVP);\n  const Ember__default = /*#__PURE__*/_interopDefaultLegacy(Ember);\n  const ArrayProxy__default = /*#__PURE__*/_interopDefaultLegacy(ArrayProxy);\n  const PromiseProxyMixin__default = /*#__PURE__*/_interopDefaultLegacy(PromiseProxyMixin);\n  const ObjectProxy__default = /*#__PURE__*/_interopDefaultLegacy(ObjectProxy);\n\n  /**\n    @module @ember-data/store\n  */\n\n  /**\n   This method normalizes a modelName into the format Ember Data uses\n   internally by dasherizing it.\n\n    @method normalizeModelName\n    @static\n    @public\n    @deprecated\n    @for @ember-data/store\n    @param {String} modelName\n    @return {String} normalizedModelName\n  */\n  function normalizeModelName$1(modelName) {\n    return string.dasherize(modelName);\n  }\n\n  /**\n    @module @ember-data/store\n  */\n\n  // Used by the store to normalize IDs entering the store.  Despite the fact\n  // that developers may provide IDs as numbers (e.g., `store.findRecord('person', 1)`),\n  // it is important that internally we use strings, since IDs may be serialized\n  // and lose type information.  For example, Ember's router may put a record's\n  // ID into the URL, and if we later try to deserialize that URL and find the\n  // corresponding record, we will not know if it is a string or a number.\n\n  function coerceId(id) {\n    if (id === null || id === undefined || id === '') {\n      return null;\n    }\n    if (typeof id === 'string') {\n      return id;\n    }\n    if (typeof id === 'symbol') {\n      return id.toString();\n    }\n    return '' + id;\n  }\n  function ensureStringId(id) {\n    let normalized = null;\n    if (typeof id === 'string') {\n      normalized = id.length > 0 ? id : null;\n    } else if (typeof id === 'number' && !isNaN(id)) {\n      normalized = '' + id;\n    }\n    if (normalized === null) {\n      throw new Error(`Expected id to be a string or number, received ${String(id)}`);\n    }\n    return normalized;\n  }\n\n  // provided for additional debuggability\n  const DEBUG_CLIENT_ORIGINATED = Symbol('record-originated-on-client');\n  const DEBUG_IDENTIFIER_BUCKET = Symbol('identifier-bucket');\n\n  function isNonEmptyString(str) {\n    return str && typeof str === 'string';\n  }\n\n  /**\n    @module @ember-data/store\n  */\n\n  function installPolyfill() {\n    const isFastBoot = typeof FastBoot !== 'undefined';\n    const CRYPTO = isFastBoot ? FastBoot.require('crypto') : window.crypto;\n    if (!CRYPTO.randomUUID) {\n      // we might be able to optimize this by requesting more bytes than we need at a time\n      const rng = function () {\n        // WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto\n        let rnds8 = new Uint8Array(16);\n        if (!CRYPTO.getRandomValues && !isFastBoot) {\n          throw new Error(`Unable to generate bytes for UUID`);\n        }\n        return CRYPTO.getRandomValues ? CRYPTO.getRandomValues(rnds8) : CRYPTO.randomFillSync(rnds8);\n      };\n\n      /*\n       * Convert array of 16 byte values to UUID string format of the form:\n       * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n       */\n      const byteToHex = [];\n      for (let i = 0; i < 256; ++i) {\n        byteToHex[i] = (i + 0x100).toString(16).substr(1);\n      }\n      const bytesToUuid = function (buf) {\n        let bth = byteToHex;\n        // join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4\n        return [bth[buf[0]], bth[buf[1]], bth[buf[2]], bth[buf[3]], '-', bth[buf[4]], bth[buf[5]], '-', bth[buf[6]], bth[buf[7]], '-', bth[buf[8]], bth[buf[9]], '-', bth[buf[10]], bth[buf[11]], bth[buf[12]], bth[buf[13]], bth[buf[14]], bth[buf[15]]].join('');\n      };\n      CRYPTO.randomUUID = function uuidv4() {\n        let rnds = rng();\n\n        // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n        rnds[6] = rnds[6] & 0x0f | 0x40;\n        rnds[8] = rnds[8] & 0x3f | 0x80;\n        return bytesToUuid(rnds);\n      };\n    }\n  }\n\n  const IDENTIFIERS = new Set();\n  function isStableIdentifier(identifier) {\n    return IDENTIFIERS.has(identifier);\n  }\n  const isFastBoot = typeof FastBoot !== 'undefined';\n  const _crypto = isFastBoot ? FastBoot.require('crypto') : window.crypto;\n  if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").polyfillUUID)) {\n    installPolyfill();\n  }\n  function uuidv4() {\n    (!(_crypto.randomUUID) && debug.assert('crypto.randomUUID needs to be avaliable. Some browsers incorrectly disallow it in insecure contexts. You maybe want to enable the polyfill: https://github.com/emberjs/data#randomuuid-polyfill', _crypto.randomUUID));\n    return _crypto.randomUUID();\n  }\n  function freeze$1(obj) {\n    if (typeof Object.freeze === 'function') {\n      return Object.freeze(obj);\n    }\n    return obj;\n  }\n  let configuredForgetMethod;\n  let configuredGenerationMethod;\n  let configuredResetMethod;\n  let configuredUpdateMethod;\n  function setIdentifierGenerationMethod(method) {\n    configuredGenerationMethod = method;\n  }\n  function setIdentifierUpdateMethod(method) {\n    configuredUpdateMethod = method;\n  }\n  function setIdentifierForgetMethod(method) {\n    configuredForgetMethod = method;\n  }\n  function setIdentifierResetMethod(method) {\n    configuredResetMethod = method;\n  }\n  function defaultGenerationMethod(data, bucket) {\n    if (isNonEmptyString(data.lid)) {\n      return data.lid;\n    }\n    if (data.id !== undefined) {\n      let {\n        type,\n        id\n      } = data;\n      // TODO: add test for id not a string\n      if (isNonEmptyString(coerceId(id))) {\n        return `@lid:${normalizeModelName$1(type)}-${id}`;\n      }\n    }\n    return uuidv4();\n  }\n  function defaultEmptyCallback() {}\n  let DEBUG_MAP;\n  if (runtime.macroCondition(true)) {\n    DEBUG_MAP = new WeakMap();\n  }\n\n  /**\n   * Each instance of {Store} receives a unique instance of a IdentifierCache.\n   *\n   * This cache is responsible for assigning or retrieving the unique identify\n   * for arbitrary resource data encountered by the store. Data representing\n   * a unique resource or record should always be represented by the same\n   * identifier.\n   *\n   * It can be configured by consuming applications.\n   *\n   * @class IdentifierCache\n     @public\n   */\n  class IdentifierCache {\n    constructor() {\n      this._cache = {\n        lids: new Map(),\n        types: Object.create(null)\n      };\n      // we cache the user configuredGenerationMethod at init because it must\n      // be configured prior and is not allowed to be changed\n      this._generate = configuredGenerationMethod || defaultGenerationMethod;\n      this._update = configuredUpdateMethod || defaultEmptyCallback;\n      this._forget = configuredForgetMethod || defaultEmptyCallback;\n      this._reset = configuredResetMethod || defaultEmptyCallback;\n      this._merge = defaultEmptyCallback;\n      this._isDefaultConfig = !configuredGenerationMethod;\n    }\n\n    /**\n     * Internal hook to allow management of merge conflicts with identifiers.\n     *\n     * we allow late binding of this private internal merge so that\n     * the cache can insert itself here to handle elimination of duplicates\n     *\n     * @method __configureMerge\n     * @private\n     */\n    __configureMerge(method) {\n      this._merge = method || defaultEmptyCallback;\n    }\n\n    /**\n     * @method _getRecordIdentifier\n     * @private\n     */\n\n    _getRecordIdentifier(resource, shouldGenerate) {\n      if (shouldGenerate === void 0) {\n        shouldGenerate = false;\n      }\n      // short circuit if we're already the stable version\n      if (isStableIdentifier(resource)) {\n        if (runtime.macroCondition(true)) {\n          // TODO should we instead just treat this case as a new generation skipping the short circuit?\n          if (!this._cache.lids.has(resource.lid) || this._cache.lids.get(resource.lid) !== resource) {\n            throw new Error(`The supplied identifier ${resource} does not belong to this store instance`);\n          }\n        }\n        if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").debug.LOG_IDENTIFIERS)) {\n          // eslint-disable-next-line no-console\n          console.log(`Identifiers: Peeked Identifier was already Stable ${String(resource)}`);\n        }\n        return resource;\n      }\n      let lid = coerceId(resource.lid);\n      let identifier = lid !== null ? this._cache.lids.get(lid) : undefined;\n      if (identifier !== undefined) {\n        if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").debug.LOG_IDENTIFIERS)) {\n          // eslint-disable-next-line no-console\n          console.log(`Identifiers: cache HIT ${identifier}`, resource);\n        }\n        return identifier;\n      }\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").debug.LOG_IDENTIFIERS)) {\n        // eslint-disable-next-line no-console\n        console.groupCollapsed(`Identifiers: ${shouldGenerate ? 'Generating' : 'Peeking'} Identifier`, resource);\n      }\n      if (shouldGenerate === false) {\n        if (!resource.type || !resource.id) {\n          return;\n        }\n      }\n\n      // `type` must always be present\n      (!('type' in resource && isNonEmptyString(resource.type)) && debug.assert('resource.type needs to be a string', 'type' in resource && isNonEmptyString(resource.type)));\n      let type = resource.type && normalizeModelName$1(resource.type);\n      let id = coerceId(resource.id);\n      let keyOptions = getTypeIndex(this._cache.types, type);\n\n      // go straight for the stable RecordIdentifier key'd to `lid`\n      if (lid !== null) {\n        identifier = keyOptions.lid.get(lid);\n      }\n\n      // we may have not seen this resource before\n      // but just in case we check our own secondary lookup (`id`)\n      if (identifier === undefined && id !== null) {\n        identifier = keyOptions.id.get(id);\n      }\n      if (identifier === undefined) {\n        // we have definitely not seen this resource before\n        // so we allow the user configured `GenerationMethod` to tell us\n        let newLid = this._generate(resource, 'record');\n        if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").debug.LOG_IDENTIFIERS)) {\n          // eslint-disable-next-line no-console\n          console.log(`Identifiers: lid ${newLid} determined for resource`, resource);\n        }\n\n        // we do this _even_ when `lid` is present because secondary lookups\n        // may need to be populated, but we enforce not giving us something\n        // different than expected\n        if (lid !== null && newLid !== lid) {\n          throw new Error(`You should not change the <lid> of a RecordIdentifier`);\n        } else if (lid === null && !this._isDefaultConfig) {\n          // allow configuration to tell us that we have\n          // seen this `lid` before. E.g. a secondary lookup\n          // connects this resource to a previously seen\n          // resource.\n          identifier = keyOptions.lid.get(newLid);\n        }\n        if (shouldGenerate === true) {\n          if (identifier === undefined) {\n            // if we still don't have an identifier, time to generate one\n            identifier = makeStableRecordIdentifier(id, type, newLid, 'record', false);\n\n            // populate our unique table\n            if (runtime.macroCondition(true)) {\n              // realistically if you hit this it means you changed `type` :/\n              // TODO consider how to handle type change assertions more gracefully\n              if (this._cache.lids.has(identifier.lid)) {\n                throw new Error(`You should not change the <type> of a RecordIdentifier`);\n              }\n            }\n            this._cache.lids.set(identifier.lid, identifier);\n\n            // populate our primary lookup table\n            // TODO consider having the `lid` cache be\n            // one level up\n            keyOptions.lid.set(identifier.lid, identifier);\n            if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").debug.LOG_IDENTIFIERS)) {\n              if (shouldGenerate) {\n                // eslint-disable-next-line no-console\n                console.log(`Identifiers: generated ${String(identifier)} for`, resource);\n                if (resource[DEBUG_IDENTIFIER_BUCKET]) {\n                  // eslint-disable-next-line no-console\n                  console.trace(`[WARNING] Identifiers: generated a new identifier from a previously used identifier. This is likely a bug.`);\n                }\n              }\n            }\n          }\n\n          // populate our own secondary lookup table\n          // even for the \"successful\" secondary lookup\n          // by `_generate()`, since we missed the cache\n          // previously\n          // we use identifier.id instead of id here\n          // because they may not match and we prefer\n          // what we've set via resource data\n          if (identifier.id !== null) {\n            keyOptions.id.set(identifier.id, identifier);\n\n            // TODO allow filling out of `id` here\n            // for the `username` non-client created\n            // case.\n          }\n        }\n      }\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").debug.LOG_IDENTIFIERS)) {\n        if (!identifier && !shouldGenerate) {\n          // eslint-disable-next-line no-console\n          console.log(`Identifiers: cache MISS`, resource);\n        }\n        // eslint-disable-next-line no-console\n        console.groupEnd();\n      }\n      return identifier;\n    }\n\n    /**\n     * allows us to peek without generating when needed\n     * useful for the \"create\" case when we need to see if\n     * we are accidentally overwritting something\n     *\n     * @method peekRecordIdentifier\n     * @param resource\n     * @returns {StableRecordIdentifier | undefined}\n     * @private\n     */\n    peekRecordIdentifier(resource) {\n      return this._getRecordIdentifier(resource, false);\n    }\n\n    /**\n      Returns the Identifier for the given Resource, creates one if it does not yet exist.\n       Specifically this means that we:\n       - validate the `id` `type` and `lid` combo against known identifiers\n      - return an object with an `lid` that is stable (repeated calls with the same\n        `id` + `type` or `lid` will return the same `lid` value)\n      - this referential stability of the object itself is guaranteed\n       @method getOrCreateRecordIdentifier\n      @param resource\n      @returns {StableRecordIdentifier}\n      @public\n    */\n    getOrCreateRecordIdentifier(resource) {\n      return this._getRecordIdentifier(resource, true);\n    }\n\n    /**\n     Returns a new Identifier for the supplied data. Call this method to generate\n     an identifier when a new resource is being created local to the client and\n     potentially does not have an `id`.\n      Delegates generation to the user supplied `GenerateMethod` if one has been provided\n     with the signature `generateMethod({ type }, 'record')`.\n      @method createIdentifierForNewRecord\n     @param data\n     @returns {StableRecordIdentifier}\n     @public\n    */\n    createIdentifierForNewRecord(data) {\n      let newLid = this._generate(data, 'record');\n      let identifier = makeStableRecordIdentifier(data.id || null, data.type, newLid, 'record', true);\n      let keyOptions = getTypeIndex(this._cache.types, data.type);\n\n      // populate our unique table\n      if (runtime.macroCondition(true)) {\n        if (this._cache.lids.has(identifier.lid)) {\n          throw new Error(`The lid generated for the new record is not unique as it matches an existing identifier`);\n        }\n      }\n      this._cache.lids.set(identifier.lid, identifier);\n\n      // populate the type+lid cache\n      keyOptions.lid.set(newLid, identifier);\n      if (data.id) {\n        keyOptions.id.set(data.id, identifier);\n      }\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").debug.LOG_IDENTIFIERS)) {\n        // eslint-disable-next-line no-console\n        console.log(`Identifiers: createded identifier ${String(identifier)} for newly generated resource`, data);\n      }\n      return identifier;\n    }\n\n    /**\n     Provides the opportunity to update secondary lookup tables for existing identifiers\n     Called after an identifier created with `createIdentifierForNewRecord` has been\n     committed.\n      Assigned `id` to an `Identifier` if `id` has not previously existed; however,\n     attempting to change the `id` or calling update without providing an `id` when\n     one is missing will throw an error.\n       - sets `id` (if `id` was previously `null`)\n      - `lid` and `type` MUST NOT be altered post creation\n       If a merge occurs, it is possible the returned identifier does not match the originally\n      provided identifier. In this case the abandoned identifier will go through the usual\n      `forgetRecordIdentifier` codepaths.\n       @method updateRecordIdentifier\n      @param identifierObject\n      @param data\n      @returns {StableRecordIdentifier}\n      @public\n    */\n    updateRecordIdentifier(identifierObject, data) {\n      let identifier = this.getOrCreateRecordIdentifier(identifierObject);\n      let newId = data.id !== undefined ? coerceId(data.id) : null;\n      let existingIdentifier = detectMerge(this._cache.types, identifier, data, newId, this._cache.lids);\n      if (!existingIdentifier) {\n        // If the incoming type does not match the identifier type, we need to create an identifier for the incoming\n        // data so we can merge the incoming data with the existing identifier, see #7325 and #7363\n        if (data.type && identifier.type !== normalizeModelName$1(data.type)) {\n          let incomingDataResource = {\n            ...data\n          };\n          // Need to strip the lid from the incomingData in order force a new identifier creation\n          delete incomingDataResource.lid;\n          existingIdentifier = this.getOrCreateRecordIdentifier(incomingDataResource);\n        }\n      }\n      if (existingIdentifier) {\n        let keyOptions = getTypeIndex(this._cache.types, identifier.type);\n        let generatedIdentifier = identifier;\n        identifier = this._mergeRecordIdentifiers(keyOptions, generatedIdentifier, existingIdentifier, data, newId);\n        if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").debug.LOG_IDENTIFIERS)) {\n          // eslint-disable-next-line no-console\n          console.log(`Identifiers: merged identifiers ${generatedIdentifier.lid} and ${existingIdentifier.lid} for resource into ${identifier.lid}`, data);\n        }\n      }\n      let id = identifier.id;\n      performRecordIdentifierUpdate(identifier, data, this._update);\n      newId = identifier.id;\n\n      // add to our own secondary lookup table\n      if (id !== newId && newId !== null) {\n        if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").debug.LOG_IDENTIFIERS)) {\n          // eslint-disable-next-line no-console\n          console.log(`Identifiers: updated id for identifier ${identifier.lid} from '${id}' to '${newId}' for resource`, data);\n        }\n        let keyOptions = getTypeIndex(this._cache.types, identifier.type);\n        keyOptions.id.set(newId, identifier);\n        if (id !== null) {\n          keyOptions.id.delete(id);\n        }\n      } else if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").debug.LOG_IDENTIFIERS)) {\n        // eslint-disable-next-line no-console\n        console.log(`Identifiers: updated identifier ${identifier.lid} resource`, data);\n      }\n      return identifier;\n    }\n\n    /**\n     * @method _mergeRecordIdentifiers\n     * @private\n     */\n    _mergeRecordIdentifiers(keyOptions, identifier, existingIdentifier, data, newId) {\n      // delegate determining which identifier to keep to the configured MergeMethod\n      let kept = this._merge(identifier, existingIdentifier, data);\n      let abandoned = kept === identifier ? existingIdentifier : identifier;\n\n      // cleanup the identifier we no longer need\n      this.forgetRecordIdentifier(abandoned);\n\n      // ensure a secondary cache entry for this id for the identifier we do keep\n      keyOptions.id.set(newId, kept);\n      // ensure a secondary cache entry for this id for the abandoned identifier's type we do keep\n      let baseKeyOptions = getTypeIndex(this._cache.types, existingIdentifier.type);\n      baseKeyOptions.id.set(newId, kept);\n\n      // make sure that the `lid` on the data we are processing matches the lid we kept\n      data.lid = kept.lid;\n      return kept;\n    }\n\n    /**\n     Provides the opportunity to eliminate an identifier from secondary lookup tables\n     as well as eliminates it from ember-data's own lookup tables and book keeping.\n      Useful when a record has been deleted and the deletion has been persisted and\n     we do not care about the record anymore. Especially useful when an `id` of a\n     deleted record might be reused later for a new record.\n      @method forgetRecordIdentifier\n     @param identifierObject\n     @public\n    */\n    forgetRecordIdentifier(identifierObject) {\n      let identifier = this.getOrCreateRecordIdentifier(identifierObject);\n      let keyOptions = getTypeIndex(this._cache.types, identifier.type);\n      if (identifier.id !== null) {\n        keyOptions.id.delete(identifier.id);\n      }\n      this._cache.lids.delete(identifier.lid);\n      keyOptions.lid.delete(identifier.lid);\n      IDENTIFIERS.delete(identifierObject);\n      this._forget(identifier, 'record');\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").debug.LOG_IDENTIFIERS)) {\n        // eslint-disable-next-line no-console\n        console.log(`Identifiers: released identifier ${identifierObject.lid}`);\n      }\n    }\n    destroy() {\n      this._reset();\n    }\n  }\n  function getTypeIndex(typeMap, type) {\n    let typeIndex = typeMap[type];\n    if (typeIndex === undefined) {\n      typeIndex = {\n        lid: new Map(),\n        id: new Map()\n      };\n      typeMap[type] = typeIndex;\n    }\n    return typeIndex;\n  }\n  function makeStableRecordIdentifier(id, type, lid, bucket, clientOriginated) {\n    if (clientOriginated === void 0) {\n      clientOriginated = false;\n    }\n    let recordIdentifier = {\n      lid,\n      id,\n      type\n    };\n    IDENTIFIERS.add(recordIdentifier);\n    if (runtime.macroCondition(true)) {\n      // we enforce immutability in dev\n      //  but preserve our ability to do controlled updates to the reference\n      let wrapper = {\n        get lid() {\n          return recordIdentifier.lid;\n        },\n        get id() {\n          return recordIdentifier.id;\n        },\n        get type() {\n          return recordIdentifier.type;\n        },\n        toString() {\n          let {\n            type,\n            id,\n            lid\n          } = recordIdentifier;\n          return `${clientOriginated ? '[CLIENT_ORIGINATED] ' : ''}${type}:${id} (${lid})`;\n        },\n        toJSON() {\n          let {\n            type,\n            id,\n            lid\n          } = recordIdentifier;\n          return {\n            type,\n            id,\n            lid\n          };\n        }\n      };\n      wrapper[DEBUG_CLIENT_ORIGINATED] = clientOriginated;\n      wrapper[DEBUG_IDENTIFIER_BUCKET] = bucket;\n      IDENTIFIERS.add(wrapper);\n      DEBUG_MAP.set(wrapper, recordIdentifier);\n      wrapper = freeze$1(wrapper);\n      return wrapper;\n    }\n    return recordIdentifier;\n  }\n  function performRecordIdentifierUpdate(identifier, data, updateFn) {\n    if (runtime.macroCondition(true)) {\n      let {\n        lid\n      } = data;\n      let id = 'id' in data ? data.id : undefined;\n      let type = 'type' in data && data.type && normalizeModelName$1(data.type);\n\n      // get the mutable instance behind our proxy wrapper\n      let wrapper = identifier;\n      identifier = DEBUG_MAP.get(wrapper);\n      if (lid !== undefined) {\n        let newLid = coerceId(lid);\n        if (newLid !== identifier.lid) {\n          throw new Error(`The 'lid' for a RecordIdentifier cannot be updated once it has been created. Attempted to set lid for '${wrapper}' to '${lid}'.`);\n        }\n      }\n      if (id !== undefined) {\n        let newId = coerceId(id);\n        if (identifier.id !== null && identifier.id !== newId) {\n          // here we warn and ignore, as this may be a mistake, but we allow the user\n          // to have multiple cache-keys pointing at a single lid so we cannot error\n          (debug.warn(`The 'id' for a RecordIdentifier should not be updated once it has been set. Attempted to set id for '${wrapper}' to '${newId}'.`, false, {\n            id: 'ember-data:multiple-ids-for-identifier'\n          }));\n        }\n      }\n\n      // TODO consider just ignoring here to allow flexible polymorphic support\n      if (type && type !== identifier.type) {\n        throw new Error(`The 'type' for a RecordIdentifier cannot be updated once it has been set. Attempted to set type for '${wrapper}' to '${type}'.`);\n      }\n      updateFn(wrapper, data, 'record');\n    } else {\n      updateFn(identifier, data, 'record');\n    }\n\n    // upgrade the ID, this is a \"one time only\" ability\n    // for the multiple-cache-key scenario we \"could\"\n    // use a heuristic to guess the best id for display\n    // (usually when `data.id` is available and `data.attributes` is not)\n    if (data.id !== undefined) {\n      identifier.id = coerceId(data.id);\n    }\n  }\n  function detectMerge(typesCache, identifier, data, newId, lids) {\n    const {\n      id,\n      type,\n      lid\n    } = identifier;\n    if (id !== null && id !== newId && newId !== null) {\n      let keyOptions = getTypeIndex(typesCache, identifier.type);\n      let existingIdentifier = keyOptions.id.get(newId);\n      return existingIdentifier !== undefined ? existingIdentifier : false;\n    } else {\n      let newType = data.type && normalizeModelName$1(data.type);\n\n      // If the ids and type are the same but lid is not the same, we should trigger a merge of the identifiers\n      if (id !== null && id === newId && newType === type && data.lid && data.lid !== lid) {\n        let existingIdentifier = lids.get(data.lid);\n        return existingIdentifier !== undefined ? existingIdentifier : false;\n        // If the lids are the same, and ids are the same, but types are different we should trigger a merge of the identifiers\n      } else if (id !== null && id === newId && newType && newType !== type && data.lid && data.lid === lid) {\n        let keyOptions = getTypeIndex(typesCache, newType);\n        let existingIdentifier = keyOptions.id.get(id);\n        return existingIdentifier !== undefined ? existingIdentifier : false;\n      }\n    }\n    return false;\n  }\n\n  let tokenId = 0;\n  const Cache = new Map();\n  const Tokens = new Map();\n  // TODO this isn't importable anyway, remove and use a map on the manager?\n  function unsubscribe(token) {\n    let identifier = Tokens.get(token);\n    if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").debug.LOG_NOTIFICATIONS)) {\n      if (!identifier) {\n        // eslint-disable-next-line no-console\n        console.log('Passed unknown unsubscribe token to unsubscribe', identifier);\n      }\n    }\n    if (identifier) {\n      Tokens.delete(token);\n      const map = Cache.get(identifier);\n      map?.delete(token);\n    }\n  }\n  /*\n    Currently only support a single callback per identifier\n  */\n  class NotificationManager {\n    constructor(store) {\n      this.store = store;\n      this.isDestroyed = false;\n    }\n    subscribe(identifier, callback) {\n      (!(isStableIdentifier(identifier)) && debug.assert(`Expected to receive a stable Identifier to subscribe to`, isStableIdentifier(identifier)));\n      let map = Cache.get(identifier);\n      if (!map) {\n        map = new Map();\n        Cache.set(identifier, map);\n      }\n      let unsubToken = runtime.macroCondition(true) ? {\n        _tokenRef: tokenId++\n      } : {};\n      map.set(unsubToken, callback);\n      Tokens.set(unsubToken, identifier);\n      return unsubToken;\n    }\n    unsubscribe(token) {\n      if (!this.isDestroyed) {\n        unsubscribe(token);\n      }\n    }\n\n    // deactivated type signature overloads because pass-through was failing to match any. Bring back if possible.\n    // notify(identifier: StableRecordIdentifier, value: 'attributes' | 'relationships', key?: string): boolean;\n    // notify(identifier: StableRecordIdentifier, value: 'errors' | 'meta' | 'identity' | 'state'): boolean;\n    notify(identifier, value, key) {\n      (!(!key || value === 'attributes' || value === 'relationships') && debug.assert(`Notify does not accept a key argument for the namespace '${value}'. Received key '${key}'.`, !key || value === 'attributes' || value === 'relationships'));\n      if (!isStableIdentifier(identifier)) {\n        if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").debug.LOG_NOTIFICATIONS)) {\n          // eslint-disable-next-line no-console\n          console.log(`Notifying: Expected to receive a stable Identifier to notify '${value}' '${key}' with, but ${String(identifier)} is not in the cache`, identifier);\n        }\n        return false;\n      }\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").debug.LOG_NOTIFICATIONS)) {\n        // eslint-disable-next-line no-console\n        console.log(`Notifying: ${String(identifier)}\\t${value}\\t${key}`);\n      }\n      let callbackMap = Cache.get(identifier);\n      if (!callbackMap || !callbackMap.size) {\n        return false;\n      }\n      callbackMap.forEach(cb => {\n        cb(identifier, value, key);\n      });\n      return true;\n    }\n    destroy() {\n      this.isDestroyed = true;\n      Tokens.clear();\n      Cache.clear();\n    }\n  }\n\n  var _class$2, _descriptor$2;\n  function _initializerDefineProperty$2(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }\n  function _applyDecoratedDescriptor$2(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }\n  /**\n    @module @ember-data/store\n  */\n  /**\n     A `RecordReference` is a low-level API that allows users and\n     addon authors to perform meta-operations on a record.\n\n     @class RecordReference\n     @public\n     @extends Reference\n  */\n  let RecordReference = (_class$2 = class RecordReference {\n    constructor(store, identifier) {\n      // unsubscribe token given to us by the notification manager\n      this.___token = void 0;\n      this.___identifier = void 0;\n      _initializerDefineProperty$2(this, \"_ref\", _descriptor$2, this);\n      this.store = store;\n      this.___identifier = identifier;\n      this.___token = store._notificationManager.subscribe(identifier, (_, bucket, notifiedKey) => {\n        if (bucket === 'identity' || bucket === 'attributes' && notifiedKey === 'id') {\n          this._ref++;\n        }\n      });\n    }\n    destroy() {\n      unsubscribe(this.___token);\n    }\n    get type() {\n      return this.identifier().type;\n    }\n\n    /**\n       The `id` of the record that this reference refers to.\n        Together, the `type` and `id` properties form a composite key for\n       the identity map.\n        Example\n        ```javascript\n       let userRef = store.getReference('user', 1);\n        userRef.id(); // '1'\n       ```\n        @method id\n      @public\n       @return {String} The id of the record.\n    */\n    id() {\n      this._ref; // consume the tracked prop\n      return this.___identifier.id;\n    }\n\n    /**\n       The `identifier` of the record that this reference refers to.\n        Together, the `type` and `id` properties form a composite key for\n       the identity map.\n        Example\n        ```javascript\n       let userRef = store.getReference('user', 1);\n        userRef.identifier(); // '1'\n       ```\n        @method identifier\n      @public\n       @return {String} The identifier of the record.\n    */\n    identifier() {\n      return this.___identifier;\n    }\n\n    /**\n       How the reference will be looked up when it is loaded. Currently\n       this always returns `identity` to signify that a record will be\n       loaded by its `type` and `id`.\n        Example\n        ```javascript\n       const userRef = store.getReference('user', 1);\n        userRef.remoteType(); // 'identity'\n       ```\n        @method remoteType\n       @public\n       @return {String} 'identity'\n    */\n    remoteType() {\n      return 'identity';\n    }\n\n    /**\n      This API allows you to provide a reference with new data. The\n      simplest usage of this API is similar to `store.push`: you provide a\n      normalized hash of data and the object represented by the reference\n      will update.\n       If you pass a promise to `push`, Ember Data will not ask the adapter\n      for the data if another attempt to fetch it is made in the\n      interim. When the promise resolves, the underlying object is updated\n      with the new data, and the promise returned by *this function* is resolved\n      with that object.\n       For example, `recordReference.push(promise)` will be resolved with a\n      record.\n        Example\n        ```javascript\n       let userRef = store.getReference('user', 1);\n        // provide data for reference\n       userRef.push({\n         data: {\n           id: \"1\",\n           type: \"user\",\n           attributes: {\n             username: \"@user\"\n           }\n         }\n       }).then(function(user) {\n         userRef.value() === user;\n       });\n       ```\n       @method push\n      @public\n      @param objectOrPromise a JSON:API ResourceDocument or a promise resolving to one\n      @return a promise for the value (record or relationship)\n    */\n    push(objectOrPromise) {\n      // TODO @deprecate pushing unresolved payloads\n      return RSVP.resolve(objectOrPromise).then(data => {\n        return this.store.push(data);\n      });\n    }\n\n    /**\n      If the entity referred to by the reference is already loaded, it is\n      present as `reference.value`. Otherwise the value returned by this function\n      is `null`.\n        Example\n        ```javascript\n       let userRef = store.getReference('user', 1);\n        userRef.value(); // user\n       ```\n        @method value\n      @public\n       @return {Model} the record for this RecordReference\n    */\n    value() {\n      return this.store.peekRecord(this.___identifier);\n    }\n\n    /**\n       Triggers a fetch for the backing entity based on its `remoteType`\n       (see `remoteType` definitions per reference type).\n        Example\n        ```javascript\n       let userRef = store.getReference('user', 1);\n        // load user (via store.find)\n       userRef.load().then(...)\n       ```\n        @method load\n      @public\n       @return {Promise<record>} the record for this RecordReference\n    */\n    load() {\n      const id = this.id();\n      if (id !== null) {\n        return this.store.findRecord(this.type, id);\n      }\n      (debug.assert(`Unable to fetch record of type ${this.type} without an id`));\n    }\n\n    /**\n       Reloads the record if it is already loaded. If the record is not\n       loaded it will load the record via `store.findRecord`\n        Example\n        ```javascript\n       let userRef = store.getReference('user', 1);\n        // or trigger a reload\n       userRef.reload().then(...)\n       ```\n        @method reload\n      @public\n       @return {Promise<record>} the record for this RecordReference\n    */\n    reload() {\n      const id = this.id();\n      if (id !== null) {\n        return this.store.findRecord(this.type, id, {\n          reload: true\n        });\n      }\n      (debug.assert(`Unable to fetch record of type ${this.type} without an id`));\n    }\n  }, _descriptor$2 = _applyDecoratedDescriptor$2(_class$2.prototype, \"_ref\", [tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return 0;\n    }\n  }), _class$2);\n\n  function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError(\"attempted to use private field on non-instance\"); } return receiver; }\n  var id = 0;\n  function _classPrivateFieldLooseKey(name) { return \"__private_\" + id++ + \"_\" + name; }\n  var _store = /*#__PURE__*/_classPrivateFieldLooseKey(\"store\");\n  var _recordData = /*#__PURE__*/_classPrivateFieldLooseKey(\"recordData\");\n  var _identifier = /*#__PURE__*/_classPrivateFieldLooseKey(\"identifier\");\n  var _isDeprecated = /*#__PURE__*/_classPrivateFieldLooseKey(\"isDeprecated\");\n  /**\n   * The RecordDataManager wraps a RecordData cache\n   * enforcing that only the public API surface area\n   * is exposed.\n   *\n   * This class is the the return value of both the\n   * `recordDataFor` function supplied to the store\n   * hook `instantiateRecord`, and the `recordDataFor`\n   * method on the `RecordDataStoreWrapper`. It is not\n   * directly instantiatable.\n   *\n   * It handles translating between cache versions when\n   * necessary, for instance when a Store is configured\n   * to use both a v1 and a v2 cache depending on some\n   * heuristic.\n   *\n   * Starting with the v2 spec, the cache is designed such\n   * that it may be implemented as a singleton. However,\n   * because the v1 spec was not designed for this whenever\n   * we encounter any v1 cache we must wrap all caches, even\n   * singletons, in non-singleton managers to preserve v1\n   * compatibility.\n   *\n   * To avoid this performance penalty being paid by all\n   * applications, singleton behavior may be opted-in via\n   * the configuration supplied to your Ember application\n   * at build time. This effectively removes support for\n   * v1 caches.\n   *\n   * ```js\n   * let app = new EmberApp(defaults, {\n   *   emberData: {\n   *     useSingletonManager: true\n   *   },\n   * });\n   * ```\n   *\n   * @class RecordDataManager\n   * @public\n   */\n  class NonSingletonRecordDataManager {\n    get managedVersion() {\n      return _classPrivateFieldLooseBase(this, _recordData)[_recordData].version || '1';\n    }\n    constructor(store, _recordData2, identifier) {\n      Object.defineProperty(this, _isDeprecated, {\n        value: _isDeprecated2\n      });\n      this.version = '2';\n      Object.defineProperty(this, _store, {\n        writable: true,\n        value: void 0\n      });\n      Object.defineProperty(this, _recordData, {\n        writable: true,\n        value: void 0\n      });\n      Object.defineProperty(this, _identifier, {\n        writable: true,\n        value: void 0\n      });\n      _classPrivateFieldLooseBase(this, _store)[_store] = store;\n      _classPrivateFieldLooseBase(this, _recordData)[_recordData] = _recordData2;\n      _classPrivateFieldLooseBase(this, _identifier)[_identifier] = identifier;\n      if (_classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](_recordData2)) {\n        (debug.deprecate(`This RecordData uses the deprecated V1 RecordData Spec. Upgrade to V2 to maintain compatibility.`, false, {\n          id: 'ember-data:deprecate-v1-cache',\n          until: '5.0',\n          since: {\n            available: '4.7',\n            enabled: '4.7'\n          },\n          for: 'ember-data'\n        }));\n      }\n    }\n    // Cache\n    // =====\n\n    /**\n     * Retrieve the identifier for this v1 recordData\n     *\n     * DEPRECATED Caches should not be assumed to be 1:1 with resources\n     *\n     * @method getResourceIdentifier\n     * @public\n     * @deprecated\n     */\n    getResourceIdentifier() {\n      return _classPrivateFieldLooseBase(this, _identifier)[_identifier];\n    }\n\n    /**\n     * Push resource data from a remote source into the cache for this identifier\n     *\n     * @method pushData\n     * @public\n     * @param identifier\n     * @param data\n     * @param hasRecord\n     * @returns {void | string[]} if `hasRecord` is true then calculated key changes should be returned\n     */\n    pushData(identifier, data, hasRecord) {\n      const recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n      // called by something V1\n      if (!isStableIdentifier(identifier)) {\n        data = identifier;\n        hasRecord = data;\n        identifier = _classPrivateFieldLooseBase(this, _identifier)[_identifier];\n      }\n      if (_classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData)) {\n        return recordData.pushData(data, hasRecord);\n      }\n      return recordData.pushData(identifier, data, hasRecord);\n    }\n\n    /**\n     * Perform an operation on the cache to update the remote state.\n     *\n     * Note: currently the only valid operation is a MergeOperation\n     * which occurs when a collision of identifiers is detected.\n     *\n     * @method sync\n     * @public\n     * @param op the operation to perform\n     * @returns {void}\n     */\n    sync(op) {\n      const recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n      if (_classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData)) {\n        return;\n      }\n      recordData.sync(op);\n    }\n\n    /**\n     * Update resource data with a local mutation. Currently supports operations\n     * on relationships only.\n     *\n     * @method update\n     * @public\n     * @param operation\n     */\n    // isCollection is only needed for interop with v1 cache\n    update(operation, isResource) {\n      if (_classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](_classPrivateFieldLooseBase(this, _recordData)[_recordData])) {\n        const cache = _classPrivateFieldLooseBase(this, _store)[_store]._instanceCache;\n        switch (operation.op) {\n          case 'addToRelatedRecords':\n            _classPrivateFieldLooseBase(this, _recordData)[_recordData].addToHasMany(operation.field, operation.value.map(i => cache.getRecordData(i)), operation.index);\n            return;\n          case 'removeFromRelatedRecords':\n            _classPrivateFieldLooseBase(this, _recordData)[_recordData].removeFromHasMany(operation.field, operation.value.map(i => cache.getRecordData(i)));\n            return;\n          case 'replaceRelatedRecords':\n            _classPrivateFieldLooseBase(this, _recordData)[_recordData].setDirtyHasMany(operation.field, operation.value.map(i => cache.getRecordData(i)));\n            return;\n          case 'replaceRelatedRecord':\n            if (isResource) {\n              _classPrivateFieldLooseBase(this, _recordData)[_recordData].setDirtyBelongsTo(operation.field, operation.value ? cache.getRecordData(operation.value) : null);\n              return;\n            }\n            _classPrivateFieldLooseBase(this, _recordData)[_recordData].removeFromHasMany(operation.field, [cache.getRecordData(operation.prior)]);\n            _classPrivateFieldLooseBase(this, _recordData)[_recordData].addToHasMany(operation.field, [cache.getRecordData(operation.value)], operation.index);\n            return;\n          case 'sortRelatedRecords':\n            return;\n          default:\n            return;\n        }\n      } else {\n        _classPrivateFieldLooseBase(this, _recordData)[_recordData].update(operation);\n      }\n    }\n\n    /**\n     * [LIFECYLCE] Signal to the cache that a new record has been instantiated on the client\n     *\n     * It returns properties from options that should be set on the record during the create\n     * process. This return value behavior is deprecated.\n     *\n     * @method clientDidCreate\n     * @public\n     * @param identifier\n     * @param options\n     */\n    clientDidCreate(identifier, options) {\n      // called by something V1\n      if (!isStableIdentifier(identifier)) {\n        options = identifier;\n        identifier = _classPrivateFieldLooseBase(this, _identifier)[_identifier];\n      }\n      let recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n\n      // TODO deprecate return value\n      if (_classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData)) {\n        recordData.clientDidCreate();\n        // if a V2 is calling a V1 we need to call both methods\n        return recordData._initRecordCreateOptions(options);\n      } else {\n        return recordData.clientDidCreate(identifier, options);\n      }\n    }\n\n    /**\n     * Pass options to the cache that were supplied to a new record\n     * instantiated on the client.\n     *\n     * DEPRECATED: options are now passed via `clientDidCreate`\n     *\n     * @method clientDidCreate\n     * @public\n     * @deprecated\n     * @param options\n     */\n    _initRecordCreateOptions(options) {\n      let recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n      if (_classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData)) {\n        return recordData._initRecordCreateOptions(options);\n      }\n    }\n\n    /**\n     * [LIFECYCLE] Signals to the cache that a resource\n     * will be part of a save transaction.\n     *\n     * @method willCommit\n     * @public\n     * @param identifier\n     */\n    willCommit(identifier) {\n      _classPrivateFieldLooseBase(this, _recordData)[_recordData].willCommit(identifier || _classPrivateFieldLooseBase(this, _identifier)[_identifier]);\n    }\n\n    /**\n     * [LIFECYCLE] Signals to the cache that a resource\n     * was successfully updated as part of a save transaction.\n     *\n     * @method didCommit\n     * @public\n     * @param identifier\n     * @param data\n     */\n    didCommit(identifier, data) {\n      // called by something V1\n      if (!isStableIdentifier(identifier)) {\n        data = identifier;\n        identifier = _classPrivateFieldLooseBase(this, _identifier)[_identifier];\n      }\n      let recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n      _classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData) ? recordData.didCommit(data) : recordData.didCommit(identifier, data);\n    }\n\n    /**\n     * [LIFECYCLE] Signals to the cache that a resource\n     * was update via a save transaction failed.\n     *\n     * @method commitWasRejected\n     * @public\n     * @param identifier\n     * @param errors\n     */\n    commitWasRejected(identifier, errors) {\n      _classPrivateFieldLooseBase(this, _recordData)[_recordData].commitWasRejected(identifier || _classPrivateFieldLooseBase(this, _identifier)[_identifier], errors);\n    }\n\n    /**\n     * [LIFECYCLE] Signals to the cache that all data for a resource\n     * should be cleared.\n     *\n     * @method unloadRecord\n     * @public\n     * @param identifier\n     */\n    unloadRecord(identifier) {\n      const recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n      if (_classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData)) {\n        recordData.unloadRecord();\n      } else {\n        recordData.unloadRecord(identifier || _classPrivateFieldLooseBase(this, _identifier)[_identifier]);\n      }\n    }\n\n    // Attrs\n    // =====\n\n    /**\n     * Retrieve the data for an attribute from the cache\n     *\n     * @method getAttr\n     * @public\n     * @param identifier\n     * @param propertyName\n     * @returns {unknown}\n     */\n    getAttr(identifier, propertyName) {\n      // called by something V1\n      if (!isStableIdentifier(identifier)) {\n        propertyName = identifier;\n        identifier = _classPrivateFieldLooseBase(this, _identifier)[_identifier];\n      }\n      let recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n      return _classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData) ? recordData.getAttr(propertyName) : recordData.getAttr(identifier, propertyName);\n    }\n\n    /**\n     * Mutate the data for an attribute in the cache\n     *\n     * @method setAttr\n     * @public\n     * @param identifier\n     * @param propertyName\n     * @param value\n     */\n    setAttr(identifier, propertyName, value) {\n      let recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n      _classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData) ? recordData.setDirtyAttribute(propertyName, value) : recordData.setAttr(identifier, propertyName, value);\n    }\n\n    /**\n     * Mutate the data for an attribute in the cache\n     *\n     * DEPRECATED use setAttr\n     *\n     * @method setDirtyAttribute\n     * @public\n     * @deprecated\n     * @param identifier\n     * @param propertyName\n     * @param value\n     */\n    setDirtyAttribute(propertyName, value) {\n      let recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n      _classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData) ? recordData.setDirtyAttribute(propertyName, value) : recordData.setAttr(_classPrivateFieldLooseBase(this, _identifier)[_identifier], propertyName, value);\n    }\n\n    /**\n     * Query the cache for the changed attributes of a resource.\n     *\n     * DEPRECATED use changedAttrs\n     *\n     * @method changedAttributes\n     * @public\n     * @deprecated\n     * @param identifier\n     * @returns\n     */\n    changedAttributes() {\n      const recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n      if (_classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData)) {\n        return recordData.changedAttributes();\n      }\n      return recordData.changedAttrs(_classPrivateFieldLooseBase(this, _identifier)[_identifier]);\n    }\n\n    /**\n     * Query the cache for the changed attributes of a resource.\n     *\n     * @method changedAttrs\n     * @public\n     * @deprecated\n     * @param identifier\n     * @returns\n     */\n    changedAttrs(identifier) {\n      const recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n      if (_classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData)) {\n        return recordData.changedAttributes();\n      }\n      return recordData.changedAttrs(identifier);\n    }\n\n    /**\n     * Query the cache for whether any mutated attributes exist\n     *\n     * DEPRECATED use hasChangedAttrs\n     *\n     * @method hasChangedAttributes\n     * @public\n     * @deprecated\n     * @returns {boolean}\n     */\n    hasChangedAttributes() {\n      const recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n      return _classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData) ? recordData.hasChangedAttributes() : recordData.hasChangedAttrs(_classPrivateFieldLooseBase(this, _identifier)[_identifier]);\n    }\n\n    /**\n     * Query the cache for whether any mutated attributes exist\n     *\n     * @method hasChangedAttrs\n     * @public\n     * @param identifier\n     * @returns {boolean}\n     */\n    hasChangedAttrs(identifier) {\n      const recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n      return _classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData) ? recordData.hasChangedAttributes() : recordData.hasChangedAttrs(identifier);\n    }\n\n    /**\n     * Tell the cache to discard any uncommitted mutations to attributes\n     *\n     * DEPRECATED use rollbackAttrs\n     *\n     * @method rollbackAttributes\n     * @public\n     * @deprecated\n     * @returns\n     */\n    rollbackAttributes() {\n      const recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n      return _classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData) ? recordData.rollbackAttributes() : recordData.rollbackAttrs(_classPrivateFieldLooseBase(this, _identifier)[_identifier]);\n    }\n\n    /**\n     * Tell the cache to discard any uncommitted mutations to attributes\n     *\n     * @method rollbackAttrs\n     * @public\n     * @param identifier\n     * @returns the names of attributes that were restored\n     */\n    rollbackAttrs(identifier) {\n      const recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n      return _classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData) ? recordData.rollbackAttributes() : recordData.rollbackAttrs(identifier);\n    }\n\n    // Relationships\n    // =============\n\n    // the third arg here is \"private\". In a world with only V2 it is not necessary\n    // but in one in which we must convert a call from V2 -> V1 it is required to do this\n    // or else to do nasty schema lookup things\n    // @runspired has implemented this concept in relationships spikes and is confident\n    // we do not need any signal about whether a relationship is a collection or not at this\n    // boundary\n    /**\n     * Query the cache for the current state of a relationship property\n     *\n     * @method getRelationship\n     * @public\n     * @param identifier\n     * @param propertyName\n     * @returns resource relationship object\n     */\n    getRelationship(identifier, propertyName, isCollection) {\n      if (isCollection === void 0) {\n        isCollection = false;\n      }\n      let recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n      if (_classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData)) {\n        let isBelongsTo = !isCollection;\n        return isBelongsTo ? recordData.getBelongsTo(propertyName) : recordData.getHasMany(propertyName);\n      }\n      return recordData.getRelationship(identifier, propertyName);\n    }\n\n    /**\n     * Query the cache for the current state of a belongsTo field\n     *\n     * DEPRECATED use `getRelationship`\n     *\n     * @method getBelongsTo\n     * @public\n     * @deprecated\n     * @param propertyName\n     * @returns single resource relationship object\n     */\n    getBelongsTo(propertyName) {\n      let recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n      if (_classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData)) {\n        return recordData.getBelongsTo(propertyName);\n      } else {\n        let identifier = _classPrivateFieldLooseBase(this, _identifier)[_identifier];\n        return recordData.getRelationship(identifier, propertyName);\n      }\n    }\n\n    /**\n     * Query the cache for the current state of a hasMany field\n     *\n     * DEPRECATED use `getRelationship`\n     *\n     * @method getHasMany\n     * @public\n     * @deprecated\n     * @param propertyName\n     * @returns single resource relationship object\n     */\n    getHasMany(propertyName) {\n      let recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n      if (_classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData)) {\n        return recordData.getHasMany(propertyName);\n      } else {\n        let identifier = _classPrivateFieldLooseBase(this, _identifier)[_identifier];\n        return recordData.getRelationship(identifier, propertyName);\n      }\n    }\n\n    /**\n     * Mutate the current state of a belongsTo relationship\n     *\n     * DEPRECATED use update\n     *\n     * @method setDirtyBelongsTo\n     * @public\n     * @deprecated\n     * @param propertyName\n     * @param value\n     */\n    setDirtyBelongsTo(propertyName, value) {\n      const recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n      _classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData) ? recordData.setDirtyBelongsTo(propertyName, value) : recordData.update({\n        op: 'replaceRelatedRecord',\n        record: _classPrivateFieldLooseBase(this, _identifier)[_identifier],\n        field: propertyName,\n        value: value ? value.getResourceIdentifier() : null\n      });\n    }\n\n    /**\n     * Mutate the current state of a hasMany relationship by adding values\n     * An index may optionally be specified which the cache should use for\n     * where in the list to insert the records\n     *\n     * DEPRECATED use update\n     *\n     * @method addToHasMany\n     * @deprecated\n     * @public\n     * @param propertyName\n     * @param value\n     * @param idx\n     */\n    addToHasMany(propertyName, value, idx) {\n      const identifier = _classPrivateFieldLooseBase(this, _identifier)[_identifier];\n      const recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n      _classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData) ? recordData.addToHasMany(propertyName, value, idx) : recordData.update({\n        op: 'addToRelatedRecords',\n        field: propertyName,\n        record: identifier,\n        value: value.map(v => v.getResourceIdentifier())\n      });\n    }\n\n    /**\n     * Mutate the current state of a hasMany relationship by removing values.\n     *\n     * DEPRECATED use update\n     *\n     * @method removeFromHasMany\n     * @deprecated\n     * @public\n     * @param propertyName\n     * @param value\n     */\n    removeFromHasMany(propertyName, value) {\n      const identifier = _classPrivateFieldLooseBase(this, _identifier)[_identifier];\n      const recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n      _classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData) ? recordData.removeFromHasMany(propertyName, value) : recordData.update({\n        op: 'removeFromRelatedRecords',\n        record: identifier,\n        field: propertyName,\n        value: value.map(v => v.getResourceIdentifier())\n      });\n    }\n\n    /**\n     * Mutate the current state of a hasMany relationship by replacing it entirely\n     *\n     * DEPRECATED use `setHasMany`\n     *\n     * @method setDirtyHasMany\n     * @public\n     * @deprecated\n     * @param propertyName\n     * @param value\n     */\n    setDirtyHasMany(propertyName, value) {\n      let recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n      _classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData) ? recordData.setDirtyHasMany(propertyName, value) : recordData.update({\n        op: 'replaceRelatedRecords',\n        record: _classPrivateFieldLooseBase(this, _identifier)[_identifier],\n        field: propertyName,\n        value: value.map(rd => rd.getResourceIdentifier())\n      });\n    }\n\n    // State\n    // =============\n\n    /**\n     * Update the cache state for the given resource to be marked as locally deleted,\n     * or remove such a mark.\n     *\n     * @method setIsDeleted\n     * @public\n     * @param identifier\n     * @param isDeleted\n     */\n    setIsDeleted(identifier, isDeleted) {\n      if (!isStableIdentifier(identifier)) {\n        isDeleted = identifier;\n        identifier = _classPrivateFieldLooseBase(this, _identifier)[_identifier];\n      }\n      const recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n      _classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData) ? recordData.setIsDeleted(isDeleted) : recordData.setIsDeleted(identifier, isDeleted);\n    }\n\n    /**\n     * Query the cache for any validation errors applicable to the given resource.\n     *\n     * @method getErrors\n     * @public\n     * @param identifier\n     * @returns\n     */\n    getErrors(identifier) {\n      return _classPrivateFieldLooseBase(this, _recordData)[_recordData].getErrors(identifier || _classPrivateFieldLooseBase(this, _identifier)[_identifier]);\n    }\n\n    /**\n     * Query the cache for whether a given resource has any available data\n     *\n     * @method isEmpty\n     * @public\n     * @param identifier\n     * @returns {boolean}\n     */\n    isEmpty(identifier) {\n      const recordData = _classPrivateFieldLooseBase(this, _recordData)[_recordData];\n      return _classPrivateFieldLooseBase(this, _isDeprecated)[_isDeprecated](recordData) ? recordData.isEmpty?.(identifier || _classPrivateFieldLooseBase(this, _identifier)[_identifier]) || false : recordData.isEmpty(identifier || _classPrivateFieldLooseBase(this, _identifier)[_identifier]);\n    }\n\n    /**\n     * Query the cache for whether a given resource was created locally and not\n     * yet persisted.\n     *\n     * @method isNew\n     * @public\n     * @param identifier\n     * @returns {boolean}\n     */\n    isNew(identifier) {\n      return _classPrivateFieldLooseBase(this, _recordData)[_recordData].isNew(identifier || _classPrivateFieldLooseBase(this, _identifier)[_identifier]);\n    }\n\n    /**\n     * Query the cache for whether a given resource is marked as deleted (but not\n     * necessarily persisted yet).\n     *\n     * @method isDeleted\n     * @public\n     * @param identifier\n     * @returns {boolean}\n     */\n    isDeleted(identifier) {\n      return _classPrivateFieldLooseBase(this, _recordData)[_recordData].isDeleted(identifier || _classPrivateFieldLooseBase(this, _identifier)[_identifier]);\n    }\n\n    /**\n     * Query the cache for whether a given resource has been deleted and that deletion\n     * has also been persisted.\n     *\n     * @method isDeletionCommitted\n     * @public\n     * @param identifier\n     * @returns {boolean}\n     */\n    isDeletionCommitted(identifier) {\n      return _classPrivateFieldLooseBase(this, _recordData)[_recordData].isDeletionCommitted(identifier || _classPrivateFieldLooseBase(this, _identifier)[_identifier]);\n    }\n  }\n  function _isDeprecated2(recordData) {\n    let version = recordData.version || '1';\n    return version !== this.version;\n  }\n  var _recordDatas = /*#__PURE__*/_classPrivateFieldLooseKey(\"recordDatas\");\n  var _recordData3 = /*#__PURE__*/_classPrivateFieldLooseKey(\"recordData\");\n  class SingletonRecordDataManager {\n    constructor() {\n      Object.defineProperty(this, _recordData3, {\n        value: _recordData4\n      });\n      this.version = '2';\n      Object.defineProperty(this, _recordDatas, {\n        writable: true,\n        value: void 0\n      });\n      _classPrivateFieldLooseBase(this, _recordDatas)[_recordDatas] = new Map();\n    }\n    _addRecordData(identifier, recordData) {\n      _classPrivateFieldLooseBase(this, _recordDatas)[_recordDatas].set(identifier, recordData);\n    }\n    // Cache\n    // =====\n\n    pushData(identifier, data, hasRecord) {\n      return _classPrivateFieldLooseBase(this, _recordData3)[_recordData3](identifier).pushData(identifier, data, hasRecord);\n    }\n    sync(op) {\n      _classPrivateFieldLooseBase(this, _recordData3)[_recordData3](op.record).sync(op);\n    }\n    clientDidCreate(identifier, options) {\n      return _classPrivateFieldLooseBase(this, _recordData3)[_recordData3](identifier).clientDidCreate(identifier, options);\n    }\n    willCommit(identifier) {\n      _classPrivateFieldLooseBase(this, _recordData3)[_recordData3](identifier).willCommit(identifier);\n    }\n    didCommit(identifier, data) {\n      _classPrivateFieldLooseBase(this, _recordData3)[_recordData3](identifier).didCommit(identifier, data);\n    }\n    commitWasRejected(identifier, errors) {\n      _classPrivateFieldLooseBase(this, _recordData3)[_recordData3](identifier).commitWasRejected(identifier, errors);\n    }\n    unloadRecord(identifier) {\n      _classPrivateFieldLooseBase(this, _recordData3)[_recordData3](identifier).unloadRecord(identifier);\n    }\n\n    // Attrs\n    // =====\n\n    getAttr(identifier, propertyName) {\n      return _classPrivateFieldLooseBase(this, _recordData3)[_recordData3](identifier).getAttr(identifier, propertyName);\n    }\n    setAttr(identifier, propertyName, value) {\n      _classPrivateFieldLooseBase(this, _recordData3)[_recordData3](identifier).setAttr(identifier, propertyName, value);\n    }\n    changedAttrs(identifier) {\n      return _classPrivateFieldLooseBase(this, _recordData3)[_recordData3](identifier).changedAttrs(identifier);\n    }\n    hasChangedAttrs(identifier) {\n      return _classPrivateFieldLooseBase(this, _recordData3)[_recordData3](identifier).hasChangedAttrs(identifier);\n    }\n    rollbackAttrs(identifier) {\n      return _classPrivateFieldLooseBase(this, _recordData3)[_recordData3](identifier).rollbackAttrs(identifier);\n    }\n    getRelationship(identifier, propertyName) {\n      return _classPrivateFieldLooseBase(this, _recordData3)[_recordData3](identifier).getRelationship(identifier, propertyName);\n    }\n    update(operation) {\n      _classPrivateFieldLooseBase(this, _recordData3)[_recordData3](operation.record).update(operation);\n    }\n\n    // State\n    // =============\n\n    setIsDeleted(identifier, isDeleted) {\n      _classPrivateFieldLooseBase(this, _recordData3)[_recordData3](identifier).setIsDeleted(identifier, isDeleted);\n    }\n    getErrors(identifier) {\n      return _classPrivateFieldLooseBase(this, _recordData3)[_recordData3](identifier).getErrors(identifier);\n    }\n    isEmpty(identifier) {\n      return _classPrivateFieldLooseBase(this, _recordData3)[_recordData3](identifier).isEmpty(identifier);\n    }\n    isNew(identifier) {\n      return _classPrivateFieldLooseBase(this, _recordData3)[_recordData3](identifier).isNew(identifier);\n    }\n    isDeleted(identifier) {\n      return _classPrivateFieldLooseBase(this, _recordData3)[_recordData3](identifier).isDeleted(identifier);\n    }\n    isDeletionCommitted(identifier) {\n      return _classPrivateFieldLooseBase(this, _recordData3)[_recordData3](identifier).isDeletionCommitted(identifier);\n    }\n  }\n  function _recordData4(identifier) {\n    (!(_classPrivateFieldLooseBase(this, _recordDatas)[_recordDatas].has(identifier)) && debug.assert(`No RecordData Yet Exists!`, _classPrivateFieldLooseBase(this, _recordDatas)[_recordDatas].has(identifier)));\n    return _classPrivateFieldLooseBase(this, _recordDatas)[_recordDatas].get(identifier);\n  }\n\n  function constructResource(type, id, lid) {\n    if (typeof type === 'object' && type !== null) {\n      let resource = type;\n      if (isStableIdentifier(resource)) {\n        return resource;\n      }\n      if ('id' in resource) {\n        resource.id = coerceId(resource.id);\n      }\n      (!('id' in resource && isNonEmptyString(resource.id) || isNonEmptyString(resource.lid)) && debug.assert('Expected either id or lid to be a valid string', 'id' in resource && isNonEmptyString(resource.id) || isNonEmptyString(resource.lid)));\n      (!(!('id' in resource) || typeof resource.type === 'string') && debug.assert('if id is present, the type must be a string', !('id' in resource) || typeof resource.type === 'string'));\n      return resource;\n    } else {\n      const trueId = coerceId(id);\n      if (!isNonEmptyString(trueId)) {\n        if (isNonEmptyString(lid)) {\n          return {\n            lid\n          };\n        }\n        throw new Error('Expected either id or lid to be a valid string');\n      }\n      (!(typeof type === 'string') && debug.assert('type must be a string', typeof type === 'string'));\n      if (isNonEmptyString(lid)) {\n        return {\n          type,\n          id: trueId,\n          lid\n        };\n      }\n      return {\n        type,\n        id: trueId\n      };\n    }\n  }\n\n  /**\n    @module @ember-data/store\n  */\n\n  class LegacyWrapper {\n    constructor(_store) {\n      this._store = _store;\n      this._willNotify = false;\n      this._pendingNotifies = new Map();\n    }\n    get identifierCache() {\n      return this._store.identifierCache;\n    }\n    _scheduleNotification(identifier, key) {\n      let pending = this._pendingNotifies.get(identifier);\n      if (!pending) {\n        pending = new Set();\n        this._pendingNotifies.set(identifier, pending);\n      }\n      pending.add(key);\n      if (this._willNotify === true) {\n        return;\n      }\n      this._willNotify = true;\n      // it's possible a RecordData adhoc notifies us,\n      // in which case we sync flush\n      if (this._store._cbs) {\n        this._store._schedule('notify', () => this._flushNotifications());\n      } else {\n        this._flushNotifications();\n      }\n    }\n    _flushNotifications() {\n      if (this._willNotify === false) {\n        return;\n      }\n      let pending = this._pendingNotifies;\n      this._pendingNotifies = new Map();\n      this._willNotify = false;\n      pending.forEach((set, identifier) => {\n        set.forEach(key => {\n          this._store._notificationManager.notify(identifier, 'relationships', key);\n        });\n      });\n    }\n    notifyChange(identifier, namespace, key) {\n      (!(isStableIdentifier(identifier)) && debug.assert(`Expected a stable identifier`, isStableIdentifier(identifier))); // TODO do we still get value from this?\n      if (namespace === 'relationships' && key) {\n        this._scheduleNotification(identifier, key);\n        return;\n      }\n      this._store._notificationManager.notify(identifier, namespace, key);\n      if (namespace === 'state') {\n        this._store.recordArrayManager.identifierChanged(identifier);\n      }\n    }\n    notifyErrorsChange(type, id, lid) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_V1CACHE_STORE_APIS)) {\n        (debug.deprecate(`StoreWrapper.notifyErrorsChange has been deprecated in favor of StoreWrapper.notifyChange`, false, {\n          id: 'ember-data:deprecate-v1cache-store-apis',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            enabled: '4.7',\n            available: '4.7'\n          }\n        }));\n      }\n      const resource = constructResource(type, id, lid);\n      const identifier = this.identifierCache.getOrCreateRecordIdentifier(resource);\n      this._store._notificationManager.notify(identifier, 'errors');\n    }\n    attributesDefinitionFor(type) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_V1CACHE_STORE_APIS)) {\n        (debug.deprecate(`StoreWrapper.attributesDefinitionFor has been deprecated in favor of StoreWrapper.getSchemaDefinitionService().attributesDefinitionFor`, false, {\n          id: 'ember-data:deprecate-v1cache-store-apis',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            enabled: '4.7',\n            available: '4.7'\n          }\n        }));\n      }\n      return this._store.getSchemaDefinitionService().attributesDefinitionFor({\n        type\n      });\n    }\n    relationshipsDefinitionFor(type) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_V1CACHE_STORE_APIS)) {\n        (debug.deprecate(`StoreWrapper.relationshipsDefinitionFor has been deprecated in favor of StoreWrapper.getSchemaDefinitionService().relationshipsDefinitionFor`, false, {\n          id: 'ember-data:deprecate-v1cache-store-apis',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            enabled: '4.7',\n            available: '4.7'\n          }\n        }));\n      }\n      return this._store.getSchemaDefinitionService().relationshipsDefinitionFor({\n        type\n      });\n    }\n    getSchemaDefinitionService() {\n      return this._store.getSchemaDefinitionService();\n    }\n    notifyPropertyChange(type, id, lid, key) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_V1CACHE_STORE_APIS)) {\n        (debug.deprecate(`StoreWrapper.notifyPropertyChange has been deprecated in favor of StoreWrapper.notifyChange`, false, {\n          id: 'ember-data:deprecate-v1cache-store-apis',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            enabled: '4.7',\n            available: '4.7'\n          }\n        }));\n      }\n      const resource = constructResource(type, id, lid);\n      const identifier = this.identifierCache.getOrCreateRecordIdentifier(resource);\n      this._store._notificationManager.notify(identifier, 'attributes', key);\n    }\n    notifyHasManyChange(type, id, lid, key) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_V1CACHE_STORE_APIS)) {\n        (debug.deprecate(`StoreWrapper.notifyHasManyChange has been deprecated in favor of StoreWrapper.notifyChange`, false, {\n          id: 'ember-data:deprecate-v1cache-store-apis',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            enabled: '4.7',\n            available: '4.7'\n          }\n        }));\n      }\n      const resource = constructResource(type, id, lid);\n      const identifier = this.identifierCache.getOrCreateRecordIdentifier(resource);\n      this._scheduleNotification(identifier, key);\n    }\n    notifyBelongsToChange(type, id, lid, key) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_V1CACHE_STORE_APIS)) {\n        (debug.deprecate(`StoreWrapper.notifyBelongsToChange has been deprecated in favor of StoreWrapper.notifyChange`, false, {\n          id: 'ember-data:deprecate-v1cache-store-apis',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            enabled: '4.7',\n            available: '4.7'\n          }\n        }));\n      }\n      const resource = constructResource(type, id, lid);\n      const identifier = this.identifierCache.getOrCreateRecordIdentifier(resource);\n      this._scheduleNotification(identifier, key);\n    }\n    notifyStateChange(type, id, lid, key) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_V1CACHE_STORE_APIS)) {\n        (debug.deprecate(`StoreWrapper.notifyStateChange has been deprecated in favor of StoreWrapper.notifyChange`, false, {\n          id: 'ember-data:deprecate-v1cache-store-apis',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            enabled: '4.7',\n            available: '4.7'\n          }\n        }));\n      }\n      const resource = constructResource(type, id, lid);\n      const identifier = this.identifierCache.getOrCreateRecordIdentifier(resource);\n      this._store._notificationManager.notify(identifier, 'state');\n      this._store.recordArrayManager.identifierChanged(identifier);\n    }\n    recordDataFor(type, id, lid) {\n      let identifier;\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_V1CACHE_STORE_APIS)) {\n        if (!isStableIdentifier(type)) {\n          // we also deprecate create capability. This behavior was problematic because\n          // there's no outside association between this RecordData and an Identifier.\n          // It's likely a mistake when we hit this codepath, but we said in an early\n          // RFC we'd allow this.\n          // With V2 we are enforcing someone to use the record-data and identifier-cache APIs to\n          // create a new identifier and then call clientDidCreate on the RecordData\n          // instead.\n          identifier = !id && !lid ? this.identifierCache.createIdentifierForNewRecord({\n            type: type\n          }) : this.identifierCache.getOrCreateRecordIdentifier(constructResource(type, id, lid));\n        } else {\n          identifier = type;\n        }\n      } else {\n        (!(isStableIdentifier(type)) && debug.assert(`Expected a stable identifier`, isStableIdentifier(type)));\n        identifier = type;\n      }\n      const recordData = this._store._instanceCache.getRecordData(identifier);\n      if (!id && !lid) {\n        recordData.clientDidCreate(identifier);\n        this._store.recordArrayManager.identifierAdded(identifier);\n      }\n      return recordData;\n    }\n    setRecordId(type, id, lid) {\n      let identifier;\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_V1CACHE_STORE_APIS)) {\n        if (!isStableIdentifier(type)) {\n          const modelName = normalizeModelName$1(type);\n          const resource = constructResource(modelName, null, coerceId(lid));\n          identifier = this.identifierCache.peekRecordIdentifier(resource);\n        } else {\n          identifier = type;\n        }\n      } else {\n        (!(isStableIdentifier(type)) && debug.assert(`Expected a stable identifier`, isStableIdentifier(type)));\n        identifier = type;\n      }\n      (!(identifier) && debug.assert(`Unable to find an identifier to update the ID for for ${lid}`, identifier));\n      this._store._instanceCache.setRecordId(identifier, id);\n    }\n    isRecordInUse(type, id, lid) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_V1CACHE_STORE_APIS)) {\n        (debug.deprecate(`StoreWrapper.isRecordInUSe has been deprecated in favor of StoreWrapper.hasRecord`, false, {\n          id: 'ember-data:deprecate-v1cache-store-apis',\n          for: 'ember-data',\n          until: '5.0',\n          since: {\n            enabled: '4.7',\n            available: '4.7'\n          }\n        }));\n      }\n      const resource = constructResource(type, id, lid);\n      const identifier = this.identifierCache.peekRecordIdentifier(resource);\n      const record = identifier && this._store._instanceCache.peek({\n        identifier,\n        bucket: 'record'\n      });\n      return record ? !(record.isDestroyed || record.isDestroying) : false;\n    }\n    hasRecord(identifier) {\n      return Boolean(this._store._instanceCache.peek({\n        identifier,\n        bucket: 'record'\n      }));\n    }\n    disconnectRecord(type, id, lid) {\n      let identifier;\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_V1CACHE_STORE_APIS)) {\n        if (typeof type === 'string') {\n          (debug.deprecate(`StoreWrapper.disconnectRecord(<type>) has been deprecated in favor of StoreWrapper.disconnectRecord(<identifier>)`, false, {\n            id: 'ember-data:deprecate-v1cache-store-apis',\n            for: 'ember-data',\n            until: '5.0',\n            since: {\n              enabled: '4.7',\n              available: '4.7'\n            }\n          }));\n          let resource = constructResource(type, id, lid);\n          identifier = this.identifierCache.peekRecordIdentifier(resource);\n        } else {\n          identifier = type;\n        }\n      } else {\n        identifier = type;\n      }\n      (!(isStableIdentifier(identifier)) && debug.assert(`Expected a stable identifier`, isStableIdentifier(identifier)));\n      this._store._instanceCache.disconnect(identifier);\n      this._pendingNotifies.delete(identifier);\n    }\n  }\n  class V2RecordDataStoreWrapper {\n    constructor(_store) {\n      this._store = _store;\n      this._willNotify = false;\n      this._pendingNotifies = new Map();\n    }\n    get identifierCache() {\n      return this._store.identifierCache;\n    }\n    _scheduleNotification(identifier, key) {\n      let pending = this._pendingNotifies.get(identifier);\n      if (!pending) {\n        pending = new Set();\n        this._pendingNotifies.set(identifier, pending);\n      }\n      pending.add(key);\n      if (this._willNotify === true) {\n        return;\n      }\n      this._willNotify = true;\n      // it's possible a RecordData adhoc notifies us,\n      // in which case we sync flush\n      if (this._store._cbs) {\n        this._store._schedule('notify', () => this._flushNotifications());\n      } else {\n        this._flushNotifications();\n      }\n    }\n    _flushNotifications() {\n      if (this._willNotify === false) {\n        return;\n      }\n      let pending = this._pendingNotifies;\n      this._pendingNotifies = new Map();\n      this._willNotify = false;\n      pending.forEach((set, identifier) => {\n        set.forEach(key => {\n          this._store._notificationManager.notify(identifier, 'relationships', key);\n        });\n      });\n    }\n    notifyChange(identifier, namespace, key) {\n      (!(isStableIdentifier(identifier)) && debug.assert(`Expected a stable identifier`, isStableIdentifier(identifier))); // TODO do we still get value from this?\n      if (namespace === 'relationships' && key) {\n        this._scheduleNotification(identifier, key);\n        return;\n      }\n      this._store._notificationManager.notify(identifier, namespace, key);\n      if (namespace === 'state') {\n        this._store.recordArrayManager.identifierChanged(identifier);\n      }\n    }\n    getSchemaDefinitionService() {\n      return this._store.getSchemaDefinitionService();\n    }\n    recordDataFor(identifier) {\n      (!(isStableIdentifier(identifier)) && debug.assert(`Expected a stable identifier`, isStableIdentifier(identifier)));\n      return this._store._instanceCache.getRecordData(identifier);\n    }\n    setRecordId(identifier, id) {\n      (!(isStableIdentifier(identifier)) && debug.assert(`Expected a stable identifier`, isStableIdentifier(identifier)));\n      this._store._instanceCache.setRecordId(identifier, id);\n    }\n    hasRecord(identifier) {\n      return Boolean(this._store._instanceCache.peek({\n        identifier,\n        bucket: 'record'\n      }));\n    }\n    disconnectRecord(identifier) {\n      (!(isStableIdentifier(identifier)) && debug.assert(`Expected a stable identifier`, isStableIdentifier(identifier)));\n      this._store._instanceCache.disconnect(identifier);\n      this._pendingNotifies.delete(identifier);\n    }\n  }\n  const RecordDataStoreWrapper = runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_V1CACHE_STORE_APIS) ? LegacyWrapper : V2RecordDataStoreWrapper;\n\n  /**\n    Snapshot is not directly instantiable.\n    Instances are provided to a consuming application's\n    adapters and serializers for certain requests.\n\n    @class Snapshot\n    @public\n  */\n  class Snapshot {\n    /**\n     * @method constructor\n     * @constructor\n     * @private\n     * @param options\n     * @param identifier\n     * @param _store\n     */\n    constructor(options, identifier, store) {\n      this._store = store;\n      this.__attributes = null;\n      this._belongsToRelationships = Object.create(null);\n      this._belongsToIds = Object.create(null);\n      this._hasManyRelationships = Object.create(null);\n      this._hasManyIds = Object.create(null);\n      const hasRecord = !!store._instanceCache.peek({\n        identifier,\n        bucket: 'record'\n      });\n      this.modelName = identifier.type;\n\n      /**\n        The unique RecordIdentifier associated with this Snapshot.\n         @property identifier\n        @public\n        @type {StableRecordIdentifier}\n      */\n      this.identifier = identifier;\n\n      /*\n        If the we do not yet have a record, then we are\n        likely a snapshot being provided to a find request, so we\n        populate __attributes lazily. Else, to preserve the \"moment\n        in time\" in which a snapshot is created, we greedily grab\n        the values.\n       */\n      if (hasRecord) {\n        this._attributes;\n      }\n\n      /**\n       The id of the snapshot's underlying record\n        Example\n        ```javascript\n       // store.push('post', { id: 1, author: 'Tomster', title: 'Ember.js rocks' });\n       postSnapshot.id; // => '1'\n       ```\n        @property id\n       @type {String}\n       @public\n       */\n      this.id = identifier.id;\n\n      /**\n       A hash of adapter options\n       @property adapterOptions\n       @type {Object}\n       @public\n       */\n      this.adapterOptions = options.adapterOptions;\n\n      /**\n       If `include` was passed to the options hash for the request, the value\n       would be available here.\n        @property include\n       @type {String|Array}\n       @public\n       */\n      this.include = options.include;\n\n      /**\n       The name of the type of the underlying record for this snapshot, as a string.\n        @property modelName\n       @type {String}\n       @public\n       */\n      this.modelName = identifier.type;\n      if (hasRecord) {\n        this._changedAttributes = this._store._instanceCache.getRecordData(identifier).changedAttrs(identifier);\n      }\n    }\n\n    /**\n     The underlying record for this snapshot. Can be used to access methods and\n     properties defined on the record.\n      Example\n      ```javascript\n     let json = snapshot.record.toJSON();\n     ```\n      @property record\n     @type {Model}\n     @public\n     */\n    get record() {\n      return this._store._instanceCache.getRecord(this.identifier);\n    }\n    get _attributes() {\n      if (this.__attributes !== null) {\n        return this.__attributes;\n      }\n      let attributes = this.__attributes = Object.create(null);\n      const {\n        identifier\n      } = this;\n      let attrs = Object.keys(this._store.getSchemaDefinitionService().attributesDefinitionFor(identifier));\n      let recordData = this._store._instanceCache.getRecordData(identifier);\n      attrs.forEach(keyName => {\n        attributes[keyName] = recordData.getAttr(identifier, keyName);\n      });\n      return attributes;\n    }\n\n    /**\n     The type of the underlying record for this snapshot, as a Model.\n      @property type\n      @public\n      @deprecated\n     @type {Model}\n     */\n\n    get isNew() {\n      const recordData = this._store._instanceCache.peek({\n        identifier: this.identifier,\n        bucket: 'recordData'\n      });\n      return recordData?.isNew(this.identifier) || false;\n    }\n\n    /**\n     Returns the value of an attribute.\n      Example\n      ```javascript\n     // store.push('post', { id: 1, author: 'Tomster', title: 'Ember.js rocks' });\n     postSnapshot.attr('author'); // => 'Tomster'\n     postSnapshot.attr('title'); // => 'Ember.js rocks'\n     ```\n      Note: Values are loaded eagerly and cached when the snapshot is created.\n      @method attr\n     @param {String} keyName\n     @return {Object} The attribute value or undefined\n     @public\n     */\n    attr(keyName) {\n      if (keyName in this._attributes) {\n        return this._attributes[keyName];\n      }\n      (debug.assert(`Model '${this.identifier}' has no attribute named '${keyName}' defined.`, false));\n    }\n\n    /**\n     Returns all attributes and their corresponding values.\n      Example\n      ```javascript\n     // store.push('post', { id: 1, author: 'Tomster', title: 'Ember.js rocks' });\n     postSnapshot.attributes(); // => { author: 'Tomster', title: 'Ember.js rocks' }\n     ```\n      @method attributes\n     @return {Object} All attributes of the current snapshot\n     @public\n     */\n    attributes() {\n      return {\n        ...this._attributes\n      };\n    }\n\n    /**\n     Returns all changed attributes and their old and new values.\n      Example\n      ```javascript\n     // store.push('post', { id: 1, author: 'Tomster', title: 'Ember.js rocks' });\n     postModel.set('title', 'Ember.js rocks!');\n     postSnapshot.changedAttributes(); // => { title: ['Ember.js rocks', 'Ember.js rocks!'] }\n     ```\n      @method changedAttributes\n     @return {Object} All changed attributes of the current snapshot\n     @public\n     */\n    changedAttributes() {\n      let changedAttributes = Object.create(null);\n      if (!this._changedAttributes) {\n        return changedAttributes;\n      }\n      let changedAttributeKeys = Object.keys(this._changedAttributes);\n      for (let i = 0, length = changedAttributeKeys.length; i < length; i++) {\n        let key = changedAttributeKeys[i];\n        changedAttributes[key] = this._changedAttributes[key].slice();\n      }\n      return changedAttributes;\n    }\n\n    /**\n     Returns the current value of a belongsTo relationship.\n      `belongsTo` takes an optional hash of options as a second parameter,\n     currently supported options are:\n      - `id`: set to `true` if you only want the ID of the related record to be\n     returned.\n      Example\n      ```javascript\n     // store.push('post', { id: 1, title: 'Hello World' });\n     // store.createRecord('comment', { body: 'Lorem ipsum', post: post });\n     commentSnapshot.belongsTo('post'); // => Snapshot\n     commentSnapshot.belongsTo('post', { id: true }); // => '1'\n      // store.push('comment', { id: 1, body: 'Lorem ipsum' });\n     commentSnapshot.belongsTo('post'); // => undefined\n     ```\n      Calling `belongsTo` will return a new Snapshot as long as there's any known\n     data for the relationship available, such as an ID. If the relationship is\n     known but unset, `belongsTo` will return `null`. If the contents of the\n     relationship is unknown `belongsTo` will return `undefined`.\n      Note: Relationships are loaded lazily and cached upon first access.\n      @method belongsTo\n     @param {String} keyName\n     @param {Object} [options]\n     @public\n     @return {(Snapshot|String|null|undefined)} A snapshot or ID of a known\n     relationship or null if the relationship is known but unset. undefined\n     will be returned if the contents of the relationship is unknown.\n     */\n    belongsTo(keyName, options) {\n      let returnModeIsId = !!(options && options.id);\n      let result;\n      let store = this._store;\n      if (returnModeIsId === true && keyName in this._belongsToIds) {\n        return this._belongsToIds[keyName];\n      }\n      if (returnModeIsId === false && keyName in this._belongsToRelationships) {\n        return this._belongsToRelationships[keyName];\n      }\n      let relationshipMeta = store.getSchemaDefinitionService().relationshipsDefinitionFor({\n        type: this.modelName\n      })[keyName];\n      (!(relationshipMeta && relationshipMeta.kind === 'belongsTo') && debug.assert(`Model '${this.identifier}' has no belongsTo relationship named '${keyName}' defined.`, relationshipMeta && relationshipMeta.kind === 'belongsTo')); // TODO @runspired it seems this code branch would not work with CUSTOM_MODEL_CLASSes\n      // this check is not a regression in behavior because relationships don't currently\n      // function without access to intimate API contracts between RecordData and Model.\n      // This is a requirement we should fix as soon as the relationship layer does not require\n      // this intimate API usage.\n      if (runtime.macroCondition(!true)) {\n        (debug.assert(`snapshot.belongsTo only supported when using the package @ember-data/record-data`));\n      }\n      const graphFor = esc__default.default(require('@ember-data/record-data/-private')).graphFor;\n      const {\n        identifier\n      } = this;\n      const relationship = graphFor(this._store).get(identifier, keyName);\n      (!(relationship) && debug.assert(`You looked up the ${keyName} belongsTo relationship for { type: ${identifier.type}, id: ${identifier.id}, lid: ${identifier.lid} but no such relationship was found.`, relationship));\n      (!(relationship.definition.kind === 'belongsTo') && debug.assert(`You looked up the ${keyName} belongsTo relationship for { type: ${identifier.type}, id: ${identifier.id}, lid: ${identifier.lid} but that relationship is a hasMany.`, relationship.definition.kind === 'belongsTo'));\n      let value = relationship.getData();\n      let data = value && value.data;\n      let inverseIdentifier = data ? store.identifierCache.getOrCreateRecordIdentifier(data) : null;\n      if (value && value.data !== undefined) {\n        if (inverseIdentifier && !store._instanceCache.getRecordData(inverseIdentifier).isDeleted(inverseIdentifier)) {\n          if (returnModeIsId) {\n            result = inverseIdentifier.id;\n          } else {\n            result = store._instanceCache.createSnapshot(inverseIdentifier);\n          }\n        } else {\n          result = null;\n        }\n      }\n      if (returnModeIsId) {\n        this._belongsToIds[keyName] = result;\n      } else {\n        this._belongsToRelationships[keyName] = result;\n      }\n      return result;\n    }\n\n    /**\n     Returns the current value of a hasMany relationship.\n      `hasMany` takes an optional hash of options as a second parameter,\n     currently supported options are:\n      - `ids`: set to `true` if you only want the IDs of the related records to be\n     returned.\n      Example\n      ```javascript\n     // store.push('post', { id: 1, title: 'Hello World', comments: [2, 3] });\n     postSnapshot.hasMany('comments'); // => [Snapshot, Snapshot]\n     postSnapshot.hasMany('comments', { ids: true }); // => ['2', '3']\n      // store.push('post', { id: 1, title: 'Hello World' });\n     postSnapshot.hasMany('comments'); // => undefined\n     ```\n      Note: Relationships are loaded lazily and cached upon first access.\n      @method hasMany\n     @param {String} keyName\n     @param {Object} [options]\n     @public\n     @return {(Array|undefined)} An array of snapshots or IDs of a known\n     relationship or an empty array if the relationship is known but unset.\n     undefined will be returned if the contents of the relationship is unknown.\n     */\n    hasMany(keyName, options) {\n      let returnModeIsIds = !!(options && options.ids);\n      let results;\n      let cachedIds = this._hasManyIds[keyName];\n      let cachedSnapshots = this._hasManyRelationships[keyName];\n      if (returnModeIsIds === true && keyName in this._hasManyIds) {\n        return cachedIds;\n      }\n      if (returnModeIsIds === false && keyName in this._hasManyRelationships) {\n        return cachedSnapshots;\n      }\n      let store = this._store;\n      let relationshipMeta = store.getSchemaDefinitionService().relationshipsDefinitionFor({\n        type: this.modelName\n      })[keyName];\n      (!(relationshipMeta && relationshipMeta.kind === 'hasMany') && debug.assert(`Model '${this.identifier}' has no hasMany relationship named '${keyName}' defined.`, relationshipMeta && relationshipMeta.kind === 'hasMany')); // TODO @runspired it seems this code branch would not work with CUSTOM_MODEL_CLASSes\n      // this check is not a regression in behavior because relationships don't currently\n      // function without access to intimate API contracts between RecordData and Model.\n      // This is a requirement we should fix as soon as the relationship layer does not require\n      // this intimate API usage.\n      if (runtime.macroCondition(!true)) {\n        (debug.assert(`snapshot.hasMany only supported when using the package @ember-data/record-data`));\n      }\n      const graphFor = esc__default.default(require('@ember-data/record-data/-private')).graphFor;\n      const {\n        identifier\n      } = this;\n      const relationship = graphFor(this._store).get(identifier, keyName);\n      (!(relationship) && debug.assert(`You looked up the ${keyName} hasMany relationship for { type: ${identifier.type}, id: ${identifier.id}, lid: ${identifier.lid} but no such relationship was found.`, relationship));\n      (!(relationship.definition.kind === 'hasMany') && debug.assert(`You looked up the ${keyName} hasMany relationship for { type: ${identifier.type}, id: ${identifier.id}, lid: ${identifier.lid} but that relationship is a belongsTo.`, relationship.definition.kind === 'hasMany'));\n      let value = relationship.getData();\n      if (value.data) {\n        results = [];\n        value.data.forEach(member => {\n          let inverseIdentifier = store.identifierCache.getOrCreateRecordIdentifier(member);\n          if (!store._instanceCache.getRecordData(inverseIdentifier).isDeleted(inverseIdentifier)) {\n            if (returnModeIsIds) {\n              results.push(inverseIdentifier.id);\n            } else {\n              results.push(store._instanceCache.createSnapshot(inverseIdentifier));\n            }\n          }\n        });\n      }\n\n      // we assign even if `undefined` so that we don't reprocess the relationship\n      // on next access. This works with the `keyName in` checks above.\n      if (returnModeIsIds) {\n        this._hasManyIds[keyName] = results;\n      } else {\n        this._hasManyRelationships[keyName] = results;\n      }\n      return results;\n    }\n\n    /**\n      Iterates through all the attributes of the model, calling the passed\n      function on each attribute.\n       Example\n       ```javascript\n      snapshot.eachAttribute(function(name, meta) {\n        // ...\n      });\n      ```\n       @method eachAttribute\n      @param {Function} callback the callback to execute\n      @param {Object} [binding] the value to which the callback's `this` should be bound\n      @public\n    */\n    eachAttribute(callback, binding) {\n      let attrDefs = this._store.getSchemaDefinitionService().attributesDefinitionFor(this.identifier);\n      Object.keys(attrDefs).forEach(key => {\n        callback.call(binding, key, attrDefs[key]);\n      });\n    }\n\n    /**\n      Iterates through all the relationships of the model, calling the passed\n      function on each relationship.\n       Example\n       ```javascript\n      snapshot.eachRelationship(function(name, relationship) {\n        // ...\n      });\n      ```\n       @method eachRelationship\n      @param {Function} callback the callback to execute\n      @param {Object} [binding] the value to which the callback's `this` should be bound\n      @public\n    */\n    eachRelationship(callback, binding) {\n      let relationshipDefs = this._store.getSchemaDefinitionService().relationshipsDefinitionFor(this.identifier);\n      Object.keys(relationshipDefs).forEach(key => {\n        callback.call(binding, key, relationshipDefs[key]);\n      });\n    }\n\n    /**\n      Serializes the snapshot using the serializer for the model.\n       Example\n       ```app/adapters/application.js\n      import Adapter from '@ember-data/adapter';\n       export default Adapter.extend({\n        createRecord(store, type, snapshot) {\n          let data = snapshot.serialize({ includeId: true });\n          let url = `/${type.modelName}`;\n           return fetch(url, {\n            method: 'POST',\n            body: data,\n          }).then((response) => response.json())\n        }\n      });\n      ```\n       @method serialize\n      @param {Object} options\n      @return {Object} an object whose values are primitive JSON values only\n      @public\n     */\n    serialize(options) {\n      const serializer = this._store.serializerFor(this.modelName);\n      (!(serializer) && debug.assert(`Cannot serialize record, no serializer found`, serializer));\n      return serializer.serialize(this, options);\n    }\n  }\n  if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_SNAPSHOT_MODEL_CLASS_ACCESS)) {\n    Object.defineProperty(Snapshot.prototype, 'type', {\n      get() {\n        (debug.deprecate(`Using Snapshot.type to access the ModelClass for a record is deprecated. Use store.modelFor(<modelName>) instead.`, false, {\n          id: 'ember-data:deprecate-snapshot-model-class-access',\n          until: '5.0',\n          for: 'ember-data',\n          since: {\n            available: '4.5.0',\n            enabled: '4.5.0'\n          }\n        }));\n        return this._store.modelFor(this.identifier.type);\n      }\n    });\n  }\n\n  /*\n   * Returns the RecordData instance associated with a given\n   * Model or Identifier\n   */\n\n  const RecordDataForIdentifierCache = new Map();\n  function setRecordDataFor(identifier, recordData) {\n    (!(!RecordDataForIdentifierCache.has(identifier) || RecordDataForIdentifierCache.get(identifier) === recordData) && debug.assert(`Illegal set of identifier`, !RecordDataForIdentifierCache.has(identifier) || RecordDataForIdentifierCache.get(identifier) === recordData));\n    RecordDataForIdentifierCache.set(identifier, recordData);\n  }\n  function removeRecordDataFor(identifier) {\n    RecordDataForIdentifierCache.delete(identifier);\n  }\n  function recordDataFor(instance) {\n    if (RecordDataForIdentifierCache.has(instance)) {\n      return RecordDataForIdentifierCache.get(instance);\n    }\n    return null;\n  }\n\n  let _peekGraph;\n  if (runtime.macroCondition(true)) {\n    let __peekGraph;\n    _peekGraph = wrapper => {\n      let a = esc__default.default(require('@ember-data/record-data/-private')).peekGraph;\n      __peekGraph = __peekGraph || a;\n      return __peekGraph(wrapper);\n    };\n  }\n\n  /**\n    @module @ember-data/store\n  */\n\n  const RecordCache = new Map();\n  function peekRecordIdentifier(record) {\n    return RecordCache.get(record);\n  }\n\n  /**\n    Retrieves the unique referentially-stable [RecordIdentifier](/ember-data/release/classes/StableRecordIdentifier)\n    assigned to the given record instance.\n    ```js\n    import { recordIdentifierFor } from \"@ember-data/store\";\n    // ... gain access to a record, for instance with peekRecord or findRecord\n    const record = store.peekRecord(\"user\", \"1\");\n    // get the identifier for the record (see docs for StableRecordIdentifier)\n    const identifier = recordIdentifierFor(record);\n    // access the identifier's properties.\n    const { id, type, lid } = identifier;\n    ```\n    @method recordIdentifierFor\n    @public\n    @static\n    @for @ember-data/store\n    @param {Object} record a record instance previously obstained from the store.\n    @returns {StableRecordIdentifier}\n   */\n  function recordIdentifierFor(record) {\n    (!(RecordCache.has(record)) && debug.assert(`${String(record)} is not a record instantiated by @ember-data/store`, RecordCache.has(record)));\n    return RecordCache.get(record);\n  }\n  function setRecordIdentifier(record, identifier) {\n    if (runtime.macroCondition(true)) {\n      if (RecordCache.has(record) && RecordCache.get(record) !== identifier) {\n        throw new Error(`${String(record)} was already assigned an identifier`);\n      }\n    }\n\n    /*\n    It would be nice to do a reverse check here that an identifier has not\n    previously been assigned a record; however, unload + rematerialization\n    prevents us from having a great way of doing so when CustomRecordClasses\n    don't necessarily give us access to a `isDestroyed` for dematerialized\n    instance.\n    */\n\n    RecordCache.set(record, identifier);\n  }\n  const StoreMap = new Map();\n  function storeFor(record) {\n    const store = StoreMap.get(record);\n    (!(store) && debug.assert(`A record in a disconnected state cannot utilize the store. This typically means the record has been destroyed, most commonly by unloading it.`, store));\n    return store;\n  }\n  class InstanceCache {\n    constructor(store) {\n      this.__instances = {\n        record: new Map(),\n        recordData: new Map(),\n        reference: new WeakMap()\n      };\n      this.store = store;\n      this._storeWrapper = new RecordDataStoreWrapper(this.store);\n      this.__recordDataFor = resource => {\n        // TODO enforce strict\n        const identifier = this.store.identifierCache.getOrCreateRecordIdentifier(resource);\n        return this.getRecordData(identifier);\n      };\n      store.identifierCache.__configureMerge((identifier, matchedIdentifier, resourceData) => {\n        let keptIdentifier = identifier;\n        if (identifier.id !== matchedIdentifier.id) {\n          keptIdentifier = 'id' in resourceData && identifier.id === resourceData.id ? identifier : matchedIdentifier;\n        } else if (identifier.type !== matchedIdentifier.type) {\n          keptIdentifier = 'type' in resourceData && identifier.type === resourceData.type ? identifier : matchedIdentifier;\n        }\n        let staleIdentifier = identifier === keptIdentifier ? matchedIdentifier : identifier;\n\n        // check for duplicate entities\n        let keptHasRecord = this.__instances.record.has(keptIdentifier);\n        let staleHasRecord = this.__instances.record.has(staleIdentifier);\n        let keptRecordData = this.__instances.recordData.get(keptIdentifier) || null;\n        let staleRecordData = this.__instances.recordData.get(staleIdentifier) || null;\n\n        // we cannot merge entities when both have records\n        // (this may not be strictly true, we could probably swap the recordData the record points at)\n        if (keptHasRecord && staleHasRecord) {\n          // TODO we probably don't need to throw these errors anymore\n          // we can probably just \"swap\" what data source the abandoned\n          // record points at so long as\n          // it itself is not retained by the store in any way.\n          if ('id' in resourceData) {\n            throw new Error(`Failed to update the 'id' for the RecordIdentifier '${identifier.type}:${String(identifier.id)} (${identifier.lid})' to '${String(resourceData.id)}', because that id is already in use by '${matchedIdentifier.type}:${String(matchedIdentifier.id)} (${matchedIdentifier.lid})'`);\n          }\n          (debug.assert(`Failed to update the RecordIdentifier '${identifier.type}:${String(identifier.id)} (${identifier.lid})' to merge with the detected duplicate identifier '${matchedIdentifier.type}:${String(matchedIdentifier.id)} (${String(matchedIdentifier.lid)})'`));\n        }\n        let recordData = keptRecordData || staleRecordData;\n        if (recordData) {\n          recordData.sync({\n            op: 'mergeIdentifiers',\n            record: staleIdentifier,\n            value: keptIdentifier\n          });\n        } else if (runtime.macroCondition(true)) {\n          // TODO notify cache always, this requires it always being a singleton\n          // and not ever specific to one record-data\n          this.store.__private_singleton_recordData?.sync({\n            op: 'mergeIdentifiers',\n            record: staleIdentifier,\n            value: keptIdentifier\n          });\n        }\n        if (staleRecordData === null) {\n          return keptIdentifier;\n        }\n\n        /*\n        TODO @runspired consider adding this to make polymorphism even nicer\n        if (HAS_RECORD_DATA_PACKAGE) {\n        if (identifier.type !== matchedIdentifier.type) {\n          const graphFor = importSync('@ember-data/record-data/-private').graphFor;\n          graphFor(this).registerPolymorphicType(identifier.type, matchedIdentifier.type);\n        }\n        }\n        */\n\n        this.unloadRecord(staleIdentifier);\n        return keptIdentifier;\n      });\n    }\n    peek(_ref) {\n      let {\n        identifier,\n        bucket\n      } = _ref;\n      return this.__instances[bucket]?.get(identifier);\n    }\n    getRecord(identifier, properties) {\n      let record = this.__instances.record.get(identifier);\n      if (!record) {\n        (!(!this.store.isDestroying && !this.store.isDestroyed) && debug.assert(`Cannot create a new record instance while the store is being destroyed`, !this.store.isDestroying && !this.store.isDestroyed));\n        const recordData = this.getRecordData(identifier);\n        record = this.store.instantiateRecord(identifier, properties || {}, this.__recordDataFor, this.store._notificationManager);\n        setRecordIdentifier(record, identifier);\n        setRecordDataFor(record, recordData);\n        StoreMap.set(record, this.store);\n        this.__instances.record.set(identifier, record);\n        if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").debug.LOG_INSTANCE_CACHE)) {\n          // eslint-disable-next-line no-console\n          console.log(`InstanceCache: created Record for ${String(identifier)}`, properties);\n        }\n      }\n      return record;\n    }\n    getRecordData(identifier) {\n      let recordData = this.__instances.recordData.get(identifier);\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_V1CACHE_STORE_APIS)) {\n        if (!recordData && this.store.createRecordDataFor.length > 2) {\n          (debug.deprecate(`Store.createRecordDataFor(<type>, <id>, <lid>, <storeWrapper>) has been deprecated in favor of Store.createRecordDataFor(<identifier>, <storeWrapper>)`, false, {\n            id: 'ember-data:deprecate-v1cache-store-apis',\n            for: 'ember-data',\n            until: '5.0',\n            since: {\n              enabled: '4.7',\n              available: '4.7'\n            }\n          }));\n          let recordDataInstance = this.store.createRecordDataFor(identifier.type, identifier.id,\n          // @ts-expect-error\n          identifier.lid, this._storeWrapper);\n          if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_V1_RECORD_DATA)) {\n            recordData = new NonSingletonRecordDataManager(this.store, recordDataInstance, identifier);\n          } else {\n            recordData = this.__cacheManager = this.__cacheManager || new NonSingletonRecordDataManager(this.store, recordDataInstance, identifier);\n          }\n        }\n      }\n      if (!recordData) {\n        let recordDataInstance = this.store.createRecordDataFor(identifier, this._storeWrapper);\n        if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_V1_RECORD_DATA)) {\n          recordData = new NonSingletonRecordDataManager(this.store, recordDataInstance, identifier);\n        } else {\n          if (runtime.macroCondition(true)) {\n            recordData = this.__cacheManager = this.__cacheManager || new SingletonRecordDataManager();\n            recordData._addRecordData(identifier, recordDataInstance);\n          } else {\n            recordData = recordDataInstance;\n          }\n        }\n        setRecordDataFor(identifier, recordData);\n        this.__instances.recordData.set(identifier, recordData);\n        if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").debug.LOG_INSTANCE_CACHE)) {\n          // eslint-disable-next-line no-console\n          console.log(`InstanceCache: created RecordData for ${String(identifier)}`);\n        }\n      }\n      return recordData;\n    }\n    getReference(identifier) {\n      let cache = this.__instances.reference;\n      let reference = cache.get(identifier);\n      if (!reference) {\n        reference = new RecordReference(this.store, identifier);\n        cache.set(identifier, reference);\n      }\n      return reference;\n    }\n    recordIsLoaded(identifier, filterDeleted) {\n      if (filterDeleted === void 0) {\n        filterDeleted = false;\n      }\n      const recordData = this.__instances.recordData.get(identifier);\n      if (!recordData) {\n        return false;\n      }\n      const isNew = recordData.isNew(identifier);\n      const isEmpty = recordData.isEmpty(identifier);\n\n      // if we are new we must consider ourselves loaded\n      if (isNew) {\n        return !recordData.isDeleted(identifier);\n      }\n      // even if we have a past request, if we are now empty we are not loaded\n      // typically this is true after an unloadRecord call\n\n      // if we are not empty, not new && we have a fulfilled request then we are loaded\n      // we should consider allowing for something to be loaded that is simply \"not empty\".\n      // which is how RecordState currently handles this case; however, RecordState is buggy\n      // in that it does not account for unloading.\n      return filterDeleted && recordData.isDeletionCommitted(identifier) ? false : !isEmpty;\n\n      /*\n      const req = this.store.getRequestStateService();\n      const fulfilled = req.getLastRequestForRecord(identifier);\n      const isLocallyLoaded = !isEmpty;\n      const isLoading =\n        !isLocallyLoaded &&\n        fulfilled === null &&\n        req.getPendingRequestsForRecord(identifier).some((req) => req.type === 'query');\n       if (isEmpty || (filterDeleted && recordData.isDeletionCommitted(identifier)) || isLoading) {\n        return false;\n      }\n       return true;\n      */\n    }\n    createSnapshot(identifier, options) {\n      if (options === void 0) {\n        options = {};\n      }\n      return new Snapshot(options, identifier, this.store);\n    }\n    disconnect(identifier) {\n      const record = this.__instances.record.get(identifier);\n      (!(!record || record.isDestroyed || record.isDestroying) && debug.assert('Cannot destroy record while it is still materialized', !record || record.isDestroyed || record.isDestroying));\n      if (runtime.macroCondition(true)) {\n        let graph = _peekGraph(this.store);\n        if (graph) {\n          graph.remove(identifier);\n        }\n      }\n      this.store.identifierCache.forgetRecordIdentifier(identifier);\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").debug.LOG_INSTANCE_CACHE)) {\n        // eslint-disable-next-line no-console\n        console.log(`InstanceCache: disconnected ${String(identifier)}`);\n      }\n    }\n    unloadRecord(identifier) {\n      if (runtime.macroCondition(true)) {\n        const requests = this.store.getRequestStateService().getPendingRequestsForRecord(identifier);\n        if (requests.some(req => {\n          return req.type === 'mutation';\n        })) {\n          (debug.assert(`You can only unload a record which is not inFlight. '${String(identifier)}'`));\n        }\n      }\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").debug.LOG_INSTANCE_CACHE)) {\n        // eslint-disable-next-line no-console\n        console.groupCollapsed(`InstanceCache: unloading record for ${String(identifier)}`);\n      }\n\n      // TODO is this join still necessary?\n      this.store._join(() => {\n        const record = this.__instances.record.get(identifier);\n        const recordData = this.__instances.recordData.get(identifier);\n        if (record) {\n          this.store.teardownRecord(record);\n          this.__instances.record.delete(identifier);\n          StoreMap.delete(record);\n          RecordCache.delete(record);\n          removeRecordDataFor(record);\n          if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").debug.LOG_INSTANCE_CACHE)) {\n            // eslint-disable-next-line no-console\n            console.log(`InstanceCache: destroyed record for ${String(identifier)}`);\n          }\n        }\n        if (recordData) {\n          recordData.unloadRecord(identifier);\n          this.__instances.recordData.delete(identifier);\n          removeRecordDataFor(identifier);\n        } else {\n          this.disconnect(identifier);\n        }\n        this.store._fetchManager.clearEntries(identifier);\n        this.store.recordArrayManager.identifierRemoved(identifier);\n        if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").debug.LOG_INSTANCE_CACHE)) {\n          // eslint-disable-next-line no-console\n          console.log(`InstanceCache: unloaded RecordData for ${String(identifier)}`);\n          // eslint-disable-next-line no-console\n          console.groupEnd();\n        }\n      });\n    }\n    clear(type) {\n      const typeCache = this.store.identifierCache._cache.types;\n      if (type === undefined) {\n        this.__instances.recordData.forEach((value, identifier) => {\n          this.unloadRecord(identifier);\n        });\n      } else {\n        let identifiers = typeCache[type]?.lid;\n        const rds = this.__instances.recordData;\n        if (identifiers) {\n          identifiers.forEach(identifier => {\n            if (rds.has(identifier)) {\n              this.unloadRecord(identifier);\n            }\n            // TODO we don't remove the identifier, should we?\n          });\n        }\n      }\n    }\n\n    // TODO this should move into the network layer\n    _fetchDataIfNeededForIdentifier(identifier, options) {\n      if (options === void 0) {\n        options = {};\n      }\n      // pre-loading will change the isEmpty value\n      const isEmpty = _isEmpty(this, identifier);\n      const isLoading = _isLoading(this, identifier);\n      if (options.preload) {\n        this.store._join(() => {\n          preloadData(this.store, identifier, options.preload);\n        });\n      }\n      let promise;\n      if (isEmpty) {\n        assertIdentifierHasId(identifier);\n        promise = this.store._fetchManager.scheduleFetch(identifier, options);\n      } else if (isLoading) {\n        promise = this.store._fetchManager.getPendingFetch(identifier, options);\n        (!(promise) && debug.assert(`Expected to find a pending request for a record in the loading state, but found none`, promise));\n      } else {\n        promise = RSVP.resolve(identifier);\n      }\n      return promise;\n    }\n\n    // TODO this should move into something coordinating operations\n    setRecordId(identifier, id) {\n      const {\n        type,\n        lid\n      } = identifier;\n      let oldId = identifier.id;\n\n      // ID absolutely can't be missing if the oldID is empty (missing Id in response for a new record)\n      (!(!(id === null && oldId === null)) && debug.assert(`'${type}' was saved to the server, but the response does not have an id and your record does not either.`, !(id === null && oldId === null))); // ID absolutely can't be different than oldID if oldID is not null\n      // TODO this assertion and restriction may not strictly be needed in the identifiers world\n      (!(!(oldId !== null && id !== oldId)) && debug.assert(`Cannot update the id for '${type}:${lid}' from '${String(oldId)}' to '${id}'.`, !(oldId !== null && id !== oldId))); // ID can be null if oldID is not null (altered ID in response for a record)\n      // however, this is more than likely a developer error.\n      if (oldId !== null && id === null) {\n        (debug.warn(`Your ${type} record was saved to the server, but the response does not have an id.`, !(oldId !== null && id === null)));\n        return;\n      }\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").debug.LOG_INSTANCE_CACHE)) {\n        // eslint-disable-next-line no-console\n        console.log(`InstanceCache: updating id to '${id}' for record ${String(identifier)}`);\n      }\n      let existingIdentifier = this.store.identifierCache.peekRecordIdentifier({\n        type,\n        id\n      });\n      (!(!existingIdentifier || existingIdentifier === identifier) && debug.assert(`'${type}' was saved to the server, but the response returned the new id '${id}', which has already been used with another record.'`, !existingIdentifier || existingIdentifier === identifier));\n      if (identifier.id === null) {\n        // TODO potentially this needs to handle merged result\n        this.store.identifierCache.updateRecordIdentifier(identifier, {\n          type,\n          id\n        });\n      }\n\n      // TODO update recordData if needed ?\n      // TODO handle consequences of identifier merge for notifications\n      this.store._notificationManager.notify(identifier, 'identity');\n    }\n\n    // TODO this should move into something coordinating operations\n    loadData(data) {\n      let modelName = data.type;\n      (!(data.id !== null && data.id !== undefined && data.id !== '') && debug.assert(`You must include an 'id' for ${modelName} in an object passed to 'push'`, data.id !== null && data.id !== undefined && data.id !== ''));\n      (!(this.store.getSchemaDefinitionService().doesTypeExist(modelName)) && debug.assert(`You tried to push data with a type '${modelName}' but no model could be found with that name.`, this.store.getSchemaDefinitionService().doesTypeExist(modelName)));\n      const resource = constructResource(normalizeModelName$1(data.type), ensureStringId(data.id), coerceId(data.lid));\n      let identifier = this.store.identifierCache.peekRecordIdentifier(resource);\n      let isUpdate = false;\n\n      // store.push will be from empty\n      // findRecord will be from root.loading\n      // this cannot be loading state if we do not already have an identifier\n      // all else will be updates\n      if (identifier) {\n        const isLoading = _isLoading(this, identifier) || !this.recordIsLoaded(identifier);\n        isUpdate = !_isEmpty(this, identifier) && !isLoading;\n\n        // exclude store.push (root.empty) case\n        if (isUpdate || isLoading) {\n          identifier = this.store.identifierCache.updateRecordIdentifier(identifier, data);\n        }\n      } else {\n        identifier = this.store.identifierCache.getOrCreateRecordIdentifier(data);\n      }\n      const recordData = this.getRecordData(identifier);\n      if (recordData.isNew(identifier)) {\n        this.store._notificationManager.notify(identifier, 'identity');\n      }\n      const hasRecord = this.__instances.record.has(identifier);\n      recordData.pushData(identifier, data, hasRecord);\n      if (!isUpdate) {\n        this.store.recordArrayManager.identifierAdded(identifier);\n      }\n      return identifier;\n    }\n  }\n  function _recordDataIsFullDeleted(identifier, recordData) {\n    return recordData.isDeletionCommitted(identifier) || recordData.isNew(identifier) && recordData.isDeleted(identifier);\n  }\n  function recordDataIsFullyDeleted(cache, identifier) {\n    let recordData = cache.__instances.recordData.get(identifier);\n    return !recordData || _recordDataIsFullDeleted(identifier, recordData);\n  }\n\n  /*\n      When a find request is triggered on the store, the user can optionally pass in\n      attributes and relationships to be preloaded. These are meant to behave as if they\n      came back from the server, except the user obtained them out of band and is informing\n      the store of their existence. The most common use case is for supporting client side\n      nested URLs, such as `/posts/1/comments/2` so the user can do\n      `store.findRecord('comment', 2, { preload: { post: 1 } })` without having to fetch the post.\n\n      Preloaded data can be attributes and relationships passed in either as IDs or as actual\n      models.\n    */\n\n  function preloadData(store, identifier, preload) {\n    let jsonPayload = {};\n    //TODO(Igor) consider the polymorphic case\n    const schemas = store.getSchemaDefinitionService();\n    const relationships = schemas.relationshipsDefinitionFor(identifier);\n    Object.keys(preload).forEach(key => {\n      let preloadValue = preload[key];\n      let relationshipMeta = relationships[key];\n      if (relationshipMeta) {\n        if (!jsonPayload.relationships) {\n          jsonPayload.relationships = {};\n        }\n        jsonPayload.relationships[key] = preloadRelationship(relationshipMeta, preloadValue);\n      } else {\n        if (!jsonPayload.attributes) {\n          jsonPayload.attributes = {};\n        }\n        jsonPayload.attributes[key] = preloadValue;\n      }\n    });\n    store._instanceCache.getRecordData(identifier).pushData(identifier, jsonPayload);\n  }\n  function preloadRelationship(schema, preloadValue) {\n    const relatedType = schema.type;\n    if (schema.kind === 'hasMany') {\n      (!(Array.isArray(preloadValue)) && debug.assert('You need to pass in an array to set a hasMany property on a record', Array.isArray(preloadValue)));\n      return {\n        data: preloadValue.map(value => _convertPreloadRelationshipToJSON(value, relatedType))\n      };\n    }\n    (!(!Array.isArray(preloadValue)) && debug.assert('You should not pass in an array to set a belongsTo property on a record', !Array.isArray(preloadValue)));\n    return {\n      data: preloadValue ? _convertPreloadRelationshipToJSON(preloadValue, relatedType) : null\n    };\n  }\n\n  /*\n    findRecord('user', '1', { preload: { friends: ['1'] }});\n    findRecord('user', '1', { preload: { friends: [record] }});\n  */\n  function _convertPreloadRelationshipToJSON(value, type) {\n    if (typeof value === 'string' || typeof value === 'number') {\n      return {\n        type,\n        id: value\n      };\n    }\n    // TODO if not a record instance assert it's an identifier\n    // and allow identifiers to be used\n    return recordIdentifierFor(value);\n  }\n  function _isEmpty(cache, identifier) {\n    const recordData = cache.__instances.recordData.get(identifier);\n    if (!recordData) {\n      return true;\n    }\n    const isNew = recordData.isNew(identifier);\n    const isDeleted = recordData.isDeleted(identifier);\n    const isEmpty = recordData.isEmpty(identifier);\n    return (!isNew || isDeleted) && isEmpty;\n  }\n  function _isLoading(cache, identifier) {\n    const req = cache.store.getRequestStateService();\n    // const fulfilled = req.getLastRequestForRecord(identifier);\n    const isLoaded = cache.recordIsLoaded(identifier);\n    return !isLoaded &&\n    // fulfilled === null &&\n    req.getPendingRequestsForRecord(identifier).some(req => req.type === 'query');\n  }\n  function _clearCaches() {\n    RecordCache.clear();\n    StoreMap.clear();\n    RecordDataForIdentifierCache.clear();\n  }\n\n  let _modelForMixin;\n  if (runtime.macroCondition(true)) {\n    let _found;\n    _modelForMixin = function () {\n      if (!_found) {\n        _found = esc__default.default(require('@ember-data/model/-private'))._modelForMixin;\n      }\n      return _found(...arguments);\n    };\n  }\n  class DSModelSchemaDefinitionService {\n    constructor(store) {\n      this.store = store;\n      this._relationshipsDefCache = Object.create(null);\n      this._attributesDefCache = Object.create(null);\n    }\n\n    // Following the existing RD implementation\n    attributesDefinitionFor(identifier) {\n      let modelName, attributes;\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_STRING_ARG_SCHEMAS)) {\n        if (typeof identifier === 'string') {\n          (debug.deprecate(`attributesDefinitionFor expects either a record identifier or an argument of shape { type: string }, received a string.`, false, {\n            id: 'ember-data:deprecate-string-arg-schemas',\n            for: 'ember-data',\n            until: '5.0',\n            since: {\n              enabled: '4.5',\n              available: '4.5'\n            }\n          }));\n          modelName = identifier;\n        } else {\n          modelName = identifier.type;\n        }\n      } else {\n        modelName = identifier.type;\n      }\n      attributes = this._attributesDefCache[modelName];\n      if (attributes === undefined) {\n        let modelClass = this.store.modelFor(modelName);\n        let attributeMap = modelClass.attributes;\n        attributes = Object.create(null);\n        attributeMap.forEach((meta, name) => attributes[name] = meta);\n        this._attributesDefCache[modelName] = attributes;\n      }\n      return attributes;\n    }\n\n    // Following the existing RD implementation\n    relationshipsDefinitionFor(identifier) {\n      let modelName, relationships;\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_STRING_ARG_SCHEMAS)) {\n        if (typeof identifier === 'string') {\n          (debug.deprecate(`relationshipsDefinitionFor expects either a record identifier or an argument of shape { type: string }, received a string.`, false, {\n            id: 'ember-data:deprecate-string-arg-schemas',\n            for: 'ember-data',\n            until: '5.0',\n            since: {\n              enabled: '4.5',\n              available: '4.5'\n            }\n          }));\n          modelName = identifier;\n        } else {\n          modelName = identifier.type;\n        }\n      } else {\n        modelName = identifier.type;\n      }\n      relationships = this._relationshipsDefCache[modelName];\n      if (relationships === undefined) {\n        let modelClass = this.store.modelFor(modelName);\n        relationships = modelClass.relationshipsObject || null;\n        this._relationshipsDefCache[modelName] = relationships;\n      }\n      return relationships;\n    }\n    doesTypeExist(modelName) {\n      let normalizedModelName = normalizeModelName$1(modelName);\n      let factory = getModelFactory(this.store, this.store._modelFactoryCache, normalizedModelName);\n      return factory !== null;\n    }\n  }\n  function getModelFactory(store, cache, normalizedModelName) {\n    let factory = cache[normalizedModelName];\n    if (!factory) {\n      let owner = application.getOwner(store);\n      factory = owner.factoryFor(`model:${normalizedModelName}`);\n      if (runtime.macroCondition(true)) {\n        if (!factory) {\n          //Support looking up mixins as base types for polymorphic relationships\n          factory = _modelForMixin(store, normalizedModelName);\n        }\n      }\n      if (!factory) {\n        // we don't cache misses in case someone wants to register a missing model\n        return null;\n      }\n      let klass = factory.class;\n      if (klass.isModel) {\n        let hasOwnModelNameSet = klass.modelName && Object.prototype.hasOwnProperty.call(klass, 'modelName');\n        if (!hasOwnModelNameSet) {\n          Object.defineProperty(klass, 'modelName', {\n            value: normalizedModelName\n          });\n        }\n      }\n      cache[normalizedModelName] = factory;\n    }\n    return factory;\n  }\n\n  // if modelFor turns out to be a bottleneck we should replace with a Map\n  // and clear it during store teardown.\n  const AvailableShims = new WeakMap();\n  function getShimClass(store, modelName) {\n    let shims = AvailableShims.get(store);\n    if (!shims) {\n      shims = Object.create(null);\n      AvailableShims.set(store, shims);\n    }\n    let shim = shims[modelName];\n    if (shim === undefined) {\n      shim = shims[modelName] = new ShimModelClass(store, modelName);\n    }\n    return shim;\n  }\n  function mapFromHash(hash) {\n    let map = new Map();\n    for (let i in hash) {\n      if (Object.prototype.hasOwnProperty.call(hash, i)) {\n        map.set(i, hash[i]);\n      }\n    }\n    return map;\n  }\n\n  // Mimics the static apis of DSModel\n  class ShimModelClass {\n    constructor(store, modelName) {\n      this.__store = store;\n      this.modelName = modelName;\n    }\n    get fields() {\n      let attrs = this.__store.getSchemaDefinitionService().attributesDefinitionFor({\n        type: this.modelName\n      });\n      let relationships = this.__store.getSchemaDefinitionService().relationshipsDefinitionFor({\n        type: this.modelName\n      });\n      let fields = new Map();\n      Object.keys(attrs).forEach(key => fields.set(key, 'attribute'));\n      Object.keys(relationships).forEach(key => fields.set(key, relationships[key].kind));\n      return fields;\n    }\n    get attributes() {\n      let attrs = this.__store.getSchemaDefinitionService().attributesDefinitionFor({\n        type: this.modelName\n      });\n      return mapFromHash(attrs);\n    }\n    get relationshipsByName() {\n      let relationships = this.__store.getSchemaDefinitionService().relationshipsDefinitionFor({\n        type: this.modelName\n      });\n      return mapFromHash(relationships);\n    }\n    eachAttribute(callback, binding) {\n      let attrDefs = this.__store.getSchemaDefinitionService().attributesDefinitionFor({\n        type: this.modelName\n      });\n      Object.keys(attrDefs).forEach(key => {\n        callback.call(binding, key, attrDefs[key]);\n      });\n    }\n    eachRelationship(callback, binding) {\n      let relationshipDefs = this.__store.getSchemaDefinitionService().relationshipsDefinitionFor({\n        type: this.modelName\n      });\n      Object.keys(relationshipDefs).forEach(key => {\n        callback.call(binding, key, relationshipDefs[key]);\n      });\n    }\n    eachTransformedAttribute(callback, binding) {\n      let relationshipDefs = this.__store.getSchemaDefinitionService().relationshipsDefinitionFor({\n        type: this.modelName\n      });\n      Object.keys(relationshipDefs).forEach(key => {\n        if (relationshipDefs[key].type) {\n          callback.call(binding, key, relationshipDefs[key]);\n        }\n      });\n    }\n  }\n\n  const PromiseArrayProxy = ArrayProxy__default.default.extend(PromiseProxyMixin__default.default);\n  const PromiseObjectProxy = ObjectProxy__default.default.extend(PromiseProxyMixin__default.default);\n\n  var _dec, _class$1, _descriptor$1;\n  function _initializerDefineProperty$1(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }\n  function _applyDecoratedDescriptor$1(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }\n\n  /**\n    @module @ember-data/store\n  */\n\n  /**\n    A `PromiseArray` is an object that acts like both an `Ember.Array`\n    and a promise. When the promise is resolved the resulting value\n    will be set to the `PromiseArray`'s `content` property. This makes\n    it easy to create data bindings with the `PromiseArray` that will be\n    updated when the promise resolves.\n\n    This class should not be imported and instantiated directly.\n\n    For more information see the [Ember.PromiseProxyMixin\n    documentation](/ember/release/classes/PromiseProxyMixin).\n\n    Example\n\n    ```javascript\n    let promiseArray = PromiseArray.create({\n      promise: $.getJSON('/some/remote/data.json')\n    });\n\n    promiseArray.length; // 0\n\n    promiseArray.then(function() {\n      promiseArray.length; // 100\n    });\n    ```\n\n    @class PromiseArray\n    @public\n    @extends Ember.ArrayProxy\n    @uses Ember.PromiseProxyMixin\n  */\n\n  let PromiseArray = (_dec = computed.reads('content.meta'), _class$1 = class PromiseArray extends PromiseArrayProxy {\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty$1(this, \"meta\", _descriptor$1, this);\n    }\n  }, _descriptor$1 = _applyDecoratedDescriptor$1(_class$1.prototype, \"meta\", [_dec], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class$1);\n  function _promiseObject(promise, label) {\n    return PromiseObjectProxy.create({\n      promise: RSVP.resolve(promise, label)\n    });\n  }\n  function _promiseArray(promise, label) {\n    return PromiseArray.create({\n      promise: RSVP.resolve(promise, label)\n    });\n  }\n\n  // constructor is accessed in some internals but not including it in the copyright for the deprecation\n  const ALLOWABLE_METHODS = ['constructor', 'then', 'catch', 'finally'];\n  const ALLOWABLE_PROPS = ['__ec_yieldable__', '__ec_cancel__'];\n  const PROXIED_ARRAY_PROPS = ['length', '[]', 'firstObject', 'lastObject', 'meta', 'content', 'isPending', 'isSettled', 'isRejected', 'isFulfilled', 'promise', 'reason'];\n  const PROXIED_OBJECT_PROPS = ['content', 'isPending', 'isSettled', 'isRejected', 'isFulfilled', 'promise', 'reason'];\n  function promiseArray(promise) {\n    const promiseObjectProxy = _promiseArray(promise);\n    if (runtime.macroCondition(!true)) {\n      return promiseObjectProxy;\n    }\n    const handler = {\n      get(target, prop, receiver) {\n        if (typeof prop === 'symbol') {\n          return Reflect.get(target, prop, receiver);\n        }\n        if (ALLOWABLE_PROPS.includes(prop)) {\n          return target[prop];\n        }\n        if (!ALLOWABLE_METHODS.includes(prop)) {\n          (debug.deprecate(`Accessing ${prop} on this PromiseArray is deprecated. The return type is being changed from PromiseArray to a Promise. The only available methods to access on this promise are .then, .catch and .finally`, false, {\n            id: 'ember-data:deprecate-promise-proxies',\n            until: '5.0',\n            for: '@ember-data/store',\n            since: {\n              available: '4.7',\n              enabled: '4.7'\n            }\n          }));\n        }\n        const value = target[prop];\n        if (value && typeof value === 'function' && typeof value.bind === 'function') {\n          return value.bind(target);\n        }\n        if (PROXIED_ARRAY_PROPS.includes(prop)) {\n          return value;\n        }\n        return undefined;\n      }\n    };\n    return new Proxy(promiseObjectProxy, handler);\n  }\n  const ProxySymbolString = String(Symbol.for('PROXY_CONTENT'));\n  function promiseObject(promise) {\n    const promiseObjectProxy = _promiseObject(promise);\n    if (runtime.macroCondition(!true)) {\n      return promiseObjectProxy;\n    }\n    const handler = {\n      get(target, prop, receiver) {\n        if (typeof prop === 'symbol') {\n          if (String(prop) === ProxySymbolString) {\n            return;\n          }\n          return Reflect.get(target, prop, receiver);\n        }\n        if (prop === 'constructor') {\n          return target.constructor;\n        }\n        if (ALLOWABLE_PROPS.includes(prop)) {\n          return target[prop];\n        }\n        if (!ALLOWABLE_METHODS.includes(prop)) {\n          (debug.deprecate(`Accessing ${prop} on this PromiseObject is deprecated. The return type is being changed from PromiseObject to a Promise. The only available methods to access on this promise are .then, .catch and .finally`, false, {\n            id: 'ember-data:deprecate-promise-proxies',\n            until: '5.0',\n            for: '@ember-data/store',\n            since: {\n              available: '4.7',\n              enabled: '4.7'\n            }\n          }));\n        } else {\n          return target[prop].bind(target);\n        }\n        if (PROXIED_OBJECT_PROPS.includes(prop)) {\n          return target[prop];\n        }\n        const value = object.get(target, prop);\n        if (value && typeof value === 'function' && typeof value.bind === 'function') {\n          return value.bind(receiver);\n        }\n        return undefined;\n      }\n    };\n    return new Proxy(promiseObjectProxy, handler);\n  }\n\n  var _class, _descriptor, _class2, _descriptor2;\n  function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }\n  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }\n  const ARRAY_GETTER_METHODS = new Set([Symbol.iterator, 'concat', 'entries', 'every', 'fill', 'filter', 'find', 'findIndex', 'flat', 'flatMap', 'forEach', 'includes', 'indexOf', 'join', 'keys', 'lastIndexOf', 'map', 'reduce', 'reduceRight', 'slice', 'some', 'values']);\n  const ARRAY_SETTER_METHODS = new Set(['push', 'pop', 'unshift', 'shift', 'splice', 'sort']);\n  const SYNC_PROPS = new Set(['[]', 'length', 'links', 'meta']);\n  function isArrayGetter(prop) {\n    return ARRAY_GETTER_METHODS.has(prop);\n  }\n  function isArraySetter(prop) {\n    return ARRAY_SETTER_METHODS.has(prop);\n  }\n  const IDENTIFIER_ARRAY_TAG = Symbol('#tag');\n  const SOURCE = Symbol('#source');\n  const MUTATE = Symbol('#update');\n  const NOTIFY = Symbol('#notify');\n  function notifyArray(arr) {\n    arr[IDENTIFIER_ARRAY_TAG].ref = null;\n    if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_COMPUTED_CHAINS)) {\n      // eslint-disable-next-line\n      validator.dirtyTag(metal.tagForProperty(arr, 'length'));\n      // eslint-disable-next-line\n      validator.dirtyTag(metal.tagForProperty(arr, '[]'));\n    }\n  }\n  function convertToInt(prop) {\n    if (typeof prop === 'symbol') return null;\n    const num = Number(prop);\n    if (isNaN(num)) return null;\n    return num % 1 === 0 ? num : null;\n  }\n  let Tag = (_class = class Tag {\n    /*\n     * whether this was part of a transaction when last mutated\n     */\n\n    constructor() {\n      _initializerDefineProperty(this, \"ref\", _descriptor, this);\n      this.shouldReset = false;\n      this.t = false;\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"ref\", [tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return null;\n    }\n  }), _class);\n  function deprecateArrayLike(className, fnName, replName) {\n    (debug.deprecate(`The \\`${fnName}\\` method on the class ${className} is deprecated. Use the native array method \\`${replName}\\` instead.`, false, {\n      id: 'ember-data:deprecate-array-like',\n      until: '5.0',\n      since: {\n        enabled: '4.7',\n        available: '4.7'\n      },\n      for: 'ember-data'\n    }));\n  }\n\n  /**\n    A record array is an array that contains records of a certain type (or modelName).\n    The record array materializes records as needed when they are retrieved for the first\n    time. You should not create record arrays yourself. Instead, an instance of\n    `RecordArray` or its subclasses will be returned by your application's store\n    in response to queries.\n\n    This class should not be imported and instantiated by consuming applications.\n\n    @class RecordArray\n    @public\n  */\n  let IdentifierArray = (_class2 = class IdentifierArray {\n    [NOTIFY]() {\n      notifyArray(this);\n    }\n\n    /**\n     The modelClass represented by this record array.\n      @property type\n      @public\n      @deprecated\n     @type {subclass of Model}\n     */\n\n    /**\n      The store that created this record array.\n       @property store\n      @private\n      @type Store\n      */\n\n    destroy() {\n      this.isDestroying = true;\n      // changing the reference breaks the Proxy\n      // this[SOURCE] = [];\n      this[SOURCE].length = 0;\n      this[NOTIFY]();\n      this.isDestroyed = true;\n    }\n\n    // length must be on self for proxied methods to work properly\n    get length() {\n      return this[SOURCE].length;\n    }\n    set length(value) {\n      this[SOURCE].length = value;\n    }\n\n    // here to support computed chains\n    // and {{#each}}\n    get '[]'() {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_COMPUTED_CHAINS)) {\n        return this;\n      }\n    }\n    constructor(options) {\n      /**\n        The flag to signal a `RecordArray` is currently loading data.\n        Example\n        ```javascript\n        let people = store.peekAll('person');\n        people.isUpdating; // false\n        people.update();\n        people.isUpdating; // true\n        ```\n        @property isUpdating\n        @public\n        @type Boolean\n      */\n      _initializerDefineProperty(this, \"isUpdating\", _descriptor2, this);\n      this.isLoaded = true;\n      this.isDestroying = false;\n      this.isDestroyed = false;\n      this._updatingPromise = null;\n      this[IDENTIFIER_ARRAY_TAG] = new Tag();\n      this[SOURCE] = void 0;\n      // eslint-disable-next-line @typescript-eslint/no-this-alias\n      let self = this;\n      this.modelName = options.type;\n      this.store = options.store;\n      this._manager = options.manager;\n      this[SOURCE] = options.identifiers;\n      const store = options.store;\n      const boundFns = new Map();\n      const _TAG = this[IDENTIFIER_ARRAY_TAG];\n      const PrivateState = {\n        links: options.links || null,\n        meta: options.meta || null\n      };\n      let transaction = false;\n\n      // when a mutation occurs\n      // we track all mutations within the call\n      // and forward them as one\n\n      const proxy = new Proxy(this[SOURCE], {\n        get(target, prop, receiver) {\n          let index = convertToInt(prop);\n          if (_TAG.shouldReset && (index !== null || SYNC_PROPS.has(prop) || isArrayGetter(prop))) {\n            options.manager._syncArray(receiver);\n            _TAG.t = false;\n            _TAG.shouldReset = false;\n          }\n          if (index !== null) {\n            const identifier = target[index];\n            if (!transaction) {\n              Private.subscribe(_TAG);\n            }\n            return identifier && store._instanceCache.getRecord(identifier);\n          }\n          if (prop === 'meta') return Private.subscribe(_TAG), PrivateState.meta;\n          if (prop === 'links') return Private.subscribe(_TAG), PrivateState.links;\n          if (prop === '[]') return Private.subscribe(_TAG), receiver;\n          if (isArrayGetter(prop)) {\n            let fn = boundFns.get(prop);\n            if (fn === undefined) {\n              fn = function () {\n                Private.subscribe(_TAG);\n                // array functions must run through Reflect to work properly\n                // binding via other means will not work.\n                transaction = true;\n                let result = Reflect.apply(target[prop], receiver, arguments);\n                transaction = false;\n                return result;\n              };\n              boundFns.set(prop, fn);\n            }\n            return fn;\n          }\n          if (isArraySetter(prop)) {\n            let fn = boundFns.get(prop);\n            if (fn === undefined) {\n              fn = function () {\n                // array functions must run through Reflect to work properly\n                // binding via other means will not work.\n                if (!options.allowMutation) {\n                  (!(options.allowMutation) && debug.assert(`Mutating this array of records via ${String(prop)} is not allowed.`, options.allowMutation));\n                  return;\n                }\n                const args = Array.prototype.slice.call(arguments);\n                (!(!transaction) && debug.assert(`Cannot start a new array transaction while a previous transaction is underway`, !transaction));\n                transaction = true;\n                let result = Reflect.apply(target[prop], receiver, args);\n                self[MUTATE](prop, args, result);\n                Private.addToTransaction(_TAG);\n                // TODO handle cache updates\n                transaction = false;\n                return result;\n              };\n              boundFns.set(prop, fn);\n            }\n            return fn;\n          }\n          if (prop in self) {\n            if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_ARRAY_LIKE)) {\n              if (prop === 'firstObject') {\n                deprecateArrayLike(self.DEPRECATED_CLASS_NAME, prop, '[0]');\n                return receiver[0];\n              } else if (prop === 'lastObject') {\n                deprecateArrayLike(self.DEPRECATED_CLASS_NAME, prop, 'at(-1)');\n                return receiver[receiver.length - 1];\n              }\n            }\n            if (prop === NOTIFY || prop === IDENTIFIER_ARRAY_TAG || prop === SOURCE) {\n              return self[prop];\n            }\n            let fn = boundFns.get(prop);\n            if (fn) return fn;\n            let outcome = self[prop];\n            if (typeof outcome === 'function') {\n              fn = function () {\n                Private.subscribe(_TAG);\n                // array functions must run through Reflect to work properly\n                // binding via other means will not work.\n                return Reflect.apply(outcome, receiver, arguments);\n              };\n              boundFns.set(prop, fn);\n              return fn;\n            }\n            return Private.subscribe(_TAG), outcome;\n          }\n          return target[prop];\n        },\n        set(target, prop, value) {\n          if (prop === 'length') {\n            if (!transaction && value === 0) {\n              transaction = true;\n              Private.addToTransaction(_TAG);\n              Reflect.set(target, prop, value);\n              self[MUTATE]('length 0', []);\n              transaction = false;\n              return true;\n            } else if (transaction) {\n              return Reflect.set(target, prop, value);\n            } else {\n              (debug.assert(`unexpected length set`));\n            }\n          }\n          if (prop === 'links') {\n            PrivateState.links = value || null;\n            return true;\n          }\n          if (prop === 'meta') {\n            PrivateState.meta = value || null;\n            return true;\n          }\n          let index = convertToInt(prop);\n          if (index === null || index > target.length) {\n            if (prop in self) {\n              self[prop] = value;\n              return true;\n            }\n            return false;\n          }\n          if (!options.allowMutation) {\n            (!(options.allowMutation) && debug.assert(`Mutating ${String(prop)} on this RecordArray is not allowed.`, options.allowMutation));\n            return false;\n          }\n          let original = target[index];\n          let newIdentifier = extractIdentifierFromRecord$1(value);\n          target[index] = newIdentifier;\n          if (!transaction) {\n            self[MUTATE]('replace cell', [index, original, newIdentifier]);\n            Private.addToTransaction(_TAG);\n          }\n          return true;\n        },\n        deleteProperty(target, prop) {\n          (!(transaction) && debug.assert(`Deleting keys on managed arrays is disallowed`, transaction));\n          if (!transaction) {\n            return false;\n          }\n          return Reflect.deleteProperty(target, prop);\n        },\n        getPrototypeOf() {\n          return IdentifierArray.prototype;\n        }\n      });\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_A_USAGE)) {\n        const meta = Ember__default.default.meta(this);\n        meta.hasMixin = mixin => {\n          (debug.deprecate(`Do not call A() on EmberData RecordArrays`, false, {\n            id: 'ember-data:no-a-with-array-like',\n            until: '5.0',\n            since: {\n              enabled: '4.7',\n              available: '4.7'\n            },\n            for: 'ember-data'\n          })); // @ts-expect-error ArrayMixin is more than a type\n          if (mixin === NativeArray || mixin === ArrayMixin) {\n            return true;\n          }\n          return false;\n        };\n      } else if (runtime.macroCondition(true)) {\n        const meta = Ember__default.default.meta(this);\n        meta.hasMixin = mixin => {\n          (debug.assert(`Do not call A() on EmberData RecordArrays`));\n        };\n      }\n      this[NOTIFY] = this[NOTIFY].bind(proxy);\n      return proxy;\n    }\n\n    /**\n      Used to get the latest version of all of the records in this array\n      from the adapter.\n       Example\n       ```javascript\n      let people = store.peekAll('person');\n      people.isUpdating; // false\n       people.update().then(function() {\n        people.isUpdating; // false\n      });\n       people.isUpdating; // true\n      ```\n       @method update\n      @public\n    */\n    update() {\n      if (this.isUpdating) {\n        return this._updatingPromise;\n      }\n      this.isUpdating = true;\n      let updatingPromise = this._update();\n      updatingPromise.finally(() => {\n        this._updatingPromise = null;\n        if (this.isDestroying || this.isDestroyed) {\n          return;\n        }\n        this.isUpdating = false;\n      });\n      this._updatingPromise = updatingPromise;\n      return updatingPromise;\n    }\n\n    /*\n      Update this RecordArray and return a promise which resolves once the update\n      is finished.\n     */\n    _update() {\n      return this.store.findAll(this.modelName, {\n        reload: true\n      });\n    }\n\n    // TODO deprecate\n    /**\n      Saves all of the records in the `RecordArray`.\n       Example\n       ```javascript\n      let messages = store.peekAll('message');\n      messages.forEach(function(message) {\n        message.hasBeenSeen = true;\n      });\n      messages.save();\n      ```\n       @method save\n      @public\n      @return {PromiseArray} promise\n    */\n    save() {\n      let promise = Promise.all(this.map(record => this.store.saveRecord(record))).then(() => this);\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_PROMISE_PROXIES)) {\n        return promiseArray(promise);\n      }\n      return promise;\n    }\n  }, _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, \"isUpdating\", [tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return false;\n    }\n  }), _applyDecoratedDescriptor(_class2.prototype, \"length\", [compat.dependentKeyCompat], Object.getOwnPropertyDescriptor(_class2.prototype, \"length\"), _class2.prototype), _class2);\n  if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_SNAPSHOT_MODEL_CLASS_ACCESS)) {\n    Object.defineProperty(IdentifierArray.prototype, 'type', {\n      get() {\n        (debug.deprecate(`Using RecordArray.type to access the ModelClass for a record is deprecated. Use store.modelFor(<modelName>) instead.`, false, {\n          id: 'ember-data:deprecate-snapshot-model-class-access',\n          until: '5.0',\n          for: 'ember-data',\n          since: {\n            available: '4.5.0',\n            enabled: '4.5.0'\n          }\n        })); // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n        if (!this.modelName) {\n          return null;\n        }\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n        return this.store.modelFor(this.modelName);\n      }\n    });\n  }\n  class Collection extends IdentifierArray {\n    constructor(options) {\n      super(options);\n      this.query = null;\n      this.query = options.query || null;\n      this.isLoaded = options.isLoaded || false;\n    }\n    _update() {\n      const {\n        store,\n        query\n      } = this;\n\n      // TODO save options from initial request?\n      const promise = store.query(this.modelName, query, {\n        _recordArray: this\n      });\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_PROMISE_PROXIES)) {\n        return promiseArray(promise);\n      }\n      return promise;\n    }\n    destroy() {\n      super.destroy();\n      this._manager._managed.delete(this);\n      this._manager._pending.delete(this);\n    }\n  }\n  // trick the proxy \"in\" check\n  Collection.prototype.query = null;\n\n  // Ensure instanceof works correctly\n  //Object.setPrototypeOf(IdentifierArray.prototype, Array.prototype);\n\n  if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_ARRAY_LIKE)) {\n    IdentifierArray.prototype.DEPRECATED_CLASS_NAME = 'RecordArray';\n    Collection.prototype.DEPRECATED_CLASS_NAME = 'RecordArray';\n    const EmberObjectMethods = ['addObserver', 'cacheFor', 'decrementProperty', 'get', 'getProperties', 'incrementProperty', 'notifyPropertyChange', 'removeObserver', 'set', 'setProperties', 'toggleProperty'];\n    EmberObjectMethods.forEach(method => {\n      IdentifierArray.prototype[method] = function delegatedMethod() {\n        for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n          args[_key] = arguments[_key];\n        }\n        (debug.deprecate(`The EmberObject ${method} method on the class ${this.DEPRECATED_CLASS_NAME} is deprecated. Use dot-notation javascript get/set access instead.`, false, {\n          id: 'ember-data:deprecate-array-like',\n          until: '5.0',\n          since: {\n            enabled: '4.7',\n            available: '4.7'\n          },\n          for: 'ember-data'\n        }));\n        return Ember__default.default[method](this, ...args);\n      };\n    });\n    IdentifierArray.prototype.addObject = function (obj) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'addObject', 'push');\n      let index = this.indexOf(obj);\n      if (index === -1) {\n        this.push(obj);\n      }\n      return this;\n    };\n    IdentifierArray.prototype.addObjects = function (objs) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'addObjects', 'push');\n      objs.forEach(obj => {\n        let index = this.indexOf(obj);\n        if (index === -1) {\n          this.push(obj);\n        }\n      });\n      return this;\n    };\n    IdentifierArray.prototype.popObject = function () {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'popObject', 'pop');\n      return this.pop();\n    };\n    IdentifierArray.prototype.pushObject = function (obj) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'pushObject', 'push');\n      this.push(obj);\n      return obj;\n    };\n    IdentifierArray.prototype.pushObjects = function (objs) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'pushObjects', 'push');\n      this.push(...objs);\n      return this;\n    };\n    IdentifierArray.prototype.shiftObject = function () {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'shiftObject', 'shift');\n      return this.shift();\n    };\n    IdentifierArray.prototype.unshiftObject = function (obj) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'unshiftObject', 'unshift');\n      this.unshift(obj);\n      return obj;\n    };\n    IdentifierArray.prototype.unshiftObjects = function (objs) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'unshiftObjects', 'unshift');\n      this.unshift(...objs);\n      return this;\n    };\n    IdentifierArray.prototype.objectAt = function (index) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'objectAt', 'at');\n      //For negative index values go back from the end of the array\n      let arrIndex = Math.sign(index) === -1 ? this.length + index : index;\n      return this[arrIndex];\n    };\n    IdentifierArray.prototype.objectsAt = function (indeces) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'objectsAt', 'at');\n      return indeces.map(index => this.objectAt(index));\n    };\n    IdentifierArray.prototype.removeAt = function (index) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'removeAt', 'splice');\n      this.splice(index, 1);\n      return this;\n    };\n    IdentifierArray.prototype.insertAt = function (index, obj) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'insertAt', 'splice');\n      this.splice(index, 0, obj);\n      return this;\n    };\n    IdentifierArray.prototype.removeObject = function (obj) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'removeObject', 'splice');\n      this.splice(this.indexOf(obj), 1);\n      return this;\n    };\n    IdentifierArray.prototype.removeObjects = function (objs) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'removeObjects', 'splice');\n      objs.forEach(obj => this.splice(this.indexOf(obj), 1));\n      return this;\n    };\n    IdentifierArray.prototype.toArray = function () {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'toArray', 'slice');\n      return this.slice();\n    };\n    IdentifierArray.prototype.replace = function (idx, amt, objects) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'replace', 'splice');\n      if (objects) {\n        this.splice(idx, amt, ...objects);\n      } else {\n        this.splice(idx, amt);\n      }\n    };\n    IdentifierArray.prototype.clear = function () {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'clear', 'length = 0');\n      this.splice(0, this.length);\n      return this;\n    };\n    IdentifierArray.prototype.setObjects = function (objects) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'clear', 'length = 0');\n      (!(Array.isArray(objects)) && debug.assert(`${this.DEPRECATED_CLASS_NAME}.setObjects expects to receive an array as its argument`, Array.isArray(objects)));\n      this.splice(0, this.length);\n      this.push(...objects);\n      return this;\n    };\n    IdentifierArray.prototype.reverseObjects = function () {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'reverseObjects', 'reverse');\n      this.reverse();\n      return this;\n    };\n    IdentifierArray.prototype.compact = function () {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'compact', 'filter');\n      return this.filter(v => v !== null && v !== undefined);\n    };\n    IdentifierArray.prototype.any = function (callback, target) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'any', 'some');\n      return this.some(callback, target);\n    };\n    IdentifierArray.prototype.isAny = function (prop, value) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'isAny', 'some');\n      let hasValue = arguments.length === 2;\n      return this.some(v => hasValue ? v[prop] === value : v[prop] === true);\n    };\n    IdentifierArray.prototype.isEvery = function (prop, value) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'isEvery', 'every');\n      let hasValue = arguments.length === 2;\n      return this.every(v => hasValue ? v[prop] === value : v[prop] === true);\n    };\n    IdentifierArray.prototype.getEach = function (key) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'getEach', 'map');\n      return this.map(value => object.get(value, key));\n    };\n    IdentifierArray.prototype.mapBy = function (key) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'mapBy', 'map');\n      return this.map(value => object.get(value, key));\n    };\n    IdentifierArray.prototype.findBy = function (key, value) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'findBy', 'find');\n      if (arguments.length === 2) {\n        return this.find(val => {\n          return object.get(val, key) === value;\n        });\n      } else {\n        return this.find(val => Boolean(object.get(val, key)));\n      }\n    };\n    IdentifierArray.prototype.filterBy = function (key, value) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'filterBy', 'filter');\n      if (arguments.length === 2) {\n        return this.filter(record => {\n          return object.get(record, key) === value;\n        });\n      }\n      return this.filter(record => {\n        return Boolean(object.get(record, key));\n      });\n    };\n    IdentifierArray.prototype.sortBy = function () {\n      for (var _len2 = arguments.length, sortKeys = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        sortKeys[_key2] = arguments[_key2];\n      }\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'sortBy', '.slice().sort');\n      return this.slice().sort((a, b) => {\n        for (let i = 0; i < sortKeys.length; i++) {\n          let key = sortKeys[i];\n          let propA = object.get(a, key);\n          let propB = object.get(b, key);\n          // return 1 or -1 else continue to the next sortKey\n          let compareValue = utils.compare(propA, propB);\n          if (compareValue) {\n            return compareValue;\n          }\n        }\n        return 0;\n      });\n    };\n\n    // @ts-expect-error\n    IdentifierArray.prototype.invoke = function (key) {\n      for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n        args[_key3 - 1] = arguments[_key3];\n      }\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'invoke', 'forEach');\n      return this.map(value => value[key](...args));\n    };\n\n    // @ts-expect-error\n    IdentifierArray.prototype.addArrayObserver = function () {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'addArrayObserver', 'derived state or reacting at the change source');\n    };\n\n    // @ts-expect-error\n    IdentifierArray.prototype.removeArrayObserver = function () {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'removeArrayObserver', 'derived state or reacting at the change source');\n    };\n\n    // @ts-expect-error\n    IdentifierArray.prototype.arrayContentWillChange = function () {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'arrayContentWillChange', 'derived state or reacting at the change source');\n    };\n\n    // @ts-expect-error\n    IdentifierArray.prototype.arrayContentDidChange = function () {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'arrayContentDidChange', 'derived state or reacting at the change source.');\n    };\n\n    // @ts-expect-error\n    IdentifierArray.prototype.reject = function (key, value) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'reject', 'filter');\n      if (arguments.length === 2) {\n        return this.filter(value => {\n          return !object.get(value, key);\n        });\n      }\n      return this.filter(value => {\n        return !object.get(value, key);\n      });\n    };\n    IdentifierArray.prototype.rejectBy = function (key, value) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'rejectBy', 'filter');\n      if (arguments.length === 2) {\n        return this.filter(value => {\n          return !object.get(value, key);\n        });\n      }\n      return this.filter(value => {\n        return !object.get(value, key);\n      });\n    };\n    IdentifierArray.prototype.setEach = function (key, value) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'setEach', 'forEach');\n      this.forEach(item => object.set(item, key, value));\n    };\n    IdentifierArray.prototype.uniq = function () {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'uniq', 'filter');\n      // all current managed arrays are already enforced as unique\n      return this.slice();\n    };\n\n    // @ts-expect-error\n    IdentifierArray.prototype.uniqBy = function (key) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'uniqBy', 'filter');\n      // all current managed arrays are already enforced as unique\n      let seen = new Set();\n      let result = [];\n      this.forEach(item => {\n        let value = object.get(item, key);\n        if (seen.has(value)) {\n          return;\n        }\n        seen.add(value);\n        result.push(item);\n      });\n      return result;\n    };\n    IdentifierArray.prototype.without = function (value) {\n      deprecateArrayLike(this.DEPRECATED_CLASS_NAME, 'without', 'slice');\n      const newArr = this.slice();\n      const index = this.indexOf(value);\n      if (index !== -1) {\n        newArr.splice(index, 1);\n      }\n      return newArr;\n    };\n\n    // @ts-expect-error\n    IdentifierArray.prototype.firstObject = null;\n    // @ts-expect-error\n    IdentifierArray.prototype.lastObject = null;\n  }\n  function assertRecordPassedToHasMany(record) {\n    (!(function () {\n      try {\n        recordIdentifierFor(record);\n        return true;\n      } catch {\n        return false;\n      }\n    }()) && debug.assert(`All elements of a hasMany relationship must be instances of Model, you passed $${typeof record}`, function () {\n      try {\n        recordIdentifierFor(record);\n        return true;\n      } catch {\n        return false;\n      }\n    }()));\n  }\n  function extractIdentifierFromRecord$1(recordOrPromiseRecord) {\n    if (!recordOrPromiseRecord) {\n      return null;\n    }\n    if (isPromiseRecord$1(recordOrPromiseRecord)) {\n      let content = recordOrPromiseRecord.content;\n      (!(content !== undefined && content !== null) && debug.assert('You passed in a promise that did not originate from an EmberData relationship. You can only pass promises that come from a belongsTo relationship.', content !== undefined && content !== null));\n      assertRecordPassedToHasMany(content);\n      return recordIdentifierFor(content);\n    }\n    assertRecordPassedToHasMany(recordOrPromiseRecord);\n    return recordIdentifierFor(recordOrPromiseRecord);\n  }\n  function isPromiseRecord$1(record) {\n    return !!record.then;\n  }\n\n  const RecordArraysCache = new Map();\n  const FAKE_ARR = {};\n  const SLICE_BATCH_SIZE = 1200;\n  /**\n   * This is a clever optimization.\n   *\n   * clever optimizations rarely stand the test of time, so if you're\n   * ever curious or think something better is possible please benchmark\n   * and discuss. The benchmark for this at the time of writing is in\n   * `scripts/benchmark-push.js`\n   *\n   * This approach turns out to be 150x faster in Chrome and node than\n   * simply using push or concat. It's highly susceptible to the specifics\n   * of the batch size, and may require tuning.\n   *\n   * Clever optimizations should always come with a `why`. This optimization\n   * exists for two reasons.\n   *\n   * 1) array.push(...objects) and Array.prototype.push.apply(arr, objects)\n   *   are susceptible to stack overflows. The size of objects at which this\n   *   occurs varies by environment, browser, and current stack depth and memory\n   *   pressure; however, it occurs in all browsers in fairly pristine conditions\n   *   somewhere around 125k to 200k elements. Since EmberData regularly encounters\n   *   arrays larger than this in size, we cannot use push.\n   *\n   * 2) `array.concat` or simply setting the array to a new reference is often an\n   *   easier approach; however, native Proxy to an array cannot swap it's target array\n   *   and attempts at juggling multiple array sources have proven to be victim to a number\n   *   of browser implementation bugs. Should these bugs be addressed then we could\n   *   simplify to using `concat`, however, do note this is currently 150x faster\n   *   than concat, and due to the overloaded signature of concat will likely always\n   *   be faster.\n   *\n   * Sincerely,\n   *   - runspired (Chris Thoburn) 08/21/2022\n   *\n   * @function fastPush\n   * @internal\n   * @param target the array to push into\n   * @param source the items to push into target\n   */\n  function fastPush(target, source) {\n    let startLength = 0;\n    let newLength = source.length;\n    while (newLength - startLength > SLICE_BATCH_SIZE) {\n      // eslint-disable-next-line prefer-spread\n      target.push.apply(target, source.slice(startLength, startLength + SLICE_BATCH_SIZE));\n      startLength += SLICE_BATCH_SIZE;\n    }\n    // eslint-disable-next-line prefer-spread\n    target.push.apply(target, source.slice(startLength));\n  }\n  /**\n    @class RecordArrayManager\n    @internal\n  */\n  class RecordArrayManager {\n    constructor(options) {\n      this.store = options.store;\n      this.isDestroying = false;\n      this.isDestroyed = false;\n      this._live = new Map();\n      this._managed = new Set();\n      this._pending = new Map();\n      this._staged = new Map();\n      this._identifiers = RecordArraysCache;\n    }\n    _syncArray(array) {\n      const pending = this._pending.get(array);\n      if (!pending || this.isDestroying || this.isDestroyed) {\n        return;\n      }\n      sync(array, pending);\n      this._pending.delete(array);\n    }\n\n    /**\n      Get the `RecordArray` for a modelName, which contains all loaded records of\n      given modelName.\n       @method liveArrayFor\n      @internal\n      @param {String} modelName\n      @return {RecordArray}\n    */\n    liveArrayFor(type) {\n      let array = this._live.get(type);\n      let identifiers = [];\n      let staged = this._staged.get(type);\n      if (staged) {\n        staged.forEach((value, key) => {\n          if (value === 'add') {\n            identifiers.push(key);\n          }\n        });\n        this._staged.delete(type);\n      }\n      if (!array) {\n        array = new IdentifierArray({\n          type,\n          identifiers,\n          store: this.store,\n          allowMutation: false,\n          manager: this\n        });\n        this._live.set(type, array);\n      }\n      return array;\n    }\n    createArray(config) {\n      let options = {\n        type: config.type,\n        links: config.doc?.links || null,\n        meta: config.doc?.meta || null,\n        query: config.query || null,\n        identifiers: config.identifiers || [],\n        isLoaded: !!config.identifiers?.length,\n        allowMutation: false,\n        store: this.store,\n        manager: this\n      };\n      let array = new Collection(options);\n      this._managed.add(array);\n      if (config.identifiers) {\n        associate(array, config.identifiers);\n      }\n      return array;\n    }\n    dirtyArray(array, delta) {\n      if (array === FAKE_ARR) {\n        return;\n      }\n      let tag = array[IDENTIFIER_ARRAY_TAG];\n      if (!tag.shouldReset) {\n        tag.shouldReset = true;\n        Private.addTransactionCB(array[NOTIFY]);\n      } else if (delta > 0 && !tag.t) {\n        Private.addTransactionCB(array[NOTIFY]);\n      }\n    }\n    _getPendingFor(identifier, includeManaged, isRemove) {\n      if (this.isDestroying || this.isDestroyed) {\n        return;\n      }\n      let liveArray = this._live.get(identifier.type);\n      const allPending = this._pending;\n      let pending = new Map();\n      if (includeManaged) {\n        let managed = RecordArraysCache.get(identifier);\n        if (managed) {\n          managed.forEach(arr => {\n            let changes = allPending.get(arr);\n            if (!changes) {\n              changes = new Map();\n              allPending.set(arr, changes);\n            }\n            pending.set(arr, changes);\n          });\n        }\n      }\n\n      // during unloadAll we can ignore removes since we've already\n      // cleared the array.\n      if (liveArray && liveArray[SOURCE].length === 0 && isRemove) {\n        const pendingLive = allPending.get(liveArray);\n        if (!pendingLive || pendingLive.size === 0) {\n          return pending;\n        }\n      }\n      if (!liveArray) {\n        // start building a changeset for when we eventually\n        // do have a live array\n        let changes = this._staged.get(identifier.type);\n        if (!changes) {\n          changes = new Map();\n          this._staged.set(identifier.type, changes);\n        }\n        pending.set(FAKE_ARR, changes);\n      } else {\n        let changes = allPending.get(liveArray);\n        if (!changes) {\n          changes = new Map();\n          allPending.set(liveArray, changes);\n        }\n        pending.set(liveArray, changes);\n      }\n      return pending;\n    }\n    populateManagedArray(array, identifiers, payload) {\n      this._pending.delete(array);\n      const source = array[SOURCE];\n      const old = source.slice();\n      source.length = 0;\n      fastPush(source, identifiers);\n      notifyArray(array);\n      array.meta = payload.meta || null;\n      array.links = payload.links || null;\n      array.isLoaded = true;\n      disassociate(array, old);\n      associate(array, identifiers);\n    }\n    identifierAdded(identifier) {\n      let changeSets = this._getPendingFor(identifier, false);\n      if (changeSets) {\n        changeSets.forEach((changes, array) => {\n          let existing = changes.get(identifier);\n          if (existing === 'del') {\n            changes.delete(identifier);\n          } else {\n            changes.set(identifier, 'add');\n            this.dirtyArray(array, changes.size);\n          }\n        });\n      }\n    }\n    identifierRemoved(identifier) {\n      let changeSets = this._getPendingFor(identifier, true, true);\n      if (changeSets) {\n        changeSets.forEach((changes, array) => {\n          let existing = changes.get(identifier);\n          if (existing === 'add') {\n            changes.delete(identifier);\n          } else {\n            changes.set(identifier, 'del');\n            this.dirtyArray(array, changes.size);\n          }\n        });\n      }\n    }\n    identifierChanged(identifier) {\n      let newState = this.store._instanceCache.recordIsLoaded(identifier, true);\n      if (newState) {\n        this.identifierAdded(identifier);\n      } else {\n        this.identifierRemoved(identifier);\n      }\n    }\n    clear() {\n      this._live.forEach(array => array.destroy());\n      this._managed.forEach(array => array.destroy());\n      this._managed.clear();\n      RecordArraysCache.clear();\n    }\n    destroy() {\n      this.isDestroying = true;\n      this.clear();\n      this._live.clear();\n      this.isDestroyed = true;\n    }\n  }\n  function associate(array, identifiers) {\n    for (let i = 0; i < identifiers.length; i++) {\n      let identifier = identifiers[i];\n      let cache = RecordArraysCache.get(identifier);\n      if (!cache) {\n        cache = new Set();\n        RecordArraysCache.set(identifier, cache);\n      }\n      cache.add(array);\n    }\n  }\n  function disassociate(array, identifiers) {\n    for (let i = 0; i < identifiers.length; i++) {\n      disassociateIdentifier(array, identifiers[i]);\n    }\n  }\n  function disassociateIdentifier(array, identifier) {\n    let cache = RecordArraysCache.get(identifier);\n    if (cache) {\n      cache.delete(array);\n    }\n  }\n  function sync(array, changes) {\n    let state = array[SOURCE];\n    const adds = [];\n    const removes = [];\n    changes.forEach((value, key) => {\n      if (value === 'add') {\n        // likely we want to keep a Set along-side\n        if (state.includes(key)) {\n          return;\n        }\n        adds.push(key);\n      } else {\n        removes.push(key);\n      }\n    });\n    if (removes.length) {\n      if (removes.length === state.length) {\n        state.length = 0;\n        // changing the reference breaks the Proxy\n        // state = array[SOURCE] = [];\n      } else {\n        removes.forEach(i => {\n          state.splice(state.indexOf(i), 1);\n        });\n      }\n    }\n    if (adds.length) {\n      fastPush(state, adds);\n      // changing the reference breaks the Proxy\n      // else we could do this\n      /*\n      if (state.length === 0) {\n        array[SOURCE] = adds;\n      } else {\n        array[SOURCE] = state.concat(adds);\n      }\n      */\n    }\n  }\n\n  /**\n    @module @ember-data/store\n  */\n\n  function _bind(fn) {\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n    return function () {\n      return fn.apply(undefined, args);\n    };\n  }\n  function _guard(promise, test) {\n    let guarded = promise.finally(() => {\n      if (!test()) {\n        guarded._subscribers.length = 0;\n      }\n    });\n    return guarded;\n  }\n  function _objectIsAlive(object) {\n    return !(object.isDestroyed || object.isDestroying);\n  }\n  function guardDestroyedStore(promise, store, label) {\n    let token;\n    if (runtime.macroCondition(true)) {\n      token = store._trackAsyncRequestStart(label);\n    }\n    let wrapperPromise = RSVP.resolve(promise, label).then(_v => {\n      if (!_objectIsAlive(store)) {\n        if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_RSVP_PROMISE)) {\n          (debug.deprecate(`A Promise did not resolve by the time the store was destroyed. This will error in a future release.`, false, {\n            id: 'ember-data:rsvp-unresolved-async',\n            until: '5.0',\n            for: '@ember-data/store',\n            since: {\n              available: '4.5',\n              enabled: '4.5'\n            }\n          }));\n        }\n      }\n      return promise;\n    });\n    return _guard(wrapperPromise, () => {\n      if (runtime.macroCondition(true)) {\n        store._trackAsyncRequestEnd(token);\n      }\n      return _objectIsAlive(store);\n    });\n  }\n\n  /**\n    This is a helper method that validates a JSON API top-level document\n\n    The format of a document is described here:\n    http://jsonapi.org/format/#document-top-level\n\n    @internal\n  */\n  function validateDocumentStructure(doc) {\n    if (runtime.macroCondition(true)) {\n      let errors = [];\n      if (!doc || typeof doc !== 'object') {\n        errors.push('Top level of a JSON API document must be an object');\n      } else {\n        if (!('data' in doc) && !('errors' in doc) && !('meta' in doc)) {\n          errors.push('One or more of the following keys must be present: \"data\", \"errors\", \"meta\".');\n        } else {\n          if ('data' in doc && 'errors' in doc) {\n            errors.push('Top level keys \"errors\" and \"data\" cannot both be present in a JSON API document');\n          }\n        }\n        if ('data' in doc) {\n          if (!(doc.data === null || Array.isArray(doc.data) || typeof doc.data === 'object')) {\n            errors.push('data must be null, an object, or an array');\n          }\n        }\n        if ('meta' in doc) {\n          if (typeof doc.meta !== 'object') {\n            errors.push('meta must be an object');\n          }\n        }\n        if ('errors' in doc) {\n          if (!Array.isArray(doc.errors)) {\n            errors.push('errors must be an array');\n          }\n        }\n        if ('links' in doc) {\n          if (typeof doc.links !== 'object') {\n            errors.push('links must be an object');\n          }\n        }\n        if ('jsonapi' in doc) {\n          if (typeof doc.jsonapi !== 'object') {\n            errors.push('jsonapi must be an object');\n          }\n        }\n        if ('included' in doc) {\n          if (typeof doc.included !== 'object') {\n            errors.push('included must be an array');\n          }\n        }\n      }\n      (!(errors.length === 0) && debug.assert(`Response must be normalized to a valid JSON API document:\\n\\t* ${errors.join('\\n\\t* ')}`, errors.length === 0));\n    }\n  }\n  function normalizeResponseHelper(serializer, store, modelClass, payload, id, requestType) {\n    let normalizedResponse = serializer ? serializer.normalizeResponse(store, modelClass, payload, id, requestType) : payload;\n    validateDocumentStructure(normalizedResponse);\n    return normalizedResponse;\n  }\n\n  const Touching = Symbol('touching');\n  const RequestPromise = Symbol('promise');\n  function hasRecordIdentifier(op) {\n    return 'recordIdentifier' in op;\n  }\n  class RequestCache {\n    constructor() {\n      this._pending = Object.create(null);\n      this._done = new Map();\n      this._subscriptions = Object.create(null);\n    }\n    enqueue(promise, queryRequest) {\n      let query = queryRequest.data[0];\n      if (hasRecordIdentifier(query)) {\n        let lid = query.recordIdentifier.lid;\n        let type = query.op === 'saveRecord' ? 'mutation' : 'query';\n        if (!this._pending[lid]) {\n          this._pending[lid] = [];\n        }\n        let request = {\n          state: 'pending',\n          request: queryRequest,\n          type\n        };\n        request[Touching] = [query.recordIdentifier];\n        request[RequestPromise] = promise;\n        this._pending[lid].push(request);\n        this._triggerSubscriptions(request);\n        promise.then(result => {\n          this._dequeue(lid, request);\n          let finalizedRequest = {\n            state: 'fulfilled',\n            request: queryRequest,\n            type,\n            response: {\n              data: result\n            }\n          };\n          finalizedRequest[Touching] = request[Touching];\n          this._addDone(finalizedRequest);\n          this._triggerSubscriptions(finalizedRequest);\n        }, error => {\n          this._dequeue(lid, request);\n          let finalizedRequest = {\n            state: 'rejected',\n            request: queryRequest,\n            type,\n            response: {\n              data: error\n            }\n          };\n          finalizedRequest[Touching] = request[Touching];\n          this._addDone(finalizedRequest);\n          this._triggerSubscriptions(finalizedRequest);\n        });\n      }\n    }\n    _triggerSubscriptions(req) {\n      req[Touching].forEach(identifier => {\n        if (this._subscriptions[identifier.lid]) {\n          this._subscriptions[identifier.lid].forEach(callback => callback(req));\n        }\n      });\n    }\n    _dequeue(lid, request) {\n      this._pending[lid] = this._pending[lid].filter(req => req !== request);\n    }\n    _addDone(request) {\n      request[Touching].forEach(identifier => {\n        // TODO add support for multiple\n        let requestDataOp = request.request.data[0].op;\n        let requests = this._done.get(identifier);\n        if (requests) {\n          requests = requests.filter(req => {\n            // TODO add support for multiple\n            let data;\n            if (req.request.data instanceof Array) {\n              data = req.request.data[0];\n            } else {\n              data = req.request.data;\n            }\n            return data.op !== requestDataOp;\n          });\n        }\n        requests = requests || [];\n        requests.push(request);\n        this._done.set(identifier, requests);\n      });\n    }\n    subscribeForRecord(identifier, callback) {\n      if (!this._subscriptions[identifier.lid]) {\n        this._subscriptions[identifier.lid] = [];\n      }\n      this._subscriptions[identifier.lid].push(callback);\n    }\n    getPendingRequestsForRecord(identifier) {\n      if (this._pending[identifier.lid]) {\n        return this._pending[identifier.lid];\n      }\n      return [];\n    }\n    getLastRequestForRecord(identifier) {\n      let requests = this._done.get(identifier);\n      if (requests) {\n        return requests[requests.length - 1];\n      }\n      return null;\n    }\n  }\n\n  function payloadIsNotBlank$1(adapterPayload) {\n    if (Array.isArray(adapterPayload)) {\n      return true;\n    } else {\n      return Object.keys(adapterPayload || {}).length !== 0;\n    }\n  }\n  const SaveOp = Symbol('SaveOp');\n  /**\n   * Manages the state of network requests initiated by the store\n   *\n   * @class FetchManager\n   * @private\n   */\n  class FetchManager {\n    // saves which are pending in the runloop\n\n    // fetches pending in the runloop, waiting to be coalesced\n\n    constructor(store) {\n      this._store = store;\n      // used to keep track of all the find requests that need to be coalesced\n      this._pendingFetch = new Map();\n      this._pendingSave = [];\n      this.requestCache = new RequestCache();\n      this.isDestroyed = false;\n    }\n    clearEntries(identifier) {\n      this.requestCache._done.delete(identifier);\n    }\n\n    /**\n      This method is called by `record.save`, and gets passed a\n      resolver for the promise that `record.save` returns.\n       It schedules saving to happen at the end of the run loop.\n       @internal\n    */\n    scheduleSave(identifier, options) {\n      let promiseLabel = 'DS: Model#save ' + this;\n      let resolver = RSVP__default.default.defer(promiseLabel);\n      let query = {\n        op: 'saveRecord',\n        recordIdentifier: identifier,\n        options\n      };\n      let queryRequest = {\n        data: [query]\n      };\n      let snapshot = new Snapshot(options, identifier, this._store);\n      let pendingSaveItem = {\n        snapshot: snapshot,\n        resolver: resolver,\n        identifier,\n        options,\n        queryRequest\n      };\n      this._pendingSave.push(pendingSaveItem);\n      runloop._backburner.scheduleOnce('actions', this, this._flushPendingSaves);\n      this.requestCache.enqueue(resolver.promise, pendingSaveItem.queryRequest);\n      return resolver.promise;\n    }\n\n    /**\n      This method is called at the end of the run loop, and\n      flushes any records passed into `scheduleSave`\n       @method flushPendingSave\n      @internal\n    */\n    _flushPendingSaves() {\n      const store = this._store;\n      let pending = this._pendingSave.slice();\n      this._pendingSave = [];\n      for (let i = 0, j = pending.length; i < j; i++) {\n        let pendingItem = pending[i];\n        _flushPendingSave(store, pendingItem);\n      }\n    }\n    scheduleFetch(identifier, options) {\n      // TODO Probably the store should pass in the query object\n      let shouldTrace = this._store.generateStackTracesForTrackedRequests;\n      let query = {\n        op: 'findRecord',\n        recordIdentifier: identifier,\n        options\n      };\n      let queryRequest = {\n        data: [query]\n      };\n      let pendingFetch = this.getPendingFetch(identifier, options);\n      if (pendingFetch) {\n        return pendingFetch;\n      }\n      let id = identifier.id;\n      let modelName = identifier.type;\n      let resolver = RSVP__default.default.defer(`Fetching ${modelName}' with id: ${id}`);\n      let pendingFetchItem = {\n        identifier,\n        resolver,\n        options,\n        queryRequest\n      };\n      if (runtime.macroCondition(true)) {\n        if (shouldTrace) {\n          let trace;\n          try {\n            throw new Error(`Trace Origin for scheduled fetch for ${modelName}:${id}.`);\n          } catch (e) {\n            trace = e;\n          }\n\n          // enable folks to discover the origin of this findRecord call when\n          // debugging. Ideally we would have a tracked queue for requests with\n          // labels or local IDs that could be used to merge this trace with\n          // the trace made available when we detect an async leak\n          pendingFetchItem.trace = trace;\n        }\n      }\n      let resolverPromise = resolver.promise;\n      const store = this._store;\n      const isLoading = !store._instanceCache.recordIsLoaded(identifier); // we don't use isLoading directly because we are the request\n\n      const promise = resolverPromise.then(payload => {\n        // ensure that regardless of id returned we assign to the correct record\n        if (payload.data && !Array.isArray(payload.data)) {\n          payload.data.lid = identifier.lid;\n        }\n\n        // additional data received in the payload\n        // may result in the merging of identifiers (and thus records)\n        let potentiallyNewIm = store._push(payload);\n        if (potentiallyNewIm && !Array.isArray(potentiallyNewIm)) {\n          return potentiallyNewIm;\n        }\n        return identifier;\n      }, error => {\n        const recordData = store._instanceCache.peek({\n          identifier,\n          bucket: 'recordData'\n        });\n        if (!recordData || recordData.isEmpty(identifier) || isLoading) {\n          let isReleasable = true;\n          if (runtime.macroCondition(true)) {\n            if (!recordData) {\n              const graphFor = esc__default.default(require('@ember-data/record-data/-private')).graphFor;\n              const graph = graphFor(store);\n              isReleasable = graph.isReleasable(identifier);\n              if (!isReleasable) {\n                graph.unload(identifier, true);\n              }\n            }\n          }\n          if (recordData || isReleasable) {\n            store._instanceCache.unloadRecord(identifier);\n          }\n        }\n        throw error;\n      });\n      if (this._pendingFetch.size === 0) {\n        runloop._backburner.schedule('actions', this, this.flushAllPendingFetches);\n      }\n      let fetches = this._pendingFetch;\n      if (!fetches.has(modelName)) {\n        fetches.set(modelName, []);\n      }\n      fetches.get(modelName).push(pendingFetchItem);\n      pendingFetchItem.promise = promise;\n      this.requestCache.enqueue(resolverPromise, pendingFetchItem.queryRequest);\n      return promise;\n    }\n    getPendingFetch(identifier, options) {\n      let pendingFetches = this._pendingFetch.get(identifier.type);\n\n      // We already have a pending fetch for this\n      if (pendingFetches) {\n        let matchingPendingFetch = pendingFetches.find(fetch => fetch.identifier === identifier && isSameRequest(options, fetch.options));\n        if (matchingPendingFetch) {\n          return matchingPendingFetch.promise;\n        }\n      }\n    }\n    flushAllPendingFetches() {\n      if (this.isDestroyed) {\n        return;\n      }\n      const store = this._store;\n      this._pendingFetch.forEach((fetchItem, type) => _flushPendingFetchForType(store, fetchItem, type));\n      this._pendingFetch.clear();\n    }\n    destroy() {\n      this.isDestroyed = true;\n    }\n  }\n\n  // this function helps resolve whether we have a pending request that we should use instead\n  function isSameRequest(options, existingOptions) {\n    if (options === void 0) {\n      options = {};\n    }\n    if (existingOptions === void 0) {\n      existingOptions = {};\n    }\n    let includedMatches = !options.include || options.include === existingOptions.include;\n    let adapterOptionsMatches = options.adapterOptions === existingOptions.adapterOptions;\n    return includedMatches && adapterOptionsMatches;\n  }\n  function _findMany(store, adapter, modelName, snapshots) {\n    let modelClass = store.modelFor(modelName); // `adapter.findMany` gets the modelClass still\n    const ids = snapshots.map(s => s.id);\n    (!(ids.every(v => v !== null)) && debug.assert(`Cannot fetch a record without an id`, ids.every(v => v !== null)));\n    (!(adapter.findMany) && debug.assert(`Expected this adapter to implement findMany for coalescing`, adapter.findMany));\n    let promise = adapter.findMany(store, modelClass, ids, snapshots);\n    let label = `DS: Handle Adapter#findMany of '${modelName}'`;\n    if (promise === undefined) {\n      throw new Error('adapter.findMany returned undefined, this was very likely a mistake');\n    }\n    promise = guardDestroyedStore(promise, store, label);\n    return promise.then(adapterPayload => {\n      (!(!!payloadIsNotBlank$1(adapterPayload)) && debug.assert(`You made a 'findMany' request for '${modelName}' records with ids '[${ids}]', but the adapter's response did not have any data`, !!payloadIsNotBlank$1(adapterPayload)));\n      let serializer = store.serializerFor(modelName);\n      let payload = normalizeResponseHelper(serializer, store, modelClass, adapterPayload, null, 'findMany');\n      return payload;\n    });\n  }\n  function rejectFetchedItems(fetchMap, snapshots, error) {\n    for (let i = 0, l = snapshots.length; i < l; i++) {\n      let snapshot = snapshots[i];\n      let pair = fetchMap.get(snapshot);\n      if (pair) {\n        pair.resolver.reject(error || new Error(`Expected: '<${snapshot.modelName}:${snapshot.id}>' to be present in the adapter provided payload, but it was not found.`));\n      }\n    }\n  }\n  function handleFoundRecords(store, fetchMap, snapshots, coalescedPayload) {\n    /*\n      It is possible that the same ID is included multiple times\n      via multiple snapshots. This happens when more than one\n      options hash was supplied, each of which must be uniquely\n      accounted for.\n       However, since we can't map from response to a specific\n      options object, we resolve all snapshots by id with\n      the first response we see.\n    */\n    let snapshotsById = new Map();\n    for (let i = 0; i < snapshots.length; i++) {\n      let id = snapshots[i].id;\n      let snapshotGroup = snapshotsById.get(id);\n      if (!snapshotGroup) {\n        snapshotGroup = [];\n        snapshotsById.set(id, snapshotGroup);\n      }\n      snapshotGroup.push(snapshots[i]);\n    }\n    const included = Array.isArray(coalescedPayload.included) ? coalescedPayload.included : [];\n\n    // resolve found records\n    let resources = coalescedPayload.data;\n    for (let i = 0, l = resources.length; i < l; i++) {\n      let resource = resources[i];\n      let snapshotGroup = snapshotsById.get(resource.id);\n      snapshotsById.delete(resource.id);\n      if (!snapshotGroup) {\n        // TODO consider whether this should be a deprecation/assertion\n        included.push(resource);\n      } else {\n        snapshotGroup.forEach(snapshot => {\n          let pair = fetchMap.get(snapshot);\n          let resolver = pair.resolver;\n          resolver.resolve({\n            data: resource\n          });\n        });\n      }\n    }\n    if (included.length > 0) {\n      store._push({\n        data: null,\n        included\n      });\n    }\n    if (snapshotsById.size === 0) {\n      return;\n    }\n\n    // reject missing records\n    let rejected = [];\n    snapshotsById.forEach(snapshots => {\n      rejected.push(...snapshots);\n    });\n    (debug.warn('Ember Data expected to find records with the following ids in the adapter response from findMany but they were missing: [ \"' + [...snapshotsById.values()].map(r => r[0].id).join('\", \"') + '\" ]', {\n      id: 'ds.store.missing-records-from-adapter'\n    }));\n    rejectFetchedItems(fetchMap, rejected);\n  }\n  function _fetchRecord(store, fetchItem) {\n    let identifier = fetchItem.identifier;\n    let modelName = identifier.type;\n    let adapter = store.adapterFor(modelName);\n    (!(adapter) && debug.assert(`You tried to find a record but you have no adapter (for ${modelName})`, adapter));\n    (!(typeof adapter.findRecord === 'function') && debug.assert(`You tried to find a record but your adapter (for ${modelName}) does not implement 'findRecord'`, typeof adapter.findRecord === 'function'));\n    let snapshot = new Snapshot(fetchItem.options, identifier, store);\n    let klass = store.modelFor(identifier.type);\n    let id = identifier.id;\n    let label = `DS: Handle Adapter#findRecord of '${modelName}' with id: '${id}'`;\n    let promise = guardDestroyedStore(RSVP.resolve().then(() => {\n      return adapter.findRecord(store, klass, identifier.id, snapshot);\n    }), store, label).then(adapterPayload => {\n      (!(!!payloadIsNotBlank$1(adapterPayload)) && debug.assert(`You made a 'findRecord' request for a '${modelName}' with id '${id}', but the adapter's response did not have any data`, !!payloadIsNotBlank$1(adapterPayload)));\n      let serializer = store.serializerFor(modelName);\n      let payload = normalizeResponseHelper(serializer, store, klass, adapterPayload, id, 'findRecord');\n      (!(!Array.isArray(payload.data)) && debug.assert(`Ember Data expected the primary data returned from a 'findRecord' response to be an object but instead it found an array.`, !Array.isArray(payload.data)));\n      (!('data' in payload && payload.data !== null && typeof payload.data === 'object') && debug.assert(`The 'findRecord' request for ${modelName}:${id} resolved indicating success but contained no primary data. To indicate a 404 not found you should either reject the promise returned by the adapter's findRecord method or throw a NotFoundError.`, 'data' in payload && payload.data !== null && typeof payload.data === 'object'));\n      (debug.warn(`You requested a record of type '${modelName}' with id '${id}' but the adapter returned a payload with primary data having an id of '${payload.data.id}'. Use 'store.findRecord()' when the requested id is the same as the one returned by the adapter. In other cases use 'store.queryRecord()' instead.`, coerceId(payload.data.id) === coerceId(id), {\n        id: 'ds.store.findRecord.id-mismatch'\n      }));\n      return payload;\n    });\n    fetchItem.resolver.resolve(promise);\n  }\n  function _processCoalescedGroup(store, fetchMap, group, adapter, modelName) {\n    if (group.length > 1) {\n      _findMany(store, adapter, modelName, group).then(payloads => {\n        handleFoundRecords(store, fetchMap, group, payloads);\n      }).catch(error => {\n        rejectFetchedItems(fetchMap, group, error);\n      });\n    } else if (group.length === 1) {\n      _fetchRecord(store, fetchMap.get(group[0]));\n    } else {\n      (debug.assert(\"You cannot return an empty array from adapter's method groupRecordsForFindMany\", false));\n    }\n  }\n  function _flushPendingFetchForType(store, pendingFetchItems, modelName) {\n    let adapter = store.adapterFor(modelName);\n    let shouldCoalesce = !!adapter.findMany && adapter.coalesceFindRequests;\n    let totalItems = pendingFetchItems.length;\n    if (shouldCoalesce) {\n      let snapshots = new Array(totalItems);\n      let fetchMap = new Map();\n      for (let i = 0; i < totalItems; i++) {\n        let fetchItem = pendingFetchItems[i];\n        snapshots[i] = new Snapshot(fetchItem.options, fetchItem.identifier, store);\n        fetchMap.set(snapshots[i], fetchItem);\n      }\n      let groups;\n      if (adapter.groupRecordsForFindMany) {\n        groups = adapter.groupRecordsForFindMany(store, snapshots);\n      } else {\n        groups = [snapshots];\n      }\n      for (let i = 0, l = groups.length; i < l; i++) {\n        _processCoalescedGroup(store, fetchMap, groups[i], adapter, modelName);\n      }\n    } else {\n      for (let i = 0; i < totalItems; i++) {\n        _fetchRecord(store, pendingFetchItems[i]);\n      }\n    }\n  }\n  function _flushPendingSave(store, pending) {\n    const {\n      snapshot,\n      resolver,\n      identifier,\n      options\n    } = pending;\n    const adapter = store.adapterFor(identifier.type);\n    const operation = options[SaveOp];\n    let modelName = snapshot.modelName;\n    let modelClass = store.modelFor(modelName);\n    const record = store._instanceCache.getRecord(identifier);\n    (!(adapter) && debug.assert(`You tried to update a record but you have no adapter (for ${modelName})`, adapter));\n    (!(typeof adapter[operation] === 'function') && debug.assert(`You tried to update a record but your adapter (for ${modelName}) does not implement '${operation}'`, typeof adapter[operation] === 'function'));\n    let promise = RSVP.resolve().then(() => adapter[operation](store, modelClass, snapshot));\n    let serializer = store.serializerFor(modelName);\n    let label = `DS: Extract and notify about ${operation} completion of ${identifier}`;\n    (!(promise !== undefined) && debug.assert(`Your adapter's '${operation}' method must return a value, but it returned 'undefined'`, promise !== undefined));\n    promise = _guard(guardDestroyedStore(promise, store, label), _bind(_objectIsAlive, record)).then(adapterPayload => {\n      if (!_objectIsAlive(record)) {\n        if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_RSVP_PROMISE)) {\n          (debug.deprecate(`A Promise while saving ${modelName} did not resolve by the time your model was destroyed. This will error in a future release.`, false, {\n            id: 'ember-data:rsvp-unresolved-async',\n            until: '5.0',\n            for: '@ember-data/store',\n            since: {\n              available: '4.5',\n              enabled: '4.5'\n            }\n          }));\n        }\n      }\n      if (adapterPayload) {\n        return normalizeResponseHelper(serializer, store, modelClass, adapterPayload, snapshot.id, operation);\n      }\n    });\n    resolver.resolve(promise);\n  }\n\n  /**\n    SnapshotRecordArray is not directly instantiable.\n    Instances are provided to consuming application's\n    adapters for certain requests.\n\n    @class SnapshotRecordArray\n    @public\n  */\n  class SnapshotRecordArray {\n    /**\n      SnapshotRecordArray is not directly instantiable.\n      Instances are provided to consuming application's\n      adapters and serializers for certain requests.\n       @method constructor\n      @private\n      @constructor\n      @param {RecordArray} recordArray\n      @param options\n     */\n    constructor(store, recordArray, options) {\n      if (options === void 0) {\n        options = {};\n      }\n      this.__store = store;\n      /**\n        An array of snapshots\n        @private\n        @property _snapshots\n        @type {Array}\n      */\n      this._snapshots = null;\n\n      /**\n        An array of records\n        @private\n        @property _recordArray\n        @type {Array}\n      */\n      this._recordArray = recordArray;\n\n      /**\n        Number of records in the array\n         Example\n         ```app/adapters/post.js\n        import JSONAPIAdapter from '@ember-data/adapter/json-api';\n         export default class PostAdapter extends JSONAPIAdapter {\n          shouldReloadAll(store, snapshotRecordArray) {\n            return !snapshotRecordArray.length;\n          }\n        });\n        ```\n         @property length\n        @public\n        @type {Number}\n      */\n      this.length = recordArray.length; // deal with computedProperty shennanigans\n\n      /**\n        A hash of adapter options passed into the store method for this request.\n         Example\n         ```app/adapters/post.js\n        import MyCustomAdapter from './custom-adapter';\n         export default class PostAdapter extends MyCustomAdapter {\n          findAll(store, type, sinceToken, snapshotRecordArray) {\n            if (snapshotRecordArray.adapterOptions.subscribe) {\n              // ...\n            }\n            // ...\n          }\n        }\n        ```\n         @property adapterOptions\n        @public\n        @type {Object}\n      */\n      this.adapterOptions = options.adapterOptions;\n\n      /**\n        The relationships to include for this request.\n         Example\n         ```app/adapters/application.js\n        import Adapter from '@ember-data/adapter';\n         export default class ApplicationAdapter extends Adapter {\n          findAll(store, type, snapshotRecordArray) {\n            let url = `/${type.modelName}?include=${encodeURIComponent(snapshotRecordArray.include)}`;\n             return fetch(url).then((response) => response.json())\n          }\n        }\n        ```\n         @property include\n        @public\n        @type {String|Array}\n      */\n      this.include = options.include;\n    }\n\n    /**\n      The type of the underlying records for the snapshots in the array, as a Model\n      @property type\n      @deprecated\n      @public\n      @type {Model}\n    */\n\n    /**\n      The modelName of the underlying records for the snapshots in the array, as a Model\n      @property modelName\n      @public\n      @type {Model}\n    */\n    get modelName() {\n      return this._recordArray.modelName;\n    }\n\n    /**\n      Get snapshots of the underlying record array\n       Example\n       ```app/adapters/post.js\n      import JSONAPIAdapter from '@ember-data/adapter/json-api';\n       export default class PostAdapter extends JSONAPIAdapter {\n        shouldReloadAll(store, snapshotArray) {\n          let snapshots = snapshotArray.snapshots();\n           return snapshots.any(function(ticketSnapshot) {\n            let timeDiff = moment().diff(ticketSnapshot.attr('lastAccessedAt'), 'minutes');\n            if (timeDiff > 20) {\n              return true;\n            } else {\n              return false;\n            }\n          });\n        }\n      }\n      ```\n       @method snapshots\n      @public\n      @return {Array} Array of snapshots\n    */\n    snapshots() {\n      if (this._snapshots !== null) {\n        return this._snapshots;\n      }\n      const {\n        _instanceCache\n      } = this.__store;\n      this._snapshots = this._recordArray[SOURCE].map(identifier => _instanceCache.createSnapshot(identifier));\n      return this._snapshots;\n    }\n  }\n  if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_SNAPSHOT_MODEL_CLASS_ACCESS)) {\n    Object.defineProperty(SnapshotRecordArray.prototype, 'type', {\n      get() {\n        (debug.deprecate(`Using SnapshotRecordArray.type to access the ModelClass for a record is deprecated. Use store.modelFor(<modelName>) instead.`, false, {\n          id: 'ember-data:deprecate-snapshot-model-class-access',\n          until: '5.0',\n          for: 'ember-data',\n          since: {\n            available: '4.5.0',\n            enabled: '4.5.0'\n          }\n        }));\n        return this._recordArray.type;\n      }\n    });\n  }\n\n  /**\n    @module @ember-data/store\n  */\n\n  function payloadIsNotBlank(adapterPayload) {\n    if (Array.isArray(adapterPayload)) {\n      return true;\n    } else {\n      return Object.keys(adapterPayload || {}).length;\n    }\n  }\n  function _findAll(adapter, store, modelName, options, snapshotArray) {\n    let modelClass = store.modelFor(modelName); // adapter.findAll depends on the class\n    let recordArray = store.peekAll(modelName);\n    snapshotArray = snapshotArray || new SnapshotRecordArray(store, recordArray, options);\n    let promise = RSVP.Promise.resolve().then(() => adapter.findAll(store, modelClass, null, snapshotArray));\n    let label = 'DS: Handle Adapter#findAll of ' + modelClass;\n    promise = guardDestroyedStore(promise, store, label);\n    return promise.then(adapterPayload => {\n      (!(payloadIsNotBlank(adapterPayload)) && debug.assert(`You made a 'findAll' request for '${modelName}' records, but the adapter's response did not have any data`, payloadIsNotBlank(adapterPayload)));\n      let serializer = store.serializerFor(modelName);\n      let payload = normalizeResponseHelper(serializer, store, modelClass, adapterPayload, null, 'findAll');\n      store._push(payload);\n      recordArray.isUpdating = false;\n      return recordArray;\n    }, null, 'DS: Extract payload of findAll ${modelName}');\n  }\n  function _query(adapter, store, modelName, query, recordArray, options) {\n    let modelClass = store.modelFor(modelName); // adapter.query needs the class\n\n    // TODO @deprecate RecordArrays being passed to Adapters\n    recordArray = recordArray || store.recordArrayManager.createArray({\n      type: modelName,\n      query\n    });\n    let promise = RSVP.Promise.resolve().then(() => adapter.query(store, modelClass, query, recordArray, options));\n    let label = `DS: Handle Adapter#query of ${modelName}`;\n    promise = guardDestroyedStore(promise, store, label);\n    return promise.then(adapterPayload => {\n      let serializer = store.serializerFor(modelName);\n      let payload = normalizeResponseHelper(serializer, store, modelClass, adapterPayload, null, 'query');\n      let identifiers = store._push(payload);\n      (!(Array.isArray(identifiers)) && debug.assert('The response to store.query is expected to be an array but it was a single record. Please wrap your response in an array or use `store.queryRecord` to query for a single record.', Array.isArray(identifiers)));\n      store.recordArrayManager.populateManagedArray(recordArray, identifiers, payload);\n      return recordArray;\n    }, null, `DS: Extract payload of query ${modelName}`);\n  }\n  function _queryRecord(adapter, store, modelName, query, options) {\n    let modelClass = store.modelFor(modelName); // adapter.queryRecord needs the class\n    let promise = RSVP.Promise.resolve().then(() => adapter.queryRecord(store, modelClass, query, options));\n    let label = `DS: Handle Adapter#queryRecord of ${modelName}`;\n    promise = guardDestroyedStore(promise, store, label);\n    return promise.then(adapterPayload => {\n      let serializer = store.serializerFor(modelName);\n      let payload = normalizeResponseHelper(serializer, store, modelClass, adapterPayload, null, 'queryRecord');\n      (!(!Array.isArray(payload.data)) && debug.assert(`Expected the primary data returned by the serializer for a 'queryRecord' response to be a single object or null but instead it was an array.`, !Array.isArray(payload.data)));\n      return store._push(payload);\n    }, null, `DS: Extract payload of queryRecord ${modelName}`);\n  }\n\n  function promiseRecord(store, promise) {\n    let toReturn = promise.then(identifier => store.peekRecord(identifier));\n    return promiseObject(toReturn);\n  }\n\n  // hello world\n\n  let _RecordData;\n  function freeze(obj) {\n    if (typeof Object.freeze === 'function') {\n      return Object.freeze(obj);\n    }\n    return obj;\n  }\n  /**\n    The store contains all of the data for records loaded from the server.\n    It is also responsible for creating instances of `Model` that wrap\n    the individual data for a record, so that they can be bound to in your\n    Handlebars templates.\n\n    Define your application's store like this:\n\n    ```app/services/store.js\n    import Store from '@ember-data/store';\n\n    export default class MyStore extends Store {}\n    ```\n\n    Most Ember.js applications will only have a single `Store` that is\n    automatically created by their `Ember.Application`.\n\n    You can retrieve models from the store in several ways. To retrieve a record\n    for a specific id, use `Store`'s `findRecord()` method:\n\n    ```javascript\n    store.findRecord('person', 123).then(function (person) {\n    });\n    ```\n\n    By default, the store will talk to your backend using a standard\n    REST mechanism. You can customize how the store talks to your\n    backend by specifying a custom adapter:\n\n    ```app/adapters/application.js\n    import Adapter from '@ember-data/adapter';\n\n    export default class ApplicationAdapter extends Adapter {\n    }\n    ```\n\n    You can learn more about writing a custom adapter by reading the `Adapter`\n    documentation.\n\n    ### Store createRecord() vs. push() vs. pushPayload()\n\n    The store provides multiple ways to create new record objects. They have\n    some subtle differences in their use which are detailed below:\n\n    [createRecord](../methods/createRecord?anchor=createRecord) is used for creating new\n    records on the client side. This will return a new record in the\n    `created.uncommitted` state. In order to persist this record to the\n    backend, you will need to call `record.save()`.\n\n    [push](../methods/push?anchor=push) is used to notify Ember Data's store of new or\n    updated records that exist in the backend. This will return a record\n    in the `loaded.saved` state. The primary use-case for `store#push` is\n    to notify Ember Data about record updates (full or partial) that happen\n    outside of the normal adapter methods (for example\n    [SSE](http://dev.w3.org/html5/eventsource/) or [Web\n    Sockets](http://www.w3.org/TR/2009/WD-websockets-20091222/)).\n\n    [pushPayload](../methods/pushPayload?anchor=pushPayload) is a convenience wrapper for\n    `store#push` that will deserialize payloads if the\n    Serializer implements a `pushPayload` method.\n\n    Note: When creating a new record using any of the above methods\n    Ember Data will update `RecordArray`s such as those returned by\n    `store#peekAll()` or `store#findAll()`. This means any\n    data bindings or computed properties that depend on the RecordArray\n    will automatically be synced to include the new or updated record\n    values.\n\n    @main @ember-data/store\n    @class Store\n    @public\n    @extends Ember.Service\n  */\n\n  class Store extends Service__default.default {\n    // DEBUG-only properties\n\n    /**\n      @method init\n      @private\n    */\n    constructor() {\n      super(...arguments);\n\n      /**\n       * Provides access to the IdentifierCache instance\n       * for this store.\n       *\n       * The IdentifierCache can be used to generate or\n       * retrieve a stable unique identifier for any resource.\n       *\n       * @property {IdentifierCache} identifierCache\n       * @public\n       */\n      this.__private_singleton_recordData = void 0;\n      this.identifierCache = new IdentifierCache();\n\n      // private but maybe useful to be here, somewhat intimate\n      this.recordArrayManager = new RecordArrayManager({\n        store: this\n      });\n\n      // private, TODO consider taking public as the instance is public to instantiateRecord anyway\n      this._notificationManager = new NotificationManager(this);\n\n      // private\n      this._fetchManager = new FetchManager(this);\n      this._instanceCache = new InstanceCache(this);\n      this._adapterCache = Object.create(null);\n      this._serializerCache = Object.create(null);\n      this._modelFactoryCache = Object.create(null);\n      if (runtime.macroCondition(true)) {\n        if (this.generateStackTracesForTrackedRequests === undefined) {\n          this.generateStackTracesForTrackedRequests = false;\n        }\n        this._trackedAsyncRequests = [];\n        this._trackAsyncRequestStart = label => {\n          let trace = 'set `store.generateStackTracesForTrackedRequests = true;` to get a detailed trace for where this request originated';\n          if (this.generateStackTracesForTrackedRequests) {\n            try {\n              throw new Error(`EmberData TrackedRequest: ${label}`);\n            } catch (e) {\n              trace = e;\n            }\n          }\n          let token = freeze({\n            label,\n            trace\n          });\n          this._trackedAsyncRequests.push(token);\n          return token;\n        };\n        this._trackAsyncRequestEnd = token => {\n          let index = this._trackedAsyncRequests.indexOf(token);\n          if (index === -1) {\n            throw new Error(`Attempted to end tracking for the following request but it was not being tracked:\\n${token}`);\n          }\n          this._trackedAsyncRequests.splice(index, 1);\n        };\n        this.__asyncWaiter = () => {\n          let tracked = this._trackedAsyncRequests;\n          return this.DISABLE_WAITER || tracked.length === 0;\n        };\n        test.registerWaiter(this.__asyncWaiter);\n      }\n    }\n    _run(cb) {\n      (!(!this._cbs) && debug.assert(`EmberData should never encounter a nested run`, !this._cbs));\n      const _cbs = this._cbs = {};\n      cb();\n      if (_cbs.coalesce) {\n        _cbs.coalesce();\n      }\n      if (_cbs.sync) {\n        _cbs.sync();\n      }\n      if (_cbs.notify) {\n        _cbs.notify();\n      }\n      this._cbs = null;\n    }\n    _join(cb) {\n      if (this._cbs) {\n        cb();\n      } else {\n        this._run(cb);\n      }\n    }\n    _schedule(name, cb) {\n      (!(!!this._cbs) && debug.assert(`EmberData expects to schedule only when there is an active run`, !!this._cbs));\n      (!(!this._cbs[name]) && debug.assert(`EmberData expects only one flush per queue name, cannot schedule ${name}`, !this._cbs[name]));\n      this._cbs[name] = cb;\n    }\n\n    /**\n     * Retrieve the RequestStateService instance\n     * associated with this Store.\n     *\n     * This can be used to query the status of requests\n     * that have been initiated for a given identifier.\n     *\n     * @method getRequestStateService\n     * @returns {RequestStateService}\n     * @public\n     */\n    getRequestStateService() {\n      return this._fetchManager.requestCache;\n    }\n\n    /**\n     * A hook which an app or addon may implement. Called when\n     * the Store is attempting to create a Record Instance for\n     * a resource.\n     *\n     * This hook can be used to select or instantiate any desired\n     * mechanism of presentating cache data to the ui for access\n     * mutation, and interaction.\n     *\n     * @method instantiateRecord (hook)\n     * @param identifier\n     * @param createRecordArgs\n     * @param recordDataFor\n     * @param notificationManager\n     * @returns A record instance\n     * @public\n     */\n    instantiateRecord(identifier, createRecordArgs, recordDataFor, notificationManager) {\n      if (runtime.macroCondition(true)) {\n        let modelName = identifier.type;\n        let recordData = this._instanceCache.getRecordData(identifier);\n        // TODO deprecate allowing unknown args setting\n        let createOptions = {\n          _createProps: createRecordArgs,\n          // TODO @deprecate consider deprecating accessing record properties during init which the below is necessary for\n          _secretInit: {\n            identifier,\n            recordData,\n            store: this,\n            cb: secretInit\n          }\n        };\n\n        // ensure that `getOwner(this)` works inside a model instance\n        application.setOwner(createOptions, application.getOwner(this));\n        return getModelFactory(this, this._modelFactoryCache, modelName).class.create(createOptions);\n      }\n      (debug.assert(`You must implement the store's instantiateRecord hook for your custom model class.`));\n    }\n\n    /**\n     * A hook which an app or addon may implement. Called when\n     * the Store is destroying a Record Instance. This hook should\n     * be used to teardown any custom record instances instantiated\n     * with `instantiateRecord`.\n     *\n     * @method teardownRecord (hook)\n     * @public\n     * @param record\n     */\n    teardownRecord(record) {\n      if (runtime.macroCondition(true)) {\n        (!('destroy' in record) && debug.assert(`expected to receive an instance of DSModel. If using a custom model make sure you implement teardownRecord`, 'destroy' in record));\n        record.destroy();\n      } else {\n        (debug.assert(`You must implement the store's teardownRecord hook for your custom models`));\n      }\n    }\n\n    /**\n     * Provides access to the SchemaDefinitionService instance\n     * for this Store instance.\n     *\n     * The SchemaDefinitionService can be used to query for\n     * information about the schema of a resource.\n     *\n     * @method getSchemaDefinitionService\n     * @public\n     */\n    getSchemaDefinitionService() {\n      if (runtime.macroCondition(true)) {\n        if (!this._schemaDefinitionService) {\n          // it is potentially a mistake for the RFC to have not enabled chaining these services, though highlander rule is nice.\n          // what ember-m3 did via private API to allow both worlds to interop would be much much harder using this.\n          this._schemaDefinitionService = new DSModelSchemaDefinitionService(this);\n        }\n      }\n      (!(this._schemaDefinitionService) && debug.assert(`You must registerSchemaDefinitionService with the store to use custom model classes`, this._schemaDefinitionService));\n      return this._schemaDefinitionService;\n    }\n\n    /**\n     * Allows an app to register a custom SchemaDefinitionService\n     * for use when information about a resource's schema needs\n     * to be queried.\n     *\n     * This method can only be called more than once, but only one schema\n     * definition service may exist. Therefore if you wish to chain services\n     * you must lookup the existing service and close over it with the new\n     * service by calling `getSchemaDefinitionService` prior to registration.\n     *\n     * For Example:\n     *\n     * ```ts\n     * import Store from '@ember-data/store';\n     *\n     * class SchemaDelegator {\n     *   constructor(schema) {\n     *     this._schema = schema;\n     *   }\n     *\n     *   doesTypeExist(type: string): boolean {\n     *     if (AbstractSchemas.has(type)) {\n     *       return true;\n     *     }\n     *     return this._schema.doesTypeExist(type);\n     *   }\n     *\n     *   attributesDefinitionFor(identifier: RecordIdentifier | { type: string }): AttributesSchema {\n     *     return this._schema.attributesDefinitionFor(identifier);\n     *   }\n     *\n     *   relationshipsDefinitionFor(identifier: RecordIdentifier | { type: string }): RelationshipsSchema {\n     *     const schema = AbstractSchemas.get(identifier.type);\n     *     return schema || this._schema.relationshipsDefinitionFor(identifier);\n     *   }\n     * }\n     *\n     * export default class extends Store {\n     *   constructor(...args) {\n     *     super(...args);\n     *\n     *     const schema = this.getSchemaDefinitionService();\n     *     this.registerSchemaDefinitionService(new SchemaDelegator(schema));\n     *   }\n     * }\n     * ```\n     *\n     * @method registerSchemaDefinitionService\n     * @param {SchemaDefinitionService} schema\n     * @public\n     */\n    registerSchemaDefinitionService(schema) {\n      this._schemaDefinitionService = schema;\n    }\n\n    /**\n      Returns the schema for a particular `modelName`.\n       When used with Model from @ember-data/model the return is the model class,\n      but this is not guaranteed.\n       If looking to query attribute or relationship information it is\n      recommended to use `getSchemaDefinitionService` instead. This method\n      should be considered legacy and exists primarily to continue to support\n      Adapter/Serializer APIs which expect it's return value in their method\n      signatures.\n       The class of a model might be useful if you want to get a list of all the\n      relationship names of the model, see\n      [`relationshipNames`](/ember-data/release/classes/Model?anchor=relationshipNames)\n      for example.\n       @method modelFor\n      @public\n      @param {String} modelName\n      @return {subclass of Model | ShimModelClass}\n      */\n    // TODO @deprecate in favor of schema APIs, requires adapter/serializer overhaul or replacement\n    modelFor(modelName) {\n      if (runtime.macroCondition(true)) {\n        assertDestroyedStoreOnly(this, 'modelFor');\n      }\n      (!(modelName) && debug.assert(`You need to pass a model name to the store's modelFor method`, modelName));\n      (!(typeof modelName === 'string') && debug.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n      if (runtime.macroCondition(true)) {\n        let normalizedModelName = normalizeModelName$1(modelName);\n        let maybeFactory = getModelFactory(this, this._modelFactoryCache, normalizedModelName);\n\n        // for factorFor factory/class split\n        let klass = maybeFactory && maybeFactory.class ? maybeFactory.class : maybeFactory;\n        if (!klass || !klass.isModel) {\n          (!(this.getSchemaDefinitionService().doesTypeExist(modelName)) && debug.assert(`No model was found for '${modelName}' and no schema handles the type`, this.getSchemaDefinitionService().doesTypeExist(modelName)));\n          return getShimClass(this, modelName);\n        } else {\n          // TODO @deprecate ever returning the klass, always return the shim\n          return klass;\n        }\n      }\n      (!(this.getSchemaDefinitionService().doesTypeExist(modelName)) && debug.assert(`No model was found for '${modelName}' and no schema handles the type`, this.getSchemaDefinitionService().doesTypeExist(modelName)));\n      return getShimClass(this, modelName);\n    }\n\n    /**\n      Create a new record in the current store. The properties passed\n      to this method are set on the newly created record.\n       To create a new instance of a `Post`:\n       ```js\n      store.createRecord('post', {\n        title: 'Ember is awesome!'\n      });\n      ```\n       To create a new instance of a `Post` that has a relationship with a `User` record:\n       ```js\n      let user = this.store.peekRecord('user', 1);\n      store.createRecord('post', {\n        title: 'Ember is awesome!',\n        user: user\n      });\n      ```\n       @method createRecord\n      @public\n      @param {String} modelName\n      @param {Object} inputProperties a hash of properties to set on the\n        newly created record.\n      @return {Model} record\n    */\n    createRecord(modelName, inputProperties) {\n      if (runtime.macroCondition(true)) {\n        assertDestroyingStore(this, 'createRecord');\n      }\n      (!(modelName) && debug.assert(`You need to pass a model name to the store's createRecord method`, modelName));\n      (!(typeof modelName === 'string') && debug.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string')); // This is wrapped in a `run.join` so that in test environments users do not need to manually wrap\n      //   calls to `createRecord`. The run loop usage here is because we batch the joining and updating\n      //   of record-arrays via ember's run loop, not our own.\n      //\n      //   to remove this, we would need to move to a new `async` API.\n      let record;\n      runloop._backburner.join(() => {\n        this._join(() => {\n          let normalizedModelName = normalizeModelName$1(modelName);\n          let properties = {\n            ...inputProperties\n          };\n\n          // If the passed properties do not include a primary key,\n          // give the adapter an opportunity to generate one. Typically,\n          // client-side ID generators will use something like uuid.js\n          // to avoid conflicts.\n\n          if (properties.id === null || properties.id === undefined) {\n            let adapter = this.adapterFor(modelName);\n            if (adapter && adapter.generateIdForRecord) {\n              properties.id = adapter.generateIdForRecord(this, modelName, properties);\n            } else {\n              properties.id = null;\n            }\n          }\n\n          // Coerce ID to a string\n          properties.id = coerceId(properties.id);\n          const resource = {\n            type: normalizedModelName,\n            id: properties.id\n          };\n          if (resource.id) {\n            const identifier = this.identifierCache.peekRecordIdentifier(resource);\n            (!(!identifier) && debug.assert(`The id ${properties.id} has already been used with another '${normalizedModelName}' record.`, !identifier));\n          }\n          const identifier = this.identifierCache.createIdentifierForNewRecord(resource);\n          const recordData = this._instanceCache.getRecordData(identifier);\n          const createOptions = normalizeProperties(this, identifier, properties, recordData.managedVersion === '1');\n          const resultProps = recordData.clientDidCreate(identifier, createOptions);\n          this.recordArrayManager.identifierAdded(identifier);\n          record = this._instanceCache.getRecord(identifier, resultProps);\n        });\n      });\n      return record;\n    }\n\n    /**\n      For symmetry, a record can be deleted via the store.\n       Example\n       ```javascript\n      let post = store.createRecord('post', {\n        title: 'Ember is awesome!'\n      });\n       store.deleteRecord(post);\n      ```\n       @method deleteRecord\n      @public\n      @param {Model} record\n    */\n    deleteRecord(record) {\n      if (runtime.macroCondition(true)) {\n        assertDestroyingStore(this, 'deleteRecord');\n      }\n      const identifier = peekRecordIdentifier(record);\n      const recordData = identifier && this._instanceCache.peek({\n        identifier,\n        bucket: 'recordData'\n      });\n      (!(recordData) && debug.assert(`expected a recordData instance to exist for the record`, recordData));\n      this._join(() => {\n        recordData.setIsDeleted(identifier, true);\n        if (recordData.isNew(identifier)) {\n          runloop._backburner.join(() => {\n            this._instanceCache.unloadRecord(identifier);\n          });\n        }\n      });\n    }\n\n    /**\n      For symmetry, a record can be unloaded via the store.\n      This will cause the record to be destroyed and freed up for garbage collection.\n       Example\n       ```javascript\n      store.findRecord('post', 1).then(function(post) {\n        store.unloadRecord(post);\n      });\n      ```\n       @method unloadRecord\n      @public\n      @param {Model} record\n    */\n    unloadRecord(record) {\n      if (runtime.macroCondition(true)) {\n        assertDestroyingStore(this, 'unloadRecord');\n      }\n      const identifier = peekRecordIdentifier(record);\n      if (identifier) {\n        this._instanceCache.unloadRecord(identifier);\n      }\n    }\n\n    /**\n      @method find\n      @param {String} modelName\n      @param {String|Integer} id\n      @param {Object} options\n      @return {Promise} promise\n      @deprecated\n      @private\n    */\n    find(modelName, id, options) {\n      if (runtime.macroCondition(true)) {\n        assertDestroyingStore(this, 'find');\n      }\n      // The default `model` hook in Route calls `find(modelName, id)`,\n      // that's why we have to keep this method around even though `findRecord` is\n      // the public way to get a record by modelName and id.\n      (!(arguments.length !== 1) && debug.assert(`Using store.find(type) has been removed. Use store.findAll(modelName) to retrieve all records for a given type.`, arguments.length !== 1));\n      (!(!options) && debug.assert(`Calling store.find(modelName, id, { preload: preload }) is no longer supported. Use store.findRecord(modelName, id, { preload: preload }) instead.`, !options));\n      (!(arguments.length === 2) && debug.assert(`You need to pass the model name and id to the store's find method`, arguments.length === 2));\n      (!(typeof id === 'string' || typeof id === 'number') && debug.assert(`You cannot pass '${id}' as id to the store's find method`, typeof id === 'string' || typeof id === 'number'));\n      (!(typeof id !== 'object') && debug.assert(`Calling store.find() with a query object is no longer supported. Use store.query() instead.`, typeof id !== 'object'));\n      (!(typeof modelName === 'string') && debug.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_STORE_FIND)) {\n        (debug.deprecate(`Using store.find is deprecated, use store.findRecord instead. Likely this means you are relying on the implicit store fetching behavior of routes unknowingly.`, false, {\n          id: 'ember-data:deprecate-store-find',\n          since: {\n            available: '4.5',\n            enabled: '4.5'\n          },\n          for: 'ember-data',\n          until: '5.0'\n        }));\n        return this.findRecord(modelName, id);\n      }\n      (debug.assert(`store.find has been removed. Use store.findRecord instead.`));\n    }\n\n    /**\n      This method returns a record for a given identifier or type and id combination.\n       The `findRecord` method will always resolve its promise with the same\n      object for a given identifier or type and `id`.\n       The `findRecord` method will always return a **promise** that will be\n      resolved with the record.\n       **Example 1**\n       ```app/routes/post.js\n      import Route from '@ember/routing/route';\n       export default class PostRoute extends Route {\n        model({ post_id }) {\n          return this.store.findRecord('post', post_id);\n        }\n      }\n      ```\n       **Example 2**\n       `findRecord` can be called with a single identifier argument instead of the combination\n      of `type` (modelName) and `id` as separate arguments. You may recognize this combo as\n      the typical pairing from [JSON:API](https://jsonapi.org/format/#document-resource-object-identification)\n       ```app/routes/post.js\n      import Route from '@ember/routing/route';\n       export default class PostRoute extends Route {\n        model({ post_id: id }) {\n          return this.store.findRecord({ type: 'post', id });\n        }\n      }\n      ```\n       **Example 3**\n       If you have previously received an lid via an Identifier for this record, and the record\n      has already been assigned an id, you can find the record again using just the lid.\n       ```app/routes/post.js\n      store.findRecord({ lid });\n      ```\n       If the record is not yet available, the store will ask the adapter's `findRecord`\n      method to retrieve and supply the necessary data. If the record is already present\n      in the store, it depends on the reload behavior _when_ the returned promise\n      resolves.\n       ### Preloading\n       You can optionally `preload` specific attributes and relationships that you know of\n      by passing them via the passed `options`.\n       For example, if your Ember route looks like `/posts/1/comments/2` and your API route\n      for the comment also looks like `/posts/1/comments/2` if you want to fetch the comment\n      without also fetching the post you can pass in the post to the `findRecord` call:\n       ```app/routes/post-comments.js\n      import Route from '@ember/routing/route';\n       export default class PostRoute extends Route {\n        model({ post_id, comment_id: id }) {\n          return this.store.findRecord({ type: 'comment', id, { preload: { post: post_id }} });\n        }\n      }\n      ```\n       In your adapter you can then access this id without triggering a network request via the\n      snapshot:\n       ```app/adapters/application.js\n      import EmberObject from '@ember/object';\n       export default class Adapter extends EmberObject {\n         findRecord(store, schema, id, snapshot) {\n          let type = schema.modelName;\n           if (type === 'comment')\n            let postId = snapshot.belongsTo('post', { id: true });\n             return fetch(`./posts/${postId}/comments/${id}`)\n              .then(response => response.json())\n          }\n        }\n      }\n      ```\n       This could also be achieved by supplying the post id to the adapter via the adapterOptions\n      property on the options hash.\n       ```app/routes/post-comments.js\n      import Route from '@ember/routing/route';\n       export default class PostRoute extends Route {\n        model({ post_id, comment_id: id }) {\n          return this.store.findRecord({ type: 'comment', id, { adapterOptions: { post: post_id }} });\n        }\n      }\n      ```\n       ```app/adapters/application.js\n      import EmberObject from '@ember/object';\n       export default class Adapter extends EmberObject {\n         findRecord(store, schema, id, snapshot) {\n          let type = schema.modelName;\n           if (type === 'comment')\n            let postId = snapshot.adapterOptions.post;\n             return fetch(`./posts/${postId}/comments/${id}`)\n              .then(response => response.json())\n          }\n        }\n      }\n      ```\n       If you have access to the post model you can also pass the model itself to preload:\n       ```javascript\n      let post = await store.findRecord('post', 1);\n      let comment = await store.findRecord('comment', 2, { post: myPostModel });\n      ```\n       ### Reloading\n       The reload behavior is configured either via the passed `options` hash or\n      the result of the adapter's `shouldReloadRecord`.\n       If `{ reload: true }` is passed or `adapter.shouldReloadRecord` evaluates\n      to `true`, then the returned promise resolves once the adapter returns\n      data, regardless if the requested record is already in the store:\n       ```js\n      store.push({\n        data: {\n          id: 1,\n          type: 'post',\n          revision: 1\n        }\n      });\n       // adapter#findRecord resolves with\n      // [\n      //   {\n      //     id: 1,\n      //     type: 'post',\n      //     revision: 2\n      //   }\n      // ]\n      store.findRecord('post', 1, { reload: true }).then(function(post) {\n        post.revision; // 2\n      });\n      ```\n       If no reload is indicated via the above mentioned ways, then the promise\n      immediately resolves with the cached version in the store.\n       ### Background Reloading\n       Optionally, if `adapter.shouldBackgroundReloadRecord` evaluates to `true`,\n      then a background reload is started, which updates the records' data, once\n      it is available:\n       ```js\n      // app/adapters/post.js\n      import ApplicationAdapter from \"./application\";\n       export default class PostAdapter extends ApplicationAdapter {\n        shouldReloadRecord(store, snapshot) {\n          return false;\n        },\n         shouldBackgroundReloadRecord(store, snapshot) {\n          return true;\n        }\n      });\n       // ...\n       store.push({\n        data: {\n          id: 1,\n          type: 'post',\n          revision: 1\n        }\n      });\n       let blogPost = store.findRecord('post', 1).then(function(post) {\n        post.revision; // 1\n      });\n       // later, once adapter#findRecord resolved with\n      // [\n      //   {\n      //     id: 1,\n      //     type: 'post',\n      //     revision: 2\n      //   }\n      // ]\n       blogPost.revision; // 2\n      ```\n       If you would like to force or prevent background reloading, you can set a\n      boolean value for `backgroundReload` in the options object for\n      `findRecord`.\n       ```app/routes/post/edit.js\n      import Route from '@ember/routing/route';\n       export default class PostEditRoute extends Route {\n        model(params) {\n          return this.store.findRecord('post', params.post_id, { backgroundReload: false });\n        }\n      }\n      ```\n       If you pass an object on the `adapterOptions` property of the options\n      argument it will be passed to your adapter via the snapshot\n       ```app/routes/post/edit.js\n      import Route from '@ember/routing/route';\n       export default class PostEditRoute extends Route {\n        model(params) {\n          return this.store.findRecord('post', params.post_id, {\n            adapterOptions: { subscribe: false }\n          });\n        }\n      }\n      ```\n       ```app/adapters/post.js\n      import MyCustomAdapter from './custom-adapter';\n       export default class PostAdapter extends MyCustomAdapter {\n        findRecord(store, type, id, snapshot) {\n          if (snapshot.adapterOptions.subscribe) {\n            // ...\n          }\n          // ...\n        }\n      }\n      ```\n       See [peekRecord](../methods/peekRecord?anchor=peekRecord) to get the cached version of a record.\n       ### Retrieving Related Model Records\n       If you use an adapter such as Ember's default\n      [`JSONAPIAdapter`](/ember-data/release/classes/JSONAPIAdapter)\n      that supports the [JSON API specification](http://jsonapi.org/) and if your server\n      endpoint supports the use of an\n      ['include' query parameter](http://jsonapi.org/format/#fetching-includes),\n      you can use `findRecord()` or `findAll()` to automatically retrieve additional records related to\n      the one you request by supplying an `include` parameter in the `options` object.\n       For example, given a `post` model that has a `hasMany` relationship with a `comment`\n      model, when we retrieve a specific post we can have the server also return that post's\n      comments in the same request:\n       ```app/routes/post.js\n      import Route from '@ember/routing/route';\n       export default class PostRoute extends Route {\n        model(params) {\n          return this.store.findRecord('post', params.post_id, { include: 'comments' });\n        }\n      }\n      ```\n       ```app/adapters/application.js\n      import EmberObject from '@ember/object';\n       export default class Adapter extends EmberObject {\n         findRecord(store, schema, id, snapshot) {\n          let type = schema.modelName;\n           if (type === 'post')\n            let includes = snapshot.adapterOptions.include;\n             return fetch(`./posts/${postId}?include=${includes}`)\n              .then(response => response.json())\n          }\n        }\n      }\n      ```\n       In this case, the post's comments would then be available in your template as\n      `model.comments`.\n       Multiple relationships can be requested using an `include` parameter consisting of a\n      comma-separated list (without white-space) while nested relationships can be specified\n      using a dot-separated sequence of relationship names. So to request both the post's\n      comments and the authors of those comments the request would look like this:\n       ```app/routes/post.js\n      import Route from '@ember/routing/route';\n       export default class PostRoute extends Route {\n        model(params) {\n          return this.store.findRecord('post', params.post_id, { include: 'comments,comments.author' });\n        }\n      }\n      ```\n       ### Retrieving Specific Fields by Type\n       If your server endpoint supports the use of a ['fields' query parameter](https://jsonapi.org/format/#fetching-sparse-fieldsets),\n      you can use pass those fields through to your server.  At this point in time, this requires a few manual steps on your part.\n       1. Implement `buildQuery` in your adapter.\n       ```app/adapters/application.js\n      buildQuery(snapshot) {\n        let query = super.buildQuery(...arguments);\n         let { fields } = snapshot.adapterOptions;\n         if (fields) {\n          query.fields = fields;\n        }\n         return query;\n      }\n      ```\n       2. Then pass through the applicable fields to your `findRecord` request.\n       Given a `post` model with attributes body, title, publishDate and meta, you can retrieve a filtered list of attributes.\n       ```app/routes/post.js\n      import Route from '@ember/routing/route';\n      export default Route.extend({\n        model(params) {\n          return this.store.findRecord('post', params.post_id, { adapterOptions: { fields: { post: 'body,title' } });\n        }\n      });\n      ```\n       Moreover, you can filter attributes on related models as well. If a `post` has a `belongsTo` relationship to a user,\n      just include the relationship key and attributes.\n       ```app/routes/post.js\n      import Route from '@ember/routing/route';\n      export default Route.extend({\n        model(params) {\n          return this.store.findRecord('post', params.post_id, { adapterOptions: { fields: { post: 'body,title', user: 'name,email' } });\n        }\n      });\n      ```\n       @since 1.13.0\n      @method findRecord\n      @public\n      @param {String|object} modelName - either a string representing the modelName or a ResourceIdentifier object containing both the type (a string) and the id (a string) for the record or an lid (a string) of an existing record\n      @param {(String|Integer|Object)} id - optional object with options for the request only if the first param is a ResourceIdentifier, else the string id of the record to be retrieved\n      @param {Object} [options] - if the first param is a string this will be the optional options for the request. See examples for available options.\n      @return {Promise} promise\n    */\n\n    findRecord(resource, id, options) {\n      if (runtime.macroCondition(true)) {\n        assertDestroyingStore(this, 'findRecord');\n      }\n      (!(resource) && debug.assert(`You need to pass a modelName or resource identifier as the first argument to the store's findRecord method`, resource));\n      if (isMaybeIdentifier(resource)) {\n        options = id;\n      } else {\n        (!(typeof resource === 'string') && debug.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${resource}`, typeof resource === 'string'));\n        const type = normalizeModelName$1(resource);\n        const normalizedId = ensureStringId(id);\n        resource = constructResource(type, normalizedId);\n      }\n      const identifier = this.identifierCache.getOrCreateRecordIdentifier(resource);\n      let promise;\n      options = options || {};\n\n      // if not loaded start loading\n      if (!this._instanceCache.recordIsLoaded(identifier)) {\n        promise = this._instanceCache._fetchDataIfNeededForIdentifier(identifier, options);\n\n        // Refetch if the reload option is passed\n      } else if (options.reload) {\n        assertIdentifierHasId(identifier);\n        promise = this._fetchManager.scheduleFetch(identifier, options);\n      } else {\n        let snapshot = null;\n        let adapter = this.adapterFor(identifier.type);\n\n        // Refetch the record if the adapter thinks the record is stale\n        if (typeof options.reload === 'undefined' && adapter.shouldReloadRecord && adapter.shouldReloadRecord(this, snapshot = this._instanceCache.createSnapshot(identifier, options))) {\n          assertIdentifierHasId(identifier);\n          promise = this._fetchManager.scheduleFetch(identifier, options);\n        } else {\n          // Trigger the background refetch if backgroundReload option is passed\n          if (options.backgroundReload !== false && (options.backgroundReload || !adapter.shouldBackgroundReloadRecord || adapter.shouldBackgroundReloadRecord(this, snapshot = snapshot || this._instanceCache.createSnapshot(identifier, options)))) {\n            assertIdentifierHasId(identifier);\n            this._fetchManager.scheduleFetch(identifier, options);\n          }\n\n          // Return the cached record\n          promise = RSVP.resolve(identifier);\n        }\n      }\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_PROMISE_PROXIES)) {\n        return promiseRecord(this, promise);\n      }\n      return promise.then(identifier => this.peekRecord(identifier));\n    }\n\n    /**\n      Get the reference for the specified record.\n       Example\n       ```javascript\n      let userRef = store.getReference('user', 1);\n       // check if the user is loaded\n      let isLoaded = userRef.value() !== null;\n       // get the record of the reference (null if not yet available)\n      let user = userRef.value();\n       // get the identifier of the reference\n      if (userRef.remoteType() === 'id') {\n      let id = userRef.id();\n      }\n       // load user (via store.find)\n      userRef.load().then(...)\n       // or trigger a reload\n      userRef.reload().then(...)\n       // provide data for reference\n      userRef.push({ id: 1, username: '@user' }).then(function(user) {\n        userRef.value() === user;\n      });\n      ```\n       @method getReference\n      @public\n      @param {String|object} resource - modelName (string) or Identifier (object)\n      @param {String|Integer} id\n      @since 2.5.0\n      @return {RecordReference}\n    */\n    // TODO @deprecate getReference (and references generally)\n    getReference(resource, id) {\n      if (runtime.macroCondition(true)) {\n        assertDestroyingStore(this, 'getReference');\n      }\n      let resourceIdentifier;\n      if (arguments.length === 1 && isMaybeIdentifier(resource)) {\n        resourceIdentifier = resource;\n      } else {\n        const type = normalizeModelName$1(resource);\n        const normalizedId = ensureStringId(id);\n        resourceIdentifier = constructResource(type, normalizedId);\n      }\n      (!(isMaybeIdentifier(resourceIdentifier)) && debug.assert('getReference expected to receive either a resource identifier or type and id as arguments', isMaybeIdentifier(resourceIdentifier)));\n      let identifier = this.identifierCache.getOrCreateRecordIdentifier(resourceIdentifier);\n      return this._instanceCache.getReference(identifier);\n    }\n\n    /**\n      Get a record by a given type and ID without triggering a fetch.\n       This method will synchronously return the record if it is available in the store,\n      otherwise it will return `null`. A record is available if it has been fetched earlier, or\n      pushed manually into the store.\n       See [findRecord](../methods/findRecord?anchor=findRecord) if you would like to request this record from the backend.\n       _Note: This is a synchronous method and does not return a promise._\n       **Example 1**\n       ```js\n      let post = store.peekRecord('post', 1);\n       post.id; // 1\n      ```\n       `peekRecord` can be called with a single identifier argument instead of the combination\n      of `type` (modelName) and `id` as separate arguments. You may recognize this combo as\n      the typical pairing from [JSON:API](https://jsonapi.org/format/#document-resource-object-identification)\n       **Example 2**\n       ```js\n      let post = store.peekRecord({ type: 'post', id });\n      post.id; // 1\n      ```\n       If you have previously received an lid from an Identifier for this record, you can lookup the record again using\n      just the lid.\n       **Example 3**\n       ```js\n      let post = store.peekRecord({ lid });\n      post.id; // 1\n      ```\n        @since 1.13.0\n      @method peekRecord\n      @public\n      @param {String|object} modelName - either a string representing the modelName or a ResourceIdentifier object containing both the type (a string) and the id (a string) for the record or an lid (a string) of an existing record\n      @param {String|Integer} id - optional only if the first param is a ResourceIdentifier, else the string id of the record to be retrieved.\n      @return {Model|null} record\n    */\n\n    peekRecord(identifier, id) {\n      if (arguments.length === 1 && isMaybeIdentifier(identifier)) {\n        const stableIdentifier = this.identifierCache.peekRecordIdentifier(identifier);\n        const isLoaded = stableIdentifier && this._instanceCache.recordIsLoaded(stableIdentifier);\n        // TODO come up with a better mechanism for determining if we have data and could peek.\n        // this is basically an \"are we not empty\" query.\n        return isLoaded ? this._instanceCache.getRecord(stableIdentifier) : null;\n      }\n      if (runtime.macroCondition(true)) {\n        assertDestroyingStore(this, 'peekRecord');\n      }\n      (!(identifier) && debug.assert(`You need to pass a model name to the store's peekRecord method`, identifier));\n      (!(typeof identifier === 'string') && debug.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${identifier}`, typeof identifier === 'string'));\n      const type = normalizeModelName$1(identifier);\n      const normalizedId = ensureStringId(id);\n      const resource = {\n        type,\n        id: normalizedId\n      };\n      const stableIdentifier = this.identifierCache.peekRecordIdentifier(resource);\n      const isLoaded = stableIdentifier && this._instanceCache.recordIsLoaded(stableIdentifier);\n      return isLoaded ? this._instanceCache.getRecord(stableIdentifier) : null;\n    }\n\n    /**\n     This method returns true if a record for a given modelName and id is already\n     loaded in the store. Use this function to know beforehand if a findRecord()\n     will result in a request or that it will be a cache hit.\n      Example\n      ```javascript\n     store.hasRecordForId('post', 1); // false\n     store.findRecord('post', 1).then(function() {\n       store.hasRecordForId('post', 1); // true\n     });\n     ```\n       @method hasRecordForId\n      @deprecated\n      @public\n      @param {String} modelName\n      @param {(String|Integer)} id\n      @return {Boolean}\n    */\n    hasRecordForId(modelName, id) {\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_HAS_RECORD)) {\n        (debug.deprecate(`store.hasRecordForId has been deprecated in favor of store.peekRecord`, false, {\n          id: 'ember-data:deprecate-has-record-for-id',\n          since: {\n            available: '4.5',\n            enabled: '4.5'\n          },\n          until: '5.0',\n          for: 'ember-data'\n        }));\n        if (runtime.macroCondition(true)) {\n          assertDestroyingStore(this, 'hasRecordForId');\n        }\n        (!(modelName) && debug.assert(`You need to pass a model name to the store's hasRecordForId method`, modelName));\n        (!(typeof modelName === 'string') && debug.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n        const type = normalizeModelName$1(modelName);\n        const trueId = ensureStringId(id);\n        const resource = {\n          type,\n          id: trueId\n        };\n        const identifier = this.identifierCache.peekRecordIdentifier(resource);\n        return Boolean(identifier && this._instanceCache.recordIsLoaded(identifier));\n      }\n      (debug.assert(`store.hasRecordForId has been removed`));\n    }\n\n    /**\n      This method delegates a query to the adapter. This is the one place where\n      adapter-level semantics are exposed to the application.\n       Each time this method is called a new request is made through the adapter.\n       Exposing queries this way seems preferable to creating an abstract query\n      language for all server-side queries, and then require all adapters to\n      implement them.\n       ---\n       If you do something like this:\n       ```javascript\n      store.query('person', { page: 1 });\n      ```\n       The request made to the server will look something like this:\n       ```\n      GET \"/api/v1/person?page=1\"\n      ```\n       ---\n       If you do something like this:\n       ```javascript\n      store.query('person', { ids: [1, 2, 3] });\n      ```\n       The request made to the server will look something like this:\n       ```\n      GET \"/api/v1/person?ids%5B%5D=1&ids%5B%5D=2&ids%5B%5D=3\"\n      decoded: \"/api/v1/person?ids[]=1&ids[]=2&ids[]=3\"\n      ```\n       This method returns a promise, which is resolved with a\n      [`Collection`](/ember-data/release/classes/Collection)\n      once the server returns.\n       @since 1.13.0\n      @method query\n      @public\n      @param {String} modelName\n      @param {any} query an opaque query to be used by the adapter\n      @param {Object} options optional, may include `adapterOptions` hash which will be passed to adapter.query\n      @return {Promise} promise\n    */\n    query(modelName, query, options) {\n      if (runtime.macroCondition(true)) {\n        assertDestroyingStore(this, 'query');\n      }\n      (!(modelName) && debug.assert(`You need to pass a model name to the store's query method`, modelName));\n      (!(query) && debug.assert(`You need to pass a query hash to the store's query method`, query));\n      (!(typeof modelName === 'string') && debug.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n      let adapterOptionsWrapper = {};\n      if (options && options.adapterOptions) {\n        adapterOptionsWrapper.adapterOptions = options.adapterOptions;\n      }\n      let recordArray = options?._recordArray || null;\n      let normalizedModelName = normalizeModelName$1(modelName);\n      let adapter = this.adapterFor(normalizedModelName);\n      (!(adapter) && debug.assert(`You tried to load a query but you have no adapter (for ${modelName})`, adapter));\n      (!(typeof adapter.query === 'function') && debug.assert(`You tried to load a query but your adapter does not implement 'query'`, typeof adapter.query === 'function'));\n      let queryPromise = _query(adapter, this, normalizedModelName, query, recordArray, adapterOptionsWrapper);\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_PROMISE_PROXIES)) {\n        return promiseArray(queryPromise);\n      }\n      return queryPromise;\n    }\n\n    /**\n      This method makes a request for one record, where the `id` is not known\n      beforehand (if the `id` is known, use [`findRecord`](../methods/findRecord?anchor=findRecord)\n      instead).\n       This method can be used when it is certain that the server will return a\n      single object for the primary data.\n       Each time this method is called a new request is made through the adapter.\n       Let's assume our API provides an endpoint for the currently logged in user\n      via:\n       ```\n      // GET /api/current_user\n      {\n        user: {\n          id: 1234,\n          username: 'admin'\n        }\n      }\n      ```\n       Since the specific `id` of the `user` is not known beforehand, we can use\n      `queryRecord` to get the user:\n       ```javascript\n      store.queryRecord('user', {}).then(function(user) {\n        let username = user.username;\n        // do thing\n      });\n      ```\n       The request is made through the adapters' `queryRecord`:\n       ```app/adapters/user.js\n      import Adapter from '@ember-data/adapter';\n      import $ from 'jquery';\n       export default class UserAdapter extends Adapter {\n        queryRecord(modelName, query) {\n          return $.getJSON('/api/current_user');\n        }\n      }\n      ```\n       Note: the primary use case for `store.queryRecord` is when a single record\n      is queried and the `id` is not known beforehand. In all other cases\n      `store.query` and using the first item of the array is likely the preferred\n      way:\n       ```\n      // GET /users?username=unique\n      {\n        data: [{\n          id: 1234,\n          type: 'user',\n          attributes: {\n            username: \"unique\"\n          }\n        }]\n      }\n      ```\n       ```javascript\n      store.query('user', { username: 'unique' }).then(function(users) {\n        return users.firstObject;\n      }).then(function(user) {\n        let id = user.id;\n      });\n      ```\n       This method returns a promise, which resolves with the found record.\n       If the adapter returns no data for the primary data of the payload, then\n      `queryRecord` resolves with `null`:\n       ```\n      // GET /users?username=unique\n      {\n        data: null\n      }\n      ```\n       ```javascript\n      store.queryRecord('user', { username: 'unique' }).then(function(user) {\n         // user is null\n      });\n      ```\n       @since 1.13.0\n      @method queryRecord\n      @public\n      @param {String} modelName\n      @param {any} query an opaque query to be used by the adapter\n      @param {Object} options optional, may include `adapterOptions` hash which will be passed to adapter.queryRecord\n      @return {Promise} promise which resolves with the found record or `null`\n    */\n    queryRecord(modelName, query, options) {\n      if (runtime.macroCondition(true)) {\n        assertDestroyingStore(this, 'queryRecord');\n      }\n      (!(modelName) && debug.assert(`You need to pass a model name to the store's queryRecord method`, modelName));\n      (!(query) && debug.assert(`You need to pass a query hash to the store's queryRecord method`, query));\n      (!(typeof modelName === 'string') && debug.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n      let normalizedModelName = normalizeModelName$1(modelName);\n      let adapter = this.adapterFor(normalizedModelName);\n      let adapterOptionsWrapper = {};\n      if (options && options.adapterOptions) {\n        adapterOptionsWrapper.adapterOptions = options.adapterOptions;\n      }\n      (!(adapter) && debug.assert(`You tried to make a query but you have no adapter (for ${normalizedModelName})`, adapter));\n      (!(typeof adapter.queryRecord === 'function') && debug.assert(`You tried to make a query but your adapter does not implement 'queryRecord'`, typeof adapter.queryRecord === 'function'));\n      const promise = _queryRecord(adapter, this, normalizedModelName, query, adapterOptionsWrapper);\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_PROMISE_PROXIES)) {\n        return promiseObject(promise.then(identifier => identifier && this.peekRecord(identifier)));\n      }\n      return promise.then(identifier => identifier && this.peekRecord(identifier));\n    }\n\n    /**\n      `findAll` asks the adapter's `findAll` method to find the records for the\n      given type, and returns a promise which will resolve with all records of\n      this type present in the store, even if the adapter only returns a subset\n      of them.\n       ```app/routes/authors.js\n      import Route from '@ember/routing/route';\n       export default class AuthorsRoute extends Route {\n        model(params) {\n          return this.store.findAll('author');\n        }\n      }\n      ```\n       _When_ the returned promise resolves depends on the reload behavior,\n      configured via the passed `options` hash and the result of the adapter's\n      `shouldReloadAll` method.\n       ### Reloading\n       If `{ reload: true }` is passed or `adapter.shouldReloadAll` evaluates to\n      `true`, then the returned promise resolves once the adapter returns data,\n      regardless if there are already records in the store:\n       ```js\n      store.push({\n        data: {\n          id: 'first',\n          type: 'author'\n        }\n      });\n       // adapter#findAll resolves with\n      // [\n      //   {\n      //     id: 'second',\n      //     type: 'author'\n      //   }\n      // ]\n      store.findAll('author', { reload: true }).then(function(authors) {\n        authors.getEach('id'); // ['first', 'second']\n      });\n      ```\n       If no reload is indicated via the above mentioned ways, then the promise\n      immediately resolves with all the records currently loaded in the store.\n       ### Background Reloading\n       Optionally, if `adapter.shouldBackgroundReloadAll` evaluates to `true`,\n      then a background reload is started. Once this resolves, the array with\n      which the promise resolves, is updated automatically so it contains all the\n      records in the store:\n       ```app/adapters/application.js\n      import Adapter from '@ember-data/adapter';\n       export default class ApplicationAdapter extends Adapter {\n        shouldReloadAll(store, snapshotsArray) {\n          return false;\n        },\n         shouldBackgroundReloadAll(store, snapshotsArray) {\n          return true;\n        }\n      });\n       // ...\n       store.push({\n        data: {\n          id: 'first',\n          type: 'author'\n        }\n      });\n       let allAuthors;\n      store.findAll('author').then(function(authors) {\n        authors.getEach('id'); // ['first']\n         allAuthors = authors;\n      });\n       // later, once adapter#findAll resolved with\n      // [\n      //   {\n      //     id: 'second',\n      //     type: 'author'\n      //   }\n      // ]\n       allAuthors.getEach('id'); // ['first', 'second']\n      ```\n       If you would like to force or prevent background reloading, you can set a\n      boolean value for `backgroundReload` in the options object for\n      `findAll`.\n       ```app/routes/post/edit.js\n      import Route from '@ember/routing/route';\n       export default class PostEditRoute extends Route {\n        model() {\n          return this.store.findAll('post', { backgroundReload: false });\n        }\n      }\n      ```\n       If you pass an object on the `adapterOptions` property of the options\n      argument it will be passed to you adapter via the `snapshotRecordArray`\n       ```app/routes/posts.js\n      import Route from '@ember/routing/route';\n       export default class PostsRoute extends Route {\n        model(params) {\n          return this.store.findAll('post', {\n            adapterOptions: { subscribe: false }\n          });\n        }\n      }\n      ```\n       ```app/adapters/post.js\n      import MyCustomAdapter from './custom-adapter';\n       export default class UserAdapter extends MyCustomAdapter {\n        findAll(store, type, sinceToken, snapshotRecordArray) {\n          if (snapshotRecordArray.adapterOptions.subscribe) {\n            // ...\n          }\n          // ...\n        }\n      }\n      ```\n       See [peekAll](../methods/peekAll?anchor=peekAll) to get an array of current records in the\n      store, without waiting until a reload is finished.\n       ### Retrieving Related Model Records\n       If you use an adapter such as Ember's default\n      [`JSONAPIAdapter`](/ember-data/release/classes/JSONAPIAdapter)\n      that supports the [JSON API specification](http://jsonapi.org/) and if your server\n      endpoint supports the use of an\n      ['include' query parameter](http://jsonapi.org/format/#fetching-includes),\n      you can use `findAll()` to automatically retrieve additional records related to\n      those requested by supplying an `include` parameter in the `options` object.\n       For example, given a `post` model that has a `hasMany` relationship with a `comment`\n      model, when we retrieve all of the post records we can have the server also return\n      all of the posts' comments in the same request:\n       ```app/routes/posts.js\n      import Route from '@ember/routing/route';\n       export default class PostsRoute extends Route {\n        model() {\n          return this.store.findAll('post', { include: 'comments' });\n        }\n      }\n      ```\n      Multiple relationships can be requested using an `include` parameter consisting of a\n      comma-separated list (without white-space) while nested relationships can be specified\n      using a dot-separated sequence of relationship names. So to request both the posts'\n      comments and the authors of those comments the request would look like this:\n       ```app/routes/posts.js\n      import Route from '@ember/routing/route';\n       export default class PostsRoute extends Route {\n        model() {\n          return this.store.findAll('post', { include: 'comments,comments.author' });\n        }\n      }\n      ```\n       See [query](../methods/query?anchor=query) to only get a subset of records from the server.\n       @since 1.13.0\n      @method findAll\n      @public\n      @param {String} modelName\n      @param {Object} options\n      @return {Promise} promise\n    */\n    findAll(modelName, options) {\n      if (options === void 0) {\n        options = {};\n      }\n      if (runtime.macroCondition(true)) {\n        assertDestroyingStore(this, 'findAll');\n      }\n      (!(modelName) && debug.assert(`You need to pass a model name to the store's findAll method`, modelName));\n      (!(typeof modelName === 'string') && debug.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n      let normalizedModelName = normalizeModelName$1(modelName);\n      let array = this.peekAll(normalizedModelName);\n      let fetch;\n      let adapter = this.adapterFor(normalizedModelName);\n      (!(adapter) && debug.assert(`You tried to load all records but you have no adapter (for ${normalizedModelName})`, adapter));\n      (!(typeof adapter.findAll === 'function') && debug.assert(`You tried to load all records but your adapter does not implement 'findAll'`, typeof adapter.findAll === 'function'));\n      if (options.reload) {\n        array.isUpdating = true;\n        fetch = _findAll(adapter, this, normalizedModelName, options);\n      } else {\n        let snapshotArray = new SnapshotRecordArray(this, array, options);\n        if (options.reload !== false) {\n          if (adapter.shouldReloadAll && adapter.shouldReloadAll(this, snapshotArray) || !adapter.shouldReloadAll && snapshotArray.length === 0) {\n            array.isUpdating = true;\n            fetch = _findAll(adapter, this, modelName, options, snapshotArray);\n          }\n        }\n        if (!fetch) {\n          if (options.backgroundReload === false) {\n            fetch = RSVP.resolve(array);\n          } else if (options.backgroundReload || !adapter.shouldBackgroundReloadAll || adapter.shouldBackgroundReloadAll(this, snapshotArray)) {\n            array.isUpdating = true;\n            _findAll(adapter, this, modelName, options, snapshotArray);\n          }\n          fetch = RSVP.resolve(array);\n        }\n      }\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_PROMISE_PROXIES)) {\n        return promiseArray(fetch);\n      }\n      return fetch;\n    }\n\n    /**\n      This method returns a filtered array that contains all of the\n      known records for a given type in the store.\n       Note that because it's just a filter, the result will contain any\n      locally created records of the type, however, it will not make a\n      request to the backend to retrieve additional records. If you\n      would like to request all the records from the backend please use\n      [store.findAll](../methods/findAll?anchor=findAll).\n       Also note that multiple calls to `peekAll` for a given type will always\n      return the same `RecordArray`.\n       Example\n       ```javascript\n      let localPosts = store.peekAll('post');\n      ```\n       @since 1.13.0\n      @method peekAll\n      @public\n      @param {String} modelName\n      @return {RecordArray}\n    */\n    peekAll(modelName) {\n      if (runtime.macroCondition(true)) {\n        assertDestroyingStore(this, 'peekAll');\n      }\n      (!(modelName) && debug.assert(`You need to pass a model name to the store's peekAll method`, modelName));\n      (!(typeof modelName === 'string') && debug.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n      let type = normalizeModelName$1(modelName);\n      return this.recordArrayManager.liveArrayFor(type);\n    }\n\n    /**\n      This method unloads all records in the store.\n      It schedules unloading to happen during the next run loop.\n       Optionally you can pass a type which unload all records for a given type.\n       ```javascript\n      store.unloadAll();\n      store.unloadAll('post');\n      ```\n       @method unloadAll\n      @public\n      @param {String} modelName\n    */\n    unloadAll(modelName) {\n      if (runtime.macroCondition(true)) {\n        assertDestroyedStoreOnly(this, 'unloadAll');\n      }\n      (!(!modelName || typeof modelName === 'string') && debug.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, !modelName || typeof modelName === 'string'));\n      this._join(() => {\n        if (modelName === undefined) {\n          // destroy the graph before unloadAll\n          // since then we avoid churning relationships\n          // during unload\n          if (runtime.macroCondition(true)) {\n            const peekGraph = esc__default.default(require('@ember-data/record-data/-private')).peekGraph;\n            let graph = peekGraph(this);\n            if (graph) {\n              graph.identifiers.clear();\n            }\n          }\n          this._notificationManager.destroy();\n          this.recordArrayManager.clear();\n          this._instanceCache.clear();\n        } else {\n          let normalizedModelName = normalizeModelName$1(modelName);\n          this._instanceCache.clear(normalizedModelName);\n        }\n      });\n    }\n\n    /**\n      Push some data for a given type into the store.\n       This method expects normalized [JSON API](http://jsonapi.org/) document. This means you have to follow [JSON API specification](http://jsonapi.org/format/) with few minor adjustments:\n      - record's `type` should always be in singular, dasherized form\n      - members (properties) should be camelCased\n       [Your primary data should be wrapped inside `data` property](http://jsonapi.org/format/#document-top-level):\n       ```js\n      store.push({\n        data: {\n          // primary data for single record of type `Person`\n          id: '1',\n          type: 'person',\n          attributes: {\n            firstName: 'Daniel',\n            lastName: 'Kmak'\n          }\n        }\n      });\n      ```\n       [Demo.](http://ember-twiddle.com/fb99f18cd3b4d3e2a4c7)\n       `data` property can also hold an array (of records):\n       ```js\n      store.push({\n        data: [\n          // an array of records\n          {\n            id: '1',\n            type: 'person',\n            attributes: {\n              firstName: 'Daniel',\n              lastName: 'Kmak'\n            }\n          },\n          {\n            id: '2',\n            type: 'person',\n            attributes: {\n              firstName: 'Tom',\n              lastName: 'Dale'\n            }\n          }\n        ]\n      });\n      ```\n       [Demo.](http://ember-twiddle.com/69cdbeaa3702159dc355)\n       There are some typical properties for `JSONAPI` payload:\n      * `id` - mandatory, unique record's key\n      * `type` - mandatory string which matches `model`'s dasherized name in singular form\n      * `attributes` - object which holds data for record attributes - `attr`'s declared in model\n      * `relationships` - object which must contain any of the following properties under each relationships' respective key (example path is `relationships.achievements.data`):\n        - [`links`](http://jsonapi.org/format/#document-links)\n        - [`data`](http://jsonapi.org/format/#document-resource-object-linkage) - place for primary data\n        - [`meta`](http://jsonapi.org/format/#document-meta) - object which contains meta-information about relationship\n       For this model:\n       ```app/models/person.js\n      import Model, { attr, hasMany } from '@ember-data/model';\n       export default class PersonRoute extends Route {\n        @attr('string') firstName;\n        @attr('string') lastName;\n         @hasMany('person') children;\n      }\n      ```\n       To represent the children as IDs:\n       ```js\n      {\n        data: {\n          id: '1',\n          type: 'person',\n          attributes: {\n            firstName: 'Tom',\n            lastName: 'Dale'\n          },\n          relationships: {\n            children: {\n              data: [\n                {\n                  id: '2',\n                  type: 'person'\n                },\n                {\n                  id: '3',\n                  type: 'person'\n                },\n                {\n                  id: '4',\n                  type: 'person'\n                }\n              ]\n            }\n          }\n        }\n      }\n      ```\n       [Demo.](http://ember-twiddle.com/343e1735e034091f5bde)\n       To represent the children relationship as a URL:\n       ```js\n      {\n        data: {\n          id: '1',\n          type: 'person',\n          attributes: {\n            firstName: 'Tom',\n            lastName: 'Dale'\n          },\n          relationships: {\n            children: {\n              links: {\n                related: '/people/1/children'\n              }\n            }\n          }\n        }\n      }\n      ```\n       If you're streaming data or implementing an adapter, make sure\n      that you have converted the incoming data into this form. The\n      store's [normalize](../methods/normalize?anchor=normalize) method is a convenience\n      helper for converting a json payload into the form Ember Data\n      expects.\n       ```js\n      store.push(store.normalize('person', data));\n      ```\n       This method can be used both to push in brand new\n      records, as well as to update existing records.\n       @method push\n      @public\n      @param {Object} data\n      @return the record(s) that was created or\n        updated.\n    */\n\n    push(data) {\n      if (runtime.macroCondition(true)) {\n        assertDestroyingStore(this, 'push');\n      }\n      let pushed = this._push(data);\n      if (Array.isArray(pushed)) {\n        let records = pushed.map(identifier => this._instanceCache.getRecord(identifier));\n        return records;\n      }\n      if (pushed === null) {\n        return null;\n      }\n      return this._instanceCache.getRecord(pushed);\n    }\n\n    /**\n      Push some data in the form of a json-api document into the store,\n      without creating materialized records.\n       @method _push\n      @private\n      @param {Object} jsonApiDoc\n      @return {StableRecordIdentifier|Array<StableRecordIdentifier>} identifiers for the primary records that had data loaded\n    */\n    _push(jsonApiDoc) {\n      if (runtime.macroCondition(true)) {\n        assertDestroyingStore(this, '_push');\n      }\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").debug.LOG_PAYLOADS)) {\n        try {\n          let data = JSON.parse(JSON.stringify(jsonApiDoc));\n          // eslint-disable-next-line no-console\n          console.log('EmberData | Payload - push', data);\n        } catch (e) {\n          // eslint-disable-next-line no-console\n          console.log('EmberData | Payload - push', jsonApiDoc);\n        }\n      }\n      let ret;\n      this._join(() => {\n        let included = jsonApiDoc.included;\n        let i, length;\n        if (included) {\n          for (i = 0, length = included.length; i < length; i++) {\n            this._instanceCache.loadData(included[i]);\n          }\n        }\n        if (Array.isArray(jsonApiDoc.data)) {\n          length = jsonApiDoc.data.length;\n          let identifiers = new Array(length);\n          for (i = 0; i < length; i++) {\n            identifiers[i] = this._instanceCache.loadData(jsonApiDoc.data[i]);\n          }\n          ret = identifiers;\n          return;\n        }\n        if (jsonApiDoc.data === null) {\n          ret = null;\n          return;\n        }\n        (!(typeof jsonApiDoc.data === 'object') && debug.assert(`Expected an object in the 'data' property in a call to 'push' for ${jsonApiDoc.type}, but was ${typeof jsonApiDoc.data}`, typeof jsonApiDoc.data === 'object'));\n        ret = this._instanceCache.loadData(jsonApiDoc.data);\n        return;\n      });\n      return ret;\n    }\n\n    /**\n      Push some raw data into the store.\n       This method can be used both to push in brand new\n      records, as well as to update existing records. You\n      can push in more than one type of object at once.\n      All objects should be in the format expected by the\n      serializer.\n       ```app/serializers/application.js\n      import RESTSerializer from '@ember-data/serializer/rest';\n       export default class ApplicationSerializer extends RESTSerializer;\n      ```\n       ```js\n      let pushData = {\n        posts: [\n          { id: 1, postTitle: \"Great post\", commentIds: [2] }\n        ],\n        comments: [\n          { id: 2, commentBody: \"Insightful comment\" }\n        ]\n      }\n       store.pushPayload(pushData);\n      ```\n       By default, the data will be deserialized using a default\n      serializer (the application serializer if it exists).\n       Alternatively, `pushPayload` will accept a model type which\n      will determine which serializer will process the payload.\n       ```app/serializers/application.js\n      import RESTSerializer from '@ember-data/serializer/rest';\n        export default class ApplicationSerializer extends RESTSerializer;\n      ```\n       ```app/serializers/post.js\n      import JSONSerializer from '@ember-data/serializer/json';\n       export default JSONSerializer;\n      ```\n       ```js\n      store.pushPayload(pushData); // Will use the application serializer\n      store.pushPayload('post', pushData); // Will use the post serializer\n      ```\n       @method pushPayload\n      @public\n      @param {String} modelName Optionally, a model type used to determine which serializer will be used\n      @param {Object} inputPayload\n    */\n    // TODO @runspired @deprecate pushPayload in favor of looking up the serializer\n    pushPayload(modelName, inputPayload) {\n      if (runtime.macroCondition(true)) {\n        assertDestroyingStore(this, 'pushPayload');\n      }\n      let serializer;\n      let payload;\n      if (!inputPayload) {\n        payload = modelName;\n        serializer = this.serializerFor('application');\n        (!(typeof serializer.pushPayload === 'function') && debug.assert(`You cannot use 'store#pushPayload' without a modelName unless your default serializer defines 'pushPayload'`, typeof serializer.pushPayload === 'function'));\n      } else {\n        payload = inputPayload;\n        (!(typeof modelName === 'string') && debug.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n        let normalizedModelName = normalizeModelName$1(modelName);\n        serializer = this.serializerFor(normalizedModelName);\n      }\n      (!(serializer.pushPayload) && debug.assert(`You must define a pushPayload method in your serializer in order to call store.pushPayload`, serializer.pushPayload));\n      serializer.pushPayload(this, payload);\n    }\n\n    // TODO @runspired @deprecate records should implement their own serialization if desired\n    serializeRecord(record, options) {\n      // TODO we used to check if the record was destroyed here\n      return this._instanceCache.createSnapshot(recordIdentifierFor(record)).serialize(options);\n    }\n\n    /**\n     * Trigger a save for a Record.\n     *\n     * @method saveRecord\n     * @public\n     * @param {RecordInstance} record\n     * @param options\n     * @returns {Promise<RecordInstance>}\n     */\n    saveRecord(record, options) {\n      if (options === void 0) {\n        options = {};\n      }\n      (!(storeFor(record)) && debug.assert(`Unable to initate save for a record in a disconnected state`, storeFor(record)));\n      let identifier = recordIdentifierFor(record);\n      let recordData = identifier && this._instanceCache.peek({\n        identifier,\n        bucket: 'recordData'\n      });\n      if (!recordData) {\n        // this commonly means we're disconnected\n        // but just in case we reject here to prevent bad things.\n        return RSVP.reject(`Record Is Disconnected`);\n      }\n      // TODO we used to check if the record was destroyed here\n      (!(recordData && this._instanceCache.recordIsLoaded(identifier)) && debug.assert(`Cannot initiate a save request for an unloaded record: ${identifier}`, recordData && this._instanceCache.recordIsLoaded(identifier)));\n      if (recordDataIsFullyDeleted(this._instanceCache, identifier)) {\n        return RSVP.resolve(record);\n      }\n      recordData.willCommit(identifier);\n      if (isDSModel(record)) {\n        record.errors.clear();\n      }\n      if (!options) {\n        options = {};\n      }\n      let operation = 'updateRecord';\n      if (recordData.isNew(identifier)) {\n        operation = 'createRecord';\n      } else if (recordData.isDeleted(identifier)) {\n        operation = 'deleteRecord';\n      }\n      const saveOptions = Object.assign({\n        [SaveOp]: operation\n      }, options);\n      let fetchManagerPromise = this._fetchManager.scheduleSave(identifier, saveOptions);\n      return fetchManagerPromise.then(payload => {\n        if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").debug.LOG_PAYLOADS)) {\n          try {\n            let data = payload ? JSON.parse(JSON.stringify(payload)) : payload;\n            // eslint-disable-next-line no-console\n            console.log(`EmberData | Payload - ${operation}`, data);\n          } catch (e) {\n            // eslint-disable-next-line no-console\n            console.log(`EmberData | Payload - ${operation}`, payload);\n          }\n        }\n        /*\n        // TODO @runspired re-evaluate the below claim now that\n        // the save request pipeline is more streamlined.\n         Note to future spelunkers hoping to optimize.\n        We rely on this `run` to create a run loop if needed\n        that `store._push` and `store.saveRecord` will both share.\n         We use `join` because it is often the case that we\n        have an outer run loop available still from the first\n        call to `store._push`;\n        */\n        this._join(() => {\n          if (runtime.macroCondition(true)) {\n            assertDestroyingStore(this, 'saveRecord');\n          }\n          let data = payload && payload.data;\n          if (!data) {\n            (!(identifier.id) && debug.assert(`Your ${identifier.type} record was saved to the server, but the response does not have an id and no id has been set client side. Records must have ids. Please update the server response to provide an id in the response or generate the id on the client side either before saving the record or while normalizing the response.`, identifier.id));\n          }\n          const cache = this.identifierCache;\n          let actualIdentifier = identifier;\n          if (operation !== 'deleteRecord' && data) {\n            actualIdentifier = cache.updateRecordIdentifier(identifier, data);\n          }\n\n          //We first make sure the primary data has been updated\n          const recordData = this._instanceCache.getRecordData(actualIdentifier);\n          recordData.didCommit(identifier, data);\n          if (operation === 'deleteRecord') {\n            this.recordArrayManager.identifierRemoved(actualIdentifier);\n          }\n          if (payload && payload.included) {\n            this._push({\n              data: null,\n              included: payload.included\n            });\n          }\n        });\n        return record;\n      }, e => {\n        let err = e;\n        if (!e) {\n          err = new Error(`Unknown Error Occurred During Request`);\n        } else if (typeof e === 'string') {\n          err = new Error(e);\n        }\n        adapterDidInvalidate(this, identifier, err);\n        throw err;\n      });\n    }\n\n    /**\n     * Instantiation hook allowing applications or addons to configure the store\n     * to utilize a custom RecordData implementation.\n     *\n     * @method createRecordDataFor (hook)\n     * @public\n     * @param identifier\n     * @param storeWrapper\n     */\n    createRecordDataFor(identifier, storeWrapper) {\n      if (runtime.macroCondition(true)) {\n        // we can't greedily use require as this causes\n        // a cycle we can't easily fix (or clearly pin point) at present.\n        //\n        // it can be reproduced in partner tests by running\n        // node ./scripts/packages-for-commit.js && pnpm test-external:ember-observer\n        if (_RecordData === undefined) {\n          _RecordData = esc__default.default(require('@ember-data/record-data/-private')).RecordData;\n        }\n        if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_V1CACHE_STORE_APIS)) {\n          if (arguments.length === 4) {\n            (debug.deprecate(`Store.createRecordDataFor(<type>, <id>, <lid>, <storeWrapper>) has been deprecated in favor of Store.createRecordDataFor(<identifier>, <storeWrapper>)`, false, {\n              id: 'ember-data:deprecate-v1cache-store-apis',\n              for: 'ember-data',\n              until: '5.0',\n              since: {\n                enabled: '4.7',\n                available: '4.7'\n              }\n            }));\n            identifier = this.identifierCache.getOrCreateRecordIdentifier({\n              type: arguments[0],\n              id: arguments[1],\n              lid: arguments[2]\n            });\n            storeWrapper = arguments[3];\n          }\n        }\n        this.__private_singleton_recordData = this.__private_singleton_recordData || new _RecordData(storeWrapper);\n        this.__private_singleton_recordData.createCache(identifier);\n        return this.__private_singleton_recordData;\n      }\n      (debug.assert(`Expected store.createRecordDataFor to be implemented but it wasn't`));\n    }\n\n    /**\n      `normalize` converts a json payload into the normalized form that\n      [push](../methods/push?anchor=push) expects.\n       Example\n       ```js\n      socket.on('message', function(message) {\n        let modelName = message.model;\n        let data = message.data;\n        store.push(store.normalize(modelName, data));\n      });\n      ```\n       @method normalize\n      @public\n      @param {String} modelName The name of the model type for this payload\n      @param {Object} payload\n      @return {Object} The normalized payload\n    */\n    // TODO @runspired @deprecate users should call normalize on the associated serializer directly\n    normalize(modelName, payload) {\n      if (runtime.macroCondition(true)) {\n        assertDestroyingStore(this, 'normalize');\n      }\n      (!(modelName) && debug.assert(`You need to pass a model name to the store's normalize method`, modelName));\n      (!(typeof modelName === 'string') && debug.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${typeof modelName}`, typeof modelName === 'string'));\n      let normalizedModelName = normalizeModelName$1(modelName);\n      let serializer = this.serializerFor(normalizedModelName);\n      let model = this.modelFor(normalizedModelName);\n      (!(serializer?.normalize) && debug.assert(`You must define a normalize method in your serializer in order to call store.normalize`, serializer?.normalize));\n      return serializer.normalize(model, payload);\n    }\n\n    /**\n      Returns an instance of the adapter for a given type. For\n      example, `adapterFor('person')` will return an instance of\n      the adapter located at `app/adapters/person.js`\n       If no `person` adapter is found, this method will look\n      for an `application` adapter (the default adapter for\n      your entire application).\n       @method adapterFor\n      @public\n      @param {String} modelName\n      @return Adapter\n    */\n    adapterFor(modelName) {\n      if (runtime.macroCondition(true)) {\n        assertDestroyingStore(this, 'adapterFor');\n      }\n      (!(modelName) && debug.assert(`You need to pass a model name to the store's adapterFor method`, modelName));\n      (!(typeof modelName === 'string') && debug.assert(`Passing classes to store.adapterFor has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n      let normalizedModelName = normalizeModelName$1(modelName);\n      let {\n        _adapterCache\n      } = this;\n      let adapter = _adapterCache[normalizedModelName];\n      if (adapter) {\n        return adapter;\n      }\n      let owner = application.getOwner(this);\n\n      // name specific adapter\n      adapter = owner.lookup(`adapter:${normalizedModelName}`);\n      if (adapter !== undefined) {\n        _adapterCache[normalizedModelName] = adapter;\n        return adapter;\n      }\n\n      // no adapter found for the specific name, fallback and check for application adapter\n      adapter = _adapterCache.application || owner.lookup('adapter:application');\n      if (adapter !== undefined) {\n        _adapterCache[normalizedModelName] = adapter;\n        _adapterCache.application = adapter;\n        return adapter;\n      }\n      if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_JSON_API_FALLBACK)) {\n        // final fallback, no model specific adapter, no application adapter, no\n        // `adapter` property on store: use json-api adapter\n        adapter = _adapterCache['-json-api'] || owner.lookup('adapter:-json-api');\n        if (adapter !== undefined) {\n          (debug.deprecate(`Your application is utilizing a deprecated hidden fallback adapter (-json-api). Please implement an application adapter to function as your fallback.`, false, {\n            id: 'ember-data:deprecate-secret-adapter-fallback',\n            for: 'ember-data',\n            until: '5.0',\n            since: {\n              available: '4.5',\n              enabled: '4.5'\n            }\n          }));\n          _adapterCache[normalizedModelName] = adapter;\n          _adapterCache['-json-api'] = adapter;\n          return adapter;\n        }\n      }\n      (debug.assert(`No adapter was found for '${modelName}' and no 'application' adapter was found as a fallback.`));\n    }\n\n    /**\n      Returns an instance of the serializer for a given type. For\n      example, `serializerFor('person')` will return an instance of\n      `App.PersonSerializer`.\n       If no `App.PersonSerializer` is found, this method will look\n      for an `App.ApplicationSerializer` (the default serializer for\n      your entire application).\n       If a serializer cannot be found on the adapter, it will fall back\n      to an instance of `JSONSerializer`.\n       @method serializerFor\n      @public\n      @param {String} modelName the record to serialize\n      @return {Serializer}\n    */\n    serializerFor(modelName) {\n      if (runtime.macroCondition(true)) {\n        assertDestroyingStore(this, 'serializerFor');\n      }\n      (!(modelName) && debug.assert(`You need to pass a model name to the store's serializerFor method`, modelName));\n      (!(typeof modelName === 'string') && debug.assert(`Passing classes to store.serializerFor has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n      let normalizedModelName = normalizeModelName$1(modelName);\n      let {\n        _serializerCache\n      } = this;\n      let serializer = _serializerCache[normalizedModelName];\n      if (serializer) {\n        return serializer;\n      }\n      let owner = application.getOwner(this);\n\n      // by name\n      serializer = owner.lookup(`serializer:${normalizedModelName}`);\n      if (serializer !== undefined) {\n        _serializerCache[normalizedModelName] = serializer;\n        return serializer;\n      }\n\n      // no serializer found for the specific model, fallback and check for application serializer\n      serializer = _serializerCache.application || owner.lookup('serializer:application');\n      if (serializer !== undefined) {\n        _serializerCache[normalizedModelName] = serializer;\n        _serializerCache.application = serializer;\n        return serializer;\n      }\n      return null;\n    }\n    destroy() {\n      // enqueue destruction of any adapters/serializers we have created\n      for (let adapterName in this._adapterCache) {\n        let adapter = this._adapterCache[adapterName];\n        if (typeof adapter.destroy === 'function') {\n          adapter.destroy();\n        }\n      }\n      for (let serializerName in this._serializerCache) {\n        let serializer = this._serializerCache[serializerName];\n        if (typeof serializer.destroy === 'function') {\n          serializer.destroy();\n        }\n      }\n      if (runtime.macroCondition(true)) {\n        const peekGraph = esc__default.default(require('@ember-data/record-data/-private')).peekGraph;\n        let graph = peekGraph(this);\n        if (graph) {\n          graph.destroy();\n        }\n      }\n      return super.destroy();\n    }\n    willDestroy() {\n      super.willDestroy();\n      this.recordArrayManager.destroy();\n      this.identifierCache.destroy();\n      this.unloadAll();\n      if (runtime.macroCondition(true)) {\n        test.unregisterWaiter(this.__asyncWaiter);\n        let tracked = this._trackedAsyncRequests;\n        let isSettled = tracked.length === 0;\n        if (!isSettled) {\n          throw new Error('Async Request leaks detected. Add a breakpoint here and set `store.generateStackTracesForTrackedRequests = true;`to inspect traces for leak origins:\\n\\t - ' + tracked.map(o => o.label).join('\\n\\t - '));\n        }\n      }\n    }\n  }\n  let assertDestroyingStore;\n  let assertDestroyedStoreOnly;\n  if (runtime.macroCondition(true)) {\n    assertDestroyingStore = function assertDestroyedStore(store, method) {\n      (!(!(store.isDestroying || store.isDestroyed)) && debug.assert(`Attempted to call store.${method}(), but the store instance has already been destroyed.`, !(store.isDestroying || store.isDestroyed)));\n    };\n    assertDestroyedStoreOnly = function assertDestroyedStoreOnly(store, method) {\n      (!(!store.isDestroyed) && debug.assert(`Attempted to call store.${method}(), but the store instance has already been destroyed.`, !store.isDestroyed));\n    };\n  }\n  function isMaybeIdentifier(maybeIdentifier) {\n    return Boolean(maybeIdentifier !== null && typeof maybeIdentifier === 'object' && ('id' in maybeIdentifier && 'type' in maybeIdentifier && maybeIdentifier.id && maybeIdentifier.type || maybeIdentifier.lid));\n  }\n  function assertIdentifierHasId(identifier) {\n    (!(identifier.id !== null) && debug.assert(`Attempted to schedule a fetch for a record without an id.`, identifier.id !== null));\n  }\n  function isDSModel(record) {\n    if (runtime.macroCondition(!true)) {\n      return false;\n    }\n    return !!record && 'constructor' in record && 'isModel' in record.constructor && record.constructor.isModel === true;\n  }\n  function adapterDidInvalidate(store, identifier, error) {\n    if (error && error.isAdapterError === true && error.code === 'InvalidError') {\n      let serializer = store.serializerFor(identifier.type);\n\n      // TODO @deprecate extractErrors being called\n      // TODO remove extractErrors from the default serializers.\n      if (serializer && typeof serializer.extractErrors === 'function') {\n        let errorsHash = serializer.extractErrors(store, store.modelFor(identifier.type), error, identifier.id);\n        error.errors = errorsHashToArray(errorsHash);\n      }\n    }\n    const recordData = store._instanceCache.getRecordData(identifier);\n    if (error.errors) {\n      (!(typeof recordData.getErrors === 'function') && debug.assert(`Expected the RecordData implementation for ${identifier} to have a getErrors(identifier) method for retreiving errors.`, typeof recordData.getErrors === 'function'));\n      let jsonApiErrors = error.errors;\n      if (jsonApiErrors.length === 0) {\n        jsonApiErrors = [{\n          title: 'Invalid Error',\n          detail: '',\n          source: {\n            pointer: '/data'\n          }\n        }];\n      }\n      recordData.commitWasRejected(identifier, jsonApiErrors);\n    } else {\n      recordData.commitWasRejected(identifier);\n    }\n  }\n  function makeArray(value) {\n    return Array.isArray(value) ? value : [value];\n  }\n  const PRIMARY_ATTRIBUTE_KEY = 'base';\n  function errorsHashToArray(errors) {\n    const out = [];\n    if (errors) {\n      Object.keys(errors).forEach(key => {\n        let messages = makeArray(errors[key]);\n        for (let i = 0; i < messages.length; i++) {\n          let title = 'Invalid Attribute';\n          let pointer = `/data/attributes/${key}`;\n          if (key === PRIMARY_ATTRIBUTE_KEY) {\n            title = 'Invalid Document';\n            pointer = `/data`;\n          }\n          out.push({\n            title: title,\n            detail: messages[i],\n            source: {\n              pointer: pointer\n            }\n          });\n        }\n      });\n    }\n    return out;\n  }\n  function normalizeProperties(store, identifier, properties, isForV1) {\n    if (isForV1 === void 0) {\n      isForV1 = false;\n    }\n    // assert here\n    if (properties !== undefined) {\n      if ('id' in properties) {\n        (!(properties.id !== undefined) && debug.assert(`expected id to be a string or null`, properties.id !== undefined));\n      }\n      (!(typeof properties === 'object' && properties !== null) && debug.assert(`You passed '${typeof properties}' as properties for record creation instead of an object.`, typeof properties === 'object' && properties !== null));\n      const {\n        type\n      } = identifier;\n\n      // convert relationship Records to RecordDatas before passing to RecordData\n      let defs = store.getSchemaDefinitionService().relationshipsDefinitionFor({\n        type\n      });\n      if (defs !== null) {\n        let keys = Object.keys(properties);\n        let relationshipValue;\n        for (let i = 0; i < keys.length; i++) {\n          let prop = keys[i];\n          let def = defs[prop];\n          if (def !== undefined) {\n            if (def.kind === 'hasMany') {\n              if (runtime.macroCondition(true)) {\n                assertRecordsPassedToHasMany(properties[prop]);\n              }\n              relationshipValue = extractIdentifiersFromRecords(properties[prop], isForV1);\n            } else {\n              relationshipValue = extractIdentifierFromRecord(properties[prop], isForV1);\n            }\n            properties[prop] = relationshipValue;\n          }\n        }\n      }\n    }\n    return properties;\n  }\n  function assertRecordsPassedToHasMany(records) {\n    (!(Array.isArray(records)) && debug.assert(`You must pass an array of records to set a hasMany relationship`, Array.isArray(records)));\n    (!(function () {\n      return records.every(record => {\n        try {\n          recordIdentifierFor(record);\n          return true;\n        } catch {\n          return false;\n        }\n      });\n    }()) && debug.assert(`All elements of a hasMany relationship must be instances of Model, you passed ${records.map(r => `${typeof r}`).join(', ')}`, function () {\n      return records.every(record => {\n        try {\n          recordIdentifierFor(record);\n          return true;\n        } catch {\n          return false;\n        }\n      });\n    }()));\n  }\n  function extractIdentifiersFromRecords(records, isForV1) {\n    if (isForV1 === void 0) {\n      isForV1 = false;\n    }\n    return records.map(record => extractIdentifierFromRecord(record, isForV1));\n  }\n  function extractIdentifierFromRecord(recordOrPromiseRecord, isForV1) {\n    if (isForV1 === void 0) {\n      isForV1 = false;\n    }\n    if (!recordOrPromiseRecord) {\n      return null;\n    }\n    const extract = isForV1 ? recordDataFor : recordIdentifierFor;\n    if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_PROMISE_PROXIES)) {\n      if (isPromiseRecord(recordOrPromiseRecord)) {\n        let content = recordOrPromiseRecord.content;\n        (!(content !== undefined) && debug.assert('You passed in a promise that did not originate from an EmberData relationship. You can only pass promises that come from a belongsTo or hasMany relationship to the get call.', content !== undefined));\n        (debug.deprecate(`You passed in a PromiseProxy to a Relationship API that now expects a resolved value. await the value before setting it.`, false, {\n          id: 'ember-data:deprecate-promise-proxies',\n          until: '5.0',\n          since: {\n            enabled: '4.7',\n            available: '4.7'\n          },\n          for: 'ember-data'\n        }));\n        return content ? extract(content) : null;\n      }\n    }\n    return extract(recordOrPromiseRecord);\n  }\n  function isPromiseRecord(record) {\n    return !!record.then;\n  }\n  function secretInit(record, recordData, identifier, store) {\n    setRecordIdentifier(record, identifier);\n    StoreMap.set(record, store);\n    setRecordDataFor(record, recordData);\n  }\n\n  function normalizeModelName(modelName) {\n    if (runtime.macroCondition(runtime.config(\"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\").deprecations.DEPRECATE_HELPERS)) {\n      (debug.deprecate(`the helper function normalizeModelName is deprecated. You should use model names that are already normalized, or use string helpers of your own. This function is primarily an alias for dasherize from @ember/string.`, false, {\n        id: 'ember-data:deprecate-normalize-modelname-helper',\n        for: 'ember-data',\n        until: '5.0',\n        since: {\n          available: '4.7',\n          enabled: '4.7'\n        }\n      }));\n      return normalizeModelName$1(modelName);\n    }\n    (debug.assert(`normalizeModelName support has been removed`));\n  }\n\n  exports.AdapterPopulatedRecordArray = Collection;\n  exports.IDENTIFIER_ARRAY_TAG = IDENTIFIER_ARRAY_TAG;\n  exports.IdentifierArray = IdentifierArray;\n  exports.MUTATE = MUTATE;\n  exports.RecordArray = IdentifierArray;\n  exports.RecordArrayManager = RecordArrayManager;\n  exports.SOURCE = SOURCE;\n  exports.Snapshot = Snapshot;\n  exports.SnapshotRecordArray = SnapshotRecordArray;\n  exports.Store = Store;\n  exports._clearCaches = _clearCaches;\n  exports.coerceId = coerceId;\n  exports.fastPush = fastPush;\n  exports.isStableIdentifier = isStableIdentifier;\n  exports.normalizeModelName = normalizeModelName;\n  exports.notifyArray = notifyArray;\n  exports.recordDataFor = recordDataFor;\n  exports.recordIdentifierFor = recordIdentifierFor;\n  exports.removeRecordDataFor = removeRecordDataFor;\n  exports.setIdentifierForgetMethod = setIdentifierForgetMethod;\n  exports.setIdentifierGenerationMethod = setIdentifierGenerationMethod;\n  exports.setIdentifierResetMethod = setIdentifierResetMethod;\n  exports.setIdentifierUpdateMethod = setIdentifierUpdateMethod;\n  exports.storeFor = storeFor;\n\n  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });\n\n}));\n","define(\"@ember-data/store/index\", [\"exports\", \"@ember-data/store/-private\"], function (_exports, _private) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _private.Store;\n    }\n  });\n  Object.defineProperty(_exports, \"normalizeModelName\", {\n    enumerable: true,\n    get: function () {\n      return _private.normalizeModelName;\n    }\n  });\n  Object.defineProperty(_exports, \"recordIdentifierFor\", {\n    enumerable: true,\n    get: function () {\n      return _private.recordIdentifierFor;\n    }\n  });\n  Object.defineProperty(_exports, \"setIdentifierForgetMethod\", {\n    enumerable: true,\n    get: function () {\n      return _private.setIdentifierForgetMethod;\n    }\n  });\n  Object.defineProperty(_exports, \"setIdentifierGenerationMethod\", {\n    enumerable: true,\n    get: function () {\n      return _private.setIdentifierGenerationMethod;\n    }\n  });\n  Object.defineProperty(_exports, \"setIdentifierResetMethod\", {\n    enumerable: true,\n    get: function () {\n      return _private.setIdentifierResetMethod;\n    }\n  });\n  Object.defineProperty(_exports, \"setIdentifierUpdateMethod\", {\n    enumerable: true,\n    get: function () {\n      return _private.setIdentifierUpdateMethod;\n    }\n  });\n  Object.defineProperty(_exports, \"storeFor\", {\n    enumerable: true,\n    get: function () {\n      return _private.storeFor;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/store/-private\"eaimeta@70e063a35619d71f\n  /**\n    @module @ember-data/store\n  */\n});","define(\"@ember-data/tracking/-private\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.addToTransaction = addToTransaction;\n  _exports.addTransactionCB = addTransactionCB;\n  _exports.memoTransact = memoTransact;\n  _exports.subscribe = subscribe;\n  _exports.transact = transact;\n  _exports.untracked = untracked;\n  /**\n   * This package provides primitives that allow powerful low-level\n   * adjustments to change tracking notification behaviors.\n   *\n   * Typically you want to use these primitives when you want to divorce\n   * property accesses on EmberData provided objects from the current\n   * tracking context. Typically this sort of thing occurs when serializing\n   * tracked data to send in a request: the data itself is often ancillary\n   * to the thing which triggered the request in the first place and you\n   * would not want to re-trigger the request for any update to the data.\n   *\n   * @module @ember-data/tracking\n   * @main @ember-data/tracking\n   */\n\n  let TRANSACTION = null;\n  function createTransaction() {\n    let transaction = {\n      cbs: new Set(),\n      props: new Set(),\n      sub: new Set(),\n      parent: null\n    };\n    if (TRANSACTION) {\n      transaction.parent = TRANSACTION;\n    }\n    TRANSACTION = transaction;\n  }\n  function subscribe(obj) {\n    if (TRANSACTION) {\n      TRANSACTION.sub.add(obj);\n    } else {\n      obj.ref;\n    }\n  }\n  function flushTransaction() {\n    let transaction = TRANSACTION;\n    TRANSACTION = transaction.parent;\n    transaction.cbs.forEach(cb => {\n      cb();\n    });\n    transaction.props.forEach(obj => {\n      // mark this mutation as part of a transaction\n      obj.t = true;\n      obj.ref = null;\n    });\n    transaction.sub.forEach(obj => {\n      obj.ref;\n    });\n  }\n  async function untrack() {\n    let transaction = TRANSACTION;\n    TRANSACTION = transaction.parent;\n\n    // defer writes\n    await Promise.resolve();\n    transaction.cbs.forEach(cb => {\n      cb();\n    });\n    transaction.props.forEach(obj => {\n      // mark this mutation as part of a transaction\n      obj.t = true;\n      obj.ref = null;\n    });\n  }\n  function addToTransaction(obj) {\n    if (TRANSACTION) {\n      TRANSACTION.props.add(obj);\n    } else {\n      obj.ref = null;\n    }\n  }\n  function addTransactionCB(method) {\n    if (TRANSACTION) {\n      TRANSACTION.cbs.add(method);\n    } else {\n      method();\n    }\n  }\n\n  /**\n   * Run `method` without subscribing to any tracked properties\n   * controlled by EmberData.\n   *\n   * This should rarely be used except by libraries that really\n   * know what they are doing. It is most useful for wrapping\n   * certain kinds of fetch/query logic from within a `Resource`\n   * `hook` or other similar pattern.\n   *\n   * @function untracked\n   * @public\n   * @static\n   * @for @ember-data/tracking\n   * @param method\n   * @returns result of invoking method\n   */\n  function untracked(method) {\n    createTransaction();\n    const ret = method();\n    void untrack();\n    return ret;\n  }\n\n  /**\n   * Run the method, subscribing to any tracked properties\n   * managed by EmberData that were accessed or written during\n   * the method's execution as per-normal but while allowing\n   * interleaving of reads and writes.\n   *\n   * This is useful when for instance you want to perform\n   * a mutation based on existing state that must be read first.\n   *\n   * @function transact\n   * @public\n   * @static\n   * @for @ember-data/tracking\n   * @param method\n   * @returns result of invoking method\n   */\n  function transact(method) {\n    createTransaction();\n    const ret = method();\n    flushTransaction();\n    return ret;\n  }\n\n  /**\n   * A helpful utility for creating a new function that\n   * always runs in a transaction. E.G. this \"memoizes\"\n   * calling `transact(fn)`, currying args as necessary.\n   *\n   * @method memoTransact\n   * @public\n   * @static\n   * @for @ember-data/tracking\n   * @param method\n   * @returns a function that will invoke method in a transaction with any provided args and return its result\n   */\n  function memoTransact(method) {\n    return function () {\n      createTransaction();\n      const ret = method(...arguments);\n      flushTransaction();\n      return ret;\n    };\n  }\n});","define(\"@ember-data/tracking/index\", [\"exports\", \"@ember-data/tracking/-private\"], function (_exports, _private) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"memoTransact\", {\n    enumerable: true,\n    get: function () {\n      return _private.memoTransact;\n    }\n  });\n  Object.defineProperty(_exports, \"transact\", {\n    enumerable: true,\n    get: function () {\n      return _private.transact;\n    }\n  });\n  Object.defineProperty(_exports, \"untracked\", {\n    enumerable: true,\n    get: function () {\n      return _private.untracked;\n    }\n  });\n});","define(\"@ember/render-modifiers/modifiers/did-insert\", [\"exports\", \"@embroider/macros/runtime\", \"@ember/modifier\"], function (_exports, _runtime, _modifier) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n    The `{{did-insert}}` element modifier is activated when an element is\n    inserted into the DOM.\n  \n    In this example, the `fadeIn` function receives the `div` DOM element as its\n    first argument and is executed after the element is inserted into the DOM.\n  \n    ```handlebars\n    <div {{did-insert this.fadeIn}} class=\"alert\">\n      {{yield}}\n    </div>\n    ```\n  \n    ```js\n    export default Component.extend({\n      fadeIn(element) {\n        element.classList.add('fade-in');\n      }\n    });\n    ```\n  \n    By default, the executed function will be unbound. If you would like to access\n    the component context in your function, use the `action` decorator as follows:\n  \n    ```handlebars\n    <div {{did-insert this.incrementCount}}>first</div>\n    <div {{did-insert this.incrementCount}}>second</div>\n  \n    <p>{{this.count}} elements were rendered</p>\n    ```\n  \n    ```js\n    export default Component.extend({\n      count: tracked({ value: 0 }),\n  \n      incrementCount: action(function() {\n        this.count++;\n      })\n    });\n    ```\n  \n    @method did-insert\n    @public\n  */\n  var _default = (0, _modifier.setModifierManager)(() => ({\n    capabilities: (0, _modifier.capabilities)((0, _runtime.macroCondition)(true) ? '3.22' : '3.13', {\n      disableAutoTracking: true\n    }),\n    createModifier() {},\n    installModifier(_state, element, _ref) {\n      let {\n        positional: [fn, ...args],\n        named\n      } = _ref;\n      fn(element, args, named);\n    },\n    updateModifier() {},\n    destroyModifier() {}\n  }), class DidInsertModifier {});\n  _exports.default = _default;\n});","define(\"@ember/render-modifiers/modifiers/did-update\", [\"exports\", \"@embroider/macros/es-compat\", \"@embroider/macros/runtime\", \"@ember/modifier\"], function (_exports, _esCompat, _runtime, _modifier) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const untrack = function () {\n    if ((0, _runtime.macroCondition)(true)) {\n      // ember-source@3.27 shipped \"real modules\" by default, so we can just use\n      // importSync to get @glimmer/validator directly\n      return (0, _esCompat.default)(require(\"@glimmer/validator\")).untrack;\n    } else if ((0, _runtime.macroCondition)(true)) {\n      // we can access `window.Ember` here because it wasn't deprecated until at least 3.27\n      // eslint-disable-next-line no-undef\n      return Ember.__loader.require('@glimmer/validator').untrack;\n    } else {\n      // nothing needed here, we do not call `untrack` in this case\n    }\n  }();\n\n  /**\n    The `{{did-update}}` element modifier is activated when any of its arguments\n    are updated. It does not run on initial render.\n  \n    In this example, the `resize` function receives the `textarea` DOM element as its\n    first argument and is executed anytime the `@text` argument changes.\n  \n    ```handlebars\n    <textarea {{did-update this.resize @text}} readonly style=\"padding: 0px;\">\n      {{@text}}\n    </textarea>\n    ```\n  \n    ```js\n    export default Component.extend({\n      resize(element) {\n        element.style.height = `${element.scrollHeight}px`;\n      }\n    });\n    ```\n  \n    In addition to the `element`, both named and positional arguments are passed to the\n    executed function:\n  \n    ```handlebars\n    <div {{did-update this.logArguments @first @second third=@third}} />\n    ```\n  \n    ```js\n    export default Component.extend({\n      logArguments(element, [first, second], { third }) {\n        console.log('element', element);\n        console.log('positional args', first, second);\n        console.log('names args', third);\n      }\n    });\n    ```\n  \n    By default, the executed function will be unbound. If you would like to access\n    the component context in your function, use the `action` decorator as follows:\n  \n    ```handlebars\n    <div {{did-update this.someFunction @someArg} />\n    ```\n  \n    ```js\n    export default Component.extend({\n      someFunction: action(function(element, [someArg]) {\n        // the `this` context will be the component instance\n      })\n    });\n    ```\n  \n    @method did-update\n    @public\n  */\n  var _default = (0, _modifier.setModifierManager)(() => ({\n    capabilities: (0, _runtime.macroCondition)(true) ? (0, _modifier.capabilities)('3.22', {\n      disableAutoTracking: false\n    }) : (0, _modifier.capabilities)('3.13', {\n      disableAutoTracking: true\n    }),\n    createModifier() {\n      return {\n        element: null\n      };\n    },\n    installModifier(state, element, args) {\n      // save element into state bucket\n      state.element = element;\n      if ((0, _runtime.macroCondition)(true)) {\n        // Consume individual properties to entangle tracking.\n        // https://github.com/emberjs/ember.js/issues/19277\n        // https://github.com/ember-modifier/ember-modifier/pull/63#issuecomment-815908201\n        args.positional.forEach(() => {});\n        args.named && Object.values(args.named);\n      }\n    },\n    updateModifier(_ref, args) {\n      let {\n        element\n      } = _ref;\n      let [fn, ...positional] = args.positional;\n      if ((0, _runtime.macroCondition)(true)) {\n        // Consume individual properties to entangle tracking.\n        // https://github.com/emberjs/ember.js/issues/19277\n        // https://github.com/ember-modifier/ember-modifier/pull/63#issuecomment-815908201\n        args.positional.forEach(() => {});\n        args.named && Object.values(args.named);\n        untrack(() => {\n          fn(element, positional, args.named);\n        });\n      } else {\n        fn(element, positional, args.named);\n      }\n    },\n    destroyModifier() {}\n  }), class DidUpdateModifier {});\n  _exports.default = _default;\n});","define(\"@ember/render-modifiers/modifiers/will-destroy\", [\"exports\", \"@embroider/macros/runtime\", \"@ember/modifier\"], function (_exports, _runtime, _modifier) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n    The `{{will-destroy}}` element modifier is activated immediately before the element\n    is removed from the DOM.\n  \n    ```handlebars\n    <div {{will-destroy this.teardownPlugin}}>\n      {{yield}}\n    </div>\n    ```\n  \n    ```js\n    export default Component.extend({\n      teardownPlugin(element) {\n        // teardown logic here\n      }\n    });\n    ```\n  \n    By default, the executed function will be unbound. If you would like to access\n    the component context in your function, use the `action` decorator as follows:\n  \n    ```handlebars\n    <div {{will-destroy this.teardownPlugin}}>\n      {{yield}}\n    </div>\n    ```\n  \n    ```js\n    export default Component.extend({\n      teardownPlugin: action(function(element) {\n        // the `this` context will be the component instance\n      })\n    });\n    ```\n  \n    @method will-destroy\n    @public\n  */\n  var _default = (0, _modifier.setModifierManager)(() => ({\n    capabilities: (0, _modifier.capabilities)((0, _runtime.macroCondition)(true) ? '3.22' : '3.13', {\n      disableAutoTracking: true\n    }),\n    createModifier() {\n      return {\n        element: null\n      };\n    },\n    installModifier(state, element) {\n      state.element = element;\n    },\n    updateModifier() {},\n    destroyModifier(_ref, args) {\n      let {\n        element\n      } = _ref;\n      let [fn, ...positional] = args.positional;\n      fn(element, positional, args.named);\n    }\n  }), class WillDestroyModifier {});\n  _exports.default = _default;\n});","define(\"@ember/string/cache\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n  function _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\n  function _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n  class Cache {\n    constructor(limit, func, store) {\n      _defineProperty(this, \"size\", 0);\n      _defineProperty(this, \"misses\", 0);\n      _defineProperty(this, \"hits\", 0);\n      this.limit = limit;\n      this.func = func;\n      this.store = store;\n      this.store = store || new Map();\n    }\n    get(key) {\n      let value = this.store.get(key);\n      if (this.store.has(key)) {\n        this.hits++;\n        return this.store.get(key);\n      } else {\n        this.misses++;\n        value = this.set(key, this.func(key));\n      }\n      return value;\n    }\n    set(key, value) {\n      if (this.limit > this.size) {\n        this.size++;\n        this.store.set(key, value);\n      }\n      return value;\n    }\n    purge() {\n      this.store.clear();\n      this.size = 0;\n      this.hits = 0;\n      this.misses = 0;\n    }\n  }\n  _exports.default = Cache;\n});","define(\"@ember/string/index\", [\"exports\", \"@ember/string/cache\"], function (_exports, _cache) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.camelize = camelize;\n  _exports.capitalize = capitalize;\n  _exports.classify = classify;\n  _exports.dasherize = dasherize;\n  _exports.decamelize = decamelize;\n  _exports.getString = getString;\n  _exports.getStrings = getStrings;\n  _exports.htmlSafe = htmlSafe;\n  _exports.isHTMLSafe = isHTMLSafe;\n  _exports.setStrings = setStrings;\n  _exports.underscore = underscore;\n  _exports.w = w;\n  /* eslint-disable no-useless-escape */\n\n  /**\n   @module @ember/string\n   */\n\n  // STATE within a module is frowned upon, this exists\n  // to support Ember.STRINGS but shield ember internals from this legacy global\n  // API.\n  let STRINGS = {};\n  function setStrings(strings) {\n    STRINGS = strings;\n  }\n  function getStrings() {\n    return STRINGS;\n  }\n  function getString(name) {\n    return STRINGS[name];\n  }\n  const STRING_DASHERIZE_REGEXP = /[ _]/g;\n  const STRING_DASHERIZE_CACHE = new _cache.default(1000, key => decamelize(key).replace(STRING_DASHERIZE_REGEXP, '-'));\n  const STRING_CAMELIZE_REGEXP_1 = /(\\-|\\_|\\.|\\s)+(.)?/g;\n  const STRING_CAMELIZE_REGEXP_2 = /(^|\\/)([A-Z])/g;\n  const CAMELIZE_CACHE = new _cache.default(1000, key => key.replace(STRING_CAMELIZE_REGEXP_1, (_match, _separator, chr) => chr ? chr.toUpperCase() : '').replace(STRING_CAMELIZE_REGEXP_2, (match\n  /*, separator, chr */) => match.toLowerCase()));\n  const STRING_CLASSIFY_REGEXP_1 = /^(\\-|_)+(.)?/;\n  const STRING_CLASSIFY_REGEXP_2 = /(.)(\\-|\\_|\\.|\\s)+(.)?/g;\n  const STRING_CLASSIFY_REGEXP_3 = /(^|\\/|\\.)([a-z])/g;\n  const CLASSIFY_CACHE = new _cache.default(1000, str => {\n    const replace1 = (_match, _separator, chr) => chr ? `_${chr.toUpperCase()}` : '';\n    const replace2 = (_match, initialChar, _separator, chr) => initialChar + (chr ? chr.toUpperCase() : '');\n    const parts = str.split('/');\n    for (let i = 0; i < parts.length; i++) {\n      parts[i] = parts[i].replace(STRING_CLASSIFY_REGEXP_1, replace1).replace(STRING_CLASSIFY_REGEXP_2, replace2);\n    }\n    return parts.join('/').replace(STRING_CLASSIFY_REGEXP_3, (match\n    /*, separator, chr */) => match.toUpperCase());\n  });\n  const STRING_UNDERSCORE_REGEXP_1 = /([a-z\\d])([A-Z]+)/g;\n  const STRING_UNDERSCORE_REGEXP_2 = /\\-|\\s+/g;\n  const UNDERSCORE_CACHE = new _cache.default(1000, str => str.replace(STRING_UNDERSCORE_REGEXP_1, '$1_$2').replace(STRING_UNDERSCORE_REGEXP_2, '_').toLowerCase());\n  const STRING_CAPITALIZE_REGEXP = /(^|\\/)([a-z\\u00C0-\\u024F])/g;\n  const CAPITALIZE_CACHE = new _cache.default(1000, str => str.replace(STRING_CAPITALIZE_REGEXP, (match\n  /*, separator, chr */) => match.toUpperCase()));\n  const STRING_DECAMELIZE_REGEXP = /([a-z\\d])([A-Z])/g;\n  const DECAMELIZE_CACHE = new _cache.default(1000, str => str.replace(STRING_DECAMELIZE_REGEXP, '$1_$2').toLowerCase());\n  /**\n    Splits a string into separate units separated by spaces, eliminating any\n    empty strings in the process. This is a convenience method for split that\n    is mostly useful when applied to the `String.prototype`.\n  \n    ```javascript\n    import { w } from '@ember/string';\n  \n    w(\"alpha beta gamma\").forEach(function(key) {\n      console.log(key);\n    });\n  \n    // > alpha\n    // > beta\n    // > gamma\n    ```\n  \n    @method w\n    @param {String} str The string to split\n    @return {Array} array containing the split strings\n    @public\n  */\n\n  function w(str) {\n    return str.split(/\\s+/);\n  }\n  /**\n    Converts a camelized string into all lower case separated by underscores.\n  \n    ```javascript\n    import { decamelize } from '@ember/string';\n  \n    decamelize('innerHTML');          // 'inner_html'\n    decamelize('action_name');        // 'action_name'\n    decamelize('css-class-name');     // 'css-class-name'\n    decamelize('my favorite items');  // 'my favorite items'\n    ```\n  \n    @method decamelize\n    @param {String} str The string to decamelize.\n    @return {String} the decamelized string.\n    @public\n  */\n\n  function decamelize(str) {\n    return DECAMELIZE_CACHE.get(str);\n  }\n  /**\n    Replaces underscores, spaces, or camelCase with dashes.\n  \n    ```javascript\n    import { dasherize } from '@ember/string';\n  \n    dasherize('innerHTML');                // 'inner-html'\n    dasherize('action_name');              // 'action-name'\n    dasherize('css-class-name');           // 'css-class-name'\n    dasherize('my favorite items');        // 'my-favorite-items'\n    dasherize('privateDocs/ownerInvoice';  // 'private-docs/owner-invoice'\n    ```\n  \n    @method dasherize\n    @param {String} str The string to dasherize.\n    @return {String} the dasherized string.\n    @public\n  */\n\n  function dasherize(str) {\n    return STRING_DASHERIZE_CACHE.get(str);\n  }\n  /**\n    Returns the lowerCamelCase form of a string.\n  \n    ```javascript\n    import { camelize } from '@ember/string';\n  \n    camelize('innerHTML');                   // 'innerHTML'\n    camelize('action_name');                 // 'actionName'\n    camelize('css-class-name');              // 'cssClassName'\n    camelize('my favorite items');           // 'myFavoriteItems'\n    camelize('My Favorite Items');           // 'myFavoriteItems'\n    camelize('private-docs/owner-invoice');  // 'privateDocs/ownerInvoice'\n    ```\n  \n    @method camelize\n    @param {String} str The string to camelize.\n    @return {String} the camelized string.\n    @public\n  */\n\n  function camelize(str) {\n    return CAMELIZE_CACHE.get(str);\n  }\n  /**\n    Returns the UpperCamelCase form of a string.\n  \n    ```javascript\n    import { classify } from '@ember/string';\n  \n    classify('innerHTML');                   // 'InnerHTML'\n    classify('action_name');                 // 'ActionName'\n    classify('css-class-name');              // 'CssClassName'\n    classify('my favorite items');           // 'MyFavoriteItems'\n    classify('private-docs/owner-invoice');  // 'PrivateDocs/OwnerInvoice'\n    ```\n  \n    @method classify\n    @param {String} str the string to classify\n    @return {String} the classified string\n    @public\n  */\n\n  function classify(str) {\n    return CLASSIFY_CACHE.get(str);\n  }\n  /**\n    More general than decamelize. Returns the lower\\_case\\_and\\_underscored\n    form of a string.\n  \n    ```javascript\n    import { underscore } from '@ember/string';\n  \n    underscore('innerHTML');                 // 'inner_html'\n    underscore('action_name');               // 'action_name'\n    underscore('css-class-name');            // 'css_class_name'\n    underscore('my favorite items');         // 'my_favorite_items'\n    underscore('privateDocs/ownerInvoice');  // 'private_docs/owner_invoice'\n    ```\n  \n    @method underscore\n    @param {String} str The string to underscore.\n    @return {String} the underscored string.\n    @public\n  */\n\n  function underscore(str) {\n    return UNDERSCORE_CACHE.get(str);\n  }\n  /**\n    Returns the Capitalized form of a string\n  \n    ```javascript\n    import { capitalize } from '@ember/string';\n  \n    capitalize('innerHTML')                 // 'InnerHTML'\n    capitalize('action_name')               // 'Action_name'\n    capitalize('css-class-name')            // 'Css-class-name'\n    capitalize('my favorite items')         // 'My favorite items'\n    capitalize('privateDocs/ownerInvoice'); // 'PrivateDocs/ownerInvoice'\n    ```\n  \n    @method capitalize\n    @param {String} str The string to capitalize.\n    @return {String} The capitalized string.\n    @public\n  */\n\n  function capitalize(str) {\n    return CAPITALIZE_CACHE.get(str);\n  }\n  /*\n    The following are implemented here to give users adding `@ember/string` to\n    their projects a useful error message. The `ember-source` implementation of\n    `@ember/string` is clobbered by adding this addon, and so the deprecation of\n    the import path is not triggered. This error message is intended to help\n    users discover what they need to change.\n  */\n\n  function htmlSafe(str) {\n    throw new Error('htmlSafe is not implemented in the `@ember/string` package. Please import from `@ember/template` instead.');\n  }\n  function isHTMLSafe(str) {\n    throw new Error('isHTMLSafe is not implemented in the `@ember/string` package. Please import from `@ember/template` instead.');\n  }\n});","define(\"@ember/test-waiters/build-waiter\", [\"exports\", \"@ember/debug\", \"@ember/test-waiters/token\", \"@ember/test-waiters/waiter-manager\"], function (_exports, _debug, _token, _waiterManager) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports._resetWaiterNames = _resetWaiterNames;\n  _exports.default = buildWaiter;\n  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n  function _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\n  function _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n  const WAITER_NAME_PATTERN = /^[^:]*:?.*/;\n  let WAITER_NAMES = true /* DEBUG */ ? new Set() : undefined;\n  function _resetWaiterNames() {\n    WAITER_NAMES = new Set();\n  }\n  function getNextToken() {\n    return new _token.default();\n  }\n  class TestWaiterImpl {\n    constructor(name, nextToken) {\n      _defineProperty(this, \"isRegistered\", false);\n      _defineProperty(this, \"items\", new Map());\n      _defineProperty(this, \"completedOperationsForTokens\", new WeakMap());\n      _defineProperty(this, \"completedOperationsForPrimitives\", new Map());\n      this.name = name; // @ts-ignore\n\n      this.nextToken = nextToken || getNextToken;\n    }\n    beginAsync() {\n      let token = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.nextToken();\n      let label = arguments.length > 1 ? arguments[1] : undefined;\n      this._register();\n      if (this.items.has(token)) {\n        throw new Error(`beginAsync called for ${token} but it is already pending.`);\n      }\n      let error = new Error();\n      this.items.set(token, {\n        get stack() {\n          return error.stack;\n        },\n        label\n      });\n      return token;\n    }\n    endAsync(token) {\n      if (!this.items.has(token) && !this._getCompletedOperations(token).has(token)) {\n        throw new Error(`testWaiter.endAsync called with no preceding testWaiter.beginAsync call.\n        Test waiter calls should always be paired. This can occur when a test waiter's paired calls are invoked in a non-deterministic order.\n\n        See https://github.com/emberjs/ember-test-waiters#keep-beginasyncendasync-in-same-block-scope for more information.`);\n      }\n      this.items.delete(token); // Mark when a waiter operation has completed so we can distinguish\n      // whether endAsync is being called before a prior beginAsync call above.\n\n      this._getCompletedOperations(token).set(token, true);\n    }\n    waitUntil() {\n      return this.items.size === 0;\n    }\n    debugInfo() {\n      let result = [];\n      this.items.forEach(value => {\n        result.push(value);\n      });\n      return result;\n    }\n    reset() {\n      this.items.clear();\n    }\n    _register() {\n      if (!this.isRegistered) {\n        (0, _waiterManager.register)(this);\n        this.isRegistered = true;\n      }\n    }\n    _getCompletedOperations(token) {\n      let type = typeof token;\n      let isFunction = type === 'function';\n      let isObject = token !== null && type === 'object';\n      let isPrimitive = !isFunction && !isObject;\n      return isPrimitive ? this.completedOperationsForPrimitives : this.completedOperationsForTokens;\n    }\n  }\n  class NoopTestWaiter {\n    constructor(name) {\n      this.name = name;\n    }\n    beginAsync() {\n      return this;\n    }\n    endAsync() {}\n    waitUntil() {\n      return true;\n    }\n    debugInfo() {\n      return [];\n    }\n    reset() {}\n  }\n  /**\n   * Builds and returns a test waiter. The type of the\n   * returned waiter is dependent on whether the app or\n   * addon is in `DEBUG` mode or not.\n   *\n   * @public\n   *\n   * @param name {string} The name of the test waiter\n   * @returns {TestWaiter}\n   *\n   * @example\n   *\n   * import Component from '@ember/component';\n   * import { buildWaiter } from '@ember/test-waiters';\n   *\n   * if (DEBUG) {\n   *   let waiter = buildWaiter('friend-waiter');\n   * }\n   *\n   * export default class Friendz extends Component {\n   *   didInsertElement() {\n   *     let token = waiter.beginAsync(this);\n   *\n   *     someAsyncWork().then(() => {\n   *       waiter.endAsync(token);\n   *     });\n   *   }\n   * }\n   */\n\n  function buildWaiter(name) {\n    if (true /* DEBUG */) {\n      (true && (0, _debug.warn)(`The waiter name '${name}' is already in use`, !WAITER_NAMES.has(name), {\n        id: '@ember/test-waiters.duplicate-waiter-name'\n      }));\n      WAITER_NAMES.add(name);\n    }\n    if (!true /* DEBUG */) {\n      return new NoopTestWaiter(name);\n    } else {\n      (true && (0, _debug.warn)(`You must provide a name that contains a descriptive prefix separated by a colon.\n\n        Example: ember-fictitious-addon:some-file\n\n        You passed: ${name}`, WAITER_NAME_PATTERN.test(name), {\n        id: '@ember/test-waiters.invalid-waiter-name'\n      }));\n      return new TestWaiterImpl(name);\n    }\n  }\n});","define(\"@ember/test-waiters/index\", [\"exports\", \"@ember/test-waiters/waiter-manager\", \"@ember/test-waiters/build-waiter\", \"@ember/test-waiters/wait-for-promise\", \"@ember/test-waiters/wait-for\"], function (_exports, _waiterManager, _buildWaiter, _waitForPromise, _waitFor) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"_reset\", {\n    enumerable: true,\n    get: function () {\n      return _waiterManager._reset;\n    }\n  });\n  Object.defineProperty(_exports, \"_resetWaiterNames\", {\n    enumerable: true,\n    get: function () {\n      return _buildWaiter._resetWaiterNames;\n    }\n  });\n  Object.defineProperty(_exports, \"buildWaiter\", {\n    enumerable: true,\n    get: function () {\n      return _buildWaiter.default;\n    }\n  });\n  Object.defineProperty(_exports, \"getPendingWaiterState\", {\n    enumerable: true,\n    get: function () {\n      return _waiterManager.getPendingWaiterState;\n    }\n  });\n  Object.defineProperty(_exports, \"getWaiters\", {\n    enumerable: true,\n    get: function () {\n      return _waiterManager.getWaiters;\n    }\n  });\n  Object.defineProperty(_exports, \"hasPendingWaiters\", {\n    enumerable: true,\n    get: function () {\n      return _waiterManager.hasPendingWaiters;\n    }\n  });\n  Object.defineProperty(_exports, \"register\", {\n    enumerable: true,\n    get: function () {\n      return _waiterManager.register;\n    }\n  });\n  Object.defineProperty(_exports, \"unregister\", {\n    enumerable: true,\n    get: function () {\n      return _waiterManager.unregister;\n    }\n  });\n  Object.defineProperty(_exports, \"waitFor\", {\n    enumerable: true,\n    get: function () {\n      return _waitFor.default;\n    }\n  });\n  Object.defineProperty(_exports, \"waitForPromise\", {\n    enumerable: true,\n    get: function () {\n      return _waitForPromise.default;\n    }\n  });\n});","define(\"@ember/test-waiters/token\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n   * A class representing a test waiter token.\n   *\n   * @public\n   * @class\n   */\n  class Token {}\n  _exports.default = Token;\n});","define(\"@ember/test-waiters/types/index\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});","define(\"@ember/test-waiters/wait-for-promise\", [\"exports\", \"@ember/test-waiters/build-waiter\"], function (_exports, _buildWaiter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = waitForPromise;\n  const PROMISE_WAITER = (0, _buildWaiter.default)('@ember/test-waiters:promise-waiter');\n  /**\n   * A convenient utility function to simplify waiting for a promise.\n   *\n   * @public\n   * @param promise {Promise<T> | RSVP.Promise<T>} The promise to track async operations for\n   * @param label {string} An optional string to identify the promise\n   *\n   * @example\n   *\n   * import Component from '@ember/component';\n   * import { waitForPromise } from '@ember/test-waiters';\n   *\n   * export default class Friendz extends Component {\n   *   didInsertElement() {\n   *     waitForPromise(new Promise(resolve => {\n   *       doSomeWork();\n   *       resolve();\n   *     }));\n   *   }\n   * }\n   */\n\n  function waitForPromise(promise, label) {\n    let result = promise;\n    if (true /* DEBUG */) {\n      PROMISE_WAITER.beginAsync(promise, label);\n      result = promise.then(value => {\n        PROMISE_WAITER.endAsync(promise);\n        return value;\n      }, error => {\n        PROMISE_WAITER.endAsync(promise);\n        throw error;\n      });\n    }\n    return result;\n  }\n});","define(\"@ember/test-waiters/wait-for\", [\"exports\", \"@ember/test-waiters/wait-for-promise\", \"@ember/test-waiters/build-waiter\"], function (_exports, _waitForPromise, _buildWaiter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = waitFor;\n  function waitFor() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n    let isFunction = args.length < 3;\n    if (isFunction) {\n      let [fn, label] = args;\n      return wrapFunction(fn, label);\n    } else {\n      let [,, descriptor, label] = args;\n      if (!true /* DEBUG */) {\n        return descriptor;\n      }\n      let fn = descriptor.value;\n      descriptor.value = wrapFunction(fn, label);\n      return descriptor;\n    }\n  }\n  function wrapFunction(fn, label) {\n    if (!true /* DEBUG */) {\n      return fn;\n    }\n    return function () {\n      for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n      let result = fn.call(this, ...args);\n      if (isThenable(result)) {\n        return (0, _waitForPromise.default)(result, label);\n      } else if (isGenerator(result)) {\n        return waitForGenerator(result, label);\n      } else {\n        return result;\n      }\n    };\n  }\n  function isThenable(maybePromise) {\n    let type = typeof maybePromise;\n    return (maybePromise !== null && type === 'object' || type === 'function') && typeof maybePromise.then === 'function';\n  }\n  function isGenerator(maybeGenerator) {\n    // Because we don't have Symbol.iterator in IE11\n    return typeof maybeGenerator.next === 'function' && typeof maybeGenerator.return === 'function' && typeof maybeGenerator.throw === 'function';\n  }\n  const GENERATOR_WAITER = (0, _buildWaiter.default)('@ember/test-waiters:generator-waiter');\n  function waitForGenerator(generator, label) {\n    GENERATOR_WAITER.beginAsync(generator, label);\n    let isWaiting = true;\n    function stopWaiting() {\n      if (isWaiting) {\n        GENERATOR_WAITER.endAsync(generator);\n        isWaiting = false;\n      }\n    }\n    return {\n      next() {\n        let hasErrored = true;\n        try {\n          let val = generator.next(...arguments);\n          hasErrored = false;\n          if (val.done) {\n            stopWaiting();\n          }\n          return val;\n        } finally {\n          // If generator.next() throws, we need to stop waiting. But if we catch\n          // and re-throw exceptions, it could move the location from which the\n          // uncaught exception is thrown, interfering with the developer\n          // debugging experience if they have break-on-exceptions enabled. So we\n          // use a boolean flag and a finally block to emulate a catch block.\n          if (hasErrored) {\n            stopWaiting();\n          }\n        }\n      },\n      return() {\n        stopWaiting();\n        return generator.return(...arguments);\n      },\n      throw() {\n        stopWaiting();\n        return generator.throw(...arguments);\n      }\n    };\n  }\n});","define(\"@ember/test-waiters/waiter-manager\", [\"exports\", \"ember\", \"@ember/test\"], function (_exports, _ember, _test) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports._reset = _reset;\n  _exports.getPendingWaiterState = getPendingWaiterState;\n  _exports.getWaiters = getWaiters;\n  _exports.hasPendingWaiters = hasPendingWaiters;\n  _exports.register = register;\n  _exports.unregister = unregister;\n  // this ensures that if @ember/test-waiters exists in multiple places in the\n  // build output we will still use a single map of waiters (there really should\n  // only be one of them, or else `settled` will not work at all)\n  const WAITERS = function () {\n    const HAS_SYMBOL = typeof Symbol !== 'undefined';\n    let symbolName = 'TEST_WAITERS';\n    let symbol = HAS_SYMBOL ? Symbol.for(symbolName) : symbolName;\n    let global = getGlobal();\n    let waiters = global[symbol];\n    if (waiters === undefined) {\n      waiters = global[symbol] = new Map();\n    }\n    return waiters;\n  }();\n  function indexable(input) {\n    return input;\n  }\n  function getGlobal() {\n    // eslint-disable-next-line node/no-unsupported-features/es-builtins\n    if (typeof globalThis !== 'undefined') return indexable(globalThis);\n    if (typeof self !== 'undefined') return indexable(self);\n    if (typeof window !== 'undefined') return indexable(window);\n    if (typeof global !== 'undefined') return indexable(global);\n    throw new Error('unable to locate global object');\n  }\n  /**\n   * Backwards compatibility with legacy waiters system.\n   *\n   * We want to always register a waiter using the legacy waiter system, as right\n   * now if consumers are not on the right version of @ember/test-helpers, using\n   * this addon will result in none of these waiters waiting.\n   */\n  // eslint-disable-next-line ember/new-module-imports\n\n  if (_ember.default.Test) {\n    (0, _test.registerWaiter)(() => !hasPendingWaiters());\n  }\n  /**\n   * Registers a waiter.\n   *\n   * @public\n   * @param waiter {Waiter} A test waiter instance\n   */\n\n  function register(waiter) {\n    WAITERS.set(waiter.name, waiter);\n  }\n  /**\n   * Un-registers a waiter.\n   *\n   * @public\n   * @param waiter {Waiter} A test waiter instance\n   */\n\n  function unregister(waiter) {\n    WAITERS.delete(waiter.name);\n  }\n  /**\n   * Gets an array of all waiters current registered.\n   *\n   * @public\n   * @returns {Waiter[]}\n   */\n\n  function getWaiters() {\n    let result = [];\n    WAITERS.forEach(value => {\n      result.push(value);\n    });\n    return result;\n  }\n  /**\n   * Clears all waiters.\n   *\n   * @private\n   */\n\n  function _reset() {\n    for (let waiter of getWaiters()) {\n      waiter.isRegistered = false;\n    }\n    WAITERS.clear();\n  }\n  /**\n   * Gets the current state of all waiters. Any waiters whose\n   * `waitUntil` method returns false will be considered `pending`.\n   *\n   * @returns {PendingWaiterState} An object containing a count of all waiters\n   * pending and a `waiters` object containing the name of all pending waiters\n   * and their debug info.\n   */\n\n  function getPendingWaiterState() {\n    let result = {\n      pending: 0,\n      waiters: {}\n    };\n    WAITERS.forEach(waiter => {\n      if (!waiter.waitUntil()) {\n        result.pending++;\n        let debugInfo = waiter.debugInfo();\n        result.waiters[waiter.name] = debugInfo || true;\n      }\n    });\n    return result;\n  }\n  /**\n   * Determines if there are any pending waiters.\n   *\n   * @returns {boolean} `true` if there are pending waiters, otherwise `false`.\n   */\n\n  function hasPendingWaiters() {\n    let state = getPendingWaiterState();\n    return state.pending > 0;\n  }\n});","define(\"@embroider/macros/es-compat\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = esCompat;\n  function esCompat(m) {\n    return m?.__esModule ? m : {\n      default: m\n    };\n  }\n});","define(\"@embroider/macros/runtime\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.config = config;\n  _exports.each = each;\n  _exports.getGlobalConfig = getGlobalConfig;\n  _exports.isTesting = isTesting;\n  _exports.macroCondition = macroCondition;\n  /*\n    These are the runtime implementations for the javascript macros that have\n    runtime implementations.\n  \n    Not every macro has a runtime implementation, some only make sense in the\n    build and always run there.\n  \n    Even when we have runtime implementations, we are still careful to emit static\n    errors during the build wherever possible, and runtime errors when necessary,\n    so that you're not surprised when you switch from runtime-mode to compile-time\n    mode.\n  */\n\n  /*\n    CAUTION: in classic builds, this file gets shared by all present copies of\n    @embroider/macros. If you want to change its public API, you need to rename it\n    and update `pathToRuntime` in ../babel/state.ts to point at it, so that your\n    babel plugin and runtime will match.\n  */\n\n  function each(array) {\n    if (!Array.isArray(array)) {\n      throw new Error(`the argument to the each() macro must be an array`);\n    }\n    return array;\n  }\n  function macroCondition(predicate) {\n    return predicate;\n  }\n\n  // This is here as a compile target for `getConfig` and `getOwnConfig` when\n  // we're in runtime mode. This is not public API to call from your own code.\n  function config(packageRoot) {\n    return runtimeConfig.packages[packageRoot];\n  }\n  function getGlobalConfig() {\n    return runtimeConfig.global;\n  }\n  function isTesting() {\n    let g = runtimeConfig.global;\n    let e = g && g['@embroider/macros'];\n    return Boolean(e && e.isTesting);\n  }\n  const runtimeConfig = initializeRuntimeMacrosConfig();\n\n  // this exists to be targeted by our babel plugin\n  function initializeRuntimeMacrosConfig() {\n    return {\n      \"packages\": {\n        \"/app/WEB/node_modules/@ember-data/serializer\": {\n          \"compatWith\": null,\n          \"debug\": {\n            \"LOG_PAYLOADS\": false,\n            \"LOG_OPERATIONS\": false,\n            \"LOG_MUTATIONS\": false,\n            \"LOG_NOTIFICATIONS\": false,\n            \"LOG_REQUESTS\": false,\n            \"LOG_REQUEST_STATUS\": false,\n            \"LOG_IDENTIFIERS\": false,\n            \"LOG_GRAPH\": false,\n            \"LOG_INSTANCE_CACHE\": false\n          },\n          \"deprecations\": {\n            \"DEPRECATE_CATCH_ALL\": true,\n            \"DEPRECATE_3_12\": true,\n            \"DEPRECATE_RSVP_PROMISE\": true,\n            \"DEPRECATE_SAVE_PROMISE_ACCESS\": true,\n            \"DEPRECATE_SNAPSHOT_MODEL_CLASS_ACCESS\": true,\n            \"DEPRECATE_STORE_FIND\": true,\n            \"DEPRECATE_HAS_RECORD\": true,\n            \"DEPRECATE_STRING_ARG_SCHEMAS\": true,\n            \"DEPRECATE_JSON_API_FALLBACK\": true,\n            \"DEPRECATE_MODEL_REOPEN\": true,\n            \"DEPRECATE_EARLY_STATIC\": true,\n            \"DEPRECATE_HELPERS\": true,\n            \"DEPRECATE_PROMISE_MANY_ARRAY_BEHAVIORS\": true,\n            \"DEPRECATE_V1CACHE_STORE_APIS\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_TYPE\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_ASYNC\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_INVERSE\": true,\n            \"DEPRECATE_V1_RECORD_DATA\": true,\n            \"DEPRECATE_A_USAGE\": true,\n            \"DEPRECATE_PROMISE_PROXIES\": true,\n            \"DEPRECATE_ARRAY_LIKE\": true,\n            \"DEPRECATE_COMPUTED_CHAINS\": true,\n            \"DEPRECATE_NON_EXPLICIT_POLYMORPHISM\": true,\n            \"DEPRECATE_INSTANTIATE_RECORD_ARGS\": true\n          },\n          \"features\": {\n            \"SAMPLE_FEATURE_FLAG\": false\n          },\n          \"includeDataAdapter\": false,\n          \"packages\": {\n            \"HAS_EMBER_DATA_PACKAGE\": false,\n            \"HAS_STORE_PACKAGE\": true,\n            \"HAS_MODEL_PACKAGE\": false,\n            \"HAS_JSON_API_PACKAGE\": false,\n            \"HAS_GRAPH_PACKAGE\": false,\n            \"HAS_REQUEST_PACKAGE\": false,\n            \"HAS_COMPAT_PACKAGE\": false,\n            \"HAS_TRACKING_PACKAGE\": false,\n            \"HAS_ADAPTER_PACKAGE\": false,\n            \"HAS_SERIALIZER_PACKAGE\": true\n          },\n          \"env\": {\n            \"TESTING\": true,\n            \"PRODUCTION\": false,\n            \"DEBUG\": true\n          }\n        },\n        \"/app/WEB/node_modules/ember-data/node_modules/@ember-data/adapter\": {\n          \"compatWith\": null,\n          \"debug\": {\n            \"LOG_PAYLOADS\": false,\n            \"LOG_OPERATIONS\": false,\n            \"LOG_MUTATIONS\": false,\n            \"LOG_NOTIFICATIONS\": false,\n            \"LOG_REQUEST_STATUS\": false,\n            \"LOG_IDENTIFIERS\": false,\n            \"LOG_GRAPH\": false,\n            \"LOG_INSTANCE_CACHE\": false\n          },\n          \"deprecations\": {\n            \"DEPRECATE_CATCH_ALL\": true,\n            \"DEPRECATE_3_12\": true,\n            \"DEPRECATE_RSVP_PROMISE\": true,\n            \"DEPRECATE_SAVE_PROMISE_ACCESS\": true,\n            \"DEPRECATE_SNAPSHOT_MODEL_CLASS_ACCESS\": true,\n            \"DEPRECATE_STORE_FIND\": true,\n            \"DEPRECATE_HAS_RECORD\": true,\n            \"DEPRECATE_STRING_ARG_SCHEMAS\": true,\n            \"DEPRECATE_JSON_API_FALLBACK\": true,\n            \"DEPRECATE_MODEL_REOPEN\": true,\n            \"DEPRECATE_EARLY_STATIC\": true,\n            \"DEPRECATE_CLASSIC\": true,\n            \"DEPRECATE_HELPERS\": true,\n            \"DEPRECATE_PROMISE_MANY_ARRAY_BEHAVIORS\": true,\n            \"DEPRECATE_V1CACHE_STORE_APIS\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_TYPE\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_ASYNC\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_INVERSE\": true,\n            \"DEPRECATE_V1_RECORD_DATA\": true,\n            \"DEPRECATE_A_USAGE\": true,\n            \"DEPRECATE_PROMISE_PROXIES\": true,\n            \"DEPRECATE_ARRAY_LIKE\": true,\n            \"DEPRECATE_COMPUTED_CHAINS\": true,\n            \"DEPRECATE_NON_EXPLICIT_POLYMORPHISM\": true\n          },\n          \"features\": {\n            \"SAMPLE_FEATURE_FLAG\": false\n          },\n          \"includeDataAdapter\": true\n        },\n        \"/app/WEB/node_modules/@ember-data/debug\": {\n          \"compatWith\": null,\n          \"debug\": {\n            \"LOG_PAYLOADS\": false,\n            \"LOG_OPERATIONS\": false,\n            \"LOG_MUTATIONS\": false,\n            \"LOG_NOTIFICATIONS\": false,\n            \"LOG_REQUEST_STATUS\": false,\n            \"LOG_IDENTIFIERS\": false,\n            \"LOG_GRAPH\": false,\n            \"LOG_INSTANCE_CACHE\": false\n          },\n          \"deprecations\": {\n            \"DEPRECATE_CATCH_ALL\": true,\n            \"DEPRECATE_3_12\": true,\n            \"DEPRECATE_RSVP_PROMISE\": true,\n            \"DEPRECATE_SAVE_PROMISE_ACCESS\": true,\n            \"DEPRECATE_SNAPSHOT_MODEL_CLASS_ACCESS\": true,\n            \"DEPRECATE_STORE_FIND\": true,\n            \"DEPRECATE_HAS_RECORD\": true,\n            \"DEPRECATE_STRING_ARG_SCHEMAS\": true,\n            \"DEPRECATE_JSON_API_FALLBACK\": true,\n            \"DEPRECATE_MODEL_REOPEN\": true,\n            \"DEPRECATE_EARLY_STATIC\": true,\n            \"DEPRECATE_CLASSIC\": true,\n            \"DEPRECATE_HELPERS\": true,\n            \"DEPRECATE_PROMISE_MANY_ARRAY_BEHAVIORS\": true,\n            \"DEPRECATE_V1CACHE_STORE_APIS\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_TYPE\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_ASYNC\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_INVERSE\": true,\n            \"DEPRECATE_V1_RECORD_DATA\": true,\n            \"DEPRECATE_A_USAGE\": true,\n            \"DEPRECATE_PROMISE_PROXIES\": true,\n            \"DEPRECATE_ARRAY_LIKE\": true,\n            \"DEPRECATE_COMPUTED_CHAINS\": true,\n            \"DEPRECATE_NON_EXPLICIT_POLYMORPHISM\": true\n          },\n          \"features\": {\n            \"SAMPLE_FEATURE_FLAG\": false\n          },\n          \"includeDataAdapter\": true,\n          \"includeDataAdapterInProduction\": true\n        },\n        \"/app/WEB/node_modules/ember-data/node_modules/@ember-data/model\": {\n          \"compatWith\": null,\n          \"debug\": {\n            \"LOG_PAYLOADS\": false,\n            \"LOG_OPERATIONS\": false,\n            \"LOG_MUTATIONS\": false,\n            \"LOG_NOTIFICATIONS\": false,\n            \"LOG_REQUEST_STATUS\": false,\n            \"LOG_IDENTIFIERS\": false,\n            \"LOG_GRAPH\": false,\n            \"LOG_INSTANCE_CACHE\": false\n          },\n          \"deprecations\": {\n            \"DEPRECATE_CATCH_ALL\": true,\n            \"DEPRECATE_3_12\": true,\n            \"DEPRECATE_RSVP_PROMISE\": true,\n            \"DEPRECATE_SAVE_PROMISE_ACCESS\": true,\n            \"DEPRECATE_SNAPSHOT_MODEL_CLASS_ACCESS\": true,\n            \"DEPRECATE_STORE_FIND\": true,\n            \"DEPRECATE_HAS_RECORD\": true,\n            \"DEPRECATE_STRING_ARG_SCHEMAS\": true,\n            \"DEPRECATE_JSON_API_FALLBACK\": true,\n            \"DEPRECATE_MODEL_REOPEN\": true,\n            \"DEPRECATE_EARLY_STATIC\": true,\n            \"DEPRECATE_CLASSIC\": true,\n            \"DEPRECATE_HELPERS\": true,\n            \"DEPRECATE_PROMISE_MANY_ARRAY_BEHAVIORS\": true,\n            \"DEPRECATE_V1CACHE_STORE_APIS\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_TYPE\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_ASYNC\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_INVERSE\": true,\n            \"DEPRECATE_V1_RECORD_DATA\": true,\n            \"DEPRECATE_A_USAGE\": true,\n            \"DEPRECATE_PROMISE_PROXIES\": true,\n            \"DEPRECATE_ARRAY_LIKE\": true,\n            \"DEPRECATE_COMPUTED_CHAINS\": true,\n            \"DEPRECATE_NON_EXPLICIT_POLYMORPHISM\": true\n          },\n          \"features\": {\n            \"SAMPLE_FEATURE_FLAG\": false\n          },\n          \"includeDataAdapter\": true\n        },\n        \"/app/WEB/node_modules/ember-data/node_modules/@ember-data/record-data\": {\n          \"compatWith\": null,\n          \"debug\": {\n            \"LOG_PAYLOADS\": false,\n            \"LOG_OPERATIONS\": false,\n            \"LOG_MUTATIONS\": false,\n            \"LOG_NOTIFICATIONS\": false,\n            \"LOG_REQUEST_STATUS\": false,\n            \"LOG_IDENTIFIERS\": false,\n            \"LOG_GRAPH\": false,\n            \"LOG_INSTANCE_CACHE\": false\n          },\n          \"deprecations\": {\n            \"DEPRECATE_CATCH_ALL\": true,\n            \"DEPRECATE_3_12\": true,\n            \"DEPRECATE_RSVP_PROMISE\": true,\n            \"DEPRECATE_SAVE_PROMISE_ACCESS\": true,\n            \"DEPRECATE_SNAPSHOT_MODEL_CLASS_ACCESS\": true,\n            \"DEPRECATE_STORE_FIND\": true,\n            \"DEPRECATE_HAS_RECORD\": true,\n            \"DEPRECATE_STRING_ARG_SCHEMAS\": true,\n            \"DEPRECATE_JSON_API_FALLBACK\": true,\n            \"DEPRECATE_MODEL_REOPEN\": true,\n            \"DEPRECATE_EARLY_STATIC\": true,\n            \"DEPRECATE_CLASSIC\": true,\n            \"DEPRECATE_HELPERS\": true,\n            \"DEPRECATE_PROMISE_MANY_ARRAY_BEHAVIORS\": true,\n            \"DEPRECATE_V1CACHE_STORE_APIS\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_TYPE\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_ASYNC\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_INVERSE\": true,\n            \"DEPRECATE_V1_RECORD_DATA\": true,\n            \"DEPRECATE_A_USAGE\": true,\n            \"DEPRECATE_PROMISE_PROXIES\": true,\n            \"DEPRECATE_ARRAY_LIKE\": true,\n            \"DEPRECATE_COMPUTED_CHAINS\": true,\n            \"DEPRECATE_NON_EXPLICIT_POLYMORPHISM\": true\n          },\n          \"features\": {\n            \"SAMPLE_FEATURE_FLAG\": false\n          },\n          \"includeDataAdapter\": true\n        },\n        \"/app/WEB/node_modules/ember-data/node_modules/@ember-data/serializer\": {\n          \"compatWith\": null,\n          \"debug\": {\n            \"LOG_PAYLOADS\": false,\n            \"LOG_OPERATIONS\": false,\n            \"LOG_MUTATIONS\": false,\n            \"LOG_NOTIFICATIONS\": false,\n            \"LOG_REQUEST_STATUS\": false,\n            \"LOG_IDENTIFIERS\": false,\n            \"LOG_GRAPH\": false,\n            \"LOG_INSTANCE_CACHE\": false\n          },\n          \"deprecations\": {\n            \"DEPRECATE_CATCH_ALL\": true,\n            \"DEPRECATE_3_12\": true,\n            \"DEPRECATE_RSVP_PROMISE\": true,\n            \"DEPRECATE_SAVE_PROMISE_ACCESS\": true,\n            \"DEPRECATE_SNAPSHOT_MODEL_CLASS_ACCESS\": true,\n            \"DEPRECATE_STORE_FIND\": true,\n            \"DEPRECATE_HAS_RECORD\": true,\n            \"DEPRECATE_STRING_ARG_SCHEMAS\": true,\n            \"DEPRECATE_JSON_API_FALLBACK\": true,\n            \"DEPRECATE_MODEL_REOPEN\": true,\n            \"DEPRECATE_EARLY_STATIC\": true,\n            \"DEPRECATE_CLASSIC\": true,\n            \"DEPRECATE_HELPERS\": true,\n            \"DEPRECATE_PROMISE_MANY_ARRAY_BEHAVIORS\": true,\n            \"DEPRECATE_V1CACHE_STORE_APIS\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_TYPE\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_ASYNC\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_INVERSE\": true,\n            \"DEPRECATE_V1_RECORD_DATA\": true,\n            \"DEPRECATE_A_USAGE\": true,\n            \"DEPRECATE_PROMISE_PROXIES\": true,\n            \"DEPRECATE_ARRAY_LIKE\": true,\n            \"DEPRECATE_COMPUTED_CHAINS\": true,\n            \"DEPRECATE_NON_EXPLICIT_POLYMORPHISM\": true\n          },\n          \"features\": {\n            \"SAMPLE_FEATURE_FLAG\": false\n          },\n          \"includeDataAdapter\": true\n        },\n        \"/app/WEB/node_modules/ember-data/node_modules/@ember-data/store\": {\n          \"compatWith\": null,\n          \"debug\": {\n            \"LOG_PAYLOADS\": false,\n            \"LOG_OPERATIONS\": false,\n            \"LOG_MUTATIONS\": false,\n            \"LOG_NOTIFICATIONS\": false,\n            \"LOG_REQUEST_STATUS\": false,\n            \"LOG_IDENTIFIERS\": false,\n            \"LOG_GRAPH\": false,\n            \"LOG_INSTANCE_CACHE\": false\n          },\n          \"deprecations\": {\n            \"DEPRECATE_CATCH_ALL\": true,\n            \"DEPRECATE_3_12\": true,\n            \"DEPRECATE_RSVP_PROMISE\": true,\n            \"DEPRECATE_SAVE_PROMISE_ACCESS\": true,\n            \"DEPRECATE_SNAPSHOT_MODEL_CLASS_ACCESS\": true,\n            \"DEPRECATE_STORE_FIND\": true,\n            \"DEPRECATE_HAS_RECORD\": true,\n            \"DEPRECATE_STRING_ARG_SCHEMAS\": true,\n            \"DEPRECATE_JSON_API_FALLBACK\": true,\n            \"DEPRECATE_MODEL_REOPEN\": true,\n            \"DEPRECATE_EARLY_STATIC\": true,\n            \"DEPRECATE_CLASSIC\": true,\n            \"DEPRECATE_HELPERS\": true,\n            \"DEPRECATE_PROMISE_MANY_ARRAY_BEHAVIORS\": true,\n            \"DEPRECATE_V1CACHE_STORE_APIS\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_TYPE\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_ASYNC\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_INVERSE\": true,\n            \"DEPRECATE_V1_RECORD_DATA\": true,\n            \"DEPRECATE_A_USAGE\": true,\n            \"DEPRECATE_PROMISE_PROXIES\": true,\n            \"DEPRECATE_ARRAY_LIKE\": true,\n            \"DEPRECATE_COMPUTED_CHAINS\": true,\n            \"DEPRECATE_NON_EXPLICIT_POLYMORPHISM\": true\n          },\n          \"features\": {\n            \"SAMPLE_FEATURE_FLAG\": false\n          },\n          \"includeDataAdapter\": true\n        },\n        \"/app/WEB/node_modules/ember-data\": {\n          \"compatWith\": null,\n          \"debug\": {\n            \"LOG_PAYLOADS\": false,\n            \"LOG_OPERATIONS\": false,\n            \"LOG_MUTATIONS\": false,\n            \"LOG_NOTIFICATIONS\": false,\n            \"LOG_REQUEST_STATUS\": false,\n            \"LOG_IDENTIFIERS\": false,\n            \"LOG_GRAPH\": false,\n            \"LOG_INSTANCE_CACHE\": false\n          },\n          \"deprecations\": {\n            \"DEPRECATE_CATCH_ALL\": true,\n            \"DEPRECATE_3_12\": true,\n            \"DEPRECATE_RSVP_PROMISE\": true,\n            \"DEPRECATE_SAVE_PROMISE_ACCESS\": true,\n            \"DEPRECATE_SNAPSHOT_MODEL_CLASS_ACCESS\": true,\n            \"DEPRECATE_STORE_FIND\": true,\n            \"DEPRECATE_HAS_RECORD\": true,\n            \"DEPRECATE_STRING_ARG_SCHEMAS\": true,\n            \"DEPRECATE_JSON_API_FALLBACK\": true,\n            \"DEPRECATE_MODEL_REOPEN\": true,\n            \"DEPRECATE_EARLY_STATIC\": true,\n            \"DEPRECATE_CLASSIC\": true,\n            \"DEPRECATE_HELPERS\": true,\n            \"DEPRECATE_PROMISE_MANY_ARRAY_BEHAVIORS\": true,\n            \"DEPRECATE_V1CACHE_STORE_APIS\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_TYPE\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_ASYNC\": true,\n            \"DEPRECATE_RELATIONSHIPS_WITHOUT_INVERSE\": true,\n            \"DEPRECATE_V1_RECORD_DATA\": true,\n            \"DEPRECATE_A_USAGE\": true,\n            \"DEPRECATE_PROMISE_PROXIES\": true,\n            \"DEPRECATE_ARRAY_LIKE\": true,\n            \"DEPRECATE_COMPUTED_CHAINS\": true,\n            \"DEPRECATE_NON_EXPLICIT_POLYMORPHISM\": true\n          },\n          \"features\": {\n            \"SAMPLE_FEATURE_FLAG\": false\n          },\n          \"includeDataAdapter\": true\n        }\n      },\n      \"global\": {\n        \"@embroider/macros\": {\n          \"isTesting\": false\n        }\n      }\n    };\n  }\n  function updaterMethods() {\n    return {\n      config,\n      getGlobalConfig,\n      setConfig(packageRoot, value) {\n        runtimeConfig.packages[packageRoot] = value;\n      },\n      setGlobalConfig(key, value) {\n        runtimeConfig.global[key] = value;\n      }\n    };\n  }\n\n  // this is how runtime config can get injected at boot. I'm not sure yet if this\n  // should be public API, but we certainly need it internally to set things like\n  // the global fastboot.isRunning.\n  //\n  // consumers of this API push a function onto\n  // window._embroider_macros_runtime_config. The function is given four methods\n  // which allow it to read and write the per-package and global configs. The\n  // reason for allowing both read & write is that merging strategies are up to\n  // each consumers -- read first, then merge, then write.\n  //\n  // For an example user of this API, see where we generate\n  // embroider_macros_fastboot_init.js' in @embroider/core.\n  let updaters = typeof window !== 'undefined' ? window._embroider_macros_runtime_config : undefined;\n  if (updaters) {\n    let methods = updaterMethods();\n    for (let updater of updaters) {\n      updater(methods);\n    }\n  }\n});","define(\"@embroider/util/ember-private-api\", [\"exports\", \"@embroider/macros/es-compat\", \"@embroider/macros/runtime\"], function (_exports, _esCompat, _runtime) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.isCurriedComponentDefinition = void 0;\n  _exports.lookupCurriedComponentDefinition = lookupCurriedComponentDefinition;\n  let runtime;\n  if ((0, _runtime.macroCondition)(true)) {\n    // new enough ember has a real module we can import\n    runtime = (0, _esCompat.default)(require(\"@glimmer/runtime\"));\n  } else {\n    // older ember has its own internal loader\n    runtime = window.Ember.__loader.require('@glimmer/runtime');\n  }\n  let {\n    isCurriedComponentDefinition,\n    CurriedComponentDefinition,\n    curry,\n    CurriedValue\n  } = runtime;\n\n  // older embers have isCurriedComponentDefinition, new ones have CurriedValue\n  // and instanceof CurriedValue seems good enough.\n  _exports.isCurriedComponentDefinition = isCurriedComponentDefinition;\n  if (!isCurriedComponentDefinition) {\n    _exports.isCurriedComponentDefinition = isCurriedComponentDefinition = function (value) {\n      return value instanceof CurriedValue;\n    };\n  }\n  function runtimeResolver(owner) {\n    let resolver = owner.lookup('renderer:-dom')._runtimeResolver;\n    if (resolver) {\n      return resolver;\n    }\n    let entry = Object.entries(owner.__container__.cache).find(e => e[0].startsWith('template-compiler:main-'));\n    if (entry) {\n      return entry[1].resolver.resolver;\n    }\n    throw new Error(`@embroider/util couldn't locate the runtime resolver on this ember version`);\n  }\n  function lookupCurriedComponentDefinition(name, owner) {\n    let resolver = runtimeResolver(owner);\n    if (typeof resolver.lookupComponentHandle === 'function') {\n      let handle = resolver.lookupComponentHandle(name, contextForLookup(owner));\n      if (handle != null) {\n        return new CurriedComponentDefinition(resolver.resolve(handle), null);\n      }\n    }\n\n    // here we're doing the same thing the internal currying does, in order to\n    // generate a sane error message (even though we don't actually use\n    // resolvedDefinition as part of our return value).\n    let resolvedDefinition = resolver.lookupComponent(name, owner);\n    if (!resolvedDefinition) {\n      throw new Error(`Attempted to resolve \\`${name}\\` via ensureSafeComponent, but nothing was found.`);\n    }\n    return curry(0, name, owner, {\n      named: {},\n      positional: []\n    });\n  }\n  function contextForLookup(owner) {\n    if ((0, _runtime.macroCondition)(true)) {\n      return owner;\n    } else {\n      return {\n        owner\n      };\n    }\n  }\n});","define(\"@embroider/util/index\", [\"exports\", \"@embroider/macros/runtime\", \"@ember/debug\", \"@ember/application\", \"@embroider/util/ember-private-api\", \"@ember/component/helper\"], function (_exports, _runtime, _debug, _application, _emberPrivateApi, _helper) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.EnsureSafeComponentHelper = void 0;\n  _exports.ensureSafeComponent = ensureSafeComponent;\n  function ensureSafeComponent(value, thingWithOwner) {\n    if (typeof value === 'string') {\n      return handleString(value, thingWithOwner);\n    } else if ((0, _emberPrivateApi.isCurriedComponentDefinition)(value)) {\n      return value;\n    } else if (value == null) {\n      return value;\n    } else {\n      return handleClass(value, thingWithOwner);\n    }\n  }\n  class EnsureSafeComponentHelper extends _helper.default {\n    compute(_ref) {\n      let [value] = _ref;\n      return ensureSafeComponent(value, this);\n    }\n  }\n  _exports.EnsureSafeComponentHelper = EnsureSafeComponentHelper;\n  function handleString(name, thingWithOwner) {\n    (true && !(false) && (0, _debug.deprecate)(`You're trying to invoke the component \"${name}\" by passing its name as a string. This won't work under Embroider.`, false, {\n      id: 'ensure-safe-component.string',\n      url: 'https://github.com/embroider-build/embroider/blob/main/REPLACING-COMPONENT-HELPER.md#when-youre-passing-a-component-to-someone-else',\n      until: 'embroider',\n      for: '@embroider/util',\n      since: '0.27.0'\n    }));\n    let owner = (0, _application.getOwner)(thingWithOwner);\n    return (0, _emberPrivateApi.lookupCurriedComponentDefinition)(name, owner);\n  }\n  function ensureRegistered(klass, owner) {\n    let service = owner.lookup('service:-ensure-registered');\n    (true && !(service) && (0, _debug.assert)('Could not lookup private -ensure-registered service', service));\n    return service.register(klass, owner);\n  }\n  function handleClass(klass, thingWithOwner) {\n    if ((0, _runtime.macroCondition)(true)) {\n      return klass;\n    } else {\n      let owner = (0, _application.getOwner)(thingWithOwner);\n      let nonce = ensureRegistered(klass, owner);\n      return (0, _emberPrivateApi.lookupCurriedComponentDefinition)(nonce, owner);\n    }\n  }\n});","define(\"@embroider/util/services/ensure-registered\", [\"exports\", \"@ember/service\", \"@ember/application\"], function (_exports, _service, _application) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n  function _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\n  function _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n  class EnsureRegisteredService extends _service.default {\n    constructor() {\n      super(...arguments);\n      _defineProperty(this, \"classNonces\", new WeakMap());\n      _defineProperty(this, \"nonceCounter\", 0);\n    }\n    register(klass) {\n      let owner = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _application.getOwner)(this);\n      let nonce = this.classNonces.get(klass);\n      if (nonce == null) {\n        nonce = `-ensure${this.nonceCounter++}`;\n        this.classNonces.set(klass, nonce);\n        owner.register(`component:${nonce}`, klass);\n      }\n      return nonce;\n    }\n  }\n  _exports.default = EnsureRegisteredService;\n});","define(\"@glimmer/component/-private/base-component-manager\", [\"exports\", \"@glimmer/component/-private/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = BaseComponentManager;\n  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n  function _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\n  function _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n  /**\n   * This factory function returns a component manager class with common behavior\n   * that can be extend to add Glimmer.js- or Ember.js-specific functionality. As\n   * these environments converge, the need for two component manager\n   * implementations (and thus this factory) should go away.\n   */\n  function BaseComponentManager(setOwner, getOwner, capabilities) {\n    return class {\n      static create(attrs) {\n        let owner = getOwner(attrs);\n        return new this(owner);\n      }\n      constructor(owner) {\n        _defineProperty(this, \"capabilities\", capabilities);\n        setOwner(this, owner);\n      }\n      createComponent(ComponentClass, args) {\n        if (true /* DEBUG */) {\n          _component.ARGS_SET.set(args.named, true);\n        }\n        return new ComponentClass(getOwner(this), args.named);\n      }\n      getContext(component) {\n        return component;\n      }\n    };\n  }\n});","define(\"@glimmer/component/-private/component\", [\"exports\", \"@glimmer/component/-private/owner\", \"@glimmer/component/-private/destroyables\"], function (_exports, _owner, _destroyables) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = _exports.ARGS_SET = void 0;\n  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n  function _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\n  function _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n  // This provides a type-safe `WeakMap`: the getter and setter link the key to a\n  // specific value. This is how `WeakMap`s actually behave, but the TS type\n  // system does not (yet!) have a good way to capture that for types like\n  // `WeakMap` where the type is generic over another generic type (here, `Args`).\n\n  // SAFETY: this only holds because we *only* acces this when `DEBUG` is `true`.\n  // There is not a great way to connect that data in TS at present.\n  let ARGS_SET;\n  _exports.ARGS_SET = ARGS_SET;\n  if (true /* DEBUG */) {\n    _exports.ARGS_SET = ARGS_SET = new WeakMap();\n  }\n\n  // --- Type utilities for component signatures --- //\n  // Type-only \"symbol\" to use with `EmptyObject` below, so that it is *not*\n  // equivalent to an empty interface.\n\n  /**\n   * This provides us a way to have a \"fallback\" which represents an empty object,\n   * without the downsides of how TS treats `{}`. Specifically: this will\n   * correctly leverage \"excess property checking\" so that, given a component\n   * which has no named args, if someone invokes it with any named args, they will\n   * get a type error.\n   *\n   * @internal This is exported so declaration emit works (if it were not emitted,\n   *   declarations which fall back to it would not work). It is *not* intended for\n   *   public usage, and the specific mechanics it uses may change at any time.\n   *   The location of this export *is* part of the public API, because moving it\n   *   will break existing declarations, but is not legal for end users to import\n   *   themselves, so ***DO NOT RELY ON IT***.\n   */\n\n  /** Given a signature `S`, get back the `Args` type. */\n\n  /**\n   * Given any allowed shorthand form of a signature, desugars it to its full\n   * expanded type.\n   *\n   * @internal This is only exported so we can avoid duplicating it in\n   *   [Glint](https://github.com/typed-ember/glint) or other such tooling. It is\n   *   *not* intended for public usage, and the specific mechanics it uses may\n   *   change at any time. Although the signature produced by is part of Glimmer's\n   *   public API the existence and mechanics of this specific symbol are *not*,\n   *   so ***DO NOT RELY ON IT***.\n   */\n  // The conditional type here is because TS applies conditional types\n  // distributively. This means that for union types, checks like `keyof T` get\n  // all the keys from all elements of the union, instead of ending up as `never`\n  // and then always falling into the `Signature` path instead of falling back to\n  // the legacy args handling path.\n\n  /**\n   * @internal we use this type for convenience internally; inference means users\n   *   should not normally need to name it\n   */\n\n  /**\n   * The `Component` class defines an encapsulated UI element that is rendered to\n   * the DOM. A component is made up of a template and, optionally, this component\n   * object.\n   *\n   * ## Defining a Component\n   *\n   * To define a component, subclass `Component` and add your own properties,\n   * methods and lifecycle hooks:\n   *\n   * ```ts\n   * import Component from '@glimmer/component';\n   *\n   * export default class extends Component {\n   * }\n   * ```\n   *\n   * ## Lifecycle Hooks\n   *\n   * Lifecycle hooks allow you to respond to changes to a component, such as when\n   * it gets created, rendered, updated or destroyed. To add a lifecycle hook to a\n   * component, implement the hook as a method on your component subclass.\n   *\n   * For example, to be notified when Glimmer has rendered your component so you\n   * can attach a legacy jQuery plugin, implement the `didInsertElement()` method:\n   *\n   * ```ts\n   * import Component from '@glimmer/component';\n   *\n   * export default class extends Component {\n   *   didInsertElement() {\n   *     $(this.element).pickadate();\n   *   }\n   * }\n   * ```\n   *\n   * ## Data for Templates\n   *\n   * `Component`s have two different kinds of data, or state, that can be\n   * displayed in templates:\n   *\n   * 1. Arguments\n   * 2. Properties\n   *\n   * Arguments are data that is passed in to a component from its parent\n   * component. For example, if I have a `UserGreeting` component, I can pass it\n   * a name and greeting to use:\n   *\n   * ```hbs\n   * <UserGreeting @name=\"Ricardo\" @greeting=\"Olá\" />\n   * ```\n   *\n   * Inside my `UserGreeting` template, I can access the `@name` and `@greeting`\n   * arguments that I've been given:\n   *\n   * ```hbs\n   * {{@greeting}}, {{@name}}!\n   * ```\n   *\n   * Arguments are also available inside my component:\n   *\n   * ```ts\n   * console.log(this.args.greeting); // prints \"Olá\"\n   * ```\n   *\n   * Properties, on the other hand, are internal to the component and declared in\n   * the class. You can use properties to store data that you want to show in the\n   * template, or pass to another component as an argument.\n   *\n   * ```ts\n   * import Component from '@glimmer/component';\n   *\n   * export default class extends Component {\n   *   user = {\n   *     name: 'Robbie'\n   *   }\n   * }\n   * ```\n   *\n   * In the above example, we've defined a component with a `user` property that\n   * contains an object with its own `name` property.\n   *\n   * We can render that property in our template:\n   *\n   * ```hbs\n   * Hello, {{user.name}}!\n   * ```\n   *\n   * We can also take that property and pass it as an argument to the\n   * `UserGreeting` component we defined above:\n   *\n   * ```hbs\n   * <UserGreeting @greeting=\"Hello\" @name={{user.name}} />\n   * ```\n   *\n   * ## Arguments vs. Properties\n   *\n   * Remember, arguments are data that was given to your component by its parent\n   * component, and properties are data your component has defined for itself.\n   *\n   * You can tell the difference between arguments and properties in templates\n   * because arguments always start with an `@` sign (think \"A is for arguments\"):\n   *\n   * ```hbs\n   * {{@firstName}}\n   * ```\n   *\n   * We know that `@firstName` came from the parent component, not the current\n   * component, because it starts with `@` and is therefore an argument.\n   *\n   * On the other hand, if we see:\n   *\n   * ```hbs\n   * {{name}}\n   * ```\n   *\n   * We know that `name` is a property on the component. If we want to know where\n   * the data is coming from, we can go look at our component class to find out.\n   *\n   * Inside the component itself, arguments always show up inside the component's\n   * `args` property. For example, if `{{@firstName}}` is `Tom` in the template,\n   * inside the component `this.args.firstName` would also be `Tom`.\n   */\n  class BaseComponent {\n    /**\n     * Constructs a new component and assigns itself the passed properties. You\n     * should not construct new components yourself. Instead, Glimmer will\n     * instantiate new components automatically as it renders.\n     *\n     * @param owner\n     * @param args\n     */\n    constructor(owner, args) {\n      /**\n       * Named arguments passed to the component from its parent component.\n       * They can be accessed in JavaScript via `this.args.argumentName` and in the template via `@argumentName`.\n       *\n       * Say you have the following component, which will have two `args`, `firstName` and `lastName`:\n       *\n       * ```hbs\n       * <my-component @firstName=\"Arthur\" @lastName=\"Dent\" />\n       * ```\n       *\n       * If you needed to calculate `fullName` by combining both of them, you would do:\n       *\n       * ```ts\n       * didInsertElement() {\n       *   console.log(`Hi, my full name is ${this.args.firstName} ${this.args.lastName}`);\n       * }\n       * ```\n       *\n       * While in the template you could do:\n       *\n       * ```hbs\n       * <p>Welcome, {{@firstName}} {{@lastName}}!</p>\n       * ```\n       */\n      _defineProperty(this, \"args\", void 0);\n      if (true /* DEBUG */ && !(owner !== null && typeof owner === 'object' && ARGS_SET.has(args))) {\n        throw new Error(`You must pass both the owner and args to super() in your component: ${this.constructor.name}. You can pass them directly, or use ...arguments to pass all arguments through.`);\n      }\n      this.args = args;\n      (0, _owner.setOwner)(this, owner);\n    }\n    get isDestroying() {\n      return (0, _destroyables.isDestroying)(this);\n    }\n    get isDestroyed() {\n      return (0, _destroyables.isDestroyed)(this);\n    }\n\n    /**\n     * Called before the component has been removed from the DOM.\n     */\n    willDestroy() {}\n  }\n  _exports.default = BaseComponent;\n});","define(\"@glimmer/component/-private/destroyables\", [\"exports\", \"ember\"], function (_exports, _ember) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.isDestroying = _exports.isDestroyed = void 0;\n  const isDestroying = _ember.default._isDestroying;\n  _exports.isDestroying = isDestroying;\n  const isDestroyed = _ember.default._isDestroyed;\n  _exports.isDestroyed = isDestroyed;\n});","define(\"@glimmer/component/-private/ember-component-manager\", [\"exports\", \"ember\", \"@ember/object\", \"@ember/application\", \"@ember/component\", \"@ember/runloop\", \"@glimmer/component/-private/base-component-manager\", \"@glimmer/component/-private/destroyables\"], function (_exports, _ember, _object, _application, _component, _runloop, _baseComponentManager, destroyables) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const {\n    setDestroyed,\n    setDestroying\n  } = destroyables;\n  const CAPABILITIES = true // @ts-ignore\n  // @ts-ignore\n  ? (0, _component.capabilities)('3.13', {\n    destructor: true,\n    asyncLifecycleCallbacks: false,\n    updateHook: false\n  }) : (0, _component.capabilities)('3.4', {\n    destructor: true,\n    asyncLifecycleCallbacks: false\n  });\n  const scheduledDestroyComponent = true ? undefined : (component, meta) => {\n    if (component.isDestroyed) {\n      return;\n    }\n    _ember.default.destroy(component);\n    meta.setSourceDestroyed();\n    setDestroyed(component);\n  };\n  const destroy = true ? _ember.default.destroy : component => {\n    if (component.isDestroying) {\n      return;\n    }\n    let meta = _ember.default.meta(component);\n    meta.setSourceDestroying();\n    setDestroying(component);\n    (0, _runloop.schedule)('actions', component, component.willDestroy);\n    (0, _runloop.schedule)('destroy', void 0, scheduledDestroyComponent, component, meta);\n  };\n  const registerDestructor = true ? _ember.default._registerDestructor : true ? _ember.default.__loader.require('@glimmer/runtime').registerDestructor : undefined;\n\n  /**\n   * This component manager runs in Ember.js environments and extends the base component manager to:\n   *\n   * 1. Properly destroy the component's associated `meta` data structure\n   * 2. Schedule destruction using Ember's runloop\n   */\n  class EmberGlimmerComponentManager extends (0, _baseComponentManager.default)(_application.setOwner, _application.getOwner, CAPABILITIES) {\n    createComponent(ComponentClass, args) {\n      const component = super.createComponent(ComponentClass, args);\n      if (true) {\n        registerDestructor(component, () => {\n          component.willDestroy();\n        });\n      }\n      return component;\n    }\n    destroyComponent(component) {\n      destroy(component);\n    }\n  }\n  // In Ember 3.12 and earlier, the updateComponent hook was mandatory.\n  // As of Ember 3.13, the `args` object is stable and each property of the\n  // object participates in the autotrack stack on its own. This means we do not\n  // need to set the `args` property on the component instance to invalidate\n  // tracked getters that rely on `args`, and therefore don't require the `updateComponent`\n  // hook at all.\n  if (!true) {\n    EmberGlimmerComponentManager.prototype.updateComponent = function updateComponent(component, args) {\n      let argSnapshot = args.named;\n      if (true /* DEBUG */) {\n        argSnapshot = Object.freeze(argSnapshot);\n      }\n      (0, _object.set)(component, 'args', argSnapshot);\n    };\n  }\n  var _default = EmberGlimmerComponentManager;\n  _exports.default = _default;\n});","define(\"@glimmer/component/-private/owner\", [\"exports\", \"@ember/application\"], function (_exports, _application) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"setOwner\", {\n    enumerable: true,\n    get: function () {\n      return _application.setOwner;\n    }\n  });\n});","define(\"@glimmer/component/index\", [\"exports\", \"@ember/component\", \"@glimmer/component/-private/ember-component-manager\", \"@glimmer/component/-private/component\"], function (_exports, _component, _emberComponentManager, _component2) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  // Hax because the old version of `@types/ember__component` the `1.x` branch\n  // uses does not provide any types for `setComponentManager` *and* because we\n  // are using a very old version of `setComponentManager` for versions before\n  // Ember 3.8.\n\n  let GlimmerComponent = _component2.default;\n  if (true /* DEBUG */) {\n    // Add assertions against using Glimmer.js only APIs\n\n    // TODO: Add GlimmerComponent API docs link to these messages once API docs are live\n    function throwMethodUseError(methodName) {\n      throw new Error(`You attempted to define the '${methodName}' method on a Glimmer Component, but that lifecycle hook does not exist in Ember.js applications, it only exists in Glimmer.js apps. You can rename this method, and you can trigger it using a modifier such as {{did-insert}} from '@ember/render-modifiers': https://github.com/emberjs/ember-render-modifiers.`);\n    }\n    function throwPropertyUseError(propertyName) {\n      throw new Error(`You attempted to access the '${propertyName}' property on a Glimmer Component, but that property does not exist in Ember.js applications, it only exists in Glimmer.js apps. You define a class field with the same name on your component class and it will overwrite this error message, but it will not be used by the framework.`);\n    }\n    GlimmerComponent = class GlimmerDebugComponent extends GlimmerComponent {\n      constructor(owner, args) {\n        super(owner, args);\n        if (typeof this['didInsertElement'] === 'function') {\n          throwMethodUseError('didInsertElement');\n        }\n        if (typeof this['didUpdate'] === 'function') {\n          throwMethodUseError('didUpdate');\n        }\n      }\n    };\n    let proto = GlimmerComponent.prototype;\n    function defineErrorProp(proto, key, getterMethod) {\n      Object.defineProperty(proto, key, {\n        get: () => getterMethod(key),\n        set(value) {\n          Object.defineProperty(this, key, {\n            value\n          });\n        }\n      });\n    }\n\n    // Methods should still throw whenever they are accessed\n    defineErrorProp(proto, 'bounds', throwPropertyUseError);\n    defineErrorProp(proto, 'element', throwPropertyUseError);\n    defineErrorProp(proto, 'debugName', throwPropertyUseError);\n  }\n  if (true) {\n    (0, _component.setComponentManager)(owner => {\n      return new _emberComponentManager.default(owner);\n    }, GlimmerComponent);\n  } else {\n    (0, _component.setComponentManager)('glimmer', GlimmerComponent);\n  }\n  var _default = GlimmerComponent;\n  _exports.default = _default;\n});","define(\"ember-cached-decorator-polyfill/index\", [\"exports\", \"@glimmer/tracking/primitives/cache\", \"@ember/debug\"], function (_exports, _cache, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.cached = cached;\n  function cached() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n    const [target, key, descriptor] = args;\n\n    // Error on `@cached()`, `@cached(...args)`, and `@cached propName = value;`\n    (true && !(target !== undefined) && (0, _debug.assert)('You attempted to use @cached(), which is not necessary nor supported. Remove the parentheses and you will be good to go!', target !== undefined));\n    (true && !(typeof target === 'object' && typeof key === 'string' && typeof descriptor === 'object' && args.length === 3) && (0, _debug.assert)(`You attempted to use @cached on with ${args.length > 1 ? 'arguments' : 'an argument'} ( @cached(${args.map(d => `'${d}'`).join(', ')}), which is not supported. Dependencies are automatically tracked, so you can just use ${'`@cached`'}`, typeof target === 'object' && typeof key === 'string' && typeof descriptor === 'object' && args.length === 3));\n    (true && !(typeof descriptor.get == 'function') && (0, _debug.assert)(`The @cached decorator must be applied to getters. '${key}' is not a getter.`, typeof descriptor.get == 'function'));\n    const caches = new WeakMap();\n    const getter = descriptor.get;\n    descriptor.get = function () {\n      if (!caches.has(this)) caches.set(this, (0, _cache.createCache)(getter.bind(this)));\n      return (0, _cache.getValue)(caches.get(this));\n    };\n  }\n});","define(\"ember-cli-app-version/initializer-factory\", [\"exports\", \"ember\"], function (_exports, _ember) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = initializerFactory;\n  const {\n    libraries\n  } = _ember.default;\n  function initializerFactory(name, version) {\n    let registered = false;\n    return function () {\n      if (!registered && name && version) {\n        libraries.register(name, version);\n        registered = true;\n      }\n    };\n  }\n});","define(\"ember-cli-app-version/utils/regexp\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.versionRegExp = _exports.versionExtendedRegExp = _exports.shaRegExp = void 0;\n  const versionRegExp = /\\d+[.]\\d+[.]\\d+/; // Match any number of 3 sections of digits separated by .\n  _exports.versionRegExp = versionRegExp;\n  const versionExtendedRegExp = /\\d+[.]\\d+[.]\\d+-[a-z]*([.]\\d+)?/; // Match the above but also hyphen followed by any number of lowercase letters, then optionally period and digits\n  _exports.versionExtendedRegExp = versionExtendedRegExp;\n  const shaRegExp = /[a-z\\d]{8}$/; // Match 8 lowercase letters and digits, at the end of the string only (to avoid matching with version extended part)\n  _exports.shaRegExp = shaRegExp;\n});","define(\"ember-code-snippet/-private/extension\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = getExtension;\n  function getExtension(name) {\n    let m = /\\.(\\w+)$/i.exec(name);\n    return m ? m[1].toLowerCase() : undefined;\n  }\n});","define(\"ember-code-snippet/-private/get-snippet\", [\"exports\", \"ember-code-snippet/snippets\", \"ember-code-snippet/-private/language\", \"ember-code-snippet/-private/extension\", \"ember-code-snippet/-private/unindent\", \"@ember/debug\"], function (_exports, _snippets, _language, _extension, _unindent, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = getSnippet;\n  function getSnippet(name) {\n    let unindent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n    let source = name.split('/').reduce((dir, name) => dir && dir[name], _snippets.default);\n    (true && !(source) && (0, _debug.assert)(`Code snippet with name \"${name}\" not found.`, source));\n    source = source.replace(/^(\\s*\\n)*/, '').replace(/\\s*$/, '');\n    if (unindent) {\n      source = (0, _unindent.default)(source);\n    }\n    let language = (0, _language.default)(name);\n    let extension = (0, _extension.default)(name);\n    return {\n      source,\n      language,\n      extension\n    };\n  }\n});","define(\"ember-code-snippet/-private/language\", [\"exports\", \"ember-code-snippet/-private/extension\"], function (_exports, _extension) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = getLanguage;\n  function getLanguage(name) {\n    let ext = (0, _extension.default)(name);\n    if (ext) {\n      switch (ext) {\n        case 'js':\n          return 'javascript';\n        case 'coffee':\n          return 'coffeescript';\n        case 'hbs':\n          return 'handlebars';\n        case 'css':\n          return 'css';\n        case 'scss':\n          return 'scss';\n        case 'less':\n          return 'less';\n        case 'emblem':\n          return 'emblem';\n        case 'ts':\n          return 'typescript';\n        default:\n          return ext;\n      }\n    }\n  }\n});","define(\"ember-code-snippet/-private/unindent\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = unindent;\n  function unindent(src) {\n    let match,\n      min,\n      lines = src.split(\"\\n\").filter(l => l !== '');\n    for (let i = 0; i < lines.length; i++) {\n      match = /^[ \\t]*/.exec(lines[i]);\n      if (match && (typeof min === 'undefined' || min > match[0].length)) {\n        min = match[0].length;\n      }\n    }\n    if (typeof min !== 'undefined' && min > 0) {\n      src = src.replace(new RegExp(\"^[ \\t]{\" + min + \"}\", 'gm'), \"\");\n    }\n    return src;\n  }\n});","define(\"ember-code-snippet/helpers/get-code-snippet\", [\"exports\", \"@ember/component/helper\", \"ember-code-snippet\"], function (_exports, _helper, _emberCodeSnippet) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = (0, _helper.helper)(function (_ref, _ref2) {\n    let [name] = _ref;\n    let {\n      unindent = true\n    } = _ref2;\n    return (0, _emberCodeSnippet.getCodeSnippet)(name, unindent);\n  });\n  _exports.default = _default;\n});","define(\"ember-code-snippet/index\", [\"exports\", \"ember-code-snippet/-private/get-snippet\"], function (_exports, _getSnippet) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"getCodeSnippet\", {\n    enumerable: true,\n    get: function () {\n      return _getSnippet.default;\n    }\n  });\n});","define(\"ember-code-snippet/snippets\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = {\n    \"del-button.markup\": \"<div class=\\\"input-group\\\">\\r\\n  <input id=\\\"myId\\\" type=\\\"text\\\" class=\\\"form-control form-control-sm\\\">\\r\\n  <div class=\\\"input-group-append\\\">\\r\\n    <button class=\\\"clearButton btn btn-sm btn-outline-secondary\\\" type=\\\"button\\\" data-ref=\\\"#myId\\\">\\r\\n      <i class=\\\"fas fa-times\\\"></i>\\r\\n    </button>\\r\\n  </div>\\r\\n</div>\",\n    \"fetch.js\": \"/**\\r\\n * MODO CORRETTO PER EFFETTUARE CHIAMATE FETCH\\r\\n * (Quando possibile, usare ember-data anzichè chiamate fetch)\\r\\n */\\r\\n\\r\\n@service fetch;\\r\\n// ...\\r\\nthis.fetch\\r\\n  .call('entity/getAll', 'GET', null, {}, true, this.session)\\r\\n  .then((res) => {\\r\\n    // ...\\r\\n  })\\r\\n  .catch((e) => {\\r\\n    // ...\\r\\n  });\",\n    \"prism.markup\": \"{{#let (get-code-snippet \\\"prism.markup\\\") as |snippet|}}\\r\\n  <CodeBlock @language={{snippet.language}} @code={{snippet.source}}/>\\r\\n{{/let}}\\r\\n\\r\\n<!-- dove prism.markup è il nome del file che contiene il codice e\\r\\nsi trova nella cartella snippets (root principale) -->\"\n  };\n  _exports.default = _default;\n});","define(\"ember-concurrency/-private/async-arrow-runtime\", [\"exports\", \"ember-concurrency/-private/task-factory\"], function (_exports, _taskFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.buildTask = buildTask;\n  /**\n   * This builder function is called by the transpiled code from\n   * `task(async () => {})`. See lib/babel-plugin-transform-ember-concurrency-async-tasks.js\n   *\n   * @private\n   */\n  function buildTask(contextFn, options, taskName, bufferPolicyName) {\n    let optionsWithBufferPolicy = options;\n    if (bufferPolicyName) {\n      optionsWithBufferPolicy = Object.assign({}, optionsWithBufferPolicy);\n      optionsWithBufferPolicy[bufferPolicyName] = true;\n    }\n    const result = contextFn();\n    const taskFactory = new _taskFactory.TaskFactory(taskName || '<unknown>', result.generator, optionsWithBufferPolicy);\n    return taskFactory.createTask(result.context);\n  }\n});","define(\"ember-concurrency/-private/cancelable-promise-helpers\", [\"exports\", \"@ember/debug\", \"rsvp\", \"ember-concurrency/-private/task-instance\", \"ember-concurrency/-private/external/yieldables\"], function (_exports, _debug, _rsvp, _taskInstance, _yieldables) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.race = _exports.hashSettled = _exports.hash = _exports.allSettled = _exports.all = void 0;\n  /**\n   * A cancelation-aware variant of [Promise.all](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all).\n   * The normal version of a `Promise.all` just returns a regular, uncancelable\n   * Promise. The `ember-concurrency` variant of `all()` has the following\n   * additional behavior:\n   *\n   * - if the task that `yield`ed `all()` is canceled, any of the\n   *   {@linkcode TaskInstance}s passed in to `all` will be canceled\n   * - if any of the {@linkcode TaskInstance}s (or regular promises) passed in reject (or\n   *   are canceled), all of the other unfinished `TaskInstance`s will\n   *   be automatically canceled.\n   *\n   * [Check out the \"Awaiting Multiple Child Tasks example\"](/docs/examples/joining-tasks)\n   */\n  const all = taskAwareVariantOf(_rsvp.default.Promise, 'all', identity);\n\n  /**\n   * A cancelation-aware variant of [RSVP.allSettled](https://api.emberjs.com/ember/release/functions/rsvp/allSettled).\n   * The normal version of a `RSVP.allSettled` just returns a regular, uncancelable\n   * Promise. The `ember-concurrency` variant of `allSettled()` has the following\n   * additional behavior:\n   *\n   * - if the task that `yield`ed `allSettled()` is canceled, any of the\n   *   {@linkcode TaskInstance}s passed in to `allSettled` will be canceled\n   */\n  _exports.all = all;\n  const allSettled = taskAwareVariantOf(_rsvp.default, 'allSettled', identity);\n\n  /**\n   * A cancelation-aware variant of [Promise.race](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race).\n   * The normal version of a `Promise.race` just returns a regular, uncancelable\n   * Promise. The `ember-concurrency` variant of `race()` has the following\n   * additional behavior:\n   *\n   * - if the task that `yield`ed `race()` is canceled, any of the\n   *   {@linkcode TaskInstance}s passed in to `race` will be canceled\n   * - once any of the tasks/promises passed in complete (either success, failure,\n   *   or cancelation), any of the {@linkcode TaskInstance}s passed in will be canceled\n   *\n   * [Check out the \"Awaiting Multiple Child Tasks example\"](/docs/examples/joining-tasks)\n   */\n  _exports.allSettled = allSettled;\n  const race = taskAwareVariantOf(_rsvp.Promise, 'race', identity);\n\n  /**\n   * A cancelation-aware variant of [RSVP.hash](https://api.emberjs.com/ember/release/functions/rsvp/hash).\n   * The normal version of a `RSVP.hash` just returns a regular, uncancelable\n   * Promise. The `ember-concurrency` variant of `hash()` has the following\n   * additional behavior:\n   *\n   * - if the task that `yield`ed `hash()` is canceled, any of the\n   *   {@linkcode TaskInstance}s passed in to `hash` will be canceled\n   * - if any of the items rejects/cancels, all other cancelable items\n   *   (e.g. {@linkcode TaskInstance}s) will be canceled\n   */\n  _exports.race = race;\n  const hash = taskAwareVariantOf(_rsvp.default, 'hash', getValues);\n\n  /**\n   * A cancelation-aware variant of [RSVP.hashSettled](https://api.emberjs.com/ember/release/functions/rsvp/hashSettled).\n   * The normal version of a `RSVP.hashSettled` just returns a regular, uncancelable\n   * Promise. The `ember-concurrency` variant of `hashSettled()` has the following\n   * additional behavior:\n   *\n   * - if the task that `yield`ed `hashSettled()` is canceled, any of the\n   *   {@linkcode TaskInstance}s passed in to `hashSettled` will be canceled\n   */\n  _exports.hash = hash;\n  const hashSettled = taskAwareVariantOf(_rsvp.default, 'hashSettled', getValues);\n  _exports.hashSettled = hashSettled;\n  function identity(obj) {\n    return obj;\n  }\n  function getValues(obj) {\n    return Object.keys(obj).map(k => obj[k]);\n  }\n  function castForPromiseHelper(castable) {\n    if (castable) {\n      if (castable instanceof _taskInstance.TaskInstance) {\n        // Mark TaskInstances, including those that performed synchronously and\n        // have finished already, as having their errors handled, as if they had\n        // been then'd, which this is emulating.\n        castable.executor.asyncErrorsHandled = true;\n      } else if (castable instanceof _yieldables.Yieldable) {\n        // Cast to promise\n        return castable._toPromise();\n      }\n    }\n    return castable;\n  }\n  function castAwaitables(arrOrHash, callback) {\n    if (Array.isArray(arrOrHash)) {\n      return arrOrHash.map(callback);\n    } else if (typeof arrOrHash === 'object' && arrOrHash !== null) {\n      let obj = {};\n      Object.keys(arrOrHash).forEach(key => {\n        obj[key] = callback(arrOrHash[key]);\n      });\n      return obj;\n    } else {\n      // :shruggie:\n      return arrOrHash;\n    }\n  }\n  function taskAwareVariantOf(obj, method, getItems) {\n    return function (awaitable) {\n      let awaitables = castAwaitables(awaitable, castForPromiseHelper);\n      let items = getItems(awaitables);\n      (true && !(Array.isArray(items)) && (0, _debug.assert)(`'${method}' expects an array.`, Array.isArray(items)));\n      let defer = _rsvp.default.defer();\n      obj[method](awaitables).then(defer.resolve, defer.reject);\n      let hasCancelled = false;\n      let cancelAll = () => {\n        if (hasCancelled) {\n          return;\n        }\n        hasCancelled = true;\n        items.forEach(it => {\n          if (it) {\n            if (it instanceof _taskInstance.TaskInstance) {\n              it.cancel();\n            } else if (typeof it[_yieldables.cancelableSymbol] === 'function') {\n              it[_yieldables.cancelableSymbol]();\n            }\n          }\n        });\n      };\n      let promise = defer.promise.finally(cancelAll);\n      promise[_yieldables.cancelableSymbol] = cancelAll;\n      return promise;\n    };\n  }\n});","define(\"ember-concurrency/-private/ember-environment\", [\"exports\", \"ember\", \"rsvp\", \"ember-concurrency/-private/external/environment\", \"@ember/debug\", \"@ember/runloop\"], function (_exports, _ember, _rsvp, _environment, _debug, _runloop) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.EmberEnvironment = _exports.EMBER_ENVIRONMENT = void 0;\n  class EmberEnvironment extends _environment.Environment {\n    assert() {\n      (true && !(false) && (0, _debug.assert)(...arguments));\n    }\n    async(callback) {\n      (0, _runloop.join)(() => (0, _runloop.schedule)('actions', callback));\n    }\n    reportUncaughtRejection(error) {\n      (0, _runloop.next)(null, function () {\n        if (_ember.default.onerror) {\n          _ember.default.onerror(error);\n        } else {\n          throw error;\n        }\n      });\n    }\n    defer() {\n      return (0, _rsvp.defer)();\n    }\n    globalDebuggingEnabled() {\n      return _ember.default.ENV.DEBUG_TASKS;\n    }\n  }\n  _exports.EmberEnvironment = EmberEnvironment;\n  const EMBER_ENVIRONMENT = new EmberEnvironment();\n  _exports.EMBER_ENVIRONMENT = EMBER_ENVIRONMENT;\n});","define(\"ember-concurrency/-private/external/environment\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.Environment = _exports.DEFAULT_ENVIRONMENT = void 0;\n  class Environment {\n    assert() {}\n    async(callback) {\n      Promise.resolve().then(callback);\n    }\n    reportUncaughtRejection() {\n      this.async(error => {\n        throw error;\n      });\n    }\n    defer() {\n      let deferable = {\n        promise: null,\n        resolve: null,\n        reject: null\n      };\n      let promise = new Promise((resolve, reject) => {\n        deferable.resolve = resolve;\n        deferable.reject = reject;\n      });\n      deferable.promise = promise;\n      return deferable;\n    }\n    globalDebuggingEnabled() {\n      return false;\n    }\n  }\n  _exports.Environment = Environment;\n  const DEFAULT_ENVIRONMENT = new Environment();\n  _exports.DEFAULT_ENVIRONMENT = DEFAULT_ENVIRONMENT;\n});","define(\"ember-concurrency/-private/external/generator-state\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.GeneratorStepResult = _exports.GeneratorState = void 0;\n  class GeneratorStepResult {\n    constructor(value, done, errored) {\n      this.value = value;\n      this.done = done;\n      this.errored = errored;\n    }\n  }\n  _exports.GeneratorStepResult = GeneratorStepResult;\n  class GeneratorState {\n    constructor(generatorFactory) {\n      this.done = false;\n      this.generatorFactory = generatorFactory;\n      this.iterator = null;\n    }\n    step(resolvedValue, iteratorMethod) {\n      try {\n        let iterator = this.getIterator();\n        let {\n          value,\n          done\n        } = iterator[iteratorMethod](resolvedValue);\n        if (done) {\n          return this.finalize(value, false);\n        } else {\n          return new GeneratorStepResult(value, false, false);\n        }\n      } catch (e) {\n        return this.finalize(e, true);\n      }\n    }\n    getIterator() {\n      if (!this.iterator && !this.done) {\n        this.iterator = this.generatorFactory();\n      }\n      return this.iterator;\n    }\n    finalize(value, errored) {\n      this.done = true;\n      this.iterator = null;\n      return new GeneratorStepResult(value, true, errored);\n    }\n  }\n  _exports.GeneratorState = GeneratorState;\n});","define(\"ember-concurrency/-private/external/scheduler/policies/bounded-policy\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class BoundedPolicy {\n    constructor(maxConcurrency) {\n      this.maxConcurrency = maxConcurrency || 1;\n    }\n  }\n  var _default = BoundedPolicy;\n  _exports.default = _default;\n});","define(\"ember-concurrency/-private/external/scheduler/policies/drop-policy\", [\"exports\", \"ember-concurrency/-private/external/scheduler/policies/bounded-policy\", \"ember-concurrency/-private/external/scheduler/policies/execution-states\"], function (_exports, _boundedPolicy, _executionStates) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const CANCELLED = (0, _executionStates.makeCancelState)(`it belongs to a 'drop' Task that was already running`);\n  class DropReducer {\n    constructor(remainingSlots) {\n      this.remainingSlots = remainingSlots;\n    }\n    step() {\n      if (this.remainingSlots > 0) {\n        this.remainingSlots--;\n        return _executionStates.STARTED;\n      }\n      return CANCELLED;\n    }\n  }\n  class DropPolicy extends _boundedPolicy.default {\n    makeReducer() {\n      return new DropReducer(this.maxConcurrency);\n    }\n  }\n  var _default = DropPolicy;\n  _exports.default = _default;\n});","define(\"ember-concurrency/-private/external/scheduler/policies/enqueued-policy\", [\"exports\", \"ember-concurrency/-private/external/scheduler/policies/bounded-policy\", \"ember-concurrency/-private/external/scheduler/policies/execution-states\"], function (_exports, _boundedPolicy, _executionStates) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class EnqueuedReducer {\n    constructor(remainingSlots) {\n      this.remainingSlots = remainingSlots;\n    }\n    step() {\n      if (this.remainingSlots > 0) {\n        this.remainingSlots--;\n        return _executionStates.STARTED;\n      } else {\n        return _executionStates.QUEUED;\n      }\n    }\n  }\n  class EnqueuedPolicy extends _boundedPolicy.default {\n    makeReducer() {\n      return new EnqueuedReducer(this.maxConcurrency);\n    }\n  }\n  var _default = EnqueuedPolicy;\n  _exports.default = _default;\n});","define(\"ember-concurrency/-private/external/scheduler/policies/execution-states\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.makeCancelState = _exports.TYPE_STARTED = _exports.TYPE_QUEUED = _exports.TYPE_CANCELLED = _exports.STARTED = _exports.QUEUED = void 0;\n  const TYPE_CANCELLED = 'CANCELLED';\n  _exports.TYPE_CANCELLED = TYPE_CANCELLED;\n  const TYPE_STARTED = 'STARTED';\n  _exports.TYPE_STARTED = TYPE_STARTED;\n  const TYPE_QUEUED = 'QUEUED';\n  _exports.TYPE_QUEUED = TYPE_QUEUED;\n  const STARTED = {\n    type: TYPE_STARTED\n  };\n  _exports.STARTED = STARTED;\n  const QUEUED = {\n    type: TYPE_QUEUED\n  };\n  _exports.QUEUED = QUEUED;\n  const makeCancelState = reason => ({\n    type: TYPE_CANCELLED,\n    reason\n  });\n  _exports.makeCancelState = makeCancelState;\n});","define(\"ember-concurrency/-private/external/scheduler/policies/keep-latest-policy\", [\"exports\", \"ember-concurrency/-private/external/scheduler/policies/bounded-policy\", \"ember-concurrency/-private/external/scheduler/policies/execution-states\"], function (_exports, _boundedPolicy, _executionStates) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const CANCELLED = (0, _executionStates.makeCancelState)(`it belongs to a 'keepLatest' Task that was already running`);\n\n  // Given:\n  // - started tasks: [a,b,_]\n  // - queued tasks:  [c,d,e,f]\n  // KeepLatest will cancel all but the last queued task instance, producing:\n  // - started tasks: [a,b,c]\n  // - queued tasks: [f]\n\n  // TODO: perhaps we should expose another config for the number to keep enqueued.\n  //       this would also make sense for enqueued, e.g. perform a max of maxConcurrency\n  //       concurrent task instances, but after a number of queued instances has been\n  //       reached, they should be cancelled.\n\n  class KeepLatestReducer {\n    constructor(remainingSlots, numToCancel) {\n      this.remainingSlots = remainingSlots;\n      this.numToCancel = numToCancel;\n    }\n    step() {\n      if (this.remainingSlots > 0) {\n        this.remainingSlots--;\n        return _executionStates.STARTED;\n      } else {\n        if (this.numToCancel > 0) {\n          this.numToCancel--;\n          return CANCELLED;\n        } else {\n          return _executionStates.QUEUED;\n        }\n      }\n    }\n  }\n  class KeepLatestPolicy extends _boundedPolicy.default {\n    makeReducer(numRunning, numQueued) {\n      let maxEnqueued = 1;\n      let totalRunning = numRunning + numQueued;\n      return new KeepLatestReducer(this.maxConcurrency, totalRunning - this.maxConcurrency - maxEnqueued);\n    }\n  }\n  var _default = KeepLatestPolicy;\n  _exports.default = _default;\n});","define(\"ember-concurrency/-private/external/scheduler/policies/restartable-policy\", [\"exports\", \"ember-concurrency/-private/external/scheduler/policies/bounded-policy\", \"ember-concurrency/-private/external/scheduler/policies/execution-states\"], function (_exports, _boundedPolicy, _executionStates) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const CANCELLED = (0, _executionStates.makeCancelState)(`it belongs to a 'restartable' Task that was .perform()ed again`);\n  class RestartableReducer {\n    constructor(numToCancel) {\n      this.numToCancel = numToCancel;\n    }\n    step() {\n      if (this.numToCancel > 0) {\n        this.numToCancel--;\n        return CANCELLED;\n      } else {\n        return _executionStates.STARTED;\n      }\n    }\n  }\n  class RestartablePolicy extends _boundedPolicy.default {\n    makeReducer(numRunning, numQueued) {\n      return new RestartableReducer(numRunning + numQueued - this.maxConcurrency);\n    }\n  }\n  var _default = RestartablePolicy;\n  _exports.default = _default;\n});","define(\"ember-concurrency/-private/external/scheduler/policies/unbounded-policy\", [\"exports\", \"ember-concurrency/-private/external/scheduler/policies/execution-states\"], function (_exports, _executionStates) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class UnboundedReducer {\n    step() {\n      return _executionStates.STARTED;\n    }\n  }\n  const SINGLETON_REDUCER = new UnboundedReducer();\n  class UnboundedPolicy {\n    makeReducer() {\n      return SINGLETON_REDUCER;\n    }\n  }\n  var _default = UnboundedPolicy;\n  _exports.default = _default;\n});","define(\"ember-concurrency/-private/external/scheduler/refresh\", [\"exports\", \"ember-concurrency/-private/external/scheduler/policies/execution-states\"], function (_exports, _executionStates) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const LAST_APPLIED_TAGS = new Map();\n  class Refresh {\n    constructor(schedulerPolicy, stateTracker, taskInstances) {\n      this.stateTracker = stateTracker;\n      this.schedulerPolicy = schedulerPolicy;\n      this.initialTaskInstances = taskInstances;\n      this.startingInstances = [];\n    }\n    process() {\n      let [taskInstances, numRunning, numQueued] = this.filterFinishedTaskInstances();\n      let reducer = this.schedulerPolicy.makeReducer(numRunning, numQueued);\n      let finalTaskInstances = taskInstances.filter(taskInstance => {\n        return this.setTaskInstanceExecutionState(taskInstance, reducer.step());\n      });\n      this.stateTracker.computeFinalStates(state => this.applyState(state));\n      this.startingInstances.forEach(taskInstance => taskInstance.start());\n      return finalTaskInstances;\n    }\n    filterFinishedTaskInstances() {\n      let numRunning = 0,\n        numQueued = 0;\n      let taskInstances = this.initialTaskInstances.filter(taskInstance => {\n        let taskState = this.stateTracker.stateFor(taskInstance.task);\n        let executorState = taskInstance.executor.state;\n        if (executorState.isFinished) {\n          taskState.onCompletion(taskInstance);\n          return false;\n        }\n        if (executorState.hasStarted) {\n          numRunning += 1;\n        } else {\n          numQueued += 1;\n        }\n        return true;\n      });\n      return [taskInstances, numRunning, numQueued];\n    }\n    setTaskInstanceExecutionState(taskInstance, desiredState) {\n      let taskState = this.stateTracker.stateFor(taskInstance.task);\n      if (!taskInstance.executor.counted) {\n        taskInstance.executor.counted = true;\n        taskState.onPerformed(taskInstance);\n      }\n      switch (desiredState.type) {\n        case _executionStates.TYPE_CANCELLED:\n          // this will cause a follow up flush which will detect and recompute cancellation state\n          taskInstance.cancel(desiredState.reason);\n          return false;\n        case _executionStates.TYPE_STARTED:\n          if (!taskInstance.executor.state.hasStarted) {\n            this.startingInstances.push(taskInstance);\n            taskState.onStart(taskInstance);\n          }\n          taskState.onRunning(taskInstance);\n          return true;\n        case _executionStates.TYPE_QUEUED:\n          taskState.onQueued(taskInstance);\n          // TODO: assert taskInstance hasn't started?\n          // Or perhaps this can be a way to pause a task?\n          return true;\n      }\n    }\n    applyState(state) {\n      let {\n        taskable\n      } = state;\n      if (!taskable.onState) {\n        return;\n      }\n      const {\n        guid\n      } = taskable;\n      if (LAST_APPLIED_TAGS.has(guid) && state.tag < LAST_APPLIED_TAGS.get(guid)) {\n        return;\n      }\n      let props = Object.assign({\n        numRunning: state.numRunning,\n        numQueued: state.numQueued,\n        numPerformedInc: state.numPerformedInc\n      }, state.attrs);\n      taskable.onState(props, taskable);\n      LAST_APPLIED_TAGS.set(guid, state.tag);\n    }\n  }\n  var _default = Refresh;\n  _exports.default = _default;\n});","define(\"ember-concurrency/-private/external/scheduler/scheduler\", [\"exports\", \"ember-concurrency/-private/external/scheduler/refresh\", \"ember-concurrency/-private/external/scheduler/state-tracker/state-tracker\", \"ember-concurrency/-private/external/scheduler/state-tracker/null-state-tracker\"], function (_exports, _refresh, _stateTracker, _nullStateTracker) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  // Scheduler base class\n\n  // When a Task is performed, it creates an unstarted TaskInstance and\n  // passes it to the Scheduler to determine when it should run. The\n  // scheduler consults the schedulerPolicy (e.g. DropPolicy, RestartablePolicy, etc)\n  // to determine whether the task instance should start executing, be enqueued\n  // for later execution, or be immediately cancelled. As TaskInstances start\n  // and run to completion, the Scheduler's `refresh()` method is called to\n  // give it an opportunity to start (or cancel) previously enqueued task instances,\n  // as well as update the derived state on Tasks and TaskGroups.\n\n  // Every Task has its own Scheduler instance, unless it is part of a group,\n  // in which case all the Tasks in a group share a single Scheduler.\n\n  class Scheduler {\n    constructor(schedulerPolicy, stateTrackingEnabled) {\n      this.schedulerPolicy = schedulerPolicy;\n      this.stateTrackingEnabled = stateTrackingEnabled;\n      this.taskInstances = [];\n    }\n    cancelAll(guid, cancelRequest) {\n      let cancelations = this.taskInstances.map(taskInstance => {\n        if (taskInstance.task.guids[guid]) {\n          taskInstance.executor.cancel(cancelRequest);\n        }\n      }).filter(cancelation => !!cancelation);\n      return Promise.all(cancelations);\n    }\n    perform(taskInstance) {\n      taskInstance.onFinalize(() => this.scheduleRefresh());\n      this.taskInstances.push(taskInstance);\n      this.refresh();\n    }\n    scheduleRefresh() {\n      Promise.resolve().then(() => this.refresh());\n    }\n    refresh() {\n      let stateTracker = this.stateTrackingEnabled ? new _stateTracker.default() : new _nullStateTracker.default();\n      let refresh = new _refresh.default(this.schedulerPolicy, stateTracker, this.taskInstances);\n      this.taskInstances = refresh.process();\n    }\n  }\n  var _default = Scheduler;\n  _exports.default = _default;\n});","define(\"ember-concurrency/-private/external/scheduler/state-tracker/null-state-tracker\", [\"exports\", \"ember-concurrency/-private/external/scheduler/state-tracker/null-state\"], function (_exports, _nullState) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const NULL_STATE = new _nullState.default();\n  class NullStateTracker {\n    stateFor() {\n      return NULL_STATE;\n    }\n    computeFinalStates() {}\n  }\n  var _default = NullStateTracker;\n  _exports.default = _default;\n});","define(\"ember-concurrency/-private/external/scheduler/state-tracker/null-state\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class NullState {\n    onCompletion() {}\n    onPerformed() {}\n    onStart() {}\n    onRunning() {}\n    onQueued() {}\n  }\n  var _default = NullState;\n  _exports.default = _default;\n});","define(\"ember-concurrency/-private/external/scheduler/state-tracker/state-tracker\", [\"exports\", \"ember-concurrency/-private/external/scheduler/state-tracker/state\"], function (_exports, _state) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const CURRENT_REFRESH_TAGS = new Map();\n  class StateTracker {\n    constructor() {\n      this.states = new Map();\n    }\n    stateFor(taskable) {\n      let guid = taskable.guid;\n      let taskState = this.states.get(guid);\n      if (!taskState) {\n        let currentTag = CURRENT_REFRESH_TAGS.has(guid) ? CURRENT_REFRESH_TAGS.get(guid) : 0;\n        taskState = new _state.default(taskable, ++currentTag);\n        this.states.set(guid, taskState);\n        CURRENT_REFRESH_TAGS.set(guid, currentTag);\n      }\n      return taskState;\n    }\n\n    // After cancelling/queueing task instances, we have to recompute the derived state\n    // of all the tasks that had/have task instances in this scheduler. We do this by\n    // looping through all the Tasks that we've accumulated state for, and then recursively\n    // applying/adding to the state of any TaskGroups they belong to.\n    computeFinalStates(callback) {\n      this.computeRecursiveState();\n      this.forEachState(state => callback(state));\n    }\n    computeRecursiveState() {\n      this.forEachState(taskState => {\n        let lastState = taskState;\n        taskState.recurseTaskGroups(taskGroup => {\n          let state = this.stateFor(taskGroup);\n          state.applyStateFrom(lastState);\n          lastState = state;\n        });\n      });\n    }\n    forEachState(callback) {\n      this.states.forEach(state => callback(state));\n    }\n  }\n  var _default = StateTracker;\n  _exports.default = _default;\n});","define(\"ember-concurrency/-private/external/scheduler/state-tracker/state\", [\"exports\", \"ember-concurrency/-private/external/task-instance/completion-states\"], function (_exports, _completionStates) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class RefreshState {\n    constructor(taskable, tag) {\n      this.taskable = taskable;\n      this.group = taskable.group;\n      this.numRunning = 0;\n      this.numQueued = 0;\n      this.numPerformedInc = 0;\n      this.attrs = {};\n      this.tag = tag;\n    }\n    onCompletion(taskInstance) {\n      let state = taskInstance.completionState;\n      this.attrs.lastRunning = null;\n      this.attrs.lastComplete = taskInstance;\n      if (state === _completionStates.COMPLETION_SUCCESS) {\n        this.attrs.lastSuccessful = taskInstance;\n      } else {\n        if (state === _completionStates.COMPLETION_ERROR) {\n          this.attrs.lastErrored = taskInstance;\n        } else if (state === _completionStates.COMPLETION_CANCEL) {\n          this.attrs.lastCanceled = taskInstance;\n        }\n        this.attrs.lastIncomplete = taskInstance;\n      }\n    }\n    onPerformed(taskInstance) {\n      this.numPerformedInc += 1;\n      this.attrs.lastPerformed = taskInstance;\n    }\n    onStart(taskInstance) {\n      this.attrs.last = taskInstance;\n    }\n    onRunning(taskInstance) {\n      this.attrs.lastRunning = taskInstance;\n      this.numRunning += 1;\n    }\n    onQueued() {\n      this.numQueued += 1;\n    }\n    recurseTaskGroups(callback) {\n      let group = this.group;\n      while (group) {\n        callback(group);\n        group = group.group;\n      }\n    }\n    applyStateFrom(other) {\n      Object.assign(this.attrs, other.attrs);\n      this.numRunning += other.numRunning;\n      this.numQueued += other.numQueued;\n      this.numPerformedInc += other.numPerformedInc;\n    }\n  }\n  var _default = RefreshState;\n  _exports.default = _default;\n});","define(\"ember-concurrency/-private/external/task-decorators\", [\"exports\", \"ember-concurrency/-private/external/task-factory\"], function (_exports, _taskFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.createTaskDecorator = createTaskDecorator;\n  _exports.createTaskGroupDecorator = createTaskGroupDecorator;\n  _exports.decoratorWithParams = decoratorWithParams;\n  _exports.lastValue = void 0;\n  function taskFromPropertyDescriptor(target, key, descriptor) {\n    let params = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n    let factoryClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : _taskFactory.TaskFactory;\n    let {\n      initializer,\n      get,\n      value\n    } = descriptor;\n    let taskFn;\n    if (initializer) {\n      taskFn = initializer.call(undefined);\n    } else if (get) {\n      taskFn = get.call(undefined);\n    } else if (value) {\n      taskFn = value;\n    }\n    taskFn.displayName = `${key} (task)`;\n    let tasks = new WeakMap();\n    let options = params[0] || {};\n    let factory = new factoryClass(key, taskFn, options);\n    factory._setupEmberKVO(target);\n    return {\n      get() {\n        let task = tasks.get(this);\n        if (!task) {\n          task = factory.createTask(this);\n          tasks.set(this, task);\n        }\n        return task;\n      }\n    };\n  }\n  function taskGroupPropertyDescriptor(_target, key, _descriptor) {\n    let params = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n    let factoryClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : _taskFactory.TaskFactory;\n    let taskGroups = new WeakMap();\n    let options = params[0] || {};\n    let factory = new factoryClass(key, null, options);\n    return {\n      get() {\n        let task = taskGroups.get(this);\n        if (!task) {\n          task = factory.createTaskGroup(this);\n          taskGroups.set(this, task);\n        }\n        return task;\n      }\n    };\n  }\n\n  // Cribbed from @ember-decorators/utils\n  function isFieldDescriptor(possibleDesc) {\n    let [target, key, desc] = possibleDesc;\n    return possibleDesc.length === 3 && typeof target === 'object' && target !== null && typeof key === 'string' && (typeof desc === 'object' && desc !== null && 'enumerable' in desc && 'configurable' in desc || desc === undefined) // TS compatibility ???\n;\n  }\n  function decoratorWithParams(descriptorFn) {\n    return function () {\n      for (var _len = arguments.length, params = new Array(_len), _key2 = 0; _key2 < _len; _key2++) {\n        params[_key2] = arguments[_key2];\n      }\n      if (isFieldDescriptor(params)) {\n        return descriptorFn(...params);\n      } else {\n        return function () {\n          for (var _len2 = arguments.length, desc = new Array(_len2), _key3 = 0; _key3 < _len2; _key3++) {\n            desc[_key3] = arguments[_key3];\n          }\n          return descriptorFn(...desc, params);\n        };\n      }\n    };\n  }\n  function createDecorator(fn) {\n    let baseOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    let factoryClass = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _taskFactory.TaskFactory;\n    return decoratorWithParams(function (target, key, descriptor) {\n      let [userOptions] = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n      let mergedOptions = Object.assign({}, {\n        ...baseOptions,\n        ...userOptions\n      });\n      return fn(target, key, descriptor, [mergedOptions], factoryClass);\n    });\n  }\n  function createTaskDecorator() {\n    let baseOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    let factoryClass = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _taskFactory.TaskFactory;\n    return createDecorator(taskFromPropertyDescriptor, baseOptions, factoryClass);\n  }\n  function createTaskGroupDecorator() {\n    let baseOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    let factoryClass = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _taskFactory.TaskFactory;\n    return createDecorator(taskGroupPropertyDescriptor, baseOptions, factoryClass);\n  }\n  const lastValue = decoratorWithParams(function (_target, _key, descriptor) {\n    let [taskName] = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n    const {\n      initializer\n    } = descriptor;\n    delete descriptor.initializer;\n    return {\n      get() {\n        let lastInstance = this[taskName].lastSuccessful;\n        if (lastInstance) {\n          return lastInstance.value;\n        }\n        if (initializer) {\n          return initializer.call(this);\n        }\n        return undefined;\n      }\n    };\n  });\n  _exports.lastValue = lastValue;\n});","define(\"ember-concurrency/-private/external/task-factory\", [\"exports\", \"ember-concurrency/-private/external/scheduler/scheduler\", \"ember-concurrency/-private/external/scheduler/policies/unbounded-policy\", \"ember-concurrency/-private/external/scheduler/policies/enqueued-policy\", \"ember-concurrency/-private/external/scheduler/policies/drop-policy\", \"ember-concurrency/-private/external/scheduler/policies/keep-latest-policy\", \"ember-concurrency/-private/external/scheduler/policies/restartable-policy\", \"ember-concurrency/-private/external/task/task\", \"ember-concurrency/-private/external/task/task-group\", \"ember-concurrency/-private/external/environment\"], function (_exports, _scheduler, _unboundedPolicy, _enqueuedPolicy, _dropPolicy, _keepLatestPolicy, _restartablePolicy, _task, _taskGroup, _environment) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.TaskFactory = void 0;\n  _exports.getModifier = getModifier;\n  _exports.hasModifier = hasModifier;\n  _exports.registerModifier = registerModifier;\n  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n  function _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\n  function _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n  function assertModifiersNotMixedWithGroup(obj) {\n    if (obj._hasSetConcurrencyConstraint && obj._taskGroupPath) {\n      throw new Error(`Cannot use both 'group' and other concurrency-constraining task modifiers (e.g. 'drop', 'enqueue', 'restartable')`);\n    }\n  }\n  function assertUnsetBufferPolicy(obj) {\n    if (obj._hasSetBufferPolicy) {\n      throw new Error(`Cannot set multiple buffer policies on a task or task group. ${obj._schedulerPolicyClass} has already been set for task or task group '${obj.name}'`);\n    }\n  }\n  const MODIFIER_REGISTRY = {\n    enqueue: (factory, value) => value && factory.setBufferPolicy(_enqueuedPolicy.default),\n    evented: (factory, value) => value && factory.setEvented(value),\n    debug: (factory, value) => value && factory.setDebug(value),\n    drop: (factory, value) => value && factory.setBufferPolicy(_dropPolicy.default),\n    group: (factory, groupName) => factory.setGroup(groupName),\n    keepLatest: (factory, value) => value && factory.setBufferPolicy(_keepLatestPolicy.default),\n    maxConcurrency: (factory, maxConcurrency) => factory.setMaxConcurrency(maxConcurrency),\n    onState: (factory, onStateCallback) => factory.setOnState(onStateCallback),\n    restartable: (factory, value) => value && factory.setBufferPolicy(_restartablePolicy.default)\n  };\n\n  /**\n   * Callback type defining a task modifier\n   *\n   * @callback TaskFactory~TaskModifier\n   * @param {TaskFactory} factory\n   * @param {*} taskModifierOption\n   */\n\n  /**\n   * Registers a new modifier with the modifier registry\n   *\n   * @param {string} name Name of the modifier\n   * @param {TaskFactory~TaskModifier} callback\n   */\n  function registerModifier(name, callback) {\n    if (MODIFIER_REGISTRY[name]) {\n      throw new Error(`A modifier with the name '${name}' has already been defined.`);\n    }\n    MODIFIER_REGISTRY[name] = callback;\n  }\n\n  /**\n   * Returns a specified modifier, if it exists in the registry\n   *\n   * @param {string} name Name of the modifier\n   * @returns {TaskFactory~TaskModifier?}\n   */\n  function getModifier(name) {\n    return MODIFIER_REGISTRY[name];\n  }\n\n  /**\n   * Returns whether a specified modifier exists in the registry\n   *\n   * @param {string} name Name of the modifier\n   * @returns {boolean}\n   */\n  function hasModifier(name) {\n    return name in MODIFIER_REGISTRY;\n  }\n\n  /**\n   * Factory used for instantiating Tasks and Task Groups. Mostly for internal\n   * use, but some public APIs exposed via the Task Modifier APIs.\n   *\n   * <style>\n   *  .ignore-this--this-is-here-to-hide-constructor,\n   *  #TaskFactory { display: none }\n   * </style>\n   *\n   * @class TaskFactory\n   */\n  class TaskFactory {\n    constructor() {\n      let name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '<unknown>';\n      let taskDefinition = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n      let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      _defineProperty(this, \"env\", _environment.DEFAULT_ENVIRONMENT);\n      _defineProperty(this, \"_debug\", null);\n      _defineProperty(this, \"_enabledModifiers\", []);\n      _defineProperty(this, \"_hasSetConcurrencyConstraint\", false);\n      _defineProperty(this, \"_hasSetBufferPolicy\", false);\n      _defineProperty(this, \"_hasEnabledEvents\", false);\n      _defineProperty(this, \"_maxConcurrency\", null);\n      _defineProperty(this, \"_onStateCallback\", (state, taskable) => taskable.setState(state));\n      _defineProperty(this, \"_schedulerPolicyClass\", _unboundedPolicy.default);\n      _defineProperty(this, \"_taskGroupPath\", null);\n      this.name = name;\n      this.taskDefinition = taskDefinition;\n      this.options = options;\n      this._processModifierOptions(options);\n    }\n\n    /**\n     * Returns a new Task bound to the given context\n     *\n     * @protected\n     * @param {*} context\n     * @returns {Task}\n     */\n    createTask(context) {\n      let options = this.getTaskOptions(context);\n      return new _task.Task(Object.assign({\n        generatorFactory: args => this.taskDefinition.apply(context, args)\n      }, options));\n    }\n\n    /**\n     * Returns a new TaskGroup bound to the given context\n     *\n     * @protected\n     * @param {*} context\n     * @returns {Task}\n     */\n    createTaskGroup(context) {\n      let options = this.getTaskOptions(context);\n      return new _taskGroup.TaskGroup(options);\n    }\n\n    /**\n     * Returns a modifier callback with the given name bound to this TaskFactory,\n     * if registered.\n     *\n     * @protected\n     * @param {string} name\n     * @returns {TaskFactory~TaskModifier?}\n     */\n    getModifier(name) {\n      if (hasModifier(name)) {\n        return MODIFIER_REGISTRY[name].bind(null, this);\n      }\n    }\n\n    /**\n     * Returns the options provided to TaskFactory\n     *\n     * @public\n     * @returns {object}\n     */\n    getOptions() {\n      return this.options;\n    }\n\n    /**\n     * Returns a new Scheduler instance\n     *\n     * @protected\n     * @param {*} schedulerPolicy\n     * @param {boolean} stateTrackingEnabled\n     * @returns {Scheduler}\n     */\n    getScheduler(schedulerPolicy, stateTrackingEnabled) {\n      return new _scheduler.default(schedulerPolicy, stateTrackingEnabled);\n    }\n\n    /**\n     * Returns the options to pass to a Task or TaskGroup constructor\n     *\n     * @protected\n     * @param {*} context\n     * @returns {object}\n     */\n    getTaskOptions(context) {\n      let group, scheduler;\n      let onStateCallback = this._onStateCallback;\n      if (this._taskGroupPath) {\n        group = context[this._taskGroupPath];\n        if (!(group instanceof _taskGroup.TaskGroup)) {\n          throw new Error(`Expected group '${this._taskGroupPath}' to be defined but was not found.`);\n        }\n        scheduler = group.scheduler;\n      } else {\n        let schedulerPolicy = new this._schedulerPolicyClass(this._maxConcurrency);\n        scheduler = this.getScheduler(schedulerPolicy, onStateCallback && typeof onStateCallback === 'function');\n      }\n      return {\n        context,\n        debug: this._debug,\n        env: this.env,\n        name: this.name,\n        group,\n        scheduler,\n        hasEnabledEvents: this._hasEnabledEvents,\n        onStateCallback,\n        enabledModifiers: this._enabledModifiers,\n        modifierOptions: this.getOptions()\n      };\n    }\n\n    /**\n     * Sets the Scheduler buffer policy class to the specified value.\n     *\n     * Will raise an assertion if a buffer policy has already been specified\n     *\n     * @param {*} policy\n     * @returns {TaskFactory}\n     */\n    setBufferPolicy(policy) {\n      assertUnsetBufferPolicy(this);\n      this._hasSetBufferPolicy = true;\n      this._hasSetConcurrencyConstraint = true;\n      this._schedulerPolicyClass = policy;\n      assertModifiersNotMixedWithGroup(this);\n      return this;\n    }\n\n    /**\n     * Sets debug mode\n     *\n     * @param {boolean} enabled\n     * @returns {TaskFactory}\n     */\n    setDebug(enabled) {\n      this._debug = enabled;\n      return this;\n    }\n\n    /**\n     * Sets whether Task will dispatch Task events or not\n     *\n     * @param {boolean} enabled\n     * @returns {TaskFactory}\n     */\n    setEvented(enabled) {\n      this._hasEnabledEvents = enabled;\n      return this;\n    }\n\n    /**\n     * Sets Scheduling policy's `maxConcurrency`\n     *\n     * @param {number} maxConcurrency\n     * @returns {TaskFactory}\n     */\n    setMaxConcurrency(maxConcurrency) {\n      this._hasSetConcurrencyConstraint = true;\n      this._maxConcurrency = maxConcurrency;\n      return this;\n    }\n\n    /**\n     * Assigns Task created from this factory to the specified group name\n     *\n     * @param {string} group\n     * @returns {TaskFactory}\n     */\n    setGroup(group) {\n      this._taskGroupPath = group;\n      return this;\n    }\n\n    /**\n     * Sets the name of tasks created from this factory\n     *\n     * @param {string} name\n     * @returns {TaskFactory}\n     */\n    setName(name) {\n      this.name = name;\n      return this;\n    }\n\n    /**\n     * Sets the callback used on state updates. Can be set to null to disable\n     * state tracking on tasks.\n     *\n     * @param {function} onStateCallback\n     * @returns {TaskFactory}\n     */\n    setOnState(onStateCallback) {\n      this._onStateCallback = onStateCallback;\n      return this;\n    }\n\n    /**\n     * Sets the definition for tasks created from this factory\n     *\n     * @param {*} taskDefinition\n     * @returns {TaskFactory}\n     */\n    setTaskDefinition(taskDefinition) {\n      this.taskDefinition = taskDefinition;\n      return this;\n    }\n    _processModifierOptions(options) {\n      if (!options) {\n        return;\n      }\n      for (let key of Object.keys(options)) {\n        let value = options[key];\n        let modifier = this.getModifier(key);\n        if (typeof modifier === 'function' && modifier(value)) {\n          this._enabledModifiers.push(key);\n        }\n      }\n    }\n  }\n  _exports.TaskFactory = TaskFactory;\n});","define(\"ember-concurrency/-private/external/task-instance/base\", [\"exports\", \"ember-concurrency/-private/external/task-instance/initial-state\", \"ember-concurrency/-private/external/yieldables\", \"ember-concurrency/-private/external/task-instance/cancelation\"], function (_exports, _initialState, _yieldables, _cancelation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.BaseTaskInstance = void 0;\n  const EXPLICIT_CANCEL_REASON = '.cancel() was explicitly called';\n  class BaseTaskInstance {\n    constructor(_ref) {\n      let {\n        task,\n        args,\n        executor,\n        performType,\n        hasEnabledEvents\n      } = _ref;\n      this.task = task;\n      this.args = args;\n      this.performType = performType;\n      this.executor = executor;\n      this.executor.taskInstance = this;\n      this.hasEnabledEvents = hasEnabledEvents;\n    }\n    setState() {}\n    onStarted() {}\n    onSuccess() {}\n    onError() {}\n    onCancel() {}\n    formatCancelReason() {}\n    selfCancelLoopWarning() {}\n    onFinalize(callback) {\n      this.executor.onFinalize(callback);\n    }\n    proceed(index, yieldResumeType, value) {\n      this.executor.proceedChecked(index, yieldResumeType, value);\n    }\n    [_yieldables.yieldableSymbol](parentTaskInstance, resumeIndex) {\n      return this.executor.onYielded(parentTaskInstance, resumeIndex);\n    }\n    cancel() {\n      let cancelReason = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : EXPLICIT_CANCEL_REASON;\n      this.executor.cancel(new _cancelation.CancelRequest(_cancelation.CANCEL_KIND_EXPLICIT, cancelReason));\n    }\n    then() {\n      return this.executor.promise().then(...arguments);\n    }\n    catch() {\n      return this.executor.promise().catch(...arguments);\n    }\n    finally() {\n      return this.executor.promise().finally(...arguments);\n    }\n    toString() {\n      return `${this.task} TaskInstance`;\n    }\n    start() {\n      this.executor.start();\n      return this;\n    }\n  }\n  _exports.BaseTaskInstance = BaseTaskInstance;\n  Object.assign(BaseTaskInstance.prototype, _initialState.INITIAL_STATE);\n  Object.assign(BaseTaskInstance.prototype, {\n    state: 'waiting',\n    isDropped: false,\n    isRunning: true\n  });\n});","define(\"ember-concurrency/-private/external/task-instance/cancelation\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.TASK_CANCELATION_NAME = _exports.CancelRequest = _exports.CANCEL_KIND_YIELDABLE_CANCEL = _exports.CANCEL_KIND_PARENT_CANCEL = _exports.CANCEL_KIND_LIFESPAN_END = _exports.CANCEL_KIND_EXPLICIT = void 0;\n  _exports.didCancel = didCancel;\n  const TASK_CANCELATION_NAME = 'TaskCancelation';\n\n  /**\n   * Returns true if the object passed to it is a TaskCancelation error.\n   * If you call `someTask.perform().catch(...)` or otherwise treat\n   * a {@linkcode TaskInstance} like a promise, you may need to\n   * handle the cancelation of a TaskInstance differently from\n   * other kinds of errors it might throw, and you can use this\n   * convenience function to distinguish cancelation from errors.\n   *\n   * ```js\n   * click() {\n   *   this.myTask.perform().catch(e => {\n   *     if (!didCancel(e)) { throw e; }\n   *   });\n   * }\n   * ```\n   *\n   * @param {object} error the caught error, which might be a TaskCancelation\n   * @returns {boolean}\n   */\n  _exports.TASK_CANCELATION_NAME = TASK_CANCELATION_NAME;\n  function didCancel(e) {\n    return e && e.name === TASK_CANCELATION_NAME;\n  }\n  const CANCEL_KIND_EXPLICIT = 'explicit';\n  _exports.CANCEL_KIND_EXPLICIT = CANCEL_KIND_EXPLICIT;\n  const CANCEL_KIND_YIELDABLE_CANCEL = 'yielded';\n  _exports.CANCEL_KIND_YIELDABLE_CANCEL = CANCEL_KIND_YIELDABLE_CANCEL;\n  const CANCEL_KIND_LIFESPAN_END = 'lifespan_end';\n  _exports.CANCEL_KIND_LIFESPAN_END = CANCEL_KIND_LIFESPAN_END;\n  const CANCEL_KIND_PARENT_CANCEL = 'parent_cancel';\n  _exports.CANCEL_KIND_PARENT_CANCEL = CANCEL_KIND_PARENT_CANCEL;\n  class CancelRequest {\n    constructor(kind, reason) {\n      this.kind = kind;\n      this.reason = reason;\n      this.promise = new Promise(resolve => {\n        this.finalize = resolve;\n      });\n    }\n  }\n  _exports.CancelRequest = CancelRequest;\n});","define(\"ember-concurrency/-private/external/task-instance/completion-states\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.COMPLETION_SUCCESS = _exports.COMPLETION_PENDING = _exports.COMPLETION_ERROR = _exports.COMPLETION_CANCEL = void 0;\n  const COMPLETION_PENDING = 0;\n  _exports.COMPLETION_PENDING = COMPLETION_PENDING;\n  const COMPLETION_SUCCESS = 1;\n  _exports.COMPLETION_SUCCESS = COMPLETION_SUCCESS;\n  const COMPLETION_ERROR = 2;\n  _exports.COMPLETION_ERROR = COMPLETION_ERROR;\n  const COMPLETION_CANCEL = 3;\n  _exports.COMPLETION_CANCEL = COMPLETION_CANCEL;\n});","define(\"ember-concurrency/-private/external/task-instance/executor\", [\"exports\", \"ember-concurrency/-private/external/generator-state\", \"ember-concurrency/-private/external/task-instance/initial-state\", \"ember-concurrency/-private/external/yieldables\", \"ember-concurrency/-private/external/task-instance/completion-states\", \"ember-concurrency/-private/external/task-instance/cancelation\"], function (_exports, _generatorState, _initialState, _yieldables, _completionStates, _cancelation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.TaskInstanceExecutor = _exports.PERFORM_TYPE_UNLINKED = _exports.PERFORM_TYPE_LINKED = _exports.PERFORM_TYPE_DEFAULT = void 0;\n  _exports.getRunningInstance = getRunningInstance;\n  const PERFORM_TYPE_DEFAULT = 'PERFORM_TYPE_DEFAULT';\n  _exports.PERFORM_TYPE_DEFAULT = PERFORM_TYPE_DEFAULT;\n  const PERFORM_TYPE_UNLINKED = 'PERFORM_TYPE_UNLINKED';\n  _exports.PERFORM_TYPE_UNLINKED = PERFORM_TYPE_UNLINKED;\n  const PERFORM_TYPE_LINKED = 'PERFORM_TYPE_LINKED';\n  _exports.PERFORM_TYPE_LINKED = PERFORM_TYPE_LINKED;\n  const CANCEL_RETURN_VALUE_SENTINEL = {};\n  let TASK_INSTANCE_STACK = [];\n  function getRunningInstance() {\n    return TASK_INSTANCE_STACK[TASK_INSTANCE_STACK.length - 1];\n  }\n  class TaskInstanceExecutor {\n    constructor(_ref) {\n      let {\n        generatorFactory,\n        env,\n        debug\n      } = _ref;\n      this.generatorState = new _generatorState.GeneratorState(generatorFactory);\n      this.state = Object.assign({}, _initialState.INITIAL_STATE);\n      this.index = 1;\n      this.disposers = [];\n      this.finalizeCallbacks = [];\n      this.env = env;\n      this.debug = debug;\n      this.cancelRequest = null;\n    }\n    start() {\n      if (this.state.hasStarted || this.cancelRequest) {\n        return;\n      }\n      this.setState({\n        hasStarted: true\n      });\n      this.proceedSync(_yieldables.YIELDABLE_CONTINUE, undefined);\n      this.taskInstance.onStarted();\n    }\n    cancel(cancelRequest) {\n      if (!this.requestCancel(cancelRequest)) {\n        cancelRequest.finalize();\n        return cancelRequest.promise;\n      }\n      if (this.state.hasStarted) {\n        this.proceedWithCancelAsync();\n      } else {\n        this.finalizeWithCancel();\n      }\n      return this.cancelRequest.promise;\n    }\n    setState(state) {\n      Object.assign(this.state, state);\n      this.taskInstance.setState(this.state);\n    }\n    proceedChecked(index, yieldResumeType, value) {\n      if (this.state.isFinished) {\n        return;\n      }\n      if (!this.advanceIndex(index)) {\n        return;\n      }\n      if (yieldResumeType === _yieldables.YIELDABLE_CANCEL) {\n        this.requestCancel(new _cancelation.CancelRequest(_cancelation.CANCEL_KIND_YIELDABLE_CANCEL), value);\n        this.proceedWithCancelAsync();\n      } else {\n        this.proceedAsync(yieldResumeType, value);\n      }\n    }\n    proceedWithCancelAsync() {\n      this.proceedAsync(_yieldables.YIELDABLE_RETURN, CANCEL_RETURN_VALUE_SENTINEL);\n    }\n    proceedAsync(yieldResumeType, value) {\n      this.advanceIndex(this.index);\n      this.env.async(() => this.proceedSync(yieldResumeType, value));\n    }\n    proceedSync(yieldResumeType, value) {\n      if (this.state.isFinished) {\n        return;\n      }\n      this.dispose();\n      if (this.generatorState.done) {\n        this.handleResolvedReturnedValue(yieldResumeType, value);\n      } else {\n        this.handleResolvedContinueValue(yieldResumeType, value);\n      }\n    }\n\n    /**\n     * This method is called when a previously yielded value from\n     * the generator has been resolved, and now it's time to pass\n     * it back into the generator. There are 3 ways to \"resume\" a\n     * generator:\n     *\n     * - call `.next(value)` on it, which is used to pass in a resolved\n     *   value (the fulfilled value of a promise), e.g. if a task generator fn\n     *   does `yield Promise.resolve(5)`, then we take that promise yielded\n     *   by the generator, detect that it's a promise, resolve it, and then\n     *   pass its fulfilled value `5` back into the generator function so\n     *   that it can continue executing.\n     * - call `.throw(error)` on it, which throw an exception from where the\n     *   the generator previously yielded. We do this when the previously\n     *   yielded value resolves to an error value (e.g. a rejected promise\n     *   or a TaskInstance that finished with an error). Note that when you\n     *   resume a generator with a `.throw()`, it can still recover from that\n     *   thrown error and continue executing normally so long as the `yield`\n     *   was inside a `try/catch` statement.\n     * - call `.return(value)` on it, causes the generator function to return\n     *   from where it previously `yield`ed. We use `.return()` when cancelling\n     *   a TaskInstance; by `.return`ing, rather than `.throw`ing, it allows\n     *   the generator function to skip `catch(e) {}` blocks, which is usually\n     *   reserved for actual errors/exceptions; if we `.throw`'d cancellations,\n     *   it would require all tasks that used try/catch to conditionally ignore\n     *   cancellations, which is annoying. So we `.return()` from generator functions\n     *   in the case of errors as a matter of convenience.\n     *\n     * @private\n     */\n    handleResolvedContinueValue(iteratorMethod, resumeValue) {\n      let beforeIndex = this.index;\n      let stepResult = this.generatorStep(resumeValue, iteratorMethod);\n\n      // TODO: what is this doing? write breaking test.\n      if (!this.advanceIndex(beforeIndex)) {\n        return;\n      }\n      if (stepResult.errored) {\n        this.finalize(stepResult.value, _completionStates.COMPLETION_ERROR);\n        return;\n      }\n      this.handleYieldedValue(stepResult);\n    }\n\n    /**\n     * This method is called when the generator function is all\n     * out of values, and the last value returned from the function\n     * (possible a thenable/yieldable/promise/etc) has been resolved.\n     *\n     * Possible cases:\n     * - `return \"simple value\";` // resolved value is \"simple value\"\n     * - `return undefined;` // (or omitted return) resolved value is undefined\n     * - `return someTask.perform()` // resolved value is the value returned/resolved from someTask\n     *\n     * @private\n     */\n    handleResolvedReturnedValue(yieldResumeType, value) {\n      switch (yieldResumeType) {\n        case _yieldables.YIELDABLE_CONTINUE:\n        case _yieldables.YIELDABLE_RETURN:\n          this.finalize(value, _completionStates.COMPLETION_SUCCESS);\n          break;\n        case _yieldables.YIELDABLE_THROW:\n          this.finalize(value, _completionStates.COMPLETION_ERROR);\n          break;\n      }\n    }\n    handleYieldedUnknownThenable(thenable) {\n      let resumeIndex = this.index;\n      thenable.then(value => {\n        this.proceedChecked(resumeIndex, _yieldables.YIELDABLE_CONTINUE, value);\n      }, error => {\n        this.proceedChecked(resumeIndex, _yieldables.YIELDABLE_THROW, error);\n      });\n    }\n\n    /**\n     * The TaskInstance internally tracks an index/sequence number\n     * (the `index` property) which gets incremented every time the\n     * task generator function iterator takes a step. When a task\n     * function is paused at a `yield`, there are two events that\n     * cause the TaskInstance to take a step: 1) the yielded value\n     * \"resolves\", thus resuming the TaskInstance's execution, or\n     * 2) the TaskInstance is canceled. We need some mechanism to prevent\n     * stale yielded value resolutions from resuming the TaskFunction\n     * after the TaskInstance has already moved on (either because\n     * the TaskInstance has since been canceled or because an\n     * implementation of the Yieldable API tried to resume the\n     * TaskInstance more than once). The `index` serves as\n     * that simple mechanism: anyone resuming a TaskInstance\n     * needs to pass in the `index` they were provided that acts\n     * as a ticket to resume the TaskInstance that expires once\n     * the TaskInstance has moved on.\n     *\n     * @private\n     */\n    advanceIndex(index) {\n      if (this.index === index) {\n        return ++this.index;\n      }\n    }\n    handleYieldedValue(stepResult) {\n      let yieldedValue = stepResult.value;\n      if (!yieldedValue) {\n        this.proceedWithSimpleValue(yieldedValue);\n        return;\n      }\n      this.addDisposer(yieldedValue[_yieldables.cancelableSymbol]);\n      if (yieldedValue[_yieldables.yieldableSymbol]) {\n        this.invokeYieldable(yieldedValue);\n      } else if (typeof yieldedValue.then === 'function') {\n        this.handleYieldedUnknownThenable(yieldedValue);\n      } else {\n        this.proceedWithSimpleValue(yieldedValue);\n      }\n    }\n    proceedWithSimpleValue(yieldedValue) {\n      this.proceedAsync(_yieldables.YIELDABLE_CONTINUE, yieldedValue);\n    }\n    addDisposer(maybeDisposer) {\n      if (typeof maybeDisposer !== 'function') {\n        return;\n      }\n      this.disposers.push(maybeDisposer);\n    }\n\n    /**\n     * Runs any disposers attached to the task's most recent `yield`.\n     * For instance, when a task yields a TaskInstance, it registers that\n     * child TaskInstance's disposer, so that if the parent task is canceled,\n     * dispose() will run that disposer and cancel the child TaskInstance.\n     *\n     * @private\n     */\n    dispose() {\n      let disposers = this.disposers;\n      if (disposers.length === 0) {\n        return;\n      }\n      this.disposers = [];\n      disposers.forEach(disposer => disposer());\n    }\n\n    /**\n     * Calls .next()/.throw()/.return() on the task's generator function iterator,\n     * essentially taking a single step of execution on the task function.\n     *\n     * @private\n     */\n    generatorStep(nextValue, iteratorMethod) {\n      TASK_INSTANCE_STACK.push(this);\n      let stepResult = this.generatorState.step(nextValue, iteratorMethod);\n      TASK_INSTANCE_STACK.pop();\n\n      // TODO: fix this!\n      if (this._expectsLinkedYield) {\n        let value = stepResult.value;\n        if (!value || value.performType !== PERFORM_TYPE_LINKED) {\n          // eslint-disable-next-line no-console\n          console.warn('You performed a .linked() task without immediately yielding/returning it. This is currently unsupported (but might be supported in future version of ember-concurrency).');\n        }\n        this._expectsLinkedYield = false;\n      }\n      return stepResult;\n    }\n    maybeResolveDefer() {\n      if (!this.defer || !this.state.isFinished) {\n        return;\n      }\n      if (this.state.completionState === _completionStates.COMPLETION_SUCCESS) {\n        this.defer.resolve(this.state.value);\n      } else {\n        this.defer.reject(this.state.error);\n      }\n    }\n    onFinalize(callback) {\n      this.finalizeCallbacks.push(callback);\n      if (this.state.isFinished) {\n        this.runFinalizeCallbacks();\n      }\n    }\n    runFinalizeCallbacks() {\n      this.finalizeCallbacks.forEach(cb => cb());\n      this.finalizeCallbacks = [];\n      this.maybeResolveDefer();\n      this.maybeThrowUnhandledTaskErrorLater();\n    }\n    promise() {\n      if (!this.defer) {\n        this.defer = this.env.defer();\n        this.asyncErrorsHandled = true;\n        this.maybeResolveDefer();\n      }\n      return this.defer.promise;\n    }\n    maybeThrowUnhandledTaskErrorLater() {\n      if (!this.asyncErrorsHandled && this.state.completionState === _completionStates.COMPLETION_ERROR && !(0, _cancelation.didCancel)(this.state.error)) {\n        this.env.async(() => {\n          if (!this.asyncErrorsHandled) {\n            this.env.reportUncaughtRejection(this.state.error);\n          }\n        });\n      }\n    }\n    requestCancel(request) {\n      if (this.cancelRequest || this.state.isFinished) {\n        return false;\n      }\n      this.cancelRequest = request;\n      return true;\n    }\n    finalize(value, completionState) {\n      if (this.cancelRequest) {\n        return this.finalizeWithCancel();\n      }\n      let state = {\n        completionState\n      };\n      if (completionState === _completionStates.COMPLETION_SUCCESS) {\n        state.isSuccessful = true;\n        state.value = value;\n      } else if (completionState === _completionStates.COMPLETION_ERROR) {\n        state.isError = true;\n        state.error = value;\n      } else if (completionState === _completionStates.COMPLETION_CANCEL) {\n        state.error = value;\n      }\n      this.finalizeShared(state);\n    }\n    finalizeWithCancel() {\n      let cancelReason = this.taskInstance.formatCancelReason(this.cancelRequest.reason);\n      let error = new Error(cancelReason);\n      if (this.debugEnabled()) {\n        // eslint-disable-next-line no-console\n        console.log(cancelReason);\n      }\n      error.name = _cancelation.TASK_CANCELATION_NAME;\n      this.finalizeShared({\n        isCanceled: true,\n        completionState: _completionStates.COMPLETION_CANCEL,\n        error,\n        cancelReason\n      });\n      this.cancelRequest.finalize();\n    }\n    debugEnabled() {\n      return this.debug || this.env.globalDebuggingEnabled();\n    }\n    finalizeShared(state) {\n      this.index++;\n      state.isFinished = true;\n      this.setState(state);\n      this.runFinalizeCallbacks();\n      this.dispatchFinalizeEvents(state.completionState);\n    }\n    dispatchFinalizeEvents(completionState) {\n      switch (completionState) {\n        case _completionStates.COMPLETION_SUCCESS:\n          this.taskInstance.onSuccess();\n          break;\n        case _completionStates.COMPLETION_ERROR:\n          this.taskInstance.onError(this.state.error);\n          break;\n        case _completionStates.COMPLETION_CANCEL:\n          this.taskInstance.onCancel(this.state.cancelReason);\n          break;\n      }\n    }\n    invokeYieldable(yieldedValue) {\n      try {\n        let maybeDisposer = yieldedValue[_yieldables.yieldableSymbol](this.taskInstance, this.index);\n        this.addDisposer(maybeDisposer);\n      } catch (e) {\n        this.env.reportUncaughtRejection(e);\n      }\n    }\n\n    /**\n     * `onYielded` is called when this task instance has been\n     * yielded in another task instance's execution. We take\n     * this opportunity to conditionally link up the tasks\n     * so that when the parent or child cancels, the other\n     * is cancelled.\n     *\n     * Given the following case:\n     *\n     * ```js\n     * parentTask: task(function * () {\n     *   yield otherTask.perform();\n     * })\n     * ```\n     *\n     * Then the `parent` param is the task instance that is executing, `this`\n     * is the `otherTask` task instance that was yielded.\n     *\n     * @private\n     */\n    onYielded(parent, resumeIndex) {\n      this.asyncErrorsHandled = true;\n      this.onFinalize(() => {\n        let completionState = this.state.completionState;\n        if (completionState === _completionStates.COMPLETION_SUCCESS) {\n          parent.proceed(resumeIndex, _yieldables.YIELDABLE_CONTINUE, this.state.value);\n        } else if (completionState === _completionStates.COMPLETION_ERROR) {\n          parent.proceed(resumeIndex, _yieldables.YIELDABLE_THROW, this.state.error);\n        } else if (completionState === _completionStates.COMPLETION_CANCEL) {\n          parent.proceed(resumeIndex, _yieldables.YIELDABLE_CANCEL, null);\n        }\n      });\n      let performType = this.getPerformType();\n      if (performType === PERFORM_TYPE_UNLINKED) {\n        return;\n      }\n      return () => {\n        this.detectSelfCancelLoop(performType, parent);\n        this.cancel(new _cancelation.CancelRequest(_cancelation.CANCEL_KIND_PARENT_CANCEL));\n      };\n    }\n    getPerformType() {\n      return this.taskInstance.performType || PERFORM_TYPE_DEFAULT;\n    }\n    detectSelfCancelLoop(performType, parent) {\n      if (performType !== PERFORM_TYPE_DEFAULT) {\n        return;\n      }\n      let parentCancelRequest = parent.executor && parent.executor.cancelRequest;\n\n      // Detect that the parent was cancelled by a lifespan ending and\n      // that the child is still running and not cancelled.\n      if (parentCancelRequest && parentCancelRequest.kind === _cancelation.CANCEL_KIND_LIFESPAN_END && !this.cancelRequest && !this.state.isFinished) {\n        this.taskInstance.selfCancelLoopWarning(parent);\n      }\n    }\n  }\n  _exports.TaskInstanceExecutor = TaskInstanceExecutor;\n});","define(\"ember-concurrency/-private/external/task-instance/initial-state\", [\"exports\", \"ember-concurrency/-private/external/task-instance/completion-states\"], function (_exports, _completionStates) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.INITIAL_STATE = void 0;\n  const INITIAL_STATE = {\n    completionState: _completionStates.COMPLETION_PENDING,\n    /**\n     * If this TaskInstance runs to completion by returning a property\n     * other than a rejecting promise, this property will be set\n     * with that value.\n     *\n     * @memberof TaskInstance\n     * @instance\n     * @readOnly\n     */\n    value: null,\n    /**\n     * If this TaskInstance is canceled or throws an error (or yields\n     * a promise that rejects), this property will be set with that error.\n     * Otherwise, it is null.\n     *\n     * @memberof TaskInstance\n     * @instance\n     * @readOnly\n     */\n    error: null,\n    /**\n     * True if the task instance is fulfilled.\n     *\n     * @memberof TaskInstance\n     * @instance\n     * @readOnly\n     */\n    isSuccessful: false,\n    /**\n     * True if the task instance resolves to a rejection.\n     *\n     * @memberof TaskInstance\n     * @instance\n     * @readOnly\n     */\n    isError: false,\n    /**\n     * True if the task instance is canceled\n     *\n     * @memberof TaskInstance\n     * @instance\n     * @readOnly\n     */\n    isCanceled: false,\n    /**\n     * True if the task instance has started, else false.\n     *\n     * @memberof TaskInstance\n     * @instance\n     * @readOnly\n     */\n    hasStarted: false,\n    /**\n     * True if the task has run to completion.\n     *\n     * @memberof TaskInstance\n     * @instance\n     * @readOnly\n     */\n    isFinished: false\n  };\n  _exports.INITIAL_STATE = INITIAL_STATE;\n});","define(\"ember-concurrency/-private/external/task/default-state\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.DEFAULT_STATE = void 0;\n  const DEFAULT_STATE = {\n    last: null,\n    lastRunning: null,\n    lastPerformed: null,\n    lastSuccessful: null,\n    lastComplete: null,\n    lastErrored: null,\n    lastCanceled: null,\n    lastIncomplete: null,\n    performCount: 0\n  };\n  _exports.DEFAULT_STATE = DEFAULT_STATE;\n  Object.freeze(DEFAULT_STATE);\n});","define(\"ember-concurrency/-private/external/task/task-group\", [\"exports\", \"ember-concurrency/-private/external/task/taskable\"], function (_exports, _taskable) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.TaskGroup = void 0;\n  class TaskGroup extends _taskable.Taskable {}\n  _exports.TaskGroup = TaskGroup;\n});","define(\"ember-concurrency/-private/external/task/task\", [\"exports\", \"ember-concurrency/-private/external/task/taskable\", \"ember-concurrency/-private/external/task-instance/executor\"], function (_exports, _taskable, _executor) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.Task = void 0;\n  class TaskLinkProxy {\n    constructor(task, performType, linkedObject) {\n      this.task = task;\n      this.performType = performType;\n      this.linkedObject = linkedObject;\n    }\n    perform() {\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n      return this.task._performShared(args, this.performType, this.linkedObject);\n    }\n  }\n  class Task extends _taskable.Taskable {\n    constructor(options) {\n      super(options);\n      this.generatorFactory = options.generatorFactory;\n      this.perform = this._perform.bind(this);\n    }\n    linked() {\n      let linkedObject = (0, _executor.getRunningInstance)();\n      if (!linkedObject) {\n        throw new Error(`You can only call .linked() from within a task.`);\n      }\n      return new TaskLinkProxy(this, _executor.PERFORM_TYPE_LINKED, linkedObject);\n    }\n    unlinked() {\n      return new TaskLinkProxy(this, _executor.PERFORM_TYPE_UNLINKED, null);\n    }\n    toString() {\n      return `<Task:${this.name}>`;\n    }\n    _clone() {\n      return new Task({\n        context: this.context,\n        debug: this.debug,\n        env: this.env,\n        generatorFactory: this.generatorFactory,\n        group: this.group,\n        hasEnabledEvents: this.hasEnabledEvents,\n        name: this.name,\n        onStateCallback: this.onStateCallback,\n        scheduler: this.scheduler\n      });\n    }\n    _curry() {\n      let task = this._clone();\n      for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n      task._curryArgs = [...(this._curryArgs || []), ...args];\n      return task;\n    }\n    _perform() {\n      for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n        args[_key3] = arguments[_key3];\n      }\n      return this._performShared(args, _executor.PERFORM_TYPE_DEFAULT, null);\n    }\n    _performShared(args, performType, linkedObject) {\n      let fullArgs = this._curryArgs ? [...this._curryArgs, ...args] : args;\n      let taskInstance = this._taskInstanceFactory(fullArgs, performType, linkedObject);\n      if (performType === _executor.PERFORM_TYPE_LINKED) {\n        linkedObject._expectsLinkedYield = true;\n      }\n      if (!this._isAlive) {\n        // a task linked to a dead lifetime should immediately cancel.\n        taskInstance.cancel();\n      }\n      this.scheduler.perform(taskInstance);\n      return taskInstance;\n    }\n\n    // eslint-disable-next-line no-unused-vars\n    _taskInstanceOptions(args, performType, _linkedObject) {\n      let generatorFactory = () => this.generatorFactory(args);\n      let taskInstanceOptions = {\n        task: this,\n        args,\n        executor: new _executor.TaskInstanceExecutor({\n          generatorFactory,\n          env: this.env,\n          debug: this.debug\n        }),\n        performType,\n        hasEnabledEvents: this.hasEnabledEvents\n      };\n      return taskInstanceOptions;\n    }\n  }\n  _exports.Task = Task;\n});","define(\"ember-concurrency/-private/external/task/taskable\", [\"exports\", \"ember-concurrency/-private/external/task/default-state\", \"ember-concurrency/-private/external/task-instance/cancelation\"], function (_exports, _defaultState, _cancelation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.Taskable = void 0;\n  let guidId = 0;\n  function makeGuid() {\n    return `ec_${guidId++}`;\n  }\n  class Taskable {\n    constructor(options) {\n      this.context = options.context;\n      this.debug = options.debug || false;\n      this.enabledModifiers = options.enabledModifiers;\n      this.env = options.env;\n      this.group = options.group;\n      this.hasEnabledEvents = options.hasEnabledEvents;\n      this.modifierOptions = options.modifierOptions;\n      this.name = options.name;\n      this.onStateCallback = options.onStateCallback;\n      this.scheduler = options.scheduler;\n      this.guid = makeGuid();\n      this.guids = {};\n      this.guids[this.guid] = true;\n      if (this.group) {\n        Object.assign(this.guids, this.group.guids);\n      }\n    }\n    cancelAll(options) {\n      let {\n        reason,\n        cancelRequestKind,\n        resetState\n      } = options || {};\n      reason = reason || '.cancelAll() was explicitly called on the Task';\n      let cancelRequest = new _cancelation.CancelRequest(cancelRequestKind || _cancelation.CANCEL_KIND_EXPLICIT, reason);\n      return this.scheduler.cancelAll(this.guid, cancelRequest).then(() => {\n        if (resetState) {\n          this._resetState();\n        }\n      });\n    }\n    get _isAlive() {\n      return true;\n    }\n    _resetState() {\n      this.setState(_defaultState.DEFAULT_STATE);\n    }\n\n    // override\n    setState() {}\n  }\n  _exports.Taskable = Taskable;\n  Object.assign(Taskable.prototype, _defaultState.DEFAULT_STATE);\n  Object.assign(Taskable.prototype, {\n    numRunning: 0,\n    numQueued: 0,\n    isRunning: false,\n    isQueued: false,\n    isIdle: true,\n    state: 'idle'\n  });\n});","define(\"ember-concurrency/-private/external/yieldables\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.Yieldable = _exports.YIELDABLE_THROW = _exports.YIELDABLE_RETURN = _exports.YIELDABLE_CONTINUE = _exports.YIELDABLE_CANCEL = void 0;\n  _exports.animationFrame = animationFrame;\n  _exports.forever = _exports.cancelableSymbol = void 0;\n  _exports.rawTimeout = rawTimeout;\n  _exports.yieldableSymbol = void 0;\n  const cancelableSymbol = '__ec_cancel__';\n  _exports.cancelableSymbol = cancelableSymbol;\n  const yieldableSymbol = '__ec_yieldable__';\n  _exports.yieldableSymbol = yieldableSymbol;\n  const YIELDABLE_CONTINUE = 'next';\n  _exports.YIELDABLE_CONTINUE = YIELDABLE_CONTINUE;\n  const YIELDABLE_THROW = 'throw';\n  _exports.YIELDABLE_THROW = YIELDABLE_THROW;\n  const YIELDABLE_RETURN = 'return';\n  _exports.YIELDABLE_RETURN = YIELDABLE_RETURN;\n  const YIELDABLE_CANCEL = 'cancel';\n\n  /**\n   * @class YieldableState\n   * @hideconstructor\n   */\n  _exports.YIELDABLE_CANCEL = YIELDABLE_CANCEL;\n  class YieldableState {\n    constructor(taskInstance, resumeIndex) {\n      this._taskInstance = taskInstance;\n      this._resumeIndex = resumeIndex;\n    }\n\n    /**\n     * Return yielded TaskInstance. Useful for introspection on instance state.\n     * @method getTaskInstance\n     * @memberof YieldableState\n     * @public\n     * @instance\n     */\n    getTaskInstance() {\n      return this._taskInstance;\n    }\n\n    /**\n     * Cancel the yielded TaskInstance.\n     * @method cancel\n     * @memberof YieldableState\n     * @public\n     * @instance\n     */\n    cancel() {\n      let taskInstance = this._taskInstance;\n      taskInstance.proceed.call(taskInstance, this._resumeIndex, YIELDABLE_CANCEL);\n    }\n\n    /**\n     * Cause the TaskInstance to return from its yield with an optional value,\n     * and continue executing.\n     * @method next\n     * @memberof YieldableState\n     * @param value\n     * @public\n     * @instance\n     */\n    next(value) {\n      let taskInstance = this._taskInstance;\n      taskInstance.proceed.call(taskInstance, this._resumeIndex, YIELDABLE_CONTINUE, value);\n    }\n\n    /**\n     * Short-circuit TaskInstance execution and have it return with an optional\n     * value.\n     * @method return\n     * @memberof YieldableState\n     * @param value\n     * @public\n     * @instance\n     */\n    return(value) {\n      let taskInstance = this._taskInstance;\n      taskInstance.proceed.call(taskInstance, this._resumeIndex, YIELDABLE_RETURN, value);\n    }\n\n    /**\n     * Raise a given error within the given task instance and halt execution\n     * @method throw\n     * @memberof YieldableState\n     * @param error\n     * @public\n     * @instance\n     */\n    throw(error) {\n      let taskInstance = this._taskInstance;\n      taskInstance.proceed.call(taskInstance, this._resumeIndex, YIELDABLE_THROW, error);\n    }\n  }\n\n  /**\n   * Yieldables are a primitive for building safe, cancelation-aware ways to\n   * instrument and introspect the runtime of a task. Many Yieldables are built-in\n   * to ember-concurrency today, such as `timeout`, `animationFrame`, and\n   * `rawTimeout`.\n   *\n   * For example, if I wanted to implement a yieldable for `requestIdleCallback`,\n   * I could do the following:\n   *\n   * ```javascript\n   * import Component from '@glimmer/component';\n   * import { task, Yieldable } from 'ember-concurrency';\n   *\n   * class IdleCallbackYieldable extends Yieldable {\n   *   onYield(state) {\n   *     let callbackId = requestIdleCallback(() => state.next());\n   *\n   *     return () => cancelIdleCallback(callbackId);\n   *   }\n   * }\n   *\n   * const idleCallback = () => new IdleCallbackYieldable();\n   *\n   * class MyComponent extends Component {\n   *   &#64;task *backgroundTask() {\n   *     while (1) {\n   *       yield idleCallback();\n   *\n   *       const data = this.complicatedNumberCrunching();\n   *       yield this.sendData(data);\n   *     }\n   *   }\n   * }\n   * ```\n   *\n   * In general, `Yieldable` instances **should** be reusable across calls, and thus\n   * care should be taken to ensure that teardown is provided and state not\n   * intended to be shared across calls stay inside `onYield`.\n   *\n   * `Yieldable` also provides automatic Promise-casting.\n   *\n   * <style>\n   *   .ignore-this--this-is-here-to-hide-constructor,\n   *   #Yieldable { display: none }\n   * </style>\n   *\n   * @class Yieldable\n   */\n  class Yieldable {\n    constructor() {\n      this[yieldableSymbol] = this[yieldableSymbol].bind(this);\n    }\n\n    /**\n     * Defines what happens when the task encounters `yield myYieldable` and returns\n     * a disposer function that handles any cleanup.\n     *\n     * The state parameter is provided by the runtime, and provides operations for\n     * interacting with the yielding task instance and advancing, returning,\n     * throwing, or canceling its execution.\n     *\n     * @method onYield\n     * @memberof Yieldable\n     * @param {YieldableState} state\n     * @instance\n     * @public\n     */\n    onYield() {}\n    _deferable() {\n      let def = {\n        resolve: undefined,\n        reject: undefined\n      };\n      def.promise = new Promise((resolve, reject) => {\n        def.resolve = resolve;\n        def.reject = reject;\n      });\n      return def;\n    }\n    _toPromise() {\n      let def = this._deferable();\n      let thinInstance = {\n        proceed(_index, resumeType, value) {\n          if (resumeType == YIELDABLE_CONTINUE || resumeType == YIELDABLE_RETURN) {\n            def.resolve(value);\n          } else {\n            def.reject(value);\n          }\n        }\n      };\n      let maybeDisposer = this[yieldableSymbol](thinInstance, 0);\n      def.promise[cancelableSymbol] = maybeDisposer;\n      return def.promise;\n    }\n\n    /**\n     * Returns a promise that resolves with the value yielded back to or returned\n     * to the yielded task, or rejects with either the exception thrown from the\n     * Yieldable, or an error with a `.name` property with value `\"TaskCancelation\"`.\n     *\n     * @method then\n     * @memberof Yieldable\n     * @instance\n     * @return {Promise}\n     */\n    then() {\n      return this._toPromise().then(...arguments);\n    }\n\n    /**\n     * @method catch\n     * @memberof Yieldable\n     * @instance\n     * @return {Promise}\n     */\n    catch() {\n      return this._toPromise().catch(...arguments);\n    }\n\n    /**\n     * @method finally\n     * @memberof Yieldable\n     * @instance\n     * @return {Promise}\n     */\n    finally() {\n      return this._toPromise().finally(...arguments);\n    }\n    [yieldableSymbol](taskInstance, resumeIndex) {\n      let state = new YieldableState(taskInstance, resumeIndex);\n      return this.onYield(state);\n    }\n  }\n  _exports.Yieldable = Yieldable;\n  class AnimationFrameYieldable extends Yieldable {\n    onYield(state) {\n      let timerId = requestAnimationFrame(() => state.next());\n      return () => cancelAnimationFrame(timerId);\n    }\n  }\n  class ForeverYieldable extends Yieldable {\n    onYield() {}\n  }\n  class RawTimeoutYieldable extends Yieldable {\n    constructor(ms) {\n      super();\n      this.ms = ms;\n    }\n    onYield(state) {\n      let timerId = setTimeout(() => state.next(), this.ms);\n      return () => clearTimeout(timerId);\n    }\n  }\n\n  /**\n   * Yielding `animationFrame()` will pause a task until after the next animation\n   * frame using the native `requestAnimationFrame()` browser API.\n   *\n   * The task below, when performed, will print the time since the last loop run\n   * for every animation frame.\n   *\n   * ```js\n   * export default class MyComponent extends Component {\n   *   &#64;task *myTask() {\n   *     let lastNow = performance.now();\n   *     while (true) {\n   *       yield animationFrame();\n   *\n   *       let now = performance.now();\n   *       let dt = now - lastNow;\n   *       lastNow = now;\n   *\n   *       console.log(dt);\n   *     }\n   *   }\n   * }\n   * ```\n   */\n  function animationFrame() {\n    return new AnimationFrameYieldable();\n  }\n\n  /**\n   *\n   * Yielding `forever` will pause a task indefinitely until\n   * it is cancelled (i.e. via host object destruction, the restartable modifier,\n   * or manual cancellation).\n   *\n   * This is often useful in cases involving animation: if you're\n   * using Liquid Fire, or some other animation scheme, sometimes you'll\n   * notice buttons visibly reverting to their inactive states during\n   * a route transition. By yielding `forever` in a Component task that drives a\n   * button's active state, you can keep a task indefinitely running\n   * until the animation runs to completion.\n   *\n   * NOTE: Liquid Fire also includes a useful `waitUntilIdle()` method\n   * on the `liquid-fire-transitions` service that you can use in a lot\n   * of these cases, but it won't cover cases of asynchrony that are\n   * unrelated to animation, in which case `forever` might be better suited\n   * to your needs.\n   *\n   * ```js\n   * import { task, forever } from 'ember-concurrency';\n   * export default class MyComponent extends Component {\n   *   &#64;service myService;\n   *   &#64;task *myTask() {\n   *     yield this.myService.doSomethingThatCausesATransition();\n   *     yield forever;\n   *   }\n   * }\n   * ```\n   */\n  const forever = new ForeverYieldable();\n\n  /**\n   *\n   * Yielding `rawTimeout(ms)` will pause a task for the duration\n   * of time passed in, in milliseconds.\n   *\n   * The timeout will use the native `setTimeout()` browser API,\n   * instead of the Ember runloop, which means that test helpers\n   * will *not* wait for it to complete.\n   *\n   * The task below, when performed, will print a message to the\n   * console every second.\n   *\n   * ```js\n   * export default class MyComponent extends Component {\n   *   &#64;task *myTask() {\n   *     while (true) {\n   *       console.log(\"Hello!\");\n   *       yield rawTimeout(1000);\n   *     }\n   *   }\n   * }\n   * ```\n   *\n   * @param {number} ms - the amount of time to sleep before resuming\n   *   the task, in milliseconds\n   */\n  _exports.forever = forever;\n  function rawTimeout(ms) {\n    return new RawTimeoutYieldable(ms);\n  }\n});","define(\"ember-concurrency/-private/helpers\", [\"exports\", \"@ember/object\", \"@ember/debug\"], function (_exports, _object, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.taskHelperClosure = taskHelperClosure;\n  function taskHelperClosure(helperName, taskMethod, _args, hash) {\n    let task = _args[0];\n    let outerArgs = _args.slice(1);\n    return function () {\n      if (!task || typeof task[taskMethod] !== 'function') {\n        (true && !(false) && (0, _debug.assert)(`The first argument passed to the \\`${helperName}\\` helper should be a Task object (without quotes); you passed ${task}`, false));\n        return;\n      }\n      for (var _len = arguments.length, innerArgs = new Array(_len), _key = 0; _key < _len; _key++) {\n        innerArgs[_key] = arguments[_key];\n      }\n      if (hash && hash.value) {\n        let event = innerArgs.pop();\n        innerArgs.push((0, _object.get)(event, hash.value));\n      }\n      return task[taskMethod](...outerArgs, ...innerArgs);\n    };\n  }\n});","define(\"ember-concurrency/-private/scheduler/ember-scheduler\", [\"exports\", \"ember-concurrency/-private/external/scheduler/scheduler\", \"@ember/runloop\"], function (_exports, _scheduler, _runloop) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class EmberScheduler extends _scheduler.default {\n    scheduleRefresh() {\n      (0, _runloop.once)(this, this.refresh);\n    }\n  }\n  var _default = EmberScheduler;\n  _exports.default = _default;\n});","define(\"ember-concurrency/-private/task-decorators\", [\"exports\", \"@ember/object\", \"ember-concurrency/-private/external/task-decorators\", \"ember-concurrency/-private/task-factory\", \"ember-concurrency/-private/utils\"], function (_exports, _object, _taskDecorators, _taskFactory, _utils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.taskGroup = _exports.task = _exports.restartableTaskGroup = _exports.restartableTask = _exports.lastValue = _exports.keepLatestTaskGroup = _exports.keepLatestTask = _exports.enqueueTaskGroup = _exports.enqueueTask = _exports.dropTaskGroup = _exports.dropTask = void 0;\n  const computedLastValue = (0, _taskDecorators.decoratorWithParams)(function (target, key, descriptor) {\n    let [taskName] = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n    const {\n      initializer\n    } = descriptor;\n    delete descriptor.initializer;\n    let cp = (0, _object.computed)(`${taskName}.lastSuccessful`, function () {\n      let lastInstance = (0, _object.get)(this, `${taskName}.lastSuccessful`);\n      if (lastInstance) {\n        // eslint-disable-next-line ember/no-get\n        return (0, _object.get)(lastInstance, 'value');\n      }\n      if (initializer) {\n        return initializer.call(this);\n      }\n      return undefined;\n    });\n    return cp(target, key, descriptor);\n  });\n  const lastValue = _utils.USE_TRACKED ? _taskDecorators.lastValue : computedLastValue;\n\n  /**\n   * A Task is a cancelable, restartable, asynchronous operation that\n   * is driven by a generator function. Tasks are automatically canceled\n   * when the object they live on is destroyed (e.g. a Component\n   * is unrendered).\n   *\n   * Turns the decorated generator function into a task.\n   *\n   * Optionally takes a hash of options that will be applied as modifiers to the\n   * task. For instance `maxConcurrency`, `on`, `group` or `keepLatest`.\n   *\n   * By default, tasks have no concurrency constraints\n   * (multiple instances of a task can be running at the same time)\n   * but much of a power of tasks lies in proper usage of Task Modifiers\n   * that you can apply to a task.\n   *\n   * You can also define an\n   * <a href=\"/docs/advanced/encapsulated-task\">Encapsulated Task</a>\n   * by decorating an object that defines a `perform` generator\n   * method.\n   *\n   * ```js\n   * import Component from '@ember/component';\n   * import { task } from 'ember-concurrency';\n   *\n   * class MyComponent extends Component {\n   *   &#64;task\n   *   *plainTask() {}\n   *\n   *   &#64;task({ maxConcurrency: 5, keepLatest: true, cancelOn: 'click' })\n   *   *taskWithModifiers() {}\n   * }\n   * ```\n   *\n   * @function\n   * @param {object?} [options={}] Task modifier options\n   * @param {string|string[]} [options.cancelOn] Events to cancel task on. Applies only to `&#64;ember/component`\n   * @param {boolean} [options.enqueue] Sets `enqueue` modifier on task if `true`\n   * @param {boolean} [options.evented] Enables [task lifecycle events](/docs/advanced/lifecycle-events) for this Task, if `true`\n   * @param {boolean} [options.debug] Enables task debugging if `true`\n   * @param {boolean} [options.drop] Sets `drop` modifier on task if `true`\n   * @param {string} [options.group] Associates task with the group specified\n   * @param {boolean} [options.keepLatest] Sets `keepLatest` modifier on task if `true`\n   * @param {number} [options.maxConcurrency] Sets the maximum number of running task instances for the task\n   * @param {string|string[]} [options.observes] Properties to watch and cause task to be performed when they change\n   * @param {string|string[]} [options.on] Events to perform task on. Applies only to `&#64;ember/component`\n   * @param {function?} [options.onState] Callback to use for state tracking. May be set to `null` to disable state tracking.\n   * @param {boolean} [options.restartable] Sets `restartable` modifier on task if `true`\n   * @return {Task}\n   */\n  _exports.lastValue = lastValue;\n  const task = (0, _taskDecorators.createTaskDecorator)({}, _taskFactory.TaskFactory);\n\n  /**\n   * Turns the decorated generator function into a task and applies the\n   * `drop` modifier.\n   *\n   * Optionally takes a hash of options that will be applied as modifiers to the\n   * task. For instance `maxConcurrency`, `on`, or `group`.\n   *\n   * You can also define an\n   * <a href=\"/docs/advanced/encapsulated-task\">Encapsulated Task</a>\n   * by decorating an object that defines a `perform` generator\n   * method.\n   *\n   * ```js\n   * import Component from '@ember/component';\n   * import { task, dropTask } from 'ember-concurrency';\n   *\n   * class MyComponent extends Component {\n   *   &#64;task\n   *   *plainTask() {}\n   *\n   *   &#64;dropTask({ cancelOn: 'click' })\n   *   *myDropTask() {}\n   * }\n   * ```\n   *\n   * @function\n   * @param {object?} [options={}] Task modifier options. See {@link task} for list.\n   * @return {Task}\n   */\n  _exports.task = task;\n  const dropTask = (0, _taskDecorators.createTaskDecorator)({\n    drop: true\n  }, _taskFactory.TaskFactory);\n\n  /**\n   * Turns the decorated generator function into a task and applies the\n   * `enqueue` modifier.\n   *\n   * Optionally takes a hash of options that will be applied as modifiers to the\n   * task. For instance `maxConcurrency`, `on`, or `group`.\n   *\n   * You can also define an\n   * <a href=\"/docs/advanced/encapsulated-task\">Encapsulated Task</a>\n   * by decorating an object that defines a `perform` generator\n   * method.\n   *\n   * ```js\n   * import Component from '@ember/component';\n   * import { task, enqueueTask } from 'ember-concurrency';\n   *\n   * class MyComponent extends Component {\n   *   &#64;task\n   *   *plainTask() {}\n   *\n   *   &#64;enqueueTask({ cancelOn: 'click' })\n   *   *myEnqueueTask() {}\n   * }\n   * ```\n   *\n   * @function\n   * @param {object?} [options={}] Task modifier options. See {@link task} for list.\n   * @return {Task}\n   */\n  _exports.dropTask = dropTask;\n  const enqueueTask = (0, _taskDecorators.createTaskDecorator)({\n    enqueue: true\n  }, _taskFactory.TaskFactory);\n\n  /**\n   * Turns the decorated generator function into a task and applies the\n   * `keepLatest` modifier.\n   *\n   * Optionally takes a hash of options that will be applied as modifiers to the\n   * task. For instance `maxConcurrency`, `on`, or `group`.\n   *\n   * You can also define an\n   * <a href=\"/docs/advanced/encapsulated-task\">Encapsulated Task</a>\n   * by decorating an object that defines a `perform` generator\n   * method.\n   *\n   * ```js\n   * import Component from '@ember/component';\n   * import { task, keepLatestTask } from 'ember-concurrency';\n   *\n   * class MyComponent extends Component {\n   *   &#64;task\n   *   *plainTask() {}\n   *\n   *   &#64;keepLatestTask({ cancelOn: 'click' })\n   *   *myKeepLatestTask() {}\n   * }\n   * ```\n   *\n   * @function\n   * @param {object?} [options={}] Task modifier options. See {@link task} for list.\n   * @return {Task}\n   */\n  _exports.enqueueTask = enqueueTask;\n  const keepLatestTask = (0, _taskDecorators.createTaskDecorator)({\n    keepLatest: true\n  }, _taskFactory.TaskFactory);\n\n  /**\n   * Turns the decorated generator function into a task and applies the\n   * `restartable` modifier.\n   *\n   * Optionally takes a hash of options that will be applied as modifiers to the\n   * task. For instance `maxConcurrency`, `on`, or `group`.\n   *\n   * You can also define an\n   * <a href=\"/docs/advanced/encapsulated-task\">Encapsulated Task</a>\n   * by decorating an object that defines a `perform` generator\n   * method.\n   *\n   * ```js\n   * import Component from '@ember/component';\n   * import { task, restartableTask } from 'ember-concurrency';\n   *\n   * class MyComponent extends Component {\n   *   &#64;task\n   *   *plainTask() {}\n   *\n   *   &#64;restartableTask({ cancelOn: 'click' })\n   *   *myRestartableTask() {}\n   * }\n   * ```\n   *\n   * @function\n   * @param {object?} [options={}] Task modifier options. See {@link task} for list.\n   * @return {Task}\n   */\n  _exports.keepLatestTask = keepLatestTask;\n  const restartableTask = (0, _taskDecorators.createTaskDecorator)({\n    restartable: true\n  }, _taskFactory.TaskFactory);\n\n  /**\n   * \"Task Groups\" provide a means for applying\n   * task modifiers to groups of tasks. Once a {@linkcode Task} is declared\n   * as part of a group task, modifiers like `drop` or `restartable`\n   * will no longer affect the individual `Task`. Instead those\n   * modifiers can be applied to the entire group.\n   *\n   * Turns the decorated property into a task group.\n   *\n   * Optionally takes a hash of options that will be applied as modifiers to the\n   * task group. For instance `maxConcurrency` or `keepLatest`.\n   *\n   * ```js\n   * import Component from '@glimmer/component';\n   * import { task, taskGroup } from 'ember-concurrency';\n   *\n   * class MyComponent extends Component {\n   *   &#64;taskGroup({ maxConcurrency: 5 }) chores;\n   *\n   *   &#64;task({ group: 'chores' })\n   *   *mowLawn() {}\n   *\n   *   &#64;task({ group: 'chores' })\n   *   *doDishes() {}\n   * }\n   * ```\n   *\n   * @function\n   * @param {object?} [options={}] Task group modifier options. See {@link task} for list.\n   * @return {TaskGroup}\n   */\n  _exports.restartableTask = restartableTask;\n  const taskGroup = (0, _taskDecorators.createTaskGroupDecorator)({}, _taskFactory.TaskFactory);\n\n  /**\n   * Turns the decorated property into a task group and applies the\n   * `drop` modifier.\n   *\n   * Optionally takes a hash of further options that will be applied as modifiers\n   * to the task group.\n   *\n   * @function\n   * @param {object?} [options={}] Task group modifier options. See {@link task} for list.\n   * @return {TaskGroup}\n   */\n  _exports.taskGroup = taskGroup;\n  const dropTaskGroup = (0, _taskDecorators.createTaskGroupDecorator)({\n    drop: true\n  }, _taskFactory.TaskFactory);\n\n  /**\n   * Turns the decorated property into a task group and applies the\n   * `enqueue` modifier.\n   *\n   * Optionally takes a hash of further options that will be applied as modifiers\n   * to the task group.\n   *\n   * @function\n   * @param {object?} [options={}] Task group modifier options. See {@link task} for list.\n   * @return {TaskGroup}\n   */\n  _exports.dropTaskGroup = dropTaskGroup;\n  const enqueueTaskGroup = (0, _taskDecorators.createTaskGroupDecorator)({\n    enqueue: true\n  }, _taskFactory.TaskFactory);\n\n  /**\n   * Turns the decorated property into a task group and applies the\n   * `keepLatest` modifier.\n   *\n   * Optionally takes a hash of further options that will be applied as modifiers\n   * to the task group.\n   *\n   * @function\n   * @param {object?} [options={}] Task group modifier options. See {@link task} for list.\n   * @return {TaskGroup}\n   */\n  _exports.enqueueTaskGroup = enqueueTaskGroup;\n  const keepLatestTaskGroup = (0, _taskDecorators.createTaskGroupDecorator)({\n    keepLatest: true\n  }, _taskFactory.TaskFactory);\n\n  /**\n   * Turns the decorated property into a task group and applies the\n   * `restartable` modifier.\n   *\n   * Optionally takes a hash of further options that will be applied as modifiers\n   * to the task group.\n   *\n   * @function\n   * @param {object?} [options={}] Task group modifier options. See {@link task} for list.\n   * @return {TaskGroup}\n   */\n  _exports.keepLatestTaskGroup = keepLatestTaskGroup;\n  const restartableTaskGroup = (0, _taskDecorators.createTaskGroupDecorator)({\n    restartable: true\n  }, _taskFactory.TaskFactory);\n  _exports.restartableTaskGroup = restartableTaskGroup;\n});","define(\"ember-concurrency/-private/task-factory\", [\"exports\", \"@ember/debug\", \"@ember/object\", \"@ember/object/events\", \"@ember/object/observers\", \"@ember/runloop\", \"ember-concurrency/-private/external/task-factory\", \"ember-concurrency/-private/task\", \"ember-concurrency/-private/task-properties\", \"ember-concurrency/-private/task-group\", \"ember-concurrency/-private/scheduler/ember-scheduler\", \"ember-concurrency/-private/ember-environment\"], function (_exports, _debug, _object, _events, _observers, _runloop, _taskFactory, _task, _taskProperties, _taskGroup, _emberScheduler, _emberEnvironment) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.TaskFactory = void 0;\n  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n  function _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\n  function _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n  let handlerCounter = 0;\n  function registerOnPrototype(addListenerOrObserver, proto, names, taskName, taskMethod, once) {\n    if (names && names.length > 0) {\n      for (let i = 0; i < names.length; ++i) {\n        let name = names[i];\n        let handlerName = `__ember_concurrency_handler_${handlerCounter++}`;\n        proto[handlerName] = makeTaskCallback(taskName, taskMethod, once);\n        addListenerOrObserver(proto, name, null, handlerName);\n      }\n    }\n  }\n  function makeTaskCallback(taskName, method, once) {\n    return function () {\n      let task = (0, _object.get)(this, taskName);\n      if (once) {\n        (0, _runloop.scheduleOnce)('actions', task, method, ...arguments);\n      } else {\n        task[method].apply(task, arguments);\n      }\n    };\n  }\n  const ensureArray = possibleArr => Array.isArray(possibleArr) ? possibleArr : [possibleArr];\n  (0, _taskFactory.registerModifier)('cancelOn', (factory, eventNames) => factory.addCancelEvents(...ensureArray(eventNames)));\n  (0, _taskFactory.registerModifier)('observes', (factory, propertyPaths) => factory.addObserverKeys(...ensureArray(propertyPaths)));\n  (0, _taskFactory.registerModifier)('on', (factory, eventNames) => factory.addPerformEvents(...ensureArray(eventNames)));\n  class TaskFactory extends _taskFactory.TaskFactory {\n    constructor() {\n      super(...arguments);\n      _defineProperty(this, \"env\", _emberEnvironment.EMBER_ENVIRONMENT);\n    }\n    createTask(context) {\n      (true && !(this.taskDefinition) && (0, _debug.assert)(`Cannot create task if a task definition is not provided as generator function or encapsulated task.`, this.taskDefinition));\n      let options = this.getTaskOptions(context);\n      if (typeof this.taskDefinition === 'object') {\n        return new _task.EncapsulatedTask(Object.assign({\n          taskObj: this.taskDefinition\n        }, options));\n      } else {\n        return new _task.Task(Object.assign({\n          generatorFactory: args => this.taskDefinition.apply(context, args)\n        }, options));\n      }\n    }\n    createTaskGroup(context) {\n      (true && !(!this.taskDefinition) && (0, _debug.assert)(`A task definition is not expected for a task group.`, !this.taskDefinition));\n      let options = this.getTaskOptions(context);\n      return new _taskGroup.TaskGroup(options);\n    }\n    addCancelEvents() {\n      this._cancelEventNames = this._cancelEventNames || [];\n      this._cancelEventNames.push(...arguments);\n      return this;\n    }\n    addObserverKeys() {\n      this._observes = this._observes || [];\n      this._observes.push(...arguments);\n      return this;\n    }\n    addPerformEvents() {\n      this._eventNames = this._eventNames || [];\n      this._eventNames.push(...arguments);\n      return this;\n    }\n    getModifier(name) {\n      let modifier = super.getModifier(name);\n      if (!modifier && typeof _taskProperties.TaskProperty.prototype[name] === 'function') {\n        // Shim for compatibility with user-defined TaskProperty prototype\n        // extensions. To be removed when replaced with proper public API.\n        modifier = _taskProperties.TaskProperty.prototype[name].bind(this);\n      }\n      (true && !(modifier) && (0, _debug.assert)(`Task option '${name}' is not recognized as a supported option.`, modifier));\n      return modifier;\n    }\n    getScheduler(schedulerPolicy, stateTrackingEnabled) {\n      return new _emberScheduler.default(schedulerPolicy, stateTrackingEnabled);\n    }\n    _setupEmberKVO(proto) {\n      // TODO: Does this make sense in a post-Ember object world?\n\n      registerOnPrototype(_events.addListener, proto, this._eventNames, this.name, 'perform', false);\n      registerOnPrototype(_events.addListener, proto, this._cancelEventNames, this.name, 'cancelAll', false);\n      registerOnPrototype(_observers.addObserver, proto, this._observes, this.name, 'perform', true);\n    }\n\n    // Provided for compatibility with ember-concurrency TaskProperty extension\n    // methods\n    get taskFn() {\n      return this.taskDefinition;\n    }\n    set taskFn(fn) {\n      this.setTaskDefinition(fn);\n    }\n  }\n  _exports.TaskFactory = TaskFactory;\n});","define(\"ember-concurrency/-private/task-group\", [\"exports\", \"ember-concurrency/-private/external/task/task-group\", \"ember-concurrency/-private/taskable-mixin\", \"ember-concurrency/-private/tracked-state\"], function (_exports, _taskGroup, _taskableMixin, _trackedState) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.TaskGroup = void 0;\n  /**\n   * \"Task Groups\" provide a means for applying\n   * task modifiers to groups of tasks. Once a {@linkcode Task} is declared\n   * as part of a group task, modifiers like `drop` or `restartable`\n   * will no longer affect the individual `Task`. Instead those\n   * modifiers can be applied to the entire group.\n   *\n   * Turns the decorated property into a task group.\n   *\n   * Optionally takes a hash of options that will be applied as modifiers to the\n   * task group. For instance `maxConcurrency` or `keepLatest`.\n   *\n   * ```js\n   * import Component from '@glimmer/component';\n   * import { task, taskGroup } from 'ember-concurrency';\n   *\n   * class MyComponent extends Component {\n   *   &#64;taskGroup({ maxConcurrency: 5 }) chores;\n   *\n   *   &#64;task({ group: 'chores' })\n   *   *mowLawn() {}\n   *\n   *   &#64;task({ group: 'chores' })\n   *   *doDishes() {}\n   * }\n   * ```\n   *\n   * <style>\n   *  .ignore-this--this-is-here-to-hide-constructor,\n   *  #TaskGroup { display: none }\n   * </style>\n   *\n   * @class TaskGroup\n   */\n  class TaskGroup extends _taskGroup.TaskGroup {\n    /**\n     * Cancels all running or queued `TaskInstance`s for this task group.\n     * If you're trying to cancel a specific TaskInstance (rather\n     * than all of the instances running under this task group) call\n     * `.cancel()` on the specific TaskInstance.\n     *\n     * @method cancelAll\n     * @memberof TaskGroup\n     * @param options.reason A descriptive reason the task group was\n     *   cancelled. Defaults to `\".cancelAll() was explicitly called\n     *   on the Task\"`.\n     * @param options.resetState If true, will clear the task group state\n     *   (`last*` and `performCount` properties will be set to initial\n     *   values). Defaults to false.\n     * @instance\n     * @async\n     *\n     */\n    /**\n     * `true` if any current task instances are running.\n     *\n     * @memberof TaskGroup\n     * @member {boolean} isRunning\n     * @instance\n     * @readOnly\n     */\n    /**\n     * `true` if any future task instances are queued.\n     *\n     * @memberof TaskGroup\n     * @member {boolean} isQueued\n     * @instance\n     * @readOnly\n     */\n    /**\n     * `true` if the task is not in the running or queued state.\n     *\n     * @memberof TaskGroup\n     * @member {boolean} isIdle\n     * @instance\n     * @readOnly\n     */\n    /**\n     * The current state of the task: `\"running\"`, `\"queued\"` or `\"idle\"`.\n     *\n     * @memberof TaskGroup\n     * @member {string} state\n     * @instance\n     * @readOnly\n     */\n    /**\n     * The most recently started task instance.\n     *\n     * @memberof TaskGroup\n     * @member {TaskInstance} last\n     * @instance\n     * @readOnly\n     */\n    /**\n     * The most recent task instance that is currently running.\n     *\n     * @memberof TaskGroup\n     * @member {TaskInstance} lastRunning\n     * @instance\n     * @readOnly\n     */\n    /**\n     * The most recently performed task instance.\n     *\n     * @memberof TaskGroup\n     * @member {TaskInstance} lastPerformed\n     * @instance\n     * @readOnly\n     */\n    /**\n     * The most recent task instance that succeeded.\n     *\n     * @memberof TaskGroup\n     * @member {TaskInstance} lastSuccessful\n     * @instance\n     * @readOnly\n     */\n    /**\n     * The most recently completed task instance.\n     *\n     * @memberof TaskGroup\n     * @member {TaskInstance} lastComplete\n     * @instance\n     * @readOnly\n     */\n    /**\n     * The most recent task instance that errored.\n     *\n     * @memberof TaskGroup\n     * @member {TaskInstance} lastErrored\n     * @instance\n     * @readOnly\n     */\n    /**\n     * The most recently canceled task instance.\n     *\n     * @memberof TaskGroup\n     * @member {TaskInstance} lastCanceled\n     * @instance\n     * @readOnly\n     */\n    /**\n     * The most recent task instance that is incomplete.\n     *\n     * @memberof TaskGroup\n     * @member {TaskInstance} lastIncomplete\n     * @instance\n     * @readOnly\n     */\n    /**\n     * The number of times this task has been performed.\n     *\n     * @memberof TaskGroup\n     * @member {number} performCount\n     * @instance\n     * @readOnly\n     */\n  }\n  _exports.TaskGroup = TaskGroup;\n  if (_trackedState.TRACKED_INITIAL_TASK_STATE) {\n    Object.defineProperties(TaskGroup.prototype, _trackedState.TRACKED_INITIAL_TASK_STATE);\n  }\n  Object.assign(TaskGroup.prototype, _taskableMixin.TASKABLE_MIXIN);\n});","define(\"ember-concurrency/-private/task-instance\", [\"exports\", \"ember-concurrency/-private/external/task-instance/base\", \"ember-concurrency/-private/tracked-state\", \"ember-concurrency/-private/utils\"], function (_exports, _base, _trackedState, _utils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.TaskInstance = void 0;\n  /**\n    A `TaskInstance` represent a single execution of a\n    {@linkcode Task}. Every call to {@linkcode Task#perform} returns\n    a `TaskInstance`.\n  \n    `TaskInstance`s are cancelable, either explicitly\n    via {@linkcode TaskInstance#cancel} or {@linkcode Task#cancelAll},\n    or automatically due to the host object being destroyed, or\n    because concurrency policy enforced by a\n    {@linkcode TaskProperty Task Modifier} canceled the task instance.\n  \n    <style>\n      .ignore-this--this-is-here-to-hide-constructor,\n      #TaskInstance { display: none }\n    </style>\n  \n    @class TaskInstance\n  */\n\n  class TaskInstance extends _base.BaseTaskInstance {\n    setState(props) {\n      let state = this._recomputeState(props);\n      (0, _utils.assignProperties)(this, {\n        ...props,\n        isRunning: !props.isFinished,\n        isDropped: state === 'dropped',\n        state\n      });\n    }\n    _recomputeState(props) {\n      if (props.isDropped) {\n        return 'dropped';\n      } else if (props.isCanceled) {\n        if (props.hasStarted) {\n          return 'canceled';\n        } else {\n          return 'dropped';\n        }\n      } else if (props.isFinished) {\n        return 'finished';\n      } else if (props.hasStarted) {\n        return 'running';\n      } else {\n        return 'waiting';\n      }\n    }\n    onStarted() {\n      this.triggerEvent('started', this);\n    }\n    onSuccess() {\n      this.triggerEvent('succeeded', this);\n    }\n    onError(error) {\n      this.triggerEvent('errored', this, error);\n    }\n    onCancel(cancelReason) {\n      this.triggerEvent('canceled', this, cancelReason);\n    }\n    formatCancelReason(reason) {\n      return `TaskInstance '${this.getName()}' was canceled because ${reason}. For more information, see: http://ember-concurrency.com/docs/task-cancelation-help`;\n    }\n    getName() {\n      if (!this.name) {\n        this.name = this.task && this.task.name || '<unknown>';\n      }\n      return this.name;\n    }\n    selfCancelLoopWarning(parent) {\n      let parentName = `\\`${parent.getName()}\\``;\n      let childName = `\\`${this.getName()}\\``;\n      // eslint-disable-next-line no-console\n      console.warn(`ember-concurrency detected a potentially hazardous \"self-cancel loop\" between parent task ${parentName} and child task ${childName}. If you want child task ${childName} to be canceled when parent task ${parentName} is canceled, please change \\`.perform()\\` to \\`.linked().perform()\\`. If you want child task ${childName} to keep running after parent task ${parentName} is canceled, change it to \\`.unlinked().perform()\\``);\n    }\n    triggerEvent() {\n      if (!this.hasEnabledEvents) {\n        return;\n      }\n      let taskInstance = this;\n      let task = taskInstance.task;\n      let host = task.context;\n      let eventNamespace = task && task.name;\n      if (host && host.trigger && eventNamespace) {\n        for (var _len = arguments.length, allArgs = new Array(_len), _key = 0; _key < _len; _key++) {\n          allArgs[_key] = arguments[_key];\n        }\n        let [eventType, ...args] = allArgs;\n        host.trigger(`${eventNamespace}:${eventType}`, ...args);\n      }\n    }\n\n    /**\n     * Describes the state that the task instance is in. Can be used for debugging,\n     * or potentially driving some UI state. Possible values are:\n     *\n     * - `\"dropped\"`: task instance was canceled before it started\n     * - `\"canceled\"`: task instance was canceled before it could finish\n     * - `\"finished\"`: task instance ran to completion (even if an exception was thrown)\n     * - `\"running\"`: task instance is currently running (returns true even if\n     *     is paused on a yielded promise)\n     * - `\"waiting\"`: task instance hasn't begun running yet (usually\n     *     because the task is using the {@linkcode TaskProperty#enqueue enqueue}\n     *     task modifier)\n     *\n     * The animated timeline examples on the [Task Concurrency](/docs/task-concurrency)\n     * docs page make use of this property.\n     *\n     * @name state\n     * @memberof TaskInstance\n     * @instance\n     * @readOnly\n     */\n\n    /**\n     * True if the TaskInstance was canceled before it could\n     * ever start running. For example, calling\n     * {@linkcode Task#perform .perform()} twice on a\n     * task with the {@linkcode TaskProperty#drop drop} modifier applied\n     * will result in the second task instance being dropped.\n     *\n     * @name isDropped\n     * @memberof TaskInstance\n     * @instance\n     * @readOnly\n     */\n\n    /**\n     * True if the task is still running.\n     *\n     * @name isRunning\n     * @memberof TaskInstance\n     * @instance\n     * @readOnly\n     */\n\n    /**\n     * Event emitted when a new {@linkcode TaskInstance} starts executing.\n     *\n     * `on` from `@ember/object/evented` may be used to create a binding on the host object to the event.\n     *\n     * ```js\n     * export default Component.extend({\n     *   doSomething: task(function * () {\n     *     // ... does something\n     *   }),\n     *\n     *   onDoSomethingStarted: on('doSomething:started', function (taskInstance) {\n     *     // ...\n     *   })\n     * });\n     * ```\n     *\n     * @event TaskInstance#TASK_NAME:started\n     * @param {TaskInstance} taskInstance - Task instance that was started\n     */\n\n    /**\n     * Event emitted when a {@linkcode TaskInstance} succeeds.\n     *\n     * `on` from `@ember/object/evented` may be used to create a binding on the host object to the event.\n     *\n     * ```js\n     * export default Component.extend({\n     *   doSomething: task(function * () {\n     *     // ... does something\n     *   }),\n     *\n     *   onDoSomethingSucceeded: on('doSomething:succeeded', function (taskInstance) {\n     *     // ...\n     *   })\n     * });\n     * ```\n     *\n     * @event TaskInstance#TASK_NAME:succeeded\n     * @param {TaskInstance} taskInstance - Task instance that was succeeded\n     */\n\n    /**\n     * Event emitted when a {@linkcode TaskInstance} throws an an error that is\n     * not handled within the task itself.\n     *\n     * `on` from `@ember/object/evented` may be used to create a binding on the host object to the event.\n     *\n     * ```js\n     * export default Component.extend({\n     *   doSomething: task(function * () {\n     *     // ... does something\n     *   }),\n     *\n     *   onDoSomethingErrored: on('doSomething:errored', function (taskInstance, error) {\n     *     // ...\n     *   })\n     * });\n     * ```\n     *\n     * @event TaskInstance#TASK_NAME:errored\n     * @param {TaskInstance} taskInstance - Task instance that was started\n     * @param {Error} error - Error that was thrown by the task instance\n     */\n\n    /**\n     * Event emitted when a {@linkcode TaskInstance} is canceled.\n     *\n     * `on` from `@ember/object/evented` may be used to create a binding on the host object to the event.\n     *\n     * ```js\n     * export default Component.extend({\n     *   doSomething: task(function * () {\n     *     // ... does something\n     *   }),\n     *\n     *   onDoSomethingCanceled: on('doSomething:canceled', function (taskInstance, cancelationReason) {\n     *     // ...\n     *   })\n     * });\n     * ```\n     *\n     * @event TaskInstance#TASK_NAME:canceled\n     * @param {TaskInstance} taskInstance - Task instance that was started\n     * @param {string} cancelationReason - Cancelation reason that was was provided to {@linkcode TaskInstance#cancel}\n     */\n\n    /**\n     * Cancels the task instance. Has no effect if the task instance has\n     * already been canceled or has already finished running.\n     *\n     * @method cancel\n     * @memberof TaskInstance\n     * @instance\n     * @async\n     */\n\n    /**\n     * Returns a promise that resolves with the value returned\n     * from the task's (generator) function, or rejects with\n     * either the exception thrown from the task function, or\n     * an error with a `.name` property with value `\"TaskCancelation\"`.\n     *\n     * @method then\n     * @memberof TaskInstance\n     * @instance\n     * @return {Promise}\n     */\n\n    /**\n     * @method catch\n     * @memberof TaskInstance\n     * @instance\n     * @return {Promise}\n     */\n\n    /**\n     * @method finally\n     * @memberof TaskInstance\n     * @instance\n     * @return {Promise}\n     */\n  }\n  _exports.TaskInstance = TaskInstance;\n  if (_trackedState.TRACKED_INITIAL_INSTANCE_STATE) {\n    Object.defineProperties(TaskInstance.prototype, _trackedState.TRACKED_INITIAL_INSTANCE_STATE);\n  }\n});","define(\"ember-concurrency/-private/task-properties\", [\"exports\", \"ember\", \"@ember/object\", \"@ember/object/computed\", \"ember-concurrency/-private/external/scheduler/policies/enqueued-policy\", \"ember-concurrency/-private/external/scheduler/policies/drop-policy\", \"ember-concurrency/-private/external/scheduler/policies/keep-latest-policy\", \"ember-concurrency/-private/external/scheduler/policies/restartable-policy\"], function (_exports, _ember, _object, _computed, _enqueuedPolicy, _dropPolicy, _keepLatestPolicy, _restartablePolicy) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.propertyModifiers = _exports.TaskProperty = _exports.TaskGroupProperty = void 0;\n  _exports.taskComputed = taskComputed;\n  _exports.taskFactorySymbol = void 0;\n  let taskFactorySymbol = '__ec_task_factory';\n  _exports.taskFactorySymbol = taskFactorySymbol;\n  const propertyModifiers = {\n    /**\n     * Configures the task to cancel old currently task instances\n     * to make room for a new one to perform. Sets default\n     * maxConcurrency to 1.\n     *\n     * [See the Live Example](/docs/examples/route-tasks/1)\n     *\n     * @method restartable\n     * @memberof TaskProperty\n     * @instance\n     */\n    restartable() {\n      this[taskFactorySymbol].setBufferPolicy(_restartablePolicy.default);\n      return this;\n    },\n    /**\n     * Configures the task to run task instances one-at-a-time in\n     * the order they were `.perform()`ed. Sets default\n     * maxConcurrency to 1.\n     *\n     * @method enqueue\n     * @memberof TaskProperty\n     * @instance\n     */\n    enqueue() {\n      this[taskFactorySymbol].setBufferPolicy(_enqueuedPolicy.default);\n      return this;\n    },\n    /**\n     * Configures the task to immediately cancel (i.e. drop) any\n     * task instances performed when the task is already running\n     * at maxConcurrency. Sets default maxConcurrency to 1.\n     *\n     * @method drop\n     * @memberof TaskProperty\n     * @instance\n     */\n    drop() {\n      this[taskFactorySymbol].setBufferPolicy(_dropPolicy.default);\n      return this;\n    },\n    /**\n     * Configures the task to drop all but the most recently\n     * performed {@linkcode TaskInstance }.\n     *\n     * @method keepLatest\n     * @memberof TaskProperty\n     * @instance\n     */\n    keepLatest() {\n      this[taskFactorySymbol].setBufferPolicy(_keepLatestPolicy.default);\n      return this;\n    },\n    /**\n     * Sets the maximum number of task instances that are allowed\n     * to run at the same time. By default, with no task modifiers\n     * applied, this number is Infinity (there is no limit\n     * to the number of tasks that can run at the same time).\n     * {@linkcode TaskProperty#restartable .restartable},\n     * {@linkcode TaskProperty#enqueue .enqueue}, and\n     * {@linkcode TaskProperty#drop .drop} set the default\n     * maxConcurrency to 1, but you can override this value\n     * to set the maximum number of concurrently running tasks\n     * to a number greater than 1.\n     *\n     * [See the AJAX Throttling example](/docs/examples/ajax-throttling)\n     *\n     * The example below uses a task with `maxConcurrency(3)` to limit\n     * the number of concurrent AJAX requests (for anyone using this task)\n     * to 3.\n     *\n     * ```js\n     * doSomeAjax: task(function * (url) {\n     *   return fetch(url);\n     * }).maxConcurrency(3),\n     *\n     * elsewhere() {\n     *   this.doSomeAjax.perform(\"http://www.example.com/json\");\n     * },\n     * ```\n     *\n     * @method maxConcurrency\n     * @memberof TaskProperty\n     * @param {Number} n The maximum number of concurrently running tasks\n     * @instance\n     */\n    maxConcurrency(n) {\n      this[taskFactorySymbol].setMaxConcurrency(n);\n      return this;\n    },\n    /**\n     * Adds this task to a TaskGroup so that concurrency constraints\n     * can be shared between multiple tasks.\n     *\n     * [See the Task Group docs for more information](/docs/task-groups)\n     *\n     * @method group\n     * @memberof TaskProperty\n     * @param {String} groupPath A path to the TaskGroup property\n     * @instance\n     */\n    group(taskGroupPath) {\n      this[taskFactorySymbol].setGroup(taskGroupPath);\n      return this;\n    },\n    /**\n     * Activates lifecycle events, allowing Evented host objects to react to task state\n     * changes.\n     *\n     * ```js\n     *\n     * export default Component.extend({\n     *   uploadTask: task(function* (file) {\n     *     // ... file upload stuff\n     *   }).evented(),\n     *\n     *   uploadedStarted: on('uploadTask:started', function(taskInstance) {\n     *     this.analytics.track(\"User Photo: upload started\");\n     *   }),\n     * });\n     * ```\n     *\n     * @method evented\n     * @memberof TaskProperty\n     * @instance\n     */\n    evented() {\n      this[taskFactorySymbol].setEvented(true);\n      return this;\n    },\n    /**\n     * Logs lifecycle events to aid in debugging unexpected Task behavior.\n     * Presently only logs cancelation events and the reason for the cancelation,\n     * e.g. \"TaskInstance 'doStuff' was canceled because the object it lives on was destroyed or unrendered\"\n     *\n     * @method debug\n     * @memberof TaskProperty\n     * @instance\n     */\n    debug() {\n      this[taskFactorySymbol].setDebug(true);\n      return this;\n    },\n    /**\n     * Configures the task to call the passed in callback for derived state updates,\n     * overriding the default derived state tracking. You may call with `null` to\n     * completely opt-out of derived state tracking.\n     *\n     * @method onState\n     * @memberof TaskProperty\n     * @param {function?} callback Callback to be called. Receives an object argument with the new state.\n     * @instance\n     */\n    onState(callback) {\n      this[taskFactorySymbol].setOnState(callback);\n      return this;\n    }\n  };\n\n  /**\n    A {@link TaskProperty} is the Computed Property-like object returned\n    from the {@linkcode task} function. You can call Task Modifier methods\n    on this object to configure the behavior of the {@link Task}.\n  \n    See [Managing Task Concurrency](/docs/task-concurrency) for an\n    overview of all the different task modifiers you can use and how\n    they impact automatic cancelation / enqueueing of task instances.\n  \n    {@link TaskProperty} is only used for supporting \"classic\" Ember objects.\n    When using Native JavaScript or TypeScript classes, you will use [task decorators](/docs/task-decorators)\n    on methods instead.\n  \n    @class TaskProperty\n  */\n  _exports.propertyModifiers = propertyModifiers;\n  let TaskProperty;\n  _exports.TaskProperty = TaskProperty;\n  let TaskGroupProperty;\n  _exports.TaskGroupProperty = TaskGroupProperty;\n  if (true) {\n    _exports.TaskProperty = TaskProperty = class {};\n    _exports.TaskGroupProperty = TaskGroupProperty = class {};\n  } else {\n    // Prior to the 3.10.0 refactors, we had to extend the _ComputedProperty class\n    // for a classic decorator/descriptor to run correctly.\n    _exports.TaskProperty = TaskProperty = class extends _computed.default {\n      callSuperSetup() {\n        if (super.setup) {\n          super.setup(...arguments);\n        }\n      }\n    };\n    _exports.TaskGroupProperty = TaskGroupProperty = class extends _computed.default {};\n  }\n  Object.assign(TaskGroupProperty.prototype, propertyModifiers);\n  Object.assign(TaskProperty.prototype, propertyModifiers, {\n    setup(proto, key) {\n      if (this.callSuperSetup) {\n        this.callSuperSetup(...arguments);\n      }\n      this[taskFactorySymbol].setName(key);\n      this[taskFactorySymbol]._setupEmberKVO(proto);\n    },\n    /**\n     * Calling `task(...).on(eventName)` configures the task to be\n     * automatically performed when the specified events fire. In\n     * this way, it behaves like\n     * [Ember.on](http://emberjs.com/api/classes/Ember.html#method_on).\n     *\n     * You can use `task(...).on('init')` to perform the task\n     * when the host object is initialized.\n     *\n     * ```js\n     * export default Component.extend({\n     *   pollForUpdates: task(function * () {\n     *     // ... this runs when the Component is first created\n     *     // because we specified .on('init')\n     *   }).on('init'),\n     *\n     *   handleFoo: task(function * (a, b, c) {\n     *     // this gets performed automatically if the 'foo'\n     *     // event fires on this Component,\n     *     // e.g., if someone called component.trigger('foo')\n     *   }).on('foo'),\n     * });\n     * ```\n     *\n     * [See the Writing Tasks Docs for more info](/docs/writing-tasks)\n     *\n     * @method on\n     * @memberof TaskProperty\n     * @param {String} eventNames*\n     * @instance\n     */\n    on() {\n      this[taskFactorySymbol].addPerformEvents(...arguments);\n      return this;\n    },\n    /**\n     * This behaves like the {@linkcode TaskProperty#on task(...).on() modifier},\n     * but instead will cause the task to be canceled if any of the\n     * specified events fire on the parent object.\n     *\n     * [See the Live Example](/docs/examples/route-tasks/1)\n     *\n     * @method cancelOn\n     * @memberof TaskProperty\n     * @param {String} eventNames*\n     * @instance\n     */\n    cancelOn() {\n      this[taskFactorySymbol].addCancelEvents(...arguments);\n      return this;\n    },\n    /**\n     * This behaves like the {@linkcode TaskProperty#on task(...).on() modifier},\n     * but instead will cause the task to be performed if any of the\n     * specified properties on the parent object change.\n     *\n     * @method observes\n     * @memberof TaskProperty\n     * @param {String} keys*\n     * @instance\n     */\n    observes() {\n      this[taskFactorySymbol].addObserverKeys(...arguments);\n      return this;\n    }\n  });\n  const setDecorator = _ember.default._setClassicDecorator || _ember.default._setComputedDecorator;\n  function taskComputed(fn) {\n    if (true) {\n      let cp = function (proto, key) {\n        if (cp.setup !== undefined) {\n          cp.setup(proto, key);\n        }\n        return (0, _object.computed)(fn)(...arguments);\n      };\n      setDecorator(cp);\n      return cp;\n    } else {\n      return (0, _object.computed)(fn);\n    }\n  }\n});","define(\"ember-concurrency/-private/task-public-api\", [\"exports\", \"ember-concurrency/-private/task-factory\", \"ember-concurrency/-private/task-properties\", \"ember-concurrency/-private/task-decorators\", \"@ember/debug\"], function (_exports, _taskFactory, _taskProperties, _taskDecorators, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.task = task;\n  _exports.taskGroup = taskGroup;\n  /**\n   * TODO: update docs to reflect both old and new ES6 styles\n   *\n   * A Task is a cancelable, restartable, asynchronous operation that\n   * is driven by a generator function. Tasks are automatically canceled\n   * when the object they live on is destroyed (e.g. a Component\n   * is unrendered).\n   *\n   * To define a task, use the `task(...)` function, and pass in\n   * a generator function, which will be invoked when the task\n   * is performed. The reason generator functions are used is\n   * that they (like the proposed ES7 async-await syntax) can\n   * be used to elegantly express asynchronous, cancelable\n   * operations.\n   *\n   * You can also define an\n   * <a href=\"/docs/advanced/encapsulated-task\">Encapsulated Task</a>\n   * by passing in an object that defined a `perform` generator\n   * function property.\n   *\n   * The following Component defines a task called `myTask` that,\n   * when performed, prints a message to the console, sleeps for 1 second,\n   * prints a final message to the console, and then completes.\n   *\n   * ```js\n   * import { task, timeout } from 'ember-concurrency';\n   * export default Component.extend({\n   *   myTask: task(function * () {\n   *     console.log(\"Pausing for a second...\");\n   *     yield timeout(1000);\n   *     console.log(\"Done!\");\n   *   })\n   * });\n   * ```\n   *\n   * ```hbs\n   * <button {{action myTask.perform}}>Perform Task</button>\n   * ```\n   *\n   * By default, tasks have no concurrency constraints\n   * (multiple instances of a task can be running at the same time)\n   * but much of a power of tasks lies in proper usage of Task Modifiers\n   * that you can apply to a task.\n   *\n   * @param {function} generatorFunction the generator function backing the task.\n   * @returns {TaskProperty}\n   */\n  function task(taskFnOrProtoOrDecoratorOptions, key, descriptor) {\n    (true && !(!isUntranspiledAsyncFn(arguments[arguments.length - 1])) && (0, _debug.assert)(`It appears you're attempting to use the new task(async () => { ... }) syntax, but the async arrow task function you've provided is not being properly compiled by Babel.\\n\\nPossible causes / remedies:\\n\\n1. You must pass the async function expression directly to the task() function (it is not currently supported to pass in a variable containing the async arrow fn, or any other kind of indirection)\\n2. The new task syntax is only supported by native classes. Ensure that this is one.\\n3. If this code is in an addon, please ensure the addon specifies ember-concurrency \"2.3.0\" or higher in \"dependencies\" (not \"devDependencies\")\\n4. Ensure that there is only one version of ember-concurrency v2.3.0+ being used in your project (including nested dependencies) and consider using npm/yarn/pnpm resolutions to enforce a single version is used`, !isUntranspiledAsyncFn(arguments[arguments.length - 1])));\n    if (isDecoratorOptions(taskFnOrProtoOrDecoratorOptions) || key && descriptor) {\n      return (0, _taskDecorators.task)(...arguments);\n    } else {\n      return buildClassicTaskProperty(taskFnOrProtoOrDecoratorOptions);\n    }\n  }\n  function isUntranspiledAsyncFn(obj) {\n    return obj && obj.constructor && obj.constructor.name === 'AsyncFunction';\n  }\n\n  /**\n   * Build and return a \"classic\" TaskProperty, which is essentially a subclass of a Computed Property\n   * descriptor that can be used to define Tasks on classic Ember.Objects.\n   *\n   * @private\n   */\n  function buildClassicTaskProperty(taskFn) {\n    const taskProperty = (0, _taskProperties.taskComputed)(function () {\n      taskProperty[_taskProperties.taskFactorySymbol].setTaskDefinition(taskProperty.taskFn);\n      return taskProperty[_taskProperties.taskFactorySymbol].createTask(this);\n    });\n    taskProperty.taskFn = taskFn;\n    taskProperty[_taskProperties.taskFactorySymbol] = new _taskFactory.TaskFactory();\n    Object.setPrototypeOf(taskProperty, _taskProperties.TaskProperty.prototype);\n    return taskProperty;\n  }\n\n  /**\n   * \"Task Groups\" provide a means for applying\n   * task modifiers to groups of tasks. Once a {@linkcode Task} is declared\n   * as part of a group task, modifiers like `drop` or `restartable`\n   * will no longer affect the individual `Task`. Instead those\n   * modifiers can be applied to the entire group.\n   *\n   * ```js\n   * import { task, taskGroup } from 'ember-concurrency';\n   *\n   * export default class MyController extends Controller {\n   *   &#64;taskGroup({ drop: true }) chores;\n   *\n   *   &#64;task({ group: 'chores' }) mowLawn = taskFn;\n   *   &#64;task({ group: 'chores' }) doDishes = taskFn;\n   *   &#64;task({ group: 'chores' }) changeDiapers = taskFn;\n   * }\n   * ```\n   *\n   * @returns {TaskGroup}\n   */\n  function taskGroup(possibleDecoratorOptions, key, descriptor) {\n    if (isDecoratorOptions(possibleDecoratorOptions) || key && descriptor) {\n      return (0, _taskDecorators.taskGroup)(...arguments);\n    } else {\n      let tp = (0, _taskProperties.taskComputed)(function (key) {\n        tp[_taskProperties.taskFactorySymbol].setName(key);\n        return tp[_taskProperties.taskFactorySymbol].createTaskGroup(this);\n      });\n      tp[_taskProperties.taskFactorySymbol] = new _taskFactory.TaskFactory();\n      Object.setPrototypeOf(tp, _taskProperties.TaskGroupProperty.prototype);\n      return tp;\n    }\n  }\n  function isDecoratorOptions(possibleOptions) {\n    if (!possibleOptions) {\n      return false;\n    }\n    if (typeof possibleOptions === 'function') {\n      return false;\n    }\n    if (typeof possibleOptions === 'object' && 'perform' in possibleOptions && typeof possibleOptions.perform === 'function') {\n      return false;\n    }\n    return Object.getPrototypeOf(possibleOptions) === Object.prototype;\n  }\n});","define(\"ember-concurrency/-private/task\", [\"exports\", \"@ember/application\", \"@ember/object\", \"@ember/destroyable\", \"ember-concurrency/-private/external/task/task\", \"ember-concurrency/-private/task-instance\", \"ember-concurrency/-private/external/task-instance/executor\", \"ember-concurrency/-private/taskable-mixin\", \"ember-concurrency/-private/tracked-state\", \"ember-concurrency/-private/external/task-instance/cancelation\"], function (_exports, _application, _object, _destroyable, _task, _taskInstance, _executor, _taskableMixin, _trackedState, _cancelation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.Task = _exports.EncapsulatedTask = void 0;\n  /**\n    The `Task` object lives on a host Ember object (e.g.\n    a Component, Route, or Controller). You call the\n    {@linkcode Task#perform .perform()} method on this object\n    to create run individual {@linkcode TaskInstance}s,\n    and at any point, you can call the {@linkcode Task#cancelAll .cancelAll()}\n    method on this object to cancel all running or enqueued\n    {@linkcode TaskInstance}s.\n  \n    <style>\n      .ignore-this--this-is-here-to-hide-constructor,\n      #Task { display: none }\n    </style>\n  \n    @class Task\n  */\n  class Task extends _task.Task {\n    /**\n     * `true` if any current task instances are running.\n     *\n     * @memberof Task\n     * @member {boolean} isRunning\n     * @instance\n     * @readOnly\n     */\n    /**\n     * `true` if any future task instances are queued.\n     *\n     * @memberof Task\n     * @member {boolean} isQueued\n     * @instance\n     * @readOnly\n     */\n    /**\n     * `true` if the task is not in the running or queued state.\n     *\n     * @memberof Task\n     * @member {boolean} isIdle\n     * @instance\n     * @readOnly\n     */\n    /**\n     * The current state of the task: `\"running\"`, `\"queued\"` or `\"idle\"`.\n     *\n     * @memberof Task\n     * @member {string} state\n     * @instance\n     * @readOnly\n     */\n    /**\n     * The most recently started task instance.\n     *\n     * @memberof Task\n     * @member {TaskInstance} last\n     * @instance\n     * @readOnly\n     */\n    /**\n     * The most recent task instance that is currently running.\n     *\n     * @memberof Task\n     * @member {TaskInstance} lastRunning\n     * @instance\n     * @readOnly\n     */\n    /**\n     * The most recently performed task instance.\n     *\n     * @memberof Task\n     * @member {TaskInstance} lastPerformed\n     * @instance\n     * @readOnly\n     */\n    /**\n     * The most recent task instance that succeeded.\n     *\n     * @memberof Task\n     * @member {TaskInstance} lastSuccessful\n     * @instance\n     * @readOnly\n     */\n    /**\n     * The most recently completed task instance.\n     *\n     * @memberof Task\n     * @member {TaskInstance} lastComplete\n     * @instance\n     * @readOnly\n     */\n    /**\n     * The most recent task instance that errored.\n     *\n     * @memberof Task\n     * @member {TaskInstance} lastErrored\n     * @instance\n     * @readOnly\n     */\n    /**\n     * The most recently canceled task instance.\n     *\n     * @memberof Task\n     * @member {TaskInstance} lastCanceled\n     * @instance\n     * @readOnly\n     */\n    /**\n     * The most recent task instance that is incomplete.\n     *\n     * @memberof Task\n     * @member {TaskInstance} lastIncomplete\n     * @instance\n     * @readOnly\n     */\n    /**\n     * The number of times this task has been performed.\n     *\n     * @memberof Task\n     * @member {number} performCount\n     * @instance\n     * @readOnly\n     */\n\n    constructor(options) {\n      super(options);\n      if (!(0, _destroyable.isDestroying)(this.context)) {\n        (0, _destroyable.registerDestructor)(this.context, () => {\n          this.cancelAll({\n            reason: 'the object it lives on was destroyed or unrendered',\n            cancelRequestKind: _cancelation.CANCEL_KIND_LIFESPAN_END\n          });\n        });\n      }\n    }\n\n    /**\n     * Flags the task as linked to the parent task's lifetime. Must be called\n     * within another task's perform function. The task will be cancelled if the\n     * parent task is canceled as well.\n     *\n     * ember-concurrency will indicate when this may be needed.\n     *\n     * @method linked\n     * @memberof Task\n     * @instance\n     *\n     */\n\n    /**\n     * Flags the task as not linked to the parent task's lifetime. Must be called\n     * within another task's perform function. The task will NOT be cancelled if the\n     * parent task is canceled.\n     *\n     * This is useful for avoiding the so-called \"self-cancel loop\" for tasks.\n     * ember-concurrency will indicate when this may be needed.\n     *\n     * @method unlinked\n     * @memberof Task\n     * @instance\n     *\n     */\n\n    /**\n     * Creates a new {@linkcode TaskInstance} and attempts to run it right away.\n     * If running this task instance would increase the task's concurrency\n     * to a number greater than the task's maxConcurrency, this task\n     * instance might be immediately canceled (dropped), or enqueued\n     * to run at later time, after the currently running task(s) have finished.\n     *\n     * @method perform\n     * @memberof Task\n     * @param {*} arg* - args to pass to the task function\n     * @instance\n     *\n     * @fires TaskInstance#TASK_NAME:started\n     * @fires TaskInstance#TASK_NAME:succeeded\n     * @fires TaskInstance#TASK_NAME:errored\n     * @fires TaskInstance#TASK_NAME:canceled\n     *\n     */\n\n    /**\n     * Cancels all running or queued `TaskInstance`s for this Task.\n     * If you're trying to cancel a specific TaskInstance (rather\n     * than all of the instances running under this task) call\n     * `.cancel()` on the specific TaskInstance.\n     *\n     * @method cancelAll\n     * @memberof Task\n     * @param options.reason A descriptive reason the task was\n     *   cancelled. Defaults to `\".cancelAll() was explicitly called\n     *   on the Task\"`.\n     * @param options.resetState If true, will clear the task state\n     *   (`last*` and `performCount` properties will be set to initial\n     *   values). Defaults to false.\n     * @instance\n     * @async\n     *\n     */\n\n    get _isAlive() {\n      return !(0, _destroyable.isDestroying)(this.context);\n    }\n    _taskInstanceFactory(args, performType, linkedObject) {\n      let options = this._taskInstanceOptions(args, performType, linkedObject);\n      let taskInstance = new _taskInstance.TaskInstance(options);\n      return taskInstance;\n    }\n    _clone() {\n      return new Task({\n        context: this.context,\n        debug: this.debug,\n        env: this.env,\n        generatorFactory: this.generatorFactory,\n        group: this.group,\n        hasEnabledEvents: this.hasEnabledEvents,\n        name: this.name,\n        onStateCallback: this.onStateCallback,\n        scheduler: this.scheduler\n      });\n    }\n  }\n  _exports.Task = Task;\n  if (_trackedState.TRACKED_INITIAL_TASK_STATE) {\n    Object.defineProperties(Task.prototype, _trackedState.TRACKED_INITIAL_TASK_STATE);\n  }\n  Object.assign(Task.prototype, _taskableMixin.TASKABLE_MIXIN);\n  const currentTaskInstanceSymbol = '__ec__encap_current_ti';\n  class EncapsulatedTask extends Task {\n    constructor(options) {\n      super(options);\n      this.taskObj = options.taskObj;\n      this._encapsulatedTaskStates = new WeakMap();\n      this._encapsulatedTaskInstanceProxies = new WeakMap();\n    }\n    _getEncapsulatedTaskClass() {\n      let encapsulatedTaskImplClass = this._encapsulatedTaskImplClass;\n      if (!encapsulatedTaskImplClass) {\n        // eslint-disable-next-line ember/no-classic-classes\n        encapsulatedTaskImplClass = _object.default.extend(this.taskObj, {\n          unknownProperty(key) {\n            let currentInstance = this[currentTaskInstanceSymbol];\n            return currentInstance ? currentInstance[key] : undefined;\n          }\n        });\n      }\n      return encapsulatedTaskImplClass;\n    }\n    _taskInstanceFactory(args, performType) {\n      let owner = (0, _application.getOwner)(this.context);\n      let taskInstanceProxy;\n      let encapsulatedTaskImpl = this._getEncapsulatedTaskClass().create({\n        context: this.context\n      });\n      (0, _application.setOwner)(encapsulatedTaskImpl, owner);\n      let generatorFactory = () => encapsulatedTaskImpl.perform.apply(taskInstanceProxy, args);\n      let taskInstance = new _taskInstance.TaskInstance({\n        task: this,\n        args,\n        executor: new _executor.TaskInstanceExecutor({\n          generatorFactory,\n          env: this.env,\n          debug: this.debug\n        }),\n        performType,\n        hasEnabledEvents: this.hasEnabledEvents\n      });\n      encapsulatedTaskImpl[currentTaskInstanceSymbol] = taskInstance;\n      this._encapsulatedTaskStates.set(taskInstance, encapsulatedTaskImpl);\n      taskInstanceProxy = this._wrappedEncapsulatedTaskInstance(taskInstance);\n      return taskInstanceProxy;\n    }\n    _wrappedEncapsulatedTaskInstance(taskInstance) {\n      if (!taskInstance) {\n        return null;\n      }\n      let _encapsulatedTaskInstanceProxies = this._encapsulatedTaskInstanceProxies;\n      let proxy = _encapsulatedTaskInstanceProxies.get(taskInstance);\n      if (!proxy) {\n        let encapsulatedTaskImpl = this._encapsulatedTaskStates.get(taskInstance);\n        proxy = new Proxy(taskInstance, {\n          get(obj, prop) {\n            return prop in obj ? obj[prop] : (0, _object.get)(encapsulatedTaskImpl, prop.toString());\n          },\n          set(obj, prop, value) {\n            if (prop in obj) {\n              obj[prop] = value;\n            } else {\n              (0, _object.set)(encapsulatedTaskImpl, prop.toString(), value);\n            }\n            return true;\n          },\n          has(obj, prop) {\n            return prop in obj || prop in encapsulatedTaskImpl;\n          },\n          ownKeys(obj) {\n            return Reflect.ownKeys(obj).concat(Reflect.ownKeys(encapsulatedTaskImpl));\n          },\n          defineProperty(obj, prop, descriptor) {\n            // Ember < 3.16 uses a WeakMap for value storage, keyed to the proxy.\n            // We need to ensure that when we use setProperties to update it, and\n            // it creates Meta, that it uses the proxy to key, otherwise we'll\n            // have two different values stores in Meta, one which won't render.\n            let proxy = _encapsulatedTaskInstanceProxies.get(taskInstance);\n            if (proxy) {\n              if (descriptor.get) {\n                descriptor.get = descriptor.get.bind(proxy);\n              } else if (proxy && descriptor.set) {\n                descriptor.set = descriptor.set.bind(proxy);\n              }\n            }\n            return Reflect.defineProperty(encapsulatedTaskImpl, prop, descriptor);\n          },\n          getOwnPropertyDescriptor(obj, prop) {\n            return prop in obj ? Reflect.getOwnPropertyDescriptor(obj, prop) : Reflect.getOwnPropertyDescriptor(encapsulatedTaskImpl, prop);\n          }\n        });\n        _encapsulatedTaskInstanceProxies.set(taskInstance, proxy);\n      }\n      return proxy;\n    }\n  }\n  _exports.EncapsulatedTask = EncapsulatedTask;\n});","define(\"ember-concurrency/-private/taskable-mixin\", [\"exports\", \"ember-concurrency/-private/utils\"], function (_exports, _utils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.TASKABLE_MIXIN = void 0;\n  const TASKABLE_MIXIN = {\n    _performCount: 0,\n    setState(state) {\n      this._performCount = this._performCount + (state.numPerformedInc || 0);\n      let isRunning = state.numRunning > 0;\n      let isQueued = state.numQueued > 0;\n      let derivedState = Object.assign({}, state, {\n        performCount: this._performCount,\n        isRunning,\n        isQueued,\n        isIdle: !isRunning && !isQueued,\n        state: isRunning ? 'running' : 'idle'\n      });\n      (0, _utils.assignProperties)(this, derivedState);\n    },\n    onState(state, task) {\n      if (task.onStateCallback) {\n        task.onStateCallback(state, task);\n      }\n    }\n  };\n  _exports.TASKABLE_MIXIN = TASKABLE_MIXIN;\n});","define(\"ember-concurrency/-private/tracked-state\", [\"exports\", \"@glimmer/tracking\", \"ember-concurrency/-private/external/task/default-state\", \"ember-concurrency/-private/external/task-instance/initial-state\", \"ember-concurrency/-private/utils\"], function (_exports, _tracking, _defaultState, _initialState, _utils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.TRACKED_INITIAL_TASK_STATE = _exports.TRACKED_INITIAL_INSTANCE_STATE = void 0;\n  function trackMixin(proto, obj, key) {\n    const propDesc = Object.getOwnPropertyDescriptor(proto, key);\n    propDesc.initializer = propDesc.initializer || (() => proto[key]);\n    delete propDesc.value;\n    const desc = (0, _tracking.tracked)(obj, key, propDesc);\n    obj[key] = desc;\n    return obj;\n  }\n  function applyTracked(proto, initial) {\n    return Object.keys(proto).reduce((acc, key) => {\n      return trackMixin(proto, acc, key);\n    }, initial);\n  }\n  let TRACKED_INITIAL_TASK_STATE;\n  _exports.TRACKED_INITIAL_TASK_STATE = TRACKED_INITIAL_TASK_STATE;\n  let TRACKED_INITIAL_INSTANCE_STATE;\n  _exports.TRACKED_INITIAL_INSTANCE_STATE = TRACKED_INITIAL_INSTANCE_STATE;\n  if (_utils.USE_TRACKED) {\n    _exports.TRACKED_INITIAL_TASK_STATE = TRACKED_INITIAL_TASK_STATE = applyTracked(_defaultState.DEFAULT_STATE, {});\n    _exports.TRACKED_INITIAL_TASK_STATE = TRACKED_INITIAL_TASK_STATE = applyTracked({\n      numRunning: 0,\n      numQueued: 0,\n      isRunning: false,\n      isQueued: false,\n      isIdle: true,\n      state: 'idle'\n    }, TRACKED_INITIAL_TASK_STATE);\n    _exports.TRACKED_INITIAL_INSTANCE_STATE = TRACKED_INITIAL_INSTANCE_STATE = applyTracked(_initialState.INITIAL_STATE, {});\n    _exports.TRACKED_INITIAL_INSTANCE_STATE = TRACKED_INITIAL_INSTANCE_STATE = applyTracked({\n      state: 'waiting',\n      isDropped: false,\n      isRunning: false\n    }, TRACKED_INITIAL_INSTANCE_STATE);\n    Object.freeze(TRACKED_INITIAL_TASK_STATE);\n    Object.freeze(TRACKED_INITIAL_INSTANCE_STATE);\n  }\n});","define(\"ember-concurrency/-private/utils\", [\"exports\", \"@ember/object\", \"@ember/runloop\", \"ember-concurrency/-private/ember-environment\", \"ember-concurrency/-private/external/yieldables\"], function (_exports, _object, _runloop, _emberEnvironment, _yieldables) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.assignProperties = _exports.USE_TRACKED = _exports.EmberYieldable = void 0;\n  _exports.deprecatePrivateModule = deprecatePrivateModule;\n  _exports.isEventedObject = isEventedObject;\n  _exports.timeout = timeout;\n  const USE_TRACKED = true;\n  _exports.USE_TRACKED = USE_TRACKED;\n  const assignProperties = USE_TRACKED ? Object.assign : _object.setProperties;\n  _exports.assignProperties = assignProperties;\n  function isEventedObject(c) {\n    return c && (typeof c.one === 'function' && typeof c.off === 'function' || typeof c.on === 'function' && typeof c.off === 'function' || typeof c.addEventListener === 'function' && typeof c.removeEventListener === 'function');\n  }\n  class EmberYieldable extends _yieldables.Yieldable {\n    _deferable() {\n      return _emberEnvironment.EMBER_ENVIRONMENT.defer();\n    }\n  }\n  _exports.EmberYieldable = EmberYieldable;\n  class TimeoutYieldable extends EmberYieldable {\n    constructor(ms) {\n      super();\n      this.ms = ms;\n    }\n    onYield(state) {\n      let timerId = (0, _runloop.later)(() => state.next(), this.ms);\n      return () => (0, _runloop.cancel)(timerId);\n    }\n  }\n\n  /**\n   *\n   * Yielding `timeout(ms)` will pause a task for the duration\n   * of time passed in, in milliseconds.\n   *\n   * This timeout will be scheduled on the Ember runloop, which\n   * means that test helpers will wait for it to complete before\n   * continuing with the test. See `rawTimeout()` if you need\n   * different behavior.\n   *\n   * The task below, when performed, will print a message to the\n   * console every second.\n   *\n   * ```js\n   * export default class MyComponent extends Component {\n   *   &#64;task *myTask() {\n   *     while (true) {\n   *       console.log(\"Hello!\");\n   *       yield timeout(1000);\n   *     }\n   *   }\n   * }\n   * ```\n   *\n   * @param {number} ms - the amount of time to sleep before resuming\n   *   the task, in milliseconds\n   */\n  function timeout(ms) {\n    return new TimeoutYieldable(ms);\n  }\n  function deprecatePrivateModule(moduleName) {\n    // eslint-disable-next-line no-console\n    console.warn(`an Ember addon is importing a private ember-concurrency module '${moduleName}' that has moved`);\n  }\n});","define(\"ember-concurrency/-private/wait-for\", [\"exports\", \"@ember/debug\", \"@ember/runloop\", \"@ember/object\", \"@ember/object/observers\", \"ember-concurrency/-private/utils\"], function (_exports, _debug, _runloop, _object, _observers, _utils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.waitForEvent = waitForEvent;\n  _exports.waitForProperty = waitForProperty;\n  _exports.waitForQueue = waitForQueue;\n  class WaitForQueueYieldable extends _utils.EmberYieldable {\n    constructor(queueName) {\n      super();\n      this.queueName = queueName;\n    }\n    onYield(state) {\n      let timerId;\n      try {\n        timerId = (0, _runloop.schedule)(this.queueName, () => state.next());\n      } catch (error) {\n        state.throw(error);\n      }\n      return () => (0, _runloop.cancel)(timerId);\n    }\n  }\n  class WaitForEventYieldable extends _utils.EmberYieldable {\n    constructor(object, eventName) {\n      super();\n      this.object = object;\n      this.eventName = eventName;\n      this.usesDOMEvents = false;\n    }\n    on(callback) {\n      if (typeof this.object.addEventListener === 'function') {\n        // assume that we're dealing with a DOM `EventTarget`.\n        this.usesDOMEvents = true;\n        this.object.addEventListener(this.eventName, callback);\n      } else {\n        this.object.on(this.eventName, callback);\n      }\n    }\n    off(callback) {\n      if (this.usesDOMEvents) {\n        this.object.removeEventListener(this.eventName, callback);\n      } else {\n        this.object.off(this.eventName, callback);\n      }\n    }\n    onYield(state) {\n      let fn = null;\n      let disposer = () => {\n        fn && this.off(fn);\n        fn = null;\n      };\n      fn = event => {\n        disposer();\n        state.next(event);\n      };\n      this.on(fn);\n      return disposer;\n    }\n  }\n  class WaitForPropertyYieldable extends _utils.EmberYieldable {\n    constructor(object, key) {\n      let predicateCallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Boolean;\n      super();\n      this.object = object;\n      this.key = key;\n      if (typeof predicateCallback === 'function') {\n        this.predicateCallback = predicateCallback;\n      } else {\n        this.predicateCallback = v => v === predicateCallback;\n      }\n    }\n    onYield(state) {\n      let observerBound = false;\n      let observerFn = () => {\n        let value = (0, _object.get)(this.object, this.key);\n        let predicateValue = this.predicateCallback(value);\n        if (predicateValue) {\n          state.next(value);\n          return true;\n        }\n      };\n      if (!observerFn()) {\n        // eslint-disable-next-line ember/no-observers\n        (0, _observers.addObserver)(this.object, this.key, null, observerFn);\n        observerBound = true;\n      }\n      return () => {\n        if (observerBound && observerFn) {\n          (0, _observers.removeObserver)(this.object, this.key, null, observerFn);\n        }\n      };\n    }\n  }\n\n  /**\n   * Use `waitForQueue` to pause the task until a certain run loop queue is reached.\n   *\n   * ```js\n   * import { task, waitForQueue } from 'ember-concurrency';\n   * export default class MyComponent extends Component {\n   *   &#64;task *myTask() {\n   *     yield waitForQueue('afterRender');\n   *     console.log(\"now we're in the afterRender queue\");\n   *   }\n   * }\n   * ```\n   *\n   * @param {string} queueName the name of the Ember run loop queue\n   */\n  function waitForQueue(queueName) {\n    return new WaitForQueueYieldable(queueName);\n  }\n\n  /**\n   * Use `waitForEvent` to pause the task until an event is fired. The event\n   * can either be a jQuery event or an Ember.Evented event (or any event system\n   * where the object supports `.on()` `.one()` and `.off()`).\n   *\n   * ```js\n   * import { task, waitForEvent } from 'ember-concurrency';\n   * export default class MyComponent extends Component {\n   *   &#64;task *myTask() {\n   *     console.log(\"Please click anywhere..\");\n   *     let clickEvent = yield waitForEvent($('body'), 'click');\n   *     console.log(\"Got event\", clickEvent);\n   *\n   *     let emberEvent = yield waitForEvent(this, 'foo');\n   *     console.log(\"Got foo event\", emberEvent);\n   *\n   *     // somewhere else: component.trigger('foo', { value: 123 });\n   *   }\n   * }\n   * ```\n   *\n   * @param {object} object the Ember Object, jQuery element, or other object with .on() and .off() APIs\n   *                 that the event fires from\n   * @param {function} eventName the name of the event to wait for\n   */\n  function waitForEvent(object, eventName) {\n    (true && !((0, _utils.isEventedObject)(object)) && (0, _debug.assert)(`${object} must include Ember.Evented (or support \\`.on()\\` and \\`.off()\\`) or DOM EventTarget (or support \\`addEventListener\\` and  \\`removeEventListener\\`) to be able to use \\`waitForEvent\\``, (0, _utils.isEventedObject)(object)));\n    return new WaitForEventYieldable(object, eventName);\n  }\n\n  /**\n   * Use `waitForProperty` to pause the task until a property on an object\n   * changes to some expected value. This can be used for a variety of use\n   * cases, including synchronizing with another task by waiting for it\n   * to become idle, or change state in some other way. If you omit the\n   * callback, `waitForProperty` will resume execution when the observed\n   * property becomes truthy. If you provide a callback, it'll be called\n   * immediately with the observed property's current value, and multiple\n   * times thereafter whenever the property changes, until you return\n   * a truthy value from the callback, or the current task is canceled.\n   * You can also pass in a non-Function value in place of the callback,\n   * in which case the task will continue executing when the property's\n   * value becomes the value that you passed in.\n   *\n   * ```js\n   * import { task, waitForProperty } from 'ember-concurrency';\n   * export default class MyComponent extends Component {\n   *   &#64;tracked foo = 0;\n   *\n   *   &#64;task *myTask() {\n   *     console.log(\"Waiting for `foo` to become 5\");\n   *\n   *     yield waitForProperty(this, 'foo', v => v === 5);\n   *     // alternatively: yield waitForProperty(this, 'foo', 5);\n   *\n   *     // somewhere else: this.foo = 5;\n   *\n   *     console.log(\"`foo` is 5!\");\n   *\n   *     // wait for another task to be idle before running:\n   *     yield waitForProperty(this, 'otherTask.isIdle');\n   *     console.log(\"otherTask is idle!\");\n   *   }\n   * }\n   * ```\n   *\n   * @param {object} object an object (most likely an Ember Object)\n   * @param {string} key the property name that is observed for changes\n   * @param {function} callbackOrValue a Function that should return a truthy value\n   *                                   when the task should continue executing, or\n   *                                   a non-Function value that the watched property\n   *                                   needs to equal before the task will continue running\n   */\n  function waitForProperty(object, key, predicateCallback) {\n    return new WaitForPropertyYieldable(object, key, predicateCallback);\n  }\n});","define(\"ember-concurrency/-task-instance\", [\"exports\", \"ember-concurrency/-private/task-instance\", \"ember-concurrency/-private/utils\"], function (_exports, _taskInstance, _utils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  (0, _utils.deprecatePrivateModule)('ember-concurrency/-task-instance');\n  var _default = _taskInstance.TaskInstance;\n  _exports.default = _default;\n});","define(\"ember-concurrency/-task-property\", [\"exports\", \"ember-concurrency/-private/task\", \"ember-concurrency/-private/task-properties\", \"ember-concurrency/-private/utils\"], function (_exports, _task, _taskProperties, _utils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"Task\", {\n    enumerable: true,\n    get: function () {\n      return _task.Task;\n    }\n  });\n  Object.defineProperty(_exports, \"TaskProperty\", {\n    enumerable: true,\n    get: function () {\n      return _taskProperties.TaskProperty;\n    }\n  });\n  (0, _utils.deprecatePrivateModule)('ember-concurrency/-task-property');\n});","define(\"ember-concurrency/helpers/cancel-all\", [\"exports\", \"@ember/component/helper\", \"@ember/debug\", \"ember-concurrency/-private/helpers\"], function (_exports, _helper, _debug, _helpers) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.cancelHelper = cancelHelper;\n  _exports.default = void 0;\n  const CANCEL_REASON = \"the 'cancel-all' template helper was invoked\";\n  function cancelHelper(args) {\n    let cancelable = args[0];\n    if (!cancelable || typeof cancelable.cancelAll !== 'function') {\n      (true && !(false) && (0, _debug.assert)(`The first argument passed to the \\`cancel-all\\` helper should be a Task or TaskGroup (without quotes); you passed ${cancelable}`, false));\n    }\n    return (0, _helpers.taskHelperClosure)('cancel-all', 'cancelAll', [cancelable, {\n      reason: CANCEL_REASON\n    }]);\n  }\n  var _default = (0, _helper.helper)(cancelHelper);\n  _exports.default = _default;\n});","define(\"ember-concurrency/helpers/perform\", [\"exports\", \"@ember/component/helper\", \"@ember/debug\", \"ember-concurrency/-private/helpers\"], function (_exports, _helper, _debug, _helpers) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.performHelper = performHelper;\n  function maybeReportError(onError) {\n    return function (e) {\n      if (typeof onError === 'function') {\n        onError(e);\n      } else if (onError === null) {\n        // Do nothing\n      } else {\n        (true && !(false) && (0, _debug.assert)(`The onError argument passed to the \\`perform\\` helper should be a function or null; you passed ${onError}`, false));\n      }\n    };\n  }\n  function performHelper(args, hash) {\n    let perform = (0, _helpers.taskHelperClosure)('perform', 'perform', args, hash);\n    if (hash && typeof hash.onError !== 'undefined') {\n      return function () {\n        try {\n          let taskInstance = perform(...arguments);\n          return taskInstance.catch(maybeReportError(hash.onError));\n          // eslint-disable-next-line no-empty\n        } catch {\n          maybeReportError(hash.onError);\n        }\n      };\n    } else {\n      return perform;\n    }\n  }\n  var _default = (0, _helper.helper)(performHelper);\n  _exports.default = _default;\n});","define(\"ember-concurrency/helpers/task\", [\"exports\", \"@ember/component/helper\"], function (_exports, _helper) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  function taskHelper(_ref) {\n    let [task, ...args] = _ref;\n    return task._curry(...args);\n  }\n  var _default = (0, _helper.helper)(taskHelper);\n  _exports.default = _default;\n});","define(\"ember-concurrency/index\", [\"exports\", \"ember-concurrency/-private/utils\", \"ember-concurrency/-private/task-properties\", \"ember-concurrency/-private/task-public-api\", \"ember-concurrency/-private/task-instance\", \"ember-concurrency/-private/cancelable-promise-helpers\", \"ember-concurrency/-private/wait-for\", \"ember-concurrency/-private/external/task-instance/cancelation\", \"ember-concurrency/-private/external/yieldables\", \"ember-concurrency/-private/task\", \"ember-concurrency/-private/task-group\", \"ember-concurrency/-private/task-decorators\", \"ember-concurrency/-private/external/task-factory\"], function (_exports, _utils, _taskProperties, _taskPublicApi, _taskInstance, _cancelablePromiseHelpers, _waitFor, _cancelation, _yieldables, _task, _taskGroup, _taskDecorators, _taskFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"Task\", {\n    enumerable: true,\n    get: function () {\n      return _task.Task;\n    }\n  });\n  Object.defineProperty(_exports, \"TaskGroup\", {\n    enumerable: true,\n    get: function () {\n      return _taskGroup.TaskGroup;\n    }\n  });\n  Object.defineProperty(_exports, \"TaskGroupProperty\", {\n    enumerable: true,\n    get: function () {\n      return _taskProperties.TaskGroupProperty;\n    }\n  });\n  Object.defineProperty(_exports, \"TaskInstance\", {\n    enumerable: true,\n    get: function () {\n      return _taskInstance.TaskInstance;\n    }\n  });\n  Object.defineProperty(_exports, \"TaskProperty\", {\n    enumerable: true,\n    get: function () {\n      return _taskProperties.TaskProperty;\n    }\n  });\n  Object.defineProperty(_exports, \"Yieldable\", {\n    enumerable: true,\n    get: function () {\n      return _utils.EmberYieldable;\n    }\n  });\n  Object.defineProperty(_exports, \"all\", {\n    enumerable: true,\n    get: function () {\n      return _cancelablePromiseHelpers.all;\n    }\n  });\n  Object.defineProperty(_exports, \"allSettled\", {\n    enumerable: true,\n    get: function () {\n      return _cancelablePromiseHelpers.allSettled;\n    }\n  });\n  Object.defineProperty(_exports, \"animationFrame\", {\n    enumerable: true,\n    get: function () {\n      return _yieldables.animationFrame;\n    }\n  });\n  Object.defineProperty(_exports, \"didCancel\", {\n    enumerable: true,\n    get: function () {\n      return _cancelation.didCancel;\n    }\n  });\n  Object.defineProperty(_exports, \"dropTask\", {\n    enumerable: true,\n    get: function () {\n      return _taskDecorators.dropTask;\n    }\n  });\n  Object.defineProperty(_exports, \"dropTaskGroup\", {\n    enumerable: true,\n    get: function () {\n      return _taskDecorators.dropTaskGroup;\n    }\n  });\n  Object.defineProperty(_exports, \"enqueueTask\", {\n    enumerable: true,\n    get: function () {\n      return _taskDecorators.enqueueTask;\n    }\n  });\n  Object.defineProperty(_exports, \"enqueueTaskGroup\", {\n    enumerable: true,\n    get: function () {\n      return _taskDecorators.enqueueTaskGroup;\n    }\n  });\n  Object.defineProperty(_exports, \"forever\", {\n    enumerable: true,\n    get: function () {\n      return _yieldables.forever;\n    }\n  });\n  Object.defineProperty(_exports, \"getModifier\", {\n    enumerable: true,\n    get: function () {\n      return _taskFactory.getModifier;\n    }\n  });\n  Object.defineProperty(_exports, \"hasModifier\", {\n    enumerable: true,\n    get: function () {\n      return _taskFactory.hasModifier;\n    }\n  });\n  Object.defineProperty(_exports, \"hash\", {\n    enumerable: true,\n    get: function () {\n      return _cancelablePromiseHelpers.hash;\n    }\n  });\n  Object.defineProperty(_exports, \"hashSettled\", {\n    enumerable: true,\n    get: function () {\n      return _cancelablePromiseHelpers.hashSettled;\n    }\n  });\n  Object.defineProperty(_exports, \"keepLatestTask\", {\n    enumerable: true,\n    get: function () {\n      return _taskDecorators.keepLatestTask;\n    }\n  });\n  Object.defineProperty(_exports, \"keepLatestTaskGroup\", {\n    enumerable: true,\n    get: function () {\n      return _taskDecorators.keepLatestTaskGroup;\n    }\n  });\n  Object.defineProperty(_exports, \"lastValue\", {\n    enumerable: true,\n    get: function () {\n      return _taskDecorators.lastValue;\n    }\n  });\n  Object.defineProperty(_exports, \"race\", {\n    enumerable: true,\n    get: function () {\n      return _cancelablePromiseHelpers.race;\n    }\n  });\n  Object.defineProperty(_exports, \"rawTimeout\", {\n    enumerable: true,\n    get: function () {\n      return _yieldables.rawTimeout;\n    }\n  });\n  Object.defineProperty(_exports, \"registerModifier\", {\n    enumerable: true,\n    get: function () {\n      return _taskFactory.registerModifier;\n    }\n  });\n  Object.defineProperty(_exports, \"restartableTask\", {\n    enumerable: true,\n    get: function () {\n      return _taskDecorators.restartableTask;\n    }\n  });\n  Object.defineProperty(_exports, \"restartableTaskGroup\", {\n    enumerable: true,\n    get: function () {\n      return _taskDecorators.restartableTaskGroup;\n    }\n  });\n  Object.defineProperty(_exports, \"task\", {\n    enumerable: true,\n    get: function () {\n      return _taskPublicApi.task;\n    }\n  });\n  Object.defineProperty(_exports, \"taskGroup\", {\n    enumerable: true,\n    get: function () {\n      return _taskPublicApi.taskGroup;\n    }\n  });\n  Object.defineProperty(_exports, \"timeout\", {\n    enumerable: true,\n    get: function () {\n      return _utils.timeout;\n    }\n  });\n  Object.defineProperty(_exports, \"waitForEvent\", {\n    enumerable: true,\n    get: function () {\n      return _waitFor.waitForEvent;\n    }\n  });\n  Object.defineProperty(_exports, \"waitForProperty\", {\n    enumerable: true,\n    get: function () {\n      return _waitFor.waitForProperty;\n    }\n  });\n  Object.defineProperty(_exports, \"waitForQueue\", {\n    enumerable: true,\n    get: function () {\n      return _waitFor.waitForQueue;\n    }\n  });\n});","define(\"ember-cookies/services/cookies\", [\"exports\", \"@ember/utils\", \"@ember/object\", \"@ember/debug\", \"@ember/application\", \"@ember/service\", \"@ember/polyfills\", \"ember-cookies/utils/serialize-cookie\"], function (_exports, _utils, _object, _debug, _application, _service, _polyfills, _serializeCookie) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const {\n    keys\n  } = Object;\n  const assign = Object.assign || _polyfills.assign || _polyfills.merge;\n  const DEFAULTS = {\n    raw: false\n  };\n  const MAX_COOKIE_BYTE_LENGTH = 4096;\n  var _default = _service.default.extend({\n    init() {\n      this._super(...arguments);\n      this._document = this._document || window.document;\n      if (typeof this._fastBoot === 'undefined') {\n        let owner = (0, _application.getOwner)(this);\n        this._fastBoot = owner.lookup('service:fastboot');\n      }\n    },\n    _getDocumentCookies() {\n      let all = this._document.cookie.split(';');\n      let filtered = this._filterDocumentCookies(all);\n      return filtered.reduce((acc, cookie) => {\n        if (!(0, _utils.isEmpty)(cookie)) {\n          let [key, value] = cookie;\n          acc[key.trim()] = (value || '').trim();\n        }\n        return acc;\n      }, {});\n    },\n    _getFastBootCookies() {\n      let fastBootCookies = (0, _object.get)(this._fastBoot, 'request.cookies');\n      fastBootCookies = keys(fastBootCookies).reduce((acc, name) => {\n        let value = fastBootCookies[name];\n        acc[name] = {\n          value\n        };\n        return acc;\n      }, {});\n      let fastBootCookiesCache = this._fastBootCookiesCache || {};\n      fastBootCookies = assign({}, fastBootCookies, fastBootCookiesCache);\n      this._fastBootCookiesCache = fastBootCookies;\n      return this._filterCachedFastBootCookies(fastBootCookies);\n    },\n    read(name) {\n      let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      options = assign({}, DEFAULTS, options || {});\n      (true && !((0, _utils.isEmpty)(options.domain) && (0, _utils.isEmpty)(options.expires) && (0, _utils.isEmpty)(options.maxAge) && (0, _utils.isEmpty)(options.path)) && (0, _debug.assert)('Domain, Expires, Max-Age, and Path options cannot be set when reading cookies', (0, _utils.isEmpty)(options.domain) && (0, _utils.isEmpty)(options.expires) && (0, _utils.isEmpty)(options.maxAge) && (0, _utils.isEmpty)(options.path)));\n      let all;\n      if (this._isFastBoot()) {\n        all = this._getFastBootCookies();\n      } else {\n        all = this._getDocumentCookies();\n      }\n      if (name) {\n        return this._decodeValue(all[name], options.raw);\n      } else {\n        keys(all).forEach(name => all[name] = this._decodeValue(all[name], options.raw));\n        return all;\n      }\n    },\n    write(name, value) {\n      let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      options = assign({}, DEFAULTS, options || {});\n      (true && !(!options.signed) && (0, _debug.assert)(\"Cookies cannot be set as signed as signed cookies would not be modifyable in the browser as it has no knowledge of the express server's signing key!\", !options.signed));\n      (true && !((0, _utils.isEmpty)(options.expires) || (0, _utils.isEmpty)(options.maxAge)) && (0, _debug.assert)('Cookies cannot be set with both maxAge and an explicit expiration time!', (0, _utils.isEmpty)(options.expires) || (0, _utils.isEmpty)(options.maxAge)));\n      value = this._encodeValue(value, options.raw);\n      (true && !(this._isCookieSizeAcceptable(value)) && (0, _debug.assert)(`Cookies larger than ${MAX_COOKIE_BYTE_LENGTH} bytes are not supported by most browsers!`, this._isCookieSizeAcceptable(value)));\n      if (this._isFastBoot()) {\n        this._writeFastBootCookie(name, value, options);\n      } else {\n        (true && !(!options.httpOnly) && (0, _debug.assert)('Cookies cannot be set to be HTTP-only from a browser!', !options.httpOnly));\n        options.path = options.path || this._normalizedDefaultPath();\n        this._writeDocumentCookie(name, value, options);\n      }\n    },\n    clear(name) {\n      let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      options = assign({}, options || {});\n      (true && !((0, _utils.isEmpty)(options.expires) && (0, _utils.isEmpty)(options.maxAge) && (0, _utils.isEmpty)(options.raw)) && (0, _debug.assert)('Expires, Max-Age, and raw options cannot be set when clearing cookies', (0, _utils.isEmpty)(options.expires) && (0, _utils.isEmpty)(options.maxAge) && (0, _utils.isEmpty)(options.raw)));\n      options.expires = new Date('1970-01-01');\n      options.path = options.path || this._normalizedDefaultPath();\n      this.write(name, null, options);\n    },\n    exists(name) {\n      let all;\n      if (this._isFastBoot()) {\n        all = this._getFastBootCookies();\n      } else {\n        all = this._getDocumentCookies();\n      }\n      return all.hasOwnProperty(name);\n    },\n    _writeDocumentCookie(name, value) {\n      let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      let serializedCookie = this._serializeCookie(name, value, options);\n      this._document.cookie = serializedCookie;\n    },\n    _writeFastBootCookie(name, value) {\n      let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      let responseHeaders = (0, _object.get)(this._fastBoot, 'response.headers');\n      let serializedCookie = this._serializeCookie(...arguments);\n      if (!(0, _utils.isEmpty)(options.maxAge)) {\n        options.maxAge *= 1000;\n      }\n      this._cacheFastBootCookie(...arguments);\n      let replaced = false;\n      let existing = responseHeaders.getAll('set-cookie');\n      for (let i = 0; i < existing.length; i++) {\n        if (existing[i].startsWith(`${name}=`)) {\n          existing[i] = serializedCookie;\n          replaced = true;\n          break;\n        }\n      }\n      if (!replaced) {\n        responseHeaders.append('set-cookie', serializedCookie);\n      }\n    },\n    _cacheFastBootCookie(name, value) {\n      let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      let fastBootCache = this._fastBootCookiesCache || {};\n      let cachedOptions = assign({}, options);\n      if (cachedOptions.maxAge) {\n        let expires = new Date();\n        expires.setSeconds(expires.getSeconds() + options.maxAge);\n        cachedOptions.expires = expires;\n        delete cachedOptions.maxAge;\n      }\n      fastBootCache[name] = {\n        value,\n        options: cachedOptions\n      };\n      this._fastBootCookiesCache = fastBootCache;\n    },\n    _filterCachedFastBootCookies(fastBootCookies) {\n      let {\n        path: requestPath,\n        protocol\n      } = (0, _object.get)(this._fastBoot, 'request');\n\n      // cannot use deconstruct here\n      let host = (0, _object.get)(this._fastBoot, 'request.host');\n      return keys(fastBootCookies).reduce((acc, name) => {\n        let {\n          value,\n          options\n        } = fastBootCookies[name];\n        options = options || {};\n        let {\n          path: optionsPath,\n          domain,\n          expires,\n          secure\n        } = options;\n        if (optionsPath && requestPath.indexOf(optionsPath) !== 0) {\n          return acc;\n        }\n        if (domain && host.indexOf(domain) + domain.length !== host.length) {\n          return acc;\n        }\n        if (expires && expires < new Date()) {\n          return acc;\n        }\n        if (secure && !(protocol || '').match(/^https/)) {\n          return acc;\n        }\n        acc[name] = value;\n        return acc;\n      }, {});\n    },\n    _encodeValue(value, raw) {\n      if ((0, _utils.isNone)(value)) {\n        return '';\n      } else if (raw) {\n        return value;\n      } else {\n        return encodeURIComponent(value);\n      }\n    },\n    _decodeValue(value, raw) {\n      if ((0, _utils.isNone)(value) || raw) {\n        return value;\n      } else {\n        return decodeURIComponent(value);\n      }\n    },\n    _filterDocumentCookies(unfilteredCookies) {\n      return unfilteredCookies.map(c => {\n        let separatorIndex = c.indexOf('=');\n        return [c.substring(0, separatorIndex), c.substring(separatorIndex + 1)];\n      }).filter(c => c.length === 2 && (0, _utils.isPresent)(c[0]));\n    },\n    _serializeCookie(name, value) {\n      let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      return (0, _serializeCookie.serializeCookie)(name, value, options);\n    },\n    _isCookieSizeAcceptable(value) {\n      // Counting bytes varies Pre-ES6 and in ES6\n      // This snippet counts the bytes in the value\n      // about to be stored as the cookie:\n      // See https://stackoverflow.com/a/25994411/6657064\n      let _byteCount = 0;\n      let i = 0;\n      let c;\n      while (c = value.charCodeAt(i++)) {\n        /* eslint-disable no-bitwise */\n        _byteCount += c >> 11 ? 3 : c >> 7 ? 2 : 1;\n        /* eslint-enable no-bitwise */\n      }\n      return _byteCount < MAX_COOKIE_BYTE_LENGTH;\n    },\n    _normalizedDefaultPath() {\n      if (!this._isFastBoot()) {\n        let pathname = window.location.pathname;\n        return pathname.substring(0, pathname.lastIndexOf('/'));\n      }\n    },\n    _isFastBoot() {\n      return this._fastBoot && this._fastBoot.isFastBoot;\n    }\n  });\n  _exports.default = _default;\n});","define(\"ember-cookies/utils/serialize-cookie\", [\"exports\", \"@ember/utils\"], function (_exports, _utils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.serializeCookie = void 0;\n  const serializeCookie = function (name, value) {\n    let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n    let cookie = `${name}=${value}`;\n    if (!(0, _utils.isEmpty)(options.domain)) {\n      cookie = `${cookie}; domain=${options.domain}`;\n    }\n    if ((0, _utils.typeOf)(options.expires) === 'date') {\n      cookie = `${cookie}; expires=${options.expires.toUTCString()}`;\n    }\n    if (!(0, _utils.isEmpty)(options.maxAge)) {\n      cookie = `${cookie}; max-age=${options.maxAge}`;\n    }\n    if (options.secure) {\n      cookie = `${cookie}; secure`;\n    }\n    if (options.httpOnly) {\n      cookie = `${cookie}; httpOnly`;\n    }\n    if (!(0, _utils.isEmpty)(options.path)) {\n      cookie = `${cookie}; path=${options.path}`;\n    }\n    if (!(0, _utils.isEmpty)(options.sameSite)) {\n      cookie = `${cookie}; SameSite=${options.sameSite}`;\n    }\n    return cookie;\n  };\n  _exports.serializeCookie = serializeCookie;\n});","define('ember-data/-private', ['exports', '@ember/array/proxy', '@ember/object/promise-proxy-mixin', '@ember/object/proxy', '@ember-data/store', '@ember/application/namespace', 'ember', 'ember-data/version', '@ember-data/model/-private', '@ember-data/store/-private', '@ember-data/record-data/-private'], (function (exports, ArrayProxy, PromiseProxyMixin, ObjectProxy, store, Namespace, Ember, VERSION, Private, Private$1, Private$2) { 'use strict';\n\n  const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e };\n\n  const ArrayProxy__default = /*#__PURE__*/_interopDefaultLegacy(ArrayProxy);\n  const PromiseProxyMixin__default = /*#__PURE__*/_interopDefaultLegacy(PromiseProxyMixin);\n  const ObjectProxy__default = /*#__PURE__*/_interopDefaultLegacy(ObjectProxy);\n  const store__default = /*#__PURE__*/_interopDefaultLegacy(store);\n  const Namespace__default = /*#__PURE__*/_interopDefaultLegacy(Namespace);\n  const Ember__default = /*#__PURE__*/_interopDefaultLegacy(Ember);\n  const VERSION__default = /*#__PURE__*/_interopDefaultLegacy(VERSION);\n\n  const DS = Namespace__default.default.create({\n    VERSION: VERSION__default.default,\n    name: 'DS'\n  });\n  if (Ember__default.default.libraries) {\n    Ember__default.default.libraries.registerCoreLibrary('Ember Data', VERSION__default.default);\n  }\n\n  const PromiseArray = ArrayProxy__default.default.extend(PromiseProxyMixin__default.default);\n  const PromiseObject = ObjectProxy__default.default.extend(PromiseProxyMixin__default.default);\n\n  Object.defineProperty(exports, 'Store', {\n    enumerable: true,\n    get: () => store__default.default\n  });\n  Object.defineProperty(exports, 'Errors', {\n    enumerable: true,\n    get: () => Private.Errors\n  });\n  Object.defineProperty(exports, 'ManyArray', {\n    enumerable: true,\n    get: () => Private.ManyArray\n  });\n  Object.defineProperty(exports, 'PromiseManyArray', {\n    enumerable: true,\n    get: () => Private.PromiseManyArray\n  });\n  Object.defineProperty(exports, 'RecordArrayManager', {\n    enumerable: true,\n    get: () => Private$1.RecordArrayManager\n  });\n  Object.defineProperty(exports, 'Snapshot', {\n    enumerable: true,\n    get: () => Private$1.Snapshot\n  });\n  Object.defineProperty(exports, 'SnapshotRecordArray', {\n    enumerable: true,\n    get: () => Private$1.SnapshotRecordArray\n  });\n  Object.defineProperty(exports, 'coerceId', {\n    enumerable: true,\n    get: () => Private$1.coerceId\n  });\n  Object.defineProperty(exports, 'normalizeModelName', {\n    enumerable: true,\n    get: () => Private$1.normalizeModelName\n  });\n  Object.defineProperty(exports, 'RecordData', {\n    enumerable: true,\n    get: () => Private$2.RecordData\n  });\n  exports.DS = DS;\n  exports.PromiseArray = PromiseArray;\n  exports.PromiseObject = PromiseObject;\n\n  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });\n\n}));\n","define(\"ember-data/adapter\", [\"exports\", \"@ember-data/adapter\"], function (_exports, _adapter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _adapter.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/adapter\"eaimeta@70e063a35619d71f\n});","define(\"ember-data/adapters/errors\", [\"exports\", \"@ember-data/adapter/error\"], function (_exports, _error) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"AbortError\", {\n    enumerable: true,\n    get: function () {\n      return _error.AbortError;\n    }\n  });\n  Object.defineProperty(_exports, \"AdapterError\", {\n    enumerable: true,\n    get: function () {\n      return _error.default;\n    }\n  });\n  Object.defineProperty(_exports, \"ConflictError\", {\n    enumerable: true,\n    get: function () {\n      return _error.ConflictError;\n    }\n  });\n  Object.defineProperty(_exports, \"ForbiddenError\", {\n    enumerable: true,\n    get: function () {\n      return _error.ForbiddenError;\n    }\n  });\n  Object.defineProperty(_exports, \"InvalidError\", {\n    enumerable: true,\n    get: function () {\n      return _error.InvalidError;\n    }\n  });\n  Object.defineProperty(_exports, \"NotFoundError\", {\n    enumerable: true,\n    get: function () {\n      return _error.NotFoundError;\n    }\n  });\n  Object.defineProperty(_exports, \"ServerError\", {\n    enumerable: true,\n    get: function () {\n      return _error.ServerError;\n    }\n  });\n  Object.defineProperty(_exports, \"TimeoutError\", {\n    enumerable: true,\n    get: function () {\n      return _error.TimeoutError;\n    }\n  });\n  Object.defineProperty(_exports, \"UnauthorizedError\", {\n    enumerable: true,\n    get: function () {\n      return _error.UnauthorizedError;\n    }\n  });\n  Object.defineProperty(_exports, \"errorsArrayToHash\", {\n    enumerable: true,\n    get: function () {\n      return _error.errorsArrayToHash;\n    }\n  });\n  Object.defineProperty(_exports, \"errorsHashToArray\", {\n    enumerable: true,\n    get: function () {\n      return _error.errorsHashToArray;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/adapter/error\"eaimeta@70e063a35619d71f\n});","define(\"ember-data/adapters/json-api\", [\"exports\", \"@ember-data/adapter/json-api\"], function (_exports, _jsonApi) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _jsonApi.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/adapter/json-api\"eaimeta@70e063a35619d71f\n});","define(\"ember-data/adapters/rest\", [\"exports\", \"@ember-data/adapter/rest\"], function (_exports, _rest) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _rest.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/adapter/rest\"eaimeta@70e063a35619d71f\n});","define(\"ember-data/attr\", [\"exports\", \"@ember-data/model\"], function (_exports, _model) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _model.attr;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/model\"eaimeta@70e063a35619d71f\n});","define(\"ember-data/index\", [\"exports\", \"@embroider/macros/es-compat\", \"@embroider/macros/runtime\", \"@ember-data/adapter\", \"@ember-data/adapter/error\", \"@ember-data/adapter/json-api\", \"@ember-data/adapter/rest\", \"@ember-data/model\", \"@ember-data/serializer\", \"@ember-data/serializer/-private\", \"@ember-data/serializer/json\", \"@ember-data/serializer/json-api\", \"@ember-data/serializer/rest\", \"@ember-data/serializer/transform\", \"@ember-data/store\", \"ember-data/-private\", \"ember-data/setup-container\"], function (_exports, _esCompat, _runtime, _adapter, _error, _jsonApi, _rest, _model, _serializer, _private, _json, _jsonApi2, _rest2, _transform, _store, _private2, _setupContainer) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"ember-inflector\",0,\"@embroider/macros\",0,\"@ember-data/adapter\",0,\"@ember-data/adapter/error\",0,\"@ember-data/adapter/json-api\",0,\"@ember-data/adapter/rest\",0,\"@ember-data/model\",0,\"@ember-data/serializer\",0,\"@ember-data/serializer/-private\",0,\"@ember-data/serializer/json\",0,\"@ember-data/serializer/json-api\",0,\"@ember-data/serializer/rest\",0,\"@ember-data/serializer/transform\",0,\"@ember-data/store\",0,\"ember-data/-private\",0,\"ember-data/setup-container\",0,\"@ember-data/debug\"eaimeta@70e063a35619d71f\n  /**\n   <p align=\"center\">\n    <img\n      class=\"project-logo\"\n      src=\"https://raw.githubusercontent.com/emberjs/data/4612c9354e4c54d53327ec2cf21955075ce21294/ember-data-logo-light.svg#gh-light-mode-only\"\n      alt=\"EmberData\"\n      width=\"240px\"\n      title=\"EmberData\"\n      />\n  </p>\n  \n  <p align=\"center\">The lightweight reactive data library for JavaScript applications</p>\n  \n  ---\n  \n  Wrangle your application's data management with scalable patterns for developer productivity.\n  \n  - ⚡️  Committed to Best-In-Class Performance\n  - 🌲 Focused on being as svelte as possible\n  - 🚀 SSR Ready\n  - 🔜 Typescript Support\n  - 🐹 Built with ♥️ by [Ember](https://emberjs.com)\n  - ⚛️ Supports any API: `GraphQL` `JSON:API` `REST` `tRPC` ...bespoke or a mix\n  \n  ### 📖 On This Page\n  \n  - [Overview](./#overview)\n    - [Architecture](#🪜-architecture)\n    - [Basic Installation](#basic-installation)\n    - [Advanced Installation](#advanced-installation)\n  - [Configuration](#configuration)\n    - [Deprecation Stripping](#deprecation-stripping)\n    - [randomUUID polyfill](#randomuuid-polyfill)\n    - [Removing inspector support in production](#removing-inspector-support-in-production)\n    - [Debugging](#debugging)\n  \n  \n  # Overview\n  \n  *Ember*‍**Data** is a lightweight reactive data library for JavaScript applications that provides composable primitives for ordering query/mutation/peek flows, managing network and cache, and reducing data for presentation.\n  \n  ## 🪜 Architecture\n  \n  The core of *Ember*‍**Data** is the `Store`, which coordinates interaction between your application, the `Cache`, and sources of data (such as your `API` or a local persistence layer).\n  Optionally, the Store can be configured to hydrate the response data into rich presentation classes.\n  \n  *Ember*‍**Data** is both resource centric and document centric in it's approach to caching, requesting and presenting data. Your application's configuration and usage drives which is important and when.\n  \n  The `Store` is a **coordinator**. When using a `Store` you configure what cache to use, how cache data should be presented to the UI, and where it should look for requested data when it is not available in the cache.\n  \n  This coordination is handled opaquely to the nature of the requests issued and the format of the data being handled. This approach gives applications broad flexibility to configure *Ember*‍**Data** to best suite their needs. This makes *Ember*‍**Data** a powerful solution for applications regardless of their size and complexity.\n  \n  *Ember*‍**Data** is designed to scale, with a religious focus on performance and asset-size to keep its footprint small but speedy while still being able to handle large complex APIs in huge data-driven applications with no additional code and no added application complexity. It's goal is to prevent applications from writing code to manage data that is difficult to maintain or reason about.\n  \n  *Ember*‍**Data**'s power comes not from specific features, data formats, or adherence to specific API specs such as `JSON:API` `trpc` or `GraphQL`, but from solid conventions around requesting and mutating data developed over decades of experience scaling developer productivity.\n  \n  ## Basic Installation\n  \n  Install using your javascript package manager of choice. For instance with [pnpm](https://pnpm.io/)\n  \n  ```no-highlight\n  pnpm add ember-data\n  ```\n  \n  `ember-data` is installed by default for new applications generated with `ember-cli`. You can check what version is installed by looking in the `devDependencies` hash of your project's [package.json](https://docs.npmjs.com/cli/v8/configuring-npm/package-json) file.\n  \n  If you have generated a new `Ember` application using `ember-cli` but do\n  not wish to use `ember-data`, remove `ember-data` from your project's `package.json` file and run your package manager's install command to update your lockfile.\n  \n  ## Advanced Installation\n  \n  *Ember*‍**Data** is organized into primitives that compose together via public APIs.\n  \n  - [@ember-data/store](/ember-data/release/modules/@ember-data%2Fstore) is the core and handles coordination\n  - [@ember-data/record-data](/ember-data/release/modules/@ember-data%2Frecord-data) is a resource cache for JSON:API structured data. It integrates with the store via the hook `createRecordDataFor`\n  - [@ember-data/model](/ember-data/release/modules/@ember-data%2Fmodel) is a presentation layer, it integrates with the store via the hooks `instantiateRecord` and `teardownRecord`.\n  - [@ember-data/adapter](/ember-data/release/modules/@ember-data%2Fadapter) provides various network API integrations for APIS built over specific REST or JSON:API conventions.\n  - [@ember-data/serializer](/ember-data/release/modules/@ember-data%2Fserializer) pairs with `@ember-data/adapter` to normalize and serialize data to and from an API format into the `JSON:API` format understood by `@ember-data/record-data`.\n  - [@ember-data/debug](/ember-data/release/modules/@ember-data%2Fdebug) provides debugging support for the `ember-inspector`.\n  - **ember-data** is a \"meta\" package which bundles all of these together for convenience\n  \n  The packages interop with each other through well defined public API boundaries. The core\n  of the library is the store provided by `@ember-data/store`, while each of the other libraries plugs into the store when installed. Because these packages interop via fully\n  public APIs, other libraries or applications may provide their own implementations. For instance, [ember-m3](https://github.com/hjdivad/ember-m3) is a commonly used presentation and cache implementation suitable for complex resource objects and graphs.\n  \n  ## Configuration\n  \n  ### Deprecation Stripping\n  \n  *Ember*‍**Data** allows users to opt-in and remove code that exists to support deprecated behaviors.\n  \n  If your app has resolved all deprecations present in a given version, you may specify that version as your \"compatibility\" version to remove the code that supported the deprecated behavior from your app.\n  \n  ```ts\n  let app = new EmberApp(defaults, {\n    emberData: {\n      compatWith: '4.8',\n    },\n  });\n  ```\n  \n  - [Full Documentation](https://api.emberjs.com/ember-data/release/modules/@ember-data%2Fdeprecations)\n  \n  ### randomUUID polyfill\n  \n  *Ember*‍**Data** uses `UUID V4` by default to generate identifiers for new data created on the client. Identifier generation is configurable, but we also for convenience will polyfill\n  the necessary feature if your browser support or deployment environment demands it. To\n  activate this polyfill:\n  \n  ```ts\n  let app = new EmberApp(defaults, {\n    '@embroider/macros': {\n      setConfig: {\n        '@ember-data/store': {\n          polyfillUUID: true\n        },\n      },\n    },\n  });\n  ```\n  \n  ### removing inspector support in production\n  \n  If you do not with to ship inspector support in your production application, you can specify\n  that all support for it should be stripped from the build.\n  \n  ```ts\n  let app = new EmberApp(defaults, {\n    emberData: {\n      includeDataAdapterInProduction: false\n    }\n  });\n  ```\n  \n  - [Full Documentation](https://api.emberjs.com/ember-data/release/modules/@ember-data%2Fdebug)\n  \n  ### Debugging\n  \n  Many portions of the internals are helpfully instrumented with logging that can be activated\n  at build time. This instrumentation is always removed from production builds or any builds\n  that has not explicitly activated it. To activate it set the appropriate flag to `true`.\n  \n  ```ts\n    let app = new EmberApp(defaults, {\n      emberData: {\n        debug: {\n            LOG_PAYLOADS: false, // data store received to update cache with\n            LOG_OPERATIONS: false, // updates to cache remote state\n            LOG_MUTATIONS: false, // updates to cache local state\n            LOG_NOTIFICATIONS: false,\n            LOG_REQUEST_STATUS: false,\n            LOG_IDENTIFIERS: false,\n            LOG_GRAPH: false,\n            LOG_INSTANCE_CACHE: false,\n        }\n      }\n    });\n    ```\n  \n   @module ember-data-overview\n   @main ember-data-overview\n  */\n  _private2.DS.Store = _store.default;\n  _private2.DS.PromiseArray = _private2.PromiseArray;\n  _private2.DS.PromiseObject = _private2.PromiseObject;\n  _private2.DS.PromiseManyArray = _private2.PromiseManyArray;\n  _private2.DS.Model = _model.default;\n  _private2.DS.attr = _model.attr;\n  _private2.DS.Errors = _private2.Errors;\n  _private2.DS.Snapshot = _private2.Snapshot;\n  _private2.DS.Adapter = _adapter.default;\n  _private2.DS.AdapterError = _error.default;\n  _private2.DS.InvalidError = _error.InvalidError;\n  _private2.DS.TimeoutError = _error.TimeoutError;\n  _private2.DS.AbortError = _error.AbortError;\n  _private2.DS.UnauthorizedError = _error.UnauthorizedError;\n  _private2.DS.ForbiddenError = _error.ForbiddenError;\n  _private2.DS.NotFoundError = _error.NotFoundError;\n  _private2.DS.ConflictError = _error.ConflictError;\n  _private2.DS.ServerError = _error.ServerError;\n  _private2.DS.errorsHashToArray = _error.errorsHashToArray;\n  _private2.DS.errorsArrayToHash = _error.errorsArrayToHash;\n  _private2.DS.Serializer = _serializer.default;\n  if ((0, _runtime.macroCondition)(true)) {\n    _private2.DS.DebugAdapter = (0, _esCompat.default)(require(\"@ember-data/debug\")).default;\n  }\n  _private2.DS.ManyArray = _private2.ManyArray;\n  _private2.DS.RecordArrayManager = _private2.RecordArrayManager;\n  _private2.DS.RESTAdapter = _rest.default;\n  _private2.DS.BuildURLMixin = _adapter.BuildURLMixin;\n  _private2.DS.RESTSerializer = _rest2.default;\n  _private2.DS.JSONSerializer = _json.default;\n  _private2.DS.JSONAPIAdapter = _jsonApi.default;\n  _private2.DS.JSONAPISerializer = _jsonApi2.default;\n  _private2.DS.Transform = _transform.default;\n  _private2.DS.DateTransform = _private.DateTransform;\n  _private2.DS.StringTransform = _private.StringTransform;\n  _private2.DS.NumberTransform = _private.NumberTransform;\n  _private2.DS.BooleanTransform = _private.BooleanTransform;\n  _private2.DS.EmbeddedRecordsMixin = _rest2.EmbeddedRecordsMixin;\n  _private2.DS.belongsTo = _model.belongsTo;\n  _private2.DS.hasMany = _model.hasMany;\n  _private2.DS._setupContainer = _setupContainer.default;\n  Object.defineProperty(_private2.DS, 'normalizeModelName', {\n    enumerable: true,\n    writable: false,\n    configurable: false,\n    value: _store.normalizeModelName\n  });\n  var _default = _private2.DS;\n  _exports.default = _default;\n});","define(\"ember-data/model\", [\"exports\", \"@ember-data/model\"], function (_exports, _model) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _model.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/model\"eaimeta@70e063a35619d71f\n});","define(\"ember-data/relationships\", [\"exports\", \"@ember-data/model\"], function (_exports, _model) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"belongsTo\", {\n    enumerable: true,\n    get: function () {\n      return _model.belongsTo;\n    }\n  });\n  Object.defineProperty(_exports, \"hasMany\", {\n    enumerable: true,\n    get: function () {\n      return _model.hasMany;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/model\"eaimeta@70e063a35619d71f\n});","define(\"ember-data/serializer\", [\"exports\", \"@ember-data/serializer\"], function (_exports, _serializer) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _serializer.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/serializer\"eaimeta@70e063a35619d71f\n});","define(\"ember-data/serializers/embedded-records-mixin\", [\"exports\", \"@ember-data/serializer/rest\"], function (_exports, _rest) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _rest.EmbeddedRecordsMixin;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/serializer/rest\"eaimeta@70e063a35619d71f\n});","define(\"ember-data/serializers/json-api\", [\"exports\", \"@ember-data/serializer/json-api\"], function (_exports, _jsonApi) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _jsonApi.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/serializer/json-api\"eaimeta@70e063a35619d71f\n});","define(\"ember-data/serializers/json\", [\"exports\", \"@ember-data/serializer/json\"], function (_exports, _json) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _json.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/serializer/json\"eaimeta@70e063a35619d71f\n});","define(\"ember-data/serializers/rest\", [\"exports\", \"@ember-data/serializer/rest\"], function (_exports, _rest) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _rest.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/serializer/rest\"eaimeta@70e063a35619d71f\n});","define(\"ember-data/setup-container\", [\"exports\", \"@ember-data/store\"], function (_exports, _store) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = setupContainer;\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/store\"eaimeta@70e063a35619d71f\n  function initializeStore(application) {\n    application.registerOptionsForType('serializer', {\n      singleton: false\n    });\n    application.registerOptionsForType('adapter', {\n      singleton: false\n    });\n    if (!application.hasRegistration('service:store')) {\n      application.register('service:store', _store.default);\n    }\n  }\n  function setupContainer(application) {\n    initializeStore(application);\n  }\n});","define(\"ember-data/store\", [\"exports\", \"@ember-data/store\"], function (_exports, _store) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _store.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/store\"eaimeta@70e063a35619d71f\n});","define(\"ember-data/transform\", [\"exports\", \"@ember-data/serializer/transform\"], function (_exports, _transform) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _transform.default;\n    }\n  });\n  0; //eaimeta@70e063a35619d71f0,\"@ember-data/serializer/transform\"eaimeta@70e063a35619d71f\n});","define(\"ember-data/version\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71feaimeta@70e063a35619d71f\n  var _default = \"4.11.3\";\n  _exports.default = _default;\n});","define(\"ember-event-helpers/helpers/prevent-default\", [\"exports\", \"@ember/component/helper\", \"@ember/debug\"], function (_exports, _helper, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.preventDefault = preventDefault;\n  function preventDefault(_ref) {\n    let [handler] = _ref;\n    (true && !(!handler || typeof handler === 'function') && (0, _debug.assert)(`Expected '${handler}' to be a function, if present.`, !handler || typeof handler === 'function'));\n    return function (event) {\n      (true && !(event && typeof event.preventDefault === 'function') && (0, _debug.assert)(`Expected '${event}' to be an Event and have a 'preventDefault' method.`, event && typeof event.preventDefault === 'function'));\n      event.preventDefault();\n      if (handler) handler(event);\n    };\n  }\n  var _default = (0, _helper.helper)(preventDefault);\n  _exports.default = _default;\n});","define(\"ember-event-helpers/helpers/stop-propagation\", [\"exports\", \"@ember/component/helper\", \"@ember/debug\"], function (_exports, _helper, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.stopPropagation = stopPropagation;\n  function stopPropagation(_ref) {\n    let [handler] = _ref;\n    (true && !(!handler || typeof handler === 'function') && (0, _debug.assert)(`Expected '${handler}' to be a function, if present.`, !handler || typeof handler === 'function'));\n    return function (event) {\n      (true && !(event && typeof event.stopPropagation === 'function') && (0, _debug.assert)(`Expected '${event}' to be an Event and have a 'stopPropagation' method.`, event && typeof event.stopPropagation === 'function'));\n      event.stopPropagation();\n      if (handler) handler(event);\n    };\n  }\n  var _default = (0, _helper.helper)(stopPropagation);\n  _exports.default = _default;\n});","define(\"ember-fetch/errors\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.isAbortError = isAbortError;\n  _exports.isBadRequestResponse = isBadRequestResponse;\n  _exports.isConflictResponse = isConflictResponse;\n  _exports.isForbiddenResponse = isForbiddenResponse;\n  _exports.isGoneResponse = isGoneResponse;\n  _exports.isInvalidResponse = isInvalidResponse;\n  _exports.isNotFoundResponse = isNotFoundResponse;\n  _exports.isServerErrorResponse = isServerErrorResponse;\n  _exports.isUnauthorizedResponse = isUnauthorizedResponse;\n  /**\n   * Checks if the given response represents an unauthorized request error\n   */\n  function isUnauthorizedResponse(response) {\n    return response.status === 401;\n  }\n\n  /**\n   * Checks if the given response represents a forbidden request error\n   */\n  function isForbiddenResponse(response) {\n    return response.status === 403;\n  }\n\n  /**\n   * Checks if the given response represents an invalid request error\n   */\n  function isInvalidResponse(response) {\n    return response.status === 422;\n  }\n\n  /**\n   * Checks if the given response represents a bad request error\n   */\n  function isBadRequestResponse(response) {\n    return response.status === 400;\n  }\n\n  /**\n   * Checks if the given response represents a \"not found\" error\n   */\n  function isNotFoundResponse(response) {\n    return response.status === 404;\n  }\n\n  /**\n   * Checks if the given response represents a \"gone\" error\n   */\n  function isGoneResponse(response) {\n    return response.status === 410;\n  }\n\n  /**\n   * Checks if the given error is an \"abort\" error\n   */\n  function isAbortError(error) {\n    return error.name == 'AbortError';\n  }\n\n  /**\n   * Checks if the given response represents a conflict error\n   */\n  function isConflictResponse(response) {\n    return response.status === 409;\n  }\n\n  /**\n   * Checks if the given response represents a server error\n   */\n  function isServerErrorResponse(response) {\n    return response.status >= 500 && response.status < 600;\n  }\n});","define(\"ember-fetch/types\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.isPlainObject = isPlainObject;\n  function isPlainObject(obj) {\n    return Object.prototype.toString.call(obj) === '[object Object]';\n  }\n});","define(\"ember-fetch/utils/determine-body-promise\", [\"exports\", \"@ember/debug\"], function (_exports, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = determineBodyPromise;\n  /**\n   * Function that always attempts to parse the response as json, and if an error is thrown,\n   * returns `undefined` if the response is successful and has a status code of 204 (No Content),\n   * or 205 (Reset Content) or if the request method was 'HEAD', and the plain payload otherwise.\n   */\n  function determineBodyPromise(response, requestData) {\n    return response.text().then(function (payload) {\n      let ret = payload;\n      try {\n        ret = JSON.parse(payload);\n      } catch (error) {\n        if (!(error instanceof SyntaxError)) {\n          throw error;\n        }\n        const status = response.status;\n        if (response.ok && (status === 204 || status === 205 || requestData.method === 'HEAD')) {\n          ret = undefined;\n        } else {\n          (0, _debug.debug)(`This response was unable to be parsed as json: ${payload}`);\n        }\n      }\n      return ret;\n    });\n  }\n});","define(\"ember-fetch/utils/mung-options-for-fetch\", [\"exports\", \"@ember/polyfills\", \"ember-fetch/utils/serialize-query-params\", \"ember-fetch/types\"], function (_exports, _polyfills, _serializeQueryParams, _types) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = mungOptionsForFetch;\n  /**\n   * Helper function that translates the options passed to `jQuery.ajax` into a format that `fetch` expects.\n   */\n  function mungOptionsForFetch(options) {\n    const hash = (0, _polyfills.assign)({\n      credentials: 'same-origin'\n    }, options);\n\n    // Default to 'GET' in case `type` is not passed in (mimics jQuery.ajax).\n    hash.method = (hash.method || hash.type || 'GET').toUpperCase();\n    if (hash.data) {\n      // GET and HEAD requests can't have a `body`\n      if (hash.method === 'GET' || hash.method === 'HEAD') {\n        // If no options are passed, Ember Data sets `data` to an empty object, which we test for.\n        if (Object.keys(hash.data).length) {\n          // Test if there are already query params in the url (mimics jQuey.ajax).\n          const queryParamDelimiter = hash.url.indexOf('?') > -1 ? '&' : '?';\n          hash.url += `${queryParamDelimiter}${(0, _serializeQueryParams.serializeQueryParams)(hash.data)}`;\n        }\n      } else {\n        // NOTE: a request's body cannot be a POJO, so we stringify it if it is.\n        // JSON.stringify removes keys with values of `undefined` (mimics jQuery.ajax).\n        // If the data is not a POJO (it's a String, FormData, etc), we just set it.\n        // If the data is a string, we assume it's a stringified object.\n        if ((0, _types.isPlainObject)(hash.data)) {\n          hash.body = JSON.stringify(hash.data);\n        } else {\n          hash.body = hash.data;\n        }\n      }\n    }\n    return hash;\n  }\n});","define(\"ember-fetch/utils/serialize-query-params\", [\"exports\", \"ember-fetch/types\"], function (_exports, _types) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.serializeQueryParams = serializeQueryParams;\n  const RBRACKET = /\\[\\]$/;\n\n  /**\n   * Helper function that turns the data/body of a request into a query param string.\n   * This is directly copied from jQuery.param.\n   */\n  function serializeQueryParams(queryParamsObject) {\n    var s = [];\n    function buildParams(prefix, obj) {\n      var i, len, key;\n      if (prefix) {\n        if (Array.isArray(obj)) {\n          for (i = 0, len = obj.length; i < len; i++) {\n            if (RBRACKET.test(prefix)) {\n              add(s, prefix, obj[i]);\n            } else {\n              buildParams(prefix + '[' + (typeof obj[i] === 'object' ? i : '') + ']', obj[i]);\n            }\n          }\n        } else if ((0, _types.isPlainObject)(obj)) {\n          for (key in obj) {\n            buildParams(prefix + '[' + key + ']', obj[key]);\n          }\n        } else {\n          add(s, prefix, obj);\n        }\n      } else if (Array.isArray(obj)) {\n        for (i = 0, len = obj.length; i < len; i++) {\n          add(s, obj[i].name, obj[i].value);\n        }\n      } else {\n        for (key in obj) {\n          buildParams(key, obj[key]);\n        }\n      }\n      return s;\n    }\n    return buildParams('', queryParamsObject).join('&').replace(/%20/g, '+');\n  }\n\n  /**\n   * Part of the `serializeQueryParams` helper function.\n   */\n  function add(s, k, v) {\n    // Strip out keys with undefined value and replace null values with\n    // empty strings (mimics jQuery.ajax)\n    if (v === undefined) {\n      return;\n    } else if (v === null) {\n      v = '';\n    }\n    v = typeof v === 'function' ? v() : v;\n    s[s.length] = `${encodeURIComponent(k)}=${encodeURIComponent(v)}`;\n  }\n  var _default = serializeQueryParams;\n  _exports.default = _default;\n});","define(\"ember-inflector/index\", [\"exports\", \"ember-inflector/lib/system\"], function (_exports, _system) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  Object.defineProperty(_exports, \"pluralize\", {\n    enumerable: true,\n    get: function () {\n      return _system.pluralize;\n    }\n  });\n  Object.defineProperty(_exports, \"singularize\", {\n    enumerable: true,\n    get: function () {\n      return _system.singularize;\n    }\n  });\n  var _default = _system.Inflector;\n  _exports.default = _default;\n});","define(\"ember-inflector/lib/helpers/pluralize\", [\"exports\", \"ember-inflector\", \"ember-inflector/lib/utils/make-helper\"], function (_exports, _emberInflector, _makeHelper) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n   *\n   * If you have Ember Inflector (such as if Ember Data is present),\n   * pluralize a word. For example, turn \"ox\" into \"oxen\".\n   *\n   * Example:\n   *\n   * {{pluralize count myProperty}}\n   * {{pluralize 1 \"oxen\"}}\n   * {{pluralize myProperty}}\n   * {{pluralize \"ox\"}}\n   *\n   * @for Ember.HTMLBars.helpers\n   * @method pluralize\n   * @param {Number|Property} [count] count of objects\n   * @param {String|Property} word word to pluralize\n   */\n  var _default = (0, _makeHelper.default)(function (params, hash) {\n    let fullParams = new Array(...params);\n    if (fullParams.length === 2) {\n      fullParams.push({\n        withoutCount: hash[\"without-count\"]\n      });\n    }\n    return (0, _emberInflector.pluralize)(...fullParams);\n  });\n  _exports.default = _default;\n});","define(\"ember-inflector/lib/helpers/singularize\", [\"exports\", \"ember-inflector\", \"ember-inflector/lib/utils/make-helper\"], function (_exports, _emberInflector, _makeHelper) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n   *\n   * If you have Ember Inflector (such as if Ember Data is present),\n   * singularize a word. For example, turn \"oxen\" into \"ox\".\n   *\n   * Example:\n   *\n   * {{singularize myProperty}}\n   * {{singularize \"oxen\"}}\n   *\n   * @for Ember.HTMLBars.helpers\n   * @method singularize\n   * @param {String|Property} word word to singularize\n  */\n  var _default = (0, _makeHelper.default)(function (params) {\n    return (0, _emberInflector.singularize)(params[0]);\n  });\n  _exports.default = _default;\n});","define(\"ember-inflector/lib/system\", [\"exports\", \"ember-inflector/lib/system/inflector\", \"ember-inflector/lib/system/string\"], function (_exports, _inflector, _string) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"Inflector\", {\n    enumerable: true,\n    get: function () {\n      return _inflector.default;\n    }\n  });\n  Object.defineProperty(_exports, \"pluralize\", {\n    enumerable: true,\n    get: function () {\n      return _string.pluralize;\n    }\n  });\n  Object.defineProperty(_exports, \"singularize\", {\n    enumerable: true,\n    get: function () {\n      return _string.singularize;\n    }\n  });\n});","define(\"ember-inflector/lib/system/inflections\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = {\n    plurals: [[/$/, 's'], [/s$/i, 's'], [/^(ax|test)is$/i, '$1es'], [/(octop|vir)us$/i, '$1i'], [/(octop|vir)i$/i, '$1i'], [/(alias|status|bonus)$/i, '$1es'], [/(bu)s$/i, '$1ses'], [/(buffal|tomat)o$/i, '$1oes'], [/([ti])um$/i, '$1a'], [/([ti])a$/i, '$1a'], [/sis$/i, 'ses'], [/(?:([^f])fe|([lr])f)$/i, '$1$2ves'], [/(hive)$/i, '$1s'], [/([^aeiouy]|qu)y$/i, '$1ies'], [/(x|ch|ss|sh)$/i, '$1es'], [/(matr|vert|ind)(?:ix|ex)$/i, '$1ices'], [/^(m|l)ouse$/i, '$1ice'], [/^(m|l)ice$/i, '$1ice'], [/^(ox)$/i, '$1en'], [/^(oxen)$/i, '$1'], [/(quiz)$/i, '$1zes']],\n    singular: [[/s$/i, ''], [/(ss)$/i, '$1'], [/(n)ews$/i, '$1ews'], [/([ti])a$/i, '$1um'], [/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)(sis|ses)$/i, '$1sis'], [/(^analy)(sis|ses)$/i, '$1sis'], [/([^f])ves$/i, '$1fe'], [/(hive)s$/i, '$1'], [/(tive)s$/i, '$1'], [/([lr])ves$/i, '$1f'], [/([^aeiouy]|qu)ies$/i, '$1y'], [/(s)eries$/i, '$1eries'], [/(m)ovies$/i, '$1ovie'], [/(x|ch|ss|sh)es$/i, '$1'], [/^(m|l)ice$/i, '$1ouse'], [/(bus)(es)?$/i, '$1'], [/(o)es$/i, '$1'], [/(shoe)s$/i, '$1'], [/(cris|test)(is|es)$/i, '$1is'], [/^(a)x[ie]s$/i, '$1xis'], [/(octop|vir)(us|i)$/i, '$1us'], [/(alias|status|bonus)(es)?$/i, '$1'], [/^(ox)en/i, '$1'], [/(vert|ind)ices$/i, '$1ex'], [/(matr)ices$/i, '$1ix'], [/(quiz)zes$/i, '$1'], [/(database)s$/i, '$1']],\n    irregularPairs: [['person', 'people'], ['man', 'men'], ['child', 'children'], ['sex', 'sexes'], ['move', 'moves'], ['cow', 'kine'], ['zombie', 'zombies']],\n    uncountable: ['equipment', 'information', 'rice', 'money', 'species', 'series', 'fish', 'sheep', 'jeans', 'police']\n  };\n  _exports.default = _default;\n});","define(\"ember-inflector/lib/system/inflector\", [\"exports\", \"@ember/string\", \"ember-inflector/lib/system/inflections\"], function (_exports, _string, _inflections) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const BLANK_REGEX = /^\\s*$/;\n  const LAST_WORD_DASHED_REGEX = /([\\w/-]+[_/\\s-])([a-z\\d]+$)/;\n  const LAST_WORD_CAMELIZED_REGEX = /([\\w/\\s-]+)([A-Z][a-z\\d]*$)/;\n  const CAMELIZED_REGEX = /[A-Z][a-z\\d]*$/;\n  function loadUncountable(rules, uncountable) {\n    for (let i = 0, length = uncountable.length; i < length; i++) {\n      rules.uncountable[uncountable[i].toLowerCase()] = true;\n    }\n  }\n  function loadIrregular(rules, irregularPairs) {\n    let pair;\n    for (let i = 0, length = irregularPairs.length; i < length; i++) {\n      pair = irregularPairs[i];\n\n      //pluralizing\n      rules.irregular[pair[0].toLowerCase()] = pair[1];\n      rules.irregular[pair[1].toLowerCase()] = pair[1];\n\n      //singularizing\n      rules.irregularInverse[pair[1].toLowerCase()] = pair[0];\n      rules.irregularInverse[pair[0].toLowerCase()] = pair[0];\n    }\n  }\n\n  /**\n    Inflector.Ember provides a mechanism for supplying inflection rules for your\n    application. Ember includes a default set of inflection rules, and provides an\n    API for providing additional rules.\n  \n    Examples:\n  \n    Creating an inflector with no rules.\n  \n    ```js\n    var inflector = new Ember.Inflector();\n    ```\n  \n    Creating an inflector with the default ember ruleset.\n  \n    ```js\n    var inflector = new Ember.Inflector(Ember.Inflector.defaultRules);\n  \n    inflector.pluralize('cow'); //=> 'kine'\n    inflector.singularize('kine'); //=> 'cow'\n    ```\n  \n    Creating an inflector and adding rules later.\n  \n    ```javascript\n    var inflector = Ember.Inflector.inflector;\n  \n    inflector.pluralize('advice'); // => 'advices'\n    inflector.uncountable('advice');\n    inflector.pluralize('advice'); // => 'advice'\n  \n    inflector.pluralize('formula'); // => 'formulas'\n    inflector.irregular('formula', 'formulae');\n    inflector.pluralize('formula'); // => 'formulae'\n  \n    // you would not need to add these as they are the default rules\n    inflector.plural(/$/, 's');\n    inflector.singular(/s$/i, '');\n    ```\n  \n    Creating an inflector with a nondefault ruleset.\n  \n    ```javascript\n    var rules = {\n      plurals:  [\n        [ /$/, 's' ]\n      ],\n      singular: [\n        [ /\\s$/, '' ]\n      ],\n      irregularPairs: [\n        [ 'cow', 'kine' ]\n      ],\n      uncountable: [ 'fish' ]\n    };\n  \n    var inflector = new Ember.Inflector(rules);\n    ```\n  \n    @class Inflector\n    @namespace Ember\n  */\n  function Inflector(ruleSet) {\n    ruleSet = ruleSet || {};\n    ruleSet.uncountable = ruleSet.uncountable || makeDictionary();\n    ruleSet.irregularPairs = ruleSet.irregularPairs || makeDictionary();\n    const rules = this.rules = {\n      plurals: ruleSet.plurals || [],\n      singular: ruleSet.singular || [],\n      irregular: makeDictionary(),\n      irregularInverse: makeDictionary(),\n      uncountable: makeDictionary()\n    };\n    loadUncountable(rules, ruleSet.uncountable);\n    loadIrregular(rules, ruleSet.irregularPairs);\n    this.enableCache();\n  }\n  if (!Object.create && !Object.create(null).hasOwnProperty) {\n    throw new Error(\"This browser does not support Object.create(null), please polyfil with es5-sham: http://git.io/yBU2rg\");\n  }\n  function makeDictionary() {\n    var cache = Object.create(null);\n    cache['_dict'] = null;\n    delete cache['_dict'];\n    return cache;\n  }\n  Inflector.prototype = {\n    /**\n      @public\n       As inflections can be costly, and commonly the same subset of words are repeatedly\n      inflected an optional cache is provided.\n       @method enableCache\n    */\n    enableCache() {\n      this.purgeCache();\n      this.singularize = function (word) {\n        this._cacheUsed = true;\n        return this._sCache[word] || (this._sCache[word] = this._singularize(word));\n      };\n      this.pluralize = function (numberOrWord, word) {\n        let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n        this._cacheUsed = true;\n        var cacheKey = [numberOrWord, word, options.withoutCount];\n        return this._pCache[cacheKey] || (this._pCache[cacheKey] = this._pluralize(numberOrWord, word, options));\n      };\n    },\n    /**\n      @public\n       @method purgeCache\n    */\n    purgeCache() {\n      this._cacheUsed = false;\n      this._sCache = makeDictionary();\n      this._pCache = makeDictionary();\n    },\n    /**\n      @public\n      disable caching\n       @method disableCache;\n    */\n    disableCache() {\n      this._sCache = null;\n      this._pCache = null;\n      this.singularize = function (word) {\n        return this._singularize(word);\n      };\n      this.pluralize = function () {\n        return this._pluralize(...arguments);\n      };\n    },\n    /**\n      @method plural\n      @param {RegExp} regex\n      @param {String} string\n    */\n    plural(regex, string) {\n      if (this._cacheUsed) {\n        this.purgeCache();\n      }\n      this.rules.plurals.push([regex, string.toLowerCase()]);\n    },\n    /**\n      @method singular\n      @param {RegExp} regex\n      @param {String} string\n    */\n    singular(regex, string) {\n      if (this._cacheUsed) {\n        this.purgeCache();\n      }\n      this.rules.singular.push([regex, string.toLowerCase()]);\n    },\n    /**\n      @method uncountable\n      @param {String} regex\n    */\n    uncountable(string) {\n      if (this._cacheUsed) {\n        this.purgeCache();\n      }\n      loadUncountable(this.rules, [string.toLowerCase()]);\n    },\n    /**\n      @method irregular\n      @param {String} singular\n      @param {String} plural\n    */\n    irregular(singular, plural) {\n      if (this._cacheUsed) {\n        this.purgeCache();\n      }\n      loadIrregular(this.rules, [[singular, plural]]);\n    },\n    /**\n      @method pluralize\n      @param {String} word\n    */\n    pluralize() {\n      return this._pluralize(...arguments);\n    },\n    _pluralize(wordOrCount, word) {\n      let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      if (word === undefined) {\n        return this.inflect(wordOrCount, this.rules.plurals, this.rules.irregular);\n      }\n      if (parseFloat(wordOrCount) !== 1) {\n        word = this.inflect(word, this.rules.plurals, this.rules.irregular);\n      }\n      return options.withoutCount ? word : `${wordOrCount} ${word}`;\n    },\n    /**\n      @method singularize\n      @param {String} word\n    */\n    singularize(word) {\n      return this._singularize(word);\n    },\n    _singularize(word) {\n      return this.inflect(word, this.rules.singular, this.rules.irregularInverse);\n    },\n    /**\n      @protected\n       @method inflect\n      @param {String} word\n      @param {Object} typeRules\n      @param {Object} irregular\n    */\n    inflect(word, typeRules, irregular) {\n      let inflection, substitution, result, lowercase, wordSplit, lastWord, isBlank, isCamelized, rule, isUncountable;\n      isBlank = !word || BLANK_REGEX.test(word);\n      isCamelized = CAMELIZED_REGEX.test(word);\n      if (isBlank) {\n        return word;\n      }\n      lowercase = word.toLowerCase();\n      wordSplit = LAST_WORD_DASHED_REGEX.exec(word) || LAST_WORD_CAMELIZED_REGEX.exec(word);\n      if (wordSplit) {\n        lastWord = wordSplit[2].toLowerCase();\n      }\n      isUncountable = this.rules.uncountable[lowercase] || this.rules.uncountable[lastWord];\n      if (isUncountable) {\n        return word;\n      }\n      for (rule in irregular) {\n        if (lowercase.match(rule + \"$\")) {\n          substitution = irregular[rule];\n          if (isCamelized && irregular[lastWord]) {\n            substitution = (0, _string.capitalize)(substitution);\n            rule = (0, _string.capitalize)(rule);\n          }\n          return word.replace(new RegExp(rule, 'i'), substitution);\n        }\n      }\n      for (var i = typeRules.length, min = 0; i > min; i--) {\n        inflection = typeRules[i - 1];\n        rule = inflection[0];\n        if (rule.test(word)) {\n          break;\n        }\n      }\n      inflection = inflection || [];\n      rule = inflection[0];\n      substitution = inflection[1];\n      result = word.replace(rule, substitution);\n      return result;\n    }\n  };\n  Inflector.defaultRules = _inflections.default;\n  Inflector.inflector = new Inflector(_inflections.default);\n  var _default = Inflector;\n  _exports.default = _default;\n});","define(\"ember-inflector/lib/system/string\", [\"exports\", \"ember-inflector/lib/system/inflector\"], function (_exports, _inflector) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.pluralize = pluralize;\n  _exports.singularize = singularize;\n  function pluralize() {\n    return _inflector.default.inflector.pluralize(...arguments);\n  }\n  function singularize(word) {\n    return _inflector.default.inflector.singularize(word);\n  }\n});","define(\"ember-inflector/lib/utils/make-helper\", [\"exports\", \"ember\", \"@ember/component/helper\"], function (_exports, _ember, _helper) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = makeHelper;\n  function makeHelper(helperFunction) {\n    if (_helper.default) {\n      return _helper.default.helper(helperFunction);\n    }\n    if (_ember.default.HTMLBars) {\n      return _ember.default.HTMLBars.makeBoundHelper(helperFunction);\n    }\n    return _ember.default.Handlebars.makeBoundHelper(helperFunction);\n  }\n});","define(\"ember-load-initializers/index\", [\"exports\", \"require\"], function (_exports, _require) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = loadInitializers;\n  function resolveInitializer(moduleName) {\n    var module = (0, _require.default)(moduleName, null, null, true);\n    if (!module) {\n      throw new Error(moduleName + ' must export an initializer.');\n    }\n    var initializer = module['default'];\n    if (!initializer) {\n      throw new Error(moduleName + ' must have a default export');\n    }\n    if (!initializer.name) {\n      initializer.name = moduleName.slice(moduleName.lastIndexOf('/') + 1);\n    }\n    return initializer;\n  }\n  function registerInitializers(app, moduleNames) {\n    for (var i = 0; i < moduleNames.length; i++) {\n      app.initializer(resolveInitializer(moduleNames[i]));\n    }\n  }\n  function registerInstanceInitializers(app, moduleNames) {\n    for (var i = 0; i < moduleNames.length; i++) {\n      app.instanceInitializer(resolveInitializer(moduleNames[i]));\n    }\n  }\n  function _endsWith(str, suffix) {\n    return str.indexOf(suffix, str.length - suffix.length) !== -1;\n  }\n\n  /**\n   * Configure your application as it boots\n   */\n  function loadInitializers(app, prefix) {\n    var initializerPrefix = prefix + '/initializers/';\n    var instanceInitializerPrefix = prefix + '/instance-initializers/';\n    var initializers = [];\n    var instanceInitializers = [];\n    // this is 2 pass because generally the first pass is the problem\n    // and is reduced, and resolveInitializer has potential to deopt\n    var moduleNames = Object.keys(requirejs._eak_seen);\n    for (var i = 0; i < moduleNames.length; i++) {\n      var moduleName = moduleNames[i];\n      if (moduleName.lastIndexOf(initializerPrefix, 0) === 0) {\n        if (!_endsWith(moduleName, '-test')) {\n          initializers.push(moduleName);\n        }\n      } else if (moduleName.lastIndexOf(instanceInitializerPrefix, 0) === 0) {\n        if (!_endsWith(moduleName, '-test')) {\n          instanceInitializers.push(moduleName);\n        }\n      }\n    }\n    registerInitializers(app, initializers);\n    registerInstanceInitializers(app, instanceInitializers);\n  }\n});","define(\"ember-page-title/helpers/page-title\", [\"exports\", \"@ember/service\", \"@ember/component/helper\", \"@ember/object/internals\"], function (_exports, _service, _helper, _internals) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _dec, _class, _descriptor;\n  function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }\n  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n  function _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\n  function _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }\n  function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }\n  /**\n    `{{page-title}}` helper used to set the title of the current route context.\n  \n    @public\n    @method page-title\n   */\n  let PageTitle = (_dec = (0, _service.inject)('page-title-list'), _class = class PageTitle extends _helper.default {\n    get tokenId() {\n      return (0, _internals.guidFor)(this);\n    }\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty(this, \"tokens\", _descriptor, this);\n      this.tokens.push({\n        id: this.tokenId\n      });\n    }\n    compute(params, _hash) {\n      let hash = {\n        ..._hash,\n        id: this.tokenId,\n        title: params.join('')\n      };\n      this.tokens.push(hash);\n      this.tokens.scheduleTitleUpdate();\n      return '';\n    }\n    willDestroy() {\n      super.willDestroy();\n      this.tokens.remove(this.tokenId);\n      this.tokens.scheduleTitleUpdate();\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"tokens\", [_dec], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n  _exports.default = PageTitle;\n});","define(\"ember-page-title/services/page-title-list\", [\"exports\", \"@ember/application\", \"@ember/runloop\", \"@ember/service\", \"@ember/utils\", \"@ember/debug\"], function (_exports, _application, _runloop, _service, _utils, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _dec, _dec2, _dec3, _class, _descriptor, _descriptor2, _descriptor3;\n  function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }\n  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n  function _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\n  function _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }\n  function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }\n  let isFastBoot = typeof FastBoot !== 'undefined';\n  const RouterEvent = {\n    ROUTE_DID_CHANGE: 'routeDidChange'\n  };\n\n  /**\n    @class page-title-list\n    @extends Ember.Service\n   */\n  let PageTitleListService = (_dec = (0, _service.inject)('page-title'), _dec2 = (0, _service.inject)('router'), _dec3 = (0, _service.inject)('-document'), _class = class PageTitleListService extends _service.default {\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty(this, \"pageTitle\", _descriptor, this);\n      _initializerDefineProperty(this, \"router\", _descriptor2, this);\n      // in fastboot context \"document\" is instance of\n      // ember-fastboot/simple-dom document\n      _initializerDefineProperty(this, \"document\", _descriptor3, this);\n      _defineProperty(this, \"tokens\", []);\n      _defineProperty(this, \"_defaultConfig\", {\n        // The default separator to use between tokens.\n        separator: ' | ',\n        // The default prepend value to use.\n        prepend: true,\n        // The default replace value to use.\n        replace: null\n      });\n      _defineProperty(this, \"scheduleTitleUpdate\", () => {\n        (0, _runloop.scheduleOnce)('afterRender', this, this._updateTitle);\n      });\n      this._validateExistingTitleElement();\n      let config = (0, _application.getOwner)(this).resolveRegistration('config:environment');\n      if (config.pageTitle) {\n        ['separator', 'prepend', 'replace'].forEach(key => {\n          if (!(0, _utils.isEmpty)(config.pageTitle[key])) {\n            this._defaultConfig[key] = config.pageTitle[key];\n          }\n        });\n      }\n      this.router.on(RouterEvent.ROUTE_DID_CHANGE, this.scheduleTitleUpdate);\n    }\n    applyTokenDefaults(token) {\n      let defaultSeparator = this._defaultConfig.separator;\n      let defaultPrepend = this._defaultConfig.prepend;\n      let defaultReplace = this._defaultConfig.replace;\n      if (token.separator == null) {\n        token.separator = defaultSeparator;\n      }\n      if (token.prepend == null && defaultPrepend != null) {\n        token.prepend = defaultPrepend;\n      }\n      if (token.replace == null && defaultReplace != null) {\n        token.replace = defaultReplace;\n      }\n    }\n    inheritFromPrevious(token) {\n      let previous = token.previous;\n      if (previous) {\n        if (token.separator == null) {\n          token.separator = previous.separator;\n        }\n        if (token.prepend == null) {\n          token.prepend = previous.prepend;\n        }\n      }\n    }\n    push(token) {\n      let tokenForId = this._findTokenById(token.id);\n      if (tokenForId) {\n        let index = this.tokens.indexOf(tokenForId);\n        let tokens = [...this.tokens];\n        let previous = tokenForId.previous;\n        token.previous = previous;\n        token.next = tokenForId.next;\n        this.inheritFromPrevious(token);\n        this.applyTokenDefaults(token);\n        tokens.splice(index, 1, token);\n        this.tokens = tokens;\n        return;\n      }\n      let previous = this.tokens.slice(-1)[0];\n      if (previous) {\n        token.previous = previous;\n        previous.next = token;\n        this.inheritFromPrevious(token);\n      }\n      this.applyTokenDefaults(token);\n      this.tokens = [...this.tokens, token];\n    }\n    remove(id) {\n      let token = this._findTokenById(id);\n      let {\n        next,\n        previous\n      } = token;\n      if (next) {\n        next.previous = previous;\n      }\n      if (previous) {\n        previous.next = next;\n      }\n      token.previous = token.next = null;\n      let tokens = [...this.tokens];\n      tokens.splice(tokens.indexOf(token), 1);\n      this.tokens = tokens;\n    }\n    get visibleTokens() {\n      let tokens = this.tokens;\n      let i = tokens ? tokens.length : 0;\n      let visible = [];\n      while (i--) {\n        let token = tokens[i];\n        if (token.replace) {\n          visible.unshift(token);\n          break;\n        } else {\n          visible.unshift(token);\n        }\n      }\n      return visible;\n    }\n    get sortedTokens() {\n      let visible = this.visibleTokens;\n      let appending = true;\n      let group = [];\n      let groups = [group];\n      let frontGroups = [];\n      visible.forEach(token => {\n        if (token.front) {\n          frontGroups.unshift(token);\n        } else if (token.prepend) {\n          if (appending) {\n            appending = false;\n            group = [];\n            groups.push(group);\n          }\n          let lastToken = group[0];\n          if (lastToken) {\n            token = {\n              ...token\n            };\n            token.separator = lastToken.separator;\n          }\n          group.unshift(token);\n        } else {\n          if (!appending) {\n            appending = true;\n            group = [];\n            groups.push(group);\n          }\n          group.push(token);\n        }\n      });\n      return frontGroups.concat(groups.reduce((E, group) => E.concat(group), []));\n    }\n    toString() {\n      let tokens = this.sortedTokens;\n      let title = [];\n      for (let i = 0, len = tokens.length; i < len; i++) {\n        let token = tokens[i];\n        if (token.title) {\n          title.push(token.title);\n          if (i + 1 < len) {\n            title.push(token.separator);\n          }\n        }\n      }\n      return title.join('');\n    }\n    willDestroy() {\n      super.willDestroy();\n      this.router.off(RouterEvent.ROUTE_DID_CHANGE, this.scheduleTitleUpdate);\n    }\n    _updateTitle() {\n      const toBeTitle = this.toString();\n      if (isFastBoot) {\n        this.updateFastbootTitle(toBeTitle);\n      } else {\n        /**\n         * When rendering app with \"?fastboot=false\" (http://ember-fastboot.com/docs/user-guide#disabling-fastboot)\n         * We will not have <title> element present in DOM.\n         *\n         * But this is fine as by HTML spec,\n         * one is created upon assigning \"document.title\" value;\n         *\n         * https://html.spec.whatwg.org/multipage/dom.html#dom-tree-accessors\n         */\n        this.document.title = toBeTitle;\n      }\n      this.pageTitle.titleDidUpdate(toBeTitle);\n    }\n\n    /**\n     * Validate if there's more than one title element present.\n     *\n     * Example: ember-cli-head can cause conflicting updates.\n     * @private\n     */\n    _validateExistingTitleElement() {\n      if (isFastBoot) {\n        return;\n      }\n      (true && !(document.head.querySelectorAll('title').length <= 1) && (0, _debug.assert)('[ember-page-title]: Multiple title elements found. Check for other addons like ember-cli-head updating <title> as well.', document.head.querySelectorAll('title').length <= 1));\n    }\n\n    /**\n     * Find token by id\n     *\n     * IE11 compatible approach due to lack of Array.find support\n     *\n     * @param {String} id\n     * @private\n     */\n    _findTokenById(id) {\n      return this.tokens.filter(token => {\n        return token.id === id;\n      })[0];\n    }\n    updateFastbootTitle(toBeTitle) {\n      if (!isFastBoot) {\n        return;\n      }\n      const headElement = this.document.head;\n      const headChildNodes = headElement.childNodes;\n\n      // Remove existing title elements from previous render cycle\n      for (let i = 0; i < headChildNodes.length; i++) {\n        let node = headChildNodes[i];\n        if (node.nodeName.toLowerCase() === 'title') {\n          headElement.removeChild(node);\n        }\n      }\n\n      // Add title element with latest value\n      let titleEl = this.document.createElement('title');\n      let titleContents = this.document.createTextNode(toBeTitle);\n      titleEl.appendChild(titleContents);\n      headElement.appendChild(titleEl);\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"pageTitle\", [_dec], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"router\", [_dec2], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"document\", [_dec3], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _class);\n  _exports.default = PageTitleListService;\n});","define(\"ember-page-title/services/page-title\", [\"exports\", \"@ember/service\"], function (_exports, _service) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class PageTitleService extends _service.default {\n    titleDidUpdate(/* title */) {}\n  }\n  _exports.default = PageTitleService;\n});","define(\"ember-prism/components/code-block\", [\"exports\", \"@ember/component\", \"@ember/template-factory\", \"@glimmer/component\"], function (_exports, _component, _templateFactory, _component2) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-htmlbars\",0,\"@glimmer/component\"eaimeta@70e063a35619d71f\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <pre\n    class=\"{{this.languageClass}} {{if @showLineNumbers \"line-numbers\"}}\"\n    data-start={{@start}}\n  >\n    {{~! ~}}\n    <CodeInline\n      ...attributes\n      @code={{@code}}\n      @language={{@language}}\n    />\n    {{~! ~}}\n  </pre>\n  */\n  {\n    \"id\": \"6RbsvH6W\",\n    \"block\": \"[[[10,\\\"pre\\\"],[15,0,[29,[[30,0,[\\\"languageClass\\\"]],\\\" \\\",[52,[30,1],\\\"line-numbers\\\"]]]],[15,\\\"data-start\\\",[30,2]],[12],[8,[39,1],[[17,3]],[[\\\"@code\\\",\\\"@language\\\"],[[30,4],[30,5]]],null],[13]],[\\\"@showLineNumbers\\\",\\\"@start\\\",\\\"&attrs\\\",\\\"@code\\\",\\\"@language\\\"],false,[\\\"if\\\",\\\"code-inline\\\"]]\",\n    \"moduleName\": \"ember-prism/components/code-block.hbs\",\n    \"isStrictMode\": false\n  });\n  class CodeBlockComponent extends _component2.default {\n    get language() {\n      return this.args.language ?? 'markup';\n    }\n    get languageClass() {\n      return `language-${this.language}`;\n    }\n  }\n  _exports.default = CodeBlockComponent;\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, CodeBlockComponent);\n});","define(\"ember-prism/components/code-inline\", [\"exports\", \"@ember/component\", \"@ember/template-factory\", \"@glimmer/component\", \"@ember/object\", \"@ember/template\", \"@glimmer/tracking\", \"@ember/debug\"], function (_exports, _component, _templateFactory, _component2, _object, _template, _tracking, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _class, _descriptor;\n  0; //eaimeta@70e063a35619d71f0,\"ember-cli-htmlbars\",0,\"@glimmer/component\",0,\"@ember/object\",0,\"@ember/template\",0,\"@glimmer/tracking\",0,\"@ember/debug\"eaimeta@70e063a35619d71f\n  function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }\n  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n  function _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\n  function _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }\n  function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }\n  const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n  /*\n    <code\n    ...attributes\n    class=\"{{this.languageClass}}\"\n    {{did-insert this.setPrismCode}}\n    {{did-update this.setPrismCode this.code @language}}\n  >\n    {{~! ~}}{{this.prismCode}}{{~! ~}}\n  </code>\n  */\n  {\n    \"id\": \"xjF1+9TK\",\n    \"block\": \"[[[11,\\\"code\\\"],[17,1],[16,0,[29,[[30,0,[\\\"languageClass\\\"]]]]],[4,[38,0],[[30,0,[\\\"setPrismCode\\\"]]],null],[4,[38,1],[[30,0,[\\\"setPrismCode\\\"]],[30,0,[\\\"code\\\"]],[30,2]],null],[12],[1,[30,0,[\\\"prismCode\\\"]]],[13]],[\\\"&attrs\\\",\\\"@language\\\"],false,[\\\"did-insert\\\",\\\"did-update\\\"]]\",\n    \"moduleName\": \"ember-prism/components/code-inline.hbs\",\n    \"isStrictMode\": false\n  });\n  /* global Prism */\n  let CodeInlineComponent = (_class = class CodeInlineComponent extends _component2.default {\n    constructor() {\n      super(...arguments);\n      _initializerDefineProperty(this, \"prismCode\", _descriptor, this);\n    }\n    get code() {\n      const code = this.args.code;\n      (true && !(code !== undefined) && (0, _debug.assert)(\"ember-prism's <CodeBlock/> and <CodeInline/> components require a `code` parameter to be passed in.\", code !== undefined));\n      if (Prism?.plugins?.NormalizeWhitespace) {\n        return Prism.plugins.NormalizeWhitespace.normalize(code);\n      }\n      return code;\n    }\n    get language() {\n      return this.args.language ?? 'markup';\n    }\n    get languageClass() {\n      return `language-${this.language}`;\n    }\n    setPrismCode(element) {\n      const code = this.code;\n      const language = this.language;\n      const grammar = Prism.languages[language];\n      if (code && language && grammar) {\n        this.prismCode = (0, _template.htmlSafe)(Prism.highlight(code, grammar, language));\n      } else {\n        this.prismCode = '';\n      }\n\n      // Force plugin initialization, required for Prism.highlight usage.\n      // See https://github.com/PrismJS/prism/issues/1234\n      Prism.hooks.run('complete', {\n        code,\n        element\n      });\n    }\n  }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"prismCode\", [_tracking.tracked], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: function () {\n      return '';\n    }\n  }), _applyDecoratedDescriptor(_class.prototype, \"setPrismCode\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"setPrismCode\"), _class.prototype), _class);\n  _exports.default = CodeInlineComponent;\n  (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, CodeInlineComponent);\n});","define(\"ember-prism/index\", [\"exports\", \"prismjs-glimmer\"], function (_exports, _prismjsGlimmer) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.setup = setup;\n  0; //eaimeta@70e063a35619d71f0,\"prismjs-glimmer\"eaimeta@70e063a35619d71f\n  /* globals Prism */\n  function setup() {\n    (0, _prismjsGlimmer.setup)(Prism);\n    Prism.languages.handlebars = Prism.languages.glimmer;\n  }\n});","/*\n * This is a stub file, it must be on disk b/c babel-plugin-debug-macros\n * does not strip the module require when the transpiled variable usage is\n * stripped.\n */\ndefine(\"ember-resolver/features\", [], function () {\n  \"use strict\";\n});","define(\"ember-resolver/index\", [\"exports\", \"ember-resolver/resolvers/classic\"], function (_exports, _classic) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _classic.default;\n    }\n  });\n});","define(\"ember-resolver/resolver\", [\"exports\", \"ember-resolver/resolvers/classic\"], function (_exports, _classic) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _classic.default;\n    }\n  });\n});","define(\"ember-resolver/resolvers/classic/container-debug-adapter\", [\"exports\", \"@ember/array\", \"@ember/debug/container-debug-adapter\", \"ember-resolver/resolvers/classic/index\", \"@ember/application\"], function (_exports, _array, _containerDebugAdapter, _index, _application) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  function getPod(type, key, prefix) {\n    let match = key.match(new RegExp('^/?' + prefix + '/(.+)/' + type + '$'));\n    if (match !== null) {\n      return match[1];\n    }\n  }\n\n  /*\n   * This module defines a subclass of Ember.ContainerDebugAdapter that adds\n   * support for resolving from modules.\n   *\n   */\n\n  /* eslint-disable ember/no-classic-classes */\n  var _default = _containerDebugAdapter.default.extend({\n    _moduleRegistry: null,\n    init() {\n      this._super(...arguments);\n      this.namespace = (0, _application.getOwner)(this).lookup('application:main');\n      if (!this._moduleRegistry) {\n        this._moduleRegistry = new _index.ModuleRegistry();\n      }\n    },\n    /**\n        The container of the application being debugged.\n        This property will be injected\n        on creation.\n         @property container\n        @default null\n        */\n\n    /**\n        The resolver instance of the application\n        being debugged. This property will be injected\n        on creation.\n         @property resolver\n        @default null\n        */\n\n    /**\n        Returns true if it is possible to catalog a list of available\n        classes in the resolver for a given type.\n         @method canCatalogEntriesByType\n        @param {string} type The type. e.g. \"model\", \"controller\", \"route\"\n        @return {boolean} whether a list is available for this type.\n        */\n    canCatalogEntriesByType(type) {\n      if (type === 'model') {\n        return true;\n      }\n      return this._super(...arguments);\n    },\n    /**\n        Returns the available classes a given type.\n         @method catalogEntriesByType\n        @param {string} type The type. e.g. \"model\", \"controller\", \"route\"\n        @return {Array} An array of classes.\n        */\n    catalogEntriesByType(type) {\n      let moduleNames = this._moduleRegistry.moduleNames();\n      let types = (0, _array.A)();\n      let prefix = this.namespace.modulePrefix;\n      for (let i = 0, l = moduleNames.length; i < l; i++) {\n        let key = moduleNames[i];\n        if (key.indexOf(type) !== -1) {\n          // Check if it's a pod module\n          let name = getPod(type, key, this.namespace.podModulePrefix || prefix);\n          if (!name) {\n            // Not pod\n            name = key.split(type + 's/').pop();\n\n            // Support for different prefix (such as ember-cli addons).\n            // Uncomment the code below when\n            // https://github.com/ember-cli/ember-resolver/pull/80 is merged.\n\n            //let match = key.match('^/?(.+)/' + type);\n            //if (match && match[1] !== prefix) {\n            // Different prefix such as an addon\n            //name = match[1] + '@' + name;\n            //}\n          }\n          types.addObject(name);\n        }\n      }\n      return types;\n    }\n  });\n  _exports.default = _default;\n});","define(\"ember-resolver/resolvers/classic/index\", [\"exports\", \"ember\", \"@ember/debug\", \"@ember/object\", \"@ember/string\", \"ember-resolver/utils/class-factory\"], function (_exports, _ember, _debug, _object, _string, _classFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = _exports.ModuleRegistry = void 0;\n  /* globals requirejs, require */\n\n  /* eslint-disable ember/no-classic-classes */\n\n  if (typeof requirejs.entries === 'undefined') {\n    requirejs.entries = requirejs._eak_seen;\n  }\n  class ModuleRegistry {\n    constructor(entries) {\n      this._entries = entries || requirejs.entries;\n    }\n    moduleNames() {\n      return Object.keys(this._entries);\n    }\n    has(moduleName) {\n      return moduleName in this._entries;\n    }\n    get() {\n      return require(...arguments);\n    }\n  }\n\n  /**\n   * This module defines a subclass of Ember.DefaultResolver that adds two\n   * important features:\n   *\n   *  1) The resolver makes the container aware of es6 modules via the AMD\n   *     output. The loader's _moduleEntries is consulted so that classes can be\n   *     resolved directly via the module loader, without needing a manual\n   *     `import`.\n   *  2) is able to provide injections to classes that implement `extend`\n   *     (as is typical with Ember).\n   */\n  _exports.ModuleRegistry = ModuleRegistry;\n  function parseName(fullName) {\n    if (fullName.parsedName === true) {\n      return fullName;\n    }\n    let prefix, type, name;\n    let fullNameParts = fullName.split('@');\n    if (fullNameParts.length === 3) {\n      if (fullNameParts[0].length === 0) {\n        // leading scoped namespace: `@scope/pkg@type:name`\n        prefix = `@${fullNameParts[1]}`;\n        let prefixParts = fullNameParts[2].split(':');\n        type = prefixParts[0];\n        name = prefixParts[1];\n      } else {\n        // interweaved scoped namespace: `type:@scope/pkg@name`\n        prefix = `@${fullNameParts[1]}`;\n        type = fullNameParts[0].slice(0, -1);\n        name = fullNameParts[2];\n      }\n      if (type === 'template:components') {\n        name = `components/${name}`;\n        type = 'template';\n      }\n    } else if (fullNameParts.length === 2) {\n      let prefixParts = fullNameParts[0].split(':');\n      if (prefixParts.length === 2) {\n        if (prefixParts[1].length === 0) {\n          type = prefixParts[0];\n          name = `@${fullNameParts[1]}`;\n        } else {\n          prefix = prefixParts[1];\n          type = prefixParts[0];\n          name = fullNameParts[1];\n        }\n      } else {\n        let nameParts = fullNameParts[1].split(':');\n        prefix = fullNameParts[0];\n        type = nameParts[0];\n        name = nameParts[1];\n      }\n      if (type === 'template' && prefix.lastIndexOf('components/', 0) === 0) {\n        name = `components/${name}`;\n        prefix = prefix.slice(11);\n      }\n    } else {\n      fullNameParts = fullName.split(':');\n      type = fullNameParts[0];\n      name = fullNameParts[1];\n    }\n    let fullNameWithoutType = name;\n    let namespace = this.namespace;\n    let root = namespace;\n    return {\n      parsedName: true,\n      fullName: fullName,\n      prefix: prefix || this.prefix({\n        type: type\n      }),\n      type: type,\n      fullNameWithoutType: fullNameWithoutType,\n      name: name,\n      root: root,\n      resolveMethodName: \"resolve\" + (0, _string.classify)(type)\n    };\n  }\n  function resolveOther(parsedName) {\n    (true && !(this.namespace.modulePrefix) && (0, _debug.assert)('`modulePrefix` must be defined', this.namespace.modulePrefix));\n    let normalizedModuleName = this.findModuleName(parsedName);\n    if (normalizedModuleName) {\n      let defaultExport = this._extractDefaultExport(normalizedModuleName, parsedName);\n      if (defaultExport === undefined) {\n        throw new Error(` Expected to find: '${parsedName.fullName}' within '${normalizedModuleName}' but got 'undefined'. Did you forget to 'export default' within '${normalizedModuleName}'?`);\n      }\n      if (this.shouldWrapInClassFactory(defaultExport, parsedName)) {\n        defaultExport = (0, _classFactory.default)(defaultExport);\n      }\n      return defaultExport;\n    }\n  }\n  const Resolver = _object.default.extend({\n    resolveOther,\n    parseName,\n    pluralizedTypes: null,\n    moduleRegistry: null,\n    makeToString(factory, fullName) {\n      return '' + this.namespace.modulePrefix + '@' + fullName + ':';\n    },\n    shouldWrapInClassFactory(/* module, parsedName */\n    ) {\n      return false;\n    },\n    init() {\n      this._super();\n      this.moduleBasedResolver = true;\n      if (!this._moduleRegistry) {\n        this._moduleRegistry = new ModuleRegistry();\n      }\n      this._normalizeCache = Object.create(null);\n      this.pluralizedTypes = this.pluralizedTypes || Object.create(null);\n      if (!this.pluralizedTypes.config) {\n        this.pluralizedTypes.config = 'config';\n      }\n      this._deprecatedPodModulePrefix = false;\n\n      /**\n        A listing of functions to test for moduleName's based on the provided\n       `parsedName`. This allows easy customization of additional module based\n       lookup patterns.\n        @property moduleNameLookupPatterns\n       @returns {Ember.Array}\n      */\n      this.moduleNameLookupPatterns = [this.podBasedModuleName, this.podBasedComponentsInSubdir, this.mainModuleName, this.defaultModuleName, this.nestedColocationComponentModuleName];\n    },\n    normalize(fullName) {\n      return this._normalizeCache[fullName] || (this._normalizeCache[fullName] = this._normalize(fullName));\n    },\n    resolve(fullName) {\n      let parsedName = this.parseName(fullName);\n      let resolveMethodName = parsedName.resolveMethodName;\n      let resolved;\n      if (typeof this[resolveMethodName] === 'function') {\n        resolved = this[resolveMethodName](parsedName);\n      }\n      if (resolved == null) {\n        resolved = this.resolveOther(parsedName);\n      }\n      return resolved;\n    },\n    _normalize(fullName) {\n      // A) Convert underscores to dashes\n      // B) Convert camelCase to dash-case, except for components (their\n      //    templates) and helpers where we want to avoid shadowing camelCase\n      //    expressions\n      // C) replace `.` with `/` in order to make nested controllers work in the following cases\n      //      1. `needs: ['posts/post']`\n      //      2. `{{render \"posts/post\"}}`\n      //      3. `this.render('posts/post')` from Route\n\n      let split = fullName.split(':');\n      if (split.length > 1) {\n        let type = split[0];\n        if (type === 'component' || type === 'helper' || type === 'modifier' || type === 'template' && split[1].indexOf('components/') === 0) {\n          return type + ':' + split[1].replace(/_/g, '-');\n        } else {\n          return type + ':' + (0, _string.dasherize)(split[1].replace(/\\./g, '/'));\n        }\n      } else {\n        return fullName;\n      }\n    },\n    pluralize(type) {\n      return this.pluralizedTypes[type] || (this.pluralizedTypes[type] = type + 's');\n    },\n    podBasedLookupWithPrefix(podPrefix, parsedName) {\n      let fullNameWithoutType = parsedName.fullNameWithoutType;\n      if (parsedName.type === 'template') {\n        fullNameWithoutType = fullNameWithoutType.replace(/^components\\//, '');\n      }\n      return podPrefix + '/' + fullNameWithoutType + '/' + parsedName.type;\n    },\n    podBasedModuleName(parsedName) {\n      let podPrefix = this.namespace.podModulePrefix || this.namespace.modulePrefix;\n      return this.podBasedLookupWithPrefix(podPrefix, parsedName);\n    },\n    podBasedComponentsInSubdir(parsedName) {\n      let podPrefix = this.namespace.podModulePrefix || this.namespace.modulePrefix;\n      podPrefix = podPrefix + '/components';\n      if (parsedName.type === 'component' || /^components/.test(parsedName.fullNameWithoutType)) {\n        return this.podBasedLookupWithPrefix(podPrefix, parsedName);\n      }\n    },\n    resolveEngine(parsedName) {\n      let engineName = parsedName.fullNameWithoutType;\n      let engineModule = engineName + '/engine';\n      if (this._moduleRegistry.has(engineModule)) {\n        return this._extractDefaultExport(engineModule);\n      }\n    },\n    resolveRouteMap(parsedName) {\n      let engineName = parsedName.fullNameWithoutType;\n      let engineRoutesModule = engineName + '/routes';\n      if (this._moduleRegistry.has(engineRoutesModule)) {\n        let routeMap = this._extractDefaultExport(engineRoutesModule);\n        (true && !(routeMap.isRouteMap) && (0, _debug.assert)(`The route map for ${engineName} should be wrapped by 'buildRoutes' before exporting.`, routeMap.isRouteMap));\n        return routeMap;\n      }\n    },\n    resolveTemplate(parsedName) {\n      let resolved = this.resolveOther(parsedName);\n      if (resolved == null) {\n        resolved = _ember.default.TEMPLATES[parsedName.fullNameWithoutType];\n      }\n      return resolved;\n    },\n    mainModuleName(parsedName) {\n      if (parsedName.fullNameWithoutType === 'main') {\n        // if router:main or adapter:main look for a module with just the type first\n        return parsedName.prefix + '/' + parsedName.type;\n      }\n    },\n    defaultModuleName(parsedName) {\n      return parsedName.prefix + '/' + this.pluralize(parsedName.type) + '/' + parsedName.fullNameWithoutType;\n    },\n    nestedColocationComponentModuleName(parsedName) {\n      if (parsedName.type === 'component') {\n        return parsedName.prefix + '/' + this.pluralize(parsedName.type) + '/' + parsedName.fullNameWithoutType + '/index';\n      }\n    },\n    prefix(parsedName) {\n      let tmpPrefix = this.namespace.modulePrefix;\n      if (this.namespace[parsedName.type + 'Prefix']) {\n        tmpPrefix = this.namespace[parsedName.type + 'Prefix'];\n      }\n      return tmpPrefix;\n    },\n    findModuleName(parsedName, loggingDisabled) {\n      let moduleNameLookupPatterns = this.moduleNameLookupPatterns;\n      let moduleName;\n      for (let index = 0, length = moduleNameLookupPatterns.length; index < length; index++) {\n        let item = moduleNameLookupPatterns[index];\n        let tmpModuleName = item.call(this, parsedName);\n\n        // allow treat all dashed and all underscored as the same thing\n        // supports components with dashes and other stuff with underscores.\n        if (tmpModuleName) {\n          tmpModuleName = this.chooseModuleName(tmpModuleName, parsedName);\n        }\n        if (tmpModuleName && this._moduleRegistry.has(tmpModuleName)) {\n          moduleName = tmpModuleName;\n        }\n        if (!loggingDisabled) {\n          this._logLookup(moduleName, parsedName, tmpModuleName);\n        }\n        if (moduleName) {\n          return moduleName;\n        }\n      }\n    },\n    chooseModuleName(moduleName, parsedName) {\n      let underscoredModuleName = (0, _string.underscore)(moduleName);\n      if (moduleName !== underscoredModuleName && this._moduleRegistry.has(moduleName) && this._moduleRegistry.has(underscoredModuleName)) {\n        throw new TypeError(`Ambiguous module names: '${moduleName}' and '${underscoredModuleName}'`);\n      }\n      if (this._moduleRegistry.has(moduleName)) {\n        return moduleName;\n      } else if (this._moduleRegistry.has(underscoredModuleName)) {\n        return underscoredModuleName;\n      }\n      // workaround for dasherized partials:\n      // something/something/-something => something/something/_something\n      let partializedModuleName = moduleName.replace(/\\/-([^/]*)$/, '/_$1');\n      if (this._moduleRegistry.has(partializedModuleName)) {\n        (true && !(false) && (0, _debug.deprecate)('Modules should not contain underscores. ' + 'Attempted to lookup \"' + moduleName + '\" which ' + 'was not found. Please rename \"' + partializedModuleName + '\" ' + 'to \"' + moduleName + '\" instead.', false, {\n          id: 'ember-resolver.underscored-modules',\n          until: '3.0.0',\n          for: 'ember-resolver',\n          since: '0.1.0'\n        }));\n        return partializedModuleName;\n      }\n      if (true /* DEBUG */) {\n        let isCamelCaseHelper = parsedName.type === 'helper' && /[a-z]+[A-Z]+/.test(moduleName);\n        if (isCamelCaseHelper) {\n          this._camelCaseHelperWarnedNames = this._camelCaseHelperWarnedNames || [];\n          let alreadyWarned = this._camelCaseHelperWarnedNames.indexOf(parsedName.fullName) > -1;\n          if (!alreadyWarned && this._moduleRegistry.has((0, _string.dasherize)(moduleName))) {\n            this._camelCaseHelperWarnedNames.push(parsedName.fullName);\n            (true && (0, _debug.warn)('Attempted to lookup \"' + parsedName.fullName + '\" which ' + 'was not found. In previous versions of ember-resolver, a bug would have ' + 'caused the module at \"' + (0, _string.dasherize)(moduleName) + '\" to be ' + 'returned for this camel case helper name. This has been fixed. ' + 'Use the dasherized name to resolve the module that would have been ' + 'returned in previous versions.', false, {\n              id: 'ember-resolver.camelcase-helper-names',\n              until: '3.0.0'\n            }));\n          }\n        }\n      }\n    },\n    // used by Ember.DefaultResolver.prototype._logLookup\n    lookupDescription(fullName) {\n      let parsedName = this.parseName(fullName);\n      let moduleName = this.findModuleName(parsedName, true);\n      return moduleName;\n    },\n    // only needed until 1.6.0-beta.2 can be required\n    _logLookup(found, parsedName, description) {\n      if (!_ember.default.ENV.LOG_MODULE_RESOLVER && !parsedName.root.LOG_RESOLVER) {\n        return;\n      }\n      let padding;\n      let symbol = found ? '[✓]' : '[ ]';\n      if (parsedName.fullName.length > 60) {\n        padding = '.';\n      } else {\n        padding = new Array(60 - parsedName.fullName.length).join('.');\n      }\n      if (!description) {\n        description = this.lookupDescription(parsedName);\n      }\n\n      /* eslint-disable no-console */\n      if (console && console.info) {\n        console.info(symbol, parsedName.fullName, padding, description);\n      }\n    },\n    knownForType(type) {\n      let moduleKeys = this._moduleRegistry.moduleNames();\n      let items = Object.create(null);\n      for (let index = 0, length = moduleKeys.length; index < length; index++) {\n        let moduleName = moduleKeys[index];\n        let fullname = this.translateToContainerFullname(type, moduleName);\n        if (fullname) {\n          items[fullname] = true;\n        }\n      }\n      return items;\n    },\n    translateToContainerFullname(type, moduleName) {\n      let prefix = this.prefix({\n        type\n      });\n\n      // Note: using string manipulation here rather than regexes for better performance.\n      // pod modules\n      // '^' + prefix + '/(.+)/' + type + '$'\n      let podPrefix = prefix + '/';\n      let podSuffix = '/' + type;\n      let start = moduleName.indexOf(podPrefix);\n      let end = moduleName.indexOf(podSuffix);\n      if (start === 0 && end === moduleName.length - podSuffix.length && moduleName.length > podPrefix.length + podSuffix.length) {\n        return type + ':' + moduleName.slice(start + podPrefix.length, end);\n      }\n\n      // non-pod modules\n      // '^' + prefix + '/' + pluralizedType + '/(.+)$'\n      let pluralizedType = this.pluralize(type);\n      let nonPodPrefix = prefix + '/' + pluralizedType + '/';\n      if (moduleName.indexOf(nonPodPrefix) === 0 && moduleName.length > nonPodPrefix.length) {\n        return type + ':' + moduleName.slice(nonPodPrefix.length);\n      }\n    },\n    _extractDefaultExport(normalizedModuleName) {\n      let module = this._moduleRegistry.get(normalizedModuleName, null, null, true /* force sync */);\n      if (module && module['default']) {\n        module = module['default'];\n      }\n      return module;\n    }\n  });\n  Resolver.reopenClass({\n    moduleBasedResolver: true\n  });\n  var _default = Resolver;\n  _exports.default = _default;\n});","define(\"ember-resolver/utils/class-factory\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = classFactory;\n  function classFactory(klass) {\n    return {\n      create(injections) {\n        if (typeof klass.extend === 'function') {\n          return klass.extend(injections);\n        } else {\n          return klass;\n        }\n      }\n    };\n  }\n});","define(\"ember-simple-auth/-internals/routing\", [\"exports\", \"ember\", \"ember-simple-auth/utils/is-fastboot\", \"ember-simple-auth/utils/location\"], function (_exports, _ember, _isFastboot, _location) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.handleSessionAuthenticated = handleSessionAuthenticated;\n  _exports.handleSessionInvalidated = handleSessionInvalidated;\n  _exports.prohibitAuthentication = prohibitAuthentication;\n  _exports.requireAuthentication = requireAuthentication;\n  _exports.triggerAuthentication = triggerAuthentication;\n  function requireAuthentication(owner, transition) {\n    let sessionService = owner.lookup('service:session');\n    let isAuthenticated = sessionService.get('isAuthenticated');\n    if (!isAuthenticated) {\n      if (transition && (0, _isFastboot.default)(owner)) {\n        const fastbootService = owner.lookup('service:fastboot');\n        const cookiesService = owner.lookup('service:cookies');\n        cookiesService.write('ember_simple_auth-redirectTarget', transition.intent.url, {\n          path: '/',\n          secure: fastbootService.get('request.protocol') === 'https'\n        });\n      } else if (transition) {\n        sessionService.set('attemptedTransition', transition);\n      }\n    }\n    return isAuthenticated;\n  }\n  function triggerAuthentication(owner, authenticationRoute) {\n    let authRouter = owner.lookup('service:router') || owner.lookup('router:main');\n    authRouter.transitionTo(authenticationRoute);\n  }\n  function prohibitAuthentication(owner, routeIfAlreadyAuthenticated) {\n    let authRouter = owner.lookup('service:router') || owner.lookup('router:main');\n    authRouter.transitionTo(routeIfAlreadyAuthenticated);\n  }\n  function handleSessionAuthenticated(owner, routeAfterAuthentication) {\n    let sessionService = owner.lookup('service:session');\n    let attemptedTransition = sessionService.get('attemptedTransition');\n    let cookiesService = owner.lookup('service:cookies');\n    const redirectTarget = cookiesService.read('ember_simple_auth-redirectTarget');\n    let routerService = owner.lookup('service:router');\n    if (attemptedTransition) {\n      attemptedTransition.retry();\n      sessionService.set('attemptedTransition', null);\n    } else if (redirectTarget) {\n      routerService.transitionTo(redirectTarget);\n      cookiesService.clear('ember_simple_auth-redirectTarget');\n    } else {\n      routerService.transitionTo(routeAfterAuthentication);\n    }\n  }\n  function handleSessionInvalidated(owner, routeAfterInvalidation) {\n    if ((0, _isFastboot.default)(owner)) {\n      let routerService = owner.lookup('service:router');\n      routerService.transitionTo(routeAfterInvalidation);\n    } else {\n      if (!_ember.default.testing) {\n        (0, _location.default)().replace(routeAfterInvalidation);\n      }\n    }\n  }\n});","define(\"ember-simple-auth/authenticators/base\", [\"exports\", \"rsvp\", \"@ember/object/evented\", \"@ember/object\"], function (_exports, _rsvp, _evented, _object) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n    The base class for all authenticators. __This serves as a starting point for\n    implementing custom authenticators and must not be used directly.__\n  \n    The authenticator authenticates the session. The actual mechanism used to do\n    this might, e.g., post a set of credentials to a server and in exchange\n    retrieve an access token, initiating authentication against an external\n    provider like Facebook, etc. The details depend on the specific authenticator.\n    Upon successful authentication, any data that the authenticator receives and\n    resolves via the promise returned from the\n    {{#crossLink \"BaseAuthenticator/authenticate:method\"}}{{/crossLink}}\n    method is stored in the session and can be accessed via the session service\n    to be used by the authorizer (see\n    {{#crossLink \"BaseAuthorizer/authorize:method\"}}{{/crossLink}}) to e.g.,\n    authorize outgoing requests.\n  \n    The authenticator also decides whether a set of data that was restored from\n    the session store (see\n    {{#crossLink \"BaseStore/restore:method\"}}{{/crossLink}}) makes up an\n    authenticated session or not.\n  \n    __Authenticators for an application are defined in the `app/authenticators`\n    directory__, e.g.:\n  \n    ```js\n    // app/authenticators/oauth2.js\n    import OAuth2PasswordGrantAuthenticator from 'ember-simple-auth/authenticators/oauth2-password-grant';\n  \n    export default class OAuth2Authenticator extends OAuth2PasswordGrantAuthenticator {\n      ...\n    }\n    ```\n  \n    and can then be used via the name Ember CLI automatically registers for them\n    within the Ember container.\n  \n    ```js\n    // app/components/login-form.js\n    import Component from '@ember/component';\n    import { inject as service } from '@ember/service';\n    import { action } from '@ember/object';\n  \n    export default class LoginFormComponent extends Component {\n      @service session;\n  \n      @action\n      authenticate() {\n        this.session.authenticate('authenticator:oauth2');\n      }\n    }\n    ```\n  \n    @class BaseAuthenticator\n    @module ember-simple-auth/authenticators/base\n    @extends Ember.Object\n    @uses Ember.Evented\n    @public\n  */\n  var _default = _object.default.extend(_evented.default, {\n    /**\n      __Triggered when the authentication data is updated by the authenticator\n      due to an external or scheduled event__. This might happen, e.g., if the\n      authenticator refreshes an expired token or an event is triggered from an\n      external authentication provider that the authenticator uses. The session\n      handles that event, passes the updated data back to the authenticator's\n      {{#crossLink \"BaseAuthenticator/restore:method\"}}{{/crossLink}}\n      method and handles the result of that invocation accordingly.\n       @event sessionDataUpdated\n      @param {Object} data The updated session data\n      @public\n    */\n\n    /**\n      __Triggered when the authentication data is invalidated by the authenticator\n      due to an external or scheduled event__. This might happen, e.g., if a token\n      expires or an event is triggered from an external authentication provider\n      that the authenticator uses. The session handles the event and will\n      invalidate itself when it is triggered.\n       @event sessionDataInvalidated\n      @public\n    */\n\n    /**\n      Restores the session from a session data object. __This method is invoked\n      by the session either on application startup if session data is restored\n      from the session store__ or when properties in the store change due to\n      external events (e.g. in another tab) and the new session data needs to be\n      validated for whether it constitutes an authenticated session.\n       __This method returns a promise. A resolving promise results in the session\n      becoming or remaining authenticated.__ Any data the promise resolves with\n      will be saved in and accessible via the session service's\n      `data.authenticated` property (see\n      {{#crossLink \"SessionService/data:property\"}}{{/crossLink}}). A rejecting\n      promise indicates that `data` does not constitute a valid session and will\n      result in the session being invalidated or remaining unauthenticated.\n       The `BaseAuthenticator`'s implementation always returns a rejecting\n      promise. __This method must be overridden in subclasses.__\n       @method restore\n      @param {Object} data The data to restore the session from\n      @return {Ember.RSVP.Promise} A promise that when it resolves results in the session becoming or remaining authenticated\n      @public\n    */\n    restore() {\n      return _rsvp.default.reject();\n    },\n    /**\n      Authenticates the session with the specified `args`. These options vary\n      depending on the actual authentication mechanism the authenticator\n      implements (e.g. a set of credentials or a Facebook account id etc.). __The\n      session will invoke this method in order to authenticate itself__ (see\n      {{#crossLink \"SessionService/authenticate:method\"}}{{/crossLink}}).\n       __This method returns a promise. A resolving promise will result in the\n      session becoming authenticated.__ Any data the promise resolves with will\n      be saved in and accessible via the session service's `data.authenticated`\n      property (see {{#crossLink \"SessionService/data:property\"}}{{/crossLink}}).\n      A rejecting promise indicates that authentication failed and will result in\n      the session remaining unauthenticated.\n       The `BaseAuthenticator`'s implementation always returns a rejecting promise\n      and thus never authenticates the session. __This method must be overridden\n      in subclasses__.\n       @method authenticate\n      @param {Any} [...args] The arguments that the authenticator requires to authenticate the session\n      @return {Ember.RSVP.Promise} A promise that when it resolves results in the session becoming authenticated\n      @public\n    */\n    authenticate() {\n      return _rsvp.default.reject();\n    },\n    /**\n      This method is invoked as a callback when the session is invalidated. While\n      the session will invalidate itself and clear all authenticated session data,\n      it might be necessary for some authenticators to perform additional tasks\n      (e.g. invalidating an access token on the server side).\n       __This method returns a promise. A resolving promise will result in the\n      session becoming unauthenticated.__ A rejecting promise will result in\n      invalidation being intercepted and the session remaining authenticated.\n       The `BaseAuthenticator`'s implementation always returns a resolving promise\n      and thus never intercepts session invalidation. __This method doesn't have\n      to be overridden in custom authenticators__ if no actions need to be\n      performed on session invalidation.\n       @method invalidate\n      @param {Object} data The current authenticated session data\n      @param {Array} ...args additional arguments as required by the authenticator\n      @return {Ember.RSVP.Promise} A promise that when it resolves results in the session being invalidated\n      @public\n    */\n    invalidate() {\n      return _rsvp.default.resolve();\n    }\n  });\n  _exports.default = _default;\n});","define(\"ember-simple-auth/authenticators/devise\", [\"exports\", \"rsvp\", \"@ember/utils\", \"@ember/runloop\", \"ember-simple-auth/utils/assign\", \"ember-simple-auth/authenticators/base\", \"fetch\"], function (_exports, _rsvp, _utils, _runloop, _assign, _base, _fetch) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const JSON_CONTENT_TYPE = 'application/json';\n\n  /**\n    Authenticator that works with the Ruby gem\n    [devise](https://github.com/plataformatec/devise).\n  \n    __As token authentication is not actually part of devise anymore, the server\n    needs to implement some customizations__ to work with this authenticator -\n    see [this gist](https://gist.github.com/josevalim/fb706b1e933ef01e4fb6).\n  \n    @class DeviseAuthenticator\n    @module ember-simple-auth/authenticators/devise\n    @extends BaseAuthenticator\n    @public\n  */\n  var _default = _base.default.extend({\n    /**\n      The endpoint on the server that the authentication request is sent to.\n       @property serverTokenEndpoint\n      @type String\n      @default '/users/sign_in'\n      @public\n    */\n    serverTokenEndpoint: '/users/sign_in',\n    /**\n      The devise resource name. __This will be used in the request and also be\n      expected in the server's response.__\n       @property resourceName\n      @type String\n      @default 'user'\n      @public\n    */\n    resourceName: 'user',\n    /**\n      The token attribute name. __This will be used in the request and also be\n      expected in the server's response.__\n       @property tokenAttributeName\n      @type String\n      @default 'token'\n      @public\n    */\n    tokenAttributeName: 'token',\n    /**\n      The identification attribute name. __This will be used in the request and\n      also be expected in the server's response.__\n       @property identificationAttributeName\n      @type String\n      @default 'email'\n      @public\n    */\n    identificationAttributeName: 'email',\n    /**\n      Restores the session from a session data object; __returns a resolving\n      promise when there are non-empty\n      {{#crossLink \"DeviseAuthenticator/tokenAttributeName:property\"}}token{{/crossLink}}\n      and\n      {{#crossLink \"DeviseAuthenticator/identificationAttributeName:property\"}}identification{{/crossLink}}\n      values in `data`__ and a rejecting promise otherwise.\n       @method restore\n      @param {Object} data The data to restore the session from\n      @return {Ember.RSVP.Promise} A promise that when it resolves results in the session becoming or remaining authenticated\n      @public\n    */\n    restore(data) {\n      // eslint-disable-next-line prefer-promise-reject-errors\n      return this._validate(data) ? _rsvp.Promise.resolve(data) : _rsvp.Promise.reject();\n    },\n    /**\n      Authenticates the session with the specified `identification` and\n      `password`; the credentials are `POST`ed to the\n      {{#crossLink \"DeviseAuthenticator/serverTokenEndpoint:property\"}}server{{/crossLink}}.\n      If the credentials are valid the server will responds with a\n      {{#crossLink \"DeviseAuthenticator/tokenAttributeName:property\"}}token{{/crossLink}}\n      and\n      {{#crossLink \"DeviseAuthenticator/identificationAttributeName:property\"}}identification{{/crossLink}}.\n      __If the credentials are valid and authentication succeeds, a promise that\n      resolves with the server's response is returned__, otherwise a promise that\n      rejects with the server error is returned.\n       @method authenticate\n      @param {String} identification The user's identification\n      @param {String} password The user's password\n      @return {Ember.RSVP.Promise} A promise that when it resolves results in the session becoming authenticated. If authentication fails, the promise will reject with the server response; however, the authenticator reads that response already so if you need to read it again you need to clone the response object first\n      @public\n    */\n    authenticate(identification, password) {\n      return new _rsvp.Promise((resolve, reject) => {\n        const {\n          resourceName,\n          identificationAttributeName,\n          tokenAttributeName\n        } = this.getProperties('resourceName', 'identificationAttributeName', 'tokenAttributeName');\n        const data = {};\n        data[resourceName] = {\n          password\n        };\n        data[resourceName][identificationAttributeName] = identification;\n        this.makeRequest(data).then(response => {\n          if (response.ok) {\n            response.json().then(json => {\n              if (this._validate(json)) {\n                const resourceName = this.get('resourceName');\n                const _json = json[resourceName] ? json[resourceName] : json;\n                (0, _runloop.run)(null, resolve, _json);\n              } else {\n                (0, _runloop.run)(null, reject, `Check that server response includes ${tokenAttributeName} and ${identificationAttributeName}`);\n              }\n            });\n          } else {\n            (0, _runloop.run)(null, reject, response);\n          }\n        }).catch(error => (0, _runloop.run)(null, reject, error));\n      });\n    },\n    /**\n      Does nothing\n       @method invalidate\n      @return {Ember.RSVP.Promise} A resolving promise\n      @public\n    */\n    invalidate() {\n      return _rsvp.Promise.resolve();\n    },\n    /**\n      Makes a request to the Devise server using\n      [ember-fetch](https://github.com/stefanpenner/ember-fetch).\n       @method makeRequest\n      @param {Object} data The request data\n      @param {Object} options request options that are passed to `fetch`\n      @return {Promise} The promise returned by `fetch`\n      @protected\n    */\n    makeRequest(data) {\n      let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      let url = options.url || this.get('serverTokenEndpoint');\n      let requestOptions = {};\n      let body = JSON.stringify(data);\n      (0, _assign.default)(requestOptions, {\n        body,\n        method: 'POST',\n        headers: {\n          'accept': JSON_CONTENT_TYPE,\n          'content-type': JSON_CONTENT_TYPE\n        }\n      });\n      (0, _assign.default)(requestOptions, options || {});\n      return (0, _fetch.default)(url, requestOptions);\n    },\n    _validate(data) {\n      const tokenAttributeName = this.get('tokenAttributeName');\n      const identificationAttributeName = this.get('identificationAttributeName');\n      const resourceName = this.get('resourceName');\n      const _data = data[resourceName] ? data[resourceName] : data;\n      return !(0, _utils.isEmpty)(_data[tokenAttributeName]) && !(0, _utils.isEmpty)(_data[identificationAttributeName]);\n    }\n  });\n  _exports.default = _default;\n});","define(\"ember-simple-auth/authenticators/oauth2-implicit-grant\", [\"exports\", \"rsvp\", \"@ember/utils\", \"ember-simple-auth/authenticators/base\"], function (_exports, _rsvp, _utils, _base) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.parseResponse = parseResponse;\n  /**\n    Parses the location hash (as received from `window.location.hash`) into an\n    object, e.g.:\n  \n    ```js\n    parseResponse('/routepath#access_token=secret-token&scope=something'); // => { access_token: 'secret-token', scope: 'something' }\n    ```\n  \n    @function parseResponse\n    @param {String} locationHash The location hash (as received from `window.location.hash`)\n    @return {Object} An obect with individual properties and values for the data parsed from the location hash\n  */\n  function parseResponse(locationHash) {\n    let params = {};\n    const query = locationHash.substring(locationHash.indexOf('?'));\n    const regex = /([^#?&=]+)=([^&]*)/g;\n    let match;\n\n    // decode all parameter pairs\n    while ((match = regex.exec(query)) !== null) {\n      params[decodeURIComponent(match[1])] = decodeURIComponent(match[2]);\n    }\n    return params;\n  }\n\n  /**\n   Authenticator that conforms to OAuth 2\n   ([RFC 6749](http://tools.ietf.org/html/rfc6749)), specifically the _\"Implicit\n   Grant Type\"_.\n  \n   Use {{#crossLink \"OAuth2ImplicitGrantCallbackMixin\"}}{{/crossLink}} in your\n   OAuth 2.0 redirect route to parse authentication parameters from location\n   hash string into an object.\n  \n   @class OAuth2ImplicitGrantAuthenticator\n   @module ember-simple-auth/authenticators/oauth2-implicit-grant\n   @extends BaseAuthenticator\n   @public\n   */\n  var _default = _base.default.extend({\n    /**\n     Restores the session from a session data object; __will return a resolving\n     promise when there is a non-empty `access_token` in the session data__ and\n     a rejecting promise otherwise.\n      @method restore\n     @param {Object} data The data to restore the session from\n     @return {Ember.RSVP.Promise} A promise that when it resolves results in the session becoming or remaining authenticated\n     @public\n     */\n    restore(data) {\n      return new _rsvp.default.Promise((resolve, reject) => {\n        if (!this._validateData(data)) {\n          return reject('Could not restore session - \"access_token\" missing.');\n        }\n        return resolve(data);\n      });\n    },\n    /**\n     Authenticates the session using the specified location `hash`\n     (see https://tools.ietf.org/html/rfc6749#section-4.2.2).\n      __If the access token is valid and thus authentication succeeds, a promise that\n     resolves with the access token is returned__, otherwise a promise that rejects\n     with the error code as returned by the server is returned\n     (see https://tools.ietf.org/html/rfc6749#section-4.2.2.1).\n      @method authenticate\n     @param {Object} hash The location hash\n     @return {Ember.RSVP.Promise} A promise that when it resolves results in the session becoming authenticated\n     @public\n     */\n    authenticate(hash) {\n      return new _rsvp.default.Promise((resolve, reject) => {\n        if (hash.error) {\n          reject(hash.error);\n        } else if (!this._validateData(hash)) {\n          reject('Invalid auth params - \"access_token\" missing.');\n        } else {\n          resolve(hash);\n        }\n      });\n    },\n    /**\n     This method simply returns a resolving promise.\n      @method invalidate\n     @return {Ember.RSVP.Promise} A promise that when it resolves results in the session being invalidated\n     @public\n     */\n    invalidate() {\n      return _rsvp.default.Promise.resolve();\n    },\n    _validateData(data) {\n      // see https://tools.ietf.org/html/rfc6749#section-4.2.2\n\n      return !(0, _utils.isEmpty)(data) && !(0, _utils.isEmpty)(data.access_token);\n    }\n  });\n  _exports.default = _default;\n});","define(\"ember-simple-auth/authenticators/oauth2-password-grant\", [\"exports\", \"rsvp\", \"@ember/utils\", \"@ember/runloop\", \"@ember/array\", \"@ember/debug\", \"@ember/application\", \"ember-simple-auth/utils/assign\", \"ember\", \"ember-simple-auth/authenticators/base\", \"fetch\", \"ember-simple-auth/utils/is-fastboot\"], function (_exports, _rsvp, _utils, _runloop, _array, _debug, _application, _assign, _ember, _base, _fetch, _isFastboot) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n    Authenticator that conforms to OAuth 2\n    ([RFC 6749](http://tools.ietf.org/html/rfc6749)), specifically the _\"Resource\n    Owner Password Credentials Grant Type\"_.\n  \n    This authenticator also automatically refreshes access tokens (see\n    [RFC 6749, section 6](http://tools.ietf.org/html/rfc6749#section-6)) if the\n    server supports it.\n  \n    @class OAuth2PasswordGrantAuthenticator\n    @module ember-simple-auth/authenticators/oauth2-password-grant\n    @extends BaseAuthenticator\n    @public\n  */\n  var _default = _base.default.extend({\n    /**\n      Triggered when the authenticator refreshed the access token (see\n      [RFC 6749, section 6](http://tools.ietf.org/html/rfc6749#section-6)).\n       @event sessionDataUpdated\n      @param {Object} data The updated session data\n      @public\n    */\n\n    /**\n      The client_id to be sent to the authentication server (see\n      https://tools.ietf.org/html/rfc6749#appendix-A.1). __This should only be\n      used for statistics or logging etc. as it cannot actually be trusted since\n      it could have been manipulated on the client!__\n       @property clientId\n      @type String\n      @default null\n      @public\n    */\n    clientId: null,\n    /**\n      The endpoint on the server that authentication and token refresh requests\n      are sent to.\n       @property serverTokenEndpoint\n      @type String\n      @default '/token'\n      @public\n    */\n    serverTokenEndpoint: '/token',\n    /**\n      The endpoint on the server that token revocation requests are sent to. Only\n      set this if the server actually supports token revocation. If this is\n      `null`, the authenticator will not revoke tokens on session invalidation.\n       __If token revocation is enabled but fails, session invalidation will be\n      intercepted and the session will remain authenticated (see\n      {{#crossLink \"OAuth2PasswordGrantAuthenticator/invalidate:method\"}}{{/crossLink}}).__\n       @property serverTokenRevocationEndpoint\n      @type String\n      @default null\n      @public\n    */\n    serverTokenRevocationEndpoint: null,\n    /**\n      Sets whether the authenticator automatically refreshes access tokens if the\n      server supports it.\n       @property refreshAccessTokens\n      @type Boolean\n      @default true\n      @public\n    */\n    refreshAccessTokens: true,\n    /**\n      The offset time in milliseconds to refresh the access token. This must\n      return a random number. This randomization is needed because in case of\n      multiple tabs, we need to prevent the tabs from sending refresh token\n      request at the same exact moment.\n       __When overriding this property, make sure to mark the overridden property\n      as volatile so it will actually have a different value each time it is\n      accessed.__\n       @property tokenRefreshOffset\n      @type Integer\n      @default a random number between 5 and 10\n      @public\n    */\n    get tokenRefreshOffset() {\n      const min = 5;\n      const max = 10;\n      return (Math.floor(Math.random() * (max - min)) + min) * 1000;\n    },\n    _refreshTokenTimeout: null,\n    /**\n      Restores the session from a session data object; __will return a resolving\n      promise when there is a non-empty `access_token` in the session data__ and\n      a rejecting promise otherwise.\n       If the server issues\n      [expiring access tokens](https://tools.ietf.org/html/rfc6749#section-5.1)\n      and there is an expired access token in the session data along with a\n      refresh token, the authenticator will try to refresh the access token and\n      return a promise that resolves with the new access token if the refresh was\n      successful. If there is no refresh token or the token refresh is not\n      successful, a rejecting promise will be returned.\n       @method restore\n      @param {Object} data The data to restore the session from\n      @return {Ember.RSVP.Promise} A promise that when it resolves results in the session becoming or remaining authenticated. If restoration fails, the promise will reject with the server response (in case the access token had expired and was refreshed using a refresh token); however, the authenticator reads that response already so if you need to read it again you need to clone the response object first\n      @public\n    */\n    restore(data) {\n      return new _rsvp.default.Promise((resolve, reject) => {\n        const now = new Date().getTime();\n        const refreshAccessTokens = this.get('refreshAccessTokens');\n        if (!(0, _utils.isEmpty)(data['expires_at']) && data['expires_at'] < now) {\n          if (refreshAccessTokens) {\n            this._refreshAccessToken(data['expires_in'], data['refresh_token']).then(resolve, reject);\n          } else {\n            reject();\n          }\n        } else {\n          if (!this._validate(data)) {\n            reject();\n          } else {\n            this._scheduleAccessTokenRefresh(data['expires_in'], data['expires_at'], data['refresh_token']);\n            resolve(data);\n          }\n        }\n      });\n    },\n    /**\n      Authenticates the session with the specified `identification`, `password`\n      and optional `scope`; issues a `POST` request to the\n      {{#crossLink \"OAuth2PasswordGrantAuthenticator/serverTokenEndpoint:property\"}}{{/crossLink}}\n      and receives the access token in response (see\n      http://tools.ietf.org/html/rfc6749#section-4.3).\n       __If the credentials are valid (and the optionally requested scope is\n      granted) and thus authentication succeeds, a promise that resolves with the\n      server's response is returned__, otherwise a promise that rejects with the\n      error as returned by the server is returned.\n       __If the\n      [server supports it](https://tools.ietf.org/html/rfc6749#section-5.1), this\n      method also schedules refresh requests for the access token before it\n      expires.__\n       The server responses are expected to look as defined in the spec (see\n      http://tools.ietf.org/html/rfc6749#section-5). The response to a successful\n      authentication request should be:\n       ```json\n      HTTP/1.1 200 OK\n      Content-Type: application/json;charset=UTF-8\n       {\n        \"access_token\":\"2YotnFZFEjr1zCsicMWpAA\",\n        \"token_type\":\"bearer\",\n        \"expires_in\":3600, // optional\n        \"refresh_token\":\"tGzv3JOkF0XG5Qx2TlKWIA\" // optional\n      }\n      ```\n       The response for a failing authentication request should be:\n       ```json\n      HTTP/1.1 400 Bad Request\n      Content-Type: application/json;charset=UTF-8\n       {\n        \"error\":\"invalid_grant\"\n      }\n      ```\n       A full list of error codes can be found\n      [here](https://tools.ietf.org/html/rfc6749#section-5.2).\n       @method authenticate\n      @param {String} identification The resource owner username\n      @param {String} password The resource owner password\n      @param {String|Array} scope The scope of the access request (see [RFC 6749, section 3.3](http://tools.ietf.org/html/rfc6749#section-3.3))\n      @param {Object} headers Optional headers that particular backends may require (for example sending 2FA challenge responses)\n      @return {Ember.RSVP.Promise} A promise that when it resolves results in the session becoming authenticated. If authentication fails, the promise will reject with the server response; however, the authenticator reads that response already so if you need to read it again you need to clone the response object first\n      @public\n    */\n    authenticate(identification, password) {\n      let scope = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n      let headers = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n      return new _rsvp.default.Promise((resolve, reject) => {\n        const data = {\n          'grant_type': 'password',\n          username: identification,\n          password\n        };\n        const serverTokenEndpoint = this.get('serverTokenEndpoint');\n        const scopesString = (0, _array.makeArray)(scope).join(' ');\n        if (!(0, _utils.isEmpty)(scopesString)) {\n          data.scope = scopesString;\n        }\n        this.makeRequest(serverTokenEndpoint, data, headers).then(response => {\n          (0, _runloop.run)(() => {\n            if (!this._validate(response)) {\n              reject('access_token is missing in server response');\n            }\n            const expiresAt = this._absolutizeExpirationTime(response['expires_in']);\n            this._scheduleAccessTokenRefresh(response['expires_in'], expiresAt, response['refresh_token']);\n            if (!(0, _utils.isEmpty)(expiresAt)) {\n              response = (0, _assign.default)(response, {\n                'expires_at': expiresAt\n              });\n            }\n            resolve(response);\n          });\n        }, response => {\n          (0, _runloop.run)(null, reject, response);\n        });\n      });\n    },\n    /**\n      If token revocation is enabled, this will revoke the access token (and the\n      refresh token if present). If token revocation succeeds, this method\n      returns a resolving promise, otherwise it will return a rejecting promise,\n      thus intercepting session invalidation.\n       If token revocation is not enabled this method simply returns a resolving\n      promise.\n       @method invalidate\n      @param {Object} data The current authenticated session data\n      @return {Ember.RSVP.Promise} A promise that when it resolves results in the session being invalidated. If invalidation fails, the promise will reject with the server response (in case token revocation is used); however, the authenticator reads that response already so if you need to read it again you need to clone the response object first\n      @public\n    */\n    invalidate(data) {\n      const serverTokenRevocationEndpoint = this.get('serverTokenRevocationEndpoint');\n      function success(resolve) {\n        (0, _runloop.cancel)(this._refreshTokenTimeout);\n        delete this._refreshTokenTimeout;\n        resolve();\n      }\n      return new _rsvp.default.Promise(resolve => {\n        if ((0, _utils.isEmpty)(serverTokenRevocationEndpoint)) {\n          success.apply(this, [resolve]);\n        } else {\n          const requests = [];\n          (0, _array.A)(['access_token', 'refresh_token']).forEach(tokenType => {\n            const token = data[tokenType];\n            if (!(0, _utils.isEmpty)(token)) {\n              requests.push(this.makeRequest(serverTokenRevocationEndpoint, {\n                'token_type_hint': tokenType,\n                token\n              }));\n            }\n          });\n          const succeed = () => {\n            success.apply(this, [resolve]);\n          };\n          _rsvp.default.all(requests).then(succeed, succeed);\n        }\n      });\n    },\n    /**\n      Makes a request to the OAuth 2.0 server.\n       @method makeRequest\n      @param {String} url The request URL\n      @param {Object} data The request data\n      @param {Object} headers Additional headers to send in request\n      @return {Promise} A promise that resolves with the response object\n      @protected\n    */\n    makeRequest(url, data) {\n      let headers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      headers['Content-Type'] = 'application/x-www-form-urlencoded';\n      const clientId = this.get('clientId');\n      if (!(0, _utils.isEmpty)(clientId)) {\n        data['client_id'] = this.get('clientId');\n      }\n      const body = Object.keys(data).map(key => {\n        return `${encodeURIComponent(key)}=${encodeURIComponent(data[key])}`;\n      }).join('&');\n      const options = {\n        body,\n        headers,\n        method: 'POST'\n      };\n      return new _rsvp.default.Promise((resolve, reject) => {\n        (0, _fetch.default)(url, options).then(response => {\n          response.text().then(text => {\n            try {\n              let json = JSON.parse(text);\n              if (!response.ok) {\n                response.responseJSON = json;\n                reject(response);\n              } else {\n                resolve(json);\n              }\n            } catch (SyntaxError) {\n              response.responseText = text;\n              reject(response);\n            }\n          });\n        }).catch(reject);\n      });\n    },\n    _scheduleAccessTokenRefresh(expiresIn, expiresAt, refreshToken) {\n      const refreshAccessTokens = this.get('refreshAccessTokens') && !(0, _isFastboot.default)((0, _application.getOwner)(this));\n      if (refreshAccessTokens) {\n        const now = new Date().getTime();\n        if ((0, _utils.isEmpty)(expiresAt) && !(0, _utils.isEmpty)(expiresIn)) {\n          expiresAt = new Date(now + expiresIn * 1000).getTime();\n        }\n        const offset = this.get('tokenRefreshOffset');\n        if (!(0, _utils.isEmpty)(refreshToken) && !(0, _utils.isEmpty)(expiresAt) && expiresAt > now - offset) {\n          (0, _runloop.cancel)(this._refreshTokenTimeout);\n          delete this._refreshTokenTimeout;\n          if (!_ember.default.testing) {\n            this._refreshTokenTimeout = (0, _runloop.later)(this, this._refreshAccessToken, expiresIn, refreshToken, expiresAt - now - offset);\n          }\n        }\n      }\n    },\n    _refreshAccessToken(expiresIn, refreshToken) {\n      const data = {\n        'grant_type': 'refresh_token',\n        'refresh_token': refreshToken\n      };\n      const serverTokenEndpoint = this.get('serverTokenEndpoint');\n      return new _rsvp.default.Promise((resolve, reject) => {\n        this.makeRequest(serverTokenEndpoint, data).then(response => {\n          (0, _runloop.run)(() => {\n            expiresIn = response['expires_in'] || expiresIn;\n            refreshToken = response['refresh_token'] || refreshToken;\n            const expiresAt = this._absolutizeExpirationTime(expiresIn);\n            const data = (0, _assign.default)(response, {\n              'expires_in': expiresIn,\n              'expires_at': expiresAt,\n              'refresh_token': refreshToken\n            });\n            this._scheduleAccessTokenRefresh(expiresIn, null, refreshToken);\n            this.trigger('sessionDataUpdated', data);\n            resolve(data);\n          });\n        }, response => {\n          (true && (0, _debug.warn)(`Access token could not be refreshed - server responded with ${response.responseJSON}.`, false, {\n            id: 'ember-simple-auth.failedOAuth2TokenRefresh'\n          }));\n          reject();\n        });\n      });\n    },\n    _absolutizeExpirationTime(expiresIn) {\n      if (!(0, _utils.isEmpty)(expiresIn)) {\n        return new Date(new Date().getTime() + expiresIn * 1000).getTime();\n      }\n    },\n    _validate(data) {\n      return !(0, _utils.isEmpty)(data['access_token']);\n    }\n  });\n  _exports.default = _default;\n});","define(\"ember-simple-auth/authenticators/test\", [\"exports\", \"rsvp\", \"ember-simple-auth/authenticators/base\"], function (_exports, _rsvp, _base) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = _base.default.extend({\n    restore(data) {\n      return _rsvp.default.resolve(data);\n    },\n    authenticate(data) {\n      return _rsvp.default.resolve(data);\n    },\n    invalidate() {\n      return _rsvp.default.resolve();\n    }\n  });\n  _exports.default = _default;\n});","define(\"ember-simple-auth/authenticators/torii\", [\"exports\", \"rsvp\", \"@ember/debug\", \"@ember/utils\", \"ember-simple-auth/utils/assign\", \"ember-simple-auth/authenticators/base\"], function (_exports, _rsvp, _debug, _utils, _assign, _base) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  (true && !(false) && (0, _debug.deprecate)('Ember Simple Auth: The Torii authenticator is deprecated.', false, {\n    id: 'ember-simple-auth.authenticators.torii',\n    until: '5.0.0',\n    for: 'ember-simple-auth',\n    since: {\n      enabled: '4.2.0'\n    }\n  }));\n  /**\n    Authenticator that wraps the\n    [Torii library](https://github.com/Vestorly/torii) and thus allows to connect\n    any external authentication provider that torii defines a provider for.\n  \n    In order to use this authenticator, __the application needs to have the\n    [torii addon](https://github.com/Vestorly/torii) installed and must inject\n    the torii service into the authenticator__:\n  \n    ```js\n    // app/authenticators/torii.js\n    import Torii from 'ember-simple-auth/authenticators/torii';\n    import { inject as service } from '@ember/service';\n  \n    export default class ToriiAuthenticator extends Torii {\n      @service torii;\n    }\n    ```\n  \n    @class ToriiAuthenticator\n    @deprecated Implement an authenticator that wraps Torii in application code instead\n    @module ember-simple-auth/authenticators/torii\n    @extends BaseAuthenticator\n    @public\n  */\n  var _default = _base.default.extend({\n    _provider: null,\n    /**\n      Restores the session by calling the torii provider's `fetch` method.\n       __Many torii providers do not implement the `fetch` method__. If the\n      provider in use does not implement the method simply add it as follows:\n       ```js\n      // app/torii-providers/facebook.js\n      import FacebookOauth2Provider from 'torii/providers/facebook-oauth2';\n       export default class FacebookToriiProvider extends FacebookOauth2Provider {\n        fetch(data) {\n          return data;\n        }\n      }\n      ```\n       @method restore\n      @param {Object} data The data to restore the session from\n      @return {Ember.RSVP.Promise} A promise that when it resolves results in the session becoming or remaining authenticated\n      @public\n    */\n    restore(data) {\n      this._assertToriiIsPresent();\n      data = data || {};\n      if (!(0, _utils.isEmpty)(data.provider)) {\n        const {\n          provider\n        } = data;\n        return this.get('torii').fetch(data.provider, data).then(fetchedData => {\n          this._authenticateWithProvider(provider, fetchedData);\n          return (0, _assign.default)(data, fetchedData);\n        }, err => {\n          delete this._provider;\n          throw err;\n        });\n      } else {\n        delete this._provider;\n        return _rsvp.default.reject();\n      }\n    },\n    /**\n      Authenticates the session by opening the specified torii provider. For more\n      documentation on torii and its providers abstraction, see the\n      [project's README](https://github.com/Vestorly/torii#readme), specifically\n      the\n      [section on providers](https://github.com/Vestorly/torii#configuring-a-torii-provider).\n       @method authenticate\n      @param {String} provider The torii provider to authenticate the session with\n      @param {Object} options The options to pass to the torii provider\n      @return {Ember.RSVP.Promise} A promise that when it resolves results in the session becoming authenticated\n      @public\n    */\n    authenticate(provider, options) {\n      this._assertToriiIsPresent();\n      return this.get('torii').open(provider, options || {}).then(data => {\n        this._authenticateWithProvider(provider, data);\n        return data;\n      });\n    },\n    /**\n      Closes the torii provider. If the provider is successfully closed, this\n      method returns a resolving promise, otherwise it will return a rejecting\n      promise, thus intercepting session invalidation.\n       @method invalidate\n      @return {Ember.RSVP.Promise} A promise that when it resolves results in the session being invalidated\n      @public\n    */\n    invalidate(data) {\n      return this.get('torii').close(this._provider, data).then(() => {\n        delete this._provider;\n      });\n    },\n    _authenticateWithProvider(provider, data) {\n      data.provider = provider;\n      this._provider = data.provider;\n    },\n    _assertToriiIsPresent() {\n      const torii = this.get('torii');\n      (true && !((0, _utils.isPresent)(torii)) && (0, _debug.assert)('You are trying to use the torii authenticator but torii is not available. Inject torii into the authenticator with \"torii: Ember.inject.service()\".', (0, _utils.isPresent)(torii)));\n    }\n  });\n  _exports.default = _default;\n});","define(\"ember-simple-auth/configuration\", [\"exports\", \"ember-simple-auth/use-session-setup-method\"], function (_exports, _useSessionSetupMethod) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const DEFAULTS = {\n    rootURL: '',\n    routeAfterAuthentication: 'index'\n  };\n\n  /**\n    Ember Simple Auth's configuration object.\n  \n    @class Configuration\n    @extends Object\n    @module ember-simple-auth/configuration\n    @public\n  */\n  var _default = {\n    /**\n      The root URL of the application as configured in `config/environment.js`.\n       @property rootURL\n      @readOnly\n      @static\n      @type String\n      @default ''\n      @public\n    */\n    rootURL: DEFAULTS.rootURL,\n    /**\n      The route to transition to after successful authentication.\n       @property routeAfterAuthentication\n      @readOnly\n      @static\n      @type String\n      @default 'index'\n      @public\n    */\n    routeAfterAuthentication: DEFAULTS.routeAfterAuthentication,\n    /**\n      Flag used to determine whether users have decided to setup session service themselves.\n      This lets us to return early from initializer which would setup the service automatically.\n       This will be the default behavior in the future.\n       @property useSessionSetupMethod\n      @default false\n      @private\n    */\n    useSessionSetupMethod: _useSessionSetupMethod.default,\n    load(config) {\n      this.rootURL = config.rootURL !== undefined ? config.rootURL : DEFAULTS.rootURL;\n      this.routeAfterAuthentication = config.routeAfterAuthentication !== undefined ? config.routeAfterAuthentication : DEFAULTS.routeAfterAuthentication;\n    }\n  };\n  _exports.default = _default;\n});","define(\"ember-simple-auth/initializers/setup-session-restoration\", [\"exports\", \"@ember/application\", \"ember-simple-auth/configuration\", \"@ember/debug\"], function (_exports, _application, _configuration, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = setupSessionRestoration;\n  function setupSessionRestoration(registry) {\n    if (_configuration.default.useSessionSetupMethod) {\n      // return early in case users chose to opt out of initializer behavior.\n      return;\n    }\n    (true && !(false) && (0, _debug.deprecate)('Ember Simple Auth: The automatic session initialization is deprecated. Please inject session service in your application route and call the setup method manually.', false, {\n      id: 'ember-simple-auth.initializer.setup-session-restoration',\n      until: '5.0.0',\n      for: 'ember-simple-auth',\n      since: {\n        enabled: '4.1.0'\n      }\n    }));\n    const ApplicationRoute = registry.resolveRegistration ? registry.resolveRegistration('route:application') : registry.resolve('route:application');\n    ApplicationRoute.reopen({\n      init() {\n        this._super(...arguments);\n        const originalBeforeModel = this.beforeModel;\n        this.beforeModel = function () {\n          if (!this.__usesApplicationRouteMixn__) {\n            const sessionService = (0, _application.getOwner)(this).lookup('service:session');\n            sessionService._setupHandlers();\n          }\n          const session = (0, _application.getOwner)(this).lookup('session:main');\n          return session.restore().then(() => originalBeforeModel.apply(this, arguments), () => originalBeforeModel.apply(this, arguments));\n        };\n      }\n    });\n  }\n});","define(\"ember-simple-auth/initializers/setup-session\", [\"exports\", \"ember\", \"ember-simple-auth/internal-session\", \"ember-simple-auth/session-stores/ephemeral\"], function (_exports, _ember, _internalSession, _ephemeral) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = setupSession;\n  function setupSession(registry) {\n    registry.register('session:main', _internalSession.default);\n    if (_ember.default.testing) {\n      registry.register('session-store:test', _ephemeral.default);\n    }\n  }\n});","define(\"ember-simple-auth/internal-session\", [\"exports\", \"ember\", \"rsvp\", \"@ember/utils\", \"@ember/object/proxy\", \"@ember/object/evented\", \"ember-simple-auth/utils/assign\", \"@ember/object\", \"@ember/debug\", \"@ember/application\"], function (_exports, _ember, _rsvp, _utils, _proxy, _evented, _assign, _object, _debug, _application) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = _proxy.default.extend(_evented.default, {\n    authenticator: null,\n    store: null,\n    isAuthenticated: false,\n    attemptedTransition: null,\n    init() {\n      this._super(...arguments);\n      this.set('content', {\n        authenticated: {}\n      });\n      let storeFactory = 'session-store:application';\n      if (_ember.default.testing) {\n        storeFactory = 'session-store:test';\n      }\n      this.set('store', (0, _application.getOwner)(this).lookup(storeFactory));\n      this._busy = false;\n      this._bindToStoreEvents();\n    },\n    authenticate(authenticatorFactory) {\n      this._busy = true;\n      (true && !(!(0, _utils.isEmpty)(authenticatorFactory)) && (0, _debug.assert)(`Session#authenticate requires the authenticator to be specified, was \"${authenticatorFactory}\"!`, !(0, _utils.isEmpty)(authenticatorFactory)));\n      const authenticator = this._lookupAuthenticator(authenticatorFactory);\n      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        args[_key - 1] = arguments[_key];\n      }\n      return authenticator.authenticate(...args).then(content => {\n        this._busy = false;\n        return this._setup(authenticatorFactory, content, true);\n      }, error => {\n        const rejectWithError = () => _rsvp.default.Promise.reject(error);\n        this._busy = false;\n        return this._clear().then(rejectWithError, rejectWithError);\n      });\n    },\n    invalidate() {\n      this._busy = true;\n      this.set('attemptedTransition', null);\n      if (!this.get('isAuthenticated')) {\n        this._busy = false;\n        return _rsvp.default.Promise.resolve();\n      }\n      let authenticator = this._lookupAuthenticator(this.authenticator);\n      return authenticator.invalidate(this.content.authenticated, ...arguments).then(() => {\n        authenticator.off('sessionDataUpdated', this, this._onSessionDataUpdated);\n        this._busy = false;\n        return this._clear(true);\n      }, error => {\n        this.trigger('sessionInvalidationFailed', error);\n        this._busy = false;\n        return _rsvp.default.Promise.reject(error);\n      });\n    },\n    restore() {\n      this._busy = true;\n      const reject = () => _rsvp.default.Promise.reject();\n      return this.store.restore().then(restoredContent => {\n        let {\n          authenticator: authenticatorFactory\n        } = restoredContent.authenticated || {};\n        if (authenticatorFactory) {\n          delete restoredContent.authenticated.authenticator;\n          const authenticator = this._lookupAuthenticator(authenticatorFactory);\n          return authenticator.restore(restoredContent.authenticated).then(content => {\n            this.set('content', restoredContent);\n            this._busy = false;\n            return this._setup(authenticatorFactory, content);\n          }, err => {\n            (0, _debug.debug)(`The authenticator \"${authenticatorFactory}\" rejected to restore the session - invalidating…`);\n            if (err) {\n              (0, _debug.debug)(err);\n            }\n            this._busy = false;\n            return this._clearWithContent(restoredContent).then(reject, reject);\n          });\n        } else {\n          delete (restoredContent || {}).authenticated;\n          this._busy = false;\n          return this._clearWithContent(restoredContent).then(reject, reject);\n        }\n      }, () => {\n        this._busy = false;\n        return this._clear().then(reject, reject);\n      });\n    },\n    _setup(authenticator, authenticatedContent, trigger) {\n      trigger = Boolean(trigger) && !this.get('isAuthenticated');\n      this.setProperties({\n        isAuthenticated: true,\n        authenticator,\n        'content.authenticated': authenticatedContent\n      });\n      this._bindToAuthenticatorEvents();\n      return this._updateStore().then(() => {\n        if (trigger) {\n          this.trigger('authenticationSucceeded');\n        }\n      }, () => {\n        this.setProperties({\n          isAuthenticated: false,\n          authenticator: null,\n          'content.authenticated': {}\n        });\n      });\n    },\n    _clear(trigger) {\n      trigger = Boolean(trigger) && this.get('isAuthenticated');\n      this.setProperties({\n        isAuthenticated: false,\n        authenticator: null,\n        'content.authenticated': {}\n      });\n      return this._updateStore().then(() => {\n        if (trigger) {\n          this.trigger('invalidationSucceeded');\n        }\n      });\n    },\n    _clearWithContent(content, trigger) {\n      this.set('content', content);\n      return this._clear(trigger);\n    },\n    setUnknownProperty(key, value) {\n      (true && !(key !== 'authenticated') && (0, _debug.assert)('\"authenticated\" is a reserved key used by Ember Simple Auth!', key !== 'authenticated'));\n      let result = this._super(key, value);\n      if (!/^_/.test(key)) {\n        this._updateStore();\n      }\n      return result;\n    },\n    _updateStore() {\n      let data = this.content;\n      if (!(0, _utils.isEmpty)(this.authenticator)) {\n        (0, _object.set)(data, 'authenticated', (0, _assign.default)({\n          authenticator: this.authenticator\n        }, data.authenticated || {}));\n      }\n      return this.store.persist(data);\n    },\n    _bindToAuthenticatorEvents() {\n      const authenticator = this._lookupAuthenticator(this.authenticator);\n      authenticator.on('sessionDataUpdated', this, this._onSessionDataUpdated);\n      authenticator.on('sessionDataInvalidated', this, this._onSessionDataInvalidated);\n    },\n    _onSessionDataUpdated(content) {\n      this._setup(this.authenticator, content);\n    },\n    _onSessionDataInvalidated() {\n      this._clear(true);\n    },\n    _bindToStoreEvents() {\n      this.store.on('sessionDataUpdated', content => {\n        if (!this._busy) {\n          this._busy = true;\n          let {\n            authenticator: authenticatorFactory\n          } = content.authenticated || {};\n          if (authenticatorFactory) {\n            delete content.authenticated.authenticator;\n            const authenticator = this._lookupAuthenticator(authenticatorFactory);\n            authenticator.restore(content.authenticated).then(authenticatedContent => {\n              this.set('content', content);\n              this._busy = false;\n              this._setup(authenticatorFactory, authenticatedContent, true);\n            }, err => {\n              (0, _debug.debug)(`The authenticator \"${authenticatorFactory}\" rejected to restore the session - invalidating…`);\n              if (err) {\n                (0, _debug.debug)(err);\n              }\n              this._busy = false;\n              this._clearWithContent(content, true);\n            });\n          } else {\n            this._busy = false;\n            this._clearWithContent(content, true);\n          }\n        }\n      });\n    },\n    _lookupAuthenticator(authenticatorName) {\n      let owner = (0, _application.getOwner)(this);\n      let authenticator = owner.lookup(authenticatorName);\n      (true && !(!(0, _utils.isNone)(authenticator)) && (0, _debug.assert)(`No authenticator for factory \"${authenticatorName}\" could be found!`, !(0, _utils.isNone)(authenticator)));\n      (0, _application.setOwner)(authenticator, owner);\n      return authenticator;\n    }\n  });\n  _exports.default = _default;\n});","define(\"ember-simple-auth/mixins/application-route-mixin\", [\"exports\", \"@ember/object/mixin\", \"@ember/array\", \"@ember/application\", \"@ember/service\", \"ember\", \"@ember/debug\", \"ember-simple-auth/configuration\", \"ember-simple-auth/utils/is-fastboot\"], function (_exports, _mixin, _array, _application, _service, _ember, _debug, _configuration, _isFastboot) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /* eslint-disable ember/no-new-mixins */\n  (true && !(false) && (0, _debug.deprecate)('Ember Simple Auth: The ApplicationRouteMixin is now deprecated; it can be safely removed.', false, {\n    id: 'ember-simple-auth.mixins.application-route-mixin',\n    until: '4.0.0',\n    for: 'ember-simple-auth',\n    since: {\n      enabled: '3.1.0'\n    }\n  }));\n  /**\n    The mixin for the application route, __defining methods that are called when\n    the session is successfully authenticated (see\n    {{#crossLink \"SessionService/authenticationSucceeded:event\"}}{{/crossLink}})\n    or invalidated__ (see\n    {{#crossLink \"SessionService/invalidationSucceeded:event\"}}{{/crossLink}}).\n  \n    __Using this mixin is optional.__ The session events can also be handled\n    manually, e.g. in an instance initializer:\n  \n    ```js\n    // app/instance-initializers/session-events.js\n    export function initialize(instance) {\n      const applicationRoute = instance.lookup('route:application');\n      const session          = instance.lookup('service:session');\n      session.on('authenticationSucceeded', function() {\n        applicationRoute.transitionTo('index');\n      });\n      session.on('invalidationSucceeded', function() {\n        applicationRoute.transitionTo('bye');\n      });\n    };\n  \n    export default {\n      initialize,\n      name:  'session-events',\n      after: 'ember-simple-auth'\n    };\n    ```\n  \n    __When using the `ApplicationRouteMixin` you need to specify\n    `needs: ['service:session']` in the application route's unit test.__\n  \n    @class ApplicationRouteMixin\n    @deprecated Call the session service's setup method in the application route's constructor instead\n    @module ember-simple-auth/mixins/application-route-mixin\n    @extends Ember.Mixin\n    @public\n  */\n  var _default = _mixin.default.create({\n    /**\n      The session service.\n       @property session\n      @readOnly\n      @type SessionService\n      @public\n    */\n    session: (0, _service.inject)('session'),\n    /**\n      The route to transition to after successful authentication.\n       @property routeAfterAuthentication\n      @type String\n      @default 'index'\n      @public\n    */\n    routeAfterAuthentication: 'index',\n    init() {\n      this._super(...arguments);\n      this.__usesApplicationRouteMixn__ = true;\n      this._isFastBoot = this.hasOwnProperty('_isFastBoot') ? this._isFastBoot : (0, _isFastboot.default)((0, _application.getOwner)(this));\n      this._subscribeToSessionEvents();\n    },\n    _subscribeToSessionEvents() {\n      var _this = this;\n      (0, _array.A)([['authenticationSucceeded', 'sessionAuthenticated'], ['invalidationSucceeded', 'sessionInvalidated']]).forEach(_ref => {\n        let [event, method] = _ref;\n        this.get('session').on(event, function () {\n          return _this[method](...arguments);\n        });\n      });\n    },\n    /**\n      This method handles the session's\n      {{#crossLink \"SessionService/authenticationSucceeded:event\"}}{{/crossLink}}\n      event. If there is a transition that was previously intercepted by the\n      {{#crossLink \"AuthenticatedRouteMixin/beforeModel:method\"}}\n      AuthenticatedRouteMixin's `beforeModel` method{{/crossLink}} it will retry\n      it. If there is no such transition, the `ember_simple_auth-redirectTarget`\n      cookie will be checked for a url that represents an attemptedTransition\n      that was aborted in Fastboot mode, otherwise this action transitions to the\n      {{#crossLink \"AuthenticatedRouteMixin/routeAfterAuthentication:property\"}}{{/crossLink}}.\n        @method sessionAuthenticated\n      @public\n    */\n    sessionAuthenticated() {\n      this.get('session').handleAuthentication(this.get('routeAfterAuthentication'));\n    },\n    /**\n      This method handles the session's\n      {{#crossLink \"SessionService/invalidationSucceeded:event\"}}{{/crossLink}}\n      event. __It reloads the Ember.js application__ by redirecting the browser\n      to the application's root URL so that all in-memory data (such as Ember\n      Data stores etc.) gets cleared.\n       If the Ember.js application will be used in an environment where the users\n      don't have direct access to any data stored on the client (e.g.\n      [cordova](http://cordova.apache.org)) this action can be overridden to e.g.\n      simply transition to the index route.\n       @method sessionInvalidated\n      @public\n    */\n    sessionInvalidated() {\n      if (!_ember.default.testing) {\n        this.get('session').handleInvalidation(_configuration.default.rootURL);\n      }\n    }\n  });\n  _exports.default = _default;\n});","define(\"ember-simple-auth/mixins/authenticated-route-mixin\", [\"exports\", \"@ember/service\", \"@ember/object/mixin\", \"@ember/debug\", \"@ember/application\", \"ember-simple-auth/-internals/routing\"], function (_exports, _service, _mixin, _debug, _application, _routing) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /* eslint-disable ember/no-new-mixins */\n  (true && !(false) && (0, _debug.deprecate)(\"Ember Simple Auth: The AuthenticatedRouteMixin is now deprecated; call the session service's requireAuthentication method in the respective route's beforeModel method instead.\", false, {\n    id: 'ember-simple-auth.mixins.authenticated-route-mixin',\n    until: '4.0.0',\n    for: 'ember-simple-auth',\n    since: {\n      enabled: '3.1.0'\n    }\n  }));\n  /**\n    __This mixin is used to make routes accessible only if the session is\n    authenticated.__ It defines a `beforeModel` method that aborts the current\n    transition and instead transitions to the\n    {{#crossLink \"AuthenticatedRouteMixin/authenticationRoute:property\"}}{{/crossLink}} if\n    the session is not authenticated.\n  \n    ```js\n    // app/routes/protected.js\n    import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';\n  \n    export default class ProtectedRoute extends Route.extend(AuthenticatedRouteMixin) {}\n    ```\n  \n    @class AuthenticatedRouteMixin\n    @deprecated Call the session service's requireAuthentication method in the respective route's beforeModel method instead\n    @module ember-simple-auth/mixins/authenticated-route-mixin\n    @extends Ember.Mixin\n    @public\n  */\n  var _default = _mixin.default.create({\n    /**\n      The session service.\n       @property session\n      @readOnly\n      @type SessionService\n      @public\n    */\n    session: (0, _service.inject)('session'),\n    /**\n      The route to transition to for authentication. The\n      {{#crossLink \"AuthenticatedRouteMixin\"}}{{/crossLink}} will transition to\n      this route when a route that implements the mixin is accessed when the\n      route is not authenticated.\n       @property authenticationRoute\n      @type String\n      @default 'login'\n      @public\n    */\n    authenticationRoute: 'login',\n    /**\n      Checks whether the session is authenticated and if it is not aborts the\n      current transition and instead transitions to the\n      {{#crossLink \"AuthenticatedRouteMixin/authenticationRoute:property\"}}{{/crossLink}}.\n      If the current transition is aborted, this method will save it in the\n      session service's\n      {{#crossLink \"SessionService/attemptedTransition:property\"}}{{/crossLink}}\n      property so that  it can be retried after the session is authenticated\n      (see\n      {{#crossLink \"ApplicationRouteMixin/sessionAuthenticated:method\"}}{{/crossLink}}).\n      If the transition is aborted in Fastboot mode, the transition's target\n      URL will be saved in a `ember_simple_auth-redirectTarget` cookie for use by\n      the browser after authentication is complete.\n       __If `beforeModel` is overridden in a route that uses this mixin, the route's\n     implementation must call `super.beforeModel(...arguments)`__ so that the mixin's\n     `beforeModel` method is actually executed.\n       @method beforeModel\n      @param {Transition} transition The transition that lead to this route\n      @public\n    */\n    beforeModel(transition) {\n      let isAuthenticated = (0, _routing.requireAuthentication)((0, _application.getOwner)(this), transition);\n      if (!isAuthenticated) {\n        this.triggerAuthentication();\n      } else {\n        return this._super(...arguments);\n      }\n    },\n    /**\n      Triggers authentication; by default this method transitions to the\n      `authenticationRoute`. In case the application uses an authentication\n      mechanism that does not use an authentication route, this method can be\n      overridden.\n       @method triggerAuthentication\n      @protected\n    */\n    triggerAuthentication() {\n      let authenticationRoute = this.get('authenticationRoute');\n      (true && !(this.get('routeName') !== authenticationRoute) && (0, _debug.assert)('The route configured as AuthenticatedRouteMixin.authenticationRoute cannot implement the AuthenticatedRouteMixin mixin as that leads to an infinite transitioning loop!', this.get('routeName') !== authenticationRoute));\n      (0, _routing.triggerAuthentication)((0, _application.getOwner)(this), authenticationRoute);\n    }\n  });\n  _exports.default = _default;\n});","define(\"ember-simple-auth/mixins/data-adapter-mixin\", [\"exports\", \"@ember/service\", \"@ember/object/mixin\", \"@ember/debug\"], function (_exports, _service, _mixin, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /* eslint-disable ember/no-new-mixins */\n  (true && !(false) && (0, _debug.deprecate)(\"Ember Simple Auth: The DataAdapterMixin is now deprecated; call the session service's invalidate method in the adapter's handleResponse method instead in case of a 401 response.\", false, {\n    id: 'ember-simple-auth.mixins.data-adapter-mixin',\n    until: '4.0.0',\n    for: 'ember-simple-auth',\n    since: {\n      enabled: '3.1.0'\n    }\n  }));\n  /**\n    __This mixin can be used to make Ember Data adapters authorize all outgoing\n    API requests by injecting a header.__ The adapter's `headers` property can be\n    set using data read from the `session` service that is injected by this\n    mixin.\n  \n    __The `DataAdapterMixin` will also invalidate the session whenever it\n    receives a 401 response for an API request.__\n  \n    ```js\n    // app/adapters/application.js\n    import JSONAPIAdapter from '@ember-data/adapter/json-api';\n    import DataAdapterMixin from 'ember-simple-auth/mixins/data-adapter-mixin';\n    import { computed } from '@ember/object';\n  \n    export default class ApplicationAdapter extends JSONAPIAdapter.extend(DataAdapterMixin) {\n      @computed('session.data.authenticated.token')\n      get headers() {\n        let headers = {};\n        if (this.session.isAuthenticated) {\n          headers['Authorization'] = `Bearer ${this.session.data.authenticated.token}`;\n        }\n  \n        return headers;\n      }\n    }\n    ```\n  \n    __The `DataAdapterMixin` requires Ember Data 1.13 or later.__\n  \n    @class DataAdapterMixin\n    @deprecated Call the session service's invalidate method in the adapter's handleResponse method instead in case of a 401 response\n    @module ember-simple-auth/mixins/data-adapter-mixin\n    @extends Ember.Mixin\n    @public\n  */\n  var _default = _mixin.default.create({\n    /**\n      The session service.\n       @property session\n      @readOnly\n      @type SessionService\n      @public\n    */\n    session: (0, _service.inject)('session'),\n    /**\n      This method is called for every response that the adapter receives from the\n      API. If the response has a 401 status code it invalidates the session (see\n      {{#crossLink \"SessionService/invalidate:method\"}}{{/crossLink}}).\n       @method handleResponse\n      @param {Number} status The response status as received from the API\n      @param  {Object} headers HTTP headers as received from the API\n      @param {Any} payload The response body as received from the API\n      @param {Object} requestData the original request information\n      @protected\n    */\n    handleResponse(status, headers, payload, requestData) {\n      this.ensureResponseAuthorized(status, headers, payload, requestData);\n      return this._super(...arguments);\n    },\n    /**\n     The default implementation for handleResponse.\n     If the response has a 401 status code it invalidates the session (see\n      {{#crossLink \"SessionService/invalidate:method\"}}{{/crossLink}}).\n      Override this method if you want custom invalidation logic for incoming responses.\n     @method ensureResponseAuthorized\n     @param {Number} status The response status as received from the API\n     @param  {Object} headers HTTP headers as received from the API\n     @param {Any} payload The response body as received from the API\n     @param {Object} requestData the original request information\n    */\n    ensureResponseAuthorized(status /* ,headers, payload, requestData */) {\n      if (status === 401 && this.get('session.isAuthenticated')) {\n        this.get('session').invalidate();\n      }\n    }\n  });\n  _exports.default = _default;\n});","define(\"ember-simple-auth/mixins/oauth2-implicit-grant-callback-route-mixin\", [\"exports\", \"@ember/service\", \"@ember/object/mixin\", \"@ember/application\", \"@ember/debug\", \"ember-simple-auth/utils/location\", \"ember-simple-auth/utils/is-fastboot\", \"ember-simple-auth/authenticators/oauth2-implicit-grant\"], function (_exports, _service, _mixin, _application, _debug, _location, _isFastboot, _oauth2ImplicitGrant) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /* eslint-disable ember/no-new-mixins */\n  (true && !(false) && (0, _debug.deprecate)(\"Ember Simple Auth: The OAuth2ImplicitGrantCallbackRouteMixin is now deprecated; call the session service's authenticate method with the appropriate authenticator in the respective route's activate method instead.\", false, {\n    id: 'ember-simple-auth.mixins.oauth2-implicit-grant-callback-route-mixin',\n    until: '4.0.0',\n    for: 'ember-simple-auth',\n    since: {\n      enabled: '3.1.0'\n    }\n  }));\n  /**\n    __This mixin is used in the callback route when using OAuth 2.0 Implicit\n    Grant authentication.__ It implements the\n    {{#crossLink \"OAuth2ImplicitGrantCallbackRouteMixin/activate:method\"}}{{/crossLink}}\n    method that retrieves and processes authentication parameters, such as\n    `access_token`, from the hash parameters provided in the callback URL by\n    the authentication server. The parameters are then passed to the\n    {{#crossLink \"OAuth2ImplicitGrantAuthenticator\"}}{{/crossLink}}\n  \n    @class OAuth2ImplicitGrantCallbackRouteMixin\n    @deprecated Call the session service's authenticate method with the appropriate authenticator in the respective route's activate method instead\n    @module ember-simple-auth/mixins/oauth2-implicit-grant-callback-route-mixin\n    @extends Ember.Mixin\n    @public\n  */\n  var _default = _mixin.default.create({\n    /**\n     The session service.\n      @property session\n     @readOnly\n     @type SessionService\n     @public\n     */\n    session: (0, _service.inject)('session'),\n    /**\n      The authenticator that should be used to authenticate the callback. This\n      must be a subclass of the\n      {{#crossLink \"OAuth2ImplicitGrantAuthenticator\"}}{{/crossLink}}\n      authenticator.\n       @property authenticator\n      @type String\n      @default null\n      @public\n    */\n    authenticator: null,\n    /**\n      Any error that potentially occurs during authentication will be stored in\n      this property.\n       @property error\n      @type String\n      @default null\n      @public\n    */\n    error: null,\n    /**\n      Passes the hash received with the redirection from the authentication\n      server to the\n      {{#crossLink \"OAuth2ImplicitGrantAuthenticator\"}}{{/crossLink}} and\n      authenticates the session with the authenticator.\n       @method activate\n      @public\n    */\n    activate() {\n      let _isFastBoot = this.hasOwnProperty('_isFastBoot') ? this._isFastBoot : (0, _isFastboot.default)((0, _application.getOwner)(this));\n      if (_isFastBoot) {\n        return;\n      }\n      let authenticator = this.get('authenticator');\n      let hash = (0, _oauth2ImplicitGrant.parseResponse)((0, _location.default)().hash);\n      this.get('session').authenticate(authenticator, hash).catch(err => {\n        this.set('error', err);\n      });\n    }\n  });\n  _exports.default = _default;\n});","define(\"ember-simple-auth/mixins/unauthenticated-route-mixin\", [\"exports\", \"@ember/service\", \"@ember/object/mixin\", \"@ember/debug\", \"@ember/application\", \"ember-simple-auth/-internals/routing\"], function (_exports, _service, _mixin, _debug, _application, _routing) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /* eslint-disable ember/no-new-mixins */\n  (true && !(false) && (0, _debug.deprecate)(\"Ember Simple Auth: The UnauthenticatedRouteMixin is now deprecated; call the session service's prohibitAuthentication method in the respective route's beforeModel method instead.\", false, {\n    id: 'ember-simple-auth.mixins.unauthenticated-route-mixin',\n    until: '4.0.0',\n    for: 'ember-simple-auth',\n    since: {\n      enabled: '3.1.0'\n    }\n  }));\n  /**\n    __This mixin is used to make routes accessible only if the session is\n    not authenticated__ (e.g., login and registration routes). It defines a\n    `beforeModel` method that aborts the current transition and instead\n    transitions to the\n    {{#crossLink \"UnauthenticatedRouteMixin/routeIfAlreadyAuthenticated:property\"}}{{/crossLink}}\n    if the session is authenticated.\n  \n    ```js\n    // app/routes/login.js\n    import Route from '@ember/routing/route';\n    import UnauthenticatedRouteMixin from 'ember-simple-auth/mixins/unauthenticated-route-mixin';\n  \n    export default class LoginRoute extends Route.extend(UnauthenticatedRouteMixin) {}\n    ```\n  \n    @class UnauthenticatedRouteMixin\n    @deprecated Call the session service's prohibitAuthentication method in the respective route's beforeModel method instead\n    @module ember-simple-auth/mixins/unauthenticated-route-mixin\n    @extends Ember.Mixin\n    @public\n  */\n  var _default = _mixin.default.create({\n    /**\n      The session service.\n       @property session\n      @readOnly\n      @type SessionService\n      @public\n    */\n    session: (0, _service.inject)('session'),\n    /**\n      The route to transition to if a route that implements the\n      {{#crossLink \"UnauthenticatedRouteMixin\"}}{{/crossLink}} is accessed when\n      the session is authenticated.\n       @property routeIfAlreadyAuthenticated\n      @type String\n      @default 'index'\n      @public\n    */\n    routeIfAlreadyAuthenticated: 'index',\n    /**\n      Checks whether the session is authenticated and if it is aborts the current\n      transition and instead transitions to the\n      {{#crossLink \"UnauthenticatedRouteMixin/routeIfAlreadyAuthenticated:property\"}}{{/crossLink}}.\n       __If `beforeModel` is overridden in a route that uses this mixin, the route's\n     implementation must call `this._super(...arguments)`__ so that the mixin's\n     `beforeModel` method is actually executed.\n       @method beforeModel\n      @public\n    */\n    beforeModel() {\n      let routeIfAlreadyAuthenticated = this.get('routeIfAlreadyAuthenticated');\n      (true && !(this.get('routeName') !== routeIfAlreadyAuthenticated) && (0, _debug.assert)('The route configured as UnauthenticatedRouteMixin.routeIfAlreadyAuthenticated cannot implement the UnauthenticatedRouteMixin mixin as that leads to an infinite transitioning loop!', this.get('routeName') !== routeIfAlreadyAuthenticated));\n      let owner = (0, _application.getOwner)(this);\n      let sessionService = owner.lookup('service:session');\n      if (sessionService.get('isAuthenticated')) {\n        (0, _routing.prohibitAuthentication)(owner, routeIfAlreadyAuthenticated);\n      } else {\n        return this._super(...arguments);\n      }\n    }\n  });\n  _exports.default = _default;\n});","define(\"ember-simple-auth/services/session\", [\"exports\", \"@ember/object/computed\", \"@ember/array\", \"@ember/service\", \"@ember/object/evented\", \"@ember/application\", \"@ember/debug\", \"ember-simple-auth/configuration\", \"ember-simple-auth/-internals/routing\"], function (_exports, _computed, _array, _service, _evented, _application, _debug, _configuration, _routing) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const SESSION_DATA_KEY_PREFIX = /^data\\./;\n  let enableEventsDeprecation = true;\n  function deprecateSessionEvents() {\n    if (enableEventsDeprecation) {\n      (true && !(false) && (0, _debug.deprecate)(\"Ember Simple Auth: The session service's events API is deprecated; to add custom behavior to the authentication or invalidation handling, override the handleAuthentication or handleInvalidation methods.\", false, {\n        id: 'ember-simple-auth.events.session-service',\n        until: '4.0.0',\n        for: 'ember-simple-auth',\n        since: {\n          enabled: '3.1.0'\n        }\n      }));\n    }\n  }\n  function assertSetupHasBeenCalled(isSetupCalled) {\n    if (!isSetupCalled && _configuration.default.useSessionSetupMethod) {\n      (true && !(false) && (0, _debug.assert)(\"Ember Simple Auth: session#setup wasn't called. Make sure to call session#setup in your application route's beforeModel hook.\", false));\n    }\n  }\n\n  /**\n    __The session service provides access to the current session as well as\n    methods to authenticate it, invalidate it, etc.__ It is the main interface for\n    the application to Ember Simple Auth's functionality. It can be injected via\n  \n    ```js\n    // app/components/login-form.js\n    import Component from '@ember/component';\n    import { inject as service } from '@ember/service';\n  \n    export default class LoginFormComponent extends Component {\n      @service session;\n    }\n    ```\n  \n    @class SessionService\n    @module ember-simple-auth/services/session\n    @extends Ember.Service\n    @uses Ember.Evented\n    @public\n  */\n  var _default = _service.default.extend(_evented.default, {\n    /**\n      Triggered whenever the session is successfully authenticated. This happens\n      when the session gets authenticated via\n      {{#crossLink \"SessionService/authenticate:method\"}}{{/crossLink}} but also\n      when the session is authenticated in another tab or window of the same\n      application and the session state gets synchronized across tabs or windows\n      via the store (see\n      {{#crossLink \"BaseStore/sessionDataUpdated:event\"}}{{/crossLink}}).\n       When using the {{#crossLink \"ApplicationRouteMixin\"}}{{/crossLink}} this\n      event will automatically get handled (see\n      {{#crossLink \"ApplicationRouteMixin/sessionAuthenticated:method\"}}{{/crossLink}}).\n       @event authenticationSucceeded\n      @public\n    */\n\n    /**\n      Triggered whenever the session is successfully invalidated. This happens\n      when the session gets invalidated via\n      {{#crossLink \"SessionService/invalidate:method\"}}{{/crossLink}} but also\n      when the session is invalidated in another tab or window of the same\n      application and the session state gets synchronized across tabs or windows\n      via the store (see\n      {{#crossLink \"BaseStore/sessionDataUpdated:event\"}}{{/crossLink}}).\n       When using the {{#crossLink \"ApplicationRouteMixin\"}}{{/crossLink}} this\n      event will automatically get handled (see\n      {{#crossLink \"ApplicationRouteMixin/sessionInvalidated:method\"}}{{/crossLink}}).\n       @event invalidationSucceeded\n      @public\n    */\n\n    /**\n      Returns whether the session is currently authenticated.\n       @property isAuthenticated\n      @type Boolean\n      @readOnly\n      @default false\n      @public\n    */\n    isAuthenticated: (0, _computed.readOnly)('session.isAuthenticated'),\n    /**\n      The current session data as a plain object. The\n      `authenticated` key holds the session data that the authenticator resolved\n      with when the session was authenticated (see\n      {{#crossLink \"BaseAuthenticator/authenticate:method\"}}{{/crossLink}}) and\n      that will be cleared when the session is invalidated. This data cannot be\n      written. All other session data is writable and will not be cleared when\n      the session is invalidated.\n       @property data\n      @type Object\n      @readOnly\n      @default { authenticated: {} }\n      @public\n    */\n    data: (0, _computed.readOnly)('session.content'),\n    /**\n      The session store.\n       @property store\n      @type BaseStore\n      @readOnly\n      @default null\n      @public\n    */\n    store: (0, _computed.readOnly)('session.store'),\n    /**\n      A previously attempted but intercepted transition (e.g. by the\n      {{#crossLink \"AuthenticatedRouteMixin\"}}{{/crossLink}}). If an attempted\n      transition is present, the\n      {{#crossLink \"ApplicationRouteMixin\"}}{{/crossLink}} will retry it when the\n      session becomes authenticated (see\n      {{#crossLink \"ApplicationRouteMixin/sessionAuthenticated:method\"}}{{/crossLink}}).\n       @property attemptedTransition\n      @type Transition\n      @default null\n      @public\n    */\n    attemptedTransition: (0, _computed.alias)('session.attemptedTransition'),\n    session: null,\n    init() {\n      this._super(...arguments);\n      this.set('session', (0, _application.getOwner)(this).lookup('session:main'));\n      this._forwardSessionEvents();\n    },\n    set(key, value) {\n      const setsSessionData = SESSION_DATA_KEY_PREFIX.test(key);\n      if (setsSessionData) {\n        const sessionDataKey = `session.${key.replace(SESSION_DATA_KEY_PREFIX, '')}`;\n        return this._super(sessionDataKey, value);\n      } else {\n        return this._super(...arguments);\n      }\n    },\n    _forwardSessionEvents() {\n      (0, _array.A)(['authenticationSucceeded', 'invalidationSucceeded']).forEach(event => {\n        const session = this.get('session');\n        // the internal session won't be available in route unit tests\n        if (session) {\n          session.on(event, () => {\n            enableEventsDeprecation = false;\n            this.trigger(event, ...arguments);\n            enableEventsDeprecation = true;\n          });\n        }\n      });\n    },\n    on() {\n      deprecateSessionEvents();\n      return this._super(...arguments);\n    },\n    one() {\n      deprecateSessionEvents();\n      return this._super(...arguments);\n    },\n    off() {\n      deprecateSessionEvents();\n      return this._super(...arguments);\n    },\n    has() {\n      deprecateSessionEvents();\n      return this._super(...arguments);\n    },\n    trigger() {\n      deprecateSessionEvents();\n      return this._super(...arguments);\n    },\n    _setupHandlers() {\n      this.get('session').on('authenticationSucceeded', () => this.handleAuthentication(_configuration.default.routeAfterAuthentication));\n      this.get('session').on('invalidationSucceeded', () => this.handleInvalidation(_configuration.default.rootURL));\n    },\n    /**\n      __Authenticates the session with an `authenticator`__ and appropriate\n      arguments. The authenticator implements the actual steps necessary to\n      authenticate the session (see\n      {{#crossLink \"BaseAuthenticator/authenticate:method\"}}{{/crossLink}}) and\n      returns a promise after doing so. The session handles the returned promise\n      and when it resolves becomes authenticated, otherwise remains\n      unauthenticated. All data the authenticator resolves with will be\n      accessible via the\n      {{#crossLink \"SessionService/data:property\"}}session data's{{/crossLink}}\n      `authenticated` property.\n       __This method returns a promise. A resolving promise indicates that the\n      session was successfully authenticated__ while a rejecting promise\n      indicates that authentication failed and the session remains\n      unauthenticated. The promise does not resolve with a value; instead, the\n      data returned from the authenticator is available via the\n      {{#crossLink \"SessionService/data:property\"}}{{/crossLink}} property.\n       When authentication succeeds this will trigger the\n      {{#crossLink \"SessionService/authenticationSucceeded:event\"}}{{/crossLink}}\n      event.\n       @method authenticate\n      @param {String} authenticator The authenticator to use to authenticate the session\n      @param {Any} [...args] The arguments to pass to the authenticator; depending on the type of authenticator these might be a set of credentials, a Facebook OAuth Token, etc.\n      @return {Ember.RSVP.Promise} A promise that resolves when the session was authenticated successfully and rejects otherwise\n      @public\n    */\n    authenticate() {\n      const session = this.get('session');\n      return session.authenticate(...arguments);\n    },\n    /**\n      __Invalidates the session with the authenticator it is currently\n      authenticated with__ (see\n      {{#crossLink \"SessionService/authenticate:method\"}}{{/crossLink}}). This\n      invokes the authenticator's\n      {{#crossLink \"BaseAuthenticator/invalidate:method\"}}{{/crossLink}} method\n      and handles the returned promise accordingly.\n       This method returns a promise. A resolving promise indicates that the\n      session was successfully invalidated while a rejecting promise indicates\n      that invalidation failed and the session remains authenticated. Once the\n      session is successfully invalidated it clears all of its authenticated data\n      (see {{#crossLink \"SessionService/data:property\"}}{{/crossLink}}).\n       When invalidation succeeds this will trigger the\n      {{#crossLink \"SessionService/invalidationSucceeded:event\"}}{{/crossLink}}\n      event.\n       When calling the {{#crossLink \"BaseAuthenticator/invalidate:method\"}}{{/crossLink}}\n      on an already unauthenticated session, the method will return a resolved Promise\n      immediately.\n       @method invalidate\n      @param {Array} ...args arguments that will be passed to the authenticator\n      @return {Ember.RSVP.Promise} A promise that resolves when the session was invalidated successfully and rejects otherwise\n      @public\n    */\n    invalidate() {\n      const session = this.get('session');\n      return session.invalidate(...arguments);\n    },\n    /**\n      Checks whether the session is authenticated and if it is not, transitions\n      to the specified route or invokes the specified callback.\n       If a transition is in progress and is aborted, this method will save it in the\n      session service's\n      {{#crossLink \"SessionService/attemptedTransition:property\"}}{{/crossLink}}\n      property so that  it can be retried after the session is authenticated. If\n      the transition is aborted in Fastboot mode, the transition's target URL\n      will be saved in a `ember_simple_auth-redirectTarget` cookie for use by the\n      browser after authentication is complete.\n       @method requireAuthentication\n      @param {Transition} transition A transition that triggered the authentication requirement or null if the requirement originated independently of a transition\n      @param {String|Function} routeOrCallback The route to transition to in case that the session is not authenticated or a callback function to invoke in that case\n      @return {Boolean} true when the session is authenticated, false otherwise\n      @public\n    */\n    requireAuthentication(transition, routeOrCallback) {\n      assertSetupHasBeenCalled(this._setupIsCalled);\n      let isAuthenticated = (0, _routing.requireAuthentication)((0, _application.getOwner)(this), transition);\n      if (!isAuthenticated) {\n        let argType = typeof routeOrCallback;\n        if (argType === 'string') {\n          (0, _routing.triggerAuthentication)((0, _application.getOwner)(this), routeOrCallback);\n        } else if (argType === 'function') {\n          routeOrCallback();\n        } else {\n          (true && !(false) && (0, _debug.assert)(`The second argument to requireAuthentication must be a String or Function, got \"${argType}\"!`, false));\n        }\n      }\n      return isAuthenticated;\n    },\n    /**\n      Checks whether the session is authenticated and if it is, transitions\n      to the specified route or invokes the specified callback.\n       @method prohibitAuthentication\n      @param {String|Function} routeOrCallback The route to transition to in case that the session is authenticated or a callback function to invoke in that case\n      @return {Boolean} true when the session is not authenticated, false otherwise\n      @public\n    */\n    prohibitAuthentication(routeOrCallback) {\n      assertSetupHasBeenCalled(this._setupIsCalled);\n      let isAuthenticated = this.get('isAuthenticated');\n      if (isAuthenticated) {\n        let argType = typeof routeOrCallback;\n        if (argType === 'string') {\n          (0, _routing.prohibitAuthentication)((0, _application.getOwner)(this), routeOrCallback);\n        } else if (argType === 'function') {\n          routeOrCallback();\n        } else {\n          (true && !(false) && (0, _debug.assert)(`The first argument to prohibitAuthentication must be a String or Function, got \"${argType}\"!`, false));\n        }\n      }\n      return !isAuthenticated;\n    },\n    /**\n      This method is called whenever the session goes from being unauthenticated\n      to being authenticated. If there is a transition that was previously\n      intercepted by the\n      {{#crossLink \"SessionService/requireAuthentication:method\"}}{{/crossLink}},\n      it will retry it. If there is no such transition, the\n      `ember_simple_auth-redirectTarget` cookie will be checked for a url that\n      represents an attemptedTransition that was aborted in Fastboot mode,\n      otherwise this action transitions to the specified\n      routeAfterAuthentication.\n       @method handleAuthentication\n      @param {String} routeAfterAuthentication The route to transition to\n      @public\n    */\n    handleAuthentication(routeAfterAuthentication) {\n      (0, _routing.handleSessionAuthenticated)((0, _application.getOwner)(this), routeAfterAuthentication);\n    },\n    /**\n      This method is called whenever the session goes from being authenticated to\n      not being authenticated. __It reloads the Ember.js application__ by\n      redirecting the browser to the specified route so that all in-memory data\n      (such as Ember Data stores etc.) gets cleared.\n       If the Ember.js application will be used in an environment where the users\n      don't have direct access to any data stored on the client (e.g.\n      [cordova](http://cordova.apache.org)) this action can be overridden to e.g.\n      simply transition to the index route.\n       @method handleInvalidation\n      @param {String} routeAfterInvalidation The route to transition to\n      @public\n    */\n    handleInvalidation(routeAfterInvalidation) {\n      (0, _routing.handleSessionInvalidated)((0, _application.getOwner)(this), routeAfterInvalidation);\n    },\n    /**\n      Sets up the session service.\n       This method must be called when the application starts up,\n      usually as the first thing in the `application` route's `beforeModel`\n      method.\n       @method setup\n      @public\n    */\n    setup() {\n      this._setupIsCalled = true;\n      this._setupHandlers();\n      return this.session.restore().catch(() => {\n        // If it raises an error then it means that restore didn't find any restorable state.\n      });\n    }\n  });\n  _exports.default = _default;\n});","define(\"ember-simple-auth/session-stores/adaptive\", [\"exports\", \"@ember/object\", \"@ember/service\", \"@ember/application\", \"ember-simple-auth/session-stores/base\"], function (_exports, _object, _service, _application, _base) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const LOCAL_STORAGE_TEST_KEY = '_ember_simple_auth_test_key';\n  const proxyToInternalStore = function () {\n    return (0, _object.computed)({\n      get(key) {\n        return this.get(`_${key}`);\n      },\n      set(key, value) {\n        this.set(`_${key}`, value);\n        let _store = this.get('_store');\n        if (_store) {\n          _store.set(key, value);\n        }\n        return value;\n      }\n    });\n  };\n\n  /**\n    Session store that persists data in the browser's `localStorage` (see\n    {{#crossLink \"LocalStorageStore\"}}{{/crossLink}}) if that is available or in\n    a cookie (see {{#crossLink \"CookieStore\"}}{{/crossLink}}) if it is not.\n  \n    __This is the default store that Ember Simple Auth will use when the\n    application doesn't define a custom store.__\n  \n    __This session store does not work with FastBoot. In order to use Ember\n    Simple Auth with FastBoot, configure the\n    {{#crossLink \"CookieStore\"}}{{/crossLink}} as the application's session\n    store.__\n  \n    @class AdaptiveStore\n    @module ember-simple-auth/session-stores/adaptive\n    @extends BaseStore\n    @public\n  */\n  var _default = _base.default.extend({\n    /**\n      The `localStorage` key the store persists data in if `localStorage` is\n      available.\n       @property localStorageKey\n      @type String\n      @default 'ember_simple_auth-session'\n      @public\n    */\n    localStorageKey: 'ember_simple_auth-session',\n    /**\n      The domain to use for the cookie if `localStorage` is not available, e.g.,\n      \"example.com\", \".example.com\" (which includes all subdomains) or\n      \"subdomain.example.com\". If not explicitly set, the cookie domain defaults\n      to the domain the session was authenticated on.\n       @property cookieDomain\n      @type String\n      @default null\n      @public\n    */\n    _cookieDomain: null,\n    cookieDomain: proxyToInternalStore(),\n    /**\n      The name of the cookie to use if `localStorage` is not available.\n       @property cookieName\n      @type String\n      @default ember_simple_auth-session\n      @public\n    */\n    _cookieName: 'ember_simple_auth-session',\n    cookieName: proxyToInternalStore(),\n    /**\n      The path to use for the cookie, e.g., \"/\", \"/something\".\n       @property cookiePath\n      @type String\n      @default '/'\n      @public\n    */\n    _cookiePath: '/',\n    cookiePath: proxyToInternalStore(),\n    /**\n      The expiration time for the cookie in seconds if `localStorage` is not\n      available. A value of `null` will make the cookie a session cookie that\n      expires and gets deleted when the browser is closed.\n       @property cookieExpirationTime\n      @default null\n      @type Integer\n      @public\n    */\n    _cookieExpirationTime: null,\n    cookieExpirationTime: proxyToInternalStore(),\n    _sameSite: null,\n    sameSite: proxyToInternalStore(),\n    _cookies: (0, _service.inject)('cookies'),\n    _isLocalStorageAvailable: (0, _object.computed)({\n      get() {\n        return testLocalStorageAvailable();\n      },\n      set(key, value) {\n        return value;\n      }\n    }),\n    init() {\n      this._super(...arguments);\n      let owner = (0, _application.getOwner)(this);\n      if (owner && !this.hasOwnProperty('_fastboot')) {\n        this._fastboot = owner.lookup('service:fastboot');\n      }\n      let store;\n      if (this.get('_isLocalStorageAvailable')) {\n        const localStorage = owner.lookup('session-store:local-storage');\n        const options = {\n          key: this.get('localStorageKey')\n        };\n        options._isFastBoot = false;\n        localStorage.setProperties(options);\n        store = localStorage;\n      } else {\n        const cookieStorage = owner.lookup('session-store:cookie');\n        const options = this.getProperties('sameSite', 'cookieDomain', 'cookieName', 'cookieExpirationTime', 'cookiePath');\n        cookieStorage.setProperties(options);\n        this.set('cookieExpirationTime', cookieStorage.get('cookieExpirationTime'));\n        store = cookieStorage;\n      }\n      this.set('_store', store);\n      this._setupStoreEvents(store);\n    },\n    _setupStoreEvents(store) {\n      store.on('sessionDataUpdated', data => {\n        this.trigger('sessionDataUpdated', data);\n      });\n      return store;\n    },\n    /**\n      Persists the `data` in the `localStorage` if it is available or in a cookie\n      if it is not.\n       @method persist\n      @param {Object} data The data to persist\n      @return {Ember.RSVP.Promise} A promise that resolves when the data has successfully been persisted and rejects otherwise.\n      @public\n    */\n    persist() {\n      return this.get('_store').persist(...arguments);\n    },\n    /**\n      Returns all data currently stored in the `localStorage` if that is\n      available - or if it is not, in the cookie - as a plain object.\n       @method restore\n      @return {Ember.RSVP.Promise} A promise that resolves with the data currently persisted in the store when the data has been restored successfully and rejects otherwise.\n      @public\n    */\n    restore() {\n      return this.get('_store').restore();\n    },\n    /**\n      Clears the store by deleting the\n      {{#crossLink \"LocalStorageStore/key:property\"}}{{/crossLink}} from\n      `localStorage` if that is available or by deleting the cookie if it is not.\n       @method clear\n      @return {Ember.RSVP.Promise} A promise that resolves when the store has been cleared successfully and rejects otherwise.\n      @public\n    */\n    clear() {\n      return this.get('_store').clear();\n    }\n  });\n  _exports.default = _default;\n  function testLocalStorageAvailable() {\n    try {\n      localStorage.setItem(LOCAL_STORAGE_TEST_KEY, true);\n      localStorage.removeItem(LOCAL_STORAGE_TEST_KEY);\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n});","define(\"ember-simple-auth/session-stores/base\", [\"exports\", \"rsvp\", \"@ember/object\", \"@ember/object/evented\"], function (_exports, _rsvp, _object, _evented) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n    The base class for all session stores. __This serves as a starting point for\n    implementing custom session stores and must not be used directly.__\n  \n    Session Stores persist the session's state so that it survives a page reload\n    and is synchronized across multiple tabs or windows of the same application.\n  \n    @class BaseStore\n    @module ember-simple-auth/session-stores/base\n    @extends Ember.Object\n    @uses Ember.Evented\n    @public\n  */\n  var _default = _object.default.extend(_evented.default, {\n    /**\n      Triggered when the session store's data changes due to an external event,\n      e.g., from another tab or window of the same application. The session\n      handles that event, passes the updated data to its authenticator's\n      {{#crossLink \"BaseAuthenticator/restore:method\"}}{{/crossLink}} method and\n      handles the result of that invocation accordingly.\n       @event sessionDataUpdated\n      @param {Object} data The updated session data\n      @public\n    */\n\n    /**\n      Persists the `data`. This replaces all currently stored data.\n       `BaseStores`'s implementation always returns a rejecting promise. __This\n      method must be overridden in subclasses__.\n       @method persist\n      @param {Object} data The data to persist\n      @return {Ember.RSVP.Promise} A promise that resolves when the data has successfully been persisted and rejects otherwise.\n      @public\n    */\n    persist() {\n      return _rsvp.default.reject();\n    },\n    /**\n      Returns all data currently stored as a plain object.\n       `BaseStores`'s implementation always returns a rejecting promise. __This\n      method must be overridden in subclasses__.\n       @method restore\n      @return {Ember.RSVP.Promise} A promise that resolves with the data currently persisted in the store when the data has been restored successfully and rejects otherwise.\n      @public\n    */\n    restore() {\n      return _rsvp.default.reject();\n    },\n    /**\n      Clears the store.\n       `BaseStores`'s implementation always returns a rejecting promise. __This\n      method must be overridden in subclasses__.\n       @method clear\n      @return {Ember.RSVP.Promise} A promise that resolves when the store has been cleared successfully and rejects otherwise.\n      @public\n    */\n    clear() {\n      return _rsvp.default.reject();\n    }\n  });\n  _exports.default = _default;\n});","define(\"ember-simple-auth/session-stores/cookie\", [\"exports\", \"rsvp\", \"@ember/object\", \"@ember/service\", \"@ember/runloop\", \"@ember/utils\", \"@ember/array\", \"@ember/application\", \"@ember/debug\", \"ember\", \"ember-simple-auth/session-stores/base\", \"ember-simple-auth/utils/objects-are-equal\"], function (_exports, _rsvp, _object, _service, _runloop, _utils, _array, _application, _debug, _ember, _base, _objectsAreEqual) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const persistingProperty = function () {\n    let beforeSet = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};\n    return (0, _object.computed)({\n      get(key) {\n        return this.get(`_${key}`);\n      },\n      set(key, value) {\n        beforeSet.apply(this, [key, value]);\n        this.set(`_${key}`, value);\n        (0, _runloop.scheduleOnce)('actions', this, this.rewriteCookie);\n        return value;\n      }\n    });\n  };\n\n  /**\n    Session store that persists data in a cookie.\n  \n    By default the cookie session store uses a session cookie that expires and is\n    deleted when the browser is closed. The cookie expiration period can be\n    configured by setting the\n    {{#crossLink \"CookieStore/cookieExpirationTime:property\"}}{{/crossLink}}\n    property. This can be used to implement \"remember me\" functionality that will\n    either store the session persistently or in a session cookie depending on\n    whether the user opted in or not:\n  \n    ```js\n    // app/controllers/login.js\n    import Controller from '@ember/controller';\n    import { inject as service } from '@ember/service';\n  \n    export default class LoginController extends Controller {\n      @service session;\n      _rememberMe = false;\n  \n      get rememberMe() {\n        return this._rememberMe;\n      }\n  \n      set rememberMe(value) {\n        let expirationTime = value ? (14 * 24 * 60 * 60) : null;\n        this.set('session.store.cookieExpirationTime', expirationTime);\n        this._rememberMe = value;\n      }\n    }\n    ```\n  \n    __Applications that use FastBoot must use this session store by defining the\n    application session store like this:__\n  \n    ```js\n    // app/session-stores/application.js\n    import CookieStore from 'ember-simple-auth/session-stores/cookie';\n  \n    export default class ApplicationSessionStore extends CookieStore {}\n    ```\n  \n    @class CookieStore\n    @module ember-simple-auth/session-stores/cookie\n    @extends BaseStore\n    @public\n  */\n  var _default = _base.default.extend({\n    _syncDataTimeout: null,\n    _renewExpirationTimeout: null,\n    /**\n      The domain to use for the cookie, e.g., \"example.com\", \".example.com\"\n      (which includes all subdomains) or \"subdomain.example.com\". If not\n      explicitly set, the cookie domain defaults to the domain the session was\n      authenticated on.\n       @property cookieDomain\n      @type String\n      @default null\n      @public\n    */\n    _cookieDomain: null,\n    cookieDomain: persistingProperty(),\n    /**\n      Allows servers to assert that a cookie ought not to be sent along with cross-site requests,\n      which provides some protection against cross-site request forgery attacks (CSRF).\n      Available options:\n      - \"Strict\"\n      - \"Lax\"\n      @property sameSite\n      @type String\n      @default null\n      @public\n    */\n    _sameSite: null,\n    sameSite: persistingProperty(),\n    /**\n      The name of the cookie.\n       @property cookieName\n      @type String\n      @default ember_simple_auth-session\n      @public\n    */\n    _cookieName: 'ember_simple_auth-session',\n    cookieName: persistingProperty(function () {\n      this._oldCookieName = this._cookieName;\n    }),\n    /**\n      The path to use for the cookie, e.g., \"/\", \"/something\".\n       @property cookiePath\n      @type String\n      @default '/'\n      @public\n    */\n    _cookiePath: '/',\n    cookiePath: persistingProperty(),\n    /**\n      The expiration time for the cookie in seconds. A value of `null` will make\n      the cookie a session cookie that expires and gets deleted when the browser\n      is closed.\n       The recommended minimum value is 90 seconds. If your value is less than\n      that, the cookie may expire before its expiration time is extended\n      (expiration time is extended every 60 seconds).\n       @property cookieExpirationTime\n      @default null\n      @type Integer\n      @public\n    */\n    _cookieExpirationTime: null,\n    cookieExpirationTime: persistingProperty(function (key, value) {\n      // When nulling expiry time on purpose, we need to clear the cached value.\n      // Otherwise, `_calculateExpirationTime` will reuse it.\n      if ((0, _utils.isNone)(value)) {\n        this.get('_cookies').clear(`${this.get('cookieName')}-expiration_time`);\n      } else if (value < 90) {\n        (true && (0, _debug.warn)('The recommended minimum value for `cookieExpirationTime` is 90 seconds. If your value is less than that, the cookie may expire before its expiration time is extended (expiration time is extended every 60 seconds).', false, {\n          id: 'ember-simple-auth.cookieExpirationTime'\n        }));\n      }\n    }),\n    _cookies: (0, _service.inject)('cookies'),\n    _secureCookies() {\n      if (this.get('_fastboot.isFastBoot')) {\n        return this.get('_fastboot.request.protocol') === 'https';\n      }\n      return window.location.protocol === 'https:';\n    },\n    _isPageVisible() {\n      if (this.get('_fastboot.isFastBoot')) {\n        return false;\n      } else {\n        const visibilityState = typeof document !== 'undefined' ? document.visibilityState || 'visible' : false;\n        return visibilityState === 'visible';\n      }\n    },\n    init() {\n      this._super(...arguments);\n      let owner = (0, _application.getOwner)(this);\n      if (owner && !this.hasOwnProperty('_fastboot')) {\n        this._fastboot = owner.lookup('service:fastboot');\n      }\n      let cachedExpirationTime = this._read(`${this.get('cookieName')}-expiration_time`);\n      if (cachedExpirationTime) {\n        this.set('cookieExpirationTime', parseInt(cachedExpirationTime, 10));\n      }\n      if (!this.get('_fastboot.isFastBoot')) {\n        (0, _runloop.next)(() => {\n          this._syncData().then(() => {\n            this._renewExpiration();\n          });\n        });\n      } else {\n        this._renew();\n      }\n    },\n    /**\n      Persists the `data` in the cookie.\n       @method persist\n      @param {Object} data The data to persist\n      @return {Ember.RSVP.Promise} A promise that resolves when the data has successfully been persisted and rejects otherwise.\n      @public\n    */\n    persist(data) {\n      this._lastData = data;\n      data = JSON.stringify(data || {});\n      let expiration = this._calculateExpirationTime();\n      this._write(data, expiration);\n      return _rsvp.default.resolve();\n    },\n    /**\n      Returns all data currently stored in the cookie as a plain object.\n       @method restore\n      @return {Ember.RSVP.Promise} A promise that resolves with the data currently persisted in the store when the data has been restored successfully and rejects otherwise.\n      @public\n    */\n    restore() {\n      let data = this._read(this.get('cookieName'));\n      if ((0, _utils.isEmpty)(data)) {\n        return _rsvp.default.resolve({});\n      } else {\n        return _rsvp.default.resolve(JSON.parse(data));\n      }\n    },\n    /**\n      Clears the store by deleting the cookie.\n       @method clear\n      @return {Ember.RSVP.Promise} A promise that resolves when the store has been cleared successfully and rejects otherwise.\n      @public\n    */\n    clear() {\n      this._write('', 0);\n      this._lastData = {};\n      return _rsvp.default.resolve();\n    },\n    _read(name) {\n      return this.get('_cookies').read(name) || '';\n    },\n    _calculateExpirationTime() {\n      let cachedExpirationTime = this._read(`${this.get('cookieName')}-expiration_time`);\n      cachedExpirationTime = cachedExpirationTime ? new Date().getTime() + cachedExpirationTime * 1000 : null;\n      return this.get('cookieExpirationTime') ? new Date().getTime() + this.get('cookieExpirationTime') * 1000 : cachedExpirationTime;\n    },\n    _write(value, expiration) {\n      let cookieOptions = {\n        domain: this.get('cookieDomain'),\n        expires: (0, _utils.isEmpty)(expiration) ? null : new Date(expiration),\n        path: this.get('cookiePath'),\n        secure: this._secureCookies(),\n        sameSite: this.get('sameSite')\n      };\n      if (this._oldCookieName) {\n        (0, _array.A)([this._oldCookieName, `${this._oldCookieName}-expiration_time`]).forEach(oldCookie => {\n          this.get('_cookies').clear(oldCookie);\n        });\n        delete this._oldCookieName;\n      }\n      this.get('_cookies').write(this.get('cookieName'), value, cookieOptions);\n      if (!(0, _utils.isEmpty)(expiration)) {\n        let expirationCookieName = `${this.get('cookieName')}-expiration_time`;\n        let cachedExpirationTime = this.get('_cookies').read(expirationCookieName);\n        this.get('_cookies').write(expirationCookieName, this.get('cookieExpirationTime') || cachedExpirationTime, cookieOptions);\n      }\n    },\n    _syncData() {\n      return this.restore().then(data => {\n        if (!(0, _objectsAreEqual.default)(data, this._lastData)) {\n          this._lastData = data;\n          this.trigger('sessionDataUpdated', data);\n        }\n        if (!_ember.default.testing) {\n          (0, _runloop.cancel)(this._syncDataTimeout);\n          this._syncDataTimeout = (0, _runloop.later)(this, this._syncData, 500);\n        }\n      });\n    },\n    _renew() {\n      return this.restore().then(data => {\n        if (!(0, _utils.isEmpty)(data) && !(data.constructor === Object && Object.keys(data).length === 0)) {\n          data = (0, _utils.typeOf)(data) === 'string' ? data : JSON.stringify(data || {});\n          let expiration = this._calculateExpirationTime();\n          this._write(data, expiration);\n        }\n      });\n    },\n    _renewExpiration() {\n      if (!_ember.default.testing) {\n        (0, _runloop.cancel)(this._renewExpirationTimeout);\n        this._renewExpirationTimeout = (0, _runloop.later)(this, this._renewExpiration, 60000);\n      }\n      if (this._isPageVisible()) {\n        return this._renew();\n      } else {\n        return _rsvp.default.resolve();\n      }\n    },\n    rewriteCookie() {\n      // if `cookieName` has not been renamed, `oldCookieName` will be nil\n      const cookieName = this._oldCookieName || this._cookieName;\n      const data = this._read(cookieName);\n      if ((0, _utils.isPresent)(data)) {\n        const expiration = this._calculateExpirationTime();\n        this._write(data, expiration);\n      }\n    }\n  });\n  _exports.default = _default;\n});","define(\"ember-simple-auth/session-stores/ephemeral\", [\"exports\", \"rsvp\", \"ember-simple-auth/session-stores/base\"], function (_exports, _rsvp, _base) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n    Session store that __persists data in memory and thus is not actually\n    persistent__. It does also not synchronize the session's state across\n    multiple tabs or windows as those cannot share memory. __This store is mainly\n    useful for testing and will automatically be used when running tests.__\n  \n    @class EphemeralStore\n    @module ember-simple-auth/session-stores/ephemeral\n    @extends BaseStore\n    @public\n  */\n  var _default = _base.default.extend({\n    init() {\n      this._super(...arguments);\n      this.clear();\n    },\n    /**\n      Persists `data`. This replaces all currently stored data.\n       @method persist\n      @param {Object} data The data to persist\n      @return {Ember.RSVP.Promise} A promise that resolves when the data has successfully been persisted and rejects otherwise.\n      @public\n    */\n    persist(data) {\n      this._data = JSON.stringify(data || {});\n      return _rsvp.default.resolve();\n    },\n    /**\n      Returns all data currently stored as a plain object.\n       @method restore\n      @return {Ember.RSVP.Promise} A promise that resolves with the data currently persisted in the store when the data has been restored successfully and rejects otherwise.\n      @public\n    */\n    restore() {\n      const data = JSON.parse(this._data) || {};\n      return _rsvp.default.resolve(data);\n    },\n    /**\n      Clears the store.\n       @method clear\n      @return {Ember.RSVP.Promise} A promise that resolves when the store has been cleared successfully and rejects otherwise.\n      @public\n    */\n    clear() {\n      delete this._data;\n      this._data = '{}';\n      return _rsvp.default.resolve();\n    }\n  });\n  _exports.default = _default;\n});","define(\"ember-simple-auth/session-stores/local-storage\", [\"exports\", \"rsvp\", \"@ember/runloop\", \"@ember/application\", \"ember-simple-auth/session-stores/base\", \"ember-simple-auth/utils/objects-are-equal\", \"ember-simple-auth/utils/is-fastboot\"], function (_exports, _rsvp, _runloop, _application, _base, _objectsAreEqual, _isFastboot) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n    Session store that persists data in the browser's `localStorage`.\n  \n    __`localStorage` is not available in Safari when running in private mode. In\n    general it is better to use the\n    {{#crossLink \"AdaptiveStore\"}}{{/crossLink}} that automatically falls back to\n    the {{#crossLink \"CookieStore\"}}{{/crossLink}} when `localStorage` is not\n    available.__\n  \n    __This session store does not work with FastBoot. In order to use Ember\n    Simple Auth with FastBoot, configure the\n    {{#crossLink \"CookieStore\"}}{{/crossLink}} as the application's session\n    store.__\n  \n    @class LocalStorageStore\n    @module ember-simple-auth/session-stores/local-storage\n    @extends BaseStore\n    @public\n  */\n  var _default = _base.default.extend({\n    /**\n      The `localStorage` key the store persists data in.\n       @property key\n      @type String\n      @default 'ember_simple_auth-session'\n      @public\n    */\n    key: 'ember_simple_auth-session',\n    init() {\n      this._super(...arguments);\n      this._isFastBoot = this.hasOwnProperty('_isFastBoot') ? this._isFastBoot : (0, _isFastboot.default)((0, _application.getOwner)(this));\n      this._boundHandler = (0, _runloop.bind)(this, this._handleStorageEvent);\n      if (!this.get('_isFastBoot')) {\n        window.addEventListener('storage', this._boundHandler);\n      }\n    },\n    willDestroy() {\n      if (!this.get('_isFastBoot')) {\n        window.removeEventListener('storage', this._boundHandler);\n      }\n    },\n    /**\n      Persists the `data` in the `localStorage`.\n       @method persist\n      @param {Object} data The data to persist\n      @return {Ember.RSVP.Promise} A promise that resolves when the data has successfully been persisted and rejects otherwise.\n      @public\n    */\n    persist(data) {\n      this._lastData = data;\n      data = JSON.stringify(data || {});\n      localStorage.setItem(this.key, data);\n      return _rsvp.default.resolve();\n    },\n    /**\n      Returns all data currently stored in the `localStorage` as a plain object.\n       @method restore\n      @return {Ember.RSVP.Promise} A promise that resolves with the data currently persisted in the store when the data has been restored successfully and rejects otherwise.\n      @public\n    */\n    restore() {\n      let data = localStorage.getItem(this.key);\n      return _rsvp.default.resolve(JSON.parse(data) || {});\n    },\n    /**\n      Clears the store by deleting the\n      {{#crossLink \"LocalStorageStore/key:property\"}}{{/crossLink}} from\n      `localStorage`.\n       @method clear\n      @return {Ember.RSVP.Promise} A promise that resolves when the store has been cleared successfully and rejects otherwise.\n      @public\n    */\n    clear() {\n      localStorage.removeItem(this.key);\n      this._lastData = {};\n      return _rsvp.default.resolve();\n    },\n    _handleStorageEvent(e) {\n      if (e.key === this.get('key')) {\n        this.restore().then(data => {\n          if (!(0, _objectsAreEqual.default)(data, this._lastData)) {\n            this._lastData = data;\n            this.trigger('sessionDataUpdated', data);\n          }\n        });\n      }\n    }\n  });\n  _exports.default = _default;\n});","define(\"ember-simple-auth/session-stores/session-storage\", [\"exports\", \"rsvp\", \"@ember/runloop\", \"@ember/application\", \"ember-simple-auth/session-stores/base\", \"ember-simple-auth/utils/objects-are-equal\", \"ember-simple-auth/utils/is-fastboot\"], function (_exports, _rsvp, _runloop, _application, _base, _objectsAreEqual, _isFastboot) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n    Session store that persists data in the browser's `sessionStorage`.\n  \n    __`sessionStorage` is not available in Safari when running in private mode.__\n  \n    __This session store does not work with FastBoot. In order to use Ember\n    Simple Auth with FastBoot, configure the\n    {{#crossLink \"CookieStore\"}}{{/crossLink}} as the application's session\n    store.__\n  \n    @class SessionStorageStore\n    @module ember-simple-auth/session-stores/session-storage\n    @extends BaseStore\n    @public\n  */\n  var _default = _base.default.extend({\n    /**\n      The `sessionStorage` key the store persists data in.\n       @property key\n      @type String\n      @default 'ember_simple_auth-session'\n      @public\n    */\n    key: 'ember_simple_auth-session',\n    init() {\n      this._super(...arguments);\n      this._isFastBoot = this.hasOwnProperty('_isFastBoot') ? this._isFastBoot : (0, _isFastboot.default)((0, _application.getOwner)(this));\n      if (!this.get('_isFastBoot')) {\n        window.addEventListener('storage', (0, _runloop.bind)(this, this._handleStorageEvent));\n      }\n    },\n    willDestroy() {\n      if (!this.get('_isFastBoot')) {\n        window.removeEventListener('storage', (0, _runloop.bind)(this, this._handleStorageEvent));\n      }\n    },\n    /**\n      Persists the `data` in the `sessionStorage`.\n       @method persist\n      @param {Object} data The data to persist\n      @return {Ember.RSVP.Promise} A promise that resolves when the data has successfully been persisted and rejects otherwise.\n      @public\n    */\n    persist(data) {\n      this._lastData = data;\n      data = JSON.stringify(data || {});\n      sessionStorage.setItem(this.key, data);\n      return _rsvp.default.resolve();\n    },\n    /**\n      Returns all data currently stored in the `sessionStorage` as a plain object.\n       @method restore\n      @return {Ember.RSVP.Promise} A promise that resolves with the data currently persisted in the store when the data has been restored successfully and rejects otherwise.\n      @public\n    */\n    restore() {\n      let data = sessionStorage.getItem(this.key);\n      return _rsvp.default.resolve(JSON.parse(data) || {});\n    },\n    /**\n      Clears the store by deleting the\n      {{#crossLink \"sessionStorageStore/key:property\"}}{{/crossLink}} from\n      `sessionStorage`.\n       @method clear\n      @return {Ember.RSVP.Promise} A promise that resolves when the store has been cleared successfully and rejects otherwise.\n      @public\n    */\n    clear() {\n      sessionStorage.removeItem(this.key);\n      this._lastData = {};\n      return _rsvp.default.resolve();\n    },\n    _handleStorageEvent(e) {\n      if (e.key === this.get('key')) {\n        this.restore().then(data => {\n          if (!(0, _objectsAreEqual.default)(data, this._lastData)) {\n            this._lastData = data;\n            this.trigger('sessionDataUpdated', data);\n          }\n        });\n      }\n    }\n  });\n  _exports.default = _default;\n});","define(\"ember-simple-auth/use-session-setup-method\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = true;\n  _exports.default = _default;\n});","define(\"ember-simple-auth/utils/assign\", [\"exports\", \"@ember/polyfills\"], function (_exports, _polyfills) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = Object.assign || _polyfills.assign;\n  _exports.default = _default;\n});","define(\"ember-simple-auth/utils/inject\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = _default;\n  function _default(registry, factoryNameOrType, property, injectionName) {\n    const inject = registry.inject || registry.injection;\n    inject.call(registry, factoryNameOrType, property, injectionName);\n  }\n});","define(\"ember-simple-auth/utils/is-fastboot\", [\"exports\", \"@ember/debug\", \"@ember/application/instance\"], function (_exports, _debug, _instance) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = isFastBoot;\n  /* eslint-disable no-unused-vars */\n  // @ts-check\n\n  function isFastBoot(owner) {\n    (true && !(owner && typeof owner.lookup === 'function') && (0, _debug.assert)('You must pass in an owner to isFastBoot!', owner && typeof owner.lookup === 'function'));\n    const fastboot = owner.lookup('service:fastboot');\n    return fastboot ? fastboot.get('isFastBoot') : false;\n  }\n});","define(\"ember-simple-auth/utils/location\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = () => window.location;\n  _exports.default = _default;\n});","define(\"ember-simple-auth/utils/objects-are-equal\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = objectsAreEqual;\n  function objectsAreEqual(a, b) {\n    function compare(x, y) {\n      let property;\n      if (isNaN(x) && isNaN(y) && typeof x === 'number' && typeof y === 'number') {\n        return true;\n      }\n      if (x === y) {\n        return true;\n      }\n      if (!(x instanceof Object && y instanceof Object)) {\n        return false;\n      }\n      for (property in y) {\n        if (y.hasOwnProperty(property) !== x.hasOwnProperty(property)) {\n          return false;\n        } else if (typeof y[property] !== typeof x[property]) {\n          return false;\n        }\n      }\n      for (property in x) {\n        if (y.hasOwnProperty(property) !== x.hasOwnProperty(property)) {\n          return false;\n        } else if (typeof y[property] !== typeof x[property]) {\n          return false;\n        }\n        switch (typeof x[property]) {\n          case 'object':\n            if (!compare(x[property], y[property])) {\n              return false;\n            }\n            break;\n          default:\n            if (x[property] !== y[property]) {\n              return false;\n            }\n            break;\n        }\n      }\n      return true;\n    }\n    return compare(a, b);\n  }\n});","define(\"ember-test-waiters/index\", [\"exports\", \"@ember/debug\", \"@ember/test-waiters\"], function (_exports, _debug, _testWaiters) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.keys(_testWaiters).forEach(function (key) {\n    if (key === \"default\" || key === \"__esModule\") return;\n    if (key in _exports && _exports[key] === _testWaiters[key]) return;\n    Object.defineProperty(_exports, key, {\n      enumerable: true,\n      get: function () {\n        return _testWaiters[key];\n      }\n    });\n  });\n  (true && !(false) && (0, _debug.deprecate)('Importing from ember-test-waiters is deprecated. Please import from @ember/test-waiters', false, {\n    id: 'ember-test-waiters-legacy-module-name',\n    until: '3.0.0',\n    for: 'ember-test-waiters',\n    since: {\n      enabled: '2.2.0'\n    }\n  }));\n});","define(\"ember-tracked-storage-polyfill/index\", [\"exports\", \"@glimmer/tracking\", \"@ember/debug\"], function (_exports, _tracking, _debug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.createStorage = createStorage;\n  _exports.getValue = getValue;\n  _exports.setValue = setValue;\n  var __decorate = void 0 && (void 0).__decorate || function (decorators, target, key, desc) {\n    var c = arguments.length,\n      r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n      d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n  };\n  class TrackedStorageImpl {\n    constructor(initialValue, isEqual) {\n      this._value = this._lastValue = initialValue;\n      this._isEqual = isEqual;\n    }\n  }\n  __decorate([_tracking.tracked], TrackedStorageImpl.prototype, \"_value\", void 0);\n  function tripleEq(a, b) {\n    return a === b;\n  }\n  function createStorage(initialValue) {\n    let isEqual = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : tripleEq;\n    (true && !(typeof isEqual === 'function') && (0, _debug.assert)('the second parameter to `createStorage` must be an equality function or undefined', typeof isEqual === 'function'));\n    return new TrackedStorageImpl(initialValue, isEqual);\n  }\n  function getValue(storage) {\n    (true && !(storage instanceof TrackedStorageImpl) && (0, _debug.assert)('getValue must be passed a tracked store created with `createStorage`.', storage instanceof TrackedStorageImpl));\n    return storage._value;\n  }\n  function setValue(storage, value) {\n    (true && !(storage instanceof TrackedStorageImpl) && (0, _debug.assert)('setValue must be passed a tracked store created with `createStorage`.', storage instanceof TrackedStorageImpl));\n    const {\n      _isEqual: isEqual,\n      _lastValue: lastValue\n    } = storage;\n    if (!isEqual(value, lastValue)) {\n      storage._value = storage._lastValue = value;\n    }\n  }\n});","define(\"ember-truth-helpers/helpers/and\", [\"exports\", \"@ember/component/helper\", \"ember-truth-helpers/utils/truth-convert\"], function (_exports, _helper, _truthConvert) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.and = and;\n  _exports.default = void 0;\n  function and(params) {\n    for (let i = 0, len = params.length; i < len; i++) {\n      if ((0, _truthConvert.default)(params[i]) === false) {\n        return params[i];\n      }\n    }\n    return params[params.length - 1];\n  }\n  var _default = (0, _helper.helper)(and);\n  _exports.default = _default;\n});","define(\"ember-truth-helpers/helpers/eq\", [\"exports\", \"ember-truth-helpers/helpers/equal\"], function (_exports, _equal) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _equal.default;\n    }\n  });\n  Object.defineProperty(_exports, \"equal\", {\n    enumerable: true,\n    get: function () {\n      return _equal.equal;\n    }\n  });\n});","define(\"ember-truth-helpers/helpers/equal\", [\"exports\", \"@ember/component/helper\"], function (_exports, _helper) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.equal = equal;\n  function equal(params) {\n    return params[0] === params[1];\n  }\n  var _default = (0, _helper.helper)(equal);\n  _exports.default = _default;\n});","define(\"ember-truth-helpers/helpers/gt\", [\"exports\", \"@ember/component/helper\"], function (_exports, _helper) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.gt = gt;\n  function gt(_ref, hash) {\n    let [left, right] = _ref;\n    if (hash.forceNumber) {\n      if (typeof left !== 'number') {\n        left = Number(left);\n      }\n      if (typeof right !== 'number') {\n        right = Number(right);\n      }\n    }\n    return left > right;\n  }\n  var _default = (0, _helper.helper)(gt);\n  _exports.default = _default;\n});","define(\"ember-truth-helpers/helpers/gte\", [\"exports\", \"@ember/component/helper\"], function (_exports, _helper) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.gte = gte;\n  function gte(_ref, hash) {\n    let [left, right] = _ref;\n    if (hash.forceNumber) {\n      if (typeof left !== 'number') {\n        left = Number(left);\n      }\n      if (typeof right !== 'number') {\n        right = Number(right);\n      }\n    }\n    return left >= right;\n  }\n  var _default = (0, _helper.helper)(gte);\n  _exports.default = _default;\n});","define(\"ember-truth-helpers/helpers/is-array\", [\"exports\", \"@ember/component/helper\", \"@ember/array\"], function (_exports, _helper, _array) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.isArray = isArray;\n  function isArray(params) {\n    for (let i = 0, len = params.length; i < len; i++) {\n      if ((0, _array.isArray)(params[i]) === false) {\n        return false;\n      }\n    }\n    return true;\n  }\n  var _default = (0, _helper.helper)(isArray);\n  _exports.default = _default;\n});","define(\"ember-truth-helpers/helpers/is-empty\", [\"exports\", \"@ember/component/helper\", \"@ember/utils\"], function (_exports, _helper, _utils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = (0, _helper.helper)(function (_ref) {\n    let [obj] = _ref;\n    return (0, _utils.isEmpty)(obj);\n  });\n  _exports.default = _default;\n});","define(\"ember-truth-helpers/helpers/is-equal\", [\"exports\", \"@ember/component/helper\", \"@ember/utils\"], function (_exports, _helper, _utils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.isEqual = isEqual;\n  function isEqual(_ref) {\n    let [a, b] = _ref;\n    return (0, _utils.isEqual)(a, b);\n  }\n  var _default = (0, _helper.helper)(isEqual);\n  _exports.default = _default;\n});","define(\"ember-truth-helpers/helpers/lt\", [\"exports\", \"@ember/component/helper\"], function (_exports, _helper) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.lt = lt;\n  function lt(_ref, hash) {\n    let [left, right] = _ref;\n    if (hash.forceNumber) {\n      if (typeof left !== 'number') {\n        left = Number(left);\n      }\n      if (typeof right !== 'number') {\n        right = Number(right);\n      }\n    }\n    return left < right;\n  }\n  var _default = (0, _helper.helper)(lt);\n  _exports.default = _default;\n});","define(\"ember-truth-helpers/helpers/lte\", [\"exports\", \"@ember/component/helper\"], function (_exports, _helper) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.lte = lte;\n  function lte(_ref, hash) {\n    let [left, right] = _ref;\n    if (hash.forceNumber) {\n      if (typeof left !== 'number') {\n        left = Number(left);\n      }\n      if (typeof right !== 'number') {\n        right = Number(right);\n      }\n    }\n    return left <= right;\n  }\n  var _default = (0, _helper.helper)(lte);\n  _exports.default = _default;\n});","define(\"ember-truth-helpers/helpers/not-eq\", [\"exports\", \"ember-truth-helpers/helpers/not-equal\"], function (_exports, _notEqual) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _notEqual.default;\n    }\n  });\n  Object.defineProperty(_exports, \"notEqualHelper\", {\n    enumerable: true,\n    get: function () {\n      return _notEqual.notEqualHelper;\n    }\n  });\n});","define(\"ember-truth-helpers/helpers/not-equal\", [\"exports\", \"@ember/component/helper\"], function (_exports, _helper) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.notEqualHelper = notEqualHelper;\n  function notEqualHelper(params) {\n    return params[0] !== params[1];\n  }\n  var _default = (0, _helper.helper)(notEqualHelper);\n  _exports.default = _default;\n});","define(\"ember-truth-helpers/helpers/not\", [\"exports\", \"@ember/component/helper\", \"ember-truth-helpers/utils/truth-convert\"], function (_exports, _helper, _truthConvert) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.not = not;\n  function not(params) {\n    for (let i = 0, len = params.length; i < len; i++) {\n      if ((0, _truthConvert.default)(params[i]) === true) {\n        return false;\n      }\n    }\n    return true;\n  }\n  var _default = (0, _helper.helper)(not);\n  _exports.default = _default;\n});","define(\"ember-truth-helpers/helpers/or\", [\"exports\", \"@ember/component/helper\", \"ember-truth-helpers/utils/truth-convert\"], function (_exports, _helper, _truthConvert) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.or = or;\n  function or(params) {\n    for (let i = 0, len = params.length; i < len; i++) {\n      if ((0, _truthConvert.default)(params[i]) === true) {\n        return params[i];\n      }\n    }\n    return params[params.length - 1];\n  }\n  var _default = (0, _helper.helper)(or);\n  _exports.default = _default;\n});","define(\"ember-truth-helpers/helpers/xor\", [\"exports\", \"@ember/component/helper\", \"ember-truth-helpers/utils/truth-convert\"], function (_exports, _helper, _truthConvert) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.xor = xor;\n  function xor(params) {\n    return (0, _truthConvert.default)(params[0]) !== (0, _truthConvert.default)(params[1]);\n  }\n  var _default = (0, _helper.helper)(xor);\n  _exports.default = _default;\n});","define(\"ember-truth-helpers/utils/truth-convert\", [\"exports\", \"@ember/array\", \"@ember/object\"], function (_exports, _array, _object) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = truthConvert;\n  function truthConvert(result) {\n    const truthy = result && (0, _object.get)(result, 'isTruthy');\n    if (typeof truthy === 'boolean') {\n      return truthy;\n    }\n    if ((0, _array.isArray)(result)) {\n      return (0, _object.get)(result, 'length') !== 0;\n    } else {\n      return !!result;\n    }\n  }\n});","define(\"ember-uuid/index\", [\"exports\", \"ember-uuid/utils/uuid-generator\"], function (_exports, _uuidGenerator) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"parse\", {\n    enumerable: true,\n    get: function () {\n      return _uuidGenerator.parse;\n    }\n  });\n  Object.defineProperty(_exports, \"unparse\", {\n    enumerable: true,\n    get: function () {\n      return _uuidGenerator.unparse;\n    }\n  });\n  Object.defineProperty(_exports, \"v1\", {\n    enumerable: true,\n    get: function () {\n      return _uuidGenerator.v1;\n    }\n  });\n  Object.defineProperty(_exports, \"v4\", {\n    enumerable: true,\n    get: function () {\n      return _uuidGenerator.v4;\n    }\n  });\n});","define(\"ember-uuid/utils/browser-rng\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n   * Based on code from node-uuid.\n   */\n\n  let rng;\n  if (window && window.crypto && window.crypto.getRandomValues) {\n    // WHATWG crypto-based RNG - http://wiki.whatwg.org/wiki/Crypto\n    // Moderately fast, high quality\n    let _rnds8 = new Uint8Array(16);\n    rng = function whatwgRNG() {\n      window.crypto.getRandomValues(_rnds8);\n      return _rnds8;\n    };\n  }\n  if (!rng) {\n    // Math.random()-based (RNG)\n    //\n    // If all else fails, use Math.random().  It's fast, but is of unspecified\n    // quality.\n    let _rnds = new Array(16);\n    rng = function () {\n      for (let i = 0, r; i < 16; i++) {\n        if ((i & 0x03) === 0) {\n          r = Math.random() * 0x100000000;\n        }\n        _rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;\n      }\n      return _rnds;\n    };\n  }\n  var _default = rng;\n  _exports.default = _default;\n});","define(\"ember-uuid/utils/uuid-generator\", [\"exports\", \"ember-uuid/utils/browser-rng\"], function (_exports, _browserRng) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  _exports.parse = parse;\n  _exports.unparse = unparse;\n  _exports.v1 = v1;\n  _exports.v4 = v4;\n  //     uuid.js\n  //\n  //     Copyright (c) 2010-2012 Robert Kieffer\n  //     MIT License - http://opensource.org/licenses/mit-license.php\n\n  // Unique ID creation requires a high quality random # generator.  We feature\n  // detect to determine the best RNG source, normalizing to a function that\n  // returns 128-bits of randomness, since that's what's usually required\n  // var _rng = require('./rng');\n\n  // Maps for number <-> hex string conversion\n  var _byteToHex = [];\n  var _hexToByte = {};\n  for (var i = 0; i < 256; i++) {\n    _byteToHex[i] = (i + 0x100).toString(16).substr(1);\n    _hexToByte[_byteToHex[i]] = i;\n  }\n\n  // **`parse()` - Parse a UUID into it's component bytes**\n  function parse(s, buf, offset) {\n    var i = buf && offset || 0,\n      ii = 0;\n    buf = buf || [];\n    s.toLowerCase().replace(/[0-9a-f]{2}/g, function (oct) {\n      if (ii < 16) {\n        // Don't overflow!\n        buf[i + ii++] = _hexToByte[oct];\n      }\n    });\n\n    // Zero out remaining bytes if string was short\n    while (ii < 16) {\n      buf[i + ii++] = 0;\n    }\n    return buf;\n  }\n\n  // **`unparse()` - Convert UUID byte array (ala parse()) into a string**\n  function unparse(buf, offset) {\n    var i = offset || 0,\n      bth = _byteToHex;\n    return bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + '-' + bth[buf[i++]] + bth[buf[i++]] + '-' + bth[buf[i++]] + bth[buf[i++]] + '-' + bth[buf[i++]] + bth[buf[i++]] + '-' + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]];\n  }\n\n  // **`v1()` - Generate time-based UUID**\n  //\n  // Inspired by https://github.com/LiosK/UUID.js\n  // and http://docs.python.org/library/uuid.html\n\n  // random #'s we need to init node and clockseq\n  var _seedBytes = (0, _browserRng.default)();\n\n  // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n  var _nodeId = [_seedBytes[0] | 0x01, _seedBytes[1], _seedBytes[2], _seedBytes[3], _seedBytes[4], _seedBytes[5]];\n\n  // Per 4.2.2, randomize (14 bit) clockseq\n  var _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 0x3fff;\n\n  // Previous uuid creation time\n  var _lastMSecs = 0,\n    _lastNSecs = 0;\n\n  // See https://github.com/broofa/node-uuid for API details\n  function v1(options, buf, offset) {\n    var i = buf && offset || 0;\n    var b = buf || [];\n    options = options || {};\n    var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq;\n\n    // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n    // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so\n    // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n    // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n    var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime();\n\n    // Per 4.2.1.2, use count of uuid's generated during the current clock\n    // cycle to simulate higher resolution clock\n    var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1;\n\n    // Time since last uuid creation (in msecs)\n    var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000;\n\n    // Per 4.2.1.2, Bump clockseq on clock regression\n    if (dt < 0 && options.clockseq === undefined) {\n      clockseq = clockseq + 1 & 0x3fff;\n    }\n\n    // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n    // time interval\n    if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n      nsecs = 0;\n    }\n\n    // Per 4.2.1.2 Throw error if too many uuids are requested\n    if (nsecs >= 10000) {\n      throw new Error('uuid.v1(): Can\\'t create more than 10M uuids/sec');\n    }\n    _lastMSecs = msecs;\n    _lastNSecs = nsecs;\n    _clockseq = clockseq;\n\n    // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n    msecs += 12219292800000;\n\n    // `time_low`\n    var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n    b[i++] = tl >>> 24 & 0xff;\n    b[i++] = tl >>> 16 & 0xff;\n    b[i++] = tl >>> 8 & 0xff;\n    b[i++] = tl & 0xff;\n\n    // `time_mid`\n    var tmh = msecs / 0x100000000 * 10000 & 0xfffffff;\n    b[i++] = tmh >>> 8 & 0xff;\n    b[i++] = tmh & 0xff;\n\n    // `time_high_and_version`\n    b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n    b[i++] = tmh >>> 16 & 0xff;\n\n    // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n    b[i++] = clockseq >>> 8 | 0x80;\n\n    // `clock_seq_low`\n    b[i++] = clockseq & 0xff;\n\n    // `node`\n    var node = options.node || _nodeId;\n    for (var n = 0; n < 6; n++) {\n      b[i + n] = node[n];\n    }\n    return buf ? buf : unparse(b);\n  }\n\n  // **`v4()` - Generate random UUID**\n\n  // See https://github.com/broofa/node-uuid for API details\n  function v4(options, buf, offset) {\n    // Deprecated - 'format' argument, as supported in v1.2\n    var i = buf && offset || 0;\n    if (typeof options === 'string') {\n      buf = options === 'binary' ? new Array(16) : null;\n      options = null;\n    }\n    options = options || {};\n    var rnds = options.random || (options.rng || _browserRng.default)();\n\n    // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n    rnds[6] = rnds[6] & 0x0f | 0x40;\n    rnds[8] = rnds[8] & 0x3f | 0x80;\n\n    // Copy bytes to buffer, if provided\n    if (buf) {\n      for (var ii = 0; ii < 16; ii++) {\n        buf[i + ii] = rnds[ii];\n      }\n    }\n    return buf || unparse(rnds);\n  }\n  var _default = {\n    v1: v1,\n    v4: v4,\n    parse: parse,\n    unparse: unparse\n  };\n  _exports.default = _default;\n});","define(\"ember-websockets/helpers\", [\"exports\", \"urijs\"], function (_exports, _urijs) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.cleanURL = cleanURL;\n  _exports.normalizeURL = normalizeURL;\n  0; //eaimeta@70e063a35619d71f0,\"urijs\"eaimeta@70e063a35619d71f\n  /*\n   * The native websocket object will transform urls without a pathname to have just a /.\n   * As an example: ws://localhost:8080 would actually be ws://localhost:8080/ but ws://example.com/foo would not\n   * change. This function does this transformation to stay inline with the native websocket implementation.\n   */\n  function normalizeURL(url) {\n    const parsedUrl = new _urijs.default(url);\n    const path = parsedUrl.path();\n    const query = parsedUrl.query();\n    if (path === '/') {\n      if (query === '' && url.slice(-1) !== '/') {\n        return url + '/';\n      }\n      if (query !== '' && url.indexOf('/?') === -1) {\n        return url.replace('?', '/?');\n      }\n    }\n    return url;\n  }\n\n  /*\n   * Since the url will be used as a key will need to make sure that it does not\n   * contain '.' as it will throw ember off\n   */\n  function cleanURL(url) {\n    return url.replace(/\\./g, '');\n  }\n});","define(\"ember-websockets/helpers/socketio-proxy\", [\"exports\", \"@ember/debug\", \"@ember/object/proxy\", \"@ember/runloop\"], function (_exports, _debug, _proxy, _runloop) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/debug\",0,\"@ember/object/proxy\",0,\"@ember/runloop\"eaimeta@70e063a35619d71f\n  var _default = _proxy.default.extend({\n    /*\n     * {\n     *    url: 'String'\n     *    type: 'String'\n     *    callback: The function to envoke\n     *    context: The context of the function\n     *    ref: The actual callback function with is given to socketio\n     * }\n     */\n    listeners: null,\n    init() {\n      this._super(...arguments);\n      this.listeners = [];\n    },\n    /*\n     * This method simply passes the arguments to the socketio on method except it binds the callback function to\n     * the run loop.\n     */\n    on(type, callback, context) {\n      (true && !(typeof callback === 'function') && (0, _debug.assert)('The second argument must be a function.', typeof callback === 'function'));\n      const boundCallback = (0, _runloop.bind)(context, callback);\n      this.listeners.push({\n        url: this.socket.io.uri,\n        type,\n        callback,\n        context,\n        ref: boundCallback\n      });\n      this.socket.on(type, boundCallback);\n    },\n    off(type, callback) {\n      (true && !(typeof callback === 'function') && (0, _debug.assert)('The second argument must be a function.', typeof callback === 'function'));\n      const listeners = this.listeners.filter(listener => listener.callback === callback && listener.url === this.socket.io.uri && listener.type === type);\n      if (listeners) {\n        listeners.forEach(item => this.socket.off(type, item.ref));\n      }\n      this.listeners = this.listeners.filter(l => listeners.indexOf(l) === -1);\n    },\n    /*\n     * This method passes the argument to the socketio emit method.\n     */\n    emit() {\n      this.socket.emit.apply(this.socket, arguments);\n    },\n    close() {\n      this.listeners = this.listeners.filter(listener => listener.url === this.socket.io.uri);\n      this.socket.close.apply(this.socket, arguments);\n    },\n    send() {\n      this.socket.send.apply(this.socket, arguments);\n    },\n    connect() {\n      this.socket.connect.apply(this.socket, arguments);\n    }\n  });\n  _exports.default = _default;\n});","define(\"ember-websockets/helpers/websocket-proxy\", [\"exports\", \"@ember/runloop\", \"@ember/debug\", \"@ember/object/proxy\"], function (_exports, _runloop, _debug, _proxy) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/runloop\",0,\"@ember/debug\",0,\"@ember/object/proxy\"eaimeta@70e063a35619d71f\n  const events = ['close', 'error', 'message', 'open'];\n  const {\n    filter,\n    indexOf,\n    forEach\n  } = Array.prototype;\n  var _default = _proxy.default.extend({\n    /*\n     * {\n     *    url: 'String'\n     *    type: 'String' (such as 'open', 'message', 'close', and 'error')\n     *    callback: The function to envoke\n     *    context: The context of the function\n     * }\n     */\n    listeners: null,\n    init() {\n      this._super(...arguments);\n      this.listeners = [];\n      this.setupInternalListeners();\n    },\n    /*\n     * Adds a callback function into the listeners array which will\n     * be invoked later whenever a given `type` event happens.\n     *\n     * type: must be either 'open', 'message', 'close', 'error'\n     */\n    on(type, callback, context) {\n      (true && !(indexOf.call(events, type) !== -1) && (0, _debug.assert)(`${type} is not a recognized event name. Please use on of the following: ${events.join(', ')}`, indexOf.call(events, type) !== -1));\n      (true && !(typeof callback === 'function') && (0, _debug.assert)('The second argument must be a function.', typeof callback === 'function'));\n      this.listeners.push({\n        url: this.socket.url,\n        type,\n        callback,\n        context\n      });\n    },\n    /*\n     * Removes a callback function from the listeners array. This callback\n     * will not longer be invoked when the given `type` event happens.\n     */\n    off(type, callback) {\n      this.listeners = filter.call(this.listeners, listeners => !(listeners.callback === callback && listeners.type === type));\n    },\n    /*\n     * Message is the message which will be passed into the native websockets send method\n     * and shouldStringify is a boolean which determines if we should call JSON.stringify on\n     * the message.\n     */\n    send(message) {\n      let shouldStringify = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n      if (shouldStringify && JSON && JSON.stringify) {\n        message = JSON.stringify(message);\n      }\n      (true && !(this.readyState() === WebSocket.OPEN) && (0, _debug.assert)('Cannot send message to the websocket while it is not open.', this.readyState() === WebSocket.OPEN));\n      this.socket.send(message);\n    },\n    close() {\n      this.socket.close();\n    },\n    reconnect() {\n      this.set('socket', new WebSocket(this.socket.url, this.protocols));\n      this.setupInternalListeners();\n    },\n    setupInternalListeners() {\n      forEach.call(events, eventName => {\n        this.socket[`on${eventName}`] = event => {\n          (0, _runloop.run)(() => {\n            var activeListeners = filter.call(this.listeners, listener => {\n              return listener.url === event.currentTarget.url && listener.type === eventName;\n            });\n\n            // TODO: filter active listeners for contexts that are not destroyed\n            forEach.call(activeListeners, item => {\n              if (item.context) {\n                item.callback.call(item.context, event);\n              } else {\n                item.callback(event);\n              }\n            });\n          });\n        };\n      });\n    },\n    /*\n     * A helper method to get access to the readyState of the websocket.\n     */\n    readyState() {\n      return this.socket.readyState;\n    }\n  });\n  _exports.default = _default;\n});","define(\"ember-websockets/services/socket-io\", [\"exports\", \"ember-websockets/services/websockets\", \"ember-websockets/helpers/socketio-proxy\"], function (_exports, _websockets, _socketioProxy) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  0; //eaimeta@70e063a35619d71f0,\"ember-websockets/services/websockets\",0,\"ember-websockets/helpers/socketio-proxy\"eaimeta@70e063a35619d71f\n  class SocketIOService extends _websockets.default {\n    isWebSocketOpen(socket) {\n      return socket.io.readyState !== 'closed';\n    }\n    createSocket(url) {\n      let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      const newSocketIO = io(url, options);\n      newSocketIO.connect();\n      return newSocketIO;\n    }\n    createProxy(socket) {\n      return _socketioProxy.default.create({\n        content: this,\n        socket\n      });\n    }\n  }\n  _exports.default = SocketIOService;\n});","define(\"ember-websockets/services/websockets\", [\"exports\", \"@ember/service\", \"@ember/object\", \"ember-websockets/helpers/websocket-proxy\", \"ember-websockets/helpers\"], function (_exports, _service, _object, _websocketProxy, _helpers) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _dec, _class;\n  0; //eaimeta@70e063a35619d71f0,\"@ember/service\",0,\"@ember/object\",0,\"ember-websockets/helpers/websocket-proxy\",0,\"ember-websockets/helpers\"eaimeta@70e063a35619d71f\n  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }\n  let WebSocketService = (_dec = (0, _object.computed)(), _class = class WebSocketService extends _service.default {\n    /*\n      A hash of open websocket connections. This\n      allows multiple components to share the same connection.\n       {\n        'websocket-url': WebSocket Proxy object\n      }\n    */\n    get sockets() {\n      return {};\n    }\n\n    /*\n      socketFor returns a websocket proxy object. On this object there is a property `socket`\n      which contains the actual websocket object. This websocket object is cached based off of the url meaning\n      multiple requests for the same socket will return the same object.\n    */\n    socketFor(url) {\n      let protocols = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n      /*\n        Websockets allows either a string or array of strings to be passed as the second argument.\n        Normalize both cases into an array of strings so we can just deal with arrays.\n      */\n      if (typeof protocols === 'string') {\n        protocols = [protocols];\n      }\n\n      /*\n        Normalize the url as native websockets add a / to the end of the url:\n        http://example.com:8000 becomes: http://example.com:8000/\n         Since the url will be used as a key will need to make sure that it does not\n        contain '.' as it will throw ember off\n      */\n      const normalizedUrl = (0, _helpers.normalizeURL)(url);\n      const cleanedUrl = (0, _helpers.cleanURL)(normalizedUrl);\n\n      /*\n       */\n      const existingProxy = (0, _object.get)(this, `sockets.${cleanedUrl}`);\n      if (existingProxy && this.isWebSocketOpen(existingProxy.socket)) {\n        return existingProxy;\n      }\n\n      /*\n        we can get to this place if the websocket has been closed and we are trying to reopen\n        or we are creating a proxy for the first time\n      */\n      const newWebSocket = this.createSocket(normalizedUrl, protocols);\n      if (existingProxy) {\n        /*\n          If there is an existing socket in place we simply update the websocket object and not\n          the whole proxy as we dont want to destroy the previous listeners.\n        */\n        (0, _object.set)(existingProxy, 'socket', newWebSocket);\n        return existingProxy;\n      }\n      const newProxy = this.createProxy(newWebSocket, protocols);\n      (0, _object.set)(this, `sockets.${cleanedUrl}`, newProxy);\n      return newProxy;\n    }\n    closeSocketFor(url) {\n      const cleanedUrl = (0, _helpers.cleanURL)((0, _helpers.normalizeURL)(url));\n      const existingSocket = (0, _object.get)(this, `sockets.${cleanedUrl}`);\n      if (existingSocket) {\n        existingSocket.socket.close();\n      }\n      delete this.sockets[cleanedUrl];\n    }\n    isWebSocketOpen(websocket) {\n      return websocket.readyState !== WebSocket.CLOSED;\n    }\n    createSocket(url, options) {\n      return new WebSocket(url, options);\n    }\n    createProxy(socket, protocols) {\n      return _websocketProxy.default.create({\n        content: this,\n        protocols,\n        socket\n      });\n    }\n  }, _applyDecoratedDescriptor(_class.prototype, \"sockets\", [_dec], Object.getOwnPropertyDescriptor(_class.prototype, \"sockets\"), _class.prototype), _class);\n  _exports.default = WebSocketService;\n});","define(\"tracked-built-ins/-private/array\", [\"exports\", \"ember-tracked-storage-polyfill\"], function (_exports, _emberTrackedStoragePolyfill) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); }\n  function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }\n  function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError(\"Cannot initialize the same private elements twice on an object\"); } }\n  function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"get\"); return _classApplyDescriptorGet(receiver, descriptor); }\n  function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError(\"attempted to \" + action + \" private field on non-instance\"); } return privateMap.get(receiver); }\n  function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }\n  function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError(\"attempted to get private field on non-instance\"); } return fn; } /* eslint-disable @typescript-eslint/no-explicit-any */ // Unfortunately, TypeScript's ability to do inference *or* type-checking in a\n  // `Proxy`'s body is very limited, so we have to use a number of casts `as any`\n  // to make the internal accesses work. The type safety of these is guaranteed at\n  // the *call site* instead of within the body: you cannot do `Array.blah` in TS,\n  // and it will blow up in JS in exactly the same way, so it is safe to assume\n  // that properties within the getter have the correct type in TS.\n  const ARRAY_GETTER_METHODS = new Set([Symbol.iterator, 'concat', 'entries', 'every', 'fill', 'filter', 'find', 'findIndex', 'flat', 'flatMap', 'forEach', 'includes', 'indexOf', 'join', 'keys', 'lastIndexOf', 'map', 'reduce', 'reduceRight', 'slice', 'some', 'values']);\n\n  // For these methods, `Array` itself immediately gets the `.length` to return\n  // after invoking them.\n  const ARRAY_WRITE_THEN_READ_METHODS = new Set(['push', 'unshift']);\n  function convertToInt(prop) {\n    if (typeof prop === 'symbol') return null;\n    const num = Number(prop);\n    if (isNaN(num)) return null;\n    return num % 1 === 0 ? num : null;\n  }\n  var _collection = /*#__PURE__*/new WeakMap();\n  var _storages = /*#__PURE__*/new WeakMap();\n  var _readStorageFor = /*#__PURE__*/new WeakSet();\n  var _dirtyStorageFor = /*#__PURE__*/new WeakSet();\n  class TrackedArray {\n    /**\n     * Creates an array from an iterable object.\n     * @param iterable An iterable object to convert to an array.\n     */\n\n    /**\n     * Creates an array from an iterable object.\n     * @param iterable An iterable object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of 'this' used to invoke the mapfn.\n     */\n\n    static from(iterable, mapfn, thisArg) {\n      return mapfn ? new TrackedArray(Array.from(iterable, mapfn, thisArg)) : new TrackedArray(Array.from(iterable));\n    }\n    static of() {\n      for (var _len = arguments.length, arr = new Array(_len), _key = 0; _key < _len; _key++) {\n        arr[_key] = arguments[_key];\n      }\n      return new TrackedArray(arr);\n    }\n    constructor() {\n      let arr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n      _classPrivateMethodInitSpec(this, _dirtyStorageFor);\n      _classPrivateMethodInitSpec(this, _readStorageFor);\n      _classPrivateFieldInitSpec(this, _collection, {\n        writable: true,\n        value: (0, _emberTrackedStoragePolyfill.createStorage)(null, () => false)\n      });\n      _classPrivateFieldInitSpec(this, _storages, {\n        writable: true,\n        value: new Map()\n      });\n      let clone = arr.slice();\n      // eslint-disable-next-line @typescript-eslint/no-this-alias\n      let self = this;\n      let boundFns = new Map();\n\n      /**\n        Flag to track whether we have *just* intercepted a call to `.push()` or\n        `.unshift()`, since in those cases (and only those cases!) the `Array`\n        itself checks `.length` to return from the function call.\n       */\n      let nativelyAccessingLengthFromPushOrUnshift = false;\n      return new Proxy(clone, {\n        get(target, prop /*, _receiver */) {\n          let index = convertToInt(prop);\n          if (index !== null) {\n            _classPrivateMethodGet(self, _readStorageFor, _readStorageFor2).call(self, index);\n            (0, _emberTrackedStoragePolyfill.getValue)(_classPrivateFieldGet(self, _collection));\n            return target[index];\n          }\n          if (prop === 'length') {\n            // If we are reading `.length`, it may be a normal user-triggered\n            // read, or it may be a read triggered by Array itself. In the latter\n            // case, it is because we have just done `.push()` or `.unshift()`; in\n            // that case it is safe not to mark this as a *read* operation, since\n            // calling `.push()` or `.unshift()` cannot otherwise be part of a\n            // \"read\" operation safely, and if done during an *existing* read\n            // (e.g. if the user has already checked `.length` *prior* to this),\n            // that will still trigger the mutation-after-consumption assertion.\n            if (nativelyAccessingLengthFromPushOrUnshift) {\n              nativelyAccessingLengthFromPushOrUnshift = false;\n            } else {\n              (0, _emberTrackedStoragePolyfill.getValue)(_classPrivateFieldGet(self, _collection));\n            }\n            return target[prop];\n          }\n\n          // Here, track that we are doing a `.push()` or `.unshift()` by setting\n          // the flag to `true` so that when the `.length` is read by `Array` (see\n          // immediately above), it knows not to dirty the collection.\n          if (ARRAY_WRITE_THEN_READ_METHODS.has(prop)) {\n            nativelyAccessingLengthFromPushOrUnshift = true;\n          }\n          if (ARRAY_GETTER_METHODS.has(prop)) {\n            let fn = boundFns.get(prop);\n            if (fn === undefined) {\n              fn = function () {\n                (0, _emberTrackedStoragePolyfill.getValue)(_classPrivateFieldGet(self, _collection));\n                return target[prop](...arguments);\n              };\n              boundFns.set(prop, fn);\n            }\n            return fn;\n          }\n          return target[prop];\n        },\n        set(target, prop, value /*, _receiver */) {\n          target[prop] = value;\n          let index = convertToInt(prop);\n          if (index !== null) {\n            _classPrivateMethodGet(self, _dirtyStorageFor, _dirtyStorageFor2).call(self, index);\n            (0, _emberTrackedStoragePolyfill.setValue)(_classPrivateFieldGet(self, _collection), null);\n          } else if (prop === 'length') {\n            (0, _emberTrackedStoragePolyfill.setValue)(_classPrivateFieldGet(self, _collection), null);\n          }\n          return true;\n        },\n        getPrototypeOf() {\n          return TrackedArray.prototype;\n        }\n      });\n    }\n  }\n\n  // This rule is correct in the general case, but it doesn't understand\n  // declaration merging, which is how we're using the interface here. This says\n  // `TrackedArray` acts just like `Array<T>`, but also has the properties\n  // declared via the `class` declaration above -- but without the cost of a\n  // subclass, which is much slower that the proxied array behavior. That is: a\n  // `TrackedArray` *is* an `Array`, just with a proxy in front of accessors and\n  // setters, rather than a subclass of an `Array` which would be de-optimized by\n  // the browsers.\n  //\n  // eslint-disable-next-line @typescript-eslint/no-empty-interface\n  function _readStorageFor2(index) {\n    let storage = _classPrivateFieldGet(this, _storages).get(index);\n    if (storage === undefined) {\n      storage = (0, _emberTrackedStoragePolyfill.createStorage)(null, () => false);\n      _classPrivateFieldGet(this, _storages).set(index, storage);\n    }\n    (0, _emberTrackedStoragePolyfill.getValue)(storage);\n  }\n  function _dirtyStorageFor2(index) {\n    const storage = _classPrivateFieldGet(this, _storages).get(index);\n    if (storage) {\n      (0, _emberTrackedStoragePolyfill.setValue)(storage, null);\n    }\n  }\n  var _default = TrackedArray; // Ensure instanceof works correctly\n  _exports.default = _default;\n  Object.setPrototypeOf(TrackedArray.prototype, Array.prototype);\n});","define(\"tracked-built-ins/-private/decorator\", [\"exports\", \"@glimmer/tracking\", \"@ember/debug\", \"tracked-built-ins/-private/map\", \"tracked-built-ins/-private/set\", \"tracked-built-ins/-private/array\", \"tracked-built-ins/-private/object\"], function (_exports, _tracking, _debug, _map, _set, _array, _object) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = tracked;\n  function tracked(obj, key, desc) {\n    if (key !== undefined && desc !== undefined) {\n      return (0, _tracking.tracked)(obj, key, desc);\n    }\n    if (Array.isArray(obj)) {\n      return new _array.default(obj);\n    }\n    switch (obj) {\n      case Object:\n        return new _object.default();\n      case Array:\n        return new _array.default();\n      case Map:\n        return new _map.TrackedMap();\n      case WeakMap:\n        return new _map.TrackedWeakMap();\n      case Set:\n        return new _set.TrackedSet();\n      case WeakSet:\n        return new _set.TrackedWeakSet();\n    }\n    if (obj instanceof Map) {\n      return new _map.TrackedMap(obj);\n    } else if (obj instanceof WeakMap) {\n      return new _map.TrackedWeakMap();\n    } else if (obj instanceof Set) {\n      return new _set.TrackedSet(obj);\n    } else if (obj instanceof WeakSet) {\n      return new _set.TrackedWeakSet();\n    } else {\n      (true && !(typeof obj === 'object' && obj !== null) && (0, _debug.assert)(`You must either use tracked as a field decorator, or to wrap built-in class instances:\n\n      class Example {\n        @tracked field = 123;\n\n        map = tracked(Map);\n        map = tracked(new Map());\n      }`, typeof obj === 'object' && obj !== null));\n      return new _object.default(obj);\n    }\n  }\n});","define(\"tracked-built-ins/-private/map\", [\"exports\", \"ember-tracked-storage-polyfill\"], function (_exports, _emberTrackedStoragePolyfill) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.TrackedWeakMap = _exports.TrackedMap = void 0;\n  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n  function _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\n  function _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n  class TrackedMap {\n    readStorageFor(key) {\n      const {\n        storages\n      } = this;\n      let storage = storages.get(key);\n      if (storage === undefined) {\n        storage = (0, _emberTrackedStoragePolyfill.createStorage)(null, () => false);\n        storages.set(key, storage);\n      }\n      (0, _emberTrackedStoragePolyfill.getValue)(storage);\n    }\n    dirtyStorageFor(key) {\n      const storage = this.storages.get(key);\n      if (storage) {\n        (0, _emberTrackedStoragePolyfill.setValue)(storage, null);\n      }\n    }\n    constructor(existing) {\n      _defineProperty(this, \"collection\", (0, _emberTrackedStoragePolyfill.createStorage)(null, () => false));\n      _defineProperty(this, \"storages\", new Map());\n      _defineProperty(this, \"vals\", void 0);\n      // TypeScript doesn't correctly resolve the overloads for calling the `Map`\n      // constructor for the no-value constructor. This resolves that.\n      this.vals = existing ? new Map(existing) : new Map();\n    }\n\n    // **** KEY GETTERS ****\n    get(key) {\n      // entangle the storage for the key\n      this.readStorageFor(key);\n      return this.vals.get(key);\n    }\n    has(key) {\n      this.readStorageFor(key);\n      return this.vals.has(key);\n    }\n\n    // **** ALL GETTERS ****\n    entries() {\n      (0, _emberTrackedStoragePolyfill.getValue)(this.collection);\n      return this.vals.entries();\n    }\n    keys() {\n      (0, _emberTrackedStoragePolyfill.getValue)(this.collection);\n      return this.vals.keys();\n    }\n    values() {\n      (0, _emberTrackedStoragePolyfill.getValue)(this.collection);\n      return this.vals.values();\n    }\n    forEach(fn) {\n      (0, _emberTrackedStoragePolyfill.getValue)(this.collection);\n      this.vals.forEach(fn);\n    }\n    get size() {\n      (0, _emberTrackedStoragePolyfill.getValue)(this.collection);\n      return this.vals.size;\n    }\n    [Symbol.iterator]() {\n      (0, _emberTrackedStoragePolyfill.getValue)(this.collection);\n      return this.vals[Symbol.iterator]();\n    }\n    get [Symbol.toStringTag]() {\n      return this.vals[Symbol.toStringTag];\n    }\n\n    // **** KEY SETTERS ****\n    set(key, value) {\n      this.dirtyStorageFor(key);\n      (0, _emberTrackedStoragePolyfill.setValue)(this.collection, null);\n      this.vals.set(key, value);\n      return this;\n    }\n    delete(key) {\n      this.dirtyStorageFor(key);\n      (0, _emberTrackedStoragePolyfill.setValue)(this.collection, null);\n      return this.vals.delete(key);\n    }\n\n    // **** ALL SETTERS ****\n    clear() {\n      this.storages.forEach(s => (0, _emberTrackedStoragePolyfill.setValue)(s, null));\n      (0, _emberTrackedStoragePolyfill.setValue)(this.collection, null);\n      this.vals.clear();\n    }\n  }\n\n  // So instanceof works\n  _exports.TrackedMap = TrackedMap;\n  Object.setPrototypeOf(TrackedMap.prototype, Map.prototype);\n  class TrackedWeakMap {\n    readStorageFor(key) {\n      const {\n        storages\n      } = this;\n      let storage = storages.get(key);\n      if (storage === undefined) {\n        storage = (0, _emberTrackedStoragePolyfill.createStorage)(null, () => false);\n        storages.set(key, storage);\n      }\n      (0, _emberTrackedStoragePolyfill.getValue)(storage);\n    }\n    dirtyStorageFor(key) {\n      const storage = this.storages.get(key);\n      if (storage) {\n        (0, _emberTrackedStoragePolyfill.setValue)(storage, null);\n      }\n    }\n    constructor(existing) {\n      _defineProperty(this, \"storages\", new WeakMap());\n      _defineProperty(this, \"vals\", void 0);\n      // TypeScript doesn't correctly resolve the overloads for calling the `Map`\n      // constructor for the no-value constructor. This resolves that.\n      this.vals = existing ? new WeakMap(existing) : new WeakMap();\n    }\n    get(key) {\n      this.readStorageFor(key);\n      return this.vals.get(key);\n    }\n    has(key) {\n      this.readStorageFor(key);\n      return this.vals.has(key);\n    }\n    set(key, value) {\n      this.dirtyStorageFor(key);\n      this.vals.set(key, value);\n      return this;\n    }\n    delete(key) {\n      this.dirtyStorageFor(key);\n      return this.vals.delete(key);\n    }\n    get [Symbol.toStringTag]() {\n      return this.vals[Symbol.toStringTag];\n    }\n  }\n\n  // So instanceof works\n  _exports.TrackedWeakMap = TrackedWeakMap;\n  Object.setPrototypeOf(TrackedWeakMap.prototype, WeakMap.prototype);\n});","define(\"tracked-built-ins/-private/object\", [\"exports\", \"ember-tracked-storage-polyfill\"], function (_exports, _emberTrackedStoragePolyfill) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); }\n  function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }\n  function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError(\"Cannot initialize the same private elements twice on an object\"); } }\n  function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"get\"); return _classApplyDescriptorGet(receiver, descriptor); }\n  function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError(\"attempted to \" + action + \" private field on non-instance\"); } return privateMap.get(receiver); }\n  function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }\n  function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError(\"attempted to get private field on non-instance\"); } return fn; }\n  var _storages = /*#__PURE__*/new WeakMap();\n  var _collection = /*#__PURE__*/new WeakMap();\n  var _readStorageFor = /*#__PURE__*/new WeakSet();\n  var _dirtyStorageFor = /*#__PURE__*/new WeakSet();\n  var _dirtyCollection = /*#__PURE__*/new WeakSet();\n  class TrackedObject {\n    static fromEntries(entries) {\n      return new TrackedObject(Object.fromEntries(entries));\n    }\n    constructor() {\n      let obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      _classPrivateMethodInitSpec(this, _dirtyCollection);\n      _classPrivateMethodInitSpec(this, _dirtyStorageFor);\n      _classPrivateMethodInitSpec(this, _readStorageFor);\n      _classPrivateFieldInitSpec(this, _storages, {\n        writable: true,\n        value: new Map()\n      });\n      _classPrivateFieldInitSpec(this, _collection, {\n        writable: true,\n        value: (0, _emberTrackedStoragePolyfill.createStorage)(null, () => false)\n      });\n      let proto = Object.getPrototypeOf(obj);\n      let descs = Object.getOwnPropertyDescriptors(obj);\n      let clone = Object.create(proto);\n      for (let prop in descs) {\n        Object.defineProperty(clone, prop, descs[prop]);\n      }\n\n      // eslint-disable-next-line @typescript-eslint/no-this-alias\n      let self = this;\n      return new Proxy(clone, {\n        get(target, prop) {\n          _classPrivateMethodGet(self, _readStorageFor, _readStorageFor2).call(self, prop);\n          return target[prop];\n        },\n        has(target, prop) {\n          _classPrivateMethodGet(self, _readStorageFor, _readStorageFor2).call(self, prop);\n          return prop in target;\n        },\n        ownKeys(target) {\n          (0, _emberTrackedStoragePolyfill.getValue)(_classPrivateFieldGet(self, _collection));\n          return Reflect.ownKeys(target);\n        },\n        set(target, prop, value) {\n          target[prop] = value;\n          _classPrivateMethodGet(self, _dirtyStorageFor, _dirtyStorageFor2).call(self, prop);\n          _classPrivateMethodGet(self, _dirtyCollection, _dirtyCollection2).call(self);\n          return true;\n        },\n        deleteProperty(target, prop) {\n          if (prop in target) {\n            delete target[prop];\n            _classPrivateMethodGet(self, _dirtyStorageFor, _dirtyStorageFor2).call(self, prop);\n            _classPrivateMethodGet(self, _dirtyCollection, _dirtyCollection2).call(self);\n          }\n          return true;\n        },\n        getPrototypeOf() {\n          return TrackedObject.prototype;\n        }\n      });\n    }\n  }\n  _exports.default = TrackedObject;\n  function _readStorageFor2(key) {\n    let storage = _classPrivateFieldGet(this, _storages).get(key);\n    if (storage === undefined) {\n      storage = (0, _emberTrackedStoragePolyfill.createStorage)(null, () => false);\n      _classPrivateFieldGet(this, _storages).set(key, storage);\n    }\n    (0, _emberTrackedStoragePolyfill.getValue)(storage);\n  }\n  function _dirtyStorageFor2(key) {\n    const storage = _classPrivateFieldGet(this, _storages).get(key);\n    if (storage) {\n      (0, _emberTrackedStoragePolyfill.setValue)(storage, null);\n    }\n  }\n  function _dirtyCollection2() {\n    (0, _emberTrackedStoragePolyfill.setValue)(_classPrivateFieldGet(this, _collection), null);\n  }\n});","define(\"tracked-built-ins/-private/set\", [\"exports\", \"ember-tracked-storage-polyfill\"], function (_exports, _emberTrackedStoragePolyfill) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.TrackedWeakSet = _exports.TrackedSet = void 0;\n  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n  function _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\n  function _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n  class TrackedSet {\n    storageFor(key) {\n      const storages = this.storages;\n      let storage = storages.get(key);\n      if (storage === undefined) {\n        storage = (0, _emberTrackedStoragePolyfill.createStorage)(null, () => false);\n        storages.set(key, storage);\n      }\n      return storage;\n    }\n    dirtyStorageFor(key) {\n      const storage = this.storages.get(key);\n      if (storage) {\n        (0, _emberTrackedStoragePolyfill.setValue)(storage, null);\n      }\n    }\n    constructor(existing) {\n      _defineProperty(this, \"collection\", (0, _emberTrackedStoragePolyfill.createStorage)(null, () => false));\n      _defineProperty(this, \"storages\", new Map());\n      _defineProperty(this, \"vals\", void 0);\n      this.vals = new Set(existing);\n    }\n\n    // **** KEY GETTERS ****\n    has(value) {\n      (0, _emberTrackedStoragePolyfill.getValue)(this.storageFor(value));\n      return this.vals.has(value);\n    }\n\n    // **** ALL GETTERS ****\n    entries() {\n      (0, _emberTrackedStoragePolyfill.getValue)(this.collection);\n      return this.vals.entries();\n    }\n    keys() {\n      (0, _emberTrackedStoragePolyfill.getValue)(this.collection);\n      return this.vals.keys();\n    }\n    values() {\n      (0, _emberTrackedStoragePolyfill.getValue)(this.collection);\n      return this.vals.values();\n    }\n    forEach(fn) {\n      (0, _emberTrackedStoragePolyfill.getValue)(this.collection);\n      this.vals.forEach(fn);\n    }\n    get size() {\n      (0, _emberTrackedStoragePolyfill.getValue)(this.collection);\n      return this.vals.size;\n    }\n    [Symbol.iterator]() {\n      (0, _emberTrackedStoragePolyfill.getValue)(this.collection);\n      return this.vals[Symbol.iterator]();\n    }\n    get [Symbol.toStringTag]() {\n      return this.vals[Symbol.toStringTag];\n    }\n\n    // **** KEY SETTERS ****\n    add(value) {\n      this.dirtyStorageFor(value);\n      (0, _emberTrackedStoragePolyfill.setValue)(this.collection, null);\n      this.vals.add(value);\n      return this;\n    }\n    delete(value) {\n      this.dirtyStorageFor(value);\n      (0, _emberTrackedStoragePolyfill.setValue)(this.collection, null);\n      return this.vals.delete(value);\n    }\n\n    // **** ALL SETTERS ****\n    clear() {\n      this.storages.forEach(s => (0, _emberTrackedStoragePolyfill.setValue)(s, null));\n      (0, _emberTrackedStoragePolyfill.setValue)(this.collection, null);\n      this.vals.clear();\n    }\n  }\n\n  // So instanceof works\n  _exports.TrackedSet = TrackedSet;\n  Object.setPrototypeOf(TrackedSet.prototype, Set.prototype);\n  class TrackedWeakSet {\n    storageFor(key) {\n      const storages = this.storages;\n      let storage = storages.get(key);\n      if (storage === undefined) {\n        storage = (0, _emberTrackedStoragePolyfill.createStorage)(null, () => false);\n        storages.set(key, storage);\n      }\n      return storage;\n    }\n    dirtyStorageFor(key) {\n      const storage = this.storages.get(key);\n      if (storage) {\n        (0, _emberTrackedStoragePolyfill.setValue)(storage, null);\n      }\n    }\n    constructor(values) {\n      _defineProperty(this, \"storages\", new WeakMap());\n      _defineProperty(this, \"vals\", void 0);\n      this.vals = new WeakSet(values);\n    }\n    has(value) {\n      (0, _emberTrackedStoragePolyfill.getValue)(this.storageFor(value));\n      return this.vals.has(value);\n    }\n    add(value) {\n      // Add to vals first to get better error message\n      this.vals.add(value);\n      this.dirtyStorageFor(value);\n      return this;\n    }\n    delete(value) {\n      this.dirtyStorageFor(value);\n      return this.vals.delete(value);\n    }\n    get [Symbol.toStringTag]() {\n      return this.vals[Symbol.toStringTag];\n    }\n  }\n\n  // So instanceof works\n  _exports.TrackedWeakSet = TrackedWeakSet;\n  Object.setPrototypeOf(TrackedWeakSet.prototype, WeakSet.prototype);\n});","define(\"tracked-built-ins/index\", [\"exports\", \"tracked-built-ins/-private/decorator\", \"tracked-built-ins/-private/array\", \"tracked-built-ins/-private/object\", \"tracked-built-ins/-private/map\", \"tracked-built-ins/-private/set\"], function (_exports, _decorator, _array, _object, _map, _set) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"TrackedArray\", {\n    enumerable: true,\n    get: function () {\n      return _array.default;\n    }\n  });\n  Object.defineProperty(_exports, \"TrackedMap\", {\n    enumerable: true,\n    get: function () {\n      return _map.TrackedMap;\n    }\n  });\n  Object.defineProperty(_exports, \"TrackedObject\", {\n    enumerable: true,\n    get: function () {\n      return _object.default;\n    }\n  });\n  Object.defineProperty(_exports, \"TrackedSet\", {\n    enumerable: true,\n    get: function () {\n      return _set.TrackedSet;\n    }\n  });\n  Object.defineProperty(_exports, \"TrackedWeakMap\", {\n    enumerable: true,\n    get: function () {\n      return _map.TrackedWeakMap;\n    }\n  });\n  Object.defineProperty(_exports, \"TrackedWeakSet\", {\n    enumerable: true,\n    get: function () {\n      return _set.TrackedWeakSet;\n    }\n  });\n  Object.defineProperty(_exports, \"tracked\", {\n    enumerable: true,\n    get: function () {\n      return _decorator.default;\n    }\n  });\n});","\n"],"names":["root","factory","exports","module","define","amd","self","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Emitter","obj","mixin","on","addEventListener","event","fn","this","_callbacks","push","once","off","apply","arguments","removeListener","removeAllListeners","removeEventListener","length","cb","callbacks","splice","emit","args","Array","len","slice","listeners","hasListeners","encodePacket","require","decodePacket","SEPARATOR","String","fromCharCode","protocol","encodePayload","packets","callback","encodedPackets","count","forEach","packet","encodedPacket","join","decodePayload","encodedPayload","binaryType","split","decodedPacket","type","window","Function","parser","Transport","opts","query","readyState","socket","msg","desc","err","Error","description","doOpen","doClose","onClose","write","writable","data","onPacket","encode","str","encodeURIComponent","decode","qs","qry","pairs","pair","decodeURIComponent","Decoder","Encoder","PacketType","binary_1","is_binary_1","EVENT","ACK","hasBinary","encodeAsString","BINARY_EVENT","BINARY_ACK","encodeAsBinary","attachments","nsp","id","JSON","stringify","deconstruction","deconstructPacket","pack","buffers","unshift","decodeString","reconstructor","BinaryReconstructor","isBinary","base64","takeBinaryData","Number","charAt","undefined","start","buf","substring","next","payload","parse","e","tryParse","substr","isPayloadValid","finishedReconstruction","CONNECT","DISCONNECT","CONNECT_ERROR","isArray","reconPack","binData","reconstructPacket","re","parts","src","b","indexOf","replace","exec","uri","source","host","authority","ipv6uri","pathNames","path","names","queryKey","$0","$1","$2","Manager","eio","socket_1","on_1","Backoff","nsps","subs","reconnection","reconnectionAttempts","Infinity","reconnectionDelay","reconnectionDelayMax","randomizationFactor","backoff","min","max","jitter","timeout","_readyState","_parser","encoder","decoder","_autoConnect","autoConnect","open","v","_reconnection","_reconnectionAttempts","_a","_reconnectionDelay","setMin","_randomizationFactor","setJitter","_reconnectionDelayMax","setMax","_timeout","_reconnecting","attempts","reconnect","engine","skipReconnect","openSubDestroy","onopen","errorSub","cleanup","maybeReconnectOnOpen","timer","setTimeout","close","clearTimeout","onping","ondata","onerror","onclose","ondecoded","add","Socket","keys","active","_close","options","subDestroy","destroy","reset","reason","delay","duration","onreconnect","attempt","XMLHttpRequest","XHR","JSONP","websocket","polling","xd","xs","jsonp","location","isSSL","port","hostname","secure","xdomain","xscheme","forceJSONP","hasCORS","globalThis","enablesXDR","XDomainRequest","concat","parseqs","yeast","Polling","poll","onPause","pause","total","doPoll","index","onOpen","doWrite","schema","timestampRequests","timestampParam","supportsBinary","sid","b64","PACKET_TYPES","PACKET_TYPES_REVERSE","ERROR_PACKET","prev","alphabet","map","seed","num","encoded","Math","floor","now","Date","decoded","pick","attr","reduce","acc","k","socket_io_parser_1","RESERVED_EVENTS","freeze","connect","connect_error","disconnect","disconnecting","newListener","io","receiveBuffer","sendBuffer","ids","acks","flags","connected","disconnected","auth","onpacket","subEvents","ev","compress","pop","isTransportWritable","transport","discardPacket","_packet","onconnect","onevent","onack","ondisconnect","message","ack","emitEvent","_anyListeners","sent","emitBuffered","listener","withNativeArrayBuffer","ArrayBuffer","toString","withNativeBlob","Blob","withNativeFile","File","isView","buffer","toJSON","url_1","manager_1","lookup","cache","managers","parsed","url","sameNamespace","forceNew","multiplex","manager_2","parseuri","loc","test","ipv6","href","transports","writeBuffer","prevBufferLen","agent","withCredentials","upgrade","rememberUpgrade","rejectUnauthorized","perMessageDeflate","threshold","transportOptions","upgrades","pingInterval","pingTimeout","pingTimeoutTimer","clone","EIO","priorWebsocketSuccess","createTransport","shift","setTransport","onDrain","onError","probe","failed","onTransportOpen","onlyBinaryUpgrades","upgradeLosesBinary","send","upgrading","flush","freezeTransport","error","onTransportClose","onupgrade","to","onHandshake","resetPingTimeout","sendPacket","code","filterUpgrades","cleanupAndClose","waitForUpgrade","pingIntervalTimer","filteredUpgrades","j","empty","hasXHR2","responseType","forceBase64","Request","req","request","method","onData","pollXhr","async","xhr","extraHeaders","setDisableHeaderCheck","setRequestHeader","requestTimeout","hasXDR","onload","onLoad","responseText","onreadystatechange","status","document","requestsCount","requests","onSuccess","fromError","abort","attachEvent","unloadHandler","encodeBlobAsBase64","fileReader","FileReader","content","result","readAsDataURL","base64decoder","decodeBase64Packet","mapBinary","chars","arraybuffer","bytes","Uint8Array","encoded1","encoded2","encoded3","encoded4","bufferLength","rNewline","rEscapedNewline","JSONPPolling","___eio","script","parentNode","removeChild","form","iframe","createElement","insertAt","getElementsByTagName","insertBefore","head","body","appendChild","navigator","userAgent","area","iframeId","className","style","position","top","left","target","setAttribute","complete","initIframe","html","action","submit","WebSocket","usingBrowserWebSocket","defaultBinaryType","isReactNative","product","toLowerCase","WS","check","protocols","headers","ws","addEventListeners","onmessage","Buffer","byteLength","MozWebSocket","packetData","_deconstructPacket","placeholder","_placeholder","newData","_reconstructPacket","ms","factor","pow","rand","random","deviation","window","document","navigator","timeoutDuration","longerTimeoutBrowsers","i","length","isBrowser","userAgent","indexOf","microtaskDebounce","fn","called","Promise","resolve","then","taskDebounce","scheduled","supportsMicroTasks","isFunction","functionToCheck","getType","toString","call","getStyleComputedProperty","element","property","nodeType","ownerDocument","defaultView","css","getComputedStyle","getParentNode","nodeName","parentNode","host","getScrollParent","body","overflow","overflowX","overflowY","test","getReferenceNode","reference","referenceNode","isIE11","MSInputMethodContext","documentMode","isIE10","isIE","version","getOffsetParent","documentElement","noOffsetParent","offsetParent","nextElementSibling","isOffsetContainer","firstElementChild","getRoot","node","findCommonOffsetParent","element1","element2","order","compareDocumentPosition","Node","DOCUMENT_POSITION_FOLLOWING","start","end","range","createRange","setStart","setEnd","commonAncestorContainer","contains","element1root","getScroll","side","upperSide","html","scrollingElement","includeScroll","rect","subtract","scrollTop","scrollLeft","modifier","top","bottom","left","right","getBordersSize","styles","axis","sideA","sideB","parseFloat","getSize","computedStyle","Math","max","parseInt","getWindowSizes","getClientRect","offsets","width","height","getBoundingClientRect","e","result","sizes","clientWidth","clientHeight","horizScrollbar","offsetWidth","vertScrollbar","offsetHeight","getOffsetRectRelativeToArbitraryNode","children","parent","fixedPosition","runIsIE","isHTML","childrenRect","parentRect","scrollParent","borderTopWidth","borderLeftWidth","marginTop","marginLeft","getViewportOffsetRectRelativeToArtbitraryNode","excludeScroll","relativeOffset","innerWidth","innerHeight","offset","isFixed","getFixedPositionOffsetParent","parentElement","el","getBoundaries","popper","padding","boundariesElement","boundaries","boundariesNode","isPaddingNumber","getArea","computeAutoPlacement","placement","refRect","rects","sortedAreas","Object","keys","map","key","sort","a","b","area","filteredAreas","filter","computedPlacement","variation","split","getReferenceOffsets","state","commonOffsetParent","getOuterSizes","x","marginBottom","y","marginRight","getOppositePlacement","hash","replace","matched","getPopperOffsets","referenceOffsets","popperRect","popperOffsets","isHoriz","mainSide","secondarySide","measurement","secondaryMeasurement","find","arr","check","Array","prototype","findIndex","prop","value","cur","match","obj","runModifiers","modifiers","data","ends","modifiersToRun","undefined","slice","forEach","warn","enabled","update","isDestroyed","options","positionFixed","flip","originalPlacement","position","isCreated","onCreate","onUpdate","isModifierEnabled","modifierName","some","name","getSupportedPropertyName","prefixes","upperProp","charAt","toUpperCase","prefix","toCheck","style","destroy","removeAttribute","willChange","disableEventListeners","removeOnDestroy","removeChild","getWindow","attachToScrollParents","event","callback","scrollParents","isBody","target","addEventListener","passive","push","setupEventListeners","updateBound","scrollElement","eventsEnabled","enableEventListeners","scheduleUpdate","removeEventListeners","removeEventListener","isNumeric","n","isNaN","isFinite","setStyles","unit","setAttributes","attributes","setAttribute","applyStyle","instance","arrowElement","arrowStyles","applyStyleOnLoad","modifierOptions","getRoundedOffsets","shouldRound","round","floor","noRound","v","referenceWidth","popperWidth","isVertical","isVariation","sameWidthParity","bothOddWidth","horizontalToInteger","verticalToInteger","isFirefox","computeStyle","legacyGpuAccelerationOption","gpuAcceleration","offsetParentRect","devicePixelRatio","prefixedProperty","invertTop","invertLeft","arrow","isModifierRequired","requestingName","requestedName","requesting","isRequired","requested","querySelector","len","sideCapitalized","toLowerCase","altSide","opSide","arrowElementSize","center","popperMarginSide","popperBorderSide","sideValue","min","getOppositeVariation","validPlacements","placements","clockwise","counter","index","concat","reverse","BEHAVIORS","flipped","placementOpposite","flipOrder","behavior","FLIP","CLOCKWISE","COUNTERCLOCKWISE","step","refOffsets","overlapsRef","overflowsLeft","overflowsRight","overflowsTop","overflowsBottom","overflowsBoundaries","flippedVariationByRef","flipVariations","flippedVariationByContent","flipVariationsByContent","flippedVariation","keepTogether","toValue","str","size","parseOffset","basePlacement","useHeight","fragments","frag","trim","divider","search","splitRegex","ops","op","mergeWithPrevious","reduce","index2","preventOverflow","transformProp","popperStyles","transform","priority","escapeWithReference","shift","shiftvariation","shiftOffsets","hide","bound","inner","subtractLength","Popper","requestAnimationFrame","debounce","bind","Defaults","jquery","onLoad","Utils","global","PopperUtils","getStyleComputedProperty","element","property","nodeType","window","ownerDocument","defaultView","css","getComputedStyle","getParentNode","nodeName","parentNode","host","getScrollParent","document","body","overflow","overflowX","overflowY","test","getReferenceNode","reference","referenceNode","navigator","isIE11","isBrowser","MSInputMethodContext","documentMode","isIE10","userAgent","isIE","version","getOffsetParent","documentElement","noOffsetParent","offsetParent","nextElementSibling","indexOf","isOffsetContainer","firstElementChild","getRoot","node","findCommonOffsetParent","element1","element2","order","compareDocumentPosition","Node","DOCUMENT_POSITION_FOLLOWING","start","end","range","createRange","setStart","setEnd","commonAncestorContainer","contains","element1root","getScroll","side","upperSide","html","scrollingElement","includeScroll","rect","subtract","scrollTop","scrollLeft","modifier","top","bottom","left","right","getBordersSize","styles","axis","sideA","sideB","parseFloat","getSize","computedStyle","Math","max","parseInt","getWindowSizes","getClientRect","offsets","width","height","getBoundingClientRect","e","result","sizes","clientWidth","clientHeight","horizScrollbar","offsetWidth","vertScrollbar","offsetHeight","getOffsetRectRelativeToArbitraryNode","children","parent","fixedPosition","runIsIE","isHTML","childrenRect","parentRect","scrollParent","borderTopWidth","borderLeftWidth","marginTop","marginLeft","getViewportOffsetRectRelativeToArtbitraryNode","excludeScroll","relativeOffset","innerWidth","innerHeight","offset","isFixed","getFixedPositionOffsetParent","parentElement","el","getBoundaries","popper","padding","boundariesElement","boundaries","boundariesNode","isPaddingNumber","getArea","computeAutoPlacement","placement","refRect","rects","sortedAreas","Object","keys","map","key","sort","a","b","area","filteredAreas","filter","computedPlacement","length","variation","split","timeoutDuration","longerTimeoutBrowsers","i","microtaskDebounce","fn","called","Promise","resolve","then","taskDebounce","scheduled","supportsMicroTasks","find","arr","check","Array","prototype","findIndex","prop","value","cur","match","obj","getOffsetRect","elementRect","offsetLeft","offsetTop","getOuterSizes","x","marginBottom","y","marginRight","getOppositePlacement","hash","replace","matched","getPopperOffsets","referenceOffsets","popperRect","popperOffsets","isHoriz","mainSide","secondarySide","measurement","secondaryMeasurement","getReferenceOffsets","state","commonOffsetParent","getSupportedPropertyName","prefixes","upperProp","charAt","toUpperCase","slice","prefix","toCheck","style","isFunction","functionToCheck","getType","toString","call","isModifierEnabled","modifiers","modifierName","some","name","enabled","isModifierRequired","requestingName","requestedName","requesting","isRequired","requested","warn","isNumeric","n","isNaN","isFinite","getWindow","removeEventListeners","removeEventListener","updateBound","scrollParents","forEach","scrollElement","eventsEnabled","runModifiers","data","ends","modifiersToRun","undefined","setAttributes","attributes","setAttribute","removeAttribute","setStyles","unit","attachToScrollParents","event","callback","isBody","target","addEventListener","passive","push","setupEventListeners","options","TRANSITION_END","MAX_UID","MILLISECONDS_MULTIPLIER","toType","obj","toString","call","match","toLowerCase","getSpecialTransitionEndEvent","bindType","delegateType","handle","event","$","target","is","handleObj","handler","apply","arguments","undefined","transitionEndEmulator","duration","called","one","Util","setTimeout","triggerTransitionEnd","setTransitionEndSupport","fn","emulateTransitionEnd","special","getUID","prefix","Math","random","document","getElementById","getSelectorFromElement","element","selector","getAttribute","hrefAttr","trim","querySelector","_","getTransitionDurationFromElement","transitionDuration","css","transitionDelay","floatTransitionDuration","parseFloat","floatTransitionDelay","split","reflow","offsetHeight","trigger","supportsTransitionEnd","Boolean","isElement","nodeType","typeCheckConfig","componentName","config","configTypes","property","Object","prototype","hasOwnProperty","expectedTypes","value","valueType","RegExp","test","Error","toUpperCase","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","parentNode","jQueryDetection","TypeError","version","jquery","minMajor","ltMajor","minMinor","minPatch","maxMajor","NAME","VERSION","DATA_KEY","EVENT_KEY","DATA_API_KEY","JQUERY_NO_CONFLICT","CLASS_NAME_ALERT","CLASS_NAME_FADE","CLASS_NAME_SHOW","EVENT_CLOSE","EVENT_CLOSED","EVENT_CLICK_DATA_API","SELECTOR_DISMISS","Alert","_element","close","rootElement","_getRootElement","customEvent","_triggerCloseEvent","isDefaultPrevented","_removeElement","dispose","removeData","parent","closest","closeEvent","Event","removeClass","hasClass","_destroyElement","detach","remove","_jQueryInterface","each","$element","data","_handleDismiss","alertInstance","preventDefault","on","Constructor","noConflict","CLASS_NAME_ACTIVE","CLASS_NAME_BUTTON","CLASS_NAME_FOCUS","EVENT_FOCUS_BLUR_DATA_API","EVENT_LOAD_DATA_API","SELECTOR_DATA_TOGGLE_CARROT","SELECTOR_DATA_TOGGLES","SELECTOR_DATA_TOGGLE","SELECTOR_DATA_TOGGLES_BUTTONS","SELECTOR_INPUT","SELECTOR_ACTIVE","SELECTOR_BUTTON","Button","shouldAvoidTriggerChange","toggle","triggerChangeEvent","addAriaPressed","input","type","checked","classList","contains","activeElement","focus","hasAttribute","setAttribute","toggleClass","avoidTriggerChange","button","initialButton","inputBtn","tagName","window","buttons","slice","querySelectorAll","i","len","length","add","ARROW_LEFT_KEYCODE","ARROW_RIGHT_KEYCODE","TOUCHEVENT_COMPAT_WAIT","SWIPE_THRESHOLD","CLASS_NAME_CAROUSEL","CLASS_NAME_SLIDE","CLASS_NAME_RIGHT","CLASS_NAME_LEFT","CLASS_NAME_NEXT","CLASS_NAME_PREV","CLASS_NAME_POINTER_EVENT","DIRECTION_NEXT","DIRECTION_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","EVENT_SLIDE","EVENT_SLID","EVENT_KEYDOWN","EVENT_MOUSEENTER","EVENT_MOUSELEAVE","EVENT_TOUCHSTART","EVENT_TOUCHMOVE","EVENT_TOUCHEND","EVENT_POINTERDOWN","EVENT_POINTERUP","EVENT_DRAG_START","SELECTOR_ACTIVE_ITEM","SELECTOR_ITEM","SELECTOR_ITEM_IMG","SELECTOR_NEXT_PREV","SELECTOR_INDICATORS","SELECTOR_DATA_SLIDE","SELECTOR_DATA_RIDE","Default","interval","keyboard","slide","pause","wrap","touch","DefaultType","PointerType","TOUCH","PEN","Carousel","_items","_interval","_activeElement","_isPaused","_isSliding","touchTimeout","touchStartX","touchDeltaX","_config","_getConfig","_indicatorsElement","_touchSupported","navigator","maxTouchPoints","_pointerEvent","PointerEvent","MSPointerEvent","_addEventListeners","next","_slide","nextWhenVisible","hidden","prev","cycle","clearInterval","_updateInterval","setInterval","visibilityState","bind","to","index","activeIndex","_getItemIndex","direction","off","_handleSwipe","absDeltax","abs","_keydown","_addTouchEventListeners","start","originalEvent","pointerType","clientX","touches","move","end","clearTimeout","e","which","indexOf","_getItemByDirection","isNextDirection","isPrevDirection","lastItemIndex","isGoingToWrap","delta","itemIndex","_triggerSlideEvent","relatedTarget","eventDirectionName","targetIndex","fromIndex","slideEvent","from","_setActiveIndicatorElement","indicators","nextIndicator","children","addClass","elementInterval","parseInt","defaultInterval","activeElementIndex","nextElement","nextElementIndex","isCycling","directionalClassName","orderClassName","slidEvent","action","ride","_dataApiClickHandler","slideIndex","carousels","$carousel","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_COLLAPSED","DIMENSION_WIDTH","DIMENSION_HEIGHT","EVENT_SHOW","EVENT_SHOWN","EVENT_HIDE","EVENT_HIDDEN","SELECTOR_ACTIVES","Collapse","_isTransitioning","_triggerArray","id","toggleList","elem","filterElement","filter","foundElem","_selector","push","_parent","_getParent","_addAriaAndCollapsedClass","hide","show","actives","activesData","not","startEvent","dimension","_getDimension","style","attr","setTransitioning","complete","capitalizedDimension","scrollSize","getBoundingClientRect","triggerArrayLength","$elem","isTransitioning","hasWidth","_getTargetFromElement","triggerArray","isOpen","currentTarget","$trigger","selectors","$target","ESCAPE_KEYCODE","SPACE_KEYCODE","TAB_KEYCODE","ARROW_UP_KEYCODE","ARROW_DOWN_KEYCODE","RIGHT_MOUSE_BUTTON_WHICH","REGEXP_KEYDOWN","CLASS_NAME_DISABLED","CLASS_NAME_DROPUP","CLASS_NAME_DROPRIGHT","CLASS_NAME_DROPLEFT","CLASS_NAME_MENURIGHT","CLASS_NAME_POSITION_STATIC","EVENT_CLICK","EVENT_KEYDOWN_DATA_API","EVENT_KEYUP_DATA_API","SELECTOR_FORM_CHILD","SELECTOR_MENU","SELECTOR_NAVBAR_NAV","SELECTOR_VISIBLE_ITEMS","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","offset","flip","boundary","reference","display","popperConfig","Dropdown","_popper","_menu","_getMenuElement","_inNavbar","_detectNavbar","disabled","isActive","_clearMenus","usePopper","showEvent","_getParentFromElement","Popper","referenceElement","_getPopperConfig","body","noop","hideEvent","destroy","update","scheduleUpdate","stopPropagation","constructor","_getPlacement","$parentDropdown","placement","_getOffset","offsets","modifiers","enabled","preventOverflow","boundariesElement","applyStyle","toggles","context","clickEvent","dropdownMenu","_dataApiKeydownHandler","items","item","CLASS_NAME_SCROLLABLE","CLASS_NAME_SCROLLBAR_MEASURER","CLASS_NAME_BACKDROP","CLASS_NAME_OPEN","CLASS_NAME_STATIC","EVENT_HIDE_PREVENTED","EVENT_FOCUSIN","EVENT_RESIZE","EVENT_CLICK_DISMISS","EVENT_KEYDOWN_DISMISS","EVENT_MOUSEUP_DISMISS","EVENT_MOUSEDOWN_DISMISS","SELECTOR_DIALOG","SELECTOR_MODAL_BODY","SELECTOR_DATA_DISMISS","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","backdrop","Modal","_dialog","_backdrop","_isShown","_isBodyOverflowing","_ignoreBackdropClick","_scrollbarWidth","_checkScrollbar","_setScrollbar","_adjustDialog","_setEscapeEvent","_setResizeEvent","_showBackdrop","_showElement","transition","_hideModal","forEach","htmlElement","handleUpdate","_triggerBackdropTransition","hideEventPrevented","isModalOverflowing","scrollHeight","clientHeight","overflowY","modalTransitionDuration","modalBody","Node","ELEMENT_NODE","appendChild","removeAttribute","scrollTop","_enforceFocus","shownEvent","transitionComplete","has","_resetAdjustments","_resetScrollbar","_removeBackdrop","callback","animate","createElement","className","appendTo","backdropTransitionDuration","callbackRemove","paddingLeft","paddingRight","rect","round","left","right","innerWidth","_getScrollbarWidth","fixedContent","stickyContent","actualPadding","calculatedPadding","actualMargin","marginRight","calculatedMargin","padding","elements","margin","scrollDiv","scrollbarWidth","width","clientWidth","removeChild","uriAttrs","ARIA_ATTRIBUTE_PATTERN","DefaultWhitelist","a","area","b","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","img","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","SAFE_URL_PATTERN","DATA_URL_PATTERN","allowedAttribute","allowedAttributeList","attrName","nodeName","nodeValue","regExp","attrRegex","sanitizeHtml","unsafeHtml","whiteList","sanitizeFn","domParser","DOMParser","createdDocument","parseFromString","whitelistKeys","keys","el","elName","attributeList","attributes","whitelistedAttributes","concat","innerHTML","CLASS_PREFIX","BSCLS_PREFIX_REGEX","DISALLOWED_ATTRIBUTES","HOVER_STATE_SHOW","HOVER_STATE_OUT","SELECTOR_TOOLTIP_INNER","SELECTOR_ARROW","TRIGGER_HOVER","TRIGGER_FOCUS","TRIGGER_CLICK","TRIGGER_MANUAL","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","animation","template","title","delay","html","container","fallbackPlacement","customClass","sanitize","HIDE","HIDDEN","SHOW","SHOWN","INSERTED","CLICK","FOCUSIN","FOCUSOUT","MOUSEENTER","MOUSELEAVE","Tooltip","_isEnabled","_timeout","_hoverState","_activeTrigger","tip","_setListeners","enable","disable","toggleEnabled","dataKey","_getDelegateConfig","click","_isWithActiveTrigger","_enter","_leave","getTipElement","_hideModalHandler","isWithContent","shadowRoot","isInTheDom","ownerDocument","tipId","setContent","attachment","_getAttachment","addAttachmentClass","_getContainer","_fixTransition","prevHoverState","_cleanTipClass","getTitle","setElementContent","content","empty","append","text","defaultBsConfig","behavior","arrow","onCreate","originalPlacement","_handlePopperPlacementChange","onUpdate","find","triggers","eventIn","eventOut","_fixTitle","titleType","dataAttributes","dataAttr","key","$tip","tabClass","join","popperData","instance","popper","initConfigAnimation","SELECTOR_TITLE","SELECTOR_CONTENT","Popover","_getContent","CLASS_NAME_DROPDOWN_ITEM","EVENT_ACTIVATE","EVENT_SCROLL","METHOD_OFFSET","METHOD_POSITION","SELECTOR_DATA_SPY","SELECTOR_NAV_LIST_GROUP","SELECTOR_NAV_LINKS","SELECTOR_NAV_ITEMS","SELECTOR_LIST_ITEMS","SELECTOR_DROPDOWN","SELECTOR_DROPDOWN_ITEMS","SELECTOR_DROPDOWN_TOGGLE","method","ScrollSpy","_scrollElement","_offsets","_targets","_activeTarget","_scrollHeight","_process","refresh","autoMethod","offsetMethod","offsetBase","_getScrollTop","_getScrollHeight","targets","map","targetSelector","targetBCR","height","top","sort","pageYOffset","max","_getOffsetHeight","innerHeight","maxScroll","_activate","_clear","isActiveTarget","queries","$link","parents","node","scrollSpys","scrollSpysLength","$spy","CLASS_NAME_DROPDOWN_MENU","SELECTOR_ACTIVE_UL","SELECTOR_DROPDOWN_ACTIVE_CHILD","Tab","previous","listElement","itemSelector","makeArray","hiddenEvent","activeElements","active","_transitionComplete","dropdownChild","dropdownElement","dropdownToggleList","$this","CLASS_NAME_HIDE","CLASS_NAME_SHOWING","autohide","Toast","_clearTimeout","_close","root","factory","exports","module","define","amd","self","cssKeywords","reverseKeywords","key","Object","keys","convert","rgb","channels","labels","hsl","hsv","hwb","cmyk","xyz","lab","lch","hex","keyword","ansi16","ansi256","hcg","apple","gray","model","Error","length","defineProperty","value","r","g","b","min","Math","max","delta","h","s","l","rdif","gdif","bdif","v","diff","diffc","c","w","k","reversed","currentClosestKeyword","currentClosestDistance","Infinity","distance","y","x","z","t2","t3","val","t1","i","smin","lmin","hi","floor","f","p","q","t","vmin","sl","wh","bl","ratio","n","m","y2","x2","z2","a","atan2","PI","sqrt","hr","cos","sin","args","saturation","round","ansi","color","mult","rem","string","toString","toUpperCase","substring","match","colorString","split","map","char","join","integer","parseInt","chroma","grayscale","hue","pure","mg","conversions","route","forEach","fromModel","routes","toModel","fn","wrappedFn","arg0","result","len","conversion","wrapRounded","raw","wrapRaw","deriveBFS","graph","models","parent","buildGraph","queue","current","pop","adjacents","adjacent","node","unshift","link","from","to","wrapConversion","path","cur","___CSS_LOADER_EXPORT___","push","id","cssWithMappingToString","list","this","item","content","concat","modules","mediaQuery","dedupe","alreadyImportedModules","_i","_slicedToArray","arr","Array","isArray","_arrayWithHoles","Symbol","iterator","_s","_e","_arr","_n","_d","call","next","done","err","_iterableToArrayLimit","o","minLen","_arrayLikeToArray","prototype","slice","constructor","name","test","_unsupportedIterableToArray","TypeError","_nonIterableRest","arr2","_item","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","data","sourceMapping","sourceURLs","sources","source","sourceRoot","memo","isOldIE","Boolean","window","document","all","atob","getTarget","target","styleTarget","querySelector","HTMLIFrameElement","contentDocument","head","e","stylesInDom","getIndexByIdentifier","identifier","modulesToDom","options","idCountMap","identifiers","base","count","index","obj","css","media","sourceMap","references","updater","addStyle","insertStyleElement","style","createElement","attributes","nonce","setAttribute","insert","appendChild","textStore","replaceText","replacement","filter","applyToSingletonTag","remove","styleSheet","cssText","cssNode","createTextNode","childNodes","removeChild","insertBefore","applyToTag","removeAttribute","firstChild","singleton","singletonCounter","update","styleIndex","bind","parentNode","removeStyleElement","newObj","lastIdentifiers","newList","newLastIdentifiers","_index","splice","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","getter","__esModule","d","definition","enumerable","get","globalThis","Function","prop","hasOwnProperty","nc","userAgent","navigator","toLowerCase","getUserAgent","isMac","isWindows","indexOf","isGecko","isSafari","isiOS","maxTouchPoints","isAndroid","isBlink","features","isRegExpUnicodePropertySupported","isSupported","search","RegExp","error","fastDiff","cmp","atomicChanges","arrayA","arrayB","changeIndexes","arr1","firstIndex","findFirstDifferenceIndex","lastIndexOld","lastIndexNew","oldArrayReversed","cutAndReverse","newArrayReversed","lastIndex","findChangeBoundaryIndexes","newLength","fill","changeIndexesToAtomicChanges","newArray","type","values","howMany","changeIndexesToChanges","reverse","aLength","bLength","_insert","_delete","tmp","es","fp","snake","y1","dir","spy","called","EventInfo","stop","off","HEX_NUMBERS","_","r1","random","r2","r3","r4","priority","normal","highest","high","low","lowest","insertToPriorityArray","objects","objectToInsert","DOCUMENTATION_URL","errorName","context","super","processedObjects","WeakSet","circularReferencesReplacer","has","add","stringifiedData","documentationLink","getLinkToDocumentationMessage","getErrorMessage","is","rethrowUnexpectedError","message","stack","console","warn","formatConsoleArguments","documentationMessage","version","releaseDate","Date","windowOrGlobal","CKEDITOR_VERSION","_listeningTo","_emitterId","_delegations","defaultEmitterClass","EmitterMixin","on","event","callback","listenTo","once","wasFired","stopListening","emitter","emitterInfo","eventCallbacks","emitters","_getEmitterId","_setEmitterId","emitterId","callbacks","listener","_addEventListener","addEventListener","removeEventListener","fire","eventOrInfo","eventInfo","getCallbacksForEvent","callbackArgs","apply","_removeEventListener","delegations","destinations","passAllDestinations","fireDelegatedEvents","return","delegate","events","nameOrFunction","Map","eventName","set","stopDelegating","delete","clear","getEvents","childEventName","newEventNodes","childEvents","substr","lastIndexOf","createEventNamespace","lists","getCallbacksListsForNamespace","callbackDefinition","_events","eventNode","callbacksLists","childCallbacksLists","fireArgs","delegatedInfo","observablePropertiesSymbol","boundObservablesSymbol","boundPropertiesSymbol","decoratedMethods","decoratedOriginal","defaultObservableClass","ObservableMixin","property","initObservable","properties","configurable","oldValue","newValue","bindProperties","isStringArray","Set","size","boundProperties","propertyName","bindings","binding","bindTo","toMany","bindToMany","_observable","_bindProperties","_to","_bindings","unbind","unbindProperties","boundObservables","toObservable","toProperty","toProperties","toPropertyBindings","boundObservable","decorate","methodName","originalMethod","object","evt","observable","parsedArgs","parsed","lastObservable","parseBindToArgs","bindingsKeys","numberOfBindings","updateBoundObservableProperty","chain","toPropertyName","bindingsToObservable","updateBoundObservables","updateBindToBound","observables","attribute","observableAndAttributePairs","getBindingTargets","every","propertyValue","ElementReplacer","_replacedElements","replace","element","newElement","display","nextSibling","restore","iterable","compareArrays","isIterable","global","freeSelf","objectProto","nativeObjectToString","symToStringTag","toStringTag","isOwn","tag","unmasked","doc","children","namespace","xmlns","createElementNS","child","func","transform","arg","getPrototypeOf","funcProto","funcToString","objectCtorString","proto","Ctor","__data__","other","array","ListCache","entries","entry","maskSrcKey","uid","exec","IE_PROTO","reIsHostCtor","reIsNative","Hash","MapCache","pairs","LARGE_ARRAY_SIZE","Stack","iteratee","objValue","props","customizer","isNew","propertyIsEnumerable","arguments","freeExports","nodeType","freeModule","Buffer","isBuffer","reIsUint","typedArrayTags","freeProcess","process","types","require","nodeIsTypedArray","isTypedArray","inherited","isArr","isArg","isBuff","isType","skipIndexes","String","isProto","allocUnsafe","buffer","isDeep","copy","predicate","resIndex","nativeGetSymbols","getOwnPropertySymbols","symbol","offset","keysFunc","symbolsFunc","promiseTag","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","getTag","ArrayBuffer","resolve","ctorString","input","Uint8Array","arrayBuffer","byteLength","dataView","byteOffset","reFlags","regexp","symbolProto","symbolValueOf","valueOf","typedArray","objectCreate","create","nodeIsMap","isMap","nodeIsSet","isSet","cloneableTags","baseClone","bitmask","isFlat","isFull","isFunc","stacked","subValue","Config","configurations","defaultConfigurations","_config","cloneConfig","_setObjectToTarget","_setToTarget","_getFromSource","names","isDefine","parts","part","configuration","leaveDOMReferences","isNode","defaultView","Document","ownerDocument","Node","isWindow","stringifiedObject","proxyOptions","capture","useCapture","passive","usePassive","proxyEmitter","_getProxyEmitter","ProxyEmitter","proxyEmitters","_getAllProxyEmitters","proxy","listeningEmitter","listenedToEmitterId","listeningTo","_getEmitterListenedTo","getProxyEmitterId","_domNode","_options","attach","_domListeners","domListener","_createDomListener","detach","removeListener","domEvt","getNodeUID","option","sort","globalVar","getAncestors","nodes","currentNode","DOCUMENT_NODE","isText","isRange","getBorderWidths","getComputedStyle","top","borderTopWidth","right","borderRightWidth","bottom","borderBottomWidth","left","borderLeftWidth","rectProperties","isSourceRange","_source","writable","isDomElement","rangeRects","getDomRangeRects","copyRectProperties","getBoundingRect","getBoundingClientRect","innerWidth","innerHeight","width","height","clone","moveTo","moveBy","getIntersection","anotherRect","rect","getIntersectionArea","getArea","getVisible","visibleRect","isBody","absolutelyPositionedChildElement","commonAncestorContainer","HTMLElement","getElementPosition","overflow","parentRect","intersectionRect","isEqual","contains","intersectRect","excludeScrollbarsAndBorders","scrollBarWidth","scrollBarHeight","direction","documentElement","clientWidth","clientHeight","borderWidths","offsetWidth","offsetHeight","range","rects","clientRects","getClientRects","startContainer","boundingRectData","Number","POSITIVE_INFINITY","NEGATIVE_INFINITY","rectangleCount","body","position","_observerInstance","_createObserver","_element","_callback","_addElementCallback","observe","destroy","_deleteElementCallback","_elementCallbacks","_getElementCallbacks","unobserve","ResizeObserver","setDataInElement","el","HTMLTextAreaElement","innerHTML","toUnit","unit","previousSibling","insertAt","parentElement","nodeToInsert","isComment","COMMENT_NODE","isVisible","positions","limiter","fitInViewport","viewportOffsetConfig","positionedElementAncestor","offsetParent","getPositionedAncestor","elementRect","targetRect","bestPosition","viewportRect","assign","getConstrainedViewportRect","positionOptions","limiterRect","elementRectArea","positionInstances","positioningFunction","PositionObject","maxFitFactor","limiterIntersectionArea","viewportIntersectionArea","fitFactor","getBestPosition","getRectForAbsolutePositioning","scrollX","scrollY","positioningFunctionOutput","config","_positioningFunctionCorrdinates","_absoluteRect","_rect","limiterViewportIntersectRect","_cachedRect","_cachedAbsoluteRect","ancestorPosition","ancestorBorderWidths","moveX","moveY","scrollLeft","scrollTop","shiftRectToCompensatePositionedAncestor","scrollViewportToShowTarget","viewportOffset","ancestorOffset","alignToTop","forceScroll","targetWindow","getWindow","currentWindow","currentFrame","normalizeViewportOffset","firstAncestorToScroll","getParentElement","scrollAncestorsToShowRect","getRect","getRectRelativeToWindow","scrollWindowToShowRect","frameElement","targetShiftedDownRect","targetShiftedUpRect","forceScrollToTop","allRectsFitInViewport","initialScrollX","initialScrollY","isAbove","isBelow","isLeftOf","isRightOf","scrollTo","parentWindow","targetFitsInTarget","firstRect","secondRect","elementOrRange","relativeWindow","frame","frameRect","modifiersToGlyphsMac","ctrl","cmd","alt","shift","modifiersToGlyphsNonMac","keyCodes","arrowleft","arrowup","arrowright","arrowdown","backspace","enter","space","esc","tab","code","fromCharCode","charCodeAt","generateKnownKeyCodes","keyCodeNames","fromEntries","charAt","getCode","keyCode","altKey","ctrlKey","shiftKey","metaKey","parseKeystroke","keystroke","trim","splitKeystrokeText","endsWith","getEnvKeyCode","reduce","sum","getEnvKeystrokeText","keystrokeCode","modifiers","glyph","getLocalizedArrowKeyCodeDirection","contentLanguageDirection","isLtrContent","toArray","_translate","language","quantity","numberOfLanguages","CKEDITOR_TRANSLATIONS","messageId","dictionary","hasTranslation","plural","getPluralForm","translation","RTL_LANGUAGE_CODES","getLanguageDirection","languageCode","includes","Locale","uiLanguage","contentLanguage","uiLanguageDirection","_t","interpolateString","Collection","initialItemsOrOptions","hasInitialItems","_items","_itemMap","_idProperty","idProperty","_bindToExternalToInternalMap","WeakMap","_bindToInternalToExternalMap","_skippedIndexesFromExternal","_getItemIdBeforeAdding","first","last","addMany","items","itemId","currentItemIndex","added","removed","idOrIndex","itemOrId","getIndex","subject","_remove","ctx","find","_bindToCollection","removedItems","externalCollection","as","Class","_setUpBindToBinding","using","callbackOrProperty","addItem","externalItem","isExternalBoundToThis","externalItemBound","finalIndex","skipped","itemDoesNotExist","iteratorItem","_elements","_nextEventLoopTimeout","_focus","_blur","focusedElement","clearTimeout","isFocused","setTimeout","KeystrokeHandler","_listener","keyEvtData","preventDefault","stopPropagation","press","toMap","objectToMap","wait","timer","delayed","cancel","isInsideSurrogatePair","character","isLowSurrogateHalf","isInsideCombinedSymbol","EMOJI_PATTERN","flagSequence","emoji","buildEmojiRegexp","isInsideEmojiSequence","matches","matchAll","some","editor","_disableStack","forceDisabled","forceDisable","isEnabled","clearForceDisabled","isContextPlugin","ViewCollection","initialItems","view","_renderViewIntoCollectionParent","_parentElement","setParent","elementOrDocFragment","dest","evtName","isRendered","render","Template","def","normalize","_isRendered","_revertData","_renderNode","intoFragment","isApplying","revertData","revert","_revertTemplateFromNode","getViews","isView","isTemplate","eventNameOrFunctionOrAttribute","TemplateToBinding","eventNameOrFunction","if","valueIfTrue","TemplateIfBinding","extend","template","extendTemplate","isInvalid","text","_renderText","_renderElement","ns","_renderAttributes","_renderElementChildren","_setUpListeners","textContent","hasTemplateBinding","_bindToObservable","schema","getTextUpdater","attrName","domAttrValue","getAttribute","attrValue","attrNs","isNamespaced","valueToBind","shouldExtend","getAttributeUpdater","_renderStyleAttribute","prev","arrayValueReducer","isFalsy","setAttributeNS","styles","styleName","styleValue","getStyleUpdater","container","createDocumentFragment","childIndex","isViewCollection","childRevertData","eventListeners","revertBindings","schemaItem","domEvtName","domSelector","activateDomEventListener","syncValueSchemaValue","templateBinding","activateAttributeListener","revertBinding","TemplateBinding","getValue","getValueSchemaValue","removeAttributeNS","normalizePlainTextDefinition","normalizeTextDefinition","listeners","arrayify","normalizeListeners","normalizeAttributes","extendObjectValueArray","ext","childDef","locals","locale","_viewCollections","_unboundChildren","createCollection","collection","bindTemplate","_bindTemplate","views","registerChild","deregisterChild","setTemplate","IconView","class","viewBox","_updateXMLContent","_colorFillPaths","svg","DOMParser","parseFromString","presentationalAttributeNames","fillColor","querySelectorAll","_focusDelayed","ariaLabelUid","labelView","_createLabelView","iconView","keystrokeView","_createKeystrokeView","_getTooltipString","role","tabindex","isToggleable","click","focus","mousedown","mouseup","icon","withKeystroke","ariaLabelledBy","tooltip","label","activator","contextElements","composedPath","contextElementsList","contextElement","CssTransitionDisablerMixin","disableCssTransitions","_isCssTransitionsDisabled","enableCssTransitions","initializeCssTransitionDisablerMixin","submitHandler","addKeyboardHandlingForGrid","keystrokeHandler","focusTracker","gridItems","numberOfColumns","getNumberOfColumns","getGridItemFocuser","getIndexToFocus","focusedElementIndex","nextIndexToFocus","getRightElementIndex","elementIndex","collectionLength","getLeftElementIndex","nextIndex","BodyCollection","bodyCollectionContainer","_bodyCollectionContainer","attachToDom","wrapper","detachFromDom","childElementCount","SwitchButtonView","toggleSwitchView","_createToggleView","getLocalizedColorOptions","localizedColorNames","Black","Grey","White","Red","Orange","Yellow","Green","Aquamarine","Turquoise","Blue","Purple","colorOption","normalizeColorOptions","normalizeSingleColorDefinition","hasBorder","ColorTileView","backgroundColor","ColorGridView","colorDefinitions","columns","viewStyleAttribute","gridTemplateColumns","keystrokes","colorTile","isOn","selectedColor","focusLast","cstr","alpha","isRGB","parseFloat","baseHues","isNaN","red","R","green","G","blue","B","H","S","lightness","L","brightness","opacity","orange","yellow","purple","convertColor","outputFormat","colorObject","parseColorString","parsedColor","toColorSpace","format","formatColorOutput","hexValue","startsWith","parsedHex","now","reWhitespace","reTrimStart","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","isBinary","nativeMax","nativeMin","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","invokeFunc","time","thisArg","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","leadingEdge","flush","LabelView","for","LabeledFieldView","viewCreator","viewUid","statusUid","fieldView","statusView","_createStatusView","fieldWrapperChildren","errorText","infoText","InputView","placeholder","readonly","inputmode","_updateIsEmpty","change","_setDomElementValue","select","isEmpty","InputTextView","InputNumberView","step","DropdownPanelView","selectstart","tagName","toLocaleLowerCase","childView","dropdownPanel","lastChild","DropdownView","buttonView","panelView","isOpen","panelPosition","_getOptimalPosition","_panelPositions","closeDropdown","south","north","southEast","southWest","northEast","northWest","southMiddleEast","southMiddleWest","northMiddleEast","northMiddleWest","defaultPanelPositions","buttonRect","panelRect","DropdownButtonView","arrowView","_createArrowView","FocusCycler","focusables","actions","isFocusable","_getFocusableItem","previous","viewIndex","focused","focusFirst","focusNext","focusPrevious","ToolbarSeparatorView","ToolbarLineBreakView","removeItems","Command","_affectsData","_isEnabledBasedOnSelection","refresh","affectsData","isReadOnly","canEditAt","selection","execute","MultiCommand","_childCommandsDefinitions","command","_getFirstEnabledCommand","registerChildCommand","_checkEnabled","commandDefinition","PluginCollection","availablePlugins","contextPlugins","_plugins","_context","_availablePlugins","PluginConstructor","pluginName","_contextPlugins","pluginInstance","plugin","init","plugins","pluginsToRemove","pluginsSubstitutions","that","findAvailablePluginConstructors","processed","isPluginConstructor","requires","validatePlugins","pluginConstructors","getPluginConstructors","isPluginRemoved","pluginItem","pluginToReplace","indexInPluginConstructors","substitutePlugins","pluginInstances","_add","loadPlugins","initPlugins","then","removedPlugin","getPluginName","parentPluginConstructor","missingPlugin","requiredBy","checkMissingPlugin","checkContextPlugin","checkRemovedPlugin","method","promise","Promise","promises","plugin1","plugin2","Context","_contextOwner","defaultConfig","builtinPlugins","languageConfig","ui","editors","Plugin","_addEditor","isContextOwner","_removeEditor","_getEditorConfig","ContextPlugin","documentPlaceholders","enablePlaceholder","isDirectHost","keepOnFocus","registerPostFixer","writer","updateDocumentPlaceholders","hostElement","hidePlaceholder","hasClass","removeClass","placeholders","directHostElements","wasViewModified","updatePlaceholder","getChildPlaceholderHostSubstitute","childCount","isAttached","hasContent","getChildren","selectionAnchor","anchor","isComposing","needsPlaceholder","addClass","showPlaceholder","getChild","TypeCheckable","pos","getChildIndex","getPath","ancestors","includeSelf","parentFirst","getCommonAncestor","ancestorsA","ancestorsB","isBefore","thisPath","nodePath","isAfter","_removeChildren","_fireChange","toJSON","json","_textData","_data","isSimilar","otherNode","_clone","TextProxy","textNode","offsetInText","offsetSize","isPartial","Matcher","pattern","_patterns","singleElement","isElementMatching","results","getElementName","matchName","patterns","attributeKeys","getAttributeKeys","matchPatterns","matchAttributes","classes","getClassNames","matchClasses","getStyleNames","getStyle","matchStyles","valueGetter","normalizedPatterns","normalizePatterns","normalizedItems","patternKey","patternValue","itemKey","isKeyMatched","itemValue","isValueMatched","reIsDeepProp","reIsPlainProp","memoize","resolver","memoized","cache","Cache","rePropName","reEscapeChar","stringToPath","number","quote","subString","symbolToString","baseToString","start","end","defaultValue","fromRight","srcIndex","mergeFunc","srcValue","isCommon","isTyped","baseMerge","otherArgs","nativeNow","lastCalled","stamp","remaining","assigner","guard","nested","StylesMap","styleProcessor","_styles","_styleProcessor","setTo","inlineStyle","parsedStyles","stylesString","quoteType","propertyNameStart","propertyValueStart","stylesMap","parseInlineStyles","toNormalizedForm","propertyDescriptor","getReducedForm","nameOrObject","valueOrObject","toPath","_cleanEmptyObjectsOnPath","getNormalized","_getStylesEntries","getAsString","expand","pathParts","parentPath","parentObject","StylesProcessor","_normalizers","_extractors","_reducers","_consumables","appendStyleValue","normalizer","extractor","normalizedValue","reducer","expandedStyleNames","styleNamesKeysSet","getRelatedStyles","setNormalizer","setExtractor","callbackOrPath","setReducer","setStyleRelation","shorthandName","styleNames","_mapStyleNames","alsoName","stylesObject","nameOrPath","valueToSet","Element","attrs","_unsafeAttributesToRender","_customProperties","_attrs","attrsMap","parseAttributes","_children","_insertChild","_classes","classString","parseClasses","stylesProcessor","getAttributes","hasAttribute","otherElement","className","getNormalizedStyle","hasStyle","findAncestor","matcher","getCustomProperty","getCustomProperties","getIdentity","shouldRenderUnsafeAttribute","attributeName","deep","childrenClone","cloned","getFillerOffset","_appendChild","_setAttribute","stringValue","_removeAttribute","_addClass","_removeClass","_setStyle","_removeStyle","_setCustomProperty","_removeCustomProperty","classesSet","classesString","classArray","ContainerElement","EditableElement","editableElement","rootNameSymbol","RootEditableElement","rootName","_name","TreeWalker","boundaries","startPosition","_position","Position","_createAt","singleCharacters","shallow","ignoreElementEnd","_boundaryStartParent","_boundaryEndParent","skip","nextResult","prevPosition","_next","_previous","previousPosition","isAtEnd","_createAfter","_formatReturnValue","charactersCount","textLength","textProxy","isAtStart","_createBefore","startOffset","nextPosition","nodeAfter","nodeBefore","endOffset","editable","getShiftedBy","shifted","getLastMatchingPosition","treeWalker","otherPosition","compareWith","otherPath","getWalker","itemOrPosition","Range","isCollapsed","getEnlarged","enlargeTrimSkip","getTrimmed","nodeAfterStart","nodeBeforeEnd","otherRange","containsPosition","containsRange","loose","containsStart","containsEnd","getDifference","ranges","isIntersecting","commonRangeStart","commonRangeEnd","getContainedElement","getItems","getPositions","_createFromParentsAndOffsets","startElement","endElement","_createFromPositionAndShift","_createIn","_createOn","Selection","_ranges","_lastRangeBackward","_isFake","_fakeSelectionLabel","isFake","fakeSelectionLabel","rangeCount","isBackward","getRanges","getFirstRange","getLastRange","getFirstPosition","firstRange","getLastPosition","lastRange","otherSelection","thisRange","found","numOfRangesA","rangeA","rangeB","getSelectedElement","selectable","placeOrOffset","_setRanges","_setFakeOptions","DocumentSelection","fake","backward","setFocus","newFocus","_addRange","newRanges","isLastBackward","_pushRange","storedRange","addedRange","intersectingRange","_selection","_setTo","_setFocus","BubblingEventInfo","startRange","_eventPhase","_currentTarget","eventPhase","currentTarget","contextsSymbol","BubblingEmitterMixin","eventArgs","eventContexts","getBubblingContexts","updateEventInfo","fireListenerFor","selectedElement","isCustomContext","getCustomContext","startParent","endParent","startPath","endPath","getDeeperRangeParent","contexts","mixin","_postFixers","roots","getRoot","postFixer","_callPostFixers","wasFixed","AttributeElement","_priority","_id","_clonesGroup","getElementsWithSameId","nonUiChildrenCount","DEFAULT_PRIORITY","EmptyElement","UIElement","domDocument","domConverter","toDomElement","domElement","injectUiElementHandling","domSelection","domTarget","getSelection","domSelectionCollapsed","getRangeAt","collapsed","domParent","focusNode","domOffset","focusOffset","viewPosition","domPositionToView","jumpedOverAnyUiElement","nextViewPosition","newDomPosition","viewPositionToDom","collapse","jumpOverUiElement","RawElement","DocumentFragment","DowncastWriter","_cloneGroups","_slotFactory","setSelection","setSelectionFocus","createText","createAttributeElement","attributeElement","renderUnsafeAttributes","createContainerElement","childrenOrOptions","containerElement","createEditableElement","createEmptyElement","emptyElement","createUIElement","renderFunction","uiElement","createRawElement","rawElement","setStyle","removeStyle","setCustomProperty","removeCustomProperty","breakAttributes","positionOrRange","_breakAttributes","_breakAttributesRange","breakContainer","sourceRange","targetPosition","move","mergeAttributes","positionOffset","positionParent","_removeFromClonedElementsGroup","mergeTextNodes","mergeContainers","newPosition","validateNodesToInsert","nodeGroups","groups","lastGroup","_insertNodes","rangeOrItem","validateRangeContainer","breakStart","breakEnd","parentContainer","mergePosition","walker","rangeToRemove","ancestor","countBefore","wrap","_wrapPosition","viewSelection","_wrapRange","unwrap","newRange","_unwrapChildren","rename","newName","viewElement","clearClonedElementsGroup","groupName","createPositionAt","createPositionAfter","createPositionBefore","createRange","createRangeOn","createRangeIn","createSelection","createSlot","modeOrFilter","_registerSlotFactory","slotFactory","_clearSlotFactory","insertionPosition","getParentContainer","breakTextNode","_addToClonedElementsGroup","endPosition","_wrapChildren","wrapElement","wrapPositions","isAttribute","_wrapAttributeElement","shouldABeOutsideB","newAttribute","offsetChange","unwrapElement","unwrapPositions","unwrapped","_unwrapAttributeElement","movePositionToTextNode","fakeElement","wrapRange","toWrap","canBeJoined","toUnwrap","forceSplitText","rangeStart","rangeEnd","isContainerOrFragment","offsetAfter","clonedNode","nodesToMove","group","textToMove","nodeBeforeLength","validNodesToInsert","errorContext","validNode","endContainer","NBSP_FILLER","MARKED_NBSP_FILLER","span","dataset","ckeFiller","innerText","BR_FILLER","fillerBr","INLINE_FILLER_LENGTH","INLINE_FILLER","repeat","startsWithFiller","domNode","isInlineFiller","domText","getDataWithoutFiller","jumpOverInlineFiller","Renderer","domDocuments","markedAttributes","markedChildren","markedTexts","_inlineFiller","_fakeSelectionContainer","isSelecting","markToSync","mapViewToDom","inlineFillerPosition","isInlineFillerRenderingPossible","_updateChildrenMappings","_isSelectionInInlineFiller","_removeInlineFiller","_getInlineFillerPosition","_needsInlineFillerAtSelection","_updateAttrs","_updateChildren","_updateText","fillerDomPosition","addInlineFiller","_updateFocus","_updateSelection","actualDomChildren","expectedDomChildren","viewChildrenToDom","withChildren","_diffNodeLists","_findUpdateActions","areSimilarElements","counter","equal","action","insertIndex","deleteIndex","viewChild","_updateElementMappings","unbindDomElement","bindElements","firstPos","selectionPosition","domFillerNode","selectionParent","selectionOffset","isEditable","viewText","findCorrespondingDomText","expectedText","viewToDom","filler","updateTextNode","domAttrKeys","attr","viewAttrKeys","setDomElementAttribute","removeDomElementAttribute","previousDomNode","areTextNodes","nodesToUnbind","_markDescendantTextToSync","domToView","domChildList","fakeSelectionContainer","childList","filterOutFakeSelectionContainer","sameNodes","actualDom","expectedDom","comparator","newActions","actualSlice","expectedSlice","viewNode","_removeDomSelection","_removeFakeSelection","domRoot","_updateFakeSelection","isConnected","_updateDomSelection","createFakeSelectionContainer","bindFakeSelection","_fakeSelectionNeedsUpdate","domRange","removeAllRanges","selectNodeContents","addRange","_domSelectionNeedsUpdate","ELEMENT_NODE","childAtOffset","fixGeckoSelectionAfterBr","isDomSelectionCorrect","oldViewSelection","domSelectionToView","anchorNode","activeDomElement","activeElement","mapDomToView","domParentOrArray","nodeAfterFiller","fillerNode","node1","node2","actualDomChild","expectedDomChild","isBlockFiller","actualText","insertData","deleteData","BR_FILLER_REF","NBSP_FILLER_REF","MARKED_NBSP_FILLER_REF","UNSAFE_ATTRIBUTE_NAME_PREFIX","UNSAFE_ELEMENT_REPLACEMENT_ATTRIBUTE","DomConverter","blockFillerMode","renderingMode","_domToViewMapping","_viewToDomMapping","_fakeSelectionMapping","_rawContentElementMatcher","_encounteredRawContentDomNodes","preElements","blockElements","inlineObjectElements","unsafeElements","_domDocument","implementation","createHTMLDocument","viewDocumentSelection","fakeSelectionToView","bindDocumentFragments","domFragment","viewFragment","shouldRenderAttribute","attributeKey","attributeValue","elementName","setContentOf","html","fragment","bodyChildNodes","createTreeWalker","NodeFilter","SHOW_ELEMENT","nextNode","getAttributeNames","_shouldRenameElement","_logUnsafeElement","replaceWith","_createReplacementDomElement","append","textData","_processDataFromViewText","createComment","relatedViewElement","createAttribute","isValidAttributeName","fillerPositionOffset","_getBlockFiller","transparentRendering","viewRangeToDom","viewRange","domStart","domEnd","setStart","setEnd","viewParent","domBefore","domAfter","getHostViewElement","skipComments","_processDataFromDomText","isDocumentFragment","_createViewElement","_isViewElementWithRawContent","rawContent","domChildrenToView","domChild","isDomSelectionBackward","viewRanges","domRangeToView","viewStart","viewEnd","findCorrespondingViewText","viewBefore","domElementOrDocumentFragment","isElement","documentFragmentOrElement","viewEditable","domEditable","scrollPositions","forEachDomElementAncestor","DOCUMENT_FRAGMENT_NODE","isEqualNode","hasBlockParent","isNBSP","isNbspBlockFiller","anchorOffset","_isDomSelectionPositionCorrect","registerRawContentMatcher","prevNode","_getTouchingInlineViewNode","_nodeEndsWithSpace","nextStartsWithSpace","parents","_hasDomParentOfType","_getTouchingInlineDomNode","shouldLeftTrim","_checkShouldLeftTrimDomText","shouldRightTrim","_checkShouldRightTrimDomText","Text","isNextNodeInlineObjectElement","isNextNodeStartingWithSpace","getNext","stepInto","stepOver","skipChildren","returnNode","_isBlockElement","_isInlineObjectElement","viewName","keepOriginalCase","originalDomElement","newDomElement","Observer","_isEnabled","enable","disable","checkShouldIgnoreEventFromTarget","DomEventData","domEvent","additionalData","DomEventObserver","domEventType","onDomEvent","stopObserving","eventType","KeyObserver","FakeSelectionObserver","_fireSelectionChangeDoneDebounced","_handleSelectionMove","newSelection","oldSelection","SetCache","equalFunc","arrLength","othLength","arrStacked","othStacked","seen","arrValue","othValue","compared","othIndex","objProps","objLength","objStacked","skipCtor","objCtor","othCtor","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","baseIsEqual","MutationObserver","characterData","subtree","renderer","_renderer","_domElements","_mutationObserver","_onMutations","takeRecords","disconnect","domMutations","mutatedTextNodes","elementsWithMutatedChildren","mutation","_isBogusBrMutation","hasMutations","viewChildren","newViewChildren","forceRender","addedNode","removedNodes","addedNodes","child1","child2","FocusObserver","_isFocusChanging","_renderTimeoutId","selectedEditable","SelectionObserver","mutationObserver","getObserver","focusObserver","_documents","_clearInfiniteLoopInterval","setInterval","_clearInfiniteLoop","_documentIsSelectingInactivityTimeoutDebounced","_loopbackCounter","endDocumentIsSelecting","_handleSelectionChange","clearInterval","_reportInfiniteLoop","newViewSelection","hasDomSelection","CompositionObserver","DataTransfer","nativeDataTransfer","_files","cacheFiles","getFiles","_native","files","getData","setData","effectAllowed","dropEffect","setDragImage","image","isCanceled","mozUserCancelled","kind","getAsFile","InputObserver","domTargetRanges","getTargetRanges","viewDocument","dataTransfer","targetRanges","inputType","partTargetRanges","dataPart","ArrowKeysObserver","TabObserver","domRoots","_initialDomRootAttributes","_observers","_ongoingChange","_postFixersInProgress","_renderingDisabled","_hasChangedSinceTheLastRendering","_writer","addObserver","_render","attachDomRoot","viewRoot","initialDomRootAttributes","updateContenteditableAttribute","observer","detachDomRoot","getDomRoot","ObserverConstructor","disableObservers","enableObservers","scrollToTheSelection","originalArgs","isRenderingInProgress","callbackResult","_disableRendering","flag","getChildStartOffset","_deep","_setAttributesTo","_clearAttributes","NodeList","_nodes","maxOffset","getNode","getNodeIndex","getNodeStartOffset","indexToOffset","offsetToIndex","totalOffset","nodeList","newTarget","spliceArray","_removeNodes","indexStart","fromJSON","getNodeByPath","relativePath","parentName","stickiness","_visitedParent","prevVisitedParent","textNodeAtPosition","getTextNodeAtPosition","getNodeAfterPosition","formatReturnValue","offsetInTextNode","getNodeBeforePosition","newOffset","getParentPath","getCommonPath","diffAt","isTouching","commonLevel","level","checkTouchingBranch","checkOnlyZeroes","hasSameParentAs","getTransformedByOperation","operation","_getTransformedByInsertOperation","_getTransformedByMoveOperation","_getTransformedBySplitOperation","_getTransformedByMergeOperation","_getTransformedByInsertion","_getTransformedByMove","sourcePosition","movedRange","_getCombined","splitPosition","moveTargetPosition","graveyardPosition","_getTransformedByDeletion","deletionPosition","deletePosition","transformed","insertPosition","combined","graveyard","idx","checkOnlyMaxOffset","containsItem","getJoined","shouldJoin","getMinimalFlatRanges","posParent","getTransformedByOperations","operations","j","spread","newPos","moveRange","differenceSet","difference","common","transformedCommon","newStart","newEnd","_createFromRanges","ref","refIndex","Mapper","_modelToViewMapping","_viewToModelMapping","_viewToModelLengthCallbacks","_markerNameToElements","_elementToMarkerNames","_deferredBindingRemovals","_unboundMarkerNames","viewContainer","modelPosition","findPositionIn","viewBlock","findMappedViewAncestor","modelParent","modelOffset","_toModelOffset","modelElement","unbindViewElement","toModelElement","markerName","defer","unbindModelElement","toViewElement","bindElementToMarker","elements","unbindElementFromMarkerName","nameToElements","elementToNames","flushUnboundMarkerNames","markerNames","flushDeferredBindings","clearBindings","toModelRange","toModelPosition","toViewRange","modelRange","toViewPosition","mapper","isPhantom","markerNameToElements","boundElements","registerViewToModelLength","viewElementName","lengthCallback","viewOffset","getModelLength","expectedOffset","lastLength","_moveViewPositionToTextNode","ModelConsumable","_consumable","_textProxyRegistry","_normalizeConsumableType","_getSymbolForTextProxy","consume","itemConsumables","verifyAllConsumed","eventGroup","consumables","canConsume","eventPrefix","description","startMap","endMap","_addSymbolForTextProxy","DowncastDispatcher","conversionApi","_conversionApi","dispatcher","_firedEventsMap","convertChanges","differ","markers","_createConversionApi","getRefreshedItems","getMarkersToRemove","_convertMarkerRemove","changes","_reduceChanges","getChanges","_convertInsert","_convertReinsert","_convertRemove","_convertAttribute","attributeOldValue","attributeNewValue","markerRange","getRange","_convertMarkerAdd","getMarkersToAdd","consumable","convertSelection","markersAtSelection","getMarkersAtPosition","_addConsumablesForSelection","marker","shouldMarkerChangeBeConverted","doNotAddConsumables","_addConsumablesForInsert","walkerValueToEventData","_testAndFire","_addConsumablesForRange","walkerValues","reconversion","getEventName","eventsFiredForConversion","eventsFiredForItem","_testAndFireAddAttributes","refreshedItems","convertItem","convertChildren","convertAttributes","canReuseView","anyNewRange","oldRange","_replaceAllRanges","directChange","_popRange","getSelectedBlocks","visited","startBlock","getParentBlock","isStartBlockSelected","block","isUnvisitedTopBlock","endBlock","isEndBlockSelected","containsEntireContent","limitStartPosition","limitEndPosition","_checkRange","_removeAllRanges","isUnvisitedBlock","isBlock","isTopBlockInRange","hasParentLimit","isLimit","parentBlock","findAncestorBlock","bindWithDocument","toRange","fromRange","isDocumentOperation","boundariesChanged","contentChanged","doesOperationChangeRangeContent","storePrefix","LiveSelection","hasOwnRange","isGravityOverridden","updateMarkers","_updateAttributes","observeMarkers","prefixOrName","_getStoredAttributes","getStoredAttributes","_overrideGravity","overrideGravity","_restoreGravity","restoreGravity","_getStoreAttributeKey","_isStoreAttributeKey","_attributePriority","_selectionRestorePosition","_hasChangedRange","_overriddenGravityRegister","_observedMarkers","_model","_document","_fixGraveyardSelection","_validateSelectionRanges","_updateMarker","batch","changeParent","enqueueChange","storedAttributes","clearAttributesStoredInElement","_getDefaultRange","overrideUid","liveRange","_prepareRange","_validateSelectionRange","changed","markerGroup","selectionRange","oldMarkers","hasMarker","contained","clearAll","newAttributes","_getSurroundingAttributes","oldAttributes","newKey","oldKey","realKey","getTextAttributes","isObject","getNearestSelectionRange","isInline","checkAttribute","ConversionHelpers","dispatchers","_dispatchers","conversionHelper","DowncastHelpers","elementToElement","normalizeModelElementConfig","normalizeToElementConfig","elementCreator","consumer","defaultConsumer","preflight","reinsertOrConvertNodes","insertElement","createConsumer","converterPriority","createChangeReducer","downcastElementToElement","elementToStructure","checkChild","slotsMap","slot","createSlotFactory","childrenInSlots","flat","uniqueChildrenInSlots","validateSlotsChildren","toViewPositionMapping","currentSlot","currentSlotNodes","fillSlots","downcastElementToStructure","attributeToElement","modelValue","getFromAttributeCreator","oldViewElement","newViewElement","viewWriter","downcastAttributeToElement","attributeToAttribute","normalizeToAttributeConfig","attributeCreator","oldAttribute","downcastAttributeToAttribute","markerToElement","isOpening","viewStartElement","viewEndElement","downcastMarkerToElement","markerToHighlight","highlightDescriptor","descriptor","prepareDescriptor","createViewElementFromHighlightDescriptor","rangeAfterWrap","addHighlightCallback","highlightElement","viewHighlightElement","removeHighlightCallback","removeHighlight","downcastMarkerToHighlight","markerToData","viewMarkerData","handleMarkerBoundary","viewData","removeMarkerFromAttribute","removeMarkerData","downcastMarkerToData","isStart","elementAfter","elementBefore","insertMarkerAsAttribute","insertMarkerAsElement","viewElementType","modelData","viewElementDefinition","createViewElementFromDefinition","modelAttributeValue","shouldReplace","createChangeReducerCallback","reducedChanges","reconvertedElements","changeIndex","positionRelation","modelNodes","modelChildNode","reinsertNode","modelNode","viewChildNode","autoParagraphEmptyRoots","getRootNames","isParagraphable","nodeOrType","createContext","wrapInParagraph","paragraph","UpcastHelpers","upcastElementToElement","elementToAttribute","normalizeModelAttributeConfig","converter","prepareToAttributeConverter","getViewElementNameFromConfig","upcastElementToAttribute","viewKey","normalized","normalizeViewAttributeKeyValueConfig","upcastAttributeToAttribute","elementToMarker","normalizeElementToMarkerModelConfig","upcastElementToMarker","dataToMarker","normalizedConfig","converterStart","prepareToElementConverter","normalizeDataToMarkerConfig","converterEnd","basePriority","maxPriority","priorityFactor","addMarkerElements","markerViewNames","markerViewName","modelCursor","viewItem","upcastAttributeToMarker","upcastDataToMarker","viewConfig","matcherResult","getModelElement","safeInsert","updateConversionResult","viewAttributeKeyToCopy","defaultModelValue","configToTest","onlyViewNameIsDefined","modelKey","attributeWasSet","modelAttribute","setAttributeOn","injectSelectionPostFixer","correctedRange","tryFixingRange","rangesToMerge","rangeIndexesToRemove","currentRangeIndex","currentRange","previousRanges","previousRangeIndex","previousRange","mergedRange","mergeIntersectingRanges","selectionPostFixer","originalPosition","nearestSelectionRange","ancestorObject","fixedPosition","tryFixingCollapsedRange","isTextAllowedOnStart","isTextAllowedOnEnd","startLimitElement","getLimitElement","endLimitElement","startIsOnBlock","endIsOnBlock","checkSelectionOnNonLimitElements","fixedStart","isSelectable","fixedEnd","isStartInLimit","isEndInLimit","bothInSameParent","expandStart","expandEnd","findOutermostLimitAncestor","tryFixingNonCollapsedRage","startingNode","isLimitNode","EditingController","downcastDispatcher","modelSelection","convertSelectionChange","modelEnd","brokenPosition","reconvertMarker","markerOrName","currentMarker","_refresh","reconvertItem","_refreshItem","ViewConsumable","elementConsumables","ViewElementConsumables","consumablesFromElement","createFrom","instance","CONSUMABLE_TYPES","_canConsumeName","_test","_consume","_revert","consumableName","toConsume","Schema","_sourceDefinitions","_attributeProperties","SchemaContext","getDefinition","register","itemName","_clearCache","getDefinitions","_compiledDefinitions","_compile","isRegistered","isContent","_checkContextMatch","allowAttributes","checkMerge","positionOrBaseElement","elementToMerge","addChildCheck","retValue","addAttributeCheck","setAttributeProperties","getAttributeProperties","selectionOrRangeOrPosition","rangeCommonAncestor","checkAttributeInSelection","getValidRanges","convertToMinimalFlatRanges","_getValidRangesForRange","backwardWalker","forwardWalker","limitElement","forward","combineWalkers","findAllowedParent","setAllowedAttributes","removeDisallowedAttributes","removeDisallowedAttributeFromNode","positionsInRange","getAttributesWithProperty","attributeProperties","compiledDefinitions","sourceRules","itemNames","compileBaseItemRule","compileAllowChildren","compileAllowContentOf","compileAllowWhere","compileAllowAttributesOf","compileInheritPropertiesFrom","cleanUpAllowIn","setupAllowChildren","cleanUpAllowAttributes","contextItemIndex","contextItem","getItem","allowIn","parentRule","mapContextItem","getNames","query","sourceItemRules","itemRule","allowContentOf","allowWhere","allowAttributesOf","allowChildren","inheritTypesFrom","sourceItemRule","typeNames","copyTypes","copyProperty","inheritFrom","inheritAllFrom","makeInheritAllWork","allowChildrenItem","allowedChildren","allowContentOfItemName","getAllowedChildren","allowedItem","allowWhereItemName","allowedIn","allowAttributeOfItem","inheritAttributes","inheritPropertiesOfItem","existingItems","itemToCheck","allowedParentItemName","ctxItem","UpcastDispatcher","_splitParts","_cursorParents","_modelCursor","_emptyElementsToKeep","store","_convertItem","positionOrElement","_convertChildren","_safeInsert","_updateConversionResult","splitToAllowedParent","_splitToAllowedParent","getSplitParts","_getSplitParts","keepEmptyElement","_keepEmptyElement","contextDefinition","createContextTree","documentFragment","_removeEmptyElements","modelItem","markerElements","markerElement","currentPosition","extractMarkersFromModelFragment","elementOrModelCursor","nextModelCursor","splitResult","savedCursorParent","allowedParent","treeWalkerValue","originalPart","splitPart","_registerSplitPair","cursorParent","anyRemoved","BasicHtmlWriter","getHtml","HtmlDataProcessor","domParser","htmlWriter","toData","toView","_toDom","useFillerType","DataController","upcastDispatcher","htmlProcessor","processor","_viewWriter","isUndoable","_checkIfRootsExists","ignoreWhitespaces","modelElementOrFragment","viewDocumentFragment","elementRange","isMarkerCollapsed","isMarkerAtElementBoundary","updatedMarkerRange","n1","n2","localeCompare","_getMarkersRelativeToElement","initialData","main","modelRoot","parse","newData","batchType","removeSelectionAttribute","viewElementOrFragment","addStyleProcessorRules","rootNames","Conversion","downcastDispatchers","upcastDispatchers","_helpers","_downcast","_createConversionHelpers","isDowncast","_upcast","addAlias","alias","_getAllUpcastDefinitions","helpers","upcastAlso","_getUpcastDefinition","upcastAlsoItem","Operation","baseVersion","_validate","__className","normalizedNodes","_normalizeNodes","_splitNodeAtPosition","_mergeNodesAtIndex","_move","_haveSameAttributes","mergedNode","offsetDiff","firstPart","secondPart","nodeA","nodeB","iteratorA","iteratorB","MoveOperation","affectedSelectable","getMovedRangeStart","getReversed","newTargetPosition","sourceElement","targetElement","sourceOffset","targetOffset","_execute","InsertOperation","shouldReceiveAttributes","gyPosition","originalNodes","SplitOperation","MergeOperation","splitElement","getInsertionPosition","mergedElement","MarkerOperation","_markers","_set","AttributeOperation","NoOperation","RenameOperation","oldName","RootAttributeOperation","RootOperation","isAdd","createRoot","_isAttached","OperationFactory","transformations","setTransformation","OperationA","OperationB","transformationFunction","aGroup","noUpdateTransformation","getTransformation","transformSets","operationsA","operationsB","contextFactory","ContextFactory","useRelations","forceWeakRemove","setOriginalOperations","originalOperations","nextTransformIndex","op","nextBaseVersionA","nextBaseVersionB","originalOperationsACount","originalOperationsBCount","opA","indexB","opB","newOpsA","getContext","newOpsB","updateRelation","newOpA","padWithNoOps","brokenOperationsACount","brokenOperationsBCount","updateBaseVersions","_history","history","_useRelations","_forceWeakRemove","_relations","takeFrom","originalOperation","_setRelation","affectedLeft","affectedRight","side","wasInLeftElement","wasStartBeforeMergedElement","wasEndBeforeMergedElement","wasInRightElement","aIsStrong","aWasUndone","_wasUndone","bWasUndone","abRelation","_getRelation","baRelation","originalOp","wasUndone","isUndoneOperation","origB","undoneB","getUndoneOperation","origA","relationsA","relation","_getComplementaryAttributeOperations","insertOperation","insertValue","_moveTargetIntoMovedRange","_makeMoveOperationsFromRanges","moveOp","diffs","_breakRangeByMoveOperation","aNewRange","aToGraveyard","bToGraveyard","removedRange","mergeInside","mergeSplittingElement","aCompB","shouldSpread","rightRange","movesGraveyardElement","gyMoveSource","splitNodesMoveSource","gyMoveTarget","gyMove","splitNodesMoveTargetPath","splitNodesMoveTarget","splitNodesMove","extraRename","splitPath","additionalSplit","rangeToMove","gyElementMoved","newParentPosition","newTargetPath","splitAtTarget","howManyRemoved","aInGraveyard","bInGraveyard","newPositionPath","LivePosition","toPosition","fromPosition","oldPosition","Batch","isLocal","isUndo","isTyping","addOperation","Differ","markerCollection","_changesInElement","_elementSnapshots","_changedMarkers","_changedRoots","_changeCount","_cachedChanges","_cachedChangesWithGraveyard","_refreshedItems","_markerCollection","bufferOperation","operationToBuffer","_isInInsertedElement","_markInsert","_markAttribute","sourceParentInserted","targetParentInserted","_markRemove","getMarkersIntersectingRange","markerData","bufferMarkerChange","graveyardParent","mergedIntoElement","_bufferRootStateChange","_bufferRootAttributeChange","oldMarkerData","newMarkerData","buffered","getChangedMarkers","hasDataChanges","markerAdded","markerRemoved","markerChanged","includeChangesInGraveyard","diffSet","snapshotChildren","elementChildren","_getChildrenSnapshot","_generateActionsFromChanges","_getInsertDiff","_getRemoveDiff","elementAttributes","snapshotAttributes","_getAttributesDiff","changeCount","prevIndex","prevDiff","thisDiff","isConsecutiveTextRemove","isConsecutiveTextAdd","isConsecutiveAttributeChange","_changesInGraveyardFilter","getChangedRoots","diffItem","state","reset","attrEntry","changeItem","_markChange","_removeAllNestedChanges","_makeSnapshot","_getChangesForElement","_handleChange","inc","nodesToHandle","old","incEnd","oldEnd","intersectionLength","howManyAfter","attributePart","elementSnapshot","snapshot","oldChildrenLength","oldChildrenHandled","posInGy","rangeInGy","History","_operations","_undoPairs","_undoneOperations","_baseVersionToOperationIndex","_version","_gaps","lastOperation","historyVersion","getOperations","fromBaseVersion","toBaseVersion","firstOperation","inclusiveTo","gapFrom","gapTo","fromIndex","toIndex","getOperation","operationIndex","setOperationAsUndone","undoneOperation","undoingOperation","isUndoingOperation","RootElement","graveyardName","_hasSelectionChangedFromTheLastChangeBlock","removeMarker","includeDetached","_handleChangeBlock","_hasDocumentChangedFromTheLastChangeBlock","_getDefaultRoot","defaultRoot","createPositionFromPath","validateTextNodePosition","rangeBoundary","MarkerCollection","Marker","managedUsingOperations","oldMarker","hasChanged","_attachLiveRange","_managedUsingOperations","_destroyMarker","getMarkersGroup","prefix","_detachLiveRange","_liveRange","getStart","getEnd","DetachOperation","Writer","cloneElement","_assertWriterUsedCorrectly","isSameTree","applyOperation","rangeRootPosition","usingOperation","updateMarker","addMarker","insertText","itemOrPositionOrOffset","appendText","appendElement","itemOrRange","setAttributeOnRange","setAttributeOnItem","setAttributes","clearAttributes","removeAttributesFromItem","_addOperationForAffectedMarkers","applyRemoveOperation","merge","_merge","_mergeDetached","renameOperation","firstSplitElement","firstCopyElement","elementOrString","shiftedRange","applyMarkerOperation","hasUsingOperationDefined","affectsDataDefined","updatedRange","addRoot","detachRoot","rootOrName","setSelectionAttribute","keyOrObjectOrIterable","_setSelectionAttribute","keyOrIterableOfKeys","_removeSelectionAttribute","overrideSelectionGravity","restoreSelectionGravity","storeKey","_currentWriter","isAffected","affectedInLeftElement","affectedInRightElement","affectedAfterLeftElement","affectedBeforeRightElement","valueBefore","valueAfter","lastSplitPosition","previousValue","rootA","rootB","deleteContent","selRange","doNotResetEntireContent","shouldEntireContentBeReplacedWithParagraph","insertParagraph","replaceEntireContentWithParagraph","attributesForAutoparagraph","doNotAutoparagraph","ignoreMarkers","modifySelection","newEndPosition","skippedRange","getLivePositionsForSelectedBlocks","leaveUnmerged","checkShouldMerge","startAncestor","endAncestor","positionA","positionB","getAncestorsJustBelowCommonAncestor","mergeBranchesRight","mergeBranchesLeft","mergeBranches","collapseSelectionAt","isTextAllowed","isParagraphAllowed","shouldAutoparagraph","commonAncestor","parentToRemove","mergeRight","leftPos","rightPos","rangeToCheck","isCrossingLimitElement","removeRangeContent","parentsToCheck","itemRange","parentToCheck","removeRange","Insertion","_firstNode","_lastNode","_lastAutoParagraph","_filterAttributesOf","_affectedStart","_affectedEnd","_nodeToSelect","canMergeWith","_documentFragment","_documentFragmentPosition","handleNodes","_handleNode","_insertPartialFragment","_updateLastNodeFromAutoParagraph","_mergeOnRight","positionAfterLastNode","positionAfterNode","_setAffectedBoundaries","getSelectionRange","getAffectedRange","_handleObject","isAllowed","_checkAndAutoParagraphToAllowedPosition","_checkAndSplitToAllowedPosition","_appendToFragment","_handleDisallowedNode","livePosition","_mergeOnLeft","_tryAutoparagraphing","_canMergeLeft","mergePosLeft","_canMergeRight","mergePosRight","_getAllowedIn","tempPos","childNode","findOptimalInsertionRange","place","firstBlock","positionAfter","insertObject","originalSelection","insertionSelection","findOptimalPosition","firstSelectedBlock","attributesToCopy","elementToInsert","insertionPositionParent","affectedRange","insertContent","paragraphAttributes","nextElement","canSetSelection","updateSelection","wordBoundaryCharacters","tryExtendingTo","isForward","treatEmojiAsSingleUnit","isAtNodeBoundary","isAtWordBoundary","getCorrectWordBreakPosition","getCorrectPosition","getSearchRange","searchEnd","offsetToCheck","Model","_pendingChanges","childDefinition","insertion","fakeMarkerElements","nodesToInsert","markersPosition","posA","posB","isAtBeginning","selectionLiveRange","markersData","isStartBoundary","elementPosition","rangeOnInsertion","_runPendingChanges","batchOrType","rest","normalizeSelectable","getSelectedContent","frag","commonPath","commonParent","flatSubtreeRange","leftExcessRange","rangeOrElement","intersectingMarker","createBatch","createOperationFromJSON","ret","currentBatch","callbackReturnValue","ClickObserver","UpcastWriter","insertChild","removeChildren","oldElement","valueOrElement","HEX_COLOR_REGEXP","RGB_COLOR_REGEXP","RGBA_COLOR_REGEXP","HSL_COLOR_REGEXP","HSLA_COLOR_REGEXP","CSS_SHORTHAND_VALUE_REGEXP","COLOR_NAMES","isColor","lineStyleValues","isLineStyle","lengthRegExp","PERCENTAGE_VALUE_REGEXP","isPercentage","repeatValues","isRepeat","positionValues","isPosition","attachmentValues","isAttachment","urlRegExp","isURL","getBoxSidesValues","getShorthandValues","getBoxSidesValueReducer","styleShorthand","reduced","getBoxSidesShorthandValue","out","getPositionShorthandNormalizer","shorthand","addBackgroundRules","background","attachment","addBorderRules","normalizeBorderShorthand","getBorderPositionNormalizer","getBorderPropertyNormalizer","getBorderPropertyPositionNormalizer","getBorderPositionExtractor","getBorderPositionReducer","topStyles","extractBorderPosition","rightStyles","bottomStyles","leftStyles","borderStyles","borderStylesByType","getReducedStyleValueForType","reducedBorderStyle","reduceBorderPosition","reducedStyleTypes","getBorderReducer","border","toBorderPropertyShorthand","which","borderTypes","borderValue","addMarginRules","addPaddingRules","CommandCollection","_commands","commandName","commandParams","commands","EditingKeystrokeHandler","evtData","Editor","_readOnlyLocks","editing","enableReadOnlyMode","lockId","disableReadOnlyMode","removePlugins","extraPlugins","readyPromise","DataApiMixin","ElementApiMixin","updateSourceElement","shouldUpdateSourceElement","isSourceElementTextArea","PendingActions","_actions","hasAny","icons","bold","caption","check","cog","eraser","lowVision","importExport","plus","alignBottom","alignMiddle","alignTop","alignLeft","alignCenter","alignRight","alignJustify","objectLeft","objectCenter","objectRight","objectFullWidth","objectInline","objectBlockLeft","objectBlockRight","objectSizeFull","objectSizeLarge","objectSizeSmall","objectSizeMedium","pencil","pilcrow","threeVerticalDots","NESTED_TOOLBAR_ICONS","itemsView","ItemsView","isRtl","_focusCycler","shouldGroupWhenFull","isFloating","maxWidth","_behavior","DynamicGrouping","StaticLayout","fillFromConfig","itemsOrConfig","_buildItemsFromConfig","normalizedRemoveItems","_cleanItemsConfiguration","_createNestedToolbarDropdown","filteredItems","_cleanSeparatorsAndLineBreaks","nonSeparatorPredicate","firstCommandItemIndex","findIndex","lastCommandItemIndex","componentFactory","withText","dropdownView","createDropdown","addToolbarToDropdown","toolbarView","resizeObserver","cachedPadding","shouldUpdateGroupingOnNextResize","viewFocusables","viewItemsView","viewFocusTracker","viewLocale","ungroupedItems","groupedItems","groupedItemsDropdown","_createGroupedItemsDropdown","_updateFocusCycleableItems","changeData","removedItem","currentIndex","addedItem","_updateGrouping","_enableGroupingOnResize","_enableGroupingOnMaxWidthChange","initialGroupedItemsCount","wereItemsGrouped","_areItemsOverflowing","_groupLastItem","_ungroupFirstItem","lastChildRect","toolbarRect","computedStyle","paddingProperty","previousWidth","contentRect","dropdown","tooltipPosition","ListView","ListItemView","ListSeparatorView","SplitButtonView","actionView","_createActionView","ButtonClass","closeDropdownOnClickOutside","closeDropdownOnExecute","closeDropdownOnBlur","focusDropdownContentsOnArrows","focusDropdownButtonOnClose","focusDropdownPanelOnOpen","addDefaultBehavior","buttonsOrCallback","addToolbarToOpenDropdown","enableActiveItemFocusOnDropdownOpen","focusChildOnDropdownOpen","buttons","ariaLabel","isCompact","isVertical","addListToDropdown","itemsOrCallback","addListToOpenDropdown","listView","listItemView","childSelectorCallback","childToFocus","createLabeledInputText","labeledFieldView","inputView","ariaDescribedById","createLabeledInputNumber","inputMode","createLabeledDropdown","clamp","digits","pow","hexToRgba","hsvaToHsla","hh","hsvaToHslString","hsva","hsvaToRgba","rgbaToHex","alphaHex","rgbaToHsva","equalColorObjects","second","tpl","detail","dispatchEvent","CustomEvent","bubbles","hasTouched","isTouch","pointerMove","pointer","touches","getMove","pageX","pageXOffset","pageY","pageYOffset","Slider","aria","xy","cloneNode","dragging","toggleEvent","handleEvent","isValid","button","keyMove","setProperty","Hue","Saturation","$isSame","$color","$hsva","$update","$parts","$css","$sliders","ColorPicker","observedAttributes","newColor","newHsva","colorModel","toHsva","attachShadow","mode","slider","connectedCallback","defaultColor","attributeChangedCallback","_attr","_oldVal","newVal","fromAttr","oldHsva","fromHsva","HexBase","customElements","ColorPickerView","_format","hexInputRow","_createInputRow","_debounceColorPickerEvent","_hexColor","convertColorToCommonHexFormat","picker","_createSlidersView","styleSheetForFocusedColorPicker","shadowRoot","slidersView","SliderView","hashView","HashView","colorInput","_createColorInput","ColorPickerInputRowView","labeledInput","pickerColor","inputValue","trimmedValue","hashlessInput","inputColor","convertToHex","ComponentFactory","_components","originalName","toPx","defaultLimiterElement","_pinWhenIsVisibleCallback","show","hide","attachTo","defaultPositions","southArrowNorth","southArrowNorthMiddleWest","southArrowNorthMiddleEast","southArrowNorthWest","southArrowNorthEast","northArrowSouth","northArrowSouthMiddleWest","northArrowSouthMiddleEast","northArrowSouthWest","northArrowSouthEast","viewportStickyNorth","optimalPosition","withArrow","pin","unpin","_startPinning","_stopPinning","getDomElement","limiterElement","scrollTarget","isWithinScrollTarget","isLimiterWithinScrollTarget","sideOffset","arrowSideOffset","heightOffset","arrowHeightOffset","stickyVerticalOffset","northWestArrowSouthWest","balloonRect","getNorthTop","northWestArrowSouthMiddleWest","northWestArrowSouth","northWestArrowSouthMiddleEast","northWestArrowSouthEast","northEastArrowSouthWest","northEastArrowSouthMiddleWest","northEastArrowSouth","northEastArrowSouthMiddleEast","northEastArrowSouthEast","southWestArrowNorthWest","getSouthTop","southWestArrowNorthMiddleWest","southWestArrowNorth","southWestArrowNorthMiddleEast","southWestArrowNorthEast","southEastArrowNorthWest","southEastArrowNorthMiddleWest","southEastArrowNorth","southEastArrowNorthMiddleEast","southEastArrowNorthEast","westArrowEast","eastArrowWest","BALLOON_CLASS","TooltipManager","_currentElementWithTooltip","_currentTooltipPosition","_resizeObserver","_editors","_instance","tooltipTextView","balloonPanelView","_pinTooltipDebounced","_pinTooltip","_onEnterOrFocus","_onLeaveOrBlur","_onScroll","_watchdogExcluded","editorBodyViewCollection","_unpinTooltip","getPositioningFunctions","defaultBalloonPositions","sw","se","elementWithTooltipAttribute","getDescendantWithTooltip","ckeTooltipText","ckeTooltipPosition","cssClass","ckeTooltipClass","relatedTarget","descendantWithTooltip","relatedDescendantWithTooltip","targetDomElement","bodyViewCollection","_updateTooltipPosition","closest","NARROW_ROOT_HEIGHT_THRESHOLD","NARROW_ROOT_WIDTH_THRESHOLD","DEFAULT_LABEL","OFF_THE_SCREEN_POSITION","PoweredBy","_balloonView","_lastFocusedEditableElement","_showBalloonThrottled","_showBalloon","_handleEditorReady","balloon","token","oldTokenCheck","decryptedData","splittedDecryptedData","firstElement","secondElement","decryptedSecondElement","year","monthIndex","day","date","verifyLicense","_updateLastFocusedEditableElement","_hideBalloon","_createBalloonView","poweredByConfig","getNormalizedConfig","PoweredByView","attachOptions","focusedEditableElement","getLowerCornerPosition","rootRect","horizontalOffset","getLowerRightCornerPosition","getLowerLeftCornerPosition","getBalloonAttachOptions","editableEditorElements","getEditableElementsNames","getEditableElement","isColorInherited","ICON_WIDTH","ICON_HEIGHT","href","dragstart","getBalloonLeft","editableElementRect","visibleEditableElementRect","balloonTop","verticalOffset","balloonLeft","newBalloonRect","firstScrollableEditableElementAncestor","overflowY","findClosestScrollableAncestor","firstScrollableEditableElementAncestorRect","userConfig","EditorUI","isReady","_editableElementsMap","_focusableToolbarDefinitions","editingView","tooltipManager","poweredBy","_readViewportOffsetFromConfig","_handleScrollToTheSelection","_initFocusTracking","ckeditorInstance","setEditableElement","setUpKeystrokeHandler","removeEditableElement","addToolbar","_editableElements","editorUI","legacyOffsetConfig","lastFocusedForeignElement","candidateDefinitions","currentFocusedToolbarDefinition","_getCurrentFocusedToolbarDefinition","_getFocusableCandidateToolbarDefinitions","candidateDefinition","_focusFocusableCandidateToolbar","afterBlur","focusedToolbarDef","definitions","toolbarDef","beforeFocus","defA","defB","getToolbarDefinitionWeight","candidateToolbarDefinition","configuredViewportOffset","weight","isContextual","EditorUIView","BoxedEditorUIView","_voiceLabelView","_createVoiceLabel","lang","voiceLabel","EditableUIView","_editableElement","_hasExternalElement","_editingView","_updateIsFocusedClasses","hasExternalElement","updateAfterRender","InlineEditableUIView","_generateLabel","FormHeaderView","Notification","alert","showSuccess","_showNotification","title","showInfo","showWarning","_viewToStack","_idToStack","_view","_rotatorView","_fakePanelsView","positionLimiter","_createPanelView","hasView","stackId","_numberOfStacks","_visibleStack","singleViewMode","showStack","_showView","_singleViewMode","visibleView","_showNextStack","hideView","_getStackId","updatePosition","_getBalloonPosition","visibleStack","_createRotatorView","_createFakePanelsView","stacks","_showPrevStack","RotatorView","isSingleViewMode","numberOfStacks","buttonNextView","buttonPrevView","FakePanelsView","balloonClassName","showView","_createButtonView","_balloonPanelView","_addPanels","_removePanels","numberOfPanels","StickyPanelView","_contentPanelPlaceholder","isSticky","_panelRect","_contentPanel","_hasViewportTopOffset","viewportTopOffset","_isStickyToTheLimiter","limiterBottomOffset","marginLeft","_checkIfShouldBeSticky","_limiterRect","isActive","_marginLeft","ClassicEditorUI","_toolbarConfig","_elementReplacer","_handleScrollToTheSelectionWithStickyPanel","replacementElement","editingRoot","_initPlaceholder","_initToolbar","stickyPanel","toolbar","placeholderText","stickyPanelHeight","scrollViewportOnPanelGettingSticky","ClassicEditorUIView","shouldToolbarGroupWhenFull","Watchdog","crashes","_now","_crashNumberLimit","crashNumberLimit","_minimumNonErrorTimePeriod","minimumNonErrorTimePeriod","_boundErrorHandler","reason","_handleError","_listeners","_restart","_stopErrorHandling","cb","_fire","_startErrorHandling","_shouldReactToError","filename","ErrorEvent","lineno","colno","causesRestart","_shouldRestart","_isErrorComingFromThisItem","excludedProperties","subNodes","nodeIndex","shouldNodeBeIncluded","typeOfNode","EventTarget","Event","areConnectedThroughProperties","target1","target2","excludedNodes","structure","subNodes1","subNodes2","EditorWatchdog","watchdogConfig","_editor","_throttledSave","_save","saveInterval","_creator","elementOrData","_destructor","setCreator","creator","setDestructor","destructor","_destroy","catch","_elementOrData","updatedConfig","_cloneEditorConfiguration","_lastDocumentVersion","_getData","_setExcludedProperties","_excludedProps","mainQueueId","ActionQueues","_onEmptyCallbacks","_queues","_activeActions","onEmpty","onEmptyCallback","enqueue","queueId","isMainAction","queueWithAction","nonErrorQueue","finally","elementOrArray","ClassicEditor","sourceElementOrData","getInitialData","isTextArea","form","originalSubmit","onSubmit","submit","attachToForm","ContextWatchdog","_watchdogs","_contextProps","_actionQueues","_watchdogConfig","contextConfig","_contextConfig","_create","_getWatchdog","getItemState","itemConfigurationOrItemConfigurations","itemConfigurations","watchdog","res","rethrowRestartEventOnce","itemIdOrItemIds","itemIds","supportedOptions","isDefault","alignment","normalizeAlignmentOptions","configuredOptions","normalizedOptions","isNameValid","classNameCount","allOptions","succeedingOptions","ALIGNMENT","AlignmentCommand","_canBeAligned","blocks","currentAlignment","removeAlignmentFromSelection","setAlignmentOnSelection","AlignmentEditing","optionsToConvert","shouldUseClasses","isFormatting","buildClassDefinition","buildDowncastInlineDefinition","upcastInlineDefinitions","buildUpcastInlineDefinitions","upcastCompatibilityDefinitions","buildUpcastCompatibilityDefinitions","iconsMap","AlignmentUI","localizedOptionTitles","_addButton","defaultIcon","handleInput","dropRange","clipboardData","domDoc","clientX","clientY","caretRangeFromPoint","rangeParent","rangeOffset","getDropViewRange","smallPaddingElements","viewToPlainText","childText","_setupPasteDrop","_setupCopyCut","contentData","fullMatch","spaces","modelFragment","resultRange","modelDocument","onCopyCut","ChangeBuffer","limit","_batch","_size","_isLocked","_changeCallback","_reset","_selectionChangeCallback","isLocked","lock","unlock","ignoreLock","InsertTextCommand","undoStepSize","_buffer","textInsertions","TYPING_INPUT_TYPES","InsertTextObserver","Input","insertTextCommand","viewResultRange","modelRanges","selectedText","rangeText","insertTextCommandData","deleteSelectionContent","DeleteCommand","sequence","_shouldEntireContentBeReplacedWithParagraph","_replaceEntireContentWithParagraph","_shouldReplaceFirstBlockWithParagraph","limitElementFirstChild","DELETE_WORD","DELETE_SELECTION","DELETE_BACKWARD","DELETE_FORWARD","DELETE_EVENT_TYPES","deleteContentBackward","deleteWordBackward","deleteHardLineBackward","deleteSoftLineBackward","deleteContentForward","deleteWordForward","deleteHardLineForward","deleteSoftLineForward","DeleteObserver","deleteEventSpec","selectionToRemove","shouldUseTargetRanges","pressedKeyCode","beforeInputReceived","isDeleteKeyCode","getDeleteDirection","shouldFireDeleteEvent","targetRange","enableChromeWorkaround","Delete","_undoOnBackspace","deleteForwardCommand","commandData","requestUndoOnBackspace","Typing","getLastTextLine","TextWatcher","testCallback","_hasMatch","_startListening","hasMatch","_evaluateTextBeforeSelection","suffix","rangeBeforeSelection","testResult","eventData","TwoStepCaretMovement","_overrideUid","arrowRightPressed","arrowLeftPressed","contentDirection","isMovementHandled","_handleForwardMovement","_handleBackwardMovement","_isNextGravityRestorationSkipped","_isGravityOverridden","isBetweenDifferentAttributes","registerAttribute","hasAnyAttribute","preventCaretMovement","setSelectionAttributesFromTheNodeBefore","positionBefore","isStepAfterAnyAttributeBoundary","observedAttribute","attrBefore","reHasRegExpChar","TRANSFORMATIONS","copyright","registeredTrademark","trademark","oneHalf","oneThird","twoThirds","oneForth","threeQuarters","lessThanOrEqual","greaterThanOrEqual","notEqual","arrowLeft","arrowRight","horizontalEllipsis","enDash","emDash","quotesPrimary","buildQuotesRegExp","quotesSecondary","quotesPrimaryEnGb","quotesSecondaryEnGb","quotesPrimaryPl","quotesSecondaryPl","TRANSFORMATION_GROUPS","symbols","mathematical","typography","quotes","DEFAULT_TRANSFORMATIONS","normalizeFrom","normalizeTo","getTextAttributesAfterPosition","quoteCharacter","findAttributeRange","findAttributeRangeBound","lookBack","lastNode","getCopyOnEnterAttributes","allAttributes","copyOnEnter","EnterCommand","enterBlock","isSelectionEmpty","splitBlock","isContainedWithinOneElement","splitPos","ENTER_EVENT_TYPES","isSoft","insertLineBreak","EnterObserver","shiftPressed","enterEventSpec","Enter","ShiftEnterCommand","insertBreak","softBreakAction","anchorPos","isInsideLimitElement","breakLineElement","ShiftEnter","HighlightStack","_stack","oldTop","_insertDescriptor","newTop","compareDescriptors","oldDescriptor","newDescriptor","_removeDescriptor","shouldABeBeforeB","classesToString","WIDGET_CLASS_NAME","WIDGET_SELECTED_CLASS_NAME","toWidget","labelOrCreator","widgetLabel","setLabel","hasSelectionHandle","widgetElement","selectionHandle","addSelectionHandle","setHighlightHandling","addHighlight","toWidgetEditable","typeAroundFakeCaretPosition","getTypeAroundFakeCaretPosition","TYPE_AROUND_SELECTION_ATTRIBUTE","isTypeAroundWidget","POSSIBLE_INSERTION_POSITIONS","RETURN_ARROW_ICON_ELEMENT","PLUGIN_DISABLED_EDITING_ROOT_CLASS","WidgetTypeAround","_currentFakeCaretModelElement","_enableTypeAroundUIInjection","_enableInsertingParagraphsOnButtonClick","_enableInsertingParagraphsOnEnterKeypress","_enableInsertingParagraphsOnTypingKeystroke","_enableTypeAroundFakeCaretActivationUsingKeyboardArrows","_enableDeleteIntegration","_enableInsertContentIntegration","_enableInsertObjectIntegration","_enableDeleteContentIntegration","_insertParagraph","widgetModelElement","_listenToIfEnabled","_insertParagraphAccordingToFakeCaretPosition","selectedModelElement","buttonTitles","before","after","widgetViewElement","typeAroundWrapper","wrapperDomElement","buttonTemplate","importNode","injectButtons","caretTemplate","injectFakeCaret","injectUIIntoWidget","positionToWidgetCssClass","domEventData","_handleArrowKeyPress","selectedViewElement","localizedKeyCodeDirection","isForwardArrowKeyCode","shouldStopAndPreventDefault","_handleArrowKeyPressOnSelectedWidget","_handleArrowKeyPressWhenSelectionNextToAWidget","_handleArrowKeyPressWhenNonCollapsedSelection","widgetPlugin","modelElementNextToSelection","_getObjectElementNextToSelection","_setSelectionOverElement","selectedModelNode","buttonPosition","classList","getTypeAroundButtonPosition","widgetDomElement","getClosestWidgetViewElement","wasHandled","selectedModelWidget","isDeleteForward","probe","deepestEmptyRangeAncestor","deepestEmptyAncestor","getDeepestEmptyElementAncestor","documentSelection","verticalNavigationHandler","arrowUpPressed","arrowDownPressed","expandSelection","selectionWillShrink","getNearestNonInlineLimit","lastRangePosition","getNearestTextPosition","firstRangePosition","findTextRangeFromSelection","boundaryVerticalPosition","isSingleLineRange","walkerValueType","_previouslySelected","_clearPreviouslySelectedWidgets","lastMarked","isChild","_onMousedown","_handleSelectionChangeOnArrowKeyPress","_preventDefaultOnArrowKeyPress","_handleDelete","currentElement","isInsideNestedEditable","objectElement","isVerticalNavigation","firstPosition","lastPosition","firstSelectedNode","lastSelectedNode","objectElementNextToSelection","previousNode","nodeToRemove","widget","WidgetToolbarRepository","_toolbarDefinitions","balloonToolbar","isWidgetSelected","_balloon","_updateToolbarsVisibility","toolbarConfig","toolbarId","getRelatedElement","toolbarDefinition","itemsConfig","initialized","relatedElement","_showToolbar","_hideToolbar","maxRelatedElementDepth","deepestRelatedElement","deepestToolbarDefinition","relatedElementDepth","_isToolbarVisible","_isToolbarInBalloon","repositionContextualBalloon","getBalloonPositionData","ResizeState","_referenceCoordinates","originalWidth","_originalWidth","originalHeight","_originalHeight","originalWidthPercents","_originalWidthPercents","aspectRatio","_aspectRatio","begin","domResizeHandle","domHandleHost","domResizeHost","clientRect","activeHandlePosition","domHandle","resizerPositions","getResizerHandleClass","getHandlePosition","resizerPosition","positionParts","getAbsoluteBoundaryPoint","replacements","getOppositePosition","widthStyle","resizeHostRect","domResizeHostParent","parentWidth","ancestorLevelLimit","currentLevel","checkedElement","calculateHostPercentageWidth","newSize","proposedWidth","proposedHeight","proposedWidthPercents","widthPercents","proposedHandleHostWidth","handleHostWidth","proposedHandleHostHeight","handleHostHeight","SizeView","visible","_bindToState","resizeState","_dismiss","_isVisible","Resizer","_viewResizerWrapper","isSelected","_cleanup","_state","viewResizerWrapper","_appendHandles","_appendSizeUI","redraw","_sizeView","_initialViewWidth","_getHandleHost","_getResizeHost","updateSize","_proposeNewSize","newWidth","domHandleHostRect","domResizeHostRect","commit","onCommit","handleHostRect","domWrapper","_domResizerWrapper","widgetWrapper","handleHost","resizerWrapper","currentDimensions","newDimensions","isSameNode","offsetLeft","offsetTop","containsHandle","isResizeHandle","currentCoordinates","isCentered","enlargement","abs","getResizeHost","getHandleHost","WidgetResize","_resizers","_observer","_mouseDownListener","_mouseMoveListener","_mouseUpListener","_redrawSelectedResizerThrottled","redrawSelectedResizer","resizer","getResizerByViewElement","deselect","selectedResizer","widgetToolbarRepository","_getResizerByHandle","resizeHandle","_activeResizer","DragDrop","_draggedRange","_draggingUid","_draggableElement","_updateDropMarkerThrottled","_updateDropMarker","_removeDropMarkerDelayed","_removeDropMarker","_clearDraggableAttributesDelayed","_clearDraggableAttributes","_setupDragging","_setupContentInsertionIntegration","_setupClipboardInputIntegration","_setupDropMarker","_setupDraggableAttributeHandling","_finalizeDragging","draggableWidget","findDraggableWidget","canEditAtDraggedRange","draggedSelection","findDropTargetRange","getFinalDropEffect","clipboardPipeline","isMove","isSuccess","draggableElement","moved","targetViewRanges","targetViewElement","targetViewPosition","findDropTargetRangeOnWidget","targetModelElement","getClosestMappedModelElement","targetModelPosition","positionAtElementStart","betweenBlocksPosition","findDropTargetRangeBetweenBlocks","findDropTargetRangeOnAncestorObject","findDropTargetRangeInElement","PastePlainText","isPlainTextFragment","textAttributes","Clipboard","BaseCommand","_createdBatches","clearStack","createdBatches","addBatch","docSelection","_restoreSelection","selectionRanges","transformedRangeGroups","allRanges","rangeGroup","isRangeContainedByAnyOtherRange","normalizeRanges","_undo","batchToUndo","undoingBatch","operationsToUndo","operationToUndo","nextBaseVersion","historyOperations","reversedOperations","joinedRange","UndoCommand","batchIndex","RedoCommand","redoingBatch","UndoEditing","_batchRegistry","_undoCommand","_redoCommand","isRedoBatch","isUndoBatch","undoneBatch","UndoUI","localizedUndoIcon","undo","redo","localizedRedoIcon","Icon","Undo","createBlockImageViewElement","getImgViewElementMatcher","matchImageType","imageUtils","areBothImagePluginsLoaded","isInlineImageView","getPositiveMatchPattern","isBlockImageView","determineImageTypeForInsertionAtSelection","ImageUtils","isImage","isInlineImage","isBlockImage","insertImage","imageType","determineImageTypeForInsertion","imageElement","getClosestSelectedImageWidget","isImageWidget","getClosestSelectedImageElement","isImageAllowed","insertionRange","getInsertImageParent","isImageAllowedInParent","isNotInsideImage","toImageWidget","altText","findViewImgElement","figureView","configImageInsertType","IMAGE_URL_REGEXP","blockAutoformatEditing","callbackOrCommand","blockToFormat","firstNode","firstNodeRange","blockRange","inlineAutoformatEditing","testRegexpOrCallback","formatCallback","regExp","leftDel","rightDel","delStart","delEnd","getTextAfterCode","testOutput","rangesToFormat","testOutputToRanges","rangesToRemove","arrays","getCallbackFunctionForInlineAutoformat","validRanges","BlockQuoteCommand","_getValue","forceValue","blocksToQuote","findQuote","checkCanBeQuoted","_applyQuote","_removeQuote","getRangesOfBlockGroups","groupRange","quotesToMerge","currentQuote","nextQuote","elementOrPosition","nextBlock","isBQAllowed","isBlockAllowedInBQ","BlockQuoteEditing","blockQuoteCommand","BlockQuoteUI","AttributeCommand","_getValueFromFirstAllowedNode","BOLD","BoldEditing","fontWeight","BoldUI","DEFAULT_OPTIONS","autoRefresh","DEFAULT_TOKEN_REFRESH_TIMEOUT_TIME","Token","tokenUrlOrRefreshToken","initValue","_validateTokenValue","defaultRefreshToken","tokenUrl","reject","xhr","XMLHttpRequest","open","statusCode","status","xhrResponse","response","send","_registerRefreshTokenTimeout","refreshToken","_tokenRefreshTimeout","tokenValue","isString","isPlainString","isJWTFormat","tokenRefreshTimeoutTime","_getTokenRefreshTimeoutTime","binaryTokenPayload","exp","tokenExpireTime","BASE64_HEADER_REG_EXP","FileUploader","fileOrData","apiAddress","file","_isBase64","sliceSize","contentType","base64Data","byteArrays","byteNumbers","Blob","_base64ToBlob","_token","_apiAddress","onProgress","onError","abort","_prepareRequest","_attachXHRListeners","_sendRequest","setRequestHeader","responseType","upload","lengthComputable","total","uploaded","loaded","formData","FormData","UploadGateway","CloudServicesCore","createToken","createUploadGateway","getNormalizedAndLocalizedLanguageDefinitions","languageDefs","getPropertyAssociation","association","getLeadingWhiteSpaces","getIndentOutdentPositions","leadingWhiteSpaces","isModelSelectionInCodeBlock","canBeCodeBlock","CodeBlockCommand","_lastLanguage","firstLanguageInConfig","lastLanguage","defaultLanguage","usePreviousLanguageChoice","getLanguage","_applyCodeBlock","_removeCodeBlock","allowedBlocks","currentBlock","codeBlocks","IndentCodeBlockCommand","_indentSequence","indentSequenceTextElement","OutdentCodeBlockCommand","getLastOutdentableSequenceRange","nodeAtPosition","getCodeLineTextNodeAtPosition","lastIndexOfSequence","modelToViewCodeBlockInsertion","useLabels","languagesToClasses","languagesToLabels","codeBlockLanguage","preAttributes","spellcheck","codeAttributes","pre","DEFAULT_ELEMENT","CodeBlockEditing","languages","indentSequence","isDocumentListEditingLoaded","normalizedLanguagesDefs","isDocumentListAttributeOnCodeBlock","modelToDataViewSoftBreakInsertion","classesToLanguages","defaultLanguageName","viewCodeElement","viewPreElement","codeBlock","viewChildClasses","dataViewToModelCodeBlockInsertion","textLines","lastLine","softBreak","preElement","preChildren","childCodeElement","line","lineIndex","rawSnippetTextToViewDocumentFragment","docFragment","newDocumentFragment","afterInit","indent","outdent","isSoftEnter","modelDoc","lastSelectionPosition","isSoftBreakNode","newBlock","leaveBlockStartOnEnter","emptyLineRangeToRemoveOnEnter","isEmptyishTextNode","leaveBlockEndOnEnter","breakLineOnEnter","CodeBlockUI","normalizedLanguageDefs","splitButtonView","accessibleLabel","_codeBlockLanguage","_getLanguageListItemDefinitions","itemDefinitions","languageDef","SelectAllCommand","scopeElement","isSelectAllScope","SELECT_ALL_KEYSTROKE","SelectAllEditing","SelectAllUI","SelectAll","FindAndReplaceFormView","matchCount","isDirty","_findInputView","_createInputField","_replaceInputView","_findButtonView","_createButton","_findPrevButtonView","_findNextButtonView","_optionsDropdown","_createOptionsDropdown","_replaceButtonView","_replaceAllButtonView","_findFieldsetView","_createFindFieldset","_replaceFieldsetView","_createReplaceFieldset","_focusTracker","_keystrokes","_focusables","_initFocusCycling","_initKeystrokeHandling","_textToFind","_textToReplace","fieldsetView","_onFindButtonExecute","findPrevious","findNext","_injectFindResultsCounter","searchText","matchCase","_matchCase","wholeWords","_wholeWordsOnly","resultsCounterView","highlightOffset","updateFindInputPadding","inputElement","counterWidth","paddingPropertyName","resultsFound","replaceAll","matchCaseModel","_isMatchCaseSwitch","wholeWordsOnlyModel","stopPropagationAndPreventDefault","_areCommandsEnabled","FindAndReplaceUI","formView","findCommand","_setupFormView","_setupDropdownButton","cancelEvent","editingState","sortMapping","same","different","highlightedResult","findNextCommand","findPreviousCommand","replaceCommand","replaceAllCommand","FindCommand","callbackOrText","findAndReplaceUtils","findCallback","findByTextCallback","currentResults","updateFindResultFromRange","matchWholeWords","ReplaceCommandBase","_replace","replacementText","ReplaceCommand","ReplaceAllCommand","newText","textToReplace","searchResult","FindNextCommand","FindPreviousCommand","previousIndex","FindAndReplaceState","highlightedResultRemoved","removedResult","nextHighlightedIndex","oldMatchId","FindAndReplaceUtils","startResults","foundItems","rangeToText","foundItem","resultId","resultsList","markerToInsert","findInsertIndex","searchTerm","flags","regExpQuery","nonLetterGroup","regexpMatchToFindResult","matchResult","lastGroupIndex","FindAndReplaceEditing","_activeResults","_defineConverters","_defineCommands","newMatchId","debouncedScrollListener","searchCallback","changedNodes","removedMarkers","markerAtChange","nodeToCheck","onDocumentChange","FontCommand","updateAttribute","DocumentColorCollection","hasColor","ColorTableView","colors","removeButtonLabel","documentColorsLabel","documentColorsCount","colorPickerLabel","colorPickerConfig","_colorPickerConfig","colorGridsPageView","ColorGridsPageView","colorPickerPageView","ColorPickerPageView","appendGrids","appendUI","_appendColorPicker","showColorPicker","colorPickerView","showColorGrids","updateDocumentColors","updateSelectedColors","colorPickerButtonView","addColorPickerButton","documentColors","_removeButtonLabel","_colorPickerLabel","_documentColorsLabel","removeColorButtonView","_createRemoveColorButton","maxCount","_addColorToDocumentColors","documentColorsGrid","staticColorsGrid","_createStaticColorsGrid","_createDocumentColorsGrid","_createColorPickerButton","_addColorTablesElementsToFocusTracker","colorGrid","colorObj","predefinedColor","_pickerConfig","saveButtonView","cancelButtonView","_createActionButtons","actionBarView","_createActionBarView","_addColorPickersElementsToFocusTracker","_stopPropagationOnArrowsKeys","_executeOnEnterPress","_executeUponColorChange","actionBarRow","FONT_SIZE","FONT_COLOR","renderDowncastElement","styleAttr","FontColorCommand","FontColorEditing","ColorUI","componentName","dropdownLabel","colorTableView","componentConfig","localizedColors","hasColorPicker","colorPicker","dropdownContentRendered","addColorTableToDropdown","_undoStepBatch","FontColorUI","FontSizeCommand","normalizeOptions","attachPriority","preset","namedPresets","findPreset","numberValue","isNumericalDefinition","generatePixelPreset","getOptionDefinition","tiny","small","big","huge","styleFontSize","FontSizeEditing","supportAllValues","modelAttributeKey","buildDefinition","_prepareAnyValueConverters","_prepareCompatibilityConverter","presets","isRelative","maxSize","clampedSize","FontSizeUI","_getLocalizedOptions","commandParam","_prepareListOptions","localizedTitles","Default","Tiny","Small","Big","Huge","ParagraphCommand","checkCanBecomeParagraph","InsertParagraphCommand","paragraphLikeElements","HeadingCommand","modelElements","heading","checkCanBecomeHeading","defaultModelElement","HeadingEditing","_addDefaultH1Conversion","enterCommand","HeadingUI","getLocalizedOptions","defaultTitle","titles","headingCommand","paragraphCommand","commandValue","areEnabled","para","whichModel","HorizontalLineCommand","getInsertHorizontalLineParent","isHorizontalLineAllowedInParent","horizontalElement","HorizontalLineEditing","viewWrapper","toHorizontalLineWidget","HorizontalLineUI","ImageTextAlternativeCommand","ImageTextAlternativeEditing","TextAlternativeFormView","_createLabeledInputView","ImageTextAlternativeUI","_form","_showForm","_createForm","_hideForm","_isInBalloon","focusEditable","ImageTextAlternative","downcastSrcsetAttribute","img","srcset","downcastImageAttribute","ImageLoadObserver","_fireEvents","InsertImageCommand","sourceDefinitions","selectionAttributes","sourceDefinition","src","ReplaceImageSourceCommand","ImageEditing","viewImage","insertImageCommand","replaceImageSourceCommand","ImageTypeCommand","modelElementName","_modelElementName","uploadId","newElementRange","ImageBlockEditing","_setupConversion","_setupClipboardIntegration","modelImage","upcastImageFigure","docFragmentChildren","blockViewImages","inlineViewImage","ImageBlock","ImageInlineEditing","createInlineImageViewElement","inlineViewImages","blockViewImage","ImageInline","ToggleImageCaptionCommand","imageCaptionUtils","ancestorCaptionElement","getCaptionFromModelSelection","getCaptionFromImageModelElement","focusCaptionOnShow","_hideImageCaption","_showImageCaption","imageCaptionEditing","selectedImage","savedCaption","_getSavedCaption","newCaptionElement","captionElement","_saveCaption","ImageCaptionUtils","imageModelElement","matchImageCaptionViewElement","ImageCaptionEditing","_savedCaptionsMap","_setupImageTypeCommandsIntegration","_registerCaptionReconversion","figcaptionElement","imageAlt","imageTypeInlineCommand","imageTypeBlockCommand","handleImageTypeChange","oldCaptionElement","savedOldElementCaption","jsonObject","ImageCaptionUI","modelCaptionElement","FileReader","reader","_reader","onprogress","read","onload","onerror","onabort","readAsDataURL","loaders","_loadersMap","_pendingAction","_updatePendingAction","getLoader","fileOrPromise","createLoader","createUploadAdapter","loader","FileLoader","aggregatedUploaded","aggregatedTotal","uploadTotal","destroyLoader","fileOrPromiseOrLoader","pendingActions","getMessage","uploadedPercent","filePromise","uploadAdapterCreator","_filePromiseWrapper","_createFilePromiseWrapper","_adapter","uploadResponse","isFulfilled","rejecter","FileDialogButtonView","_fileInputView","FileInputView","accept","multiple","createImageTypeRegExp","regExpSafeNames","fetchLocalImage","imageSrc","fetch","resource","blob","mimeType","getImageMimeType","File","canvas","drawImage","toBlob","getBlobFromCanvas","convertLocalImageOnCanvas","ImageUploadUI","componentCreator","imageTypes","imageTypesRegExp","acceptedType","allowMultipleFiles","imagesToUpload","ImageUploadProgress","uploadStatusChange","fileRepository","viewFigure","_startAppearEffect","_showPlaceholder","_hidePlaceholder","progressBar","_createProgressBar","_showProgressBar","viewImg","_displayLocalImage","completeIcon","_showCompleteIcon","_removeUIElement","_hideProgressBar","_stopAppearEffect","_getUIElement","_createPlaceholder","imageFigure","uniqueProperty","UploadImageCommand","_uploadImage","ImageUploadEditing","_uploadImageElements","uploadImageCommand","images","fetchableImages","isLocalImage","fetchableImage","insertedImagesIds","isInsertedInGraveyard","getImagesFromChangeItem","_readAndUpload","urls","default","_parseAndSetSrcsetAttributeOnImage","notification","imageUploadElements","domFigure","originalDisplay","_ckHack","clean","srcsetAttribute","ImageUpload","ImageUploadFormRowView","_role","_ariaLabelledBy","ImageInsertPanelView","integrations","insertButtonView","integration","integrationView","imageURLInputValue","_integrations","getIntegration","createLabeledInputView","labeledInputView","ImageInsertUI","_createDropdownView","_setUpDropdown","imageInsertView","closePanel","panelItems","imageInsertUIPlugin","PREDEFINED_INTEGRATIONS","ckFinderButton","openCKFinder","prepareIntegrations","insertImageViaUrlForm","ImageInsertViaUrl","ResizeImageCommand","ImageResizeEditing","resizeUnit","resizeOptions","resizeImageCommand","_registerSchema","_registerConverters","figure","RESIZE_ICONS","medium","large","original","ImageResizeButtons","_resizeUnit","_registerImageResizeButton","_registerImageResizeDropdown","optionValueWithUnit","labelText","_getOptionLabelValue","getIsOnButtonCallback","originalSizeOption","dropdownButton","_getResizeDropdownListItemDefinitions","forTooltip","IMAGE_WIDGETS_CLASSES_MATCH_REGEXP","RESIZED_IMAGE_CLASS","ImageResizeHandles","_setupResizerCreator","widgetView","imageModel","domWidgetElement","imageStyle","ImageStyleCommand","_defaultStyles","imageBlock","imageInline","requestedStyle","shouldConvertImageType","inline","alignBlockLeft","alignBlockRight","DEFAULT_ICONS","full","center","inlineLeft","inlineRight","DEFAULT_DROPDOWN_DEFINITIONS","defaultItem","warnInvalidStyle","info","normalizeStyles","configuredStyles","arrangement","extendedStyle","extendStyle","normalizeDefinition","isBlockPluginLoaded","isInlinePluginLoaded","supportedElements","missingPlugins","isValidOption","getDefaultStylesConfiguration","getDefaultDropdownDefinitions","pluginCollection","getStyleDefinitionByName","ImageStyleEditing","utils","normalizedStyles","_setupPostFixer","modelToViewConverter","newStyle","oldStyle","viewToModelConverter","nonDefaultStyles","modelImageElement","viewToModelStyleAttribute","imageStyleDefinition","ImageStyleUI","localizedDefaultStylesTitles","definedStyles","translateStyles","styleConfig","definedDropdowns","dropdownConfig","_createDropdown","defaultButton","buttonViews","getUIComponentName","buttonName","splitButtonViewArrow","getDropdownButtonTitle","areOn","buttonConfig","_executeCommand","dropdownTitle","buttonTitle","IndentEditing","IndentUI","localizedIndentIcon","localizedOutdentIcon","_defineButton","IndentBlockCommand","indentBehavior","_indentBehavior","checkEnabled","blocksToChange","getBlocksToChange","currentIndent","nextIndent","getNextIndent","IndentUsingOffset","indentAttributeValue","currentOffset","offsetToSet","IndentUsingClasses","indexStep","DEFAULT_ELEMENTS","ITALIC","ItalicEditing","ItalicUI","AutomaticDecorators","_definitions","getDispatcher","getDispatcherForLinkedImage","linkInImage","reHasUnicode","rsAstral","rsCombo","rsFitz","rsNonAstral","rsRegional","rsSurrPair","reOptMod","rsOptVar","rsSeq","rsSymbol","reUnicode","strSymbols","chr","ATTRIBUTE_WHITESPACES","SAFE_URL","EMAIL_REG_EXP","PROTOCOL_REG_EXP","LINK_KEYSTROKE","createLinkElement","linkElement","ensureSafeUrl","url","urlString","normalizedUrl","isSafeUrl","isLinkableElement","addLinkProtocolIfApplicable","defaultProtocol","protocol","isProtocolNeeded","linkHasProtocol","openLink","LinkCommand","manualDecorators","automaticDecorators","restoreManualDecoratorStates","manualDecorator","_getDecoratorStateFromModel","manualDecoratorIds","truthyManualDecorators","falsyManualDecorators","linkText","extractTextFromSelection","linkRange","_updateLinkContent","allowedRanges","rangesToUpdate","_isRangeToUpdate","decoratorName","allowedRange","linkHref","rangeItems","UnlinkCommand","linkCommand","rangesToUnlink","ManualDecorator","_createPattern","DECORATOR_AUTOMATIC","EXTERNAL_LINKS_REGEXP","LinkEditing","addTargetToExternalLinks","linkDecorators","decorators","localizedDecoratorsLabels","decorator","getLocalizedDecorators","retArray","normalizeDecorators","_enableAutomaticDecorators","_enableManualDecorators","highlightedElements","inlineHighlight","_enableLinkOpen","_enableInsertContentSelectionAttributesFixer","_enableClickingAfterLink","_enableTypingOverLink","_handleDeleteContentAfterLink","_enableClipboardIntegration","automaticDecoratorDefinitions","rel","manualDecoratorDefinitions","decoratorDefinition","manualDecoratorValue","clickedElement","removeLinkAttributesFromSelection","getLinkAttributesAllowedOnText","clicked","deletedContent","nodeAtFirstPosition","nodeAtLastPosition","shouldCopyAttributes","shouldPreserveAttributes","hasBackspacePressed","newLink","linkAttributes","LinkFormView","urlInputView","_createUrlInput","_manualDecoratorSwitches","_createManualDecoratorSwitches","_createFormChildren","getDecoratorSwitchesState","accumulator","switchButton","switches","decoratorValue","additionalButtonsView","LinkActionsView","previewButtonView","_createPreviewButton","unlinkButtonView","editButtonView","VISUAL_SELECTION_MARKER_NAME","LinkUI","actionsView","_createToolbarLinkButton","_enableBalloonActivators","_createViews","_createActionsView","_createFormView","_enableUserBalloonInteractions","unlinkCommand","_addFormView","_hideUI","parsedUrl","_closeFormView","_showUI","_getSelectedLinkElement","_areActionsVisible","_isUIVisible","_isUIInPanel","_addActionsView","_areActionsInPanel","_getBalloonPositionData","_isFormInPanel","_removeFormView","_hideFakeVisualSelection","forceVisible","_showFakeVisualSelection","_startUpdatingUI","prevSelectedLink","prevSelectionParent","getSelectionParent","selectedLink","markerViewElements","targetLink","findLinkElementAncestor","startLink","endLink","isLinkElement","URL_REG_EXP","AutoLink","_enableTypingHandling","_enableEnterHandling","_enableShiftEnterHandling","watcher","isSingleSpaceAtTheEnd","getUrlAtTextEnd","linkEnd","linkStart","_applyAutoLink","_checkAndApplyAutoLinkOnRange","shiftEnterCommand","fullUrl","isLinkAllowedOnRange","linkIsAlreadySet","_persistAutoLink","deletePlugin","LinkImageEditing","isImageInlinePluginLoaded","viewLink","imageInLink","blockImageView","consumableAttributes","conversionResult","upcastLink","viewImgOrPicture","downcastImageLink","downcastImageLinkManualDecorator","upcastImageLinkManualDecorator","LinkImageUI","_isSelectedLinkedImage","_createToolbarLinkImageButton","ListCommand","checkCanBecomeListItem","turnOff","newIndent","listIndent","lowestIndent","_fixType","listType","listItem","startingItem","IndentCommand","indentDirection","_indentBy","itemsToChange","lastItem","generateLiInUl","getListItemFillerOffset","createViewListItemElement","viewList","injectViewList","injectedItem","injectedList","refItem","getSiblingListItem","sameIndent","smallerIndent","prevItem","mappedViewAncestor","nestedList","findNestedList","positionAfterUiElements","prevView","breakPosition","mergeViewLists","nextViewList","lastSubChild","modelChild","firstList","secondList","itemIndent","createUIComponent","getSiblingNodes","walkerOptions","limitIndent","getSelectedListItems","listItems","BULLETED_LIST_STYLE_TYPES","NUMBERED_LIST_STYLE_TYPES","getListTypeFromListStyleType","listStyleType","hasOnlyLists","ListUtils","modelViewInsertion","modelViewChangeType","listName","modelViewMergeAfterChangeType","modelViewSplitOnInsert","removeStart","removeEnd","previousList","mergePos","modelViewMergeAfter","viewItemPrev","viewItemNext","viewModelConverter","getIndent","listItemModel","convertedChild","findNextListItem","viewToModelListItemChildrenConverter","cleanList","isList","cleanListItem","foundList","modelToViewPosition","topmostViewList","modelIndentPasteFixer","indentChange","hoistNestedLists","modelRemoveStartPosition","viewRemoveStartPosition","viewRemovedItem","prevModelItem","prevIndent","prevViewList","ListEditing","itemToListHead","applied","_addListToFix","innerItem","listHead","_fixListIndents","_fixListTypes","maxIndent","fixBy","typesStack","modelChangePostFixer","getViewListItemLength","viewPos","modelLength","viewListPrev","modelViewChangeIndent","modelViewRemove","ListUI","ListStyleCommand","defaultType","_tryToConvertItemsToList","numberedList","bulletedList","ListReversedCommand","ListStartCommand","startIndex","DEFAULT_LIST_TYPE","ListPropertiesEditing","strategies","enabledProperties","addCommand","appliesToListItem","setAttributeOnDowncast","listStyle","getAttributeOnUpcast","listParent","listReversed","listStart","startAttributeValue","createAttributeStrategies","strategy","attributeStrategies","changedItems","rootIndent","itemsToUpdate","fixListAfterIndentListCommand","fixListAfterOutdentListCommand","restoreDefaultListStyle","insertedListItems","getChangedListItems","existingListItem","shouldInheritListTypeFromPreviousItem","shouldInheritListType","fixListAttributesOnListItemElements","previousElement","areRepresentingSameList","listItem1","listItem2","downcastListItemAttributes","_mergeListAttributesWhileMergingLists","todoListItems","removeListItemAttributesFromTodoList","firstMostOuterItem","mostOuterItemList","secondListMostOuterItem","baseItem","itemToChange","attributeStrategy","baseListAttribute","previousItem","previousItemIndent","previousItemListAttribute","getItemFromChange","CollapsibleView","childViews","hidden","_collapsibleAriaLabelUid","ListPropertiesView","styleButtonViews","styleGridAriaLabel","stylesView","additionalPropertiesCollapsibleView","startIndexFieldView","reversedSwitchButtonView","elementCssClasses","focusCycler","_createStylesView","_addNumberedListPropertyViews","getPropertyValue","styleButtons","numberedPropertyViews","_createStartIndexField","_createReversedSwitchButton","valueAsNumber","checkValidity","reversedButtonView","ListPropertiesUI","getDropdownViewCreator","parentCommandName","buttonLabel","buttonIcon","styleDefinitions","parentCommand","mainButtonView","listPropertiesView","listStyleCommand","styleButtonCreator","getStyleButtonCreator","isStyleTypeSupported","styleDefinition","listStartCommand","listReversedCommand","isReversed","createListPropertiesView","modelToViewUrlAttributeConverter","registry","mediaContentElement","mediaViewElement","getMediaViewElement","createMediaFigureElement","getSelectedMediaModelWidget","insertMedia","mediaElement","MediaEmbedCommand","selectedMedia","isMediaSelected","isAllowedInParent","MediaRegistry","providers","extraProviders","removedProviders","removeProviders","providerDefinitions","provider","hasMedia","_getMedia","getViewElement","Media","previewRenderer","subPattern","_getUrlMatches","rawUrl","_getValidUrl","_locale","_match","_previewRenderer","renderForEditingView","renderMediaPreview","mediaHtml","_getPreviewHtml","_getPlaceholderHtml","outerHTML","MediaEmbedEditing","toMediaWidget","viewMedia","URL_REGEXP","AutoMediaEmbed","_timeoutId","_positionToInsert","leftLivePosition","rightLivePosition","_embedMediaBetweenPositions","leftPosition","rightPosition","mediaRegistry","urlRange","MediaFormView","validators","_validators","resetFormStatus","validator","_urlInputViewInfoDefault","inputField","_urlInputViewInfoTip","mediaURLInputValue","MediaEmbedUI","getFormValidators","MentionCommand","mentionData","mention","mentionID","mentionText","_addMentionAttributes","_text","currentAttributes","attributesWithMention","MentionEditing","_toMentionAttribute","createViewMentionElement","preventPartialMentionDowncast","wasChanged","nodeAfterInsertedTextNode","checkAndFix","insertedNode","nodeAfterInserted","removePartialMentionPostFixer","isBrokenMentionNode","extendAttributeOnMentionPostFixer","shouldNotTypeWithMentionAt","selectionMentionAttributePostFixer","baseMentionData","viewElementOrMention","dataMention","MentionsView","selectFirst","selectNext","selected","selectPrevious","indexToGet","highlight","_isItemVisibleInScrolledArea","executeSelected","DomWrapperView","MentionListItemView","defaultHandledKeyCodes","defaultCommitKeyCodes","MentionUI","_mentionsView","_createMentionView","_mentionsConfigurations","_requestFeedDebounced","_requestFeed","feeds","commitKeys","handledKeyCodes","_hideUIAndRemoveMarker","mentionDescription","feed","dropdownLimit","isValidMentionMarker","feedCallback","createFeedCallback","itemRenderer","_setupTextWatcher","_handleFeedResponse","mentionsView","markerDropdownLimit","_renderItem","mentionMarker","_getItemRenderer","feedText","_lastRequested","feedResponse","feedsWithPattern","createRegExp","minimumCharacters","textMatcher","markerDefinition","getLastValidMarkerInText","splitStringFrom","textToTest","createTestCallback","markerPosition","hasMention","isPositionInExistingMention","isMarkerInExistingMention","textToMatch","requestFeedText","matchedTextLength","checkIfStillInCompletionMode","mentionCommand","feedItem","_showOrUpdateUI","markerMarker","_getBalloonPanelPositionData","renderResult","preferredPosition","getBalloonPanelPositions","caret_se","caret_sw","caret_ne","caret_nw","lastValidMarker","currentMarkerLastIndex","numberOfCharacters","openAfterCharacters","feedItems","PageBreakCommand","getInsertPageBreakParent","isPageBreakAllowedInParent","pageBreakElement","PageBreakEditing","viewLabelElement","toPageBreakWidget","hasPageBreakBefore","hasPageBreakAfter","viewSpan","PageBreakUI","transformListItemLikeElementsIntoLists","itemLikeElements","itemLikeElementsMatcher","itemData","getListItemData","order","findAllItemLikeElements","currentList","currentIndentation","itemLikeElement","isDifferentList","currentItem","isNewListNeeded","previousItemLikeElement","indentationDifference","listLikeItem","listStyleRegexp","listStyleTypeRegex","listStartIndexRegex","listStyleMatch","listStyleTypeMatch","bulletedStyle","listMarkerElement","textNodeOrElement","findListMarkerNode","listMarker","findBulletedListStyle","listStartIndexMatch","mapListStyleDefinition","detectListStyle","lastListItem","lastListItemChild","insertNewEmptyList","differentIndentation","listElement","parentList","levelChange","findParentListAtLevel","bulletMatcher","removeBulletElement","transformElementIntoListItem","idMatch","orderMatch","indentMatch","replaceImagesSourceWithBase64","rtfData","upcastWriter","shapesIds","shapeElementsMatcher","prevSiblingName","findAllShapesIds","imageElementsMatcher","imgs","shapes","shape","removeAllImgElementsRepresentingShapes","shapeIds","containsMatchingImg","findSrc","insertMissingImgs","removeAllShapeElements","findAllImageElementsWithLocalSource","imageElements","imagesHexSources","newSrc","_convertHexToBase64","replaceImagesFileSourceWithInlineRepresentation","regexPictureHeader","regexPicture","extractImageDataFromRtf","hexString","msWordMatch1","msWordMatch2","MSWordNormalizer","htmlString","_parsedData","findSibling","isBlockViewElement","googleDocsMatch","GoogleDocsNormalizer","removeBoldWrapper","unwrapParagraphInListItem","elementsToReplace","nextSiblingIsBlock","transformBlockBrsToParagraphs","googleSheetsMatch","GoogleSheetsNormalizer","removeGoogleSheetsTag","removeXmlns","removeInvalidTableWidth","removeStyleBlock","normalizeSafariSpaceSpans","parseHtml","normalizedHtml","normalizeSpacing","bodyCloseTag","htmlCloseTag","bodyCloseIndex","htmlCloseIndex","cleanContentAfterBody","htmlDocument","htmlElement","innerTextLength","normalizeSpacerunSpans","bodyString","bodyView","documentToView","styleTags","getElementsByTagName","sheet","cssRules","extractStyles","REMOVE_FORMAT","RemoveFormatUI","RemoveFormatCommand","_getFormattingItems","_getFormattingAttributes","itemHasRemovableFormatting","curRange","RemoveFormatEditing","formatHtml","elementsToFormat","isVoid","elementNamesToFormat","lines","indentCount","isNonVoidOpeningTag","indentLine","isClosingTag","indentChar","COMMAND_FORCE_DISABLE_ID","formatSource","isHtml","SpecialCharactersNavigationView","groupNames","groupDropdownView","_createGroupDropdown","currentGroupName","groupDefinitions","_getCharacterGroupListItemDefinitions","groupDefs","CharacterGridView","tiles","createTile","tile","mouseover","CharacterInfoView","characterToUnicodeString","codePointAt","SpecialCharactersView","navigationView","gridView","infoView","ALL_SPECIAL_CHARACTERS_GROUP","SpecialCharactersArrows","addItems","SpecialCharactersCurrency","SpecialCharactersMathematical","SpecialCharactersLatin","SpecialCharactersText","RestrictedEditingExceptionCommand","isSameException","exceptionStart","exceptionEnd","StandardEditingModeEditing","StandardEditingModeUI","upcastBorderStyles","modelAttributes","defaultBorder","stylesToConsume","matcherPattern","normalizedBorder","reducedBorder","reduceBoxSidesValue","downcastAttributeToStyle","sides","topSideStyle","updateNumericAttribute","createEmptyTableCell","tableCell","isHeadingColumnCell","tableUtils","table","headingColumns","column","getCellLocation","enableProperty","reduceBoxSides","shouldUpcast","upcastStyleToAttribute","upcastTable","viewTable","rows","headingRows","headRows","bodyRows","firstTheadElement","tableChild","trs","tr","headingCols","scanRowForHeadingColumns","scanTable","row","ensureParagraphInTableCell","th","TableWalker","_table","_startRow","startRow","_endRow","endRow","_startColumn","startColumn","_endColumn","endColumn","_includeAllSlots","includeAllSlots","_skipRows","_row","_rowIndex","_column","_cellIndex","_spannedCells","_nextCellAtColumn","_isOverEndRow","_isOverEndColumn","_advanceToNextRow","outValue","spanData","_getSpanned","_shouldSkipSlot","_formatOutValue","cell","colspan","rowspan","_recordSpans","skipRow","anchorRow","anchorColumn","TableSlot","rowIsMarkedAsSkipped","rowIsBeforeStartRow","columnIsBeforeStartColumn","columnIsAfterEndColumn","rowMap","rowToUpdate","columnToUpdate","_markSpannedCell","tableWalker","cellAnchorRow","cellAnchorColumn","isAnchor","cellWidth","cellHeight","rowIndex","getPositionBefore","downcastTable","tableElement","figureElement","getRows","additionalSlots","asWidget","toTableWidget","downcastCell","tableRow","tableSlot","cellElementName","convertParagraphInTableCell","isSingleParagraphWithoutAttributes","InsertTableCommand","validParent","defaultRows","defaultColumns","createTable","InsertRowCommand","isAnyCellSelected","getSelectionAffectedTableCells","insertAbove","affectedTableCells","rowIndexes","getRowIndexes","insertRows","at","copyStructureFromAbove","InsertColumnCommand","columnIndexes","getColumnIndexes","insertColumns","SplitCellCommand","selectedCells","splitCellHorizontally","splitCellVertically","cropTableToDimensions","sourceTable","cropDimensions","croppedTable","cropHeight","tableMap","sourceRow","sourceColumn","rowInCroppedTable","tableCellCopy","trimTableCellIfNeeded","addHeadingsToCroppedTable","getVerticallyOverlappingCells","overlapRow","cells","slotInfo","splitHorizontally","splitRow","newRowspan","newCellAttributes","newCellRowSpan","columnIndex","newCell","getHorizontallyOverlappingCells","overlapColumn","cellsToSplit","splitVertically","splitColumn","newColspan","newCellColSpan","cellRow","cellColumn","limitRow","limitColumn","removeEmptyColumns","getColumns","columnsMap","emptyColumns","cellsCount","emptyColumn","removeColumns","removeEmptyRows","emptyRows","tableRowCount","emptyRow","removeRows","removeEmptyRowsColumns","adjustLastRowIndex","dimensions","lastRowMap","firstColumn","lastColumn","lastRow","rowspanAdjustment","adjustLastColumnIndex","lastColumnMap","firstRow","colspanAdjustment","MergeCellCommand","isHorizontal","cellToMerge","_getMergeableCell","getTableCellsContainingSelection","isMergeNext","cellToExpand","cellToRemove","removedTableCellRow","mergeTableCells","spanAttribute","cellSpan","cellToMergeSpan","horizontalCell","hasHeadingColumns","cellOnLeft","cellOnRight","leftCellColumn","rightCellColumn","leftCellSpan","isCellOnLeftInHeadingColumn","isCellOnRightInHeadingColumn","getHorizontalCell","isMergeWithBodyCell","isMergeWithHeadCell","currentCellRowSpan","rowOfCellToMerge","currentCellData","mergeColumn","cellToMergeData","getVerticalCell","firstTableChild","RemoveRowCommand","firstCell","lastRowIndex","selectedRowIndexes","areAllRowsSelected","referenceCells","removedRowIndexes","columnIndexToFocus","rowsToRemove","cellToFocus","removedRowIndex","columnToFocus","getCellToFocus","RemoveColumnCommand","tableColumnCount","lastCell","returnValue","getBoundaryCells","removedColumnIndexes","columnsToRemove","SetHeaderRowCommand","isInTable","_isInHeading","headingRowsToSet","currentHeadingRows","overlappingCells","SetHeaderColumnCommand","headingColumnsToSet","TableUtils","createEmptyRows","rowsToInsert","isCopyStructure","copyStructureFrom","walkerEndRow","tableIterator","rowColSpansMap","lastCellRow","isReferenceRow","cellIndex","columnsToInsert","tableColumns","createCells","rowCount","indexesObject","cellsToMove","cellsToTrim","lastRowOfCell","rowSpanToSet","getCellsToMoveAndTrimOnRemoveRow","targetRowIndex","tableRowMap","previousCell","cellToMove","moveCellsToRow","updateHeadingRows","headingsRemoved","adjustHeadingColumns","removedColumnIndex","numberOfCells","newCellsSpan","updatedSpan","breakSpanEvenly","newCellsAttributes","cellsToInsert","splitCellColumn","cellsToUpdate","splitCellRow","rowspanToSet","createTableWalker","getSelectedTableCells","sortRanges","cellWithSelection","tableCells","indexes","_getFirstLastIndexesObject","isSelectionRectangular","selectedTableCells","_areCellInTheSameTableSection","areaOfSelectedCells","areaOfValidSelection","rowsIndexes","getBiggestRectangleArea","compareRangeOrder","allIndexesSorted","indexA","_areIndexesInSameSection","headingSectionSize","tableCellToInsert","MergeCellsCommand","firstTableCell","mergeWidth","mergeHeight","maxWidthOffset","maxHeightOffset","getMaxOffset","firstCellRow","firstCellColumn","getMergeDimensions","cellBeingMerged","targetCell","currentMaxOffset","dimensionValue","SelectRowCommand","rangesToSelect","SelectColumnCommand","startLocation","endLocation","cellInfo","injectTableLayoutPostFixer","analyzedTables","isTableAttributeEntry","fixTableCellsRowspan","fixTableRowsSizes","tableLayoutPostFixer","maxRows","rowLimit","findCellsToTrim","childrenLengths","lengths","getChildrenLengths","rowsLengths","tableSize","maxColumns","injectTableCellParagraphPostFixer","fixTable","fixTableRow","fixTableCellContent","checkTableCellChange","tableCellContentsPostFixer","textNodes","shouldRefresh","TableEditing","_additionalSlots","figureChild","getViewTableFromFigure","modelTable","upcastCellSpan","isRowChange","expectedElementName","tableHeadingsRefreshHandler","cellsToCheck","paragraphsToRefresh","tableCellRefreshHandler","registerAdditionalSlot","slotHandler","InsertTableView","_createGridCollection","_highlightGridBoxes","boxView","_createGridButton","boxes","TableUI","isContentLtr","insertTableView","bindIsOn","_prepareDropdown","_prepareMergeSplitButtonDropdown","_fillDropdownWithListOptions","mergeCommandName","mergeCommand","addListOption","TableSelection","_handleDeleteContent","_handleInsertTextEvent","_defineSelectionConverter","_enablePluginDisabling","getSelectionAsFragment","adjustedLastRow","adjustedLastColumn","setCellSelection","anchorCell","cellsToSelect","_getCellsToSelect","getFocusCell","getAnchorCell","highlighted","previouslyHighlighted","clearHighlightedTableCells","lastViewCell","tableCellToSelect","rangeToSelect","selectionMap","flipVertically","flipHorizontally","TableClipboard","_onCopyCut","_onInsertContent","tableSelection","dataController","pastedTable","getTableIfOnlyTableInContent","pastedDimensions","selectedTable","shouldExpandSelection","expectedHeight","expectedWidth","tableWidth","tableHeight","expandTableSize","doVerticalSplit","doHorizontalSplit","splitCellsToRectangularSelection","prepareTableForPasting","selectionHeight","selectionWidth","_replaceSelectedCellsWithPasted","pastedWidth","pastedHeight","pastedTableLocationMap","createLocationMap","selectedTableMap","pastedRow","pastedColumn","pastedCell","cellToInsert","newTableCell","_replaceTableSlotCell","areHeadingRowsIntersectingSelection","areHeadingColumnsIntersectingSelection","newCells","contentRange","rangeBefore","rangeAfter","limitColumns","isAffectedBySelection","limitRows","endIndex","TableKeyboard","_onArrowKey","_handleTabOnSelectedTable","_handleTab","bubblingEventInfo","currentRowIndex","currentCellIndex","isFirstCellInRow","isLastCellInRow","isLastRow","nextRow","previousRow","_handleArrowKeys","focusCell","_navigateFromCellInDirection","_isSelectionAtCellEdge","currentCellInfo","cellToSelect","positionToSelect","MouseEventsObserver","TableMouse","_enableShiftClickSelection","_enableMouseDragSelection","blockSelectionChange","_getModelTableCellFromDomEvent","haveSameTableParent","beganCellSelection","newTargetCell","viewTargetElement","cellA","cellB","ColorInputView","_createInputTextView","_stillTyping","_setInputValue","_createColorGrid","colorPreview","removeColorButton","blur","mappedColor","defaultColorValue","removeColorButtonLabel","normalizedInputValue","normalizeColor","getBorderStyleLabels","none","solid","dotted","dashed","double","groove","ridge","inset","outset","colorFieldValidator","lengthFieldValidator","isNumberString","lineWidthFieldValidator","fillToolbar","nameToValue","buttonValue","valueToCompare","defaultColors","getLabeledColorInputCreator","colorInputView","colorConfig","parsedValue","FormRowView","ALIGNMENT_ICONS","justify","middle","TableCellPropertiesView","borderStyle","borderWidth","borderColor","padding","horizontalAlignment","verticalAlignment","borderStyleDropdown","borderWidthInput","borderColorInput","borderRowLabel","_createBorderFields","backgroundRowLabel","backgroundInput","_createBackgroundFields","widthInput","operatorLabel","heightInput","dimensionsLabel","_createDimensionFields","horizontalAlignmentToolbar","verticalAlignmentToolbar","alignmentLabel","_createAlignmentFields","paddingInput","_createPaddingField","defaultTableCellProperties","colorInputCreator","borderColors","styleLabels","_borderStyleValue","defaultStyle","getBorderStyleDefinitions","isBorderStyleSet","backgroundColors","isContentRTL","_horizontalAlignmentLabels","_verticalAlignmentLabels","fieldsThatShouldValidateToSave","errorTexts","getSelectedTableWidget","isTableWidget","getTableWidgetAncestor","DEFAULT_BALLOON_POSITIONS","BALLOON_POSITIONS","getBalloonCellPositionData","getBalloonTablePositionData","modelTableCell","getTableCellAtPosition","viewTableCell","createBoundingRect","getSingleValue","objectOrString","addDefaultUnitToNumericValue","defaultUnit","numericValue","getNormalizedDefaultProperties","includeAlignmentProperty","includePaddingProperty","includeVerticalAlignmentProperty","includeHorizontalAlignmentProperty","isRightToLeftContent","propertyToCommandMap","TableCellPropertiesUI","_defaultTableCellProperties","_isReady","isCommandEnabled","_createPropertiesView","borderColorsConfig","localizedBorderColors","backgroundColorsConfig","localizedBackgroundColors","_hideView","_isViewInBalloon","colorErrorText","getLocalizedColorErrorText","lengthErrorText","getLocalizedLengthErrorText","_getPropertyChangeCallback","_getValidatedPropertyChangeCallback","viewField","_fillViewFormFromCommandValues","borderStyleCommand","_updateView","_isViewVisible","setErrorTextDebounced","TableCellPropertyCommand","_defaultValue","_getSingleValue","_getValueToSet","_getAttribute","firstCellValue","TableCellWidthCommand","TableCellWidthEditing","TableCellPaddingCommand","TableCellHeightCommand","TableCellBackgroundColorCommand","TableCellVerticalAlignmentCommand","TableCellHorizontalAlignmentCommand","TableCellBorderStyleCommand","TableCellBorderColorCommand","TableCellBorderWidthCommand","VALIGN_VALUES_REG_EXP","ALIGN_VALUES_REG_EXP","TableCellPropertiesEditing","enableBorderProperties","align","enableHorizontalAlignmentProperty","valign","enableVerticalAlignmentProperty","COLUMN_MIN_WIDTH_AS_PERCENTAGE","COLUMN_WIDTH_PRECISION","getColumnMinWidthAsPercentage","COLUMN_MIN_WIDTH_IN_PIXELS","getTableWidthInPixels","referenceElement","getChildrenViewElement","getElementWidthInPixels","boxSizing","paddingLeft","paddingRight","toPrecision","multiplier","sumArray","normalizeColumnWidths","columnWidths","normalizedWidths","numberOfUninitializedColumns","columnWidth","totalWidthOfInitializedColumns","widthForUninitializedColumn","calculateMissingColumnWidths","totalWidth","getDomCellOuterWidth","domCell","updateColumnElements","tableColumnGroup","getColumnGroupElement","getTableColumnElements","getTableColumnsWidths","TableWidthsCommand","widths","colGroupElement","TableColumnResizeEditing","_isResizingActive","_resizingData","_domEmitter","_tableUtilsPlugin","classAction","_extendSchema","_registerPostFixer","_registerResizingListeners","_registerResizerInserter","columnResizePlugin","tableWidthsCommand","isEditorReadOnly","isPluginEnabled","isTableWidthsCommandCommandEnabled","adjustColumnWidths","newTableColumnsCount","cellSet","referenceNode","getAffectedCells","currentColumnsDelta","hasMoreColumns","currentColumnIndex","columnMinWidthAsPercentage","columnWidthsToInsert","removedColumnWidths","affectedTables","referencePosition","tableNode","getChangedResizedTables","tableUtilsPlugin","columnElements","columnsCount","viewColWidth","_onMouseDownHandler","_onMouseMoveHandler","_onMouseUpHandler","_isResizingAllowed","columnWidthsInPx","cellSlot","viewCell","domCellWidth","_calculateDomColumnWidths","viewCol","colgroup","viewColElement","columnWidthInPc","_insertColgroupElement","_getResizingData","resizingData","figureInitialPcWidth","viewFigureWidth","viewFigureParentWidth","viewResizer","_applyResizingAttributesToTable","mouseEventData","columnPosition","isRightEdge","isTableCentered","viewLeftColumn","viewRightColumn","leftColumnWidth","rightColumnWidth","dxLowerBound","dxUpperBound","dx","leftColumnWidthAsPercentage","tableWidthAsPercentage","rightColumnWidthAsPercentage","viewColgroup","viewColumns","columnWidthsAttributeOld","columnWidthsAttributeNew","isColumnWidthsAttributeChanged","tableWidthAttributeOld","tableWidthAttributeNew","isTableWidthAttributeChanged","viewLeftCell","modelLeftCell","leftColumnIndex","cellColumnIndex","leftEdge","rightEdge","getColumnEdgesIndexes","UNDERLINE","UnderlineEditing","UnderlineUI","modelElementToPlainText","PlaceholderCommand","PlaceholderEditing","viewElementMatcher","_defineSchema","createPlaceholderView","placeholderView","modelWriter","PlaceholderUI","placeholderNames","getDropdownItemsDefinitions","editorElement","_embedImageBetweenPositions","_addListAutoformats","_addBasicStylesAutoformats","_addHeadingAutoformats","_addBlockQuoteAutoformats","_addCodeBlockAutoformats","_addHorizontalLineAutoformats","boldCallback","italicCallback","codeCallback","strikethroughCallback","modelName","_tokens","cloudServicesCore","registerTokenUrl","getTokenFor","findAndReplaceEditing","normalizeSizeOptions","_setupConversionUsingClasses","_setupConversionUsingOffset","indentCommand","outdentCommand","marginProperty","toMentionAttribute","normalizers","_isTransformedWithPasteFromOffice","activeNormalizer","_replacedRoots","_dataFromRoots","hasAnyPendingActions","isSourceEditingMode","_isAllowedToHandleSourceEditingMode","_showSourceEditing","_disableCommands","_hideSourceEditing","_enableCommands","_handleReadOnlyMode","updateEditorData","domSourceEditingElementWrapper","oldData","domRootElement","domSourceEditingElementTextarea","setSelectionRange","_focusSourceEditing","textarea","readOnly","_characters","_groups","_allSpecialCharactersGroupLabel","inputCommand","dropdownPanelContent","_createDropdownPanelContent","specialCharactersView","_getGroup","getGroups","invalidGroup","getCharactersForGroup","getCharacter","_updateGrid","characterTitles","groupEntries","specialCharsGroups","tableContentToolbarItems","tableToolbarItems","include","_enableTransformationWatchers","normalizedTransformations","extra","isNotRemoved","transformation","definedTransformations","transformationOrGroup","expandGroupsAndRemoveDuplicates","normalizeTransformations","normalizedTransformation","replaces","matchedRange","replacePosition","replaceRange","defineProperties","characters","_getCharacters","_getText","words","_getWords","_outputView","_wordsMatchRegExp","_refreshStats","onUpdate","wordCountContainer","displayWords","displayCharacters","txt","shouldNotGroupWhenFull","contentToolbar","placeholderConfig"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC39UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5xBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5lKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC79EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1FA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5lBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1zBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACphBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3bA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7pBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxwBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5kBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzMA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/GA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACz9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACndA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACp4CA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1wBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3iFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxpMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtkBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzqBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1WA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACj9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7bA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtqBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC37DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AC9vEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9vBA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACz5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;CCpKA,SAA2CA,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,IACQ,mBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,GAAIH,GACe,iBAAZC,QACdA,QAA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ACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;;ACJA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpiBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/hBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACr/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5MA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC12DA;;ACAA;ACAA;ACAA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC7iMA,SAA2C0mB,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,IACQ,mBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,GAAIH,GACe,iBAAZC,QACdA,QAAuB,cAAID,IAE3BD,EAAoB,cAAIC,GACzB,CATD,CASGK,MAAM,IACT,M,sBCRA,MAAMC,EAAc,EAAQ,MAMtBC,EAAkB,CAAC,EACzB,IAAK,MAAMC,KAAOC,OAAOC,KAAKJ,GAC7BC,EAAgBD,EAAYE,IAAQA,EAGrC,MAAMG,EAAU,CACfC,IAAK,CAACC,SAAU,EAAGC,OAAQ,OAC3BC,IAAK,CAACF,SAAU,EAAGC,OAAQ,OAC3BE,IAAK,CAACH,SAAU,EAAGC,OAAQ,OAC3BG,IAAK,CAACJ,SAAU,EAAGC,OAAQ,OAC3BI,KAAM,CAACL,SAAU,EAAGC,OAAQ,Q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+K,GAAoBM,GAC9B,IxCiHF,GAAOj9K,cAAgB,CACrBilF,QAAS,CACPniG,MAAO,CACL,aACA,gBACA,IACA,UACA,IACA,OACA,SACA,YACA,OACA,YACA,IACA,YACA,WACA,oBACA,eACA,IACA,eACA,eACA,IACA,UACA,SACA,IACA,cACA,IACA,cACA,cACA,aACA,IACA,iBACA,aACA,YACA,IACA,IACA,OACA,OACA,IACA,iBACA,6BACA,YACA,YACA,IACA,eAEFogM,wBAAwB,GAE1BviM,SAAU,KACVs1C,MAAO,CACLgvD,QAAS,CACP,uBACA,qBACA,oBACA,mBACA,kBACA,cAGJ+pE,MAAO,CACLm0B,eAAgB,CACd,cACA,WACA,kBACA,wBAGJC,kBAAmB,CACjBr3M,MAAO,CACL,WACA,cACA,YACA,aACA,YACA,cACA,YACA,cACA,gBACA,aACA,eACA,SAKN,W,kBv9BpMA;;AggCVA;AACA;;ACDA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3rBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/fA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtwBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5vCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5xMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC93EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACp4BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/jBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC51CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzqBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACt/OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9cA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7aA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;","file":"vendor.js"}